@vellumai/assistant 0.7.3 → 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 (778) hide show
  1. package/AGENTS.md +11 -0
  2. package/ARCHITECTURE.md +29 -28
  3. package/Dockerfile +6 -4
  4. package/README.md +2 -2
  5. package/__tests__/permissions/gateway-threshold-reader.test.ts +236 -9
  6. package/bun.lock +3 -0
  7. package/docker-entrypoint.sh +16 -0
  8. package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +420 -0
  9. package/eslint-rules/cli-no-daemon-internals.js +283 -0
  10. package/eslint.config.mjs +12 -0
  11. package/knip.json +3 -1
  12. package/node_modules/@vellumai/ipc-server-utils/bun.lock +24 -0
  13. package/node_modules/@vellumai/ipc-server-utils/package.json +18 -0
  14. package/node_modules/@vellumai/ipc-server-utils/src/index.ts +6 -0
  15. package/node_modules/@vellumai/ipc-server-utils/src/socket-watchdog.test.ts +430 -0
  16. package/node_modules/@vellumai/ipc-server-utils/src/socket-watchdog.ts +221 -0
  17. package/node_modules/@vellumai/ipc-server-utils/tsconfig.json +20 -0
  18. package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -1
  19. package/openapi.yaml +4126 -959
  20. package/package.json +5 -1
  21. package/scripts/generate-openapi.ts +52 -4
  22. package/scripts/sync-llm-catalog.ts +165 -0
  23. package/scripts/sync-web-search-catalog.ts +107 -0
  24. package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +169 -0
  25. package/src/__tests__/agent-loop-override-profile.test.ts +26 -1
  26. package/src/__tests__/annotate-risk-options.test.ts +291 -0
  27. package/src/__tests__/anthropic-provider.test.ts +92 -2
  28. package/src/__tests__/app-control-flow.test.ts +7 -0
  29. package/src/__tests__/approval-cascade.test.ts +8 -16
  30. package/src/__tests__/approval-routes-http.test.ts +6 -0
  31. package/src/__tests__/assistant-events-sse-shed.test.ts +232 -0
  32. package/src/__tests__/auto-analysis-end-to-end.test.ts +12 -25
  33. package/src/__tests__/avatar-identity-sync.test.ts +87 -0
  34. package/src/__tests__/background-workers-disk-pressure.test.ts +11 -22
  35. package/src/__tests__/btw-routes.test.ts +1 -0
  36. package/src/__tests__/call-constants.test.ts +10 -1
  37. package/src/__tests__/call-controller.test.ts +127 -0
  38. package/src/__tests__/call-site-routing-provider.test.ts +172 -45
  39. package/src/__tests__/cancel-resolves-conversation-key.test.ts +44 -3
  40. package/src/__tests__/channel-policy.test.ts +12 -0
  41. package/src/__tests__/checker.test.ts +89 -0
  42. package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +88 -30
  43. package/src/__tests__/compact-event-conversation-id-guard.test.ts +33 -5
  44. package/src/__tests__/compaction-strip-metadata-clear.test.ts +26 -1
  45. package/src/__tests__/config-loader-backfill.test.ts +526 -102
  46. package/src/__tests__/config-loader-corrupt.test.ts +68 -0
  47. package/src/__tests__/config-loader-platform-defaults.test.ts +345 -8
  48. package/src/__tests__/config-schema-cmd.test.ts +63 -29
  49. package/src/__tests__/config-schema.test.ts +14 -3
  50. package/src/__tests__/config-set-platform-guard.test.ts +75 -152
  51. package/src/__tests__/config-set-route.test.ts +198 -0
  52. package/src/__tests__/config-watcher.test.ts +6 -0
  53. package/src/__tests__/contacts-tools.test.ts +51 -199
  54. package/src/__tests__/context-search-agent-protocol.test.ts +21 -2
  55. package/src/__tests__/context-search-agent-runner.test.ts +22 -138
  56. package/src/__tests__/context-search-conversations-source.test.ts +42 -16
  57. package/src/__tests__/context-search-fanout.test.ts +20 -157
  58. package/src/__tests__/context-search-memory-source.test.ts +3 -26
  59. package/src/__tests__/context-search-memory-v2-source.test.ts +3 -3
  60. package/src/__tests__/context-search-types.test.ts +7 -2
  61. package/src/__tests__/context-window-manager.test.ts +389 -1
  62. package/src/__tests__/conversation-abort-tool-results.test.ts +1 -6
  63. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -1
  64. package/src/__tests__/conversation-agent-loop-overflow.test.ts +2 -1
  65. package/src/__tests__/conversation-agent-loop.test.ts +3 -3
  66. package/src/__tests__/conversation-confirmation-signals.test.ts +5 -13
  67. package/src/__tests__/conversation-crud-inference-profile.test.ts +100 -0
  68. package/src/__tests__/conversation-error.test.ts +38 -0
  69. package/src/__tests__/conversation-fork-crud.test.ts +241 -1
  70. package/src/__tests__/conversation-inference-profile-route.test.ts +14 -14
  71. package/src/__tests__/conversation-init.benchmark.test.ts +2 -1
  72. package/src/__tests__/conversation-lifecycle.test.ts +124 -0
  73. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +100 -1
  74. package/src/__tests__/conversation-process-callsite.test.ts +22 -7
  75. package/src/__tests__/conversation-provider-retry-repair.test.ts +1 -6
  76. package/src/__tests__/conversation-runtime-assembly.test.ts +19 -10
  77. package/src/__tests__/conversation-slash-commands.test.ts +194 -2
  78. package/src/__tests__/conversation-slash-unknown.test.ts +1 -6
  79. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +170 -9
  80. package/src/__tests__/conversation-surfaces-app-control.test.ts +323 -3
  81. package/src/__tests__/conversation-surfaces-data-persist.test.ts +73 -1
  82. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +59 -0
  83. package/src/__tests__/conversation-workspace-injection.test.ts +1 -7
  84. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -7
  85. package/src/__tests__/credential-security-invariants.test.ts +5 -6
  86. package/src/__tests__/daemon-credential-client.test.ts +56 -1
  87. package/src/__tests__/db-activation-state-fk-cascade.test.ts +132 -0
  88. package/src/__tests__/db-conversation-inference-profile-migration.test.ts +37 -0
  89. package/src/__tests__/db-memory-graph-event-date-repair.test.ts +43 -20
  90. package/src/__tests__/db-proxy-transaction.test.ts +206 -0
  91. package/src/__tests__/external-plugin-loader.test.ts +458 -0
  92. package/src/__tests__/filing-service.test.ts +25 -22
  93. package/src/__tests__/fixtures/mock-chrome-extension.ts +5 -0
  94. package/src/__tests__/gateway-only-guard.test.ts +0 -1
  95. package/src/__tests__/graph-extraction-event-date.test.ts +34 -0
  96. package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +10 -34
  97. package/src/__tests__/heartbeat-disk-pressure.test.ts +21 -8
  98. package/src/__tests__/heartbeat-service.test.ts +50 -233
  99. package/src/__tests__/history-repair.test.ts +89 -0
  100. package/src/__tests__/host-app-control-proxy.test.ts +109 -1
  101. package/src/__tests__/host-app-control-routes.test.ts +247 -1
  102. package/src/__tests__/host-browser-proxy.test.ts +416 -20
  103. package/src/__tests__/host-browser-routes.test.ts +325 -33
  104. package/src/__tests__/host-proxy-preactivation.test.ts +211 -0
  105. package/src/__tests__/inference-no-mode-boot-e2e.test.ts +246 -0
  106. package/src/__tests__/inference-profile-reaper.test.ts +154 -0
  107. package/src/__tests__/inference-profile-session-handler.test.ts +398 -0
  108. package/src/__tests__/inference-profile-session-ipc.test.ts +236 -0
  109. package/src/__tests__/injector-chain.test.ts +24 -16
  110. package/src/__tests__/injector-pkb-v2-silenced.test.ts +10 -7
  111. package/src/__tests__/inline-skill-load-permissions.test.ts +6 -1
  112. package/src/__tests__/install-skill-routing.test.ts +2 -2
  113. package/src/__tests__/lifecycle-memory-v2-seed.test.ts +169 -67
  114. package/src/__tests__/llm-callsite-catalog.test.ts +20 -1
  115. package/src/__tests__/llm-catalog-parity.test.ts +146 -0
  116. package/src/__tests__/llm-request-log-source-clickhouse.test.ts +188 -0
  117. package/src/__tests__/llm-request-log-source-factory.test.ts +124 -0
  118. package/src/__tests__/llm-resolver.test.ts +46 -0
  119. package/src/__tests__/managed-profile-guard.test.ts +131 -2
  120. package/src/__tests__/mcp-auth-routes.test.ts +1 -0
  121. package/src/__tests__/mcp-cli.test.ts +182 -220
  122. package/src/__tests__/mcp-health-check.test.ts +56 -27
  123. package/src/__tests__/memory-jobs-worker-lanes.test.ts +18 -11
  124. package/src/__tests__/message-complete-display-id.test.ts +175 -0
  125. package/src/__tests__/notification-decision-fallback.test.ts +91 -0
  126. package/src/__tests__/notification-decision-strategy.test.ts +22 -0
  127. package/src/__tests__/notification-platform-adapter.test.ts +229 -0
  128. package/src/__tests__/oauth-cli.test.ts +38 -1888
  129. package/src/__tests__/oauth-commands-routes.test.ts +711 -0
  130. package/src/__tests__/oauth-connect-routes.test.ts +174 -11
  131. package/src/__tests__/oauth-providers-routes.test.ts +14 -10
  132. package/src/__tests__/openai-responses-cutover-guard.test.ts +33 -12
  133. package/src/__tests__/openai-responses-provider.test.ts +17 -0
  134. package/src/__tests__/plugin-bootstrap.test.ts +31 -2
  135. package/src/__tests__/plugin-route-contribution.test.ts +31 -3
  136. package/src/__tests__/plugin-tool-contribution.test.ts +31 -3
  137. package/src/__tests__/plugin-types.test.ts +13 -11
  138. package/src/__tests__/process-message-background-slack.test.ts +46 -0
  139. package/src/__tests__/profile-entry-status.test.ts +43 -0
  140. package/src/__tests__/provider-managed-proxy-integration.test.ts +12 -4
  141. package/src/__tests__/provider-registry-ollama.test.ts +12 -4
  142. package/src/__tests__/provider-send-message-override-profile.test.ts +10 -4
  143. package/src/__tests__/relay-server.test.ts +164 -2
  144. package/src/__tests__/retry-thinking-tool-choice.test.ts +15 -0
  145. package/src/__tests__/schedule-retry.test.ts +56 -4
  146. package/src/__tests__/schedule-routes.test.ts +104 -0
  147. package/src/__tests__/scheduler-disk-pressure.test.ts +0 -4
  148. package/src/__tests__/scheduler-recurrence.test.ts +87 -34
  149. package/src/__tests__/scheduler-reuse-conversation.test.ts +161 -5
  150. package/src/__tests__/scheduler-wake.test.ts +0 -63
  151. package/src/__tests__/secret-allowlist.test.ts +1 -0
  152. package/src/__tests__/secret-prompt-log-hygiene.test.ts +7 -5
  153. package/src/__tests__/secret-prompter-channel-fallback.test.ts +7 -5
  154. package/src/__tests__/secret-response-routing.test.ts +7 -5
  155. package/src/__tests__/secret-routes-managed-proxy.test.ts +12 -4
  156. package/src/__tests__/server-history-render.test.ts +82 -0
  157. package/src/__tests__/shell-credential-ref.test.ts +95 -3
  158. package/src/__tests__/shell-tool-proxy-mode.test.ts +14 -0
  159. package/src/__tests__/skill-include-graph.test.ts +31 -0
  160. package/src/__tests__/skill-load-feature-flag.test.ts +1 -0
  161. package/src/__tests__/skill-load-tool.test.ts +42 -16
  162. package/src/__tests__/skills.test.ts +39 -0
  163. package/src/__tests__/subagent-call-site-routing.test.ts +78 -16
  164. package/src/__tests__/suggestion-routes.test.ts +3 -3
  165. package/src/__tests__/sync-message-contract.test.ts +63 -0
  166. package/src/__tests__/task-scheduler.test.ts +88 -23
  167. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -42
  168. package/src/__tests__/tool-executor.test.ts +155 -0
  169. package/src/__tests__/update-bulletin-job.test.ts +96 -193
  170. package/src/__tests__/usage-cli.test.ts +11 -73
  171. package/src/__tests__/user-plugin-loader.test.ts +145 -0
  172. package/src/__tests__/vercel-config.test.ts +168 -0
  173. package/src/__tests__/voice-session-bridge.test.ts +3 -0
  174. package/src/__tests__/web-search-catalog-parity.test.ts +86 -0
  175. package/src/__tests__/web-search.test.ts +303 -2
  176. package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +1 -21
  177. package/src/__tests__/workspace-migration-057-repair-stale-gemini-model-ids.test.ts +58 -0
  178. package/src/__tests__/workspace-migration-069-seed-onboarding-threads.test.ts +153 -0
  179. package/src/__tests__/workspace-migration-071-remove-safe-storage-release-note.test.ts +206 -0
  180. package/src/__tests__/workspace-migration-072-seed-reply-suggestion-callsite.test.ts +191 -0
  181. package/src/__tests__/workspace-migration-076-drop-services-inference-mode.test.ts +211 -0
  182. package/src/__tests__/workspace-migration-077-seed-memory-router-callsite.test.ts +174 -0
  183. package/src/__tests__/workspace-migration-079-home-feed-notification-only.test.ts +323 -0
  184. package/src/__tests__/workspace-migration-080-restrict-vercel-api-token-metadata.test.ts +299 -0
  185. package/src/__tests__/workspace-migration-081-backfill-bash-allowed-tools.test.ts +410 -0
  186. package/src/__tests__/workspace-migration-082-backfill-managed-profile-labels.test.ts +268 -0
  187. package/src/__tests__/workspace-migration-safe-storage-limits-release.test.ts +15 -27
  188. package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +3 -3
  189. package/src/__tests__/workspace-release-notes-feature-flag-guard.test.ts +115 -0
  190. package/src/acp/__tests__/helpers/which-stub.ts +4 -2
  191. package/src/acp/resolve-agent.test.ts +25 -0
  192. package/src/acp/resolve-agent.ts +13 -2
  193. package/src/acp/session-manager.ts +14 -0
  194. package/src/agent/loop.ts +11 -0
  195. package/src/approvals/guardian-decision-primitive.ts +0 -13
  196. package/src/approvals/guardian-request-resolvers.ts +19 -102
  197. package/src/calls/call-constants.ts +5 -8
  198. package/src/calls/call-controller.ts +130 -67
  199. package/src/calls/relay-server.ts +42 -1
  200. package/src/calls/relay-setup-router.ts +36 -0
  201. package/src/calls/types.ts +1 -0
  202. package/src/calls/voice-session-bridge.ts +24 -5
  203. package/src/channels/config.ts +14 -1
  204. package/src/channels/types.ts +1 -0
  205. package/src/cli/AGENTS.md +164 -4
  206. package/src/cli/__tests__/notifications.test.ts +54 -0
  207. package/src/cli/commands/__tests__/avatar.test.ts +540 -0
  208. package/src/cli/commands/__tests__/backup.test.ts +236 -776
  209. package/src/cli/commands/__tests__/cache.test.ts +1 -1
  210. package/src/cli/commands/__tests__/changelog.test.ts +593 -0
  211. package/src/cli/commands/__tests__/channel-verification-sessions.test.ts +503 -0
  212. package/src/cli/commands/__tests__/conversations-import.test.ts +515 -0
  213. package/src/cli/commands/__tests__/domain-register.test.ts +140 -167
  214. package/src/cli/commands/__tests__/domain-status.test.ts +137 -76
  215. package/src/cli/commands/__tests__/email-attachment.test.ts +314 -337
  216. package/src/cli/commands/__tests__/email-core.test.ts +579 -0
  217. package/src/cli/commands/__tests__/image-generation.test.ts +87 -824
  218. package/src/cli/commands/__tests__/inference-send.test.ts +30 -266
  219. package/src/cli/commands/__tests__/inference-session.test.ts +423 -0
  220. package/src/cli/commands/__tests__/memory-v2.test.ts +81 -110
  221. package/src/cli/commands/__tests__/skills.test.ts +563 -0
  222. package/src/cli/commands/__tests__/status.test.ts +249 -0
  223. package/src/cli/commands/__tests__/stt.test.ts +320 -0
  224. package/src/cli/commands/__tests__/tts-synthesize.test.ts +4 -603
  225. package/src/cli/commands/__tests__/tts.test.ts +321 -0
  226. package/src/cli/commands/__tests__/webhooks.test.ts +86 -511
  227. package/src/cli/commands/attachment.ts +8 -3
  228. package/src/cli/commands/audit.ts +95 -64
  229. package/src/cli/commands/auth.ts +61 -58
  230. package/src/cli/commands/avatar.ts +276 -390
  231. package/src/cli/commands/backup.ts +409 -505
  232. package/src/cli/commands/bash.ts +9 -5
  233. package/src/cli/commands/browser.ts +28 -9
  234. package/src/cli/commands/cache.ts +9 -4
  235. package/src/cli/commands/changelog.ts +414 -0
  236. package/src/cli/commands/channel-verification-sessions.ts +238 -317
  237. package/src/cli/commands/clients.ts +8 -3
  238. package/src/cli/commands/completions.ts +9 -9
  239. package/src/cli/commands/config.ts +102 -72
  240. package/src/cli/commands/contacts.ts +575 -696
  241. package/src/cli/commands/conversations-defer.ts +17 -69
  242. package/src/cli/commands/conversations-import.ts +90 -253
  243. package/src/cli/commands/conversations.ts +346 -436
  244. package/src/cli/commands/credential-execution.ts +9 -6
  245. package/src/cli/commands/credentials.ts +456 -736
  246. package/src/cli/commands/domain.ts +128 -206
  247. package/src/cli/commands/email.ts +606 -794
  248. package/src/cli/commands/gateway.ts +8 -1
  249. package/src/cli/commands/image-generation.ts +157 -205
  250. package/src/cli/commands/inference-providers.ts +352 -0
  251. package/src/cli/commands/inference-session.ts +415 -0
  252. package/src/cli/commands/inference.ts +87 -65
  253. package/src/cli/commands/keys.ts +8 -3
  254. package/src/cli/commands/mcp.ts +103 -287
  255. package/src/cli/commands/memory-v2.ts +163 -517
  256. package/src/cli/commands/notifications.ts +33 -7
  257. package/src/cli/commands/oauth/apps.ts +292 -261
  258. package/src/cli/commands/oauth/connect.ts +182 -345
  259. package/src/cli/commands/oauth/disconnect.ts +16 -215
  260. package/src/cli/commands/oauth/index.ts +49 -45
  261. package/src/cli/commands/oauth/mode.ts +43 -199
  262. package/src/cli/commands/oauth/ping.ts +17 -125
  263. package/src/cli/commands/oauth/providers.ts +732 -921
  264. package/src/cli/commands/oauth/request.ts +60 -350
  265. package/src/cli/commands/oauth/shared.ts +11 -121
  266. package/src/cli/commands/oauth/status.ts +31 -121
  267. package/src/cli/commands/oauth/token.ts +13 -55
  268. package/src/cli/commands/pending.ts +19 -10
  269. package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +133 -183
  270. package/src/cli/commands/platform/__tests__/connect.test.ts +66 -181
  271. package/src/cli/commands/platform/__tests__/disconnect.test.ts +71 -227
  272. package/src/cli/commands/platform/__tests__/status.test.ts +169 -287
  273. package/src/cli/commands/platform/connect.ts +16 -80
  274. package/src/cli/commands/platform/disconnect.ts +14 -112
  275. package/src/cli/commands/platform/index.ts +177 -246
  276. package/src/cli/commands/routes.ts +153 -336
  277. package/src/cli/commands/sequence.ts +316 -360
  278. package/src/cli/commands/skills.ts +449 -671
  279. package/src/cli/commands/status.ts +58 -37
  280. package/src/cli/commands/stt.ts +94 -262
  281. package/src/cli/commands/task.ts +14 -40
  282. package/src/cli/commands/trust.ts +8 -3
  283. package/src/cli/commands/tts.ts +162 -167
  284. package/src/cli/commands/ui.ts +35 -42
  285. package/src/cli/commands/usage.ts +188 -126
  286. package/src/cli/commands/watchers.ts +8 -3
  287. package/src/cli/commands/webhooks.ts +99 -193
  288. package/src/cli/lib/__tests__/register-command.test.ts +85 -0
  289. package/src/cli/lib/daemon-credential-client.ts +4 -5
  290. package/src/cli/lib/nested-value.ts +44 -0
  291. package/src/cli/lib/open-browser.ts +36 -0
  292. package/src/cli/lib/register-command.ts +19 -0
  293. package/src/cli/lib/time-ago.ts +34 -0
  294. package/src/cli/program.ts +2 -4
  295. package/src/cli/utils/__tests__/conversation-id.test.ts +66 -0
  296. package/src/cli/utils/__tests__/parse-duration.test.ts +49 -0
  297. package/src/cli/utils/conversation-id.ts +30 -0
  298. package/src/cli/utils/parse-duration.ts +41 -0
  299. package/src/config/acp-defaults.test.ts +5 -1
  300. package/src/config/acp-defaults.ts +11 -4
  301. package/src/config/bundled-skills/acp/TOOLS.json +2 -2
  302. package/src/config/bundled-skills/app-builder/SKILL.md +1 -3
  303. package/src/config/bundled-skills/app-control/TOOLS.json +32 -0
  304. package/src/config/bundled-skills/contacts/SKILL.md +12 -45
  305. package/src/config/bundled-skills/contacts/TOOLS.json +0 -57
  306. package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +0 -12
  307. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -58
  308. package/src/config/bundled-tool-registry.ts +0 -2
  309. package/src/config/feature-flag-registry.json +17 -17
  310. package/src/config/llm-resolver.ts +16 -1
  311. package/src/config/loader.ts +148 -33
  312. package/src/config/raw-config-utils.ts +2 -30
  313. package/src/config/schema.ts +4 -0
  314. package/src/config/schemas/__tests__/memory-v2.test.ts +49 -0
  315. package/src/config/schemas/call-site-catalog.ts +29 -7
  316. package/src/config/schemas/llm-request-logs.ts +57 -0
  317. package/src/config/schemas/llm.ts +52 -2
  318. package/src/config/schemas/memory-retrospective.ts +48 -0
  319. package/src/config/schemas/memory-v2.ts +33 -2
  320. package/src/config/schemas/memory.ts +4 -0
  321. package/src/config/schemas/services.ts +15 -12
  322. package/src/config/seed-inference-profiles.ts +195 -134
  323. package/src/contacts/contact-store.ts +0 -61
  324. package/src/context/window-manager.ts +191 -5
  325. package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +111 -0
  326. package/src/daemon/__tests__/conversation-tool-setup.test.ts +109 -4
  327. package/src/daemon/__tests__/daemon-skill-host.test.ts +10 -4
  328. package/src/daemon/approval-generators.ts +23 -29
  329. package/src/daemon/config-watcher.ts +2 -0
  330. package/src/daemon/conversation-agent-loop-handlers.ts +56 -0
  331. package/src/daemon/conversation-agent-loop.ts +140 -107
  332. package/src/daemon/conversation-error.ts +21 -0
  333. package/src/daemon/conversation-lifecycle.ts +68 -13
  334. package/src/daemon/conversation-process.ts +36 -19
  335. package/src/daemon/conversation-runtime-assembly.ts +14 -5
  336. package/src/daemon/conversation-slash.ts +175 -23
  337. package/src/daemon/conversation-store.ts +17 -10
  338. package/src/daemon/conversation-surfaces.ts +92 -26
  339. package/src/daemon/conversation-tool-setup.ts +33 -19
  340. package/src/daemon/conversation.ts +49 -10
  341. package/src/daemon/external-plugins-bootstrap.ts +18 -8
  342. package/src/daemon/guardian-action-generators.ts +7 -22
  343. package/src/daemon/handlers/config-model.ts +8 -126
  344. package/src/daemon/handlers/config-slack-channel.ts +10 -7
  345. package/src/daemon/handlers/config-vercel.ts +3 -1
  346. package/src/daemon/handlers/shared.ts +26 -0
  347. package/src/daemon/handlers/skills.ts +84 -5
  348. package/src/daemon/history-repair.ts +33 -6
  349. package/src/daemon/host-app-control-proxy.ts +44 -19
  350. package/src/daemon/host-bash-proxy.ts +85 -158
  351. package/src/daemon/host-browser-proxy.ts +97 -36
  352. package/src/daemon/host-cu-proxy.ts +1 -1
  353. package/src/daemon/host-file-proxy.ts +1 -1
  354. package/src/daemon/host-proxy-base.ts +13 -1
  355. package/src/daemon/host-proxy-preactivation.ts +25 -1
  356. package/src/daemon/host-transfer-proxy.ts +2 -2
  357. package/src/daemon/identity-helpers.ts +19 -0
  358. package/src/daemon/lifecycle.ts +128 -114
  359. package/src/daemon/meet-host-supervisor.ts +15 -15
  360. package/src/daemon/memory-v2-startup.ts +62 -14
  361. package/src/daemon/message-protocol.ts +6 -0
  362. package/src/daemon/message-types/bookmarks.ts +18 -0
  363. package/src/daemon/message-types/conversations.ts +12 -9
  364. package/src/daemon/message-types/messages.ts +28 -2
  365. package/src/daemon/message-types/sync.ts +60 -0
  366. package/src/daemon/pkb-reminder-builder.test.ts +54 -13
  367. package/src/daemon/pkb-reminder-builder.ts +21 -7
  368. package/src/daemon/process-message.ts +56 -23
  369. package/src/daemon/server.ts +23 -18
  370. package/src/daemon/shutdown-handlers.ts +0 -2
  371. package/src/daemon/tool-setup-types.ts +9 -0
  372. package/src/daemon/tool-side-effects.ts +6 -4
  373. package/src/daemon/wake-target-adapter.ts +11 -0
  374. package/src/documents/document-store.ts +35 -1
  375. package/src/export/transcript-formatter.ts +61 -2
  376. package/src/filing/filing-service.ts +42 -56
  377. package/src/heartbeat/__tests__/heartbeat-service.test.ts +359 -0
  378. package/src/heartbeat/heartbeat-run-store.ts +2 -1
  379. package/src/heartbeat/heartbeat-service.ts +149 -128
  380. package/src/home/__tests__/feed-types.test.ts +63 -131
  381. package/src/home/__tests__/feed-writer.test.ts +77 -278
  382. package/src/home/__tests__/post-connect-feed.test.ts +9 -12
  383. package/src/home/feed-types.ts +19 -73
  384. package/src/home/feed-writer.ts +25 -156
  385. package/src/home/post-connect-feed.ts +1 -3
  386. package/src/ipc/__tests__/cli-ipc.test.ts +2 -0
  387. package/src/ipc/__tests__/email-ipc.test.ts +506 -0
  388. package/src/ipc/__tests__/exit-helper.test.ts +104 -0
  389. package/src/ipc/__tests__/streaming-client.test.ts +237 -0
  390. package/src/ipc/__tests__/streaming-framing.test.ts +142 -0
  391. package/src/ipc/assistant-server.ts +148 -42
  392. package/src/ipc/cli-client.ts +370 -50
  393. package/src/ipc/routes/db-proxy-transaction.ts +151 -0
  394. package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +60 -0
  395. package/src/ipc/skill-routes/events.ts +30 -3
  396. package/src/ipc/skill-server.ts +99 -42
  397. package/src/live-voice/__tests__/live-voice-session-manager.test.ts +46 -0
  398. package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +1 -0
  399. package/src/live-voice/live-voice-session-manager.ts +11 -4
  400. package/src/live-voice/live-voice-session.ts +14 -6
  401. package/src/memory/__tests__/bookmark-crud.test.ts +258 -0
  402. package/src/memory/__tests__/bookmark-schema.test.ts +181 -0
  403. package/src/memory/__tests__/conversation-types.test.ts +36 -0
  404. package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +130 -0
  405. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +10 -57
  406. package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +177 -0
  407. package/src/memory/__tests__/memory-retrospective-job.test.ts +328 -0
  408. package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +213 -0
  409. package/src/memory/__tests__/memory-retrospective-trigger-check.test.ts +90 -0
  410. package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +69 -0
  411. package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +3 -0
  412. package/src/memory/bookmark-crud.ts +179 -0
  413. package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +31 -9
  414. package/src/memory/context-search/agent-protocol.ts +5 -1
  415. package/src/memory/context-search/agent-runner.ts +60 -85
  416. package/src/memory/context-search/limits.ts +1 -4
  417. package/src/memory/context-search/search.ts +23 -113
  418. package/src/memory/context-search/sources/conversations.ts +18 -6
  419. package/src/memory/context-search/sources/memory-v2.ts +40 -31
  420. package/src/memory/context-search/sources/memory.ts +9 -2
  421. package/src/memory/context-search/sources/workspace.ts +13 -10
  422. package/src/memory/context-search/types.ts +1 -1
  423. package/src/memory/conversation-bootstrap.ts +11 -0
  424. package/src/memory/conversation-crud.ts +312 -10
  425. package/src/memory/conversation-queries.ts +9 -5
  426. package/src/memory/conversation-title-service.ts +1 -0
  427. package/src/memory/conversation-types.ts +16 -0
  428. package/src/memory/db-init.ts +14 -0
  429. package/src/memory/embedding-backend.ts +2 -1
  430. package/src/memory/embedding-runtime-manager.ts +1 -2
  431. package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +104 -61
  432. package/src/memory/graph/__tests__/handle-remember-v2.test.ts +11 -26
  433. package/src/memory/graph/__tests__/remember-description.test.ts +55 -0
  434. package/src/memory/graph/conversation-graph-memory.ts +108 -14
  435. package/src/memory/graph/extraction.ts +4 -0
  436. package/src/memory/graph/graph-memory-state-store.ts +16 -3
  437. package/src/memory/graph/graph-search.test.ts +6 -5
  438. package/src/memory/graph/graph-search.ts +3 -4
  439. package/src/memory/graph/retriever.test.ts +12 -7
  440. package/src/memory/graph/retriever.ts +4 -5
  441. package/src/memory/graph/tool-handlers.ts +20 -11
  442. package/src/memory/graph/tools.ts +48 -9
  443. package/src/memory/indexer.ts +18 -2
  444. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +120 -6
  445. package/src/memory/jobs/embed-concept-page.ts +261 -89
  446. package/src/memory/jobs-store.ts +51 -1
  447. package/src/memory/jobs-worker.ts +60 -7
  448. package/src/memory/llm-request-log-source-clickhouse.ts +317 -0
  449. package/src/memory/llm-request-log-source-local.ts +26 -0
  450. package/src/memory/llm-request-log-source.ts +97 -0
  451. package/src/memory/llm-request-log-store.ts +1 -1
  452. package/src/memory/memory-retrospective-constants.ts +13 -0
  453. package/src/memory/memory-retrospective-enqueue.ts +114 -0
  454. package/src/memory/memory-retrospective-job.ts +351 -0
  455. package/src/memory/memory-retrospective-startup-cleanup.ts +108 -0
  456. package/src/memory/memory-retrospective-state.ts +162 -0
  457. package/src/memory/memory-retrospective-trigger-check.ts +91 -0
  458. package/src/memory/memory-v2-activation-log-store.ts +49 -5
  459. package/src/memory/memory-v2-concept-frequency.ts +4 -0
  460. package/src/memory/message-content.ts +38 -1
  461. package/src/memory/migrations/227-add-conversation-inference-profile.ts +6 -1
  462. package/src/memory/migrations/228-rename-inference-profile-snake-case.ts +20 -7
  463. package/src/memory/migrations/229-delete-private-conversations.test.ts +70 -1
  464. package/src/memory/migrations/229-delete-private-conversations.ts +12 -0
  465. package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +16 -2
  466. package/src/memory/migrations/240-conversation-inference-profile-session.ts +25 -0
  467. package/src/memory/migrations/241-activation-state-fk-cascade.ts +50 -0
  468. package/src/memory/migrations/242-message-bookmarks.ts +38 -0
  469. package/src/memory/migrations/243-provider-connections.ts +68 -0
  470. package/src/memory/migrations/244-provider-connection-status-label.ts +23 -0
  471. package/src/memory/migrations/245-memory-retrospective-state.ts +36 -0
  472. package/src/memory/migrations/246-backfill-provider-connection-label.ts +81 -0
  473. package/src/memory/migrations/__tests__/244-provider-connection-status-label.test.ts +84 -0
  474. package/src/memory/migrations/__tests__/245-memory-retrospective-state.test.ts +125 -0
  475. package/src/memory/migrations/__tests__/246-backfill-provider-connection-label.test.ts +192 -0
  476. package/src/memory/migrations/index.ts +7 -0
  477. package/src/memory/pkb/pkb-search.test.ts +6 -5
  478. package/src/memory/pkb/pkb-search.ts +4 -5
  479. package/src/memory/published-pages-store.ts +16 -0
  480. package/src/memory/qdrant-client.ts +3 -0
  481. package/src/memory/schema/bookmarks.ts +38 -0
  482. package/src/memory/schema/conversations.ts +2 -0
  483. package/src/memory/schema/index.ts +2 -0
  484. package/src/memory/schema/inference.ts +29 -0
  485. package/src/memory/schema/memory-core.ts +9 -0
  486. package/src/memory/search/semantic.ts +5 -9
  487. package/src/memory/v2/__tests__/__snapshots__/prompts-router.test.ts.snap +27 -0
  488. package/src/memory/v2/__tests__/activation-store.test.ts +5 -5
  489. package/src/memory/v2/__tests__/activation.test.ts +46 -9
  490. package/src/memory/v2/__tests__/backfill-jobs.test.ts +38 -21
  491. package/src/memory/v2/__tests__/consolidation-job.test.ts +140 -163
  492. package/src/memory/v2/__tests__/edge-index.test.ts +1 -1
  493. package/src/memory/v2/__tests__/frontmatter-sweep.test.ts +111 -0
  494. package/src/memory/v2/__tests__/injection.test.ts +768 -33
  495. package/src/memory/v2/__tests__/migration.test.ts +7 -3
  496. package/src/memory/v2/__tests__/page-index.test.ts +277 -0
  497. package/src/memory/v2/__tests__/page-store.test.ts +14 -1
  498. package/src/memory/v2/__tests__/prompts-router.test.ts +257 -0
  499. package/src/memory/v2/__tests__/qdrant.test.ts +382 -9
  500. package/src/memory/v2/__tests__/reranker.test.ts +4 -4
  501. package/src/memory/v2/__tests__/router.test.ts +516 -0
  502. package/src/memory/v2/__tests__/sim.test.ts +163 -8
  503. package/src/memory/v2/__tests__/skill-store.test.ts +58 -3
  504. package/src/memory/v2/__tests__/static-context.test.ts +8 -35
  505. package/src/memory/v2/__tests__/sweep-job.test.ts +114 -33
  506. package/src/memory/v2/activation-store.ts +34 -5
  507. package/src/memory/v2/activation.ts +40 -27
  508. package/src/memory/v2/backfill-jobs.ts +17 -84
  509. package/src/memory/v2/consolidation-job.ts +92 -86
  510. package/src/memory/v2/frontmatter-sweep.ts +91 -0
  511. package/src/memory/v2/injection.ts +466 -115
  512. package/src/memory/v2/migration.ts +117 -20
  513. package/src/memory/v2/page-index.ts +191 -0
  514. package/src/memory/v2/page-store.ts +42 -0
  515. package/src/memory/v2/prompts/consolidation.ts +14 -7
  516. package/src/memory/v2/prompts/router.ts +192 -0
  517. package/src/memory/v2/qdrant.ts +307 -133
  518. package/src/memory/v2/reranker.ts +14 -7
  519. package/src/memory/v2/router.ts +322 -0
  520. package/src/memory/v2/sim.ts +88 -34
  521. package/src/memory/v2/skill-store.ts +118 -29
  522. package/src/memory/v2/static-context.ts +20 -17
  523. package/src/memory/v2/sweep-job.ts +127 -102
  524. package/src/memory/v2/types.ts +16 -5
  525. package/src/memory/validation.ts +13 -0
  526. package/src/notifications/__tests__/emit-signal-home-feed.test.ts +182 -0
  527. package/src/notifications/__tests__/home-feed-side-effect.test.ts +199 -0
  528. package/src/notifications/__tests__/signal-registry.test.ts +17 -0
  529. package/src/notifications/adapters/platform.ts +171 -0
  530. package/src/notifications/conversation-pairing.ts +2 -2
  531. package/src/notifications/copy-composer.ts +61 -12
  532. package/src/notifications/decision-engine.ts +46 -0
  533. package/src/notifications/destination-resolver.ts +21 -0
  534. package/src/notifications/emit-signal.ts +28 -1
  535. package/src/notifications/home-feed-side-effect.ts +111 -0
  536. package/src/notifications/signal.ts +5 -0
  537. package/src/permissions/checker.ts +12 -0
  538. package/src/permissions/gateway-threshold-reader.ts +116 -8
  539. package/src/permissions/ipc-risk-types.ts +2 -0
  540. package/src/permissions/prompter.ts +86 -96
  541. package/src/permissions/secret-prompter.ts +31 -31
  542. package/src/plugin-api/index.ts +13 -0
  543. package/src/plugin-api/package.json +12 -0
  544. package/src/plugin-api/types.ts +62 -0
  545. package/src/plugins/defaults/injectors.ts +20 -5
  546. package/src/plugins/external-plugin-loader.ts +294 -0
  547. package/src/plugins/types.ts +46 -30
  548. package/src/plugins/user-loader.ts +64 -41
  549. package/src/proactive-artifact/job.test.ts +63 -8
  550. package/src/proactive-artifact/job.ts +20 -2
  551. package/src/proactive-artifact/message-copy.ts +18 -1
  552. package/src/proactive-artifact/trigger-state.test.ts +9 -0
  553. package/src/proactive-artifact/trigger-state.ts +4 -0
  554. package/src/prompts/__tests__/system-prompt.test.ts +105 -0
  555. package/src/prompts/system-prompt.ts +22 -1
  556. package/src/prompts/templates/SOUL.md +13 -28
  557. package/src/prompts/update-bulletin-job.ts +61 -73
  558. package/src/providers/__tests__/dispatch-connection-routing.test.ts +279 -0
  559. package/src/providers/__tests__/inference.test.ts +288 -0
  560. package/src/providers/__tests__/provider-env-vars.test.ts +6 -0
  561. package/src/providers/__tests__/provider-secret-catalog.test.ts +6 -0
  562. package/src/providers/__tests__/retry-callsite.test.ts +14 -32
  563. package/src/providers/__tests__/satellite-connection-routing.test.ts +510 -0
  564. package/src/providers/__tests__/search-provider-catalog.test.ts +80 -0
  565. package/src/providers/anthropic/client.ts +95 -26
  566. package/src/providers/call-site-routing.ts +94 -16
  567. package/src/providers/connection-resolution.ts +163 -0
  568. package/src/providers/inference/__tests__/connections-status-label.test.ts +250 -0
  569. package/src/providers/inference/adapter-factory.ts +173 -0
  570. package/src/providers/inference/auth.ts +112 -0
  571. package/src/providers/inference/backfill.ts +196 -0
  572. package/src/providers/inference/connections.ts +356 -0
  573. package/src/providers/inference/resolve-auth.ts +65 -0
  574. package/src/providers/model-catalog.ts +104 -6
  575. package/src/providers/openai/responses-provider.ts +4 -2
  576. package/src/providers/provider-env-vars.ts +17 -7
  577. package/src/providers/provider-secret-catalog.ts +49 -30
  578. package/src/providers/provider-send-message.ts +41 -20
  579. package/src/providers/registry.ts +143 -159
  580. package/src/providers/retry.ts +18 -10
  581. package/src/providers/search-provider-catalog.ts +121 -0
  582. package/src/runtime/AGENTS.md +18 -5
  583. package/src/runtime/__tests__/background-job-runner.test.ts +357 -0
  584. package/src/runtime/__tests__/pre-first-message-gate.test.ts +82 -0
  585. package/src/runtime/actor-trust-resolver.ts +32 -10
  586. package/src/runtime/agent-wake.ts +35 -6
  587. package/src/runtime/assistant-event-hub.ts +3 -85
  588. package/src/runtime/auth/route-policy.ts +304 -8
  589. package/src/runtime/auth/same-actor.ts +2 -0
  590. package/src/runtime/background-job-runner.ts +339 -0
  591. package/src/runtime/btw-sidechain.ts +1 -0
  592. package/src/runtime/channel-approvals.ts +3 -2
  593. package/src/runtime/guardian-reply-router.ts +0 -10
  594. package/src/runtime/http-router.ts +36 -1
  595. package/src/runtime/http-server.ts +31 -5
  596. package/src/runtime/http-types.ts +2 -0
  597. package/src/runtime/middleware/__tests__/request-logger.test.ts +162 -0
  598. package/src/runtime/middleware/request-logger.ts +62 -1
  599. package/src/runtime/pending-interactions.ts +19 -15
  600. package/src/runtime/pre-first-message-gate.ts +83 -0
  601. package/src/runtime/routes/__tests__/backup-routes.test.ts +8 -1
  602. package/src/runtime/routes/__tests__/bookmark-routes.test.ts +251 -0
  603. package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +142 -0
  604. package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +315 -0
  605. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +189 -0
  606. package/src/runtime/routes/__tests__/home-feed-routes.test.ts +15 -136
  607. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +736 -0
  608. package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +147 -0
  609. package/src/runtime/routes/__tests__/stt-routes.test.ts +5 -1
  610. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +384 -0
  611. package/src/runtime/routes/__tests__/tts-routes.test.ts +6 -2
  612. package/src/runtime/routes/acp-routes.ts +10 -8
  613. package/src/runtime/routes/app-management-routes.ts +228 -3
  614. package/src/runtime/routes/approval-routes.ts +7 -21
  615. package/src/runtime/routes/audit-routes.ts +43 -0
  616. package/src/runtime/routes/auth-routes.ts +72 -0
  617. package/src/runtime/routes/avatar-routes.ts +273 -20
  618. package/src/runtime/routes/backup-routes.ts +406 -2
  619. package/src/runtime/routes/bookmark-routes.ts +154 -0
  620. package/src/runtime/routes/channel-verification-routes.ts +2 -1
  621. package/src/runtime/routes/consolidation-routes.ts +8 -9
  622. package/src/runtime/routes/contact-routes.ts +0 -160
  623. package/src/runtime/routes/conversation-cli-routes.ts +192 -0
  624. package/src/runtime/routes/conversation-management-routes.ts +30 -43
  625. package/src/runtime/routes/conversation-query-routes.ts +373 -82
  626. package/src/runtime/routes/conversation-routes.ts +31 -10
  627. package/src/runtime/routes/conversations-import-routes.ts +229 -0
  628. package/src/runtime/routes/credential-routes.ts +540 -0
  629. package/src/runtime/routes/debug-bash-routes.ts +2 -0
  630. package/src/runtime/routes/debug-routes.ts +2 -2
  631. package/src/runtime/routes/document-pdf-renderer.ts +5 -1
  632. package/src/runtime/routes/domain-routes.ts +167 -0
  633. package/src/runtime/routes/email-routes.ts +603 -0
  634. package/src/runtime/routes/errors.ts +2 -2
  635. package/src/runtime/routes/events-routes.ts +192 -0
  636. package/src/runtime/routes/filing-routes.ts +2 -3
  637. package/src/runtime/routes/home-feed-routes.ts +6 -78
  638. package/src/runtime/routes/host-app-control-routes.ts +44 -2
  639. package/src/runtime/routes/host-browser-routes.ts +103 -22
  640. package/src/runtime/routes/http-adapter.ts +2 -0
  641. package/src/runtime/routes/identity-routes.ts +5 -0
  642. package/src/runtime/routes/image-generation-routes.ts +99 -0
  643. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +137 -1
  644. package/src/runtime/routes/inbound-stages/background-dispatch.ts +87 -7
  645. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +156 -0
  646. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +22 -7
  647. package/src/runtime/routes/index.ts +36 -0
  648. package/src/runtime/routes/inference-profile-session-handler.ts +312 -0
  649. package/src/runtime/routes/inference-profile-session-reaper.ts +98 -0
  650. package/src/runtime/routes/inference-profile-session-routes.ts +146 -0
  651. package/src/runtime/routes/inference-provider-connection-routes.ts +317 -0
  652. package/src/runtime/routes/inference-send-routes.ts +115 -0
  653. package/src/runtime/routes/integrations/twilio.ts +1 -0
  654. package/src/runtime/routes/mcp-auth-routes.ts +283 -9
  655. package/src/runtime/routes/memory-item-routes.test.ts +3 -9
  656. package/src/runtime/routes/memory-item-routes.ts +5 -6
  657. package/src/runtime/routes/memory-v2-routes.ts +105 -404
  658. package/src/runtime/routes/notification-routes.ts +2 -0
  659. package/src/runtime/routes/oauth-apps.ts +112 -7
  660. package/src/runtime/routes/oauth-commands-routes.ts +1007 -0
  661. package/src/runtime/routes/oauth-connect-routes.ts +67 -5
  662. package/src/runtime/routes/oauth-providers.ts +298 -8
  663. package/src/runtime/routes/platform-routes.ts +336 -0
  664. package/src/runtime/routes/playground/inject-failures.ts +2 -1
  665. package/src/runtime/routes/playground/reset-circuit.ts +2 -1
  666. package/src/runtime/routes/playground/state.ts +2 -1
  667. package/src/runtime/routes/publish-routes.ts +221 -0
  668. package/src/runtime/routes/schedule-routes.ts +82 -0
  669. package/src/runtime/routes/sequence-routes.ts +291 -0
  670. package/src/runtime/routes/settings-routes.ts +2 -10
  671. package/src/runtime/routes/skills-routes.ts +31 -1
  672. package/src/runtime/routes/stt-routes.ts +240 -3
  673. package/src/runtime/routes/surface-action-routes.ts +43 -7
  674. package/src/runtime/routes/tts-routes.ts +67 -0
  675. package/src/runtime/routes/types.ts +32 -0
  676. package/src/runtime/routes/user-routes-cli.ts +243 -0
  677. package/src/runtime/routes/webhook-routes.ts +165 -0
  678. package/src/runtime/sync/resource-sync-events.ts +25 -0
  679. package/src/runtime/sync/sync-publisher.test.ts +105 -0
  680. package/src/runtime/sync/sync-publisher.ts +21 -0
  681. package/src/schedule/scheduler.ts +200 -123
  682. package/src/security/__tests__/provider-key-env-fallback.test.ts +12 -6
  683. package/src/security/secret-patterns.ts +3 -0
  684. package/src/sequence/engine.ts +38 -40
  685. package/src/skills/include-graph.ts +35 -13
  686. package/src/subagent/manager.ts +20 -15
  687. package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +206 -0
  688. package/src/tools/browser/browser-execution.ts +15 -4
  689. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +174 -0
  690. package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +16 -13
  691. package/src/tools/browser/cdp-client/extension-cdp-client.ts +24 -1
  692. package/src/tools/browser/cdp-client/factory.ts +66 -5
  693. package/src/tools/browser/runtime-check.ts +77 -0
  694. package/src/tools/document/document-tool.ts +20 -0
  695. package/src/tools/executor.ts +18 -2
  696. package/src/tools/memory/register.test.ts +10 -8
  697. package/src/tools/memory/register.ts +9 -1
  698. package/src/tools/network/__tests__/web-search.test.ts +156 -0
  699. package/src/tools/network/web-search.ts +280 -37
  700. package/src/tools/permission-checker.ts +28 -5
  701. package/src/tools/skills/load.ts +24 -20
  702. package/src/tools/subagent/spawn.ts +3 -3
  703. package/src/tools/terminal/shell.ts +44 -0
  704. package/src/tools/tool-name-aliases.ts +19 -0
  705. package/src/tools/types.ts +19 -1
  706. package/src/usage/attribution.ts +3 -2
  707. package/src/util/pricing.ts +86 -160
  708. package/src/watcher/__tests__/engine.test.ts +301 -0
  709. package/src/watcher/constants.ts +7 -0
  710. package/src/watcher/engine.ts +90 -90
  711. package/src/workspace/migrations/046-seed-conversation-starters-callsite.ts +6 -9
  712. package/src/workspace/migrations/054-seed-recall-callsite.ts +10 -1
  713. package/src/workspace/migrations/057-repair-stale-gemini-model-ids.ts +28 -4
  714. package/src/workspace/migrations/067-release-notes-safe-storage-limits.ts +4 -62
  715. package/src/workspace/migrations/069-seed-onboarding-threads.ts +34 -0
  716. package/src/workspace/migrations/070-memory-v2-summary-schema-rebuild.ts +31 -0
  717. package/src/workspace/migrations/071-remove-safe-storage-release-note.ts +111 -0
  718. package/src/workspace/migrations/072-seed-reply-suggestion-callsite.ts +104 -0
  719. package/src/workspace/migrations/073-repair-recall-callsite-empty-profile.ts +93 -0
  720. package/src/workspace/migrations/074-drop-deprecated-secret-detection-keys.ts +117 -0
  721. package/src/workspace/migrations/075-memory-v2-bm25-b-default-reembed.ts +61 -0
  722. package/src/workspace/migrations/076-drop-services-inference-mode.ts +62 -0
  723. package/src/workspace/migrations/077-seed-memory-router-callsite.ts +89 -0
  724. package/src/workspace/migrations/078-release-notes-tavily-web-search.ts +66 -0
  725. package/src/workspace/migrations/079-home-feed-notification-only.ts +197 -0
  726. package/src/workspace/migrations/080-restrict-vercel-api-token-metadata.ts +182 -0
  727. package/src/workspace/migrations/081-backfill-bash-allowed-tools-for-injection-credentials.ts +160 -0
  728. package/src/workspace/migrations/082-backfill-managed-profile-labels.ts +154 -0
  729. package/src/workspace/migrations/registry.ts +28 -0
  730. package/src/workspace/migrations/runner.ts +13 -2
  731. package/src/workspace/migrations/types.ts +13 -3
  732. package/src/workspace/provider-commit-message-generator.ts +3 -2
  733. package/src/__tests__/context-search-pkb-source.test.ts +0 -492
  734. package/src/__tests__/credentials-cli.test.ts +0 -1225
  735. package/src/__tests__/memory-admin-recall.test.ts +0 -213
  736. package/src/approvals/__tests__/guardian-feed-event.test.ts +0 -303
  737. package/src/cli/commands/__tests__/email-download.test.ts +0 -260
  738. package/src/cli/commands/__tests__/email-list.test.ts +0 -216
  739. package/src/cli/commands/__tests__/email-register.test.ts +0 -186
  740. package/src/cli/commands/__tests__/email-send.test.ts +0 -416
  741. package/src/cli/commands/__tests__/email-status.test.ts +0 -185
  742. package/src/cli/commands/__tests__/email-unregister.test.ts +0 -168
  743. package/src/cli/commands/__tests__/routes.test.ts +0 -562
  744. package/src/cli/commands/__tests__/stt-transcribe.test.ts +0 -454
  745. package/src/cli/commands/autonomy.ts +0 -365
  746. package/src/cli/commands/memory.ts +0 -424
  747. package/src/cli/commands/oauth/__tests__/connect.test.ts +0 -1201
  748. package/src/cli/commands/oauth/__tests__/disconnect.test.ts +0 -686
  749. package/src/cli/commands/oauth/__tests__/mode.test.ts +0 -632
  750. package/src/cli/commands/oauth/__tests__/ping.test.ts +0 -631
  751. package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +0 -573
  752. package/src/cli/commands/oauth/__tests__/providers-register.test.ts +0 -330
  753. package/src/cli/commands/oauth/__tests__/providers-update.test.ts +0 -521
  754. package/src/cli/commands/oauth/__tests__/status.test.ts +0 -551
  755. package/src/cli/commands/oauth/__tests__/token.test.ts +0 -420
  756. package/src/cli/lib/daemon-avatar-client.ts +0 -37
  757. package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +0 -87
  758. package/src/config/bundled-skills/messaging/tools/__tests__/messaging-feed-events.test.ts +0 -207
  759. package/src/daemon/__tests__/conversation-feed-event.test.ts +0 -304
  760. package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +0 -233
  761. package/src/home/__tests__/assistant-feed-authoring.test.ts +0 -156
  762. package/src/home/__tests__/emit-feed-event.test.ts +0 -169
  763. package/src/home/__tests__/feed-population-integration.test.ts +0 -312
  764. package/src/home/__tests__/feed-scheduler.test.ts +0 -222
  765. package/src/home/__tests__/phase5-exit-criteria.test.ts +0 -229
  766. package/src/home/__tests__/platform-gmail-digest.test.ts +0 -222
  767. package/src/home/__tests__/rollup-producer.test.ts +0 -507
  768. package/src/home/assistant-feed-authoring.ts +0 -135
  769. package/src/home/emit-feed-event.ts +0 -169
  770. package/src/home/feed-scheduler.ts +0 -281
  771. package/src/home/platform-gmail-digest.ts +0 -163
  772. package/src/home/rewrite-command-preview.ts +0 -66
  773. package/src/home/rewrite-feed-title.ts +0 -58
  774. package/src/home/rollup-producer.ts +0 -426
  775. package/src/memory/admin.ts +0 -326
  776. package/src/memory/context-search/sources/pkb.ts +0 -477
  777. package/src/memory/graph/compaction.ts +0 -299
  778. /package/src/cli/{commands → lib}/cache-fs.ts +0 -0
