@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
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Unit tests for the webhooks_register route handler's callback-URL
3
+ * resolution order (LUM-2863).
4
+ */
5
+
6
+ import { beforeEach, describe, expect, mock, test } from "bun:test";
7
+
8
+ import { InternalError, UnprocessableEntityError } from "../errors.js";
9
+
10
+ let isPlatform = false;
11
+ let config: Record<string, unknown> = {};
12
+ let platformContextEnabled = false;
13
+ let registerCallbackRouteError: Error | undefined;
14
+
15
+ const registerCallbackRouteMock = mock(
16
+ async (callbackPath: string, _type: string, _source?: string) => {
17
+ if (registerCallbackRouteError) {
18
+ throw registerCallbackRouteError;
19
+ }
20
+ return `https://gateway.vellum.ai/assistant-123/${callbackPath}`;
21
+ },
22
+ );
23
+
24
+ // Spread the real modules: these are broad barrels and replacing them wholesale
25
+ // breaks unrelated importers pulled in by the module under test.
26
+ const actualEnvRegistry = await import("../../../config/env-registry.js");
27
+ mock.module("../../../config/env-registry.js", () => ({
28
+ ...actualEnvRegistry,
29
+ getIsPlatform: () => isPlatform,
30
+ }));
31
+
32
+ const actualLoader = await import("../../../config/loader.js");
33
+ mock.module("../../../config/loader.js", () => ({
34
+ ...actualLoader,
35
+ getConfig: () => config,
36
+ }));
37
+
38
+ mock.module("../../../inbound/platform-callback-registration.js", () => ({
39
+ registerCallbackRoute: registerCallbackRouteMock,
40
+ resolvePlatformCallbackRegistrationContext: async () => ({
41
+ isPlatform,
42
+ platformBaseUrl: "https://api.vellum.ai",
43
+ assistantId: platformContextEnabled ? "assistant-123" : "",
44
+ hasAssistantApiKey: platformContextEnabled,
45
+ authHeader: platformContextEnabled ? "Api-Key secret" : null,
46
+ enabled: platformContextEnabled,
47
+ }),
48
+ }));
49
+
50
+ const { ROUTES } = await import("../webhook-routes.js");
51
+
52
+ const registerRoute = ROUTES.find(
53
+ (r) => r.operationId === "webhooks_register",
54
+ )!;
55
+
56
+ const register = (body: Record<string, unknown>) =>
57
+ registerRoute.handler({ body });
58
+
59
+ describe("webhooks_register callback URL resolution", () => {
60
+ beforeEach(() => {
61
+ isPlatform = false;
62
+ config = {};
63
+ platformContextEnabled = false;
64
+ registerCallbackRouteError = undefined;
65
+ registerCallbackRouteMock.mockClear();
66
+ });
67
+
68
+ test("platform pods register with the platform gateway", async () => {
69
+ isPlatform = true;
70
+ platformContextEnabled = true;
71
+
72
+ expect(await register({ type: "telegram" })).toEqual({
73
+ callbackUrl: "https://gateway.vellum.ai/assistant-123/webhooks/telegram",
74
+ type: "telegram",
75
+ path: "webhooks/telegram",
76
+ mode: "platform",
77
+ });
78
+ });
79
+
80
+ // The bug: a local assistant that IS connected to the platform used to fall
81
+ // through to the self-hosted branch and 422 when it had no public ingress.
82
+ test("platform-connected local assistant with no ingress gets the platform callback URL", async () => {
83
+ platformContextEnabled = true;
84
+
85
+ expect(await register({ type: "telegram" })).toEqual({
86
+ callbackUrl: "https://gateway.vellum.ai/assistant-123/webhooks/telegram",
87
+ type: "telegram",
88
+ path: "webhooks/telegram",
89
+ mode: "platform",
90
+ });
91
+ expect(registerCallbackRouteMock).toHaveBeenCalledWith(
92
+ "webhooks/telegram",
93
+ "telegram",
94
+ undefined,
95
+ );
96
+ });
97
+
98
+ test("disconnected local assistant uses the configured publicBaseUrl", async () => {
99
+ config = { ingress: { publicBaseUrl: "https://abc.ngrok.io" } };
100
+
101
+ expect(await register({ type: "telegram" })).toEqual({
102
+ callbackUrl: "https://abc.ngrok.io/webhooks/telegram",
103
+ type: "telegram",
104
+ path: "webhooks/telegram",
105
+ mode: "self-hosted",
106
+ });
107
+ expect(registerCallbackRouteMock).not.toHaveBeenCalled();
108
+ });
109
+
110
+ test("disconnected local assistant with no ingress is still unprocessable", async () => {
111
+ await expect(register({ type: "telegram" })).rejects.toBeInstanceOf(
112
+ UnprocessableEntityError,
113
+ );
114
+ });
115
+
116
+ // A logged-in local assistant holds platform credentials for the LLM proxy,
117
+ // so credential presence must not override an explicitly configured tunnel.
118
+ test("a configured publicBaseUrl wins over platform connectivity", async () => {
119
+ platformContextEnabled = true;
120
+ config = { ingress: { publicBaseUrl: "https://abc.ngrok.io" } };
121
+
122
+ expect(await register({ type: "telegram" })).toMatchObject({
123
+ callbackUrl: "https://abc.ngrok.io/webhooks/telegram",
124
+ mode: "self-hosted",
125
+ });
126
+ expect(registerCallbackRouteMock).not.toHaveBeenCalled();
127
+ });
128
+
129
+ // The gateway publishes the Velay tunnel URL into ingress.publicBaseUrl, so
130
+ // a tunneled platform-connected assistant already resolves to a stable
131
+ // platform-owned URL through the ingress tier.
132
+ test("a Velay-managed publicBaseUrl resolves through the ingress tier", async () => {
133
+ platformContextEnabled = true;
134
+ config = {
135
+ ingress: {
136
+ publicBaseUrl: "https://velay.vellum.ai/assistant-123",
137
+ publicBaseUrlManagedBy: "velay",
138
+ },
139
+ };
140
+
141
+ expect(await register({ type: "twilio_voice" })).toEqual({
142
+ callbackUrl:
143
+ "https://velay.vellum.ai/assistant-123/webhooks/twilio/voice",
144
+ type: "twilio_voice",
145
+ path: "webhooks/twilio/voice",
146
+ mode: "self-hosted",
147
+ });
148
+ });
149
+
150
+ test("explicitly disabled ingress is not routed around via the platform", async () => {
151
+ platformContextEnabled = true;
152
+ config = { ingress: { enabled: false } };
153
+
154
+ await expect(register({ type: "telegram" })).rejects.toBeInstanceOf(
155
+ UnprocessableEntityError,
156
+ );
157
+ expect(registerCallbackRouteMock).not.toHaveBeenCalled();
158
+ });
159
+
160
+ test("the source identifier is forwarded to the platform registration", async () => {
161
+ platformContextEnabled = true;
162
+
163
+ await register({ type: "telegram", source: "@my_bot" });
164
+
165
+ expect(registerCallbackRouteMock).toHaveBeenCalledWith(
166
+ "webhooks/telegram",
167
+ "telegram",
168
+ "@my_bot",
169
+ );
170
+ });
171
+
172
+ test("a failed platform registration surfaces as a 500", async () => {
173
+ platformContextEnabled = true;
174
+ registerCallbackRouteError = new Error(
175
+ "Platform callback route registration failed (HTTP 502)",
176
+ );
177
+
178
+ await expect(register({ type: "telegram" })).rejects.toBeInstanceOf(
179
+ InternalError,
180
+ );
181
+ });
182
+
183
+ test("a missing platform registration context surfaces as a 422", async () => {
184
+ platformContextEnabled = true;
185
+ registerCallbackRouteError = new Error(
186
+ "Platform callbacks not available — missing platform registration context",
187
+ );
188
+
189
+ await expect(register({ type: "telegram" })).rejects.toBeInstanceOf(
190
+ UnprocessableEntityError,
191
+ );
192
+ });
193
+
194
+ test("a path override replaces the derived webhook path", async () => {
195
+ platformContextEnabled = true;
196
+
197
+ expect(
198
+ await register({ type: "custom", path: "webhooks/my-provider" }),
199
+ ).toMatchObject({ path: "webhooks/my-provider" });
200
+ });
201
+ });
@@ -18,8 +18,8 @@ import {
18
18
  AcpSessionNotFoundError,
19
19
  } from "../../acp/session-manager.js";
