@vertesia/ui 1.5.0-dev.20260901.052906Z → 1.5.0-dev.20260910.051115Z

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 (563) hide show
  1. package/lib/core/components/Avatar.d.ts.map +1 -1
  2. package/lib/core/components/Avatar.js +3 -3
  3. package/lib/core/components/Avatar.js.map +1 -1
  4. package/lib/core/components/ComboBox.js +1 -1
  5. package/lib/core/components/ComboBox.js.map +1 -1
  6. package/lib/core/components/FileUpload.js +1 -1
  7. package/lib/core/components/FileUpload.js.map +1 -1
  8. package/lib/core/components/Link.js +1 -1
  9. package/lib/core/components/Link.js.map +1 -1
  10. package/lib/core/components/SelectList.js +1 -1
  11. package/lib/core/components/SelectList.js.map +1 -1
  12. package/lib/core/components/SidePanel.js +1 -1
  13. package/lib/core/components/SidePanel.js.map +1 -1
  14. package/lib/core/components/Spinner.js +1 -1
  15. package/lib/core/components/Spinner.js.map +1 -1
  16. package/lib/core/components/TagsInput.js +8 -8
  17. package/lib/core/components/TagsInput.js.map +1 -1
  18. package/lib/core/components/shadcn/MessageBox.js +1 -1
  19. package/lib/core/components/shadcn/MessageBox.js.map +1 -1
  20. package/lib/core/components/shadcn/button.js +1 -1
  21. package/lib/core/components/shadcn/button.js.map +1 -1
  22. package/lib/core/components/shadcn/card.d.ts.map +1 -1
  23. package/lib/core/components/shadcn/card.js +1 -1
  24. package/lib/core/components/shadcn/card.js.map +1 -1
  25. package/lib/core/components/shadcn/command.js +5 -5
  26. package/lib/core/components/shadcn/command.js.map +1 -1
  27. package/lib/core/components/shadcn/filters/DynamicLabel.js +1 -1
  28. package/lib/core/components/shadcn/filters/DynamicLabel.js.map +1 -1
  29. package/lib/core/components/shadcn/filters/comboBox/DateCombobox.js +3 -3
  30. package/lib/core/components/shadcn/filters/comboBox/DateCombobox.js.map +1 -1
  31. package/lib/core/components/shadcn/input.js +3 -3
  32. package/lib/core/components/shadcn/input.js.map +1 -1
  33. package/lib/core/components/shadcn/modal/ConfirmModal.js +1 -1
  34. package/lib/core/components/shadcn/modal/ConfirmModal.js.map +1 -1
  35. package/lib/core/components/shadcn/modal/dialog.d.ts.map +1 -1
  36. package/lib/core/components/shadcn/modal/dialog.js +2 -2
  37. package/lib/core/components/shadcn/modal/dialog.js.map +1 -1
  38. package/lib/core/components/shadcn/overflowTabs.js +2 -2
  39. package/lib/core/components/shadcn/overflowTabs.js.map +1 -1
  40. package/lib/core/components/shadcn/popover.js +1 -1
  41. package/lib/core/components/shadcn/popover.js.map +1 -1
  42. package/lib/core/components/shadcn/radioGroup.d.ts.map +1 -1
  43. package/lib/core/components/shadcn/radioGroup.js +3 -3
  44. package/lib/core/components/shadcn/radioGroup.js.map +1 -1
  45. package/lib/core/components/shadcn/selectBox.js +1 -1
  46. package/lib/core/components/shadcn/selectBox.js.map +1 -1
  47. package/lib/core/components/shadcn/tabs.d.ts.map +1 -1
  48. package/lib/core/components/shadcn/tabs.js +5 -2
  49. package/lib/core/components/shadcn/tabs.js.map +1 -1
  50. package/lib/core/components/styles.js +1 -1
  51. package/lib/core/components/styles.js.map +1 -1
  52. package/lib/core/components/table/index.js +1 -1
  53. package/lib/core/hooks/useFetch.d.ts.map +1 -1
  54. package/lib/core/hooks/useFetch.js +2 -0
  55. package/lib/core/hooks/useFetch.js.map +1 -1
  56. package/lib/features/activity-doc/ActivityDoc.js +8 -8
  57. package/lib/features/activity-doc/ActivityDoc.js.map +1 -1
  58. package/lib/features/agent/chat/AgentChart.js +1 -1
  59. package/lib/features/agent/chat/AgentChart.js.map +1 -1
  60. package/lib/features/agent/chat/AgentRightPanel.d.ts +2 -3
  61. package/lib/features/agent/chat/AgentRightPanel.d.ts.map +1 -1
  62. package/lib/features/agent/chat/AgentRightPanel.js +3 -3
  63. package/lib/features/agent/chat/AgentRightPanel.js.map +1 -1
  64. package/lib/features/agent/chat/AskUserWidget.d.ts.map +1 -1
  65. package/lib/features/agent/chat/AskUserWidget.js +13 -13
  66. package/lib/features/agent/chat/AskUserWidget.js.map +1 -1
  67. package/lib/features/agent/chat/DocumentPanel.d.ts +7 -7
  68. package/lib/features/agent/chat/DocumentPanel.d.ts.map +1 -1
  69. package/lib/features/agent/chat/DocumentPanel.js +6 -12
  70. package/lib/features/agent/chat/DocumentPanel.js.map +1 -1
  71. package/lib/features/agent/chat/DocumentsTab.d.ts +15 -0
  72. package/lib/features/agent/chat/DocumentsTab.d.ts.map +1 -0
  73. package/lib/features/agent/chat/DocumentsTab.js +33 -0
  74. package/lib/features/agent/chat/DocumentsTab.js.map +1 -0
  75. package/lib/features/agent/chat/JumpingDots.js +1 -1
  76. package/lib/features/agent/chat/JumpingDots.js.map +1 -1
  77. package/lib/features/agent/chat/ModernAgentConversation.js +3 -3
  78. package/lib/features/agent/chat/ModernAgentConversation.js.map +1 -1
  79. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts.map +1 -1
  80. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js +22 -9
  81. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -1
  82. package/lib/features/agent/chat/ModernAgentOutput/BatchProgressPanel.js +5 -5
  83. package/lib/features/agent/chat/ModernAgentOutput/BatchProgressPanel.js.map +1 -1
  84. package/lib/features/agent/chat/ModernAgentOutput/Header.d.ts.map +1 -1
  85. package/lib/features/agent/chat/ModernAgentOutput/Header.js +16 -11
  86. package/lib/features/agent/chat/ModernAgentOutput/Header.js.map +1 -1
  87. package/lib/features/agent/chat/ModernAgentOutput/InlineSlideInPanel.js +1 -1
  88. package/lib/features/agent/chat/ModernAgentOutput/InlineSlideInPanel.js.map +1 -1
  89. package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js +1 -1
  90. package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js.map +1 -1
  91. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.d.ts.map +1 -1
  92. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js +7 -7
  93. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js.map +1 -1
  94. package/lib/features/agent/chat/ModernAgentOutput/MessagesContainer.js +1 -1
  95. package/lib/features/agent/chat/ModernAgentOutput/MessagesContainer.js.map +1 -1
  96. package/lib/features/agent/chat/ModernAgentOutput/PlanPanel.d.ts.map +1 -1
  97. package/lib/features/agent/chat/ModernAgentOutput/PlanPanel.js +10 -10
  98. package/lib/features/agent/chat/ModernAgentOutput/PlanPanel.js.map +1 -1
  99. package/lib/features/agent/chat/ModernAgentOutput/SlideInPanel.js +1 -1
  100. package/lib/features/agent/chat/ModernAgentOutput/SlideInPanel.js.map +1 -1
  101. package/lib/features/agent/chat/ModernAgentOutput/SlidingMessages.d.ts.map +1 -1
  102. package/lib/features/agent/chat/ModernAgentOutput/SlidingMessages.js +1 -1
  103. package/lib/features/agent/chat/ModernAgentOutput/SlidingMessages.js.map +1 -1
  104. package/lib/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.js +17 -17
  105. package/lib/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.js.map +1 -1
  106. package/lib/features/agent/chat/ModernAgentOutput/StreamingMessage.js +1 -1
  107. package/lib/features/agent/chat/ModernAgentOutput/StreamingMessage.js.map +1 -1
  108. package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.d.ts.map +1 -1
  109. package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.js +14 -2
  110. package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.js.map +1 -1
  111. package/lib/features/agent/chat/ModernAgentOutput/ToolCallGroup.d.ts.map +1 -1
  112. package/lib/features/agent/chat/ModernAgentOutput/ToolCallGroup.js +15 -15
  113. package/lib/features/agent/chat/ModernAgentOutput/ToolCallGroup.js.map +1 -1
  114. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.d.ts.map +1 -1
  115. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.js +18 -0
  116. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.js.map +1 -1
  117. package/lib/features/agent/chat/SlidingThinkingIndicator.d.ts.map +1 -1
  118. package/lib/features/agent/chat/SlidingThinkingIndicator.js +5 -2
  119. package/lib/features/agent/chat/SlidingThinkingIndicator.js.map +1 -1
  120. package/lib/features/agent/chat/VegaLiteChart.d.ts.map +1 -1
  121. package/lib/features/agent/chat/VegaLiteChart.js +6 -2
  122. package/lib/features/agent/chat/VegaLiteChart.js.map +1 -1
  123. package/lib/features/agent/chat/hooks/useDocumentPanel.d.ts +2 -2
  124. package/lib/features/agent/chat/hooks/useDocumentPanel.d.ts.map +1 -1
  125. package/lib/features/agent/chat/hooks/useDocumentPanel.js +0 -18
  126. package/lib/features/agent/chat/hooks/useDocumentPanel.js.map +1 -1
  127. package/lib/features/errors/RowErrorBoundary.js +1 -1
  128. package/lib/features/errors/RowErrorBoundary.js.map +1 -1
  129. package/lib/features/facets/AgentRunnerFacetsNav.js +1 -1
  130. package/lib/features/facets/AgentRunnerFacetsNav.js.map +1 -1
  131. package/lib/features/facets/utils/VInteractionFacet.d.ts +3 -5
  132. package/lib/features/facets/utils/VInteractionFacet.d.ts.map +1 -1
  133. package/lib/features/facets/utils/VInteractionFacet.js +10 -23
  134. package/lib/features/facets/utils/VInteractionFacet.js.map +1 -1
  135. package/lib/features/facets/utils/VUserFacet.js +1 -1
  136. package/lib/features/facets/utils/VUserFacet.js.map +1 -1
  137. package/lib/features/layout/GenericPageNavHeader.d.ts.map +1 -1
  138. package/lib/features/layout/GenericPageNavHeader.js +4 -1
  139. package/lib/features/layout/GenericPageNavHeader.js.map +1 -1
  140. package/lib/features/layout/NotFoundView.js +1 -1
  141. package/lib/features/layout/NotFoundView.js.map +1 -1
  142. package/lib/features/magic-pdf/AnnotatedImageSlider.js +4 -12
  143. package/lib/features/magic-pdf/AnnotatedImageSlider.js.map +1 -1
  144. package/lib/features/magic-pdf/ExtractedContentView.js +4 -4
  145. package/lib/features/magic-pdf/ExtractedContentView.js.map +1 -1
  146. package/lib/features/magic-pdf/MagicPdfView.js +1 -1
  147. package/lib/features/magic-pdf/MagicPdfView.js.map +1 -1
  148. package/lib/features/oauth/McpConnectionsButton.d.ts.map +1 -1
  149. package/lib/features/oauth/McpConnectionsButton.js +4 -1
  150. package/lib/features/oauth/McpConnectionsButton.js.map +1 -1
  151. package/lib/features/oauth/McpConnectionsDialog.d.ts.map +1 -1
  152. package/lib/features/oauth/McpConnectionsDialog.js +3 -2
  153. package/lib/features/oauth/McpConnectionsDialog.js.map +1 -1
  154. package/lib/features/oauth/useMcpConnections.d.ts +6 -7
  155. package/lib/features/oauth/useMcpConnections.d.ts.map +1 -1
  156. package/lib/features/oauth/useMcpConnections.js +27 -20
  157. package/lib/features/oauth/useMcpConnections.js.map +1 -1
  158. package/lib/features/pdf-viewer/PdfPageRenderer.js +2 -2
  159. package/lib/features/pdf-viewer/PdfPageRenderer.js.map +1 -1
  160. package/lib/features/pdf-viewer/PdfPageSlider.js +3 -3
  161. package/lib/features/pdf-viewer/PdfPageSlider.js.map +1 -1
  162. package/lib/features/pdf-viewer/SimplePdfViewer.js +1 -1
  163. package/lib/features/pdf-viewer/SimplePdfViewer.js.map +1 -1
  164. package/lib/features/permissions/UserPermissionsProvider.d.ts +2 -1
  165. package/lib/features/permissions/UserPermissionsProvider.d.ts.map +1 -1
  166. package/lib/features/permissions/UserPermissionsProvider.js +35 -22
  167. package/lib/features/permissions/UserPermissionsProvider.js.map +1 -1
  168. package/lib/features/permissions/useRoleMappings.d.ts +19 -0
  169. package/lib/features/permissions/useRoleMappings.d.ts.map +1 -0
  170. package/lib/features/permissions/useRoleMappings.js +87 -0
  171. package/lib/features/permissions/useRoleMappings.js.map +1 -0
  172. package/lib/features/store/collections/SelectCollection.js +1 -1
  173. package/lib/features/store/collections/SelectCollection.js.map +1 -1
  174. package/lib/features/store/objects/DocumentPreviewPanel.d.ts.map +1 -1
  175. package/lib/features/store/objects/DocumentPreviewPanel.js +9 -9
  176. package/lib/features/store/objects/DocumentPreviewPanel.js.map +1 -1
  177. package/lib/features/store/objects/DocumentTable.js +1 -1
  178. package/lib/features/store/objects/DocumentTable.js.map +1 -1
  179. package/lib/features/store/objects/components/DocumentIcon.js +2 -2
  180. package/lib/features/store/objects/components/DocumentIcon.js.map +1 -1
  181. package/lib/features/store/objects/components/DocumentInput.js +1 -1
  182. package/lib/features/store/objects/components/DocumentInput.js.map +1 -1
  183. package/lib/features/store/objects/components/PropertiesEditorModal.js +1 -1
  184. package/lib/features/store/objects/components/PropertiesEditorModal.js.map +1 -1
  185. package/lib/features/store/objects/components/SaveVersionConfirmModal.js +1 -1
  186. package/lib/features/store/objects/components/SaveVersionConfirmModal.js.map +1 -1
  187. package/lib/features/store/objects/layout/documentLayout.d.ts.map +1 -1
  188. package/lib/features/store/objects/layout/documentLayout.js +2 -2
  189. package/lib/features/store/objects/layout/documentLayout.js.map +1 -1
  190. package/lib/features/store/objects/selection/SelectionActions.js +1 -1
  191. package/lib/features/store/objects/selection/SelectionActions.js.map +1 -1
  192. package/lib/features/store/types/IntakePolicyEditor.d.ts +10 -1
  193. package/lib/features/store/types/IntakePolicyEditor.d.ts.map +1 -1
  194. package/lib/features/store/types/IntakePolicyEditor.js +29 -19
  195. package/lib/features/store/types/IntakePolicyEditor.js.map +1 -1
  196. package/lib/features/store/types/IntakePolicyForm.d.ts +1 -1
  197. package/lib/features/store/types/IntakePolicyForm.d.ts.map +1 -1
  198. package/lib/features/store/types/IntakePolicyForm.js +5 -3
  199. package/lib/features/store/types/IntakePolicyForm.js.map +1 -1
  200. package/lib/features/store/types/SelectContentTypeModal.js +1 -1
  201. package/lib/features/store/types/SelectContentTypeModal.js.map +1 -1
  202. package/lib/features/store/types/TypeRegistry.d.ts +10 -5
  203. package/lib/features/store/types/TypeRegistry.d.ts.map +1 -1
  204. package/lib/features/store/types/search/ObjectTypeSearchContext.d.ts +10 -5
  205. package/lib/features/store/types/search/ObjectTypeSearchContext.d.ts.map +1 -1
  206. package/lib/features/user/UserAvatar.js +2 -2
  207. package/lib/features/user/UserAvatar.js.map +1 -1
  208. package/lib/features/user/UserInfo.d.ts.map +1 -1
  209. package/lib/features/user/UserInfo.js +7 -7
  210. package/lib/features/user/UserInfo.js.map +1 -1
  211. package/lib/features/utils/index.d.ts +1 -0
  212. package/lib/features/utils/index.d.ts.map +1 -1
  213. package/lib/features/utils/index.js +1 -0
  214. package/lib/features/utils/index.js.map +1 -1
  215. package/lib/features/utils/interaction.d.ts +55 -0
  216. package/lib/features/utils/interaction.d.ts.map +1 -0
  217. package/lib/features/utils/interaction.js +77 -0
  218. package/lib/features/utils/interaction.js.map +1 -0
  219. package/lib/features/views/ViewResults.js +2 -2
  220. package/lib/features/views/ViewResults.js.map +1 -1
  221. package/lib/i18n/locales/ar.json +17 -1
  222. package/lib/i18n/locales/de.json +13 -1
  223. package/lib/i18n/locales/en.json +13 -1
  224. package/lib/i18n/locales/es.json +13 -1
  225. package/lib/i18n/locales/fr.json +13 -1
  226. package/lib/i18n/locales/it.json +13 -1
  227. package/lib/i18n/locales/ja.json +13 -1
  228. package/lib/i18n/locales/ko.json +13 -1
  229. package/lib/i18n/locales/pt.json +13 -1
  230. package/lib/i18n/locales/ru.json +15 -1
  231. package/lib/i18n/locales/tr.json +13 -1
  232. package/lib/i18n/locales/zh-TW.json +13 -1
  233. package/lib/i18n/locales/zh.json +13 -1
  234. package/lib/layout/FullHeightLayout.js +2 -2
  235. package/lib/layout/FullHeightLayout.js.map +1 -1
  236. package/lib/layout/Navbar.js +4 -4
  237. package/lib/layout/Navbar.js.map +1 -1
  238. package/lib/layout/Sidebar.js +1 -1
  239. package/lib/layout/Sidebar.js.map +1 -1
  240. package/lib/router/NestedNavigationContext.d.ts +3 -1
  241. package/lib/router/NestedNavigationContext.d.ts.map +1 -1
  242. package/lib/router/NestedNavigationContext.js +2 -2
  243. package/lib/router/NestedNavigationContext.js.map +1 -1
  244. package/lib/session/UserSessionProvider.d.ts.map +1 -1
  245. package/lib/session/UserSessionProvider.js +2 -13
  246. package/lib/session/UserSessionProvider.js.map +1 -1
  247. package/lib/session/auth/authState.d.ts +13 -0
  248. package/lib/session/auth/authState.d.ts.map +1 -0
  249. package/lib/session/auth/authState.js +37 -0
  250. package/lib/session/auth/authState.js.map +1 -0
  251. package/lib/session/auth/domainRouting.d.ts +39 -0
  252. package/lib/session/auth/domainRouting.d.ts.map +1 -1
  253. package/lib/session/auth/domainRouting.js +85 -0
  254. package/lib/session/auth/domainRouting.js.map +1 -1
  255. package/lib/session/auth/useAuthState.d.ts +4 -7
  256. package/lib/session/auth/useAuthState.d.ts.map +1 -1
  257. package/lib/session/auth/useAuthState.js +5 -41
  258. package/lib/session/auth/useAuthState.js.map +1 -1
  259. package/lib/session/index.d.ts +1 -0
  260. package/lib/session/index.d.ts.map +1 -1
  261. package/lib/session/index.js +2 -0
  262. package/lib/session/index.js.map +1 -1
  263. package/lib/shell/SplashScreen.d.ts +1 -1
  264. package/lib/shell/SplashScreen.d.ts.map +1 -1
  265. package/lib/shell/SplashScreen.js +6 -2
  266. package/lib/shell/SplashScreen.js.map +1 -1
  267. package/lib/shell/VertesiaShell.js +1 -1
  268. package/lib/shell/VertesiaShell.js.map +1 -1
  269. package/lib/shell/apps/AppProjectSelector.js +1 -1
  270. package/lib/shell/apps/AppProjectSelector.js.map +1 -1
  271. package/lib/shell/apps/StandaloneApp.js +2 -2
  272. package/lib/shell/apps/StandaloneApp.js.map +1 -1
  273. package/lib/shell/login/SignInPrimitives.js +2 -2
  274. package/lib/shell/login/SignInPrimitives.js.map +1 -1
  275. package/lib/shell/login/SigninScreen.js +1 -1
  276. package/lib/shell/login/SigninScreen.js.map +1 -1
  277. package/lib/shell/login/SignupForm.js +1 -1
  278. package/lib/shell/login/SignupForm.js.map +1 -1
  279. package/lib/shell/login/TerminalLogin.js +2 -2
  280. package/lib/shell/login/TerminalLogin.js.map +1 -1
  281. package/lib/shell/login/UserInfo.d.ts.map +1 -1
  282. package/lib/shell/login/UserInfo.js +1 -1
  283. package/lib/shell/login/UserInfo.js.map +1 -1
  284. package/lib/shell/login/UserSessionMenu.js +1 -1
  285. package/lib/shell/login/UserSessionMenu.js.map +1 -1
  286. package/lib/vertesia-ui-core.js +7 -7
  287. package/lib/vertesia-ui-core.js.map +1 -1
  288. package/lib/vertesia-ui-features.js +179 -182
  289. package/lib/vertesia-ui-features.js.map +1 -1
  290. package/lib/vertesia-ui-i18n.BfN7iOHb.chunk.js +5 -0
  291. package/lib/vertesia-ui-i18n.BfN7iOHb.chunk.js.map +1 -0
  292. package/lib/vertesia-ui-i18n.BjH2zEZw.chunk.js +5 -0
  293. package/lib/vertesia-ui-i18n.BjH2zEZw.chunk.js.map +1 -0
  294. package/lib/vertesia-ui-i18n.BjSwAZXl.chunk.js +5 -0
  295. package/lib/vertesia-ui-i18n.BjSwAZXl.chunk.js.map +1 -0
  296. package/lib/vertesia-ui-i18n.C7PUm5Au.chunk.js +5 -0
  297. package/lib/vertesia-ui-i18n.C7PUm5Au.chunk.js.map +1 -0
  298. package/lib/vertesia-ui-i18n.CF_1mUS5.chunk.js +5 -0
  299. package/lib/vertesia-ui-i18n.CF_1mUS5.chunk.js.map +1 -0
  300. package/lib/vertesia-ui-i18n.ChfUl3_-.chunk.js +5 -0
  301. package/lib/vertesia-ui-i18n.ChfUl3_-.chunk.js.map +1 -0
  302. package/lib/vertesia-ui-i18n.D-Sk-5d1.chunk.js +5 -0
  303. package/lib/vertesia-ui-i18n.D-Sk-5d1.chunk.js.map +1 -0
  304. package/lib/vertesia-ui-i18n.D4rnu1_S.chunk.js +5 -0
  305. package/lib/vertesia-ui-i18n.D4rnu1_S.chunk.js.map +1 -0
  306. package/lib/vertesia-ui-i18n.DDf0-laK.chunk.js +5 -0
  307. package/lib/vertesia-ui-i18n.DDf0-laK.chunk.js.map +1 -0
  308. package/lib/vertesia-ui-i18n.DN79y06J.chunk.js +5 -0
  309. package/lib/vertesia-ui-i18n.DN79y06J.chunk.js.map +1 -0
  310. package/lib/vertesia-ui-i18n.DWLIciYQ.chunk.js +5 -0
  311. package/lib/vertesia-ui-i18n.DWLIciYQ.chunk.js.map +1 -0
  312. package/lib/vertesia-ui-i18n.DvF_YaAJ.chunk.js +5 -0
  313. package/lib/vertesia-ui-i18n.DvF_YaAJ.chunk.js.map +1 -0
  314. package/lib/vertesia-ui-i18n.js +2 -2
  315. package/lib/vertesia-ui-layout.js +1 -1
  316. package/lib/vertesia-ui-layout.js.map +1 -1
  317. package/lib/vertesia-ui-rich-text.js +24 -24
  318. package/lib/vertesia-ui-rich-text.js.map +1 -1
  319. package/lib/vertesia-ui-router.js +1 -1
  320. package/lib/vertesia-ui-router.js.map +1 -1
  321. package/lib/vertesia-ui-session.js +1 -1
  322. package/lib/vertesia-ui-session.js.map +1 -1
  323. package/lib/vertesia-ui-shell.js +3 -3
  324. package/lib/vertesia-ui-shell.js.map +1 -1
  325. package/lib/vertesia-ui-widgets.js +54 -54
  326. package/lib/vertesia-ui-widgets.js.map +1 -1
  327. package/lib/widgets/Progress.js +1 -1
  328. package/lib/widgets/Progress.js.map +1 -1
  329. package/lib/widgets/form/Form.js +2 -2
  330. package/lib/widgets/form/Form.js.map +1 -1
  331. package/lib/widgets/form/fields.js +2 -2
  332. package/lib/widgets/form/fields.js.map +1 -1
  333. package/lib/widgets/json-view/JSONView.js +1 -1
  334. package/lib/widgets/json-view/JSONView.js.map +1 -1
  335. package/lib/widgets/markdown/MermaidDiagram.js +1 -1
  336. package/lib/widgets/markdown/MermaidDiagram.js.map +1 -1
  337. package/lib/widgets/markdown/remarkDirectiveHandler.d.ts +7 -2
  338. package/lib/widgets/markdown/remarkDirectiveHandler.d.ts.map +1 -1
  339. package/lib/widgets/markdown/remarkDirectiveHandler.js +19 -4
  340. package/lib/widgets/markdown/remarkDirectiveHandler.js.map +1 -1
  341. package/lib/widgets/monacoEditor/MonacoEditor.d.ts.map +1 -1
  342. package/lib/widgets/monacoEditor/MonacoEditor.js +4 -2
  343. package/lib/widgets/monacoEditor/MonacoEditor.js.map +1 -1
  344. package/lib/widgets/monacoEditor/index.d.ts +1 -0
  345. package/lib/widgets/monacoEditor/index.d.ts.map +1 -1
  346. package/lib/widgets/monacoEditor/index.js +1 -0
  347. package/lib/widgets/monacoEditor/index.js.map +1 -1
  348. package/lib/widgets/monacoEditor/loadMonaco.d.ts +45 -0
  349. package/lib/widgets/monacoEditor/loadMonaco.d.ts.map +1 -0
  350. package/lib/widgets/monacoEditor/loadMonaco.js +62 -0
  351. package/lib/widgets/monacoEditor/loadMonaco.js.map +1 -0
  352. package/lib/widgets/properties/PropertiesView.js +1 -1
  353. package/lib/widgets/properties/PropertiesView.js.map +1 -1
  354. package/lib/widgets/schema-editor/editor/Editable.js +2 -2
  355. package/lib/widgets/schema-editor/editor/Editable.js.map +1 -1
  356. package/lib/widgets/schema-editor/editor/PropertyEditor.js +1 -1
  357. package/lib/widgets/schema-editor/editor/PropertyEditor.js.map +1 -1
  358. package/lib/widgets/schema-editor/editor/SchemaEditor.js +2 -2
  359. package/lib/widgets/schema-editor/editor/SchemaEditor.js.map +1 -1
  360. package/lib/widgets/upload/DropZone.js +1 -1
  361. package/lib/widgets/upload/DropZone.js.map +1 -1
  362. package/lib/widgets/upload/UploadResultCategory.d.ts +1 -1
  363. package/lib/widgets/upload/UploadResultCategory.d.ts.map +1 -1
  364. package/lib/widgets/upload/UploadResultCategory.js +3 -3
  365. package/lib/widgets/upload/UploadResultCategory.js.map +1 -1
  366. package/lib/widgets/upload/UploadSummary.js +1 -1
  367. package/lib/widgets/upload/UploadSummary.js.map +1 -1
  368. package/lib/widgets/xml-viewer/components/XMLViewer.d.ts.map +1 -1
  369. package/lib/widgets/xml-viewer/components/XMLViewer.js +7 -3
  370. package/lib/widgets/xml-viewer/components/XMLViewer.js.map +1 -1
  371. package/lib/widgets/xml-viewer/hooks/useCollapsible.d.ts +1 -1
  372. package/lib/widgets/xml-viewer/hooks/useXMLViewer.d.ts +11 -13
  373. package/lib/widgets/xml-viewer/hooks/useXMLViewer.d.ts.map +1 -1
  374. package/lib/widgets/xml-viewer/hooks/useXMLViewer.js +41 -14
  375. package/lib/widgets/xml-viewer/hooks/useXMLViewer.js.map +1 -1
  376. package/package.json +7 -7
  377. package/src/__tests__/contrast.test.ts +1 -0
  378. package/src/core/components/Avatar.tsx +3 -3
  379. package/src/core/components/ComboBox.tsx +1 -1
  380. package/src/core/components/FileUpload.tsx +4 -4
  381. package/src/core/components/Link.tsx +1 -1
  382. package/src/core/components/SelectList.tsx +1 -1
  383. package/src/core/components/SidePanel.tsx +1 -1
  384. package/src/core/components/Spinner.tsx +1 -1
  385. package/src/core/components/TagsInput.tsx +8 -8
  386. package/src/core/components/shadcn/MessageBox.tsx +1 -1
  387. package/src/core/components/shadcn/button.tsx +1 -1
  388. package/src/core/components/shadcn/card.tsx +1 -3
  389. package/src/core/components/shadcn/command.tsx +5 -5
  390. package/src/core/components/shadcn/filters/DynamicLabel.tsx +1 -1
  391. package/src/core/components/shadcn/filters/comboBox/DateCombobox.tsx +3 -3
  392. package/src/core/components/shadcn/input.tsx +3 -3
  393. package/src/core/components/shadcn/modal/ConfirmModal.tsx +3 -3
  394. package/src/core/components/shadcn/modal/dialog.tsx +2 -4
  395. package/src/core/components/shadcn/overflowTabs.tsx +2 -2
  396. package/src/core/components/shadcn/popover.tsx +1 -1
  397. package/src/core/components/shadcn/radioGroup.tsx +5 -7
  398. package/src/core/components/shadcn/selectBox.tsx +1 -1
  399. package/src/core/components/shadcn/tabs.tsx +4 -2
  400. package/src/core/components/styles.ts +1 -1
  401. package/src/core/components/table/index.tsx +1 -1
  402. package/src/core/hooks/useFetch.test.ts +20 -0
  403. package/src/core/hooks/useFetch.ts +2 -0
  404. package/src/css/base.css +1 -1
  405. package/src/css/color.css +4 -0
  406. package/src/css/theme.css +1 -0
  407. package/src/css/typography.css +2 -2
  408. package/src/features/activity-doc/ActivityDoc.tsx +11 -11
  409. package/src/features/agent/chat/AgentChart.tsx +1 -1
  410. package/src/features/agent/chat/AgentRightPanel.tsx +4 -8
  411. package/src/features/agent/chat/AskUserWidget.tsx +19 -23
  412. package/src/features/agent/chat/DocumentPanel.tsx +39 -48
  413. package/src/features/agent/chat/DocumentsTab.test.tsx +87 -0
  414. package/src/features/agent/chat/DocumentsTab.tsx +124 -0
  415. package/src/features/agent/chat/JumpingDots.tsx +3 -3
  416. package/src/features/agent/chat/ModernAgentConversation.test.tsx +0 -1
  417. package/src/features/agent/chat/ModernAgentConversation.tsx +3 -5
  418. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.test.tsx +60 -1
  419. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +44 -24
  420. package/src/features/agent/chat/ModernAgentOutput/BatchProgressPanel.tsx +12 -12
  421. package/src/features/agent/chat/ModernAgentOutput/Header.tsx +28 -15
  422. package/src/features/agent/chat/ModernAgentOutput/InlineSlideInPanel.tsx +4 -4
  423. package/src/features/agent/chat/ModernAgentOutput/MessageInput.tsx +2 -2
  424. package/src/features/agent/chat/ModernAgentOutput/MessageItem.tsx +7 -12
  425. package/src/features/agent/chat/ModernAgentOutput/MessagesContainer.tsx +1 -1
  426. package/src/features/agent/chat/ModernAgentOutput/PlanPanel.tsx +16 -22
  427. package/src/features/agent/chat/ModernAgentOutput/SlideInPanel.tsx +4 -4
  428. package/src/features/agent/chat/ModernAgentOutput/SlidingMessages.tsx +2 -4
  429. package/src/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.tsx +21 -21
  430. package/src/features/agent/chat/ModernAgentOutput/StreamingMessage.tsx +4 -4
  431. package/src/features/agent/chat/ModernAgentOutput/SummaryConversation.ts +16 -1
  432. package/src/features/agent/chat/ModernAgentOutput/ToolCallGroup.tsx +19 -40
  433. package/src/features/agent/chat/ModernAgentOutput/requestInputMessages.test.ts +41 -0
  434. package/src/features/agent/chat/ModernAgentOutput/requestInputMessages.ts +19 -0
  435. package/src/features/agent/chat/ModernAgentOutput/utils.test.ts +93 -0
  436. package/src/features/agent/chat/SlidingThinkingIndicator.tsx +5 -2
  437. package/src/features/agent/chat/VegaLiteChart.tsx +6 -2
  438. package/src/features/agent/chat/hooks/useDocumentPanel.test.tsx +33 -0
  439. package/src/features/agent/chat/hooks/useDocumentPanel.ts +3 -20
  440. package/src/features/errors/RowErrorBoundary.tsx +1 -1
  441. package/src/features/facets/AgentRunnerFacetsNav.tsx +1 -1
  442. package/src/features/facets/utils/VInteractionFacet.tsx +22 -34
  443. package/src/features/facets/utils/VUserFacet.tsx +1 -1
  444. package/src/features/layout/GenericPageNavHeader.tsx +9 -1
  445. package/src/features/layout/NotFoundView.tsx +1 -1
  446. package/src/features/magic-pdf/AnnotatedImageSlider.tsx +8 -16
  447. package/src/features/magic-pdf/ExtractedContentView.tsx +4 -4
  448. package/src/features/magic-pdf/MagicPdfView.tsx +1 -1
  449. package/src/features/oauth/McpConnectionsButton.test.tsx +79 -8
  450. package/src/features/oauth/McpConnectionsButton.tsx +6 -3
  451. package/src/features/oauth/McpConnectionsDialog.tsx +9 -3
  452. package/src/features/oauth/useMcpConnections.ts +33 -27
  453. package/src/features/pdf-viewer/PdfPageRenderer.tsx +2 -2
  454. package/src/features/pdf-viewer/PdfPageSlider.tsx +4 -4
  455. package/src/features/pdf-viewer/SimplePdfViewer.tsx +1 -1
  456. package/src/features/permissions/UserPermissionsProvider.test.tsx +172 -0
  457. package/src/features/permissions/UserPermissionsProvider.tsx +68 -21
  458. package/src/features/permissions/useRoleMappings.ts +105 -0
  459. package/src/features/store/collections/SelectCollection.tsx +1 -1
  460. package/src/features/store/objects/DocumentPreviewPanel.tsx +43 -53
  461. package/src/features/store/objects/DocumentTable.tsx +2 -2
  462. package/src/features/store/objects/components/DocumentIcon.tsx +4 -4
  463. package/src/features/store/objects/components/DocumentInput.tsx +3 -3
  464. package/src/features/store/objects/components/PropertiesEditorModal.tsx +2 -2
  465. package/src/features/store/objects/components/SaveVersionConfirmModal.tsx +2 -2
  466. package/src/features/store/objects/layout/documentLayout.tsx +2 -4
  467. package/src/features/store/objects/selection/SelectionActions.tsx +1 -1
  468. package/src/features/store/types/IntakePolicyEditor.tsx +70 -36
  469. package/src/features/store/types/IntakePolicyForm.tsx +11 -3
  470. package/src/features/store/types/SelectContentTypeModal.tsx +1 -1
  471. package/src/features/user/UserAvatar.tsx +3 -3
  472. package/src/features/user/UserInfo.tsx +11 -16
  473. package/src/features/utils/index.ts +1 -0
  474. package/src/features/utils/interaction.test.tsx +93 -0
  475. package/src/features/utils/interaction.tsx +125 -0
  476. package/src/features/views/ViewResults.tsx +3 -3
  477. package/src/i18n/locales/ar.json +17 -1
  478. package/src/i18n/locales/de.json +13 -1
  479. package/src/i18n/locales/en.json +13 -1
  480. package/src/i18n/locales/es.json +13 -1
  481. package/src/i18n/locales/fr.json +13 -1
  482. package/src/i18n/locales/it.json +13 -1
  483. package/src/i18n/locales/ja.json +13 -1
  484. package/src/i18n/locales/ko.json +13 -1
  485. package/src/i18n/locales/pt.json +13 -1
  486. package/src/i18n/locales/ru.json +15 -1
  487. package/src/i18n/locales/tr.json +13 -1
  488. package/src/i18n/locales/zh-TW.json +13 -1
  489. package/src/i18n/locales/zh.json +13 -1
  490. package/src/layout/FullHeightLayout.tsx +2 -2
  491. package/src/layout/Navbar.tsx +5 -5
  492. package/src/layout/Sidebar.tsx +1 -1
  493. package/src/router/NestedNavigationContext.test.tsx +54 -0
  494. package/src/router/NestedNavigationContext.tsx +9 -2
  495. package/src/session/UserSessionProvider.tsx +2 -15
  496. package/src/session/auth/authState.test.ts +35 -0
  497. package/src/session/auth/authState.ts +42 -0
  498. package/src/session/auth/domainRouting.test.ts +169 -1
  499. package/src/session/auth/domainRouting.ts +89 -0
  500. package/src/session/auth/useAuthState.ts +5 -49
  501. package/src/session/index.ts +6 -0
  502. package/src/shell/SplashScreen.test.tsx +22 -0
  503. package/src/shell/SplashScreen.tsx +6 -2
  504. package/src/shell/VertesiaShell.tsx +1 -1
  505. package/src/shell/apps/AppProjectSelector.tsx +1 -1
  506. package/src/shell/apps/StandaloneApp.tsx +9 -9
  507. package/src/shell/login/SignInPrimitives.tsx +2 -2
  508. package/src/shell/login/SigninScreen.tsx +1 -1
  509. package/src/shell/login/SignupForm.tsx +2 -2
  510. package/src/shell/login/TerminalLogin.tsx +5 -5
  511. package/src/shell/login/UserInfo.tsx +2 -5
  512. package/src/shell/login/UserSessionMenu.tsx +2 -2
  513. package/src/widgets/Progress.tsx +2 -2
  514. package/src/widgets/form/Form.tsx +4 -4
  515. package/src/widgets/form/fields.tsx +2 -2
  516. package/src/widgets/json-view/JSONView.tsx +1 -6
  517. package/src/widgets/markdown/ArtifactEditingSurface.test.tsx +33 -29
  518. package/src/widgets/markdown/MarkdownRenderer.test.tsx +52 -0
  519. package/src/widgets/markdown/MermaidDiagram.tsx +2 -2
  520. package/src/widgets/markdown/remarkDirectiveHandler.ts +21 -5
  521. package/src/widgets/monacoEditor/MonacoEditor.tsx +4 -2
  522. package/src/widgets/monacoEditor/index.ts +1 -0
  523. package/src/widgets/monacoEditor/loadMonaco.test.ts +63 -0
  524. package/src/widgets/monacoEditor/loadMonaco.ts +70 -0
  525. package/src/widgets/properties/PropertiesView.tsx +1 -1
  526. package/src/widgets/schema-editor/editor/Editable.tsx +2 -2
  527. package/src/widgets/schema-editor/editor/PropertyEditor.tsx +1 -1
  528. package/src/widgets/schema-editor/editor/SchemaEditor.tsx +2 -2
  529. package/src/widgets/upload/DropZone.tsx +1 -1
  530. package/src/widgets/upload/UploadResultCategory.tsx +7 -7
  531. package/src/widgets/upload/UploadSummary.tsx +4 -4
  532. package/src/widgets/xml-viewer/components/XMLViewer.tsx +7 -3
  533. package/src/widgets/xml-viewer/hooks/useXMLViewer.test.ts +60 -7
  534. package/src/widgets/xml-viewer/hooks/useXMLViewer.ts +70 -16
  535. package/lib/features/agent/chat/DocumentTabBar.d.ts +0 -9
  536. package/lib/features/agent/chat/DocumentTabBar.d.ts.map +0 -1
  537. package/lib/features/agent/chat/DocumentTabBar.js +0 -9
  538. package/lib/features/agent/chat/DocumentTabBar.js.map +0 -1
  539. package/lib/vertesia-ui-i18n.BJBGsq-8.chunk.js +0 -5
  540. package/lib/vertesia-ui-i18n.BJBGsq-8.chunk.js.map +0 -1
  541. package/lib/vertesia-ui-i18n.BY5YG5cX.chunk.js +0 -5
  542. package/lib/vertesia-ui-i18n.BY5YG5cX.chunk.js.map +0 -1
  543. package/lib/vertesia-ui-i18n.Bd5_1BXO.chunk.js +0 -5
  544. package/lib/vertesia-ui-i18n.Bd5_1BXO.chunk.js.map +0 -1
  545. package/lib/vertesia-ui-i18n.Bvwej2HH.chunk.js +0 -5
  546. package/lib/vertesia-ui-i18n.Bvwej2HH.chunk.js.map +0 -1
  547. package/lib/vertesia-ui-i18n.CMT3f4gf.chunk.js +0 -5
  548. package/lib/vertesia-ui-i18n.CMT3f4gf.chunk.js.map +0 -1
  549. package/lib/vertesia-ui-i18n.D56DNPJW.chunk.js +0 -5
  550. package/lib/vertesia-ui-i18n.D56DNPJW.chunk.js.map +0 -1
  551. package/lib/vertesia-ui-i18n.DDzKLNx6.chunk.js +0 -5
  552. package/lib/vertesia-ui-i18n.DDzKLNx6.chunk.js.map +0 -1
  553. package/lib/vertesia-ui-i18n.D_Am1LpF.chunk.js +0 -5
  554. package/lib/vertesia-ui-i18n.D_Am1LpF.chunk.js.map +0 -1
  555. package/lib/vertesia-ui-i18n.DrZizgGV.chunk.js +0 -5
  556. package/lib/vertesia-ui-i18n.DrZizgGV.chunk.js.map +0 -1
  557. package/lib/vertesia-ui-i18n.DwHsq86z.chunk.js +0 -5
  558. package/lib/vertesia-ui-i18n.DwHsq86z.chunk.js.map +0 -1
  559. package/lib/vertesia-ui-i18n.PLpo0Bbz.chunk.js +0 -5
  560. package/lib/vertesia-ui-i18n.PLpo0Bbz.chunk.js.map +0 -1
  561. package/lib/vertesia-ui-i18n.xVbXALqz.chunk.js +0 -5
  562. package/lib/vertesia-ui-i18n.xVbXALqz.chunk.js.map +0 -1
  563. package/src/features/agent/chat/DocumentTabBar.tsx +0 -41
