@vellumai/assistant 0.8.4 → 0.8.5

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 (438) hide show
  1. package/ARCHITECTURE.md +2 -2
  2. package/docs/browser-use-architecture-phase2.md +1 -1
  3. package/knip.json +2 -1
  4. package/openapi.yaml +809 -11
  5. package/package.json +1 -1
  6. package/src/__tests__/anthropic-provider.test.ts +34 -37
  7. package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +293 -0
  8. package/src/__tests__/assistant-feature-flags-integration.test.ts +3 -3
  9. package/src/__tests__/audit-log-rotation.test.ts +70 -16
  10. package/src/__tests__/background-workers-disk-pressure.test.ts +3 -3
  11. package/src/__tests__/btw-routes.test.ts +2 -3
  12. package/src/__tests__/call-controller.test.ts +0 -1
  13. package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
  14. package/src/__tests__/channel-guardian.test.ts +3 -3
  15. package/src/__tests__/checker.test.ts +6 -15
  16. package/src/__tests__/compaction-events.test.ts +1 -0
  17. package/src/__tests__/compactor-call-site-logging.test.ts +214 -0
  18. package/src/__tests__/computer-use-skill-manifest-regression.test.ts +5 -11
  19. package/src/__tests__/computer-use-tools.test.ts +2 -4
  20. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
  21. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +1 -1
  22. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -1
  23. package/src/__tests__/conversation-agent-loop-overflow.test.ts +197 -2
  24. package/src/__tests__/conversation-agent-loop.test.ts +163 -122
  25. package/src/__tests__/conversation-app-control-instantiation.test.ts +2 -5
  26. package/src/__tests__/conversation-clear-safety.test.ts +25 -25
  27. package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +1 -1
  28. package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
  29. package/src/__tests__/conversation-error.test.ts +31 -0
  30. package/src/__tests__/conversation-fork-crud.test.ts +178 -15
  31. package/src/__tests__/conversation-lifecycle.test.ts +52 -11
  32. package/src/__tests__/{conversation-load-cleaned-at.test.ts → conversation-load-history-stripped.test.ts} +13 -13
  33. package/src/__tests__/conversation-provider-retry-repair.test.ts +1 -0
  34. package/src/__tests__/conversation-routes-disk-view.test.ts +109 -0
  35. package/src/__tests__/conversation-routes-slash-commands.test.ts +35 -0
  36. package/src/__tests__/conversation-skill-tools.test.ts +2 -5
  37. package/src/__tests__/conversation-store.test.ts +1 -1
  38. package/src/__tests__/conversation-sync-tags.test.ts +99 -32
  39. package/src/__tests__/conversation-workspace-cache-state.test.ts +1 -0
  40. package/src/__tests__/conversation-workspace-injection.test.ts +1 -1
  41. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -1
  42. package/src/__tests__/credential-execution-feature-gates.test.ts +9 -7
  43. package/src/__tests__/credential-execution-tools.test.ts +6 -6
  44. package/src/__tests__/credential-security-invariants.test.ts +1 -0
  45. package/src/__tests__/credential-vault-unit.test.ts +2 -2
  46. package/src/__tests__/dynamic-page-surface.test.ts +2 -2
  47. package/src/__tests__/email-html-renderer.test.ts +12 -0
  48. package/src/__tests__/gateway-flag-listener.test.ts +237 -0
  49. package/src/__tests__/gemini-provider.test.ts +78 -0
  50. package/src/__tests__/guardian-dispatch.test.ts +0 -1
  51. package/src/__tests__/guardian-outbound-http.test.ts +7 -5
  52. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
  53. package/src/__tests__/heartbeat-disk-pressure.test.ts +4 -0
  54. package/src/__tests__/heartbeat-service.test.ts +4 -0
  55. package/src/__tests__/host-shell-tool.test.ts +1 -1
  56. package/src/__tests__/init-feature-flag-overrides.test.ts +5 -6
  57. package/src/__tests__/list-messages-tool-merge.test.ts +70 -11
  58. package/src/__tests__/llm-request-log-call-site.test.ts +136 -0
  59. package/src/__tests__/llm-request-log-source-clickhouse.test.ts +26 -0
  60. package/src/__tests__/llm-resolver.test.ts +77 -9
  61. package/src/__tests__/llm-usage-store.test.ts +66 -0
  62. package/src/__tests__/logger.test.ts +89 -0
  63. package/src/__tests__/mcp-abort-signal.test.ts +2 -2
  64. package/src/__tests__/media-generate-image.test.ts +31 -0
  65. package/src/__tests__/memory-v2-static-injector.test.ts +7 -7
  66. package/src/__tests__/model-intents.test.ts +2 -4
  67. package/src/__tests__/notification-guardian-path.test.ts +0 -1
  68. package/src/__tests__/onboarding-template-contract.test.ts +1 -1
  69. package/src/__tests__/openai-provider.test.ts +46 -0
  70. package/src/__tests__/openai-responses-provider.test.ts +114 -12
  71. package/src/__tests__/pending-interactions-resolved-event.test.ts +0 -1
  72. package/src/__tests__/platform-bash-auto-approve.test.ts +2 -2
  73. package/src/__tests__/platform.test.ts +2 -2
  74. package/src/__tests__/plugin-api-tool-definition.test.ts +92 -0
  75. package/src/__tests__/plugin-bootstrap.test.ts +2 -2
  76. package/src/__tests__/plugin-tool-contribution.test.ts +13 -6
  77. package/src/__tests__/plugin-types.test.ts +3 -2
  78. package/src/__tests__/prechat-onboarding-contract.test.ts +131 -98
  79. package/src/__tests__/pricing.test.ts +12 -0
  80. package/src/__tests__/prune-jobs-changes-parser.test.ts +61 -0
  81. package/src/__tests__/registry.test.ts +2 -8
  82. package/src/__tests__/require-fresh-approval.test.ts +2 -2
  83. package/src/__tests__/runtime-events-sse-bilingual.test.ts +154 -0
  84. package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
  85. package/src/__tests__/skill-feature-flags.test.ts +2 -2
  86. package/src/__tests__/skill-projection-feature-flag.test.ts +4 -7
  87. package/src/__tests__/skill-projection.benchmark.test.ts +2 -6
  88. package/src/__tests__/skill-tool-factory.test.ts +1 -1
  89. package/src/__tests__/subagent-notify-parent.test.ts +1 -1
  90. package/src/__tests__/suggestion-routes.test.ts +1 -0
  91. package/src/__tests__/sync-message-contract.test.ts +59 -0
  92. package/src/__tests__/system-prompt.test.ts +145 -131
  93. package/src/__tests__/terminal-tools.test.ts +1 -1
  94. package/src/__tests__/tool-approval-handler.test.ts +1 -5
  95. package/src/__tests__/tool-execute-pipeline.test.ts +2 -2
  96. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -5
  97. package/src/__tests__/tool-executor-lifecycle-events.test.ts +15 -5
  98. package/src/__tests__/tool-executor.test.ts +9 -62
  99. package/src/__tests__/tool-grant-request-escalation.test.ts +1 -6
  100. package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
  101. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +1 -6
  102. package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
  103. package/src/__tests__/ui-file-upload-surface.test.ts +2 -2
  104. package/src/__tests__/usage-routes.test.ts +3 -0
  105. package/src/__tests__/verification-control-plane-policy.test.ts +2 -2
  106. package/src/__tests__/workspace-git-service.test.ts +6 -5
  107. package/src/__tests__/workspace-migration-089-move-memory-tree-out-of-v3.test.ts +86 -0
  108. package/src/acp/__tests__/prepare-agent-env.test.ts +146 -0
  109. package/src/acp/prepare-agent-env.ts +78 -0
  110. package/src/acp/session-manager.ts +1 -1
  111. package/src/agent/loop.ts +8 -0
  112. package/src/api/README.md +5 -0
  113. package/src/api/index.ts +4 -0
  114. package/src/api/package.json +10 -0
  115. package/src/background-wake/background-wake-routes.test.ts +233 -0
  116. package/src/background-wake/runtime-registry.ts +24 -0
  117. package/src/cli/commands/__tests__/browser.test.ts +23 -5
  118. package/src/cli/commands/__tests__/domain-register.test.ts +110 -0
  119. package/src/cli/commands/__tests__/domain-status.test.ts +33 -33
  120. package/src/cli/commands/__tests__/inference-send.test.ts +108 -5
  121. package/src/cli/commands/__tests__/memory-v2-compare-render.test.ts +98 -0
  122. package/src/cli/commands/__tests__/memory-v2.test.ts +1 -0
  123. package/src/cli/commands/__tests__/memory-v3-render.test.ts +340 -0
  124. package/src/cli/commands/browser.ts +247 -0
  125. package/src/cli/commands/domain.ts +91 -41
  126. package/src/cli/commands/inference.ts +93 -40
  127. package/src/cli/commands/memory-v2-compare-render.ts +115 -0
  128. package/src/cli/commands/memory-v2.ts +176 -1
  129. package/src/cli/commands/memory-v3-render.ts +344 -0
  130. package/src/cli/commands/memory-v3.ts +316 -0
  131. package/src/cli/program.ts +2 -0
  132. package/src/config/assistant-feature-flags.ts +21 -9
  133. package/src/config/bundled-skills/document-editor/SKILL.md +11 -2
  134. package/src/config/bundled-skills/document-editor/TOOLS.json +18 -0
  135. package/src/config/bundled-skills/document-editor/tools/document-open.ts +12 -0
  136. package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
  137. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +2 -2
  138. package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +13 -8
  139. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +10 -3
  140. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +16 -14
  141. package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +7 -2
  142. package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +7 -2
  143. package/src/config/bundled-tool-registry.ts +2 -0
  144. package/src/config/call-site-defaults.ts +7 -6
  145. package/src/config/feature-flag-registry.json +16 -0
  146. package/src/config/schemas/__tests__/memory-v2.test.ts +213 -1
  147. package/src/config/schemas/call-site-catalog.ts +21 -7
  148. package/src/config/schemas/llm.ts +12 -1
  149. package/src/config/schemas/memory-v2.ts +246 -0
  150. package/src/config/schemas/memory.ts +2 -1
  151. package/src/context/compactor.ts +52 -0
  152. package/src/conversations/__tests__/message-consolidation.test.ts +350 -0
  153. package/src/conversations/message-consolidation.ts +404 -0
  154. package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +1 -1
  155. package/src/daemon/__tests__/meet-manifest-loader.test.ts +1 -1
  156. package/src/daemon/conversation-agent-loop-handlers.ts +2 -13
  157. package/src/daemon/conversation-agent-loop.ts +126 -76
  158. package/src/daemon/conversation-error.ts +31 -1
  159. package/src/daemon/conversation-lifecycle.ts +27 -22
  160. package/src/daemon/conversation-runtime-assembly.ts +10 -9
  161. package/src/daemon/conversation-tool-setup.ts +63 -3
  162. package/src/daemon/conversation-usage.ts +2 -0
  163. package/src/daemon/conversation.ts +14 -29
  164. package/src/daemon/disk-pressure-guard.ts +14 -2
  165. package/src/daemon/handlers/config-model.test.ts +1 -0
  166. package/src/daemon/handlers/conversations.ts +11 -3
  167. package/src/daemon/host-browser-proxy.ts +5 -5
  168. package/src/daemon/host-cu-proxy.ts +4 -4
  169. package/src/daemon/host-file-proxy.ts +4 -4
  170. package/src/daemon/host-proxy-base.ts +4 -4
  171. package/src/daemon/host-transfer-proxy.ts +10 -10
  172. package/src/daemon/lifecycle.ts +23 -20
  173. package/src/daemon/meet-manifest-loader.ts +1 -7
  174. package/src/daemon/message-types/conversations.ts +6 -9
  175. package/src/daemon/message-types/home.ts +1 -13
  176. package/src/daemon/message-types/messages.ts +6 -14
  177. package/src/daemon/message-types/sync.ts +14 -0
  178. package/src/daemon/shutdown-handlers.ts +24 -5
  179. package/src/daemon/switch-inference-profile-tool.ts +52 -0
  180. package/src/daemon/tool-setup-types.ts +13 -0
  181. package/src/events/relationship-state-updated.ts +25 -0
  182. package/src/heartbeat/__tests__/heartbeat-service.test.ts +1 -1
  183. package/src/home/home-greeting.ts +0 -9
  184. package/src/home/suggested-prompts.ts +0 -9
  185. package/src/ipc/gateway-flag-listener.ts +123 -0
  186. package/src/ipc/skill-routes/registries.ts +8 -12
  187. package/src/memory/__tests__/db-async-query.test.ts +165 -0
  188. package/src/memory/__tests__/db-maintenance.test.ts +115 -0
  189. package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +241 -0
  190. package/src/memory/__tests__/jobs-store-job-classes.test.ts +28 -1
  191. package/src/memory/__tests__/memory-retrospective-job.test.ts +7 -0
  192. package/src/memory/auto-analysis-enqueue.ts +5 -1
  193. package/src/memory/conversation-crud.ts +71 -70
  194. package/src/memory/conversation-starters-cadence.ts +3 -1
  195. package/src/memory/conversation-title-service.ts +19 -3
  196. package/src/memory/db-async-query.ts +214 -0
  197. package/src/memory/db-init.ts +10 -0
  198. package/src/memory/db-maintenance.ts +30 -21
  199. package/src/memory/graph/bootstrap.ts +8 -1
  200. package/src/memory/graph/capability-seed.ts +7 -3
  201. package/src/memory/graph/conversation-graph-memory.ts +100 -17
  202. package/src/memory/graph/extraction.ts +1 -5
  203. package/src/memory/graph/graph-search.ts +7 -1
  204. package/src/memory/indexer.ts +28 -18
  205. package/src/memory/job-handlers/cleanup.ts +76 -18
  206. package/src/memory/job-handlers/conversation-starters.ts +1 -4
  207. package/src/memory/jobs/embed-pkb-file.ts +6 -1
  208. package/src/memory/jobs-store.ts +14 -0
  209. package/src/memory/jobs-worker.ts +55 -22
  210. package/src/memory/llm-request-log-source-clickhouse.ts +42 -2
  211. package/src/memory/llm-request-log-source-local.ts +7 -0
  212. package/src/memory/llm-request-log-source.ts +9 -2
  213. package/src/memory/llm-request-log-store.ts +43 -1
  214. package/src/memory/llm-usage-store.ts +24 -0
  215. package/src/memory/memory-retrospective-enqueue.ts +8 -1
  216. package/src/memory/memory-retrospective-job.ts +5 -0
  217. package/src/memory/memory-v2-activation-log-store.ts +15 -6
  218. package/src/memory/migrations/260-rename-cleaned-at.ts +44 -0
  219. package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +36 -0
  220. package/src/memory/migrations/262-memory-v3-coactivation.ts +57 -0
  221. package/src/memory/migrations/263-memory-v3-auto-edges.ts +50 -0
  222. package/src/memory/migrations/264-llm-request-log-call-site.ts +29 -0
  223. package/src/memory/migrations/index.ts +17 -0
  224. package/src/memory/migrations/registry.ts +33 -0
  225. package/src/memory/schema/conversations.ts +1 -1
  226. package/src/memory/schema/infrastructure.ts +21 -0
  227. package/src/memory/tool-usage-store.ts +36 -8
  228. package/src/memory/v2/__tests__/consolidation-job.test.ts +1 -0
  229. package/src/memory/v2/__tests__/harness-compare.test.ts +186 -0
  230. package/src/memory/v2/__tests__/harness-metrics.test.ts +74 -0
  231. package/src/memory/v2/__tests__/harness-oracle.test.ts +257 -0
  232. package/src/memory/v2/__tests__/harness-replay-input.test.ts +225 -0
  233. package/src/memory/v2/__tests__/harness-runner.test.ts +109 -0
  234. package/src/memory/v2/__tests__/injection.test.ts +127 -98
  235. package/src/memory/v2/__tests__/qdrant.test.ts +36 -0
  236. package/src/memory/v2/__tests__/router.test.ts +171 -3
  237. package/src/memory/v2/harness/compare.ts +57 -0
  238. package/src/memory/v2/harness/metrics.ts +124 -0
  239. package/src/memory/v2/harness/oracle.ts +145 -0
  240. package/src/memory/v2/harness/replay-input.ts +224 -0
  241. package/src/memory/v2/harness/retriever.ts +74 -0
  242. package/src/memory/v2/harness/router-retriever.ts +43 -0
  243. package/src/memory/v2/harness/runner.ts +106 -0
  244. package/src/memory/v2/harness/trace.ts +58 -0
  245. package/src/memory/v2/injection.ts +21 -15
  246. package/src/memory/v2/prompts/router.ts +26 -1
  247. package/src/memory/v2/qdrant.ts +14 -2
  248. package/src/memory/v2/router.ts +171 -18
  249. package/src/memory/v3/__tests__/coactivation-store.test.ts +422 -0
  250. package/src/memory/v3/__tests__/consolidation-job.test.ts +468 -0
  251. package/src/memory/v3/__tests__/edge-learning-job.test.ts +324 -0
  252. package/src/memory/v3/__tests__/edges.test.ts +563 -0
  253. package/src/memory/v3/__tests__/filter.test.ts +512 -0
  254. package/src/memory/v3/__tests__/gate.test.ts +574 -0
  255. package/src/memory/v3/__tests__/index-composition.test.ts +233 -0
  256. package/src/memory/v3/__tests__/loop.test.ts +530 -0
  257. package/src/memory/v3/__tests__/retriever.test.ts +226 -0
  258. package/src/memory/v3/__tests__/scouts.test.ts +440 -0
  259. package/src/memory/v3/__tests__/shadow-middleware.test.ts +312 -0
  260. package/src/memory/v3/__tests__/system-prompts.test.ts +154 -0
  261. package/src/memory/v3/__tests__/traversal.test.ts +469 -0
  262. package/src/memory/v3/__tests__/tree-index.test.ts +280 -0
  263. package/src/memory/v3/__tests__/tree-store.test.ts +529 -0
  264. package/src/memory/v3/__tests__/tree-walk.test.ts +707 -0
  265. package/src/memory/v3/__tests__/validate.test.ts +245 -0
  266. package/src/memory/v3/auto-edges.ts +223 -0
  267. package/src/memory/v3/coactivation-store.ts +124 -0
  268. package/src/memory/v3/consolidation-job.ts +323 -0
  269. package/src/memory/v3/edge-learning-job.ts +160 -0
  270. package/src/memory/v3/edges.ts +249 -0
  271. package/src/memory/v3/filter.ts +281 -0
  272. package/src/memory/v3/gate.ts +334 -0
  273. package/src/memory/v3/index-composition.ts +113 -0
  274. package/src/memory/v3/llm-capture.ts +46 -0
  275. package/src/memory/v3/loop.ts +382 -0
  276. package/src/memory/v3/maintenance.ts +144 -0
  277. package/src/memory/v3/prompt-context.ts +33 -0
  278. package/src/memory/v3/prompts/consolidation.ts +458 -0
  279. package/src/memory/v3/prompts/system-prompts.ts +196 -0
  280. package/src/memory/v3/retriever.ts +33 -0
  281. package/src/memory/v3/scouts.ts +420 -0
  282. package/src/memory/v3/shadow-middleware.ts +305 -0
  283. package/src/memory/v3/traversal.ts +206 -0
  284. package/src/memory/v3/tree-index.ts +237 -0
  285. package/src/memory/v3/tree-store.ts +394 -0
  286. package/src/memory/v3/tree-walk.ts +351 -0
  287. package/src/memory/v3/types.ts +65 -0
  288. package/src/memory/v3/validate.ts +300 -0
  289. package/src/notifications/adapters/macos.ts +18 -1
  290. package/src/notifications/adapters/platform.ts +1 -1
  291. package/src/notifications/decision-engine.ts +1 -4
  292. package/src/notifications/emit-signal.ts +29 -49
  293. package/src/permissions/prompter.ts +3 -3
  294. package/src/permissions/question-prompter.ts +5 -2
  295. package/src/permissions/secret-prompter.ts +2 -2
  296. package/src/plugin-api/index.ts +4 -0
  297. package/src/plugin-api/types.ts +7 -33
  298. package/src/plugins/defaults/index.ts +6 -0
  299. package/src/plugins/defaults/injectors.ts +18 -11
  300. package/src/plugins/external-plugin-loader.ts +5 -68
  301. package/src/plugins/types.ts +11 -16
  302. package/src/proactive-artifact/aux-message-injector.ts +17 -4
  303. package/src/prompts/__tests__/task-progress-hint-section.test.ts +3 -9
  304. package/src/prompts/persona-resolver.ts +36 -21
  305. package/src/prompts/sections.ts +39 -7
  306. package/src/prompts/system-prompt.ts +50 -185
  307. package/src/prompts/templates/BOOTSTRAP.md +2 -2
  308. package/src/prompts/templates/system-sections.ts +230 -8
  309. package/src/providers/__tests__/connection-model-compat.test.ts +234 -0
  310. package/src/providers/__tests__/retry-callsite.test.ts +85 -5
  311. package/src/providers/anthropic/client.ts +32 -66
  312. package/src/providers/call-site-routing.ts +14 -2
  313. package/src/providers/connection-model-compat.ts +38 -0
  314. package/src/providers/connection-resolution.ts +16 -2
  315. package/src/providers/gemini/client.ts +49 -6
  316. package/src/providers/inference/adapter-factory.ts +3 -0
  317. package/src/providers/minimax/client.ts +106 -0
  318. package/src/providers/model-catalog.ts +43 -0
  319. package/src/providers/model-intents.ts +1 -1
  320. package/src/providers/openai/chat-completions-provider.ts +6 -3
  321. package/src/providers/openai/codex-models.ts +18 -0
  322. package/src/providers/openai/responses-provider.ts +78 -21
  323. package/src/providers/provider-send-message.ts +7 -1
  324. package/src/providers/retry.ts +34 -3
  325. package/src/providers/thinking-config.ts +26 -1
  326. package/src/providers/usage-tracking.ts +2 -0
  327. package/src/runtime/AGENTS.md +2 -2
  328. package/src/runtime/agent-wake.ts +1 -0
  329. package/src/runtime/assistant-event-hub.ts +76 -6
  330. package/src/runtime/auth/route-policy.ts +36 -0
  331. package/src/runtime/btw-sidechain.ts +0 -6
  332. package/src/runtime/http-types.ts +0 -2
  333. package/src/runtime/migrations/vbundle-builder.ts +10 -3
  334. package/src/runtime/pending-interactions.ts +0 -1
  335. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +106 -0
  336. package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +25 -6
  337. package/src/runtime/routes/__tests__/plugins-routes.test.ts +512 -0
  338. package/src/runtime/routes/acp-routes.test.ts +255 -6
  339. package/src/runtime/routes/acp-routes.ts +8 -1
  340. package/src/runtime/routes/avatar-routes.ts +10 -10
  341. package/src/runtime/routes/background-wake-routes.ts +188 -0
  342. package/src/runtime/routes/browser-tabs-routes.ts +200 -0
  343. package/src/runtime/routes/btw-routes.ts +0 -6
  344. package/src/runtime/routes/conversation-cli-routes.ts +1 -1
  345. package/src/runtime/routes/conversation-list-routes.ts +12 -4
  346. package/src/runtime/routes/conversation-management-routes.ts +77 -20
  347. package/src/runtime/routes/conversation-query-routes.ts +142 -36
  348. package/src/runtime/routes/conversation-routes.ts +252 -410
  349. package/src/runtime/routes/conversation-starter-routes.ts +6 -3
  350. package/src/runtime/routes/disk-pressure-routes.ts +1 -1
  351. package/src/runtime/routes/domain-routes.ts +60 -10
  352. package/src/runtime/routes/email-routes.ts +5 -2
  353. package/src/runtime/routes/events-routes.ts +54 -10
  354. package/src/runtime/routes/group-routes.ts +24 -8
  355. package/src/runtime/routes/host-browser-routes.ts +10 -2
  356. package/src/runtime/routes/host-cu-routes.ts +2 -2
  357. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +96 -3
  358. package/src/runtime/routes/index.ts +8 -0
  359. package/src/runtime/routes/inference-profile-session-handler.ts +22 -12
  360. package/src/runtime/routes/inference-profile-session-routes.ts +7 -1
  361. package/src/runtime/routes/llm-call-sites-routes.ts +32 -5
  362. package/src/runtime/routes/memory-item-routes.ts +8 -3
  363. package/src/runtime/routes/memory-v2-routes.ts +215 -5
  364. package/src/runtime/routes/memory-v3-routes.ts +316 -0
  365. package/src/runtime/routes/migration-routes.ts +21 -24
  366. package/src/runtime/routes/plugins-routes.ts +337 -0
  367. package/src/runtime/routes/rename-conversation-routes.ts +6 -2
  368. package/src/runtime/routes/secret-routes.ts +25 -5
  369. package/src/runtime/routes/settings-routes.ts +12 -11
  370. package/src/runtime/routes/slack-channel-routes.ts +5 -4
  371. package/src/runtime/routes/workspace-routes.ts +25 -10
  372. package/src/runtime/sync/resource-sync-events.ts +106 -38
  373. package/src/runtime/sync/sync-publisher.test.ts +49 -0
  374. package/src/runtime/sync/sync-publisher.ts +2 -1
  375. package/src/runtime/verification-outbound-actions.ts +73 -1
  376. package/src/telemetry/types.ts +12 -0
  377. package/src/telemetry/usage-telemetry-reporter.test.ts +48 -0
  378. package/src/telemetry/usage-telemetry-reporter.ts +1 -0
  379. package/src/tools/acp/spawn.test.ts +119 -0
  380. package/src/tools/acp/spawn.ts +15 -2
  381. package/src/tools/apps/definitions.ts +2 -8
  382. package/src/tools/ask-question/ask-question-tool.test.ts +3 -3
  383. package/src/tools/ask-question/ask-question-tool.ts +38 -45
  384. package/src/tools/browser/__tests__/pinned-tabs.test.ts +70 -0
  385. package/src/tools/browser/browser-execution.ts +16 -3
  386. package/src/tools/browser/cdp-client/__tests__/browser-tabs-factory.test.ts +402 -0
  387. package/src/tools/browser/cdp-client/__tests__/types.test.ts +3 -0
  388. package/src/tools/browser/cdp-client/cdp-inspect-client.ts +12 -0
  389. package/src/tools/browser/cdp-client/extension-cdp-client.ts +27 -1
  390. package/src/tools/browser/cdp-client/factory.ts +100 -17
  391. package/src/tools/browser/cdp-client/local-cdp-client.ts +12 -0
  392. package/src/tools/browser/cdp-client/types.ts +65 -0
  393. package/src/tools/browser/pinned-tabs.ts +96 -40
  394. package/src/tools/computer-use/definitions.ts +22 -78
  395. package/src/tools/credential-execution/make-authenticated-request.ts +3 -9
  396. package/src/tools/credential-execution/manage-secure-command-tool.ts +3 -9
  397. package/src/tools/credential-execution/run-authenticated-command.ts +3 -9
  398. package/src/tools/credentials/vault.ts +3 -9
  399. package/src/tools/document/document-tool.ts +59 -0
  400. package/src/tools/execution-target.ts +21 -23
  401. package/src/tools/executor.ts +6 -1
  402. package/src/tools/filesystem/edit.ts +3 -9
  403. package/src/tools/filesystem/list.ts +3 -9
  404. package/src/tools/filesystem/read.ts +3 -9
  405. package/src/tools/filesystem/write.ts +3 -9
  406. package/src/tools/host-filesystem/edit.ts +3 -9
  407. package/src/tools/host-filesystem/read.ts +3 -9
  408. package/src/tools/host-filesystem/transfer.ts +3 -9
  409. package/src/tools/host-filesystem/write.ts +3 -9
  410. package/src/tools/host-terminal/host-shell.ts +3 -9
  411. package/src/tools/mcp/mcp-tool-factory.ts +1 -8
  412. package/src/tools/memory/register.test.ts +1 -1
  413. package/src/tools/memory/register.ts +4 -9
  414. package/src/tools/network/web-fetch.ts +3 -9
  415. package/src/tools/network/web-search.ts +25 -32
  416. package/src/tools/registry.ts +7 -23
  417. package/src/tools/schema-transforms.ts +1 -1
  418. package/src/tools/skills/execute.ts +3 -9
  419. package/src/tools/skills/load.ts +3 -9
  420. package/src/tools/skills/skill-tool-factory.ts +1 -8
  421. package/src/tools/subagent/notify-parent.ts +3 -9
  422. package/src/tools/system/request-permission.ts +3 -9
  423. package/src/tools/terminal/shell.ts +3 -9
  424. package/src/tools/tool-defaults.ts +94 -0
  425. package/src/tools/types.ts +27 -98
  426. package/src/tools/ui-surface/definitions.ts +6 -22
  427. package/src/usage/pricing.ts +23 -0
  428. package/src/usage/types.ts +12 -0
  429. package/src/util/logger.ts +16 -7
  430. package/src/util/platform.ts +7 -2
  431. package/src/util/sqlite3-runtime.ts +65 -0
  432. package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +1 -0
  433. package/src/workspace/migrations/089-move-memory-tree-out-of-v3.ts +86 -0
  434. package/src/workspace/migrations/registry.ts +2 -0
  435. package/src/__tests__/compaction-strip-metadata-clear.test.ts +0 -206
  436. package/src/__tests__/message-complete-display-id.test.ts +0 -175
  437. package/src/daemon/query-complexity-router.ts +0 -75
  438. package/src/prompts/cache-boundary.ts +0 -8