20
20
  import type { AcpSessionState } from "../../acp/types.js";
21
+ import type { AssistantEvent } from "../../api/index.js";
21
22
  import { getConfig } from "../../config/loader.js";
22
- import type { ServerMessage } from "../../daemon/message-protocol.js";
23
23
  import { createGuardianRequestForConfirmation } from "../../permissions/confirmation-guardian-request.js";
24
24
  import type { UserDecision } from "../../permissions/types.js";
25
25
  import { getDb } from "../../persistence/db-connection.js";
@@ -159,7 +159,7 @@ function awaitRouteApproval(args: {
159
159
  settle(decision, decision === "allow" ? "approved" : "rejected"),
160
160
  });
161
161
 
162
- const confirmationMsg: ServerMessage & {
162
+ const confirmationMsg: AssistantEvent & {
163
163
  type: "confirmation_request";
164
164
  } = {
165
165
  type: "confirmation_request",
@@ -20,33 +20,21 @@ import {
20
20
  } from "../../persistence/bookmark-crud.js";
21
21
  import { getMessageById } from "../../persistence/conversation-crud.js";
22
22
  import { getDb } from "../../persistence/db-connection.js";
23
- import { getLogger } from "../../util/logger.js";
24
- import { buildAssistantEvent } from "../assistant-event.js";
25
- import { assistantEventHub } from "../assistant-event-hub.js";
23
+ import { broadcastMessage } from "../assistant-event-hub.js";
26
24
  import { ACTOR_PRINCIPALS } from "../auth/route-policy.js";
27
25
  import { BadRequestError, NotFoundError } from "./errors.js";
28
26
  import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
29
27
 
30
- const log = getLogger("bookmark-routes");
31
-
32
28
  // ---------------------------------------------------------------------------
33
29
  // Helpers
34
30
  // ---------------------------------------------------------------------------
35
31
 
36
32
  function publishBookmarkCreated(bookmark: BookmarkSummary): void {
37
- assistantEventHub
38
- .publish(buildAssistantEvent({ type: "bookmark.created", bookmark }))
39
- .catch((err) => {
40
- log.warn({ err }, "Failed to publish bookmark.created");
41
- });
33
+ broadcastMessage({ type: "bookmark.created", bookmark });
42
34
  }
43
35
 
44
36
  function publishBookmarkDeleted(payload: { messageId: string }): void {
45
- assistantEventHub
46
- .publish(buildAssistantEvent({ type: "bookmark.deleted", ...payload }))
47
- .catch((err) => {
48
- log.warn({ err }, "Failed to publish bookmark.deleted");
49
- });
37
+ broadcastMessage({ type: "bookmark.deleted", ...payload });
50
38
  }
51
39
 
52
40
  // ---------------------------------------------------------------------------
@@ -1,5 +1,5 @@
1
1
  import { createAssistantMessage } from "../../agent/message-types.js";
2
- import type { ServerMessage } from "../../daemon/message-protocol.js";
2
+ import type { AssistantEvent } from "../../api/index.js";
3
3
  import {
4
4
  addMessage,
5
5
  recordConversationPersistedSeq,
@@ -28,7 +28,7 @@ import { publishConversationMessagesChanged } from "../sync/resource-sync-events
28
28
  // `state.assistantTurnId` directly, grep for `emitCannedMessageComplete` to
29
29
  // find every call site and inline-then-delete.
30
30
  export function emitCannedMessageComplete(
31
- send: (msg: ServerMessage) => void,
31
+ send: (msg: AssistantEvent) => void,
32
32
  conversationId: string,
33
33
  persistedAssistantId: string,
34
34
  ): void {
@@ -29,7 +29,8 @@ import {
29
29
  } from "../../persistence/jobs-store.js";
30
30
  import { getUsageCostForConversationWindow } from "../../persistence/llm-usage-store.js";
31
31
  import { GRAPH_MAINTENANCE_CHECKPOINTS } from "../../plugins/defaults/memory/jobs-worker.js";
32
- import { MEMORY_V2_CONSOLIDATION_SOURCE } from "../../plugins/defaults/memory/v3/substrate/constants.js";
32
+ import { MEMORY_V2_CONSOLIDATION_SOURCE } from "../../plugins/defaults/memory/substrate/constants.js";
33
+ import { resolveSubstrateTuning } from "../../plugins/defaults/memory/substrate/tuning.js";
33
34
  import { ACTOR_PRINCIPALS } from "../auth/route-policy.js";
34
35
  import { BadRequestError } from "./errors.js";
35
36
  import {
@@ -46,7 +47,12 @@ function isConsolidationAvailable(): boolean {
46
47
  }
47
48
 
48
49
  function consolidationIntervalMs(): number {
49
- return getConfig().memory.v2.consolidation_interval_hours * 60 * 60 * 1000;
50
+ return (
51
+ resolveSubstrateTuning(getConfig().memory).consolidation_interval_hours *
52
+ 60 *
53
+ 60 *
54
+ 1000
55
+ );
50
56
  }
51
57
 
52
58
  function readLastRunAt(): number | null {
@@ -10,6 +10,7 @@
10
10
 
11
11
  import { z } from "zod";
12
12
 
13
+ import { CHANNEL_IDS } from "../../channels/types.js";
13
14
  import { channelBindingSchema } from "../../messaging/channel-binding-schema.js";
14
15
  import {
15
16
  type Confidence,
@@ -57,16 +58,7 @@ const log = getLogger("conversation-list-routes");
57
58
  // Response schemas
58
59
  // ---------------------------------------------------------------------------
59
60
 
60
- const channelIdSchema = z.enum([
61
- "telegram",
62
- "phone",
63
- "vellum",
64
- "whatsapp",
65
- "slack",
66
- "email",
67
- "platform",
68
- "a2a",
69
- ]);
61
+ const channelIdSchema = z.enum(CHANNEL_IDS);
70
62
 
71
63
  const assistantAttentionSchema = z.object({
72
64
  hasUnseenLatestAssistantMessage: z.boolean(),
@@ -453,15 +445,7 @@ export const ROUTES: RouteDefinition[] = [
453
445
  "Filter by origin channel. When provided, only conversations with this exact origin_channel value are returned. Omit to include all channels.",
454
446
  schema: {
455
447
  type: "string",
456
- enum: [
457
- "slack",
458
- "telegram",
459
- "whatsapp",
460
- "email",
461
- "a2a",
462
- "vellum",
463
- "phone",
464
- ],
448
+ enum: [...CHANNEL_IDS],
465
449
  },
466
450
  },
467
451
  ],
@@ -71,7 +71,6 @@ import { deleteSchedule } from "../../schedule/schedule-store.js";
71
71
  import { UserError } from "../../util/errors.js";
72
72
  import { safeParseRecord } from "../../util/json.js";
73
73
  import { getLogger } from "../../util/logger.js";
74
- import { silentlyWithLog } from "../../util/silently.js";
75
74
  import { broadcastMessage } from "../assistant-event-hub.js";
76
75
  import { ACTOR_PRINCIPALS } from "../auth/route-policy.js";
77
76
  import { resolveActorPrincipalIdForLocalGuardian } from "../local-actor-identity.js";
@@ -337,10 +336,7 @@ async function handleSummarizeConversation({ body = {} }: RouteHandlerArgs) {
337
336
  conversation.abortController = null;
338
337
  }
339
338
  conversation.setProcessing(false);
340
- silentlyWithLog(
341
- conversation.drainQueue(),
342
- "summarize-command queue drain",
343
- );
339
+ void conversation.kickDrainQueue("loop_complete", "summarize_command");
344
340
  }
345
341
  })();
346
342
 
@@ -55,6 +55,10 @@ import {
55
55
  } from "../../config/schemas/llm.js";
56
56
  import { VALID_MEMORY_EMBEDDING_PROVIDERS } from "../../config/schemas/memory-storage.js";
57
57
  import { ServiceModeSchema } from "../../config/schemas/services.js";
58
+ import {
59
+ describeShadowedConfigSet,
60
+ findSubstrateShadowing,
61
+ } from "../../config/substrate-twin-shadowing.js";
58
62
  import { getConfigWatcher } from "../../daemon/config-watcher.js";
59
63
  import {
60
64
  getEmbeddingConfigInfo,
@@ -88,9 +92,9 @@ import { clearEmbeddingBackendCache } from "../../persistence/embeddings/embeddi
88
92
  import { getLlmRequestLogSource } from "../../persistence/llm-request-log-source.js";
89
93
  import { type LogRow } from "../../persistence/llm-request-log-store.js";
90
94
  import { getMemoryRecallLogByMessageIds } from "../../plugins/defaults/memory/memory-recall-log-store.js";
91
- import { getMemoryV2ActivationLogByMessageIds } from "../../plugins/defaults/memory/memory-v2-activation-log-store.js";
95
+ import { MEMORY_V2_CONSOLIDATION_SOURCE } from "../../plugins/defaults/memory/substrate/constants.js";
96
+ import { getMemoryV2ActivationLogByMessageIds } from "../../plugins/defaults/memory/v2/activation-log-store.js";
92
97
  import { getMemoryV3SelectionForInspectorByMessageIds } from "../../plugins/defaults/memory/v3/selection-log-store.js";
93
- import { MEMORY_V2_CONSOLIDATION_SOURCE } from "../../plugins/defaults/memory/v3/substrate/constants.js";
94
98
  import { ROUTING_IDENTITY_PROVIDERS } from "../../providers/inference/auth.js";
95
99
  import { PROVIDERS_REQUIRING_BASE_URL_AND_MODELS } from "../../providers/inference/auth.js";
96
100
  import {
@@ -459,10 +463,10 @@ async function handleSetEmbeddingConfig({ body }: RouteHandlerArgs) {
459
463
  * response needs the same treatment so external clients (macOS, web, CLI)
460
464
  * see the effective value rather than `undefined` when the daemon hasn't
461
465
  * persisted an explicit choice yet. For example, on a freshly-hatched
462
- * platform-managed assistant, `services.image-generation.mode` may be absent
463
- * from disk (only `llm.profiles` was written by `seedInferenceProfiles`); the
464
- * fill pass ensures clients receive `"managed"` rather than falling back to
465
- * their own defaults.
466
+ * platform-managed assistant, `services.image-generation.provider` may be
467
+ * absent from disk (only `llm.profiles` was written by
468
+ * `seedInferenceProfiles`); the fill pass ensures clients receive `"vellum"`
469
+ * rather than falling back to their own defaults.
466
470
  *
467
471
  * Guards against `loadRawConfig()` handing us a value that is technically
468
472
  * valid JSON but not a plain object (e.g. literal `null`, a number, or an
@@ -703,7 +707,10 @@ const ConfigGetResponseSchema = z
703
707
  .passthrough()
704
708
  .optional(),
705
709
  "image-generation": z
706
- .object({ mode: ServiceModeSchema.optional() })
710
+ .object({
711
+ provider: z.string().optional(),
712
+ model: z.string().optional(),
713
+ })
707
714
  .passthrough()
708
715
  .optional(),
709
716
  inference: z
@@ -807,7 +814,10 @@ const ConfigPatchRequestSchema = z
807
814
  .nullable()
808
815
  .optional(),
809
816
  "image-generation": z
810
- .object({ mode: ServiceModeSchema.optional() })
817
+ .object({
818
+ provider: z.string().optional(),
819
+ model: z.string().optional(),
820
+ })
811
821
  .passthrough()
812
822
  .nullable()
813
823
  .optional(),
@@ -1449,6 +1459,28 @@ export async function commitConfigWrite(
1449
1459
  }
1450
1460
  }
1451
1461
 
1462
+ /**
1463
+ * Web clients pair provider writes with a legacy `mode` key so their saves
1464
+ * stay valid on daemons whose schemas still carry it. The provider-only
1465
+ * services (web-search, image-generation) parse-strip that key, but the
1466
+ * deep-merge would still persist it to raw config.json on every save —
1467
+ * scrub it so the removed field cannot be resurrected on disk.
1468
+ */
1469
+ function scrubRemovedServiceModes(raw: Record<string, unknown>): void {
1470
+ const services = raw.services as
1471
+ | Record<string, Record<string, unknown> | undefined>
1472
+ | undefined;
1473
+ if (!services) {
1474
+ return;
1475
+ }
1476
+ for (const key of ["web-search", "image-generation"]) {
1477
+ const entry = services[key];
1478
+ if (entry && typeof entry === "object" && "mode" in entry) {
1479
+ delete entry.mode;
1480
+ }
1481
+ }
1482
+ }
1483
+
1452
1484
  async function handlePatchConfig({ body }: RouteHandlerArgs) {
1453
1485
  if (
1454
1486
  !body ||
@@ -1467,6 +1499,7 @@ async function handlePatchConfig({ body }: RouteHandlerArgs) {
1467
1499
  const patch = body as Record<string, unknown>;
1468
1500
  backfillNewCallSiteEntries(raw, patch);
1469
1501
  deepMergeOverwrite(raw, patch);
1502
+ scrubRemovedServiceModes(raw);
1470
1503
 
1471
1504
  await commitConfigWrite(raw, "patch");
1472
1505
 
@@ -1568,6 +1601,17 @@ async function handleSetConfig({ body }: RouteHandlerArgs) {
1568
1601
  }
1569
1602
 
1570
1603
  await commitConfigWrite(raw, "set");
1604
+ // A `memory.v2` substrate tunable whose `memory.substrate` twin is set does
1605
+ // not mean what an unpaired write means: the substrate namespace wins in
1606
+ // `resolveSubstrateTuning`, and for the three twins the v2 injection engine
1607
+ // reads directly the two namespaces diverge instead. Report which case this
1608
+ // is alongside the success so the caller can tell the operator.
1609
+ const shadowing = findSubstrateShadowing(raw, path);
1610
+ if (shadowing) {
1611
+ const warning = describeShadowedConfigSet(shadowing, path);
1612
+ log.warn({ path, substratePath: shadowing.substratePath }, warning);
1613
+ return { ok: true, warning };
1614
+ }
1571
1615
  return { ok: true };
1572
1616
  }
1573
1617
 
@@ -16,6 +16,7 @@ import {
16
16
  createAssistantMessage,
17
17
  createUserMessage,
18
18
  } from "../../agent/message-types.js";
19
+ import type { AssistantEvent } from "../../api/index.js";
19
20
  import {
20
21
  BackgroundToolCompletionSchema,
21
22
  type ConversationContentBlock,
@@ -81,7 +82,6 @@ import {
81
82
  shouldAttachHostProxyForCapability,
82
83
  } from "../../daemon/host-proxy-preactivation.js";
83
84
  import { getAssistantName } from "../../daemon/identity-helpers.js";
84
- import type { ServerMessage } from "../../daemon/message-protocol.js";
85
85
  import type {
86
86
  HostProxyTransportMetadata,
87
87
  NonHostProxyTransportMetadata,
@@ -142,7 +142,6 @@ import {
142
142
  getWorkspaceDir,
143
143
  getWorkspacePromptPath,
144
144
  } from "../../util/platform.js";
145
- import { silentlyWithLog } from "../../util/silently.js";
146
145
  import { assistantEventHub, broadcastMessage } from "../assistant-event-hub.js";
147
146
  import { getCurrentSeq } from "../assistant-stream-state.js";
148
147
  import { ACTOR_PRINCIPALS } from "../auth/route-policy.js";
@@ -457,11 +456,26 @@ async function collectGuardianRequestHintIds(
457
456
  async function expireOrphanedGuardianRequests(
458
457
  conversationId: string,
459
458
  ): Promise<void> {
460
- const sourceScoped = await listGuardianRequestsOrEmpty({
461
- sourceConversationId: conversationId,
462
- status: "pending",
463
- kind: "tool_approval",
464
- });
459
+ const [toolApprovals, pendingQuestions] = await Promise.all([
460
+ listGuardianRequestsOrEmpty({
461
+ sourceConversationId: conversationId,
462
+ status: "pending",
463
+ kind: "tool_approval",
464
+ }),
465
+ listGuardianRequestsOrEmpty({
466
+ sourceConversationId: conversationId,
467
+ status: "pending",
468
+ kind: "pending_question",
469
+ }),
470
+ ]);
471
+
472
+ // Voice-call questions (callSessionId present) track their lifecycle in the
473
+ // calls domain, not `pendingInteractions` — never treat them as orphaned
474
+ // here. Only ask_question rows are interaction-bound.
475
+ const sourceScoped = [
476
+ ...toolApprovals,
477
+ ...pendingQuestions.filter((req) => !req.callSessionId),
478
+ ];
465
479
 
466
480
  for (const req of sourceScoped) {
467
481
  // Skip requests that still have a live in-memory pending interaction —
@@ -494,7 +508,7 @@ async function tryConsumeGuardianReply(params: {
494
508
  filePath?: string;
495
509
  }>;
496
510
  conversation: Conversation;
497
- onEvent: (msg: ServerMessage) => void;
511
+ onEvent: (msg: AssistantEvent) => void;
498
512
  approvalConversationGenerator?: ApprovalConversationGenerator;
499
513
  /** Verified actor identity from actor-token middleware. */
500
514
  verifiedActorExternalUserId?: string;
@@ -1963,10 +1977,7 @@ export async function handleSendMessage(
1963
1977
  recordConversationPersistedSeq(conversationId, getCurrentSeq());
1964
1978
  publishConversationMessagesChanged(conversationId, originClientId);
1965
1979
  conversation.setProcessing(false);
1966
- silentlyWithLog(
1967
- conversation.drainQueue(),
1968
- "canned-greeting queue drain",
1969
- );
1980
+ void conversation.kickDrainQueue("loop_complete", "canned_greeting");
1970
1981
 
1971
1982
  conversation.warmPromptCache();
1972
1983
  }, 0);
@@ -1980,7 +1991,7 @@ export async function handleSendMessage(
1980
1991
  } finally {
1981
1992
  if (!cleanupDeferred && conversation.isProcessing()) {
1982
1993
  conversation.setProcessing(false);
1983
- silentlyWithLog(conversation.drainQueue(), "error-path queue drain");
1994
+ void conversation.kickDrainQueue("loop_complete", "send_error_path");
1984
1995
  }
1985
1996
  }
1986
1997
  }
@@ -2292,7 +2303,7 @@ export async function handleSendMessage(
2292
2303
  recordConversationPersistedSeq(conversationId, getCurrentSeq());
2293
2304
  publishConversationMessagesChanged(conversationId, originClientId);
2294
2305
  conversation.setProcessing(false);
2295
- silentlyWithLog(conversation.drainQueue(), "slash-command queue drain");
2306
+ void conversation.kickDrainQueue("loop_complete", "slash_command");
2296
2307
  }, 0);
2297
2308
 
2298
2309
  cleanupDeferred = true;
@@ -2302,7 +2313,7 @@ export async function handleSendMessage(
2302
2313
  // setTimeout above), but still needed for error paths.
2303
2314
  if (!cleanupDeferred && conversation.isProcessing()) {
2304
2315
  conversation.setProcessing(false);
2305
- silentlyWithLog(conversation.drainQueue(), "error-path queue drain");
2316
+ void conversation.kickDrainQueue("loop_complete", "send_error_path");
2306
2317
  }
2307
2318
  }
2308
2319
  }
@@ -2329,12 +2340,12 @@ export async function handleSendMessage(
2329
2340
  // throw from this initial persist never reaches it — reset here so the
2330
2341
  // conversation isn't stranded in queued mode.
2331
2342
  conversation.setProcessing(false);
2332
- silentlyWithLog(conversation.drainQueue(), "compact-command queue drain");
2343
+ void conversation.kickDrainQueue("loop_complete", "compact_command");
2333
2344
  throw err;
2334
2345
  }
2335
2346
  if (persisted.deduplicated) {
2336
2347
  conversation.setProcessing(false);
2337
- silentlyWithLog(conversation.drainQueue(), "compact-dedup queue drain");
2348
+ void conversation.kickDrainQueue("loop_complete", "compact_dedup");
2338
2349
  return {
2339
2350
  accepted: true,
2340
2351
  messageId: persisted.id,
@@ -2384,10 +2395,7 @@ export async function handleSendMessage(
2384
2395
  });
2385
2396
  } finally {
2386
2397
  conversation.setProcessing(false);
2387
- silentlyWithLog(
2388
- conversation.drainQueue(),
2389
- "compact-command queue drain",
2390
- );
2398
+ void conversation.kickDrainQueue("loop_complete", "compact_command");
2391
2399
  }
2392
2400
  })();
2393
2401
 
@@ -2465,7 +2473,7 @@ export async function handleSendMessage(
2465
2473
  };
2466
2474
  } finally {
2467
2475
  conversation.setProcessing(false);
2468
- silentlyWithLog(conversation.drainQueue(), "clean-command queue drain");
2476
+ void conversation.kickDrainQueue("loop_complete", "clean_command");
2469
2477
  }
2470
2478
  }
2471
2479
 
@@ -3007,6 +3015,12 @@ export const ROUTES: RouteDefinition[] = [
3007
3015
  "Plugin ids that scope this conversation to a subset of installed plugins (first-party defaults are always available). When present on a message, it sets/updates the conversation's plugin scope (the web client sends it only on the first message of a new chat). null clears the scope to default (all enabled plugins); omitting the field leaves the existing scope unchanged.",
3008
3016
  ),
3009
3017
  riskThreshold: z.enum(VALID_RISK_THRESHOLDS).optional(),
3018
+ bypassSecretCheck: z
3019
+ .boolean()
3020
+ .optional()
3021
+ .describe(
3022
+ 'When true, skip the secret-ingress scan for this message only. Set exclusively when the user explicitly confirms a client-side blocked send (the composer\'s "Send anyway" action); it is per-message and never persisted.',
3023
+ ),
3010
3024
  hidden: z
3011
3025
  .boolean()
3012
3026
  .optional()
@@ -25,7 +25,6 @@ type GatewayMintResult =
25
25
  | { ok: false; error: string };
26
26
 
27
27
  const MINT_ERROR_MESSAGES: Record<string, string> = {
28
- flag_disabled: "One-time credential links are not enabled",
29
28
  no_public_base_url:
30
29
  "No public ingress URL is configured — set ingress.publicBaseUrl first",
31
30
  rate_limited: "Too many credential links created — try again in a minute",
@@ -16,7 +16,7 @@
16
16
  import { z } from "zod";
17
17
 
18
18
  import { getConfig } from "../../config/loader.js";
19
- import { usesConceptPageMemory } from "../../config/memory-v3-gate.js";
19
+ import { isMemoryV1Active } from "../../config/memory-v3-gate.js";
20
20
  import { getMemoryCheckpoint } from "../../persistence/checkpoints.js";
21
21
  import {
22
22
  enqueueMemoryJob,
@@ -29,12 +29,12 @@ import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
29
29
 
30
30
  function isFilingAvailable(): boolean {
31
31
  const config = getConfig();
32
- // Filing runs through the memory jobs worker, whose slow lane is parked
33
- // while memory is disabled — an enqueued job would sit pending forever, so
34
- // report unavailable (and reject run-now) rather than queue dead work.
35
- return (
36
- config.memory.enabled !== false && !usesConceptPageMemory(config.memory)
37
- );
32
+ // PKB filing is v1 work, so it is available on exactly the v1 tier. That
33
+ // covers both cases the docstring names: under concept-page memory filing
34
+ // yields to consolidation, and while memory is disabled the jobs worker's
35
+ // slow lane is parked, so an enqueued job would sit pending forever. Report
36
+ // unavailable (and reject run-now) rather than queue dead work.
37
+ return isMemoryV1Active(config);
38
38
  }
39
39
 
40
40
  // ---------------------------------------------------------------------------