@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
@@ -29,10 +29,19 @@ mock.module("../util/logger.js", () => ({
29
29
  }));
30
30
 
31
31
  // ---------------------------------------------------------------------------
32
- // Capture fs.watch calls so we can simulate file system events deterministically
32
+ // Capture fs.watch and fs.watchFile calls so we can simulate file system
33
+ // events deterministically. Bun's libuv-based fs.watchFile is too unreliable
34
+ // on Linux CI to test against directly: first-poll latency is ~5s and
35
+ // back-to-back changes to different files frequently miss events. Driving
36
+ // the captured listener bypasses libuv entirely while still exercising the
37
+ // real ConfigWatcher dispatch logic.
33
38
  // ---------------------------------------------------------------------------
34
39
 
35
40
  type WatchCallback = (eventType: string, filename: string | null) => void;
41
+ type WatchFileListener = (
42
+ curr: { ino: number; mtimeMs: number },
43
+ prev: { ino: number; mtimeMs: number },
44
+ ) => void;
36
45
 
37
46
  interface CapturedWatcher {
38
47
  dir: string;
@@ -40,10 +49,17 @@ interface CapturedWatcher {
40
49
  options?: { recursive?: boolean };
41
50
  }
42
51
 
52
+ interface CapturedFileWatch {
53
+ filePath: string;
54
+ listener: WatchFileListener;
55
+ }
56
+
43
57
  const capturedWatchers: CapturedWatcher[] = [];
58
+ const capturedFileWatches: CapturedFileWatch[] = [];
44
59
 
45
60
  const fakeWatcher = {
46
61
  close: () => {},
62
+ on: (_event: string, _handler: (...args: unknown[]) => void) => fakeWatcher,
47
63
  };
48
64
 
49
65
  mock.module("node:fs", () => {
@@ -65,6 +81,18 @@ mock.module("node:fs", () => {
65
81
  capturedWatchers.push({ dir, callback, options });
66
82
  return fakeWatcher;
67
83
  },
84
+ watchFile: (filePath: string, ...args: unknown[]) => {
85
+ // Signature is `watchFile(path, [options], listener)` — skip the
86
+ // optional options arg so we always grab the listener.
87
+ const listener = (
88
+ typeof args[0] === "function" ? args[0] : args[1]
89
+ ) as WatchFileListener;
90
+ capturedFileWatches.push({ filePath, listener });
91
+ },
92
+ unwatchFile: (filePath: string) => {
93
+ const idx = capturedFileWatches.findIndex((w) => w.filePath === filePath);
94
+ if (idx !== -1) capturedFileWatches.splice(idx, 1);
95
+ },
68
96
  };
69
97
  });
70
98
 
@@ -92,8 +120,8 @@ mock.module("../providers/registry.js", () => ({
92
120
  initializeProviders: () => {},
93
121
  }));
94
122
 
95
- mock.module("../signals/mcp-reload.js", () => ({
96
- handleMcpReloadSignal: () => {},
123
+ mock.module("../daemon/mcp-reload-service.js", () => ({
124
+ reloadMcpServers: async () => {},
97
125
  }));
98
126
 
99
127
  mock.module("../signals/conversation-undo.js", () => ({
@@ -115,16 +143,52 @@ const { ConfigWatcher } = await import("../daemon/config-watcher.js");
115
143
  // Helpers
116
144
  // ---------------------------------------------------------------------------
117
145
 
118
- /** Find the watcher for a given directory path. */
119
- function findWatcher(dir: string): CapturedWatcher | undefined {
120
- return capturedWatchers.find((w) => w.dir === dir);
146
+ const TEST_DEBOUNCE_MS = 10;
147
+ // Sleep budget to wait out the debouncer + any async handler work.
148
+ const WAIT_MS = TEST_DEBOUNCE_MS + 50;
149
+
150
+ function findWatcher(path: string): CapturedWatcher | undefined {
151
+ return capturedWatchers.find((w) => w.dir === path);
152
+ }
153
+
154
+ function findFileWatch(filePath: string): CapturedFileWatch | undefined {
155
+ return capturedFileWatches.find((w) => w.filePath === filePath);
156
+ }
157
+
158
+ const WORKSPACE_FILES = new Set(["config.json", "SOUL.md", "IDENTITY.md"]);
159
+
160
+ // Each call advances the inode + mtime so the listener's early-return guard
161
+ // (curr.ino === prev.ino && curr.mtimeMs === prev.mtimeMs) doesn't fire.
162
+ let mtimeCounter = 1_000;
163
+ const inoMap = new Map<string, number>();
164
+
165
+ function nextStat(filePath: string): { ino: number; mtimeMs: number } {
166
+ const ino = (inoMap.get(filePath) ?? 0) + 1;
167
+ inoMap.set(filePath, ino);
168
+ mtimeCounter += 1;
169
+ return { ino, mtimeMs: mtimeCounter };
121
170
  }
122
171
 
123
- /** Simulate a file change event and flush the debounce timer. */
124
172
  function simulateFileChange(dir: string, filename: string): void {
125
- const watcher = findWatcher(dir);
126
- if (!watcher) throw new Error(`No watcher found for ${dir}`);
127
- watcher.callback("change", filename);
173
+ if (dir === WORKSPACE_DIR && WORKSPACE_FILES.has(filename)) {
174
+ const filePath = join(dir, filename);
175
+ const fw = findFileWatch(filePath);
176
+ if (!fw) {
177
+ throw new Error(`No watchFile subscription for ${filePath}`);
178
+ }
179
+ const prev = {
180
+ ino: inoMap.get(filePath) ?? 0,
181
+ mtimeMs: mtimeCounter,
182
+ };
183
+ const curr = nextStat(filePath);
184
+ fw.listener(curr, prev);
185
+ return;
186
+ }
187
+ const dirWatcher = findWatcher(dir);
188
+ if (!dirWatcher) {
189
+ throw new Error(`No watcher found for directory ${dir}`);
190
+ }
191
+ dirWatcher.callback("change", filename);
128
192
  }
129
193
 
130
194
  // ---------------------------------------------------------------------------
@@ -143,8 +207,10 @@ const onConversationEvict = () => {
143
207
 
144
208
  beforeEach(() => {
145
209
  capturedWatchers.length = 0;
210
+ capturedFileWatches.length = 0;
211
+ inoMap.clear();
146
212
  evictCallCount = 0;
147
- watcher = new ConfigWatcher();
213
+ watcher = new ConfigWatcher(undefined, TEST_DEBOUNCE_MS);
148
214
  });
149
215
 
150
216
  afterEach(() => {
@@ -155,51 +221,44 @@ describe("ConfigWatcher workspace file handlers", () => {
155
221
  test("SOUL.md change triggers onConversationEvict", async () => {
156
222
  watcher.start(onConversationEvict);
157
223
  simulateFileChange(WORKSPACE_DIR, "SOUL.md");
158
-
159
- // Wait for the debounce timer to fire (default 200ms)
160
- await new Promise((r) => setTimeout(r, 300));
224
+ await new Promise((r) => setTimeout(r, WAIT_MS));
161
225
  expect(evictCallCount).toBe(1);
162
226
  });
163
227
 
164
228
  test("IDENTITY.md change triggers onConversationEvict", async () => {
165
229
  watcher.start(onConversationEvict);
166
230
  simulateFileChange(WORKSPACE_DIR, "IDENTITY.md");
167
-
168
- await new Promise((r) => setTimeout(r, 300));
231
+ await new Promise((r) => setTimeout(r, WAIT_MS));
169
232
  expect(evictCallCount).toBe(1);
170
233
  });
171
234
 
172
- test("UPDATES.md change does NOT trigger onConversationEvict", async () => {
235
+ test("UPDATES.md is not subscribed (only the registered handler set is)", () => {
173
236
  watcher.start(onConversationEvict);
174
- simulateFileChange(WORKSPACE_DIR, "UPDATES.md");
175
-
176
- await new Promise((r) => setTimeout(r, 300));
177
- expect(evictCallCount).toBe(0);
237
+ // Per-file watching only registers config.json, SOUL.md, IDENTITY.md.
238
+ // The whole workspace dir must not be watched either — that was the
239
+ // ENXIO-on-Unix-sockets bug.
240
+ expect(findFileWatch(join(WORKSPACE_DIR, "UPDATES.md"))).toBeUndefined();
241
+ expect(findWatcher(WORKSPACE_DIR)).toBeUndefined();
178
242
  });
179
243
 
180
244
  test("config.json change calls refreshConfigFromSources", async () => {
181
245
  let refreshCalled = false;
182
246
  watcher.refreshConfigFromSources = async () => {
183
247
  refreshCalled = true;
184
- return false; // no change, so onConversationEvict should NOT be called
248
+ return false;
185
249
  };
186
-
187
250
  watcher.start(onConversationEvict);
188
251
  simulateFileChange(WORKSPACE_DIR, "config.json");
189
-
190
- await new Promise((r) => setTimeout(r, 300));
252
+ await new Promise((r) => setTimeout(r, WAIT_MS));
191
253
  expect(refreshCalled).toBe(true);
192
- // Config didn't change (returned false), so no eviction
193
254
  expect(evictCallCount).toBe(0);
194
255
  });
195
256
 
196
257
  test("config.json change triggers onConversationEvict when config actually changed", async () => {
197
258
  watcher.refreshConfigFromSources = async () => true;
198
-
199
259
  watcher.start(onConversationEvict);
200
260
  simulateFileChange(WORKSPACE_DIR, "config.json");
201
-
202
- await new Promise((r) => setTimeout(r, 300));
261
+ await new Promise((r) => setTimeout(r, WAIT_MS));
203
262
  expect(evictCallCount).toBe(1);
204
263
  });
205
264
 
@@ -209,77 +268,89 @@ describe("ConfigWatcher workspace file handlers", () => {
209
268
  refreshCalled = true;
210
269
  return true;
211
270
  };
212
-
213
271
  watcher.suppressConfigReload = true;
214
272
  watcher.start(onConversationEvict);
215
273
  simulateFileChange(WORKSPACE_DIR, "config.json");
216
-
217
- await new Promise((r) => setTimeout(r, 300));
274
+ await new Promise((r) => setTimeout(r, WAIT_MS));
218
275
  expect(refreshCalled).toBe(false);
219
276
  expect(evictCallCount).toBe(0);
220
277
  });
221
-
222
- test("unknown file does not trigger any handler", async () => {
223
- watcher.start(onConversationEvict);
224
- simulateFileChange(WORKSPACE_DIR, "UNKNOWN.md");
225
-
226
- await new Promise((r) => setTimeout(r, 300));
227
- expect(evictCallCount).toBe(0);
228
- });
229
-
230
- test("null filename does not trigger any handler", async () => {
231
- watcher.start(onConversationEvict);
232
- const wsWatcher = findWatcher(WORKSPACE_DIR);
233
- expect(wsWatcher).toBeDefined();
234
- wsWatcher!.callback("change", null);
235
-
236
- await new Promise((r) => setTimeout(r, 300));
237
- expect(evictCallCount).toBe(0);
238
- });
239
278
  });
240
279
 
241
280
  describe("ConfigWatcher watcher lifecycle", () => {
242
- test("start registers workspace and signals watchers", () => {
281
+ test("start does NOT subscribe to /workspace as a directory (regression: ENXIO on Unix sockets)", () => {
243
282
  watcher.start(onConversationEvict);
244
- const wsWatcher = findWatcher(WORKSPACE_DIR);
245
- expect(wsWatcher).toBeDefined();
283
+ expect(findWatcher(WORKSPACE_DIR)).toBeUndefined();
284
+ // The per-file watchFile subscriptions are tracked separately from
285
+ // capturedWatchers; assert the expected ones are present.
286
+ expect(findFileWatch(join(WORKSPACE_DIR, "config.json"))).toBeDefined();
287
+ expect(findFileWatch(join(WORKSPACE_DIR, "SOUL.md"))).toBeDefined();
288
+ expect(findFileWatch(join(WORKSPACE_DIR, "IDENTITY.md"))).toBeDefined();
246
289
  });
247
290
 
248
- test("stop cancels all debounce timers and clears watchers", () => {
291
+ test("stop cancels pending debounce work, no eviction fires after", async () => {
249
292
  watcher.start(onConversationEvict);
250
- // Trigger a file change but don't wait for the debounce
251
293
  simulateFileChange(WORKSPACE_DIR, "SOUL.md");
252
294
  watcher.stop();
253
-
254
- // The debounce should have been cancelled, so no eviction
295
+ await new Promise((r) => setTimeout(r, WAIT_MS));
255
296
  expect(evictCallCount).toBe(0);
256
297
  });
257
298
 
258
- test("multiple prompt file changes are debounced", async () => {
299
+ test("multiple rapid changes to the same workspace file are coalesced to one eviction", async () => {
259
300
  watcher.start(onConversationEvict);
260
-
261
- // Rapid fire multiple changes to the same file
262
301
  simulateFileChange(WORKSPACE_DIR, "SOUL.md");
263
302
  simulateFileChange(WORKSPACE_DIR, "SOUL.md");
264
303
  simulateFileChange(WORKSPACE_DIR, "SOUL.md");
265
-
266
- await new Promise((r) => setTimeout(r, 300));
267
- // Despite 3 events, debouncing should collapse them to 1 call
304
+ await new Promise((r) => setTimeout(r, WAIT_MS));
268
305
  expect(evictCallCount).toBe(1);
269
306
  });
270
307
 
271
308
  test("changes to different files each trigger their own handler", async () => {
272
309
  watcher.start(onConversationEvict);
273
-
274
310
  simulateFileChange(WORKSPACE_DIR, "SOUL.md");
275
311
  simulateFileChange(WORKSPACE_DIR, "IDENTITY.md");
276
-
277
- await new Promise((r) => setTimeout(r, 300));
278
- // Each file has its own debounce key, so both should fire
312
+ await new Promise((r) => setTimeout(r, WAIT_MS));
279
313
  expect(evictCallCount).toBe(2);
280
314
  });
281
315
  });
282
316
 
317
+ describe("ConfigWatcher per-file polling listener", () => {
318
+ test("ino change is treated as a file change (atomic-rename shape)", async () => {
319
+ // Simulates `writeFile(tmp) + rename(tmp, target)`: the inode at the
320
+ // path is replaced. The listener should fire once per debounced window.
321
+ watcher.refreshConfigFromSources = async () => true;
322
+ watcher.start(onConversationEvict);
323
+ const fw = findFileWatch(join(WORKSPACE_DIR, "config.json"));
324
+ expect(fw).toBeDefined();
325
+ fw!.listener({ ino: 2, mtimeMs: 1_001 }, { ino: 1, mtimeMs: 1_000 });
326
+ await new Promise((r) => setTimeout(r, WAIT_MS));
327
+ expect(evictCallCount).toBe(1);
328
+ });
329
+
330
+ test("mtime change is treated as a file change (in-place edit)", async () => {
331
+ watcher.refreshConfigFromSources = async () => true;
332
+ watcher.start(onConversationEvict);
333
+ const fw = findFileWatch(join(WORKSPACE_DIR, "config.json"));
334
+ expect(fw).toBeDefined();
335
+ // Same inode, different mtime — what an `echo >> file` produces.
336
+ fw!.listener({ ino: 1, mtimeMs: 2_000 }, { ino: 1, mtimeMs: 1_000 });
337
+ await new Promise((r) => setTimeout(r, WAIT_MS));
338
+ expect(evictCallCount).toBe(1);
339
+ });
340
+
341
+ test("identical curr/prev does NOT fire (the early-return guard)", async () => {
342
+ // fs.watchFile sometimes invokes the listener with curr === prev
343
+ // (e.g. on initial subscription); the watcher must not re-fire in that case.
344
+ watcher.refreshConfigFromSources = async () => true;
345
+ watcher.start(onConversationEvict);
346
+ const fw = findFileWatch(join(WORKSPACE_DIR, "config.json"));
347
+ expect(fw).toBeDefined();
348
+ fw!.listener({ ino: 1, mtimeMs: 1_000 }, { ino: 1, mtimeMs: 1_000 });
349
+ await new Promise((r) => setTimeout(r, WAIT_MS));
350
+ expect(evictCallCount).toBe(0);
351
+ });
352
+ });
353
+
283
354
  describe("ConfigWatcher users directory watcher", () => {
284
355
  const USERS_DIR = join(WORKSPACE_DIR, "users");
285
356
 
@@ -287,7 +358,7 @@ describe("ConfigWatcher users directory watcher", () => {
287
358
  watcher.start(onConversationEvict);
288
359
  simulateFileChange(USERS_DIR, "alice.md");
289
360
 
290
- await new Promise((r) => setTimeout(r, 300));
361
+ await new Promise((r) => setTimeout(r, WAIT_MS));
291
362
  expect(evictCallCount).toBe(1);
292
363
  });
293
364
 
@@ -297,7 +368,7 @@ describe("ConfigWatcher users directory watcher", () => {
297
368
  simulateFileChange(USERS_DIR, "notes.txt");
298
369
  simulateFileChange(USERS_DIR, "README");
299
370
 
300
- await new Promise((r) => setTimeout(r, 300));
371
+ await new Promise((r) => setTimeout(r, WAIT_MS));
301
372
  expect(evictCallCount).toBe(0);
302
373
  });
303
374
 
@@ -307,7 +378,7 @@ describe("ConfigWatcher users directory watcher", () => {
307
378
  expect(usersWatcher).toBeDefined();
308
379
  usersWatcher!.callback("change", null);
309
380
 
310
- await new Promise((r) => setTimeout(r, 300));
381
+ await new Promise((r) => setTimeout(r, WAIT_MS));
311
382
  expect(evictCallCount).toBe(0);
312
383
  });
313
384
 
@@ -317,7 +388,7 @@ describe("ConfigWatcher users directory watcher", () => {
317
388
  simulateFileChange(USERS_DIR, "bob.md");
318
389
  simulateFileChange(USERS_DIR, "bob.md");
319
390
 
320
- await new Promise((r) => setTimeout(r, 300));
391
+ await new Promise((r) => setTimeout(r, WAIT_MS));
321
392
  expect(evictCallCount).toBe(1);
322
393
  });
323
394
  });
@@ -65,7 +65,6 @@ function makeContext(
65
65
  ): RecallSearchContext {
66
66
  return {
67
67
  workingDir,
68
- memoryScopeId: "scope-123",
69
68
  conversationId: "conv-xyz",
70
69
  config: {} as AssistantConfig,
71
70
  ...(signal ? { signal } : {}),
@@ -963,7 +962,14 @@ describe("runAgenticRecall", () => {
963
962
  ]);
964
963
  });
965
964
 
966
- test("routes provider calls through the recall call site with temperature zero", async () => {
965
+ test("routes provider calls through the recall call site with temperature zero and thinking disabled", async () => {
966
+ // `thinking: disabled` is required because the call hardcodes
967
+ // `temperature: 0`. Anthropic 400s on `temperature` ≠ 1 whenever
968
+ // thinking is enabled or in adaptive mode, so user profiles that
969
+ // resolve thinking-enabled (Opus 4.x at `effort: high|xhigh`, etc.)
970
+ // would fail without an explicit opt-out. Recall is tool-call-heavy
971
+ // reasoning where determinism (temp=0) matters more than extended
972
+ // chain-of-thought.
967
973
  const providerCalls: unknown[][] = [];
968
974
  configuredProvider = makeProvider(
969
975
  [textResponse("not a tool call")],
@@ -992,7 +998,59 @@ describe("runAgenticRecall", () => {
992
998
  expect(options.config).toEqual({
993
999
  callSite: "recall",
994
1000
  temperature: 0,
1001
+ thinking: { type: "disabled" },
1002
+ });
1003
+ });
1004
+
1005
+ test("final finish-only call also disables thinking", async () => {
1006
+ // Regression guard for the second `temperature: 0` call site in
1007
+ // `tryFinalFinishRecall`. Both recall provider calls (the agent loop
1008
+ // round and the fallback finalize) must opt out of thinking; otherwise
1009
+ // user profiles that resolve thinking-enabled trigger the Anthropic
1010
+ // 400 on `temperature` ≠ 1.
1011
+ const providerCalls: unknown[][] = [];
1012
+ configuredProvider = makeProvider(
1013
+ [
1014
+ // First call: agent loop round — emits a search_sources tool use
1015
+ // so the loop continues until the round budget is exhausted.
1016
+ toolResponse("search_sources", {
1017
+ query: "more notes",
1018
+ sources: ["workspace"],
1019
+ reason: "Need more.",
1020
+ }),
1021
+ // Second call: fallback finalize — handler we want to assert on.
1022
+ toolResponse("finish_recall", {
1023
+ answer: "Resolved.",
1024
+ confidence: "medium",
1025
+ citation_ids: ["workspace:more"],
1026
+ }),
1027
+ ],
1028
+ providerCalls,
1029
+ );
1030
+
1031
+ await runAgenticRecall(
1032
+ { query: "launch notes", sources: ["workspace"], depth: "fast" },
1033
+ makeContext(),
1034
+ {
1035
+ searchOptions: {
1036
+ adapters: [
1037
+ makeAdapter({
1038
+ "launch notes": [makeEvidence("workspace:seed")],
1039
+ "more notes": [makeEvidence("workspace:more")],
1040
+ }),
1041
+ ],
1042
+ },
1043
+ },
1044
+ );
1045
+
1046
+ expect(providerCalls).toHaveLength(2);
1047
+ const finalizeOptions = providerCalls[1]?.[3] as {
1048
+ config?: Record<string, unknown>;
1049
+ };
1050
+ expect(finalizeOptions.config).toEqual({
1051
+ callSite: "recall",
1052
+ temperature: 0,
1053
+ thinking: { type: "disabled" },
995
1054
  });
996
- expect(options.config).not.toHaveProperty("thinking");
997
1055
  });
998
1056
  });
@@ -68,29 +68,6 @@ describe("searchConversationSource", () => {
68
68
  ]);
69
69
  });
70
70
 
71
- test("filters results to the requested memory scope", async () => {
72
- const inScope = await seedConversation({
73
- title: "In-scope conversation",
74
- memoryScopeId: "scope-a",
75
- content: "sharedtoken belongs to scope A.",
76
- });
77
- await seedConversation({
78
- title: "Out-of-scope conversation",
79
- memoryScopeId: "scope-b",
80
- content: "sharedtoken belongs to scope B.",
81
- });
82
-
83
- const result = await searchConversationSource(
84
- "sharedtoken",
85
- makeContext({ memoryScopeId: "scope-a" }),
86
- 10,
87
- );
88
-
89
- expect(result.evidence.map((item) => item.locator)).toEqual([
90
- `${inScope.conversation.id}#${inScope.message.id}`,
91
- ]);
92
- });
93
-
94
71
  test("does not return derived subagent or auto-analysis conversations", async () => {
95
72
  const visible = await seedConversation({
96
73
  title: "User conversation",
@@ -312,7 +289,6 @@ function makeContext(
312
289
  ): RecallSearchContext {
313
290
  return {
314
291
  workingDir: "/tmp/example-workspace",
315
- memoryScopeId: "default",
316
292
  conversationId: "current-conversation",
317
293
  config: {} as RecallSearchContext["config"],
318
294
  ...overrides,
@@ -14,7 +14,6 @@ import type {
14
14
  function makeContext(): RecallSearchContext {
15
15
  return {
16
16
  workingDir: "/workspace",
17
- memoryScopeId: "scope-123",
18
17
  conversationId: "conv-xyz",
19
18
  config: {} as AssistantConfig,
20
19
  };
@@ -69,7 +69,6 @@ mock.module(embeddingBackendModule, () => ({
69
69
  type SearchCall = {
70
70
  vector: number[];
71
71
  limit: number;
72
- scopeIds?: string[];
73
72
  sparseVector?: { indices: number[]; values: number[] };
74
73
  };
75
74
 
@@ -81,10 +80,9 @@ mock.module(graphSearchModule, () => ({
81
80
  searchGraphNodes: async (
82
81
  vector: number[],
83
82
  limit: number,
84
- scopeIds?: string[],
85
83
  sparseVector?: { indices: number[]; values: number[] },
86
84
  ) => {
87
- searchCalls.push({ vector, limit, scopeIds, sparseVector });
85
+ searchCalls.push({ vector, limit, sparseVector });
88
86
  if (searchShouldThrow) {
89
87
  throw new Error("qdrant unavailable");
90
88
  }
@@ -205,13 +203,13 @@ describe("searchMemorySource", () => {
205
203
  expect(second.lastAccessed).toBe(222);
206
204
  });
207
205
 
208
- test("forwards memory scope and abort signal to graph search dependencies", async () => {
206
+ test("forwards abort signal to graph search dependencies", async () => {
209
207
  const controller = new AbortController();
210
208
  searchHits = [];
211
209
 
212
210
  await searchMemorySource(
213
211
  "deployment checklist",
214
- makeContext({ memoryScopeId: "scope-abc", signal: controller.signal }),
212
+ makeContext({ signal: controller.signal }),
215
213
  3,
216
214
  );
217
215
 
@@ -226,7 +224,6 @@ describe("searchMemorySource", () => {
226
224
  expect(searchCalls[0]).toMatchObject({
227
225
  vector: [0.1, 0.2, 0.3],
228
226
  limit: 3,
229
- scopeIds: ["scope-abc"],
230
227
  });
231
228
  expect(searchCalls[0]?.sparseVector?.indices.length).toBeGreaterThan(0);
232
229
  });
@@ -389,7 +386,6 @@ function makeContext(
389
386
  ): RecallSearchContext {
390
387
  return {
391
388
  workingDir: "/tmp/example-workspace",
392
- memoryScopeId: "scope-default",
393
389
  conversationId: "conv-123",
394
390
  config: {} as AssistantConfig,
395
391
  ...overrides,
@@ -148,7 +148,6 @@ function makeConfig(): AssistantConfig {
148
148
  c_assistant: 0.5,
149
149
  c_now: 0.5,
150
150
  top_k: 8,
151
- top_k_skills: 0,
152
151
  },
153
152
  },
154
153
  } as unknown as AssistantConfig;
@@ -157,7 +156,6 @@ function makeConfig(): AssistantConfig {
157
156
  function makeContext(workingDir: string): RecallSearchContext {
158
157
  return {
159
158
  workingDir,
160
- memoryScopeId: "scope-default",
161
159
  conversationId: "conv-test",
162
160
  config: makeConfig(),
163
161
  };
@@ -173,7 +173,6 @@ function makeContext(
173
173
  ): RecallSearchContext {
174
174
  return {
175
175
  workingDir: "/workspace",
176
- memoryScopeId: "active-conversation-scope",
177
176
  conversationId: "conv-xyz",
178
177
  config: {} as AssistantConfig,
179
178
  ...overrides,
@@ -38,7 +38,6 @@ function makeTempDir(): string {
38
38
  function makeContext(workingDir: string): RecallSearchContext {
39
39
  return {
40
40
  workingDir,
41
- memoryScopeId: "scope-123",
42
41
  conversationId: "conversation-123",
43
42
  config: {} as AssistantConfig,
44
43
  };
@@ -1,12 +1,18 @@
1
1
  import { describe, expect, mock, test } from "bun:test";
2
2
 
3
3
  import type { AgentEvent } from "../agent/loop.js";
4
+ import { _setOverridesForTesting } from "../config/assistant-feature-flags.js";
4
5
  import type {
5
6
  ContentBlock,
6
7
  Message,
7
8
  ProviderResponse,
8
9
  } from "../providers/types.js";
9
10
 
11
+ // This test exercises v1 conversation routing. The `memory-v2-enabled` flag
12
+ // (registry default `true`) flips memory routing to v2 — disable it here so
13
+ // the v1 paths under test stay active.
14
+ _setOverridesForTesting({ "memory-v2-enabled": false });
15
+
10
16
  mock.module("../util/logger.js", () => ({
11
17
  getLogger: () =>
12
18
  new Proxy({} as Record<string, unknown>, { get: () => () => {} }),