@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
@@ -1,8 +1,7 @@
1
1
  import type { AgentMessage } from '@vertesia/common';
2
- import { cn, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@vertesia/ui/core';
2
+ import { cn, DropdownMenuItem, OverflowMoreMenu, useOverflowTabs } from '@vertesia/ui/core';
3
3
  import { i18nInstance, NAMESPACE, useUITranslation } from '@vertesia/ui/i18n';
4
4
  import { CheckCircle, ChevronDown, Clock } from 'lucide-react';
5
- import { useEffect, useLayoutEffect, useRef, useState } from 'react';
6
5
  import { getWorkstreamId } from './utils';
7
6
 
8
7
  interface WorkstreamTabsProps {
@@ -19,7 +18,6 @@ const TAB_ITEM_BASE =
19
18
  'flex items-center gap-1.5 px-2 py-1 text-xs font-medium whitespace-nowrap transition-colors border-b-2 shrink-0 cursor-pointer';
20
19
  const TAB_ITEM_INACTIVE = 'border-transparent text-muted hover:bg-muted';
21
20
  const TAB_ITEM_ACTIVE = 'border-info bg-info text-info';
22
- const TAB_GAP_PX = 4; // matches the `gap-1` between tab items
23
21
 
24
22
  // Shorten long workstream names for the tab row.
25
23
  function truncateName(name: string) {
@@ -50,93 +48,39 @@ function WorkstreamMoreMenu({
50
48
  count,
51
49
  completionStatus,
52
50
  }: WorkstreamMoreMenuProps) {
53
- const [open, setOpen] = useState(false);
54
- const closeTimer = useRef<ReturnType<typeof setTimeout> | null>(null);
55
- const openedByHover = useRef(false);
56
-
57
- const cancelClose = () => {
58
- if (closeTimer.current) {
59
- clearTimeout(closeTimer.current);
60
- closeTimer.current = null;
61
- }
62
- };
63
- const openOnHover = () => {
64
- cancelClose();
65
- openedByHover.current = true;
66
- setOpen(true);
67
- };
68
- // Delay the close so the pointer can travel across the gap onto the menu.
69
- const closeAfterDelay = () => {
70
- cancelClose();
71
- closeTimer.current = setTimeout(() => setOpen(false), 150);
72
- };
73
-
74
- // Clear any pending close timer on unmount.
75
- useEffect(() => () => clearTimeout(closeTimer.current ?? undefined), []);
76
-
77
51
  return (
78
- // Non-modal: a modal menu sets body `pointer-events: none` while open, which makes
79
- // the hover open/close flap. It still closes on outside-click / Escape.
80
- <DropdownMenu
81
- modal={false}
82
- open={open}
83
- onOpenChange={(next) => {
84
- // Fired by click / keyboard / dismiss (not by hover); keep our state in sync.
85
- cancelClose();
86
- if (next) openedByHover.current = false;
87
- setOpen(next);
88
- }}
52
+ <OverflowMoreMenu
53
+ label={label}
54
+ triggerClassName={cn(TAB_ITEM_BASE, active ? TAB_ITEM_ACTIVE : TAB_ITEM_INACTIVE)}
55
+ icon={<ChevronDown className="ms-0.5 size-3.5" />}
89
56
  >
90
- <DropdownMenuTrigger asChild>
91
- {/* Tab-bar primitive: raw button is the menu trigger (asChild). */}
92
- <button
93
- type="button"
94
- onMouseEnter={openOnHover}
95
- onMouseLeave={closeAfterDelay}
96
- className={cn(TAB_ITEM_BASE, active ? TAB_ITEM_ACTIVE : TAB_ITEM_INACTIVE)}
97
- >
98
- {label}
99
- <ChevronDown className="ms-0.5 size-3.5" />
100
- </button>
101
- </DropdownMenuTrigger>
102
- <DropdownMenuContent
103
- align="end"
104
- className="w-max"
105
- onMouseEnter={cancelClose}
106
- onMouseLeave={closeAfterDelay}
107
- onCloseAutoFocus={(e) => {
108
- // Keep hover-opens from returning the focus ring to the trigger.
109
- if (openedByHover.current) e.preventDefault();
110
- }}
111
- >
112
- {items.map(([id, name]) => {
113
- const showCount = (count?.get(id) ?? 0) > 0;
114
- return (
115
- <DropdownMenuItem
116
- key={id}
117
- onClick={() => onSelect(id)}
118
- className={cn('flex items-center gap-2', id === current && 'text-info')}
119
- >
120
- <span className="truncate">{name}</span>
121
- {showCount && (
122
- <span className="ms-auto inline-flex items-center gap-1">
123
- <span className="inline-flex items-center justify-center rounded-full bg-muted px-1.5 text-[10px] text-muted">
124
- {count?.get(id)}
125
- </span>
126
- {completionStatus &&
127
- id !== 'all' &&
128
- (completionStatus.get(id) ? (
129
- <CheckCircle className="size-3 text-success" />
130
- ) : (
131
- <Clock className="size-3 text-attention" />
132
- ))}
57
+ {items.map(([id, name]) => {
58
+ const showCount = (count?.get(id) ?? 0) > 0;
59
+ return (
60
+ <DropdownMenuItem
61
+ key={id}
62
+ onClick={() => onSelect(id)}
63
+ className={cn('flex items-center gap-2', id === current && 'text-info')}
64
+ >
65
+ <span className="truncate">{name}</span>
66
+ {showCount && (
67
+ <span className="ms-auto inline-flex items-center gap-1">
68
+ <span className="inline-flex items-center justify-center rounded-full bg-muted px-1.5 text-[10px] text-muted">
69
+ {count?.get(id)}
133
70
  </span>
134
- )}
135
- </DropdownMenuItem>
136
- );
137
- })}
138
- </DropdownMenuContent>
139
- </DropdownMenu>
71
+ {completionStatus &&
72
+ id !== 'all' &&
73
+ (completionStatus.get(id) ? (
74
+ <CheckCircle className="size-3 text-success" />
75
+ ) : (
76
+ <Clock className="size-3 text-attention" />
77
+ ))}
78
+ </span>
79
+ )}
80
+ </DropdownMenuItem>
81
+ );
82
+ })}
83
+ </OverflowMoreMenu>
140
84
  );
141
85
  }
142
86
 
@@ -161,82 +105,10 @@ function WorkstreamOverflowBar({
161
105
  completionStatus,
162
106
  }: WorkstreamOverflowBarProps) {
163
107
  const { t } = useUITranslation();
164
- const containerRef = useRef<HTMLDivElement | null>(null);
165
- const itemRefs = useRef<Array<HTMLButtonElement | null>>([]);
166
- const moreRef = useRef<HTMLButtonElement | null>(null);
167
- // `count` leading tabs are shown. When `promote` is set, the active tab is pulled
168
- // into the last slot (before More) and `count` counts the tabs shown before it.
169
- const [layout, setLayout] = useState<{ count: number; promote: boolean }>({
170
- count: entries.length,
171
- promote: false,
172
- });
173
-
174
- const recompute = () => {
175
- const container = containerRef.current;
176
- if (!container) return;
177
- const containerWidth = container.clientWidth;
178
- const widths = entries.map((_, i) => itemRefs.current[i]?.offsetWidth ?? 0);
179
- const totalAll = widths.reduce((sum, w) => sum + w, 0) + TAB_GAP_PX * Math.max(0, entries.length - 1);
180
-
181
- // How many tabs (in order, optionally skipping one) fit within `available`.
182
- const fitCount = (available: number, skipIndex: number) => {
183
- let used = 0;
184
- let fitted = 0;
185
- for (let i = 0; i < entries.length; i++) {
186
- if (i === skipIndex) continue;
187
- const cand = used + (fitted > 0 ? TAB_GAP_PX : 0) + widths[i];
188
- if (cand > available) break;
189
- used = cand;
190
- fitted += 1;
191
- }
192
- return fitted;
193
- };
194
-
195
- let next: { count: number; promote: boolean };
196
- if (totalAll <= containerWidth) {
197
- next = { count: entries.length, promote: false };
198
- } else {
199
- const moreWidth = moreRef.current?.offsetWidth ?? 0;
200
- const naturalCount = Math.max(1, fitCount(containerWidth - moreWidth - TAB_GAP_PX, -1));
201
- const activeIndex = entries.findIndex(([id]) => id === activeWorkstream);
202
- if (activeIndex < 0 || activeIndex < naturalCount) {
203
- next = { count: naturalCount, promote: false };
204
- } else {
205
- // Active tab overflowed: reserve its slot at the end, fit leading tabs before it.
206
- const leadAvailable = containerWidth - moreWidth - widths[activeIndex] - TAB_GAP_PX * 2;
207
- next = { count: fitCount(leadAvailable, activeIndex), promote: true };
208
- }
209
- }
210
- setLayout((prev) => (prev.count === next.count && prev.promote === next.promote ? prev : next));
211
- };
212
-
213
- // Re-measure after every render (tab/label changes) and on container resize.
214
- const recomputeRef = useRef(recompute);
215
- recomputeRef.current = recompute;
216
- useLayoutEffect(() => {
217
- recomputeRef.current();
218
- });
219
- useEffect(() => {
220
- const container = containerRef.current;
221
- if (!container || typeof ResizeObserver === 'undefined') return;
222
- const observer = new ResizeObserver(() => recomputeRef.current());
223
- observer.observe(container);
224
- return () => observer.disconnect();
225
- }, []);
226
-
227
- const activeIndex = entries.findIndex(([id]) => id === activeWorkstream);
228
- let visible: WorkstreamEntry[];
229
- let overflow: WorkstreamEntry[];
230
- if (layout.promote && activeIndex >= 0) {
231
- // Pull the active tab into the last visible slot; the tab it displaces overflows.
232
- const others = entries.filter((_, i) => i !== activeIndex);
233
- visible = [...others.slice(0, layout.count), entries[activeIndex]];
234
- overflow = others.slice(layout.count);
235
- } else {
236
- visible = entries.slice(0, layout.count);
237
- overflow = entries.slice(layout.count);
238
- }
239
- const activeInOverflow = overflow.some(([id]) => id === activeWorkstream);
108
+ const { containerRef, setItemRef, setMoreRef, visible, overflow, activeInOverflow } = useOverflowTabs(
109
+ entries,
110
+ ([id]) => id === activeWorkstream,
111
+ );
240
112
  const moreLabel = t('agent.moreTabs');
241
113
 
242
114
  // Inner tab content (name + count badge + completion icon), shared by the hidden
@@ -280,15 +152,13 @@ function WorkstreamOverflowBar({
280
152
  type="button"
281
153
  key={id}
282
154
  tabIndex={-1}
283
- ref={(el) => {
284
- itemRefs.current[i] = el;
285
- }}
155
+ ref={setItemRef(i)}
286
156
  className={cn(TAB_ITEM_BASE, TAB_ITEM_INACTIVE)}
287
157
  >
288
158
  {renderTabInner(id, name, false)}
289
159
  </button>
290
160
  ))}
291
- <button type="button" tabIndex={-1} ref={moreRef} className={cn(TAB_ITEM_BASE, TAB_ITEM_INACTIVE)}>
161
+ <button type="button" tabIndex={-1} ref={setMoreRef} className={cn(TAB_ITEM_BASE, TAB_ITEM_INACTIVE)}>
292
162
  {moreLabel}
293
163
  <ChevronDown className="ms-0.5 size-3.5" />
294
164
  </button>
@@ -12,6 +12,7 @@ import {
12
12
  getSlidingViewMessageBuckets,
13
13
  groupMessagesWithStreaming,
14
14
  isInProgress,
15
+ isStreamingDataVisibleInWorkstream,
15
16
  isStreamReplacedByMessage,
16
17
  isToolActivityMessage,
17
18
  mergeConsecutiveToolGroups,
@@ -1310,6 +1311,43 @@ describe('ModernAgentOutput summary conversation items', () => {
1310
1311
  expect(summaryMessages).toEqual([answer]);
1311
1312
  });
1312
1313
 
1314
+ it('does not duplicate persisted reasoning without streaming metadata across intervening activity', () => {
1315
+ const activity = makeMessage({
1316
+ timestamp: 2500,
1317
+ type: AgentMessageType.THOUGHT,
1318
+ message: 'Launching workstream',
1319
+ details: {
1320
+ tool: 'launch_workstream',
1321
+ tool_status: 'completed',
1322
+ tool_run_id: 'tool-1',
1323
+ },
1324
+ });
1325
+ const reasoning = makeMessage({
1326
+ timestamp: 3000,
1327
+ type: AgentMessageType.THOUGHT,
1328
+ message: 'Launching parallel processing',
1329
+ details: {
1330
+ display_role: 'reasoning',
1331
+ },
1332
+ });
1333
+
1334
+ const summaryMessages = buildSummaryDisplayMessages(
1335
+ [activity, reasoning],
1336
+ new Map([
1337
+ [
1338
+ 'stream-1',
1339
+ {
1340
+ text: 'Launching parallel processing',
1341
+ startTimestamp: 2000,
1342
+ isComplete: true,
1343
+ },
1344
+ ],
1345
+ ]),
1346
+ );
1347
+
1348
+ expect(summaryMessages).toEqual([activity, reasoning]);
1349
+ });
1350
+
1313
1351
  it('does not duplicate completed tool preamble streams once persisted prose replaces them', () => {
1314
1352
  const preamble = makeMessage({
1315
1353
  timestamp: 3000,
@@ -1391,6 +1429,33 @@ describe('ModernAgentOutput summary conversation items', () => {
1391
1429
  });
1392
1430
 
1393
1431
  describe('ModernAgentOutput utils - streamed deduplication', () => {
1432
+ it('shows a workstream stream only in its owning workstream', () => {
1433
+ const stream = {
1434
+ text: 'Child work in progress',
1435
+ startTimestamp: 1000,
1436
+ workstreamId: 'research',
1437
+ };
1438
+
1439
+ expect(isStreamingDataVisibleInWorkstream(stream, 'all')).toBe(false);
1440
+ expect(isStreamingDataVisibleInWorkstream(stream, 'main')).toBe(false);
1441
+ expect(isStreamingDataVisibleInWorkstream(stream, 'research')).toBe(true);
1442
+ expect(isStreamingDataVisibleInWorkstream(stream, 'writing')).toBe(false);
1443
+
1444
+ const streams = new Map([['stream-1', stream]]);
1445
+ expect(groupMessagesWithStreaming([], streams, 'all')).toHaveLength(0);
1446
+ expect(groupMessagesWithStreaming([], streams, 'research')).toHaveLength(1);
1447
+ });
1448
+
1449
+ it('keeps main-agent streams in the main conversation', () => {
1450
+ const stream = {
1451
+ text: 'Main response in progress',
1452
+ startTimestamp: 1000,
1453
+ };
1454
+
1455
+ expect(isStreamingDataVisibleInWorkstream(stream, 'all')).toBe(true);
1456
+ expect(isStreamingDataVisibleInWorkstream(stream, 'main')).toBe(true);
1457
+ });
1458
+
1394
1459
  it('skips a stale streaming item once an equivalent streamed answer is persisted', () => {
1395
1460
  const answer = makeMessage({
1396
1461
  timestamp: 2000,
@@ -1498,6 +1563,35 @@ describe('ModernAgentOutput utils - streamed deduplication', () => {
1498
1563
  ),
1499
1564
  ).toBe(false);
1500
1565
  });
1566
+
1567
+ it('replaces matching streamed prose with persisted thinking prose, but not a generic marker', () => {
1568
+ const matchingThinking = makeMessage({
1569
+ timestamp: 2000,
1570
+ type: AgentMessageType.THOUGHT,
1571
+ message: 'Launching parallel processing',
1572
+ details: {
1573
+ activity_id: 'activity-1',
1574
+ display_role: 'thinking',
1575
+ },
1576
+ });
1577
+ const genericMarker = makeMessage({
1578
+ timestamp: 2000,
1579
+ type: AgentMessageType.THOUGHT,
1580
+ message: 'Thinking...',
1581
+ details: {
1582
+ activity_id: 'activity-1',
1583
+ display_role: 'thinking',
1584
+ },
1585
+ });
1586
+ const streaming = {
1587
+ text: 'Launching parallel processing',
1588
+ startTimestamp: 1000,
1589
+ activityId: 'activity-1',
1590
+ };
1591
+
1592
+ expect(isStreamReplacedByMessage(streaming, [matchingThinking])).toBe(true);
1593
+ expect(isStreamReplacedByMessage(streaming, [genericMarker])).toBe(false);
1594
+ });
1501
1595
  });
1502
1596
 
1503
1597
  describe('ModernAgentOutput utils - adjacent rendered deduplication', () => {
@@ -1,6 +1,6 @@
1
1
  import type { VertesiaClient } from '@vertesia/client';
2
2
  import { type AgentMessage, AgentMessageType } from '@vertesia/common';
3
- import dayjs from 'dayjs';
3
+ import dayjs from '../../../../core/utils/dayjs.js';
4
4
  import { getWorkstreamActivityDetails, getWorkstreamLaunchDetails } from '../workstreams.js';
5
5
 
6
6
  function getAgentChatDebugParam(hash: string): string | null {
@@ -327,6 +327,18 @@ export interface StreamingData {
327
327
  streamingId?: string;
328
328
  }
329
329
 
330
+ /**
331
+ * Match live stream ownership to the persisted-message timeline filter. The `all` conversation
332
+ * view is the main-agent timeline (plus workstream lifecycle markers), not a merged transcript of
333
+ * every child workstream.
334
+ */
335
+ export function isStreamingDataVisibleInWorkstream(streaming: StreamingData, activeWorkstream?: string): boolean {
336
+ if (!activeWorkstream) return true;
337
+
338
+ const streamWorkstream = streaming.workstreamId || 'main';
339
+ return activeWorkstream === 'all' ? streamWorkstream === 'main' : activeWorkstream === streamWorkstream;
340
+ }
341
+
330
342
  function normalizeComparableText(text: unknown): string | undefined {
331
343
  if (typeof text !== 'string') return undefined;
332
344
  const normalized = text.replace(/\r\n/g, '\n').trim();
@@ -353,7 +365,7 @@ export function isStreamReplacedByMessage(streaming: StreamingData, messages: Ag
353
365
  if (streaming.streamingId && messageStreamingId) {
354
366
  if (messageStreamingId !== streaming.streamingId) return false;
355
367
  if (message.details?.display_role === 'thinking') {
356
- return false;
368
+ return getMessageComparableText(message) === streamingText;
357
369
  }
358
370
  if (isToolCallMessage(message) || message.details?.tool_status) {
359
371
  return false;
@@ -363,7 +375,7 @@ export function isStreamReplacedByMessage(streaming: StreamingData, messages: Ag
363
375
 
364
376
  if (streaming.activityId && message.details?.activity_id === streaming.activityId) {
365
377
  if (message.details?.display_role === 'thinking') {
366
- return false;
378
+ return getMessageComparableText(message) === streamingText;
367
379
  }
368
380
  if (isToolCallMessage(message) || message.details?.tool_status) {
369
381
  return false;
@@ -380,8 +392,9 @@ export function isStreamReplacedByMessage(streaming: StreamingData, messages: Ag
380
392
  return false;
381
393
  }
382
394
 
383
- if (!message.details?.streamed) return false;
384
-
395
+ // Exact persisted prose is authoritative even when an older or alternate producer omitted
396
+ // streaming correlation metadata. This comparison spans the whole timeline so intervening
397
+ // tool/workstream activity cannot leave the completed preview rendered a second time.
385
398
  return getMessageComparableText(message) === streamingText;
386
399
  });
387
400
  }
@@ -713,11 +726,7 @@ export function groupMessagesWithStreaming(
713
726
  if (!data.text) return;
714
727
  if (isStreamReplacedByMessage(data, messages)) return;
715
728
 
716
- // Filter by workstream if specified
717
- if (activeWorkstream && activeWorkstream !== 'all') {
718
- const streamWorkstream = data.workstreamId || 'main';
719
- if (activeWorkstream !== streamWorkstream) return;
720
- }
729
+ if (!isStreamingDataVisibleInWorkstream(data, activeWorkstream)) return;
721
730
 
722
731
  items.push({
723
732
  kind: 'streaming',
@@ -4,14 +4,19 @@ import { useUITranslation } from '@vertesia/ui/i18n';
4
4
  import { useUserSession } from '@vertesia/ui/session';
5
5
  import { Check, Copy, Download, Loader2, Maximize2, Minimize2, X } from 'lucide-react';
6
6
  import Papa from 'papaparse';
7
- import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';
8
- import { VegaEmbed } from 'react-vega';
7
+ import { lazy, memo, Suspense, useCallback, useEffect, useMemo, useRef, useState } from 'react';
9
8
  import type { View } from 'vega';
10
9
  import type { TopLevelSpec as VisualizationSpec } from 'vega-lite';
11
10
  import { cn } from '../../../core/components/libs/utils';
12
11
  import type { VegaLiteChartSpec } from './AgentChart';
13
12
  import { getArtifactCacheKey, getFileCacheKey, isProjectFilePath, useArtifactUrlCache } from './useArtifactUrlCache';
14
13
 
14
+ /**
15
+ * Vega and its Vega-Lite compiler are ~1 MB and are only needed once a chart is actually rendered,
16
+ * so they are pulled in on demand instead of at module load.
17
+ */
18
+ const VegaEmbed = lazy(() => import('react-vega').then(({ VegaEmbed: component }) => ({ default: component })));
19
+
15
20
  type VegaLiteChartProps = {
16
21
  spec: VegaLiteChartSpec;
17
22
  /**
@@ -38,6 +43,15 @@ function VegaErrorDisplay({ error, chartTitle }: { error: string; chartTitle?: s
38
43
  );
39
44
  }
40
45
 
46
+ // Shown while the Vega runtime is being fetched on first chart render
47
+ function VegaLoadingPlaceholder() {
48
+ return (
49
+ <output className="flex items-center justify-center w-full h-full">
50
+ <Loader2 className="w-5 h-5 animate-spin text-gray-500 dark:text-gray-400" />
51
+ </output>
52
+ );
53
+ }
54
+
41
55
  // Fullscreen dialog component with smooth animations
42
56
  function FullscreenDialog({
43
57
  isOpen,
@@ -1122,12 +1136,14 @@ export const VegaLiteChart = memo(
1122
1136
  className="bg-white dark:bg-gray-900 rounded overflow-hidden"
1123
1137
  style={{ width: '100%', height: baseHeight, minWidth: 0 }}
1124
1138
  >
1125
- <VegaEmbed
1126
- spec={chartSpec}
1127
- onEmbed={(result) => handleNewView(result.view)}
1128
- onError={handleError}
1129
- options={{ renderer: options?.renderer || 'canvas', actions: false }}
1130
- />
1139
+ <Suspense fallback={<VegaLoadingPlaceholder />}>
1140
+ <VegaEmbed
1141
+ spec={chartSpec}
1142
+ onEmbed={(result) => handleNewView(result.view)}
1143
+ onError={handleError}
1144
+ options={{ renderer: options?.renderer || 'canvas', actions: false }}
1145
+ />
1146
+ </Suspense>
1131
1147
  </div>
1132
1148
  </div>
1133
1149
  </div>
@@ -1141,12 +1157,14 @@ export const VegaLiteChart = memo(
1141
1157
  >
1142
1158
  <div className="w-full h-full min-h-[calc(100vh-200px)]">
1143
1159
  {fullscreenSpec && (
1144
- <VegaEmbed
1145
- spec={fullscreenSpec}
1146
- onEmbed={(result) => handleFullscreenNewView(result.view)}
1147
- onError={handleError}
1148
- options={{ renderer: options?.renderer || 'canvas', actions: false }}
1149
- />
1160
+ <Suspense fallback={<VegaLoadingPlaceholder />}>
1161
+ <VegaEmbed
1162
+ spec={fullscreenSpec}
1163
+ onEmbed={(result) => handleFullscreenNewView(result.view)}
1164
+ onError={handleError}
1165
+ options={{ renderer: options?.renderer || 'canvas', actions: false }}
1166
+ />
1167
+ </Suspense>
1150
1168
  )}
1151
1169
  </div>
1152
1170
  {/* Floating toolbar in fullscreen */}
@@ -43,6 +43,24 @@ describe('useAgentStream', () => {
43
43
  vi.clearAllMocks();
44
44
  });
45
45
 
46
+ it('keeps the stream subscribed while an interactive conversation is idle', async () => {
47
+ const streamMessages = vi.fn<
48
+ (
49
+ id: string,
50
+ onMessage?: (message: AgentMessage, exitFn?: (payload: unknown) => void) => void,
51
+ since?: number,
52
+ signal?: AbortSignal,
53
+ options?: AgentRunStreamMessagesOptions,
54
+ ) => Promise<unknown>
55
+ >(() => new Promise(() => {}));
56
+ const client = createClient(streamMessages);
57
+
58
+ renderHook(() => useAgentStream(client, 'agent-run-1'));
59
+
60
+ await waitFor(() => expect(streamMessages).toHaveBeenCalled());
61
+ expect(streamMessages.mock.calls[0][4]).toMatchObject({ closeOnIdle: false });
62
+ });
63
+
46
64
  it('marks initial history as empty when the history fetch returns no messages', async () => {
47
65
  const streamMessages = vi.fn<
48
66
  (
@@ -473,6 +473,9 @@ export function useAgentStream(
473
473
  since,
474
474
  abortController.signal,
475
475
  {
476
+ // Interactive conversations remain RUNNING at IDLE and must keep the
477
+ // subscription open so follow-up turns arrive on the same stream.
478
+ closeOnIdle: false,
476
479
  onHistoryLoaded: (historical) => {
477
480
  if (abortController.signal.aborted) return;
478
481
  const timelineMessages = historical.filter(shouldStoreTimelineMessage);
@@ -486,7 +486,7 @@ export function UniversalDocumentViewer({
486
486
  loadText,
487
487
  createRendition,
488
488
  markdownComponents,
489
- showHeader = true,
489
+ showHeader = false,
490
490
  onDownload,
491
491
  }: UniversalDocumentViewerProps) {
492
492
  const { client } = useUserSession();
@@ -10,19 +10,48 @@ import {
10
10
  } from '@vertesia/ui/core';
11
11
  import { RefreshCw } from 'lucide-react';
12
12
  import { useEffect, useMemo, useRef, useState } from 'react';
13
- import { filterValueToQueryValue, type SearchInterface, setSearchQueryValue } from './utils/SearchInterface';
13
+ import {
14
+ createSearchQueryKeyGuard,
15
+ filterValueToQueryValue,
16
+ type SearchInterface,
17
+ setSearchQueryValue,
18
+ } from './utils/SearchInterface';
14
19
  import type { EnrichedFacetBucket } from './utils/VInteractionFacet';
15
20
  import { VInteractionFacet } from './utils/VInteractionFacet';
16
21
  import { VStringFacet } from './utils/VStringFacet';
17
22
  import { VUserFacet } from './utils/VUserFacet';
18
23
 
24
+ export interface AgentRunnerFilterQuery {
25
+ object?: string;
26
+ id?: string;
27
+ run_kind?: string;
28
+ interaction?: string;
29
+ status?: string;
30
+ initiated_by?: string;
31
+ start?: string;
32
+ end?: string;
33
+ }
34
+
35
+ const agentRunnerFilterNames = [
36
+ 'id',
37
+ 'run_kind',
38
+ 'interaction',
39
+ 'status',
40
+ 'initiated_by',
41
+ 'start',
42
+ 'end',
43
+ ] as const satisfies readonly (keyof AgentRunnerFilterQuery)[];
44
+ const isAgentRunnerFilterName = createSearchQueryKeyGuard<AgentRunnerFilterQuery>(agentRunnerFilterNames);
45
+
19
46
  interface AgentRunnerFacetsNavProps {
20
47
  facets: {
21
48
  statuses?: FacetBucket[];
22
49
  initiated_by?: FacetBucket[];
23
50
  interactions?: EnrichedFacetBucket[];
51
+ /** `run_kind` buckets — `agent` (autonomous runs) and `process` (process runs). */
52
+ kinds?: FacetBucket[];
24
53
  };
25
- search: SearchInterface;
54
+ search: SearchInterface<AgentRunnerFilterQuery>;
26
55
  actions?: React.ReactNode[];
27
56
  selectionCount?: number;
28
57
  /**
@@ -47,6 +76,14 @@ export function useAgentRunnerFilterGroups(facets: AgentRunnerFacetsNavProps['fa
47
76
  multiple: false,
48
77
  });
49
78
 
79
+ customFilterGroups.push(
80
+ VStringFacet({
81
+ buckets: facets.kinds || [],
82
+ name: 'run_kind',
83
+ placeholder: 'Kind',
84
+ }),
85
+ );
86
+
50
87
  customFilterGroups.push(
51
88
  VInteractionFacet({
52
89
  buckets: facets.interactions || [],
@@ -89,13 +126,16 @@ export function useAgentRunnerFilterGroups(facets: AgentRunnerFacetsNavProps['fa
89
126
  }
90
127
 
91
128
  // Create filter change handler for agent runners
92
- export function createAgentRunnerFilterHandler(search: SearchInterface) {
129
+ export function createAgentRunnerFilterHandler(search: SearchInterface<AgentRunnerFilterQuery>) {
93
130
  return (newFilters: BaseFilter[]) => {
94
131
  // Clear all filters first, then apply new ones
95
132
  search.clearFilters(false, false);
96
133
 
97
134
  newFilters.forEach((filter) => {
98
135
  if (filter.value && filter.value.length > 0) {
136
+ if (!isAgentRunnerFilterName(filter.name)) {
137
+ return;
138
+ }
99
139
  const filterName = filter.name;
100
140
  const filterValue = filterValueToQueryValue(filter);
101
141
  setSearchQueryValue(search, filterName, filterValue);
@@ -154,7 +194,7 @@ export function AgentRunnerFacetsNav({
154
194
  {!selectionCount && (
155
195
  <div className="flex items-center justify-between px-2 py-1">
156
196
  <div className="text-sm text-muted-foreground">
157
- {search.initialized ? `${search.totalCount} agent runs` : 'Loading agent runs...'}
197
+ {search.initialized ? `${search.totalCount} runs` : 'Loading runs...'}
158
198
  </div>
159
199
  </div>
160
200
  )}