@vellumai/assistant 0.8.7 → 0.8.8-dev.202606052332.17fc8ea

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 (570) hide show
  1. package/Dockerfile +20 -4
  2. package/bun.lock +2 -2
  3. package/docker-entrypoint.sh +4 -2
  4. package/docker-init-apt-root.sh +3 -1
  5. package/docker-kata-apt-env.sh +3 -1
  6. package/docker-kata-runtime-family.sh +12 -0
  7. package/docs/architecture/memory.md +1 -1
  8. package/examples/plugins/echo/README.md +61 -66
  9. package/examples/plugins/echo/hooks/post-tool-use.ts +18 -0
  10. package/examples/plugins/echo/hooks/stop.ts +16 -0
  11. package/examples/plugins/echo/hooks/user-prompt-submit.ts +18 -0
  12. package/examples/plugins/echo/package.json +1 -2
  13. package/examples/plugins/echo/src/emit.ts +19 -0
  14. package/node_modules/@vellumai/skill-host-contracts/src/server-message.ts +3 -3
  15. package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +7 -6
  16. package/openapi.yaml +3378 -335
  17. package/package.json +2 -2
  18. package/scripts/generate-openapi.ts +68 -41
  19. package/src/__tests__/agent-loop-exit-reason.test.ts +35 -93
  20. package/src/__tests__/agent-loop-provider-error-recording.test.ts +1 -1
  21. package/src/__tests__/agent-loop.test.ts +37 -87
  22. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +2 -0
  23. package/src/__tests__/annotate-activity-metadata.test.ts +262 -0
  24. package/src/__tests__/annotate-risk-options.test.ts +2 -3
  25. package/src/__tests__/anthropic-provider.test.ts +95 -2
  26. package/src/__tests__/app-control-flow.test.ts +1 -1
  27. package/src/__tests__/app-dir-path-guard.test.ts +1 -0
  28. package/src/__tests__/approval-routes-http.test.ts +4 -1
  29. package/src/__tests__/assistant-event-hub.test.ts +25 -0
  30. package/src/__tests__/assistant-events-sse-shed.test.ts +8 -0
  31. package/src/__tests__/{conversation-stream-state.test.ts → assistant-stream-state.test.ts} +252 -91
  32. package/src/__tests__/auth-fallback-events-store.test.ts +116 -0
  33. package/src/__tests__/background-workers-disk-pressure.test.ts +6 -0
  34. package/src/__tests__/btw-routes.test.ts +62 -3
  35. package/src/__tests__/build-persisted-content.test.ts +184 -0
  36. package/src/__tests__/catalog-files.test.ts +1 -1
  37. package/src/__tests__/channel-approval-routes.test.ts +1 -1
  38. package/src/__tests__/channel-approvals.test.ts +1 -1
  39. package/src/__tests__/clawhub-files.test.ts +1 -1
  40. package/src/__tests__/compaction-circuit.test.ts +258 -0
  41. package/src/__tests__/compaction-direct.test.ts +132 -0
  42. package/src/__tests__/compaction.benchmark.test.ts +0 -30
  43. package/src/__tests__/config-watcher.test.ts +1 -1
  44. package/src/__tests__/conversation-abort-tool-results.test.ts +57 -19
  45. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +6 -5
  46. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +10 -7
  47. package/src/__tests__/conversation-agent-loop-overflow.test.ts +316 -1143
  48. package/src/__tests__/conversation-agent-loop.test.ts +638 -1655
  49. package/src/__tests__/conversation-analysis-routes.test.ts +6 -0
  50. package/src/__tests__/conversation-clean-command.test.ts +5 -2
  51. package/src/__tests__/conversation-history-web-search.test.ts +11 -1
  52. package/src/__tests__/conversation-pairing.test.ts +4 -31
  53. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +6 -0
  54. package/src/__tests__/conversation-provider-retry-repair.test.ts +30 -10
  55. package/src/__tests__/conversation-queue.test.ts +2 -0
  56. package/src/__tests__/conversation-routes-disk-view.test.ts +3 -0
  57. package/src/__tests__/conversation-routes-slash-commands.test.ts +6 -5
  58. package/src/__tests__/conversation-runtime-assembly.test.ts +310 -300
  59. package/src/__tests__/conversation-runtime-workspace.test.ts +105 -45
  60. package/src/__tests__/conversation-slash-commands.test.ts +8 -42
  61. package/src/__tests__/conversation-slash-queue.test.ts +6 -1
  62. package/src/__tests__/conversation-starter-routes.test.ts +14 -6
  63. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +84 -0
  64. package/src/__tests__/conversation-sync-tags.test.ts +27 -15
  65. package/src/__tests__/conversation-title-service.test.ts +135 -2
  66. package/src/__tests__/conversation-workspace-cache-state.test.ts +17 -16
  67. package/src/__tests__/conversation-workspace-injection.test.ts +67 -2
  68. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +7 -6
  69. package/src/__tests__/conversations-import-system-filter.test.ts +101 -0
  70. package/src/__tests__/cross-provider-web-search.test.ts +214 -1
  71. package/src/__tests__/db-acp-history.test.ts +101 -0
  72. package/src/__tests__/db-schedule-syntax-migration.test.ts +5 -0
  73. package/src/__tests__/dm-persistence.test.ts +5 -1
  74. package/src/__tests__/dynamic-page-surface.test.ts +31 -0
  75. package/src/__tests__/empty-response-hook.test.ts +304 -0
  76. package/src/__tests__/feature-flag-test-helpers.ts +2 -2
  77. package/src/__tests__/file-write-tool.test.ts +63 -0
  78. package/src/__tests__/gateway-only-guard.test.ts +12 -2
  79. package/src/__tests__/gemini-image-service.test.ts +13 -0
  80. package/src/__tests__/guardian-grant-minting.test.ts +1 -1
  81. package/src/__tests__/guardian-routing-invariants.test.ts +2 -4
  82. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
  83. package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
  84. package/src/__tests__/heartbeat-service.test.ts +1 -0
  85. package/src/__tests__/helpers/mock-provider.ts +110 -0
  86. package/src/__tests__/helpers/native-web-search-harness.ts +129 -0
  87. package/src/__tests__/history-repair-hook.test.ts +1 -0
  88. package/src/__tests__/host-app-control-routes.test.ts +1 -1
  89. package/src/__tests__/host-cu-routes-targeted.test.ts +3 -3
  90. package/src/__tests__/identity-intro-cache.test.ts +12 -100
  91. package/src/__tests__/identity-routes.test.ts +248 -7
  92. package/src/__tests__/inbound-slack-persistence.test.ts +5 -1
  93. package/src/__tests__/injector-background-turn.test.ts +3 -9
  94. package/src/__tests__/injector-chain.test.ts +139 -275
  95. package/src/__tests__/injector-disk-pressure.test.ts +75 -41
  96. package/src/__tests__/injector-document-comments.test.ts +3 -3
  97. package/src/__tests__/injector-pkb-v2-silenced.test.ts +30 -22
  98. package/src/__tests__/injector-v3-suppression.test.ts +31 -37
  99. package/src/__tests__/internal-telemetry-routes.test.ts +109 -0
  100. package/src/__tests__/list-messages-hidden-metadata.test.ts +38 -0
  101. package/src/__tests__/list-messages-page-latest.test.ts +60 -0
  102. package/src/__tests__/list-messages-tool-merge.test.ts +20 -0
  103. package/src/__tests__/llm-usage-store.test.ts +223 -1
  104. package/src/__tests__/memory-retrieval-hook.test.ts +297 -0
  105. package/src/__tests__/memory-v2-static-injector.test.ts +103 -35
  106. package/src/__tests__/native-web-search.test.ts +191 -0
  107. package/src/__tests__/onboarding-template-contract.test.ts +2 -0
  108. package/src/__tests__/openai-image-service.test.ts +17 -0
  109. package/src/__tests__/openai-provider.test.ts +31 -1
  110. package/src/__tests__/{overflow-reduce-pipeline.test.ts → overflow-reduction-loop.test.ts} +64 -284
  111. package/src/__tests__/persist-unsendable-image.test.ts +215 -0
  112. package/src/__tests__/persistence-secret-redaction.test.ts +1 -0
  113. package/src/__tests__/pkb-autoinject.test.ts +2 -5
  114. package/src/__tests__/plugin-api-shim.test.ts +3 -6
  115. package/src/__tests__/plugin-bootstrap.test.ts +14 -40
  116. package/src/__tests__/plugin-registry.test.ts +3 -76
  117. package/src/__tests__/plugin-types.test.ts +0 -193
  118. package/src/__tests__/process-message-display-content.test.ts +6 -2
  119. package/src/__tests__/reaction-persistence.test.ts +1 -1
  120. package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +5 -1
  121. package/src/__tests__/resolve-trust-class.test.ts +4 -4
  122. package/src/__tests__/runtime-events-sse-reconnect.test.ts +60 -23
  123. package/src/__tests__/schedule-routes.test.ts +603 -2
  124. package/src/__tests__/schedule-store.test.ts +41 -0
  125. package/src/__tests__/schedule-tools.test.ts +35 -0
  126. package/src/__tests__/send-endpoint-busy.test.ts +4 -1
  127. package/src/__tests__/server-history-render.test.ts +314 -1
  128. package/src/__tests__/skill-feature-flags-integration.test.ts +33 -0
  129. package/src/__tests__/skillssh-files.test.ts +1 -1
  130. package/src/__tests__/subagent-call-site-routing.test.ts +1 -1
  131. package/src/__tests__/subagent-fork-notifications.test.ts +1 -3
  132. package/src/__tests__/subagent-fork-spawn.test.ts +1 -1
  133. package/src/__tests__/subagent-manager-notify.test.ts +1 -3
  134. package/src/__tests__/subagent-notify-parent.test.ts +1 -3
  135. package/src/__tests__/subagent-spawn-tool-fork.test.ts +1 -1
  136. package/src/__tests__/system-prompt.test.ts +20 -0
  137. package/src/__tests__/task-scheduler.test.ts +162 -1
  138. package/src/__tests__/terminal-tools.test.ts +6 -1
  139. package/src/__tests__/title-generate-hook.test.ts +319 -0
  140. package/src/__tests__/tool-error-hook.test.ts +278 -0
  141. package/src/__tests__/tool-preview-lifecycle.test.ts +468 -5
  142. package/src/__tests__/tool-result-metadata-plumbing.test.ts +1 -0
  143. package/src/__tests__/tool-result-truncate-hook.test.ts +127 -0
  144. package/src/__tests__/tool-result-truncation.test.ts +0 -2
  145. package/src/__tests__/ui-choice-copy-surfaces.test.ts +254 -0
  146. package/src/__tests__/ui-work-result-surface.test.ts +159 -0
  147. package/src/__tests__/usage-routes.test.ts +285 -1
  148. package/src/__tests__/user-plugin-loader.test.ts +54 -286
  149. package/src/__tests__/voice-session-bridge.test.ts +6 -3
  150. package/src/__tests__/web-search-backend-failure.test.ts +166 -0
  151. package/src/acp/__tests__/agent-process.test.ts +161 -0
  152. package/src/acp/__tests__/client-handler.test.ts +40 -0
  153. package/src/acp/__tests__/helpers/acp-history-db.ts +82 -0
  154. package/src/acp/__tests__/helpers/exec-file-stub.ts +101 -0
  155. package/src/acp/__tests__/prepare-agent-env.test.ts +137 -0
  156. package/src/acp/__tests__/session-manager-persistence.test.ts +95 -28
  157. package/src/acp/__tests__/session-manager-resume.test.ts +736 -0
  158. package/src/acp/agent-process.ts +61 -1
  159. package/src/acp/auto-install.test.ts +196 -0
  160. package/src/acp/auto-install.ts +177 -0
  161. package/src/acp/client-handler.ts +31 -0
  162. package/src/acp/feature-gate.test.ts +48 -0
  163. package/src/acp/feature-gate.ts +34 -0
  164. package/src/acp/prepare-agent-env.ts +83 -29
  165. package/src/acp/resolve-agent.test.ts +320 -7
  166. package/src/acp/resolve-agent.ts +182 -18
  167. package/src/acp/resume-hint.ts +25 -0
  168. package/src/acp/session-manager.ts +495 -73
  169. package/src/acp/types.ts +8 -0
  170. package/src/agent/compaction-circuit.ts +60 -102
  171. package/src/agent/loop.ts +362 -485
  172. package/src/api/events/assistant-thinking-delta.ts +33 -0
  173. package/src/api/events/tool-output-chunk.ts +45 -0
  174. package/src/api/events/tool-use-preview-start.ts +32 -0
  175. package/src/api/events/trace-event.ts +69 -0
  176. package/src/api/index.ts +48 -13
  177. package/src/api/responses/conversation-message.ts +374 -0
  178. package/src/approvals/guardian-request-resolvers.ts +1 -1
  179. package/src/avatar/__tests__/avatar-store.test.ts +34 -29
  180. package/src/background-wake/next-wake.ts +1 -0
  181. package/src/cli/commands/__tests__/notifications.test.ts +58 -14
  182. package/src/cli/commands/notifications.ts +112 -60
  183. package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
  184. package/src/config/acp-defaults.test.ts +10 -0
  185. package/src/config/acp-defaults.ts +6 -0
  186. package/src/config/assistant-feature-flags.ts +22 -11
  187. package/src/config/bundled-skills/acp/SKILL.md +83 -31
  188. package/src/config/bundled-skills/acp/TOOLS.json +4 -4
  189. package/src/config/bundled-skills/app-builder/SKILL.md +224 -398
  190. package/src/config/bundled-skills/app-builder/TOOLS.json +29 -0
  191. package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +48 -0
  192. package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +57 -0
  193. package/src/config/bundled-skills/app-builder/references/SLIDES.md +38 -0
  194. package/src/config/bundled-skills/app-builder/references/examples/README.md +17 -0
  195. package/src/config/bundled-skills/app-builder/references/examples/expense-tracker.md +515 -0
  196. package/src/config/bundled-skills/app-builder/references/examples/focus-timer.md +342 -0
  197. package/src/config/bundled-skills/app-builder/references/examples/habit-tracker.md +490 -0
  198. package/src/config/bundled-skills/app-builder/tools/app-list.ts +62 -0
  199. package/src/config/bundled-skills/document-editor/SKILL.md +28 -23
  200. package/src/config/bundled-skills/document-editor/TOOLS.json +1 -1
  201. package/src/config/bundled-skills/messaging/SKILL.md +0 -7
  202. package/src/config/bundled-tool-registry.ts +2 -0
  203. package/src/config/feature-flag-cache.ts +3 -3
  204. package/src/config/feature-flag-registry.json +48 -7
  205. package/src/config/schemas/__tests__/memory-v2.test.ts +1 -0
  206. package/src/config/schemas/__tests__/memory-v3.test.ts +25 -0
  207. package/src/config/schemas/heartbeat.ts +9 -0
  208. package/src/config/schemas/llm.ts +1 -0
  209. package/src/config/schemas/memory-v2.ts +8 -0
  210. package/src/config/schemas/memory-v3.ts +8 -0
  211. package/src/config/schemas/platform.ts +8 -0
  212. package/src/config/seed-inference-profiles.ts +2 -2
  213. package/src/config/skills.ts +13 -0
  214. package/src/context/compactor.ts +1 -1
  215. package/src/context/strip-injections.ts +128 -0
  216. package/src/context/token-estimator.ts +23 -0
  217. package/src/context/tool-result-truncation.ts +0 -23
  218. package/src/context/window-manager.ts +5 -7
  219. package/src/credential-execution/executable-discovery.ts +16 -0
  220. package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +6 -0
  221. package/src/daemon/__tests__/inference-profile-notification.test.ts +153 -0
  222. package/src/daemon/__tests__/native-web-search-metadata.test.ts +10 -8
  223. package/src/daemon/assistant-attachments.ts +1 -1
  224. package/src/daemon/config-watcher.ts +2 -2
  225. package/src/daemon/context-overflow-reducer.ts +0 -1
  226. package/src/daemon/conversation-agent-loop-handlers.ts +594 -153
  227. package/src/daemon/conversation-agent-loop.ts +301 -997
  228. package/src/daemon/conversation-history.ts +5 -4
  229. package/src/daemon/conversation-lifecycle.ts +3 -4
  230. package/src/daemon/conversation-messaging.ts +7 -6
  231. package/src/daemon/conversation-process.ts +11 -16
  232. package/src/daemon/conversation-registry.ts +159 -0
  233. package/src/daemon/conversation-runtime-assembly.ts +218 -398
  234. package/src/daemon/conversation-slash.ts +6 -25
  235. package/src/daemon/conversation-store.ts +9 -90
  236. package/src/daemon/conversation-surfaces.ts +222 -4
  237. package/src/daemon/conversation-tool-setup.ts +2 -29
  238. package/src/daemon/conversation-workspace.ts +17 -0
  239. package/src/daemon/conversation.ts +32 -20
  240. package/src/daemon/external-plugins-bootstrap.ts +17 -18
  241. package/src/daemon/handlers/config-a2a.ts +51 -36
  242. package/src/daemon/handlers/config-slack-channel.ts +20 -14
  243. package/src/daemon/handlers/config-telegram.ts +16 -2
  244. package/src/daemon/handlers/conversations.ts +3 -1
  245. package/src/daemon/handlers/shared.ts +156 -84
  246. package/src/daemon/handlers/skills.ts +42 -10
  247. package/src/daemon/lifecycle.ts +25 -0
  248. package/src/daemon/message-types/apps.ts +1 -29
  249. package/src/daemon/message-types/messages.ts +9 -57
  250. package/src/daemon/message-types/skills.ts +2 -0
  251. package/src/daemon/message-types/surfaces.ts +136 -3
  252. package/src/daemon/now-scratchpad.ts +21 -0
  253. package/src/daemon/orphan-reaper.test.ts +210 -0
  254. package/src/daemon/orphan-reaper.ts +240 -0
  255. package/src/daemon/overflow-reduction-loop.ts +230 -0
  256. package/src/daemon/persist-unsendable-image.ts +117 -0
  257. package/src/daemon/process-message.ts +1 -3
  258. package/src/daemon/server.ts +2 -0
  259. package/src/daemon/trace-emitter.ts +6 -4
  260. package/src/daemon/trust-context.ts +19 -0
  261. package/src/daemon/wake-target-adapter.ts +3 -1
  262. package/src/heartbeat/__tests__/heartbeat-service.test.ts +3 -0
  263. package/src/heartbeat/heartbeat-run-store.ts +23 -1
  264. package/src/heartbeat/heartbeat-service.ts +26 -0
  265. package/src/home/home-greeting-cache.ts +24 -1
  266. package/src/ipc/__tests__/browser-ipc.test.ts +1 -1
  267. package/src/ipc/__tests__/ui-request-route.test.ts +3 -3
  268. package/src/ipc/gateway-client.test.ts +2 -2
  269. package/src/ipc/gateway-client.ts +3 -3
  270. package/src/ipc/skill-routes/__tests__/memory.test.ts +15 -0
  271. package/src/ipc/skill-routes/memory.ts +4 -2
  272. package/src/media/gemini-image-service.ts +15 -0
  273. package/src/media/openai-image-service.ts +14 -0
  274. package/src/media/types.ts +34 -0
  275. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +56 -0
  276. package/src/memory/auth-fallback-events-store.ts +94 -0
  277. package/src/memory/conversation-starter-checkpoints.ts +1 -0
  278. package/src/memory/conversation-title-service.ts +65 -41
  279. package/src/memory/db-init.ts +6 -0
  280. package/src/memory/graph/__tests__/conversation-graph-memory-registry.test.ts +119 -0
  281. package/src/memory/graph/conversation-graph-memory.ts +65 -0
  282. package/src/memory/job-handlers/conversation-starters.ts +13 -2
  283. package/src/memory/jobs-store.ts +33 -0
  284. package/src/memory/jobs-worker.ts +32 -5
  285. package/src/memory/llm-usage-store.ts +224 -50
  286. package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +6 -5
  287. package/src/memory/migrations/270-schedule-source-conversation.ts +13 -0
  288. package/src/memory/migrations/271-create-auth-fallback-events.ts +21 -0
  289. package/src/memory/migrations/272-acp-session-history-cwd.ts +36 -0
  290. package/src/memory/migrations/index.ts +3 -0
  291. package/src/memory/pkb/autoinject.ts +61 -0
  292. package/src/memory/pkb/context.ts +50 -0
  293. package/src/memory/pkb/types.ts +14 -0
  294. package/src/memory/schedule-attribution-sql.ts +104 -0
  295. package/src/memory/schema/acp.ts +4 -0
  296. package/src/memory/schema/infrastructure.ts +16 -0
  297. package/src/memory/usage-grouped-buckets.ts +6 -1
  298. package/src/memory/v2/__tests__/consolidation-job.test.ts +4 -4
  299. package/src/memory/v2/consolidation-job.ts +14 -5
  300. package/src/notifications/conversation-pairing.ts +8 -15
  301. package/src/notifications/decision-engine.ts +6 -3
  302. package/src/notifications/home-feed-side-effect.ts +12 -1
  303. package/src/permissions/prompter.ts +4 -0
  304. package/src/plugin-api/constants.ts +4 -0
  305. package/src/plugin-api/index.ts +7 -5
  306. package/src/plugin-api/types.ts +151 -1
  307. package/src/plugins/defaults/compaction/compact.ts +59 -0
  308. package/src/plugins/defaults/compaction/package.json +1 -1
  309. package/src/plugins/defaults/compaction/register.ts +8 -19
  310. package/src/plugins/defaults/empty-response/hooks/stop.ts +126 -0
  311. package/src/plugins/defaults/empty-response/register.ts +8 -13
  312. package/src/plugins/defaults/index.ts +2 -18
  313. package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +95 -0
  314. package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit-temp.ts +216 -0
  315. package/src/plugins/defaults/memory-retrieval/injector-chain.ts +35 -0
  316. package/src/plugins/defaults/{injectors/register.ts → memory-retrieval/injectors.ts} +288 -81
  317. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/assign.test.ts +4 -4
  318. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/health.test.ts +16 -0
  319. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/live-integration.test.ts +4 -4
  320. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/maintain-job.test.ts +5 -5
  321. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/orchestrate.test.ts +48 -12
  322. package/src/plugins/defaults/memory-v3-shadow/__tests__/provider-blocks.test.ts +13 -0
  323. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/reconcile.test.ts +2 -2
  324. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/render-injection.test.ts +1 -1
  325. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/router.test.ts +104 -32
  326. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/selection-log-store.test.ts +8 -8
  327. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/selector.test.ts +96 -30
  328. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/shadow-plugin.test.ts +34 -16
  329. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/assign.ts +5 -5
  330. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/capabilities.ts +2 -2
  331. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/health.ts +0 -0
  332. package/src/plugins/defaults/memory-v3-shadow/hooks/post-compact.ts +14 -0
  333. package/src/plugins/defaults/memory-v3-shadow/hooks/user-prompt-submit.ts +19 -0
  334. package/src/plugins/defaults/memory-v3-shadow/injector.ts +75 -0
  335. package/src/plugins/defaults/memory-v3-shadow/llm-retry.ts +32 -0
  336. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/maintain-job.ts +8 -8
  337. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/orchestrate.ts +26 -14
  338. package/src/plugins/defaults/{llm-call → memory-v3-shadow}/package.json +2 -2
  339. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/page-content.ts +2 -2
  340. package/src/plugins/defaults/memory-v3-shadow/provider-blocks.ts +26 -0
  341. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/reconcile.ts +3 -3
  342. package/src/plugins/defaults/memory-v3-shadow/register.ts +26 -0
  343. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/render-injection.ts +1 -1
  344. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/router.ts +51 -45
  345. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/selection-log-store.ts +4 -4
  346. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/selector.ts +61 -46
  347. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/shadow-plugin.ts +69 -99
  348. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/tree.ts +1 -1
  349. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/types.ts +8 -0
  350. package/src/plugins/defaults/title-generate/hooks/stop.ts +75 -0
  351. package/src/plugins/defaults/title-generate/hooks/user-prompt-submit.ts +35 -0
  352. package/src/plugins/defaults/title-generate/package.json +1 -1
  353. package/src/plugins/defaults/title-generate/register.ts +18 -18
  354. package/src/plugins/defaults/tool-error/hooks/post-tool-use.ts +118 -0
  355. package/src/plugins/defaults/tool-error/package.json +1 -1
  356. package/src/plugins/defaults/tool-error/register.ts +9 -21
  357. package/src/plugins/defaults/tool-result-truncate/hooks/post-tool-use.ts +32 -0
  358. package/src/plugins/defaults/tool-result-truncate/register.ts +10 -21
  359. package/src/plugins/defaults/tool-result-truncate/terminal.ts +37 -18
  360. package/src/plugins/external-api.ts +2 -2
  361. package/src/plugins/pipeline.ts +6 -305
  362. package/src/plugins/registry.ts +10 -55
  363. package/src/plugins/types.ts +62 -797
  364. package/src/plugins/user-loader.ts +30 -127
  365. package/src/proactive-artifact/aux-message-injector.ts +4 -4
  366. package/src/proactive-artifact/job.test.ts +8 -13
  367. package/src/prompts/__tests__/system-prompt.test.ts +42 -0
  368. package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +64 -0
  369. package/src/prompts/templates/BOOTSTRAP.md +2 -2
  370. package/src/prompts/templates/system-sections.ts +15 -0
  371. package/src/providers/anthropic/client.ts +37 -29
  372. package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +112 -0
  373. package/src/providers/openai/chat-completions-provider.ts +44 -0
  374. package/src/providers/openrouter/client.ts +1 -0
  375. package/src/providers/placeholder-sentinels.ts +35 -0
  376. package/src/runtime/__tests__/agent-wake.test.ts +10 -6
  377. package/src/runtime/__tests__/interactive-ui.test.ts +1 -1
  378. package/src/runtime/agent-wake.ts +2 -5
  379. package/src/runtime/assistant-event-hub.ts +37 -7
  380. package/src/runtime/{conversation-stream-state.ts → assistant-stream-state.ts} +132 -58
  381. package/src/runtime/channel-approvals.ts +1 -1
  382. package/src/runtime/http-router.ts +16 -21
  383. package/src/runtime/http-types.ts +16 -70
  384. package/src/runtime/interactive-ui.ts +1 -1
  385. package/src/runtime/pending-interactions.ts +1 -0
  386. package/src/runtime/routes/__tests__/acp-routes.test.ts +283 -55
  387. package/src/runtime/routes/__tests__/consolidation-routes.test.ts +265 -2
  388. package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +1 -1
  389. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +31 -1
  390. package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +6 -2
  391. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +5 -4
  392. package/src/runtime/routes/__tests__/surface-content-routes.test.ts +4 -1
  393. package/src/runtime/routes/__tests__/tts-routes.test.ts +6 -2
  394. package/src/runtime/routes/acp-routes.test.ts +89 -25
  395. package/src/runtime/routes/acp-routes.ts +81 -29
  396. package/src/runtime/routes/app-management-routes.ts +6 -117
  397. package/src/runtime/routes/app-routes.ts +13 -15
  398. package/src/runtime/routes/approval-routes.ts +1 -1
  399. package/src/runtime/routes/attachment-routes.ts +26 -15
  400. package/src/runtime/routes/avatar-routes.ts +26 -0
  401. package/src/runtime/routes/browser-routes.ts +1 -1
  402. package/src/runtime/routes/browser-tabs-routes.ts +6 -10
  403. package/src/runtime/routes/btw-routes.ts +29 -23
  404. package/src/runtime/routes/consolidation-routes.ts +120 -20
  405. package/src/runtime/routes/conversation-cli-routes.ts +1 -1
  406. package/src/runtime/routes/conversation-list-routes.ts +1 -1
  407. package/src/runtime/routes/conversation-query-routes.ts +3 -1
  408. package/src/runtime/routes/conversation-routes.ts +372 -185
  409. package/src/runtime/routes/conversation-starter-routes.ts +13 -7
  410. package/src/runtime/routes/conversations-import-routes.ts +24 -7
  411. package/src/runtime/routes/documents-routes.ts +4 -0
  412. package/src/runtime/routes/domain-routes.ts +51 -37
  413. package/src/runtime/routes/epoch-millis-range.ts +34 -0
  414. package/src/runtime/routes/events-routes.ts +28 -34
  415. package/src/runtime/routes/gateway-log-routes.ts +26 -4
  416. package/src/runtime/routes/heartbeat-routes.ts +32 -12
  417. package/src/runtime/routes/host-app-control-routes.ts +1 -1
  418. package/src/runtime/routes/host-cu-routes.ts +1 -1
  419. package/src/runtime/routes/identity-intro-cache.ts +11 -34
  420. package/src/runtime/routes/identity-routes.ts +224 -18
  421. package/src/runtime/routes/image-generation-routes.ts +40 -2
  422. package/src/runtime/routes/inbound-message-handler.ts +1 -1
  423. package/src/runtime/routes/index.ts +2 -0
  424. package/src/runtime/routes/integrations/a2a.ts +12 -10
  425. package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +16 -0
  426. package/src/runtime/routes/integrations/slack/channel.ts +4 -0
  427. package/src/runtime/routes/integrations/slack/share.ts +27 -6
  428. package/src/runtime/routes/integrations/telegram.ts +6 -0
  429. package/src/runtime/routes/integrations/twilio.ts +42 -0
  430. package/src/runtime/routes/internal-telemetry-routes.ts +88 -0
  431. package/src/runtime/routes/log-export-routes.ts +8 -0
  432. package/src/runtime/routes/memory-v2-routes.ts +15 -8
  433. package/src/runtime/routes/memory-v3-routes.ts +66 -34
  434. package/src/runtime/routes/oauth-apps.ts +66 -12
  435. package/src/runtime/routes/oauth-providers.ts +44 -5
  436. package/src/runtime/routes/platform-routes.ts +81 -5
  437. package/src/runtime/routes/playground/__tests__/force-compact.test.ts +6 -4
  438. package/src/runtime/routes/playground/force-compact.ts +1 -1
  439. package/src/runtime/routes/playground/helpers.ts +1 -1
  440. package/src/runtime/routes/rename-conversation-routes.ts +5 -0
  441. package/src/runtime/routes/schedule-routes.ts +152 -42
  442. package/src/runtime/routes/secret-routes.ts +14 -2
  443. package/src/runtime/routes/skills-routes.ts +43 -14
  444. package/src/runtime/routes/surface-conversation-resolver.ts +4 -3
  445. package/src/runtime/routes/tool-call-confirmation-enrichment.test.ts +161 -0
  446. package/src/runtime/routes/tool-call-confirmation-enrichment.ts +107 -0
  447. package/src/runtime/routes/trust-rules-routes.ts +26 -2
  448. package/src/runtime/routes/tts-routes.ts +35 -0
  449. package/src/runtime/routes/types.ts +66 -8
  450. package/src/runtime/routes/usage-routes.ts +47 -39
  451. package/src/runtime/routes/webhook-routes.ts +41 -2
  452. package/src/runtime/routes/work-items-routes.ts +2 -4
  453. package/src/runtime/routes/workspace-routes.ts +4 -0
  454. package/src/runtime/services/__tests__/analyze-conversation.test.ts +6 -0
  455. package/src/runtime/services/analyze-conversation.ts +2 -2
  456. package/src/runtime/services/conversation-serializer.ts +1 -1
  457. package/src/schedule/schedule-store.ts +20 -1
  458. package/src/schedule/schedule-usage-store.ts +83 -0
  459. package/src/schedule/scheduler.ts +12 -5
  460. package/src/signals/cancel.ts +2 -4
  461. package/src/skills/catalog-files.ts +2 -2
  462. package/src/skills/catalog-install.ts +3 -0
  463. package/src/skills/categories-cache.ts +118 -0
  464. package/src/skills/clawhub-files.ts +1 -2
  465. package/src/skills/skillssh-files.ts +1 -2
  466. package/src/subagent/manager.ts +17 -5
  467. package/src/telemetry/types.ts +29 -1
  468. package/src/telemetry/usage-telemetry-reporter.test.ts +112 -3
  469. package/src/telemetry/usage-telemetry-reporter.ts +57 -2
  470. package/src/tools/acp/context.ts +20 -0
  471. package/src/tools/acp/list-agents.test.ts +7 -1
  472. package/src/tools/acp/spawn.test.ts +158 -55
  473. package/src/tools/acp/spawn.ts +47 -72
  474. package/src/tools/acp/steer.test.ts +105 -8
  475. package/src/tools/acp/steer.ts +48 -17
  476. package/src/tools/apps/executors.ts +13 -8
  477. package/src/tools/executor.ts +1 -53
  478. package/src/tools/filesystem/write.ts +34 -0
  479. package/src/tools/network/__tests__/web-search-metadata.test.ts +7 -1
  480. package/src/tools/network/__tests__/web-search.test.ts +11 -3
  481. package/src/tools/network/web-search-error.test.ts +248 -0
  482. package/src/tools/network/web-search-error.ts +267 -0
  483. package/src/tools/network/web-search.ts +207 -48
  484. package/src/tools/schedule/create.ts +2 -0
  485. package/src/tools/subagent/spawn.ts +2 -4
  486. package/src/tools/terminal/safe-env.ts +10 -1
  487. package/src/tools/ui-surface/definitions.ts +34 -5
  488. package/src/tts/__tests__/provider-catalog-consistency.test.ts +85 -1
  489. package/src/tts/provider-catalog.ts +76 -1
  490. package/src/util/mutex.ts +47 -0
  491. package/src/workspace/git-service.ts +1 -42
  492. package/src/workspace/migrations/051-seed-conversation-summarization-callsite.ts +4 -5
  493. package/src/workspace/migrations/095-bump-heartbeat-interval-30m-to-60m.ts +51 -0
  494. package/src/workspace/migrations/096-reduce-quality-profile-effort.ts +72 -0
  495. package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +117 -0
  496. package/src/workspace/migrations/registry.ts +6 -0
  497. package/docs/plugins.md +0 -836
  498. package/examples/plugins/echo/register.ts +0 -184
  499. package/src/__tests__/bootstrap-turn-cleanup.test.ts +0 -44
  500. package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -405
  501. package/src/__tests__/compaction-pipeline.test.ts +0 -210
  502. package/src/__tests__/compaction-timeout-recovery.test.ts +0 -251
  503. package/src/__tests__/empty-response-pipeline.test.ts +0 -423
  504. package/src/__tests__/llm-call-pipeline.test.ts +0 -287
  505. package/src/__tests__/memory-retrieval-pipeline.test.ts +0 -418
  506. package/src/__tests__/persistence-pipeline.test.ts +0 -503
  507. package/src/__tests__/pipeline-runner.test.ts +0 -564
  508. package/src/__tests__/title-generate-pipeline.test.ts +0 -211
  509. package/src/__tests__/token-estimate-pipeline.test.ts +0 -479
  510. package/src/__tests__/tool-error-pipeline.test.ts +0 -241
  511. package/src/__tests__/tool-execute-pipeline.test.ts +0 -417
  512. package/src/__tests__/tool-result-truncate-pipeline.test.ts +0 -341
  513. package/src/daemon/bootstrap-turn-cleanup.ts +0 -45
  514. package/src/gallery/default-gallery.ts +0 -1359
  515. package/src/gallery/gallery-manifest.ts +0 -28
  516. package/src/home/feature-gate.ts +0 -22
  517. package/src/memory/v3/provider-blocks.ts +0 -16
  518. package/src/plugins/defaults/circuit-breaker/middlewares/circuitBreaker.ts +0 -93
  519. package/src/plugins/defaults/circuit-breaker/package.json +0 -15
  520. package/src/plugins/defaults/circuit-breaker/register.ts +0 -39
  521. package/src/plugins/defaults/compaction/middlewares/compaction.ts +0 -25
  522. package/src/plugins/defaults/compaction/terminal.ts +0 -73
  523. package/src/plugins/defaults/empty-response/middlewares/emptyResponse.ts +0 -22
  524. package/src/plugins/defaults/empty-response/terminal.ts +0 -106
  525. package/src/plugins/defaults/injectors/package.json +0 -15
  526. package/src/plugins/defaults/llm-call/middlewares/llmCall.ts +0 -17
  527. package/src/plugins/defaults/llm-call/register.ts +0 -45
  528. package/src/plugins/defaults/memory-retrieval/middlewares/memoryRetrieval.ts +0 -17
  529. package/src/plugins/defaults/memory-retrieval/package.json +0 -15
  530. package/src/plugins/defaults/memory-retrieval/register.ts +0 -181
  531. package/src/plugins/defaults/overflow-reduce/middlewares/overflowReduce.ts +0 -126
  532. package/src/plugins/defaults/overflow-reduce/package.json +0 -15
  533. package/src/plugins/defaults/overflow-reduce/register.ts +0 -42
  534. package/src/plugins/defaults/persistence/middlewares/persistence.ts +0 -19
  535. package/src/plugins/defaults/persistence/package.json +0 -15
  536. package/src/plugins/defaults/persistence/register.ts +0 -38
  537. package/src/plugins/defaults/persistence/terminal.ts +0 -83
  538. package/src/plugins/defaults/title-generate/terminal.ts +0 -31
  539. package/src/plugins/defaults/token-estimate/middlewares/tokenEstimate.ts +0 -23
  540. package/src/plugins/defaults/token-estimate/package.json +0 -15
  541. package/src/plugins/defaults/token-estimate/register.ts +0 -34
  542. package/src/plugins/defaults/token-estimate/terminal.ts +0 -40
  543. package/src/plugins/defaults/tool-error/middlewares/toolError.ts +0 -21
  544. package/src/plugins/defaults/tool-error/terminal.ts +0 -47
  545. package/src/plugins/defaults/tool-execute/middlewares/toolExecute.ts +0 -23
  546. package/src/plugins/defaults/tool-execute/package.json +0 -15
  547. package/src/plugins/defaults/tool-execute/register.ts +0 -49
  548. package/src/plugins/defaults/tool-result-truncate/middlewares/toolResultTruncate.ts +0 -23
  549. package/src/plugins/defaults/tool-result-truncate/types.ts +0 -22
  550. package/src/skills/category-inference.ts +0 -111
  551. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/capabilities.test.ts +0 -0
  552. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/core.test.ts +0 -0
  553. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/fixtures/eval-turns.json +0 -0
  554. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/fixtures/live-turns.json +0 -0
  555. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/needle.test.ts +0 -0
  556. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/snapshot.test.ts +0 -0
  557. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/tree.test.ts +0 -0
  558. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/types.test.ts +0 -0
  559. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/working-set-eviction.test.ts +0 -0
  560. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/working-set-skeleton.test.ts +0 -0
  561. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/core.ts +0 -0
  562. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/README.md +0 -0
  563. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/assignments.json +0 -0
  564. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/core.json +0 -0
  565. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-a/topic-x.md +0 -0
  566. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-a/topic-y.md +0 -0
  567. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-b/topic-z.md +0 -0
  568. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/needle.ts +0 -0
  569. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/snapshot.ts +0 -0
  570. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/working-set.ts +0 -0
