@vellumai/assistant 0.7.1 → 0.7.3

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 (739) hide show
  1. package/ARCHITECTURE.md +48 -50
  2. package/Dockerfile +1 -0
  3. package/README.md +1 -2
  4. package/__tests__/permissions/gateway-threshold-reader.test.ts +9 -3
  5. package/bun.lock +26 -26
  6. package/docs/architecture/memory.md +5 -2
  7. package/docs/architecture/security.md +20 -0
  8. package/docs/plugins.md +7 -9
  9. package/knip.json +1 -0
  10. package/node_modules/@vellumai/gateway-client/src/index.ts +1 -0
  11. package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +52 -5
  12. package/node_modules/@vellumai/gateway-client/src/types.ts +11 -0
  13. package/node_modules/@vellumai/service-contracts/package.json +2 -0
  14. package/node_modules/@vellumai/service-contracts/src/__tests__/contracts.test.ts +4 -0
  15. package/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +107 -0
  16. package/node_modules/@vellumai/service-contracts/src/index.ts +5 -1
  17. package/node_modules/@vellumai/service-contracts/src/ingress.ts +24 -0
  18. package/node_modules/@vellumai/service-contracts/src/twilio-ingress.ts +84 -0
  19. package/node_modules/@vellumai/slack-text/src/index.test.ts +18 -35
  20. package/node_modules/@vellumai/slack-text/src/index.ts +2 -48
  21. package/node_modules/@vellumai/twilio-client/bun.lock +24 -0
  22. package/node_modules/@vellumai/twilio-client/package.json +18 -0
  23. package/node_modules/@vellumai/twilio-client/src/__tests__/twilio-client.test.ts +128 -0
  24. package/node_modules/@vellumai/twilio-client/src/index.ts +179 -0
  25. package/node_modules/@vellumai/twilio-client/tsconfig.json +20 -0
  26. package/openapi.yaml +1020 -40
  27. package/package.json +6 -3
  28. package/src/__tests__/app-builder-tool-scripts.test.ts +3 -3
  29. package/src/__tests__/app-bundler.test.ts +170 -1
  30. package/src/__tests__/app-control-flow.test.ts +384 -0
  31. package/src/__tests__/app-control-no-global-cgevent.test.ts +98 -0
  32. package/src/__tests__/app-control-tool-schemas.test.ts +621 -0
  33. package/src/__tests__/app-executors.test.ts +30 -43
  34. package/src/__tests__/approval-routes-http.test.ts +23 -6
  35. package/src/__tests__/assistant-event-hub-machine-name.test.ts +146 -0
  36. package/src/__tests__/assistant-event-hub-targeted.test.ts +257 -0
  37. package/src/__tests__/assistant-event-hub.test.ts +157 -2
  38. package/src/__tests__/assistant-feature-flags-integration.test.ts +29 -7
  39. package/src/__tests__/auto-analysis-end-to-end.test.ts +62 -1
  40. package/src/__tests__/background-shell-host-bash.test.ts +14 -15
  41. package/src/__tests__/background-workers-disk-pressure.test.ts +268 -0
  42. package/src/__tests__/bootstrap-turn-cleanup.test.ts +44 -0
  43. package/src/__tests__/btw-routes.test.ts +13 -4
  44. package/src/__tests__/call-controller.test.ts +49 -1
  45. package/src/__tests__/call-conversation-messages.test.ts +8 -2
  46. package/src/__tests__/call-domain.test.ts +0 -2
  47. package/src/__tests__/call-routes-http.test.ts +0 -2
  48. package/src/__tests__/channel-inbound-disk-pressure.test.ts +537 -0
  49. package/src/__tests__/channel-readiness-service.test.ts +62 -2
  50. package/src/__tests__/checker.test.ts +3 -4
  51. package/src/__tests__/config-loader-backfill.test.ts +461 -147
  52. package/src/__tests__/config-loader-platform-defaults.test.ts +196 -0
  53. package/src/__tests__/config-schema-cmd.test.ts +0 -1
  54. package/src/__tests__/config-schema.test.ts +1 -0
  55. package/src/__tests__/config-set-platform-guard.test.ts +48 -4
  56. package/src/__tests__/config-watcher-cleanup-throttle.test.ts +20 -11
  57. package/src/__tests__/config-watcher.test.ts +142 -71
  58. package/src/__tests__/context-search-agent-runner.test.ts +61 -3
  59. package/src/__tests__/context-search-conversations-source.test.ts +0 -24
  60. package/src/__tests__/context-search-fanout.test.ts +0 -1
  61. package/src/__tests__/context-search-memory-source.test.ts +3 -7
  62. package/src/__tests__/context-search-memory-v2-source.test.ts +0 -2
  63. package/src/__tests__/context-search-pkb-source.test.ts +0 -1
  64. package/src/__tests__/context-search-workspace-source.test.ts +0 -1
  65. package/src/__tests__/conversation-abort-tool-results.test.ts +6 -0
  66. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +223 -0
  67. package/src/__tests__/conversation-agent-loop.test.ts +454 -5
  68. package/src/__tests__/conversation-app-control-instantiation.test.ts +392 -0
  69. package/src/__tests__/conversation-app-control-lifecycle.test.ts +237 -0
  70. package/src/__tests__/conversation-error.test.ts +150 -3
  71. package/src/__tests__/conversation-init.benchmark.test.ts +0 -2
  72. package/src/__tests__/conversation-lifecycle.test.ts +36 -0
  73. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +283 -0
  74. package/src/__tests__/conversation-process-callsite.test.ts +43 -0
  75. package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
  76. package/src/__tests__/conversation-routes-disk-view.test.ts +6 -0
  77. package/src/__tests__/conversation-routes-guardian-reply.test.ts +120 -72
  78. package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -0
  79. package/src/__tests__/conversation-runtime-assembly.test.ts +65 -0
  80. package/src/__tests__/conversation-slash-commands.test.ts +0 -4
  81. package/src/__tests__/conversation-slash-unknown.test.ts +6 -0
  82. package/src/__tests__/conversation-speed-override.test.ts +0 -3
  83. package/src/__tests__/conversation-store.test.ts +0 -18
  84. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +202 -0
  85. package/src/__tests__/conversation-surfaces-app-control.test.ts +328 -0
  86. package/src/__tests__/conversation-surfaces-data-persist.test.ts +404 -0
  87. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +2 -5
  88. package/src/__tests__/conversation-workspace-injection.test.ts +6 -0
  89. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -0
  90. package/src/__tests__/credential-execution-feature-gates.test.ts +5 -12
  91. package/src/__tests__/credential-execution-managed-contract.test.ts +3 -131
  92. package/src/__tests__/credentials-cli.test.ts +12 -12
  93. package/src/__tests__/cu-unified-flow.test.ts +351 -23
  94. package/src/__tests__/daemon-credential-client.test.ts +101 -19
  95. package/src/__tests__/date-context.test.ts +164 -2
  96. package/src/__tests__/db-schedule-syntax-migration.test.ts +2 -0
  97. package/src/__tests__/disk-pressure-guard.test.ts +262 -0
  98. package/src/__tests__/disk-pressure-lifecycle.test.ts +168 -0
  99. package/src/__tests__/disk-pressure-policy.test.ts +241 -0
  100. package/src/__tests__/disk-pressure-routes.test.ts +379 -0
  101. package/src/__tests__/disk-pressure-tools.test.ts +277 -0
  102. package/src/__tests__/disk-usage.test.ts +150 -0
  103. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
  104. package/src/__tests__/events-client-registration.test.ts +52 -0
  105. package/src/__tests__/events-dev-bypass-actor.test.ts +162 -0
  106. package/src/__tests__/file-write-tool.test.ts +4 -10
  107. package/src/__tests__/filing-service.test.ts +3 -4
  108. package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
  109. package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -2
  110. package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +0 -2
  111. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +0 -1
  112. package/src/__tests__/heartbeat-disk-pressure.test.ts +183 -0
  113. package/src/__tests__/heartbeat-service.test.ts +968 -2
  114. package/src/__tests__/helpers/call-route-handler.ts +7 -1
  115. package/src/__tests__/host-app-control-proxy.test.ts +772 -0
  116. package/src/__tests__/host-app-control-routes.test.ts +263 -0
  117. package/src/__tests__/host-bash-proxy.test.ts +439 -47
  118. package/src/__tests__/host-bash-routes.test.ts +459 -0
  119. package/src/__tests__/host-browser-proxy.test.ts +24 -22
  120. package/src/__tests__/host-browser-routes.test.ts +39 -13
  121. package/src/__tests__/host-cu-proxy.test.ts +248 -52
  122. package/src/__tests__/host-cu-routes-targeted.test.ts +429 -0
  123. package/src/__tests__/host-file-edit-tool.test.ts +47 -1
  124. package/src/__tests__/host-file-proxy-targeted.test.ts +378 -0
  125. package/src/__tests__/host-file-proxy.test.ts +301 -45
  126. package/src/__tests__/host-file-read-tool.test.ts +17 -0
  127. package/src/__tests__/host-file-routes-targeted.test.ts +420 -0
  128. package/src/__tests__/host-file-write-tool.test.ts +42 -1
  129. package/src/__tests__/host-proxy-base.test.ts +312 -0
  130. package/src/__tests__/host-shell-tool.test.ts +22 -4
  131. package/src/__tests__/host-transfer-proxy-targeted.test.ts +932 -0
  132. package/src/__tests__/host-transfer-proxy.test.ts +121 -22
  133. package/src/__tests__/host-transfer-routes-targeted.test.ts +662 -0
  134. package/src/__tests__/http-user-message-parity.test.ts +108 -1
  135. package/src/__tests__/identity-intro-cache.test.ts +29 -0
  136. package/src/__tests__/identity-routes.test.ts +103 -1
  137. package/src/__tests__/init-feature-flag-overrides.test.ts +26 -3
  138. package/src/__tests__/injector-chain.test.ts +18 -6
  139. package/src/__tests__/injector-disk-pressure.test.ts +224 -0
  140. package/src/__tests__/inline-command-runner.test.ts +0 -1
  141. package/src/__tests__/inline-skill-load-permissions.test.ts +5 -11
  142. package/src/__tests__/integration-status.test.ts +85 -5
  143. package/src/__tests__/intent-routing.test.ts +0 -1
  144. package/src/__tests__/jobs-store-qdrant-breaker.test.ts +95 -5
  145. package/src/__tests__/lifecycle-memory-v2-seed.test.ts +17 -0
  146. package/src/__tests__/managed-profile-guard.test.ts +18 -0
  147. package/src/__tests__/managed-skill-lifecycle.test.ts +0 -1
  148. package/src/__tests__/mcp-abort-signal.test.ts +130 -0
  149. package/src/__tests__/mcp-auth-routes.test.ts +197 -0
  150. package/src/__tests__/mcp-cli.test.ts +338 -2
  151. package/src/__tests__/memory-admin-recall.test.ts +3 -11
  152. package/src/__tests__/memory-jobs-worker-lanes.test.ts +188 -0
  153. package/src/__tests__/memory-retrieval-pipeline.test.ts +22 -1
  154. package/src/__tests__/migration-import-commit-http.test.ts +108 -2
  155. package/src/__tests__/mock-gateway-ipc.ts +1 -0
  156. package/src/__tests__/normalize-onboarding.test.ts +180 -0
  157. package/src/__tests__/oauth-cli.test.ts +0 -2
  158. package/src/__tests__/oauth-connect-routes.test.ts +316 -0
  159. package/src/__tests__/oauth-provider-seed-logos.test.ts +24 -2
  160. package/src/__tests__/oauth2-gateway-transport.test.ts +0 -1
  161. package/src/__tests__/onboarding-persona-write.test.ts +308 -0
  162. package/src/__tests__/openai-provider.test.ts +45 -8
  163. package/src/__tests__/persist-onboarding-artifacts.test.ts +44 -64
  164. package/src/__tests__/persistence-secret-redaction.test.ts +299 -0
  165. package/src/__tests__/platform-bash-auto-approve.test.ts +5 -9
  166. package/src/__tests__/platform-callback-registration.test.ts +21 -4
  167. package/src/__tests__/platform.test.ts +2 -1
  168. package/src/__tests__/playbook-execution.test.ts +0 -43
  169. package/src/__tests__/plugin-tool-contribution.test.ts +47 -0
  170. package/src/__tests__/prechat-onboarding-contract.test.ts +214 -25
  171. package/src/__tests__/process-message-background-slack.test.ts +2 -0
  172. package/src/__tests__/provider-commit-message-generator.test.ts +0 -1
  173. package/src/__tests__/provider-tool-name.test.ts +23 -0
  174. package/src/__tests__/public-ingress-urls.test.ts +97 -0
  175. package/src/__tests__/relay-server.test.ts +15 -4
  176. package/src/__tests__/require-fresh-approval.test.ts +0 -1
  177. package/src/__tests__/retry-backoff.test.ts +87 -0
  178. package/src/__tests__/runtime-events-sse.test.ts +2 -2
  179. package/src/__tests__/sanitize-config-for-transfer.test.ts +24 -2
  180. package/src/__tests__/schedule-retry.test.ts +715 -0
  181. package/src/__tests__/scheduler-disk-pressure.test.ts +148 -0
  182. package/src/__tests__/script-proxy-mitm-handler.test.ts +1 -1
  183. package/src/__tests__/secret-ingress-http.test.ts +1 -1
  184. package/src/__tests__/send-endpoint-busy.test.ts +3 -0
  185. package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -1
  186. package/src/__tests__/skill-feature-flags.test.ts +43 -41
  187. package/src/__tests__/skill-load-feature-flag.test.ts +13 -14
  188. package/src/__tests__/skill-load-inline-command.test.ts +0 -51
  189. package/src/__tests__/skill-load-inline-includes.test.ts +0 -43
  190. package/src/__tests__/skill-projection.benchmark.test.ts +0 -1
  191. package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -1
  192. package/src/__tests__/slack-channel-config.test.ts +9 -14
  193. package/src/__tests__/suggestion-routes.test.ts +46 -0
  194. package/src/__tests__/system-prompt-ask-mode.test.ts +0 -1
  195. package/src/__tests__/system-prompt.test.ts +0 -1
  196. package/src/__tests__/telegram-config.test.ts +0 -1
  197. package/src/__tests__/test-preload.ts +8 -0
  198. package/src/__tests__/tool-approval-handler.test.ts +3 -4
  199. package/src/__tests__/tool-audit-listener.test.ts +48 -0
  200. package/src/__tests__/tool-execute-pipeline.test.ts +0 -1
  201. package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
  202. package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -1
  203. package/src/__tests__/tool-executor.test.ts +0 -1
  204. package/src/__tests__/twilio-config.test.ts +3 -16
  205. package/src/__tests__/twilio-routes.test.ts +3 -5
  206. package/src/__tests__/twilio-validation.test.ts +93 -0
  207. package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +1 -4
  208. package/src/__tests__/verification-control-plane-policy.test.ts +2 -4
  209. package/src/__tests__/voice-ingress-preflight.test.ts +19 -0
  210. package/src/__tests__/workspace-migration-006-services-config.test.ts +3 -2
  211. package/src/__tests__/workspace-migration-065-bump-stale-heartbeat-interval.test.ts +122 -0
  212. package/src/__tests__/workspace-migration-066-seed-heartbeat-callsite-cost-default.test.ts +285 -0
  213. package/src/__tests__/workspace-migration-068-release-notes-local-timezone.test.ts +90 -0
  214. package/src/__tests__/workspace-migration-backfill-installation-id.test.ts +1 -5
  215. package/src/__tests__/workspace-migration-down-functions.test.ts +8 -8
  216. package/src/__tests__/workspace-migration-safe-storage-limits-release.test.ts +90 -0
  217. package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +10 -6
  218. package/src/approvals/guardian-decision-primitive.ts +13 -0
  219. package/src/approvals/guardian-request-resolvers.ts +16 -17
  220. package/src/backup/__tests__/paths.test.ts +0 -22
  221. package/src/backup/__tests__/restore.test.ts +51 -151
  222. package/src/backup/paths.ts +2 -18
  223. package/src/backup/restore.ts +107 -231
  224. package/src/backup/snapshot-lock.ts +2 -27
  225. package/src/bundler/app-bundler.ts +51 -3
  226. package/src/bundler/compiler-tools.ts +3 -2
  227. package/src/calls/call-conversation-messages.ts +46 -10
  228. package/src/calls/relay-server.ts +4 -44
  229. package/src/calls/twilio-config.ts +2 -17
  230. package/src/calls/twilio-rest.ts +33 -105
  231. package/src/calls/twilio-routes.ts +11 -12
  232. package/src/channels/types.ts +8 -7
  233. package/src/cli/commands/__tests__/backup.test.ts +6 -277
  234. package/src/cli/commands/__tests__/gateway.test.ts +288 -0
  235. package/src/cli/commands/__tests__/memory-v2.test.ts +4 -0
  236. package/src/cli/commands/__tests__/webhooks.test.ts +0 -5
  237. package/src/cli/commands/backup.ts +6 -331
  238. package/src/cli/commands/bash.ts +35 -108
  239. package/src/cli/commands/clients.ts +36 -37
  240. package/src/cli/commands/contacts.ts +137 -25
  241. package/src/cli/commands/conversations.ts +2 -5
  242. package/src/cli/commands/credentials.ts +71 -7
  243. package/src/cli/commands/domain.ts +66 -15
  244. package/src/cli/commands/gateway.ts +183 -0
  245. package/src/cli/commands/keys.ts +9 -6
  246. package/src/cli/commands/mcp.ts +116 -156
  247. package/src/cli/commands/memory-v2.ts +303 -7
  248. package/src/cli/commands/oauth/__tests__/connect.test.ts +437 -1
  249. package/src/cli/commands/oauth/connect.ts +127 -1
  250. package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -4
  251. package/src/cli/commands/platform/__tests__/connect.test.ts +7 -3
  252. package/src/cli/commands/platform/__tests__/disconnect.test.ts +7 -3
  253. package/src/cli/commands/platform/__tests__/status.test.ts +116 -21
  254. package/src/cli/commands/platform/disconnect.ts +5 -4
  255. package/src/cli/commands/platform/index.ts +16 -25
  256. package/src/cli/commands/status.ts +57 -0
  257. package/src/cli/lib/daemon-credential-client.ts +110 -28
  258. package/src/cli/program.ts +6 -2
  259. package/src/config/assistant-feature-flags.ts +79 -12
  260. package/src/config/bundled-skills/acp/SKILL.md +6 -0
  261. package/src/config/bundled-skills/acp/TOOLS.json +1 -22
  262. package/src/config/bundled-skills/app-builder/SKILL.md +14 -109
  263. package/src/config/bundled-skills/app-builder/TOOLS.json +1 -28
  264. package/src/config/bundled-skills/app-builder/tools/app-create.ts +1 -10
  265. package/src/config/bundled-skills/app-control/SKILL.md +75 -0
  266. package/src/config/bundled-skills/app-control/TOOLS.json +299 -0
  267. package/src/config/bundled-skills/app-control/tools/app-control-click.ts +12 -0
  268. package/src/config/bundled-skills/app-control/tools/app-control-combo.ts +12 -0
  269. package/src/config/bundled-skills/app-control/tools/app-control-drag.ts +12 -0
  270. package/src/config/bundled-skills/app-control/tools/app-control-observe.ts +12 -0
  271. package/src/config/bundled-skills/app-control/tools/app-control-press.ts +12 -0
  272. package/src/config/bundled-skills/app-control/tools/app-control-sequence.ts +12 -0
  273. package/src/config/bundled-skills/app-control/tools/app-control-start.ts +12 -0
  274. package/src/config/bundled-skills/app-control/tools/app-control-stop.ts +12 -0
  275. package/src/config/bundled-skills/app-control/tools/app-control-type.ts +12 -0
  276. package/src/config/bundled-skills/computer-use/SKILL.md +6 -0
  277. package/src/config/bundled-skills/computer-use/TOOLS.json +67 -43
  278. package/src/config/bundled-skills/contacts/TOOLS.json +0 -16
  279. package/src/config/bundled-skills/document/TOOLS.json +0 -8
  280. package/src/config/bundled-skills/followups/TOOLS.json +0 -12
  281. package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
  282. package/src/config/bundled-skills/image-studio/TOOLS.json +0 -4
  283. package/src/config/bundled-skills/media-processing/TOOLS.json +0 -24
  284. package/src/config/bundled-skills/messaging/TOOLS.json +0 -40
  285. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +4 -3
  286. package/src/config/bundled-skills/phone-calls/TOOLS.json +0 -12
  287. package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +25 -4
  288. package/src/config/bundled-skills/playbooks/TOOLS.json +0 -16
  289. package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +2 -2
  290. package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +2 -2
  291. package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +2 -2
  292. package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +2 -2
  293. package/src/config/bundled-skills/schedule/TOOLS.json +14 -14
  294. package/src/config/bundled-skills/sequences/TOOLS.json +0 -36
  295. package/src/config/bundled-skills/settings/SKILL.md +4 -0
  296. package/src/config/bundled-skills/settings/TOOLS.json +0 -12
  297. package/src/config/bundled-skills/skill-management/SKILL.md +6 -0
  298. package/src/config/bundled-skills/skill-management/TOOLS.json +0 -8
  299. package/src/config/bundled-skills/subagent/SKILL.md +6 -2
  300. package/src/config/bundled-skills/subagent/TOOLS.json +0 -20
  301. package/src/config/bundled-skills/transcribe/SKILL.md +4 -0
  302. package/src/config/bundled-skills/transcribe/TOOLS.json +0 -4
  303. package/src/config/bundled-tool-registry.ts +21 -0
  304. package/src/config/env-registry.ts +0 -2
  305. package/src/config/env.ts +19 -20
  306. package/src/config/feature-flag-registry.json +47 -135
  307. package/src/config/loader.ts +197 -104
  308. package/src/config/sanitize-for-transfer.ts +2 -0
  309. package/src/config/schemas/__tests__/memory-lifecycle.test.ts +80 -0
  310. package/src/config/schemas/__tests__/memory-v2.test.ts +17 -9
  311. package/src/config/schemas/call-site-catalog.ts +14 -0
  312. package/src/config/schemas/calls.ts +0 -9
  313. package/src/config/schemas/channels.ts +0 -5
  314. package/src/config/schemas/heartbeat.ts +64 -1
  315. package/src/config/schemas/ingress.ts +10 -6
  316. package/src/config/schemas/llm.ts +7 -10
  317. package/src/config/schemas/memory-lifecycle.ts +90 -24
  318. package/src/config/schemas/memory-v2.ts +121 -13
  319. package/src/config/schemas/platform.ts +49 -3
  320. package/src/config/schemas/services.ts +29 -15
  321. package/src/config/schemas/skills.ts +0 -6
  322. package/src/config/seed-inference-profiles.ts +230 -33
  323. package/src/contacts/contact-store.ts +0 -55
  324. package/src/contacts/contacts-write.ts +0 -27
  325. package/src/context/window-manager.ts +1 -2
  326. package/src/credential-execution/feature-gates.ts +10 -10
  327. package/src/credential-execution/process-manager.ts +12 -41
  328. package/src/daemon/__tests__/conversation-tool-setup.test.ts +187 -5
  329. package/src/daemon/assistant-attachments.ts +4 -4
  330. package/src/daemon/bootstrap-turn-cleanup.ts +45 -0
  331. package/src/daemon/config-watcher.ts +89 -60
  332. package/src/daemon/conversation-agent-loop-handlers.ts +27 -3
  333. package/src/daemon/conversation-agent-loop.ts +202 -61
  334. package/src/daemon/conversation-error.ts +87 -15
  335. package/src/daemon/conversation-lifecycle.ts +9 -4
  336. package/src/daemon/conversation-process.ts +24 -11
  337. package/src/daemon/conversation-runtime-assembly.ts +28 -2
  338. package/src/daemon/conversation-store.ts +2 -2
  339. package/src/daemon/conversation-surfaces.ts +305 -4
  340. package/src/daemon/conversation-tool-setup.ts +66 -62
  341. package/src/daemon/conversation.ts +38 -24
  342. package/src/daemon/date-context.ts +71 -22
  343. package/src/daemon/disk-pressure-background-gate.ts +73 -0
  344. package/src/daemon/disk-pressure-guard.ts +343 -0
  345. package/src/daemon/disk-pressure-policy.ts +163 -0
  346. package/src/daemon/doordash-steps.ts +1 -1
  347. package/src/daemon/handlers/shared.ts +4 -2
  348. package/src/daemon/handlers/skills.ts +3 -4
  349. package/src/daemon/host-app-control-proxy.ts +389 -0
  350. package/src/daemon/host-bash-proxy.ts +117 -82
  351. package/src/daemon/host-browser-proxy.ts +67 -82
  352. package/src/daemon/host-cu-proxy.ts +127 -86
  353. package/src/daemon/host-file-proxy.ts +129 -69
  354. package/src/daemon/host-proxy-base.ts +294 -0
  355. package/src/daemon/host-proxy-preactivation.ts +82 -0
  356. package/src/daemon/host-transfer-proxy.ts +338 -129
  357. package/src/daemon/lifecycle.ts +194 -145
  358. package/src/daemon/meet-host-supervisor.ts +4 -4
  359. package/src/daemon/meet-manifest-loader.ts +0 -1
  360. package/src/daemon/memory-v2-startup.ts +14 -4
  361. package/src/daemon/message-protocol.ts +6 -8
  362. package/src/daemon/message-types/contacts.ts +23 -1
  363. package/src/daemon/message-types/conversations.ts +15 -8
  364. package/src/daemon/message-types/disk-pressure.ts +9 -0
  365. package/src/daemon/message-types/host-app-control.ts +150 -0
  366. package/src/daemon/message-types/host-bash.ts +4 -0
  367. package/src/daemon/message-types/host-cu.ts +2 -0
  368. package/src/daemon/message-types/host-file.ts +4 -0
  369. package/src/daemon/message-types/host-transfer.ts +3 -0
  370. package/src/daemon/message-types/messages.ts +3 -0
  371. package/src/daemon/message-types/schedules.ts +8 -3
  372. package/src/daemon/message-types/skills.ts +2 -2
  373. package/src/daemon/process-message.ts +18 -1
  374. package/src/daemon/profiler-run-store.ts +5 -5
  375. package/src/daemon/shutdown-handlers.ts +0 -3
  376. package/src/daemon/tool-setup-types.ts +51 -0
  377. package/src/daemon/tool-side-effects.ts +1 -1
  378. package/src/documents/document-store.ts +85 -0
  379. package/src/events/tool-audit-listener.ts +2 -1
  380. package/src/filing/filing-service.ts +30 -5
  381. package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +24 -23
  382. package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +252 -0
  383. package/src/heartbeat/heartbeat-run-store.ts +249 -0
  384. package/src/heartbeat/heartbeat-service.ts +459 -54
  385. package/src/home/__tests__/post-connect-feed.test.ts +99 -0
  386. package/src/home/__tests__/relationship-state-writer.test.ts +11 -9
  387. package/src/home/__tests__/suggested-prompts.test.ts +89 -0
  388. package/src/home/feed-scheduler.ts +18 -0
  389. package/src/home/post-connect-feed.ts +68 -0
  390. package/src/home/relationship-state-writer.ts +17 -92
  391. package/src/home/suggested-prompts.ts +46 -10
  392. package/src/inbound/platform-callback-registration.ts +8 -15
  393. package/src/inbound/public-ingress-urls.ts +32 -34
  394. package/src/ipc/__tests__/clients-list-ipc.test.ts +169 -0
  395. package/src/ipc/__tests__/route-error-envelope.test.ts +80 -0
  396. package/src/ipc/assistant-server.ts +70 -3
  397. package/src/ipc/cli-client.ts +32 -1
  398. package/src/ipc/gateway-client.ts +37 -3
  399. package/src/live-voice/live-voice-archive.ts +4 -4
  400. package/src/live-voice/live-voice-metrics.ts +10 -10
  401. package/src/live-voice/protocol.ts +5 -7
  402. package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +304 -0
  403. package/src/mcp/mcp-auth-orchestrator.ts +213 -0
  404. package/src/mcp/mcp-auth-state.ts +133 -0
  405. package/src/mcp/mcp-oauth-provider.ts +19 -0
  406. package/src/media/image-service.ts +1 -7
  407. package/src/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +21 -13
  408. package/src/memory/__tests__/jobs-store-job-classes.test.ts +24 -0
  409. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +52 -22
  410. package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +0 -6
  411. package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +272 -0
  412. package/src/memory/__tests__/qdrant-client-sentinel.test.ts +49 -0
  413. package/src/memory/__tests__/sparse-tokenize.test.ts +66 -0
  414. package/src/memory/admin.ts +5 -9
  415. package/src/memory/anisotropy.test.ts +247 -0
  416. package/src/memory/anisotropy.ts +443 -0
  417. package/src/memory/auto-analysis-constants.ts +17 -0
  418. package/src/memory/auto-analysis-guard.ts +5 -15
  419. package/src/memory/canonical-guardian-store.ts +7 -7
  420. package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +122 -0
  421. package/src/memory/context-search/agent-protocol.ts +6 -6
  422. package/src/memory/context-search/agent-runner.ts +51 -9
  423. package/src/memory/context-search/sources/conversations.ts +2 -11
  424. package/src/memory/context-search/sources/memory-v2.ts +22 -9
  425. package/src/memory/context-search/sources/memory.ts +0 -1
  426. package/src/memory/context-search/types.ts +0 -1
  427. package/src/memory/conversation-crud.ts +5 -13
  428. package/src/memory/conversation-key-store.ts +2 -15
  429. package/src/memory/db-init.ts +6 -0
  430. package/src/memory/embedding-backend.ts +9 -21
  431. package/src/memory/embedding-runtime-manager.ts +119 -5
  432. package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +81 -25
  433. package/src/memory/graph/conversation-graph-memory.ts +43 -78
  434. package/src/memory/graph/extraction.ts +1 -3
  435. package/src/memory/graph/graph-search.test.ts +10 -67
  436. package/src/memory/graph/graph-search.ts +9 -20
  437. package/src/memory/graph/retriever.test.ts +6 -0
  438. package/src/memory/graph/retriever.ts +34 -10
  439. package/src/memory/graph/tools.ts +1 -1
  440. package/src/memory/indexer.ts +54 -45
  441. package/src/memory/job-handlers/backfill.ts +2 -11
  442. package/src/memory/job-handlers/cleanup.ts +43 -0
  443. package/src/memory/job-handlers/embedding.ts +6 -8
  444. package/src/memory/job-handlers/summarization.ts +2 -7
  445. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +8 -2
  446. package/src/memory/jobs/embed-concept-page.ts +28 -2
  447. package/src/memory/jobs/embed-pkb-file.test.ts +2 -2
  448. package/src/memory/jobs-store.ts +114 -22
  449. package/src/memory/jobs-worker.ts +193 -106
  450. package/src/memory/memory-v2-activation-log-store.ts +33 -15
  451. package/src/memory/memory-v2-concept-frequency.ts +169 -0
  452. package/src/memory/migrations/237-heartbeat-runs.ts +45 -0
  453. package/src/memory/migrations/238-schedule-retry-policy.ts +20 -0
  454. package/src/memory/migrations/239-trace-events-created-at-index.ts +18 -0
  455. package/src/memory/migrations/index.ts +6 -0
  456. package/src/memory/migrations/registry.ts +8 -0
  457. package/src/memory/pkb/pkb-search.test.ts +6 -0
  458. package/src/memory/pkb/pkb-search.ts +7 -0
  459. package/src/memory/qdrant-client.ts +49 -32
  460. package/src/memory/rerank-local.ts +374 -0
  461. package/src/memory/schema/infrastructure.ts +15 -0
  462. package/src/memory/search/semantic.ts +13 -67
  463. package/src/memory/sparse-tokenize.ts +49 -0
  464. package/src/memory/trace-event-store.ts +1 -17
  465. package/src/memory/v2/__tests__/activation.test.ts +387 -344
  466. package/src/memory/v2/__tests__/consolidation-job.test.ts +40 -8
  467. package/src/memory/v2/__tests__/injection.test.ts +181 -169
  468. package/src/memory/v2/__tests__/prompts-consolidation.test.ts +61 -2
  469. package/src/memory/v2/__tests__/qdrant.test.ts +16 -0
  470. package/src/memory/v2/__tests__/reranker.test.ts +338 -0
  471. package/src/memory/v2/__tests__/sim.test.ts +154 -188
  472. package/src/memory/v2/__tests__/skill-store.test.ts +71 -65
  473. package/src/memory/v2/__tests__/sparse-bm25.test.ts +292 -0
  474. package/src/memory/v2/__tests__/static-context.test.ts +76 -2
  475. package/src/memory/v2/activation.ts +213 -239
  476. package/src/memory/v2/consolidation-job.ts +65 -17
  477. package/src/memory/v2/constants.ts +7 -0
  478. package/src/memory/v2/injection.ts +123 -103
  479. package/src/memory/v2/prompts/consolidation.ts +348 -92
  480. package/src/memory/v2/qdrant.ts +198 -1
  481. package/src/memory/v2/reranker.ts +177 -0
  482. package/src/memory/v2/sim.ts +113 -77
  483. package/src/memory/v2/skill-content.ts +4 -3
  484. package/src/memory/v2/skill-store.ts +91 -53
  485. package/src/memory/v2/sparse-bm25.ts +245 -0
  486. package/src/memory/v2/static-context.ts +28 -5
  487. package/src/memory/v2/types.ts +10 -10
  488. package/src/messaging/providers/gmail/types.ts +0 -49
  489. package/src/messaging/providers/slack/adapter.ts +1 -31
  490. package/src/messaging/providers/slack/types.ts +0 -32
  491. package/src/notifications/README.md +10 -10
  492. package/src/notifications/broadcaster.ts +1 -1
  493. package/src/notifications/copy-composer.ts +13 -0
  494. package/src/notifications/guardian-question-mode.ts +5 -5
  495. package/src/notifications/signal.ts +4 -0
  496. package/src/oauth/AGENTS.md +3 -1
  497. package/src/oauth/__tests__/oauth-connect-state.test.ts +137 -0
  498. package/src/oauth/connect-orchestrator.ts +6 -0
  499. package/src/oauth/connection-resolver.test.ts +66 -1
  500. package/src/oauth/connection-resolver.ts +55 -1
  501. package/src/oauth/credential-token-resolver.ts +1 -3
  502. package/src/oauth/manual-token-connection.ts +0 -4
  503. package/src/oauth/oauth-connect-state.ts +77 -0
  504. package/src/oauth/seed-providers.ts +58 -1
  505. package/src/outbound-proxy/index.ts +1 -37
  506. package/src/outbound-proxy/logging.ts +1 -1
  507. package/src/outbound-proxy/policy.ts +6 -5
  508. package/src/outbound-proxy/router.ts +2 -1
  509. package/src/permissions/approval-policy.test.ts +6 -275
  510. package/src/permissions/approval-policy.ts +0 -51
  511. package/src/permissions/checker.test.ts +0 -1
  512. package/src/permissions/checker.ts +3 -17
  513. package/src/permissions/gateway-threshold-reader.ts +2 -0
  514. package/src/permissions/prompter.ts +34 -1
  515. package/src/permissions/secret-prompter.ts +6 -2
  516. package/src/plugins/defaults/injectors.ts +35 -2
  517. package/src/plugins/defaults/memory-retrieval.ts +5 -6
  518. package/src/plugins/types.ts +7 -0
  519. package/src/proactive-artifact/aux-message-injector.ts +74 -0
  520. package/src/proactive-artifact/decision.test.ts +226 -0
  521. package/src/proactive-artifact/decision.ts +165 -0
  522. package/src/proactive-artifact/index.ts +7 -0
  523. package/src/proactive-artifact/job.test.ts +867 -0
  524. package/src/proactive-artifact/job.ts +352 -0
  525. package/src/proactive-artifact/message-copy.ts +41 -0
  526. package/src/proactive-artifact/trigger-state.test.ts +277 -0
  527. package/src/proactive-artifact/trigger-state.ts +119 -0
  528. package/src/prompts/bootstrap-cleanup.ts +27 -0
  529. package/src/prompts/normalize-onboarding.ts +80 -0
  530. package/src/prompts/persona-resolver.ts +101 -9
  531. package/src/prompts/system-prompt.ts +23 -24
  532. package/src/prompts/templates/BOOTSTRAP.md +13 -5
  533. package/src/prompts/templates/SOUL.md +13 -1
  534. package/src/providers/__tests__/retry-callsite.test.ts +222 -1
  535. package/src/providers/model-intents.ts +7 -0
  536. package/src/providers/openrouter/client.ts +8 -0
  537. package/src/providers/retry.ts +50 -0
  538. package/src/providers/speech-to-text/provider-catalog.ts +7 -8
  539. package/src/providers/types.ts +1 -0
  540. package/src/runtime/__tests__/agent-wake.test.ts +456 -3
  541. package/src/runtime/agent-wake.ts +238 -100
  542. package/src/runtime/assistant-event-hub.ts +151 -99
  543. package/src/runtime/auth/__tests__/middleware.test.ts +11 -56
  544. package/src/runtime/auth/__tests__/route-policy.test.ts +64 -0
  545. package/src/runtime/auth/middleware.ts +0 -96
  546. package/src/runtime/auth/route-policy.ts +32 -0
  547. package/src/runtime/auth/same-actor.ts +216 -0
  548. package/src/runtime/btw-sidechain.ts +2 -3
  549. package/src/runtime/channel-invite-transport.ts +2 -48
  550. package/src/runtime/channel-invite-transports/email.ts +1 -1
  551. package/src/runtime/channel-invite-transports/slack.ts +1 -1
  552. package/src/runtime/channel-invite-transports/telegram.ts +1 -1
  553. package/src/runtime/channel-invite-transports/voice.ts +1 -1
  554. package/src/runtime/channel-invite-transports/whatsapp.ts +1 -1
  555. package/src/runtime/channel-invite-types.ts +54 -0
  556. package/src/runtime/channel-readiness-service.ts +32 -13
  557. package/src/runtime/channel-retry-sweep.ts +65 -1
  558. package/src/runtime/guardian-reply-router.ts +10 -0
  559. package/src/runtime/http-server.ts +3 -329
  560. package/src/runtime/http-types.ts +0 -5
  561. package/src/runtime/local-actor-identity.ts +52 -11
  562. package/src/runtime/migrations/__tests__/vbundle-import-parity.test.ts +413 -0
  563. package/src/runtime/migrations/__tests__/vbundle-import-policy.test.ts +260 -0
  564. package/src/runtime/migrations/__tests__/vbundle-import-version-compat.test.ts +189 -0
  565. package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +153 -1
  566. package/src/runtime/migrations/__tests__/vbundle-symlink-importer.test.ts +451 -0
  567. package/src/runtime/migrations/__tests__/vbundle-symlink-streaming-importer.test.ts +0 -0
  568. package/src/runtime/migrations/__tests__/vbundle-symlink-streaming.test.ts +515 -0
  569. package/src/runtime/migrations/__tests__/vbundle-symlink-tar.test.ts +437 -0
  570. package/src/runtime/migrations/__tests__/vbundle-symlink-walker.test.ts +319 -0
  571. package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +51 -1
  572. package/src/runtime/migrations/migration-transport.ts +7 -7
  573. package/src/runtime/migrations/vbundle-builder.ts +327 -60
  574. package/src/runtime/migrations/vbundle-import-analyzer.ts +4 -4
  575. package/src/runtime/migrations/vbundle-import-policy.ts +172 -0
  576. package/src/runtime/migrations/vbundle-importer.ts +245 -68
  577. package/src/runtime/migrations/vbundle-streaming-importer.ts +326 -35
  578. package/src/runtime/migrations/vbundle-streaming-validator.ts +157 -4
  579. package/src/runtime/migrations/vbundle-tar-stream.ts +15 -6
  580. package/src/runtime/migrations/vbundle-validator.ts +114 -0
  581. package/src/runtime/pending-interactions.ts +43 -9
  582. package/src/runtime/routes/__tests__/backup-routes.test.ts +22 -150
  583. package/src/runtime/routes/__tests__/client-routes.test.ts +155 -0
  584. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +98 -5
  585. package/src/runtime/routes/__tests__/gateway-log-routes.test.ts +242 -0
  586. package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +112 -0
  587. package/src/runtime/routes/approval-interception-types.ts +13 -0
  588. package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +1 -1
  589. package/src/runtime/routes/backup-routes.ts +15 -38
  590. package/src/runtime/routes/btw-routes.ts +14 -37
  591. package/src/runtime/routes/client-routes.ts +21 -2
  592. package/src/runtime/routes/contact-prompt-routes.ts +183 -0
  593. package/src/runtime/routes/contact-routes.ts +0 -25
  594. package/src/runtime/routes/conversation-query-routes.ts +36 -1
  595. package/src/runtime/routes/conversation-routes.ts +65 -39
  596. package/src/runtime/routes/debug-bash-routes.ts +163 -0
  597. package/src/runtime/routes/disk-pressure-routes.ts +121 -0
  598. package/src/runtime/routes/document-pdf-renderer.ts +169 -0
  599. package/src/runtime/routes/documents-routes.ts +32 -75
  600. package/src/runtime/routes/errors.ts +19 -4
  601. package/src/runtime/routes/events-routes.ts +38 -0
  602. package/src/runtime/routes/gateway-log-routes.ts +79 -0
  603. package/src/runtime/routes/guardian-approval-interception.ts +2 -8
  604. package/src/runtime/routes/heartbeat-routes.ts +103 -38
  605. package/src/runtime/routes/host-app-control-routes.ts +134 -0
  606. package/src/runtime/routes/host-bash-routes.ts +56 -6
  607. package/src/runtime/routes/host-browser-routes.ts +108 -13
  608. package/src/runtime/routes/host-cu-routes.ts +66 -9
  609. package/src/runtime/routes/host-file-routes.ts +54 -5
  610. package/src/runtime/routes/host-transfer-routes.ts +122 -19
  611. package/src/runtime/routes/http-adapter.ts +1 -0
  612. package/src/runtime/routes/identity-intro-cache.ts +30 -0
  613. package/src/runtime/routes/identity-routes.ts +21 -180
  614. package/src/runtime/routes/inbound-message-handler.ts +78 -21
  615. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +0 -7
  616. package/src/runtime/routes/inbound-stages/edit-intercept.ts +0 -8
  617. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +3 -0
  618. package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +0 -20
  619. package/src/runtime/routes/inbound-stages/transcribe-audio.ts +5 -13
  620. package/src/runtime/routes/index.ts +14 -0
  621. package/src/runtime/routes/mcp-auth-routes.ts +132 -0
  622. package/src/runtime/routes/memory-item-routes.test.ts +41 -15
  623. package/src/runtime/routes/memory-item-routes.ts +10 -12
  624. package/src/runtime/routes/memory-v2-routes.ts +474 -1
  625. package/src/runtime/routes/migration-routes.ts +96 -0
  626. package/src/runtime/routes/oauth-connect-routes.ts +153 -0
  627. package/src/runtime/routes/schedule-routes.ts +7 -0
  628. package/src/runtime/verification-outbound-actions.ts +4 -4
  629. package/src/runtime/verification-templates.ts +4 -7
  630. package/src/schedule/integration-status.ts +66 -2
  631. package/src/schedule/recurrence-engine.ts +4 -1
  632. package/src/schedule/retry-backoff.ts +18 -0
  633. package/src/schedule/retry-policy.ts +82 -0
  634. package/src/schedule/run-script.ts +37 -5
  635. package/src/schedule/schedule-recovery.ts +64 -0
  636. package/src/schedule/schedule-store.ts +106 -2
  637. package/src/schedule/scheduler-types.ts +25 -0
  638. package/src/schedule/scheduler.ts +83 -39
  639. package/src/security/encrypted-store.ts +2 -0
  640. package/src/security/oauth-callback-registry.ts +8 -0
  641. package/src/security/secure-keys.ts +55 -0
  642. package/src/sequence/analytics.ts +5 -5
  643. package/src/sequence/engine.ts +1 -1
  644. package/src/skills/catalog-files.ts +2 -8
  645. package/src/skills/include-graph.ts +5 -5
  646. package/src/skills/remote-skill-policy.ts +10 -16
  647. package/src/skills/skill-file-provider.ts +1 -1
  648. package/src/skills/skill-file-types.ts +13 -0
  649. package/src/skills/skillssh-audit-types.ts +28 -0
  650. package/src/skills/skillssh-registry.ts +8 -21
  651. package/src/subagent/index.ts +1 -7
  652. package/src/subagent/manager.ts +1 -15
  653. package/src/tasks/task-runner.ts +0 -1
  654. package/src/tasks/task-store.ts +0 -3
  655. package/src/telemetry/types.ts +2 -0
  656. package/src/telemetry/usage-telemetry-reporter.test.ts +21 -0
  657. package/src/telemetry/usage-telemetry-reporter.ts +1 -0
  658. package/src/tools/app-control/skill-proxy-bridge.ts +28 -0
  659. package/src/tools/apps/executors.ts +56 -69
  660. package/src/tools/background-tool-registry.ts +17 -3
  661. package/src/tools/browser/__tests__/browser-status.test.ts +21 -18
  662. package/src/tools/browser/browser-execution.ts +2 -2
  663. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +55 -4
  664. package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +12 -6
  665. package/src/tools/browser/cdp-client/factory.ts +23 -24
  666. package/src/tools/browser/cdp-client/index.ts +1 -14
  667. package/src/tools/computer-use/definitions.ts +42 -20
  668. package/src/tools/executor.ts +2 -0
  669. package/src/tools/host-filesystem/edit.test.ts +151 -0
  670. package/src/tools/host-filesystem/edit.ts +68 -0
  671. package/src/tools/host-filesystem/read.test.ts +129 -0
  672. package/src/tools/host-filesystem/read.ts +68 -0
  673. package/src/tools/host-filesystem/transfer.test.ts +127 -2
  674. package/src/tools/host-filesystem/transfer.ts +78 -3
  675. package/src/tools/host-filesystem/write.test.ts +134 -0
  676. package/src/tools/host-filesystem/write.ts +68 -0
  677. package/src/tools/host-terminal/host-shell.ts +66 -1
  678. package/src/tools/mcp/mcp-tool-factory.ts +2 -1
  679. package/src/tools/memory/register.test.ts +12 -9
  680. package/src/tools/memory/register.ts +1 -2
  681. package/src/tools/provider-tool-name.ts +28 -0
  682. package/src/tools/registry.ts +30 -9
  683. package/src/tools/schedule/create.ts +6 -0
  684. package/src/tools/schedule/list.ts +2 -0
  685. package/src/tools/schedule/update.ts +10 -0
  686. package/src/tools/shared/filesystem/file-ops-service.ts +2 -0
  687. package/src/tools/shared/filesystem/path-policy.ts +25 -1
  688. package/src/tools/skills/load.ts +0 -32
  689. package/src/tools/terminal/shell.ts +9 -1
  690. package/src/tools/tool-approval-handler.ts +32 -11
  691. package/src/tools/types.ts +28 -2
  692. package/src/tts/provider-catalog.ts +3 -5
  693. package/src/usage/pricing.ts +1 -1
  694. package/src/util/disk-usage.ts +138 -0
  695. package/src/util/platform.ts +21 -11
  696. package/src/util/process-liveness.ts +26 -0
  697. package/src/workspace/hatched-date.ts +86 -0
  698. package/src/workspace/heartbeat-service.ts +19 -0
  699. package/src/workspace/migrations/003-seed-device-id.ts +1 -1
  700. package/src/workspace/migrations/006-services-config.ts +8 -5
  701. package/src/workspace/migrations/016-extract-feature-flags-to-protected.ts +3 -9
  702. package/src/workspace/migrations/021-move-signals-to-workspace.ts +4 -10
  703. package/src/workspace/migrations/022-move-hooks-to-workspace.ts +4 -10
  704. package/src/workspace/migrations/023-move-config-files-to-workspace.ts +4 -11
  705. package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +3 -10
  706. package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +3 -2
  707. package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +2 -1
  708. package/src/workspace/migrations/059-move-pid-to-workspace.ts +3 -8
  709. package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +3 -8
  710. package/src/workspace/migrations/065-bump-stale-heartbeat-interval.ts +60 -0
  711. package/src/workspace/migrations/066-seed-heartbeat-callsite-cost-default.ts +146 -0
  712. package/src/workspace/migrations/067-release-notes-safe-storage-limits.ts +72 -0
  713. package/src/workspace/migrations/068-release-notes-local-timezone.ts +65 -0
  714. package/src/workspace/migrations/AGENTS.md +1 -1
  715. package/src/workspace/migrations/migrate-to-workspace-volume.ts +4 -10
  716. package/src/workspace/migrations/registry.ts +8 -0
  717. package/src/workspace/migrations/utils.ts +21 -0
  718. package/src/__tests__/conversation-tool-setup-memory-scope.test.ts +0 -167
  719. package/src/__tests__/host-browser-e2e-cloud.test.ts +0 -443
  720. package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +0 -226
  721. package/src/__tests__/host-browser-ws-events-e2e.test.ts +0 -427
  722. package/src/__tests__/twilio-rest.test.ts +0 -34
  723. package/src/backup/__tests__/backup-key.test.ts +0 -152
  724. package/src/backup/__tests__/backup-worker.test.ts +0 -782
  725. package/src/backup/__tests__/offsite-writer.test.ts +0 -641
  726. package/src/backup/__tests__/stream-crypt.test.ts +0 -228
  727. package/src/backup/backup-key.ts +0 -137
  728. package/src/backup/backup-worker.ts +0 -472
  729. package/src/backup/offsite-writer.ts +0 -222
  730. package/src/backup/stream-crypt.ts +0 -263
  731. package/src/daemon/message-types/pairing.ts +0 -58
  732. package/src/memory/v2/__tests__/skill-qdrant.test.ts +0 -657
  733. package/src/memory/v2/skill-qdrant.ts +0 -395
  734. package/src/outbound-proxy/config.ts +0 -20
  735. package/src/outbound-proxy/health.ts +0 -18
  736. package/src/outbound-proxy/types.ts +0 -150
  737. package/src/runtime/capability-tokens.ts +0 -190
  738. package/src/signals/bash.ts +0 -198
  739. package/src/signals/mcp-reload.ts +0 -18
