@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
@@ -51,9 +51,13 @@ export function listConversations(
51
51
  ensureDisplayOrderMigration();
52
52
  ensureGroupMigration();
53
53
  const db = getDb();
54
+ // 'private' is excluded defensively: in-place snapshot restore swaps the
55
+ // SQLite file without running migrations in-process, so legacy private rows
56
+ // can briefly exist before migration cleanup. Hide them from foreground
57
+ // lists until the next migration pass deletes them.
54
58
  const typeCond = backgroundOnly
55
59
  ? sql`${conversations.conversationType} IN ('background', 'scheduled') AND (${conversations.source} IS NULL OR ${conversations.source} != 'subagent')`
56
- : sql`${conversations.conversationType} NOT IN ('background', 'scheduled')`;
60
+ : sql`${conversations.conversationType} NOT IN ('background', 'scheduled', 'private')`;
57
61
  const where = includeArchived
58
62
  ? typeCond
59
63
  : sql`${typeCond} AND ${conversations.archivedAt} IS NULL`;
@@ -80,7 +84,7 @@ export function listPinnedConversations(): ConversationRow[] {
80
84
  .from(conversations)
81
85
  .where(
82
86
  and(
83
- sql`${conversations.conversationType} NOT IN ('background', 'scheduled')`,
87
+ sql`${conversations.conversationType} NOT IN ('background', 'scheduled', 'private')`,
84
88
  sql`is_pinned = 1`,
85
89
  ),
86
90
  )
@@ -258,7 +262,7 @@ export function searchConversations(
258
262
  FROM messages_fts f
259
263
  JOIN messages m ON m.id = f.message_id
260
264
  JOIN conversations c ON c.id = m.conversation_id
261
- WHERE messages_fts MATCH ? AND c.conversation_type NOT IN ('background', 'scheduled') AND c.archived_at IS NULL
265
+ WHERE messages_fts MATCH ? AND c.conversation_type NOT IN ('background', 'scheduled', 'private') AND c.archived_at IS NULL
262
266
  LIMIT 1000
263
267
  `,
264
268
  ftsMatch,
@@ -283,7 +287,7 @@ export function searchConversations(
283
287
  SELECT DISTINCT m.conversation_id
284
288
  FROM messages m
285
289
  JOIN conversations c ON c.id = m.conversation_id
286
- WHERE m.content LIKE ? ESCAPE '\\' AND c.conversation_type NOT IN ('background', 'scheduled') AND c.archived_at IS NULL
290
+ WHERE m.content LIKE ? ESCAPE '\\' AND c.conversation_type NOT IN ('background', 'scheduled', 'private') AND c.archived_at IS NULL
287
291
  LIMIT 1000
288
292
  `,
289
293
  likePattern,
@@ -297,7 +301,7 @@ export function searchConversations(
297
301
  .from(conversations)
298
302
  .where(
299
303
  and(
300
- sql`${conversations.conversationType} NOT IN ('background', 'scheduled')`,
304
+ sql`${conversations.conversationType} NOT IN ('background', 'scheduled', 'private')`,
301
305
  sql`${conversations.title} LIKE ${titlePattern} ESCAPE '\\'`,
302
306
  sql`${conversations.archivedAt} IS NULL`,
303
307
  ),
@@ -39,6 +39,7 @@ export type TitleOrigin =
39
39
  | "task_submit"
40
40
  | "updates_bulletin"
41
41
  | "memory_consolidation"
42
+ | "memory_retrospective"
42
43
  | "misc";
43
44
 
44
45
  export interface TitleContext {
@@ -0,0 +1,16 @@
1
+ // Re-exports the canonical conversation-type union (defined alongside the
2
+ // create path in `conversation-crud.ts`) under a read-side name and provides
3
+ // the shared "is this a non-interactive / background conversation?" predicate
4
+ // used by notification-feed and memory filters.
5
+
6
+ import type { ConversationCreateType } from "./conversation-crud.js";
7
+
8
+ export type ConversationType = ConversationCreateType;
9
+
10
+ // Tolerant of null/undefined/unknown strings so it can be called directly on
11
+ // raw DB column values without pre-validation.
12
+ export function isBackgroundConversationType(
13
+ t: ConversationType | string | null | undefined,
14
+ ): boolean {
15
+ return t === "background" || t === "scheduled";
16
+ }
@@ -39,6 +39,7 @@ import {
39
39
  migrate230AcpSessionHistory,
40
40
  migrate231RepairMemoryGraphEventDates,
41
41
  migrateActivationState,
42
+ migrateActivationStateFkCascade,
42
43
  migrateAddConversationInferenceProfile,
43
44
  migrateAddSourceTypeColumns,
44
45
  migrateAssistantContactMetadata,
@@ -46,6 +47,7 @@ import {
46
47
  migrateBackfillContactInteractionStats,
47
48
  migrateBackfillGuardianPrincipalId,
48
49
  migrateBackfillInlineAttachmentsToDisk,
50
+ migrateBackfillProviderConnectionLabel,
49
51
  migrateBackfillUsageCacheAccounting,
50
52
  migrateCallSessionInviteMetadata,
51
53
  migrateCallSessionMode,
@@ -63,6 +65,7 @@ import {
63
65
  migrateContactsUserFileColumn,
64
66
  migrateConversationForkLineage,
65
67
  migrateConversationHostAccess,
68
+ migrateConversationInferenceProfileSession,
66
69
  migrateConversationsArchivedAt,
67
70
  migrateConversationsLastMessageAt,
68
71
  migrateConversationsThreadTypeIndex,
@@ -71,6 +74,7 @@ import {
71
74
  migrateCreateMemoryGraphNodeEdits,
72
75
  migrateCreateMemoryGraphTables,
73
76
  migrateCreateMemoryRecallLogs,
77
+ migrateCreateProviderConnections,
74
78
  migrateCreateThreadStartersTable,
75
79
  migrateCreateTraceEventsTable,
76
80
  migrateDeletePrivateConversations,
@@ -112,7 +116,9 @@ import {
112
116
  migrateMemoryGraphImageRefs,
113
117
  migrateMemoryItemSupersession,
114
118
  migrateMemoryRecallLogsQueryContext,
119
+ migrateMemoryRetrospectiveState,
115
120
  migrateMemoryV2ActivationLogs,
121
+ migrateMessageBookmarks,
116
122
  migrateMessagesConversationCreatedAtIndex,
117
123
  migrateMessagesFtsBackfill,
118
124
  migrateNormalizePhoneIdentities,
@@ -133,6 +139,7 @@ import {
133
139
  migrateOAuthProvidersScopeSeparator,
134
140
  migrateOAuthProvidersTokenAuthMethodDefault,
135
141
  migrateOAuthProvidersTokenExchangeBodyFormat,
142
+ migrateProviderConnectionStatusLabel,
136
143
  migrateReminderRoutingIntent,
137
144
  migrateRemindersToSchedules,
138
145
  migrateRenameConversationTypeColumn,
@@ -399,6 +406,7 @@ export function initializeDb(): void {
399
406
  migrate230AcpSessionHistory,
400
407
  migrate231RepairMemoryGraphEventDates,
401
408
  migrateActivationState,
409
+ migrateActivationStateFkCascade,
402
410
  migrateMemoryV2ActivationLogs,
403
411
  migrateCreateDocumentConversations,
404
412
  migrateLlmUsageAttribution,
@@ -410,6 +418,12 @@ export function initializeDb(): void {
410
418
  },
411
419
  migrateScheduleRetryPolicy,
412
420
  migrateTraceEventsCreatedAtIndex,
421
+ migrateConversationInferenceProfileSession,
422
+ migrateMessageBookmarks,
423
+ migrateCreateProviderConnections,
424
+ migrateProviderConnectionStatusLabel,
425
+ migrateMemoryRetrospectiveState,
426
+ migrateBackfillProviderConnectionLabel,
413
427
  ];
414
428
 
415
429
  // Run each migration step, catching and logging individual failures so one
@@ -2,6 +2,7 @@ import { createHash } from "node:crypto";
2
2
 
3
3
  import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
4
4
  import { getOllamaBaseUrlEnv } from "../config/env.js";
5
+ import { resolveCallSiteConfig } from "../config/llm-resolver.js";
5
6
  import type { AssistantConfig } from "../config/types.js";
6
7
  import { MANAGED_PROVIDER_META } from "../providers/managed-proxy/constants.js";
7
8
  import { resolveManagedProxyContext } from "../providers/managed-proxy/context.js";
@@ -778,7 +779,7 @@ export async function selectedBackendSupportsMultimodal(
778
779
 
779
780
  async function isOllamaConfigured(config: AssistantConfig): Promise<boolean> {
780
781
  return (
781
- config.llm.default.provider === "ollama" ||
782
+ resolveCallSiteConfig("mainAgent", config.llm).provider === "ollama" ||
782
783
  Boolean(await getProviderKeyAsync("ollama")) ||
783
784
  Boolean(getOllamaBaseUrlEnv())
784
785
  );
@@ -44,7 +44,7 @@ const JINJA_VERSION = "0.5.5";
44
44
  * scripts when the worker IPC contract or spawn-args list changes (without
45
45
  * requiring an `@huggingface/transformers` version bump).
46
46
  */
47
- const RUNTIME_VERSION = `ort-${ONNXRUNTIME_NODE_VERSION}_hf-${TRANSFORMERS_VERSION}_jinja-${JINJA_VERSION}_workers-v2`;
47
+ const RUNTIME_VERSION = `ort-${ONNXRUNTIME_NODE_VERSION}_hf-${TRANSFORMERS_VERSION}_jinja-${JINJA_VERSION}_workers-v3`;
48
48
 
49
49
  const WORKER_FILENAME = "embed-worker.mjs";
50
50
  const RERANK_WORKER_FILENAME = "rerank-worker.mjs";
@@ -252,7 +252,6 @@ async function processQueue() {
252
252
  text_pair: passages,
253
253
  padding: true,
254
254
  truncation: true,
255
- return_tensors: 'pt',
256
255
  });
257
256
  const out = await session(inputs);
258
257
  const logits = out.logits.data;
@@ -0,0 +1,55 @@
1
+ import { beforeEach, describe, expect, mock, test } from "bun:test";
2
+
3
+ let flagEnabled = false;
4
+
5
+ mock.module("../../../config/assistant-feature-flags.js", () => ({
6
+ isAssistantFeatureFlagEnabled: (_key: string, _config: unknown) =>
7
+ flagEnabled,
8
+ }));
9
+
10
+ import { getRememberDescription } from "../tools.js";
11
+
12
+ const stubConfig = {} as unknown as Parameters<
13
+ typeof getRememberDescription
14
+ >[0];
15
+
16
+ describe("getRememberDescription", () => {
17
+ beforeEach(() => {
18
+ flagEnabled = false;
19
+ });
20
+
21
+ test("flag off — returns the default high-pressure description", () => {
22
+ const desc = getRememberDescription(stubConfig);
23
+ expect(desc).toContain("**CRITICAL:**");
24
+ expect(desc).toContain("most frequently used tool");
25
+ expect(desc).toContain("almost every turn");
26
+ });
27
+
28
+ test("flag on — returns the relaxed judgment-framing description", () => {
29
+ flagEnabled = true;
30
+ const desc = getRememberDescription(stubConfig);
31
+ expect(desc).not.toContain("**CRITICAL:**");
32
+ expect(desc).not.toContain("almost every turn");
33
+ expect(desc).toContain("a retrospective pass");
34
+ expect(desc).toContain("Use judgment");
35
+ });
36
+
37
+ test("the two variants differ", () => {
38
+ flagEnabled = false;
39
+ const off = getRememberDescription(stubConfig);
40
+ flagEnabled = true;
41
+ const on = getRememberDescription(stubConfig);
42
+ expect(off).not.toBe(on);
43
+ });
44
+
45
+ test("corrections-are-priority language is preserved in BOTH variants", () => {
46
+ flagEnabled = false;
47
+ expect(getRememberDescription(stubConfig)).toMatch(
48
+ /Corrections are.*highest priority/i,
49
+ );
50
+ flagEnabled = true;
51
+ expect(getRememberDescription(stubConfig)).toMatch(
52
+ /Corrections are.*highest priority/i,
53
+ );
54
+ });
55
+ });
@@ -7,6 +7,7 @@
7
7
  // ---------------------------------------------------------------------------
8
8
 
9
9
  import { and, desc, eq, inArray, ne, notInArray } from "drizzle-orm";
10
+ import { z } from "zod";
10
11
 
11
12
  import type { AssistantConfig } from "../../config/types.js";
12
13
  import { estimateTextTokens } from "../../context/token-estimator.js";
@@ -19,6 +20,8 @@ import type {
19
20
  import { getLogger } from "../../util/logger.js";
20
21
  import { getWorkspaceDir } from "../../util/platform.js";
21
22
  import { getDb } from "../db-connection.js";
23
+ import { embedWithRetry } from "../embed.js";
24
+ import { generateSparseEmbedding } from "../embedding-backend.js";
22
25
  import type { QdrantSparseVector } from "../qdrant-client.js";
23
26
  import { memorySummaries } from "../schema.js";
24
27
  import { conversations } from "../schema/conversations.js";
@@ -388,8 +391,15 @@ export class ConversationGraphMemory {
388
391
 
389
392
  return await this.runPerTurn(messages, config, abortSignal);
390
393
  } catch (err) {
394
+ const errCode =
395
+ err instanceof z.ZodError ? err.issues[0]?.code : undefined;
391
396
  log.warn(
392
- { err: err instanceof Error ? err.message : String(err) },
397
+ {
398
+ err: err instanceof Error ? err.message : String(err),
399
+ conversationId: this.conversationId,
400
+ turn: this.tracker.getTurn(),
401
+ errCode,
402
+ },
393
403
  "Memory retrieval failed (non-fatal)",
394
404
  );
395
405
  return noopResult;
@@ -422,10 +432,19 @@ export class ConversationGraphMemory {
422
432
  "",
423
433
  signal,
424
434
  );
425
- this.initialized = true;
426
- this.needsReload = false;
427
435
 
428
436
  if (v2.routed) {
437
+ // Surface a user-query embedding so PKB hint search still runs on v2
438
+ // turns. v1's `loadContextMemory` produced these as a side effect of
439
+ // hybrid retrieval; the v2 path skips that retrieval, so embed
440
+ // explicitly here.
441
+ const userQueryEmbed = await this.computeQueryVectors(
442
+ rawUserText ?? userQuery ?? "",
443
+ config,
444
+ signal,
445
+ );
446
+ this.initialized = true;
447
+ this.needsReload = false;
429
448
  this.lastInjectedBlock = v2.injectedBlockText;
430
449
  this.lastInjectedNodeIds = [];
431
450
  this.lastInjectedImages = new Map();
@@ -438,6 +457,8 @@ export class ConversationGraphMemory {
438
457
  mode: "context-load" as const,
439
458
  injectedBlockText: v2.injectedBlockText,
440
459
  metrics: null,
460
+ userQueryVector: userQueryEmbed.dense,
461
+ userQuerySparseVector: userQueryEmbed.sparse,
441
462
  };
442
463
  }
443
464
 
@@ -449,6 +470,12 @@ export class ConversationGraphMemory {
449
470
  config,
450
471
  signal,
451
472
  });
473
+ // Set initialized only after v1 retrieval succeeds. If `loadContextMemory`
474
+ // throws (transient DB/Qdrant failure), `prepareMemory` catches and
475
+ // returns noop, but we want the next turn to retry the bootstrap path
476
+ // rather than be stuck in per-turn mode.
477
+ this.initialized = true;
478
+ this.needsReload = false;
452
479
 
453
480
  if (result.nodes.length === 0) {
454
481
  this.lastInjectedBlock = null;
@@ -569,6 +596,14 @@ export class ConversationGraphMemory {
569
596
  signal,
570
597
  );
571
598
  if (v2.routed) {
599
+ // Surface a per-turn query embedding so PKB hint search still runs
600
+ // on v2 turns. v1's `retrieveForTurn` produced these as a side effect;
601
+ // the v2 path skips that retrieval, so embed explicitly here.
602
+ const perTurnEmbed = await this.computeQueryVectors(
603
+ userLast,
604
+ config,
605
+ signal,
606
+ );
572
607
  this.lastInjectedBlock = v2.injectedBlockText;
573
608
  this.lastInjectedNodeIds = [];
574
609
  this.lastInjectedImages = new Map();
@@ -581,6 +616,8 @@ export class ConversationGraphMemory {
581
616
  mode: "per-turn" as const,
582
617
  injectedBlockText: v2.injectedBlockText,
583
618
  metrics: null,
619
+ queryVector: perTurnEmbed.dense,
620
+ sparseVector: perTurnEmbed.sparse,
584
621
  };
585
622
  }
586
623
 
@@ -652,6 +689,35 @@ export class ConversationGraphMemory {
652
689
  };
653
690
  }
654
691
 
692
+ /**
693
+ * Embed a query string for PKB hint search on v2 turns. v1 retrieval
694
+ * produced these vectors as a side effect; on v2 we skip retrieval, so
695
+ * the agent loop loses the dense/sparse pair it needs to drive
696
+ * `buildPkbReminderWithHints`. Failures here degrade PKB hints to the
697
+ * static fallback rather than blocking the turn.
698
+ */
699
+ private async computeQueryVectors(
700
+ text: string,
701
+ config: AssistantConfig,
702
+ signal: AbortSignal,
703
+ ): Promise<{ dense?: number[]; sparse?: QdrantSparseVector }> {
704
+ const trimmed = text.trim();
705
+ if (trimmed.length === 0) return {};
706
+ let dense: number[] | undefined;
707
+ try {
708
+ const result = await embedWithRetry(config, [trimmed], { signal });
709
+ dense = result.vectors[0];
710
+ } catch (err) {
711
+ log.warn(
712
+ { err: err instanceof Error ? err.message : String(err) },
713
+ "Failed to embed query for PKB hints on v2 path",
714
+ );
715
+ }
716
+ const sparseRaw = generateSparseEmbedding(trimmed);
717
+ const sparse = sparseRaw.indices.length > 0 ? sparseRaw : undefined;
718
+ return { dense, sparse };
719
+ }
720
+
655
721
  /**
656
722
  * Run the v2 activation pipeline when the workspace config
657
723
  * (`memory.v2.enabled`) is on.
@@ -716,7 +782,11 @@ export class ConversationGraphMemory {
716
782
  * Count the leading content blocks on a user message that were added by
717
783
  * `injectMemoryBlock`. Memory-injected images use a 3-block pattern
718
784
  * (opening `<memory_image>` text + image + closing `</memory_image>` text),
719
- * followed by a `<memory>…</memory>` text block (legacy `<memory __injected>` is also accepted). A legacy
785
+ * followed by a `<memory>…</memory>` text block (legacy `<memory __injected>` is also accepted).
786
+ * The bare `<memory>` form is matched only when the block also ends with
787
+ * `\n</memory>`, so user-authored content that happens to begin with
788
+ * `<memory>` (for example, a message discussing the XML-like markup) is not
789
+ * mistaken for an injected prefix and stripped on re-injection. A legacy
720
790
  * 2-block image pattern (no closing tag) is also accepted for backward
721
791
  * compatibility. The injection prefix is always contiguous at the start,
722
792
  * so we stop at the first non-memory block.
@@ -729,7 +799,8 @@ export function countMemoryPrefixBlocks(content: ContentBlock[]): number {
729
799
  const block = content[firstNonMemory];
730
800
  if (
731
801
  block.type === "text" &&
732
- (block.text.startsWith("<memory>\n") ||
802
+ ((block.text.startsWith("<memory>\n") &&
803
+ block.text.endsWith("\n</memory>")) ||
733
804
  block.text.startsWith("<memory __injected>\n"))
734
805
  ) {
735
806
  firstNonMemory++;
@@ -723,8 +723,12 @@ export function parseExtractionResponse(
723
723
 
724
724
  // Auto-create event trigger when event_date is set but LLM didn't include one,
725
725
  // or replace a malformed event trigger (event_date unset) with a valid one.
726
+ // Only auto-create for future events — past-dated memories (historical
727
+ // milestones, dated events that already happened) shouldn't generate
728
+ // ramp/follow-up reminders.
726
729
  if (
727
730
  node.eventDate != null &&
731
+ node.eventDate > now &&
728
732
  (!Array.isArray(raw.triggers) ||
729
733
  !raw.triggers.some((t) => t.type === "event" && t.event_date != null))
730
734
  ) {
@@ -24,9 +24,7 @@ export function saveGraphMemoryState(
24
24
  /**
25
25
  * Load graph memory state for a conversation, or null if none exists.
26
26
  */
27
- export function loadGraphMemoryState(
28
- conversationId: string,
29
- ): string | null {
27
+ export function loadGraphMemoryState(conversationId: string): string | null {
30
28
  const db = getDb();
31
29
  const row = db
32
30
  .select({ stateJson: conversationGraphMemoryState.stateJson })
@@ -35,3 +33,18 @@ export function loadGraphMemoryState(
35
33
  .get();
36
34
  return row?.stateJson ?? null;
37
35
  }
36
+
37
+ /**
38
+ * Copy the parent conversation's graph memory state row to a new conversation
39
+ * id so the forked conversation resumes with the parent's InContextTracker
40
+ * snapshot (in-context node IDs, per-node turn log, current turn). No-op if
41
+ * the parent has no row yet.
42
+ */
43
+ export function forkGraphMemoryState(
44
+ parentConversationId: string,
45
+ newConversationId: string,
46
+ ): void {
47
+ const stateJson = loadGraphMemoryState(parentConversationId);
48
+ if (stateJson == null) return;
49
+ saveGraphMemoryState(newConversationId, stateJson);
50
+ }
@@ -69,6 +69,22 @@ export function handleRemember(
69
69
  return { success: true, message: "Saved to knowledge base." };
70
70
  }
71
71
 
72
+ /**
73
+ * Format `now` as a buffer-entry timestamp (`Mon D, h:mm AM/PM`). Exported so
74
+ * the memory v2 consolidation job can present its cutoff in the same shape
75
+ * the buffer entries use, making the agent's "timestamp ≥ cutoff" comparison
76
+ * unambiguous at minute precision.
77
+ */
78
+ export function formatBufferTimestamp(now: Date): string {
79
+ const month = now.toLocaleString("en-US", { month: "short" });
80
+ const day = now.getDate();
81
+ const hours = now.getHours();
82
+ const minutes = String(now.getMinutes()).padStart(2, "0");
83
+ const ampm = hours >= 12 ? "PM" : "AM";
84
+ const displayHour = hours % 12 || 12;
85
+ return `${month} ${day}, ${displayHour}:${minutes} ${ampm}`;
86
+ }
87
+
72
88
  /**
73
89
  * Build a timestamped bullet entry for `buffer.md` / `archive/<date>.md`.
74
90
  *
@@ -80,13 +96,7 @@ export function handleRemember(
80
96
  * entries identically to user-facing `remember()` calls.
81
97
  */
82
98
  export function formatRememberEntry(content: string, now: Date): string {
83
- const month = now.toLocaleString("en-US", { month: "short" });
84
- const day = now.getDate();
85
- const hours = now.getHours();
86
- const minutes = String(now.getMinutes()).padStart(2, "0");
87
- const ampm = hours >= 12 ? "PM" : "AM";
88
- const displayHour = hours % 12 || 12;
89
- return `- [${month} ${day}, ${displayHour}:${minutes} ${ampm}] ${content}\n`;
99
+ return `- [${formatBufferTimestamp(now)}] ${content}\n`;
90
100
  }
91
101
 
92
102
  /**
@@ -2,6 +2,8 @@
2
2
  // Memory Tool definitions for agentic recall and remember.
3
3
  // ---------------------------------------------------------------------------
4
4
 
5
+ import { isAssistantFeatureFlagEnabled } from "../../config/assistant-feature-flags.js";
6
+ import type { AssistantConfig } from "../../config/types.js";
5
7
  import type { ToolDefinition } from "../../providers/types.js";
6
8
  import {
7
9
  ALL_RECALL_SOURCES,
@@ -12,13 +14,13 @@ import {
12
14
  const RECALL_DEPTHS = ["fast", "standard", "deep"] as const;
13
15
 
14
16
  /**
15
- * Explicit local information search across memory, PKB, conversations, and
17
+ * Explicit local information search across memory, conversations, and
16
18
  * workspace files.
17
19
  */
18
20
  export const graphRecallDefinition: ToolDefinition = {
19
21
  name: "recall",
20
22
  description:
21
- 'Search local information the moment you feel uncertain. Use recall for memory, the personal knowledge base, past conversations, and workspace files — before you guess, before you ask, before you hedge. Auto-injection is incomplete by design; it surfaces patterns, not the specifics you need to answer well. If you catch yourself reaching for "I think", "I believe", "if I remember", "didn\'t we", "last time" — that\'s the signal. Recall. If the user references someone, a place, a decision, a document, or prior work you should be able to find locally — recall. Call it multiple times per conversation if the turn warrants it. Be specific in your query for best results.',
23
+ 'Search local information the moment you feel uncertain. Use recall for memory, past conversations, and workspace files — before you guess, before you ask, before you hedge. Auto-injection is incomplete by design; it surfaces patterns, not the specifics you need to answer well. If you catch yourself reaching for "I think", "I believe", "if I remember", "didn\'t we", "last time" — that\'s the signal. Recall. If the user references someone, a place, a decision, a document, or prior work you should be able to find locally — recall. Call it multiple times per conversation if the turn warrants it. Be specific in your query for best results.',
22
24
  input_schema: {
23
25
  type: "object",
24
26
  properties: {
@@ -34,7 +36,7 @@ export const graphRecallDefinition: ToolDefinition = {
34
36
  enum: [...ALL_RECALL_SOURCES],
35
37
  },
36
38
  description:
37
- "Optional local sources to search. Omit to search memory, PKB, conversations, and workspace files.",
39
+ "Optional local sources to search. Omit to search memory, conversations, and workspace files.",
38
40
  },
39
41
  max_results: {
40
42
  type: "integer",
@@ -53,6 +55,38 @@ export const graphRecallDefinition: ToolDefinition = {
53
55
  },
54
56
  };
55
57
 
58
+ /**
59
+ * Default (high-pressure) `remember` tool description. Used when the
60
+ * `memory-retrospective` feature flag is OFF. The volume-shaming language
61
+ * ("almost every turn", "most frequently used tool") drives aggressive
62
+ * in-conversation capture for users who don't have the retrospective
63
+ * backstop enabled.
64
+ */
65
+ const REMEMBER_DESCRIPTION_DEFAULT =
66
+ "Remember anything concrete: facts, preferences, corrections, plans, felt moments, names, dates, decisions. Default to remembering. Never wait until end of conversation. Corrections are highest priority — call remember the same turn the correction lands. **CRITICAL:** You should be calling remember on almost every turn. This should be your most frequently used tool.";
67
+
68
+ /**
69
+ * Relaxed `remember` tool description used when `memory-retrospective` is
70
+ * ON. The retrospective pass catches what isn't captured in the moment, so
71
+ * the in-conversation pressure eases to a judgment framing: pause when
72
+ * something feels worth marking, not because the volume is required.
73
+ */
74
+ const REMEMBER_DESCRIPTION_RELAXED =
75
+ "Remember anything concrete the user shared: corrections, plans, decisions, felt moments, names, dates, commitments, preferences. Corrections are the highest priority — call `remember` the same turn the correction lands. You don't have to call this on every turn; a retrospective pass reviews the conversation after each message-count / time interval and saves what you didn't capture. Use judgment: pause and remember when something feels worth marking, not because the volume is required.";
76
+
77
+ /**
78
+ * Return the description that should appear in the `remember` tool
79
+ * registration for the current config. The variant is selected by the
80
+ * `memory-retrospective` assistant feature flag. Exposed as a function so
81
+ * the tool registrar can compute the value at registration time without
82
+ * importing config layers into the static definition.
83
+ */
84
+ export function getRememberDescription(config: AssistantConfig): string {
85
+ return isAssistantFeatureFlagEnabled("memory-retrospective", config)
86
+ ? REMEMBER_DESCRIPTION_RELAXED
87
+ : REMEMBER_DESCRIPTION_DEFAULT;
88
+ }
89
+
56
90
  /**
57
91
  * Save a fact to the assistant's knowledge base. The fact is appended to
58
92
  * `buffer.md` (immediately available in the next conversation) and the daily
@@ -60,11 +94,16 @@ export const graphRecallDefinition: ToolDefinition = {
60
94
  * writes go under `memory/`; otherwise they go under `pkb/`. Consolidation
61
95
  * of the buffer into longer-form storage runs as a separate periodic job in
62
96
  * both modes.
97
+ *
98
+ * The static `description` field carries the default (high-pressure) text
99
+ * so any direct importer that doesn't go through `getRememberDescription`
100
+ * still gets a valid tool definition. The registered `RememberTool` in
101
+ * `tools/memory/register.ts` overrides this at registration time with the
102
+ * flag-aware variant.
63
103
  */
64
104
  export const graphRememberDefinition: ToolDefinition = {
65
105
  name: "remember",
66
- description:
67
- "Remember anything concrete: facts, preferences, corrections, plans, felt moments, names, dates, decisions. Default to remembering. Never wait until end of conversation. Corrections are highest priority — call remember the same turn the correction lands. **CRITICAL:** You should be calling remember on almost every turn. This should be your most frequently used tool.",
106
+ description: REMEMBER_DESCRIPTION_DEFAULT,
68
107
  input_schema: {
69
108
  type: "object",
70
109
  properties: {
@@ -12,6 +12,8 @@ import { getMemoryCheckpoint, setMemoryCheckpoint } from "./checkpoints.js";
12
12
  import { getDb } from "./db-connection.js";
13
13
  import { selectedBackendSupportsMultimodal } from "./embedding-backend.js";
14
14
  import { enqueueMemoryJob, upsertDebouncedJob } from "./jobs-store.js";
15
+ import { isMemoryRetrospectiveConversation } from "./memory-retrospective-enqueue.js";
16
+ import { maybeEnqueueRetrospective } from "./memory-retrospective-trigger-check.js";
15
17
  import {
16
18
  extractMediaBlockMeta,
17
19
  extractTextFromStoredMessageContent,
@@ -283,6 +285,21 @@ export async function indexMessageNow(
283
285
  });
284
286
  }
285
287
  }
288
+
289
+ // ── Memory retrospective triggers ─────────────────────────────────
290
+ // Independent of auto-analyze: the retrospective is a focused,
291
+ // memory-only pass that re-reads messages since its last successful
292
+ // run and saves what the in-conversation `remember` calls didn't
293
+ // capture. Triggers (interval / message_count) are evaluated by
294
+ // `maybeEnqueueRetrospective`, which also enforces the per-conversation
295
+ // cooldown gate against retry storms. Recursion guard skips the
296
+ // memory-retrospective background conversation itself.
297
+ if (
298
+ triggerConfig != null &&
299
+ !isMemoryRetrospectiveConversation(input.conversationId)
300
+ ) {
301
+ maybeEnqueueRetrospective(input.conversationId, triggerConfig);
302
+ }
286
303
  }
287
304
 
288
305
  // ── Conversation summarization (independent of extraction) ────────