@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
package/corpus/README.md CHANGED
@@ -28,6 +28,6 @@ rg -n "defineAction|useActionQuery" node_modules/@agent-native/core/corpus
28
28
 
29
29
  ## Generated Counts
30
30
 
31
- - core files: 1544
31
+ - core files: 1545
32
32
  - toolkit files: 159
33
- - template files: 6455
33
+ - template files: 6296
@@ -1,5 +1,37 @@
1
1
  # @agent-native/core
2
2
 
3
+ ## 0.119.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 6f485ac: Remove the redundant Done action from shared share popovers and dialogs.
8
+ - 6f485ac: Stream delegated A2A agent activity into an indented chat run with live reasoning, tool status, elapsed time, and a scroll-free final response.
9
+
10
+ ### Patch Changes
11
+
12
+ - 6f485ac: Use GPT-5.6 Luna as the default for Builder Gateway and OpenAI connections, keep Claude Sonnet 5 for Anthropic connections, and order the model picker from lowest to highest cost.
13
+
14
+ ## 0.118.1
15
+
16
+ ### Patch Changes
17
+
18
+ - c15d20f: Only show in-chat connection suggestions for exact provider brands or provider-owned URLs found in user-authored text.
19
+ - c15d20f: Harden browser and CLI error handling and hide editor commands for disabled features.
20
+ - c15d20f: Keep remote MCP OAuth flow state in browser-safe cookie chunks and show Granola's official provider icon.
21
+ - c15d20f: Keep completed chat turns with interactive custom UI expanded and frame custom action UI in a padded card.
22
+ - c15d20f: Pin Slack delivery to the app that received the event and reject legacy bot tokens from a different Slack app.
23
+ - c15d20f: Keep healthy long-running tool and agent calls out of the stuck-run warning, add space below long-running tool hints, and prevent a hung remote status request from bypassing the A2A call timeout.
24
+ - c15d20f: Wait for Nitro's Vite environment before serving initial development requests, and keep published Core installs from enabling framework-monorepo dependency optimization.
25
+ - c15d20f: Consume agent-authored URL navigation commands from full-page chat surfaces.
26
+ - c15d20f: Remove the obsolete active-tool row selector so stale styles cannot paint the shine outside the label text.
27
+ - c15d20f: Shorten the MCP OAuth connection action label to Connect.
28
+ - c15d20f: Show a soft rotating blue glow for live realtime voice sessions and brighten it while the agent is working.
29
+ - c15d20f: Synchronize the chat response regenerate control and timestamp fade transitions.
30
+ - Updated dependencies [c15d20f]
31
+ - Updated dependencies [c15d20f]
32
+ - Updated dependencies [c15d20f]
33
+ - @agent-native/toolkit@0.10.1
34
+
3
35
  ## 0.118.0
4
36
 
5
37
  ### Minor Changes
