@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 { createHash, randomUUID } from "node:crypto";
2
2
 
3
+ import { parseA2AAgentActivityPart } from "../a2a/activity.js";
3
4
  import {
4
5
  A2ATaskTimeoutError,
5
6
  callAgent,
@@ -271,8 +272,15 @@ export async function run(
271
272
  : undefined;
272
273
 
273
274
  if (action) {
275
+ const agentCallId = randomUUID();
276
+ const startedAt = Date.now();
274
277
  if (context?.send) {
275
- context.send({ type: "agent_call", agent: agent.name, status: "start" });
278
+ context.send({
279
+ type: "agent_call",
280
+ agent: agent.name,
281
+ status: "start",
282
+ agentCallId,
283
+ });
276
284
  }
277
285
  try {
278
286
  const output = await invokeReadOnlyAppAction(
@@ -281,10 +289,24 @@ export async function run(
281
289
  input as Record<string, unknown>,
282
290
  buildDelegationCorrelation(context, selfAppId, randomUUID()),
283
291
  );
292
+ if (context?.send && output) {
293
+ context.send({
294
+ type: "agent_call_text",
295
+ agent: agent.name,
296
+ text: output,
297
+ agentCallId,
298
+ });
299
+ }
284
300
  return output;
285
301
  } finally {
286
302
  if (context?.send) {
287
- context.send({ type: "agent_call", agent: agent.name, status: "done" });
303
+ context.send({
304
+ type: "agent_call",
305
+ agent: agent.name,
306
+ status: "done",
307
+ agentCallId,
308
+ durationMs: Date.now() - startedAt,
309
+ });
288
310
  }
289
311
  }
290
312
  }
@@ -363,6 +385,7 @@ export async function run(
363
385
 
364
386
  let responseText = "";
365
387
  let lastSentLength = 0;
388
+ const agentCallId = randomUUID();
366
389
  const existingContinuationText = taskId
367
390
  ? null
368
391
  : await formatExistingIntegrationContinuationIfRetry(agent, message);
@@ -372,6 +395,7 @@ export async function run(
372
395
  type: "agent_call",
373
396
  agent: agent.name,
374
397
  status: "start",
398
+ agentCallId,
375
399
  });
376
400
 
377
401
  const emitNewText = (newText: string) => {
@@ -380,6 +404,7 @@ export async function run(
380
404
  type: "agent_call_text",
381
405
  agent: agent.name,
382
406
  text: newText.slice(lastSentLength),
407
+ agentCallId,
383
408
  });
384
409
  lastSentLength = newText.length;
385
410
  }
@@ -395,9 +420,10 @@ export async function run(
395
420
  // time we get to the sync fallback, Lambda is dead and the second fetch
396
421
  // errors out as "fetch failed". Async+poll has its own short fetches
397
422
  // with their own budgets, so it works reliably across hosts. The
398
- // trade-off is we lose progressive in-UI text streaming for cross-app
399
- // A2A calls, but the receiving agent's full response still surfaces via
400
- // the tool_result event below.
423
+ // trade-off is that cross-app activity arrives at the poll cadence rather
424
+ // than token-by-token. Agent Native peers attach their current reasoning,
425
+ // tool status, and response preview to each task checkpoint, and the
426
+ // receiver's full response still surfaces below.
401
427
  //
402
428
  // That trade-off has a second-order cost: callAgent()'s poll (see
403
429
  // A2AClient.sendAndWait in a2a/client.ts) can legitimately run for
@@ -450,8 +476,22 @@ export async function run(
450
476
  ]);
451
477
  const callStartedAt = Date.now();
452
478
  let lastProgressEmitAt = callStartedAt;
479
+ let lastActivitySequence = -1;
453
480
  const onRemotePollUpdate = (task: Task) => {
454
481
  const state = task?.status?.state;
482
+ const parts = task.status?.message?.parts;
483
+ const snapshot = Array.isArray(parts)
484
+ ? parts.map(parseA2AAgentActivityPart).find((value) => value !== null)
485
+ : undefined;
486
+ if (snapshot && snapshot.sequence > lastActivitySequence) {
487
+ lastActivitySequence = snapshot.sequence;
488
+ context.send!({
489
+ type: "agent_call_activity",
490
+ agent: agent.name,
491
+ agentCallId,
492
+ snapshot,
493
+ });
494
+ }
455
495
  if (!state || !ACTIVELY_WORKING_STATES.has(state)) return;
456
496
  const now = Date.now();
457
497
  if (now - lastProgressEmitAt < PROGRESS_MIN_INTERVAL_MS) return;
@@ -462,6 +502,7 @@ export async function run(
462
502
  agent: agent.name,
463
503
  state,
464
504
  elapsedSeconds: Math.round((now - callStartedAt) / 1000),
505
+ agentCallId,
465
506
  ...(detail ? { detail } : {}),
466
507
  });
467
508
  };
@@ -549,6 +590,8 @@ export async function run(
549
590
  type: "agent_call",
550
591
  agent: agent.name,
551
592
  status: "done",
593
+ agentCallId,
594
+ durationMs: Date.now() - callStartedAt,
552
595
  });
