@vellumai/assistant 0.7.1 → 0.7.2

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 (535) hide show
  1. package/ARCHITECTURE.md +32 -49
  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/security.md +20 -0
  7. package/docs/plugins.md +7 -9
  8. package/knip.json +1 -0
  9. package/node_modules/@vellumai/gateway-client/src/index.ts +1 -0
  10. package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +39 -1
  11. package/node_modules/@vellumai/gateway-client/src/types.ts +11 -0
  12. package/node_modules/@vellumai/service-contracts/package.json +2 -0
  13. package/node_modules/@vellumai/service-contracts/src/__tests__/contracts.test.ts +4 -0
  14. package/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +107 -0
  15. package/node_modules/@vellumai/service-contracts/src/index.ts +5 -1
  16. package/node_modules/@vellumai/service-contracts/src/ingress.ts +24 -0
  17. package/node_modules/@vellumai/service-contracts/src/twilio-ingress.ts +84 -0
  18. package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +9 -0
  19. package/node_modules/@vellumai/twilio-client/bun.lock +24 -0
  20. package/node_modules/@vellumai/twilio-client/package.json +18 -0
  21. package/node_modules/@vellumai/twilio-client/src/__tests__/twilio-client.test.ts +128 -0
  22. package/node_modules/@vellumai/twilio-client/src/index.ts +179 -0
  23. package/node_modules/@vellumai/twilio-client/tsconfig.json +20 -0
  24. package/openapi.yaml +565 -12
  25. package/package.json +6 -3
  26. package/src/__tests__/app-builder-tool-scripts.test.ts +3 -3
  27. package/src/__tests__/app-bundler.test.ts +170 -1
  28. package/src/__tests__/app-control-flow.test.ts +374 -0
  29. package/src/__tests__/app-control-no-global-cgevent.test.ts +98 -0
  30. package/src/__tests__/app-control-tool-schemas.test.ts +621 -0
  31. package/src/__tests__/app-executors.test.ts +30 -43
  32. package/src/__tests__/approval-routes-http.test.ts +23 -6
  33. package/src/__tests__/assistant-event-hub-machine-name.test.ts +146 -0
  34. package/src/__tests__/assistant-event-hub-targeted.test.ts +257 -0
  35. package/src/__tests__/assistant-event-hub.test.ts +109 -2
  36. package/src/__tests__/assistant-event.test.ts +10 -0
  37. package/src/__tests__/assistant-events-sse-hardening.test.ts +7 -2
  38. package/src/__tests__/assistant-feature-flags-integration.test.ts +11 -7
  39. package/src/__tests__/background-shell-host-bash.test.ts +14 -15
  40. package/src/__tests__/bootstrap-turn-cleanup.test.ts +44 -0
  41. package/src/__tests__/btw-routes.test.ts +13 -4
  42. package/src/__tests__/call-controller.test.ts +49 -1
  43. package/src/__tests__/call-domain.test.ts +0 -2
  44. package/src/__tests__/call-routes-http.test.ts +0 -2
  45. package/src/__tests__/channel-readiness-service.test.ts +59 -1
  46. package/src/__tests__/checker.test.ts +3 -4
  47. package/src/__tests__/config-loader-backfill.test.ts +90 -155
  48. package/src/__tests__/config-loader-platform-defaults.test.ts +196 -0
  49. package/src/__tests__/config-schema-cmd.test.ts +0 -1
  50. package/src/__tests__/config-set-platform-guard.test.ts +48 -4
  51. package/src/__tests__/config-watcher-cleanup-throttle.test.ts +2 -2
  52. package/src/__tests__/config-watcher.test.ts +2 -2
  53. package/src/__tests__/conversation-app-control-instantiation.test.ts +392 -0
  54. package/src/__tests__/conversation-app-control-lifecycle.test.ts +237 -0
  55. package/src/__tests__/conversation-init.benchmark.test.ts +0 -2
  56. package/src/__tests__/conversation-lifecycle.test.ts +36 -0
  57. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +283 -0
  58. package/src/__tests__/conversation-routes-disk-view.test.ts +6 -0
  59. package/src/__tests__/conversation-routes-guardian-reply.test.ts +120 -72
  60. package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -0
  61. package/src/__tests__/conversation-slash-commands.test.ts +0 -4
  62. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +202 -0
  63. package/src/__tests__/conversation-surfaces-app-control.test.ts +317 -0
  64. package/src/__tests__/credential-execution-feature-gates.test.ts +5 -12
  65. package/src/__tests__/credential-execution-managed-contract.test.ts +3 -131
  66. package/src/__tests__/credentials-cli.test.ts +5 -12
  67. package/src/__tests__/cu-unified-flow.test.ts +185 -23
  68. package/src/__tests__/daemon-credential-client.test.ts +101 -19
  69. package/src/__tests__/db-schedule-syntax-migration.test.ts +2 -0
  70. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
  71. package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
  72. package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -2
  73. package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +0 -2
  74. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +0 -1
  75. package/src/__tests__/heartbeat-service.test.ts +718 -1
  76. package/src/__tests__/helpers/call-route-handler.ts +7 -1
  77. package/src/__tests__/host-app-control-proxy.test.ts +602 -0
  78. package/src/__tests__/host-app-control-routes.test.ts +263 -0
  79. package/src/__tests__/host-bash-proxy.test.ts +246 -47
  80. package/src/__tests__/host-bash-routes.test.ts +294 -0
  81. package/src/__tests__/host-browser-proxy.test.ts +24 -22
  82. package/src/__tests__/host-browser-routes.test.ts +39 -13
  83. package/src/__tests__/host-cu-proxy.test.ts +41 -52
  84. package/src/__tests__/host-cu-routes-targeted.test.ts +300 -0
  85. package/src/__tests__/host-file-edit-tool.test.ts +47 -1
  86. package/src/__tests__/host-file-proxy-targeted.test.ts +339 -0
  87. package/src/__tests__/host-file-proxy.test.ts +37 -43
  88. package/src/__tests__/host-file-read-tool.test.ts +17 -0
  89. package/src/__tests__/host-file-routes-targeted.test.ts +262 -0
  90. package/src/__tests__/host-file-write-tool.test.ts +42 -1
  91. package/src/__tests__/host-proxy-base.test.ts +312 -0
  92. package/src/__tests__/host-shell-tool.test.ts +22 -4
  93. package/src/__tests__/host-transfer-proxy-targeted.test.ts +583 -0
  94. package/src/__tests__/host-transfer-proxy.test.ts +121 -22
  95. package/src/__tests__/host-transfer-routes-targeted.test.ts +447 -0
  96. package/src/__tests__/http-user-message-parity.test.ts +1 -0
  97. package/src/__tests__/identity-intro-cache.test.ts +29 -0
  98. package/src/__tests__/identity-routes.test.ts +103 -1
  99. package/src/__tests__/init-feature-flag-overrides.test.ts +26 -3
  100. package/src/__tests__/inline-command-runner.test.ts +0 -1
  101. package/src/__tests__/inline-skill-load-permissions.test.ts +5 -11
  102. package/src/__tests__/integration-status.test.ts +85 -5
  103. package/src/__tests__/intent-routing.test.ts +0 -1
  104. package/src/__tests__/jobs-store-qdrant-breaker.test.ts +95 -5
  105. package/src/__tests__/lifecycle-memory-v2-seed.test.ts +17 -0
  106. package/src/__tests__/managed-skill-lifecycle.test.ts +0 -1
  107. package/src/__tests__/mcp-auth-routes.test.ts +197 -0
  108. package/src/__tests__/mcp-cli.test.ts +338 -2
  109. package/src/__tests__/memory-jobs-worker-lanes.test.ts +188 -0
  110. package/src/__tests__/migration-import-commit-http.test.ts +108 -2
  111. package/src/__tests__/mock-gateway-ipc.ts +1 -0
  112. package/src/__tests__/oauth-cli.test.ts +0 -2
  113. package/src/__tests__/oauth2-gateway-transport.test.ts +0 -1
  114. package/src/__tests__/persistence-secret-redaction.test.ts +299 -0
  115. package/src/__tests__/platform-bash-auto-approve.test.ts +5 -9
  116. package/src/__tests__/prechat-onboarding-contract.test.ts +3 -1
  117. package/src/__tests__/process-message-background-slack.test.ts +2 -0
  118. package/src/__tests__/provider-commit-message-generator.test.ts +0 -1
  119. package/src/__tests__/public-ingress-urls.test.ts +97 -0
  120. package/src/__tests__/require-fresh-approval.test.ts +0 -1
  121. package/src/__tests__/retry-backoff.test.ts +87 -0
  122. package/src/__tests__/runtime-events-sse.test.ts +10 -6
  123. package/src/__tests__/sanitize-config-for-transfer.test.ts +24 -2
  124. package/src/__tests__/schedule-retry.test.ts +715 -0
  125. package/src/__tests__/script-proxy-mitm-handler.test.ts +1 -1
  126. package/src/__tests__/secret-ingress-http.test.ts +1 -0
  127. package/src/__tests__/send-endpoint-busy.test.ts +3 -0
  128. package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -1
  129. package/src/__tests__/skill-feature-flags.test.ts +43 -41
  130. package/src/__tests__/skill-load-feature-flag.test.ts +13 -14
  131. package/src/__tests__/skill-load-inline-command.test.ts +0 -51
  132. package/src/__tests__/skill-load-inline-includes.test.ts +0 -43
  133. package/src/__tests__/skill-projection.benchmark.test.ts +0 -1
  134. package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -1
  135. package/src/__tests__/slack-channel-config.test.ts +9 -14
  136. package/src/__tests__/system-prompt-ask-mode.test.ts +0 -1
  137. package/src/__tests__/system-prompt.test.ts +0 -1
  138. package/src/__tests__/telegram-config.test.ts +0 -1
  139. package/src/__tests__/test-preload.ts +8 -0
  140. package/src/__tests__/tool-approval-handler.test.ts +3 -4
  141. package/src/__tests__/tool-audit-listener.test.ts +48 -0
  142. package/src/__tests__/tool-execute-pipeline.test.ts +0 -1
  143. package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
  144. package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -1
  145. package/src/__tests__/tool-executor.test.ts +0 -1
  146. package/src/__tests__/twilio-config.test.ts +3 -16
  147. package/src/__tests__/twilio-routes.test.ts +3 -5
  148. package/src/__tests__/twilio-validation.test.ts +93 -0
  149. package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +1 -4
  150. package/src/__tests__/verification-control-plane-policy.test.ts +2 -4
  151. package/src/__tests__/voice-ingress-preflight.test.ts +19 -0
  152. package/src/__tests__/workspace-migration-006-services-config.test.ts +3 -2
  153. package/src/__tests__/workspace-migration-backfill-installation-id.test.ts +1 -5
  154. package/src/__tests__/workspace-migration-down-functions.test.ts +8 -8
  155. package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +10 -6
  156. package/src/backup/__tests__/paths.test.ts +0 -22
  157. package/src/backup/__tests__/restore.test.ts +51 -151
  158. package/src/backup/paths.ts +2 -18
  159. package/src/backup/restore.ts +107 -231
  160. package/src/bundler/app-bundler.ts +51 -3
  161. package/src/calls/relay-server.ts +4 -44
  162. package/src/calls/twilio-config.ts +2 -17
  163. package/src/calls/twilio-rest.ts +33 -105
  164. package/src/calls/twilio-routes.ts +11 -12
  165. package/src/channels/types.ts +8 -7
  166. package/src/cli/commands/__tests__/backup.test.ts +6 -277
  167. package/src/cli/commands/__tests__/gateway.test.ts +288 -0
  168. package/src/cli/commands/__tests__/memory-v2.test.ts +4 -0
  169. package/src/cli/commands/__tests__/webhooks.test.ts +0 -1
  170. package/src/cli/commands/backup.ts +6 -331
  171. package/src/cli/commands/clients.ts +36 -37
  172. package/src/cli/commands/contacts.ts +73 -0
  173. package/src/cli/commands/conversations.ts +2 -5
  174. package/src/cli/commands/credentials.ts +15 -7
  175. package/src/cli/commands/domain.ts +66 -15
  176. package/src/cli/commands/gateway.ts +183 -0
  177. package/src/cli/commands/keys.ts +9 -6
  178. package/src/cli/commands/mcp.ts +116 -156
  179. package/src/cli/commands/memory-v2.ts +296 -1
  180. package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -1
  181. package/src/cli/commands/platform/__tests__/connect.test.ts +0 -2
  182. package/src/cli/commands/platform/__tests__/disconnect.test.ts +0 -2
  183. package/src/cli/commands/platform/__tests__/status.test.ts +13 -15
  184. package/src/cli/commands/platform/disconnect.ts +5 -4
  185. package/src/cli/commands/platform/index.ts +0 -18
  186. package/src/cli/lib/daemon-credential-client.ts +110 -28
  187. package/src/cli/program.ts +2 -0
  188. package/src/config/assistant-feature-flags.ts +67 -10
  189. package/src/config/bundled-skills/acp/SKILL.md +6 -0
  190. package/src/config/bundled-skills/acp/TOOLS.json +1 -22
  191. package/src/config/bundled-skills/app-builder/SKILL.md +14 -109
  192. package/src/config/bundled-skills/app-builder/TOOLS.json +1 -28
  193. package/src/config/bundled-skills/app-builder/tools/app-create.ts +1 -10
  194. package/src/config/bundled-skills/app-control/SKILL.md +75 -0
  195. package/src/config/bundled-skills/app-control/TOOLS.json +299 -0
  196. package/src/config/bundled-skills/app-control/tools/app-control-click.ts +12 -0
  197. package/src/config/bundled-skills/app-control/tools/app-control-combo.ts +12 -0
  198. package/src/config/bundled-skills/app-control/tools/app-control-drag.ts +12 -0
  199. package/src/config/bundled-skills/app-control/tools/app-control-observe.ts +12 -0
  200. package/src/config/bundled-skills/app-control/tools/app-control-press.ts +12 -0
  201. package/src/config/bundled-skills/app-control/tools/app-control-sequence.ts +12 -0
  202. package/src/config/bundled-skills/app-control/tools/app-control-start.ts +12 -0
  203. package/src/config/bundled-skills/app-control/tools/app-control-stop.ts +12 -0
  204. package/src/config/bundled-skills/app-control/tools/app-control-type.ts +12 -0
  205. package/src/config/bundled-skills/computer-use/SKILL.md +6 -0
  206. package/src/config/bundled-skills/computer-use/TOOLS.json +67 -43
  207. package/src/config/bundled-skills/contacts/TOOLS.json +0 -16
  208. package/src/config/bundled-skills/document/TOOLS.json +0 -8
  209. package/src/config/bundled-skills/followups/TOOLS.json +0 -12
  210. package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
  211. package/src/config/bundled-skills/image-studio/TOOLS.json +0 -4
  212. package/src/config/bundled-skills/media-processing/TOOLS.json +0 -24
  213. package/src/config/bundled-skills/messaging/TOOLS.json +0 -40
  214. package/src/config/bundled-skills/phone-calls/TOOLS.json +0 -12
  215. package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +19 -4
  216. package/src/config/bundled-skills/playbooks/TOOLS.json +0 -16
  217. package/src/config/bundled-skills/schedule/TOOLS.json +14 -14
  218. package/src/config/bundled-skills/sequences/TOOLS.json +0 -36
  219. package/src/config/bundled-skills/settings/SKILL.md +4 -0
  220. package/src/config/bundled-skills/settings/TOOLS.json +0 -12
  221. package/src/config/bundled-skills/skill-management/SKILL.md +6 -0
  222. package/src/config/bundled-skills/skill-management/TOOLS.json +0 -8
  223. package/src/config/bundled-skills/subagent/SKILL.md +6 -2
  224. package/src/config/bundled-skills/subagent/TOOLS.json +0 -20
  225. package/src/config/bundled-skills/transcribe/SKILL.md +4 -0
  226. package/src/config/bundled-skills/transcribe/TOOLS.json +0 -4
  227. package/src/config/bundled-tool-registry.ts +21 -0
  228. package/src/config/env-registry.ts +0 -2
  229. package/src/config/env.ts +19 -12
  230. package/src/config/feature-flag-registry.json +21 -133
  231. package/src/config/loader.ts +73 -99
  232. package/src/config/sanitize-for-transfer.ts +2 -0
  233. package/src/config/schemas/__tests__/memory-lifecycle.test.ts +80 -0
  234. package/src/config/schemas/__tests__/memory-v2.test.ts +7 -4
  235. package/src/config/schemas/calls.ts +0 -9
  236. package/src/config/schemas/heartbeat.ts +63 -0
  237. package/src/config/schemas/ingress.ts +10 -6
  238. package/src/config/schemas/llm.ts +5 -10
  239. package/src/config/schemas/memory-lifecycle.ts +77 -24
  240. package/src/config/schemas/memory-v2.ts +48 -4
  241. package/src/config/schemas/platform.ts +6 -0
  242. package/src/config/schemas/services.ts +1 -15
  243. package/src/config/schemas/skills.ts +0 -6
  244. package/src/config/seed-inference-profiles.ts +1 -1
  245. package/src/contacts/contact-store.ts +0 -30
  246. package/src/contacts/contacts-write.ts +0 -27
  247. package/src/context/window-manager.ts +1 -2
  248. package/src/credential-execution/feature-gates.ts +10 -10
  249. package/src/credential-execution/process-manager.ts +12 -41
  250. package/src/daemon/__tests__/conversation-tool-setup.test.ts +126 -5
  251. package/src/daemon/bootstrap-turn-cleanup.ts +45 -0
  252. package/src/daemon/config-watcher.ts +4 -3
  253. package/src/daemon/conversation-agent-loop-handlers.ts +21 -3
  254. package/src/daemon/conversation-agent-loop.ts +32 -28
  255. package/src/daemon/conversation-lifecycle.ts +8 -1
  256. package/src/daemon/conversation-process.ts +16 -11
  257. package/src/daemon/conversation-runtime-assembly.ts +2 -2
  258. package/src/daemon/conversation-surfaces.ts +125 -4
  259. package/src/daemon/conversation-tool-setup.ts +16 -55
  260. package/src/daemon/conversation.ts +21 -2
  261. package/src/daemon/doordash-steps.ts +1 -1
  262. package/src/daemon/handlers/shared.ts +4 -1
  263. package/src/daemon/host-app-control-proxy.ts +293 -0
  264. package/src/daemon/host-bash-proxy.ts +84 -74
  265. package/src/daemon/host-browser-proxy.ts +67 -82
  266. package/src/daemon/host-cu-proxy.ts +81 -86
  267. package/src/daemon/host-file-proxy.ts +93 -69
  268. package/src/daemon/host-proxy-base.ts +294 -0
  269. package/src/daemon/host-proxy-preactivation.ts +82 -0
  270. package/src/daemon/host-transfer-proxy.ts +247 -129
  271. package/src/daemon/lifecycle.ts +115 -117
  272. package/src/daemon/message-protocol.ts +3 -8
  273. package/src/daemon/message-types/contacts.ts +23 -1
  274. package/src/daemon/message-types/conversations.ts +11 -8
  275. package/src/daemon/message-types/host-app-control.ts +150 -0
  276. package/src/daemon/message-types/host-bash.ts +4 -0
  277. package/src/daemon/message-types/host-cu.ts +2 -0
  278. package/src/daemon/message-types/host-file.ts +4 -0
  279. package/src/daemon/message-types/host-transfer.ts +3 -0
  280. package/src/daemon/message-types/schedules.ts +8 -3
  281. package/src/daemon/message-types/skills.ts +2 -2
  282. package/src/daemon/process-message.ts +18 -1
  283. package/src/daemon/shutdown-handlers.ts +0 -3
  284. package/src/daemon/tool-setup-types.ts +51 -0
  285. package/src/daemon/tool-side-effects.ts +1 -1
  286. package/src/events/tool-audit-listener.ts +2 -1
  287. package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +15 -7
  288. package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +216 -0
  289. package/src/heartbeat/heartbeat-run-store.ts +236 -0
  290. package/src/heartbeat/heartbeat-service.ts +280 -49
  291. package/src/home/__tests__/post-connect-feed.test.ts +99 -0
  292. package/src/home/__tests__/relationship-state-writer.test.ts +11 -9
  293. package/src/home/__tests__/suggested-prompts.test.ts +89 -0
  294. package/src/home/post-connect-feed.ts +68 -0
  295. package/src/home/relationship-state-writer.ts +17 -92
  296. package/src/home/suggested-prompts.ts +46 -10
  297. package/src/inbound/public-ingress-urls.ts +32 -34
  298. package/src/ipc/__tests__/route-error-envelope.test.ts +80 -0
  299. package/src/ipc/assistant-server.ts +14 -1
  300. package/src/ipc/cli-client.ts +32 -1
  301. package/src/live-voice/live-voice-metrics.ts +10 -10
  302. package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +304 -0
  303. package/src/mcp/mcp-auth-orchestrator.ts +213 -0
  304. package/src/mcp/mcp-auth-state.ts +133 -0
  305. package/src/mcp/mcp-oauth-provider.ts +19 -0
  306. package/src/memory/__tests__/jobs-store-job-classes.test.ts +24 -0
  307. package/src/memory/__tests__/qdrant-client-sentinel.test.ts +49 -0
  308. package/src/memory/__tests__/sparse-tokenize.test.ts +66 -0
  309. package/src/memory/anisotropy.test.ts +247 -0
  310. package/src/memory/anisotropy.ts +443 -0
  311. package/src/memory/auto-analysis-constants.ts +17 -0
  312. package/src/memory/auto-analysis-guard.ts +5 -15
  313. package/src/memory/canonical-guardian-store.ts +7 -7
  314. package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +122 -0
  315. package/src/memory/context-search/agent-protocol.ts +6 -6
  316. package/src/memory/context-search/agent-runner.ts +32 -7
  317. package/src/memory/context-search/sources/memory-v2.ts +17 -5
  318. package/src/memory/conversation-crud.ts +1 -1
  319. package/src/memory/conversation-key-store.ts +2 -15
  320. package/src/memory/db-init.ts +4 -0
  321. package/src/memory/embedding-backend.ts +9 -21
  322. package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +49 -4
  323. package/src/memory/graph/conversation-graph-memory.ts +1 -24
  324. package/src/memory/graph/graph-search.ts +8 -0
  325. package/src/memory/graph/retriever.ts +28 -0
  326. package/src/memory/graph/tools.ts +1 -1
  327. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +8 -2
  328. package/src/memory/jobs/embed-concept-page.ts +28 -2
  329. package/src/memory/jobs/embed-pkb-file.test.ts +2 -2
  330. package/src/memory/jobs-store.ts +66 -22
  331. package/src/memory/jobs-worker.ts +112 -63
  332. package/src/memory/memory-v2-activation-log-store.ts +1 -1
  333. package/src/memory/migrations/237-heartbeat-runs.ts +45 -0
  334. package/src/memory/migrations/238-schedule-retry-policy.ts +20 -0
  335. package/src/memory/migrations/index.ts +5 -0
  336. package/src/memory/migrations/registry.ts +8 -0
  337. package/src/memory/pkb/pkb-search.ts +7 -0
  338. package/src/memory/qdrant-client.ts +50 -20
  339. package/src/memory/schema/infrastructure.ts +15 -0
  340. package/src/memory/search/semantic.ts +7 -0
  341. package/src/memory/sparse-tokenize.ts +49 -0
  342. package/src/memory/v2/__tests__/activation.test.ts +77 -95
  343. package/src/memory/v2/__tests__/injection.test.ts +43 -21
  344. package/src/memory/v2/__tests__/sim.test.ts +166 -6
  345. package/src/memory/v2/__tests__/sparse-bm25.test.ts +292 -0
  346. package/src/memory/v2/__tests__/static-context.test.ts +0 -1
  347. package/src/memory/v2/activation.ts +69 -88
  348. package/src/memory/v2/consolidation-job.ts +3 -5
  349. package/src/memory/v2/constants.ts +7 -0
  350. package/src/memory/v2/injection.ts +86 -53
  351. package/src/memory/v2/prompts/consolidation.ts +312 -91
  352. package/src/memory/v2/qdrant.ts +99 -1
  353. package/src/memory/v2/sim.ts +126 -16
  354. package/src/memory/v2/skill-qdrant.ts +12 -3
  355. package/src/memory/v2/skill-store.ts +16 -1
  356. package/src/memory/v2/sparse-bm25.ts +245 -0
  357. package/src/memory/v2/static-context.ts +6 -5
  358. package/src/messaging/providers/gmail/types.ts +0 -49
  359. package/src/messaging/providers/slack/adapter.ts +1 -31
  360. package/src/messaging/providers/slack/types.ts +0 -32
  361. package/src/notifications/README.md +10 -10
  362. package/src/notifications/broadcaster.ts +1 -1
  363. package/src/notifications/guardian-question-mode.ts +5 -5
  364. package/src/oauth/connect-orchestrator.ts +4 -0
  365. package/src/oauth/credential-token-resolver.ts +1 -3
  366. package/src/oauth/manual-token-connection.ts +0 -4
  367. package/src/outbound-proxy/index.ts +1 -37
  368. package/src/outbound-proxy/logging.ts +1 -1
  369. package/src/outbound-proxy/policy.ts +6 -5
  370. package/src/outbound-proxy/router.ts +2 -1
  371. package/src/permissions/approval-policy.test.ts +6 -275
  372. package/src/permissions/approval-policy.ts +0 -51
  373. package/src/permissions/checker.test.ts +0 -1
  374. package/src/permissions/checker.ts +3 -17
  375. package/src/permissions/gateway-threshold-reader.ts +2 -0
  376. package/src/permissions/prompter.ts +34 -1
  377. package/src/permissions/secret-prompter.ts +6 -2
  378. package/src/prompts/bootstrap-cleanup.ts +27 -0
  379. package/src/prompts/system-prompt.ts +3 -18
  380. package/src/prompts/templates/SOUL.md +13 -1
  381. package/src/providers/speech-to-text/provider-catalog.ts +7 -8
  382. package/src/runtime/assistant-event-hub.ts +118 -96
  383. package/src/runtime/assistant-event.ts +1 -0
  384. package/src/runtime/auth/__tests__/middleware.test.ts +11 -56
  385. package/src/runtime/auth/middleware.ts +0 -96
  386. package/src/runtime/auth/route-policy.ts +19 -0
  387. package/src/runtime/btw-sidechain.ts +2 -3
  388. package/src/runtime/channel-invite-transport.ts +2 -48
  389. package/src/runtime/channel-invite-transports/email.ts +1 -1
  390. package/src/runtime/channel-invite-transports/slack.ts +1 -1
  391. package/src/runtime/channel-invite-transports/telegram.ts +1 -1
  392. package/src/runtime/channel-invite-transports/voice.ts +1 -1
  393. package/src/runtime/channel-invite-transports/whatsapp.ts +1 -1
  394. package/src/runtime/channel-invite-types.ts +54 -0
  395. package/src/runtime/channel-readiness-service.ts +32 -13
  396. package/src/runtime/http-server.ts +3 -329
  397. package/src/runtime/http-types.ts +0 -5
  398. package/src/runtime/migrations/__tests__/vbundle-import-parity.test.ts +413 -0
  399. package/src/runtime/migrations/__tests__/vbundle-import-policy.test.ts +260 -0
  400. package/src/runtime/migrations/__tests__/vbundle-import-version-compat.test.ts +189 -0
  401. package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +153 -1
  402. package/src/runtime/migrations/__tests__/vbundle-symlink-importer.test.ts +451 -0
  403. package/src/runtime/migrations/__tests__/vbundle-symlink-streaming-importer.test.ts +0 -0
  404. package/src/runtime/migrations/__tests__/vbundle-symlink-streaming.test.ts +515 -0
  405. package/src/runtime/migrations/__tests__/vbundle-symlink-tar.test.ts +437 -0
  406. package/src/runtime/migrations/__tests__/vbundle-symlink-walker.test.ts +319 -0
  407. package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +51 -1
  408. package/src/runtime/migrations/migration-transport.ts +7 -7
  409. package/src/runtime/migrations/vbundle-builder.ts +327 -60
  410. package/src/runtime/migrations/vbundle-import-analyzer.ts +4 -4
  411. package/src/runtime/migrations/vbundle-import-policy.ts +172 -0
  412. package/src/runtime/migrations/vbundle-importer.ts +245 -68
  413. package/src/runtime/migrations/vbundle-streaming-importer.ts +326 -35
  414. package/src/runtime/migrations/vbundle-streaming-validator.ts +157 -4
  415. package/src/runtime/migrations/vbundle-tar-stream.ts +15 -6
  416. package/src/runtime/migrations/vbundle-validator.ts +114 -0
  417. package/src/runtime/pending-interactions.ts +35 -9
  418. package/src/runtime/routes/__tests__/backup-routes.test.ts +22 -150
  419. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +98 -0
  420. package/src/runtime/routes/__tests__/gateway-log-routes.test.ts +242 -0
  421. package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +112 -0
  422. package/src/runtime/routes/approval-interception-types.ts +13 -0
  423. package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +1 -1
  424. package/src/runtime/routes/backup-routes.ts +15 -38
  425. package/src/runtime/routes/btw-routes.ts +14 -37
  426. package/src/runtime/routes/client-routes.ts +1 -0
  427. package/src/runtime/routes/contact-prompt-routes.ts +183 -0
  428. package/src/runtime/routes/conversation-query-routes.ts +36 -1
  429. package/src/runtime/routes/conversation-routes.ts +30 -13
  430. package/src/runtime/routes/document-pdf-renderer.ts +165 -0
  431. package/src/runtime/routes/documents-routes.ts +30 -0
  432. package/src/runtime/routes/errors.ts +19 -4
  433. package/src/runtime/routes/events-routes.ts +12 -6
  434. package/src/runtime/routes/gateway-log-routes.ts +79 -0
  435. package/src/runtime/routes/guardian-approval-interception.ts +2 -8
  436. package/src/runtime/routes/heartbeat-routes.ts +103 -38
  437. package/src/runtime/routes/host-app-control-routes.ts +134 -0
  438. package/src/runtime/routes/host-bash-routes.ts +36 -6
  439. package/src/runtime/routes/host-browser-routes.ts +108 -13
  440. package/src/runtime/routes/host-cu-routes.ts +44 -14
  441. package/src/runtime/routes/host-file-routes.ts +33 -10
  442. package/src/runtime/routes/host-transfer-routes.ts +64 -24
  443. package/src/runtime/routes/http-adapter.ts +1 -0
  444. package/src/runtime/routes/identity-intro-cache.ts +30 -0
  445. package/src/runtime/routes/identity-routes.ts +15 -43
  446. package/src/runtime/routes/inbound-message-handler.ts +1 -9
  447. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +0 -7
  448. package/src/runtime/routes/inbound-stages/edit-intercept.ts +0 -8
  449. package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +0 -20
  450. package/src/runtime/routes/inbound-stages/transcribe-audio.ts +5 -13
  451. package/src/runtime/routes/index.ts +8 -0
  452. package/src/runtime/routes/mcp-auth-routes.ts +132 -0
  453. package/src/runtime/routes/memory-item-routes.ts +10 -12
  454. package/src/runtime/routes/memory-v2-routes.ts +441 -1
  455. package/src/runtime/routes/migration-routes.ts +96 -0
  456. package/src/runtime/routes/schedule-routes.ts +7 -0
  457. package/src/runtime/verification-templates.ts +4 -7
  458. package/src/schedule/integration-status.ts +66 -2
  459. package/src/schedule/recurrence-engine.ts +4 -1
  460. package/src/schedule/retry-backoff.ts +18 -0
  461. package/src/schedule/retry-policy.ts +82 -0
  462. package/src/schedule/schedule-recovery.ts +64 -0
  463. package/src/schedule/schedule-store.ts +106 -2
  464. package/src/schedule/scheduler-types.ts +25 -0
  465. package/src/schedule/scheduler.ts +63 -38
  466. package/src/security/oauth-callback-registry.ts +8 -0
  467. package/src/sequence/analytics.ts +5 -5
  468. package/src/sequence/engine.ts +1 -1
  469. package/src/skills/catalog-files.ts +2 -8
  470. package/src/skills/include-graph.ts +5 -5
  471. package/src/skills/remote-skill-policy.ts +5 -5
  472. package/src/skills/skill-file-provider.ts +1 -1
  473. package/src/skills/skill-file-types.ts +13 -0
  474. package/src/skills/skillssh-audit-types.ts +28 -0
  475. package/src/skills/skillssh-registry.ts +8 -21
  476. package/src/telemetry/types.ts +2 -0
  477. package/src/telemetry/usage-telemetry-reporter.test.ts +21 -0
  478. package/src/telemetry/usage-telemetry-reporter.ts +1 -0
  479. package/src/tools/app-control/skill-proxy-bridge.ts +28 -0
  480. package/src/tools/apps/executors.ts +56 -69
  481. package/src/tools/browser/__tests__/browser-status.test.ts +21 -18
  482. package/src/tools/browser/browser-execution.ts +2 -2
  483. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +55 -4
  484. package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +12 -6
  485. package/src/tools/browser/cdp-client/factory.ts +23 -24
  486. package/src/tools/browser/cdp-client/index.ts +1 -14
  487. package/src/tools/computer-use/definitions.ts +42 -20
  488. package/src/tools/executor.ts +2 -0
  489. package/src/tools/host-filesystem/edit.ts +26 -0
  490. package/src/tools/host-filesystem/read.ts +26 -0
  491. package/src/tools/host-filesystem/transfer.ts +31 -1
  492. package/src/tools/host-filesystem/write.ts +26 -0
  493. package/src/tools/host-terminal/host-shell.ts +58 -0
  494. package/src/tools/schedule/create.ts +6 -0
  495. package/src/tools/schedule/list.ts +2 -0
  496. package/src/tools/schedule/update.ts +10 -0
  497. package/src/tools/shared/filesystem/file-ops-service.ts +2 -0
  498. package/src/tools/shared/filesystem/path-policy.ts +25 -1
  499. package/src/tools/skills/load.ts +0 -32
  500. package/src/tools/tool-approval-handler.ts +1 -5
  501. package/src/tools/types.ts +4 -0
  502. package/src/usage/pricing.ts +1 -1
  503. package/src/workspace/hatched-date.ts +86 -0
  504. package/src/workspace/migrations/003-seed-device-id.ts +1 -1
  505. package/src/workspace/migrations/006-services-config.ts +8 -5
  506. package/src/workspace/migrations/016-extract-feature-flags-to-protected.ts +3 -9
  507. package/src/workspace/migrations/021-move-signals-to-workspace.ts +4 -10
  508. package/src/workspace/migrations/022-move-hooks-to-workspace.ts +4 -10
  509. package/src/workspace/migrations/023-move-config-files-to-workspace.ts +4 -11
  510. package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +3 -10
  511. package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +3 -2
  512. package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +2 -1
  513. package/src/workspace/migrations/059-move-pid-to-workspace.ts +3 -8
  514. package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +3 -8
  515. package/src/workspace/migrations/AGENTS.md +1 -1
  516. package/src/workspace/migrations/migrate-to-workspace-volume.ts +4 -10
  517. package/src/workspace/migrations/utils.ts +21 -0
  518. package/src/__tests__/host-browser-e2e-cloud.test.ts +0 -443
  519. package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +0 -226
  520. package/src/__tests__/host-browser-ws-events-e2e.test.ts +0 -427
  521. package/src/__tests__/twilio-rest.test.ts +0 -34
  522. package/src/backup/__tests__/backup-key.test.ts +0 -152
  523. package/src/backup/__tests__/backup-worker.test.ts +0 -782
  524. package/src/backup/__tests__/offsite-writer.test.ts +0 -641
  525. package/src/backup/__tests__/stream-crypt.test.ts +0 -228
  526. package/src/backup/backup-key.ts +0 -137
  527. package/src/backup/backup-worker.ts +0 -472
  528. package/src/backup/offsite-writer.ts +0 -222
  529. package/src/backup/stream-crypt.ts +0 -263
  530. package/src/daemon/message-types/pairing.ts +0 -58
  531. package/src/outbound-proxy/config.ts +0 -20
  532. package/src/outbound-proxy/health.ts +0 -18
  533. package/src/outbound-proxy/types.ts +0 -150
  534. package/src/runtime/capability-tokens.ts +0 -190
  535. package/src/signals/mcp-reload.ts +0 -18
