@vellumai/assistant 0.8.0 → 0.8.1

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 (692) hide show
  1. package/AGENTS.md +11 -0
  2. package/Dockerfile +5 -4
  3. package/README.md +2 -2
  4. package/docker-entrypoint.sh +16 -0
  5. package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +420 -0
  6. package/eslint-rules/cli-no-daemon-internals.js +283 -0
  7. package/eslint.config.mjs +12 -0
  8. package/knip.json +2 -1
  9. package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -1
  10. package/openapi.yaml +4847 -1698
  11. package/package.json +3 -1
  12. package/scripts/generate-openapi.ts +52 -4
  13. package/scripts/sync-llm-catalog.ts +165 -0
  14. package/scripts/sync-web-search-catalog.ts +107 -0
  15. package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +169 -0
  16. package/src/__tests__/agent-loop-override-profile.test.ts +26 -1
  17. package/src/__tests__/anthropic-provider.test.ts +92 -2
  18. package/src/__tests__/app-control-flow.test.ts +7 -0
  19. package/src/__tests__/assistant-events-sse-shed.test.ts +232 -0
  20. package/src/__tests__/avatar-identity-sync.test.ts +87 -0
  21. package/src/__tests__/background-workers-disk-pressure.test.ts +11 -22
  22. package/src/__tests__/btw-routes.test.ts +1 -0
  23. package/src/__tests__/call-site-routing-provider.test.ts +172 -45
  24. package/src/__tests__/cancel-resolves-conversation-key.test.ts +44 -3
  25. package/src/__tests__/channel-policy.test.ts +12 -0
  26. package/src/__tests__/checker.test.ts +89 -0
  27. package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +35 -7
  28. package/src/__tests__/compact-event-conversation-id-guard.test.ts +33 -5
  29. package/src/__tests__/compaction-strip-metadata-clear.test.ts +26 -1
  30. package/src/__tests__/config-loader-backfill.test.ts +526 -102
  31. package/src/__tests__/config-loader-corrupt.test.ts +68 -0
  32. package/src/__tests__/config-loader-platform-defaults.test.ts +77 -23
  33. package/src/__tests__/config-schema-cmd.test.ts +63 -29
  34. package/src/__tests__/config-schema.test.ts +14 -3
  35. package/src/__tests__/config-set-platform-guard.test.ts +75 -152
  36. package/src/__tests__/config-set-route.test.ts +198 -0
  37. package/src/__tests__/config-watcher.test.ts +6 -0
  38. package/src/__tests__/contacts-tools.test.ts +51 -199
  39. package/src/__tests__/context-search-agent-protocol.test.ts +21 -2
  40. package/src/__tests__/context-search-agent-runner.test.ts +22 -138
  41. package/src/__tests__/context-search-conversations-source.test.ts +42 -16
  42. package/src/__tests__/context-search-fanout.test.ts +20 -157
  43. package/src/__tests__/context-search-memory-v2-source.test.ts +3 -3
  44. package/src/__tests__/context-search-types.test.ts +7 -2
  45. package/src/__tests__/context-window-manager.test.ts +389 -1
  46. package/src/__tests__/conversation-agent-loop-overflow.test.ts +1 -0
  47. package/src/__tests__/conversation-crud-inference-profile.test.ts +100 -0
  48. package/src/__tests__/conversation-error.test.ts +38 -0
  49. package/src/__tests__/conversation-fork-crud.test.ts +241 -1
  50. package/src/__tests__/conversation-inference-profile-route.test.ts +14 -14
  51. package/src/__tests__/conversation-init.benchmark.test.ts +1 -0
  52. package/src/__tests__/conversation-lifecycle.test.ts +124 -0
  53. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +100 -1
  54. package/src/__tests__/conversation-process-callsite.test.ts +21 -1
  55. package/src/__tests__/conversation-runtime-assembly.test.ts +4 -4
  56. package/src/__tests__/conversation-slash-commands.test.ts +194 -2
  57. package/src/__tests__/conversation-surfaces-app-control.test.ts +323 -3
  58. package/src/__tests__/credential-security-invariants.test.ts +5 -6
  59. package/src/__tests__/daemon-credential-client.test.ts +56 -1
  60. package/src/__tests__/db-activation-state-fk-cascade.test.ts +132 -0
  61. package/src/__tests__/db-conversation-inference-profile-migration.test.ts +37 -0
  62. package/src/__tests__/db-memory-graph-event-date-repair.test.ts +43 -20
  63. package/src/__tests__/db-proxy-transaction.test.ts +206 -0
  64. package/src/__tests__/external-plugin-loader.test.ts +458 -0
  65. package/src/__tests__/filing-service.test.ts +23 -3
  66. package/src/__tests__/fixtures/mock-chrome-extension.ts +5 -0
  67. package/src/__tests__/gateway-only-guard.test.ts +0 -1
  68. package/src/__tests__/graph-extraction-event-date.test.ts +34 -0
  69. package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +0 -8
  70. package/src/__tests__/heartbeat-disk-pressure.test.ts +21 -8
  71. package/src/__tests__/heartbeat-service.test.ts +50 -233
  72. package/src/__tests__/history-repair.test.ts +89 -0
  73. package/src/__tests__/host-app-control-proxy.test.ts +109 -1
  74. package/src/__tests__/host-app-control-routes.test.ts +247 -1
  75. package/src/__tests__/host-browser-proxy.test.ts +416 -20
  76. package/src/__tests__/host-browser-routes.test.ts +325 -33
  77. package/src/__tests__/host-proxy-preactivation.test.ts +211 -0
  78. package/src/__tests__/inference-no-mode-boot-e2e.test.ts +246 -0
  79. package/src/__tests__/inference-profile-reaper.test.ts +154 -0
  80. package/src/__tests__/inference-profile-session-handler.test.ts +398 -0
  81. package/src/__tests__/inference-profile-session-ipc.test.ts +236 -0
  82. package/src/__tests__/inline-skill-load-permissions.test.ts +6 -1
  83. package/src/__tests__/install-skill-routing.test.ts +2 -2
  84. package/src/__tests__/lifecycle-memory-v2-seed.test.ts +15 -0
  85. package/src/__tests__/llm-callsite-catalog.test.ts +20 -1
  86. package/src/__tests__/llm-catalog-parity.test.ts +146 -0
  87. package/src/__tests__/llm-request-log-source-clickhouse.test.ts +188 -0
  88. package/src/__tests__/llm-request-log-source-factory.test.ts +124 -0
  89. package/src/__tests__/llm-resolver.test.ts +46 -0
  90. package/src/__tests__/managed-profile-guard.test.ts +131 -2
  91. package/src/__tests__/mcp-auth-routes.test.ts +1 -0
  92. package/src/__tests__/mcp-cli.test.ts +182 -220
  93. package/src/__tests__/mcp-health-check.test.ts +56 -27
  94. package/src/__tests__/memory-jobs-worker-lanes.test.ts +18 -11
  95. package/src/__tests__/message-complete-display-id.test.ts +175 -0
  96. package/src/__tests__/notification-platform-adapter.test.ts +229 -0
  97. package/src/__tests__/oauth-cli.test.ts +38 -2009
  98. package/src/__tests__/oauth-commands-routes.test.ts +711 -0
  99. package/src/__tests__/oauth-connect-routes.test.ts +174 -11
  100. package/src/__tests__/oauth-providers-routes.test.ts +14 -10
  101. package/src/__tests__/openai-responses-cutover-guard.test.ts +33 -12
  102. package/src/__tests__/openai-responses-provider.test.ts +17 -0
  103. package/src/__tests__/plugin-bootstrap.test.ts +31 -2
  104. package/src/__tests__/plugin-route-contribution.test.ts +31 -3
  105. package/src/__tests__/plugin-tool-contribution.test.ts +31 -3
  106. package/src/__tests__/plugin-types.test.ts +13 -11
  107. package/src/__tests__/process-message-background-slack.test.ts +46 -0
  108. package/src/__tests__/profile-entry-status.test.ts +43 -0
  109. package/src/__tests__/provider-managed-proxy-integration.test.ts +12 -4
  110. package/src/__tests__/provider-registry-ollama.test.ts +12 -4
  111. package/src/__tests__/provider-send-message-override-profile.test.ts +10 -4
  112. package/src/__tests__/relay-server.test.ts +118 -0
  113. package/src/__tests__/retry-thinking-tool-choice.test.ts +15 -0
  114. package/src/__tests__/schedule-retry.test.ts +56 -4
  115. package/src/__tests__/schedule-routes.test.ts +104 -0
  116. package/src/__tests__/scheduler-disk-pressure.test.ts +0 -4
  117. package/src/__tests__/scheduler-recurrence.test.ts +87 -34
  118. package/src/__tests__/scheduler-reuse-conversation.test.ts +161 -5
  119. package/src/__tests__/scheduler-wake.test.ts +0 -63
  120. package/src/__tests__/secret-allowlist.test.ts +1 -0
  121. package/src/__tests__/secret-routes-managed-proxy.test.ts +12 -4
  122. package/src/__tests__/shell-credential-ref.test.ts +95 -3
  123. package/src/__tests__/shell-tool-proxy-mode.test.ts +14 -0
  124. package/src/__tests__/skill-load-feature-flag.test.ts +1 -0
  125. package/src/__tests__/skill-load-tool.test.ts +2 -4
  126. package/src/__tests__/subagent-call-site-routing.test.ts +78 -16
  127. package/src/__tests__/suggestion-routes.test.ts +3 -3
  128. package/src/__tests__/sync-message-contract.test.ts +63 -0
  129. package/src/__tests__/task-scheduler.test.ts +88 -23
  130. package/src/__tests__/update-bulletin-job.test.ts +96 -193
  131. package/src/__tests__/usage-cli.test.ts +11 -73
  132. package/src/__tests__/user-plugin-loader.test.ts +145 -0
  133. package/src/__tests__/vercel-config.test.ts +168 -0
  134. package/src/__tests__/web-search-catalog-parity.test.ts +86 -0
  135. package/src/__tests__/web-search.test.ts +303 -2
  136. package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +1 -21
  137. package/src/__tests__/workspace-migration-057-repair-stale-gemini-model-ids.test.ts +58 -0
  138. package/src/__tests__/workspace-migration-069-seed-onboarding-threads.test.ts +53 -20
  139. package/src/__tests__/workspace-migration-072-seed-reply-suggestion-callsite.test.ts +191 -0
  140. package/src/__tests__/workspace-migration-076-drop-services-inference-mode.test.ts +211 -0
  141. package/src/__tests__/workspace-migration-077-seed-memory-router-callsite.test.ts +174 -0
  142. package/src/__tests__/workspace-migration-079-home-feed-notification-only.test.ts +323 -0
  143. package/src/__tests__/workspace-migration-080-restrict-vercel-api-token-metadata.test.ts +299 -0
  144. package/src/__tests__/workspace-migration-081-backfill-bash-allowed-tools.test.ts +410 -0
  145. package/src/__tests__/workspace-migration-082-backfill-managed-profile-labels.test.ts +268 -0
  146. package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +3 -3
  147. package/src/__tests__/workspace-release-notes-feature-flag-guard.test.ts +115 -0
  148. package/src/acp/__tests__/helpers/which-stub.ts +4 -2
  149. package/src/acp/resolve-agent.test.ts +25 -0
  150. package/src/acp/resolve-agent.ts +13 -2
  151. package/src/acp/session-manager.ts +14 -0
  152. package/src/approvals/guardian-request-resolvers.ts +32 -87
  153. package/src/calls/relay-server.ts +35 -0
  154. package/src/calls/relay-setup-router.ts +36 -0
  155. package/src/calls/types.ts +1 -0
  156. package/src/calls/voice-session-bridge.ts +23 -4
  157. package/src/channels/config.ts +14 -1
  158. package/src/channels/types.ts +1 -0
  159. package/src/cli/AGENTS.md +164 -4
  160. package/src/cli/__tests__/notifications.test.ts +54 -0
  161. package/src/cli/commands/__tests__/avatar.test.ts +540 -0
  162. package/src/cli/commands/__tests__/backup.test.ts +236 -776
  163. package/src/cli/commands/__tests__/cache.test.ts +1 -1
  164. package/src/cli/commands/__tests__/changelog.test.ts +593 -0
  165. package/src/cli/commands/__tests__/channel-verification-sessions.test.ts +503 -0
  166. package/src/cli/commands/__tests__/conversations-import.test.ts +515 -0
  167. package/src/cli/commands/__tests__/domain-register.test.ts +140 -167
  168. package/src/cli/commands/__tests__/domain-status.test.ts +137 -76
  169. package/src/cli/commands/__tests__/email-attachment.test.ts +314 -337
  170. package/src/cli/commands/__tests__/email-core.test.ts +579 -0
  171. package/src/cli/commands/__tests__/image-generation.test.ts +87 -824
  172. package/src/cli/commands/__tests__/inference-send.test.ts +30 -266
  173. package/src/cli/commands/__tests__/inference-session.test.ts +423 -0
  174. package/src/cli/commands/__tests__/memory-v2.test.ts +81 -110
  175. package/src/cli/commands/__tests__/skills.test.ts +563 -0
  176. package/src/cli/commands/__tests__/status.test.ts +249 -0
  177. package/src/cli/commands/__tests__/stt.test.ts +320 -0
  178. package/src/cli/commands/__tests__/tts-synthesize.test.ts +4 -603
  179. package/src/cli/commands/__tests__/tts.test.ts +321 -0
  180. package/src/cli/commands/__tests__/webhooks.test.ts +86 -511
  181. package/src/cli/commands/attachment.ts +8 -3
  182. package/src/cli/commands/audit.ts +95 -64
  183. package/src/cli/commands/auth.ts +61 -58
  184. package/src/cli/commands/avatar.ts +276 -390
  185. package/src/cli/commands/backup.ts +409 -505
  186. package/src/cli/commands/bash.ts +9 -5
  187. package/src/cli/commands/browser.ts +28 -9
  188. package/src/cli/commands/cache.ts +9 -4
  189. package/src/cli/commands/changelog.ts +414 -0
  190. package/src/cli/commands/channel-verification-sessions.ts +238 -317
  191. package/src/cli/commands/clients.ts +8 -3
  192. package/src/cli/commands/completions.ts +9 -9
  193. package/src/cli/commands/config.ts +102 -72
  194. package/src/cli/commands/contacts.ts +575 -696
  195. package/src/cli/commands/conversations-defer.ts +17 -69
  196. package/src/cli/commands/conversations-import.ts +90 -253
  197. package/src/cli/commands/conversations.ts +346 -436
  198. package/src/cli/commands/credential-execution.ts +9 -6
  199. package/src/cli/commands/credentials.ts +456 -736
  200. package/src/cli/commands/domain.ts +128 -206
  201. package/src/cli/commands/email.ts +606 -794
  202. package/src/cli/commands/gateway.ts +8 -1
  203. package/src/cli/commands/image-generation.ts +157 -205
  204. package/src/cli/commands/inference-providers.ts +352 -0
  205. package/src/cli/commands/inference-session.ts +415 -0
  206. package/src/cli/commands/inference.ts +87 -65
  207. package/src/cli/commands/keys.ts +8 -3
  208. package/src/cli/commands/mcp.ts +103 -287
  209. package/src/cli/commands/memory-v2.ts +162 -516
  210. package/src/cli/commands/notifications.ts +33 -7
  211. package/src/cli/commands/oauth/apps.ts +292 -261
  212. package/src/cli/commands/oauth/connect.ts +176 -297
  213. package/src/cli/commands/oauth/disconnect.ts +16 -215
  214. package/src/cli/commands/oauth/index.ts +49 -45
  215. package/src/cli/commands/oauth/mode.ts +43 -199
  216. package/src/cli/commands/oauth/ping.ts +17 -125
  217. package/src/cli/commands/oauth/providers.ts +732 -921
  218. package/src/cli/commands/oauth/request.ts +60 -350
  219. package/src/cli/commands/oauth/shared.ts +11 -121
  220. package/src/cli/commands/oauth/status.ts +31 -121
  221. package/src/cli/commands/oauth/token.ts +13 -55
  222. package/src/cli/commands/pending.ts +19 -10
  223. package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +133 -183
  224. package/src/cli/commands/platform/__tests__/connect.test.ts +66 -181
  225. package/src/cli/commands/platform/__tests__/disconnect.test.ts +71 -227
  226. package/src/cli/commands/platform/__tests__/status.test.ts +169 -287
  227. package/src/cli/commands/platform/connect.ts +16 -80
  228. package/src/cli/commands/platform/disconnect.ts +14 -112
  229. package/src/cli/commands/platform/index.ts +177 -246
  230. package/src/cli/commands/routes.ts +153 -336
  231. package/src/cli/commands/sequence.ts +316 -360
  232. package/src/cli/commands/skills.ts +449 -671
  233. package/src/cli/commands/status.ts +58 -37
  234. package/src/cli/commands/stt.ts +94 -262
  235. package/src/cli/commands/task.ts +14 -40
  236. package/src/cli/commands/trust.ts +8 -3
  237. package/src/cli/commands/tts.ts +162 -167
  238. package/src/cli/commands/ui.ts +35 -42
  239. package/src/cli/commands/usage.ts +188 -126
  240. package/src/cli/commands/watchers.ts +8 -3
  241. package/src/cli/commands/webhooks.ts +99 -193
  242. package/src/cli/lib/__tests__/register-command.test.ts +85 -0
  243. package/src/cli/lib/daemon-credential-client.ts +4 -5
  244. package/src/cli/lib/nested-value.ts +44 -0
  245. package/src/cli/lib/open-browser.ts +36 -0
  246. package/src/cli/lib/register-command.ts +19 -0
  247. package/src/cli/lib/time-ago.ts +34 -0
  248. package/src/cli/program.ts +2 -4
  249. package/src/cli/utils/__tests__/conversation-id.test.ts +66 -0
  250. package/src/cli/utils/__tests__/parse-duration.test.ts +49 -0
  251. package/src/cli/utils/conversation-id.ts +30 -0
  252. package/src/cli/utils/parse-duration.ts +41 -0
  253. package/src/config/acp-defaults.test.ts +5 -1
  254. package/src/config/acp-defaults.ts +11 -4
  255. package/src/config/bundled-skills/acp/TOOLS.json +2 -2
  256. package/src/config/bundled-skills/app-control/TOOLS.json +32 -0
  257. package/src/config/bundled-skills/contacts/SKILL.md +12 -45
  258. package/src/config/bundled-skills/contacts/TOOLS.json +0 -57
  259. package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +0 -12
  260. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -58
  261. package/src/config/bundled-tool-registry.ts +0 -2
  262. package/src/config/feature-flag-registry.json +16 -0
  263. package/src/config/llm-resolver.ts +16 -1
  264. package/src/config/loader.ts +76 -14
  265. package/src/config/raw-config-utils.ts +2 -30
  266. package/src/config/schema.ts +4 -0
  267. package/src/config/schemas/__tests__/memory-v2.test.ts +49 -0
  268. package/src/config/schemas/call-site-catalog.ts +29 -7
  269. package/src/config/schemas/llm-request-logs.ts +57 -0
  270. package/src/config/schemas/llm.ts +52 -2
  271. package/src/config/schemas/memory-retrospective.ts +48 -0
  272. package/src/config/schemas/memory-v2.ts +32 -1
  273. package/src/config/schemas/memory.ts +4 -0
  274. package/src/config/schemas/services.ts +15 -12
  275. package/src/config/seed-inference-profiles.ts +195 -134
  276. package/src/contacts/contact-store.ts +0 -61
  277. package/src/context/window-manager.ts +191 -5
  278. package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +79 -0
  279. package/src/daemon/__tests__/conversation-tool-setup.test.ts +109 -4
  280. package/src/daemon/__tests__/daemon-skill-host.test.ts +10 -4
  281. package/src/daemon/approval-generators.ts +23 -29
  282. package/src/daemon/config-watcher.ts +2 -0
  283. package/src/daemon/conversation-agent-loop-handlers.ts +24 -0
  284. package/src/daemon/conversation-agent-loop.ts +127 -97
  285. package/src/daemon/conversation-error.ts +21 -0
  286. package/src/daemon/conversation-lifecycle.ts +46 -5
  287. package/src/daemon/conversation-process.ts +36 -19
  288. package/src/daemon/conversation-runtime-assembly.ts +14 -5
  289. package/src/daemon/conversation-slash.ts +175 -23
  290. package/src/daemon/conversation-store.ts +17 -10
  291. package/src/daemon/conversation-surfaces.ts +76 -12
  292. package/src/daemon/conversation-tool-setup.ts +24 -14
  293. package/src/daemon/conversation.ts +48 -9
  294. package/src/daemon/external-plugins-bootstrap.ts +18 -8
  295. package/src/daemon/guardian-action-generators.ts +7 -22
  296. package/src/daemon/handlers/config-model.ts +8 -126
  297. package/src/daemon/handlers/config-slack-channel.ts +10 -7
  298. package/src/daemon/handlers/config-vercel.ts +3 -1
  299. package/src/daemon/handlers/skills.ts +84 -5
  300. package/src/daemon/history-repair.ts +33 -6
  301. package/src/daemon/host-app-control-proxy.ts +44 -19
  302. package/src/daemon/host-bash-proxy.ts +85 -158
  303. package/src/daemon/host-browser-proxy.ts +96 -35
  304. package/src/daemon/host-proxy-base.ts +13 -1
  305. package/src/daemon/host-proxy-preactivation.ts +25 -1
  306. package/src/daemon/identity-helpers.ts +19 -0
  307. package/src/daemon/lifecycle.ts +42 -43
  308. package/src/daemon/meet-host-supervisor.ts +15 -15
  309. package/src/daemon/memory-v2-startup.ts +9 -2
  310. package/src/daemon/message-protocol.ts +6 -0
  311. package/src/daemon/message-types/bookmarks.ts +18 -0
  312. package/src/daemon/message-types/conversations.ts +12 -9
  313. package/src/daemon/message-types/messages.ts +9 -1
  314. package/src/daemon/message-types/sync.ts +60 -0
  315. package/src/daemon/pkb-reminder-builder.test.ts +54 -13
  316. package/src/daemon/pkb-reminder-builder.ts +21 -7
  317. package/src/daemon/process-message.ts +56 -23
  318. package/src/daemon/server.ts +23 -18
  319. package/src/daemon/shutdown-handlers.ts +0 -2
  320. package/src/daemon/tool-setup-types.ts +9 -0
  321. package/src/daemon/tool-side-effects.ts +6 -4
  322. package/src/daemon/wake-target-adapter.ts +11 -0
  323. package/src/export/transcript-formatter.ts +61 -2
  324. package/src/filing/filing-service.ts +40 -53
  325. package/src/heartbeat/__tests__/heartbeat-service.test.ts +359 -0
  326. package/src/heartbeat/heartbeat-run-store.ts +2 -1
  327. package/src/heartbeat/heartbeat-service.ts +148 -127
  328. package/src/home/__tests__/feed-types.test.ts +63 -131
  329. package/src/home/__tests__/feed-writer.test.ts +77 -278
  330. package/src/home/__tests__/post-connect-feed.test.ts +9 -12
  331. package/src/home/feed-types.ts +19 -73
  332. package/src/home/feed-writer.ts +25 -156
  333. package/src/home/post-connect-feed.ts +1 -3
  334. package/src/ipc/__tests__/cli-ipc.test.ts +2 -0
  335. package/src/ipc/__tests__/email-ipc.test.ts +506 -0
  336. package/src/ipc/__tests__/exit-helper.test.ts +104 -0
  337. package/src/ipc/__tests__/streaming-client.test.ts +237 -0
  338. package/src/ipc/__tests__/streaming-framing.test.ts +142 -0
  339. package/src/ipc/assistant-server.ts +55 -6
  340. package/src/ipc/cli-client.ts +370 -50
  341. package/src/ipc/routes/db-proxy-transaction.ts +151 -0
  342. package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +60 -0
  343. package/src/ipc/skill-routes/events.ts +30 -3
  344. package/src/live-voice/__tests__/live-voice-session-manager.test.ts +46 -0
  345. package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +1 -0
  346. package/src/live-voice/live-voice-session-manager.ts +11 -4
  347. package/src/live-voice/live-voice-session.ts +14 -6
  348. package/src/memory/__tests__/bookmark-crud.test.ts +258 -0
  349. package/src/memory/__tests__/bookmark-schema.test.ts +181 -0
  350. package/src/memory/__tests__/conversation-types.test.ts +36 -0
  351. package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +130 -0
  352. package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +177 -0
  353. package/src/memory/__tests__/memory-retrospective-job.test.ts +328 -0
  354. package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +213 -0
  355. package/src/memory/__tests__/memory-retrospective-trigger-check.test.ts +90 -0
  356. package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +69 -0
  357. package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +3 -0
  358. package/src/memory/bookmark-crud.ts +179 -0
  359. package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +31 -9
  360. package/src/memory/context-search/agent-protocol.ts +5 -1
  361. package/src/memory/context-search/agent-runner.ts +60 -85
  362. package/src/memory/context-search/limits.ts +1 -4
  363. package/src/memory/context-search/search.ts +23 -113
  364. package/src/memory/context-search/sources/conversations.ts +18 -6
  365. package/src/memory/context-search/sources/memory-v2.ts +39 -14
  366. package/src/memory/context-search/sources/memory.ts +7 -0
  367. package/src/memory/context-search/sources/workspace.ts +13 -10
  368. package/src/memory/context-search/types.ts +1 -1
  369. package/src/memory/conversation-bootstrap.ts +11 -0
  370. package/src/memory/conversation-crud.ts +312 -10
  371. package/src/memory/conversation-queries.ts +9 -5
  372. package/src/memory/conversation-title-service.ts +1 -0
  373. package/src/memory/conversation-types.ts +16 -0
  374. package/src/memory/db-init.ts +14 -0
  375. package/src/memory/embedding-backend.ts +2 -1
  376. package/src/memory/embedding-runtime-manager.ts +1 -2
  377. package/src/memory/graph/__tests__/remember-description.test.ts +55 -0
  378. package/src/memory/graph/conversation-graph-memory.ts +76 -5
  379. package/src/memory/graph/extraction.ts +4 -0
  380. package/src/memory/graph/graph-memory-state-store.ts +16 -3
  381. package/src/memory/graph/tool-handlers.ts +17 -7
  382. package/src/memory/graph/tools.ts +44 -5
  383. package/src/memory/indexer.ts +17 -0
  384. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +13 -15
  385. package/src/memory/jobs/embed-concept-page.ts +45 -9
  386. package/src/memory/jobs-store.ts +51 -1
  387. package/src/memory/jobs-worker.ts +52 -3
  388. package/src/memory/llm-request-log-source-clickhouse.ts +317 -0
  389. package/src/memory/llm-request-log-source-local.ts +26 -0
  390. package/src/memory/llm-request-log-source.ts +97 -0
  391. package/src/memory/llm-request-log-store.ts +1 -1
  392. package/src/memory/memory-retrospective-constants.ts +13 -0
  393. package/src/memory/memory-retrospective-enqueue.ts +114 -0
  394. package/src/memory/memory-retrospective-job.ts +351 -0
  395. package/src/memory/memory-retrospective-startup-cleanup.ts +108 -0
  396. package/src/memory/memory-retrospective-state.ts +162 -0
  397. package/src/memory/memory-retrospective-trigger-check.ts +91 -0
  398. package/src/memory/memory-v2-activation-log-store.ts +49 -5
  399. package/src/memory/memory-v2-concept-frequency.ts +4 -0
  400. package/src/memory/message-content.ts +38 -1
  401. package/src/memory/migrations/227-add-conversation-inference-profile.ts +6 -1
  402. package/src/memory/migrations/228-rename-inference-profile-snake-case.ts +20 -7
  403. package/src/memory/migrations/229-delete-private-conversations.test.ts +70 -1
  404. package/src/memory/migrations/229-delete-private-conversations.ts +12 -0
  405. package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +16 -2
  406. package/src/memory/migrations/240-conversation-inference-profile-session.ts +25 -0
  407. package/src/memory/migrations/241-activation-state-fk-cascade.ts +50 -0
  408. package/src/memory/migrations/242-message-bookmarks.ts +38 -0
  409. package/src/memory/migrations/243-provider-connections.ts +68 -0
  410. package/src/memory/migrations/244-provider-connection-status-label.ts +23 -0
  411. package/src/memory/migrations/245-memory-retrospective-state.ts +36 -0
  412. package/src/memory/migrations/246-backfill-provider-connection-label.ts +81 -0
  413. package/src/memory/migrations/__tests__/244-provider-connection-status-label.test.ts +84 -0
  414. package/src/memory/migrations/__tests__/245-memory-retrospective-state.test.ts +125 -0
  415. package/src/memory/migrations/__tests__/246-backfill-provider-connection-label.test.ts +192 -0
  416. package/src/memory/migrations/index.ts +7 -0
  417. package/src/memory/published-pages-store.ts +16 -0
  418. package/src/memory/schema/bookmarks.ts +38 -0
  419. package/src/memory/schema/conversations.ts +2 -0
  420. package/src/memory/schema/index.ts +2 -0
  421. package/src/memory/schema/inference.ts +29 -0
  422. package/src/memory/schema/memory-core.ts +9 -0
  423. package/src/memory/search/semantic.ts +1 -4
  424. package/src/memory/v2/__tests__/__snapshots__/prompts-router.test.ts.snap +27 -0
  425. package/src/memory/v2/__tests__/activation-store.test.ts +5 -5
  426. package/src/memory/v2/__tests__/activation.test.ts +11 -4
  427. package/src/memory/v2/__tests__/backfill-jobs.test.ts +38 -21
  428. package/src/memory/v2/__tests__/consolidation-job.test.ts +123 -135
  429. package/src/memory/v2/__tests__/edge-index.test.ts +1 -1
  430. package/src/memory/v2/__tests__/frontmatter-sweep.test.ts +111 -0
  431. package/src/memory/v2/__tests__/injection.test.ts +628 -10
  432. package/src/memory/v2/__tests__/migration.test.ts +7 -3
  433. package/src/memory/v2/__tests__/page-index.test.ts +277 -0
  434. package/src/memory/v2/__tests__/page-store.test.ts +14 -1
  435. package/src/memory/v2/__tests__/prompts-router.test.ts +257 -0
  436. package/src/memory/v2/__tests__/qdrant.test.ts +72 -0
  437. package/src/memory/v2/__tests__/reranker.test.ts +4 -4
  438. package/src/memory/v2/__tests__/router.test.ts +516 -0
  439. package/src/memory/v2/__tests__/sim.test.ts +45 -1
  440. package/src/memory/v2/__tests__/skill-store.test.ts +58 -3
  441. package/src/memory/v2/__tests__/static-context.test.ts +7 -22
  442. package/src/memory/v2/__tests__/sweep-job.test.ts +95 -0
  443. package/src/memory/v2/activation-store.ts +34 -5
  444. package/src/memory/v2/activation.ts +40 -27
  445. package/src/memory/v2/backfill-jobs.ts +17 -84
  446. package/src/memory/v2/consolidation-job.ts +85 -78
  447. package/src/memory/v2/frontmatter-sweep.ts +91 -0
  448. package/src/memory/v2/injection.ts +440 -109
  449. package/src/memory/v2/migration.ts +117 -20
  450. package/src/memory/v2/page-index.ts +191 -0
  451. package/src/memory/v2/page-store.ts +3 -0
  452. package/src/memory/v2/prompts/consolidation.ts +9 -7
  453. package/src/memory/v2/prompts/router.ts +192 -0
  454. package/src/memory/v2/qdrant.ts +100 -87
  455. package/src/memory/v2/reranker.ts +14 -7
  456. package/src/memory/v2/router.ts +322 -0
  457. package/src/memory/v2/sim.ts +25 -12
  458. package/src/memory/v2/skill-store.ts +118 -29
  459. package/src/memory/v2/static-context.ts +16 -9
  460. package/src/memory/v2/sweep-job.ts +122 -96
  461. package/src/memory/v2/types.ts +10 -6
  462. package/src/memory/validation.ts +13 -0
  463. package/src/notifications/__tests__/emit-signal-home-feed.test.ts +182 -0
  464. package/src/notifications/__tests__/home-feed-side-effect.test.ts +199 -0
  465. package/src/notifications/__tests__/signal-registry.test.ts +17 -0
  466. package/src/notifications/adapters/platform.ts +171 -0
  467. package/src/notifications/conversation-pairing.ts +2 -2
  468. package/src/notifications/copy-composer.ts +15 -0
  469. package/src/notifications/destination-resolver.ts +21 -0
  470. package/src/notifications/emit-signal.ts +28 -1
  471. package/src/notifications/home-feed-side-effect.ts +111 -0
  472. package/src/notifications/signal.ts +5 -0
  473. package/src/permissions/checker.ts +12 -0
  474. package/src/permissions/ipc-risk-types.ts +2 -0
  475. package/src/plugin-api/index.ts +13 -0
  476. package/src/plugin-api/package.json +12 -0
  477. package/src/plugin-api/types.ts +62 -0
  478. package/src/plugins/defaults/injectors.ts +19 -3
  479. package/src/plugins/external-plugin-loader.ts +294 -0
  480. package/src/plugins/types.ts +46 -30
  481. package/src/plugins/user-loader.ts +64 -41
  482. package/src/proactive-artifact/job.test.ts +12 -4
  483. package/src/proactive-artifact/job.ts +4 -0
  484. package/src/proactive-artifact/trigger-state.test.ts +9 -0
  485. package/src/proactive-artifact/trigger-state.ts +4 -0
  486. package/src/prompts/__tests__/system-prompt.test.ts +105 -0
  487. package/src/prompts/system-prompt.ts +22 -1
  488. package/src/prompts/update-bulletin-job.ts +61 -73
  489. package/src/providers/__tests__/dispatch-connection-routing.test.ts +279 -0
  490. package/src/providers/__tests__/inference.test.ts +288 -0
  491. package/src/providers/__tests__/provider-env-vars.test.ts +6 -0
  492. package/src/providers/__tests__/provider-secret-catalog.test.ts +6 -0
  493. package/src/providers/__tests__/retry-callsite.test.ts +14 -32
  494. package/src/providers/__tests__/satellite-connection-routing.test.ts +510 -0
  495. package/src/providers/__tests__/search-provider-catalog.test.ts +80 -0
  496. package/src/providers/anthropic/client.ts +95 -26
  497. package/src/providers/call-site-routing.ts +94 -16
  498. package/src/providers/connection-resolution.ts +163 -0
  499. package/src/providers/inference/__tests__/connections-status-label.test.ts +250 -0
  500. package/src/providers/inference/adapter-factory.ts +173 -0
  501. package/src/providers/inference/auth.ts +112 -0
  502. package/src/providers/inference/backfill.ts +196 -0
  503. package/src/providers/inference/connections.ts +356 -0
  504. package/src/providers/inference/resolve-auth.ts +65 -0
  505. package/src/providers/model-catalog.ts +104 -6
  506. package/src/providers/openai/responses-provider.ts +4 -2
  507. package/src/providers/provider-env-vars.ts +17 -7
  508. package/src/providers/provider-secret-catalog.ts +49 -30
  509. package/src/providers/provider-send-message.ts +41 -20
  510. package/src/providers/registry.ts +143 -159
  511. package/src/providers/retry.ts +18 -10
  512. package/src/providers/search-provider-catalog.ts +121 -0
  513. package/src/runtime/AGENTS.md +18 -5
  514. package/src/runtime/__tests__/background-job-runner.test.ts +357 -0
  515. package/src/runtime/__tests__/pre-first-message-gate.test.ts +82 -0
  516. package/src/runtime/actor-trust-resolver.ts +32 -10
  517. package/src/runtime/agent-wake.ts +35 -6
  518. package/src/runtime/assistant-event-hub.ts +3 -85
  519. package/src/runtime/auth/route-policy.ts +303 -8
  520. package/src/runtime/auth/same-actor.ts +2 -0
  521. package/src/runtime/background-job-runner.ts +339 -0
  522. package/src/runtime/btw-sidechain.ts +1 -0
  523. package/src/runtime/http-router.ts +36 -1
  524. package/src/runtime/http-server.ts +31 -5
  525. package/src/runtime/http-types.ts +2 -0
  526. package/src/runtime/middleware/__tests__/request-logger.test.ts +162 -0
  527. package/src/runtime/middleware/request-logger.ts +62 -1
  528. package/src/runtime/pre-first-message-gate.ts +83 -0
  529. package/src/runtime/routes/__tests__/backup-routes.test.ts +8 -1
  530. package/src/runtime/routes/__tests__/bookmark-routes.test.ts +251 -0
  531. package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +142 -0
  532. package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +315 -0
  533. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +189 -0
  534. package/src/runtime/routes/__tests__/home-feed-routes.test.ts +15 -136
  535. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +736 -0
  536. package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +4 -4
  537. package/src/runtime/routes/__tests__/stt-routes.test.ts +5 -1
  538. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +384 -0
  539. package/src/runtime/routes/__tests__/tts-routes.test.ts +6 -2
  540. package/src/runtime/routes/acp-routes.ts +10 -8
  541. package/src/runtime/routes/app-management-routes.ts +228 -3
  542. package/src/runtime/routes/approval-routes.ts +0 -18
  543. package/src/runtime/routes/audit-routes.ts +43 -0
  544. package/src/runtime/routes/auth-routes.ts +72 -0
  545. package/src/runtime/routes/avatar-routes.ts +273 -20
  546. package/src/runtime/routes/backup-routes.ts +406 -2
  547. package/src/runtime/routes/bookmark-routes.ts +154 -0
  548. package/src/runtime/routes/channel-verification-routes.ts +2 -1
  549. package/src/runtime/routes/contact-routes.ts +0 -160
  550. package/src/runtime/routes/conversation-cli-routes.ts +192 -0
  551. package/src/runtime/routes/conversation-management-routes.ts +30 -43
  552. package/src/runtime/routes/conversation-query-routes.ts +334 -86
  553. package/src/runtime/routes/conversation-routes.ts +31 -10
  554. package/src/runtime/routes/conversations-import-routes.ts +229 -0
  555. package/src/runtime/routes/credential-routes.ts +540 -0
  556. package/src/runtime/routes/debug-routes.ts +2 -2
  557. package/src/runtime/routes/document-pdf-renderer.ts +5 -1
  558. package/src/runtime/routes/domain-routes.ts +167 -0
  559. package/src/runtime/routes/email-routes.ts +603 -0
  560. package/src/runtime/routes/errors.ts +2 -2
  561. package/src/runtime/routes/events-routes.ts +192 -0
  562. package/src/runtime/routes/home-feed-routes.ts +6 -78
  563. package/src/runtime/routes/host-app-control-routes.ts +44 -2
  564. package/src/runtime/routes/host-browser-routes.ts +103 -22
  565. package/src/runtime/routes/http-adapter.ts +2 -0
  566. package/src/runtime/routes/identity-routes.ts +5 -0
  567. package/src/runtime/routes/image-generation-routes.ts +99 -0
  568. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +137 -1
  569. package/src/runtime/routes/inbound-stages/background-dispatch.ts +87 -7
  570. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +156 -0
  571. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +22 -4
  572. package/src/runtime/routes/index.ts +36 -0
  573. package/src/runtime/routes/inference-profile-session-handler.ts +312 -0
  574. package/src/runtime/routes/inference-profile-session-reaper.ts +98 -0
  575. package/src/runtime/routes/inference-profile-session-routes.ts +146 -0
  576. package/src/runtime/routes/inference-provider-connection-routes.ts +317 -0
  577. package/src/runtime/routes/inference-send-routes.ts +115 -0
  578. package/src/runtime/routes/integrations/twilio.ts +1 -0
  579. package/src/runtime/routes/mcp-auth-routes.ts +283 -9
  580. package/src/runtime/routes/memory-v2-routes.ts +13 -398
  581. package/src/runtime/routes/notification-routes.ts +2 -0
  582. package/src/runtime/routes/oauth-apps.ts +112 -7
  583. package/src/runtime/routes/oauth-commands-routes.ts +1007 -0
  584. package/src/runtime/routes/oauth-connect-routes.ts +67 -5
  585. package/src/runtime/routes/oauth-providers.ts +298 -8
  586. package/src/runtime/routes/platform-routes.ts +336 -0
  587. package/src/runtime/routes/playground/inject-failures.ts +2 -1
  588. package/src/runtime/routes/playground/reset-circuit.ts +2 -1
  589. package/src/runtime/routes/playground/state.ts +2 -1
  590. package/src/runtime/routes/publish-routes.ts +221 -0
  591. package/src/runtime/routes/schedule-routes.ts +82 -0
  592. package/src/runtime/routes/sequence-routes.ts +291 -0
  593. package/src/runtime/routes/settings-routes.ts +2 -10
  594. package/src/runtime/routes/skills-routes.ts +31 -1
  595. package/src/runtime/routes/stt-routes.ts +240 -3
  596. package/src/runtime/routes/surface-action-routes.ts +43 -7
  597. package/src/runtime/routes/tts-routes.ts +67 -0
  598. package/src/runtime/routes/types.ts +32 -0
  599. package/src/runtime/routes/user-routes-cli.ts +243 -0
  600. package/src/runtime/routes/webhook-routes.ts +165 -0
  601. package/src/runtime/sync/resource-sync-events.ts +25 -0
  602. package/src/runtime/sync/sync-publisher.test.ts +105 -0
  603. package/src/runtime/sync/sync-publisher.ts +21 -0
  604. package/src/schedule/scheduler.ts +200 -123
  605. package/src/security/__tests__/provider-key-env-fallback.test.ts +12 -6
  606. package/src/security/secret-patterns.ts +3 -0
  607. package/src/sequence/engine.ts +38 -40
  608. package/src/subagent/manager.ts +20 -15
  609. package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +206 -0
  610. package/src/tools/browser/browser-execution.ts +15 -4
  611. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +174 -0
  612. package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +16 -13
  613. package/src/tools/browser/cdp-client/extension-cdp-client.ts +24 -1
  614. package/src/tools/browser/cdp-client/factory.ts +66 -5
  615. package/src/tools/browser/runtime-check.ts +77 -0
  616. package/src/tools/memory/register.test.ts +3 -3
  617. package/src/tools/memory/register.ts +9 -1
  618. package/src/tools/network/__tests__/web-search.test.ts +156 -0
  619. package/src/tools/network/web-search.ts +280 -37
  620. package/src/tools/permission-checker.ts +13 -5
  621. package/src/tools/subagent/spawn.ts +3 -3
  622. package/src/tools/terminal/shell.ts +44 -0
  623. package/src/usage/attribution.ts +3 -2
  624. package/src/util/pricing.ts +86 -160
  625. package/src/watcher/__tests__/engine.test.ts +301 -0
  626. package/src/watcher/constants.ts +7 -0
  627. package/src/watcher/engine.ts +90 -90
  628. package/src/workspace/migrations/046-seed-conversation-starters-callsite.ts +6 -9
  629. package/src/workspace/migrations/054-seed-recall-callsite.ts +10 -1
  630. package/src/workspace/migrations/057-repair-stale-gemini-model-ids.ts +28 -4
  631. package/src/workspace/migrations/069-seed-onboarding-threads.ts +8 -2
  632. package/src/workspace/migrations/072-seed-reply-suggestion-callsite.ts +104 -0
  633. package/src/workspace/migrations/073-repair-recall-callsite-empty-profile.ts +93 -0
  634. package/src/workspace/migrations/074-drop-deprecated-secret-detection-keys.ts +117 -0
  635. package/src/workspace/migrations/075-memory-v2-bm25-b-default-reembed.ts +61 -0
  636. package/src/workspace/migrations/076-drop-services-inference-mode.ts +62 -0
  637. package/src/workspace/migrations/077-seed-memory-router-callsite.ts +89 -0
  638. package/src/workspace/migrations/078-release-notes-tavily-web-search.ts +66 -0
  639. package/src/workspace/migrations/079-home-feed-notification-only.ts +197 -0
  640. package/src/workspace/migrations/080-restrict-vercel-api-token-metadata.ts +182 -0
  641. package/src/workspace/migrations/081-backfill-bash-allowed-tools-for-injection-credentials.ts +160 -0
  642. package/src/workspace/migrations/082-backfill-managed-profile-labels.ts +154 -0
  643. package/src/workspace/migrations/registry.ts +22 -0
  644. package/src/workspace/migrations/runner.ts +13 -2
  645. package/src/workspace/migrations/types.ts +13 -3
  646. package/src/workspace/provider-commit-message-generator.ts +3 -2
  647. package/src/__tests__/context-search-pkb-source.test.ts +0 -498
  648. package/src/__tests__/credentials-cli.test.ts +0 -1225
  649. package/src/__tests__/memory-admin-recall.test.ts +0 -213
  650. package/src/approvals/__tests__/guardian-feed-event.test.ts +0 -303
  651. package/src/cli/commands/__tests__/email-download.test.ts +0 -260
  652. package/src/cli/commands/__tests__/email-list.test.ts +0 -216
  653. package/src/cli/commands/__tests__/email-register.test.ts +0 -186
  654. package/src/cli/commands/__tests__/email-send.test.ts +0 -416
  655. package/src/cli/commands/__tests__/email-status.test.ts +0 -185
  656. package/src/cli/commands/__tests__/email-unregister.test.ts +0 -168
  657. package/src/cli/commands/__tests__/routes.test.ts +0 -562
  658. package/src/cli/commands/__tests__/stt-transcribe.test.ts +0 -454
  659. package/src/cli/commands/autonomy.ts +0 -365
  660. package/src/cli/commands/memory.ts +0 -424
  661. package/src/cli/commands/oauth/__tests__/connect.test.ts +0 -947
  662. package/src/cli/commands/oauth/__tests__/disconnect.test.ts +0 -686
  663. package/src/cli/commands/oauth/__tests__/mode.test.ts +0 -632
  664. package/src/cli/commands/oauth/__tests__/ping.test.ts +0 -631
  665. package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +0 -573
  666. package/src/cli/commands/oauth/__tests__/providers-register.test.ts +0 -330
  667. package/src/cli/commands/oauth/__tests__/providers-update.test.ts +0 -521
  668. package/src/cli/commands/oauth/__tests__/status.test.ts +0 -551
  669. package/src/cli/commands/oauth/__tests__/token.test.ts +0 -420
  670. package/src/cli/lib/daemon-avatar-client.ts +0 -37
  671. package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +0 -87
  672. package/src/config/bundled-skills/messaging/tools/__tests__/messaging-feed-events.test.ts +0 -207
  673. package/src/daemon/__tests__/conversation-feed-event.test.ts +0 -304
  674. package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +0 -233
  675. package/src/home/__tests__/assistant-feed-authoring.test.ts +0 -156
  676. package/src/home/__tests__/emit-feed-event.test.ts +0 -169
  677. package/src/home/__tests__/feed-population-integration.test.ts +0 -312
  678. package/src/home/__tests__/feed-scheduler.test.ts +0 -222
  679. package/src/home/__tests__/phase5-exit-criteria.test.ts +0 -229
  680. package/src/home/__tests__/platform-gmail-digest.test.ts +0 -222
  681. package/src/home/__tests__/rollup-producer.test.ts +0 -507
  682. package/src/home/assistant-feed-authoring.ts +0 -135
  683. package/src/home/emit-feed-event.ts +0 -169
  684. package/src/home/feed-scheduler.ts +0 -281
  685. package/src/home/platform-gmail-digest.ts +0 -163
  686. package/src/home/rewrite-command-preview.ts +0 -66
  687. package/src/home/rewrite-feed-title.ts +0 -58
  688. package/src/home/rollup-producer.ts +0 -426
  689. package/src/memory/admin.ts +0 -326
  690. package/src/memory/context-search/sources/pkb.ts +0 -476
  691. package/src/memory/graph/compaction.ts +0 -299
  692. /package/src/cli/{commands → lib}/cache-fs.ts +0 -0
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Workspace migration `080-restrict-vercel-api-token-metadata`.
3
+ *
4
+ * Repairs legacy Vercel API token credential metadata that was stored
5
+ * with overly permissive policy (e.g. `bash` in allowedTools and
6
+ * injection templates targeting `api.vercel.com`). Rewrites the
7
+ * Vercel record to the hardened policy:
8
+ *
9
+ * - `allowedTools: ["publish_page", "unpublish_page"]`
10
+ * - `allowedDomains: []`
11
+ * - `injectionTemplates` removed
12
+ *
13
+ * Behaviour:
14
+ * - Missing metadata file -> no-op.
15
+ * - Malformed JSON -> log and no-op.
16
+ * - Unrecognized future schema version -> no-op.
17
+ * - No `vercel`/`api_token` credential record -> no-op.
18
+ * - Already matches target policy -> no-op (no rewrite, no updatedAt bump).
19
+ * - Non-Vercel credential records are never modified.
20
+ *
21
+ * Idempotent: running twice produces no second write. The runner's
22
+ * checkpoint also prevents re-runs, but this in-file guard keeps the
23
+ * migration safe even if the checkpoint is wiped.
24
+ *
25
+ * This migration never touches secure secret values — only the
26
+ * metadata policy fields.
27
+ */
28
+
29
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
30
+ import { join } from "node:path";
31
+
32
+ import { getLogger } from "../../util/logger.js";
33
+ import type { WorkspaceMigration } from "./types.js";
34
+
35
+ const log = getLogger(
36
+ "workspace-migration-080-restrict-vercel-api-token-metadata",
37
+ );
38
+
39
+ const METADATA_RELATIVE_PATH = join("data", "credentials", "metadata.json");
40
+
41
+ /** Known on-disk schema versions we can safely handle. */
42
+ const KNOWN_VERSIONS = new Set([1, 2, 3, 4, 5]);
43
+
44
+ /** The hardened target policy for the Vercel API token. */
45
+ const TARGET_ALLOWED_TOOLS = ["publish_page", "unpublish_page"];
46
+ const TARGET_ALLOWED_DOMAINS: string[] = [];
47
+
48
+ export const restrictVercelApiTokenMetadataMigration: WorkspaceMigration = {
49
+ id: "080-restrict-vercel-api-token-metadata",
50
+ description:
51
+ "Restrict existing Vercel API token metadata to publish tools only",
52
+
53
+ run(workspaceDir: string): void {
54
+ const metadataPath = join(workspaceDir, METADATA_RELATIVE_PATH);
55
+ if (!existsSync(metadataPath)) {
56
+ return;
57
+ }
58
+
59
+ let raw: string;
60
+ try {
61
+ raw = readFileSync(metadataPath, "utf-8");
62
+ } catch (err) {
63
+ log.warn(
64
+ { err, path: metadataPath },
65
+ "Failed to read credentials metadata; skipping migration",
66
+ );
67
+ return;
68
+ }
69
+
70
+ let parsed: unknown;
71
+ try {
72
+ parsed = JSON.parse(raw);
73
+ } catch (err) {
74
+ log.warn(
75
+ { err, path: metadataPath },
76
+ "Failed to parse credentials metadata JSON; skipping migration",
77
+ );
78
+ return;
79
+ }
80
+
81
+ if (!isPlainObject(parsed)) {
82
+ log.warn(
83
+ { path: metadataPath },
84
+ "Credentials metadata is not an object; skipping migration",
85
+ );
86
+ return;
87
+ }
88
+
89
+ // Respect unrecognized future schema versions — do not touch the file.
90
+ const version = typeof parsed.version === "number" ? parsed.version : 1;
91
+ if (!KNOWN_VERSIONS.has(version)) {
92
+ log.info(
93
+ { version, path: metadataPath },
94
+ "Credentials metadata has unrecognized version; skipping migration",
95
+ );
96
+ return;
97
+ }
98
+
99
+ const credentials = Array.isArray(parsed.credentials)
100
+ ? parsed.credentials
101
+ : [];
102
+
103
+ // Find the Vercel API token record.
104
+ const vercelIdx = credentials.findIndex(
105
+ (c: unknown) =>
106
+ isPlainObject(c) && c.service === "vercel" && c.field === "api_token",
107
+ );
108
+
109
+ if (vercelIdx === -1) {
110
+ // No Vercel credential — nothing to repair.
111
+ return;
112
+ }
113
+
114
+ const vercelRecord = credentials[vercelIdx] as Record<string, unknown>;
115
+
116
+ // Check if already matches target policy.
117
+ if (alreadyMatchesTarget(vercelRecord)) {
118
+ return;
119
+ }
120
+
121
+ // Rewrite the Vercel record to the target policy.
122
+ vercelRecord.allowedTools = TARGET_ALLOWED_TOOLS;
123
+ vercelRecord.allowedDomains = TARGET_ALLOWED_DOMAINS;
124
+ delete vercelRecord.injectionTemplates;
125
+ vercelRecord.updatedAt = Date.now();
126
+
127
+ try {
128
+ writeFileSync(metadataPath, JSON.stringify(parsed, null, 2), "utf-8");
129
+ log.info(
130
+ { path: metadataPath },
131
+ "Repaired Vercel API token metadata to hardened policy",
132
+ );
133
+ } catch (err) {
134
+ log.warn(
135
+ { err, path: metadataPath },
136
+ "Failed to write repaired credentials metadata; leaving prior file in place",
137
+ );
138
+ }
139
+ },
140
+
141
+ down(_workspaceDir: string): void {
142
+ // Cannot recover the original vulnerable policy — and we would not
143
+ // want to even if we could. This is a security hardening migration.
144
+ },
145
+ };
146
+
147
+ /**
148
+ * Returns true when the Vercel record already matches the target
149
+ * hardened policy, meaning no rewrite is necessary.
150
+ */
151
+ function alreadyMatchesTarget(record: Record<string, unknown>): boolean {
152
+ const tools = record.allowedTools;
153
+ const domains = record.allowedDomains;
154
+
155
+ if (!Array.isArray(tools) || tools.length !== TARGET_ALLOWED_TOOLS.length) {
156
+ return false;
157
+ }
158
+ const sortedTools = [...tools].sort();
159
+ const sortedTarget = [...TARGET_ALLOWED_TOOLS].sort();
160
+ for (let i = 0; i < sortedTools.length; i++) {
161
+ if (sortedTools[i] !== sortedTarget[i]) return false;
162
+ }
163
+
164
+ if (!Array.isArray(domains) || domains.length !== 0) {
165
+ return false;
166
+ }
167
+
168
+ // injectionTemplates must be absent or undefined.
169
+ if (
170
+ "injectionTemplates" in record &&
171
+ record.injectionTemplates !== undefined &&
172
+ record.injectionTemplates !== null
173
+ ) {
174
+ return false;
175
+ }
176
+
177
+ return true;
178
+ }
179
+
180
+ function isPlainObject(value: unknown): value is Record<string, unknown> {
181
+ return typeof value === "object" && value !== null && !Array.isArray(value);
182
+ }
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Workspace migration `081-backfill-bash-allowed-tools-for-injection-credentials`.
3
+ *
4
+ * After migration 080 stripped Vercel's injection templates and locked
5
+ * its `allowedTools` to `["publish_page", "unpublish_page"]`, the new
6
+ * shell.ts credential policy enforcement (`isToolAllowed("bash", meta.allowedTools)`)
7
+ * would reject every other service that legitimately uses proxied bash
8
+ * via injection templates — because their `allowedTools` was never populated.
9
+ *
10
+ * This migration backfills `"bash"` into `allowedTools` for any credential
11
+ * that:
12
+ * 1. Has a non-empty `injectionTemplates` array (i.e., it uses proxied bash).
13
+ * 2. Has empty or missing `allowedTools`.
14
+ *
15
+ * Credentials that already have populated `allowedTools` (like the
16
+ * now-hardened Vercel credential) are NOT touched.
17
+ *
18
+ * Behaviour:
19
+ * - Missing metadata file -> no-op.
20
+ * - Malformed JSON -> log and no-op.
21
+ * - Unrecognized future schema version -> no-op.
22
+ * - No qualifying credentials -> no-op (no rewrite).
23
+ * - Already backfilled -> no-op (idempotent).
24
+ *
25
+ * Idempotent: running twice produces no second write.
26
+ */
27
+
28
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
29
+ import { join } from "node:path";
30
+
31
+ import { getLogger } from "../../util/logger.js";
32
+ import type { WorkspaceMigration } from "./types.js";
33
+
34
+ const log = getLogger(
35
+ "workspace-migration-081-backfill-bash-allowed-tools-for-injection-credentials",
36
+ );
37
+
38
+ const METADATA_RELATIVE_PATH = join("data", "credentials", "metadata.json");
39
+
40
+ /** Known on-disk schema versions we can safely handle. */
41
+ const KNOWN_VERSIONS = new Set([1, 2, 3, 4, 5]);
42
+
43
+ export const backfillBashAllowedToolsForInjectionCredentialsMigration: WorkspaceMigration =
44
+ {
45
+ id: "081-backfill-bash-allowed-tools-for-injection-credentials",
46
+ description:
47
+ "Backfill bash into allowedTools for credentials with injection templates",
48
+
49
+ run(workspaceDir: string): void {
50
+ const metadataPath = join(workspaceDir, METADATA_RELATIVE_PATH);
51
+ if (!existsSync(metadataPath)) {
52
+ return;
53
+ }
54
+
55
+ let raw: string;
56
+ try {
57
+ raw = readFileSync(metadataPath, "utf-8");
58
+ } catch (err) {
59
+ log.warn(
60
+ { err, path: metadataPath },
61
+ "Failed to read credentials metadata; skipping migration",
62
+ );
63
+ return;
64
+ }
65
+
66
+ let parsed: unknown;
67
+ try {
68
+ parsed = JSON.parse(raw);
69
+ } catch (err) {
70
+ log.warn(
71
+ { err, path: metadataPath },
72
+ "Failed to parse credentials metadata JSON; skipping migration",
73
+ );
74
+ return;
75
+ }
76
+
77
+ if (!isPlainObject(parsed)) {
78
+ log.warn(
79
+ { path: metadataPath },
80
+ "Credentials metadata is not an object; skipping migration",
81
+ );
82
+ return;
83
+ }
84
+
85
+ // Respect unrecognized future schema versions — do not touch the file.
86
+ const version = typeof parsed.version === "number" ? parsed.version : 1;
87
+ if (!KNOWN_VERSIONS.has(version)) {
88
+ log.info(
89
+ { version, path: metadataPath },
90
+ "Credentials metadata has unrecognized version; skipping migration",
91
+ );
92
+ return;
93
+ }
94
+
95
+ const credentials = Array.isArray(parsed.credentials)
96
+ ? parsed.credentials
97
+ : [];
98
+
99
+ let modified = false;
100
+
101
+ for (const cred of credentials) {
102
+ if (!isPlainObject(cred)) continue;
103
+
104
+ // Only target credentials with non-empty injectionTemplates.
105
+ if (!hasNonEmptyInjectionTemplates(cred)) continue;
106
+
107
+ // Only target credentials with empty or missing allowedTools.
108
+ if (hasPopulatedAllowedTools(cred)) continue;
109
+
110
+ // Backfill "bash" into allowedTools.
111
+ cred.allowedTools = ["bash"];
112
+ cred.updatedAt = Date.now();
113
+ modified = true;
114
+ }
115
+
116
+ if (!modified) {
117
+ return;
118
+ }
119
+
120
+ try {
121
+ writeFileSync(metadataPath, JSON.stringify(parsed, null, 2), "utf-8");
122
+ log.info(
123
+ { path: metadataPath },
124
+ "Backfilled bash into allowedTools for credentials with injection templates",
125
+ );
126
+ } catch (err) {
127
+ log.warn(
128
+ { err, path: metadataPath },
129
+ "Failed to write backfilled credentials metadata; leaving prior file in place",
130
+ );
131
+ }
132
+ },
133
+
134
+ down(_workspaceDir: string): void {
135
+ // This is a forward-only data repair. Rolling back would re-break
136
+ // proxied bash for affected services.
137
+ },
138
+ };
139
+
140
+ /**
141
+ * Returns true when the credential has a non-empty `injectionTemplates` array.
142
+ */
143
+ function hasNonEmptyInjectionTemplates(
144
+ record: Record<string, unknown>,
145
+ ): boolean {
146
+ const templates = record.injectionTemplates;
147
+ return Array.isArray(templates) && templates.length > 0;
148
+ }
149
+
150
+ /**
151
+ * Returns true when the credential has a populated (non-empty) `allowedTools` array.
152
+ */
153
+ function hasPopulatedAllowedTools(record: Record<string, unknown>): boolean {
154
+ const tools = record.allowedTools;
155
+ return Array.isArray(tools) && tools.length > 0;
156
+ }
157
+
158
+ function isPlainObject(value: unknown): value is Record<string, unknown> {
159
+ return typeof value === "object" && value !== null && !Array.isArray(value);
160
+ }
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Workspace migration `082-backfill-managed-profile-labels`.
3
+ *
4
+ * Backfills `label` on the three canonical managed inference profiles
5
+ * (`balanced`, `quality-optimized`, `cost-optimized`) when the on-disk
6
+ * profile is missing it.
7
+ *
8
+ * Why this is needed
9
+ * ------------------
10
+ * Migration 052 (`seed-default-inference-profiles`) seeds the three
11
+ * canonical Anthropic profiles with provider/model/maxTokens/effort/
12
+ * thinking but **no `label`** field. The runtime profile seeder
13
+ * (`seedInferenceProfiles`) materializes labels on its second pass —
14
+ * but only when the profile didn't already exist. In platform mode
15
+ * (`IS_PLATFORM=true`) it deliberately defers to the existing on-disk
16
+ * entry to avoid clobbering platform-supplied overlay fragments, so the
17
+ * label never gets written.
18
+ *
19
+ * Net result: a fresh Cloud-hosted assistant (Marina QA #5, 0.8.1) shows
20
+ * raw slugs in the profile picker — `balanced`, `quality-optimized`,
21
+ * `cost-optimized` — instead of the human labels `Balanced`, `Quality`,
22
+ * `Speed`. This migration heals existing installs by writing the bare
23
+ * template label when absent.
24
+ *
25
+ * Behavior
26
+ * --------
27
+ * - Missing config.json -> no-op.
28
+ * - Malformed JSON -> log and no-op.
29
+ * - `llm.profiles` absent -> no-op.
30
+ * - For each canonical name: backfill `label` only when the key is
31
+ * absent on disk. An explicit `null` (user cleared the label) is
32
+ * preserved. A user-set string is preserved.
33
+ * - Non-canonical profile names are never touched.
34
+ *
35
+ * Idempotent: running twice produces no second write.
36
+ *
37
+ * Does NOT skip on `VELLUM_DEFAULT_WORKSPACE_CONFIG_PATH`: the platform
38
+ * overlay supplies its own label when it cares, and the runtime seeder's
39
+ * `preservedProfileNames` skip path will defer to that overlay-supplied
40
+ * label on every boot. This migration only fills the gap when no source
41
+ * (overlay, migration 052, or seeder) ever wrote a label.
42
+ */
43
+
44
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
45
+ import { join } from "node:path";
46
+
47
+ import { getLogger } from "../../util/logger.js";
48
+ import type { WorkspaceMigration } from "./types.js";
49
+
50
+ const log = getLogger("workspace-migration-082-backfill-managed-profile-labels");
51
+
52
+ /**
53
+ * Bare template labels for the canonical managed profile triplet. Kept in
54
+ * sync with `MANAGED_PROFILE_TEMPLATES` in
55
+ * `assistant/src/config/seed-inference-profiles.ts`. Duplicated here
56
+ * intentionally — migrations are forward-only and self-contained per the
57
+ * workspace migrations AGENTS contract; future renames in the seeder
58
+ * must NOT retroactively change the data this migration writes.
59
+ */
60
+ const CANONICAL_MANAGED_PROFILE_LABELS: Record<string, string> = {
61
+ balanced: "Balanced",
62
+ "quality-optimized": "Quality",
63
+ "cost-optimized": "Speed",
64
+ };
65
+
66
+ export const backfillManagedProfileLabelsMigration: WorkspaceMigration = {
67
+ id: "082-backfill-managed-profile-labels",
68
+ description:
69
+ "Backfill label on canonical managed inference profiles when absent",
70
+
71
+ run(workspaceDir: string): void {
72
+ const configPath = join(workspaceDir, "config.json");
73
+ if (!existsSync(configPath)) {
74
+ return;
75
+ }
76
+
77
+ let raw: string;
78
+ try {
79
+ raw = readFileSync(configPath, "utf-8");
80
+ } catch (err) {
81
+ log.warn(
82
+ { err, path: configPath },
83
+ "Failed to read config.json; skipping migration",
84
+ );
85
+ return;
86
+ }
87
+
88
+ let parsed: unknown;
89
+ try {
90
+ parsed = JSON.parse(raw);
91
+ } catch (err) {
92
+ log.warn(
93
+ { err, path: configPath },
94
+ "Failed to parse config.json; skipping migration",
95
+ );
96
+ return;
97
+ }
98
+
99
+ if (!isPlainObject(parsed)) {
100
+ return;
101
+ }
102
+
103
+ const llm = readObject(parsed.llm);
104
+ if (!llm) return;
105
+
106
+ const profiles = readObject(llm.profiles);
107
+ if (!profiles) return;
108
+
109
+ let modified = false;
110
+
111
+ for (const [name, label] of Object.entries(
112
+ CANONICAL_MANAGED_PROFILE_LABELS,
113
+ )) {
114
+ const profile = readObject(profiles[name]);
115
+ if (!profile) continue;
116
+ // Only backfill when the key is absent. Explicit `null` (user cleared
117
+ // the label) and any user-set string both signal intent and survive.
118
+ if ("label" in profile) continue;
119
+ profile.label = label;
120
+ modified = true;
121
+ }
122
+
123
+ if (!modified) return;
124
+
125
+ try {
126
+ writeFileSync(configPath, JSON.stringify(parsed, null, 2) + "\n", "utf-8");
127
+ log.info(
128
+ { path: configPath },
129
+ "Backfilled missing labels on canonical managed inference profiles",
130
+ );
131
+ } catch (err) {
132
+ log.warn(
133
+ { err, path: configPath },
134
+ "Failed to write backfilled config.json; leaving prior file in place",
135
+ );
136
+ }
137
+ },
138
+
139
+ down(_workspaceDir: string): void {
140
+ // Forward-only data repair. Rolling back would re-break the picker
141
+ // for installs whose only label source was this migration.
142
+ },
143
+ };
144
+
145
+ function readObject(value: unknown): Record<string, unknown> | null {
146
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
147
+ return null;
148
+ }
149
+ return value as Record<string, unknown>;
150
+ }
151
+
152
+ function isPlainObject(value: unknown): value is Record<string, unknown> {
153
+ return typeof value === "object" && value !== null && !Array.isArray(value);
154
+ }
@@ -69,6 +69,17 @@ import { releaseNotesLocalTimezoneMigration } from "./068-release-notes-local-ti
69
69
  import { seedOnboardingThreadsMigration } from "./069-seed-onboarding-threads.js";
