@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
@@ -778,11 +778,50 @@ export function getRequestLogById(logId: string): LogRow | null {
778
778
  );
779
779
  }
780
780
 
781
+ /**
782
+ * Authoritative post-persist linkage: stamp `message_id` onto rows a flow
783
+ * inserted unlinked because its user-facing message persists afterwards
784
+ * (the /compact and summarize-up-to result cards). Dispatched through the
785
+ * IS-NULL-guarded {@link LlmRequestLogWriter.backfillMessageIdOnRecoveredLogs}
786
+ * so a concurrent inspector-recovery stamp is never overwritten. Non-fatal —
787
+ * an unlinked row degrades to time-window recovery, not data loss.
788
+ */
789
+ export function linkRequestLogsToMessage(
790
+ logIds: string[],
791
+ messageId: string,
792
+ ): void {
793
+ if (logIds.length === 0) {
794
+ return;
795
+ }
796
+ try {
797
+ resolveLlmRequestLogWriter().backfillMessageIdOnRecoveredLogs(
798
+ logIds,
799
+ messageId,
800
+ );
801
+ } catch {
802
+ // non-fatal — the row stays unlinked and time-window recovery finds it
803
+ }
804
+ }
805
+
806
+ /**
807
+ * True when a log row was authored by the turn's own agent loop — a
808
+ * `mainAgent` row, or a legacy row from before call sites were stamped
809
+ * (`call_site` NULL). Companion rows a turn merely hosts (e.g.
810
+ * `compactionAgent`) don't count: a fork-local turn whose only rows are
811
+ * companions still needs the fork-source fallback to surface the turn's
812
+ * real calls.
813
+ */
814
+ function isTurnAuthoredLog(row: LogRow): boolean {
815
+ return row.callSite == null || row.callSite === "mainAgent";
816
+ }
817
+
781
818
  export function getRequestLogsByMessageId(messageId: string): LogRow[] {
782
819
  // Resolve all assistant message IDs in the same turn so the inspector
783
820
  // shows every LLM call from the entire agent turn, not just the queried message.
784
821
  const turnMessageIds = getAssistantMessageIdsInTurn(messageId);
785
822
  const turnLogs = selectLogsByMessageIds(turnMessageIds);
823
+ const seen = new Set(turnLogs.map((l) => l.id));
824
+ const merged = [...turnLogs];
786
825
 
787
826
  // Recovery: find logs in the turn's time window that the message-ID-based
788
827
  // query missed. Two categories:
@@ -805,65 +844,62 @@ export function getRequestLogsByMessageId(messageId: string): LogRow[] {
805
844
  bounds.endTime,
806
845
  );
807
846
 
808
- if (orphanedLogs.length > 0 || unlinkedLogs.length > 0) {
809
- const seen = new Set(turnLogs.map((l) => l.id));
810
- const merged = [...turnLogs];
811
- for (const log of [...orphanedLogs, ...unlinkedLogs]) {
847
+ for (const log of [...orphanedLogs, ...unlinkedLogs]) {
848
+ if (!seen.has(log.id)) {
849
+ merged.push(log);
850
+ seen.add(log.id);
851
+ }
852
+ }
853
+
854
+ // Opportunistically backfill recovered unlinked logs so future queries
855
+ // hit the fast indexed-by-messageId path. Dispatched through the
856
+ // active write backend like every other table writer — INSERT-only
857
+ // backends no-op.
858
+ if (unlinkedLogs.length > 0 && turnMessageIds.length > 0) {
859
+ try {
860
+ const ids = unlinkedLogs.map((l) => l.id);
861
+ const targetMessageId = turnMessageIds[turnMessageIds.length - 1]!;
862
+ resolveLlmRequestLogWriter().backfillMessageIdOnRecoveredLogs(
863
+ ids,
864
+ targetMessageId,
865
+ );
866
+ } catch {
867
+ // non-fatal — the recovery already returned the right data
868
+ }
869
+ }
870
+ }
871
+ }
872
+
873
+ // Fork-source fallback: pre-fork turns keep their calls under the SOURCE
874
+ // conversation's message ids, so a fork-local turn with no turn-authored
875
+ // row resolves the source turn and merges its calls. Gating on "no
876
+ // turn-authored row" (not "no rows at all") keeps the fallback alive when
877
+ // a companion row — e.g. a summarize-up-to compaction call landing inside
878
+ // the turn's time window — was claimed by the recovery above; without it
879
+ // that companion would eclipse the turn's real calls.
880
+ if (message?.metadata && !merged.some(isTurnAuthoredLog)) {
881
+ try {
882
+ const parsed = messageMetadataSchema.safeParse(
883
+ JSON.parse(message.metadata),
884
+ );
885
+ const sourceMessageId =
886
+ parsed.success && typeof parsed.data.forkSourceMessageId === "string"
887
+ ? parsed.data.forkSourceMessageId
888
+ : null;
889
+ if (sourceMessageId && sourceMessageId !== messageId) {
890
+ const sourceTurnIds = getAssistantMessageIdsInTurn(sourceMessageId);
891
+ for (const log of selectLogsByMessageIds(sourceTurnIds)) {
812
892
  if (!seen.has(log.id)) {
813
893
  merged.push(log);
814
894
  seen.add(log.id);
815
895
  }
816
896
  }
817
- merged.sort(
818
- (a, b) => a.createdAt - b.createdAt || a.id.localeCompare(b.id),
819
- );
820
-
821
- // Opportunistically backfill recovered unlinked logs so future queries
822
- // hit the fast indexed-by-messageId path. Dispatched through the
823
- // active write backend like every other table writer — INSERT-only
824
- // backends no-op.
825
- if (unlinkedLogs.length > 0 && turnMessageIds.length > 0) {
826
- try {
827
- const ids = unlinkedLogs.map((l) => l.id);
828
- const targetMessageId = turnMessageIds[turnMessageIds.length - 1]!;
829
- resolveLlmRequestLogWriter().backfillMessageIdOnRecoveredLogs(
830
- ids,
831
- targetMessageId,
832
- );
833
- } catch {
834
- // non-fatal — the recovery already returned the right data
835
- }
836
- }
837
-
838
- return merged;
839
897
  }
898
+ } catch {
899
+ // malformed metadata — no fork source to resolve
840
900
  }
841
901
  }
842
902
 
843
- if (turnLogs.length > 0) {
844
- return turnLogs;
845
- }
846
-
847
- // Fork-source fallback: if no logs found for the turn, check whether
848
- // the queried message was forked from a source and resolve that source's turn.
849
- if (!message?.metadata) {
850
- return [];
851
- }
852
-
853
- try {
854
- const parsed = messageMetadataSchema.safeParse(
855
- JSON.parse(message.metadata),
856
- );
857
- const sourceMessageId =
858
- parsed.success && typeof parsed.data.forkSourceMessageId === "string"
859
- ? parsed.data.forkSourceMessageId
860
- : null;
861
- if (!sourceMessageId || sourceMessageId === messageId) {
862
- return [];
863
- }
864
- const sourceTurnIds = getAssistantMessageIdsInTurn(sourceMessageId);
865
- return selectLogsByMessageIds(sourceTurnIds);
866
- } catch {
867
- return [];
868
- }
903
+ merged.sort((a, b) => a.createdAt - b.createdAt || a.id.localeCompare(b.id));
904
+ return merged;
869
905
  }
