@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
@@ -122,6 +122,87 @@ function elementWithText(document: Document, selector: string, text: string) {
122
122
  );
123
123
  }
124
124
 
125
+ function assertInlineLayout(
126
+ container: Element,
127
+ iconSelector: string,
128
+ labelSelector: string,
129
+ message: string,
130
+ ) {
131
+ const icon = container.querySelector<HTMLElement>(iconSelector);
132
+ const label = container.querySelector<HTMLElement>(labelSelector);
133
+ invariant(icon && label, message);
134
+
135
+ const iconRect = icon.getBoundingClientRect();
136
+ const labelRect = label.getBoundingClientRect();
137
+ const hasGeometry =
138
+ iconRect.width > 0 ||
139
+ iconRect.height > 0 ||
140
+ labelRect.width > 0 ||
141
+ labelRect.height > 0;
142
+ if (hasGeometry) {
143
+ const verticalOverlap =
144
+ Math.min(iconRect.bottom, labelRect.bottom) -
145
+ Math.max(iconRect.top, labelRect.top);
146
+ invariant(
147
+ verticalOverlap > 0 || Math.abs(iconRect.top - labelRect.top) <= 2,
148
+ message,
149
+ );
150
+ return;
151
+ }
152
+
153
+ // happy-dom does not calculate layout. Still reject adapters that explicitly
154
+ // stack the tab contents, while browser-backed runs use the geometry check.
155
+ const commonAncestor = (() => {
156
+ let candidate: Element | null = icon;
157
+ while (candidate && !candidate.contains(label)) {
158
+ candidate = candidate.parentElement;
159
+ }
160
+ return candidate;
161
+ })();
162
+ const styles = [
163
+ container,
164
+ commonAncestor,
165
+ icon.parentElement,
166
+ label.parentElement,
167
+ ]
168
+ .filter((element): element is Element => Boolean(element))
169
+ .map((element) =>
170
+ element.ownerDocument.defaultView?.getComputedStyle(element),
171
+ );
172
+ invariant(
173
+ !styles.some(
174
+ (style) => style?.display === "flex" && style.flexDirection === "column",
175
+ ),
176
+ message,
177
+ );
178
+ }
179
+
180
+ function assertContainedFooter(dialog: Element, footerSelector: string) {
181
+ const footer = dialog.querySelector<HTMLElement>(footerSelector);
182
+ invariant(
183
+ footer,
184
+ "Dialog footer controls must be rendered inside the dialog surface.",
185
+ );
186
+
187
+ const dialogRect = (dialog as HTMLElement).getBoundingClientRect();
188
+ const footerRect = footer.getBoundingClientRect();
189
+ const hasGeometry =
190
+ dialogRect.width > 0 ||
191
+ dialogRect.height > 0 ||
192
+ footerRect.width > 0 ||
193
+ footerRect.height > 0;
194
+ if (!hasGeometry) return;
195
+
196
+ const epsilon = 2;
197
+ invariant(
198
+ footerRect.top >= dialogRect.top - epsilon &&
199
+ footerRect.bottom <= dialogRect.bottom + epsilon &&
200
+ footerRect.left >= dialogRect.left - epsilon &&
201
+ footerRect.right <= dialogRect.right + epsilon,
202
+ "Dialog footer controls must remain within the dialog surface bounds.",
203
+ );
204
+ }
205
+
125
206
  const checks: readonly ConformanceCheck[] = [
126
207
  {
127
208
  id: "contract.components",
@@ -308,6 +389,21 @@ const checks: readonly ConformanceCheck[] = [
308
389
  "Tooltip must honor controlled open and portalContainer.",
309
390
  );
310
391
  unmount(probe);
392
+
393
+ const defaultOpenProbe = mount(
394
+ <components.Tooltip
395
+ trigger={<button>Help by default</button>}
396
+ content="Default tooltip"
397
+ defaultOpen
398
+ portalContainer={portal}
399
+ />,
400
+ );
401
+ await settle();
402
+ invariant(
403
+ portal.textContent?.includes("Default tooltip"),
404
+ "Tooltip must honor defaultOpen and portalContainer.",
405
+ );
406
+ unmount(defaultOpenProbe);
311
407
  portal.remove();
312
408
  },
313
409
  },
