@vellumai/assistant 0.11.3 → 0.11.4-dev.202608190019.b94dbf2

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 (596) hide show
  1. package/AGENTS.md +9 -3
  2. package/ARCHITECTURE.md +32 -10
  3. package/docs/architecture/memory.md +43 -5
  4. package/docs/architecture/security.md +96 -152
  5. package/docs/architecture/turn-actor.md +70 -0
  6. package/docs/browser-use-architecture-phase2.md +128 -56
  7. package/docs/flux-turn-detection-spike.md +248 -0
  8. package/docs/guardian-request-flow.md +35 -0
  9. package/docs/stt-provider-onboarding.md +3 -1
  10. package/knip.json +3 -0
  11. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +1 -0
  12. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/url-normalization.test.ts +135 -0
  13. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/channels.ts +11 -0
  14. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
  15. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +60 -0
  16. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/url-normalization.ts +107 -0
  17. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +1 -0
  18. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/url-normalization.test.ts +135 -0
  19. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/channels.ts +11 -0
  20. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
  21. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +60 -0
  22. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/url-normalization.ts +107 -0
  23. package/node_modules/@vellumai/gateway-client/src/admission-policy-contract.ts +34 -0
  24. package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +166 -1
  25. package/node_modules/@vellumai/gateway-client/src/index.ts +2 -0
  26. package/node_modules/@vellumai/service-contracts/package.json +1 -0
  27. package/node_modules/@vellumai/service-contracts/src/__tests__/url-normalization.test.ts +135 -0
  28. package/node_modules/@vellumai/service-contracts/src/channels.ts +11 -0
  29. package/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
  30. package/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +60 -0
  31. package/node_modules/@vellumai/service-contracts/src/url-normalization.ts +107 -0
  32. package/openapi.yaml +289 -113
  33. package/package.json +1 -1
  34. package/scripts/voice-ttft-spike.ts +3 -3
  35. package/scripts/write-plugin-api-shim.ts +10 -0
  36. package/src/__tests__/app-compiler.test.ts +38 -3
  37. package/src/__tests__/app-control-flow.test.ts +1 -0
  38. package/src/__tests__/approval-routes-http.test.ts +2 -2
  39. package/src/__tests__/assistant-feature-flag-guard.test.ts +25 -3
  40. package/src/__tests__/attachments-store.test.ts +21 -12
  41. package/src/__tests__/byok-default-profile-ensure.test.ts +17 -0
  42. package/src/__tests__/call-setup-flow-name-capture.test.ts +0 -1
  43. package/src/__tests__/call-site-routing-provider.test.ts +1 -1
  44. package/src/__tests__/channel-availability-routes.test.ts +14 -1
  45. package/src/__tests__/channel-capabilities-dedupe.test.ts +214 -0
  46. package/src/__tests__/channel-delivery-store.test.ts +14 -14
  47. package/src/__tests__/channel-inbound-disk-pressure.test.ts +4 -4
  48. package/src/__tests__/channel-setup-panel-ack.test.ts +1 -1
  49. package/src/__tests__/checker.test.ts +20 -314
  50. package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +6 -2
  51. package/src/__tests__/compaction-events.test.ts +8 -10
  52. package/src/__tests__/config-loader-backfill.test.ts +3 -3
  53. package/src/__tests__/config-schema.test.ts +25 -10
  54. package/src/__tests__/context-search-memory-v2-source.test.ts +0 -1
  55. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +8 -11
  56. package/src/__tests__/conversation-agent-loop-overflow.test.ts +8 -11
  57. package/src/__tests__/conversation-agent-loop.test.ts +32 -21
  58. package/src/__tests__/conversation-attachments.test.ts +0 -1
  59. package/src/__tests__/conversation-attention-store.test.ts +63 -0
  60. package/src/__tests__/conversation-confirmation-signals.test.ts +112 -0
  61. package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +0 -4
  62. package/src/__tests__/conversation-fork-crud.test.ts +69 -0
  63. package/src/__tests__/conversation-fork-referential.test.ts +67 -0
  64. package/src/__tests__/conversation-fork-retrospective.test.ts +24 -0
  65. package/src/__tests__/conversation-load-history-repair.test.ts +209 -0
  66. package/src/__tests__/conversation-notifiers-provenance.test.ts +59 -0
  67. package/src/__tests__/conversation-queue.test.ts +154 -4
  68. package/src/__tests__/conversation-routes-disk-view.test.ts +1 -1
  69. package/src/__tests__/conversation-routes-enabled-plugins.test.ts +1 -1
  70. package/src/__tests__/conversation-routes-guardian-reply.test.ts +9 -9
  71. package/src/__tests__/conversation-routes-hidden-queue.test.ts +1 -1
  72. package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -1
  73. package/src/__tests__/conversation-runtime-assembly.test.ts +187 -102
  74. package/src/__tests__/conversation-runtime-workspace.test.ts +14 -10
  75. package/src/__tests__/conversation-slash-queue.test.ts +3 -0
  76. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +1 -0
  77. package/src/__tests__/conversation-surfaces-activation-emit.test.ts +1 -0
  78. package/src/__tests__/conversation-surfaces-app-control.test.ts +1 -0
  79. package/src/__tests__/conversation-surfaces-app-open.test.ts +1 -1
  80. package/src/__tests__/conversation-surfaces-data-persist.test.ts +1 -1
  81. package/src/__tests__/conversation-surfaces-history-restored-completion.test.ts +21 -14
  82. package/src/__tests__/conversation-surfaces-queued-emit.test.ts +1 -0
  83. package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +1 -0
  84. package/src/__tests__/conversation-surfaces-standalone.test.ts +1 -0
  85. package/src/__tests__/conversation-surfaces-state-update.test.ts +1 -1
  86. package/src/__tests__/conversation-surfaces-table-action.test.ts +1 -1
  87. package/src/__tests__/conversation-surfaces-task-progress.test.ts +1 -1
  88. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +1 -1
  89. package/src/__tests__/conversation-tool-setup-attribution.test.ts +1 -1
  90. package/src/__tests__/credential-prompt-route.test.ts +7 -10
  91. package/src/__tests__/credential-security-invariants.test.ts +1 -0
  92. package/src/__tests__/cu-unified-flow.test.ts +1 -0
  93. package/src/__tests__/custom-profile-ensure.test.ts +5 -1
  94. package/src/__tests__/default-plugin-names-guard.test.ts +12 -1
  95. package/src/__tests__/discord-access-request-privacy.test.ts +5 -1
  96. package/src/__tests__/discord-requester-notice-privacy.test.ts +3 -3
  97. package/src/__tests__/document-append-idempotency.test.ts +233 -0
  98. package/src/__tests__/document-sync-tags.test.ts +0 -75
  99. package/src/__tests__/dynamic-skill-background-guard.test.ts +0 -2
  100. package/src/__tests__/edit-propagation.test.ts +107 -11
  101. package/src/__tests__/file-ops-service.test.ts +163 -30
  102. package/src/__tests__/filesystem-tools.test.ts +23 -24
  103. package/src/__tests__/gateway-only-guard.test.ts +2 -5
  104. package/src/__tests__/helpers/gateway-classify-mock.ts +27 -6
  105. package/src/__tests__/helpers/mock-actor-context.ts +49 -0
  106. package/src/__tests__/helpers/mock-conversation.ts +13 -1
  107. package/src/__tests__/host-file-read-tool.test.ts +16 -19
  108. package/src/__tests__/http-user-message-parity.test.ts +1 -1
  109. package/src/__tests__/init-feature-flag-overrides.test.ts +49 -0
  110. package/src/__tests__/injector-chain.test.ts +63 -41
  111. package/src/__tests__/injector-disk-pressure.test.ts +11 -23
  112. package/src/__tests__/inline-skill-load-permissions.test.ts +47 -36
  113. package/src/__tests__/llm-context-resolution.test.ts +73 -1
  114. package/src/__tests__/llm-schema.test.ts +5 -2
  115. package/src/__tests__/managed-skill-lifecycle.test.ts +7 -0
  116. package/src/__tests__/mcp-list-plugin-servers.test.ts +250 -0
  117. package/src/__tests__/media-generate-image.test.ts +131 -21
  118. package/src/__tests__/memory-retrieval-hook.test.ts +100 -7
  119. package/src/__tests__/messages-read-boundary-guard.test.ts +134 -0
  120. package/src/__tests__/mtime-cache.test.ts +3 -1
  121. package/src/__tests__/non-member-access-request.test.ts +0 -20
  122. package/src/__tests__/outbound-slack-persistence.test.ts +40 -1
  123. package/src/__tests__/platform-bash-auto-approve.test.ts +0 -4
  124. package/src/__tests__/plugin-api-store-credential.test.ts +261 -0
  125. package/src/__tests__/plugin-api-webhook-url.test.ts +10 -7
  126. package/src/__tests__/plugin-disabled-state.test.ts +2 -0
  127. package/src/__tests__/plugin-effective-enabled-set.test.ts +55 -3
  128. package/src/__tests__/plugin-execution-context.test.ts +73 -0
  129. package/src/__tests__/plugin-import-boundary-guard.test.ts +5 -1
  130. package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +7 -4
  131. package/src/__tests__/plugin-secret-pattern-contribution.test.ts +1 -1
  132. package/src/__tests__/post-compaction-reinjection-idempotency.test.ts +14 -7
  133. package/src/__tests__/provider-commit-message-generator.test.ts +20 -0
  134. package/src/__tests__/proxy-approval-callback.test.ts +1 -0
  135. package/src/__tests__/qdrant-manager.test.ts +14 -1
  136. package/src/__tests__/reaction-persistence.test.ts +200 -7
  137. package/src/__tests__/require-fresh-approval.test.ts +0 -4
  138. package/src/__tests__/risk-classification-boundary-guard.test.ts +115 -0
  139. package/src/__tests__/run-conversation-turn-persistence.test.ts +460 -105
  140. package/src/__tests__/run-due-schedules.test.ts +21 -0
  141. package/src/__tests__/scaffold-managed-skill-tool.test.ts +187 -18
  142. package/src/__tests__/schedule-routes.test.ts +23 -0
  143. package/src/__tests__/schedule-store.test.ts +17 -0
  144. package/src/__tests__/scoped-approval-grants.test.ts +11 -6
  145. package/src/__tests__/secret-ingress-channel.test.ts +0 -1
  146. package/src/__tests__/secret-ingress-http.test.ts +1 -1
  147. package/src/__tests__/send-endpoint-busy.test.ts +3 -3
  148. package/src/__tests__/skills.test.ts +32 -0
  149. package/src/__tests__/slack-edit-ordering-characterization.test.ts +0 -1
  150. package/src/__tests__/starter-task-flow.test.ts +5 -4
  151. package/src/__tests__/subagent-call-site-routing.test.ts +31 -19
  152. package/src/__tests__/subagent-fork-prompt-role.test.ts +1 -1
  153. package/src/__tests__/subagent-spawn-and-await.test.ts +18 -17
  154. package/src/__tests__/subagent-tool-gate-mode.test.ts +1 -1
  155. package/src/__tests__/subagent-tools.test.ts +81 -101
  156. package/src/__tests__/surface-completion-in-flight-snapshot.test.ts +1 -0
  157. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +1 -1
  158. package/src/__tests__/tool-executor-lifecycle-events.test.ts +132 -5
  159. package/src/__tests__/tool-executor.test.ts +68 -39
  160. package/src/__tests__/turn-events-store.test.ts +43 -0
  161. package/src/__tests__/ui-choice-copy-surfaces.test.ts +1 -1
  162. package/src/__tests__/ui-shape-teaching.test.ts +33 -0
  163. package/src/__tests__/ui-visual-surface.test.ts +1 -1
  164. package/src/__tests__/ui-voice-picker-surface.test.ts +128 -0
  165. package/src/__tests__/ui-work-result-surface.test.ts +1 -1
  166. package/src/__tests__/user-plugin-loader.test.ts +3 -1
  167. package/src/__tests__/verification-control-plane-policy.test.ts +0 -2
  168. package/src/__tests__/visible-app-context.test.ts +16 -9
  169. package/src/__tests__/voice-config-update.test.ts +40 -0
  170. package/src/__tests__/voice-scoped-grant-consumer.test.ts +5 -3
  171. package/src/__tests__/voice-session-bridge.test.ts +85 -29
  172. package/src/__tests__/worker-entrypoint-guards.test.ts +54 -0
  173. package/src/__tests__/worker-plugin-surface.test.ts +77 -0
  174. package/src/__tests__/workspace-migration-142-consolidate-voice-front-door.test.ts +158 -0
  175. package/src/__tests__/workspace-migration-143-repair-deprecated-codex-model-id.test.ts +133 -0
  176. package/src/__tests__/workspace-migration-144-convert-stranded-subscription-openai-profiles.test.ts +316 -0
  177. package/src/__tests__/workspace-migration-145-collapse-profile-bindings-to-entries.test.ts +325 -0
  178. package/src/__tests__/workspace-migration-146-repair-retired-fireworks-deepseek-flash-model-id.test.ts +235 -0
  179. package/src/acp/__tests__/acp-claude-oauth.test.ts +10 -2
  180. package/src/acp/__tests__/auth-required.test.ts +161 -0
  181. package/src/acp/acp-claude-oauth.ts +19 -2
  182. package/src/acp/agent-process.test.ts +100 -0
  183. package/src/acp/agent-process.ts +29 -26
  184. package/src/acp/auth-required.ts +102 -0
  185. package/src/acp/session-manager.test.ts +119 -0
  186. package/src/acp/session-manager.ts +76 -3
  187. package/src/api/events/acp-auth-required.ts +55 -0
  188. package/src/api/events/host-file.ts +2 -2
  189. package/src/api/index.ts +7 -0
  190. package/src/api/surfaces.ts +12 -3
  191. package/src/apps/app-store.ts +3 -0
  192. package/src/bundler/package-resolver.ts +2 -30
  193. package/src/calls/__tests__/voice-session-bridge.test.ts +194 -11
  194. package/src/calls/__tests__/voice-triage-escalate.test.ts +102 -0
  195. package/src/calls/call-controller.ts +19 -3
  196. package/src/calls/call-setup-flow.ts +0 -1
  197. package/src/calls/media-stream-stt-session.ts +15 -0
  198. package/src/calls/voice-session-bridge.ts +115 -41
  199. package/src/calls/voice-triage-escalate.ts +105 -2
  200. package/src/channels/__tests__/plugin-channel-declarations.test.ts +161 -0
  201. package/src/channels/config.ts +13 -0
  202. package/src/channels/plugin-channel-declarations.ts +108 -0
  203. package/src/channels/types.ts +30 -0
  204. package/src/cli/AGENTS.md +5 -2
  205. package/src/cli/bundled-modules.ts +29 -0
  206. package/src/cli/commands/credentials.help.ts +2 -2
  207. package/src/cli/commands/db/repair.ts +4 -8
  208. package/src/cli/commands/domain.ts +6 -3
  209. package/src/cli/commands/email.ts +6 -3
  210. package/src/cli/commands/inference-providers.ts +1 -1
  211. package/src/cli/commands/keys.ts +8 -3
  212. package/src/cli/commands/mcp.help.ts +13 -4
  213. package/src/cli/commands/mcp.ts +9 -0
  214. package/src/cli/commands/memory/__tests__/memory-v2.test.ts +57 -7
  215. package/src/cli/commands/memory/__tests__/memory-v3.test.ts +128 -5
  216. package/src/cli/commands/memory/index.help.ts +84 -28
  217. package/src/cli/commands/memory/index.ts +2 -0
  218. package/src/cli/commands/memory/memory-v2.ts +58 -54
  219. package/src/cli/commands/memory/memory-v3.ts +64 -0
  220. package/src/cli/commands/memory/memory-validate.ts +18 -0
  221. package/src/cli/commands/plugins.ts +85 -36
  222. package/src/cli/commands/schedules.ts +35 -1
  223. package/src/cli/commands/stt.help.ts +27 -2
  224. package/src/cli/commands/trust.ts +3 -14
  225. package/src/cli/lib/__tests__/upgrade-plugin.test.ts +39 -0
  226. package/src/cli/lib/bundled-marketplace.json +14 -1
  227. package/src/cli/lib/upgrade-plugin.ts +42 -0
  228. package/src/config/__tests__/balanced-model-experiment.test.ts +278 -0
  229. package/src/config/__tests__/default-profile-catalog.test.ts +34 -2
  230. package/src/config/__tests__/default-provider.test.ts +6 -1
  231. package/src/config/__tests__/profile-materialization.test.ts +75 -19
  232. package/src/config/assistant-feature-flags.ts +36 -15
  233. package/src/config/balanced-model-experiment.ts +35 -0
  234. package/src/config/bundled-skills/acp/SKILL.md +6 -7
  235. package/src/config/bundled-skills/document-editor/SKILL.md +2 -2
  236. package/src/config/bundled-skills/document-editor/TOOLS.json +2 -2
  237. package/src/config/bundled-skills/image-studio/SKILL.md +5 -4
  238. package/src/config/bundled-skills/image-studio/TOOLS.json +1 -1
  239. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +101 -0
  240. package/src/config/bundled-skills/media-processing/services/preprocess.ts +14 -4
  241. package/src/config/bundled-skills/settings/TOOLS.json +3 -3
  242. package/src/config/bundled-skills/settings/tools/navigate-settings-tab.test.ts +65 -0
  243. package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +7 -1
  244. package/src/config/bundled-skills/settings/tools/shared.ts +16 -0
  245. package/src/config/bundled-skills/settings/tools/voice-config-update.ts +19 -1
  246. package/src/config/bundled-skills/skill-management/TOOLS.json +9 -3
  247. package/src/config/bundled-skills/subagent/SKILL.md +17 -12
  248. package/src/config/bundled-skills/subagent/TOOLS.json +4 -4
  249. package/src/config/bundled-skills/transcribe/tools/transcribe-media.test.ts +22 -1
  250. package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +9 -2
  251. package/src/config/call-site-defaults.ts +11 -5
  252. package/src/config/default-profile-catalog.ts +179 -16
  253. package/src/config/default-profile-names.ts +4 -1
  254. package/src/config/default-provider-resolution.ts +4 -0
  255. package/src/config/feature-flag-registry.json +12 -12
  256. package/src/config/llm-context-resolution.ts +11 -3
  257. package/src/config/llm-resolver.ts +28 -1
  258. package/src/config/profile-materialization.ts +70 -22
  259. package/src/config/schemas/__tests__/live-voice.test.ts +107 -4
  260. package/src/config/schemas/call-site-catalog.ts +4 -4
  261. package/src/config/schemas/live-voice.ts +57 -23
  262. package/src/config/schemas/llm.ts +59 -32
  263. package/src/config/schemas/mcp.ts +23 -0
  264. package/src/config/schemas/plugin-updates.ts +6 -2
  265. package/src/config/schemas/stt.ts +1 -0
  266. package/src/config/skills.ts +9 -2
  267. package/src/context/outbound-sanitize.ts +96 -1
  268. package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +1 -1
  269. package/src/daemon/__tests__/plugin-mcp-reconcile.test.ts +82 -0
  270. package/src/daemon/conversation-agent-loop-handlers.ts +15 -10
  271. package/src/daemon/conversation-agent-loop.ts +31 -19
  272. package/src/daemon/conversation-messaging.ts +5 -1
  273. package/src/daemon/conversation-notifiers.ts +20 -10
  274. package/src/daemon/conversation-process.ts +20 -6
  275. package/src/daemon/conversation-runtime-assembly.ts +12 -6
  276. package/src/daemon/conversation-store.ts +14 -4
  277. package/src/daemon/conversation-surfaces.ts +75 -26
  278. package/src/daemon/conversation-tool-setup.ts +3 -6
  279. package/src/daemon/conversation.ts +154 -51
  280. package/src/daemon/doordash-steps.ts +2 -2
  281. package/src/daemon/lifecycle.ts +14 -1
  282. package/src/daemon/mcp-reload-service.ts +36 -6
  283. package/src/daemon/process-message.ts +13 -26
  284. package/src/daemon/providers-setup.ts +6 -3
  285. package/src/daemon/trust-context-types.ts +29 -0
  286. package/src/daemon/trust-context.ts +12 -7
  287. package/src/daemon/wake-conversation-ops.ts +3 -2
  288. package/src/daemon/windows-compiled-entry.ts +4 -0
  289. package/src/documents/document-store.ts +143 -240
  290. package/src/hooks/hook-loader.ts +3 -3
  291. package/src/hooks/registry.ts +103 -45
  292. package/src/hooks/types.ts +5 -0
  293. package/src/inbound/__tests__/oauth-callback-url.test.ts +83 -0
  294. package/src/inbound/oauth-callback-url.ts +61 -0
  295. package/src/ipc/gateway-client.test.ts +1 -1
  296. package/src/ipc/gateway-client.ts +14 -21
  297. package/src/ipc/gateway-flag-listener.ts +17 -3
  298. package/src/live-voice/__tests__/live-voice-agent-turn.test.ts +1 -104
  299. package/src/live-voice/__tests__/live-voice-events.test.ts +7 -8
  300. package/src/live-voice/__tests__/live-voice-flux-turn-end.test.ts +1050 -0
  301. package/src/live-voice/__tests__/live-voice-metrics.test.ts +115 -8
  302. package/src/live-voice/__tests__/live-voice-photo.test.ts +100 -0
  303. package/src/live-voice/__tests__/live-voice-progress.test.ts +60 -194
  304. package/src/live-voice/__tests__/live-voice-stt.test.ts +14 -0
  305. package/src/live-voice/__tests__/live-voice-triage-escalate.test.ts +29 -0
  306. package/src/live-voice/__tests__/live-voice-tts-session.test.ts +0 -483
  307. package/src/live-voice/__tests__/live-voice-vad.test.ts +0 -16
  308. package/src/live-voice/__tests__/progress-narration.test.ts +214 -0
  309. package/src/live-voice/live-voice-archive.ts +2 -0
  310. package/src/live-voice/live-voice-manager.ts +16 -3
  311. package/src/live-voice/live-voice-metrics.ts +57 -32
  312. package/src/live-voice/live-voice-photo.ts +1 -2
  313. package/src/live-voice/live-voice-session.ts +598 -323
  314. package/src/live-voice/progress-narration.ts +277 -0
  315. package/src/live-voice/protocol.ts +21 -1
  316. package/src/live-voice/windows-compiled-live-voice.ts +4 -0
  317. package/src/mcp/__tests__/effective-config.test.ts +238 -0
  318. package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +0 -1
  319. package/src/mcp/__tests__/mcp-oauth-client-registration.test.ts +200 -0
  320. package/src/mcp/__tests__/mcp-oauth-provider.test.ts +9 -9
  321. package/src/mcp/__tests__/plugin-server-credential-isolation.test.ts +95 -0
  322. package/src/mcp/client.ts +16 -11
  323. package/src/mcp/effective-config.ts +113 -0
  324. package/src/mcp/manager.ts +11 -6
  325. package/src/mcp/mcp-auth-orchestrator.ts +13 -22
  326. package/src/mcp/mcp-oauth-provider.ts +205 -240
  327. package/src/monitoring/__tests__/plugin-auto-update.test.ts +166 -3
  328. package/src/monitoring/control.ts +1 -0
  329. package/src/monitoring/db-integrity-sample.ts +4 -5
  330. package/src/monitoring/plugin-auto-update.ts +128 -24
  331. package/src/notifications/AGENTS.md +2 -0
  332. package/src/notifications/approval-card-data.ts +33 -0
  333. package/src/notifications/signal.ts +1 -0
  334. package/src/permissions/AGENTS.md +16 -0
  335. package/src/permissions/checker.test.ts +75 -122
  336. package/src/permissions/checker.ts +44 -560
  337. package/src/permissions/confirmation-guardian-request.test.ts +15 -11
  338. package/src/permissions/confirmation-guardian-request.ts +2 -2
  339. package/src/permissions/prompter.ts +1 -5
  340. package/src/permissions/question-guardian-request.test.ts +14 -6
  341. package/src/permissions/question-guardian-request.ts +1 -2
  342. package/src/persistence/attachments-store.ts +8 -1
  343. package/src/persistence/bookmark-crud.ts +3 -7
  344. package/src/persistence/conversation-attention-store.ts +16 -45
  345. package/src/persistence/conversation-crud.ts +33 -4
  346. package/src/persistence/conversation-lineage.ts +9 -0
  347. package/src/persistence/conversation-queries.ts +182 -52
  348. package/src/persistence/delivery-crud.ts +150 -36
  349. package/src/persistence/embeddings/qdrant-manager.ts +84 -49
  350. package/src/persistence/external-conversation-store.ts +32 -4
  351. package/src/persistence/llm-request-log-store.ts +4 -10
  352. package/src/persistence/llm-usage-store.ts +8 -3
  353. package/src/persistence/message-reads.test.ts +197 -0
  354. package/src/persistence/message-reads.ts +211 -0
  355. package/src/persistence/migrations/360-add-document-workspace-path.ts +5 -14
  356. package/src/persistence/migrations/366-chatgpt-subscription-row-identity.test.ts +120 -0
  357. package/src/persistence/migrations/366-chatgpt-subscription-row-identity.ts +62 -0
  358. package/src/persistence/real-user-turn-filter.ts +27 -3
  359. package/src/persistence/schema/documents.ts +4 -4
  360. package/src/persistence/steps.ts +9 -0
  361. package/src/plugin-api/__tests__/oauth-callback-url-export.test.ts +29 -0
  362. package/src/plugin-api/constants.ts +8 -0
  363. package/src/plugin-api/conversation-turn.ts +195 -5
  364. package/src/plugin-api/index.ts +38 -6
  365. package/src/plugin-api/resolve-credential.ts +3 -2
  366. package/src/plugin-api/store-credential.ts +146 -0
  367. package/src/plugin-api/vision-support.test.ts +1 -1
  368. package/src/plugin-api/webhook-url.ts +13 -11
  369. package/src/plugins/__tests__/mcp-servers.test.ts +371 -0
  370. package/src/plugins/defaults/main.ts +21 -7
  371. package/src/plugins/defaults/memory/AGENTS.md +15 -3
  372. package/src/plugins/defaults/memory/__tests__/buffer-format.test.ts +204 -0
  373. package/src/plugins/defaults/memory/__tests__/memory-retrospective-accounting.test.ts +72 -0
  374. package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +4 -1
  375. package/src/plugins/defaults/memory/__tests__/memory-retrospective-provider-path.test.ts +4 -1
  376. package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +0 -1
  377. package/src/plugins/defaults/memory/buffer-format.ts +165 -0
  378. package/src/plugins/defaults/memory/context-search/sources/conversations.ts +6 -0
  379. package/src/plugins/defaults/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +77 -0
  380. package/src/plugins/defaults/memory/graph/conversation-graph-memory.ts +24 -6
  381. package/src/plugins/defaults/memory/graph/image-ref-utils.ts +3 -0
  382. package/src/plugins/defaults/memory/graph/tool-handlers.ts +1 -30
  383. package/src/plugins/defaults/memory/graph-topology/pending-buffer.test.ts +34 -0
  384. package/src/plugins/defaults/memory/graph-topology/pending-buffer.ts +17 -24
  385. package/src/plugins/defaults/memory/hooks/post-compact.ts +1 -4
  386. package/src/plugins/defaults/memory/hooks/user-prompt-submit.ts +53 -5
  387. package/src/plugins/defaults/memory/indexer.ts +3 -1
  388. package/src/plugins/defaults/memory/memory-retrospective-accounting.ts +19 -7
  389. package/src/plugins/defaults/memory/memory-retrospective-job.ts +4 -4
  390. package/src/plugins/defaults/memory/src/__tests__/memory-v3-gate-stats.test.ts +281 -0
  391. package/src/plugins/defaults/memory/src/memory-v2-routes.ts +12 -10
  392. package/src/plugins/defaults/memory/src/memory-v3-routes.ts +207 -0
  393. package/src/plugins/defaults/memory/substrate/__tests__/consolidation-job.test.ts +147 -0
  394. package/src/plugins/defaults/memory/substrate/__tests__/consolidation-prompt-flag-gating-guard.test.ts +8 -0
  395. package/src/plugins/defaults/memory/substrate/__tests__/edge-index.test.ts +0 -30
  396. package/src/plugins/defaults/memory/substrate/__tests__/ingest.test.ts +73 -1
  397. package/src/plugins/defaults/memory/substrate/__tests__/page-index.test.ts +37 -0
  398. package/src/plugins/defaults/memory/substrate/__tests__/page-links.test.ts +208 -0
  399. package/src/plugins/defaults/memory/substrate/__tests__/prompts-consolidation.test.ts +158 -1
  400. package/src/plugins/defaults/memory/substrate/__tests__/static-context.test.ts +195 -58
  401. package/src/plugins/defaults/memory/substrate/consolidation-job.ts +93 -24
  402. package/src/plugins/defaults/memory/substrate/edge-index.ts +0 -31
  403. package/src/plugins/defaults/memory/substrate/ingest.ts +59 -0
  404. package/src/plugins/defaults/memory/substrate/page-index.ts +35 -8
  405. package/src/plugins/defaults/memory/substrate/page-links.ts +133 -0
  406. package/src/plugins/defaults/memory/substrate/page-store.ts +10 -0
  407. package/src/plugins/defaults/memory/substrate/prompts/consolidation.ts +124 -34
  408. package/src/plugins/defaults/memory/substrate/skill-content.ts +8 -1
  409. package/src/plugins/defaults/memory/substrate/static-context.ts +160 -33
  410. package/src/plugins/defaults/memory/substrate/sweep-job.ts +2 -4
  411. package/src/plugins/defaults/memory/v1/graph/extraction.ts +3 -1
  412. package/src/plugins/defaults/memory/v3/__tests__/injection.test.ts +18 -0
  413. package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +66 -1
  414. package/src/plugins/defaults/memory/v3/card.ts +9 -9
  415. package/src/plugins/defaults/memory/v3/core-set.test.ts +7 -0
  416. package/src/plugins/defaults/memory/v3/core-set.ts +5 -1
  417. package/src/plugins/defaults/memory/v3/edge.ts +13 -57
  418. package/src/plugins/defaults/memory/v3/injector.ts +8 -0
  419. package/src/plugins/defaults/memory/v3/prune.ts +2 -0
  420. package/src/plugins/defaults/memory/v3/selection-log-store.ts +2 -0
  421. package/src/plugins/defaults/memory/v3/shadow-plugin.ts +23 -9
  422. package/src/plugins/defaults/memory/worker-control.ts +1 -0
  423. package/src/plugins/defaults/memory/worker.ts +6 -3
  424. package/src/plugins/defaults/worker-entrypoints.ts +3 -0
  425. package/src/plugins/external-plugin-loader.ts +47 -0
  426. package/src/plugins/mcp-servers.ts +361 -0
  427. package/src/plugins/mtime-cache.ts +37 -46
  428. package/src/plugins/pipeline.ts +14 -7
  429. package/src/plugins/plugin-execution-context.ts +35 -11
  430. package/src/plugins/worker-plugin-surface.ts +33 -0
  431. package/src/prompts/templates/system-sections.ts +0 -7
  432. package/src/providers/__tests__/connection-model-compat.test.ts +1 -1
  433. package/src/providers/__tests__/context-overflow-error.test.ts +24 -0
  434. package/src/providers/__tests__/dispatch-connection-routing.test.ts +214 -2
  435. package/src/providers/__tests__/preflight-resolved-config.test.ts +57 -0
  436. package/src/providers/__tests__/retry-callsite.test.ts +25 -2
  437. package/src/providers/anthropic/__tests__/pause-turn-continuation.test.ts +170 -0
  438. package/src/providers/anthropic/client.ts +332 -241
  439. package/src/providers/call-site-routing.ts +30 -3
  440. package/src/providers/connection-resolution.ts +194 -11
  441. package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +4 -0
  442. package/src/providers/inference/adapter-factory.ts +3 -0
  443. package/src/providers/inference/auth.ts +6 -0
  444. package/src/providers/inference/connection-availability.ts +24 -2
  445. package/src/providers/inference/connections.ts +2 -0
  446. package/src/providers/model-catalog.ts +3 -3
  447. package/src/providers/model-intents.ts +28 -8
  448. package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +163 -40
  449. package/src/providers/openai/__tests__/tool-choice-mapping.test.ts +125 -2
  450. package/src/providers/openai/chat-completions-provider.ts +133 -36
  451. package/src/providers/openai/codex-models.ts +2 -1
  452. package/src/providers/provider-send-message.ts +32 -3
  453. package/src/providers/speech-to-text/__tests__/deepgram-flux-frames.test.ts +433 -0
  454. package/src/providers/speech-to-text/__tests__/deepgram-flux-realtime.test.ts +625 -0
  455. package/src/providers/speech-to-text/__tests__/provider-catalog.test.ts +34 -0
  456. package/src/providers/speech-to-text/__tests__/resolve.test.ts +285 -6
  457. package/src/providers/speech-to-text/deepgram-flux-frames.ts +395 -0
  458. package/src/providers/speech-to-text/deepgram-flux-realtime.ts +679 -0
  459. package/src/providers/speech-to-text/provider-catalog.ts +99 -8
  460. package/src/providers/speech-to-text/resolve.ts +25 -2
  461. package/src/routes/control.ts +1 -0
  462. package/src/routes/route-host-client.ts +1 -0
  463. package/src/routes/route-host-protocol.ts +7 -0
  464. package/src/routes/worker.ts +48 -15
  465. package/src/runtime/AGENTS.md +16 -17
  466. package/src/runtime/access-request-helper.ts +9 -12
  467. package/src/runtime/agent-wake.ts +18 -15
  468. package/src/runtime/effective-capabilities.test.ts +43 -0
  469. package/src/runtime/effective-capabilities.ts +27 -0
  470. package/src/runtime/guardian-reply-router.ts +6 -2
  471. package/src/runtime/pre-first-message-gate.ts +4 -0
  472. package/src/runtime/routes/__tests__/acp-claude-auth-routes.test.ts +12 -4
  473. package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +522 -2
  474. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +52 -0
  475. package/src/runtime/routes/__tests__/default-provider-routes.test.ts +61 -0
  476. package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +44 -0
  477. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +102 -1
  478. package/src/runtime/routes/__tests__/plugins-routes.test.ts +132 -35
  479. package/src/runtime/routes/__tests__/schedule-routes-disarm-reason.test.ts +215 -0
  480. package/src/runtime/routes/__tests__/stt-routes.test.ts +25 -0
  481. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +55 -6
  482. package/src/runtime/routes/__tests__/user-route-dispatcher-host.test.ts +52 -1
  483. package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +133 -1
  484. package/src/runtime/routes/channel-availability-routes.ts +32 -14
  485. package/src/runtime/routes/channel-route-shared.ts +0 -6
  486. package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +6 -6
  487. package/src/runtime/routes/conversation-list-routes.ts +181 -23
  488. package/src/runtime/routes/conversation-management-routes.ts +17 -12
  489. package/src/runtime/routes/conversation-query-routes.ts +40 -27
  490. package/src/runtime/routes/conversation-routes.ts +43 -29
  491. package/src/runtime/routes/credential-prompt-routes.ts +4 -7
  492. package/src/runtime/routes/credential-routes.ts +26 -82
  493. package/src/runtime/routes/default-provider-routes.ts +15 -0
  494. package/src/runtime/routes/documents-routes.ts +3 -222
  495. package/src/runtime/routes/inbound-message-handler.ts +21 -45
  496. package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +0 -1
  497. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +0 -9
  498. package/src/runtime/routes/inbound-stages/admission-policy.ts +1 -17
  499. package/src/runtime/routes/inbound-stages/bootstrap-intercept.test.ts +0 -1
  500. package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +2 -3
  501. package/src/runtime/routes/inbound-stages/edit-intercept.ts +101 -79
  502. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +0 -1
  503. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +12 -7
  504. package/src/runtime/routes/inbound-stages/reaction-intercept.test.ts +91 -8
  505. package/src/runtime/routes/inbound-stages/reaction-intercept.ts +72 -79
  506. package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +2 -3
  507. package/src/runtime/routes/inference-profiles-routes.ts +20 -11
  508. package/src/runtime/routes/inference-provider-connection-routes.ts +77 -15
  509. package/src/runtime/routes/log-export-routes.ts +3 -0
  510. package/src/runtime/routes/mcp-auth-routes.ts +148 -57
  511. package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +2 -0
  512. package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +3 -0
  513. package/src/runtime/routes/playground/inject-failures.ts +2 -2
  514. package/src/runtime/routes/playground/reset-circuit.ts +1 -1
  515. package/src/runtime/routes/plugins-routes.ts +38 -8
  516. package/src/runtime/routes/schedule-routes.ts +94 -7
  517. package/src/runtime/routes/settings-routes.ts +6 -6
  518. package/src/runtime/routes/stt-routes.ts +31 -25
  519. package/src/runtime/routes/surface-action-routes.ts +20 -19
  520. package/src/runtime/routes/surface-conversation-resolver.ts +3 -0
  521. package/src/runtime/routes/user-route-dispatcher.ts +69 -15
  522. package/src/runtime/routes/user-route-import.ts +108 -0
  523. package/src/runtime/routes/user-route-resolution.ts +18 -1
  524. package/src/runtime/routes/workspace-routes.ts +0 -9
  525. package/src/runtime/routes/workspace-utils.ts +3 -13
  526. package/src/runtime/services/conversation-serializer.ts +7 -2
  527. package/src/schedule/__tests__/plugin-schedule-declarations.test.ts +68 -5
  528. package/src/schedule/__tests__/plugin-schedule-reconciler.test.ts +81 -0
  529. package/src/schedule/plugin-schedule-availability.ts +58 -0
  530. package/src/schedule/plugin-schedule-declarations.ts +23 -27
  531. package/src/schedule/plugin-schedule-reconciler.ts +12 -3
  532. package/src/schedule/schedule-store.ts +5 -1
  533. package/src/schedule/scheduler.ts +9 -4
  534. package/src/schedule/worker-control.ts +1 -0
  535. package/src/schedule/worker.ts +6 -0
  536. package/src/security/oauth2.ts +6 -22
  537. package/src/stt/__tests__/daemon-batch-transcriber.test.ts +22 -0
  538. package/src/stt/__tests__/types.test.ts +94 -0
  539. package/src/stt/daemon-batch-transcriber.ts +10 -0
  540. package/src/stt/stt-stream-session.ts +8 -4
  541. package/src/stt/types.ts +103 -0
  542. package/src/subagent/__tests__/consult-prompt.test.ts +26 -15
  543. package/src/subagent/consult-context.ts +11 -11
  544. package/src/subagent/consult-prompt.ts +26 -35
  545. package/src/subagent/manager.ts +21 -40
  546. package/src/subagent/notify.ts +7 -1
  547. package/src/subagent/types.ts +15 -12
  548. package/src/tools/__tests__/tool-input-schemas.test.ts +7 -7
  549. package/src/tools/acp/spawn.test.ts +97 -0
  550. package/src/tools/acp/spawn.ts +38 -4
  551. package/src/tools/credentials/ref-parse.ts +35 -0
  552. package/src/tools/credentials/resolve.ts +4 -10
  553. package/src/tools/credentials/store.ts +168 -0
  554. package/src/tools/document/document-tool.ts +12 -3
  555. package/src/tools/executor.ts +53 -15
  556. package/src/tools/filesystem/read.ts +27 -10
  557. package/src/tools/host-filesystem/read.ts +27 -15
  558. package/src/tools/network/url-safety.ts +9 -16
  559. package/src/tools/permission-checker.ts +43 -52
  560. package/src/tools/registry.ts +2 -1
  561. package/src/tools/shared/filesystem/file-ops-service.ts +63 -35
  562. package/src/tools/shared/filesystem/legacy-read-args.ts +22 -0
  563. package/src/tools/shared/filesystem/types.ts +5 -5
  564. package/src/tools/skills/scaffold-managed.ts +25 -7
  565. package/src/tools/subagent/spawn.ts +28 -88
  566. package/src/tools/tool-types.ts +26 -13
  567. package/src/tools/types.ts +6 -6
  568. package/src/tools/ui-surface/surface-shape-docs.ts +12 -1
  569. package/src/tools/workflows/run-workflow.ts +1 -2
  570. package/src/tts/__tests__/reasoning-tag-filter.test.ts +78 -0
  571. package/src/tts/reasoning-tag-filter.ts +89 -0
  572. package/src/util/__tests__/worker-process-command.test.ts +37 -0
  573. package/src/util/logger.ts +16 -0
  574. package/src/util/think-tag-stream.ts +95 -0
  575. package/src/util/worker-process.ts +37 -4
  576. package/src/windows-compiled-cli.ts +32 -0
  577. package/src/windows-compiled-entry.ts +4 -0
  578. package/src/windows-compiled-logger.ts +6 -0
  579. package/src/windows-compiled-worker-entry.ts +29 -0
  580. package/src/workspace/byok-default-profile-ensure.ts +76 -24
  581. package/src/workspace/custom-profile-ensure.ts +4 -24
  582. package/src/workspace/migrations/142-consolidate-voice-front-door.ts +70 -0
  583. package/src/workspace/migrations/143-repair-deprecated-codex-model-id.ts +134 -0
  584. package/src/workspace/migrations/144-convert-stranded-subscription-openai-profiles.ts +265 -0
  585. package/src/workspace/migrations/145-collapse-profile-bindings-to-entries.ts +328 -0
  586. package/src/workspace/migrations/146-repair-retired-fireworks-deepseek-flash-model-id.ts +195 -0
  587. package/src/workspace/migrations/__tests__/141-stt-english-default-to-multilingual.test.ts +0 -10
  588. package/src/workspace/migrations/registry.ts +10 -0
  589. package/src/workspace/provider-commit-message-generator.ts +7 -5
  590. package/src/__tests__/document-workspace-file.test.ts +0 -467
  591. package/src/live-voice/__tests__/front-decision.test.ts +0 -645
  592. package/src/live-voice/front-decision.ts +0 -476
  593. package/src/permissions/ipc-risk-types.ts +0 -143
  594. package/src/permissions/risk-types.ts +0 -76
  595. package/src/subagent/__tests__/consult-transcript.test.ts +0 -184
  596. package/src/subagent/consult-transcript.ts +0 -90
