@vertesia/ui 1.5.0-dev.20260717.131047Z → 1.5.0-dev.20260725.083715Z

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 (567) hide show
  1. package/lib/core/components/SidePanel.js +1 -1
  2. package/lib/core/components/SidePanel.js.map +1 -1
  3. package/lib/core/components/shadcn/button.d.ts +10 -3
  4. package/lib/core/components/shadcn/button.d.ts.map +1 -1
  5. package/lib/core/components/shadcn/button.js +41 -9
  6. package/lib/core/components/shadcn/button.js.map +1 -1
  7. package/lib/core/components/shadcn/filters/filterBar.d.ts.map +1 -1
  8. package/lib/core/components/shadcn/filters/filterBar.js +1 -1
  9. package/lib/core/components/shadcn/filters/filterBar.js.map +1 -1
  10. package/lib/core/components/shadcn/modal/dialog.d.ts +1 -1
  11. package/lib/core/components/shadcn/modal/dialog.d.ts.map +1 -1
  12. package/lib/core/components/shadcn/modal/dialog.js +3 -1
  13. package/lib/core/components/shadcn/modal/dialog.js.map +1 -1
  14. package/lib/core/components/shadcn/tabs.d.ts +12 -1
  15. package/lib/core/components/shadcn/tabs.d.ts.map +1 -1
  16. package/lib/core/components/shadcn/tabs.js +12 -4
  17. package/lib/core/components/shadcn/tabs.js.map +1 -1
  18. package/lib/core/components/shadcn/theme/ThemeSwitcher.js +1 -1
  19. package/lib/core/components/shadcn/theme/ThemeSwitcher.js.map +1 -1
  20. package/lib/features/agent/chat/AgentChatPlaybackControls.d.ts.map +1 -1
  21. package/lib/features/agent/chat/AgentChatPlaybackControls.js +2 -2
  22. package/lib/features/agent/chat/AgentChatPlaybackControls.js.map +1 -1
  23. package/lib/features/agent/chat/AgentRequestInputOverlay.d.ts.map +1 -1
  24. package/lib/features/agent/chat/AgentRequestInputOverlay.js +2 -2
  25. package/lib/features/agent/chat/AgentRequestInputOverlay.js.map +1 -1
  26. package/lib/features/agent/chat/AgentRightPanel.d.ts +5 -1
  27. package/lib/features/agent/chat/AgentRightPanel.d.ts.map +1 -1
  28. package/lib/features/agent/chat/AgentRightPanel.js +2 -2
  29. package/lib/features/agent/chat/AgentRightPanel.js.map +1 -1
  30. package/lib/features/agent/chat/ArtifactsTab.d.ts +5 -1
  31. package/lib/features/agent/chat/ArtifactsTab.d.ts.map +1 -1
  32. package/lib/features/agent/chat/ArtifactsTab.js +53 -13
  33. package/lib/features/agent/chat/ArtifactsTab.js.map +1 -1
  34. package/lib/features/agent/chat/DocumentEditingActionCard.d.ts +6 -0
  35. package/lib/features/agent/chat/DocumentEditingActionCard.d.ts.map +1 -0
  36. package/lib/features/agent/chat/DocumentEditingActionCard.js +129 -0
  37. package/lib/features/agent/chat/DocumentEditingActionCard.js.map +1 -0
  38. package/lib/features/agent/chat/ImageLightbox.d.ts.map +1 -1
  39. package/lib/features/agent/chat/ImageLightbox.js +1 -1
  40. package/lib/features/agent/chat/ImageLightbox.js.map +1 -1
  41. package/lib/features/agent/chat/ModernAgentConversation.d.ts +19 -1
  42. package/lib/features/agent/chat/ModernAgentConversation.d.ts.map +1 -1
  43. package/lib/features/agent/chat/ModernAgentConversation.js +125 -27
  44. package/lib/features/agent/chat/ModernAgentConversation.js.map +1 -1
  45. package/lib/features/agent/chat/ModernAgentOutput/AgentMarkdownAnchor.d.ts +45 -0
  46. package/lib/features/agent/chat/ModernAgentOutput/AgentMarkdownAnchor.d.ts.map +1 -0
  47. package/lib/features/agent/chat/ModernAgentOutput/AgentMarkdownAnchor.js +40 -0
  48. package/lib/features/agent/chat/ModernAgentOutput/AgentMarkdownAnchor.js.map +1 -0
  49. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts +3 -1
  50. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts.map +1 -1
  51. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js +96 -51
  52. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -1
  53. package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.d.ts +2 -1
  54. package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.d.ts.map +1 -1
  55. package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.js +9 -5
  56. package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.js.map +1 -1
  57. package/lib/features/agent/chat/ModernAgentOutput/CollapsibleAgentMarkdown.d.ts +25 -0
  58. package/lib/features/agent/chat/ModernAgentOutput/CollapsibleAgentMarkdown.d.ts.map +1 -0
  59. package/lib/features/agent/chat/ModernAgentOutput/CollapsibleAgentMarkdown.js +33 -0
  60. package/lib/features/agent/chat/ModernAgentOutput/CollapsibleAgentMarkdown.js.map +1 -0
  61. package/lib/features/agent/chat/ModernAgentOutput/Header.d.ts.map +1 -1
  62. package/lib/features/agent/chat/ModernAgentOutput/Header.js +4 -2
  63. package/lib/features/agent/chat/ModernAgentOutput/Header.js.map +1 -1
  64. package/lib/features/agent/chat/ModernAgentOutput/MessageInput.d.ts.map +1 -1
  65. package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js +2 -2
  66. package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js.map +1 -1
  67. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.d.ts +3 -1
  68. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.d.ts.map +1 -1
  69. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js +23 -24
  70. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js.map +1 -1
  71. package/lib/features/agent/chat/ModernAgentOutput/ResourceChangeSummary.d.ts +14 -0
  72. package/lib/features/agent/chat/ModernAgentOutput/ResourceChangeSummary.d.ts.map +1 -0
  73. package/lib/features/agent/chat/ModernAgentOutput/ResourceChangeSummary.js +21 -0
  74. package/lib/features/agent/chat/ModernAgentOutput/ResourceChangeSummary.js.map +1 -0
  75. package/lib/features/agent/chat/ModernAgentOutput/ResourceChip.d.ts +30 -0
  76. package/lib/features/agent/chat/ModernAgentOutput/ResourceChip.d.ts.map +1 -0
  77. package/lib/features/agent/chat/ModernAgentOutput/ResourceChip.js +53 -0
  78. package/lib/features/agent/chat/ModernAgentOutput/ResourceChip.js.map +1 -0
  79. package/lib/features/agent/chat/ModernAgentOutput/ToolCallGroup.d.ts.map +1 -1
  80. package/lib/features/agent/chat/ModernAgentOutput/ToolCallGroup.js +21 -2
  81. package/lib/features/agent/chat/ModernAgentOutput/ToolCallGroup.js.map +1 -1
  82. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.d.ts +6 -0
  83. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.d.ts.map +1 -1
  84. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.js +15 -1
  85. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.js.map +1 -1
  86. package/lib/features/agent/chat/ModernAgentOutput/resourceLinks.d.ts +6 -0
  87. package/lib/features/agent/chat/ModernAgentOutput/resourceLinks.d.ts.map +1 -0
  88. package/lib/features/agent/chat/ModernAgentOutput/resourceLinks.js +29 -0
  89. package/lib/features/agent/chat/ModernAgentOutput/resourceLinks.js.map +1 -0
  90. package/lib/features/agent/chat/ModernAgentOutput/resourceSummary.d.ts +33 -0
  91. package/lib/features/agent/chat/ModernAgentOutput/resourceSummary.d.ts.map +1 -0
  92. package/lib/features/agent/chat/ModernAgentOutput/resourceSummary.js +129 -0
  93. package/lib/features/agent/chat/ModernAgentOutput/resourceSummary.js.map +1 -0
  94. package/lib/features/agent/chat/ModernAgentOutput/utils.d.ts +7 -0
  95. package/lib/features/agent/chat/ModernAgentOutput/utils.d.ts.map +1 -1
  96. package/lib/features/agent/chat/ModernAgentOutput/utils.js +11 -1
  97. package/lib/features/agent/chat/ModernAgentOutput/utils.js.map +1 -1
  98. package/lib/features/agent/chat/hooks/useAgentStream.d.ts +1 -1
  99. package/lib/features/agent/chat/hooks/useAgentStream.d.ts.map +1 -1
  100. package/lib/features/agent/chat/hooks/useAgentStream.js +24 -9
  101. package/lib/features/agent/chat/hooks/useAgentStream.js.map +1 -1
  102. package/lib/features/agent/chat/index.d.ts +2 -1
  103. package/lib/features/agent/chat/index.d.ts.map +1 -1
  104. package/lib/features/agent/chat/index.js +3 -0
  105. package/lib/features/agent/chat/index.js.map +1 -1
  106. package/lib/features/environment/SelectEnvironment.d.ts +28 -0
  107. package/lib/features/environment/SelectEnvironment.d.ts.map +1 -0
  108. package/lib/features/environment/SelectEnvironment.js +97 -0
  109. package/lib/features/environment/SelectEnvironment.js.map +1 -0
  110. package/lib/features/environment/index.d.ts +2 -0
  111. package/lib/features/environment/index.d.ts.map +1 -0
  112. package/lib/features/environment/index.js +2 -0
  113. package/lib/features/environment/index.js.map +1 -0
  114. package/lib/features/index.d.ts +2 -0
  115. package/lib/features/index.d.ts.map +1 -1
  116. package/lib/features/index.js +2 -0
  117. package/lib/features/index.js.map +1 -1
  118. package/lib/features/magic-pdf/AnnotatedImageSlider.js +12 -12
  119. package/lib/features/magic-pdf/AnnotatedImageSlider.js.map +1 -1
  120. package/lib/features/magic-pdf/DownloadPopover.d.ts.map +1 -1
  121. package/lib/features/magic-pdf/DownloadPopover.js +3 -17
  122. package/lib/features/magic-pdf/DownloadPopover.js.map +1 -1
  123. package/lib/features/magic-pdf/ExtractedContentView.js +2 -6
  124. package/lib/features/magic-pdf/ExtractedContentView.js.map +1 -1
  125. package/lib/features/magic-pdf/GroundedExtractionAssistantPanel.d.ts +25 -0
  126. package/lib/features/magic-pdf/GroundedExtractionAssistantPanel.d.ts.map +1 -0
  127. package/lib/features/magic-pdf/GroundedExtractionAssistantPanel.js +42 -0
  128. package/lib/features/magic-pdf/GroundedExtractionAssistantPanel.js.map +1 -0
  129. package/lib/features/magic-pdf/GroundedExtractionView.d.ts +27 -0
  130. package/lib/features/magic-pdf/GroundedExtractionView.d.ts.map +1 -0
  131. package/lib/features/magic-pdf/GroundedExtractionView.js +377 -0
  132. package/lib/features/magic-pdf/GroundedExtractionView.js.map +1 -0
  133. package/lib/features/magic-pdf/MagicPdfProvider.d.ts +0 -2
  134. package/lib/features/magic-pdf/MagicPdfProvider.d.ts.map +1 -1
  135. package/lib/features/magic-pdf/MagicPdfProvider.js +15 -42
  136. package/lib/features/magic-pdf/MagicPdfProvider.js.map +1 -1
  137. package/lib/features/magic-pdf/MagicPdfView.d.ts.map +1 -1
  138. package/lib/features/magic-pdf/MagicPdfView.js +2 -19
  139. package/lib/features/magic-pdf/MagicPdfView.js.map +1 -1
  140. package/lib/features/magic-pdf/index.d.ts +1 -0
  141. package/lib/features/magic-pdf/index.d.ts.map +1 -1
  142. package/lib/features/magic-pdf/index.js +1 -0
  143. package/lib/features/magic-pdf/index.js.map +1 -1
  144. package/lib/features/magic-pdf/types.d.ts +1 -1
  145. package/lib/features/magic-pdf/types.d.ts.map +1 -1
  146. package/lib/features/oauth/McpConnectionsButton.d.ts.map +1 -1
  147. package/lib/features/oauth/McpConnectionsButton.js +2 -2
  148. package/lib/features/oauth/McpConnectionsButton.js.map +1 -1
  149. package/lib/features/oauth/McpConnectionsDialog.d.ts.map +1 -1
  150. package/lib/features/oauth/McpConnectionsDialog.js +1 -1
  151. package/lib/features/oauth/McpConnectionsDialog.js.map +1 -1
  152. package/lib/features/oauth/RemoteMcpConnectionButton.d.ts.map +1 -1
  153. package/lib/features/oauth/RemoteMcpConnectionButton.js +1 -1
  154. package/lib/features/oauth/RemoteMcpConnectionButton.js.map +1 -1
  155. package/lib/features/pdf-viewer/PdfPageSlider.js +2 -2
  156. package/lib/features/pdf-viewer/PdfPageSlider.js.map +1 -1
  157. package/lib/features/pdf-viewer/SimplePdfViewer.d.ts.map +1 -1
  158. package/lib/features/pdf-viewer/SimplePdfViewer.js +3 -3
  159. package/lib/features/pdf-viewer/SimplePdfViewer.js.map +1 -1
  160. package/lib/features/permissions/UserPermissionsProvider.js +1 -1
  161. package/lib/features/permissions/UserPermissionsProvider.js.map +1 -1
  162. package/lib/features/store/objects/DocumentQuickFilter.d.ts.map +1 -1
  163. package/lib/features/store/objects/DocumentQuickFilter.js +5 -5
  164. package/lib/features/store/objects/DocumentQuickFilter.js.map +1 -1
  165. package/lib/features/store/objects/DocumentSearchResults.d.ts.map +1 -1
  166. package/lib/features/store/objects/DocumentSearchResults.js +4 -4
  167. package/lib/features/store/objects/DocumentSearchResults.js.map +1 -1
  168. package/lib/features/store/objects/components/ContentDispositionButton.d.ts.map +1 -1
  169. package/lib/features/store/objects/components/ContentDispositionButton.js +1 -1
  170. package/lib/features/store/objects/components/ContentDispositionButton.js.map +1 -1
  171. package/lib/features/store/objects/components/ContentOverview.d.ts +2 -1
  172. package/lib/features/store/objects/components/ContentOverview.d.ts.map +1 -1
  173. package/lib/features/store/objects/components/ContentOverview.js +159 -31
  174. package/lib/features/store/objects/components/ContentOverview.js.map +1 -1
  175. package/lib/features/store/objects/components/DocumentEditingConfigurationSelector.d.ts +16 -0
  176. package/lib/features/store/objects/components/DocumentEditingConfigurationSelector.d.ts.map +1 -0
  177. package/lib/features/store/objects/components/DocumentEditingConfigurationSelector.js +116 -0
  178. package/lib/features/store/objects/components/DocumentEditingConfigurationSelector.js.map +1 -0
  179. package/lib/features/store/objects/components/DocumentEditingLockStatus.d.ts +7 -0
  180. package/lib/features/store/objects/components/DocumentEditingLockStatus.d.ts.map +1 -0
  181. package/lib/features/store/objects/components/DocumentEditingLockStatus.js +13 -0
  182. package/lib/features/store/objects/components/DocumentEditingLockStatus.js.map +1 -0
  183. package/lib/features/store/objects/components/DocumentEditingPanel.d.ts +48 -0
  184. package/lib/features/store/objects/components/DocumentEditingPanel.d.ts.map +1 -0
  185. package/lib/features/store/objects/components/DocumentEditingPanel.js +720 -0
  186. package/lib/features/store/objects/components/DocumentEditingPanel.js.map +1 -0
  187. package/lib/features/store/objects/components/DocumentIcon.js +1 -1
  188. package/lib/features/store/objects/components/TextEditorPanel.d.ts.map +1 -1
  189. package/lib/features/store/objects/components/TextEditorPanel.js +22 -9
  190. package/lib/features/store/objects/components/TextEditorPanel.js.map +1 -1
  191. package/lib/features/store/objects/components/VectorSearchWidget.js +1 -1
  192. package/lib/features/store/objects/components/VectorSearchWidget.js.map +1 -1
  193. package/lib/features/store/objects/components/documentArtifactRefs.d.ts +26 -0
  194. package/lib/features/store/objects/components/documentArtifactRefs.d.ts.map +1 -0
  195. package/lib/features/store/objects/components/documentArtifactRefs.js +52 -0
  196. package/lib/features/store/objects/components/documentArtifactRefs.js.map +1 -0
  197. package/lib/features/store/objects/components/documentEditingAgentConfig.d.ts +4 -0
  198. package/lib/features/store/objects/components/documentEditingAgentConfig.d.ts.map +1 -0
  199. package/lib/features/store/objects/components/documentEditingAgentConfig.js +40 -0
  200. package/lib/features/store/objects/components/documentEditingAgentConfig.js.map +1 -0
  201. package/lib/features/store/objects/components/documentEditingPrompts.d.ts +3 -0
  202. package/lib/features/store/objects/components/documentEditingPrompts.d.ts.map +1 -0
  203. package/lib/features/store/objects/components/documentEditingPrompts.js +13 -0
  204. package/lib/features/store/objects/components/documentEditingPrompts.js.map +1 -0
  205. package/lib/features/store/objects/components/documentEditingRun.d.ts +27 -0
  206. package/lib/features/store/objects/components/documentEditingRun.d.ts.map +1 -0
  207. package/lib/features/store/objects/components/documentEditingRun.js +126 -0
  208. package/lib/features/store/objects/components/documentEditingRun.js.map +1 -0
  209. package/lib/features/store/objects/components/documentEditingTarget.d.ts +20 -0
  210. package/lib/features/store/objects/components/documentEditingTarget.d.ts.map +1 -0
  211. package/lib/features/store/objects/components/documentEditingTarget.js +40 -0
  212. package/lib/features/store/objects/components/documentEditingTarget.js.map +1 -0
  213. package/lib/features/store/objects/components/index.d.ts +1 -0
  214. package/lib/features/store/objects/components/index.d.ts.map +1 -1
  215. package/lib/features/store/objects/components/index.js +1 -0
  216. package/lib/features/store/objects/components/index.js.map +1 -1
  217. package/lib/features/store/objects/components/useContentPanelHooks.d.ts +6 -3
  218. package/lib/features/store/objects/components/useContentPanelHooks.d.ts.map +1 -1
  219. package/lib/features/store/objects/components/useContentPanelHooks.js +57 -37
  220. package/lib/features/store/objects/components/useContentPanelHooks.js.map +1 -1
  221. package/lib/features/store/objects/components/useDownloadFile.d.ts +2 -1
  222. package/lib/features/store/objects/components/useDownloadFile.d.ts.map +1 -1
  223. package/lib/features/store/objects/components/useDownloadFile.js +3 -0
  224. package/lib/features/store/objects/components/useDownloadFile.js.map +1 -1
  225. package/lib/features/store/objects/layout/renderers.d.ts.map +1 -1
  226. package/lib/features/store/objects/layout/renderers.js +2 -2
  227. package/lib/features/store/objects/layout/renderers.js.map +1 -1
  228. package/lib/features/store/objects/selection/SelectionActions.js +1 -1
  229. package/lib/features/store/objects/selection/SelectionActions.js.map +1 -1
  230. package/lib/features/store/objects/selection/actions/StartWorkflowButton.js +1 -1
  231. package/lib/features/store/objects/selection/actions/StartWorkflowButton.js.map +1 -1
  232. package/lib/features/store/types/ContentObjectTypesTable.d.ts.map +1 -1
  233. package/lib/features/store/types/ContentObjectTypesTable.js +4 -4
  234. package/lib/features/store/types/ContentObjectTypesTable.js.map +1 -1
  235. package/lib/features/store/types/IntakePolicyEditor.d.ts +15 -0
  236. package/lib/features/store/types/IntakePolicyEditor.d.ts.map +1 -0
  237. package/lib/features/store/types/IntakePolicyEditor.js +455 -0
  238. package/lib/features/store/types/IntakePolicyEditor.js.map +1 -0
  239. package/lib/features/store/types/IntakePolicyForm.d.ts +11 -0
  240. package/lib/features/store/types/IntakePolicyForm.d.ts.map +1 -0
  241. package/lib/features/store/types/IntakePolicyForm.js +91 -0
  242. package/lib/features/store/types/IntakePolicyForm.js.map +1 -0
  243. package/lib/features/store/types/SelectContentTypeModal.js +1 -1
  244. package/lib/features/store/types/SelectContentTypeModal.js.map +1 -1
  245. package/lib/features/store/types/index.d.ts +2 -0
  246. package/lib/features/store/types/index.d.ts.map +1 -1
  247. package/lib/features/store/types/index.js +2 -0
  248. package/lib/features/store/types/index.js.map +1 -1
  249. package/lib/features/store/types/intake-policy-editor.logic.d.ts +7 -0
  250. package/lib/features/store/types/intake-policy-editor.logic.d.ts.map +1 -0
  251. package/lib/features/store/types/intake-policy-editor.logic.js +60 -0
  252. package/lib/features/store/types/intake-policy-editor.logic.js.map +1 -0
  253. package/lib/features/store/types/typeCatalogCache.d.ts +5 -0
  254. package/lib/features/store/types/typeCatalogCache.d.ts.map +1 -0
  255. package/lib/features/store/types/typeCatalogCache.js +40 -0
  256. package/lib/features/store/types/typeCatalogCache.js.map +1 -0
  257. package/lib/features/user/UserInfo.js +7 -3
  258. package/lib/features/user/UserInfo.js.map +1 -1
  259. package/lib/features/views/ViewExperience.d.ts +20 -0
  260. package/lib/features/views/ViewExperience.d.ts.map +1 -0
  261. package/lib/features/views/ViewExperience.js +188 -0
  262. package/lib/features/views/ViewExperience.js.map +1 -0
  263. package/lib/features/views/ViewNavigation.d.ts +3 -0
  264. package/lib/features/views/ViewNavigation.d.ts.map +1 -0
  265. package/lib/features/views/ViewNavigation.js +36 -0
  266. package/lib/features/views/ViewNavigation.js.map +1 -0
  267. package/lib/features/views/ViewResults.d.ts +9 -0
  268. package/lib/features/views/ViewResults.d.ts.map +1 -0
  269. package/lib/features/views/ViewResults.js +229 -0
  270. package/lib/features/views/ViewResults.js.map +1 -0
  271. package/lib/features/views/ViewSearch.d.ts +3 -0
  272. package/lib/features/views/ViewSearch.d.ts.map +1 -0
  273. package/lib/features/views/ViewSearch.js +74 -0
  274. package/lib/features/views/ViewSearch.js.map +1 -0
  275. package/lib/features/views/index.d.ts +7 -0
  276. package/lib/features/views/index.d.ts.map +1 -0
  277. package/lib/features/views/index.js +7 -0
  278. package/lib/features/views/index.js.map +1 -0
  279. package/lib/features/views/types.d.ts +39 -0
  280. package/lib/features/views/types.d.ts.map +1 -0
  281. package/lib/features/views/types.js +2 -0
  282. package/lib/features/views/types.js.map +1 -0
  283. package/lib/features/views/viewState.d.ts +14 -0
  284. package/lib/features/views/viewState.d.ts.map +1 -0
  285. package/lib/features/views/viewState.js +117 -0
  286. package/lib/features/views/viewState.js.map +1 -0
  287. package/lib/i18n/locales/ar.json +134 -1
  288. package/lib/i18n/locales/de.json +130 -1
  289. package/lib/i18n/locales/en.json +363 -33
  290. package/lib/i18n/locales/es.json +131 -1
  291. package/lib/i18n/locales/fr.json +131 -1
  292. package/lib/i18n/locales/it.json +131 -1
  293. package/lib/i18n/locales/ja.json +129 -1
  294. package/lib/i18n/locales/ko.json +129 -1
  295. package/lib/i18n/locales/pt.json +131 -1
  296. package/lib/i18n/locales/ru.json +132 -1
  297. package/lib/i18n/locales/tr.json +130 -1
  298. package/lib/i18n/locales/zh-TW.json +129 -1
  299. package/lib/i18n/locales/zh.json +129 -1
  300. package/lib/rich-text/EditorToolbar.d.ts +37 -0
  301. package/lib/rich-text/EditorToolbar.d.ts.map +1 -0
  302. package/lib/rich-text/EditorToolbar.js +215 -0
  303. package/lib/rich-text/EditorToolbar.js.map +1 -0
  304. package/lib/rich-text/VertesiaRichTextEditor.d.ts +26 -0
  305. package/lib/rich-text/VertesiaRichTextEditor.d.ts.map +1 -0
  306. package/lib/rich-text/VertesiaRichTextEditor.js +67 -0
  307. package/lib/rich-text/VertesiaRichTextEditor.js.map +1 -0
  308. package/lib/rich-text/index.d.ts +2 -0
  309. package/lib/rich-text/index.d.ts.map +1 -0
  310. package/lib/rich-text/index.js +2 -0
  311. package/lib/rich-text/index.js.map +1 -0
  312. package/lib/router/HistoryNavigator.d.ts.map +1 -1
  313. package/lib/router/HistoryNavigator.js +23 -13
  314. package/lib/router/HistoryNavigator.js.map +1 -1
  315. package/lib/router/Nav.d.ts.map +1 -1
  316. package/lib/router/Nav.js +15 -6
  317. package/lib/router/Nav.js.map +1 -1
  318. package/lib/session/UserSession.d.ts.map +1 -1
  319. package/lib/session/UserSession.js +5 -3
  320. package/lib/session/UserSession.js.map +1 -1
  321. package/lib/vertesia-ui-core.js +4 -4
  322. package/lib/vertesia-ui-core.js.map +1 -1
  323. package/lib/vertesia-ui-features.js +40 -28
  324. package/lib/vertesia-ui-features.js.map +1 -1
  325. package/lib/vertesia-ui-i18n.js +15 -15
  326. package/lib/vertesia-ui-i18n.js.map +1 -1
  327. package/lib/vertesia-ui-rich-text.js +5 -0
  328. package/lib/vertesia-ui-rich-text.js.map +1 -0
  329. package/lib/vertesia-ui-router.js +1 -1
  330. package/lib/vertesia-ui-router.js.map +1 -1
  331. package/lib/vertesia-ui-session.js +1 -1
  332. package/lib/vertesia-ui-session.js.map +1 -1
  333. package/lib/vertesia-ui-shell.js +1 -1
  334. package/lib/vertesia-ui-shell.js.map +1 -1
  335. package/lib/vertesia-ui-widgets.js +25 -7
  336. package/lib/vertesia-ui-widgets.js.map +1 -1
  337. package/lib/widgets/form/Form.js +1 -1
  338. package/lib/widgets/form/Form.js.map +1 -1
  339. package/lib/widgets/json-view/JSONSwitcher.js +1 -1
  340. package/lib/widgets/json-view/JSONSwitcher.js.map +1 -1
  341. package/lib/widgets/json-view/JSONView.js +6 -6
  342. package/lib/widgets/json-view/JSONView.js.map +1 -1
  343. package/lib/widgets/markdown/AgentResourceResolver.d.ts +31 -0
  344. package/lib/widgets/markdown/AgentResourceResolver.d.ts.map +1 -0
  345. package/lib/widgets/markdown/AgentResourceResolver.js +39 -0
  346. package/lib/widgets/markdown/AgentResourceResolver.js.map +1 -0
  347. package/lib/widgets/markdown/ArtifactEditingSurface.d.ts +63 -0
  348. package/lib/widgets/markdown/ArtifactEditingSurface.d.ts.map +1 -0
  349. package/lib/widgets/markdown/ArtifactEditingSurface.js +582 -0
  350. package/lib/widgets/markdown/ArtifactEditingSurface.js.map +1 -0
  351. package/lib/widgets/markdown/CollaborativeMarkdownRenderer.d.ts +69 -0
  352. package/lib/widgets/markdown/CollaborativeMarkdownRenderer.d.ts.map +1 -0
  353. package/lib/widgets/markdown/CollaborativeMarkdownRenderer.js +374 -0
  354. package/lib/widgets/markdown/CollaborativeMarkdownRenderer.js.map +1 -0
  355. package/lib/widgets/markdown/MarkdownLink.d.ts +3 -1
  356. package/lib/widgets/markdown/MarkdownLink.d.ts.map +1 -1
  357. package/lib/widgets/markdown/MarkdownLink.js +41 -14
  358. package/lib/widgets/markdown/MarkdownLink.js.map +1 -1
  359. package/lib/widgets/markdown/MarkdownRenderer.d.ts +8 -1
  360. package/lib/widgets/markdown/MarkdownRenderer.d.ts.map +1 -1
  361. package/lib/widgets/markdown/MarkdownRenderer.js +20 -4
  362. package/lib/widgets/markdown/MarkdownRenderer.js.map +1 -1
  363. package/lib/widgets/markdown/index.d.ts +5 -1
  364. package/lib/widgets/markdown/index.d.ts.map +1 -1
  365. package/lib/widgets/markdown/index.js +5 -1
  366. package/lib/widgets/markdown/index.js.map +1 -1
  367. package/lib/widgets/markdown/normalizeCustomSchemeLinks.d.ts.map +1 -1
  368. package/lib/widgets/markdown/normalizeCustomSchemeLinks.js +14 -2
  369. package/lib/widgets/markdown/normalizeCustomSchemeLinks.js.map +1 -1
  370. package/lib/widgets/markdown/textDiff.d.ts +52 -0
  371. package/lib/widgets/markdown/textDiff.d.ts.map +1 -0
  372. package/lib/widgets/markdown/textDiff.js +362 -0
  373. package/lib/widgets/markdown/textDiff.js.map +1 -0
  374. package/lib/widgets/markdown/useArtifactContent.d.ts +5 -3
  375. package/lib/widgets/markdown/useArtifactContent.d.ts.map +1 -1
  376. package/lib/widgets/markdown/useArtifactContent.js +6 -3
  377. package/lib/widgets/markdown/useArtifactContent.js.map +1 -1
  378. package/lib/widgets/markdown/useResolvedUrl.d.ts +1 -5
  379. package/lib/widgets/markdown/useResolvedUrl.d.ts.map +1 -1
  380. package/lib/widgets/markdown/useResolvedUrl.js +19 -31
  381. package/lib/widgets/markdown/useResolvedUrl.js.map +1 -1
  382. package/lib/widgets/monacoEditor/MonacoEditor.d.ts.map +1 -1
  383. package/lib/widgets/monacoEditor/MonacoEditor.js +29 -0
  384. package/lib/widgets/monacoEditor/MonacoEditor.js.map +1 -1
  385. package/lib/widgets/schema-editor/ManagedSchema.d.ts +8 -0
  386. package/lib/widgets/schema-editor/ManagedSchema.d.ts.map +1 -1
  387. package/lib/widgets/schema-editor/ManagedSchema.js +16 -0
  388. package/lib/widgets/schema-editor/ManagedSchema.js.map +1 -1
  389. package/lib/widgets/schema-editor/editor/EditableSchemaProperty.d.ts +2 -0
  390. package/lib/widgets/schema-editor/editor/EditableSchemaProperty.d.ts.map +1 -1
  391. package/lib/widgets/schema-editor/editor/EditableSchemaProperty.js +1 -0
  392. package/lib/widgets/schema-editor/editor/EditableSchemaProperty.js.map +1 -1
  393. package/lib/widgets/schema-editor/editor/PropertyViewer.d.ts.map +1 -1
  394. package/lib/widgets/schema-editor/editor/PropertyViewer.js +4 -1
  395. package/lib/widgets/schema-editor/editor/PropertyViewer.js.map +1 -1
  396. package/lib/widgets/schema-editor/editor/SchemaEditor.d.ts.map +1 -1
  397. package/lib/widgets/schema-editor/editor/SchemaEditor.js +22 -11
  398. package/lib/widgets/schema-editor/editor/SchemaEditor.js.map +1 -1
  399. package/lib/widgets/xml-viewer/hooks/useXMLViewer.d.ts +9 -0
  400. package/lib/widgets/xml-viewer/hooks/useXMLViewer.d.ts.map +1 -1
  401. package/lib/widgets/xml-viewer/hooks/useXMLViewer.js +20 -17
  402. package/lib/widgets/xml-viewer/hooks/useXMLViewer.js.map +1 -1
  403. package/package.json +37 -33
  404. package/src/__tests__/a11y.test.tsx +77 -1
  405. package/src/__tests__/axe-helper.ts +17 -7
  406. package/src/__tests__/setup.ts +25 -0
  407. package/src/core/components/SidePanel.tsx +1 -1
  408. package/src/core/components/shadcn/button.tsx +67 -12
  409. package/src/core/components/shadcn/filters/filterBar.tsx +1 -0
  410. package/src/core/components/shadcn/modal/dialog.tsx +4 -2
  411. package/src/core/components/shadcn/tabs.test.tsx +65 -0
  412. package/src/core/components/shadcn/tabs.tsx +25 -3
  413. package/src/core/components/shadcn/theme/ThemeSwitcher.tsx +1 -1
  414. package/src/features/agent/chat/AgentChatPlaybackControls.tsx +0 -5
  415. package/src/features/agent/chat/AgentRequestInputOverlay.test.tsx +31 -0
  416. package/src/features/agent/chat/AgentRequestInputOverlay.tsx +6 -2
  417. package/src/features/agent/chat/AgentRightPanel.tsx +16 -1
  418. package/src/features/agent/chat/ArtifactsTab.test.tsx +55 -0
  419. package/src/features/agent/chat/ArtifactsTab.tsx +222 -61
  420. package/src/features/agent/chat/DocumentEditingActionCard.test.tsx +105 -0
  421. package/src/features/agent/chat/DocumentEditingActionCard.tsx +210 -0
  422. package/src/features/agent/chat/ImageLightbox.tsx +0 -1
  423. package/src/features/agent/chat/ModernAgentConversation.test.tsx +285 -40
  424. package/src/features/agent/chat/ModernAgentConversation.tsx +247 -77
  425. package/src/features/agent/chat/ModernAgentOutput/AgentMarkdownAnchor.test.tsx +79 -0
  426. package/src/features/agent/chat/ModernAgentOutput/AgentMarkdownAnchor.tsx +94 -0
  427. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.test.tsx +263 -35
  428. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +236 -118
  429. package/src/features/agent/chat/ModernAgentOutput/AttachmentPreview.tsx +17 -0
  430. package/src/features/agent/chat/ModernAgentOutput/CollapsibleAgentMarkdown.test.tsx +44 -0
  431. package/src/features/agent/chat/ModernAgentOutput/CollapsibleAgentMarkdown.tsx +88 -0
  432. package/src/features/agent/chat/ModernAgentOutput/Header.tsx +3 -3
  433. package/src/features/agent/chat/ModernAgentOutput/MessageInput.tsx +0 -2
  434. package/src/features/agent/chat/ModernAgentOutput/MessageItem.tsx +34 -47
  435. package/src/features/agent/chat/ModernAgentOutput/ResourceChangeSummary.tsx +40 -0
  436. package/src/features/agent/chat/ModernAgentOutput/ResourceChip.test.tsx +148 -0
  437. package/src/features/agent/chat/ModernAgentOutput/ResourceChip.tsx +141 -0
  438. package/src/features/agent/chat/ModernAgentOutput/ToolCallGroup.tsx +33 -1
  439. package/src/features/agent/chat/ModernAgentOutput/requestInputMessages.test.ts +80 -0
  440. package/src/features/agent/chat/ModernAgentOutput/requestInputMessages.ts +21 -1
  441. package/src/features/agent/chat/ModernAgentOutput/resourceLinks.tsx +43 -0
  442. package/src/features/agent/chat/ModernAgentOutput/resourceSummary.test.ts +229 -0
  443. package/src/features/agent/chat/ModernAgentOutput/resourceSummary.ts +152 -0
  444. package/src/features/agent/chat/ModernAgentOutput/utils.test.ts +17 -0
  445. package/src/features/agent/chat/ModernAgentOutput/utils.ts +14 -1
  446. package/src/features/agent/chat/hooks/useAgentStream.test.tsx +188 -0
  447. package/src/features/agent/chat/hooks/useAgentStream.ts +28 -8
  448. package/src/features/agent/chat/index.ts +11 -0
  449. package/src/features/environment/SelectEnvironment.tsx +186 -0
  450. package/src/features/environment/index.ts +1 -0
  451. package/src/features/index.ts +2 -0
  452. package/src/features/magic-pdf/AnnotatedImageSlider.tsx +62 -66
  453. package/src/features/magic-pdf/DownloadPopover.tsx +5 -48
  454. package/src/features/magic-pdf/ExtractedContentView.tsx +2 -14
  455. package/src/features/magic-pdf/GroundedExtractionAssistantPanel.tsx +86 -0
  456. package/src/features/magic-pdf/GroundedExtractionView.test.tsx +65 -0
  457. package/src/features/magic-pdf/GroundedExtractionView.tsx +1055 -0
  458. package/src/features/magic-pdf/MagicPdfProvider.tsx +17 -47
  459. package/src/features/magic-pdf/MagicPdfView.tsx +3 -51
  460. package/src/features/magic-pdf/index.ts +1 -0
  461. package/src/features/magic-pdf/types.ts +1 -1
  462. package/src/features/oauth/McpConnectionsButton.tsx +0 -2
  463. package/src/features/oauth/McpConnectionsDialog.tsx +0 -1
  464. package/src/features/oauth/RemoteMcpConnectionButton.tsx +0 -1
  465. package/src/features/pdf-viewer/PdfPageSlider.tsx +5 -5
  466. package/src/features/pdf-viewer/SimplePdfViewer.tsx +11 -12
  467. package/src/features/permissions/UserPermissionsProvider.tsx +1 -1
  468. package/src/features/store/objects/DocumentQuickFilter.tsx +13 -15
  469. package/src/features/store/objects/DocumentSearchResults.tsx +5 -8
  470. package/src/features/store/objects/components/ContentDispositionButton.tsx +5 -1
  471. package/src/features/store/objects/components/ContentOverview.tsx +356 -105
  472. package/src/features/store/objects/components/DocumentEditingConfigurationSelector.test.ts +34 -0
  473. package/src/features/store/objects/components/DocumentEditingConfigurationSelector.tsx +211 -0
  474. package/src/features/store/objects/components/DocumentEditingLockStatus.test.tsx +32 -0
  475. package/src/features/store/objects/components/DocumentEditingLockStatus.tsx +45 -0
  476. package/src/features/store/objects/components/DocumentEditingPanel.test.tsx +336 -0
  477. package/src/features/store/objects/components/DocumentEditingPanel.tsx +1236 -0
  478. package/src/features/store/objects/components/DocumentIcon.tsx +1 -1
  479. package/src/features/store/objects/components/TextEditorPanel.test.tsx +48 -0
  480. package/src/features/store/objects/components/TextEditorPanel.tsx +41 -20
  481. package/src/features/store/objects/components/VectorSearchWidget.tsx +2 -2
  482. package/src/features/store/objects/components/documentArtifactRefs.test.ts +65 -0
  483. package/src/features/store/objects/components/documentArtifactRefs.ts +72 -0
  484. package/src/features/store/objects/components/documentEditingAgentConfig.test.ts +28 -0
  485. package/src/features/store/objects/components/documentEditingAgentConfig.ts +41 -0
  486. package/src/features/store/objects/components/documentEditingPrompts.test.ts +26 -0
  487. package/src/features/store/objects/components/documentEditingPrompts.ts +12 -0
  488. package/src/features/store/objects/components/documentEditingRun.test.ts +176 -0
  489. package/src/features/store/objects/components/documentEditingRun.ts +184 -0
  490. package/src/features/store/objects/components/documentEditingTarget.test.ts +96 -0
  491. package/src/features/store/objects/components/documentEditingTarget.ts +63 -0
  492. package/src/features/store/objects/components/index.ts +1 -0
  493. package/src/features/store/objects/components/useContentPanelHooks.ts +55 -42
  494. package/src/features/store/objects/components/useDownloadFile.test.ts +20 -0
  495. package/src/features/store/objects/components/useDownloadFile.ts +5 -1
  496. package/src/features/store/objects/layout/renderers.tsx +1 -2
  497. package/src/features/store/objects/selection/SelectionActions.tsx +1 -1
  498. package/src/features/store/objects/selection/actions/StartWorkflowButton.tsx +2 -2
  499. package/src/features/store/types/ContentObjectTypesTable.tsx +12 -14
  500. package/src/features/store/types/IntakePolicyEditor.tsx +679 -0
  501. package/src/features/store/types/IntakePolicyForm.tsx +838 -0
  502. package/src/features/store/types/SelectContentTypeModal.tsx +2 -2
  503. package/src/features/store/types/index.ts +2 -0
  504. package/src/features/store/types/intake-policy-editor.logic.test.ts +109 -0
  505. package/src/features/store/types/intake-policy-editor.logic.ts +87 -0
  506. package/src/features/store/types/typeCatalogCache.ts +45 -0
  507. package/src/features/user/UserInfo.tsx +7 -7
  508. package/src/features/views/ViewExperience.test.tsx +273 -0
  509. package/src/features/views/ViewExperience.tsx +408 -0
  510. package/src/features/views/ViewNavigation.test.tsx +86 -0
  511. package/src/features/views/ViewNavigation.tsx +187 -0
  512. package/src/features/views/ViewResults.test.ts +82 -0
  513. package/src/features/views/ViewResults.tsx +609 -0
  514. package/src/features/views/ViewSearch.test.tsx +147 -0
  515. package/src/features/views/ViewSearch.tsx +205 -0
  516. package/src/features/views/index.ts +6 -0
  517. package/src/features/views/types.ts +57 -0
  518. package/src/features/views/viewState.test.ts +111 -0
  519. package/src/features/views/viewState.ts +132 -0
  520. package/src/i18n/locales/ar.json +134 -1
  521. package/src/i18n/locales/de.json +130 -1
  522. package/src/i18n/locales/en.json +1083 -753
  523. package/src/i18n/locales/es.json +131 -1
  524. package/src/i18n/locales/fr.json +131 -1
  525. package/src/i18n/locales/it.json +131 -1
  526. package/src/i18n/locales/ja.json +129 -1
  527. package/src/i18n/locales/ko.json +129 -1
  528. package/src/i18n/locales/pt.json +131 -1
  529. package/src/i18n/locales/ru.json +132 -1
  530. package/src/i18n/locales/tr.json +130 -1
  531. package/src/i18n/locales/zh-TW.json +129 -1
  532. package/src/i18n/locales/zh.json +129 -1
  533. package/src/rich-text/EditorToolbar.tsx +708 -0
  534. package/src/rich-text/VertesiaRichTextEditor.test.tsx +211 -0
  535. package/src/rich-text/VertesiaRichTextEditor.tsx +241 -0
  536. package/src/rich-text/index.ts +9 -0
  537. package/src/router/HistoryNavigator.test.ts +48 -0
  538. package/src/router/HistoryNavigator.ts +24 -13
  539. package/src/router/Nav.tsx +18 -8
  540. package/src/session/UserSession.test.ts +39 -0
  541. package/src/session/UserSession.ts +5 -3
  542. package/src/widgets/form/Form.tsx +1 -1
  543. package/src/widgets/json-view/JSONSwitcher.tsx +2 -2
  544. package/src/widgets/json-view/JSONView.tsx +7 -7
  545. package/src/widgets/markdown/AgentResourceResolver.test.ts +24 -0
  546. package/src/widgets/markdown/AgentResourceResolver.tsx +70 -0
  547. package/src/widgets/markdown/ArtifactEditingSurface.test.tsx +537 -0
  548. package/src/widgets/markdown/ArtifactEditingSurface.tsx +878 -0
  549. package/src/widgets/markdown/CollaborativeMarkdownRenderer.test.tsx +484 -0
  550. package/src/widgets/markdown/CollaborativeMarkdownRenderer.tsx +825 -0
  551. package/src/widgets/markdown/MarkdownLink.test.tsx +122 -0
  552. package/src/widgets/markdown/MarkdownLink.tsx +102 -17
  553. package/src/widgets/markdown/MarkdownRenderer.tsx +30 -3
  554. package/src/widgets/markdown/index.ts +39 -1
  555. package/src/widgets/markdown/normalizeCustomSchemeLinks.ts +15 -2
  556. package/src/widgets/markdown/textDiff.test.ts +156 -0
  557. package/src/widgets/markdown/textDiff.ts +399 -0
  558. package/src/widgets/markdown/useArtifactContent.ts +9 -3
  559. package/src/widgets/markdown/useResolvedUrl.test.ts +29 -40
  560. package/src/widgets/markdown/useResolvedUrl.ts +33 -35
  561. package/src/widgets/monacoEditor/MonacoEditor.tsx +29 -0
  562. package/src/widgets/schema-editor/ManagedSchema.ts +22 -0
  563. package/src/widgets/schema-editor/editor/EditableSchemaProperty.tsx +3 -0
  564. package/src/widgets/schema-editor/editor/PropertyViewer.tsx +14 -3
  565. package/src/widgets/schema-editor/editor/SchemaEditor.tsx +80 -29
  566. package/src/widgets/xml-viewer/hooks/useXMLViewer.test.ts +26 -0
  567. package/src/widgets/xml-viewer/hooks/useXMLViewer.ts +23 -18
