@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
@@ -19,6 +19,7 @@
19
19
  import { beforeAll, describe, expect, mock, test } from "bun:test";
20
20
 
21
21
  import * as realPlatform from "../util/platform.js";
22
+ import { installThresholdReaderMock } from "./gateway-threshold-reader-mock.js";
22
23
 
23
24
  // Local registry for ToolExecutor tests — the mock delegates to this map
24
25
  // so that registerTool/getTool/getAllTools work for our benchmark tools.
@@ -54,13 +55,15 @@ mock.module("../util/platform.js", () => ({
54
55
  getDeprecatedDir: () => "/tmp/deprecated",
55
56
  }));
56
57
 
57
- mock.module("../permissions/gateway-threshold-reader.js", () => ({
58
- getAutoApproveThreshold: async () => undefined,
59
- refreshAutoApproveThreshold: async () => null,
60
- }));
58
+ // Mock defaults: no threshold, and no cell at any cascade level — the
59
+ // benchmark measures the pipeline, not the channel matrix.
60
+ installThresholdReaderMock();
61
61
 
62
+ const realWorkspacePolicy = await import("../permissions/workspace-policy.js");
62
63
  mock.module("../permissions/workspace-policy.js", () => ({
64
+ ...realWorkspacePolicy,
63
65
  isWorkspaceScopedInvocation: () => false,
66
+ isOutOfWorkspaceFileInvocation: () => false,
64
67
  isPathWithinWorkspaceRoot: () => false,
65
68
  }));
66
69
 
