@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
@@ -26,13 +26,13 @@ import { parseFrontmatterFields } from "../skills/frontmatter.js";
26
26
  // Fixtures
27
27
  // ---------------------------------------------------------------------------
28
28
 
29
- /** A SKILL.md with `feature-flag: email-channel` declared in its vellum metadata. */
29
+ /** A SKILL.md with `feature-flag: a2a-channel` declared in its vellum metadata. */
30
30
  const SKILL_MD_WITH_FLAG = `---
31
31
  name: "Email Setup"
32
32
  description: "Set up email integration"
33
33
  metadata:
34
34
  vellum:
35
- feature-flag: email-channel
35
+ feature-flag: a2a-channel
36
36
  ---
37
37
 
38
38
  Instructions for the email setup skill.
@@ -126,16 +126,16 @@ describe("frontmatter feature-flag integration", () => {
126
126
  expect(metadataObj).toBeTruthy();
127
127
 
128
128
  const vellum = metadataObj.vellum as Record<string, unknown>;
129
- expect(vellum["feature-flag"]).toBe("email-channel");
129
+ expect(vellum["feature-flag"]).toBe("a2a-channel");
130
130
  });
131
131
 
132
132
  test("skillFlagKey returns correct key for parsed skill", () => {
133
133
  const skill = buildSkillSummary("email-setup", SKILL_MD_WITH_FLAG);
134
134
  expect(skill).not.toBeNull();
135
- expect(skill!.featureFlag).toBe("email-channel");
135
+ expect(skill!.featureFlag).toBe("a2a-channel");
136
136
 
137
137
  const key = skillFlagKey(skill!);
138
- expect(key).toBe("email-channel");
138
+ expect(key).toBe("a2a-channel");
139
139
  });
140
140
 
141
141
  test("skillFlagKey returns undefined for skill without feature-flag", () => {
@@ -149,7 +149,7 @@ describe("frontmatter feature-flag integration", () => {
149
149
 
150
150
  test("resolveSkillStates includes skill with featureFlag when flag is ON", () => {
151
151
  setOverridesForTesting({
152
- "email-channel": true,
152
+ "a2a-channel": true,
153
153
  });
154
154
  const skill = buildSkillSummary("email-setup", SKILL_MD_WITH_FLAG)!;
155
155
  const config = makeConfig();
@@ -161,7 +161,7 @@ describe("frontmatter feature-flag integration", () => {
161
161
 
162
162
  test("resolveSkillStates excludes skill with featureFlag when flag defaults to OFF", () => {
163
163
  const skill = buildSkillSummary("email-setup", SKILL_MD_WITH_FLAG)!;
164
- // "email-channel" is in the registry with defaultEnabled: false
164
+ // "a2a-channel" is in the registry with defaultEnabled: false
165
165
  const config = makeConfig();
166
166
 
167
167
  const resolved = resolveSkillStates([skill], config);
@@ -189,17 +189,17 @@ describe("frontmatter feature-flag integration", () => {
189
189
  const metadataObj = parsed!.fields.metadata as Record<string, unknown>;
190
190
  const vellum = metadataObj.vellum as Record<string, unknown>;
191
191
  const flagId = vellum["feature-flag"];
192
- expect(flagId).toBe("email-channel");
192
+ expect(flagId).toBe("a2a-channel");
193
193
 
194
194
  // Step 2: Build SkillSummary (as the catalog loader would)
195
195
  const skill = buildSkillSummary("email-setup", SKILL_MD_WITH_FLAG)!;
196
- expect(skill.featureFlag).toBe("email-channel");
196
+ expect(skill.featureFlag).toBe("a2a-channel");
197
197
 
198
198
  // Step 3: Derive the flag key
199
199
  const key = skillFlagKey(skill);
200
- expect(key).toBe("email-channel");
200
+ expect(key).toBe("a2a-channel");
201
201
 
202
- // Step 4: Check flag state — "email-channel" has defaultEnabled: false in registry
202
+ // Step 4: Check flag state — "a2a-channel" has defaultEnabled: false in registry
203
203
  const configDefault = makeConfig();
204
204
  expect(isAssistantFeatureFlagEnabled(key!, configDefault)).toBe(false);
205
205
 
@@ -14,9 +14,9 @@ afterEach(() => {
14
14
  setOverridesForTesting({});
15
15
  });
16
16
 
17
- const DECLARED_FLAG_ID = "email-channel";
17
+ const DECLARED_FLAG_ID = "a2a-channel";
18
18
  const DECLARED_FLAG_KEY = DECLARED_FLAG_ID;
19
- const DECLARED_SKILL_ID = "email-channel";
19
+ const DECLARED_SKILL_ID = "a2a-channel";
20
20
  const ENABLED_UNDECLARED_FLAG_KEY = "enabled-undeclared-flag";
21
21
  const ENABLED_UNDECLARED_SKILL_ID = "enabled-undeclared-skill";
22
22
  // ---------------------------------------------------------------------------
@@ -143,7 +143,7 @@ describe("isAssistantFeatureFlagEnabled", () => {
143
143
 
144
144
  test("falls back to registry default when no override", () => {
145
145
  const config = makeConfig();
146
- // email-channel defaults to false in the registry
146
+ // a2a-channel defaults to false in the registry
147
147
  expect(isAssistantFeatureFlagEnabled(DECLARED_FLAG_KEY, config)).toBe(
148
148
  false,
149
149
  );
@@ -212,7 +212,7 @@ describe("resolveSkillStates with feature flags", () => {
212
212
  const config = makeConfig();
213
213
 
214
214
  const resolved = resolveSkillStates(catalog, config);
215
- // email-channel registry default is false, so it is filtered out
215
+ // a2a-channel registry default is false, so it is filtered out
216
216
  expect(resolved.length).toBe(0);
217
217
  });
218
218
 
@@ -273,7 +273,7 @@ describe("resolveSkillStates with feature flags", () => {
273
273
  const resolved = resolveSkillStates(catalog, config);
274
274
  const ids = resolved.map((r) => r.summary.id);
275
275
 
276
- // email-channel and deploy explicitly false; one unrelated skill explicitly true
276
+ // a2a-channel and deploy explicitly false; one unrelated skill explicitly true
277
277
  expect(ids).toEqual([ENABLED_UNDECLARED_SKILL_ID]);
278
278
  });
279
279
  });
@@ -284,7 +284,7 @@ describe("resolveSkillStates with feature flags", () => {
284
284
 
285
285
  describe("resolveSkillStates with frontmatter featureFlag", () => {
286
286
  test("skill with featureFlag (defaultEnabled: false) is excluded when no config override", () => {
287
- // email-channel has defaultEnabled: false in the registry
287
+ // a2a-channel has defaultEnabled: false in the registry
288
288
  const catalog = [makeSkill(DECLARED_SKILL_ID, "bundled", DECLARED_FLAG_ID)];
289
289
  const config = makeConfig();
290
290
 
@@ -12,8 +12,8 @@ const TEST_DIR = process.env.VELLUM_WORKSPACE_DIR!;
12
12
 
13
13
  let currentConfig: Record<string, unknown> = {};
14
14
 
15
- const DECLARED_SKILL_ID = "email-channel";
16
- const DECLARED_FLAG_KEY = "email-channel";
15
+ const DECLARED_SKILL_ID = "a2a-channel";
16
+ const DECLARED_FLAG_KEY = "a2a-channel";
17
17
 
18
18
  const noopLogger = new Proxy({} as Record<string, unknown>, {
19
19
  get: (_target, prop) => (prop === "child" ? () => noopLogger : () => {}),
@@ -99,8 +99,8 @@ describe("skill_load feature flag enforcement", () => {
99
99
  test("returns deterministic error for flag OFF skill", async () => {
100
100
  writeSkill(
101
101
  DECLARED_SKILL_ID,
102
- "Email Channel",
103
- "Toggle email channel behavior",
102
+ "A2A Channel",
103
+ "Toggle A2A channel behavior",
104
104
  "Use the feature.",
105
105
  );
106
106
 
@@ -116,8 +116,8 @@ describe("skill_load feature flag enforcement", () => {
116
116
  test("loads skill normally when flag is ON", async () => {
117
117
  writeSkill(
118
118
  DECLARED_SKILL_ID,
119
- "Email Channel",
120
- "Toggle email channel behavior",
119
+ "A2A Channel",
120
+ "Toggle A2A channel behavior",
121
121
  "Use the feature.",
122
122
  );
123
123
 
@@ -126,14 +126,14 @@ describe("skill_load feature flag enforcement", () => {
126
126
  const result = await executeSkillLoad({ skill: DECLARED_SKILL_ID });
127
127
 
128
128
  expect(result.isError).toBe(false);
129
- expect(result.content).toContain("Skill: Email Channel");
129
+ expect(result.content).toContain("Skill: A2A Channel");
130
130
  });
131
131
 
132
132
  test("returns error when flag key is absent (registry defaults to disabled)", async () => {
133
133
  writeSkill(
134
134
  DECLARED_SKILL_ID,
135
- "Email Channel",
136
- "Toggle email channel behavior",
135
+ "A2A Channel",
136
+ "Toggle A2A channel behavior",
137
137
  "Use the feature.",
138
138
  );
139
139
 
@@ -141,7 +141,7 @@ describe("skill_load feature flag enforcement", () => {
141
141
 
142
142
  const result = await executeSkillLoad({ skill: DECLARED_SKILL_ID });
143
143
 
144
- // email-channel is declared in the registry with defaultEnabled: false
144
+ // a2a-channel is declared in the registry with defaultEnabled: false
145
145
  expect(result.isError).toBe(true);
146
146
  expect(result.content).toContain("disabled by feature flag");
147
147
  });
@@ -306,6 +306,7 @@ describe("getSkillFiles — provider chain fallback", () => {
306
306
  kind: "catalog",
307
307
  origin: "vellum",
308
308
  status: "available",
309
+ category: "knowledge",
309
310
  }),
310
311
  };
311
312
 
@@ -322,6 +323,7 @@ describe("getSkillFiles — provider chain fallback", () => {
322
323
  kind: "catalog",
323
324
  origin: "vellum",
324
325
  status: "available",
326
+ category: "knowledge",
325
327
  });
326
328
  expect(result.files).toHaveLength(2);
327
329
  for (const entry of result.files) {
@@ -455,6 +457,7 @@ describe("getSkillFiles — provider chain fallback", () => {
455
457
  kind: "catalog",
456
458
  origin: "vellum",
457
459
  status: "available",
460
+ category: "knowledge",
458
461
  }),
459
462
  };
460
463
 
@@ -479,6 +482,7 @@ describe("getSkillFiles — provider chain fallback", () => {
479
482
  kind: "catalog",
480
483
  origin: "vellum",
481
484
  status: "available",
485
+ category: "knowledge",
482
486
  }),
483
487
  };
484
488
 
@@ -504,6 +508,7 @@ describe("getSkillFiles — provider chain fallback", () => {
504
508
  kind: "catalog",
505
509
  origin: "vellum",
506
510
  status: "available",
511
+ category: "knowledge",
507
512
  }),
508
513
  };
509
514
 
@@ -544,6 +549,7 @@ describe("getSkillFiles — provider chain fallback", () => {
544
549
  kind: "catalog",
545
550
  origin: "skillssh",
546
551
  status: "available",
552
+ category: "knowledge",
547
553
  slug: id,
548
554
  sourceRepo: "owner/repo",
549
555
  installs: 0,
@@ -603,6 +609,7 @@ describe("getSkillFiles — provider chain fallback", () => {
603
609
  kind: "catalog",
604
610
  origin: "clawhub",
605
611
  status: "available",
612
+ category: "knowledge",
606
613
  slug: "cool-tool",
607
614
  author: "someone",
608
615
  stars: 5,
@@ -662,6 +669,7 @@ describe("getSkillFiles — provider chain fallback", () => {
662
669
  kind: "catalog",
663
670
  origin: "vellum",
664
671
  status: "available",
672
+ category: "knowledge",
665
673
  }),
666
674
  };
667
675
  mockSkillsshProvider = {
@@ -678,6 +686,7 @@ describe("getSkillFiles — provider chain fallback", () => {
678
686
  kind: "catalog",
679
687
  origin: "skillssh",
680
688
  status: "available",
689
+ category: "knowledge",
681
690
  slug: "contested-skill",
682
691
  sourceRepo: "",
683
692
  installs: 0,
@@ -697,6 +706,7 @@ describe("getSkillFiles — provider chain fallback", () => {
697
706
  kind: "catalog",
698
707
  origin: "clawhub",
699
708
  status: "available",
709
+ category: "knowledge",
700
710
  slug: "contested-skill",
701
711
  author: "",
702
712
  stars: 0,
@@ -384,6 +384,7 @@ describe("toSlimSkill", () => {
384
384
  expect(slim!.kind).toBe("catalog");
385
385
  expect(slim!.status).toBe("available");
386
386
  expect(slim!.origin).toBe("skillssh");
387
+ expect(slim!.category).toBe("knowledge");
387
388
  expect((slim as any).slug).toBe("owner/repo/my-skill");
388
389
  expect((slim as any).sourceRepo).toBe("owner/repo");
389
390
  expect((slim as any).installs).toBe(0);
@@ -54,8 +54,8 @@ describe("starter task surface actions", () => {
54
54
  test("forwards prompt payload as normal message content", () => {
55
55
  const forwarded: string[] = [];
56
56
  const ctx = makeContext();
57
- ctx.processMessage = async (content) => {
58
- forwarded.push(content);
57
+ ctx.processMessage = async (options) => {
58
+ forwarded.push(options.content);
59
59
  return "ok";
60
60
  };
61
61
  ctx.pendingSurfaceActions.set("surf-1", { surfaceType: "dynamic_page" });
@@ -74,8 +74,8 @@ describe("starter task surface actions", () => {
74
74
  test("falls back to human-readable summary with action data when prompt is absent", () => {
75
75
  const forwarded: string[] = [];
76
76
  const ctx = makeContext();
77
- ctx.processMessage = async (content) => {
78
- forwarded.push(content);
77
+ ctx.processMessage = async (options) => {
78
+ forwarded.push(options.content);
79
79
  return "ok";
80
80
  };
81
81
  ctx.pendingSurfaceActions.set("surf-2", { surfaceType: "dynamic_page" });
@@ -94,8 +94,8 @@ describe("starter task surface actions", () => {
94
94
  test("does not treat prompt-like fields as relay content for non-relay actions", () => {
95
95
  const forwarded: string[] = [];
96
96
  const ctx = makeContext();
97
- ctx.processMessage = async (content) => {
98
- forwarded.push(content);
97
+ ctx.processMessage = async (options) => {
98
+ forwarded.push(options.content);
99
99
  return "ok";
100
100
  };
101
101
  ctx.pendingSurfaceActions.set("surf-3", { surfaceType: "dynamic_page" });
@@ -1,6 +1,9 @@
1
1
  import { describe, expect, test } from "bun:test";
2
2
 
3
- import { stripExistingMemoryInjections } from "../memory/graph/conversation-graph-memory.js";
3
+ import {
4
+ stripAllMemoryInjections,
5
+ stripExistingMemoryInjections,
6
+ } from "../memory/graph/conversation-graph-memory.js";
4
7
  import type { ContentBlock, Message } from "../providers/types.js";
5
8
 
6
9
  // ---------------------------------------------------------------------------
@@ -79,7 +82,13 @@ describe("stripExistingMemoryInjections", () => {
79
82
 
80
83
  test("strips 3-block memory image (marker + image + close)", () => {
81
84
  const messages = [
82
- userMsg(memoryTextBlock, memoryImageMarker, memoryImage, memoryImageClose, textBlock("hi")),
85
+ userMsg(
86
+ memoryTextBlock,
87
+ memoryImageMarker,
88
+ memoryImage,
89
+ memoryImageClose,
90
+ textBlock("hi"),
91
+ ),
83
92
  ];
84
93
  const result = stripExistingMemoryInjections(messages);
85
94
  expect(result[0].content).toEqual([textBlock("hi")]);
@@ -104,7 +113,12 @@ describe("stripExistingMemoryInjections", () => {
104
113
 
105
114
  test("strips legacy 2-block memory image (no closing tag)", () => {
106
115
  const messages = [
107
- userMsg(memoryTextBlock, legacyMemoryImageMarker, memoryImage, textBlock("hi")),
116
+ userMsg(
117
+ memoryTextBlock,
118
+ legacyMemoryImageMarker,
119
+ memoryImage,
120
+ textBlock("hi"),
121
+ ),
108
122
  ];
109
123
  const result = stripExistingMemoryInjections(messages);
110
124
  expect(result[0].content).toEqual([textBlock("hi")]);
@@ -119,10 +133,7 @@ describe("stripExistingMemoryInjections", () => {
119
133
  test("preserves user-attached image with text", () => {
120
134
  const messages = [userMsg(imageBlock, textBlock("what is this?"))];
121
135
  const result = stripExistingMemoryInjections(messages);
122
- expect(result[0].content).toEqual([
123
- imageBlock,
124
- textBlock("what is this?"),
125
- ]);
136
+ expect(result[0].content).toEqual([imageBlock, textBlock("what is this?")]);
126
137
  });
127
138
 
128
139
  test("preserves user image after stripping 3-block memory blocks", () => {
@@ -137,10 +148,7 @@ describe("stripExistingMemoryInjections", () => {
137
148
  ),
138
149
  ];
139
150
  const result = stripExistingMemoryInjections(messages);
140
- expect(result[0].content).toEqual([
141
- imageBlock,
142
- textBlock("look at this"),
143
- ]);
151
+ expect(result[0].content).toEqual([imageBlock, textBlock("look at this")]);
144
152
  });
145
153
 
146
154
  test("preserves user image-only message after stripping memory blocks", () => {
@@ -151,7 +159,11 @@ describe("stripExistingMemoryInjections", () => {
151
159
 
152
160
  test("does not modify earlier messages", () => {
153
161
  const earlier = userMsg(textBlock("first"));
154
- const messages = [earlier, assistantMsg("ok"), userMsg(memoryTextBlock, textBlock("second"))];
162
+ const messages = [
163
+ earlier,
164
+ assistantMsg("ok"),
165
+ userMsg(memoryTextBlock, textBlock("second")),
166
+ ];
155
167
  const result = stripExistingMemoryInjections(messages);
156
168
  expect(result[0]).toBe(earlier);
157
169
  expect(result[2].content).toEqual([textBlock("second")]);
@@ -165,10 +177,17 @@ describe("stripExistingMemoryInjections", () => {
165
177
 
166
178
  test("does not strip </memory_image> after memory text block (no image context)", () => {
167
179
  const messages = [
168
- userMsg(memoryTextBlock, textBlock("</memory_image>"), textBlock("hello")),
180
+ userMsg(
181
+ memoryTextBlock,
182
+ textBlock("</memory_image>"),
183
+ textBlock("hello"),
184
+ ),
169
185
  ];
170
186
  const result = stripExistingMemoryInjections(messages);
171
- expect(result[0].content).toEqual([textBlock("</memory_image>"), textBlock("hello")]);
187
+ expect(result[0].content).toEqual([
188
+ textBlock("</memory_image>"),
189
+ textBlock("hello"),
190
+ ]);
172
191
  });
173
192
 
174
193
  test("strips images-first then text (actual injectMemoryBlock order)", () => {
@@ -184,4 +203,73 @@ describe("stripExistingMemoryInjections", () => {
184
203
  const result = stripExistingMemoryInjections(messages);
185
204
  expect(result[0].content).toEqual([textBlock("hello")]);
186
205
  });
206
+
207
+ // Regression guard: the v2 helper must remain last-message-only even after
208
+ // the shared per-message strip is extracted for stripAllMemoryInjections.
209
+ test("strips ONLY the last user message, leaving earlier ones injected", () => {
210
+ const messages = [
211
+ userMsg(memoryTextBlock, textBlock("first")),
212
+ assistantMsg("ok"),
213
+ userMsg(memoryTextBlock, textBlock("second")),
214
+ ];
215
+ const result = stripExistingMemoryInjections(messages);
216
+ // Earlier user message keeps its injected memory block.
217
+ expect(result[0].content).toEqual([memoryTextBlock, textBlock("first")]);
218
+ // Last user message is stripped.
219
+ expect(result[2].content).toEqual([textBlock("second")]);
220
+ });
221
+ });
222
+
223
+ // ---------------------------------------------------------------------------
224
+ // stripAllMemoryInjections — removes memory-injected blocks from EVERY user
225
+ // message (memory-v3 live mode). Reuses the same per-message strip logic.
226
+ // ---------------------------------------------------------------------------
227
+
228
+ describe("stripAllMemoryInjections", () => {
229
+ test("strips memory blocks from multiple historical user messages", () => {
230
+ const messages = [
231
+ userMsg(memoryTextBlock, textBlock("first")),
232
+ assistantMsg("ok"),
233
+ userMsg(
234
+ memoryImageMarker,
235
+ memoryImage,
236
+ memoryImageClose,
237
+ memoryTextBlock,
238
+ textBlock("second"),
239
+ ),
240
+ assistantMsg("sure"),
241
+ userMsg(memoryTextBlock, textBlock("third")),
242
+ ];
243
+ const result = stripAllMemoryInjections(messages);
244
+ expect(result[0].content).toEqual([textBlock("first")]);
245
+ expect(result[1]).toBe(messages[1]); // assistant message untouched
246
+ expect(result[2].content).toEqual([textBlock("second")]);
247
+ expect(result[3]).toBe(messages[3]);
248
+ expect(result[4].content).toEqual([textBlock("third")]);
249
+ });
250
+
251
+ test("preserves non-memory content and user-attached images", () => {
252
+ const messages = [
253
+ userMsg(memoryTextBlock, imageBlock, textBlock("what is this?")),
254
+ userMsg(textBlock("plain message")),
255
+ ];
256
+ const result = stripAllMemoryInjections(messages);
257
+ expect(result[0].content).toEqual([imageBlock, textBlock("what is this?")]);
258
+ expect(result[1].content).toEqual([textBlock("plain message")]);
259
+ });
260
+
261
+ test("no-op (same reference) when no user message carries a memory block", () => {
262
+ const messages = [
263
+ userMsg(textBlock("hello")),
264
+ assistantMsg("hi"),
265
+ userMsg(imageBlock),
266
+ ];
267
+ const result = stripAllMemoryInjections(messages);
268
+ expect(result).toBe(messages);
269
+ });
270
+
271
+ test("no-op for empty messages array", () => {
272
+ const result = stripAllMemoryInjections([]);
273
+ expect(result).toEqual([]);
274
+ });
187
275
  });
@@ -384,7 +384,7 @@ describe("CallSiteRoutingProvider — selectProvider behavior", () => {
384
384
  },
385
385
  );
386
386
 
387
- await wrapper.sendMessage([], undefined, undefined, {
387
+ await wrapper.sendMessage([], {
388
388
  config: { callSite: "subagentSpawn" },
389
389
  });
390
390
 
@@ -420,7 +420,7 @@ describe("CallSiteRoutingProvider — selectProvider behavior", () => {
420
420
  async () => null,
421
421
  );
422
422
 
423
- await wrapper.sendMessage([], undefined, undefined, {
423
+ await wrapper.sendMessage([], {
424
424
  config: {},
425
425
  });
426
426
 
@@ -442,7 +442,7 @@ describe("GET /v1/suggestion", () => {
442
442
  role: string;
443
443
  content: Array<{ type: string; text: string }>;
444
444
  }>;
445
- const options = callArgs[3] as {
445
+ const options = callArgs[1] as {
446
446
  config?: {
447
447
  stop_sequences?: string[];
448
448
  max_tokens?: number;
@@ -557,7 +557,7 @@ describe("GET /v1/suggestion", () => {
557
557
 
558
558
  expect(provider.sendMessage).toHaveBeenCalledTimes(1);
559
559
  const callArgs = provider.sendMessage.mock.calls[0] as unknown[];
560
- const options = callArgs[3] as
560
+ const options = callArgs[1] as
561
561
  | { config?: { callSite?: string } }
562
562
  | undefined;
563
563
  expect(options?.config?.callSite).toBe("replySuggestion");
@@ -595,7 +595,7 @@ describe("GET /v1/suggestion", () => {
595
595
 
596
596
  expect(provider.sendMessage).toHaveBeenCalledTimes(1);
597
597
  const callArgs = provider.sendMessage.mock.calls[0] as unknown[];
598
- const options = callArgs[3] as
598
+ const options = callArgs[1] as
599
599
  | {
600
600
  config?: {
601
601
  temperature?: number;
@@ -5,7 +5,7 @@ import {
5
5
  conversationMessagesSyncTag,
6
6
  type ServerMessage,
7
7
  SYNC_TAGS,
8
- SyncChangedMessageSchema,
8
+ SyncChangedEventSchema,
9
9
  } from "../daemon/message-protocol.js";
10
10
 
11
11
  describe("sync message contract", () => {
@@ -39,26 +39,32 @@ describe("sync message contract", () => {
39
39
 
40
40
  test("schema rejects malformed sync_changed payloads", () => {
41
41
  expect(() =>
42
- SyncChangedMessageSchema.parse({
42
+ SyncChangedEventSchema.parse({
43
43
  type: "sync_changed",
44
44
  tags: [],
45
45
  }),
46
46
  ).toThrow();
47
47
 
48
48
  expect(() =>
49
- SyncChangedMessageSchema.parse({
49
+ SyncChangedEventSchema.parse({
50
50
  type: "sync_changed",
51
51
  tags: [""],
52
52
  }),
53
53
  ).toThrow();
54
+ });
54
55
 
55
- expect(() =>
56
- SyncChangedMessageSchema.parse({
57
- type: "sync_changed",
58
- tags: [SYNC_TAGS.assistantAvatar],
59
- cursor: 1,
60
- }),
61
- ).toThrow();
56
+ test("schema strips unknown server-stamped fields", () => {
57
+ const parsed = SyncChangedEventSchema.parse({
58
+ type: "sync_changed",
59
+ tags: [SYNC_TAGS.assistantAvatar],
60
+ cursor: 1,
61
+ });
62
+
63
+ expect(parsed).toEqual({
64
+ type: "sync_changed",
65
+ tags: [SYNC_TAGS.assistantAvatar],
66
+ });
67
+ expect("cursor" in parsed).toBe(false);
62
68
  });
63
69
 
64
70
  test("buildSyncChangedMessage includes originClientId when provided", () => {
@@ -85,10 +91,7 @@ describe("sync message contract", () => {
85
91
  });
86
92
 
87
93
  test("buildSyncChangedMessage trims and drops blank originClientId", () => {
88
- const blank = buildSyncChangedMessage(
89
- [SYNC_TAGS.assistantAvatar],
90
- " ",
91
- );
94
+ const blank = buildSyncChangedMessage([SYNC_TAGS.assistantAvatar], " ");
92
95
  expect("originClientId" in blank).toBe(false);
93
96
 
94
97
  const trimmed = buildSyncChangedMessage(
@@ -104,7 +107,7 @@ describe("sync message contract", () => {
104
107
 
105
108
  test("schema accepts a string originClientId and rejects non-string types", () => {
106
109
  expect(() =>
107
- SyncChangedMessageSchema.parse({
110
+ SyncChangedEventSchema.parse({
108
111
  type: "sync_changed",
109
112
  tags: [SYNC_TAGS.assistantAvatar],
110
113
  originClientId: "client-abc",
@@ -112,7 +115,7 @@ describe("sync message contract", () => {
112
115
  ).not.toThrow();
113
116
 
114
117
  expect(() =>
115
- SyncChangedMessageSchema.parse({
118
+ SyncChangedEventSchema.parse({
116
119
  type: "sync_changed",
117
120
  tags: [SYNC_TAGS.assistantAvatar],
118
121
  originClientId: 42,
@@ -89,6 +89,24 @@ mock.module("../prompts/persona-resolver.js", () => ({
89
89
  resolveGuardianPersona: () => mockPersona.guardianPersona,
90
90
  }));
91
91
 
92
+ const mockOauthConnections: Array<{
93
+ provider: string;
94
+ status: string;
95
+ accountInfo?: string | null;
96
+ }> = [];
97
+ const mockManagedConnections: Array<{
98
+ provider: string;
99
+ accountInfo?: string | null;
100
+ }> = [];
101
+
102
+ mock.module("../oauth/oauth-store.js", () => ({
103
+ listConnections: () => mockOauthConnections,
104
+ }));
105
+
106
+ mock.module("../credential-execution/managed-catalog.js", () => ({
107
+ getCachedManagedConnections: () => mockManagedConnections,
108
+ }));
109
+
92
110
  // Import after mock
93
111
  const { buildSystemPrompt, ensurePromptFiles, stripCommentLines } =
94
112
  await import("../prompts/system-prompt.js");
@@ -100,6 +118,8 @@ describe("buildSystemPrompt", () => {
100
118
  // no-guardian baseline.
101
119
  mockPersona.userSlug = null;
102
120
  mockPersona.guardianPersona = null;
121
+ mockOauthConnections.length = 0;
122
+ mockManagedConnections.length = 0;
103
123
  });
104
124
 
105
125
  afterEach(() => {
@@ -152,6 +172,40 @@ describe("buildSystemPrompt", () => {
152
172
  expect(identityIdx).toBeLessThan(soulIdx);
153
173
  });
154
174
 
175
+ test("renders runtime-computed dynamic sections after workspace-only static sections", () => {
176
+ const systemPromptsDir = join(TEST_DIR, "prompts", "system");
177
+ mkdirSync(systemPromptsDir, { recursive: true });
178
+ writeFileSync(
179
+ join(systemPromptsDir, "99-org-policy.md"),
180
+ "# Org policy\n\nMostly static workspace policy.\n",
181
+ );
182
+ mockManagedConnections.push({
183
+ provider: "google",
184
+ accountInfo: "user@example.com",
185
+ });
186
+
187
+ const result = buildSystemPrompt();
188
+
189
+ const staticIdx = result.indexOf("Mostly static workspace policy.");
190
+ const dynamicIdx = result.indexOf("# Connected Services");
191
+ expect(staticIdx).toBeGreaterThan(-1);
192
+ expect(dynamicIdx).toBeGreaterThan(-1);
193
+ expect(dynamicIdx).toBeGreaterThan(staticIdx);
194
+ });
195
+
196
+ test("side-chain prompt options still include IDENTITY.md and SOUL.md", () => {
197
+ writeFileSync(join(TEST_DIR, "IDENTITY.md"), "# Identity\n\nI am Vellum.");
198
+ writeFileSync(join(TEST_DIR, "SOUL.md"), "# Soul\n\nBe thoughtful.");
199
+
200
+ const result = buildSystemPrompt({
201
+ excludeBootstrap: true,
202
+ excludeCustomPrefix: true,
203
+ });
204
+
205
+ expect(result).toContain("# Identity\n\nI am Vellum.");
206
+ expect(result).toContain("# Soul\n\nBe thoughtful.");
207
+ });
208
+
155
209
  test("ignores empty SOUL.md", () => {
156
210
  writeFileSync(join(TEST_DIR, "SOUL.md"), " \n \n ");
157
211
  writeFileSync(join(TEST_DIR, "IDENTITY.md"), "# Identity\n\nI am Vellum.");