@vellumai/assistant 0.8.6 → 0.8.7

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 (891) hide show
  1. package/AGENTS.md +4 -4
  2. package/Dockerfile +1 -0
  3. package/bun.lock +11 -2
  4. package/docker-entrypoint.sh +8 -6
  5. package/docs/plugins.md +63 -28
  6. package/examples/plugins/echo/register.ts +4 -7
  7. package/knip.json +1 -0
  8. package/node_modules/@vellumai/environments/bun.lock +24 -0
  9. package/node_modules/@vellumai/environments/package.json +18 -0
  10. package/node_modules/@vellumai/environments/src/__tests__/package-boundary.test.ts +95 -0
  11. package/node_modules/@vellumai/environments/src/index.ts +11 -0
  12. package/node_modules/@vellumai/environments/src/seeds.ts +73 -0
  13. package/node_modules/@vellumai/environments/src/types.ts +70 -0
  14. package/node_modules/@vellumai/environments/tsconfig.json +20 -0
  15. package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +11 -0
  16. package/node_modules/@vellumai/skill-host-contracts/src/client.ts +3 -4
  17. package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +6 -2
  18. package/openapi.yaml +3735 -353
  19. package/package.json +7 -3
  20. package/scripts/generate-openapi.ts +20 -13
  21. package/src/__tests__/agent-loop-callsite-precedence.test.ts +42 -80
  22. package/src/__tests__/agent-loop-exit-reason.test.ts +240 -39
  23. package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +141 -0
  24. package/src/__tests__/agent-loop-override-profile.test.ts +19 -32
  25. package/src/__tests__/agent-loop-provider-error-recording.test.ts +6 -4
  26. package/src/__tests__/agent-loop-thinking.test.ts +17 -12
  27. package/src/__tests__/agent-loop.test.ts +207 -341
  28. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +4 -2
  29. package/src/__tests__/agent-wake-override-profile.test.ts +22 -40
  30. package/src/__tests__/anthropic-provider.test.ts +201 -55
  31. package/src/__tests__/app-builder-skill-instructions.test.ts +22 -0
  32. package/src/__tests__/app-control-flow.test.ts +5 -0
  33. package/src/__tests__/approval-cascade.test.ts +4 -11
  34. package/src/__tests__/approval-routes-http.test.ts +4 -2
  35. package/src/__tests__/assistant-event.test.ts +15 -0
  36. package/src/__tests__/assistant-feature-flags-integration.test.ts +2 -2
  37. package/src/__tests__/avatar-e2e.test.ts +7 -37
  38. package/src/__tests__/avatar-generator.test.ts +12 -42
  39. package/src/__tests__/avatar-identity-sync.test.ts +28 -3
  40. package/src/__tests__/background-shell-bash.test.ts +3 -7
  41. package/src/__tests__/btw-routes.test.ts +7 -12
  42. package/src/__tests__/call-pointer-messages.test.ts +5 -3
  43. package/src/__tests__/call-site-routing-provider.test.ts +22 -40
  44. package/src/__tests__/catalog-files.test.ts +1 -0
  45. package/src/__tests__/channel-approval-routes.test.ts +48 -20
  46. package/src/__tests__/channel-approvals.test.ts +3 -1
  47. package/src/__tests__/channel-invite-transport.test.ts +1 -5
  48. package/src/__tests__/channel-readiness-routes.test.ts +0 -4
  49. package/src/__tests__/channel-readiness-slack-remote.test.ts +2 -7
  50. package/src/__tests__/channel-retry-sweep.test.ts +71 -79
  51. package/src/__tests__/circuit-breaker-pipeline.test.ts +3 -3
  52. package/src/__tests__/clawhub-files.test.ts +1 -0
  53. package/src/__tests__/compaction-events.test.ts +5 -17
  54. package/src/__tests__/compaction-pipeline.test.ts +1 -1
  55. package/src/__tests__/compaction-timeout-recovery.test.ts +37 -48
  56. package/src/__tests__/compaction-trail-store.test.ts +1 -79
  57. package/src/__tests__/compactor-image-manifest-trust.test.ts +112 -0
  58. package/src/__tests__/computer-use-tools.test.ts +2 -2
  59. package/src/__tests__/config-watcher.test.ts +28 -0
  60. package/src/__tests__/context-search-agent-runner.test.ts +6 -3
  61. package/src/__tests__/context-token-estimator.test.ts +34 -0
  62. package/src/__tests__/context-window-manager-compact-retry.test.ts +291 -0
  63. package/src/__tests__/conversation-abort-tool-results.test.ts +14 -7
  64. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +3 -2
  65. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +12 -27
  66. package/src/__tests__/conversation-agent-loop-overflow.test.ts +430 -90
  67. package/src/__tests__/conversation-agent-loop.test.ts +581 -62
  68. package/src/__tests__/conversation-analysis-routes.test.ts +1 -3
  69. package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -1
  70. package/src/__tests__/conversation-clear-safety.test.ts +20 -10
  71. package/src/__tests__/conversation-confirmation-signals.test.ts +15 -45
  72. package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
  73. package/src/__tests__/conversation-disk-view.test.ts +10 -17
  74. package/src/__tests__/conversation-fork-crud.test.ts +86 -172
  75. package/src/__tests__/conversation-fork-route.test.ts +16 -14
  76. package/src/__tests__/conversation-init.benchmark.test.ts +6 -6
  77. package/src/__tests__/conversation-lifecycle.test.ts +3 -2
  78. package/src/__tests__/conversation-load-history-repair.test.ts +3 -2
  79. package/src/__tests__/conversation-load-history-stripped.test.ts +1 -1
  80. package/src/__tests__/conversation-message-sync-tags.test.ts +3 -4
  81. package/src/__tests__/conversation-pairing.test.ts +34 -4
  82. package/src/__tests__/conversation-pre-run-repair.test.ts +1 -1
  83. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +4 -0
  84. package/src/__tests__/conversation-process-callsite.test.ts +27 -30
  85. package/src/__tests__/conversation-provider-retry-repair.test.ts +53 -44
  86. package/src/__tests__/conversation-queue.test.ts +270 -164
  87. package/src/__tests__/conversation-routes-disk-view.test.ts +3 -2
  88. package/src/__tests__/conversation-routes-guardian-reply.test.ts +2 -2
  89. package/src/__tests__/conversation-routes-slash-commands.test.ts +2 -2
  90. package/src/__tests__/conversation-runtime-assembly.test.ts +20 -22
  91. package/src/__tests__/conversation-runtime-workspace.test.ts +19 -1
  92. package/src/__tests__/conversation-slash-queue.test.ts +37 -31
  93. package/src/__tests__/conversation-slash-unknown.test.ts +13 -15
  94. package/src/__tests__/conversation-speed-override.test.ts +8 -22
  95. package/src/__tests__/conversation-stream-state.test.ts +484 -0
  96. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +6 -15
  97. package/src/__tests__/conversation-surfaces-app-control.test.ts +32 -4
  98. package/src/__tests__/conversation-surfaces-state-update.test.ts +5 -2
  99. package/src/__tests__/conversation-surfaces-table-action.test.ts +6 -15
  100. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +23 -11
  101. package/src/__tests__/conversation-unread-route.test.ts +14 -2
  102. package/src/__tests__/conversation-usage.test.ts +0 -2
  103. package/src/__tests__/conversation-wipe.test.ts +1 -1
  104. package/src/__tests__/conversation-workspace-cache-state.test.ts +3 -1
  105. package/src/__tests__/conversation-workspace-injection.test.ts +48 -22
  106. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +27 -7
  107. package/src/__tests__/credential-execution-tools.test.ts +1 -2
  108. package/src/__tests__/credential-security-invariants.test.ts +0 -1
  109. package/src/__tests__/cross-provider-web-search.test.ts +6 -2
  110. package/src/__tests__/cu-unified-flow.test.ts +26 -1
  111. package/src/__tests__/db-schedule-syntax-migration.test.ts +11 -0
  112. package/src/__tests__/disk-pressure-guard.test.ts +66 -0
  113. package/src/__tests__/disk-pressure-routes.test.ts +9 -2
  114. package/src/__tests__/dm-persistence.test.ts +7 -2
  115. package/src/__tests__/dynamic-page-surface.test.ts +68 -0
  116. package/src/__tests__/edit-propagation.test.ts +1 -2
  117. package/src/__tests__/empty-response-pipeline.test.ts +127 -5
  118. package/src/__tests__/filing-service.test.ts +2 -2
  119. package/src/__tests__/first-greeting.test.ts +55 -14
  120. package/src/__tests__/gemini-inline-media.test.ts +78 -0
  121. package/src/__tests__/gemini-provider.test.ts +351 -28
  122. package/src/__tests__/guardian-routing-state.test.ts +60 -71
  123. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +9 -7
  124. package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
  125. package/src/__tests__/heartbeat-service.test.ts +2 -1
  126. package/src/__tests__/history-repair-hook.test.ts +161 -0
  127. package/src/__tests__/history-repair-observability.test.ts +1 -1
  128. package/src/__tests__/history-repair.test.ts +2 -1
  129. package/src/__tests__/host-app-control-proxy.test.ts +2 -0
  130. package/src/__tests__/host-cu-proxy.test.ts +2 -0
  131. package/src/__tests__/host-file-edit-tool.test.ts +4 -2
  132. package/src/__tests__/host-file-proxy.test.ts +31 -0
  133. package/src/__tests__/host-file-read-tool.test.ts +4 -2
  134. package/src/__tests__/host-file-write-tool.test.ts +9 -3
  135. package/src/__tests__/host-proxy-preactivation.test.ts +53 -14
  136. package/src/__tests__/host-shell-tool.test.ts +9 -4
  137. package/src/__tests__/http-user-message-parity.test.ts +2 -2
  138. package/src/__tests__/identity-intro-cache.test.ts +35 -14
  139. package/src/__tests__/inbound-slack-persistence.test.ts +7 -2
  140. package/src/__tests__/injector-background-turn.test.ts +1 -1
  141. package/src/__tests__/injector-chain.test.ts +1 -1
  142. package/src/__tests__/injector-disk-pressure.test.ts +1 -1
  143. package/src/__tests__/injector-document-comments.test.ts +1 -1
  144. package/src/__tests__/injector-pkb-v2-silenced.test.ts +1 -1
  145. package/src/__tests__/injector-v3-suppression.test.ts +220 -0
  146. package/src/__tests__/list-messages-attachments.test.ts +7 -8
  147. package/src/__tests__/list-messages-hidden-metadata.test.ts +17 -15
  148. package/src/__tests__/list-messages-page-latest.test.ts +0 -1
  149. package/src/__tests__/list-messages-tool-merge.test.ts +36 -6
  150. package/src/__tests__/llm-call-pipeline.test.ts +21 -15
  151. package/src/__tests__/llm-request-log-turn-query.test.ts +42 -86
  152. package/src/__tests__/llm-resolver.test.ts +23 -47
  153. package/src/__tests__/llm-usage-store.test.ts +45 -0
  154. package/src/__tests__/log-export-routes.test.ts +59 -0
  155. package/src/__tests__/managed-skill-lifecycle.test.ts +1 -8
  156. package/src/__tests__/mcp-auth-routes.test.ts +15 -10
  157. package/src/__tests__/mcp-health-check.test.ts +18 -13
  158. package/src/__tests__/memory-retrieval-pipeline.test.ts +1 -1
  159. package/src/__tests__/memory-v2-static-injector.test.ts +1 -1
  160. package/src/__tests__/messaging-send-tool.test.ts +8 -4
  161. package/src/__tests__/migration-export-http.test.ts +12 -12
  162. package/src/__tests__/migration-import-commit-http.test.ts +8 -8
  163. package/src/__tests__/migration-import-preflight-http.test.ts +7 -7
  164. package/src/__tests__/migration-validate-http.test.ts +3 -3
  165. package/src/__tests__/native-web-search.test.ts +14 -20
  166. package/src/__tests__/notification-decision-identity.test.ts +9 -18
  167. package/src/__tests__/notification-decision-recipient-context.test.ts +3 -6
  168. package/src/__tests__/oauth-commands-routes.test.ts +1 -1
  169. package/src/__tests__/onboarding-template-contract.test.ts +10 -0
  170. package/src/__tests__/openai-provider.test.ts +66 -70
  171. package/src/__tests__/openai-responses-provider.test.ts +21 -77
  172. package/src/__tests__/outbound-slack-persistence.test.ts +2 -1
  173. package/src/__tests__/overflow-reduce-pipeline.test.ts +2 -4
  174. package/src/__tests__/parallel-tool.benchmark.test.ts +24 -36
  175. package/src/__tests__/persistence-pipeline.test.ts +15 -26
  176. package/src/__tests__/persistence-secret-redaction.test.ts +2 -1
  177. package/src/__tests__/pipeline-runner.test.ts +2 -3
  178. package/src/__tests__/plugin-bootstrap.test.ts +51 -25
  179. package/src/__tests__/plugin-route-contribution.test.ts +6 -16
  180. package/src/__tests__/plugin-skill-contribution.test.ts +7 -17
  181. package/src/__tests__/plugin-tool-contribution.test.ts +10 -26
  182. package/src/__tests__/plugin-types.test.ts +7 -14
  183. package/src/__tests__/prechat-onboarding-contract.test.ts +23 -0
  184. package/src/__tests__/process-message-background-slack.test.ts +17 -16
  185. package/src/__tests__/process-message-display-content.test.ts +30 -42
  186. package/src/__tests__/provider-commit-message-generator.test.ts +19 -14
  187. package/src/__tests__/provider-error-scenarios.test.ts +7 -6
  188. package/src/__tests__/provider-platform-proxy-integration.test.ts +3 -8
  189. package/src/__tests__/provider-send-message-override-profile.test.ts +9 -25
  190. package/src/__tests__/provider-streaming.benchmark.test.ts +12 -22
  191. package/src/__tests__/provider-usage-tracking.test.ts +0 -6
  192. package/src/__tests__/ratelimit.test.ts +9 -4
  193. package/src/__tests__/relay-server.test.ts +20 -13
  194. package/src/__tests__/retry-openrouter-only-normalization.test.ts +5 -8
  195. package/src/__tests__/retry-thinking-tool-choice.test.ts +10 -13
  196. package/src/__tests__/retry-verbosity-normalization.test.ts +5 -8
  197. package/src/__tests__/runtime-events-sse-reconnect.test.ts +353 -0
  198. package/src/__tests__/schedule-routes.test.ts +80 -10
  199. package/src/__tests__/schedule-store.test.ts +67 -0
  200. package/src/__tests__/schedule-tools.test.ts +125 -0
  201. package/src/__tests__/secret-ingress-http.test.ts +2 -2
  202. package/src/__tests__/secret-prompt-log-hygiene.test.ts +11 -7
  203. package/src/__tests__/secret-prompter-channel-fallback.test.ts +11 -9
  204. package/src/__tests__/secret-response-routing.test.ts +13 -11
  205. package/src/__tests__/send-endpoint-busy.test.ts +2 -1
  206. package/src/__tests__/shell-observability.test.ts +249 -0
  207. package/src/__tests__/skill-feature-flags-integration.test.ts +11 -11
  208. package/src/__tests__/skill-feature-flags.test.ts +6 -6
  209. package/src/__tests__/skill-load-feature-flag.test.ts +10 -10
  210. package/src/__tests__/skills-files-catalog-fallback.test.ts +10 -0
  211. package/src/__tests__/skillssh-files.test.ts +1 -0
  212. package/src/__tests__/starter-task-flow.test.ts +6 -6
  213. package/src/__tests__/strip-memory-injections.test.ts +102 -14
  214. package/src/__tests__/subagent-call-site-routing.test.ts +2 -2
  215. package/src/__tests__/suggestion-routes.test.ts +3 -3
  216. package/src/__tests__/sync-message-contract.test.ts +19 -16
  217. package/src/__tests__/system-prompt.test.ts +54 -0
  218. package/src/__tests__/terminal-tools.test.ts +3 -24
  219. package/src/__tests__/thread-backfill.test.ts +4 -9
  220. package/src/__tests__/title-generate-pipeline.test.ts +1 -1
  221. package/src/__tests__/token-estimate-pipeline.test.ts +2 -4
  222. package/src/__tests__/tool-error-pipeline.test.ts +2 -2
  223. package/src/__tests__/tool-execute-pipeline.test.ts +1 -1
  224. package/src/__tests__/tool-preview-lifecycle.test.ts +13 -11
  225. package/src/__tests__/tool-result-truncate-pipeline.test.ts +9 -12
  226. package/src/__tests__/tool-result-truncation.test.ts +3 -1
  227. package/src/__tests__/tools-audio-read.test.ts +113 -0
  228. package/src/__tests__/turn-boundary-resolution.test.ts +44 -84
  229. package/src/__tests__/turn-events-store.test.ts +11 -7
  230. package/src/__tests__/voice-scoped-grant-consumer.test.ts +8 -6
  231. package/src/__tests__/voice-session-bridge.test.ts +13 -7
  232. package/src/acp/__tests__/prepare-agent-env.test.ts +143 -31
  233. package/src/acp/prepare-agent-env.ts +52 -11
  234. package/src/agent/compaction-circuit.ts +140 -0
  235. package/src/agent/loop.ts +409 -85
  236. package/src/api/README.md +19 -17
  237. package/src/api/constants/tool-execution.ts +21 -0
  238. package/src/api/events/assistant-activity-state.ts +75 -0
  239. package/src/api/events/assistant-outbound-attachment.ts +25 -27
  240. package/src/api/events/assistant-text-delta.ts +6 -8
  241. package/src/api/events/assistant-turn-start.ts +5 -7
  242. package/src/api/events/avatar-updated.ts +24 -0
  243. package/src/api/events/compaction-circuit-closed.ts +26 -0
  244. package/src/api/events/compaction-circuit-open.ts +28 -0
  245. package/src/api/events/confirmation-request.ts +114 -0
  246. package/src/api/events/contact-request.ts +33 -0
  247. package/src/api/events/conversation-error.ts +77 -0
  248. package/src/api/events/conversation-list-invalidated.ts +38 -0
  249. package/src/api/events/conversation-title-updated.ts +24 -0
  250. package/src/api/events/disk-pressure-status-changed.ts +61 -0
  251. package/src/api/events/document-comment-created.ts +24 -28
  252. package/src/api/events/document-comment-deleted.ts +6 -8
  253. package/src/api/events/document-comment-reopened.ts +6 -8
  254. package/src/api/events/document-comment-resolved.ts +8 -10
  255. package/src/api/events/document-editor-update.ts +27 -0
  256. package/src/api/events/error.ts +32 -0
  257. package/src/api/events/generation-cancelled.ts +4 -6
  258. package/src/api/events/generation-handoff.ts +13 -15
  259. package/src/api/events/home-feed-updated.ts +26 -0
  260. package/src/api/events/identity-changed.ts +32 -0
  261. package/src/api/events/interaction-resolved.ts +50 -0
  262. package/src/api/events/message-complete.ts +10 -12
  263. package/src/api/events/message-dequeued.ts +21 -0
  264. package/src/api/events/message-queued-deleted.ts +23 -0
  265. package/src/api/events/message-queued.ts +22 -0
  266. package/src/api/events/message-request-complete.ts +29 -0
  267. package/src/api/events/navigate-settings.ts +20 -0
  268. package/src/api/events/notification-intent.ts +33 -0
  269. package/src/api/events/open-url.ts +6 -8
  270. package/src/api/events/question-request.ts +67 -0
  271. package/src/api/events/relationship-state-updated.ts +4 -6
  272. package/src/api/events/secret-request.ts +42 -0
  273. package/src/api/events/subagent-event.ts +79 -0
  274. package/src/api/events/subagent-spawned.ts +40 -0
  275. package/src/api/events/subagent-status-changed.ts +65 -0
  276. package/src/api/events/sync-changed.ts +29 -0
  277. package/src/api/events/tool-result.ts +129 -0
  278. package/src/api/events/tool-use-start.ts +8 -10
  279. package/src/api/events/turn-profile-auto-routed.ts +28 -0
  280. package/src/api/events/ui-surface-complete.ts +30 -0
  281. package/src/api/events/ui-surface-dismiss.ts +22 -0
  282. package/src/api/events/ui-surface-show.ts +67 -0
  283. package/src/api/events/ui-surface-update.ts +26 -0
  284. package/src/api/events/usage-update.ts +34 -0
  285. package/src/api/events/user-message-echo.ts +35 -0
  286. package/src/api/index.ts +354 -0
  287. package/src/api/requests/dictation.ts +45 -0
  288. package/src/api/responses/disk-pressure-status.ts +26 -0
  289. package/src/api/responses/home.ts +217 -0
  290. package/src/api/responses/llm-context-response.ts +2 -0
  291. package/src/api/responses/memory-v3-selection-log.ts +50 -0
  292. package/src/api/responses/subagent-detail.ts +48 -0
  293. package/src/approvals/guardian-decision-primitive.ts +7 -15
  294. package/src/approvals/guardian-request-resolvers.ts +6 -9
  295. package/src/avatar/__tests__/avatar-manifest.test.ts +236 -0
  296. package/src/avatar/__tests__/avatar-store.test.ts +193 -0
  297. package/src/avatar/avatar-manifest.ts +195 -0
  298. package/src/avatar/avatar-store.ts +113 -0
  299. package/src/avatar/traits-png-sync.ts +8 -2
  300. package/src/background-wake/next-wake.test.ts +31 -1
  301. package/src/background-wake/next-wake.ts +4 -1
  302. package/src/calls/call-conversation-messages.ts +6 -4
  303. package/src/calls/guardian-action-sweep.ts +6 -4
  304. package/src/calls/relay-server.ts +12 -8
  305. package/src/calls/voice-session-bridge.ts +13 -27
  306. package/src/cli/commands/__tests__/memory-v3.test.ts +245 -0
  307. package/src/cli/commands/avatar.ts +17 -11
  308. package/src/cli/commands/conversations.ts +15 -1
  309. package/src/cli/commands/db/__tests__/repair.test.ts +540 -0
  310. package/src/cli/commands/db/__tests__/status.test.ts +253 -0
  311. package/src/cli/commands/db/format.ts +48 -0
  312. package/src/cli/commands/db/index.ts +29 -0
  313. package/src/cli/commands/db/repair-step-conversation-backfill.ts +345 -0
  314. package/src/cli/commands/db/repair-step-integrity.ts +146 -0
  315. package/src/cli/commands/db/repair-steps.ts +164 -0
  316. package/src/cli/commands/db/repair.ts +141 -0
  317. package/src/cli/commands/db/status.ts +366 -0
  318. package/src/cli/commands/memory-v3.ts +159 -445
  319. package/src/cli/lib/cli-colors.ts +24 -6
  320. package/src/cli/program.ts +4 -5
  321. package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
  322. package/src/config/assistant-feature-flags.ts +2 -2
  323. package/src/config/bundled-skills/app-builder/SKILL.md +14 -3
  324. package/src/config/bundled-skills/media-processing/services/reduce.ts +6 -9
  325. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +7 -2
  326. package/src/config/bundled-skills/schedule/SKILL.md +1 -1
  327. package/src/config/bundled-skills/schedule/TOOLS.json +8 -0
  328. package/src/config/call-site-defaults.ts +2 -7
  329. package/src/config/feature-flag-registry.json +25 -9
  330. package/src/config/schemas/__tests__/memory-v2.test.ts +1 -226
  331. package/src/config/schemas/call-site-catalog.ts +8 -15
  332. package/src/config/schemas/llm.ts +2 -3
  333. package/src/config/schemas/memory-lifecycle.ts +24 -0
  334. package/src/config/schemas/memory-v2.ts +0 -253
  335. package/src/config/schemas/memory-v3.ts +39 -0
  336. package/src/config/schemas/memory.ts +6 -1
  337. package/src/config/schemas/timeouts.ts +3 -1
  338. package/src/context/compactor.ts +54 -31
  339. package/src/context/token-estimator.ts +19 -0
  340. package/src/context/tool-result-truncation.ts +1 -43
  341. package/src/context/window-manager.ts +138 -20
  342. package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +2 -2
  343. package/src/daemon/__tests__/web-search-status-text.test.ts +10 -6
  344. package/src/daemon/approval-generators.ts +4 -4
  345. package/src/daemon/config-watcher.ts +7 -1
  346. package/src/daemon/conversation-agent-loop-handlers.ts +225 -88
  347. package/src/daemon/conversation-agent-loop.ts +284 -584
  348. package/src/daemon/conversation-error.ts +7 -7
  349. package/src/daemon/conversation-history.ts +22 -6
  350. package/src/daemon/conversation-launch.ts +4 -8
  351. package/src/daemon/conversation-lifecycle.ts +10 -38
  352. package/src/daemon/conversation-messaging.ts +1 -3
  353. package/src/daemon/conversation-notifiers.ts +7 -5
  354. package/src/daemon/conversation-process.ts +100 -79
  355. package/src/daemon/conversation-runtime-assembly.ts +47 -21
  356. package/src/daemon/conversation-store.ts +6 -5
  357. package/src/daemon/conversation-surfaces.ts +55 -69
  358. package/src/daemon/conversation-tool-setup.ts +3 -0
  359. package/src/daemon/conversation.ts +91 -126
  360. package/src/daemon/daemon-skill-host.ts +2 -6
  361. package/src/daemon/disk-pressure-guard.ts +35 -29
  362. package/src/daemon/external-plugins-bootstrap.ts +46 -24
  363. package/src/daemon/first-greeting.ts +26 -4
  364. package/src/daemon/guardian-action-generators.ts +2 -2
  365. package/src/daemon/handlers/conversations.ts +6 -22
  366. package/src/daemon/handlers/shared.ts +4 -0
  367. package/src/daemon/handlers/skills.ts +15 -14
  368. package/src/daemon/host-app-control-proxy.ts +54 -1
  369. package/src/daemon/host-cu-proxy.ts +46 -22
  370. package/src/daemon/host-file-proxy.ts +25 -1
  371. package/src/daemon/host-proxy-preactivation.ts +25 -6
  372. package/src/daemon/lifecycle.ts +28 -55
  373. package/src/daemon/message-protocol.ts +2 -3
  374. package/src/daemon/message-provenance.ts +49 -0
  375. package/src/daemon/message-types/contacts.ts +3 -20
  376. package/src/daemon/message-types/conversations.ts +13 -111
  377. package/src/daemon/message-types/documents.ts +3 -9
  378. package/src/daemon/message-types/home.ts +4 -17
  379. package/src/daemon/message-types/integrations.ts +2 -6
  380. package/src/daemon/message-types/messages.ts +28 -343
  381. package/src/daemon/message-types/notifications.ts +2 -32
  382. package/src/daemon/message-types/settings.ts +3 -8
  383. package/src/daemon/message-types/skills.ts +2 -0
  384. package/src/daemon/message-types/surfaces.ts +2 -0
  385. package/src/daemon/message-types/sync.ts +12 -25
  386. package/src/daemon/message-types/workspace.ts +3 -11
  387. package/src/daemon/process-message.ts +49 -46
  388. package/src/daemon/server.ts +12 -0
  389. package/src/daemon/tool-side-effects.ts +10 -7
  390. package/src/daemon/trust-context.ts +13 -0
  391. package/src/daemon/wake-target-adapter.ts +11 -1
  392. package/src/heartbeat/__tests__/heartbeat-service.test.ts +3 -1
  393. package/src/heartbeat/heartbeat-run-store.ts +31 -0
  394. package/src/heartbeat/heartbeat-service.ts +16 -0
  395. package/src/home/feature-gate.ts +22 -0
  396. package/src/home/feed-types.ts +36 -221
  397. package/src/ipc/__tests__/email-ipc.test.ts +0 -9
  398. package/src/ipc/routes/__tests__/route-adapter.test.ts +244 -0
  399. package/src/ipc/routes/route-adapter.ts +45 -6
  400. package/src/ipc/skill-routes/__tests__/memory.test.ts +18 -9
  401. package/src/ipc/skill-routes/__tests__/providers.test.ts +10 -10
  402. package/src/ipc/skill-routes/__tests__/registries.test.ts +28 -18
  403. package/src/ipc/skill-routes/memory.ts +26 -13
  404. package/src/ipc/skill-routes/providers.ts +5 -6
  405. package/src/ipc/skill-routes/registries.ts +13 -61
  406. package/src/live-voice/__tests__/live-voice-archive.test.ts +24 -11
  407. package/src/memory/__tests__/conversation-queries.test.ts +192 -8
  408. package/src/memory/__tests__/db-maintenance.test.ts +128 -0
  409. package/src/memory/__tests__/jobs-store-job-classes.test.ts +5 -4
  410. package/src/memory/__tests__/memory-retrospective-job.test.ts +10 -6
  411. package/src/memory/__tests__/memory-v3-selections-migration.test.ts +103 -0
  412. package/src/memory/context-search/agent-runner.ts +2 -4
  413. package/src/memory/conversation-crud.ts +39 -8
  414. package/src/memory/conversation-queries.ts +78 -22
  415. package/src/memory/db-init.ts +8 -0
  416. package/src/memory/db-maintenance.ts +18 -2
  417. package/src/memory/graph/consolidation.ts +8 -11
  418. package/src/memory/graph/conversation-graph-memory.ts +41 -8
  419. package/src/memory/graph/extraction.ts +6 -9
  420. package/src/memory/graph/narrative.ts +2 -2
  421. package/src/memory/graph/pattern-scan.ts +2 -2
  422. package/src/memory/graph/retriever.ts +20 -26
  423. package/src/memory/graph/tools.ts +4 -4
  424. package/src/memory/job-handlers/conversation-starters.ts +32 -32
  425. package/src/memory/job-handlers/summarization.ts +1 -2
  426. package/src/memory/jobs-store.ts +3 -1
  427. package/src/memory/jobs-worker.ts +51 -39
  428. package/src/memory/llm-request-log-source-clickhouse.ts +5 -31
  429. package/src/memory/llm-request-log-source-local.ts +0 -11
  430. package/src/memory/llm-request-log-source.ts +9 -25
  431. package/src/memory/llm-request-log-store.ts +0 -41
  432. package/src/memory/llm-usage-store.ts +10 -0
  433. package/src/memory/memory-marker.ts +17 -0
  434. package/src/memory/memory-retrospective-job.ts +6 -2
  435. package/src/memory/memory-v2-activation-log-store.ts +1 -83
  436. package/src/memory/migrations/267-llm-usage-events-add-assistant-version.ts +46 -0
  437. package/src/memory/migrations/268-add-memory-v3-selections.ts +28 -0
  438. package/src/memory/migrations/269-schedule-script-timeout.ts +11 -0
  439. package/src/memory/migrations/270-messages-role-created-at-index.ts +18 -0
  440. package/src/memory/migrations/__tests__/267-llm-usage-events-add-assistant-version.test.ts +117 -0
  441. package/src/memory/migrations/index.ts +4 -0
  442. package/src/memory/schema/infrastructure.ts +11 -0
  443. package/src/memory/v2/__tests__/consolidation-job.test.ts +124 -0
  444. package/src/memory/v2/__tests__/migration.test.ts +11 -3
  445. package/src/memory/v2/__tests__/page-index.test.ts +37 -1
  446. package/src/memory/v2/__tests__/router.test.ts +14 -4
  447. package/src/memory/v2/__tests__/sweep-job.test.ts +6 -5
  448. package/src/memory/v2/backfill-jobs.ts +6 -0
  449. package/src/memory/v2/consolidation-job.ts +89 -9
  450. package/src/memory/v2/migration.ts +5 -3
  451. package/src/memory/v2/page-index.ts +11 -0
  452. package/src/memory/v2/router.ts +8 -11
  453. package/src/memory/v2/sweep-job.ts +8 -11
  454. package/src/memory/v2/types.ts +1 -0
  455. package/src/memory/v3/__tests__/assign.test.ts +242 -0
  456. package/src/memory/v3/__tests__/capabilities.test.ts +118 -0
  457. package/src/memory/v3/__tests__/core.test.ts +39 -0
  458. package/src/memory/v3/__tests__/fixtures/eval-turns.json +36 -0
  459. package/src/memory/v3/__tests__/fixtures/live-turns.json +37 -0
  460. package/src/memory/v3/__tests__/health.test.ts +203 -0
  461. package/src/memory/v3/__tests__/live-integration.test.ts +330 -0
  462. package/src/memory/v3/__tests__/maintain-job.test.ts +288 -0
  463. package/src/memory/v3/__tests__/needle.test.ts +107 -0
  464. package/src/memory/v3/__tests__/orchestrate.test.ts +400 -0
  465. package/src/memory/v3/__tests__/reconcile.test.ts +274 -0
  466. package/src/memory/v3/__tests__/render-injection.test.ts +61 -0
  467. package/src/memory/v3/__tests__/router.test.ts +260 -0
  468. package/src/memory/v3/__tests__/selection-log-store.test.ts +179 -0
  469. package/src/memory/v3/__tests__/selector.test.ts +404 -0
  470. package/src/memory/v3/__tests__/shadow-plugin.test.ts +414 -0
  471. package/src/memory/v3/__tests__/snapshot.test.ts +168 -0
  472. package/src/memory/v3/__tests__/tree.test.ts +192 -0
  473. package/src/memory/v3/__tests__/types.test.ts +54 -0
  474. package/src/memory/v3/__tests__/working-set-eviction.test.ts +106 -0
  475. package/src/memory/v3/__tests__/working-set-skeleton.test.ts +44 -0
  476. package/src/memory/v3/assign.ts +268 -0
  477. package/src/memory/v3/capabilities.ts +124 -0
  478. package/src/memory/v3/core.ts +26 -0
  479. package/src/memory/v3/data/README.md +84 -0
  480. package/src/memory/v3/data/assignments.json +5 -0
  481. package/src/memory/v3/data/core.json +1 -0
  482. package/src/memory/v3/data/leaves/domain-a/topic-x.md +9 -0
  483. package/src/memory/v3/data/leaves/domain-a/topic-y.md +9 -0
  484. package/src/memory/v3/data/leaves/domain-b/topic-z.md +9 -0
  485. package/src/memory/v3/health.ts +0 -0
  486. package/src/memory/v3/maintain-job.ts +314 -0
  487. package/src/memory/v3/needle.ts +115 -0
  488. package/src/memory/v3/orchestrate.ts +114 -0
  489. package/src/memory/v3/page-content.ts +34 -0
  490. package/src/memory/v3/provider-blocks.ts +16 -0
  491. package/src/memory/v3/reconcile.ts +523 -0
  492. package/src/memory/v3/render-injection.ts +32 -0
  493. package/src/memory/v3/router.ts +184 -0
  494. package/src/memory/v3/selection-log-store.ts +84 -0
  495. package/src/memory/v3/selector.ts +211 -0
  496. package/src/memory/v3/shadow-plugin.ts +379 -0
  497. package/src/memory/v3/snapshot.ts +209 -0
  498. package/src/memory/v3/tree.ts +174 -0
  499. package/src/memory/v3/types.ts +46 -60
  500. package/src/memory/v3/working-set.ts +88 -0
  501. package/src/messaging/providers/slack/render-transcript.test.ts +1 -1
  502. package/src/messaging/providers/slack/render-transcript.ts +2 -2
  503. package/src/messaging/style-analyzer.ts +8 -11
  504. package/src/notifications/conversation-pairing.ts +8 -6
  505. package/src/notifications/decision-engine.ts +10 -13
  506. package/src/notifications/preference-extractor.ts +11 -14
  507. package/src/permissions/prompter.ts +42 -36
  508. package/src/permissions/question-prompter.test.ts +35 -26
  509. package/src/permissions/question-prompter.ts +6 -10
  510. package/src/plugin-api/index.ts +2 -0
  511. package/src/plugin-api/types.ts +25 -3
  512. package/src/plugins/defaults/circuit-breaker/middlewares/circuitBreaker.ts +93 -0
  513. package/src/plugins/defaults/circuit-breaker/package.json +15 -0
  514. package/src/plugins/defaults/circuit-breaker/register.ts +39 -0
  515. package/src/plugins/defaults/compaction/middlewares/compaction.ts +25 -0
  516. package/src/plugins/defaults/compaction/package.json +15 -0
  517. package/src/plugins/defaults/compaction/register.ts +35 -0
  518. package/src/plugins/defaults/compaction/terminal.ts +73 -0
  519. package/src/plugins/defaults/empty-response/middlewares/emptyResponse.ts +22 -0
  520. package/src/plugins/defaults/empty-response/package.json +15 -0
  521. package/src/plugins/defaults/empty-response/register.ts +28 -0
  522. package/src/plugins/defaults/empty-response/terminal.ts +106 -0
  523. package/src/plugins/defaults/history-repair/hooks/user-prompt-submit.ts +35 -0
  524. package/src/plugins/defaults/history-repair/package.json +15 -0
  525. package/src/plugins/defaults/history-repair/register.ts +24 -0
  526. package/src/{daemon/history-repair.ts → plugins/defaults/history-repair/terminal.ts} +48 -35
  527. package/src/plugins/defaults/index.ts +29 -40
  528. package/src/plugins/defaults/injectors/package.json +15 -0
  529. package/src/plugins/defaults/{injectors.ts → injectors/register.ts} +14 -38
  530. package/src/plugins/defaults/llm-call/middlewares/llmCall.ts +17 -0
  531. package/src/plugins/defaults/llm-call/package.json +15 -0
  532. package/src/plugins/defaults/{llm-call.ts → llm-call/register.ts} +6 -38
  533. package/src/plugins/defaults/memory-retrieval/middlewares/memoryRetrieval.ts +17 -0
  534. package/src/plugins/defaults/memory-retrieval/package.json +15 -0
  535. package/src/plugins/defaults/{memory-retrieval.ts → memory-retrieval/register.ts} +10 -48
  536. package/src/plugins/defaults/{overflow-reduce.ts → overflow-reduce/middlewares/overflowReduce.ts} +18 -77
  537. package/src/plugins/defaults/overflow-reduce/package.json +15 -0
  538. package/src/plugins/defaults/overflow-reduce/register.ts +42 -0
  539. package/src/plugins/defaults/persistence/middlewares/persistence.ts +19 -0
  540. package/src/plugins/defaults/persistence/package.json +15 -0
  541. package/src/plugins/defaults/persistence/register.ts +38 -0
  542. package/src/plugins/defaults/persistence/terminal.ts +83 -0
  543. package/src/plugins/defaults/title-generate/package.json +15 -0
  544. package/src/plugins/defaults/title-generate/register.ts +35 -0
  545. package/src/plugins/defaults/title-generate/terminal.ts +31 -0
  546. package/src/plugins/defaults/token-estimate/middlewares/tokenEstimate.ts +23 -0
  547. package/src/plugins/defaults/token-estimate/package.json +15 -0
  548. package/src/plugins/defaults/token-estimate/register.ts +34 -0
  549. package/src/plugins/defaults/token-estimate/terminal.ts +40 -0
  550. package/src/plugins/defaults/tool-error/middlewares/toolError.ts +21 -0
  551. package/src/plugins/defaults/tool-error/package.json +15 -0
  552. package/src/plugins/defaults/tool-error/register.ts +35 -0
  553. package/src/plugins/defaults/tool-error/terminal.ts +47 -0
  554. package/src/plugins/defaults/tool-execute/middlewares/toolExecute.ts +23 -0
  555. package/src/plugins/defaults/tool-execute/package.json +15 -0
  556. package/src/plugins/defaults/{tool-execute.ts → tool-execute/register.ts} +8 -46
  557. package/src/plugins/defaults/tool-result-truncate/middlewares/toolResultTruncate.ts +23 -0
  558. package/src/plugins/defaults/tool-result-truncate/package.json +15 -0
  559. package/src/plugins/defaults/tool-result-truncate/register.ts +35 -0
  560. package/src/plugins/defaults/tool-result-truncate/terminal.ts +113 -0
  561. package/src/plugins/defaults/tool-result-truncate/types.ts +22 -0
  562. package/src/plugins/external-plugin-loader.ts +2 -2
  563. package/src/plugins/pipeline.ts +0 -12
  564. package/src/plugins/types.ts +51 -90
  565. package/src/plugins/user-loader.ts +4 -3
  566. package/src/proactive-artifact/aux-message-injector.ts +0 -1
  567. package/src/proactive-artifact/job.test.ts +20 -8
  568. package/src/proactive-artifact/job.ts +3 -1
  569. package/src/prompts/sections.ts +20 -7
  570. package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +2 -2
  571. package/src/prompts/templates/BOOTSTRAP.md +5 -1
  572. package/src/prompts/templates/system-sections.ts +6 -0
  573. package/src/providers/__tests__/retry-callsite.test.ts +25 -25
  574. package/src/providers/__tests__/satellite-connection-routing.test.ts +7 -21
  575. package/src/providers/anthropic/client.ts +24 -5
  576. package/src/providers/call-site-routing.ts +1 -9
  577. package/src/providers/gemini/client.ts +152 -34
  578. package/src/providers/gemini/inline-media.ts +74 -0
  579. package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +0 -2
  580. package/src/providers/openai/chat-completions-provider.ts +1 -4
  581. package/src/providers/openai/responses-provider.ts +1 -4
  582. package/src/providers/openrouter/client.ts +1 -6
  583. package/src/providers/provider-send-message.ts +6 -6
  584. package/src/providers/ratelimit.ts +1 -9
  585. package/src/providers/retry.ts +0 -5
  586. package/src/providers/types.ts +11 -2
  587. package/src/providers/usage-tracking.ts +1 -9
  588. package/src/runtime/__tests__/agent-wake.test.ts +131 -26
  589. package/src/runtime/__tests__/background-job-runner.test.ts +1 -3
  590. package/src/runtime/agent-wake.ts +93 -18
  591. package/src/runtime/assistant-event-hub.ts +2 -2
  592. package/src/runtime/auth/__tests__/guard-tests.test.ts +75 -109
  593. package/src/runtime/auth/__tests__/route-policy.test.ts +153 -170
  594. package/src/runtime/auth/route-policy.ts +42 -1079
  595. package/src/runtime/background-job-runner.ts +1 -4
  596. package/src/runtime/btw-sidechain.ts +3 -1
  597. package/src/runtime/channel-approvals.ts +3 -14
  598. package/src/runtime/channel-invite-transport.ts +5 -6
  599. package/src/runtime/channel-readiness-service.ts +2 -5
  600. package/src/runtime/channel-retry-sweep.ts +12 -16
  601. package/src/runtime/conversation-stream-state.ts +294 -0
  602. package/src/runtime/http-router.ts +19 -22
  603. package/src/runtime/http-types.ts +12 -6
  604. package/src/runtime/invite-instruction-generator.ts +3 -3
  605. package/src/runtime/pending-interactions.ts +2 -2
  606. package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +565 -0
  607. package/src/runtime/routes/__tests__/content-source-routes.test.ts +4 -4
  608. package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +62 -32
  609. package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +237 -0
  610. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +13 -22
  611. package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +7 -2
  612. package/src/runtime/routes/__tests__/sanity-routes.test.ts +6 -6
  613. package/src/runtime/routes/__tests__/stt-routes.test.ts +3 -3
  614. package/src/runtime/routes/__tests__/suggest-trust-rule-routes.test.ts +5 -2
  615. package/src/runtime/routes/__tests__/tts-routes.test.ts +3 -3
  616. package/src/runtime/routes/acp-routes.test.ts +97 -75
  617. package/src/runtime/routes/acp-routes.ts +29 -6
  618. package/src/runtime/routes/app-management-routes.ts +97 -24
  619. package/src/runtime/routes/app-routes.ts +25 -5
  620. package/src/runtime/routes/approval-routes.ts +16 -4
  621. package/src/runtime/routes/attachment-routes.ts +25 -1
  622. package/src/runtime/routes/audio-routes.ts +1 -0
  623. package/src/runtime/routes/audit-routes.ts +5 -0
  624. package/src/runtime/routes/auth-routes.ts +5 -0
  625. package/src/runtime/routes/avatar-routes.ts +238 -59
  626. package/src/runtime/routes/background-tool-routes.ts +9 -0
  627. package/src/runtime/routes/background-wake-routes.ts +13 -3
  628. package/src/runtime/routes/backup-routes.ts +45 -0
  629. package/src/runtime/routes/bookmark-routes.ts +13 -0
  630. package/src/runtime/routes/brain-graph-routes.ts +9 -0
  631. package/src/runtime/routes/browser-routes.ts +5 -0
  632. package/src/runtime/routes/browser-tabs-routes.ts +5 -0
  633. package/src/runtime/routes/btw-routes.ts +5 -1
  634. package/src/runtime/routes/cache-routes.ts +13 -0
  635. package/src/runtime/routes/call-routes.ts +21 -10
  636. package/src/runtime/routes/channel-availability-routes.ts +5 -1
  637. package/src/runtime/routes/channel-readiness-routes.ts +37 -4
  638. package/src/runtime/routes/channel-route-definitions.ts +21 -0
  639. package/src/runtime/routes/channel-verification-routes.ts +21 -0
  640. package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +9 -2
  641. package/src/runtime/routes/client-routes.ts +9 -0
  642. package/src/runtime/routes/consolidation-routes.ts +13 -5
  643. package/src/runtime/routes/contact-prompt-routes.ts +9 -0
  644. package/src/runtime/routes/contact-routes.ts +90 -23
  645. package/src/runtime/routes/content-source-routes.ts +5 -1
  646. package/src/runtime/routes/conversation-analysis-routes.ts +5 -1
  647. package/src/runtime/routes/conversation-attention-routes.ts +5 -0
  648. package/src/runtime/routes/conversation-cli-routes.ts +54 -7
  649. package/src/runtime/routes/conversation-compaction-routes.ts +54 -25
  650. package/src/runtime/routes/conversation-list-routes.ts +81 -12
  651. package/src/runtime/routes/conversation-management-routes.ts +57 -14
  652. package/src/runtime/routes/conversation-query-routes.ts +88 -41
  653. package/src/runtime/routes/conversation-routes.ts +74 -19
  654. package/src/runtime/routes/conversation-starter-routes.ts +22 -13
  655. package/src/runtime/routes/conversations-import-routes.ts +6 -1
  656. package/src/runtime/routes/credential-prompt-routes.ts +5 -0
  657. package/src/runtime/routes/credential-routes.ts +25 -6
  658. package/src/runtime/routes/debug-bash-routes.ts +5 -0
  659. package/src/runtime/routes/debug-routes.ts +11 -2
  660. package/src/runtime/routes/defer-routes.ts +13 -0
  661. package/src/runtime/routes/diagnostics-routes.ts +37 -46
  662. package/src/runtime/routes/disk-pressure-routes.ts +17 -31
  663. package/src/runtime/routes/document-comments-routes.ts +46 -27
  664. package/src/runtime/routes/documents-routes.ts +21 -10
  665. package/src/runtime/routes/domain-routes.ts +61 -28
  666. package/src/runtime/routes/email-routes.ts +33 -0
  667. package/src/runtime/routes/events-routes.ts +114 -9
  668. package/src/runtime/routes/filing-routes.ts +9 -4
  669. package/src/runtime/routes/gateway-log-routes.ts +5 -0
  670. package/src/runtime/routes/global-search-routes.ts +53 -50
  671. package/src/runtime/routes/group-routes.ts +21 -5
  672. package/src/runtime/routes/guardian-action-routes.ts +9 -0
  673. package/src/runtime/routes/guardian-approval-interception.ts +0 -31
  674. package/src/runtime/routes/heartbeat-routes.ts +25 -9
  675. package/src/runtime/routes/home-feed-routes.ts +23 -19
  676. package/src/runtime/routes/home-state-routes.ts +8 -40
  677. package/src/runtime/routes/host-app-control-routes.ts +5 -0
  678. package/src/runtime/routes/host-bash-routes.ts +5 -0
  679. package/src/runtime/routes/host-browser-routes.ts +13 -0
  680. package/src/runtime/routes/host-cu-routes.ts +5 -0
  681. package/src/runtime/routes/host-file-routes.ts +26 -6
  682. package/src/runtime/routes/host-transfer-routes.ts +13 -2
  683. package/src/runtime/routes/http-adapter.ts +1 -2
  684. package/src/runtime/routes/identity-intro-cache.ts +17 -6
  685. package/src/runtime/routes/identity-routes.ts +12 -2
  686. package/src/runtime/routes/image-generation-routes.ts +5 -0
  687. package/src/runtime/routes/inbound-message-handler.ts +15 -11
  688. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +0 -12
  689. package/src/runtime/routes/inbound-stages/background-dispatch.ts +15 -19
  690. package/src/runtime/routes/inference-profile-session-routes.ts +13 -3
  691. package/src/runtime/routes/inference-provider-connection-routes.ts +21 -5
  692. package/src/runtime/routes/inference-send-routes.ts +11 -11
  693. package/src/runtime/routes/integrations/a2a.ts +30 -7
  694. package/src/runtime/routes/integrations/slack/channel.ts +19 -3
  695. package/src/runtime/routes/integrations/slack/share.ts +9 -2
  696. package/src/runtime/routes/integrations/telegram.ts +28 -9
  697. package/src/runtime/routes/integrations/twilio.ts +35 -7
  698. package/src/runtime/routes/integrations/vercel.ts +3 -3
  699. package/src/runtime/routes/internal-oauth-routes.ts +5 -0
  700. package/src/runtime/routes/internal-twilio-routes.ts +13 -0
  701. package/src/runtime/routes/llm-call-sites-routes.ts +39 -4
  702. package/src/runtime/routes/log-export-routes.ts +28 -10
  703. package/src/runtime/routes/mcp-auth-routes.ts +25 -0
  704. package/src/runtime/routes/memory-item-routes.ts +21 -10
  705. package/src/runtime/routes/memory-v2-routes.ts +90 -36
  706. package/src/runtime/routes/memory-v3-routes.ts +273 -407
  707. package/src/runtime/routes/migration-rollback-routes.ts +5 -1
  708. package/src/runtime/routes/migration-routes.ts +29 -0
  709. package/src/runtime/routes/notification-routes.ts +17 -1
  710. package/src/runtime/routes/oauth-apps.ts +33 -11
  711. package/src/runtime/routes/oauth-commands-routes.ts +37 -14
  712. package/src/runtime/routes/oauth-connect-routes.ts +9 -0
  713. package/src/runtime/routes/oauth-lifecycle-routes.ts +5 -1
  714. package/src/runtime/routes/oauth-providers.ts +35 -10
  715. package/src/runtime/routes/platform-routes.ts +21 -0
  716. package/src/runtime/routes/playground/__tests__/force-compact.test.ts +3 -2
  717. package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +37 -16
  718. package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +7 -3
  719. package/src/runtime/routes/playground/__tests__/state.test.ts +10 -3
  720. package/src/runtime/routes/playground/force-compact.ts +1 -1
  721. package/src/runtime/routes/playground/helpers.ts +0 -1
  722. package/src/runtime/routes/playground/inject-failures.ts +13 -8
  723. package/src/runtime/routes/playground/reset-circuit.ts +14 -9
  724. package/src/runtime/routes/playground/seed-conversation.ts +1 -1
  725. package/src/runtime/routes/playground/seeded-conversations.ts +3 -3
  726. package/src/runtime/routes/playground/state.ts +4 -3
  727. package/src/runtime/routes/plugins-routes.ts +22 -19
  728. package/src/runtime/routes/profiler-routes.ts +17 -4
  729. package/src/runtime/routes/ps-routes.ts +5 -0
  730. package/src/runtime/routes/publish-routes.ts +13 -3
  731. package/src/runtime/routes/question-routes.ts +5 -0
  732. package/src/runtime/routes/recording-routes.ts +25 -12
  733. package/src/runtime/routes/rename-conversation-routes.ts +5 -0
  734. package/src/runtime/routes/sanity-routes.ts +9 -2
  735. package/src/runtime/routes/schedule-routes.ts +137 -47
  736. package/src/runtime/routes/secret-routes.ts +17 -4
  737. package/src/runtime/routes/sequence-routes.ts +33 -0
  738. package/src/runtime/routes/settings-routes.ts +65 -19
  739. package/src/runtime/routes/skills-routes.ts +133 -69
  740. package/src/runtime/routes/slack-channel-routes.ts +5 -0
  741. package/src/runtime/routes/stt-routes.ts +13 -6
  742. package/src/runtime/routes/subagents-routes.ts +24 -18
  743. package/src/runtime/routes/suggest-trust-rule-routes.ts +7 -2
  744. package/src/runtime/routes/surface-action-routes.ts +9 -0
  745. package/src/runtime/routes/surface-content-routes.ts +10 -2
  746. package/src/runtime/routes/task-routes.ts +37 -0
  747. package/src/runtime/routes/telemetry-routes.ts +9 -0
  748. package/src/runtime/routes/trace-event-routes.ts +42 -1
  749. package/src/runtime/routes/trust-rules-routes.ts +5 -0
  750. package/src/runtime/routes/tts-routes.ts +13 -6
  751. package/src/runtime/routes/types.ts +17 -8
  752. package/src/runtime/routes/ui-request-routes.ts +5 -0
  753. package/src/runtime/routes/upgrade-broadcast-routes.ts +5 -0
  754. package/src/runtime/routes/usage-routes.ts +71 -3
  755. package/src/runtime/routes/user-routes-cli.ts +9 -0
  756. package/src/runtime/routes/user-routes.ts +5 -1
  757. package/src/runtime/routes/wake-conversation-routes.ts +5 -0
  758. package/src/runtime/routes/watcher-routes.ts +21 -0
  759. package/src/runtime/routes/webhook-routes.ts +9 -0
  760. package/src/runtime/routes/wipe-conversation-routes.ts +5 -0
  761. package/src/runtime/routes/work-items-routes.ts +47 -19
  762. package/src/runtime/routes/workspace-commit-routes.ts +5 -0
  763. package/src/runtime/routes/workspace-routes.test.ts +42 -0
  764. package/src/runtime/routes/workspace-routes.ts +120 -9
  765. package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -4
  766. package/src/runtime/services/analyze-conversation.ts +3 -6
  767. package/src/runtime/services/conversation-serializer.ts +24 -2
  768. package/src/runtime/sync/resource-sync-events.ts +16 -2
  769. package/src/runtime/sync/sync-publisher.ts +2 -2
  770. package/src/schedule/run-script.ts +28 -3
  771. package/src/schedule/schedule-store.ts +8 -0
  772. package/src/schedule/scheduler.ts +3 -1
  773. package/src/signals/user-message.ts +5 -8
  774. package/src/skills/catalog-files.ts +4 -1
  775. package/src/skills/clawhub-files.ts +2 -0
  776. package/src/skills/skillssh-files.ts +2 -0
  777. package/src/subagent/manager.ts +3 -6
  778. package/src/telemetry/types.ts +26 -0
  779. package/src/telemetry/usage-telemetry-reporter.test.ts +138 -1
  780. package/src/telemetry/usage-telemetry-reporter.ts +31 -0
  781. package/src/tools/acp/spawn.test.ts +88 -38
  782. package/src/tools/apps/definitions.ts +8 -4
  783. package/src/tools/ask-question/ask-question-tool.test.ts +120 -105
  784. package/src/tools/ask-question/ask-question-tool.ts +85 -90
  785. package/src/tools/computer-use/definitions.ts +28 -24
  786. package/src/tools/credential-execution/make-authenticated-request.ts +56 -51
  787. package/src/tools/credential-execution/manage-secure-command-tool.ts +2 -2
  788. package/src/tools/credential-execution/run-authenticated-command.ts +82 -77
  789. package/src/tools/credentials/vault.ts +112 -111
  790. package/src/tools/execution-target.ts +1 -1
  791. package/src/tools/execution-timeout.ts +3 -4
  792. package/src/tools/filesystem/edit.ts +45 -42
  793. package/src/tools/filesystem/list.ts +33 -30
  794. package/src/tools/filesystem/read.ts +54 -35
  795. package/src/tools/filesystem/write.ts +34 -31
  796. package/src/tools/host-filesystem/edit.ts +44 -42
  797. package/src/tools/host-filesystem/read.ts +49 -35
  798. package/src/tools/host-filesystem/transfer.ts +121 -108
  799. package/src/tools/host-filesystem/write.ts +33 -31
  800. package/src/tools/host-terminal/host-shell.ts +50 -48
  801. package/src/tools/memory/register.ts +23 -24
  802. package/src/tools/network/web-fetch.ts +49 -46
  803. package/src/tools/network/web-search.ts +16 -13
  804. package/src/tools/registry.ts +39 -16
  805. package/src/tools/schedule/create.ts +11 -0
  806. package/src/tools/schedule/update.ts +16 -0
  807. package/src/tools/shared/filesystem/audio-read.ts +122 -0
  808. package/src/tools/shared/filesystem/image-read.ts +1 -1
  809. package/src/tools/skills/execute.ts +34 -31
  810. package/src/tools/skills/load.ts +29 -23
  811. package/src/tools/subagent/notify-parent.ts +35 -32
  812. package/src/tools/system/avatar-generator.ts +13 -22
  813. package/src/tools/system/request-permission.ts +30 -27
  814. package/src/tools/terminal/shell.ts +190 -61
  815. package/src/tools/tool-defaults.ts +20 -9
  816. package/src/tools/tool-manifest.ts +4 -4
  817. package/src/tools/types.ts +74 -23
  818. package/src/tools/ui-surface/definitions.ts +69 -9
  819. package/src/usage/types.ts +10 -0
  820. package/src/util/errors.ts +2 -2
  821. package/src/util/map-limit.ts +27 -0
  822. package/src/util/platform.ts +15 -12
  823. package/src/work-items/work-item-runner.ts +7 -2
  824. package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +7 -20
  825. package/src/workspace/migrations/092-backfill-v3-leaves.ts +169 -0
  826. package/src/workspace/migrations/093-backfill-leaf-ids.ts +144 -0
  827. package/src/workspace/migrations/094-seed-avatar-manifest.ts +155 -0
  828. package/src/workspace/migrations/__tests__/094-seed-avatar-manifest.test.ts +136 -0
  829. package/src/workspace/migrations/__tests__/backfill-leaf-ids.test.ts +175 -0
  830. package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +124 -0
  831. package/src/workspace/migrations/registry.ts +6 -0
  832. package/src/workspace/provider-commit-message-generator.ts +15 -17
  833. package/tsconfig.json +4 -1
  834. package/src/__tests__/history-repair-pipeline.test.ts +0 -396
  835. package/src/cli/commands/__tests__/memory-v3-render.test.ts +0 -340
  836. package/src/cli/commands/memory-v3-render.ts +0 -491
  837. package/src/daemon/message-types/disk-pressure.ts +0 -9
  838. package/src/email/feature-gate.ts +0 -23
  839. package/src/memory/v3/__tests__/coactivation-store.test.ts +0 -422
  840. package/src/memory/v3/__tests__/consolidation-job.test.ts +0 -466
  841. package/src/memory/v3/__tests__/coretrieval-seed.test.ts +0 -270
  842. package/src/memory/v3/__tests__/edge-learning-job.test.ts +0 -324
  843. package/src/memory/v3/__tests__/edges.test.ts +0 -706
  844. package/src/memory/v3/__tests__/filter.test.ts +0 -560
  845. package/src/memory/v3/__tests__/gate.test.ts +0 -637
  846. package/src/memory/v3/__tests__/index-composition.test.ts +0 -291
  847. package/src/memory/v3/__tests__/loop.test.ts +0 -775
  848. package/src/memory/v3/__tests__/retriever.test.ts +0 -226
  849. package/src/memory/v3/__tests__/scouts.test.ts +0 -489
  850. package/src/memory/v3/__tests__/shadow-diff.test.ts +0 -225
  851. package/src/memory/v3/__tests__/shadow-middleware.test.ts +0 -398
  852. package/src/memory/v3/__tests__/system-prompts.test.ts +0 -154
  853. package/src/memory/v3/__tests__/traversal.test.ts +0 -508
  854. package/src/memory/v3/__tests__/tree-index.test.ts +0 -280
  855. package/src/memory/v3/__tests__/tree-store.test.ts +0 -529
  856. package/src/memory/v3/__tests__/tree-walk.test.ts +0 -784
  857. package/src/memory/v3/__tests__/validate.test.ts +0 -277
  858. package/src/memory/v3/auto-edges.ts +0 -223
  859. package/src/memory/v3/coactivation-store.ts +0 -124
  860. package/src/memory/v3/consolidation-job.ts +0 -323
  861. package/src/memory/v3/coretrieval-seed.ts +0 -240
  862. package/src/memory/v3/edge-learning-job.ts +0 -160
  863. package/src/memory/v3/edges.ts +0 -286
  864. package/src/memory/v3/filter.ts +0 -286
  865. package/src/memory/v3/gate.ts +0 -349
  866. package/src/memory/v3/index-composition.ts +0 -126
  867. package/src/memory/v3/llm-capture.ts +0 -46
  868. package/src/memory/v3/loop.ts +0 -430
  869. package/src/memory/v3/maintenance.ts +0 -144
  870. package/src/memory/v3/prompt-context.ts +0 -33
  871. package/src/memory/v3/prompts/consolidation.ts +0 -458
  872. package/src/memory/v3/prompts/system-prompts.ts +0 -196
  873. package/src/memory/v3/retriever.ts +0 -33
  874. package/src/memory/v3/scouts.ts +0 -431
  875. package/src/memory/v3/shadow-diff.ts +0 -287
  876. package/src/memory/v3/shadow-middleware.ts +0 -347
  877. package/src/memory/v3/traversal.ts +0 -211
  878. package/src/memory/v3/tree-index.ts +0 -237
  879. package/src/memory/v3/tree-store.ts +0 -394
  880. package/src/memory/v3/tree-walk.ts +0 -356
  881. package/src/memory/v3/validate.ts +0 -323
  882. package/src/plugins/defaults/circuit-breaker.ts +0 -141
  883. package/src/plugins/defaults/compaction.ts +0 -141
  884. package/src/plugins/defaults/empty-response.ts +0 -124
  885. package/src/plugins/defaults/history-repair.ts +0 -83
  886. package/src/plugins/defaults/persistence.ts +0 -146
  887. package/src/plugins/defaults/title-generate.ts +0 -90
  888. package/src/plugins/defaults/token-estimate.ts +0 -101
  889. package/src/plugins/defaults/tool-error.ts +0 -119
  890. package/src/plugins/defaults/tool-result-truncate.ts +0 -84
  891. package/src/runtime/routes/__tests__/memory-v3-simulate-params.test.ts +0 -35
