@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
@@ -1,3 +1,4 @@
1
+ import { Cron } from "croner";
1
2
  import { z } from "zod";
2
3
 
3
4
  export const HeartbeatConfigSchema = z
@@ -10,8 +11,22 @@ export const HeartbeatConfigSchema = z
10
11
  .number({ error: "heartbeat.intervalMs must be a number" })
11
12
  .int("heartbeat.intervalMs must be an integer")
12
13
  .positive("heartbeat.intervalMs must be a positive integer")
13
- .default(6 * 3_600_000)
14
+ .default(30 * 60_000)
14
15
  .describe("Time between heartbeat checks in milliseconds"),
16
+ cronExpression: z
17
+ .string()
18
+ .nullable()
19
+ .default(null)
20
+ .describe(
21
+ "Cron expression for heartbeat timing. When set, heartbeats fire at the specified clock times instead of using intervalMs.",
22
+ ),
23
+ timezone: z
24
+ .string()
25
+ .nullable()
26
+ .default(null)
27
+ .describe(
28
+ "Timezone for cron expression evaluation, e.g. 'America/New_York'. Ignored when cronExpression is null.",
29
+ ),
15
30
  activeHoursStart: z
16
31
  .number({ error: "heartbeat.activeHoursStart must be a number" })
17
32
  .int("heartbeat.activeHoursStart must be an integer")
@@ -80,6 +95,54 @@ export const HeartbeatConfigSchema = z
80
95
  message,
81
96
  });
82
97
  }
98
+
99
+ // Validate cronExpression and timezone when cronExpression is set.
100
+ // Separate the validations so timezone errors are attributed to the
101
+ // timezone path — if both paths point at cronExpression, the config
102
+ // loader's delete-and-retry would strip cronExpression but leave the
103
+ // invalid timezone, cascading to a full defaults reset.
104
+ if (config.cronExpression != null) {
105
+ try {
106
+ new Cron(config.cronExpression, { maxRuns: 0 });
107
+ } catch (err) {
108
+ ctx.addIssue({
109
+ code: z.ZodIssueCode.custom,
110
+ path: ["cronExpression"],
111
+ message: err instanceof Error ? err.message : String(err),
112
+ });
113
+ }
114
+ if (config.timezone != null) {
115
+ try {
116
+ new Cron(config.cronExpression, {
117
+ maxRuns: 0,
118
+ timezone: config.timezone,
119
+ });
120
+ } catch {
121
+ // The cron expression itself is valid (or already flagged above),
122
+ // so a failure here is from the timezone.
123
+ try {
124
+ Intl.DateTimeFormat(undefined, { timeZone: config.timezone });
125
+ } catch (tzErr) {
126
+ ctx.addIssue({
127
+ code: z.ZodIssueCode.custom,
128
+ path: ["timezone"],
129
+ message: tzErr instanceof Error ? tzErr.message : String(tzErr),
130
+ });
131
+ }
132
+ }
133
+ }
134
+ } else if (config.timezone != null) {
135
+ // cronExpression is null but timezone is set — validate timezone independently
136
+ try {
137
+ Intl.DateTimeFormat(undefined, { timeZone: config.timezone });
138
+ } catch (err) {
139
+ ctx.addIssue({
140
+ code: z.ZodIssueCode.custom,
141
+ path: ["timezone"],
142
+ message: err instanceof Error ? err.message : String(err),
143
+ });
144
+ }
145
+ }
83
146
  });
84
147
 
85
148
  export type HeartbeatConfig = z.infer<typeof HeartbeatConfigSchema>;
@@ -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)",
@@ -70,6 +70,8 @@ export const LLMCallSiteEnum = z.enum([
70
70
  "inference",
71
71
  "feedEventCopy",
72
72
  "trustRuleSuggestion",
73
+ "proactiveArtifactDecision",
74
+ "proactiveArtifactBuild",
73
75
  ]);
74
76
  export type LLMCallSite = z.infer<typeof LLMCallSiteEnum>;
75
77
 
@@ -91,7 +93,6 @@ export type LLMCallSite = z.infer<typeof LLMCallSiteEnum>;
91
93
  * mapping table.
92
94
  */
93
95
  const EffortEnum = z.enum(["none", "low", "medium", "high", "xhigh", "max"]);
94
- export type Effort = z.infer<typeof EffortEnum>;
95
96
 
96
97
  export const SpeedEnum = z.enum(["standard", "fast"]);
