@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
@@ -1,101 +1,93 @@
1
1
  import type { Command } from "commander";
2
2
 
3
- import { getConfig } from "../../config/loader.js";
4
- import { shouldAutoStartDaemon } from "../../daemon/connection-policy.js";
5
- import { ensureDaemonRunning } from "../../daemon/daemon-control.js";
6
- import { formatJson, formatMarkdown } from "../../export/formatter.js";
7
- import { cliIpcCall } from "../../ipc/cli-client.js";
8
- import {
9
- clearAll as clearAllConversations,
10
- countConversationsByScheduleJobId,
11
- createConversation,
12
- getConversation,
13
- getMessages,
14
- wipeConversation,
15
- } from "../../memory/conversation-crud.js";
16
- import { listConversations } from "../../memory/conversation-queries.js";
17
- import { getDb } from "../../memory/db-connection.js";
18
- import { selectEmbeddingBackend } from "../../memory/embedding-backend.js";
19
- import { enqueueMemoryJob } from "../../memory/jobs-store.js";
20
- import {
21
- initQdrantClient,
22
- resolveQdrantUrl,
23
- } from "../../memory/qdrant-client.js";
24
- import { deleteSchedule } from "../../schedule/schedule-store.js";
25
- import { timeAgo } from "../../util/time.js";
3
+ import { cliIpcCall, exitFromIpcResult } from "../../ipc/cli-client.js";
4
+ import { registerCommand } from "../lib/register-command.js";
5
+ import { timeAgo } from "../lib/time-ago.js";
26
6
  import { log } from "../logger.js";
27
7
  import { registerConversationsDeferCommand } from "./conversations-defer.js";
28
8
  import { registerConversationsImportCommand } from "./conversations-import.js";
29
9
 