@@ -55,14 +55,11 @@ const CredentialPromptParams = z.object({
55
55
  *
56
56
  * The prompt blocks until the user answers, so by the time a caller reads the
57
57
  * result the secure input is already gone from the UI. A bare `ok: true` reads
58
- * as "the prompt opened successfully", which leads a model to follow up with
59
- * "the prompt is open, paste your value there" — pointing the user at a surface
60
- * that has already closed. The user, having just submitted, re-answers a prompt
61
- * that never reappears, and the flow loops. State the close explicitly so the
62
- * only available reading is the correct one.
58
+ * as "the prompt opened successfully", which invites a follow-up telling the
59
+ * user to paste into a surface that has already closed. Stating the close
60
+ * leaves only the correct reading.
63
61
  */
64
- const PROMPT_CLOSED_NOTICE =
65
- "The secure prompt has closed — do not ask the user to enter this value again.";
62
+ const PROMPT_CLOSED_NOTICE = "The secure prompt has closed.";
66
63
 
67
64
  export type CredentialPromptResult = {
68
65
  ok: boolean;
@@ -16,22 +16,13 @@
16
16
 
17
17
  import { z } from "zod";
18
18
 
19
- import {
20
- ACP_SERVICE,
21
- AcpCredentialFormatError,
22
- assertAcpCredentialFormat,
23
- } from "../../acp/acp-credentials.js";
19
+ import { AcpCredentialFormatError } from "../../acp/acp-credentials.js";
24
20
  import { isAssistantFeatureFlagEnabled } from "../../config/assistant-feature-flags.js";
25
21
  import {
26
22
  fetchManagedCatalog,
27
23
  type ManagedCredentialDescriptor,
28
24
  } from "../../credential-execution/managed-catalog.js";
29
25
  import { buildForChatSentinel } from "../../daemon/chat-credential-redaction.js";
30
- import {
31
- isNonSecretPlatformField,
32
- scrubStoredCredentialFromTranscripts,
33
- } from "../../daemon/credential-transcript-scrub.js";
34
- import { syncManualTokenConnection } from "../../oauth/manual-token-connection.js";
35
26
  import {
36
27
  disconnectOAuthProvider,
37
28
  getConnectionByProvider,
@@ -39,14 +30,11 @@ import {
39
30
  type OAuthConnectionRow,
40
31
  } from "../../oauth/oauth-store.js";
41
32
  import { credentialKey } from "../../security/credential-key.js";
42
- import { normalizeSecretValue } from "../../security/secret-normalize.js";
43
33
  import {
44
34
  deleteSecureKeyAsync,
45
35
  getActiveBackendInfoAsync,
46
- getActiveBackendName,
47
36
  getSecureKeyAsync,
48
37
  getSecureKeyResultAsync,
49
- setSecureKeyAsync,
50
38
  } from "../../security/secure-keys.js";
51
39
  import {
52
40
  assertMetadataWritable,
@@ -55,10 +43,13 @@ import {
55
43
  getCredentialMetadata,
56
44
  getCredentialMetadataById,
57
45
  listCredentialMetadata,
58
- upsertCredentialMetadata,
59
46
  } from "../../tools/credentials/metadata-store.js";
60
47
  import type { CredentialInjectionTemplate } from "../../tools/credentials/policy-types.js";
61
- import { getLogger } from "../../util/logger.js";
48
+ import {
49
+ CredentialStorageError,
50
+ InvalidCredentialInputError,
51
+ storeCredentialValue,
52
+ } from "../../tools/credentials/store.js";
62
53
  import { ACTOR_PRINCIPALS } from "../auth/route-policy.js";
63
54
  import { recordForChatMint } from "../for-chat-mint-registry.js";
64
55
  import { recordRevealSuccess } from "../reveal-success-registry.js";
@@ -66,8 +57,6 @@ import { InjectionTemplateSchema } from "./credential-prompt-routes.js";
66
57
  import { BadRequestError, InternalError } from "./errors.js";
67
58
  import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
68
59
 
69
- const log = getLogger("credential-routes");
70
-
71
60
  // ---------------------------------------------------------------------------
72
61
  // Shared helpers
73
62
  // ---------------------------------------------------------------------------
@@ -458,74 +447,29 @@ async function handleCredentialsSet({ body }: RouteHandlerArgs) {
458
447
  throw new BadRequestError("value is required");
459
448
  }
460
449
 
461
- const normalizedValue = normalizeSecretValue(value);
462
- if (normalizedValue.length === 0) {
463
- throw new BadRequestError("value is required");
464
- }
465
-
466
- // Reject an Anthropic API key pasted into the ACP OAuth-token field (a 401
467
- // footgun) as a 400 rather than letting the guard surface as a 500.
468
- if (service === ACP_SERVICE) {
469
- try {
470
- assertAcpCredentialFormat(field, normalizedValue);
471
- } catch (err) {
472
- if (err instanceof AcpCredentialFormatError) {
473
- throw new BadRequestError(err.message);
474
- }
475
- throw err;
450
+ try {
451
+ return await storeCredentialValue({
452
+ service,
453
+ field,
454
+ value,
455
+ alias: label,
456
+ usageDescription: description,
457
+ allowedTools,
458
+ allowedDomains,
459
+ injectionTemplates,
460
+ });
461
+ } catch (err) {
462
+ if (
463
+ err instanceof InvalidCredentialInputError ||
464
+ err instanceof AcpCredentialFormatError
465
+ ) {
466
+ throw new BadRequestError(err.message);
476
467
  }
477
- }
478
-
479
- assertMetadataWritable();
480
-
481
- const key = credentialKey(service, field);
482
- const stored = await setSecureKeyAsync(key, normalizedValue);
483
- if (!stored) {
484
- throw new InternalError(
485
- `Failed to store credential in secure storage (backend: ${getActiveBackendName()})`,
486
- );
487
- }
488
-
489
- // The stored plaintext may already sit in recent transcripts: the user
490
- // message that pasted it, the persisted tool_use input, the tool result
491
- // echoing the command. This route is the scrub seam — not
492
- // setSecureKeyAsync, which also fires on OAuth refresh rotations and MCP
493
- // header writes whose values never transited a transcript. The scrub runs
494
- // immediately after the secure-store write, BEFORE the metadata upsert and
495
- // connection sync: those side effects can throw (oauth-store work), and a
496
- // stored-but-unscrubbed secret must not depend on them succeeding. The
497
- // credential IS stored at this point; the scrub is best-effort hygiene and
498
- // must stay invisible to the caller.
499
- if (!isNonSecretPlatformField(service, field)) {
500
- try {
501
- const scrubbed =
502
- await scrubStoredCredentialFromTranscripts(normalizedValue);
503
- log.info(
504
- { service, field, ...scrubbed },
505
- "Credential stored; scrubbed value from recent transcripts",
506
- );
507
- } catch (err) {
508
- log.warn(
509
- { err, service, field },
510
- "Credential stored, but transcript scrub failed",
511
- );
468
+ if (err instanceof CredentialStorageError) {
469
+ throw new InternalError(err.message);
512
470
  }
471
+ throw err;
513
472
  }
514
-
515
- const metadata = upsertCredentialMetadata(service, field, {
516
- alias: label,
517
- usageDescription: description,
518
- allowedTools,
519
- allowedDomains,
520
- injectionTemplates,
521
- });
522
- await syncManualTokenConnection(service);
523
-
524
- return {
525
- credentialId: metadata.credentialId,
526
- service,
527
- field,
528
- };
529
473
  }
530
474
 
531
475
  async function handleCredentialsDelete({ body }: RouteHandlerArgs) {
@@ -25,6 +25,7 @@ import {
25
25
  DEFAULT_PROVIDER_CHOICES,
26
26
  DefaultProviderSchema,
27
27
  } from "../../config/schemas/llm.js";
28
+ import { ROUTING_IDENTITY_PROVIDERS } from "../../providers/inference/auth.js";
28
29
  import {
29
30
  computeConnectionAvailability,
30
31
  CONNECTION_AVAILABILITY_STATUSES,
@@ -93,6 +94,20 @@ async function handlePutDefaultProvider({
93
94
  )}; "connectionName" is optional and must be a non-empty string.`,
94
95
  );
95
96
  }
97
+ // Routing identities dispatch through their canonical row regardless of
98
+ // any stored pin (`resolveRoutingIdentity`), so a noncanonical
99
+ // connectionName would be judged by availability and the deletion guards
100
+ // while inference uses a different row. Reject it here rather than
101
+ // persisting a pin that status and dispatch disagree about.
102
+ const { provider, connectionName } = result.data;
103
+ if (connectionName != null && ROUTING_IDENTITY_PROVIDERS.has(provider)) {
104
+ const canonical = resolveDefaultConnectionName({ provider });
105
+ if (connectionName !== canonical) {
106
+ throw new BadRequestError(
107
+ `Provider "${provider}" always dispatches through its canonical connection "${canonical}". Omit "connectionName" or pass "${canonical}".`,
108
+ );
109
+ }
110
+ }
96
111
  setDefaultProvider(result.data);
97
112
  return handleGetDefaultProvider();
98
113
  }
@@ -4,20 +4,12 @@
4
4
  * Exposes document CRUD over HTTP, sharing business logic with the
5
5
  * handlers in `daemon/handlers/documents.ts`.
6
6
  */
7
- import { randomUUID } from "node:crypto";
8
- import { readFileSync, statSync } from "node:fs";
9
- import { basename, extname } from "node:path";
10
-
11
7
  import { z } from "zod";
12
8
 
13
9
  import {
14
10
  addDocumentConversation,
15
- createFileBackedDocument,
16
11
  getDocumentById,
17
- getDocumentByWorkspacePath,
18
12
  getDocumentsForConversation,
19
- isDocumentAssociatedWithConversation,
20
- refreshDocumentContentFromFile,
21
13
  saveDocument,
22
14
  } from "../../documents/document-store.js";
23
15
  import { rawAll } from "../../persistence/raw-query.js";
@@ -28,18 +20,9 @@ import {
28
20
  publishDocumentsChanged,
29
21
  } from "../sync/resource-sync-events.js";
30
22
  import { renderMarkdownToPDF } from "./document-pdf-renderer.js";
31
- import {
32
- BadRequestError,
33
- InternalError,
34
- NotFoundError,
35
- UnprocessableEntityError,
36
- } from "./errors.js";
37
- import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
23
+ import { BadRequestError, InternalError, NotFoundError } from "./errors.js";
24
+ import type { RouteDefinition } from "./types.js";
38
25
  import { RouteResponse } from "./types.js";
39
- import {
40
- resolveWorkspacePath,
41
- toWorkspaceRelativePath,
42
- } from "./workspace-utils.js";
43
26
 
44
27
  const log = getLogger("documents-routes");
45
28
 
@@ -85,14 +68,7 @@ function listAllDocuments(): Array<{
85
68
  }
86
69
  }
87
70
 
88
- // ---------------------------------------------------------------------------
89
- // File-backed documents
90
- // ---------------------------------------------------------------------------
91
-
92
- /** Extensions the document editor round-trips faithfully as markdown. */
93
- const MARKDOWN_EXTENSIONS = new Set([".md", ".markdown"]);
94
-
95
- /** The document payload shape shared by `GET documents/{id}` and its siblings. */
71
+ /** The document payload shape returned by `GET documents/{id}`. */
96
72
  const documentPayloadSchema = z.object({
97
73
  success: z.boolean(),
98
74
  surfaceId: z.string(),
@@ -102,173 +78,8 @@ const documentPayloadSchema = z.object({
102
78
  wordCount: z.number(),
103
79
  createdAt: z.number(),
104
80
  updatedAt: z.number(),
105
- workspacePath: z
106
- .string()
107
- .nullable()
108
- .describe("Workspace-relative file this document is bound to, or null"),
109
81
  });
110
82
 
111
- /**
112
- * Resolve a client-supplied workspace path to the markdown file it names.
113
- *
114
- * Uses the same resolution as the workspace file routes, so a path that
115
- * escapes the workspace (traversal, absolute, symlinked out, dot-segment) is
116
- * rejected here exactly as it would be there.
117
- */
118
- function resolveWorkspaceMarkdownFile(path: string): {
119
- absolutePath: string;
120
- relativePath: string;
121
- } {
122
- const resolved = resolveWorkspacePath(path);
123
- if (resolved === undefined) {
124
- throw new BadRequestError("Invalid path");
125
- }
126
-
127
- if (!MARKDOWN_EXTENSIONS.has(extname(resolved).toLowerCase())) {
128
- throw new UnprocessableEntityError(
129
- "Only markdown files (.md, .markdown) can back a document",
130
- );
131
- }
132
-
133
- return {
134
- absolutePath: resolved,
135
- relativePath: toWorkspaceRelativePath(resolved),
136
- };
137
- }
138
-
139
- /** Current text of a workspace file, or `null` when it is gone or not a file. */
140
- function readWorkspaceFileText(absolutePath: string): string | null {
141
- try {
142
- if (!statSync(absolutePath).isFile()) {
143
- return null;
144
- }
145
- return readFileSync(absolutePath, "utf-8");
146
- } catch {
147
- return null;
148
- }
149
- }
150
-
151
- /** Load a document by surface ID for a response, or fail loudly if it vanished. */
152
- function loadDocumentPayload(surfaceId: string): Record<string, unknown> {
153
- const doc = getDocumentById(surfaceId);
154
- if (!doc) {
155
- throw new InternalError("Document could not be loaded after persisting");
156
- }
157
- return { success: true, ...doc };
158
- }
159
-
160
- /**
161
- * Find or create the document bound to a workspace markdown file.
162
- *
163
- * The file is the source of truth at open time: when a bound document's stored
164
- * content has drifted from the bytes on disk (the file was edited outside the
165
- * editor), the row is refreshed from the file before it is returned. Writes go
166
- * the other way — the document store writes through to the file.
167
- *
168
- * The publishes here carry no origin client id on purpose. The only caller,
169
- * `viewer-store.loadWorkspaceFileDocument`, opens the file and never
170
- * invalidates its own document queries, so the client that creates the row is
171
- * the one that most needs to hear about it: suppressing its own echo would
172
- * leave its assets pill and Library without the document it just opened.
173
- */
174
- function handleDocumentForWorkspaceFile({
175
- body,
176
- }: RouteHandlerArgs): Record<string, unknown> {
177
- const { path, conversationId } = (body ?? {}) as {
178
- path?: string;
179
- conversationId?: string;
180
- };
181
-
182
- if (!path || typeof path !== "string") {
183
- throw new BadRequestError("path is required");
184
- }
185
- if (!conversationId || typeof conversationId !== "string") {
186
- throw new BadRequestError("conversationId is required");
187
- }
188
-
189
- const { absolutePath, relativePath } = resolveWorkspaceMarkdownFile(path);
190
- const existing = getDocumentByWorkspacePath(relativePath);
191
- const fileText = readWorkspaceFileText(absolutePath);
192
-
193
- if (fileText === null) {
194
- // A bound document whose file is gone is reported distinctly: the client
195
- // needs to tell "this file was deleted" apart from "no such file", and the
196
- // document must never be used to resurrect the file.
197
- if (existing) {
198
- throw new NotFoundError(
199
- `The file backing this document no longer exists: ${relativePath}`,
200
- );
201
- }
202
- throw new NotFoundError("File not found");
203
- }
204
-
205
- if (existing) {
206
- // Opening the file from another conversation grants that conversation
207
- // access, the same association the link route writes.
208
- const alreadyLinked = isDocumentAssociatedWithConversation(
209
- existing.surfaceId,
210
- conversationId,
211
- );
212
- addDocumentConversation(existing.surfaceId, conversationId);
213
-
214
- let refreshed = false;
215
- if (existing.content !== fileText) {
216
- const refresh = refreshDocumentContentFromFile(
217
- existing.surfaceId,
218
- fileText,
219
- );
220
- if (!refresh.success) {
221
- throw new InternalError(refresh.error);
222
- }
223
- refreshed = true;
224
- log.info(
225
- { surfaceId: existing.surfaceId, workspacePath: relativePath },
226
- "Refreshed file-backed document from disk",
227
- );
228
- }
229
-
230
- // Reopening an unchanged, already-linked file writes nothing, so it must
231
- // not invalidate every client's document list on each open.
232
- if (!alreadyLinked || refreshed) {
233
- publishDocumentsChanged();
234
- }
235
- return loadDocumentPayload(existing.surfaceId);
236
- }
237
-
238
- const surfaceId = `doc-${randomUUID()}`;
239
- const created = createFileBackedDocument({
240
- surfaceId,
241
- conversationId,
242
- title: basename(relativePath),
243
- content: fileText,
244
- workspacePath: relativePath,
245
- });
246
-
247
- if (!created.success) {
248
- // A concurrent request may have won the unique index on workspace_path.
249
- const raced = getDocumentByWorkspacePath(relativePath);
250
- if (!raced) {
251
- throw new InternalError(created.error);
252
- }
253
- const racedAlreadyLinked = isDocumentAssociatedWithConversation(
254
- raced.surfaceId,
255
- conversationId,
256
- );
257
- addDocumentConversation(raced.surfaceId, conversationId);
258
- if (!racedAlreadyLinked) {
259
- publishDocumentsChanged();
260
- }
261
- return loadDocumentPayload(raced.surfaceId);
262
- }
263
-
264
- log.info(
265
- { surfaceId, workspacePath: relativePath, conversationId },
266
- "Bound workspace file to a new document",
267
- );
268
- publishDocumentsChanged();
269
- return loadDocumentPayload(surfaceId);
270
- }
271
-
272
83
  // ---------------------------------------------------------------------------
273
84
  // Route definitions
274
85
  // ---------------------------------------------------------------------------
@@ -403,36 +214,6 @@ export const ROUTES: RouteDefinition[] = [
403
214
  },
404
215
  },
405
216
 
406
- {
407
- operationId: "documentForWorkspaceFile",
408
- endpoint: "documents/for-workspace-file",
409
- method: "POST",
410
- policy: {
411
- requiredScopes: ["settings.write"],
412
- allowedPrincipalTypes: ACTOR_PRINCIPALS,
413
- },
414
- summary: "Get or create the document for a workspace markdown file",
415
- description:
416
- "Return the document bound to a workspace markdown file, creating it on " +
417
- "first open. The file is the source of truth at open time: stored " +
418
- "content that has drifted from the file is refreshed from disk before " +
419
- "the document is returned.",
420
- tags: ["documents"],
421
- requestBody: z.object({
422
- path: z
423
- .string()
424
- .describe("Workspace-relative path to a .md/.markdown file"),
425
- conversationId: z
426
- .string()
427
- .describe("Conversation the document is opened from"),
428
- }),
429
- responseBody: documentPayloadSchema,
430
- additionalResponses: {
431
- "422": { description: "Path is not a markdown file" },
432
- },
433
- handler: handleDocumentForWorkspaceFile,
434
- },
435
-
436
217
  {
437
218
  operationId: "linkDocumentConversation",
438
219
  endpoint: "documents/:id/conversations",
@@ -101,7 +101,6 @@ import {
101
101
  import { DAEMON_INTERNAL_ASSISTANT_ID } from "../assistant-scope.js";
102
102
  import { deliverChannelReply } from "../gateway-client.js";
103
103
  import { trustContextFromVerdict } from "../trust-verdict-consumer.js";
104
- import { canonicalChannelAssistantId } from "./channel-route-shared.js";
105
104
  import { BadRequestError } from "./errors.js";
106
105
  import { handleApprovalInterception } from "./guardian-approval-interception.js";
107
106
  import {
@@ -371,16 +370,6 @@ export async function handleChannelInbound({
371
370
  throw new BadRequestError("content or attachmentIds is required");
372
371
  }
373
372
 
374
- // Canonicalize the assistant ID so all DB-facing operations use the
375
- // consistent 'self' key regardless of what the gateway sent.
376
- const canonicalAssistantId = canonicalChannelAssistantId(assistantId);
377
- if (canonicalAssistantId !== assistantId) {
378
- log.debug(
379
- { raw: assistantId, canonical: canonicalAssistantId },
380
- "Canonicalized channel assistant ID",
381
- );
382
- }
383
-
384
373
  // Coerce actorExternalId to a string at the boundary — the field
385
374
  // comes from unvalidated JSON and may be a number, object, or other
386
375
  // non-string type. Non-string truthy values would throw inside
@@ -428,9 +417,10 @@ export async function handleChannelInbound({
428
417
  // 👍 never triggers a verification handshake or an access-request
429
418
  // notification, and a stranger's reaction creates no conversation/binding.
430
419
  // The interceptor drops strangers, records known contacts' reactions as
431
- // transcript signals, and routes a guardian's reaction on an approval card
432
- // through the guardian decision pipeline. Reactions never drive an
433
- // agent turn.
420
+ // transcript signals in the conversation of the reacted message, and routes
421
+ // a guardian's reaction on an approval card through the guardian decision
422
+ // pipeline. Reactions never mint a conversation and never drive an agent
423
+ // turn.
434
424
  if (isSlackReactionEvent(body)) {
435
425
  return handleSlackReactionIntercept({
436
426
  callbackData: body.callbackData!,
@@ -438,14 +428,12 @@ export async function handleChannelInbound({
438
428
  sourceInterface,
439
429
  conversationExternalId,
440
430
  externalMessageId,
441
- canonicalAssistantId,
442
431
  rawSenderId,
443
432
  canonicalSenderId,
444
433
  actorDisplayName: body.actorDisplayName,
445
434
  actorUsername: body.actorUsername,
446
435
  replyCallbackUrl: body.replyCallbackUrl,
447
436
  sourceMetadata: body.sourceMetadata,
448
- slackChannelName,
449
437
  approvalConversationGenerator,
450
438
  });
451
439
  }
@@ -486,7 +474,6 @@ export async function handleChannelInbound({
486
474
  rawSenderId,
487
475
  sourceChannel,
488
476
  conversationExternalId,
489
- canonicalAssistantId,
490
477
  trimmedContent,
491
478
  sourceMetadata: body.sourceMetadata,
492
479
  actorDisplayName: body.actorDisplayName,
@@ -709,7 +696,6 @@ export async function handleChannelInbound({
709
696
  externalMessageId,
710
697
  sourceMessageId,
711
698
  sourceThreadId: channelThreadId,
712
- canonicalAssistantId,
713
699
  assistantId,
714
700
  content,
715
701
  channelId: resolvedMember?.channelId,
@@ -723,28 +709,24 @@ export async function handleChannelInbound({
723
709
  externalMessageId,
724
710
  {
725
711
  sourceMessageId,
726
- assistantId: canonicalAssistantId,
727
712
  sourceThreadId: channelThreadId,
728
713
  },
729
714
  );
730
715
 
731
716
  const replyCallbackUrl = body.replyCallbackUrl;
732
717
 
733
- // external_conversation_bindings is assistant-agnostic. Restrict writes to
734
- // self so assistant-scoped legacy routes do not overwrite each other's
735
- // channel binding metadata for the same chat.
736
- if (canonicalAssistantId === DAEMON_INTERNAL_ASSISTANT_ID) {
737
- upsertBinding({
738
- conversationId: result.conversationId,
739
- sourceChannel,
740
- externalChatId: conversationExternalId,
741
- externalChatName: slackChannelName,
742
- externalThreadId: channelThreadId ?? null,
743
- externalUserId: canonicalSenderId ?? rawSenderId ?? null,
744
- displayName: body.actorDisplayName ?? null,
745
- username: body.actorUsername ?? null,
746
- });
747
- }
718
+ // `external_conversation_bindings` is assistant-agnostic: one row per chat,
719
+ // whichever caller writes it.
720
+ upsertBinding({
721
+ conversationId: result.conversationId,
722
+ sourceChannel,
723
+ externalChatId: conversationExternalId,
724
+ externalChatName: slackChannelName,
725
+ externalThreadId: channelThreadId ?? null,
726
+ externalUserId: canonicalSenderId ?? rawSenderId ?? null,
727
+ displayName: body.actorDisplayName ?? null,
728
+ username: body.actorUsername ?? null,
729
+ });
748
730
 
749
731
  // ── Actor role resolution ──
750
732
  // Built from the gateway-stamped trust verdict (ACL + identity). An absent
@@ -844,7 +826,6 @@ export async function handleChannelInbound({
844
826
  if (isCallbackInteraction) {
845
827
  if (floorSenderId) {
846
828
  handshakeInProgress = await isApprovalHandshakeInProgress({
847
- canonicalAssistantId,
848
829
  sourceChannel,
849
830
  actorExternalId: floorSenderId,
850
831
  });
@@ -852,7 +833,6 @@ export async function handleChannelInbound({
852
833
  } else {
853
834
  try {
854
835
  const accessResult = await notifyGuardianOfAccessRequest({
855
- canonicalAssistantId,
856
836
  sourceChannel,
857
837
  conversationExternalId,
858
838
  actorExternalId: floorSenderId,
@@ -925,7 +905,7 @@ export async function handleChannelInbound({
925
905
  const replyPayload: Parameters<typeof deliverChannelReply>[1] = {
926
906
  chatId: conversationExternalId,
927
907
  text: replyText,
928
- assistantId: canonicalAssistantId,
908
+ assistantId: DAEMON_INTERNAL_ASSISTANT_ID,
929
909
  };
930
910
  if (sourceChannel === "slack" && (canonicalSenderId ?? rawSenderId)) {
931
911
  replyPayload.ephemeral = true;
@@ -987,7 +967,7 @@ export async function handleChannelInbound({
987
967
  const replyPayload: Parameters<typeof deliverChannelReply>[1] = {
988
968
  chatId: conversationExternalId,
989
969
  text: DISK_PRESSURE_REMOTE_BLOCK_REPLY,
990
- assistantId: canonicalAssistantId,
970
+ assistantId: DAEMON_INTERNAL_ASSISTANT_ID,
991
971
  };
992
972
  if (sourceChannel === "slack" && (canonicalSenderId ?? rawSenderId)) {
993
973
  replyPayload.ephemeral = true;
@@ -1059,7 +1039,6 @@ export async function handleChannelInbound({
1059
1039
  isDuplicate: result.duplicate,
1060
1040
  commandIntent,
1061
1041
  rawSenderId,
1062
- canonicalAssistantId,
1063
1042
  sourceChannel,
1064
1043
  conversationExternalId,
1065
1044
  eventId: result.eventId,
@@ -1081,7 +1060,6 @@ export async function handleChannelInbound({
1081
1060
  callbackData: body.callbackData,
1082
1061
  rawSenderId,
1083
1062
  canonicalSenderId,
1084
- canonicalAssistantId,
1085
1063
  sourceChannel,
1086
1064
  conversationExternalId,
1087
1065
  conversationId: result.conversationId,
@@ -1123,7 +1101,7 @@ export async function handleChannelInbound({
1123
1101
  actorExternalId: canonicalSenderId ?? rawSenderId,
1124
1102
  replyCallbackUrl,
1125
1103
  trustCtx,
1126
- assistantId: canonicalAssistantId,
1104
+ assistantId: DAEMON_INTERNAL_ASSISTANT_ID,
1127
1105
  approvalCopyGenerator,
1128
1106
  approvalConversationGenerator,
1129
1107
  approvalMessageTs,
@@ -1219,7 +1197,7 @@ export async function handleChannelInbound({
1219
1197
  chatId: conversationExternalId,
1220
1198
  text: "This approval request has been resolved.",
1221
1199
  messageTs: approvalMessageTs,
1222
- assistantId: canonicalAssistantId,
1200
+ assistantId: DAEMON_INTERNAL_ASSISTANT_ID,
1223
1201
  }).catch((err) => {
1224
1202
  log.error(
1225
1203
  { err, conversationId: result.conversationId },
@@ -1255,7 +1233,6 @@ export async function handleChannelInbound({
1255
1233
  actorUsername: body.actorUsername,
1256
1234
  trustCtx,
1257
1235
  replyCallbackUrl,
1258
- canonicalAssistantId,
1259
1236
  });
1260
1237
 
1261
1238
  if (ingressResult.blocked) {
@@ -1296,7 +1273,6 @@ export async function handleChannelInbound({
1296
1273
  const admittedSenderId = canonicalSenderId ?? rawSenderId;
1297
1274
  if (admittedSenderId) {
1298
1275
  void maybeNotifyGuardianOfAdmittedContact({
1299
- canonicalAssistantId,
1300
1276
  sourceChannel,
1301
1277
  conversationExternalId,
1302
1278
  actorExternalId: admittedSenderId,
@@ -1497,7 +1473,7 @@ export async function handleChannelInbound({
1497
1473
  commandIntent,
1498
1474
  sourceLanguageCode,
1499
1475
  replyCallbackUrl,
1500
- assistantId: canonicalAssistantId,
1476
+ assistantId: DAEMON_INTERNAL_ASSISTANT_ID,
1501
1477
  approvalCopyGenerator,
1502
1478
  chatType: sourceChatType,
1503
1479
  clientTimezone: inboundClientTimezone,
@@ -98,7 +98,6 @@ function makeParams(
98
98
  rawSenderId: "sender-1",
99
99
  sourceChannel: "telegram",
100
100
  conversationExternalId: "chat-1",
101
- canonicalAssistantId: "assistant-1",
102
101
  trimmedContent: "hello",
103
102
  sourceMetadata: undefined,
104
103
  actorDisplayName: "Sender One",