@@ -11,6 +11,16 @@ import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test";
11
11
 
12
12
  const sentMessages: unknown[] = [];
13
13
  let mockHasClient = true;
14
+ // Default principal id used for both ctx.trustContext and clients in the
15
+ // existing single-user tests. Tests that exercise cross-user behaviour
16
+ // override this on individual clients and on the SurfaceConversationContext.
17
+ const DEFAULT_PRINCIPAL = "user-1";
18
+ type MockClient = {
19
+ clientId: string;
20
+ capabilities: string[];
21
+ actorPrincipalId?: string;
22
+ };
23
+ let mockHubClients: MockClient[] = [];
14
24
 
15
25
  mock.module("../runtime/assistant-event-hub.js", () => ({
16
26
  broadcastMessage: (msg: unknown) => sentMessages.push(msg),
@@ -19,6 +29,12 @@ mock.module("../runtime/assistant-event-hub.js", () => ({
19
29
  cap === "host_app_control" && mockHasClient
20
30
  ? { id: "mock-client" }
21
31
  : null,
32
+ listClientsByCapability: (cap: string) =>
33
+ mockHubClients.filter((c) => c.capabilities.includes(cap)),
34
+ getClientById: (id: string) =>
35
+ mockHubClients.find((c) => c.clientId === id),
36
+ getActorPrincipalIdForClient: (id: string) =>
37
+ mockHubClients.find((c) => c.clientId === id)?.actorPrincipalId,
22
38
  },
23
39
  }));
24
40
 
@@ -56,9 +72,18 @@ function buildMockContext(
56
72
  setHostAppControlProxy?: (
57
73
  proxy: InstanceType<typeof HostAppControlProxy> | undefined,
58
74
  ) => void,
75
+ trustGuardianPrincipalId: string | null = DEFAULT_PRINCIPAL,
59
76
  ): SurfaceConversationContext {
60
77
  return {
61
78
  conversationId,
79
+ trustContext:
80
+ trustGuardianPrincipalId != null
81
+ ? {
82
+ sourceChannel: "vellum",
83
+ trustClass: "guardian",
84
+ guardianPrincipalId: trustGuardianPrincipalId,
85
+ }
86
+ : undefined,
62
87
  traceEmitter: { emit: () => {} },
63
88
  sendToClient: () => {},
64
89
  pendingSurfaceActions: new Map(),
@@ -86,11 +111,13 @@ describe("surfaceProxyResolver — app-control tool routing", () => {
86
111
  beforeEach(() => {
87
112
  sentMessages.length = 0;
88
113
  mockHasClient = true;
114
+ mockHubClients = [];
89
115
  _resetActiveAppControlSession();
90
116
  });
91
117
 
92
118
  afterEach(() => {
93
119
  _resetActiveAppControlSession();
120
+ mockHubClients = [];
94
121
  });
95
122
 
96
123
  // -------------------------------------------------------------------------
@@ -130,15 +157,18 @@ describe("surfaceProxyResolver — app-control tool routing", () => {
130
157
  proxy.dispose();
131
158
  });
132
159
 
133
- test("returns isError for app_control_stop when no proxy is attached", async () => {
160
+ test("app_control_stop succeeds idempotently when no proxy is attached", async () => {
161
+ // Stop is local-only and runs BEFORE the isAvailable() gate so a
162
+ // disconnected client cannot strand the singleton lock. With no proxy
163
+ // attached at all, it must still succeed as a no-op without dispatching.
134
164
  const ctx = buildMockContext();
135
165
 
136
166
  const result = await surfaceProxyResolver(ctx, "app_control_stop", {
137
167
  tool: "stop",
138
168
  });
139
169
 
140
- expect(result.isError).toBe(true);
141
- expect(result.content).toContain("not available");
170
+ expect(result.isError).toBe(false);
171
+ expect(result.content.toLowerCase()).toContain("stopped");
142
172
  expect(sentMessages).toHaveLength(0);
143
173
  });
144
174
  });
@@ -325,4 +355,294 @@ describe("surfaceProxyResolver — app-control tool routing", () => {
325
355
  ownerProxy.dispose();
326
356
  });
327
357
  });
358
+
359
+ // -------------------------------------------------------------------------
360
+ // target_client_id validation — mirrors host_cu's targetClientId tests in
361
+ // cu-unified-flow.test.ts. The resolver validates the explicit target
362
+ // before recordAction-equivalents so an invalid or cross-user id never
363
+ // reaches the proxy.
364
+ // -------------------------------------------------------------------------
365
+
366
+ describe("target_client_id validation", () => {
367
+ test("returns fast error when target_client_id does not match any connected client", async () => {
368
+ mockHubClients = [
369
+ {
370
+ clientId: "client-a",
371
+ capabilities: ["host_app_control"],
372
+ actorPrincipalId: DEFAULT_PRINCIPAL,
373
+ },
374
+ ];
375
+ const proxy = new HostAppControlProxy("conv-1");
376
+ const ctx = buildMockContext(proxy, "conv-1");
377
+ _setActiveAppControlSession({
378
+ conversationId: "conv-1",
379
+ app: "com.example.editor",
380
+ });
381
+
382
+ const result = await surfaceProxyResolver(ctx, "app_control_observe", {
383
+ app: "com.example.editor",
384
+ target_client_id: "missing-client",
385
+ });
386
+
387
+ expect(result.isError).toBe(true);
388
+ expect(result.content).toContain("missing-client");
389
+ expect(result.content).toContain("host_app_control");
390
+ // No envelope dispatched — fail-fast before request().
391
+ expect(sentMessages).toHaveLength(0);
392
+
393
+ proxy.dispose();
394
+ });
395
+
396
+ test("returns fast error when target_client_id points to a client without host_app_control capability", async () => {
397
+ mockHubClients = [
398
+ {
399
+ clientId: "wrong-cap-client",
400
+ capabilities: ["host_bash"], // not host_app_control
401
+ actorPrincipalId: DEFAULT_PRINCIPAL,
402
+ },
403
+ ];
404
+ const proxy = new HostAppControlProxy("conv-1");
405
+ const ctx = buildMockContext(proxy, "conv-1");
406
+ _setActiveAppControlSession({
407
+ conversationId: "conv-1",
408
+ app: "com.example.editor",
409
+ });
410
+
411
+ const result = await surfaceProxyResolver(ctx, "app_control_observe", {
412
+ app: "com.example.editor",
413
+ target_client_id: "wrong-cap-client",
414
+ });
415
+
416
+ expect(result.isError).toBe(true);
417
+ expect(result.content).toContain("wrong-cap-client");
418
+ expect(result.content).toContain("does not support host_app_control");
419
+ expect(sentMessages).toHaveLength(0);
420
+
421
+ proxy.dispose();
422
+ });
423
+
424
+ test("dispatches with targetClientId when target_client_id is valid", async () => {
425
+ mockHubClients = [
426
+ {
427
+ clientId: "client-a",
428
+ capabilities: ["host_app_control"],
429
+ actorPrincipalId: DEFAULT_PRINCIPAL,
430
+ },
431
+ {
432
+ clientId: "client-b",
433
+ capabilities: ["host_app_control"],
434
+ actorPrincipalId: DEFAULT_PRINCIPAL,
435
+ },
436
+ ];
437
+ const proxy = new HostAppControlProxy("conv-1");
438
+ const ctx = buildMockContext(proxy, "conv-1");
439
+ _setActiveAppControlSession({
440
+ conversationId: "conv-1",
441
+ app: "com.example.editor",
442
+ });
443
+
444
+ const resultPromise = surfaceProxyResolver(ctx, "app_control_observe", {
445
+ app: "com.example.editor",
446
+ target_client_id: "client-b",
447
+ });
448
+
449
+ // Exactly one envelope dispatched, addressed to client-b.
450
+ expect(sentMessages).toHaveLength(1);
451
+ const sent = sentMessages[0] as Record<string, unknown>;
452
+ expect(sent.type).toBe("host_app_control_request");
453
+ expect(sent.targetClientId).toBe("client-b");
454
+
455
+ proxy.resolve(sent.requestId as string, {
456
+ requestId: "ignored-by-proxy",
457
+ state: "running",
458
+ });
459
+ const result = await resultPromise;
460
+ expect(result.isError).toBe(false);
461
+
462
+ proxy.dispose();
463
+ });
464
+ });
465
+
466
+ // -------------------------------------------------------------------------
467
+ // Multi-client ambiguity guard — when the LLM omits target_client_id and
468
+ // multiple same-user host_app_control clients are connected, the resolver
469
+ // must error rather than broadcast (one app-control session per client).
470
+ // -------------------------------------------------------------------------
471
+
472
+ describe("multi-client ambiguity guard", () => {
473
+ test("errors when multiple same-user clients connected and no target_client_id given", async () => {
474
+ mockHubClients = [
475
+ {
476
+ clientId: "client-a",
477
+ capabilities: ["host_app_control"],
478
+ actorPrincipalId: DEFAULT_PRINCIPAL,
479
+ },
480
+ {
481
+ clientId: "client-b",
482
+ capabilities: ["host_app_control"],
483
+ actorPrincipalId: DEFAULT_PRINCIPAL,
484
+ },
485
+ ];
486
+ const proxy = new HostAppControlProxy("conv-1");
487
+ const ctx = buildMockContext(proxy, "conv-1");
488
+ _setActiveAppControlSession({
489
+ conversationId: "conv-1",
490
+ app: "com.example.editor",
491
+ });
492
+
493
+ const result = await surfaceProxyResolver(ctx, "app_control_observe", {
494
+ app: "com.example.editor",
495
+ });
496
+
497
+ expect(result.isError).toBe(true);
498
+ expect(result.content).toContain(
499
+ "multiple clients support host_app_control",
500
+ );
501
+ expect(result.content).toContain("target_client_id");
502
+ // No envelope dispatched.
503
+ expect(sentMessages).toHaveLength(0);
504
+
505
+ proxy.dispose();
506
+ });
507
+
508
+ test("auto-resolves to the unique same-user client when cross-user clients are also present", async () => {
509
+ mockHubClients = [
510
+ {
511
+ clientId: "client-mine",
512
+ capabilities: ["host_app_control"],
513
+ actorPrincipalId: DEFAULT_PRINCIPAL,
514
+ },
515
+ {
516
+ clientId: "client-other",
517
+ capabilities: ["host_app_control"],
518
+ actorPrincipalId: "user-2",
519
+ },
520
+ ];
521
+ const proxy = new HostAppControlProxy("conv-1");
522
+ const ctx = buildMockContext(proxy, "conv-1");
523
+ _setActiveAppControlSession({
524
+ conversationId: "conv-1",
525
+ app: "com.example.editor",
526
+ });
527
+
528
+ const resultPromise = surfaceProxyResolver(ctx, "app_control_observe", {
529
+ app: "com.example.editor",
530
+ });
531
+
532
+ // Resolver must explicitly target the same-user client to prevent the
533
+ // proxy from broadcasting the action across the cross-user client too.
534
+ expect(sentMessages).toHaveLength(1);
535
+ const sent = sentMessages[0] as Record<string, unknown>;
536
+ expect(sent.targetClientId).toBe("client-mine");
537
+
538
+ proxy.resolve(sent.requestId as string, {
539
+ requestId: "ignored-by-proxy",
540
+ state: "running",
541
+ });
542
+ const result = await resultPromise;
543
+ expect(result.isError).toBe(false);
544
+
545
+ proxy.dispose();
546
+ });
547
+
548
+ test("single same-user client with no target proceeds without forcing targetClientId", async () => {
549
+ mockHubClients = [
550
+ {
551
+ clientId: "only-client",
552
+ capabilities: ["host_app_control"],
553
+ actorPrincipalId: DEFAULT_PRINCIPAL,
554
+ },
555
+ ];
556
+ const proxy = new HostAppControlProxy("conv-1");
557
+ const ctx = buildMockContext(proxy, "conv-1");
558
+ _setActiveAppControlSession({
559
+ conversationId: "conv-1",
560
+ app: "com.example.editor",
561
+ });
562
+
563
+ const resultPromise = surfaceProxyResolver(ctx, "app_control_observe", {
564
+ app: "com.example.editor",
565
+ });
566
+
567
+ expect(sentMessages).toHaveLength(1);
568
+ const sent = sentMessages[0] as Record<string, unknown>;
569
+ // No cross-user ambiguity → resolver leaves targetClientId undefined,
570
+ // letting the proxy use its existing single-client routing.
571
+ expect(sent.targetClientId).toBeUndefined();
572
+
573
+ proxy.resolve(sent.requestId as string, {
574
+ requestId: "ignored-by-proxy",
575
+ state: "running",
576
+ });
577
+ const result = await resultPromise;
578
+ expect(result.isError).toBe(false);
579
+
580
+ proxy.dispose();
581
+ });
582
+ });
583
+
584
+ // -------------------------------------------------------------------------
585
+ // Same-user enforcement — even when target_client_id is provided, a
586
+ // cross-user client can never be addressed.
587
+ // -------------------------------------------------------------------------
588
+
589
+ describe("same-user enforcement", () => {
590
+ test("rejects targeted dispatch from a different actor principal", async () => {
591
+ mockHubClients = [
592
+ {
593
+ clientId: "other-user-client",
594
+ capabilities: ["host_app_control"],
595
+ actorPrincipalId: "user-2",
596
+ },
597
+ ];
598
+ const proxy = new HostAppControlProxy("conv-1");
599
+ const ctx = buildMockContext(proxy, "conv-1");
600
+ _setActiveAppControlSession({
601
+ conversationId: "conv-1",
602
+ app: "com.example.editor",
603
+ });
604
+
605
+ const result = await surfaceProxyResolver(ctx, "app_control_observe", {
606
+ app: "com.example.editor",
607
+ target_client_id: "other-user-client",
608
+ });
609
+
610
+ expect(result.isError).toBe(true);
611
+ // No envelope dispatched.
612
+ expect(sentMessages).toHaveLength(0);
613
+
614
+ proxy.dispose();
615
+ });
616
+
617
+ test("rejects when the conversation has no source actor principal", async () => {
618
+ mockHubClients = [
619
+ {
620
+ clientId: "client-a",
621
+ capabilities: ["host_app_control"],
622
+ actorPrincipalId: DEFAULT_PRINCIPAL,
623
+ },
624
+ ];
625
+ const proxy = new HostAppControlProxy("conv-1");
626
+ const ctx = buildMockContext(
627
+ proxy,
628
+ "conv-1",
629
+ undefined,
630
+ /* trustGuardianPrincipalId */ null,
631
+ );
632
+ _setActiveAppControlSession({
633
+ conversationId: "conv-1",
634
+ app: "com.example.editor",
635
+ });
636
+
637
+ const result = await surfaceProxyResolver(ctx, "app_control_observe", {
638
+ app: "com.example.editor",
639
+ target_client_id: "client-a",
640
+ });
641
+
642
+ expect(result.isError).toBe(true);
643
+ expect(sentMessages).toHaveLength(0);
644
+
645
+ proxy.dispose();
646
+ });
647
+ });
328
648
  });
@@ -1,5 +1,14 @@
1
1
  import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test";
2
2
 
3
+ import type { ServerMessage } from "../daemon/message-protocol.js";
4
+
5
+ const realEventHub = await import("../runtime/assistant-event-hub.js");
6
+
7
+ mock.module("../runtime/assistant-event-hub.js", () => ({
8
+ ...realEventHub,
9
+ broadcastMessage: (_msg: ServerMessage) => {},
10
+ }));
11
+
3
12
  // Mock the persistence layer the surface helpers reach into so we can
4
13
  // observe writes without touching SQLite. We swap this out per test by
5
14
  // re-assigning the spies recorded on the closure below.
@@ -29,15 +38,16 @@ const {
29
38
  flushPendingSurfaceDataPersists,
30
39
  createSurfaceMutex,
31
40
  flushSurfaceDataPersist,
41
+ handleSurfaceAction,
32
42
  markSurfaceCompleted,
33
43
  scheduleSurfaceDataPersist,
44
+ showStandaloneSurface,
34
45
  surfaceProxyResolver,
35
46
  } = await import("../daemon/conversation-surfaces.js");
36
47
 
37
48
  import type { SurfaceConversationContext } from "../daemon/conversation-surfaces.js";
38
49
  import type {
39
50
  CardSurfaceData,
40
- ServerMessage,
41
51
  SurfaceData,
42
52
  SurfaceType,
43
53
  } from "../daemon/message-protocol.js";
@@ -60,6 +70,8 @@ function makeContext(sent: ServerMessage[] = []): SurfaceConversationContext {
60
70
  accumulatedSurfaceState: new Map<string, Record<string, unknown>>(),
61
71
  surfaceActionRequestIds: new Set<string>(),
62
72
  currentTurnSurfaces: [],
73
+ pendingStandaloneSurfaces: new Map(),
74
+ recentlyCompletedStandaloneSurfaces: new Map(),
63
75
  isProcessing: () => false,
64
76
  enqueueMessage: () => ({ queued: false, requestId: "req-1" }),
65
77
  getQueueDepth: () => 0,
@@ -402,3 +414,63 @@ describe("ui_surface_update persistence", () => {
402
414
  cancelPendingSurfaceDataPersists("conv-other");
403
415
  });
404
416
  });
417
+
418
+ describe("standalone surface DB persistence", () => {
419
+ let writes: Array<{ id: string; content: unknown }> = [];
420
+
421
+ beforeEach(() => {
422
+ writes = [];
423
+ updateMessageContentSpy = (id: string, content: string) => {
424
+ writes.push({ id, content: JSON.parse(content) });
425
+ };
426
+ getMessagesImpl = () => [];
427
+ cancelPendingSurfaceDataPersists();
428
+ });
429
+
430
+ afterEach(() => {
431
+ cancelPendingSurfaceDataPersists();
432
+ });
433
+
434
+ test("standalone surface action persists completed state to DB", async () => {
435
+ const ctx = makeContext();
436
+ const surfaceId = "standalone-persist-1";
437
+
438
+ seedRows([
439
+ {
440
+ id: "msg-standalone",
441
+ content: [
442
+ { type: "text", text: "confirm this" },
443
+ {
444
+ type: "ui_surface",
445
+ surfaceId,
446
+ surfaceType: "confirmation",
447
+ data: { message: "Proceed?" },
448
+ },
449
+ ],
450
+ },
451
+ ]);
452
+
453
+ const resultPromise = showStandaloneSurface(
454
+ ctx,
455
+ {
456
+ conversationId: "conv-persist-1",
457
+ surfaceType: "confirmation",
458
+ data: { message: "Proceed?" },
459
+ timeoutMs: 60_000,
460
+ },
461
+ surfaceId,
462
+ );
463
+
464
+ await handleSurfaceAction(ctx, surfaceId, "confirm", {});
465
+ const result = await resultPromise;
466
+ expect(result.status).toBe("submitted");
467
+
468
+ expect(writes.length).toBeGreaterThanOrEqual(1);
469
+ const finalBlocks = writes[writes.length - 1].content as Array<
470
+ Record<string, unknown>
471
+ >;
472
+ const surfaceBlock = finalBlocks.find((b) => b.type === "ui_surface")!;
473
+ expect(surfaceBlock.completed).toBe(true);
474
+ expect(surfaceBlock.completionSummary).toBe("Confirmed");
475
+ });
476
+ });
@@ -264,6 +264,65 @@ describe("session-tool-setup app refresh side effects", () => {
264
264
  });
265
265
  });