70
70
  import { memoryV2SummarySchemaRebuildMigration } from "./070-memory-v2-summary-schema-rebuild.js";
71
71
  import { removeSafeStorageReleaseNoteMigration } from "./071-remove-safe-storage-release-note.js";
72
+ import { seedReplySuggestionCallsiteMigration } from "./072-seed-reply-suggestion-callsite.js";
73
+ import { repairRecallCallsiteEmptyProfileMigration } from "./073-repair-recall-callsite-empty-profile.js";
74
+ import { dropDeprecatedSecretDetectionKeysMigration } from "./074-drop-deprecated-secret-detection-keys.js";
75
+ import { memoryV2Bm25BDefaultReembedMigration } from "./075-memory-v2-bm25-b-default-reembed.js";
76
+ import { dropServicesInferenceModeMigration } from "./076-drop-services-inference-mode.js";
77
+ import { seedMemoryRouterCallsiteMigration } from "./077-seed-memory-router-callsite.js";
78
+ import { releaseNotesTavilyWebSearchMigration } from "./078-release-notes-tavily-web-search.js";
79
+ import { homeFeedNotificationOnlyMigration } from "./079-home-feed-notification-only.js";
80
+ import { restrictVercelApiTokenMetadataMigration } from "./080-restrict-vercel-api-token-metadata.js";
81
+ import { backfillBashAllowedToolsForInjectionCredentialsMigration } from "./081-backfill-bash-allowed-tools-for-injection-credentials.js";
82
+ import { backfillManagedProfileLabelsMigration } from "./082-backfill-managed-profile-labels.js";
72
83
  import { migrateToWorkspaceVolumeMigration } from "./migrate-to-workspace-volume.js";
