@vellumai/assistant 0.11.3 → 0.11.4-staging.1

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 (324) hide show
  1. package/ARCHITECTURE.md +11 -6
  2. package/docs/architecture/memory.md +11 -0
  3. package/docs/architecture/turn-actor.md +70 -0
  4. package/docs/flux-turn-detection-spike.md +243 -0
  5. package/docs/stt-provider-onboarding.md +3 -1
  6. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/channels.ts +11 -0
  7. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/channels.ts +11 -0
  8. package/node_modules/@vellumai/gateway-client/src/admission-policy-contract.ts +34 -0
  9. package/node_modules/@vellumai/gateway-client/src/index.ts +2 -0
  10. package/node_modules/@vellumai/service-contracts/src/channels.ts +11 -0
  11. package/openapi.yaml +140 -38
  12. package/package.json +1 -1
  13. package/scripts/voice-ttft-spike.ts +3 -3
  14. package/src/__tests__/app-compiler.test.ts +38 -3
  15. package/src/__tests__/attachments-store.test.ts +21 -12
  16. package/src/__tests__/byok-default-profile-ensure.test.ts +2 -0
  17. package/src/__tests__/call-setup-flow-name-capture.test.ts +0 -1
  18. package/src/__tests__/call-site-routing-provider.test.ts +1 -1
  19. package/src/__tests__/channel-availability-routes.test.ts +14 -1
  20. package/src/__tests__/channel-capabilities-dedupe.test.ts +214 -0
  21. package/src/__tests__/channel-delivery-store.test.ts +14 -14
  22. package/src/__tests__/config-loader-backfill.test.ts +3 -3
  23. package/src/__tests__/config-schema.test.ts +25 -10
  24. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +8 -11
  25. package/src/__tests__/conversation-agent-loop-overflow.test.ts +8 -11
  26. package/src/__tests__/conversation-agent-loop.test.ts +28 -20
  27. package/src/__tests__/conversation-attention-store.test.ts +63 -0
  28. package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +0 -4
  29. package/src/__tests__/conversation-fork-crud.test.ts +69 -0
  30. package/src/__tests__/conversation-fork-referential.test.ts +67 -0
  31. package/src/__tests__/conversation-fork-retrospective.test.ts +24 -0
  32. package/src/__tests__/conversation-notifiers-provenance.test.ts +59 -0
  33. package/src/__tests__/conversation-queue.test.ts +55 -4
  34. package/src/__tests__/conversation-runtime-assembly.test.ts +134 -102
  35. package/src/__tests__/conversation-runtime-workspace.test.ts +14 -10
  36. package/src/__tests__/credential-prompt-route.test.ts +7 -10
  37. package/src/__tests__/custom-profile-ensure.test.ts +5 -1
  38. package/src/__tests__/discord-access-request-privacy.test.ts +5 -1
  39. package/src/__tests__/discord-requester-notice-privacy.test.ts +3 -3
  40. package/src/__tests__/document-append-idempotency.test.ts +233 -0
  41. package/src/__tests__/edit-propagation.test.ts +0 -7
  42. package/src/__tests__/helpers/mock-actor-context.ts +49 -0
  43. package/src/__tests__/helpers/mock-conversation.ts +13 -1
  44. package/src/__tests__/injector-chain.test.ts +63 -41
  45. package/src/__tests__/injector-disk-pressure.test.ts +11 -23
  46. package/src/__tests__/llm-context-resolution.test.ts +73 -1
  47. package/src/__tests__/llm-schema.test.ts +5 -2
  48. package/src/__tests__/mcp-list-plugin-servers.test.ts +250 -0
  49. package/src/__tests__/memory-retrieval-hook.test.ts +6 -5
  50. package/src/__tests__/messages-read-boundary-guard.test.ts +134 -0
  51. package/src/__tests__/mtime-cache.test.ts +1 -1
  52. package/src/__tests__/non-member-access-request.test.ts +0 -20
  53. package/src/__tests__/outbound-slack-persistence.test.ts +40 -1
  54. package/src/__tests__/plugin-import-boundary-guard.test.ts +5 -0
  55. package/src/__tests__/plugin-secret-pattern-contribution.test.ts +1 -1
  56. package/src/__tests__/post-compaction-reinjection-idempotency.test.ts +14 -7
  57. package/src/__tests__/provider-commit-message-generator.test.ts +20 -0
  58. package/src/__tests__/run-conversation-turn-persistence.test.ts +434 -105
  59. package/src/__tests__/scoped-approval-grants.test.ts +11 -6
  60. package/src/__tests__/secret-ingress-channel.test.ts +0 -1
  61. package/src/__tests__/skills.test.ts +32 -0
  62. package/src/__tests__/slack-edit-ordering-characterization.test.ts +0 -1
  63. package/src/__tests__/subagent-call-site-routing.test.ts +31 -19
  64. package/src/__tests__/subagent-spawn-and-await.test.ts +14 -10
  65. package/src/__tests__/turn-events-store.test.ts +43 -0
  66. package/src/__tests__/user-plugin-loader.test.ts +1 -1
  67. package/src/__tests__/visible-app-context.test.ts +16 -9
  68. package/src/__tests__/worker-entrypoint-guards.test.ts +54 -0
  69. package/src/__tests__/worker-plugin-surface.test.ts +77 -0
  70. package/src/__tests__/workspace-migration-142-consolidate-voice-front-door.test.ts +158 -0
  71. package/src/__tests__/workspace-migration-143-repair-deprecated-codex-model-id.test.ts +133 -0
  72. package/src/__tests__/workspace-migration-144-convert-stranded-subscription-openai-profiles.test.ts +316 -0
  73. package/src/__tests__/workspace-migration-145-collapse-profile-bindings-to-entries.test.ts +325 -0
  74. package/src/acp/__tests__/acp-claude-oauth.test.ts +10 -2
  75. package/src/acp/__tests__/auth-required.test.ts +161 -0
  76. package/src/acp/acp-claude-oauth.ts +19 -2
  77. package/src/acp/agent-process.test.ts +100 -0
  78. package/src/acp/agent-process.ts +29 -26
  79. package/src/acp/auth-required.ts +102 -0
  80. package/src/acp/session-manager.test.ts +119 -0
  81. package/src/acp/session-manager.ts +68 -2
  82. package/src/api/events/acp-auth-required.ts +55 -0
  83. package/src/api/index.ts +7 -0
  84. package/src/apps/app-store.ts +3 -0
  85. package/src/bundler/package-resolver.ts +2 -30
  86. package/src/calls/__tests__/voice-session-bridge.test.ts +173 -1
  87. package/src/calls/__tests__/voice-triage-escalate.test.ts +94 -0
  88. package/src/calls/call-controller.ts +9 -2
  89. package/src/calls/call-setup-flow.ts +0 -1
  90. package/src/calls/media-stream-stt-session.ts +15 -0
  91. package/src/calls/voice-session-bridge.ts +71 -16
  92. package/src/calls/voice-triage-escalate.ts +104 -2
  93. package/src/channels/__tests__/plugin-channel-declarations.test.ts +161 -0
  94. package/src/channels/config.ts +13 -0
  95. package/src/channels/plugin-channel-declarations.ts +108 -0
  96. package/src/channels/types.ts +30 -0
  97. package/src/cli/AGENTS.md +5 -2
  98. package/src/cli/commands/credentials.help.ts +2 -2
  99. package/src/cli/commands/inference-providers.ts +1 -1
  100. package/src/cli/commands/mcp.help.ts +13 -4
  101. package/src/cli/commands/mcp.ts +9 -0
  102. package/src/cli/commands/memory/__tests__/memory-v3.test.ts +128 -5
  103. package/src/cli/commands/memory/index.help.ts +43 -1
  104. package/src/cli/commands/memory/memory-v3.ts +64 -0
  105. package/src/cli/commands/stt.help.ts +27 -2
  106. package/src/cli/lib/__tests__/upgrade-plugin.test.ts +39 -0
  107. package/src/cli/lib/bundled-marketplace.json +13 -0
  108. package/src/cli/lib/upgrade-plugin.ts +42 -0
  109. package/src/config/__tests__/default-profile-catalog.test.ts +34 -2
  110. package/src/config/__tests__/default-provider.test.ts +6 -1
  111. package/src/config/__tests__/profile-materialization.test.ts +75 -19
  112. package/src/config/bundled-skills/acp/SKILL.md +6 -7
  113. package/src/config/bundled-skills/document-editor/SKILL.md +2 -2
  114. package/src/config/bundled-skills/document-editor/TOOLS.json +2 -2
  115. package/src/config/bundled-skills/media-processing/services/preprocess.ts +14 -4
  116. package/src/config/bundled-skills/settings/TOOLS.json +3 -3
  117. package/src/config/bundled-skills/transcribe/tools/transcribe-media.test.ts +22 -1
  118. package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +9 -2
  119. package/src/config/call-site-defaults.ts +4 -5
  120. package/src/config/default-profile-catalog.ts +82 -11
  121. package/src/config/default-profile-names.ts +4 -1
  122. package/src/config/default-provider-resolution.ts +4 -0
  123. package/src/config/llm-context-resolution.ts +11 -3
  124. package/src/config/llm-resolver.ts +28 -1
  125. package/src/config/profile-materialization.ts +70 -22
  126. package/src/config/schemas/__tests__/live-voice.test.ts +107 -4
  127. package/src/config/schemas/call-site-catalog.ts +4 -4
  128. package/src/config/schemas/live-voice.ts +57 -23
  129. package/src/config/schemas/llm.ts +59 -32
  130. package/src/config/schemas/mcp.ts +23 -0
  131. package/src/config/schemas/plugin-updates.ts +6 -2
  132. package/src/config/schemas/stt.ts +1 -0
  133. package/src/context/outbound-sanitize.ts +96 -1
  134. package/src/daemon/__tests__/plugin-mcp-reconcile.test.ts +82 -0
  135. package/src/daemon/conversation-agent-loop-handlers.ts +15 -10
  136. package/src/daemon/conversation-agent-loop.ts +17 -6
  137. package/src/daemon/conversation-messaging.ts +5 -1
  138. package/src/daemon/conversation-notifiers.ts +9 -1
  139. package/src/daemon/conversation-process.ts +9 -6
  140. package/src/daemon/conversation-runtime-assembly.ts +3 -4
  141. package/src/daemon/conversation-tool-setup.ts +1 -2
  142. package/src/daemon/conversation.ts +48 -0
  143. package/src/daemon/mcp-reload-service.ts +36 -6
  144. package/src/daemon/process-message.ts +13 -3
  145. package/src/daemon/providers-setup.ts +6 -3
  146. package/src/daemon/trust-context-types.ts +29 -0
  147. package/src/daemon/wake-conversation-ops.ts +3 -2
  148. package/src/documents/document-store.ts +138 -5
  149. package/src/hooks/hook-loader.ts +3 -3
  150. package/src/hooks/registry.ts +50 -6
  151. package/src/inbound/__tests__/oauth-callback-url.test.ts +83 -0
  152. package/src/inbound/oauth-callback-url.ts +61 -0
  153. package/src/live-voice/__tests__/live-voice-agent-turn.test.ts +1 -104
  154. package/src/live-voice/__tests__/live-voice-events.test.ts +7 -8
  155. package/src/live-voice/__tests__/live-voice-flux-turn-end.test.ts +932 -0
  156. package/src/live-voice/__tests__/live-voice-metrics.test.ts +115 -8
  157. package/src/live-voice/__tests__/live-voice-photo.test.ts +100 -0
  158. package/src/live-voice/__tests__/live-voice-progress.test.ts +60 -194
  159. package/src/live-voice/__tests__/live-voice-stt.test.ts +14 -0
  160. package/src/live-voice/__tests__/live-voice-triage-escalate.test.ts +29 -0
  161. package/src/live-voice/__tests__/live-voice-tts-session.test.ts +0 -483
  162. package/src/live-voice/__tests__/live-voice-vad.test.ts +0 -16
  163. package/src/live-voice/__tests__/progress-narration.test.ts +214 -0
  164. package/src/live-voice/live-voice-archive.ts +2 -0
  165. package/src/live-voice/live-voice-metrics.ts +57 -32
  166. package/src/live-voice/live-voice-photo.ts +1 -2
  167. package/src/live-voice/live-voice-session.ts +535 -314
  168. package/src/live-voice/progress-narration.ts +277 -0
  169. package/src/live-voice/protocol.ts +21 -1
  170. package/src/mcp/__tests__/effective-config.test.ts +238 -0
  171. package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +0 -1
  172. package/src/mcp/__tests__/mcp-oauth-client-registration.test.ts +200 -0
  173. package/src/mcp/__tests__/mcp-oauth-provider.test.ts +9 -9
  174. package/src/mcp/__tests__/plugin-server-credential-isolation.test.ts +95 -0
  175. package/src/mcp/client.ts +16 -11
  176. package/src/mcp/effective-config.ts +113 -0
  177. package/src/mcp/manager.ts +11 -6
  178. package/src/mcp/mcp-auth-orchestrator.ts +13 -22
  179. package/src/mcp/mcp-oauth-provider.ts +205 -240
  180. package/src/monitoring/__tests__/plugin-auto-update.test.ts +166 -3
  181. package/src/monitoring/plugin-auto-update.ts +128 -24
  182. package/src/notifications/signal.ts +1 -0
  183. package/src/permissions/confirmation-guardian-request.test.ts +15 -11
  184. package/src/permissions/confirmation-guardian-request.ts +2 -2
  185. package/src/permissions/question-guardian-request.test.ts +14 -6
  186. package/src/permissions/question-guardian-request.ts +1 -2
  187. package/src/persistence/attachments-store.ts +8 -1
  188. package/src/persistence/bookmark-crud.ts +3 -7
  189. package/src/persistence/conversation-attention-store.ts +16 -45
  190. package/src/persistence/conversation-crud.ts +33 -4
  191. package/src/persistence/conversation-lineage.ts +9 -0
  192. package/src/persistence/conversation-queries.ts +108 -41
  193. package/src/persistence/delivery-crud.ts +38 -29
  194. package/src/persistence/external-conversation-store.ts +32 -4
  195. package/src/persistence/llm-request-log-store.ts +4 -10
  196. package/src/persistence/llm-usage-store.ts +8 -3
  197. package/src/persistence/message-reads.test.ts +197 -0
  198. package/src/persistence/message-reads.ts +211 -0
  199. package/src/persistence/migrations/366-chatgpt-subscription-row-identity.test.ts +120 -0
  200. package/src/persistence/migrations/366-chatgpt-subscription-row-identity.ts +62 -0
  201. package/src/persistence/real-user-turn-filter.ts +27 -3
  202. package/src/persistence/steps.ts +9 -0
  203. package/src/plugin-api/__tests__/oauth-callback-url-export.test.ts +29 -0
  204. package/src/plugin-api/conversation-turn.ts +168 -5
  205. package/src/plugin-api/index.ts +21 -5
  206. package/src/plugins/__tests__/mcp-servers.test.ts +371 -0
  207. package/src/plugins/defaults/memory/AGENTS.md +4 -0
  208. package/src/plugins/defaults/memory/__tests__/buffer-format.test.ts +204 -0
  209. package/src/plugins/defaults/memory/__tests__/memory-retrospective-accounting.test.ts +72 -0
  210. package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +4 -1
  211. package/src/plugins/defaults/memory/__tests__/memory-retrospective-provider-path.test.ts +4 -1
  212. package/src/plugins/defaults/memory/buffer-format.ts +165 -0
  213. package/src/plugins/defaults/memory/context-search/sources/conversations.ts +6 -0
  214. package/src/plugins/defaults/memory/graph/image-ref-utils.ts +3 -0
  215. package/src/plugins/defaults/memory/graph/tool-handlers.ts +1 -30
  216. package/src/plugins/defaults/memory/graph-topology/pending-buffer.test.ts +34 -0
  217. package/src/plugins/defaults/memory/graph-topology/pending-buffer.ts +8 -12
  218. package/src/plugins/defaults/memory/hooks/post-compact.ts +1 -4
  219. package/src/plugins/defaults/memory/indexer.ts +3 -1
  220. package/src/plugins/defaults/memory/memory-retrospective-accounting.ts +19 -7
  221. package/src/plugins/defaults/memory/src/__tests__/memory-v3-gate-stats.test.ts +281 -0
  222. package/src/plugins/defaults/memory/src/memory-v3-routes.ts +207 -0
  223. package/src/plugins/defaults/memory/substrate/__tests__/consolidation-job.test.ts +33 -0
  224. package/src/plugins/defaults/memory/substrate/__tests__/static-context.test.ts +199 -2
  225. package/src/plugins/defaults/memory/substrate/consolidation-job.ts +25 -18
  226. package/src/plugins/defaults/memory/substrate/skill-content.ts +8 -1
  227. package/src/plugins/defaults/memory/substrate/static-context.ts +160 -4
  228. package/src/plugins/defaults/memory/substrate/sweep-job.ts +2 -4
  229. package/src/plugins/defaults/memory/v1/graph/extraction.ts +3 -1
  230. package/src/plugins/defaults/memory/v3/prune.ts +2 -0
  231. package/src/plugins/defaults/memory/v3/selection-log-store.ts +2 -0
  232. package/src/plugins/defaults/memory/worker.ts +6 -3
  233. package/src/plugins/external-plugin-loader.ts +47 -0
  234. package/src/plugins/mcp-servers.ts +361 -0
  235. package/src/plugins/mtime-cache.ts +23 -49
  236. package/src/plugins/worker-plugin-surface.ts +33 -0
  237. package/src/providers/__tests__/connection-model-compat.test.ts +1 -1
  238. package/src/providers/__tests__/dispatch-connection-routing.test.ts +214 -2
  239. package/src/providers/__tests__/preflight-resolved-config.test.ts +57 -0
  240. package/src/providers/__tests__/retry-callsite.test.ts +5 -2
  241. package/src/providers/call-site-routing.ts +30 -3
  242. package/src/providers/connection-resolution.ts +194 -11
  243. package/src/providers/inference/auth.ts +6 -0
  244. package/src/providers/inference/connection-availability.ts +24 -2
  245. package/src/providers/inference/connections.ts +2 -0
  246. package/src/providers/model-intents.ts +26 -6
  247. package/src/providers/openai/codex-models.ts +2 -1
  248. package/src/providers/provider-send-message.ts +32 -3
  249. package/src/providers/speech-to-text/__tests__/deepgram-flux-frames.test.ts +433 -0
  250. package/src/providers/speech-to-text/__tests__/deepgram-flux-realtime.test.ts +620 -0
  251. package/src/providers/speech-to-text/__tests__/provider-catalog.test.ts +34 -0
  252. package/src/providers/speech-to-text/__tests__/resolve.test.ts +285 -6
  253. package/src/providers/speech-to-text/deepgram-flux-frames.ts +395 -0
  254. package/src/providers/speech-to-text/deepgram-flux-realtime.ts +719 -0
  255. package/src/providers/speech-to-text/provider-catalog.ts +99 -8
  256. package/src/providers/speech-to-text/resolve.ts +25 -2
  257. package/src/routes/worker.ts +17 -5
  258. package/src/runtime/access-request-helper.ts +9 -12
  259. package/src/runtime/agent-wake.ts +3 -3
  260. package/src/runtime/pre-first-message-gate.ts +4 -0
  261. package/src/runtime/routes/__tests__/acp-claude-auth-routes.test.ts +12 -4
  262. package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +219 -1
  263. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +52 -0
  264. package/src/runtime/routes/__tests__/default-provider-routes.test.ts +61 -0
  265. package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +44 -0
  266. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +102 -1
  267. package/src/runtime/routes/__tests__/plugins-routes.test.ts +44 -0
  268. package/src/runtime/routes/__tests__/stt-routes.test.ts +25 -0
  269. package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +62 -1
  270. package/src/runtime/routes/channel-availability-routes.ts +32 -14
  271. package/src/runtime/routes/channel-route-shared.ts +0 -6
  272. package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +6 -6
  273. package/src/runtime/routes/conversation-list-routes.ts +112 -1
  274. package/src/runtime/routes/conversation-query-routes.ts +40 -27
  275. package/src/runtime/routes/credential-prompt-routes.ts +4 -7
  276. package/src/runtime/routes/default-provider-routes.ts +15 -0
  277. package/src/runtime/routes/inbound-message-handler.ts +17 -41
  278. package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +0 -1
  279. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +0 -9
  280. package/src/runtime/routes/inbound-stages/admission-policy.ts +1 -17
  281. package/src/runtime/routes/inbound-stages/bootstrap-intercept.test.ts +0 -1
  282. package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +2 -3
  283. package/src/runtime/routes/inbound-stages/edit-intercept.ts +1 -3
  284. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +0 -1
  285. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +3 -4
  286. package/src/runtime/routes/inbound-stages/reaction-intercept.test.ts +0 -1
  287. package/src/runtime/routes/inbound-stages/reaction-intercept.ts +11 -20
  288. package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +2 -3
  289. package/src/runtime/routes/inference-profiles-routes.ts +20 -11
  290. package/src/runtime/routes/inference-provider-connection-routes.ts +77 -15
  291. package/src/runtime/routes/log-export-routes.ts +3 -0
  292. package/src/runtime/routes/mcp-auth-routes.ts +148 -57
  293. package/src/runtime/routes/plugins-routes.ts +21 -3
  294. package/src/runtime/routes/stt-routes.ts +31 -25
  295. package/src/runtime/routes/surface-conversation-resolver.ts +3 -0
  296. package/src/runtime/routes/user-route-dispatcher.ts +39 -14
  297. package/src/runtime/routes/user-route-import.ts +108 -0
  298. package/src/schedule/worker.ts +6 -0
  299. package/src/security/oauth2.ts +6 -22
  300. package/src/stt/__tests__/daemon-batch-transcriber.test.ts +22 -0
  301. package/src/stt/__tests__/types.test.ts +94 -0
  302. package/src/stt/daemon-batch-transcriber.ts +10 -0
  303. package/src/stt/stt-stream-session.ts +8 -4
  304. package/src/stt/types.ts +103 -0
  305. package/src/subagent/manager.ts +1 -3
  306. package/src/subagent/types.ts +7 -6
  307. package/src/tools/acp/spawn.test.ts +97 -0
  308. package/src/tools/acp/spawn.ts +32 -0
  309. package/src/tools/document/document-tool.ts +12 -3
  310. package/src/tools/registry.ts +2 -1
  311. package/src/tools/workflows/run-workflow.ts +1 -2
  312. package/src/tts/__tests__/reasoning-tag-filter.test.ts +63 -0
  313. package/src/tts/reasoning-tag-filter.ts +110 -0
  314. package/src/workspace/byok-default-profile-ensure.ts +61 -18
  315. package/src/workspace/custom-profile-ensure.ts +4 -24
  316. package/src/workspace/migrations/142-consolidate-voice-front-door.ts +70 -0
  317. package/src/workspace/migrations/143-repair-deprecated-codex-model-id.ts +134 -0
  318. package/src/workspace/migrations/144-convert-stranded-subscription-openai-profiles.ts +265 -0
  319. package/src/workspace/migrations/145-collapse-profile-bindings-to-entries.ts +328 -0
  320. package/src/workspace/migrations/__tests__/141-stt-english-default-to-multilingual.test.ts +0 -10
  321. package/src/workspace/migrations/registry.ts +8 -0
  322. package/src/workspace/provider-commit-message-generator.ts +7 -5
  323. package/src/live-voice/__tests__/front-decision.test.ts +0 -645
  324. package/src/live-voice/front-decision.ts +0 -476
