@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,28 +0,0 @@
1
- export interface GalleryManifest {
2
- version: number;
3
- updatedAt: string;
4
- categories: GalleryCategory[];
5
- apps: GalleryApp[];
6
- }
7
-
8
- export interface GalleryCategory {
9
- id: string; // e.g. "productivity", "health", "fun"
10
- name: string; // Display name
11
- icon: string; // Emoji
12
- }
13
-
14
- export interface GalleryApp {
15
- id: string; // Unique identifier
16
- name: string;
17
- description: string;
18
- icon: string; // Emoji
19
- category: string; // Category ID
20
- version: string; // e.g. "1.0.0"
21
- featured?: boolean;
22
- schemaJson: string; // JSON schema for app records
23
- htmlDefinition: string; // Complete HTML app (also serves as compiled fallback)
24
- /** 2 = multi-file TSX format with sourceFiles */
25
- formatVersion?: number;
26
- /** Maps relative path to file content, e.g. { "src/main.tsx": "...", "src/index.html": "..." } */
27
- sourceFiles?: Record<string, string>;
28
- }
@@ -1,22 +0,0 @@
1
- import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
2
- import type { AssistantConfig } from "../config/schema.js";
3
-
4
- const HOME_PAGE_FLAG_KEY = "home-page" as const;
5
-
6
- /**
7
- * Whether the home page / home feed surface is enabled for this install.
8
- *
9
- * `home-page` is a `"both"`-scope flag: the client renders the home feed as the
10
- * landing view, and the notification pipeline uses it to decide whether passive
11
- * notifications have a home-feed surface to land on (when off, they fall back to
12
- * materializing a conversation instead of being suppressed).
13
- *
14
- * `config` is accepted for parity with the other gate modules but is unused —
15
- * the value resolves from the gateway override cache / registry default.
16
- */
17
- export function isHomePageEnabled(config?: AssistantConfig): boolean {
18
- return isAssistantFeatureFlagEnabled(
19
- HOME_PAGE_FLAG_KEY,
20
- (config ?? {}) as AssistantConfig,
21
- );
22
- }
@@ -1,16 +0,0 @@
1
- import type { ContentBlock } from "../../providers/types.js";
2
-
3
- /**
4
- * Text content block carrying an ephemeral `cache_control` breakpoint. Our
5
- * internal `TextContent` type omits the field (only the Anthropic provider
6
- * transforms it onto the wire), so we reach through a `Record` cast — this
7
- * keeps the core types provider-agnostic. Shared by the v3 router and selector,
8
- * whose STATIC numbered blocks are stable across turns and so cache well.
9
- */
10
- export function cachedTextBlock(text: string): ContentBlock {
11
- const block: ContentBlock = { type: "text", text };
12
- (block as unknown as Record<string, unknown>).cache_control = {
13
- type: "ephemeral",
14
- };
15
- return block;
16
- }
@@ -1,93 +0,0 @@
1
- import type {
2
- CircuitBreakerArgs,
3
- CircuitBreakerResult,
4
- Middleware,
5
- } from "../../../types.js";
6
-
7
- /**
8
- * Consecutive failures required to trip the breaker. Matches the legacy
9
- * `COMPACTION_CIRCUIT_FAILURE_THRESHOLD` in `conversation-agent-loop.ts`.
10
- */
11
- export const COMPACTION_CIRCUIT_FAILURE_THRESHOLD = 3;
12
-
13
- /**
14
- * Cooldown window after the breaker trips, during which auto-compaction is
15
- * suspended. Matches the legacy `COMPACTION_CIRCUIT_COOLDOWN_MS`.
16
- */
17
- export const COMPACTION_CIRCUIT_COOLDOWN_MS = 60 * 60 * 1000;
18
-
19
- /**
20
- * Default middleware for the `circuitBreaker` pipeline. A thin wrapper over the
21
- * state container passed in `CircuitBreakerArgs.state`:
22
- *
23
- * - `{ key }` — query. Defers to `next` for the current
24
- * `{ open, cooldownRemainingMs? }`.
25
- * - `{ key, outcome }` — update state based on outcome, then defer to `next`
26
- * for the post-update decision. A run of three failures trips the breaker;
27
- * any non-failure outcome resets both the counter and the cooldown timestamp.
28
- *
29
- * Event emission preserves the existing `trackCompactionOutcome` behavior:
30
- * `compaction_circuit_open` fires once when the counter first reaches the
31
- * threshold while the circuit is dormant; `compaction_circuit_closed` fires
32
- * only on the open→closed transition.
33
- */
34
- const circuitBreaker: Middleware<CircuitBreakerArgs, CircuitBreakerResult> =
35
- async function circuitBreaker(args, next) {
36
- const { outcome, state, onEvent } = args;
37
-
38
- // Update branch — mutate state first, then defer to the downstream
39
- // chain (or terminal) for the decision so outer observers still see
40
- // the fully-processed outcome. Separating state mutation from
41
- // decision computation also keeps this middleware composable: an
42
- // outer plugin may wrap the invocation to observe both the pre-update
43
- // args and the post-update result.
44
- if (outcome !== undefined) {
45
- if (outcome === "failure") {
46
- state.consecutiveCompactionFailures += 1;
47
- // Treat a stale/expired open-until timestamp the same as null so
48
- // a new 3-strike window can re-open the circuit after the prior
49
- // cooldown elapses. Without this, subsequent trips would no-op
50
- // because `compactionCircuitOpenUntil` remains set to a past
51
- // timestamp even though the breaker is effectively closed.
52
- const circuitDormant =
53
- state.compactionCircuitOpenUntil === null ||
54
- Date.now() >= state.compactionCircuitOpenUntil;
55
- if (
56
- state.consecutiveCompactionFailures >=
57
- COMPACTION_CIRCUIT_FAILURE_THRESHOLD &&
58
- circuitDormant
59
- ) {
60
- const openUntil = Date.now() + COMPACTION_CIRCUIT_COOLDOWN_MS;
61
- state.compactionCircuitOpenUntil = openUntil;
62
- if (onEvent) {
63
- onEvent({
64
- type: "compaction_circuit_open",
65
- conversationId: state.conversationId,
66
- reason: "3_consecutive_failures",
67
- openUntil,
68
- });
69
- }
70
- }
71
- } else {
72
- // Emit only on the open→closed transition; firing on the common
73
- // closed→closed case would be noise.
74
- const wasOpen = state.compactionCircuitOpenUntil !== null;
75
- state.consecutiveCompactionFailures = 0;
76
- state.compactionCircuitOpenUntil = null;
77
- if (wasOpen && onEvent) {
78
- onEvent({
79
- type: "compaction_circuit_closed",
80
- conversationId: state.conversationId,
81
- });
82
- }
83
- }
84
- }
85
-
86
- // Defer to downstream (the terminal, in the default registration, but
87
- // potentially another plugin in a customized chain) for the final
88
- // decision. The terminal's implementation is the canonical read of
89
- // the (now-updated) state container.
90
- return next(args);
91
- };
92
-
93
- export default circuitBreaker;
@@ -1,15 +0,0 @@
1
- {
2
- "name": "default-circuit-breaker",
3
- "version": "1.0.0",
4
- "description": "First-party default plugin wrapping the assistant's built-in circuit-breaker 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,39 +0,0 @@
1
- /**
2
- * Default `circuitBreaker` plugin.
3
- *
4
- * Replicates the inline compaction circuit-breaker logic that previously
5
- * lived in `daemon/conversation-agent-loop.ts`: three consecutive summary-LLM
6
- * failures open the circuit for a one-hour cooldown, and any successful
7
- * compaction resets the counter.
8
- *
9
- * The plugin is a thin wrapper over the state container passed in
10
- * `CircuitBreakerArgs.state`. The {@link Conversation} owns the underlying
11
- * fields (`consecutiveCompactionFailures`, `compactionCircuitOpenUntil`)
12
- * because dev-only playground routes (`POST /playground/reset-compaction-circuit`,
13
- * `POST /playground/inject-compaction-failures`) read and mutate them
14
- * directly. Keeping ownership on the conversation lets this plugin stay a
15
- * pure wrapper while preserving those hatches.
16
- *
17
- * The `key` parameter is carried through for multi-circuit futures but the
18
- * default plugin currently bundles all circuit state into the `state`
19
- * container; the key is attached to the log record via the pipeline runner.
20
- */
21
-
22
- import { type Plugin } from "../../types.js";
23
- import circuitBreaker from "./middlewares/circuitBreaker.js";
24
- import pkg from "./package.json" with { type: "json" };
25
-
26
- /**
27
- * Default plugin registered at daemon startup. Consumers negotiate against
28
- * `circuitBreakerApi@v1` via the registry's capability table.
29
- */
30
- export const defaultCircuitBreakerPlugin: Plugin = {
31
- manifest: {
32
- name: pkg.name,
33
- version: pkg.version,
34
- },
35
-
36
- middleware: {
37
- circuitBreaker,
38
- },
39
- };
@@ -1,25 +0,0 @@
1
- import type {
2
- CompactionArgs,
3
- CompactionResult,
4
- Middleware,
5
- } from "../../../types.js";
6
-
7
- /**
8
- * Passthrough middleware for the `compaction` pipeline. Forwards to
9
- * `next(args)` so any custom plugins layered outside still run; when this is
10
- * the only middleware, `next` is the terminal handler (`../terminal.ts`) and
11
- * returns the real compaction output.
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 defaultCompactionMiddleware: Middleware<
18
- CompactionArgs,
19
- CompactionResult
20
- > = async function defaultCompaction(args, next, ctx) {
21
- void ctx;
22
- return next(args);
23
- };
24
-
25
- export default defaultCompactionMiddleware;
@@ -1,73 +0,0 @@
1
- /**
2
- * Default `compaction` behavior: summarizes conversation history when the
3
- * context window fills up.
4
- *
5
- * This module is side-effect free: importing it does not register any plugin.
6
- *
7
- * Delegates to the orchestrator's existing {@link ContextWindowManager}
8
- * instance, read from `ctx.contextWindowManager` on the {@link TurnContext} as
9
- * a typed optional field. The orchestrator is responsible for attaching that
10
- * handle to the per-turn context. If the handle is missing, this throws a
11
- * {@link PluginExecutionError} so the bug surfaces with clear attribution
12
- * instead of a late `undefined.maybeCompact is not a function`.
13
- */
14
-
15
- import type {
16
- ContextWindowCompactOptions,
17
- ContextWindowManager,
18
- ContextWindowResult,
19
- } from "../../../context/window-manager.js";
20
- import type { Message } from "../../../providers/types.js";
21
- import {
22
- type CompactionArgs,
23
- type CompactionResult,
24
- PluginExecutionError,
25
- type TurnContext,
26
- } from "../../types.js";
27
-
28
- /**
29
- * Name under which the default plugin registers. Exposed so tests and later
30
- * plugins can assert registration order or override the default via
31
- * composition.
32
- */
33
- export const DEFAULT_COMPACTION_PLUGIN_NAME = "default-compaction";
34
-
35
- /**
36
- * Read `contextWindowManager` off the turn context. Throws
37
- * {@link PluginExecutionError} when absent so the failure attributes cleanly
38
- * to the default plugin instead of manifesting as a later NPE.
39
- */
40
- function extractManager(ctx: TurnContext): ContextWindowManager {
41
- const manager = ctx.contextWindowManager;
42
- if (
43
- manager == null ||
44
- typeof manager !== "object" ||
45
- typeof (manager as { maybeCompact?: unknown }).maybeCompact !== "function"
46
- ) {
47
- throw new PluginExecutionError(
48
- "default-compaction: ctx.contextWindowManager is missing — orchestrator must attach it before invoking compaction",
49
- DEFAULT_COMPACTION_PLUGIN_NAME,
50
- );
51
- }
52
- return manager;
53
- }
54
-
55
- /**
56
- * Run compaction for the turn: reads the context window manager off the turn
57
- * context and returns the (possibly summarized) message history from
58
- * `maybeCompact`.
59
- */
60
- export async function defaultCompactionTerminal(
61
- args: CompactionArgs,
62
- ctx: TurnContext,
63
- ): Promise<CompactionResult> {
64
- const manager = extractManager(ctx);
65
- const messages = args.messages as Message[];
66
- const options = args.options as ContextWindowCompactOptions | undefined;
67
- const result: ContextWindowResult = await manager.maybeCompact(
68
- messages,
69
- args.signal,
70
- options,
71
- );
72
- return result;
73
- }
@@ -1,22 +0,0 @@
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;
@@ -1,106 +0,0 @@
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
- }
@@ -1,15 +0,0 @@
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
- }
@@ -1,17 +0,0 @@
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;
@@ -1,45 +0,0 @@
1
- /**
2
- * Default `llmCall` plugin — a passthrough that declares the pipeline
3
- * surface and yields to downstream middleware.
4
- *
5
- * The plugin system wraps every LLM request in the `llmCall` pipeline. The
6
- * actual call to {@link Provider.sendMessage} lives in the `runPipeline`
7
- * terminal at the call site (`agent/loop.ts`); this default's only job is to
8
- * contribute the manifest (`provides.llmCall: "v1"`) so other plugins can
9
- * negotiate against the pipeline surface.
10
- *
11
- * This plugin registers at module load — before user plugins are loaded by
12
- * `bootstrapPlugins()` — so it sits at the outermost layer in
13
- * `composeMiddleware`'s onion ordering. To keep user-registered middleware
14
- * reachable, the middleware forwards unconditionally via `next(args)`.
15
- *
16
- * Registered from `daemon/external-plugins-bootstrap.ts` via a side-effect
17
- * import so the plugin is present in the registry before
18
- * {@link bootstrapPlugins} walks it.
19
- *
20
- * Design doc: `.private/plans/agent-plugin-system.md` (PR 15).
21
- */
22
-
23
- import { type Plugin } from "../../types.js";
24
- import llmCall from "./middlewares/llmCall.js";
25
- import pkg from "./package.json" with { type: "json" };
26
-
27
- /**
28
- * The default LLM-call plugin. Its `llmCall` middleware is a passthrough that
29
- * forwards to `next(args)` unchanged so any user-registered middleware
30
- * (registered later, inner in the onion) still runs and the terminal at the
31
- * call site performs the actual `provider.sendMessage(...)` call.
32
- *
33
- * Manifest declares `provides.llmCall: "v1"` so other plugins can negotiate
34
- * against the pipeline surface and `requires.pluginRuntime: "v1"` to satisfy
35
- * the registry's mandatory capability check.
36
- */
37
- export const defaultLlmCallPlugin: Plugin = {
38
- manifest: {
39
- name: pkg.name,
40
- version: pkg.version,
41
- },
42
- middleware: {
43
- llmCall,
44
- },
45
- };
@@ -1,17 +0,0 @@
1
- import type { MemoryArgs, MemoryResult, Middleware } from "../../../types.js";
2
-
3
- /**
4
- * Passthrough middleware for the `memoryRetrieval` pipeline.
5
- *
6
- * Keeping a real middleware registered (rather than an empty list) makes the
7
- * pipeline observable in `plugin.pipeline` logs with a non-empty `chain` field
8
- * and lets third-party plugins rely on the default slot being present even
9
- * when nothing is overriding it. The work happens in the terminal supplied by
10
- * the agent loop, which calls `runDefaultMemoryRetrieval`.
11
- */
12
- const defaultMemoryRetrievalMiddleware: Middleware<MemoryArgs, MemoryResult> =
13
- async function defaultMemoryRetrieval(args, next) {
14
- return next(args);
15
- };
16
-
17
- export default defaultMemoryRetrievalMiddleware;
@@ -1,15 +0,0 @@
1
- {
2
- "name": "default-memory-retrieval",
3
- "version": "0.0.1",
4
- "description": "First-party default plugin wrapping the assistant's built-in memory-retrieval 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
- }