stream-chat-react-native-core 9.12.1 → 9.14.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 (939) hide show
  1. package/a2ui/package.json +6 -0
  2. package/ai-components/conversation/package.json +6 -0
  3. package/lib/commonjs/a11y/a11yUtils.js.map +1 -1
  4. package/lib/commonjs/a11y/hooks/useResolvedModalAccessibilityProps.js.map +1 -1
  5. package/lib/commonjs/a2ui/A2UIContexts.js +8 -0
  6. package/lib/commonjs/a2ui/A2UIContexts.js.map +1 -0
  7. package/lib/commonjs/a2ui/A2UIInstructions.js +49 -0
  8. package/lib/commonjs/a2ui/A2UIInstructions.js.map +1 -0
  9. package/lib/commonjs/a2ui/A2UIPlaceholder.js +37 -0
  10. package/lib/commonjs/a2ui/A2UIPlaceholder.js.map +1 -0
  11. package/lib/commonjs/a2ui/A2UIRenderer.js +363 -0
  12. package/lib/commonjs/a2ui/A2UIRenderer.js.map +1 -0
  13. package/lib/commonjs/a2ui/A2UIStream.js +91 -0
  14. package/lib/commonjs/a2ui/A2UIStream.js.map +1 -0
  15. package/lib/commonjs/a2ui/A2UISurface.js +237 -0
  16. package/lib/commonjs/a2ui/A2UISurface.js.map +1 -0
  17. package/lib/commonjs/a2ui/basicCatalog.json +1206 -0
  18. package/lib/commonjs/a2ui/basicFunctions.js +398 -0
  19. package/lib/commonjs/a2ui/basicFunctions.js.map +1 -0
  20. package/lib/commonjs/a2ui/catalogDocument.js +80 -0
  21. package/lib/commonjs/a2ui/catalogDocument.js.map +1 -0
  22. package/lib/commonjs/a2ui/catalogs.js +105 -0
  23. package/lib/commonjs/a2ui/catalogs.js.map +1 -0
  24. package/lib/commonjs/a2ui/components/DateTimeInput.js +445 -0
  25. package/lib/commonjs/a2ui/components/DateTimeInput.js.map +1 -0
  26. package/lib/commonjs/a2ui/components/Media.js +316 -0
  27. package/lib/commonjs/a2ui/components/Media.js.map +1 -0
  28. package/lib/commonjs/a2ui/components/basicComponents.js +975 -0
  29. package/lib/commonjs/a2ui/components/basicComponents.js.map +1 -0
  30. package/lib/commonjs/a2ui/components/iconPaths.js +66 -0
  31. package/lib/commonjs/a2ui/components/iconPaths.js.map +1 -0
  32. package/lib/commonjs/a2ui/components/types.js +4 -0
  33. package/lib/commonjs/a2ui/components/types.js.map +1 -0
  34. package/lib/commonjs/a2ui/index.js +70 -0
  35. package/lib/commonjs/a2ui/index.js.map +1 -0
  36. package/lib/commonjs/a2ui/instructions.js +268 -0
  37. package/lib/commonjs/a2ui/instructions.js.map +1 -0
  38. package/lib/commonjs/a2ui/secrets.js +169 -0
  39. package/lib/commonjs/a2ui/secrets.js.map +1 -0
  40. package/lib/commonjs/a2ui/useReplyState.js +35 -0
  41. package/lib/commonjs/a2ui/useReplyState.js.map +1 -0
  42. package/lib/commonjs/ai-components/AITypingIndicatorView.js +8 -18
  43. package/lib/commonjs/ai-components/AITypingIndicatorView.js.map +1 -1
  44. package/lib/commonjs/ai-components/README.md +64 -3
  45. package/lib/commonjs/ai-components/StreamingMessageView.js +26 -0
  46. package/lib/commonjs/ai-components/StreamingMessageView.js.map +1 -1
  47. package/lib/commonjs/ai-components/charts/components/PieLegend.js +2 -1
  48. package/lib/commonjs/ai-components/charts/components/PieLegend.js.map +1 -1
  49. package/lib/commonjs/ai-components/charts/components/VictoryChart.js +7 -2
  50. package/lib/commonjs/ai-components/charts/components/VictoryChart.js.map +1 -1
  51. package/lib/commonjs/ai-components/charts/utils/format-time-label.js +15 -0
  52. package/lib/commonjs/ai-components/charts/utils/format-time-label.js.map +1 -0
  53. package/lib/commonjs/ai-components/charts/vega-lite/schema.js +17 -2
  54. package/lib/commonjs/ai-components/charts/vega-lite/schema.js.map +1 -1
  55. package/lib/commonjs/ai-components/contexts/composer-context.js +13 -6
  56. package/lib/commonjs/ai-components/contexts/composer-context.js.map +1 -1
  57. package/lib/commonjs/ai-components/contexts/index.js +11 -0
  58. package/lib/commonjs/ai-components/contexts/index.js.map +1 -1
  59. package/lib/commonjs/ai-components/contexts/theme-context.js +33 -2
  60. package/lib/commonjs/ai-components/contexts/theme-context.js.map +1 -1
  61. package/lib/commonjs/ai-components/contexts/translation-context.js +29 -0
  62. package/lib/commonjs/ai-components/contexts/translation-context.js.map +1 -0
  63. package/lib/commonjs/ai-components/conversation/AIConversation.js +374 -0
  64. package/lib/commonjs/ai-components/conversation/AIConversation.js.map +1 -0
  65. package/lib/commonjs/ai-components/conversation/entries.js +98 -0
  66. package/lib/commonjs/ai-components/conversation/entries.js.map +1 -0
  67. package/lib/commonjs/ai-components/conversation/index.js +15 -0
  68. package/lib/commonjs/ai-components/conversation/index.js.map +1 -0
  69. package/lib/commonjs/ai-components/conversation/list/AIChatList.js +224 -0
  70. package/lib/commonjs/ai-components/conversation/list/AIChatList.js.map +1 -0
  71. package/lib/commonjs/ai-components/conversation/list/useChatListController.js +78 -0
  72. package/lib/commonjs/ai-components/conversation/list/useChatListController.js.map +1 -0
  73. package/lib/commonjs/ai-components/conversation/list/useEndInView.js +51 -0
  74. package/lib/commonjs/ai-components/conversation/list/useEndInView.js.map +1 -0
  75. package/lib/commonjs/ai-components/conversation/list/useKeyboardOverlap.js +53 -0
  76. package/lib/commonjs/ai-components/conversation/list/useKeyboardOverlap.js.map +1 -0
  77. package/lib/commonjs/ai-components/conversation/list/useLoadOlder.js +73 -0
  78. package/lib/commonjs/ai-components/conversation/list/useLoadOlder.js.map +1 -0
  79. package/lib/commonjs/ai-components/conversation/list/usePinnedAnchor.js +84 -0
  80. package/lib/commonjs/ai-components/conversation/list/usePinnedAnchor.js.map +1 -0
  81. package/lib/commonjs/ai-components/conversation/useConversationRows.js +117 -0
  82. package/lib/commonjs/ai-components/conversation/useConversationRows.js.map +1 -0
  83. package/lib/commonjs/ai-components/conversation-state/controller/AIAgentError.js +13 -0
  84. package/lib/commonjs/ai-components/conversation-state/controller/AIAgentError.js.map +1 -0
  85. package/lib/commonjs/ai-components/conversation-state/controller/AIConversationController.js +431 -0
  86. package/lib/commonjs/ai-components/conversation-state/controller/AIConversationController.js.map +1 -0
  87. package/lib/commonjs/ai-components/conversation-state/controller/AIConversationExchange.js +89 -0
  88. package/lib/commonjs/ai-components/conversation-state/controller/AIConversationExchange.js.map +1 -0
  89. package/lib/commonjs/ai-components/conversation-state/controller/index.js +48 -0
  90. package/lib/commonjs/ai-components/conversation-state/controller/index.js.map +1 -0
  91. package/lib/commonjs/ai-components/conversation-state/controller/offers.js +35 -0
  92. package/lib/commonjs/ai-components/conversation-state/controller/offers.js.map +1 -0
  93. package/lib/commonjs/ai-components/conversation-state/controller/types.js +13 -0
  94. package/lib/commonjs/ai-components/conversation-state/controller/types.js.map +1 -0
  95. package/lib/commonjs/ai-components/conversation-state/controller/useAIConversationState.js +8 -0
  96. package/lib/commonjs/ai-components/conversation-state/controller/useAIConversationState.js.map +1 -0
  97. package/lib/commonjs/ai-components/conversation-state/fromStreamMessage.js +67 -0
  98. package/lib/commonjs/ai-components/conversation-state/fromStreamMessage.js.map +1 -0
  99. package/lib/commonjs/ai-components/conversation-state/index.js +37 -0
  100. package/lib/commonjs/ai-components/conversation-state/index.js.map +1 -0
  101. package/lib/commonjs/ai-components/conversation-state/types.js +4 -0
  102. package/lib/commonjs/ai-components/conversation-state/types.js.map +1 -0
  103. package/lib/commonjs/ai-components/generative-ui/AIUIAction.js +30 -0
  104. package/lib/commonjs/ai-components/generative-ui/AIUIAction.js.map +1 -0
  105. package/lib/commonjs/ai-components/generative-ui/AIUIArguments.js +128 -0
  106. package/lib/commonjs/ai-components/generative-ui/AIUIArguments.js.map +1 -0
  107. package/lib/commonjs/ai-components/generative-ui/AIUIComponent.js +50 -0
  108. package/lib/commonjs/ai-components/generative-ui/AIUIComponent.js.map +1 -0
  109. package/lib/commonjs/ai-components/generative-ui/AIUIComponentDefinition.js +134 -0
  110. package/lib/commonjs/ai-components/generative-ui/AIUIComponentDefinition.js.map +1 -0
  111. package/lib/commonjs/ai-components/generative-ui/AIUIDocument.js +32 -0
  112. package/lib/commonjs/ai-components/generative-ui/AIUIDocument.js.map +1 -0
  113. package/lib/commonjs/ai-components/generative-ui/AIUIEntrance.js +197 -0
  114. package/lib/commonjs/ai-components/generative-ui/AIUIEntrance.js.map +1 -0
  115. package/lib/commonjs/ai-components/generative-ui/AIUIErrorBoundary.js +30 -0
  116. package/lib/commonjs/ai-components/generative-ui/AIUIErrorBoundary.js.map +1 -0
  117. package/lib/commonjs/ai-components/generative-ui/AIUIHelpers.js +54 -0
  118. package/lib/commonjs/ai-components/generative-ui/AIUIHelpers.js.map +1 -0
  119. package/lib/commonjs/ai-components/generative-ui/AIUIHost.js +259 -0
  120. package/lib/commonjs/ai-components/generative-ui/AIUIHost.js.map +1 -0
  121. package/lib/commonjs/ai-components/generative-ui/AIUIMedia.js +24 -0
  122. package/lib/commonjs/ai-components/generative-ui/AIUIMedia.js.map +1 -0
  123. package/lib/commonjs/ai-components/generative-ui/AIUIRenderer.js +10 -0
  124. package/lib/commonjs/ai-components/generative-ui/AIUIRenderer.js.map +1 -0
  125. package/lib/commonjs/ai-components/generative-ui/AIUIView.js +57 -0
  126. package/lib/commonjs/ai-components/generative-ui/AIUIView.js.map +1 -0
  127. package/lib/commonjs/ai-components/generative-ui/index.js +181 -0
  128. package/lib/commonjs/ai-components/generative-ui/index.js.map +1 -0
  129. package/lib/commonjs/ai-components/icons.js +44 -0
  130. package/lib/commonjs/ai-components/icons.js.map +1 -0
  131. package/lib/commonjs/ai-components/index.js +96 -0
  132. package/lib/commonjs/ai-components/index.js.map +1 -1
  133. package/lib/commonjs/ai-components/internal/Shimmer.js +36 -0
  134. package/lib/commonjs/ai-components/internal/Shimmer.js.map +1 -0
  135. package/lib/commonjs/ai-components/internal/format.js +66 -0
  136. package/lib/commonjs/ai-components/internal/format.js.map +1 -0
  137. package/lib/commonjs/ai-components/internal/hooks/useBottomSafeArea.js +12 -0
  138. package/lib/commonjs/ai-components/internal/hooks/useBottomSafeArea.js.map +1 -0
  139. package/lib/commonjs/ai-components/internal/icons/AgentIcons.js +74 -0
  140. package/lib/commonjs/ai-components/internal/icons/AgentIcons.js.map +1 -0
  141. package/lib/commonjs/ai-components/internal/keyboard.js +40 -0
  142. package/lib/commonjs/ai-components/internal/keyboard.js.map +1 -0
  143. package/lib/commonjs/ai-components/internal/tokens.js +11 -0
  144. package/lib/commonjs/ai-components/internal/tokens.js.map +1 -0
  145. package/lib/commonjs/ai-components/internal/uuid.js +21 -0
  146. package/lib/commonjs/ai-components/internal/uuid.js.map +1 -0
  147. package/lib/commonjs/ai-components/markdown/components/CodeBlock.js +4 -2
  148. package/lib/commonjs/ai-components/markdown/components/CodeBlock.js.map +1 -1
  149. package/lib/commonjs/ai-components/markdown/components/InlineCode.js +1 -0
  150. package/lib/commonjs/ai-components/markdown/components/InlineCode.js.map +1 -1
  151. package/lib/commonjs/ai-components/markdown/components/Text.js +11 -2
  152. package/lib/commonjs/ai-components/markdown/components/Text.js.map +1 -1
  153. package/lib/commonjs/ai-components/markdown/styles.js +27 -29
  154. package/lib/commonjs/ai-components/markdown/styles.js.map +1 -1
  155. package/lib/commonjs/ai-components/message/AIAssistantMessage.js +64 -0
  156. package/lib/commonjs/ai-components/message/AIAssistantMessage.js.map +1 -0
  157. package/lib/commonjs/ai-components/message/AIMessageAttachment.js +189 -0
  158. package/lib/commonjs/ai-components/message/AIMessageAttachment.js.map +1 -0
  159. package/lib/commonjs/ai-components/message/AIReplyActions.js +132 -0
  160. package/lib/commonjs/ai-components/message/AIReplyActions.js.map +1 -0
  161. package/lib/commonjs/ai-components/message/AIUserMessage.js +104 -0
  162. package/lib/commonjs/ai-components/message/AIUserMessage.js.map +1 -0
  163. package/lib/commonjs/ai-components/message/UserMessageMenu.js +150 -0
  164. package/lib/commonjs/ai-components/message/UserMessageMenu.js.map +1 -0
  165. package/lib/commonjs/ai-components/message/index.js +48 -0
  166. package/lib/commonjs/ai-components/message/index.js.map +1 -0
  167. package/lib/commonjs/ai-components/message-composer/ActionButton.js +4 -2
  168. package/lib/commonjs/ai-components/message-composer/ActionButton.js.map +1 -1
  169. package/lib/commonjs/ai-components/message-composer/ActionSheet.js +22 -6
  170. package/lib/commonjs/ai-components/message-composer/ActionSheet.js.map +1 -1
  171. package/lib/commonjs/ai-components/message-composer/AttachmentButton.js +5 -1
  172. package/lib/commonjs/ai-components/message-composer/AttachmentButton.js.map +1 -1
  173. package/lib/commonjs/ai-components/message-composer/ChatOptions.js +147 -0
  174. package/lib/commonjs/ai-components/message-composer/ChatOptions.js.map +1 -0
  175. package/lib/commonjs/ai-components/message-composer/ComposerView.js +146 -20
  176. package/lib/commonjs/ai-components/message-composer/ComposerView.js.map +1 -1
  177. package/lib/commonjs/ai-components/message-composer/EditingMessageChip.js +81 -0
  178. package/lib/commonjs/ai-components/message-composer/EditingMessageChip.js.map +1 -0
  179. package/lib/commonjs/ai-components/message-composer/MediaPreviewList.js +26 -1
  180. package/lib/commonjs/ai-components/message-composer/MediaPreviewList.js.map +1 -1
  181. package/lib/commonjs/ai-components/message-composer/index.js +11 -0
  182. package/lib/commonjs/ai-components/message-composer/index.js.map +1 -1
  183. package/lib/commonjs/ai-components/message-parts/AIMessageParts.js +133 -0
  184. package/lib/commonjs/ai-components/message-parts/AIMessageParts.js.map +1 -0
  185. package/lib/commonjs/ai-components/message-parts/AIToolApproval.js +197 -0
  186. package/lib/commonjs/ai-components/message-parts/AIToolApproval.js.map +1 -0
  187. package/lib/commonjs/ai-components/message-parts/AIToolAuthorization.js +250 -0
  188. package/lib/commonjs/ai-components/message-parts/AIToolAuthorization.js.map +1 -0
  189. package/lib/commonjs/ai-components/message-parts/AIToolCall.js +159 -0
  190. package/lib/commonjs/ai-components/message-parts/AIToolCall.js.map +1 -0
  191. package/lib/commonjs/ai-components/message-parts/callStates.js +54 -0
  192. package/lib/commonjs/ai-components/message-parts/callStates.js.map +1 -0
  193. package/lib/commonjs/ai-components/message-parts/index.js +70 -0
  194. package/lib/commonjs/ai-components/message-parts/index.js.map +1 -0
  195. package/lib/commonjs/ai-components/message-parts/parseMessageParts.js +126 -0
  196. package/lib/commonjs/ai-components/message-parts/parseMessageParts.js.map +1 -0
  197. package/lib/commonjs/ai-components/message-parts/types.js +2 -0
  198. package/lib/commonjs/ai-components/message-parts/types.js.map +1 -0
  199. package/lib/commonjs/ai-components/native-specs/NativeAIAgent.js +7 -0
  200. package/lib/commonjs/ai-components/native-specs/NativeAIAgent.js.map +1 -0
  201. package/lib/commonjs/ai-components/reasoning/AIReasoning.js +401 -0
  202. package/lib/commonjs/ai-components/reasoning/AIReasoning.js.map +1 -0
  203. package/lib/commonjs/ai-components/reasoning/index.js +26 -0
  204. package/lib/commonjs/ai-components/reasoning/index.js.map +1 -0
  205. package/lib/commonjs/ai-components/reasoning/thinkingClock.js +63 -0
  206. package/lib/commonjs/ai-components/reasoning/thinkingClock.js.map +1 -0
  207. package/lib/commonjs/ai-components/services/clipboard-service/expo.js +7 -2
  208. package/lib/commonjs/ai-components/services/clipboard-service/expo.js.map +1 -1
  209. package/lib/commonjs/ai-components/store/composer/store.js.map +1 -1
  210. package/lib/commonjs/ai-components/store/composer/useComposerChatOption.js +18 -0
  211. package/lib/commonjs/ai-components/store/composer/useComposerChatOption.js.map +1 -0
  212. package/lib/commonjs/ai-components/store/composer/useComposerIsEditing.js +18 -0
  213. package/lib/commonjs/ai-components/store/composer/useComposerIsEditing.js.map +1 -0
  214. package/lib/commonjs/ai-components/store/index.js +22 -0
  215. package/lib/commonjs/ai-components/store/index.js.map +1 -1
  216. package/lib/commonjs/ai-components/suggestions/AISuggestions.js +66 -0
  217. package/lib/commonjs/ai-components/suggestions/AISuggestions.js.map +1 -0
  218. package/lib/commonjs/ai-components/suggestions/index.js +15 -0
  219. package/lib/commonjs/ai-components/suggestions/index.js.map +1 -0
  220. package/lib/commonjs/ai-components/syntax-highlighting/utils/flatten-nodes.js +2 -1
  221. package/lib/commonjs/ai-components/syntax-highlighting/utils/flatten-nodes.js.map +1 -1
  222. package/lib/commonjs/ai-components/syntax-highlighting/utils/renderer.js +3 -2
  223. package/lib/commonjs/ai-components/syntax-highlighting/utils/renderer.js.map +1 -1
  224. package/lib/commonjs/ai-components/theme.js +137 -1
  225. package/lib/commonjs/ai-components/theme.js.map +1 -1
  226. package/lib/commonjs/ai-components/tool-calls/AIClientIdentity.js +22 -0
  227. package/lib/commonjs/ai-components/tool-calls/AIClientIdentity.js.map +1 -0
  228. package/lib/commonjs/ai-components/tool-calls/AIClientToolRunner.js +109 -0
  229. package/lib/commonjs/ai-components/tool-calls/AIClientToolRunner.js.map +1 -0
  230. package/lib/commonjs/ai-components/tool-calls/AIToolApprover.js +23 -0
  231. package/lib/commonjs/ai-components/tool-calls/AIToolApprover.js.map +1 -0
  232. package/lib/commonjs/ai-components/tool-calls/authSessionAuthorizer.js +88 -0
  233. package/lib/commonjs/ai-components/tool-calls/authSessionAuthorizer.js.map +1 -0
  234. package/lib/commonjs/ai-components/tool-calls/index.js +48 -0
  235. package/lib/commonjs/ai-components/tool-calls/index.js.map +1 -0
  236. package/lib/commonjs/ai-components/voice-visualization/glowShader.js.map +1 -1
  237. package/lib/commonjs/components/Accessibility/useAccessibilityAnnouncer.js.map +1 -1
  238. package/lib/commonjs/components/Message/MessageItemView/utils/renderText.js.map +1 -1
  239. package/lib/commonjs/contexts/translationContext/TranslationContext.js +2 -2
  240. package/lib/commonjs/contexts/translationContext/TranslationContext.js.map +1 -1
  241. package/lib/commonjs/i18n/ar.json +40 -1
  242. package/lib/commonjs/i18n/en.json +40 -1
  243. package/lib/commonjs/i18n/es.json +40 -1
  244. package/lib/commonjs/i18n/fr.json +40 -1
  245. package/lib/commonjs/i18n/he.json +40 -1
  246. package/lib/commonjs/i18n/hi.json +40 -1
  247. package/lib/commonjs/i18n/it.json +40 -1
  248. package/lib/commonjs/i18n/ja.json +40 -1
  249. package/lib/commonjs/i18n/ko.json +40 -1
  250. package/lib/commonjs/i18n/nl.json +40 -1
  251. package/lib/commonjs/i18n/pt-br.json +40 -1
  252. package/lib/commonjs/i18n/ru.json +40 -1
  253. package/lib/commonjs/i18n/tr.json +40 -1
  254. package/lib/commonjs/mock-builders/a2ui/ohrid.js +84 -0
  255. package/lib/commonjs/mock-builders/a2ui/ohrid.js.map +1 -0
  256. package/lib/commonjs/utils/i18n/Streami18n.js +9 -4
  257. package/lib/commonjs/utils/i18n/Streami18n.js.map +1 -1
  258. package/lib/commonjs/utils/i18n/utils.js +7 -0
  259. package/lib/commonjs/utils/i18n/utils.js.map +1 -0
  260. package/lib/commonjs/version.json +1 -1
  261. package/lib/module/a11y/a11yUtils.js.map +1 -1
  262. package/lib/module/a11y/hooks/useResolvedModalAccessibilityProps.js.map +1 -1
  263. package/lib/module/a2ui/A2UIContexts.js +8 -0
  264. package/lib/module/a2ui/A2UIContexts.js.map +1 -0
  265. package/lib/module/a2ui/A2UIInstructions.js +49 -0
  266. package/lib/module/a2ui/A2UIInstructions.js.map +1 -0
  267. package/lib/module/a2ui/A2UIPlaceholder.js +37 -0
  268. package/lib/module/a2ui/A2UIPlaceholder.js.map +1 -0
  269. package/lib/module/a2ui/A2UIRenderer.js +363 -0
  270. package/lib/module/a2ui/A2UIRenderer.js.map +1 -0
  271. package/lib/module/a2ui/A2UIStream.js +91 -0
  272. package/lib/module/a2ui/A2UIStream.js.map +1 -0
  273. package/lib/module/a2ui/A2UISurface.js +237 -0
  274. package/lib/module/a2ui/A2UISurface.js.map +1 -0
  275. package/lib/module/a2ui/basicCatalog.json +1206 -0
  276. package/lib/module/a2ui/basicFunctions.js +398 -0
  277. package/lib/module/a2ui/basicFunctions.js.map +1 -0
  278. package/lib/module/a2ui/catalogDocument.js +80 -0
  279. package/lib/module/a2ui/catalogDocument.js.map +1 -0
  280. package/lib/module/a2ui/catalogs.js +105 -0
  281. package/lib/module/a2ui/catalogs.js.map +1 -0
  282. package/lib/module/a2ui/components/DateTimeInput.js +445 -0
  283. package/lib/module/a2ui/components/DateTimeInput.js.map +1 -0
  284. package/lib/module/a2ui/components/Media.js +316 -0
  285. package/lib/module/a2ui/components/Media.js.map +1 -0
  286. package/lib/module/a2ui/components/basicComponents.js +975 -0
  287. package/lib/module/a2ui/components/basicComponents.js.map +1 -0
  288. package/lib/module/a2ui/components/iconPaths.js +66 -0
  289. package/lib/module/a2ui/components/iconPaths.js.map +1 -0
  290. package/lib/module/a2ui/components/types.js +4 -0
  291. package/lib/module/a2ui/components/types.js.map +1 -0
  292. package/lib/module/a2ui/index.js +70 -0
  293. package/lib/module/a2ui/index.js.map +1 -0
  294. package/lib/module/a2ui/instructions.js +268 -0
  295. package/lib/module/a2ui/instructions.js.map +1 -0
  296. package/lib/module/a2ui/secrets.js +169 -0
  297. package/lib/module/a2ui/secrets.js.map +1 -0
  298. package/lib/module/a2ui/useReplyState.js +35 -0
  299. package/lib/module/a2ui/useReplyState.js.map +1 -0
  300. package/lib/module/ai-components/AITypingIndicatorView.js +8 -18
  301. package/lib/module/ai-components/AITypingIndicatorView.js.map +1 -1
  302. package/lib/module/ai-components/README.md +64 -3
  303. package/lib/module/ai-components/StreamingMessageView.js +26 -0
  304. package/lib/module/ai-components/StreamingMessageView.js.map +1 -1
  305. package/lib/module/ai-components/charts/components/PieLegend.js +2 -1
  306. package/lib/module/ai-components/charts/components/PieLegend.js.map +1 -1
  307. package/lib/module/ai-components/charts/components/VictoryChart.js +7 -2
  308. package/lib/module/ai-components/charts/components/VictoryChart.js.map +1 -1
  309. package/lib/module/ai-components/charts/utils/format-time-label.js +15 -0
  310. package/lib/module/ai-components/charts/utils/format-time-label.js.map +1 -0
  311. package/lib/module/ai-components/charts/vega-lite/schema.js +17 -2
  312. package/lib/module/ai-components/charts/vega-lite/schema.js.map +1 -1
  313. package/lib/module/ai-components/contexts/composer-context.js +13 -6
  314. package/lib/module/ai-components/contexts/composer-context.js.map +1 -1
  315. package/lib/module/ai-components/contexts/index.js +11 -0
  316. package/lib/module/ai-components/contexts/index.js.map +1 -1
  317. package/lib/module/ai-components/contexts/theme-context.js +33 -2
  318. package/lib/module/ai-components/contexts/theme-context.js.map +1 -1
  319. package/lib/module/ai-components/contexts/translation-context.js +29 -0
  320. package/lib/module/ai-components/contexts/translation-context.js.map +1 -0
  321. package/lib/module/ai-components/conversation/AIConversation.js +374 -0
  322. package/lib/module/ai-components/conversation/AIConversation.js.map +1 -0
  323. package/lib/module/ai-components/conversation/entries.js +98 -0
  324. package/lib/module/ai-components/conversation/entries.js.map +1 -0
  325. package/lib/module/ai-components/conversation/index.js +15 -0
  326. package/lib/module/ai-components/conversation/index.js.map +1 -0
  327. package/lib/module/ai-components/conversation/list/AIChatList.js +224 -0
  328. package/lib/module/ai-components/conversation/list/AIChatList.js.map +1 -0
  329. package/lib/module/ai-components/conversation/list/useChatListController.js +78 -0
  330. package/lib/module/ai-components/conversation/list/useChatListController.js.map +1 -0
  331. package/lib/module/ai-components/conversation/list/useEndInView.js +51 -0
  332. package/lib/module/ai-components/conversation/list/useEndInView.js.map +1 -0
  333. package/lib/module/ai-components/conversation/list/useKeyboardOverlap.js +53 -0
  334. package/lib/module/ai-components/conversation/list/useKeyboardOverlap.js.map +1 -0
  335. package/lib/module/ai-components/conversation/list/useLoadOlder.js +73 -0
  336. package/lib/module/ai-components/conversation/list/useLoadOlder.js.map +1 -0
  337. package/lib/module/ai-components/conversation/list/usePinnedAnchor.js +84 -0
  338. package/lib/module/ai-components/conversation/list/usePinnedAnchor.js.map +1 -0
  339. package/lib/module/ai-components/conversation/useConversationRows.js +117 -0
  340. package/lib/module/ai-components/conversation/useConversationRows.js.map +1 -0
  341. package/lib/module/ai-components/conversation-state/controller/AIAgentError.js +13 -0
  342. package/lib/module/ai-components/conversation-state/controller/AIAgentError.js.map +1 -0
  343. package/lib/module/ai-components/conversation-state/controller/AIConversationController.js +431 -0
  344. package/lib/module/ai-components/conversation-state/controller/AIConversationController.js.map +1 -0
  345. package/lib/module/ai-components/conversation-state/controller/AIConversationExchange.js +89 -0
  346. package/lib/module/ai-components/conversation-state/controller/AIConversationExchange.js.map +1 -0
  347. package/lib/module/ai-components/conversation-state/controller/index.js +48 -0
  348. package/lib/module/ai-components/conversation-state/controller/index.js.map +1 -0
  349. package/lib/module/ai-components/conversation-state/controller/offers.js +35 -0
  350. package/lib/module/ai-components/conversation-state/controller/offers.js.map +1 -0
  351. package/lib/module/ai-components/conversation-state/controller/types.js +13 -0
  352. package/lib/module/ai-components/conversation-state/controller/types.js.map +1 -0
  353. package/lib/module/ai-components/conversation-state/controller/useAIConversationState.js +8 -0
  354. package/lib/module/ai-components/conversation-state/controller/useAIConversationState.js.map +1 -0
  355. package/lib/module/ai-components/conversation-state/fromStreamMessage.js +67 -0
  356. package/lib/module/ai-components/conversation-state/fromStreamMessage.js.map +1 -0
  357. package/lib/module/ai-components/conversation-state/index.js +37 -0
  358. package/lib/module/ai-components/conversation-state/index.js.map +1 -0
  359. package/lib/module/ai-components/conversation-state/types.js +4 -0
  360. package/lib/module/ai-components/conversation-state/types.js.map +1 -0
  361. package/lib/module/ai-components/generative-ui/AIUIAction.js +30 -0
  362. package/lib/module/ai-components/generative-ui/AIUIAction.js.map +1 -0
  363. package/lib/module/ai-components/generative-ui/AIUIArguments.js +128 -0
  364. package/lib/module/ai-components/generative-ui/AIUIArguments.js.map +1 -0
  365. package/lib/module/ai-components/generative-ui/AIUIComponent.js +50 -0
  366. package/lib/module/ai-components/generative-ui/AIUIComponent.js.map +1 -0
  367. package/lib/module/ai-components/generative-ui/AIUIComponentDefinition.js +134 -0
  368. package/lib/module/ai-components/generative-ui/AIUIComponentDefinition.js.map +1 -0
  369. package/lib/module/ai-components/generative-ui/AIUIDocument.js +32 -0
  370. package/lib/module/ai-components/generative-ui/AIUIDocument.js.map +1 -0
  371. package/lib/module/ai-components/generative-ui/AIUIEntrance.js +197 -0
  372. package/lib/module/ai-components/generative-ui/AIUIEntrance.js.map +1 -0
  373. package/lib/module/ai-components/generative-ui/AIUIErrorBoundary.js +30 -0
  374. package/lib/module/ai-components/generative-ui/AIUIErrorBoundary.js.map +1 -0
  375. package/lib/module/ai-components/generative-ui/AIUIHelpers.js +54 -0
  376. package/lib/module/ai-components/generative-ui/AIUIHelpers.js.map +1 -0
  377. package/lib/module/ai-components/generative-ui/AIUIHost.js +259 -0
  378. package/lib/module/ai-components/generative-ui/AIUIHost.js.map +1 -0
  379. package/lib/module/ai-components/generative-ui/AIUIMedia.js +24 -0
  380. package/lib/module/ai-components/generative-ui/AIUIMedia.js.map +1 -0
  381. package/lib/module/ai-components/generative-ui/AIUIRenderer.js +10 -0
  382. package/lib/module/ai-components/generative-ui/AIUIRenderer.js.map +1 -0
  383. package/lib/module/ai-components/generative-ui/AIUIView.js +57 -0
  384. package/lib/module/ai-components/generative-ui/AIUIView.js.map +1 -0
  385. package/lib/module/ai-components/generative-ui/index.js +181 -0
  386. package/lib/module/ai-components/generative-ui/index.js.map +1 -0
  387. package/lib/module/ai-components/icons.js +44 -0
  388. package/lib/module/ai-components/icons.js.map +1 -0
  389. package/lib/module/ai-components/index.js +96 -0
  390. package/lib/module/ai-components/index.js.map +1 -1
  391. package/lib/module/ai-components/internal/Shimmer.js +36 -0
  392. package/lib/module/ai-components/internal/Shimmer.js.map +1 -0
  393. package/lib/module/ai-components/internal/format.js +66 -0
  394. package/lib/module/ai-components/internal/format.js.map +1 -0
  395. package/lib/module/ai-components/internal/hooks/useBottomSafeArea.js +12 -0
  396. package/lib/module/ai-components/internal/hooks/useBottomSafeArea.js.map +1 -0
  397. package/lib/module/ai-components/internal/icons/AgentIcons.js +74 -0
  398. package/lib/module/ai-components/internal/icons/AgentIcons.js.map +1 -0
  399. package/lib/module/ai-components/internal/keyboard.js +40 -0
  400. package/lib/module/ai-components/internal/keyboard.js.map +1 -0
  401. package/lib/module/ai-components/internal/tokens.js +11 -0
  402. package/lib/module/ai-components/internal/tokens.js.map +1 -0
  403. package/lib/module/ai-components/internal/uuid.js +21 -0
  404. package/lib/module/ai-components/internal/uuid.js.map +1 -0
  405. package/lib/module/ai-components/markdown/components/CodeBlock.js +4 -2
  406. package/lib/module/ai-components/markdown/components/CodeBlock.js.map +1 -1
  407. package/lib/module/ai-components/markdown/components/InlineCode.js +1 -0
  408. package/lib/module/ai-components/markdown/components/InlineCode.js.map +1 -1
  409. package/lib/module/ai-components/markdown/components/Text.js +11 -2
  410. package/lib/module/ai-components/markdown/components/Text.js.map +1 -1
  411. package/lib/module/ai-components/markdown/styles.js +27 -29
  412. package/lib/module/ai-components/markdown/styles.js.map +1 -1
  413. package/lib/module/ai-components/message/AIAssistantMessage.js +64 -0
  414. package/lib/module/ai-components/message/AIAssistantMessage.js.map +1 -0
  415. package/lib/module/ai-components/message/AIMessageAttachment.js +189 -0
  416. package/lib/module/ai-components/message/AIMessageAttachment.js.map +1 -0
  417. package/lib/module/ai-components/message/AIReplyActions.js +132 -0
  418. package/lib/module/ai-components/message/AIReplyActions.js.map +1 -0
  419. package/lib/module/ai-components/message/AIUserMessage.js +104 -0
  420. package/lib/module/ai-components/message/AIUserMessage.js.map +1 -0
  421. package/lib/module/ai-components/message/UserMessageMenu.js +150 -0
  422. package/lib/module/ai-components/message/UserMessageMenu.js.map +1 -0
  423. package/lib/module/ai-components/message/index.js +48 -0
  424. package/lib/module/ai-components/message/index.js.map +1 -0
  425. package/lib/module/ai-components/message-composer/ActionButton.js +4 -2
  426. package/lib/module/ai-components/message-composer/ActionButton.js.map +1 -1
  427. package/lib/module/ai-components/message-composer/ActionSheet.js +22 -6
  428. package/lib/module/ai-components/message-composer/ActionSheet.js.map +1 -1
  429. package/lib/module/ai-components/message-composer/AttachmentButton.js +5 -1
  430. package/lib/module/ai-components/message-composer/AttachmentButton.js.map +1 -1
  431. package/lib/module/ai-components/message-composer/ChatOptions.js +147 -0
  432. package/lib/module/ai-components/message-composer/ChatOptions.js.map +1 -0
  433. package/lib/module/ai-components/message-composer/ComposerView.js +146 -20
  434. package/lib/module/ai-components/message-composer/ComposerView.js.map +1 -1
  435. package/lib/module/ai-components/message-composer/EditingMessageChip.js +81 -0
  436. package/lib/module/ai-components/message-composer/EditingMessageChip.js.map +1 -0
  437. package/lib/module/ai-components/message-composer/MediaPreviewList.js +26 -1
  438. package/lib/module/ai-components/message-composer/MediaPreviewList.js.map +1 -1
  439. package/lib/module/ai-components/message-composer/index.js +11 -0
  440. package/lib/module/ai-components/message-composer/index.js.map +1 -1
  441. package/lib/module/ai-components/message-parts/AIMessageParts.js +133 -0
  442. package/lib/module/ai-components/message-parts/AIMessageParts.js.map +1 -0
  443. package/lib/module/ai-components/message-parts/AIToolApproval.js +197 -0
  444. package/lib/module/ai-components/message-parts/AIToolApproval.js.map +1 -0
  445. package/lib/module/ai-components/message-parts/AIToolAuthorization.js +250 -0
  446. package/lib/module/ai-components/message-parts/AIToolAuthorization.js.map +1 -0
  447. package/lib/module/ai-components/message-parts/AIToolCall.js +159 -0
  448. package/lib/module/ai-components/message-parts/AIToolCall.js.map +1 -0
  449. package/lib/module/ai-components/message-parts/callStates.js +54 -0
  450. package/lib/module/ai-components/message-parts/callStates.js.map +1 -0
  451. package/lib/module/ai-components/message-parts/index.js +70 -0
  452. package/lib/module/ai-components/message-parts/index.js.map +1 -0
  453. package/lib/module/ai-components/message-parts/parseMessageParts.js +126 -0
  454. package/lib/module/ai-components/message-parts/parseMessageParts.js.map +1 -0
  455. package/lib/module/ai-components/message-parts/types.js +2 -0
  456. package/lib/module/ai-components/message-parts/types.js.map +1 -0
  457. package/lib/module/ai-components/native-specs/NativeAIAgent.js +7 -0
  458. package/lib/module/ai-components/native-specs/NativeAIAgent.js.map +1 -0
  459. package/lib/module/ai-components/reasoning/AIReasoning.js +401 -0
  460. package/lib/module/ai-components/reasoning/AIReasoning.js.map +1 -0
  461. package/lib/module/ai-components/reasoning/index.js +26 -0
  462. package/lib/module/ai-components/reasoning/index.js.map +1 -0
  463. package/lib/module/ai-components/reasoning/thinkingClock.js +63 -0
  464. package/lib/module/ai-components/reasoning/thinkingClock.js.map +1 -0
  465. package/lib/module/ai-components/services/clipboard-service/expo.js +7 -2
  466. package/lib/module/ai-components/services/clipboard-service/expo.js.map +1 -1
  467. package/lib/module/ai-components/store/composer/store.js.map +1 -1
  468. package/lib/module/ai-components/store/composer/useComposerChatOption.js +18 -0
  469. package/lib/module/ai-components/store/composer/useComposerChatOption.js.map +1 -0
  470. package/lib/module/ai-components/store/composer/useComposerIsEditing.js +18 -0
  471. package/lib/module/ai-components/store/composer/useComposerIsEditing.js.map +1 -0
  472. package/lib/module/ai-components/store/index.js +22 -0
  473. package/lib/module/ai-components/store/index.js.map +1 -1
  474. package/lib/module/ai-components/suggestions/AISuggestions.js +66 -0
  475. package/lib/module/ai-components/suggestions/AISuggestions.js.map +1 -0
  476. package/lib/module/ai-components/suggestions/index.js +15 -0
  477. package/lib/module/ai-components/suggestions/index.js.map +1 -0
  478. package/lib/module/ai-components/syntax-highlighting/utils/flatten-nodes.js +2 -1
  479. package/lib/module/ai-components/syntax-highlighting/utils/flatten-nodes.js.map +1 -1
  480. package/lib/module/ai-components/syntax-highlighting/utils/renderer.js +3 -2
  481. package/lib/module/ai-components/syntax-highlighting/utils/renderer.js.map +1 -1
  482. package/lib/module/ai-components/theme.js +137 -1
  483. package/lib/module/ai-components/theme.js.map +1 -1
  484. package/lib/module/ai-components/tool-calls/AIClientIdentity.js +22 -0
  485. package/lib/module/ai-components/tool-calls/AIClientIdentity.js.map +1 -0
  486. package/lib/module/ai-components/tool-calls/AIClientToolRunner.js +109 -0
  487. package/lib/module/ai-components/tool-calls/AIClientToolRunner.js.map +1 -0
  488. package/lib/module/ai-components/tool-calls/AIToolApprover.js +23 -0
  489. package/lib/module/ai-components/tool-calls/AIToolApprover.js.map +1 -0
  490. package/lib/module/ai-components/tool-calls/authSessionAuthorizer.js +88 -0
  491. package/lib/module/ai-components/tool-calls/authSessionAuthorizer.js.map +1 -0
  492. package/lib/module/ai-components/tool-calls/index.js +48 -0
  493. package/lib/module/ai-components/tool-calls/index.js.map +1 -0
  494. package/lib/module/ai-components/voice-visualization/glowShader.js.map +1 -1
  495. package/lib/module/components/Accessibility/useAccessibilityAnnouncer.js.map +1 -1
  496. package/lib/module/components/Message/MessageItemView/utils/renderText.js.map +1 -1
  497. package/lib/module/contexts/translationContext/TranslationContext.js +2 -2
  498. package/lib/module/contexts/translationContext/TranslationContext.js.map +1 -1
  499. package/lib/module/i18n/ar.json +40 -1
  500. package/lib/module/i18n/en.json +40 -1
  501. package/lib/module/i18n/es.json +40 -1
  502. package/lib/module/i18n/fr.json +40 -1
  503. package/lib/module/i18n/he.json +40 -1
  504. package/lib/module/i18n/hi.json +40 -1
  505. package/lib/module/i18n/it.json +40 -1
  506. package/lib/module/i18n/ja.json +40 -1
  507. package/lib/module/i18n/ko.json +40 -1
  508. package/lib/module/i18n/nl.json +40 -1
  509. package/lib/module/i18n/pt-br.json +40 -1
  510. package/lib/module/i18n/ru.json +40 -1
  511. package/lib/module/i18n/tr.json +40 -1
  512. package/lib/module/mock-builders/a2ui/ohrid.js +84 -0
  513. package/lib/module/mock-builders/a2ui/ohrid.js.map +1 -0
  514. package/lib/module/utils/i18n/Streami18n.js +9 -4
  515. package/lib/module/utils/i18n/Streami18n.js.map +1 -1
  516. package/lib/module/utils/i18n/utils.js +7 -0
  517. package/lib/module/utils/i18n/utils.js.map +1 -0
  518. package/lib/module/version.json +1 -1
  519. package/lib/typescript/a11y/a11yUtils.d.ts +0 -1
  520. package/lib/typescript/a11y/a11yUtils.d.ts.map +1 -1
  521. package/lib/typescript/a11y/hooks/useResolvedModalAccessibilityProps.d.ts +2 -3
  522. package/lib/typescript/a11y/hooks/useResolvedModalAccessibilityProps.d.ts.map +1 -1
  523. package/lib/typescript/a2ui/A2UIContexts.d.ts +9 -0
  524. package/lib/typescript/a2ui/A2UIContexts.d.ts.map +1 -0
  525. package/lib/typescript/a2ui/A2UIInstructions.d.ts +47 -0
  526. package/lib/typescript/a2ui/A2UIInstructions.d.ts.map +1 -0
  527. package/lib/typescript/a2ui/A2UIPlaceholder.d.ts +4 -0
  528. package/lib/typescript/a2ui/A2UIPlaceholder.d.ts.map +1 -0
  529. package/lib/typescript/a2ui/A2UIRenderer.d.ts +130 -0
  530. package/lib/typescript/a2ui/A2UIRenderer.d.ts.map +1 -0
  531. package/lib/typescript/a2ui/A2UIStream.d.ts +23 -0
  532. package/lib/typescript/a2ui/A2UIStream.d.ts.map +1 -0
  533. package/lib/typescript/a2ui/A2UISurface.d.ts +19 -0
  534. package/lib/typescript/a2ui/A2UISurface.d.ts.map +1 -0
  535. package/lib/typescript/a2ui/basicFunctions.d.ts +10 -0
  536. package/lib/typescript/a2ui/basicFunctions.d.ts.map +1 -0
  537. package/lib/typescript/a2ui/catalogDocument.d.ts +56 -0
  538. package/lib/typescript/a2ui/catalogDocument.d.ts.map +1 -0
  539. package/lib/typescript/a2ui/catalogs.d.ts +42 -0
  540. package/lib/typescript/a2ui/catalogs.d.ts.map +1 -0
  541. package/lib/typescript/a2ui/components/DateTimeInput.d.ts +44 -0
  542. package/lib/typescript/a2ui/components/DateTimeInput.d.ts.map +1 -0
  543. package/lib/typescript/a2ui/components/Media.d.ts +27 -0
  544. package/lib/typescript/a2ui/components/Media.d.ts.map +1 -0
  545. package/lib/typescript/a2ui/components/basicComponents.d.ts +4 -0
  546. package/lib/typescript/a2ui/components/basicComponents.d.ts.map +1 -0
  547. package/lib/typescript/a2ui/components/iconPaths.d.ts +2 -0
  548. package/lib/typescript/a2ui/components/iconPaths.d.ts.map +1 -0
  549. package/lib/typescript/a2ui/components/types.d.ts +23 -0
  550. package/lib/typescript/a2ui/components/types.d.ts.map +1 -0
  551. package/lib/typescript/a2ui/index.d.ts +8 -0
  552. package/lib/typescript/a2ui/index.d.ts.map +1 -0
  553. package/lib/typescript/a2ui/instructions.d.ts +39 -0
  554. package/lib/typescript/a2ui/instructions.d.ts.map +1 -0
  555. package/lib/typescript/a2ui/secrets.d.ts +20 -0
  556. package/lib/typescript/a2ui/secrets.d.ts.map +1 -0
  557. package/lib/typescript/a2ui/useReplyState.d.ts +4 -0
  558. package/lib/typescript/a2ui/useReplyState.d.ts.map +1 -0
  559. package/lib/typescript/ai-components/AITypingIndicatorView.d.ts.map +1 -1
  560. package/lib/typescript/ai-components/StreamingMessageView.d.ts +4 -1
  561. package/lib/typescript/ai-components/StreamingMessageView.d.ts.map +1 -1
  562. package/lib/typescript/ai-components/charts/components/PieLegend.d.ts.map +1 -1
  563. package/lib/typescript/ai-components/charts/components/VictoryChart.d.ts.map +1 -1
  564. package/lib/typescript/ai-components/charts/utils/format-time-label.d.ts +7 -0
  565. package/lib/typescript/ai-components/charts/utils/format-time-label.d.ts.map +1 -0
  566. package/lib/typescript/ai-components/charts/vega-lite/schema.d.ts +8 -8
  567. package/lib/typescript/ai-components/charts/vega-lite/schema.d.ts.map +1 -1
  568. package/lib/typescript/ai-components/contexts/composer-context.d.ts +3 -0
  569. package/lib/typescript/ai-components/contexts/composer-context.d.ts.map +1 -1
  570. package/lib/typescript/ai-components/contexts/index.d.ts +1 -0
  571. package/lib/typescript/ai-components/contexts/index.d.ts.map +1 -1
  572. package/lib/typescript/ai-components/contexts/theme-context.d.ts.map +1 -1
  573. package/lib/typescript/ai-components/contexts/translation-context.d.ts +19 -0
  574. package/lib/typescript/ai-components/contexts/translation-context.d.ts.map +1 -0
  575. package/lib/typescript/ai-components/conversation/AIConversation.d.ts +133 -0
  576. package/lib/typescript/ai-components/conversation/AIConversation.d.ts.map +1 -0
  577. package/lib/typescript/ai-components/conversation/entries.d.ts +47 -0
  578. package/lib/typescript/ai-components/conversation/entries.d.ts.map +1 -0
  579. package/lib/typescript/ai-components/conversation/index.d.ts +3 -0
  580. package/lib/typescript/ai-components/conversation/index.d.ts.map +1 -0
  581. package/lib/typescript/ai-components/conversation/list/AIChatList.d.ts +30 -0
  582. package/lib/typescript/ai-components/conversation/list/AIChatList.d.ts.map +1 -0
  583. package/lib/typescript/ai-components/conversation/list/useChatListController.d.ts +45 -0
  584. package/lib/typescript/ai-components/conversation/list/useChatListController.d.ts.map +1 -0
  585. package/lib/typescript/ai-components/conversation/list/useEndInView.d.ts +26 -0
  586. package/lib/typescript/ai-components/conversation/list/useEndInView.d.ts.map +1 -0
  587. package/lib/typescript/ai-components/conversation/list/useKeyboardOverlap.d.ts +17 -0
  588. package/lib/typescript/ai-components/conversation/list/useKeyboardOverlap.d.ts.map +1 -0
  589. package/lib/typescript/ai-components/conversation/list/useLoadOlder.d.ts +24 -0
  590. package/lib/typescript/ai-components/conversation/list/useLoadOlder.d.ts.map +1 -0
  591. package/lib/typescript/ai-components/conversation/list/usePinnedAnchor.d.ts +26 -0
  592. package/lib/typescript/ai-components/conversation/list/usePinnedAnchor.d.ts.map +1 -0
  593. package/lib/typescript/ai-components/conversation/useConversationRows.d.ts +66 -0
  594. package/lib/typescript/ai-components/conversation/useConversationRows.d.ts.map +1 -0
  595. package/lib/typescript/ai-components/conversation-state/controller/AIAgentError.d.ts +10 -0
  596. package/lib/typescript/ai-components/conversation-state/controller/AIAgentError.d.ts.map +1 -0
  597. package/lib/typescript/ai-components/conversation-state/controller/AIConversationController.d.ts +173 -0
  598. package/lib/typescript/ai-components/conversation-state/controller/AIConversationController.d.ts.map +1 -0
  599. package/lib/typescript/ai-components/conversation-state/controller/AIConversationExchange.d.ts +23 -0
  600. package/lib/typescript/ai-components/conversation-state/controller/AIConversationExchange.d.ts.map +1 -0
  601. package/lib/typescript/ai-components/conversation-state/controller/index.d.ts +5 -0
  602. package/lib/typescript/ai-components/conversation-state/controller/index.d.ts.map +1 -0
  603. package/lib/typescript/ai-components/conversation-state/controller/offers.d.ts +25 -0
  604. package/lib/typescript/ai-components/conversation-state/controller/offers.d.ts.map +1 -0
  605. package/lib/typescript/ai-components/conversation-state/controller/types.d.ts +142 -0
  606. package/lib/typescript/ai-components/conversation-state/controller/types.d.ts.map +1 -0
  607. package/lib/typescript/ai-components/conversation-state/controller/useAIConversationState.d.ts +9 -0
  608. package/lib/typescript/ai-components/conversation-state/controller/useAIConversationState.d.ts.map +1 -0
  609. package/lib/typescript/ai-components/conversation-state/fromStreamMessage.d.ts +25 -0
  610. package/lib/typescript/ai-components/conversation-state/fromStreamMessage.d.ts.map +1 -0
  611. package/lib/typescript/ai-components/conversation-state/index.d.ts +4 -0
  612. package/lib/typescript/ai-components/conversation-state/index.d.ts.map +1 -0
  613. package/lib/typescript/ai-components/conversation-state/types.d.ts +55 -0
  614. package/lib/typescript/ai-components/conversation-state/types.d.ts.map +1 -0
  615. package/lib/typescript/ai-components/generative-ui/AIUIAction.d.ts +48 -0
  616. package/lib/typescript/ai-components/generative-ui/AIUIAction.d.ts.map +1 -0
  617. package/lib/typescript/ai-components/generative-ui/AIUIArguments.d.ts +15 -0
  618. package/lib/typescript/ai-components/generative-ui/AIUIArguments.d.ts.map +1 -0
  619. package/lib/typescript/ai-components/generative-ui/AIUIComponent.d.ts +51 -0
  620. package/lib/typescript/ai-components/generative-ui/AIUIComponent.d.ts.map +1 -0
  621. package/lib/typescript/ai-components/generative-ui/AIUIComponentDefinition.d.ts +84 -0
  622. package/lib/typescript/ai-components/generative-ui/AIUIComponentDefinition.d.ts.map +1 -0
  623. package/lib/typescript/ai-components/generative-ui/AIUIDocument.d.ts +50 -0
  624. package/lib/typescript/ai-components/generative-ui/AIUIDocument.d.ts.map +1 -0
  625. package/lib/typescript/ai-components/generative-ui/AIUIEntrance.d.ts +76 -0
  626. package/lib/typescript/ai-components/generative-ui/AIUIEntrance.d.ts.map +1 -0
  627. package/lib/typescript/ai-components/generative-ui/AIUIErrorBoundary.d.ts +26 -0
  628. package/lib/typescript/ai-components/generative-ui/AIUIErrorBoundary.d.ts.map +1 -0
  629. package/lib/typescript/ai-components/generative-ui/AIUIHelpers.d.ts +23 -0
  630. package/lib/typescript/ai-components/generative-ui/AIUIHelpers.d.ts.map +1 -0
  631. package/lib/typescript/ai-components/generative-ui/AIUIHost.d.ts +160 -0
  632. package/lib/typescript/ai-components/generative-ui/AIUIHost.d.ts.map +1 -0
  633. package/lib/typescript/ai-components/generative-ui/AIUIMedia.d.ts +22 -0
  634. package/lib/typescript/ai-components/generative-ui/AIUIMedia.d.ts.map +1 -0
  635. package/lib/typescript/ai-components/generative-ui/AIUIRenderer.d.ts +53 -0
  636. package/lib/typescript/ai-components/generative-ui/AIUIRenderer.d.ts.map +1 -0
  637. package/lib/typescript/ai-components/generative-ui/AIUIView.d.ts +35 -0
  638. package/lib/typescript/ai-components/generative-ui/AIUIView.d.ts.map +1 -0
  639. package/lib/typescript/ai-components/generative-ui/index.d.ts +11 -0
  640. package/lib/typescript/ai-components/generative-ui/index.d.ts.map +1 -0
  641. package/lib/typescript/ai-components/icons.d.ts +66 -0
  642. package/lib/typescript/ai-components/icons.d.ts.map +1 -0
  643. package/lib/typescript/ai-components/index.d.ts +8 -0
  644. package/lib/typescript/ai-components/index.d.ts.map +1 -1
  645. package/lib/typescript/ai-components/internal/Shimmer.d.ts +14 -0
  646. package/lib/typescript/ai-components/internal/Shimmer.d.ts.map +1 -0
  647. package/lib/typescript/ai-components/internal/format.d.ts +7 -0
  648. package/lib/typescript/ai-components/internal/format.d.ts.map +1 -0
  649. package/lib/typescript/ai-components/internal/hooks/useBottomSafeArea.d.ts +3 -0
  650. package/lib/typescript/ai-components/internal/hooks/useBottomSafeArea.d.ts.map +1 -0
  651. package/lib/typescript/ai-components/internal/icons/AgentIcons.d.ts +31 -0
  652. package/lib/typescript/ai-components/internal/icons/AgentIcons.d.ts.map +1 -0
  653. package/lib/typescript/ai-components/internal/keyboard.d.ts +9 -0
  654. package/lib/typescript/ai-components/internal/keyboard.d.ts.map +1 -0
  655. package/lib/typescript/ai-components/internal/tokens.d.ts +2 -0
  656. package/lib/typescript/ai-components/internal/tokens.d.ts.map +1 -0
  657. package/lib/typescript/ai-components/internal/uuid.d.ts +2 -0
  658. package/lib/typescript/ai-components/internal/uuid.d.ts.map +1 -0
  659. package/lib/typescript/ai-components/markdown/components/CodeBlock.d.ts.map +1 -1
  660. package/lib/typescript/ai-components/markdown/components/InlineCode.d.ts.map +1 -1
  661. package/lib/typescript/ai-components/markdown/components/Text.d.ts.map +1 -1
  662. package/lib/typescript/ai-components/markdown/styles.d.ts +23 -4
  663. package/lib/typescript/ai-components/markdown/styles.d.ts.map +1 -1
  664. package/lib/typescript/ai-components/markdown/types.d.ts +1 -0
  665. package/lib/typescript/ai-components/markdown/types.d.ts.map +1 -1
  666. package/lib/typescript/ai-components/message/AIAssistantMessage.d.ts +40 -0
  667. package/lib/typescript/ai-components/message/AIAssistantMessage.d.ts.map +1 -0
  668. package/lib/typescript/ai-components/message/AIMessageAttachment.d.ts +33 -0
  669. package/lib/typescript/ai-components/message/AIMessageAttachment.d.ts.map +1 -0
  670. package/lib/typescript/ai-components/message/AIReplyActions.d.ts +19 -0
  671. package/lib/typescript/ai-components/message/AIReplyActions.d.ts.map +1 -0
  672. package/lib/typescript/ai-components/message/AIUserMessage.d.ts +17 -0
  673. package/lib/typescript/ai-components/message/AIUserMessage.d.ts.map +1 -0
  674. package/lib/typescript/ai-components/message/UserMessageMenu.d.ts +31 -0
  675. package/lib/typescript/ai-components/message/UserMessageMenu.d.ts.map +1 -0
  676. package/lib/typescript/ai-components/message/index.d.ts +5 -0
  677. package/lib/typescript/ai-components/message/index.d.ts.map +1 -0
  678. package/lib/typescript/ai-components/message-composer/ActionButton.d.ts +1 -1
  679. package/lib/typescript/ai-components/message-composer/ActionButton.d.ts.map +1 -1
  680. package/lib/typescript/ai-components/message-composer/ActionSheet.d.ts +2 -2
  681. package/lib/typescript/ai-components/message-composer/ActionSheet.d.ts.map +1 -1
  682. package/lib/typescript/ai-components/message-composer/AttachmentButton.d.ts.map +1 -1
  683. package/lib/typescript/ai-components/message-composer/ChatOptions.d.ts +35 -0
  684. package/lib/typescript/ai-components/message-composer/ChatOptions.d.ts.map +1 -0
  685. package/lib/typescript/ai-components/message-composer/ComposerView.d.ts +39 -3
  686. package/lib/typescript/ai-components/message-composer/ComposerView.d.ts.map +1 -1
  687. package/lib/typescript/ai-components/message-composer/EditingMessageChip.d.ts +7 -0
  688. package/lib/typescript/ai-components/message-composer/EditingMessageChip.d.ts.map +1 -0
  689. package/lib/typescript/ai-components/message-composer/MediaPreviewList.d.ts.map +1 -1
  690. package/lib/typescript/ai-components/message-composer/index.d.ts +1 -0
  691. package/lib/typescript/ai-components/message-composer/index.d.ts.map +1 -1
  692. package/lib/typescript/ai-components/message-parts/AIMessageParts.d.ts +40 -0
  693. package/lib/typescript/ai-components/message-parts/AIMessageParts.d.ts.map +1 -0
  694. package/lib/typescript/ai-components/message-parts/AIToolApproval.d.ts +38 -0
  695. package/lib/typescript/ai-components/message-parts/AIToolApproval.d.ts.map +1 -0
  696. package/lib/typescript/ai-components/message-parts/AIToolAuthorization.d.ts +48 -0
  697. package/lib/typescript/ai-components/message-parts/AIToolAuthorization.d.ts.map +1 -0
  698. package/lib/typescript/ai-components/message-parts/AIToolCall.d.ts +11 -0
  699. package/lib/typescript/ai-components/message-parts/AIToolCall.d.ts.map +1 -0
  700. package/lib/typescript/ai-components/message-parts/callStates.d.ts +9 -0
  701. package/lib/typescript/ai-components/message-parts/callStates.d.ts.map +1 -0
  702. package/lib/typescript/ai-components/message-parts/index.d.ts +7 -0
  703. package/lib/typescript/ai-components/message-parts/index.d.ts.map +1 -0
  704. package/lib/typescript/ai-components/message-parts/parseMessageParts.d.ts +47 -0
  705. package/lib/typescript/ai-components/message-parts/parseMessageParts.d.ts.map +1 -0
  706. package/lib/typescript/ai-components/message-parts/types.d.ts +137 -0
  707. package/lib/typescript/ai-components/message-parts/types.d.ts.map +1 -0
  708. package/lib/typescript/ai-components/native-specs/NativeAIAgent.d.ts +22 -0
  709. package/lib/typescript/ai-components/native-specs/NativeAIAgent.d.ts.map +1 -0
  710. package/lib/typescript/ai-components/reasoning/AIReasoning.d.ts +63 -0
  711. package/lib/typescript/ai-components/reasoning/AIReasoning.d.ts.map +1 -0
  712. package/lib/typescript/ai-components/reasoning/index.d.ts +3 -0
  713. package/lib/typescript/ai-components/reasoning/index.d.ts.map +1 -0
  714. package/lib/typescript/ai-components/reasoning/thinkingClock.d.ts +29 -0
  715. package/lib/typescript/ai-components/reasoning/thinkingClock.d.ts.map +1 -0
  716. package/lib/typescript/ai-components/services/clipboard-service/expo.d.ts.map +1 -1
  717. package/lib/typescript/ai-components/store/composer/store.d.ts +8 -0
  718. package/lib/typescript/ai-components/store/composer/store.d.ts.map +1 -1
  719. package/lib/typescript/ai-components/store/composer/useComposerChatOption.d.ts +5 -0
  720. package/lib/typescript/ai-components/store/composer/useComposerChatOption.d.ts.map +1 -0
  721. package/lib/typescript/ai-components/store/composer/useComposerIsEditing.d.ts +5 -0
  722. package/lib/typescript/ai-components/store/composer/useComposerIsEditing.d.ts.map +1 -0
  723. package/lib/typescript/ai-components/store/index.d.ts +2 -0
  724. package/lib/typescript/ai-components/store/index.d.ts.map +1 -1
  725. package/lib/typescript/ai-components/suggestions/AISuggestions.d.ts +13 -0
  726. package/lib/typescript/ai-components/suggestions/AISuggestions.d.ts.map +1 -0
  727. package/lib/typescript/ai-components/suggestions/index.d.ts +2 -0
  728. package/lib/typescript/ai-components/suggestions/index.d.ts.map +1 -0
  729. package/lib/typescript/ai-components/syntax-highlighting/utils/flatten-nodes.d.ts.map +1 -1
  730. package/lib/typescript/ai-components/syntax-highlighting/utils/renderer.d.ts +1 -1
  731. package/lib/typescript/ai-components/syntax-highlighting/utils/renderer.d.ts.map +1 -1
  732. package/lib/typescript/ai-components/theme.d.ts +200 -0
  733. package/lib/typescript/ai-components/theme.d.ts.map +1 -1
  734. package/lib/typescript/ai-components/tool-calls/AIClientIdentity.d.ts +14 -0
  735. package/lib/typescript/ai-components/tool-calls/AIClientIdentity.d.ts.map +1 -0
  736. package/lib/typescript/ai-components/tool-calls/AIClientToolRunner.d.ts +109 -0
  737. package/lib/typescript/ai-components/tool-calls/AIClientToolRunner.d.ts.map +1 -0
  738. package/lib/typescript/ai-components/tool-calls/AIToolApprover.d.ts +48 -0
  739. package/lib/typescript/ai-components/tool-calls/AIToolApprover.d.ts.map +1 -0
  740. package/lib/typescript/ai-components/tool-calls/authSessionAuthorizer.d.ts +57 -0
  741. package/lib/typescript/ai-components/tool-calls/authSessionAuthorizer.d.ts.map +1 -0
  742. package/lib/typescript/ai-components/tool-calls/index.d.ts +5 -0
  743. package/lib/typescript/ai-components/tool-calls/index.d.ts.map +1 -0
  744. package/lib/typescript/ai-components/voice-visualization/glowShader.d.ts.map +1 -1
  745. package/lib/typescript/ai-components/voice-visualization/simplex.d.ts +1 -1
  746. package/lib/typescript/components/Accessibility/NotificationAnnouncer.d.ts +5 -5
  747. package/lib/typescript/components/Accessibility/hooks/useIncomingMessageAnnouncements.d.ts +1 -1
  748. package/lib/typescript/components/Accessibility/useAccessibilityAnnouncer.d.ts +0 -2
  749. package/lib/typescript/components/Accessibility/useAccessibilityAnnouncer.d.ts.map +1 -1
  750. package/lib/typescript/components/Message/MessageItemView/utils/renderText.d.ts.map +1 -1
  751. package/lib/typescript/contexts/translationContext/TranslationContext.d.ts +1 -1
  752. package/lib/typescript/contexts/translationContext/TranslationContext.d.ts.map +1 -1
  753. package/lib/typescript/i18n/ar.json +40 -1
  754. package/lib/typescript/i18n/en.json +40 -1
  755. package/lib/typescript/i18n/es.json +40 -1
  756. package/lib/typescript/i18n/fr.json +40 -1
  757. package/lib/typescript/i18n/he.json +40 -1
  758. package/lib/typescript/i18n/hi.json +40 -1
  759. package/lib/typescript/i18n/it.json +40 -1
  760. package/lib/typescript/i18n/ja.json +40 -1
  761. package/lib/typescript/i18n/ko.json +40 -1
  762. package/lib/typescript/i18n/nl.json +40 -1
  763. package/lib/typescript/i18n/pt-br.json +40 -1
  764. package/lib/typescript/i18n/ru.json +40 -1
  765. package/lib/typescript/i18n/tr.json +40 -1
  766. package/lib/typescript/utils/i18n/Streami18n.d.ts +41 -2
  767. package/lib/typescript/utils/i18n/Streami18n.d.ts.map +1 -1
  768. package/lib/typescript/utils/i18n/utils.d.ts +3 -0
  769. package/lib/typescript/utils/i18n/utils.d.ts.map +1 -0
  770. package/package.json +10 -2
  771. package/src/a11y/a11yUtils.ts +0 -1
  772. package/src/a11y/hooks/useResolvedModalAccessibilityProps.ts +2 -3
  773. package/src/a2ui/A2UIContexts.ts +15 -0
  774. package/src/a2ui/A2UIInstructions.ts +102 -0
  775. package/src/a2ui/A2UIPlaceholder.tsx +24 -0
  776. package/src/a2ui/A2UIRenderer.tsx +504 -0
  777. package/src/a2ui/A2UIStream.ts +105 -0
  778. package/src/a2ui/A2UISurface.tsx +270 -0
  779. package/src/a2ui/__tests__/A2UIInstructions.test.ts +233 -0
  780. package/src/a2ui/__tests__/A2UIRenderer.test.tsx +1559 -0
  781. package/src/a2ui/__tests__/conformance.test.ts +579 -0
  782. package/src/a2ui/basicCatalog.json +1206 -0
  783. package/src/a2ui/basicFunctions.ts +429 -0
  784. package/src/a2ui/catalogDocument.ts +119 -0
  785. package/src/a2ui/catalogs.ts +185 -0
  786. package/src/a2ui/components/DateTimeInput.tsx +381 -0
  787. package/src/a2ui/components/Media.tsx +278 -0
  788. package/src/a2ui/components/basicComponents.tsx +832 -0
  789. package/src/a2ui/components/iconPaths.ts +116 -0
  790. package/src/a2ui/components/types.ts +24 -0
  791. package/src/a2ui/index.ts +18 -0
  792. package/src/a2ui/instructions.ts +341 -0
  793. package/src/a2ui/secrets.ts +154 -0
  794. package/src/a2ui/useReplyState.ts +26 -0
  795. package/src/ai-components/AITypingIndicatorView.tsx +6 -22
  796. package/src/ai-components/README.md +64 -3
  797. package/src/ai-components/StreamingMessageView.tsx +27 -3
  798. package/src/ai-components/__tests__/ComposerView.test.tsx +247 -2
  799. package/src/ai-components/__tests__/Markdown.test.tsx +13 -0
  800. package/src/ai-components/__tests__/StreamingMessageView.test.tsx +69 -0
  801. package/src/ai-components/__tests__/charts.test.ts +75 -0
  802. package/src/ai-components/__tests__/clientToolRunner.test.ts +239 -0
  803. package/src/ai-components/__tests__/conversation.test.tsx +787 -0
  804. package/src/ai-components/__tests__/conversationController.test.ts +1561 -0
  805. package/src/ai-components/__tests__/conversationExchange.test.ts +187 -0
  806. package/src/ai-components/__tests__/conversationRows.test.ts +207 -0
  807. package/src/ai-components/__tests__/conversationUI.test.tsx +606 -0
  808. package/src/ai-components/__tests__/format.test.ts +32 -0
  809. package/src/ai-components/__tests__/generativeUI.test.ts +634 -0
  810. package/src/ai-components/__tests__/keyboard.test.ts +14 -0
  811. package/src/ai-components/__tests__/messagePartViews.test.tsx +385 -0
  812. package/src/ai-components/__tests__/messageParts.test.ts +336 -0
  813. package/src/ai-components/__tests__/messageViews.test.tsx +321 -0
  814. package/src/ai-components/__tests__/signIn.test.tsx +324 -0
  815. package/src/ai-components/__tests__/theme.test.tsx +18 -0
  816. package/src/ai-components/__tests__/translation.test.tsx +85 -0
  817. package/src/ai-components/__tests__/voiceDriver.test.ts +0 -3
  818. package/src/ai-components/__tests__/voicePalette.test.ts +1 -1
  819. package/src/ai-components/__tests__/withoutKeyboardController.test.tsx +60 -0
  820. package/src/ai-components/charts/components/PieLegend.tsx +2 -1
  821. package/src/ai-components/charts/components/VictoryChart.tsx +10 -2
  822. package/src/ai-components/charts/utils/format-time-label.ts +18 -0
  823. package/src/ai-components/charts/vega-lite/schema.ts +19 -2
  824. package/src/ai-components/contexts/composer-context.tsx +13 -5
  825. package/src/ai-components/contexts/index.ts +1 -0
  826. package/src/ai-components/contexts/theme-context.tsx +19 -4
  827. package/src/ai-components/contexts/translation-context.tsx +44 -0
  828. package/src/ai-components/conversation/AIConversation.tsx +612 -0
  829. package/src/ai-components/conversation/entries.ts +177 -0
  830. package/src/ai-components/conversation/index.ts +2 -0
  831. package/src/ai-components/conversation/list/AIChatList.tsx +227 -0
  832. package/src/ai-components/conversation/list/useChatListController.ts +91 -0
  833. package/src/ai-components/conversation/list/useEndInView.ts +61 -0
  834. package/src/ai-components/conversation/list/useKeyboardOverlap.ts +52 -0
  835. package/src/ai-components/conversation/list/useLoadOlder.ts +97 -0
  836. package/src/ai-components/conversation/list/usePinnedAnchor.ts +113 -0
  837. package/src/ai-components/conversation/useConversationRows.ts +231 -0
  838. package/src/ai-components/conversation-state/controller/AIAgentError.ts +14 -0
  839. package/src/ai-components/conversation-state/controller/AIConversationController.ts +628 -0
  840. package/src/ai-components/conversation-state/controller/AIConversationExchange.ts +132 -0
  841. package/src/ai-components/conversation-state/controller/index.ts +4 -0
  842. package/src/ai-components/conversation-state/controller/offers.ts +53 -0
  843. package/src/ai-components/conversation-state/controller/types.ts +154 -0
  844. package/src/ai-components/conversation-state/controller/useAIConversationState.ts +21 -0
  845. package/src/ai-components/conversation-state/fromStreamMessage.ts +89 -0
  846. package/src/ai-components/conversation-state/index.ts +3 -0
  847. package/src/ai-components/conversation-state/types.ts +57 -0
  848. package/src/ai-components/generative-ui/AIUIAction.ts +73 -0
  849. package/src/ai-components/generative-ui/AIUIArguments.ts +117 -0
  850. package/src/ai-components/generative-ui/AIUIComponent.tsx +106 -0
  851. package/src/ai-components/generative-ui/AIUIComponentDefinition.ts +163 -0
  852. package/src/ai-components/generative-ui/AIUIDocument.ts +77 -0
  853. package/src/ai-components/generative-ui/AIUIEntrance.tsx +229 -0
  854. package/src/ai-components/generative-ui/AIUIErrorBoundary.tsx +39 -0
  855. package/src/ai-components/generative-ui/AIUIHelpers.ts +86 -0
  856. package/src/ai-components/generative-ui/AIUIHost.ts +358 -0
  857. package/src/ai-components/generative-ui/AIUIMedia.ts +45 -0
  858. package/src/ai-components/generative-ui/AIUIRenderer.ts +60 -0
  859. package/src/ai-components/generative-ui/AIUIView.tsx +87 -0
  860. package/src/ai-components/generative-ui/index.ts +48 -0
  861. package/src/ai-components/icons.ts +101 -0
  862. package/src/ai-components/index.ts +10 -0
  863. package/src/ai-components/internal/Shimmer.tsx +40 -0
  864. package/src/ai-components/internal/format.ts +69 -0
  865. package/src/ai-components/internal/hooks/useBottomSafeArea.ts +6 -0
  866. package/src/ai-components/internal/icons/AgentIcons.tsx +138 -0
  867. package/src/ai-components/internal/keyboard.tsx +34 -0
  868. package/src/ai-components/internal/tokens.ts +4 -0
  869. package/src/ai-components/internal/uuid.ts +17 -0
  870. package/src/ai-components/markdown/components/CodeBlock.tsx +13 -2
  871. package/src/ai-components/markdown/components/InlineCode.tsx +1 -0
  872. package/src/ai-components/markdown/components/Text.tsx +7 -2
  873. package/src/ai-components/markdown/styles.ts +29 -27
  874. package/src/ai-components/markdown/types.ts +1 -0
  875. package/src/ai-components/message/AIAssistantMessage.tsx +100 -0
  876. package/src/ai-components/message/AIMessageAttachment.tsx +245 -0
  877. package/src/ai-components/message/AIReplyActions.tsx +139 -0
  878. package/src/ai-components/message/AIUserMessage.tsx +121 -0
  879. package/src/ai-components/message/UserMessageMenu.tsx +149 -0
  880. package/src/ai-components/message/index.ts +4 -0
  881. package/src/ai-components/message-composer/ActionButton.tsx +10 -5
  882. package/src/ai-components/message-composer/ActionSheet.tsx +28 -6
  883. package/src/ai-components/message-composer/AttachmentButton.tsx +9 -1
  884. package/src/ai-components/message-composer/ChatOptions.tsx +144 -0
  885. package/src/ai-components/message-composer/ComposerView.tsx +194 -30
  886. package/src/ai-components/message-composer/EditingMessageChip.tsx +62 -0
  887. package/src/ai-components/message-composer/MediaPreviewList.tsx +34 -8
  888. package/src/ai-components/message-composer/index.ts +1 -0
  889. package/src/ai-components/message-parts/AIMessageParts.tsx +145 -0
  890. package/src/ai-components/message-parts/AIToolApproval.tsx +196 -0
  891. package/src/ai-components/message-parts/AIToolAuthorization.tsx +279 -0
  892. package/src/ai-components/message-parts/AIToolCall.tsx +117 -0
  893. package/src/ai-components/message-parts/callStates.ts +44 -0
  894. package/src/ai-components/message-parts/index.ts +6 -0
  895. package/src/ai-components/message-parts/parseMessageParts.ts +195 -0
  896. package/src/ai-components/message-parts/types.ts +157 -0
  897. package/src/ai-components/native-specs/NativeAIAgent.ts +25 -0
  898. package/src/ai-components/reasoning/AIReasoning.tsx +509 -0
  899. package/src/ai-components/reasoning/index.ts +2 -0
  900. package/src/ai-components/reasoning/thinkingClock.ts +109 -0
  901. package/src/ai-components/services/clipboard-service/expo.ts +18 -4
  902. package/src/ai-components/store/composer/store.ts +9 -0
  903. package/src/ai-components/store/composer/useComposerChatOption.ts +15 -0
  904. package/src/ai-components/store/composer/useComposerIsEditing.ts +15 -0
  905. package/src/ai-components/store/index.ts +2 -0
  906. package/src/ai-components/suggestions/AISuggestions.tsx +73 -0
  907. package/src/ai-components/suggestions/index.ts +1 -0
  908. package/src/ai-components/syntax-highlighting/utils/flatten-nodes.ts +2 -1
  909. package/src/ai-components/syntax-highlighting/utils/renderer.tsx +4 -2
  910. package/src/ai-components/theme.ts +334 -0
  911. package/src/ai-components/tool-calls/AIClientIdentity.ts +33 -0
  912. package/src/ai-components/tool-calls/AIClientToolRunner.ts +200 -0
  913. package/src/ai-components/tool-calls/AIToolApprover.tsx +60 -0
  914. package/src/ai-components/tool-calls/authSessionAuthorizer.ts +137 -0
  915. package/src/ai-components/tool-calls/index.ts +4 -0
  916. package/src/ai-components/voice-visualization/glowShader.ts +1 -3
  917. package/src/ai-components/voice-visualization/simplex.ts +1 -1
  918. package/src/components/Accessibility/NotificationAnnouncer.tsx +5 -5
  919. package/src/components/Accessibility/hooks/useIncomingMessageAnnouncements.ts +1 -1
  920. package/src/components/Accessibility/useAccessibilityAnnouncer.ts +0 -2
  921. package/src/components/Message/MessageItemView/utils/renderText.tsx +1 -2
  922. package/src/contexts/translationContext/TranslationContext.tsx +2 -2
  923. package/src/i18n/ar.json +40 -1
  924. package/src/i18n/en.json +40 -1
  925. package/src/i18n/es.json +40 -1
  926. package/src/i18n/fr.json +40 -1
  927. package/src/i18n/he.json +40 -1
  928. package/src/i18n/hi.json +40 -1
  929. package/src/i18n/it.json +40 -1
  930. package/src/i18n/ja.json +40 -1
  931. package/src/i18n/ko.json +40 -1
  932. package/src/i18n/nl.json +40 -1
  933. package/src/i18n/pt-br.json +40 -1
  934. package/src/i18n/ru.json +40 -1
  935. package/src/i18n/tr.json +40 -1
  936. package/src/mock-builders/a2ui/ohrid.ts +106 -0
  937. package/src/utils/i18n/Streami18n.ts +4 -1
  938. package/src/utils/i18n/utils.ts +3 -0
  939. package/src/version.json +1 -1