97
98
  export type Speed = z.infer<typeof SpeedEnum>;
@@ -102,7 +103,6 @@ export type Speed = z.infer<typeof SpeedEnum>;
102
103
  * are stripped in `retry.ts` normalization.
103
104
  */
104
105
  const VerbosityEnum = z.enum(["low", "medium", "high"]);
105
- export type Verbosity = z.infer<typeof VerbosityEnum>;
106
106
 
107
107
  // ---------------------------------------------------------------------------
108
108
  // Leaf primitives (shared between LLMConfigBase and LLMConfigFragment)
@@ -150,7 +150,6 @@ const ThinkingSchema = z.object({
150
150
  enabled: ThinkingEnabledSchema.default(true),
151
151
  streamThinking: ThinkingStreamThinkingSchema.default(true),
152
152
  });
153
- export type Thinking = z.infer<typeof ThinkingSchema>;
154
153
 
155
154
  // Fragment view: every field optional, no defaults injected. Defining this
156
155
  // separately (rather than `ThinkingSchema.partial()`) avoids having Zod
@@ -243,7 +242,6 @@ const OpenRouterOnlyItemSchema = z.string().min(1);
243
242
  const OpenRouterSchema = z.object({
244
243
  only: z.array(OpenRouterOnlyItemSchema).default([]),
245
244
  });
246
- export type OpenRouter = z.infer<typeof OpenRouterSchema>;
247
245
 
