@vellumai/assistant 0.8.6 → 0.8.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (891) hide show
  1. package/AGENTS.md +4 -4
  2. package/Dockerfile +1 -0
  3. package/bun.lock +11 -2
  4. package/docker-entrypoint.sh +8 -6
  5. package/docs/plugins.md +63 -28
  6. package/examples/plugins/echo/register.ts +4 -7
  7. package/knip.json +1 -0
  8. package/node_modules/@vellumai/environments/bun.lock +24 -0
  9. package/node_modules/@vellumai/environments/package.json +18 -0
  10. package/node_modules/@vellumai/environments/src/__tests__/package-boundary.test.ts +95 -0
  11. package/node_modules/@vellumai/environments/src/index.ts +11 -0
  12. package/node_modules/@vellumai/environments/src/seeds.ts +73 -0
  13. package/node_modules/@vellumai/environments/src/types.ts +70 -0
  14. package/node_modules/@vellumai/environments/tsconfig.json +20 -0
  15. package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +11 -0
  16. package/node_modules/@vellumai/skill-host-contracts/src/client.ts +3 -4
  17. package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +6 -2
  18. package/openapi.yaml +3735 -353
  19. package/package.json +7 -3
  20. package/scripts/generate-openapi.ts +20 -13
  21. package/src/__tests__/agent-loop-callsite-precedence.test.ts +42 -80
  22. package/src/__tests__/agent-loop-exit-reason.test.ts +240 -39
  23. package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +141 -0
  24. package/src/__tests__/agent-loop-override-profile.test.ts +19 -32
  25. package/src/__tests__/agent-loop-provider-error-recording.test.ts +6 -4
  26. package/src/__tests__/agent-loop-thinking.test.ts +17 -12
  27. package/src/__tests__/agent-loop.test.ts +207 -341
  28. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +4 -2
  29. package/src/__tests__/agent-wake-override-profile.test.ts +22 -40
  30. package/src/__tests__/anthropic-provider.test.ts +201 -55
  31. package/src/__tests__/app-builder-skill-instructions.test.ts +22 -0
  32. package/src/__tests__/app-control-flow.test.ts +5 -0
  33. package/src/__tests__/approval-cascade.test.ts +4 -11
  34. package/src/__tests__/approval-routes-http.test.ts +4 -2
  35. package/src/__tests__/assistant-event.test.ts +15 -0
  36. package/src/__tests__/assistant-feature-flags-integration.test.ts +2 -2
  37. package/src/__tests__/avatar-e2e.test.ts +7 -37
  38. package/src/__tests__/avatar-generator.test.ts +12 -42
  39. package/src/__tests__/avatar-identity-sync.test.ts +28 -3
  40. package/src/__tests__/background-shell-bash.test.ts +3 -7
  41. package/src/__tests__/btw-routes.test.ts +7 -12
  42. package/src/__tests__/call-pointer-messages.test.ts +5 -3
  43. package/src/__tests__/call-site-routing-provider.test.ts +22 -40
  44. package/src/__tests__/catalog-files.test.ts +1 -0
  45. package/src/__tests__/channel-approval-routes.test.ts +48 -20
  46. package/src/__tests__/channel-approvals.test.ts +3 -1
  47. package/src/__tests__/channel-invite-transport.test.ts +1 -5
  48. package/src/__tests__/channel-readiness-routes.test.ts +0 -4
  49. package/src/__tests__/channel-readiness-slack-remote.test.ts +2 -7
  50. package/src/__tests__/channel-retry-sweep.test.ts +71 -79
  51. package/src/__tests__/circuit-breaker-pipeline.test.ts +3 -3
  52. package/src/__tests__/clawhub-files.test.ts +1 -0
  53. package/src/__tests__/compaction-events.test.ts +5 -17
  54. package/src/__tests__/compaction-pipeline.test.ts +1 -1
  55. package/src/__tests__/compaction-timeout-recovery.test.ts +37 -48
  56. package/src/__tests__/compaction-trail-store.test.ts +1 -79
  57. package/src/__tests__/compactor-image-manifest-trust.test.ts +112 -0
  58. package/src/__tests__/computer-use-tools.test.ts +2 -2
  59. package/src/__tests__/config-watcher.test.ts +28 -0
  60. package/src/__tests__/context-search-agent-runner.test.ts +6 -3
  61. package/src/__tests__/context-token-estimator.test.ts +34 -0
  62. package/src/__tests__/context-window-manager-compact-retry.test.ts +291 -0
  63. package/src/__tests__/conversation-abort-tool-results.test.ts +14 -7
  64. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +3 -2
  65. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +12 -27
  66. package/src/__tests__/conversation-agent-loop-overflow.test.ts +430 -90
  67. package/src/__tests__/conversation-agent-loop.test.ts +581 -62
  68. package/src/__tests__/conversation-analysis-routes.test.ts +1 -3
  69. package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -1
  70. package/src/__tests__/conversation-clear-safety.test.ts +20 -10
  71. package/src/__tests__/conversation-confirmation-signals.test.ts +15 -45
  72. package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
  73. package/src/__tests__/conversation-disk-view.test.ts +10 -17
  74. package/src/__tests__/conversation-fork-crud.test.ts +86 -172
  75. package/src/__tests__/conversation-fork-route.test.ts +16 -14
  76. package/src/__tests__/conversation-init.benchmark.test.ts +6 -6
  77. package/src/__tests__/conversation-lifecycle.test.ts +3 -2
  78. package/src/__tests__/conversation-load-history-repair.test.ts +3 -2
  79. package/src/__tests__/conversation-load-history-stripped.test.ts +1 -1
  80. package/src/__tests__/conversation-message-sync-tags.test.ts +3 -4
  81. package/src/__tests__/conversation-pairing.test.ts +34 -4
  82. package/src/__tests__/conversation-pre-run-repair.test.ts +1 -1
  83. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +4 -0
  84. package/src/__tests__/conversation-process-callsite.test.ts +27 -30
  85. package/src/__tests__/conversation-provider-retry-repair.test.ts +53 -44
  86. package/src/__tests__/conversation-queue.test.ts +270 -164
  87. package/src/__tests__/conversation-routes-disk-view.test.ts +3 -2
  88. package/src/__tests__/conversation-routes-guardian-reply.test.ts +2 -2
  89. package/src/__tests__/conversation-routes-slash-commands.test.ts +2 -2
  90. package/src/__tests__/conversation-runtime-assembly.test.ts +20 -22
  91. package/src/__tests__/conversation-runtime-workspace.test.ts +19 -1
  92. package/src/__tests__/conversation-slash-queue.test.ts +37 -31
  93. package/src/__tests__/conversation-slash-unknown.test.ts +13 -15
  94. package/src/__tests__/conversation-speed-override.test.ts +8 -22
  95. package/src/__tests__/conversation-stream-state.test.ts +484 -0
  96. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +6 -15
  97. package/src/__tests__/conversation-surfaces-app-control.test.ts +32 -4
  98. package/src/__tests__/conversation-surfaces-state-update.test.ts +5 -2
  99. package/src/__tests__/conversation-surfaces-table-action.test.ts +6 -15
  100. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +23 -11
  101. package/src/__tests__/conversation-unread-route.test.ts +14 -2
  102. package/src/__tests__/conversation-usage.test.ts +0 -2
  103. package/src/__tests__/conversation-wipe.test.ts +1 -1
  104. package/src/__tests__/conversation-workspace-cache-state.test.ts +3 -1
  105. package/src/__tests__/conversation-workspace-injection.test.ts +48 -22
  106. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +27 -7
  107. package/src/__tests__/credential-execution-tools.test.ts +1 -2
  108. package/src/__tests__/credential-security-invariants.test.ts +0 -1
  109. package/src/__tests__/cross-provider-web-search.test.ts +6 -2
  110. package/src/__tests__/cu-unified-flow.test.ts +26 -1
  111. package/src/__tests__/db-schedule-syntax-migration.test.ts +11 -0
  112. package/src/__tests__/disk-pressure-guard.test.ts +66 -0
  113. package/src/__tests__/disk-pressure-routes.test.ts +9 -2
  114. package/src/__tests__/dm-persistence.test.ts +7 -2
  115. package/src/__tests__/dynamic-page-surface.test.ts +68 -0
  116. package/src/__tests__/edit-propagation.test.ts +1 -2
  117. package/src/__tests__/empty-response-pipeline.test.ts +127 -5
  118. package/src/__tests__/filing-service.test.ts +2 -2
  119. package/src/__tests__/first-greeting.test.ts +55 -14
  120. package/src/__tests__/gemini-inline-media.test.ts +78 -0
  121. package/src/__tests__/gemini-provider.test.ts +351 -28
  122. package/src/__tests__/guardian-routing-state.test.ts +60 -71
  123. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +9 -7
  124. package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
  125. package/src/__tests__/heartbeat-service.test.ts +2 -1
  126. package/src/__tests__/history-repair-hook.test.ts +161 -0
  127. package/src/__tests__/history-repair-observability.test.ts +1 -1
  128. package/src/__tests__/history-repair.test.ts +2 -1
  129. package/src/__tests__/host-app-control-proxy.test.ts +2 -0
  130. package/src/__tests__/host-cu-proxy.test.ts +2 -0
  131. package/src/__tests__/host-file-edit-tool.test.ts +4 -2
  132. package/src/__tests__/host-file-proxy.test.ts +31 -0
  133. package/src/__tests__/host-file-read-tool.test.ts +4 -2
  134. package/src/__tests__/host-file-write-tool.test.ts +9 -3
  135. package/src/__tests__/host-proxy-preactivation.test.ts +53 -14
  136. package/src/__tests__/host-shell-tool.test.ts +9 -4
  137. package/src/__tests__/http-user-message-parity.test.ts +2 -2
  138. package/src/__tests__/identity-intro-cache.test.ts +35 -14
  139. package/src/__tests__/inbound-slack-persistence.test.ts +7 -2
  140. package/src/__tests__/injector-background-turn.test.ts +1 -1
  141. package/src/__tests__/injector-chain.test.ts +1 -1
  142. package/src/__tests__/injector-disk-pressure.test.ts +1 -1
  143. package/src/__tests__/injector-document-comments.test.ts +1 -1
  144. package/src/__tests__/injector-pkb-v2-silenced.test.ts +1 -1
  145. package/src/__tests__/injector-v3-suppression.test.ts +220 -0
  146. package/src/__tests__/list-messages-attachments.test.ts +7 -8
  147. package/src/__tests__/list-messages-hidden-metadata.test.ts +17 -15
  148. package/src/__tests__/list-messages-page-latest.test.ts +0 -1
  149. package/src/__tests__/list-messages-tool-merge.test.ts +36 -6
  150. package/src/__tests__/llm-call-pipeline.test.ts +21 -15
  151. package/src/__tests__/llm-request-log-turn-query.test.ts +42 -86
  152. package/src/__tests__/llm-resolver.test.ts +23 -47
  153. package/src/__tests__/llm-usage-store.test.ts +45 -0
  154. package/src/__tests__/log-export-routes.test.ts +59 -0
  155. package/src/__tests__/managed-skill-lifecycle.test.ts +1 -8
  156. package/src/__tests__/mcp-auth-routes.test.ts +15 -10
  157. package/src/__tests__/mcp-health-check.test.ts +18 -13
  158. package/src/__tests__/memory-retrieval-pipeline.test.ts +1 -1
  159. package/src/__tests__/memory-v2-static-injector.test.ts +1 -1
  160. package/src/__tests__/messaging-send-tool.test.ts +8 -4
  161. package/src/__tests__/migration-export-http.test.ts +12 -12
  162. package/src/__tests__/migration-import-commit-http.test.ts +8 -8
  163. package/src/__tests__/migration-import-preflight-http.test.ts +7 -7
  164. package/src/__tests__/migration-validate-http.test.ts +3 -3
  165. package/src/__tests__/native-web-search.test.ts +14 -20
  166. package/src/__tests__/notification-decision-identity.test.ts +9 -18
  167. package/src/__tests__/notification-decision-recipient-context.test.ts +3 -6
  168. package/src/__tests__/oauth-commands-routes.test.ts +1 -1
  169. package/src/__tests__/onboarding-template-contract.test.ts +10 -0
  170. package/src/__tests__/openai-provider.test.ts +66 -70
  171. package/src/__tests__/openai-responses-provider.test.ts +21 -77
  172. package/src/__tests__/outbound-slack-persistence.test.ts +2 -1
  173. package/src/__tests__/overflow-reduce-pipeline.test.ts +2 -4
  174. package/src/__tests__/parallel-tool.benchmark.test.ts +24 -36
  175. package/src/__tests__/persistence-pipeline.test.ts +15 -26
  176. package/src/__tests__/persistence-secret-redaction.test.ts +2 -1
  177. package/src/__tests__/pipeline-runner.test.ts +2 -3
  178. package/src/__tests__/plugin-bootstrap.test.ts +51 -25
  179. package/src/__tests__/plugin-route-contribution.test.ts +6 -16
  180. package/src/__tests__/plugin-skill-contribution.test.ts +7 -17
  181. package/src/__tests__/plugin-tool-contribution.test.ts +10 -26
  182. package/src/__tests__/plugin-types.test.ts +7 -14
  183. package/src/__tests__/prechat-onboarding-contract.test.ts +23 -0
  184. package/src/__tests__/process-message-background-slack.test.ts +17 -16
  185. package/src/__tests__/process-message-display-content.test.ts +30 -42
  186. package/src/__tests__/provider-commit-message-generator.test.ts +19 -14
  187. package/src/__tests__/provider-error-scenarios.test.ts +7 -6
  188. package/src/__tests__/provider-platform-proxy-integration.test.ts +3 -8
  189. package/src/__tests__/provider-send-message-override-profile.test.ts +9 -25
  190. package/src/__tests__/provider-streaming.benchmark.test.ts +12 -22
  191. package/src/__tests__/provider-usage-tracking.test.ts +0 -6
  192. package/src/__tests__/ratelimit.test.ts +9 -4
  193. package/src/__tests__/relay-server.test.ts +20 -13
  194. package/src/__tests__/retry-openrouter-only-normalization.test.ts +5 -8
  195. package/src/__tests__/retry-thinking-tool-choice.test.ts +10 -13
  196. package/src/__tests__/retry-verbosity-normalization.test.ts +5 -8
  197. package/src/__tests__/runtime-events-sse-reconnect.test.ts +353 -0
  198. package/src/__tests__/schedule-routes.test.ts +80 -10
  199. package/src/__tests__/schedule-store.test.ts +67 -0
  200. package/src/__tests__/schedule-tools.test.ts +125 -0
  201. package/src/__tests__/secret-ingress-http.test.ts +2 -2
  202. package/src/__tests__/secret-prompt-log-hygiene.test.ts +11 -7
  203. package/src/__tests__/secret-prompter-channel-fallback.test.ts +11 -9
  204. package/src/__tests__/secret-response-routing.test.ts +13 -11
  205. package/src/__tests__/send-endpoint-busy.test.ts +2 -1
  206. package/src/__tests__/shell-observability.test.ts +249 -0
  207. package/src/__tests__/skill-feature-flags-integration.test.ts +11 -11
  208. package/src/__tests__/skill-feature-flags.test.ts +6 -6
  209. package/src/__tests__/skill-load-feature-flag.test.ts +10 -10
  210. package/src/__tests__/skills-files-catalog-fallback.test.ts +10 -0
  211. package/src/__tests__/skillssh-files.test.ts +1 -0
  212. package/src/__tests__/starter-task-flow.test.ts +6 -6
  213. package/src/__tests__/strip-memory-injections.test.ts +102 -14
  214. package/src/__tests__/subagent-call-site-routing.test.ts +2 -2
  215. package/src/__tests__/suggestion-routes.test.ts +3 -3
  216. package/src/__tests__/sync-message-contract.test.ts +19 -16
  217. package/src/__tests__/system-prompt.test.ts +54 -0
  218. package/src/__tests__/terminal-tools.test.ts +3 -24
  219. package/src/__tests__/thread-backfill.test.ts +4 -9
  220. package/src/__tests__/title-generate-pipeline.test.ts +1 -1
  221. package/src/__tests__/token-estimate-pipeline.test.ts +2 -4
  222. package/src/__tests__/tool-error-pipeline.test.ts +2 -2
  223. package/src/__tests__/tool-execute-pipeline.test.ts +1 -1
  224. package/src/__tests__/tool-preview-lifecycle.test.ts +13 -11
  225. package/src/__tests__/tool-result-truncate-pipeline.test.ts +9 -12
  226. package/src/__tests__/tool-result-truncation.test.ts +3 -1
  227. package/src/__tests__/tools-audio-read.test.ts +113 -0
  228. package/src/__tests__/turn-boundary-resolution.test.ts +44 -84
  229. package/src/__tests__/turn-events-store.test.ts +11 -7
  230. package/src/__tests__/voice-scoped-grant-consumer.test.ts +8 -6
  231. package/src/__tests__/voice-session-bridge.test.ts +13 -7
  232. package/src/acp/__tests__/prepare-agent-env.test.ts +143 -31
  233. package/src/acp/prepare-agent-env.ts +52 -11
  234. package/src/agent/compaction-circuit.ts +140 -0
  235. package/src/agent/loop.ts +409 -85
  236. package/src/api/README.md +19 -17
  237. package/src/api/constants/tool-execution.ts +21 -0
  238. package/src/api/events/assistant-activity-state.ts +75 -0
  239. package/src/api/events/assistant-outbound-attachment.ts +25 -27
  240. package/src/api/events/assistant-text-delta.ts +6 -8
  241. package/src/api/events/assistant-turn-start.ts +5 -7
  242. package/src/api/events/avatar-updated.ts +24 -0
  243. package/src/api/events/compaction-circuit-closed.ts +26 -0
  244. package/src/api/events/compaction-circuit-open.ts +28 -0
  245. package/src/api/events/confirmation-request.ts +114 -0
  246. package/src/api/events/contact-request.ts +33 -0
  247. package/src/api/events/conversation-error.ts +77 -0
  248. package/src/api/events/conversation-list-invalidated.ts +38 -0
  249. package/src/api/events/conversation-title-updated.ts +24 -0
  250. package/src/api/events/disk-pressure-status-changed.ts +61 -0
  251. package/src/api/events/document-comment-created.ts +24 -28
  252. package/src/api/events/document-comment-deleted.ts +6 -8
  253. package/src/api/events/document-comment-reopened.ts +6 -8
  254. package/src/api/events/document-comment-resolved.ts +8 -10
  255. package/src/api/events/document-editor-update.ts +27 -0
  256. package/src/api/events/error.ts +32 -0
  257. package/src/api/events/generation-cancelled.ts +4 -6
  258. package/src/api/events/generation-handoff.ts +13 -15
  259. package/src/api/events/home-feed-updated.ts +26 -0
  260. package/src/api/events/identity-changed.ts +32 -0
  261. package/src/api/events/interaction-resolved.ts +50 -0
  262. package/src/api/events/message-complete.ts +10 -12
  263. package/src/api/events/message-dequeued.ts +21 -0
  264. package/src/api/events/message-queued-deleted.ts +23 -0
  265. package/src/api/events/message-queued.ts +22 -0
  266. package/src/api/events/message-request-complete.ts +29 -0
  267. package/src/api/events/navigate-settings.ts +20 -0
  268. package/src/api/events/notification-intent.ts +33 -0
  269. package/src/api/events/open-url.ts +6 -8
  270. package/src/api/events/question-request.ts +67 -0
  271. package/src/api/events/relationship-state-updated.ts +4 -6
  272. package/src/api/events/secret-request.ts +42 -0
  273. package/src/api/events/subagent-event.ts +79 -0
  274. package/src/api/events/subagent-spawned.ts +40 -0
  275. package/src/api/events/subagent-status-changed.ts +65 -0
  276. package/src/api/events/sync-changed.ts +29 -0
  277. package/src/api/events/tool-result.ts +129 -0
  278. package/src/api/events/tool-use-start.ts +8 -10
  279. package/src/api/events/turn-profile-auto-routed.ts +28 -0
  280. package/src/api/events/ui-surface-complete.ts +30 -0
  281. package/src/api/events/ui-surface-dismiss.ts +22 -0
  282. package/src/api/events/ui-surface-show.ts +67 -0
  283. package/src/api/events/ui-surface-update.ts +26 -0
  284. package/src/api/events/usage-update.ts +34 -0
  285. package/src/api/events/user-message-echo.ts +35 -0
  286. package/src/api/index.ts +354 -0
  287. package/src/api/requests/dictation.ts +45 -0
  288. package/src/api/responses/disk-pressure-status.ts +26 -0
  289. package/src/api/responses/home.ts +217 -0
  290. package/src/api/responses/llm-context-response.ts +2 -0
  291. package/src/api/responses/memory-v3-selection-log.ts +50 -0
  292. package/src/api/responses/subagent-detail.ts +48 -0
  293. package/src/approvals/guardian-decision-primitive.ts +7 -15
  294. package/src/approvals/guardian-request-resolvers.ts +6 -9
  295. package/src/avatar/__tests__/avatar-manifest.test.ts +236 -0
  296. package/src/avatar/__tests__/avatar-store.test.ts +193 -0
  297. package/src/avatar/avatar-manifest.ts +195 -0
  298. package/src/avatar/avatar-store.ts +113 -0
  299. package/src/avatar/traits-png-sync.ts +8 -2
  300. package/src/background-wake/next-wake.test.ts +31 -1
  301. package/src/background-wake/next-wake.ts +4 -1
  302. package/src/calls/call-conversation-messages.ts +6 -4
  303. package/src/calls/guardian-action-sweep.ts +6 -4
  304. package/src/calls/relay-server.ts +12 -8
  305. package/src/calls/voice-session-bridge.ts +13 -27
  306. package/src/cli/commands/__tests__/memory-v3.test.ts +245 -0
  307. package/src/cli/commands/avatar.ts +17 -11
  308. package/src/cli/commands/conversations.ts +15 -1
  309. package/src/cli/commands/db/__tests__/repair.test.ts +540 -0
  310. package/src/cli/commands/db/__tests__/status.test.ts +253 -0
  311. package/src/cli/commands/db/format.ts +48 -0
  312. package/src/cli/commands/db/index.ts +29 -0
  313. package/src/cli/commands/db/repair-step-conversation-backfill.ts +345 -0
  314. package/src/cli/commands/db/repair-step-integrity.ts +146 -0
  315. package/src/cli/commands/db/repair-steps.ts +164 -0
  316. package/src/cli/commands/db/repair.ts +141 -0
  317. package/src/cli/commands/db/status.ts +366 -0
  318. package/src/cli/commands/memory-v3.ts +159 -445
  319. package/src/cli/lib/cli-colors.ts +24 -6
  320. package/src/cli/program.ts +4 -5
  321. package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
  322. package/src/config/assistant-feature-flags.ts +2 -2
  323. package/src/config/bundled-skills/app-builder/SKILL.md +14 -3
  324. package/src/config/bundled-skills/media-processing/services/reduce.ts +6 -9
  325. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +7 -2
  326. package/src/config/bundled-skills/schedule/SKILL.md +1 -1
  327. package/src/config/bundled-skills/schedule/TOOLS.json +8 -0
  328. package/src/config/call-site-defaults.ts +2 -7
  329. package/src/config/feature-flag-registry.json +25 -9
  330. package/src/config/schemas/__tests__/memory-v2.test.ts +1 -226
  331. package/src/config/schemas/call-site-catalog.ts +8 -15
  332. package/src/config/schemas/llm.ts +2 -3
  333. package/src/config/schemas/memory-lifecycle.ts +24 -0
  334. package/src/config/schemas/memory-v2.ts +0 -253
  335. package/src/config/schemas/memory-v3.ts +39 -0
  336. package/src/config/schemas/memory.ts +6 -1
  337. package/src/config/schemas/timeouts.ts +3 -1
  338. package/src/context/compactor.ts +54 -31
  339. package/src/context/token-estimator.ts +19 -0
  340. package/src/context/tool-result-truncation.ts +1 -43
  341. package/src/context/window-manager.ts +138 -20
  342. package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +2 -2
  343. package/src/daemon/__tests__/web-search-status-text.test.ts +10 -6
  344. package/src/daemon/approval-generators.ts +4 -4
  345. package/src/daemon/config-watcher.ts +7 -1
  346. package/src/daemon/conversation-agent-loop-handlers.ts +225 -88
  347. package/src/daemon/conversation-agent-loop.ts +284 -584
  348. package/src/daemon/conversation-error.ts +7 -7
  349. package/src/daemon/conversation-history.ts +22 -6
  350. package/src/daemon/conversation-launch.ts +4 -8
  351. package/src/daemon/conversation-lifecycle.ts +10 -38
  352. package/src/daemon/conversation-messaging.ts +1 -3
  353. package/src/daemon/conversation-notifiers.ts +7 -5
  354. package/src/daemon/conversation-process.ts +100 -79
  355. package/src/daemon/conversation-runtime-assembly.ts +47 -21
  356. package/src/daemon/conversation-store.ts +6 -5
  357. package/src/daemon/conversation-surfaces.ts +55 -69
  358. package/src/daemon/conversation-tool-setup.ts +3 -0
  359. package/src/daemon/conversation.ts +91 -126
  360. package/src/daemon/daemon-skill-host.ts +2 -6
  361. package/src/daemon/disk-pressure-guard.ts +35 -29
  362. package/src/daemon/external-plugins-bootstrap.ts +46 -24
  363. package/src/daemon/first-greeting.ts +26 -4
  364. package/src/daemon/guardian-action-generators.ts +2 -2
  365. package/src/daemon/handlers/conversations.ts +6 -22
  366. package/src/daemon/handlers/shared.ts +4 -0
  367. package/src/daemon/handlers/skills.ts +15 -14
  368. package/src/daemon/host-app-control-proxy.ts +54 -1
  369. package/src/daemon/host-cu-proxy.ts +46 -22
  370. package/src/daemon/host-file-proxy.ts +25 -1
  371. package/src/daemon/host-proxy-preactivation.ts +25 -6
  372. package/src/daemon/lifecycle.ts +28 -55
  373. package/src/daemon/message-protocol.ts +2 -3
  374. package/src/daemon/message-provenance.ts +49 -0
  375. package/src/daemon/message-types/contacts.ts +3 -20
  376. package/src/daemon/message-types/conversations.ts +13 -111
  377. package/src/daemon/message-types/documents.ts +3 -9
  378. package/src/daemon/message-types/home.ts +4 -17
  379. package/src/daemon/message-types/integrations.ts +2 -6
  380. package/src/daemon/message-types/messages.ts +28 -343
  381. package/src/daemon/message-types/notifications.ts +2 -32
  382. package/src/daemon/message-types/settings.ts +3 -8
  383. package/src/daemon/message-types/skills.ts +2 -0
  384. package/src/daemon/message-types/surfaces.ts +2 -0
  385. package/src/daemon/message-types/sync.ts +12 -25
  386. package/src/daemon/message-types/workspace.ts +3 -11
  387. package/src/daemon/process-message.ts +49 -46
  388. package/src/daemon/server.ts +12 -0
  389. package/src/daemon/tool-side-effects.ts +10 -7
  390. package/src/daemon/trust-context.ts +13 -0
  391. package/src/daemon/wake-target-adapter.ts +11 -1
  392. package/src/heartbeat/__tests__/heartbeat-service.test.ts +3 -1
  393. package/src/heartbeat/heartbeat-run-store.ts +31 -0
  394. package/src/heartbeat/heartbeat-service.ts +16 -0
  395. package/src/home/feature-gate.ts +22 -0
  396. package/src/home/feed-types.ts +36 -221
  397. package/src/ipc/__tests__/email-ipc.test.ts +0 -9
  398. package/src/ipc/routes/__tests__/route-adapter.test.ts +244 -0
  399. package/src/ipc/routes/route-adapter.ts +45 -6
  400. package/src/ipc/skill-routes/__tests__/memory.test.ts +18 -9
  401. package/src/ipc/skill-routes/__tests__/providers.test.ts +10 -10
  402. package/src/ipc/skill-routes/__tests__/registries.test.ts +28 -18
  403. package/src/ipc/skill-routes/memory.ts +26 -13
  404. package/src/ipc/skill-routes/providers.ts +5 -6
  405. package/src/ipc/skill-routes/registries.ts +13 -61
  406. package/src/live-voice/__tests__/live-voice-archive.test.ts +24 -11
  407. package/src/memory/__tests__/conversation-queries.test.ts +192 -8
  408. package/src/memory/__tests__/db-maintenance.test.ts +128 -0
  409. package/src/memory/__tests__/jobs-store-job-classes.test.ts +5 -4
  410. package/src/memory/__tests__/memory-retrospective-job.test.ts +10 -6
  411. package/src/memory/__tests__/memory-v3-selections-migration.test.ts +103 -0
  412. package/src/memory/context-search/agent-runner.ts +2 -4
  413. package/src/memory/conversation-crud.ts +39 -8
  414. package/src/memory/conversation-queries.ts +78 -22
  415. package/src/memory/db-init.ts +8 -0
  416. package/src/memory/db-maintenance.ts +18 -2
  417. package/src/memory/graph/consolidation.ts +8 -11
  418. package/src/memory/graph/conversation-graph-memory.ts +41 -8
  419. package/src/memory/graph/extraction.ts +6 -9
  420. package/src/memory/graph/narrative.ts +2 -2
  421. package/src/memory/graph/pattern-scan.ts +2 -2
  422. package/src/memory/graph/retriever.ts +20 -26
  423. package/src/memory/graph/tools.ts +4 -4
  424. package/src/memory/job-handlers/conversation-starters.ts +32 -32
  425. package/src/memory/job-handlers/summarization.ts +1 -2
  426. package/src/memory/jobs-store.ts +3 -1
  427. package/src/memory/jobs-worker.ts +51 -39
  428. package/src/memory/llm-request-log-source-clickhouse.ts +5 -31
  429. package/src/memory/llm-request-log-source-local.ts +0 -11
  430. package/src/memory/llm-request-log-source.ts +9 -25
  431. package/src/memory/llm-request-log-store.ts +0 -41
  432. package/src/memory/llm-usage-store.ts +10 -0
  433. package/src/memory/memory-marker.ts +17 -0
  434. package/src/memory/memory-retrospective-job.ts +6 -2
  435. package/src/memory/memory-v2-activation-log-store.ts +1 -83
  436. package/src/memory/migrations/267-llm-usage-events-add-assistant-version.ts +46 -0
  437. package/src/memory/migrations/268-add-memory-v3-selections.ts +28 -0
  438. package/src/memory/migrations/269-schedule-script-timeout.ts +11 -0
  439. package/src/memory/migrations/270-messages-role-created-at-index.ts +18 -0
  440. package/src/memory/migrations/__tests__/267-llm-usage-events-add-assistant-version.test.ts +117 -0
  441. package/src/memory/migrations/index.ts +4 -0
  442. package/src/memory/schema/infrastructure.ts +11 -0
  443. package/src/memory/v2/__tests__/consolidation-job.test.ts +124 -0
  444. package/src/memory/v2/__tests__/migration.test.ts +11 -3
  445. package/src/memory/v2/__tests__/page-index.test.ts +37 -1
  446. package/src/memory/v2/__tests__/router.test.ts +14 -4
  447. package/src/memory/v2/__tests__/sweep-job.test.ts +6 -5
  448. package/src/memory/v2/backfill-jobs.ts +6 -0
  449. package/src/memory/v2/consolidation-job.ts +89 -9
  450. package/src/memory/v2/migration.ts +5 -3
  451. package/src/memory/v2/page-index.ts +11 -0
  452. package/src/memory/v2/router.ts +8 -11
  453. package/src/memory/v2/sweep-job.ts +8 -11
  454. package/src/memory/v2/types.ts +1 -0
  455. package/src/memory/v3/__tests__/assign.test.ts +242 -0
  456. package/src/memory/v3/__tests__/capabilities.test.ts +118 -0
  457. package/src/memory/v3/__tests__/core.test.ts +39 -0
  458. package/src/memory/v3/__tests__/fixtures/eval-turns.json +36 -0
  459. package/src/memory/v3/__tests__/fixtures/live-turns.json +37 -0
  460. package/src/memory/v3/__tests__/health.test.ts +203 -0
  461. package/src/memory/v3/__tests__/live-integration.test.ts +330 -0
  462. package/src/memory/v3/__tests__/maintain-job.test.ts +288 -0
  463. package/src/memory/v3/__tests__/needle.test.ts +107 -0
  464. package/src/memory/v3/__tests__/orchestrate.test.ts +400 -0
  465. package/src/memory/v3/__tests__/reconcile.test.ts +274 -0
  466. package/src/memory/v3/__tests__/render-injection.test.ts +61 -0
  467. package/src/memory/v3/__tests__/router.test.ts +260 -0
  468. package/src/memory/v3/__tests__/selection-log-store.test.ts +179 -0
  469. package/src/memory/v3/__tests__/selector.test.ts +404 -0
  470. package/src/memory/v3/__tests__/shadow-plugin.test.ts +414 -0
  471. package/src/memory/v3/__tests__/snapshot.test.ts +168 -0
  472. package/src/memory/v3/__tests__/tree.test.ts +192 -0
  473. package/src/memory/v3/__tests__/types.test.ts +54 -0
  474. package/src/memory/v3/__tests__/working-set-eviction.test.ts +106 -0
  475. package/src/memory/v3/__tests__/working-set-skeleton.test.ts +44 -0
  476. package/src/memory/v3/assign.ts +268 -0
  477. package/src/memory/v3/capabilities.ts +124 -0
  478. package/src/memory/v3/core.ts +26 -0
  479. package/src/memory/v3/data/README.md +84 -0
  480. package/src/memory/v3/data/assignments.json +5 -0
  481. package/src/memory/v3/data/core.json +1 -0
  482. package/src/memory/v3/data/leaves/domain-a/topic-x.md +9 -0
  483. package/src/memory/v3/data/leaves/domain-a/topic-y.md +9 -0
  484. package/src/memory/v3/data/leaves/domain-b/topic-z.md +9 -0
  485. package/src/memory/v3/health.ts +0 -0
  486. package/src/memory/v3/maintain-job.ts +314 -0
  487. package/src/memory/v3/needle.ts +115 -0
  488. package/src/memory/v3/orchestrate.ts +114 -0
  489. package/src/memory/v3/page-content.ts +34 -0
  490. package/src/memory/v3/provider-blocks.ts +16 -0
  491. package/src/memory/v3/reconcile.ts +523 -0
  492. package/src/memory/v3/render-injection.ts +32 -0
  493. package/src/memory/v3/router.ts +184 -0
  494. package/src/memory/v3/selection-log-store.ts +84 -0
  495. package/src/memory/v3/selector.ts +211 -0
  496. package/src/memory/v3/shadow-plugin.ts +379 -0
  497. package/src/memory/v3/snapshot.ts +209 -0
  498. package/src/memory/v3/tree.ts +174 -0
  499. package/src/memory/v3/types.ts +46 -60
  500. package/src/memory/v3/working-set.ts +88 -0
  501. package/src/messaging/providers/slack/render-transcript.test.ts +1 -1
  502. package/src/messaging/providers/slack/render-transcript.ts +2 -2
  503. package/src/messaging/style-analyzer.ts +8 -11
  504. package/src/notifications/conversation-pairing.ts +8 -6
  505. package/src/notifications/decision-engine.ts +10 -13
  506. package/src/notifications/preference-extractor.ts +11 -14
  507. package/src/permissions/prompter.ts +42 -36
  508. package/src/permissions/question-prompter.test.ts +35 -26
  509. package/src/permissions/question-prompter.ts +6 -10
  510. package/src/plugin-api/index.ts +2 -0
  511. package/src/plugin-api/types.ts +25 -3
  512. package/src/plugins/defaults/circuit-breaker/middlewares/circuitBreaker.ts +93 -0
  513. package/src/plugins/defaults/circuit-breaker/package.json +15 -0
  514. package/src/plugins/defaults/circuit-breaker/register.ts +39 -0
  515. package/src/plugins/defaults/compaction/middlewares/compaction.ts +25 -0
  516. package/src/plugins/defaults/compaction/package.json +15 -0
  517. package/src/plugins/defaults/compaction/register.ts +35 -0
  518. package/src/plugins/defaults/compaction/terminal.ts +73 -0
  519. package/src/plugins/defaults/empty-response/middlewares/emptyResponse.ts +22 -0
  520. package/src/plugins/defaults/empty-response/package.json +15 -0
  521. package/src/plugins/defaults/empty-response/register.ts +28 -0
  522. package/src/plugins/defaults/empty-response/terminal.ts +106 -0
  523. package/src/plugins/defaults/history-repair/hooks/user-prompt-submit.ts +35 -0
  524. package/src/plugins/defaults/history-repair/package.json +15 -0
  525. package/src/plugins/defaults/history-repair/register.ts +24 -0
  526. package/src/{daemon/history-repair.ts → plugins/defaults/history-repair/terminal.ts} +48 -35
  527. package/src/plugins/defaults/index.ts +29 -40
  528. package/src/plugins/defaults/injectors/package.json +15 -0
  529. package/src/plugins/defaults/{injectors.ts → injectors/register.ts} +14 -38
  530. package/src/plugins/defaults/llm-call/middlewares/llmCall.ts +17 -0
  531. package/src/plugins/defaults/llm-call/package.json +15 -0
  532. package/src/plugins/defaults/{llm-call.ts → llm-call/register.ts} +6 -38
  533. package/src/plugins/defaults/memory-retrieval/middlewares/memoryRetrieval.ts +17 -0
  534. package/src/plugins/defaults/memory-retrieval/package.json +15 -0
  535. package/src/plugins/defaults/{memory-retrieval.ts → memory-retrieval/register.ts} +10 -48
  536. package/src/plugins/defaults/{overflow-reduce.ts → overflow-reduce/middlewares/overflowReduce.ts} +18 -77
  537. package/src/plugins/defaults/overflow-reduce/package.json +15 -0
  538. package/src/plugins/defaults/overflow-reduce/register.ts +42 -0
  539. package/src/plugins/defaults/persistence/middlewares/persistence.ts +19 -0
  540. package/src/plugins/defaults/persistence/package.json +15 -0
  541. package/src/plugins/defaults/persistence/register.ts +38 -0
  542. package/src/plugins/defaults/persistence/terminal.ts +83 -0
  543. package/src/plugins/defaults/title-generate/package.json +15 -0
  544. package/src/plugins/defaults/title-generate/register.ts +35 -0
  545. package/src/plugins/defaults/title-generate/terminal.ts +31 -0
  546. package/src/plugins/defaults/token-estimate/middlewares/tokenEstimate.ts +23 -0
  547. package/src/plugins/defaults/token-estimate/package.json +15 -0
  548. package/src/plugins/defaults/token-estimate/register.ts +34 -0
  549. package/src/plugins/defaults/token-estimate/terminal.ts +40 -0
  550. package/src/plugins/defaults/tool-error/middlewares/toolError.ts +21 -0
  551. package/src/plugins/defaults/tool-error/package.json +15 -0
  552. package/src/plugins/defaults/tool-error/register.ts +35 -0
  553. package/src/plugins/defaults/tool-error/terminal.ts +47 -0
  554. package/src/plugins/defaults/tool-execute/middlewares/toolExecute.ts +23 -0
  555. package/src/plugins/defaults/tool-execute/package.json +15 -0
  556. package/src/plugins/defaults/{tool-execute.ts → tool-execute/register.ts} +8 -46
  557. package/src/plugins/defaults/tool-result-truncate/middlewares/toolResultTruncate.ts +23 -0
  558. package/src/plugins/defaults/tool-result-truncate/package.json +15 -0
  559. package/src/plugins/defaults/tool-result-truncate/register.ts +35 -0
  560. package/src/plugins/defaults/tool-result-truncate/terminal.ts +113 -0
  561. package/src/plugins/defaults/tool-result-truncate/types.ts +22 -0
  562. package/src/plugins/external-plugin-loader.ts +2 -2
  563. package/src/plugins/pipeline.ts +0 -12
  564. package/src/plugins/types.ts +51 -90
  565. package/src/plugins/user-loader.ts +4 -3
  566. package/src/proactive-artifact/aux-message-injector.ts +0 -1
  567. package/src/proactive-artifact/job.test.ts +20 -8
  568. package/src/proactive-artifact/job.ts +3 -1
  569. package/src/prompts/sections.ts +20 -7
  570. package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +2 -2
  571. package/src/prompts/templates/BOOTSTRAP.md +5 -1
  572. package/src/prompts/templates/system-sections.ts +6 -0
  573. package/src/providers/__tests__/retry-callsite.test.ts +25 -25
  574. package/src/providers/__tests__/satellite-connection-routing.test.ts +7 -21
  575. package/src/providers/anthropic/client.ts +24 -5
  576. package/src/providers/call-site-routing.ts +1 -9
  577. package/src/providers/gemini/client.ts +152 -34
  578. package/src/providers/gemini/inline-media.ts +74 -0
  579. package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +0 -2
  580. package/src/providers/openai/chat-completions-provider.ts +1 -4
  581. package/src/providers/openai/responses-provider.ts +1 -4
  582. package/src/providers/openrouter/client.ts +1 -6
  583. package/src/providers/provider-send-message.ts +6 -6
  584. package/src/providers/ratelimit.ts +1 -9
  585. package/src/providers/retry.ts +0 -5
  586. package/src/providers/types.ts +11 -2
  587. package/src/providers/usage-tracking.ts +1 -9
  588. package/src/runtime/__tests__/agent-wake.test.ts +131 -26
  589. package/src/runtime/__tests__/background-job-runner.test.ts +1 -3
  590. package/src/runtime/agent-wake.ts +93 -18
  591. package/src/runtime/assistant-event-hub.ts +2 -2
  592. package/src/runtime/auth/__tests__/guard-tests.test.ts +75 -109
  593. package/src/runtime/auth/__tests__/route-policy.test.ts +153 -170
  594. package/src/runtime/auth/route-policy.ts +42 -1079
  595. package/src/runtime/background-job-runner.ts +1 -4
  596. package/src/runtime/btw-sidechain.ts +3 -1
  597. package/src/runtime/channel-approvals.ts +3 -14
  598. package/src/runtime/channel-invite-transport.ts +5 -6
  599. package/src/runtime/channel-readiness-service.ts +2 -5
  600. package/src/runtime/channel-retry-sweep.ts +12 -16
  601. package/src/runtime/conversation-stream-state.ts +294 -0
  602. package/src/runtime/http-router.ts +19 -22
  603. package/src/runtime/http-types.ts +12 -6
  604. package/src/runtime/invite-instruction-generator.ts +3 -3
  605. package/src/runtime/pending-interactions.ts +2 -2
  606. package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +565 -0
  607. package/src/runtime/routes/__tests__/content-source-routes.test.ts +4 -4
  608. package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +62 -32
  609. package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +237 -0
  610. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +13 -22
  611. package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +7 -2
  612. package/src/runtime/routes/__tests__/sanity-routes.test.ts +6 -6
  613. package/src/runtime/routes/__tests__/stt-routes.test.ts +3 -3
  614. package/src/runtime/routes/__tests__/suggest-trust-rule-routes.test.ts +5 -2
  615. package/src/runtime/routes/__tests__/tts-routes.test.ts +3 -3
  616. package/src/runtime/routes/acp-routes.test.ts +97 -75
  617. package/src/runtime/routes/acp-routes.ts +29 -6
  618. package/src/runtime/routes/app-management-routes.ts +97 -24
  619. package/src/runtime/routes/app-routes.ts +25 -5
  620. package/src/runtime/routes/approval-routes.ts +16 -4
  621. package/src/runtime/routes/attachment-routes.ts +25 -1
  622. package/src/runtime/routes/audio-routes.ts +1 -0
  623. package/src/runtime/routes/audit-routes.ts +5 -0
  624. package/src/runtime/routes/auth-routes.ts +5 -0
  625. package/src/runtime/routes/avatar-routes.ts +238 -59
  626. package/src/runtime/routes/background-tool-routes.ts +9 -0
  627. package/src/runtime/routes/background-wake-routes.ts +13 -3
  628. package/src/runtime/routes/backup-routes.ts +45 -0
  629. package/src/runtime/routes/bookmark-routes.ts +13 -0
  630. package/src/runtime/routes/brain-graph-routes.ts +9 -0
  631. package/src/runtime/routes/browser-routes.ts +5 -0
  632. package/src/runtime/routes/browser-tabs-routes.ts +5 -0
  633. package/src/runtime/routes/btw-routes.ts +5 -1
  634. package/src/runtime/routes/cache-routes.ts +13 -0
  635. package/src/runtime/routes/call-routes.ts +21 -10
  636. package/src/runtime/routes/channel-availability-routes.ts +5 -1
  637. package/src/runtime/routes/channel-readiness-routes.ts +37 -4
  638. package/src/runtime/routes/channel-route-definitions.ts +21 -0
  639. package/src/runtime/routes/channel-verification-routes.ts +21 -0
  640. package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +9 -2
  641. package/src/runtime/routes/client-routes.ts +9 -0
  642. package/src/runtime/routes/consolidation-routes.ts +13 -5
  643. package/src/runtime/routes/contact-prompt-routes.ts +9 -0
  644. package/src/runtime/routes/contact-routes.ts +90 -23
  645. package/src/runtime/routes/content-source-routes.ts +5 -1
  646. package/src/runtime/routes/conversation-analysis-routes.ts +5 -1
  647. package/src/runtime/routes/conversation-attention-routes.ts +5 -0
  648. package/src/runtime/routes/conversation-cli-routes.ts +54 -7
  649. package/src/runtime/routes/conversation-compaction-routes.ts +54 -25
  650. package/src/runtime/routes/conversation-list-routes.ts +81 -12
  651. package/src/runtime/routes/conversation-management-routes.ts +57 -14
  652. package/src/runtime/routes/conversation-query-routes.ts +88 -41
  653. package/src/runtime/routes/conversation-routes.ts +74 -19
  654. package/src/runtime/routes/conversation-starter-routes.ts +22 -13
  655. package/src/runtime/routes/conversations-import-routes.ts +6 -1
  656. package/src/runtime/routes/credential-prompt-routes.ts +5 -0
  657. package/src/runtime/routes/credential-routes.ts +25 -6
  658. package/src/runtime/routes/debug-bash-routes.ts +5 -0
  659. package/src/runtime/routes/debug-routes.ts +11 -2
  660. package/src/runtime/routes/defer-routes.ts +13 -0
  661. package/src/runtime/routes/diagnostics-routes.ts +37 -46
  662. package/src/runtime/routes/disk-pressure-routes.ts +17 -31
  663. package/src/runtime/routes/document-comments-routes.ts +46 -27
  664. package/src/runtime/routes/documents-routes.ts +21 -10
  665. package/src/runtime/routes/domain-routes.ts +61 -28
  666. package/src/runtime/routes/email-routes.ts +33 -0
  667. package/src/runtime/routes/events-routes.ts +114 -9
  668. package/src/runtime/routes/filing-routes.ts +9 -4
  669. package/src/runtime/routes/gateway-log-routes.ts +5 -0
  670. package/src/runtime/routes/global-search-routes.ts +53 -50
  671. package/src/runtime/routes/group-routes.ts +21 -5
  672. package/src/runtime/routes/guardian-action-routes.ts +9 -0
  673. package/src/runtime/routes/guardian-approval-interception.ts +0 -31
  674. package/src/runtime/routes/heartbeat-routes.ts +25 -9
  675. package/src/runtime/routes/home-feed-routes.ts +23 -19
  676. package/src/runtime/routes/home-state-routes.ts +8 -40
  677. package/src/runtime/routes/host-app-control-routes.ts +5 -0
  678. package/src/runtime/routes/host-bash-routes.ts +5 -0
  679. package/src/runtime/routes/host-browser-routes.ts +13 -0
  680. package/src/runtime/routes/host-cu-routes.ts +5 -0
  681. package/src/runtime/routes/host-file-routes.ts +26 -6
  682. package/src/runtime/routes/host-transfer-routes.ts +13 -2
  683. package/src/runtime/routes/http-adapter.ts +1 -2
  684. package/src/runtime/routes/identity-intro-cache.ts +17 -6
  685. package/src/runtime/routes/identity-routes.ts +12 -2
  686. package/src/runtime/routes/image-generation-routes.ts +5 -0
  687. package/src/runtime/routes/inbound-message-handler.ts +15 -11
  688. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +0 -12
  689. package/src/runtime/routes/inbound-stages/background-dispatch.ts +15 -19
  690. package/src/runtime/routes/inference-profile-session-routes.ts +13 -3
  691. package/src/runtime/routes/inference-provider-connection-routes.ts +21 -5
  692. package/src/runtime/routes/inference-send-routes.ts +11 -11
  693. package/src/runtime/routes/integrations/a2a.ts +30 -7
  694. package/src/runtime/routes/integrations/slack/channel.ts +19 -3
  695. package/src/runtime/routes/integrations/slack/share.ts +9 -2
  696. package/src/runtime/routes/integrations/telegram.ts +28 -9
  697. package/src/runtime/routes/integrations/twilio.ts +35 -7
  698. package/src/runtime/routes/integrations/vercel.ts +3 -3
  699. package/src/runtime/routes/internal-oauth-routes.ts +5 -0
  700. package/src/runtime/routes/internal-twilio-routes.ts +13 -0
  701. package/src/runtime/routes/llm-call-sites-routes.ts +39 -4
  702. package/src/runtime/routes/log-export-routes.ts +28 -10
  703. package/src/runtime/routes/mcp-auth-routes.ts +25 -0
  704. package/src/runtime/routes/memory-item-routes.ts +21 -10
  705. package/src/runtime/routes/memory-v2-routes.ts +90 -36
  706. package/src/runtime/routes/memory-v3-routes.ts +273 -407
  707. package/src/runtime/routes/migration-rollback-routes.ts +5 -1
  708. package/src/runtime/routes/migration-routes.ts +29 -0
  709. package/src/runtime/routes/notification-routes.ts +17 -1
  710. package/src/runtime/routes/oauth-apps.ts +33 -11
  711. package/src/runtime/routes/oauth-commands-routes.ts +37 -14
  712. package/src/runtime/routes/oauth-connect-routes.ts +9 -0
  713. package/src/runtime/routes/oauth-lifecycle-routes.ts +5 -1
  714. package/src/runtime/routes/oauth-providers.ts +35 -10
  715. package/src/runtime/routes/platform-routes.ts +21 -0
  716. package/src/runtime/routes/playground/__tests__/force-compact.test.ts +3 -2
  717. package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +37 -16
  718. package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +7 -3
  719. package/src/runtime/routes/playground/__tests__/state.test.ts +10 -3
  720. package/src/runtime/routes/playground/force-compact.ts +1 -1
  721. package/src/runtime/routes/playground/helpers.ts +0 -1
  722. package/src/runtime/routes/playground/inject-failures.ts +13 -8
  723. package/src/runtime/routes/playground/reset-circuit.ts +14 -9
  724. package/src/runtime/routes/playground/seed-conversation.ts +1 -1
  725. package/src/runtime/routes/playground/seeded-conversations.ts +3 -3
  726. package/src/runtime/routes/playground/state.ts +4 -3
  727. package/src/runtime/routes/plugins-routes.ts +22 -19
  728. package/src/runtime/routes/profiler-routes.ts +17 -4
  729. package/src/runtime/routes/ps-routes.ts +5 -0
  730. package/src/runtime/routes/publish-routes.ts +13 -3
  731. package/src/runtime/routes/question-routes.ts +5 -0
  732. package/src/runtime/routes/recording-routes.ts +25 -12
  733. package/src/runtime/routes/rename-conversation-routes.ts +5 -0
  734. package/src/runtime/routes/sanity-routes.ts +9 -2
  735. package/src/runtime/routes/schedule-routes.ts +137 -47
  736. package/src/runtime/routes/secret-routes.ts +17 -4
  737. package/src/runtime/routes/sequence-routes.ts +33 -0
  738. package/src/runtime/routes/settings-routes.ts +65 -19
  739. package/src/runtime/routes/skills-routes.ts +133 -69
  740. package/src/runtime/routes/slack-channel-routes.ts +5 -0
  741. package/src/runtime/routes/stt-routes.ts +13 -6
  742. package/src/runtime/routes/subagents-routes.ts +24 -18
  743. package/src/runtime/routes/suggest-trust-rule-routes.ts +7 -2
  744. package/src/runtime/routes/surface-action-routes.ts +9 -0
  745. package/src/runtime/routes/surface-content-routes.ts +10 -2
  746. package/src/runtime/routes/task-routes.ts +37 -0
  747. package/src/runtime/routes/telemetry-routes.ts +9 -0
  748. package/src/runtime/routes/trace-event-routes.ts +42 -1
  749. package/src/runtime/routes/trust-rules-routes.ts +5 -0
  750. package/src/runtime/routes/tts-routes.ts +13 -6
  751. package/src/runtime/routes/types.ts +17 -8
  752. package/src/runtime/routes/ui-request-routes.ts +5 -0
  753. package/src/runtime/routes/upgrade-broadcast-routes.ts +5 -0
  754. package/src/runtime/routes/usage-routes.ts +71 -3
  755. package/src/runtime/routes/user-routes-cli.ts +9 -0
  756. package/src/runtime/routes/user-routes.ts +5 -1
  757. package/src/runtime/routes/wake-conversation-routes.ts +5 -0
  758. package/src/runtime/routes/watcher-routes.ts +21 -0
  759. package/src/runtime/routes/webhook-routes.ts +9 -0
  760. package/src/runtime/routes/wipe-conversation-routes.ts +5 -0
  761. package/src/runtime/routes/work-items-routes.ts +47 -19
  762. package/src/runtime/routes/workspace-commit-routes.ts +5 -0
  763. package/src/runtime/routes/workspace-routes.test.ts +42 -0
  764. package/src/runtime/routes/workspace-routes.ts +120 -9
  765. package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -4
  766. package/src/runtime/services/analyze-conversation.ts +3 -6
  767. package/src/runtime/services/conversation-serializer.ts +24 -2
  768. package/src/runtime/sync/resource-sync-events.ts +16 -2
  769. package/src/runtime/sync/sync-publisher.ts +2 -2
  770. package/src/schedule/run-script.ts +28 -3
  771. package/src/schedule/schedule-store.ts +8 -0
  772. package/src/schedule/scheduler.ts +3 -1
  773. package/src/signals/user-message.ts +5 -8
  774. package/src/skills/catalog-files.ts +4 -1
  775. package/src/skills/clawhub-files.ts +2 -0
  776. package/src/skills/skillssh-files.ts +2 -0
  777. package/src/subagent/manager.ts +3 -6
  778. package/src/telemetry/types.ts +26 -0
  779. package/src/telemetry/usage-telemetry-reporter.test.ts +138 -1
  780. package/src/telemetry/usage-telemetry-reporter.ts +31 -0
  781. package/src/tools/acp/spawn.test.ts +88 -38
  782. package/src/tools/apps/definitions.ts +8 -4
  783. package/src/tools/ask-question/ask-question-tool.test.ts +120 -105
  784. package/src/tools/ask-question/ask-question-tool.ts +85 -90
  785. package/src/tools/computer-use/definitions.ts +28 -24
  786. package/src/tools/credential-execution/make-authenticated-request.ts +56 -51
  787. package/src/tools/credential-execution/manage-secure-command-tool.ts +2 -2
  788. package/src/tools/credential-execution/run-authenticated-command.ts +82 -77
  789. package/src/tools/credentials/vault.ts +112 -111
  790. package/src/tools/execution-target.ts +1 -1
  791. package/src/tools/execution-timeout.ts +3 -4
  792. package/src/tools/filesystem/edit.ts +45 -42
  793. package/src/tools/filesystem/list.ts +33 -30
  794. package/src/tools/filesystem/read.ts +54 -35
  795. package/src/tools/filesystem/write.ts +34 -31
  796. package/src/tools/host-filesystem/edit.ts +44 -42
  797. package/src/tools/host-filesystem/read.ts +49 -35
  798. package/src/tools/host-filesystem/transfer.ts +121 -108
  799. package/src/tools/host-filesystem/write.ts +33 -31
  800. package/src/tools/host-terminal/host-shell.ts +50 -48
  801. package/src/tools/memory/register.ts +23 -24
  802. package/src/tools/network/web-fetch.ts +49 -46
  803. package/src/tools/network/web-search.ts +16 -13
  804. package/src/tools/registry.ts +39 -16
  805. package/src/tools/schedule/create.ts +11 -0
  806. package/src/tools/schedule/update.ts +16 -0
  807. package/src/tools/shared/filesystem/audio-read.ts +122 -0
  808. package/src/tools/shared/filesystem/image-read.ts +1 -1
  809. package/src/tools/skills/execute.ts +34 -31
  810. package/src/tools/skills/load.ts +29 -23
  811. package/src/tools/subagent/notify-parent.ts +35 -32
  812. package/src/tools/system/avatar-generator.ts +13 -22
  813. package/src/tools/system/request-permission.ts +30 -27
  814. package/src/tools/terminal/shell.ts +190 -61
  815. package/src/tools/tool-defaults.ts +20 -9
  816. package/src/tools/tool-manifest.ts +4 -4
  817. package/src/tools/types.ts +74 -23
  818. package/src/tools/ui-surface/definitions.ts +69 -9
  819. package/src/usage/types.ts +10 -0
  820. package/src/util/errors.ts +2 -2
  821. package/src/util/map-limit.ts +27 -0
  822. package/src/util/platform.ts +15 -12
  823. package/src/work-items/work-item-runner.ts +7 -2
  824. package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +7 -20
  825. package/src/workspace/migrations/092-backfill-v3-leaves.ts +169 -0
  826. package/src/workspace/migrations/093-backfill-leaf-ids.ts +144 -0
  827. package/src/workspace/migrations/094-seed-avatar-manifest.ts +155 -0
  828. package/src/workspace/migrations/__tests__/094-seed-avatar-manifest.test.ts +136 -0
  829. package/src/workspace/migrations/__tests__/backfill-leaf-ids.test.ts +175 -0
  830. package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +124 -0
  831. package/src/workspace/migrations/registry.ts +6 -0
  832. package/src/workspace/provider-commit-message-generator.ts +15 -17
  833. package/tsconfig.json +4 -1
  834. package/src/__tests__/history-repair-pipeline.test.ts +0 -396
  835. package/src/cli/commands/__tests__/memory-v3-render.test.ts +0 -340
  836. package/src/cli/commands/memory-v3-render.ts +0 -491
  837. package/src/daemon/message-types/disk-pressure.ts +0 -9
  838. package/src/email/feature-gate.ts +0 -23
  839. package/src/memory/v3/__tests__/coactivation-store.test.ts +0 -422
  840. package/src/memory/v3/__tests__/consolidation-job.test.ts +0 -466
  841. package/src/memory/v3/__tests__/coretrieval-seed.test.ts +0 -270
  842. package/src/memory/v3/__tests__/edge-learning-job.test.ts +0 -324
  843. package/src/memory/v3/__tests__/edges.test.ts +0 -706
  844. package/src/memory/v3/__tests__/filter.test.ts +0 -560
  845. package/src/memory/v3/__tests__/gate.test.ts +0 -637
  846. package/src/memory/v3/__tests__/index-composition.test.ts +0 -291
  847. package/src/memory/v3/__tests__/loop.test.ts +0 -775
  848. package/src/memory/v3/__tests__/retriever.test.ts +0 -226
  849. package/src/memory/v3/__tests__/scouts.test.ts +0 -489
  850. package/src/memory/v3/__tests__/shadow-diff.test.ts +0 -225
  851. package/src/memory/v3/__tests__/shadow-middleware.test.ts +0 -398
  852. package/src/memory/v3/__tests__/system-prompts.test.ts +0 -154
  853. package/src/memory/v3/__tests__/traversal.test.ts +0 -508
  854. package/src/memory/v3/__tests__/tree-index.test.ts +0 -280
  855. package/src/memory/v3/__tests__/tree-store.test.ts +0 -529
  856. package/src/memory/v3/__tests__/tree-walk.test.ts +0 -784
  857. package/src/memory/v3/__tests__/validate.test.ts +0 -277
  858. package/src/memory/v3/auto-edges.ts +0 -223
  859. package/src/memory/v3/coactivation-store.ts +0 -124
  860. package/src/memory/v3/consolidation-job.ts +0 -323
  861. package/src/memory/v3/coretrieval-seed.ts +0 -240
  862. package/src/memory/v3/edge-learning-job.ts +0 -160
  863. package/src/memory/v3/edges.ts +0 -286
  864. package/src/memory/v3/filter.ts +0 -286
  865. package/src/memory/v3/gate.ts +0 -349
  866. package/src/memory/v3/index-composition.ts +0 -126
  867. package/src/memory/v3/llm-capture.ts +0 -46
  868. package/src/memory/v3/loop.ts +0 -430
  869. package/src/memory/v3/maintenance.ts +0 -144
  870. package/src/memory/v3/prompt-context.ts +0 -33
  871. package/src/memory/v3/prompts/consolidation.ts +0 -458
  872. package/src/memory/v3/prompts/system-prompts.ts +0 -196
  873. package/src/memory/v3/retriever.ts +0 -33
  874. package/src/memory/v3/scouts.ts +0 -431
  875. package/src/memory/v3/shadow-diff.ts +0 -287
  876. package/src/memory/v3/shadow-middleware.ts +0 -347
  877. package/src/memory/v3/traversal.ts +0 -211
  878. package/src/memory/v3/tree-index.ts +0 -237
  879. package/src/memory/v3/tree-store.ts +0 -394
  880. package/src/memory/v3/tree-walk.ts +0 -356
  881. package/src/memory/v3/validate.ts +0 -323
  882. package/src/plugins/defaults/circuit-breaker.ts +0 -141
  883. package/src/plugins/defaults/compaction.ts +0 -141
  884. package/src/plugins/defaults/empty-response.ts +0 -124
  885. package/src/plugins/defaults/history-repair.ts +0 -83
  886. package/src/plugins/defaults/persistence.ts +0 -146
  887. package/src/plugins/defaults/title-generate.ts +0 -90
  888. package/src/plugins/defaults/token-estimate.ts +0 -101
  889. package/src/plugins/defaults/tool-error.ts +0 -119
  890. package/src/plugins/defaults/tool-result-truncate.ts +0 -84
  891. package/src/runtime/routes/__tests__/memory-v3-simulate-params.test.ts +0 -35
