@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
@@ -19,6 +19,7 @@ import {
19
19
  loadCheckpoints,
20
20
  rollbackWorkspaceMigrations,
21
21
  } from "../../workspace/migrations/runner.js";
22
+ import { GATEWAY_PRINCIPALS } from "../auth/route-policy.js";
22
23
  import { BadRequestError, InternalError } from "./errors.js";
23
24
  import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
24
25
 
@@ -160,11 +161,14 @@ export const ROUTES: RouteDefinition[] = [
160
161
  operationId: "admin_rollbackmigrations_post",
161
162
  endpoint: "admin/rollback-migrations",
162
163
  method: "POST",
164
+ policy: {
165
+ requiredScopes: ["internal.write"],
166
+ allowedPrincipalTypes: GATEWAY_PRINCIPALS,
167
+ },
163
168
  summary: "Rollback migrations",
164
169
  description:
165
170
  "Roll back DB and/or workspace migrations to a specified target version. Restricted to gateway service principals.",
166
171
  tags: ["admin"],
167
- requirePolicyEnforcement: true,
168
172
  handler: handleRollbackMigrations,
169
173
  requestBody: z.object({
170
174
  targetDbVersion: z
@@ -41,6 +41,7 @@ import { getLogger } from "../../util/logger.js";
41
41
  import { getWorkspaceDir, getWorkspaceHooksDir } from "../../util/platform.js";
42
42
  import { APP_VERSION } from "../../version.js";
43
43
  import { DAEMON_INTERNAL_ASSISTANT_ID } from "../assistant-scope.js";
44
+ import { ACTOR_PRINCIPALS } from "../auth/route-policy.js";
44
45
  import {
45
46
  validateGcsSignedUrl,
46
47
  type ValidateGcsSignedUrlOptions,
@@ -1852,6 +1853,10 @@ export const ROUTES: RouteDefinition[] = [
1852
1853
  operationId: "migrations_validate_post",
1853
1854
  endpoint: "migrations/validate",
1854
1855
  method: "POST",
1856
+ policy: {
1857
+ requiredScopes: ["settings.read"],
1858
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
1859
+ },
1855
1860
  summary: "Validate a .vbundle archive",
1856
1861
  description:
1857
1862
  "Upload a .vbundle archive for validation. Accepts raw binary or multipart form data.",
@@ -1867,6 +1872,10 @@ export const ROUTES: RouteDefinition[] = [
1867
1872
  operationId: "migrations_export_post",
1868
1873
  endpoint: "migrations/export",
1869
1874
  method: "POST",
1875
+ policy: {
1876
+ requiredScopes: ["settings.write"],
1877
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
1878
+ },
1870
1879
  summary: "Export a .vbundle archive",
1871
1880
  description:
1872
1881
  "Generate and download a .vbundle archive of the assistant's data. Optional JSON body for metadata.",
@@ -1880,6 +1889,10 @@ export const ROUTES: RouteDefinition[] = [
1880
1889
  operationId: "migrations_importpreflight_post",
1881
1890
  endpoint: "migrations/import-preflight",
1882
1891
  method: "POST",
1892
+ policy: {
1893
+ requiredScopes: ["settings.write"],
1894
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
1895
+ },
1883
1896
  summary: "Dry-run import analysis",
1884
1897
  description:
1885
1898
  "Validate a .vbundle archive and return a report of what would change on import without modifying data.",
@@ -1897,6 +1910,10 @@ export const ROUTES: RouteDefinition[] = [
1897
1910
  operationId: "migrations_import_post",
1898
1911
  endpoint: "migrations/import",
1899
1912
  method: "POST",
1913
+ policy: {
1914
+ requiredScopes: ["settings.write"],
1915
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
1916
+ },
1900
1917
  summary: "Import a .vbundle archive",
1901
1918
  description:
1902
1919
  "Commit a .vbundle archive import to disk — destructive. Accepts the bundle as raw bytes (application/octet-stream), multipart/form-data, or a JSON body with `{ url }` carrying a signed URL the daemon fetches.",
@@ -1927,6 +1944,10 @@ export const ROUTES: RouteDefinition[] = [
1927
1944
  operationId: "migrations_exporttogcs_post",
1928
1945
  endpoint: "migrations/export-to-gcs",
1929
1946
  method: "POST",
1947
+ policy: {
1948
+ requiredScopes: ["settings.write"],
1949
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
1950
+ },
1930
1951
  summary: "Start an async export streamed to a GCS signed URL",
1931
1952
  description:
1932
1953
  "Kick off a background export job that PUTs a freshly-built .vbundle archive to the supplied GCS signed URL. Returns 202 with a job_id the caller can poll via the job-status endpoint. Fails fast with 409 if another export job is already pending or running.",
@@ -1953,6 +1974,10 @@ export const ROUTES: RouteDefinition[] = [
1953
1974
  operationId: "migrations_importfromgcs_post",
1954
1975
  endpoint: "migrations/import-from-gcs",
1955
1976
  method: "POST",
1977
+ policy: {
1978
+ requiredScopes: ["settings.write"],
1979
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
1980
+ },
1956
1981
  summary: "Start an async .vbundle import from a signed GCS URL",
1957
1982
  description:
1958
1983
  "Schedule a background import job that fetches the bundle at `bundle_url` and streams it through the importer. Returns 202 with a `job_id`; poll `GET /v1/migrations/jobs/{job_id}` for status. 409 if another import is already in flight.",
@@ -1977,6 +2002,10 @@ export const ROUTES: RouteDefinition[] = [
1977
2002
  operationId: "migrations_jobs_by_job_id_get",
1978
2003
  endpoint: "migrations/jobs/:job_id",
1979
2004
  method: "GET",
2005
+ policy: {
2006
+ requiredScopes: ["settings.read"],
2007
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
2008
+ },
1980
2009
  summary: "Get migration job status",
1981
2010
  description:
1982
2011
  "Return the current status of an async migration job (export or import). The response discriminates on `status`: `processing` (pending or running), `complete` (with `result`), or `failed` (with `error`, `error_code`, optional `upstream_status`).",
@@ -12,6 +12,7 @@ import { editNotification } from "../../notifications/edit-notification.js";
12
12
  import { emitNotificationSignal } from "../../notifications/emit-signal.js";
13
13
  import { listEvents } from "../../notifications/events-store.js";
14
14
  import type { AttentionHints } from "../../notifications/signal.js";
15
+ import { ACTOR_PRINCIPALS, LOCAL_PRINCIPALS } from "../auth/route-policy.js";
15
16
  import { BadRequestError, NotFoundError } from "./errors.js";
16
17
  import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
17
18
 
@@ -196,6 +197,10 @@ export const ROUTES: RouteDefinition[] = [
196
197
  operationId: "emit_notification_signal",
197
198
  endpoint: "notifications/emit",
198
199
  method: "POST",
200
+ policy: {
201
+ requiredScopes: ["settings.write"],
202
+ allowedPrincipalTypes: LOCAL_PRINCIPALS,
203
+ },
199
204
  handler: handleEmitSignal,
200
205
  summary: "Emit a notification signal",
201
206
  description:
@@ -213,6 +218,10 @@ export const ROUTES: RouteDefinition[] = [
213
218
  operationId: "edit_notification",
214
219
  endpoint: "notifications/edit",
215
220
  method: "POST",
221
+ policy: {
222
+ requiredScopes: ["settings.write"],
223
+ allowedPrincipalTypes: LOCAL_PRINCIPALS,
224
+ },
216
225
  handler: handleEditNotification,
217
226
  summary: "Edit an already-sent notification",
218
227
  description:
@@ -241,6 +250,10 @@ export const ROUTES: RouteDefinition[] = [
241
250
  operationId: "list_notification_events",
242
251
  endpoint: "notifications/events",
243
252
  method: "POST",
253
+ policy: {
254
+ requiredScopes: ["settings.read"],
255
+ allowedPrincipalTypes: LOCAL_PRINCIPALS,
256
+ },
244
257
  handler: handleListEvents,
245
258
  summary: "List notification events",
246
259
  description:
@@ -263,11 +276,14 @@ export const ROUTES: RouteDefinition[] = [
263
276
  operationId: "notificationintentresult_post",
264
277
  endpoint: "notification-intent-result",
265
278
  method: "POST",
279
+ policy: {
280
+ requiredScopes: ["settings.write"],
281
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
282
+ },
266
283
  summary: "Report notification delivery result",
267
284
  description:
268
285
  "Client acknowledgment for local notification delivery outcome.",
269
286
  tags: ["notifications"],
270
- requirePolicyEnforcement: true,
271
287
  handler: handleNotificationIntentResult,
272
288
  requestBody: z.object({
273
289
  deliveryId: z.string().describe("Notification delivery ID"),
@@ -21,6 +21,7 @@ import {
21
21
  upsertApp,
22
22
  } from "../../oauth/oauth-store.js";
23
23
  import { serializeProviderSummary } from "../../oauth/provider-serializer.js";
24
+ import { ACTOR_PRINCIPALS } from "../auth/route-policy.js";
24
25
  import {
25
26
  BadRequestError,
26
27
  InternalError,
@@ -305,10 +306,13 @@ export const ROUTES: RouteDefinition[] = [
305
306
  operationId: "oauth_apps_get",
306
307
  endpoint: "oauth/apps",
307
308
  method: "GET",
309
+ policy: {
310
+ requiredScopes: ["settings.read"],
311
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
312
+ },
308
313
  summary: "List OAuth apps",
309
314
  description: "List OAuth apps filtered by provider_key.",
310
315
  tags: ["oauth"],
311
- requirePolicyEnforcement: true,
312
316
  queryParams: [
313
317
  {
314
318
  name: "provider_key",
@@ -323,11 +327,14 @@ export const ROUTES: RouteDefinition[] = [
323
327
  operationId: "oauth_apps_by_query_get",
324
328
  endpoint: "oauth/apps/lookup",
325
329
  method: "GET",
330
+ policy: {
331
+ requiredScopes: ["settings.read"],
332
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
333
+ },
326
334
  summary: "Get OAuth app",
327
335
  description:
328
336
  "Look up a single OAuth app by ID, provider + client_id, or provider (most recent).",
329
337
  tags: ["oauth"],
330
- requirePolicyEnforcement: true,
331
338
  queryParams: [
332
339
  {
333
340
  name: "id",
@@ -351,23 +358,27 @@ export const ROUTES: RouteDefinition[] = [
351
358
  operationId: "oauth_apps_upsert",
352
359
  endpoint: "oauth/apps/upsert",
353
360
  method: "POST",
354
- policyKey: "oauth/apps.upsert",
361
+ policy: {
362
+ requiredScopes: ["settings.write"],
363
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
364
+ },
355
365
  summary: "Upsert OAuth app",
356
366
  description:
357
367
  "Create or return an existing OAuth app registration. Updates client secret if provided.",
358
368
  tags: ["oauth"],
359
- requirePolicyEnforcement: true,
360
369
  handler: handleUpsertApp,
361
370
  },
362
371
  {
363
372
  operationId: "oauth_apps_post",
364
373
  endpoint: "oauth/apps",
365
374
  method: "POST",
366
- policyKey: "oauth/apps.create",
375
+ policy: {
376
+ requiredScopes: ["settings.write"],
377
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
378
+ },
367
379
  summary: "Create OAuth app",
368
380
  description: "Register a new OAuth app with client credentials.",
369
381
  tags: ["oauth"],
370
- requirePolicyEnforcement: true,
371
382
  responseStatus: "201",
372
383
  handler: handleCreateApp,
373
384
  },
@@ -375,42 +386,53 @@ export const ROUTES: RouteDefinition[] = [
375
386
  operationId: "oauth_apps_delete",
376
387
  endpoint: "oauth/apps/:id",
377
388
  method: "DELETE",
378
- policyKey: "oauth/apps.delete",
389
+ policy: {
390
+ requiredScopes: ["settings.write"],
391
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
392
+ },
379
393
  summary: "Delete OAuth app",
380
394
  description:
381
395
  "Delete an OAuth app and disconnect all its connections.",
382
396
  tags: ["oauth"],
383
- requirePolicyEnforcement: true,
384
397
  handler: handleDeleteApp,
385
398
  },
386
399
  {
387
400
  operationId: "oauth_apps_connections_get",
388
401
  endpoint: "oauth/apps/:appId/connections",
389
402
  method: "GET",
403
+ policy: {
404
+ requiredScopes: ["settings.read"],
405
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
406
+ },
390
407
  summary: "List OAuth connections",
391
408
  description: "List connections for an OAuth app.",
392
409
  tags: ["oauth"],
393
- requirePolicyEnforcement: true,
394
410
  handler: handleListConnections,
395
411
  },
396
412
  {
397
413
  operationId: "oauth_connections_delete",
398
414
  endpoint: "oauth/connections/:id",
399
415
  method: "DELETE",
416
+ policy: {
417
+ requiredScopes: ["settings.write"],
418
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
419
+ },
400
420
  summary: "Disconnect OAuth connection",
401
421
  description: "Disconnect a single OAuth connection.",
402
422
  tags: ["oauth"],
403
- requirePolicyEnforcement: true,
404
423
  handler: handleDeleteConnection,
405
424
  },
406
425
  {
407
426
  operationId: "oauth_apps_connect_post",
408
427
  endpoint: "oauth/apps/:appId/connect",
409
428
  method: "POST",
429
+ policy: {
430
+ requiredScopes: ["settings.write"],
431
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
432
+ },
410
433
  summary: "Start OAuth connect",
411
434
  description: "Start an OAuth connect flow for an app.",
412
435
  tags: ["oauth"],
413
- requirePolicyEnforcement: true,
414
436
  handler: handleConnectApp,
415
437
  },
416
438
  ];
@@ -38,6 +38,7 @@ import { VellumPlatformClient } from "../../platform/client.js";
38
38
  import { withValidToken } from "../../security/token-manager.js";
39
39
  import { matchHostPattern } from "../../tools/credentials/host-pattern-match.js";
40
40
  import { getLogger } from "../../util/logger.js";
41
+ import { LOCAL_PRINCIPALS } from "../auth/route-policy.js";
41
42
  import { BadRequestError, InternalError, NotFoundError } from "./errors.js";
42
43
  import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
43
44
 
@@ -977,23 +978,28 @@ export const ROUTES: RouteDefinition[] = [
977
978
  operationId: "oauth_disconnect",
978
979
  endpoint: "oauth/disconnect",
979
980
  method: "POST",
980
- policyKey: "oauth/disconnect",
981
+ policy: {
982
+ requiredScopes: ["settings.write"],
983
+ allowedPrincipalTypes: LOCAL_PRINCIPALS,
984
+ },
981
985
  summary: "Disconnect OAuth provider",
982
986
  description:
983
987
  "Disconnect an OAuth provider and remove associated credentials (BYO or managed).",
984
988
  tags: ["oauth"],
985
- requirePolicyEnforcement: true,
986
989
  handler: handleDisconnect,
987
990
  },
988
991
  {
989
992
  operationId: "oauth_mode_get",
990
993
  endpoint: "oauth/mode",
991
994
  method: "GET",
995
+ policy: {
996
+ requiredScopes: ["settings.read"],
997
+ allowedPrincipalTypes: LOCAL_PRINCIPALS,
998
+ },
992
999
  summary: "Get OAuth mode",
993
1000
  description:
994
1001
  "Get the current OAuth mode (managed or your-own) for a provider.",
995
1002
  tags: ["oauth"],
996
- requirePolicyEnforcement: true,
997
1003
  queryParams: [
998
1004
  {
999
1005
  name: "provider",
@@ -1008,22 +1014,27 @@ export const ROUTES: RouteDefinition[] = [
1008
1014
  operationId: "oauth_mode_set",
1009
1015
  endpoint: "oauth/mode",
1010
1016
  method: "POST",
1011
- policyKey: "oauth/mode.set",
1017
+ policy: {
1018
+ requiredScopes: ["settings.write"],
1019
+ allowedPrincipalTypes: LOCAL_PRINCIPALS,
1020
+ },
1012
1021
  summary: "Set OAuth mode",
1013
1022
  description: "Set the OAuth mode (managed or your-own) for a provider.",
1014
1023
  tags: ["oauth"],
1015
- requirePolicyEnforcement: true,
1016
1024
  handler: handleModeSet,
1017
1025
  },
1018
1026
  {
1019
1027
  operationId: "oauth_status",
1020
1028
  endpoint: "oauth/status",
1021
1029
  method: "GET",
1030
+ policy: {
1031
+ requiredScopes: ["settings.read"],
1032
+ allowedPrincipalTypes: LOCAL_PRINCIPALS,
1033
+ },
1022
1034
  summary: "Get OAuth status",
1023
1035
  description:
1024
1036
  "Show OAuth connection status for a specified provider (BYO or managed).",
1025
1037
  tags: ["oauth"],
1026
- requirePolicyEnforcement: true,
1027
1038
  queryParams: [
1028
1039
  {
1029
1040
  name: "provider",
@@ -1038,57 +1049,69 @@ export const ROUTES: RouteDefinition[] = [
1038
1049
  operationId: "oauth_ping",
1039
1050
  endpoint: "oauth/ping",
1040
1051
  method: "POST",
1052
+ policy: {
1053
+ requiredScopes: ["settings.read"],
1054
+ allowedPrincipalTypes: LOCAL_PRINCIPALS,
1055
+ },
1041
1056
  summary: "Ping OAuth provider",
1042
1057
  description:
1043
1058
  "Verify an OAuth token is valid by hitting the provider's configured health-check endpoint.",
1044
1059
  tags: ["oauth"],
1045
- requirePolicyEnforcement: true,
1046
1060
  handler: handlePing,
1047
1061
  },
1048
1062
  {
1049
1063
  operationId: "oauth_token",
1050
1064
  endpoint: "oauth/token",
1051
1065
  method: "POST",
1052
- policyKey: "oauth/token",
1066
+ policy: {
1067
+ requiredScopes: ["settings.read"],
1068
+ allowedPrincipalTypes: LOCAL_PRINCIPALS,
1069
+ },
1053
1070
  summary: "Get OAuth token",
1054
1071
  description: "Retrieve a valid OAuth access token for a BYO-mode provider.",
1055
1072
  tags: ["oauth"],
1056
- requirePolicyEnforcement: true,
1057
1073
  handler: handleToken,
1058
1074
  },
1059
1075
  {
1060
1076
  operationId: "oauth_request",
1061
1077
  endpoint: "oauth/request",
1062
1078
  method: "POST",
1063
- policyKey: "oauth/request",
1079
+ policy: {
1080
+ requiredScopes: ["settings.write"],
1081
+ allowedPrincipalTypes: LOCAL_PRINCIPALS,
1082
+ },
1064
1083
  summary: "Make authenticated OAuth request",
1065
1084
  description:
1066
1085
  "Make an authenticated HTTP request through an OAuth connection (supports curl-like interface).",
1067
1086
  tags: ["oauth"],
1068
- requirePolicyEnforcement: true,
1069
1087
  handler: handleRequest,
1070
1088
  },
1071
1089
  {
1072
1090
  operationId: "oauth_managed_connect_start",
1073
1091
  endpoint: "oauth/managed-connect/start",
1074
1092
  method: "POST",
1075
- policyKey: "oauth/managed-connect.start",
1093
+ policy: {
1094
+ requiredScopes: ["settings.write"],
1095
+ allowedPrincipalTypes: LOCAL_PRINCIPALS,
1096
+ },
1076
1097
  summary: "Start managed OAuth connect",
1077
1098
  description:
1078
1099
  "Start a managed (platform) OAuth connect flow and return the connect URL.",
1079
1100
  tags: ["oauth"],
1080
- requirePolicyEnforcement: true,
1081
1101
  handler: handleManagedConnect,
1082
1102
  },
1083
1103
  {
1084
1104
  operationId: "oauth_managed_connect_poll",
1085
1105
  endpoint: "oauth/managed-connect/poll",
1086
1106
  method: "GET",
1107
+ policy: {
1108
+ requiredScopes: ["settings.read"],
1109
+ allowedPrincipalTypes: LOCAL_PRINCIPALS,
1110
+ },
1087
1111
  summary: "Poll managed OAuth connections",
1088
1112
  description:
1089
1113
  "Fetch active platform connections for a provider (used to detect new connections after managed connect).",
1090
1114
  tags: ["oauth"],
1091
- requirePolicyEnforcement: true,
1092
1115
  queryParams: [
1093
1116
  {
1094
1117
  name: "provider",
@@ -21,6 +21,7 @@ import {
21
21
  getProvider,
22
22
  } from "../../oauth/oauth-store.js";
23
23
  import { getLogger } from "../../util/logger.js";
24
+ import { GATEWAY_PRINCIPALS } from "../auth/route-policy.js";
24
25
  import { BadRequestError, InternalError, NotFoundError } from "./errors.js";
25
26
  import type { RouteDefinition } from "./types.js";
26
27
 
@@ -185,6 +186,10 @@ export const ROUTES: RouteDefinition[] = [
185
186
  operationId: "internal_oauth_connect_start",
186
187
  endpoint: "internal/oauth/connect/start",
187
188
  method: "POST",
189
+ policy: {
190
+ requiredScopes: ["internal.write"],
191
+ allowedPrincipalTypes: GATEWAY_PRINCIPALS,
192
+ },
188
193
  summary: "Start daemon-owned OAuth connect flow",
189
194
  description:
190
195
  "Starts an OAuth connect flow in the daemon and returns the authorization URL for the CLI to open in the browser.",
@@ -202,6 +207,10 @@ export const ROUTES: RouteDefinition[] = [
202
207
  operationId: "internal_oauth_connect_status",
203
208
  endpoint: "internal/oauth/connect/status/:state",
204
209
  method: "GET",
210
+ policy: {
211
+ requiredScopes: ["internal.write"],
212
+ allowedPrincipalTypes: GATEWAY_PRINCIPALS,
213
+ },
205
214
  summary: "Poll daemon OAuth connect flow status",
206
215
  description:
207
216
  "Returns the current status of an in-flight daemon-owned OAuth connect flow (pending/complete/error).",
@@ -9,6 +9,7 @@
9
9
  import { z } from "zod";
10
10
 
11
11
  import { getConfig, invalidateConfigCache } from "../../config/loader.js";
12
+ import { LOCAL_PRINCIPALS } from "../auth/route-policy.js";
12
13
  import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
13
14
 
14
15
  // ── Handlers ──────────────────────────────────────────────────────────
@@ -30,7 +31,10 @@ export const ROUTES: RouteDefinition[] = [
30
31
  operationId: "oauth_connection_changed",
31
32
  endpoint: "oauth/connection-changed",
32
33
  method: "POST",
33
- policyKey: "oauth/connection-changed",
34
+ policy: {
35
+ requiredScopes: ["settings.write"],
36
+ allowedPrincipalTypes: LOCAL_PRINCIPALS,
37
+ },
34
38
  handler: handleOAuthConnectionChanged,
35
39
  summary: "Notify the assistant that an OAuth connection changed",
36
40
  description:
@@ -7,6 +7,7 @@
7
7
  */
8
8
 
9
9
  import { loadConfig } from "../../config/loader.js";
10
+ import { getOAuthCallbackUrl } from "../../inbound/public-ingress-urls.js";
10
11
  import {
11
12
  deleteApp,
12
13
  deleteConnection,
@@ -25,6 +26,7 @@ import {
25
26
  } from "../../oauth/provider-serializer.js";
26
27
  import { isProviderVisible } from "../../oauth/provider-visibility.js";
27
28
  import { SEEDED_PROVIDER_KEYS } from "../../oauth/seed-providers.js";
29
+ import { ACTOR_PRINCIPALS } from "../auth/route-policy.js";
28
30
  import {
29
31
  BadRequestError,
30
32
  ConflictError,
@@ -84,13 +86,24 @@ function handleGetProvider({ pathParams = {} }: RouteHandlerArgs) {
84
86
  );
85
87
  }
86
88
 
87
- if (!isProviderVisible(row, loadConfig())) {
89
+ const config = loadConfig();
90
+ if (!isProviderVisible(row, config)) {
88
91
  throw new NotFoundError(
89
92
  `No OAuth provider registered for "${providerKey}"`,
90
93
  );
91
94
  }
92
95
 
93
- return { provider: serializeProviderFull(row) };
96
+ let oauthCallbackUrl: string | null = null;
97
+ try {
98
+ oauthCallbackUrl = getOAuthCallbackUrl(config);
99
+ } catch {
100
+ // Ingress not configured or disabled — callback URL unavailable
101
+ }
102
+
103
+ return {
104
+ provider: serializeProviderFull(row),
105
+ oauth_callback_url: oauthCallbackUrl,
106
+ };
94
107
  }
95
108
 
96
109
  function handleRegisterProvider({ body = {} }: RouteHandlerArgs) {
@@ -313,11 +326,14 @@ export const ROUTES: RouteDefinition[] = [
313
326
  operationId: "oauth_providers_get",
314
327
  endpoint: "oauth/providers",
315
328
  method: "GET",
329
+ policy: {
330
+ requiredScopes: ["settings.read"],
331
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
332
+ },
316
333
  summary: "List OAuth providers",
317
334
  description:
318
335
  "List all registered OAuth providers with optional filtering.",
319
336
  tags: ["oauth"],
320
- requirePolicyEnforcement: true,
321
337
  handler: handleListProviders,
322
338
  queryParams: [
323
339
  {
@@ -331,21 +347,26 @@ export const ROUTES: RouteDefinition[] = [
331
347
  operationId: "oauth_providers_by_providerKey_get",
332
348
  endpoint: "oauth/providers/:providerKey",
333
349
  method: "GET",
350
+ policy: {
351
+ requiredScopes: ["settings.read"],
352
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
353
+ },
334
354
  summary: "Get OAuth provider",
335
355
  description: "Get a single OAuth provider by key.",
336
356
  tags: ["oauth"],
337
- requirePolicyEnforcement: true,
338
357
  handler: handleGetProvider,
339
358
  },
340
359
  {
341
360
  operationId: "oauth_providers_post",
342
361
  endpoint: "oauth/providers",
343
362
  method: "POST",
344
- policyKey: "oauth/providers.register",
363
+ policy: {
364
+ requiredScopes: ["settings.write"],
365
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
366
+ },
345
367
  summary: "Register OAuth provider",
346
368
  description: "Register a new OAuth provider configuration.",
347
369
  tags: ["oauth"],
348
- requirePolicyEnforcement: true,
349
370
  responseStatus: "201",
350
371
  handler: handleRegisterProvider,
351
372
  },
@@ -353,23 +374,27 @@ export const ROUTES: RouteDefinition[] = [
353
374
  operationId: "oauth_providers_by_providerKey_patch",
354
375
  endpoint: "oauth/providers/:providerKey",
355
376
  method: "PATCH",
356
- policyKey: "oauth/providers.update",
377
+ policy: {
378
+ requiredScopes: ["settings.write"],
379
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
380
+ },
357
381
  summary: "Update OAuth provider",
358
382
  description: "Update an existing custom OAuth provider configuration.",
359
383
  tags: ["oauth"],
360
- requirePolicyEnforcement: true,
361
384
  handler: handleUpdateProvider,
362
385
  },
363
386
  {
364
387
  operationId: "oauth_providers_by_providerKey_delete",
365
388
  endpoint: "oauth/providers/:providerKey",
366
389
  method: "DELETE",
367
- policyKey: "oauth/providers.delete",
390
+ policy: {
391
+ requiredScopes: ["settings.write"],
392
+ allowedPrincipalTypes: ACTOR_PRINCIPALS,
393
+ },
368
394
  summary: "Delete OAuth provider",
369
395
  description:
370
396
  "Delete a custom OAuth provider and optionally cascade-delete its apps and connections.",
371
397
  tags: ["oauth"],
372
- requirePolicyEnforcement: true,
373
398
  handler: handleDeleteProvider,
374
399
  },
375
400
  ];
@@ -27,6 +27,7 @@ import {
27
27
  } from "../../security/secure-keys.js";
28
28
  import { buildAssistantEvent } from "../assistant-event.js";
29
29
  import { assistantEventHub } from "../assistant-event-hub.js";
30
+ import { LOCAL_PRINCIPALS } from "../auth/route-policy.js";
30
31
  import {
31
32
  BadRequestError,
32
33
  InternalError,
@@ -287,6 +288,10 @@ export const ROUTES: RouteDefinition[] = [
287
288
  operationId: "platform_status",
288
289
  endpoint: "platform/status",
289
290
  method: "GET",
291
+ policy: {
292
+ requiredScopes: ["settings.read"],
293
+ allowedPrincipalTypes: LOCAL_PRINCIPALS,
294
+ },
290
295
  summary: "Get platform deployment context and connection status",
291
296
  description:
292
297
  "Aggregates platform context, credentials, assistant ID, webhook secret, and Velay tunnel status.",
@@ -297,6 +302,10 @@ export const ROUTES: RouteDefinition[] = [
297
302
  operationId: "platform_connect",
298
303
  endpoint: "platform/connect",
299
304
  method: "POST",
305
+ policy: {
306
+ requiredScopes: ["settings.write"],
307
+ allowedPrincipalTypes: LOCAL_PRINCIPALS,
308
+ },
300
309
  summary: "Connect to the Vellum Platform",
301
310
  description:
302
311
  "Checks existing credentials and emits the show_platform_login signal for connected clients to show a login UI.",
@@ -307,6 +316,10 @@ export const ROUTES: RouteDefinition[] = [
307
316
  operationId: "platform_disconnect",
308
317
  endpoint: "platform/disconnect",
309
318
  method: "POST",
319
+ policy: {
320
+ requiredScopes: ["settings.write"],
321
+ allowedPrincipalTypes: LOCAL_PRINCIPALS,
322
+ },
310
323
  summary: "Disconnect from the Vellum Platform",
311
324
  description:
312
325
  "Deletes stored platform credentials and emits platform_disconnected signal to connected clients.",
@@ -317,6 +330,10 @@ export const ROUTES: RouteDefinition[] = [
317
330
  operationId: "platform_callback_routes_register",
318
331
  endpoint: "platform/callback-routes/register",
319
332
  method: "POST",
333
+ policy: {
334
+ requiredScopes: ["settings.write"],
335
+ allowedPrincipalTypes: LOCAL_PRINCIPALS,
336
+ },
320
337
  summary: "Register a platform callback route",
321
338
  description:
322
339
  "Registers a callback route with the platform gateway for inbound provider webhooks.",
@@ -327,6 +344,10 @@ export const ROUTES: RouteDefinition[] = [
327
344
  operationId: "platform_callback_routes_list",
328
345
  endpoint: "platform/callback-routes",
329
346
  method: "GET",
347
+ policy: {
348
+ requiredScopes: ["settings.read"],
349
+ allowedPrincipalTypes: LOCAL_PRINCIPALS,
350
+ },
330
351
  summary: "List registered platform callback routes",
331
352
  description:
332
353
  "Lists all callback routes registered with the platform for this assistant.",