@vellumai/assistant 0.10.9 → 0.10.10-dev.202607162206.d08e98e

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 (456) hide show
  1. package/ARCHITECTURE.md +1 -1
  2. package/Dockerfile +8 -0
  3. package/docs/activation-funnel-telemetry.md +13 -7
  4. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +1 -0
  5. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/redacted-credential.test.ts +200 -0
  6. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/redacted-credential.ts +226 -0
  7. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +1 -0
  8. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/redacted-credential.test.ts +200 -0
  9. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/redacted-credential.ts +226 -0
  10. package/node_modules/@vellumai/service-contracts/package.json +1 -0
  11. package/node_modules/@vellumai/service-contracts/src/__tests__/redacted-credential.test.ts +200 -0
  12. package/node_modules/@vellumai/service-contracts/src/redacted-credential.ts +226 -0
  13. package/openapi.yaml +530 -107
  14. package/package.json +1 -1
  15. package/scripts/generate-openapi.ts +8 -0
  16. package/src/__tests__/activation-early-marking.test.ts +6 -5
  17. package/src/__tests__/agent-loop-override-profile.test.ts +22 -25
  18. package/src/__tests__/agent-wake-override-profile.test.ts +21 -48
  19. package/src/__tests__/app-builder-tool-scripts.test.ts +0 -1
  20. package/src/__tests__/app-bundler.test.ts +4 -12
  21. package/src/__tests__/app-executors.test.ts +2 -49
  22. package/src/__tests__/app-routes-csp.test.ts +114 -146
  23. package/src/__tests__/auth-fallback-events-store.test.ts +8 -1
  24. package/src/__tests__/build-persisted-content.test.ts +96 -0
  25. package/src/__tests__/bundle-scanner.test.ts +27 -1
  26. package/src/__tests__/call-controller.test.ts +291 -0
  27. package/src/__tests__/call-site-routing-connection-auto-resolve.test.ts +165 -0
  28. package/src/__tests__/chat-credential-redaction.test.ts +1395 -0
  29. package/src/__tests__/chat-reveal-guard-priming.test.ts +791 -0
  30. package/src/__tests__/compaction.benchmark.test.ts +2 -1
  31. package/src/__tests__/compactor-image-manifest-trust.test.ts +50 -0
  32. package/src/__tests__/config-loader-backfill.test.ts +9 -4
  33. package/src/__tests__/config-schema-cmd.test.ts +10 -11
  34. package/src/__tests__/config-schema.test.ts +190 -257
  35. package/src/__tests__/conversation-agent-loop-fatal-cleanup.test.ts +208 -0
  36. package/src/__tests__/conversation-agent-loop-overflow.test.ts +5 -19
  37. package/src/__tests__/conversation-agent-loop.test.ts +22 -9
  38. package/src/__tests__/conversation-error.test.ts +31 -0
  39. package/src/__tests__/conversation-load-history-repair.test.ts +110 -0
  40. package/src/__tests__/conversation-process-callsite.test.ts +12 -19
  41. package/src/__tests__/conversation-routes-slash-commands.test.ts +7 -21
  42. package/src/__tests__/conversation-summarize-route.test.ts +36 -44
  43. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +1 -0
  44. package/src/__tests__/conversation-surfaces-activation-emit.test.ts +7 -7
  45. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +0 -1
  46. package/src/__tests__/conversation-tool-setup-attribution.test.ts +0 -1
  47. package/src/__tests__/conversation-usage.test.ts +4 -12
  48. package/src/__tests__/credential-routes.test.ts +250 -0
  49. package/src/__tests__/credential-security-invariants.test.ts +3 -0
  50. package/src/__tests__/db-migration-rollback.test.ts +22 -0
  51. package/src/__tests__/empty-response-hook.test.ts +186 -1
  52. package/src/__tests__/external-plugin-loader.test.ts +11 -5
  53. package/src/__tests__/heartbeat-service.test.ts +0 -28
  54. package/src/__tests__/host-shell-tool.test.ts +2 -0
  55. package/src/__tests__/inactive-tool-error-messages.test.ts +2 -2
  56. package/src/__tests__/inference-no-mode-boot-e2e.test.ts +52 -8
  57. package/src/__tests__/internal-telemetry-routes.test.ts +23 -4
  58. package/src/__tests__/invite-routes-http.test.ts +12 -16
  59. package/src/__tests__/list-all-apps.test.ts +0 -4
  60. package/src/__tests__/llm-context-resolution.test.ts +32 -56
  61. package/src/__tests__/llm-request-log-turn-query.test.ts +109 -0
  62. package/src/__tests__/llm-resolver-override-or-default.test.ts +3 -52
  63. package/src/__tests__/llm-resolver.test.ts +342 -602
  64. package/src/__tests__/llm-schema.test.ts +79 -37
  65. package/src/__tests__/max-tokens-continue-hook.test.ts +19 -0
  66. package/src/__tests__/media-stream-output.test.ts +259 -3
  67. package/src/__tests__/media-stream-server-integration.test.ts +22 -1
  68. package/src/__tests__/media-stream-stt-session.test.ts +47 -0
  69. package/src/__tests__/memory-jobs-worker-cleanup-cadence.test.ts +33 -0
  70. package/src/__tests__/memory-recall-log-store.test.ts +47 -13
  71. package/src/__tests__/mock-gateway-ipc.ts +46 -1
  72. package/src/__tests__/mtime-cache.test.ts +61 -0
  73. package/src/__tests__/navigate-settings-tab.test.ts +2 -0
  74. package/src/__tests__/normalize-onboarding.test.ts +33 -0
  75. package/src/__tests__/onboarding-persona-write.test.ts +26 -0
  76. package/src/__tests__/plugin-api-resolve-credential.test.ts +140 -0
  77. package/src/__tests__/plugin-app-serve-routes.test.ts +166 -14
  78. package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +2 -0
  79. package/src/__tests__/post-turn-tool-result-truncation.test.ts +38 -0
  80. package/src/__tests__/provider-commit-message-generator.test.ts +27 -20
  81. package/src/__tests__/provider-connections-backfill.test.ts +138 -0
  82. package/src/__tests__/provider-platform-proxy-integration.test.ts +10 -31
  83. package/src/__tests__/provider-registry-ollama.test.ts +8 -18
  84. package/src/__tests__/provider-send-message-override-profile.test.ts +23 -23
  85. package/src/__tests__/provider-usage-tracking.test.ts +9 -19
  86. package/src/__tests__/prune-old-conversations-job.test.ts +12 -0
  87. package/src/__tests__/published-app-updater.test.ts +22 -16
  88. package/src/__tests__/registry.test.ts +5 -16
  89. package/src/__tests__/retry-openrouter-only-normalization.test.ts +22 -23
  90. package/src/__tests__/retry-thinking-adaptive-only.test.ts +43 -48
  91. package/src/__tests__/retry-thinking-tool-choice.test.ts +57 -66
  92. package/src/__tests__/retry-verbosity-normalization.test.ts +24 -23
  93. package/src/__tests__/reveal-success-registry.test.ts +123 -0
  94. package/src/__tests__/run-conversation-turn-persistence.test.ts +130 -0
  95. package/src/__tests__/secret-fixtures.ts +9 -0
  96. package/src/__tests__/server-history-render.test.ts +28 -0
  97. package/src/__tests__/skills.test.ts +9 -4
  98. package/src/__tests__/slack-share-routes.test.ts +0 -1
  99. package/src/__tests__/stt-stream-session.test.ts +6 -5
  100. package/src/__tests__/subagent-call-site-routing.test.ts +69 -95
  101. package/src/__tests__/subagent-disposal.test.ts +2 -0
  102. package/src/__tests__/subagent-fork-notifications.test.ts +2 -0
  103. package/src/__tests__/subagent-fork-spawn.test.ts +2 -0
  104. package/src/__tests__/subagent-manager-notify.test.ts +2 -0
  105. package/src/__tests__/subagent-role-registry.test.ts +37 -0
  106. package/src/__tests__/subagent-spawn-and-await.test.ts +1 -0
  107. package/src/__tests__/subagent-terminal-message.test.ts +50 -0
  108. package/src/__tests__/subagent-tool-gate-mode.test.ts +78 -5
  109. package/src/__tests__/surface-completion-nudge-hook.test.ts +19 -0
  110. package/src/__tests__/telemetry-routes.test.ts +99 -19
  111. package/src/__tests__/tool-audit.test.ts +34 -4
  112. package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -1
  113. package/src/__tests__/tool-profiler.test.ts +72 -1
  114. package/src/__tests__/tool-result-spool.test.ts +49 -4
  115. package/src/__tests__/tool-side-effects-slack-dm.test.ts +0 -1
  116. package/src/__tests__/ui-channel-variants.test.ts +108 -0
  117. package/src/__tests__/ui-shape-teaching.test.ts +255 -0
  118. package/src/__tests__/usage-attribution.test.ts +18 -41
  119. package/src/__tests__/user-plugin-loader.test.ts +4 -4
  120. package/src/__tests__/voice-config-update.test.ts +46 -0
  121. package/src/__tests__/voice-session-bridge.test.ts +216 -84
  122. package/src/__tests__/workspace-migration-131-drop-web-fetch-mode.test.ts +120 -0
  123. package/src/agent/loop.ts +4 -3
  124. package/src/api/events/open-conversation.test.ts +64 -0
  125. package/src/api/events/open-conversation.ts +33 -0
  126. package/src/api/index.ts +6 -0
  127. package/src/api/responses/conversation-message.ts +5 -0
  128. package/src/apps/app-store.ts +25 -35
  129. package/src/bundler/app-bundler.ts +34 -48
  130. package/src/bundler/app-compiler.ts +39 -4
  131. package/src/bundler/bundle-scanner.ts +13 -0
  132. package/src/bundler/manifest.ts +1 -1
  133. package/src/calls/__tests__/voice-session-bridge.test.ts +47 -0
  134. package/src/calls/call-constants.ts +5 -0
  135. package/src/calls/call-controller.ts +100 -32
  136. package/src/calls/call-transport.ts +9 -0
  137. package/src/calls/media-stream-output.ts +107 -4
  138. package/src/calls/media-stream-server.ts +29 -9
  139. package/src/calls/media-stream-stt-session.ts +7 -1
  140. package/src/calls/media-turn-detector.ts +11 -1
  141. package/src/calls/voice-session-bridge.ts +84 -63
  142. package/src/cli/commands/__tests__/inference-providers.test.ts +270 -33
  143. package/src/cli/commands/__tests__/notifications.test.ts +24 -3
  144. package/src/cli/commands/config.help.ts +6 -6
  145. package/src/cli/commands/credentials.help.ts +13 -0
  146. package/src/cli/commands/credentials.ts +6 -1
  147. package/src/cli/commands/email.help.ts +7 -0
  148. package/src/cli/commands/email.ts +35 -1
  149. package/src/cli/commands/inference-providers.ts +168 -107
  150. package/src/cli/commands/inference.help.ts +118 -46
  151. package/src/cli/commands/memory/index.help.ts +23 -0
  152. package/src/cli/commands/memory/nodes.ts +146 -0
  153. package/src/cli/commands/notifications.help.ts +10 -10
  154. package/src/cli/commands/oauth/connect-surface-guidance.test.ts +40 -0
  155. package/src/cli/commands/oauth/connect-surface-guidance.ts +54 -0
  156. package/src/cli/commands/oauth/connect.test.ts +126 -0
  157. package/src/cli/commands/oauth/connect.ts +29 -6
  158. package/src/cli/commands/oauth/index.help.ts +7 -1
  159. package/src/cli/commands/oauth/status.test.ts +69 -3
  160. package/src/cli/commands/oauth/status.ts +50 -12
  161. package/src/cli/commands/plugins.help.ts +13 -2
  162. package/src/cli/commands/plugins.ts +61 -7
  163. package/src/cli/commands/telemetry.help.ts +13 -0
  164. package/src/cli/commands/telemetry.ts +45 -5
  165. package/src/cli/lib/__tests__/plugin-catalog-local.test.ts +8 -2
  166. package/src/cli/lib/__tests__/upgrade-plugin.test.ts +213 -9
  167. package/src/cli/lib/bundled-marketplace.json +93 -36
  168. package/src/cli/lib/inspect-plugin.ts +5 -1
  169. package/src/cli/lib/install-from-github.ts +68 -4
  170. package/src/cli/lib/plugin-catalog-local.ts +6 -2
  171. package/src/cli/lib/plugin-fingerprint.ts +3 -3
  172. package/src/cli/lib/upgrade-plugin.ts +236 -35
  173. package/src/config/__tests__/default-profile-catalog.test.ts +8 -12
  174. package/src/config/__tests__/plugin-resident-skill-discovery.test.ts +137 -0
  175. package/src/config/__tests__/profile-materialization.test.ts +1 -88
  176. package/src/config/bundled-skills/AGENTS.md +3 -30
  177. package/src/config/bundled-skills/app-builder/SKILL.md +5 -3
  178. package/src/config/bundled-skills/app-builder/TOOLS.json +23 -0
  179. package/src/config/bundled-skills/app-builder/tools/app-open.ts +32 -0
  180. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +1 -1
  181. package/src/config/bundled-skills/phone-calls/references/CONFIG.md +7 -7
  182. package/src/config/bundled-skills/schedule/SKILL.md +1 -1
  183. package/src/config/bundled-skills/schedule/TOOLS.json +1 -1
  184. package/src/config/bundled-skills/settings/TOOLS.json +3 -1
  185. package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +2 -0
  186. package/src/config/bundled-skills/settings/tools/voice-config-update.ts +18 -10
  187. package/src/config/bundled-skills/subagent/SKILL.md +2 -0
  188. package/src/config/bundled-skills/subagent/TOOLS.json +1 -1
  189. package/src/config/call-site-defaults.ts +3 -3
  190. package/src/config/feature-flag-registry.json +24 -39
  191. package/src/config/llm-resolver.ts +88 -475
  192. package/src/config/profile-materialization.ts +11 -11
  193. package/src/config/schema.ts +93 -127
  194. package/src/config/schemas/__tests__/live-voice.test.ts +24 -6
  195. package/src/config/schemas/__tests__/stt.test.ts +31 -3
  196. package/src/config/schemas/live-voice.ts +10 -4
  197. package/src/config/schemas/llm.ts +52 -15
  198. package/src/config/schemas/memory-lifecycle.ts +1 -1
  199. package/src/config/schemas/memory-retrospective.ts +8 -0
  200. package/src/config/schemas/memory-v2.ts +2 -2
  201. package/src/config/schemas/memory-v3.ts +1 -1
  202. package/src/config/schemas/services.ts +6 -3
  203. package/src/config/schemas/stt.ts +38 -21
  204. package/src/config/schemas/tts.ts +13 -18
  205. package/src/config/skills.ts +31 -21
  206. package/src/context/compactor.ts +44 -7
  207. package/src/context/post-turn-tool-result-truncation.ts +4 -2
  208. package/src/context/tool-result-spool.ts +26 -5
  209. package/src/conversations/__tests__/message-consolidation.test.ts +48 -0
  210. package/src/conversations/message-consolidation.ts +22 -2
  211. package/src/daemon/__tests__/conversation-tool-setup.test.ts +5 -12
  212. package/src/daemon/app-source-watcher.ts +17 -23
  213. package/src/daemon/chat-credential-redaction.ts +1365 -0
  214. package/src/daemon/conversation-agent-loop-handlers.ts +627 -34
  215. package/src/daemon/conversation-agent-loop.ts +71 -31
  216. package/src/daemon/conversation-error.ts +36 -14
  217. package/src/daemon/conversation-process.ts +22 -0
  218. package/src/daemon/conversation-store.ts +35 -0
  219. package/src/daemon/conversation-surfaces.ts +25 -25
  220. package/src/daemon/conversation-tool-setup.ts +33 -7
  221. package/src/daemon/conversation.ts +55 -5
  222. package/src/daemon/handlers/shared.ts +33 -2
  223. package/src/daemon/lifecycle.ts +4 -4
  224. package/src/daemon/message-types/conversations.ts +6 -17
  225. package/src/daemon/providers-setup.ts +8 -0
  226. package/src/daemon/tool-setup-types.ts +7 -1
  227. package/src/daemon/wake-conversation-ops.ts +10 -1
  228. package/src/hooks/types.ts +9 -0
  229. package/src/ipc/__tests__/email-ipc.test.ts +90 -0
  230. package/src/ipc/gateway-client.test.ts +59 -0
  231. package/src/ipc/gateway-client.ts +70 -27
  232. package/src/live-voice/__tests__/live-voice-events.test.ts +14 -2
  233. package/src/live-voice/__tests__/live-voice-integration.test.ts +116 -2
  234. package/src/live-voice/__tests__/live-voice-vad.test.ts +804 -13
  235. package/src/live-voice/__tests__/protocol.test.ts +122 -0
  236. package/src/live-voice/live-voice-session.ts +443 -40
  237. package/src/live-voice/protocol.ts +143 -1
  238. package/src/monitoring/__tests__/plugin-source-watch.test.ts +3 -1
  239. package/src/monitoring/plugin-source-watch.ts +3 -62
  240. package/src/notifications/README.md +1 -1
  241. package/src/permissions/checker.ts +8 -4
  242. package/src/persistence/__tests__/db-init-migrations-ok.test.ts +26 -0
  243. package/src/persistence/conversation-crud.ts +104 -2
  244. package/src/persistence/db-init.ts +14 -3
  245. package/src/persistence/job-handlers/cleanup.ts +15 -7
  246. package/src/persistence/llm-request-log-store.ts +88 -52
  247. package/src/persistence/migrations/298-move-memory-jobs-to-memory-db.ts +7 -31
  248. package/src/persistence/migrations/305-drop-contact-acl-columns.ts +3 -2
  249. package/src/persistence/migrations/326-move-injection-events-to-memory-db.ts +8 -34
  250. package/src/persistence/migrations/336-move-memory-v2-activation-logs-to-memory-db.ts +90 -0
  251. package/src/persistence/migrations/337-move-memory-recall-logs-to-memory-db.ts +114 -0
  252. package/src/persistence/migrations/338-move-memory-v3-selections-to-memory-db.ts +84 -0
  253. package/src/persistence/migrations/339-move-activation-sessions-to-memory-db.ts +52 -0
  254. package/src/persistence/migrations/__tests__/run-migrations.test.ts +155 -0
  255. package/src/persistence/migrations/helpers/relocation.ts +44 -1
  256. package/src/persistence/migrations/run-migrations.ts +25 -1
  257. package/src/persistence/schema/infrastructure.ts +9 -0
  258. package/src/persistence/schema/memory-core.ts +3 -0
  259. package/src/persistence/schema/memory-injection.ts +2 -0
  260. package/src/persistence/steps.ts +36 -0
  261. package/src/platform/client.test.ts +1 -44
  262. package/src/platform/client.ts +10 -20
  263. package/src/platform/consent-cache.test.ts +89 -23
  264. package/src/platform/consent-cache.ts +71 -33
  265. package/src/plugin-api/constants.ts +12 -0
  266. package/src/plugin-api/conversation-turn.ts +37 -14
  267. package/src/plugin-api/index.ts +11 -1
  268. package/src/plugin-api/resolve-credential.ts +75 -0
  269. package/src/plugin-api/vision-support.test.ts +8 -19
  270. package/src/plugin-api/vision-support.ts +26 -17
  271. package/src/plugins/collect-source-versions.ts +77 -0
  272. package/src/plugins/defaults/compaction/compact.ts +6 -0
  273. package/src/plugins/defaults/compaction/window-manager.ts +9 -0
  274. package/src/plugins/defaults/empty-response/hooks/post-model-call.ts +18 -24
  275. package/src/plugins/defaults/empty-response/hooks/user-prompt-submit.ts +38 -0
  276. package/src/plugins/defaults/empty-response/refusal-quarantine.ts +99 -0
  277. package/src/plugins/defaults/image-fallback/__tests__/caption-cache-persistence.test.ts +7 -3
  278. package/src/plugins/defaults/index.ts +8 -1
  279. package/src/plugins/defaults/max-tokens-continue/hooks/post-model-call.ts +4 -1
  280. package/src/plugins/defaults/memory/__tests__/activation-session-store.test.ts +48 -6
  281. package/src/plugins/defaults/memory/__tests__/db-memory-attach.test.ts +28 -22
  282. package/src/plugins/defaults/memory/__tests__/memory-log-stores-degraded.test.ts +148 -0
  283. package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +80 -8
  284. package/src/plugins/defaults/memory/__tests__/memory-retrospective-prompt.test.ts +202 -0
  285. package/src/plugins/defaults/memory/__tests__/memory-v2-activation-log-store.test.ts +64 -25
  286. package/src/plugins/defaults/memory/__tests__/memory-v2-concept-frequency.test.ts +24 -11
  287. package/src/plugins/defaults/memory/__tests__/prompt-override.test.ts +70 -6
  288. package/src/plugins/defaults/memory/__tests__/table-relocation.test.ts +278 -0
  289. package/src/plugins/defaults/memory/activation-session-store.ts +27 -20
  290. package/src/plugins/defaults/memory/context-search/sources/memory-v2.ts +2 -9
  291. package/src/plugins/defaults/memory/context-search/sources/workspace.ts +1 -8
  292. package/src/plugins/defaults/memory/graph/retriever.test.ts +6 -6
  293. package/src/plugins/defaults/memory/graph/store.ts +114 -0
  294. package/src/plugins/defaults/memory/graph/tool-handlers.ts +36 -1
  295. package/src/plugins/defaults/memory/graph/tools.ts +47 -13
  296. package/src/plugins/defaults/memory/graph-topology/build-memory-graph.ts +16 -35
  297. package/src/plugins/defaults/memory/jobs-worker.ts +10 -1
  298. package/src/plugins/defaults/memory/memory-db.ts +3 -2
  299. package/src/plugins/defaults/memory/memory-recall-log-store.ts +129 -66
  300. package/src/plugins/defaults/memory/memory-retrospective-constants.ts +8 -0
  301. package/src/plugins/defaults/memory/memory-retrospective-job.ts +11 -122
  302. package/src/plugins/defaults/memory/memory-retrospective-prompt.ts +216 -0
  303. package/src/plugins/defaults/memory/memory-v2-activation-log-store.ts +84 -46
  304. package/src/plugins/defaults/memory/memory-v2-concept-frequency.ts +42 -32
  305. package/src/plugins/defaults/memory/path-containment.ts +21 -0
  306. package/src/plugins/defaults/memory/prompt-override.ts +51 -13
  307. package/src/plugins/defaults/memory/tools.test.ts +34 -0
  308. package/src/plugins/defaults/memory/tools.ts +12 -2
  309. package/src/plugins/defaults/memory/v2/__tests__/harness-compare.test.ts +19 -15
  310. package/src/plugins/defaults/memory/v2/__tests__/harness-oracle.test.ts +24 -19
  311. package/src/plugins/defaults/memory/v2/__tests__/harness-replay-input.test.ts +19 -15
  312. package/src/plugins/defaults/memory/v2/__tests__/injection.test.ts +22 -2
  313. package/src/plugins/defaults/memory/v2/__tests__/prompts-consolidation.test.ts +5 -3
  314. package/src/plugins/defaults/memory/v2/harness/oracle.ts +59 -41
  315. package/src/plugins/defaults/memory/v2/harness/replay-input.ts +29 -25
  316. package/src/plugins/defaults/memory/v2/migration.ts +46 -16
  317. package/src/plugins/defaults/memory/v2/prompts/consolidation.ts +4 -0
  318. package/src/plugins/defaults/memory/v3/__tests__/carry-integration.test.ts +17 -15
  319. package/src/plugins/defaults/memory/v3/__tests__/gate.test.ts +24 -22
  320. package/src/plugins/defaults/memory/v3/__tests__/injection.test.ts +9 -5
  321. package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +277 -10
  322. package/src/plugins/defaults/memory/v3/__tests__/selection-log-store.test.ts +57 -5
  323. package/src/plugins/defaults/memory/v3/__tests__/shadow-integration.test.ts +9 -7
  324. package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +38 -7
  325. package/src/plugins/defaults/memory/v3/hot-set.test.ts +36 -18
  326. package/src/plugins/defaults/memory/v3/hot-set.ts +12 -14
  327. package/src/plugins/defaults/memory/v3/learned-edges.test.ts +47 -27
  328. package/src/plugins/defaults/memory/v3/learned-edges.ts +12 -14
  329. package/src/plugins/defaults/memory/v3/orchestrate.ts +139 -22
  330. package/src/plugins/defaults/memory/v3/prune.test.ts +10 -3
  331. package/src/plugins/defaults/memory/v3/prune.ts +17 -11
  332. package/src/plugins/defaults/memory/v3/selection-log-store.ts +23 -11
  333. package/src/plugins/defaults/memory/v3/shadow-plugin.ts +70 -53
  334. package/src/plugins/defaults/surface-completion-nudge/hooks/post-model-call.ts +9 -6
  335. package/src/plugins/external-plugin-loader.ts +15 -15
  336. package/src/plugins/mtime-cache.ts +47 -0
  337. package/src/plugins/pipeline.ts +9 -1
  338. package/src/plugins/plugin-execution-context.ts +44 -0
  339. package/src/plugins/plugin-tree-walk.ts +31 -24
  340. package/src/plugins/source-fingerprint.ts +3 -4
  341. package/src/prompts/normalize-onboarding.ts +12 -0
  342. package/src/prompts/persona-resolver.ts +8 -0
  343. package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +1 -1
  344. package/src/providers/__tests__/dispatch-connection-routing.test.ts +6 -9
  345. package/src/providers/__tests__/registry-native-web-search.test.ts +4 -10
  346. package/src/providers/__tests__/retry-callsite.test.ts +235 -215
  347. package/src/providers/__tests__/satellite-connection-routing.test.ts +8 -16
  348. package/src/providers/atlascloud/client.ts +10 -49
  349. package/src/providers/baseten/client.ts +43 -0
  350. package/src/providers/call-site-routing.ts +26 -13
  351. package/src/providers/connection-resolution.ts +9 -11
  352. package/src/providers/fetch-provider-catalog.ts +4 -2
  353. package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +29 -4
  354. package/src/providers/inference/__tests__/connection-availability-keyless.test.ts +78 -0
  355. package/src/providers/inference/adapter-factory.ts +27 -6
  356. package/src/providers/inference/auth.ts +29 -1
  357. package/src/providers/inference/backfill.ts +61 -10
  358. package/src/providers/inference/connection-availability.ts +3 -2
  359. package/src/providers/inference/resolve-auth.ts +9 -1
  360. package/src/providers/model-catalog.ts +37 -0
  361. package/src/providers/openai/__tests__/api-error-normalization.test.ts +24 -2
  362. package/src/providers/openai/api-key-validation.ts +70 -0
  363. package/src/providers/retry.ts +2 -0
  364. package/src/providers/types.ts +11 -4
  365. package/src/providers/vellum-model-routing.test.ts +26 -0
  366. package/src/providers/vellum-model-routing.ts +30 -0
  367. package/src/providers/voice-error-copy.ts +47 -0
  368. package/src/runtime/agent-wake.ts +40 -24
  369. package/src/runtime/for-chat-mint-registry.ts +118 -0
  370. package/src/runtime/reveal-nonce.ts +49 -0
  371. package/src/runtime/reveal-success-registry.ts +306 -0
  372. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +88 -3
  373. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +161 -30
  374. package/src/runtime/routes/__tests__/migration-vellum-metadata-reconcile.test.ts +7 -0
  375. package/src/runtime/routes/__tests__/schedule-worker-routes.test.ts +15 -0
  376. package/src/runtime/routes/app-management-routes.ts +152 -45
  377. package/src/runtime/routes/app-routes.ts +16 -77
  378. package/src/runtime/routes/canned-message-complete.ts +16 -16
  379. package/src/runtime/routes/conversation-management-routes.ts +17 -14
  380. package/src/runtime/routes/conversation-query-routes.ts +54 -6
  381. package/src/runtime/routes/conversation-routes.ts +48 -2
  382. package/src/runtime/routes/credential-routes.ts +116 -3
  383. package/src/runtime/routes/email-routes.ts +17 -1
  384. package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +33 -5
  385. package/src/runtime/routes/inbound-stages/transcribe-audio.ts +6 -5
  386. package/src/runtime/routes/inference-provider-connection-routes.ts +77 -28
  387. package/src/runtime/routes/inference-send-routes.ts +1 -1
  388. package/src/runtime/routes/internal-telemetry-routes.ts +7 -6
  389. package/src/runtime/routes/plugins-routes.ts +37 -6
  390. package/src/runtime/routes/publish-routes.ts +15 -18
  391. package/src/runtime/routes/schedule-worker-routes.ts +9 -0
  392. package/src/runtime/routes/secret-routes.ts +10 -0
  393. package/src/runtime/routes/telemetry-routes.ts +149 -45
  394. package/src/schedule/__tests__/schedule-timezone.test.ts +101 -0
  395. package/src/schedule/__tests__/worker-watchdog.test.ts +209 -0
  396. package/src/schedule/schedule-store.ts +12 -1
  397. package/src/schedule/schedule-timezone.ts +63 -0
  398. package/src/schedule/scheduler.ts +100 -6
  399. package/src/schedule/worker-control.ts +19 -0
  400. package/src/security/auth-fallback-events-store.ts +7 -6
  401. package/src/security/secret-scanner.ts +26 -1
  402. package/src/services/published-app-updater.ts +6 -11
  403. package/src/stt/stt-stream-session.ts +36 -16
  404. package/src/subagent/manager.ts +34 -8
  405. package/src/telemetry/AGENTS.md +30 -1
  406. package/src/telemetry/__tests__/config-setting-snapshot.test.ts +18 -0
  407. package/src/telemetry/__tests__/outbox-test-harness.ts +5 -3
  408. package/src/telemetry/config-setting-snapshot.ts +44 -10
  409. package/src/telemetry/telemetry-event-sources.test.ts +124 -30
  410. package/src/telemetry/telemetry-event-sources.ts +137 -83
  411. package/src/telemetry/telemetry-events-outbox.test.ts +46 -1
  412. package/src/telemetry/telemetry-events-outbox.ts +60 -9
  413. package/src/telemetry/telemetry-wire-source.json +1 -1
  414. package/src/telemetry/telemetry-wire-validation.ts +39 -2
  415. package/src/telemetry/telemetry-wire.generated.ts +8 -0
  416. package/src/telemetry/tool-audit.ts +15 -9
  417. package/src/telemetry/tool-executed-events-store.test.ts +1 -1
  418. package/src/telemetry/turn-events-store.ts +20 -0
  419. package/src/telemetry/types.ts +45 -12
  420. package/src/telemetry/usage-telemetry-reporter.test.ts +294 -25
  421. package/src/telemetry/usage-telemetry-reporter.ts +117 -18
  422. package/src/telemetry/watchdog-direct-emit.test.ts +11 -3
  423. package/src/telemetry/watchdog-direct-emit.ts +11 -6
  424. package/src/tools/apps/executors.ts +11 -36
  425. package/src/tools/executor.ts +14 -1
  426. package/src/tools/host-terminal/host-shell.ts +6 -2
  427. package/src/tools/network/__tests__/web-fetch-firecrawl.test.ts +1 -1
  428. package/src/tools/network/__tests__/web-fetch-metadata.test.ts +25 -0
  429. package/src/tools/network/web-fetch.ts +6 -2
  430. package/src/tools/skills/sandbox-runner.ts +5 -2
  431. package/src/tools/subagent/spawn.ts +7 -11
  432. package/src/tools/terminal/shell.ts +5 -2
  433. package/src/tools/tool-manifest.ts +0 -2
  434. package/src/tools/tool-profiler.ts +37 -6
  435. package/src/tools/ui-surface/channel-variants.ts +101 -0
  436. package/src/tools/ui-surface/definitions.ts +23 -67
  437. package/src/tools/ui-surface/surface-shape-docs.ts +229 -0
  438. package/src/tts/__tests__/provider-adapters.test.ts +18 -0
  439. package/src/tts/provider-catalog.ts +2 -4
  440. package/src/tts/providers/deepgram-provider.ts +10 -1
  441. package/src/types/onboarding-context.ts +8 -0
  442. package/src/usage/attribution.ts +18 -112
  443. package/src/{config/bundled-skills/messaging/tools/gmail-mime-helpers.ts → util/mime-type.ts} +4 -1
  444. package/src/util/provider-error-patterns.ts +7 -1
  445. package/src/util/worker-process.ts +105 -0
  446. package/src/watcher/__tests__/telemetry.test.ts +17 -4
  447. package/src/watcher/telemetry.ts +5 -5
  448. package/src/workspace/migrations/131-drop-web-fetch-mode.ts +61 -0
  449. package/src/workspace/migrations/registry.ts +2 -0
  450. package/src/workspace/provider-commit-message-generator.ts +6 -4
  451. package/src/__tests__/app-open-proxy.test.ts +0 -67
  452. package/src/onboarding/onboarding-research-events-store.test.ts +0 -230
  453. package/src/onboarding/onboarding-research-events-store.ts +0 -104
  454. package/src/runtime/routes/assets/vellum-design-system.css +0 -2236
  455. package/src/tools/apps/definitions.ts +0 -73
  456. package/src/tools/apps/open-proxy.ts +0 -43
