@vellumai/assistant 0.10.12 → 0.11.0-staging.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (809) hide show
  1. package/AGENTS.md +1 -1
  2. package/ARCHITECTURE.md +4 -5
  3. package/README.md +1 -1
  4. package/docs/architecture/memory.md +60 -23
  5. package/docs/error-handling.md +3 -3
  6. package/docs/guardian-request-flow.md +112 -0
  7. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +1 -0
  8. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
  9. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
  10. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
  11. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
  12. package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/app.d.ts +28 -0
  13. package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/app.d.ts.map +1 -1
  14. package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.d.ts +2 -2
  15. package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.d.ts.map +1 -1
  16. package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.js.map +1 -1
  17. package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/message.d.ts +2 -0
  18. package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/message.d.ts.map +1 -1
  19. package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/package.json +1 -1
  20. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +1 -0
  21. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
  22. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
  23. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
  24. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
  25. package/node_modules/@vellumai/gateway-client/package.json +1 -1
  26. package/node_modules/@vellumai/gateway-client/src/admission-policy-contract.ts +6 -0
  27. package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +34 -0
  28. package/node_modules/@vellumai/service-contracts/package.json +1 -0
  29. package/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
  30. package/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
  31. package/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
  32. package/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
  33. package/openapi.yaml +264 -14
  34. package/package.json +2 -2
  35. package/src/__tests__/acp-session.test.ts +3 -3
  36. package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +3 -0
  37. package/src/__tests__/anthropic-provider.test.ts +40 -0
  38. package/src/__tests__/app-conversation-ids-backfill.test.ts +33 -2
  39. package/src/__tests__/app-conversation-ids.test.ts +204 -0
  40. package/src/__tests__/approval-cascade.test.ts +5 -5
  41. package/src/__tests__/approval-routes-http.test.ts +3 -3
  42. package/src/__tests__/ask-question-resolver.test.ts +207 -0
  43. package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +16 -16
  44. package/src/__tests__/assistant-event-hub-targeted.test.ts +13 -11
  45. package/src/__tests__/assistant-event-hub.test.ts +13 -11
  46. package/src/__tests__/assistant-event.test.ts +12 -9
  47. package/src/__tests__/assistant-feature-flag-guard.test.ts +3 -3
  48. package/src/__tests__/assistant-feature-flag-guardrails.test.ts +1 -1
  49. package/src/__tests__/assistant-id-boundary-guard.test.ts +0 -58
  50. package/src/__tests__/assistant-stream-state.test.ts +17 -7
  51. package/src/__tests__/avatar-identity-sync.test.ts +3 -3
  52. package/src/__tests__/background-workers-disk-pressure.test.ts +1 -0
  53. package/src/__tests__/call-conversation-messages.test.ts +134 -18
  54. package/src/__tests__/call-start-guardian-guard.test.ts +27 -0
  55. package/src/__tests__/channel-approvals.test.ts +0 -27
  56. package/src/__tests__/channel-guardian.test.ts +85 -512
  57. package/src/__tests__/channel-readiness-slack-remote.test.ts +151 -3
  58. package/src/__tests__/channel-retry-sweep.test.ts +88 -1
  59. package/src/__tests__/channel-setup-panel-ack.test.ts +12 -9
  60. package/src/__tests__/chat-reveal-guard-priming.test.ts +31 -34
  61. package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +2 -2
  62. package/src/__tests__/compaction-events.test.ts +8 -8
  63. package/src/__tests__/config-loader-platform-defaults.test.ts +54 -28
  64. package/src/__tests__/config-model-image-provider.test.ts +20 -0
  65. package/src/__tests__/config-schema-memory-substrate.test.ts +306 -0
  66. package/src/__tests__/config-schema.test.ts +14 -2
  67. package/src/__tests__/config-set-platform-guard.test.ts +11 -12
  68. package/src/__tests__/config-sounds-sync.test.ts +4 -4
  69. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +5 -0
  70. package/src/__tests__/context-search-memory-source.test.ts +1 -1
  71. package/src/__tests__/context-search-memory-v2-source.test.ts +6 -6
  72. package/src/__tests__/context-token-estimator.test.ts +54 -1
  73. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +12 -3
  74. package/src/__tests__/conversation-agent-loop-fatal-cleanup.test.ts +13 -4
  75. package/src/__tests__/conversation-agent-loop-handlers-max-tokens.test.ts +4 -4
  76. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +10 -1
  77. package/src/__tests__/conversation-agent-loop-overflow.test.ts +22 -13
  78. package/src/__tests__/conversation-agent-loop.test.ts +39 -30
  79. package/src/__tests__/conversation-confirmation-signals.test.ts +14 -14
  80. package/src/__tests__/conversation-evictor.test.ts +49 -0
  81. package/src/__tests__/conversation-fork-crud.test.ts +1 -1
  82. package/src/__tests__/conversation-group-tools.test.ts +279 -0
  83. package/src/__tests__/conversation-history-web-search.test.ts +1 -1
  84. package/src/__tests__/conversation-key-store-disk-view.test.ts +5 -5
  85. package/src/__tests__/conversation-lineage.test.ts +235 -0
  86. package/src/__tests__/conversation-loop-db-lock-resilience.test.ts +5 -5
  87. package/src/__tests__/conversation-message-sync-tags.test.ts +4 -4
  88. package/src/__tests__/conversation-queue.test.ts +81 -81
  89. package/src/__tests__/conversation-routes-enabled-plugins.test.ts +8 -1
  90. package/src/__tests__/conversation-routes-hidden-queue.test.ts +8 -1
  91. package/src/__tests__/conversation-routes-slash-commands.test.ts +10 -1
  92. package/src/__tests__/conversation-runtime-assembly.test.ts +29 -2
  93. package/src/__tests__/conversation-slash-queue.test.ts +11 -11
  94. package/src/__tests__/conversation-slash-unknown.test.ts +2 -2
  95. package/src/__tests__/conversation-speed-override.test.ts +2 -2
  96. package/src/__tests__/conversation-summarize-route.test.ts +9 -0
  97. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +18 -16
  98. package/src/__tests__/conversation-surfaces-activation-emit.test.ts +17 -17
  99. package/src/__tests__/conversation-surfaces-app-open.test.ts +7 -4
  100. package/src/__tests__/conversation-surfaces-data-persist.test.ts +7 -7
  101. package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +9 -9
  102. package/src/__tests__/conversation-surfaces-standalone.test.ts +12 -12
  103. package/src/__tests__/conversation-surfaces-state-update.test.ts +8 -5
  104. package/src/__tests__/conversation-surfaces-table-action.test.ts +6 -3
  105. package/src/__tests__/conversation-surfaces-task-progress.test.ts +46 -46
  106. package/src/__tests__/conversation-sync-tags.test.ts +5 -5
  107. package/src/__tests__/conversation-wait-for-idle.test.ts +2 -2
  108. package/src/__tests__/conversation-workspace-cache-state.test.ts +0 -4
  109. package/src/__tests__/conversation-workspace-injection.test.ts +0 -3
  110. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -3
  111. package/src/__tests__/copy-composer-tc-templates.test.ts +3 -131
  112. package/src/__tests__/credential-security-invariants.test.ts +1 -0
  113. package/src/__tests__/daemon-assistant-events.test.ts +14 -15
  114. package/src/__tests__/db-test-helpers.ts +13 -27
  115. package/src/__tests__/disk-pressure-routes.test.ts +12 -3
  116. package/src/__tests__/document-tool-security.test.ts +95 -0
  117. package/src/__tests__/drain-kick-guard.test.ts +232 -0
  118. package/src/__tests__/dynamic-skill-background-guard.test.ts +19 -6
  119. package/src/__tests__/emit-event-signal.test.ts +5 -6
  120. package/src/__tests__/encrypted-store-test-helpers.ts +10 -20
  121. package/src/__tests__/events-tail-route.test.ts +6 -4
  122. package/src/__tests__/feature-flag-test-helpers.ts +10 -20
  123. package/src/__tests__/file-edit-tool.test.ts +24 -4
  124. package/src/__tests__/file-list-tool.test.ts +2 -1
  125. package/src/__tests__/file-read-tool.test.ts +62 -10
  126. package/src/__tests__/file-write-tool.test.ts +24 -5
  127. package/src/__tests__/followup-tools.test.ts +58 -0
  128. package/src/__tests__/gateway-threshold-reader-mock.ts +99 -0
  129. package/src/__tests__/graph-extraction-event-date.test.ts +1 -1
  130. package/src/__tests__/guardian-question-mode.test.ts +42 -3
  131. package/src/__tests__/guardian-reply-router-answer-mode.test.ts +283 -0
  132. package/src/__tests__/guardian-vellum-destination-pinning.test.ts +221 -0
  133. package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
  134. package/src/__tests__/heartbeat-service.test.ts +1 -0
  135. package/src/__tests__/helpers/native-web-search-harness.ts +10 -10
  136. package/src/__tests__/host-browser-proxy.test.ts +1 -1
  137. package/src/__tests__/host-file-edit-tool.test.ts +3 -3
  138. package/src/__tests__/host-file-read-tool.test.ts +2 -2
  139. package/src/__tests__/host-file-write-tool.test.ts +7 -3
  140. package/src/__tests__/host-shell-tool.test.ts +17 -5
  141. package/src/__tests__/host-transfer-pending-interactions.test.ts +8 -8
  142. package/src/__tests__/image-credentials.test.ts +65 -8
  143. package/src/__tests__/injection-block.test.ts +4 -4
  144. package/src/__tests__/injector-chain.test.ts +1 -1
  145. package/src/__tests__/injector-pkb-v2-silenced.test.ts +2 -2
  146. package/src/__tests__/injector-registry-order-guard.test.ts +4 -9
  147. package/src/__tests__/injector-v3-suppression.test.ts +6 -4
  148. package/src/__tests__/lifecycle-memory-v2-seed.test.ts +27 -28
  149. package/src/__tests__/list-messages-page-latest.test.ts +2 -2
  150. package/src/__tests__/llm-usage-store.test.ts +67 -4
  151. package/src/__tests__/log-redact.test.ts +18 -0
  152. package/src/__tests__/managed-profile-guard.test.ts +27 -0
  153. package/src/__tests__/managed-skill-lifecycle.test.ts +2 -2
  154. package/src/__tests__/media-generate-image.test.ts +62 -11
  155. package/src/__tests__/memory-identity-context-parity.test.ts +1 -1
  156. package/src/__tests__/memory-jobs-worker-lanes.test.ts +9 -1
  157. package/src/__tests__/memory-retrieval-hook.test.ts +4 -4
  158. package/src/__tests__/notification-decision-strategy.test.ts +115 -11
  159. package/src/__tests__/notification-deep-link.test.ts +12 -12
  160. package/src/__tests__/notification-vellum-adapter.test.ts +8 -8
  161. package/src/__tests__/outbound-slack-persistence.test.ts +8 -8
  162. package/src/__tests__/path-policy.test.ts +315 -0
  163. package/src/__tests__/pending-interactions-resolved-event.test.ts +6 -6
  164. package/src/__tests__/persistence-layering-guard.test.ts +2 -2
  165. package/src/__tests__/pkb-autoinject.test.ts +1 -1
  166. package/src/__tests__/platform-bash-auto-approve.test.ts +1 -0
  167. package/src/__tests__/platform-callback-registration.test.ts +10 -10
  168. package/src/__tests__/plugin-event-hub-facade.test.ts +22 -15
  169. package/src/__tests__/plugin-import-boundary-guard.test.ts +15 -15
  170. package/src/__tests__/processing-flag-persist-failure.test.ts +0 -4
  171. package/src/__tests__/provider-platform-proxy-integration.test.ts +0 -1
  172. package/src/__tests__/rebuild-index-graph-nodes.test.ts +1 -1
  173. package/src/__tests__/request-secret-standalone-channel-gate.test.ts +5 -5
  174. package/src/__tests__/require-fresh-approval.test.ts +38 -38
  175. package/src/__tests__/resolve-app-id.test.ts +32 -0
  176. package/src/__tests__/run-due-schedules.test.ts +72 -1
  177. package/src/__tests__/runtime-events-sse-parity.test.ts +11 -10
  178. package/src/__tests__/runtime-events-sse.test.ts +1 -1
  179. package/src/__tests__/schedule-routes.test.ts +44 -5
  180. package/src/__tests__/schedule-store.test.ts +3 -3
  181. package/src/__tests__/schedule-tools.test.ts +176 -0
  182. package/src/__tests__/secret-prompt-log-hygiene.test.ts +3 -3
  183. package/src/__tests__/secret-prompter-channel-fallback.test.ts +3 -3
  184. package/src/__tests__/secret-response-routing.test.ts +3 -3
  185. package/src/__tests__/secret-routes-platform-proxy.test.ts +4 -7
  186. package/src/__tests__/secret-scanner.test.ts +36 -0
  187. package/src/__tests__/send-endpoint-busy.test.ts +7 -7
  188. package/src/__tests__/slack-required-scopes-mirror.test.ts +81 -0
  189. package/src/__tests__/starter-task-flow.test.ts +26 -3
  190. package/src/__tests__/subagent-call-site-routing.test.ts +2 -2
  191. package/src/__tests__/subagent-disposal.test.ts +40 -11
  192. package/src/__tests__/subagent-fork-notifications.test.ts +4 -4
  193. package/src/__tests__/subagent-fork-prompt-role.test.ts +3 -3
  194. package/src/__tests__/subagent-fork-spawn.test.ts +4 -4
  195. package/src/__tests__/subagent-manager-notify.test.ts +73 -14
  196. package/src/__tests__/subagent-notify-parent.test.ts +48 -4
  197. package/src/__tests__/subagent-spawn-and-await.test.ts +62 -14
  198. package/src/__tests__/subagent-tools.test.ts +64 -0
  199. package/src/__tests__/sync-message-contract.test.ts +3 -3
  200. package/src/__tests__/terminal-tools.test.ts +12 -3
  201. package/src/__tests__/test-preload.ts +9 -0
  202. package/src/__tests__/tool-approval-handler.test.ts +587 -43
  203. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +7 -4
  204. package/src/__tests__/tool-executor.test.ts +116 -0
  205. package/src/__tests__/tool-grant-request-escalation.test.ts +5 -0
  206. package/src/__tests__/tool-preview-lifecycle.test.ts +32 -29
  207. package/src/__tests__/tool-result-metadata-plumbing.test.ts +5 -5
  208. package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
  209. package/src/__tests__/tool-start-timestamp.test.ts +4 -4
  210. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +9 -22
  211. package/src/__tests__/ui-choice-copy-surfaces.test.ts +13 -13
  212. package/src/__tests__/ui-work-result-surface.test.ts +3 -3
  213. package/src/__tests__/voice-scoped-grant-consumer.test.ts +6 -6
  214. package/src/__tests__/voice-session-bridge.test.ts +44 -44
  215. package/src/__tests__/workspace-migration-134-image-generation-mode-to-provider.test.ts +284 -0
  216. package/src/__tests__/workspace-policy.test.ts +482 -2
  217. package/src/acp/__tests__/client-handler.test.ts +3 -3
  218. package/src/acp/__tests__/session-manager-persistence.test.ts +10 -10
  219. package/src/acp/__tests__/session-manager-resume.test.ts +7 -7
  220. package/src/acp/client-handler.ts +3 -3
  221. package/src/acp/session-manager.ts +8 -8
  222. package/src/api/events/subagent-event.ts +2 -2
  223. package/src/api/responses/memory-v2-activation-log.ts +2 -2
  224. package/src/api/responses/subagent-detail.ts +13 -0
  225. package/src/approvals/AGENTS.md +2 -0
  226. package/src/approvals/guardian-request-resolvers.ts +118 -24
  227. package/src/apps/app-store.ts +95 -4
  228. package/src/calls/__tests__/voice-control-protocol.test.ts +57 -0
  229. package/src/calls/__tests__/voice-session-bridge.test.ts +229 -7
  230. package/src/calls/__tests__/voice-triage-escalate.test.ts +3 -4
  231. package/src/calls/call-controller.ts +27 -27
  232. package/src/calls/call-conversation-messages.ts +58 -18
  233. package/src/calls/voice-control-protocol.ts +56 -0
  234. package/src/calls/voice-session-bridge.ts +178 -65
  235. package/src/calls/voice-triage-escalate.ts +2 -3
  236. package/src/channels/config.ts +8 -0
  237. package/src/channels/types.ts +1 -0
  238. package/src/cli/commands/config.ts +49 -13
  239. package/src/cli/commands/memory/index.help.ts +4 -2
  240. package/src/cli/commands/memory/memory-retrospective.ts +5 -0
  241. package/src/cli/commands/webhooks.help.ts +9 -4
  242. package/src/cli/lib/bundled-marketplace.json +12 -0
  243. package/src/cli.ts +2 -109
  244. package/src/config/__tests__/deployment-context-defaults.test.ts +9 -0
  245. package/src/config/__tests__/substrate-twin-shadowing.test.ts +191 -0
  246. package/src/config/assistant-feature-flags.ts +1 -1
  247. package/src/config/bundled-skills/conversation-groups/SKILL.md +29 -0
  248. package/src/config/bundled-skills/conversation-groups/TOOLS.json +58 -0
  249. package/src/config/bundled-skills/conversation-groups/tools/group-create.ts +12 -0
  250. package/src/config/bundled-skills/conversation-groups/tools/group-list.ts +12 -0
  251. package/src/config/bundled-skills/conversation-groups/tools/move-to-group.ts +12 -0
  252. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +13 -7
  253. package/src/config/bundled-skills/schedule/SKILL.md +2 -0
  254. package/src/config/feature-flag-cache.ts +6 -16
  255. package/src/config/feature-flag-registry.json +14 -38
  256. package/src/config/loader.ts +7 -1
  257. package/src/config/memory-tier.ts +15 -10
  258. package/src/config/memory-v3-gate.test.ts +278 -1
  259. package/src/config/memory-v3-gate.ts +88 -26
  260. package/src/config/raw-config-utils.ts +1 -1
  261. package/src/config/schemas/__tests__/live-voice.test.ts +27 -16
  262. package/src/config/schemas/__tests__/memory-v3.test.ts +1 -0
  263. package/src/config/schemas/live-voice.ts +33 -7
  264. package/src/config/schemas/llm.ts +1 -0
  265. package/src/config/schemas/memory-retrospective.ts +13 -0
  266. package/src/config/schemas/memory-substrate.ts +183 -0
  267. package/src/config/schemas/memory-v2.ts +3 -2
  268. package/src/config/schemas/memory-v3.ts +11 -4
  269. package/src/config/schemas/memory.ts +35 -1
  270. package/src/config/schemas/services.ts +10 -2
  271. package/src/config/substrate-twin-shadowing.ts +195 -0
  272. package/src/config/webhook-routing.ts +67 -0
  273. package/src/context/compactor.ts +10 -3
  274. package/src/context/token-estimator.ts +21 -0
  275. package/src/daemon/__tests__/channel-ui-capability.test.ts +85 -0
  276. package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +3 -3
  277. package/src/daemon/__tests__/embedding-reconcile.test.ts +3 -3
  278. package/src/daemon/__tests__/inference-profile-notification.test.ts +3 -6
  279. package/src/daemon/__tests__/native-web-search-metadata.test.ts +5 -5
  280. package/src/daemon/__tests__/web-search-status-text.test.ts +2 -2
  281. package/src/daemon/channel-ui-capability.ts +70 -1
  282. package/src/daemon/conversation-agent-loop-handlers.ts +4 -4
  283. package/src/daemon/conversation-agent-loop.ts +12 -5
  284. package/src/daemon/conversation-evictor.ts +26 -4
  285. package/src/daemon/conversation-launch.ts +11 -14
  286. package/src/daemon/conversation-lineage.ts +76 -0
  287. package/src/daemon/conversation-messaging.ts +14 -14
  288. package/src/daemon/conversation-notifiers.ts +2 -2
  289. package/src/daemon/conversation-process.ts +133 -21
  290. package/src/daemon/conversation-queue-manager.ts +7 -7
  291. package/src/daemon/conversation-runtime-assembly.ts +16 -0
  292. package/src/daemon/conversation-store.ts +11 -3
  293. package/src/daemon/conversation-surfaces.ts +8 -14
  294. package/src/daemon/conversation-tool-setup.ts +13 -7
  295. package/src/daemon/conversation-usage.ts +12 -11
  296. package/src/daemon/conversation.ts +38 -15
  297. package/src/daemon/disk-pressure-guard.ts +5 -12
  298. package/src/daemon/embedding-reconcile.ts +14 -9
  299. package/src/daemon/handlers/config-channels.ts +40 -134
  300. package/src/daemon/handlers/config-model.ts +15 -7
  301. package/src/daemon/handlers/conversations.ts +4 -2
  302. package/src/daemon/handlers/shared.ts +29 -0
  303. package/src/daemon/host-proxy-base.ts +4 -4
  304. package/src/daemon/lifecycle.ts +13 -0
  305. package/src/daemon/message-protocol.ts +8 -144
  306. package/src/daemon/message-types/computer-use.ts +0 -12
  307. package/src/daemon/message-types/conversations.ts +9 -345
  308. package/src/daemon/message-types/host-app-control.ts +0 -9
  309. package/src/daemon/message-types/host-browser.ts +0 -7
  310. package/src/daemon/message-types/host-ui-snapshot.ts +0 -7
  311. package/src/daemon/message-types/messages.ts +0 -48
  312. package/src/daemon/message-types/notifications.ts +0 -7
  313. package/src/daemon/message-types/skills.ts +0 -5
  314. package/src/daemon/message-types/surfaces.ts +0 -9
  315. package/src/daemon/message-types/sync.ts +0 -2
  316. package/src/daemon/process-message.ts +5 -5
  317. package/src/daemon/skill-memory-refresh.ts +5 -5
  318. package/src/daemon/tool-side-effects.ts +32 -16
  319. package/src/daemon/trust-context.ts +1 -1
  320. package/src/daemon/wake-conversation-ops.ts +4 -4
  321. package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +100 -7
  322. package/src/heartbeat/__tests__/heartbeat-service.test.ts +67 -0
  323. package/src/heartbeat/heartbeat-run-store.ts +81 -4
  324. package/src/heartbeat/heartbeat-service.ts +32 -1
  325. package/src/home/__tests__/feed-writer.test.ts +7 -7
  326. package/src/home/__tests__/home-content-refresh.test.ts +3 -0
  327. package/src/home/__tests__/suggested-prompts.test.ts +1 -0
  328. package/src/home/feed-writer.ts +6 -13
  329. package/src/home/home-content-refresh.ts +6 -9
  330. package/src/home/relationship-state-writer.ts +5 -12
  331. package/src/home/suggested-prompts-cache.ts +6 -19
  332. package/src/ipc/__tests__/events-publish-client.test.ts +67 -0
  333. package/src/ipc/events-publish-client.ts +44 -0
  334. package/src/ipc/routes/__tests__/conversation-sync-ipc-routes.test.ts +2 -2
  335. package/src/ipc/routes/__tests__/events-ipc-routes.test.ts +38 -9
  336. package/src/ipc/routes/events-ipc-routes.ts +11 -31
  337. package/src/live-voice/__tests__/front-decision.test.ts +4 -176
  338. package/src/live-voice/__tests__/live-voice-agent-turn.test.ts +276 -68
  339. package/src/live-voice/__tests__/live-voice-continuation-fork-hydration.test.ts +286 -0
  340. package/src/live-voice/__tests__/live-voice-events.test.ts +6 -3
  341. package/src/live-voice/__tests__/live-voice-progress.test.ts +185 -46
  342. package/src/live-voice/__tests__/live-voice-triage-escalate.test.ts +24 -59
  343. package/src/live-voice/__tests__/live-voice-tts-session.test.ts +38 -54
  344. package/src/live-voice/__tests__/live-voice-vad.test.ts +1154 -636
  345. package/src/live-voice/front-decision.ts +5 -155
  346. package/src/live-voice/live-voice-metrics.ts +4 -1
  347. package/src/live-voice/live-voice-session.ts +1288 -439
  348. package/src/live-voice/progress-phrases.ts +17 -0
  349. package/src/live-voice/protocol.ts +15 -0
  350. package/src/media/app-icon-generator.ts +15 -8
  351. package/src/media/avatar-router.ts +9 -5
  352. package/src/media/image-credentials.ts +42 -10
  353. package/src/media/image-service.ts +1 -13
  354. package/src/media/types.ts +26 -3
  355. package/src/notifications/AGENTS.md +2 -0
  356. package/src/notifications/__tests__/broadcaster.test.ts +95 -0
  357. package/src/notifications/adapters/macos.ts +3 -3
  358. package/src/notifications/broadcaster.ts +57 -0
  359. package/src/notifications/copy-composer.ts +0 -15
  360. package/src/notifications/decision-engine.ts +21 -22
  361. package/src/notifications/guardian-question-mode.ts +57 -2
  362. package/src/notifications/home-feed-side-effect.ts +4 -0
  363. package/src/notifications/signal.ts +6 -4
  364. package/src/notifications/trusted-contact-payloads.ts +3 -4
  365. package/src/notifications/vellum-card-affinity.ts +39 -0
  366. package/src/oauth/AGENTS.md +1 -1
  367. package/src/permissions/channel-permission-query.test.ts +69 -0
  368. package/src/permissions/channel-permission-query.ts +73 -1
  369. package/src/permissions/checker.test.ts +298 -15
  370. package/src/permissions/checker.ts +102 -36
  371. package/src/permissions/confirmation-guardian-request.test.ts +2 -2
  372. package/src/permissions/confirmation-guardian-request.ts +2 -2
  373. package/src/permissions/gateway-threshold-reader.test.ts +224 -17
  374. package/src/permissions/gateway-threshold-reader.ts +82 -10
  375. package/src/permissions/ipc-risk-types.ts +8 -0
  376. package/src/permissions/prompter.ts +5 -5
  377. package/src/permissions/question-guardian-request.test.ts +222 -0
  378. package/src/permissions/question-guardian-request.ts +179 -0
  379. package/src/permissions/question-prompter.test.ts +8 -8
  380. package/src/permissions/question-prompter.ts +18 -0
  381. package/src/permissions/secret-prompter.ts +2 -4
  382. package/src/permissions/workspace-policy.ts +269 -34
  383. package/src/persistence/__tests__/lifecycle-quiesce.test.ts +82 -0
  384. package/src/persistence/__tests__/message-content-file.test.ts +58 -3
  385. package/src/persistence/conversation-crud.ts +93 -0
  386. package/src/persistence/conversation-key-store.ts +63 -0
  387. package/src/persistence/conversation-parent.ts +27 -0
  388. package/src/persistence/db-async-query.ts +1 -1
  389. package/src/persistence/db-singleton.ts +14 -27
  390. package/src/persistence/delivery-crud.ts +45 -0
  391. package/src/persistence/embeddings/embedding-backend.ts +2 -1
  392. package/src/persistence/embeddings/embedding-identity.ts +7 -3
  393. package/src/persistence/job-utils.ts +32 -27
  394. package/src/persistence/jobs-store.ts +92 -3
  395. package/src/persistence/lifecycle-quiesce.ts +80 -0
  396. package/src/persistence/llm-usage-store.ts +45 -8
  397. package/src/persistence/message-content-file.ts +4 -4
  398. package/src/persistence/migrations/336-move-memory-v2-activation-logs-to-memory-db.ts +1 -1
  399. package/src/persistence/migrations/351-schedule-skill-script-handoff.ts +39 -0
  400. package/src/persistence/migrations/352-drop-schedule-skill-script-handoff.test.ts +83 -0
  401. package/src/persistence/migrations/352-drop-schedule-skill-script-handoff.ts +36 -0
  402. package/src/persistence/migrations/353-add-llm-usage-conversation-type.test.ts +110 -0
  403. package/src/persistence/migrations/353-add-llm-usage-conversation-type.ts +49 -0
  404. package/src/persistence/migrations/354-backfill-app-conversation-lineage.ts +41 -0
  405. package/src/persistence/schema/infrastructure.ts +11 -0
  406. package/src/persistence/steps.ts +9 -1
  407. package/src/plugin-api/__tests__/publish-event-forwarding.test.ts +113 -0
  408. package/src/plugin-api/__tests__/publish-event.test.ts +57 -0
  409. package/src/plugin-api/conversation-turn.ts +4 -4
  410. package/src/plugin-api/event-hub-facade.ts +15 -6
  411. package/src/plugin-api/index.ts +10 -4
  412. package/src/plugin-api/publish-event.ts +36 -0
  413. package/src/plugins/AGENTS.md +2 -0
  414. package/src/plugins/defaults/compaction/window-manager.ts +9 -0
  415. package/src/plugins/defaults/index.ts +9 -13
  416. package/src/plugins/defaults/memory/AGENTS.md +775 -0
  417. package/src/plugins/defaults/memory/__tests__/capability-seed-embed-gate.test.ts +186 -0
  418. package/src/plugins/defaults/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +1 -1
  419. package/src/plugins/defaults/memory/__tests__/indexer-tier-dispatch.test.ts +129 -0
  420. package/src/plugins/defaults/memory/__tests__/jobs-worker-quiesce-gate.test.ts +91 -0
  421. package/src/plugins/defaults/memory/__tests__/jobs-worker-v1-graph-substrate-noop.test.ts +342 -0
  422. package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +9 -1
  423. package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-schedule.test.ts +36 -1
  424. package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-sweep-defer.test.ts +9 -1
  425. package/src/plugins/defaults/memory/__tests__/memory-log-stores-degraded.test.ts +2 -2
  426. package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +44 -10
  427. package/src/plugins/defaults/memory/__tests__/memory-retrospective-sweep.test.ts +151 -10
  428. package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +1155 -0
  429. package/src/plugins/defaults/memory/__tests__/memory-v2-activation-log-store.test.ts +1 -1
  430. package/src/plugins/defaults/memory/__tests__/memory-v2-concept-frequency.test.ts +3 -3
  431. package/src/plugins/defaults/memory/__tests__/tools-delete-memory-page.test.ts +1 -1
  432. package/src/plugins/defaults/memory/context-search/sources/memory-v2.ts +71 -35
  433. package/src/plugins/defaults/memory/context-search/sources/memory.ts +5 -1
  434. package/src/plugins/defaults/memory/fork-conversation-memory.ts +4 -4
  435. package/src/plugins/defaults/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +80 -10
  436. package/src/plugins/defaults/memory/graph/__tests__/handle-remember-v2.test.ts +1 -1
  437. package/src/plugins/defaults/memory/graph/capability-seed.ts +24 -10
  438. package/src/plugins/defaults/memory/graph/conversation-graph-memory.ts +123 -49
  439. package/src/plugins/defaults/memory/graph/graph-search.ts +6 -118
  440. package/src/plugins/defaults/memory/graph/in-context-tracker.test.ts +173 -0
  441. package/src/plugins/defaults/memory/graph/in-context-tracker.ts +109 -0
  442. package/src/plugins/defaults/memory/graph/store.ts +1 -0
  443. package/src/plugins/defaults/memory/graph/tool-handlers.test.ts +1 -1
  444. package/src/plugins/defaults/memory/graph/tool-handlers.ts +5 -2
  445. package/src/plugins/defaults/memory/graph-topology/__tests__/build-memory-graph.test.ts +1 -1
  446. package/src/plugins/defaults/memory/graph-topology/build-memory-graph.ts +6 -9
  447. package/src/plugins/defaults/memory/hooks/__tests__/user-prompt-submit.test.ts +30 -16
  448. package/src/plugins/defaults/memory/hooks/user-prompt-submit.ts +18 -14
  449. package/src/plugins/defaults/memory/indexer.ts +146 -89
  450. package/src/plugins/defaults/memory/injectors.ts +86 -41
  451. package/src/plugins/defaults/memory/job-handlers.ts +130 -39
  452. package/src/plugins/defaults/memory/jobs/__tests__/embed-concept-page.test.ts +2 -2
  453. package/src/plugins/defaults/memory/jobs/embed-concept-page.ts +22 -10
  454. package/src/plugins/defaults/memory/jobs-worker.ts +279 -208
  455. package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +4 -2
  456. package/src/plugins/defaults/memory/memory-retrospective-job.ts +40 -3
  457. package/src/plugins/defaults/memory/memory-retrospective-sweep.ts +99 -11
  458. package/src/plugins/defaults/memory/src/__tests__/memory-v2-routes.test.ts +5 -3
  459. package/src/plugins/defaults/memory/src/__tests__/memory-v2-simulate-route.test.ts +3 -4
  460. package/src/plugins/defaults/memory/src/memory-graph-routes.ts +2 -1
  461. package/src/plugins/defaults/memory/src/memory-item-routes.test.ts +7 -5
  462. package/src/plugins/defaults/memory/src/memory-item-routes.ts +51 -19
  463. package/src/plugins/defaults/memory/src/memory-v2-routes.ts +31 -20
  464. package/src/plugins/defaults/memory/startup.ts +58 -21
  465. package/src/plugins/defaults/memory/substrate/__tests__/boot-maintenance.test.ts +335 -0
  466. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/cli-command-store.test.ts +14 -8
  467. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/consolidation-job.test.ts +51 -21
  468. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/edge-index.test.ts +1 -1
  469. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/frontmatter-sweep.test.ts +3 -3
  470. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/page-index.test.ts +1 -1
  471. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/page-store.test.ts +1 -1
  472. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/prompts-consolidation.test.ts +2 -2
  473. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/qdrant.test.ts +23 -14
  474. package/src/plugins/defaults/memory/substrate/__tests__/reembed-job.test.ts +262 -0
  475. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sim.test.ts +9 -12
  476. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/skill-content.test.ts +2 -2
  477. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/skill-store.test.ts +9 -9
  478. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sparse-bm25.test.ts +12 -5
  479. package/src/plugins/defaults/memory/substrate/__tests__/spread.test.ts +276 -0
  480. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/static-context.test.ts +17 -8
  481. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sweep-job.test.ts +9 -9
  482. package/src/plugins/defaults/memory/{v3/substrate/memory-v2-startup.ts → substrate/boot-maintenance.ts} +43 -24
  483. package/src/plugins/defaults/memory/{v3/substrate → substrate}/cli-command-store.ts +13 -8
  484. package/src/plugins/defaults/memory/{v3/substrate → substrate}/consolidation-job.ts +51 -27
  485. package/src/plugins/defaults/memory/{v3/substrate → substrate}/constants.ts +1 -0
  486. package/src/plugins/defaults/memory/{v3/substrate → substrate}/edge-index.ts +28 -9
  487. package/src/plugins/defaults/memory/{v3/substrate → substrate}/frontmatter-sweep.ts +14 -7
  488. package/src/plugins/defaults/memory/{v3/substrate → substrate}/injected-block-slugs.ts +9 -3
  489. package/src/plugins/defaults/memory/{v3/substrate → substrate}/page-index.ts +29 -10
  490. package/src/plugins/defaults/memory/{v3/substrate → substrate}/page-store.ts +35 -12
  491. package/src/plugins/defaults/memory/{v3/substrate → substrate}/prompts/consolidation.ts +14 -8
  492. package/src/plugins/defaults/memory/{v3/substrate → substrate}/prompts/sweep.ts +4 -1
  493. package/src/plugins/defaults/memory/{v3/substrate → substrate}/qdrant.ts +96 -36
  494. package/src/plugins/defaults/memory/substrate/reembed-job.ts +54 -0
  495. package/src/plugins/defaults/memory/{v3/substrate → substrate}/sim.ts +26 -15
  496. package/src/plugins/defaults/memory/{v3/substrate → substrate}/skill-content.ts +1 -1
  497. package/src/plugins/defaults/memory/{v3/substrate → substrate}/skill-store.ts +13 -8
  498. package/src/plugins/defaults/memory/{v3/substrate → substrate}/sparse-bm25.ts +27 -10
  499. package/src/plugins/defaults/memory/substrate/spread.ts +165 -0
  500. package/src/plugins/defaults/memory/{v3/substrate → substrate}/static-context.ts +12 -7
  501. package/src/plugins/defaults/memory/{v3/substrate → substrate}/sweep-job.ts +20 -15
  502. package/src/plugins/defaults/memory/substrate/tuning.ts +93 -0
  503. package/src/plugins/defaults/memory/{v3/substrate → substrate}/types.ts +7 -4
  504. package/src/plugins/defaults/memory/tools.test.ts +1 -1
  505. package/src/plugins/defaults/memory/tools.ts +1 -1
  506. package/src/plugins/defaults/memory/v1/README.md +5 -0
  507. package/src/plugins/defaults/memory/{__tests__ → v1/__tests__}/filing-jobs.test.ts +4 -4
  508. package/src/plugins/defaults/memory/{filing-jobs.ts → v1/filing-jobs.ts} +3 -3
  509. package/src/plugins/defaults/memory/{graph → v1/graph}/bootstrap.test.ts +68 -6
  510. package/src/plugins/defaults/memory/{graph → v1/graph}/bootstrap.ts +40 -21
  511. package/src/plugins/defaults/memory/{graph → v1/graph}/consolidation.ts +14 -14
  512. package/src/plugins/defaults/memory/{graph → v1/graph}/decay.test.ts +1 -1
  513. package/src/plugins/defaults/memory/{graph → v1/graph}/decay.ts +3 -3
  514. package/src/plugins/defaults/memory/{graph → v1/graph}/extraction-job.ts +5 -5
  515. package/src/plugins/defaults/memory/{graph → v1/graph}/extraction.test.ts +1 -1
  516. package/src/plugins/defaults/memory/{graph → v1/graph}/extraction.ts +20 -14
  517. package/src/plugins/defaults/memory/{graph → v1/graph}/graph-search.test.ts +3 -3
  518. package/src/plugins/defaults/memory/v1/graph/graph-search.ts +123 -0
  519. package/src/plugins/defaults/memory/{graph → v1/graph}/injection.test.ts +1 -118
  520. package/src/plugins/defaults/memory/{graph → v1/graph}/injection.ts +9 -111
  521. package/src/plugins/defaults/memory/{graph → v1/graph}/narrative.ts +6 -6
  522. package/src/plugins/defaults/memory/{graph → v1/graph}/pattern-scan.ts +5 -5
  523. package/src/plugins/defaults/memory/{graph → v1/graph}/retriever.test.ts +135 -42
  524. package/src/plugins/defaults/memory/{graph → v1/graph}/retriever.ts +40 -22
  525. package/src/plugins/defaults/memory/{graph → v1/graph}/scoring.test.ts +1 -1
  526. package/src/plugins/defaults/memory/{graph → v1/graph}/scoring.ts +1 -1
  527. package/src/plugins/defaults/memory/{graph → v1/graph}/serendipity.ts +1 -1
  528. package/src/plugins/defaults/memory/{graph → v1/graph}/triggers.test.ts +1 -1
  529. package/src/plugins/defaults/memory/{graph → v1/graph}/triggers.ts +1 -1
  530. package/src/plugins/defaults/memory/{identity-context.ts → v1/identity-context.ts} +4 -4
  531. package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/backfill.ts +6 -6
  532. package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/embedding.test.ts +6 -6
  533. package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/embedding.ts +6 -6
  534. package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/index-maintenance.ts +8 -8
  535. package/src/plugins/defaults/memory/{jobs → v1/jobs}/embed-pkb-file.test.ts +7 -7
  536. package/src/plugins/defaults/memory/{jobs → v1/jobs}/embed-pkb-file.ts +5 -5
  537. package/src/plugins/defaults/memory/{pkb → v1/pkb}/autoinject.ts +1 -1
  538. package/src/plugins/defaults/memory/{pkb → v1/pkb}/context.ts +2 -2
  539. package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-index.test.ts +3 -3
  540. package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-index.ts +2 -2
  541. package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-reconcile.test.ts +3 -3
  542. package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-reconcile.ts +2 -2
  543. package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-search.test.ts +3 -3
  544. package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-search.ts +6 -6
  545. package/src/plugins/defaults/memory/{pkb → v1/pkb}/types.ts +3 -5
  546. package/src/plugins/defaults/memory/{pkb-schedule.ts → v1/pkb-schedule.ts} +2 -2
  547. package/src/plugins/defaults/memory/{search/semantic.ts → v1/semantic-search.ts} +1 -1
  548. package/src/plugins/defaults/memory/v2/__tests__/activation-store.test.ts +1 -1
  549. package/src/plugins/defaults/memory/v2/__tests__/activation.test.ts +11 -274
  550. package/src/plugins/defaults/memory/v2/__tests__/backfill-jobs.test.ts +9 -131
  551. package/src/plugins/defaults/memory/v2/__tests__/harness-compare.test.ts +1 -1
  552. package/src/plugins/defaults/memory/v2/__tests__/harness-oracle.test.ts +1 -1
  553. package/src/plugins/defaults/memory/v2/__tests__/harness-replay-input.test.ts +1 -1
  554. package/src/plugins/defaults/memory/v2/__tests__/injection.test.ts +14 -10
  555. package/src/plugins/defaults/memory/v2/__tests__/reranker.test.ts +7 -5
  556. package/src/plugins/defaults/memory/v2/__tests__/router.test.ts +12 -6
  557. package/src/plugins/defaults/memory/{memory-v2-activation-log-store.ts → v2/activation-log-store.ts} +2 -2
  558. package/src/plugins/defaults/memory/v2/activation-store.ts +22 -8
  559. package/src/plugins/defaults/memory/v2/activation.ts +30 -163
  560. package/src/plugins/defaults/memory/v2/backfill-jobs.ts +7 -54
  561. package/src/plugins/defaults/memory/{memory-v2-concept-frequency.ts → v2/concept-frequency.ts} +3 -3
  562. package/src/plugins/defaults/memory/v2/harness/oracle.ts +1 -1
  563. package/src/plugins/defaults/memory/v2/harness/replay-input.ts +2 -2
  564. package/src/plugins/defaults/memory/v2/harness/retriever.ts +1 -1
  565. package/src/plugins/defaults/memory/v2/injection.ts +36 -26
  566. package/src/plugins/defaults/memory/v2/migration.ts +2 -2
  567. package/src/plugins/defaults/memory/{rerank-local.ts → v2/rerank-local.ts} +44 -18
  568. package/src/plugins/defaults/memory/v2/reranker.ts +29 -11
  569. package/src/plugins/defaults/memory/v2/router.ts +38 -15
  570. package/src/plugins/defaults/memory/v3/__tests__/candidate-match.test.ts +5 -3
  571. package/src/plugins/defaults/memory/v3/__tests__/carry-integration.test.ts +21 -8
  572. package/src/plugins/defaults/memory/v3/__tests__/edge.test.ts +1 -1
  573. package/src/plugins/defaults/memory/v3/__tests__/live-integration.test.ts +1 -1
  574. package/src/plugins/defaults/memory/v3/__tests__/maintain-job.test.ts +4 -1
  575. package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +181 -3
  576. package/src/plugins/defaults/memory/v3/__tests__/selection-log-store.test.ts +3 -0
  577. package/src/plugins/defaults/memory/v3/__tests__/shadow-integration.test.ts +14 -5
  578. package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +40 -50
  579. package/src/plugins/defaults/memory/v3/__tests__/tuning-profile.test.ts +1 -0
  580. package/src/plugins/defaults/memory/v3/candidate-match.ts +2 -2
  581. package/src/plugins/defaults/memory/v3/capabilities.ts +6 -4
  582. package/src/plugins/defaults/memory/v3/card.ts +25 -9
  583. package/src/plugins/defaults/memory/v3/edge.ts +52 -18
  584. package/src/plugins/defaults/memory/v3/gate.ts +4 -4
  585. package/src/plugins/defaults/memory/v3/injector.ts +10 -3
  586. package/src/plugins/defaults/memory/v3/maintain-job.ts +3 -3
  587. package/src/plugins/defaults/memory/v3/orchestrate.ts +100 -18
  588. package/src/plugins/defaults/memory/v3/page-content.ts +26 -10
  589. package/src/plugins/defaults/memory/v3/prune.ts +40 -16
  590. package/src/plugins/defaults/memory/v3/selection-log-store.ts +34 -12
  591. package/src/plugins/defaults/memory/v3/shadow-plugin.ts +9 -13
  592. package/src/plugins/defaults/memory/v3/span-query.test.ts +86 -0
  593. package/src/plugins/defaults/memory/v3/span-query.ts +71 -0
  594. package/src/plugins/defaults/memory/v3/tuning-profile.ts +3 -0
  595. package/src/plugins/defaults/memory/v3/types.ts +4 -1
  596. package/src/plugins/defaults/memory/v3-eval/eval-packets.ts +2 -2
  597. package/src/plugins/defaults/memory/validation.ts +1 -1
  598. package/src/plugins/defaults/memory/worker.ts +2 -1
  599. package/src/plugins/defaults/platform-hosted/__tests__/reengage.test.ts +104 -12
  600. package/src/plugins/defaults/platform-hosted/routes/reengage.ts +104 -12
  601. package/src/plugins/types.ts +2 -2
  602. package/src/prompts/sections.ts +4 -16
  603. package/src/providers/__tests__/registry-native-web-search.test.ts +47 -2
  604. package/src/providers/anthropic/client.ts +15 -6
  605. package/src/providers/content-block-schema.ts +26 -0
  606. package/src/providers/inference/__tests__/connections-credential-normalize.test.ts +87 -0
  607. package/src/providers/inference/adapter-factory.ts +6 -0
  608. package/src/providers/inference/connections.ts +30 -14
  609. package/src/providers/model-catalog.ts +77 -0
  610. package/src/providers/openai/__tests__/chat-completions-input-audio.test.ts +260 -0
  611. package/src/providers/openai/chat-completions-provider.ts +65 -17
  612. package/src/providers/openai/input-audio.ts +76 -0
  613. package/src/providers/openrouter/client.ts +0 -2
  614. package/src/providers/platform-proxy/constants.ts +4 -0
  615. package/src/providers/poolside/client.ts +42 -0
  616. package/src/providers/registry.ts +40 -8
  617. package/src/providers/retry.ts +2 -0
  618. package/src/providers/types.ts +39 -1
  619. package/src/providers/vercel-ai-gateway/client.ts +0 -2
  620. package/src/runtime/AGENTS.md +7 -5
  621. package/src/runtime/__tests__/question-request-guardian-bridge.test.ts +173 -0
  622. package/src/runtime/__tests__/question-resolution.test.ts +111 -0
  623. package/src/runtime/access-request-helper.ts +7 -15
  624. package/src/runtime/assistant-event-hub.ts +43 -31
  625. package/src/runtime/assistant-event-publish-options.ts +31 -0
  626. package/src/runtime/assistant-event.ts +19 -30
  627. package/src/runtime/assistant-stream-state.ts +4 -4
  628. package/src/runtime/channel-approvals.ts +0 -25
  629. package/src/runtime/channel-readiness-service.ts +99 -40
  630. package/src/runtime/channel-retry-sweep.ts +38 -15
  631. package/src/runtime/confirmation-request-guardian-bridge.ts +4 -0
  632. package/src/runtime/guardian-reply-router.ts +108 -0
  633. package/src/runtime/http-server.ts +8 -0
  634. package/src/runtime/http-types.ts +2 -2
  635. package/src/runtime/process-role.ts +42 -0
  636. package/src/runtime/question-request-guardian-bridge.ts +184 -0
  637. package/src/runtime/question-resolution.ts +153 -0
  638. package/src/runtime/routes/__tests__/bookmark-routes.test.ts +6 -2
  639. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +1 -1
  640. package/src/runtime/routes/__tests__/subagents-routes.test.ts +250 -0
  641. package/src/runtime/routes/__tests__/webhook-routes.test.ts +201 -0
  642. package/src/runtime/routes/acp-routes.ts +2 -2
  643. package/src/runtime/routes/bookmark-routes.ts +3 -15
  644. package/src/runtime/routes/canned-message-complete.ts +2 -2
  645. package/src/runtime/routes/consolidation-routes.ts +8 -2
  646. package/src/runtime/routes/conversation-list-routes.ts +3 -19
  647. package/src/runtime/routes/conversation-management-routes.ts +1 -5
  648. package/src/runtime/routes/conversation-query-routes.ts +52 -8
  649. package/src/runtime/routes/conversation-routes.ts +36 -22
  650. package/src/runtime/routes/credential-request-routes.ts +0 -1
  651. package/src/runtime/routes/filing-routes.ts +7 -7
  652. package/src/runtime/routes/global-search-routes.ts +1 -1
  653. package/src/runtime/routes/guardian-approval-prompt.ts +2 -2
  654. package/src/runtime/routes/image-generation-routes.ts +12 -9
  655. package/src/runtime/routes/inbound-message-handler.ts +17 -0
  656. package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +50 -0
  657. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +19 -0
  658. package/src/runtime/routes/inbound-stages/background-dispatch.ts +4 -4
  659. package/src/runtime/routes/inbound-stages/inbound-content-prep.test.ts +129 -0
  660. package/src/runtime/routes/inbound-stages/inbound-content-prep.ts +141 -9
  661. package/src/runtime/routes/index.ts +2 -0
  662. package/src/runtime/routes/lifecycle-routes.ts +199 -0
  663. package/src/runtime/routes/platform-routes.ts +3 -8
  664. package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +7 -7
  665. package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +5 -5
  666. package/src/runtime/routes/question-routes.ts +34 -87
  667. package/src/runtime/routes/secret-routes.ts +11 -1
  668. package/src/runtime/routes/settings-routes.ts +8 -18
  669. package/src/runtime/routes/subagents-routes.ts +35 -8
  670. package/src/runtime/routes/upgrade-broadcast-routes.ts +4 -5
  671. package/src/runtime/routes/webhook-routes.ts +89 -30
  672. package/src/runtime/routes/workspace-routes.test.ts +7 -4
  673. package/src/runtime/slack-reply-session.test.ts +12 -12
  674. package/src/runtime/slack-reply-session.ts +17 -17
  675. package/src/runtime/sync/sync-publisher.test.ts +7 -5
  676. package/src/runtime/tool-grant-request-helper.ts +4 -0
  677. package/src/schedule/schedule-store.ts +70 -0
  678. package/src/schedule/scheduler.ts +27 -0
  679. package/src/security/AGENTS.md +1 -1
  680. package/src/security/credential-key.ts +17 -0
  681. package/src/security/secret-ingress.ts +14 -105
  682. package/src/security/secret-patterns.ts +8 -139
  683. package/src/security/secret-scanner.ts +8 -3
  684. package/src/security/store-path-override.ts +6 -16
  685. package/src/sequence/store.ts +8 -0
  686. package/src/signals/emit-event.ts +5 -10
  687. package/src/signals/event-stream.ts +20 -10
  688. package/src/subagent/manager.ts +76 -25
  689. package/src/subagent/notify.ts +8 -0
  690. package/src/subagent/types.ts +13 -3
  691. package/src/telegram/__tests__/webhook-health.test.ts +442 -0
  692. package/src/telegram/webhook-health.ts +478 -0
  693. package/src/telemetry/AGENTS.md +6 -0
  694. package/src/telemetry/memory-corpus-size.test.ts +129 -0
  695. package/src/telemetry/memory-corpus-size.ts +184 -0
  696. package/src/telemetry/memory-tier-reporter.test.ts +67 -2
  697. package/src/telemetry/memory-tier-reporter.ts +30 -3
  698. package/src/tools/__tests__/conversation-group-tool-input-schemas.test.ts +61 -0
  699. package/src/tools/__tests__/document-tool-input-schemas.test.ts +103 -0
  700. package/src/tools/__tests__/followup-call-acp-tool-input-schemas.test.ts +125 -0
  701. package/src/tools/__tests__/schedule-tool-input-schemas.test.ts +83 -0
  702. package/src/tools/__tests__/subagent-workflow-tool-input-schemas.test.ts +116 -0
  703. package/src/tools/__tests__/tool-input-schemas.test.ts +192 -0
  704. package/src/tools/__tests__/tool-schema-drift-harness.ts +142 -0
  705. package/src/tools/acp/abort.ts +21 -1
  706. package/src/tools/acp/context.ts +5 -5
  707. package/src/tools/acp/spawn.test.ts +15 -5
  708. package/src/tools/acp/spawn.ts +26 -3
  709. package/src/tools/acp/status.ts +20 -1
  710. package/src/tools/acp/steer.test.ts +20 -0
  711. package/src/tools/acp/steer.ts +23 -2
  712. package/src/tools/apps/resolve-app-id.ts +15 -3
  713. package/src/tools/ask-question/ask-question-tool.test.ts +65 -0
  714. package/src/tools/ask-question/ask-question-tool.ts +68 -92
  715. package/src/tools/browser/browser-screencast.ts +6 -6
  716. package/src/tools/calls/call-end.ts +24 -3
  717. package/src/tools/calls/call-start.ts +35 -11
  718. package/src/tools/calls/call-status.ts +20 -1
  719. package/src/tools/conversation-groups/group_create.ts +63 -0
  720. package/src/tools/conversation-groups/group_list.ts +20 -0
  721. package/src/tools/conversation-groups/group_shared.ts +52 -0
  722. package/src/tools/conversation-groups/move_to_group.ts +106 -0
  723. package/src/tools/document/document-comment-tool.test.ts +49 -0
  724. package/src/tools/document/document-comment-tool.ts +45 -6
  725. package/src/tools/document/document-tool.ts +142 -24
  726. package/src/tools/executor.ts +27 -13
  727. package/src/tools/filesystem/edit.ts +62 -60
  728. package/src/tools/filesystem/list.ts +36 -29
  729. package/src/tools/filesystem/read.ts +56 -39
  730. package/src/tools/filesystem/write.ts +44 -38
  731. package/src/tools/followups/followup_create.ts +41 -12
  732. package/src/tools/followups/followup_list.ts +34 -6
  733. package/src/tools/followups/followup_resolve.ts +26 -4
  734. package/src/tools/host-filesystem/edit.ts +50 -60
  735. package/src/tools/host-filesystem/read.ts +45 -39
  736. package/src/tools/host-filesystem/write.ts +31 -36
  737. package/src/tools/host-terminal/host-shell.ts +76 -62
  738. package/src/tools/policy-context.ts +27 -10
  739. package/src/tools/schedule/create.ts +76 -33
  740. package/src/tools/schedule/delete.ts +21 -2
  741. package/src/tools/schedule/list.ts +25 -3
  742. package/src/tools/schedule/update.ts +105 -48
  743. package/src/tools/shared/filesystem/path-policy.ts +246 -40
  744. package/src/tools/shared/zod-tool-schema.ts +117 -0
  745. package/src/tools/subagent/abort.ts +12 -4
  746. package/src/tools/subagent/consult-deadline.ts +9 -3
  747. package/src/tools/subagent/message.ts +21 -5
  748. package/src/tools/subagent/notify-parent.ts +44 -23
  749. package/src/tools/subagent/read.ts +15 -4
  750. package/src/tools/subagent/resolve.ts +26 -4
  751. package/src/tools/subagent/spawn.ts +37 -13
  752. package/src/tools/subagent/status.ts +12 -4
  753. package/src/tools/system/request-permission.ts +35 -26
  754. package/src/tools/terminal/shell.ts +68 -55
  755. package/src/tools/tool-approval-handler.ts +327 -53
  756. package/src/tools/tool-input-schemas.ts +85 -0
  757. package/src/tools/tool-types.ts +7 -0
  758. package/src/tools/types.ts +8 -0
  759. package/src/tools/workflows/manage-workflows.ts +30 -2
  760. package/src/tools/workflows/run-workflow.test.ts +54 -2
  761. package/src/tools/workflows/run-workflow.ts +32 -4
  762. package/src/util/fs-symlinks.ts +30 -0
  763. package/src/util/log-redact.ts +7 -3
  764. package/src/util/platform.ts +15 -0
  765. package/src/vellum-assistant-namespace.d.ts +80 -0
  766. package/src/watcher/watcher-store.ts +8 -0
  767. package/src/workflows/leaf-runner.test.ts +104 -2
  768. package/src/workflows/leaf-runner.ts +31 -6
  769. package/src/workspace/migrations/070-memory-v2-summary-schema-rebuild.ts +2 -2
  770. package/src/workspace/migrations/134-image-generation-mode-to-provider.ts +128 -0
  771. package/src/workspace/migrations/135-copy-substrate-tunables.ts +248 -0
  772. package/src/workspace/migrations/__tests__/135-copy-substrate-tunables.test.ts +446 -0
  773. package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +2 -2
  774. package/src/workspace/migrations/registry.ts +4 -0
  775. package/tsconfig.plugin-api.json +1 -1
  776. package/src/__tests__/memory-retrieval-budget.test.ts +0 -49
  777. package/src/__tests__/secret-patterns.test.ts +0 -27
  778. package/src/config/__tests__/proc-to-skills.test.ts +0 -21
  779. package/src/config/memory-tier.test.ts +0 -44
  780. package/src/daemon/message-types/acp.ts +0 -20
  781. package/src/daemon/message-types/apps.ts +0 -11
  782. package/src/daemon/message-types/background-tools.ts +0 -14
  783. package/src/daemon/message-types/bookmarks.ts +0 -13
  784. package/src/daemon/message-types/contacts.ts +0 -13
  785. package/src/daemon/message-types/document-comments.ts +0 -14
  786. package/src/daemon/message-types/documents.ts +0 -13
  787. package/src/daemon/message-types/home.ts +0 -15
  788. package/src/daemon/message-types/host-bash.ts +0 -12
  789. package/src/daemon/message-types/host-cu.ts +0 -10
  790. package/src/daemon/message-types/host-file.ts +0 -12
  791. package/src/daemon/message-types/host-transfer.ts +0 -12
  792. package/src/daemon/message-types/integrations.ts +0 -90
  793. package/src/daemon/message-types/memory.ts +0 -10
  794. package/src/daemon/message-types/schedules.ts +0 -14
  795. package/src/daemon/message-types/settings.ts +0 -17
  796. package/src/daemon/message-types/subagents.ts +0 -63
  797. package/src/daemon/message-types/upgrades.ts +0 -14
  798. package/src/daemon/message-types/workflows.ts +0 -25
  799. package/src/daemon/message-types/workspace.ts +0 -137
  800. package/src/live-voice/ack-phrases.ts +0 -58
  801. package/src/plugins/defaults/memory/retrieval-budget.ts +0 -29
  802. package/src/plugins/defaults/memory/v3/__tests__/gate-flag.test.ts +0 -69
  803. package/src/plugins/defaults/memory/v3/gate-flag.ts +0 -20
  804. package/src/plugins/defaults/memory/v3/substrate/__tests__/memory-v2-startup.test.ts +0 -86
  805. package/src/plugins/defaults/memory/v3/substrate/memory-v2-startup.test.ts +0 -205
  806. /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/concept-page-frontmatter-schema.test.ts +0 -0
  807. /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/consolidation-prompt-flag-gating-guard.test.ts +0 -0
  808. /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/injected-block-slugs.test.ts +0 -0
  809. /package/src/plugins/defaults/memory/{v3/substrate → substrate}/cli-command-content.ts +0 -0
