@vellumai/assistant 0.7.0 → 0.7.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 (666) hide show
  1. package/ARCHITECTURE.md +6 -7
  2. package/Dockerfile +1 -0
  3. package/README.md +2 -2
  4. package/__tests__/permissions/gateway-threshold-reader.test.ts +79 -139
  5. package/bun.lock +3 -0
  6. package/docs/architecture/security.md +18 -16
  7. package/knip.json +1 -0
  8. package/node_modules/@vellumai/skill-host-contracts/__tests__/client.test.ts +1 -5
  9. package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +0 -5
  10. package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -16
  11. package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +1 -9
  12. package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +12 -12
  13. package/node_modules/@vellumai/slack-text/bun.lock +24 -0
  14. package/node_modules/@vellumai/slack-text/package.json +18 -0
  15. package/node_modules/@vellumai/slack-text/src/index.test.ts +153 -0
  16. package/node_modules/@vellumai/slack-text/src/index.ts +235 -0
  17. package/node_modules/@vellumai/slack-text/tsconfig.json +20 -0
  18. package/openapi.yaml +294 -107
  19. package/package.json +4 -2
  20. package/scripts/generate-openapi.ts +16 -111
  21. package/src/__tests__/agent-wake-override-profile.test.ts +23 -1
  22. package/src/__tests__/anthropic-provider.test.ts +56 -13
  23. package/src/__tests__/app-conversation-ids-backfill.test.ts +278 -0
  24. package/src/__tests__/app-conversation-ids.test.ts +151 -0
  25. package/src/__tests__/approval-cascade.test.ts +0 -15
  26. package/src/__tests__/approval-routes-http.test.ts +6 -17
  27. package/src/__tests__/assistant-event-hub.test.ts +126 -77
  28. package/src/__tests__/assistant-event.test.ts +0 -5
  29. package/src/__tests__/assistant-events-sse-hardening.test.ts +37 -15
  30. package/src/__tests__/assistant-feature-flags-integration.test.ts +0 -29
  31. package/src/__tests__/background-shell-host-bash.test.ts +34 -43
  32. package/src/__tests__/call-controller.test.ts +1 -1
  33. package/src/__tests__/call-site-routing-provider.test.ts +193 -0
  34. package/src/__tests__/channel-approval-routes.test.ts +10 -296
  35. package/src/__tests__/channel-approvals.test.ts +25 -17
  36. package/src/__tests__/channel-guardian.test.ts +100 -146
  37. package/src/__tests__/checker.test.ts +20 -34
  38. package/src/__tests__/compact-event-conversation-id-guard.test.ts +50 -0
  39. package/src/__tests__/compaction-events.test.ts +2 -0
  40. package/src/__tests__/config-schema.test.ts +6 -48
  41. package/src/__tests__/config-watcher.test.ts +12 -0
  42. package/src/__tests__/connection-policy.test.ts +1 -52
  43. package/src/__tests__/contacts-write.test.ts +2 -64
  44. package/src/__tests__/context-image-dimensions.test.ts +1 -1
  45. package/src/__tests__/context-search-memory-source.test.ts +120 -1
  46. package/src/__tests__/context-search-memory-v2-source.test.ts +383 -0
  47. package/src/__tests__/context-search-pkb-source.test.ts +49 -0
  48. package/src/__tests__/context-search-workspace-source.test.ts +9 -22
  49. package/src/__tests__/context-window-manager.test.ts +46 -0
  50. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +2 -0
  51. package/src/__tests__/conversation-agent-loop-overflow.test.ts +102 -29
  52. package/src/__tests__/conversation-agent-loop.test.ts +980 -13
  53. package/src/__tests__/conversation-analysis-routes.test.ts +12 -10
  54. package/src/__tests__/conversation-attention-telegram.test.ts +11 -3
  55. package/src/__tests__/conversation-confirmation-signals.test.ts +0 -291
  56. package/src/__tests__/conversation-history-web-search.test.ts +4 -3
  57. package/src/__tests__/conversation-inference-profile-route.test.ts +12 -23
  58. package/src/__tests__/conversation-lifecycle.test.ts +4 -4
  59. package/src/__tests__/conversation-process-callsite.test.ts +79 -2
  60. package/src/__tests__/conversation-queue.test.ts +3 -8
  61. package/src/__tests__/conversation-routes-disk-view.test.ts +1 -161
  62. package/src/__tests__/conversation-routes-guardian-reply.test.ts +0 -32
  63. package/src/__tests__/conversation-routes-slash-commands.test.ts +75 -66
  64. package/src/__tests__/conversation-runtime-assembly.test.ts +257 -3
  65. package/src/__tests__/conversation-slash-commands.test.ts +24 -4
  66. package/src/__tests__/conversation-slash-queue.test.ts +2 -0
  67. package/src/__tests__/conversation-speed-override.test.ts +0 -3
  68. package/src/__tests__/conversation-starter-routes.test.ts +79 -2
  69. package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +12 -5
  70. package/src/__tests__/conversation-surfaces-standalone.test.ts +18 -14
  71. package/src/__tests__/conversation-surfaces-state-update.test.ts +3 -2
  72. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +8 -46
  73. package/src/__tests__/conversation-usage.test.ts +253 -3
  74. package/src/__tests__/credential-execution-shell-lockdown.test.ts +0 -39
  75. package/src/__tests__/credential-health-service.test.ts +68 -0
  76. package/src/__tests__/credential-security-e2e.test.ts +4 -3
  77. package/src/__tests__/credential-security-invariants.test.ts +1 -5
  78. package/src/__tests__/credential-token-resolver.test.ts +180 -0
  79. package/src/__tests__/cu-unified-flow.test.ts +33 -16
  80. package/src/__tests__/daemon-assistant-events.test.ts +34 -21
  81. package/src/__tests__/daemon-credential-client.test.ts +4 -1
  82. package/src/__tests__/db-connection-isolation.test.ts +125 -0
  83. package/src/__tests__/db-migration-rollback.test.ts +101 -0
  84. package/src/__tests__/db-slack-compaction-watermark-migration.test.ts +169 -0
  85. package/src/__tests__/deterministic-verification-control-plane.test.ts +7 -80
  86. package/src/__tests__/document-conversations.test.ts +332 -0
  87. package/src/__tests__/embedding-managed-proxy-selection.test.ts +2 -2
  88. package/src/__tests__/emit-event-signal.test.ts +4 -6
  89. package/src/__tests__/events-client-registration.test.ts +193 -49
  90. package/src/__tests__/filing-service.test.ts +58 -7
  91. package/src/__tests__/first-greeting.test.ts +156 -150
  92. package/src/__tests__/fixtures/mock-chrome-extension.ts +108 -66
  93. package/src/__tests__/get-skill-detail-audit.test.ts +3 -8
  94. package/src/__tests__/guardian-binding-drift-heal.test.ts +1 -1
  95. package/src/__tests__/guardian-dispatch.test.ts +1 -1
  96. package/src/__tests__/guardian-grant-minting.test.ts +7 -2
  97. package/src/__tests__/guardian-routing-invariants.test.ts +7 -2
  98. package/src/__tests__/guardian-routing-state.test.ts +1 -1
  99. package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +32 -11
  100. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +2 -83
  101. package/src/__tests__/headless-browser-mode.test.ts +4 -9
  102. package/src/__tests__/headless-browser-navigate.test.ts +21 -20
  103. package/src/__tests__/heartbeat-service.test.ts +289 -7
  104. package/src/__tests__/helpers/channel-test-adapter.ts +2 -2
  105. package/src/__tests__/helpers/create-guardian-binding.ts +91 -0
  106. package/src/__tests__/host-bash-proxy.test.ts +46 -122
  107. package/src/__tests__/host-browser-e2e-cloud.test.ts +36 -497
  108. package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +26 -96
  109. package/src/__tests__/host-browser-proxy.test.ts +111 -185
  110. package/src/__tests__/host-browser-routes.test.ts +45 -75
  111. package/src/__tests__/host-browser-ws-events-e2e.test.ts +26 -30
  112. package/src/__tests__/host-cu-proxy.test.ts +56 -111
  113. package/src/__tests__/host-file-proxy.test.ts +44 -98
  114. package/src/__tests__/host-file-read-tool.test.ts +42 -21
  115. package/src/__tests__/host-shell-tool.test.ts +33 -68
  116. package/src/__tests__/host-transfer-pending-interactions.test.ts +2 -18
  117. package/src/__tests__/host-transfer-proxy.test.ts +43 -53
  118. package/src/__tests__/http-user-message-parity.test.ts +0 -6
  119. package/src/__tests__/inbound-slack-persistence.test.ts +31 -0
  120. package/src/__tests__/injector-chain.test.ts +10 -5
  121. package/src/__tests__/injector-pkb-v2-silenced.test.ts +124 -0
  122. package/src/__tests__/inline-command-runner.test.ts +0 -66
  123. package/src/__tests__/inline-skill-load-permissions.test.ts +0 -2
  124. package/src/__tests__/install-skill-routing.test.ts +1 -13
  125. package/src/__tests__/llm-callsite-catalog.test.ts +34 -0
  126. package/src/__tests__/llm-catalog-parity.test.ts +90 -0
  127. package/src/__tests__/llm-context-resolution.test.ts +180 -0
  128. package/src/__tests__/llm-resolver.test.ts +80 -12
  129. package/src/__tests__/llm-usage-store.test.ts +269 -4
  130. package/src/__tests__/log-export-routes.test.ts +89 -0
  131. package/src/__tests__/managed-profile-guard.test.ts +225 -0
  132. package/src/__tests__/managed-skill-lifecycle.test.ts +0 -10
  133. package/src/__tests__/manual-token-reconciliation.test.ts +334 -0
  134. package/src/__tests__/memory-v2-static-injector.test.ts +95 -0
  135. package/src/__tests__/migration-cross-version-compatibility.test.ts +197 -291
  136. package/src/__tests__/migration-export-http.test.ts +33 -26
  137. package/src/__tests__/migration-export-streaming.test.ts +18 -10
  138. package/src/__tests__/migration-export-to-gcs.test.ts +49 -9
  139. package/src/__tests__/migration-import-commit-http.test.ts +66 -21
  140. package/src/__tests__/migration-import-from-gcs.test.ts +50 -9
  141. package/src/__tests__/migration-import-from-url.test.ts +20 -6
  142. package/src/__tests__/migration-import-preflight-http.test.ts +95 -95
  143. package/src/__tests__/migration-parity-persistence.test.ts +62 -25
  144. package/src/__tests__/migration-transport.test.ts +115 -23
  145. package/src/__tests__/migration-validate-http.test.ts +105 -80
  146. package/src/__tests__/migration-wizard.test.ts +133 -27
  147. package/src/__tests__/non-member-access-request.test.ts +1 -1
  148. package/src/__tests__/notification-guardian-path.test.ts +1 -1
  149. package/src/__tests__/oauth-store.test.ts +19 -0
  150. package/src/__tests__/platform-bash-auto-approve.test.ts +21 -12
  151. package/src/__tests__/prechat-onboarding-contract.test.ts +31 -7
  152. package/src/__tests__/pricing.test.ts +68 -4
  153. package/src/__tests__/process-message-background-slack.test.ts +331 -0
  154. package/src/__tests__/provider-managed-proxy-integration.test.ts +153 -17
  155. package/src/__tests__/provider-send-message-override-profile.test.ts +50 -0
  156. package/src/__tests__/provider-usage-tracking.test.ts +208 -0
  157. package/src/__tests__/reaction-persistence.test.ts +9 -6
  158. package/src/__tests__/rebind-secrets-screen.test.ts +53 -16
  159. package/src/__tests__/recording-handler.test.ts +64 -81
  160. package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +4 -3
  161. package/src/__tests__/relay-server.test.ts +18 -13
  162. package/src/__tests__/require-fresh-approval.test.ts +13 -22
  163. package/src/__tests__/runtime-attachment-metadata.test.ts +1 -1
  164. package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
  165. package/src/__tests__/runtime-events-sse.test.ts +3 -12
  166. package/src/__tests__/search-skills-unified.test.ts +9 -15
  167. package/src/__tests__/secret-ingress-cli.test.ts +2 -5
  168. package/src/__tests__/secret-ingress-http.test.ts +0 -4
  169. package/src/__tests__/secret-onetime-send.test.ts +4 -2
  170. package/src/__tests__/secret-prompt-log-hygiene.test.ts +24 -7
  171. package/src/__tests__/secret-prompter-channel-fallback.test.ts +42 -47
  172. package/src/__tests__/secret-response-routing.test.ts +29 -15
  173. package/src/__tests__/secret-routes-managed-proxy.test.ts +5 -1
  174. package/src/__tests__/secret-scanner.test.ts +2 -545
  175. package/src/__tests__/send-endpoint-busy.test.ts +9 -24
  176. package/src/__tests__/settings-routes.test.ts +1 -1
  177. package/src/__tests__/shell-credential-ref.test.ts +0 -8
  178. package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -56
  179. package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -11
  180. package/src/__tests__/skill-tool-factory.test.ts +97 -0
  181. package/src/__tests__/skills-file-content-endpoint.test.ts +9 -30
  182. package/src/__tests__/skills-files-catalog-fallback.test.ts +11 -17
  183. package/src/__tests__/slack-inbound-verification.test.ts +1 -62
  184. package/src/__tests__/subagent-fork-notifications.test.ts +57 -47
  185. package/src/__tests__/subagent-manager-notify.test.ts +70 -70
  186. package/src/__tests__/subagent-notify-parent.test.ts +80 -83
  187. package/src/__tests__/system-prompt.test.ts +115 -13
  188. package/src/__tests__/terminal-tools.test.ts +0 -89
  189. package/src/__tests__/thread-backfill.test.ts +945 -31
  190. package/src/__tests__/tool-domain-event-publisher.test.ts +0 -36
  191. package/src/__tests__/tool-execute-pipeline.test.ts +0 -6
  192. package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -16
  193. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +9 -19
  194. package/src/__tests__/tool-executor-lifecycle-events.test.ts +4 -7
  195. package/src/__tests__/tool-executor.test.ts +12 -19
  196. package/src/__tests__/tool-metrics-listener.test.ts +0 -35
  197. package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
  198. package/src/__tests__/tool-trace-listener.test.ts +0 -17
  199. package/src/__tests__/transfer-progress-screen.test.ts +63 -26
  200. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +2 -149
  201. package/src/__tests__/trusted-contact-multichannel.test.ts +2 -4
  202. package/src/__tests__/trusted-contact-verification.test.ts +1 -1
  203. package/src/__tests__/tts-catalog-parity.test.ts +16 -5
  204. package/src/__tests__/usage-attribution.test.ts +247 -0
  205. package/src/__tests__/usage-cli.test.ts +143 -0
  206. package/src/__tests__/usage-grouped-buckets.test.ts +155 -0
  207. package/src/__tests__/usage-routes.test.ts +150 -0
  208. package/src/__tests__/validation-results-screen.test.ts +39 -16
  209. package/src/__tests__/vbundle-pax-and-symlink.test.ts +12 -3
  210. package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +49 -137
  211. package/src/__tests__/verification-control-plane-policy.test.ts +4 -7
  212. package/src/__tests__/voice-session-bridge.test.ts +5 -5
  213. package/src/__tests__/workspace-migration-062-drop-memory-v2-edges-json.test.ts +103 -0
  214. package/src/__tests__/workspace-migration-063-release-notes-dynamic-model-context.test.ts +77 -0
  215. package/src/__tests__/workspace-migration-064-unwind-main-agent-opus-seed.test.ts +225 -0
  216. package/src/__tests__/workspace-migration-memory-v2-init.test.ts +8 -30
  217. package/src/acp/index.ts +0 -15
  218. package/src/acp/session-manager.ts +37 -34
  219. package/src/agent/loop.ts +16 -1
  220. package/src/approvals/AGENTS.md +4 -0
  221. package/src/approvals/__tests__/guardian-feed-event.test.ts +10 -3
  222. package/src/approvals/guardian-request-resolvers.ts +10 -2
  223. package/src/backup/__tests__/backup-worker.test.ts +36 -8
  224. package/src/backup/__tests__/paths.test.ts +2 -2
  225. package/src/backup/__tests__/restore.test.ts +45 -28
  226. package/src/backup/backup-worker.ts +36 -2
  227. package/src/backup/paths.ts +9 -6
  228. package/src/browser-session/events.ts +0 -9
  229. package/src/calls/call-store.ts +1 -34
  230. package/src/calls/guardian-question-copy.ts +0 -108
  231. package/src/calls/relay-server.ts +0 -24
  232. package/src/calls/twilio-rest.ts +0 -38
  233. package/src/calls/twilio-routes.ts +1 -1
  234. package/src/calls/voice-session-bridge.ts +7 -38
  235. package/src/channels/types.ts +1 -36
  236. package/src/cli/commands/__tests__/cache.test.ts +152 -5
  237. package/src/cli/commands/__tests__/memory-v2.test.ts +14 -28
  238. package/src/cli/commands/__tests__/trust.test.ts +21 -387
  239. package/src/cli/commands/backup.ts +4 -4
  240. package/src/cli/commands/cache-fs.ts +8 -0
  241. package/src/cli/commands/cache.ts +153 -82
  242. package/src/cli/commands/clients.ts +63 -5
  243. package/src/cli/commands/completions.ts +3 -3
  244. package/src/cli/commands/contacts.ts +231 -76
  245. package/src/cli/commands/keys.ts +4 -1
  246. package/src/cli/commands/memory-v2.ts +24 -52
  247. package/src/cli/commands/oauth/shared.ts +2 -29
  248. package/src/cli/commands/pending.ts +102 -0
  249. package/src/cli/commands/skills.ts +77 -35
  250. package/src/cli/commands/trust.ts +70 -430
  251. package/src/cli/commands/usage.ts +25 -16
  252. package/src/cli/lib/daemon-credential-client.ts +14 -0
  253. package/src/cli/program.ts +2 -0
  254. package/src/cli.ts +0 -21
  255. package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
  256. package/src/config/bundled-skills/messaging/TOOLS.json +14 -4
  257. package/src/config/env-registry.ts +12 -2
  258. package/src/config/env.ts +3 -14
  259. package/src/config/feature-flag-registry.json +30 -30
  260. package/src/config/llm-callsite-catalog.ts +12 -0
  261. package/src/config/llm-context-resolution.ts +80 -0
  262. package/src/config/llm-resolver.ts +58 -22
  263. package/src/config/loader.ts +3 -3
  264. package/src/config/schema.ts +2 -158
  265. package/src/config/schemas/__tests__/memory-v2.test.ts +1 -0
  266. package/src/config/schemas/call-site-catalog.ts +271 -0
  267. package/src/config/schemas/calls.ts +5 -5
  268. package/src/config/schemas/inference.ts +1 -1
  269. package/src/config/schemas/ingress.ts +1 -1
  270. package/src/config/schemas/llm.ts +31 -3
  271. package/src/config/schemas/memory-retrieval.ts +2 -2
  272. package/src/config/schemas/memory-v2.ts +9 -0
  273. package/src/config/schemas/security.ts +1 -42
  274. package/src/config/schemas/services.ts +6 -6
  275. package/src/config/schemas/skills.ts +5 -5
  276. package/src/config/schemas/tts.ts +1 -1
  277. package/src/config/seed-inference-profiles.ts +117 -0
  278. package/src/config/skills.ts +0 -90
  279. package/src/config/types.ts +3 -6
  280. package/src/contacts/contact-store.ts +0 -17
  281. package/src/contacts/contacts-write.ts +1 -105
  282. package/src/context/window-manager.ts +44 -5
  283. package/src/credential-execution/process-manager.ts +34 -10
  284. package/src/credential-health/credential-health-service.ts +21 -16
  285. package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +75 -82
  286. package/src/daemon/__tests__/daemon-skill-host.test.ts +2 -9
  287. package/src/daemon/connection-policy.ts +1 -26
  288. package/src/daemon/conversation-agent-loop-handlers.ts +53 -4
  289. package/src/daemon/conversation-agent-loop.ts +277 -36
  290. package/src/daemon/conversation-history.ts +8 -8
  291. package/src/daemon/conversation-launch.ts +20 -135
  292. package/src/daemon/conversation-lifecycle.ts +1 -1
  293. package/src/daemon/conversation-messaging.ts +1 -0
  294. package/src/daemon/conversation-process.ts +83 -163
  295. package/src/daemon/conversation-runtime-assembly.ts +219 -76
  296. package/src/daemon/conversation-slash.ts +47 -5
  297. package/src/daemon/conversation-store.ts +7 -31
  298. package/src/daemon/conversation-surfaces.ts +22 -28
  299. package/src/daemon/conversation-tool-setup.ts +3 -33
  300. package/src/daemon/conversation-usage.ts +36 -0
  301. package/src/daemon/conversation.ts +117 -233
  302. package/src/daemon/daemon-control.ts +3 -71
  303. package/src/daemon/daemon-skill-host.ts +8 -11
  304. package/src/daemon/dictation-profile-store.ts +2 -26
  305. package/src/daemon/first-greeting.ts +44 -156
  306. package/src/daemon/handlers/config-channels.ts +12 -12
  307. package/src/daemon/handlers/config-ingress.ts +4 -165
  308. package/src/daemon/handlers/config-model.ts +1 -1
  309. package/src/daemon/handlers/config-voice.ts +0 -42
  310. package/src/daemon/handlers/conversations.ts +11 -190
  311. package/src/daemon/handlers/recording.ts +26 -158
  312. package/src/daemon/handlers/shared.ts +23 -71
  313. package/src/daemon/handlers/skills.ts +42 -93
  314. package/src/daemon/host-bash-proxy.ts +67 -45
  315. package/src/daemon/host-browser-proxy.ts +65 -27
  316. package/src/daemon/host-cu-proxy.ts +40 -39
  317. package/src/daemon/host-file-proxy.ts +58 -37
  318. package/src/daemon/host-transfer-proxy.ts +84 -46
  319. package/src/daemon/lifecycle.ts +49 -15
  320. package/src/daemon/message-types/conversations.ts +7 -0
  321. package/src/daemon/message-types/host-bash.ts +1 -0
  322. package/src/daemon/message-types/host-cu.ts +1 -0
  323. package/src/daemon/message-types/host-file.ts +1 -0
  324. package/src/daemon/message-types/host-transfer.ts +1 -0
  325. package/src/daemon/message-types/messages.ts +10 -9
  326. package/src/daemon/message-types/workspace.ts +1 -1
  327. package/src/daemon/process-message.ts +102 -239
  328. package/src/daemon/server.ts +13 -462
  329. package/src/daemon/shutdown-handlers.ts +2 -2
  330. package/src/daemon/tool-side-effects.ts +125 -107
  331. package/src/daemon/trust-context.ts +13 -0
  332. package/src/daemon/wake-target-adapter.ts +4 -9
  333. package/src/events/domain-events.ts +0 -8
  334. package/src/events/tool-audit-listener.ts +3 -1
  335. package/src/events/tool-domain-event-publisher.ts +0 -10
  336. package/src/events/tool-metrics-listener.ts +0 -17
  337. package/src/events/tool-trace-listener.ts +0 -14
  338. package/src/filing/filing-service.ts +13 -1
  339. package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +6 -2
  340. package/src/heartbeat/heartbeat-service.ts +23 -5
  341. package/src/home/__tests__/feed-writer.test.ts +0 -4
  342. package/src/home/__tests__/relationship-state-writer.test.ts +30 -0
  343. package/src/home/feed-writer.ts +1 -2
  344. package/src/home/relationship-state-writer.ts +16 -3
  345. package/src/ipc/__tests__/browser-ipc.test.ts +2 -12
  346. package/src/ipc/__tests__/skill-server-bidirectional.test.ts +0 -1
  347. package/src/ipc/assistant-server.ts +3 -10
  348. package/src/ipc/routes/__tests__/memory-v2-backfill.test.ts +39 -20
  349. package/src/ipc/routes/route-adapter.ts +1 -1
  350. package/src/ipc/routes/trust-rules.test.ts +0 -95
  351. package/src/ipc/skill-ipc-types.ts +41 -0
  352. package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +13 -27
  353. package/src/ipc/skill-routes/__tests__/identity.test.ts +4 -23
  354. package/src/ipc/skill-routes/events.ts +12 -23
  355. package/src/ipc/skill-routes/identity.ts +4 -17
  356. package/src/ipc/skill-routes/index.ts +1 -1
  357. package/src/ipc/skill-server.ts +6 -39
  358. package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +0 -8
  359. package/src/live-voice/protocol.ts +4 -13
  360. package/src/mcp/manager.ts +0 -5
  361. package/src/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +55 -0
  362. package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +127 -0
  363. package/src/memory/app-git-service.ts +0 -32
  364. package/src/memory/app-store.ts +154 -0
  365. package/src/memory/attachments-store.ts +6 -0
  366. package/src/memory/context-search/sources/memory-v2.ts +578 -0
  367. package/src/memory/context-search/sources/memory.ts +5 -0
  368. package/src/memory/context-search/sources/pkb.ts +10 -1
  369. package/src/memory/context-search/sources/workspace.ts +3 -2
  370. package/src/memory/conversation-crud.ts +29 -4
  371. package/src/memory/conversation-disk-view.ts +1 -5
  372. package/src/memory/conversation-starter-checkpoints.ts +63 -0
  373. package/src/memory/db-connection.ts +62 -0
  374. package/src/memory/db-init.ts +14 -0
  375. package/src/memory/embedding-backend.ts +3 -21
  376. package/src/memory/embedding-gemini.ts +0 -2
  377. package/src/memory/embedding-local.ts +6 -6
  378. package/src/memory/embedding-ollama.ts +6 -6
  379. package/src/memory/embedding-openai.ts +6 -6
  380. package/src/memory/embedding-types.ts +21 -0
  381. package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +3 -7
  382. package/src/memory/graph/conversation-graph-memory.ts +35 -13
  383. package/src/memory/graph/injection.test.ts +2 -2
  384. package/src/memory/graph/injection.ts +1 -1
  385. package/src/memory/guardian-action-store.ts +0 -83
  386. package/src/memory/guardian-approvals.ts +0 -48
  387. package/src/memory/indexer.ts +1 -15
  388. package/src/memory/job-handlers/conversation-starters.ts +36 -53
  389. package/src/memory/job-utils.ts +0 -6
  390. package/src/memory/jobs-store.ts +0 -1
  391. package/src/memory/jobs-worker.ts +2 -16
  392. package/src/memory/llm-request-log-store.ts +0 -41
  393. package/src/memory/llm-usage-store.ts +129 -43
  394. package/src/memory/memory-v2-activation-log-store.ts +115 -0
  395. package/src/memory/migrations/233-document-conversations.ts +54 -0
  396. package/src/memory/migrations/234-memory-v2-activation-logs.ts +55 -0
  397. package/src/memory/migrations/235-llm-usage-attribution.ts +31 -0
  398. package/src/memory/migrations/235-slack-compaction-watermark.ts +44 -0
  399. package/src/memory/migrations/236-tool-invocations-matched-rule-id.ts +26 -0
  400. package/src/memory/migrations/__tests__/234-memory-v2-activation-logs.test.ts +182 -0
  401. package/src/memory/migrations/index.ts +14 -0
  402. package/src/memory/migrations/registry.ts +24 -0
  403. package/src/memory/raw-query.ts +2 -68
  404. package/src/memory/schema/conversations.ts +7 -0
  405. package/src/memory/schema/infrastructure.ts +25 -0
  406. package/src/memory/search/semantic.ts +5 -16
  407. package/src/memory/tool-usage-store.ts +2 -0
  408. package/src/memory/usage-buckets.ts +40 -1
  409. package/src/memory/usage-grouped-buckets.ts +127 -0
  410. package/src/memory/v2/__tests__/activation.test.ts +289 -90
  411. package/src/memory/v2/__tests__/backfill-jobs.test.ts +2 -129
  412. package/src/memory/v2/__tests__/consolidation-job.test.ts +28 -11
  413. package/src/memory/v2/__tests__/edge-index.test.ts +278 -0
  414. package/src/memory/v2/__tests__/injection.test.ts +384 -15
  415. package/src/memory/v2/__tests__/migration.test.ts +64 -36
  416. package/src/memory/v2/__tests__/page-store.test.ts +191 -8
  417. package/src/memory/v2/__tests__/prompts-consolidation.test.ts +181 -0
  418. package/src/memory/v2/__tests__/skill-store.test.ts +115 -3
  419. package/src/memory/v2/__tests__/static-context.test.ts +153 -0
  420. package/src/memory/v2/activation.ts +168 -97
  421. package/src/memory/v2/backfill-jobs.ts +15 -100
  422. package/src/memory/v2/consolidation-job.ts +14 -12
  423. package/src/memory/v2/edge-index.ts +191 -0
  424. package/src/memory/v2/injection.ts +182 -58
  425. package/src/memory/v2/migration.ts +57 -64
  426. package/src/memory/v2/now-text.ts +2 -3
  427. package/src/memory/v2/page-store.ts +168 -31
  428. package/src/memory/v2/prompts/consolidation.ts +118 -42
  429. package/src/memory/v2/prompts/sweep.ts +3 -3
  430. package/src/memory/v2/skill-store.ts +55 -7
  431. package/src/memory/v2/static-context.ts +62 -0
  432. package/src/memory/v2/types.ts +10 -20
  433. package/src/memory/validation.ts +0 -11
  434. package/src/messaging/draft-store.ts +0 -6
  435. package/src/messaging/provider-types.ts +8 -0
  436. package/src/messaging/provider.ts +7 -0
  437. package/src/messaging/providers/gmail/client.ts +1 -121
  438. package/src/messaging/providers/outlook/client.ts +0 -73
  439. package/src/messaging/providers/slack/__tests__/adapter-mention-rendering.test.ts +226 -0
  440. package/src/messaging/providers/slack/adapter.ts +122 -21
  441. package/src/messaging/providers/slack/backfill.test.ts +95 -6
  442. package/src/messaging/providers/slack/backfill.ts +89 -11
  443. package/src/messaging/providers/slack/client.ts +10 -124
  444. package/src/messaging/providers/slack/message-metadata.ts +12 -2
  445. package/src/messaging/providers/slack/render-transcript.test.ts +56 -0
  446. package/src/messaging/providers/slack/render-transcript.ts +126 -25
  447. package/src/messaging/providers/slack/types.ts +1 -0
  448. package/src/oauth/connection-resolver.test.ts +8 -0
  449. package/src/oauth/connection-resolver.ts +8 -16
  450. package/src/oauth/credential-token-resolver.ts +97 -0
  451. package/src/oauth/manual-token-connection.ts +30 -34
  452. package/src/oauth/oauth-store.ts +6 -4
  453. package/src/outbound-proxy/certs.ts +0 -7
  454. package/src/outbound-proxy/config.ts +0 -74
  455. package/src/outbound-proxy/health.ts +0 -44
  456. package/src/outbound-proxy/index.ts +0 -22
  457. package/src/permissions/approval-provenance.test.ts +184 -0
  458. package/src/permissions/approval-provenance.ts +70 -0
  459. package/src/permissions/checker.ts +4 -1
  460. package/src/permissions/gateway-threshold-reader.ts +4 -1
  461. package/src/permissions/prompter.ts +9 -2
  462. package/src/permissions/secret-prompter.ts +21 -48
  463. package/src/permissions/types.ts +33 -0
  464. package/src/permissions/workspace-policy.ts +0 -5
  465. package/src/platform/sync-identity.ts +0 -8
  466. package/src/plugins/defaults/injectors.ts +69 -2
  467. package/src/plugins/defaults/overflow-reduce.ts +3 -2
  468. package/src/plugins/types.ts +8 -0
  469. package/src/prompts/system-prompt.ts +34 -70
  470. package/src/prompts/templates/BOOTSTRAP.md +52 -6
  471. package/src/prompts/update-bulletin-job.ts +2 -0
  472. package/src/providers/__tests__/retry-callsite.test.ts +138 -1
  473. package/src/providers/anthropic/client.ts +72 -33
  474. package/src/providers/call-site-routing.ts +42 -3
  475. package/src/providers/gemini/client.ts +18 -2
  476. package/src/providers/managed-proxy/context.ts +0 -5
  477. package/src/providers/model-catalog.ts +105 -19
  478. package/src/providers/openai/chat-completions-provider.ts +6 -0
  479. package/src/providers/openai/responses-provider.ts +7 -1
  480. package/src/providers/provider-send-message.ts +45 -2
  481. package/src/providers/ratelimit.ts +7 -2
  482. package/src/providers/registry.ts +14 -9
  483. package/src/providers/retry.ts +96 -8
  484. package/src/providers/types.ts +13 -0
  485. package/src/providers/usage-tracking.ts +96 -0
  486. package/src/runtime/AGENTS.md +10 -6
  487. package/src/runtime/__tests__/agent-wake.test.ts +89 -0
  488. package/src/runtime/agent-wake.ts +39 -2
  489. package/src/runtime/assistant-event-hub.ts +541 -45
  490. package/src/runtime/assistant-event.ts +1 -6
  491. package/src/runtime/auth/context.ts +0 -9
  492. package/src/runtime/auth/middleware.ts +1 -1
  493. package/src/runtime/auth/route-policy.ts +11 -9
  494. package/src/runtime/auth/token-service.ts +0 -11
  495. package/src/runtime/channel-approvals.ts +6 -2
  496. package/src/runtime/channel-verification-service.ts +3 -5
  497. package/src/runtime/http-errors.ts +0 -34
  498. package/src/runtime/http-router.ts +6 -3
  499. package/src/runtime/http-server.ts +22 -82
  500. package/src/runtime/http-types.ts +5 -0
  501. package/src/runtime/interactive-ui.ts +0 -1
  502. package/src/runtime/middleware/auth.ts +0 -20
  503. package/src/runtime/migrations/__tests__/v1-test-helpers.ts +112 -0
  504. package/src/runtime/migrations/__tests__/vbundle-builder-credentials.test.ts +11 -4
  505. package/src/runtime/migrations/__tests__/vbundle-builder-v1-shape.test.ts +253 -0
  506. package/src/runtime/migrations/__tests__/vbundle-import-credentials.test.ts +19 -6
  507. package/src/runtime/migrations/__tests__/vbundle-legacy-user-md.test.ts +71 -27
  508. package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +41 -2
  509. package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +143 -79
  510. package/src/runtime/migrations/__tests__/vbundle-streaming-validator.test.ts +143 -23
  511. package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +2 -2
  512. package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +371 -0
  513. package/src/runtime/migrations/migration-transport.ts +46 -13
  514. package/src/runtime/migrations/migration-wizard.ts +2 -2
  515. package/src/runtime/migrations/origin-mode.ts +40 -0
  516. package/src/runtime/migrations/vbundle-builder.ts +133 -79
  517. package/src/runtime/migrations/vbundle-import-analyzer.ts +9 -7
  518. package/src/runtime/migrations/vbundle-importer.ts +7 -7
  519. package/src/runtime/migrations/vbundle-metadata-merge.ts +1 -1
  520. package/src/runtime/migrations/vbundle-streaming-importer.ts +3 -3
  521. package/src/runtime/migrations/vbundle-streaming-validator.ts +48 -26
  522. package/src/runtime/migrations/vbundle-validator.ts +214 -41
  523. package/src/runtime/pending-interactions.ts +13 -4
  524. package/src/runtime/routes/__tests__/acp-routes.test.ts +0 -1
  525. package/src/runtime/routes/__tests__/backup-routes.test.ts +28 -19
  526. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +235 -0
  527. package/src/runtime/routes/__tests__/llm-call-sites-routes.test.ts +58 -0
  528. package/src/runtime/routes/__tests__/migration-export-secrets-redacted.test.ts +54 -0
  529. package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +19 -6
  530. package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +7 -7
  531. package/src/runtime/routes/acp-routes.test.ts +0 -3
  532. package/src/runtime/routes/acp-routes.ts +3 -7
  533. package/src/runtime/routes/app-management-routes.ts +18 -9
  534. package/src/runtime/routes/approval-routes.ts +55 -14
  535. package/src/runtime/routes/avatar-routes.ts +3 -5
  536. package/src/runtime/routes/browser-routes.ts +1 -15
  537. package/src/runtime/routes/channel-guardian-routes.ts +1 -5
  538. package/src/runtime/routes/channel-readiness-routes.ts +3 -7
  539. package/src/runtime/routes/channel-route-shared.ts +2 -28
  540. package/src/runtime/routes/client-routes.ts +45 -12
  541. package/src/runtime/routes/consolidation-routes.ts +115 -0
  542. package/src/runtime/routes/conversation-list-routes.ts +12 -29
  543. package/src/runtime/routes/conversation-management-routes.ts +14 -51
  544. package/src/runtime/routes/conversation-query-routes.ts +120 -8
  545. package/src/runtime/routes/conversation-routes.ts +44 -528
  546. package/src/runtime/routes/conversation-starter-routes.ts +19 -40
  547. package/src/runtime/routes/documents-routes.ts +53 -18
  548. package/src/runtime/routes/events-routes.ts +59 -91
  549. package/src/runtime/routes/filing-routes.ts +18 -1
  550. package/src/runtime/routes/guardian-action-routes.ts +4 -9
  551. package/src/runtime/routes/host-bash-routes.ts +3 -2
  552. package/src/runtime/routes/host-browser-routes.ts +9 -33
  553. package/src/runtime/routes/host-cu-routes.ts +6 -1
  554. package/src/runtime/routes/host-file-routes.ts +3 -2
  555. package/src/runtime/routes/host-transfer-routes.ts +11 -15
  556. package/src/runtime/routes/identity-routes.ts +78 -6
  557. package/src/runtime/routes/inbound-message-handler.ts +580 -137
  558. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +2 -88
  559. package/src/runtime/routes/inbound-stages/background-dispatch.ts +3 -0
  560. package/src/runtime/routes/index.ts +4 -0
  561. package/src/runtime/routes/integrations/slack/channel.ts +0 -24
  562. package/src/runtime/routes/llm-call-sites-routes.ts +22 -0
  563. package/src/runtime/routes/memory-v2-routes.ts +10 -15
  564. package/src/runtime/routes/migration-routes.ts +188 -31
  565. package/src/runtime/routes/playground/guard.ts +1 -1
  566. package/src/runtime/routes/playground/index.ts +0 -2
  567. package/src/runtime/routes/recording-routes.ts +4 -24
  568. package/src/runtime/routes/rename-conversation-routes.ts +2 -6
  569. package/src/runtime/routes/schedule-routes.ts +3 -6
  570. package/src/runtime/routes/secret-routes.ts +87 -18
  571. package/src/runtime/routes/settings-routes.ts +29 -28
  572. package/src/runtime/routes/skills-routes.ts +12 -31
  573. package/src/runtime/routes/suggest-trust-rule-routes.ts +32 -1
  574. package/src/runtime/routes/task-routes.ts +6 -6
  575. package/src/runtime/routes/trust-rules-routes.ts +3 -94
  576. package/src/runtime/routes/types.ts +4 -4
  577. package/src/runtime/routes/upgrade-broadcast-routes.ts +3 -10
  578. package/src/runtime/routes/usage-routes.ts +87 -10
  579. package/src/runtime/routes/user-routes.ts +17 -31
  580. package/src/runtime/routes/work-items-routes.ts +1 -4
  581. package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -2
  582. package/src/runtime/services/analyze-conversation.ts +7 -17
  583. package/src/runtime/services/conversation-serializer.ts +2 -4
  584. package/src/runtime/verification-outbound-actions.ts +1 -1
  585. package/src/runtime/verification-rate-limiter.ts +1 -1
  586. package/src/schedule/schedule-store.ts +0 -16
  587. package/src/security/secret-scanner.ts +14 -547
  588. package/src/security/secure-keys.ts +31 -11
  589. package/src/security/token-manager.ts +7 -3
  590. package/src/signals/cancel.ts +16 -25
  591. package/src/signals/conversation-undo.ts +2 -27
  592. package/src/signals/emit-event.ts +1 -2
  593. package/src/signals/user-message.ts +108 -22
  594. package/src/skills/catalog-install.ts +1 -0
  595. package/src/skills/clawhub.ts +2 -2
  596. package/src/skills/inline-command-runner.ts +1 -7
  597. package/src/subagent/manager.ts +67 -84
  598. package/src/tasks/task-store.ts +1 -28
  599. package/src/telemetry/types.ts +6 -0
  600. package/src/telemetry/usage-telemetry-reporter.test.ts +38 -15
  601. package/src/telemetry/usage-telemetry-reporter.ts +3 -5
  602. package/src/tools/acp/spawn.test.ts +1 -2
  603. package/src/tools/acp/steer.test.ts +1 -2
  604. package/src/tools/browser/__tests__/browser-status.test.ts +44 -127
  605. package/src/tools/browser/browser-execution.ts +31 -147
  606. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +92 -68
  607. package/src/tools/browser/cdp-client/factory.ts +48 -76
  608. package/src/tools/browser/cdp-client/index.ts +1 -14
  609. package/src/tools/executor.ts +44 -31
  610. package/src/tools/host-filesystem/edit.ts +3 -2
  611. package/src/tools/host-filesystem/read.ts +3 -2
  612. package/src/tools/host-filesystem/transfer.test.ts +45 -42
  613. package/src/tools/host-filesystem/transfer.ts +4 -3
  614. package/src/tools/host-filesystem/write.ts +3 -2
  615. package/src/tools/host-terminal/host-shell.ts +4 -3
  616. package/src/tools/network/script-proxy/index.ts +1 -10
  617. package/src/tools/permission-checker.ts +66 -1
  618. package/src/tools/skills/sandbox-runner.ts +1 -6
  619. package/src/tools/skills/skill-tool-factory.ts +32 -0
  620. package/src/tools/terminal/safe-env.ts +1 -0
  621. package/src/tools/terminal/shell.ts +2 -78
  622. package/src/tools/types.ts +12 -39
  623. package/src/tts/__tests__/provider-catalog.test.ts +2 -2
  624. package/src/tts/provider-catalog.ts +1 -1
  625. package/src/usage/actors.ts +2 -1
  626. package/src/usage/attribution.ts +185 -0
  627. package/src/usage/pricing.ts +166 -0
  628. package/src/usage/types.ts +14 -0
  629. package/src/util/json.ts +13 -0
  630. package/src/util/logger.ts +3 -3
  631. package/src/util/pricing.ts +50 -3
  632. package/src/work-items/work-item-runner.ts +15 -42
  633. package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +4 -3
  634. package/src/workspace/migrations/052-seed-default-inference-profiles.ts +3 -3
  635. package/src/workspace/migrations/060-memory-v2-init.ts +2 -18
  636. package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +59 -0
  637. package/src/workspace/migrations/062-drop-memory-v2-edges-json.ts +27 -0
  638. package/src/workspace/migrations/063-release-notes-dynamic-model-context.ts +70 -0
  639. package/src/workspace/migrations/064-unwind-main-agent-opus-seed.ts +64 -0
  640. package/src/workspace/migrations/registry.ts +8 -0
  641. package/src/workspace/provider-commit-message-generator.ts +3 -3
  642. package/src/__tests__/sandbox-diagnostics.test.ts +0 -138
  643. package/src/__tests__/sandbox-host-parity.test.ts +0 -1024
  644. package/src/__tests__/secret-detection-handler.test.ts +0 -67
  645. package/src/__tests__/secret-scanner-executor.test.ts +0 -450
  646. package/src/__tests__/tcc-sandbox-deny.test.ts +0 -198
  647. package/src/__tests__/terminal-sandbox.test.ts +0 -374
  648. package/src/__tests__/tool-notification-listener.test.ts +0 -65
  649. package/src/context/__tests__/microcompact.test.ts +0 -805
  650. package/src/context/microcompact.ts +0 -443
  651. package/src/daemon/handlers/slack-channel-oauth-install.ts +0 -197
  652. package/src/events/tool-notification-listener.ts +0 -17
  653. package/src/ipc/routes/__tests__/memory-v2-validate.test.ts +0 -219
  654. package/src/memory/v2/__tests__/edges.test.ts +0 -435
  655. package/src/memory/v2/edges.ts +0 -217
  656. package/src/prompts/__tests__/system-prompt-memory-v2.test.ts +0 -197
  657. package/src/runtime/__tests__/chrome-extension-registry.test.ts +0 -518
  658. package/src/runtime/__tests__/client-registry.test.ts +0 -271
  659. package/src/runtime/chrome-extension-registry.ts +0 -368
  660. package/src/runtime/client-registry.ts +0 -254
  661. package/src/runtime/routes/inbound-stages/verification-intercept.ts +0 -329
  662. package/src/tools/secret-detection-handler.ts +0 -269
  663. package/src/tools/terminal/backends/native.ts +0 -327
  664. package/src/tools/terminal/backends/types.ts +0 -37
  665. package/src/tools/terminal/sandbox-diagnostics.ts +0 -87
  666. package/src/tools/terminal/sandbox.ts +0 -40