@@ -0,0 +1,606 @@
1
+ import React, { type ReactElement } from 'react';
2
+ import { Pressable, StyleSheet, Text, View } from 'react-native';
3
+
4
+ import { act, fireEvent, render, screen } from '@testing-library/react-native';
5
+
6
+ import { AIConversation } from '../conversation';
7
+ import {
8
+ AIConversationController,
9
+ type AIMessage,
10
+ AIUIComponentView,
11
+ AIUIHost,
12
+ type AIUIRenderer,
13
+ AIUIView,
14
+ defineAIUIComponent,
15
+ fromStreamMessage,
16
+ parseAIUIComponentDefinition,
17
+ StreamTheme,
18
+ } from '../index';
19
+ import { forgetCallStates } from '../message-parts/callStates';
20
+
21
+ // Each test's questions start unanswered, though tests reuse calls.
22
+ afterEach(forgetCallStates);
23
+
24
+ jest.mock('../services/clipboard-service', () => ({ setClipboardString: jest.fn() }));
25
+
26
+ const user = (id: string, text: string): AIMessage => ({ id, role: 'user', text });
27
+ const reply = (
28
+ id: string,
29
+ text: string,
30
+ ui?: Record<string, unknown>,
31
+ extra: Record<string, unknown> = {},
32
+ ): AIMessage =>
33
+ fromStreamMessage({
34
+ ai_generated: true,
35
+ ai_ui: ui,
36
+ attachments: [],
37
+ id,
38
+ text,
39
+ ...extra,
40
+ });
41
+
42
+ // Shows a document's text as a card, or nothing for the content `nothing`.
43
+ const cardRenderer: AIUIRenderer = {
44
+ createEngine: () => ({
45
+ view: (document) =>
46
+ document.content === 'nothing' ? null : <Text testID='card'>{String(document.content)}</Text>,
47
+ }),
48
+ format: 'a2ui',
49
+ supports: (version) => version === undefined || version === '1.0',
50
+ };
51
+
52
+ const makeHost = () => new AIUIHost({ renderers: [cardRenderer], send: jest.fn() });
53
+
54
+ const layoutOf = (height: number) => ({
55
+ nativeEvent: { layout: { height, width: 400, x: 0, y: 0 } },
56
+ });
57
+
58
+ const settle = () => act(() => new Promise<void>((resolve) => setTimeout(resolve, 20)));
59
+
60
+ // The list renders its rows once it knows its size, and each one once it is measured.
61
+ const layOut = async () => {
62
+ const list = screen.queryByTestId('ai-conversation-list');
63
+ if (!list) return;
64
+ act(() => {
65
+ fireEvent(list, 'layout', layoutOf(800));
66
+ });
67
+ for (let pass = 0; pass < 10; pass++) {
68
+ const measured = screen.UNSAFE_root.findAll(
69
+ (node) => typeof node.type === 'string' && !!node.props.onLayout && node !== list,
70
+ );
71
+ act(() => {
72
+ for (const node of measured) node.props.onLayout(layoutOf(60));
73
+ });
74
+ await settle();
75
+ const waiting = screen.UNSAFE_root.findAll(
76
+ (node) => typeof node.type === 'string' && node.props.pointerEvents === 'none',
77
+ );
78
+ if (waiting.length === 0) return;
79
+ }
80
+ };
81
+
82
+ const renderConversation = async (ui: ReactElement) => {
83
+ const result = render(<StreamTheme>{ui}</StreamTheme>);
84
+ await layOut();
85
+ return {
86
+ ...result,
87
+ rerender: async (next: ReactElement) => {
88
+ result.rerender(<StreamTheme>{next}</StreamTheme>);
89
+ await layOut();
90
+ },
91
+ };
92
+ };
93
+
94
+ // The opacity of the generated UI's stage around `text`.
95
+ const stageOpacityOf = (text: string) => {
96
+ let node = screen.getByText(text).parent;
97
+ while (node) {
98
+ const style = StyleSheet.flatten(node.props.style);
99
+ if (style && style.transformOrigin === 'top') return style.opacity ?? 1;
100
+ node = node.parent;
101
+ }
102
+ return undefined;
103
+ };
104
+
105
+ describe('AIConversation with generated UI', () => {
106
+ it('shows a reply’s UI in place of its text', async () => {
107
+ await renderConversation(
108
+ <AIConversation
109
+ messages={[
110
+ user('u1', 'Plan a weekend in Ohrid'),
111
+ reply('a1', "Here's a weekend in Ohrid.", { content: 'Ohrid plan', format: 'a2ui' }),
112
+ ]}
113
+ ui={makeHost()}
114
+ />,
115
+ );
116
+ expect(screen.getByTestId('card')).toHaveTextContent('Ohrid plan');
117
+ expect(screen.queryByText("Here's a weekend in Ohrid.")).toBeNull();
118
+ });
119
+
120
+ it('shows the text of a reply whose UI no renderer shows', async () => {
121
+ await renderConversation(
122
+ <AIConversation
123
+ messages={[
124
+ user('u1', 'Plan'),
125
+ reply('a1', 'In OpenUI', { content: 'root = Card()', format: 'openui' }),
126
+ user('u2', 'Again'),
127
+ reply('a2', 'A newer A2UI', { content: 'x', format: 'a2ui', version: '2.0' }),
128
+ user('u3', 'Once more'),
129
+ reply('a3', 'A newer field', { content: 'x', format: 'a2ui', v: 2 }),
130
+ user('u4', 'And'),
131
+ reply('a4', 'Shows nothing of its own', { content: 'nothing', format: 'a2ui' }),
132
+ ]}
133
+ ui={makeHost()}
134
+ />,
135
+ );
136
+ for (const text of ['In OpenUI', 'A newer A2UI', 'A newer field', 'Shows nothing of its own']) {
137
+ expect(screen.getByText(text)).toBeTruthy();
138
+ }
139
+ expect(screen.queryByTestId('card')).toBeNull();
140
+ });
141
+
142
+ it('shows the text without a host', async () => {
143
+ await renderConversation(
144
+ <AIConversation
145
+ messages={[
146
+ user('u1', 'Plan'),
147
+ reply('a1', 'The words', { content: 'Ohrid plan', format: 'a2ui' }),
148
+ ]}
149
+ />,
150
+ );
151
+ expect(screen.getByText('The words')).toBeTruthy();
152
+ });
153
+
154
+ it('stops thinking once a reply has UI to show, and keeps thinking while it has none', async () => {
155
+ const ui = makeHost();
156
+ const question = user('u1', 'Plan');
157
+ const { rerender } = await renderConversation(
158
+ <AIConversation
159
+ messages={[
160
+ question,
161
+ reply(
162
+ 'a1',
163
+ '',
164
+ { content: 'x', format: 'openui', status: 'streaming' },
165
+ { generating: true },
166
+ ),
167
+ ]}
168
+ ui={ui}
169
+ />,
170
+ );
171
+ expect(screen.getByRole('button', { name: 'Thinking...' })).toBeTruthy();
172
+
173
+ await rerender(
174
+ <AIConversation
175
+ messages={[
176
+ question,
177
+ reply(
178
+ 'a1',
179
+ '',
180
+ { content: 'Ohrid', format: 'a2ui', status: 'streaming' },
181
+ { generating: true },
182
+ ),
183
+ ]}
184
+ ui={ui}
185
+ />,
186
+ );
187
+ expect(screen.queryByRole('button', { name: 'Thinking...' })).toBeNull();
188
+ expect(screen.getByTestId('card')).toHaveTextContent('Ohrid');
189
+ });
190
+
191
+ it('has the reply’s actions under a finished UI-only reply, not while its UI is written', async () => {
192
+ const ui = makeHost();
193
+ const question = user('u1', 'Plan');
194
+ const { rerender } = await renderConversation(
195
+ <AIConversation
196
+ messages={[
197
+ question,
198
+ reply('a1', '', { content: 'Ohrid', format: 'a2ui', status: 'streaming' }),
199
+ ]}
200
+ ui={ui}
201
+ />,
202
+ );
203
+ expect(screen.queryByRole('button', { name: /copy/i })).toBeNull();
204
+
205
+ await rerender(
206
+ <AIConversation
207
+ messages={[
208
+ question,
209
+ reply('a1', '', { content: 'Ohrid', format: 'a2ui', status: 'complete' }),
210
+ ]}
211
+ ui={ui}
212
+ />,
213
+ );
214
+ expect(screen.getByRole('button', { name: /copy/i })).toBeTruthy();
215
+ });
216
+
217
+ it('keeps the UI views of rows it reuses for other replies', async () => {
218
+ const ui = makeHost();
219
+ const history = Array.from({ length: 40 }, (_, turn) => [
220
+ user(`u${turn}`, `Question ${turn}`),
221
+ reply(`a${turn}`, '', { content: `Card ${turn}`, format: 'a2ui' }),
222
+ ]).flat();
223
+ await renderConversation(
224
+ <AIConversation
225
+ messages={[...history, user('ul', 'Latest'), reply('al', 'Latest.')]}
226
+ ui={ui}
227
+ />,
228
+ );
229
+ const cards = screen.getAllByTestId('card');
230
+ expect(screen.queryByText('Card 0')).toBeNull();
231
+
232
+ // Scrolled to the start, the rows at the end show the oldest replies.
233
+ act(() => {
234
+ fireEvent.scroll(screen.getByTestId('ai-conversation-list'), {
235
+ nativeEvent: {
236
+ contentInset: { bottom: 0, left: 0, right: 0, top: 0 },
237
+ contentOffset: { x: 0, y: 0 },
238
+ contentSize: { height: 5000, width: 400 },
239
+ layoutMeasurement: { height: 800, width: 400 },
240
+ },
241
+ });
242
+ });
243
+ await layOut();
244
+ expect(screen.getByText('Card 0')).toBeTruthy();
245
+ expect(screen.queryByText('Card 39')).toBeNull();
246
+ const shown = screen.getAllByTestId('card');
247
+ expect(cards.filter((card) => !shown.includes(card))).toEqual([]);
248
+ }, 30000);
249
+
250
+ // The Reanimated mock doesn't run an animation, so only where each one starts shows.
251
+ it('shows a UI from history at once, and brings one being written in', async () => {
252
+ await renderConversation(
253
+ <AIConversation
254
+ messages={[
255
+ user('u1', 'Earlier'),
256
+ reply('a1', '', { content: 'From history', format: 'a2ui' }),
257
+ user('u2', 'Plan'),
258
+ reply('a2', '', { content: 'Being written', format: 'a2ui', status: 'streaming' }),
259
+ ]}
260
+ ui={makeHost()}
261
+ />,
262
+ );
263
+ expect(stageOpacityOf('From history')).toBe(1);
264
+ expect(stageOpacityOf('Being written')).toBe(0);
265
+ });
266
+
267
+ it('brings in a UI that arrives whole once a reply seen being written finishes', async () => {
268
+ const ui = makeHost();
269
+ const { rerender } = await renderConversation(
270
+ <AIConversation
271
+ messages={[user('u1', 'Plan'), reply('a1', 'Planning', undefined, { generating: true })]}
272
+ ui={ui}
273
+ />,
274
+ );
275
+ await rerender(
276
+ <AIConversation
277
+ messages={[
278
+ user('u1', 'Plan'),
279
+ reply('a1', '', { content: 'Arrived whole', format: 'a2ui' }),
280
+ ]}
281
+ ui={ui}
282
+ />,
283
+ );
284
+ expect(stageOpacityOf('Arrived whole')).toBe(0);
285
+ });
286
+
287
+ it('hands the replies’ documents to the host as they change', async () => {
288
+ const ui = makeHost();
289
+ const receive = jest.spyOn(ui, 'receive');
290
+ const messages = [user('u1', 'Plan'), reply('a1', '', { content: 'Ohrid', format: 'a2ui' })];
291
+ await renderConversation(<AIConversation messages={messages} ui={ui} />);
292
+ expect(receive).toHaveBeenCalledWith(messages);
293
+ });
294
+
295
+ it('shows a reply’s text when its UI throws, and keeps the rest of the conversation', async () => {
296
+ const Throws = () => {
297
+ throw new Error('The map had no places');
298
+ };
299
+ const throwing: AIUIRenderer = {
300
+ createEngine: () => ({
301
+ view: (document) =>
302
+ document.content === 'boom' ? (
303
+ <Throws />
304
+ ) : (
305
+ <Text testID='card'>{String(document.content)}</Text>
306
+ ),
307
+ }),
308
+ format: 'a2ui',
309
+ };
310
+ const onRenderError = jest.fn();
311
+ const ui = new AIUIHost({ onRenderError, renderers: [throwing], send: jest.fn() });
312
+ // React reports what a boundary caught.
313
+ const logged = jest.spyOn(console, 'error').mockImplementation(() => undefined);
314
+ await renderConversation(
315
+ <AIConversation
316
+ messages={[
317
+ user('u1', 'Plan'),
318
+ reply('a1', 'A weekend by the lake', { content: 'boom', format: 'a2ui' }),
319
+ user('u2', 'Again'),
320
+ reply('a2', 'Another', { content: 'Ohrid plan', format: 'a2ui' }),
321
+ ]}
322
+ ui={ui}
323
+ />,
324
+ );
325
+ await settle();
326
+ expect(screen.getByText('A weekend by the lake')).toBeTruthy();
327
+ expect(screen.getByTestId('card')).toHaveTextContent('Ohrid plan');
328
+ expect(onRenderError).toHaveBeenCalledTimes(1);
329
+ expect(onRenderError).toHaveBeenCalledWith(expect.any(Error), 'a1');
330
+ logged.mockRestore();
331
+ });
332
+
333
+ it('tries a reply’s UI that failed while it was written again once it is written', async () => {
334
+ const Throws = () => {
335
+ throw new Error('Half a map');
336
+ };
337
+ const throwing: AIUIRenderer = {
338
+ createEngine: () => ({
339
+ view: (document) =>
340
+ document.isStreaming ? <Throws /> : <Text testID='card'>{String(document.content)}</Text>,
341
+ }),
342
+ format: 'a2ui',
343
+ };
344
+ const onRenderError = jest.fn();
345
+ const ui = new AIUIHost({ onRenderError, renderers: [throwing], send: jest.fn() });
346
+ const logged = jest.spyOn(console, 'error').mockImplementation(() => undefined);
347
+ const { rerender } = await renderConversation(
348
+ <AIConversation
349
+ messages={[
350
+ user('u1', 'Plan'),
351
+ reply('a1', 'A weekend by the lake', {
352
+ content: 'Ohrid',
353
+ format: 'a2ui',
354
+ status: 'streaming',
355
+ }),
356
+ ]}
357
+ ui={ui}
358
+ />,
359
+ );
360
+ await settle();
361
+ expect(screen.getByText('A weekend by the lake')).toBeTruthy();
362
+ await rerender(
363
+ <AIConversation
364
+ messages={[
365
+ user('u1', 'Plan'),
366
+ reply('a1', 'A weekend by the lake', { content: 'Ohrid plan', format: 'a2ui' }),
367
+ ]}
368
+ ui={ui}
369
+ />,
370
+ );
371
+ await settle();
372
+ expect(screen.getByTestId('card')).toHaveTextContent('Ohrid plan');
373
+ expect(onRenderError).toHaveBeenCalledTimes(1);
374
+ logged.mockRestore();
375
+ });
376
+
377
+ it('leaves out only an app’s component that throws, and says so once the reply is written', async () => {
378
+ const definition = parseAIUIComponentDefinition({
379
+ description: 'A map.',
380
+ name: 'trip_map',
381
+ parameters: { properties: { title: { type: 'string' } }, required: ['title'] },
382
+ });
383
+ if (!definition) throw new Error('no definition');
384
+ const tripMap = defineAIUIComponent<{ title: string }>(definition, ({ args }) => {
385
+ if (args.title === 'nowhere') throw new Error('No places');
386
+ return <Text testID='map'>{args.title}</Text>;
387
+ });
388
+ const withMap: AIUIRenderer = {
389
+ createEngine: (host) => ({
390
+ view: (document, messageId) => (
391
+ <View>
392
+ <Text testID='card'>Plan</Text>
393
+ <AIUIComponentView
394
+ args={{ title: String(document.content) }}
395
+ component={tripMap}
396
+ context={{ emit: jest.fn(), host, isStreaming: document.isStreaming, messageId }}
397
+ />
398
+ </View>
399
+ ),
400
+ }),
401
+ format: 'a2ui',
402
+ };
403
+ const onRenderError = jest.fn();
404
+ const ui = new AIUIHost({ onRenderError, renderers: [withMap], send: jest.fn() });
405
+ const logged = jest.spyOn(console, 'error').mockImplementation(() => undefined);
406
+ const messages = (content: string, status: string) => [
407
+ user('u1', 'Plan'),
408
+ reply('a1', 'A weekend by the lake', { content, format: 'a2ui', status }),
409
+ ];
410
+ const { rerender } = await renderConversation(
411
+ <AIConversation messages={messages('nowhere', 'streaming')} ui={ui} />,
412
+ );
413
+ await settle();
414
+ expect(screen.getByTestId('card')).toBeTruthy();
415
+ expect(screen.queryByTestId('map')).toBeNull();
416
+ expect(onRenderError).not.toHaveBeenCalled();
417
+
418
+ await rerender(<AIConversation messages={messages('Ohrid', 'streaming')} ui={ui} />);
419
+ await settle();
420
+ expect(screen.getByTestId('map')).toHaveTextContent('Ohrid');
421
+
422
+ await rerender(<AIConversation messages={messages('nowhere', 'complete')} ui={ui} />);
423
+ await settle();
424
+ expect(screen.getByTestId('card')).toBeTruthy();
425
+ expect(screen.queryByText('A weekend by the lake')).toBeNull();
426
+ expect(onRenderError).toHaveBeenCalledTimes(1);
427
+ expect(onRenderError).toHaveBeenCalledWith(expect.any(Error), 'a1');
428
+ logged.mockRestore();
429
+ });
430
+
431
+ it('shows the rows again when the host says what a reply shows changed', async () => {
432
+ let shows = false;
433
+ const late: AIUIRenderer = {
434
+ createEngine: () => ({
435
+ view: (document) => (shows ? <Text testID='card'>{String(document.content)}</Text> : null),
436
+ }),
437
+ format: 'a2ui',
438
+ };
439
+ const ui = new AIUIHost({ renderers: [late], send: jest.fn() });
440
+ await renderConversation(
441
+ <AIConversation
442
+ messages={[
443
+ user('u1', 'Plan'),
444
+ reply('a1', 'The words', { content: 'Ohrid', format: 'a2ui' }),
445
+ ]}
446
+ ui={ui}
447
+ />,
448
+ );
449
+ expect(screen.getByText('The words')).toBeTruthy();
450
+ shows = true;
451
+ ui.refresh();
452
+ await settle();
453
+ expect(screen.getByTestId('card')).toHaveTextContent('Ohrid');
454
+ expect(screen.queryByText('The words')).toBeNull();
455
+ });
456
+ });
457
+
458
+ describe('AIConversation with a controller and generated UI', () => {
459
+ const controllerWith = (messages: AIMessage[]) =>
460
+ new AIConversationController({
461
+ transport: {
462
+ connect: (feed) => feed.updateMessages(messages),
463
+ send: () => Promise.resolve(),
464
+ stop: () => Promise.resolve(),
465
+ },
466
+ });
467
+
468
+ it('shows a reply that shows only its UI rather than the agent thinking', async () => {
469
+ const controller = controllerWith([
470
+ user('u1', 'Plan'),
471
+ reply(
472
+ 'a1',
473
+ '',
474
+ { content: 'Ohrid', format: 'a2ui', status: 'streaming' },
475
+ { generating: true },
476
+ ),
477
+ ]);
478
+ expect(controller.state.getLatestValue().status).toBe('submitted');
479
+
480
+ await renderConversation(<AIConversation conversation={controller} ui={makeHost()} />);
481
+
482
+ expect(screen.queryByRole('button', { name: 'Thinking...' })).toBeNull();
483
+ expect(screen.getByTestId('card')).toHaveTextContent('Ohrid');
484
+ controller.dispose();
485
+ });
486
+
487
+ it('shows the agent thinking while nothing reads the reply’s UI', async () => {
488
+ const controller = controllerWith([
489
+ user('u1', 'Plan'),
490
+ reply(
491
+ 'a1',
492
+ '',
493
+ { content: 'x', format: 'openui', status: 'streaming' },
494
+ { generating: true },
495
+ ),
496
+ ]);
497
+
498
+ await renderConversation(<AIConversation conversation={controller} ui={makeHost()} />);
499
+
500
+ expect(screen.getByRole('button', { name: 'Thinking...' })).toBeTruthy();
501
+ controller.dispose();
502
+ });
503
+ });
504
+
505
+ describe('AIUIView', () => {
506
+ it('shows one reply’s UI outside a conversation, or nothing when no renderer shows it', () => {
507
+ const ui = makeHost();
508
+ const { rerender } = render(
509
+ <StreamTheme>
510
+ <AIUIView
511
+ document={{ content: 'Alone', format: 'a2ui', isStreaming: false }}
512
+ host={ui}
513
+ messageId='a1'
514
+ />
515
+ </StreamTheme>,
516
+ );
517
+ expect(screen.getByTestId('card')).toHaveTextContent('Alone');
518
+ rerender(
519
+ <StreamTheme>
520
+ <AIUIView
521
+ document={{ content: 'x', format: 'openui', isStreaming: false }}
522
+ host={ui}
523
+ messageId='a1'
524
+ />
525
+ </StreamTheme>,
526
+ );
527
+ expect(screen.queryByTestId('card')).toBeNull();
528
+ });
529
+
530
+ it('shows another reply’s UI in the same views, as it would in its own', () => {
531
+ const ui = makeHost();
532
+ const view = (messageId: string, content: string, isStreaming: boolean) => (
533
+ <StreamTheme>
534
+ <AIUIView
535
+ document={{ content, format: 'a2ui', isStreaming }}
536
+ host={ui}
537
+ messageId={messageId}
538
+ />
539
+ </StreamTheme>
540
+ );
541
+ const { rerender } = render(view('a1', 'Being written', true));
542
+ const card = screen.getByTestId('card');
543
+ expect(stageOpacityOf('Being written')).toBe(0);
544
+
545
+ rerender(view('a2', 'From history', false));
546
+ expect(screen.getByTestId('card')).toBe(card);
547
+ expect(stageOpacityOf('From history')).toBe(1);
548
+
549
+ rerender(view('a3', 'Also being written', true));
550
+ expect(screen.getByTestId('card')).toBe(card);
551
+ expect(stageOpacityOf('Also being written')).toBe(0);
552
+ });
553
+ });
554
+
555
+ describe('AIUIComponentView', () => {
556
+ const definition = parseAIUIComponentDefinition({
557
+ description: 'One place of a plan.',
558
+ events: [{ description: 'Asks about the place.', name: 'ask_about' }],
559
+ name: 'place_card',
560
+ parameters: {
561
+ properties: { place_note: { type: 'string' }, title: { type: 'string' } },
562
+ required: ['title'],
563
+ 'x-order': ['title', 'place_note'],
564
+ },
565
+ });
566
+ if (!definition) throw new Error('no definition');
567
+ const placeCard = defineAIUIComponent<{ placeNote?: string; title: string }>(
568
+ definition,
569
+ ({ args, context }) => (
570
+ <Pressable
571
+ accessibilityRole='button'
572
+ onPress={() =>
573
+ context.emit('ask_about', `Tell me more about ${args.title}`, { title: args.title })
574
+ }
575
+ >
576
+ <Text>
577
+ {args.title}
578
+ {args.placeNote ? ` · ${args.placeNote}` : null}
579
+ </Text>
580
+ </Pressable>
581
+ ),
582
+ );
583
+
584
+ it('shows an app’s component once its arguments fit, and tells the agent what was done', () => {
585
+ const emit = jest.fn();
586
+ const context = { emit, host: makeHost(), isStreaming: true, messageId: 'a1' };
587
+ const { rerender } = render(
588
+ <AIUIComponentView
589
+ args={{ place_note: 'Best at' }}
590
+ component={placeCard}
591
+ context={context}
592
+ />,
593
+ );
594
+ expect(screen.queryByRole('button')).toBeNull();
595
+
596
+ rerender(
597
+ <AIUIComponentView
598
+ args={{ place_note: 'Best at sunset', title: 'Kaneo' }}
599
+ component={placeCard}
600
+ context={context}
601
+ />,
602
+ );
603
+ fireEvent.press(screen.getByRole('button', { name: 'Kaneo · Best at sunset' }));
604
+ expect(emit).toHaveBeenCalledWith('ask_about', 'Tell me more about Kaneo', { title: 'Kaneo' });
605
+ });
606
+ });
@@ -0,0 +1,32 @@
1
+ type Format = typeof import('../internal/format');
2
+
3
+ const loadFormat = () => {
4
+ let format: Format | undefined;
5
+ jest.isolateModules(() => {
6
+ format = require('../internal/format');
7
+ });
8
+ return format as Format;
9
+ };
10
+
11
+ describe('formatCallDuration', () => {
12
+ afterEach(() => jest.restoreAllMocks());
13
+
14
+ it('writes narrow units', () => {
15
+ const { formatCallDuration, formatMinutesAndSeconds } = loadFormat();
16
+ expect(formatCallDuration(0.42)).toBe('0.4s');
17
+ expect(formatCallDuration(65)).toBe('1m 5s');
18
+ expect(formatMinutesAndSeconds(120)).toBe('2m');
19
+ });
20
+
21
+ it('writes the same where Intl ignores the narrow width, as Hermes on iOS does', () => {
22
+ jest
23
+ .spyOn(Intl, 'NumberFormat')
24
+ .mockImplementation(
25
+ () => ({ format: (value: number) => `${value} sec` }) as unknown as Intl.NumberFormat,
26
+ );
27
+ const { formatCallDuration, formatMinutesAndSeconds } = loadFormat();
28
+ expect(formatCallDuration(0.42)).toBe('0.4s');
29
+ expect(formatCallDuration(65)).toBe('1m 5s');
30
+ expect(formatMinutesAndSeconds(7)).toBe('7s');
31
+ });
32
+ });