@@ -1,15 +1,10 @@
1
1
  import type { Database } from "bun:sqlite";
2
2
 
3
3
  import { getMemoryDbPath } from "../../util/memory-db-path.js";
4
+ import type { DrizzleDb } from "../db-connection.js";
4
5
  import {
5
- type DrizzleDb,
6
- getMemorySqlite,
7
- getSqliteFrom,
8
- } from "../db-connection.js";
9
- import {
10
- drainStagedTable,
11
6
  type RelocationSpec,
12
- stageTableForRelocation,
7
+ runMemoryTableRelocation,
13
8
  } from "./helpers/relocation.js";
14
9
 
15
10
  /**
@@ -94,35 +89,16 @@ function createIndexes(raw: Database) {
94
89
  * The jobs store reads/writes the queue over the dedicated memory connection
95
90
  * (see `getMemoryDb()`).
96
91
  *
97
- * Like the `llm_request_logs` move (migration 297) this is incremental: create
98
- * the table (and indexes) on the memory connection, rename any populated
99
- * `main.memory_jobs` aside to `memory_jobs__relocating`, then drain it in
100
- * awaited batches (see `helpers/relocation.ts`) per {@link MEMORY_JOBS_RELOCATION}.
101
- *
102
92
  * Because the drain is awaited as part of this step, the pending/running jobs
103
93
  * are in their new home before the memory jobs worker starts later in daemon
104
94
  * startup — the worker never observes a transiently empty queue.
105
- *
106
- * Throws (rather than returning) if the memory database cannot be opened, so
107
- * the runner records the step as failed instead of applied and retries it on a
108
- * later boot — never renaming the source aside without a target to write to,
109
- * and never marking the relocation done while it has not happened. The throw is
110
- * caught per-step by the runner, so startup is not aborted.
111
95
  */
