@vertesia/ui 1.0.0-dev.20260128.144200 → 1.0.0-dev.20260225.024852Z

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 (500) hide show
  1. package/lib/esm/core/components/InputList.js +1 -1
  2. package/lib/esm/core/components/InputList.js.map +1 -1
  3. package/lib/esm/core/components/Overlay.js +1 -1
  4. package/lib/esm/core/components/Overlay.js.map +1 -1
  5. package/lib/esm/core/components/SidePanel.js +8 -2
  6. package/lib/esm/core/components/SidePanel.js.map +1 -1
  7. package/lib/esm/core/components/Switch.js +1 -1
  8. package/lib/esm/core/components/Switch.js.map +1 -1
  9. package/lib/esm/core/components/index.js +0 -8
  10. package/lib/esm/core/components/index.js.map +1 -1
  11. package/lib/esm/core/components/shadcn/MessageBox.js.map +1 -0
  12. package/lib/esm/core/components/shadcn/Panel.js +13 -0
  13. package/lib/esm/core/components/shadcn/Panel.js.map +1 -0
  14. package/lib/esm/core/components/{Badge.js → shadcn/badge.js} +2 -2
  15. package/lib/esm/core/components/shadcn/badge.js.map +1 -0
  16. package/lib/esm/core/components/shadcn/command.js +1 -1
  17. package/lib/esm/core/components/shadcn/command.js.map +1 -1
  18. package/lib/esm/core/components/shadcn/filters/filterBar.js +73 -83
  19. package/lib/esm/core/components/shadcn/filters/filterBar.js.map +1 -1
  20. package/lib/esm/core/components/shadcn/index.js +4 -2
  21. package/lib/esm/core/components/shadcn/index.js.map +1 -1
  22. package/lib/esm/core/components/shadcn/modal/ConfirmModal.js +10 -0
  23. package/lib/esm/core/components/shadcn/modal/ConfirmModal.js.map +1 -0
  24. package/lib/esm/core/components/{DeleteModal.js → shadcn/modal/DeleteModal.js} +1 -1
  25. package/lib/esm/core/components/shadcn/modal/DeleteModal.js.map +1 -0
  26. package/lib/esm/core/components/shadcn/{dialog.js → modal/dialog.js} +19 -15
  27. package/lib/esm/core/components/shadcn/modal/dialog.js.map +1 -0
  28. package/lib/esm/core/components/shadcn/modal/index.js +4 -0
  29. package/lib/esm/core/components/shadcn/modal/index.js.map +1 -0
  30. package/lib/esm/core/components/shadcn/popover.js +4 -2
  31. package/lib/esm/core/components/shadcn/popover.js.map +1 -1
  32. package/lib/esm/core/components/shadcn/selectBox.js +19 -15
  33. package/lib/esm/core/components/shadcn/selectBox.js.map +1 -1
  34. package/lib/esm/core/components/shadcn/tabs.js +16 -14
  35. package/lib/esm/core/components/shadcn/tabs.js.map +1 -1
  36. package/lib/esm/core/components/shadcn/textarea.js +30 -2
  37. package/lib/esm/core/components/shadcn/textarea.js.map +1 -1
  38. package/lib/esm/core/components/shadcn/tooltip.js +5 -1
  39. package/lib/esm/core/components/shadcn/tooltip.js.map +1 -1
  40. package/lib/esm/features/agent/PayloadBuilder.js +45 -0
  41. package/lib/esm/features/agent/PayloadBuilder.js.map +1 -1
  42. package/lib/esm/features/agent/chat/AgentChart.js +12 -232
  43. package/lib/esm/features/agent/chat/AgentChart.js.map +1 -1
  44. package/lib/esm/features/agent/chat/AskUserWidget.js +2 -1
  45. package/lib/esm/features/agent/chat/AskUserWidget.js.map +1 -1
  46. package/lib/esm/features/agent/chat/DocumentPanel.js +46 -0
  47. package/lib/esm/features/agent/chat/DocumentPanel.js.map +1 -0
  48. package/lib/esm/features/agent/chat/DocumentTabBar.js +17 -0
  49. package/lib/esm/features/agent/chat/DocumentTabBar.js.map +1 -0
  50. package/lib/esm/features/agent/chat/ModernAgentConversation.js +159 -402
  51. package/lib/esm/features/agent/chat/ModernAgentConversation.js.map +1 -1
  52. package/lib/esm/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js +99 -57
  53. package/lib/esm/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -1
  54. package/lib/esm/features/agent/chat/ModernAgentOutput/BatchProgressPanel.js +4 -4
  55. package/lib/esm/features/agent/chat/ModernAgentOutput/BatchProgressPanel.js.map +1 -1
  56. package/lib/esm/features/agent/chat/ModernAgentOutput/Header.js +4 -4
  57. package/lib/esm/features/agent/chat/ModernAgentOutput/Header.js.map +1 -1
  58. package/lib/esm/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.js +3 -3
  59. package/lib/esm/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.js.map +1 -1
  60. package/lib/esm/features/agent/chat/ModernAgentOutput/MessageInput.js +25 -22
  61. package/lib/esm/features/agent/chat/ModernAgentOutput/MessageInput.js.map +1 -1
  62. package/lib/esm/features/agent/chat/ModernAgentOutput/MessageItem.js +110 -55
  63. package/lib/esm/features/agent/chat/ModernAgentOutput/MessageItem.js.map +1 -1
  64. package/lib/esm/features/agent/chat/ModernAgentOutput/StreamingMessage.js +2 -2
  65. package/lib/esm/features/agent/chat/ModernAgentOutput/StreamingMessage.js.map +1 -1
  66. package/lib/esm/features/agent/chat/ModernAgentOutput/ToolCallGroup.js +146 -55
  67. package/lib/esm/features/agent/chat/ModernAgentOutput/ToolCallGroup.js.map +1 -1
  68. package/lib/esm/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js +5 -6
  69. package/lib/esm/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js.map +1 -1
  70. package/lib/esm/features/agent/chat/ModernAgentOutput/utils.js +110 -2
  71. package/lib/esm/features/agent/chat/ModernAgentOutput/utils.js.map +1 -1
  72. package/lib/esm/features/agent/chat/SkillWidgetProvider.js +28 -15
  73. package/lib/esm/features/agent/chat/SkillWidgetProvider.js.map +1 -1
  74. package/lib/esm/features/agent/chat/hooks/useAgentPlans.js +146 -0
  75. package/lib/esm/features/agent/chat/hooks/useAgentPlans.js.map +1 -0
  76. package/lib/esm/features/agent/chat/hooks/useAgentStream.js +180 -0
  77. package/lib/esm/features/agent/chat/hooks/useAgentStream.js.map +1 -0
  78. package/lib/esm/features/agent/chat/hooks/useDocumentPanel.js +100 -0
  79. package/lib/esm/features/agent/chat/hooks/useDocumentPanel.js.map +1 -0
  80. package/lib/esm/features/agent/chat/hooks/useFileProcessing.js +90 -0
  81. package/lib/esm/features/agent/chat/hooks/useFileProcessing.js.map +1 -0
  82. package/lib/esm/features/agent/chat/index.js +6 -5
  83. package/lib/esm/features/agent/chat/index.js.map +1 -1
  84. package/lib/esm/features/agent/chat/types/document.js +2 -0
  85. package/lib/esm/features/agent/chat/types/document.js.map +1 -0
  86. package/lib/esm/features/agent/index.js +0 -2
  87. package/lib/esm/features/agent/index.js.map +1 -1
  88. package/lib/esm/features/store/collections/BrowseCollectionView.js +4 -6
  89. package/lib/esm/features/store/collections/BrowseCollectionView.js.map +1 -1
  90. package/lib/esm/features/store/collections/CreateCollection.js +4 -4
  91. package/lib/esm/features/store/collections/CreateCollection.js.map +1 -1
  92. package/lib/esm/features/store/collections/EditCollectionView.js +1 -1
  93. package/lib/esm/features/store/collections/EditCollectionView.js.map +1 -1
  94. package/lib/esm/features/store/objects/DocumentSearchResults.js +5 -5
  95. package/lib/esm/features/store/objects/DocumentSearchResults.js.map +1 -1
  96. package/lib/esm/features/store/objects/ExportPropertiesModal.js +3 -3
  97. package/lib/esm/features/store/objects/ExportPropertiesModal.js.map +1 -1
  98. package/lib/esm/features/store/objects/components/ContentOverview.js +19 -120
  99. package/lib/esm/features/store/objects/components/ContentOverview.js.map +1 -1
  100. package/lib/esm/features/store/objects/components/PropertiesEditorModal.js +1 -1
  101. package/lib/esm/features/store/objects/components/PropertiesEditorModal.js.map +1 -1
  102. package/lib/esm/features/store/objects/components/SelectDocumentModal.js +2 -2
  103. package/lib/esm/features/store/objects/components/SelectDocumentModal.js.map +1 -1
  104. package/lib/esm/features/store/objects/components/VectorSearchWidget.js +1 -1
  105. package/lib/esm/features/store/objects/components/VectorSearchWidget.js.map +1 -1
  106. package/lib/esm/features/store/objects/components/index.js +1 -1
  107. package/lib/esm/features/store/objects/components/index.js.map +1 -1
  108. package/lib/esm/features/store/objects/components/useDownloadFile.js +192 -0
  109. package/lib/esm/features/store/objects/components/useDownloadFile.js.map +1 -0
  110. package/lib/esm/features/store/objects/search/DocumentSearchContext.js +1 -2
  111. package/lib/esm/features/store/objects/search/DocumentSearchContext.js.map +1 -1
  112. package/lib/esm/features/store/objects/selection/SelectionActions.js +5 -8
  113. package/lib/esm/features/store/objects/selection/SelectionActions.js.map +1 -1
  114. package/lib/esm/features/store/objects/selection/actions/AddToCollectionAction.js +4 -4
  115. package/lib/esm/features/store/objects/selection/actions/AddToCollectionAction.js.map +1 -1
  116. package/lib/esm/features/store/objects/selection/actions/ChangeTypeAction.js +2 -2
  117. package/lib/esm/features/store/objects/selection/actions/ChangeTypeAction.js.map +1 -1
  118. package/lib/esm/features/store/objects/selection/actions/ExportPropertiesAction.js +1 -1
  119. package/lib/esm/features/store/objects/selection/actions/ExportPropertiesAction.js.map +1 -1
  120. package/lib/esm/features/store/objects/selection/actions/StartWorkflowComponent.js +3 -3
  121. package/lib/esm/features/store/objects/selection/actions/StartWorkflowComponent.js.map +1 -1
  122. package/lib/esm/features/store/objects/upload/DocumentUploadModal.js +13 -13
  123. package/lib/esm/features/store/objects/upload/DocumentUploadModal.js.map +1 -1
  124. package/lib/esm/features/store/objects/upload/useSmartFileUploadProcessing.js +15 -8
  125. package/lib/esm/features/store/objects/upload/useSmartFileUploadProcessing.js.map +1 -1
  126. package/lib/esm/features/store/types/ObjectSchemaEditor.js +6 -5
  127. package/lib/esm/features/store/types/ObjectSchemaEditor.js.map +1 -1
  128. package/lib/esm/features/store/types/SelectContentType.js +3 -3
  129. package/lib/esm/features/store/types/SelectContentType.js.map +1 -1
  130. package/lib/esm/features/store/types/SelectContentTypeModal.js +5 -4
  131. package/lib/esm/features/store/types/SelectContentTypeModal.js.map +1 -1
  132. package/lib/esm/features/store/types/TableLayoutEditor.js +4 -4
  133. package/lib/esm/features/store/types/TableLayoutEditor.js.map +1 -1
  134. package/lib/esm/features/user/UserInfo.js +73 -9
  135. package/lib/esm/features/user/UserInfo.js.map +1 -1
  136. package/lib/esm/features/utils/print.js +0 -1
  137. package/lib/esm/features/utils/print.js.map +1 -1
  138. package/lib/esm/layout/AppLayout.js +3 -4
  139. package/lib/esm/layout/AppLayout.js.map +1 -1
  140. package/lib/esm/layout/Sidebar.js +5 -5
  141. package/lib/esm/layout/Sidebar.js.map +1 -1
  142. package/lib/esm/router/HistoryNavigator.js +7 -1
  143. package/lib/esm/router/HistoryNavigator.js.map +1 -1
  144. package/lib/esm/router/Nav.js +2 -2
  145. package/lib/esm/router/Nav.js.map +1 -1
  146. package/lib/esm/session/UserSession.js +35 -9
  147. package/lib/esm/session/UserSession.js.map +1 -1
  148. package/lib/esm/session/UserSessionProvider.js +3 -2
  149. package/lib/esm/session/UserSessionProvider.js.map +1 -1
  150. package/lib/esm/shell/apps/AppProjectSelector.js +2 -2
  151. package/lib/esm/shell/apps/AppProjectSelector.js.map +1 -1
  152. package/lib/esm/shell/apps/StandaloneApp.js +2 -2
  153. package/lib/esm/shell/apps/StandaloneApp.js.map +1 -1
  154. package/lib/esm/shell/login/InviteAcceptModal.js +2 -2
  155. package/lib/esm/shell/login/InviteAcceptModal.js.map +1 -1
  156. package/lib/esm/shell/login/SignInModal.js +1 -1
  157. package/lib/esm/shell/login/SignInModal.js.map +1 -1
  158. package/lib/esm/shell/login/SignupForm.js +2 -2
  159. package/lib/esm/shell/login/SignupForm.js.map +1 -1
  160. package/lib/esm/shell/login/UserInfo.js +2 -2
  161. package/lib/esm/shell/login/UserInfo.js.map +1 -1
  162. package/lib/esm/widgets/json-view/JSONCode.js +1 -1
  163. package/lib/esm/widgets/json-view/JSONCode.js.map +1 -1
  164. package/lib/esm/widgets/json-view/JSONDisplay.js +1 -1
  165. package/lib/esm/widgets/json-view/JSONDisplay.js.map +1 -1
  166. package/lib/esm/widgets/markdown/ArtifactContentRenderer.js +84 -13
  167. package/lib/esm/widgets/markdown/ArtifactContentRenderer.js.map +1 -1
  168. package/lib/esm/widgets/markdown/MarkdownFigure.js +40 -0
  169. package/lib/esm/widgets/markdown/MarkdownFigure.js.map +1 -0
  170. package/lib/esm/widgets/markdown/MarkdownRenderer.js +42 -7
  171. package/lib/esm/widgets/markdown/MarkdownRenderer.js.map +1 -1
  172. package/lib/esm/widgets/markdown/MermaidDiagram.js +80 -5
  173. package/lib/esm/widgets/markdown/MermaidDiagram.js.map +1 -1
  174. package/lib/esm/widgets/markdown/codeBlockHandlers.js +33 -33
  175. package/lib/esm/widgets/markdown/codeBlockHandlers.js.map +1 -1
  176. package/lib/esm/widgets/markdown/codeBlockHandlers.test.js +2 -29
  177. package/lib/esm/widgets/markdown/codeBlockHandlers.test.js.map +1 -1
  178. package/lib/esm/widgets/markdown/index.js +1 -0
  179. package/lib/esm/widgets/markdown/index.js.map +1 -1
  180. package/lib/esm/widgets/markdown/normalizeCustomSchemeLinks.js +77 -0
  181. package/lib/esm/widgets/markdown/normalizeCustomSchemeLinks.js.map +1 -0
  182. package/lib/esm/widgets/markdown/normalizeDirectives.js +45 -0
  183. package/lib/esm/widgets/markdown/normalizeDirectives.js.map +1 -0
  184. package/lib/esm/widgets/markdown/remarkDirectiveHandler.js +96 -0
  185. package/lib/esm/widgets/markdown/remarkDirectiveHandler.js.map +1 -0
  186. package/lib/esm/widgets/monacoEditor/MonacoEditor.js +8 -14
  187. package/lib/esm/widgets/monacoEditor/MonacoEditor.js.map +1 -1
  188. package/lib/esm/widgets/schema-editor/ManagedSchema.js.map +1 -1
  189. package/lib/esm/widgets/schema-editor/editor/PropertyEditor.js +3 -3
  190. package/lib/esm/widgets/schema-editor/editor/PropertyEditor.js.map +1 -1
  191. package/lib/esm/widgets/schema-editor/json-schema4-utils.js.map +1 -1
  192. package/lib/tsconfig.tsbuildinfo +1 -1
  193. package/lib/types/core/components/SidePanel.d.ts +4 -1
  194. package/lib/types/core/components/SidePanel.d.ts.map +1 -1
  195. package/lib/types/core/components/index.d.ts +0 -8
  196. package/lib/types/core/components/index.d.ts.map +1 -1
  197. package/lib/types/core/components/shadcn/MessageBox.d.ts.map +1 -0
  198. package/lib/types/core/components/{Panel.d.ts → shadcn/Panel.d.ts} +3 -1
  199. package/lib/types/core/components/shadcn/Panel.d.ts.map +1 -0
  200. package/lib/types/core/components/{Badge.d.ts → shadcn/badge.d.ts} +4 -4
  201. package/lib/types/core/components/shadcn/badge.d.ts.map +1 -0
  202. package/lib/types/core/components/shadcn/button.d.ts +1 -1
  203. package/lib/types/core/components/shadcn/filters/filterBar.d.ts.map +1 -1
  204. package/lib/types/core/components/shadcn/index.d.ts +4 -2
  205. package/lib/types/core/components/shadcn/index.d.ts.map +1 -1
  206. package/lib/types/core/components/shadcn/input.d.ts +1 -1
  207. package/lib/types/core/components/shadcn/modal/ConfirmModal.d.ts.map +1 -0
  208. package/lib/types/core/components/shadcn/modal/DeleteModal.d.ts.map +1 -0
  209. package/lib/types/core/components/shadcn/{dialog.d.ts → modal/dialog.d.ts} +7 -4
  210. package/lib/types/core/components/shadcn/modal/dialog.d.ts.map +1 -0
  211. package/lib/types/core/components/shadcn/modal/index.d.ts +4 -0
  212. package/lib/types/core/components/shadcn/modal/index.d.ts.map +1 -0
  213. package/lib/types/core/components/shadcn/popover.d.ts.map +1 -1
  214. package/lib/types/core/components/shadcn/selectBox.d.ts +9 -5
  215. package/lib/types/core/components/shadcn/selectBox.d.ts.map +1 -1
  216. package/lib/types/core/components/shadcn/tabs.d.ts +14 -5
  217. package/lib/types/core/components/shadcn/tabs.d.ts.map +1 -1
  218. package/lib/types/core/components/shadcn/textarea.d.ts +6 -2
  219. package/lib/types/core/components/shadcn/textarea.d.ts.map +1 -1
  220. package/lib/types/core/components/shadcn/tooltip.d.ts.map +1 -1
  221. package/lib/types/features/agent/PayloadBuilder.d.ts +22 -4
  222. package/lib/types/features/agent/PayloadBuilder.d.ts.map +1 -1
  223. package/lib/types/features/agent/chat/AgentChart.d.ts +3 -44
  224. package/lib/types/features/agent/chat/AgentChart.d.ts.map +1 -1
  225. package/lib/types/features/agent/chat/AskUserWidget.d.ts.map +1 -1
  226. package/lib/types/features/agent/chat/DocumentPanel.d.ts +16 -0
  227. package/lib/types/features/agent/chat/DocumentPanel.d.ts.map +1 -0
  228. package/lib/types/features/agent/chat/DocumentTabBar.d.ts +10 -0
  229. package/lib/types/features/agent/chat/DocumentTabBar.d.ts.map +1 -0
  230. package/lib/types/features/agent/chat/ModernAgentConversation.d.ts +69 -1
  231. package/lib/types/features/agent/chat/ModernAgentConversation.d.ts.map +1 -1
  232. package/lib/types/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts +36 -1
  233. package/lib/types/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts.map +1 -1
  234. package/lib/types/features/agent/chat/ModernAgentOutput/BatchProgressPanel.d.ts +18 -2
  235. package/lib/types/features/agent/chat/ModernAgentOutput/BatchProgressPanel.d.ts.map +1 -1
  236. package/lib/types/features/agent/chat/ModernAgentOutput/Header.d.ts +4 -7
  237. package/lib/types/features/agent/chat/ModernAgentOutput/Header.d.ts.map +1 -1
  238. package/lib/types/features/agent/chat/ModernAgentOutput/MessageInput.d.ts +2 -1
  239. package/lib/types/features/agent/chat/ModernAgentOutput/MessageInput.d.ts.map +1 -1
  240. package/lib/types/features/agent/chat/ModernAgentOutput/MessageItem.d.ts +35 -7
  241. package/lib/types/features/agent/chat/ModernAgentOutput/MessageItem.d.ts.map +1 -1
  242. package/lib/types/features/agent/chat/ModernAgentOutput/StreamingMessage.d.ts +11 -1
  243. package/lib/types/features/agent/chat/ModernAgentOutput/StreamingMessage.d.ts.map +1 -1
  244. package/lib/types/features/agent/chat/ModernAgentOutput/ToolCallGroup.d.ts +20 -2
  245. package/lib/types/features/agent/chat/ModernAgentOutput/ToolCallGroup.d.ts.map +1 -1
  246. package/lib/types/features/agent/chat/ModernAgentOutput/WorkstreamTabs.d.ts.map +1 -1
  247. package/lib/types/features/agent/chat/ModernAgentOutput/utils.d.ts +18 -1
  248. package/lib/types/features/agent/chat/ModernAgentOutput/utils.d.ts.map +1 -1
  249. package/lib/types/features/agent/chat/SkillWidgetProvider.d.ts.map +1 -1
  250. package/lib/types/features/agent/chat/hooks/useAgentPlans.d.ts +22 -0
  251. package/lib/types/features/agent/chat/hooks/useAgentPlans.d.ts.map +1 -0
  252. package/lib/types/features/agent/chat/hooks/useAgentStream.d.ts +42 -0
  253. package/lib/types/features/agent/chat/hooks/useAgentStream.d.ts.map +1 -0
  254. package/lib/types/features/agent/chat/hooks/useDocumentPanel.d.ts +22 -0
  255. package/lib/types/features/agent/chat/hooks/useDocumentPanel.d.ts.map +1 -0
  256. package/lib/types/features/agent/chat/hooks/useFileProcessing.d.ts +27 -0
  257. package/lib/types/features/agent/chat/hooks/useFileProcessing.d.ts.map +1 -0
  258. package/lib/types/features/agent/chat/index.d.ts +12 -8
  259. package/lib/types/features/agent/chat/index.d.ts.map +1 -1
  260. package/lib/types/features/agent/chat/types/document.d.ts +5 -0
  261. package/lib/types/features/agent/chat/types/document.d.ts.map +1 -0
  262. package/lib/types/features/agent/index.d.ts +0 -2
  263. package/lib/types/features/agent/index.d.ts.map +1 -1
  264. package/lib/types/features/store/collections/BrowseCollectionView.d.ts.map +1 -1
  265. package/lib/types/features/store/objects/ExportPropertiesModal.d.ts.map +1 -1
  266. package/lib/types/features/store/objects/components/ContentOverview.d.ts.map +1 -1
  267. package/lib/types/features/store/objects/components/PropertiesEditorModal.d.ts.map +1 -1
  268. package/lib/types/features/store/objects/components/index.d.ts +1 -1
  269. package/lib/types/features/store/objects/components/index.d.ts.map +1 -1
  270. package/lib/types/features/store/objects/components/useDownloadFile.d.ts +35 -0
  271. package/lib/types/features/store/objects/components/useDownloadFile.d.ts.map +1 -0
  272. package/lib/types/features/store/objects/search/DocumentSearchContext.d.ts.map +1 -1
  273. package/lib/types/features/store/objects/selection/SelectionActions.d.ts +1 -1
  274. package/lib/types/features/store/objects/selection/SelectionActions.d.ts.map +1 -1
  275. package/lib/types/features/store/objects/selection/actions/ChangeTypeAction.d.ts.map +1 -1
  276. package/lib/types/features/store/objects/selection/actions/ExportPropertiesAction.d.ts.map +1 -1
  277. package/lib/types/features/store/objects/upload/useSmartFileUploadProcessing.d.ts.map +1 -1
  278. package/lib/types/features/store/types/ObjectSchemaEditor.d.ts +2 -1
  279. package/lib/types/features/store/types/ObjectSchemaEditor.d.ts.map +1 -1
  280. package/lib/types/features/store/types/SelectContentTypeModal.d.ts +1 -1
  281. package/lib/types/features/store/types/SelectContentTypeModal.d.ts.map +1 -1
  282. package/lib/types/features/store/types/TableLayoutEditor.d.ts +2 -1
  283. package/lib/types/features/store/types/TableLayoutEditor.d.ts.map +1 -1
  284. package/lib/types/features/user/UserInfo.d.ts +12 -1
  285. package/lib/types/features/user/UserInfo.d.ts.map +1 -1
  286. package/lib/types/features/utils/print.d.ts.map +1 -1
  287. package/lib/types/layout/AppLayout.d.ts.map +1 -1
  288. package/lib/types/layout/Sidebar.d.ts +4 -2
  289. package/lib/types/layout/Sidebar.d.ts.map +1 -1
  290. package/lib/types/router/HistoryNavigator.d.ts.map +1 -1
  291. package/lib/types/router/Nav.d.ts +6 -1
  292. package/lib/types/router/Nav.d.ts.map +1 -1
  293. package/lib/types/session/UserSession.d.ts.map +1 -1
  294. package/lib/types/session/UserSessionProvider.d.ts +1 -0
  295. package/lib/types/session/UserSessionProvider.d.ts.map +1 -1
  296. package/lib/types/widgets/json-view/JSONCode.d.ts.map +1 -1
  297. package/lib/types/widgets/markdown/ArtifactContentRenderer.d.ts +10 -1
  298. package/lib/types/widgets/markdown/ArtifactContentRenderer.d.ts.map +1 -1
  299. package/lib/types/widgets/markdown/MarkdownFigure.d.ts +15 -0
  300. package/lib/types/widgets/markdown/MarkdownFigure.d.ts.map +1 -0
  301. package/lib/types/widgets/markdown/MarkdownRenderer.d.ts.map +1 -1
  302. package/lib/types/widgets/markdown/MermaidDiagram.d.ts.map +1 -1
  303. package/lib/types/widgets/markdown/codeBlockHandlers.d.ts +5 -2
  304. package/lib/types/widgets/markdown/codeBlockHandlers.d.ts.map +1 -1
  305. package/lib/types/widgets/markdown/index.d.ts +1 -0
  306. package/lib/types/widgets/markdown/index.d.ts.map +1 -1
  307. package/lib/types/widgets/markdown/normalizeCustomSchemeLinks.d.ts +9 -0
  308. package/lib/types/widgets/markdown/normalizeCustomSchemeLinks.d.ts.map +1 -0
  309. package/lib/types/widgets/markdown/normalizeDirectives.d.ts +20 -0
  310. package/lib/types/widgets/markdown/normalizeDirectives.d.ts.map +1 -0
  311. package/lib/types/widgets/markdown/remarkDirectiveHandler.d.ts +2 -0
  312. package/lib/types/widgets/markdown/remarkDirectiveHandler.d.ts.map +1 -0
  313. package/lib/types/widgets/monacoEditor/MonacoEditor.d.ts +1 -3
  314. package/lib/types/widgets/monacoEditor/MonacoEditor.d.ts.map +1 -1
  315. package/lib/types/widgets/schema-editor/ManagedSchema.d.ts +1 -1
  316. package/lib/types/widgets/schema-editor/ManagedSchema.d.ts.map +1 -1
  317. package/lib/vertesia-ui-core.js +1 -1
  318. package/lib/vertesia-ui-core.js.map +1 -1
  319. package/lib/vertesia-ui-features.js +1 -1
  320. package/lib/vertesia-ui-features.js.map +1 -1
  321. package/lib/vertesia-ui-layout.js +1 -1
  322. package/lib/vertesia-ui-layout.js.map +1 -1
  323. package/lib/vertesia-ui-router.js +1 -1
  324. package/lib/vertesia-ui-router.js.map +1 -1
  325. package/lib/vertesia-ui-session.js +1 -1
  326. package/lib/vertesia-ui-session.js.map +1 -1
  327. package/lib/vertesia-ui-shell.js +1 -1
  328. package/lib/vertesia-ui-shell.js.map +1 -1
  329. package/lib/vertesia-ui-widgets.js +1 -1
  330. package/lib/vertesia-ui-widgets.js.map +1 -1
  331. package/package.json +14 -10
  332. package/src/core/components/InputList.tsx +1 -1
  333. package/src/core/components/Overlay.tsx +1 -1
  334. package/src/core/components/SidePanel.tsx +29 -15
  335. package/src/core/components/Switch.tsx +1 -1
  336. package/src/core/components/index.ts +0 -8
  337. package/src/core/components/shadcn/Panel.tsx +50 -0
  338. package/src/core/components/{Badge.tsx → shadcn/badge.tsx} +3 -3
  339. package/src/core/components/shadcn/command.tsx +1 -1
  340. package/src/core/components/shadcn/filters/filterBar.tsx +76 -87
  341. package/src/core/components/shadcn/index.ts +5 -3
  342. package/src/core/components/{ConfirmModal.tsx → shadcn/modal/ConfirmModal.tsx} +8 -8
  343. package/src/core/components/{DeleteModal.tsx → shadcn/modal/DeleteModal.tsx} +1 -1
  344. package/src/core/components/shadcn/{dialog.tsx → modal/dialog.tsx} +43 -32
  345. package/src/core/components/shadcn/modal/index.ts +3 -0
  346. package/src/core/components/shadcn/popover.tsx +4 -2
  347. package/src/core/components/shadcn/selectBox.tsx +71 -52
  348. package/src/core/components/shadcn/tabs.tsx +36 -19
  349. package/src/core/components/shadcn/textarea.tsx +43 -2
  350. package/src/core/components/shadcn/tooltip.tsx +23 -17
  351. package/src/features/agent/PayloadBuilder.tsx +70 -9
  352. package/src/features/agent/chat/AgentChart.tsx +46 -678
  353. package/src/features/agent/chat/AskUserWidget.tsx +4 -3
  354. package/src/features/agent/chat/DocumentPanel.tsx +120 -0
  355. package/src/features/agent/chat/DocumentTabBar.tsx +49 -0
  356. package/src/features/agent/chat/ModernAgentConversation.tsx +403 -549
  357. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +162 -55
  358. package/src/features/agent/chat/ModernAgentOutput/BatchProgressPanel.tsx +40 -10
  359. package/src/features/agent/chat/ModernAgentOutput/Header.tsx +12 -16
  360. package/src/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.tsx +3 -3
  361. package/src/features/agent/chat/ModernAgentOutput/MessageInput.tsx +68 -75
  362. package/src/features/agent/chat/ModernAgentOutput/MessageItem.tsx +206 -94
  363. package/src/features/agent/chat/ModernAgentOutput/StreamingMessage.tsx +22 -5
  364. package/src/features/agent/chat/ModernAgentOutput/ToolCallGroup.tsx +295 -113
  365. package/src/features/agent/chat/ModernAgentOutput/WorkstreamTabs.tsx +11 -8
  366. package/src/features/agent/chat/ModernAgentOutput/utils.ts +133 -4
  367. package/src/features/agent/chat/SkillWidgetProvider.tsx +32 -15
  368. package/src/features/agent/chat/hooks/useAgentPlans.ts +190 -0
  369. package/src/features/agent/chat/hooks/useAgentStream.ts +239 -0
  370. package/src/features/agent/chat/hooks/useDocumentPanel.ts +118 -0
  371. package/src/features/agent/chat/hooks/useFileProcessing.ts +126 -0
  372. package/src/features/agent/chat/index.ts +18 -17
  373. package/src/features/agent/chat/types/document.ts +4 -0
  374. package/src/features/agent/index.ts +0 -2
  375. package/src/features/store/collections/BrowseCollectionView.tsx +5 -8
  376. package/src/features/store/collections/CreateCollection.tsx +8 -8
  377. package/src/features/store/collections/EditCollectionView.tsx +1 -1
  378. package/src/features/store/objects/DocumentSearchResults.tsx +9 -13
  379. package/src/features/store/objects/ExportPropertiesModal.tsx +9 -7
  380. package/src/features/store/objects/components/ContentOverview.tsx +29 -155
  381. package/src/features/store/objects/components/PropertiesEditorModal.tsx +0 -1
  382. package/src/features/store/objects/components/SelectDocumentModal.tsx +6 -6
  383. package/src/features/store/objects/components/VectorSearchWidget.tsx +2 -2
  384. package/src/features/store/objects/components/index.ts +1 -1
  385. package/src/features/store/objects/components/useDownloadFile.ts +237 -0
  386. package/src/features/store/objects/search/DocumentSearchContext.ts +1 -2
  387. package/src/features/store/objects/selection/SelectionActions.tsx +0 -4
  388. package/src/features/store/objects/selection/actions/AddToCollectionAction.tsx +13 -13
  389. package/src/features/store/objects/selection/actions/ChangeTypeAction.tsx +2 -6
  390. package/src/features/store/objects/selection/actions/ExportPropertiesAction.tsx +1 -3
  391. package/src/features/store/objects/selection/actions/StartWorkflowComponent.tsx +8 -8
  392. package/src/features/store/objects/upload/DocumentUploadModal.tsx +25 -25
  393. package/src/features/store/objects/upload/useSmartFileUploadProcessing.ts +16 -10
  394. package/src/features/store/types/ObjectSchemaEditor.tsx +32 -29
  395. package/src/features/store/types/SelectContentType.tsx +3 -3
  396. package/src/features/store/types/SelectContentTypeModal.tsx +17 -30
  397. package/src/features/store/types/TableLayoutEditor.tsx +14 -18
  398. package/src/features/user/UserInfo.tsx +176 -10
  399. package/src/features/utils/print.ts +0 -1
  400. package/src/layout/AppLayout.tsx +16 -44
  401. package/src/layout/Sidebar.tsx +7 -5
  402. package/src/router/HistoryNavigator.ts +9 -1
  403. package/src/router/Nav.tsx +7 -2
  404. package/src/session/UserSession.ts +38 -9
  405. package/src/session/UserSessionProvider.tsx +3 -2
  406. package/src/shell/apps/AppProjectSelector.tsx +2 -2
  407. package/src/shell/apps/StandaloneApp.tsx +3 -3
  408. package/src/shell/login/InviteAcceptModal.tsx +6 -6
  409. package/src/shell/login/SignInModal.tsx +1 -1
  410. package/src/shell/login/SignupForm.tsx +3 -3
  411. package/src/shell/login/UserInfo.tsx +5 -5
  412. package/src/widgets/json-view/JSONCode.tsx +1 -3
  413. package/src/widgets/json-view/JSONDisplay.tsx +1 -1
  414. package/src/widgets/markdown/ArtifactContentRenderer.tsx +115 -14
  415. package/src/widgets/markdown/MarkdownFigure.tsx +100 -0
  416. package/src/widgets/markdown/MarkdownRenderer.tsx +62 -9
  417. package/src/widgets/markdown/MermaidDiagram.tsx +97 -5
  418. package/src/widgets/markdown/codeBlockHandlers.test.tsx +3 -34
  419. package/src/widgets/markdown/codeBlockHandlers.tsx +47 -42
  420. package/src/widgets/markdown/index.ts +1 -0
  421. package/src/widgets/markdown/markdown.css +192 -0
  422. package/src/widgets/markdown/normalizeCustomSchemeLinks.test.ts +86 -0
  423. package/src/widgets/markdown/normalizeCustomSchemeLinks.ts +91 -0
  424. package/src/widgets/markdown/normalizeDirectives.ts +50 -0
  425. package/src/widgets/markdown/remarkDirectiveHandler.ts +119 -0
  426. package/src/widgets/monacoEditor/MonacoEditor.tsx +8 -22
  427. package/src/widgets/schema-editor/ManagedSchema.ts +1 -1
  428. package/src/widgets/schema-editor/editor/PropertyEditor.tsx +5 -5
  429. package/src/widgets/schema-editor/json-schema4-utils.ts +1 -1
  430. package/lib/esm/core/components/Badge.js.map +0 -1
  431. package/lib/esm/core/components/Button.js +0 -32
  432. package/lib/esm/core/components/Button.js.map +0 -1
  433. package/lib/esm/core/components/ConfirmModal.js +0 -10
  434. package/lib/esm/core/components/ConfirmModal.js.map +0 -1
  435. package/lib/esm/core/components/DeleteModal.js.map +0 -1
  436. package/lib/esm/core/components/MessageBox.js.map +0 -1
  437. package/lib/esm/core/components/Modal.js +0 -26
  438. package/lib/esm/core/components/Modal.js.map +0 -1
  439. package/lib/esm/core/components/Panel.js +0 -8
  440. package/lib/esm/core/components/Panel.js.map +0 -1
  441. package/lib/esm/core/components/SelectBox.js +0 -67
  442. package/lib/esm/core/components/SelectBox.js.map +0 -1
  443. package/lib/esm/core/components/shadcn/dialog.js.map +0 -1
  444. package/lib/esm/core/components/tabs/Tabs.js +0 -78
  445. package/lib/esm/core/components/tabs/Tabs.js.map +0 -1
  446. package/lib/esm/core/components/tabs/TabsContext.js +0 -7
  447. package/lib/esm/core/components/tabs/TabsContext.js.map +0 -1
  448. package/lib/esm/core/components/tabs/index.js +0 -3
  449. package/lib/esm/core/components/tabs/index.js.map +0 -1
  450. package/lib/esm/features/agent/createChartTool.js +0 -632
  451. package/lib/esm/features/agent/createChartTool.js.map +0 -1
  452. package/lib/esm/features/agent/examples.js +0 -295
  453. package/lib/esm/features/agent/examples.js.map +0 -1
  454. package/lib/esm/features/agent/visualization.js +0 -165
  455. package/lib/esm/features/agent/visualization.js.map +0 -1
  456. package/lib/esm/features/store/objects/components/useDownloadObject.js +0 -21
  457. package/lib/esm/features/store/objects/components/useDownloadObject.js.map +0 -1
  458. package/lib/types/core/components/Badge.d.ts.map +0 -1
  459. package/lib/types/core/components/Button.d.ts +0 -14
  460. package/lib/types/core/components/Button.d.ts.map +0 -1
  461. package/lib/types/core/components/ConfirmModal.d.ts.map +0 -1
  462. package/lib/types/core/components/DeleteModal.d.ts.map +0 -1
  463. package/lib/types/core/components/MessageBox.d.ts.map +0 -1
  464. package/lib/types/core/components/Modal.d.ts +0 -30
  465. package/lib/types/core/components/Modal.d.ts.map +0 -1
  466. package/lib/types/core/components/Panel.d.ts.map +0 -1
  467. package/lib/types/core/components/SelectBox.d.ts +0 -36
  468. package/lib/types/core/components/SelectBox.d.ts.map +0 -1
  469. package/lib/types/core/components/shadcn/dialog.d.ts.map +0 -1
  470. package/lib/types/core/components/tabs/Tabs.d.ts +0 -25
  471. package/lib/types/core/components/tabs/Tabs.d.ts.map +0 -1
  472. package/lib/types/core/components/tabs/TabsContext.d.ts +0 -17
  473. package/lib/types/core/components/tabs/TabsContext.d.ts.map +0 -1
  474. package/lib/types/core/components/tabs/index.d.ts +0 -3
  475. package/lib/types/core/components/tabs/index.d.ts.map +0 -1
  476. package/lib/types/features/agent/createChartTool.d.ts +0 -178
  477. package/lib/types/features/agent/createChartTool.d.ts.map +0 -1
  478. package/lib/types/features/agent/examples.d.ts +0 -59
  479. package/lib/types/features/agent/examples.d.ts.map +0 -1
  480. package/lib/types/features/agent/visualization.d.ts +0 -95
  481. package/lib/types/features/agent/visualization.d.ts.map +0 -1
  482. package/lib/types/features/store/objects/components/useDownloadObject.d.ts +0 -4
  483. package/lib/types/features/store/objects/components/useDownloadObject.d.ts.map +0 -1
  484. package/src/core/components/Button.tsx +0 -63
  485. package/src/core/components/Modal.tsx +0 -144
  486. package/src/core/components/Panel.tsx +0 -34
  487. package/src/core/components/SelectBox.tsx +0 -188
  488. package/src/core/components/tabs/Tabs.tsx +0 -132
  489. package/src/core/components/tabs/TabsContext.ts +0 -25
  490. package/src/core/components/tabs/index.ts +0 -2
  491. package/src/features/agent/CHART_INSTRUCTIONS.md +0 -228
  492. package/src/features/agent/createChartTool.ts +0 -643
  493. package/src/features/agent/examples.ts +0 -321
  494. package/src/features/agent/visualization.ts +0 -227
  495. package/src/features/store/objects/components/useDownloadObject.ts +0 -29
  496. /package/lib/esm/core/components/{MessageBox.js → shadcn/MessageBox.js} +0 -0
  497. /package/lib/types/core/components/{MessageBox.d.ts → shadcn/MessageBox.d.ts} +0 -0
  498. /package/lib/types/core/components/{ConfirmModal.d.ts → shadcn/modal/ConfirmModal.d.ts} +0 -0
  499. /package/lib/types/core/components/{DeleteModal.d.ts → shadcn/modal/DeleteModal.d.ts} +0 -0
  500. /package/src/core/components/{MessageBox.tsx → shadcn/MessageBox.tsx} +0 -0
