@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
@@ -1,16 +1,19 @@
1
1
  /**
2
- * `default-memory` plugin injectors — the personal-memory per-turn injections.
2
+ * `default-memory` plugin injectors — the personal-memory per-turn injections,
3
+ * and the plugin's single injector entry point: {@link memoryInjectors} is the
4
+ * complete set `defaultMemoryPlugin` contributes, so the host registers memory
5
+ * injectors without reaching into a tier directory for one.
3
6
  *
4
7
  * Contributes the PKB `<knowledge_base>` block, the PKB `<system_reminder>`
5
- * (with hybrid-search hints), and the memory-v2 static `<info>` block. Each
6
- * reads its inputs directly off the {@link TurnContext} (and the workspace
7
- * memory/PKB files), runs its own gating (injection mode, the personal-memory
8
- * trust gate, the v2 cutover guard, null-input short-circuits), and returns an
8
+ * (with hybrid-search hints), the memory-v2 static `<info>` block, and the two
9
+ * memory-v3 injectors defined in `v3/injector.ts`. Each reads its inputs
10
+ * directly off the {@link TurnContext} (and the workspace memory/PKB files),
11
+ * runs its own gating (injection mode, the personal-memory trust gate, the
12
+ * memory-tier gate, null-input short-circuits), and returns an
9
13
  * {@link InjectionBlock} with the placement that yields the canonical
10
14
  * positional semantics.
11
15
  *
12
- * `defaultMemoryPlugin` contributes these (alongside the memory-v3 injectors in
13
- * `v3/injector.ts`) to the global injector registry
16
+ * `defaultMemoryPlugin` contributes the array to the global injector registry
14
17
  * (`plugins/injector-registry.ts`), which unions every plugin's injectors and
15
18
  * sorts by `order` into the single sequence `applyRuntimeInjections` walks each
16
19
  * turn. The shared ordering contract lives in {@link DEFAULT_INJECTOR_ORDER}.
@@ -20,7 +23,7 @@ import { resolve } from "node:path";
20
23
 
21
24
  import type { Message } from "@vellumai/plugin-api";
22
25
 
23
- import { usesConceptPageMemory } from "../../../config/memory-v3-gate.js";
26
+ import { isMemoryV1Active } from "../../../config/memory-v3-gate.js";
24
27
  import type { InjectionMatcher } from "../../../context/strip-injections.js";
25
28
  import { getInContextPkbPaths } from "../../../daemon/pkb-context-tracker.js";
26
29
  import { buildPkbReminder } from "../../../daemon/pkb-reminder-builder.js";
@@ -37,11 +40,16 @@ import { getMemoryConfig } from "./config.js";
37
40
  import { getLiveGraphMemory } from "./graph/conversation-graph-memory.js";
38
41
  import { getLogger } from "./logging.js";
39
42
  import { getSandboxWorkingDir } from "./paths.js";
40
- import { getPkbAutoInjectList } from "./pkb/autoinject.js";
41
- import { readPkbContext } from "./pkb/context.js";
42
- import { searchPkbFiles } from "./pkb/pkb-search.js";
43
- import { getPkbRoot } from "./pkb/types.js";
44
- import { readMemoryV2StaticContent } from "./v3/substrate/static-context.js";
43
+ // SUBSTRATE (v2+v3) feeds `memoryV2StaticInjector`.
44
+ import { readMemoryV2StaticContent } from "./substrate/static-context.js";
45
+ // V1 delete with v1. Feeds the PKB injector pair.
46
+ import { getPkbAutoInjectList } from "./v1/pkb/autoinject.js";
47
+ import { readPkbContext } from "./v1/pkb/context.js";
48
+ import { searchPkbFiles } from "./v1/pkb/pkb-search.js";
49
+ import { getPkbRoot } from "./v1/pkb/types.js";
50
+ // V3 — delete with v3. Re-exported through `memoryInjectors` below so the
51
+ // host registers them without importing `v3/` itself.
52
+ import { memoryV3Injector, memoryV3SpotlightInjector } from "./v3/injector.js";
45
53
 
46
54
  const pkbReminderLog = getLogger("pkb-reminder");
47
55
 
@@ -56,18 +64,18 @@ const PKB_HINT_THRESHOLD = 0.5;
56
64
  const PKB_HINT_ARCHIVE_THRESHOLD = 0.7;
57
65
 
58
66
  /**
59
- * Read-side cutover guard. Under concept-page memory both `pkb-context` and
60
- * `pkb-reminder` silence themselves entirely the `<knowledge_base>` content
61
- * and the generic recall/remember nudge are both supplanted by the static
62
- * memory block. They are also silenced when memory is disabled outright:
63
- * these injectors have no other `memory.enabled` gate, and a workspace with
64
- * leftover `pkb/*` files must not keep surfacing long-term memory after the
65
- * user turns memory off. NOW.md is workspace state independent of PKB and
66
- * fires unchanged.
67
+ * Read-side tier gate. The PKB injectors (`pkb-context`, `pkb-reminder`) are
68
+ * the v1 injection surface, active only when v1 is the live memory tier
69
+ * ({@link isMemoryV1Active}). Under concept-page memory both silence
70
+ * themselves entirely the `<knowledge_base>` content and the generic
71
+ * recall/remember nudge are both supplanted by the static memory block. They
72
+ * are also silenced when memory is disabled outright: these injectors have no
73
+ * other `memory.enabled` gate, and a workspace with leftover `pkb/*` files
74
+ * must not keep surfacing long-term memory after the user turns memory off.
75
+ * NOW.md is workspace state independent of PKB and fires unchanged.
67
76
  */
