@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
@@ -6,6 +6,8 @@
6
6
  * bearer-token authenticated via the standard runtime auth middleware.
7
7
  */
8
8
 
9
+ import { z } from "zod";
10
+
9
11
  import { orchestrateOAuthConnect } from "../../oauth/connect-orchestrator.js";
10
12
  import {
11
13
  deleteApp,
@@ -22,11 +24,8 @@ import {
22
24
  } from "../../oauth/oauth-store.js";
23
25
  import { serializeProviderSummary } from "../../oauth/provider-serializer.js";
24
26
  import { ACTOR_PRINCIPALS } from "../auth/route-policy.js";
25
- import {
26
- BadRequestError,
27
- InternalError,
28
- NotFoundError,
29
- } from "./errors.js";
27
+ import { BadRequestError, InternalError, NotFoundError } from "./errors.js";
28
+ import { oauthProviderSummarySchema } from "./oauth-providers.js";
30
29
  import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
31
30
 
32
31
  function parseGrantedScopes(
@@ -131,17 +130,14 @@ async function handleUpsertApp({ body = {} }: RouteHandlerArgs) {
131
130
  const clientId = b.client_id as string | undefined;
132
131
 
133
132
  if (!providerKey || !clientId) {
134
- throw new BadRequestError(
135
- "provider_key and client_id are required",
136
- );
133
+ throw new BadRequestError("provider_key and client_id are required");
137
134
  }
138
135
 
139
136
  const clientSecretOpts = b.client_secret
140
137
  ? { clientSecretValue: b.client_secret as string }
141
138
  : b.client_secret_credential_path
142
139
  ? {
143
- clientSecretCredentialPath:
144
- b.client_secret_credential_path as string,
140
+ clientSecretCredentialPath: b.client_secret_credential_path as string,
145
141
  }
146
142
  : undefined;
147
143
 
@@ -297,6 +293,38 @@ async function handleConnectApp({ pathParams = {}, body }: RouteHandlerArgs) {
297
293
  return { ok: true };
298
294
  }
299
295
 
296
+ // ---------------------------------------------------------------------------
297
+ // Schemas
298
+ // ---------------------------------------------------------------------------
299
+
300
+ /** Custom OAuth app registration (snake_case wire shape from `formatAppRow`). */
301
+ const oauthAppSchema = z.object({
302
+ id: z.string(),
303
+ provider_key: z.string(),
304
+ client_id: z.string(),
305
+ created_at: z.number(),
306
+ updated_at: z.number(),
307
+ });
308
+
309
+ /** OAuth connection linked to a custom OAuth app. */
310
+ const oauthAppConnectionSchema = z.object({
311
+ id: z.string(),
312
+ provider_key: z.string(),
313
+ account_info: z.string().nullable(),
314
+ granted_scopes: z.array(z.string()),
315
+ status: z.string(),
316
+ has_refresh_token: z.boolean(),
317
+ expires_at: z.number().nullable(),
318
+ created_at: z.number(),
319
+ updated_at: z.number(),
320
+ });
321
+
322
+ const oauthAppCredentialsSchema = z.object({
323
+ provider_key: z.string(),
324
+ client_id: z.string(),
325
+ client_secret: z.string(),
326
+ });
327
+
300
328
  // ---------------------------------------------------------------------------
301
329
  // Route definitions
302
330
  // ---------------------------------------------------------------------------
@@ -321,6 +349,10 @@ export const ROUTES: RouteDefinition[] = [
321
349
  description: "OAuth provider key to filter by",
322
350
  },
323
351
  ],
352
+ responseBody: z.object({
353
+ provider: oauthProviderSummarySchema.nullable(),
354
+ apps: z.array(oauthAppSchema),
355
+ }),
324
356
  handler: handleListApps,
325
357
  },
326
358
  {
@@ -352,6 +384,7 @@ export const ROUTES: RouteDefinition[] = [
352
384
  description: "OAuth client ID (requires provider)",
353
385
  },
354
386
  ],
387
+ responseBody: z.object({ app: oauthAppSchema }),
355
388
  handler: handleGetApp,
356
389
  },