@@ -2,20 +2,25 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
3
3
  import { Bot, Cpu, FileTextIcon, SendIcon, UploadIcon, XIcon } from "lucide-react";
4
4
  import { useUserSession } from "@vertesia/ui/session";
5
- import { AgentMessageType, FileProcessingStatus, } from "@vertesia/common";
5
+ import { AgentMessageType, } from "@vertesia/common";
6
6
  import { FusionFragmentProvider } from "@vertesia/fusion-ux";
7
- import { Button, MessageBox, Spinner, useToast, VModal, VModalBody, VModalFooter, VModalTitle } from "@vertesia/ui/core";
7
+ import { Button, cn, MessageBox, Spinner, useToast, Modal, ModalBody, ModalFooter, ModalTitle } from "@vertesia/ui/core";
8
8
  import { AnimatedThinkingDots, PulsatingCircle } from "./AnimatedThinkingDots";
9
9
  import { ImageLightboxProvider } from "./ImageLightbox";
10
10
  import AllMessagesMixed from "./ModernAgentOutput/AllMessagesMixed";
11
11
  import Header from "./ModernAgentOutput/Header";
12
12
  import MessageInput from "./ModernAgentOutput/MessageInput";
13
- import { getWorkstreamId, insertMessageInTimeline, isInProgress } from "./ModernAgentOutput/utils";
13
+ import { getWorkstreamId } from "./ModernAgentOutput/utils";
14
14
  import { ThinkingMessages } from "./WaitingMessages";
