@agent-native/core 0.118.0 → 0.119.0

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 (480) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +32 -0
  3. package/corpus/core/docs/content/a2a-protocol.mdx +15 -0
  4. package/corpus/core/docs/content/template-chat.mdx +1 -1
  5. package/corpus/core/docs/content/template-plan.mdx +3 -3
  6. package/corpus/core/package.json +1 -1
  7. package/corpus/core/src/a2a/activity.ts +371 -0
  8. package/corpus/core/src/a2a/client.ts +35 -11
  9. package/corpus/core/src/a2a/index.ts +21 -0
  10. package/corpus/core/src/a2a/types.ts +8 -0
  11. package/corpus/core/src/agent/model-config.ts +19 -23
  12. package/corpus/core/src/agent/production-agent.ts +167 -100
  13. package/corpus/core/src/agent/types.ts +16 -1
  14. package/corpus/core/src/cli/index.ts +18 -10
  15. package/corpus/core/src/cli/multi-frontier-runs.ts +5 -3
  16. package/corpus/core/src/cli/templates-meta.ts +0 -12
  17. package/corpus/core/src/cli/workspace-dev.ts +1 -1
  18. package/corpus/core/src/client/AgentPanel.tsx +9 -1
  19. package/corpus/core/src/client/RunStuckBanner.tsx +39 -47
  20. package/corpus/core/src/client/chat/action-chat-ui-surface.tsx +32 -0
  21. package/corpus/core/src/client/chat/message-components.tsx +53 -8
  22. package/corpus/core/src/client/chat/tool-call-display.tsx +214 -44
  23. package/corpus/core/src/client/chat/widgets/InlineExtensionWidget.tsx +0 -1
  24. package/corpus/core/src/client/chat/widgets/builtin-tool-renderers.tsx +7 -3
  25. package/corpus/core/src/client/chat-model-groups.ts +67 -27
  26. package/corpus/core/src/client/conversation/AgentConversation.tsx +12 -1
  27. package/corpus/core/src/client/error-capture.ts +2 -6
  28. package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +20 -14
  29. package/corpus/core/src/client/resources/ResourcesPanel.tsx +5 -1
  30. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +7 -17
  31. package/corpus/core/src/client/resources/mcp-integration-logos.ts +2 -2
  32. package/corpus/core/src/client/route-chunk-recovery.ts +5 -3
  33. package/corpus/core/src/client/session-replay.ts +3 -3
  34. package/corpus/core/src/client/settings/SettingsPanel.tsx +15 -6
  35. package/corpus/core/src/client/sharing/ShareButton.tsx +1 -27
  36. package/corpus/core/src/client/sharing/ShareDialog.tsx +0 -16
  37. package/corpus/core/src/client/sharing/useShareButtonController.ts +0 -7
  38. package/corpus/core/src/client/sharing/useShareDialogController.ts +0 -2
  39. package/corpus/core/src/client/sse-event-processor.ts +85 -1
  40. package/corpus/core/src/client/transcription/use-live-transcription.ts +64 -45
  41. package/corpus/core/src/deploy/build.ts +2 -1
  42. package/corpus/core/src/guards/db-tool-scoping.ts +1 -1
  43. package/corpus/core/src/integrations/adapters/slack.ts +84 -5
  44. package/corpus/core/src/integrations/index.ts +5 -1
  45. package/corpus/core/src/localization/default-messages.ts +7 -1
  46. package/corpus/core/src/mcp-client/oauth-routes.ts +45 -12
  47. package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +1 -18
  48. package/corpus/core/src/scripts/call-agent.ts +49 -6
  49. package/corpus/core/src/server/agent-chat-plugin.ts +50 -10
  50. package/corpus/core/src/server/realtime-voice.ts +4 -1
  51. package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +16 -0
  52. package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
  53. package/corpus/core/src/terminal/cli-registry.ts +1 -1
  54. package/corpus/core/src/vite/client.ts +166 -1
  55. package/corpus/templates/analytics/app/hooks/use-dashboard-views.ts +13 -1
  56. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewsMenu.tsx +10 -0
  57. package/corpus/templates/analytics/changelog/2026-07-22-show-a-useful-error-when-saving-a-dashboard-view-fails.md +6 -0
  58. package/corpus/templates/brain/app/routes/sources.tsx +181 -114
  59. package/corpus/templates/clips/AGENTS.md +8 -6
  60. package/corpus/templates/clips/actions/request-transcript.ts +90 -420
  61. package/corpus/templates/clips/actions/save-browser-transcript.ts +11 -28
  62. package/corpus/templates/clips/app/components/capture-install-options.tsx +5 -3
  63. package/corpus/templates/clips/app/components/player/transcript-panel.tsx +3 -136
  64. package/corpus/templates/clips/app/lib/capture-install-options.ts +15 -4
  65. package/corpus/templates/clips/app/routes/download.tsx +3 -2
  66. package/corpus/templates/clips/changelog/2026-07-22-fixed-an-intermittent-hydration-error-on-the-download-page.md +6 -0
  67. package/corpus/templates/clips/changelog/2026-07-22-fixed-transcript-generation-when-native-speech-capture-retur.md +6 -0
  68. package/corpus/templates/clips/changelog/2026-07-22-transcript-generation-now-retries-with-backup-speech-recogni.md +6 -0
  69. package/corpus/templates/clips/changelog/2026-07-23-fixed-recordings-failing-to-save-with-a-cancelled-or-cleanup.md +6 -0
  70. package/corpus/templates/clips/server/lib/public-agent-context.ts +2 -2
  71. package/corpus/templates/clips/server/plugins/db.ts +9 -1
  72. package/corpus/templates/clips/server/register-secrets.ts +7 -6
  73. package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +16 -84
  74. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +13 -7
  75. package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +2 -2
  76. package/corpus/templates/content/app/i18n-data.ts +10 -0
  77. package/corpus/templates/design/server/lib/fig-file-decoder.ts +1 -0
  78. package/corpus/templates/plan/app/entry.client.tsx +3 -0
  79. package/corpus/templates/plan/changelog/2026-07-22-recover-stale-pages-after-a-deployment-refresh-automatically.md +6 -0
  80. package/corpus/templates/slides/app/hooks/use-agent-generating.ts +10 -3
  81. package/corpus/templates/slides/app/pages/Index.tsx +1 -0
  82. package/corpus/templates/slides/changelog/2026-07-22-new-deck-prompts-now-open-in-their-own-visible-chat-thread.md +6 -0
  83. package/corpus/toolkit/CHANGELOG.md +9 -0
  84. package/corpus/toolkit/package.json +1 -1
  85. package/corpus/toolkit/src/composer/PromptComposer.tsx +5 -1
  86. package/corpus/toolkit/src/composer/RealtimeVoiceMode.tsx +119 -31
  87. package/corpus/toolkit/src/composer/useRealtimeVoiceMode.tsx +30 -0
  88. package/corpus/toolkit/src/conformance/runner.tsx +153 -1
  89. package/corpus/toolkit/src/editor/SharedRichEditor.tsx +13 -2
  90. package/corpus/toolkit/src/editor/SlashCommandMenu.tsx +20 -0
  91. package/corpus/toolkit/src/editor/index.ts +2 -0
  92. package/corpus/toolkit/src/styles.css +52 -23
  93. package/dist/a2a/activity.d.ts +50 -0
  94. package/dist/a2a/activity.d.ts.map +1 -0
  95. package/dist/a2a/activity.js +236 -0
  96. package/dist/a2a/activity.js.map +1 -0
  97. package/dist/a2a/client.d.ts +5 -1
  98. package/dist/a2a/client.d.ts.map +1 -1
  99. package/dist/a2a/client.js +18 -13
  100. package/dist/a2a/client.js.map +1 -1
  101. package/dist/a2a/index.d.ts +2 -1
  102. package/dist/a2a/index.d.ts.map +1 -1
  103. package/dist/a2a/index.js +1 -0
  104. package/dist/a2a/index.js.map +1 -1
  105. package/dist/a2a/types.d.ts +1 -0
  106. package/dist/a2a/types.d.ts.map +1 -1
  107. package/dist/a2a/types.js.map +1 -1
  108. package/dist/agent/engine/anthropic-engine.d.ts +1 -1
  109. package/dist/agent/engine/builder-engine.d.ts +2 -2
  110. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  111. package/dist/agent/model-config.d.ts +16 -16
  112. package/dist/agent/model-config.d.ts.map +1 -1
  113. package/dist/agent/model-config.js +19 -23
  114. package/dist/agent/model-config.js.map +1 -1
  115. package/dist/agent/production-agent.d.ts +26 -0
  116. package/dist/agent/production-agent.d.ts.map +1 -1
  117. package/dist/agent/production-agent.js +137 -80
  118. package/dist/agent/production-agent.js.map +1 -1
  119. package/dist/agent/types.d.ts +10 -0
  120. package/dist/agent/types.d.ts.map +1 -1
  121. package/dist/agent/types.js.map +1 -1
  122. package/dist/cli/index.js +18 -8
  123. package/dist/cli/index.js.map +1 -1
  124. package/dist/cli/multi-frontier-runs.js +3 -3
  125. package/dist/cli/multi-frontier-runs.js.map +1 -1
  126. package/dist/cli/templates-meta.d.ts.map +1 -1
  127. package/dist/cli/templates-meta.js +0 -12
  128. package/dist/cli/templates-meta.js.map +1 -1
  129. package/dist/cli/workspace-dev.js +1 -1
  130. package/dist/cli/workspace-dev.js.map +1 -1
  131. package/dist/client/AgentPanel.d.ts.map +1 -1
  132. package/dist/client/AgentPanel.js +4 -1
  133. package/dist/client/AgentPanel.js.map +1 -1
  134. package/dist/client/RunStuckBanner.d.ts +3 -5
  135. package/dist/client/RunStuckBanner.d.ts.map +1 -1
  136. package/dist/client/RunStuckBanner.js +17 -18
  137. package/dist/client/RunStuckBanner.js.map +1 -1
  138. package/dist/client/chat/action-chat-ui-surface.d.ts +8 -0
  139. package/dist/client/chat/action-chat-ui-surface.d.ts.map +1 -0
  140. package/dist/client/chat/action-chat-ui-surface.js +10 -0
  141. package/dist/client/chat/action-chat-ui-surface.js.map +1 -0
  142. package/dist/client/chat/message-components.d.ts +3 -0
  143. package/dist/client/chat/message-components.d.ts.map +1 -1
  144. package/dist/client/chat/message-components.js +40 -7
  145. package/dist/client/chat/message-components.js.map +1 -1
  146. package/dist/client/chat/tool-call-display.d.ts +3 -1
  147. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  148. package/dist/client/chat/tool-call-display.js +76 -23
  149. package/dist/client/chat/tool-call-display.js.map +1 -1
  150. package/dist/client/chat/widgets/InlineExtensionWidget.d.ts.map +1 -1
  151. package/dist/client/chat/widgets/InlineExtensionWidget.js +1 -1
  152. package/dist/client/chat/widgets/InlineExtensionWidget.js.map +1 -1
  153. package/dist/client/chat/widgets/builtin-tool-renderers.d.ts.map +1 -1
  154. package/dist/client/chat/widgets/builtin-tool-renderers.js +5 -3
  155. package/dist/client/chat/widgets/builtin-tool-renderers.js.map +1 -1
  156. package/dist/client/chat-model-groups.d.ts.map +1 -1
  157. package/dist/client/chat-model-groups.js +44 -21
  158. package/dist/client/chat-model-groups.js.map +1 -1
  159. package/dist/client/conversation/AgentConversation.d.ts.map +1 -1
  160. package/dist/client/conversation/AgentConversation.js +3 -2
  161. package/dist/client/conversation/AgentConversation.js.map +1 -1
  162. package/dist/client/error-capture.d.ts.map +1 -1
  163. package/dist/client/error-capture.js +2 -2
  164. package/dist/client/error-capture.js.map +1 -1
  165. package/dist/client/resources/McpConnectionSuggestion.d.ts +1 -0
  166. package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -1
  167. package/dist/client/resources/McpConnectionSuggestion.js +9 -8
  168. package/dist/client/resources/McpConnectionSuggestion.js.map +1 -1
  169. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  170. package/dist/client/resources/ResourcesPanel.js +3 -1
  171. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  172. package/dist/client/resources/mcp-integration-catalog.d.ts +1 -0
  173. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  174. package/dist/client/resources/mcp-integration-catalog.js +4 -17
  175. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  176. package/dist/client/resources/mcp-integration-logos.js +2 -2
  177. package/dist/client/resources/mcp-integration-logos.js.map +1 -1
  178. package/dist/client/route-chunk-recovery.d.ts.map +1 -1
  179. package/dist/client/route-chunk-recovery.js +5 -3
  180. package/dist/client/route-chunk-recovery.js.map +1 -1
  181. package/dist/client/session-replay.js +3 -3
  182. package/dist/client/session-replay.js.map +1 -1
  183. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  184. package/dist/client/settings/SettingsPanel.js +2 -2
  185. package/dist/client/settings/SettingsPanel.js.map +1 -1
  186. package/dist/client/sharing/ShareButton.d.ts +1 -1
  187. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  188. package/dist/client/sharing/ShareButton.js +3 -4
  189. package/dist/client/sharing/ShareButton.js.map +1 -1
  190. package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
  191. package/dist/client/sharing/ShareDialog.js +1 -2
  192. package/dist/client/sharing/ShareDialog.js.map +1 -1
  193. package/dist/client/sharing/useShareButtonController.d.ts +0 -1
  194. package/dist/client/sharing/useShareButtonController.d.ts.map +1 -1
  195. package/dist/client/sharing/useShareButtonController.js +0 -6
  196. package/dist/client/sharing/useShareButtonController.js.map +1 -1
  197. package/dist/client/sharing/useShareDialogController.d.ts +0 -1
  198. package/dist/client/sharing/useShareDialogController.d.ts.map +1 -1
  199. package/dist/client/sharing/useShareDialogController.js +0 -1
  200. package/dist/client/sharing/useShareDialogController.js.map +1 -1
  201. package/dist/client/sse-event-processor.d.ts +12 -0
  202. package/dist/client/sse-event-processor.d.ts.map +1 -1
  203. package/dist/client/sse-event-processor.js +63 -1
  204. package/dist/client/sse-event-processor.js.map +1 -1
  205. package/dist/client/transcription/use-live-transcription.d.ts +3 -3
  206. package/dist/client/transcription/use-live-transcription.d.ts.map +1 -1
  207. package/dist/client/transcription/use-live-transcription.js +22 -11
  208. package/dist/client/transcription/use-live-transcription.js.map +1 -1
  209. package/dist/collab/awareness.d.ts +2 -2
  210. package/dist/collab/awareness.d.ts.map +1 -1
  211. package/dist/deploy/build.d.ts.map +1 -1
  212. package/dist/deploy/build.js +1 -1
  213. package/dist/deploy/build.js.map +1 -1
  214. package/dist/guards/db-tool-scoping.js +1 -1
  215. package/dist/guards/db-tool-scoping.js.map +1 -1
  216. package/dist/integrations/adapters/slack.d.ts +1 -0
  217. package/dist/integrations/adapters/slack.d.ts.map +1 -1
  218. package/dist/integrations/adapters/slack.js +61 -5
  219. package/dist/integrations/adapters/slack.js.map +1 -1
  220. package/dist/integrations/index.d.ts +1 -1
  221. package/dist/integrations/index.d.ts.map +1 -1
  222. package/dist/integrations/index.js +1 -1
  223. package/dist/integrations/index.js.map +1 -1
  224. package/dist/localization/default-messages.d.ts +6 -0
  225. package/dist/localization/default-messages.d.ts.map +1 -1
  226. package/dist/localization/default-messages.js +7 -1
  227. package/dist/localization/default-messages.js.map +1 -1
  228. package/dist/mcp-client/oauth-routes.d.ts +3 -0
  229. package/dist/mcp-client/oauth-routes.d.ts.map +1 -1
  230. package/dist/mcp-client/oauth-routes.js +41 -12
  231. package/dist/mcp-client/oauth-routes.js.map +1 -1
  232. package/dist/observability/routes.d.ts +3 -3
  233. package/dist/provider-api/actions/custom-provider-registration.d.ts +8 -8
  234. package/dist/provider-api/actions/provider-api.d.ts +11 -11
  235. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
  236. package/dist/scripts/agent-engines/list-agent-engines.js +1 -18
  237. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  238. package/dist/scripts/call-agent.d.ts.map +1 -1
  239. package/dist/scripts/call-agent.js +49 -6
  240. package/dist/scripts/call-agent.js.map +1 -1
  241. package/dist/secrets/routes.d.ts +6 -6
  242. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  243. package/dist/server/agent-chat-plugin.js +38 -10
  244. package/dist/server/agent-chat-plugin.js.map +1 -1
  245. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  246. package/dist/server/realtime-voice.d.ts.map +1 -1
  247. package/dist/server/realtime-voice.js +1 -1
  248. package/dist/server/realtime-voice.js.map +1 -1
  249. package/dist/server/transcribe-voice.d.ts +1 -1
  250. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +16 -0
  251. package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
  252. package/dist/terminal/cli-registry.js +1 -1
  253. package/dist/terminal/cli-registry.js.map +1 -1
  254. package/dist/vite/client.d.ts +8 -1
  255. package/dist/vite/client.d.ts.map +1 -1
  256. package/dist/vite/client.js +113 -2
  257. package/dist/vite/client.js.map +1 -1
  258. package/docs/content/a2a-protocol.mdx +15 -0
  259. package/docs/content/template-chat.mdx +1 -1
  260. package/docs/content/template-plan.mdx +3 -3
  261. package/package.json +2 -2
  262. package/src/a2a/activity.ts +371 -0
  263. package/src/a2a/client.ts +35 -11
  264. package/src/a2a/index.ts +21 -0
  265. package/src/a2a/types.ts +8 -0
  266. package/src/agent/model-config.ts +19 -23
  267. package/src/agent/production-agent.ts +167 -100
  268. package/src/agent/types.ts +16 -1
  269. package/src/cli/index.ts +18 -10
  270. package/src/cli/multi-frontier-runs.ts +5 -3
  271. package/src/cli/templates-meta.ts +0 -12
  272. package/src/cli/workspace-dev.ts +1 -1
  273. package/src/client/AgentPanel.tsx +9 -1
  274. package/src/client/RunStuckBanner.tsx +39 -47
  275. package/src/client/chat/action-chat-ui-surface.tsx +32 -0
  276. package/src/client/chat/message-components.tsx +53 -8
  277. package/src/client/chat/tool-call-display.tsx +214 -44
  278. package/src/client/chat/widgets/InlineExtensionWidget.tsx +0 -1
  279. package/src/client/chat/widgets/builtin-tool-renderers.tsx +7 -3
  280. package/src/client/chat-model-groups.ts +67 -27
  281. package/src/client/conversation/AgentConversation.tsx +12 -1
  282. package/src/client/error-capture.ts +2 -6
  283. package/src/client/resources/McpConnectionSuggestion.tsx +20 -14
  284. package/src/client/resources/ResourcesPanel.tsx +5 -1
  285. package/src/client/resources/mcp-integration-catalog.ts +7 -17
  286. package/src/client/resources/mcp-integration-logos.ts +2 -2
  287. package/src/client/route-chunk-recovery.ts +5 -3
  288. package/src/client/session-replay.ts +3 -3
  289. package/src/client/settings/SettingsPanel.tsx +15 -6
  290. package/src/client/sharing/ShareButton.tsx +1 -27
  291. package/src/client/sharing/ShareDialog.tsx +0 -16
  292. package/src/client/sharing/useShareButtonController.ts +0 -7
  293. package/src/client/sharing/useShareDialogController.ts +0 -2
  294. package/src/client/sse-event-processor.ts +85 -1
  295. package/src/client/transcription/use-live-transcription.ts +64 -45
  296. package/src/deploy/build.ts +2 -1
  297. package/src/guards/db-tool-scoping.ts +1 -1
  298. package/src/integrations/adapters/slack.ts +84 -5
  299. package/src/integrations/index.ts +5 -1
  300. package/src/localization/default-messages.ts +7 -1
  301. package/src/mcp-client/oauth-routes.ts +45 -12
  302. package/src/scripts/agent-engines/list-agent-engines.ts +1 -18
  303. package/src/scripts/call-agent.ts +49 -6
  304. package/src/server/agent-chat-plugin.ts +50 -10
  305. package/src/server/realtime-voice.ts +4 -1
  306. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +16 -0
  307. package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
  308. package/src/terminal/cli-registry.ts +1 -1
  309. package/src/vite/client.ts +166 -1
  310. package/corpus/core/src/observability/hosted-model-experiment.ts +0 -118
  311. package/corpus/templates/crm/.agents/skills/agent-native-docs/SKILL.md +0 -115
  312. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +0 -177
  313. package/corpus/templates/crm/.agents/skills/crm/SKILL.md +0 -128
  314. package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +0 -220
  315. package/corpus/templates/crm/.agents/skills/feature-flags/SKILL.md +0 -169
  316. package/corpus/templates/crm/.agents/skills/upgrade-agent-native/SKILL.md +0 -100
  317. package/corpus/templates/crm/.env.example +0 -5
  318. package/corpus/templates/crm/AGENTS.md +0 -120
  319. package/corpus/templates/crm/CHANGELOG.md +0 -1
  320. package/corpus/templates/crm/DEVELOPING.md +0 -66
  321. package/corpus/templates/crm/README.md +0 -106
  322. package/corpus/templates/crm/_gitignore +0 -12
  323. package/corpus/templates/crm/actions/_crm-action-utils.ts +0 -87
  324. package/corpus/templates/crm/actions/_crm-dashboard.ts +0 -69
  325. package/corpus/templates/crm/actions/_crm-data-program-actions.ts +0 -15
  326. package/corpus/templates/crm/actions/_crm-signal-utils.ts +0 -79
  327. package/corpus/templates/crm/actions/apply-crm-proposals.ts +0 -203
  328. package/corpus/templates/crm/actions/attach-call-evidence.ts +0 -170
  329. package/corpus/templates/crm/actions/configure-crm-connection.ts +0 -126
  330. package/corpus/templates/crm/actions/configure-native-crm.ts +0 -44
  331. package/corpus/templates/crm/actions/create-crm-record.ts +0 -148
  332. package/corpus/templates/crm/actions/create-crm-signal-tracker.ts +0 -58
  333. package/corpus/templates/crm/actions/delete-staged-dataset.ts +0 -14
  334. package/corpus/templates/crm/actions/get-crm-automation-recipe.ts +0 -36
  335. package/corpus/templates/crm/actions/get-crm-dashboard-panel.ts +0 -35
  336. package/corpus/templates/crm/actions/get-crm-dashboard.ts +0 -14
  337. package/corpus/templates/crm/actions/get-crm-overview.ts +0 -13
  338. package/corpus/templates/crm/actions/get-crm-pipeline-data.ts +0 -61
  339. package/corpus/templates/crm/actions/get-crm-record.ts +0 -75
  340. package/corpus/templates/crm/actions/install-crm-pipeline-dashboard.ts +0 -81
  341. package/corpus/templates/crm/actions/list-crm-dashboard-revisions.ts +0 -15
  342. package/corpus/templates/crm/actions/list-crm-dashboards.ts +0 -15
  343. package/corpus/templates/crm/actions/list-crm-proposals.ts +0 -31
  344. package/corpus/templates/crm/actions/list-crm-records.ts +0 -79
  345. package/corpus/templates/crm/actions/list-crm-saved-views.ts +0 -15
  346. package/corpus/templates/crm/actions/list-crm-signal-hits.ts +0 -43
  347. package/corpus/templates/crm/actions/list-crm-signal-trackers.ts +0 -32
  348. package/corpus/templates/crm/actions/list-crm-tasks.ts +0 -22
  349. package/corpus/templates/crm/actions/list-staged-datasets.ts +0 -14
  350. package/corpus/templates/crm/actions/list-workspace-connections.ts +0 -47
  351. package/corpus/templates/crm/actions/manage-crm-signal-tracker.ts +0 -87
  352. package/corpus/templates/crm/actions/manage-crm-task.ts +0 -132
  353. package/corpus/templates/crm/actions/navigate.ts +0 -63
  354. package/corpus/templates/crm/actions/provider-api-catalog.ts +0 -22
  355. package/corpus/templates/crm/actions/provider-api-docs.ts +0 -54
  356. package/corpus/templates/crm/actions/provider-api-request.ts +0 -92
  357. package/corpus/templates/crm/actions/query-staged-dataset.ts +0 -44
  358. package/corpus/templates/crm/actions/record-crm-call-insight.ts +0 -160
  359. package/corpus/templates/crm/actions/record-crm-smart-signal.ts +0 -150
  360. package/corpus/templates/crm/actions/restore-crm-dashboard-revision.ts +0 -23
  361. package/corpus/templates/crm/actions/review-crm-signal.ts +0 -31
  362. package/corpus/templates/crm/actions/run-crm-saved-view-program.ts +0 -103
  363. package/corpus/templates/crm/actions/run-crm-signal-trackers.ts +0 -275
  364. package/corpus/templates/crm/actions/run.ts +0 -7
  365. package/corpus/templates/crm/actions/save-crm-dashboard.ts +0 -51
  366. package/corpus/templates/crm/actions/save-crm-saved-view.ts +0 -119
  367. package/corpus/templates/crm/actions/sync-crm.ts +0 -146
  368. package/corpus/templates/crm/actions/update-crm-record.ts +0 -510
  369. package/corpus/templates/crm/actions/view-screen.ts +0 -218
  370. package/corpus/templates/crm/agent-native.app-skill.json +0 -58
  371. package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +0 -158
  372. package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +0 -78
  373. package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +0 -226
  374. package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +0 -414
  375. package/corpus/templates/crm/app/components/crm/RecordActions.tsx +0 -510
  376. package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +0 -134
  377. package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +0 -362
  378. package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +0 -93
  379. package/corpus/templates/crm/app/components/crm/Surface.tsx +0 -97
  380. package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +0 -180
  381. package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +0 -112
  382. package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +0 -84
  383. package/corpus/templates/crm/app/components/ui/alert-dialog.tsx +0 -1
  384. package/corpus/templates/crm/app/components/ui/badge.tsx +0 -1
  385. package/corpus/templates/crm/app/components/ui/button.tsx +0 -1
  386. package/corpus/templates/crm/app/components/ui/card.tsx +0 -1
  387. package/corpus/templates/crm/app/components/ui/dialog.tsx +0 -1
  388. package/corpus/templates/crm/app/components/ui/input.tsx +0 -1
  389. package/corpus/templates/crm/app/components/ui/label.tsx +0 -1
  390. package/corpus/templates/crm/app/components/ui/select.tsx +0 -1
  391. package/corpus/templates/crm/app/components/ui/sheet.tsx +0 -1
  392. package/corpus/templates/crm/app/components/ui/skeleton.tsx +0 -1
  393. package/corpus/templates/crm/app/components/ui/switch.tsx +0 -1
  394. package/corpus/templates/crm/app/components/ui/table.tsx +0 -1
  395. package/corpus/templates/crm/app/components/ui/tabs.tsx +0 -1
  396. package/corpus/templates/crm/app/components/ui/textarea.tsx +0 -1
  397. package/corpus/templates/crm/app/components/ui/toolkit-provider.tsx +0 -17
  398. package/corpus/templates/crm/app/design-system.ts +0 -3
  399. package/corpus/templates/crm/app/entry.client.tsx +0 -16
  400. package/corpus/templates/crm/app/entry.server.tsx +0 -10
  401. package/corpus/templates/crm/app/global.css +0 -167
  402. package/corpus/templates/crm/app/hooks/use-navigation-state.ts +0 -60
  403. package/corpus/templates/crm/app/i18n/en-US.ts +0 -89
  404. package/corpus/templates/crm/app/i18n/index.ts +0 -34
  405. package/corpus/templates/crm/app/lib/dashboard.ts +0 -13
  406. package/corpus/templates/crm/app/lib/navigation.ts +0 -54
  407. package/corpus/templates/crm/app/lib/tab-id.ts +0 -1
  408. package/corpus/templates/crm/app/lib/types.ts +0 -172
  409. package/corpus/templates/crm/app/lib/utils.ts +0 -1
  410. package/corpus/templates/crm/app/root.tsx +0 -91
  411. package/corpus/templates/crm/app/routes/_index.tsx +0 -26
  412. package/corpus/templates/crm/app/routes/accounts.tsx +0 -41
  413. package/corpus/templates/crm/app/routes/agent.tsx +0 -5
  414. package/corpus/templates/crm/app/routes/ask.tsx +0 -53
  415. package/corpus/templates/crm/app/routes/dashboard.tsx +0 -118
  416. package/corpus/templates/crm/app/routes/opportunities.tsx +0 -41
  417. package/corpus/templates/crm/app/routes/people.tsx +0 -41
  418. package/corpus/templates/crm/app/routes/proposals.tsx +0 -266
  419. package/corpus/templates/crm/app/routes/records.$recordId.tsx +0 -35
  420. package/corpus/templates/crm/app/routes/settings.tsx +0 -63
  421. package/corpus/templates/crm/app/routes/setup.tsx +0 -308
  422. package/corpus/templates/crm/app/routes/tasks.tsx +0 -252
  423. package/corpus/templates/crm/app/routes/views.tsx +0 -333
  424. package/corpus/templates/crm/app/routes.ts +0 -17
  425. package/corpus/templates/crm/app/vite-env.d.ts +0 -6
  426. package/corpus/templates/crm/changelog/2026-07-21-agent-native-crm.md +0 -6
  427. package/corpus/templates/crm/changelog/2026-07-21-clips-call-evidence-review-recipe.md +0 -6
  428. package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-find-and-review-evidence-grounded-call-signals-w.md +0 -6
  429. package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-manage-keyword-and-smart-call-signal-trackers-fr.md +0 -6
  430. package/corpus/templates/crm/changelog/2026-07-21-delegated-local-crm-automation.md +0 -6
  431. package/corpus/templates/crm/changelog/2026-07-21-native-sql.md +0 -6
  432. package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboard.md +0 -6
  433. package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboards-now-install-correctly-from-the-crm-actio.md +0 -6
  434. package/corpus/templates/crm/changelog/2026-07-21-salesforce-connection.md +0 -6
  435. package/corpus/templates/crm/changelog/2026-07-22-crm-field-validation-now-explains-which-fields-cannot-be-edi.md +0 -6
  436. package/corpus/templates/crm/changelog/2026-07-22-fixed-hubspot-contact-syncs-missing-records-updated-after-th.md +0 -6
  437. package/corpus/templates/crm/changelog/2026-07-22-fixed-pipeline-dashboard-panels-so-their-opportunity-data-lo.md +0 -6
  438. package/corpus/templates/crm/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +0 -6
  439. package/corpus/templates/crm/components.json +0 -20
  440. package/corpus/templates/crm/docs/architecture/crm-contract.md +0 -180
  441. package/corpus/templates/crm/learnings.defaults.md +0 -5
  442. package/corpus/templates/crm/package.json +0 -59
  443. package/corpus/templates/crm/public/favicon.svg +0 -1
  444. package/corpus/templates/crm/public/icon-180.svg +0 -1
  445. package/corpus/templates/crm/public/manifest.json +0 -11
  446. package/corpus/templates/crm/react-router.config.ts +0 -7
  447. package/corpus/templates/crm/server/crm/adapter.ts +0 -32
  448. package/corpus/templates/crm/server/crm/crm-field-firewall.ts +0 -64
  449. package/corpus/templates/crm/server/crm/crm-mirror.ts +0 -711
  450. package/corpus/templates/crm/server/crm/hubspot-adapter.ts +0 -1146
  451. package/corpus/templates/crm/server/crm/native-adapter.ts +0 -1715
  452. package/corpus/templates/crm/server/crm/read-through.ts +0 -207
  453. package/corpus/templates/crm/server/crm/salesforce-adapter.ts +0 -1255
  454. package/corpus/templates/crm/server/db/crm-store.ts +0 -1170
  455. package/corpus/templates/crm/server/db/index.ts +0 -169
  456. package/corpus/templates/crm/server/db/schema.ts +0 -441
  457. package/corpus/templates/crm/server/lib/intelligence/default-detectors.ts +0 -65
  458. package/corpus/templates/crm/server/lib/intelligence/evidence.ts +0 -105
  459. package/corpus/templates/crm/server/lib/intelligence/keyword-detector.ts +0 -100
  460. package/corpus/templates/crm/server/lib/intelligence/smart-detector.ts +0 -144
  461. package/corpus/templates/crm/server/lib/intelligence/summary.ts +0 -141
  462. package/corpus/templates/crm/server/lib/provider-api.ts +0 -64
  463. package/corpus/templates/crm/server/middleware/auth.ts +0 -4
  464. package/corpus/templates/crm/server/plugins/agent-chat.ts +0 -68
  465. package/corpus/templates/crm/server/plugins/auth.ts +0 -14
  466. package/corpus/templates/crm/server/plugins/core-routes.ts +0 -17
  467. package/corpus/templates/crm/server/plugins/db.ts +0 -454
  468. package/corpus/templates/crm/server/routes/[...page].get.ts +0 -5
  469. package/corpus/templates/crm/shared/crm-automation-recipes.ts +0 -132
  470. package/corpus/templates/crm/shared/crm-contract.ts +0 -254
  471. package/corpus/templates/crm/shared/crm-sales-config.ts +0 -63
  472. package/corpus/templates/crm/ssr-entry.ts +0 -11
  473. package/corpus/templates/crm/tsconfig.json +0 -24
  474. package/corpus/templates/crm/vite.config.ts +0 -15
  475. package/corpus/templates/crm/vitest.config.ts +0 -5
  476. package/dist/observability/hosted-model-experiment.d.ts +0 -39
  477. package/dist/observability/hosted-model-experiment.d.ts.map +0 -1
  478. package/dist/observability/hosted-model-experiment.js +0 -90
  479. package/dist/observability/hosted-model-experiment.js.map +0 -1
  480. package/src/observability/hosted-model-experiment.ts +0 -118