@@ -9,7 +9,6 @@ import { getLogger } from "../../util/logger.js";
9
9
  import { getAvatarImagePath } from "../../util/platform.js";
10
10
  import { buildAssistantEvent } from "../assistant-event.js";
11
11
  import { assistantEventHub } from "../assistant-event-hub.js";
12
- import { DAEMON_INTERNAL_ASSISTANT_ID } from "../assistant-scope.js";
13
12
  import {
14
13
  BadRequestError,
15
14
  RouteError,
@@ -19,11 +18,11 @@ import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
19
18
 
20
19
  const log = getLogger("avatar-routes");
21
20
 
22
- export function publishAvatarUpdated(): void {
21
+ function publishAvatarUpdated(): void {
23
22
  const avatarPath = getAvatarImagePath();
24
23
  assistantEventHub
25
24
  .publish(
26
- buildAssistantEvent(DAEMON_INTERNAL_ASSISTANT_ID, {
25
+ buildAssistantEvent({
27
26
  type: "avatar_updated",
28
27
  avatarPath,
29
28
  }),
@@ -105,8 +104,7 @@ export const ROUTES: RouteDefinition[] = [
105
104
  return { ok: true };
106
105
  },
107
106
  summary: "Notify avatar updated",
108
- description:
109
- "Publish an avatar_updated SSE event to connected clients.",
107
+ description: "Publish an avatar_updated SSE event to connected clients.",
110
108
  tags: ["avatar"],
111
109
  responseBody: z.object({
112
110
  ok: z.boolean(),
@@ -18,7 +18,6 @@ import {
18
18
  } from "../../browser/types.js";
19
19
  import { findConversation } from "../../daemon/conversation-store.js";
20
20
  import type { ContentBlock } from "../../providers/types.js";
21
- import { getClientRegistry } from "../client-registry.js";
22
21
  import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
23
22
 
24
23
  // ── Param validation ─────────────────────────────────────────────────
@@ -70,8 +69,7 @@ async function handleBrowserExecute({ body = {} }: RouteHandlerArgs) {
70
69
 
71
70
  // When the caller passes a live conversation ID (e.g. from
72
71
  // __CONVERSATION_ID in a nested bash invocation), reuse that
73
- // conversation's browser proxy wiring so operations like `status`
74
- // see extension connectivity from the parent turn.
72
+ // conversation's trust context and transport interface.
75
73
  const conversation = conversationId
76
74
  ? findConversation(conversationId)
77
75
  : undefined;
@@ -80,12 +78,6 @@ async function handleBrowserExecute({ body = {} }: RouteHandlerArgs) {
80
78
  ? conversationId!
81
79
  : browserCliConversationKey(sessionId);
82
80
 
83
- // When there's no conversation context (e.g. `assistant browser status`
84
- // from the CLI), check the client registry for connected host_browser
85
- // clients so the status command can report accurate extension availability.
86
- const registry = getClientRegistry();
87
- const browserClients = registry.listByCapability("host_browser");
88
-
89
81
  const result = await executeBrowserOperation(
90
82
  operation as BrowserOperation,
91
83
  input,
@@ -93,13 +85,7 @@ async function handleBrowserExecute({ body = {} }: RouteHandlerArgs) {
93
85
  workingDir: process.cwd(),
94
86
  conversationId: resolvedConversationId,
95
87
  trustClass: conversation?.trustContext?.trustClass ?? "unknown",
96
- hostBrowserProxy: conversation?.hostBrowserProxy,
97
88
  transportInterface: conversation?.transportInterface,
98
- hostBrowserRegistryRouted: !!conversation?.hostBrowserSenderOverride,
99
- connectedBrowserClients: browserClients.map((c) => ({
100
- clientId: c.clientId,
101
- interfaceId: c.interfaceId,
102
- })),
103
89
  },
104
90
  );
105
91
 
@@ -10,12 +10,8 @@
10
10
  export {
11
11
  type ApprovalInterceptionParams,
12
12
  type ApprovalInterceptionResult,
13
- handleApprovalInterception,
14
13
  } from "./guardian-approval-interception.js";
15
- export {
16
- deliverGeneratedApprovalPrompt,
17
- type DeliverGeneratedApprovalPromptParams,
18
- } from "./guardian-approval-prompt.js";
14
+ export { type DeliverGeneratedApprovalPromptParams } from "./guardian-approval-prompt.js";
19
15
  export {
20
16
  startGuardianExpirySweep,
21
17
  stopGuardianExpirySweep,
@@ -45,7 +45,7 @@ async function enrichSnapshots(
45
45
  /**
46
46
  * GET /v1/channels/readiness
47
47
  */
48
- export async function handleGetChannelReadiness({
48
+ async function handleGetChannelReadiness({
49
49
  queryParams = {},
50
50
  }: RouteHandlerArgs) {
51
51
  const channel = (queryParams.channel as ChannelId | undefined) ?? undefined;
@@ -61,9 +61,7 @@ export async function handleGetChannelReadiness({
61
61
  /**
62
62
  * POST /v1/channels/readiness/refresh
63
63
  */
64
- export async function handleRefreshChannelReadiness({
65
- body = {},
66
- }: RouteHandlerArgs) {
64
+ async function handleRefreshChannelReadiness({ body = {} }: RouteHandlerArgs) {
67
65
  const channel = (body.channel as ChannelId | undefined) ?? undefined;
68
66
  const includeRemote =
69
67
  body.includeRemote !== undefined ? Boolean(body.includeRemote) : true;
@@ -130,9 +128,7 @@ export const ROUTES: RouteDefinition[] = [
130
128
  }),
131
129
  responseBody: z.object({
132
130
  success: z.boolean(),
133
- snapshots: z
134
- .array(z.unknown())
135
- .describe("Refreshed readiness snapshots"),
131
+ snapshots: z.array(z.unknown()).describe("Refreshed readiness snapshots"),
136
132
  }),
137
133
  },
138
134
  ];
@@ -119,39 +119,13 @@ export function buildGuardianDenyContext(
119
119
  return `Permission denied for "${toolName}": guardian approval was required, but no guardian is configured for this channel. In your next assistant reply, explain this and offer guardian setup. Mention that setup provides a verification code that the user replies with in the channel.`;
120
120
  }
121
121
 
122
- export function buildPromptDeliveryFailureContext(toolName: string): string {
123
- return `Permission denied for "${toolName}": approval UI delivery failed and no plain-text fallback could be delivered. In your next assistant reply, apologize briefly, explain approval delivery failed, and ask the user to retry.`;
124
- }
125
-
126
122
  export function stripVerificationFailurePrefix(reason: string): string {
127
123
  const trimmed = reason.trim();
128
124
  return trimmed.replace(/^verification failed\.?\s*/i, "").trim() || trimmed;
129
125
  }
130
-
131
- // ---------------------------------------------------------------------------
132
- // Poll constants
133
- // ---------------------------------------------------------------------------
134
-
135
- export const RUN_POLL_INTERVAL_MS = 500;
136
- const RUN_POLL_MAX_WAIT_MS = 300_000; // 5 minutes
137
-
138
- /** Post-decision delivery poll: uses the same budget as the main poll since
139
- * this is the only delivery path for late approvals after the main poll exits. */
140
- export const POST_DECISION_POLL_INTERVAL_MS = 500;
141
- export const POST_DECISION_POLL_MAX_WAIT_MS = RUN_POLL_MAX_WAIT_MS;
142
-
143
- /**
144
- * Override the poll max-wait for tests. When set, used in place of
145
- * RUN_POLL_MAX_WAIT_MS so tests can exercise timeout paths without
146
- * waiting 5 minutes.
147
- */
148
- let testPollMaxWaitOverride: number | null = null;
126
+ let _testPollMaxWaitOverride: number | null = null;
149
127
 
150
128
  /** @internal — test-only: set an override for the poll max-wait. */
151
129
  export function _setTestPollMaxWait(ms: number | null): void {
152
- testPollMaxWaitOverride = ms;
153
- }
154
-
155
- export function getEffectivePollMaxWait(): number {
156
- return testPollMaxWaitOverride ?? RUN_POLL_MAX_WAIT_MS;
130
+ _testPollMaxWaitOverride = ms;
157
131
  }
@@ -1,13 +1,16 @@
1
1
  /**
2
2
  * Client registry routes — list connected clients and their capabilities.
3
+ *
4
+ * Queries the assistant event hub's client subscribers rather than a
5
+ * separate registry. Clients register as hub subscribers via SSE /events.
3
6
  */
4
7
 
5
8
  import { z } from "zod";
6
9
 
7
- import {
8
- ClientRegistry,
9
- getClientRegistry,
10
- } from "../client-registry.js";
10
+ import type { HostProxyCapability } from "../../channels/types.js";
11
+ import { datesToISO } from "../../util/json.js";
12
+ import { assistantEventHub } from "../assistant-event-hub.js";
13
+ import { NotFoundError } from "./errors.js";
11
14
  import type { RouteDefinition } from "./types.js";
12
15
 
13
16
  export const ROUTES: RouteDefinition[] = [
@@ -31,18 +34,48 @@ export const ROUTES: RouteDefinition[] = [
31
34
  clients: z.array(z.object({}).passthrough()),
32
35
  }),
33
36
  handler: ({ queryParams }) => {
34
- const registry = getClientRegistry();
35
- const capability = queryParams?.capability;
37
+ const capability = queryParams?.capability as
38
+ | HostProxyCapability
39
+ | undefined;
36
40
 
37
- const entries = capability
38
- ? registry.listByCapability(
39
- capability as Parameters<typeof registry.listByCapability>[0],
40
- )
41
- : registry.listAll();
41
+ const clients = capability
42
+ ? assistantEventHub.listClientsByCapability(capability)
43
+ : assistantEventHub.listClients();
42
44
 
43
45
  return {
44
- clients: entries.map((e) => ClientRegistry.toJSON(e)),
46
+ clients: clients.map((c) =>
47
+ datesToISO({
48
+ clientId: c.clientId,
49
+ interfaceId: c.interfaceId,
50
+ capabilities: c.capabilities,
51
+ connectedAt: c.connectedAt,
52
+ lastActiveAt: c.lastActiveAt,
53
+ }),
54
+ ),
45
55
  };
46
56
  },
47
57
  },
58
+ {
59
+ operationId: "disconnect_client",
60
+ endpoint: "clients/disconnect",
61
+ method: "POST",
62
+ summary: "Force-disconnect a client",
63
+ description:
64
+ "Dispose all hub subscribers for the given clientId, forcibly closing their SSE streams.",
65
+ tags: ["clients"],
66
+ requestBody: z.object({
67
+ clientId: z.string().describe("The client UUID to disconnect."),
68
+ }),
69
+ responseBody: z.object({
70
+ disconnected: z.number().describe("Number of disposed subscribers."),
71
+ }),
72
+ handler: ({ body }) => {
73
+ const { clientId } = body as { clientId: string };
74
+ const count = assistantEventHub.disposeClient(clientId);
75
+ if (count === 0) {
76
+ throw new NotFoundError(`No connected client with id "${clientId}"`);
77
+ }
78
+ return { disconnected: count };
79
+ },
80
+ },
48
81
  ];
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Route handlers for the memory v2 consolidation job.
3
+ *
4
+ * Consolidation is the v2 counterpart to filing: an interval-based background
5
+ * pass that routes accumulated `memory/buffer.md` entries into concept pages.
6
+ * The job itself is enqueued by the memory jobs worker (see
7
+ * `maybeEnqueueGraphMaintenanceJobs` in `memory/jobs-worker.ts`); these routes
8
+ * only surface its config and provide an on-demand trigger for the Settings UI.
9
+ *
10
+ * `available` mirrors the filing route's `available` field: it reflects which
11
+ * background memory job is active for this instance. When `memory-v2-enabled`
12
+ * is off, consolidation returns `available: false` and the UI hides the row.
13
+ */
14
+
15
+ import { z } from "zod";
16
+
17
+ import { isAssistantFeatureFlagEnabled } from "../../config/assistant-feature-flags.js";
18
+ import { getConfig } from "../../config/loader.js";
19
+ import { getMemoryCheckpoint } from "../../memory/checkpoints.js";
20
+ import {
21
+ enqueueMemoryJob,
22
+ hasActiveJobOfType,
23
+ } from "../../memory/jobs-store.js";
24
+ import { GRAPH_MAINTENANCE_CHECKPOINTS } from "../../memory/jobs-worker.js";
25
+ import { BadRequestError } from "./errors.js";
26
+ import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
27
+
28
+ function isConsolidationAvailable(): boolean {
29
+ return isAssistantFeatureFlagEnabled("memory-v2-enabled", getConfig());
30
+ }
31
+
32
+ function consolidationIntervalMs(): number {
33
+ return getConfig().memory.v2.consolidation_interval_hours * 60 * 60 * 1000;
34
+ }
35
+
36
+ function readLastRunAt(): number | null {
37
+ const raw = getMemoryCheckpoint(
38
+ GRAPH_MAINTENANCE_CHECKPOINTS.memoryV2Consolidate,
39
+ );
40
+ if (!raw) return null;
41
+ const parsed = Number.parseInt(raw, 10);
42
+ return Number.isFinite(parsed) ? parsed : null;
43
+ }
44
+
45
+ // ---------------------------------------------------------------------------
46
+ // Shared ROUTES
47
+ // ---------------------------------------------------------------------------
48
+
49
+ export const ROUTES: RouteDefinition[] = [
50
+ {
51
+ operationId: "getConsolidationConfig",
52
+ endpoint: "consolidation/config",
53
+ method: "GET",
54
+ policyKey: "consolidation",
55
+ requirePolicyEnforcement: true,
56
+ summary: "Get consolidation config",
57
+ description:
58
+ "Return the current memory v2 consolidation schedule configuration.",
59
+ tags: ["consolidation"],
60
+ responseBody: z.object({
61
+ available: z.boolean(),
62
+ enabled: z.boolean(),
63
+ intervalMs: z.number(),
64
+ nextRunAt: z.number().nullable(),
65
+ lastRunAt: z.number().nullable(),
66
+ success: z.boolean(),
67
+ }),
68
+ handler: async (_args: RouteHandlerArgs) => {
69
+ const available = isConsolidationAvailable();
70
+ const v2Config = getConfig().memory.v2;
71
+ const intervalMs = consolidationIntervalMs();
72
+ const lastRunAt = readLastRunAt();
73
+ const nextRunAt = lastRunAt != null ? lastRunAt + intervalMs : null;
74
+ return {
75
+ available,
76
+ enabled: available && v2Config.enabled,
77
+ intervalMs,
78
+ nextRunAt,
79
+ lastRunAt,
80
+ success: true,
81
+ };
82
+ },
83
+ },
84
+ {
85
+ operationId: "runConsolidationNow",
86
+ endpoint: "consolidation/run-now",
87
+ method: "POST",
88
+ policyKey: "consolidation",
89
+ requirePolicyEnforcement: true,
90
+ summary: "Run consolidation now",
91
+ description:
92
+ "Enqueue an immediate memory v2 consolidation job. Returns once the job is queued; the job itself runs through the memory jobs worker.",
93
+ tags: ["consolidation"],
94
+ responseBody: z.object({
95
+ success: z.boolean(),
96
+ ran: z.boolean().describe("Whether a job was enqueued"),
97
+ jobId: z.string().nullable(),
98
+ }),
99
+ handler: async (_args: RouteHandlerArgs) => {
100
+ if (!isConsolidationAvailable()) {
101
+ throw new BadRequestError(
102
+ "Consolidation is not available (memory-v2-enabled is off)",
103
+ );
104
+ }
105
+ // Coalesce: don't pile up duplicate jobs if the worker hasn't picked up
106
+ // the previous one yet. The consolidation job's own lock catches the
107
+ // overlapping-window case but does not prevent queue depth from growing.
108
+ if (hasActiveJobOfType("memory_v2_consolidate")) {
109
+ return { success: true, ran: false, jobId: null };
110
+ }
111
+ const jobId = enqueueMemoryJob("memory_v2_consolidate", {});
112
+ return { success: true, ran: true, jobId };
113
+ },
114
+ },
115
+ ];
@@ -30,7 +30,6 @@ import { UserError } from "../../util/errors.js";
30
30
  import { getLogger } from "../../util/logger.js";
31
31
  import { buildAssistantEvent } from "../assistant-event.js";
32
32
  import { assistantEventHub } from "../assistant-event-hub.js";
33
- import { DAEMON_INTERNAL_ASSISTANT_ID } from "../assistant-scope.js";
34
33
  import {
35
34
  buildConversationDetailResponse,
36
35
  serializeConversationSummary,
@@ -58,7 +57,7 @@ function resolveOrThrow(rawId: string): string {
58
57
  function publishListInvalidated(): void {
59
58
  assistantEventHub
60
59
  .publish(
61
- buildAssistantEvent(DAEMON_INTERNAL_ASSISTANT_ID, {
60
+ buildAssistantEvent({
62
61
  type: "conversation_list_invalidated",
63
62
  reason: "seen_changed",
64
63
  }),
@@ -75,9 +74,7 @@ function publishListInvalidated(): void {
75
74
  // Handlers
76
75
  // ---------------------------------------------------------------------------
77
76
 
78
- function handleListConversations({
79
- queryParams = {},
80
- }: RouteHandlerArgs) {
77
+ function handleListConversations({ queryParams = {} }: RouteHandlerArgs) {
81
78
  const limit = Number(queryParams.limit ?? 50);
82
79
  const offset = Number(queryParams.offset ?? 0);
83
80
  const backgroundOnly = queryParams.conversationType === "background";
@@ -99,8 +96,7 @@ function handleListConversations({
99
96
  const conversationIds = rows.map((c) => c.id);
100
97
  const displayMeta = getDisplayMetaForConversations(conversationIds);
101
98
  const bindings = getBindingsForConversations(conversationIds);
102
- const attentionStates =
103
- getAttentionStateByConversationIds(conversationIds);
99
+ const attentionStates = getAttentionStateByConversationIds(conversationIds);
104
100
  const parentCache = new Map<string, ConversationRow | null>();
105
101
  const nextOffset = offset + limit;
106
102
 
@@ -140,9 +136,9 @@ function handleRecordSeen({ body = {} }: RouteHandlerArgs) {
140
136
  const conversationId = resolveOrThrow(rawConversationId);
141
137
 
142
138
  try {
143
- const priorState = getAttentionStateByConversationIds([
139
+ const priorState = getAttentionStateByConversationIds([conversationId]).get(
144
140
  conversationId,
145
- ]).get(conversationId);
141
+ );
146
142
  const wasUnseen =
147
143
  priorState != null &&
148
144
  priorState.latestAssistantMessageAt != null &&
@@ -155,8 +151,7 @@ function handleRecordSeen({ body = {} }: RouteHandlerArgs) {
155
151
  sourceChannel: (body.sourceChannel as string) ?? "vellum",
156
152
  signalType: ((body.signalType as string) ??
157
153
  "macos_conversation_opened") as SignalType,
158
- confidence: ((body.confidence as string) ??
159
- "explicit") as Confidence,
154
+ confidence: ((body.confidence as string) ?? "explicit") as Confidence,
160
155
  source: (body.source as string) ?? "http-api",
161
156
  evidenceText: body.evidenceText as string | undefined,
162
157
  metadata: body.metadata as Record<string, unknown> | undefined,
@@ -169,10 +164,7 @@ function handleRecordSeen({ body = {} }: RouteHandlerArgs) {
169
164
 
170
165
  return { ok: true };
171
166
  } catch (err) {
172
- log.error(
173
- { err, conversationId },
174
- "POST /v1/conversations/seen: failed",
175
- );
167
+ log.error({ err, conversationId }, "POST /v1/conversations/seen: failed");
176
168
  throw new InternalError("Failed to record seen signal");
177
169
  }
178
170
  }
@@ -194,22 +186,15 @@ function handleMarkUnread({ body = {} }: RouteHandlerArgs) {
194
186
  if (err instanceof UserError) {
195
187
  throw new UnprocessableEntityError(err.message);
196
188
  }
197
- log.error(
198
- { err, conversationId },
199
- "POST /v1/conversations/unread: failed",
200
- );
189
+ log.error({ err, conversationId }, "POST /v1/conversations/unread: failed");
201
190
  throw new InternalError("Failed to mark conversation unread");
202
191
  }
203
192
  }
204
193
 
205
- function handleGetConversation({
206
- pathParams = {},
207
- }: RouteHandlerArgs) {
194
+ function handleGetConversation({ pathParams = {} }: RouteHandlerArgs) {
208
195
  const detail = buildConversationDetailResponse(pathParams.id!);
209
196
  if (!detail) {
210
- throw new NotFoundError(
211
- `Conversation ${pathParams.id} not found`,
212
- );
197
+ throw new NotFoundError(`Conversation ${pathParams.id} not found`);
213
198
  }
214
199
  return detail;
215
200
  }
@@ -236,8 +221,7 @@ export const ROUTES: RouteDefinition[] = [
236
221
  method: "POST",
237
222
  policyKey: "conversations/seen",
238
223
  summary: "Record a seen signal",
239
- description:
240
- "Mark a conversation as seen, advancing the attention cursor.",
224
+ description: "Mark a conversation as seen, advancing the attention cursor.",
241
225
  tags: ["conversations"],
242
226
  handler: handleRecordSeen,
243
227
  },
@@ -247,8 +231,7 @@ export const ROUTES: RouteDefinition[] = [
247
231
  method: "POST",
248
232
  policyKey: "conversations/unread",
249
233
  summary: "Mark conversation unread",
250
- description:
251
- "Reset the seen cursor so the conversation appears unread.",
234
+ description: "Reset the seen cursor so the conversation appears unread.",
252
235
  tags: ["conversations"],
253
236
  handler: handleMarkUnread,
254
237
  },
@@ -28,7 +28,6 @@ import {
28
28
  switchConversation,
29
29
  undoLastMessage,
30
30
  } from "../../daemon/handlers/conversations.js";
31
- import type { ServerMessage } from "../../daemon/message-protocol.js";
32
31
  import type { ConversationListInvalidatedReason } from "../../daemon/message-types/conversations.js";
33
32
  import { normalizeConversationType } from "../../daemon/message-types/shared.js";
34
33
  import {
@@ -54,13 +53,8 @@ import { UserError } from "../../util/errors.js";
54
53
  import { getLogger } from "../../util/logger.js";
55
54
  import { buildAssistantEvent } from "../assistant-event.js";
56
55
  import { assistantEventHub } from "../assistant-event-hub.js";
57
- import { DAEMON_INTERNAL_ASSISTANT_ID } from "../assistant-scope.js";
58
56
  import { buildConversationDetailResponse } from "../services/conversation-serializer.js";
59
- import {
60
- BadRequestError,
61
- InternalError,
62
- NotFoundError,
63
- } from "./errors.js";
57
+ import { BadRequestError, InternalError, NotFoundError } from "./errors.js";
64
58
  import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
65
59
 
66
60
  const log = getLogger("conversation-management-routes");
@@ -75,10 +69,12 @@ function resolveOrThrow(rawId: string): string {
75
69
  return id;
76
70
  }
77
71
 
78
- function publishListInvalidated(reason: ConversationListInvalidatedReason): void {
72
+ function publishListInvalidated(
73
+ reason: ConversationListInvalidatedReason,
74
+ ): void {
79
75
  assistantEventHub
80
76
  .publish(
81
- buildAssistantEvent(DAEMON_INTERNAL_ASSISTANT_ID, {
77
+ buildAssistantEvent({
82
78
  type: "conversation_list_invalidated",
83
79
  reason,
84
80
  }),
@@ -191,8 +187,7 @@ function handleSetInferenceProfile({
191
187
  pathParams = {},
192
188
  body = {},
193
189
  }: RouteHandlerArgs) {
194
- const resolvedId =
195
- resolveConversationId(pathParams.id!) ?? pathParams.id!;
190
+ const resolvedId = resolveConversationId(pathParams.id!) ?? pathParams.id!;
196
191
  const conversation = getConversation(resolvedId);
197
192
  if (!conversation) {
198
193
  throw new NotFoundError(`Conversation ${pathParams.id} not found`);
@@ -200,12 +195,9 @@ function handleSetInferenceProfile({
200
195
 
201
196
  if (
202
197
  body.profile !== null &&
203
- (typeof body.profile !== "string" ||
204
- (body.profile as string).length === 0)
198
+ (typeof body.profile !== "string" || (body.profile as string).length === 0)
205
199
  ) {
206
- throw new BadRequestError(
207
- "profile must be a non-empty string or null",
208
- );
200
+ throw new BadRequestError("profile must be a non-empty string or null");
209
201
  }
210
202
 
211
203
  const profile = body.profile as string | null;
@@ -223,7 +215,6 @@ function handleSetInferenceProfile({
223
215
  assistantEventHub
224
216
  .publish(
225
217
  buildAssistantEvent(
226
- DAEMON_INTERNAL_ASSISTANT_ID,
227
218
  {
228
219
  type: "conversation_inference_profile_updated",
229
220
  conversationId: resolvedId,
@@ -260,7 +251,6 @@ function handleRenameConversation({
260
251
  assistantEventHub
261
252
  .publish(
262
253
  buildAssistantEvent(
263
- DAEMON_INTERNAL_ASSISTANT_ID,
264
254
  {
265
255
  type: "conversation_title_updated",
266
256
  conversationId: pathParams.id!,
@@ -381,9 +371,7 @@ function handleCancelGeneration({ pathParams = {} }: RouteHandlerArgs) {
381
371
  async function handleUndoLastMessage({ pathParams = {} }: RouteHandlerArgs) {
382
372
  const result = await undoLastMessage(pathParams.id!);
383
373
  if (!result) {
384
- throw new NotFoundError(
385
- `No active conversation for ${pathParams.id}`,
386
- );
374
+ throw new NotFoundError(`No active conversation for ${pathParams.id}`);
387
375
  }
388
376
  return {
389
377
  removedCount: result.removedCount,
@@ -393,32 +381,10 @@ async function handleUndoLastMessage({ pathParams = {} }: RouteHandlerArgs) {
393
381
 
394
382
  async function handleRegenerateResponse({ pathParams = {} }: RouteHandlerArgs) {
395
383
  const conversationId = pathParams.id!;
396
- const resolvedId = resolveConversationId(conversationId) ?? conversationId;
397
- let hubChain: Promise<void> = Promise.resolve();
398
- const sendEvent = (event: ServerMessage) => {
399
- const ae = buildAssistantEvent(
400
- DAEMON_INTERNAL_ASSISTANT_ID,
401
- event,
402
- resolvedId,
403
- );
404
- hubChain = (async () => {
405
- await hubChain;
406
- try {
407
- await assistantEventHub.publish(ae);
408
- } catch (err) {
409
- log.warn(
410
- { err },
411
- "assistant-events hub subscriber threw during regenerate",
412
- );
413
- }
414
- })();
415
- };
416
384
  try {
417
- const result = await regenerateResponse(conversationId, sendEvent);
385
+ const result = await regenerateResponse(conversationId);
418
386
  if (!result) {
419
- throw new NotFoundError(
420
- `No active conversation for ${pathParams.id}`,
421
- );
387
+ throw new NotFoundError(`No active conversation for ${pathParams.id}`);
422
388
  }
423
389
  return undefined;
424
390
  } catch (err) {
@@ -566,8 +532,7 @@ export const ROUTES: RouteDefinition[] = [
566
532
  method: "DELETE",
567
533
  policyKey: "conversations/clear-all",
568
534
  summary: "Clear all conversations",
569
- description:
570
- "Permanently delete ALL conversations, messages, and memory.",
535
+ description: "Permanently delete ALL conversations, messages, and memory.",
571
536
  tags: ["conversations"],
572
537
  responseStatus: "204",
573
538
  handler: handleClearAllConversations,
@@ -631,8 +596,7 @@ export const ROUTES: RouteDefinition[] = [
631
596
  method: "POST",
632
597
  policyKey: "conversations/cancel",
633
598
  summary: "Cancel generation",
634
- description:
635
- "Abort the in-progress assistant response for a conversation.",
599
+ description: "Abort the in-progress assistant response for a conversation.",
636
600
  tags: ["conversations"],
637
601
  pathParams: [{ name: "id" }],
638
602
  responseStatus: "202",
@@ -673,8 +637,7 @@ export const ROUTES: RouteDefinition[] = [
673
637
  method: "POST",
674
638
  policyKey: "conversations/reorder",
675
639
  summary: "Reorder conversations",
676
- description:
677
- "Batch-update display order and pin state for conversations.",
640
+ description: "Batch-update display order and pin state for conversations.",
678
641
  tags: ["conversations"],
679
642
  requestBody: z.object({
680
643
  updates: z