@vellumai/assistant 0.8.4 → 0.8.6

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 (802) hide show
  1. package/AGENTS.md +33 -1
  2. package/ARCHITECTURE.md +3 -3
  3. package/bunfig.toml +6 -1
  4. package/docs/browser-use-architecture-phase2.md +1 -1
  5. package/docs/credential-execution-service.md +6 -6
  6. package/docs/plugins.md +4 -3
  7. package/knip.json +2 -1
  8. package/node_modules/@vellumai/skill-host-contracts/src/client.ts +12 -13
  9. package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +4 -1
  10. package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +16 -14
  11. package/openapi.yaml +2748 -216
  12. package/package.json +1 -1
  13. package/src/__tests__/actor-token-service.test.ts +3 -2
  14. package/src/__tests__/agent-loop-exit-reason.test.ts +102 -9
  15. package/src/__tests__/agent-loop-override-profile.test.ts +2 -1
  16. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +1 -0
  17. package/src/__tests__/agent-wake-override-profile.test.ts +1 -0
  18. package/src/__tests__/always-loaded-tools-guard.test.ts +2 -2
  19. package/src/__tests__/annotate-risk-options.test.ts +1 -0
  20. package/src/__tests__/anthropic-provider.test.ts +34 -37
  21. package/src/__tests__/approval-cascade.test.ts +1 -0
  22. package/src/__tests__/approval-routes-http.test.ts +9 -13
  23. package/src/__tests__/assert-not-live-db.ts +79 -0
  24. package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +293 -0
  25. package/src/__tests__/assistant-feature-flags-integration.test.ts +12 -28
  26. package/src/__tests__/audit-log-rotation.test.ts +72 -18
  27. package/src/__tests__/auto-analysis-end-to-end.test.ts +6 -6
  28. package/src/__tests__/background-workers-disk-pressure.test.ts +8 -11
  29. package/src/__tests__/browser-skill-endstate.test.ts +3 -3
  30. package/src/__tests__/btw-routes.test.ts +5 -5
  31. package/src/__tests__/call-controller.test.ts +3 -3
  32. package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
  33. package/src/__tests__/channel-approval-routes.test.ts +3 -2
  34. package/src/__tests__/channel-guardian.test.ts +6 -5
  35. package/src/__tests__/channel-readiness-slack-remote.test.ts +175 -0
  36. package/src/__tests__/channel-reply-delivery.test.ts +35 -0
  37. package/src/__tests__/channel-retry-sweep.test.ts +320 -3
  38. package/src/__tests__/checker.test.ts +18 -27
  39. package/src/__tests__/compaction-events.test.ts +2 -0
  40. package/src/__tests__/compaction-trail-store.test.ts +264 -0
  41. package/src/__tests__/compactor-call-site-logging.test.ts +215 -0
  42. package/src/__tests__/compactor-preserved-tail-count.test.ts +1 -0
  43. package/src/__tests__/computer-use-skill-manifest-regression.test.ts +12 -16
  44. package/src/__tests__/computer-use-tools.test.ts +14 -18
  45. package/src/__tests__/config-loader-backfill.test.ts +13 -28
  46. package/src/__tests__/config-loader-corrupt.test.ts +5 -5
  47. package/src/__tests__/config-loader-platform-defaults.test.ts +93 -26
  48. package/src/__tests__/config-loader-quarantine-bulletin.test.ts +3 -3
  49. package/src/__tests__/config-managed-gemini-defaults.test.ts +3 -4
  50. package/src/__tests__/config-schema.test.ts +10 -10
  51. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
  52. package/src/__tests__/connection-model-compat.test.ts +83 -0
  53. package/src/__tests__/contacts-tools.test.ts +3 -2
  54. package/src/__tests__/context-token-estimator.test.ts +22 -0
  55. package/src/__tests__/conversation-abort-tool-results.test.ts +5 -0
  56. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +2 -1
  57. package/src/__tests__/conversation-agent-loop-handlers-max-tokens.test.ts +55 -0
  58. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +2 -1
  59. package/src/__tests__/conversation-agent-loop-overflow.test.ts +231 -2
  60. package/src/__tests__/conversation-agent-loop.test.ts +581 -54
  61. package/src/__tests__/conversation-analysis-routes.test.ts +1 -0
  62. package/src/__tests__/conversation-app-control-instantiation.test.ts +31 -24
  63. package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -0
  64. package/src/__tests__/conversation-attention-store.test.ts +101 -0
  65. package/src/__tests__/conversation-attention-telegram.test.ts +3 -2
  66. package/src/__tests__/conversation-clear-safety.test.ts +25 -25
  67. package/src/__tests__/conversation-confirmation-signals.test.ts +1 -0
  68. package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +1 -1
  69. package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
  70. package/src/__tests__/conversation-error.test.ts +61 -0
  71. package/src/__tests__/conversation-fork-crud.test.ts +239 -15
  72. package/src/__tests__/conversation-fork-route.test.ts +3 -2
  73. package/src/__tests__/conversation-history-web-search.test.ts +1 -0
  74. package/src/__tests__/conversation-inference-profile-list.test.ts +3 -2
  75. package/src/__tests__/conversation-inference-profile-route.test.ts +3 -2
  76. package/src/__tests__/conversation-lifecycle.test.ts +53 -11
  77. package/src/__tests__/conversation-list-source.test.ts +3 -2
  78. package/src/__tests__/conversation-load-history-repair.test.ts +2 -1
  79. package/src/__tests__/{conversation-load-cleaned-at.test.ts → conversation-load-history-stripped.test.ts} +14 -13
  80. package/src/__tests__/conversation-pairing.test.ts +53 -0
  81. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +26 -7
  82. package/src/__tests__/conversation-process-callsite.test.ts +1 -0
  83. package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
  84. package/src/__tests__/conversation-queue.test.ts +333 -291
  85. package/src/__tests__/conversation-routes-disk-view.test.ts +112 -18
  86. package/src/__tests__/conversation-routes-guardian-reply.test.ts +33 -8
  87. package/src/__tests__/conversation-routes-slash-commands.test.ts +68 -2
  88. package/src/__tests__/conversation-runtime-assembly.test.ts +78 -0
  89. package/src/__tests__/conversation-skill-tools.test.ts +40 -147
  90. package/src/__tests__/conversation-slash-queue.test.ts +84 -32
  91. package/src/__tests__/conversation-slash-unknown.test.ts +5 -0
  92. package/src/__tests__/conversation-speed-override.test.ts +1 -0
  93. package/src/__tests__/conversation-store.test.ts +1 -1
  94. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +46 -0
  95. package/src/__tests__/conversation-surfaces-data-persist.test.ts +1 -0
  96. package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +6 -3
  97. package/src/__tests__/conversation-surfaces-standalone.test.ts +6 -3
  98. package/src/__tests__/conversation-surfaces-state-update.test.ts +3 -3
  99. package/src/__tests__/conversation-surfaces-table-action.test.ts +7 -17
  100. package/src/__tests__/conversation-sync-tags.test.ts +218 -35
  101. package/src/__tests__/conversation-title-service.test.ts +1 -0
  102. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +30 -0
  103. package/src/__tests__/conversation-usage.test.ts +1 -0
  104. package/src/__tests__/conversation-workspace-cache-state.test.ts +2 -0
  105. package/src/__tests__/conversation-workspace-injection.test.ts +6 -1
  106. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -1
  107. package/src/__tests__/credential-broker-browser-fill.test.ts +3 -3
  108. package/src/__tests__/credential-broker-server-use.test.ts +5 -5
  109. package/src/__tests__/credential-execution-client.test.ts +72 -1
  110. package/src/__tests__/credential-execution-feature-gates.test.ts +19 -19
  111. package/src/__tests__/credential-execution-tools.test.ts +6 -6
  112. package/src/__tests__/credential-health-service.test.ts +252 -3
  113. package/src/__tests__/credential-security-invariants.test.ts +6 -5
  114. package/src/__tests__/credential-vault-unit.test.ts +21 -21
  115. package/src/__tests__/credential-vault.test.ts +5 -5
  116. package/src/__tests__/cross-provider-web-search.test.ts +56 -2
  117. package/src/__tests__/db-connection-isolation.test.ts +7 -6
  118. package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +8 -10
  119. package/src/__tests__/db-conversation-inference-profile-migration.test.ts +7 -10
  120. package/src/__tests__/db-llm-request-log-provider-migration.test.ts +9 -15
  121. package/src/__tests__/db-test-helpers.ts +58 -0
  122. package/src/__tests__/disk-pressure-guard.test.ts +58 -41
  123. package/src/__tests__/disk-pressure-lifecycle.test.ts +13 -10
  124. package/src/__tests__/disk-pressure-routes.test.ts +0 -33
  125. package/src/__tests__/disk-pressure-tools.test.ts +0 -4
  126. package/src/__tests__/dm-persistence.test.ts +26 -40
  127. package/src/__tests__/document-create-dedupe.test.ts +189 -0
  128. package/src/__tests__/document-find-replace.test.ts +3 -2
  129. package/src/__tests__/document-tool-security.test.ts +81 -2
  130. package/src/__tests__/dynamic-page-surface.test.ts +2 -2
  131. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +5 -4
  132. package/src/__tests__/email-html-renderer.test.ts +12 -0
  133. package/src/__tests__/encrypted-store-test-helpers.ts +56 -0
  134. package/src/__tests__/encrypted-store.test.ts +11 -9
  135. package/src/__tests__/feature-flag-test-helpers.ts +53 -0
  136. package/src/__tests__/filing-service.test.ts +1 -0
  137. package/src/__tests__/first-greeting.test.ts +62 -12
  138. package/src/__tests__/gateway-flag-listener.test.ts +236 -0
  139. package/src/__tests__/gemini-provider.test.ts +104 -0
  140. package/src/__tests__/guardian-action-sweep.test.ts +3 -2
  141. package/src/__tests__/guardian-dispatch.test.ts +0 -1
  142. package/src/__tests__/guardian-outbound-http.test.ts +10 -7
  143. package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +48 -3
  144. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +2 -1
  145. package/src/__tests__/heartbeat-disk-pressure.test.ts +5 -0
  146. package/src/__tests__/heartbeat-service.test.ts +5 -0
  147. package/src/__tests__/helpers/mock-logger.ts +26 -0
  148. package/src/__tests__/host-bash-routes.test.ts +1 -0
  149. package/src/__tests__/host-cu-routes-targeted.test.ts +1 -0
  150. package/src/__tests__/host-file-routes-targeted.test.ts +1 -0
  151. package/src/__tests__/host-shell-tool.test.ts +6 -5
  152. package/src/__tests__/host-transfer-routes-targeted.test.ts +1 -0
  153. package/src/__tests__/http-conversation-lineage.test.ts +3 -2
  154. package/src/__tests__/http-user-message-parity.test.ts +29 -7
  155. package/src/__tests__/identity-intro-cache.test.ts +133 -22
  156. package/src/__tests__/inbound-slack-persistence.test.ts +44 -72
  157. package/src/__tests__/inference-profile-reaper.test.ts +3 -2
  158. package/src/__tests__/inference-profile-session-ipc.test.ts +3 -2
  159. package/src/__tests__/init-feature-flag-overrides.test.ts +5 -6
  160. package/src/__tests__/injector-disk-pressure.test.ts +3 -17
  161. package/src/__tests__/inline-skill-load-permissions.test.ts +4 -4
  162. package/src/__tests__/list-messages-hidden-metadata.test.ts +80 -0
  163. package/src/__tests__/list-messages-tool-merge.test.ts +70 -11
  164. package/src/__tests__/llm-context-normalization.test.ts +42 -0
  165. package/src/__tests__/llm-request-log-call-site.test.ts +136 -0
  166. package/src/__tests__/llm-request-log-source-clickhouse.test.ts +26 -0
  167. package/src/__tests__/llm-resolver.test.ts +408 -9
  168. package/src/__tests__/llm-schema.test.ts +1 -1
  169. package/src/__tests__/llm-usage-store.test.ts +66 -0
  170. package/src/__tests__/logger.test.ts +89 -0
  171. package/src/__tests__/manual-token-reconciliation.test.ts +76 -1
  172. package/src/__tests__/mcp-abort-signal.test.ts +16 -2
  173. package/src/__tests__/mcp-client-auth.test.ts +14 -0
  174. package/src/__tests__/media-generate-image.test.ts +31 -0
  175. package/src/__tests__/memory-v2-static-injector.test.ts +7 -7
  176. package/src/__tests__/messaging-send-tool.test.ts +1 -0
  177. package/src/__tests__/migration-import-from-url.test.ts +3 -3
  178. package/src/__tests__/mock-gateway-ipc.ts +18 -2
  179. package/src/__tests__/model-intents.test.ts +4 -6
  180. package/src/__tests__/native-web-search.test.ts +30 -2
  181. package/src/__tests__/notification-deep-link.test.ts +62 -0
  182. package/src/__tests__/notification-guardian-path.test.ts +0 -1
  183. package/src/__tests__/oauth-commands-routes.test.ts +37 -0
  184. package/src/__tests__/oauth-provider-visibility.test.ts +8 -8
  185. package/src/__tests__/oauth-store.test.ts +3 -2
  186. package/src/__tests__/onboarding-template-contract.test.ts +4 -3
  187. package/src/__tests__/openai-provider.test.ts +54 -9
  188. package/src/__tests__/openai-responses-provider.test.ts +176 -14
  189. package/src/__tests__/openrouter-provider-only.test.ts +27 -5
  190. package/src/__tests__/outbound-slack-persistence.test.ts +46 -1
  191. package/src/__tests__/pending-interactions-resolved-event.test.ts +0 -1
  192. package/src/__tests__/persistence-pipeline.test.ts +139 -1
  193. package/src/__tests__/persistence-secret-redaction.test.ts +83 -12
  194. package/src/__tests__/platform-bash-auto-approve.test.ts +2 -2
  195. package/src/__tests__/platform.test.ts +2 -2
  196. package/src/__tests__/plugin-api-tool-definition.test.ts +92 -0
  197. package/src/__tests__/plugin-bootstrap.test.ts +11 -13
  198. package/src/__tests__/plugin-tool-contribution.test.ts +50 -40
  199. package/src/__tests__/plugin-types.test.ts +3 -2
  200. package/src/__tests__/prechat-onboarding-contract.test.ts +131 -98
  201. package/src/__tests__/pricing.test.ts +12 -0
  202. package/src/__tests__/process-message-background-slack.test.ts +21 -16
  203. package/src/__tests__/process-message-display-content.test.ts +19 -22
  204. package/src/__tests__/provider-catalog-visibility.test.ts +9 -9
  205. package/src/__tests__/provider-platform-proxy-integration.test.ts +216 -4
  206. package/src/__tests__/provider-registry-ollama.test.ts +45 -22
  207. package/src/__tests__/prune-jobs-changes-parser.test.ts +61 -0
  208. package/src/__tests__/recording-handler.test.ts +1 -0
  209. package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +1 -0
  210. package/src/__tests__/registry.test.ts +84 -84
  211. package/src/__tests__/relay-server.test.ts +10 -10
  212. package/src/__tests__/require-fresh-approval.test.ts +2 -2
  213. package/src/__tests__/runtime-attachment-metadata.test.ts +3 -2
  214. package/src/__tests__/runtime-events-sse-bilingual.test.ts +154 -0
  215. package/src/__tests__/schedule-store.test.ts +16 -1
  216. package/src/__tests__/scheduler-reuse-conversation.test.ts +48 -3
  217. package/src/__tests__/secret-ingress-http.test.ts +5 -1
  218. package/src/__tests__/secure-keys.test.ts +3 -3
  219. package/src/__tests__/send-endpoint-busy.test.ts +81 -42
  220. package/src/__tests__/server-history-render.test.ts +4 -1
  221. package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
  222. package/src/__tests__/skill-feature-flags-integration.test.ts +8 -10
  223. package/src/__tests__/skill-feature-flags.test.ts +16 -18
  224. package/src/__tests__/skill-load-feature-flag.test.ts +5 -5
  225. package/src/__tests__/skill-projection-feature-flag.test.ts +48 -37
  226. package/src/__tests__/skill-projection.benchmark.test.ts +7 -13
  227. package/src/__tests__/skill-tool-factory.test.ts +97 -96
  228. package/src/__tests__/slack-channel-config.test.ts +3 -3
  229. package/src/__tests__/subagent-call-site-routing.test.ts +11 -3
  230. package/src/__tests__/subagent-disposal.test.ts +27 -8
  231. package/src/__tests__/subagent-fork-notifications.test.ts +24 -9
  232. package/src/__tests__/subagent-fork-spawn.test.ts +13 -4
  233. package/src/__tests__/subagent-manager-notify.test.ts +20 -8
  234. package/src/__tests__/subagent-notify-parent.test.ts +6 -5
  235. package/src/__tests__/subagent-spawn-tool-fork.test.ts +58 -0
  236. package/src/__tests__/subagent-tools.test.ts +2 -1
  237. package/src/__tests__/suggestion-routes.test.ts +2 -0
  238. package/src/__tests__/sync-message-contract.test.ts +59 -0
  239. package/src/__tests__/system-prompt.test.ts +183 -131
  240. package/src/__tests__/terminal-tools.test.ts +1 -1
  241. package/src/__tests__/test-preload-verifier.ts +68 -0
  242. package/src/__tests__/test-preload.ts +32 -39
  243. package/src/__tests__/tool-approval-handler.test.ts +1 -5
  244. package/src/__tests__/tool-execute-pipeline.test.ts +2 -2
  245. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -5
  246. package/src/__tests__/tool-executor-lifecycle-events.test.ts +35 -12
  247. package/src/__tests__/tool-executor.test.ts +64 -72
  248. package/src/__tests__/tool-grant-request-escalation.test.ts +1 -6
  249. package/src/__tests__/tool-preview-lifecycle.test.ts +1 -0
  250. package/src/__tests__/tool-result-metadata-plumbing.test.ts +1 -0
  251. package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
  252. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +1 -6
  253. package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
  254. package/src/__tests__/twilio-routes.test.ts +3 -2
  255. package/src/__tests__/ui-file-upload-surface.test.ts +2 -2
  256. package/src/__tests__/usage-routes.test.ts +3 -0
  257. package/src/__tests__/validate-input.test.ts +381 -0
  258. package/src/__tests__/verification-control-plane-policy.test.ts +3 -2
  259. package/src/__tests__/voice-scoped-grant-consumer.test.ts +2 -1
  260. package/src/__tests__/voice-session-bridge.test.ts +37 -28
  261. package/src/__tests__/workspace-git-service.test.ts +6 -5
  262. package/src/__tests__/workspace-migration-089-move-memory-tree-out-of-v3.test.ts +86 -0
  263. package/src/__tests__/workspace-migration-090-memory-router-cost-optimized-profile.test.ts +326 -0
  264. package/src/__tests__/workspace-migration-091-retighten-migration-onboarding-thread.test.ts +166 -0
  265. package/src/acp/__tests__/prepare-agent-env.test.ts +146 -0
  266. package/src/acp/prepare-agent-env.ts +78 -0
  267. package/src/acp/session-manager.ts +6 -7
  268. package/src/agent/loop.ts +88 -0
  269. package/src/api/README.md +127 -0
  270. package/src/api/constants/call-sites.ts +27 -0
  271. package/src/api/events/assistant-outbound-attachment.ts +51 -0
  272. package/src/api/events/assistant-text-delta.ts +32 -0
  273. package/src/api/events/assistant-turn-start.ts +33 -0
  274. package/src/api/events/document-comment-created.ts +48 -0
  275. package/src/api/events/document-comment-deleted.ts +24 -0
  276. package/src/api/events/document-comment-reopened.ts +25 -0
  277. package/src/api/events/document-comment-resolved.ts +27 -0
  278. package/src/api/events/generation-cancelled.ts +24 -0
  279. package/src/api/events/generation-handoff.ts +41 -0
  280. package/src/api/events/message-complete.ts +42 -0
  281. package/src/api/events/open-url.ts +30 -0
  282. package/src/api/events/relationship-state-updated.ts +25 -0
  283. package/src/api/events/tool-use-start.ts +32 -0
  284. package/src/api/index.ts +129 -0
  285. package/src/api/package.json +10 -0
  286. package/src/api/responses/llm-context-response.ts +39 -0
  287. package/src/api/responses/llm-request-log-entry.ts +93 -0
  288. package/src/api/responses/memory-recall-log.ts +65 -0
  289. package/src/api/responses/memory-v2-activation-log.ts +78 -0
  290. package/src/background-wake/background-wake-routes.test.ts +868 -0
  291. package/src/background-wake/platform-client.test.ts +308 -0
  292. package/src/background-wake/platform-client.ts +167 -0
  293. package/src/background-wake/publisher.ts +91 -0
  294. package/src/background-wake/runtime-registry.ts +24 -0
  295. package/src/background-wake/wake-intent-hooks.test.ts +282 -0
  296. package/src/calls/guardian-dispatch.ts +1 -0
  297. package/src/calls/voice-session-bridge.ts +4 -4
  298. package/src/cli/commands/__tests__/browser.test.ts +23 -5
  299. package/src/cli/commands/__tests__/conversations-slack.test.ts +16 -0
  300. package/src/cli/commands/__tests__/domain-register.test.ts +110 -0
  301. package/src/cli/commands/__tests__/domain-status.test.ts +33 -33
  302. package/src/cli/commands/__tests__/inference-send.test.ts +108 -5
  303. package/src/cli/commands/__tests__/memory-v2-compare-render.test.ts +98 -0
  304. package/src/cli/commands/__tests__/memory-v2.test.ts +1 -0
  305. package/src/cli/commands/__tests__/memory-v3-render.test.ts +340 -0
  306. package/src/cli/commands/__tests__/notifications.test.ts +184 -40
  307. package/src/cli/commands/browser.ts +247 -0
  308. package/src/cli/commands/channels/__tests__/channels.test.ts +143 -0
  309. package/src/cli/commands/channels/index.ts +229 -0
  310. package/src/cli/commands/domain.ts +91 -41
  311. package/src/cli/commands/inference.ts +93 -40
  312. package/src/cli/commands/memory-v2-compare-render.ts +115 -0
  313. package/src/cli/commands/memory-v2.ts +176 -1
  314. package/src/cli/commands/memory-v3-render.ts +491 -0
  315. package/src/cli/commands/memory-v3.ts +567 -0
  316. package/src/cli/commands/notifications.ts +365 -55
  317. package/src/cli/lib/open-browser.ts +7 -2
  318. package/src/cli/program.ts +4 -0
  319. package/src/config/assistant-feature-flags.ts +39 -46
  320. package/src/config/bundled-skills/document-editor/SKILL.md +16 -3
  321. package/src/config/bundled-skills/document-editor/TOOLS.json +18 -0
  322. package/src/config/bundled-skills/document-editor/tools/document-open.ts +12 -0
  323. package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
  324. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +2 -2
  325. package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +13 -8
  326. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +10 -3
  327. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +16 -14
  328. package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +7 -2
  329. package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +7 -2
  330. package/src/config/bundled-skills/schedule/SKILL.md +1 -1
  331. package/src/config/bundled-skills/schedule/TOOLS.json +2 -2
  332. package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -0
  333. package/src/config/bundled-tool-registry.ts +2 -0
  334. package/src/config/call-site-defaults.ts +8 -7
  335. package/src/config/feature-flag-cache.ts +86 -0
  336. package/src/config/feature-flag-registry.json +33 -17
  337. package/src/config/llm-context-resolution.ts +10 -1
  338. package/src/config/llm-resolver.ts +121 -15
  339. package/src/config/loader.ts +4 -5
  340. package/src/config/schemas/__tests__/memory-v2.test.ts +228 -1
  341. package/src/config/schemas/call-site-catalog.ts +21 -7
  342. package/src/config/schemas/heartbeat.ts +1 -1
  343. package/src/config/schemas/llm.ts +102 -2
  344. package/src/config/schemas/memory-v2.ts +272 -0
  345. package/src/config/schemas/memory.ts +2 -1
  346. package/src/config/schemas/services.ts +6 -2
  347. package/src/config/seed-inference-profiles.ts +36 -16
  348. package/src/context/compactor.ts +52 -0
  349. package/src/context/token-estimator.ts +10 -5
  350. package/src/conversations/__tests__/message-consolidation.test.ts +350 -0
  351. package/src/conversations/message-consolidation.ts +404 -0
  352. package/src/credential-execution/executable-discovery.ts +40 -0
  353. package/src/credential-execution/process-manager.ts +6 -2
  354. package/src/credential-health/credential-health-service.ts +125 -40
  355. package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +3 -6
  356. package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +13 -15
  357. package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +2 -3
  358. package/src/daemon/__tests__/daemon-skill-host.test.ts +2 -0
  359. package/src/daemon/__tests__/meet-manifest-loader.test.ts +25 -12
  360. package/src/daemon/__tests__/native-web-search-metadata.test.ts +1 -0
  361. package/src/daemon/__tests__/switch-inference-profile-tool.test.ts +107 -0
  362. package/src/daemon/__tests__/web-search-status-text.test.ts +1 -0
  363. package/src/daemon/conversation-agent-loop-handlers.ts +390 -80
  364. package/src/daemon/conversation-agent-loop.ts +244 -90
  365. package/src/daemon/conversation-error.ts +64 -6
  366. package/src/daemon/conversation-lifecycle.ts +27 -22
  367. package/src/daemon/conversation-messaging.ts +84 -43
  368. package/src/daemon/conversation-process.ts +74 -37
  369. package/src/daemon/conversation-runtime-assembly.ts +38 -17
  370. package/src/daemon/conversation-skill-tools.ts +14 -30
  371. package/src/daemon/conversation-surfaces.ts +69 -34
  372. package/src/daemon/conversation-tool-setup.ts +77 -32
  373. package/src/daemon/conversation-usage.ts +2 -0
  374. package/src/daemon/conversation.ts +40 -75
  375. package/src/daemon/daemon-control.ts +1 -1
  376. package/src/daemon/daemon-skill-host.ts +9 -2
  377. package/src/daemon/disk-pressure-guard.ts +39 -29
  378. package/src/daemon/first-greeting.ts +31 -13
  379. package/src/daemon/handlers/config-model.test.ts +1 -0
  380. package/src/daemon/handlers/conversations.ts +11 -3
  381. package/src/daemon/handlers/shared.ts +6 -1
  382. package/src/daemon/host-browser-proxy.ts +5 -5
  383. package/src/daemon/host-cu-proxy.ts +4 -4
  384. package/src/daemon/host-file-proxy.ts +4 -4
  385. package/src/daemon/host-proxy-base.ts +4 -4
  386. package/src/daemon/host-transfer-proxy.ts +10 -10
  387. package/src/daemon/lifecycle.ts +29 -26
  388. package/src/daemon/mcp-reload-service.ts +1 -1
  389. package/src/daemon/meet-manifest-loader.ts +11 -24
  390. package/src/daemon/message-types/conversations.ts +22 -27
  391. package/src/daemon/message-types/document-comments.ts +8 -44
  392. package/src/daemon/message-types/home.ts +2 -14
  393. package/src/daemon/message-types/integrations.ts +2 -7
  394. package/src/daemon/message-types/messages.ts +25 -48
  395. package/src/daemon/message-types/subagents.ts +6 -0
  396. package/src/daemon/message-types/sync.ts +14 -0
  397. package/src/daemon/process-message.ts +9 -9
  398. package/src/daemon/providers-setup.ts +1 -1
  399. package/src/daemon/server.ts +16 -0
  400. package/src/daemon/shutdown-handlers.ts +24 -5
  401. package/src/daemon/switch-inference-profile-tool.ts +62 -0
  402. package/src/daemon/tool-setup-types.ts +7 -0
  403. package/src/daemon/wake-target-adapter.ts +10 -0
  404. package/src/documents/document-store.ts +38 -0
  405. package/src/export/__tests__/transcript-formatter.test.ts +1 -0
  406. package/src/heartbeat/__tests__/heartbeat-service.test.ts +30 -1
  407. package/src/heartbeat/heartbeat-service.ts +63 -0
  408. package/src/home/__tests__/feed-writer.test.ts +161 -0
  409. package/src/home/__tests__/post-connect-feed.test.ts +1 -0
  410. package/src/home/__tests__/suggested-prompts.test.ts +55 -59
  411. package/src/home/feed-writer.ts +146 -7
  412. package/src/home/home-greeting.ts +0 -9
  413. package/src/home/suggested-prompts.ts +27 -154
  414. package/src/ipc/__tests__/cli-ipc.test.ts +1 -0
  415. package/src/ipc/gateway-client.test.ts +4 -1
  416. package/src/ipc/gateway-flag-listener.ts +123 -0
  417. package/src/ipc/skill-routes/__tests__/memory.test.ts +1 -0
  418. package/src/ipc/skill-routes/__tests__/registries.test.ts +36 -7
  419. package/src/ipc/skill-routes/memory.ts +4 -3
  420. package/src/ipc/skill-routes/registries.ts +35 -40
  421. package/src/memory/__tests__/db-async-query.test.ts +165 -0
  422. package/src/memory/__tests__/db-maintenance.test.ts +115 -0
  423. package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +242 -0
  424. package/src/memory/__tests__/jobs-store-job-classes.test.ts +28 -1
  425. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +26 -5
  426. package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +1 -0
  427. package/src/memory/__tests__/memory-retrospective-job.test.ts +8 -0
  428. package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +1 -0
  429. package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +31 -0
  430. package/src/memory/auto-analysis-enqueue.ts +5 -1
  431. package/src/memory/conversation-attention-store.ts +17 -3
  432. package/src/memory/conversation-crud.ts +423 -182
  433. package/src/memory/conversation-starters-cadence.ts +3 -1
  434. package/src/memory/conversation-title-service.ts +19 -3
  435. package/src/memory/db-async-query.ts +214 -0
  436. package/src/memory/db-connection.ts +29 -19
  437. package/src/memory/db-init.ts +14 -0
  438. package/src/memory/db-maintenance.ts +30 -21
  439. package/src/memory/db-singleton.ts +77 -0
  440. package/src/memory/delivery-channels.ts +82 -0
  441. package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +2 -4
  442. package/src/memory/graph/bootstrap.ts +8 -1
  443. package/src/memory/graph/capability-seed.ts +7 -3
  444. package/src/memory/graph/conversation-graph-memory.ts +100 -17
  445. package/src/memory/graph/extraction.ts +1 -5
  446. package/src/memory/graph/graph-search.ts +7 -1
  447. package/src/memory/graph/retriever.test.ts +3 -3
  448. package/src/memory/indexer.ts +28 -18
  449. package/src/memory/job-handlers/cleanup.ts +76 -18
  450. package/src/memory/job-handlers/conversation-starters.ts +1 -4
  451. package/src/memory/job-handlers/embedding.test.ts +3 -2
  452. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +5 -2
  453. package/src/memory/jobs/embed-pkb-file.ts +6 -1
  454. package/src/memory/jobs-store.ts +14 -0
  455. package/src/memory/jobs-worker.ts +66 -22
  456. package/src/memory/llm-request-log-source-clickhouse.ts +122 -2
  457. package/src/memory/llm-request-log-source-local.ts +31 -0
  458. package/src/memory/llm-request-log-source.ts +40 -2
  459. package/src/memory/llm-request-log-store.ts +228 -1
  460. package/src/memory/llm-usage-store.ts +24 -0
  461. package/src/memory/memory-retrospective-enqueue.ts +8 -1
  462. package/src/memory/memory-retrospective-job.ts +5 -0
  463. package/src/memory/memory-v2-activation-log-store.ts +110 -7
  464. package/src/memory/migrations/260-rename-cleaned-at.ts +44 -0
  465. package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +36 -0
  466. package/src/memory/migrations/262-memory-v3-coactivation.ts +57 -0
  467. package/src/memory/migrations/263-memory-v3-auto-edges.ts +50 -0
  468. package/src/memory/migrations/264-llm-request-log-call-site.ts +29 -0
  469. package/src/memory/migrations/265-drop-provider-connection-status.ts +26 -0
  470. package/src/memory/migrations/266-messages-client-message-id.ts +43 -0
  471. package/src/memory/migrations/index.ts +19 -0
  472. package/src/memory/migrations/registry.ts +33 -0
  473. package/src/memory/schema/conversations.ts +10 -2
  474. package/src/memory/schema/inference.ts +0 -1
  475. package/src/memory/schema/infrastructure.ts +21 -0
  476. package/src/memory/tool-usage-store.ts +36 -8
  477. package/src/memory/v2/__tests__/backfill-jobs.test.ts +5 -2
  478. package/src/memory/v2/__tests__/consolidation-job.test.ts +1 -0
  479. package/src/memory/v2/__tests__/harness-compare.test.ts +186 -0
  480. package/src/memory/v2/__tests__/harness-metrics.test.ts +83 -0
  481. package/src/memory/v2/__tests__/harness-oracle.test.ts +257 -0
  482. package/src/memory/v2/__tests__/harness-replay-input.test.ts +230 -0
  483. package/src/memory/v2/__tests__/harness-runner.test.ts +135 -0
  484. package/src/memory/v2/__tests__/injection.test.ts +127 -98
  485. package/src/memory/v2/__tests__/qdrant.test.ts +36 -0
  486. package/src/memory/v2/__tests__/router.test.ts +171 -3
  487. package/src/memory/v2/__tests__/sweep-job.test.ts +6 -3
  488. package/src/memory/v2/harness/compare.ts +57 -0
  489. package/src/memory/v2/harness/metrics.ts +128 -0
  490. package/src/memory/v2/harness/oracle.ts +145 -0
  491. package/src/memory/v2/harness/replay-input.ts +240 -0
  492. package/src/memory/v2/harness/retriever.ts +74 -0
  493. package/src/memory/v2/harness/router-retriever.ts +43 -0
  494. package/src/memory/v2/harness/runner.ts +112 -0
  495. package/src/memory/v2/harness/trace.ts +64 -0
  496. package/src/memory/v2/injection.ts +21 -15
  497. package/src/memory/v2/prompts/router.ts +26 -1
  498. package/src/memory/v2/qdrant.ts +14 -2
  499. package/src/memory/v2/router.ts +171 -18
  500. package/src/memory/v3/__tests__/coactivation-store.test.ts +422 -0
  501. package/src/memory/v3/__tests__/consolidation-job.test.ts +466 -0
  502. package/src/memory/v3/__tests__/coretrieval-seed.test.ts +270 -0
  503. package/src/memory/v3/__tests__/edge-learning-job.test.ts +324 -0
  504. package/src/memory/v3/__tests__/edges.test.ts +706 -0
  505. package/src/memory/v3/__tests__/filter.test.ts +560 -0
  506. package/src/memory/v3/__tests__/gate.test.ts +637 -0
  507. package/src/memory/v3/__tests__/index-composition.test.ts +291 -0
  508. package/src/memory/v3/__tests__/loop.test.ts +775 -0
  509. package/src/memory/v3/__tests__/retriever.test.ts +226 -0
  510. package/src/memory/v3/__tests__/scouts.test.ts +489 -0
  511. package/src/memory/v3/__tests__/shadow-diff.test.ts +225 -0
  512. package/src/memory/v3/__tests__/shadow-middleware.test.ts +398 -0
  513. package/src/memory/v3/__tests__/system-prompts.test.ts +154 -0
  514. package/src/memory/v3/__tests__/traversal.test.ts +508 -0
  515. package/src/memory/v3/__tests__/tree-index.test.ts +280 -0
  516. package/src/memory/v3/__tests__/tree-store.test.ts +529 -0
  517. package/src/memory/v3/__tests__/tree-walk.test.ts +784 -0
  518. package/src/memory/v3/__tests__/validate.test.ts +277 -0
  519. package/src/memory/v3/auto-edges.ts +223 -0
  520. package/src/memory/v3/coactivation-store.ts +124 -0
  521. package/src/memory/v3/consolidation-job.ts +323 -0
  522. package/src/memory/v3/coretrieval-seed.ts +240 -0
  523. package/src/memory/v3/edge-learning-job.ts +160 -0
  524. package/src/memory/v3/edges.ts +286 -0
  525. package/src/memory/v3/filter.ts +286 -0
  526. package/src/memory/v3/gate.ts +349 -0
  527. package/src/memory/v3/index-composition.ts +126 -0
  528. package/src/memory/v3/llm-capture.ts +46 -0
  529. package/src/memory/v3/loop.ts +430 -0
  530. package/src/memory/v3/maintenance.ts +144 -0
  531. package/src/memory/v3/prompt-context.ts +33 -0
  532. package/src/memory/v3/prompts/consolidation.ts +458 -0
  533. package/src/memory/v3/prompts/system-prompts.ts +196 -0
  534. package/src/memory/v3/retriever.ts +33 -0
  535. package/src/memory/v3/scouts.ts +431 -0
  536. package/src/memory/v3/shadow-diff.ts +287 -0
  537. package/src/memory/v3/shadow-middleware.ts +347 -0
  538. package/src/memory/v3/traversal.ts +211 -0
  539. package/src/memory/v3/tree-index.ts +237 -0
  540. package/src/memory/v3/tree-store.ts +394 -0
  541. package/src/memory/v3/tree-walk.ts +356 -0
  542. package/src/memory/v3/types.ts +65 -0
  543. package/src/memory/v3/validate.ts +323 -0
  544. package/src/notifications/__tests__/emit-signal-home-feed.test.ts +1 -0
  545. package/src/notifications/__tests__/home-feed-side-effect.test.ts +1 -0
  546. package/src/notifications/adapters/macos.ts +18 -1
  547. package/src/notifications/adapters/platform.ts +1 -1
  548. package/src/notifications/adapters/slack.ts +45 -11
  549. package/src/notifications/broadcaster.ts +114 -63
  550. package/src/notifications/conversation-pairing.ts +23 -3
  551. package/src/notifications/decision-engine.ts +1 -4
  552. package/src/notifications/decisions-store.ts +32 -1
  553. package/src/notifications/deliveries-store.ts +45 -0
  554. package/src/notifications/edit-notification.ts +201 -0
  555. package/src/notifications/emit-signal.ts +40 -50
  556. package/src/notifications/signal.ts +10 -0
  557. package/src/notifications/types.ts +37 -0
  558. package/src/oauth/byo-connection.test.ts +67 -3
  559. package/src/oauth/byo-connection.ts +32 -5
  560. package/src/oauth/connect-orchestrator.ts +9 -0
  561. package/src/oauth/connection-resolver.test.ts +76 -0
  562. package/src/oauth/connection-resolver.ts +49 -10
  563. package/src/oauth/manual-token-connection.ts +51 -3
  564. package/src/oauth/seed-providers.ts +3 -0
  565. package/src/permissions/approval-policy.test.ts +19 -5
  566. package/src/permissions/approval-policy.ts +14 -3
  567. package/src/permissions/checker.ts +21 -8
  568. package/src/permissions/prompter.ts +3 -3
  569. package/src/permissions/question-prompter.ts +5 -2
  570. package/src/permissions/secret-prompter.ts +2 -2
  571. package/src/platform/client.test.ts +24 -1
  572. package/src/platform/client.ts +8 -0
  573. package/src/platform/feature-gate.ts +15 -0
  574. package/src/plugin-api/index.ts +4 -0
  575. package/src/plugin-api/types.ts +7 -33
  576. package/src/plugins/defaults/index.ts +6 -0
  577. package/src/plugins/defaults/injectors.ts +20 -19
  578. package/src/plugins/defaults/persistence.ts +25 -6
  579. package/src/plugins/external-plugin-loader.ts +5 -68
  580. package/src/plugins/types.ts +68 -29
  581. package/src/proactive-artifact/aux-message-injector.ts +17 -4
  582. package/src/proactive-artifact/job.test.ts +1 -0
  583. package/src/prompts/__tests__/system-prompt.test.ts +4 -4
  584. package/src/prompts/__tests__/task-progress-hint-section.test.ts +3 -9
  585. package/src/prompts/persona-resolver.ts +36 -21
  586. package/src/prompts/sections.ts +39 -7
  587. package/src/prompts/system-prompt.ts +84 -221
  588. package/src/prompts/template-detection.ts +10 -4
  589. package/src/prompts/templates/BOOTSTRAP.md +9 -13
  590. package/src/prompts/templates/IDENTITY.md +0 -2
  591. package/src/prompts/templates/system-sections.ts +230 -8
  592. package/src/providers/__tests__/connection-model-compat.test.ts +233 -0
  593. package/src/providers/__tests__/registry-native-web-search.test.ts +122 -0
  594. package/src/providers/__tests__/retry-callsite.test.ts +85 -5
  595. package/src/providers/anthropic/client.ts +32 -66
  596. package/src/providers/call-site-routing.ts +42 -6
  597. package/src/providers/connection-model-compat.ts +61 -0
  598. package/src/providers/connection-resolution.ts +47 -14
  599. package/src/providers/fireworks/client.ts +1 -0
  600. package/src/providers/gemini/client.ts +70 -6
  601. package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +0 -2
  602. package/src/providers/inference/__tests__/base-url-security.test.ts +2 -3
  603. package/src/providers/inference/__tests__/{connections-status-label.test.ts → connections-label.test.ts} +12 -111
  604. package/src/providers/inference/adapter-factory.ts +3 -0
  605. package/src/providers/inference/auth.ts +0 -8
  606. package/src/providers/inference/connections.ts +3 -66
  607. package/src/providers/inference/resolve-auth.ts +2 -3
  608. package/src/providers/minimax/client.ts +106 -0
  609. package/src/providers/model-catalog.ts +78 -1
  610. package/src/providers/model-intents.ts +4 -4
  611. package/src/providers/openai/__tests__/api-error-detail.test.ts +120 -0
  612. package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +157 -5
  613. package/src/providers/openai/chat-completions-provider.ts +116 -15
  614. package/src/providers/openai/codex-models.ts +20 -0
  615. package/src/providers/openai/responses-provider.ts +87 -30
  616. package/src/providers/openrouter/client.ts +13 -8
  617. package/src/providers/provider-send-message.ts +20 -5
  618. package/src/providers/registry.ts +48 -8
  619. package/src/providers/retry.ts +50 -7
  620. package/src/providers/search-provider-catalog.ts +17 -9
  621. package/src/providers/thinking-config.ts +26 -1
  622. package/src/providers/types.ts +9 -0
  623. package/src/providers/usage-tracking.ts +2 -0
  624. package/src/runtime/AGENTS.md +2 -2
  625. package/src/runtime/__tests__/agent-wake.test.ts +1 -0
  626. package/src/runtime/__tests__/background-job-runner.test.ts +1 -0
  627. package/src/runtime/access-request-helper.ts +1 -0
  628. package/src/runtime/agent-wake.ts +1 -0
  629. package/src/runtime/assistant-event-hub.ts +76 -6
  630. package/src/runtime/auth/route-policy.ts +46 -0
  631. package/src/runtime/btw-sidechain.ts +0 -6
  632. package/src/runtime/channel-readiness-service.ts +68 -0
  633. package/src/runtime/channel-reply-delivery.ts +23 -0
  634. package/src/runtime/channel-retry-sweep.ts +47 -14
  635. package/src/runtime/confirmation-request-guardian-bridge.ts +1 -1
  636. package/src/runtime/http-types.ts +0 -2
  637. package/src/runtime/migrations/vbundle-builder.ts +12 -4
  638. package/src/runtime/pending-interactions.ts +0 -1
  639. package/src/runtime/routes/__tests__/bookmark-routes.test.ts +1 -0
  640. package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +406 -0
  641. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +204 -0
  642. package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +1 -1
  643. package/src/runtime/routes/__tests__/home-feed-routes.test.ts +209 -1
  644. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +13 -50
  645. package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +76 -9
  646. package/src/runtime/routes/__tests__/memory-v3-simulate-params.test.ts +35 -0
  647. package/src/runtime/routes/__tests__/plugins-routes.test.ts +512 -0
  648. package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +3 -2
  649. package/src/runtime/routes/__tests__/surface-content-routes.test.ts +294 -0
  650. package/src/runtime/routes/__tests__/task-routes.test.ts +48 -3
  651. package/src/runtime/routes/acp-routes-list.test.ts +3 -0
  652. package/src/runtime/routes/acp-routes.test.ts +255 -6
  653. package/src/runtime/routes/acp-routes.ts +8 -1
  654. package/src/runtime/routes/app-management-routes.ts +111 -4
  655. package/src/runtime/routes/avatar-routes.ts +10 -10
  656. package/src/runtime/routes/background-wake-routes.ts +356 -0
  657. package/src/runtime/routes/browser-tabs-routes.ts +200 -0
  658. package/src/runtime/routes/btw-routes.ts +4 -10
  659. package/src/runtime/routes/conversation-analysis-routes.ts +6 -0
  660. package/src/runtime/routes/conversation-cli-routes.ts +1 -1
  661. package/src/runtime/routes/conversation-compaction-routes.ts +263 -0
  662. package/src/runtime/routes/conversation-list-routes.ts +159 -4
  663. package/src/runtime/routes/conversation-management-routes.ts +108 -26
  664. package/src/runtime/routes/conversation-query-routes.ts +200 -44
  665. package/src/runtime/routes/conversation-routes.ts +409 -521
  666. package/src/runtime/routes/conversation-starter-routes.ts +6 -3
  667. package/src/runtime/routes/conversations-import-routes.ts +19 -6
  668. package/src/runtime/routes/disk-pressure-routes.ts +1 -1
  669. package/src/runtime/routes/documents-routes.ts +10 -1
  670. package/src/runtime/routes/domain-routes.ts +60 -10
  671. package/src/runtime/routes/email-routes.ts +5 -2
  672. package/src/runtime/routes/events-routes.ts +54 -10
  673. package/src/runtime/routes/group-routes.ts +35 -8
  674. package/src/runtime/routes/home-feed-routes.ts +129 -0
  675. package/src/runtime/routes/host-browser-routes.ts +10 -2
  676. package/src/runtime/routes/host-cu-routes.ts +2 -2
  677. package/src/runtime/routes/identity-intro-cache.ts +61 -16
  678. package/src/runtime/routes/identity-routes.ts +30 -9
  679. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +96 -3
  680. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +530 -6
  681. package/src/runtime/routes/inbound-stages/background-dispatch.ts +57 -8
  682. package/src/runtime/routes/index.ts +10 -0
  683. package/src/runtime/routes/inference-profile-session-handler.ts +22 -12
  684. package/src/runtime/routes/inference-profile-session-routes.ts +7 -1
  685. package/src/runtime/routes/inference-provider-connection-routes.ts +5 -26
  686. package/src/runtime/routes/integrations/vercel.ts +15 -0
  687. package/src/runtime/routes/llm-call-sites-routes.ts +32 -5
  688. package/src/runtime/routes/llm-context-normalization.ts +7 -2
  689. package/src/runtime/routes/memory-item-routes.ts +8 -3
  690. package/src/runtime/routes/memory-v2-routes.ts +215 -5
  691. package/src/runtime/routes/memory-v3-routes.ts +474 -0
  692. package/src/runtime/routes/migration-routes.ts +32 -28
  693. package/src/runtime/routes/notification-routes.ts +63 -1
  694. package/src/runtime/routes/oauth-commands-routes.ts +6 -1
  695. package/src/runtime/routes/plugins-routes.ts +337 -0
  696. package/src/runtime/routes/rename-conversation-routes.ts +6 -2
  697. package/src/runtime/routes/secret-routes.ts +25 -5
  698. package/src/runtime/routes/settings-routes.ts +12 -11
  699. package/src/runtime/routes/slack-channel-routes.ts +5 -4
  700. package/src/runtime/routes/surface-action-routes.ts +1 -38
  701. package/src/runtime/routes/surface-content-routes.ts +12 -5
  702. package/src/runtime/routes/surface-conversation-resolver.ts +65 -0
  703. package/src/runtime/routes/wipe-conversation-routes.ts +3 -0
  704. package/src/runtime/routes/workspace-routes.ts +25 -10
  705. package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -0
  706. package/src/runtime/slack-dm-text-delivery.ts +177 -0
  707. package/src/runtime/sync/resource-sync-events.ts +106 -38
  708. package/src/runtime/sync/sync-publisher.test.ts +49 -0
  709. package/src/runtime/sync/sync-publisher.ts +2 -1
  710. package/src/runtime/tool-grant-request-helper.ts +1 -0
  711. package/src/runtime/verification-outbound-actions.ts +73 -1
  712. package/src/schedule/schedule-store.ts +8 -1
  713. package/src/schedule/scheduler.ts +111 -15
  714. package/src/security/__tests__/provider-key-env-fallback.test.ts +3 -3
  715. package/src/security/encrypted-store.ts +7 -16
  716. package/src/security/store-path-override.ts +61 -0
  717. package/src/signals/user-message.ts +5 -8
  718. package/src/skills/validate-input.ts +177 -0
  719. package/src/subagent/manager.ts +13 -13
  720. package/src/subagent/types.ts +6 -0
  721. package/src/tasks/tool-sanitizer.ts +2 -2
  722. package/src/telemetry/types.ts +12 -0
  723. package/src/telemetry/usage-telemetry-reporter.test.ts +48 -0
  724. package/src/telemetry/usage-telemetry-reporter.ts +1 -0
  725. package/src/tools/acp/spawn.test.ts +119 -0
  726. package/src/tools/acp/spawn.ts +15 -2
  727. package/src/tools/apps/definitions.ts +36 -28
  728. package/src/tools/ask-question/ask-question-tool.test.ts +3 -3
  729. package/src/tools/ask-question/ask-question-tool.ts +38 -45
  730. package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +2 -8
  731. package/src/tools/browser/__tests__/pinned-tabs.test.ts +70 -0
  732. package/src/tools/browser/browser-execution.ts +16 -3
  733. package/src/tools/browser/cdp-client/__tests__/browser-tabs-factory.test.ts +402 -0
  734. package/src/tools/browser/cdp-client/__tests__/types.test.ts +3 -0
  735. package/src/tools/browser/cdp-client/cdp-inspect-client.ts +12 -0
  736. package/src/tools/browser/cdp-client/extension-cdp-client.ts +27 -1
  737. package/src/tools/browser/cdp-client/factory.ts +100 -17
  738. package/src/tools/browser/cdp-client/local-cdp-client.ts +12 -0
  739. package/src/tools/browser/cdp-client/types.ts +65 -0
  740. package/src/tools/browser/pinned-tabs.ts +96 -40
  741. package/src/tools/computer-use/definitions.ts +282 -336
  742. package/src/tools/credential-execution/make-authenticated-request.ts +3 -9
  743. package/src/tools/credential-execution/manage-secure-command-tool.ts +3 -9
  744. package/src/tools/credential-execution/run-authenticated-command.ts +3 -9
  745. package/src/tools/credentials/vault.ts +3 -9
  746. package/src/tools/document/document-tool.ts +189 -7
  747. package/src/tools/execution-target.ts +18 -23
  748. package/src/tools/executor.ts +24 -56
  749. package/src/tools/filesystem/edit.ts +3 -9
  750. package/src/tools/filesystem/list.ts +3 -9
  751. package/src/tools/filesystem/read.ts +3 -9
  752. package/src/tools/filesystem/write.ts +3 -9
  753. package/src/tools/host-filesystem/edit.test.ts +1 -0
  754. package/src/tools/host-filesystem/edit.ts +3 -9
  755. package/src/tools/host-filesystem/read.test.ts +1 -0
  756. package/src/tools/host-filesystem/read.ts +3 -9
  757. package/src/tools/host-filesystem/transfer.test.ts +31 -6
  758. package/src/tools/host-filesystem/transfer.ts +3 -9
  759. package/src/tools/host-filesystem/write.test.ts +1 -0
  760. package/src/tools/host-filesystem/write.ts +3 -9
  761. package/src/tools/host-terminal/host-shell.ts +3 -9
  762. package/src/tools/mcp/mcp-tool-factory.ts +1 -10
  763. package/src/tools/memory/register.test.ts +1 -1
  764. package/src/tools/memory/register.ts +4 -9
  765. package/src/tools/network/__tests__/managed-search-proxy.test.ts +282 -0
  766. package/src/tools/network/__tests__/web-search.test.ts +211 -3
  767. package/src/tools/network/managed-search-proxy.ts +183 -0
  768. package/src/tools/network/web-fetch.ts +3 -9
  769. package/src/tools/network/web-search.ts +224 -76
  770. package/src/tools/policy-context.ts +3 -1
  771. package/src/tools/registry.ts +150 -123
  772. package/src/tools/schedule/create.ts +1 -1
  773. package/src/tools/schema-transforms.ts +1 -1
  774. package/src/tools/skills/execute.ts +3 -9
  775. package/src/tools/skills/load.ts +3 -9
  776. package/src/tools/skills/skill-tool-factory.ts +18 -44
  777. package/src/tools/subagent/notify-parent.ts +3 -9
  778. package/src/tools/subagent/spawn.ts +3 -0
  779. package/src/tools/system/request-permission.ts +3 -9
  780. package/src/tools/terminal/shell.ts +3 -9
  781. package/src/tools/tool-approval-handler.ts +10 -4
  782. package/src/tools/tool-defaults.ts +94 -0
  783. package/src/tools/tool-name-aliases.ts +72 -14
  784. package/src/tools/types.ts +32 -101
  785. package/src/tools/ui-surface/definitions.ts +104 -108
  786. package/src/types/onboarding-context.ts +6 -0
  787. package/src/usage/attribution.ts +32 -1
  788. package/src/usage/pricing.ts +23 -0
  789. package/src/usage/types.ts +12 -0
  790. package/src/util/browser.ts +7 -2
  791. package/src/util/logger.ts +16 -7
  792. package/src/util/platform.ts +7 -2
  793. package/src/util/sqlite3-runtime.ts +65 -0
  794. package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +1 -0
  795. package/src/workspace/migrations/089-move-memory-tree-out-of-v3.ts +86 -0
  796. package/src/workspace/migrations/090-memory-router-cost-optimized-profile.ts +109 -0
  797. package/src/workspace/migrations/091-retighten-migration-onboarding-thread.ts +41 -0
  798. package/src/workspace/migrations/registry.ts +6 -0
  799. package/src/__tests__/compaction-strip-metadata-clear.test.ts +0 -206
  800. package/src/__tests__/message-complete-display-id.test.ts +0 -175
  801. package/src/daemon/query-complexity-router.ts +0 -75
  802. package/src/prompts/cache-boundary.ts +0 -8