@@ -1,5 +1,6 @@
1
1
  import type { ChatModelRunResult } from "@assistant-ui/react";
2
2
 
3
+ import type { A2AAgentActivitySnapshot } from "../a2a/activity.js";
3
4
  import type { ActionChatUIConfig } from "../action-ui.js";
4
5
  import {
5
6
  LLM_MISSING_CREDENTIALS_ERROR_CODE,
@@ -74,6 +75,12 @@ export interface SSEEvent {
74
75
  seq?: number;
75
76
  agent?: string;
76
77
  status?: string;
78
+ state?: string;
79
+ elapsedSeconds?: number;
80
+ detail?: string;
81
+ agentCallId?: string;
82
+ durationMs?: number;
83
+ snapshot?: A2AAgentActivitySnapshot;
77
84
  reason?: string;
78
85
  // Agent task fields
79
86
  taskId?: string;
@@ -100,6 +107,12 @@ export type AgentAutoContinueReason =
100
107
 
101
108
  export type AgentActivityTrailEntry = { label: string; tool?: string };
102
109
 
110
+ export interface AgentCallProgress {
111
+ state: string;
112
+ elapsedSeconds: number;
113
+ detail?: string;
114
+ }
115
+
103
116
  export interface AgentAutoContinueErrorInfo {
104
117
  message: string;
105
118
  details?: string;
@@ -1365,7 +1378,7 @@ export function processEvent(
1365
1378
  if (ev.type === "agent_call") {
1366
1379
  const agentName = ev.agent ?? "agent";
1367
1380
  if (ev.status === "start") {
1368
- const toolCallId = `tc_${++toolCallCounter.value}`;
1381
+ const toolCallId = ev.agentCallId ?? `tc_${++toolCallCounter.value}`;
1369
1382
  content.push({
1370
1383
  type: "tool-call",
1371
1384
  toolCallId,
@@ -1380,9 +1393,16 @@ export function processEvent(
1380
1393
  if (
1381
1394
  part.type === "tool-call" &&
1382
1395
  part.toolName === `agent:${agentName}` &&
1396
+ (!ev.agentCallId || part.toolCallId === ev.agentCallId) &&
1383
1397
  part.result === undefined
1384
1398
  ) {
1385
1399
  part.result = ev.status === "error" ? "Error calling agent" : "Done";
1400
+ part.structuredMeta = {
1401
+ ...part.structuredMeta,
1402
+ ...(ev.durationMs != null
1403
+ ? { agentDurationMs: ev.durationMs }
1404
+ : {}),
1405
+ };
1386
1406
  break;
1387
1407
  }
1388
1408
  }
@@ -1401,6 +1421,7 @@ export function processEvent(
1401
1421
  if (
1402
1422
  part.type === "tool-call" &&
1403
1423
  part.toolName === `agent:${agentName}` &&
1424
+ (!ev.agentCallId || part.toolCallId === ev.agentCallId) &&
1404
1425
  part.result === undefined
1405
1426
  ) {
1406
1427
  part.argsText += ev.text ?? "";
@@ -1413,6 +1434,69 @@ export function processEvent(
1413
1434
  };
1414
1435
  }
1415
1436
 
1437
+ if (ev.type === "agent_call_progress") {
1438
+ const agentName = ev.agent ?? "agent";
1439
+ if (typeof ev.state !== "string") {
1440
+ return { action: "continue" };
1441
+ }
1442
+ const elapsedSeconds =
1443
+ typeof ev.elapsedSeconds === "number" &&
1444
+ Number.isFinite(ev.elapsedSeconds) &&
1445
+ ev.elapsedSeconds >= 0
1446
+ ? ev.elapsedSeconds
1447
+ : 0;
1448
+ for (let i = content.length - 1; i >= 0; i--) {
1449
+ const part = content[i];
1450
+ if (
1451
+ part.type === "tool-call" &&
1452
+ part.toolName === `agent:${agentName}` &&
1453
+ (!ev.agentCallId || part.toolCallId === ev.agentCallId) &&
1454
+ part.result === undefined
1455
+ ) {
1456
+ part.structuredMeta = {
1457
+ ...part.structuredMeta,
1458
+ agentProgress: {
1459
+ state: ev.state,
1460
+ elapsedSeconds,
1461
+ ...(ev.detail ? { detail: ev.detail } : {}),
1462
+ } satisfies AgentCallProgress,
1463
+ };
1464
+ break;
1465
+ }
1466
+ }
1467
+ return {
1468
+ action: "yield",
1469
+ result: { content: contentSnapshot(content) } as ChatModelRunResult,
1470
+ };
1471
+ }
1472
+
1473
+ if (ev.type === "agent_call_activity" && ev.snapshot) {
1474
+ const agentName = ev.agent ?? "agent";
1475
+ for (let i = content.length - 1; i >= 0; i--) {
1476
+ const part = content[i];
1477
+ if (
1478
+ part.type === "tool-call" &&
1479
+ part.toolName === `agent:${agentName}` &&
1480
+ (!ev.agentCallId || part.toolCallId === ev.agentCallId)
1481
+ ) {
1482
+ const previous = part.structuredMeta?.agentActivity as
1483
+ | A2AAgentActivitySnapshot
1484
+ | undefined;
1485
+ if (!previous || ev.snapshot.sequence >= previous.sequence) {
1486
+ part.structuredMeta = {
1487
+ ...part.structuredMeta,
1488
+ agentActivity: ev.snapshot,
1489
+ };
1490
+ }
1491
+ break;
1492
+ }
1493
+ }
1494
+ return {
1495
+ action: "yield",
1496
+ result: { content: contentSnapshot(content) } as ChatModelRunResult,
1497
+ };
1498
+ }
1499
+
1416
1500
  // ─── Agent task events (sub-agent chips) ─────────────────────────
1417
1501
  // These events are dispatched as CustomEvents so AgentTaskCard components
1418
1502
  // can listen for updates to their specific taskId.
@@ -6,9 +6,9 @@
6
6
  * stop when the user hits stop. The accumulated transcript is available
7
7
  * immediately — no round-trip to Whisper needed.
8
8
  *
9
- * Higher-quality backends (Groq Whisper, OpenAI Whisper, Deepgram) can
10
- * refine the result afterward, but this gives users something useful
11
- * from second zero even without an API key.
9
+ * Builder can transcribe the original recording afterward if native capture
10
+ * produces no text, but this gives users something useful from second zero
11
+ * without a cloud transcription request.
12
12
  */
13
13
 
14
14
  import { useCallback, useEffect, useRef, useState } from "react";
@@ -58,12 +58,21 @@ export function useLiveTranscription(
58
58
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
59
59
  const recognitionRef = useRef<any>(null);
60
60
  const transcriptRef = useRef("");
61
+ const interimRef = useRef("");
61
62
  const stoppedManuallyRef = useRef(false);
62
63
  const stopWaiterRef = useRef<((text: string) => void) | null>(null);
63
64
  const restartTimerRef = useRef<number | null>(null);
64
65
  const networkErrorCountRef = useRef(0);
65
66
  const restartDelayRef = useRef(0);
66
67
 
68
+ const currentTranscript = useCallback(
69
+ () =>
70
+ [transcriptRef.current.trim(), interimRef.current.trim()]
71
+ .filter(Boolean)
72
+ .join(" "),
73
+ [],
74
+ );
75
+
67
76
  const supported = !!getSpeechRecognitionCtor();
68
77
 
69
78
  const start = useCallback(() => {
@@ -89,6 +98,7 @@ export function useLiveTranscription(
89
98
  recognition.lang = lang;
90
99
  recognitionRef.current = recognition;
91
100
  transcriptRef.current = "";
101
+ interimRef.current = "";
92
102
  stoppedManuallyRef.current = false;
93
103
  networkErrorCountRef.current = 0;
94
104
  restartDelayRef.current = 0;
@@ -107,6 +117,7 @@ export function useLiveTranscription(
107
117
  interim += text;
108
118
  }
109
119
  }
120
+ interimRef.current = interim;
110
121
  setInterimText(interim);
111
122
  if (event.results.length > 0) {
112
123
  networkErrorCountRef.current = 0;
@@ -167,7 +178,7 @@ export function useLiveTranscription(
167
178
  }
168
179
  setIsActive(false);
169
180
  if (stopWaiterRef.current) {
170
- stopWaiterRef.current(transcriptRef.current);
181
+ stopWaiterRef.current(currentTranscript());
171
182
  }
172
183
  };
173
184
 
@@ -177,14 +188,16 @@ export function useLiveTranscription(
177
188
  } catch {
178
189
  /* browser may block without user gesture */
179
190
  }
180
- }, [lang]);
191
+ }, [currentTranscript, lang]);
181
192
 
182
193
  const stop = useCallback((): string => {
194
+ const text = currentTranscript();
183
195
  stoppedManuallyRef.current = true;
184
196
  if (restartTimerRef.current !== null) {
185
197
  window.clearTimeout(restartTimerRef.current);
186
198
  restartTimerRef.current = null;
187
199
  }
200
+ interimRef.current = "";
188
201
  setInterimText("");
189
202
  if (recognitionRef.current) {
190
203
  try {
@@ -195,51 +208,57 @@ export function useLiveTranscription(
195
208
  recognitionRef.current = null;
196
209
  }
197
210
  setIsActive(false);
198
- return transcriptRef.current;
199
- }, []);
211
+ return text;
212
+ }, [currentTranscript]);
200
213
 
201
- const stopAndWait = useCallback((timeoutMs = 1200): Promise<string> => {
202
- stoppedManuallyRef.current = true;
203
- if (restartTimerRef.current !== null) {
204
- window.clearTimeout(restartTimerRef.current);
205
- restartTimerRef.current = null;
206
- }
207
- setInterimText("");
208
-
209
- const recognition = recognitionRef.current;
210
- if (!recognition) {
211
- setIsActive(false);
212
- return Promise.resolve(transcriptRef.current);
213
- }
214
+ const stopAndWait = useCallback(
215
+ (timeoutMs = 1200): Promise<string> => {
216
+ stoppedManuallyRef.current = true;
217
+ if (restartTimerRef.current !== null) {
218
+ window.clearTimeout(restartTimerRef.current);
219
+ restartTimerRef.current = null;
220
+ }
221
+ setInterimText("");
214
222
 
215
- return new Promise((resolve) => {
216
- let settled = false;
217
- const finish = (text: string) => {
218
- if (settled) return;
219
- settled = true;
220
- window.clearTimeout(timeout);
221
- if (stopWaiterRef.current === finish) {
222
- stopWaiterRef.current = null;
223
- }
224
- if (recognitionRef.current === recognition) {
225
- recognitionRef.current = null;
226
- }
223
+ const recognition = recognitionRef.current;
224
+ if (!recognition) {
225
+ const text = currentTranscript();
226
+ interimRef.current = "";
227
227
  setIsActive(false);
228
- resolve(text);
229
- };
228
+ return Promise.resolve(text);
229
+ }
230
230
 
231
- const timeout = window.setTimeout(() => {
232
- finish(transcriptRef.current);
233
- }, timeoutMs);
231
+ return new Promise((resolve) => {
232
+ let settled = false;
233
+ const finish = (text: string) => {
234
+ if (settled) return;
235
+ settled = true;
236
+ window.clearTimeout(timeout);
237
+ if (stopWaiterRef.current === finish) {
238
+ stopWaiterRef.current = null;
239
+ }
240
+ if (recognitionRef.current === recognition) {
241
+ recognitionRef.current = null;
242
+ }
243
+ interimRef.current = "";
244
+ setIsActive(false);
245
+ resolve(text);
246
+ };
234
247
 
235
- stopWaiterRef.current = finish;
236
- try {
237
- recognition.stop();
238
- } catch {
239
- finish(transcriptRef.current);
240
- }
241
- });
242
- }, []);
248
+ const timeout = window.setTimeout(() => {
249
+ finish(currentTranscript());
250
+ }, timeoutMs);
251
+
252
+ stopWaiterRef.current = finish;
253
+ try {
254
+ recognition.stop();
255
+ } catch {
256
+ finish(currentTranscript());
257
+ }
258
+ });
259
+ },
260
+ [currentTranscript],
261
+ );
243
262
 
244
263
  const pause = useCallback(() => {
245
264
  if (!recognitionRef.current) return;
@@ -1805,7 +1805,8 @@ async function buildCloudflarePages() {
1805
1805
  // fails: context-xray token counts fall back to char/4 estimates and the
1806
1806
  // OG image route falls back to SVG.
1807
1807
  const heavyClientExternals = CLOUDFLARE_WORKER_ESBUILD_EXTERNALS.filter(
1808
- (p) => !Object.hasOwn(CLOUDFLARE_WORKER_STUB_MODULES, p),
1808
+ (p) =>
1809
+ !Object.prototype.hasOwnProperty.call(CLOUDFLARE_WORKER_STUB_MODULES, p),
1809
1810
  ).map((p) => `--external:${p}`);
1810
1811
 
1811
1812
  execFileSync(
@@ -103,7 +103,7 @@ export function scanDbToolScoping(options: DbToolScopingOptions): GuardResult {
103
103
  const tables = extractTableCalls(contents);
104
104
  for (const table of tables) {
105
105
  if (hasRawDbScope(table.body)) continue;
106
- if (Object.hasOwn(denylist, table.sqlName)) {
106
+ if (Object.prototype.hasOwnProperty.call(denylist, table.sqlName)) {
107
107
  seenAllowed.add(table.sqlName);
108
108
  continue;
109
109
  }
@@ -45,6 +45,17 @@ const SLACK_IDENTITY_CACHE_TTL_MS = 10 * 60 * 1_000;
45
45
  // API blip must not fail-close a sender's identity (and DMs) for 10 minutes.
46
46
  const SLACK_IDENTITY_NEGATIVE_CACHE_TTL_MS = 30 * 1_000;
47
47
  const SLACK_IDENTITY_CACHE_MAX_ENTRIES = 1_000;
48
+ const SLACK_TOKEN_IDENTITY_CACHE_TTL_MS = 10 * 60 * 1_000;
49
+ const SLACK_TOKEN_IDENTITY_NEGATIVE_CACHE_TTL_MS = 30 * 1_000;
50
+
51
+ type SlackTokenIdentity = {
52
+ teamId: string | null;
53
+ appId: string | null;
54
+ valid: boolean;
55
+ expiresAt: number;
56
+ };
57
+
58
+ const slackTokenIdentityCache = new Map<string, SlackTokenIdentity>();
48
59
 
49
60
  interface SlackUserIdentity {
50
61
  email: string | null;
@@ -116,8 +127,7 @@ export function slackAdapter(
116
127
  ): PlatformAdapter {
117
128
  const resolveBotToken = async (incoming: IncomingMessage) =>
118
129
  (await options.resolveBotToken?.(incoming)) ??
119
- (await resolveManagedSlackBotToken(incoming)) ??
120
- (await resolveSecret("SLACK_BOT_TOKEN")) ??
130
+ (await resolveSlackBotTokenForIncoming(incoming)) ??
121
131
  undefined;
122
132
 
123
133
  return {
@@ -713,6 +723,19 @@ function parseAllowlistEnv(name: string): Set<string> | null {
713
723
  return new Set(values);
714
724
  }
715
725
 
726
+ export async function resolveSlackBotTokenForIncoming(
727
+ incoming: IncomingMessage,
728
+ ): Promise<string | undefined> {
729
+ const managedToken = await resolveManagedSlackBotToken(incoming);
730
+ if (managedToken) return managedToken;
731
+
732
+ const legacyToken = await resolveSecret("SLACK_BOT_TOKEN");
733
+ if (!legacyToken) return undefined;
734
+ return (await isSlackTokenForIncoming(legacyToken, incoming))
735
+ ? legacyToken
736
+ : undefined;
737
+ }
738
+
716
739
  async function resolveManagedSlackBotToken(
717
740
  incoming: IncomingMessage,
718
741
  ): Promise<string | undefined> {
@@ -736,13 +759,13 @@ async function resolveManagedSlackBotToken(
736
759
  slackInstallationKey({ teamId, enterpriseId, apiAppId }),
737
760
  )
738
761
  : null;
739
- if (!installation && teamId) {
762
+ if (!installation && !apiAppId && teamId) {
740
763
  installation = await getActiveIntegrationInstallationForTenant(
741
764
  "slack",
742
765
  teamId,
743
766
  );
744
767
  }
745
- if (!installation && enterpriseId) {
768
+ if (!installation && !apiAppId && enterpriseId) {
746
769
  installation = await getActiveIntegrationInstallationForTenant(
747
770
  "slack",
748
771
  enterpriseId,
@@ -757,6 +780,62 @@ async function resolveManagedSlackBotToken(
757
780
  }
758
781
  }
759
782
 
783
+ async function isSlackTokenForIncoming(
784
+ token: string,
785
+ incoming: IncomingMessage,
786
+ ): Promise<boolean> {
787
+ const teamId = slackIdentityValue(incoming.platformContext.teamId);
788
+ const apiAppId = slackIdentityValue(incoming.platformContext.apiAppId);
789
+ if (!teamId && !apiAppId) return true;
790
+
791
+ const cached = slackTokenIdentityCache.get(token);
792
+ if (cached && cached.expiresAt > Date.now()) {
793
+ return (
794
+ cached.valid &&
795
+ (!teamId || cached.teamId === teamId) &&
796
+ (!apiAppId || cached.appId === apiAppId)
797
+ );
798
+ }
799
+
800
+ const auth = await slackJson(token, "auth.test", {});
801
+ const authTeamId = slackIdentityValue(auth?.team_id);
802
+ const botId = slackIdentityValue(auth?.bot_id);
803
+ let appId: string | null = null;
804
+ let valid = !!auth;
805
+
806
+ if (valid && apiAppId) {
807
+ const bot = botId
808
+ ? await slackJson(token, "bots.info", { bot: botId })
809
+ : null;
810
+ appId = slackIdentityValue(bot?.bot?.app_id);
811
+ valid = !!appId;
812
+ }
813
+
814
+ const identity: SlackTokenIdentity = {
815
+ teamId: authTeamId,
816
+ appId,
817
+ valid,
818
+ expiresAt:
819
+ Date.now() +
820
+ (valid
821
+ ? SLACK_TOKEN_IDENTITY_CACHE_TTL_MS
822
+ : SLACK_TOKEN_IDENTITY_NEGATIVE_CACHE_TTL_MS),
823
+ };
824
+ slackTokenIdentityCache.set(token, identity);
825
+
826
+ return (
827
+ valid &&
828
+ (!teamId || identity.teamId === teamId) &&
829
+ (!apiAppId || identity.appId === apiAppId)
830
+ );
831
+ }
832
+
833
+ function slackIdentityValue(value: unknown): string | null {
834
+ if (typeof value !== "string") return null;
835
+ const normalized = value.trim();
836
+ return normalized && normalized !== "unknown" ? normalized : null;
837
+ }
838
+
760
839
  let _missingAllowlistWarned = false;
761
840
 
762
841
  /**
@@ -1079,7 +1158,7 @@ async function resolveSlackThreadPermalink(
1079
1158
  if (typeof channelId !== "string" || typeof threadTs !== "string") {
1080
1159
  return undefined;
1081
1160
  }
1082
- const token = resolvedToken ?? (await resolveSecret("SLACK_BOT_TOKEN"));
1161
+ const token = resolvedToken;
1083
1162
  if (!token) return undefined;
1084
1163
 
1085
1164
  try {
@@ -114,7 +114,11 @@ export type {
114
114
  } from "./remote-types.js";
115
115
 
116
116
  // Adapters
117
- export { slackAdapter, type SlackAdapterOptions } from "./adapters/slack.js";
117
+ export {
118
+ resolveSlackBotTokenForIncoming,
119
+ slackAdapter,
120
+ type SlackAdapterOptions,
121
+ } from "./adapters/slack.js";
118
122
  export { telegramAdapter } from "./adapters/telegram.js";
119
123
  export { whatsappAdapter } from "./adapters/whatsapp.js";
120
124
  export { discordAdapter } from "./adapters/discord.js";
@@ -337,6 +337,12 @@ const messages = {
337
337
  configureProviderKeys: "Configure Anthropic, OpenAI, or another provider",
338
338
  checkingAiConnection: "Checking AI connection...",
339
339
  connectionUnavailable: "Unable to check AI connection. Click to retry.",
340
+ delegatedAgent: {
341
+ asking: "Asking {{name}}...",
342
+ asked: "Asked {{name}}",
343
+ error: "Error asking {{name}}",
344
+ elapsed: "{{duration}} elapsed",
345
+ },
340
346
  voiceMode: {
341
347
  entryButtonLabel: "Use microphone",
342
348
  promptTitle: "Use your voice",
@@ -806,7 +812,7 @@ const messages = {
806
812
  connected: "Connected",
807
813
  configure: "Configure",
808
814
  connect: "Connect",
809
- connectWithOAuth: "Connect with OAuth",
815
+ connectWithOAuth: "Connect",
810
816
  useApiToken: "Use API token",
811
817
  connectSuggestion: "Connect {{name}} to use it in chat",
812
818
  connectSuggestionWithApiToken:
@@ -4,10 +4,11 @@ import type { OAuthClientInformationMixed } from "@modelcontextprotocol/sdk/shar
4
4
  import {
5
5
  deleteCookie,
6
6
  defineEventHandler,
7
+ getChunkedCookie,
7
8
  getCookie,
8
9
  getMethod,
9
10
  getQuery,
10
- setCookie,
11
+ setChunkedCookie,
11
12
  setResponseStatus,
12
13
  type H3Event,
13
14
  } from "h3";
@@ -32,6 +33,9 @@ import {
32
33
 
33
34
  const FLOW_COOKIE = "an_mcp_oauth_flow";
34
35
  const FLOW_TTL_SECONDS = 10 * 60;
36
+ const FLOW_COOKIE_CHUNK_SIZE = 2_800;
37
+ const FLOW_COOKIE_MAX_CHUNKS = 8;
38
+ const CHUNKED_COOKIE_PREFIX = "__chunked__";
35
39
 
36
40
  export interface McpOAuthFlow {
37
41
  name: string;
@@ -189,13 +193,7 @@ async function handleMcpOAuthStart(
189
193
  ...(safeReturnUrl ? { returnUrl: safeReturnUrl } : {}),
190
194
  expiresAt: Date.now() + FLOW_TTL_SECONDS * 1_000,
191
195
  };
192
- setCookie(event, FLOW_COOKIE, encryptSecretValue(JSON.stringify(flow)), {
193
- httpOnly: true,
194
- secure: redirectUri.startsWith("https://"),
195
- sameSite: "lax",
196
- path: "/",
197
- maxAge: FLOW_TTL_SECONDS,
198
- });
196
+ setMcpOAuthFlowCookie(event, flow, redirectUri.startsWith("https://"));
199
197
  return redirectWithStagedCookies(event, started.authorizationUrl.href);
200
198
  } catch {
201
199
  setResponseStatus(event, 400);
@@ -217,8 +215,8 @@ async function handleMcpOAuthCallback(
217
215
  const code = text(query.code);
218
216
  const state = text(query.state);
219
217
  const providerError = text(query.error);
220
- const flow = readFlow(event);
221
- deleteCookie(event, FLOW_COOKIE, { path: "/" });
218
+ const flow = readMcpOAuthFlowCookie(event);
219
+ clearMcpOAuthFlowCookies(event);
222
220
  if (providerError || !code || !state) {
223
221
  setResponseStatus(event, 400);
224
222
  return { error: "MCP OAuth authorization was not completed." };
@@ -275,8 +273,36 @@ async function handleMcpOAuthCallback(
275
273
  }
276
274
  }
277
275
 
278
- function readFlow(event: H3Event): McpOAuthFlow | null {
279
- const encrypted = getCookie(event, FLOW_COOKIE);
276
+ export function setMcpOAuthFlowCookie(
277
+ event: H3Event,
278
+ flow: McpOAuthFlow,
279
+ secure: boolean,
280
+ ): void {
281
+ const encrypted = encryptSecretValue(JSON.stringify(flow));
282
+ const chunkCount = Math.ceil(encrypted.length / FLOW_COOKIE_CHUNK_SIZE);
283
+ if (chunkCount > FLOW_COOKIE_MAX_CHUNKS) {
284
+ throw new Error("MCP OAuth flow state exceeds the cookie size limit.");
285
+ }
286
+ setChunkedCookie(event, FLOW_COOKIE, encrypted, {
287
+ httpOnly: true,
288
+ secure,
289
+ sameSite: "lax",
290
+ path: "/",
291
+ maxAge: FLOW_TTL_SECONDS,
292
+ chunkMaxLength: FLOW_COOKIE_CHUNK_SIZE,
293
+ });
294
+ }
295
+
296
+ export function readMcpOAuthFlowCookie(event: H3Event): McpOAuthFlow | null {
297
+ const primaryCookie = getCookie(event, FLOW_COOKIE);
298
+ if (!primaryCookie) return null;
299
+ if (primaryCookie.startsWith(CHUNKED_COOKIE_PREFIX)) {
300
+ const rawCount = primaryCookie.slice(CHUNKED_COOKIE_PREFIX.length);
301
+ if (!/^\d+$/.test(rawCount)) return null;
302
+ const chunkCount = Number(rawCount);
303
+ if (chunkCount < 2 || chunkCount > FLOW_COOKIE_MAX_CHUNKS) return null;
304
+ }
305
+ const encrypted = getChunkedCookie(event, FLOW_COOKIE);
280
306
  if (!encrypted) return null;
281
307
  try {
282
308
  const parsed = JSON.parse(decryptSecretValue(encrypted)) as McpOAuthFlow;
@@ -286,6 +312,13 @@ function readFlow(event: H3Event): McpOAuthFlow | null {
286
312
  }
287
313
  }
288
314
 
315
+ export function clearMcpOAuthFlowCookies(event: H3Event): void {
316
+ deleteCookie(event, FLOW_COOKIE, { path: "/" });
317
+ for (let index = 1; index <= FLOW_COOKIE_MAX_CHUNKS; index += 1) {
318
+ deleteCookie(event, `${FLOW_COOKIE}.${index}`, { path: "/" });
319
+ }
320
+ }
321
+
289
322
  export function isValidMcpOAuthFlow(
290
323
  flow: McpOAuthFlow,
291
324
  email: string,
@@ -15,8 +15,6 @@ import {
15
15
  normalizeModelForEngine,
16
16
  } from "../../agent/engine/index.js";
17
17
  import type { ActionTool } from "../../agent/types.js";
18
- import { resolveHostedDefaultModelExperiment } from "../../observability/hosted-model-experiment.js";
19
- import { getRequestUserEmail } from "../../server/request-context.js";
20
18
  import { getSetting } from "../../settings/index.js";
21
19
 
22
20
  export const tool: ActionTool = {
@@ -91,15 +89,6 @@ export async function run(args: Record<string, string> = {}): Promise<string> {
91
89
  currentModelCandidate ?? currentEntry.defaultModel,
92
90
  )
93
91
  : (currentModelCandidate ?? DEFAULT_MODEL);
94
- const hostedExperiment = currentEntry
95
- ? resolveHostedDefaultModelExperiment({
96
- userId: getRequestUserEmail(),
97
- engineName: currentEntry.name,
98
- isDefaultModelSelection: currentModelCandidate == null,
99
- supportedModels: currentEntry.supportedModels,
100
- })
101
- : null;
102
- const effectiveCurrentModel = hostedExperiment?.model ?? currentModel;
103
92
  const result = {
104
93
  engines: engines.map((e) => ({
105
94
  name: e.name,
@@ -116,13 +105,7 @@ export async function run(args: Record<string, string> = {}): Promise<string> {
116
105
  ? null
117
106
  : {
118
107
  engine: currentEngineName,
119
- model: effectiveCurrentModel,
120
- ...(hostedExperiment
121
- ? {
122
- modelSelectionSource: "experiment",
123
- experimentAssignments: [hostedExperiment.assignment],
124
- }
125
- : {}),
108
+ model: currentModel,
126
109
  },
127
110
  };
128
111