@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
@@ -0,0 +1,192 @@
1
+ import { Database } from "bun:sqlite";
2
+ import { describe, expect, test } from "bun:test";
3
+
4
+ import { drizzle } from "drizzle-orm/bun-sqlite";
5
+
6
+ import { getSqliteFrom } from "../../db-connection.js";
7
+ import * as schema from "../../schema.js";
8
+ import { migrateCreateProviderConnections } from "../243-provider-connections.js";
9
+ import { migrateProviderConnectionStatusLabel } from "../244-provider-connection-status-label.js";
10
+ import { migrateBackfillProviderConnectionLabel } from "../246-backfill-provider-connection-label.js";
11
+
12
+ interface ConnectionRow {
13
+ name: string;
14
+ label: string | null;
15
+ }
16
+
17
+ function createTestDb() {
18
+ const sqlite = new Database(":memory:");
19
+ sqlite.exec("PRAGMA journal_mode=WAL");
20
+ sqlite.exec("PRAGMA foreign_keys = ON");
21
+ return drizzle(sqlite, { schema });
22
+ }
23
+
24
+ /// Ensure the `memory_checkpoints` table exists in test DBs — it's normally
25
+ /// provisioned by earlier infra migrations that the test harness doesn't
26
+ /// pull in. Schema mirrors what other backfill migrations expect.
27
+ function ensureCheckpointsTable(db: ReturnType<typeof createTestDb>): void {
28
+ const raw = getSqliteFrom(db);
29
+ raw.exec(`
30
+ CREATE TABLE IF NOT EXISTS memory_checkpoints (
31
+ key TEXT PRIMARY KEY,
32
+ value TEXT,
33
+ updated_at INTEGER
34
+ )
35
+ `);
36
+ }
37
+
38
+ /// Bring the test DB up to the state right before migration 246 runs:
39
+ /// provider_connections table present + status/label columns added.
40
+ function prepareSchemaThroughMigration244(
41
+ db: ReturnType<typeof createTestDb>,
42
+ ): void {
43
+ migrateCreateProviderConnections(db);
44
+ migrateProviderConnectionStatusLabel(db);
45
+ ensureCheckpointsTable(db);
46
+ }
47
+
48
+ describe("migration 246 — backfill provider_connection label", () => {
49
+ test("sets label = name for rows where label is NULL", () => {
50
+ const db = createTestDb();
51
+ const raw = getSqliteFrom(db);
52
+ prepareSchemaThroughMigration244(db);
53
+
54
+ // Insert a row with label = NULL (simulating a pre-244 connection).
55
+ const now = Date.now();
56
+ raw
57
+ .query(
58
+ `INSERT INTO provider_connections (name, provider, auth, status, label, created_at, updated_at) VALUES (?, ?, ?, 'active', NULL, ?, ?)`,
59
+ )
60
+ .run("anthropic-personal", "anthropic", JSON.stringify({ type: "api_key", credential: "credential/anthropic/api_key" }), now, now);
61
+
62
+ migrateBackfillProviderConnectionLabel(db);
63
+
64
+ const row = raw
65
+ .query(`SELECT name, label FROM provider_connections WHERE name = ?`)
66
+ .get("anthropic-personal") as ConnectionRow;
67
+ expect(row.label).toBe("anthropic-personal");
68
+ });
69
+
70
+ test("sets label = name for rows where label is empty/whitespace", () => {
71
+ const db = createTestDb();
72
+ const raw = getSqliteFrom(db);
73
+ prepareSchemaThroughMigration244(db);
74
+
75
+ const now = Date.now();
76
+ raw
77
+ .query(
78
+ `INSERT INTO provider_connections (name, provider, auth, status, label, created_at, updated_at) VALUES (?, ?, ?, 'active', ?, ?, ?)`,
79
+ )
80
+ .run("openai-empty", "openai", JSON.stringify({ type: "api_key", credential: "credential/openai/api_key" }), "", now, now);
81
+ raw
82
+ .query(
83
+ `INSERT INTO provider_connections (name, provider, auth, status, label, created_at, updated_at) VALUES (?, ?, ?, 'active', ?, ?, ?)`,
84
+ )
85
+ .run("openai-whitespace", "openai", JSON.stringify({ type: "api_key", credential: "credential/openai/api_key" }), " ", now, now);
86
+
87
+ migrateBackfillProviderConnectionLabel(db);
88
+
89
+ const empty = raw
90
+ .query(`SELECT label FROM provider_connections WHERE name = ?`)
91
+ .get("openai-empty") as ConnectionRow;
92
+ const whitespace = raw
93
+ .query(`SELECT label FROM provider_connections WHERE name = ?`)
94
+ .get("openai-whitespace") as ConnectionRow;
95
+ expect(empty.label).toBe("openai-empty");
96
+ expect(whitespace.label).toBe("openai-whitespace");
97
+ });
98
+
99
+ test("does NOT overwrite rows where the user has set a non-empty label", () => {
100
+ const db = createTestDb();
101
+ const raw = getSqliteFrom(db);
102
+ prepareSchemaThroughMigration244(db);
103
+
104
+ const now = Date.now();
105
+ raw
106
+ .query(
107
+ `INSERT INTO provider_connections (name, provider, auth, status, label, created_at, updated_at) VALUES (?, ?, ?, 'active', ?, ?, ?)`,
108
+ )
109
+ .run("anthropic-work", "anthropic", JSON.stringify({ type: "api_key", credential: "credential/anthropic/api_key" }), "Anthropic — Work", now, now);
110
+
111
+ migrateBackfillProviderConnectionLabel(db);
112
+
113
+ const row = raw
114
+ .query(`SELECT label FROM provider_connections WHERE name = ?`)
115
+ .get("anthropic-work") as ConnectionRow;
116
+ expect(row.label).toBe("Anthropic — Work");
117
+ });
118
+
119
+ test("is idempotent — second run does not re-clobber a later user-cleared label", () => {
120
+ const db = createTestDb();
121
+ const raw = getSqliteFrom(db);
122
+ prepareSchemaThroughMigration244(db);
123
+
124
+ const now = Date.now();
125
+ raw
126
+ .query(
127
+ `INSERT INTO provider_connections (name, provider, auth, status, label, created_at, updated_at) VALUES (?, ?, ?, 'active', NULL, ?, ?)`,
128
+ )
129
+ .run("anthropic-personal", "anthropic", JSON.stringify({ type: "api_key", credential: "credential/anthropic/api_key" }), now, now);
130
+
131
+ // First run: backfills NULL → "anthropic-personal".
132
+ migrateBackfillProviderConnectionLabel(db);
133
+ expect(
134
+ (raw.query(`SELECT label FROM provider_connections WHERE name = ?`).get("anthropic-personal") as ConnectionRow).label,
135
+ ).toBe("anthropic-personal");
136
+
137
+ // User clears the label after the backfill ran.
138
+ raw.query(`UPDATE provider_connections SET label = NULL WHERE name = ?`).run("anthropic-personal");
139
+
140
+ // Second run: should NOT re-clobber the user's deliberate clear, because
141
+ // the checkpoint was set on the first successful run.
142
+ migrateBackfillProviderConnectionLabel(db);
143
+ expect(
144
+ (raw.query(`SELECT label FROM provider_connections WHERE name = ?`).get("anthropic-personal") as ConnectionRow).label,
145
+ ).toBeNull();
146
+ });
147
+
148
+ test("checkpoint is set after a successful run", () => {
149
+ const db = createTestDb();
150
+ const raw = getSqliteFrom(db);
151
+ prepareSchemaThroughMigration244(db);
152
+
153
+ migrateBackfillProviderConnectionLabel(db);
154
+
155
+ const checkpoint = raw
156
+ .query(`SELECT key FROM memory_checkpoints WHERE key = ?`)
157
+ .get("backfill_provider_connection_label") as { key: string } | null;
158
+ expect(checkpoint).not.toBeNull();
159
+ expect(checkpoint?.key).toBe("backfill_provider_connection_label");
160
+ });
161
+
162
+ test("no-op when provider_connections table is absent (first-boot edge)", () => {
163
+ const db = createTestDb();
164
+ ensureCheckpointsTable(db);
165
+
166
+ // Don't run 243/244 — the table doesn't exist yet.
167
+ expect(() => migrateBackfillProviderConnectionLabel(db)).not.toThrow();
168
+
169
+ // Checkpoint should still get set so we don't retry forever.
170
+ const raw = getSqliteFrom(db);
171
+ const checkpoint = raw
172
+ .query(`SELECT key FROM memory_checkpoints WHERE key = ?`)
173
+ .get("backfill_provider_connection_label");
174
+ expect(checkpoint).not.toBeNull();
175
+ });
176
+
177
+ test("no-op when label column is absent (244 hasn't run yet) — no checkpoint set", () => {
178
+ const db = createTestDb();
179
+ const raw = getSqliteFrom(db);
180
+ migrateCreateProviderConnections(db); // 243 only, NOT 244
181
+ ensureCheckpointsTable(db);
182
+
183
+ expect(() => migrateBackfillProviderConnectionLabel(db)).not.toThrow();
184
+
185
+ // Crucially: no checkpoint should be set, so the backfill can run later
186
+ // once 244 has provisioned the column.
187
+ const checkpoint = raw
188
+ .query(`SELECT key FROM memory_checkpoints WHERE key = ?`)
189
+ .get("backfill_provider_connection_label");
190
+ expect(checkpoint).toBeNull();
191
+ });
192
+ });
@@ -201,6 +201,13 @@ export {
201
201
  } from "./237-heartbeat-runs.js";