@@ -117,13 +117,13 @@ function areMessagesRenderEqual(prevMessage: AgentMessage, nextMessage: AgentMes
117
117
  function statusBadgeClass(status?: ToolExecutionStatus): string {
118
118
  switch (status) {
119
119
  case 'completed':
120
- return 'bg-green-50 dark:bg-green-900/30 text-green-700 dark:text-green-300 border-green-200 dark:border-green-800';
120
+ return 'bg-success text-success border-success';
121
121
  case 'running':
122
- return 'bg-blue-50 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 border-blue-200 dark:border-blue-800';
122
+ return 'bg-info text-info border-info';
123
123
  case 'error':
124
- return 'bg-red-50 dark:bg-red-900/30 text-red-700 dark:text-red-300 border-red-200 dark:border-red-800';
124
+ return 'bg-destructive text-destructive border-destructive';
125
125
  case 'warning':
126
- return 'bg-yellow-50 dark:bg-yellow-900/30 text-yellow-700 dark:text-yellow-300 border-yellow-200 dark:border-yellow-800';
126
+ return 'bg-attention text-attention border-attention';
127
127
  default:
128
128
  return '';
129
129
  }
@@ -320,10 +320,9 @@ const getFilesFromDetails = (
320
320
  return Array.isArray(files) ? files : undefined;
321
321
  };
322
322
 
323
- const TOOL_BADGE_CLASS =
324
- 'text-[10px] px-1.5 py-0.5 rounded-md bg-purple-50 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300 border border-purple-200 dark:border-purple-800 font-medium';
323
+ const TOOL_BADGE_CLASS = 'text-[10px] px-1.5 py-0.5 rounded-md bg-done text-done border border-done font-medium';
325
324
  const ASSISTANT_BADGE_CLASS =
326
- 'text-[10px] px-1.5 py-0.5 rounded-md bg-gray-50 dark:bg-gray-800 text-gray-700 dark:text-gray-300 border border-gray-200 dark:border-gray-700 font-medium';
325
+ 'text-[10px] px-1.5 py-0.5 rounded-md bg-muted text-foreground border border-border font-medium';
327
326
 
328
327
  const isToolPreambleMessage = (message: AgentMessage): boolean => {
329
328
  const details = message.details as { display_role?: string } | undefined;
@@ -452,14 +451,14 @@ function ToolCallItem({ message, isExpanded, onToggle, artifactRunId, classNames
452
451
  };
453
452
 
454
453
  return (
455
- <div className={cn('border-b border-gray-100 dark:border-gray-800 last:border-b-0', classNames.itemClassName)}>
454
+ <div className={cn('border-b border-border last:border-b-0', classNames.itemClassName)}>
456
455
  {/* Collapsed header - always visible */}
457
456
  {/* biome-ignore lint/a11y/useSemanticElements: header contains nested Buttons (copy); button-in-button is invalid HTML so role="button" on a div is the pragmatic choice. */}
458
457
  <div
459
458
  role="button"
460
459
  tabIndex={0}
461
460
  className={cn(
462
- 'flex items-start justify-between px-3 py-2 cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors',
461
+ 'flex items-start justify-between px-3 py-2 cursor-pointer hover:bg-muted transition-colors',
463
462
  classNames.itemHeaderClassName,
464
463
  )}
465
464
  onClick={onToggle}
@@ -518,12 +517,7 @@ function ToolCallItem({ message, isExpanded, onToggle, artifactRunId, classNames
518
517
  );
519
518
  const progressDetails = getProgressDetails(details as Record<string, unknown> | undefined);
520
519
  return (
521
- <div
522
- className={cn(
523
- 'px-4 py-2 bg-gray-50/50 dark:bg-gray-800/30',
524
- classNames.itemContentClassName,
525
- )}
526
- >
520
+ <div className={cn('px-4 py-2 bg-muted/50 dark:bg-muted/30', classNames.itemContentClassName)}>
527
521
  {/* Badges row: tool name + status + timestamp */}
528
522
  <div className="flex items-center gap-2 mb-2 flex-wrap">
529
523
  <span className={cn(badgeClass, classNames.toolBadgeClassName)}>{toolName}</span>
@@ -769,7 +763,7 @@ function GroupImageDisplay({ messages, artifactRunId }: { messages: AgentMessage
769
763
  if (resolvedImages.length === 0) return null;
770
764
 
771
765
  return (
772
- <div className="px-3 py-1.5 border-b border-gray-100 dark:border-gray-800">
766
+ <div className="px-3 py-1.5 border-b border-border">
773
767
  <FileDisplay files={resolvedImages} />
774
768
  </div>
775
769
  );
@@ -829,7 +823,7 @@ function ToolCallGroupComponent({
829
823
  return <PulsatingCircle size="sm" color="blue" />;
830
824
  }
831
825
  if (toolStatus === 'running') {
832
- return <span className="size-2 rounded-full bg-blue-500 inline-block" />;
826
+ return <span className="size-2 rounded-full bg-primary inline-block" />;
833
827
  }
834
828
  if (toolStatus === 'completed') {
835
829
  return <CheckCircle className="size-4 text-success" />;
@@ -840,7 +834,7 @@ function ToolCallGroupComponent({
840
834
  if (toolStatus === 'warning') {
841
835
  return <AlertTriangle className="size-4 text-attention" />;
842
836
  }
843
- return <Bot className="size-4 text-purple-600 dark:text-purple-400" />;
837
+ return <Bot className="size-4 text-done" />;
844
838
  };
845
839
 
846
840
  // Get border color based on status
@@ -848,7 +842,7 @@ function ToolCallGroupComponent({
848
842
  if (toolStatus === 'completed') return 'border-s-success';
849
843
  if (toolStatus === 'error') return 'border-s-destructive';
850
844
  if (toolStatus === 'warning') return 'border-s-attention';
851
- return 'border-s-purple-500';
845
+ return 'border-s-done';
852
846
  };
853
847
 
854
848
  // Animate new messages when they're added
@@ -914,9 +908,7 @@ function ToolCallGroupComponent({
914
908
  };
915
909
 
916
910
  return (
917
- <div
918
- className={cn('border-s-4 overflow-hidden bg-white dark:bg-gray-900 mb-4', getBorderColor(), rootClassName)}
919
- >
911
+ <div className={cn('border-s-4 overflow-hidden bg-white dark:bg-muted mb-4', getBorderColor(), rootClassName)}>
920
912
  {/* Compact header */}
921
913
  {/* biome-ignore lint/a11y/useSemanticElements: header contains nested Buttons; button-in-button is invalid HTML so role="button" on a div is the pragmatic choice. */}
922
914
  <div
@@ -924,7 +916,7 @@ function ToolCallGroupComponent({
924
916
  tabIndex={0}
925
917
  aria-expanded={!isCollapsed}
926
918
  className={cn(
927
- 'flex items-center justify-between px-4 py-1.5 cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors',
919
+ 'flex items-center justify-between px-4 py-1.5 cursor-pointer hover:bg-muted transition-colors',
928
920
  headerClassName,
929
921
  )}
930
922
  onClick={() => setIsCollapsed(!isCollapsed)}
@@ -941,12 +933,7 @@ function ToolCallGroupComponent({
941
933
  ) : (
942
934
  <>
943
935
  <span className={cn('text-xs font-medium text-muted', senderClassName)}>Agent</span>
944
- <span
945
- className={cn(
946
- 'text-xs text-purple-600 dark:text-purple-400 font-medium',
947
- toolSummaryClassName,
948
- )}
949
- >
936
+ <span className={cn('text-xs text-done font-medium', toolSummaryClassName)}>
950
937
  {toolSummary}
951
938
  </span>
952
939
  </>
@@ -960,12 +947,7 @@ function ToolCallGroupComponent({
960
947
 
961
948
  <div className="flex items-center gap-1 flex-shrink-0">
962
949
  {preambleText && (
963
- <span
964
- className={cn(
965
- 'text-[10px] text-purple-600 dark:text-purple-400 font-medium',
966
- toolSummaryClassName,
967
- )}
968
- >
950
+ <span className={cn('text-[10px] text-done font-medium', toolSummaryClassName)}>
969
951
  {toolSummary}
970
952
  </span>
971
953
  )}
@@ -1016,10 +998,7 @@ function ToolCallGroupComponent({
1016
998
  return (
1017
999
  <div
1018
1000
  key={itemKey}
1019
- className={cn(
1020
- 'border-b border-gray-100 dark:border-gray-800 last:border-b-0',
1021
- itemClassName,
1022
- )}
1001
+ className={cn('border-b border-border last:border-b-0', itemClassName)}
1023
1002
  style={{
1024
1003
  opacity: isAnimating ? 0 : 1,
1025
1004
  transform: isAnimating ? 'translateX(-10px)' : 'translateX(0)',
@@ -1036,7 +1015,7 @@ function ToolCallGroupComponent({
1036
1015
  tabIndex={0}
1037
1016
  aria-expanded={isItemExpanded}
1038
1017
  className={cn(
1039
- 'flex items-start gap-2 py-1.5 text-xs cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800/50',
1018
+ 'flex items-start gap-2 py-1.5 text-xs cursor-pointer hover:bg-muted',
1040
1019
  itemHeaderClassName,
1041
1020
  )}
1042
1021
  onClick={() => toggleItem(itemKey)}
@@ -28,6 +28,29 @@ function makeApprovalRequest(): AgentMessage {
28
28
  } as unknown as AgentMessage;
29
29
  }
30
30
 
31
+ function makeApprovalRequestForToolUse(toolUseId: string): AgentMessage {
32
+ const request = makeApprovalRequest();
33
+ return {
34
+ ...request,
35
+ details: { ...(request.details as Record<string, unknown>), request_id: toolUseId },
36
+ } as unknown as AgentMessage;
37
+ }
38
+
39
+ function makeApprovalReleasedMessage(toolUseId: string, timestamp: number): AgentMessage {
40
+ return {
41
+ timestamp,
42
+ type: AgentMessageType.UPDATE,
43
+ message: 'Approval reviewer allowed Create a new draft interaction.',
44
+ workstream_id: 'main',
45
+ details: {
46
+ request_id: toolUseId,
47
+ approval_decision: 'auto_approved',
48
+ approval_release_reason: 'reviewer_allowed',
49
+ approval_request: { tool_name: 'create_interaction', approval_key: APPROVAL_KEY },
50
+ },
51
+ } as unknown as AgentMessage;
52
+ }
53
+
31
54
  function makeUserAnswer(message: string, metadata?: Record<string, unknown>): AgentMessage {
32
55
  return {
33
56
  timestamp: 2,
@@ -164,6 +187,24 @@ describe('request input correlation', () => {
164
187
  expect(getPendingRequestInputMessage([firstRequest, firstAnswer, secondRequest])).toBe(secondRequest);
165
188
  });
166
189
 
190
+ it('stops asking once the workflow releases the approval without a user answer', () => {
191
+ const request = makeApprovalRequestForToolUse('write-1');
192
+ const released = makeApprovalReleasedMessage('write-1', 3);
193
+
194
+ expect(getPendingRequestInputMessage([request])).toBe(request);
195
+ expect(getPendingRequestInputMessage([request, released])).toBeUndefined();
196
+ });
197
+
198
+ it('keeps asking for a later request that reuses a released approval key', () => {
199
+ // Approval keys are `tool_name:target`, so the same action repeats across turns: a release
200
+ // must resolve the request it answered, not every prompt that shares its key.
201
+ const firstRequest = makeApprovalRequestForToolUse('write-1');
202
+ const released = makeApprovalReleasedMessage('write-1', 3);
203
+ const laterRequest = { ...makeApprovalRequestForToolUse('write-2'), timestamp: 4 };
204
+
205
+ expect(getPendingRequestInputMessage([firstRequest, released, laterRequest])).toBe(laterRequest);
206
+ });
207
+
167
208
  it('reads a request id from response metadata', () => {
168
209
  expect(
169
210
  getRequestInputResponseIdFromMetadata({
@@ -242,6 +242,12 @@ export function getRequestInputResponseIdFromMetadata(metadata?: Record<string,
242
242
  return typeof requestId === 'string' && requestId ? requestId : undefined;
243
243
  }
244
244
 
245
+ /**
246
+ * Prefix marking a resolution that belongs to ONE request rather than to every prompt sharing an
247
+ * approval key. Approval keys are `tool_name:target`, so the same action repeats across turns.
248
+ */
249
+ const RESOLVED_REQUEST_ID_PREFIX = 'request:';
250
+
245
251
  export function getResolvedToolApprovalKeys(messages: AgentMessage[]): Set<string> {
246
252
  const resolved = new Set<string>();
247
253
 
@@ -251,6 +257,17 @@ export function getResolvedToolApprovalKeys(messages: AgentMessage[]): Set<strin
251
257
  const approvalKey = approvalRequest?.approval_key;
252
258
  const decision = details?.approval_decision;
253
259
 
260
+ // Released without a user answer (approval mode change, or the reviewer allowed it after the
261
+ // run switched to auto_review). Scoped to the released request: a later prompt for the same
262
+ // action still has to be answered, or the run would wait with nothing on screen.
263
+ if (decision === 'auto_approved') {
264
+ const requestId = details?.request_id;
265
+ if (typeof requestId === 'string' && requestId) {
266
+ resolved.add(`${RESOLVED_REQUEST_ID_PREFIX}${requestId}`);
267
+ }
268
+ continue;
269
+ }
270
+
254
271
  if (
255
272
  typeof approvalKey === 'string' &&
256
273
  (decision === 'denied' ||
@@ -321,6 +338,8 @@ export function isRequestInputResolvedByToolApprovalEvent(
321
338
  resolvedToolApprovalKeys: Set<string>,
322
339
  ): boolean {
323
340
  if (message.type !== AgentMessageType.REQUEST_INPUT) return false;
341
+ const requestId = getRequestInputId(message);
342
+ if (requestId && resolvedToolApprovalKeys.has(`${RESOLVED_REQUEST_ID_PREFIX}${requestId}`)) return true;
324
343
  const approvalKey = getToolApprovalKey(message);
325
344
  return approvalKey ? resolvedToolApprovalKeys.has(approvalKey) : false;
326
345
  }
@@ -140,6 +140,99 @@ describe('ModernAgentOutput utils - tool preamble behavior', () => {
140
140
  });
141
141
  });
142
142
 
143
+ describe('ModernAgentOutput summary - ask_user review content', () => {
144
+ const draft = '## Draft agenda\n9:00 Welcome\n9:15 Platform foundations';
145
+ const tool = makeMessage({
146
+ timestamp: 3000,
147
+ message: 'Waiting for your review...',
148
+ details: {
149
+ tool: 'ask_user',
150
+ tool_status: 'running',
151
+ tool_run_id: 'ask-1',
152
+ activity_group_id: 'review-1',
153
+ },
154
+ });
155
+ const question = makeMessage({
156
+ timestamp: 4000,
157
+ type: AgentMessageType.REQUEST_INPUT,
158
+ message: 'Does this agenda work?',
159
+ details: { tool: 'ask_user' },
160
+ });
161
+
162
+ it.each([false, true])('keeps persisted review prose visible with streamed=%s', (streamed) => {
163
+ const preamble = makeMessage({
164
+ timestamp: 2000,
165
+ message: draft,
166
+ details: {
167
+ event_class: 'activity',
168
+ display_role: 'tool_preamble',
169
+ tools: ['update_plan', 'ask_user'],
170
+ activity_group_id: 'review-1',
171
+ streamed,
172
+ },
173
+ });
174
+ const items = buildSummaryConversationItems([preamble, tool, question], false);
175
+
176
+ expect(items.map((item) => item.type)).toEqual(['message', 'work', 'message']);
177
+ expect(items[0]).toEqual({ type: 'message', message: preamble });
178
+ expect(items[2]).toEqual({ type: 'message', message: question });
179
+ });
180
+
181
+ it.each([
182
+ { tools: [{ name: 'ask_user' }] },
183
+ { tools: [{ tool: 'ask_user' }] },
184
+ { tool: 'ask_user' },
185
+ { tools: [null, 42, {}, 'search_documents', { name: 'ask_user' }] },
186
+ ])('keeps review prose visible for supported tool metadata: %j', (details) => {
187
+ const preamble = makeMessage({
188
+ timestamp: 2000,
189
+ message: draft,
190
+ // Exercise legacy wire shapes outside the current string[] contract.
191
+ details: { display_role: 'tool_preamble', ...details } as unknown as AgentMessage['details'],
192
+ });
193
+ expect(buildSummaryConversationItems([preamble, tool, question], false)[0]).toEqual({
194
+ type: 'message',
195
+ message: preamble,
196
+ });
197
+ });
198
+
199
+ it.each([
200
+ { display_role: 'tool_preamble', tools: [null, {}, { name: 'search_documents' }] },
201
+ { tool: 'ask_user', tool_status: 'running' },
202
+ { tool: 'think' },
203
+ ])('keeps non-review activity collapsed: %j', (details) => {
204
+ const activity = makeMessage({
205
+ message: 'Working on the draft',
206
+ details: details as unknown as AgentMessage['details'],
207
+ });
208
+ expect(buildSummaryConversationItems([activity, question], false)[0]).toMatchObject({
209
+ type: 'work',
210
+ messages: [activity],
211
+ });
212
+ });
213
+
214
+ it.each([false, true])('keeps reconstructed review streams visible with isComplete=%s', (isComplete) => {
215
+ const messages = buildSummaryDisplayMessages(
216
+ [tool, question],
217
+ new Map([
218
+ [
219
+ 'review-stream',
220
+ {
221
+ text: draft,
222
+ startTimestamp: 2000,
223
+ activityId: 'review-1',
224
+ isComplete,
225
+ },
226
+ ],
227
+ ]),
228
+ );
229
+ const items = buildSummaryConversationItems(messages, false);
230
+
231
+ expect(items.map((item) => item.type)).toEqual(['message', 'work', 'message']);
232
+ expect(items[0]).toMatchObject({ type: 'message', message: { message: draft } });
233
+ });
234
+ });
235
+
143
236
  describe('ModernAgentOutput utils - progress state', () => {
144
237
  it('treats a new user turn after an older idle message as in progress', () => {
145
238
  const idle = makeMessage({
@@ -284,7 +284,7 @@ export function SlidingThinkingIndicator({
284
284
  size="xs"
285
285
  variant="ghost"
286
286
  onClick={() => setShowDetails(!showDetails)}
287
- className="text-slate-500 hover:text-slate-700 flex items-center gap-1 text-xs"
287
+ className="text-muted hover:text-foreground flex items-center gap-1 text-xs"
288
288
  title={showDetails ? t('agent.hideThinkingDetails') : t('agent.showAllMessages')}
289
289
  >
290
290
  {showDetails ? (
@@ -356,10 +356,13 @@ export function SlidingThinkingIndicator({
356
356
  ) : (
357
357
  <div
358
358
  className={cn(
359
- 'py-2 px-3 border-s-2 bg-white dark:bg-slate-800 flex items-center w-full',
359
+ 'py-2 px-3 border-s-2 bg-white dark:bg-muted flex items-center w-full',
360
360
  'transition-all duration-200 ease-in-out rounded-e-md',
361
361
  // Set border color based on message type
362
362
  {
363
+ // Categorical message-type palette, not semantic state:
364
+ // these must stay in step with <PulsingMessageLoader color>
365
+ // in AnimatedThinkingDots, which uses the same hue names.
363
366
  'border-blue-400 dark:border-blue-500':
364
367
  getThinkingColor(message) === 'blue',
365
368
  'border-purple-400 dark:border-purple-500':
@@ -3,7 +3,6 @@ import { Button } from '@vertesia/ui/core';
3
3
  import { useUITranslation } from '@vertesia/ui/i18n';
4
4
  import { useUserSession } from '@vertesia/ui/session';
5
5
  import { Check, Copy, Download, Loader2, Maximize2, Minimize2, X } from 'lucide-react';
6
- import Papa from 'papaparse';
7
6
  import { lazy, memo, Suspense, useCallback, useEffect, useMemo, useRef, useState } from 'react';
8
7
  import type { View } from 'vega';
9
8
  import type { TopLevelSpec as VisualizationSpec } from 'vega-lite';
@@ -717,7 +716,12 @@ export const VegaLiteChart = memo(
717
716
  let data: unknown[];
718
717
 
719
718
  if (isCsv) {
720
- // Parse CSV to JSON array
719
+ // Parse CSV to JSON array. papaparse is imported here rather than at
720
+ // module scope: it is only ever needed for a chart whose data comes from
721
+ // a .csv artifact, and a static import put it in the widgets bundle's
722
+ // graph (this module is reachable from widgets/markdown), so every
723
+ // application paid for it on first render.
724
+ const { default: Papa } = await import('papaparse');
721
725
  const csvText = await response.text();
722
726
  const parseResult = Papa.parse(csvText, {
723
727
  header: true,
@@ -0,0 +1,33 @@
1
+ import { act, renderHook } from '@testing-library/react';
2
+ import { type AgentMessage, AgentMessageType } from '@vertesia/common';
3
+ import { describe, expect, it } from 'vitest';
4
+ import { useDocumentPanel } from './useDocumentPanel';
5
+
6
+ function documentCreated(documentId: string, title: string): AgentMessage {
7
+ return {
8
+ type: AgentMessageType.UPDATE,
9
+ message: '',
10
+ timestamp: Date.now(),
11
+ details: { event_class: 'document_created', document_id: documentId, title },
12
+ } as unknown as AgentMessage;
13
+ }
14
+
15
+ describe('useDocumentPanel', () => {
16
+ it('opens the newest document reported by the agent', () => {
17
+ const messages = [documentCreated('doc-1', 'Brief'), documentCreated('doc-2', 'Summary')];
18
+ const { result } = renderHook(() => useDocumentPanel(messages));
19
+
20
+ expect(result.current.openDocuments.map((doc) => doc.id)).toEqual(['doc-1', 'doc-2']);
21
+ expect(result.current.activeDocumentId).toBe('doc-2');
22
+ expect(result.current.isDocPanelOpen).toBe(true);
23
+ });
24
+
25
+ it('selects null to go back to the list while keeping the documents open', () => {
26
+ const { result } = renderHook(() => useDocumentPanel([documentCreated('doc-1', 'Brief')]));
27
+
28
+ act(() => result.current.selectDocument(null));
29
+
30
+ expect(result.current.activeDocumentId).toBeNull();
31
+ expect(result.current.openDocuments).toHaveLength(1);
32
+ });
33
+ });
@@ -8,8 +8,8 @@ export interface UseDocumentPanelResult {
8
8
  isDocPanelOpen: boolean;
9
9
  docRefreshKey: number;
10
10
  closeDocPanel: () => void;
11
- closeDocument: (docId: string) => void;
12
- selectDocument: (docId: string) => void;
11
+ /** Select a document to display, or `null` to go back to the document list. */
12
+ selectDocument: (docId: string | null) => void;
13
13
  openDocInPanel: (docId: string) => void;
14
14
  updateDocumentTitle: (docId: string, title: string) => void;
15
15
  }
@@ -137,23 +137,7 @@ export function useDocumentPanel(messages: AgentMessage[]): UseDocumentPanelResu
137
137
  setIsDocPanelOpen(false);
138
138
  }, []);
139
139
 
140
- const closeDocument = useCallback((docId: string) => {
141
- setOpenDocuments((prev) => {
142
- const next = prev.filter((d) => d.id !== docId);
143
- if (next.length === 0) {
144
- setIsDocPanelOpen(false);
145
- setActiveDocumentId(null);
146
- } else {
147
- setActiveDocumentId((current) => {
148
- if (current === docId) return next[0].id;
149
- return current;
150
- });
151
- }
152
- return next;
153
- });
154
- }, []);
155
-
156
- const selectDocument = useCallback((docId: string) => {
140
+ const selectDocument = useCallback((docId: string | null) => {
157
141
  setActiveDocumentId(docId);
158
142
  }, []);
159
143
 
@@ -176,7 +160,6 @@ export function useDocumentPanel(messages: AgentMessage[]): UseDocumentPanelResu
176
160
  isDocPanelOpen,
177
161
  docRefreshKey,
178
162
  closeDocPanel,
179
- closeDocument,
180
163
  selectDocument,
181
164
  openDocInPanel,
182
165
  updateDocumentTitle,
@@ -17,7 +17,7 @@ function RowErrorFallback({ error }: ErrorFallbackComponentProps) {
17
17
  <td colSpan={100}>
18
18
  <span className="text-xs"> Cannot display row</span>
19
19
  <br />
20
- <span className="bg-gray-400">{message}</span>
20
+ <span className="bg-muted">{message}</span>
21
21
  </td>
22
22
  </tr>
23
23
  );
@@ -193,7 +193,7 @@ export function AgentRunnerFacetsNav({
193
193
  <div className="flex justify-end">
194
194
  {!selectionCount && (
195
195
  <div className="flex items-center justify-between px-2 py-1">
196
- <div className="text-sm text-muted-foreground">
196
+ <div className="text-sm text-muted">
197
197
  {search.initialized ? `${search.totalCount} runs` : 'Loading runs...'}
198
198
  </div>
199
199
  </div>
@@ -1,11 +1,13 @@
1
- import { type FacetBucket, InteractionStatus } from '@vertesia/common';
1
+ import type { FacetBucket } from '@vertesia/common';
2
2
  import { Badge, type FilterGroup } from '@vertesia/ui/core';
3
+ import {
4
+ type InteractionDisplayRef,
5
+ InteractionStatusBadge,
6
+ resolveInteractionName,
7
+ splitInteractionType,
8
+ } from '../../utils/interaction.js';
3
9
 
4
- export interface EnrichedFacetBucket extends FacetBucket {
5
- name?: string;
6
- status?: string;
7
- version?: number;
8
- }
10
+ export interface EnrichedFacetBucket extends FacetBucket, InteractionDisplayRef {}
9
11
 
10
12
  interface InteractionFacetProps {
11
13
  buckets: EnrichedFacetBucket[];
@@ -13,6 +15,11 @@ interface InteractionFacetProps {
13
15
  placeholder?: string;
14
16
  }
15
17
 
18
+ /** The name this facet displays for a bucket — the same one the runs table shows for the run. */
19
+ function bucketName(bucket: EnrichedFacetBucket | undefined, interactionId: string): string {
20
+ return resolveInteractionName(bucket, interactionId) ?? interactionId;
21
+ }
22
+
16
23
  export function VInteractionFacet({ buckets, name, placeholder }: InteractionFacetProps): FilterGroup {
17
24
  const options = buckets.map((bucket) => ({
18
25
  label: `(${bucket.count})`,
@@ -26,38 +33,20 @@ export function VInteractionFacet({ buckets, name, placeholder }: InteractionFac
26
33
  type: 'select',
27
34
  labelRenderer: (interactionId: string) => {
28
35
  const bucket = buckets.find((b) => b._id === interactionId);
29
- const displayName = bucket?.name || interactionId;
30
-
31
- // Determine badge variant based on status
32
- let badgeVariant: 'success' | 'info' | 'destructive' | 'default' = 'success';
33
- if (bucket?.status) {
34
- switch (bucket.status) {
35
- case InteractionStatus.published:
36
- badgeVariant = 'success';
37
- break;
38
- case InteractionStatus.archived:
39
- badgeVariant = 'destructive';
40
- break;
41
- case InteractionStatus.code:
42
- badgeVariant = 'info';
43
- break;
44
- }
45
- }
46
-
47
- const badgeText =
48
- bucket?.version && bucket?.status
49
- ? `v${bucket.version} ${bucket.status !== InteractionStatus.unknown ? bucket.status : ''}`
50
- : bucket?.status || (bucket?.version ? `v${bucket.version}` : '');
36
+ // Same split as the runs table: the `sys`/`app`/`tmp` namespace becomes its own badge
37
+ // instead of staying glued to the name.
38
+ const { type, label } = splitInteractionType(bucketName(bucket, interactionId));
51
39
 
52
40
  return (
53
41
  <div className="w-full flex items-center justify-between">
54
42
  <div className="flex flex-row flex-wrap items-center gap-2 min-w-0 flex-1">
55
- <span className="text-sm truncate">{displayName}</span>
56
- {badgeText && (
57
- <Badge variant={badgeVariant} className="text-xs w-fit">
58
- {badgeText}
43
+ <span className="text-sm truncate">{label}</span>
44
+ {type && (
45
+ <Badge variant="secondary" className="text-xs w-fit">
46
+ {type}
59
47
  </Badge>
60
48
  )}
49
+ {bucket && <InteractionStatusBadge interaction={bucket} className="text-xs w-fit" />}
61
50
  </div>
62
51
  {(bucket?.count ?? 0) > 0 && <span className="ms-2 text-xs shrink-0">({bucket?.count})</span>}
63
52
  </div>
@@ -65,8 +54,7 @@ export function VInteractionFacet({ buckets, name, placeholder }: InteractionFac
65
54
  },
66
55
  filterBy: (optionValue: string, searchText: string) => {
67
56
  const bucket = buckets.find((b) => b._id === optionValue);
68
- const searchName = bucket?.name || optionValue;
69
- return searchName.toLowerCase().includes(searchText.toLowerCase());
57
+ return bucketName(bucket, optionValue).toLowerCase().includes(searchText.toLowerCase());
70
58
  },
71
59
  };
72
60
 
@@ -36,7 +36,7 @@ export function createUserFilterGroup({ buckets, name, placeholder }: UserFacetP
36
36
  <div className="flex-1 min-w-0 flex items-center truncate">
37
37
  <UserInfo userRef={userRef} showTitle={true} size="sm" />
38
38
  </div>
39
- <span className="text-muted-foreground flex-shrink-0">({bucket?.count || 0})</span>
39
+ <span className="text-muted flex-shrink-0">({bucket?.count || 0})</span>
40
40
  </div>
41
41
  );
42
42
  },
@@ -148,6 +148,9 @@ export function GenericPageNavHeader({
148
148
  };
149
149
 
150
150
  const breadcrumbItems = buildBreadcrumbItems();
151
+ // The description tooltip trails the last element of the header: the breadcrumbs when there
152
+ // are any, otherwise the title.
153
+ const showDescriptionWithTitle = !!title && breadcrumbItems.length === 0;
151
154
 
152
155
  return (
153
156
  <div className={clsx('pb-0 ps-4 pe-2 py-2 flex flex-col', className)}>
@@ -161,7 +164,7 @@ export function GenericPageNavHeader({
161
164
  maxItems={4}
162
165
  />
163
166
  )}
164
- {description && (
167
+ {description && !showDescriptionWithTitle && (
165
168
  <VTooltip description={description}>
166
169
  <Info className="size-4 text-muted ms-4" />
167
170
  </VTooltip>
@@ -170,6 +173,11 @@ export function GenericPageNavHeader({
170
173
  {title && (
171
174
  <div className="flex gap-2 items-center">
172
175
  <h1 className="text-xl font-semibold break-all">{title}</h1>
176
+ {description && showDescriptionWithTitle && (
177
+ <VTooltip description={description}>
178
+ <Info className="size-4 text-muted" />
179
+ </VTooltip>
180
+ )}
173
181
  </div>
174
182
  )}
175
183
  </div>
@@ -4,7 +4,7 @@ export function NotFoundView() {
4
4
  const { t } = useUITranslation();
5
5
  return (
6
6
  <div className="text-center pt-32">
7
- <h1 className="text-3xl font-bold text-red-500">404</h1>
7
+ <h1 className="text-3xl font-bold text-destructive">404</h1>
8
8
  <p className="text-2xl">{t('layout.pageNotFound')}</p>
9
9
  </div>
10
10
  );