68
77
  function isPkbInjectionSilenced(): boolean {
69
- const memory = getMemoryConfig();
70
- return memory.enabled === false || usesConceptPageMemory(memory);
78
+ return !isMemoryV1Active({ memory: getMemoryConfig() });
71
79
  }
72
80
 
73
81
  /**
@@ -103,12 +111,19 @@ const pkbContextInjector: Injector = {
103
111
  runMessages?: Message[],
104
112
  ): Promise<InjectionBlock | null> {
105
113
  const mode = ctx.mode ?? "full";
106
- if (mode !== "full") return null;
107
- if (isPkbInjectionSilenced()) return null;
114
+ if (mode !== "full") {
115
+ return null;
116
+ }
117
+ if (isPkbInjectionSilenced()) {
118
+ return null;
119
+ }
108
120
  const content = readGatedPkbContext(ctx.trust);
109
- if (!content) return null;
110
- if (hasInjectedUserTextBlock(runMessages, KNOWLEDGE_BASE_BLOCK_PREFIXES))
121
+ if (!content) {
122
+ return null;
123
+ }
124
+ if (hasInjectedUserTextBlock(runMessages, KNOWLEDGE_BASE_BLOCK_PREFIXES)) {
111
125
  return null;
126
+ }
112
127
  return {
113
128
  id: "pkb-context",
114
129
  text: buildPkbContextBlock(content),
@@ -138,9 +153,15 @@ const pkbReminderInjector: Injector = {
138
153
  runMessages?: Message[],
139
154
  ): Promise<InjectionBlock | null> {
140
155
  const mode = ctx.mode ?? "full";
141
- if (mode !== "full") return null;
142
- if (!isPkbActive(ctx.trust)) return null;
143
- if (isPkbInjectionSilenced()) return null;
156
+ if (mode !== "full") {
157
+ return null;
158
+ }
159
+ if (!isPkbActive(ctx.trust)) {
160
+ return null;
161
+ }
162
+ if (isPkbInjectionSilenced()) {
163
+ return null;
164
+ }
144
165
  const reminder = await buildPkbReminderWithHints(ctx, runMessages);
145
166
  return {
146
167
  id: "pkb-reminder",
@@ -277,7 +298,9 @@ async function buildPkbReminderWithHints(
277
298
  hints = results
278
299
  .filter((r) => {
279
300
  const abs = resolve(pkbRoot, r.path);
280
- if (inContext.has(abs)) return false;
301
+ if (inContext.has(abs)) {
302
+ return false;
303
+ }
281
304
  const threshold = r.path.replace(/\\/g, "/").startsWith("archive/")
282
305
  ? PKB_HINT_ARCHIVE_THRESHOLD
283
306
  : PKB_HINT_THRESHOLD;
@@ -286,8 +309,12 @@ async function buildPkbReminderWithHints(
286
309
  .sort((a, b) => {
287
310
  const aHasHybrid = a.hybridScore !== undefined;
288
311
  const bHasHybrid = b.hybridScore !== undefined;
289
- if (aHasHybrid && !bHasHybrid) return -1;
290
- if (!aHasHybrid && bHasHybrid) return 1;
312
+ if (aHasHybrid && !bHasHybrid) {
313
+ return -1;
314
+ }
315
+ if (!aHasHybrid && bHasHybrid) {
316
+ return 1;
317
+ }
291
318
  if (aHasHybrid && bHasHybrid) {
292
319
  return b.hybridScore! - a.hybridScore!;
293
320
  }
@@ -344,16 +371,23 @@ const memoryV2StaticInjector: Injector = {
344
371
  runMessages?: Message[],
345
372
  ): Promise<InjectionBlock | null> {
346
373
  const mode = ctx.mode ?? "full";
347
- if (mode !== "full") return null;
374
+ if (mode !== "full") {
375
+ return null;
376
+ }
348
377
  // The consolidation agent reads and rewrites memory/buffer.md through
349
378
  // file tools; injecting the buffer section here would duplicate the
350
379
  // entire backlog into its context (and go stale as it edits the file).
351
380
  const content = readGatedMemoryV2Static(ctx.trust, {
352
381
  excludeBuffer: ctx.callSite === "memoryV2Consolidation",
353
382
  });
354
- if (!content) return null;
355
- if (hasInjectedUserTextBlock(runMessages, MEMORY_V2_STATIC_BLOCK_MATCHERS))
383
+ if (!content) {
356
384
  return null;
385
+ }
386
+ if (
387
+ hasInjectedUserTextBlock(runMessages, MEMORY_V2_STATIC_BLOCK_MATCHERS)
388
+ ) {
389
+ return null;
390
+ }
357
391
  return {
358
392
  id: "memory-v2-static",
359
393
  text: buildMemoryV2StaticBlock(content),
@@ -377,14 +411,25 @@ function buildMemoryV2StaticBlock(content: string): string {
377
411
  }
378
412
 
379
413
  /**
380
- * The `default-memory` plugin's personal-memory injectors, in ascending
381
- * `order`. `defaultMemoryPlugin` contributes these alongside the memory-v3
382
- * injectors; the registry sorts the union by `order` (see
383
- * {@link DEFAULT_INJECTOR_ORDER}), so this array's literal order is only a
384
- * readability convenience.
414
+ * Every injector the `default-memory` plugin contributes, in ascending
415
+ * `order`. This is the plugin's whole injector surface — `defaultMemoryPlugin`
416
+ * passes the array straight through, and the registry sorts the cross-plugin
417
+ * union by `order` (see {@link DEFAULT_INJECTOR_ORDER}), so this array's
418
+ * literal order is only a readability convenience.
385
419
  */
