@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
@@ -4,7 +4,6 @@
4
4
  * context inspection, and queued message deletion.
5
5
  *
6
6
  * GET /v1/model — current model info
7
- * PUT /v1/model — set model
8
7
  * PUT /v1/model/image-gen — set image-gen model
9
8
  * GET /v1/config/embeddings — current embedding config
10
9
  * PUT /v1/config/embeddings — set embedding provider/model
@@ -28,10 +27,12 @@ import {
28
27
  invalidateConfigCache,
29
28
  loadRawConfig,
30
29
  saveRawConfig,
30
+ setNestedValue,
31
31
  } from "../../config/loader.js";
32
+ import { AssistantConfigSchema } from "../../config/schema.js";
33
+ import { getSchemaAtPath } from "../../config/schema-utils.js";
32
34
  import { ProfileEntry } from "../../config/schemas/llm.js";
33
35
  import { VALID_MEMORY_EMBEDDING_PROVIDERS } from "../../config/schemas/memory-storage.js";
34
- import { VALID_INFERENCE_PROVIDERS } from "../../config/schemas/services.js";
35
36
  import { getConfigWatcher } from "../../daemon/config-watcher.js";
36
37
  import {
37
38
  getEmbeddingConfigInfo,
@@ -41,7 +42,6 @@ import {
41
42
  getModelInfo,
42
43
  type ModelSetContext,
43
44
  setImageGenModel,
44
- setModel,
45
45
  } from "../../daemon/handlers/config-model.js";
46
46
  import {
47
47
  getMessageContent,
@@ -58,14 +58,12 @@ import {
58
58
  getMessageById,
59
59
  } from "../../memory/conversation-crud.js";
60
60
  import { clearEmbeddingBackendCache } from "../../memory/embedding-backend.js";
61
- import {
62
- getRequestLogById,
63
- getRequestLogsByMessageId,
64
- } from "../../memory/llm-request-log-store.js";
61
+ import { getLlmRequestLogSource } from "../../memory/llm-request-log-source.js";
65
62
  import { getMemoryRecallLogByMessageIds } from "../../memory/memory-recall-log-store.js";
66
63
  import { getMemoryV2ActivationLogByMessageIds } from "../../memory/memory-v2-activation-log-store.js";
67
64
  import { MEMORY_V2_CONSOLIDATION_SOURCE } from "../../memory/v2/constants.js";
68
65
  import { initializeProviders } from "../../providers/registry.js";
66
+ import { validateAllowlistFile } from "../../security/secret-allowlist.js";
69
67
  import { resolvePricingForUsage } from "../../util/pricing.js";
70
68
  import { BadRequestError, InternalError, NotFoundError } from "./errors.js";
71
69
  import {
@@ -74,7 +72,6 @@ import {
74
72
  } from "./llm-context-normalization.js";
75
73
  import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
76
74
 
77
- const validProviderSet = new Set<string>(VALID_INFERENCE_PROVIDERS);
78
75
  const validEmbeddingProviderSet = new Set<string>(
79
76
  VALID_MEMORY_EMBEDDING_PROVIDERS,
80
77
  );
@@ -95,8 +92,15 @@ type LlmContextRouteResult = Omit<LlmContextNormalizationResult, "summary"> & {
95
92
 
96
93
  import { MANAGED_PROFILE_NAMES } from "../../config/seed-inference-profiles.js";
97
94
 
95
+ const RESERVED_PROFILE_NAMES = new Set([
96
+ "__proto__",
97
+ "constructor",
98
+ "prototype",
99
+ ]);
100
+
98
101
  const INFERENCE_PROFILE_UI_KEYS = new Set([
99
102
  "provider",
103
+ "provider_connection",
100
104
  "model",
101
105
  "maxTokens",
102
106
  "effort",
@@ -239,33 +243,6 @@ async function handleGetModel() {
239
243
  return getModelInfo();
240
244
  }
241
245
 
242
- async function handleSetModel({ body }: RouteHandlerArgs) {
243
- if (!body || typeof body !== "object") {
244
- throw new BadRequestError("Request body is required");
245
- }
246
- const { modelId, provider } = body as {
247
- modelId?: string;
248
- provider?: string;
249
- };
250
- if (!modelId || typeof modelId !== "string") {
251
- throw new BadRequestError("Missing required field: modelId");
252
- }
253
- if (
254
- provider !== undefined &&
255
- (typeof provider !== "string" || !validProviderSet.has(provider))
256
- ) {
257
- throw new BadRequestError(
258
- `Invalid provider "${provider}". Valid providers: ${[...validProviderSet].join(", ")}`,
259
- );
260
- }
261
- try {
262
- return await setModel(modelId, getModelSetContext(), provider);
263
- } catch (err) {
264
- const message = err instanceof Error ? err.message : String(err);
265
- throw new InternalError(`Failed to set model: ${message}`);
266
- }
267
- }
268
-
269
246
  async function handleSetImageGenModel({ body }: RouteHandlerArgs) {
270
247
  if (!body || typeof body !== "object") {
271
248
  throw new BadRequestError("Request body is required");
@@ -320,11 +297,11 @@ async function handleSetEmbeddingConfig({ body }: RouteHandlerArgs) {
320
297
  * already layers these defaults for daemon-internal consumers; the GET
321
298
  * response needs the same treatment so external clients (macOS, web, CLI)
322
299
  * see the effective value rather than `undefined` when the daemon hasn't
323
- * persisted an explicit choice yet. Without this, macOS's
324
- * `loadServiceModes(config:)` short-circuits when `services.inference.mode`
325
- * is missing and falls back to the SwiftUI `@Published` default of
326
- * "your-own", which renders the wrong segment selection on freshly-hatched
327
- * platform-managed assistants.
300
+ * persisted an explicit choice yet. For example, on a freshly-hatched
301
+ * platform-managed assistant, `services.image-generation.mode` may be absent
302
+ * from disk (only `llm.profiles` was written by `seedInferenceProfiles`); the
303
+ * fill pass ensures clients receive `"managed"` rather than falling back to
304
+ * their own defaults.
328
305
  *
329
306
  * Guards against `loadRawConfig()` handing us a value that is technically
330
307
  * valid JSON but not a plain object (e.g. literal `null`, a number, or an
@@ -352,9 +329,52 @@ export function applyContextDefaultsToRawConfig(raw: unknown): unknown {
352
329
  raw as Record<string, unknown>,
353
330
  contextDefaults,
354
331
  );
332
+ synthesizeLegacyInferenceModeForPlatform(raw as Record<string, unknown>);
355
333
  return raw;
356
334
  }
357
335
 
336
+ /**
337
+ * Backwards-compat wire field for `GET /v1/config`. PR removed
338
+ * `services.inference.mode` from the typed schema (routing is now governed
339
+ * by `provider_connections` rows + `llm.default.provider_connection`), but
340
+ * the macOS settings client (`SettingsStore.swift:loadServiceModes`) still
341
+ * reads this field and falls back to its `@Published` default of "your-own"
342
+ * when absent. On a platform-managed assistant served by a newer daemon and
343
+ * an older macOS client, that fallback would show the wrong mode in the UI
344
+ * until the user explicitly saved. Synthesize the value here so the wire
345
+ * shape stays compatible during the rollout window. Remove once the macOS
346
+ * Providers UI (the follow-up PR that retires this field on the client) has
347
+ * shipped to the majority of installs.
348
+ *
349
+ * The synthesis is wire-only: it never persists to disk and never reaches
350
+ * the typed `AssistantConfig` consumed by daemon-internal code. The on-disk
351
+ * config is stripped of `mode` by workspace migration 076.
352
+ *
353
+ * Only runs when this function is reached, which is guarded by
354
+ * `getDeploymentContextDefaults()` returning non-empty (IS_PLATFORM=true).
355
+ */
356
+ function synthesizeLegacyInferenceModeForPlatform(
357
+ root: Record<string, unknown>,
358
+ ): void {
359
+ const services = readPlainObject(root.services);
360
+ if (!services) return;
361
+ let inference = readPlainObject(services.inference);
362
+ if (!inference) {
363
+ inference = {};
364
+ services.inference = inference;
365
+ }
366
+ if (inference.mode === undefined) {
367
+ inference.mode = "managed";
368
+ }
369
+ }
370
+
371
+ function readPlainObject(value: unknown): Record<string, unknown> | undefined {
372
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
373
+ return undefined;
374
+ }
375
+ return value as Record<string, unknown>;
376
+ }
377
+
358
378
  function handleGetConfig() {
359
379
  try {
360
380
  return applyContextDefaultsToRawConfig(loadRawConfig());
@@ -364,6 +384,38 @@ function handleGetConfig() {
364
384
  }
365
385
  }
366
386
 
387
+ /**
388
+ * Return the JSON Schema for the assistant config (full or scoped).
389
+ *
390
+ * The schema is derived from `AssistantConfigSchema` at runtime via
391
+ * `z.toJSONSchema()`. Pure read; no daemon state involved.
392
+ */
393
+ function handleGetConfigSchema({ queryParams = {} }: RouteHandlerArgs) {
394
+ const rawPath = queryParams.path;
395
+ const path = typeof rawPath === "string" ? rawPath.trim() : "";
396
+
397
+ if (!path) {
398
+ return {
399
+ schema: z.toJSONSchema(AssistantConfigSchema, {
400
+ unrepresentable: "any",
401
+ io: "input",
402
+ }),
403
+ };
404
+ }
405
+
406
+ const subSchema = getSchemaAtPath(AssistantConfigSchema, path);
407
+ if (!subSchema) {
408
+ throw new BadRequestError(`No schema found at path: ${path}`);
409
+ }
410
+
411
+ return {
412
+ schema: z.toJSONSchema(subSchema, {
413
+ unrepresentable: "any",
414
+ io: "input",
415
+ }),
416
+ };
417
+ }
418
+
367
419
  function rejectManagedProfileDeletion(body: Record<string, unknown>): void {
368
420
  const llm = asMutablePlainObject(body.llm);
369
421
  if (!llm) return;
@@ -381,28 +433,24 @@ function rejectManagedProfileDeletion(body: Record<string, unknown>): void {
381
433
  }
382
434
  }
383
435
 
384
- async function handlePatchConfig({ body }: RouteHandlerArgs) {
385
- if (
386
- !body ||
387
- typeof body !== "object" ||
388
- Array.isArray(body) ||
389
- Object.keys(body).length === 0
390
- ) {
391
- throw new BadRequestError("Body must be a non-empty JSON object");
392
- }
393
- rejectManagedProfileDeletion(body as Record<string, unknown>);
394
-
395
- const raw = loadRawConfig();
396
- const patch = body as Record<string, unknown>;
397
- deepMergeOverwrite(raw, patch);
398
-
436
+ /**
437
+ * Persist a mutated raw config object to disk and synchronize the running
438
+ * daemon (file-watcher, embedding cache, provider registry).
439
+ *
440
+ * Shared by `handlePatchConfig` and `handleSetConfig` so both write paths get
441
+ * identical post-write side effects.
442
+ */
443
+ async function commitConfigWrite(
444
+ raw: Record<string, unknown>,
445
+ opLabel: string,
446
+ ): Promise<void> {
399
447
  // Suppress the file-watcher callback for the duration of the debounce
400
448
  // window. Without this, the ConfigWatcher detects the config.json write
401
449
  // ~200ms later, sees a stale fingerprint, and calls initializeProviders a
402
- // second time starting with providers.clear() which races with the
450
+ // second time - starting with providers.clear() which races with the
403
451
  // explicit reinit below. The watcher also fires onConversationEvict(),
404
- // which would evict all cached conversations on every PATCH. Mirror the
405
- // suppress/reset pattern used in setModel (config-model.ts).
452
+ // which would evict all cached conversations on every write. Mirror the
453
+ // suppress/reset pattern used in setImageGenModel (config-model.ts).
406
454
  const configWatcher = getConfigWatcher();
407
455
  const wasSuppressed = configWatcher.suppressConfigReload;
408
456
  configWatcher.suppressConfigReload = true;
@@ -411,7 +459,7 @@ async function handlePatchConfig({ body }: RouteHandlerArgs) {
411
459
  } catch (err) {
412
460
  configWatcher.suppressConfigReload = wasSuppressed;
413
461
  const message = err instanceof Error ? err.message : String(err);
414
- throw new InternalError(`Failed to patch config: ${message}`);
462
+ throw new InternalError(`Failed to ${opLabel} config: ${message}`);
415
463
  }
416
464
  configWatcher.timers.schedule(
417
465
  "__suppress_reset__",
@@ -426,7 +474,7 @@ async function handlePatchConfig({ body }: RouteHandlerArgs) {
426
474
  // Reinitialize providers so the live registry reflects the new config
427
475
  // (e.g. a mode flip between managed and your-own). Isolated try/catch so
428
476
  // a provider reinit failure doesn't mask the successful config save.
429
- // Only advance the config fingerprint on success if reinit failed, leave
477
+ // Only advance the config fingerprint on success - if reinit failed, leave
430
478
  // it stale so the watcher can detect the saved config on the next event
431
479
  // and retry provider initialization.
432
480
  try {
@@ -434,11 +482,101 @@ async function handlePatchConfig({ body }: RouteHandlerArgs) {
434
482
  configWatcher.updateFingerprint();
435
483
  } catch (err) {
436
484
  const message = err instanceof Error ? err.message : String(err);
437
- log.error({ err }, `handlePatchConfig: provider reinit failed: ${message}`);
485
+ log.error({ err }, `${opLabel} config: provider reinit failed: ${message}`);
486
+ }
487
+ }
488
+
489
+ async function handlePatchConfig({ body }: RouteHandlerArgs) {
490
+ if (
491
+ !body ||
492
+ typeof body !== "object" ||
493
+ Array.isArray(body) ||
494
+ Object.keys(body).length === 0
495
+ ) {
496
+ throw new BadRequestError("Body must be a non-empty JSON object");
497
+ }
498
+ rejectManagedProfileDeletion(body as Record<string, unknown>);
499
+
500
+ const raw = loadRawConfig();
501
+ const patch = body as Record<string, unknown>;
502
+ deepMergeOverwrite(raw, patch);
503
+
504
+ await commitConfigWrite(raw, "patch");
505
+ return { ok: true };
506
+ }
507
+
508
+ /**
509
+ * Direct path assignment - replaces `config_patch` for the `assistant
510
+ * config set <key> <value>` CLI path.
511
+ *
512
+ * `config_patch` uses `deepMergeOverwrite` semantics, which strips `null`
513
+ * leaves when the target subtree doesn't exist and merges (rather than
514
+ * replaces) object subtrees. That's correct for partial updates (embedding
515
+ * config, profile patches) but breaks single-key `set` semantics, where the
516
+ * user expects:
517
+ * - `set heartbeat.activeHoursStart null` to persist explicit `null`
518
+ * - `set llm {}` to replace `llm`, not merge into it
519
+ *
520
+ * `config_set` performs `setNestedValue` directly on the loaded raw config
521
+ * (no merge), then runs the same post-write side effects as patch.
522
+ */
523
+ async function handleSetConfig({ body }: RouteHandlerArgs) {
524
+ if (!body || typeof body !== "object" || Array.isArray(body)) {
525
+ throw new BadRequestError(
526
+ "Body must be a JSON object with `path` and `value`",
527
+ );
528
+ }
529
+ const bodyRecord = body as Record<string, unknown>;
530
+ const { path, value } = bodyRecord as { path?: unknown; value?: unknown };
531
+ if (typeof path !== "string" || path.length === 0) {
532
+ throw new BadRequestError("`path` must be a non-empty string");
438
533
  }
534
+ // `value` must be present (use explicit `null` to clear a key). Without
535
+ // this check, `undefined` flows into `setNestedValue` and gets dropped by
536
+ // `JSON.stringify` at save time, silently removing the key - which is
537
+ // distinct from the documented "set to null" semantics.
538
+ if (!("value" in bodyRecord)) {
539
+ throw new BadRequestError(
540
+ "`value` is required (use `null` to clear a key)",
541
+ );
542
+ }
543
+ // Build the equivalent patch shape so the managed-profile guard can
544
+ // inspect the touched subtree.
545
+ const patchShape: Record<string, unknown> = {};
546
+ setNestedValue(patchShape, path, value);
547
+ rejectManagedProfileDeletion(patchShape);
548
+
549
+ const raw = loadRawConfig();
550
+ setNestedValue(raw, path, value);
551
+
552
+ await commitConfigWrite(raw, "set");
439
553
  return { ok: true };
440
554
  }
441
555
 
556
+ /**
557
+ * Validate the regex patterns inside the workspace's
558
+ * `secret-allowlist.json` file.
559
+ *
560
+ * Pure read: opens the file, attempts to compile each pattern, returns
561
+ * structured errors. The handler returns `{ exists: false }` if the file is
562
+ * absent, or `{ exists: true, errors: [...] }` otherwise.
563
+ */
564
+ function handleValidateAllowlist() {
565
+ try {
566
+ const errors = validateAllowlistFile();
567
+ if (errors == null) return { exists: false } as const;
568
+ return { exists: true, errors } as const;
569
+ } catch (err) {
570
+ // `validateAllowlistFile` does a raw `JSON.parse` on
571
+ // `secret-allowlist.json` and can throw on malformed JSON. Surface
572
+ // that as a structured `parseError` in the response payload instead
573
+ // of letting it propagate as a 500. Preserves the pre-IPC CLI
574
+ // behavior, which printed a user-readable failure and exited 1.
575
+ const message = err instanceof Error ? err.message : String(err);
576
+ return { exists: true, parseError: message, errors: [] } as const;
577
+ }
578
+ }
579
+
442
580
  function handleReplaceInferenceProfile({
443
581
  pathParams = {},
444
582
  body,
@@ -450,9 +588,9 @@ function handleReplaceInferenceProfile({
450
588
  if (!body || typeof body !== "object" || Array.isArray(body)) {
451
589
  throw new BadRequestError("Body must be a JSON object");
452
590
  }
453
- if (MANAGED_PROFILE_NAMES.has(name)) {
591
+ if (RESERVED_PROFILE_NAMES.has(name)) {
454
592
  throw new BadRequestError(
455
- `Cannot edit managed profile "${name}". Duplicate it to create a custom profile.`,
593
+ `Profile name "${name}" is reserved and cannot be used.`,
456
594
  );
457
595
  }
458
596
  const parsed = ProfileEntry.safeParse(body);
@@ -460,13 +598,44 @@ function handleReplaceInferenceProfile({
460
598
  const detail = parsed.error.issues.map((issue) => issue.message).join("; ");
461
599
  throw new BadRequestError(`Invalid profile fragment: ${detail}`);
462
600
  }
601
+ const isManaged = MANAGED_PROFILE_NAMES.has(name);
602
+ if (isManaged) {
603
+ // Managed profiles are daemon-seeded — provider, model, advanced params,
604
+ // and the connection binding all belong to the seed contract and can't
605
+ // be reshaped by the user. The two fields that ARE user policy (display
606
+ // label and enabled status) are allowed through so users can rename a
607
+ // managed profile or temporarily disable it without duplicating it.
608
+ const requestedKeys = Object.keys(parsed.data);
609
+ const disallowed = requestedKeys.filter(
610
+ (k) => k !== "label" && k !== "status",
611
+ );
612
+ if (disallowed.length > 0) {
613
+ throw new BadRequestError(
614
+ `Cannot edit managed profile "${name}" fields [${disallowed.join(", ")}]. ` +
615
+ `Only label and status may be edited; duplicate to a custom profile to change other fields.`,
616
+ );
617
+ }
618
+ }
463
619
  try {
464
620
  const raw = loadRawConfig();
465
- replaceInferenceProfileConfig(
466
- raw,
467
- name,
468
- parsed.data as Record<string, unknown>,
469
- );
621
+ if (isManaged) {
622
+ // Partial overlay: keep every existing key intact, only update label
623
+ // and/or status from the fragment. Using `replaceInferenceProfileConfig`
624
+ // here would wipe the UI-owned seed fields (provider, model, advanced
625
+ // params) because that function assumes the body carries the full UI
626
+ // surface.
627
+ patchManagedProfileFields(
628
+ raw,
629
+ name,
630
+ parsed.data as Record<string, unknown>,
631
+ );
632
+ } else {
633
+ replaceInferenceProfileConfig(
634
+ raw,
635
+ name,
636
+ parsed.data as Record<string, unknown>,
637
+ );
638
+ }
470
639
  saveRawConfig(raw);
471
640
  return { ok: true };
472
641
  } catch (err) {
@@ -475,6 +644,45 @@ function handleReplaceInferenceProfile({
475
644
  }
476
645
  }
477
646
 
647
+ /**
648
+ * Apply a `{label?, status?}` patch to a managed profile entry, preserving
649
+ * every other field already on disk (provider, model, advanced params, etc).
650
+ * Caller is responsible for having already restricted the fragment to the
651
+ * managed-allowed keys.
652
+ */
653
+ function patchManagedProfileFields(
654
+ raw: Record<string, unknown>,
655
+ name: string,
656
+ fragment: Record<string, unknown>,
657
+ ): void {
658
+ const existingLlm = asMutablePlainObject(raw.llm);
659
+ const llm = existingLlm ?? {};
660
+ if (!existingLlm) raw.llm = llm;
661
+
662
+ const existingProfiles = asMutablePlainObject(llm.profiles);
663
+ const profiles = existingProfiles ?? {};
664
+ if (!existingProfiles) llm.profiles = profiles;
665
+
666
+ const existingProfile = asMutablePlainObject(profiles[name]) ?? {};
667
+ const nextProfile: Record<string, unknown> = { ...existingProfile };
668
+ // Send `null` to clear; omit to leave untouched.
669
+ if ("label" in fragment) {
670
+ if (fragment.label === null) {
671
+ delete nextProfile.label;
672
+ } else {
673
+ nextProfile.label = fragment.label;
674
+ }
675
+ }
676
+ if ("status" in fragment) {
677
+ if (fragment.status === null) {
678
+ delete nextProfile.status;
679
+ } else {
680
+ nextProfile.status = fragment.status;
681
+ }
682
+ }
683
+ profiles[name] = nextProfile;
684
+ }
685
+
478
686
  function handleSearchConversations({ queryParams = {} }: RouteHandlerArgs) {
479
687
  const q = queryParams.q;
480
688
  if (!q) {
@@ -527,12 +735,13 @@ function resolveConversationKind(
527
735
  return "user";
528
736
  }
529
737
 
530
- function handleGetLlmContext({ pathParams = {} }: RouteHandlerArgs) {
738
+ async function handleGetLlmContext({ pathParams = {} }: RouteHandlerArgs) {
531
739
  const messageId = pathParams.id;
532
740
  if (!messageId) {
533
741
  throw new BadRequestError("message id is required");
534
742
  }
535
- const logs = getRequestLogsByMessageId(messageId);
743
+ const source = await getLlmRequestLogSource();
744
+ const logs = await source.getRequestLogsByMessageId(messageId);
536
745
  const turnMessageIds = getAssistantMessageIdsInTurn(messageId);
537
746
  const memoryRecallLog = getMemoryRecallLogByMessageIds(turnMessageIds);
538
747
  const memoryV2Activation =
@@ -545,9 +754,15 @@ function handleGetLlmContext({ pathParams = {} }: RouteHandlerArgs) {
545
754
  conversation.conversationType,
546
755
  )
547
756
  : "user";
757
+ // Running total of estimated USD cost across every priced LLM call in
758
+ // the conversation. Maintained by `updateConversationUsage` whenever a
759
+ // turn finishes — see `assistant/src/memory/conversation-crud.ts`.
760
+ const conversationTotalEstimatedCostUsd =
761
+ conversation?.totalEstimatedCost ?? null;
548
762
  return {
549
763
  messageId,
550
764
  conversationKind,
765
+ conversationTotalEstimatedCostUsd,
551
766
  logs: logs.map((log) => {
552
767
  let requestPayload: unknown;
553
768
  try {
@@ -583,12 +798,15 @@ function handleGetLlmContext({ pathParams = {} }: RouteHandlerArgs) {
583
798
  };
584
799
  }
585
800
 
586
- function handleGetLlmRequestLogPayload({ pathParams = {} }: RouteHandlerArgs) {
801
+ async function handleGetLlmRequestLogPayload({
802
+ pathParams = {},
803
+ }: RouteHandlerArgs) {
587
804
  const logId = pathParams.id;
588
805
  if (!logId) {
589
806
  throw new BadRequestError("log id is required");
590
807
  }
591
- const log = getRequestLogById(logId);
808
+ const source = await getLlmRequestLogSource();
809
+ const log = await source.getRequestLogById(logId);
592
810
  if (!log) {
593
811
  throw new NotFoundError("log not found");
594
812
  }
@@ -643,20 +861,6 @@ export const ROUTES: RouteDefinition[] = [
643
861
  tags: ["config"],
644
862
  handler: handleGetModel,
645
863
  },
646
- {
647
- operationId: "model_set",
648
- endpoint: "model",
649
- method: "PUT",
650
- policyKey: "model",
651
- summary: "Set LLM model",
652
- description: "Change the active LLM model and optionally its provider.",
653
- tags: ["config"],
654
- requestBody: z.object({
655
- modelId: z.string(),
656
- provider: z.string().describe("Optional provider override").optional(),
657
- }),
658
- handler: handleSetModel,
659
- },
660
864
  {
661
865
  operationId: "model_image_gen_set",
662
866
  endpoint: "model/image-gen",
@@ -714,6 +918,49 @@ export const ROUTES: RouteDefinition[] = [
714
918
  tags: ["config"],
715
919
  handler: handlePatchConfig,
716
920
  },
921
+ {
922
+ operationId: "config_set",
923
+ endpoint: "config/set",
924
+ method: "POST",
925
+ policyKey: "config/set",
926
+ summary: "Set a single config path",
927
+ description:
928
+ "Assign a value at a dotted config path with direct-replacement semantics " +
929
+ "(preserves explicit null, replaces object subtrees instead of merging). " +
930
+ "Used by the `assistant config set <key> <value>` CLI command.",
931
+ tags: ["config"],
932
+ handler: handleSetConfig,
933
+ },
934
+ {
935
+ operationId: "config_allowlist_validate",
936
+ endpoint: "config/allowlist/validate",
937
+ method: "GET",
938
+ policyKey: "config/allowlist/validate",
939
+ summary: "Validate secret-allowlist.json regex patterns",
940
+ description:
941
+ "Compile each regex pattern in secret-allowlist.json and return any " +
942
+ "syntax errors. Returns { exists: false } if no file is present.",
943
+ tags: ["config"],
944
+ handler: handleValidateAllowlist,
945
+ },
946
+ {
947
+ operationId: "config_schema_get",
948
+ endpoint: "config/schema",
949
+ method: "GET",
950
+ policyKey: "config/schema",
951
+ summary: "Get config JSON Schema",
952
+ description:
953
+ "Return the JSON Schema for the assistant config, optionally scoped to a dotted-path sub-schema (e.g. ?path=calls).",
954
+ tags: ["config"],
955
+ queryParams: [
956
+ {
957
+ name: "path",
958
+ schema: { type: "string" },
959
+ description: "Optional dotted path to a config sub-key",
960
+ },
961
+ ],
962
+ handler: handleGetConfigSchema,
963
+ },
717
964
  {
718
965
  operationId: "config_llm_profiles_replace",
719
966
  endpoint: "config/llm/profiles/:name",
@@ -787,6 +1034,7 @@ export const ROUTES: RouteDefinition[] = [
787
1034
  responseBody: z.object({
788
1035
  messageId: z.string(),
789
1036
  conversationKind: z.enum(CONVERSATION_KINDS),
1037
+ conversationTotalEstimatedCostUsd: z.number().nullable(),
790
1038
  logs: z.array(z.unknown()),
791
1039
  memoryRecall: z.object({}).passthrough().nullable(),
792
1040
  memoryV2Activation: z.object({}).passthrough().nullable(),