@@ -11,7 +11,11 @@ import type { ChannelId, InterfaceId } from "../../../channels/types.js";
11
11
  import { findGuardianForChannel } from "../../../contacts/contact-store.js";
12
12
  import type { ServerMessage } from "../../../daemon/message-protocol.js";
13
13
  import type { TrustContext } from "../../../daemon/trust-context.js";
14
- import { updateDeliveredSegmentCount } from "../../../memory/delivery-channels.js";
14
+ import {
15
+ addSlackDmLiveDeliveredTextResponseIndex,
16
+ getSlackDmLiveDeliveredTextResponseIndexes,
17
+ updateDeliveredSegmentCount,
18
+ } from "../../../memory/delivery-channels.js";
15
19
  import {
16
20
  linkMessage,
17
21
  storeReplyMessageId,
@@ -44,6 +48,10 @@ import type {
44
48
  MessageProcessor,
45
49
  SlackInboundMessageMetadata,
46
50
  } from "../../http-types.js";
51
+ import {
52
+ createSlackDmTextDeliveryController,
53
+ isSlackDeliveryCallbackUrl,
54
+ } from "../../slack-dm-text-delivery.js";
47
55
  import { resolveRoutingState } from "../../trust-context-resolver.js";
48
56
  import { deliverReplyViaCallback } from "../channel-delivery-routes.js";
49
57
  import { deliverGeneratedApprovalPrompt } from "../guardian-approval-prompt.js";
@@ -228,6 +236,21 @@ export function processChannelMessageInBackground(
228
236
  }
229
237
  : undefined;
230
238
  let replyMessageId: string | undefined;
239
+ const slackDmTextDelivery = createSlackDmTextDeliveryController({
240
+ sourceChannel,
241
+ chatType,
242
+ replyCallbackUrl,
243
+ chatId: externalChatId,
244
+ assistantId,
245
+ deliveredTextResponseIndexes:
246
+ getSlackDmLiveDeliveredTextResponseIndexes(eventId),
247
+ onTextResponseDelivered: (responseIndex, reason) => {
248
+ addSlackDmLiveDeliveredTextResponseIndex(eventId, responseIndex);
249
+ if (reason === "before_tool") {
250
+ slackThinkingStatus?.refreshAfterReply();
251
+ }
252
+ },
253
+ });
231
254
  const observeAgentEvent = (msg: ServerMessage): void => {
232
255
  if (
233
256
  msg.type === "message_complete" &&
@@ -236,6 +259,7 @@ export function processChannelMessageInBackground(
236
259
  ) {
237
260
  replyMessageId = msg.messageId;
238
261
  }
262
+ slackDmTextDelivery?.observeEvent(msg);
239
263
  slackThinkingStatus?.observeEvent(msg);
240
264
  };
241
265
 
@@ -297,12 +321,21 @@ export function processChannelMessageInBackground(
297
321
  { err, conversationId },
298
322
  "Background channel message processing failed",
299
323
  );
324
+ if (slackDmTextDelivery) {
325
+ await slackDmTextDelivery.waitForPendingDeliveries();
326
+ }
300
327
  recordProcessingFailure(eventId, err);
301
328
  return;
302
329
  }
303
330
 
304
331
  if (replyCallbackUrl) {
305
332
  try {
333
+ if (slackDmTextDelivery) {
334
+ await slackDmTextDelivery.waitForPendingDeliveries();
335
+ }
336
+ const liveDeliveryResumeOptions =
337
+ slackDmTextDelivery?.getFinalDeliveryResumeOptions(replyMessageId);
338
+
306
339
  await deliverReplyViaCallback(
307
340
  conversationId,
308
341
  externalChatId,
@@ -311,6 +344,7 @@ export function processChannelMessageInBackground(
311
344
  {
312
345
  messageId: replyMessageId,
313
346
  sinceMessageId: userMessageId,
347
+ ...liveDeliveryResumeOptions,
314
348
  onSegmentDelivered: (count) =>
315
349
  updateDeliveredSegmentCount(eventId, count),
316
350
  },
@@ -395,11 +429,13 @@ function startTelegramTypingHeartbeat(
395
429
 
396
430
  type SlackThinkingStatusController = {
397
431
  observeEvent: (msg: ServerMessage) => void;
432
+ refreshAfterReply: () => void;
398
433
  stop: () => void;
399
434
  };
400
435
 
401
436
  type SlackThinkingStatusHandle = {
402
437
  updateLoadingMessages: (loadingMessages?: string[]) => void;
438
+ refresh: (loadingMessages?: string[]) => void;
403
439
  clear: () => void;
404
440
  };
405
441
 
@@ -440,12 +476,9 @@ function shouldEmitSlackThinkingStatus(
440
476
  sourceChannel: ChannelId,
441
477
  replyCallbackUrl?: string,
442
478
  ): boolean {
443
- if (sourceChannel !== "slack" || !replyCallbackUrl) return false;
444
- try {
445
- return new URL(replyCallbackUrl).pathname.endsWith("/deliver/slack");
446
- } catch {
447
- return replyCallbackUrl.endsWith("/deliver/slack");
448
- }
479
+ return (
480
+ sourceChannel === "slack" && isSlackDeliveryCallbackUrl(replyCallbackUrl)
481
+ );
449
482
  }
450
483
 
451
484
  export function shouldStartSlackThinkingStatusImmediately(params: {
@@ -547,6 +580,13 @@ function createSlackThinkingStatusController(params: {
547
580
  start();
548
581
  }
549
582
  },
583
+ refreshAfterReply() {
584
+ if (stopped || !slackThinkingStatus) return;
585
+ // Slack clears assistant thread status when the app sends a reply, so
586
+ // live pre-tool replies need to reassert it while work continues.
587
+ slackThinkingStatus.refresh(currentLoadingMessages);
588
+ lastSentLoadingMessageKey = getLoadingMessagesKey(currentLoadingMessages);
589
+ },
550
590
  stop() {
551
591
  stopped = true;
552
592
  slackThinkingStatus?.clear();
@@ -627,7 +667,9 @@ function getTaskProgressLoadingMessage(
627
667
 
628
668
  const activeStep = progress.steps[activeStepIndex]!;
629
669
  return [
630
- `In progress (${activeStepIndex + 1}/${progress.steps.length}): ${activeStep.label}`,
670
+ `In progress (${activeStepIndex + 1}/${progress.steps.length}): ${
671
+ activeStep.label
672
+ }`,
631
673
  ];
632
674
  }
633
675
 
@@ -656,6 +698,7 @@ function setSlackThinkingStatus(
656
698
  if (!messageTs) {
657
699
  return {
658
700
  updateLoadingMessages: () => {},
701
+ refresh: () => {},
659
702
  clear: () => {},
660
703
  };
661
704
  }
@@ -697,6 +740,7 @@ function setSlackThinkingStatus(
697
740
 
698
741
  return {
699
742
  updateLoadingMessages: () => {},
743
+ refresh: () => {},
700
744
  clear: clearReaction,
701
745
  };
702
746
  }
@@ -739,6 +783,10 @@ function setSlackThinkingStatus(
739
783
  );
740
784
  };
741
785
 
786
+ const refresh = (nextLoadingMessages?: string[]): void => {
787
+ updateLoadingMessages(nextLoadingMessages);
788
+ };
789
+
742
790
  const clearStatus = (): void => {
743
791
  if (cleared) return;
744
792
  cleared = true;
@@ -766,6 +814,7 @@ function setSlackThinkingStatus(
766
814
 
767
815
  return {
768
816
  updateLoadingMessages,
817
+ refresh,
769
818
  clear: clearStatus,
770
819
  };
771
820
  }
@@ -18,10 +18,12 @@ import { ROUTES as AUDIT_ROUTES } from "./audit-routes.js";
18
18
  import { ROUTES as AUTH_ROUTES } from "./auth-routes.js";
19
19
  import { ROUTES as AVATAR_ROUTES } from "./avatar-routes.js";
20
20
  import { ROUTES as BACKGROUND_TOOL_ROUTES } from "./background-tool-routes.js";
21
+ import { ROUTES as BACKGROUND_WAKE_ROUTES } from "./background-wake-routes.js";
21
22
  import { ROUTES as BACKUP_ROUTES } from "./backup-routes.js";
22
23
  import { ROUTES as BOOKMARK_ROUTES } from "./bookmark-routes.js";
23
24
  import { ROUTES as BRAIN_GRAPH_ROUTES } from "./brain-graph-routes.js";
24
25
  import { ROUTES as BROWSER_ROUTES } from "./browser-routes.js";
26
+ import { ROUTES as BROWSER_TABS_ROUTES } from "./browser-tabs-routes.js";
25
27
  import { ROUTES as BTW_ROUTES } from "./btw-routes.js";
26
28
  import { ROUTES as CACHE_ROUTES } from "./cache-routes.js";
27
29
  import { ROUTES as CALL_ROUTES } from "./call-routes.js";
@@ -38,6 +40,7 @@ import { ROUTES as CONTENT_SOURCE_ROUTES } from "./content-source-routes.js";
38
40
  import { ROUTES as CONVERSATION_ANALYSIS_ROUTES } from "./conversation-analysis-routes.js";
39
41
  import { ROUTES as CONVERSATION_ATTENTION_ROUTES } from "./conversation-attention-routes.js";
40
42
  import { ROUTES as CONVERSATION_CLI_ROUTES } from "./conversation-cli-routes.js";
43
+ import { ROUTES as CONVERSATION_COMPACTION_ROUTES } from "./conversation-compaction-routes.js";
41
44
  import { ROUTES as CONVERSATION_LIST_ROUTES } from "./conversation-list-routes.js";
42
45
  import { ROUTES as CONVERSATION_MANAGEMENT_ROUTES } from "./conversation-management-routes.js";
43
46
  import { ROUTES as CONVERSATION_QUERY_ROUTES } from "./conversation-query-routes.js";
@@ -88,6 +91,7 @@ import { ROUTES as LOG_EXPORT_ROUTES } from "./log-export-routes.js";
88
91
  import { ROUTES as MCP_AUTH_ROUTES } from "./mcp-auth-routes.js";
89
92
  import { ROUTES as MEMORY_ITEM_ROUTES } from "./memory-item-routes.js";
90
93
  import { ROUTES as MEMORY_V2_ROUTES } from "./memory-v2-routes.js";
94
+ import { ROUTES as MEMORY_V3_ROUTES } from "./memory-v3-routes.js";
91
95
  import { ROUTES as MIGRATION_ROLLBACK_ROUTES } from "./migration-rollback-routes.js";
92
96
  import { ROUTES as MIGRATION_ROUTES } from "./migration-routes.js";
93
97
  import { ROUTES as NOTIFICATION_ROUTES } from "./notification-routes.js";
@@ -98,6 +102,7 @@ import { ROUTES as OAUTH_LIFECYCLE_ROUTES } from "./oauth-lifecycle-routes.js";
98
102
  import { ROUTES as OAUTH_PROVIDERS_ROUTES } from "./oauth-providers.js";
99
103
  import { ROUTES as PLATFORM_ROUTES } from "./platform-routes.js";
100
104
  import { ROUTES as PLAYGROUND_ROUTES } from "./playground/index.js";
105
+ import { ROUTES as PLUGINS_ROUTES } from "./plugins-routes.js";
101
106
  import { ROUTES as PROFILER_ROUTES } from "./profiler-routes.js";
102
107
  import { ROUTES as PS_ROUTES } from "./ps-routes.js";
103
108
  import { ROUTES as PUBLISH_ROUTES } from "./publish-routes.js";
@@ -145,6 +150,7 @@ export const ROUTES: RouteDefinition[] = [
145
150
  ...AUDIT_ROUTES,
146
151
  ...AUTH_ROUTES,
147
152
  ...AVATAR_ROUTES,
153
+ ...BACKGROUND_WAKE_ROUTES,
148
154
  ...BACKGROUND_TOOL_ROUTES,
149
155
  ...BACKUP_ROUTES,
150
156
  ...BOOKMARK_ROUTES,
@@ -156,6 +162,7 @@ export const ROUTES: RouteDefinition[] = [
156
162
  ...CHANNEL_AVAILABILITY_ROUTES,
157
163
  ...CHANNEL_READINESS_ROUTES,
158
164
  ...BROWSER_ROUTES,
165
+ ...BROWSER_TABS_ROUTES,
159
166
  ...BTW_ROUTES,
160
167
  ...BRAIN_GRAPH_ROUTES,
161
168
  ...CLIENT_ROUTES,
@@ -173,6 +180,7 @@ export const ROUTES: RouteDefinition[] = [
173
180
  ...CREDENTIAL_PROMPT_ROUTES,
174
181
  ...CREDENTIAL_ROUTES,
175
182
  ...DEFER_ROUTES,
183
+ ...CONVERSATION_COMPACTION_ROUTES,
176
184
  ...CONVERSATION_QUERY_ROUTES,
177
185
  ...CONVERSATION_STARTER_ROUTES,
178
186
  ...DEBUG_BASH_ROUTES,
@@ -211,6 +219,7 @@ export const ROUTES: RouteDefinition[] = [
211
219
  ...LLM_CALL_SITES_ROUTES,
212
220
  ...MEMORY_ITEM_ROUTES,
213
221
  ...MEMORY_V2_ROUTES,
222
+ ...MEMORY_V3_ROUTES,
214
223
  ...MIGRATION_ROLLBACK_ROUTES,
215
224
  ...MIGRATION_ROUTES,
216
225
  ...NOTIFICATION_ROUTES,
@@ -220,6 +229,7 @@ export const ROUTES: RouteDefinition[] = [
220
229
  ...OAUTH_PROVIDERS_ROUTES,
221
230
  ...PLATFORM_ROUTES,
222
231
  ...PLAYGROUND_ROUTES,
232
+ ...PLUGINS_ROUTES,
223
233
  ...PROFILER_ROUTES,
224
234
  ...PS_ROUTES,
225
235
  ...PUBLISH_ROUTES,
@@ -67,11 +67,13 @@ export async function setInferenceProfileSession({
67
67
  profile,
68
68
  ttlSeconds,
69
69
  sessionId: callerSessionId,
70
+ originClientId,
70
71
  }: {
71
72
  conversationId: string;
72
73
  profile: string | null;
73
74
  ttlSeconds?: number | null;
74
75
  sessionId?: string;
76
+ originClientId?: string;
75
77
  }): Promise<InferenceProfileSessionResult> {
76
78
  const resolvedId = resolveConversationId(conversationId) ?? conversationId;
77
79
  const conversation = getConversation(resolvedId);
@@ -116,12 +118,15 @@ export async function setInferenceProfileSession({
116
118
  };
117
119
  }
118
120
  setConversationInferenceProfileSession(resolvedId, null, null, null);
119
- publishConversationInferenceProfileChanged({
120
- conversationId: resolvedId,
121
- profile: null,
122
- sessionId: null,
123
- expiresAt: null,
124
- });
121
+ publishConversationInferenceProfileChanged(
122
+ {
123
+ conversationId: resolvedId,
124
+ profile: null,
125
+ sessionId: null,
126
+ expiresAt: null,
127
+ },
128
+ originClientId,
129
+ );
125
130
  return {
126
131
  conversationId: resolvedId,
127
132
  profile: null,
@@ -184,12 +189,15 @@ export async function setInferenceProfileSession({
184
189
  newExpiresAt ?? null,
185
190
  );
186
191
 
187
- publishConversationInferenceProfileChanged({
188
- conversationId: resolvedId,
189
- profile,
190
- sessionId: newSessionId ?? null,
191
- expiresAt: newExpiresAt ?? null,
192
- });
192
+ publishConversationInferenceProfileChanged(
193
+ {
194
+ conversationId: resolvedId,
195
+ profile,
196
+ sessionId: newSessionId ?? null,
197
+ expiresAt: newExpiresAt ?? null,
198
+ },
199
+ originClientId,
200
+ );
193
201
 
194
202
  return {
195
203
  conversationId: resolvedId,
@@ -218,6 +226,7 @@ export async function setInferenceProfileSession({
218
226
  */
219
227
  export async function closeInferenceProfileSession(
220
228
  conversationId: string,
229
+ originClientId?: string,
221
230
  ): Promise<{
222
231
  conversationId: string;
223
232
  closed: { profile: string | null; sessionId: string | null } | null;
@@ -241,6 +250,7 @@ export async function closeInferenceProfileSession(
241
250
  const result = await setInferenceProfileSession({
242
251
  conversationId: resolvedId,
243
252
  profile: null,
253
+ originClientId,
244
254
  });
245
255
  return {
246
256
  conversationId: result.conversationId,
@@ -22,6 +22,7 @@ import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
22
22
 
23
23
  async function handleOpenInferenceProfileSession({
24
24
  body = {},
25
+ headers,
25
26
  }: RouteHandlerArgs) {
26
27
  if (body.profile == null || typeof body.profile !== "string") {
27
28
  throw new BadRequestError("profile must be a non-empty string");
@@ -31,13 +32,18 @@ async function handleOpenInferenceProfileSession({
31
32
  profile: body.profile,
32
33
  ttlSeconds: body.ttlSeconds as number | null | undefined,
33
34
  sessionId: body.sessionId as string | undefined,
35
+ originClientId: headers?.["x-vellum-client-id"]?.trim() || undefined,
34
36
  });
35
37
  }
36
38
 
37
39
  async function handleCloseInferenceProfileSession({
38
40
  body = {},
41
+ headers,
39
42
  }: RouteHandlerArgs) {
40
- return closeInferenceProfileSession(body.conversationId as string);
43
+ return closeInferenceProfileSession(
44
+ body.conversationId as string,
45
+ headers?.["x-vellum-client-id"]?.trim() || undefined,
46
+ );
41
47
  }
42
48
 
43
49
  function handleListInferenceProfileSessions({
@@ -4,7 +4,7 @@
4
4
  * GET /v1/inference/provider-connections — list all connections (optional ?provider= filter)
5
5
  * GET /v1/inference/provider-connections/:name — single connection by name
6
6
  * POST /v1/inference/provider-connections — create a new connection
7
- * PATCH /v1/inference/provider-connections/:name — update auth/label/status (cannot rename or change provider; auth is locked to platform for managed connections)
7
+ * PATCH /v1/inference/provider-connections/:name — update auth/label (cannot rename or change provider; auth is locked to platform for managed connections)
8
8
  * DELETE /v1/inference/provider-connections/:name — delete (rejects if profiles or call sites reference it; rejects outright for managed connections)
9
9
  */
10
10
 
@@ -18,7 +18,6 @@ import {
18
18
  type ConnectionModel,
19
19
  ConnectionModelSchema,
20
20
  ConnectionProviderSchema,
21
- ConnectionStatusSchema,
22
21
  ProviderConnectionSchema,
23
22
  VALID_CONNECTION_PROVIDERS,
24
23
  } from "../../providers/inference/auth.js";
@@ -223,14 +222,6 @@ async function handleCreateConnection({ body = {} }: RouteHandlerArgs) {
223
222
  throw new BadRequestError(`Invalid auth: ${authResult.error.message}`);
224
223
  }
225
224
 
226
- const statusResult =
227
- body.status !== undefined
228
- ? ConnectionStatusSchema.safeParse(body.status)
229
- : null;
230
- if (statusResult && !statusResult.success) {
231
- throw new BadRequestError(`Invalid status: must be "active" or "disabled"`);
232
- }
233
-
234
225
  const labelRaw = body.label;
235
226
  if (
236
227
  labelRaw !== undefined &&
@@ -248,7 +239,6 @@ async function handleCreateConnection({ body = {} }: RouteHandlerArgs) {
248
239
  name,
249
240
  provider: providerResult.data,
250
241
  auth: authResult.data,
251
- ...(statusResult ? { status: statusResult.data } : {}),
252
242
  ...(labelRaw !== undefined ? { label: labelRaw as string | null } : {}),
253
243
  ...customFields,
254
244
  });
@@ -302,14 +292,6 @@ async function handleUpdateConnection({
302
292
  throw new BadRequestError(`Invalid auth: ${authResult.error.message}`);
303
293
  }
304
294
 
305
- const statusResult =
306
- body.status !== undefined
307
- ? ConnectionStatusSchema.safeParse(body.status)
308
- : null;
309
- if (statusResult && !statusResult.success) {
310
- throw new BadRequestError(`Invalid status: must be "active" or "disabled"`);
311
- }
312
-
313
295
  const labelRaw = body.label;
314
296
  if (
315
297
  labelRaw !== undefined &&
@@ -323,8 +305,8 @@ async function handleUpdateConnection({
323
305
 
324
306
  // Managed connections: lock auth to `{type:"platform"}`. The boot upsert in
325
307
  // `seedCanonicalConnections` would revert any other value on next restart;
326
- // reject the write here so the surprise loop never happens. Label and status
327
- // remain user-editable (the boot upsert leaves those alone).
308
+ // reject the write here so the surprise loop never happens. Label remains
309
+ // user-editable (the boot upsert leaves it alone).
328
310
  if (
329
311
  MANAGED_CONNECTION_NAMES.has(name) &&
330
312
  authResult.data.type !== "platform"
@@ -338,7 +320,6 @@ async function handleUpdateConnection({
338
320
 
339
321
  const result = updateConnection(getDb(), name, {
340
322
  auth: authResult.data,
341
- ...(statusResult ? { status: statusResult.data } : {}),
342
323
  ...(labelRaw !== undefined ? { label: labelRaw as string | null } : {}),
343
324
  ...customFields,
344
325
  });
@@ -387,7 +368,7 @@ function handleDeleteConnection({ pathParams = {} }: RouteHandlerArgs) {
387
368
  // re-overlaid by `seed-inference-profiles.ts` on boot).
388
369
  if (MANAGED_CONNECTION_NAMES.has(name)) {
389
370
  throw new BadRequestError(
390
- `Cannot delete managed connection "${name}". This is a Vellum-managed connection disable it via PATCH status="disabled" if you want to opt out of platform inference.`,
371
+ `Cannot delete managed connection "${name}". This is a Vellum-managed connection that is re-seeded on every startup.`,
391
372
  );
392
373
  }
393
374
 
@@ -485,7 +466,6 @@ export const ROUTES: RouteDefinition[] = [
485
466
  provider: ConnectionProviderSchema,
486
467
  auth: AuthSchema,
487
468
  label: z.string().min(1).optional(),
488
- status: ConnectionStatusSchema.optional(),
489
469
  base_url: z.string().url().nullable().optional(),
490
470
  models: z.array(ConnectionModelSchema).nullable().optional(),
491
471
  }),
@@ -504,12 +484,11 @@ export const ROUTES: RouteDefinition[] = [
504
484
  policyKey: "inference/provider-connections/detail",
505
485
  summary: "Update a provider connection",
506
486
  description:
507
- "Update an existing connection. Cannot rename or change the provider. For managed connections (anthropic-managed, openai-managed, gemini-managed) the auth is locked to platform; label and status remain editable.",
487
+ "Update an existing connection. Cannot rename or change the provider. For managed connections (anthropic-managed, openai-managed, gemini-managed) the auth is locked to platform; label remains editable.",
508
488
  tags: ["inference"],
509
489
  pathParams: [{ name: "name", description: "Connection name" }],
510
490
  requestBody: z.object({
511
491
  auth: AuthSchema,
512
- status: ConnectionStatusSchema.optional(),
513
492
  label: z.string().min(1).nullable().optional(),
514
493
  base_url: z.string().url().nullable().optional(),
515
494
  models: z.array(ConnectionModelSchema).nullable().optional(),
@@ -9,6 +9,8 @@
9
9
  * ("set" or "delete") rather than using HTTP verbs directly.
10
10
  */
11
11
 
12
+ import { z } from "zod";
13
+
12
14
  import {
13
15
  deleteVercelConfig,
14
16
  getVercelConfig,
@@ -17,6 +19,12 @@ import {
17
19
  import { BadRequestError } from "../errors.js";
18
20
  import type { RouteDefinition, RouteHandlerArgs } from "../types.js";
19
21
 
22
+ const vercelConfigResponseSchema = z.object({
23
+ hasToken: z.boolean(),
24
+ success: z.boolean(),
25
+ error: z.string().optional(),
26
+ });
27
+
20
28
  // ---------------------------------------------------------------------------
21
29
  // Handlers
22
30
  // ---------------------------------------------------------------------------
@@ -66,6 +74,7 @@ export const ROUTES: RouteDefinition[] = [
66
74
  description: "Check if a Vercel API token is stored.",
67
75
  tags: ["integrations"],
68
76
  requirePolicyEnforcement: true,
77
+ responseBody: vercelConfigResponseSchema,
69
78
  handler: () => handleGetVercelConfig(),
70
79
  },
71
80
  {
@@ -77,6 +86,11 @@ export const ROUTES: RouteDefinition[] = [
77
86
  "Set or delete the Vercel API token. Action is determined by the body action field.",
78
87
  tags: ["integrations"],
79
88
  requirePolicyEnforcement: true,
89
+ requestBody: z.object({
90
+ action: z.enum(["get", "set", "delete"]).optional(),
91
+ apiToken: z.string().optional(),
92
+ }),
93
+ responseBody: vercelConfigResponseSchema,
80
94
  handler: handlePostVercelConfig,
81
95
  },
82
96
  {
@@ -87,6 +101,7 @@ export const ROUTES: RouteDefinition[] = [
87
101
  description: "Delete the stored Vercel API token.",
88
102
  tags: ["integrations"],
89
103
  requirePolicyEnforcement: true,
104
+ responseBody: vercelConfigResponseSchema,
90
105
  handler: () => handleDeleteVercelConfig(),
91
106
  },
92
107
  ];
@@ -1,6 +1,9 @@
1
1
  import { resolveDefaultProfileKey } from "../../config/llm-resolver.js";
2
2
  import { loadConfig } from "../../config/loader.js";
3
- import { CALL_SITE_CATALOG, CALL_SITE_DOMAINS } from "../../config/schemas/call-site-catalog.js";
3
+ import {
4
+ CALL_SITE_CATALOG,
5
+ CALL_SITE_DOMAINS,
6
+ } from "../../config/schemas/call-site-catalog.js";
4
7
  import type { LLMCallSite } from "../../config/schemas/llm.js";
5
8
  import type { RouteDefinition } from "./types.js";
6
9
 
@@ -10,14 +13,28 @@ async function handleGetCallSites() {
10
13
  domains: CALL_SITE_DOMAINS,
11
14
  callSites: CALL_SITE_CATALOG.map((entry) => ({
12
15
  ...entry,
13
- defaultProfile: resolveDefaultProfileKey(
14
- entry.id as LLMCallSite,
15
- llm,
16
- ),
16
+ defaultProfile: resolveDefaultProfileKey(entry.id as LLMCallSite, llm),
17
17
  })),
18
18
  };
19
19
  }
20
20
 
21
+ export interface LlmProfilesListResult {
22
+ /** Sorted list of profile names defined in `llm.profiles`. */
23
+ profiles: string[];
24
+ /** The workspace-wide active profile name, if one is set. */
25
+ activeProfile: string | null;
26
+ }
27
+
28
+ async function handleListProfiles(): Promise<LlmProfilesListResult> {
29
+ const { llm } = loadConfig();
30
+ const profiles = llm?.profiles ?? {};
31
+ return {
32
+ profiles: Object.keys(profiles).sort(),
33
+ activeProfile:
34
+ typeof llm?.activeProfile === "string" ? llm.activeProfile : null,
35
+ };
36
+ }
37
+
21
38
  export const ROUTES: RouteDefinition[] = [
22
39
  {
23
40
  operationId: "llm_call_sites_list",
@@ -29,4 +46,14 @@ export const ROUTES: RouteDefinition[] = [
29
46
  "Returns the full catalog of LLM call sites with display names, descriptions, and domain groupings. Used by clients to render the per-call-site override settings UI.",
30
47
  tags: ["config"],
31
48
  },
49
+ {
50
+ operationId: "llm_profiles_list",
51
+ method: "GET",
52
+ endpoint: "config/llm/profiles",
53
+ handler: handleListProfiles,
54
+ summary: "List defined LLM profiles",
55
+ description:
56
+ "Returns the sorted list of profile names defined in `llm.profiles` plus the workspace-wide active profile. Used to populate per-call profile dropdowns (e.g. memory router playground) without requiring the caller to type profile names.",
57
+ tags: ["config"],
58
+ },
32
59
  ];
@@ -1057,8 +1057,13 @@ function extractOpenAiResponsesRequestToolNames(tools: unknown): string[] {
1057
1057
  if (asString(tool.type) === "function" && asString(tool.name)) {
1058
1058
  return asString(tool.name);
1059
1059
  }
1060
- // Native web search tool: { type: "web_search_preview" }
1061
- if (asString(tool.type) === "web_search_preview") {
1060
+ // Native web search tools:
1061
+ // - OpenAI API: { type: "web_search_preview" }
1062
+ // - Codex subscription endpoint: { type: "web_search" }
1063
+ if (
1064
+ asString(tool.type) === "web_search_preview" ||
1065
+ asString(tool.type) === "web_search"
1066
+ ) {
1062
1067
  return "web_search";
1063
1068
  }
1064
1069
  return undefined;
@@ -44,7 +44,10 @@ import type {
44
44
  MemoryType,
45
45
  NewNode,
46
46
  } from "../../memory/graph/types.js";
47
- import { enqueueMemoryJob } from "../../memory/jobs-store.js";
47
+ import {
48
+ enqueueMemoryJob,
49
+ isMemoryEnabled,
50
+ } from "../../memory/jobs-store.js";
48
51
  import { withQdrantBreaker } from "../../memory/qdrant-circuit-breaker.js";
49
52
  import { getQdrantClient } from "../../memory/qdrant-client.js";
50
53
  import { memoryGraphNodes } from "../../memory/schema.js";
@@ -525,7 +528,9 @@ async function handleCreateMemoryItem(body: Record<string, unknown>) {
525
528
  };
526
529
 
527
530
  const created = createNode(newNode);
528
- enqueueMemoryJob("embed_graph_node", { nodeId: created.id });
531
+ if (isMemoryEnabled()) {
532
+ enqueueMemoryJob("embed_graph_node", { nodeId: created.id });
533
+ }
529
534
 
530
535
  return { item: nodeToPayload(created) };
531
536
  }
@@ -619,7 +624,7 @@ async function handleUpdateMemoryItem(
619
624
 
620
625
  updateNode(id, changes);
621
626
 
622
- if (contentChanged) {
627
+ if (contentChanged && isMemoryEnabled()) {
623
628
  enqueueMemoryJob("embed_graph_node", { nodeId: id });
624
629
  }
625
630