@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
@@ -5,6 +5,8 @@
5
5
  * without going through the legacy Slack share flow.
6
6
  */
7
7
 
8
+ import { z } from "zod";
9
+
8
10
  import { getApp } from "../../../../memory/app-store.js";
9
11
  import {
10
12
  listConversations,
@@ -29,12 +31,24 @@ const log = getLogger("slack-share");
29
31
  // GET /v1/slack/channels
30
32
  // ---------------------------------------------------------------------------
31
33
 
32
- interface NormalizedChannel {
33
- id: string;
34
- name: string;
35
- type: "channel" | "group" | "dm";
36
- isPrivate: boolean;
37
- }
34
+ const NormalizedChannelSchema = z.object({
35
+ id: z.string(),
36
+ name: z.string(),
37
+ type: z.enum(["channel", "group", "dm"]),
38
+ isPrivate: z.boolean(),
39
+ });
40
+
41
+ type NormalizedChannel = z.infer<typeof NormalizedChannelSchema>;
42
+
43
+ const SlackChannelsListResultSchema = z.object({
44
+ channels: z.array(NormalizedChannelSchema),
45
+ });
46
+
47
+ const SlackShareResultSchema = z.object({
48
+ ok: z.boolean(),
49
+ ts: z.string(),
50
+ channel: z.string(),
51
+ });
38
52
 
39
53
  function classifyConversation(
40
54
  conv: SlackConversation,
@@ -205,6 +219,7 @@ export const ROUTES: RouteDefinition[] = [
205
219
  summary: "List Slack channels",
206
220
  description: "List Slack channels, groups, and DMs for the channel picker.",
207
221
  tags: ["integrations"],
222
+ responseBody: SlackChannelsListResultSchema,
208
223
  handler: () => handleListSlackChannels(),
209
224
  },
210
225
  {
@@ -218,6 +233,12 @@ export const ROUTES: RouteDefinition[] = [
218
233
  summary: "Share to Slack channel",
219
234
  description: "Post an app link directly to a Slack channel.",
220
235
  tags: ["integrations"],
236
+ requestBody: z.object({
237
+ appId: z.string().describe("App to share"),
238
+ channelId: z.string().describe("Target Slack channel ID"),
239
+ message: z.string().optional().describe("Optional accompanying message"),
240
+ }),
241
+ responseBody: SlackShareResultSchema,
221
242
  handler: handleShareToSlackChannel,
222
243
  },
223
244
  ];
@@ -16,6 +16,7 @@ import {
16
16
  setTelegramCommands,
17
17
  setTelegramConfig,
18
18
  setupTelegram,
19
+ TelegramConfigResultSchema,
19
20
  } from "../../../daemon/handlers/config-telegram.js";
20
21
  import { ACTOR_PRINCIPALS } from "../../auth/route-policy.js";
21
22
  import { BadRequestError } from "../errors.js";
@@ -87,6 +88,7 @@ export const ROUTES: RouteDefinition[] = [
87
88
  summary: "Get Telegram config",
88
89
  description: "Check current Telegram bot configuration status.",
89
90
  tags: ["integrations"],
91
+ responseBody: TelegramConfigResultSchema,
90
92
  handler: () => handleGetTelegramConfig(),
91
93
  },
92
94
  {
@@ -104,6 +106,7 @@ export const ROUTES: RouteDefinition[] = [
104
106
  requestBody: z.object({
105
107
  botToken: z.string().describe("Telegram bot token"),
106
108
  }),
109
+ responseBody: TelegramConfigResultSchema,
107
110
  },
108
111
  {
109
112
  operationId: "integrations_telegram_config_delete",
@@ -116,6 +119,7 @@ export const ROUTES: RouteDefinition[] = [
116
119
  summary: "Clear Telegram config",
117
120
  description: "Clear credentials and deregister webhook.",
118
121
  tags: ["integrations"],
122
+ responseBody: TelegramConfigResultSchema,
119
123
  handler: () => handleClearTelegramConfig(),
120
124
  },
121
125
  {
@@ -129,6 +133,7 @@ export const ROUTES: RouteDefinition[] = [
129
133
  summary: "Register Telegram commands",
130
134
  description: "Register bot commands with the Telegram API.",
131
135
  tags: ["integrations"],
136
+ responseBody: TelegramConfigResultSchema,
132
137
  handler: handleSetTelegramCommands,
133
138
  },
134
139
  {
@@ -142,6 +147,7 @@ export const ROUTES: RouteDefinition[] = [
142
147
  summary: "Setup Telegram",
143
148
  description: "Composite: set config + register commands.",
144
149
  tags: ["integrations"],
150
+ responseBody: TelegramConfigResultSchema,
145
151
  handler: handleSetupTelegram,
146
152
  },
147
153
  ];
@@ -36,6 +36,41 @@ import { ACTOR_PRINCIPALS } from "../../auth/route-policy.js";
36
36
  import { BadRequestError, InternalError } from "../errors.js";
37
37
  import type { RouteDefinition, RouteHandlerArgs } from "../types.js";
38
38
 
39
+ // ---------------------------------------------------------------------------
40
+ // Response schemas
41
+ // ---------------------------------------------------------------------------
42
+
43
+ const TwilioPhoneNumberSchema = z.object({
44
+ phoneNumber: z.string(),
45
+ friendlyName: z.string(),
46
+ capabilities: z.object({ voice: z.boolean() }),
47
+ });
48
+
49
+ const TwilioConfigResultSchema = z.object({
50
+ success: z.boolean(),
51
+ hasCredentials: z.boolean(),
52
+ accountSid: z.string().optional(),
53
+ phoneNumber: z.string().optional(),
54
+ });
55
+
56
+ const TwilioCredentialsResultSchema = z.object({
57
+ success: z.boolean(),
58
+ hasCredentials: z.boolean(),
59
+ });
60
+
61
+ const TwilioNumbersResultSchema = z.object({
62
+ success: z.boolean(),
63
+ hasCredentials: z.boolean(),
64
+ numbers: z.array(TwilioPhoneNumberSchema),
65
+ });
66
+
67
+ const TwilioNumberMutationResultSchema = z.object({
68
+ success: z.boolean(),
69
+ hasCredentials: z.boolean(),
70
+ phoneNumber: z.string().optional(),
71
+ warning: z.string().optional(),
72
+ });
73
+
39
74
  // ---------------------------------------------------------------------------
40
75
  // Shared helpers
41
76
  // ---------------------------------------------------------------------------
@@ -362,6 +397,7 @@ export const ROUTES: RouteDefinition[] = [
362
397
  summary: "Get Twilio config",
363
398
  description: "Return current Twilio configuration status.",
364
399
  tags: ["integrations"],
400
+ responseBody: TwilioConfigResultSchema,
365
401
  handler: () => handleGetTwilioConfig(),
366
402
  },
367
403
  {
@@ -380,6 +416,7 @@ export const ROUTES: RouteDefinition[] = [
380
416
  accountSid: z.string().describe("Twilio account SID"),
381
417
  authToken: z.string().describe("Twilio auth token"),
382
418
  }),
419
+ responseBody: TwilioCredentialsResultSchema,
383
420
  },
384
421
  {
385
422
  operationId: "integrations_twilio_credentials_delete",
@@ -392,6 +429,7 @@ export const ROUTES: RouteDefinition[] = [
392
429
  summary: "Clear Twilio credentials",
393
430
  description: "Remove stored Twilio credentials.",
394
431
  tags: ["integrations"],
432
+ responseBody: TwilioCredentialsResultSchema,
395
433
  handler: () => handleClearTwilioCredentials(),
396
434
  },
397
435
  {
@@ -405,6 +443,7 @@ export const ROUTES: RouteDefinition[] = [
405
443
  summary: "List Twilio numbers",
406
444
  description: "List phone numbers on the Twilio account.",
407
445
  tags: ["integrations"],
446
+ responseBody: TwilioNumbersResultSchema,
408
447
  handler: () => handleListTwilioNumbers(),
409
448
  },
410
449
  {
@@ -418,6 +457,7 @@ export const ROUTES: RouteDefinition[] = [
418
457
  summary: "Provision Twilio number",
419
458
  description: "Search for and provision a new phone number.",
420
459
  tags: ["integrations"],
460
+ responseBody: TwilioNumberMutationResultSchema,
421
461
  handler: handleProvisionTwilioNumber,
422
462
  },
423
463
  {
@@ -431,6 +471,7 @@ export const ROUTES: RouteDefinition[] = [
431
471
  summary: "Assign Twilio number",
432
472
  description: "Assign an existing phone number to this assistant.",
433
473
  tags: ["integrations"],
474
+ responseBody: TwilioNumberMutationResultSchema,
434
475
  handler: handleAssignTwilioNumber,
435
476
  },
436
477
  {
@@ -444,6 +485,7 @@ export const ROUTES: RouteDefinition[] = [
444
485
  summary: "Release Twilio number",
445
486
  description: "Release a phone number back to Twilio.",
446
487
  tags: ["integrations"],
488
+ responseBody: TwilioNumberMutationResultSchema,
447
489
  handler: handleReleaseTwilioNumber,
448
490
  },
449
491
  ];
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Internal telemetry routes — receive operational signals forwarded from the
3
+ * gateway over the internal (service-token) transport.
4
+ *
5
+ * POST /v1/internal/telemetry/auth-fallback — record aggregated counts of
6
+ * requests served via the legacy loopback auth fallback. The gateway counts
7
+ * fallbacks in memory and flushes them here per window; the usage telemetry
8
+ * reporter ships the persisted rows to the platform.
9
+ */
10
+
11
+ import { z } from "zod";
12
+
13
+ import {
14
+ type AuthFallbackCount,
15
+ recordAuthFallbackCounts,
16
+ } from "../../memory/auth-fallback-events-store.js";
17
+ import { getLogger } from "../../util/logger.js";
18
+ import { GATEWAY_PRINCIPALS } from "../auth/route-policy.js";
19
+ import { BadRequestError } from "./errors.js";
20
+ import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
21
+
22
+ const log = getLogger("internal-telemetry-routes");
23
+
24
+ const authFallbackBody = z.object({
25
+ window_start: z.number().int().nonnegative(),
26
+ window_end: z.number().int().nonnegative(),
27
+ counts: z
28
+ .array(
29
+ z.object({
30
+ guard: z.string().min(1),
31
+ path: z.string().min(1),
32
+ failure_kind: z.string().min(1),
33
+ count: z.number().int().positive(),
34
+ }),
35
+ )
36
+ .min(1),
37
+ });
38
+
39
+ function handleRecordAuthFallback({ body }: RouteHandlerArgs) {
40
+ const parsed = authFallbackBody.safeParse(body);
41
+ if (!parsed.success) {
42
+ throw new BadRequestError(
43
+ `Invalid auth-fallback payload: ${parsed.error.message}`,
44
+ );
45
+ }
46
+ const { window_start, window_end, counts } = parsed.data;
47
+ const mapped: AuthFallbackCount[] = counts.map((c) => ({
48
+ guard: c.guard,
49
+ path: c.path,
50
+ failureKind: c.failure_kind,
51
+ count: c.count,
52
+ }));
53
+
54
+ const recorded = recordAuthFallbackCounts(window_start, window_end, mapped);
55
+ if (recorded === 0) {
56
+ // collectUsageData disabled — counts dropped to honor the opt-out.
57
+ return { skipped: true };
58
+ }
59
+ log.debug({ recorded }, "Recorded auth-fallback counts");
60
+ return { recorded };
61
+ }
62
+
63
+ export const ROUTES: RouteDefinition[] = [
64
+ {
65
+ operationId: "internal_telemetry_auth_fallback",
66
+ endpoint: "internal/telemetry/auth-fallback",
67
+ method: "POST",
68
+ policy: {
69
+ requiredScopes: ["internal.write"],
70
+ allowedPrincipalTypes: GATEWAY_PRINCIPALS,
71
+ },
72
+ summary: "Record auth-fallback counts",
73
+ description:
74
+ "Receives aggregated legacy-loopback auth-fallback counts forwarded by " +
75
+ "the gateway and persists them for telemetry reporting.",
76
+ tags: ["internal", "telemetry"],
77
+ requestBody: authFallbackBody,
78
+ responseBody: z.union([
79
+ z.object({ recorded: z.number().int().nonnegative() }),
80
+ z.object({
81
+ skipped: z
82
+ .literal(true)
83
+ .describe("Counts dropped because usage data collection is disabled"),
84
+ }),
85
+ ]),
86
+ handler: handleRecordAuthFallback,
87
+ },
88
+ ];
@@ -508,6 +508,10 @@ export const ROUTES: RouteDefinition[] = [
508
508
  "Export audit records, assistant logs, and config as a tar.gz archive.",
509
509
  tags: ["export"],
510
510
  requestBody: exportRequestBody,
511
+ responseBody: {
512
+ contentType: "application/gzip",
513
+ schema: { type: "string", format: "binary" },
514
+ },
511
515
  responseHeaders: {
512
516
  "Content-Type": "application/gzip",
513
517
  "Content-Disposition": 'attachment; filename="logs.tar.gz"',
@@ -532,6 +536,10 @@ export const ROUTES: RouteDefinition[] = [
532
536
  "Alias for /v1/export. Export audit records, assistant logs, and config as a tar.gz archive.",
533
537
  tags: ["export"],
534
538
  requestBody: exportRequestBody,
539
+ responseBody: {
540
+ contentType: "application/gzip",
541
+ schema: { type: "string", format: "binary" },
542
+ },
535
543
  responseHeaders: {
536
544
  "Content-Type": "application/gzip",
537
545
  "Content-Disposition": 'attachment; filename="logs.tar.gz"',
@@ -210,14 +210,20 @@ async function handleGetConceptPage({
210
210
 
211
211
  const MemoryV2ListConceptPagesParams = z.object({}).strict();
212
212
 
213
- export type MemoryV2ListConceptPagesResult = {
214
- pages: Array<{
215
- slug: string;
216
- bodyBytes: number;
217
- edgeCount: number;
218
- updatedAtMs: number;
219
- }>;
220
- };
213
+ export const MemoryV2ListConceptPagesResultSchema = z.object({
214
+ pages: z.array(
215
+ z.object({
216
+ slug: z.string(),
217
+ bodyBytes: z.number(),
218
+ edgeCount: z.number(),
219
+ updatedAtMs: z.number(),
220
+ }),
221
+ ),
222
+ });
223
+
224
+ export type MemoryV2ListConceptPagesResult = z.infer<
225
+ typeof MemoryV2ListConceptPagesResultSchema
226
+ >;
221
227
 
222
228
  async function handleListConceptPages({
223
229
  body = {},
@@ -732,6 +738,7 @@ export const ROUTES: RouteDefinition[] = [
732
738
  "Returns slugs, body sizes, edge counts, and last-modified timestamps for every concept page on disk. Read-only; used by the desktop About → Memories surface to render a browse-able list.",
733
739
  tags: ["memory"],
734
740
  requestBody: MemoryV2ListConceptPagesParams,
741
+ responseBody: MemoryV2ListConceptPagesResultSchema,
735
742
  },
736
743
  {
737
744
  operationId: "memory_v2_reembed_skills",
@@ -18,17 +18,29 @@
18
18
  import { writeFile } from "node:fs/promises";
19
19
  import { join } from "node:path";
20
20
 
21
+ import { z } from "zod";
22
+
21
23
  import { getPageIndex } from "../../memory/v2/page-index.js";
22
- import { loadCore } from "../../memory/v3/core.js";
23
- import { computeV3Health, renderV3Health } from "../../memory/v3/health.js";
24
- import { type LeafRef, reconcileTree } from "../../memory/v3/reconcile.js";
25
- import { invalidateLanes } from "../../memory/v3/shadow-plugin.js";
24
+ import { loadCore } from "../../plugins/defaults/memory-v3-shadow/core.js";
25
+ import {
26
+ computeV3Health,
27
+ renderV3Health,
28
+ } from "../../plugins/defaults/memory-v3-shadow/health.js";
29
+ import {
30
+ type LeafRef,
31
+ reconcileTree,
32
+ } from "../../plugins/defaults/memory-v3-shadow/reconcile.js";
33
+ import { invalidateLanes } from "../../plugins/defaults/memory-v3-shadow/shadow-plugin.js";
26
34
  import {
27
35
  coreSlugs,
28
36
  loadLeafTree,
29
37
  resolveDataDir,
30
- } from "../../memory/v3/tree.js";
31
- import type { LeafPath, LeafTree, Slug } from "../../memory/v3/types.js";
38
+ } from "../../plugins/defaults/memory-v3-shadow/tree.js";
39
+ import type {
40
+ LeafPath,
41
+ LeafTree,
42
+ Slug,
43
+ } from "../../plugins/defaults/memory-v3-shadow/types.js";
32
44
  import { getLogger } from "../../util/logger.js";
33
45
  import { getWorkspaceDir } from "../../util/platform.js";
34
46
  import { ACTOR_PRINCIPALS, type RoutePolicy } from "../auth/route-policy.js";
@@ -88,18 +100,19 @@ async function loadTreeAndSlugs(deps?: MemoryV3Deps): Promise<{
88
100
  // health
89
101
  // ---------------------------------------------------------------------------
90
102
 
91
- export interface MemoryV3HealthResult {
103
+ const MemoryV3HealthResultSchema = z.object({
92
104
  /** Pre-rendered, human-readable report. Empty string when all-green. */
93
- rendered: string;
105
+ rendered: z.string(),
94
106
  /** The structural counts, for `--json` consumers. */
95
- counts: {
96
- unassigned: number;
97
- danglingRefs: number;
98
- novelClusters: number;
99
- oversizedLeaves: number;
100
- tinyLeaves: number;
101
- };
102
- }
107
+ counts: z.object({
108
+ unassigned: z.number(),
109
+ danglingRefs: z.number(),
110
+ novelClusters: z.number(),
111
+ oversizedLeaves: z.number(),
112
+ tinyLeaves: z.number(),
113
+ }),
114
+ });
115
+ export type MemoryV3HealthResult = z.infer<typeof MemoryV3HealthResultSchema>;
103
116
 
104
117
  export async function handleMemoryV3Health(
105
118
  deps?: MemoryV3Deps,
@@ -123,26 +136,28 @@ export async function handleMemoryV3Health(
123
136
  // set-core
124
137
  // ---------------------------------------------------------------------------
125
138
 
126
- export interface MemoryV3SetCoreBody {
139
+ const MemoryV3SetCoreBodySchema = z.object({
127
140
  /** Leaves to add to the always-on core set. */
128
- add?: LeafPath[];
141
+ add: z.array(z.string()).optional(),
129
142
  /** Leaves to remove from the always-on core set. */
130
- remove?: LeafPath[];
143
+ remove: z.array(z.string()).optional(),
131
144
  /**
132
145
  * When true, persist the new core to `core.json` and invalidate the lanes.
133
146
  * When false (default), compute the preview WITHOUT writing.
134
147
  */
135
- write?: boolean;
136
- }
148
+ write: z.boolean().optional(),
149
+ });
150
+ export type MemoryV3SetCoreBody = z.infer<typeof MemoryV3SetCoreBodySchema>;
137
151
 
138
- export interface MemoryV3SetCoreResult {
152
+ const MemoryV3SetCoreResultSchema = z.object({
139
153
  /** The core leaf set that would result (or did result, when `write`). */
140
- nextCore: LeafPath[];
154
+ nextCore: z.array(z.string()),
141
155
  /** Number of unique page slugs the new core set pins always-on. */
142
- alwaysOnPageCount: number;
156
+ alwaysOnPageCount: z.number(),
143
157
  /** Whether `core.json` was written. */
144
- written: boolean;
145
- }
158
+ written: z.boolean(),
159
+ });
160
+ export type MemoryV3SetCoreResult = z.infer<typeof MemoryV3SetCoreResultSchema>;
146
161
 
147
162
  /** Wire-format error code for a `set-core` add referencing an unknown leaf. */
148
163
  export const MEMORY_V3_UNKNOWN_LEAF_CODE = "MEMORY_V3_UNKNOWN_LEAF";
@@ -206,11 +221,20 @@ export async function handleMemoryV3SetCore(
206
221
  // reconcile
207
222
  // ---------------------------------------------------------------------------
208
223
 
209
- export interface MemoryV3ReconcileResult {
210
- renames: Array<{ id?: string; oldPath: LeafPath; newPath: LeafPath }>;
211
- deleted: LeafPath[];
212
- prunedCore: LeafPath[];
213
- }
224
+ const MemoryV3ReconcileResultSchema = z.object({
225
+ renames: z.array(
226
+ z.object({
227
+ id: z.string().optional(),
228
+ oldPath: z.string(),
229
+ newPath: z.string(),
230
+ }),
231
+ ),
232
+ deleted: z.array(z.string()),
233
+ prunedCore: z.array(z.string()),
234
+ });
235
+ export type MemoryV3ReconcileResult = z.infer<
236
+ typeof MemoryV3ReconcileResultSchema
237
+ >;
214
238
 
215
239
  /**
216
240
  * Reconcile page + core references against the live on-disk tree.
@@ -253,9 +277,12 @@ async function loadPrevLeaves(dataDir: string): Promise<LeafRef[]> {
253
277
  // rebuild-index
254
278
  // ---------------------------------------------------------------------------
255
279
 
256
- export interface MemoryV3RebuildIndexResult {
257
- ok: true;
258
- }
280
+ const MemoryV3RebuildIndexResultSchema = z.object({
281
+ ok: z.literal(true),
282
+ });
283
+ export type MemoryV3RebuildIndexResult = z.infer<
284
+ typeof MemoryV3RebuildIndexResultSchema
285
+ >;
259
286
 
260
287
  /**
261
288
  * Invalidate the v3 shadow lanes so the next turn rebuilds the tree/needle
@@ -299,6 +326,7 @@ export const ROUTES: RouteDefinition[] = [
299
326
  handler: () => handleMemoryV3Health(),
300
327
  summary: "Print the v3 structural health report (read-only)",
301
328
  tags: ["memory"],
329
+ responseBody: MemoryV3HealthResultSchema,
302
330
  },
303
331
  {
304
332
  operationId: "memory_v3_set_core",
@@ -317,6 +345,8 @@ export const ROUTES: RouteDefinition[] = [
317
345
  },
318
346
  summary: "Add/remove always-on core leaves (validates + previews cost)",
319
347
  tags: ["memory"],
348
+ requestBody: MemoryV3SetCoreBodySchema,
349
+ responseBody: MemoryV3SetCoreResultSchema,
320
350
  },
321
351
  {
322
352
  operationId: "memory_v3_reconcile",
@@ -327,6 +357,7 @@ export const ROUTES: RouteDefinition[] = [
327
357
  summary:
328
358
  "v1 convergence/prune pass over page+core refs (no rename detection without a prior snapshot)",
329
359
  tags: ["memory"],
360
+ responseBody: MemoryV3ReconcileResultSchema,
330
361
  },
331
362
  {
332
363
  operationId: "memory_v3_rebuild_index",
@@ -336,5 +367,6 @@ export const ROUTES: RouteDefinition[] = [
336
367
  handler: () => handleMemoryV3RebuildIndex(),
337
368
  summary: "Invalidate the v3 lanes so the next turn rebuilds",
338
369
  tags: ["memory"],
370
+ responseBody: MemoryV3RebuildIndexResultSchema,
339
371
  },
340
372
  ];