386
420
  export const memoryInjectors: Injector[] = [
421
+ // V1 — delete with v1. The PKB pair is the legacy engine's entire injection
422
+ // surface; both self-silence through `isPkbInjectionSilenced` whenever v1 is
423
+ // not the live tier.
387
424
  pkbContextInjector,
388
425
  pkbReminderInjector,
426
+ // SUBSTRATE (v2+v3). Emits the static `<info>` block read off the concept
427
+ // pages, so it serves the v2 injection engine and v3 alike. Its block id
428
+ // `memory-v2-static` is FROZEN: `daemon/conversation-runtime-assembly.ts`
429
+ // switches on it to capture the block into persisted message metadata.
389
430
  memoryV2StaticInjector,
431
+ // V3 — delete with v3. The frozen net-new card block and its ephemeral
432
+ // spotlight companion; both self-gate on `memory.v3.live`.
433
+ memoryV3Injector,
434
+ memoryV3SpotlightInjector,
390
435
  ];
@@ -10,55 +10,97 @@
10
10
  * Each handler is wrapped in an arrow that reads the imported binding at
11
11
  * dispatch time rather than capturing it eagerly, so a per-test `mock.module` of
12
12
  * the underlying handler is honored.
13
+ *
14
+ * The table is grouped into labeled per-tier sections (V1 / SUBSTRATE / V2
15
+ * ENGINE / V3 / RETROSPECTIVE) so retiring a tier is deleting its section and
16
+ * its import group. Registration keys off `type` alone, so the literal order
17
+ * is a readability convenience.
13
18
  */