@@ -7,6 +7,7 @@ import {
7
7
  } from "node:fs";
8
8
  import { basename, dirname, join } from "node:path";
9
9
 
10
+ import { safeStatSync } from "../util/fs.js";
10
11
  import { getLogger } from "../util/logger.js";
11
12
  import {
12
13
  ensureDataDir,
@@ -22,8 +23,22 @@ export { API_KEY_PROVIDERS } from "../providers/provider-secret-catalog.js";
22
23
  const log = getLogger("config");
23
24
 
24
25
  let cached: AssistantConfig | null = null;
26
+ let cachedFileSignature: ConfigFileSignature | null = null;
25
27
  let loading = false;
26
28
 
29
+ type ConfigFileSignature =
30
+ | {
31
+ path: string;
32
+ exists: true;
33
+ size: number;
34
+ mtimeMs: number;
35
+ ctimeMs: number;
36
+ }
37
+ | {
38
+ path: string;
39
+ exists: false;
40
+ };
41
+
27
42
  function getConfigPath(): string {
28
43
  return getWorkspaceConfigPath();
29
44
  }
@@ -32,6 +47,48 @@ function ensureMigratedDataDir(): void {
32
47
  ensureDataDir();
33
48
  }
34
49
 
50
+ function readConfigFileSignature(configPath: string): ConfigFileSignature {
51
+ const stats = safeStatSync(configPath);
52
+ if (!stats) {
53
+ return {
54
+ path: configPath,
55
+ exists: false,
56
+ };
57
+ }
58
+
59
+ return {
60
+ path: configPath,
61
+ exists: true,
62
+ size: stats.size,
63
+ mtimeMs: stats.mtimeMs,
64
+ ctimeMs: stats.ctimeMs,
65
+ };
66
+ }
67
+
68
+ function configFileSignaturesEqual(
69
+ a: ConfigFileSignature,
70
+ b: ConfigFileSignature,
71
+ ): boolean {
72
+ if (a.path !== b.path || a.exists !== b.exists) return false;
73
+ if (!a.exists || !b.exists) return true;
74
+ return (
75
+ a.size === b.size && a.mtimeMs === b.mtimeMs && a.ctimeMs === b.ctimeMs
76
+ );
77
+ }
78
+
79
+ function getCachedConfigIfFresh(): AssistantConfig | null {
80
+ if (!cached || !cachedFileSignature) return null;
81
+
82
+ const currentSignature = readConfigFileSignature(getConfigPath());
83
+ if (configFileSignaturesEqual(cachedFileSignature, currentSignature)) {
84
+ return cached;
85
+ }
86
+
87
+ cached = null;
88
+ cachedFileSignature = null;
89
+ return null;
90
+ }
91
+
35
92
  /**
36
93
  * Parse a raw config through the Zod schema, applying all nested defaults.
37
94
  *
@@ -49,6 +106,38 @@ function cloneDefaultConfig(): AssistantConfig {
49
106
  return applyNestedDefaults({});
50
107
  }
51
108
 
109
+ /**
110
+ * Returns deployment-context-aware config defaults that override schema
111
+ * defaults for platform-managed assistants. Only applied when initializing
112
+ * a fresh config (config.json does not yet exist).
113
+ *
114
+ * IS_PLATFORM is set by the Vellum platform launcher for all hosted
115
+ * assistant deployments. Local, Docker, and bare-metal assistants are
116
+ * unaffected.
117
+ */
118
+ function getDeploymentContextDefaults(): Record<string, unknown> {
119
+ if (process.env.IS_PLATFORM !== "true" && process.env.IS_PLATFORM !== "1") {
120
+ return {};
121
+ }
122
+ const managed = { mode: "managed" as const };
123
+ return {
124
+ services: {
125
+ inference: managed,
126
+ "image-generation": managed,
127
+ "web-search": managed,
128
+ "google-oauth": managed,
129
+ "outlook-oauth": managed,
130
+ "linear-oauth": managed,
131
+ "github-oauth": managed,
132
+ "notion-oauth": managed,
133
+ "asana-oauth": managed,
134
+ "todoist-oauth": managed,
135
+ "discord-oauth": managed,
136
+ "hubspot-oauth": managed,
137
+ },
138
+ };
139
+ }
140
+
52
141
  /**
53
142
  * Build a filesystem-safe ISO-8601 timestamp for use in quarantine filenames.
54
143
  * Replaces `:` (invalid on Windows, confusing on macOS Finder) with `-` so the
@@ -237,6 +326,11 @@ const DEPRECATED_FIELDS: Record<string, string> = {
237
326
  "permissions.autoApproveUpTo":
238
327
  "permissions.autoApproveUpTo has been removed. The gateway now controls all " +
239
328
  "auto-approve thresholds. The field will be removed from your config file.",
329
+ "memory.jobs.batchSize":
330
+ "memory.jobs.batchSize has been removed. The memory job worker now uses " +
331
+ "per-lane concurrency caps (slowLlmConcurrency, fastConcurrency, " +
332
+ "embedConcurrency) instead of a single batch size. " +
333
+ "The field will be removed from your config file.",
240
334
  };
241
335
 
242
336
  /**
@@ -289,42 +383,6 @@ function deleteNestedKeyByDotPath(
289
383
  deleteNestedKey(obj, keys);
290
384
  }
291
385
 
292
- /**
293
- * Deep-merge missing keys from `defaults` into `target`.
294
- * Only adds keys that do not already exist in `target`; never overwrites.
295
- * Returns true if any key was added.
296
- */
297
- export function deepMergeMissing(
298
- target: Record<string, unknown>,
299
- defaults: Record<string, unknown>,
300
- ): boolean {
301
- let changed = false;
302
- for (const key of Object.keys(defaults)) {
303
- if (!(key in target)) {
304
- target[key] = defaults[key];
305
- changed = true;
306
- } else if (
307
- defaults[key] != null &&
308
- typeof defaults[key] === "object" &&
309
- !Array.isArray(defaults[key]) &&
310
- target[key] != null &&
311
- typeof target[key] === "object" &&
312
- !Array.isArray(target[key])
313
- ) {
314
- // Recurse into nested objects
315
- if (
316
- deepMergeMissing(
317
- target[key] as Record<string, unknown>,
318
- defaults[key] as Record<string, unknown>,
319
- )
320
- ) {
321
- changed = true;
322
- }
323
- }
324
- }
325
- return changed;
326
- }
327
-
328
386
  /**
329
387
  * Recursively strip `null` leaves from a plain-object value, returning a
330
388
  * deep clone with all `null`-valued keys removed at every nesting level.
@@ -346,6 +404,13 @@ function stripNullLeaves(value: unknown): unknown {
346
404
  return out;
347
405
  }
348
406
 
407
+ function readPlainObject(value: unknown): Record<string, unknown> | null {
408
+ if (value == null || typeof value !== "object" || Array.isArray(value)) {
409
+ return null;
410
+ }
411
+ return value as Record<string, unknown>;
412
+ }
413
+
349
414
  /**
350
415
  * Deep-merge `overrides` into `target`, overwriting leaf values.
351
416
  * Recursively merges nested objects; scalars and arrays from `overrides`
@@ -409,51 +474,32 @@ export function deepMergeOverwrite(
409
474
  }
410
475
  }
411
476
 
412
- /**
413
- * Read the existing config.json from disk, merge any missing schema-default
414
- * keys, and rewrite only when there is an effective change.
415
- */
416
- function backfillConfigDefaults(
417
- configPath: string,
418
- fullDefaults: Record<string, unknown>,
419
- ): void {
420
- let raw: unknown;
421
- try {
422
- raw = JSON.parse(readFileSync(configPath, "utf-8"));
423
- } catch {
424
- return; // Unreadable file — skip backfill
425
- }
426
-
427
- // Only backfill into plain objects (not arrays, strings, etc.)
428
- if (raw == null || typeof raw !== "object" || Array.isArray(raw)) {
429
- return;
430
- }
477
+ export type DefaultWorkspaceConfigMergeResult = {
478
+ providedLlmProfileNames: Set<string>;
479
+ providedLlmActiveProfile: boolean;
480
+ };
431
481
 
432
- deepMergeMissing(raw as Record<string, unknown>, fullDefaults);
433
- // Compare serialized JSON to decide whether a write is needed.
434
- // deepMergeMissing can report false-positive mutations (e.g. setting a key
435
- // to a value identical to what was already there), so comparing the final
436
- // JSON avoids a hot-loop where writing triggers the config-watcher which
437
- // reloads and backfills again endlessly.
438
- const newJson = JSON.stringify(raw, null, 2) + "\n";
439
- const existingJson = readFileSync(configPath, "utf-8");
440
- if (newJson !== existingJson) {
441
- writeFileSync(configPath, newJson);
442
- log.info("Backfilled missing config defaults in %s", configPath);
443
- }
482
+ function emptyDefaultWorkspaceConfigMergeResult(): DefaultWorkspaceConfigMergeResult {
483
+ return {
484
+ providedLlmProfileNames: new Set(),
485
+ providedLlmActiveProfile: false,
486
+ };
444
487
  }
445
488
 
446
489
  /**
447
490
  * Merge default workspace config from the file referenced by
448
491
  * VELLUM_DEFAULT_WORKSPACE_CONFIG_PATH into the workspace config on disk.
449
492
  *
450
- * Called once at daemon startup (before the first loadConfig()) so the
451
- * defaults are persisted to the workspace config file alongside any
452
- * schema-level defaults that loadConfig() backfills.
493
+ * Called once at daemon startup (before the first loadConfig()) so platform
494
+ * overrides are persisted to disk before the daemon's first config read.
495
+ * Schema defaults are no longer materialized into the file on load — the
496
+ * in-memory `loadConfig()` cache applies them at access time instead.
453
497
  */
454
- export function mergeDefaultWorkspaceConfig(): void {
498
+ export function mergeDefaultWorkspaceConfig(): DefaultWorkspaceConfigMergeResult {
455
499
  const defaultConfigPath = process.env.VELLUM_DEFAULT_WORKSPACE_CONFIG_PATH;
456
- if (!defaultConfigPath || !existsSync(defaultConfigPath)) return;
500
+ if (!defaultConfigPath || !existsSync(defaultConfigPath)) {
501
+ return emptyDefaultWorkspaceConfigMergeResult();
502
+ }
457
503
 
458
504
  let defaults: unknown;
459
505
  try {
@@ -464,7 +510,7 @@ export function mergeDefaultWorkspaceConfig(): void {
464
510
  "Failed to read default workspace config from %s",
465
511
  defaultConfigPath,
466
512
  );
467
- return;
513
+ return emptyDefaultWorkspaceConfigMergeResult();
468
514
  }
469
515
 
470
516
  if (
@@ -472,16 +518,44 @@ export function mergeDefaultWorkspaceConfig(): void {
472
518
  typeof defaults !== "object" ||
473
519
  Array.isArray(defaults)
474
520
  ) {
475
- return;
521
+ return emptyDefaultWorkspaceConfigMergeResult();
476
522
  }
477
523
 
524
+ const llmDefaults = readPlainObject(
525
+ (defaults as Record<string, unknown>).llm,
526
+ );
527
+ const providedProfiles = readPlainObject(llmDefaults?.profiles);
528
+ const mergeResult: DefaultWorkspaceConfigMergeResult = {
529
+ providedLlmProfileNames: new Set(
530
+ providedProfiles ? Object.keys(providedProfiles) : [],
531
+ ),
532
+ providedLlmActiveProfile:
533
+ llmDefaults != null &&
534
+ Object.prototype.hasOwnProperty.call(llmDefaults, "activeProfile"),
535
+ };
536
+
478
537
  const configPath = getConfigPath();
479
538
  let existing: Record<string, unknown> = {};
480
539
  if (existsSync(configPath)) {
481
540
  try {
482
541
  existing = JSON.parse(readFileSync(configPath, "utf-8"));
483
- } catch {
484
- // If existing config is corrupt, start fresh
542
+ } catch (err) {
543
+ quarantineCorruptConfig(configPath, err);
544
+ // After preserving the corrupt file, start fresh so the default overlay
545
+ // can still initialize a valid config for this startup.
546
+ }
547
+ }
548
+
549
+ if (mergeResult.providedLlmProfileNames.size > 0) {
550
+ // Default-config profile entries are authoritative fragments. Remove any
551
+ // old same-name profile first so recursive merge does not leave stale
552
+ // provider-specific leaves behind.
553
+ const existingLlm = readPlainObject(existing.llm);
554
+ const existingProfiles = readPlainObject(existingLlm?.profiles);
555
+ if (existingProfiles) {
556
+ for (const name of mergeResult.providedLlmProfileNames) {
557
+ delete existingProfiles[name];
558
+ }
485
559
  }
486
560
  }
487
561
 
@@ -492,6 +566,7 @@ export function mergeDefaultWorkspaceConfig(): void {
492
566
  mkdirSync(dir, { recursive: true });
493
567
  }
494
568
  writeFileSync(configPath, JSON.stringify(existing, null, 2) + "\n");
569
+ invalidateConfigCache();
495
570
 
496
571
  // Move the temp file into the workspace directory as a permanent record.
497
572
  // This prevents re-application on daemon restart (the env var still points
@@ -507,10 +582,13 @@ export function mergeDefaultWorkspaceConfig(): void {
507
582
  } catch {
508
583
  log.info("Merged default workspace config from %s", defaultConfigPath);
509
584
  }
585
+
586
+ return mergeResult;
510
587
  }
511
588
 
512
589
  export function loadConfig(): AssistantConfig {
513
- if (cached) return cached;
590
+ const freshCached = getCachedConfigIfFresh();
591
+ if (freshCached) return freshCached;
514
592
 
515
593
  // Re-entrancy guard: log calls during loading (e.g. file-mode warning)
516
594
  // can trigger loadConfig again. Return defaults to break the cycle
@@ -587,35 +665,56 @@ export function loadConfig(): AssistantConfig {
587
665
  }
588
666
  }
589
667
 
590
- // If the config file didn't exist, write the full defaults to disk so
591
- // users can discover and edit all available options.
592
- // If it existed, backfill any missing schema keys from defaults without
593
- // overwriting existing user values.
594
- try {
595
- const dir = dirname(configPath);
596
- if (!existsSync(dir)) {
597
- mkdirSync(dir, { recursive: true });
598
- }
599
- // Strip dataDir (runtime-derived) from the persisted config
600
- const { dataDir: _, ...persistable } = config;
601
-
602
- if (!configFileExisted) {
668
+ // First-launch seed only: when config.json does not exist, write the full
669
+ // schema defaults to disk so users can discover and edit all available
670
+ // options. When the file already exists, leave it alone disk represents
671
+ // user intent, while the in-memory `cached: AssistantConfig` (above) has
672
+ // all schema defaults applied via `applyNestedDefaults`/`validateWithSchema`,
673
+ // so consumers calling `getConfig().memory.v2.bm25_b` continue to receive
674
+ // the schema default whenever the field is absent on disk.
675
+ //
676
+ // The previous behavior — eagerly merging missing keys back into the file
677
+ // on every load silently baked stale defaults into existing users'
678
+ // config.json. Once a default landed in the file, future schema-default
679
+ // changes were inert because the merge only filled absent keys and never
680
+ // reconciled existing values. Contract: disk = user intent, in-memory
681
+ // cache = effective values.
682
+ if (!configFileExisted) {
683
+ try {
684
+ const dir = dirname(configPath);
685
+ if (!existsSync(dir)) {
686
+ mkdirSync(dir, { recursive: true });
687
+ }
688
+ // Strip dataDir (runtime-derived) from the persisted config
689
+ const { dataDir: _, ...persistable } = config;
690
+
691
+ // Layer deployment context defaults on top of schema defaults.
692
+ // These are overrides the daemon derives from its environment (e.g.
693
+ // IS_PLATFORM → all service modes = "managed"). Schema defaults
694
+ // remain the fallback for non-platform deployments.
695
+ const contextDefaults = getDeploymentContextDefaults();
696
+ if (Object.keys(contextDefaults).length > 0) {
697
+ deepMergeOverwrite(
698
+ persistable as Record<string, unknown>,
699
+ contextDefaults,
700
+ );
701
+ }
603
702
  writeFileSync(configPath, JSON.stringify(persistable, null, 2) + "\n");
604
703
  log.info("Wrote default config to %s", configPath);
605
- } else {
606
- backfillConfigDefaults(configPath, persistable);
704
+ } catch (err) {
705
+ log.warn({ err }, "Failed to write default config file");
607
706
  }
608
- } catch (err) {
609
- log.warn({ err }, "Failed to write/backfill config file");
610
707
  }
611
708
 
612
709
  cached = config;
710
+ cachedFileSignature = readConfigFileSignature(configPath);
613
711
 
614
712
  loading = false;
615
713
  return config;
616
714
  } catch (err) {
617
715
  // Loading failed — clear cached so the next call retries
618
716
  cached = null;
717
+ cachedFileSignature = null;
619
718
  loading = false;
620
719
  throw err;
621
720
  }
@@ -636,15 +735,6 @@ function isManagedGeminiFFEnabled(config: AssistantConfig): boolean {
636
735
  }
637
736
  }
638
737
 
639
- export function saveConfig(config: AssistantConfig): void {
640
- ensureMigratedDataDir();
641
- const configPath = getConfigPath();
642
-
643
- writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
644
-
645
- cached = config;
646
- }
647
-
648
738
  export function getConfig(): AssistantConfig {
649
739
  return loadConfig();
650
740
  }
@@ -658,7 +748,8 @@ export function getConfig(): AssistantConfig {
658
748
  * workspace-existence check runs.
659
749
  */
660
750
  export function getConfigReadOnly(): AssistantConfig {
661
- if (cached) return cached;
751
+ const freshCached = getCachedConfigIfFresh();
752
+ if (freshCached) return freshCached;
662
753
 
663
754
  const configPath = getConfigPath();
664
755
  let fileConfig: Record<string, unknown> = {};
@@ -675,6 +766,7 @@ export function getConfigReadOnly(): AssistantConfig {
675
766
 
676
767
  export function invalidateConfigCache(): void {
677
768
  cached = null;
769
+ cachedFileSignature = null;
678
770
  loading = false;
679
771
  }
680
772
 
@@ -712,6 +804,7 @@ export function saveRawConfig(config: Record<string, unknown>): void {
712
804
  writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
713
805
 
714
806
  cached = null; // invalidate cache
807
+ cachedFileSignature = null;
715
808
  }
716
809
 
717
810
  export function getNestedValue(
@@ -5,6 +5,7 @@
5
5
  * Fields removed or reset:
6
6
  * - `ingress.publicBaseUrl` → set to `""`
7
7
  * - `ingress.enabled` → deleted
8
+ * - `ingress.publicBaseUrlManagedBy` → deleted
8
9
  * - `daemon` → deleted entirely
9
10
  * - `skills.load.extraDirs` → set to `[]`
10
11
  * - `hostBrowser.cdpInspect.desktopAuto` → deleted **only when the source
@@ -41,6 +42,7 @@ export function sanitizeConfigForTransfer(configJson: string): string {
41
42
  const ingress = config.ingress as Record<string, unknown>;
42
43
  ingress.publicBaseUrl = "";
43
44
  delete ingress.enabled;
45
+ delete ingress.publicBaseUrlManagedBy;
44
46
  }
45
47
 
46
48
  // Strip daemon entirely
@@ -0,0 +1,80 @@
1
+ import { describe, expect, test } from "bun:test";
2
+
3
+ import { MemoryJobsConfigSchema } from "../memory-lifecycle.js";
4
+
5
+ describe("MemoryJobsConfigSchema", () => {
6
+ test("parses an empty object to documented defaults", () => {
7
+ const parsed = MemoryJobsConfigSchema.parse({});
8
+ expect(parsed).toEqual({
9
+ workerConcurrency: 2,
10
+ stalledJobTimeoutMs: 30 * 60 * 1000,
11
+ slowLlmConcurrency: 1,
12
+ fastConcurrency: 2,
13
+ embedConcurrency: 2,
14
+ });
15
+ });
16
+
17
+ test("derives lane caps from workerConcurrency when only it is set", () => {
18
+ const parsed = MemoryJobsConfigSchema.parse({ workerConcurrency: 4 });
19
+ expect(parsed.workerConcurrency).toBe(4);
20
+ expect(parsed.slowLlmConcurrency).toBe(2);
21
+ expect(parsed.fastConcurrency).toBe(4);
22
+ expect(parsed.embedConcurrency).toBe(4);
23
+ });
24
+
25
+ test("floors and clamps slowLlmConcurrency to at least 1 when deriving", () => {
26
+ const parsed = MemoryJobsConfigSchema.parse({ workerConcurrency: 1 });
27
+ expect(parsed.slowLlmConcurrency).toBe(1);
28
+ expect(parsed.fastConcurrency).toBe(1);
29
+ expect(parsed.embedConcurrency).toBe(1);
30
+ });
31
+
32
+ test("explicit lane cap overrides the derivation", () => {
33
+ const parsed = MemoryJobsConfigSchema.parse({
34
+ workerConcurrency: 4,
35
+ slowLlmConcurrency: 1,
36
+ });
37
+ expect(parsed.slowLlmConcurrency).toBe(1);
38
+ expect(parsed.fastConcurrency).toBe(4);
39
+ expect(parsed.embedConcurrency).toBe(4);
40
+ });
41
+
42
+ test("explicit lane caps without workerConcurrency keep workerConcurrency default", () => {
43
+ const parsed = MemoryJobsConfigSchema.parse({
44
+ slowLlmConcurrency: 3,
45
+ fastConcurrency: 5,
46
+ embedConcurrency: 7,
47
+ });
48
+ expect(parsed.workerConcurrency).toBe(2);
49
+ expect(parsed.slowLlmConcurrency).toBe(3);
50
+ expect(parsed.fastConcurrency).toBe(5);
51
+ expect(parsed.embedConcurrency).toBe(7);
52
+ });
53
+
54
+ test.each([
55
+ "slowLlmConcurrency",
56
+ "fastConcurrency",
57
+ "embedConcurrency",
58
+ "workerConcurrency",
59
+ ] as const)("rejects %s = 0", (field) => {
60
+ expect(() => MemoryJobsConfigSchema.parse({ [field]: 0 })).toThrow();
61
+ });
62
+
63
+ test.each([
64
+ "slowLlmConcurrency",
65
+ "fastConcurrency",
66
+ "embedConcurrency",
67
+ "workerConcurrency",
68
+ ] as const)("rejects negative %s", (field) => {
69
+ expect(() => MemoryJobsConfigSchema.parse({ [field]: -1 })).toThrow();
70
+ });
71
+
72
+ test.each([
73
+ "slowLlmConcurrency",
74
+ "fastConcurrency",
75
+ "embedConcurrency",
76
+ "workerConcurrency",
77
+ ] as const)("rejects non-integer %s", (field) => {
78
+ expect(() => MemoryJobsConfigSchema.parse({ [field]: 1.5 })).toThrow();
79
+ });
80
+ });
@@ -7,7 +7,7 @@ describe("MemoryV2ConfigSchema", () => {
7
7
  test("parses an empty object to documented defaults", () => {
8
8
  const parsed = MemoryV2ConfigSchema.parse({});
9
9
  expect(parsed).toEqual({
10
- enabled: false,
10
+ enabled: true,
11
11
  sweep_enabled: false,
12
12
  d: 0.3,
13
13
  c_user: 0.3,
@@ -15,14 +15,23 @@ describe("MemoryV2ConfigSchema", () => {
15
15
  c_now: 0.2,
16
16
  k: 0.5,
17
17
  hops: 2,
18
- top_k: 20,
19
- top_k_skills: 5,
18
+ top_k: 25,
19
+ ann_candidate_limit: null,
20
20
  epsilon: 0.01,
21
- dense_weight: 0.7,
22
- sparse_weight: 0.3,
21
+ dense_weight: 0.85,
22
+ sparse_weight: 0.15,
23
+ bm25_k1: 1.2,
24
+ bm25_b: 0.4,
23
25
  consolidation_interval_hours: 4,
24
26
  max_page_chars: 5000,
25
27
  consolidation_prompt_path: null,
28
+ rerank: {
29
+ enabled: false,
30
+ top_k: 50,
31
+ alpha: 0.3,
32
+ model: "Alibaba-NLP/gte-reranker-modernbert-base",
33
+ dtype: "q8",
34
+ },
26
35
  });
27
36
  });
28
37
 
@@ -152,12 +161,11 @@ describe("MemoryConfigSchema integration with v2 block", () => {
152
161
  test("parses an empty memory config and includes a v2 block with defaults", () => {
153
162
  const parsed = MemoryConfigSchema.parse({});
154
163
  expect(parsed.v2).toBeDefined();
155
- expect(parsed.v2.enabled).toBe(false);
164
+ expect(parsed.v2.enabled).toBe(true);
156
165
  expect(parsed.v2.sweep_enabled).toBe(false);
157
166
  expect(parsed.v2.d).toBe(0.3);
158
- expect(parsed.v2.dense_weight).toBe(0.7);
159
- expect(parsed.v2.sparse_weight).toBe(0.3);
160
- expect(parsed.v2.top_k_skills).toBe(5);
167
+ expect(parsed.v2.dense_weight).toBe(0.85);
168
+ expect(parsed.v2.sparse_weight).toBe(0.15);
161
169
  expect(parsed.v2.consolidation_interval_hours).toBe(4);
162
170
  expect(parsed.v2.max_page_chars).toBe(5000);
163
171
  });
@@ -264,6 +264,20 @@ const CATALOG_RECORD: CatalogRecord = {
264
264
  description: "General-purpose LLM inference call site for skill use.",
265
265
  domain: "skills",
266
266
  },
267
+ proactiveArtifactDecision: {
268
+ id: "proactiveArtifactDecision",
269
+ displayName: "Proactive Artifact Decision",
270
+ description:
271
+ "Decides what personalized artifact to build for new users based on conversation context.",
272
+ domain: "agentLoop",
273
+ },
274
+ proactiveArtifactBuild: {
275
+ id: "proactiveArtifactBuild",
276
+ displayName: "Proactive Artifact Build",
277
+ description:
278
+ "Builds the personalized artifact in a background conversation with tool access.",
279
+ domain: "agentLoop",
280
+ },
267
281
  };
268
282
 
269
283
  // Source of truth for call-site display metadata. API responses and usage
@@ -232,12 +232,3 @@ export const CallsConfigSchema = z
232
232
  .describe(
233
233
  "Phone call configuration — controls telephony, voice, safety, and call behavior",
234
234
  );
235
-
236
- export type CallsConfig = z.infer<typeof CallsConfigSchema>;
237
- export type CallsDisclosureConfig = z.infer<typeof CallsDisclosureConfigSchema>;
238
- export type CallsSafetyConfig = z.infer<typeof CallsSafetyConfigSchema>;
239
- export type CallsVoiceConfig = z.infer<typeof CallsVoiceConfigSchema>;
240
- export type CallerIdentityConfig = z.infer<typeof CallerIdentityConfigSchema>;
241
- export type CallsVerificationConfig = z.infer<
242
- typeof CallsVerificationConfigSchema
243
- >;
@@ -121,8 +121,3 @@ export const SlackConfigSchema = z
121
121
  .describe("Slack bot display name"),
122
122
  })
123
123
  .describe("Slack channel configuration");
124
-
125
- export type TwilioConfig = z.infer<typeof TwilioConfigSchema>;
126
- export type WhatsAppConfig = z.infer<typeof WhatsAppConfigSchema>;
127
- export type TelegramConfig = z.infer<typeof TelegramConfigSchema>;
128
- export type SlackConfig = z.infer<typeof SlackConfigSchema>;