@@ -1,5 +1,14 @@
1
1
  import { z } from "zod";
2
2
 
3
+ function emptyOrAbsoluteHttpUrl(fieldPath: string) {
4
+ return z
5
+ .string({ error: `${fieldPath} must be a string` })
6
+ .refine(
7
+ (val) => val === "" || /^https?:\/\//i.test(val),
8
+ `${fieldPath} must be an absolute URL starting with http:// or https://`,
9
+ );
10
+ }
11
+
3
12
  const IngressWebhookConfigSchema = z
4
13
  .object({
5
14
  secret: z
@@ -74,12 +83,7 @@ const IngressBaseSchema = z
74
83
  .boolean({ error: "ingress.enabled must be a boolean" })
75
84
  .optional()
76
85
  .describe("Whether the ingress HTTP server is enabled"),
77
- publicBaseUrl: z
78
- .string({ error: "ingress.publicBaseUrl must be a string" })
79
- .refine(
80
- (val) => val === "" || /^https?:\/\//i.test(val),
81
- "ingress.publicBaseUrl must be an absolute URL starting with http:// or https://",
82
- )
86
+ publicBaseUrl: emptyOrAbsoluteHttpUrl("ingress.publicBaseUrl")
83
87
  .default("")
84
88
  .describe(
85
89
  "Public-facing base URL for the ingress server (used in webhook callbacks)",
@@ -91,7 +91,6 @@ export type LLMCallSite = z.infer<typeof LLMCallSiteEnum>;
91
91
  * mapping table.
92
92
  */
93
93
  const EffortEnum = z.enum(["none", "low", "medium", "high", "xhigh", "max"]);
94
- export type Effort = z.infer<typeof EffortEnum>;
95
94
 
96
95
  export const SpeedEnum = z.enum(["standard", "fast"]);
97
96
  export type Speed = z.infer<typeof SpeedEnum>;
@@ -102,7 +101,6 @@ export type Speed = z.infer<typeof SpeedEnum>;
102
101
  * are stripped in `retry.ts` normalization.
103
102
  */
104
103
  const VerbosityEnum = z.enum(["low", "medium", "high"]);
105
- export type Verbosity = z.infer<typeof VerbosityEnum>;
106
104
 
107
105
  // ---------------------------------------------------------------------------
108
106
  // Leaf primitives (shared between LLMConfigBase and LLMConfigFragment)
@@ -150,7 +148,6 @@ const ThinkingSchema = z.object({
150
148
  enabled: ThinkingEnabledSchema.default(true),
151
149
  streamThinking: ThinkingStreamThinkingSchema.default(true),
152
150
  });
153
- export type Thinking = z.infer<typeof ThinkingSchema>;
154
151
 
155
152
  // Fragment view: every field optional, no defaults injected. Defining this
156
153
  // separately (rather than `ThinkingSchema.partial()`) avoids having Zod
@@ -243,7 +240,6 @@ const OpenRouterOnlyItemSchema = z.string().min(1);
243
240
  const OpenRouterSchema = z.object({
244
241
  only: z.array(OpenRouterOnlyItemSchema).default([]),
245
242
  });
246
- export type OpenRouter = z.infer<typeof OpenRouterSchema>;
247
243
 
248
244
  const OpenRouterDeepPartialSchema = z.object({
249
245
  only: z.array(OpenRouterOnlyItemSchema).optional(),
@@ -257,8 +253,8 @@ const OpenRouterDeepPartialSchema = z.object({
257
253
  * Distinguishes daemon-managed profiles (overwritten on every startup) from
258
254
  * user-created ones (never touched by the daemon).
259
255
  */
260
- export const ProfileSource = z.enum(["managed", "user"]);
261
- export type ProfileSource = z.infer<typeof ProfileSource>;
256
+ const ProfileSource = z.enum(["managed", "user"]);
257
+ type ProfileSource = z.infer<typeof ProfileSource>;
262
258
 
263
259
  // ---------------------------------------------------------------------------
264
260
  // Pricing overrides
@@ -270,7 +266,6 @@ const PricingOverrideSchema = z.object({
270
266
  inputPer1M: z.number().nonnegative(),
271
267
  outputPer1M: z.number().nonnegative(),
272
268
  });
273
- export type PricingOverride = z.infer<typeof PricingOverrideSchema>;
274
269
 
275
270
  // ---------------------------------------------------------------------------
276
271
  // Base config (all fields defaulted) and Fragment (all fields optional)
@@ -302,7 +297,7 @@ export type LLMConfigBase = z.infer<typeof LLMConfigBase>;
302
297
  * objects so callers can override individual leaves (e.g. `{ thinking:
303
298
  * { enabled: false } }`).
304
299
  */
305
- export const LLMConfigFragment = z.object({
300
+ const LLMConfigFragment = z.object({
306
301
  provider: LLMProvider.optional(),
307
302
  model: ModelSchema.optional(),
308
303
  maxTokens: MaxTokensSchema.optional(),
@@ -314,7 +309,7 @@ export const LLMConfigFragment = z.object({
314
309
  contextWindow: ContextWindowDeepPartialSchema.optional(),
315
310
  openrouter: OpenRouterDeepPartialSchema.optional(),
316
311
  });
317
- export type LLMConfigFragment = z.infer<typeof LLMConfigFragment>;
312
+ type LLMConfigFragment = z.infer<typeof LLMConfigFragment>;
318
313
 
319
314
  /**
320
315
  * A named profile entry: an `LLMConfigFragment` augmented with
@@ -337,7 +332,7 @@ export type ProfileEntry = z.infer<typeof ProfileEntry>;
337
332
  const LLMCallSiteConfig = LLMConfigFragment.extend({
338
333
  profile: z.string().min(1).optional(),
339
334
  });
340
- export type LLMCallSiteConfig = z.infer<typeof LLMCallSiteConfig>;
335
+ type LLMCallSiteConfig = z.infer<typeof LLMCallSiteConfig>;
341
336
 
342
337
  // ---------------------------------------------------------------------------
343
338
  // Top-level LLM schema
@@ -1,29 +1,82 @@
1
1
  import { z } from "zod";
2
2
 
3
- export const MemoryJobsConfigSchema = z
4
- .object({
5
- workerConcurrency: z
6
- .number({ error: "memory.jobs.workerConcurrency must be a number" })
7
- .int("memory.jobs.workerConcurrency must be an integer")
8
- .positive("memory.jobs.workerConcurrency must be a positive integer")
9
- .default(2)
10
- .describe("Number of concurrent workers processing memory jobs"),
11
- batchSize: z
12
- .number({ error: "memory.jobs.batchSize must be a number" })
13
- .int("memory.jobs.batchSize must be an integer")
14
- .positive("memory.jobs.batchSize must be a positive integer")
15
- .default(10)
16
- .describe("Number of memory items processed per batch"),
17
- stalledJobTimeoutMs: z
18
- .number({ error: "memory.jobs.stalledJobTimeoutMs must be a number" })
19
- .int("memory.jobs.stalledJobTimeoutMs must be an integer")
20
- .positive("memory.jobs.stalledJobTimeoutMs must be a positive integer")
21
- .default(30 * 60 * 1000)
22
- .describe(
23
- "Timeout in milliseconds after which a stalled memory job is considered failed",
24
- ),
25
- })
26
- .describe("Memory background job processing configuration");
3
+ const DEFAULT_WORKER_CONCURRENCY = 2;
4
+ const DEFAULT_SLOW_LLM_CONCURRENCY = 1;
5
+ const DEFAULT_FAST_CONCURRENCY = 2;
6
+ const DEFAULT_EMBED_CONCURRENCY = 2;
7
+
8
+ const positiveInt = (field: string) =>
9
+ z
10
+ .number({ error: `memory.jobs.${field} must be a number` })
11
+ .int(`memory.jobs.${field} must be an integer`)
12
+ .positive(`memory.jobs.${field} must be a positive integer`);
13
+
14
+ // Input shape allows all fields to be omitted so we can distinguish
15
+ // "user explicitly set workerConcurrency" from "user accepted the default"
16
+ // when deriving lane caps. The output shape (after transform) always has
17
+ // all four fields populated.
18
+ const MemoryJobsConfigInputSchema = z.object({
19
+ workerConcurrency: positiveInt("workerConcurrency")
20
+ .optional()
21
+ .describe("Number of concurrent workers processing memory jobs"),
22
+ stalledJobTimeoutMs: positiveInt("stalledJobTimeoutMs")
23
+ .default(30 * 60 * 1000)
24
+ .describe(
25
+ "Timeout in milliseconds after which a stalled memory job is considered failed",
26
+ ),
27
+ slowLlmConcurrency: positiveInt("slowLlmConcurrency")
28
+ .optional()
29
+ .describe(
30
+ "Concurrent slow LLM-bound jobs (graph consolidation, narrative refine, etc.)",
31
+ ),
32
+ fastConcurrency: positiveInt("fastConcurrency")
33
+ .optional()
34
+ .describe(
35
+ "Concurrent fast jobs (concept-page embed, prunes, media processing, etc.)",
36
+ ),
37
+ embedConcurrency: positiveInt("embedConcurrency")
38
+ .optional()
39
+ .describe(
40
+ "Concurrent segment-embed jobs (gated by Qdrant circuit breaker)",
41
+ ),
42
+ });
43
+
44
+ export const MemoryJobsConfigSchema = MemoryJobsConfigInputSchema.transform(
45
+ (input) => {
46
+ // When `workerConcurrency` is explicitly set but lane caps are not,
47
+ // derive lane caps so existing user configs gain the per-lane fix
48
+ // without edits. Explicit lane caps always win.
49
+ const workerConcurrencyExplicit = input.workerConcurrency !== undefined;
50
+ const workerConcurrency =
51
+ input.workerConcurrency ?? DEFAULT_WORKER_CONCURRENCY;
52
+
53
+ const slowLlmConcurrency =
54
+ input.slowLlmConcurrency ??
55
+ (workerConcurrencyExplicit
56
+ ? Math.max(1, Math.floor(workerConcurrency / 2))
57
+ : DEFAULT_SLOW_LLM_CONCURRENCY);
58
+
59
+ const fastConcurrency =
60
+ input.fastConcurrency ??
61
+ (workerConcurrencyExplicit
62
+ ? workerConcurrency
63
+ : DEFAULT_FAST_CONCURRENCY);
64
+
65
+ const embedConcurrency =
66
+ input.embedConcurrency ??
67
+ (workerConcurrencyExplicit
68
+ ? workerConcurrency
69
+ : DEFAULT_EMBED_CONCURRENCY);
70
+
71
+ return {
72
+ workerConcurrency,
73
+ stalledJobTimeoutMs: input.stalledJobTimeoutMs,
74
+ slowLlmConcurrency,
75
+ fastConcurrency,
76
+ embedConcurrency,
77
+ };
78
+ },
79
+ ).describe("Memory background job processing configuration");
27
80
 
28
81
  export const MemoryRetentionConfigSchema = z
29
82
  .object({
@@ -87,6 +87,15 @@ export const MemoryV2ConfigSchema = z
87
87
  .describe(
88
88
  "Number of top-activation concept pages considered for injection per turn",
89
89
  ),
90
+ ann_candidate_limit: z
91
+ .number({ error: "memory.v2.ann_candidate_limit must be a number" })
92
+ .int("memory.v2.ann_candidate_limit must be an integer")
93
+ .positive("memory.v2.ann_candidate_limit must be a positive integer")
94
+ .nullable()
95
+ .default(null)
96
+ .describe(
97
+ "Per-channel cap on the unrestricted ANN candidate query (dense and sparse each return up to this many hits before they are unioned and fed into the activation pipeline). `null` = unlimited (every page in the v2 collection is eligible). Increase or null this out to surface more candidates at the cost of higher per-turn embedding/scoring work.",
98
+ ),
90
99
  top_k_skills: z
91
100
  .number({ error: "memory.v2.top_k_skills must be a number" })
92
101
  .int()
@@ -107,17 +116,52 @@ export const MemoryV2ConfigSchema = z
107
116
  .number({ error: "memory.v2.dense_weight must be a number" })
108
117
  .min(0, "memory.v2.dense_weight must be >= 0")
109
118
  .max(1, "memory.v2.dense_weight must be <= 1")
110
- .default(0.7)
119
+ .default(0.85)
111
120
  .describe(
112
- "Weight on dense (cosine) similarity in the hybrid retrieval score",
121
+ "Weight on dense (cosine) similarity in the hybrid retrieval score — dense embeddings dominate the score.",
113
122
  ),
114
123
  sparse_weight: z
115
124
  .number({ error: "memory.v2.sparse_weight must be a number" })
116
125
  .min(0, "memory.v2.sparse_weight must be >= 0")
117
126
  .max(1, "memory.v2.sparse_weight must be <= 1")
118
- .default(0.3)
127
+ .default(0.15)
128
+ .describe(
129
+ "Weight on sparse (BM25-style) similarity in the hybrid retrieval score — sparse acts as a discriminator for keyword-rich queries.",
130
+ ),
131
+ // Adaptive sparse-weighting knobs. Both fields are intentionally
132
+ // optional with no default — the schema serialiser drops absent
133
+ // optionals so these stay invisible to operators who never tune them.
134
+ // The defaults live in `effectiveWeights` (sim.ts).
135
+ min_sparse_spread: z
136
+ .number({ error: "memory.v2.min_sparse_spread must be a number" })
137
+ .min(0, "memory.v2.min_sparse_spread must be >= 0")
138
+ .max(1, "memory.v2.min_sparse_spread must be <= 1")
139
+ .optional()
140
+ .describe(
141
+ "Adaptive sparse weighting: when the spread (max - min) of normalized sparse scores across the candidate hit set falls below this, sparse contribution collapses to 0. Linear interpolation between this and `full_sparse_spread`. Optional escape hatch — leave unset to use the built-in default.",
142
+ ),
143
+ full_sparse_spread: z
144
+ .number({ error: "memory.v2.full_sparse_spread must be a number" })
145
+ .min(0, "memory.v2.full_sparse_spread must be >= 0")
146
+ .max(1, "memory.v2.full_sparse_spread must be <= 1")
147
+ .optional()
148
+ .describe(
149
+ "Adaptive sparse weighting: at or above this spread, sparse weight stays at the configured `sparse_weight`. Optional escape hatch — leave unset to use the built-in default.",
150
+ ),
151
+ bm25_k1: z
152
+ .number({ error: "memory.v2.bm25_k1 must be a number" })
153
+ .min(0, "memory.v2.bm25_k1 must be >= 0")
154
+ .default(1.2)
155
+ .describe(
156
+ "BM25 term-frequency saturation parameter. Standard Lucene default — increase to make repeated mentions of a term matter more, decrease to flatten the curve.",
157
+ ),
158
+ bm25_b: z
159
+ .number({ error: "memory.v2.bm25_b must be a number" })
160
+ .min(0, "memory.v2.bm25_b must be >= 0")
161
+ .max(1, "memory.v2.bm25_b must be <= 1")
162
+ .default(0.4)
119
163
  .describe(
120
- "Weight on sparse (BM25-style) similarity in the hybrid retrieval score",
164
+ "BM25 document-length normalization. 0 disables length normalization, 1 fully normalizes. Lucene's default is 0.75 (tuned for narrative/web corpora); we run lower because concept-page collections include structured list pages with high information density per word — full Lucene normalization over-penalizes them.",
121
165
  ),
122
166
  consolidation_interval_hours: z
123
167
  .number({
@@ -10,6 +10,12 @@ export const PlatformConfigSchema = z
10
10
  )
11
11
  .default("")
12
12
  .describe("Base URL of the Vellum platform API"),
13
+ subdomain: z
14
+ .string({ error: "platform.subdomain must be a string" })
15
+ .default("")
16
+ .describe(
17
+ "Registered subdomain on vellum.me (e.g. 'apollobot' → apollobot.vellum.me). Set automatically by 'assistant domain register'.",
18
+ ),
13
19
  })
14
20
  .describe("Vellum platform connection settings");
15
21
 
@@ -4,7 +4,7 @@ import { SttServiceSchema } from "./stt.js";
4
4
  import { TtsServiceSchema } from "./tts.js";
5
5
 
6
6
  const ServiceModeSchema = z.enum(["managed", "your-own"]);
7
- export type ServiceMode = z.infer<typeof ServiceModeSchema>;
7
+ type ServiceMode = z.infer<typeof ServiceModeSchema>;
8
8
 
9
9
  export const VALID_INFERENCE_PROVIDERS = [
10
10
  "anthropic",
@@ -26,7 +26,6 @@ const VALID_WEB_SEARCH_PROVIDERS = [
26
26
  const BaseServiceSchema = z.object({
27
27
  mode: ServiceModeSchema.default("your-own"),
28
28
  });
29
- export type BaseService = z.infer<typeof BaseServiceSchema>;
30
29
 
31
30
  /**
32
31
  * Inference service entry. Carries only the routing `mode`
@@ -37,52 +36,41 @@ export type BaseService = z.infer<typeof BaseServiceSchema>;
37
36
  * workspace migration `039-drop-legacy-llm-keys`.
38
37
  */
39
38
  const InferenceServiceSchema = BaseServiceSchema;
40
- export type InferenceService = z.infer<typeof InferenceServiceSchema>;
41
39
 
42
40
  const ImageGenerationServiceSchema = BaseServiceSchema.extend({
43
41
  provider: z.enum(VALID_IMAGE_GEN_PROVIDERS).default("gemini"),
44
42
  model: z.string().default("gemini-3.1-flash-image-preview"),
45
43
  });
46
- export type ImageGenerationService = z.infer<
47
- typeof ImageGenerationServiceSchema
48
- >;
49
44
 
50
45
  const WebSearchServiceSchema = BaseServiceSchema.extend({
51
46
  provider: z
52
47
  .enum(VALID_WEB_SEARCH_PROVIDERS)
53
48
  .default("inference-provider-native"),
54
49
  });
55
- export type WebSearchService = z.infer<typeof WebSearchServiceSchema>;
56
50
 
57
51
  const GoogleOAuthServiceSchema = BaseServiceSchema.extend({
58
52
  mode: ServiceModeSchema.default("your-own"),
59
53
  });
60
- export type GoogleOAuthService = z.infer<typeof GoogleOAuthServiceSchema>;
61
54
 
62
55
  const OutlookOAuthServiceSchema = BaseServiceSchema.extend({
63
56
  mode: ServiceModeSchema.default("your-own"),
64
57
  });
65
- export type OutlookOAuthService = z.infer<typeof OutlookOAuthServiceSchema>;
66
58
 
67
59
  const LinearOAuthServiceSchema = BaseServiceSchema.extend({
68
60
  mode: ServiceModeSchema.default("your-own"),
69
61
  });
70
- export type LinearOAuthService = z.infer<typeof LinearOAuthServiceSchema>;
71
62
 
72
63
  const GitHubOAuthServiceSchema = BaseServiceSchema.extend({
73
64
  mode: ServiceModeSchema.default("your-own"),
74
65
  });
75
- export type GitHubOAuthService = z.infer<typeof GitHubOAuthServiceSchema>;
76
66
 
77
67
  const NotionOAuthServiceSchema = BaseServiceSchema.extend({
78
68
  mode: ServiceModeSchema.default("your-own"),
79
69
  });
80
- export type NotionOAuthService = z.infer<typeof NotionOAuthServiceSchema>;
81
70
 
82
71
  const TwitterOAuthServiceSchema = BaseServiceSchema.extend({
83
72
  mode: ServiceModeSchema.default("your-own"),
84
73
  });
85
- export type TwitterOAuthService = z.infer<typeof TwitterOAuthServiceSchema>;
86
74
 
87
75
  /**
88
76
  * `services.meet.host.*` — daemon-side knobs for the externalized meet-join
@@ -106,7 +94,6 @@ const MeetHostConfigSchema = z
106
94
  ),
107
95
  })
108
96
  .describe("Daemon-side configuration for the external meet-join skill host");
109
- export type MeetHostConfig = z.infer<typeof MeetHostConfigSchema>;
110
97
 
111
98
  /**
112
99
  * Daemon-side `services.meet` block. Intentionally distinct from the
@@ -120,7 +107,6 @@ const MeetDaemonServiceSchema = z
120
107
  host: MeetHostConfigSchema.default(MeetHostConfigSchema.parse({})),
121
108
  })
122
109
  .describe("meet-join skill daemon-side configuration");
123
- export type MeetDaemonService = z.infer<typeof MeetDaemonServiceSchema>;
124
110
 
125
111
  export const ServicesSchema = z.object({
126
112
  inference: InferenceServiceSchema.default(InferenceServiceSchema.parse({})),
@@ -149,9 +149,3 @@ export const SkillsConfigSchema = z
149
149
  );
150
150
 
151
151
  export type SkillEntryConfig = z.infer<typeof SkillEntryConfigSchema>;
152
- export type SkillsLoadConfig = z.infer<typeof SkillsLoadConfigSchema>;
153
- export type SkillsInstallConfig = z.infer<typeof SkillsInstallConfigSchema>;
154
- export type RemoteProviderConfig = z.infer<typeof RemoteProviderConfigSchema>;
155
- export type RemoteProvidersConfig = z.infer<typeof RemoteProvidersConfigSchema>;
156
- export type RemotePolicyConfig = z.infer<typeof RemotePolicyConfigSchema>;
157
- export type SkillsConfig = z.infer<typeof SkillsConfigSchema>;
@@ -11,7 +11,7 @@ import {
11
11
  * updates propagate automatically. User-created profiles (keyed by
12
12
  * different names) are never touched.
13
13
  */
14
- export const MANAGED_PROFILE_SEED_DATA: Record<string, ProfileEntry> = {
14
+ const MANAGED_PROFILE_SEED_DATA: Record<string, ProfileEntry> = {
15
15
  balanced: {
16
16
  source: "managed",
17
17
  label: "Balanced",
@@ -961,19 +961,6 @@ export function updateChannelStatus(
961
961
  return parseChannel(existing);
962
962
  }
963
963
 
964
- /**
965
- * Update the lastSeenAt timestamp on a contact channel by its primary key.
966
- * Optimized for the hot path — single UPDATE with no prior SELECT.
967
- */
968
- export function updateChannelLastSeenById(channelId: string): void {
969
- const db = getDb();
970
- const now = Date.now();
971
- db.update(contactChannels)
972
- .set({ lastSeenAt: now, updatedAt: now })
973
- .where(eq(contactChannels.id, channelId))
974
- .run();
975
- }
976
-
977
964
  /**
978
965
  * Update a guardian contact's principalId and its channel's identity fields.
979
966
  * Used for healing guardian binding drift when the JWT principal no longer
@@ -1037,23 +1024,6 @@ export function updateContactPrincipalAndChannel(
1037
1024
  return true;
1038
1025
  }
1039
1026
 
1040
- /**
1041
- * Atomically increment interactionCount and set lastInteraction on a contact channel.
1042
- * Optimized for the hot path — single UPDATE with no prior SELECT.
1043
- */
1044
- export function updateChannelInteraction(channelId: string): void {
1045
- const db = getDb();
1046
- const now = Date.now();
1047
- db.update(contactChannels)
1048
- .set({
1049
- lastInteraction: now,
1050
- interactionCount: sql`${contactChannels.interactionCount} + 1`,
1051
- updatedAt: now,
1052
- })
1053
- .where(eq(contactChannels.id, channelId))
1054
- .run();
1055
- }
1056
-
1057
1027
  // ── Assistant Contact Metadata ──────────────────────────────────────
1058
1028
 
1059
1029
  function parseAssistantMetadata(
@@ -8,7 +8,6 @@
8
8
 
9
9
  import type { ChannelId } from "../channels/types.js";
10
10
  import { canonicalizeInboundIdentity } from "../util/canonicalize-identity.js";
11
- import { getLogger } from "../util/logger.js";
12
11
  import { emitContactChange } from "./contact-events.js";
13
12
  import {
14
13
  findContactChannel,
@@ -16,8 +15,6 @@ import {
16
15
  getChannelById,
17
16
  getContact,
18
17
  getContactInternal,
19
- updateChannelInteraction,
20
- updateChannelLastSeenById,
21
18
  updateChannelStatus,
22
19
  upsertContact,
23
20
  } from "./contact-store.js";
@@ -28,7 +25,6 @@ import type {
28
25
  ContactWriteResult,
29
26
  } from "./types.js";
30
27
 
31
- const log = getLogger("contacts-write");
32
28
 
33
29
  // ── Guardian operations ──────────────────────────────────────────────
34
30
 
@@ -179,26 +175,3 @@ export function revokeMember(
179
175
  return { contact, channel: updatedChannel };
180
176
  }
181
177
 
182
- /**
183
- * Update the lastSeenAt timestamp on a contact channel by its ID.
184
- * Expects a plain channel UUID (ContactChannel.id), not the composite API ID.
185
- */
186
- export function touchChannelLastSeen(channelId: string): void {
187
- try {
188
- updateChannelLastSeenById(channelId);
189
- } catch (err) {
190
- log.warn({ err }, "Failed to update channel lastSeenAt");
191
- }
192
- }
193
-
194
- /**
195
- * Track an interaction on the specific channel that received it.
196
- * Swallows errors to avoid disrupting the inbound message hot path.
197
- */
198
- export function touchContactInteraction(channelId: string): void {
199
- try {
200
- updateChannelInteraction(channelId);
201
- } catch (err) {
202
- log.warn({ err }, "Failed to update channel interaction stats");
203
- }
204
- }
@@ -22,8 +22,7 @@ import { truncateToolResultsAcrossHistory } from "./tool-result-truncation.js";
22
22
  const log = getLogger("context-window");
23
23
 
24
24
  export const CONTEXT_SUMMARY_MARKER = "<context_summary>";
25
- export const CONVERSATION_SUMMARY_CALL_SITE: LLMCallSite =
26
- "conversationSummarization";
25
+ const CONVERSATION_SUMMARY_CALL_SITE: LLMCallSite = "conversationSummarization";
27
26
  const MAX_BLOCK_PREVIEW_CHARS = 3000;
28
27
  const MAX_FALLBACK_SUMMARY_CHARS = 12000;
29
28
  const COMPACTION_COOLDOWN_MS = 2 * 60 * 1000;
@@ -28,12 +28,12 @@ export const CES_SECURE_INSTALL_FLAG_KEY = "ces-secure-install" as const;
28
28
  /** Gate for credential grant and audit inspection surfaces. */
29
29
  export const CES_GRANT_AUDIT_FLAG_KEY = "ces-grant-audit" as const;
30
30
 
31
- /** Gate for managed sidecar transport in containerized environments. */
32
- export const CES_MANAGED_SIDECAR_FLAG_KEY = "ces-managed-sidecar" as const;
33
-
34
31
  /** Gate for routing credential reads/writes through the CES process. */
35
32
  const CES_CREDENTIAL_BACKEND_FLAG_KEY = "ces-credential-backend" as const;
36
33
 
34
+ /** Gate for managed sidecar transport in containerized environments. */
35
+ export const CES_MANAGED_SIDECAR_FLAG_KEY = "ces-managed-sidecar" as const;
36
+
37
37
  // ---------------------------------------------------------------------------
38
38
  // Public API — predicate functions
39
39
  // ---------------------------------------------------------------------------
@@ -66,13 +66,6 @@ export function isCesGrantAuditEnabled(config: AssistantConfig): boolean {
66
66
  return isAssistantFeatureFlagEnabled(CES_GRANT_AUDIT_FLAG_KEY, config);
67
67
  }
68
68
 
69
- /**
70
- * Whether managed sidecar transport should be used for CES communication.
71
- */
72
- export function isCesManagedSidecarEnabled(config: AssistantConfig): boolean {
73
- return isAssistantFeatureFlagEnabled(CES_MANAGED_SIDECAR_FLAG_KEY, config);
74
- }
75
-
76
69
  /**
77
70
  * Whether credential reads and writes should be routed through the CES process.
78
71
  */
@@ -81,3 +74,10 @@ export function isCesCredentialBackendEnabled(
81
74
  ): boolean {
82
75
  return isAssistantFeatureFlagEnabled(CES_CREDENTIAL_BACKEND_FLAG_KEY, config);
83
76
  }
77
+
78
+ /**
79
+ * Whether managed sidecar transport should be used for CES communication.
80
+ */
81
+ export function isCesManagedSidecarEnabled(config: AssistantConfig): boolean {
82
+ return isAssistantFeatureFlagEnabled(CES_MANAGED_SIDECAR_FLAG_KEY, config);
83
+ }
@@ -12,12 +12,6 @@
12
12
  * creates a socket-based CesTransport. The CES sidecar manages its own
13
13
  * lifecycle; the process manager only manages the transport connection.
14
14
  *
15
- * Feature-flag gate: Managed sidecar mode is controlled by the
16
- * `ces-managed-sidecar` feature flag (checked via the required
17
- * AssistantConfig). When the flag is off, the process manager skips
18
- * managed discovery even in containerized environments, ensuring
19
- * rollback safety.
20
- *
21
15
  * Managed env contract:
22
16
  * - CES_BOOTSTRAP_SOCKET — Path to the bootstrap Unix socket (shared emptyDir)
23
17
  * - /assistant-data-ro — Assistant data mounted read-only into the CES sidecar
@@ -42,7 +36,6 @@ import {
42
36
  type LocalSourceDiscoverySuccess,
43
37
  type ManagedDiscoverySuccess,
44
38
  } from "./executable-discovery.js";
45
- import { isCesManagedSidecarEnabled } from "./feature-gates.js";
46
39
 
47
40
  const log = getLogger("ces-process-manager");
48
41
 
@@ -71,10 +64,8 @@ export const CES_PRIVATE_DATA_DIR = "/ces-data";
71
64
 
72
65
  export interface CesProcessManagerConfig {
73
66
  /**
74
- * Assistant configuration for feature-flag checks.
75
- * The managed sidecar path is gated behind the `ces-managed-sidecar`
76
- * feature flag via this config. When omitted (e.g. CLI / admin
77
- * callers), managed mode is allowed unconditionally.
67
+ * Assistant configuration.
68
+ * Reserved for future feature-flag checks or config-driven behavior.
78
69
  */
79
70
  assistantConfig?: AssistantConfig;
80
71
  }
@@ -88,10 +79,6 @@ export interface CesProcessManager {
88
79
  * Start the CES process (local) or connect to the sidecar (managed).
89
80
  * Returns a CesTransport ready for use with createCesClient().
90
81
  *
91
- * When the `ces-managed-sidecar` feature flag is off, managed mode
92
- * is skipped even in containerized environments — the process manager
93
- * falls back to local discovery.
94
- *
95
82
  * Throws if CES is unavailable.
96
83
  */
97
84
  start(): Promise<CesTransport>;
@@ -118,7 +105,7 @@ export interface CesProcessManager {
118
105
  // ---------------------------------------------------------------------------
119
106
 
120
107
  export function createCesProcessManager(
121
- config: CesProcessManagerConfig,
108
+ _config: CesProcessManagerConfig,
122
109
  ): CesProcessManager {
123
110
  let childProcess: Subprocess | null = null;
124
111
  let managedSocket: Socket | null = null;
@@ -131,31 +118,15 @@ export function createCesProcessManager(
131
118
  throw new Error("CES process manager is already running");
132
119
  }
133
120
 
134
- // Feature-flag gate: when the managed sidecar flag is off, skip
135
- // managed discovery entirely. This ensures rollback safety —
136
- // disabling the flag leaves existing non-agent platform consumers
137
- // intact.
138
- const managedAllowed = config.assistantConfig
139
- ? isCesManagedSidecarEnabled(config.assistantConfig)
140
- : true; // No config → allow managed mode unconditionally (CLI/admin callers)
141
-
142
- if (managedAllowed) {
143
- discoveryResult = await discoverCes();
144
- if (discoveryResult.mode === "unavailable") {
145
- // The managed sidecar bootstrap socket is not present — this happens
146
- // when the flag is enabled by default but the instance pre-dates the
147
- // socket volume mount (e.g. existing Docker configs without the
148
- // ces-bootstrap volume). Warn and fall back to local discovery so
149
- // these deployments don't fail on upgrade.
150
- log.warn(
151
- { reason: discoveryResult.reason },
152
- "CES managed sidecar bootstrap socket unavailable — falling back to local CES discovery",
153
- );
154
- discoveryResult = discoverLocalCes();
155
- }
156
- } else {
157
- log.info(
158
- "CES managed sidecar feature flag is off — skipping managed discovery, falling back to local",
121
+ discoveryResult = await discoverCes();
122
+ if (discoveryResult.mode === "unavailable") {
123
+ // The managed sidecar bootstrap socket is not present — this happens
124
+ // when the instance pre-dates the socket volume mount (e.g. existing
125
+ // Docker configs without the ces-bootstrap volume). Warn and fall
126
+ // back to local discovery so these deployments don't fail on upgrade.
127
+ log.warn(
128
+ { reason: discoveryResult.reason },
129
+ "CES managed sidecar bootstrap socket unavailable — falling back to local CES discovery",
159
130
  );
160
131
  discoveryResult = discoverLocalCes();
161
132
  }