@@ -12,18 +12,11 @@
12
12
  // + c_user · α · r_norm(User_{t+1}, n) [n ∈ topK]
13
13
  // + c_assistant · α · r_norm(Assistant_t, n) [n ∈ topK]
14
14
  //
15
- // A(n, t+1) = [ A_o(n)
16
- // + k · Σ_{m∈in1(n)} A_o(m)
17
- // + k² · Σ_{m∈in2(n)} A_o(m) ]
18
- // / (1 + k · #in1(n) + k² · #in2(n))
19
- //
20
- // Edges are directed: edge A→B means A's activation contributes to B's. The
21
- // per-target BFS walks *incoming* adjacency, so `in1(n)` is the set of nodes
22
- // with an edge A→n and `in2(n)` adds another hop in the same direction.
23
- //
24
- // Bounded in [0, 1]. Pure sources (no incoming edges within `hops`) reduce to
25
- // A == A_o because both numerator and denominator collapse to `A_o(n)` and
26
- // `1`, respectively.
15
+ // The spread step that turns A_o into the final A(n, t+1) lives in the
16
+ // substrate (`substrate/spread.ts` — `spreadActivation`) because the `memory`
17
+ // recall source also spreads activation under v3. Callers import it from there
18
+ // directly; this module deliberately does not re-export it, so the symbol has
19
+ // one import path.
27
20
  //