@@ -1,10 +1,13 @@
1
1
  import { rmSync, writeFileSync } from "node:fs";
2
2
  import { afterAll, beforeEach, describe, expect, mock, test } from "bun:test";
3
3
 
4
+ import { CompactionCircuit } from "../agent/compaction-circuit.js";
4
5
  import type {
5
6
  AgentEvent,
7
+ AgentLoopRunResult,
6
8
  CheckpointDecision,
7
9
  CheckpointInfo,
10
+ ExitReason,
8
11
  } from "../agent/loop.js";
9
12
  import type { ServerMessage } from "../daemon/message-protocol.js";
10
13
  import type { Message, ProviderResponse } from "../providers/types.js";
@@ -175,7 +178,7 @@ mock.module("../memory/conversation-crud.js", () => ({
175
178
  _convId: string,
176
179
  role: string,
177
180
  content: string,
178
- metadata?: Record<string, unknown>,
181
+ options?: { metadata?: Record<string, unknown> },
179
182
  ) => {
180
183
  // Simulate a persist failure for tests that need to exercise the
181
184
  // tail-persist-failed path in drainBatch. Triggered by matching any
@@ -186,7 +189,12 @@ mock.module("../memory/conversation-crud.js", () => ({
186
189
  }
187
190
  }
188
191
  const id = `msg-${Date.now()}-${capturedAddMessages.length}`;
189
- capturedAddMessages.push({ id, role, content, metadata });
192
+ capturedAddMessages.push({
193
+ id,
194
+ role,
195
+ content,
196
+ metadata: options?.metadata,
197
+ });
190
198
  return { id };
191
199
  },
192
200
  updateConversationUsage: () => {},
@@ -321,12 +329,20 @@ interface PendingRun {
321
329
  onCheckpoint?: (
322
330
  checkpoint: CheckpointInfo,
323
331
  ) => CheckpointDecision | Promise<CheckpointDecision>;
332
+ /**
333
+ * Pause-reason recorded from the most recent `onCheckpoint` call, mirroring
334
+ * how the production loop carries it back via {@link AgentLoopRunResult}.
335
+ * `resolve(history)` packages this into the run result so the orchestrator
336
+ * derives its handoff bookkeeping the same way it does against the real loop.
337
+ */
338
+ exitReason: ExitReason | null;
324
339
  }
325
340
 
326
341
  let pendingRuns: PendingRun[] = [];
327
342
 
328
343
  mock.module("../agent/loop.js", () => ({
329
344
  AgentLoop: class {
345
+ compactionCircuit = new CompactionCircuit("test-conv");
330
346
  constructor() {}
331
347
  getToolTokenBudget() {
332
348
  return 0;
@@ -340,14 +356,32 @@ mock.module("../agent/loop.js", () => ({
340
356
  async run(
341
357
  messages: Message[],
342
358
  onEvent: (event: AgentEvent) => void | Promise<void>,
343
- _signal?: AbortSignal,
344
- _requestId?: string,
345
- onCheckpoint?: (
346
- checkpoint: CheckpointInfo,
347
- ) => CheckpointDecision | Promise<CheckpointDecision>,
348
- ): Promise<Message[]> {
349
- return new Promise<Message[]>((resolve, reject) => {
350
- pendingRuns.push({ resolve, reject, messages, onEvent, onCheckpoint });
359
+ options?: {
360
+ onCheckpoint?: (
361
+ checkpoint: CheckpointInfo,
362
+ ) => CheckpointDecision | Promise<CheckpointDecision>;
363
+ },
364
+ ): Promise<AgentLoopRunResult> {
365
+ return new Promise<AgentLoopRunResult>((resolveResult, reject) => {
366
+ const pending: PendingRun = {
367
+ resolve: (history: Message[]) =>
368
+ resolveResult({
369
+ history,
370
+ exitReason: pending.exitReason,
371
+ }),
372
+ reject,
373
+ messages,
374
+ onEvent,
375
+ exitReason: null,
376
+ onCheckpoint: options?.onCheckpoint
377
+ ? async (checkpoint) => {
378
+ const decision = await options.onCheckpoint!(checkpoint);
379
+ pending.exitReason = decision === "continue" ? null : decision;
380
+ return decision;
381
+ }
382
+ : undefined,
383
+ };
384
+ pendingRuns.push(pending);
351
385
  });
352
386
  }
353
387
  },
@@ -411,9 +445,9 @@ function makeConversation(
411
445
  "conv-1",
412
446
  provider,
413
447
  "system prompt",
414
- 4096,
415
448
  sendToClient ?? (() => {}),
416
449
  "/tmp",
450
+ { maxTokens: 4096 },
417
451
  );
418
452
  const conversationWithWorkspaceDeps =
419
453
  conversationObj as ConversationWithWorkspaceDeps;
@@ -524,12 +558,12 @@ describe("Conversation message queue", () => {
524
558
  const events2: ServerMessage[] = [];
525
559
 
526
560
  // Start first message — this will block on AgentLoop.run
527
- const p1 = conversation.processMessage(
528
- "msg-1",
529
- [],
530
- (e) => events1.push(e),
531
- "req-1",
532
- );
561
+ const p1 = conversation.processMessage({
562
+ content: "msg-1",
563
+ attachments: [],
564
+ onEvent: (e) => events1.push(e),
565
+ requestId: "req-1",
566
+ });
533
567
 
534
568
  // Wait for the first AgentLoop.run to be registered
535
569
  await waitForPendingRun(1);
@@ -574,12 +608,12 @@ describe("Conversation message queue", () => {
574
608
  const events3: ServerMessage[] = [];
575
609
 
576
610
  // Start first message
577
- const p1 = conversation.processMessage(
578
- "msg-1",
579
- [],
580
- (e) => events1.push(e),
581
- "req-1",
582
- );
611
+ const p1 = conversation.processMessage({
612
+ content: "msg-1",
613
+ attachments: [],
614
+ onEvent: (e) => events1.push(e),
615
+ requestId: "req-1",
616
+ });
583
617
  await waitForPendingRun(1);
584
618
 
585
619
  // Enqueue two more sibling passthrough messages
@@ -649,7 +683,11 @@ describe("Conversation message queue", () => {
649
683
  const events2: ServerMessage[] = [];
650
684
 
651
685
  // Start first message
652
- const p1 = conversation.processMessage("msg-1", [], () => {}, "req-1");
686
+ const p1 = conversation.processMessage({
687
+ content: "msg-1",
688
+ attachments: [],
689
+ requestId: "req-1",
690
+ });
653
691
  await waitForPendingRun(1);
654
692
 
655
693
  // Enqueue second — simulating what handleUserMessage does
@@ -687,7 +725,11 @@ describe("Conversation message queue", () => {
687
725
  const events3: ServerMessage[] = [];
688
726
 
689
727
  // Start first message
690
- conversation.processMessage("msg-1", [], () => {}, "req-1");
728
+ conversation.processMessage({
729
+ content: "msg-1",
730
+ attachments: [],
731
+ requestId: "req-1",
732
+ });
691
733
  await waitForPendingRun(1);
692
734
 
693
735
  // Enqueue two more
@@ -746,12 +788,12 @@ describe("Conversation message queue", () => {
746
788
  const events: ServerMessage[] = [];
747
789
 
748
790
  // Start a message — blocks on AgentLoop.run
749
- const p1 = conversation.processMessage(
750
- "msg-1",
751
- [],
752
- (e) => events.push(e),
753
- "req-1",
754
- );
791
+ const p1 = conversation.processMessage({
792
+ content: "msg-1",
793
+ attachments: [],
794
+ onEvent: (e) => events.push(e),
795
+ requestId: "req-1",
796
+ });
755
797
  await waitForPendingRun(1);
756
798
 
757
799
  // Reject the AgentLoop.run() with a provider error to trigger the
@@ -773,7 +815,11 @@ describe("Conversation message queue", () => {
773
815
  await conversation.loadFromDb();
774
816
 
775
817
  // Start first message
776
- const p1 = conversation.processMessage("msg-1", [], () => {}, "req-1");
818
+ const p1 = conversation.processMessage({
819
+ content: "msg-1",
820
+ attachments: [],
821
+ requestId: "req-1",
822
+ });
777
823
  await waitForPendingRun(1);
778
824
 
779
825
  expect(conversation.getQueueDepth()).toBe(0);
@@ -810,12 +856,12 @@ describe("Conversation message queue", () => {
810
856
  const events3: ServerMessage[] = [];
811
857
 
812
858
  // Start first message — blocks on AgentLoop.run
813
- const p1 = conversation.processMessage(
814
- "msg-1",
815
- [],
816
- (e) => events1.push(e),
817
- "req-1",
818
- );
859
+ const p1 = conversation.processMessage({
860
+ content: "msg-1",
861
+ attachments: [],
862
+ onEvent: (e) => events1.push(e),
863
+ requestId: "req-1",
864
+ });
819
865
  await waitForPendingRun(1);
820
866
 
821
867
  // Enqueue a message with empty content (will fail persistUserMessage)
@@ -878,7 +924,11 @@ describe("Batched drain", () => {
878
924
  const events5: ServerMessage[] = [];
879
925
 
880
926
  // Start in-flight message (msg-1)
881
- const p1 = conversation.processMessage("msg-1", [], () => {}, "req-1");
927
+ const p1 = conversation.processMessage({
928
+ content: "msg-1",
929
+ attachments: [],
930
+ requestId: "req-1",
931
+ });
882
932
  await waitForPendingRun(1);
883
933
 
884
934
  // Enqueue 4 messages with interfaces [macos, macos, cli, macos].
@@ -985,7 +1035,11 @@ describe("Batched drain", () => {
985
1035
  const eventsWorld: ServerMessage[] = [];
986
1036
 
987
1037
  // Start in-flight message
988
- const p1 = conversation.processMessage("msg-1", [], () => {}, "req-1");
1038
+ const p1 = conversation.processMessage({
1039
+ content: "msg-1",
1040
+ attachments: [],
1041
+ requestId: "req-1",
1042
+ });
989
1043
  await waitForPendingRun(1);
990
1044
 
991
1045
  // Enqueue ["hello", "/compact", "world"]. /compact resolves to a non-
@@ -1054,7 +1108,11 @@ describe("Batched drain", () => {
1054
1108
  const eventsPlainB: ServerMessage[] = [];
1055
1109
 
1056
1110
  // Start in-flight message
1057
- const p1 = conversation.processMessage("msg-1", [], () => {}, "req-1");
1111
+ const p1 = conversation.processMessage({
1112
+ content: "msg-1",
1113
+ attachments: [],
1114
+ requestId: "req-1",
1115
+ });
1058
1116
  await waitForPendingRun(1);
1059
1117
 
1060
1118
  // Enqueue ["plain-a", "/status", "plain-b"]. /status resolves to a non-
@@ -1119,7 +1177,11 @@ describe("Batched drain", () => {
1119
1177
  await conversation.loadFromDb();
1120
1178
 
1121
1179
  // Start in-flight message
1122
- const p1 = conversation.processMessage("msg-1", [], () => {}, "req-1");
1180
+ const p1 = conversation.processMessage({
1181
+ content: "msg-1",
1182
+ attachments: [],
1183
+ requestId: "req-1",
1184
+ });
1123
1185
  await waitForPendingRun(1);
1124
1186
 
1125
1187
  // Two sibling messages, each with a distinct image attachment.
@@ -1202,7 +1264,11 @@ describe("Batched drain", () => {
1202
1264
  new MessageQueue(budget);
1203
1265
 
1204
1266
  // Start in-flight so subsequent enqueues are queued (not processed).
1205
- const p1 = conversation.processMessage("msg-1", [], () => {}, "req-1");
1267
+ const p1 = conversation.processMessage({
1268
+ content: "msg-1",
1269
+ attachments: [],
1270
+ requestId: "req-1",
1271
+ });
1206
1272
  await waitForPendingRun(1);
1207
1273
 
1208
1274
  // Fill to just-under budget: two ~500-char messages (1512+1512 = 3024 bytes).
@@ -1255,7 +1321,11 @@ describe("Batched drain", () => {
1255
1321
  // After the full drain, the byte budget must be fully reclaimed — a fresh
1256
1322
  // round of enqueues up to the budget should succeed again. Spin up another
1257
1323
  // in-flight message to reach the queueing state.
1258
- const p2 = conversation.processMessage("msg-2", [], () => {}, "req-2");
1324
+ const p2 = conversation.processMessage({
1325
+ content: "msg-2",
1326
+ attachments: [],
1327
+ requestId: "req-2",
1328
+ });
1259
1329
  await waitForPendingRun(3);
1260
1330
  expect(
1261
1331
  conversation.enqueueMessage({
@@ -1297,7 +1367,11 @@ describe("Batched drain correctness fixes", () => {
1297
1367
  const eventsRegular: ServerMessage[] = [];
1298
1368
 
1299
1369
  // Start in-flight message
1300
- const p1 = conversation.processMessage("msg-1", [], () => {}, "req-1");
1370
+ const p1 = conversation.processMessage({
1371
+ content: "msg-1",
1372
+ attachments: [],
1373
+ requestId: "req-1",
1374
+ });
1301
1375
  await waitForPendingRun(1);
1302
1376
 
1303
1377
  // Enqueue a surface-action message (activeSurfaceId set + tracked in
@@ -1359,12 +1433,12 @@ describe("Batched drain correctness fixes", () => {
1359
1433
  const events4: ServerMessage[] = [];
1360
1434
 
1361
1435
  // Start in-flight message
1362
- const p1 = conversation.processMessage(
1363
- "msg-1",
1364
- [],
1365
- (e) => events1.push(e),
1366
- "req-1",
1367
- );
1436
+ const p1 = conversation.processMessage({
1437
+ content: "msg-1",
1438
+ attachments: [],
1439
+ onEvent: (e) => events1.push(e),
1440
+ requestId: "req-1",
1441
+ });
1368
1442
  await waitForPendingRun(1);
1369
1443
 
1370
1444
  // Enqueue three sibling passthroughs (msg-2 = head, msg-3 = mid,
@@ -1438,12 +1512,12 @@ describe("Batched drain correctness fixes", () => {
1438
1512
  const events4: ServerMessage[] = [];
1439
1513
 
1440
1514
  // Start in-flight message
1441
- const p1 = conversation.processMessage(
1442
- "msg-1",
1443
- [],
1444
- (e) => events1.push(e),
1445
- "req-1",
1446
- );
1515
+ const p1 = conversation.processMessage({
1516
+ content: "msg-1",
1517
+ attachments: [],
1518
+ onEvent: (e) => events1.push(e),
1519
+ requestId: "req-1",
1520
+ });
1447
1521
  await waitForPendingRun(1);
1448
1522
 
1449
1523
  // Enqueue three siblings. Configure addMessage to throw for the second
@@ -1500,12 +1574,12 @@ describe("Batched drain correctness fixes", () => {
1500
1574
  const events3: ServerMessage[] = [];
1501
1575
  const events4: ServerMessage[] = [];
1502
1576
 
1503
- const p1 = conversation.processMessage(
1504
- "msg-1",
1505
- [],
1506
- (e) => events1.push(e),
1507
- "req-1",
1508
- );
1577
+ const p1 = conversation.processMessage({
1578
+ content: "msg-1",
1579
+ attachments: [],
1580
+ onEvent: (e) => events1.push(e),
1581
+ requestId: "req-1",
1582
+ });
1509
1583
  await waitForPendingRun(1);
1510
1584
 
1511
1585
  // Mid tail will fail to persist. After the batched run resolves,
@@ -1556,7 +1630,11 @@ describe("Batched drain correctness fixes", () => {
1556
1630
  await conversation.loadFromDb();
1557
1631
 
1558
1632
  // Start in-flight message
1559
- const p1 = conversation.processMessage("msg-1", [], () => {}, "req-1");
1633
+ const p1 = conversation.processMessage({
1634
+ content: "msg-1",
1635
+ attachments: [],
1636
+ requestId: "req-1",
1637
+ });
1560
1638
  await waitForPendingRun(1);
1561
1639
 
1562
1640
  // Snapshot the count before drain so we only compare batch-emitted
@@ -1630,7 +1708,11 @@ describe("Conversation queue policy helpers", () => {
1630
1708
  await conversation.loadFromDb();
1631
1709
 
1632
1710
  // Start processing to make the session busy
1633
- conversation.processMessage("msg-1", [], () => {}, "req-1");
1711
+ conversation.processMessage({
1712
+ content: "msg-1",
1713
+ attachments: [],
1714
+ requestId: "req-1",
1715
+ });
1634
1716
  await waitForPendingRun(1);
1635
1717
 
1636
1718
  // Enqueue a message while processing
@@ -1657,7 +1739,11 @@ describe("Conversation queue policy helpers", () => {
1657
1739
  await conversation.loadFromDb();
1658
1740
 
1659
1741
  // Start processing — but don't enqueue anything
1660
- conversation.processMessage("msg-1", [], () => {}, "req-1");
1742
+ conversation.processMessage({
1743
+ content: "msg-1",
1744
+ attachments: [],
1745
+ requestId: "req-1",
1746
+ });
1661
1747
  await waitForPendingRun(1);
1662
1748
 
1663
1749
  expect(conversation.isProcessing()).toBe(true);
@@ -1674,7 +1760,11 @@ describe("Conversation queue policy helpers", () => {
1674
1760
  await conversation.loadFromDb();
1675
1761
 
1676
1762
  // Start processing
1677
- conversation.processMessage("msg-1", [], () => {}, "req-1");
1763
+ conversation.processMessage({
1764
+ content: "msg-1",
1765
+ attachments: [],
1766
+ requestId: "req-1",
1767
+ });
1678
1768
  await waitForPendingRun(1);
1679
1769
 
1680
1770
  // Enqueue a message
@@ -1725,12 +1815,12 @@ describe("Conversation checkpoint handoff", () => {
1725
1815
  const events1: ServerMessage[] = [];
1726
1816
 
1727
1817
  // Start processing first message
1728
- const p1 = conversation.processMessage(
1729
- "msg-1",
1730
- [],
1731
- (e) => events1.push(e),
1732
- "req-1",
1733
- );
1818
+ const p1 = conversation.processMessage({
1819
+ content: "msg-1",
1820
+ attachments: [],
1821
+ onEvent: (e) => events1.push(e),
1822
+ requestId: "req-1",
1823
+ });
1734
1824
  await waitForPendingRun(1);
1735
1825
 
1736
1826
  // Enqueue a second message while the first is processing
@@ -1748,8 +1838,8 @@ describe("Conversation checkpoint handoff", () => {
1748
1838
  history: [],
1749
1839
  });
1750
1840
 
1751
- // Because there is a queued message, the callback should return 'yield'
1752
- expect(decision).toBe("yield");
1841
+ // Because there is a queued message, the callback should yield for handoff
1842
+ expect(decision).toEqual("handoff");
1753
1843
 
1754
1844
  // Complete the run so the conversation finishes cleanly
1755
1845
  await resolveRun(0);
@@ -1776,7 +1866,11 @@ describe("Conversation checkpoint handoff", () => {
1776
1866
  await conversation.loadFromDb();
1777
1867
 
1778
1868
  // Start processing — no enqueued messages
1779
- const p1 = conversation.processMessage("msg-1", [], () => {}, "req-1");
1869
+ const p1 = conversation.processMessage({
1870
+ content: "msg-1",
1871
+ attachments: [],
1872
+ requestId: "req-1",
1873
+ });
1780
1874
  await waitForPendingRun(1);
1781
1875
 
1782
1876
  expect(conversation.hasQueuedMessages()).toBe(false);
@@ -1809,12 +1903,12 @@ describe("Conversation checkpoint handoff", () => {
1809
1903
  const events4: ServerMessage[] = [];
1810
1904
 
1811
1905
  // Start first message (mid-tool-use — will yield at the next checkpoint)
1812
- const p1 = conversation.processMessage(
1813
- "msg-1",
1814
- [],
1815
- (e) => events1.push(e),
1816
- "req-1",
1817
- );
1906
+ const p1 = conversation.processMessage({
1907
+ content: "msg-1",
1908
+ attachments: [],
1909
+ onEvent: (e) => events1.push(e),
1910
+ requestId: "req-1",
1911
+ });
1818
1912
  await waitForPendingRun(1);
1819
1913
 
1820
1914
  // Enqueue three sibling passthroughs while msg-1 is mid-turn
@@ -1844,7 +1938,7 @@ describe("Conversation checkpoint handoff", () => {
1844
1938
  hasToolUse: true,
1845
1939
  history: [],
1846
1940
  });
1847
- expect(decision).toBe("yield");
1941
+ expect(decision).toEqual("handoff");
1848
1942
 
1849
1943
  // Complete first run
1850
1944
  await resolveRun(0);
@@ -1877,12 +1971,12 @@ describe("Conversation checkpoint handoff", () => {
1877
1971
  const events2: ServerMessage[] = [];
1878
1972
 
1879
1973
  // Start processing first message
1880
- const p1 = conversation.processMessage(
1881
- "msg-1",
1882
- [],
1883
- (e) => events1.push(e),
1884
- "req-1",
1885
- );
1974
+ const p1 = conversation.processMessage({
1975
+ content: "msg-1",
1976
+ attachments: [],
1977
+ onEvent: (e) => events1.push(e),
1978
+ requestId: "req-1",
1979
+ });
1886
1980
  await waitForPendingRun(1);
1887
1981
 
1888
1982
  // Enqueue a second message while the first is processing
@@ -1894,7 +1988,7 @@ describe("Conversation checkpoint handoff", () => {
1894
1988
  expect(conversation.hasQueuedMessages()).toBe(true);
1895
1989
 
1896
1990
  // Simulate tool-use turns: the agent loop calls onCheckpoint at each turn boundary.
1897
- // Because there is a queued message, the callback should return 'yield'.
1991
+ // Because there is a queued message, the callback should yield for handoff.
1898
1992
  const run = pendingRuns[0];
1899
1993
  expect(run.onCheckpoint).toBeDefined();
1900
1994
 
@@ -1906,7 +2000,7 @@ describe("Conversation checkpoint handoff", () => {
1906
2000
  hasToolUse: true,
1907
2001
  history: [],
1908
2002
  });
1909
- expect(decision).toBe("yield");
2003
+ expect(decision).toEqual("handoff");
1910
2004
 
1911
2005
  // Complete the run (AgentLoop resolves after yielding)
1912
2006
  await resolveRun(0);
@@ -1948,12 +2042,12 @@ describe("Conversation checkpoint handoff", () => {
1948
2042
  };
1949
2043
 
1950
2044
  // Start processing message A
1951
- const pA = conversation.processMessage(
1952
- "msg-A",
1953
- [],
1954
- (e) => eventsA.push(e),
1955
- "req-A",
1956
- );
2045
+ const pA = conversation.processMessage({
2046
+ content: "msg-A",
2047
+ attachments: [],
2048
+ onEvent: (e) => eventsA.push(e),
2049
+ requestId: "req-A",
2050
+ });
1957
2051
  await waitForPendingRun(1);
1958
2052
 
1959
2053
  // Enqueue messages B, C, D — each on a distinct userMessageInterface so the
@@ -1992,7 +2086,7 @@ describe("Conversation checkpoint handoff", () => {
1992
2086
  hasToolUse: true,
1993
2087
  history: [],
1994
2088
  }),
1995
- ).toBe("yield");
2089
+ ).toEqual("handoff");
1996
2090
  await resolveRun(0);
1997
2091
  await pA;
1998
2092
 
@@ -2009,7 +2103,7 @@ describe("Conversation checkpoint handoff", () => {
2009
2103
  hasToolUse: true,
2010
2104
  history: [],
2011
2105
  }),
2012
- ).toBe("yield");
2106
+ ).toEqual("handoff");
2013
2107
  await resolveRun(1);
2014
2108
  await waitForPendingRun(3);
2015
2109
 
@@ -2024,7 +2118,7 @@ describe("Conversation checkpoint handoff", () => {
2024
2118
  hasToolUse: true,
2025
2119
  history: [],
2026
2120
  }),
2027
- ).toBe("yield");
2121
+ ).toEqual("handoff");
2028
2122
  await resolveRun(2);
2029
2123
  await waitForPendingRun(4);
2030
2124
 
@@ -2056,12 +2150,12 @@ describe("Conversation checkpoint handoff", () => {
2056
2150
  const eventsC: ServerMessage[] = [];
2057
2151
 
2058
2152
  // Start processing message A
2059
- const pA = conversation.processMessage(
2060
- "msg-A",
2061
- [],
2062
- (e) => eventsA.push(e),
2063
- "req-A",
2064
- );
2153
+ const pA = conversation.processMessage({
2154
+ content: "msg-A",
2155
+ attachments: [],
2156
+ onEvent: (e) => eventsA.push(e),
2157
+ requestId: "req-A",
2158
+ });
2065
2159
  await waitForPendingRun(1);
2066
2160
 
2067
2161
  // Enqueue B (empty content — will fail to persist) and C (valid)
@@ -2107,7 +2201,11 @@ describe("Conversation checkpoint handoff", () => {
2107
2201
  await conversation.loadFromDb();
2108
2202
 
2109
2203
  // Start processing
2110
- const p1 = conversation.processMessage("msg-1", [], () => {}, "req-1");
2204
+ const p1 = conversation.processMessage({
2205
+ content: "msg-1",
2206
+ attachments: [],
2207
+ requestId: "req-1",
2208
+ });
2111
2209
  await waitForPendingRun(1);
2112
2210
 
2113
2211
  // The first run should have onCheckpoint
@@ -2151,7 +2249,11 @@ describe("Conversation usage requestId correlation", () => {
2151
2249
  const conversation = makeConversation();
2152
2250
  await conversation.loadFromDb();
2153
2251
 
2154
- const p1 = conversation.processMessage("msg-1", [], () => {}, "req-42");
2252
+ const p1 = conversation.processMessage({
2253
+ content: "msg-1",
2254
+ attachments: [],
2255
+ requestId: "req-42",
2256
+ });
2155
2257
  await waitForPendingRun(1);
2156
2258
 
2157
2259
  // Complete the run — this triggers recordUsage with the request's ID
@@ -2184,7 +2286,11 @@ describe("Terminal trace events on rejection/failure", () => {
2184
2286
  await conversation.loadFromDb();
2185
2287
 
2186
2288
  // Start first message
2187
- const p1 = conversation.processMessage("msg-1", [], () => {}, "req-1");
2289
+ const p1 = conversation.processMessage({
2290
+ content: "msg-1",
2291
+ attachments: [],
2292
+ requestId: "req-1",
2293
+ });
2188
2294
  await waitForPendingRun(1);
2189
2295
 
2190
2296
  // Enqueue empty content (will fail persistUserMessage)
@@ -2232,12 +2338,12 @@ describe("Conversation host attachment directives", () => {
2232
2338
  const conversation = makeConversation((msg) => clientEvents.push(msg));
2233
2339
  await conversation.loadFromDb();
2234
2340
 
2235
- const p1 = conversation.processMessage(
2236
- "msg-1",
2237
- [],
2238
- (e) => events.push(e),
2239
- "req-1",
2240
- );
2341
+ const p1 = conversation.processMessage({
2342
+ content: "msg-1",
2343
+ attachments: [],
2344
+ onEvent: (e) => events.push(e),
2345
+ requestId: "req-1",
2346
+ });
2241
2347
  await waitForPendingRun(1);
2242
2348
 
2243
2349
  const run = pendingRuns[0];
@@ -2302,12 +2408,12 @@ describe("Conversation host attachment directives", () => {
2302
2408
  const conversation = makeConversation((msg) => clientEvents.push(msg));
2303
2409
  await conversation.loadFromDb();
2304
2410
 
2305
- const p1 = conversation.processMessage(
2306
- "msg-1",
2307
- [],
2308
- (e) => events.push(e),
2309
- "req-1",
2310
- );
2411
+ const p1 = conversation.processMessage({
2412
+ content: "msg-1",
2413
+ attachments: [],
2414
+ onEvent: (e) => events.push(e),
2415
+ requestId: "req-1",
2416
+ });
2311
2417
  await waitForPendingRun(1);
2312
2418
 
2313
2419
  const run = pendingRuns[0];
@@ -2389,12 +2495,12 @@ describe("Conversation attachment event payloads", () => {
2389
2495
  const conversation = makeConversation();
2390
2496
  await conversation.loadFromDb();
2391
2497
 
2392
- const p1 = conversation.processMessage(
2393
- "msg-1",
2394
- [],
2395
- (e) => events.push(e),
2396
- "req-1",
2397
- );
2498
+ const p1 = conversation.processMessage({
2499
+ content: "msg-1",
2500
+ attachments: [],
2501
+ onEvent: (e) => events.push(e),
2502
+ requestId: "req-1",
2503
+ });
2398
2504
  await waitForPendingRun(1);
2399
2505
 
2400
2506
  const run = pendingRuns[0];
@@ -2452,12 +2558,12 @@ describe("Conversation attachment event payloads", () => {
2452
2558
  const conversation = makeConversation();
2453
2559
  await conversation.loadFromDb();
2454
2560
 
2455
- const p1 = conversation.processMessage(
2456
- "msg-1",
2457
- [],
2458
- (e) => events1.push(e),
2459
- "req-1",
2460
- );
2561
+ const p1 = conversation.processMessage({
2562
+ content: "msg-1",
2563
+ attachments: [],
2564
+ onEvent: (e) => events1.push(e),
2565
+ requestId: "req-1",
2566
+ });
2461
2567
  await waitForPendingRun(1);
2462
2568
 
2463
2569
  // Queue a second message so the first run yields via checkpoint handoff.
@@ -2472,7 +2578,7 @@ describe("Conversation attachment event payloads", () => {
2472
2578
  hasToolUse: true,
2473
2579
  history: [],
2474
2580
  }),
2475
- ).toBe("yield");
2581
+ ).toEqual("handoff");
2476
2582
 
2477
2583
  const assistantMsg: Message = {
2478
2584
  role: "assistant",
@@ -2537,12 +2643,12 @@ describe("Regression: cancel semantics and error channel split", () => {
2537
2643
  await conversation.loadFromDb();
2538
2644
 
2539
2645
  // Start processing a message — collect events from the per-message callback
2540
- const p1 = conversation.processMessage(
2541
- "msg-1",
2542
- [],
2543
- (e) => msgEvents.push(e),
2544
- "req-1",
2545
- );
2646
+ const p1 = conversation.processMessage({
2647
+ content: "msg-1",
2648
+ attachments: [],
2649
+ onEvent: (e) => msgEvents.push(e),
2650
+ requestId: "req-1",
2651
+ });
2546
2652
  await waitForPendingRun(1);
2547
2653
 
2548
2654
  // User cancels — sets the abort signal
@@ -2571,12 +2677,12 @@ describe("Regression: cancel semantics and error channel split", () => {
2571
2677
  await conversation.loadFromDb();
2572
2678
  linkAttachmentShouldThrow = true;
2573
2679
 
2574
- const p1 = conversation.processMessage(
2575
- "msg-1",
2576
- [],
2577
- (e) => events.push(e),
2578
- "req-1",
2579
- );
2680
+ const p1 = conversation.processMessage({
2681
+ content: "msg-1",
2682
+ attachments: [],
2683
+ onEvent: (e) => events.push(e),
2684
+ requestId: "req-1",
2685
+ });
2580
2686
  await waitForPendingRun(1);
2581
2687
  const run = pendingRuns[0];
2582
2688
  const assistantMsg: Message = {
@@ -2625,12 +2731,12 @@ describe("Regression: cancel semantics and error channel split", () => {
2625
2731
  const conversation = makeConversation();
2626
2732
  await conversation.loadFromDb();
2627
2733
 
2628
- const p1 = conversation.processMessage(
2629
- "msg-1",
2630
- [],
2631
- (e) => allEvents.push(e),
2632
- "req-1",
2633
- );
2734
+ const p1 = conversation.processMessage({
2735
+ content: "msg-1",
2736
+ attachments: [],
2737
+ onEvent: (e) => allEvents.push(e),
2738
+ requestId: "req-1",
2739
+ });
2634
2740
  await waitForPendingRun(1);
2635
2741
 
2636
2742
  // Simulate a provider failure
@@ -2654,12 +2760,12 @@ describe("Regression: cancel semantics and error channel split", () => {
2654
2760
 
2655
2761
  const eventsPerMsg: ServerMessage[][] = [[], [], []];
2656
2762
 
2657
- conversation.processMessage(
2658
- "msg-1",
2659
- [],
2660
- (e) => eventsPerMsg[0].push(e),
2661
- "req-1",
2662
- );
2763
+ conversation.processMessage({
2764
+ content: "msg-1",
2765
+ attachments: [],
2766
+ onEvent: (e) => eventsPerMsg[0].push(e),
2767
+ requestId: "req-1",
2768
+ });
2663
2769
  await waitForPendingRun(1);
2664
2770
 
2665
2771
  conversation.enqueueMessage({
@@ -2706,12 +2812,12 @@ describe("Regression: cancel semantics and error channel split", () => {
2706
2812
  const events2: ServerMessage[] = [];
2707
2813
 
2708
2814
  // Start first message (promise intentionally not awaited — we test queue drain behavior)
2709
- const _p1 = conversation.processMessage(
2710
- "msg-1",
2711
- [],
2712
- (e) => events1.push(e),
2713
- "req-1",
2714
- );
2815
+ const _p1 = conversation.processMessage({
2816
+ content: "msg-1",
2817
+ attachments: [],
2818
+ onEvent: (e) => events1.push(e),
2819
+ requestId: "req-1",
2820
+ });
2715
2821
  await waitForPendingRun(1);
2716
2822
 
2717
2823
  // Enqueue a second message while the first is processing