15
15
  import InlineSlidingPlanPanel from "./ModernAgentOutput/InlineSlidingPlanPanel";
16
16
  import { SkillWidgetProvider } from "./SkillWidgetProvider";
17
17
  import { ArtifactUrlCacheProvider } from "./useArtifactUrlCache.js";
18
18
  import { VegaLiteChart } from "./VegaLiteChart";
19
+ import { DocumentPanel } from "./DocumentPanel.js";
20
+ import { useAgentStream } from "./hooks/useAgentStream.js";
21
+ import { useAgentPlans } from "./hooks/useAgentPlans.js";
22
+ import { useDocumentPanel } from "./hooks/useDocumentPanel.js";
23
+ import { useFileProcessing } from "./hooks/useFileProcessing.js";
19
24
  function printElementToPdf(sourceElement, title) {
20
25
  if (typeof window === "undefined" || typeof document === "undefined") {
21
26
  return false;
@@ -166,12 +171,12 @@ acceptedFileTypes = ".pdf,.doc,.docx,.txt,.csv,.xlsx,.xls,.png,.jpg,.jpeg,.gif,.
166
171
  status: "info",
167
172
  duration: 3000,
168
173
  });
169
- // Get attached document IDs if callback provided
174
+ // Get attached documents if callback provided
170
175
  const attachedDocs = getAttachedDocs?.() || [];
