@vellumai/assistant 0.4.56 → 0.5.0

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 (457) hide show
  1. package/ARCHITECTURE.md +10 -10
  2. package/Dockerfile +3 -0
  3. package/README.md +11 -11
  4. package/docs/architecture/integrations.md +2 -2
  5. package/docs/architecture/memory.md +3 -4
  6. package/docs/credential-execution-service.md +13 -20
  7. package/node_modules/@vellumai/ces-contracts/src/error.ts +5 -4
  8. package/package.json +1 -1
  9. package/src/__tests__/actor-token-service.test.ts +7 -7
  10. package/src/__tests__/anthropic-provider.test.ts +172 -0
  11. package/src/__tests__/app-builder-tool-scripts.test.ts +15 -1
  12. package/src/__tests__/approval-cascade.test.ts +2 -2
  13. package/src/__tests__/approval-routes-http.test.ts +3 -4
  14. package/src/__tests__/asset-materialize-tool.test.ts +5 -5
  15. package/src/__tests__/asset-search-tool.test.ts +1 -1
  16. package/src/__tests__/assistant-attachments.test.ts +5 -5
  17. package/src/__tests__/assistant-events-sse-hardening.test.ts +1 -1
  18. package/src/__tests__/assistant-feature-flags-integration.test.ts +50 -38
  19. package/src/__tests__/attachments-store.test.ts +2 -2
  20. package/src/__tests__/avatar-e2e.test.ts +5 -3
  21. package/src/__tests__/browser-skill-endstate.test.ts +0 -1
  22. package/src/__tests__/call-routes-http.test.ts +2 -2
  23. package/src/__tests__/callback-handoff-copy.test.ts +1 -1
  24. package/src/__tests__/cancel-resolves-conversation-key.test.ts +158 -0
  25. package/src/__tests__/channel-readiness-routes.test.ts +0 -1
  26. package/src/__tests__/channel-readiness-service.test.ts +0 -1
  27. package/src/__tests__/checker.test.ts +31 -32
  28. package/src/__tests__/chrome-cdp.test.ts +47 -18
  29. package/src/__tests__/claude-code-skill-regression.test.ts +2 -2
  30. package/src/__tests__/config-schema-cmd.test.ts +2 -2
  31. package/src/__tests__/config-schema.test.ts +9 -18
  32. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +1 -1
  33. package/src/__tests__/conversation-abort-tool-results.test.ts +4 -4
  34. package/src/__tests__/conversation-agent-loop-overflow.test.ts +2 -2
  35. package/src/__tests__/conversation-agent-loop.test.ts +11 -4
  36. package/src/__tests__/conversation-attachments.test.ts +1 -1
  37. package/src/__tests__/conversation-confirmation-signals.test.ts +2 -2
  38. package/src/__tests__/conversation-error.test.ts +33 -0
  39. package/src/__tests__/conversation-init.benchmark.test.ts +0 -1
  40. package/src/__tests__/conversation-load-history-repair.test.ts +1 -1
  41. package/src/__tests__/conversation-pairing.test.ts +1 -1
  42. package/src/__tests__/conversation-pre-run-repair.test.ts +4 -4
  43. package/src/__tests__/conversation-provider-retry-repair.test.ts +4 -4
  44. package/src/__tests__/conversation-queue.test.ts +23 -14
  45. package/src/__tests__/conversation-routes-slash-commands.test.ts +3 -3
  46. package/src/__tests__/conversation-runtime-assembly.test.ts +204 -185
  47. package/src/__tests__/conversation-seed-composer.test.ts +1 -1
  48. package/src/__tests__/conversation-slash-queue.test.ts +4 -4
  49. package/src/__tests__/conversation-slash-unknown.test.ts +4 -4
  50. package/src/__tests__/conversation-starter-routes.test.ts +291 -0
  51. package/src/__tests__/conversation-wipe.test.ts +438 -0
  52. package/src/__tests__/conversation-workspace-cache-state.test.ts +2 -3
  53. package/src/__tests__/conversation-workspace-injection.test.ts +4 -5
  54. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +4 -5
  55. package/src/__tests__/credential-security-e2e.test.ts +20 -0
  56. package/src/__tests__/credential-security-invariants.test.ts +1 -0
  57. package/src/__tests__/credential-vault-unit.test.ts +227 -0
  58. package/src/__tests__/credentials-cli.test.ts +3 -0
  59. package/src/__tests__/date-context.test.ts +59 -377
  60. package/src/__tests__/drop-capability-card-state-migration.test.ts +169 -0
  61. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +11 -45
  62. package/src/__tests__/emit-signal-routing-intent.test.ts +3 -3
  63. package/src/__tests__/encrypted-store.test.ts +249 -15
  64. package/src/__tests__/ephemeral-permissions.test.ts +4 -5
  65. package/src/__tests__/event-bus.test.ts +3 -3
  66. package/src/__tests__/file-read-tool.test.ts +40 -0
  67. package/src/__tests__/gateway-only-enforcement.test.ts +2 -2
  68. package/src/__tests__/gateway-only-guard.test.ts +1 -0
  69. package/src/__tests__/gemini-image-service.test.ts +4 -4
  70. package/src/__tests__/gemini-provider.test.ts +6 -9
  71. package/src/__tests__/guardian-binding-drift-heal.test.ts +128 -0
  72. package/src/__tests__/guardian-dispatch.test.ts +0 -1
  73. package/src/__tests__/host-file-read-tool.test.ts +87 -0
  74. package/src/__tests__/host-shell-tool.test.ts +6 -6
  75. package/src/__tests__/http-user-message-parity.test.ts +2 -2
  76. package/src/__tests__/identity-intro-cache.test.ts +209 -0
  77. package/src/__tests__/intent-routing.test.ts +51 -99
  78. package/src/__tests__/invite-routes-http.test.ts +5 -0
  79. package/src/__tests__/list-messages-attachments.test.ts +1 -1
  80. package/src/__tests__/managed-proxy-context.test.ts +2 -5
  81. package/src/__tests__/managed-skill-lifecycle.test.ts +8 -8
  82. package/src/__tests__/media-generate-image.test.ts +32 -15
  83. package/src/__tests__/media-reuse-story.e2e.test.ts +1 -1
  84. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +1 -1
  85. package/src/__tests__/memory-lifecycle-e2e.test.ts +24 -18
  86. package/src/__tests__/memory-recall-quality.test.ts +4 -3
  87. package/src/__tests__/memory-regressions.test.ts +86 -90
  88. package/src/__tests__/migration-cross-version-compatibility.test.ts +32 -32
  89. package/src/__tests__/migration-export-http.test.ts +26 -27
  90. package/src/__tests__/migration-import-commit-http.test.ts +165 -37
  91. package/src/__tests__/migration-import-preflight-http.test.ts +81 -20
  92. package/src/__tests__/migration-validate-http.test.ts +16 -16
  93. package/src/__tests__/model-intents.test.ts +2 -2
  94. package/src/__tests__/no-domain-routing-in-prompt-guard.test.ts +1 -1
  95. package/src/__tests__/non-member-access-request.test.ts +3 -3
  96. package/src/__tests__/notification-broadcaster.test.ts +1 -1
  97. package/src/__tests__/notification-decision-fallback.test.ts +2 -2
  98. package/src/__tests__/notification-decision-identity.test.ts +8 -9
  99. package/src/__tests__/notification-decision-strategy.test.ts +1 -1
  100. package/src/__tests__/notification-deep-link.test.ts +1 -1
  101. package/src/__tests__/notification-guardian-path.test.ts +0 -1
  102. package/src/__tests__/notification-schedule-dedup.test.ts +7 -7
  103. package/src/__tests__/oauth-store.test.ts +1 -3
  104. package/src/__tests__/oauth2-gateway-transport.test.ts +6 -1
  105. package/src/__tests__/onboarding-template-contract.test.ts +23 -59
  106. package/src/__tests__/provider-error-scenarios.test.ts +154 -0
  107. package/src/__tests__/provider-fail-open-selection.test.ts +2 -2
  108. package/src/__tests__/provider-managed-proxy-integration.test.ts +8 -9
  109. package/src/__tests__/provider-registry-ollama.test.ts +5 -2
  110. package/src/__tests__/qdrant-manager.test.ts +7 -7
  111. package/src/__tests__/ratelimit.test.ts +0 -74
  112. package/src/__tests__/recording-handler.test.ts +0 -1
  113. package/src/__tests__/require-fresh-approval.test.ts +1 -1
  114. package/src/__tests__/runtime-attachment-metadata.test.ts +1 -1
  115. package/src/__tests__/runtime-events-sse-parity.test.ts +1 -1
  116. package/src/__tests__/runtime-events-sse.test.ts +1 -1
  117. package/src/__tests__/scheduler-recurrence.test.ts +46 -2
  118. package/src/__tests__/schema-transforms.test.ts +114 -54
  119. package/src/__tests__/secret-onetime-send.test.ts +20 -0
  120. package/src/__tests__/secret-routes-managed-proxy.test.ts +5 -2
  121. package/src/__tests__/secret-scanner-executor.test.ts +1 -2
  122. package/src/__tests__/send-endpoint-busy.test.ts +63 -4
  123. package/src/__tests__/send-notification-tool.test.ts +2 -2
  124. package/src/__tests__/shell-credential-ref.test.ts +0 -1
  125. package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -2
  126. package/src/__tests__/skill-memory.test.ts +549 -0
  127. package/src/__tests__/skill-script-runner-sandbox.test.ts +1 -2
  128. package/src/__tests__/slack-app-setup-skill-regression.test.ts +37 -0
  129. package/src/__tests__/slack-channel-config.test.ts +109 -94
  130. package/src/__tests__/swarm-conversation-integration.test.ts +2 -2
  131. package/src/__tests__/swarm-recursion.test.ts +2 -2
  132. package/src/__tests__/swarm-tool.test.ts +2 -2
  133. package/src/__tests__/system-prompt.test.ts +19 -66
  134. package/src/__tests__/telegram-config.test.ts +121 -0
  135. package/src/__tests__/terminal-tools.test.ts +1 -1
  136. package/src/__tests__/tool-execution-abort-cleanup.test.ts +1 -2
  137. package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -1
  138. package/src/__tests__/tool-executor-shell-integration.test.ts +1 -1
  139. package/src/__tests__/tool-executor.test.ts +1 -1
  140. package/src/__tests__/trace-emitter.test.ts +8 -1
  141. package/src/__tests__/trust-store.test.ts +7 -8
  142. package/src/__tests__/twilio-routes.test.ts +1 -18
  143. package/src/__tests__/user-reference.test.ts +82 -2
  144. package/src/__tests__/vbundle-pax-and-symlink.test.ts +196 -0
  145. package/src/__tests__/verification-control-plane-policy.test.ts +1 -1
  146. package/src/approvals/guardian-request-resolvers.ts +3 -3
  147. package/src/avatar/ascii-renderer.ts +2 -2
  148. package/src/avatar/png-renderer.ts +2 -2
  149. package/src/avatar/resvg-lazy.ts +21 -0
  150. package/src/calls/guardian-dispatch.ts +1 -1
  151. package/src/calls/relay-access-wait.ts +2 -2
  152. package/src/calls/twilio-rest.ts +0 -248
  153. package/src/cli/AGENTS.md +5 -8
  154. package/src/cli/__tests__/notifications.test.ts +5 -5
  155. package/src/cli/commands/avatar.ts +64 -2
  156. package/src/cli/commands/conversations.ts +131 -1
  157. package/src/cli/commands/credentials.ts +2 -0
  158. package/src/cli/commands/notifications.ts +3 -3
  159. package/src/cli.ts +10 -0
  160. package/src/config/bundled-skills/acp/SKILL.md +5 -5
  161. package/src/config/bundled-skills/acp/TOOLS.json +6 -6
  162. package/src/config/bundled-skills/app-builder/SKILL.md +42 -42
  163. package/src/config/bundled-skills/app-builder/TOOLS.json +10 -10
  164. package/src/config/bundled-skills/browser/SKILL.md +15 -15
  165. package/src/config/bundled-skills/browser/TOOLS.json +14 -14
  166. package/src/config/bundled-skills/chatgpt-import/SKILL.md +2 -2
  167. package/src/config/bundled-skills/chatgpt-import/TOOLS.json +1 -1
  168. package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +1 -1
  169. package/src/config/bundled-skills/claude-code/SKILL.md +5 -5
  170. package/src/config/bundled-skills/computer-use/SKILL.md +2 -2
  171. package/src/config/bundled-skills/computer-use/TOOLS.json +15 -15
  172. package/src/config/bundled-skills/contacts/SKILL.md +3 -3
  173. package/src/config/bundled-skills/contacts/TOOLS.json +4 -4
  174. package/src/config/bundled-skills/document/SKILL.md +4 -4
  175. package/src/config/bundled-skills/document/TOOLS.json +2 -2
  176. package/src/config/bundled-skills/followups/TOOLS.json +3 -3
  177. package/src/config/bundled-skills/gmail/SKILL.md +32 -32
  178. package/src/config/bundled-skills/gmail/TOOLS.json +16 -16
  179. package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +1 -1
  180. package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +1 -1
  181. package/src/config/bundled-skills/google-calendar/SKILL.md +1 -1
  182. package/src/config/bundled-skills/google-calendar/TOOLS.json +5 -5
  183. package/src/config/bundled-skills/google-calendar/types.ts +1 -1
  184. package/src/config/bundled-skills/heartbeat/SKILL.md +43 -0
  185. package/src/config/bundled-skills/image-studio/SKILL.md +3 -3
  186. package/src/config/bundled-skills/image-studio/TOOLS.json +2 -3
  187. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +16 -12
  188. package/src/config/bundled-skills/media-processing/SKILL.md +40 -40
  189. package/src/config/bundled-skills/media-processing/TOOLS.json +8 -8
  190. package/src/config/bundled-skills/media-processing/__tests__/concurrency-pool.test.ts +2 -2
  191. package/src/config/bundled-skills/media-processing/__tests__/preprocess.test.ts +1 -1
  192. package/src/config/bundled-skills/media-processing/services/gemini-map.ts +5 -5
  193. package/src/config/bundled-skills/media-processing/services/gemini-video.ts +2 -2
  194. package/src/config/bundled-skills/media-processing/services/preprocess.ts +2 -2
  195. package/src/config/bundled-skills/media-processing/services/processing-pipeline.ts +2 -2
  196. package/src/config/bundled-skills/media-processing/services/reduce.ts +3 -3
  197. package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +2 -2
  198. package/src/config/bundled-skills/media-processing/tools/query-media-events.ts +1 -1
  199. package/src/config/bundled-skills/messaging/SKILL.md +29 -25
  200. package/src/config/bundled-skills/messaging/TOOLS.json +11 -11
  201. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +1 -1
  202. package/src/config/bundled-skills/messaging/tools/shared.ts +1 -1
  203. package/src/config/bundled-skills/notifications/SKILL.md +3 -3
  204. package/src/config/bundled-skills/notifications/TOOLS.json +2 -2
  205. package/src/config/bundled-skills/notifications/tools/send-notification.ts +3 -3
  206. package/src/config/bundled-skills/orchestration/SKILL.md +1 -1
  207. package/src/config/bundled-skills/orchestration/TOOLS.json +1 -1
  208. package/src/config/bundled-skills/phone-calls/SKILL.md +18 -14
  209. package/src/config/bundled-skills/phone-calls/TOOLS.json +3 -3
  210. package/src/config/bundled-skills/phone-calls/references/CONFIG.md +2 -2
  211. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +2 -2
  212. package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +1 -1
  213. package/src/config/bundled-skills/playbooks/TOOLS.json +4 -4
  214. package/src/config/bundled-skills/schedule/SKILL.md +26 -26
  215. package/src/config/bundled-skills/schedule/TOOLS.json +5 -5
  216. package/src/config/bundled-skills/screen-watch/SKILL.md +3 -3
  217. package/src/config/bundled-skills/screen-watch/TOOLS.json +1 -1
  218. package/src/config/bundled-skills/sequences/SKILL.md +2 -2
  219. package/src/config/bundled-skills/sequences/TOOLS.json +10 -10
  220. package/src/config/bundled-skills/sequences/tools/sequence-analytics.ts +2 -2
  221. package/src/config/bundled-skills/sequences/tools/sequence-enroll.ts +2 -2
  222. package/src/config/bundled-skills/sequences/tools/sequence-enrollment-list.ts +1 -1
  223. package/src/config/bundled-skills/sequences/tools/sequence-get.ts +1 -1
  224. package/src/config/bundled-skills/sequences/tools/sequence-import.ts +3 -3
  225. package/src/config/bundled-skills/sequences/tools/sequence-list.ts +1 -1
  226. package/src/config/bundled-skills/sequences/tools/sequence-update.ts +1 -1
  227. package/src/config/bundled-skills/settings/TOOLS.json +3 -3
  228. package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -1
  229. package/src/config/bundled-skills/skill-management/TOOLS.json +5 -5
  230. package/src/config/bundled-skills/skills-catalog/SKILL.md +84 -0
  231. package/src/config/bundled-skills/slack/SKILL.md +2 -2
  232. package/src/config/bundled-skills/slack/TOOLS.json +8 -8
  233. package/src/config/bundled-skills/slack/tools/slack-scan-digest.ts +3 -3
  234. package/src/config/bundled-skills/subagent/TOOLS.json +5 -5
  235. package/src/config/bundled-skills/tasks/SKILL.md +1 -1
  236. package/src/config/bundled-skills/tasks/TOOLS.json +9 -9
  237. package/src/config/bundled-skills/transcribe/SKILL.md +5 -5
  238. package/src/config/bundled-skills/transcribe/TOOLS.json +1 -1
  239. package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +10 -10
  240. package/src/config/bundled-skills/watcher/SKILL.md +4 -4
  241. package/src/config/bundled-skills/watcher/TOOLS.json +5 -5
  242. package/src/config/feature-flag-registry.json +33 -17
  243. package/src/config/schemas/sandbox.ts +1 -1
  244. package/src/config/schemas/services.ts +13 -3
  245. package/src/config/schemas/timeouts.ts +0 -10
  246. package/src/contacts/contact-store.ts +63 -0
  247. package/src/contacts/contacts-write.ts +1 -1
  248. package/src/daemon/assistant-attachments.ts +2 -2
  249. package/src/daemon/conversation-agent-loop-handlers.ts +2 -2
  250. package/src/daemon/conversation-agent-loop.ts +7 -30
  251. package/src/daemon/conversation-error.ts +24 -0
  252. package/src/daemon/conversation-memory.ts +8 -7
  253. package/src/daemon/conversation-runtime-assembly.ts +141 -275
  254. package/src/daemon/conversation-slash.ts +7 -26
  255. package/src/daemon/conversation-surfaces.ts +14 -0
  256. package/src/daemon/conversation-tool-setup.ts +9 -8
  257. package/src/daemon/conversation.ts +2 -0
  258. package/src/daemon/daemon-control.ts +1 -1
  259. package/src/daemon/date-context.ts +10 -83
  260. package/src/daemon/handlers/config-channels.ts +12 -2
  261. package/src/daemon/handlers/config-slack-channel.ts +7 -1
  262. package/src/daemon/handlers/config-telegram.ts +6 -1
  263. package/src/daemon/handlers/conversations.ts +2 -2
  264. package/src/daemon/handlers/skills.ts +4 -0
  265. package/src/daemon/lifecycle.ts +28 -4
  266. package/src/daemon/providers-setup.ts +1 -1
  267. package/src/daemon/server.ts +1 -5
  268. package/src/daemon/shutdown-handlers.ts +9 -3
  269. package/src/daemon/tool-side-effects.ts +40 -0
  270. package/src/daemon/trace-emitter.ts +26 -2
  271. package/src/events/domain-events.ts +1 -1
  272. package/src/events/tool-permission-telemetry-listener.ts +46 -0
  273. package/src/inbound/platform-callback-registration.ts +0 -18
  274. package/src/media/app-icon-generator.ts +15 -8
  275. package/src/media/avatar-router.ts +15 -8
  276. package/src/media/gemini-image-service.ts +125 -21
  277. package/src/memory/attachments-store.ts +3 -3
  278. package/src/memory/channel-verification-sessions.ts +6 -6
  279. package/src/memory/conversation-crud.ts +196 -1
  280. package/src/memory/{thread-starters-cadence.ts → conversation-starters-cadence.ts} +9 -42
  281. package/src/memory/conversation-title-service.ts +2 -3
  282. package/src/memory/db-init.ts +25 -1
  283. package/src/memory/invite-store.ts +4 -4
  284. package/src/memory/items-extractor.ts +4 -4
  285. package/src/memory/job-handlers/{thread-starters.ts → conversation-starters.ts} +123 -38
  286. package/src/memory/jobs-store.ts +3 -2
  287. package/src/memory/jobs-worker.ts +7 -5
  288. package/src/memory/lifecycle-events-store.ts +63 -0
  289. package/src/memory/migrations/172-rename-created-by-session-id.ts +27 -0
  290. package/src/memory/migrations/173-rename-source-session-id.ts +16 -0
  291. package/src/memory/migrations/174-rename-thread-starters-table.ts +52 -0
  292. package/src/memory/migrations/175-create-lifecycle-events.ts +15 -0
  293. package/src/memory/migrations/176-drop-capability-card-state.ts +36 -0
  294. package/src/memory/migrations/177-create-trace-events-table.ts +40 -0
  295. package/src/memory/migrations/index.ts +6 -0
  296. package/src/memory/migrations/registry.ts +13 -0
  297. package/src/memory/retriever.test.ts +223 -96
  298. package/src/memory/retriever.ts +115 -138
  299. package/src/memory/schema/calls.ts +1 -1
  300. package/src/memory/schema/contacts.ts +1 -1
  301. package/src/memory/schema/infrastructure.ts +29 -0
  302. package/src/memory/schema/memory-core.ts +7 -17
  303. package/src/memory/schema/notifications.ts +1 -1
  304. package/src/memory/search/formatting.ts +23 -6
  305. package/src/memory/search/lexical.ts +2 -0
  306. package/src/memory/search/semantic.ts +2 -0
  307. package/src/memory/search/staleness.ts +5 -1
  308. package/src/memory/search/types.ts +4 -0
  309. package/src/memory/task-memory-cleanup.ts +96 -6
  310. package/src/memory/trace-event-store.ts +148 -0
  311. package/src/notifications/README.md +1 -1
  312. package/src/notifications/decision-engine.ts +45 -4
  313. package/src/notifications/emit-signal.ts +5 -4
  314. package/src/notifications/events-store.ts +4 -4
  315. package/src/notifications/signal.ts +1 -1
  316. package/src/oauth/manual-token-connection.ts +49 -25
  317. package/src/permissions/checker.ts +6 -5
  318. package/src/permissions/defaults.ts +4 -4
  319. package/src/prompts/__tests__/build-cli-reference-section.test.ts +9 -90
  320. package/src/prompts/cache-boundary.ts +8 -0
  321. package/src/prompts/system-prompt.ts +105 -634
  322. package/src/prompts/templates/BOOTSTRAP.md +172 -33
  323. package/src/prompts/templates/IDENTITY.md +8 -24
  324. package/src/prompts/templates/SOUL.md +20 -41
  325. package/src/prompts/templates/USER.md +3 -19
  326. package/src/prompts/user-reference.ts +14 -16
  327. package/src/providers/anthropic/client.ts +51 -19
  328. package/src/providers/gemini/client.ts +6 -9
  329. package/src/providers/managed-proxy/constants.ts +1 -7
  330. package/src/providers/managed-proxy/context.ts +0 -1
  331. package/src/providers/model-intents.ts +5 -5
  332. package/src/providers/openai/client.ts +10 -1
  333. package/src/providers/openrouter/client.ts +1 -0
  334. package/src/providers/ratelimit.ts +0 -35
  335. package/src/providers/registry.ts +3 -5
  336. package/src/providers/retry.ts +18 -1
  337. package/src/runtime/access-request-helper.ts +16 -2
  338. package/src/runtime/auth/route-policy.ts +7 -0
  339. package/src/runtime/channel-verification-service.ts +1 -1
  340. package/src/runtime/confirmation-request-guardian-bridge.ts +1 -1
  341. package/src/runtime/guardian-vellum-migration.ts +61 -1
  342. package/src/runtime/http-server.ts +8 -4
  343. package/src/runtime/migrations/vbundle-builder.ts +212 -32
  344. package/src/runtime/migrations/vbundle-import-analyzer.ts +74 -8
  345. package/src/runtime/migrations/vbundle-importer.ts +66 -1
  346. package/src/runtime/migrations/vbundle-validator.ts +17 -3
  347. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +4 -4
  348. package/src/runtime/routes/attachment-routes.ts +2 -2
  349. package/src/runtime/routes/btw-routes.ts +93 -0
  350. package/src/runtime/routes/channel-verification-routes.ts +19 -2
  351. package/src/runtime/routes/conversation-management-routes.ts +55 -1
  352. package/src/runtime/routes/conversation-query-routes.ts +1 -1
  353. package/src/runtime/routes/conversation-routes.ts +49 -5
  354. package/src/runtime/routes/conversation-starter-routes.ts +207 -0
  355. package/src/runtime/routes/guardian-bootstrap-routes.ts +13 -9
  356. package/src/runtime/routes/identity-intro-cache.ts +105 -0
  357. package/src/runtime/routes/identity-routes.ts +51 -0
  358. package/src/runtime/routes/inbound-stages/escalation-intercept.ts +1 -1
  359. package/src/runtime/routes/inbound-stages/verification-intercept.ts +1 -1
  360. package/src/runtime/routes/migration-routes.ts +25 -13
  361. package/src/runtime/routes/secret-routes.ts +18 -0
  362. package/src/runtime/routes/settings-routes.ts +9 -9
  363. package/src/runtime/routes/telemetry-routes.ts +53 -0
  364. package/src/runtime/routes/trace-event-routes.ts +62 -0
  365. package/src/runtime/tool-grant-request-helper.ts +1 -1
  366. package/src/runtime/verification-outbound-actions.ts +47 -31
  367. package/src/security/encrypted-store.ts +262 -78
  368. package/src/skills/catalog-install.ts +10 -0
  369. package/src/skills/managed-store.ts +2 -0
  370. package/src/skills/skill-memory.ts +222 -0
  371. package/src/subagent/manager.ts +1 -4
  372. package/src/telemetry/types.ts +10 -1
  373. package/src/telemetry/usage-telemetry-reporter.test.ts +7 -2
  374. package/src/telemetry/usage-telemetry-reporter.ts +53 -4
  375. package/src/tools/AGENTS.md +11 -11
  376. package/src/tools/acp/spawn.ts +1 -1
  377. package/src/tools/apps/executors.ts +8 -8
  378. package/src/tools/apps/registry.ts +1 -1
  379. package/src/tools/assets/materialize.ts +6 -6
  380. package/src/tools/assets/search.ts +10 -10
  381. package/src/tools/browser/__tests__/auth-cache.test.ts +2 -2
  382. package/src/tools/browser/__tests__/auth-detector.test.ts +4 -4
  383. package/src/tools/browser/auth-detector.ts +6 -6
  384. package/src/tools/browser/browser-execution.ts +13 -13
  385. package/src/tools/browser/browser-manager.ts +3 -3
  386. package/src/tools/browser/chrome-cdp.ts +5 -5
  387. package/src/tools/browser/jit-auth.ts +2 -2
  388. package/src/tools/browser/network-recorder.test.ts +2 -2
  389. package/src/tools/browser/network-recorder.ts +3 -3
  390. package/src/tools/browser/runtime-check.ts +3 -3
  391. package/src/tools/claude-code/claude-code.ts +2 -2
  392. package/src/tools/computer-use/definitions.ts +18 -18
  393. package/src/tools/credential-execution/make-authenticated-request.ts +4 -4
  394. package/src/tools/credential-execution/manage-secure-command-tool.ts +3 -3
  395. package/src/tools/credential-execution/run-authenticated-command.ts +4 -4
  396. package/src/tools/credentials/broker-types.ts +5 -5
  397. package/src/tools/credentials/broker.ts +15 -15
  398. package/src/tools/credentials/metadata-store.ts +2 -2
  399. package/src/tools/credentials/resolve.ts +1 -1
  400. package/src/tools/credentials/selection.ts +1 -1
  401. package/src/tools/credentials/tool-policy.ts +1 -1
  402. package/src/tools/credentials/vault.ts +115 -25
  403. package/src/tools/execution-target.ts +2 -2
  404. package/src/tools/executor.ts +7 -7
  405. package/src/tools/filesystem/edit.ts +2 -2
  406. package/src/tools/filesystem/read.ts +15 -4
  407. package/src/tools/filesystem/write.ts +1 -1
  408. package/src/tools/host-filesystem/edit.ts +2 -1
  409. package/src/tools/host-filesystem/read.ts +18 -1
  410. package/src/tools/host-filesystem/write.ts +1 -1
  411. package/src/tools/host-terminal/host-shell.ts +9 -8
  412. package/src/tools/mcp/mcp-tool-factory.ts +7 -6
  413. package/src/tools/memory/definitions.ts +6 -5
  414. package/src/tools/memory/handlers.test.ts +1 -1
  415. package/src/tools/network/__tests__/web-search.test.ts +3 -3
  416. package/src/tools/network/domain-normalize.ts +2 -2
  417. package/src/tools/network/script-proxy/session-manager.ts +10 -10
  418. package/src/tools/network/web-fetch.ts +1 -1
  419. package/src/tools/network/web-search.ts +3 -3
  420. package/src/tools/permission-checker.ts +8 -8
  421. package/src/tools/registry.ts +7 -7
  422. package/src/tools/schedule/list.ts +2 -2
  423. package/src/tools/schema-transforms.ts +31 -21
  424. package/src/tools/secret-detection-handler.ts +1 -1
  425. package/src/tools/sensitive-output-placeholders.ts +1 -1
  426. package/src/tools/shared/filesystem/edit-engine.ts +1 -1
  427. package/src/tools/shared/filesystem/file-ops-service.ts +3 -3
  428. package/src/tools/shared/filesystem/image-read.ts +25 -5
  429. package/src/tools/shared/filesystem/path-policy.ts +2 -2
  430. package/src/tools/shared/shell-output.ts +1 -1
  431. package/src/tools/side-effects.ts +1 -1
  432. package/src/tools/skills/execute.ts +1 -1
  433. package/src/tools/skills/load.ts +3 -3
  434. package/src/tools/skills/sandbox-runner.ts +3 -3
  435. package/src/tools/subagent/read.ts +1 -1
  436. package/src/tools/subagent/spawn.ts +2 -2
  437. package/src/tools/swarm/delegate.ts +3 -3
  438. package/src/tools/system/request-permission.ts +5 -4
  439. package/src/tools/terminal/backends/native.ts +4 -4
  440. package/src/tools/terminal/parser.ts +6 -6
  441. package/src/tools/terminal/sandbox-diagnostics.ts +1 -1
  442. package/src/tools/terminal/shell.ts +16 -16
  443. package/src/tools/tool-approval-handler.ts +21 -12
  444. package/src/tools/tool-manifest.ts +4 -4
  445. package/src/tools/types.ts +3 -3
  446. package/src/tools/ui-surface/definitions.ts +9 -37
  447. package/src/tools/watcher/list.ts +1 -1
  448. package/src/util/logger.ts +7 -2
  449. package/src/util/pricing.ts +4 -0
  450. package/src/util/retry.ts +29 -1
  451. package/src/workspace/migrations/007-web-search-provider-rename.ts +37 -0
  452. package/src/workspace/migrations/registry.ts +2 -0
  453. package/src/__tests__/cli-help-reference-sync.test.ts +0 -26
  454. package/src/__tests__/onboarding-starter-tasks.test.ts +0 -190
  455. package/src/cli/reference.ts +0 -38
  456. package/src/memory/job-handlers/capability-cards.ts +0 -420
  457. package/src/runtime/routes/thread-starter-routes.ts +0 -294