@@ -5,9 +5,8 @@
5
5
  * - POST /v1/acp/spawn — the three failure paths produced by
6
6
  * `resolveAcpAgent` (acp_disabled, unknown_agent, binary_not_found).
7
7
  * - POST /v1/acp/spawn (env injection) — CLAUDE_CODE_OAUTH_TOKEN is read
8
- * from the secure store under the canonical
9
- * `credential/acp/claude_oauth_token` key (built by `credentialKey()`)
10
- * and merged into `agentConfig.env` ONLY for the `claude` agent.
8
+ * from the credential broker (policy-gated + audited) and merged into
9
+ * `agentConfig.env` ONLY for the `claude` agent.
11
10
  * - DELETE /v1/acp/sessions?status=completed — the bulk-clear route that
12
11
  * wipes terminal-state rows (completed/failed/cancelled) from
13
12
  * `acp_session_history` while leaving running/initializing rows intact.
@@ -84,12 +83,83 @@ mock.module("../../acp/index.js", () => ({
84
83
  }),
85
84
  }));
86
85
 
87
- // Stub secure-keys so env-injection tests can plant a known token (or
88
- // absence). Driven via `secureKeyStore` per test in beforeEach.
89
- const secureKeyStore = new Map<string, string>();
86
+ // Stub credential broker + metadata store so env-injection tests can plant
87
+ // a known token (or absence) without touching the real credential store.
88
+ // The broker mock mirrors the real serverUse policy: metadata must exist
89
+ // and allowedTools must include the requesting tool.
90
+ const vaultStore = new Map<string, string>();
91
+ const metadataStore = new Map<
92
+ string,
93
+ { allowedTools: string[]; usageDescription?: string }
94
+ >();
95
+
96
+ mock.module("../../tools/credentials/metadata-store.js", () => ({
97
+ getCredentialMetadata: (service: string, field: string) => {
98
+ const key = `${service}/${field}`;
99
+ const entry = metadataStore.get(key);
100
+ if (!entry) return undefined;
101
+ return {
102
+ credentialId: `cred-${key}`,
103
+ service,
104
+ field,
105
+ allowedTools: entry.allowedTools,
106
+ allowedDomains: [],
107
+ usageDescription: entry.usageDescription,
108
+ createdAt: 0,
109
+ updatedAt: 0,
110
+ };
111
+ },
112
+ upsertCredentialMetadata: (
113
+ service: string,
114
+ field: string,
115
+ policy?: { allowedTools?: string[]; usageDescription?: string },
116
+ ) => {
117
+ const key = `${service}/${field}`;
118
+ const existing = metadataStore.get(key);
119
+ metadataStore.set(key, {
120
+ allowedTools: policy?.allowedTools ?? existing?.allowedTools ?? [],
121
+ usageDescription:
122
+ policy?.usageDescription ?? existing?.usageDescription,
123
+ });
124
+ return {
125
+ credentialId: `cred-${key}`,
126
+ service,
127
+ field,
128
+ allowedTools: metadataStore.get(key)!.allowedTools,
129
+ allowedDomains: [],
130
+ createdAt: 0,
131
+ updatedAt: 0,
132
+ };
133
+ },
134
+ }));
90
135
 