202
202
  export { migrateScheduleRetryPolicy } from "./238-schedule-retry-policy.js";
203
203
  export { migrateTraceEventsCreatedAtIndex } from "./239-trace-events-created-at-index.js";
204
+ export { migrateConversationInferenceProfileSession } from "./240-conversation-inference-profile-session.js";
205
+ export { migrateActivationStateFkCascade } from "./241-activation-state-fk-cascade.js";
206
+ export { migrateMessageBookmarks } from "./242-message-bookmarks.js";
207
+ export { migrateCreateProviderConnections } from "./243-provider-connections.js";
208
+ export { migrateProviderConnectionStatusLabel } from "./244-provider-connection-status-label.js";
209
+ export { migrateMemoryRetrospectiveState } from "./245-memory-retrospective-state.js";
210
+ export { migrateBackfillProviderConnectionLabel } from "./246-backfill-provider-connection-label.js";
204
211
  export {
205
212
  MIGRATION_REGISTRY,
206
213
  type MigrationRegistryEntry,
@@ -36,6 +36,21 @@ export function getActivePublishedPageByAppId(
36
36
  return row ?? null;
37
37
  }
38
38
 
39
+ export function insertPublishedPage(record: {
40
+ id: string;
41
+ deploymentId: string;
42
+ publicUrl: string;
43
+ pageTitle: string | null;
44
+ htmlHash: string;
45
+ publishedAt: number;
46
+ status: string;
47
+ appId: string | null;
48
+ projectSlug: string | null;
49
+ }): void {
50
+ const db = getDb();
51
+ db.insert(publishedPages).values(record).run();
52
+ }
53
+
39
54
  export function updatePublishedPage(
40
55
  id: string,
41
56
  updates: {
@@ -44,6 +59,7 @@ export function updatePublishedPage(
44
59
  htmlHash?: string;
45
60
  publishedAt?: number;
46
61
  appId?: string;
62
+ status?: string;
47
63
  },
48
64
  ): void {
49
65
  const db = getDb();
@@ -0,0 +1,38 @@
1
+ import {
2
+ index,
3
+ integer,
4
+ sqliteTable,
5
+ text,
6
+ uniqueIndex,
7
+ } from "drizzle-orm/sqlite-core";
8
+
9
+ import { conversations, messages } from "./conversations.js";
10
+
11
+ /**
12
+ * User-saved bookmarks for individual messages. Surfaced in the macOS app
13
+ * Settings → Bookmarks tab and on the message hover overflow menu, behind the
14
+ * `bookmarks` client feature flag.
15
+ *
16
+ * Both foreign keys CASCADE so bookmarks disappear automatically when their
17
+ * parent message or conversation is deleted. A unique index on `message_id`
18
+ * keeps the create-bookmark path idempotent.
19
+ */
20
+ export const messageBookmarks = sqliteTable(
21
+ "message_bookmarks",
22
+ {
23
+ id: text("id").primaryKey(),
24
+ messageId: text("message_id")
25
+ .notNull()
26
+ .references(() => messages.id, { onDelete: "cascade" }),
27
+ conversationId: text("conversation_id")
28
+ .notNull()
29
+ .references(() => conversations.id, { onDelete: "cascade" }),
30
+ createdAt: integer("created_at").notNull(),
31
+ },
32
+ (table) => [
33
+ uniqueIndex("message_bookmarks_message_id_uniq").on(table.messageId),
34
+ index("message_bookmarks_created_at_idx").on(table.createdAt),
35
+ ],
36
+ );
37
+
38
+ export type MessageBookmarkRow = typeof messageBookmarks.$inferSelect;
@@ -39,6 +39,8 @@ export const conversations = sqliteTable(
39
39
  lastMessageAt: integer("last_message_at"),
40
40
  archivedAt: integer("archived_at"),
41
41
  inferenceProfile: text("inference_profile"),
42
+ inferenceProfileSessionId: text("inference_profile_session_id"),
43
+ inferenceProfileExpiresAt: integer("inference_profile_expires_at"),
42
44
  },
43
45
  (table) => [
44
46
  index("idx_conversations_updated_at").on(table.updatedAt),
@@ -1,8 +1,10 @@
1
1
  export * from "./acp.js";
2
+ export * from "./bookmarks.js";
2
3
  export * from "./calls.js";
3
4
  export * from "./contacts.js";
4
5
  export * from "./conversations.js";
5
6
  export * from "./guardian.js";
7
+ export * from "./inference.js";
6
8
  export * from "./infrastructure.js";
7
9
  export * from "./memory-core.js";
8
10
  export * from "./memory-graph.js";
@@ -0,0 +1,29 @@
1
+ import { index, integer, sqliteTable, text } from "drizzle-orm/sqlite-core";
2
+
3
+ /**
4
+ * Named provider connections.
5
+ *
6
+ * Each row is a named auth-config instance for a code-defined provider.
7
+ * Profiles in config.json reference connections by `name` via the
8
+ * `provider_connection` field.
9
+ *
10
+ * Created by migration 243.
11
+ */
12
+ export const providerConnections = sqliteTable(
13
+ "provider_connections",
14
+ {
15
+ name: text("name").primaryKey(),
16
+ provider: text("provider").notNull(),
17
+ auth: text("auth").notNull(),
18
+ status: text("status").notNull().default("active"),
19
+ label: text("label"),
20
+ createdAt: integer("created_at").notNull(),
21
+ updatedAt: integer("updated_at").notNull(),
22
+ },
23
+ (table) => [
24
+ index("idx_provider_connections_provider").on(table.provider),
25
+ ],
26
+ );
27
+
28
+ export type ProviderConnectionRow = typeof providerConnections.$inferSelect;
29
+ export type NewProviderConnectionRow = typeof providerConnections.$inferInsert;
@@ -100,6 +100,15 @@ export const memoryCheckpoints = sqliteTable("memory_checkpoints", {
100
100
  updatedAt: integer("updated_at").notNull(),
101
101
  });
102
102
 
103
+ export const memoryRetrospectiveState = sqliteTable(
104
+ "memory_retrospective_state",
105
+ {
106
+ conversationId: text("conversation_id").primaryKey(),
107
+ lastProcessedMessageId: text("last_processed_message_id").notNull(),
108
+ lastRunAt: integer("last_run_at").notNull(),
109
+ },
110
+ );
111
+
103
112
  export const conversationStarters = sqliteTable(
104
113
  "conversation_starters",
105
114
  {
@@ -9,6 +9,7 @@ import type {
9
9
  } from "../qdrant-client.js";
10
10
  import { getQdrantClient } from "../qdrant-client.js";
11
11
  import { memorySegments, memorySummaries } from "../schema.js";
12
+ import { mapCosineToUnit } from "../validation.js";
12
13
  // ── Types (inlined from deleted types.ts) ──────────────────────────
13
14
 
14
15
  type CandidateType = "segment" | "item" | "summary" | "media";
@@ -235,7 +236,3 @@ function buildHybridFilter(
235
236
  must_not: mustNotConditions,
236
237
  };
237
238
  }
238
-
239
- function mapCosineToUnit(value: number): number {
240
- return Math.max(0, Math.min(1, (value + 1) / 2));
241
- }
@@ -0,0 +1,27 @@
1
+ // Bun Snapshot v1, https://bun.sh/docs/test/snapshots
2
+
3
+ exports[`renderRouterPrompt — determinism & snapshot stability snapshot of fixed inputs 1`] = `
4
+ "You are a background helper for Aria. Your job is to route memory pages for the next assistant turn between Aria and Alice.
5
+
6
+ You will be shown the recent conversation, a \`<now>\` marker for the current time, an \`<already_injected_ids>\` block listing pages picked on the previous turn, and a \`# Concept Page Index\` listing every routable page on this workspace.
7
+
8
+ Pick the concept pages whose contents would help Aria respond well on this turn. Lean toward inclusion when in doubt — missing a relevant page is a worse error than surfacing a few unused ones, because the assistant can ignore extras but can't summon context that wasn't loaded. Abstain (return an empty list) only when nothing in the index plausibly bears on the turn.
9
+
10
+ Index format. Each line of the index has the shape:
11
+
12
+ [id] slug — summary (edges: a, b, c)
13
+
14
+ \`id\` is a small integer used to refer to this page. \`edges\` are numeric IDs into the same list, pointing at related pages; you may follow them when one page strongly implies another.
15
+
16
+ Already-injected pages. Pages whose IDs appear in \`<already_injected_ids>\` were picked on the previous turn. Do not pick them again unless Aria should re-anchor on that material — e.g., the topic genuinely returns after drifting away. Routine continuity does not require re-picking; the prior turn's pages are already in the assistant's working context.
17
+
18
+ Time. Bias toward pages that match the current state implied by \`<now>\` and the active conversational threads (what is happening today, what was just decided, who is being discussed). Stale pages with no bearing on the live conversation should be skipped even if their summaries look superficially relevant.
19
+
20
+ Emit your selection by calling \`select_pages_to_inject\` with the chosen \`page_ids\`. Return an empty array to abstain.
21
+
22
+ # Concept Page Index
23
+
24
+ [1] morning-routine — coffee, walk, journal (edges: 2)
25
+ [2] journal-style — terse, dated, no fluff (edges: 1)
26
+ [3] taxes-2025 — Q1 estimate due April 15 (edges: )"
27
+ `;
@@ -8,7 +8,7 @@ import { migrateActivationState } from "../../migrations/232-activation-state.js
8
8
  import * as schema from "../../schema.js";
9
9
  import {
10
10
  evictCompactedTurns,
11
- fork,
11
+ forkActivationState,
12
12
  hydrate,
13
13
  save,
14
14
  } from "../activation-store.js";
@@ -113,12 +113,12 @@ describe("activation-store", () => {
113
113
  });
114
114
  });
115
115
 
116
- describe("fork", () => {
116
+ describe("forkActivationState", () => {
117
117
  test("copies parent state to a new conversation id", async () => {
118
118
  const parentState = buildState();
119
119
  await save(db, "conv-parent", parentState);
120
120
 
121
- await fork(db, "conv-parent", "conv-child");
121
+ forkActivationState(db, "conv-parent", "conv-child");
122
122
 
123
123
  const child = await hydrate(db, "conv-child");
124
124
  expect(child).toEqual(parentState);
@@ -129,7 +129,7 @@ describe("activation-store", () => {
129
129
  });
130
130
 
131
131
  test("is a no-op when the parent has no state", async () => {
132
- await fork(db, "conv-parent-missing", "conv-child");
132
+ forkActivationState(db, "conv-parent-missing", "conv-child");
133
133
 
134
134
  expect(await hydrate(db, "conv-child")).toBeNull();
135
135
  });
@@ -139,7 +139,7 @@ describe("activation-store", () => {
139
139
  await save(db, "conv-parent", parentState);
140
140
  await save(db, "conv-child", buildState({ currentTurn: 99 }));
141
141
 
142
- await fork(db, "conv-parent", "conv-child");
142
+ forkActivationState(db, "conv-parent", "conv-child");
143
143
 
144
144
  const child = await hydrate(db, "conv-child");
145
145
  expect(child?.currentTurn).toBe(7);
@@ -470,7 +470,9 @@ describe("computeOwnActivation", () => {
470
470
  c_now: 0.2,
471
471
  }),
472
472
  });
473
- // Expected: 0.3*0.6 + 0.3*0.5 + 0.2*0.4 + 0.2*0.2 = 0.18+0.15+0.08+0.04 = 0.45
473
+ // Positive cosines pass through unchanged (negatives clamp to 0).
474
+ // Expected: 0.3*0.6 + 0.3*0.5 + 0.2*0.4 + 0.2*0.2
475
+ // = 0.18 + 0.15 + 0.08 + 0.04 = 0.45
474
476
  expect(out.activation.get("alice")).toBeCloseTo(0.45, 6);
475
477
  });
476
478
 
@@ -523,6 +525,7 @@ describe("computeOwnActivation", () => {
523
525
  c_now: 0.2,
524
526
  }),
525
527
  });
528
+ // Positive cosines pass through unchanged: 1.0 stays 1.0; 0 stays 0.
526
529
  // 0.3*0 + 0.3*1 + 0.2*0 + 0.2*0 = 0.3
527
530
  expect(out.activation.get("fresh")).toBeCloseTo(0.3, 6);
528
531
  });
@@ -573,7 +576,8 @@ describe("computeOwnActivation", () => {
573
576
  expect(breakdown).toBeDefined();
574
577
  // priorContribution is `d * prev`, not the weighted sim term.
575
578
  expect(breakdown?.priorContribution).toBeCloseTo(d * 0.6, 6);
576
- // Raw sims, captured before c_user / c_assistant / c_now weighting.
579
+ // Fused sims (positive cosines pass through unchanged), captured before
580
+ // c_user / c_assistant / c_now weighting.
577
581
  expect(breakdown?.simUser).toBeCloseTo(0.5, 6);
578
582
  expect(breakdown?.simAssistant).toBeCloseTo(0.4, 6);
579
583
  expect(breakdown?.simNow).toBeCloseTo(0.2, 6);
@@ -801,8 +805,10 @@ describe("computeOwnActivation", () => {
801
805
  });
802
806
 
803
807
  test("rerank boost is additive on A_o and leaves raw simUser / simAssistant untouched", async () => {
804
- stageHybridResponse([{ slug: "a", denseScore: 0.5 }]); // user
805
- stageHybridResponse([{ slug: "a", denseScore: 0.4 }]); // assistant
808
+ // Positive cosines pass through unchanged; pick 0.5 / 0.4 directly so
809
+ // the round fused values used in the formula assertion below hold.
810
+ stageHybridResponse([{ slug: "a", denseScore: 0.5 }]); // user — fused 0.5
811
+ stageHybridResponse([{ slug: "a", denseScore: 0.4 }]); // assistant — fused 0.4
806
812
  stageHybridResponse([]); // now
807
813
  rerankState.scores = new Map([["a", 0.8]]);
808
814
 
@@ -1219,6 +1225,7 @@ describe("skills participate in the unified pipeline", () => {
1219
1225
  });
1220
1226
 
1221
1227
  // No prior state → priorContribution = 0.
1228
+ // Positive cosines pass through unchanged.
1222
1229
  // 0.3*0.5 + 0.2*0.4 + 0.2*0.2 = 0.15 + 0.08 + 0.04 = 0.27
1223
1230
  expect(out.activation.get("skills/example-skill-a")).toBeCloseTo(0.27, 6);
1224
1231
  expect(out.breakdown.get("skills/example-skill-a")?.priorContribution).toBe(
@@ -8,8 +8,7 @@
8
8
  * Coverage matrix:
9
9
  * - migrate: wraps `runMemoryV2Migration`; force flag propagates;
10
10
  * `MigrationAlreadyAppliedError` is swallowed (no rethrow).
11
- * - reembed: enqueues `N + 4` jobs (concept-page slugs plus four reserved
12
- * meta-file slugs).
11
+ * - reembed: enqueues `N` jobs, one per concept-page slug.
13
12
  * - activation-recompute: walks conversations with rows, runs the pipeline
14
13
  * end-to-end against the real activation module, persists fresh state.
15
14
  *
@@ -116,7 +115,10 @@ const STUB_RUNTIME_CONFIG = {
116
115
  };
117
116
  mock.module("../../../config/loader.js", () => ({
118
117
  getConfig: () => STUB_RUNTIME_CONFIG,
118
+ getConfigReadOnly: () => STUB_RUNTIME_CONFIG,
119
119
  loadConfig: () => STUB_RUNTIME_CONFIG,
120
+ loadRawConfig: () => ({}) as Record<string, unknown>,
121
+ saveRawConfig: () => {},
120
122
  invalidateConfigCache: () => {},
121
123
  applyNestedDefaults: () => STUB_RUNTIME_CONFIG,
122
124
  }));
@@ -208,7 +210,6 @@ const { writePage } = await import("../page-store.js");
208
210
  const { save: saveActivation, hydrate: hydrateActivation } =
209
211
  await import("../activation-store.js");
210
212
  const {
211
- META_FILE_SLUGS,
212
213
  memoryV2ActivationRecomputeJob,
213
214
  memoryV2MigrateJob,
214
215
  memoryV2ReembedJob,
@@ -322,15 +323,15 @@ describe("memoryV2MigrateJob", () => {
322
323
  // ---------------------------------------------------------------------------
323
324
 
324
325
  describe("memoryV2ReembedJob", () => {
325
- test("returns N + 4 (one per concept page plus the four meta files) and writes that many job rows", async () => {
326
+ test("returns N (one per concept page) and writes that many job rows", async () => {
326
327
  await writePage(tmpWorkspace, {
327
328
  slug: "alice",
328
- frontmatter: { edges: [], ref_files: [] },
329
+ frontmatter: { edges: [], ref_files: [], ref_urls: [] },
329
330
  body: "Alice.\n",
330
331
  });
331
332
  await writePage(tmpWorkspace, {
332
333
  slug: "bob",
333
- frontmatter: { edges: [], ref_files: [] },
334
+ frontmatter: { edges: [], ref_files: [], ref_urls: [] },
334
335
  body: "Bob.\n",
335
336
  });
336
337
 
@@ -339,8 +340,8 @@ describe("memoryV2ReembedJob", () => {
339
340
  TEST_CONFIG,
340
341
  );
341
342
 
342
- // Return value covers the contract: N concept pages + 4 meta files.
343
- expect(total).toBe(2 + META_FILE_SLUGS.length);
343
+ // Return value covers the contract: one job per concept page.
344
+ expect(total).toBe(2);
344
345
 
345
346
  // Verify the slugs that were enqueued by reading the memory_jobs table.
346
347
  // Tests that mock `jobs-store.js` skip inserting rows; when this suite
@@ -349,34 +350,50 @@ describe("memoryV2ReembedJob", () => {
349
350
  // belt-and-suspenders.
350
351
  const rows = getDb().select().from(memoryJobs).all();
351
352
  if (rows.length > 0) {
352
- expect(rows).toHaveLength(2 + META_FILE_SLUGS.length);
353
+ expect(rows).toHaveLength(2);
353
354
  const slugs = rows.map((row) => JSON.parse(row.payload).slug);
354
355
  expect(slugs).toContain("alice");
355
356
  expect(slugs).toContain("bob");
356
- for (const metaSlug of META_FILE_SLUGS) {
357
- expect(slugs).toContain(metaSlug);
358
- }
359
357
  for (const row of rows) {
360
358
  expect(row.type).toBe("embed_concept_page");
361
359
  }
362
360
  }
363
361
  });
364
362
 
365
- test("with no concept pages on disk, still enqueues the 4 meta-file jobs", async () => {
363
+ test("with no concept pages on disk, enqueues nothing", async () => {
366
364
  const total = await memoryV2ReembedJob(
367
365
  makeJob("memory_v2_reembed"),
368
366
  TEST_CONFIG,
369
367
  );
370
- expect(total).toBe(META_FILE_SLUGS.length);
368
+ expect(total).toBe(0);
371
369
  });
372
370
 
373
- test("uses reserved meta-file slugs (__essentials__/__threads__/__recent__/__buffer__)", () => {
374
- expect([...META_FILE_SLUGS]).toEqual([
375
- "__essentials__",
376
- "__threads__",
377
- "__recent__",
378
- "__buffer__",
379
- ]);
371
+ test("does NOT enqueue reserved meta-file slugs", async () => {
372
+ // The four prose meta files (essentials/threads/recent/buffer) live at
373
+ // `memory/<name>.md` and are direct-injected into the system prompt via
374
+ // `_autoinject.md`. Their underscore-bracketed slug aliases (e.g.
375
+ // `__essentials__`) fail the concept-page slug validator
376
+ // (`[a-z0-9][a-z0-9-]*`), so the reembed fan-out must not enqueue them.
377
+ await writePage(tmpWorkspace, {
378
+ slug: "alice",
379
+ frontmatter: { edges: [], ref_files: [], ref_urls: [] },
380
+ body: "Alice.\n",
381
+ });
382
+
383
+ await memoryV2ReembedJob(makeJob("memory_v2_reembed"), TEST_CONFIG);
384
+
385
+ const rows = getDb().select().from(memoryJobs).all();
386
+ if (rows.length > 0) {
387
+ const slugs = rows.map((row) => JSON.parse(row.payload).slug);
388
+ for (const reserved of [
389
+ "__essentials__",
390
+ "__threads__",
391
+ "__recent__",
392
+ "__buffer__",
393
+ ]) {
394
+ expect(slugs).not.toContain(reserved);
395
+ }
396
+ }
380
397
  });
381
398
  });
382
399