171
- // Build message content with attachment references if present
176
+ // Build message content with attachment references as markdown links
172
177
  let messageContent = message;
173
178
  if (attachedDocs.length > 0 && !/store:\S+/.test(message)) {
174
- const lines = attachedDocs.map((id) => `store:${id}`);
179
+ const lines = attachedDocs.map((doc) => `[${doc.name}](/store/objects/${doc.id})`);
175
180
  messageContent = [message, '', 'Attachments:', ...lines].join('\n');
176
181
  }
177
182
  // If files are staged, add a note to the message so the agent knows files are coming
@@ -284,6 +289,8 @@ uploadedFiles, onRemoveFile, acceptedFileTypes, maxFiles,
284
289
  renderDocumentSearch, selectedDocuments, onRemoveDocument,
285
290
  // Object linking
286
291
  hideObjectLinking,
292
+ // Section visibility
293
+ hideHeader, hideMessageInput, hidePlanPanel, hideWorkstreamTabs, hideFileUpload, hideDocumentPanel,
287
294
  // Attachment callback
288
295
  getAttachedDocs, onAttachmentsSent,
289
296
  // Upload state
@@ -291,55 +298,71 @@ isUploading = false,
291
298
  // Context callback
292
299
  getMessageContext,
293
300
  // Styling props
