@vertesia/ui 1.5.0-dev.20260807.073259Z → 1.5.0-dev.20260901.005903Z

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 (502) hide show
  1. package/README.md +1 -7
  2. package/lib/core/components/FormItem.d.ts.map +1 -1
  3. package/lib/core/components/FormItem.js +2 -3
  4. package/lib/core/components/FormItem.js.map +1 -1
  5. package/lib/core/components/InfoTip.d.ts +20 -0
  6. package/lib/core/components/InfoTip.d.ts.map +1 -0
  7. package/lib/core/components/InfoTip.js +18 -0
  8. package/lib/core/components/InfoTip.js.map +1 -0
  9. package/lib/core/components/index.d.ts +1 -0
  10. package/lib/core/components/index.d.ts.map +1 -1
  11. package/lib/core/components/index.js +1 -0
  12. package/lib/core/components/index.js.map +1 -1
  13. package/lib/core/components/shadcn/Panel.d.ts.map +1 -1
  14. package/lib/core/components/shadcn/Panel.js +3 -3
  15. package/lib/core/components/shadcn/Panel.js.map +1 -1
  16. package/lib/core/components/shadcn/filters/comboBox/DateCombobox.js +1 -1
  17. package/lib/core/components/shadcn/filters/comboBox/DateCombobox.js.map +1 -1
  18. package/lib/core/components/shadcn/filters/filter/dateFilter.d.ts.map +1 -1
  19. package/lib/core/components/shadcn/filters/filter/dateFilter.js +1 -1
  20. package/lib/core/components/shadcn/filters/filter/dateFilter.js.map +1 -1
  21. package/lib/core/components/shadcn/filters/filters.d.ts.map +1 -1
  22. package/lib/core/components/shadcn/filters/filters.js +1 -1
  23. package/lib/core/components/shadcn/filters/filters.js.map +1 -1
  24. package/lib/core/components/shadcn/index.d.ts +1 -0
  25. package/lib/core/components/shadcn/index.d.ts.map +1 -1
  26. package/lib/core/components/shadcn/index.js +1 -0
  27. package/lib/core/components/shadcn/index.js.map +1 -1
  28. package/lib/core/components/shadcn/modal/dialog.d.ts.map +1 -1
  29. package/lib/core/components/shadcn/modal/dialog.js +1 -3
  30. package/lib/core/components/shadcn/modal/dialog.js.map +1 -1
  31. package/lib/core/components/shadcn/overflowTabs.d.ts +59 -0
  32. package/lib/core/components/shadcn/overflowTabs.d.ts.map +1 -0
  33. package/lib/core/components/shadcn/overflowTabs.js +173 -0
  34. package/lib/core/components/shadcn/overflowTabs.js.map +1 -0
  35. package/lib/core/components/shadcn/selectBox.js +2 -2
  36. package/lib/core/components/shadcn/selectBox.js.map +1 -1
  37. package/lib/core/components/shadcn/theme/ThemeProvider.d.ts +3 -1
  38. package/lib/core/components/shadcn/theme/ThemeProvider.d.ts.map +1 -1
  39. package/lib/core/components/shadcn/theme/ThemeProvider.js +8 -9
  40. package/lib/core/components/shadcn/theme/ThemeProvider.js.map +1 -1
  41. package/lib/core/utils/dayjs.d.ts +12 -0
  42. package/lib/core/utils/dayjs.d.ts.map +1 -0
  43. package/lib/core/utils/dayjs.js +16 -0
  44. package/lib/core/utils/dayjs.js.map +1 -0
  45. package/lib/env/index.d.ts +17 -0
  46. package/lib/env/index.d.ts.map +1 -1
  47. package/lib/env/index.js +18 -1
  48. package/lib/env/index.js.map +1 -1
  49. package/lib/features/agent/PayloadBuilder.d.ts +1 -0
  50. package/lib/features/agent/PayloadBuilder.d.ts.map +1 -1
  51. package/lib/features/agent/PayloadBuilder.js +22 -5
  52. package/lib/features/agent/PayloadBuilder.js.map +1 -1
  53. package/lib/features/agent/chat/AgentRightPanel.d.ts.map +1 -1
  54. package/lib/features/agent/chat/AgentRightPanel.js +3 -135
  55. package/lib/features/agent/chat/AgentRightPanel.js.map +1 -1
  56. package/lib/features/agent/chat/ArtifactsTab.d.ts.map +1 -1
  57. package/lib/features/agent/chat/ArtifactsTab.js +1 -1
  58. package/lib/features/agent/chat/ArtifactsTab.js.map +1 -1
  59. package/lib/features/agent/chat/AskUserWidget.d.ts.map +1 -1
  60. package/lib/features/agent/chat/AskUserWidget.js +19 -4
  61. package/lib/features/agent/chat/AskUserWidget.js.map +1 -1
  62. package/lib/features/agent/chat/ModernAgentConversation.d.ts +6 -0
  63. package/lib/features/agent/chat/ModernAgentConversation.d.ts.map +1 -1
  64. package/lib/features/agent/chat/ModernAgentConversation.js +99 -29
  65. package/lib/features/agent/chat/ModernAgentConversation.js.map +1 -1
  66. package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.d.ts.map +1 -1
  67. package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.js +10 -9
  68. package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.js.map +1 -1
  69. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts.map +1 -1
  70. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js +5 -8
  71. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -1
  72. package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.d.ts.map +1 -1
  73. package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.js +45 -4
  74. package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.js.map +1 -1
  75. package/lib/features/agent/chat/ModernAgentOutput/BatchProgressPanel.js +1 -1
  76. package/lib/features/agent/chat/ModernAgentOutput/BatchProgressPanel.js.map +1 -1
  77. package/lib/features/agent/chat/ModernAgentOutput/Header.d.ts.map +1 -1
  78. package/lib/features/agent/chat/ModernAgentOutput/Header.js +3 -3
  79. package/lib/features/agent/chat/ModernAgentOutput/Header.js.map +1 -1
  80. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.d.ts.map +1 -1
  81. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js +1 -1
  82. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js.map +1 -1
  83. package/lib/features/agent/chat/ModernAgentOutput/StreamingMessage.d.ts.map +1 -1
  84. package/lib/features/agent/chat/ModernAgentOutput/StreamingMessage.js +1 -1
  85. package/lib/features/agent/chat/ModernAgentOutput/StreamingMessage.js.map +1 -1
  86. package/lib/features/agent/chat/ModernAgentOutput/ToolCallGroup.js +1 -1
  87. package/lib/features/agent/chat/ModernAgentOutput/ToolCallGroup.js.map +1 -1
  88. package/lib/features/agent/chat/ModernAgentOutput/WorkstreamTabs.d.ts.map +1 -1
  89. package/lib/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js +9 -121
  90. package/lib/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js.map +1 -1
  91. package/lib/features/agent/chat/ModernAgentOutput/utils.d.ts +6 -0
  92. package/lib/features/agent/chat/ModernAgentOutput/utils.d.ts.map +1 -1
  93. package/lib/features/agent/chat/ModernAgentOutput/utils.js +19 -11
  94. package/lib/features/agent/chat/ModernAgentOutput/utils.js.map +1 -1
  95. package/lib/features/agent/chat/VegaLiteChart.d.ts.map +1 -1
  96. package/lib/features/agent/chat/VegaLiteChart.js +11 -3
  97. package/lib/features/agent/chat/VegaLiteChart.js.map +1 -1
  98. package/lib/features/agent/chat/hooks/useAgentStream.d.ts.map +1 -1
  99. package/lib/features/agent/chat/hooks/useAgentStream.js +3 -0
  100. package/lib/features/agent/chat/hooks/useAgentStream.js.map +1 -1
  101. package/lib/features/document-viewer/UniversalDocumentViewer.d.ts.map +1 -1
  102. package/lib/features/document-viewer/UniversalDocumentViewer.js +1 -1
  103. package/lib/features/document-viewer/UniversalDocumentViewer.js.map +1 -1
  104. package/lib/features/facets/AgentRunnerFacetsNav.d.ts +14 -2
  105. package/lib/features/facets/AgentRunnerFacetsNav.d.ts.map +1 -1
  106. package/lib/features/facets/AgentRunnerFacetsNav.js +20 -2
  107. package/lib/features/facets/AgentRunnerFacetsNav.js.map +1 -1
  108. package/lib/features/facets/CollectionsFacetsNav.d.ts +3 -3
  109. package/lib/features/facets/CollectionsFacetsNav.d.ts.map +1 -1
  110. package/lib/features/facets/CollectionsFacetsNav.js +6 -1
  111. package/lib/features/facets/CollectionsFacetsNav.js.map +1 -1
  112. package/lib/features/facets/DocumentsFacetsNav.d.ts +3 -3
  113. package/lib/features/facets/DocumentsFacetsNav.d.ts.map +1 -1
  114. package/lib/features/facets/DocumentsFacetsNav.js +20 -8
  115. package/lib/features/facets/DocumentsFacetsNav.js.map +1 -1
  116. package/lib/features/facets/InteractionsFacetsNav.d.ts +3 -3
  117. package/lib/features/facets/InteractionsFacetsNav.d.ts.map +1 -1
  118. package/lib/features/facets/InteractionsFacetsNav.js +11 -1
  119. package/lib/features/facets/InteractionsFacetsNav.js.map +1 -1
  120. package/lib/features/facets/PromptsFacetsNav.d.ts +3 -3
  121. package/lib/features/facets/PromptsFacetsNav.d.ts.map +1 -1
  122. package/lib/features/facets/PromptsFacetsNav.js +6 -1
  123. package/lib/features/facets/PromptsFacetsNav.js.map +1 -1
  124. package/lib/features/facets/RunsFacetsNav.d.ts +4 -14
  125. package/lib/features/facets/RunsFacetsNav.d.ts.map +1 -1
  126. package/lib/features/facets/RunsFacetsNav.js +26 -15
  127. package/lib/features/facets/RunsFacetsNav.js.map +1 -1
  128. package/lib/features/facets/WorkflowExecutionsFacetsNav.d.ts +4 -3
  129. package/lib/features/facets/WorkflowExecutionsFacetsNav.d.ts.map +1 -1
  130. package/lib/features/facets/WorkflowExecutionsFacetsNav.js +18 -10
  131. package/lib/features/facets/WorkflowExecutionsFacetsNav.js.map +1 -1
  132. package/lib/features/facets/index.d.ts +1 -1
  133. package/lib/features/facets/index.d.ts.map +1 -1
  134. package/lib/features/facets/index.js.map +1 -1
  135. package/lib/features/facets/utils/SearchInterface.d.ts +4 -3
  136. package/lib/features/facets/utils/SearchInterface.d.ts.map +1 -1
  137. package/lib/features/facets/utils/SearchInterface.js +4 -0
  138. package/lib/features/facets/utils/SearchInterface.js.map +1 -1
  139. package/lib/features/layout/GenericPageNavHeader.d.ts +8 -1
  140. package/lib/features/layout/GenericPageNavHeader.d.ts.map +1 -1
  141. package/lib/features/layout/GenericPageNavHeader.js +9 -1
  142. package/lib/features/layout/GenericPageNavHeader.js.map +1 -1
  143. package/lib/features/magic-pdf/DownloadPopover.d.ts +3 -2
  144. package/lib/features/magic-pdf/DownloadPopover.d.ts.map +1 -1
  145. package/lib/features/magic-pdf/DownloadPopover.js.map +1 -1
  146. package/lib/features/magic-pdf/GroundedExtractionView.d.ts.map +1 -1
  147. package/lib/features/magic-pdf/GroundedExtractionView.js +51 -64
  148. package/lib/features/magic-pdf/GroundedExtractionView.js.map +1 -1
  149. package/lib/features/oauth/McpConnectionsButton.d.ts +1 -1
  150. package/lib/features/oauth/McpConnectionsButton.d.ts.map +1 -1
  151. package/lib/features/oauth/McpConnectionsButton.js +2 -2
  152. package/lib/features/oauth/McpConnectionsButton.js.map +1 -1
  153. package/lib/features/oauth/McpConnectionsDialog.d.ts +1 -1
  154. package/lib/features/oauth/McpConnectionsDialog.js +2 -2
  155. package/lib/features/oauth/McpConnectionsDialog.js.map +1 -1
  156. package/lib/features/oauth/useMcpConnections.d.ts +4 -5
  157. package/lib/features/oauth/useMcpConnections.d.ts.map +1 -1
  158. package/lib/features/oauth/useMcpConnections.js +20 -4
  159. package/lib/features/oauth/useMcpConnections.js.map +1 -1
  160. package/lib/features/pdf-viewer/PdfPageRenderer.d.ts.map +1 -1
  161. package/lib/features/pdf-viewer/PdfPageRenderer.js +9 -11
  162. package/lib/features/pdf-viewer/PdfPageRenderer.js.map +1 -1
  163. package/lib/features/pdf-viewer/lazyReactPdf.d.ts +10 -0
  164. package/lib/features/pdf-viewer/lazyReactPdf.d.ts.map +1 -0
  165. package/lib/features/pdf-viewer/lazyReactPdf.js +25 -0
  166. package/lib/features/pdf-viewer/lazyReactPdf.js.map +1 -0
  167. package/lib/features/store/collections/CollectionsTable.d.ts.map +1 -1
  168. package/lib/features/store/collections/CollectionsTable.js +1 -3
  169. package/lib/features/store/collections/CollectionsTable.js.map +1 -1
  170. package/lib/features/store/collections/EditCollectionView.js +1 -1
  171. package/lib/features/store/collections/EditCollectionView.js.map +1 -1
  172. package/lib/features/store/objects/ExportPropertiesModal.d.ts +3 -1
  173. package/lib/features/store/objects/ExportPropertiesModal.d.ts.map +1 -1
  174. package/lib/features/store/objects/ExportPropertiesModal.js +5 -5
  175. package/lib/features/store/objects/ExportPropertiesModal.js.map +1 -1
  176. package/lib/features/store/objects/components/ContentOverview.d.ts.map +1 -1
  177. package/lib/features/store/objects/components/ContentOverview.js +4 -10
  178. package/lib/features/store/objects/components/ContentOverview.js.map +1 -1
  179. package/lib/features/store/objects/components/TextEditorPanel.d.ts.map +1 -1
  180. package/lib/features/store/objects/components/TextEditorPanel.js +8 -3
  181. package/lib/features/store/objects/components/TextEditorPanel.js.map +1 -1
  182. package/lib/features/store/objects/layout/renderers.d.ts.map +1 -1
  183. package/lib/features/store/objects/layout/renderers.js +1 -5
  184. package/lib/features/store/objects/layout/renderers.js.map +1 -1
  185. package/lib/features/store/objects/search/DocumentSearchContext.d.ts +44 -62
  186. package/lib/features/store/objects/search/DocumentSearchContext.d.ts.map +1 -1
  187. package/lib/features/store/objects/search/DocumentSearchContext.js +47 -2
  188. package/lib/features/store/objects/search/DocumentSearchContext.js.map +1 -1
  189. package/lib/features/store/objects/selection/actions/DeleteObjectsAction.d.ts.map +1 -1
  190. package/lib/features/store/objects/selection/actions/DeleteObjectsAction.js +5 -0
  191. package/lib/features/store/objects/selection/actions/DeleteObjectsAction.js.map +1 -1
  192. package/lib/features/store/objects/upload/DocumentUploadModal.d.ts +6 -1
  193. package/lib/features/store/objects/upload/DocumentUploadModal.d.ts.map +1 -1
  194. package/lib/features/store/objects/upload/DocumentUploadModal.js +4 -3
  195. package/lib/features/store/objects/upload/DocumentUploadModal.js.map +1 -1
  196. package/lib/features/store/objects/upload/useSmartFileUploadProcessing.d.ts.map +1 -1
  197. package/lib/features/store/objects/upload/useSmartFileUploadProcessing.js +2 -2
  198. package/lib/features/store/objects/upload/useSmartFileUploadProcessing.js.map +1 -1
  199. package/lib/features/store/types/ContentObjectTypesTable.d.ts.map +1 -1
  200. package/lib/features/store/types/ContentObjectTypesTable.js +1 -3
  201. package/lib/features/store/types/ContentObjectTypesTable.js.map +1 -1
  202. package/lib/features/store/types/IntakePolicyEditor.d.ts.map +1 -1
  203. package/lib/features/store/types/IntakePolicyEditor.js +12 -2
  204. package/lib/features/store/types/IntakePolicyEditor.js.map +1 -1
  205. package/lib/features/store/types/IntakePolicyForm.d.ts.map +1 -1
  206. package/lib/features/store/types/IntakePolicyForm.js +15 -15
  207. package/lib/features/store/types/IntakePolicyForm.js.map +1 -1
  208. package/lib/features/store/types/ObjectSchemaEditor.d.ts.map +1 -1
  209. package/lib/features/store/types/ObjectSchemaEditor.js +6 -2
  210. package/lib/features/store/types/ObjectSchemaEditor.js.map +1 -1
  211. package/lib/features/store/types/TableLayoutEditor.d.ts.map +1 -1
  212. package/lib/features/store/types/TableLayoutEditor.js +2 -0
  213. package/lib/features/store/types/TableLayoutEditor.js.map +1 -1
  214. package/lib/features/store/types/TypeRegistry.d.ts +282 -0
  215. package/lib/features/store/types/TypeRegistry.d.ts.map +1 -1
  216. package/lib/features/store/types/search/ObjectTypeSearchContext.d.ts +281 -0
  217. package/lib/features/store/types/search/ObjectTypeSearchContext.d.ts.map +1 -1
  218. package/lib/features/user/UserInfo.d.ts.map +1 -1
  219. package/lib/features/user/UserInfo.js +2 -4
  220. package/lib/features/user/UserInfo.js.map +1 -1
  221. package/lib/features/views/ViewActions.d.ts +32 -0
  222. package/lib/features/views/ViewActions.d.ts.map +1 -0
  223. package/lib/features/views/ViewActions.js +186 -0
  224. package/lib/features/views/ViewActions.js.map +1 -0
  225. package/lib/features/views/ViewDropTarget.d.ts +15 -0
  226. package/lib/features/views/ViewDropTarget.d.ts.map +1 -0
  227. package/lib/features/views/ViewDropTarget.js +79 -0
  228. package/lib/features/views/ViewDropTarget.js.map +1 -0
  229. package/lib/features/views/ViewExperience.d.ts +3 -2
  230. package/lib/features/views/ViewExperience.d.ts.map +1 -1
  231. package/lib/features/views/ViewExperience.js +103 -12
  232. package/lib/features/views/ViewExperience.js.map +1 -1
  233. package/lib/features/views/ViewNavigation.d.ts +1 -1
  234. package/lib/features/views/ViewNavigation.d.ts.map +1 -1
  235. package/lib/features/views/ViewNavigation.js +14 -5
  236. package/lib/features/views/ViewNavigation.js.map +1 -1
  237. package/lib/features/views/ViewResults.d.ts +1 -1
  238. package/lib/features/views/ViewResults.d.ts.map +1 -1
  239. package/lib/features/views/ViewResults.js +124 -34
  240. package/lib/features/views/ViewResults.js.map +1 -1
  241. package/lib/features/views/index.d.ts +1 -0
  242. package/lib/features/views/index.d.ts.map +1 -1
  243. package/lib/features/views/index.js +1 -0
  244. package/lib/features/views/index.js.map +1 -1
  245. package/lib/features/views/types.d.ts +46 -1
  246. package/lib/features/views/types.d.ts.map +1 -1
  247. package/lib/features/views/viewState.d.ts.map +1 -1
  248. package/lib/features/views/viewState.js +34 -0
  249. package/lib/features/views/viewState.js.map +1 -1
  250. package/lib/i18n/LanguageProvider.d.ts +3 -1
  251. package/lib/i18n/LanguageProvider.d.ts.map +1 -1
  252. package/lib/i18n/LanguageProvider.js +9 -7
  253. package/lib/i18n/LanguageProvider.js.map +1 -1
  254. package/lib/i18n/instance.d.ts +2 -0
  255. package/lib/i18n/instance.d.ts.map +1 -1
  256. package/lib/i18n/instance.js +45 -26
  257. package/lib/i18n/instance.js.map +1 -1
  258. package/lib/i18n/locales/ar.json +296 -15
  259. package/lib/i18n/locales/de.json +294 -13
  260. package/lib/i18n/locales/en.json +65 -4
  261. package/lib/i18n/locales/es.json +295 -14
  262. package/lib/i18n/locales/fr.json +294 -13
  263. package/lib/i18n/locales/it.json +294 -13
  264. package/lib/i18n/locales/ja.json +292 -10
  265. package/lib/i18n/locales/ko.json +292 -10
  266. package/lib/i18n/locales/pt.json +294 -13
  267. package/lib/i18n/locales/ru.json +291 -10
  268. package/lib/i18n/locales/tr.json +291 -10
  269. package/lib/i18n/locales/zh-TW.json +292 -10
  270. package/lib/i18n/locales/zh.json +292 -10
  271. package/lib/router/RouteComponent.d.ts +8 -0
  272. package/lib/router/RouteComponent.d.ts.map +1 -1
  273. package/lib/router/RouteComponent.js +41 -9
  274. package/lib/router/RouteComponent.js.map +1 -1
  275. package/lib/session/UserSessionProvider.d.ts.map +1 -1
  276. package/lib/session/UserSessionProvider.js +20 -29
  277. package/lib/session/UserSessionProvider.js.map +1 -1
  278. package/lib/session/auth/composable.d.ts.map +1 -1
  279. package/lib/session/auth/composable.js +25 -19
  280. package/lib/session/auth/composable.js.map +1 -1
  281. package/lib/session/auth/domainRouting.d.ts +11 -0
  282. package/lib/session/auth/domainRouting.d.ts.map +1 -1
  283. package/lib/session/auth/domainRouting.js +13 -0
  284. package/lib/session/auth/domainRouting.js.map +1 -1
  285. package/lib/session/auth/firebase.js +1 -1
  286. package/lib/session/auth/firebase.js.map +1 -1
  287. package/lib/session/useUXTracking.d.ts.map +1 -1
  288. package/lib/session/useUXTracking.js +6 -1
  289. package/lib/session/useUXTracking.js.map +1 -1
  290. package/lib/shell/VertesiaShell.d.ts.map +1 -1
  291. package/lib/shell/VertesiaShell.js +2 -1
  292. package/lib/shell/VertesiaShell.js.map +1 -1
  293. package/lib/shell/apps/AppInstallationProvider.d.ts +4 -2
  294. package/lib/shell/apps/AppInstallationProvider.d.ts.map +1 -1
  295. package/lib/shell/apps/IframeAppContextSync.d.ts +3 -0
  296. package/lib/shell/apps/IframeAppContextSync.d.ts.map +1 -0
  297. package/lib/shell/apps/IframeAppContextSync.js +95 -0
  298. package/lib/shell/apps/IframeAppContextSync.js.map +1 -0
  299. package/lib/shell/apps/iframe-auth.d.ts +55 -0
  300. package/lib/shell/apps/iframe-auth.d.ts.map +1 -0
  301. package/lib/shell/apps/iframe-auth.js +154 -0
  302. package/lib/shell/apps/iframe-auth.js.map +1 -0
  303. package/lib/shell/apps/index.d.ts +2 -0
  304. package/lib/shell/apps/index.d.ts.map +1 -1
  305. package/lib/shell/apps/index.js +2 -0
  306. package/lib/shell/apps/index.js.map +1 -1
  307. package/lib/vertesia-ui-core.js +199 -4
  308. package/lib/vertesia-ui-core.js.map +1 -1
  309. package/lib/vertesia-ui-env.js +1 -1
  310. package/lib/vertesia-ui-env.js.map +1 -1
  311. package/lib/vertesia-ui-features.js +975 -35
  312. package/lib/vertesia-ui-features.js.map +1 -1
  313. package/lib/vertesia-ui-i18n.BJBGsq-8.chunk.js +5 -0
  314. package/lib/vertesia-ui-i18n.BJBGsq-8.chunk.js.map +1 -0
  315. package/lib/vertesia-ui-i18n.BY5YG5cX.chunk.js +5 -0
  316. package/lib/vertesia-ui-i18n.BY5YG5cX.chunk.js.map +1 -0
  317. package/lib/vertesia-ui-i18n.Bd5_1BXO.chunk.js +5 -0
  318. package/lib/vertesia-ui-i18n.Bd5_1BXO.chunk.js.map +1 -0
  319. package/lib/vertesia-ui-i18n.Bvwej2HH.chunk.js +5 -0
  320. package/lib/vertesia-ui-i18n.Bvwej2HH.chunk.js.map +1 -0
  321. package/lib/vertesia-ui-i18n.CMT3f4gf.chunk.js +5 -0
  322. package/lib/vertesia-ui-i18n.CMT3f4gf.chunk.js.map +1 -0
  323. package/lib/vertesia-ui-i18n.D56DNPJW.chunk.js +5 -0
  324. package/lib/vertesia-ui-i18n.D56DNPJW.chunk.js.map +1 -0
  325. package/lib/vertesia-ui-i18n.DDzKLNx6.chunk.js +5 -0
  326. package/lib/vertesia-ui-i18n.DDzKLNx6.chunk.js.map +1 -0
  327. package/lib/vertesia-ui-i18n.D_Am1LpF.chunk.js +5 -0
  328. package/lib/vertesia-ui-i18n.D_Am1LpF.chunk.js.map +1 -0
  329. package/lib/vertesia-ui-i18n.DrZizgGV.chunk.js +5 -0
  330. package/lib/vertesia-ui-i18n.DrZizgGV.chunk.js.map +1 -0
  331. package/lib/vertesia-ui-i18n.DwHsq86z.chunk.js +5 -0
  332. package/lib/vertesia-ui-i18n.DwHsq86z.chunk.js.map +1 -0
  333. package/lib/vertesia-ui-i18n.PLpo0Bbz.chunk.js +5 -0
  334. package/lib/vertesia-ui-i18n.PLpo0Bbz.chunk.js.map +1 -0
  335. package/lib/vertesia-ui-i18n.js +2 -38
  336. package/lib/vertesia-ui-i18n.js.map +1 -1
  337. package/lib/vertesia-ui-i18n.xVbXALqz.chunk.js +5 -0
  338. package/lib/vertesia-ui-i18n.xVbXALqz.chunk.js.map +1 -0
  339. package/lib/vertesia-ui-layout.js +80 -1
  340. package/lib/vertesia-ui-layout.js.map +1 -1
  341. package/lib/vertesia-ui-rich-text.js +278 -4
  342. package/lib/vertesia-ui-rich-text.js.map +1 -1
  343. package/lib/vertesia-ui-router.js +1 -1
  344. package/lib/vertesia-ui-router.js.map +1 -1
  345. package/lib/vertesia-ui-session.js +1 -1
  346. package/lib/vertesia-ui-session.js.map +1 -1
  347. package/lib/vertesia-ui-shell.js +118 -1
  348. package/lib/vertesia-ui-shell.js.map +1 -1
  349. package/lib/vertesia-ui-widgets.js +336 -20
  350. package/lib/vertesia-ui-widgets.js.map +1 -1
  351. package/lib/widgets/markdown/MarkdownRenderer.d.ts.map +1 -1
  352. package/lib/widgets/markdown/MarkdownRenderer.js +43 -2
  353. package/lib/widgets/markdown/MarkdownRenderer.js.map +1 -1
  354. package/lib/widgets/markdown/MermaidDiagram.d.ts.map +1 -1
  355. package/lib/widgets/markdown/MermaidDiagram.js +35 -22
  356. package/lib/widgets/markdown/MermaidDiagram.js.map +1 -1
  357. package/lib/widgets/monacoEditor/MonacoEditor.d.ts.map +1 -1
  358. package/lib/widgets/monacoEditor/MonacoEditor.js +14 -10
  359. package/lib/widgets/monacoEditor/MonacoEditor.js.map +1 -1
  360. package/lib/widgets/xml-viewer/hooks/useCollapsible.d.ts +1 -1
  361. package/package.json +24 -29
  362. package/src/core/components/FormItem.tsx +2 -5
  363. package/src/core/components/InfoTip.test.tsx +33 -0
  364. package/src/core/components/InfoTip.tsx +32 -0
  365. package/src/core/components/index.ts +1 -0
  366. package/src/core/components/shadcn/Panel.tsx +3 -7
  367. package/src/core/components/shadcn/filters/comboBox/DateCombobox.tsx +1 -1
  368. package/src/core/components/shadcn/filters/filter/dateFilter.tsx +1 -1
  369. package/src/core/components/shadcn/filters/filters.tsx +1 -1
  370. package/src/core/components/shadcn/index.ts +1 -0
  371. package/src/core/components/shadcn/modal/dialog.test.tsx +35 -0
  372. package/src/core/components/shadcn/modal/dialog.tsx +0 -4
  373. package/src/core/components/shadcn/overflowTabs.tsx +320 -0
  374. package/src/core/components/shadcn/selectBox.tsx +2 -2
  375. package/src/core/components/shadcn/theme/ThemeProvider.tsx +10 -9
  376. package/src/core/utils/dayjs.ts +17 -0
  377. package/src/css/base.css +78 -0
  378. package/src/env/index.test.ts +94 -0
  379. package/src/env/index.ts +36 -1
  380. package/src/features/agent/PayloadBuilder.test.ts +68 -0
  381. package/src/features/agent/PayloadBuilder.tsx +28 -4
  382. package/src/features/agent/chat/AgentRightPanel.tsx +2 -252
  383. package/src/features/agent/chat/ArtifactsTab.tsx +1 -0
  384. package/src/features/agent/chat/AskUserWidget.test.tsx +20 -1
  385. package/src/features/agent/chat/AskUserWidget.tsx +22 -6
  386. package/src/features/agent/chat/ModernAgentConversation.test.tsx +160 -0
  387. package/src/features/agent/chat/ModernAgentConversation.tsx +111 -31
  388. package/src/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.tsx +86 -67
  389. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.test.tsx +90 -7
  390. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +4 -6
  391. package/src/features/agent/chat/ModernAgentOutput/AttachmentPreview.test.ts +103 -1
  392. package/src/features/agent/chat/ModernAgentOutput/AttachmentPreview.tsx +50 -4
  393. package/src/features/agent/chat/ModernAgentOutput/BatchProgressPanel.tsx +1 -1
  394. package/src/features/agent/chat/ModernAgentOutput/Header.tsx +18 -1
  395. package/src/features/agent/chat/ModernAgentOutput/MessageItem.tsx +1 -1
  396. package/src/features/agent/chat/ModernAgentOutput/StreamingMessage.tsx +1 -1
  397. package/src/features/agent/chat/ModernAgentOutput/ToolCallGroup.tsx +1 -1
  398. package/src/features/agent/chat/ModernAgentOutput/WorkstreamTabs.tsx +37 -167
  399. package/src/features/agent/chat/ModernAgentOutput/utils.test.ts +94 -0
  400. package/src/features/agent/chat/ModernAgentOutput/utils.ts +19 -10
  401. package/src/features/agent/chat/VegaLiteChart.tsx +32 -14
  402. package/src/features/agent/chat/hooks/useAgentStream.test.tsx +18 -0
  403. package/src/features/agent/chat/hooks/useAgentStream.ts +3 -0
  404. package/src/features/document-viewer/UniversalDocumentViewer.tsx +1 -1
  405. package/src/features/facets/AgentRunnerFacetsNav.tsx +44 -4
  406. package/src/features/facets/CollectionsFacetsNav.tsx +15 -4
  407. package/src/features/facets/DocumentsFacetsNav.tsx +25 -8
  408. package/src/features/facets/FacetQueryHandlers.test.ts +84 -0
  409. package/src/features/facets/InteractionsFacetsNav.tsx +20 -4
  410. package/src/features/facets/PromptsFacetsNav.tsx +15 -4
  411. package/src/features/facets/RunsFacetsNav.test.ts +59 -0
  412. package/src/features/facets/RunsFacetsNav.tsx +40 -30
  413. package/src/features/facets/WorkflowExecutionsFacetsNav.test.ts +57 -0
  414. package/src/features/facets/WorkflowExecutionsFacetsNav.tsx +36 -16
  415. package/src/features/facets/index.ts +1 -0
  416. package/src/features/facets/utils/SearchInterface.tsx +12 -3
  417. package/src/features/layout/GenericPageNavHeader.tsx +16 -0
  418. package/src/features/magic-pdf/DownloadPopover.tsx +1 -2
  419. package/src/features/magic-pdf/GroundedExtractionView.test.tsx +7 -1
  420. package/src/features/magic-pdf/GroundedExtractionView.tsx +162 -242
  421. package/src/features/oauth/McpConnectionsButton.test.tsx +18 -1
  422. package/src/features/oauth/McpConnectionsButton.tsx +6 -2
  423. package/src/features/oauth/McpConnectionsDialog.tsx +3 -3
  424. package/src/features/oauth/useMcpConnections.test.ts +1 -0
  425. package/src/features/oauth/useMcpConnections.ts +24 -7
  426. package/src/features/pdf-viewer/PdfPageRenderer.tsx +76 -71
  427. package/src/features/pdf-viewer/lazyReactPdf.ts +33 -0
  428. package/src/features/store/collections/CollectionsTable.tsx +1 -4
  429. package/src/features/store/collections/EditCollectionView.tsx +1 -1
  430. package/src/features/store/objects/ExportPropertiesModal.tsx +25 -16
  431. package/src/features/store/objects/components/ContentOverview.tsx +2 -28
  432. package/src/features/store/objects/components/TextEditorPanel.tsx +13 -3
  433. package/src/features/store/objects/layout/renderers.tsx +1 -6
  434. package/src/features/store/objects/search/DocumentSearchContext.test.ts +45 -0
  435. package/src/features/store/objects/search/DocumentSearchContext.ts +54 -4
  436. package/src/features/store/objects/selection/actions/DeleteObjectsAction.tsx +5 -0
  437. package/src/features/store/objects/upload/DocumentUploadModal.tsx +10 -3
  438. package/src/features/store/objects/upload/useSmartFileUploadProcessing.ts +15 -6
  439. package/src/features/store/types/ContentObjectTypesTable.tsx +1 -4
  440. package/src/features/store/types/IntakePolicyEditor.tsx +14 -5
  441. package/src/features/store/types/IntakePolicyForm.tsx +120 -20
  442. package/src/features/store/types/ObjectSchemaEditor.tsx +6 -2
  443. package/src/features/store/types/TableLayoutEditor.tsx +2 -0
  444. package/src/features/user/UserInfo.test.tsx +10 -0
  445. package/src/features/user/UserInfo.tsx +2 -7
  446. package/src/features/views/ViewActions.test.tsx +80 -0
  447. package/src/features/views/ViewActions.tsx +352 -0
  448. package/src/features/views/ViewDropTarget.test.tsx +150 -0
  449. package/src/features/views/ViewDropTarget.tsx +140 -0
  450. package/src/features/views/ViewExperience.test.tsx +72 -0
  451. package/src/features/views/ViewExperience.tsx +189 -22
  452. package/src/features/views/ViewMedia.test.tsx +180 -0
  453. package/src/features/views/ViewNavigation.test.tsx +42 -0
  454. package/src/features/views/ViewNavigation.tsx +43 -5
  455. package/src/features/views/ViewResults.tsx +243 -26
  456. package/src/features/views/index.ts +1 -0
  457. package/src/features/views/types.ts +50 -0
  458. package/src/features/views/viewState.test.ts +7 -1
  459. package/src/features/views/viewState.ts +32 -0
  460. package/src/i18n/LanguageProvider.tsx +15 -8
  461. package/src/i18n/instance.test.ts +30 -0
  462. package/src/i18n/instance.ts +67 -40
  463. package/src/i18n/locales/ar.json +1192 -911
  464. package/src/i18n/locales/de.json +1148 -867
  465. package/src/i18n/locales/en.json +65 -4
  466. package/src/i18n/locales/es.json +1159 -878
  467. package/src/i18n/locales/fr.json +1159 -878
  468. package/src/i18n/locales/it.json +1159 -878
  469. package/src/i18n/locales/ja.json +1148 -866
  470. package/src/i18n/locales/ko.json +1148 -866
  471. package/src/i18n/locales/pt.json +1159 -878
  472. package/src/i18n/locales/ru.json +1170 -889
  473. package/src/i18n/locales/tr.json +1148 -867
  474. package/src/i18n/locales/zh-TW.json +1148 -866
  475. package/src/i18n/locales/zh.json +1148 -866
  476. package/src/i18n/rtl.test.ts +16 -7
  477. package/src/rich-text/VertesiaRichTextEditor.test.tsx +33 -1
  478. package/src/router/RouteComponent.test.tsx +139 -0
  479. package/src/router/RouteComponent.tsx +54 -9
  480. package/src/session/UserSessionProvider.tsx +20 -31
  481. package/src/session/auth/composable.scope.test.ts +1 -1
  482. package/src/session/auth/composable.test.ts +61 -1
  483. package/src/session/auth/composable.ts +29 -23
  484. package/src/session/auth/domainRouting.test.ts +24 -1
  485. package/src/session/auth/domainRouting.ts +29 -0
  486. package/src/session/auth/firebase.ts +1 -1
  487. package/src/session/useUXTracking.tsx +6 -1
  488. package/src/shell/VertesiaShell.tsx +2 -0
  489. package/src/shell/apps/IframeAppContextSync.test.tsx +196 -0
  490. package/src/shell/apps/IframeAppContextSync.tsx +101 -0
  491. package/src/shell/apps/iframe-auth.test.ts +118 -0
  492. package/src/shell/apps/iframe-auth.ts +193 -0
  493. package/src/shell/apps/index.ts +2 -0
  494. package/src/widgets/markdown/ArtifactEditingSurface.test.tsx +12 -3
  495. package/src/widgets/markdown/MarkdownRenderer.tsx +50 -2
  496. package/src/widgets/markdown/MermaidDiagram.tsx +38 -22
  497. package/src/widgets/monacoEditor/MonacoEditor.tsx +27 -20
  498. package/lib/features/magic-pdf/GroundedExtractionAssistantPanel.d.ts +0 -25
  499. package/lib/features/magic-pdf/GroundedExtractionAssistantPanel.d.ts.map +0 -1
  500. package/lib/features/magic-pdf/GroundedExtractionAssistantPanel.js +0 -42
  501. package/lib/features/magic-pdf/GroundedExtractionAssistantPanel.js.map +0 -1
  502. package/src/features/magic-pdf/GroundedExtractionAssistantPanel.tsx +0 -86