112
96
  export async function migrateMoveMemoryJobsToMemoryDb(
113
97
  database: DrizzleDb,
114
98
  ): Promise<void> {
115
- const memoryRaw = getMemorySqlite();
116
- if (!memoryRaw) {
117
- throw new Error(
118
- "memory database unavailable — deferring memory_jobs relocation",
119
- );
120
- }
121
-
122
- ensureMemoryJobsSchema(memoryRaw);
123
-
124
- const raw = getSqliteFrom(database);
125
- const needsDrain = stageTableForRelocation(raw, MEMORY_JOBS_RELOCATION.table);
126
-
127
- if (needsDrain) await drainStagedTable(raw, MEMORY_JOBS_RELOCATION);
99
+ await runMemoryTableRelocation(
100
+ database,
101
+ MEMORY_JOBS_RELOCATION,
102
+ ensureMemoryJobsSchema,
103
+ );
128
104
  }
@@ -9,8 +9,9 @@ const log = getLogger("migration-305");
9
9
  * Drops the redundant contact ACL columns now owned by the gateway DB.
10
10
  *
11
11
  * Combo 11 Phase B: the gateway DB is the source of truth for contact ACL,
12
- * making these assistant-DB columns redundant mirrors. Phase A already drained
13
- * every production read off them.
12
+ * making these assistant-DB columns redundant mirrors. Phase A drained the
13
+ * runtime reads; gateway data migrations m0006/m0008 still read them to seed a
14
+ * pre-cutover gateway, and checkpoint once they are gone.
14
15
  *
15
16
  * No DROP INDEX needed: the only contact_channels index
16
17
  * (idx_contact_channels_type_ext_chat on (type, external_chat_id)) covers none
@@ -1,15 +1,10 @@
1
1
  import type { Database } from "bun:sqlite";
2
2
 
3
3
  import { getMemoryDbPath } from "../../util/memory-db-path.js";
4
+ import type { DrizzleDb } from "../db-connection.js";
4
5
  import {
5
- type DrizzleDb,
6
- getMemorySqlite,
7
- getSqliteFrom,
8
- } from "../db-connection.js";
9
- import {
10
- drainStagedTable,
11
6
  type RelocationSpec,
12
- stageTableForRelocation,
7
+ runMemoryTableRelocation,
13
8
  } from "./helpers/relocation.js";
14
9
 
15
10
  /**
@@ -69,36 +64,15 @@ export function ensureInjectionEventsSchema(memoryRaw: Database): void {
69
64
  * accessors in `plugins/defaults/memory/v2/injection-events.ts` read/write it
70
65
  * over the dedicated memory connection (see `getMemoryDb()`).
71
66
  *
72
- * Like migrations 297/298 the move is incremental: create the table (and
73
- * indexes) on the memory connection, rename any populated
74
- * `main.memory_v2_injection_events` aside to
75
- * `memory_v2_injection_events__relocating`, then drain it in awaited batches
76
- * (see `helpers/relocation.ts`) per {@link INJECTION_EVENTS_RELOCATION}. On a
77
- * fresh install the main-side table created by migration 256 is empty, so
78
- * staging just drops it.
79
- *
80
- * Throws (rather than returning) if the memory database cannot be opened, so
81
- * the runner records the step as failed instead of applied and retries it on
82
- * a later boot — never renaming the source aside without a target to write
83
- * to. The throw is caught per-step by the runner, so startup is not aborted.
67
+ * On a fresh install the main-side table created by migration 256 is empty,
68
+ * so staging just drops it.
84
69
  */