294
- inputContainerClassName, inputClassName,
301
+ className, inputContainerClassName, inputClassName,
295
302
  // Fusion fragment data
296
- fusionData, }) {
303
+ fusionData,
304
+ // External file upload API
305
+ fileUploadRef, onProcessingFilesChange,
306
+ // External plan panel API
307
+ onPlansChange, onWorkstreamStatusChange,
308
+ // External view mode control
309
+ viewMode: controlledViewMode, onViewModeChange: onViewModeChangeProp, onShowInputChange,
310
+ // External stop API
311
+ stopRef, onStoppingChange,
312
+ // MessageItem className/style overrides
313
+ messageItemClassNames, messageStyleOverrides,
314
+ // ToolCallGroup className overrides + view mode visibility
315
+ toolCallGroupClassNames, hideToolCallsInViewMode,
316
+ // StreamingMessage className overrides
317
+ streamingMessageClassNames,
318
+ // BatchProgressPanel className overrides
319
+ batchProgressPanelClassNames,
320
+ // AllMessagesMixed className overrides
321
+ workingIndicatorClassName, messageListClassName, StoreLinkComponent, CollectionLinkComponent, prependFriendlyMessage, }) {
297
322
  const { client } = useUserSession();
323
+ const toast = useToast();
324
+ // ────────────────────────────────────────────
325
+ // Extracted hooks
326
+ // ────────────────────────────────────────────
327
+ const { messages, streamingMessages, isCompleted, debugChunkFlash, addOptimisticMessage, removeOptimisticMessages, workflowStatus, serverFileUpdates, } = useAgentStream(client, run);
328
+ const { plans, activePlanIndex, setActivePlanIndex, workstreamStatusMap, showInput, showSlidingPanel, setShowSlidingPanel, } = useAgentPlans(messages, interactive, isModal);
329
+ const { openDocuments, activeDocumentId, isDocPanelOpen, docRefreshKey, closeDocPanel: handleCloseDocPanel, closeDocument: handleCloseDocument, selectDocument, openDocInPanel, } = useDocumentPanel(messages);
330
+ const { processingFiles, hasProcessingFiles, handleFileUpload, } = useFileProcessing(client, run, serverFileUpdates, toast);
331
+ // ────────────────────────────────────────────
332
+ // Local state (UI-only concerns)
333
+ // ────────────────────────────────────────────
298
334
  const bottomRef = useRef(null);
299
335
  const conversationRef = useRef(null);
300
- const [messages, setMessages] = useState([]);
301
- const [isCompleted, setIsCompleted] = useState(false);
302
336
  const [isSending, setIsSending] = useState(false);
303
- const [viewMode, setViewMode] = useState("sliding");
304
- const [showSlidingPanel, setShowSlidingPanel] = useState(!isModal);
337
+ const [internalViewMode, setInternalViewMode] = useState("sliding");
338
+ const viewMode = controlledViewMode ?? internalViewMode;
339
+ const handleViewModeChange = useCallback((mode) => {
340
+ if (onViewModeChangeProp) {
341
+ onViewModeChangeProp(mode);
342
+ }
343
+ else {
344
+ setInternalViewMode(mode);
345
+ }
346
+ }, [onViewModeChangeProp]);
305
347
  const [isStopping, setIsStopping] = useState(false);
306
- // Keep track of multiple plans and their timestamps
307
- const [plans, setPlans] = useState([]);
308
- // Track which plan is currently active in the UI
309
- const [activePlanIndex, setActivePlanIndex] = useState(0);
310
- // Store workstream status for each plan separately
311
- const [workstreamStatusMap, setWorkstreamStatusMap] = useState(new Map());
312
348
  const [thinkingMessageIndex, setThinkingMessageIndex] = useState(0);
313
- const toast = useToast();
314
- const [showInput, setShowInput] = useState(interactive);
315
- const [workflowStatus, setWorkflowStatus] = useState(null);
316
- // Track streaming messages by streaming_id for real-time chunk aggregation
317
- // Include startTimestamp to preserve chronological order when converting to regular messages
318
- const [streamingMessages, setStreamingMessages] = useState(new Map());
319
- // Track files being processed by the workflow
320
- const [processingFiles, setProcessingFiles] = useState(new Map());
321
- // Check if any files are still uploading or processing
322
- const hasProcessingFiles = useMemo(() => Array.from(processingFiles.values()).some(f => f.status === FileProcessingStatus.UPLOADING || f.status === FileProcessingStatus.PROCESSING), [processingFiles]);
323
- // Performance optimization: Batch streaming updates using RAF
324
- // Instead of updating state on every chunk (100+ times/sec), batch them per animation frame
325
- const pendingStreamingChunks = useRef(new Map());
326
- const streamingFlushScheduled = useRef(null);
327
- // Debug: Track chunk arrivals and renders
328
- const [_debugChunkCount, setDebugChunkCount] = useState(0);
329
- const [_debugRenderCount, setDebugRenderCount] = useState(0);
330
- const [debugChunkFlash, setDebugChunkFlash] = useState(false);
331
- const debugFlashTimeout = useRef(null);
332
- const flushStreamingChunks = useCallback(() => {
333
- if (pendingStreamingChunks.current.size > 0) {
334
- setStreamingMessages(new Map(pendingStreamingChunks.current));
335
- setDebugRenderCount(c => c + 1);
336
- }
337
- streamingFlushScheduled.current = null;
338
- }, []);
339
- // Drag and drop state for full-panel file upload
340
349
  const [isDragOver, setIsDragOver] = useState(false);
341
350
  const dragCounterRef = useRef(0);
342
- // Helper function to get the current active plan and its workstream status
351
+ // PERFORMANCE: Refs for values used inside useCallback to avoid re-creating the callback
352
+ const isSendingRef = useRef(isSending);
353
+ isSendingRef.current = isSending;
354
+ const hasProcessingFilesRef = useRef(hasProcessingFiles);
355
+ hasProcessingFilesRef.current = hasProcessingFiles;
356
+ // Derive effective workflow status (API status + TERMINATED from messages)
357
+ const effectiveWorkflowStatus = useMemo(() => {
358
+ const lastMsg = messages[messages.length - 1];
359
+ if (lastMsg?.type === AgentMessageType.TERMINATED)
360
+ return "TERMINATED";
361
+ return workflowStatus;
362
+ }, [messages, workflowStatus]);
363
+ // ────────────────────────────────────────────
364
+ // Computed values
365
+ // ────────────────────────────────────────────
343
366
  const getActivePlan = useMemo(() => {
344
367
  const currentPlanData = plans[activePlanIndex] || {
345
368
  plan: { plan: [] },
@@ -351,7 +374,9 @@ fusionData, }) {
351
374
  workstreamStatus: currentWorkstreamStatus,
352
375
  };
353
376
  }, [plans, activePlanIndex, workstreamStatusMap]);
354
- // PERFORMANCE: Stabilize callback props to prevent child re-renders
377
+ // ────────────────────────────────────────────
378
+ // Stable callbacks
379
+ // ────────────────────────────────────────────
355
380
  const handleTogglePlanPanel = useCallback(() => {
356
381
  setShowSlidingPanel((prev) => {
357
382
  if (!prev) {
@@ -359,13 +384,19 @@ fusionData, }) {
359
384
  }
360
385
  return !prev;
361
386
  });
362
- }, []);
387
+ }, [setShowSlidingPanel]);
363
388
  const handleChangePlan = useCallback((index) => {
364
389
  setActivePlanIndex(index);
365
- }, []);
390
+ }, [setActivePlanIndex]);
366
391
  const handleClosePlanPanel = useCallback(() => {
367
392
  setShowSlidingPanel(false);
368
- }, []);
393
+ }, [setShowSlidingPanel]);
394
+ // Default StoreLinkComponent that opens documents in the panel
395
+ const internalStoreLinkComponent = useCallback(({ documentId, children }) => (_jsx("button", { className: "text-info underline cursor-pointer hover:text-info/80", onClick: () => openDocInPanel(documentId), children: children })), [openDocInPanel]);
396
+ const effectiveStoreLinkComponent = StoreLinkComponent ?? internalStoreLinkComponent;
397
+ // ────────────────────────────────────────────
398
+ // Effects
399
+ // ────────────────────────────────────────────
369
400
  // Show rotating thinking messages
370
401
  useEffect(() => {
371
402
  if (!isCompleted) {
@@ -375,259 +406,51 @@ fusionData, }) {
375
406
  return () => clearInterval(interval);
376
407
  }
377
408
  }, [isCompleted]);