@@ -331,6 +427,21 @@ const checks: readonly ConformanceCheck[] = [
331
427
  click(item, document);
332
428
  invariant(selected === "archive", "Menu must report selected item ids.");
333
429
  unmount(probe);
430
+
431
+ const defaultOpenProbe = mount(
432
+ <components.Menu
433
+ trigger={<button>Default actions</button>}
434
+ items={[{ id: "restore", label: "Restore" }]}
435
+ defaultOpen
436
+ onAction={() => {}}
437
+ />,
438
+ );
439
+ await settle();
440
+ invariant(
441
+ elementWithText(document, '[role="menuitem"]', "Restore"),
442
+ "Menu must honor defaultOpen.",
443
+ );
444
+ unmount(defaultOpenProbe);
334
445
  },
335
446
  },
336
447
  {
@@ -393,6 +504,30 @@ const checks: readonly ConformanceCheck[] = [
393
504
  "Dialog must not invent actions when footer is omitted.",
394
505
  );
395
506
  unmount(probe);
507
+
508
+ const footerProbe = mount(
509
+ <components.Dialog
510
+ open
511
+ onOpenChange={() => {}}
512
+ title="Footer probe"
513
+ portalContainer={portal}
514
+ footer={
515
+ <button data-conformance-dialog-footer-action="true" type="button">
516
+ Save
517
+ </button>
518
+ }
519
+ >
520
+ Footer content
521
+ </components.Dialog>,
522
+ );
523
+ await settle();
524
+ const footerDialog = portal.querySelector('[role="dialog"]');
525
+ invariant(footerDialog, "Dialog footer probe did not render a dialog.");
526
+ assertContainedFooter(
527
+ footerDialog,
528
+ '[data-conformance-dialog-footer-action="true"]',
529
+ );
530
+ unmount(footerProbe);
396
531
  portal.remove();
397
532
  },
398
533
  },