553
596
 
554
597
  return responseText || "(empty response)";
@@ -718,7 +761,7 @@ async function enqueueIntegrationContinuationIfPossible(
718
761
  const MAX_PROGRESS_DETAIL_CHARS = 200;
719
762
  function extractRemoteProgressDetail(task: Task): string | undefined {
720
763
  const parts = task.status?.message?.parts;
721
- if (!parts) return undefined;
764
+ if (!Array.isArray(parts)) return undefined;
722
765
  const text = parts
723
766
  .filter((p): p is { type: "text"; text: string } => p.type === "text")
724
767
  .map((p) => p.text)
@@ -13,6 +13,11 @@ import {
13
13
  type H3Event,
14
14
  } from "h3";
15
15
 
16
+ import {
17
+ applyA2AAgentActivityEvent,
18
+ buildA2AAgentActivityPart,
19
+ createA2AAgentActivityState,
20
+ } from "../a2a/activity.js";
16
21
  import {
17
22
  appendA2AArtifactLinks,
18
23
  buildA2ARecoverableArtifactMessage,
@@ -400,6 +405,8 @@ export function createSerializedA2ATaskStatusWriter(
400
405
  };
401
406
  }
402
407
 
408
+ const A2A_ACTIVITY_CHECKPOINT_MIN_INTERVAL_MS = 2_000;
409
+
403
410
  export async function resolveA2ARecoverableArtifactSecret(
404
411
  orgId: string | null | undefined = getRequestOrgId(),
405
412
  ): Promise<string | undefined> {
@@ -1656,10 +1663,36 @@ export function createAgentChatPlugin(
1656
1663
  const a2aEvents: AgentChatEvent[] = [];
1657
1664
  const a2aToolResults: A2AToolResultSummary[] = [];
1658
1665
  let lastRecoverableArtifactText = "";
1666
+ let activityState = createA2AAgentActivityState();
1667
+ let lastActivityCheckpointAt = 0;
1659
1668
  const recoverableArtifactSecret =
1660
1669
  await resolveA2ARecoverableArtifactSecret();
1661
1670
  const recoverableArtifactStatusWriter =
1662
1671
  createSerializedA2ATaskStatusWriter(context.taskId);
1672
+ const activityStatusMessage = (): A2AMessage => ({
1673
+ role: "agent",
1674
+ ...(lastRecoverableArtifactText
1675
+ ? { metadata: { agentNativeRecoverableArtifacts: true } }
1676
+ : {}),
1677
+ parts: [
1678
+ buildA2AAgentActivityPart(activityState),
1679
+ ...(lastRecoverableArtifactText
1680
+ ? [{ type: "text" as const, text: lastRecoverableArtifactText }]
1681
+ : []),
1682
+ ],
1683
+ });
1684
+ const checkpointActivity = (force = false) => {
1685
+ const now = Date.now();
1686
+ if (
1687
+ !force &&
1688
+ now - lastActivityCheckpointAt <
1689
+ A2A_ACTIVITY_CHECKPOINT_MIN_INTERVAL_MS
1690
+ ) {
1691
+ return;
1692
+ }
1693
+ lastActivityCheckpointAt = now;
1694
+ recoverableArtifactStatusWriter.enqueue(activityStatusMessage());
1695
+ };
1663
1696
  const controller = new AbortController();
1664
1697
  const correlation = sanitizeA2ACorrelationMetadata(context.metadata);
1665
1698
  const telemetryThreadId =
@@ -1697,6 +1730,12 @@ export function createAgentChatPlugin(
1697
1730
  turnId: context.taskId,
1698
1731
  send: (event) => {
1699
1732
  a2aEvents.push(event);
1733
+ const nextActivityState = applyA2AAgentActivityEvent(
1734
+ activityState,
1735
+ event,
1736
+ );
1737
+ const activityChanged = nextActivityState !== activityState;
1738
+ activityState = nextActivityState;
1700
1739
  if (event.type === "tool_start") {
1701
1740
  console.log(`[A2A] Tool call: ${event.tool}`);
1702
1741
  } else if (event.type === "tool_done") {
@@ -1727,22 +1766,20 @@ export function createAgentChatPlugin(
1727
1766
  recoverableArtifactText !== lastRecoverableArtifactText
1728
1767
  ) {
1729
1768
  lastRecoverableArtifactText = recoverableArtifactText;
1730
- recoverableArtifactStatusWriter.enqueue({
1731
- role: "agent",
1732
- metadata: { agentNativeRecoverableArtifacts: true },
1733
- parts: [
1734
- {
1735
- type: "text",
1736
- text: recoverableArtifactText,
1737
- },
1738
- ],
1739
- });
1740
1769
  }
1741
1770
  } else if (event.type === "error") {
1742
1771
  console.error(`[A2A] Error: ${event.error}`);
1743
1772
  } else if (event.type === "done") {
1744
1773
  console.log(`[A2A] Done. Events: ${a2aEvents.length}`);
1745
1774
  }
1775
+ if (activityChanged) {
1776
+ checkpointActivity(
1777
+ event.type === "tool_start" ||
1778
+ event.type === "tool_done" ||
1779
+ event.type === "error" ||
1780
+ event.type === "done",
1781
+ );
1782
+ }
1746
1783
  },
1747
1784
  signal: controller.signal,
1748
1785
  },
@@ -1779,6 +1816,7 @@ export function createAgentChatPlugin(
1779
1816
 
1780
1817
  // The continuation can observe terminal output immediately, so make
1781
1818
  // its latest mutation checkpoint durable first.
1819
+ checkpointActivity(true);
1782
1820
  await recoverableArtifactStatusWriter.flush();
1783
1821
 
1784
1822
  const approval = [...a2aEvents]
@@ -1817,6 +1855,7 @@ export function createAgentChatPlugin(
1817
1855
  },
1818
1856
  },
1819
1857
  parts: [
1858
+ buildA2AAgentActivityPart(activityState),
1820
1859
  {
1821
1860
  type: "text" as const,
1822
1861
  text:
@@ -1851,6 +1890,7 @@ export function createAgentChatPlugin(
1851
1890
  yield {
1852
1891
  role: "agent" as const,
1853
1892
  parts: [
1893
+ buildA2AAgentActivityPart(activityState),
1854
1894
  {
1855
1895
  type: "text" as const,
1856
1896
  text: finalText || "(no response)",
@@ -201,7 +201,10 @@ export function resolveRealtimeVoiceReasoningEffort(
201
201
  ): "minimal" | "low" | "medium" {
202
202
  const normalized = value?.trim().toLowerCase();
203
203
  return normalized &&
204
- Object.hasOwn(REALTIME_VOICE_REASONING_EFFORT, normalized)
204
+ Object.prototype.hasOwnProperty.call(
205
+ REALTIME_VOICE_REASONING_EFFORT,
206
+ normalized,
207
+ )
205
208
  ? REALTIME_VOICE_REASONING_EFFORT[
206
209
  normalized as keyof typeof REALTIME_VOICE_REASONING_EFFORT
207
210
  ]
@@ -195,6 +195,22 @@ for await (const update of client.stream({
195
195
  }
196
196
  ```
197
197
 
198
+ ### Agent activity in delegated chat
199
+
200
+ Agent Native peers attach a bounded `data` part with
201
+ `kind: "agent-native/agent-activity"` to in-progress and terminal task status
202
+ messages. It contains the same user-visible reasoning summaries shown in the
203
+ receiving app, tool names and completion states, elapsed time, and progressive
204
+ response text. It never includes tool inputs, tool results, credentials, or
205
+ hidden provider reasoning.
206
+
207
+ `call-agent` reads this optional part while it polls an asynchronous task and
208
+ renders the remote work as a nested agent run. Unknown A2A peers do not need to
209
+ implement the extension: their ordinary status and final text still render in
210
+ the same nested block. Treat activity data as untrusted presentation content;
211
+ never use it for identity, authorization, approval, routing, or artifact
212
+ validation.
213
+
198
214
  ### Carrying explicit chat authorization
199
215
 
200
216
  When the authenticated caller has an exact consequential action that the user
@@ -57,11 +57,13 @@ action before requesting microphone permission.
57
57
  controls contain only settings and the separate end-session action.
58
58
  - The orb's compact waveform stays visible for the full session and reflects
59
59
  actual microphone or assistant audio activity. At silence it rests at its
60
- baseline instead of turning into a loading spinner. While connecting, show a
61
- distinct compact spinner; when the session becomes live, the assistant gives
62
- one brief spoken greeting so readiness is unambiguous. Do not apply a
63
- text-sized `max_output_tokens` cap to that audio greeting because audio tokens
64
- can truncate it mid-sentence.
60
+ baseline instead of turning into a loading spinner. Once connected, a soft,
61
+ slowly rotating blue glow marks the live session; brighten and speed up the
62
+ glow while the agent is working, and keep it static under reduced motion.
63
+ While connecting, show a distinct compact spinner; when the session becomes
64
+ live, the assistant gives one brief spoken greeting so readiness is
65
+ unambiguous. Do not apply a text-sized `max_output_tokens` cap to that audio
66
+ greeting because audio tokens can truncate it mid-sentence.
65
67
  - The orb settings cog opens in place without ending voice mode or navigating
66
68
  away. Nested pickers must not dismiss the settings popover. Language and
67
69
  intelligence update the active Realtime session; the microphone picker swaps
@@ -42,7 +42,7 @@ export const CLI_REGISTRY: Record<string, CliEntry> = {
42
42
 
43
43
  /** Check if a command name is in the CLI_REGISTRY allowlist */
44
44
  export function isAllowedCommand(cmd: string): boolean {
45
- return Object.hasOwn(CLI_REGISTRY, cmd);
45
+ return Object.prototype.hasOwnProperty.call(CLI_REGISTRY, cmd);
46
46
  }
47
47
 
48
48
  /** Check if a CLI command exists on PATH (safe — no shell interpolation) */
@@ -732,7 +732,6 @@ function findCorePackageRoot(cwd: string): string | null {
732
732
  const candidates = [
733
733
  path.resolve(cwd, "../../packages/core"), // templates/<name>/
734
734
  path.resolve(cwd, "../core"), // packages/<name>/
735
- path.resolve(cwd, "node_modules/@agent-native/core"),
736
735
  ];
737
736
  for (const candidate of candidates) {
738
737
  try {
@@ -2315,6 +2314,165 @@ function portExposer(): Plugin {
2315
2314
  };
2316
2315
  }
2317
2316
 
2317
+ function isNitroEnvironmentUnavailable(error: unknown): boolean {
2318
+ const candidate = error as {
2319
+ name?: unknown;
2320
+ status?: unknown;
2321
+ statusCode?: unknown;
2322
+ message?: unknown;
2323
+ };
2324
+ return (
2325
+ candidate?.name === "NitroViteError" &&
2326
+ (candidate.status === 503 || candidate.statusCode === 503) &&
2327
+ typeof candidate.message === "string" &&
2328
+ /Vite environment .+ is unavailable/.test(candidate.message)
2329
+ );
2330
+ }
2331
+
2332
+ type NitroModuleNode = {
2333
+ id: string | null;
2334
+ ssrError?: Error | null;
2335
+ transformResult: unknown | null;
2336
+ };
2337
+
2338
+ type NitroModuleGraph = {
2339
+ idToModuleMap: Map<string, NitroModuleNode>;
2340
+ };
2341
+
2342
+ const NITRO_STARTUP_SETTLE_MS = 1_000;
2343
+ const NITRO_STARTUP_TIMEOUT_MS = 30_000;
2344
+
2345
+ function nitroModuleGraphSignature(environment: unknown): string | null {
2346
+ const graph = (environment as { moduleGraph?: NitroModuleGraph } | undefined)
2347
+ ?.moduleGraph;
2348
+ if (!graph) return null;
2349
+
2350
+ const modules = [...graph.idToModuleMap.values()];
2351
+ const entry = modules.find((module) =>
2352
+ module.id
2353
+ ?.replaceAll("\\", "/")
2354
+ .endsWith("/nitro/dist/runtime/internal/vite/dev-entry.mjs"),
2355
+ );
2356
+ if (!entry?.transformResult && !entry?.ssrError) return null;
2357
+
2358
+ let transformed = 0;
2359
+ let errors = 0;
2360
+ for (const module of modules) {
2361
+ if (module.transformResult) transformed += 1;
2362
+ if (module.ssrError) errors += 1;
2363
+ }
2364
+ return `${modules.length}:${transformed}:${errors}`;
2365
+ }
2366
+
2367
+ function isHtmlDocumentRequest(req: IncomingMessage): boolean {
2368
+ return (
2369
+ (req.method === "GET" || req.method === "HEAD") &&
2370
+ (req.headers.accept ?? "").includes("text/html")
2371
+ );
2372
+ }
2373
+
2374
+ function sendNitroStartingResponse(
2375
+ req: IncomingMessage,
2376
+ res: ServerResponse,
2377
+ ): void {
2378
+ res.statusCode = 503;
2379
+ res.setHeader("cache-control", "no-store");
2380
+ res.setHeader("content-type", "text/html; charset=utf-8");
2381
+ res.setHeader("retry-after", "1");
2382
+ if (req.method === "HEAD") {
2383
+ res.end();
2384
+ return;
2385
+ }
2386
+ res.end(
2387
+ '<!doctype html><html><head><meta charset="utf-8"><meta http-equiv="refresh" content="0.25"><title>Starting…</title></head><body></body></html>',
2388
+ );
2389
+ }
2390
+
2391
+ function nitroStartupGate(
2392
+ options: {
2393
+ now?: () => number;
2394
+ settleMs?: number;
2395
+ timeoutMs?: number;
2396
+ } = {},
2397
+ ): Plugin {
2398
+ return {
2399
+ name: "agent-native-nitro-startup-gate",
2400
+ apply: "serve",
2401
+ enforce: "pre",
2402
+ configureServer(server) {
2403
+ const now = options.now ?? Date.now;
2404
+ const settleMs = options.settleMs ?? NITRO_STARTUP_SETTLE_MS;
2405
+ const timeoutMs = options.timeoutMs ?? NITRO_STARTUP_TIMEOUT_MS;
2406
+ const startedAt = now();
2407
+ let graphSignature: string | null = null;
2408
+ let graphStableAt: number | undefined;
2409
+ let startupComplete = false;
2410
+
2411
+ server.middlewares.use((req, res, next) => {
2412
+ if (startupComplete || !isHtmlDocumentRequest(req)) {
2413
+ next();
2414
+ return;
2415
+ }
2416
+
2417
+ const timestamp = now();
2418
+ if (timestamp - startedAt >= timeoutMs) {
2419
+ startupComplete = true;
2420
+ next();
2421
+ return;
2422
+ }
2423
+
2424
+ const nextGraphSignature = nitroModuleGraphSignature(
2425
+ server.environments?.nitro,
2426
+ );
2427
+ if (nextGraphSignature) {
2428
+ if (nextGraphSignature !== graphSignature) {
2429
+ graphSignature = nextGraphSignature;
2430
+ graphStableAt = timestamp;
2431
+ } else if (
2432
+ graphStableAt !== undefined &&
2433
+ timestamp - graphStableAt >= settleMs
2434
+ ) {
2435
+ startupComplete = true;
2436
+ next();
2437
+ return;
2438
+ }
2439
+ } else {
2440
+ graphSignature = null;
2441
+ graphStableAt = undefined;
2442
+ }
2443
+
2444
+ sendNitroStartingResponse(req, res);
2445
+ });
2446
+ },
2447
+ };
2448
+ }
2449
+
2450
+ function nitroStartupRecovery(): Plugin {
2451
+ return {
2452
+ name: "agent-native-nitro-startup-recovery",
2453
+ apply: "serve",
2454
+ configureServer(server) {
2455
+ server.middlewares.use(function nitroStartupErrorRecovery(
2456
+ error: unknown,
2457
+ req: IncomingMessage,
2458
+ res: ServerResponse,
2459
+ next: (error?: unknown) => void,
2460
+ ) {
2461
+ if (
2462
+ !isNitroEnvironmentUnavailable(error) ||
2463
+ !isHtmlDocumentRequest(req) ||
2464
+ res.headersSent
2465
+ ) {
2466
+ next(error);
2467
+ return;
2468
+ }
2469
+
2470
+ sendNitroStartingResponse(req, res);
2471
+ });
2472
+ },
2473
+ };
2474
+ }
2475
+
2318
2476
  /**
2319
2477
  * Silence benign connection-reset noise from Vite's dev middleware.
2320
2478
  * Fires when a browser closes/reloads/navigates mid-request — the peer has
@@ -2693,6 +2851,7 @@ function createAgentNativePlugins(
2693
2851
  embedDevFrameHeaders(),
2694
2852
  baseRedirectGuard(),
2695
2853
  portExposer(),
2854
+ nitroStartupGate(),
2696
2855
  silenceConnectionResets(),
2697
2856
  rolldownInputFix(),
2698
2857
  // Nitro Vite plugin for dev-mode API route serving and HMR.
@@ -2702,6 +2861,9 @@ function createAgentNativePlugins(
2702
2861
  : includeNitro
2703
2862
  ? [nitroPlugin]
2704
2863
  : []),
2864
+ // Nitro can reject the first document request while its Vite environment
2865
+ // is still importing. This error handler must follow Nitro's middleware.
2866
+ nitroStartupRecovery(),
2705
2867
  includeReactTransform ? createReactTransformPlugin() : null,
2706
2868
  createDesignSystemThemePlugin(options.designSystemTheme),
2707
2869
  createTailwindPlugin(options),
@@ -3096,5 +3258,8 @@ export {
3096
3258
  getDefaultOptimizeDeps as _getDefaultOptimizeDeps,
3097
3259
  findCorePackageRoot as _findCorePackageRoot,
3098
3260
  getReactRouterAliases as _getReactRouterAliases,
3261
+ nitroStartupGate as _nitroStartupGate,
3262
+ nitroStartupRecovery as _nitroStartupRecovery,
3263
+ nitroModuleGraphSignature as _nitroModuleGraphSignature,
3099
3264
  debounceNitroFullReloadHotUpdate as _debounceNitroFullReloadHotUpdate,
3100
3265
  };
@@ -23,6 +23,18 @@ async function fetchWithAuth(url: string, options?: RequestInit) {
23
23
  });
24
24
  }
25
25
 
26
+ async function responseError(res: Response, fallback: string): Promise<Error> {
27
+ try {
28
+ const body = (await res.json()) as { error?: unknown };
29
+ if (typeof body.error === "string" && body.error.trim()) {
30
+ return new Error(body.error.trim());
31
+ }
32
+ } catch {
33
+ // Keep the status fallback when the server did not return JSON.
34
+ }
35
+ return new Error(`${fallback}: ${res.status}`);
36
+ }
37
+
26
38
  export function useDashboardViews(dashboardId: string | undefined) {
27
39
  const queryClient = useQueryClient();
28
40
  const queryKey = ["dashboard-views", dashboardId];
@@ -53,7 +65,7 @@ export function useDashboardViews(dashboardId: string | undefined) {
53
65
  body: JSON.stringify(view),
54
66
  },
55
67
  );
56
- if (!res.ok) throw new Error(`Save failed: ${res.status}`);
68
+ if (!res.ok) throw await responseError(res, "Save failed");
57
69
  },
58
70
  onSettled: () => {
59
71
  queryClient.invalidateQueries({ queryKey });
@@ -7,6 +7,7 @@ import {
7
7
  } from "@tabler/icons-react";
8
8
  import { useMemo, useState } from "react";
9
9
  import { useSearchParams } from "react-router";
10
+ import { toast } from "sonner";
10
11
 
11
12
  import { ResourceLoadError } from "@/components/ResourceLoadError";
12
13
  import {
@@ -147,6 +148,15 @@ export function ViewsMenu({ dashboardId, canEdit = true }: ViewsMenuProps) {
147
148
  });
148
149
  setViewName("");
149
150
  setSaveDialogOpen(false);
151
+ } catch (error) {
152
+ toast.error(
153
+ t("sqlDashboard.saveFailedWithMessage", {
154
+ message:
155
+ error instanceof Error
156
+ ? error.message
157
+ : t("sqlDashboard.saveFailed"),
158
+ }),
159
+ );
150
160
  } finally {
151
161
  setSavingView(false);
152
162
  }
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-22
4
+ ---
5
+
6
+ Show a useful error when saving a dashboard view fails