378
- const checkWorkflowStatus = async () => {
379
- try {
380
- const statusResult = await client.store.workflows.getRunDetails(run.runId, run.workflowId);
381
- setWorkflowStatus(statusResult.status);
382
- }
383
- catch (error) {
384
- console.error('Failed to check workflow status:', error);
385
- }
386
- };
387
- // Stream messages from the agent
409
+ // Expose handleFileUpload to external callers via ref
388
410
  useEffect(() => {
389
- // Reset all state when runId changes (new agent)
390
- setMessages([]);
391
- setPlans([]);
392
- setActivePlanIndex(0);
393
- setWorkstreamStatusMap(new Map());
394
- setShowSlidingPanel(false);
395
- setWorkflowStatus(null);
396
- setStreamingMessages(new Map());
397
- checkWorkflowStatus();
398
- client.store.workflows.streamMessages(run.workflowId, run.runId, (message) => {
399
- // Client now converts compact wire format to AgentMessage internally
400
- // Handle streaming chunks separately for real-time aggregation
401
- // PERFORMANCE: Batch updates using RAF instead of immediate state updates
402
- if (message.type === AgentMessageType.STREAMING_CHUNK) {
403
- const details = message.details;
404
- // Use activity_id as key if available (for dedup), fall back to streaming_id
405
- const streamKey = details?.activity_id || details?.streaming_id;
406
- if (!streamKey)
407
- return;
408
- // Debug: Track chunk arrival with flash
409
- setDebugChunkCount(c => c + 1);
410
- setDebugChunkFlash(true);
411
- if (debugFlashTimeout.current)
412
- clearTimeout(debugFlashTimeout.current);
413
- debugFlashTimeout.current = setTimeout(() => setDebugChunkFlash(false), 50);
414
- // Accumulate chunks in the ref (no state update yet)
415
- const current = pendingStreamingChunks.current.get(streamKey) || {
416
- text: '',
417
- workstreamId: message.workstream_id,
418
- startTimestamp: Date.now(),
419
- activityId: details?.activity_id,
420
- };
421
- const newText = current.text + (message.message || '');
422
- pendingStreamingChunks.current.set(streamKey, {
423
- text: newText,
424
- workstreamId: message.workstream_id,
425
- isComplete: details.is_final,
426
- startTimestamp: current.startTimestamp,
427
- activityId: details?.activity_id,
428
- });
429
- // Schedule a flush if not already scheduled (batches ~60 updates/sec max)
430
- if (streamingFlushScheduled.current === null) {
431
- streamingFlushScheduled.current = requestAnimationFrame(flushStreamingChunks);
432
- }
433
- return;
434
- }
435
- // Handle file processing status updates (SYSTEM messages with system_type: 'file_processing')
436
- if (message.type === AgentMessageType.SYSTEM) {
437
- const details = message.details;
438
- if (details?.system_type === 'file_processing' && details.files) {
439
- setProcessingFiles(prev => {
440
- const newMap = new Map(prev);
441
- for (const file of details.files) {
442
- newMap.set(file.id, file);
443
- }
444
- return newMap;
445
- });
446
- return; // Don't add to messages array - this is status only
447
- }
448
- // Other SYSTEM messages fall through to normal handling
449
- }
450
- // When THOUGHT or ANSWER arrives with activity_id, remove matching streaming message
451
- // This prevents duplicate content (streamed content replaced by final message)
452
- if ((message.type === AgentMessageType.THOUGHT || message.type === AgentMessageType.ANSWER) && message.details?.activity_id) {
453
- const activityId = message.details.activity_id;
454
- // Remove from pending chunks
455
- pendingStreamingChunks.current.delete(activityId);
456
- // Remove from streaming messages state
457
- setStreamingMessages(prev => {
458
- if (prev.has(activityId)) {
459
- const next = new Map(prev);
460
- next.delete(activityId);
461
- return next;
462
- }
463
- return prev;
464
- });
465
- }
466
- // On COMPLETE or IDLE, just flush any pending chunks
467
- if (message.type === AgentMessageType.COMPLETE || message.type === AgentMessageType.IDLE) {
468
- if (pendingStreamingChunks.current.size > 0) {
469
- flushStreamingChunks();
470
- }
471
- }
472
- if (message.message) {
473
- setMessages((prev_messages) => {
474
- // Check for duplicate by timestamp
475
- if (prev_messages.find((m) => m.timestamp === message.timestamp)) {
476
- return prev_messages;
477
- }
478
- // For QUESTION messages from server, replace any optimistic version
479
- if (message.type === AgentMessageType.QUESTION && !message.details?._optimistic) {
480
- const withoutOptimistic = prev_messages.filter((m) => !(m.type === AgentMessageType.QUESTION &&
481
- m.details?._optimistic &&
482
- m.message === message.message));
483
- insertMessageInTimeline(withoutOptimistic, message);
484
- return [...withoutOptimistic];
485
- }
486
- insertMessageInTimeline(prev_messages, message);
487
- return [...prev_messages];
488
- });
489
- }
490
- });
491
- // Clear messages and unsubscribe when component unmounts or runId changes
492
- return () => {
493
- setMessages([]);
494
- // Cancel any pending streaming flush
495
- if (streamingFlushScheduled.current !== null) {
496
- cancelAnimationFrame(streamingFlushScheduled.current);
497
- streamingFlushScheduled.current = null;
498
- }
499
- pendingStreamingChunks.current.clear();
500
- // Client handles unsubscribing from the message stream internally
501
- };
502
- }, [run.runId, client.store.workflows, flushStreamingChunks]);
503
- // Update completion status when messages change
504
- // This now accounts for multiple workstreams
411
+ if (fileUploadRef)
412
+ fileUploadRef.current = handleFileUpload;
413
+ return () => { if (fileUploadRef)
414
+ fileUploadRef.current = null; };
415
+ }, [fileUploadRef, handleFileUpload]);
416
+ // Notify parent when processingFiles changes
505
417
  useEffect(() => {
506
- setIsCompleted(!isInProgress(messages));
507
- // Only automatically hide the panel when there are no plans
508
- // But don't auto-show it when plans appear
509
- if (plans.length === 0) {
510
- // If there are no plans, make sure the plan panel is hidden
511
- setShowSlidingPanel(false);
512
- }
513
- // We removed the auto-show functionality to allow users to keep the panel closed if they want
514
- }, [messages, plans.length]);
515
- // Update plans and workstream status based on incoming messages
418
+ onProcessingFilesChange?.(processingFiles);
419
+ }, [processingFiles, onProcessingFilesChange]);
420
+ // Notify parent when plans change
516
421
  useEffect(() => {
517
- // Only show the sliding panel for the very first plan and only once
518
- if (plans.length === 1 &&
519
- !showSlidingPanel &&
520
- !sessionStorage.getItem("plan-panel-shown")) {
521
- // For first-time plan detection only, show the panel with a delay
522
- const notificationTimeout = setTimeout(() => {
523
- setShowSlidingPanel(true);
524
- // Mark that we've shown the panel once
525
- sessionStorage.setItem("plan-panel-shown", "true");
526
- }, 500); // Short delay to ensure the UI has fully rendered
527
- return () => clearTimeout(notificationTimeout);
422
+ onPlansChange?.(plans, activePlanIndex);
423
+ }, [plans, activePlanIndex, onPlansChange]);
424
+ // Notify parent when workstream status changes
425
+ useEffect(() => {
426
+ onWorkstreamStatusChange?.(workstreamStatusMap);
427
+ }, [workstreamStatusMap, onWorkstreamStatusChange]);
428
+ // Notify parent when input availability is determined
429
+ useEffect(() => {
430
+ if (messages.length === 0)
431
+ return;
432
+ if (!showInput) {
433
+ onShowInputChange?.(false);
434
+ return;
528
435
  }
529
- // Process messages to extract plan information
530
- messages.forEach((message) => {
531
- if (message.type === AgentMessageType.PLAN) {
532
- try {
533
- // Log message details for debugging
534
- console.log("PLAN message received:", message.type);
535
- let newPlanDetails = null;
536
- // Extract the plan from the message details object
537
- if (message.details && typeof message.details === "object") {
538
- // For a PLAN type message like the example you provided
539
- if (message.details.plan && Array.isArray(message.details.plan)) {
540
- console.log("Valid plan array found in message.details.plan");
541
- newPlanDetails = { plan: message.details.plan };
542
- }
543
- }
544
- // Only proceed if we have a valid plan
545
- if (newPlanDetails) {
546
- const timestamp = typeof message.timestamp === "number"
547
- ? message.timestamp
548
- : new Date(message.timestamp).getTime();
549
- // Check if we already have this plan
550
- const existingPlanIndex = plans.findIndex((p) => p.timestamp === timestamp);
551
- if (existingPlanIndex === -1 && newPlanDetails) {
552
- console.log("Adding new plan to plans array");
553
- // This is a new plan - add it to our plans array
554
- const newPlan = {
555
- plan: newPlanDetails,
556
- timestamp,
557
- };
558
- // Add new plan to the beginning of the array (newest first)
559
- console.log("Adding plan to plans array:", newPlan);
560
- setPlans((prev) => {
561
- const newPlans = [newPlan, ...prev];
562
- console.log("New plans array:", newPlans);
563
- return newPlans;
564
- });
565
- // Set this as the active plan
566
- setActivePlanIndex(0);
567
- // Automatically show sliding plan panel when a plan is detected
568
- console.log("Setting showSlidingPanel to true");
569
- setShowSlidingPanel(true);
570
- // Initialize workstreams as pending based on the plan tasks
571
- const newWorkstreamStatus = new Map();
572
- // Always initialize main workstream
573
- newWorkstreamStatus.set("main", "in_progress");
574
- // Initialize each task in the plan with its status
575
- if (Array.isArray(newPlanDetails.plan)) {
576
- newPlanDetails.plan.forEach((task) => {
577
- if (task && typeof task === "object" && task.id) {
578
- const taskId = task.id.toString();
579
- // Use the task's status if available, otherwise default to pending
580
- newWorkstreamStatus.set(taskId, task.status || "pending");
581
- }
582
- });
583
- }
584
- // Update the workstream status map with the new status for this plan
585
- setWorkstreamStatusMap((prev) => {
586
- const newMap = new Map(prev);
587
- newMap.set(timestamp, newWorkstreamStatus);
588
- return newMap;
589
- });
590
- }
591
- }
592
- }
593
- catch (error) {
594
- console.error("Failed to parse plan from message:", error);
595
- }
596
- }
597
- // Handle UPDATE type messages with plan updates
598
- if (message.type === AgentMessageType.UPDATE && message.details) {
599
- // We no longer process UPDATE messages with details.updates
600
- // Instead, we rely on the PLAN message that follows with the complete plan
601
- if (message.details.updates && Array.isArray(message.details.updates)) {
602
- console.log("Ignoring UPDATE message with details.updates - waiting for PLAN message with full plan");
603
- // This is an initial update notification, but we'll wait for the PLAN message that follows
604
- // with the complete updated plan before making any UI changes
605
- }
606
- }
607
- });
608
- const lastMessage = messages[messages.length - 1];
609
- if (lastMessage) {
610
- if (lastMessage.type === AgentMessageType.TERMINATED) {
611
- setShowInput(false);
612
- setWorkflowStatus("TERMINATED");
613
- }
614
- else {
615
- if (interactive) {
616
- setShowInput(true);
617
- }
618
- else {
619
- setShowInput(lastMessage.type === AgentMessageType.REQUEST_INPUT);
620
- }
621
- }
436
+ if (effectiveWorkflowStatus && effectiveWorkflowStatus !== "RUNNING") {
437
+ onShowInputChange?.(false);
438
+ return;
439
+ }
440
+ if (effectiveWorkflowStatus !== null) {
441
+ onShowInputChange?.(true);
622
442
  }
623
- }, [messages, plans, activePlanIndex]);
443
+ }, [showInput, effectiveWorkflowStatus, messages.length, onShowInputChange]);
444
+ // ────────────────────────────────────────────
445
+ // Handlers
446
+ // ────────────────────────────────────────────
624
447
  // Send a message to the agent