@@ -466,7 +601,16 @@ const checks: readonly ConformanceCheck[] = [
466
601
  orientation="vertical"
467
602
  onChange={(next) => (value = next)}
468
603
  items={[
469
- { value: "first", label: "First", content: "One" },
604
+ {
605
+ value: "first",
606
+ label: <span data-conformance-tab-label="true">First</span>,
607
+ icon: (
608
+ <span data-conformance-tab-icon="true" aria-hidden="true">
609
+
610
+ </span>
611
+ ),
612
+ content: "One",
613
+ },
470
614
  { value: "second", label: "Second", content: "Two" },
471
615
  ]}
472
616
  />,
@@ -477,6 +621,14 @@ const checks: readonly ConformanceCheck[] = [
477
621
  tabList.getAttribute("aria-orientation") === "vertical",
478
622
  "Tabs must honor vertical orientation in their tablist semantics.",
479
623
  );
624
+ const first = elementWithText(document, '[role="tab"]', "First");
625
+ invariant(first, "Tabs must expose the icon-bearing tab.");
626
+ assertInlineLayout(
627
+ first,
628
+ '[data-conformance-tab-icon="true"]',
629
+ '[data-conformance-tab-label="true"]',
630
+ "Tabs must lay out an icon and its label on the same row.",
631
+ );
480
632
  const second = elementWithText(document, '[role="tab"]', "Second");
481
633
  invariant(second, "Tabs must expose tab semantics.");
482
634
  click(second, document);
@@ -14,7 +14,12 @@ import {
14
14
  type SharedEditorFeatures,
15
15
  } from "./extensions.js";
16
16
  import type { ImageUploadFn } from "./ImageExtension.js";
17
- import { SlashCommandMenu, type SlashCommandItem } from "./SlashCommandMenu.js";
17
+ import {
18
+ DEFAULT_SLASH_COMMANDS,
19
+ filterSlashCommandItems,
20
+ SlashCommandMenu,
21
+ type SlashCommandItem,
22
+ } from "./SlashCommandMenu.js";
18
23
  import {
19
24
  useCollabReconcile,
20
25
  getEditorMarkdown,
@@ -200,6 +205,12 @@ export function SharedRichEditor({
200
205
 
201
206
  const collab = !!ydoc;
202
207
 
208
+ const effectiveSlashItems = useMemo(
209
+ () =>
210
+ filterSlashCommandItems(slashItems ?? DEFAULT_SLASH_COMMANDS, features),
211
+ [features, slashItems],
212
+ );
213
+
203
214
  // The collab hook needs the editor, but useEditor's `onUpdate` needs the
204
215
  // hook's guards. Break the cycle with a ref: `onUpdate` reads the guards
205
216
  // through `guardsRef`, which is populated right after the hook runs below.
@@ -313,7 +324,7 @@ export function SharedRichEditor({
313
324
  <BubbleToolbar editor={editor} buildItems={buildBubbleItems} />
314
325
  ) : null}
315
326
  {editable ? (
316
- <SlashCommandMenu editor={editor} items={slashItems} />
327
+ <SlashCommandMenu editor={editor} items={effectiveSlashItems} />
317
328
  ) : null}
318
329
  <EditorContent editor={editor} />
319
330
  </div>
@@ -22,9 +22,26 @@ export interface SlashCommandItem {
22
22
  searchText?: string;
23
23
  /** Short text glyph shown in the menu (T, H1, tbl, …). */
24
24
  icon: string;
25
+ /** Hide this command when the shared editor feature is disabled. */
26
+ requires?: "tables" | "tasks" | "codeBlock";
25
27
  action: (editor: Editor) => void;
26
28
  }
27
29
 
30
+ export interface SlashCommandFeatureFlags {
31
+ tables?: boolean;
32
+ tasks?: boolean;
33
+ codeBlock?: boolean;
34
+ }
35
+
36
+ export function filterSlashCommandItems(
37
+ items: readonly SlashCommandItem[],
38
+ features?: SlashCommandFeatureFlags,
39
+ ): SlashCommandItem[] {
40
+ return items.filter(
41
+ (item) => !item.requires || features?.[item.requires] !== false,
42
+ );
43
+ }
44
+
28
45
  /**
29
46
  * The default block commands — Plan's current set. Apps pass their own `items`
30
47
  * (typically `[...DEFAULT_SLASH_COMMANDS, ...extra]`) to extend it.
@@ -73,6 +90,7 @@ export const DEFAULT_SLASH_COMMANDS: SlashCommandItem[] = [
73
90
  title: "To-do list",
74
91
  description: "Checklist items",
75
92
  icon: "[]",
93
+ requires: "tasks",
76
94
  action: (editor) => editor.chain().focus().toggleTaskList().run(),
77
95
  },
78
96
  {
@@ -85,6 +103,7 @@ export const DEFAULT_SLASH_COMMANDS: SlashCommandItem[] = [
85
103
  title: "Code block",
86
104
  description: "Code snippet",
87
105
  icon: "<>",
106
+ requires: "codeBlock",
88
107
  action: (editor) => editor.chain().focus().toggleCodeBlock().run(),
89
108
  },
90
109
  {
@@ -97,6 +116,7 @@ export const DEFAULT_SLASH_COMMANDS: SlashCommandItem[] = [
97
116
  title: "Table",
98
117
  description: "Three by three table",
99
118
  icon: "tbl",
119
+ requires: "tables",
100
120
  action: (editor) =>
101
121
  editor
102
122
  .chain()
@@ -25,8 +25,10 @@ export {
25
25
  SlashCommandMenu,
26
26
  DEFAULT_SLASH_COMMANDS,
27
27
  createImageSlashCommand,
28
+ filterSlashCommandItems,
28
29
  type SlashCommandItem,
29
30
  type SlashCommandMenuProps,
31
+ type SlashCommandFeatureFlags,
30
32
  } from "./SlashCommandMenu.js";
31
33
  export {
32
34
  SharedImage,
@@ -20,37 +20,66 @@
20
20
  */
21
21
  @source "./**/*.{js,ts,tsx}";
22
22
 
23
- .agent-realtime-voice-working::after {
23
+ .agent-realtime-voice-glow {
24
+ --agent-realtime-voice-edge-opacity: 0.52;
25
+ --agent-realtime-voice-halo-opacity: 0.28;
24
26
  position: absolute;
25
27
  z-index: 0;
28
+ inset: -4px;
29
+ border-radius: inherit;
30
+ pointer-events: none;
31
+ transform: rotate(0turn);
32
+ will-change: transform;
33
+ }
34
+
35
+ .agent-realtime-voice-working {
36
+ --agent-realtime-voice-edge-opacity: 0.92;
37
+ --agent-realtime-voice-halo-opacity: 0.58;
38
+ }
39
+
40
+ .agent-realtime-voice-glow::before,
41
+ .agent-realtime-voice-glow::after {
42
+ position: absolute;
26
43
  inset: 0;
27
44
  border-radius: inherit;
28
45
  pointer-events: none;
29
46
  content: "";
47
+ background: conic-gradient(
48
+ from -18deg,
49
+ transparent 0deg 228deg,
50
+ oklch(0.65 0.2 294 / 0.18) 244deg,
51
+ oklch(0.7 0.2 265 / 0.7) 274deg,
52
+ oklch(0.79 0.16 235 / 0.96) 306deg,
53
+ oklch(0.96 0.035 210) 326deg,
54
+ oklch(0.88 0.11 202 / 0.72) 340deg,
55
+ transparent 360deg
56
+ );
57
+ opacity: var(--agent-realtime-voice-edge-opacity);
58
+ padding: 1.5px;
59
+ -webkit-mask:
60
+ linear-gradient(#000 0 0) content-box,
61
+ linear-gradient(#000 0 0);
62
+ mask:
63
+ linear-gradient(#000 0 0) content-box,
64
+ linear-gradient(#000 0 0);
65
+ -webkit-mask-composite: xor;
66
+ mask-composite: exclude;
67
+ transition: opacity 220ms ease-out;
30
68
  }
31
69
 
32
- @media (prefers-reduced-motion: no-preference) {
33
- .agent-realtime-voice-working::after {
34
- background: linear-gradient(
35
- 90deg,
36
- transparent 0%,
37
- transparent 36%,
38
- hsl(var(--foreground) / 0.14) 50%,
39
- transparent 64%,
40
- transparent 100%
41
- );
42
- background-repeat: repeat;
43
- background-size: 14rem 100%;
44
- animation: agent-realtime-voice-shine 2.6s linear infinite;
45
- }
46
-
47
- @keyframes agent-realtime-voice-shine {
48
- from {
49
- background-position: 0 0;
50
- }
70
+ .agent-realtime-voice-glow::before {
71
+ inset: -1px;
72
+ opacity: var(--agent-realtime-voice-halo-opacity);
73
+ padding: 2px;
74
+ filter: blur(1px) drop-shadow(0 0 2px oklch(0.9 0.07 215 / 0.95))
75
+ drop-shadow(0 0 6px oklch(0.78 0.15 236 / 0.82))
76
+ drop-shadow(0 0 14px oklch(0.67 0.2 258 / 0.48))
77
+ drop-shadow(0 0 28px oklch(0.62 0.18 276 / 0.26));
78
+ mix-blend-mode: plus-lighter;
79
+ }
51
80
 
52
- to {
53
- background-position: 14rem 0;
54
- }
81
+ @media (prefers-reduced-motion: reduce) {
82
+ .agent-realtime-voice-glow {
83
+ transform: rotate(35deg);
55
84
  }
56
85
  }
@@ -0,0 +1,50 @@
1
+ import type { AgentChatEvent } from "../agent/types.js";
2
+ import type { DataPart, Part } from "./types.js";
3
+ export declare const A2A_AGENT_ACTIVITY_KIND = "agent-native/agent-activity";
4
+ export declare const A2A_AGENT_ACTIVITY_VERSION = 1;
5
+ export declare const MAX_A2A_ACTIVITY_REASONING_CHARS = 32768;
6
+ export declare const MAX_A2A_ACTIVITY_RESPONSE_CHARS = 32768;
7
+ export declare const MAX_A2A_ACTIVITY_TOTAL_CHARS = 98304;
8
+ export declare const MAX_A2A_ACTIVITY_REASONING_SEGMENTS = 128;
9
+ export declare const MAX_A2A_ACTIVITY_TOOL_CALLS = 64;
10
+ export declare const MAX_A2A_ACTIVITY_TOOL_NAME_CHARS = 96;
11
+ export declare const MAX_A2A_ACTIVITY_TOOL_ID_CHARS = 128;
12
+ export type A2AAgentActivityPhase = "reasoning" | "tool" | "responding" | "complete" | "error";
13
+ export type A2AAgentActivityToolStatus = "running" | "completed" | "failed";
14
+ export interface A2AAgentActivityToolCall {
15
+ name: string;
16
+ id?: string;
17
+ status: A2AAgentActivityToolStatus;
18
+ }
19
+ export interface A2AAgentActivitySnapshot extends Record<string, unknown> {
20
+ kind: typeof A2A_AGENT_ACTIVITY_KIND;
21
+ version: typeof A2A_AGENT_ACTIVITY_VERSION;
22
+ sequence: number;
23
+ startedAt: number;
24
+ updatedAt: number;
25
+ durationMs: number;
26
+ activePhase: A2AAgentActivityPhase;
27
+ reasoning: string[];
28
+ toolCalls: A2AAgentActivityToolCall[];
29
+ responseText?: string;
30
+ }
31
+ export interface A2AAgentActivityState {
32
+ sequence: number;
33
+ startedAt: number;
34
+ updatedAt: number;
35
+ activePhase: A2AAgentActivityPhase;
36
+ reasoning: string[];
37
+ toolCalls: A2AAgentActivityToolCall[];
38
+ responseText: string;
39
+ }
40
+ export declare function createA2AAgentActivityState(startedAt?: number): A2AAgentActivityState;
41
+ /**
42
+ * Converts internal loop events into a bounded activity snapshot. It carries
43
+ * only reasoning text already emitted to the local chat, never tool inputs or
44
+ * results.
45
+ */
46
+ export declare function applyA2AAgentActivityEvent(state: A2AAgentActivityState, event: AgentChatEvent, updatedAt?: number): A2AAgentActivityState;
47
+ export declare function buildA2AAgentActivitySnapshot(state: A2AAgentActivityState): A2AAgentActivitySnapshot;
48
+ export declare function buildA2AAgentActivityPart(state: A2AAgentActivityState): DataPart;
49
+ export declare function parseA2AAgentActivityPart(part: Part | unknown): A2AAgentActivitySnapshot | null;
50
+ //# sourceMappingURL=activity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../src/a2a/activity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEjD,eAAO,MAAM,uBAAuB,gCAAgC,CAAC;AACrE,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAC5C,eAAO,MAAM,gCAAgC,QAAS,CAAC;AACvD,eAAO,MAAM,+BAA+B,QAAS,CAAC;AACtD,eAAO,MAAM,4BAA4B,QAAS,CAAC;AACnD,eAAO,MAAM,mCAAmC,MAAM,CAAC;AACvD,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAC9C,eAAO,MAAM,gCAAgC,KAAK,CAAC;AACnD,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD,MAAM,MAAM,qBAAqB,GAC7B,WAAW,GACX,MAAM,GACN,YAAY,GACZ,UAAU,GACV,OAAO,CAAC;AAEZ,MAAM,MAAM,0BAA0B,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE5E,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,0BAA0B,CAAC;CACpC;AAED,MAAM,WAAW,wBAAyB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACvE,IAAI,EAAE,OAAO,uBAAuB,CAAC;IACrC,OAAO,EAAE,OAAO,0BAA0B,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,qBAAqB,CAAC;IACnC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,wBAAwB,EAAE,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,qBAAqB,CAAC;IACnC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,wBAAwB,EAAE,CAAC;IACtC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,2BAA2B,CACzC,SAAS,SAAa,GACrB,qBAAqB,CAUvB;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,qBAAqB,EAC5B,KAAK,EAAE,cAAc,EACrB,SAAS,SAAa,GACrB,qBAAqB,CAkDvB;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,qBAAqB,GAC3B,wBAAwB,CAa1B;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,qBAAqB,GAC3B,QAAQ,CAEV;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,IAAI,GAAG,OAAO,GACnB,wBAAwB,GAAG,IAAI,CAyBjC"}
@@ -0,0 +1,236 @@
1
+ import { sanitizeToolErrorText } from "../agent/tool-error-redaction.js";
2
+ export const A2A_AGENT_ACTIVITY_KIND = "agent-native/agent-activity";
3
+ export const A2A_AGENT_ACTIVITY_VERSION = 1;
4
+ export const MAX_A2A_ACTIVITY_REASONING_CHARS = 32_768;
5
+ export const MAX_A2A_ACTIVITY_RESPONSE_CHARS = 32_768;
6
+ export const MAX_A2A_ACTIVITY_TOTAL_CHARS = 98_304;
7
+ export const MAX_A2A_ACTIVITY_REASONING_SEGMENTS = 128;
8
+ export const MAX_A2A_ACTIVITY_TOOL_CALLS = 64;
9
+ export const MAX_A2A_ACTIVITY_TOOL_NAME_CHARS = 96;
10
+ export const MAX_A2A_ACTIVITY_TOOL_ID_CHARS = 128;
11
+ export function createA2AAgentActivityState(startedAt = Date.now()) {
12
+ return {
13
+ sequence: 0,
14
+ startedAt,
15
+ updatedAt: startedAt,
16
+ activePhase: "reasoning",
17
+ reasoning: [],
18
+ toolCalls: [],
19
+ responseText: "",
20
+ };
21
+ }
22
+ /**
23
+ * Converts internal loop events into a bounded activity snapshot. It carries
24
+ * only reasoning text already emitted to the local chat, never tool inputs or
25
+ * results.
26
+ */
27
+ export function applyA2AAgentActivityEvent(state, event, updatedAt = Date.now()) {
28
+ const next = { ...state, updatedAt: normalizeTimestamp(updatedAt) };
29
+ let changed = false;
30
+ switch (event.type) {
31
+ case "thinking":
32
+ next.activePhase = "reasoning";
33
+ next.reasoning = appendBoundedSegment(next.reasoning, event.text, MAX_A2A_ACTIVITY_REASONING_CHARS, next.toolCalls.length);
34
+ changed = true;
35
+ break;
36
+ case "tool_start":
37
+ next.activePhase = "tool";
38
+ next.responseText = "";
39
+ next.toolCalls = appendToolCall(next.toolCalls, toolFromEvent(event));
40
+ changed = true;
41
+ break;
42
+ case "tool_done":
43
+ next.activePhase = "tool";
44
+ next.toolCalls = settleToolCall(next.toolCalls, toolFromEvent(event));
45
+ changed = true;
46
+ break;
47
+ case "text":
48
+ next.activePhase = "responding";
49
+ next.responseText = appendBoundedText(next.responseText, event.text, MAX_A2A_ACTIVITY_RESPONSE_CHARS);
50
+ changed = true;
51
+ break;
52
+ case "done":
53
+ next.activePhase = "complete";
54
+ changed = true;
55
+ break;
56
+ case "error":
57
+ next.activePhase = "error";
58
+ changed = true;
59
+ break;
60
+ case "clear":
61
+ next.responseText = "";
62
+ changed = true;
63
+ break;
64
+ }
65
+ return changed ? { ...next, sequence: state.sequence + 1 } : state;
66
+ }
67
+ export function buildA2AAgentActivitySnapshot(state) {
68
+ return {
69
+ kind: A2A_AGENT_ACTIVITY_KIND,
70
+ version: A2A_AGENT_ACTIVITY_VERSION,
71
+ sequence: state.sequence,
72
+ startedAt: state.startedAt,
73
+ updatedAt: state.updatedAt,
74
+ durationMs: Math.max(0, state.updatedAt - state.startedAt),
75
+ activePhase: state.activePhase,
76
+ reasoning: state.reasoning,
77
+ toolCalls: state.toolCalls,
78
+ ...(state.responseText ? { responseText: state.responseText } : {}),
79
+ };
80
+ }
81
+ export function buildA2AAgentActivityPart(state) {
82
+ return { type: "data", data: buildA2AAgentActivitySnapshot(state) };
83
+ }
84
+ export function parseA2AAgentActivityPart(part) {
85
+ if (!part || typeof part !== "object")
86
+ return null;
87
+ const candidate = part;
88
+ if (candidate.type !== "data" || !isRecord(candidate.data))
89
+ return null;
90
+ const data = candidate.data;
91
+ if (data.kind !== A2A_AGENT_ACTIVITY_KIND ||
92
+ data.version !== A2A_AGENT_ACTIVITY_VERSION ||
93
+ !isSafeInteger(data.sequence) ||
94
+ !isSafeInteger(data.startedAt) ||
95
+ !isSafeInteger(data.updatedAt) ||
96
+ !isSafeInteger(data.durationMs) ||
97
+ !isPhase(data.activePhase) ||
98
+ data.updatedAt < data.startedAt ||
99
+ data.durationMs !== data.updatedAt - data.startedAt ||
100
+ !isSafeReasoning(data.reasoning) ||
101
+ !isSafeToolCalls(data.toolCalls) ||
102
+ (data.responseText !== undefined &&
103
+ !isSafeText(data.responseText, MAX_A2A_ACTIVITY_RESPONSE_CHARS)) ||
104
+ activityCharacterCount(data) > MAX_A2A_ACTIVITY_TOTAL_CHARS) {
105
+ return null;
106
+ }
107
+ return data;
108
+ }
109
+ function toolFromEvent(event) {
110
+ const id = sanitizeToolId(event.id);
111
+ return {
112
+ name: sanitizeToolName(event.tool),
113
+ ...(id ? { id } : {}),
114
+ status: event.type === "tool_start"
115
+ ? "running"
116
+ : event.isError
117
+ ? "failed"
118
+ : "completed",
119
+ };
120
+ }
121
+ function appendBoundedText(current, addition, maxChars) {
122
+ return sanitizeText(`${current}${addition}`, maxChars);
123
+ }
124
+ function appendBoundedSegment(current, addition, maxChars, precedingToolCount) {
125
+ const used = current.reduce((total, text) => total + text.length, 0);
126
+ if (used >= maxChars ||
127
+ current.length >= MAX_A2A_ACTIVITY_REASONING_SEGMENTS) {
128
+ return current;
129
+ }
130
+ const text = sanitizeText(addition, maxChars - used);
131
+ if (!text)
132
+ return current;
133
+ const next = [...current];
134
+ while (next.length < precedingToolCount &&
135
+ next.length < MAX_A2A_ACTIVITY_REASONING_SEGMENTS) {
136
+ next.push("");
137
+ }
138
+ if (next.length === precedingToolCount) {
139
+ return [...next, text];
140
+ }
141
+ next[precedingToolCount] = `${next[precedingToolCount] ?? ""}${text}`;
142
+ return next;
143
+ }
144
+ function appendToolCall(current, tool) {
145
+ return current.length < MAX_A2A_ACTIVITY_TOOL_CALLS
146
+ ? [...current, tool]
147
+ : current;
148
+ }
149
+ function settleToolCall(current, tool) {
150
+ for (let index = current.length - 1; index >= 0; index -= 1) {
151
+ const existing = current[index];
152
+ if ((tool.id && tool.id === existing.id) ||
153
+ (!tool.id && tool.name === existing.name)) {
154
+ return current.map((value, itemIndex) => itemIndex === index ? tool : value);
155
+ }
156
+ }
157
+ return appendToolCall(current, tool);
158
+ }
159
+ function sanitizeText(value, maxChars) {
160
+ return sanitizeToolErrorText(value)
161
+ .replace(/\r\n?/g, "\n")
162
+ .replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/g, "")
163
+ .slice(0, maxChars);
164
+ }
165
+ function sanitizeToolName(value) {
166
+ return sanitizeText(value, MAX_A2A_ACTIVITY_TOOL_NAME_CHARS) || "tool";
167
+ }
168
+ function sanitizeToolId(value) {
169
+ const sanitized = value
170
+ ? sanitizeText(value, MAX_A2A_ACTIVITY_TOOL_ID_CHARS)
171
+ : "";
172
+ return sanitized || undefined;
173
+ }
174
+ function normalizeTimestamp(value) {
175
+ return isSafeInteger(value) ? value : Date.now();
176
+ }
177
+ function isRecord(value) {
178
+ return !!value && typeof value === "object" && !Array.isArray(value);
179
+ }
180
+ function isSafeInteger(value) {
181
+ return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
182
+ }
183
+ function isPhase(value) {
184
+ return ["reasoning", "tool", "responding", "complete", "error"].includes(value);
185
+ }
186
+ function isSafeReasoning(value) {
187
+ return (Array.isArray(value) &&
188
+ value.length <= MAX_A2A_ACTIVITY_REASONING_SEGMENTS &&
189
+ value.reduce((total, text) => total + (typeof text === "string" ? text.length : Infinity), 0) <= MAX_A2A_ACTIVITY_REASONING_CHARS &&
190
+ value.every((text) => isSafeText(text, MAX_A2A_ACTIVITY_REASONING_CHARS)));
191
+ }
192
+ function isSafeToolCalls(value) {
193
+ return (Array.isArray(value) &&
194
+ value.length <= MAX_A2A_ACTIVITY_TOOL_CALLS &&
195
+ value.every(isSafeToolCall));
196
+ }
197
+ function isSafeToolCall(value) {
198
+ if (!isRecord(value) || !isSafeToolName(value.name))
199
+ return false;
200
+ return ((value.id === undefined || isSafeToolId(value.id)) &&
201
+ (value.status === "running" ||
202
+ value.status === "completed" ||
203
+ value.status === "failed"));
204
+ }
205
+ function isSafeText(value, maxChars) {
206
+ return (typeof value === "string" &&
207
+ value.length <= maxChars &&
208
+ value === sanitizeText(value, maxChars));
209
+ }
210
+ function isSafeToolName(value) {
211
+ return (typeof value === "string" &&
212
+ value.length <= MAX_A2A_ACTIVITY_TOOL_NAME_CHARS &&
213
+ value === sanitizeToolName(value));
214
+ }
215
+ function isSafeToolId(value) {
216
+ return (typeof value === "string" &&
217
+ value.length <= MAX_A2A_ACTIVITY_TOOL_ID_CHARS &&
218
+ value === sanitizeToolId(value));
219
+ }
220
+ function activityCharacterCount(data) {
221
+ const reasoning = Array.isArray(data.reasoning)
222
+ ? data.reasoning.reduce((total, text) => total + (typeof text === "string" ? text.length : 0), 0)
223
+ : 0;
224
+ const response = typeof data.responseText === "string" ? data.responseText.length : 0;
225
+ const tools = Array.isArray(data.toolCalls)
226
+ ? data.toolCalls.reduce((total, tool) => {
227
+ if (!isRecord(tool))
228
+ return total;
229
+ return (total +
230
+ (typeof tool.name === "string" ? tool.name.length : 0) +
231
+ (typeof tool.id === "string" ? tool.id.length : 0));
232
+ }, 0)
233
+ : 0;
234
+ return reasoning + response + tools;
235
+ }
236
+ //# sourceMappingURL=activity.js.map