@@ -52,24 +52,41 @@ function renderSummary(
52
52
  props: Partial<React.ComponentProps<typeof AllMessagesMixed>> = {},
53
53
  ) {
54
54
  const bottomRef = React.createRef<HTMLDivElement>() as React.RefObject<HTMLDivElement>;
55
-
56
- return render(
55
+ const renderConversation = (
56
+ currentMessages: AgentMessage[],
57
+ currentIsCompleted: boolean,
58
+ currentStreamingMessages: Map<string, StreamingData>,
59
+ currentProps: Partial<React.ComponentProps<typeof AllMessagesMixed>>,
60
+ ) => (
57
61
  <I18nProvider lng="en">
58
62
  <ReactRouterContext.Provider value={makeRouterContext()}>
59
63
  <AgentResourceResolverProvider value={testResourceResolver}>
60
64
  <AllMessagesMixed
61
- messages={messages}
65
+ messages={currentMessages}
62
66
  bottomRef={bottomRef}
63
67
  viewMode="sliding"
64
- isCompleted={isCompleted}
68
+ isCompleted={currentIsCompleted}
65
69
  artifactRunId="run-1"
66
- streamingMessages={streamingMessages}
67
- {...props}
70
+ streamingMessages={currentStreamingMessages}
71
+ {...currentProps}
68
72
  />
69
73
  </AgentResourceResolverProvider>
70
74
  </ReactRouterContext.Provider>
71
- </I18nProvider>,
75
+ </I18nProvider>
72
76
  );
77
+
78
+ const result = render(renderConversation(messages, isCompleted, streamingMessages, props));
79
+ return {
80
+ ...result,
81
+ rerenderSummary(
82
+ nextMessages: AgentMessage[],
83
+ nextIsCompleted = false,
84
+ nextStreamingMessages = new Map<string, StreamingData>(),
85
+ nextProps: Partial<React.ComponentProps<typeof AllMessagesMixed>> = {},
86
+ ) {
87
+ result.rerender(renderConversation(nextMessages, nextIsCompleted, nextStreamingMessages, nextProps));
88
+ },
89
+ };
73
90
  }
74
91
 
75
92
  function renderStacked(
@@ -766,6 +783,72 @@ describe('AllMessagesMixed summary view', () => {
766
783
  expect(screen.getByText('Main agent response.')).not.toBeNull();
767
784
  });
768
785
 
786
+ it('keeps streamed and persisted child output in the owning workstream throughout its lifecycle', () => {
787
+ const question = makeMessage({
788
+ timestamp: 1_000,
789
+ type: AgentMessageType.QUESTION,
790
+ message: 'Research the launch plan.',
791
+ });
792
+ const launch = makeMessage({
793
+ timestamp: 2_000,
794
+ type: AgentMessageType.UPDATE,
795
+ message: 'Research workstream launched',
796
+ workstream_id: 'research',
797
+ details: {
798
+ event_class: 'activity',
799
+ workstream_event: 'launched',
800
+ launch_id: 'launch-research',
801
+ workstream_id: 'research',
802
+ child_workflow_id: 'workstream:research',
803
+ child_workflow_run_id: 'run-research',
804
+ },
805
+ });
806
+ const sourceMessages = [question, launch];
807
+ const streamingMessages = new Map<string, StreamingData>([
808
+ [
809
+ 'research-stream',
810
+ {
811
+ text: 'Research is still streaming.',
812
+ startTimestamp: 3_000,
813
+ workstreamId: 'research',
814
+ },
815
+ ],
816
+ ]);
817
+ const { rerenderSummary } = renderSummary(sourceMessages, false, streamingMessages, {
818
+ workstreamSourceMessages: sourceMessages,
819
+ activeWorkstream: 'all',
820
+ });
821
+
822
+ expect(screen.queryByText('Research is still streaming.')).toBeNull();
823
+
824
+ rerenderSummary(sourceMessages, false, streamingMessages, {
825
+ workstreamSourceMessages: sourceMessages,
826
+ activeWorkstream: 'research',
827
+ });
828
+ expect(screen.getByText('Research is still streaming.')).not.toBeNull();
829
+
830
+ const persistedChildAnswer = makeMessage({
831
+ timestamp: 4_000,
832
+ type: AgentMessageType.ANSWER,
833
+ message: 'Research is complete.',
834
+ workstream_id: 'research',
835
+ details: { streamed: true },
836
+ });
837
+ const completedMessages = [...sourceMessages, persistedChildAnswer];
838
+
839
+ rerenderSummary(completedMessages, true, new Map(), {
840
+ workstreamSourceMessages: completedMessages,
841
+ activeWorkstream: 'research',
842
+ });
843
+ expect(screen.getByText('Research is complete.')).not.toBeNull();
844
+
845
+ rerenderSummary(completedMessages, true, new Map(), {
846
+ workstreamSourceMessages: completedMessages,
847
+ activeWorkstream: 'all',
848
+ });
849
+ expect(screen.queryByText('Research is complete.')).toBeNull();
850
+ });
851
+
769
852
  it('renders first child workflow activity as a workstream row when the launch event is missing', () => {
770
853
  renderSummary(
771
854
  [
@@ -93,6 +93,7 @@ import {
93
93
  getWorkstreamId,
94
94
  groupMessagesWithStreaming,
95
95
  isInProgress,
96
+ isStreamingDataVisibleInWorkstream,
96
97
  isToolActivityMessage,
97
98
  isToolPreambleMessage,
98
99
  isUserStoppedMessage,
@@ -2867,11 +2868,7 @@ function AllMessagesMixedComponent({
2867
2868
  const complete = new Map<string, StreamingData>();
2868
2869
  const incomplete: Array<{ id: string; data: StreamingData }> = [];
2869
2870
  streamingMessages.forEach((data, id) => {
2870
- // Filter by workstream if specified
2871
- if (activeWorkstream && activeWorkstream !== 'all') {
2872
- const streamWorkstream = data.workstreamId || 'main';
2873
- if (activeWorkstream !== streamWorkstream) return;
2874
- }
2871
+ if (!isStreamingDataVisibleInWorkstream(data, activeWorkstream)) return;
2875
2872
 
2876
2873
  // If a newer persisted message exists, this stream is stale and should be
2877
2874
  // treated as complete for ordering purposes.
@@ -3353,9 +3350,10 @@ function AllMessagesMixedComponent({
3353
3350
  )}
3354
3351
 
3355
3352
  {displayMessages.length === 0 &&
3353
+ incompleteStreaming.length === 0 &&
3356
3354
  !hasRenderableInitialRequest &&
3357
3355
  !(isSummaryView && showActivityFallback) ? (
3358
- activeWorkstream === 'all' && isAgentWorking && incompleteStreaming.length === 0 ? (
3356
+ activeWorkstream === 'all' && isAgentWorking ? (
3359
3357
  <div className="flex-1 px-2 py-6 sm:px-4">
3360
3358
  <InitialRequestWaitingCard
3361
3359
  label={t('agent.preparing')}
@@ -1,6 +1,6 @@
1
1
  import { type AgentMessage, AgentMessageType } from '@vertesia/common';
2
2
  import { describe, expect, it } from 'vitest';
3
- import { collectDeliveredArtifactRefs } from './AttachmentPreview';
3
+ import { collectDeliveredArtifactRefs, parseUserMessageAttachments } from './AttachmentPreview';
4
4
 
5
5
  function question(message: string, details?: AgentMessage['details']): AgentMessage {
6
6
  return {
@@ -13,7 +13,109 @@ function question(message: string, details?: AgentMessage['details']): AgentMess
13
13
  };
14
14
  }
15
15
 
16
+ describe('parseUserMessageAttachments', () => {
17
+ // Filenames with parentheses (browser download suffixes like "report (6).json") flow
18
+ // verbatim into artifact hrefs. A first-closing-paren href capture made these lines fail
19
+ // to parse: the file rendered as raw text and its chip outlived delivery because the
20
+ // reference never reached collectDeliveredArtifactRefs.
21
+ it('parses hrefs containing parentheses', () => {
22
+ const parsed = parseUserMessageAttachments(
23
+ 'Look at this.\n\nUploaded artifacts:\n[report (6).json](artifact:files/report (6).json)',
24
+ );
25
+
26
+ expect(parsed.body).toBe('Look at this.');
27
+ expect(parsed.attachments).toHaveLength(1);
28
+ expect(parsed.attachments[0].name).toBe('report (6).json');
29
+ expect(parsed.attachments[0].href).toBe('artifact:files/report (6).json');
30
+ expect(parsed.attachments[0].artifactPath).toBe('files/report (6).json');
31
+ });
32
+
33
+ it('splits href from trailing note even when both contain parentheses', () => {
34
+ const parsed = parseUserMessageAttachments(
35
+ [
36
+ 'Attachments:',
37
+ '- [scan (2).png](artifact:files/scan (2).png) (image - use view_image tool with path "files/scan (2).png" to see it)',
38
+ '- [notes (v2).pdf](artifact:files/notes (v2).pdf) (text extracted to files/notes (v2).pdf.md)',
39
+ ].join('\n'),
40
+ );
41
+
42
+ expect(parsed.attachments).toHaveLength(2);
43
+ expect(parsed.attachments[0].href).toBe('artifact:files/scan (2).png');
44
+ // The note still drives the image content-type heuristic.
45
+ expect(parsed.attachments[0].contentType).toBe('image/*');
46
+ expect(parsed.attachments[1].href).toBe('artifact:files/notes (v2).pdf');
47
+ expect(parsed.attachments[1].contentType).toBeUndefined();
48
+ });
49
+
50
+ // Only the two note shapes the server formatter emits may split a line. Without that
51
+ // check, a note-less filename carrying its own parens is cut at the last ") (", yielding
52
+ // a truncated href whose reference never matches — the chip then outlives delivery.
53
+ it('does not split a note-less filename that contains ") ("', () => {
54
+ const parsed = parseUserMessageAttachments(
55
+ 'Uploaded artifacts:\n[a (b) (c).pdf](artifact:files/a (b) (c).pdf)',
56
+ );
57
+
58
+ expect(parsed.attachments).toHaveLength(1);
59
+ expect(parsed.attachments[0].name).toBe('a (b) (c).pdf');
60
+ expect(parsed.attachments[0].href).toBe('artifact:files/a (b) (c).pdf');
61
+ expect(parsed.attachments[0].artifactPath).toBe('files/a (b) (c).pdf');
62
+ });
63
+
64
+ // The previous regex pair backtracked polynomially on lines packed with ") (" sequences
65
+ // (CodeQL js/polynomial-redos). The scanner must stay linear and still pick the rightmost
66
+ // note split — the same split the greedy regex produced.
67
+ it('handles pathological paren-dense lines in linear time with the rightmost note split', () => {
68
+ const hostile = `[a](${') ('.repeat(20_000)}x) (image - hostile)`;
69
+ const started = performance.now();
70
+ const parsed = parseUserMessageAttachments(`Uploaded artifacts:\n${hostile}`);
71
+ expect(performance.now() - started).toBeLessThan(200);
72
+
73
+ expect(parsed.attachments).toHaveLength(1);
74
+ expect(parsed.attachments[0].href).toBe(`${') ('.repeat(20_000)}x`);
75
+ expect(parsed.attachments[0].contentType).toBe('image/*');
76
+ });
77
+
78
+ // Every ") (" above is a candidate the scanner must reject (unknown note prefix) before
79
+ // falling through to the whole-body href. That rejection path is the one a quadratic
80
+ // implementation would blow up on, so it gets its own budget.
81
+ it('stays linear when every note candidate is rejected', () => {
82
+ const hostile = `[a](${') ('.repeat(20_000)}x)`;
83
+ const started = performance.now();
84
+ const parsed = parseUserMessageAttachments(`Uploaded artifacts:\n${hostile}`);
85
+ expect(performance.now() - started).toBeLessThan(200);
86
+
87
+ expect(parsed.attachments).toHaveLength(1);
88
+ expect(parsed.attachments[0].href).toBe(`${') ('.repeat(20_000)}x`);
89
+ });
90
+
91
+ it('keeps parsing plain links and note-suffixed links without parentheses', () => {
92
+ const parsed = parseUserMessageAttachments(
93
+ [
94
+ 'Uploaded artifacts:',
95
+ '[report.pdf](artifact:files/report.pdf)',
96
+ '- [photo.png](artifact:files/photo.png) (image - use view_image tool with path "files/photo.png" to see it)',
97
+ ].join('\n'),
98
+ );
99
+
100
+ expect(parsed.attachments.map((a) => a.href)).toEqual([
101
+ 'artifact:files/report.pdf',
102
+ 'artifact:files/photo.png',
103
+ ]);
104
+ expect(parsed.attachments[1].contentType).toBe('image/*');
105
+ });
106
+ });
107
+
16
108
  describe('collectDeliveredArtifactRefs', () => {
109
+ it('collects references for filenames containing parentheses', () => {
110
+ const refs = collectDeliveredArtifactRefs([
111
+ question(
112
+ '[Files Ready] All 1 file(s)...\n\nUploaded artifacts:\n[filaments-bundle (6).json](artifact:files/filaments-bundle (6).json)',
113
+ ),
114
+ ]);
115
+
116
+ expect(refs).toEqual(new Set(['artifact:files/filaments-bundle (6).json', 'files/filaments-bundle (6).json']));
117
+ });
118
+
17
119
  it('collects attachment references from persisted user messages', () => {
18
120
  const refs = collectDeliveredArtifactRefs([
19
121
  question('Review this.\n\nUploaded artifacts:\n[report.pdf](artifact:files/report.pdf)'),
@@ -428,7 +428,53 @@ export function AttachmentPreviewList({
428
428
  }
429
429
 
430
430
  const ATTACHMENT_SECTION_RE = /^\s*(?:\*\*)?(attachments|uploaded artifacts):(?:\*\*)?\s*$/i;
431
- const ATTACHMENT_LINK_RE = /^\s*(?:[-*]\s*)?\[([^\]]+)]\(([^)]+)\)(?:\s+\((.*)\))?\s*$/;
431
+
432
+ const SINGLE_WHITESPACE_RE = /\s/;
433
+
434
+ /** The only note shapes the server-side formatter emits (see processUserMessages). */
435
+ const ATTACHMENT_NOTE_PREFIXES = ['image -', 'text extracted to '];
436
+
437
+ interface AttachmentLineParts {
438
+ name: string;
439
+ href: string;
440
+ note?: string;
441
+ }
442
+
443
+ /**
444
+ * Parse one attachment line of the form `- [label](href)` or `- [label](href) (note)`.
445
+ *
446
+ * Hrefs mirror user filenames, so they can contain parentheses and spaces
447
+ * ("artifact:files/report (6).json"), and workflow-composed lines append a parenthesized note
448
+ * ("(image - ...)", "(text extracted to ...)") that can itself contain parentheses. A regex for
449
+ * that shape needs overlapping greedy captures, which backtrack polynomially on message content
450
+ * (CodeQL js/polynomial-redos) — so the line is split with a linear scan instead: the label runs
451
+ * to the first "]", and the note starts at the rightmost "(" that is preceded by whitespace and
452
+ * a ")" AND opens one of the known note shapes. Requiring a known prefix is what keeps a
453
+ * note-less filename such as "a (b) (c).pdf" from being split at its own parentheses.
454
+ */
455
+ function parseAttachmentLine(trimmed: string): AttachmentLineParts | null {
456
+ let text = trimmed;
457
+ if (text.startsWith('-') || text.startsWith('*')) {
458
+ text = text.slice(1).trimStart();
459
+ }
460
+ if (!text.startsWith('[') || !text.endsWith(')')) return null;
461
+ const labelEnd = text.indexOf(']');
462
+ if (labelEnd < 2 || text[labelEnd + 1] !== '(') return null;
463
+ const name = text.slice(1, labelEnd);
464
+ // Everything between "](" and the final ")": either the whole href, or "href) (note".
465
+ const body = text.slice(labelEnd + 2, -1);
466
+ for (let open = body.lastIndexOf('('); open > 0; open = body.lastIndexOf('(', open - 1)) {
467
+ let wsStart = open;
468
+ while (wsStart > 0 && SINGLE_WHITESPACE_RE.test(body[wsStart - 1])) {
469
+ wsStart--;
470
+ }
471
+ if (wsStart === open || wsStart < 2 || body[wsStart - 1] !== ')') continue;
472
+ const note = body.slice(open + 1);
473
+ if (!ATTACHMENT_NOTE_PREFIXES.some((prefix) => note.startsWith(prefix))) continue;
474
+ return { name, href: body.slice(0, wsStart - 1), note };
475
+ }
476
+ return body ? { name, href: body } : null;
477
+ }
432
478
 
433
479
  export function parseUserMessageAttachments(content: string): ParsedUserAttachments {
434
480
  const lines = content.split(/\r?\n/);
@@ -453,14 +499,14 @@ export function parseUserMessageAttachments(content: string): ParsedUserAttachme
453
499
  continue;
454
500
  }
455
501
 
456
- const match = ATTACHMENT_LINK_RE.exec(trimmed);
457
- if (!match) {
502
+ const parsed = parseAttachmentLine(trimmed);
503
+ if (!parsed) {
458
504
  inAttachmentSection = false;
459
505
  bodyLines.push(line);
460
506
  continue;
461
507
  }
462
508
 
463
- const [, name, href, note] = match;
509
+ const { name, href, note } = parsed;
464
510
  const artifactPath = href.startsWith('artifact:') ? href.slice('artifact:'.length) : undefined;
465
511
  attachments.push({
466
512
  id: `${href}-${attachments.length}`,
@@ -1,9 +1,9 @@
1
1
  import type { AgentMessage, BatchItemStatus, BatchProgressDetails } from '@vertesia/common';
2
2
  import { Button, cn, onActivateKey, useToast } from '@vertesia/ui/core';
3
3
  import { useUITranslation } from '@vertesia/ui/i18n';
4
- import dayjs from 'dayjs';
5
4
  import { AlertCircle, CheckCircle, ChevronDown, ChevronRight, CopyIcon, Layers, Loader2 } from 'lucide-react';
6
5
  import { memo, useState } from 'react';
6
+ import dayjs from '../../../../core/utils/dayjs.js';
7
7
  import { PulsatingCircle } from '../AnimatedThinkingDots';
8
8
 
9
9
  export interface BatchProgressPanelProps {
@@ -12,6 +12,7 @@ import {
12
12
  ExternalLink,
13
13
  GitFork,
14
14
  InfoIcon,
15
+ MessageCirclePlus,
15
16
  MessageSquareText,
16
17
  MoreVertical,
17
18
  Rows3,
@@ -194,6 +195,22 @@ export default function Header({
194
195
  </Button>
195
196
  )}
196
197
 
198
+ {resetWorkflow && (
199
+ <Button
200
+ type="button"
201
+ size={variant === 'compact' ? 'icon' : 'sm'}
202
+ variant="ghost"
203
+ onClick={resetWorkflow}
204
+ title={t('agent.startNewConversation')}
205
+ className={cn(
206
+ 'transition-all duration-200 rounded-md',
207
+ variant === 'compact' && 'size-8 rounded-lg',
208
+ )}
209
+ >
210
+ <MessageCirclePlus className={cn('size-4', variant === 'full' && 'me-1.5')} />
211
+ </Button>
212
+ )}
213
+
197
214
  {/* More actions */}
198
215
  <MoreDropdown
199
216
  compact={isCompact}
@@ -237,7 +254,7 @@ export default function Header({
237
254
  <PayloadBuilderProvider>
238
255
  <div
239
256
  className={cn(
240
- 'flex flex-wrap items-end justify-between py-1.5 px-2 border-b shadow-sm flex-shrink-0',
257
+ 'flex flex-wrap items-center justify-between py-1.5 px-2 border-b shadow-sm flex-shrink-0',
241
258
  className,
242
259
  )}
243
260
  >
@@ -9,7 +9,6 @@ import { useUITranslation } from '@vertesia/ui/i18n';
9
9
  import { useRouterContext } from '@vertesia/ui/router';
10
10
  import { useUserSession } from '@vertesia/ui/session';
11
11
  import { MarkdownRenderer } from '@vertesia/ui/widgets';
12
- import dayjs from 'dayjs';
13
12
  import {
14
13
  AlertCircle,
15
14
  Bot,
@@ -26,6 +25,7 @@ import {
26
25
  } from 'lucide-react';
27
26
  import type React from 'react';
28
27
  import { memo, useEffect, useMemo, useRef, useState } from 'react';
28
+ import dayjs from '../../../../core/utils/dayjs.js';
29
29
  import { useDownloadFile } from '../../../store/objects/components/useDownloadFile.js';
30
30
  import { PulsatingCircle } from '../AnimatedThinkingDots';
31
31
  import { AskUserWidget } from '../AskUserWidget';
@@ -1,9 +1,9 @@
1
1
  import { Button, cn, useToast } from '@vertesia/ui/core';
2
2
  import { useUITranslation } from '@vertesia/ui/i18n';
3
3
  import { MarkdownRenderer } from '@vertesia/ui/widgets';
4
- import dayjs from 'dayjs';
5
4
  import { Bot, CopyIcon } from 'lucide-react';
6
5
  import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
6
+ import dayjs from '../../../../core/utils/dayjs.js';
7
7
 
8
8
  // PERFORMANCE: Unicode cursor character - rendered inline with text
9
9
  // This avoids expensive DOM manipulation with TreeWalker on every update
@@ -8,9 +8,9 @@ import { Button, cn, onActivateKey, useToast } from '@vertesia/ui/core';
8
8
  import { useUITranslation } from '@vertesia/ui/i18n';
9
9
  import { useUserSession } from '@vertesia/ui/session';
10
10
  import { MarkdownRenderer } from '@vertesia/ui/widgets';
11
- import dayjs from 'dayjs';
12
11
  import { AlertCircle, AlertTriangle, Bot, CheckCircle, ChevronDown, ChevronRight, CopyIcon } from 'lucide-react';
13
12
  import { memo, useEffect, useMemo, useRef, useState } from 'react';
13
+ import dayjs from '../../../../core/utils/dayjs.js';
14
14
  import { PulsatingCircle } from '../AnimatedThinkingDots';
15
15
  import { useImageLightbox } from '../ImageLightbox';
16
16
  import { getArtifactCacheKey, useArtifactUrlCache } from '../useArtifactUrlCache.js';