14
19
 
15
- import { usesConceptPageMemory } from "../../../config/memory-v3-gate.js";
20
+ import { isMemoryV1Active } from "../../../config/memory-v3-gate.js";
16
21
  import type { AssistantConfig } from "../../../config/types.js";
17
22
  import type { MemoryJob } from "../../../persistence/jobs-store.js";
18
23
  import type { JobHandlerEntry } from "../../types.js";
19
- import { pkbCompactionJob, pkbFilingJob } from "./filing-jobs.js";
20
- import { bootstrapFromHistory } from "./graph/bootstrap.js";
21
- import { runConsolidation } from "./graph/consolidation.js";
22
- import { runDecayTick } from "./graph/decay.js";
23
- import { graphExtractJob } from "./graph/extraction-job.js";
24
+ // The all-tier graph store: `embedGraphNodeJob` serves the V1 section,
25
+ // `embedGraphTriggerJob` the SUBSTRATE one.
24
26
  import {
25
27
  embedGraphNodeJob,
26
28
  embedGraphTriggerJob,
27
29
  } from "./graph/graph-search.js";
28
- import { runNarrativeRefinement } from "./graph/narrative.js";
29
- import { runPatternScan } from "./graph/pattern-scan.js";
30
- import { backfillJob } from "./job-handlers/backfill.js";
30
+ // SUBSTRATE (v2+v3).
31
+ import { embedConceptPageJob } from "./jobs/embed-concept-page.js";
32
+ import { getLogger } from "./logging.js";
33
+ // RETROSPECTIVE (all tiers).
34
+ import { memoryRetrospectiveJob } from "./memory-retrospective-job.js";
35
+ import { skillCardInsertJob } from "./memory-retrospective-skill-card.js";
36
+ import { memoryRetrospectiveSweepJob } from "./memory-retrospective-sweep.js";
37
+ // SUBSTRATE (v2+v3).
38
+ import { memoryV2ConsolidateJob } from "./substrate/consolidation-job.js";
39
+ import { memoryV2ReembedJob } from "./substrate/reembed-job.js";
40
+ import { memoryV2SweepJob } from "./substrate/sweep-job.js";
41
+ // V1 — delete with v1.
42
+ import { pkbCompactionJob, pkbFilingJob } from "./v1/filing-jobs.js";
43
+ import { bootstrapFromHistory } from "./v1/graph/bootstrap.js";
44
+ import { runConsolidation } from "./v1/graph/consolidation.js";
45
+ import { runDecayTick } from "./v1/graph/decay.js";
46
+ import { graphExtractJob } from "./v1/graph/extraction-job.js";
47
+ import { runNarrativeRefinement } from "./v1/graph/narrative.js";
48
+ import { runPatternScan } from "./v1/graph/pattern-scan.js";
49
+ import { backfillJob } from "./v1/job-handlers/backfill.js";
31
50
  import {
32
51
  embedAttachmentJob,
33
52
  embedMediaJob,
34
53
  embedSegmentJob,
35
54
  embedSummaryJob,
36
- } from "./job-handlers/embedding.js";
55
+ } from "./v1/job-handlers/embedding.js";
37
56
  import {
38
57
  deleteQdrantVectorsJob,
39
58
  rebuildIndexJob,
40
59
  sweepOrphanedGraphNodePointsJob,
41
- } from "./job-handlers/index-maintenance.js";
42
- import { embedConceptPageJob } from "./jobs/embed-concept-page.js";
43
- import { embedPkbFileJob } from "./jobs/embed-pkb-file.js";
44
- import { getLogger } from "./logging.js";
45
- import { memoryRetrospectiveJob } from "./memory-retrospective-job.js";
46
- import { skillCardInsertJob } from "./memory-retrospective-skill-card.js";
47
- import { memoryRetrospectiveSweepJob } from "./memory-retrospective-sweep.js";
60
+ } from "./v1/job-handlers/index-maintenance.js";
61
+ import { embedPkbFileJob } from "./v1/jobs/embed-pkb-file.js";
62
+ // V2 ENGINE delete with v2.
48
63
  import {
49
64
  memoryV2ActivationRecomputeJob,
50
65
  memoryV2MigrateJob,
51
- memoryV2ReembedJob,
52
66
  } from "./v2/backfill-jobs.js";