@@ -1,181 +0,0 @@
1
- /**
2
- * Default `memoryRetrieval` plugin.
3
- *
4
- * Encapsulates the three retrievals the agent loop performs before building
5
- * the runtime-injection block for a turn:
6
- *
7
- * 1. **PKB context** via {@link readPkbContext} — always-loaded workspace
8
- * notes (INDEX.md, essentials.md, …) that precede the user's message.
9
- * 2. **NOW.md scratchpad** via {@link readNowScratchpad} — the short
10
- * user-maintained note the assistant keeps up to date.
11
- * 3. **Memory graph** via {@link ConversationGraphMemory.prepareMemory} —
12
- * dispatches to context-load or per-turn retrieval depending on
13
- * initialization state; gated on the actor being trusted (guardian).
14
- *
15
- * The default plugin registers a pass-through middleware so the pipeline
16
- * runner always has at least one entry and downstream telemetry observes a
17
- * deterministic chain. The actual retrieval runs in the terminal supplied
18
- * by the agent loop; centralizing the helper here (as
19
- * {@link runDefaultMemoryRetrieval}) makes it trivial for a plugin to
20
- * fall back to the default behavior by calling this helper from its own
21
- * middleware.
22
- *
23
- * See `.private/plans/agent-plugin-system.md` PR 20 for the containing
24
- * milestone.
25
- */
26
-
27
- import type { AssistantConfig } from "../../../config/schema.js";
28
- import {
29
- readNowScratchpad,
30
- readPkbContext,
31
- } from "../../../daemon/conversation-runtime-assembly.js";
32
- import type { ServerMessage } from "../../../daemon/message-protocol.js";
33
- import type { ConversationGraphMemory } from "../../../memory/graph/conversation-graph-memory.js";
34
- import type { Message } from "../../../providers/types.js";
35
- import {
36
- type MemoryArgs,
37
- type MemoryResult,
38
- type Plugin,
39
- } from "../../types.js";
40
- import defaultMemoryRetrievalMiddleware from "./middlewares/memoryRetrieval.js";
41
- import pkg from "./package.json" with { type: "json" };
42
-
43
- /**
44
- * Discriminator the agent loop uses to narrow `MemoryResult.memoryGraphBlocks`
45
- * back into the full {@link GraphMemoryPayload} shape. Plugins that substitute
46
- * their own memory blocks without setting this marker will fall through the
47
- * agent loop's graph-result consumption path — which is the intended escape
48
- * hatch for custom retrievers.
49
- */
50
- export const DEFAULT_MEMORY_GRAPH_KIND = "default.graph" as const;
51
-
52
- /**
53
- * Shape of the single block the default memory-graph retriever emits.
54
- *
55
- * Mirrors the object returned by
56
- * {@link ConversationGraphMemory.prepareMemory} — the agent loop consumes
57
- * every field downstream (PKB query vectors, metrics persistence, memory
58
- * event emission). Kept as a concrete type here so both the terminal and the
59
- * agent loop can share one import.
60
- */
61
- export interface GraphMemoryPayload {
62
- readonly kind: typeof DEFAULT_MEMORY_GRAPH_KIND;
63
- readonly result: Awaited<
64
- ReturnType<ConversationGraphMemory["prepareMemory"]>
65
- >;
66
- }
67
-
68
- /**
69
- * External state the default retriever needs but the pipeline args cannot
70
- * carry (conversation-scoped graph handle, event sink, live message list).
71
- * Passed as a second argument to {@link runDefaultMemoryRetrieval} rather
72
- * than threaded through {@link MemoryArgs} to keep the plugin-facing
73
- * pipeline surface minimal.
74
- */
75
- export interface DefaultMemoryRetrievalDeps {
76
- /** Live message list for this turn (pre-injection). */
77
- readonly messages: Message[];
78
- /** Per-conversation memory graph handle. */
79
- readonly graphMemory: ConversationGraphMemory;
80
- /** Assistant config snapshot. */
81
- readonly config: AssistantConfig;
82
- /** Event sink used by the graph retriever (memory_status events). */
83
- readonly onEvent: (msg: ServerMessage) => void;
84
- /** True when the actor for this turn is trusted (guardian-class). */
85
- readonly isTrustedActor: boolean;
86
- }
87
-
88
- /**
89
- * Run the default retrieval. Always returns a {@link MemoryResult}; skips
90
- * the memory-graph call entirely when the actor is not trusted (matches the
91
- * prior agent-loop gate).
92
- *
93
- * The returned `memoryGraphBlocks` is either empty (when the actor is not
94
- * trusted) or a single {@link GraphMemoryPayload} wrapping the graph
95
- * retriever's full output. The agent loop narrows via
96
- * {@link DEFAULT_MEMORY_GRAPH_KIND} to consume it.
97
- *
98
- * Memory retrieval blocks the turn — there is no soft timeout here. Memory
99
- * is critical context, and silently dropping it produces a worse outcome
100
- * than a slower turn. Cancellation still works via `args.signal`, which is
101
- * threaded into `prepareMemory`.
102
- */
103
- export async function runDefaultMemoryRetrieval(
104
- args: MemoryArgs,
105
- deps: DefaultMemoryRetrievalDeps,
106
- ): Promise<MemoryResult> {
107
- // NOW.md and PKB are read unconditionally — the agent loop decides
108
- // whether to inject them based on first-turn / post-compaction gating.
109
- const pkbContent = readPkbContext();
110
- const nowContent = readNowScratchpad();
111
-
112
- if (!deps.isTrustedActor) {
113
- // Untrusted actors skip memory-graph retrieval entirely — preserves the
114
- // pre-plugin gate that lived inline in `conversation-agent-loop.ts`.
115
- return {
116
- pkbContent,
117
- nowContent,
118
- memoryGraphBlocks: [],
119
- };
120
- }
121
-
122
- const graphResult = await deps.graphMemory.prepareMemory(
123
- deps.messages,
124
- deps.config,
125
- args.signal,
126
- deps.onEvent,
127
- );
128
-
129
- const payload: GraphMemoryPayload = {
130
- kind: DEFAULT_MEMORY_GRAPH_KIND,
131
- result: graphResult,
132
- };
133
-
134
- return {
135
- pkbContent,
136
- nowContent,
137
- memoryGraphBlocks: [payload],
138
- };
139
- }
140
-
141
- /**
142
- * Narrow a {@link MemoryResult} memory-graph block back into the full
143
- * {@link GraphMemoryPayload} the default retriever emits. Returns `null` when
144
- * the pipeline output came from a custom retriever (no blocks, or a block
145
- * without the {@link DEFAULT_MEMORY_GRAPH_KIND} discriminator).
146
- *
147
- * The agent loop uses this helper to decide whether to run its downstream
148
- * graph-result consumption path (query-vector propagation, metric
149
- * persistence, memory-event emission). Custom retrievers that skip that
150
- * path are expected to handle their own side effects inside their
151
- * middleware.
152
- */
153
- export function asDefaultGraphPayload(
154
- blocks: ReadonlyArray<unknown>,
155
- ): GraphMemoryPayload | null {
156
- const first = blocks[0];
157
- if (
158
- first != null &&
159
- typeof first === "object" &&
160
- "kind" in first &&
161
- (first as { kind?: unknown }).kind === DEFAULT_MEMORY_GRAPH_KIND
162
- ) {
163
- return first as GraphMemoryPayload;
164
- }
165
- return null;
166
- }
167
-
168
- /**
169
- * Default plugin exposing the `memoryRetrieval` pipeline slot. Registered
170
- * by {@link registerDefaultMemoryRetrievalPlugin} from the plugin
171
- * bootstrap wiring so ordering is deterministic across boots.
172
- */
173
- export const defaultMemoryRetrievalPlugin: Plugin = {
174
- manifest: {
175
- name: pkg.name,
176
- version: pkg.version,
177
- },
178
- middleware: {
179
- memoryRetrieval: defaultMemoryRetrievalMiddleware,
180
- },
181
- };
@@ -1,126 +0,0 @@
1
- import type { ContextWindowCompactOptions } from "../../../../context/window-manager.js";
2
- import {
3
- createInitialReducerState,
4
- reduceContextOverflow,
5
- type ReducerState,
6
- } from "../../../../daemon/context-overflow-reducer.js";
7
- import type {
8
- Middleware,
9
- OverflowReduceArgs,
10
- OverflowReduceResult,
11
- } from "../../../types.js";
12
-
13
- /**
14
- * Default middleware for the `overflowReduce` pipeline — implements the
15
- * historical tier-loop semantics (forced compaction, tool-result truncation,
16
- * media stubbing, injection downgrade) plus the post-step re-injection /
17
- * re-estimation dance.
18
- *
19
- * The middleware intentionally ignores `next`. Overflow reduction is a
20
- * *terminal* behavior: there is no downstream implementation to defer to when
21
- * a user-supplied middleware short-circuits. Later plugins may still wrap this
22
- * one (outer middleware can observe each reduction iteration via their own
23
- * `next` callback) but the default never delegates to a hypothetical base
24
- * handler — the inline loop was the base.
25
- */
26
- const defaultOverflowReduceMiddleware: Middleware<
27
- OverflowReduceArgs,
28
- OverflowReduceResult
29
- > = async function defaultOverflowReduceMiddleware(args, _next, _ctx) {
30
- let messages = args.messages;
31
- let runMessages = args.runMessages;
32
- let injectionMode: "full" | "minimal" = "full";
33
- let reducerState: ReducerState = createInitialReducerState();
34
- let reducerCompacted = false;
35
- let attempts = 0;
36
-
37
- while (attempts < args.maxAttempts && !reducerState.exhausted) {
38
- // Abort check at the top of every iteration. When the pipeline runner
39
- // arms a timeout (or the caller aborts externally), `args.abortSignal`
40
- // is linked to that trigger via `linkAbortSignal`, so this check lets
41
- // us bail out BETWEEN iterations rather than letting another round of
42
- // compaction / re-injection mutate `ctx.messages` after the turn has
43
- // already failed. Individual `reduceContextOverflow` calls also honor
44
- // the signal, but without this gate a fresh iteration could still
45
- // start after the signal fires, since the previous one returned
46
- // normally before the abort propagated.
47
- args.abortSignal?.throwIfAborted();
48
-
49
- attempts++;
50
- args.emitActivityState();
51
-
52
- const basisMessages = messages;
53
- const step = await reduceContextOverflow(
54
- basisMessages,
55
- {
56
- providerName: args.providerName,
57
- systemPrompt: args.systemPrompt,
58
- contextWindow: args.contextWindow,
59
- targetTokens: args.preflightBudget,
60
- toolTokenBudget: args.toolTokenBudget,
61
- },
62
- reducerState,
63
- (msgs, signal, opts: ContextWindowCompactOptions) =>
64
- args.compactFn(msgs, signal, opts),
65
- args.abortSignal,
66
- );
67
-
68
- reducerState = step.state;
69
- messages = step.messages;
70
- injectionMode = step.state.injectionMode;
71
-
72
- // Per-iteration compaction flag: whether THIS step just produced a
73
- // fresh compaction. PKB / NOW re-injection is gated on this — see the
74
- // reinjectForMode JSDoc for why the two signals differ.
75
- const stepCompacted = step.compactionResult?.compacted === true;
76
-
77
- // Let the orchestrator apply compaction side effects (circuit-breaker
78
- // tracking, event emission, ctx mutation) before we re-inject.
79
- if (step.compactionResult) {
80
- await args.onCompactionResult(step.compactionResult, basisMessages);
81
- if (stepCompacted) {
82
- reducerCompacted = true;
83
- }
84
- }
85
-
86
- // Second abort gate — if the side effects or the step itself took us
87
- // past the deadline, don't rebuild runMessages or iterate again.
88
- args.abortSignal?.throwIfAborted();
89
-
90
- // Rebuild runMessages via the orchestrator-supplied helper (which
91
- // re-runs `applyRuntimeInjections` with potentially downgraded mode
92
- // and freshly re-hydrated PKB/NOW blocks after compaction). We pass
93
- // the current reduced `messages` explicitly so the orchestrator never
94
- // has to read from mutable shared state to rebuild runMessages — a
95
- // tier that doesn't trigger compaction (tool-result truncation, media
96
- // stubbing) won't update `ctx.messages` on its own.
97
- //
98
- // `stepCompacted` and `reducerCompacted` are both passed so the
99
- // orchestrator can gate PKB / NOW re-injection per-iteration while
100
- // keeping `slackChronologicalMessages` suppressed once any iteration
101
- // has compacted.
102
- runMessages = await args.reinjectForMode(
103
- messages,
104
- injectionMode,
105
- stepCompacted,
106
- reducerCompacted,
107
- );
108
-
109
- // Re-estimate with injections included — `step.estimatedTokens` was
110
- // computed on bare history and doesn't account for tokens added by
111
- // runtime injections.
112
- const postInjectionTokens = args.estimatePostInjection(runMessages);
113
- if (postInjectionTokens <= args.preflightBudget) break;
114
- }
115
-
116
- return {
117
- messages,
118
- runMessages,
119
- injectionMode,
120
- reducerState,
121
- reducerCompacted,
122
- attempts,
123
- };
124
- };
125
-
126
- export default defaultOverflowReduceMiddleware;
@@ -1,15 +0,0 @@
1
- {
2
- "name": "default-overflow-reduce",
3
- "version": "1.0.0",
4
- "description": "First-party default plugin wrapping the assistant's built-in overflow-reduce 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
- }
@@ -1,42 +0,0 @@
1
- /**
2
- * Default `overflowReduce` plugin — extracted verbatim from the inline
3
- * preflight reducer loop that previously lived in
4
- * `daemon/conversation-agent-loop.ts` (the `while (preflightAttempts < …)`
5
- * block around lines 1045–1156 before PR 23).
6
- *
7
- * The plugin owns the reducer tier-loop (forced compaction, tool-result
8
- * truncation, media stubbing, injection downgrade) and the post-step
9
- * re-injection / re-estimation dance. Orchestrator-specific coupling
10
- * (activity emission, circuit-breaker tracking, compaction-result
11
- * application, runtime injection reassembly) is threaded in through the
12
- * callbacks carried on {@link OverflowReduceArgs}; the plugin itself has no
13
- * access to the agent-loop context object.
14
- *
15
- * The forced-compaction tier runs through the orchestrator-supplied
16
- * `compactFn`, which routes into the `compaction` plugin pipeline so
17
- * registered compaction middleware observes reducer-initiated invocations
18
- * alongside the orchestrator-owned call sites. Non-compaction tiers
19
- * (tool-result truncation, media stubbing, injection downgrade) remain
20
- * in-process: they mutate message arrays directly without crossing a
21
- * pipeline boundary. The reducer itself runs under the `overflowReduce`
22
- * pipeline, so the full layering is `overflowReduce` → reducer tier loop
23
- * → (for the forced-compaction tier only) nested `compaction` pipeline.
24
- */
25
-
26
- import { type Plugin } from "../../types.js";
27
- import defaultOverflowReduceMiddleware from "./middlewares/overflowReduce.js";
28
- import pkg from "./package.json" with { type: "json" };
29
-
30
- /**
31
- * The default plugin registered at bootstrap. No `init`/`onShutdown` —
32
- * registering the middleware is the only behavior.
33
- */
34
- export const defaultOverflowReducePlugin: Plugin = {
35
- manifest: {
36
- name: pkg.name,
37
- version: pkg.version,
38
- },
39
- middleware: {
40
- overflowReduce: defaultOverflowReduceMiddleware,
41
- },
42
- };
@@ -1,19 +0,0 @@
1
- import type { Middleware, PersistArgs, PersistResult } from "../../../types.js";
2
-
3
- /**
4
- * Passthrough middleware for the `persistence` pipeline. Forwards to
5
- * `next(args)` unchanged; the actual dispatch lives in the terminal handler
6
- * (`../terminal.ts`), wired in at the `runPipeline` call sites in
7
- * `daemon/conversation-agent-loop.ts` and
8
- * `daemon/conversation-agent-loop-handlers.ts`.
9
- *
10
- * Defaults register at the OUTERMOST onion position, so deciding here without
11
- * calling `next` would shadow every later-registered plugin. Routing through
12
- * `next(args)` lets user middleware participate normally.
13
- */
14
- const passthrough: Middleware<PersistArgs, PersistResult> = async (
15
- args,
16
- next,
17
- ) => next(args);
18
-
19
- export default passthrough;
@@ -1,15 +0,0 @@
1
- {
2
- "name": "default-persistence",
3
- "version": "1.0.0",
4
- "description": "First-party default plugin wrapping the assistant's built-in persistence 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
- }
@@ -1,38 +0,0 @@
1
- /**
2
- * Default `persistence` plugin.
3
- *
4
- * The plugin's middleware is a passthrough — it calls `next(args)` and returns
5
- * the result unchanged. The actual dispatch lives in the terminal handler in
6
- * `./terminal.ts`, which is wired in as the pipeline's `terminal` argument by
7
- * `runPipeline` call sites in `daemon/conversation-agent-loop.ts` and
8
- * `daemon/conversation-agent-loop-handlers.ts`. This separation matters: the
9
- * default plugin is registered before any user plugin (defaults load first in
10
- * `bootstrapPlugins()`), which puts it at the OUTERMOST position of the onion
11
- * chain. If the default middleware were to invoke the terminal directly
12
- * without calling `next`, it would shadow every later-registered plugin.
13
- * Routing through `next(args)` lets user middleware participate normally.
14
- *
15
- * Manifest declares `provides.persistence: "v1"` so other plugins can
16
- * negotiate against the pipeline surface and `requires.pluginRuntime: "v1"`
17
- * to satisfy the registry's mandatory capability check.
18
- *
19
- * Registered from `daemon/external-plugins-bootstrap.ts` via a side-effect
20
- * import so the plugin is present in the registry before
21
- * {@link bootstrapPlugins} walks it.
22
- *
23
- * Design doc: `.private/plans/agent-plugin-system.md` (PR 27).
24
- */
25
-
26
- import { type Plugin } from "../../types.js";
27
- import persistence from "./middlewares/persistence.js";
28
- import pkg from "./package.json" with { type: "json" };
29
-
30
- export const defaultPersistencePlugin: Plugin = {
31
- manifest: {
32
- name: pkg.name,
33
- version: pkg.version,
34
- },
35
- middleware: {
36
- persistence,
37
- },
38
- };
@@ -1,83 +0,0 @@
1
- /**
2
- * Default `persistence` behavior: writes conversation messages to the database
3
- * (and optionally the JSONL disk view).
4
- *
5
- * This module is side-effect free: importing it does not register any plugin.
6
- *
7
- * The handler dispatches on the discriminated {@link PersistArgs.op} field:
8
- *
9
- * - `add` → {@link addMessage}, optionally followed by
10
- * {@link syncMessageToDisk} when `args.syncToDisk` is true.
11
- * - `reserve` → {@link reserveMessage} — pre-allocates an empty row
12
- * for assistant anchor stamping.
13
- * - `updateContent` → {@link updateMessageContent} — overwrites an existing
14
- * row's content (returns `void`, wrapped as
15
- * `{ op: "updateContent" }`).
16
- * - `update` → {@link updateMessageMetadata} (returns `void`, wrapped
17
- * as `{ op: "update" }`).
18
- * - `delete` → {@link deleteMessageById} (returns the segment/summary
19
- * IDs the caller must clean up out-of-band).
20
- */
21
-
22
- import {
23
- addMessage,
24
- deleteMessageById,
25
- reserveMessage,
26
- updateMessageContent,
27
- updateMessageMetadata,
28
- } from "../../../memory/conversation-crud.js";
29
- import { syncMessageToDisk } from "../../../memory/conversation-disk-view.js";
30
- import type { PersistArgs, PersistResult } from "../../types.js";
31
-
32
- /**
33
- * Persist a message according to `args.op`. Exported so the agent-loop call
34
- * sites can invoke it directly and tests can verify each op in isolation.
35
- */
36
- export async function defaultPersistenceTerminal(
37
- args: PersistArgs,
38
- ): Promise<PersistResult> {
39
- switch (args.op) {
40
- case "add": {
41
- const message = await addMessage(
42
- args.conversationId,
43
- args.role,
44
- args.content,
45
- {
46
- metadata: args.metadata,
47
- ...args.addOptions,
48
- },
49
- );
50
- // Sync the just-persisted row to the JSONL disk view when the caller
51
- // opted in. The handler that emits tool-result rows sets
52
- // `syncToDisk: true` so the disk view stays in lockstep with the DB.
53
- if (args.syncToDisk && args.createdAtMs !== undefined) {
54
- syncMessageToDisk(args.conversationId, message.id, args.createdAtMs);
55
- }
56
- return { op: "add", message };
57
- }
58
- case "reserve": {
59
- const message = await reserveMessage(
60
- args.conversationId,
61
- args.role,
62
- args.metadata,
63
- );
64
- return { op: "reserve", message };
65
- }
66
- case "updateContent": {
67
- updateMessageContent(args.messageId, args.content);
68
- return { op: "updateContent" };
69
- }
70
- case "update": {
71
- updateMessageMetadata(args.messageId, args.updates);
72
- return { op: "update" };
73
- }
74
- case "delete": {
75
- const deleted = deleteMessageById(args.messageId);
76
- return {
77
- op: "delete",
78
- segmentIds: deleted.segmentIds,
79
- deletedSummaryIds: deleted.deletedSummaryIds,
80
- };
81
- }
82
- }
83
- }
@@ -1,31 +0,0 @@
1
- /**
2
- * Default `titleGenerate` behavior: kicks off conversation-title generation.
3
- *
4
- * This module is side-effect free: importing it does not register any plugin.
5
- *
6
- * Delegates to {@link queueGenerateConversationTitle}, which schedules title
7
- * generation as fire-and-forget background work and falls back to a
8
- * deterministic placeholder on failure.
9
- */
10
-
11
- import { queueGenerateConversationTitle } from "../../../memory/conversation-title-service.js";
12
- import type { TitleArgs, TitleResult } from "../../types.js";
13
-
14
- /**
15
- * Invoke the title-generation service with the provided arguments. Exported
16
- * for tests that want to exercise the default directly.
17
- *
18
- * Returns an empty result — the service is fire-and-forget and surfaces its
19
- * output through `onTitleUpdated`.
20
- */
21
- export async function defaultTitleGenerateTerminal(
22
- args: TitleArgs,
23
- ): Promise<TitleResult> {
24
- queueGenerateConversationTitle({
25
- conversationId: args.conversationId,
26
- provider: args.provider,
27
- userMessage: args.userMessage,
28
- onTitleUpdated: args.onTitleUpdated,
29
- });
30
- return {};
31
- }
@@ -1,23 +0,0 @@
1
- import type {
2
- EstimateArgs,
3
- EstimateResult,
4
- Middleware,
5
- } from "../../../types.js";
6
-
7
- /**
8
- * Passthrough middleware for the `tokenEstimate` pipeline. Forwards to
9
- * `next(args)` unchanged; the actual estimate lives in the terminal handler
10
- * (`../terminal.ts`), wired in at the `runPipeline` call sites in
11
- * `daemon/conversation-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. The passthrough
15
- * lets user middleware that wraps the default (e.g. a doubler, a
16
- * provider-native `countTokens` override) participate normally.
17
- */
18
- const passthrough: Middleware<EstimateArgs, EstimateResult> = async (
19
- args,
20
- next,
21
- ) => next(args);
22
-
23
- export default passthrough;
@@ -1,15 +0,0 @@
1
- {
2
- "name": "default-token-estimate",
3
- "version": "1.0.0",
4
- "description": "First-party default plugin wrapping the assistant's built-in token-estimate 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
- }
@@ -1,34 +0,0 @@
1
- /**
2
- * Default `tokenEstimate` plugin.
3
- *
4
- * The plugin's middleware is a passthrough — it calls `next(args)` and returns
5
- * the result unchanged. The actual estimate lives in the terminal handler in
6
- * `./terminal.ts`, which is wired in as the pipeline's `terminal` argument by
7
- * `runPipeline` call sites in `daemon/conversation-agent-loop.ts`. This
8
- * separation matters: the default plugin is registered before any user plugin
9
- * (defaults load first in `bootstrapPlugins()`), which puts it at the
10
- * OUTERMOST position of the onion chain. If the default middleware were to
11
- * invoke the terminal directly without calling `next`, it would shadow every
12
- * later-registered plugin. The passthrough lets user middleware that wraps the
13
- * default (e.g. a doubler, a provider-native `countTokens` override)
14
- * participate normally.
15
- */
16
-
17
- import { type Plugin } from "../../types.js";
18
- import tokenEstimate from "./middlewares/tokenEstimate.js";
19
- import pkg from "./package.json" with { type: "json" };
20
-
21
- /**
22
- * Default `tokenEstimate` plugin. Registered by
23
- * {@link bootstrapPlugins} on daemon startup so the pipeline always has a
24
- * terminal handler even when no other plugin contributes one.
25
- */
26
- export const defaultTokenEstimatePlugin: Plugin = {
27
- manifest: {
28
- name: pkg.name,
29
- version: pkg.version,
30
- },
31
- middleware: {
32
- tokenEstimate,
33
- },
34
- };
@@ -1,40 +0,0 @@
1
- /**
2
- * Default `tokenEstimate` behavior: estimates the prompt token count used by
3
- * the overflow gate.
4
- *
5
- * This module is side-effect free: importing it does not register any plugin.
6
- *
7
- * Delegates to
8
- * {@link estimatePromptTokens}, which applies the EWMA calibration correction
9
- * recorded from past provider responses. Preflight + mid-loop checks must use
10
- * the calibrated estimate — the calibrated value keeps the overflow gate
11
- * consistent with the convergence path in the reducer. The pre-send
12
- * calibration capture in `agent/loop.ts` still uses `estimatePromptTokensRaw`
13
- * on purpose — the calibrator must learn against the raw estimate so the EWMA
14
- * converges against provider ground truth rather than chasing its own
15
- * corrected output. This path produces the user-facing estimate; calibration
16
- * capture stays separate.
17
- */
18
-
19
- import {
20
- estimatePromptTokens,
21
- estimateToolsTokens,
22
- } from "../../../context/token-estimator.js";
23
- import type { EstimateArgs, EstimateResult } from "../../types.js";
24
-
25
- /**
26
- * Compute the tool token budget from `args.tools` and delegate to
27
- * {@link estimatePromptTokens} with the canonical provider key, applying the
28
- * EWMA calibration correction. Exported so the agent loop can call it directly
29
- * and tests can verify the default behavior.
30
- */
31
- export const defaultTokenEstimateTerminal = async (
32
- args: EstimateArgs,
33
- ): Promise<EstimateResult> => {
34
- const toolTokenBudget =
35
- args.tools.length > 0 ? estimateToolsTokens(args.tools) : 0;
36
- return estimatePromptTokens(args.history, args.systemPrompt, {
37
- providerName: args.providerName,
38
- toolTokenBudget,
39
- });
40
- };