@@ -346,6 +346,161 @@ describe("runMigrationSteps — checkpointing", () => {
346
346
  expect(result.skipped).toEqual([]);
347
347
  });
348
348
 
349
+ test("defers a step whose dependency failed this boot, without checkpointing it", async () => {
350
+ /**
351
+ * A step must not run against the missing state a failed prerequisite was
352
+ * supposed to create. It is deferred — not run, not checkpointed — and
353
+ * reported in `deferred` so readiness gating can surface it.
354
+ */
355
+
356
+ // GIVEN a failing creator step and a dependent step
357
+ const calls = { creator: 0, dependent: 0 };
358
+ const steps: MigrationStep[] = [
359
+ {
360
+ name: "creatorStep",
361
+ run: () => {
362
+ calls.creator++;
363
+ throw new Error("creator failed");
364
+ },
365
+ },
366
+ {
367
+ name: "dependentStep",
368
+ dependsOn: ["creatorStep"],
369
+ run: () => {
370
+ calls.dependent++;
371
+ },
372
+ },
373
+ ];
374
+ const db = createTestDb();
375
+
376
+ // WHEN the runner executes
377
+ const result = await runMigrationSteps(db, steps);
378
+
379
+ // THEN the dependent step never ran and is reported deferred
380
+ expect(calls.dependent).toBe(0);
381
+ expect(result.failed).toEqual(["creatorStep"]);
382
+ expect(result.deferred).toEqual(["dependentStep"]);
383
+
384
+ // AND nothing was written to the ledger for the deferred step —
385
+ // no 'started' marker and no applied checkpoint
386
+ const rows = getSqliteFrom(db)
387
+ .query(
388
+ `SELECT 1 FROM memory_checkpoints WHERE key = 'step:dependentStep'`,
389
+ )
390
+ .all();
391
+ expect(rows).toEqual([]);
392
+ });
393
+
394
+ test("a deferred step runs on the next boot once its dependency succeeds", async () => {
395
+ /**
396
+ * Deferral is a retry mechanism, not a permanent skip: once the
397
+ * prerequisite is applied on a later boot, the deferred step runs.
398
+ */
399
+
400
+ // GIVEN a creator that fails on its first run and a dependent step
401
+ const calls = { creator: 0, dependent: 0 };
402
+ const steps: MigrationStep[] = [
403
+ {
404
+ name: "creatorStep",
405
+ run: () => {
406
+ calls.creator++;
407
+ if (calls.creator === 1) {
408
+ throw new Error("transient failure");
409
+ }
410
+ },
411
+ },
412
+ {
413
+ name: "dependentStep",
414
+ dependsOn: ["creatorStep"],
415
+ run: () => {
416
+ calls.dependent++;
417
+ },
418
+ },
419
+ ];
420
+ const db = createTestDb();
421
+
422
+ // WHEN the first boot defers the dependent step
423
+ const first = await runMigrationSteps(db, steps);
424
+ expect(first.deferred).toEqual(["dependentStep"]);
425
+
426
+ // AND the next boot retries
427
+ const second = await runMigrationSteps(db, steps);
428
+
429
+ // THEN both steps run and nothing is deferred or failed
430
+ expect(calls).toEqual({ creator: 2, dependent: 1 });
431
+ expect(second.applied).toEqual(["creatorStep", "dependentStep"]);
432
+ expect(second.deferred).toEqual([]);
433
+ expect(second.failed).toEqual([]);
434
+ });
435
+
436
+ test("a step depending on an earlier same-boot step runs without deferral", async () => {
437
+ /**
438
+ * The runner adds each success to the in-memory applied set, so a
439
+ * dependency satisfied earlier in the same boot does not defer the
440
+ * dependent step — creator and dependent can ship in one release.
441
+ */
442
+
443
+ // GIVEN a creator and a dependent, both pending
444
+ const order: string[] = [];
445
+ const steps: MigrationStep[] = [
446
+ {
447
+ name: "creatorStep",
448
+ run: () => {
449
+ order.push("creator");
450
+ },
451
+ },
452
+ {
453
+ name: "dependentStep",
454
+ dependsOn: ["creatorStep"],
455
+ run: () => {
456
+ order.push("dependent");
457
+ },
458
+ },
459
+ ];
460
+ const db = createTestDb();
461
+
462
+ // WHEN the runner executes both in one boot
463
+ const result = await runMigrationSteps(db, steps);
464
+
465
+ // THEN they run in order with no deferral
466
+ expect(order).toEqual(["creator", "dependent"]);
467
+ expect(result.applied).toEqual(["creatorStep", "dependentStep"]);
468
+ expect(result.deferred).toEqual([]);
469
+ });
470
+
471
+ test("a step whose dependency is already checkpointed runs normally", async () => {
472
+ /**
473
+ * A dependency applied on a prior boot satisfies dependsOn through the
474
+ * checkpoint ledger, so the dependent step runs even though the creator
475
+ * was skipped this boot.
476
+ */
477
+
478
+ // GIVEN a database where the creator step was applied on a prior boot
479
+ const creator: MigrationStep = {
480
+ name: "creatorStep",
481
+ run: () => {
482
+ // no-op
483
+ },
484
+ };
485
+ const db = createTestDb();
486
+ await runMigrationSteps(db, [creator]);
487
+
488
+ // WHEN a dependent step ships in a later release
489
+ const dependent: MigrationStep = {
490
+ name: "dependentStep",
491
+ dependsOn: ["creatorStep"],
492
+ run: () => {
493
+ // no-op
494
+ },
495
+ };
496
+ const result = await runMigrationSteps(db, [creator, dependent]);
497
+
498
+ // THEN the dependent step runs while the creator is skipped
499
+ expect(result.skipped).toEqual(["creatorStep"]);
500
+ expect(result.applied).toEqual(["dependentStep"]);
501
+ expect(result.deferred).toEqual([]);
502
+ });
503
+
349
504
  test("writes 'started' marker before running each step", async () => {
350
505
  const db = createTestDb();
351
506
  const raw = getSqliteFrom(db);
@@ -6,6 +6,11 @@ import {
6
6
  parseChangesFromStdout,
7
7
  runAsyncSqlite,
8
8
  } from "../../db-async-query.js";
9
+ import {
10
+ type DrizzleDb,
11
+ getMemorySqlite,
12
+ getSqliteFrom,
13
+ } from "../../db-connection.js";
9
14
 
10
15
  const log = getLogger("memory-db");
11
16
 
@@ -145,7 +150,9 @@ export async function drainStagedTable(
145
150
  const staging = `${table}${RELOCATING_SUFFIX}`;
146
151
 
147
152
  // Nothing to do once the staging table is gone (drain finished previously).
148
- if (!tableExistsInMain(raw, staging)) return;
153
+ if (!tableExistsInMain(raw, staging)) {
154
+ return;
155
+ }
149
156
 
150
157
  // Build a select list from the staging table's actual columns: apply any
151
158
  // per-column transform, copy a present column verbatim, NULL-fill an absent
@@ -228,3 +235,39 @@ export async function drainStagedTable(
228
235
  }
229
236
  log.info({ table }, "relocation: complete — staging dropped");
230
237
  }
238
+
239
+ /**
240
+ * Run one memory-table relocation end to end: ensure the table's schema on the
241
+ * memory connection, stage `main.<table>` aside via
242
+ * {@link stageTableForRelocation}, then drain the staged rows into the memory
243
+ * DB in awaited batches via {@link drainStagedTable} per the spec. Because the
244
+ * drain is awaited as part of the migration step, later startup work observes
245
+ * the finished move.
246
+ *
247
+ * Throws (rather than returning) if the memory database cannot be opened, so
248
+ * the runner records the step as failed instead of applied and retries it on a
249
+ * later boot — never renaming the source aside without a target to write to,
250
+ * and never marking the relocation done while it has not happened. The throw
251
+ * is caught per-step by the runner, so startup is not aborted.
252
+ */
253
+ export async function runMemoryTableRelocation(
254
+ database: DrizzleDb,
255
+ spec: RelocationSpec,
256
+ ensureSchema: (memoryRaw: Database) => void,
257
+ ): Promise<void> {
258
+ const memoryRaw = getMemorySqlite();
259
+ if (!memoryRaw) {
260
+ throw new Error(
261
+ `memory database unavailable — deferring ${spec.table} relocation`,
262
+ );
263
+ }
264
+
265
+ ensureSchema(memoryRaw);
266
+
267
+ const raw = getSqliteFrom(database);
268
+ const needsDrain = stageTableForRelocation(raw, spec.table);
269
+
270
+ if (needsDrain) {
271
+ await drainStagedTable(raw, spec);
272
+ }
273
+ }
@@ -109,6 +109,8 @@ export interface MigrationRunResult {
109
109
  failed: string[];
110
110
  /** Steps skipped because a prior run already applied them. */
111
111
  skipped: string[];
112
+ /** Steps not run because a declared dependsOn prerequisite is not applied. */
113
+ deferred: string[];
112
114
  }
113
115
 
114
116
  /**
@@ -213,6 +215,11 @@ export function recoverCrashedMigrations(database: DrizzleDb): string[] {
213
215
  * Individual step failures are caught and logged so one broken migration does
214
216
  * not prevent independent later ones from succeeding; a failed step is not
215
217
  * checkpointed and is retried on the next boot.
218
+ *
219
+ * A step whose declared `dependsOn` prerequisites are not all applied — because
220
+ * a dependency failed this boot or was never run — is deferred rather than
221
+ * executed against missing state. A deferred step writes nothing to the ledger,
222
+ * so it retries on the next boot once its prerequisites have been applied.
216
223
  */
217
224
  export async function runMigrationSteps(
218
225
  database: DrizzleDb,
@@ -242,6 +249,7 @@ export async function runMigrationSteps(
242
249
  const failed: string[] = [];
243
250
  const skipped: string[] = [];
244
251
  const ran: string[] = [];
252
+ const deferred: string[] = [];
245
253
 
246
254
  const totalSteps = steps.length;
247
255
  for (const [index, step] of steps.entries()) {
@@ -257,6 +265,19 @@ export async function runMigrationSteps(
257
265
  continue;
258
266
  }
259
267
 
268
+ // Defer a step whose prerequisites are not applied rather than run it
269
+ // against missing state. Nothing is written to the ledger — no 'started'
270
+ // marker, no checkpoint — so the step retries on the next boot.
271
+ const missing = (obj.dependsOn ?? []).filter((dep) => !applied.has(dep));
272
+ if (missing.length > 0) {
273
+ deferred.push(name);
274
+ log.warn(
275
+ { migration: name, missing, step: stepNumber, totalSteps },
276
+ `Deferring migration "${name}" — prerequisites not applied: ${missing.join(", ")}`,
277
+ );
278
+ continue;
279
+ }
280
+
260
281
  try {
261
282
  if (checkpointable) {
262
283
  markStarted.run(`${STEP_CHECKPOINT_PREFIX}${name}`, Date.now());
@@ -276,6 +297,9 @@ export async function runMigrationSteps(
276
297
  if (checkpointable) {
277
298
  markApplied.run(`${STEP_CHECKPOINT_PREFIX}${name}`, Date.now());
278
299
  ran.push(name);
300
+ // Record the success in the in-memory set too, so a later step in this
301
+ // same boot can depend on it without being deferred.
302
+ applied.add(name);
279
303
  }
280
304
  } catch (err) {
281
305
  // Leave the 'started' marker in place (if one was written) —
@@ -289,7 +313,7 @@ export async function runMigrationSteps(
289
313
  }
290
314
  }
291
315
 
292
- return { applied: ran, failed, skipped };
316
+ return { applied: ran, failed, skipped, deferred };
293
317
  }
294
318
 
295
319
  /**
@@ -170,6 +170,10 @@ export const llmRequestLogs = sqliteTable(
170
170
  ],
171
171
  );
172
172
 
173
+ // Per-turn diagnostics for memory recall, recording hit counts, latency,
174
+ // and the injected text. Lives in the dedicated memory database
175
+ // (`assistant-memory.db`), not main — access it via the memory connection
176
+ // (`getMemoryDb()` / `getMemorySqlite()`).
173
177
  export const memoryRecallLogs = sqliteTable(
174
178
  "memory_recall_logs",
175
179
  {
@@ -202,6 +206,9 @@ export const memoryRecallLogs = sqliteTable(
202
206
  ],
203
207
  );
204
208
 
209
+ // Per-turn log of memory-v2 concept/skill activations. Lives in the
210
+ // dedicated memory database (`assistant-memory.db`), not main — access it
211
+ // via the memory connection (`getMemoryDb()` / `getMemorySqlite()`).
205
212
  export const memoryV2ActivationLogs = sqliteTable(
206
213
  "memory_v2_activation_logs",
207
214
  {
@@ -277,6 +284,8 @@ export const llmUsageEvents = sqliteTable(
277
284
  // One row per conversation started on the activation-rail bootstrap template.
278
285
  // Lets the activation funnel telemetry scope its events to activation
279
286
  // conversations without inspecting the bootstrap template at emit time.
287
+ // Lives in the dedicated memory database (`assistant-memory.db`), not main —
288
+ // access it via the memory connection (`getMemoryDb()` / `getMemorySqlite()`).
280
289
  export const activationSessions = sqliteTable("activation_sessions", {
281
290
  conversationId: text("conversation_id").primaryKey(),
282
291
  createdAt: integer("created_at").notNull(),
@@ -72,6 +72,9 @@ export const memoryEmbeddings = sqliteTable(
72
72
  ],
73
73
  );
74
74
 
75
+ // Background job queue for the memory plugin. Lives in the dedicated memory
76
+ // database (`assistant-memory.db`), not main — access it via the memory
77
+ // connection (`getMemoryDb()` / `getMemorySqlite()`).
75
78
  export const memoryJobs = sqliteTable("memory_jobs", {
76
79
  id: text("id").primaryKey(),
77
80
  type: text("type").notNull(),
@@ -44,6 +44,8 @@ export const memoryV3EverInjected = sqliteTable(
44
44
  );
45
45
 
46
46
  // Per-turn log of which memory-v3 cards were selected, with lane attribution.
47
+ // Lives in the dedicated memory database (`assistant-memory.db`), not main —
48
+ // access it via the memory connection (`getMemoryDb()` / `getMemorySqlite()`).
47
49
  export const memoryV3Selections = sqliteTable(
48
50
  "memory_v3_selections",
49
51
  {
@@ -443,6 +443,10 @@ import { migrateMoveSkillLoadedEventsToTelemetryDb } from "./migrations/332-move
443
443
  import { migrateCreateTelemetryEventsTable } from "./migrations/333-create-telemetry-events-table.js";
444
444
  import { migrateBackfillTelemetryEventsOutbox } from "./migrations/334-backfill-telemetry-events-outbox.js";
445
445
  import { migrateCollapseMemoryEmbedBacklog } from "./migrations/335-collapse-memory-embed-backlog.js";
446
+ import { migrateMoveMemoryV2ActivationLogsToMemoryDb } from "./migrations/336-move-memory-v2-activation-logs-to-memory-db.js";
447
+ import { migrateMoveMemoryRecallLogsToMemoryDb } from "./migrations/337-move-memory-recall-logs-to-memory-db.js";
448
+ import { migrateMoveMemoryV3SelectionsToMemoryDb } from "./migrations/338-move-memory-v3-selections-to-memory-db.js";
449
+ import { migrateMoveActivationSessionsToMemoryDb } from "./migrations/339-move-activation-sessions-to-memory-db.js";
446
450
  import type { MigrationStep } from "./migrations/run-migrations.js";
447
451
 
448
452
  export const migrationSteps: MigrationStep[] = [
@@ -1357,4 +1361,36 @@ export const migrationSteps: MigrationStep[] = [
1357
1361
  migrateCreateTelemetryEventsTable,
1358
1362
  migrateBackfillTelemetryEventsOutbox,
1359
1363
  migrateCollapseMemoryEmbedBacklog,
1364
+ {
1365
+ name: "migrateMoveMemoryV2ActivationLogsToMemoryDb",
1366
+ run: migrateMoveMemoryV2ActivationLogsToMemoryDb,
1367
+ // 256's backfill reads memory_v2_activation_logs from main, so the move
1368
+ // must not run on a database where 256 is still pending.
1369
+ dependsOn: [
1370
+ "migrateMemoryV2ActivationLogs",
1371
+ "migrateMemoryV2InjectionEvents",
1372
+ ],
1373
+ },
1374
+ {
1375
+ name: "migrateMoveMemoryRecallLogsToMemoryDb",
1376
+ run: migrateMoveMemoryRecallLogsToMemoryDb,
1377
+ dependsOn: [
1378
+ "migrateCreateMemoryRecallLogs",
1379
+ "migrateMemoryRecallLogsQueryContext",
1380
+ "migrateDeletePrivateConversations",
1381
+ ],
1382
+ },
1383
+ {
1384
+ name: "migrateMoveMemoryV3SelectionsToMemoryDb",
1385
+ run: migrateMoveMemoryV3SelectionsToMemoryDb,
1386
+ dependsOn: [
1387
+ "migrateAddMemoryV3Selections",
1388
+ "migrateMemoryV3SelectionsMessageIdAndSections",
1389
+ ],
1390
+ },
1391
+ {
1392
+ name: "migrateMoveActivationSessionsToMemoryDb",
1393
+ run: migrateMoveActivationSessionsToMemoryDb,
1394
+ dependsOn: ["createActivationSessionsTable"],
1395
+ },
1360
1396
  ];
@@ -287,34 +287,13 @@ describe("VellumPlatformClient", () => {
287
287
  });
288
288
  });
289
289
 
290
- test("coerced false with share_analytics_chosen=false (never chose) maps to true", async () => {
290
+ test("explicit false is an opt-out", async () => {
291
291
  globalThis.fetch = mock(
292
292
  async () =>
293
293
  new Response(
294
294
  JSON.stringify({
295
295
  share_analytics: false,
296
- share_analytics_chosen: false,
297
- share_diagnostics: true,
298
- share_diagnostics_accepted_version: "2026-06-18",
299
- }),
300
- { status: 200 },
301
- ),
302
- ) as unknown as typeof globalThis.fetch;
303
-
304
- const client = await VellumPlatformClient.create();
305
- const consent = await client!.getOwnerConsent();
306
- expect(consent!.shareAnalytics).toBe(true);
307
- });
308
-
309
- test("explicit false with share_analytics_chosen=true stays an opt-out", async () => {
310
- globalThis.fetch = mock(
311
- async () =>
312
- new Response(
313
- JSON.stringify({
314
- share_analytics: false,
315
- share_analytics_chosen: true,
316
296
  share_diagnostics: false,
317
- share_diagnostics_chosen: true,
318
297
  share_diagnostics_accepted_version: "2026-06-18",
319
298
  }),
320
299
  { status: 200 },
@@ -330,28 +309,6 @@ describe("VellumPlatformClient", () => {
330
309
  });
331
310
  });
332
311
 
333
- test("false without a *_chosen field (older platform) stays authoritative", async () => {
334
- globalThis.fetch = mock(
335
- async () =>
336
- new Response(
337
- JSON.stringify({
338
- share_analytics: false,
339
- share_diagnostics: false,
340
- share_diagnostics_accepted_version: "",
341
- }),
342
- { status: 200 },
343
- ),
344
- ) as unknown as typeof globalThis.fetch;
345
-
346
- const client = await VellumPlatformClient.create();
347
- const consent = await client!.getOwnerConsent();
348
- expect(consent).toEqual({
349
- shareAnalytics: false,
350
- shareDiagnostics: false,
351
- shareDiagnosticsAcceptedVersion: "",
352
- });
353
- });
354
-
355
312
  test("null share_diagnostics (owner never chose) maps to true with the version gate still closed", async () => {
356
313
  globalThis.fetch = mock(
357
314
  async () =>
@@ -18,11 +18,9 @@ let _missingPrereqsWarned = false;
18
18
 
19
19
  export interface OwnerConsent {
20
20
  /**
21
- * Telemetry is opt-out: a null wire value (the owner was never shown the
22
- * choice) maps to `true` here only an explicit opt-out disables sharing.
23
- * A `false` accompanied by `share_analytics_chosen: false` is the platform
24
- * coercing a never-chose null to a strict boolean, not a real opt-out, so
25
- * it also maps to `true`.
21
+ * Telemetry is opt-out: the owner-consent endpoint returns effective
22
+ * values (a never-chose null is served as consented), so an explicit
23
+ * `false` is the only thing that disables sharing.
26
24
  */
27
25
  shareAnalytics: boolean;
28
26
  /** Same opt-out semantics as {@link shareAnalytics}. */
@@ -132,10 +130,11 @@ export class VellumPlatformClient {
132
130
  /**
133
131
  * Fetch the platform owner's telemetry consent for this assistant.
134
132
  *
133
+ * The endpoint returns effective consent values (a never-chose null is
134
+ * served as consented); an explicit `false` is the only disable.
135
+ *
135
136
  * Returns `null` whenever the consent is unknown — missing assistant id,
136
- * any non-2xx response (e.g. 404 before the endpoint is deployed), a
137
- * malformed body, or a network error. Callers treat `null` as default-off.
138
- * Never throws.
137
+ * any non-2xx response, a malformed body, or a network error. Never throws.
139
138
  */
140
139
  async getOwnerConsent(): Promise<OwnerConsent | null> {
141
140
  if (!this.assistantId) {
@@ -156,9 +155,7 @@ export class VellumPlatformClient {
156
155
 
157
156
  const body = (await res.json()) as {
158
157
  share_analytics?: unknown;
159
- share_analytics_chosen?: unknown;
160
158
  share_diagnostics?: unknown;
161
- share_diagnostics_chosen?: unknown;
162
159
  share_diagnostics_accepted_version?: unknown;
163
160
  };
164
161
  if (
@@ -172,16 +169,9 @@ export class VellumPlatformClient {
172
169
  }
173
170
 
174
171
  return {
175
- // Opt-out: anything but an explicit false enables sharing. A false
176
- // with `*_chosen: false` is a platform-coerced never-chose default
177
- // (not a real opt-out), so it enables too. An absent `*_chosen`
178
- // (older platform) leaves false authoritative.
179
- shareAnalytics:
180
- body.share_analytics !== false ||
181
- body.share_analytics_chosen === false,
182
- shareDiagnostics:
183
- body.share_diagnostics !== false ||
184
- body.share_diagnostics_chosen === false,
172
+ // Opt-out: anything but an explicit false enables sharing.
173
+ shareAnalytics: body.share_analytics !== false,
174
+ shareDiagnostics: body.share_diagnostics !== false,
185
175
  // Back-compat: an older platform that doesn't return this field yields
186
176
  // "" → fails the trace-collection version gate → fail-closed (no trace).
187
177
  shareDiagnosticsAcceptedVersion: