@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
@@ -1,10 +1,10 @@
1
1
  import { v4 as uuid } from "uuid";
2
2
 
3
- import type { InterfaceId } from "../channels/types.js";
4
3
  import {
5
4
  assistantEventHub,
6
5
  broadcastMessage,
7
6
  } from "../runtime/assistant-event-hub.js";
7
+ import { enforceSameActorOrErrorResult } from "../runtime/auth/same-actor.js";
8
8
  import * as pendingInteractions from "../runtime/pending-interactions.js";
9
9
  import type { ToolExecutionResult } from "../tools/types.js";
10
10
  import { AssistantError, ErrorCode } from "../util/errors.js";
@@ -24,11 +24,49 @@ export type HostBrowserInput = DistributiveOmit<
24
24
 
25
25
  const log = getLogger("host-browser-proxy");
26
26
 
27
- /** Interface priority order for host_browser: Chrome Extension first, macOS SSE bridge second. */
28
- const HOST_BROWSER_INTERFACE_PREFERENCE: InterfaceId[] = [
29
- "chrome-extension",
30
- "macos",
31
- ];
27
+ /**
28
+ * Pick the host_browser-capable client to dispatch to.
29
+ *
30
+ * When `targetClientId` is supplied, the client with that id is looked
31
+ * up directly in the `host_browser`-capable roster. The same-actor check
32
+ * in `request()` still runs on the returned client when
33
+ * `sourceActorPrincipalId` is present.
34
+ *
35
+ * When `sourceActorPrincipalId` is supplied (and no explicit target),
36
+ * candidate clients are filtered down to those owned by the same actor.
37
+ * Returns `undefined` when no same-actor client is connected; the
38
+ * caller surfaces this as the existing "no active extension connection"
39
+ * rejection.
40
+ *
41
+ * When neither is supplied (legacy callers without a resolved actor
42
+ * identity), falls through to the most-recently-active host_browser
43
+ * client so the registry singleton continues to work for single-client
44
+ * setups.
45
+ *
46
+ * Within each branch, ties are broken by `lastActiveAt` descending —
47
+ * the natural order returned by `listClientsByCapability`. Callers that
48
+ * need a specific transport (e.g. Chrome Extension's `chrome.debugger`
49
+ * over the macOS CDP bridge) must pass `targetClientId` explicitly via
50
+ * the LLM-facing param added in #30066.
51
+ */
52
+ function resolveTargetClient(
53
+ sourceActorPrincipalId: string | undefined,
54
+ targetClientId?: string,
55
+ ) {
56
+ if (targetClientId != null) {
57
+ const clients = assistantEventHub.listClientsByCapability("host_browser");
58
+ return clients.find((c) => c.clientId === targetClientId);
59
+ }
60
+
61
+ const candidates =
62
+ assistantEventHub.listClientsByCapability("host_browser");
63
+ if (sourceActorPrincipalId == null) {
64
+ return candidates[0];
65
+ }
66
+ return candidates.find(
67
+ (c) => c.actorPrincipalId === sourceActorPrincipalId,
68
+ );
69
+ }
32
70
 
33
71
  export class HostBrowserProxy {
34
72
  private static _instance: HostBrowserProxy | null = null;
@@ -67,10 +105,7 @@ export class HostBrowserProxy {
67
105
  */
68
106
  isAvailable(): boolean {
69
107
  return (
70
- assistantEventHub.getPreferredClientByCapability(
71
- "host_browser",
72
- HOST_BROWSER_INTERFACE_PREFERENCE,
73
- ) != null
108
+ assistantEventHub.getMostRecentClientByCapability("host_browser") != null
74
109
  );
75
110
  }
76
111
 
@@ -84,15 +119,64 @@ export class HostBrowserProxy {
84
119
  return assistantEventHub.listClientsByInterface("chrome-extension").length > 0;
85
120
  }
86
121
 
122
+ /**
123
+ * Send a host_browser request to the connected extension/macOS bridge.
124
+ *
125
+ * When `targetClientId` is supplied, the proxy dispatches to that specific
126
+ * client (subject to the `host_browser` capability check and the same-actor
127
+ * gate below). This mirrors the `target_client_id` pattern on `host_bash`,
128
+ * `host_file_*`, and `host_cu`.
129
+ *
130
+ * When `sourceActorPrincipalId` is supplied, the proxy refuses to dispatch
131
+ * to a client owned by a different actor — same-user enforcement is the
132
+ * authoritative gate against routing one actor's CDP request onto another
133
+ * actor's connected extension. The resolved target's `clientId` and
134
+ * `actorPrincipalId` are then persisted alongside the pending interaction
135
+ * so that the result-route's same-actor check can verify the submitting
136
+ * client at result time.
137
+ *
138
+ * When `sourceActorPrincipalId` is undefined (legacy/internal flows
139
+ * with no resolved actor identity), falls back to the most-recently-
140
+ * active host_browser client without an actor filter so the registry
141
+ * singleton continues to work for single-client setups.
142
+ */
87
143
  request(
88
144
  input: HostBrowserInput,
89
145
  conversationId: string,
90
146
  signal?: AbortSignal,
147
+ sourceActorPrincipalId?: string,
148
+ targetClientId?: string,
91
149
  ): Promise<ToolExecutionResult> {
92
150
  if (signal?.aborted) {
93
151
  return Promise.resolve({ content: "Aborted", isError: true });
94
152
  }
95
153
 
154
+ // Resolve the target client up front so we can persist the actor binding
155
+ // alongside the pending interaction registration. Same shape as
156
+ // host-cu-proxy: the result-route same-actor check compares the
157
+ // submitting client's actor against this captured value.
158
+ const preferredClient = resolveTargetClient(sourceActorPrincipalId, targetClientId);
159
+
160
+ // Same-user enforcement: when the caller's actor is known, refuse to
161
+ // dispatch to a client owned by a different actor. This covers the
162
+ // cross-client exposure case where a web/iOS turn for actor A would
163
+ // otherwise auto-resolve to actor B's connected extension.
164
+ if (
165
+ sourceActorPrincipalId != null &&
166
+ preferredClient != null &&
167
+ preferredClient.actorPrincipalId !== sourceActorPrincipalId
168
+ ) {
169
+ const rejection = enforceSameActorOrErrorResult({
170
+ hub: assistantEventHub,
171
+ sourceActorPrincipalId,
172
+ targetClientId: preferredClient.clientId,
173
+ op: "host_browser",
174
+ });
175
+ if (rejection) return Promise.resolve(rejection);
176
+ }
177
+
178
+ const resolvedClientId = preferredClient?.clientId;
179
+ const targetActorPrincipalId = preferredClient?.actorPrincipalId;
96
180
  const requestId = uuid();
97
181
 
98
182
  return new Promise<ToolExecutionResult>((resolve, reject) => {
@@ -135,6 +219,8 @@ export class HostBrowserProxy {
135
219
  pendingInteractions.register(requestId, {
136
220
  conversationId,
137
221
  kind: "host_browser",
222
+ targetClientId: resolvedClientId,
223
+ targetActorPrincipalId,
138
224
  rpcResolve: resolve as (v: unknown) => void,
139
225
  rpcReject: reject,
140
226
  timer,
@@ -142,10 +228,6 @@ export class HostBrowserProxy {
142
228
  });
143
229
 
144
230
  try {
145
- const preferredClient = assistantEventHub.getPreferredClientByCapability(
146
- "host_browser",
147
- HOST_BROWSER_INTERFACE_PREFERENCE,
148
- );
149
231
  if (!preferredClient) {
150
232
  pendingInteractions.resolve(requestId);
151
233
  reject(
@@ -172,27 +254,6 @@ export class HostBrowserProxy {
172
254
  });
173
255
  }
174
256
 
175
- /**
176
- * Process a client result and resolve the RPC. Called by route handlers.
177
- */
178
- resolveResult(
179
- requestId: string,
180
- response: { content: string; isError: boolean },
181
- ): void {
182
- const interaction = pendingInteractions.resolve(requestId);
183
- if (!interaction?.rpcResolve) {
184
- log.debug(
185
- { requestId },
186
- "Ignoring host_browser_result for unknown or already-resolved request",
187
- );
188
- return;
189
- }
190
- interaction.rpcResolve({
191
- content: response.content,
192
- isError: response.isError,
193
- });
194
- }
195
-
196
257
  dispose(): void {
197
258
  for (const entry of pendingInteractions.getByKind("host_browser")) {
198
259
  pendingInteractions.resolve(entry.requestId);
@@ -141,8 +141,10 @@ export abstract class HostProxyBase<TRequest, TResultPayload> {
141
141
  signal?: AbortSignal,
142
142
  extraFields?: Record<string, unknown>,
143
143
  targetClientId?: string,
144
+ timeoutMsOverride?: number,
144
145
  ): Promise<TResultPayload> {
145
146
  const requestId = uuid();
147
+ const effectiveTimeoutMs = timeoutMsOverride ?? this.timeoutMs;
146
148
 
147
149
  return new Promise<TResultPayload>((resolve, reject) => {
148
150
  // Declared up-front so onAbort can close over a stable reference once
@@ -158,7 +160,7 @@ export abstract class HostProxyBase<TRequest, TResultPayload> {
158
160
  "Host proxy request timed out",
159
161
  );
160
162
  reject(new HostProxyRequestError("timeout", "timeout"));
161
- }, this.timeoutMs);
163
+ }, effectiveTimeoutMs);
162
164
 
163
165
  if (signal) {
164
166
  const onAbort = () => {
@@ -204,10 +206,20 @@ export abstract class HostProxyBase<TRequest, TResultPayload> {
204
206
  // (HostCuProxy bypasses dispatchRequest entirely with its own inline
205
207
  // request method that registers directly, which is why CU works
206
208
  // without this base-level fix.)
209
+ // Snapshot the target's actorPrincipalId at registration time so the
210
+ // result-route same-actor check has a stable value to compare against —
211
+ // the target client's SSE subscription may briefly disconnect between
212
+ // dispatch and result submission, which would make a live hub lookup
213
+ // falsely 403 a legitimate result.
214
+ const targetActorPrincipalId =
215
+ targetClientId != null
216
+ ? assistantEventHub.getActorPrincipalIdForClient(targetClientId)
217
+ : undefined;
207
218
  pendingInteractions.register(requestId, {
208
219
  conversationId,
209
220
  kind: this.resultPendingKind,
210
221
  ...(targetClientId != null ? { targetClientId } : {}),
222
+ ...(targetActorPrincipalId != null ? { targetActorPrincipalId } : {}),
211
223
  });
212
224
 
213
225
  try {
@@ -28,6 +28,7 @@
28
28
 
29
29
  import type { HostProxyCapability, InterfaceId } from "../channels/types.js";
30
30
  import { supportsHostProxy } from "../channels/types.js";
31
+ import { assistantEventHub } from "../runtime/assistant-event-hub.js";
31
32
 
32
33
  /**
33
34
  * Subset of Conversation/ProcessConversationContext that
@@ -60,6 +61,29 @@ export const HOST_PROXY_SKILL_PREACTIVATIONS: ReadonlyArray<{
60
61
  { capability: "host_app_control", skillId: "app-control" },
61
62
  ];
62
63
 
64
+ /**
65
+ * Returns true when a host-proxy for the given capability should be attached
66
+ * (instantiated and preactivated) for the current turn. Two cases qualify:
67
+ *
68
+ * 1. The source interface natively supports the capability (e.g. macOS → host_cu).
69
+ * 2. The source interface doesn't support the capability natively but at least
70
+ * one connected client does — cross-client routing. `chrome-extension` is
71
+ * excluded as a security boundary: it is its own executor context and cannot
72
+ * broker cross-client routing to a macOS client.
73
+ *
74
+ * This is the single source of truth for both preactivation and proxy
75
+ * instantiation, so the two decisions stay in sync.
76
+ */
77
+ export function shouldAttachHostProxyForCapability(
78
+ capability: HostProxyCapability,
79
+ sourceInterface: InterfaceId | undefined,
80
+ ): boolean {
81
+ if (!sourceInterface) return false;
82
+ if (supportsHostProxy(sourceInterface, capability)) return true;
83
+ if (sourceInterface === "chrome-extension") return false;
84
+ return assistantEventHub.listClientsByCapability(capability).length > 0;
85
+ }
86
+
63
87
  /**
64
88
  * Preactivate every host-proxy-backed skill that the given source interface
65
89
  * supports. No-op when `sourceInterface` is undefined.
@@ -75,7 +99,7 @@ export function preactivateHostProxySkills(
75
99
  ): void {
76
100
  if (!sourceInterface) return;
77
101
  for (const { capability, skillId } of HOST_PROXY_SKILL_PREACTIVATIONS) {
78
- if (supportsHostProxy(sourceInterface, capability)) {
102
+ if (shouldAttachHostProxyForCapability(capability, sourceInterface)) {
79
103
  conversation.addPreactivatedSkillId(skillId);
80
104
  }
81
105
  }
@@ -1,4 +1,5 @@
1
1
  import { existsSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
2
3
 
3
4
  import { getWorkspacePromptPath } from "../util/platform.js";
4
5
 
@@ -14,3 +15,21 @@ export function getAssistantName(): string | null {
14
15
  return null;
15
16
  }
16
17
  }
18
+
19
+ /**
20
+ * Read the guardian's display name from `users/default.md`. We look for the
21
+ * markdown-bold "Name" label (matching the IDENTITY.md convention) and fall
22
+ * back to `null` on any miss; callers substitute a generic label.
23
+ */
24
+ export function resolveUserName(workspaceDir: string): string | null {
25
+ try {
26
+ const content = readFileSync(
27
+ join(workspaceDir, "users", "default.md"),
28
+ "utf-8",
29
+ );
30
+ const match = content.match(/\*\*Name:\*\*\s*(.+)/);
31
+ return match?.[1]?.trim() || null;
32
+ } catch {
33
+ return null;
34
+ }
35
+ }
@@ -31,10 +31,6 @@ import {
31
31
  } from "../credential-execution/startup-timeout.js";
32
32
  import { FilingService } from "../filing/filing-service.js";
33
33
  import { HeartbeatService } from "../heartbeat/heartbeat-service.js";
34
- import {
35
- type FeedSchedulerHandle,
36
- startFeedScheduler,
37
- } from "../home/feed-scheduler.js";
38
34
  import { backfillRelationshipStateIfMissing } from "../home/relationship-state-writer.js";
39
35
  import { closeSentry, initSentry, setSentryDeviceId } from "../instrument.js";
40
36
  import { getMcpServerManager } from "../mcp/manager.js";
@@ -44,6 +40,7 @@ import {
44
40
  } from "../memory/attachments-store.js";
45
41
  import { expireAllPendingCanonicalRequests } from "../memory/canonical-guardian-store.js";
46
42
  import { deleteMessageById, getMessages } from "../memory/conversation-crud.js";
43
+ import { getDb } from "../memory/db-connection.js";
47
44
  import { initializeDb } from "../memory/db-init.js";
48
45
  import { selectEmbeddingBackend } from "../memory/embedding-backend.js";
49
46
  import { enqueueMemoryJob } from "../memory/jobs-store.js";
@@ -60,6 +57,7 @@ import { seedOAuthProviders } from "../oauth/seed-providers.js";
60
57
  import { loadUserPlugins } from "../plugins/user-loader.js";
61
58
  import { backfillGuardIfNeeded } from "../proactive-artifact/index.js";
62
59
  import { ensurePromptFiles } from "../prompts/system-prompt.js";
60
+ import { runProviderConnectionsBackfill } from "../providers/inference/backfill.js";
63
61
  import { resolveManagedProxyContext } from "../providers/managed-proxy/context.js";
64
62
  import { broadcastMessage } from "../runtime/assistant-event-hub.js";
65
63
  import {
@@ -327,8 +325,6 @@ export async function runDaemon(): Promise<void> {
327
325
  log.warn({ err }, "Background feature flag init failed"),
328
326
  );
329
327
 
330
- maybeSeedMemoryV2Skills(loadConfig());
331
-
332
328
  seedInterfaceFiles();
333
329
 
334
330
  log.info("Daemon startup: initializing DB");
@@ -370,6 +366,20 @@ export async function runDaemon(): Promise<void> {
370
366
  await runWorkspaceMigrations(getWorkspaceDir(), WORKSPACE_MIGRATIONS);
371
367
  log.info("Daemon startup: workspace migrations complete");
372
368
 
369
+ // Seed canonical inference provider_connections and backfill any legacy
370
+ // profiles that pre-date the connection field. Runs after workspace
371
+ // migrations so migration 076 has already stripped services.inference.mode
372
+ // before backfill reads config. Idempotent — runs every boot so new
373
+ // canonicals propagate and manual config.json edits self-heal.
374
+ try {
375
+ runProviderConnectionsBackfill(getDb());
376
+ } catch (err) {
377
+ log.warn(
378
+ { err },
379
+ "provider_connections backfill failed — continuing startup",
380
+ );
381
+ }
382
+
373
383
  // Profiler retention sweep — prune completed profiler runs to stay
374
384
  // within configured byte-count, run-count, and free-space budgets.
375
385
  // Runs on every startup and is safe to call from explicit cleanup routes.
@@ -500,15 +510,16 @@ export async function runDaemon(): Promise<void> {
500
510
  // seeder and persisted alongside schema defaults.
501
511
  const defaultConfigMerge = mergeDefaultWorkspaceConfig();
502
512
 
503
- // Seed managed inference profiles into the workspace config. Runs after
504
- // workspace migrations and default-config merge, but before loadConfig() so
505
- // fresh hatches have profiles on disk before the first config load. Any
506
- // profile fields explicitly supplied by the default overlay stay
507
- // authoritative for this startup.
513
+ // Seed inference profiles into the workspace config. Managed Anthropic
514
+ // profiles are overwritten on every boot so Vellum can push updates.
515
+ // Off-platform hatches additionally create user profiles + a personal
516
+ // provider connection for the hatch provider.
508
517
  try {
509
518
  seedInferenceProfiles({
510
519
  preserveProfileNames: defaultConfigMerge.providedLlmProfileNames,
511
520
  preserveActiveProfile: defaultConfigMerge.providedLlmActiveProfile,
521
+ isHatch: defaultConfigMerge.hadOverlay,
522
+ db: dbReady ? getDb() : undefined,
512
523
  });
513
524
  log.info("Inference profile seeding complete");
514
525
  } catch (err) {
@@ -838,6 +849,26 @@ export async function runDaemon(): Promise<void> {
838
849
  );
839
850
  }
840
851
  })();
852
+
853
+ // Validate every concept page's frontmatter against the strict
854
+ // schema and emit a `warn` per offender. Surfaces schema drift
855
+ // (unknown keys, type mismatches) at boot time instead of waiting
856
+ // for the failure to manifest as a silent V2 retrieval no-op when
857
+ // a bad page first lands in a conversation's top-K. Fire-and-forget
858
+ // and the sweep itself never throws — defense in depth via the
859
+ // outer try/catch.
860
+ void (async () => {
861
+ try {
862
+ const { sweepConceptPageFrontmatter } =
863
+ await import("../memory/v2/frontmatter-sweep.js");
864
+ await sweepConceptPageFrontmatter(getWorkspaceDir());
865
+ } catch (err) {
866
+ log.warn(
867
+ { err },
868
+ "Concept page frontmatter sweep threw — continuing startup",
869
+ );
870
+ }
871
+ })();
841
872
  }
842
873
 
843
874
  log.info("Daemon startup: starting memory worker");
@@ -958,24 +989,6 @@ export async function runDaemon(): Promise<void> {
958
989
  dedupeKey: `watcher:notification:${crypto.randomUUID()}`,
959
990
  });
960
991
  },
961
- (params) => {
962
- void emitNotificationSignal({
963
- sourceEventName: "watcher.escalation",
964
- sourceChannel: "watcher",
965
- sourceContextId: `watcher-escalation-${Date.now()}`,
966
- attentionHints: {
967
- requiresAction: true,
968
- urgency: "high",
969
- isAsyncBackground: false,
970
- visibleInSourceNow: false,
971
- },
972
- contextPayload: {
973
- title: params.title,
974
- body: params.body,
975
- },
976
- dedupeKey: `watcher:escalation:${crypto.randomUUID()}`,
977
- });
978
- },
979
992
  (info) => {
980
993
  broadcastMessage({
981
994
  type: "schedule_conversation_created",
@@ -986,19 +999,6 @@ export async function runDaemon(): Promise<void> {
986
999
  },
987
1000
  );
988
1001
 
989
- // Home activity feed scheduler — drives the assistant reflection
990
- // loop + the platform Gmail digest. Fire-and-forget; a startup
991
- // failure must never block the rest of daemon boot (CLAUDE.md).
992
- let feedScheduler: FeedSchedulerHandle | null = null;
993
- try {
994
- feedScheduler = startFeedScheduler();
995
- } catch (err) {
996
- log.warn(
997
- { err },
998
- "Failed to start home feed scheduler — continuing startup",
999
- );
1000
- }
1001
-
1002
1002
  // Start the runtime HTTP server for optional REST API access.
1003
1003
  // Defaults to port 7821.
1004
1004
  let runtimeHttp: RuntimeHttpServer | null = null;
@@ -1338,7 +1338,6 @@ export async function runDaemon(): Promise<void> {
1338
1338
  filing,
1339
1339
  runtimeHttp,
1340
1340
  scheduler,
1341
- feedScheduler,
1342
1341
  getMemoryWorker: () => bgRefs.memoryWorker,
1343
1342
  getQdrantManager: () => bgRefs.qdrantManager,
1344
1343
  mcpManager,
@@ -14,10 +14,11 @@
14
14
  * - `ensureRunning()` — idempotent. First caller triggers
15
15
  * `child_process.spawn`, subsequent concurrent callers await the
16
16
  * same in-flight promise. Resolves once the child dials
17
- * `assistant-skill.sock` and sends a handshake frame (via
18
- * `notifyHandshake`) whose reported source-tree hash matches the
19
- * shipped manifest's hash. A mismatch kills the spawn and throws
20
- * a clear error pointing the user at regenerating the manifest.
17
+ * `assistant-skill.sock` and the first `host.registries.register_*`
18
+ * frame lands (which calls {@link setActiveConnection}). Source-hash
19
+ * drift is not validated on this path `notifyHandshake` exists for
20
+ * a future explicit handshake frame that ships the skill's
21
+ * runtime-computed hash, but no production caller invokes it today.
21
22
  *
22
23
  * - `reportSessionStarted(id)` / `reportSessionEnded(id)` — mutate
23
24
  * the active-session counter, called by the
@@ -278,15 +279,14 @@ export class MeetHostSupervisor {
278
279
  }
279
280
 
280
281
  /**
281
- * Called by the IPC route handler when the child sends its
282
- * `host.registries.register_tools` / `ready` frame. The supervisor
283
- * validates the reported source hash against the shipped manifest
284
- * and either resolves or rejects the in-flight `ensureRunning()`
285
- * promise accordingly.
286
- *
287
- * Intentionally public so PR 24's `host.registries.*` route (which
288
- * owns the IPC socket) can forward the payload without the
289
- * supervisor owning any socket state itself.
282
+ * Validate a handshake payload's reported source hash against the
283
+ * shipped manifest and resolve or reject the in-flight
284
+ * `ensureRunning()` promise accordingly. Currently dormant on the
285
+ * production path readiness is signalled by the first
286
+ * `host.registries.register_*` frame (see {@link setActiveConnection})
287
+ * which carries no hash. This method is preserved as the integration
288
+ * point for a future explicit handshake frame whose payload ships the
289
+ * skill's runtime-computed hash; only tests exercise it today.
290
290
  */
291
291
  notifyHandshake(payload: MeetHostHandshakePayload): void {
292
292
  if (!this.handshakeResolve || !this.handshakeReject) {
@@ -374,8 +374,8 @@ export class MeetHostSupervisor {
374
374
  // The first `host.registries.register_*` frame doubles as the
375
375
  // readiness signal: it means `register(client)` ran to completion and
376
376
  // the IPC socket is healthy. Resolve any in-flight handshake so
377
- // `ensureRunning()` unblocks. `notifyHandshake` remains the path for
378
- // callers that send a dedicated hash-bearing handshake frame.
377
+ // `ensureRunning()` unblocks. No source-hash check happens here —
378
+ // see {@link notifyHandshake} for the dormant validation path.
379
379
  this.handshakeResolve?.();
380
380
  }
381
381
 
@@ -55,8 +55,11 @@ export async function maybeRebuildMemoryV2Concepts(
55
55
  if (!config.memory.v2.enabled) return;
56
56
 
57
57
  try {
58
- const { ensureConceptPageCollection, countConceptPagePoints } =
59
- await import("../memory/v2/qdrant.js");
58
+ const {
59
+ ensureConceptPageCollection,
60
+ countConceptPagePoints,
61
+ clearReembedSentinel,
62
+ } = await import("../memory/v2/qdrant.js");
60
63
  const { hasConceptPages } = await import("../memory/v2/page-store.js");
61
64
  const { enqueueMemoryJob } = await import("../memory/jobs-store.js");
62
65
 
@@ -76,6 +79,10 @@ export async function maybeRebuildMemoryV2Concepts(
76
79
  { jobId, collectionMigrated: migrated },
77
80
  "Memory v2 collection rebuild required — enqueued reembed job",
78
81
  );
82
+ // Clear the on-disk sentinel that the qdrant ensure-path writes before
83
+ // delete: now that reembed is queued, the cross-call signal can retire.
84
+ // If the sentinel never existed this is a no-op.
85
+ await clearReembedSentinel();
79
86
  }
80
87
  } catch (err) {
81
88
  log.warn(
@@ -15,6 +15,7 @@
15
15
  // Re-export domain modules (all individual types remain importable)
16
16
  export * from "./message-types/acp.js";
17
17
  export * from "./message-types/apps.js";
18
+ export * from "./message-types/bookmarks.js";
18
19
  export * from "./message-types/browser.js";
19
20
  export * from "./message-types/computer-use.js";
20
21
  export * from "./message-types/contacts.js";
@@ -42,6 +43,7 @@ export * from "./message-types/shared.js";
42
43
  export * from "./message-types/skills.js";
43
44
  export * from "./message-types/subagents.js";
44
45
  export * from "./message-types/surfaces.js";
46
+ export * from "./message-types/sync.js";
45
47
  export * from "./message-types/upgrades.js";
46
48
  export * from "./message-types/work-items.js";
47
49
  export * from "./message-types/workspace.js";
@@ -52,6 +54,7 @@ import type {
52
54
  _AppsClientMessages,
53
55
  _AppsServerMessages,
54
56
  } from "./message-types/apps.js";
57
+ import type { _BookmarksServerMessages } from "./message-types/bookmarks.js";
55
58
  import type {
56
59
  _BrowserClientMessages,
57
60
  _BrowserServerMessages,
@@ -129,6 +132,7 @@ import type {
129
132
  _SurfacesClientMessages,
130
133
  _SurfacesServerMessages,
131
134
  } from "./message-types/surfaces.js";
135
+ import type { _SyncInvalidationServerMessages } from "./message-types/sync.js";
132
136
  import type { _UpgradesServerMessages } from "./message-types/upgrades.js";
133
137
  import type {
134
138
  _WorkItemsClientMessages,
@@ -188,6 +192,7 @@ export type ServerMessage =
188
192
  | _SubagentsServerMessages
189
193
  | _DocumentsServerMessages
190
194
  | _GuardianActionsServerMessages
195
+ | _SyncInvalidationServerMessages
191
196
  | _HomeServerMessages
192
197
  | _HostAppControlServerMessages
193
198
  | _HostBashServerMessages
@@ -205,6 +210,7 @@ export type ServerMessage =
205
210
  | _NotificationsServerMessages
206
211
  | _UpgradesServerMessages
207
212
  | _AcpServerMessages
213
+ | _BookmarksServerMessages
208
214
  | _DiskPressureServerMessages
209
215
  | SubagentEvent;
210
216
 
@@ -0,0 +1,18 @@
1
+ // Bookmark events. Surfaced over SSE so a `BookmarkStore` instance in any
2
+ // connected client can stay in sync when another window mutates the list.
3
+
4
+ import type { BookmarkSummary } from "../../memory/bookmark-crud.js";
5
+
6
+ export interface BookmarkCreated {
7
+ type: "bookmark.created";
8
+ bookmark: BookmarkSummary;
9
+ }
10
+
11
+ export interface BookmarkDeleted {
12
+ type: "bookmark.deleted";
13
+ messageId: string;
14
+ }
15
+
16
+ // --- Domain-level union aliases (consumed by the barrel file) ---
17
+
18
+ export type _BookmarksServerMessages = BookmarkCreated | BookmarkDeleted;
@@ -138,12 +138,6 @@ export interface ModelGetRequest {
138
138
  type: "model_get";
139
139
  }
140
140
 
141
- export interface ModelSetRequest {
142
- type: "model_set";
143
- model: string;
144
- provider?: string;
145
- }
146
-
147
141
  export interface ImageGenModelSetRequest {
148
142
  type: "image_gen_model_set";
149
143
  model: string;
@@ -310,8 +304,14 @@ export interface GenerationHandoff {
310
304
  queuedCount: number;
311
305
  attachments?: UserMessageAttachment[];
312
306
  attachmentWarnings?: string[];
313
- /** Database ID of the persisted assistant message, if any. */
307
+ /** Database ID of the final persisted assistant row, if any. */
314
308
  messageId?: string;
309
+ /**
310
+ * Database ID used by clients for the rendered assistant bubble. Tool turns
311
+ * may persist multiple assistant rows; this matches the history row that
312
+ * survives query-time merging.
313
+ */
314
+ displayMessageId?: string;
315
315
  }
316
316
 
317
317
  export interface ModelInfo {
@@ -387,7 +387,10 @@ export interface HistoryResponse {
387
387
  type: "history_response";
388
388
  conversationId: string;
389
389
  messages: Array<{
390
- id?: string; // Database message ID (for matching surfaces)
390
+ /** Database ID used by clients for the rendered message bubble. */
391
+ id?: string;
392
+ /** Concrete persisted row ID for row-scoped actions such as TTS/fork. */
393
+ daemonMessageId?: string;
391
394
  role: string;
392
395
  text: string;
393
396
  timestamp: number;
@@ -527,6 +530,7 @@ export type ConversationErrorCode =
527
530
  | "MANAGED_USAGE_LIMIT"
528
531
  | "PROVIDER_OVERLOADED"
529
532
  | "PROVIDER_API"
533
+ | "IMAGE_TOO_LARGE"
530
534
  | "PROVIDER_BILLING"
531
535
  | "PROVIDER_ORDERING"
532
536
  | "PROVIDER_WEB_SEARCH"
@@ -597,7 +601,6 @@ export type _ConversationsClientMessages =
597
601
  | CancelRequest
598
602
  | DeleteQueuedMessage
599
603
  | ModelGetRequest
600
- | ModelSetRequest
601
604
  | ImageGenModelSetRequest
602
605
  | UndoRequest
603
606
  | UsageRequest