@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
@@ -4,13 +4,13 @@ import type { RecallEvidence, RecallSource } from "./types.js";
4
4
 
5
5
  export type RecallAgentConfidence = "high" | "medium" | "low";
6
6
 
7
- export interface RecallAgentToolDefinition {
7
+ interface RecallAgentToolDefinition {
8
8
  name: string;
9
9
  description: string;
10
10
  input_schema: Record<string, unknown>;
11
11
  }
12
12
 
13
- export interface RecallAgentPromptOptions {
13
+ interface RecallAgentPromptOptions {
14
14
  query: string;
15
15
  availableSources?: readonly RecallSource[];
16
16
  evidence: readonly RecallEvidence[];
@@ -18,7 +18,7 @@ export interface RecallAgentPromptOptions {
18
18
  maxSearchCalls?: number;
19
19
  }
20
20
 
21
- export interface RecallAgentPromptBundle {
21
+ interface RecallAgentPromptBundle {
22
22
  prompt: string;
23
23
  evidence: RecallEvidence[];
24
24
  }
@@ -30,14 +30,14 @@ export interface RecallAgentFinish {
30
30
  unresolved?: string[];
31
31
  }
32
32
 
33
- export type RecallFinishFallbackReason =
33
+ type RecallFinishFallbackReason =
34
34
  | "malformed_finish_payload"
35
35
  | "invalid_confidence"
36
36
  | "invalid_citation_ids"
37
37
  | "unknown_citation_ids"
38
38
  | "empty_answer";
39
39
 
40
- export type RecallFinishValidationResult =
40
+ type RecallFinishValidationResult =
41
41
  | { ok: true; finish: RecallAgentFinish }
42
42
  | {
43
43
  ok: false;
@@ -46,7 +46,7 @@ export type RecallFinishValidationResult =
46
46
  missingCitationIds?: string[];
47
47
  };
48
48
 
49
- export interface RecallCitationValidationResult {
49
+ interface RecallCitationValidationResult {
50
50
  ok: boolean;
51
51
  validCitationIds: string[];
52
52
  missingCitationIds: string[];
@@ -5,6 +5,7 @@ import type {
5
5
  ProviderResponse,
6
6
  ToolUseContent,
7
7
  } from "../../providers/types.js";
8
+ import { redactSecrets } from "../../security/secret-scanner.js";
8
9
  import {
9
10
  buildRecallAgentPromptBundle,
10
11
  FINISH_RECALL_TOOL_DEFINITION,
@@ -42,7 +43,7 @@ import type {
42
43
  RecallSource,
43
44
  } from "./types.js";
44
45
 
45
- export type AgenticRecallFallbackReason =
46
+ type AgenticRecallFallbackReason =
46
47
  | "no_provider"
47
48
  | "provider_error"
48
49
  | "timeout"
@@ -51,7 +52,7 @@ export type AgenticRecallFallbackReason =
51
52
  | "citation_validation_failed"
52
53
  | "finish_answer_validation_failed";
53
54
 
54
- export interface AgenticRecallSearchDebug {
55
+ interface AgenticRecallSearchDebug {
55
56
  round: number;
56
57
  query: string;
57
58
  sources: RecallSource[];
@@ -61,7 +62,7 @@ export interface AgenticRecallSearchDebug {
61
62
  error?: string;
62
63
  }
63
64
 
64
- export interface AgenticRecallInspectDebug {
65
+ interface AgenticRecallInspectDebug {
65
66
  round: number;
66
67
  paths: string[];
67
68
  reason: string;
@@ -69,7 +70,7 @@ export interface AgenticRecallInspectDebug {
69
70
  errors?: Array<{ path: string; reason: string }>;
70
71
  }
71
72
 
72
- export interface AgenticRecallDebug {
73
+ interface AgenticRecallDebug {
73
74
  mode: "agentic" | "deterministic_fallback";
74
75
  normalizedInput: NormalizedRecallInput;
75
76
  roundLimit: number;
@@ -86,12 +87,12 @@ export interface AgenticRecallDebug {
86
87
  fallbackDetail?: string;
87
88
  }
88
89
 
89
- export interface AgenticRecallAnswer extends RecallAnswer {
90
+ interface AgenticRecallAnswer extends RecallAnswer {
90
91
  content: string;
91
92
  debug: AgenticRecallDebug;
92
93
  }
93
94
 
94
- export interface RunAgenticRecallOptions {
95
+ interface RunAgenticRecallOptions {
95
96
  searchOptions?: DeterministicRecallSearchOptions;
96
97
  }
97
98
 
@@ -305,7 +306,17 @@ export async function runAgenticRecall(
305
306
  [...RECALL_AGENT_TOOL_DEFINITIONS],
306
307
  undefined,
307
308
  {
308
- config: { callSite: "recall", temperature: 0 },
309
+ // `thinking: disabled` is required because we set `temperature: 0`
310
+ // explicitly. Anthropic 400s on `temperature` ≠ 1 whenever thinking
311
+ // is enabled or in adaptive mode; without this, profiles that
312
+ // resolve thinking-enabled (Opus 4.x at `effort: high|xhigh`, etc.)
313
+ // would fail. Recall is tool-call-heavy reasoning where determinism
314
+ // matters more than extended chain-of-thought.
315
+ config: {
316
+ callSite: "recall",
317
+ temperature: 0,
318
+ thinking: { type: "disabled" },
319
+ },
309
320
  signal: context.signal,
310
321
  },
311
322
  );
@@ -414,6 +425,30 @@ export async function runAgenticRecall(
414
425
  );
415
426
  }
416
427
 
428
+ /**
429
+ * Redact secrets from workspace-sourced evidence excerpts before they are
430
+ * serialised into a prompt that will be sent to an external LLM provider.
431
+ *
432
+ * Memory, PKB, and conversation evidence is already controlled content —
433
+ * only workspace files can contain arbitrary secrets (API keys, tokens, etc.)
434
+ * written by the user or by tools. This runs the same pattern-based scanner
435
+ * used for shell command summaries and approval prompts, replacing any
436
+ * detected secrets with `<redacted type="…" />` markers.
437
+ *
438
+ * The original evidence array is not mutated; citations and local fallback
439
+ * paths continue to reference unredacted values.
440
+ */
441
+ export function redactWorkspaceEvidence(
442
+ evidence: readonly RecallEvidence[],
443
+ ): readonly RecallEvidence[] {
444
+ return evidence.map((item) => {
445
+ if (item.source !== "workspace") return item;
446
+ const redacted = redactSecrets(item.excerpt);
447
+ if (redacted === item.excerpt) return item;
448
+ return { ...item, excerpt: redacted };
449
+ });
450
+ }
451
+
417
452
  function buildPromptBundle(
418
453
  input: NormalizedRecallInput,
419
454
  evidence: readonly RecallEvidence[],
@@ -422,7 +457,7 @@ function buildPromptBundle(
422
457
  return buildRecallAgentPromptBundle({
423
458
  query: input.query,
424
459
  availableSources: input.sources,
425
- evidence,
460
+ evidence: redactWorkspaceEvidence(evidence),
426
461
  maxSearchCalls: roundLimit,
427
462
  });
428
463
  }
@@ -572,7 +607,14 @@ async function tryFinalFinishRecall(options: {
572
607
  [FINISH_RECALL_TOOL_DEFINITION],
573
608
  undefined,
574
609
  {
575
- config: { callSite: "recall", temperature: 0 },
610
+ // `thinking: disabled` required for the same reason as the agent
611
+ // round above — Anthropic 400s on `temperature` ≠ 1 whenever
612
+ // thinking is enabled or in adaptive mode.
613
+ config: {
614
+ callSite: "recall",
615
+ temperature: 0,
616
+ thinking: { type: "disabled" },
617
+ },
576
618
  signal: options.context.signal,
577
619
  },
578
620
  );
@@ -88,10 +88,7 @@ export async function searchConversationSource(
88
88
 
89
89
  for (const ftsMatch of ftsMatches) {
90
90
  try {
91
- rows = mergeConversationRows(
92
- rows,
93
- searchWithFts(ftsMatch, context.memoryScopeId, queryLimit),
94
- );
91
+ rows = mergeConversationRows(rows, searchWithFts(ftsMatch, queryLimit));
95
92
  } catch {
96
93
  // Try the next, broader query shape.
97
94
  }
@@ -100,7 +97,7 @@ export async function searchConversationSource(
100
97
  }
101
98
 
102
99
  if (rows.length === 0) {
103
- rows = searchWithLike(trimmedQuery, context.memoryScopeId, queryLimit);
100
+ rows = searchWithLike(trimmedQuery, queryLimit);
104
101
  }
105
102
 
106
103
  const sortedRows = rows
@@ -130,7 +127,6 @@ export async function searchConversationSource(
130
127
 
131
128
  function searchWithFts(
132
129
  ftsMatch: string,
133
- memoryScopeId: string,
134
130
  limit: number,
135
131
  ): ConversationEvidenceRow[] {
136
132
  return rawAll<ConversationEvidenceRow>(
@@ -146,14 +142,12 @@ function searchWithFts(
146
142
  JOIN messages m ON m.id = messages_fts.message_id
147
143
  JOIN conversations c ON c.id = m.conversation_id
148
144
  WHERE messages_fts MATCH ?
149
- AND c.memory_scope_id = ?
150
145
  AND (c.conversation_type IS NULL OR c.conversation_type != 'private')
151
146
  AND (c.source IS NULL OR c.source NOT IN (?, ?))
152
147
  ORDER BY bm25(messages_fts), m.created_at DESC
153
148
  LIMIT ?
154
149
  `,
155
150
  ftsMatch,
156
- memoryScopeId,
157
151
  SUBAGENT_SOURCE,
158
152
  AUTO_ANALYSIS_SOURCE,
159
153
  limit,
@@ -162,7 +156,6 @@ function searchWithFts(
162
156
 
163
157
  function searchWithLike(
164
158
  query: string,
165
- memoryScopeId: string,
166
159
  limit: number,
167
160
  ): ConversationEvidenceRow[] {
168
161
  return rawAll<ConversationEvidenceRow>(
@@ -177,14 +170,12 @@ function searchWithLike(
177
170
  FROM messages m
178
171
  JOIN conversations c ON c.id = m.conversation_id
179
172
  WHERE m.content LIKE ? ESCAPE '\\'
180
- AND c.memory_scope_id = ?
181
173
  AND (c.conversation_type IS NULL OR c.conversation_type != 'private')
182
174
  AND (c.source IS NULL OR c.source NOT IN (?, ?))
183
175
  ORDER BY m.created_at DESC
184
176
  LIMIT ?
185
177
  `,
186
178
  buildLikePattern(query),
187
- memoryScopeId,
188
179
  SUBAGENT_SOURCE,
189
180
  AUTO_ANALYSIS_SOURCE,
190
181
  limit,
@@ -47,10 +47,11 @@ import type {
47
47
  } from "../types.js";
48
48
 
49
49
  /**
50
- * True when both v2 gates are on. Single source of truth shared by the recall
51
- * `memory` source (which delegates to v2), the `pkb` source (which
52
- * short-circuits because v2 absorbs PKB as a read source), and the per-turn
53
- * PKB injectors (which go silent so v2 owns the read path end-to-end).
50
+ * True when both v2 gates are on. Single source of truth for whether v2 is
51
+ * the active memory subsystem used by recall sources (`memory`, `pkb`),
52
+ * per-turn injectors, the indexer's v1 graph_extract suppression, and the
53
+ * v1/v2 maintenance scheduler. The historical name retains "Read" but the
54
+ * predicate now gates both read and write paths.
54
55
  */
55
56
  export function isMemoryV2ReadActive(config: AssistantConfig): boolean {
56
57
  return (
@@ -62,11 +63,20 @@ export function isMemoryV2ReadActive(config: AssistantConfig): boolean {
62
63
  const log = getLogger("context-search-memory-v2-source");
63
64
 
64
65
  /**
65
- * Top-K size for the un-restricted ANN candidate query against the v2
66
- * concept-page collection. Larger than the per-call recall limit so spreading
67
- * has neighbors to pull in.
66
+ * Sentinel passed to Qdrant when `config.memory.v2.ann_candidate_limit` is
67
+ * `null` (unlimited). Qdrant's query API requires an explicit numeric
68
+ * `limit`, so unlimited is represented as a number large enough that any
69
+ * realistic concept-page collection is returned in full.
70
+ *
71
+ * Why not `Number.MAX_SAFE_INTEGER`: Qdrant's sparse-vector `SearchContext`
72
+ * pre-allocates `limit * 16` bytes per query, so passing `MAX_SAFE_INTEGER`
73
+ * triggers a ~144 PB allocation and SIGABRTs the Qdrant process. 1_000_000
74
+ * is ~16 MB of pre-allocation in Qdrant — generous headroom over realistic
75
+ * concept-page counts (low thousands today) while staying well clear of
76
+ * the OOM cliff. Bump explicitly via `ann_candidate_limit` if you ever
77
+ * outgrow it.
68
78
  */
69
- const MEMORY_V2_ANN_CANDIDATE_LIMIT = 50;
79
+ const UNLIMITED_ANN_CANDIDATE_LIMIT = 1_000_000;
70
80
 
71
81
  /** Cap individual concept-page files we are willing to read for lexical scan. */
72
82
  const MEMORY_V2_LEXICAL_MAX_FILE_SIZE_BYTES = 256 * 1024;
@@ -181,10 +191,13 @@ async function activationEvidence(
181
191
  if (!denseVector || denseVector.length === 0) return [];
182
192
  const sparseVector = generateSparseEmbedding(trimmedQuery);
183
193
 
194
+ const annLimit =
195
+ context.config.memory.v2.ann_candidate_limit ??
196
+ UNLIMITED_ANN_CANDIDATE_LIMIT;
184
197
  const hits = await hybridQueryConceptPages(
185
198
  denseVector,
186
199
  sparseVector,
187
- MEMORY_V2_ANN_CANDIDATE_LIMIT,
200
+ annLimit,
188
201
  );
189
202
  if (hits.length === 0) return [];
190
203
 
@@ -47,7 +47,6 @@ export async function searchMemorySource(
47
47
  const searchResults = await searchGraphNodes(
48
48
  queryVector,
49
49
  normalizedLimit,
50
- [context.memoryScopeId],
51
50
  sparseVector,
52
51
  );
53
52
 
@@ -24,7 +24,6 @@ export interface RecallEvidence {
24
24
 
25
25
  export interface RecallSearchContext {
26
26
  workingDir: string;
27
- memoryScopeId: string;
28
27
  conversationId: string;
29
28
  config: AssistantConfig;
30
29
  signal?: AbortSignal;
@@ -32,7 +32,7 @@ import {
32
32
  deleteOrphanAttachments,
33
33
  linkAttachmentToMessage,
34
34
  } from "./attachments-store.js";
35
- import { AUTO_ANALYSIS_SOURCE } from "./auto-analysis-guard.js";
35
+ import { AUTO_ANALYSIS_SOURCE } from "./auto-analysis-constants.js";
36
36
  import {
37
37
  projectAssistantMessage,
38
38
  seedForkedConversationAttention,
@@ -115,8 +115,6 @@ export const messageMetadataSchema = z
115
115
  })
116
116
  .passthrough();
117
117
 
118
- export type MessageMetadata = z.infer<typeof messageMetadataSchema>;
119
-
120
118
  function cloneForkMessageMetadata(
121
119
  metadata: string | null,
122
120
  sourceMessageId: string,
@@ -444,11 +442,6 @@ export function getConversationSource(conversationId: string): string | null {
444
442
  return row?.source ?? null;
445
443
  }
446
444
 
447
- export function getConversationMemoryScopeId(conversationId: string): string {
448
- const conv = getConversation(conversationId);
449
- return conv?.memoryScopeId ?? "default";
450
- }
451
-
452
445
  /**
453
446
  * Fetch group_id for a conversation via raw SQL. group_id is NOT in the
454
447
  * Drizzle schema (raw-query-only pattern), so ConversationRow doesn't
@@ -912,7 +905,6 @@ export async function addMessage(
912
905
  if (!opts?.skipIndexing) {
913
906
  try {
914
907
  const config = getConfig();
915
- const scopeId = getConversationMemoryScopeId(conversationId);
916
908
  const parsed = metadata
917
909
  ? messageMetadataSchema.safeParse(metadata)
918
910
  : null;
@@ -927,7 +919,7 @@ export async function addMessage(
927
919
  role: message.role,
928
920
  content: message.content,
929
921
  createdAt: message.createdAt,
930
- scopeId,
922
+ scopeId: "default",
931
923
  provenanceTrustClass,
932
924
  automated,
933
925
  },
@@ -1027,7 +1019,7 @@ export function hasMessages(conversationId: string): boolean {
1027
1019
  return row !== undefined;
1028
1020
  }
1029
1021
 
1030
- export interface PaginatedMessagesResult {
1022
+ interface PaginatedMessagesResult {
1031
1023
  messages: MessageRow[];
1032
1024
  hasMore: boolean;
1033
1025
  }
@@ -1441,12 +1433,12 @@ export function deleteLastExchange(conversationId: string): number {
1441
1433
  * Callers must delete these from the Qdrant collection after the
1442
1434
  * SQLite transaction commits.
1443
1435
  */
1444
- export interface DeletedMemoryIds {
1436
+ interface DeletedMemoryIds {
1445
1437
  segmentIds: string[];
1446
1438
  deletedSummaryIds: string[];
1447
1439
  }
1448
1440
 
1449
- export interface WipeConversationResult extends DeletedMemoryIds {
1441
+ interface WipeConversationResult extends DeletedMemoryIds {
1450
1442
  cancelledJobCount: number;
1451
1443
  }
1452
1444
 
@@ -7,20 +7,15 @@
7
7
  * first contact.
8
8
  */
9
9
 
10
- import { existsSync, unlinkSync } from "node:fs";
11
-
12
10
  import { eq } from "drizzle-orm";
13
11
  import { v4 as uuid } from "uuid";
14
12
 
15
- import { getLogger } from "../util/logger.js";
16
- import { getWorkspacePromptPath } from "../util/platform.js";
13
+ import { cleanupBootstrapFiles } from "../prompts/bootstrap-cleanup.js";
17
14
  import { initConversationDir } from "./conversation-disk-view.js";
18
15
  import { GENERATING_TITLE } from "./conversation-title-service.js";
19
16
  import { getDb } from "./db-connection.js";
20
17
  import { conversationKeys, conversations } from "./schema.js";
21
18
 
22
- const log = getLogger("conversation-key-store");
23
-
24
19
  /** Set after the first conversation is created so BOOTSTRAP.md is deleted on the second. */
25
20
  let firstConversationSeen = false;
26
21
 
@@ -204,15 +199,7 @@ export function getOrCreateConversation(
204
199
  // for its entire duration. Any subsequent conversation means
205
200
  // onboarding is over.
206
201
  if (firstConversationSeen) {
207
- const bp = getWorkspacePromptPath("BOOTSTRAP.md");
208
- if (existsSync(bp)) {
209
- try {
210
- unlinkSync(bp);
211
- log.info("Deleted BOOTSTRAP.md — onboarding conversation ended");
212
- } catch {
213
- // Best-effort
214
- }
215
- }
202
+ cleanupBootstrapFiles("new conversation created after onboarding");
216
203
  }
217
204
  firstConversationSeen = true;
218
205
 
@@ -102,6 +102,7 @@ import {
102
102
  migrateGuardianTimestampsEpochMs,
103
103
  migrateGuardianVerificationPurpose,
104
104
  migrateGuardianVerificationSessions,
105
+ migrateHeartbeatRuns,
105
106
  migrateInviteCodeHashColumn,
106
107
  migrateInviteContactId,
107
108
  migrateLlmRequestLogMessageId,
@@ -153,6 +154,7 @@ import {
153
154
  migrateRenameVoiceToPhone,
154
155
  migrateScheduleOneShotRouting,
155
156
  migrateScheduleQuietFlag,
157
+ migrateScheduleRetryPolicy,
156
158
  migrateScheduleReuseConversation,
157
159
  migrateScheduleScriptColumn,
158
160
  migrateScheduleWakeConversationId,
@@ -163,6 +165,7 @@ import {
163
165
  migrateStripPlaceholderSentinelsFromMessages,
164
166
  migrateStripThinkingFromConsolidated,
165
167
  migrateToolInvocationsMatchedRuleId,
168
+ migrateTraceEventsCreatedAtIndex,
166
169
  migrateUsageDashboardIndexes,
167
170
  migrateUsageLlmCallCount,
168
171
  migrateVoiceInviteColumns,
@@ -401,9 +404,12 @@ export function initializeDb(): void {
401
404
  migrateLlmUsageAttribution,
402
405
  migrateSlackCompactionWatermark,
403
406
  migrateToolInvocationsMatchedRuleId,
407
+ migrateHeartbeatRuns,
404
408
  function migrateBackfillAppConversationIds() {
405
409
  backfillAppConversationIds();
406
410
  },
411
+ migrateScheduleRetryPolicy,
412
+ migrateTraceEventsCreatedAtIndex,
407
413
  ];
408
414
 
409
415
  // Run each migration step, catching and logging individual failures so one
@@ -21,6 +21,7 @@ import {
21
21
  type SparseEmbedding,
22
22
  type TextEmbeddingInput,
23
23
  } from "./embedding-types.js";
24
+ import { SPARSE_VOCAB_SIZE, tokenHash, tokenize } from "./sparse-tokenize.js";
24
25
 
25
26
  export type { EmbeddingInput, MultimodalEmbeddingInput, TextEmbeddingInput };
26
27
 
@@ -787,31 +788,18 @@ async function isOllamaConfigured(config: AssistantConfig): Promise<boolean> {
787
788
  // Simple tokenizer + TF-IDF sparse encoder. Produces a SparseEmbedding
788
789
  // with term indices (hashed to a fixed vocabulary) and TF-IDF weights.
789
790
  // Can be upgraded to a learned sparse encoder (e.g. SPLADE) later.
790
-
791
- const SPARSE_VOCAB_SIZE = 30_000;
791
+ // Tokenization primitives (`tokenize`, `tokenHash`, `SPARSE_VOCAB_SIZE`) live
792
+ // in `./sparse-tokenize.ts` so the BM25 encoder can share them without
793
+ // transitively depending on this module.
792
794
 
793
795
  /**
794
796
  * Bump this version whenever the sparse embedding algorithm changes
795
- * (e.g. hash function fix, tokenizer change) to trigger re-indexing
796
- * of existing sparse vectors via the sentinel mismatch mechanism.
797
+ * (e.g. hash function fix, tokenizer change). Now inert metadata — the v1
798
+ * Qdrant sentinel was decoupled from this constant, so a bump no longer
799
+ * forces an automatic rebuild. Operators must explicitly run
800
+ * `assistant memory v2 reembed` to rematerialize the v2 sparse index.
797
801
  */
798
- export const SPARSE_EMBEDDING_VERSION = 2;
799
-
800
- /** Tokenize text into lowercase alphanumeric tokens (Unicode-aware). */
801
- function tokenize(text: string): string[] {
802
- return text.toLowerCase().match(/[\p{L}\p{N}]+/gu) ?? [];
803
- }
804
-
805
- /** Hash a token to a stable index in [0, vocabSize). */
806
- function tokenHash(token: string, vocabSize: number): number {
807
- // FNV-1a 32-bit hash for speed
808
- let hash = 0x811c9dc5;
809
- for (let i = 0; i < token.length; i++) {
810
- hash ^= token.charCodeAt(i);
811
- hash = Math.imul(hash, 0x01000193) >>> 0;
812
- }
813
- return hash % vocabSize;
814
- }
802
+ export const SPARSE_EMBEDDING_VERSION = 4;
815
803
 
816
804
  /**
817
805
  * Generate a TF-IDF-based sparse embedding for the given text.
@@ -38,10 +38,16 @@ const ONNXRUNTIME_COMMON_VERSION = "1.21.0";
38
38
  const TRANSFORMERS_VERSION = "3.8.1";
39
39
  const JINJA_VERSION = "0.5.5";
40
40
 
41
- /** Composite version string for cache invalidation. */
42
- const RUNTIME_VERSION = `ort-${ONNXRUNTIME_NODE_VERSION}_hf-${TRANSFORMERS_VERSION}_jinja-${JINJA_VERSION}`;
41
+ /**
42
+ * Composite version string for cache invalidation. Bumping the trailing
43
+ * `_workers-vN` suffix forces existing installs to regenerate the worker
44
+ * scripts when the worker IPC contract or spawn-args list changes (without
45
+ * requiring an `@huggingface/transformers` version bump).
46
+ */
47
+ const RUNTIME_VERSION = `ort-${ONNXRUNTIME_NODE_VERSION}_hf-${TRANSFORMERS_VERSION}_jinja-${JINJA_VERSION}_workers-v2`;
43
48
 
44
49
  const WORKER_FILENAME = "embed-worker.mjs";
50
+ const RERANK_WORKER_FILENAME = "rerank-worker.mjs";
45
51
 
46
52
  /** Module-level guard so concurrent in-process calls share one download. */
47
53
  const installGuard = new PromiseGuard<void>();
@@ -171,6 +177,101 @@ process.stdin.on('end', () => process.exit(0));
171
177
  `;
172
178
  }
173
179
 
180
+ function generateRerankWorkerScript(): string {
181
+ // Cross-encoder rerank worker. Loads a sequence-classification model and
182
+ // scores paired (queries[i], passages[i]) tuples in one batched ONNX
183
+ // inference call. Mirrors the embed worker's lifecycle (ready signal,
184
+ // JSON-lines IPC, sequential queue) so LocalRerankBackend can reuse the
185
+ // same supervisor pattern.
186
+ //
187
+ // Request shape: { id, queries: string[], passages: string[] } with
188
+ // queries.length === passages.length. Each pair is one (query, passage)
189
+ // tuple; multiple distinct queries can ride in a single batch so the
190
+ // activation pipeline can score the user-channel and assistant-channel
191
+ // queries against a shared candidate set in one tokenizer + ONNX call.
192
+ return `\
193
+ // rerank-worker.mjs — Auto-generated by EmbeddingRuntimeManager
194
+ // Runs in a separate bun process, communicates via JSON-lines over stdin/stdout.
195
+ process.title = 'rerank-worker';
196
+ import {
197
+ AutoModelForSequenceClassification,
198
+ AutoTokenizer,
199
+ env,
200
+ } from '@huggingface/transformers';
201
+
202
+ const model = process.argv[2];
203
+ const cacheDir = process.argv[3];
204
+ const dtype = process.argv[4] || 'q8';
205
+ if (cacheDir && env) env.cacheDir = cacheDir;
206
+
207
+ let tokenizer;
208
+ let session;
209
+ try {
210
+ tokenizer = await AutoTokenizer.from_pretrained(model);
211
+ session = await AutoModelForSequenceClassification.from_pretrained(model, { dtype });
212
+ process.stdout.write(JSON.stringify({ type: 'ready' }) + '\\n');
213
+ } catch (err) {
214
+ process.stdout.write(JSON.stringify({ type: 'error', error: err.message || String(err) }) + '\\n');
215
+ process.exit(1);
216
+ }
217
+
218
+ const sigmoid = (x) => 1 / (1 + Math.exp(-x));
219
+
220
+ const decoder = new TextDecoder();
221
+ let buffer = '';
222
+ let processing = false;
223
+ const queue = [];
224
+
225
+ process.stdin.on('data', (chunk) => {
226
+ buffer += typeof chunk === 'string' ? chunk : decoder.decode(chunk, { stream: true });
227
+ let idx;
228
+ while ((idx = buffer.indexOf('\\n')) !== -1) {
229
+ const line = buffer.slice(0, idx);
230
+ buffer = buffer.slice(idx + 1);
231
+ if (line.trim()) queue.push(line);
232
+ }
233
+ if (!processing) processQueue();
234
+ });
235
+
236
+ async function processQueue() {
237
+ processing = true;
238
+ while (queue.length > 0) {
239
+ const line = queue.shift();
240
+ let req;
241
+ try { req = JSON.parse(line); } catch { continue; }
242
+ try {
243
+ const { id, queries, passages } = req;
244
+ if (
245
+ !Array.isArray(queries) || !Array.isArray(passages) ||
246
+ queries.length !== passages.length || passages.length === 0
247
+ ) {
248
+ process.stdout.write(JSON.stringify({ id, scores: [] }) + '\\n');
249
+ continue;
250
+ }
251
+ const inputs = await tokenizer(queries, {
252
+ text_pair: passages,
253
+ padding: true,
254
+ truncation: true,
255
+ return_tensors: 'pt',
256
+ });
257
+ const out = await session(inputs);
258
+ const logits = out.logits.data;
259
+ const scores = new Array(passages.length);
260
+ for (let i = 0; i < passages.length; i++) {
261
+ scores[i] = sigmoid(Number(logits[i]));
262
+ }
263
+ process.stdout.write(JSON.stringify({ id, scores }) + '\\n');
264
+ } catch (err) {
265
+ process.stdout.write(JSON.stringify({ id: req?.id, error: err.message || String(err) }) + '\\n');
266
+ }
267
+ }
268
+ processing = false;
269
+ }
270
+
271
+ process.stdin.on('end', () => process.exit(0));
272
+ `;
273
+ }
274
+
174
275
  // ── Main manager ────────────────────────────────────────────────────
175
276
 
176
277
  export class EmbeddingRuntimeManager {
@@ -186,8 +287,12 @@ export class EmbeddingRuntimeManager {
186
287
  if (!manifest) return false;
187
288
  if (manifest.runtimeVersion !== RUNTIME_VERSION) return false;
188
289
 
189
- // Verify the worker script exists and a bun binary is available
190
- return existsSync(this.getWorkerPath()) && this.getBunPath() !== undefined;
290
+ // Verify both worker scripts exist and a bun binary is available
291
+ return (
292
+ existsSync(this.getWorkerPath()) &&
293
+ existsSync(this.getRerankWorkerPath()) &&
294
+ this.getBunPath() !== undefined
295
+ );
191
296
  }
192
297
 
193
298
  /** Path to the embed worker script. */
@@ -195,6 +300,11 @@ export class EmbeddingRuntimeManager {
195
300
  return join(this.baseDir, WORKER_FILENAME);
196
301
  }
197
302
 
303
+ /** Path to the rerank worker script. */
304
+ getRerankWorkerPath(): string {
305
+ return join(this.baseDir, RERANK_WORKER_FILENAME);
306
+ }
307
+
198
308
  /**
199
309
  * Find a usable bun binary.
200
310
  * Delegates to the shared bun-runtime helper, also checking
@@ -375,8 +485,12 @@ export class EmbeddingRuntimeManager {
375
485
  ].join("\n"),
376
486
  );
377
487
 
378
- // Step 4: Write embed worker script
488
+ // Step 4: Write embed + rerank worker scripts
379
489
  writeFileSync(join(tmpDir, WORKER_FILENAME), generateWorkerScript());
490
+ writeFileSync(
491
+ join(tmpDir, RERANK_WORKER_FILENAME),
492
+ generateRerankWorkerScript(),
493
+ );
380
494
 
381
495
  // Step 5: Write version manifest
382
496
  const manifest: VersionManifest = {