@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
@@ -3,6 +3,7 @@ import { type AgentMessage, AgentMessageType, type ConversationFile, FileProcess
3
3
  import type React from 'react';
4
4
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
5
5
  import { renderWithProviders } from '../../../__tests__/test-utils.js';
6
+ import { ToastContext } from '../../../core/components/toast/ToastContext.js';
6
7
  import { ModernAgentConversation } from './ModernAgentConversation';
7
8
 
8
9
  const mocks = vi.hoisted(() => ({
@@ -12,6 +13,7 @@ const mocks = vi.hoisted(() => ({
12
13
  reconnect: vi.fn(),
13
14
  restart: vi.fn(),
14
15
  sendSignal: vi.fn(),
16
+ uploadArtifact: vi.fn(),
15
17
  headerProps: vi.fn(),
16
18
  allMessagesMixedProps: vi.fn(),
17
19
  messageInputProps: vi.fn(),
@@ -30,6 +32,7 @@ vi.mock('@vertesia/ui/session', () => ({
30
32
  agents: {
31
33
  restart: mocks.restart,
32
34
  sendSignal: mocks.sendSignal,
35
+ uploadArtifact: mocks.uploadArtifact,
33
36
  getActiveWorkstreams: mocks.getActiveWorkstreams,
34
37
  retrieve: mocks.retrieve,
35
38
  },
@@ -261,6 +264,7 @@ describe('ModernAgentConversation send handling', () => {
261
264
  window.sessionStorage.clear();
262
265
  mocks.restart.mockResolvedValue({ id: 'agent-run-1' });
263
266
  mocks.sendSignal.mockResolvedValue({});
267
+ mocks.uploadArtifact.mockResolvedValue({});
264
268
  mocks.getActiveWorkstreams.mockResolvedValue({ running: [] });
265
269
  mocks.retrieve.mockResolvedValue({ disabled_mcp_collections: undefined });
266
270
  mocks.useAgentPlans.mockReturnValue({
@@ -501,6 +505,162 @@ describe('ModernAgentConversation send handling', () => {
501
505
  });
502
506
  });
503
507
 
508
+ describe('files staged before the run existed', () => {
509
+ // Staging must upload inline in StartWorkflowView, not via a handoff to the conversation
510
+ // view: consumers like StudioAssistantPanel feed the new agentRunId straight back as a
511
+ // prop, which unmounts StartWorkflowView (and any handoff state) the moment the run
512
+ // starts. Regression coverage for the flow where staged files silently vanished.
513
+ it('uploads staged files, closes the batch with a manifest, and sends no follow-up message', async () => {
514
+ const startWorkflow = vi.fn().mockResolvedValue({ agent_run_id: 'agent-run-2' });
515
+ mockStreamState({
516
+ messages: [],
517
+ isCompleted: false,
518
+ initialHistoryStatus: 'empty',
519
+ agentRunStatus: 'RUNNING',
520
+ });
521
+
522
+ const { container } = renderWithProviders(
523
+ <ModernAgentConversation startWorkflow={startWorkflow} hideHeader initialMessage="" />,
524
+ );
525
+
526
+ const file = new File(['pdf'], 'report.pdf', { type: 'application/pdf' });
527
+ const fileInput = container.querySelector('input[type="file"]') as HTMLInputElement;
528
+ expect(fileInput).not.toBeNull();
529
+ fireEvent.change(fileInput, { target: { files: [file] } });
530
+
531
+ fireEvent.change(screen.getByRole('textbox'), { target: { value: 'Look at these files' } });
532
+ fireEvent.click(screen.getByRole('button', { name: 'Start Agent' }));
533
+
534
+ await waitFor(() => {
535
+ expect(mocks.uploadArtifact).toHaveBeenCalledWith('agent-run-2', 'files/report.pdf', file);
536
+ });
537
+ await waitFor(() => {
538
+ expect(mocks.sendSignal).toHaveBeenCalledWith(
539
+ 'agent-run-2',
540
+ 'FileUploaded',
541
+ expect.objectContaining({
542
+ name: 'report.pdf',
543
+ artifact_path: 'files/report.pdf',
544
+ }),
545
+ );
546
+ });
547
+
548
+ // The closing manifest defines the batch's membership: the workflow delivers only
549
+ // when every listed file has settled, so a fast first file can never trigger a
550
+ // partial delivery.
551
+ const uploadedCall = mocks.sendSignal.mock.calls.find((call) => call[1] === 'FileUploaded');
552
+ const uploadedId = (uploadedCall?.[2] as { id?: string } | undefined)?.id;
553
+ expect(uploadedId).toEqual(expect.stringMatching(/^file-/));
554
+ await waitFor(() => {
555
+ expect(mocks.sendSignal).toHaveBeenCalledWith(
556
+ 'agent-run-2',
557
+ 'FileBatchClosed',
558
+ expect.objectContaining({
559
+ batch_id: expect.stringMatching(/^batch-/),
560
+ file_ids: [uploadedId],
561
+ }),
562
+ );
563
+ });
564
+
565
+ // The workflow owns the "[Files Ready]" turn: the client must not send a UserInput
566
+ // of its own — it would race the workflow's delivery.
567
+ const userInputCalls = mocks.sendSignal.mock.calls.filter((call) => call[1] === 'UserInput');
568
+ expect(userInputCalls).toHaveLength(0);
569
+
570
+ // The staged note still rides on the initial message so the agent knows to wait.
571
+ expect(startWorkflow).toHaveBeenCalledWith(
572
+ expect.stringContaining('1 file(s) are being uploaded'),
573
+ expect.anything(),
574
+ );
575
+ });
576
+
577
+ it('carries client-side upload failures in the manifest', async () => {
578
+ const startWorkflow = vi.fn().mockResolvedValue({ agent_run_id: 'agent-run-3' });
579
+ // Only the second upload succeeds. Without the failure in the manifest the workflow
580
+ // would see a complete one-file batch and never report the missing file.
581
+ mocks.uploadArtifact.mockRejectedValueOnce(new Error('storage unavailable')).mockResolvedValueOnce({});
582
+ mockStreamState({
583
+ messages: [],
584
+ isCompleted: false,
585
+ initialHistoryStatus: 'empty',
586
+ agentRunStatus: 'RUNNING',
587
+ });
588
+
589
+ const { container } = renderWithProviders(
590
+ <ModernAgentConversation startWorkflow={startWorkflow} hideHeader initialMessage="" />,
591
+ );
592
+
593
+ const fileInput = container.querySelector('input[type="file"]') as HTMLInputElement;
594
+ fireEvent.change(fileInput, {
595
+ target: {
596
+ files: [
597
+ new File(['a'], 'broken.pdf', { type: 'application/pdf' }),
598
+ new File(['b'], 'good.pdf', { type: 'application/pdf' }),
599
+ ],
600
+ },
601
+ });
602
+ fireEvent.change(screen.getByRole('textbox'), { target: { value: 'Look at these files' } });
603
+ fireEvent.click(screen.getByRole('button', { name: 'Start Agent' }));
604
+
605
+ await waitFor(() => {
606
+ expect(mocks.sendSignal).toHaveBeenCalledWith(
607
+ 'agent-run-3',
608
+ 'FileBatchClosed',
609
+ expect.objectContaining({
610
+ file_ids: [expect.stringMatching(/^file-/)],
611
+ failed_uploads: [{ name: 'broken.pdf', error: 'storage unavailable' }],
612
+ }),
613
+ );
614
+ });
615
+ });
616
+
617
+ it('retries a failed manifest and reports the failure instead of a successful start', async () => {
618
+ const startWorkflow = vi.fn().mockResolvedValue({ agent_run_id: 'agent-run-4' });
619
+ const toast = vi.fn();
620
+ mocks.sendSignal.mockImplementation((_id: string, signalName: string) =>
621
+ signalName === 'FileBatchClosed' ? Promise.reject(new Error('network down')) : Promise.resolve({}),
622
+ );
623
+ mockStreamState({
624
+ messages: [],
625
+ isCompleted: false,
626
+ initialHistoryStatus: 'empty',
627
+ agentRunStatus: 'RUNNING',
628
+ });
629
+
630
+ const { container } = renderWithProviders(
631
+ <ToastContext.Provider value={toast}>
632
+ <ModernAgentConversation startWorkflow={startWorkflow} hideHeader initialMessage="" />
633
+ </ToastContext.Provider>,
634
+ );
635
+
636
+ const fileInput = container.querySelector('input[type="file"]') as HTMLInputElement;
637
+ fireEvent.change(fileInput, {
638
+ target: { files: [new File(['pdf'], 'report.pdf', { type: 'application/pdf' })] },
639
+ });
640
+ fireEvent.change(screen.getByRole('textbox'), { target: { value: 'Look at these files' } });
641
+ fireEvent.click(screen.getByRole('button', { name: 'Start Agent' }));
642
+
643
+ // Three attempts: the manifest is the workflow's only notice that the batch is
644
+ // complete, so losing it strands the agent on a "[Files Ready]" that never arrives.
645
+ await waitFor(
646
+ () => {
647
+ expect(mocks.sendSignal.mock.calls.filter((call) => call[1] === 'FileBatchClosed')).toHaveLength(3);
648
+ },
649
+ { timeout: 5000 },
650
+ );
651
+
652
+ await waitFor(() => {
653
+ expect(toast).toHaveBeenCalledWith(
654
+ expect.objectContaining({
655
+ status: 'error',
656
+ title: 'Files were not delivered to the agent',
657
+ }),
658
+ );
659
+ });
660
+ expect(toast).not.toHaveBeenCalledWith(expect.objectContaining({ title: 'Agent started' }));
661
+ });
662
+ });
663
+
504
664
  it('does not restart or send from a terminal run that cannot continue', () => {
505
665
  mockStreamState({
506
666
  messages: [createMessage(AgentMessageType.COMPLETE, 'done')],
@@ -1,3 +1,4 @@
1
+ import type { VertesiaClient } from '@vertesia/client';
1
2
  import {
2
3
  type ActiveWorkstreamEntry,
3
4
  type AgentMessage,
@@ -6,6 +7,7 @@ import {
6
7
  type AgentToolApprovalMode,
7
8
  type CompletedWorkstreamEntry,
8
9
  type ConversationFile,
10
+ type ConversationFileBatchRef,
9
11
  type ConversationFileRef,
10
12
  FileProcessingStatus,
11
13
  type McpConnectUxConfig,
@@ -119,6 +121,35 @@ export type SendAgentMessageFn = (message: string, inputMetadata?: Record<string
119
121
  const EMPTY_STREAMING_MESSAGES = new Map<string, never>();
120
122
  const COLLAPSED_STAGED_FILE_COUNT = 3;
121
123
 
124
+ const BATCH_CLOSE_RETRY_DELAYS_MS = [400, 1200];
125
+
126
+ /**
127
+ * Send the staged-upload manifest, retrying with bounded backoff.
128
+ *
129
+ * The manifest is the workflow's only notice that the batch is complete: the start message told
130
+ * the agent to wait for "[Files Ready]", so dropping it leaves the run waiting for a turn that
131
+ * never comes. Retries reuse the same `batch_id`, which the workflow treats as idempotent.
132
+ * Returns false once the retries are exhausted so the caller can report the failure.
133
+ */
134
+ async function closeStagedFileBatch(
135
+ client: VertesiaClient,
136
+ agentId: string,
137
+ batch: ConversationFileBatchRef,
138
+ ): Promise<boolean> {
139
+ for (let attempt = 0; ; attempt++) {
140
+ try {
141
+ await client.agents.sendSignal(agentId, 'FileBatchClosed', batch);
142
+ return true;
143
+ } catch (err) {
144
+ if (attempt >= BATCH_CLOSE_RETRY_DELAYS_MS.length) {
145
+ console.error('Failed to close staged file batch:', err);
146
+ return false;
147
+ }
148
+ await new Promise((resolve) => setTimeout(resolve, BATCH_CLOSE_RETRY_DELAYS_MS[attempt]));
149
+ }
150
+ }
151
+ }
152
+
122
153
  function getTimestampMs(timestamp: number | string | undefined): number {
123
154
  if (typeof timestamp === 'number') return timestamp;
124
155
  if (!timestamp) return Date.now();
@@ -592,6 +623,12 @@ export interface ModernAgentConversationProps {
592
623
  onShowDetails?: () => void;
593
624
  /** Whether workflow control actions such as cancel should be shown. */
594
625
  allowWorkflowControl?: boolean;
626
+ /**
627
+ * Workstream selected on mount instead of "all" — use it to open the conversation on one
628
+ * sub-agent (a process agent node's workstream is its node id). Initial value only; the user's
629
+ * later tab choices win.
630
+ */
631
+ initialWorkstream?: string;
595
632
 
596
633
  // File upload props - passed through to MessageInput
597
634
  /** Called when files are dropped/pasted/selected */
@@ -1014,56 +1051,85 @@ function StartWorkflowView({
1014
1051
 
1015
1052
  const agentId = newRun.agent_run_id;
1016
1053
 
1017
- // Upload staged files to the new run's artifact space and signal agent
1018
- const uploadedFiles: string[] = [];
1054
+ // Upload the staged files inline, NOT via the conversation view: consumers like
1055
+ // StudioAssistantPanel feed the new agentRunId straight back as a prop, which
1056
+ // switches ModernAgentConversation to its agentRunId branch and unmounts this
1057
+ // view — any state handoff dies with it. Inline client calls survive regardless
1058
+ // of what renders next. The closing FileBatchClosed manifest names the batch's
1059
+ // exact membership, so the workflow delivers the "[Files Ready]" turn itself
1060
+ // once — and only once — every listed file has settled, even when a small file
1061
+ // finishes processing while a larger one is still uploading. Once the manifest
1062
+ // lands, delivery no longer depends on this client: extraction can outlast a
1063
+ // reload. The upload loop below still does — a tab closed mid-loop never closes
1064
+ // the batch, which is why the send is retried and its failure surfaced.
1065
+ let stagedBatchDelivered = true;
1019
1066
  if (canStageFiles && stagedFiles.length > 0) {
1067
+ const batchId = `batch-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
1068
+ const uploadedFileIds: string[] = [];
1069
+ const failedUploads: { name: string; error?: string }[] = [];
1020
1070
  for (const file of stagedFiles) {
1021
1071
  try {
1022
1072
  const artifactPath = `files/${file.name}`;
1023
1073
  await client.agents.uploadArtifact(agentId, artifactPath, file);
1024
-
1025
- // Signal agent that file was uploaded
1074
+ const fileId = `file-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
1026
1075
  await client.agents.sendSignal(agentId, 'FileUploaded', {
1027
- id: `file-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
1076
+ id: fileId,
1028
1077
  name: file.name,
1029
1078
  content_type: file.type || 'application/octet-stream',
1030
1079
  reference: `artifact:${artifactPath}`,
1031
1080
  artifact_path: artifactPath,
1032
1081
  } as ConversationFileRef);
1033
- uploadedFiles.push(file.name);
1082
+ uploadedFileIds.push(fileId);
1034
1083
  } catch (uploadErr) {
1035
1084
  console.error(`Failed to upload staged file ${file.name}:`, uploadErr);
1036
- // Continue with other files
1085
+ // Carried in the manifest: a 1-of-2 batch would otherwise look
1086
+ // complete to the workflow and the agent would never hear about it.
1087
+ failedUploads.push({
1088
+ name: file.name,
1089
+ error: uploadErr instanceof Error ? uploadErr.message : String(uploadErr),
1090
+ });
1037
1091
  }
1038
1092
  }
1039
-
1040
- // Send a follow-up message to notify the agent that all files are ready
1041
- if (uploadedFiles.length > 0) {
1042
- try {
1043
- await client.agents.sendSignal(agentId, 'UserInput', {
1044
- message: `[Files Ready] All ${uploadedFiles.length} file(s) have been uploaded and are now available: ${uploadedFiles.join(', ')}. You can now process them.`,
1045
- metadata: {
1046
- type: 'files_ready',
1047
- files: uploadedFiles,
1048
- },
1049
- } as UserInputSignal);
1050
- } catch (signalErr) {
1051
- console.error('Failed to send files ready signal:', signalErr);
1052
- }
1093
+ // Close the batch even when every upload failed — the manifest is what lets
1094
+ // the workflow report the outcome instead of leaving the agent parked.
1095
+ stagedBatchDelivered = await closeStagedFileBatch(client, agentId, {
1096
+ batch_id: batchId,
1097
+ file_ids: uploadedFileIds,
1098
+ failed_uploads: failedUploads.length > 0 ? failedUploads : undefined,
1099
+ });
1100
+ if (stagedBatchDelivered) {
1101
+ setStagedFiles([]);
1102
+ }
1103
+ if (failedUploads.length > 0) {
1104
+ toast({
1105
+ title: t('agent.stagedFilesUploadFailed'),
1106
+ status: 'warning',
1107
+ duration: 6000,
1108
+ description: failedUploads.map((f) => f.name).join(', '),
1109
+ });
1053
1110
  }
1054
-
1055
- setStagedFiles([]);
1056
1111
  }
1057
1112
 
1058
1113
  // Clear attachments after successful start
1059
1114
  onAttachmentsSent?.();
1060
1115
  setStartedAgentRunId(agentId);
1061
1116
  setInputValue('');
1062
- toast({
1063
- title: t('agent.agentStarted'),
1064
- status: 'success',
1065
- duration: 3000,
1066
- });
1117
+ if (stagedBatchDelivered) {
1118
+ toast({
1119
+ title: t('agent.agentStarted'),
1120
+ status: 'success',
1121
+ duration: 3000,
1122
+ });
1123
+ } else {
1124
+ // The run exists, but the agent was told to wait for files it will never be
1125
+ // told about — reporting success here would hide that.
1126
+ toast({
1127
+ title: t('agent.stagedFilesNotDelivered'),
1128
+ status: 'error',
1129
+ duration: 8000,
1130
+ description: t('agent.stagedFilesNotDeliveredDescription'),
1131
+ });
1132
+ }
1067
1133
  } catch (err: unknown) {
1068
1134
  setPendingStartMessage(null);
1069
1135
  setPendingStartTimestamp(null);
@@ -1300,8 +1366,11 @@ function StartWorkflowView({
1300
1366
  disabled={isSending}
1301
1367
  rows={2}
1302
1368
  className={cn(
1303
- 'min-h-[72px] resize-none overflow-hidden border-0 bg-transparent px-0 py-0 text-sm leading-6 shadow-none focus-visible:ring-0',
1304
- isExpandedStartComposer && 'min-h-0 flex-1',
1369
+ 'min-h-[72px] resize-none border-0 bg-transparent px-0 py-0 text-sm leading-6 shadow-none focus-visible:ring-0',
1370
+ // The expanded composer is a fixed-height flex box (adjustTextareaHeight
1371
+ // pins it to 100%), so it has to scroll its own overflow. The auto-growing
1372
+ // variant hides overflow because it resizes to fit instead.
1373
+ isExpandedStartComposer ? 'min-h-0 flex-1 overflow-y-auto' : 'overflow-hidden',
1305
1374
  inputClassName,
1306
1375
  )}
1307
1376
  style={
@@ -1453,6 +1522,7 @@ function ModernAgentConversationInner({
1453
1522
  enablePlayback,
1454
1523
  showPlaybackToggle = true,
1455
1524
  messageFilter,
1525
+ initialWorkstream,
1456
1526
  }: ModernAgentConversationProps & { agentRunId: string }) {
1457
1527
  const { t } = useUITranslation();
1458
1528
  const { client } = useUserSession();
@@ -1531,7 +1601,17 @@ function ModernAgentConversationInner({
1531
1601
  );
1532
1602
  const [isStopping, setIsStopping] = useState(false);
1533
1603
  const [isDragOver, setIsDragOver] = useState(false);
1534
- const [activeWorkstream, setActiveWorkstream] = useState('all');
1604
+ const [activeWorkstream, setActiveWorkstream] = useState(initialWorkstream || 'all');
1605
+ // The route can move to another workstream while this component stays mounted — e.g. between
1606
+ // two agent nodes of the same process run, which differ only by a path param — so follow the
1607
+ // prop whenever it actually changes. A manual tab click still wins until it changes again.
1608
+ const requestedWorkstreamRef = useRef(initialWorkstream);
1609
+ useEffect(() => {
1610
+ if (initialWorkstream && initialWorkstream !== requestedWorkstreamRef.current) {
1611
+ requestedWorkstreamRef.current = initialWorkstream;
1612
+ setActiveWorkstream(initialWorkstream);
1613
+ }
1614
+ }, [initialWorkstream]);
1535
1615
  const [playbackCursor, setPlaybackCursor] = useState<AgentChatPlaybackCursor>('live');
1536
1616
  const [isPlaybackToggleEnabled, setIsPlaybackToggleEnabled] = useState(false);
1537
1617
  const [playbackScrollRequestId, setPlaybackScrollRequestId] = useState(0);
@@ -1,6 +1,6 @@
1
1
  import { Button, cn } from '@vertesia/ui/core';
2
2
  import { useUITranslation } from '@vertesia/ui/i18n';
3
- import { Bot, ChevronDown, ChevronRight } from 'lucide-react';
3
+ import { Bot, ChevronDown, ChevronRight, ChevronUp } from 'lucide-react';
4
4
  import { useEffect, useId, useMemo, useState } from 'react';
5
5
  import {
6
6
  formatWorkstreamName,
@@ -24,6 +24,7 @@ export function ActiveWorkstreamsSummary({
24
24
  }: ActiveWorkstreamsSummaryProps) {
25
25
  const { t } = useUITranslation();
26
26
  const [isExpanded, setIsExpanded] = useState(false);
27
+ const [isCollapsed, setIsCollapsed] = useState(false);
27
28
  const listId = useId();
28
29
  const runningWorkstreams = useMemo(
29
30
  () => activeWorkstreams.filter((ws) => ws.status === 'running' || ws.status === 'canceling'),
@@ -49,79 +50,97 @@ export function ActiveWorkstreamsSummary({
49
50
  className="flex flex-col gap-1.5 rounded-2xl border border-border/70 bg-background/95 p-2 text-xs text-muted shadow-lg shadow-black/5"
50
51
  aria-live="polite"
51
52
  >
52
- <div className="flex min-w-0 items-center gap-2 px-1 font-medium">
53
- <Bot className="size-3.5 shrink-0 text-muted" aria-hidden="true" />
54
- <span className="truncate">
55
- {t('agent.activeWorkstreams', { count: runningWorkstreams.length })}
56
- </span>
53
+ <div className="flex items-center justify-between gap-2">
54
+ <div className="flex min-w-0 items-center gap-2 px-1 font-medium">
55
+ <Bot className="size-3.5 shrink-0 text-muted" aria-hidden="true" />
56
+ <span className="truncate">
57
+ {t('agent.activeWorkstreams', { count: runningWorkstreams.length })}
58
+ </span>
59
+ </div>
60
+ <Button
61
+ variant="ghost"
62
+ size="icon"
63
+ onClick={() => setIsCollapsed(!isCollapsed)}
64
+ title={isCollapsed ? t('agent.showActiveWorkstreams') : t('agent.hideActiveWorkstreams')}
65
+ >
66
+ {isCollapsed ? <ChevronUp className="size-4" /> : <ChevronDown className="size-4" />}
67
+ {isCollapsed ? t('agent.showActiveWorkstreams') : t('agent.hideActiveWorkstreams')}
68
+ </Button>
57
69
  </div>
58
- <div id={listId} className="flex flex-col gap-0.5">
59
- {visibleRunningWorkstreams.map((workstream) => {
60
- const workstreamName = getWorkstreamDisplayName(
61
- workstream.workstream_id,
62
- workstream.interaction,
63
- );
64
- const content = (
65
- <>
66
- <span
67
- className={cn(
68
- 'size-1.5 shrink-0 rounded-full',
69
- getWorkstreamStatusClass(workstream.status),
70
- )}
71
- aria-hidden="true"
72
- />
73
- <span className="truncate font-medium">{workstreamName}</span>
74
- {workstream.phase && (
75
- <span className="truncate text-xs text-muted/75">
76
- {formatWorkstreamName(workstream.phase)}
77
- </span>
78
- )}
79
- </>
80
- );
70
+ {isCollapsed ? null : (
71
+ <>
72
+ <div id={listId} className="flex flex-col gap-0.5">
73
+ {visibleRunningWorkstreams.map((workstream) => {
74
+ const workstreamName = getWorkstreamDisplayName(
75
+ workstream.workstream_id,
76
+ workstream.interaction,
77
+ );
78
+ const content = (
79
+ <>
80
+ <span
81
+ className={cn(
82
+ 'size-1.5 shrink-0 rounded-full',
83
+ getWorkstreamStatusClass(workstream.status),
84
+ )}
85
+ aria-hidden="true"
86
+ />
87
+ <span className="truncate font-medium">{workstreamName}</span>
88
+ {workstream.phase && (
89
+ <span className="truncate text-xs text-muted/75">
90
+ {formatWorkstreamName(workstream.phase)}
91
+ </span>
92
+ )}
93
+ </>
94
+ );
81
95
 
82
- return onSelectWorkstream ? (
96
+ return onSelectWorkstream ? (
97
+ <Button
98
+ key={workstream.launch_id || workstream.workstream_id}
99
+ type="button"
100
+ variant="ghost"
101
+ className="h-auto min-w-0 justify-start gap-2 rounded-lg px-1 py-1 text-sm text-foreground/80"
102
+ title={workstreamName}
103
+ onClick={() => {
104
+ setIsExpanded(false);
105
+ onSelectWorkstream(workstream.workstream_id);
106
+ }}
107
+ >
108
+ {content}
109
+ <ChevronRight
110
+ className="ms-auto size-3.5 shrink-0 rtl:rotate-180"
111
+ aria-hidden="true"
112
+ />
113
+ </Button>
114
+ ) : (
115
+ <div
116
+ key={workstream.launch_id || workstream.workstream_id}
117
+ className="flex min-w-0 items-center gap-2 rounded-lg px-1 py-1 text-sm text-foreground/80"
118
+ title={workstreamName}
119
+ >
120
+ {content}
121
+ </div>
122
+ );
123
+ })}
124
+ </div>
125
+ {canExpand && (
83
126
  <Button
84
- key={workstream.launch_id || workstream.workstream_id}
85
127
  type="button"
86
128
  variant="ghost"
87
- className="h-auto min-w-0 justify-start gap-2 rounded-lg px-1 py-1 text-sm text-foreground/80"
88
- title={workstreamName}
89
- onClick={() => {
90
- setIsExpanded(false);
91
- onSelectWorkstream(workstream.workstream_id);
92
- }}
129
+ size="sm"
130
+ className="h-8 w-fit shrink-0 gap-1 rounded-xl px-2.5 text-xs text-muted"
131
+ aria-expanded={isExpanded}
132
+ aria-controls={listId}
133
+ onClick={() => setIsExpanded((expanded) => !expanded)}
93
134
  >
94
- {content}
95
- <ChevronRight className="ms-auto size-3.5 shrink-0 rtl:rotate-180" aria-hidden="true" />
135
+ {!isExpanded && <span>+{hiddenRunningWorkstreamCount}</span>}
136
+ {isExpanded ? t('agent.showLess') : t('agent.showMore')}
137
+ <ChevronDown
138
+ className={cn('size-3.5 transition-transform', isExpanded && 'rotate-180')}
139
+ aria-hidden="true"
140
+ />
96
141
  </Button>
97
- ) : (
98
- <div
99
- key={workstream.launch_id || workstream.workstream_id}
100
- className="flex min-w-0 items-center gap-2 rounded-lg px-1 py-1 text-sm text-foreground/80"
101
- title={workstreamName}
102
- >
103
- {content}
104
- </div>
105
- );
106
- })}
107
- </div>
108
- {canExpand && (
109
- <Button
110
- type="button"
111
- variant="ghost"
112
- size="sm"
113
- className="h-8 w-fit shrink-0 gap-1 rounded-xl px-2.5 text-xs text-muted"
114
- aria-expanded={isExpanded}
115
- aria-controls={listId}
116
- onClick={() => setIsExpanded((expanded) => !expanded)}
117
- >
118
- {!isExpanded && <span>+{hiddenRunningWorkstreamCount}</span>}
119
- {isExpanded ? t('agent.showLess') : t('agent.showMore')}
120
- <ChevronDown
121
- className={cn('size-3.5 transition-transform', isExpanded && 'rotate-180')}
122
- aria-hidden="true"
123
- />
124
- </Button>
142
+ )}
143
+ </>
125
144
  )}
126
145
  </output>
127
146
  </div>