266
266
 
267
+ test("canonicalizes create_app skill_execute alias before hooks run", async () => {
268
+ const ctx = makeCtx({ allowedToolNames: new Set(["app_create"]) });
269
+ const executor = makeFakeExecutor({
270
+ content: JSON.stringify({ id: "alias-app-1", name: "Alias App" }),
271
+ isError: false,
272
+ });
273
+
274
+ const toolFn = createToolExecutor(
275
+ executor as unknown as ToolExecutor,
276
+ noopPrompter,
277
+ noopSecretPrompter,
278
+ ctx,
279
+ noopLifecycleHandler,
280
+ );
281
+
282
+ await toolFn("skill_execute", {
283
+ tool: "create_app",
284
+ input: { name: "Alias App" },
285
+ activity: "Building app",
286
+ });
287
+
288
+ const calls = executor.execute.mock.calls as unknown[][];
289
+ expect(calls[0][0]).toBe("app_create");
290
+ expect(calls[0][1]).toEqual({ name: "Alias App" });
291
+ expect(broadcastSpy.mock.calls.length).toBeGreaterThanOrEqual(1);
292
+ expect((broadcastSpy.mock.calls as unknown[][])[0][0]).toEqual({
293
+ type: "app_files_changed",
294
+ appId: "alias-app-1",
295
+ });
296
+ });
297
+
298
+ test("preserves exact active create_app skill tool when app_create is also active", async () => {
299
+ const ctx = makeCtx({
300
+ allowedToolNames: new Set(["create_app", "app_create"]),
301
+ });
302
+ const executor = makeFakeExecutor({
303
+ content: JSON.stringify({ id: "custom-app-1", name: "Custom App" }),
304
+ isError: false,
305
+ });
306
+
307
+ const toolFn = createToolExecutor(
308
+ executor as unknown as ToolExecutor,
309
+ noopPrompter,
310
+ noopSecretPrompter,
311
+ ctx,
312
+ noopLifecycleHandler,
313
+ );
314
+
315
+ await toolFn("skill_execute", {
316
+ tool: "create_app",
317
+ input: { name: "Custom App" },
318
+ activity: "Running custom app tool",
319
+ });
320
+
321
+ const calls = executor.execute.mock.calls as unknown[][];
322
+ expect(calls[0][0]).toBe("create_app");
323
+ expect(broadcastSpy).not.toHaveBeenCalled();
324
+ });
325
+
267
326
  test("skips side effects when app_create result is an error", async () => {
268
327
  const ctx = makeCtx();
269
328
  const executor = makeFakeExecutor({ content: "Error", isError: true });
@@ -1,14 +1,8 @@
1
1
  import { beforeEach, describe, expect, mock, test } from "bun:test";
2
2
 
3
3
  import type { AgentEvent } from "../agent/loop.js";
4
- import { _setOverridesForTesting } from "../config/assistant-feature-flags.js";
5
4
  import type { Message, ProviderResponse } from "../providers/types.js";
6
5
 
7
- // This test exercises v1 conversation routing. The `memory-v2-enabled` flag
8
- // (registry default `true`) flips memory routing to v2 — disable it here so
9
- // the v1 paths under test stay active.
10
- _setOverridesForTesting({ "memory-v2-enabled": false });
11
-
12
6
  // ---------------------------------------------------------------------------
13
7
  // Track agent loop calls
14
8
  // ---------------------------------------------------------------------------
@@ -69,7 +63,7 @@ mock.module("../config/loader.js", () => ({
69
63
  pricingOverrides: [],
70
64
  },
71
65
  rateLimit: { maxRequestsPerMinute: 0 },
72
- memory: { enabled: false },
66
+ memory: { enabled: false, v2: { enabled: false } },
73
67
  daemon: {
74
68
  startupSocketWaitMs: 5000,
75
69
  stopTimeoutMs: 5000,
@@ -1,14 +1,8 @@
1
1
  import { beforeEach, describe, expect, mock, test } from "bun:test";
2
2
 
3
3
  import type { AgentEvent } from "../agent/loop.js";
4
- import { _setOverridesForTesting } from "../config/assistant-feature-flags.js";
5
4
  import type { Message, ProviderResponse } from "../providers/types.js";
6
5
 
7
- // This test exercises v1 conversation routing. The `memory-v2-enabled` flag
8
- // (registry default `true`) flips memory routing to v2 — disable it here so
9
- // the v1 paths under test stay active.
10
- _setOverridesForTesting({ "memory-v2-enabled": false });
11
-
12
6
  // ---------------------------------------------------------------------------
13
7
  // Configurable agent loop behavior
14
8
  // ---------------------------------------------------------------------------
@@ -67,7 +61,7 @@ mock.module("../config/loader.js", () => ({
67
61
  pricingOverrides: [],
68
62
  },
69
63
  rateLimit: { maxRequestsPerMinute: 0 },
70
- memory: { enabled: false },
64
+ memory: { enabled: false, v2: { enabled: false } },
71
65
  daemon: {
72
66
  startupSocketWaitMs: 5000,
73
67
  stopTimeoutMs: 5000,
@@ -208,9 +208,11 @@ describe("Invariant 2: no generic plaintext secret read API", () => {
208
208
  "config/bundled-skills/image-studio/tools/media-generate-image.ts", // image generation tool API key lookup
209
209
  "config/bundled-skills/media-processing/tools/analyze-keyframes.ts", // keyframe analysis tool API key lookup
210
210
  "providers/registry.ts", // provider registry API key lookup for initialization
211
+ "providers/inference/resolve-auth.ts", // provider_connection auth resolver (api_key path reads vault, mirrors registry.ts)
211
212
  "providers/provider-availability.ts", // provider availability API key check
212
213
  "media/image-credentials.ts", // shared image-gen credential resolver (provider API key lookup)
213
214
  "memory/embedding-backend.ts", // embedding backend API key lookup
215
+ "memory/llm-request-log-source-clickhouse.ts", // ClickHouse read source — lazy lookup of clickhouse:url + clickhouse:password + vellum:platform_assistant_id for self-scoped mirror reads
214
216
  "daemon/providers-setup.ts", // provider initialization API key lookup
215
217
  "workspace/migrations/006-services-config.ts", // services config migration reads provider API keys
216
218
  "workspace/migrations/018-rekey-compound-credential-keys.ts", // re-key compound credential storage keys
@@ -220,22 +222,19 @@ describe("Invariant 2: no generic plaintext secret read API", () => {
220
222
  "daemon/lifecycle.ts", // CES client injection into secure-keys at startup
221
223
  "daemon/daemon-skill-host.ts", // SkillHost secureKeys facet adapter (delegates to getProviderKeyAsync)
222
224
  "runtime/routes/credential-prompt-routes.ts", // Route for secure credential prompt (stores secret via setSecureKeyAsync)
225
+ "runtime/routes/credential-routes.ts", // CLI credential management routes (CLI-migrated to IPC)
226
+ "runtime/routes/platform-routes.ts", // CLI platform connect/disconnect/status routes (CLI-migrated to IPC)
223
227
  "ipc/skill-routes/providers.ts", // host.providers.secureKeys.getProviderKey IPC route (out-of-process SkillHost companion)
224
228
  "daemon/external-plugins-bootstrap.ts", // reads credentials at plugin init (manifest.requiresCredential) via the CES-mediated getSecureKeyAsync path
225
229
  "inbound/platform-callback-registration.ts", // managed credential lookup for platform base URL, assistant ID, and API key
226
230
  "tts/providers/elevenlabs-provider.ts", // ElevenLabs TTS API key lookup
227
231
  "tts/providers/deepgram-provider.ts", // Deepgram TTS API key lookup
228
232
  "tts/providers/xai-provider.ts", // xAI TTS API key lookup
229
- "meet/session-manager.ts", // Meet bot container provisioning (provider API key lookup for Deepgram/TTS)
230
233
  "credential-health/credential-health-service.ts", // credential health check reads access tokens for liveness pings
231
234
  "ipc/skill-routes/providers.ts", // skill IPC route exposes provider key lookup to hosted skills
232
- "cli/commands/avatar.ts", // CLI avatar command credential lookup
233
- "cli/commands/credentials.ts", // CLI credential management commands
235
+ "runtime/routes/avatar-routes.ts", // avatar generate route reads platform_base_url from credential store
234
236
  "cli/commands/keys.ts", // CLI provider key management
235
237
  "cli/commands/oauth/connect.ts", // CLI OAuth connect stored-secret verification
236
- "cli/commands/platform/connect.ts", // CLI platform connect credential check
237
- "cli/commands/platform/disconnect.ts", // CLI platform disconnect credential lookup
238
- "cli/commands/platform/index.ts", // CLI platform status credential check
239
238
  ]);
240
239
 
241
240
  const thisDir = dirname(fileURLToPath(import.meta.url));