73
84
  import type { WorkspaceMigration } from "./types.js";
74
85
 
@@ -149,4 +160,15 @@ export const WORKSPACE_MIGRATIONS: WorkspaceMigration[] = [
149
160
  seedOnboardingThreadsMigration,
150
161
  memoryV2SummarySchemaRebuildMigration,
151
162
  removeSafeStorageReleaseNoteMigration,
163
+ seedReplySuggestionCallsiteMigration,
164
+ repairRecallCallsiteEmptyProfileMigration,
165
+ dropDeprecatedSecretDetectionKeysMigration,
166
+ memoryV2Bm25BDefaultReembedMigration,
167
+ dropServicesInferenceModeMigration,
168
+ seedMemoryRouterCallsiteMigration,
169
+ releaseNotesTavilyWebSearchMigration,
170
+ homeFeedNotificationOnlyMigration,
171
+ restrictVercelApiTokenMetadataMigration,
172
+ backfillBashAllowedToolsForInjectionCredentialsMigration,
173
+ backfillManagedProfileLabelsMigration,
152
174
  ];
@@ -3,7 +3,11 @@ import { dirname, join } from "node:path";
3
3
 
4
4
  import { ensureDir, readTextFileSync } from "../../util/fs.js";
5
5
  import { getLogger } from "../../util/logger.js";