@@ -434,6 +434,21 @@ Like `callAgent()`, the CLI defaults to async + poll (`invokeAgent` → `callAge
434
434
 
435
435
  The target resolves the same way as `agentNative.invoke()`: by workspace app id, by app name, or by a full URL — so the same command works against a sibling app in a multi-app workspace or an arbitrary A2A peer elsewhere.
436
436
 
437
+ ## Delegated agent activity {#delegated-agent-activity}
438
+
439
+ Agent Native peers may attach an optional `data` part with
440
+ `kind: "agent-native/agent-activity"` to task status messages. It carries a
441
+ bounded snapshot of the user-visible reasoning summaries, tool names and
442
+ completion states, elapsed time, and progressive response text. Calling apps
443
+ render these updates as a nested agent run and collapse the work history when
444
+ the delegated task finishes.
445
+
446
+ The activity part never includes tool inputs, tool results, credentials, or
447
+ hidden provider reasoning. Treat it as untrusted presentation data, never as
448
+ identity, authorization, approval, routing, or artifact validation. External
449
+ A2A peers can omit the extension; their ordinary status text and final response
450
+ still render in the same delegated-agent surface.
451
+
437
452
  ## Task lifecycle {#task-lifecycle}
438
453
 
439
454
  Each message creates a task that moves through these states:
@@ -13,7 +13,7 @@ If you want a finished domain product shape, start from [Calendar](/docs/templat
13
13
  <Screen
14
14
  surface="desktop"
15
15
  html={
16
- "<div style='min-height:560px;box-sizing:border-box;display:flex;align-items:center;justify-content:center;padding:56px 40px'><div style='display:flex;flex-direction:column;align-items:center;justify-content:center;gap:28px;width:min(700px,92%);min-height:430px'><div style='height:34px'></div><div style='text-align:center'><h1 style='margin:0'>How can I help?</h1><p class='wf-muted' style='margin:10px 0 0'>Chat about anything. Add actions, components, pages, jobs, or your own backend.</p></div><div class='wf-card' style='width:100%;min-height:150px;display:flex;flex-direction:column;gap:18px'><span class='wf-muted'>Message the agent...</span><div style='flex:1'></div><div style='display:flex;align-items:center;gap:10px'><span data-icon='plus' aria-label='Attach'></span><div style='flex:1'></div><span class='wf-pill'>Sonnet 5 · Auto</span><span class='wf-pill'>Act</span><button class='primary'>↑</button></div></div><div style='height:34px'></div></div></div>"
16
+ "<div style='min-height:560px;box-sizing:border-box;display:flex;align-items:center;justify-content:center;padding:56px 40px'><div style='display:flex;flex-direction:column;align-items:center;justify-content:center;gap:28px;width:min(700px,92%);min-height:430px'><div style='height:34px'></div><div style='text-align:center'><h1 style='margin:0'>How can I help?</h1><p class='wf-muted' style='margin:10px 0 0'>Chat about anything. Add actions, components, pages, jobs, or your own backend.</p></div><div class='wf-card' style='width:100%;min-height:150px;display:flex;flex-direction:column;gap:18px'><span class='wf-muted'>Message the agent...</span><div style='flex:1'></div><div style='display:flex;align-items:center;gap:10px'><span data-icon='plus' aria-label='Attach'></span><div style='flex:1'></div><span class='wf-pill'>GPT-5.6 Luna · Auto</span><span class='wf-pill'>Act</span><button class='primary'>↑</button></div></div><div style='height:34px'></div></div></div>"
17
17
  }
18
18
  />
19
19
  </WireframeBlock>
@@ -232,9 +232,9 @@ Generating a plan or recap runs a full agentic session against your coding
232
232
  agent's LLM, not a lightweight template fill, so cost scales with the size of
233
233
  the diff or plan and the model you choose.
234
234
 
235
- - The app's own default chat model is Sonnet 5; change it any time in
236
- **Settings**. Haiku is the cheaper Claude option, and Luna is the cheaper
237
- option in the GPT-5.6 family.
235
+ - The app's default chat model is GPT-5.6 Luna. Direct Anthropic connections
236
+ keep Claude Sonnet 5 as their default. Change models any time in **Settings**;
237
+ Haiku is the cheaper Claude option.
238
238
  - Automated PR recaps from the GitHub Action run separately from the
239
239
  interactive app and have their own model and cost knobs — see
240
240
  [PR Visual Recap](/docs/pr-visual-recap) for `VISUAL_RECAP_MODEL`,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.118.0",
3
+ "version": "0.119.0",
4
4
  "description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {
@@ -0,0 +1,371 @@
1
+ import { sanitizeToolErrorText } from "../agent/tool-error-redaction.js";
2
+ import type { AgentChatEvent } from "../agent/types.js";
3
+ import type { DataPart, Part } from "./types.js";
4
+
5
+ export const A2A_AGENT_ACTIVITY_KIND = "agent-native/agent-activity";
6
+ export const A2A_AGENT_ACTIVITY_VERSION = 1;
7
+ export const MAX_A2A_ACTIVITY_REASONING_CHARS = 32_768;
8
+ export const MAX_A2A_ACTIVITY_RESPONSE_CHARS = 32_768;
9
+ export const MAX_A2A_ACTIVITY_TOTAL_CHARS = 98_304;
10
+ export const MAX_A2A_ACTIVITY_REASONING_SEGMENTS = 128;
11
+ export const MAX_A2A_ACTIVITY_TOOL_CALLS = 64;
12
+ export const MAX_A2A_ACTIVITY_TOOL_NAME_CHARS = 96;
13
+ export const MAX_A2A_ACTIVITY_TOOL_ID_CHARS = 128;
14
+
15
+ export type A2AAgentActivityPhase =
16
+ | "reasoning"
17
+ | "tool"
18
+ | "responding"
19
+ | "complete"
20
+ | "error";
21
+
22
+ export type A2AAgentActivityToolStatus = "running" | "completed" | "failed";
23
+
24
+ export interface A2AAgentActivityToolCall {
25
+ name: string;
26
+ id?: string;
27
+ status: A2AAgentActivityToolStatus;
28
+ }
29
+
30
+ export interface A2AAgentActivitySnapshot extends Record<string, unknown> {
31
+ kind: typeof A2A_AGENT_ACTIVITY_KIND;
32
+ version: typeof A2A_AGENT_ACTIVITY_VERSION;
33
+ sequence: number;
34
+ startedAt: number;
35
+ updatedAt: number;
36
+ durationMs: number;
37
+ activePhase: A2AAgentActivityPhase;
38
+ reasoning: string[];
39
+ toolCalls: A2AAgentActivityToolCall[];
40
+ responseText?: string;
41
+ }
42
+
43
+ export interface A2AAgentActivityState {
44
+ sequence: number;
45
+ startedAt: number;
46
+ updatedAt: number;
47
+ activePhase: A2AAgentActivityPhase;
48
+ reasoning: string[];
49
+ toolCalls: A2AAgentActivityToolCall[];
50
+ responseText: string;
51
+ }
52
+
53
+ export function createA2AAgentActivityState(
54
+ startedAt = Date.now(),
55
+ ): A2AAgentActivityState {
56
+ return {
57
+ sequence: 0,
58
+ startedAt,
59
+ updatedAt: startedAt,
60
+ activePhase: "reasoning",
61
+ reasoning: [],
62
+ toolCalls: [],
63
+ responseText: "",
64
+ };
65
+ }
66
+
67
+ /**
68
+ * Converts internal loop events into a bounded activity snapshot. It carries
69
+ * only reasoning text already emitted to the local chat, never tool inputs or
70
+ * results.
71
+ */
72
+ export function applyA2AAgentActivityEvent(
73
+ state: A2AAgentActivityState,
74
+ event: AgentChatEvent,
75
+ updatedAt = Date.now(),
76
+ ): A2AAgentActivityState {
77
+ const next = { ...state, updatedAt: normalizeTimestamp(updatedAt) };
78
+ let changed = false;
79
+
80
+ switch (event.type) {
81
+ case "thinking":
82
+ next.activePhase = "reasoning";
83
+ next.reasoning = appendBoundedSegment(
84
+ next.reasoning,
85
+ event.text,
86
+ MAX_A2A_ACTIVITY_REASONING_CHARS,
87
+ next.toolCalls.length,
88
+ );
89
+ changed = true;
90
+ break;
91
+ case "tool_start":
92
+ next.activePhase = "tool";
93
+ next.responseText = "";
94
+ next.toolCalls = appendToolCall(next.toolCalls, toolFromEvent(event));
95
+ changed = true;
96
+ break;
97
+ case "tool_done":
98
+ next.activePhase = "tool";
99
+ next.toolCalls = settleToolCall(next.toolCalls, toolFromEvent(event));
100
+ changed = true;
101
+ break;
102
+ case "text":
103
+ next.activePhase = "responding";
104
+ next.responseText = appendBoundedText(
105
+ next.responseText,
106
+ event.text,
107
+ MAX_A2A_ACTIVITY_RESPONSE_CHARS,
108
+ );
109
+ changed = true;
110
+ break;
111
+ case "done":
112
+ next.activePhase = "complete";
113
+ changed = true;
114
+ break;
115
+ case "error":
116
+ next.activePhase = "error";
117
+ changed = true;
118
+ break;
119
+ case "clear":
120
+ next.responseText = "";
121
+ changed = true;
122
+ break;
123
+ }
124
+
125
+ return changed ? { ...next, sequence: state.sequence + 1 } : state;
126
+ }
127
+
128
+ export function buildA2AAgentActivitySnapshot(
129
+ state: A2AAgentActivityState,
130
+ ): A2AAgentActivitySnapshot {
131
+ return {
132
+ kind: A2A_AGENT_ACTIVITY_KIND,
133
+ version: A2A_AGENT_ACTIVITY_VERSION,
134
+ sequence: state.sequence,
135
+ startedAt: state.startedAt,
136
+ updatedAt: state.updatedAt,
137
+ durationMs: Math.max(0, state.updatedAt - state.startedAt),
138
+ activePhase: state.activePhase,
139
+ reasoning: state.reasoning,
140
+ toolCalls: state.toolCalls,
141
+ ...(state.responseText ? { responseText: state.responseText } : {}),
142
+ };
143
+ }
144
+
145
+ export function buildA2AAgentActivityPart(
146
+ state: A2AAgentActivityState,
147
+ ): DataPart {
148
+ return { type: "data", data: buildA2AAgentActivitySnapshot(state) };
149
+ }
150
+
151
+ export function parseA2AAgentActivityPart(
152
+ part: Part | unknown,
153
+ ): A2AAgentActivitySnapshot | null {
154
+ if (!part || typeof part !== "object") return null;
155
+ const candidate = part as { type?: unknown; data?: unknown };
156
+ if (candidate.type !== "data" || !isRecord(candidate.data)) return null;
157
+ const data = candidate.data;
158
+ if (
159
+ data.kind !== A2A_AGENT_ACTIVITY_KIND ||
160
+ data.version !== A2A_AGENT_ACTIVITY_VERSION ||
161
+ !isSafeInteger(data.sequence) ||
162
+ !isSafeInteger(data.startedAt) ||
163
+ !isSafeInteger(data.updatedAt) ||
164
+ !isSafeInteger(data.durationMs) ||
165
+ !isPhase(data.activePhase) ||
166
+ data.updatedAt < data.startedAt ||
167
+ data.durationMs !== data.updatedAt - data.startedAt ||
168
+ !isSafeReasoning(data.reasoning) ||
169
+ !isSafeToolCalls(data.toolCalls) ||
170
+ (data.responseText !== undefined &&
171
+ !isSafeText(data.responseText, MAX_A2A_ACTIVITY_RESPONSE_CHARS)) ||
172
+ activityCharacterCount(data) > MAX_A2A_ACTIVITY_TOTAL_CHARS
173
+ ) {
174
+ return null;
175
+ }
176
+
177
+ return data as unknown as A2AAgentActivitySnapshot;
178
+ }
179
+
180
+ function toolFromEvent(
181
+ event: Extract<AgentChatEvent, { type: "tool_start" | "tool_done" }>,
182
+ ): A2AAgentActivityToolCall {
183
+ const id = sanitizeToolId(event.id);
184
+ return {
185
+ name: sanitizeToolName(event.tool),
186
+ ...(id ? { id } : {}),
187
+ status:
188
+ event.type === "tool_start"
189
+ ? "running"
190
+ : event.isError
191
+ ? "failed"
192
+ : "completed",
193
+ };
194
+ }
195
+
196
+ function appendBoundedText(
197
+ current: string,
198
+ addition: string,
199
+ maxChars: number,
200
+ ) {
201
+ return sanitizeText(`${current}${addition}`, maxChars);
202
+ }
203
+
204
+ function appendBoundedSegment(
205
+ current: string[],
206
+ addition: string,
207
+ maxChars: number,
208
+ precedingToolCount: number,
209
+ ): string[] {
210
+ const used = current.reduce((total, text) => total + text.length, 0);
211
+ if (
212
+ used >= maxChars ||
213
+ current.length >= MAX_A2A_ACTIVITY_REASONING_SEGMENTS
214
+ ) {
215
+ return current;
216
+ }
217
+ const text = sanitizeText(addition, maxChars - used);
218
+ if (!text) return current;
219
+ const next = [...current];
220
+ while (
221
+ next.length < precedingToolCount &&
222
+ next.length < MAX_A2A_ACTIVITY_REASONING_SEGMENTS
223
+ ) {
224
+ next.push("");
225
+ }
226
+ if (next.length === precedingToolCount) {
227
+ return [...next, text];
228
+ }
229
+ next[precedingToolCount] = `${next[precedingToolCount] ?? ""}${text}`;
230
+ return next;
231
+ }
232
+
233
+ function appendToolCall(
234
+ current: A2AAgentActivityToolCall[],
235
+ tool: A2AAgentActivityToolCall,
236
+ ): A2AAgentActivityToolCall[] {
237
+ return current.length < MAX_A2A_ACTIVITY_TOOL_CALLS
238
+ ? [...current, tool]
239
+ : current;
240
+ }
241
+
242
+ function settleToolCall(
243
+ current: A2AAgentActivityToolCall[],
244
+ tool: A2AAgentActivityToolCall,
245
+ ): A2AAgentActivityToolCall[] {
246
+ for (let index = current.length - 1; index >= 0; index -= 1) {
247
+ const existing = current[index];
248
+ if (
249
+ (tool.id && tool.id === existing.id) ||
250
+ (!tool.id && tool.name === existing.name)
251
+ ) {
252
+ return current.map((value, itemIndex) =>
253
+ itemIndex === index ? tool : value,
254
+ );
255
+ }
256
+ }
257
+ return appendToolCall(current, tool);
258
+ }
259
+
260
+ function sanitizeText(value: string, maxChars: number): string {
261
+ return sanitizeToolErrorText(value)
262
+ .replace(/\r\n?/g, "\n")
263
+ .replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/g, "")
264
+ .slice(0, maxChars);
265
+ }
266
+
267
+ function sanitizeToolName(value: string): string {
268
+ return sanitizeText(value, MAX_A2A_ACTIVITY_TOOL_NAME_CHARS) || "tool";
269
+ }
270
+
271
+ function sanitizeToolId(value: string | undefined): string | undefined {
272
+ const sanitized = value
273
+ ? sanitizeText(value, MAX_A2A_ACTIVITY_TOOL_ID_CHARS)
274
+ : "";
275
+ return sanitized || undefined;
276
+ }
277
+
278
+ function normalizeTimestamp(value: number): number {
279
+ return isSafeInteger(value) ? value : Date.now();
280
+ }
281
+
282
+ function isRecord(value: unknown): value is Record<string, unknown> {
283
+ return !!value && typeof value === "object" && !Array.isArray(value);
284
+ }
285
+
286
+ function isSafeInteger(value: unknown): value is number {
287
+ return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
288
+ }
289
+
290
+ function isPhase(value: unknown): value is A2AAgentActivityPhase {
291
+ return ["reasoning", "tool", "responding", "complete", "error"].includes(
292
+ value as string,
293
+ );
294
+ }
295
+
296
+ function isSafeReasoning(value: unknown): value is string[] {
297
+ return (
298
+ Array.isArray(value) &&
299
+ value.length <= MAX_A2A_ACTIVITY_REASONING_SEGMENTS &&
300
+ value.reduce(
301
+ (total, text) =>
302
+ total + (typeof text === "string" ? text.length : Infinity),
303
+ 0,
304
+ ) <= MAX_A2A_ACTIVITY_REASONING_CHARS &&
305
+ value.every((text) => isSafeText(text, MAX_A2A_ACTIVITY_REASONING_CHARS))
306
+ );
307
+ }
308
+
309
+ function isSafeToolCalls(value: unknown): value is A2AAgentActivityToolCall[] {
310
+ return (
311
+ Array.isArray(value) &&
312
+ value.length <= MAX_A2A_ACTIVITY_TOOL_CALLS &&
313
+ value.every(isSafeToolCall)
314
+ );
315
+ }
316
+
317
+ function isSafeToolCall(value: unknown): value is A2AAgentActivityToolCall {
318
+ if (!isRecord(value) || !isSafeToolName(value.name)) return false;
319
+ return (
320
+ (value.id === undefined || isSafeToolId(value.id)) &&
321
+ (value.status === "running" ||
322
+ value.status === "completed" ||
323
+ value.status === "failed")
324
+ );
325
+ }
326
+
327
+ function isSafeText(value: unknown, maxChars: number): value is string {
328
+ return (
329
+ typeof value === "string" &&
330
+ value.length <= maxChars &&
331
+ value === sanitizeText(value, maxChars)
332
+ );
333
+ }
334
+
335
+ function isSafeToolName(value: unknown): value is string {
336
+ return (
337
+ typeof value === "string" &&
338
+ value.length <= MAX_A2A_ACTIVITY_TOOL_NAME_CHARS &&
339
+ value === sanitizeToolName(value)
340
+ );
341
+ }
342
+
343
+ function isSafeToolId(value: unknown): value is string {
344
+ return (
345
+ typeof value === "string" &&
346
+ value.length <= MAX_A2A_ACTIVITY_TOOL_ID_CHARS &&
347
+ value === sanitizeToolId(value)
348
+ );
349
+ }
350
+
351
+ function activityCharacterCount(data: Record<string, unknown>): number {
352
+ const reasoning = Array.isArray(data.reasoning)
353
+ ? data.reasoning.reduce(
354
+ (total, text) => total + (typeof text === "string" ? text.length : 0),
355
+ 0,
356
+ )
357
+ : 0;
358
+ const response =
359
+ typeof data.responseText === "string" ? data.responseText.length : 0;
360
+ const tools = Array.isArray(data.toolCalls)
361
+ ? data.toolCalls.reduce((total, tool) => {
362
+ if (!isRecord(tool)) return total;
363
+ return (
364
+ total +
365
+ (typeof tool.name === "string" ? tool.name.length : 0) +
366
+ (typeof tool.id === "string" ? tool.id.length : 0)
367
+ );
368
+ }, 0)
369
+ : 0;
370
+ return reasoning + response + tools;
371
+ }
@@ -14,6 +14,8 @@ import type {
14
14
  Task,
15
15
  } from "./types.js";
16
16
 
17
+ const DEFAULT_A2A_POLL_REQUEST_TIMEOUT_MS = 15_000;
18
+
17
19
  export class A2ATaskTimeoutError extends Error {
18
20
  readonly taskId: string;
19
21
  readonly lastTask: Task;
@@ -171,6 +173,7 @@ export class A2AClient {
171
173
  private async rpc(
172
174
  method: string,
173
175
  params: Record<string, unknown>,
176
+ options?: { requestTimeoutMs?: number },
174
177
  ): Promise<JsonRpcResponse> {
175
178
  const body: JsonRpcRequest = {
176
179
  jsonrpc: "2.0",
@@ -186,7 +189,12 @@ export class A2AClient {
186
189
  for (let i = 0; i < this.apiKeyAttempts.length; i++) {
187
190
  console.log(`[A2A Client] POST ${url} method=${method}`);
188
191
  const startTime = Date.now();
189
- const res = await this.postJson(url, body, this.apiKeyAttempts[i]);
192
+ const res = await this.postJson(
193
+ url,
194
+ body,
195
+ this.apiKeyAttempts[i],
196
+ options?.requestTimeoutMs,
197
+ );
190
198
  console.log(
191
199
  `[A2A Client] Response: ${res.status} in ${Date.now() - startTime}ms`,
192
200
  );
@@ -278,8 +286,15 @@ export class A2AClient {
278
286
  /**
279
287
  * Poll for a task by id. Used in async mode after `send({ async: true })`.
280
288
  */
281
- async getTask(taskId: string): Promise<Task> {
282
- const response = await this.rpc("tasks/get", { id: taskId });
289
+ async getTask(
290
+ taskId: string,
291
+ opts?: { requestTimeoutMs?: number },
292
+ ): Promise<Task> {
293
+ const response = await this.rpc(
294
+ "tasks/get",
295
+ { id: taskId },
296
+ { requestTimeoutMs: opts?.requestTimeoutMs },
297
+ );
283
298
  if (response.error) {
284
299
  throw new Error(
285
300
  `A2A error (${response.error.code}): ${response.error.message}`,
@@ -392,9 +407,17 @@ export class A2AClient {
392
407
 
393
408
  let current = submitted;
394
409
  while (Date.now() < deadline) {
395
- await new Promise((r) => setTimeout(r, pollMs));
410
+ const sleepMs = Math.min(pollMs, Math.max(0, deadline - Date.now()));
411
+ await new Promise((r) => setTimeout(r, sleepMs));
412
+ const remainingMs = deadline - Date.now();
413
+ if (remainingMs <= 0) break;
396
414
  try {
397
- current = await this.getTask(submitted.id);
415
+ current = await this.getTask(submitted.id, {
416
+ requestTimeoutMs: Math.min(
417
+ this.requestTimeoutMs ?? DEFAULT_A2A_POLL_REQUEST_TIMEOUT_MS,
418
+ remainingMs,
419
+ ),
420
+ });
398
421
  opts?.onUpdate?.(current);
399
422
  } catch {
400
423
  // Transient fetch failure — keep polling until the deadline.
@@ -509,13 +532,12 @@ export class A2AClient {
509
532
  url: string,
510
533
  body: JsonRpcRequest,
511
534
  apiKey = this.apiKey,
535
+ requestTimeoutMs = this.requestTimeoutMs,
512
536
  ): Promise<Response> {
513
- const controller = this.requestTimeoutMs
514
- ? new AbortController()
515
- : undefined;
537
+ const controller = requestTimeoutMs ? new AbortController() : undefined;
516
538
  const timer =
517
- controller && this.requestTimeoutMs
518
- ? setTimeout(() => controller.abort(), this.requestTimeoutMs)
539
+ controller && requestTimeoutMs
540
+ ? setTimeout(() => controller.abort(), requestTimeoutMs)
519
541
  : undefined;
520
542
  try {
521
543
  return await ssrfSafeFetch(
@@ -625,6 +647,8 @@ export async function callAgent(
625
647
  text: string,
626
648
  opts?: {
627
649
  apiKey?: string;
650
+ /** Additional transport metadata. Receivers must not use it as identity. */
651
+ metadata?: Record<string, unknown>;
628
652
  contextId?: string;
629
653
  userEmail?: string;
630
654
  orgDomain?: string;
@@ -672,7 +696,7 @@ export async function callAgent(
672
696
  onUpdate?: (task: Task) => void;
673
697
  },
674
698
  ): Promise<string> {
675
- const metadata: Record<string, unknown> = {};
699
+ const metadata: Record<string, unknown> = { ...opts?.metadata };
676
700
  if (opts?.userEmail) metadata.userEmail = opts.userEmail;
677
701
  if (opts?.orgDomain) metadata.orgDomain = opts.orgDomain;
678
702
  if (opts?.requestOrigin) metadata.requestOrigin = opts.requestOrigin;
@@ -2,6 +2,22 @@
2
2
  export { mountA2A, verifyA2AToken } from "./server.js";
3
3
  export type { A2ATokenPayload } from "./server.js";
4
4
  export { generateAgentCard } from "./agent-card.js";
5
+ export {
6
+ A2A_AGENT_ACTIVITY_KIND,
7
+ A2A_AGENT_ACTIVITY_VERSION,
8
+ MAX_A2A_ACTIVITY_REASONING_CHARS,
9
+ MAX_A2A_ACTIVITY_REASONING_SEGMENTS,
10
+ MAX_A2A_ACTIVITY_RESPONSE_CHARS,
11
+ MAX_A2A_ACTIVITY_TOOL_CALLS,
12
+ MAX_A2A_ACTIVITY_TOTAL_CHARS,
13
+ MAX_A2A_ACTIVITY_TOOL_ID_CHARS,
14
+ MAX_A2A_ACTIVITY_TOOL_NAME_CHARS,
15
+ applyA2AAgentActivityEvent,
16
+ buildA2AAgentActivityPart,
17
+ buildA2AAgentActivitySnapshot,
18
+ createA2AAgentActivityState,
19
+ parseA2AAgentActivityPart,
20
+ } from "./activity.js";
5
21
 
6
22
  // Client
7
23
  export { A2AClient, callAction, callAgent, signA2AToken } from "./client.js";
@@ -38,6 +54,11 @@ export type {
38
54
  A2ACorrelationMetadata,
39
55
  A2AReadOnlyActionInvocation,
40
56
  A2AReadOnlyActionResult,
57
+ A2AAgentActivityPhase,
58
+ A2AAgentActivitySnapshot,
59
+ A2AAgentActivityState,
60
+ A2AAgentActivityToolCall,
61
+ A2AAgentActivityToolStatus,
41
62
  } from "./types.js";
42
63
  export type {
43
64
  AgentInvocationErrorCode,
@@ -1,6 +1,14 @@
1
1
  // A2A Protocol types (spec v0.3) + framework config types
2
2
  import type { PublicAgentActionConfig } from "../action.js";
3
3
 
4
+ export type {
5
+ A2AAgentActivityPhase,
6
+ A2AAgentActivitySnapshot,
7
+ A2AAgentActivityState,
8
+ A2AAgentActivityToolCall,
9
+ A2AAgentActivityToolStatus,
10
+ } from "./activity.js";
11
+
4
12
  // --- Parts (content atoms) ---
5
13
 
6
14
  export interface TextPart {