91
- mock.module("../../security/secure-keys.js", () => ({
92
- getSecureKeyAsync: async (key: string) => secureKeyStore.get(key),
136
+ mock.module("../../tools/credentials/broker.js", () => ({
137
+ credentialBroker: {
138
+ serverUse: async <T>(request: {
139
+ service: string;
140
+ field: string;
141
+ toolName: string;
142
+ execute: (value: string) => Promise<T>;
143
+ }) => {
144
+ const key = `${request.service}/${request.field}`;
145
+ const meta = metadataStore.get(key);
146
+ if (!meta) {
147
+ return { success: false, reason: `No credential found for ${key}` };
148
+ }
149
+ if (!meta.allowedTools.includes(request.toolName)) {
150
+ return {
151
+ success: false,
152
+ reason: `Tool "${request.toolName}" not allowed`,
153
+ };
154
+ }
155
+ const value = vaultStore.get(key);
156
+ if (!value) {
157
+ return { success: false, reason: `No stored value for ${key}` };
158
+ }
159
+ const result = await request.execute(value);
160
+ return { success: true, result };
161
+ },
162
+ },
93
163
  }));
94
164
 
95
165
  import { eq } from "drizzle-orm";
@@ -113,7 +183,8 @@ beforeEach(() => {
113
183
  config.setConfig({});
114
184
  which.setWhich((cmd) => `/usr/local/bin/${cmd}`);
115
185
  capturedSpawns.length = 0;
116
- secureKeyStore.clear();
186
+ vaultStore.clear();
187
+ metadataStore.clear();
117
188
  });
118
189
 
119
190
  // ---------------------------------------------------------------------------
@@ -186,29 +257,27 @@ describe("POST /v1/acp/spawn", () => {
186
257
  //
187
258
  // claude-agent-acp authenticates via CLAUDE_CODE_OAUTH_TOKEN. The route
188
259
  // accepts the token from two provisioning routes:
189
- // 1. Secure store under the canonical `credential/acp/claude_oauth_token`
190
- // key (built by `credentialKey()`), populated by
191
- // `assistant credentials set --service acp --field claude_oauth_token`.
260
+ // 1. Credential broker (policy-gated + audited) reading from the secure
261
+ // store provisioned via `assistant credentials set --service acp
262
+ // --field claude_oauth_token`.
192
263
  // 2. `acp.agents.claude.env.CLAUDE_CODE_OAUTH_TOKEN` in the user's
193
264
  // config.json, surfaced on `resolved.agent.env` by the resolver.
194
- // After merging the secure-store value into `agentConfig.env`, the route
195
- // preflights for the token and throws `FailedDependencyError` if it is
196
- // still absent. The "fail-fast" behavior is symmetric with the existing
197
- // `binary_not_found` preflight and avoids the zombie-subprocess footgun
198
- // where claude-agent-acp launches, crashes on auth, and leaves the
199
- // caller with no useful signal.
265
+ // After broker-mediated resolution, the route preflights for the token
266
+ // and throws `FailedDependencyError` if it is still absent.
200
267
  //
201
268
  // These tests pin both the happy paths and the throw path so a future
202
269
  // drift in the key path, the env-override route, or the preflight check
203
270
  // fails the suite loudly.
204
271
  // ---------------------------------------------------------------------------
205
272
 
273
+ /** Seed a vault entry to simulate `assistant credentials set`. */
274
+ function seedVaultToken(token: string): void {
275
+ vaultStore.set("acp/claude_oauth_token", token);
276
+ }
277
+
206
278
  describe("POST /v1/acp/spawn — CLAUDE_CODE_OAUTH_TOKEN injection", () => {
207
- test("injects CLAUDE_CODE_OAUTH_TOKEN from credential/acp/claude_oauth_token for the claude agent", async () => {
208
- secureKeyStore.set(
209
- "credential/acp/claude_oauth_token",
210
- "test-token-abc123",
211
- );
279
+ test("injects CLAUDE_CODE_OAUTH_TOKEN from the vault via the broker for the claude agent", async () => {
280
+ seedVaultToken("test-token-abc123");
212
281
 
213
282
  const handler = getSpawnHandler();
214
283
  await handler({
@@ -226,11 +295,7 @@ describe("POST /v1/acp/spawn — CLAUDE_CODE_OAUTH_TOKEN injection", () => {
226
295
  );
227
296
  });
228
297
 
229
- test("accepts CLAUDE_CODE_OAUTH_TOKEN from acp.agents.claude.env (config.json override) without a secure-store entry", async () => {
230
- // The user-supplied config.json env override is the first-priority
231
- // provisioning route. resolveAcpAgent returns it on `resolved.agent.env`,
232
- // which the route then preserves on `agentConfig.env`. The preflight
233
- // should accept this path with no secure-store entry needed.
298
+ test("accepts CLAUDE_CODE_OAUTH_TOKEN from acp.agents.claude.env (config.json override) without a vault entry", async () => {
234
299
  config.setConfig({
235
300
  agents: {
236
301
  claude: {
@@ -256,12 +321,8 @@ describe("POST /v1/acp/spawn — CLAUDE_CODE_OAUTH_TOKEN injection", () => {
256
321
  );
257
322
  });
258
323
 
259
- test("config.json env override wins over a secure-store token (precedence pin)", async () => {
260
- // Codex review feedback (PR #31901 / P2): when a user explicitly sets
261
- // CLAUDE_CODE_OAUTH_TOKEN under `acp.agents.<id>.env` (per-workspace,
262
- // rotated, scoped credential, etc.), the secure-store value must NOT
263
- // silently overwrite it. Vault is fallback, not override.
264
- secureKeyStore.set("credential/acp/claude_oauth_token", "vault-token-AAA");
324
+ test("config.json env override wins over a vault token (precedence pin)", async () => {
325
+ seedVaultToken("vault-token-AAA");
265
326
  config.setConfig({
266
327
  agents: {
267
328
  claude: {
@@ -288,11 +349,7 @@ describe("POST /v1/acp/spawn — CLAUDE_CODE_OAUTH_TOKEN injection", () => {
288
349
  });
289
350
 
290
351
  test("injects via command match for a user-defined agent id aliased to claude-agent-acp", async () => {
291
- // Codex review feedback (PR #31901 / P2): gating is keyed off the
292
- // resolved command (basename), not the agent id. A custom agent id
293
- // pointing at claude-agent-acp still needs CLAUDE_CODE_OAUTH_TOKEN,
294
- // so injection + preflight must fire regardless of the id string.
295
- secureKeyStore.set("credential/acp/claude_oauth_token", "vault-token-zzz");
352
+ seedVaultToken("vault-token-zzz");
296
353
  config.setConfig({
297
354
  agents: {
298
355
  "my-claude": {
@@ -319,12 +376,6 @@ describe("POST /v1/acp/spawn — CLAUDE_CODE_OAUTH_TOKEN injection", () => {
319
376
  });
320
377
 
321
378
  test("throws FailedDependencyError when no CLAUDE_CODE_OAUTH_TOKEN is available from any source", async () => {
322
- // secureKeyStore intentionally empty AND no agentConfig.env override —
323
- // simulates a fresh install where the user hasn't provisioned a token
324
- // via either route. Fail-fast preflight surfaces this immediately
325
- // instead of letting claude-agent-acp launch, crash on auth, and leave
326
- // a zombie subprocess behind.
327
-
328
379
  const handler = getSpawnHandler();
329
380
  await expect(
330
381
  handler({
@@ -339,14 +390,7 @@ describe("POST /v1/acp/spawn — CLAUDE_CODE_OAUTH_TOKEN injection", () => {
339
390
  });
340
391
 
341
392
  test("does NOT inject CLAUDE_CODE_OAUTH_TOKEN for agents whose command is not claude-agent-acp", async () => {
342
- // Token-injection AND preflight are scoped to claude-agent-acp by
343
- // command basename. A codex-acp spawn with the secure-store key set
344
- // must still launch without that env var — and must not be blocked
345
- // by claude's preflight.
346
- secureKeyStore.set(
347
- "credential/acp/claude_oauth_token",
348
- "test-token-abc123",
349
- );
393
+ seedVaultToken("test-token-abc123");
350
394
 
351
395
  const handler = getSpawnHandler();
352
396
  await handler({
@@ -363,28 +407,6 @@ describe("POST /v1/acp/spawn — CLAUDE_CODE_OAUTH_TOKEN injection", () => {
363
407
  capturedSpawns[0]?.agentConfig.env?.CLAUDE_CODE_OAUTH_TOKEN,
364
408
  ).toBeUndefined();
365
409
  });
366
-
367
- test("does NOT pick up a token planted at the legacy non-`credential/` key path", async () => {
368
- // Regression guard: the original implementation used the raw key
369
- // "acp/claude/oauth_token". The fix routes through `credentialKey()`
370
- // so the CLI (`assistant credentials set --service acp --field
371
- // claude_oauth_token`) is the canonical provisioning path. Pin this
372
- // by planting the token ONLY under the legacy key — the preflight
373
- // should fail-fast because the canonical path is empty.
374
- secureKeyStore.set("acp/claude/oauth_token", "legacy-token-should-miss");
375
-
376
- const handler = getSpawnHandler();
377
- await expect(
378
- handler({
379
- body: {
380
- agent: "claude",
381
- task: "do a thing",
382
- conversationId: "conv-1",
383
- },
384
- }),
385
- ).rejects.toThrow(/CLAUDE_CODE_OAUTH_TOKEN/);
386
- expect(capturedSpawns).toHaveLength(0);
387
- });
388
410
  });
389
411
 
390
412
  // ---------------------------------------------------------------------------
@@ -16,6 +16,7 @@ import { rawChanges } from "../../memory/raw-query.js";
16
16
  import { acpSessionHistory } from "../../memory/schema.js";
17
17
  import { broadcastMessage } from "../../runtime/assistant-event-hub.js";
18
18
  import { getLogger } from "../../util/logger.js";
19
+ import { ACTOR_PRINCIPALS } from "../auth/route-policy.js";
19
20
  import {
20
21
  BadRequestError,
21
22
  ConflictError,
@@ -202,7 +203,10 @@ export const ROUTES: RouteDefinition[] = [
202
203
  operationId: "acp_spawn",
203
204
  endpoint: "acp/spawn",
204
205
  method: "POST",
205
- policyKey: "acp/spawn",
206
+ policy: {
207
+ requiredScopes: ["chat.write"],
208
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
209
+ },
206
210
  handler: spawnSession,
207
211
  summary: "Spawn ACP session",
208
212
  description: "Start a new Agent Communication Protocol session.",
@@ -223,7 +227,10 @@ export const ROUTES: RouteDefinition[] = [
223
227
  operationId: "acp_steer",
224
228
  endpoint: "acp/:id/steer",
225
229
  method: "POST",
226
- policyKey: "acp/steer",
230
+ policy: {
231
+ requiredScopes: ["chat.write"],
232
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
233
+ },
227
234
  handler: steerSession,
228
235
  summary: "Steer ACP session",
229
236
  description: "Send a steering instruction to an active ACP session.",
@@ -240,7 +247,10 @@ export const ROUTES: RouteDefinition[] = [
240
247
  operationId: "acp_cancel",
241
248
  endpoint: "acp/:id/cancel",
242
249
  method: "POST",
243
- policyKey: "acp/cancel",
250
+ policy: {
251
+ requiredScopes: ["chat.write"],
252
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
253
+ },
244
254
  handler: cancelSession,
245
255
  summary: "Cancel ACP session",
246
256
  description: "Cancel an active ACP session.",
@@ -254,7 +264,10 @@ export const ROUTES: RouteDefinition[] = [
254
264
  operationId: "acp_close",
255
265
  endpoint: "acp/:id/close",
256
266
  method: "POST",
257
- policyKey: "acp/close",
267
+ policy: {
268
+ requiredScopes: ["chat.write"],
269
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
270
+ },
258
271
  handler: closeSession,
259
272
  summary: "Close ACP session",
260
273
  description: "Close a completed ACP session.",
@@ -268,7 +281,10 @@ export const ROUTES: RouteDefinition[] = [
268
281
  operationId: "acp_list_sessions",
269
282
  endpoint: "acp/sessions",
270
283
  method: "GET",
271
- policyKey: "acp",
284
+ policy: {
285
+ requiredScopes: ["chat.read"],
286
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
287
+ },
272
288
  handler: listSessions,
273
289
  summary: "List ACP sessions",
274
290
  description:
@@ -300,6 +316,10 @@ export const ROUTES: RouteDefinition[] = [
300
316
  operationId: "acp_bulk_delete_sessions",
301
317
  endpoint: "acp/sessions",
302
318
  method: "DELETE",
319
+ policy: {
320
+ requiredScopes: ["settings.write"],
321
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
322
+ },
303
323
  handler: bulkDeleteSessions,
304
324
  summary: "Bulk-clear terminal ACP sessions",
305
325
  description:
@@ -322,7 +342,10 @@ export const ROUTES: RouteDefinition[] = [
322
342
  operationId: "acp_delete_session",
323
343
  endpoint: "acp/sessions/:id",
324
344
  method: "DELETE",
325
- policyKey: "acp/sessions/delete",
345
+ policy: {
346
+ requiredScopes: ["chat.write"],
347
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
348
+ },
326
349
  handler: deleteSession,
327
350
  summary: "Delete ACP session from history",
328
351
  description:
@@ -49,6 +49,8 @@ import {
49
49
  import { createSharedAppLink } from "../../memory/shared-app-links-store.js";
50
50
  import { computeContentId } from "../../util/content-id.js";
51
51
  import { getLogger } from "../../util/logger.js";
52
+ import { ACTOR_PRINCIPALS } from "../auth/route-policy.js";
53
+ import { publishAppsChanged } from "../sync/resource-sync-events.js";
52
54
  import {
53
55
  BadRequestError,
54
56
  NotFoundError,
@@ -62,6 +64,12 @@ const log = getLogger("app-management-routes");
62
64
  // Helpers
63
65
  // ---------------------------------------------------------------------------
64
66
 
67
+ function getOriginClientId(
68
+ headers: RouteHandlerArgs["headers"],
69
+ ): string | undefined {
70
+ return headers?.["x-vellum-client-id"]?.trim() || undefined;
71
+ }
72
+
65
73
  function getSharedAppsDir(): string {
66
74
  return join(
67
75
  homedir(),
@@ -565,14 +573,16 @@ async function handleImportBundle({ rawBody, headers }: RouteHandlerArgs) {
565
573
  "Request body is required — upload a .vbundle file",
566
574
  );
567
575
  }
568
- return importBundle(rawBody, headers ?? {});
576
+ const result = await importBundle(rawBody, headers ?? {});
577
+ publishAppsChanged(getOriginClientId(headers));
578
+ return result;
569
579
  }
570
580
 
571
581
  function handleListSharedApps() {
572
582
  return { apps: listSharedApps() };
573
583
  }
574
584
 
575
- function handleForkSharedApp({ body }: RouteHandlerArgs) {
585
+ function handleForkSharedApp({ body, headers }: RouteHandlerArgs) {
576
586
  if (!body?.uuid) {
577
587
  throw new BadRequestError("uuid is required");
578
588
  }
@@ -580,10 +590,11 @@ function handleForkSharedApp({ body }: RouteHandlerArgs) {
580
590
  if (!result.success) {
581
591
  throw new BadRequestError(result.error);
582
592
  }
593
+ publishAppsChanged(getOriginClientId(headers));
583
594
  return result;
584
595
  }
585
596
 
586
- async function handleInstallGalleryApp({ body }: RouteHandlerArgs) {
597
+ async function handleInstallGalleryApp({ body, headers }: RouteHandlerArgs) {
587
598
  if (!body?.galleryAppId) {
588
599
  throw new BadRequestError("galleryAppId is required");
589
600
  }
@@ -591,6 +602,7 @@ async function handleInstallGalleryApp({ body }: RouteHandlerArgs) {
591
602
  if (!result.success) {
592
603
  throw new BadRequestError(result.error);
593
604
  }
605
+ publishAppsChanged(getOriginClientId(headers));
594
606
  return result;
595
607
  }
596
608
 
@@ -694,8 +706,9 @@ async function handleOpenApp({ pathParams }: RouteHandlerArgs) {
694
706
  return { appId: app.id, dirName, name: app.name, html };
695
707
  }
696
708
 
697
- function handleDeleteApp({ pathParams }: RouteHandlerArgs) {
709
+ function handleDeleteApp({ pathParams, headers }: RouteHandlerArgs) {
698
710
  deleteApp(pathParams?.id as string);
711
+ publishAppsChanged(getOriginClientId(headers));
699
712
  return { success: true };
700
713
  }
701
714
 
@@ -773,7 +786,10 @@ export const ROUTES: RouteDefinition[] = [
773
786
  operationId: "apps_list",
774
787
  endpoint: "apps",
775
788
  method: "GET",
776
- policyKey: "apps",
789
+ policy: {
790
+ requiredScopes: ["settings.read"],
791
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
792
+ },
777
793
  handler: handleListApps,
778
794
  summary: "List apps",
779
795
  description: "Return all locally installed apps.",
@@ -803,7 +819,10 @@ export const ROUTES: RouteDefinition[] = [
803
819
  operationId: "apps_open_bundle",
804
820
  endpoint: "apps/open-bundle",
805
821
  method: "POST",
806
- policyKey: "apps/open-bundle",
822
+ policy: {
823
+ requiredScopes: ["settings.write"],
824
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
825
+ },
807
826
  handler: handleOpenBundle,
808
827
  summary: "Open a .vbundle file",
809
828
  description:
@@ -832,7 +851,10 @@ export const ROUTES: RouteDefinition[] = [
832
851
  operationId: "apps_shared_list",
833
852
  endpoint: "apps/shared",
834
853
  method: "GET",
835
- policyKey: "apps/shared-list",
854
+ policy: {
855
+ requiredScopes: ["settings.read"],
856
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
857
+ },
836
858
  handler: handleListSharedApps,
837
859
  summary: "List shared apps",
838
860
  description: "Return all apps available via cloud share links.",
@@ -861,7 +883,10 @@ export const ROUTES: RouteDefinition[] = [
861
883
  operationId: "apps_fork",
862
884
  endpoint: "apps/fork",
863
885
  method: "POST",
864
- policyKey: "apps/fork",
886
+ policy: {
887
+ requiredScopes: ["settings.write"],
888
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
889
+ },
865
890
  handler: handleForkSharedApp,
866
891
  summary: "Fork a shared app",
867
892
  description: "Create a local copy of a shared app by its UUID.",
@@ -879,7 +904,10 @@ export const ROUTES: RouteDefinition[] = [
879
904
  operationId: "apps_gallery_install",
880
905
  endpoint: "apps/gallery/install",
881
906
  method: "POST",
882
- policyKey: "apps/gallery/install",
907
+ policy: {
908
+ requiredScopes: ["settings.write"],
909
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
910
+ },
883
911
  handler: handleInstallGalleryApp,
884
912
  summary: "Install a gallery app",
885
913
  description: "Install an app from the built-in gallery by its ID.",
@@ -895,7 +923,10 @@ export const ROUTES: RouteDefinition[] = [
895
923
  operationId: "apps_gallery_list",
896
924
  endpoint: "apps/gallery",
897
925
  method: "GET",
898
- policyKey: "apps/gallery",
926
+ policy: {
927
+ requiredScopes: ["settings.read"],
928
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
929
+ },
899
930
  handler: handleListGallery,
900
931
  summary: "List gallery apps",
901
932
  description: "Return the built-in app gallery catalog.",
@@ -929,7 +960,10 @@ export const ROUTES: RouteDefinition[] = [
929
960
  operationId: "apps_import_bundle",
930
961
  endpoint: "apps/import-bundle",
931
962
  method: "POST",
932
- policyKey: "apps/import-bundle",
963
+ policy: {
964
+ requiredScopes: ["settings.write"],
965
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
966
+ },
933
967
  handler: handleImportBundle,
934
968
  summary: "Import a .vbundle file",
935
969
  description:
@@ -957,7 +991,10 @@ export const ROUTES: RouteDefinition[] = [
957
991
  operationId: "apps_sign_bundle",
958
992
  endpoint: "apps/sign-bundle",
959
993
  method: "POST",
960
- policyKey: "apps/sign-bundle",
994
+ policy: {
995
+ requiredScopes: ["settings.write"],
996
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
997
+ },
961
998
  handler: handleSignBundle,
962
999
  summary: "Sign an app bundle",
963
1000
  description:
@@ -980,7 +1017,10 @@ export const ROUTES: RouteDefinition[] = [
980
1017
  operationId: "apps_signing_identity",
981
1018
  endpoint: "apps/signing-identity",
982
1019
  method: "GET",
983
- policyKey: "apps/signing-identity",
1020
+ policy: {
1021
+ requiredScopes: ["settings.read"],
1022
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
1023
+ },
984
1024
  handler: handleSigningIdentity,
985
1025
  summary: "Get signing identity",
986
1026
  description:
@@ -995,7 +1035,10 @@ export const ROUTES: RouteDefinition[] = [
995
1035
  operationId: "apps_data_query",
996
1036
  endpoint: "apps/:id/data",
997
1037
  method: "GET",
998
- policyKey: "apps/data",
1038
+ policy: {
1039
+ requiredScopes: ["settings.read"],
1040
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
1041
+ },
999
1042
  handler: handleQueryAppData,
1000
1043
  summary: "Query app data",
1001
1044
  description: "Read records from an app's local data store.",
@@ -1015,7 +1058,10 @@ export const ROUTES: RouteDefinition[] = [
1015
1058
  operationId: "apps_data_mutate",
1016
1059
  endpoint: "apps/:id/data",
1017
1060
  method: "POST",
1018
- policyKey: "apps/data",
1061
+ policy: {
1062
+ requiredScopes: ["settings.write"],
1063
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
1064
+ },
1019
1065
  handler: handleMutateAppData,
1020
1066
  summary: "Mutate app data",
1021
1067
  description:
@@ -1035,7 +1081,10 @@ export const ROUTES: RouteDefinition[] = [
1035
1081
  operationId: "apps_open",
1036
1082
  endpoint: "apps/:id/open",
1037
1083
  method: "POST",
1038
- policyKey: "apps/open",
1084
+ policy: {
1085
+ requiredScopes: ["settings.write"],
1086
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
1087
+ },
1039
1088
  handler: handleOpenApp,
1040
1089
  summary: "Open an app",
1041
1090
  description: "Compile (if needed) and return the app's HTML for rendering.",
@@ -1051,7 +1100,10 @@ export const ROUTES: RouteDefinition[] = [
1051
1100
  operationId: "apps_delete",
1052
1101
  endpoint: "apps/:id/delete",
1053
1102
  method: "POST",
1054
- policyKey: "apps/delete",
1103
+ policy: {
1104
+ requiredScopes: ["settings.write"],
1105
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
1106
+ },
1055
1107
  handler: handleDeleteApp,
1056
1108
  summary: "Delete an app",
1057
1109
  description: "Permanently remove an app and its data.",
@@ -1062,7 +1114,10 @@ export const ROUTES: RouteDefinition[] = [
1062
1114
  operationId: "apps_preview_get",
1063
1115
  endpoint: "apps/:id/preview",
1064
1116
  method: "GET",
1065
- policyKey: "apps/preview",
1117
+ policy: {
1118
+ requiredScopes: ["settings.read"],
1119
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
1120
+ },
1066
1121
  handler: handleGetPreview,
1067
1122
  summary: "Get app preview",
1068
1123
  description: "Return the preview image or HTML for an app.",
@@ -1076,7 +1131,10 @@ export const ROUTES: RouteDefinition[] = [
1076
1131
  operationId: "apps_preview_update",
1077
1132
  endpoint: "apps/:id/preview",
1078
1133
  method: "PUT",
1079
- policyKey: "apps/preview",
1134
+ policy: {
1135
+ requiredScopes: ["settings.write"],
1136
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
1137
+ },
1080
1138
  handler: handleUpdatePreview,
1081
1139
  summary: "Update app preview",
1082
1140
  description: "Set a new preview image or HTML for an app.",
@@ -1093,7 +1151,10 @@ export const ROUTES: RouteDefinition[] = [
1093
1151
  operationId: "apps_history",
1094
1152
  endpoint: "apps/:id/history",
1095
1153
  method: "GET",
1096
- policyKey: "apps/history",
1154
+ policy: {
1155
+ requiredScopes: ["settings.read"],
1156
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
1157
+ },
1097
1158
  handler: handleGetHistory,
1098
1159
  summary: "Get app version history",
1099
1160
  description: "Return the git commit history of an app.",
@@ -1114,7 +1175,10 @@ export const ROUTES: RouteDefinition[] = [
1114
1175
  operationId: "apps_diff",
1115
1176
  endpoint: "apps/:id/diff",
1116
1177
  method: "GET",
1117
- policyKey: "apps/diff",
1178
+ policy: {
1179
+ requiredScopes: ["settings.read"],
1180
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
1181
+ },
1118
1182
  handler: handleGetDiff,
1119
1183
  summary: "Get app diff",
1120
1184
  description: "Return a git diff between two commits for an app.",
@@ -1132,7 +1196,10 @@ export const ROUTES: RouteDefinition[] = [
1132
1196
  operationId: "apps_restore",
1133
1197
  endpoint: "apps/:id/restore",
1134
1198
  method: "POST",
1135
- policyKey: "apps/restore",
1199
+ policy: {
1200
+ requiredScopes: ["settings.write"],
1201
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
1202
+ },
1136
1203
  handler: handleRestore,
1137
1204
  summary: "Restore app version",
1138
1205
  description: "Restore an app to a previous git commit.",
@@ -1144,7 +1211,10 @@ export const ROUTES: RouteDefinition[] = [
1144
1211
  operationId: "apps_bundle",
1145
1212
  endpoint: "apps/:id/bundle",
1146
1213
  method: "POST",
1147
- policyKey: "apps/bundle",
1214
+ policy: {
1215
+ requiredScopes: ["settings.write"],
1216
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
1217
+ },
1148
1218
  handler: handleBundle,
1149
1219
  summary: "Bundle an app",
1150
1220
  description: "Package an app into a distributable .vbundle archive.",
@@ -1160,7 +1230,10 @@ export const ROUTES: RouteDefinition[] = [
1160
1230
  operationId: "apps_share_cloud",
1161
1231
  endpoint: "apps/:id/share-cloud",
1162
1232
  method: "POST",
1163
- policyKey: "apps/share-cloud",
1233
+ policy: {
1234
+ requiredScopes: ["settings.write"],
1235
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
1236
+ },
1164
1237
  handler: handleShareCloud,
1165
1238
  summary: "Share app to cloud",
1166
1239
  description: "Package and upload an app to the cloud share service.",