625
- const handleSendMessage = (message) => {
448
+ const handleSendMessage = useCallback((message) => {
626
449
  const trimmed = message.trim();
627
- if (!trimmed || isSending)
450
+ if (!trimmed || isSendingRef.current)
628
451
  return;
629
452
  // Block if files are still processing
630
- if (hasProcessingFiles) {
453
+ if (hasProcessingFilesRef.current) {
631
454
  toast({
632
455
  status: "warning",
633
456
  title: "Files Still Processing",
@@ -637,56 +460,38 @@ fusionData, }) {
637
460
  return;
638
461
  }
639
462
  setIsSending(true);
640
- // Add optimistic QUESTION message immediately for better UX
641
- const optimisticTimestamp = Date.now();
642
- const optimisticMessage = {
643
- timestamp: optimisticTimestamp,
644
- workflow_run_id: run.runId,
645
- type: AgentMessageType.QUESTION,
646
- message: trimmed,
647
- workstream_id: "main",
648
- details: { _optimistic: true },
649
- };
650
- console.log("[Optimistic] Adding user message:", trimmed);
651
- setMessages((prev) => {
652
- const newMessages = [...prev, optimisticMessage];
653
- // Sort by timestamp to maintain order
654
- newMessages.sort((a, b) => {
655
- const timeA = typeof a.timestamp === "number" ? a.timestamp : new Date(a.timestamp).getTime();
656
- const timeB = typeof b.timestamp === "number" ? b.timestamp : new Date(b.timestamp).getTime();
657
- return timeA - timeB;
658
- });
659
- console.log("[Optimistic] Messages after add:", newMessages.length, "messages");
660
- return newMessages;
661
- });
662
- // Get attached document IDs if callback provided
663
463
  const attachedDocs = getAttachedDocs?.() || [];
664
- // Get additional context metadata if callback provided (e.g., fundId)
665
464
  const contextMetadata = getMessageContext?.() || {};
666
- // Build message content with attachment references if present
667
465
  let messageContent = trimmed;
668
466
  if (attachedDocs.length > 0 && !/store:\S+/.test(trimmed)) {
669
- const lines = attachedDocs.map((id) => `store:${id}`);
467
+ const lines = attachedDocs.map((doc) => `[${doc.name}](/store/objects/${doc.id})`);
670
468
  messageContent = [trimmed, '', 'Attachments:', ...lines].join('\n');
671
469
  }
672
- // Build metadata combining attached docs and context
470
+ const messageId = `msg-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
471
+ const optimisticMessage = {
472
+ timestamp: Date.now(),
473
+ workflow_run_id: run.runId,
474
+ type: AgentMessageType.QUESTION,
475
+ message: messageContent,
476
+ workstream_id: "main",
477
+ details: { _optimistic: true, _messageId: messageId },
478
+ };
479
+ addOptimisticMessage(optimisticMessage);
673
480
  const metadata = {
674
- ...(attachedDocs.length > 0 ? { attached_docs: attachedDocs } : {}),
481
+ ...(attachedDocs.length > 0 ? { attached_docs: attachedDocs.map((d) => d.id) } : {}),
675
482
  ...contextMetadata,
483
+ _messageId: messageId,
676
484
  };
677
485
  client.store.workflows
678
486
  .sendSignal(run.workflowId, run.runId, "UserInput", {
679
487
  message: messageContent,
680
- metadata: Object.keys(metadata).length > 0 ? metadata : undefined,
488
+ metadata,
681
489
  })
682
490
  .then(() => {
683
- setIsCompleted(false);
684
- // Clear attachments after successful send
685
491
  onAttachmentsSent?.();
686
492
  })
687
493
  .catch((err) => {
688
- // Remove optimistic message on failure
689
- setMessages((prev) => prev.filter((m) => m.timestamp !== optimisticTimestamp));
494
+ removeOptimisticMessages((m) => m.details?._messageId === messageId);
690
495
  toast({
691
496
  status: "error",
692
497
  title: "Failed to Send Message",
@@ -697,72 +502,12 @@ fusionData, }) {
697
502
  .finally(() => {
698
503
  setIsSending(false);
699
504
  });
700
- };
701
- // Handle file uploads - upload to artifact storage and signal workflow
702
- const handleFileUpload = useCallback(async (files) => {
703
- for (const file of files) {
704
- const fileId = `file-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
705
- const artifactPath = `files/${file.name}`;
706
- // Add to local state immediately (optimistic - uploading status)
707
- const fileState = {
708
- id: fileId,
709
- name: file.name,
710
- content_type: file.type || 'application/octet-stream',
711
- size: file.size,
712
- status: FileProcessingStatus.UPLOADING,
713
- started_at: Date.now(),
714
- };
715
- setProcessingFiles(prev => new Map(prev).set(fileId, fileState));
716
- try {
717
- // Upload to artifact storage
718
- await client.files.uploadArtifact(run.runId, artifactPath, file);
719
- // Update local state to processing
720
- setProcessingFiles(prev => {
721
- const newMap = new Map(prev);
722
- const f = newMap.get(fileId);
723
- if (f) {
724
- f.status = FileProcessingStatus.PROCESSING;
725
- f.artifact_path = artifactPath;
726
- f.reference = `artifact:${artifactPath}`;
727
- }
728
- return newMap;
729
- });
730
- // Signal workflow that file was uploaded
731
- await client.store.workflows.sendSignal(run.workflowId, run.runId, "FileUploaded", {
732
- id: fileId,
733
- name: file.name,
734
- content_type: file.type || 'application/octet-stream',
735
- reference: `artifact:${artifactPath}`,
736
- artifact_path: artifactPath,
737
- });
738
- }
739
- catch (error) {
740
- // Update local state to error
741
- setProcessingFiles(prev => {
742
- const newMap = new Map(prev);
743
- const f = newMap.get(fileId);
744
- if (f) {
745
- f.status = FileProcessingStatus.ERROR;
746
- f.error = error instanceof Error ? error.message : 'Upload failed';
747
- f.completed_at = Date.now();
748
- }
749
- return newMap;
750
- });
751
- toast({
752
- status: "error",
753
- title: "Upload Failed",
754
- description: error instanceof Error ? error.message : "Failed to upload file",
755
- duration: 3000,
756
- });
757
- }
758
- }
759
- }, [client, run, toast]);
505
+ }, [run.runId, run.workflowId, client, toast, getAttachedDocs, getMessageContext, onAttachmentsSent, addOptimisticMessage, removeOptimisticMessages]);
760
506
  // Drag and drop handlers for full-panel file upload
761
507
  const handleDragEnter = useCallback((e) => {
762
508
  e.preventDefault();
763
509
  e.stopPropagation();
764
510
  dragCounterRef.current++;
765
- // Enable drag if we have a run (for internal file processing)
766
511
  if (run && e.dataTransfer?.types?.includes('Files')) {
767
512
  setIsDragOver(true);
768
513
  }
@@ -784,14 +529,13 @@ fusionData, }) {
784
529
  e.stopPropagation();
785
530
  dragCounterRef.current = 0;
786
531
  setIsDragOver(false);
787
- // Use internal handleFileUpload for proper workflow signaling and status tracking
788
532
  if (run && e.dataTransfer?.files && e.dataTransfer.files.length > 0) {
789
533
  const filesArray = Array.from(e.dataTransfer.files);
790
534
  handleFileUpload(filesArray);
791
535
  }
792
536
  }, [run, handleFileUpload]);
793
537
  // Stop/interrupt the active workflow
794
- const handleStopWorkflow = async () => {
538
+ const handleStopWorkflow = useCallback(async () => {
795
539
  if (isStopping)
796
540
  return;
797
541
  setIsStopping(true);
@@ -805,7 +549,6 @@ fusionData, }) {
805
549
  description: "Type your message to give new instructions",
806
550
  duration: 3000,
807
551
  });
808
- setIsCompleted(true);
809
552
  }
810
553
  catch (err) {
811
554
  toast({
@@ -818,7 +561,18 @@ fusionData, }) {
818
561
  finally {
819
562
  setIsStopping(false);
820
563
  }
821
- };
564
+ }, [isStopping, client, run.workflowId, run.runId, toast]);
565
+ // Expose stop handler to external callers via ref
566
+ useEffect(() => {
567
+ if (stopRef)
568
+ stopRef.current = !isCompleted ? handleStopWorkflow : null;
569
+ return () => { if (stopRef)
570
+ stopRef.current = null; };
571
+ }, [stopRef, isCompleted, handleStopWorkflow]);
572
+ // Notify parent when stopping state changes
573
+ useEffect(() => {
574
+ onStoppingChange?.(isStopping);
575
+ }, [isStopping, onStoppingChange]);
822
576
  // Calculate number of active tasks for the status indicator
823
577
  const getActiveTaskCount = () => {
824
578
  if (!messages.length)
@@ -915,17 +669,18 @@ fusionData, }) {
915
669
  });
916
670
  setIsPdfModalOpen(false);
917
671
  };
672
+ // PERFORMANCE: Memoize taskLabels to prevent AllMessagesMixed re-renders
673
+ const taskLabels = useMemo(() => getActivePlan.plan.plan?.reduce((acc, task) => {
674
+ if (task.id && task.goal)
675
+ acc.set(task.id.toString(), task.goal);
676
+ return acc;
677
+ }, new Map()), [getActivePlan.plan]);
918
678
  // Main content - wrapped with FusionFragmentProvider when fusionData is provided