28
21
  // Candidate selection (§6) keeps the per-turn cost linear in the size of the
29
22
  // active set rather than the entire concept-page collection. The candidate
@@ -38,14 +31,10 @@ import type { AssistantConfig } from "../../../../config/types.js";
38
31
  import { isEmbeddingDimensionAvailable } from "../../../../persistence/embeddings/embedding-backend.js";
39
32
  import { applyCorrectionIfCalibrated } from "../anisotropy.js";
40
33
  import { embedWithBackend } from "../embeddings.js";
41
- import type { EdgeIndex } from "../v3/substrate/edge-index.js";
42
- import { hybridQueryConceptPages } from "../v3/substrate/qdrant.js";
43
- import { simBatch } from "../v3/substrate/sim.js";
44
- import { generateBm25QueryEmbedding } from "../v3/substrate/sparse-bm25.js";
45
- import type {
46
- ActivationState,
47
- EverInjectedEntry,
48
- } from "../v3/substrate/types.js";
34
+ import { hybridQueryConceptPages } from "../substrate/qdrant.js";
35
+ import { simBatch } from "../substrate/sim.js";
36
+ import { generateBm25QueryEmbedding } from "../substrate/sparse-bm25.js";
37
+ import type { ActivationState, EverInjectedEntry } from "../substrate/types.js";
49
38
  import { clampUnitInterval } from "../validation.js";
