@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,3 +1,5 @@
1
+ import { randomUUID } from "node:crypto";
2
+
1
3
  import Ajv, { type ValidateFunction } from "ajv";
2
4
  import {
3
5
  defineEventHandler,
@@ -8,6 +10,8 @@ import {
8
10
  } from "h3";
9
11
  import type { EventHandler as H3EventHandler } from "h3";
10
12
 
13
+ import { parseA2AAgentActivityPart } from "../a2a/activity.js";
14
+ import type { Task } from "../a2a/types.js";
11
15
  import {
12
16
  isAgentActionStopError,
13
17
  type ActionAutomationContext,
@@ -1725,6 +1729,159 @@ export async function resolveSkillReferenceContent(
1725
1729
  }
1726
1730
  }
1727
1731
 
1732
+ export function createConnectedAgentReferenceEventRelay(input: {
1733
+ agent: string;
1734
+ send: (event: AgentChatEvent) => void;
1735
+ agentCallId?: string;
1736
+ now?: () => number;
1737
+ }) {
1738
+ const agentCallId = input.agentCallId ?? randomUUID();
1739
+ const now = input.now ?? Date.now;
1740
+ const startedAt = now();
1741
+ let lastActivitySequence = -1;
1742
+ let hasRichActivity = false;
1743
+
1744
+ const emitResponseText = (text: string) => {
1745
+ if (text) {
1746
+ input.send({
1747
+ type: "agent_call_text",
1748
+ agent: input.agent,
1749
+ text,
1750
+ agentCallId,
1751
+ });
1752
+ }
1753
+ };
1754
+ const observeActivity = (task: Task) => {
1755
+ const parts = task.status?.message?.parts;
1756
+ const snapshot = Array.isArray(parts)
1757
+ ? parts.map(parseA2AAgentActivityPart).find((value) => value !== null)
1758
+ : undefined;
1759
+ if (snapshot) {
1760
+ hasRichActivity = true;
1761
+ }
1762
+ if (snapshot && snapshot.sequence > lastActivitySequence) {
1763
+ lastActivitySequence = snapshot.sequence;
1764
+ input.send({
1765
+ type: "agent_call_activity",
1766
+ agent: input.agent,
1767
+ agentCallId,
1768
+ snapshot,
1769
+ });
1770
+ }
1771
+ };
1772
+ const observePollUpdate = (task: Task) => {
1773
+ observeActivity(task);
1774
+ if (hasRichActivity) return;
1775
+
1776
+ const state = task.status?.state;
1777
+ if (
1778
+ state !== "submitted" &&
1779
+ state !== "working" &&
1780
+ state !== "processing"
1781
+ ) {
1782
+ return;
1783
+ }
1784
+ const currentTime = now();
1785
+ const detail = extractConnectedAgentProgressDetail(task);
1786
+ input.send({
1787
+ type: "agent_call_progress",
1788
+ agent: input.agent,
1789
+ agentCallId,
1790
+ state,
1791
+ elapsedSeconds: Math.max(0, Math.round((currentTime - startedAt) / 1000)),
1792
+ ...(detail ? { detail } : {}),
1793
+ });
1794
+ };
1795
+
1796
+ return {
1797
+ agentCallId,
1798
+ start() {
1799
+ input.send({
1800
+ type: "agent_call",
1801
+ agent: input.agent,
1802
+ status: "start",
1803
+ agentCallId,
1804
+ });
1805
+ },
1806
+ observeActivity,
1807
+ observePollUpdate,
1808
+ emitResponseText,
1809
+ finish(status: "done" | "error") {
1810
+ input.send({
1811
+ type: "agent_call",
1812
+ agent: input.agent,
1813
+ status,
1814
+ agentCallId,
1815
+ durationMs: Math.max(0, now() - startedAt),
1816
+ });
1817
+ },
1818
+ };
1819
+ }
1820
+
1821
+ type ConnectedAgentCall = typeof import("../a2a/client.js").callAgent;
1822
+ type ResolveConnectedAgentCallerAuth =
1823
+ typeof import("../a2a/caller-auth.js").resolveA2ACallerAuth;
1824
+
1825
+ export async function callConnectedAgentReference(input: {
1826
+ agent: string;
1827
+ path: string;
1828
+ message: string;
1829
+ send: (event: AgentChatEvent) => void;
1830
+ callAgent: ConnectedAgentCall;
1831
+ resolveCallerAuth: ResolveConnectedAgentCallerAuth;
1832
+ agentCallId?: string;
1833
+ now?: () => number;
1834
+ }): Promise<string> {
1835
+ const relay = createConnectedAgentReferenceEventRelay({
1836
+ agent: input.agent,
1837
+ send: input.send,
1838
+ agentCallId: input.agentCallId,
1839
+ now: input.now,
1840
+ });
1841
+ relay.start();
1842
+ try {
1843
+ const callerAuth = await input.resolveCallerAuth({
1844
+ includeGoogleToken: true,
1845
+ });
1846
+ const response = await input.callAgent(input.path, input.message, {
1847
+ async: true,
1848
+ apiKey: callerAuth.apiKey,
1849
+ metadata: callerAuth.metadata,
1850
+ userEmail: callerAuth.userEmail,
1851
+ orgDomain: callerAuth.orgDomain,
1852
+ orgSecret: callerAuth.orgSecret,
1853
+ onUpdate: relay.observePollUpdate,
1854
+ });
1855
+ const responseText =
1856
+ userFacingLlmCredentialError(response, { agentName: input.agent }) ??
1857
+ response;
1858
+ relay.emitResponseText(responseText);
1859
+ relay.finish("done");
1860
+ return responseText;
1861
+ } catch (error) {
1862
+ relay.finish("error");
1863
+ throw error;
1864
+ }
1865
+ }
1866
+
1867
+ const MAX_CONNECTED_AGENT_PROGRESS_DETAIL_CHARS = 200;
1868
+ function extractConnectedAgentProgressDetail(task: Task): string | undefined {
1869
+ const parts = task.status?.message?.parts;
1870
+ if (!Array.isArray(parts)) return undefined;
1871
+ const text = parts
1872
+ .filter(
1873
+ (part): part is { type: "text"; text: string } => part.type === "text",
1874
+ )
1875
+ .map((part) => part.text)
1876
+ .join(" ")
1877
+ .replace(/\s+/g, " ")
1878
+ .trim();
1879
+ if (!text) return undefined;
1880
+ return text.length > MAX_CONNECTED_AGENT_PROGRESS_DETAIL_CHARS
1881
+ ? `${text.slice(0, MAX_CONNECTED_AGENT_PROGRESS_DETAIL_CHARS - 1)}…`
1882
+ : text;
1883
+ }
1884
+
1728
1885
  async function enrichMessage(
1729
1886
  message: string,
1730
1887
  references: AgentChatReference[],
@@ -6700,22 +6857,6 @@ export function createProductionAgentHandler(
6700
6857
  modelSelectionSource = "experiment";
6701
6858
  }
6702
6859
  }
6703
-
6704
- if (modelSelectionSource === "default") {
6705
- const { resolveHostedDefaultModelExperiment } =
6706
- await import("../observability/hosted-model-experiment.js");
6707
- const hostedExperiment = resolveHostedDefaultModelExperiment({
6708
- userId: ownerEmail,
6709
- engineName: engine.name,
6710
- isDefaultModelSelection: true,
6711
- supportedModels: engine.supportedModels,
6712
- });
6713
- if (hostedExperiment) {
6714
- effectiveModel = hostedExperiment.model;
6715
- experimentAssignments.push(hostedExperiment.assignment);
6716
- modelSelectionSource = "experiment";
6717
- }
6718
- }
6719
6860
  }