@@ -128,6 +128,7 @@ mock.module("../tools/registry.js", () => ({
128
128
 
129
129
  mock.module("../tools/shared/filesystem/path-policy.js", () => ({
130
130
  sandboxPolicy: () => ({ ok: false }),
131
+ sandboxPolicyWithHostFallback: () => ({ ok: false }),
131
132
  hostPolicy: () => ({ ok: false }),
132
133
  }));
133
134
 
@@ -1397,3 +1398,118 @@ describe("ToolExecutor thrown-value rendering", () => {
1397
1398
  expect(result.content).toContain("unexpected error: boom");
1398
1399
  });
1399
1400
  });
1401
+
1402
+ describe("ToolExecutor input-schema validation gate", () => {
1403
+ beforeEach(() => {
1404
+ fakeToolResult = { content: "ok", isError: false };
1405
+ getToolOverride = undefined;
1406
+ getAllToolsOverride = undefined;
1407
+ checkResultOverride = undefined;
1408
+ checkFnOverride = undefined;
1409
+ cachedAssessmentOverride = undefined;
1410
+ });
1411
+
1412
+ /**
1413
+ * Registry-shaped tool with an explicit owner and an execute that records
1414
+ * the input it actually received (undefined until the tool runs).
1415
+ */
1416
+ function ownedTool(
1417
+ name: string,
1418
+ ownerKind: string,
1419
+ ): { seenInput: () => Record<string, unknown> | undefined } {
1420
+ let seen: Record<string, unknown> | undefined;
1421
+ getToolOverride = (n: string) =>
1422
+ n === name
1423
+ ? ({
1424
+ name,
1425
+ description: "owned tool",
1426
+ category: "test",
1427
+ defaultRiskLevel: RiskLevel.Low,
1428
+ executionTarget: "sandbox" as const,
1429
+ input_schema: { type: "object" as const, properties: {} },
1430
+ execute: async (input: Record<string, unknown>) => {
1431
+ seen = input;
1432
+ return fakeToolResult;
1433
+ },
1434
+ owner: { kind: ownerKind, id: ownerKind },
1435
+ } as unknown as Tool)
1436
+ : undefined;
1437
+ return { seenInput: () => seen };
1438
+ }
1439
+
1440
+ test("malformed input for a built-in tool returns a clean error without executing", async () => {
1441
+ const probe = ownedTool("file_write", "default");
1442
+ const executor = new ToolExecutor(makePrompter());
1443
+ const result = await executor.execute(
1444
+ "file_write",
1445
+ { path: 42, content: "hello" },
1446
+ makeContext(),
1447
+ );
1448
+
1449
+ expect(result.isError).toBe(true);
1450
+ expect(result.content).toContain('Invalid input for tool "file_write"');
1451
+ expect(result.content).toContain("path:");
1452
+ expect(probe.seenInput()).toBeUndefined();
1453
+ });
1454
+
1455
+ test("valid input executes with catch-recovered data, unknown keys intact", async () => {
1456
+ const probe = ownedTool("file_read", "default");
1457
+ const executor = new ToolExecutor(makePrompter());
1458
+ const result = await executor.execute(
1459
+ "file_read",
1460
+ { path: "a.txt", offset: "not-a-number", activity: "Reading a file" },
1461
+ makeContext(),
1462
+ );
1463
+
1464
+ expect(result.isError).toBe(false);
1465
+ expect(probe.seenInput()).toEqual({
1466
+ path: "a.txt",
1467
+ activity: "Reading a file",
1468
+ });
1469
+ });
1470
+
1471
+ test("a non-default owner shadowing a registered name skips registry validation", async () => {
1472
+ const probe = ownedTool("file_write", "workspace");
1473
+ const executor = new ToolExecutor(makePrompter());
1474
+ const result = await executor.execute(
1475
+ "file_write",
1476
+ { path: 42 },
1477
+ makeContext(),
1478
+ );
1479
+
1480
+ expect(result.isError).toBe(false);
1481
+ expect(probe.seenInput()).toEqual({ path: 42 });
1482
+ });
1483
+
1484
+ test("a built-in tool with no registered schema executes unchanged", async () => {
1485
+ const probe = ownedTool("web_search", "default");
1486
+ const executor = new ToolExecutor(makePrompter());
1487
+ const result = await executor.execute(
1488
+ "web_search",
1489
+ { query: 42 },
1490
+ makeContext(),
1491
+ );
1492
+
1493
+ expect(result.isError).toBe(false);
1494
+ expect(probe.seenInput()).toEqual({ query: 42 });
1495
+ });
1496
+
1497
+ test("malformed input for a sensitive tool fails validation before any grant flow", async () => {
1498
+ // An unknown actor invoking a sensitive built-in normally routes into the
1499
+ // scoped-grant machinery inside checkPreExecutionGates. Malformed input
1500
+ // must short-circuit BEFORE that point — the validation error proves the
1501
+ // call never reached grant consumption or guardian escalation.
1502
+ const probe = ownedTool("file_write", "default");
1503
+ const executor = new ToolExecutor(makePrompter());
1504
+ const result = await executor.execute(
1505
+ "file_write",
1506
+ { path: 42 },
1507
+ makeContext({ trustClass: "unknown" }),
1508
+ );
1509
+
1510
+ expect(result.isError).toBe(true);
1511
+ expect(result.content).toContain('Invalid input for tool "file_write"');
1512
+ expect(result.content).not.toContain("guardian");
1513
+ expect(probe.seenInput()).toBeUndefined();
1514
+ });
1515
+ });
@@ -228,6 +228,11 @@ describe("ToolApprovalHandler / grant-miss escalation", () => {
228
228
 
229
229
  // The guardian-facing question asks about the tool, never about the person.
230
230
  expect(emittedSignals.length).toBe(1);
231
+ // The in-app card is pinned to the conversation the escalated tool runs
232
+ // in — never left to LLM conversation routing.
233
+ expect(emittedSignals[0].conversationAffinityHint).toEqual({
234
+ vellum: "conv-1",
235
+ });
231
236
  const payload = emittedSignals[0].contextPayload as Record<string, unknown>;
232
237
  const questionText = payload.questionText as string;
233
238
  expect(questionText.startsWith("Approve tool: bash")).toBe(true);
@@ -48,9 +48,13 @@ mock.module("../persistence/conversation-crud.js", () => ({
48
48
  provenanceFromTrustContext: () => ({}),
49
49
  reserveMessage: reserveMessageMock,
50
50
  recordConversationPersistedSeq: (id: string, seq: number) => {
51
- if (!Number.isFinite(seq) || seq <= 0) return;
51
+ if (!Number.isFinite(seq) || seq <= 0) {
52
+ return;
53
+ }
52
54
  const prev = persistedSeqByConversation.get(id);
53
- if (prev == null || prev < seq) persistedSeqByConversation.set(id, seq);
55
+ if (prev == null || prev < seq) {
56
+ persistedSeqByConversation.set(id, seq);
57
+ }
54
58
  },
55
59
  getConversationPersistedSeq: (id: string) =>
56
60
  persistedSeqByConversation.get(id) ?? null,
@@ -70,7 +74,7 @@ mock.module("../plugins/defaults/memory/memory-recall-log-store.js", () => ({
70
74
  }));
71
75
 
72
76
  mock.module(
73
- "../plugins/defaults/memory/memory-v2-activation-log-store.js",
77
+ "../plugins/defaults/memory/v2/activation-log-store.js",
74
78
  () => ({
75
79
  backfillMemoryV2ActivationMessageId: () => {},
76
80
  }),
@@ -78,6 +82,7 @@ mock.module(
78
82
 
79
83
  // ── Imports (after mocks) ─────────────────────────────────────────────────────
80
84
  import type { AgentEvent } from "../agent/loop.js";
85
+ import type { AssistantEvent, AssistantEventEnvelope } from "../api/index.js";
81
86
  import type {
82
87
  EventHandlerDeps,
83
88
  EventHandlerState,
@@ -91,9 +96,7 @@ import {
91
96
  handleToolUse,
92
97
  handleToolUsePreviewStart,
93
98
  } from "../daemon/conversation-agent-loop-handlers.js";
94
- import type { ServerMessage } from "../daemon/message-protocol.js";
95
99
  import { getConversationPersistedSeq } from "../persistence/conversation-crud.js";
96
- import type { AssistantEvent } from "../runtime/assistant-event.js";
97
100
  import {
98
101
  _resetStreamStateForTesting,
99
102
  getCurrentSeq,
@@ -105,7 +108,7 @@ import {
105
108
  function createMockDeps(
106
109
  overrides: Partial<EventHandlerDeps> = {},
107
110
  ): EventHandlerDeps {
108
- const emittedEvents: ServerMessage[] = [];
111
+ const emittedEvents: AssistantEvent[] = [];
109
112
  const emittedActivityStates: Array<{
110
113
  phase: string;
111
114
  reason: string;
@@ -135,7 +138,7 @@ function createMockDeps(
135
138
  markWorkspaceTopLevelDirty: () => {},
136
139
  currentTurnSurfaces: [],
137
140
  } as unknown as EventHandlerDeps["ctx"],
138
- onEvent: (msg: ServerMessage) => {
141
+ onEvent: (msg: AssistantEvent) => {
139
142
  emittedEvents.push(msg);
140
143
  },
141
144
  reqId: "test-req-id",
@@ -158,7 +161,7 @@ function createMockDeps(
158
161
 
159
162
  /** Collect events by wrapping onEvent. */
160
163
  function createEventCollector(): {
161
- events: ServerMessage[];
164
+ events: AssistantEvent[];
162
165
  activityStates: Array<{
163
166
  phase: string;
164
167
  reason: string;
@@ -166,14 +169,14 @@ function createEventCollector(): {
166
169
  requestId?: string;
167
170
  statusText?: string;
168
171
  }>;
169
- onEvent: (msg: ServerMessage) => void;
172
+ onEvent: (msg: AssistantEvent) => void;
170
173
  emitActivityState: (
171
174
  phase: string,
172
175
  reason: string,
173
176
  options?: { anchor?: string; requestId?: string; statusText?: string },
174
177
  ) => void;
175
178
  } {
176
- const events: ServerMessage[] = [];
179
+ const events: AssistantEvent[] = [];
177
180
  const activityStates: Array<{
178
181
  phase: string;
179
182
  reason: string;
@@ -184,7 +187,7 @@ function createEventCollector(): {
184
187
  return {
185
188
  events,
186
189
  activityStates,
187
- onEvent: (msg: ServerMessage) => events.push(msg),
190
+ onEvent: (msg: AssistantEvent) => events.push(msg),
188
191
  emitActivityState: (phase, reason, options) =>
189
192
  activityStates.push({
190
193
  phase,
@@ -392,9 +395,9 @@ describe("tool preview lifecycle", () => {
392
395
  const collector = createEventCollector();
393
396
  const conversationId = "test-session-id";
394
397
  const deps = createMockDeps({
395
- onEvent: (msg: ServerMessage) => {
398
+ onEvent: (msg: AssistantEvent) => {
396
399
  collector.events.push(msg);
397
- stampAndBuffer(msg as unknown as AssistantEvent);
400
+ stampAndBuffer(msg as unknown as AssistantEventEnvelope);
398
401
  },
399
402
  ctx: {
400
403
  ...createMockDeps().ctx,
@@ -408,12 +411,12 @@ describe("tool preview lifecycle", () => {
408
411
  type: "assistant_text_delta",
409
412
  text: "hello",
410
413
  conversationId,
411
- } as unknown as AssistantEvent);
414
+ } as unknown as AssistantEventEnvelope);
412
415
  stampAndBuffer({
413
416
  type: "assistant_text_delta",
414
417
  text: " world",
415
418
  conversationId,
416
- } as unknown as AssistantEvent);
419
+ } as unknown as AssistantEventEnvelope);
417
420
 
418
421
  // WHEN a tool_use is handled (its block is already durable)
419
422
  handleToolUse(state, deps, {
@@ -430,7 +433,7 @@ describe("tool preview lifecycle", () => {
430
433
  expect(toolUseStart).toBeDefined();
431
434
  expect(getConversationPersistedSeq(conversationId)).toBe(getCurrentSeq());
432
435
  expect(getConversationPersistedSeq(conversationId)).toBe(
433
- (toolUseStart as unknown as AssistantEvent).seq ?? null,
436
+ (toolUseStart as unknown as AssistantEventEnvelope).seq ?? null,
434
437
  );
435
438
  });
436
439
  });
@@ -446,12 +449,12 @@ describe("tool preview lifecycle", () => {
446
449
  /** onEvent that stamps conversation-scoped events like the runtime hub. */
447
450
  function makeStampingDeps(
448
451
  overrides: Partial<EventHandlerDeps["ctx"]> = {},
449
- ): { deps: EventHandlerDeps; events: ServerMessage[] } {
450
- const events: ServerMessage[] = [];
452
+ ): { deps: EventHandlerDeps; events: AssistantEvent[] } {
453
+ const events: AssistantEvent[] = [];
451
454
  const deps = createMockDeps({
452
- onEvent: (msg: ServerMessage) => {
455
+ onEvent: (msg: AssistantEvent) => {
453
456
  events.push(msg);
454
- stampAndBuffer(msg as unknown as AssistantEvent);
457
+ stampAndBuffer(msg as unknown as AssistantEventEnvelope);
455
458
  },
456
459
  ctx: {
457
460
  ...createMockDeps().ctx,
@@ -494,7 +497,7 @@ describe("tool preview lifecycle", () => {
494
497
  },
495
498
  ]);
496
499
  expect(state.lastStreamedContentSeq).toBe(
497
- (thinkingDelta as unknown as AssistantEvent).seq ?? undefined,
500
+ (thinkingDelta as unknown as AssistantEventEnvelope).seq ?? undefined,
498
501
  );
499
502
  });
500
503
 
@@ -531,7 +534,7 @@ describe("tool preview lifecycle", () => {
531
534
  expect(thinkingDelta).toBeDefined();
532
535
  expect(getConversationPersistedSeq(conversationId)).toBe(getCurrentSeq());
533
536
  expect(getConversationPersistedSeq(conversationId)).toBe(
534
- (thinkingDelta as unknown as AssistantEvent).seq ?? null,
537
+ (thinkingDelta as unknown as AssistantEventEnvelope).seq ?? null,
535
538
  );
536
539
  });
537
540
 
@@ -562,7 +565,7 @@ describe("tool preview lifecycle", () => {
562
565
  expect(toolResult).toBeDefined();
563
566
  expect(getConversationPersistedSeq(conversationId)).toBe(getCurrentSeq());
564
567
  expect(getConversationPersistedSeq(conversationId)).toBe(
565
- (toolResult as unknown as AssistantEvent).seq ?? null,
568
+ (toolResult as unknown as AssistantEventEnvelope).seq ?? null,
566
569
  );
567
570
  });
568
571
 
@@ -611,13 +614,13 @@ describe("tool preview lifecycle", () => {
611
614
  /** onEvent that stamps conversation-scoped events like the runtime hub. */
612
615
  function makeStampingDeps(): {
613
616
  deps: EventHandlerDeps;
614
- events: ServerMessage[];
617
+ events: AssistantEvent[];
615
618
  } {
616
- const events: ServerMessage[] = [];
619
+ const events: AssistantEvent[] = [];
617
620
  const deps = createMockDeps({
618
- onEvent: (msg: ServerMessage) => {
621
+ onEvent: (msg: AssistantEvent) => {
619
622
  events.push(msg);
620
- stampAndBuffer(msg as unknown as AssistantEvent);
623
+ stampAndBuffer(msg as unknown as AssistantEventEnvelope);
621
624
  },
622
625
  ctx: {
623
626
  ...createMockDeps().ctx,
@@ -803,7 +806,7 @@ describe("tool preview lifecycle", () => {
803
806
  /** Deps wired to a fresh collector. */
804
807
  function makeCollectingDeps(): {
805
808
  deps: EventHandlerDeps;
806
- events: ServerMessage[];
809
+ events: AssistantEvent[];
807
810
  } {
808
811
  const collector = createEventCollector();
809
812
  const deps = createMockDeps({
@@ -817,7 +820,7 @@ describe("tool preview lifecycle", () => {
817
820
  }
818
821
 
819
822
  function emittedToolResult(
820
- events: ServerMessage[],
823
+ events: AssistantEvent[],
821
824
  ): Record<string, unknown> {
822
825
  const toolResult = events.find((e) => e.type === "tool_result");
823
826
  expect(toolResult).toBeDefined();
@@ -26,6 +26,7 @@ mock.module("../persistence/llm-request-log-store.js", () => ({
26
26
  }));
27
27
 
28
28
  // ── Imports (after mocks) ─────────────────────────────────────────────────────
29
+ import type { AssistantEvent } from "../api/index.js";
29
30
  import type {
30
31
  EventHandlerDeps,
31
32
  EventHandlerState,
@@ -34,18 +35,17 @@ import {
34
35
  createEventHandlerState,
35
36
  handleToolResult,
36
37
  } from "../daemon/conversation-agent-loop-handlers.js";
37
- import type { ServerMessage } from "../daemon/message-protocol.js";
38
38
  import type { ToolActivityMetadata } from "../daemon/message-types/web-activity.js";
39
39
 
40
- type ToolResultEvent = Extract<ServerMessage, { type: "tool_result" }>;
40
+ type ToolResultEvent = Extract<AssistantEvent, { type: "tool_result" }>;
41
41
 
42
42
  // ── Helpers ───────────────────────────────────────────────────────────────────
43
43
 
44
44
  function createCollectorDeps(): {
45
45
  deps: EventHandlerDeps;
46
- events: ServerMessage[];
46
+ events: AssistantEvent[];
47
47
  } {
48
- const events: ServerMessage[] = [];
48
+ const events: AssistantEvent[] = [];
49
49
  const deps = {
50
50
  ctx: {
51
51
  conversationId: "conv-meta",
@@ -55,7 +55,7 @@ function createCollectorDeps(): {
55
55
  markWorkspaceTopLevelDirty: () => {},
56
56
  currentTurnSurfaces: [],
57
57
  } as unknown as EventHandlerDeps["ctx"],
58
- onEvent: (msg: ServerMessage) => events.push(msg),
58
+ onEvent: (msg: AssistantEvent) => events.push(msg),
59
59
  reqId: "req-meta",
60
60
  isFirstMessage: false,
61
61
  shouldGenerateTitle: false,
@@ -54,6 +54,7 @@ mock.module("../apps/app-store.js", () => ({
54
54
  editAppFile: mock(() => ({})),
55
55
  inlineDistAssets: mock((_, html: string) => html),
56
56
  addAppConversationId: mock(() => false),
57
+ linkAppToConversationLineage: mock(() => {}),
57
58
  }));
58
59
  mock.module("../services/published-app-updater.js", () => ({
59
60
  updatePublishedAppDeployment: mock(() => Promise.resolve()),
@@ -39,6 +39,7 @@ mock.module("../runtime/assistant-stream-state.js", () => ({
39
39
 
40
40
  // ── Imports (after mocks) ─────────────────────────────────────────────────────
41
41
  import type { AgentEvent } from "../agent/loop.js";
42
+ import type { AssistantEvent } from "../api/index.js";
42
43
  import type {
43
44
  EventHandlerDeps,
44
45
  EventHandlerState,
@@ -47,11 +48,10 @@ import {
47
48
  createEventHandlerState,
48
49
  handleToolUse,
49
50
  } from "../daemon/conversation-agent-loop-handlers.js";
50
- import type { ServerMessage } from "../daemon/message-protocol.js";
51
51
 
52
52
  // ── Helpers ───────────────────────────────────────────────────────────────────
53
53
 
54
- function makeDeps(onEvent: (event: ServerMessage) => void): EventHandlerDeps {
54
+ function makeDeps(onEvent: (event: AssistantEvent) => void): EventHandlerDeps {
55
55
  return {
56
56
  ctx: {
57
57
  conversationId: "test-conv",
@@ -120,7 +120,7 @@ describe("handleToolUse — tool start timestamp", () => {
120
120
  input: { command: "ls" },
121
121
  },
122
122
  ]);
123
- const events: ServerMessage[] = [];
123
+ const events: AssistantEvent[] = [];
124
124
  const before = Date.now();
125
125
 
126
126
  // WHEN the tool begins
@@ -155,7 +155,7 @@ describe("handleToolUse — tool start timestamp", () => {
155
155
  input: { command: "ls" },
156
156
  },
157
157
  ]);
158
- const events: ServerMessage[] = [];
158
+ const events: AssistantEvent[] = [];
159
159
 
160
160
  // WHEN the tool begins
161
161
  handleToolUse(
@@ -206,8 +206,9 @@ describe("trusted contact lifecycle notification signals", () => {
206
206
 
207
207
  await handleChannelInbound(guardianReq, undefined, TEST_BEARER_TOKEN);
208
208
 
209
- // Should emit guardian_decision and denied signals
210
-
209
+ // A denial emits exactly one lifecycle signal — guardian_decision with
210
+ // decision: "denied". A second event for the same verdict would escape
211
+ // dedupe (distinct keys) and duplicate the guardian-facing notification.
211
212
  const guardianDecisionSignals = emitSignalCalls.filter(
212
213
  (c) => c.sourceEventName === "ingress.trusted_contact.guardian_decision",
213
214
  );
@@ -216,7 +217,7 @@ describe("trusted contact lifecycle notification signals", () => {
216
217
  );
217
218
 
218
219
  expect(guardianDecisionSignals.length).toBe(1);
219
- expect(deniedSignals.length).toBe(1);
220
+ expect(deniedSignals.length).toBe(0);
220
221
 
221
222
  // Verify guardian_decision payload
222
223
  const gdPayload = guardianDecisionSignals[0].contextPayload as Record<
@@ -229,18 +230,9 @@ describe("trusted contact lifecycle notification signals", () => {
229
230
  expect(gdPayload.requesterDisplayName).toBe("Alice Requester");
230
231
  expect(gdPayload.decidedByDisplayName).toBe("Guardian Bob");
231
232
 
232
- // Verify denied payload
233
- const dPayload = deniedSignals[0].contextPayload as Record<string, unknown>;
234
- expect(dPayload.decision).toBe("denied");
235
- expect(dPayload.requesterExternalUserId).toBe("requester-user-456");
236
- expect(dPayload.requesterDisplayName).toBe("Alice Requester");
237
- expect(dPayload.decidedByDisplayName).toBe("Guardian Bob");
238
-
239
- // Verify deduplication keys are distinct
240
233
  expect(guardianDecisionSignals[0].dedupeKey).toContain(
241
234
  "trusted-contact:guardian-decision:",
242
235
  );
243
- expect(deniedSignals[0].dedupeKey).toContain("trusted-contact:denied:");
244
236
  });
245
237
 
246
238
  test("guardian approve emits guardian_decision and verification_sent signals with display names", async () => {
@@ -381,8 +373,11 @@ describe("trusted contact lifecycle notification signals", () => {
381
373
  typeof c.dedupeKey === "string" &&
382
374
  (c.dedupeKey as string).includes(approval.id),
383
375
  );
384
- // guardian_decision and denied — both keyed on approval.id
385
- expect(signals.length).toBe(2);
376
+ // Exactly one lifecycle signal per denial, keyed on the request id.
377
+ expect(signals.length).toBe(1);
378
+ expect(signals[0].sourceEventName).toBe(
379
+ "ingress.trusted_contact.guardian_decision",
380
+ );
386
381
  });
387
382
 
388
383
  test("display name fields fall back to null when contacts have no display name", async () => {
@@ -451,12 +446,8 @@ describe("trusted contact lifecycle notification signals", () => {
451
446
  const guardianDecisionSignals = emitSignalCalls.filter(
452
447
  (c) => c.sourceEventName === "ingress.trusted_contact.guardian_decision",
453
448
  );
454
- const deniedSignals = emitSignalCalls.filter(
455
- (c) => c.sourceEventName === "ingress.trusted_contact.denied",
456
- );
457
449
 
458
450
  expect(guardianDecisionSignals.length).toBe(1);
459
- expect(deniedSignals.length).toBe(1);
460
451
 
461
452
  // Verify display names fall back to null/empty when contacts have no
462
453
  // display name set.
@@ -469,10 +460,6 @@ describe("trusted contact lifecycle notification signals", () => {
469
460
  // The signal enrichment resolves displayName from the contact record,
470
461
  // so decidedByDisplayName will be "" (empty string) rather than null.
471
462
  expect(gdPayload.decidedByDisplayName).toBe("");
472
-
473
- const dPayload = deniedSignals[0].contextPayload as Record<string, unknown>;
474
- expect(dPayload.requesterDisplayName).toBeNull();
475
- expect(dPayload.decidedByDisplayName).toBe("");
476
463
  });
477
464
  });
478
465
 
@@ -1,5 +1,6 @@
1
1
  import { describe, expect, test } from "bun:test";
2
2
 
3
+ import type { AssistantEvent } from "../api/index.js";
3
4
  import {
4
5
  buildCompletionSummary,
5
6
  createSurfaceMutex,
@@ -10,7 +11,6 @@ import type {
10
11
  ChoiceSurfaceData,
11
12
  CopyBlockSurfaceData,
12
13
  OAuthConnectSurfaceData,
13
- ServerMessage,
14
14
  SurfaceType,
15
15
  UiSurfaceShow,
16
16
  } from "../daemon/message-protocol.js";
@@ -18,7 +18,7 @@ import { INTERACTIVE_SURFACE_TYPES } from "../daemon/message-protocol.js";
18
18
  import { uiShowTool } from "../tools/ui-surface/definitions.js";
19
19
  import { uiShowTeachingError } from "../tools/ui-surface/surface-shape-docs.js";
20
20
 
21
- function makeContext(sent: ServerMessage[] = []): SurfaceConversationContext {
21
+ function makeContext(sent: AssistantEvent[] = []): SurfaceConversationContext {
22
22
  return {
23
23
  conversationId: "session-1",
24
24
  sendToClient: (msg) => sent.push(msg),
@@ -67,7 +67,7 @@ describe("choice and copy_block surface definitions", () => {
67
67
 
68
68
  describe("choice and copy_block surface proxying", () => {
69
69
  test("ui_show normalizes choice options and creates recommended action payloads", async () => {
70
- const sent: ServerMessage[] = [];
70
+ const sent: AssistantEvent[] = [];
71
71
  const ctx = makeContext(sent);
72
72
 
73
73
  const result = await surfaceProxyResolver(ctx, "ui_show", {
@@ -126,7 +126,7 @@ describe("choice and copy_block surface proxying", () => {
126
126
  });
127
127
 
128
128
  test("ui_show rejects choice surfaces without valid options", async () => {
129
- const sent: ServerMessage[] = [];
129
+ const sent: AssistantEvent[] = [];
130
130
  const ctx = makeContext(sent);
131
131
 
132
132
  const result = await surfaceProxyResolver(ctx, "ui_show", {
@@ -142,7 +142,7 @@ describe("choice and copy_block surface proxying", () => {
142
142
  });
143
143
 
144
144
  test("ui_show passes copy_block data through without awaiting action", async () => {
145
- const sent: ServerMessage[] = [];
145
+ const sent: AssistantEvent[] = [];
146
146
  const ctx = makeContext(sent);
147
147
 
148
148
  const result = await surfaceProxyResolver(ctx, "ui_show", {
@@ -174,7 +174,7 @@ describe("choice and copy_block surface proxying", () => {
174
174
  });
175
175
 
176
176
  test("ui_show passes oauth_connect data through and awaits action", async () => {
177
- const sent: ServerMessage[] = [];
177
+ const sent: AssistantEvent[] = [];
178
178
  const ctx = makeContext(sent);
179
179
 
180
180
  const result = await surfaceProxyResolver(ctx, "ui_show", {
@@ -211,7 +211,7 @@ describe("choice and copy_block surface proxying", () => {
211
211
  });
212
212
 
213
213
  test("ui_show rejects oauth_connect without providerKey", async () => {
214
- const sent: ServerMessage[] = [];
214
+ const sent: AssistantEvent[] = [];
215
215
  const ctx = makeContext(sent);
216
216
 
217
217
  const result = await surfaceProxyResolver(ctx, "ui_show", {
@@ -225,7 +225,7 @@ describe("choice and copy_block surface proxying", () => {
225
225
  });
226
226
 
227
227
  test("ui_show recovers copy_block data sent as a JSON-encoded string", async () => {
228
- const sent: ServerMessage[] = [];
228
+ const sent: AssistantEvent[] = [];
229
229
  const ctx = makeContext(sent);
230
230
 
231
231
  const result = await surfaceProxyResolver(ctx, "ui_show", {
@@ -249,7 +249,7 @@ describe("choice and copy_block surface proxying", () => {
249
249
  });
250
250
 
251
251
  test("ui_show recovers copy_block fields placed at the top level of the input", async () => {
252
- const sent: ServerMessage[] = [];
252
+ const sent: AssistantEvent[] = [];
253
253
  const ctx = makeContext(sent);
254
254
 
255
255
  const result = await surfaceProxyResolver(ctx, "ui_show", {
@@ -275,7 +275,7 @@ describe("choice and copy_block surface proxying", () => {
275
275
  });
276
276
 
277
277
  test("ui_show rejects an unknown surface_type with the valid values", async () => {
278
- const sent: ServerMessage[] = [];
278
+ const sent: AssistantEvent[] = [];
279
279
  const ctx = makeContext(sent);
280
280
 
281
281
  const result = await surfaceProxyResolver(ctx, "ui_show", {
@@ -291,7 +291,7 @@ describe("choice and copy_block surface proxying", () => {
291
291
 
292
292
  test("ui_show rejects daemon-internal surface types and omits them from the valid list", async () => {
293
293
  for (const internalType of ["skill_card", "call_summary"]) {
294
- const sent: ServerMessage[] = [];
294
+ const sent: AssistantEvent[] = [];
295
295
  const ctx = makeContext(sent);
296
296
 
297
297
  const result = await surfaceProxyResolver(ctx, "ui_show", {
@@ -325,7 +325,7 @@ describe("choice and copy_block surface proxying", () => {
325
325
  });
326
326
 
327
327
  test("uiShowTool.execute renders a copy_block whose text is at the top level", async () => {
328
- const sent: ServerMessage[] = [];
328
+ const sent: AssistantEvent[] = [];
329
329
  const ctx = makeContext(sent);
330
330
  const result = await uiShowTool.execute(
331
331
  { surface_type: "copy_block", text: "bunx vellum doctor", data: {} },
@@ -347,7 +347,7 @@ describe("choice and copy_block surface proxying", () => {
347
347
  });
348
348
 
349
349
  test("uiShowTool.execute renders a dynamic_page whose html is at the top level", async () => {
350
- const sent: ServerMessage[] = [];
350
+ const sent: AssistantEvent[] = [];
351
351
  const ctx = makeContext(sent);
352
352
  const result = await uiShowTool.execute(
353
353
  { surface_type: "dynamic_page", html: "<p>hello</p>", data: {} },