919
- const mainContent = (_jsx(ArtifactUrlCacheProvider, { children: _jsx(ImageLightboxProvider, { children: _jsxs("div", { className: `flex flex-col lg:flex-row gap-2 h-full relative overflow-hidden ${isDragOver ? 'ring-2 ring-blue-400 ring-inset' : ''}`, onDragEnter: handleDragEnter, onDragOver: handleDragOver, onDragLeave: handleDragLeave, onDrop: handleDrop, children: [isDragOver && (_jsx("div", { className: "absolute inset-0 flex items-center justify-center bg-blue-100/80 dark:bg-blue-900/40 z-50 pointer-events-none rounded-lg", children: _jsxs("div", { className: "text-blue-600 dark:text-blue-400 font-medium flex items-center gap-2 text-lg", children: [_jsx(UploadIcon, { className: "size-6" }), "Drop files to upload"] }) })), _jsxs("div", { ref: conversationRef, className: `flex flex-col min-h-0 border-0 ${showSlidingPanel
920
- ? 'w-full lg:w-2/3 flex-1 min-h-[50vh]'
679
+ const mainContent = (_jsx(ArtifactUrlCacheProvider, { children: _jsx(ImageLightboxProvider, { children: _jsxs("div", { className: cn("flex flex-col lg:flex-row gap-2 h-full relative overflow-hidden", isDragOver && "ring-2 ring-blue-400 ring-inset", className), onDragEnter: handleDragEnter, onDragOver: handleDragOver, onDragLeave: handleDragLeave, onDrop: handleDrop, children: [isDragOver && (_jsx("div", { className: "absolute inset-0 flex items-center justify-center bg-blue-100/80 dark:bg-blue-900/40 z-50 pointer-events-none rounded-lg", children: _jsxs("div", { className: "text-blue-600 dark:text-blue-400 font-medium flex items-center gap-2 text-lg", children: [_jsx(UploadIcon, { className: "size-6" }), "Drop files to upload"] }) })), _jsxs("div", { ref: conversationRef, className: cn("flex flex-col min-h-0 border-0", (showSlidingPanel || isDocPanelOpen)
680
+ ? "w-full lg:w-3/5 flex-1 min-h-[50vh]"
921
681
  : fullWidth
922
- ? 'flex-1 w-full'
923
- : `flex-1 mx-auto ${!isModal ? 'max-w-4xl' : ''}`}`, children: [_jsx("div", { className: "flex-shrink-0", children: _jsx(Header, { title: actualTitle, isCompleted: isCompleted, onClose: onClose, isModal: isModal, run: run, viewMode: viewMode, onViewModeChange: setViewMode, showPlanPanel: showSlidingPanel, hasPlan: plans.length > 0, onTogglePlanPanel: handleTogglePlanPanel, onDownload: downloadConversation, onCopyRunId: copyRunId, resetWorkflow: resetWorkflow, onExportPdf: exportConversationPdf, isReceivingChunks: debugChunkFlash }) }), messages.length === 0 && !isCompleted ? (_jsx("div", { className: "flex-1 flex flex-col items-center justify-center h-full text-center py-6", children: _jsxs("div", { className: "p-5 max-w-md border border-info rounded-lg shadow-sm", children: [_jsxs("div", { className: "flex items-center space-x-3 mb-3", children: [_jsx(PulsatingCircle, { size: "sm", color: "blue" }), _jsx("div", { className: "text-sm text-muted font-medium", children: ThinkingMessages[thinkingMessageIndex] })] }), _jsx("div", { className: "mt-4 flex justify-center", children: _jsx(AnimatedThinkingDots, { color: "blue", className: "mt-1" }) })] }) })) : (_jsx(AllMessagesMixed, { messages: messages, bottomRef: bottomRef, viewMode: viewMode, isCompleted: isCompleted, plan: getActivePlan.plan, workstreamStatus: getActivePlan.workstreamStatus, showPlanPanel: showSlidingPanel, onTogglePlanPanel: handleTogglePlanPanel, plans: plans, activePlanIndex: activePlanIndex, onChangePlan: handleChangePlan, taskLabels: getActivePlan.plan.plan?.reduce((acc, task) => {
924
- if (task.id && task.goal) {
925
- acc.set(task.id.toString(), task.goal);
926
- }
927
- return acc;
928
- }, new Map()), streamingMessages: streamingMessages, onSendMessage: handleSendMessage, thinkingMessageIndex: thinkingMessageIndex })), _jsx("div", { className: "flex-shrink-0", style: { paddingBottom: 'env(safe-area-inset-bottom, 0px)' }, children: workflowStatus && workflowStatus !== "RUNNING" ? (_jsxs(MessageBox, { status: workflowStatus === "COMPLETED" ? 'success' : 'done', icon: null, className: "m-2", children: ["This Workflow is ", workflowStatus] })) : showInput && (_jsx(MessageInput, { onSend: handleSendMessage, onStop: handleStopWorkflow, disabled: isUploading, isSending: isSending || isUploading, isStopping: isStopping, isStreaming: !isCompleted, isCompleted: isCompleted, activeTaskCount: getActiveTaskCount(), placeholder: placeholder,
682
+ ? "flex-1 w-full"
683
+ : `flex-1 mx-auto ${!isModal ? "max-w-4xl" : ""}`), children: [!hideHeader && (_jsx("div", { className: "flex-shrink-0", children: _jsx(Header, { title: actualTitle, isCompleted: isCompleted, onClose: onClose, isModal: isModal, run: run, viewMode: viewMode, onViewModeChange: handleViewModeChange, showPlanPanel: showSlidingPanel, hasPlan: plans.length > 0, onTogglePlanPanel: handleTogglePlanPanel, onDownload: downloadConversation, onCopyRunId: copyRunId, resetWorkflow: resetWorkflow, onExportPdf: exportConversationPdf, isReceivingChunks: debugChunkFlash }) })), messages.length === 0 && !isCompleted ? (_jsx("div", { className: "flex-1 flex flex-col items-center justify-center h-full text-center py-6", children: _jsxs("div", { className: "p-5 max-w-md border border-info rounded-lg shadow-sm", children: [_jsxs("div", { className: "flex items-center space-x-3 mb-3", children: [_jsx(PulsatingCircle, { size: "sm", color: "blue" }), _jsx("div", { className: "text-sm text-muted font-medium", children: ThinkingMessages[thinkingMessageIndex] })] }), _jsx("div", { className: "mt-4 flex justify-center", children: _jsx(AnimatedThinkingDots, { color: "blue", className: "mt-1" }) })] }) })) : (_jsx(AllMessagesMixed, { messages: messages, bottomRef: bottomRef, isCompleted: isCompleted, plan: getActivePlan.plan, workstreamStatus: getActivePlan.workstreamStatus, showPlanPanel: showSlidingPanel, onTogglePlanPanel: handleTogglePlanPanel, plans: plans, activePlanIndex: activePlanIndex, onChangePlan: handleChangePlan, taskLabels: taskLabels, streamingMessages: streamingMessages, onSendMessage: handleSendMessage, thinkingMessageIndex: thinkingMessageIndex, messageItemClassNames: messageItemClassNames, messageStyleOverrides: messageStyleOverrides, toolCallGroupClassNames: toolCallGroupClassNames, hideToolCallsInViewMode: hideToolCallsInViewMode, streamingMessageClassNames: streamingMessageClassNames, batchProgressPanelClassNames: batchProgressPanelClassNames, viewMode: viewMode, hideWorkstreamTabs: hideWorkstreamTabs, workingIndicatorClassName: workingIndicatorClassName, messageListClassName: messageListClassName, StoreLinkComponent: effectiveStoreLinkComponent, CollectionLinkComponent: CollectionLinkComponent, prependFriendlyMessage: prependFriendlyMessage })), !hideMessageInput && (_jsx("div", { className: "flex-shrink-0", style: { paddingBottom: 'env(safe-area-inset-bottom, 0px)' }, children: effectiveWorkflowStatus && effectiveWorkflowStatus !== "RUNNING" ? (_jsxs(MessageBox, { status: effectiveWorkflowStatus === "COMPLETED" ? 'success' : 'done', icon: null, className: "m-2", children: ["This Workflow is ", effectiveWorkflowStatus] })) : showInput && (_jsx(MessageInput, { onSend: handleSendMessage, onStop: handleStopWorkflow, disabled: isUploading, isSending: isSending || isUploading, isStopping: isStopping, isStreaming: !isCompleted, isCompleted: isCompleted, activeTaskCount: getActiveTaskCount(), placeholder: placeholder,
929
684
  // File upload props - use internal handler that signals workflow
930
685
  onFilesSelected: handleFileUpload, uploadedFiles: uploadedFiles, onRemoveFile: onRemoveFile, acceptedFileTypes: acceptedFileTypes, maxFiles: maxFiles,
931
686
  // File processing state
@@ -934,8 +689,10 @@ fusionData, }) {
934
689
  renderDocumentSearch: renderDocumentSearch, selectedDocuments: selectedDocuments, onRemoveDocument: onRemoveDocument,
935
690
  // Object linking
936
691
  hideObjectLinking: hideObjectLinking,
692
+ // Files Uploaded
693
+ hideFileUpload: hideFileUpload,
937
694
  // Styling props
938
- className: inputContainerClassName, inputClassName: inputClassName })) })] }), showSlidingPanel && (_jsx("div", { className: "w-full lg:w-1/3 min-h-[50vh] lg:h-full border-t lg:border-t-0 lg:border-l", children: _jsx(InlineSlidingPlanPanel, { plan: getActivePlan.plan, workstreamStatus: getActivePlan.workstreamStatus, isOpen: showSlidingPanel, onClose: handleClosePlanPanel, plans: plans, activePlanIndex: activePlanIndex, onChangePlan: handleChangePlan }) })), _jsxs(VModal, { isOpen: isPdfModalOpen, onClose: () => setIsPdfModalOpen(false), children: [_jsx(VModalTitle, { children: "Export conversation as PDF" }), _jsxs(VModalBody, { children: [_jsx("p", { className: "mb-2", children: "This will open your browser's print dialog with the current conversation." }), _jsx("p", { className: "text-sm text-muted", children: "To save a PDF, choose \"Save as PDF\" or a similar option in the print dialog." })] }), _jsxs(VModalFooter, { align: "right", children: [_jsx(Button, { variant: "ghost", size: "sm", onClick: () => setIsPdfModalOpen(false), children: "Cancel" }), _jsx(Button, { size: "sm", onClick: handleConfirmExportPdf, children: "Open print dialog" })] })] })] }) }) }));
695
+ className: inputContainerClassName, inputClassName: inputClassName })) }))] }), !hidePlanPanel && showSlidingPanel && (_jsx("div", { className: "w-full lg:w-1/3 min-h-[50vh] lg:h-full border-t lg:border-t-0 lg:border-l", children: _jsx(InlineSlidingPlanPanel, { plan: getActivePlan.plan, workstreamStatus: getActivePlan.workstreamStatus, isOpen: showSlidingPanel, onClose: handleClosePlanPanel, plans: plans, activePlanIndex: activePlanIndex, onChangePlan: handleChangePlan }) })), !hideDocumentPanel && isDocPanelOpen && openDocuments.length > 0 && (_jsx("div", { className: cn("w-full lg:w-2/5 min-h-[50vh] lg:h-full border-t lg:border-t-0 lg:border-l", showSlidingPanel && "lg:w-1/3"), children: _jsx(DocumentPanel, { isOpen: isDocPanelOpen, onClose: handleCloseDocPanel, documents: openDocuments, activeDocumentId: activeDocumentId, onSelectDocument: selectDocument, onCloseDocument: handleCloseDocument, refreshKey: docRefreshKey, runId: run.runId }) })), _jsxs(Modal, { isOpen: isPdfModalOpen, onClose: () => setIsPdfModalOpen(false), children: [_jsx(ModalTitle, { children: "Export conversation as PDF" }), _jsxs(ModalBody, { children: [_jsx("p", { className: "mb-2", children: "This will open your browser's print dialog with the current conversation." }), _jsx("p", { className: "text-sm text-muted", children: "To save a PDF, choose \"Save as PDF\" or a similar option in the print dialog." })] }), _jsxs(ModalFooter, { align: "right", children: [_jsx(Button, { variant: "ghost", size: "sm", onClick: () => setIsPdfModalOpen(false), children: "Cancel" }), _jsx(Button, { size: "sm", onClick: handleConfirmExportPdf, children: "Open print dialog" })] })] })] }) }) }));
939
696
  // Wrap with FusionFragmentProvider when fusionData is provided
940
697
  // This enables fusion-fragment code blocks to display data and supports
941
698
  // agent-mode interactions where clicking editable fields sends messages