6720
6861
  } catch {
6721
6862
  // Experiments are best-effort. Model resolution must keep working if the
@@ -8015,97 +8156,23 @@ export function createProductionAgentHandler(
8015
8156
 
8016
8157
  // Resolve connected agent @-mentions via A2A calls.
8017
8158
  if (agentRefs.length > 0 && requestMode !== "plan") {
8018
- const [{ A2AClient, callAgent }, { resolveA2ACallerAuth }] =
8019
- await Promise.all([
8020
- import("../a2a/client.js"),
8021
- import("../a2a/caller-auth.js"),
8022
- ]);
8159
+ const [{ callAgent }, { resolveA2ACallerAuth }] = await Promise.all([
8160
+ import("../a2a/client.js"),
8161
+ import("../a2a/caller-auth.js"),
8162
+ ]);
8023
8163
  const results = await Promise.allSettled(
8024
8164
  agentRefs.map(async (ref) => {
8025
- send({
8026
- type: "agent_call",
8027
- agent: ref.name,
8028
- status: "start",
8029
- });
8030
8165
  try {
8031
- const callerAuth = await resolveA2ACallerAuth({
8032
- includeGoogleToken: true,
8033
- });
8034
- const a2aClient = new A2AClient(ref.path, callerAuth.apiKey, {
8035
- ...(callerAuth.apiKeyFallbacks
8036
- ? { fallbackApiKeys: callerAuth.apiKeyFallbacks }
8037
- : {}),
8038
- });
8039
- const a2aMetadata = callerAuth.metadata;
8040
-
8041
- let responseText = "";
8042
- let lastSentLength = 0;
8043
-
8044
- try {
8045
- for await (const task of a2aClient.stream(
8046
- {
8047
- role: "user",
8048
- parts: [
8049
- {
8050
- type: "text",
8051
- text: enrichedMessage + screenContext,
8052
- },
8053
- ],
8054
- },
8055
- Object.keys(a2aMetadata).length > 0
8056
- ? { metadata: a2aMetadata }
8057
- : undefined,
8058
- )) {
8059
- const newText =
8060
- task.status?.message?.parts
8061
- ?.filter(
8062
- (p): p is { type: "text"; text: string } =>
8063
- p.type === "text",
8064
- )
8065
- ?.map((p) => p.text)
8066
- ?.join("") ?? "";
8067
-
8068
- if (newText.length > lastSentLength) {
8069
- send({
8070
- type: "agent_call_text",
8071
- agent: ref.name,
8072
- text: newText.slice(lastSentLength),
8073
- });
8074
- lastSentLength = newText.length;
8075
- }
8076
- responseText = newText;
8077
- }
8078
- } catch {
8079
- if (!responseText) {
8080
- responseText = await callAgent(
8081
- ref.path,
8082
- enrichedMessage + screenContext,
8083
- {
8084
- apiKey: callerAuth.apiKey,
8085
- userEmail: callerAuth.userEmail,
8086
- orgDomain: callerAuth.orgDomain,
8087
- orgSecret: callerAuth.orgSecret,
8088
- },
8089
- );
8090
- }
8091
- }
8092
- responseText =
8093
- userFacingLlmCredentialError(responseText, {
8094
- agentName: ref.name,
8095
- }) ?? responseText;
8096
-
8097
- send({
8098
- type: "agent_call",
8166
+ const responseText = await callConnectedAgentReference({
8099
8167
  agent: ref.name,
8100
- status: "done",
8168
+ path: ref.path,
8169
+ message: enrichedMessage + screenContext,
8170
+ send,
8171
+ callAgent,
8172
+ resolveCallerAuth: resolveA2ACallerAuth,
8101
8173
  });
8102
8174
  return `<agent-response name="${ref.name}" id="${ref.refId}">\n${responseText}\n</agent-response>`;
8103
8175
  } catch (err: any) {
8104
- send({
8105
- type: "agent_call",
8106
- agent: ref.name,
8107
- status: "error",
8108
- });
8109
8176
  const message =
8110
8177
  userFacingLlmCredentialError(err, {
8111
8178
  agentName: ref.name,
@@ -1,3 +1,4 @@
1
+ import type { A2AAgentActivitySnapshot } from "../a2a/activity.js";
1
2
  import type { ActionChatUIConfig } from "../action-ui.js";
2
3
  import type { AgentMcpAppPayload } from "../mcp-client/app-result.js";
3
4
  import type { ReasoningEffort } from "../shared/reasoning-effort.js";
@@ -273,6 +274,8 @@ export type AgentChatEvent =
273
274
  type: "agent_call";
274
275
  agent: string;
275
276
  status: "start" | "done" | "error";
277
+ agentCallId?: string;
278
+ durationMs?: number;
276
279
  }
277
280
  | {
278
281
  /**
@@ -296,8 +299,20 @@ export type AgentChatEvent =
296
299
  elapsedSeconds: number;
297
300
  /** Optional short text surfaced from the remote poll, when present. */
298
301
  detail?: string;
302
+ agentCallId?: string;
303
+ }
304
+ | {
305
+ type: "agent_call_text";
306
+ agent: string;
307
+ text: string;
308
+ agentCallId?: string;
309
+ }
310
+ | {
311
+ type: "agent_call_activity";
312
+ agent: string;
313
+ snapshot: A2AAgentActivitySnapshot;
314
+ agentCallId?: string;
299
315
  }
300
- | { type: "agent_call_text"; agent: string; text: string }
301
316
  | {
302
317
  type: "agent_task";
303
318
  taskId: string;
package/src/cli/index.ts CHANGED
@@ -203,12 +203,12 @@ function parseScaffoldArgs(argv: string[]): {
203
203
  // Track CLI usage (best-effort, non-blocking)
204
204
  function trackCli(event: string, props?: Record<string, unknown>): void {
205
205
  try {
206
- import("../tracking/registry.js").then((m) => {
207
- m.track(event, { command, ...props });
208
- });
209
- import("../tracking/providers.js").then((m) =>
210
- m.registerBuiltinProviders(),
211
- );
206
+ void import("../tracking/registry.js")
207
+ .then((m) => m.track(event, { command, ...props }))
208
+ .catch(() => undefined);
209
+ void import("../tracking/providers.js")
210
+ .then((m) => m.registerBuiltinProviders())
211
+ .catch(() => undefined);
212
212
  } catch {}
213
213
  }
214
214
 
@@ -219,7 +219,9 @@ process.on("uncaughtException", (err) => {
219
219
  console.error(` Send feedback: ${FEEDBACK_URL}\n`);
220
220
  trackCli("cli.crash", { error: err.message });
221
221
  Sentry.captureException(err);
222
- Sentry.flush(2000).finally(() => process.exit(1));
222
+ void Sentry.flush(2000)
223
+ .catch(() => undefined)
224
+ .finally(() => process.exit(1));
223
225
  });
224
226
 
225
227
  process.on("unhandledRejection", (reason: any) => {
@@ -228,7 +230,9 @@ process.on("unhandledRejection", (reason: any) => {
228
230
  console.error(` Send feedback: ${FEEDBACK_URL}\n`);
229
231
  trackCli("cli.crash", { error: reason?.message ?? String(reason) });
230
232
  Sentry.captureException(reason);
231
- Sentry.flush(2000).finally(() => process.exit(1));
233
+ void Sentry.flush(2000)
234
+ .catch(() => undefined)
235
+ .finally(() => process.exit(1));
232
236
  });
233
237
 
234
238
  // Surface a self-heal hint when an interrupted `npx @agent-native/core@latest ...`
@@ -961,14 +965,18 @@ switch (command) {
961
965
  }
962
966
 
963
967
  case "setup-agents": {
964
- import("./setup-agents.js").then((m) => m.runSetupAgents());
968
+ import("./setup-agents.js")
969
+ .then((m) => m.runSetupAgents())
970
+ .catch(handleScaffoldImportError);
965
971
  break;
966
972
  }
967
973
 
968
974
  case "info": {
969
975
  // Print read-only info about an installable package (e.g. @agent-native/scheduling).
970
976
  // Lists subpath exports, source paths in node_modules, and docs pointers.
971
- import("./info.js").then((m) => m.runInfo(args[0]));
977
+ import("./info.js")
978
+ .then((m) => m.runInfo(args[0]))
979
+ .catch(handleScaffoldImportError);
972
980
  break;
973
981
  }
974
982
 
@@ -438,8 +438,8 @@ export function transitionStoredMultiFrontierRun(
438
438
  const isFullStoredRun = hasStoredRunTimestamps(candidate);
439
439
  if (
440
440
  !isFullStoredRun &&
441
- (Object.hasOwn(candidate, "createdAt") ||
442
- Object.hasOwn(candidate, "updatedAt"))
441
+ (Object.prototype.hasOwnProperty.call(candidate, "createdAt") ||
442
+ Object.prototype.hasOwnProperty.call(candidate, "updatedAt"))
443
443
  ) {
444
444
  throw new Error("Invalid multi-frontier coordinator transition state.");
445
445
  }
@@ -1056,7 +1056,9 @@ function isCompleteMultiFrontierRunState(
1056
1056
 
1057
1057
  function normalizeStoredRunDefaults(value: unknown): unknown {
1058
1058
  if (!value || typeof value !== "object" || Array.isArray(value)) return value;
1059
- if (!Object.hasOwn(value, "autoContinueAfterAgreement")) {
1059
+ if (
1060
+ !Object.prototype.hasOwnProperty.call(value, "autoContinueAfterAgreement")
1061
+ ) {
1060
1062
  return { ...value, autoContinueAfterAgreement: false };
1061
1063
  }
1062
1064
  return value;
@@ -228,18 +228,6 @@ export const TEMPLATES: TemplateMeta[] = [
228
228
  hidden: true,
229
229
  core: false,
230
230
  },
231
- {
232
- name: "crm",
233
- label: "CRM",
234
- hint: "Agent-native CRM companion with scoped HubSpot intelligence, workflows, and write proposals",
235
- icon: "Users",
236
- color: "#2563EB",
237
- colorRgb: "37 99 235",
238
- devPort: 8107,
239
- hidden: true,
240
- defaultMode: "dev",
241
- core: false,
242
- },
243
231
  {
244
232
  name: "macros",
245
233
  label: "Macros",
@@ -465,7 +465,7 @@ function probeHttpReady(
465
465
  },
466
466
  (res) => {
467
467
  res.resume();
468
- finish(true);
468
+ finish((res.statusCode ?? 500) < 500);
469
469
  },
470
470
  );
471
471
  req.setTimeout(timeoutMs, () => finish(false));
@@ -2673,7 +2673,7 @@ export function AgentChatSurface({
2673
2673
  const defaultShowPageNewChatButton =
2674
2674
  shouldDefaultAgentChatSurfacePageNewChatButton(mode, showTabBar);
2675
2675
 
2676
- return (
2676
+ const panel = (
2677
2677
  <AgentPanel
2678
2678
  {...props}
2679
2679
  defaultMode={defaultMode}
@@ -2697,6 +2697,14 @@ export function AgentChatSurface({
2697
2697
  }
2698
2698
  />
2699
2699
  );
2700
+
2701
+ if (!pageMode) return panel;
2702
+ return (
2703
+ <>
2704
+ <URLSync browserTabId={props.browserTabId} />
2705
+ {panel}
2706
+ </>
2707
+ );
2700
2708
  }
2701
2709
 
2702
2710
  // ─── AgentSidebar — wraps content with a toggleable agent panel ─────────────
@@ -45,11 +45,9 @@ export interface RunStuckBannerProps {
45
45
  * `chatHandle.hasInFlightWork()`. "No progress" for a stretch of time does
46
46
  * not mean the run is dead: a long provider query or a cross-app `call
47
47
  * agent` can legitimately emit nothing for minutes. When this returns
48
- * true, Retry (which aborts the run) is hidden — aborting would destroy
49
- * real in-flight work and re-execute the same long call from scratch.
50
- * Only Cancel, an explicit destructive choice, remains available. Checked
51
- * fresh on every render; omit to keep the unconditional Retry/Cancel
52
- * behavior.
48
+ * true, the stuck warning is hidden — aborting would destroy real in-flight
49
+ * work and re-execute the same long call from scratch. Checked fresh on every
50
+ * render; omit to keep the unconditional Retry/Cancel behavior.
53
51
  */
54
52
  hasInFlightWork?: () => boolean;
55
53
  /**
@@ -191,9 +189,9 @@ export function RunStuckBanner({
191
189
  const backgroundWorkerStillAlive = isFreshBackgroundWorker(state);
192
190
  // A live tool call or sub-agent (A2A) call means "no progress" is not the
193
191
  // same as "dead" — the process is genuinely still doing the user's work.
194
- // Retry aborts the run, so it must not be offered as the (implicitly
195
- // safe-looking) primary action while real work is in flight; see the
196
- // `hasInFlightWork` prop doc comment. Re-checked on every render (the
192
+ // Retry aborts the run, so the stuck warning stays out of the way while real
193
+ // work is in flight; see the `hasInFlightWork` prop doc comment. Re-checked
194
+ // on every render (the
197
195
  // underlying source mutates in place as tool/agent-call events stream in),
198
196
  // which is why this is a function prop rather than a plain boolean.
199
197
  //
@@ -308,7 +306,18 @@ export function RunStuckBanner({
308
306
  threadId,
309
307
  ]);
310
308
 
311
- if (!state.isStuck || !state.runId) return null;
309
+ // A stale progress timestamp is not actionable while the server is still
310
+ // heartbeating or an unresolved tool/A2A call is known to be running. Keep
311
+ // those healthy long-running states in the chat's inline activity UI; the
312
+ // warning is reserved for runs that may actually need recovery.
313
+ if (
314
+ !state.isStuck ||
315
+ !state.runId ||
316
+ backgroundWorkerStillAlive ||
317
+ inFlightWork
318
+ ) {
319
+ return null;
320
+ }
312
321
 
313
322
  const handleCancel = async () => {
314
323
  if (!state.runId || busy.type !== "none") return;
@@ -323,9 +332,9 @@ export function RunStuckBanner({
323
332
  };
324
333
 
325
334
  const handleRetry = async () => {
326
- // Defense in depth: Retry is hidden while a background worker is still
327
- // heartbeating or work is explicitly in flight (see render below). Guard
328
- // the handler too so this path cannot abort a run the server says is alive.
335
+ // Defense in depth: the banner is hidden while a background worker is
336
+ // still heartbeating or work is explicitly in flight. Guard the handler
337
+ // too so a render transition cannot abort a run the server says is alive.
329
338
  if (
330
339
  !state.runId ||
331
340
  busy.type !== "none" ||
@@ -350,8 +359,6 @@ export function RunStuckBanner({
350
359
  const stuckSeconds =
351
360
  state.stuckSinceMs != null ? Math.floor(state.stuckSinceMs / 1000) : null;
352
361
 
353
- const stillWorking = backgroundWorkerStillAlive || inFlightWork;
354
-
355
362
  return (
356
363
  <div
357
364
  role="status"
@@ -368,51 +375,36 @@ export function RunStuckBanner({
368
375
  />
369
376
  <div className="flex min-w-0 flex-1 flex-col gap-1.5">
370
377
  <div className="leading-snug">
371
- <span className="font-medium">
372
- {stillWorking
373
- ? "The agent is still working."
374
- : "This chat looks stuck."}
375
- </span>{" "}
378
+ <span className="font-medium">This chat looks stuck.</span>{" "}
376
379
  <span className="text-muted-foreground">
377
380
  No progress
378
- {stuckSeconds != null ? ` for ${stuckSeconds}s` : ""}.{" "}
379
- {inFlightWork
380
- ? "It's waiting on a call to another app or a long tool — canceling will stop that work."
381
- : backgroundWorkerStillAlive
382
- ? "The background worker is still alive; large updates can take a few minutes."
383
- : "The agent may have hit a server timeout or lost its connection."}
381
+ {stuckSeconds != null ? ` for ${stuckSeconds}s` : ""}. The agent may
382
+ have hit a server timeout or lost its connection.
384
383
  {autoRetry && busyType === "retry"
385
384
  ? " Retrying automatically now."
386
385
  : ""}
387
386
  </span>
388
387
  </div>
389
388
  <div className="flex flex-wrap items-center gap-2">
390
- {stillWorking ? null : (
391
- <button
392
- type="button"
393
- onClick={handleRetry}
394
- disabled={busyType !== "none"}
395
- className="inline-flex h-7 cursor-pointer items-center gap-1.5 rounded-md bg-foreground px-2.5 text-[11px] font-medium text-background transition-colors hover:bg-foreground/90 disabled:cursor-not-allowed disabled:opacity-60"
396
- >
397
- {busyType === "retry" ? (
398
- <IconLoader2
399
- size={12}
400
- className="animate-spin"
401
- aria-hidden="true"
402
- />
403
- ) : null}
404
- Retry
405
- </button>
406
- )}
389
+ <button
390
+ type="button"
391
+ onClick={handleRetry}
392
+ disabled={busyType !== "none"}
393
+ className="inline-flex h-7 cursor-pointer items-center gap-1.5 rounded-md bg-foreground px-2.5 text-[11px] font-medium text-background transition-colors hover:bg-foreground/90 disabled:cursor-not-allowed disabled:opacity-60"
394
+ >
395
+ {busyType === "retry" ? (
396
+ <IconLoader2
397
+ size={12}
398
+ className="animate-spin"
399
+ aria-hidden="true"
400
+ />
401
+ ) : null}
402
+ Retry
403
+ </button>
407
404
  <button
408
405
  type="button"
409
406
  onClick={handleCancel}
410
407
  disabled={busyType !== "none"}
411
- title={
412
- inFlightWork
413
- ? "Stop the in-progress run. Work that hasn't finished will be lost."
414
- : undefined
415
- }
416
408
  className="inline-flex h-7 cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-2.5 text-[11px] font-medium text-foreground transition-colors hover:bg-accent disabled:cursor-not-allowed disabled:opacity-60"
417
409
  >
418
410
  {busyType === "cancel" ? (
@@ -0,0 +1,32 @@
1
+ import type { ReactNode } from "react";
2
+
3
+ import { ACTION_CHAT_UI_INLINE_EXTENSION_RENDERER } from "../../action-ui.js";
4
+ import { cn } from "../utils.js";
5
+ import type { ToolRendererContext } from "./tool-render-registry.js";
6
+
7
+ export function ActionChatUiSurface({
8
+ context,
9
+ isBuiltinDataWidget,
10
+ children,
11
+ }: {
12
+ context: ToolRendererContext;
13
+ isBuiltinDataWidget: boolean;
14
+ children: ReactNode;
15
+ }) {
16
+ if (!context.chatUI || isBuiltinDataWidget) return <>{children}</>;
17
+
18
+ const containsPaddedIframe =
19
+ context.chatUI.renderer === ACTION_CHAT_UI_INLINE_EXTENSION_RENDERER;
20
+
21
+ return (
22
+ <div
23
+ data-agent-native-custom-ui=""
24
+ className={cn(
25
+ "my-3 overflow-hidden rounded-lg border border-border bg-card text-card-foreground shadow-sm empty:hidden",
26
+ !containsPaddedIframe && "p-3",
27
+ )}
28
+ >
29
+ {children}
30
+ </div>
31
+ );
32
+ }