@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
@@ -0,0 +1,22 @@
1
+ import type {
2
+ EmptyResponseArgs,
3
+ EmptyResponseResult,
4
+ Middleware,
5
+ } from "../../../types.js";
6
+
7
+ /**
8
+ * Passthrough middleware for the `emptyResponse` pipeline. Forwards to
9
+ * `next(args)` unchanged; the actual empty-response decision lives in the
10
+ * terminal handler (`../terminal.ts`), wired in at the `runPipeline` call site
11
+ * in `agent/loop.ts`.
12
+ *
13
+ * Defaults register at the OUTERMOST onion position, so deciding here without
14
+ * calling `next` would shadow every later-registered plugin. Routing through
15
+ * `next(args)` lets user middleware participate normally.
16
+ */
17
+ const passthrough: Middleware<EmptyResponseArgs, EmptyResponseResult> = async (
18
+ args,
19
+ next,
20
+ ) => next(args);
21
+
22
+ export default passthrough;
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "default-empty-response",
3
+ "version": "1.0.0",
4
+ "description": "First-party default plugin wrapping the assistant's built-in empty-response pipeline with a passthrough implementation.",
5
+ "private": true,
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "main": "./register.ts",
9
+ "engines": {
10
+ "node": ">=20.12.0"
11
+ },
12
+ "peerDependencies": {
13
+ "@vellumai/plugin-api": "^0.8.0"
14
+ }
15
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Default `emptyResponse` plugin.
3
+ *
4
+ * The plugin's middleware is a passthrough — it calls `next(args)` and returns
5
+ * the result unchanged. The actual decision lives in the terminal handler in
6
+ * `./terminal.ts`, which is wired in as the pipeline's `terminal` argument by
7
+ * the `runPipeline` call site in `agent/loop.ts`. This separation matters: the
8
+ * default plugin is registered before any user plugin (defaults load first in
9
+ * `bootstrapPlugins()`), which puts it at the OUTERMOST position of the onion
10
+ * chain. If the default middleware were to decide directly without calling
11
+ * `next`, it would shadow every later-registered plugin. Routing through
12
+ * `next(args)` lets user middleware participate normally.
13
+ */
14
+
15
+ import { type Plugin } from "../../types.js";
16
+ import emptyResponse from "./middlewares/emptyResponse.js";
17
+ import pkg from "./package.json" with { type: "json" };
18
+
19
+ /** Singleton plugin — the registry rejects duplicate registrations by name. */
20
+ export const defaultEmptyResponsePlugin: Plugin = {
21
+ manifest: {
22
+ name: pkg.name,
23
+ version: pkg.version,
24
+ },
25
+ middleware: {
26
+ emptyResponse,
27
+ },
28
+ };
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Default `emptyResponse` behavior: decides whether an empty assistant turn
3
+ * should be nudged (re-queried) or accepted.
4
+ *
5
+ * This module is side-effect free: importing it does not register any plugin.
6
+ *
7
+ * The handler inspects the turn snapshot and returns one of:
8
+ *
9
+ * 1. `"nudge"` — fired in two distinct shapes:
10
+ * (a) **Post-tool empty.** The turn produced no visible text,
11
+ * no tool calls, follows at least one prior tool-use turn,
12
+ * no earlier turn in this run() has already delivered
13
+ * visible text, AND the retry counter is below
14
+ * `maxEmptyResponseRetries`. Uses `NUDGE_TEXT`.
15
+ * (b) **Refusal stop.** The provider returned
16
+ * `stopReason === "refusal"` with no visible text and no
17
+ * tool calls (Anthropic's safety classifier). Nudges even
18
+ * on turn 0 / before any tool use, because a refusal on
19
+ * the first model call of the run is a hard guarantee
20
+ * that no organic text exists yet — without intervening
21
+ * we'd persist an empty assistant bubble to the user.
22
+ * Uses the refusal-specific `REFUSAL_NUDGE_TEXT`. The
23
+ * retry cap still applies; after `maxEmptyResponseRetries`
24
+ * refusals in a row the terminal falls through to accept.
25
+ * The loop appends the chosen `nudgeText` as a `user` turn
26
+ * and re-queries the model.
27
+ * 2. `"accept"` — every other case. The turn either legitimately ended
28
+ * (model said its piece earlier), is still in progress
29
+ * (tool calls pending), or exhausted its retry budget. The
30
+ * loop pushes the assistant message and continues normally.
31
+ *
32
+ * The default never returns `"error"` — that action is an escape hatch for
33
+ * downstream plugins (e.g. a circuit breaker) that want to surface an
34
+ * explicit error instead of silently absorbing an empty turn.
35
+ *
36
+ * `MAX_EMPTY_RESPONSE_RETRIES` lives in `agent/loop.ts` and is passed in via
37
+ * `EmptyResponseArgs.maxEmptyResponseRetries` so the cap is declared in one
38
+ * place only.
39
+ */
40
+
41
+ import type { EmptyResponseArgs, EmptyResponseResult } from "../../types.js";
42
+
43
+ /**
44
+ * Canonical nudge text. Must stay verbatim so a plugin that wraps the
45
+ * default cannot accidentally see a different string.
46
+ *
47
+ * Wire-compat note: this is shown to the LLM, not the user. Edits here
48
+ * affect model behavior but not end-user UX directly.
49
+ */
50
+ const NUDGE_TEXT =
51
+ "<system_notice>Your previous response was empty. You must respond to the user with a summary of what you found or did. Do not use any tools — just respond with text.</system_notice>";
52
+
53
+ /**
54
+ * Refusal-specific nudge. Used when the provider stops with `"refusal"`
55
+ * before any tool use — i.e. the safety classifier zeroed the response.
56
+ * Kept distinct from `NUDGE_TEXT` so the model gets context-appropriate
57
+ * guidance (no "summary of what you found or did" — there is no tool
58
+ * trail to summarize on a turn-0 refusal).
59
+ *
60
+ * Wire-compat note: this is shown to the LLM, not the user. Edits here
61
+ * affect retry behavior but not end-user UX directly.
62
+ */
63
+ export const REFUSAL_NUDGE_TEXT =
64
+ '<system_notice>Your previous response was empty because the upstream provider returned stop_reason="refusal". Please answer the user\'s last message directly with a plain-text response. Do not use any tools — just respond with text.</system_notice>';
65
+
66
+ /**
67
+ * Decide whether an empty turn should be nudged or accepted. Exported so the
68
+ * agent loop can call it directly and tests can verify the decision logic.
69
+ */
70
+ export function defaultEmptyResponseTerminal(
71
+ args: EmptyResponseArgs,
72
+ ): EmptyResponseResult {
73
+ const hasVisibleText = args.responseContent.some(
74
+ (block) =>
75
+ block.type === "text" &&
76
+ typeof (block as { text?: unknown }).text === "string" &&
77
+ (block as { text: string }).text.trim().length > 0,
78
+ );
79
+
80
+ // Refusal stop with zero usable content — the provider's safety
81
+ // classifier zeroed the response. Nudge regardless of toolUseTurns or
82
+ // priorAssistantHadVisibleText: a `"refusal"` stop with no visible
83
+ // text and no tool calls IS the failure mode this branch exists to
84
+ // catch (otherwise we persist an empty assistant bubble to the user).
85
+ // Still respect the retry cap so a persistent classifier doesn't
86
+ // burn turns indefinitely.
87
+ const isRefusal =
88
+ args.stopReason === "refusal" &&
89
+ !hasVisibleText &&
90
+ args.toolUseBlocksLength === 0;
91
+
92
+ if (isRefusal && args.emptyResponseRetries < args.maxEmptyResponseRetries) {
93
+ return { action: "nudge", nudgeText: REFUSAL_NUDGE_TEXT };
94
+ }
95
+
96
+ const isEmptyTurn =
97
+ !hasVisibleText &&
98
+ args.toolUseBlocksLength === 0 &&
99
+ args.toolUseTurns > 0 &&
100
+ !args.priorAssistantHadVisibleText;
101
+
102
+ if (isEmptyTurn && args.emptyResponseRetries < args.maxEmptyResponseRetries) {
103
+ return { action: "nudge", nudgeText: NUDGE_TEXT };
104
+ }
105
+ return { action: "accept" };
106
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Default `user-prompt-submit` hook: normalizes the working message history so
3
+ * it satisfies the provider's tool-use/tool-result pairing and role-alternation
4
+ * rules before the agent loop hands it to the provider.
5
+ *
6
+ * Defaults register before any user plugin, so this hook runs at the front of
7
+ * the `user-prompt-submit` chain — every later hook sees an already-normalized
8
+ * history. The hook mutates `latestMessages` in place by reassigning it to the
9
+ * repaired list.
10
+ */
11
+
12
+ import type {
13
+ PluginHookFn,
14
+ UserPromptSubmitContext,
15
+ } from "@vellumai/plugin-api";
16
+
17
+ import { repairHistory } from "../terminal.js";
18
+
19
+ const userPromptSubmit: PluginHookFn<UserPromptSubmitContext> = async (ctx) => {
20
+ const { messages, stats } = repairHistory(ctx.latestMessages);
21
+ ctx.latestMessages = messages;
22
+ if (
23
+ stats.assistantToolResultsMigrated > 0 ||
24
+ stats.missingToolResultsInserted > 0 ||
25
+ stats.orphanToolResultsDowngraded > 0 ||
26
+ stats.consecutiveSameRoleMerged > 0
27
+ ) {
28
+ ctx.logger.warn(
29
+ { plugin: "history-repair", phase: "pre_run", ...stats },
30
+ "Repaired runtime history before provider call",
31
+ );
32
+ }
33
+ };
34
+
35
+ export default userPromptSubmit;
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "default-history-repair",
3
+ "version": "1.0.0",
4
+ "description": "First-party default plugin wrapping the assistant's built-in history-repair pipeline with a passthrough implementation.",
5
+ "private": true,
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "main": "./register.ts",
9
+ "engines": {
10
+ "node": ">=20.12.0"
11
+ },
12
+ "peerDependencies": {
13
+ "@vellumai/plugin-api": "^0.8.0"
14
+ }
15
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Default `history-repair` plugin.
3
+ *
4
+ * Contributes a `user-prompt-submit` hook that normalizes the working message
5
+ * history (tool-use/tool-result pairing, role alternation) before the agent
6
+ * loop hands it to the provider. The repair implementation lives in
7
+ * `./terminal.ts`; the hook in `./hooks/user-prompt-submit.ts` wires it into
8
+ * the lifecycle. Defaults register before user plugins, so this normalization
9
+ * runs at the front of the hook chain.
10
+ */
11
+
12
+ import { type Plugin } from "../../types.js";
13
+ import userPromptSubmit from "./hooks/user-prompt-submit.js";
14
+ import pkg from "./package.json" with { type: "json" };
15
+
16
+ export const defaultHistoryRepairPlugin: Plugin = {
17
+ manifest: {
18
+ name: pkg.name,
19
+ version: pkg.version,
20
+ },
21
+ hooks: {
22
+ "user-prompt-submit": userPromptSubmit,
23
+ },
24
+ };
@@ -1,19 +1,32 @@
1
+ /**
2
+ * Default `history-repair` behavior: the implementation that normalizes a
3
+ * message history so it satisfies the provider's tool-use/tool-result pairing
4
+ * and role-alternation rules.
5
+ *
6
+ * This module is side-effect free: importing it does not register any plugin.
7
+ * `repairHistory` is the canonical repair pass, run per turn via the plugin's
8
+ * `user-prompt-submit` hook (`./hooks/user-prompt-submit.ts`) and exported so
9
+ * daemon call sites and tests can reach it directly. `deepRepairHistory` is an
10
+ * aggressive one-shot fallback the orchestrator invokes only after a provider
11
+ * ordering error.
12
+ */
13
+
1
14
  import type {
2
15
  ContentBlock,
3
16
  Message,
4
17
  ServerToolUseContent,
5
18
  ToolResultContent,
6
19
  ToolUseContent,
7
- } from "../providers/types.js";
20
+ } from "../../../providers/types.js";
8
21
 
9
- export interface RepairStats {
22
+ interface RepairStats {
10
23
  assistantToolResultsMigrated: number;
11
24
  missingToolResultsInserted: number;
12
25
  orphanToolResultsDowngraded: number;
13
26
  consecutiveSameRoleMerged: number;
14
27
  }
15
28
 
16
- export interface RepairResult {
29
+ interface RepairResult {
17
30
  messages: Message[];
18
31
  stats: RepairStats;
19
32
  }
@@ -280,38 +293,6 @@ function buildResultMessage(
280
293
  };
281
294
  }
282
295
 
283
- /**
284
- * Aggressive repair pass that handles edge cases beyond repairHistory:
285
- * - Removes empty messages
286
- * - Ensures the first message is from the user
287
- * - Merges consecutive same-role messages (before tool-use/result repair)
288
- * Then applies the standard repairHistory on top (which also merges any
289
- * consecutive same-role messages introduced by tool-use/result repair).
290
- */
291
- export function deepRepairHistory(messages: Message[]): RepairResult {
292
- // 1. Remove messages with no content blocks
293
- let cleaned = messages.filter((m) => m.content.length > 0);
294
-
295
- // 2. Strip leading assistant messages (provider requires user-first)
296
- while (cleaned.length > 0 && cleaned[0].role === "assistant") {
297
- cleaned = cleaned.slice(1);
298
- }
299
-
300
- // 3. Merge consecutive same-role messages
301
- const merged: Message[] = [];
302
- for (const msg of cleaned) {
303
- const prev = merged[merged.length - 1];
304
- if (prev && prev.role === msg.role) {
305
- prev.content = [...prev.content, ...msg.content];
306
- } else {
307
- merged.push({ role: msg.role, content: [...msg.content] });
308
- }
309
- }
310
-
311
- // 4. Apply standard tool-use/tool-result repair on top
312
- return repairHistory(merged);
313
- }
314
-
315
296
  function downgradeResult(tr: {
316
297
  type: string;
317
298
  tool_use_id: string;
@@ -351,3 +332,35 @@ function formatWebSearchContent(content: unknown): string {
351
332
  }
352
333
  return "results unavailable";
353
334
  }
335
+
336
+ /**
337
+ * Aggressive repair pass that handles edge cases beyond repairHistory:
338
+ * - Removes empty messages
339
+ * - Ensures the first message is from the user
340
+ * - Merges consecutive same-role messages (before tool-use/result repair)
341
+ * Then applies the standard repairHistory on top (which also merges any
342
+ * consecutive same-role messages introduced by tool-use/result repair).
343
+ */
344
+ export function deepRepairHistory(messages: Message[]): RepairResult {
345
+ // 1. Remove messages with no content blocks
346
+ let cleaned = messages.filter((m) => m.content.length > 0);
347
+
348
+ // 2. Strip leading assistant messages (provider requires user-first)
349
+ while (cleaned.length > 0 && cleaned[0].role === "assistant") {
350
+ cleaned = cleaned.slice(1);
351
+ }
352
+
353
+ // 3. Merge consecutive same-role messages
354
+ const merged: Message[] = [];
355
+ for (const msg of cleaned) {
356
+ const prev = merged[merged.length - 1];
357
+ if (prev && prev.role === msg.role) {
358
+ prev.content = [...prev.content, ...msg.content];
359
+ } else {
360
+ merged.push({ role: msg.role, content: [...msg.content] });
361
+ }
362
+ }
363
+
364
+ // 4. Apply standard tool-use/tool-result repair on top
365
+ return repairHistory(merged);
366
+ }
@@ -7,47 +7,45 @@
7
7
  *
8
8
  * Consumers:
9
9
  *
10
- * - `daemon/external-plugins-bootstrap.ts` — production/registry boot path;
11
- * calls {@link registerDefaultPlugins} inside `bootstrapPlugins()`.
10
+ * - `daemon/external-plugins-bootstrap.ts` — the daemon's `initializePlugins()`
11
+ * calls {@link registerDefaultPlugins} explicitly at startup, before
12
+ * `loadUserPlugins()` closes the registration window, so the defaults compose
13
+ * innermost (ahead of any user plugins). `bootstrapPlugins()` replays it;
14
+ * idempotent, so already-registered defaults are skipped.
12
15
  * - integration tests that reset the registry and then need a
13
16
  * production-parity state (e.g. `conversation-agent-loop.test.ts`); those
14
17
  * call {@link resetPluginRegistryAndRegisterDefaults}.
15
18
  *
16
- * Each `defaults/<name>.ts` module self-registers at module load via a local
17
- * side effect. Importing this aggregator (or any individual default file)
18
- * populates the registry the self-registration is idempotent, and so are
19
- * {@link registerDefaultPlugins} and {@link resetPluginRegistryAndRegisterDefaults}.
20
- * Per-file self-registration is what keeps registration attached to each
21
- * file's own already-initialized plugin identifier, so importing
22
- * `defaults/index.ts` mid-cycle (e.g. through the
23
- * `memory-retrieval.ts` → … → `pipeline.ts` → `defaults/index.ts`
24
- * chain) does not trip a TDZ.
19
+ * Each `defaults/<name>/register.ts` module only builds and exports its
20
+ * `Plugin` object; registration is centralized here. The plugin identifiers
21
+ * are dereferenced inside {@link registerDefaultPlugins} at call time, once
22
+ * every module has finished initializing, so importing this aggregator does no
23
+ * registration work.
25
24
  */
26
25
 
27
- import { memoryV3ShadowPlugin } from "../../memory/v3/shadow-middleware.js";
26
+ import { memoryV3ShadowPlugin } from "../../memory/v3/shadow-plugin.js";
28
27
  import { registerPlugin, resetPluginRegistryForTests } from "../registry.js";
29
28
  import { type Plugin, PluginExecutionError } from "../types.js";
30
- import { defaultCircuitBreakerPlugin } from "./circuit-breaker.js";
31
- import { defaultCompactionPlugin } from "./compaction.js";
32
- import { defaultEmptyResponsePlugin } from "./empty-response.js";
33
- import { defaultHistoryRepairPlugin } from "./history-repair.js";
34
- import { defaultInjectorsPlugin } from "./injectors.js";
35
- import { defaultLlmCallPlugin } from "./llm-call.js";
36
- import { defaultMemoryRetrievalPlugin } from "./memory-retrieval.js";
37
- import { defaultOverflowReducePlugin } from "./overflow-reduce.js";
38
- import { defaultPersistencePlugin } from "./persistence.js";
39
- import { defaultTitleGeneratePlugin } from "./title-generate.js";
40
- import { defaultTokenEstimatePlugin } from "./token-estimate.js";
41
- import { defaultToolErrorPlugin } from "./tool-error.js";
42
- import { defaultToolExecutePlugin } from "./tool-execute.js";
43
- import { defaultToolResultTruncatePlugin } from "./tool-result-truncate.js";
29
+ import { defaultCircuitBreakerPlugin } from "./circuit-breaker/register.js";
30
+ import { defaultCompactionPlugin } from "./compaction/register.js";
31
+ import { defaultEmptyResponsePlugin } from "./empty-response/register.js";
32
+ import { defaultHistoryRepairPlugin } from "./history-repair/register.js";
33
+ import { defaultInjectorsPlugin } from "./injectors/register.js";
34
+ import { defaultLlmCallPlugin } from "./llm-call/register.js";
35
+ import { defaultMemoryRetrievalPlugin } from "./memory-retrieval/register.js";
36
+ import { defaultOverflowReducePlugin } from "./overflow-reduce/register.js";
37
+ import { defaultPersistencePlugin } from "./persistence/register.js";
38
+ import { defaultTitleGeneratePlugin } from "./title-generate/register.js";
39
+ import { defaultTokenEstimatePlugin } from "./token-estimate/register.js";
40
+ import { defaultToolErrorPlugin } from "./tool-error/register.js";
41
+ import { defaultToolExecutePlugin } from "./tool-execute/register.js";
42
+ import { defaultToolResultTruncatePlugin } from "./tool-result-truncate/register.js";
44
43
 
45
44
  /**
46
45
  * Full set of first-party default plugins. Used by
47
- * {@link registerDefaultPlugins} to drive the idempotent re-registration
48
- * loop; actual registration-order in the registry is determined by the
49
- * module-load side effects in each per-file default (whichever loader
50
- * evaluates a file first wins, later attempts are swallowed as duplicates).
46
+ * {@link registerDefaultPlugins} to drive the registration loop; the array
47
+ * order is the registration order, which determines onion order for middleware
48
+ * composition (defaults innermost, user plugins outermost).
51
49
  *
52
50
  * Returned by a function rather than a top-level `const` so the array
53
51
  * contents are read at call time, after every imported plugin identifier is
@@ -61,11 +59,6 @@ function getAllDefaultPlugins(): readonly Plugin[] {
61
59
  defaultEmptyResponsePlugin,
62
60
  defaultToolErrorPlugin,
63
61
  defaultMemoryRetrievalPlugin,
64
- // Live-shadow v3 retrieval. Always registered; inert unless both
65
- // `memory.v3.enabled` and `memory.v3.shadow` are on (gated inside the
66
- // middleware). Ordered after the default so the default terminal still
67
- // produces the injected (v2) `MemoryResult`.
68
- memoryV3ShadowPlugin,
69
62
  defaultInjectorsPlugin,
70
63
  defaultTokenEstimatePlugin,
71
64
  defaultOverflowReducePlugin,
@@ -74,6 +67,7 @@ function getAllDefaultPlugins(): readonly Plugin[] {
74
67
  defaultCircuitBreakerPlugin,
75
68
  defaultPersistencePlugin,
76
69
  defaultTitleGeneratePlugin,
70
+ memoryV3ShadowPlugin,
77
71
  ];
78
72
  }
79
73
 
@@ -83,11 +77,6 @@ function getAllDefaultPlugins(): readonly Plugin[] {
83
77
  * an "already registered" message) are swallowed so repeat bootstrap or test
84
78
  * setup calls do not throw. Every other error (shape failure, version
85
79
  * mismatch) re-throws.
86
- *
87
- * In practice every call after the first is a no-op: each default's
88
- * module-load side effect registers itself the first time its file is
89
- * imported, which for production happens via `pipeline.ts`'s side-effect
90
- * import of this aggregator.
91
80
  */
92
81
  export function registerDefaultPlugins(): void {
93
82
  for (const plugin of getAllDefaultPlugins()) {
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "default-injectors",
3
+ "version": "1.0.0",
4
+ "description": "First-party default plugin wrapping the assistant's built-in injectors pipeline with a passthrough implementation.",
5
+ "private": true,
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "main": "./register.ts",
9
+ "engines": {
10
+ "node": ">=20.12.0"
11
+ },
12
+ "peerDependencies": {
13
+ "@vellumai/plugin-api": "^0.8.0"
14
+ }
15
+ }
@@ -39,30 +39,28 @@
39
39
  * sorted ascending, so a plugin-registered injector at `order: 25`
40
40
  * reliably slots between `unified-turn-context` (20) and `pkb` (30).
41
41
  *
42
- * Registration happens via a module-load side effect at the bottom of this
43
- * file importing the module is enough to populate the registry. The
44
- * explicit `registerDefaultPlugins()` call in `plugins/defaults/index.ts`
45
- * (invoked from `daemon/external-plugins-bootstrap.ts`) re-registers the
46
- * same plugin idempotently, so either entry point alone is sufficient.
42
+ * This module only builds and exports the `Plugin` object; the defaults
43
+ * aggregator in `plugins/defaults/index.ts` registers it centrally, either
44
+ * explicitly from `daemon/external-plugins-bootstrap.ts` or lazily via the
45
+ * registry's default registrar the first time a query reads the registry.
47
46
  */
48
47
 
49
48
  import { resolve } from "node:path";
50
49
 
51
- import { getConfig } from "../../config/loader.js";
52
- import { getInContextPkbPaths } from "../../daemon/pkb-context-tracker.js";
53
- import { buildPkbReminder } from "../../daemon/pkb-reminder-builder.js";
54
- import { listComments } from "../../documents/document-comments-store.js";
55
- import { searchPkbFiles } from "../../memory/pkb/pkb-search.js";
56
- import { getLogger } from "../../util/logger.js";
57
- import { registerPlugin } from "../registry.js";
50
+ import { getConfig } from "../../../config/loader.js";
51
+ import { getInContextPkbPaths } from "../../../daemon/pkb-context-tracker.js";
52
+ import { buildPkbReminder } from "../../../daemon/pkb-reminder-builder.js";
53
+ import { listComments } from "../../../documents/document-comments-store.js";
54
+ import { searchPkbFiles } from "../../../memory/pkb/pkb-search.js";
55
+ import { getLogger } from "../../../util/logger.js";
58
56
  import {
59
57
  type InjectionBlock,
60
58
  type Injector,
61
59
  type Plugin,
62
- PluginExecutionError,
63
60
  type TurnContext,
64
61
  type TurnInjectionInputs,
65
- } from "../types.js";
62
+ } from "../../types.js";
63
+ import pkg from "./package.json" with { type: "json" };
66
64
 
67
65
  const pkbReminderLog = getLogger("pkb-reminder");
68
66
 
@@ -686,8 +684,8 @@ const threadFocusInjector: Injector = {
686
684
  */
687
685
  export const defaultInjectorsPlugin: Plugin = {
688
686
  manifest: {
689
- name: "default-injectors",
690
- version: "1.0.0",
687
+ name: pkg.name,
688
+ version: pkg.version,
691
689
  },
692
690
  injectors: [
693
691
  diskPressureWarningInjector,
@@ -705,25 +703,3 @@ export const defaultInjectorsPlugin: Plugin = {
705
703
  threadFocusInjector,
706
704
  ],
707
705
  };
708
-
709
- // Module-load side effect: register this default at import time so
710
- // downstream consumers (including tests that skip `bootstrapPlugins()`)
711
- // observe a populated registry by default. Idempotent via the swallowed
712
- // duplicate-name check. Kept local to this module (rather than iterating
713
- // an array in `defaults/index.ts`) so the registration only references
714
- // the already-initialized `defaultInjectorsPlugin` identifier —
715
- // avoiding a TDZ crash when tests `mock.module(...)` a dependency of any
716
- // other default plugin and directly import this file.
717
- try {
718
- registerPlugin(defaultInjectorsPlugin);
719
- } catch (err) {
720
- if (
721
- err instanceof PluginExecutionError &&
722
- err.message.includes("already registered")
723
- ) {
724
- // already registered — expected when both index.ts and the direct
725
- // file are imported in the same process
726
- } else {
727
- throw err;
728
- }
729
- }
@@ -0,0 +1,17 @@
1
+ import type { LLMCallArgs, LLMCallResult, Middleware } from "../../../types.js";
2
+
3
+ /**
4
+ * Passthrough middleware for the `llmCall` pipeline. Forwards to `next(args)`
5
+ * unchanged so any user-registered middleware (registered later, inner in the
6
+ * onion) still runs and the terminal at the call site (`agent/loop.ts`)
7
+ * performs the actual `provider.sendMessage(...)` call.
8
+ *
9
+ * Defaults register at the OUTERMOST onion position; forwarding
10
+ * unconditionally keeps user-registered middleware reachable.
11
+ */
12
+ const defaultLlmCall: Middleware<LLMCallArgs, LLMCallResult> =
13
+ async function defaultLlmCall(args, next, _ctx) {
14
+ return next(args);
15
+ };
16
+
17
+ export default defaultLlmCall;
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "default-llm-call",
3
+ "version": "1.0.0",
4
+ "description": "First-party default plugin wrapping the assistant's built-in llm-call pipeline with a passthrough implementation.",
5
+ "private": true,
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "main": "./register.ts",
9
+ "engines": {
10
+ "node": ">=20.12.0"
11
+ },
12
+ "peerDependencies": {
13
+ "@vellumai/plugin-api": "^0.8.0"
14
+ }
15
+ }
@@ -20,13 +20,9 @@
20
20
  * Design doc: `.private/plans/agent-plugin-system.md` (PR 15).
21
21
  */
22
22
 
23
- import { registerPlugin } from "../registry.js";
24
- import {
25
- type LLMCallArgs,
26
- type LLMCallResult,
27
- type Plugin,
28
- PluginExecutionError,
29
- } from "../types.js";
23
+ import { type Plugin } from "../../types.js";
24
+ import llmCall from "./middlewares/llmCall.js";
25
+ import pkg from "./package.json" with { type: "json" };
30
26
 
31
27
  /**
32
28
  * The default LLM-call plugin. Its `llmCall` middleware is a passthrough that
@@ -40,38 +36,10 @@ import {
40
36
  */
41
37
  export const defaultLlmCallPlugin: Plugin = {
42
38
  manifest: {
43
- name: "default-llm-call",
44
- version: "1.0.0",
39
+ name: pkg.name,
40
+ version: pkg.version,
45
41
  },
46
42
  middleware: {
47
- llmCall: async function defaultLlmCall(
48
- args: LLMCallArgs,
49
- next,
50
- _ctx,
51
- ): Promise<LLMCallResult> {
52
- return next(args);
53
- },
43
+ llmCall,
54
44
  },
55
45
  };
56
-
57
- // Module-load side effect: register this default at import time so
58
- // downstream consumers (including tests that skip `bootstrapPlugins()`)
59
- // observe a populated registry by default. Idempotent via the swallowed
60
- // duplicate-name check. Kept local to this module (rather than iterating
61
- // an array in `defaults/index.ts`) so the registration only references
62
- // the already-initialized `defaultLlmCallPlugin` identifier —
63
- // avoiding a TDZ crash when tests `mock.module(...)` a dependency of any
64
- // other default plugin and directly import this file.
65
- try {
66
- registerPlugin(defaultLlmCallPlugin);
67
- } catch (err) {
68
- if (
69
- err instanceof PluginExecutionError &&
70
- err.message.includes("already registered")
71
- ) {
72
- // already registered — expected when both index.ts and the direct
73
- // file are imported in the same process
74
- } else {
75
- throw err;
76
- }
77
- }