@@ -501,7 +501,6 @@ describe("access-request-helper unit tests", () => {
501
501
 
502
502
  test("notifyGuardianOfAccessRequest returns no_sender_id when actorExternalId is absent", async () => {
503
503
  const result = await notifyGuardianOfAccessRequest({
504
- canonicalAssistantId: "self",
505
504
  sourceChannel: "telegram",
506
505
  conversationExternalId: "chat-123",
507
506
  actorExternalId: undefined,
@@ -522,7 +521,6 @@ describe("access-request-helper unit tests", () => {
522
521
 
523
522
  test("notifyGuardianOfAccessRequest creates request with self-healed principal when no binding exists", async () => {
524
523
  const result = await notifyGuardianOfAccessRequest({
525
- canonicalAssistantId: "self",
526
524
  sourceChannel: "telegram",
527
525
  conversationExternalId: "chat-123",
528
526
  actorExternalId: "unknown-user",
@@ -565,7 +563,6 @@ describe("access-request-helper unit tests", () => {
565
563
  });
566
564
 
567
565
  const result = await notifyGuardianOfAccessRequest({
568
- canonicalAssistantId: "self",
569
566
  sourceChannel: "telegram",
570
567
  conversationExternalId: "tg-chat",
571
568
  actorExternalId: "unknown-tg-user",
@@ -619,7 +616,6 @@ describe("access-request-helper unit tests", () => {
619
616
  });
620
617
 
621
618
  const result = await notifyGuardianOfAccessRequest({
622
- canonicalAssistantId: "self",
623
619
  sourceChannel: "telegram",
624
620
  conversationExternalId: "chat-123",
625
621
  actorExternalId: "unknown-user",
@@ -660,7 +656,6 @@ describe("access-request-helper unit tests", () => {
660
656
  });
661
657
 
662
658
  const result = await notifyGuardianOfAccessRequest({
663
- canonicalAssistantId: "self",
664
659
  sourceChannel: "telegram",
665
660
  conversationExternalId: "chat-123",
666
661
  actorExternalId: "unknown-user",
@@ -688,7 +683,6 @@ describe("access-request-helper unit tests", () => {
688
683
  test("notifyGuardianOfAccessRequest resolves the vellum anchor from the gateway delivery", async () => {
689
684
  // Only the vellum anchor (seeded in resetState) is served by the gateway.
690
685
  const result = await notifyGuardianOfAccessRequest({
691
- canonicalAssistantId: "self",
692
686
  sourceChannel: "telegram",
693
687
  conversationExternalId: "chat-123",
694
688
  actorExternalId: "unknown-user",
@@ -722,7 +716,6 @@ describe("access-request-helper unit tests", () => {
722
716
 
723
717
  await expect(
724
718
  notifyGuardianOfAccessRequest({
725
- canonicalAssistantId: "self",
726
719
  sourceChannel: "telegram",
727
720
  conversationExternalId: "chat-123",
728
721
  actorExternalId: "unknown-user",
@@ -739,7 +732,6 @@ describe("access-request-helper unit tests", () => {
739
732
 
740
733
  test("notifyGuardianOfAccessRequest for voice channel includes actorDisplayName in contextPayload", async () => {
741
734
  const result = await notifyGuardianOfAccessRequest({
742
- canonicalAssistantId: "self",
743
735
  sourceChannel: "phone",
744
736
  conversationExternalId: "+15559998888",
745
737
  actorExternalId: "+15559998888",
@@ -770,7 +762,6 @@ describe("access-request-helper unit tests", () => {
770
762
 
771
763
  test("notifyGuardianOfAccessRequest includes requestCode in contextPayload", async () => {
772
764
  const result = await notifyGuardianOfAccessRequest({
773
- canonicalAssistantId: "self",
774
765
  sourceChannel: "telegram",
775
766
  conversationExternalId: "chat-123",
776
767
  actorExternalId: "unknown-user",
@@ -794,7 +785,6 @@ describe("access-request-helper unit tests", () => {
794
785
  // is created and the status is forwarded to the card payload. (A `revoked`
795
786
  // status would instead suppress — covered by the keep-out tests.)
796
787
  const result = await notifyGuardianOfAccessRequest({
797
- canonicalAssistantId: "self",
798
788
  sourceChannel: "telegram",
799
789
  conversationExternalId: "chat-123",
800
790
  actorExternalId: "pending-user",
@@ -834,7 +824,6 @@ describe("access-request-helper unit tests", () => {
834
824
  };
835
825
 
836
826
  const result = await notifyGuardianOfAccessRequest({
837
- canonicalAssistantId: "self",
838
827
  sourceChannel: "phone",
839
828
  conversationExternalId: "+15556667777",
840
829
  actorExternalId: "+15556667777",
@@ -897,7 +886,6 @@ describe("access-request-helper unit tests", () => {
897
886
  };
898
887
 
899
888
  const result = await notifyGuardianOfAccessRequest({
900
- canonicalAssistantId: "self",
901
889
  sourceChannel: "telegram",
902
890
  conversationExternalId: "chat-123",
903
891
  actorExternalId: "unknown-user",
@@ -929,7 +917,6 @@ describe("access-request-helper unit tests", () => {
929
917
  // request row. A revoked/blocked contact is deliberately kept out — no new
930
918
  // prompt, signal, or pending request.
931
919
  const result = await notifyGuardianOfAccessRequest({
932
- canonicalAssistantId: "self",
933
920
  sourceChannel: "telegram",
934
921
  conversationExternalId: "chat-kept-out",
935
922
  actorExternalId: "revoked-user",
@@ -969,7 +956,6 @@ describe("access-request-helper unit tests", () => {
969
956
  });
970
957
 
971
958
  const result = await notifyGuardianOfAccessRequest({
972
- canonicalAssistantId: "self",
973
959
  sourceChannel: "telegram",
974
960
  conversationExternalId: "chat-parked",
975
961
  actorExternalId: "parked-user",
@@ -1006,7 +992,6 @@ describe("access-request-helper unit tests", () => {
1006
992
  });
1007
993
 
1008
994
  const result = await notifyGuardianOfAccessRequest({
1009
- canonicalAssistantId: "self",
1010
995
  sourceChannel: "telegram",
1011
996
  conversationExternalId: "chat-approved",
1012
997
  actorExternalId: "approved-user",
@@ -1047,7 +1032,6 @@ describe("access-request-helper unit tests", () => {
1047
1032
  bridgeState.requests.get(requestId)!.updatedAt = staleUpdatedAt;
1048
1033
 
1049
1034
  const result = await notifyGuardianOfAccessRequest({
1050
- canonicalAssistantId: "self",
1051
1035
  sourceChannel: "telegram",
1052
1036
  conversationExternalId: "chat-stale",
1053
1037
  actorExternalId: "stale-user",
@@ -1082,7 +1066,6 @@ describe("access-request-helper unit tests", () => {
1082
1066
  });
1083
1067
 
1084
1068
  const result = await notifyGuardianOfAccessRequest({
1085
- canonicalAssistantId: "self",
1086
1069
  sourceChannel: "telegram",
1087
1070
  conversationExternalId: "chat-flip",
1088
1071
  actorExternalId: "flip-user",
@@ -1101,7 +1084,6 @@ describe("access-request-helper unit tests", () => {
1101
1084
  // Suppression is scoped to the sender via their own contact status, so a
1102
1085
  // kept-out contact never bleeds into a different sender's prompt.
1103
1086
  const keptOut = await notifyGuardianOfAccessRequest({
1104
- canonicalAssistantId: "self",
1105
1087
  sourceChannel: "telegram",
1106
1088
  conversationExternalId: "chat-kept",
1107
1089
  actorExternalId: "revoked-user",
@@ -1112,7 +1094,6 @@ describe("access-request-helper unit tests", () => {
1112
1094
 
1113
1095
  // A different sender with no keep-out still gets a fresh prompt.
1114
1096
  const result = await notifyGuardianOfAccessRequest({
1115
- canonicalAssistantId: "self",
1116
1097
  sourceChannel: "telegram",
1117
1098
  conversationExternalId: "chat-fresh",
1118
1099
  actorExternalId: "fresh-user",
@@ -1141,7 +1122,6 @@ describe("maybeNotifyGuardianOfAdmittedContact", () => {
1141
1122
  });
1142
1123
 
1143
1124
  const baseParams = {
1144
- canonicalAssistantId: "self",
1145
1125
  sourceChannel: "telegram" as const,
1146
1126
  conversationExternalId: "chat-123",
1147
1127
  actorExternalId: "user-unknown-456",
@@ -103,7 +103,10 @@ mock.module("../persistence/conversation-crud.js", () => ({
103
103
  },
104
104
  // The handler treats provenance as a flat spread; returning {} keeps the
105
105
  // metadata snapshot focused on the fields under test.
106
- provenanceFromTrustContext: () => ({}),
106
+ // Mirrors the real mapping so provenance assertions observe what production
107
+ // stamps rather than a placeholder.
108
+ provenanceFromTrustContext: (ctx?: { trustClass?: string }) =>
109
+ ctx ? { provenanceTrustClass: ctx.trustClass } : {},
107
110
  reserveMessage: mock(
108
111
  async (
109
112
  conversationId: string,
@@ -187,6 +190,8 @@ function makeDeps(
187
190
  requesterTimezoneLabel?: string;
188
191
  clientTimezone?: string;
189
192
  sourceThreadId?: string;
193
+ /** Turn-local trust; when set, the live slot below diverges from it. */
194
+ currentTurnTrustContext?: Record<string, unknown>;
190
195
  } = {},
191
196
  ): EventHandlerDeps {
192
197
  const assistantMessageChannel = overrides.assistantMessageChannel ?? "slack";
@@ -195,6 +200,7 @@ function makeDeps(
195
200
  conversationId,
196
201
  provider: { name: "anthropic" },
197
202
  currentTurnSurfaces: [],
203
+ currentTurnTrustContext: overrides.currentTurnTrustContext,
198
204
  trustContext: {
199
205
  sourceChannel: assistantMessageChannel,
200
206
  trustClass: "guardian",
@@ -439,6 +445,39 @@ describe("outbound assistant Slack metadata persistence", () => {
439
445
  expect(slackMeta.channelTs).toBeUndefined();
440
446
  });
441
447
 
448
+ test("envelope resolves from the turn's actor when the slot has moved", async () => {
449
+ // Provenance class and Slack routing must come from ONE actor: the turn's.
450
+ // A queued Slack turn runs while the guardian has since written the live
451
+ // slot; the assistant row must carry the sender's class AND the sender's
452
+ // channel/thread, not a mixed envelope.
453
+ const conversationId = "conv-slack-moved-slot";
454
+ const deps = makeDeps(conversationId, {
455
+ assistantMessageChannel: "slack",
456
+ // Live slot: the guardian, on a different chat, no thread.
457
+ requesterChatId: "C-GUARDIAN",
458
+ currentTurnTrustContext: {
459
+ sourceChannel: "slack",
460
+ trustClass: "trusted_contact",
461
+ requesterChatId: "C-CONTACT",
462
+ sourceThreadId: "1723300000.000100",
463
+ },
464
+ });
465
+ await handleLlmCallStarted(state, deps);
466
+ await handleMessageComplete(
467
+ state,
468
+ deps,
469
+ makeMessageCompleteEvent("reply to the contact"),
470
+ );
471
+
472
+ const persisted = lastAssistantPersisted();
473
+ expect(persisted.metadata?.provenanceTrustClass).toBe("trusted_contact");
474
+ const slackMeta = JSON.parse(
475
+ persisted.metadata?.slackMeta as string,
476
+ ) as Record<string, unknown>;
477
+ expect(slackMeta.channelId).toBe("C-CONTACT");
478
+ expect(slackMeta.threadTs).toBe("1723300000.000100");
479
+ });
480
+
442
481
  test("ignores a non-ts sourceThreadId", async () => {
443
482
  const conversationId = "conv-slack-bad-thread";
444
483
  const channelId = "C789BAD";
@@ -234,6 +234,11 @@ const BASELINE: Record<string, readonly string[]> = {
234
234
  "../../../util/worker-memory.js",
235
235
  "../../../util/worker-process.js",
236
236
  "../../types.js",
237
+ // The memory jobs worker runs as its own OS process and hosts real agent
238
+ // conversations, so it registers the host's default-plugin hook and
239
+ // injector surface at startup (hooks only, no init hooks). Host-owned
240
+ // composition with no plugin-api equivalent.
241
+ "../../worker-plugin-surface.js",
237
242
  "../injection-presence.js",
238
243
  "../injector-order.js",
239
244
  "@qdrant/js-client-rest",
@@ -34,8 +34,8 @@ import {
34
34
  } from "bun:test";
35
35
 
36
36
  import { bootstrapPlugins } from "../daemon/external-plugins-bootstrap.js";
37
+ import { getUserHooksFor } from "../hooks/registry.js";
37
38
  import {
38
- getUserHooksFor,
39
39
  populateCacheAtBoot,
40
40
  reconcilePluginSourcesNow,
41
41
  resetPluginCacheForTests,
@@ -20,6 +20,7 @@ import { applyRuntimeInjections } from "../daemon/conversation-runtime-assembly.
20
20
  import { registerDefaultPluginInjectors } from "../plugins/defaults/index.js";
21
21
  import { stripTailInjectionsForReinjection } from "../plugins/defaults/memory/tail-reinjection-strip.js";
22
22
  import type { Message } from "../providers/types.js";
23
+ import { asConversation } from "./helpers/mock-conversation.js";
23
24
 
24
25
  // Populate the injector registry with the default plugins' injectors the way
25
26
  // bootstrap does in production, so `applyRuntimeInjections` walks a non-empty
@@ -160,13 +161,19 @@ describe("applyRuntimeInjections re-injection idempotency", () => {
160
161
  // a frozen temporal snapshot so the non-presence-gated `<turn_context>` block
161
162
  // is produced every assembly.
162
163
  function seedConversation(): void {
163
- setConversation(FALLBACK_CONVERSATION_ID, {
164
- conversationId: FALLBACK_CONVERSATION_ID,
165
- workingDir: "/sandbox",
166
- workspaceTopLevelContext: WORKSPACE_BLOCK,
167
- workspaceTopLevelDirty: false,
168
- currentTurnTemporalSnapshot: { clientTimezone: null },
169
- } as never);
164
+ setConversation(
165
+ FALLBACK_CONVERSATION_ID,
166
+ asConversation({
167
+ conversationId: FALLBACK_CONVERSATION_ID,
168
+ workingDir: "/sandbox",
169
+ workspaceTopLevelContext: WORKSPACE_BLOCK,
170
+ workspaceTopLevelDirty: false,
171
+ currentTurnTemporalSnapshot: {
172
+ clientTimezone: null,
173
+ timeSinceLastMessage: null,
174
+ },
175
+ }),
176
+ );
170
177
  }
171
178
 
172
179
  afterEach(() => {
@@ -62,6 +62,7 @@ const mockProvider: Provider = {
62
62
  let resolvedProvider: {
63
63
  provider: Provider;
64
64
  configuredProviderName: string;
65
+ entryRouted?: boolean;
65
66
  } | null = {
66
67
  provider: mockProvider,
67
68
  configuredProviderName: "anthropic",
@@ -352,4 +353,23 @@ describe("ProviderCommitMessageGenerator", () => {
352
353
  expect(result.source).toBe("llm");
353
354
  expect(result.message).toBe(commitMsg);
354
355
  });
356
+
357
+ // 14. Entry-routed profile — the row's own credential signed resolution,
358
+ // so no generic per-vendor key needs to exist for the preflight to pass.
359
+ test("entry-routed result — skips the vendor API-key preflight", async () => {
360
+ mockSecureKeys = {};
361
+ resolvedProvider = {
362
+ provider: mockProvider,
363
+ configuredProviderName: "anthropic",
364
+ entryRouted: true,
365
+ };
366
+ const commitMsg = "fix: entry-route commit";
367
+ mockSendMessage.mockResolvedValueOnce(makeSuccessResponse(commitMsg));
368
+ const gen = getCommitMessageGenerator();
369
+ const result = await gen.generateCommitMessage(baseContext, {
370
+ changedFiles: baseContext.changedFiles,
371
+ });
372
+ expect(result.source).toBe("llm");
373
+ expect(result.message).toBe(commitMsg);
374
+ });
355
375
  });