30
10
  export function registerConversationsCommand(program: Command): void {
31
- const conversations = program
32
- .command("conversations")
33
- .description("Manage conversations");
34
-
35
- registerConversationsImportCommand(conversations);
36
- registerConversationsDeferCommand(conversations);
37
-
38
- conversations.addHelpText(
39
- "after",
40
- `
11
+ registerCommand(program, {
12
+ name: "conversations",
13
+ transport: "ipc",
14
+ description: "Manage conversations",
15
+ build: (conversations) => {
16
+ registerConversationsImportCommand(conversations);
17
+ registerConversationsDeferCommand(conversations);
18
+
19
+ conversations.addHelpText(
20
+ "after",
21
+ `
41
22
  Conversations with the assistant. Each conversation has a unique ID and a
42
- title. The assistant must be running for "new" (it communicates via the HTTP
43
- API), while "list", "export", and "clear" operate on the local SQLite database
44
- directly.
23
+ title. All subcommands communicate via IPC and require the assistant to be
24
+ running.
45
25
 
46
26
  Examples:
47
27
  $ assistant conversations list
48
28
  $ assistant conversations new "Project planning"
49
29
  $ assistant conversations export
50
30
  $ assistant conversations clear`,
51
- );
52
-
53
- conversations
54
- .command("list")
55
- .description("List conversations (excludes archived by default)")
56
- .option(
57
- "--include-archived",
58
- "Include archived conversations in the output",
59
- )
60
- .addHelpText(
61
- "after",
62
- `
31
+ );
32
+
33
+ // -------------------------------------------------------------------
34
+ // list
35
+ // -------------------------------------------------------------------
36
+
37
+ conversations
38
+ .command("list")
39
+ .description("List conversations (excludes archived by default)")
40
+ .option(
41
+ "--include-archived",
42
+ "Include archived conversations in the output",
43
+ )
44
+ .addHelpText(
45
+ "after",
46
+ `
63
47
  Shows conversations with their ID, title, and a relative timestamp (e.g.
64
48
  "3 hours ago"). Conversations are listed in order of most recently updated.
65
49
  Archived conversations are excluded by default; pass --include-archived to
66
50
  include them.
67
51
 
68
- Operates on the local SQLite database directly — does not require the assistant.
69
-
70
52
  Examples:
71
53
  $ assistant conversations list
72
54
  $ assistant conversations list --include-archived`,
73
- )
74
- .action(async (opts?: { includeArchived?: boolean }) => {
75
- getDb();
76
- const all = listConversations(
77
- Number.MAX_SAFE_INTEGER,
78
- false,
79
- 0,
80
- opts?.includeArchived ?? false,
81
- );
82
- if (all.length === 0) {
83
- log.info("No conversations");
84
- } else {
85
- for (const s of all) {
86
- log.info(
87
- ` ${s.id} ${s.title ?? "Untitled"} ${timeAgo(s.updatedAt)}`,
88
- );
89
- }
90
- }
91
- });
92
-
93
- conversations
94
- .command("new [title]")
95
- .description("Create a new conversation")
96
- .addHelpText(
97
- "after",
98
- `
55
+ )
56
+ .action(async (opts?: { includeArchived?: boolean }) => {
57
+ const result = await cliIpcCall<{
58
+ conversations: Array<{
59
+ id: string;
60
+ title: string | null;
61
+ updatedAt: number;
62
+ }>;
63
+ }>("conversation_list_cli", {
64
+ body: { includeArchived: opts?.includeArchived ?? false },
65
+ });
66
+
67
+ if (!result.ok) return exitFromIpcResult(result);
68
+
69
+ const all = result.result!.conversations;
70
+ if (all.length === 0) {
71
+ log.info("No conversations");
72
+ } else {
73
+ for (const s of all) {
74
+ log.info(
75
+ ` ${s.id} ${s.title ?? "Untitled"} ${timeAgo(s.updatedAt)}`,
76
+ );
77
+ }
78
+ }
79
+ });
80
+
81
+ // -------------------------------------------------------------------
82
+ // new
83
+ // -------------------------------------------------------------------
84
+
85
+ conversations
86
+ .command("new [title]")
87
+ .description("Create a new conversation")
88
+ .addHelpText(
89
+ "after",
90
+ `
99
91
  Arguments:
100
92
  title Optional conversation title (string). If omitted, a default title is
101
93
  assigned by the assistant.
@@ -106,22 +98,31 @@ Examples:
106
98
  $ assistant conversations new
107
99
  $ assistant conversations new "Project planning"
108
100
  $ assistant conversations new "Bug triage 2026-03-05"`,
109
- )
110
- .action(async (title?: string) => {
111
- if (shouldAutoStartDaemon()) await ensureDaemonRunning();
112
- getDb();
113
- const conversation = createConversation(title);
114
- log.info(
115
- `Created conversation: ${conversation.title ?? "New Conversation"} (${conversation.id})`,
116
- );
117
- });
118
-
119
- conversations
120
- .command("rename <conversationId> <title>")
121
- .description("Rename a conversation")
122
- .addHelpText(
123
- "after",
124
- `
101
+ )
102
+ .action(async (title?: string) => {
103
+ const result = await cliIpcCall<{ id: string; title: string }>(
104
+ "conversation_create_cli",
105
+ { body: { title } },
106
+ );
107
+
108
+ if (!result.ok) return exitFromIpcResult(result);
109
+
110
+ const conversation = result.result!;
111
+ log.info(
112
+ `Created conversation: ${conversation.title} (${conversation.id})`,
113
+ );
114
+ });
115
+
116
+ // -------------------------------------------------------------------
117
+ // rename
118
+ // -------------------------------------------------------------------
119
+
120
+ conversations
121
+ .command("rename <conversationId> <title>")
122
+ .description("Rename a conversation")
123
+ .addHelpText(
124
+ "after",
125
+ `
125
126
  Arguments:
126
127
  conversationId Conversation ID (or unique prefix). Supports prefix matching.
127
128
  Run 'assistant conversations list' to find IDs.
@@ -134,47 +135,53 @@ Renames the conversation to the given title and marks it as a manual rename
134
135
  Examples:
135
136
  $ assistant conversations rename abc123 "Project planning"
136
137
  $ assistant conversations rename abc123 "Bug triage 2026-04-22"`,
137
- )
138
- .action(async (conversationId: string, title: string) => {
139
- const trimmedTitle = title.trim();
140
- if (!trimmedTitle) {
141
- log.error("Error: title must be a non-empty string");
142
- process.exit(1);
143
- }
144
-
145
- const ipcResult = await cliIpcCall<{ ok: boolean; error?: string }>(
146
- "rename_conversation",
147
- {
148
- body: { conversationId, title: trimmedTitle },
149
- },
150
- );
138
+ )
139
+ .action(async (conversationId: string, title: string) => {
140
+ const trimmedTitle = title.trim();
141
+ if (!trimmedTitle) {
142
+ log.error("Error: title must be a non-empty string");
143
+ process.exit(1);
144
+ }
151
145
 
152
- if (!ipcResult.ok) {
153
- log.error(
154
- `Rename failed: ${ipcResult.error}. Run 'assistant conversations list' to verify the conversation exists.`,
155
- );
156
- process.exit(1);
157
- }
146
+ const ipcResult = await cliIpcCall<{ ok: boolean; error?: string }>(
147
+ "rename_conversation",
148
+ {
149
+ body: { conversationId, title: trimmedTitle },
150
+ },
151
+ );
158
152
 
159
- const result = ipcResult.result!;
160
- if (!result.ok) {
161
- log.error(
162
- `Rename failed: ${result.error}. Run 'assistant conversations list' to see available conversations.`,
163
- );
164
- process.exit(1);
165
- }
166
-
167
- log.info(`Renamed conversation to "${trimmedTitle}" (${conversationId})`);
168
- });
169
-
170
- conversations
171
- .command("export [conversationId]")
172
- .description("Export a conversation as markdown or JSON")
173
- .option("-f, --format <format>", "Output format: md or json", "md")
174
- .option("-o, --output <file>", "Write to file instead of stdout")
175
- .addHelpText(
176
- "after",
177
- `
153
+ if (!ipcResult.ok) {
154
+ log.error(
155
+ `Rename failed: ${ipcResult.error}. Run 'assistant conversations list' to verify the conversation exists.`,
156
+ );
157
+ process.exit(1);
158
+ }
159
+
160
+ const result = ipcResult.result!;
161
+ if (!result.ok) {
162
+ log.error(
163
+ `Rename failed: ${result.error}. Run 'assistant conversations list' to see available conversations.`,
164
+ );
165
+ process.exit(1);
166
+ }
167
+
168
+ log.info(
169
+ `Renamed conversation to "${trimmedTitle}" (${conversationId})`,
170
+ );
171
+ });
172
+
173
+ // -------------------------------------------------------------------
174
+ // export
175
+ // -------------------------------------------------------------------
176
+
177
+ conversations
178
+ .command("export [conversationId]")
179
+ .description("Export a conversation as markdown or JSON")
180
+ .option("-f, --format <format>", "Output format: md or json", "md")
181
+ .option("-o, --output <file>", "Write to file instead of stdout")
182
+ .addHelpText(
183
+ "after",
184
+ `
178
185
  Arguments:
179
186
  conversationId Optional conversation ID (or unique prefix). Defaults to the
180
187
  most recent conversation. Supports prefix matching — e.g.
@@ -187,152 +194,108 @@ Two output formats are available:
187
194
  json Structured JSON export with full metadata, message content arrays,
188
195
  and timestamps.
189
196
 
190
- Operates on the local SQLite database directly — does not require the assistant.
191
-
192
197
  Examples:
193
198
  $ assistant conversations export
194
199
  $ assistant conversations export --format json -o conversation.json
195
200
  $ assistant conversations export abc123 --format md`,
196
- )
197
- .action(
198
- async (
199
- conversationId?: string,
200
- opts?: { format: string; output?: string },
201
- ) => {
202
- getDb();
203
- const format = opts?.format ?? "md";
204
- if (format !== "md" && format !== "json") {
205
- log.error('Error: format must be "md" or "json"');
206
- process.exit(1);
207
- }
208
-
209
- let id = conversationId;
210
- if (!id) {
211
- const all = listConversations(1);
212
- if (all.length === 0) {
213
- log.error("No conversations found");
214
- process.exit(1);
215
- }
216
- id = all[0].id;
217
- }
218
-
219
- // Support prefix matching for conversation IDs
220
- let conversation = getConversation(id);
221
- if (!conversation) {
222
- const all = listConversations(Number.MAX_SAFE_INTEGER);
223
- const match = all.find((c) => c.id.startsWith(id!));
224
- if (match) {
225
- conversation = match;
226
- } else {
227
- log.error(`Conversation not found: ${id}`);
228
- process.exit(1);
229
- }
230
- }
231
-
232
- const msgs = getMessages(conversation.id);
233
- const exportData = {
234
- ...conversation,
235
- messages: msgs.map((m) => ({
236
- role: m.role,
237
- content: JSON.parse(m.content),
238
- createdAt: m.createdAt,
239
- })),
240
- };
241
-
242
- const output =
243
- format === "json"
244
- ? formatJson(exportData)
245
- : formatMarkdown(exportData);
246
-
247
- if (opts?.output) {
248
- const { writeFileSync } = await import("node:fs");
249
- writeFileSync(opts.output, output);
250
- log.info(`Exported to ${opts.output}`);
251
- } else {
252
- process.stdout.write(output);
253
- }
254
- },
255
- );
256
-
257
- conversations
258
- .command("clear")
259
- .description(
260
- "Clear all conversations, messages, and vector data (dev only)",
261
- )
262
- .addHelpText(
263
- "after",
264
- `
265
- Permanently deletes ALL conversations, messages, and Qdrant vector data.
266
- Prompts for confirmation (y/N) before proceeding. After clearing the local
267
- database, the running assistant (if any) will pick up the changes on the next
268
- request.
269
-
270
- Operates on the local SQLite database and Qdrant directly — does not require
271
- the assistant.
201
+ )
202
+ .action(
203
+ async (
204
+ conversationId?: string,
205
+ opts?: { format: string; output?: string },
206
+ ) => {
207
+ const format = opts?.format ?? "md";
208
+ if (format !== "md" && format !== "json") {
209
+ log.error('Error: format must be "md" or "json"');
210
+ process.exit(1);
211
+ }
212
+
213
+ const result = await cliIpcCall<{
214
+ output: string;
215
+ conversationId: string;
216
+ }>("conversation_export_cli", {
217
+ body: { conversationId, format },
218
+ });
219
+
220
+ if (!result.ok) return exitFromIpcResult(result);
221
+
222
+ const exported = result.result!;
223
+
224
+ if (opts?.output) {
225
+ const { writeFileSync } = await import("node:fs");
226
+ writeFileSync(opts.output, exported.output);
227
+ log.info(`Exported to ${opts.output}`);
228
+ } else {
229
+ process.stdout.write(exported.output);
230
+ }
231
+ },
232
+ );
233
+
234
+ // -------------------------------------------------------------------
235
+ // clear
236
+ // -------------------------------------------------------------------
237
+
238
+ conversations
239
+ .command("clear")
240
+ .description(
241
+ "Clear all conversations, messages, and vector data (dev only)",
242
+ )
243
+ .addHelpText(
244
+ "after",
245
+ `
246
+ Permanently deletes ALL conversations, messages, and associated data.
247
+ Prompts for confirmation (y/N) before proceeding.
248
+
249
+ Requires the assistant to be running. Communicates via IPC socket.
272
250
 
273
251
  Intended for development use. This action cannot be undone.
274
252
 
275
253
  Examples:
276
254
  $ assistant conversations clear`,
277
- )
278
- .action(async () => {
279
- log.info(
280
- "This will permanently delete all conversations, messages, and vector data.",
281
- );
255
+ )
256
+ .action(async () => {
257
+ log.info(
258
+ "This will permanently delete all conversations, messages, and vector data.",
259
+ );
282
260
 
283
- const readline = await import("node:readline");
284
- const rl = readline.createInterface({
285
- input: process.stdin,
286
- output: process.stdout,
287
- });
288
- const answer = await new Promise<string>((resolve) => {
289
- rl.question("Are you sure? (y/N) ", resolve);
290
- });
291
- rl.close();
292
- if (answer.toLowerCase() !== "y") {
293
- log.info("Cancelled");
294
- return;
295
- }
296
-
297
- getDb();
298
- const result = clearAllConversations();
299
- log.info(
300
- `Cleared ${result.conversations} conversations, ${result.messages} messages`,
301
- );
261
+ const readline = await import("node:readline");
262
+ const rl = readline.createInterface({
263
+ input: process.stdin,
264
+ output: process.stdout,
265
+ });
266
+ const answer = await new Promise<string>((resolve) => {
267
+ rl.question("Are you sure? (y/N) ", resolve);
268
+ });
269
+ rl.close();
270
+ if (answer.toLowerCase() !== "y") {
271
+ log.info("Cancelled");
272
+ return;
273
+ }
302
274
 
303
- const config = getConfig();
304
- const qdrantUrl = resolveQdrantUrl(config);
305
- const embeddingSelection = await selectEmbeddingBackend(config);
306
- const embeddingModel = embeddingSelection.backend
307
- ? `${embeddingSelection.backend.provider}:${embeddingSelection.backend.model}`
308
- : undefined;
309
- const qdrant = initQdrantClient({
310
- url: qdrantUrl,
311
- collection: config.memory.qdrant.collection,
312
- vectorSize: config.memory.qdrant.vectorSize,
313
- onDisk: config.memory.qdrant.onDisk,
314
- quantization: config.memory.qdrant.quantization,
315
- embeddingModel,
316
- });
317
- const deleted = await qdrant.deleteCollection();
318
- if (deleted) {
319
- log.info(
320
- `Deleted Qdrant collection "${config.memory.qdrant.collection}"`,
321
- );
322
- } else {
323
- log.info("Qdrant collection not found or not reachable (skipped)");
324
- }
325
-
326
- log.info("Done.");
327
- });
328
-
329
- conversations
330
- .command("wipe <conversationId>")
331
- .description("Wipe a conversation and revert all memory changes it made")
332
- .option("-y, --yes", "Skip confirmation prompt")
333
- .addHelpText(
334
- "after",
335
- `
275
+ const result = await cliIpcCall<{ cleared: number }>(
276
+ "conversations_clear_cli",
277
+ );
278
+
279
+ if (!result.ok) return exitFromIpcResult(result);
280
+
281
+ log.info(
282
+ `Cleared ${result.result!.cleared} conversations. Done.`,
283
+ );
284
+ });
285
+
286
+ // -------------------------------------------------------------------
287
+ // wipe
288
+ // -------------------------------------------------------------------
289
+
290
+ conversations
291
+ .command("wipe <conversationId>")
292
+ .description(
293
+ "Wipe a conversation and revert all memory changes it made",
294
+ )
295
+ .option("-y, --yes", "Skip confirmation prompt")
296
+ .addHelpText(
297
+ "after",
298
+ `
336
299
  Arguments:
337
300
  conversationId Conversation ID (or unique prefix). Supports prefix matching.
338
301
  Run 'assistant conversations list' to find IDs.
@@ -344,121 +307,69 @@ pending memory jobs. This action cannot be undone.
344
307
  Examples:
345
308
  $ assistant conversations wipe abc123
346
309
  $ assistant conversations wipe abc123 --yes`,
347
- )
348
- .action(async (conversationId: string, opts?: { yes?: boolean }) => {
349
- getDb();
350
-
351
- // Resolve conversation with prefix matching (same pattern as `export`)
352
- let conversation = getConversation(conversationId);
353
- if (!conversation) {
354
- const all = listConversations(Number.MAX_SAFE_INTEGER);
355
- const match = all.find((c) => c.id.startsWith(conversationId));
356
- if (match) {
357
- conversation = match;
358
- } else {
359
- log.error(`Conversation not found: ${conversationId}`);
360
- process.exit(1);
361
- }
362
- }
363
-
364
- if (!opts?.yes) {
365
- const readline = await import("node:readline");
366
- const rl = readline.createInterface({
367
- input: process.stdin,
368
- output: process.stdout,
369
- });
370
- const answer = await new Promise<string>((resolve) => {
371
- rl.question(
372
- `Wipe conversation "${conversation!.title ?? "Untitled"}" and revert all memory changes? (y/N) `,
373
- resolve,
310
+ )
311
+ .action(async (conversationId: string, opts?: { yes?: boolean }) => {
312
+ if (!opts?.yes) {
313
+ const readline = await import("node:readline");
314
+ const rl = readline.createInterface({
315
+ input: process.stdin,
316
+ output: process.stdout,
317
+ });
318
+ const answer = await new Promise<string>((resolve) => {
319
+ rl.question(
320
+ `Wipe conversation "${conversationId}" and revert all memory changes? (y/N) `,
321
+ resolve,
322
+ );
323
+ });
324
+ rl.close();
325
+ if (answer.toLowerCase() !== "y") {
326
+ log.info("Cancelled");
327
+ return;
328
+ }
329
+ }
330
+
331
+ const ipcResult = await cliIpcCall<{
332
+ wiped: boolean;
333
+ unsupersededItems: number;
334
+ deletedSummaries: number;
335
+ cancelledJobs: number;
336
+ }>("wipe_conversation", {
337
+ body: { conversationId },
338
+ });
339
+
340
+ if (!ipcResult.ok) return exitFromIpcResult(ipcResult);
341
+
342
+ const result = ipcResult.result!;
343
+ log.info(
344
+ `Wiped conversation. ` +
345
+ `Restored ${result.unsupersededItems} memory items, ` +
346
+ `deleted ${result.deletedSummaries} summaries, ` +
347
+ `cancelled ${result.cancelledJobs} jobs.`,
374
348
  );
375
349
  });
376
- rl.close();
377
- if (answer.toLowerCase() !== "y") {
378
- log.info("Cancelled");
379
- return;
380
- }
381
- }
382
-
383
- // When the assistant daemon is running, delegate via CLI IPC so it
384
- // tears down in-memory conversation state before deleting DB rows.
385
- const ipcWipe = await cliIpcCall<{
386
- wiped: boolean;
387
- unsupersededItems: number;
388
- deletedSummaries: number;
389
- cancelledJobs: number;
390
- }>("wipe_conversation", { body: { conversationId: conversation.id } });
391
- if (ipcWipe.ok && ipcWipe.result) {
392
- log.info(
393
- `Wiped conversation "${conversation.title ?? "Untitled"}". ` +
394
- `Restored ${ipcWipe.result.unsupersededItems} memory items, ` +
395
- `deleted ${ipcWipe.result.deletedSummaries} summaries, ` +
396
- `cancelled ${ipcWipe.result.cancelledJobs} jobs.`,
397
- );
398
- return;
399
- }
400
- if (
401
- ipcWipe.ok === false &&
402
- ipcWipe.error &&
403
- ipcWipe.error !==
404
- "Could not connect to assistant daemon. Is it running?"
405
- ) {
406
- log.error(`Daemon wipe failed: ${ipcWipe.error}`);
407
- process.exitCode = 1;
408
- return;
409
- }
410
-
411
- // Daemon not reachable — safe to wipe directly (no in-memory state).
412
- // Cancel the associated schedule job (if any) before wiping —
413
- // but only when this is the last conversation referencing it.
414
- if (
415
- conversation.scheduleJobId &&
416
- countConversationsByScheduleJobId(conversation.scheduleJobId) <= 1
417
- ) {
418
- deleteSchedule(conversation.scheduleJobId);
419
- }
420
-
421
- const result = wipeConversation(conversation.id);
422
-
423
- // Enqueue Qdrant cleanup
424
- for (const segId of result.segmentIds) {
425
- enqueueMemoryJob("delete_qdrant_vectors", {
426
- targetType: "segment",
427
- targetId: segId,
428
- });
429
- }
430
- for (const summaryId of result.deletedSummaryIds) {
431
- enqueueMemoryJob("delete_qdrant_vectors", {
432
- targetType: "summary",
433
- targetId: summaryId,
434
- });
435
- }
436
350
 
437
- log.info(
438
- `Wiped conversation "${conversation.title ?? "Untitled"}". ` +
439
- `Deleted ${result.deletedSummaryIds.length} summaries, ` +
440
- `cancelled ${result.cancelledJobCount} jobs.`,
441
- );
442
- });
443
-
444
- conversations
445
- .command("wake <conversationId>")
446
- .description(
447
- "Wake the agent on an existing conversation with an internal hint",
448
- )
449
- .requiredOption(
450
- "--hint <text>",
451
- "Hint message visible to the LLM (not persisted to transcript)",
452
- )
453
- .option(
454
- "--source <label>",
455
- "Source label for logging (e.g. github-notification)",
456
- "cli",
457
- )
458
- .option("--json", "Output result as JSON")
459
- .addHelpText(
460
- "after",
461
- `
351
+ // -------------------------------------------------------------------
352
+ // wake
353
+ // -------------------------------------------------------------------
354
+
355
+ conversations
356
+ .command("wake <conversationId>")
357
+ .description(
358
+ "Wake the agent on an existing conversation with an internal hint",
359
+ )
360
+ .requiredOption(
361
+ "--hint <text>",
362
+ "Hint message visible to the LLM (not persisted to transcript)",
363
+ )
364
+ .option(
365
+ "--source <label>",
366
+ "Source label for logging (e.g. github-notification)",
367
+ "cli",
368
+ )
369
+ .option("--json", "Output result as JSON")
370
+ .addHelpText(
371
+ "after",
372
+ `
462
373
  Arguments:
463
374
  conversationId Conversation ID to wake.
464
375
 
@@ -474,63 +385,62 @@ Examples:
474
385
  $ assistant conversations wake abc123 --hint "PR #25933 received a review requesting changes"
475
386
  $ assistant conversations wake abc123 --hint "CI failed on commit abc" --source github-ci
476
387
  $ assistant conversations wake abc123 --hint "New Slack DM from Vargas" --source slack --json`,
477
- )
478
- .action(
479
- async (
480
- conversationId: string,
481
- opts: { hint: string; source: string; json?: boolean },
482
- ) => {
483
- const result = await cliIpcCall<{
484
- invoked: boolean;
485
- producedToolCalls: boolean;
486
- reason?: "not_found" | "archived" | "timeout" | "no_resolver";
487
- }>("wake_conversation", {
488
- body: {
489
- conversationId,
490
- hint: opts.hint,
491
- source: opts.source,
388
+ )
389
+ .action(
390
+ async (
391
+ conversationId: string,
392
+ opts: { hint: string; source: string; json?: boolean },
393
+ ) => {
394
+ const result = await cliIpcCall<{
395
+ invoked: boolean;
396
+ producedToolCalls: boolean;
397
+ reason?: "not_found" | "archived" | "timeout" | "no_resolver";
398
+ }>("wake_conversation", {
399
+ body: {
400
+ conversationId,
401
+ hint: opts.hint,
402
+ source: opts.source,
403
+ },
404
+ });
405
+
406
+ if (!result.ok) {
407
+ if (opts.json) {
408
+ log.info(JSON.stringify({ ok: false, error: result.error }));
409
+ } else {
410
+ log.error(`Error: ${result.error}`);
411
+ }
412
+ process.exitCode = 1;
413
+ return;
414
+ }
415
+
416
+ const wake = result.result!;
417
+ if (opts.json) {
418
+ log.info(JSON.stringify({ ok: true, ...wake }));
419
+ return;
420
+ }
421
+ if (wake.invoked) {
422
+ log.info(
423
+ wake.producedToolCalls
424
+ ? `Wake produced output on conversation ${conversationId}`
425
+ : `Wake invoked on ${conversationId} (no output produced)`,
426
+ );
427
+ } else if (wake.reason === "timeout") {
428
+ log.info(
429
+ `Conversation ${conversationId} is busy — wake skipped (retry later)`,
430
+ );
431
+ } else if (wake.reason === "archived") {
432
+ log.error(
433
+ `Could not wake conversation ${conversationId} — conversation is archived`,
434
+ );
435
+ process.exitCode = 1;
436
+ } else {
437
+ log.error(
438
+ `Could not wake conversation ${conversationId} — conversation not found`,
439
+ );
440
+ process.exitCode = 1;
441
+ }
492
442
  },
493
- });
494
-
495
- if (!result.ok) {
496
- if (opts.json) {
497
- log.info(JSON.stringify({ ok: false, error: result.error }));
498
- } else {
499
- log.error(`Error: ${result.error}`);
500
- }
501
- process.exitCode = 1;
502
- return;
503
- }
504
-
505
- const wake = result.result!;
506
- if (opts.json) {
507
- log.info(JSON.stringify({ ok: true, ...wake }));
508
- return;
509
- }
510
- if (wake.invoked) {
511
- log.info(
512
- wake.producedToolCalls
513
- ? `Wake produced output on conversation ${conversationId}`
514
- : `Wake invoked on ${conversationId} (no output produced)`,
515
- );
516
- } else if (wake.reason === "timeout") {
517
- // Conversation exists but stayed busy past the wait-until-idle
518
- // window. This is a transient condition, not an error — the
519
- // caller can retry later. Exit 0.
520
- log.info(
521
- `Conversation ${conversationId} is busy — wake skipped (retry later)`,
522
- );
523
- } else if (wake.reason === "archived") {
524
- log.error(
525
- `Could not wake conversation ${conversationId} — conversation is archived`,
526
- );
527
- process.exitCode = 1;
528
- } else {
529
- log.error(
530
- `Could not wake conversation ${conversationId} — conversation not found`,
531
- );
532
- process.exitCode = 1;
533
- }
534
- },
535
- );
443
+ );
444
+ },
445
+ });
536
446
  }