@@ -38,7 +38,7 @@ export const MANAGED_PROVIDER_META: Record<string, ManagedProviderMeta> = {
38
38
  gemini: {
39
39
  name: "gemini",
40
40
  managed: true,
41
- proxyPath: "/v1/runtime-proxy/vertex",
41
+ proxyPath: "/v1/runtime-proxy/gemini",
42
42
  },
43
43
  fireworks: {
44
44
  name: "fireworks",
@@ -48,11 +48,5 @@ export const MANAGED_PROVIDER_META: Record<string, ManagedProviderMeta> = {
48
48
  name: "openrouter",
49
49
  managed: false,
50
50
  },
51
- vertex: {
52
- name: "vertex",
53
- managed: true,
54
- proxyPath: "/v1/runtime-proxy/vertex",
55
- },
56
51
  ollama: { name: "ollama", managed: false },
57
52
  };
58
-
@@ -47,7 +47,6 @@ export async function resolveManagedProxyContext(): Promise<ManagedProxyContext>
47
47
  const platformBaseUrl = getPlatformBaseUrl().replace(/\/+$/, "");
48
48
  const assistantApiKey =
49
49
  (await getSecureKeyAsync(ASSISTANT_API_KEY_STORAGE_KEY)) ?? "";
50
-
51
50
  const enabled = !!platformBaseUrl && !!assistantApiKey;
52
51
  _managedProxyEnabled = enabled;
53
52
 
@@ -18,12 +18,12 @@ const PROVIDER_MODEL_INTENTS: Record<
18
18
  anthropic: {
19
19
  "latency-optimized": "claude-haiku-4-5-20251001",
20
20
  "quality-optimized": "claude-opus-4-6",
21
- "vision-optimized": "claude-sonnet-4-6",
21
+ "vision-optimized": "claude-opus-4-6",
22
22
  },
23
23
  openai: {
24
- "latency-optimized": "gpt-4o-mini",
25
- "quality-optimized": "gpt-5.2",
26
- "vision-optimized": "gpt-4o",
24
+ "latency-optimized": "gpt-5.4-nano",
25
+ "quality-optimized": "gpt-5.4",
26
+ "vision-optimized": "gpt-5.4",
27
27
  },
28
28
  gemini: {
29
29
  "latency-optimized": "gemini-3-flash",
@@ -42,7 +42,7 @@ const PROVIDER_MODEL_INTENTS: Record<
42
42
  },
43
43
  openrouter: {
44
44
  "latency-optimized": "x-ai/grok-4",
45
- "quality-optimized": "x-ai/grok-4",
45
+ "quality-optimized": "x-ai/grok-4.20-beta",
46
46
  "vision-optimized": "x-ai/grok-4",
47
47
  },
48
48
  };