357
390
  {
@@ -366,6 +399,13 @@ export const ROUTES: RouteDefinition[] = [
366
399
  description:
367
400
  "Create or return an existing OAuth app registration. Updates client secret if provided.",
368
401
  tags: ["oauth"],
402
+ requestBody: z.object({
403
+ provider_key: z.string(),
404
+ client_id: z.string(),
405
+ client_secret: z.string().optional(),
406
+ client_secret_credential_path: z.string().optional(),
407
+ }),
408
+ responseBody: z.object({ app: oauthAppSchema }),
369
409
  handler: handleUpsertApp,
370
410
  },
371
411
  {
@@ -379,6 +419,8 @@ export const ROUTES: RouteDefinition[] = [
379
419
  summary: "Create OAuth app",
380
420
  description: "Register a new OAuth app with client credentials.",
381
421
  tags: ["oauth"],
422
+ requestBody: oauthAppCredentialsSchema,
423
+ responseBody: z.object({ app: oauthAppSchema }),
382
424
  responseStatus: "201",
383
425
  handler: handleCreateApp,
384
426
  },
@@ -391,9 +433,9 @@ export const ROUTES: RouteDefinition[] = [
391
433
  allowedPrincipalTypes: ACTOR_PRINCIPALS,
392
434
  },
393
435
  summary: "Delete OAuth app",
394
- description:
395
- "Delete an OAuth app and disconnect all its connections.",
436
+ description: "Delete an OAuth app and disconnect all its connections.",
396
437
  tags: ["oauth"],
438
+ responseBody: z.object({ ok: z.boolean() }),
397
439
  handler: handleDeleteApp,
398
440
  },
399
441
  {
@@ -407,6 +449,9 @@ export const ROUTES: RouteDefinition[] = [
407
449
  summary: "List OAuth connections",
408
450
  description: "List connections for an OAuth app.",
409
451
  tags: ["oauth"],
452
+ responseBody: z.object({
453
+ connections: z.array(oauthAppConnectionSchema),
454
+ }),
410
455
  handler: handleListConnections,
411
456
  },
412
457
  {
@@ -420,6 +465,7 @@ export const ROUTES: RouteDefinition[] = [
420
465
  summary: "Disconnect OAuth connection",
421
466
  description: "Disconnect a single OAuth connection.",
422
467
  tags: ["oauth"],
468
+ responseBody: z.object({ ok: z.boolean() }),
423
469
  handler: handleDeleteConnection,
424
470
  },
425
471
  {
@@ -433,6 +479,14 @@ export const ROUTES: RouteDefinition[] = [
433
479
  summary: "Start OAuth connect",
434
480
  description: "Start an OAuth connect flow for an app.",
435
481
  tags: ["oauth"],
482
+ requestBody: z.object({
483
+ scopes: z.array(z.string()).optional(),
484
+ callback_transport: z.enum(["loopback", "gateway"]).optional(),
485
+ }),
486
+ responseBody: z.union([
487
+ z.object({ auth_url: z.string(), state: z.string() }),
488
+ z.object({ ok: z.literal(true) }),
489
+ ]),
436
490
  handler: handleConnectApp,
437
491
  },
438
492
  ];
@@ -6,6 +6,8 @@
6
6
  * the standard runtime auth middleware.
7
7
  */
8
8
 
9
+ import { z } from "zod";
10
+
9
11
  import { loadConfig } from "../../config/loader.js";
10
12
  import { getOAuthCallbackUrl } from "../../inbound/public-ingress-urls.js";
11
13
  import {
@@ -220,7 +222,8 @@ function handleUpdateProvider({
220
222
  if (b.default_scopes !== undefined) params.defaultScopes = b.default_scopes;
221
223
  if (b.available_scopes !== undefined)
222
224
  params.availableScopes = b.available_scopes;
223
- if (b.scope_separator !== undefined) params.scopeSeparator = b.scope_separator;
225
+ if (b.scope_separator !== undefined)
226
+ params.scopeSeparator = b.scope_separator;
224
227
  if (b.token_endpoint_auth_method !== undefined)
225
228
  params.tokenEndpointAuthMethod = b.token_endpoint_auth_method;
226
229
  if (b.token_exchange_body_format !== undefined)
@@ -245,13 +248,15 @@ function handleUpdateProvider({
245
248
  params.injectionTemplates = b.injection_templates;
246
249
  if (b.app_type !== undefined) params.appType = b.app_type;
247
250
  if (b.identity_url !== undefined) params.identityUrl = b.identity_url;
248
- if (b.identity_method !== undefined) params.identityMethod = b.identity_method;
251
+ if (b.identity_method !== undefined)
252
+ params.identityMethod = b.identity_method;
249
253
  if (b.identity_headers !== undefined)
250
254
  params.identityHeaders = b.identity_headers;
251
255
  if (b.identity_body !== undefined) params.identityBody = b.identity_body;
252
256
  if (b.identity_response_paths !== undefined)
253
257
  params.identityResponsePaths = b.identity_response_paths;
254
- if (b.identity_format !== undefined) params.identityFormat = b.identity_format;
258
+ if (b.identity_format !== undefined)
259
+ params.identityFormat = b.identity_format;
255
260
  if (b.identity_ok_field !== undefined)
256
261
  params.identityOkField = b.identity_ok_field;
257
262
  if (b.setup_notes !== undefined) params.setupNotes = b.setup_notes;
@@ -321,6 +326,37 @@ async function handleDeleteProvider({
321
326
  // Route definitions
322
327
  // ---------------------------------------------------------------------------
323
328
 
329
+ /**
330
+ * Lightweight summary projection of an OAuth provider returned by the catalog
331
+ * list endpoint. Mirrors `SerializedProviderSummary` from the provider
332
+ * serializer (snake_case to match the HTTP API convention).
333
+ */
334
+ export const oauthProviderSummarySchema = z.object({
335
+ provider_key: z.string(),
336
+ display_name: z.string().nullable(),
337
+ description: z.string().nullable(),
338
+ dashboard_url: z.string().nullable(),
339
+ client_id_placeholder: z.string().nullable(),
340
+ requires_client_secret: z.boolean(),
341
+ logo_url: z.string().nullable(),
342
+ supports_managed_mode: z.boolean(),
343
+ managed_service_is_paid: z.boolean(),
344
+ feature_flag: z.string().nullable(),
345
+ });
346
+
347
+ /**
348
+ * Response for the single-provider detail endpoint. The `provider` field is the
349
+ * full serialized provider configuration — an open-ended, admin-defined object
350
+ * whose keys depend on the stored row (parsed JSON blobs, identity templates,
351
+ * and forwarded columns), so it is intentionally typed as an open record rather
352
+ * than a closed schema. `oauth_callback_url` is the ingress callback URL the
353
+ * web UI consumes (null when ingress is not configured).
354
+ */
355
+ export const oauthProviderDetailSchema = z.object({
356
+ provider: z.record(z.string(), z.unknown()),
357
+ oauth_callback_url: z.string().nullable(),
358
+ });
359
+
324
360
  export const ROUTES: RouteDefinition[] = [
325
361
  {
326
362
  operationId: "oauth_providers_get",
@@ -331,8 +367,7 @@ export const ROUTES: RouteDefinition[] = [
331
367
  allowedPrincipalTypes: ACTOR_PRINCIPALS,
332
368
  },
333
369
  summary: "List OAuth providers",
334
- description:
335
- "List all registered OAuth providers with optional filtering.",
370
+ description: "List all registered OAuth providers with optional filtering.",
336
371
  tags: ["oauth"],
337
372
  handler: handleListProviders,
338
373
  queryParams: [
@@ -342,6 +377,9 @@ export const ROUTES: RouteDefinition[] = [
342
377
  description: "Filter by managed mode support (true/false)",
343
378
  },
344
379
  ],
380
+ responseBody: z.object({
381
+ providers: z.array(oauthProviderSummarySchema),
382
+ }),
345
383
  },
346
384
  {
347
385
  operationId: "oauth_providers_by_providerKey_get",
@@ -355,6 +393,7 @@ export const ROUTES: RouteDefinition[] = [
355
393
  description: "Get a single OAuth provider by key.",
356
394
  tags: ["oauth"],
357
395
  handler: handleGetProvider,
396
+ responseBody: oauthProviderDetailSchema,
358
397
  },
359
398
  {
360
399
  operationId: "oauth_providers_post",
@@ -14,6 +14,8 @@
14
14
  * registered callback routes for this assistant.
15
15
  */
16
16
 
17
+ import { z } from "zod";
18
+
17
19
  import { isPlatformRemote } from "../../config/env-registry.js";
18
20
  import {
19
21
  registerCallbackRoute,
@@ -47,13 +49,80 @@ const CREDENTIAL_KEYS = {
47
49
  userId: { service: "vellum", field: "platform_user_id" },
48
50
  } as const;
49
51
 
52
+ // ---------------------------------------------------------------------------
53
+ // Schemas
54
+ // ---------------------------------------------------------------------------
55
+
56
+ const VelayTunnelStatusSchema = z.object({
57
+ connected: z.boolean(),
58
+ publicUrl: z.string().nullable(),
59
+ });
60
+
61
+ const PlatformStatusResponseSchema = z.object({
62
+ isPlatform: z.boolean(),
63
+ baseUrl: z.string(),
64
+ assistantId: z.string(),
65
+ hasAssistantApiKey: z.boolean(),
66
+ hasWebhookSecret: z.boolean(),
67
+ available: z.boolean(),
68
+ organizationId: z.string().nullable(),
69
+ userId: z.string().nullable(),
70
+ velayTunnel: VelayTunnelStatusSchema.nullable(),
71
+ });
72
+ type PlatformStatusResponse = z.infer<typeof PlatformStatusResponseSchema>;
73
+
74
+ const PlatformConnectResponseSchema = z.object({
75
+ alreadyConnected: z.boolean().optional(),
76
+ baseUrl: z.string().optional(),
77
+ showPlatformLogin: z.boolean().optional(),
78
+ });
79
+ type PlatformConnectResponse = z.infer<typeof PlatformConnectResponseSchema>;
80
+
81
+ const PlatformDisconnectResponseSchema = z.object({
82
+ disconnected: z.literal(true),
83
+ previousBaseUrl: z.string().nullable(),
84
+ });
85
+ type PlatformDisconnectResponse = z.infer<
86
+ typeof PlatformDisconnectResponseSchema
87
+ >;
88
+
89
+ const CallbackRouteRegisterRequestSchema = z.object({
90
+ path: z.string(),
91
+ type: z.string(),
92
+ });
93
+
94
+ const CallbackRouteRegisterResponseSchema = z.object({
95
+ callbackUrl: z.string(),
96
+ callbackPath: z.string(),
97
+ type: z.string(),
98
+ });
99
+ type CallbackRouteRegisterResponse = z.infer<
100
+ typeof CallbackRouteRegisterResponseSchema
101
+ >;
102
+
103
+ const CallbackRouteSchema = z.object({
104
+ id: z.string(),
105
+ assistant_id: z.string(),
106
+ type: z.string(),
107
+ callback_path: z.string(),
108
+ callback_url: z.string(),
109
+ source_identifier: z.string().nullable(),
110
+ });
111
+
112
+ const CallbackRoutesListResponseSchema = z.object({
113
+ routes: z.array(CallbackRouteSchema),
114
+ });
115
+ type CallbackRoutesListResponse = z.infer<
116
+ typeof CallbackRoutesListResponseSchema
117
+ >;
118
+
50
119
  // ---------------------------------------------------------------------------
51
120
  // Handlers
52
121
  // ---------------------------------------------------------------------------
53
122
 
54
123
  async function handlePlatformStatus(
55
124
  _args: RouteHandlerArgs,
56
- ): Promise<unknown> {
125
+ ): Promise<PlatformStatusResponse> {
57
126
  const [context, velayTunnel] = await Promise.all([
58
127
  resolvePlatformCallbackRegistrationContext(),
59
128
  ipcGetVelayStatus().catch(() => null),
@@ -94,7 +163,7 @@ async function handlePlatformStatus(
94
163
 
95
164
  async function handlePlatformConnect(
96
165
  _args: RouteHandlerArgs,
97
- ): Promise<unknown> {
166
+ ): Promise<PlatformConnectResponse> {
98
167
  // Check if already connected
99
168
  const [existingUrl, existingApiKey] = await Promise.all([
100
169
  getSecureKeyAsync(
@@ -128,7 +197,7 @@ async function handlePlatformConnect(
128
197
 
129
198
  async function handlePlatformDisconnect(
130
199
  _args: RouteHandlerArgs,
131
- ): Promise<unknown> {
200
+ ): Promise<PlatformDisconnectResponse> {
132
201
  // Reject if running inside a platform host
133
202
  if (isPlatformRemote()) {
134
203
  throw new UnprocessableEntityError(
@@ -197,7 +266,7 @@ async function handlePlatformDisconnect(
197
266
 
198
267
  async function handleCallbackRoutesRegister(
199
268
  args: RouteHandlerArgs,
200
- ): Promise<unknown> {
269
+ ): Promise<CallbackRouteRegisterResponse> {
201
270
  const { path, type } = (args.body ?? {}) as {
202
271
  path?: string;
203
272
  type?: string;
@@ -235,7 +304,7 @@ async function handleCallbackRoutesRegister(
235
304
 
236
305
  async function handleCallbackRoutesList(
237
306
  _args: RouteHandlerArgs,
238
- ): Promise<unknown> {
307
+ ): Promise<CallbackRoutesListResponse> {
239
308
  const context = await resolvePlatformCallbackRegistrationContext();
240
309
 
241
310
  if (!context.platformBaseUrl || !context.authHeader) {
@@ -274,6 +343,7 @@ async function handleCallbackRoutesList(
274
343
  type: string;
275
344
  callback_path: string;
276
345
  callback_url: string;
346
+ source_identifier: string | null;
277
347
  }>;
278
348
 
279
349
  return { routes };
@@ -297,6 +367,7 @@ export const ROUTES: RouteDefinition[] = [
297
367
  "Aggregates platform context, credentials, assistant ID, webhook secret, and Velay tunnel status.",
298
368
  tags: ["platform"],
299
369
  handler: handlePlatformStatus,
370
+ responseBody: PlatformStatusResponseSchema,
300
371
  },
301
372
  {
302
373
  operationId: "platform_connect",
@@ -311,6 +382,7 @@ export const ROUTES: RouteDefinition[] = [
311
382
  "Checks existing credentials and emits the show_platform_login signal for connected clients to show a login UI.",
312
383
  tags: ["platform"],
313
384
  handler: handlePlatformConnect,
385
+ responseBody: PlatformConnectResponseSchema,
314
386
  },
315
387
  {
316
388
  operationId: "platform_disconnect",
@@ -325,6 +397,7 @@ export const ROUTES: RouteDefinition[] = [
325
397
  "Deletes stored platform credentials and emits platform_disconnected signal to connected clients.",
326
398
  tags: ["platform"],
327
399
  handler: handlePlatformDisconnect,
400
+ responseBody: PlatformDisconnectResponseSchema,
328
401
  },
329
402
  {
330
403
  operationId: "platform_callback_routes_register",
@@ -339,6 +412,8 @@ export const ROUTES: RouteDefinition[] = [
339
412
  "Registers a callback route with the platform gateway for inbound provider webhooks.",
340
413
  tags: ["platform"],
341
414
  handler: handleCallbackRoutesRegister,
415
+ requestBody: CallbackRouteRegisterRequestSchema,
416
+ responseBody: CallbackRouteRegisterResponseSchema,
342
417
  },
343
418
  {
344
419
  operationId: "platform_callback_routes_list",
@@ -353,5 +428,6 @@ export const ROUTES: RouteDefinition[] = [
353
428
  "Lists all callback routes registered with the platform for this assistant.",
354
429
  tags: ["platform"],
355
430
  handler: handleCallbackRoutesList,
431
+ responseBody: CallbackRoutesListResponseSchema,
356
432
  },
357
433
  ];
@@ -65,8 +65,12 @@ function makeFakeConversation(
65
65
  ...options.result,
66
66
  };
67
67
 
68
+ let processing = options.processing ?? false;
68
69
  const fake = {
69
- processing: options.processing ?? false,
70
+ isProcessing: () => processing,
71
+ setProcessing: (value: boolean) => {
72
+ processing = value;
73
+ },
70
74
  getMessages(): Message[] {
71
75
  if (!returnedAfter && calls === 0) return messagesBefore;
72
76
  return messagesAfter;
@@ -85,9 +89,7 @@ function makeFakeConversation(
85
89
  }
86
90
 
87
91
  function findRoute() {
88
- const route = ROUTES.find(
89
- (r) => r.operationId === "playgroundForceCompact",
90
- );
92
+ const route = ROUTES.find((r) => r.operationId === "playgroundForceCompact");
91
93
  if (!route) throw new Error("force-compact route not registered");
92
94
  return route;
93
95
  }
@@ -35,7 +35,7 @@ export const ROUTES: RouteDefinition[] = [
35
35
  throwConversationNotFound(id);
36
36
  }
37
37
 
38
- if (conversation.processing) {
38
+ if (conversation.isProcessing()) {
39
39
  throw new ConflictError(
40
40
  "Compaction already in progress for this conversation",
41
41
  );
@@ -7,9 +7,9 @@
7
7
  */
8
8
 
9
9
  import type { Conversation } from "../../../daemon/conversation.js";
10
+ import { findConversation } from "../../../daemon/conversation-registry.js";
10
11
  import {
11
12
  destroyActiveConversation,
12
- findConversation,
13
13
  getOrCreateConversation,
14
14
  } from "../../../daemon/conversation-store.js";
15
15
  import {
@@ -23,6 +23,10 @@ const RenameConversationBody = z.object({
23
23
  title: z.string().min(1),
24
24
  });
25
25
 
26
+ const RenameConversationResponse = z.object({
27
+ ok: z.literal(true),
28
+ });
29
+
26
30
  export const ROUTES: RouteDefinition[] = [
27
31
  {
28
32
  operationId: "rename_conversation",
@@ -36,6 +40,7 @@ export const ROUTES: RouteDefinition[] = [
36
40
  description: "Update the display title of a conversation.",
37
41
  tags: ["conversations"],
38
42
  requestBody: RenameConversationBody,
43
+ responseBody: RenameConversationResponse,
39
44
  handler: ({ body, headers }) => {
40
45
  const parsed = RenameConversationBody.safeParse(body);
41
46
  if (!parsed.success) {