50
39
  import { rerankCandidates } from "./reranker.js";
51
40
 
@@ -121,7 +110,9 @@ export async function selectCandidates(
121
110
  if (priorState) {
122
111
  const epsilon = config.memory.v2.epsilon;
123
112
  for (const [slug, activation] of Object.entries(priorState.state)) {
124
- if (activation > epsilon) fromPrior.add(slug);
113
+ if (activation > epsilon) {
114
+ fromPrior.add(slug);
115
+ }
125
116
  }
126
117
  }
127
118
 
@@ -157,7 +148,9 @@ export async function selectCandidates(
157
148
  const limit =
158
149
  config.memory.v2.ann_candidate_limit ?? UNLIMITED_ANN_CANDIDATE_LIMIT;
159
150
  const hits = await hybridQueryConceptPages(dense, sparse, limit);
160
- for (const hit of hits) fromAnn.add(hit.slug);
151
+ for (const hit of hits) {
152
+ fromAnn.add(hit.slug);
153
+ }
161
154
  }
162
155
 
163
156
  const candidates = new Set<string>([...fromPrior, ...fromAnn]);
@@ -243,7 +236,9 @@ export async function computeOwnActivation(
243
236
 
244
237
  const activation = new Map<string, number>();
245
238
  const breakdown = new Map<string, OwnActivationBreakdown>();
246
- if (candidates.size === 0) return { activation, breakdown };
239
+ if (candidates.size === 0) {
240
+ return { activation, breakdown };
241
+ }
247
242
 
248
243
  const { d, c_user, c_assistant, c_now } = config.memory.v2;
249
244
  const slugList = [...candidates];
@@ -358,12 +353,18 @@ function normalizeRerankScores(
358
353
  alpha: number,
359
354
  ): Map<string, number> {
360
355
  const out = new Map<string, number>();
361
- if (rawScores.size === 0) return out;
356
+ if (rawScores.size === 0) {
357
+ return out;
358
+ }
362
359
  let maxScore = 0;
363
360
  for (const v of rawScores.values()) {
364
- if (v > maxScore) maxScore = v;
361
+ if (v > maxScore) {
362
+ maxScore = v;
363
+ }
364
+ }
365
+ if (maxScore === 0) {
366
+ return out;
365
367
  }
366
- if (maxScore === 0) return out;
367
368
  for (const [slug, raw] of rawScores) {
368
369
  out.set(slug, alpha * (raw / maxScore));
369
370
  }
@@ -376,142 +377,6 @@ function throwIfAborted(signal: AbortSignal | undefined): void {
376
377
  }
377
378
  }
378
379
 
379
- // ---------------------------------------------------------------------------
380
- // Spreading activation
381
- // ---------------------------------------------------------------------------
382
-
383
- interface SpreadActivationResult {
384
- /** Final activation value per slug after spreading. */
385
- final: Map<string, number>;
386
- /**
387
- * Per-slug spread delta: `final[slug] - own[slug]`. Captures how much
388
- * the spread step nudged each node above (or below) its own activation —
389
- * useful for inspector views that want to show graph contributions
390
- * separate from raw sim contributions. Always 0 when `hops == 0` or
391
- * `k == 0` because both short-circuit to `final == own`.
392
- */
393
- contribution: Map<string, number>;
394
- }
395
-
396
- /**
397
- * Apply 2-hop spreading activation with neighborhood normalization. Edges are
398
- * directed: an edge A→B means A's activation contributes to B's final value.
399
- *
400
- * A(n) = [ A_o(n) + Σ_{r: |active_inR(n)| > 0} k^r · L2(active_inR(n)) ]
401
- * / [ 1 + Σ_{r: |active_inR(n)| > 0} k^r ]
402
- *
403
- * `active_inR(n)` is the subset of structural predecessors at hop `r` that
404
- * also appear in `ownActivation` (i.e. made the candidate set). `L2(.)` is
405
- * the quadratic mean √(mean(A_o²)) — a mild bias toward strong outliers
406
- * compared to the arithmetic mean, without letting a single high-cosine
407
- * predecessor dominate the way `max` would.
408
- *
409
- * Hops with **no** active predecessors are dropped from BOTH numerator and
410
- * denominator so a high-in-degree hub with mostly-inactive neighbors stays
411
- * near `A_o` instead of being crushed by the structural count. A pure
412
- * source (no incoming edges, or every edge points at a non-candidate)
413
- * collapses to `A == A_o`.
414
- *
415
- * Bounded in [0, 1]: every `L2` term ≤ max active A_o ≤ 1, so the numerator
416
- * is at most `1 + Σ k^r` — exactly the denominator — so the ratio is at most
417
- * 1. `clampUnitInterval` guards against numerical drift and out-of-range
418
- * inputs.
419
- *
420
- * Pure function — no I/O. Reads the precomputed `incoming` map from
421
- * `edgeIndex` and runs a per-source BFS bounded by `hops`.
422
- */
423
- export function spreadActivation(
424
- ownActivation: ReadonlyMap<string, number>,
425
- edgeIndex: EdgeIndex,
426
- k: number,
427
- hops: number,
428
- ): SpreadActivationResult {
429
- const final = new Map<string, number>();
430
- const contribution = new Map<string, number>();
431
- if (ownActivation.size === 0) return { final, contribution };
432
-
433
- // Short-circuit: with no spread the formula collapses to A == A_o.
434
- if (hops <= 0 || k <= 0) {
435
- for (const [slug, ownValue] of ownActivation) {
436
- final.set(slug, clampUnitInterval(ownValue));
437
- contribution.set(slug, 0);
438
- }
439
- return { final, contribution };
440
- }
441
-
442
- for (const [slug, ownValue] of ownActivation) {
443
- // Single bounded BFS from `slug` over incoming edges. `distance` maps
444
- // predecessor → hop count (1..hops). Source is excluded so it contributes
445
- // hop-0 only via `numerator = ownValue`.
446
- const distance = bfsPredecessorDistances(edgeIndex.incoming, slug, hops);
447
-
448
- // Bucket only predecessors that are in `ownActivation` (the candidate
449
- // set). Structural predecessors that didn't make the cut contribute
450
- // nothing — neither to the numerator nor the denominator — so hub
451
- // in-degree alone never penalizes a node.
452
- const ringActiveCounts: number[] = new Array(hops + 1).fill(0);
453
- const ringSquareSums: number[] = new Array(hops + 1).fill(0);
454
- for (const [predecessor, hop] of distance) {
455
- const predValue = ownActivation.get(predecessor);
456
- if (predValue === undefined) continue;
457
- ringActiveCounts[hop] += 1;
458
- ringSquareSums[hop] += predValue * predValue;
459
- }
460
-
461
- let numerator = ownValue;
462
- let denominator = 1;
463
- let kPow = 1;
464
- for (let r = 1; r <= hops; r++) {
465
- kPow *= k;
466
- if (ringActiveCounts[r] === 0) continue;
467
- const rms = Math.sqrt(ringSquareSums[r] / ringActiveCounts[r]);
468
- numerator += kPow * rms;
469
- denominator += kPow;
470
- }
471
-
472
- const finalValue = clampUnitInterval(numerator / denominator);
473
- final.set(slug, finalValue);
474
- contribution.set(slug, finalValue - ownValue);
475
- }
476
-
477
- return { final, contribution };
478
- }
479
-
480
- // ---------------------------------------------------------------------------
481
- // Internal helpers
482
- // ---------------------------------------------------------------------------
483
-
484
- /**
485
- * Bounded BFS over the *incoming* adjacency map. Returns each reachable
486
- * predecessor's hop-distance in [1, maxHops] from `target` — i.e. nodes from
487
- * which a directed path of that length leads into `target`. The target itself
488
- * is excluded.
489
- */
490
- function bfsPredecessorDistances(
491
- incoming: ReadonlyMap<string, ReadonlySet<string>>,
492
- target: string,
493
- maxHops: number,
494
- ): Map<string, number> {
495
- const distance = new Map<string, number>();
496
- let frontier: string[] = [target];
497
- const visited = new Set<string>([target]);
498
- for (let hop = 1; hop <= maxHops && frontier.length > 0; hop++) {
499
- const next: string[] = [];
500
- for (const node of frontier) {
501
- const predecessors = incoming.get(node);
502
- if (!predecessors) continue;
503
- for (const predecessor of predecessors) {
504
- if (visited.has(predecessor)) continue;
505
- visited.add(predecessor);
506
- distance.set(predecessor, hop);
507
- next.push(predecessor);
508
- }
509
- }
510
- frontier = next;
511
- }
512
- return distance;
513
- }
514
-
515
380
  // ---------------------------------------------------------------------------
516
381
  // Injection selection
517
382
  // ---------------------------------------------------------------------------
@@ -549,7 +414,9 @@ export function selectInjections(
549
414
  }
550
415
 
551
416
  const ranked = [...A.entries()].sort(([slugA, valA], [slugB, valB]) => {
552
- if (valB !== valA) return valB - valA; // higher activation first
417
+ if (valB !== valA) {
418
+ return valB - valA;
419
+ } // higher activation first
553
420
  return slugA < slugB ? -1 : slugA > slugB ? 1 : 0; // stable tie-break
554
421
  });
555
422
 
@@ -2,21 +2,18 @@
2
2
  // Memory v2 — Backfill job handlers
3
3
  // ---------------------------------------------------------------------------
4
4
  //
5
- // Three operator-triggered backfills, all wired through the same job queue so
5
+ // Two operator-triggered v2 backfills, wired through the same job queue so
6
6
  // they can be enqueued from the IPC route, the CLI, or recovery paths:
7
7
  //
8
8
  // - `memory_v2_migrate` — one-shot v1→v2 synthesis (PR 16).
9
- // - `memory_v2_reembed` — fan out an `embed_concept_page` job
10
- // per concept-page slug.
11
9
  // - `memory_v2_activation_recompute` — recompute persisted activation
12
10
  // state for every conversation, no rendering. Used after consolidation
13
11
  // replaces or deletes pages that other conversations still reference.
14
12
  //
15
13
  // Each handler is intentionally small — heavy lifting lives in the modules
16
- // they delegate to (`migration.ts`, `page-store.ts`, `embed-concept-page.ts`,
17
- // `activation.ts`, `activation-store.ts`). Keeping the wrappers thin means
18
- // the same code paths exercised by tests of those modules run unchanged when
19
- // a backfill kicks them off.
14
+ // they delegate to (`migration.ts`, `activation.ts`, `activation-store.ts`).
15
+ // Keeping the wrappers thin means the same code paths exercised by tests of
16
+ // those modules run unchanged when a backfill kicks them off.
20
17
 
21
18
  import {
22
19
  getMessages,
@@ -27,16 +24,11 @@ import {
27
24
  import type { AssistantConfig } from "../../../../config/types.js";
28
25
  import { getMemoryDb } from "../../../../persistence/db-connection.js";
29
26
  import type { MemoryJob } from "../../../../persistence/jobs-store.js";
30
- import { enqueueEmbedConceptPageJob } from "../jobs/embed-concept-page.js";
31
27
  import { getLogger } from "../logging.js";
32
28
  import { getWorkspaceDir } from "../paths.js";
33
- import { getEdgeIndex } from "../v3/substrate/edge-index.js";
34
- import { listPages } from "../v3/substrate/page-store.js";
35
- import {
36
- computeOwnActivation,
37
- selectCandidates,
38
- spreadActivation,
39
- } from "./activation.js";
29
+ import { getEdgeIndex } from "../substrate/edge-index.js";
30
+ import { spreadActivation } from "../substrate/spread.js";
31
+ import { computeOwnActivation, selectCandidates } from "./activation.js";
40
32
  import { hydrate, save } from "./activation-store.js";
41
33
  import {
42
34
  MigrationAlreadyAppliedError,
@@ -101,45 +93,6 @@ export async function memoryV2MigrateJob(
101
93
  }
102
94
  }
103
95
 
104
- // ---------------------------------------------------------------------------
105
- // memory_v2_reembed — fan out embed jobs for every concept page
106
- // ---------------------------------------------------------------------------
107
-
108
- /**
109
- * Job handler: enqueue an `embed_concept_page` job per concept-page slug.
110
- * Each enqueue coalesces with an already-pending job for the same slug, so
111
- * stacked reembed runs converge on at most one pending embed per page.
112
- *
113
- * Returns the number of pages fanned out (enqueue attempts, not necessarily
114
- * fresh rows). Callers (and tests) use the return value to assert progress
115
- * without inspecting the job table directly.
116
- *
117
- * Note on meta files: `essentials.md` / `threads.md` / `recent.md` /
118
- * `buffer.md` are direct-injected into the system prompt every turn via
119
- * `_autoinject.md`. They are NOT enqueued for embedding here — their slugs
120
- * (`__essentials__` etc.) contain underscores that the concept-page slug
121
- * validator rejects (`[a-z0-9][a-z0-9-]*`), and they live at `memory/<name>.md`
122
- * rather than `memory/concepts/<name>.md`, so path resolution would also miss.
123
- * Embedding them would be redundant with the direct injection regardless.
124
- */
125
- export async function memoryV2ReembedJob(
126
- _job: MemoryJob,
127
- _config: AssistantConfig,
128
- ): Promise<number> {
129
- const workspaceDir = getWorkspaceDir();
130
- const slugs = await listPages(workspaceDir);
131
-
132
- for (const slug of slugs) {
133
- enqueueEmbedConceptPageJob({ slug });
134
- }
135
-
136
- log.info(
137
- { conceptPages: slugs.length, total: slugs.length },
138
- "Memory v2 reembed enqueued",
139
- );
140
- return slugs.length;
141
- }
142
-
143
96
  // ---------------------------------------------------------------------------
144
97
  // memory_v2_activation_recompute — refresh persisted activation state
145
98
  // ---------------------------------------------------------------------------
@@ -1,6 +1,6 @@
1
- import { memorySqliteOrNull } from "./memory-db.js";
2
- import type { MemoryV2ConceptRowRecord } from "./memory-v2-activation-log-store.js";
3
- import { listPages } from "./v3/substrate/page-store.js";
1
+ import { memorySqliteOrNull } from "../memory-db.js";
2
+ import { listPages } from "../substrate/page-store.js";
3
+ import type { MemoryV2ConceptRowRecord } from "./activation-log-store.js";
4
4
 
5
5
  type ConceptStatus = MemoryV2ConceptRowRecord["status"];
6
6
 
@@ -23,7 +23,7 @@ import { memorySqliteOrNull } from "../../memory-db.js";
23
23
  import type {
24
24
  MemoryV2ConceptRowRecord,
25
25
  MemoryV2ConfigSnapshot,
26
- } from "../../memory-v2-activation-log-store.js";
26
+ } from "../activation-log-store.js";
27
27
 
28
28
  export interface OracleTurn {
29
29
  conversationId: string;
@@ -27,8 +27,8 @@ import type { AssistantConfig } from "../../../../../config/types.js";
27
27
  import type { DrizzleDb } from "../../../../../persistence/db-connection.js";
28
28
  import { messages } from "../../../../../persistence/schema/index.js";
29
29
  import { memorySqliteOrNull } from "../../memory-db.js";
30
- import type { MemoryV2ConceptRowRecord } from "../../memory-v2-activation-log-store.js";
31
- import type { EverInjectedEntry } from "../../v3/substrate/types.js";
30
+ import type { EverInjectedEntry } from "../../substrate/types.js";
31
+ import type { MemoryV2ConceptRowRecord } from "../activation-log-store.js";
32
32
  import { loadNowText } from "../now-text.js";
33
33
  import type { RouterTurnPair } from "../router.js";
34
34
  import type { OracleTurn } from "./oracle.js";
@@ -10,7 +10,7 @@
10
10
  */
11
11
 
12
12
  import type { AssistantConfig } from "../../../../../config/types.js";
13
- import type { EverInjectedEntry } from "../../v3/substrate/types.js";
13
+ import type { EverInjectedEntry } from "../../substrate/types.js";
14
14
  import type { RouterTurnPair } from "../router.js";
15
15
  import type { RetrievalCost } from "./harness-types.js";
16
16
  import type { DescentTrace } from "./trace.js";
@@ -25,32 +25,26 @@
25
25
 
26
26
  import type { AssistantConfig } from "../../../../config/types.js";
27
27
  import { getLogger } from "../logging.js";
28
- import {
29
- type MemoryV2ConceptRowRecord,
30
- recordMemoryV2ActivationLog,
31
- } from "../memory-v2-activation-log-store.js";
32
28
  import { getWorkspaceDir } from "../paths.js";
33
29
  import {
34
30
  getCliCommandCapability,
35
31
  isCliCommandSlug,
36
- } from "../v3/substrate/cli-command-store.js";
37
- import { getEdgeIndex } from "../v3/substrate/edge-index.js";
38
- import { getPageIndex } from "../v3/substrate/page-index.js";
39
- import { readPage, renderPageContent } from "../v3/substrate/page-store.js";
40
- import {
41
- getSkillCapability,
42
- isSkillSlug,
43
- } from "../v3/substrate/skill-store.js";
44
- import type {
45
- ActivationState,
46
- EverInjectedEntry,
47
- } from "../v3/substrate/types.js";
32
+ } from "../substrate/cli-command-store.js";
33
+ import { getEdgeIndex } from "../substrate/edge-index.js";
34
+ import { getPageIndex } from "../substrate/page-index.js";
35
+ import { readPage, renderPageContent } from "../substrate/page-store.js";
36
+ import { getSkillCapability, isSkillSlug } from "../substrate/skill-store.js";
37
+ import { spreadActivation } from "../substrate/spread.js";
38
+ import type { ActivationState, EverInjectedEntry } from "../substrate/types.js";
48
39
  import {
49
40
  computeOwnActivation,
50
41
  selectCandidates,
51
42
  selectInjections,
52
- spreadActivation,
53
43
  } from "./activation.js";
44
+ import {
45
+ type MemoryV2ConceptRowRecord,
46
+ recordMemoryV2ActivationLog,
47
+ } from "./activation-log-store.js";
54
48
  import { hydrate, save } from "./activation-store.js";
55
49
  import { recordInjectionEvents } from "./injection-events.js";
56
50
  import { type RouterTurnPair, runRouter } from "./router.js";
@@ -253,7 +247,9 @@ export async function injectMemoryV2Block(
253
247
  // slugs drop out of consideration next turn.
254
248
  const nextStateMap: Record<string, number> = {};
255
249
  for (const [slug, value] of finalActivation) {
256
- if (value > epsilon) nextStateMap[slug] = value;
250
+ if (value > epsilon) {
251
+ nextStateMap[slug] = value;
252
+ }
257
253
  }
258
254
 
259
255
  // Build the rich per-candidate telemetry rows up front (status assigned
@@ -506,7 +502,9 @@ async function finalizeInjection(args: {
506
502
  }
507
503
  }
508
504
 
509
- if (caughtErr !== undefined && !args.bestEffort) throw caughtErr;
505
+ if (caughtErr !== undefined && !args.bestEffort) {
506
+ throw caughtErr;
507
+ }
510
508
  return { block, toInject: newlyInjected };
511
509
  }
512
510
 
@@ -673,7 +671,9 @@ async function injectViaRouter(args: {
673
671
  // `source: "carry_over"`. The `status` placeholder is overwritten by
674
672
  // `finalizeInjection`.
675
673
  const telemetrySlugs = new Set<string>(routerResult.selectedSlugs);
676
- for (const entry of priorEverInjected) telemetrySlugs.add(entry.slug);
674
+ for (const entry of priorEverInjected) {
675
+ telemetrySlugs.add(entry.slug);
676
+ }
677
677
  const telemetryRows: MemoryV2ConceptRowRecord[] = [...telemetrySlugs].map(
678
678
  (slug) => ({
679
679
  slug,
@@ -846,9 +846,13 @@ async function renderInjectionBlock(
846
846
  const skillSlugs: string[] = [];
847
847
  const cliCommandSlugs: string[] = [];
848
848
  for (const slug of slugs) {
849
- if (isSkillSlug(slug)) skillSlugs.push(slug);
850
- else if (isCliCommandSlug(slug)) cliCommandSlugs.push(slug);
851
- else conceptSlugs.push(slug);
849
+ if (isSkillSlug(slug)) {
850
+ skillSlugs.push(slug);
851
+ } else if (isCliCommandSlug(slug)) {
852
+ cliCommandSlugs.push(slug);
853
+ } else {
854
+ conceptSlugs.push(slug);
855
+ }
852
856
  }
853
857
 
854
858
  const settled = await Promise.allSettled(
@@ -886,14 +890,18 @@ async function renderInjectionBlock(
886
890
  // empty). Render the full page — frontmatter + body — so retrieval
887
891
  // still surfaces the same content the agent saw before this change.
888
892
  const content = renderPageContent(page).trim();
889
- if (content.length === 0) continue;
893
+ if (content.length === 0) {
894
+ continue;
895
+ }
890
896
  sections.push(`# ${path}\n${content}`);
891
897
  }
892
898
 
893
899
  const skillLines: string[] = [];
894
900
  for (const slug of skillSlugs) {
895
901
  const entry = getSkillCapability(slug);
896
- if (!entry) continue;
902
+ if (!entry) {
903
+ continue;
904
+ }
897
905
  skillLines.push(`- ${entry.content} → use skill_load to activate`);
898
906
  }
899
907
  if (skillLines.length > 0) {
@@ -903,7 +911,9 @@ async function renderInjectionBlock(
903
911
  const cliCommandLines: string[] = [];
904
912
  for (const slug of cliCommandSlugs) {
905
913
  const entry = getCliCommandCapability(slug);
906
- if (!entry) continue;
914
+ if (!entry) {
915
+ continue;
916
+ }
907
917
  cliCommandLines.push(`- \`assistant ${entry.id}\`: ${entry.description}`);
908
918
  }
909
919
  if (cliCommandLines.length > 0) {
@@ -37,8 +37,8 @@ import {
37
37
  listPages,
38
38
  slugify,
39
39
  writePage,
40
- } from "../v3/substrate/page-store.js";
41
- import type { ConceptPage } from "../v3/substrate/types.js";
40
+ } from "../substrate/page-store.js";
41
+ import type { ConceptPage } from "../substrate/types.js";
42
42
 
43
43
  const log = getLogger("memory-v2-migration");
44
44
 
@@ -1,11 +1,11 @@
1
1
  /** Local cross-encoder rerank backend — drives the rerank-worker subprocess. */
2
2
  import { existsSync } from "node:fs";
3
3
 
4
- import type { RerankDtype } from "../../../config/schemas/memory-v2.js";
5
- import { EmbeddingRuntimeManager } from "../../../persistence/embeddings/embedding-runtime-manager.js";
6
- import { PromiseGuard, workerMemoryEnv } from "./host-utils.js";
7
- import { getLogger } from "./logging.js";
8
- import { getEmbeddingModelsDir } from "./paths.js";
4
+ import type { RerankDtype } from "../../../../config/schemas/memory-v2.js";
5
+ import { EmbeddingRuntimeManager } from "../../../../persistence/embeddings/embedding-runtime-manager.js";
6
+ import { PromiseGuard, workerMemoryEnv } from "../host-utils.js";
7
+ import { getLogger } from "../logging.js";
8
+ import { getEmbeddingModelsDir } from "../paths.js";
9
9
 
10
10
  const log = getLogger("memory-rerank-local");
11
11
 
@@ -52,7 +52,9 @@ export class LocalRerankBackend {
52
52
  if (this.disposeRequested) {
53
53
  throw new Error("Local rerank backend is shutting down");
54
54
  }
55
- if (passages.length === 0) return [];
55
+ if (passages.length === 0) {
56
+ return [];
57
+ }
56
58
  if (queries.length !== passages.length) {
57
59
  throw new Error(
58
60
  `Rerank backend got ${queries.length} queries for ${passages.length} passages`,
@@ -107,7 +109,9 @@ export class LocalRerankBackend {
107
109
  }
108
110
 
109
111
  private async ensureInitialized(): Promise<void> {
110
- if (this.workerProc) return;
112
+ if (this.workerProc) {
113
+ return;
114
+ }
111
115
  await this.initGuard.run(() => this.initialize());
112
116
  }
113
117
 
@@ -203,9 +207,13 @@ export class LocalRerankBackend {
203
207
  try {
204
208
  while (true) {
205
209
  const { done, value } = await reader.read();
206
- if (done) break;
210
+ if (done) {
211
+ break;
212
+ }
207
213
  const text = decoder.decode(value, { stream: true }).trim();
208
- if (text) log.debug({ workerStderr: text }, "Rerank worker stderr");
214
+ if (text) {
215
+ log.debug({ workerStderr: text }, "Rerank worker stderr");
216
+ }
209
217
  }
210
218
  } catch {
211
219
  /* expected on shutdown */
@@ -214,7 +222,9 @@ export class LocalRerankBackend {
214
222
  }
215
223
 
216
224
  private startStdoutReader(): void {
217
- if (this.stdoutReaderActive || !this.workerProc) return;
225
+ if (this.stdoutReaderActive || !this.workerProc) {
226
+ return;
227
+ }
218
228
  this.stdoutReaderActive = true;
219
229
 
220
230
  const proc = this.workerProc;
@@ -225,7 +235,9 @@ export class LocalRerankBackend {
225
235
  try {
226
236
  while (true) {
227
237
  const { done, value } = await reader.read();
228
- if (done) break;
238
+ if (done) {
239
+ break;
240
+ }
229
241
  this.stdoutBuffer += decoder.decode(value, { stream: true });
230
242
  this.processStdoutBuffer();
231
243
  }
@@ -253,7 +265,9 @@ export class LocalRerankBackend {
253
265
  while ((idx = this.stdoutBuffer.indexOf("\n")) !== -1) {
254
266
  const line = this.stdoutBuffer.slice(0, idx);
255
267
  this.stdoutBuffer = this.stdoutBuffer.slice(idx + 1);
256
- if (!line.trim()) continue;
268
+ if (!line.trim()) {
269
+ continue;
270
+ }
257
271
 
258
272
  let msg: WorkerResponse;
259
273
  try {
@@ -321,10 +335,18 @@ export class LocalRerankBackend {
321
335
  }
322
336
 
323
337
  private disposeIfIdle(): void {
324
- if (!this.disposeRequested) return;
325
- if (this.activeRequests > 0) return;
326
- if (this.pendingRequests.size > 0) return;
327
- if (this.readyResolve || this.readyReject) return;
338
+ if (!this.disposeRequested) {
339
+ return;
340
+ }
341
+ if (this.activeRequests > 0) {
342
+ return;
343
+ }
344
+ if (this.pendingRequests.size > 0) {
345
+ return;
346
+ }
347
+ if (this.readyResolve || this.readyReject) {
348
+ return;
349
+ }
328
350
 
329
351
  const proc = this.workerProc;
330
352
  this.workerProc = null;
@@ -332,7 +354,9 @@ export class LocalRerankBackend {
332
354
  this.stdoutBuffer = "";
333
355
  this.initGuard.reset();
334
356
 
335
- if (!proc) return;
357
+ if (!proc) {
358
+ return;
359
+ }
336
360
 
337
361
  try {
338
362
  proc.kill();
@@ -350,7 +374,9 @@ export function getOrCreateRerankBackend(
350
374
  model: string,
351
375
  dtype: RerankDtype,
352
376
  ): LocalRerankBackend {
353
- if (_backend?.model === model && _backend.dtype === dtype) return _backend;
377
+ if (_backend?.model === model && _backend.dtype === dtype) {
378
+ return _backend;
379
+ }
354
380
  if (_backend) {
355
381
  try {
356
382
  _backend.dispose();