85
70
  export async function migrateMoveInjectionEventsToMemoryDb(
86
71
  database: DrizzleDb,
87
72
  ): Promise<void> {
88
- const memoryRaw = getMemorySqlite();
89
- if (!memoryRaw) {
90
- throw new Error(
91
- "memory database unavailable — deferring memory_v2_injection_events relocation",
92
- );
93
- }
94
-
95
- ensureInjectionEventsSchema(memoryRaw);
96
-
97
- const raw = getSqliteFrom(database);
98
- const needsDrain = stageTableForRelocation(
99
- raw,
100
- INJECTION_EVENTS_RELOCATION.table,
73
+ await runMemoryTableRelocation(
74
+ database,
75
+ INJECTION_EVENTS_RELOCATION,
76
+ ensureInjectionEventsSchema,
101
77
  );
102
-
103
- if (needsDrain) await drainStagedTable(raw, INJECTION_EVENTS_RELOCATION);
104
78
  }
@@ -0,0 +1,90 @@
1
+ import type { Database } from "bun:sqlite";
2
+
3
+ import { getMemoryDbPath } from "../../util/memory-db-path.js";
4
+ import type { DrizzleDb } from "../db-connection.js";
5
+ import {
6
+ type RelocationSpec,
7
+ runMemoryTableRelocation,
8
+ } from "./helpers/relocation.js";
9
+
10
+ /**
11
+ * How to drain `memory_v2_activation_logs` from `main` into the memory DB.
12
+ * Full copy — the concept-frequency aggregator scans the entire history, so
13
+ * every row is worth preserving.
14
+ */
15
+ export const ACTIVATION_LOGS_RELOCATION: RelocationSpec = {
16
+ table: "memory_v2_activation_logs",
17
+ targetDbPath: getMemoryDbPath,
18
+ columns: [
19
+ "id",
20
+ "conversation_id",
21
+ "message_id",
22
+ "turn",
23
+ "mode",
24
+ "concepts_json",
25
+ "skills_json",
26
+ "config_json",
27
+ "created_at",
28
+ ],
29
+ };
30
+
31
+ const CREATE_TABLE = /*sql*/ `
32
+ CREATE TABLE IF NOT EXISTS memory_v2_activation_logs (
33
+ id TEXT PRIMARY KEY,
34
+ conversation_id TEXT NOT NULL,
35
+ message_id TEXT,
36
+ turn INTEGER NOT NULL,
37
+ mode TEXT NOT NULL,
38
+ concepts_json TEXT NOT NULL,
39
+ skills_json TEXT NOT NULL,
40
+ config_json TEXT NOT NULL,
41
+ created_at INTEGER NOT NULL
42
+ )
43
+ `;
44
+
45
+ /**
46
+ * Create the `memory_v2_activation_logs` table and its indexes (mirroring
47
+ * migration 234) on the memory connection. Idempotent (`IF NOT EXISTS`) — the
48
+ * dedicated connection itself performs no DDL on open, so this migration owns
49
+ * the schema. Exported so tests can stand up the memory-side schema without
50
+ * running the full drain.
51
+ */
52
+ export function ensureActivationLogsSchema(memoryRaw: Database): void {
53
+ memoryRaw.exec(CREATE_TABLE);
54
+ memoryRaw.exec(/*sql*/ `
55
+ CREATE INDEX IF NOT EXISTS idx_memory_v2_activation_logs_message_id
56
+ ON memory_v2_activation_logs (message_id)
57
+ `);
58
+ memoryRaw.exec(/*sql*/ `
59
+ CREATE INDEX IF NOT EXISTS idx_memory_v2_activation_logs_conversation_id
60
+ ON memory_v2_activation_logs (conversation_id)
61
+ `);
62
+ memoryRaw.exec(/*sql*/ `
63
+ CREATE INDEX IF NOT EXISTS idx_memory_v2_activation_logs_created_at
64
+ ON memory_v2_activation_logs (created_at)
65
+ `);
66
+ }
67
+
68
+ /**
69
+ * Move `memory_v2_activation_logs` — the per-turn v2 activation telemetry log
70
+ * — into the dedicated memory database (`assistant-memory.db`), alongside
71
+ * `memory_jobs` (migration 298) and `memory_v2_injection_events` (migration
72
+ * 326). One row is appended per activation pass, so housing the table with
73
+ * the other high-churn memory state keeps the main DB and its WAL out of
74
+ * that write path; the accessors in
75
+ * `plugins/defaults/memory/memory-v2-activation-log-store.ts` read/write it
76
+ * over the dedicated memory connection.
77
+ *
78
+ * Registered with `dependsOn` on migrations 234 (creator) and 256 (whose
79
+ * backfill reads this table from `main`), so the move never outruns either
80
+ * on a database where they are still pending.
81
+ */
82
+ export async function migrateMoveMemoryV2ActivationLogsToMemoryDb(
83
+ database: DrizzleDb,
84
+ ): Promise<void> {
85
+ await runMemoryTableRelocation(
86
+ database,
87
+ ACTIVATION_LOGS_RELOCATION,
88
+ ensureActivationLogsSchema,
89
+ );
90
+ }
@@ -0,0 +1,114 @@
1
+ import type { Database } from "bun:sqlite";
2
+
3
+ import { getMemoryDbPath } from "../../util/memory-db-path.js";
4
+ import type { DrizzleDb } from "../db-connection.js";
5
+ import {
6
+ type RelocationSpec,
7
+ runMemoryTableRelocation,
8
+ } from "./helpers/relocation.js";
9
+
10
+ /**
11
+ * How to drain `memory_recall_logs` from `main` into the memory DB. Full copy
12
+ * — the inspector reads arbitrary historical turns, so every row is worth
13
+ * preserving. `query_context` was added by migration 211, so a legacy source
14
+ * may lack the column; the drain NULL-fills it.
15
+ */
16
+ export const RECALL_LOGS_RELOCATION: RelocationSpec = {
17
+ table: "memory_recall_logs",
18
+ targetDbPath: getMemoryDbPath,
19
+ columns: [
20
+ "id",
21
+ "conversation_id",
22
+ "message_id",
23
+ "enabled",
24
+ "degraded",
25
+ "provider",
26
+ "model",
27
+ "degradation_json",
28
+ "semantic_hits",
29
+ "merged_count",
30
+ "selected_count",
31
+ "tier1_count",
32
+ "tier2_count",
33
+ "hybrid_search_latency_ms",
34
+ "sparse_vector_used",
35
+ "injected_tokens",
36
+ "latency_ms",
37
+ "top_candidates_json",
38
+ "injected_text",
39
+ "reason",
40
+ "query_context",
41
+ "created_at",
42
+ ],
43
+ };
44
+
45
+ const CREATE_TABLE = /*sql*/ `
46
+ CREATE TABLE IF NOT EXISTS memory_recall_logs (
47
+ id TEXT PRIMARY KEY,
48
+ conversation_id TEXT NOT NULL,
49
+ message_id TEXT,
50
+ enabled INTEGER NOT NULL,
51
+ degraded INTEGER NOT NULL,
52
+ provider TEXT,
53
+ model TEXT,
54
+ degradation_json TEXT,
55
+ semantic_hits INTEGER NOT NULL,
56
+ merged_count INTEGER NOT NULL,
57
+ selected_count INTEGER NOT NULL,
58
+ tier1_count INTEGER NOT NULL,
59
+ tier2_count INTEGER NOT NULL,
60
+ hybrid_search_latency_ms INTEGER NOT NULL,
61
+ sparse_vector_used INTEGER NOT NULL,
62
+ injected_tokens INTEGER NOT NULL,
63
+ latency_ms INTEGER NOT NULL,
64
+ top_candidates_json TEXT NOT NULL,
65
+ injected_text TEXT,
66
+ reason TEXT,
67
+ query_context TEXT,
68
+ created_at INTEGER NOT NULL
69
+ )
70
+ `;
71
+
72
+ /**
73
+ * Create the `memory_recall_logs` table and its indexes (mirroring migration
74
+ * 194, with the `query_context` column from migration 211 built in) on the
75
+ * memory connection. Idempotent (`IF NOT EXISTS`) — the dedicated connection
76
+ * itself performs no DDL on open, so this migration owns the schema. Exported
77
+ * so tests can stand up the memory-side schema without running the full
78
+ * drain.
79
+ */
80
+ export function ensureRecallLogsSchema(memoryRaw: Database): void {
81
+ memoryRaw.exec(CREATE_TABLE);
82
+ memoryRaw.exec(/*sql*/ `
83
+ CREATE INDEX IF NOT EXISTS idx_memory_recall_logs_message_id
84
+ ON memory_recall_logs (message_id)
85
+ `);
86
+ memoryRaw.exec(/*sql*/ `
87
+ CREATE INDEX IF NOT EXISTS idx_memory_recall_logs_conversation_id
88
+ ON memory_recall_logs (conversation_id)
89
+ `);
90
+ }
91
+
92
+ /**
93
+ * Move `memory_recall_logs` — the per-turn memory recall telemetry consumed
94
+ * by the inspector — into the dedicated memory database
95
+ * (`assistant-memory.db`), alongside the other relocated per-turn memory log
96
+ * tables. One row is appended per recall pass, so housing the table with the
97
+ * other high-churn memory state keeps the main DB and its WAL out of that
98
+ * write path; the accessors in
99
+ * `plugins/defaults/memory/memory-recall-log-store.ts` read/write it over the
100
+ * dedicated memory connection.
101
+ *
102
+ * Registered with `dependsOn` on migrations 194 (creator) and 211
103
+ * (`query_context` column), so the move never outruns either on a database
104
+ * where they are still pending.
105
+ */
106
+ export async function migrateMoveMemoryRecallLogsToMemoryDb(
107
+ database: DrizzleDb,
108
+ ): Promise<void> {
109
+ await runMemoryTableRelocation(
110
+ database,
111
+ RECALL_LOGS_RELOCATION,
112
+ ensureRecallLogsSchema,
113
+ );
114
+ }
@@ -0,0 +1,84 @@
1
+ import type { Database } from "bun:sqlite";
2
+
3
+ import { getMemoryDbPath } from "../../util/memory-db-path.js";
4
+ import type { DrizzleDb } from "../db-connection.js";
5
+ import {
6
+ type RelocationSpec,
7
+ runMemoryTableRelocation,
8
+ } from "./helpers/relocation.js";
9
+
10
+ /**
11
+ * How to drain `memory_v3_selections` from `main` into the memory DB. Every
12
+ * row is copied: the hot-set and learned-edge lanes score decayed selection
13
+ * frequency over the full log, so there is no age cutoff a purge could lean
14
+ * on. The column list covers migration 268's originals plus the nullable
15
+ * columns migration 283 added — a source staged before 283 ran simply
16
+ * NULL-fills them during the copy.
17
+ */
18
+ export const MEMORY_V3_SELECTIONS_RELOCATION: RelocationSpec = {
19
+ table: "memory_v3_selections",
20
+ targetDbPath: getMemoryDbPath,
21
+ columns: [
22
+ "conversation_id",
23
+ "turn",
24
+ "slug",
25
+ "source",
26
+ "pinned",
27
+ "created_at",
28
+ "message_id",
29
+ "section_ordinal",
30
+ "section_title",
31
+ ],
32
+ };
33
+
34
+ /**
35
+ * Create the `memory_v3_selections` table and its indexes on the memory
36
+ * connection. Idempotent (`IF NOT EXISTS`) — the dedicated connection itself
37
+ * performs no DDL on open, so this migration owns the schema. Exported so
38
+ * tests can stand up the memory-side schema without running the full drain.
39
+ */
40
+ export function ensureMemoryV3SelectionsSchema(memoryRaw: Database): void {
41
+ memoryRaw.exec(/*sql*/ `
42
+ CREATE TABLE IF NOT EXISTS memory_v3_selections (
43
+ conversation_id TEXT NOT NULL,
44
+ turn INTEGER NOT NULL,
45
+ slug TEXT NOT NULL,
46
+ source TEXT NOT NULL,
47
+ pinned INTEGER NOT NULL DEFAULT 0,
48
+ created_at INTEGER NOT NULL,
49
+ message_id TEXT,
50
+ section_ordinal INTEGER,
51
+ section_title TEXT,
52
+ PRIMARY KEY (conversation_id, turn, slug)
53
+ )
54
+ `);
55
+ memoryRaw.exec(/*sql*/ `
56
+ CREATE INDEX IF NOT EXISTS idx_memory_v3_selections_conv
57
+ ON memory_v3_selections (conversation_id, turn DESC)
58
+ `);
59
+ memoryRaw.exec(/*sql*/ `
60
+ CREATE INDEX IF NOT EXISTS idx_memory_v3_selections_message
61
+ ON memory_v3_selections (message_id)
62
+ `);
63
+ }
64
+
65
+ /**
66
+ * Move `memory_v3_selections` — the per-turn v3 selection log feeding the
67
+ * hot-set, learned-edge, prune, and inspector readers — into the dedicated
68
+ * memory database (`assistant-memory.db`), alongside `memory_jobs` (298) and
69
+ * `memory_v2_injection_events` (326). The log gains rows on every v3 turn;
70
+ * housing it with the other high-churn memory state keeps the main DB and its
71
+ * WAL out of that write path.
72
+ *
73
+ * On a fresh install the main-side table created by migration 268 is empty,
74
+ * so staging just drops it.
75
+ */
76
+ export async function migrateMoveMemoryV3SelectionsToMemoryDb(
77
+ database: DrizzleDb,
78
+ ): Promise<void> {
79
+ await runMemoryTableRelocation(
80
+ database,
81
+ MEMORY_V3_SELECTIONS_RELOCATION,
82
+ ensureMemoryV3SelectionsSchema,
83
+ );
84
+ }
@@ -0,0 +1,52 @@
1
+ import type { Database } from "bun:sqlite";
2
+
3
+ import { getMemoryDbPath } from "../../util/memory-db-path.js";
4
+ import type { DrizzleDb } from "../db-connection.js";
5
+ import {
6
+ type RelocationSpec,
7
+ runMemoryTableRelocation,
8
+ } from "./helpers/relocation.js";
9
+
10
+ /**
11
+ * How to drain `activation_sessions` from `main` into the memory DB. Every
12
+ * row is copied: the table is one row per activation-rail conversation, read
13
+ * by the activation funnel for the conversation's whole lifetime.
14
+ */
15
+ export const ACTIVATION_SESSIONS_RELOCATION: RelocationSpec = {
16
+ table: "activation_sessions",
17
+ targetDbPath: getMemoryDbPath,
18
+ columns: ["conversation_id", "created_at"],
19
+ };
20
+
21
+ /**
22
+ * Create the `activation_sessions` table on the memory connection. Idempotent
23
+ * (`IF NOT EXISTS`) — the dedicated connection itself performs no DDL on open,
24
+ * so this migration owns the schema.
25
+ */
26
+ function ensureActivationSessionsSchema(memoryRaw: Database): void {
27
+ memoryRaw.exec(/*sql*/ `
28
+ CREATE TABLE IF NOT EXISTS activation_sessions (
29
+ conversation_id TEXT PRIMARY KEY,
30
+ created_at INTEGER NOT NULL
31
+ )
32
+ `);
33
+ }
34
+
35
+ /**
36
+ * Move `activation_sessions` — the per-conversation activation-rail marker
37
+ * behind the activation funnel telemetry — into the dedicated memory database
38
+ * (`assistant-memory.db`), joining the memory plugin's other relocated state
39
+ * so its store reads/writes ride the memory connection.
40
+ *
41
+ * On a fresh install the main-side table created by migration 274 is empty,
42
+ * so staging just drops it.
43
+ */
44
+ export async function migrateMoveActivationSessionsToMemoryDb(
45
+ database: DrizzleDb,
46
+ ): Promise<void> {
47
+ await runMemoryTableRelocation(
48
+ database,
49
+ ACTIVATION_SESSIONS_RELOCATION,
50
+ ensureActivationSessionsSchema,
51
+ );
52
+ }