6
- import type { WorkspaceMigration, WorkspaceMigrationStatus } from "./types.js";
6
+ import type {
7
+ MigrationRunContext,
8
+ WorkspaceMigration,
9
+ WorkspaceMigrationStatus,
10
+ } from "./types.js";
7
11
 
8
12
  const log = getLogger("workspace-migrations");
9
13
 
@@ -76,6 +80,13 @@ export async function runWorkspaceMigrations(
76
80
  seen.add(m.id);
77
81
  }
78
82
 
83
+ // Detect a brand-new workspace: no checkpoint file existed before this run.
84
+ // Captured before loadCheckpoints so seeding migrations can distinguish a
85
+ // first-ever boot from an upgrade where the user may have cleared seeded files.
86
+ const ctx: MigrationRunContext = {
87
+ isNewWorkspace: readTextFileSync(getCheckpointPath(workspaceDir)) == null,
88
+ };
89
+
79
90
  const checkpoints = loadCheckpoints(workspaceDir);
80
91
 
81
92
  for (const [id, entry] of Object.entries(checkpoints.applied)) {
@@ -104,7 +115,7 @@ export async function runWorkspaceMigrations(
104
115
  saveCheckpoints(workspaceDir, checkpoints);
105
116
 
106
117
  try {
107
- await migration.run(workspaceDir);
118
+ await migration.run(workspaceDir, ctx);
108
119
  } catch (error) {
109
120
  log.error(
110
121
  { migrationId: migration.id, error },
@@ -1,13 +1,23 @@
1
+ /** Runtime context passed to each migration's `run()`.
2
+ * Lets seeding migrations distinguish a brand-new workspace from a workspace
3
+ * upgrading through this migration for the first time. */
4
+ export interface MigrationRunContext {
5
+ /** True when no workspace-migration checkpoint file existed at the start of
6
+ * this run — i.e., this is a freshly-created workspace, not an upgrade. */
7
+ isNewWorkspace: boolean;
8
+ }
9
+
1
10
  export interface WorkspaceMigration {
2
11
  /** Unique identifier, e.g. "001-avatar-rename". Used as the checkpoint key.
3
12
  * Must be unique across all registered migrations — the runner validates this at startup. */
4
13
  id: string;
5
14
  /** Human-readable description for logging. */
6
15
  description: string;
7
- /** The migration function. Receives the workspace directory path.
8
- * Must be idempotent safe to re-run if it was interrupted.
16
+ /** The migration function. Receives the workspace directory path and an
17
+ * optional context object (always supplied by the runner; tests may omit
18
+ * it). Must be idempotent — safe to re-run if it was interrupted.
9
19
  * Both synchronous and asynchronous migrations are supported. */
10
- run(workspaceDir: string): void | Promise<void>;
20
+ run(workspaceDir: string, ctx?: MigrationRunContext): void | Promise<void>;
11
21
  /** Reverse the migration. Receives the workspace directory path.
12
22
  * Must be idempotent — safe to re-run if it was interrupted.
13
23
  * Both synchronous and asynchronous rollbacks are supported. */
@@ -1,3 +1,4 @@
1
+ import { resolveCallSiteConfig } from "../config/llm-resolver.js";
1
2
  import { getConfig } from "../config/loader.js";
2
3
  import { resolveConfiguredProvider } from "../providers/provider-send-message.js";
3
4
  import type { Message } from "../providers/types.js";
@@ -45,7 +46,7 @@ const KEYLESS_PROVIDERS = new Set(["ollama"]);
45
46
  const deterministicProvider = new DefaultCommitMessageProvider();
46
47
 
47
48
  function getProviderCandidates(config: ReturnType<typeof getConfig>): string[] {
48
- return [config.llm.default.provider];
49
+ return [resolveCallSiteConfig("commitMessage", config.llm).provider];
49
50
  }
50
51
 
51
52
  function buildDeterministicResult(
@@ -146,7 +147,7 @@ class ProviderCommitMessageGenerator {
146
147
  return buildDeterministicResult(context, "missing_provider_api_key");
147
148
  }
148
149
  log.debug(
149
- { provider: config.llm.default.provider },
150
+ { provider: resolveCallSiteConfig("commitMessage", config.llm).provider },
150
151
  "Provider not initialized; falling back to deterministic",
151
152
  );
152
153
  return buildDeterministicResult(context, "provider_not_initialized");