67
+ // V3.
53
68
  import { maintainJob as memoryV3MaintainJob } from "./v3/maintain-job.js";
54
- import { memoryV2ConsolidateJob } from "./v3/substrate/consolidation-job.js";
55
- import { memoryV2SweepJob } from "./v3/substrate/sweep-job.js";
56
69
 
57
70
  const log = getLogger("memory-job-handlers");
58
71
 
59
72
  // ── Graph lifecycle job handlers ──────────────────────────────────
60
73
 
61
- function graphDecayJob(job: MemoryJob): void {
74
+ /**
75
+ * Tier gate shared by the v1 graph handlers below (the lifecycle jobs and
76
+ * `graph_extract`). These jobs mutate — and some LLM-process into — the legacy
77
+ * v1 graph, which only the v1 tier reads, so a stale or hand-enqueued row
78
+ * claimed while v1 is not the active memory tier must complete as a logged
79
+ * no-op instead of doing that work. Returns true when the row should be
80
+ * skipped.
81
+ *
82
+ * The condition is `isMemoryV1Active` and nothing else — the same predicate
83
+ * `processJob` applies to `V1_QDRANT_JOB_TYPES` in `jobs-worker.ts`, so every
84
+ * v1 job type answers to one definition of "v1 is the live tier". That
85
+ * predicate's docstring carries the memory-off semantics the two share: memory
86
+ * being off is not v1, so v1 work is skipped there exactly as it is under the
87
+ * concept-page substrate.
88
+ */
89
+ function isStaleV1GraphJob(job: MemoryJob, config: AssistantConfig): boolean {
90
+ if (isMemoryV1Active(config)) {
91
+ return false;
92
+ }
93
+ log.info(
94
+ { jobId: job.id, type: job.type },
95
+ "Skipping v1 graph job — the legacy graph is not the active memory tier",
96
+ );
97
+ return true;
98
+ }
99
+
100
+ function graphDecayJob(job: MemoryJob, config: AssistantConfig): void {
101
+ if (isStaleV1GraphJob(job, config)) {
102
+ return;
103
+ }
62
104
  const result = runDecayTick();
63
105
  log.info({ jobId: job.id, ...result }, "Graph decay tick complete");
64
106
  }
@@ -67,6 +109,9 @@ async function graphConsolidateJob(
67
109
  job: MemoryJob,
68
110
  config: AssistantConfig,
69
111
  ): Promise<void> {
112
+ if (isStaleV1GraphJob(job, config)) {
113
+ return;
114
+ }
70
115
  const result = await runConsolidation(config);
71
116
  log.info(
72
117
  {
@@ -83,6 +128,9 @@ async function graphPatternScanJob(
83
128
  job: MemoryJob,
84
129
  config: AssistantConfig,
85
130
  ): Promise<void> {
131
+ if (isStaleV1GraphJob(job, config)) {
132
+ return;
133
+ }
86
134
  const result = await runPatternScan(config);
87
135
  log.info(
88
136
  {
@@ -98,6 +146,9 @@ async function graphNarrativeRefineJob(
98
146
  job: MemoryJob,
99
147
  config: AssistantConfig,
100
148
  ): Promise<void> {
149
+ if (isStaleV1GraphJob(job, config)) {
150
+ return;
151
+ }
101
152
  const result = await runNarrativeRefinement(config);
102
153
  log.info(
103
154
  {
@@ -109,11 +160,27 @@ async function graphNarrativeRefineJob(
109
160
  );
110
161
  }
111
162
 
163
+ async function graphBootstrapJob(
164
+ job: MemoryJob,
165
+ config: AssistantConfig,
166
+ ): Promise<void> {
167
+ if (isStaleV1GraphJob(job, config)) {
168
+ return;
169
+ }
170
+ await bootstrapFromHistory();
171
+ }
172
+
112
173
  /**
113
174
  * The memory feature's per-job-type handlers, registered directly into the
114
175
  * worker dispatch table by the memory plugin's `init` hook.
115
176
  */
116
177
  export const memoryJobHandlers: readonly JobHandlerEntry[] = [
178
+ // V1 — delete with v1.
179
+ // Segment/summary/media embedding, the Qdrant index-maintenance jobs, the
180
+ // graph lifecycle, and PKB filing. Their stale-row guards live at dispatch
181
+ // (`V1_QDRANT_JOB_TYPES` in `jobs-worker.ts`), in `isStaleV1GraphJob` above,
182
+ // and at the `jobs-worker.ts` scheduling sites — all three on the one
183
+ // `isMemoryV1Active` condition.
117
184
  {
118
185
  type: "embed_segment",
119
186
  handler: (job) => embedSegmentJob(job),
@@ -145,22 +212,18 @@ export const memoryJobHandlers: readonly JobHandlerEntry[] = [
145
212
  type: "embed_pkb_file",
146
213
  handler: (job, config) => embedPkbFileJob(job, config),
147
214
  },
148
- {
149
- type: "graph_trigger_embed",
150
- handler: (job, config) => embedGraphTriggerJob(job, config),
151
- },
152
215
  {
153
216
  type: "graph_extract",
154
217
  handler: async (job, config) => {
155
218
  // Stale rows enqueued by any unguarded v1 path must not consume
156
- // embedding/extraction budget while concept-page memory is active.
157
- if (usesConceptPageMemory(config.memory)) {
219
+ // embedding/extraction budget while v1 is not the live tier.
220
+ if (isStaleV1GraphJob(job, config)) {
158
221
  return;
159
222
  }
160
223
  await graphExtractJob(job, config);
161
224
  },
162
225
  },
163
- { type: "graph_decay", handler: (job) => graphDecayJob(job) },
226
+ { type: "graph_decay", handler: (job, config) => graphDecayJob(job, config) },
164
227
  {
165
228
  type: "graph_consolidate",
166
229
  handler: (job, config) => graphConsolidateJob(job, config),
@@ -173,7 +236,29 @@ export const memoryJobHandlers: readonly JobHandlerEntry[] = [
173
236
  type: "graph_narrative_refine",
174
237
  handler: (job, config) => graphNarrativeRefineJob(job, config),
175
238
  },
176
- { type: "graph_bootstrap", handler: () => bootstrapFromHistory() },
239
+ {
240
+ type: "graph_bootstrap",
241
+ handler: (job, config) => graphBootstrapJob(job, config),
242
+ },
243
+ {
244
+ type: "pkb_filing",
245
+ handler: (job) => pkbFilingJob(job),
246
+ },
247
+ {
248
+ type: "pkb_compaction",
249
+ handler: () => pkbCompactionJob(),
250
+ },
251
+
252
+ // SUBSTRATE (v2+v3).
253
+ // Concept-page embedding, the buffer sweep and consolidator, and the
254
+ // corpus reembed — shared by the v2 injection engine and v3, so they
255
+ // outlive v1 and v2 alike. `graph_trigger_embed` deliberately lives here
256
+ // rather than with the v1 graph jobs: it embeds trigger text the substrate
257
+ // reads (locked by `__tests__/jobs-worker-v2-graph-trigger-embed.test.ts`).
258
+ {
259
+ type: "graph_trigger_embed",
260
+ handler: (job, config) => embedGraphTriggerJob(job, config),
261
+ },
177
262
  {
178
263
  type: "embed_concept_page",
179
264
  handler: (job, config) => embedConceptPageJob(job, config),
@@ -187,29 +272,35 @@ export const memoryJobHandlers: readonly JobHandlerEntry[] = [
187
272
  handler: (job, config) => memoryV2ConsolidateJob(job, config),
188
273
  },
189
274
  {
190
- type: "pkb_filing",
191
- handler: (job) => pkbFilingJob(job),
192
- },
193
- {
194
- type: "pkb_compaction",
195
- handler: () => pkbCompactionJob(),
275
+ type: "memory_v2_reembed",
276
+ handler: (job, config) => memoryV2ReembedJob(job, config),
196
277
  },
278
+
279
+ // V2 ENGINE — delete with v2.
280
+ // Operator-triggered backfills owned by the activation/router engine: the
281
+ // one-shot v1→v2 synthesis and the persisted-activation recompute. The job
282
+ // types share the `memory_v2_` prefix with the substrate entries above, but
283
+ // the work is engine-local.
197
284
  {
198
285
  type: "memory_v2_migrate",
199
286
  handler: (job, config) => memoryV2MigrateJob(job, config),
200
287
  },
201
- {
202
- type: "memory_v2_reembed",
203
- handler: (job, config) => memoryV2ReembedJob(job, config),
204
- },
205
288
  {
206
289
  type: "memory_v2_activation_recompute",
207
290
  handler: (job, config) => memoryV2ActivationRecomputeJob(job, config),
208
291
  },
292
+
293
+ // V3.
294
+ // Topic-tree self-maintenance; the handler no-ops when v3 is not live.
209
295
  {
210
296
  type: "memory_v3_maintain",
211
297
  handler: (job, config) => memoryV3MaintainJob(job, config),
212
298
  },
299
+
300
+ // RETROSPECTIVE (all tiers).
301
+ // The retrospective pass and its cross-conversation sweep are tier-agnostic
302
+ // and survive every tier deletion. `skill_card_insert` is emitted only on
303
+ // v3 but is owned by the retrospective, so it groups here.
213
304
  {
214
305
  type: "memory_retrospective",
215
306
  handler: (job, config) => memoryRetrospectiveJob(job, config),
@@ -91,7 +91,7 @@ const upsertCalls: Array<{
91
91
 
92
92
  const deleteCalls: string[] = [];
93
93
 
94
- mock.module("../../v3/substrate/qdrant.js", () => ({
94
+ mock.module("../../substrate/qdrant.js", () => ({
95
95
  upsertConceptPageEmbedding: async (params: {
96
96
  slug: string;
97
97
  dense: number[];
@@ -151,7 +151,7 @@ type MemoryJobMod = typeof import("../../../../../persistence/jobs-store.js");
151
151
  type MemoryJob = ReturnType<MemoryJobMod["claimMemoryJobs"]>[number];
152
152
  const { embedConceptPageJob, enqueueEmbedConceptPageJob } =
153
153
  await import("../embed-concept-page.js");
154
- const { writePage } = await import("../../v3/substrate/page-store.js");
154
+ const { writePage } = await import("../../substrate/page-store.js");
155
155
  const { _resetQdrantBreaker, isQdrantBreakerOpen, withQdrantBreaker } =
156
156
  await import("../../../../../persistence/embeddings/qdrant-circuit-breaker.js");
157
157
 
@@ -43,15 +43,16 @@ import { embedWithBackend } from "../embeddings.js";
43
43
  import { BackendUnavailableError } from "../host-utils.js";
44
44
  import { getLogger } from "../logging.js";
45
45
  import { getWorkspaceDir } from "../paths.js";
46
- import { readPage } from "../v3/substrate/page-store.js";
46
+ import { readPage } from "../substrate/page-store.js";
47
47
  import {
48
48
  deleteConceptPageEmbedding,
49
49
  upsertConceptPageEmbedding,
50
- } from "../v3/substrate/qdrant.js";
50
+ } from "../substrate/qdrant.js";
51
51
  import {
52
52
  generateBm25DocEmbedding,
53
53
  getConceptPageCorpusStats,
54
- } from "../v3/substrate/sparse-bm25.js";
54
+ } from "../substrate/sparse-bm25.js";
55
+ import { resolveSubstrateTuning } from "../substrate/tuning.js";
55
56
 
56
57
  const log = getLogger("memory-v2-embed-concept-page");
57
58
 
@@ -81,7 +82,9 @@ export async function embedConceptPageJob(
81
82
  config: AssistantConfig,
82
83
  ): Promise<void> {
83
84
  const slug = asString(job.payload.slug);
84
- if (!slug) return;
85
+ if (!slug) {
86
+ return;
87
+ }
85
88
 
86
89
  const workspaceDir = getWorkspaceDir();
87
90
  const page = await readPage(workspaceDir, slug);
@@ -214,7 +217,9 @@ export async function embedConceptPageJob(
214
217
  writeModel = embedded.model;
215
218
  for (let i = 0; i < appliedSlots.length; i++) {
216
219
  const vector = embedded.vectors[i];
217
- if (!vector) continue;
220
+ if (!vector) {
221
+ continue;
222
+ }
218
223
  if (appliedSlots[i] === "body") {
219
224
  bodyDense = vector;
220
225
  bodyFresh = true;
@@ -227,7 +232,9 @@ export async function embedConceptPageJob(
227
232
  // Body embedding is the ground truth — without it the page can't surface.
228
233
  // (Cache hit paths populate `bodyDense` above; a fresh embed that returned
229
234
  // no vectors short-circuits here too.)
230
- if (!bodyDense) return;
235
+ if (!bodyDense) {
236
+ return;
237
+ }
231
238
 
232
239
  // Sparse is cheap (in-process tokenization) and changes any time the body
233
240
  // changes, so we always recompute it rather than caching alongside dense.
@@ -236,11 +243,12 @@ export async function embedConceptPageJob(
236
243
  // corpus for the first time), fall back to the legacy TF-only encoding —
237
244
  // the next reembed pass overwrites the page once stats are available.
238
245
  const corpusStats = getConceptPageCorpusStats();
246
+ const { bm25_k1, bm25_b } = resolveSubstrateTuning(config.memory);
239
247
  const encodeSparse = (input: string) =>
240
248
  corpusStats
241
249
  ? generateBm25DocEmbedding(input, corpusStats, {
242
- k1: config.memory.v2.bm25_k1,
243
- b: config.memory.v2.bm25_b,
250
+ k1: bm25_k1,
251
+ b: bm25_b,
244
252
  })
245
253
  : generateSparseEmbedding(input);
246
254
  const sparse = encodeSparse(text);
@@ -344,10 +352,14 @@ function readEmbeddingCache(
344
352
  ),
345
353
  )
346
354
  .get();
347
- if (!row || row.dimensions !== expectedDim) return null;
355
+ if (!row || row.dimensions !== expectedDim) {
356
+ return null;
357
+ }
348
358
  // A row without a contentHash is a legacy/corrupt entry — treat as a miss
349
359
  // and force a re-embed rather than misalign the cache key.
350
- if (row.contentHash === null) return null;
360
+ if (row.contentHash === null) {
361
+ return null;
362
+ }
351
363
  const dense = row.vectorBlob
352
364
  ? blobToVector(row.vectorBlob as Buffer)
353
365
  : (JSON.parse(row.vectorJson!) as number[]);