@@ -47,6 +47,7 @@ export interface ParsedUserAttachments {
47
47
  interface AttachmentPreviewListProps {
48
48
  items: AttachmentPreviewItem[];
49
49
  artifactRunId?: string;
50
+ onOpenArtifact?: (path: string) => void;
50
51
  className?: string;
51
52
  align?: 'start' | 'end';
52
53
  variant?: 'composer' | 'message';
@@ -103,17 +104,28 @@ function isCollectionHref(href: string | undefined): boolean {
103
104
  function AttachmentLink({
104
105
  item,
105
106
  children,
107
+ onOpenArtifact,
106
108
  StoreLinkComponent,
107
109
  CollectionLinkComponent,
108
110
  }: {
109
111
  item: AttachmentPreviewItem;
110
112
  children: React.ReactNode;
113
+ onOpenArtifact?: (path: string) => void;
111
114
  StoreLinkComponent?: AttachmentPreviewListProps['StoreLinkComponent'];
112
115
  CollectionLinkComponent?: AttachmentPreviewListProps['CollectionLinkComponent'];
113
116
  }) {
114
117
  const href = item.href;
115
118
  if (!href) return <>{children}</>;
116
119
 
120
+ const artifactPath = getArtifactPath(item);
121
+ if (artifactPath && /\.md$/i.test(artifactPath) && onOpenArtifact) {
122
+ return (
123
+ <button type="button" className="max-w-full text-start" onClick={() => onOpenArtifact(artifactPath)}>
124
+ {children}
125
+ </button>
126
+ );
127
+ }
128
+
117
129
  if (isStoreObjectHref(href)) {
118
130
  const documentId = getStoreObjectId(href);
119
131
  if (StoreLinkComponent) {
@@ -158,6 +170,7 @@ function AttachmentPreview({
158
170
  artifactRunId,
159
171
  variant,
160
172
  onRemove,
173
+ onOpenArtifact,
161
174
  StoreLinkComponent,
162
175
  CollectionLinkComponent,
163
176
  }: {
@@ -165,6 +178,7 @@ function AttachmentPreview({
165
178
  artifactRunId?: string;
166
179
  variant: 'composer' | 'message';
167
180
  onRemove?: (fileId: string) => void;
181
+ onOpenArtifact?: (path: string) => void;
168
182
  StoreLinkComponent?: AttachmentPreviewListProps['StoreLinkComponent'];
169
183
  CollectionLinkComponent?: AttachmentPreviewListProps['CollectionLinkComponent'];
170
184
  }) {
@@ -338,6 +352,7 @@ function AttachmentPreview({
338
352
  <span className="relative inline-flex max-w-full">
339
353
  <AttachmentLink
340
354
  item={item}
355
+ onOpenArtifact={onOpenArtifact}
341
356
  StoreLinkComponent={StoreLinkComponent}
342
357
  CollectionLinkComponent={CollectionLinkComponent}
343
358
  >
@@ -355,6 +370,7 @@ export function AttachmentPreviewList({
355
370
  align = 'start',
356
371
  variant = 'message',
357
372
  onRemove,
373
+ onOpenArtifact,
358
374
  StoreLinkComponent,
359
375
  CollectionLinkComponent,
360
376
  }: AttachmentPreviewListProps) {
@@ -369,6 +385,7 @@ export function AttachmentPreviewList({
369
385
  artifactRunId={artifactRunId}
370
386
  variant={variant}
371
387
  onRemove={onRemove}
388
+ onOpenArtifact={onOpenArtifact}
372
389
  StoreLinkComponent={StoreLinkComponent}
373
390
  CollectionLinkComponent={CollectionLinkComponent}
374
391
  />
@@ -0,0 +1,44 @@
1
+ /** @vitest-environment jsdom */
2
+
3
+ import { cleanup, fireEvent, render, screen } from '@testing-library/react';
4
+ import { afterEach, describe, expect, it } from 'vitest';
5
+ import { I18nProvider } from '../../../../i18n/index.js';
6
+ import { AGENT_LINE_CLAMP_CLASS, CollapsibleAgentMarkdown } from './CollapsibleAgentMarkdown.js';
7
+
8
+ afterEach(cleanup);
9
+
10
+ const renderMarkdown = (markdown: string, testId = 'prose') =>
11
+ render(
12
+ <I18nProvider lng="en">
13
+ <CollapsibleAgentMarkdown data-testid={testId}>{markdown}</CollapsibleAgentMarkdown>
14
+ </I18nProvider>,
15
+ );
16
+
17
+ describe('CollapsibleAgentMarkdown', () => {
18
+ it('renders markdown without a toggle when the content is short', () => {
19
+ renderMarkdown('A **short** note.');
20
+ expect(screen.getByText('short')).not.toBeNull();
21
+ expect(screen.queryByRole('button', { name: /Show more/ })).toBeNull();
22
+ });
23
+
24
+ it('renders a markdown table', () => {
25
+ renderMarkdown('| A | B |\n| - | - |\n| 1 | 2 |');
26
+ expect(screen.getByRole('table')).not.toBeNull();
27
+ });
28
+
29
+ it('collapses long content behind a show more / show less toggle', () => {
30
+ const long = Array.from({ length: 10 }, (_, i) => `Line number ${i + 1} of the reference block.`).join('\n\n');
31
+ renderMarkdown(long);
32
+
33
+ const prose = screen.getByTestId('prose');
34
+ const showMore = screen.getByRole('button', { name: /Show more/ });
35
+ expect(showMore.getAttribute('aria-expanded')).toBe('false');
36
+ expect(prose.getAttribute('class') ?? '').toContain(AGENT_LINE_CLAMP_CLASS.split(' ')[0]);
37
+
38
+ fireEvent.click(showMore);
39
+
40
+ const showLess = screen.getByRole('button', { name: /Show less/ });
41
+ expect(showLess.getAttribute('aria-expanded')).toBe('true');
42
+ expect(prose.getAttribute('class') ?? '').not.toContain('[-webkit-line-clamp:6]');
43
+ });
44
+ });
@@ -0,0 +1,88 @@
1
+ import { cn } from '@vertesia/ui/core';
2
+ import { useUITranslation } from '@vertesia/ui/i18n';
3
+ import { MarkdownRenderer, type MarkdownRendererProps } from '@vertesia/ui/widgets';
4
+ import { ChevronDown } from 'lucide-react';
5
+ import { useState } from 'react';
6
+
7
+ /** Prose styling used for agent/model message markdown, shared across the conversation UI. */
8
+ export const AGENT_PROSE_CLASS = [
9
+ 'agent-markdown vprose prose max-w-none break-words text-sm leading-6 text-foreground/80',
10
+ 'prose-p:my-2 prose-p:leading-6 prose-li:my-0.5 prose-pre:my-3 prose-headings:tracking-normal',
11
+ 'prose-headings:text-foreground prose-strong:text-foreground prose-code:text-foreground',
12
+ 'prose-a:text-foreground prose-a:underline prose-a:decoration-muted prose-a:underline-offset-4',
13
+ '[&_p]:text-foreground/80 [&_li]:text-foreground/80 [&_li::marker]:text-muted',
14
+ ].join(' ');
15
+
16
+ /** Clamp applied to collapsed markdown. Kept as a literal so Tailwind emits the utility. */
17
+ export const AGENT_LINE_CLAMP_CLASS =
18
+ '[display:-webkit-box] overflow-hidden [-webkit-box-orient:vertical] [-webkit-line-clamp:6]';
19
+
20
+ export const AGENT_COLLAPSE_LINES = 6;
21
+ export const AGENT_COLLAPSE_THRESHOLD = 520;
22
+
23
+ interface CollapsibleAgentMarkdownProps {
24
+ /** Raw markdown to render. */
25
+ children: string;
26
+ artifactRunId?: string;
27
+ components?: MarkdownRendererProps['components'];
28
+ /** Disable the show more/less affordance regardless of length. */
29
+ disableCollapse?: boolean;
30
+ className?: string;
31
+ 'data-testid'?: string;
32
+ }
33
+
34
+ /**
35
+ * Renders agent/model markdown with the shared prose styling and, when the content is long,
36
+ * collapses it to a few lines behind a "Show more" / "Show less" toggle. Mirrors the treatment
37
+ * used for summary thought prose so edit/comment cards read like ordinary model messages.
38
+ */
39
+ export function CollapsibleAgentMarkdown({
40
+ children,
41
+ artifactRunId,
42
+ components,
43
+ disableCollapse,
44
+ className,
45
+ 'data-testid': dataTestId,
46
+ }: CollapsibleAgentMarkdownProps) {
47
+ const { t } = useUITranslation();
48
+ const normalizedText = children.trim();
49
+ const [isExpanded, setIsExpanded] = useState(false);
50
+ const explicitLineCount = normalizedText ? normalizedText.split(/\r?\n/).length : 0;
51
+ const isLong = normalizedText.length > AGENT_COLLAPSE_THRESHOLD || explicitLineCount > AGENT_COLLAPSE_LINES;
52
+ const collapsed = isLong && !disableCollapse && !isExpanded;
53
+
54
+ return (
55
+ <div className={cn('min-w-0', className)}>
56
+ <div
57
+ data-testid={dataTestId}
58
+ className={cn(AGENT_PROSE_CLASS, collapsed && AGENT_LINE_CLAMP_CLASS)}
59
+ style={{ overflowWrap: 'anywhere' }}
60
+ >
61
+ <MarkdownRenderer artifactRunId={artifactRunId} components={components}>
62
+ {children}
63
+ </MarkdownRenderer>
64
+ </div>
65
+ {isLong && !disableCollapse ? (
66
+ <div className="mt-1.5 flex justify-end">
67
+ <button
68
+ type="button"
69
+ aria-expanded={isExpanded}
70
+ className={cn(
71
+ 'inline-flex items-center gap-1 text-sm font-medium text-muted transition-colors',
72
+ '[text-decoration:none] hover:text-foreground hover:[text-decoration:none]',
73
+ 'focus-visible:text-foreground focus-visible:[text-decoration:none]',
74
+ 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',
75
+ )}
76
+ onClick={() => setIsExpanded((current) => !current)}
77
+ >
78
+ {isExpanded ? t('agent.showLess') : t('agent.showMore')}
79
+ <ChevronDown
80
+ className={cn('size-4 transition-transform', isExpanded && 'rotate-180')}
81
+ aria-hidden="true"
82
+ />
83
+ </button>
84
+ </div>
85
+ ) : null}
86
+ </div>
87
+ );
88
+ }
@@ -100,7 +100,9 @@ export default function Header({
100
100
  const controls = (
101
101
  <div
102
102
  className={cn(
103
- isCompact ? 'flex flex-col items-center gap-1' : 'flex justify-end items-center gap-2 ms-auto',
103
+ isCompact
104
+ ? 'flex flex-row items-center gap-1 lg:flex-col'
105
+ : 'flex justify-end items-center gap-2 ms-auto',
104
106
  )}
105
107
  >
106
108
  {showPlanButton && (
@@ -177,7 +179,6 @@ export default function Header({
177
179
  variant={isPlaybackEnabled ? 'primary' : 'ghost'}
178
180
  onClick={onTogglePlayback}
179
181
  aria-pressed={isPlaybackEnabled}
180
- aria-label={t('agent.rewind.label')}
181
182
  title={t('agent.rewind.label')}
182
183
  className={cn(
183
184
  'transition-all duration-200 rounded-md',
@@ -376,7 +377,6 @@ function MoreDropdown({
376
377
  size={compact ? 'icon' : 'xs'}
377
378
  variant="ghost"
378
379
  title={t('agent.moreActions')}
379
- aria-label={t('agent.moreActions')}
380
380
  className={compact ? 'size-8 rounded-lg' : undefined}
381
381
  >
382
382
  <MoreVertical className="size-4" />
@@ -523,7 +523,6 @@ export default function MessageInput({
523
523
  variant="ghost"
524
524
  size="icon"
525
525
  className="size-8 rounded-full text-muted hover:bg-muted"
526
- aria-label={t('agent.addAttachment')}
527
526
  title={t('agent.addAttachment')}
528
527
  >
529
528
  <PlusIcon className="size-4" />
@@ -654,7 +653,6 @@ export default function MessageInput({
654
653
  '[&_svg]:text-destructive disabled:[&_svg]:text-muted',
655
654
  )}
656
655
  title={t('agent.stopTooltip')}
657
- aria-label={t('agent.stopTooltip')}
658
656
  >
659
657
  {isStopping ? (
660
658
  <Spinner size="sm" />
@@ -6,7 +6,7 @@ import {
6
6
  } from '@vertesia/common';
7
7
  import { Badge, Button, cn, Dropdown, MenuItem, useToast } from '@vertesia/ui/core';
8
8
  import { useUITranslation } from '@vertesia/ui/i18n';
9
- import { NavLink, useRouterContext } from '@vertesia/ui/router';
9
+ import { useRouterContext } from '@vertesia/ui/router';
10
10
  import { useUserSession } from '@vertesia/ui/session';
11
11
  import { MarkdownRenderer } from '@vertesia/ui/widgets';
12
12
  import dayjs from 'dayjs';
@@ -29,12 +29,15 @@ import { memo, useEffect, useMemo, useRef, useState } from 'react';
29
29
  import { useDownloadFile } from '../../../store/objects/components/useDownloadFile.js';
30
30
  import { PulsatingCircle } from '../AnimatedThinkingDots';
31
31
  import { AskUserWidget } from '../AskUserWidget';
32
+ import { DocumentEditingActionCard, parseMarkdownEditingAction } from '../DocumentEditingActionCard.js';
32
33
  import { useImageLightbox } from '../ImageLightbox';
33
34
  import { getArtifactCacheKey, useArtifactUrlCache } from '../useArtifactUrlCache.js';
34
35
  import { ThinkingMessages } from '../WaitingMessages';
36
+ import { createAgentMarkdownAnchor } from './AgentMarkdownAnchor';
35
37
  import { AttachmentPreviewList, parseUserMessageAttachments } from './AttachmentPreview';
36
38
  import { MessageDeliveryStatus } from './MessageDeliveryStatus';
37
39
  import { processContentForMarkdown } from './processContentForMarkdown';
40
+ import { getToolApprovalResponseMetadata } from './requestInputMessages';
38
41
  import { getWorkstreamId } from './utils';
39
42
 
40
43
  /** className overrides for MessageItem — single source of truth for all className overrides. */
@@ -107,6 +110,8 @@ export interface MessageItemProps extends MessageItemClassNames {
107
110
  showPulsatingCircle?: boolean;
108
111
  /** Callback when user sends a message (e.g., from proposal selection) */
109
112
  onSendMessage?: (message: string, metadata?: Record<string, unknown>) => void;
113
+ /** Open a Markdown artifact in the surrounding agent panel. */
114
+ onOpenArtifact?: (path: string) => void;
110
115
  /** Whether a REQUEST_INPUT message has already been answered by a later user message */
111
116
  requestInputAnswered?: boolean;
112
117
  /** Sparse per-type overrides for MESSAGE_STYLES (deep-merged with defaults) */
@@ -196,6 +201,7 @@ function MessageItemComponent({
196
201
  message,
197
202
  showPulsatingCircle = false,
198
203
  onSendMessage,
204
+ onOpenArtifact,
199
205
  requestInputAnswered = false,
200
206
  className,
201
207
  cardClassName,
@@ -303,6 +309,13 @@ function MessageItemComponent({
303
309
 
304
310
  const visibleMessageContent = parsedUserAttachments?.body ?? messageContent;
305
311
  const messageAttachments = parsedUserAttachments?.attachments ?? [];
312
+ const editingAction = useMemo(
313
+ () =>
314
+ message.type === AgentMessageType.QUESTION
315
+ ? parseMarkdownEditingAction(message.details?.editing_action)
316
+ : undefined,
317
+ [message.details, message.type],
318
+ );
306
319
 
307
320
  // PERFORMANCE: Memoize processed content - expensive regex operations only run when messageContent changes
308
321
  const processedContent = useMemo(() => {
@@ -366,52 +379,13 @@ function MessageItemComponent({
366
379
  // PERFORMANCE: Memoize markdown components to prevent MarkdownRenderer remounts
367
380
  const markdownComponents = useMemo(
368
381
  () => ({
369
- a: ({
370
- node,
371
- ref,
372
- ...props
373
- }: {
374
- node?: unknown;
375
- ref?: unknown;
376
- href?: string;
377
- children?: React.ReactNode;
378
- }) => {
379
- const href = props.href || '';
382
+ a: createAgentMarkdownAnchor({
383
+ StoreLinkComponent,
384
+ CollectionLinkComponent,
380
385
  // Carry the active account (`a`) & project (`p`) params on internal routes so
381
386
  // copy-link / open-in-new-tab preserve the current tenant.
382
- const withParams = href.startsWith('/') ? router.getTopRouter().navigator.addStickyParams(href) : href;
383
- if (href.includes('/store/objects')) {
384
- if (StoreLinkComponent) {
385
- const documentId = href.split('/store/objects/')[1] || '';
386
- return (
387
- <StoreLinkComponent href={withParams} documentId={documentId}>
388
- {props.children}
389
- </StoreLinkComponent>
390
- );
391
- }
392
- return (
393
- <NavLink href={withParams} topLevelNav>
394
- {props.children}
395
- </NavLink>
396
- );
397
- }
398
- if (href.includes('/store/collections')) {
399
- if (CollectionLinkComponent) {
400
- const collectionId = href.split('/store/collections/')[1] || '';
401
- return (
402
- <CollectionLinkComponent href={withParams} collectionId={collectionId}>
403
- {props.children}
404
- </CollectionLinkComponent>
405
- );
406
- }
407
- return (
408
- <NavLink href={withParams} topLevelNav>
409
- {props.children}
410
- </NavLink>
411
- );
412
- }
413
- return <a {...props} target="_blank" rel="noopener noreferrer" />;
414
- },
387
+ addStickyParams: (href: string) => router.getTopRouter().navigator.addStickyParams(href),
388
+ }),
415
389
  img: ({ node, ref, ...props }: { node?: unknown; ref?: unknown; src?: string; alt?: string }) => {
416
390
  return (
417
391
  <Button
@@ -465,6 +439,7 @@ function MessageItemComponent({
465
439
  >
466
440
  <MarkdownRenderer
467
441
  artifactRunId={runId}
442
+ onArtifactOpen={onOpenArtifact}
468
443
  onProposalSelect={(optionId) => onSendMessage?.(optionId)}
469
444
  onProposalSubmit={(text) => onSendMessage?.(text)}
470
445
  components={markdownComponents}
@@ -649,7 +624,9 @@ function MessageItemComponent({
649
624
  options={askUserUx.options}
650
625
  variant={askUserUx.variant}
651
626
  multiSelect={askUserUx.multiSelect}
652
- onSelect={(optionId) => onSendMessage?.(optionId)}
627
+ onSelect={(optionId) =>
628
+ onSendMessage?.(optionId, getToolApprovalResponseMetadata(message, optionId))
629
+ }
653
630
  onMultiSelect={(optionIds) => onSendMessage?.(optionIds.join(', '))}
654
631
  allowFreeResponse={!askUserUx.options?.length || !!askUserUx.free_response}
655
632
  placeholder={askUserUx.free_response?.placeholder}
@@ -659,6 +636,8 @@ function MessageItemComponent({
659
636
  compact
660
637
  answered={requestInputAnswered}
661
638
  />
639
+ ) : editingAction ? (
640
+ <DocumentEditingActionCard action={editingAction} />
662
641
  ) : (
663
642
  visibleMessageContent && (
664
643
  <div
@@ -674,6 +653,7 @@ function MessageItemComponent({
674
653
  <AttachmentPreviewList
675
654
  items={messageAttachments}
676
655
  artifactRunId={runId}
656
+ onOpenArtifact={onOpenArtifact}
677
657
  variant="message"
678
658
  className={cn(visibleMessageContent && 'mt-3')}
679
659
  StoreLinkComponent={StoreLinkComponent}
@@ -720,7 +700,13 @@ function MessageItemComponent({
720
700
  variant="outline"
721
701
  size="xs"
722
702
  className="px-2 py-1 text-xs"
723
- onClick={() => window.open(url, '_blank')}
703
+ onClick={() => {
704
+ if (/\.md$/i.test(artifactPath) && onOpenArtifact) {
705
+ onOpenArtifact(artifactPath);
706
+ return;
707
+ }
708
+ window.open(url, '_blank');
709
+ }}
724
710
  title={artifactPath}
725
711
  >
726
712
  {displayName}
@@ -787,6 +773,7 @@ const MessageItem = memo(MessageItemComponent, (prevProps, nextProps) => {
787
773
  prevProps.message.workflow_run_id === nextProps.message.workflow_run_id &&
788
774
  prevProps.showPulsatingCircle === nextProps.showPulsatingCircle &&
789
775
  prevProps.onSendMessage === nextProps.onSendMessage &&
776
+ prevProps.onOpenArtifact === nextProps.onOpenArtifact &&
790
777
  prevProps.requestInputAnswered === nextProps.requestInputAnswered &&
791
778
  prevProps.messageStyleOverrides === nextProps.messageStyleOverrides &&
792
779
  MESSAGE_ITEM_CLASS_NAME_KEYS.every((key) => prevProps[key] === nextProps[key])
@@ -0,0 +1,40 @@
1
+ import type { AgentResourceReference } from '@vertesia/common';
2
+ import { Button, cn } from '@vertesia/ui/core';
3
+ import { useUITranslation } from '@vertesia/ui/i18n';
4
+ import { useState } from 'react';
5
+ import { ResourceChipList } from './ResourceChip';
6
+
7
+ const COLLAPSE_THRESHOLD = 5;
8
+
9
+ interface ResourceChangeSummaryProps {
10
+ resources: AgentResourceReference[];
11
+ workflowRunId?: string;
12
+ className?: string;
13
+ }
14
+
15
+ /**
16
+ * End-of-turn summary listing every resource the assistant created/updated/deleted during the turn,
17
+ * as deep-linkable chips. Rendered once the turn is complete, from structured tool metadata rather
18
+ * than parsed prose. Collapses to the first few entries with a "view all" toggle when long.
19
+ */
20
+ export function ResourceChangeSummary({ resources, workflowRunId, className }: ResourceChangeSummaryProps) {
21
+ const { t } = useUITranslation();
22
+ const [expanded, setExpanded] = useState(false);
23
+
24
+ if (resources.length === 0) return null;
25
+
26
+ const collapsible = resources.length > COLLAPSE_THRESHOLD;
27
+ const visible = collapsible && !expanded ? resources.slice(0, COLLAPSE_THRESHOLD) : resources;
28
+
29
+ return (
30
+ <div className={cn('mx-auto w-full max-w-3xl py-2', className)} data-agent-resource-summary>
31
+ <div className="mb-2 text-xs font-medium text-muted">{t('agent.resourcesChanged')}</div>
32
+ <ResourceChipList resources={visible} workflowRunId={workflowRunId} />
33
+ {collapsible && (
34
+ <Button variant="outline" size="xs" className="mt-2" onClick={() => setExpanded((prev) => !prev)}>
35
+ {expanded ? t('agent.resourceShowLess') : t('agent.resourceViewAll', { total: resources.length })}
36
+ </Button>
37
+ )}
38
+ </div>
39
+ );
40
+ }
@@ -0,0 +1,148 @@
1
+ // @vitest-environment jsdom
2
+
3
+ import { cleanup, fireEvent, render, screen } from '@testing-library/react';
4
+ import type { AgentResourceReference } from '@vertesia/common';
5
+ import {
6
+ Boxes,
7
+ BrainCircuit,
8
+ Database,
9
+ FileType,
10
+ MessagesSquare,
11
+ PanelsTopLeft,
12
+ PlayCircle,
13
+ SquareTerminal,
14
+ Workflow,
15
+ } from 'lucide-react';
16
+ import type React from 'react';
17
+ import { afterEach, describe, expect, it, vi } from 'vitest';
18
+ import { I18nProvider } from '../../../../i18n/index.js';
19
+ import { ReactRouterContext, type RouterContext } from '../../../../router/index.js';
20
+ import { AgentResourceResolverProvider } from '../../../../widgets/markdown/AgentResourceResolver';
21
+ import { ResourceChangeSummary } from './ResourceChangeSummary';
22
+ import { ResourceChip } from './ResourceChip';
23
+ import { getResourceIcon } from './resourceLinks';
24
+
25
+ function makeRouterContext(): RouterContext {
26
+ return {
27
+ location: window.location,
28
+ route: { path: '/', Component: () => null },
29
+ params: {},
30
+ state: null,
31
+ matchedRoutePath: '/',
32
+ navigate: vi.fn(),
33
+ router: {
34
+ navigate: vi.fn(),
35
+ getTopRouter: () => ({ navigator: { addStickyParams: (href: string) => href } }),
36
+ },
37
+ } as unknown as RouterContext;
38
+ }
39
+
40
+ function renderWithProviders(ui: React.ReactNode) {
41
+ return render(
42
+ <I18nProvider lng="en">
43
+ <ReactRouterContext.Provider value={makeRouterContext()}>{ui}</ReactRouterContext.Provider>
44
+ </I18nProvider>,
45
+ );
46
+ }
47
+
48
+ const ref = (over: Partial<AgentResourceReference> = {}): AgentResourceReference => ({
49
+ type: 'document',
50
+ id: 'd1',
51
+ label: 'My Document',
52
+ action: 'created',
53
+ ...over,
54
+ });
55
+
56
+ afterEach(() => cleanup());
57
+
58
+ describe('ResourceChip', () => {
59
+ it('uses the same icons as the Studio navigation', () => {
60
+ expect(getResourceIcon('document')).toBe(Database);
61
+ expect(getResourceIcon('collection')).toBe(Boxes);
62
+ expect(getResourceIcon('content_type')).toBe(FileType);
63
+ expect(getResourceIcon('interaction')).toBe(MessagesSquare);
64
+ expect(getResourceIcon('prompt')).toBe(SquareTerminal);
65
+ expect(getResourceIcon('agent')).toBe(BrainCircuit);
66
+ expect(getResourceIcon('workflow')).toBe(Workflow);
67
+ expect(getResourceIcon('process')).toBe(Workflow);
68
+ expect(getResourceIcon('process_run')).toBe(PlayCircle);
69
+ expect(getResourceIcon('interaction_run')).toBe(PlayCircle);
70
+ expect(getResourceIcon('view')).toBe(PanelsTopLeft);
71
+ });
72
+
73
+ it('renders a navigable link supplied by the host resolver', () => {
74
+ renderWithProviders(
75
+ <AgentResourceResolverProvider value={() => ({ kind: 'navigate', href: '/documents/d1' })}>
76
+ <ResourceChip resource={ref()} />
77
+ </AgentResourceResolverProvider>,
78
+ );
79
+ const link = screen.getByRole('link', { name: /My Document/ });
80
+ expect(link.getAttribute('href')).toContain('/documents/d1');
81
+ expect(screen.getByText('Created')).not.toBeNull();
82
+ });
83
+
84
+ it('renders a non-interactive chip when the host does not configure a resolver', () => {
85
+ renderWithProviders(<ResourceChip resource={ref({ type: 'interaction', id: 'int-1', label: 'Chat' })} />);
86
+ expect(screen.queryByRole('link')).toBeNull();
87
+ expect(screen.getByText('Chat')).not.toBeNull();
88
+ });
89
+
90
+ it('renders a deleted resource as a non-interactive chip (no link)', () => {
91
+ renderWithProviders(<ResourceChip resource={ref({ action: 'deleted', label: 'Gone' })} />);
92
+ expect(screen.queryByRole('link')).toBeNull();
93
+ expect(screen.getByText('Gone')).not.toBeNull();
94
+ expect(screen.getByText('Deleted')).not.toBeNull();
95
+ });
96
+
97
+ it('honors a resolver override from context', () => {
98
+ renderWithProviders(
99
+ <AgentResourceResolverProvider value={() => ({ kind: 'navigate', href: '/custom/path' })}>
100
+ <ResourceChip resource={ref()} />
101
+ </AgentResourceResolverProvider>,
102
+ );
103
+ expect(screen.getByRole('link').getAttribute('href')).toContain('/custom/path');
104
+ });
105
+
106
+ it('supports a host activation callback instead of navigation', () => {
107
+ const onActivate = vi.fn();
108
+ renderWithProviders(
109
+ <AgentResourceResolverProvider value={() => ({ kind: 'activate', onActivate })}>
110
+ <ResourceChip resource={ref()} />
111
+ </AgentResourceResolverProvider>,
112
+ );
113
+
114
+ fireEvent.click(screen.getByRole('button', { name: /My Document/ }));
115
+ expect(onActivate).toHaveBeenCalledOnce();
116
+ expect(screen.queryByRole('link')).toBeNull();
117
+ });
118
+ });
119
+
120
+ describe('ResourceChangeSummary', () => {
121
+ it('renders nothing when there are no resources', () => {
122
+ const { container } = renderWithProviders(<ResourceChangeSummary resources={[]} />);
123
+ expect(container.querySelector('[data-agent-resource-summary]')).toBeNull();
124
+ });
125
+
126
+ it('renders a header and a chip per resource', () => {
127
+ const { container } = renderWithProviders(
128
+ <ResourceChangeSummary
129
+ resources={[ref({ id: 'd1', label: 'Doc One' }), ref({ type: 'collection', id: 'c1', label: 'Col' })]}
130
+ />,
131
+ );
132
+ expect(container.querySelector('[data-agent-resource-summary]')?.className).not.toContain('bg-muted');
133
+ expect(screen.getByText('Resources changed')).not.toBeNull();
134
+ expect(screen.getByText('Doc One')).not.toBeNull();
135
+ expect(screen.getByText('Col')).not.toBeNull();
136
+ });
137
+
138
+ it('collapses beyond five resources and expands on click', () => {
139
+ const many = Array.from({ length: 7 }, (_, i) => ref({ id: `d${i}`, label: `Doc ${i}` }));
140
+ renderWithProviders(<ResourceChangeSummary resources={many} />);
141
+ // Only 5 shown initially
142
+ expect(screen.queryByText('Doc 5')).toBeNull();
143
+ const toggle = screen.getByRole('button', { name: /View all 7 changes/ });
144
+ fireEvent.click(toggle);
145
+ expect(screen.getByText('Doc 5')).not.toBeNull();
146
+ expect(screen.getByText('Doc 6')).not.toBeNull();
147
+ });
148
+ });