@@ -1,5 +1,6 @@
1
1
  import OpenAI from "openai";
2
2
 
3
+ import { SYSTEM_PROMPT_CACHE_BOUNDARY } from "../../prompts/cache-boundary.js";
3
4
  import { ProviderError } from "../../util/errors.js";
4
5
  import { extractRetryAfterMs } from "../../util/retry.js";
5
6
  import { escapeXmlAttr } from "../../util/xml.js";
@@ -18,6 +19,8 @@ export interface OpenAICompatibleProviderOptions {
18
19
  providerName?: string;
19
20
  providerLabel?: string;
20
21
  streamTimeoutMs?: number;
22
+ /** Extra params spread into every chat.completions.create call (e.g. reasoning). */
23
+ extraCreateParams?: Record<string, unknown>;
21
24
  }
22
25
 
23
26
  const OPENAI_SUPPORTED_IMAGE_TYPES = new Set([
@@ -33,6 +36,7 @@ export class OpenAIProvider implements Provider {
33
36
  private client: OpenAI;
34
37
  private model: string;
35
38
  private streamTimeoutMs: number;
39
+ private extraCreateParams: Record<string, unknown>;
36
40
 
37
41
  constructor(
38
42
  apiKey: string,
@@ -47,6 +51,7 @@ export class OpenAIProvider implements Provider {
47
51
  });
48
52
  this.model = model;
49
53
  this.streamTimeoutMs = options.streamTimeoutMs ?? 300_000;
54
+ this.extraCreateParams = options.extraCreateParams ?? {};
50
55
  }
51
56
 
52
57
  async sendMessage(
@@ -69,6 +74,7 @@ export class OpenAIProvider implements Provider {
69
74
  messages: openaiMessages,
70
75
  stream: true as const,
71
76
  stream_options: { include_usage: true },
77
+ ...this.extraCreateParams,
72
78
  };
73
79
 
74
80
  if (maxTokens) {
@@ -224,7 +230,10 @@ export class OpenAIProvider implements Provider {
224
230
  const result: OpenAI.Chat.Completions.ChatCompletionMessageParam[] = [];
225
231
 
226
232
  if (systemPrompt) {
227
- result.push({ role: "system", content: systemPrompt });
233
+ result.push({
234
+ role: "system",
235
+ content: systemPrompt.replaceAll(SYSTEM_PROMPT_CACHE_BOUNDARY, "\n"),
236
+ });
228
237
  }
229
238
 
230
239
  for (const msg of messages) {
@@ -19,6 +19,7 @@ export class OpenRouterProvider extends OpenAIProvider {
19
19
  providerName: "openrouter",
20
20
  providerLabel: "OpenRouter",
21
21
  streamTimeoutMs: options.streamTimeoutMs,
22
+ extraCreateParams: { reasoning: { enabled: true } },
22
23
  });
23
24
  }
24
25
  }
@@ -15,7 +15,6 @@ export class RateLimitProvider implements Provider {
15
15
  public readonly name: string;
16
16
 
17
17
  private requestTimestamps: number[];
18
- private sessionTokens = 0;
19
18
 
20
19
  constructor(
21
20
  private readonly inner: Provider,
@@ -33,7 +32,6 @@ export class RateLimitProvider implements Provider {
33
32
  options?: SendMessageOptions,
34
33
  ): Promise<ProviderResponse> {
35
34
  this.enforceRequestRate();
36
- this.enforceTokenBudget();
37
35
 
38
36
  // Record the request timestamp before the await to prevent concurrent
39
37
  // calls from bypassing the rate limit during the async gap.
@@ -46,8 +44,6 @@ export class RateLimitProvider implements Provider {
46
44
  options,
47
45
  );
48
46
 
49
- this.recordTokens(response.usage.inputTokens + response.usage.outputTokens);
50
-
51
47
  return response;
52
48
  }
53
49
 
@@ -89,39 +85,8 @@ export class RateLimitProvider implements Provider {
89
85
  }
90
86
  }
91
87
 
92
- private enforceTokenBudget(): void {
93
- const limit = this.config.maxTokensPerSession;
94
- if (limit <= 0) return;
95
-
96
- if (this.sessionTokens >= limit) {
97
- log.warn(
98
- {
99
- provider: this.name,
100
- sessionTokens: this.sessionTokens,
101
- limit,
102
- },
103
- `Session token budget exhausted for ${this.name}: ${this.sessionTokens.toLocaleString()}/${limit.toLocaleString()}`,
104
- );
105
- throw new RateLimitError(
106
- `Session token budget exhausted: ${this.sessionTokens.toLocaleString()}/${limit.toLocaleString()} tokens used. Start a new session to continue.`,
107
- );
108
- }
109
- }
110
-
111
88
  private recordRequest(): void {
112
89
  if (this.config.maxRequestsPerMinute <= 0) return;
113
90
  this.requestTimestamps.push(Date.now());
114
91
  }
115
-
116
- private recordTokens(tokens: number): void {
117
- if (this.config.maxTokensPerSession <= 0) return;
118
- this.sessionTokens += tokens;
119
- log.debug(
120
- {
121
- sessionTokens: this.sessionTokens,
122
- limit: this.config.maxTokensPerSession,
123
- },
124
- "Token usage updated",
125
- );
126
- }
127
92
  }
@@ -235,8 +235,7 @@ async function resolveProviderCredentials(
235
235
  } | null> {
236
236
  if (mode === "managed") {
237
237
  // In managed mode, try managed proxy first, then fall back to user key
238
- const proxyName = providerName === "gemini" ? "vertex" : providerName;
239
- const managedBaseUrl = await buildManagedBaseUrl(proxyName);
238
+ const managedBaseUrl = await buildManagedBaseUrl(providerName);
240
239
  if (managedBaseUrl) {
241
240
  const ctx = await resolveManagedProxyContext();
242
241
  return {
@@ -258,8 +257,7 @@ async function resolveProviderCredentials(
258
257
  return { apiKey: userKey, source: "user-key" };
259
258
  }
260
259
  // Fall back to managed proxy even in your-own mode (backwards compat)
261
- const proxyName = providerName === "gemini" ? "vertex" : providerName;
262
- const managedBaseUrl = await buildManagedBaseUrl(proxyName);
260
+ const managedBaseUrl = await buildManagedBaseUrl(providerName);
263
261
  if (managedBaseUrl) {
264
262
  const ctx = await resolveManagedProxyContext();
265
263
  return {
@@ -283,7 +281,7 @@ export async function initializeProviders(
283
281
  (config.timeouts?.providerStreamTimeoutSec ?? 300) * 1000;
284
282
  const inferenceMode = config.services.inference.mode;
285
283
  const useNativeWebSearch =
286
- config.services["web-search"].provider === "anthropic-native";
284
+ config.services["web-search"].provider === "inference-provider-native";
287
285
 
288
286
  // Anthropic
289
287
  const anthropicCreds = await resolveProviderCredentials(
@@ -18,10 +18,25 @@ import type {
18
18
 
19
19
  const log = getLogger("retry");
20
20
 
21
+ /** Patterns that indicate a transient streaming corruption from the SDK. */
22
+ const RETRYABLE_STREAM_PATTERNS = [
23
+ "Unexpected event order",
24
+ "stream ended without producing",
25
+ "request ended without sending any chunks",
26
+ "stream has ended, this shouldn't happen",
27
+ ];
28
+
29
+ function isRetryableStreamError(error: unknown): boolean {
30
+ if (!(error instanceof ProviderError)) return false;
31
+ if (error.statusCode !== undefined) return false; // has a real HTTP status — not a stream error
32
+ return RETRYABLE_STREAM_PATTERNS.some((p) => error.message.includes(p));
33
+ }
34
+
21
35
  function isRetryableError(error: unknown): boolean {
22
36
  if (error instanceof ProviderError && error.statusCode !== undefined) {
23
37
  if (error.statusCode === 429 || error.statusCode >= 500) return true;
24
38
  }
39
+ if (isRetryableStreamError(error)) return true;
25
40
  return isRetryableNetworkError(error);
26
41
  }
27
42
 
@@ -127,7 +142,9 @@ export class RetryProvider implements Provider {
127
142
  error.statusCode !== undefined &&
128
143
  error.statusCode >= 500
129
144
  ? `server_error_${error.statusCode}`
130
- : "network_error";
145
+ : isRetryableStreamError(error)
146
+ ? "stream_corruption"
147
+ : "network_error";
131
148
  log.warn(
132
149
  {
133
150
  attempt: attempt + 1,
@@ -200,10 +200,24 @@ export function notifyGuardianOfAccessRequest(
200
200
  });
201
201
 
202
202
  let vellumDeliveryId: string | null = null;
203
+ // When the access request originates from a text channel with
204
+ // notification delivery support (Slack, Telegram), route the guardian
205
+ // notification to that same channel only. Delivering on the macOS
206
+ // client as well is noisy and approving from there doesn't work
207
+ // because the desktop path lacks the channel delivery context needed
208
+ // to deliver the verification code. Phone is excluded because it is
209
+ // not a deliverable notification channel.
210
+ const TEXT_CHANNELS_WITH_DELIVERY: ReadonlySet<string> = new Set([
211
+ "slack",
212
+ "telegram",
213
+ ]);
214
+ const sameChannelOnly = TEXT_CHANNELS_WITH_DELIVERY.has(sourceChannel);
215
+
203
216
  void emitNotificationSignal({
204
217
  sourceEventName: "ingress.access_request",
205
218
  sourceChannel: sourceChannel as NotificationSourceChannel,
206
- sourceSessionId: `access-req-${sourceChannel}-${actorExternalId}`,
219
+ sourceContextId: `access-req-${sourceChannel}-${actorExternalId}`,
220
+ ...(sameChannelOnly ? { routingIntent: "single_channel" as const } : {}),
207
221
  attentionHints: {
208
222
  requiresAction: true,
209
223
  urgency: "high",
@@ -258,7 +272,7 @@ export function notifyGuardianOfAccessRequest(
258
272
  applyDeliveryStatus(delivery.id, result);
259
273
  }
260
274
 
261
- if (!vellumDeliveryId) {
275
+ if (!vellumDeliveryId && !sameChannelOnly) {
262
276
  const fallback = createCanonicalGuardianDelivery({
263
277
  requestId: canonicalRequest.id,
264
278
  destinationChannel: "vellum",
@@ -157,6 +157,9 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
157
157
  // Events (SSE)
158
158
  { endpoint: "events", scopes: ["chat.read"] },
159
159
 
160
+ // Trace events
161
+ { endpoint: "trace-events", scopes: ["chat.read"] },
162
+
160
163
  // Attachments
161
164
  { endpoint: "attachments:POST", scopes: ["attachments.write"] },
162
165
  { endpoint: "attachments:DELETE", scopes: ["attachments.write"] },
@@ -291,6 +294,9 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
291
294
  { endpoint: "usage/daily", scopes: ["settings.read"] },
292
295
  { endpoint: "usage/breakdown", scopes: ["settings.read"] },
293
296
 
297
+ // Lifecycle telemetry
298
+ { endpoint: "telemetry/lifecycle", scopes: ["settings.write"] },
299
+
294
300
  // Debug
295
301
  { endpoint: "debug", scopes: ["settings.read"] },
296
302
 
@@ -337,6 +343,7 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
337
343
  { endpoint: "model/image-gen", scopes: ["settings.write"] },
338
344
 
339
345
  // Conversation management
346
+ { endpoint: "conversations/wipe", scopes: ["chat.write"] },
340
347
  { endpoint: "conversations/reorder", scopes: ["chat.write"] },
341
348
 
342
349
  // Conversation search
@@ -128,7 +128,7 @@ export function createInboundVerificationSession(
128
128
  channel,
129
129
  challengeHash,
130
130
  expiresAt,
131
- createdByConversationId: conversationId,
131
+ sourceConversationId: conversationId,
132
132
  });
133
133
 
134
134
  const ttlSeconds = CHALLENGE_TTL_MS / 1000;
@@ -146,7 +146,7 @@ export function bridgeConfirmationRequestToGuardian(
146
146
  const signalPromise = emitNotificationSignal({
147
147
  sourceEventName: "guardian.question",
148
148
  sourceChannel: sourceChannel as NotificationSourceChannel,
149
- sourceSessionId: conversationId,
149
+ sourceContextId: conversationId,
150
150
  attentionHints: {
151
151
  requiresAction: true,
152
152
  urgency: "high",
@@ -12,7 +12,10 @@
12
12
 
13
13
  import { v4 as uuid } from "uuid";
14
14
 
15
- import { findGuardianForChannel } from "../contacts/contact-store.js";
15
+ import {
16
+ findGuardianForChannel,
17
+ updateContactPrincipalAndChannel,
18
+ } from "../contacts/contact-store.js";
16
19
  import { createGuardianBinding } from "../contacts/contacts-write.js";
17
20
  import { getLogger } from "../util/logger.js";
18
21
  import { DAEMON_INTERNAL_ASSISTANT_ID } from "./assistant-scope.js";
@@ -70,3 +73,60 @@ export function ensureVellumGuardianBinding(
70
73
 
71
74
  return guardianPrincipalId;
72
75
  }
76
+
77
+ /**
78
+ * Heal guardian binding drift for the vellum channel.
79
+ *
80
+ * After a DB reset, the daemon creates a new guardian binding with a fresh
81
+ * `vellum-principal-<uuid>`, but the client may still hold a valid JWT
82
+ * signed with the surviving signing key containing the old principal.
83
+ * The JWT passes signature validation but trust resolution returns
84
+ * `unknown` because the principals don't match.
85
+ *
86
+ * This function detects that scenario and updates the binding to match
87
+ * the JWT's principal. Only heals when both the stored and incoming
88
+ * principals have the `vellum-principal-` prefix (both auto-generated,
89
+ * no external identity meaning). The JWT's signature proves it was
90
+ * minted by this daemon's signing key.
91
+ *
92
+ * Returns true if healing occurred, false otherwise.
93
+ */
94
+ export function healGuardianBindingDrift(incomingPrincipalId: string): boolean {
95
+ if (!incomingPrincipalId.startsWith("vellum-principal-")) {
96
+ return false;
97
+ }
98
+
99
+ const guardianResult = findGuardianForChannel("vellum");
100
+ if (!guardianResult) return false;
101
+
102
+ const currentPrincipalId = guardianResult.contact.principalId;
103
+ if (!currentPrincipalId?.startsWith("vellum-principal-")) return false;
104
+ if (currentPrincipalId === incomingPrincipalId) return false;
105
+
106
+ const updated = updateContactPrincipalAndChannel(
107
+ guardianResult.contact.id,
108
+ guardianResult.channel.id,
109
+ incomingPrincipalId,
110
+ );
111
+
112
+ if (!updated) {
113
+ log.warn(
114
+ {
115
+ oldPrincipalId: currentPrincipalId,
116
+ newPrincipalId: incomingPrincipalId,
117
+ },
118
+ "Skipped guardian binding drift heal — address collision on contact_channels",
119
+ );
120
+ return false;
121
+ }
122
+
123
+ log.info(
124
+ {
125
+ oldPrincipalId: currentPrincipalId,
126
+ newPrincipalId: incomingPrincipalId,
127
+ },
128
+ "Healed vellum guardian binding drift — updated principalId to match JWT actor",
129
+ );
130
+
131
+ return true;
132
+ }
@@ -125,6 +125,7 @@ import { conversationAttentionRouteDefinitions } from "./routes/conversation-att
125
125
  import { conversationManagementRouteDefinitions } from "./routes/conversation-management-routes.js";
126
126
  import { conversationQueryRouteDefinitions } from "./routes/conversation-query-routes.js";
127
127
  import { conversationRouteDefinitions } from "./routes/conversation-routes.js";
128
+ import { conversationStarterRouteDefinitions } from "./routes/conversation-starter-routes.js";
128
129
  import { debugRouteDefinitions } from "./routes/debug-routes.js";
129
130
  import { diagnosticsRouteDefinitions } from "./routes/diagnostics-routes.js";
130
131
  import { documentRouteDefinitions } from "./routes/documents-routes.js";
@@ -160,7 +161,8 @@ import { skillRouteDefinitions } from "./routes/skills-routes.js";
160
161
  import { subagentRouteDefinitions } from "./routes/subagents-routes.js";
161
162
  import { surfaceActionRouteDefinitions } from "./routes/surface-action-routes.js";
162
163
  import { surfaceContentRouteDefinitions } from "./routes/surface-content-routes.js";
163
- import { threadStarterRouteDefinitions } from "./routes/thread-starter-routes.js";
164
+ import { telemetryRouteDefinitions } from "./routes/telemetry-routes.js";
165
+ import { traceEventRouteDefinitions } from "./routes/trace-event-routes.js";
164
166
  import { trustRulesRouteDefinitions } from "./routes/trust-rules-routes.js";
165
167
  import { usageRouteDefinitions } from "./routes/usage-routes.js";
166
168
  import { watchRouteDefinitions } from "./routes/watch-routes.js";
@@ -198,8 +200,8 @@ const log = getLogger("runtime-http");
198
200
  const DEFAULT_PORT = 7821;
199
201
  const DEFAULT_HOSTNAME = "127.0.0.1";
200
202
 
201
- /** Global hard cap on request body size (50 MB). */
202
- const MAX_REQUEST_BODY_BYTES = 50 * 1024 * 1024;
203
+ /** Global hard cap on request body size (150 MB — accommodates base64-encoded 100 MB attachments). */
204
+ const MAX_REQUEST_BODY_BYTES = 150 * 1024 * 1024;
203
205
 
204
206
  export class RuntimeHttpServer {
205
207
  private server: ReturnType<typeof Bun.serve> | null = null;
@@ -739,9 +741,10 @@ export class RuntimeHttpServer {
739
741
  ...identityRouteDefinitions(),
740
742
  ...debugRouteDefinitions(),
741
743
  ...usageRouteDefinitions(),
744
+ ...telemetryRouteDefinitions(),
742
745
  ...workspaceRouteDefinitions(),
743
746
  ...memoryItemRouteDefinitions(),
744
- ...threadStarterRouteDefinitions(),
747
+ ...conversationStarterRouteDefinitions(),
745
748
  ...settingsRouteDefinitions(),
746
749
  ...avatarRouteDefinitions(),
747
750
  ...scheduleRouteDefinitions({
@@ -1194,6 +1197,7 @@ export class RuntimeHttpServer {
1194
1197
 
1195
1198
  ...brainGraphRouteDefinitions({ mintUiPageToken }),
1196
1199
  ...eventsRouteDefinitions(),
1200
+ ...traceEventRouteDefinitions(),
1197
1201
  ...migrationRouteDefinitions(),
1198
1202
 
1199
1203
  // Internal OAuth callback (gateway -> runtime)