248
246
  const OpenRouterDeepPartialSchema = z.object({
249
247
  only: z.array(OpenRouterOnlyItemSchema).optional(),
@@ -257,8 +255,8 @@ const OpenRouterDeepPartialSchema = z.object({
257
255
  * Distinguishes daemon-managed profiles (overwritten on every startup) from
258
256
  * user-created ones (never touched by the daemon).
259
257
  */
260
- export const ProfileSource = z.enum(["managed", "user"]);
261
- export type ProfileSource = z.infer<typeof ProfileSource>;
258
+ const ProfileSource = z.enum(["managed", "user"]);
259
+ type ProfileSource = z.infer<typeof ProfileSource>;
262
260
 
263
261
  // ---------------------------------------------------------------------------
264
262
  // Pricing overrides
@@ -270,7 +268,6 @@ const PricingOverrideSchema = z.object({
270
268
  inputPer1M: z.number().nonnegative(),
271
269
  outputPer1M: z.number().nonnegative(),
272
270
  });
273
- export type PricingOverride = z.infer<typeof PricingOverrideSchema>;
274
271
 
275
272
  // ---------------------------------------------------------------------------
276
273
  // Base config (all fields defaulted) and Fragment (all fields optional)
@@ -302,7 +299,7 @@ export type LLMConfigBase = z.infer<typeof LLMConfigBase>;
302
299
  * objects so callers can override individual leaves (e.g. `{ thinking:
303
300
  * { enabled: false } }`).
304
301
  */
305
- export const LLMConfigFragment = z.object({
302
+ const LLMConfigFragment = z.object({
306
303
  provider: LLMProvider.optional(),
307
304
  model: ModelSchema.optional(),
308
305
  maxTokens: MaxTokensSchema.optional(),
@@ -314,7 +311,7 @@ export const LLMConfigFragment = z.object({
314
311
  contextWindow: ContextWindowDeepPartialSchema.optional(),
315
312
  openrouter: OpenRouterDeepPartialSchema.optional(),
316
313
  });
317
- export type LLMConfigFragment = z.infer<typeof LLMConfigFragment>;
314
+ type LLMConfigFragment = z.infer<typeof LLMConfigFragment>;
318
315
 
319
316
  /**
320
317
  * A named profile entry: an `LLMConfigFragment` augmented with
@@ -337,7 +334,7 @@ export type ProfileEntry = z.infer<typeof ProfileEntry>;
337
334
  const LLMCallSiteConfig = LLMConfigFragment.extend({
338
335
  profile: z.string().min(1).optional(),
339
336
  });
340
- export type LLMCallSiteConfig = z.infer<typeof LLMCallSiteConfig>;
337
+ type LLMCallSiteConfig = z.infer<typeof LLMCallSiteConfig>;
341
338
 
342
339
  // ---------------------------------------------------------------------------
343
340
  // 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({
@@ -96,6 +149,19 @@ export const MemoryCleanupConfigSchema = z
96
149
  .describe(
97
150
  "Retention period for LLM request/response logs in milliseconds (null keeps forever, 0 prunes immediately)",
98
151
  ),
152
+ traceEventRetentionDays: z
153
+ .number({
154
+ error: "memory.cleanup.traceEventRetentionDays must be a number",
155
+ })
156
+ .int("memory.cleanup.traceEventRetentionDays must be an integer")
157
+ .nonnegative(
158
+ "memory.cleanup.traceEventRetentionDays must be non-negative",
159
+ )
160
+ .max(365, "memory.cleanup.traceEventRetentionDays must be <= 365 days")
161
+ .default(3)
162
+ .describe(
163
+ "Number of days to retain trace events before cleanup (0 disables pruning)",
164
+ ),
99
165
  })
100
166
  .describe("Automatic memory cleanup and garbage collection settings");
101
167
 
@@ -7,6 +7,33 @@ import { z } from "zod";
7
7
  */
8
8
  const WEIGHT_SUM_TOLERANCE = 0.001;
9
9
 
10
+ /**
11
+ * Default cross-encoder model for memory v2 reranking.
12
+ * `Alibaba-NLP/gte-reranker-modernbert-base` (149M, Apache-2.0) — 2025
13
+ * ModernBERT-backbone reranker; smaller, newer, and cleaner-licensed than
14
+ * the bge family while matching or beating their retrieval-benchmark scores.
15
+ * Has ONNX exports at the standard `onnx/model.onnx` path.
16
+ */
17
+ const DEFAULT_RERANK_MODEL = "Alibaba-NLP/gte-reranker-modernbert-base";
18
+
19
+ /**
20
+ * ONNX weight precision passed to `@huggingface/transformers`. Sourced from
21
+ * transformers.js's supported `dtype` values; `q8` (int8) is ~3× faster than
22
+ * `fp32` on CPU with negligible reranker accuracy loss. Single source of
23
+ * truth for both the schema enum and the `LocalRerankBackend` type.
24
+ */
25
+ export const RerankDtypeEnum = z.enum([
26
+ "fp32",
27
+ "fp16",
28
+ "q8",
29
+ "int8",
30
+ "uint8",
31
+ "q4",
32
+ "bnb4",
33
+ "q4f16",
34
+ ]);
35
+ export type RerankDtype = z.infer<typeof RerankDtypeEnum>;
36
+
10
37
  /**
11
38
  * Memory v2 (concept-page activation model) configuration.
12
39
  *
@@ -21,7 +48,7 @@ export const MemoryV2ConfigSchema = z
21
48
  .object({
22
49
  enabled: z
23
50
  .boolean({ error: "memory.v2.enabled must be a boolean" })
24
- .default(false)
51
+ .default(true)
25
52
  .describe(
26
53
  "Whether the v2 memory subsystem (concept-page activation model) is enabled. Independent of the memory-v2-enabled feature flag — both must be true for v2 to run.",
27
54
  ),
@@ -83,17 +110,18 @@ export const MemoryV2ConfigSchema = z
83
110
  .number({ error: "memory.v2.top_k must be a number" })
84
111
  .int("memory.v2.top_k must be an integer")
85
112
  .positive("memory.v2.top_k must be a positive integer")
86
- .default(20)
113
+ .default(25)
87
114
  .describe(
88
- "Number of top-activation concept pages considered for injection per turn",
115
+ "Number of top-activation entries (concept pages and skills combined) considered for injection per turn. Skills are scored alongside concepts in the same pool; this cap covers both.",
89
116
  ),
90
- top_k_skills: z
91
- .number({ error: "memory.v2.top_k_skills must be a number" })
92
- .int()
93
- .nonnegative()
94
- .default(5)
117
+ ann_candidate_limit: z
118
+ .number({ error: "memory.v2.ann_candidate_limit must be a number" })
119
+ .int("memory.v2.ann_candidate_limit must be an integer")
120
+ .positive("memory.v2.ann_candidate_limit must be a positive integer")
121
+ .nullable()
122
+ .default(null)
95
123
  .describe(
96
- "Cap on the per-turn skill-autoinjection slate rendered in `### Skills You Can Use`. 0 disables skill autoinjection without code changes.",
124
+ "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.",
97
125
  ),
98
126
  epsilon: z
99
127
  .number({ error: "memory.v2.epsilon must be a number" })
@@ -107,17 +135,52 @@ export const MemoryV2ConfigSchema = z
107
135
  .number({ error: "memory.v2.dense_weight must be a number" })
108
136
  .min(0, "memory.v2.dense_weight must be >= 0")
109
137
  .max(1, "memory.v2.dense_weight must be <= 1")
110
- .default(0.7)
138
+ .default(0.85)
111
139
  .describe(
112
- "Weight on dense (cosine) similarity in the hybrid retrieval score",
140
+ "Weight on dense (cosine) similarity in the hybrid retrieval score — dense embeddings dominate the score.",
113
141
  ),
114
142
  sparse_weight: z
115
143
  .number({ error: "memory.v2.sparse_weight must be a number" })
116
144
  .min(0, "memory.v2.sparse_weight must be >= 0")
117
145
  .max(1, "memory.v2.sparse_weight must be <= 1")
118
- .default(0.3)
146
+ .default(0.15)
147
+ .describe(
148
+ "Weight on sparse (BM25-style) similarity in the hybrid retrieval score — sparse acts as a discriminator for keyword-rich queries.",
149
+ ),
150
+ // Adaptive sparse-weighting knobs. Both fields are intentionally
151
+ // optional with no default — the schema serialiser drops absent
152
+ // optionals so these stay invisible to operators who never tune them.
153
+ // The defaults live in `effectiveWeights` (sim.ts).
154
+ min_sparse_spread: z
155
+ .number({ error: "memory.v2.min_sparse_spread must be a number" })
156
+ .min(0, "memory.v2.min_sparse_spread must be >= 0")
157
+ .max(1, "memory.v2.min_sparse_spread must be <= 1")
158
+ .optional()
159
+ .describe(
160
+ "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.",
161
+ ),
162
+ full_sparse_spread: z
163
+ .number({ error: "memory.v2.full_sparse_spread must be a number" })
164
+ .min(0, "memory.v2.full_sparse_spread must be >= 0")
165
+ .max(1, "memory.v2.full_sparse_spread must be <= 1")
166
+ .optional()
119
167
  .describe(
120
- "Weight on sparse (BM25-style) similarity in the hybrid retrieval score",
168
+ "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.",
169
+ ),
170
+ bm25_k1: z
171
+ .number({ error: "memory.v2.bm25_k1 must be a number" })
172
+ .min(0, "memory.v2.bm25_k1 must be >= 0")
173
+ .default(1.2)
174
+ .describe(
175
+ "BM25 term-frequency saturation parameter. Standard Lucene default — increase to make repeated mentions of a term matter more, decrease to flatten the curve.",
176
+ ),
177
+ bm25_b: z
178
+ .number({ error: "memory.v2.bm25_b must be a number" })
179
+ .min(0, "memory.v2.bm25_b must be >= 0")
180
+ .max(1, "memory.v2.bm25_b must be <= 1")
181
+ .default(0.4)
182
+ .describe(
183
+ "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
184
  ),
122
185
  consolidation_interval_hours: z
123
186
  .number({
@@ -148,6 +211,51 @@ export const MemoryV2ConfigSchema = z
148
211
  .describe(
149
212
  "Optional path to a file whose contents replace the bundled consolidation prompt. Absolute paths are used as-is, a leading `~/` is expanded to the home directory, otherwise the path is resolved under the workspace root. The loaded contents may include `{{CUTOFF}}`, which is substituted with the run's ISO-8601 cutoff timestamp. If the file is missing, unreadable, or empty, the bundled prompt is used and a warning is logged.",
150
213
  ),
214
+ rerank: z
215
+ .object({
216
+ enabled: z
217
+ .boolean()
218
+ .default(false)
219
+ .describe(
220
+ "Whether to apply cross-encoder reranking as an additive A_o boost on the user + assistant channels. Disabled by default — opt in once measured.",
221
+ ),
222
+ top_k: z
223
+ .number()
224
+ .int()
225
+ .positive()
226
+ .max(200)
227
+ .default(50)
228
+ .describe(
229
+ "Number of candidates from the top of the pre-rerank-A_o pool to send through the reranker. Tail candidates contribute zero rerank boost and keep their pure fused activation.",
230
+ ),
231
+ alpha: z
232
+ .number()
233
+ .min(0)
234
+ .max(1)
235
+ .default(0.3)
236
+ .describe(
237
+ "Per-channel rerank weight: each top-K slug gets `alpha · normalized_rerank` added to A_o weighted by `c_user` (user channel) or `c_assistant` (assistant channel). Top reranker hit can lift A_o by up to `(c_user + c_assistant) · alpha`; bottom of top_k stays roughly unchanged.",
238
+ ),
239
+ model: z
240
+ .string()
241
+ .default(DEFAULT_RERANK_MODEL)
242
+ .describe(
243
+ "HuggingFace model id for the cross-encoder. Must have an ONNX export reachable from huggingface.co/<model>/resolve/main/onnx/model.onnx.",
244
+ ),
245
+ dtype: RerankDtypeEnum.default("q8").describe(
246
+ "ONNX weight precision passed to `@huggingface/transformers`. `q8` (int8) is ~3× faster than `fp32` on CPU with negligible reranker accuracy loss. The worker fails to spawn if the configured model has no matching quantized export — `reranker.ts` then falls back to pure fused scores for the turn.",
247
+ ),
248
+ })
249
+ .default({
250
+ enabled: false,
251
+ top_k: 50,
252
+ alpha: 0.3,
253
+ model: DEFAULT_RERANK_MODEL,
254
+ dtype: "q8",
255
+ })
256
+ .describe(
257
+ "Cross-encoder rerank configuration. When enabled, picks the top-K candidates by pre-rerank A_o, runs the cross-encoder once per channel (user, assistant) on that unified set, and adds an alpha-weighted normalized boost to A_o for each scored slug.",
258
+ ),
151
259
  })
152
260
  .describe(
153
261
  "Memory v2 — concept-page activation model with hourly LLM-driven consolidation",
@@ -1,5 +1,41 @@
1
1
  import { z } from "zod";
2
2
 
3
+ const IANA_TIMEZONE_IDENTIFIER_RE =
4
+ /^(?:UTC|[A-Za-z][A-Za-z0-9_+-]*(?:\/[A-Za-z0-9_+-]+)+)$/;
5
+
6
+ function canonicalizeIanaTimezone(timezone: string): string | null {
7
+ const trimmed = timezone.trim();
8
+ if (trimmed.length === 0) {
9
+ return "";
10
+ }
11
+ if (!IANA_TIMEZONE_IDENTIFIER_RE.test(trimmed)) {
12
+ return null;
13
+ }
14
+ try {
15
+ return new Intl.DateTimeFormat("en-US", {
16
+ timeZone: trimmed,
17
+ }).resolvedOptions().timeZone;
18
+ } catch {
19
+ return null;
20
+ }
21
+ }
22
+
23
+ function timezoneConfigField(path: string) {
24
+ return z
25
+ .string({ error: `${path} must be a string` })
26
+ .transform((value, ctx) => {
27
+ const canonical = canonicalizeIanaTimezone(value);
28
+ if (canonical === null) {
29
+ ctx.addIssue({
30
+ code: "custom",
31
+ message: `${path} must be a valid IANA timezone identifier or an empty string`,
32
+ });
33
+ return z.NEVER;
34
+ }
35
+ return canonical;
36
+ });
37
+ }
38
+
3
39
  export const PlatformConfigSchema = z
4
40
  .object({
5
41
  baseUrl: z
@@ -10,6 +46,12 @@ export const PlatformConfigSchema = z
10
46
  )
11
47
  .default("")
12
48
  .describe("Base URL of the Vellum platform API"),
49
+ subdomain: z
50
+ .string({ error: "platform.subdomain must be a string" })
51
+ .default("")
52
+ .describe(
53
+ "Registered subdomain on vellum.me (e.g. 'apollobot' → apollobot.vellum.me). Set automatically by 'assistant domain register'.",
54
+ ),
13
55
  })
14
56
  .describe("Vellum platform connection settings");
15
57
 
@@ -50,11 +92,15 @@ export const DaemonConfigSchema = z
50
92
 
51
93
  export const UiConfigSchema = z
52
94
  .object({
53
- userTimezone: z
54
- .string({ error: "ui.userTimezone must be a string" })
95
+ userTimezone: timezoneConfigField("ui.userTimezone")
96
+ .optional()
97
+ .describe(
98
+ "Manual IANA timezone override used for assistant temporal grounding and date/time display (e.g. 'America/New_York'). Use an empty string to clear the setting.",
99
+ ),
100
+ detectedTimezone: timezoneConfigField("ui.detectedTimezone")
55
101
  .optional()
56
102
  .describe(
57
- "IANA timezone identifier for displaying dates and times (e.g. 'America/New_York')",
103
+ "IANA timezone identifier detected from the client environment for assistant temporal grounding when no manual override is configured (e.g. 'America/New_York'). Use an empty string to clear the setting.",
58
104
  ),
59
105
  })
60
106
  .describe(