@@ -53,14 +53,13 @@ import {
53
53
  getConversation,
54
54
  getConversationOriginChannel,
55
55
  getConversationOverrideProfileFromRow,
56
- setConversationCleanedAt,
56
+ setConversationHistoryStrippedAt,
57
57
  } from "../memory/conversation-crud.js";
58
58
  import { ConversationGraphMemory } from "../memory/graph/conversation-graph-memory.js";
59
59
  import { shouldExposePersonalMemory } from "../memory/v2/static-context.js";
60
60
  import { PermissionPrompter } from "../permissions/prompter.js";
61
61
  import { SecretPrompter } from "../permissions/secret-prompter.js";
62
62
  import type { UserDecision } from "../permissions/types.js";
63
- import { resolvePersonaContext } from "../prompts/persona-resolver.js";
64
63
  import { buildSystemPrompt } from "../prompts/system-prompt.js";
65
64
  import type { Message } from "../providers/types.js";
66
65
  import type { Provider } from "../providers/types.js";
@@ -492,19 +491,12 @@ export class Conversation {
492
491
  const resolved: ResolvedSystemPrompt = {
493
492
  systemPrompt: this.hasSystemPromptOverride
494
493
  ? systemPrompt
495
- : (() => {
496
- const persona = resolvePersonaContext(
497
- this.currentTurnTrustContext,
498
- this.currentTurnChannelCapabilities,
499
- );
500
- return buildSystemPrompt({
501
- hasNoClient: this.hasNoClient,
502
- userPersona: persona.userPersona,
503
- channelPersona: persona.channelPersona,
504
- userSlug: persona.userSlug,
505
- onboardingContext: this.getOnboardingContext(),
506
- });
507
- })(),
494
+ : buildSystemPrompt({
495
+ hasNoClient: this.hasNoClient,
496
+ trustContext: this.currentTurnTrustContext,
497
+ channelCapabilities: this.currentTurnChannelCapabilities,
498
+ onboardingContext: this.getOnboardingContext(),
499
+ }),
508
500
  };
509
501
  if (configuredMaxTokens !== undefined) {
510
502
  resolved.maxTokens = configuredMaxTokens;
@@ -583,19 +575,12 @@ export class Conversation {
583
575
 
584
576
  const systemPrompt = this.hasSystemPromptOverride
585
577
  ? this.systemPrompt
586
- : (() => {
587
- const persona = resolvePersonaContext(
588
- this.currentTurnTrustContext,
589
- this.currentTurnChannelCapabilities,
590
- );
591
- return buildSystemPrompt({
592
- hasNoClient: this.hasNoClient,
593
- userPersona: persona.userPersona,
594
- channelPersona: persona.channelPersona,
595
- userSlug: persona.userSlug,
596
- onboardingContext: this.getOnboardingContext(),
597
- });
598
- })();
578
+ : buildSystemPrompt({
579
+ hasNoClient: this.hasNoClient,
580
+ trustContext: this.currentTurnTrustContext,
581
+ channelCapabilities: this.currentTurnChannelCapabilities,
582
+ onboardingContext: this.getOnboardingContext(),
583
+ });
599
584
  const tools = buildToolDefinitions();
600
585
  const provider = this.provider;
601
586
 
@@ -1155,7 +1140,7 @@ export class Conversation {
1155
1140
  this.messages = stripped;
1156
1141
  await this.graphMemory.onCompacted(0);
1157
1142
  this.pendingPostCompactReinject = true;
1158
- setConversationCleanedAt(this.conversationId, Date.now());
1143
+ setConversationHistoryStrippedAt(this.conversationId, Date.now());
1159
1144
  const estimatedInputTokens = this.contextWindowManager.estimateInputTokens(
1160
1145
  this.messages,
1161
1146
  );
@@ -6,6 +6,7 @@ import { cancelBackgroundTools } from "../tools/background-tool-registry.js";
6
6
  import { getDiskUsageInfo } from "../util/disk-usage.js";
7
7
  import { getLogger } from "../util/logger.js";
8
8
 
9
+ export const DISK_PRESSURE_WARNING_THRESHOLD_PERCENT = 80;
9
10
  export const DISK_PRESSURE_THRESHOLD_PERCENT = 95;
10
11
  export const DISK_PRESSURE_CHECK_INTERVAL_MS = 60_000;
11
12
  export const DISK_PRESSURE_OVERRIDE_CONFIRMATION = "I understand the risks";
@@ -15,7 +16,7 @@ export const DISK_PRESSURE_BLOCKED_CAPABILITIES = [
15
16
  "remote-ingress",
16
17
  ] as const;
17
18
 
18
- export type DiskPressureState = "disabled" | "ok" | "critical" | "unknown";
19
+ export type DiskPressureState = "disabled" | "ok" | "warning" | "critical" | "unknown";
19
20
 
20
21
  export type DiskPressureBlockedCapability =
21
22
  (typeof DISK_PRESSURE_BLOCKED_CAPABILITIES)[number];
@@ -229,9 +230,10 @@ export function evaluateDiskPressureNow(): DiskPressureStatus {
229
230
  (usageInfo.usedMb / usageInfo.totalMb) * 100,
230
231
  );
231
232
  const isCritical = usagePercent >= DISK_PRESSURE_THRESHOLD_PERCENT;
233
+ const isWarning = !isCritical && usagePercent >= DISK_PRESSURE_WARNING_THRESHOLD_PERCENT;
232
234
  const lastCheckedAt = new Date().toISOString();
233
235
 
234
- if (!isCritical) {
236
+ if (!isCritical && !isWarning) {
235
237
  return replaceStatus({
236
238
  ...OPEN_STATUS,
237
239
  usagePercent,
@@ -240,6 +242,16 @@ export function evaluateDiskPressureNow(): DiskPressureStatus {
240
242
  });
241
243
  }
242
244
 
245
+ if (isWarning) {
246
+ return replaceStatus({
247
+ ...OPEN_STATUS,
248
+ state: "warning",
249
+ usagePercent,
250
+ path: usageInfo.path,
251
+ lastCheckedAt,
252
+ });
253
+ }
254
+
243
255
  if (!state.status.locked) {
244
256
  cancelTerminalBackgroundToolsForLock();
245
257
  }
@@ -70,6 +70,7 @@ describe("projectProviderForWire", () => {
70
70
  "gemini-3.1-pro-preview-customtools",
71
71
  "gemini-3-flash-preview",
72
72
  "gemini-3.1-flash-lite-preview",
73
+ "gemini-3.1-flash-lite",
73
74
  ];
74
75
 
75
76
  expect(modelIds.filter((id) => id.startsWith("gemini-3"))).toEqual(
@@ -36,7 +36,15 @@ export function handleConfirmationResponse(msg: ConfirmationResponse): void {
36
36
  undefined,
37
37
  { source: "button" },
38
38
  );
39
- pendingInteractions.resolve(msg.requestId);
39
+ // Idempotent cleanup: the prompter's `resolveConfirmation` already
40
+ // resolved the interaction with the correct approved/rejected state
41
+ // before we reach here, so the entry is typically gone. This call is
42
+ // a safety net for paths where the prompter no-ops; map decision to
43
+ // state to keep the emitted event accurate when it does fire.
44
+ pendingInteractions.resolve(
45
+ msg.requestId,
46
+ decision === "allow" ? "approved" : "rejected",
47
+ );
40
48
  return;
41
49
  }
42
50
  }
@@ -49,13 +57,13 @@ export function handleConfirmationResponse(msg: ConfirmationResponse): void {
49
57
  /**
50
58
  * Clear all conversations and DB conversations. Returns the number of conversations cleared.
51
59
  */
52
- export function clearAllConversations(): number {
60
+ export async function clearAllConversations(): Promise<number> {
53
61
  const cleared = clearAllActiveConversations();
54
62
  // Also clear DB conversations. When a new local connection triggers
55
63
  // sendInitialConversation, it auto-creates a conversation if none exist.
56
64
  // Without this DB clear, that auto-created row survives, contradicting
57
65
  // the "clear all conversations" intent.
58
- clearAll();
66
+ await clearAll();
59
67
  return cleared;
60
68
  }
61
69
 
@@ -185,7 +185,7 @@ export class HostBrowserProxy {
185
185
  let detachAbort: () => void = () => {};
186
186
 
187
187
  const timer = setTimeout(() => {
188
- pendingInteractions.resolve(requestId);
188
+ pendingInteractions.resolve(requestId, "cancelled");
189
189
  log.warn(
190
190
  { requestId, cdpMethod: input.cdpMethod },
191
191
  "Host browser proxy request timed out",
@@ -200,7 +200,7 @@ export class HostBrowserProxy {
200
200
  if (signal) {
201
201
  const onAbort = () => {
202
202
  if (pendingInteractions.get(requestId)) {
203
- pendingInteractions.resolve(requestId);
203
+ pendingInteractions.resolve(requestId, "cancelled");
204
204
  try {
205
205
  broadcastMessage({
206
206
  type: "host_browser_cancel",
@@ -229,7 +229,7 @@ export class HostBrowserProxy {
229
229
 
230
230
  try {
231
231
  if (!preferredClient) {
232
- pendingInteractions.resolve(requestId);
232
+ pendingInteractions.resolve(requestId, "cancelled");
233
233
  reject(
234
234
  new Error(
235
235
  "host_browser send failed: no active extension connection",
@@ -244,7 +244,7 @@ export class HostBrowserProxy {
244
244
  { targetClientId: preferredClient.clientId },
245
245
  );
246
246
  } catch (err) {
247
- pendingInteractions.resolve(requestId);
247
+ pendingInteractions.resolve(requestId, "cancelled");
248
248
  log.warn(
249
249
  { requestId, cdpMethod: input.cdpMethod, err },
250
250
  "Host browser proxy send failed",
@@ -256,7 +256,7 @@ export class HostBrowserProxy {
256
256
 
257
257
  dispose(): void {
258
258
  for (const entry of pendingInteractions.getByKind("host_browser")) {
259
- pendingInteractions.resolve(entry.requestId);
259
+ pendingInteractions.resolve(entry.requestId, "cancelled");
260
260
  try {
261
261
  broadcastMessage({
262
262
  type: "host_browser_cancel",
@@ -195,7 +195,7 @@ export class HostCuProxy {
195
195
 
196
196
  const timer = setTimeout(() => {
197
197
  this._ownedRequests.delete(requestId);
198
- pendingInteractions.resolve(requestId);
198
+ pendingInteractions.resolve(requestId, "cancelled");
199
199
  log.warn({ requestId, toolName }, "Host CU proxy request timed out");
200
200
  resolve({
201
201
  content: "Host CU proxy timed out waiting for client response",
@@ -207,7 +207,7 @@ export class HostCuProxy {
207
207
  const onAbort = () => {
208
208
  if (pendingInteractions.get(requestId)) {
209
209
  this._ownedRequests.delete(requestId);
210
- pendingInteractions.resolve(requestId);
210
+ pendingInteractions.resolve(requestId, "cancelled");
211
211
  try {
212
212
  broadcastMessage(
213
213
  {
@@ -263,7 +263,7 @@ export class HostCuProxy {
263
263
  );
264
264
  } catch (err) {
265
265
  this._ownedRequests.delete(requestId);
266
- pendingInteractions.resolve(requestId);
266
+ pendingInteractions.resolve(requestId, "cancelled");
267
267
  log.warn({ requestId, toolName, err }, "Host CU proxy send failed");
268
268
  reject(err instanceof Error ? err : new Error(String(err)));
269
269
  }
@@ -447,7 +447,7 @@ export class HostCuProxy {
447
447
 
448
448
  dispose(): void {
449
449
  for (const requestId of this._ownedRequests) {
450
- const entry = pendingInteractions.resolve(requestId);
450
+ const entry = pendingInteractions.resolve(requestId, "cancelled");
451
451
  if (!entry) continue;
452
452
  try {
453
453
  broadcastMessage(
@@ -136,7 +136,7 @@ export class HostFileProxy {
136
136
  let detachAbort: () => void = () => {};
137
137
 
138
138
  const timer = setTimeout(() => {
139
- pendingInteractions.resolve(requestId);
139
+ pendingInteractions.resolve(requestId, "cancelled");
140
140
  log.warn(
141
141
  { requestId, operation: input.operation },
142
142
  "Host file proxy request timed out",
@@ -152,7 +152,7 @@ export class HostFileProxy {
152
152
  if (signal) {
153
153
  const onAbort = () => {
154
154
  if (pendingInteractions.get(requestId)) {
155
- pendingInteractions.resolve(requestId);
155
+ pendingInteractions.resolve(requestId, "cancelled");
156
156
  try {
157
157
  broadcastMessage(
158
158
  {
@@ -210,7 +210,7 @@ export class HostFileProxy {
210
210
  { targetClientId: resolvedTargetClientId },
211
211
  );
212
212
  } catch (err) {
213
- pendingInteractions.resolve(requestId);
213
+ pendingInteractions.resolve(requestId, "cancelled");
214
214
  log.warn(
215
215
  { requestId, operation: input.operation, err },
216
216
  "Host file proxy send failed",
@@ -252,7 +252,7 @@ export class HostFileProxy {
252
252
 
253
253
  dispose(): void {
254
254
  for (const entry of pendingInteractions.getByKind("host_file")) {
255
- pendingInteractions.resolve(entry.requestId);
255
+ pendingInteractions.resolve(entry.requestId, "cancelled");
256
256
  try {
257
257
  broadcastMessage(
258
258
  {
@@ -154,7 +154,7 @@ export abstract class HostProxyBase<TRequest, TResultPayload> {
154
154
  const timer = setTimeout(() => {
155
155
  this.pending.delete(requestId);
156
156
  detachAbort();
157
- pendingInteractions.resolve(requestId);
157
+ pendingInteractions.resolve(requestId, "cancelled");
158
158
  log.warn(
159
159
  { requestId, toolName, kind: this.resultPendingKind },
160
160
  "Host proxy request timed out",
@@ -168,7 +168,7 @@ export abstract class HostProxyBase<TRequest, TResultPayload> {
168
168
  clearTimeout(timer);
169
169
  this.pending.delete(requestId);
170
170
  detachAbort();
171
- pendingInteractions.resolve(requestId);
171
+ pendingInteractions.resolve(requestId, "cancelled");
172
172
  try {
173
173
  broadcastDynamic(
174
174
  {
@@ -239,7 +239,7 @@ export abstract class HostProxyBase<TRequest, TResultPayload> {
239
239
  clearTimeout(timer);
240
240
  this.pending.delete(requestId);
241
241
  detachAbort();
242
- pendingInteractions.resolve(requestId);
242
+ pendingInteractions.resolve(requestId, "cancelled");
243
243
  log.warn(
244
244
  { requestId, toolName, kind: this.resultPendingKind, err },
245
245
  "Host proxy send failed",
@@ -285,7 +285,7 @@ export abstract class HostProxyBase<TRequest, TResultPayload> {
285
285
  for (const [requestId, entry] of this.pending) {
286
286
  clearTimeout(entry.timer);
287
287
  entry.detachAbort();
288
- pendingInteractions.resolve(requestId);
288
+ pendingInteractions.resolve(requestId, "cancelled");
289
289
  try {
290
290
  broadcastDynamic(
291
291
  {
@@ -205,7 +205,7 @@ export class HostTransferProxy {
205
205
 
206
206
  const timer = setTimeout(() => {
207
207
  this.transfers.delete(transferId);
208
- pendingInteractions.resolve(requestId);
208
+ pendingInteractions.resolve(requestId, "cancelled");
209
209
  log.warn(
210
210
  { requestId, transferId, direction: "to_host" },
211
211
  "Host transfer proxy request timed out",
@@ -222,7 +222,7 @@ export class HostTransferProxy {
222
222
  const onAbort = () => {
223
223
  if (pendingInteractions.get(requestId)) {
224
224
  this.transfers.delete(transferId);
225
- pendingInteractions.resolve(requestId);
225
+ pendingInteractions.resolve(requestId, "cancelled");
226
226
  try {
227
227
  broadcastMessage(
228
228
  {
@@ -301,7 +301,7 @@ export class HostTransferProxy {
301
301
  );
302
302
  } catch (err) {
303
303
  this.transfers.delete(transferId);
304
- pendingInteractions.resolve(requestId);
304
+ pendingInteractions.resolve(requestId, "cancelled");
305
305
  log.warn(
306
306
  { requestId, transferId, err },
307
307
  "Host transfer proxy send failed",
@@ -396,7 +396,7 @@ export class HostTransferProxy {
396
396
 
397
397
  const timer = setTimeout(() => {
398
398
  this.transfers.delete(transferId);
399
- pendingInteractions.resolve(requestId);
399
+ pendingInteractions.resolve(requestId, "cancelled");
400
400
  log.warn(
401
401
  { requestId, transferId, direction: "to_sandbox" },
402
402
  "Host transfer proxy request timed out",
@@ -413,7 +413,7 @@ export class HostTransferProxy {
413
413
  const onAbort = () => {
414
414
  if (pendingInteractions.get(requestId)) {
415
415
  this.transfers.delete(transferId);
416
- pendingInteractions.resolve(requestId);
416
+ pendingInteractions.resolve(requestId, "cancelled");
417
417
  try {
418
418
  broadcastMessage(
419
419
  {
@@ -487,7 +487,7 @@ export class HostTransferProxy {
487
487
  );
488
488
  } catch (err) {
489
489
  this.transfers.delete(transferId);
490
- pendingInteractions.resolve(requestId);
490
+ pendingInteractions.resolve(requestId, "cancelled");
491
491
  log.warn(
492
492
  { requestId, transferId, err },
493
493
  "Host transfer proxy send failed",
@@ -622,14 +622,14 @@ export class HostTransferProxy {
622
622
 
623
623
  if (entry.overwrite !== true && existsSync(entry.filePath)) {
624
624
  const errorMsg = `Destination file already exists: ${entry.filePath}. Set overwrite to true to replace it.`;
625
- const interaction = pendingInteractions.resolve(requestId);
625
+ const interaction = pendingInteractions.resolve(requestId, "answered");
626
626
  this.transfers.delete(transferId);
627
627
  interaction?.rpcResolve?.({ content: errorMsg, isError: true });
628
628
  return { accepted: false, error: errorMsg };
629
629
  }
630
630
 
631
631
  const cleanup = () => {
632
- pendingInteractions.resolve(requestId);
632
+ pendingInteractions.resolve(requestId, "answered");
633
633
  this.transfers.delete(transferId);
634
634
  };
635
635
 
@@ -662,7 +662,7 @@ export class HostTransferProxy {
662
662
  if (!interaction) return;
663
663
  const transferId = interaction.metadata?.transferId as string | undefined;
664
664
  if (transferId) this.transfers.delete(transferId);
665
- pendingInteractions.resolve(requestId);
665
+ pendingInteractions.resolve(requestId, "cancelled");
666
666
  try {
667
667
  broadcastMessage(
668
668
  {
@@ -718,7 +718,7 @@ export class HostTransferProxy {
718
718
  for (const entry of pendingInteractions.getByKind("host_transfer")) {
719
719
  const transferId = entry.metadata?.transferId as string | undefined;
720
720
  if (transferId) this.transfers.delete(transferId);
721
- pendingInteractions.resolve(entry.requestId);
721
+ pendingInteractions.resolve(entry.requestId, "cancelled");
722
722
  try {
723
723
  broadcastMessage(
724
724
  {
@@ -2,6 +2,7 @@ import { join } from "node:path";
2
2
 
3
3
  import { config as dotenvConfig } from "dotenv";
4
4
 
5
+ import { registerBackgroundWakeRuntime } from "../background-wake/runtime-registry.js";
5
6
  import { setPointerMessageProcessor } from "../calls/call-pointer-messages.js";
6
7
  import { reconcileCallsOnStartup } from "../calls/call-recovery.js";
7
8
  import { setRelayBroadcast } from "../calls/relay-server.js";
@@ -35,6 +36,10 @@ import { HeartbeatService } from "../heartbeat/heartbeat-service.js";
35
36
  import { startHomeContentRefresh } from "../home/home-content-refresh.js";
36
37
  import { backfillRelationshipStateIfMissing } from "../home/relationship-state-writer.js";
37
38
  import { closeSentry, initSentry, setSentryDeviceId } from "../instrument.js";
39
+ import {
40
+ startGatewayFlagListener,
41
+ stopGatewayFlagListener,
42
+ } from "../ipc/gateway-flag-listener.js";
38
43
  import { getMcpServerManager } from "../mcp/manager.js";
39
44
  import {
40
45
  getAttachmentsByIds,
@@ -45,16 +50,13 @@ import { deleteMessageById, getMessages } from "../memory/conversation-crud.js";
45
50
  import { getDb } from "../memory/db-connection.js";
46
51
  import { initializeDb } from "../memory/db-init.js";
47
52
  import { selectEmbeddingBackend } from "../memory/embedding-backend.js";
48
- import { enqueueMemoryJob } from "../memory/jobs-store.js";
53
+ import { enqueueMemoryJob, isMemoryEnabled } from "../memory/jobs-store.js";
49
54
  import { startMemoryJobsWorker } from "../memory/jobs-worker.js";
50
55
  import { initQdrantClient, resolveQdrantUrl } from "../memory/qdrant-client.js";
51
56
  import { QdrantManager } from "../memory/qdrant-manager.js";
52
57
  import { rotateToolInvocations } from "../memory/tool-usage-store.js";
53
58
  import { sweepConceptPageFrontmatter } from "../memory/v2/frontmatter-sweep.js";
54
- import {
55
- emitNotificationSignal,
56
- registerBroadcastFn,
57
- } from "../notifications/emit-signal.js";
59
+ import { emitNotificationSignal } from "../notifications/emit-signal.js";
58
60
  import { backfillManualTokenConnections } from "../oauth/manual-token-connection.js";
59
61
  import { seedOAuthProviders } from "../oauth/seed-providers.js";
60
62
  import { installPluginRuntime } from "../plugins/external-api.js";
@@ -358,6 +360,8 @@ export async function runDaemon(): Promise<void> {
358
360
  log.warn({ err }, "Background feature flag init failed"),
359
361
  );
360
362
 
363
+ startGatewayFlagListener();
364
+
361
365
  log.info("Daemon startup: initializing DB");
362
366
  ensurePromptFiles();
363
367
 
@@ -539,11 +543,12 @@ export async function runDaemon(): Promise<void> {
539
543
  }
540
544
  } // end if (dbReady)
541
545
 
542
- // Populate the managed-connection cache so buildIntegrationSection()
543
- // can include platform-managed OAuth connections (e.g. Twitter) in the
544
- // system prompt's "Connected Services" section from the first turn.
545
- // This is an HTTP-only call with no DB dependency, so it runs regardless
546
- // of dbReady. A periodic refresh keeps the cache current when users
546
+ // Populate the managed-connection cache so the `14-connected-services`
547
+ // bundled section (rendered by `renderConnectedServices()` in
548
+ // system-sections.ts) can include platform-managed OAuth connections
549
+ // (e.g. Twitter) in the system prompt from the first turn. This is
550
+ // an HTTP-only call with no DB dependency, so it runs regardless of
551
+ // dbReady. A periodic refresh keeps the cache current when users
547
552
  // connect/disconnect managed providers while the assistant is running.
548
553
  void refreshManagedConnectionCache().catch((err) =>
549
554
  log.warn(
@@ -836,7 +841,7 @@ export async function runDaemon(): Promise<void> {
836
841
  // If a destructive migration occurred, enqueue a rebuild_index job
837
842
  // to re-embed all memory items from the SQLite cache.
838
843
  const { migrated } = await qdrantClient.ensureCollection();
839
- if (migrated) {
844
+ if (migrated && isMemoryEnabled()) {
840
845
  enqueueMemoryJob("rebuild_index", {});
841
846
  log.info(
842
847
  "Qdrant collection was migrated — enqueued rebuild_index job",
@@ -934,10 +939,6 @@ export async function runDaemon(): Promise<void> {
934
939
  registerWatcherProviders();
935
940
  registerMessagingProviders();
936
941
 
937
- // Register the broadcast function for the notification signal pipeline's
938
- // macOS adapter so it can deliver notification_intent messages to clients.
939
- registerBroadcastFn((msg) => broadcastMessage(msg));
940
-
941
942
  try {
942
943
  recoverStaleSchedules();
943
944
  } catch (err) {
@@ -1270,11 +1271,11 @@ export async function runDaemon(): Promise<void> {
1270
1271
  })();
1271
1272
 
1272
1273
  if (config.auditLog.retentionDays > 0) {
1273
- try {
1274
- rotateToolInvocations(config.auditLog.retentionDays);
1275
- } catch (err) {
1276
- log.warn({ err }, "Audit log rotation failed");
1277
- }
1274
+ void rotateToolInvocations(config.auditLog.retentionDays).catch(
1275
+ (err) => {
1276
+ log.warn({ err }, "Audit log rotation failed");
1277
+ },
1278
+ );
1278
1279
  }
1279
1280
 
1280
1281
  const workspaceHeartbeat = new WorkspaceHeartbeatService();
@@ -1291,6 +1292,7 @@ export async function runDaemon(): Promise<void> {
1291
1292
  }),
1292
1293
  });
1293
1294
  heartbeat.start();
1295
+ registerBackgroundWakeRuntime({ scheduler, heartbeat });
1294
1296
  log.info(
1295
1297
  {
1296
1298
  enabled: heartbeatConfig.enabled,
@@ -1347,6 +1349,7 @@ export async function runDaemon(): Promise<void> {
1347
1349
  mcpManager,
1348
1350
  telemetryReporter,
1349
1351
  cleanupPidFile: () => {
1352
+ stopGatewayFlagListener();
1350
1353
  stopDiskPressureGuardForLifecycle();
1351
1354
  cleanupPidFile();
1352
1355
  },
@@ -44,7 +44,6 @@ import type {
44
44
  ExecutionTarget,
45
45
  Tool,
46
46
  ToolContext,
47
- ToolDefinition,
48
47
  } from "../tools/types.js";
49
48
  import { RiskLevel } from "../tools/types.js";
50
49
  import { getLogger } from "../util/logger.js";
@@ -132,15 +131,11 @@ function buildProxyTool(
132
131
  supervisor: MeetHostSupervisor,
133
132
  manifestHash: string,
134
133
  ): Tool {
135
- const definition: ToolDefinition = {
136
- name: entry.name,
137
- description: entry.description,
138
- input_schema: (entry.input_schema as object) ?? {},
139
- };
140
134
  const risk = coerceRiskLevel(entry.risk, entry.name);
141
135
  return {
142
136
  name: entry.name,
143
137
  description: entry.description,
138
+ input_schema: (entry.input_schema as object) ?? {},
144
139
  category: entry.category,
145
140
  defaultRiskLevel: risk,
146
141
  executionMode: "proxy",
@@ -149,7 +144,6 @@ function buildProxyTool(
149
144
  ownerSkillId: MEET_SKILL_ID,
150
145
  ownerSkillBundled: true,
151
146
  ownerSkillVersionHash: manifestHash,
152
- getDefinition: () => definition,
153
147
  execute: async (input, context) => {
154
148
  // `dispatchTool` ensures the meet-host child is up + connected
155
149
  // before sending the frame, so callers don't need a separate
@@ -321,14 +321,12 @@ export interface GenerationHandoff {
321
321
  queuedCount: number;
322
322
  attachments?: UserMessageAttachment[];
323
323
  attachmentWarnings?: string[];
324
- /** Database ID of the final persisted assistant row, if any. */
325
- messageId?: string;
326
324
  /**
327
- * Database ID used by clients for the rendered assistant bubble. Tool turns
328
- * may persist multiple assistant rows; this matches the history row that
329
- * survives query-time merging.
325
+ * Database ID of the completed assistant turn the id that survives
326
+ * query-time merging when a turn persists multiple assistant rows. Matches
327
+ * the row the messages route returns.
330
328
  */
331
- displayMessageId?: string;
329
+ messageId?: string;
332
330
  }
333
331
 
334
332
  export interface ModelInfo {
@@ -404,10 +402,8 @@ export interface HistoryResponse {
404
402
  type: "history_response";
405
403
  conversationId: string;
406
404
  messages: Array<{
407
- /** Database ID used by clients for the rendered message bubble. */
405
+ /** Database ID used by clients for the rendered message. */
408
406
  id?: string;
409
- /** Concrete persisted row ID for row-scoped actions such as TTS/fork. */
410
- daemonMessageId?: string;
411
407
  role: string;
412
408
  text: string;
413
409
  timestamp: number;
@@ -556,6 +552,7 @@ export type ConversationErrorCode =
556
552
  | "PROVIDER_INVALID_KEY"
557
553
  | "MANAGED_KEY_INVALID"
558
554
  | "CONTEXT_TOO_LARGE"
555
+ | "BUDGET_YIELD_UNRECOVERED"
559
556
  | "CONVERSATION_ABORTED"
560
557
  | "CONVERSATION_PROCESSING_FAILED"
561
558
  | "DISK_SPACE_CRITICAL"
@@ -7,19 +7,7 @@
7
7
  * just enough metadata to invalidate a cache and trigger a refetch.
8
8
  */
9
9
 
10
- /**
11
- * Broadcast after the daemon successfully writes a fresh
12
- * `relationship-state.json` snapshot to disk. Subscribers should
13
- * refetch `GET /v1/home/state` to read the new state.
14
- *
15
- * Only emitted on the success branch of the writer — if the
16
- * underlying `writeFileSync` throws, this event is NOT published.
17
- */
18
- export interface RelationshipStateUpdated {
19
- type: "relationship_state_updated";
20
- /** ISO-8601 timestamp of the newly-written state's `updatedAt` field. */
21
- updatedAt: string;
22
- }
10
+ import type { RelationshipStateUpdated } from "../../events/relationship-state-updated.js";
23
11
 
24
12
  /**
25
13
  * Broadcast after the daemon successfully writes a fresh home activity
@@ -304,14 +304,12 @@ export interface MessageComplete {
304
304
  conversationId?: string;
305
305
  attachments?: UserMessageAttachment[];
306
306
  attachmentWarnings?: string[];
307
- /** Database ID of the final persisted assistant row, if any. */
308
- messageId?: string;
309
307
  /**
310
- * Database ID used by clients for the rendered assistant bubble. Tool turns
311
- * may persist multiple assistant rows; this matches the history row that
312
- * survives query-time merging.
308
+ * Database ID of the completed assistant turn the id that survives
309
+ * query-time merging when a turn persists multiple assistant rows. Matches
310
+ * the row the messages route returns.
313
311
  */
314
- displayMessageId?: string;
312
+ messageId?: string;
315
313
  /**
316
314
  * Distinguishes a real main-turn completion from auxiliary events such as
317
315
  * call transcripts, call summaries, and watch notifier outputs. Clients
@@ -426,17 +424,11 @@ export type InteractionResolutionState =
426
424
  export interface InteractionResolved {
427
425
  type: "interaction_resolved";
428
426
  requestId: string;
429
- /**
430
- * Conversation key for the interaction. The daemon's internal conversation
431
- * id and the web client's conversation key coincide today (see
432
- * `conversation-key-store.ts`); the field is named after the client-facing
433
- * concept.
434
- */
435
- conversationKey: string;
427
+ /** Conversation id the interaction belongs to. */
428
+ conversationId: string;
436
429
  state: InteractionResolutionState;
437
430
  /** Kind of the resolved interaction (e.g. "confirmation", "secret", "host_bash"). */
438
431
  kind: string;
439
- conversationId?: string;
440
432
  }
441
433
 
442
434
  /**