@vertesia/ui 1.5.0-dev.20260905.011013Z → 1.5.0-dev.20260910.052912Z

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 (508) 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/AskUserWidget.d.ts.map +1 -1
  61. package/lib/features/agent/chat/AskUserWidget.js +13 -13
  62. package/lib/features/agent/chat/AskUserWidget.js.map +1 -1
  63. package/lib/features/agent/chat/JumpingDots.js +1 -1
  64. package/lib/features/agent/chat/JumpingDots.js.map +1 -1
  65. package/lib/features/agent/chat/ModernAgentConversation.js +1 -1
  66. package/lib/features/agent/chat/ModernAgentConversation.js.map +1 -1
  67. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts.map +1 -1
  68. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js +22 -9
  69. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -1
  70. package/lib/features/agent/chat/ModernAgentOutput/BatchProgressPanel.js +5 -5
  71. package/lib/features/agent/chat/ModernAgentOutput/BatchProgressPanel.js.map +1 -1
  72. package/lib/features/agent/chat/ModernAgentOutput/Header.js +1 -1
  73. package/lib/features/agent/chat/ModernAgentOutput/Header.js.map +1 -1
  74. package/lib/features/agent/chat/ModernAgentOutput/InlineSlideInPanel.js +1 -1
  75. package/lib/features/agent/chat/ModernAgentOutput/InlineSlideInPanel.js.map +1 -1
  76. package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js +1 -1
  77. package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js.map +1 -1
  78. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.d.ts.map +1 -1
  79. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js +7 -7
  80. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js.map +1 -1
  81. package/lib/features/agent/chat/ModernAgentOutput/MessagesContainer.js +1 -1
  82. package/lib/features/agent/chat/ModernAgentOutput/MessagesContainer.js.map +1 -1
  83. package/lib/features/agent/chat/ModernAgentOutput/PlanPanel.d.ts.map +1 -1
  84. package/lib/features/agent/chat/ModernAgentOutput/PlanPanel.js +10 -10
  85. package/lib/features/agent/chat/ModernAgentOutput/PlanPanel.js.map +1 -1
  86. package/lib/features/agent/chat/ModernAgentOutput/SlideInPanel.js +1 -1
  87. package/lib/features/agent/chat/ModernAgentOutput/SlideInPanel.js.map +1 -1
  88. package/lib/features/agent/chat/ModernAgentOutput/SlidingMessages.d.ts.map +1 -1
  89. package/lib/features/agent/chat/ModernAgentOutput/SlidingMessages.js +1 -1
  90. package/lib/features/agent/chat/ModernAgentOutput/SlidingMessages.js.map +1 -1
  91. package/lib/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.js +17 -17
  92. package/lib/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.js.map +1 -1
  93. package/lib/features/agent/chat/ModernAgentOutput/StreamingMessage.js +1 -1
  94. package/lib/features/agent/chat/ModernAgentOutput/StreamingMessage.js.map +1 -1
  95. package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.d.ts.map +1 -1
  96. package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.js +14 -2
  97. package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.js.map +1 -1
  98. package/lib/features/agent/chat/ModernAgentOutput/ToolCallGroup.d.ts.map +1 -1
  99. package/lib/features/agent/chat/ModernAgentOutput/ToolCallGroup.js +15 -15
  100. package/lib/features/agent/chat/ModernAgentOutput/ToolCallGroup.js.map +1 -1
  101. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.d.ts.map +1 -1
  102. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.js +18 -0
  103. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.js.map +1 -1
  104. package/lib/features/agent/chat/SlidingThinkingIndicator.d.ts.map +1 -1
  105. package/lib/features/agent/chat/SlidingThinkingIndicator.js +5 -2
  106. package/lib/features/agent/chat/SlidingThinkingIndicator.js.map +1 -1
  107. package/lib/features/agent/chat/VegaLiteChart.d.ts.map +1 -1
  108. package/lib/features/agent/chat/VegaLiteChart.js +6 -2
  109. package/lib/features/agent/chat/VegaLiteChart.js.map +1 -1
  110. package/lib/features/errors/RowErrorBoundary.js +1 -1
  111. package/lib/features/errors/RowErrorBoundary.js.map +1 -1
  112. package/lib/features/facets/AgentRunnerFacetsNav.js +1 -1
  113. package/lib/features/facets/AgentRunnerFacetsNav.js.map +1 -1
  114. package/lib/features/facets/utils/VInteractionFacet.d.ts +3 -5
  115. package/lib/features/facets/utils/VInteractionFacet.d.ts.map +1 -1
  116. package/lib/features/facets/utils/VInteractionFacet.js +10 -23
  117. package/lib/features/facets/utils/VInteractionFacet.js.map +1 -1
  118. package/lib/features/facets/utils/VUserFacet.js +1 -1
  119. package/lib/features/facets/utils/VUserFacet.js.map +1 -1
  120. package/lib/features/layout/GenericPageNavHeader.d.ts.map +1 -1
  121. package/lib/features/layout/GenericPageNavHeader.js +4 -1
  122. package/lib/features/layout/GenericPageNavHeader.js.map +1 -1
  123. package/lib/features/layout/NotFoundView.js +1 -1
  124. package/lib/features/layout/NotFoundView.js.map +1 -1
  125. package/lib/features/magic-pdf/AnnotatedImageSlider.js +4 -12
  126. package/lib/features/magic-pdf/AnnotatedImageSlider.js.map +1 -1
  127. package/lib/features/magic-pdf/ExtractedContentView.js +4 -4
  128. package/lib/features/magic-pdf/ExtractedContentView.js.map +1 -1
  129. package/lib/features/magic-pdf/MagicPdfView.js +1 -1
  130. package/lib/features/magic-pdf/MagicPdfView.js.map +1 -1
  131. package/lib/features/pdf-viewer/PdfPageRenderer.js +2 -2
  132. package/lib/features/pdf-viewer/PdfPageRenderer.js.map +1 -1
  133. package/lib/features/pdf-viewer/PdfPageSlider.js +3 -3
  134. package/lib/features/pdf-viewer/PdfPageSlider.js.map +1 -1
  135. package/lib/features/pdf-viewer/SimplePdfViewer.js +1 -1
  136. package/lib/features/pdf-viewer/SimplePdfViewer.js.map +1 -1
  137. package/lib/features/permissions/UserPermissionsProvider.d.ts +2 -1
  138. package/lib/features/permissions/UserPermissionsProvider.d.ts.map +1 -1
  139. package/lib/features/permissions/UserPermissionsProvider.js +35 -22
  140. package/lib/features/permissions/UserPermissionsProvider.js.map +1 -1
  141. package/lib/features/permissions/useRoleMappings.d.ts +19 -0
  142. package/lib/features/permissions/useRoleMappings.d.ts.map +1 -0
  143. package/lib/features/permissions/useRoleMappings.js +87 -0
  144. package/lib/features/permissions/useRoleMappings.js.map +1 -0
  145. package/lib/features/store/collections/SelectCollection.js +1 -1
  146. package/lib/features/store/collections/SelectCollection.js.map +1 -1
  147. package/lib/features/store/objects/DocumentPreviewPanel.d.ts.map +1 -1
  148. package/lib/features/store/objects/DocumentPreviewPanel.js +9 -9
  149. package/lib/features/store/objects/DocumentPreviewPanel.js.map +1 -1
  150. package/lib/features/store/objects/DocumentTable.js +1 -1
  151. package/lib/features/store/objects/DocumentTable.js.map +1 -1
  152. package/lib/features/store/objects/components/DocumentIcon.js +2 -2
  153. package/lib/features/store/objects/components/DocumentIcon.js.map +1 -1
  154. package/lib/features/store/objects/components/DocumentInput.js +1 -1
  155. package/lib/features/store/objects/components/DocumentInput.js.map +1 -1
  156. package/lib/features/store/objects/components/PropertiesEditorModal.js +1 -1
  157. package/lib/features/store/objects/components/PropertiesEditorModal.js.map +1 -1
  158. package/lib/features/store/objects/components/SaveVersionConfirmModal.js +1 -1
  159. package/lib/features/store/objects/components/SaveVersionConfirmModal.js.map +1 -1
  160. package/lib/features/store/objects/layout/documentLayout.d.ts.map +1 -1
  161. package/lib/features/store/objects/layout/documentLayout.js +2 -2
  162. package/lib/features/store/objects/layout/documentLayout.js.map +1 -1
  163. package/lib/features/store/objects/selection/SelectionActions.js +1 -1
  164. package/lib/features/store/objects/selection/SelectionActions.js.map +1 -1
  165. package/lib/features/store/types/IntakePolicyEditor.d.ts +10 -1
  166. package/lib/features/store/types/IntakePolicyEditor.d.ts.map +1 -1
  167. package/lib/features/store/types/IntakePolicyEditor.js +29 -19
  168. package/lib/features/store/types/IntakePolicyEditor.js.map +1 -1
  169. package/lib/features/store/types/IntakePolicyForm.d.ts +1 -1
  170. package/lib/features/store/types/IntakePolicyForm.d.ts.map +1 -1
  171. package/lib/features/store/types/IntakePolicyForm.js +5 -3
  172. package/lib/features/store/types/IntakePolicyForm.js.map +1 -1
  173. package/lib/features/store/types/SelectContentTypeModal.js +1 -1
  174. package/lib/features/store/types/SelectContentTypeModal.js.map +1 -1
  175. package/lib/features/user/UserAvatar.js +2 -2
  176. package/lib/features/user/UserAvatar.js.map +1 -1
  177. package/lib/features/user/UserInfo.d.ts.map +1 -1
  178. package/lib/features/user/UserInfo.js +7 -7
  179. package/lib/features/user/UserInfo.js.map +1 -1
  180. package/lib/features/utils/index.d.ts +1 -0
  181. package/lib/features/utils/index.d.ts.map +1 -1
  182. package/lib/features/utils/index.js +1 -0
  183. package/lib/features/utils/index.js.map +1 -1
  184. package/lib/features/utils/interaction.d.ts +55 -0
  185. package/lib/features/utils/interaction.d.ts.map +1 -0
  186. package/lib/features/utils/interaction.js +77 -0
  187. package/lib/features/utils/interaction.js.map +1 -0
  188. package/lib/features/views/ViewResults.js +2 -2
  189. package/lib/features/views/ViewResults.js.map +1 -1
  190. package/lib/i18n/locales/ar.json +7 -1
  191. package/lib/i18n/locales/de.json +7 -1
  192. package/lib/i18n/locales/en.json +7 -1
  193. package/lib/i18n/locales/es.json +7 -1
  194. package/lib/i18n/locales/fr.json +7 -1
  195. package/lib/i18n/locales/it.json +7 -1
  196. package/lib/i18n/locales/ja.json +7 -1
  197. package/lib/i18n/locales/ko.json +7 -1
  198. package/lib/i18n/locales/pt.json +7 -1
  199. package/lib/i18n/locales/ru.json +7 -1
  200. package/lib/i18n/locales/tr.json +7 -1
  201. package/lib/i18n/locales/zh-TW.json +7 -1
  202. package/lib/i18n/locales/zh.json +7 -1
  203. package/lib/layout/FullHeightLayout.js +2 -2
  204. package/lib/layout/FullHeightLayout.js.map +1 -1
  205. package/lib/layout/Navbar.js +4 -4
  206. package/lib/layout/Navbar.js.map +1 -1
  207. package/lib/layout/Sidebar.js +1 -1
  208. package/lib/layout/Sidebar.js.map +1 -1
  209. package/lib/session/UserSessionProvider.d.ts.map +1 -1
  210. package/lib/session/UserSessionProvider.js +2 -13
  211. package/lib/session/UserSessionProvider.js.map +1 -1
  212. package/lib/session/auth/authState.d.ts +13 -0
  213. package/lib/session/auth/authState.d.ts.map +1 -0
  214. package/lib/session/auth/authState.js +37 -0
  215. package/lib/session/auth/authState.js.map +1 -0
  216. package/lib/session/auth/domainRouting.d.ts +39 -0
  217. package/lib/session/auth/domainRouting.d.ts.map +1 -1
  218. package/lib/session/auth/domainRouting.js +85 -0
  219. package/lib/session/auth/domainRouting.js.map +1 -1
  220. package/lib/session/auth/useAuthState.d.ts +4 -7
  221. package/lib/session/auth/useAuthState.d.ts.map +1 -1
  222. package/lib/session/auth/useAuthState.js +5 -41
  223. package/lib/session/auth/useAuthState.js.map +1 -1
  224. package/lib/session/index.d.ts +1 -0
  225. package/lib/session/index.d.ts.map +1 -1
  226. package/lib/session/index.js +2 -0
  227. package/lib/session/index.js.map +1 -1
  228. package/lib/shell/SplashScreen.d.ts +1 -1
  229. package/lib/shell/SplashScreen.d.ts.map +1 -1
  230. package/lib/shell/SplashScreen.js +6 -2
  231. package/lib/shell/SplashScreen.js.map +1 -1
  232. package/lib/shell/VertesiaShell.js +1 -1
  233. package/lib/shell/VertesiaShell.js.map +1 -1
  234. package/lib/shell/apps/AppProjectSelector.js +1 -1
  235. package/lib/shell/apps/AppProjectSelector.js.map +1 -1
  236. package/lib/shell/apps/StandaloneApp.js +2 -2
  237. package/lib/shell/apps/StandaloneApp.js.map +1 -1
  238. package/lib/shell/login/SignInPrimitives.js +2 -2
  239. package/lib/shell/login/SignInPrimitives.js.map +1 -1
  240. package/lib/shell/login/SigninScreen.js +1 -1
  241. package/lib/shell/login/SigninScreen.js.map +1 -1
  242. package/lib/shell/login/SignupForm.js +1 -1
  243. package/lib/shell/login/SignupForm.js.map +1 -1
  244. package/lib/shell/login/TerminalLogin.js +2 -2
  245. package/lib/shell/login/TerminalLogin.js.map +1 -1
  246. package/lib/shell/login/UserInfo.d.ts.map +1 -1
  247. package/lib/shell/login/UserInfo.js +1 -1
  248. package/lib/shell/login/UserInfo.js.map +1 -1
  249. package/lib/shell/login/UserSessionMenu.js +1 -1
  250. package/lib/shell/login/UserSessionMenu.js.map +1 -1
  251. package/lib/vertesia-ui-core.js +7 -7
  252. package/lib/vertesia-ui-core.js.map +1 -1
  253. package/lib/vertesia-ui-features.js +179 -182
  254. package/lib/vertesia-ui-features.js.map +1 -1
  255. package/lib/vertesia-ui-i18n.BfN7iOHb.chunk.js +5 -0
  256. package/lib/vertesia-ui-i18n.BfN7iOHb.chunk.js.map +1 -0
  257. package/lib/vertesia-ui-i18n.BjH2zEZw.chunk.js +5 -0
  258. package/lib/vertesia-ui-i18n.BjH2zEZw.chunk.js.map +1 -0
  259. package/lib/vertesia-ui-i18n.BjSwAZXl.chunk.js +5 -0
  260. package/lib/vertesia-ui-i18n.BjSwAZXl.chunk.js.map +1 -0
  261. package/lib/vertesia-ui-i18n.C7PUm5Au.chunk.js +5 -0
  262. package/lib/vertesia-ui-i18n.C7PUm5Au.chunk.js.map +1 -0
  263. package/lib/vertesia-ui-i18n.CF_1mUS5.chunk.js +5 -0
  264. package/lib/vertesia-ui-i18n.CF_1mUS5.chunk.js.map +1 -0
  265. package/lib/vertesia-ui-i18n.ChfUl3_-.chunk.js +5 -0
  266. package/lib/vertesia-ui-i18n.ChfUl3_-.chunk.js.map +1 -0
  267. package/lib/vertesia-ui-i18n.D-Sk-5d1.chunk.js +5 -0
  268. package/lib/vertesia-ui-i18n.D-Sk-5d1.chunk.js.map +1 -0
  269. package/lib/vertesia-ui-i18n.D4rnu1_S.chunk.js +5 -0
  270. package/lib/vertesia-ui-i18n.D4rnu1_S.chunk.js.map +1 -0
  271. package/lib/vertesia-ui-i18n.DDf0-laK.chunk.js +5 -0
  272. package/lib/vertesia-ui-i18n.DDf0-laK.chunk.js.map +1 -0
  273. package/lib/vertesia-ui-i18n.DN79y06J.chunk.js +5 -0
  274. package/lib/vertesia-ui-i18n.DN79y06J.chunk.js.map +1 -0
  275. package/lib/vertesia-ui-i18n.DWLIciYQ.chunk.js +5 -0
  276. package/lib/vertesia-ui-i18n.DWLIciYQ.chunk.js.map +1 -0
  277. package/lib/vertesia-ui-i18n.DvF_YaAJ.chunk.js +5 -0
  278. package/lib/vertesia-ui-i18n.DvF_YaAJ.chunk.js.map +1 -0
  279. package/lib/vertesia-ui-i18n.js +2 -2
  280. package/lib/vertesia-ui-layout.js +1 -1
  281. package/lib/vertesia-ui-layout.js.map +1 -1
  282. package/lib/vertesia-ui-rich-text.js +24 -24
  283. package/lib/vertesia-ui-rich-text.js.map +1 -1
  284. package/lib/vertesia-ui-session.js +1 -1
  285. package/lib/vertesia-ui-session.js.map +1 -1
  286. package/lib/vertesia-ui-shell.js +3 -3
  287. package/lib/vertesia-ui-shell.js.map +1 -1
  288. package/lib/vertesia-ui-widgets.js +54 -54
  289. package/lib/vertesia-ui-widgets.js.map +1 -1
  290. package/lib/widgets/Progress.js +1 -1
  291. package/lib/widgets/Progress.js.map +1 -1
  292. package/lib/widgets/form/Form.js +2 -2
  293. package/lib/widgets/form/Form.js.map +1 -1
  294. package/lib/widgets/form/fields.js +2 -2
  295. package/lib/widgets/form/fields.js.map +1 -1
  296. package/lib/widgets/json-view/JSONView.js +1 -1
  297. package/lib/widgets/json-view/JSONView.js.map +1 -1
  298. package/lib/widgets/markdown/MermaidDiagram.js +1 -1
  299. package/lib/widgets/markdown/MermaidDiagram.js.map +1 -1
  300. package/lib/widgets/markdown/remarkDirectiveHandler.d.ts +7 -2
  301. package/lib/widgets/markdown/remarkDirectiveHandler.d.ts.map +1 -1
  302. package/lib/widgets/markdown/remarkDirectiveHandler.js +19 -4
  303. package/lib/widgets/markdown/remarkDirectiveHandler.js.map +1 -1
  304. package/lib/widgets/monacoEditor/MonacoEditor.d.ts.map +1 -1
  305. package/lib/widgets/monacoEditor/MonacoEditor.js +4 -2
  306. package/lib/widgets/monacoEditor/MonacoEditor.js.map +1 -1
  307. package/lib/widgets/monacoEditor/index.d.ts +1 -0
  308. package/lib/widgets/monacoEditor/index.d.ts.map +1 -1
  309. package/lib/widgets/monacoEditor/index.js +1 -0
  310. package/lib/widgets/monacoEditor/index.js.map +1 -1
  311. package/lib/widgets/monacoEditor/loadMonaco.d.ts +45 -0
  312. package/lib/widgets/monacoEditor/loadMonaco.d.ts.map +1 -0
  313. package/lib/widgets/monacoEditor/loadMonaco.js +62 -0
  314. package/lib/widgets/monacoEditor/loadMonaco.js.map +1 -0
  315. package/lib/widgets/properties/PropertiesView.js +1 -1
  316. package/lib/widgets/properties/PropertiesView.js.map +1 -1
  317. package/lib/widgets/schema-editor/editor/Editable.js +2 -2
  318. package/lib/widgets/schema-editor/editor/Editable.js.map +1 -1
  319. package/lib/widgets/schema-editor/editor/PropertyEditor.js +1 -1
  320. package/lib/widgets/schema-editor/editor/PropertyEditor.js.map +1 -1
  321. package/lib/widgets/schema-editor/editor/SchemaEditor.js +2 -2
  322. package/lib/widgets/schema-editor/editor/SchemaEditor.js.map +1 -1
  323. package/lib/widgets/upload/DropZone.js +1 -1
  324. package/lib/widgets/upload/DropZone.js.map +1 -1
  325. package/lib/widgets/upload/UploadResultCategory.d.ts +1 -1
  326. package/lib/widgets/upload/UploadResultCategory.d.ts.map +1 -1
  327. package/lib/widgets/upload/UploadResultCategory.js +3 -3
  328. package/lib/widgets/upload/UploadResultCategory.js.map +1 -1
  329. package/lib/widgets/upload/UploadSummary.js +1 -1
  330. package/lib/widgets/upload/UploadSummary.js.map +1 -1
  331. package/lib/widgets/xml-viewer/components/XMLViewer.d.ts.map +1 -1
  332. package/lib/widgets/xml-viewer/components/XMLViewer.js +7 -3
  333. package/lib/widgets/xml-viewer/components/XMLViewer.js.map +1 -1
  334. package/lib/widgets/xml-viewer/hooks/useCollapsible.d.ts +1 -1
  335. package/lib/widgets/xml-viewer/hooks/useXMLViewer.d.ts +11 -13
  336. package/lib/widgets/xml-viewer/hooks/useXMLViewer.d.ts.map +1 -1
  337. package/lib/widgets/xml-viewer/hooks/useXMLViewer.js +41 -14
  338. package/lib/widgets/xml-viewer/hooks/useXMLViewer.js.map +1 -1
  339. package/package.json +7 -7
  340. package/src/__tests__/contrast.test.ts +1 -0
  341. package/src/core/components/Avatar.tsx +3 -3
  342. package/src/core/components/ComboBox.tsx +1 -1
  343. package/src/core/components/FileUpload.tsx +4 -4
  344. package/src/core/components/Link.tsx +1 -1
  345. package/src/core/components/SelectList.tsx +1 -1
  346. package/src/core/components/SidePanel.tsx +1 -1
  347. package/src/core/components/Spinner.tsx +1 -1
  348. package/src/core/components/TagsInput.tsx +8 -8
  349. package/src/core/components/shadcn/MessageBox.tsx +1 -1
  350. package/src/core/components/shadcn/button.tsx +1 -1
  351. package/src/core/components/shadcn/card.tsx +1 -3
  352. package/src/core/components/shadcn/command.tsx +5 -5
  353. package/src/core/components/shadcn/filters/DynamicLabel.tsx +1 -1
  354. package/src/core/components/shadcn/filters/comboBox/DateCombobox.tsx +3 -3
  355. package/src/core/components/shadcn/input.tsx +3 -3
  356. package/src/core/components/shadcn/modal/ConfirmModal.tsx +3 -3
  357. package/src/core/components/shadcn/modal/dialog.tsx +2 -4
  358. package/src/core/components/shadcn/overflowTabs.tsx +2 -2
  359. package/src/core/components/shadcn/popover.tsx +1 -1
  360. package/src/core/components/shadcn/radioGroup.tsx +5 -7
  361. package/src/core/components/shadcn/selectBox.tsx +1 -1
  362. package/src/core/components/shadcn/tabs.tsx +4 -2
  363. package/src/core/components/styles.ts +1 -1
  364. package/src/core/components/table/index.tsx +1 -1
  365. package/src/core/hooks/useFetch.test.ts +20 -0
  366. package/src/core/hooks/useFetch.ts +2 -0
  367. package/src/css/base.css +1 -1
  368. package/src/css/color.css +4 -0
  369. package/src/css/theme.css +1 -0
  370. package/src/css/typography.css +2 -2
  371. package/src/features/activity-doc/ActivityDoc.tsx +11 -11
  372. package/src/features/agent/chat/AgentChart.tsx +1 -1
  373. package/src/features/agent/chat/AskUserWidget.tsx +19 -23
  374. package/src/features/agent/chat/JumpingDots.tsx +3 -3
  375. package/src/features/agent/chat/ModernAgentConversation.tsx +3 -3
  376. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.test.tsx +60 -1
  377. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +44 -24
  378. package/src/features/agent/chat/ModernAgentOutput/BatchProgressPanel.tsx +12 -12
  379. package/src/features/agent/chat/ModernAgentOutput/Header.tsx +1 -1
  380. package/src/features/agent/chat/ModernAgentOutput/InlineSlideInPanel.tsx +4 -4
  381. package/src/features/agent/chat/ModernAgentOutput/MessageInput.tsx +2 -2
  382. package/src/features/agent/chat/ModernAgentOutput/MessageItem.tsx +7 -12
  383. package/src/features/agent/chat/ModernAgentOutput/MessagesContainer.tsx +1 -1
  384. package/src/features/agent/chat/ModernAgentOutput/PlanPanel.tsx +16 -22
  385. package/src/features/agent/chat/ModernAgentOutput/SlideInPanel.tsx +4 -4
  386. package/src/features/agent/chat/ModernAgentOutput/SlidingMessages.tsx +2 -4
  387. package/src/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.tsx +21 -21
  388. package/src/features/agent/chat/ModernAgentOutput/StreamingMessage.tsx +4 -4
  389. package/src/features/agent/chat/ModernAgentOutput/SummaryConversation.ts +16 -1
  390. package/src/features/agent/chat/ModernAgentOutput/ToolCallGroup.tsx +19 -40
  391. package/src/features/agent/chat/ModernAgentOutput/requestInputMessages.test.ts +41 -0
  392. package/src/features/agent/chat/ModernAgentOutput/requestInputMessages.ts +19 -0
  393. package/src/features/agent/chat/ModernAgentOutput/utils.test.ts +93 -0
  394. package/src/features/agent/chat/SlidingThinkingIndicator.tsx +5 -2
  395. package/src/features/agent/chat/VegaLiteChart.tsx +6 -2
  396. package/src/features/errors/RowErrorBoundary.tsx +1 -1
  397. package/src/features/facets/AgentRunnerFacetsNav.tsx +1 -1
  398. package/src/features/facets/utils/VInteractionFacet.tsx +22 -34
  399. package/src/features/facets/utils/VUserFacet.tsx +1 -1
  400. package/src/features/layout/GenericPageNavHeader.tsx +9 -1
  401. package/src/features/layout/NotFoundView.tsx +1 -1
  402. package/src/features/magic-pdf/AnnotatedImageSlider.tsx +8 -16
  403. package/src/features/magic-pdf/ExtractedContentView.tsx +4 -4
  404. package/src/features/magic-pdf/MagicPdfView.tsx +1 -1
  405. package/src/features/pdf-viewer/PdfPageRenderer.tsx +2 -2
  406. package/src/features/pdf-viewer/PdfPageSlider.tsx +4 -4
  407. package/src/features/pdf-viewer/SimplePdfViewer.tsx +1 -1
  408. package/src/features/permissions/UserPermissionsProvider.test.tsx +172 -0
  409. package/src/features/permissions/UserPermissionsProvider.tsx +68 -21
  410. package/src/features/permissions/useRoleMappings.ts +105 -0
  411. package/src/features/store/collections/SelectCollection.tsx +1 -1
  412. package/src/features/store/objects/DocumentPreviewPanel.tsx +43 -53
  413. package/src/features/store/objects/DocumentTable.tsx +2 -2
  414. package/src/features/store/objects/components/DocumentIcon.tsx +4 -4
  415. package/src/features/store/objects/components/DocumentInput.tsx +3 -3
  416. package/src/features/store/objects/components/PropertiesEditorModal.tsx +2 -2
  417. package/src/features/store/objects/components/SaveVersionConfirmModal.tsx +2 -2
  418. package/src/features/store/objects/layout/documentLayout.tsx +2 -4
  419. package/src/features/store/objects/selection/SelectionActions.tsx +1 -1
  420. package/src/features/store/types/IntakePolicyEditor.tsx +70 -36
  421. package/src/features/store/types/IntakePolicyForm.tsx +11 -3
  422. package/src/features/store/types/SelectContentTypeModal.tsx +1 -1
  423. package/src/features/user/UserAvatar.tsx +3 -3
  424. package/src/features/user/UserInfo.tsx +11 -16
  425. package/src/features/utils/index.ts +1 -0
  426. package/src/features/utils/interaction.test.tsx +93 -0
  427. package/src/features/utils/interaction.tsx +125 -0
  428. package/src/features/views/ViewResults.tsx +3 -3
  429. package/src/i18n/locales/ar.json +7 -1
  430. package/src/i18n/locales/de.json +7 -1
  431. package/src/i18n/locales/en.json +7 -1
  432. package/src/i18n/locales/es.json +7 -1
  433. package/src/i18n/locales/fr.json +7 -1
  434. package/src/i18n/locales/it.json +7 -1
  435. package/src/i18n/locales/ja.json +7 -1
  436. package/src/i18n/locales/ko.json +7 -1
  437. package/src/i18n/locales/pt.json +7 -1
  438. package/src/i18n/locales/ru.json +7 -1
  439. package/src/i18n/locales/tr.json +7 -1
  440. package/src/i18n/locales/zh-TW.json +7 -1
  441. package/src/i18n/locales/zh.json +7 -1
  442. package/src/layout/FullHeightLayout.tsx +2 -2
  443. package/src/layout/Navbar.tsx +5 -5
  444. package/src/layout/Sidebar.tsx +1 -1
  445. package/src/session/UserSessionProvider.tsx +2 -15
  446. package/src/session/auth/authState.test.ts +35 -0
  447. package/src/session/auth/authState.ts +42 -0
  448. package/src/session/auth/domainRouting.test.ts +169 -1
  449. package/src/session/auth/domainRouting.ts +89 -0
  450. package/src/session/auth/useAuthState.ts +5 -49
  451. package/src/session/index.ts +6 -0
  452. package/src/shell/SplashScreen.test.tsx +22 -0
  453. package/src/shell/SplashScreen.tsx +6 -2
  454. package/src/shell/VertesiaShell.tsx +1 -1
  455. package/src/shell/apps/AppProjectSelector.tsx +1 -1
  456. package/src/shell/apps/StandaloneApp.tsx +9 -9
  457. package/src/shell/login/SignInPrimitives.tsx +2 -2
  458. package/src/shell/login/SigninScreen.tsx +1 -1
  459. package/src/shell/login/SignupForm.tsx +2 -2
  460. package/src/shell/login/TerminalLogin.tsx +5 -5
  461. package/src/shell/login/UserInfo.tsx +2 -5
  462. package/src/shell/login/UserSessionMenu.tsx +2 -2
  463. package/src/widgets/Progress.tsx +2 -2
  464. package/src/widgets/form/Form.tsx +4 -4
  465. package/src/widgets/form/fields.tsx +2 -2
  466. package/src/widgets/json-view/JSONView.tsx +1 -6
  467. package/src/widgets/markdown/ArtifactEditingSurface.test.tsx +33 -29
  468. package/src/widgets/markdown/MarkdownRenderer.test.tsx +52 -0
  469. package/src/widgets/markdown/MermaidDiagram.tsx +2 -2
  470. package/src/widgets/markdown/remarkDirectiveHandler.ts +21 -5
  471. package/src/widgets/monacoEditor/MonacoEditor.tsx +4 -2
  472. package/src/widgets/monacoEditor/index.ts +1 -0
  473. package/src/widgets/monacoEditor/loadMonaco.test.ts +63 -0
  474. package/src/widgets/monacoEditor/loadMonaco.ts +70 -0
  475. package/src/widgets/properties/PropertiesView.tsx +1 -1
  476. package/src/widgets/schema-editor/editor/Editable.tsx +2 -2
  477. package/src/widgets/schema-editor/editor/PropertyEditor.tsx +1 -1
  478. package/src/widgets/schema-editor/editor/SchemaEditor.tsx +2 -2
  479. package/src/widgets/upload/DropZone.tsx +1 -1
  480. package/src/widgets/upload/UploadResultCategory.tsx +7 -7
  481. package/src/widgets/upload/UploadSummary.tsx +4 -4
  482. package/src/widgets/xml-viewer/components/XMLViewer.tsx +7 -3
  483. package/src/widgets/xml-viewer/hooks/useXMLViewer.test.ts +60 -7
  484. package/src/widgets/xml-viewer/hooks/useXMLViewer.ts +70 -16
  485. package/lib/vertesia-ui-i18n.3yHWompP.chunk.js +0 -5
  486. package/lib/vertesia-ui-i18n.3yHWompP.chunk.js.map +0 -1
  487. package/lib/vertesia-ui-i18n.4XKCcnL0.chunk.js +0 -5
  488. package/lib/vertesia-ui-i18n.4XKCcnL0.chunk.js.map +0 -1
  489. package/lib/vertesia-ui-i18n.78KG4J25.chunk.js +0 -5
  490. package/lib/vertesia-ui-i18n.78KG4J25.chunk.js.map +0 -1
  491. package/lib/vertesia-ui-i18n.BN06mpp1.chunk.js +0 -5
  492. package/lib/vertesia-ui-i18n.BN06mpp1.chunk.js.map +0 -1
  493. package/lib/vertesia-ui-i18n.CSzKLlHJ.chunk.js +0 -5
  494. package/lib/vertesia-ui-i18n.CSzKLlHJ.chunk.js.map +0 -1
  495. package/lib/vertesia-ui-i18n.Ccus7aRh.chunk.js +0 -5
  496. package/lib/vertesia-ui-i18n.Ccus7aRh.chunk.js.map +0 -1
  497. package/lib/vertesia-ui-i18n.D9j3c6gI.chunk.js +0 -5
  498. package/lib/vertesia-ui-i18n.D9j3c6gI.chunk.js.map +0 -1
  499. package/lib/vertesia-ui-i18n.DAUg4rrI.chunk.js +0 -5
  500. package/lib/vertesia-ui-i18n.DAUg4rrI.chunk.js.map +0 -1
  501. package/lib/vertesia-ui-i18n.DSxVZKXy.chunk.js +0 -5
  502. package/lib/vertesia-ui-i18n.DSxVZKXy.chunk.js.map +0 -1
  503. package/lib/vertesia-ui-i18n.aahVhHvR.chunk.js +0 -5
  504. package/lib/vertesia-ui-i18n.aahVhHvR.chunk.js.map +0 -1
  505. package/lib/vertesia-ui-i18n.nZ3xJ26v.chunk.js +0 -5
  506. package/lib/vertesia-ui-i18n.nZ3xJ26v.chunk.js.map +0 -1
  507. package/lib/vertesia-ui-i18n.xPYbuFzT.chunk.js +0 -5
  508. package/lib/vertesia-ui-i18n.xPYbuFzT.chunk.js.map +0 -1
@@ -23,10 +23,17 @@ import { type EditorApi, type Monaco, MonacoEditor } from '@vertesia/ui/widgets'
23
23
  import Ajv, { type ErrorObject, type ValidateFunction } from 'ajv';
24
24
  import addFormats from 'ajv-formats';
25
25
  import type { TFunction } from 'i18next';
26
- import { Braces, CheckCircle2, FileText, RotateCcw, Save, WandSparkles } from 'lucide-react';
27
- import { useMemo, useRef, useState } from 'react';
26
+ import { Braces, CheckCircle2, FileText, RotateCcw, WandSparkles } from 'lucide-react';
27
+ import { type ReactNode, useMemo, useRef, useState } from 'react';
28
28
  import { IntakePolicyForm, type IntakePolicyFormSection } from './IntakePolicyForm.js';
29
29
 
30
+ /** A tab rendered above the policy tabs. The owner supplies its own Panel and actions. */
31
+ export interface IntakePolicyEditorTab {
32
+ name: string;
33
+ label: string;
34
+ content: ReactNode;
35
+ }
36
+
30
37
  interface IntakePolicyEditorProps {
31
38
  /** Content type whose intake policy is edited; omit when editing a standalone policy. */
32
39
  objectType?: ContentObjectTypeCatalogEntry;
@@ -36,6 +43,8 @@ interface IntakePolicyEditorProps {
36
43
  * Defaults to saving the objectType's intake when objectType is provided. */
37
44
  onSave?: (policy: ContentTypeIntakePolicy) => Promise<ContentTypeIntakePolicy | undefined>;
38
45
  onIntakeUpdate?: (value: ContentTypeIntakePolicy | undefined) => void;
46
+ /** Extra tabs shown above the policy tabs, each owning its panel and actions. */
47
+ leadingTabs?: IntakePolicyEditorTab[];
39
48
  readonly?: boolean;
40
49
  }
41
50
 
@@ -279,6 +288,7 @@ export function IntakePolicyEditor({
279
288
  value,
280
289
  onSave: onSaveProp,
281
290
  onIntakeUpdate,
291
+ leadingTabs,
282
292
  readonly = false,
283
293
  }: IntakePolicyEditorProps) {
284
294
  const { store } = useUserSession();
@@ -293,7 +303,9 @@ export function IntakePolicyEditor({
293
303
  const [editorValue, setEditorValue] = useState(() => stringifyPolicy(initialPolicy));
294
304
  const [savedValue, setSavedValue] = useState(() => stringifyPolicy(initialPolicy));
295
305
  const [validationMessage, setValidationMessage] = useState<string | undefined>(undefined);
296
- const [activeTab, setActiveTab] = useState<IntakePolicyFormSection | 'json'>('overview');
306
+ // Open on the first leading tab when a consumer supplies one (settings opens on General);
307
+ // otherwise the policy sections start at their first tab.
308
+ const [activeTab, setActiveTab] = useState<string>(leadingTabs?.[0]?.name ?? 'classification');
297
309
 
298
310
  const isDirty = editorValue !== savedValue;
299
311
  const currentPolicy = useMemo(() => {
@@ -421,7 +433,7 @@ export function IntakePolicyEditor({
421
433
  setEditorValue(value);
422
434
  editorRef.current?.setValue(value);
423
435
  setValidationMessage(undefined);
424
- setActiveTab('overview');
436
+ setActiveTab('classification');
425
437
  };
426
438
 
427
439
  const onFormChange = (policy: ContentTypeIntakePolicy) => {
@@ -430,6 +442,11 @@ export function IntakePolicyEditor({
430
442
  };
431
443
 
432
444
  const onTabChange = (tab: string) => {
445
+ // Leading tabs are not policy sections, so invalid policy JSON must not trap the user there.
446
+ if (leadingTabs?.some((leading) => leading.name === tab)) {
447
+ setActiveTab(tab);
448
+ return;
449
+ }
433
450
  const nextTab = tab as IntakePolicyFormSection | 'json';
434
451
  if (nextTab !== 'json' && !currentPolicy) {
435
452
  setValidationMessage(t('intakePolicy.error.fixJsonBeforeForm'));
@@ -441,7 +458,7 @@ export function IntakePolicyEditor({
441
458
 
442
459
  const title = (
443
460
  <div className="flex items-center gap-2">
444
- <div className="text-base font-semibold">{t('intakePolicy.title')}</div>
461
+ <div>{t('intakePolicy.title')}</div>
445
462
  {isDirty && <Badge variant="attention">{t('intakePolicy.status.unsaved')}</Badge>}
446
463
  </div>
447
464
  );
@@ -451,7 +468,7 @@ export function IntakePolicyEditor({
451
468
  <Dropdown
452
469
  align="right"
453
470
  trigger={
454
- <Button variant="outline" size="sm">
471
+ <Button variant="outline" size="md">
455
472
  <WandSparkles className="size-4" />
456
473
  {t('intakePolicy.action.examples')}
457
474
  </Button>
@@ -473,58 +490,74 @@ export function IntakePolicyEditor({
473
490
  </Dropdown>
474
491
  {activeTab === 'json' && (
475
492
  <>
476
- <Button variant="outline" size="sm" onClick={onFormat}>
493
+ <Button variant="outline" size="md" onClick={onFormat}>
477
494
  <Braces className="size-4" />
478
495
  {t('intakePolicy.action.format')}
479
496
  </Button>
480
- <Button variant="outline" size="sm" onClick={onValidate}>
497
+ <Button variant="outline" size="md" onClick={onValidate}>
481
498
  <CheckCircle2 className="size-4" />
482
499
  {t('intakePolicy.action.validate')}
483
500
  </Button>
484
501
  </>
485
502
  )}
486
- <Button variant="outline" size="sm" onClick={onRevert} disabled={!isDirty}>
503
+ <Button variant="outline" size="md" onClick={onRevert} disabled={!isDirty}>
487
504
  <RotateCcw className="size-4" />
488
505
  {t('intakePolicy.action.revert')}
489
506
  </Button>
490
- <Button isLoading={isUpdating} size="sm" onClick={onSave} disabled={!isDirty}>
491
- <Save className="size-4" />
507
+ <Button isLoading={isUpdating} size="md" onClick={onSave} disabled={!isDirty}>
492
508
  {t('intakePolicy.action.save')}
493
509
  </Button>
494
510
  </>
495
511
  ) : undefined;
496
512
 
497
- return (
513
+ /** Panel chrome for the policy tabs. Each tab owns its panel now that the switcher is outside. */
514
+ const withPolicyPanel = (content: ReactNode) => (
498
515
  <Panel title={title} className="bg-background! h-full" action={action}>
499
516
  <div className="flex h-full min-h-0 flex-col gap-3">
500
- <IntakeSummary policy={summaryPolicy} />
501
517
  {validationMessage && (
502
518
  <div className="rounded-sm border border-destructive bg-mixer-destructive/10 px-3 py-2 text-sm whitespace-pre-line text-destructive">
503
519
  {validationMessage}
504
520
  </div>
505
521
  )}
506
- <Tabs
507
- tabs={createEditorTabs(t, currentPolicy ?? EMPTY_POLICY, readonly, onFormChange, editorValue, {
508
- editorRef,
509
- beforeMount,
510
- onChange: (value) => {
511
- setEditorValue(value);
512
- setValidationMessage(undefined);
513
- },
514
- theme,
515
- })}
516
- current={activeTab}
517
- onTabChange={onTabChange}
518
- updateHash={false}
519
- fullHeight
520
- className="px-0 flex-row!"
521
- >
522
- <TabsBar className="py-2 w-48 shrink-0" direction="vertical" />
523
- <TabsPanel className="min-h-0 min-w-0 flex-1 overflow-auto pt-1 ps-4" />
524
- </Tabs>
522
+ {content}
525
523
  </div>
526
524
  </Panel>
527
525
  );
526
+
527
+ const policyTabs = createEditorTabs(
528
+ t,
529
+ currentPolicy ?? EMPTY_POLICY,
530
+ readonly,
531
+ onFormChange,
532
+ editorValue,
533
+ {
534
+ editorRef,
535
+ beforeMount,
536
+ onChange: (value) => {
537
+ setEditorValue(value);
538
+ setValidationMessage(undefined);
539
+ },
540
+ theme,
541
+ },
542
+ withPolicyPanel,
543
+ );
544
+
545
+ return (
546
+ <div className="flex h-full min-h-0 w-full flex-col gap-3">
547
+ <IntakeSummary policy={summaryPolicy} />
548
+ <Tabs
549
+ tabs={leadingTabs ? [...leadingTabs, ...policyTabs] : policyTabs}
550
+ current={activeTab}
551
+ onTabChange={onTabChange}
552
+ updateHash={false}
553
+ fullHeight
554
+ className="px-0 min-h-0 flex-1 flex-row!"
555
+ >
556
+ <TabsBar className="py-2 w-48 shrink-0" direction="vertical" />
557
+ <TabsPanel className="min-h-0 min-w-0 flex-1 overflow-auto ps-4" />
558
+ </Tabs>
559
+ </div>
560
+ );
528
561
  }
529
562
 
530
563
  function createEditorTabs(
@@ -539,15 +572,16 @@ function createEditorTabs(
539
572
  onChange: (value: string) => void;
540
573
  theme: string;
541
574
  },
575
+ wrap: (content: ReactNode) => ReactNode,
542
576
  ) {
543
577
  const formTab = (name: IntakePolicyFormSection, label: string) => ({
544
578
  name,
545
579
  label,
546
- content: <IntakePolicyForm policy={policy} section={name} onChange={onChange} readonly={readonly} />,
580
+ content: wrap(<IntakePolicyForm policy={policy} section={name} onChange={onChange} readonly={readonly} />),
547
581
  });
548
582
 
549
583
  return [
550
- formTab('overview', t('intakePolicy.tab.overview')),
584
+ formTab('classification', t('intakePolicy.tab.classification')),
551
585
  formTab('conversion', t('intakePolicy.tab.conversion')),
552
586
  formTab('extraction', t('intakePolicy.tab.extraction')),
553
587
  formTab('grounding', t('intakePolicy.tab.grounding')),
@@ -555,7 +589,7 @@ function createEditorTabs(
555
589
  {
556
590
  name: 'json',
557
591
  label: t('intakePolicy.tab.json'),
558
- content: (
592
+ content: wrap(
559
593
  <div className="flex h-full min-h-[36rem] gap-4 py-3">
560
594
  <div className="min-w-0 flex-1 overflow-hidden rounded-sm border">
561
595
  <MonacoEditor
@@ -579,7 +613,7 @@ function createEditorTabs(
579
613
  />
580
614
  </div>
581
615
  <IntakeHelp />
582
- </div>
616
+ </div>,
583
617
  ),
584
618
  },
585
619
  ];
@@ -27,7 +27,7 @@ import {
27
27
  updateIntakePolicy,
28
28
  } from './intake-policy-editor.logic.js';
29
29
 
30
- export type IntakePolicyFormSection = 'overview' | 'conversion' | 'extraction' | 'grounding' | 'output';
30
+ export type IntakePolicyFormSection = 'classification' | 'conversion' | 'extraction' | 'grounding' | 'output';
31
31
 
32
32
  interface IntakePolicyFormProps {
33
33
  policy: ContentTypeIntakePolicy;
@@ -45,7 +45,7 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
45
45
  const { t } = useUITranslation();
46
46
  const setValue = (path: IntakePolicyPath, value: unknown) => onChange(updateIntakePolicy(policy, path, value));
47
47
 
48
- if (section === 'overview') {
48
+ if (section === 'classification') {
49
49
  return (
50
50
  <FormSurface>
51
51
  <FormSection
@@ -317,6 +317,8 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
317
317
  <FormSection
318
318
  title={t('intakePolicy.section.visionBudget')}
319
319
  description={t('intakePolicy.help.section.visionBudget')}
320
+ // `last` only because Verification below is hidden; drop it when that is restored.
321
+ last
320
322
  >
321
323
  <div className="grid gap-4 md:grid-cols-2 xl:grid-cols-3">
322
324
  <SelectField
@@ -359,6 +361,11 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
359
361
  </div>
360
362
  </FormSection>
361
363
 
364
+ {/* Verification is hidden until the feature is wired up. The policy schema, the
365
+ API contract and this form all still carry it; nothing here consumes the values
366
+ at processing time yet. Uncomment as-is to bring the section back, and remove
367
+ the `last` prop added to the Vision evidence budget section above.
368
+
362
369
  <FormSection title={t('intakePolicy.section.verification')} last>
363
370
  <div className="grid gap-4 md:grid-cols-2 xl:grid-cols-3">
364
371
  <TriStateField
@@ -410,6 +417,7 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
410
417
  readonly={readonly}
411
418
  />
412
419
  </FormSection>
420
+ */}
413
421
  </FormSurface>
414
422
  );
415
423
  }
@@ -636,7 +644,7 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
636
644
  }
637
645
 
638
646
  function FormSurface({ children }: { children: ReactNode }) {
639
- return <div className="mx-auto w-full max-w-6xl px-1 py-4">{children}</div>;
647
+ return <div className="w-full px-1 py-4">{children}</div>;
640
648
  }
641
649
 
642
650
  function FormSection({
@@ -71,7 +71,7 @@ export function SelectContentTypeModal({
71
71
  <div className="mb-4 mt-4">
72
72
  <div className="block text-sm font-medium mb-2">
73
73
  {t('store.contentType')}{' '}
74
- {allowNone && <span className="text-gray-500 font-normal">{t('store.optional')}</span>}
74
+ {allowNone && <span className="text-muted font-normal">{t('store.optional')}</span>}
75
75
  </div>
76
76
  {allowNone ? (
77
77
  <SelectBox
@@ -13,7 +13,7 @@ export function UserAvatar({ user }: { user: AuthTokenPayload | UserRef }) {
13
13
  .map((n) => n[0])
14
14
  .join('');
15
15
  return (
16
- <span className="inline-flex h-8 w-8 items-center justify-center rounded-full bg-indigo-600">
16
+ <span className="inline-flex h-8 w-8 items-center justify-center rounded-full bg-primary">
17
17
  <span className="text-sm font-medium leading-none text-white">{initials}</span>
18
18
  </span>
19
19
  );
@@ -26,10 +26,10 @@ export function UserAvatar({ user }: { user: AuthTokenPayload | UserRef }) {
26
26
  <div className="flex items-center">
27
27
  <div className="w-9 h-9">{userPicture()}</div>
28
28
  <div className="ms-3">
29
- <p className="text-sm font-medium text-gray-700 dark:text-slate-50 group-hover:text-gray-900">
29
+ <p className="text-sm font-medium text-foreground group-hover:text-foreground">
30
30
  {user.name ?? 'Deleted User'}
31
31
  </p>
32
- <p className="text-xs font-medium text-gray-500 dark:text-slate-300 group-hover:text-gray-700">
32
+ <p className="text-xs font-medium text-muted dark:text-foreground group-hover:text-foreground">
33
33
  {user.email ?? 'Deleted User'}
34
34
  </p>
35
35
  </div>
@@ -148,10 +148,10 @@ function EmailAgentAvatar({ email, showTitle = false, size = 'md' }: EmailAgentA
148
148
  <Avatar
149
149
  src="/cloud.svg"
150
150
  color="bg-amber-500"
151
- className="px-[5px] text-white border-2 border-white dark:border-gray-800"
151
+ className="px-[5px] text-white border-2 border-background"
152
152
  size={size}
153
153
  />
154
- <Avatar name={email} size={size} className="border-2 border-white dark:border-gray-800" />
154
+ <Avatar name={email} size={size} className="border-2 border-background" />
155
155
  </div>
156
156
  {showTitle && <div className="text-sm font-semibold truncate">Agent&#8194;({email})</div>}
157
157
  </div>
@@ -208,13 +208,13 @@ function AgentAvatar({
208
208
  {apiKey && (
209
209
  <div>
210
210
  <div className="font-medium">{apiKey.name}</div>
211
- <div className="text-xs text-muted-foreground">Key ID: {apiKey.id}</div>
211
+ <div className="text-xs text-muted">Key ID: {apiKey.id}</div>
212
212
  </div>
213
213
  )}
214
214
  {!user && !apiKey && (
215
215
  <>
216
216
  <div>{t('user.serviceAccountDescription')}</div>
217
- <div className="text-gray-800 dark:text-gray-500 text-sm">
217
+ <div className="text-foreground dark:text-muted text-sm">
218
218
  <span className="font-semibold">ID:</span> {agentId}
219
219
  </div>
220
220
  </>
@@ -229,7 +229,7 @@ function AgentAvatar({
229
229
  <Avatar
230
230
  src="/cloud.svg"
231
231
  color="bg-amber-500"
232
- className="px-[5px] text-white border-2 border-white dark:border-gray-800"
232
+ className="px-[5px] text-white border-2 border-background"
233
233
  size={size}
234
234
  />
235
235
  {user && (
@@ -237,16 +237,11 @@ function AgentAvatar({
237
237
  src={user.picture}
238
238
  name={user.name}
239
239
  size={size}
240
- className="border-2 border-white dark:border-gray-800"
240
+ className="border-2 border-background"
241
241
  />
242
242
  )}
243
243
  {apiKey && (
244
- <Avatar
245
- name="API"
246
- color="bg-gray-400"
247
- size={size}
248
- className="border-2 border-white dark:border-gray-800"
249
- />
244
+ <Avatar name="API" color="bg-gray-400" size={size} className="border-2 border-background" />
250
245
  )}
251
246
  </div>
252
247
  {showTitle && (
@@ -455,7 +450,7 @@ function GroupAvatar({ userId, showTitle = false, size = 'md' }: GroupAvatarProp
455
450
  const description = (
456
451
  <div className="space-y-1">
457
452
  {group.description && <div className="text-sm">{group.description}</div>}
458
- <div className="text-xs text-muted-foreground">{t('user.groupId', { id: group.id })}</div>
453
+ <div className="text-xs text-muted">{t('user.groupId', { id: group.id })}</div>
459
454
  {group.tags && group.tags.length > 0 && (
460
455
  <div className="flex flex-wrap gap-1">
461
456
  {group.tags.map((tag) => (
@@ -471,7 +466,7 @@ function GroupAvatar({ userId, showTitle = false, size = 'md' }: GroupAvatarProp
471
466
  return (
472
467
  <UserPopoverPanel title={group.name || t('user.unnamedGroup')} description={description}>
473
468
  <div className="flex flex-row items-center gap-2">
474
- <Users className="size-6 text-indigo-500" size={size} />
469
+ <Users className="size-6 text-primary" size={size} />
475
470
  {showTitle && <div className="text-sm font-semibold ps-2">{group.name || t('user.unnamedGroup')}</div>}
476
471
  </div>
477
472
  </UserPopoverPanel>
@@ -540,7 +535,7 @@ export function ApiKeyAvatar({ keyId, showTitle = false, size = 'md' }: ApiKeyAv
540
535
  const title = t('user.privateKey');
541
536
  const avatar = <Avatar name={'PK'} color="bg-pink-500" size={size} />;
542
537
  const description = (
543
- <Table className="dark:bg-gray-800 dark:text-gray-200 table-fixed w-full">
538
+ <Table className="dark:bg-muted dark:text-foreground table-fixed w-full">
544
539
  <tr>
545
540
  <td className="font-semibold w-20">{t('user.key')}</td>
546
541
  <td className="truncate max-w-0">{data?.name}</td>
@@ -583,7 +578,7 @@ function UserPopoverPanel({ title, description, children }: UserPopoverPanelProp
583
578
  </PopoverTrigger>
584
579
  <PopoverContent align="center" sideOffset={8} side="right">
585
580
  <div className="flex flex-col gap-1 rounded-md shadow-md p-2">
586
- <div className="text-md font-semibold">{title}</div>
581
+ <div className="text-base font-semibold">{title}</div>
587
582
  {description}
588
583
  </div>
589
584
  </PopoverContent>
@@ -1,3 +1,4 @@
1
+ export * from './interaction.js';
1
2
  export * from './mimeType.js';
2
3
  export * from './print.js';
3
4
  export * from './rendition.js';
@@ -0,0 +1,93 @@
1
+ import { cleanup, render, screen } from '@testing-library/react';
2
+ import { InteractionStatus } from '@vertesia/common';
3
+ import { afterEach, describe, expect, it } from 'vitest';
4
+ import {
5
+ InteractionLabel,
6
+ isUnresolvedInteractionRef,
7
+ resolveInteractionName,
8
+ splitInteractionType,
9
+ } from './interaction.js';
10
+
11
+ describe('splitInteractionType', () => {
12
+ it('splits a known namespace off the name', () => {
13
+ expect(splitInteractionType('sys:code_agent')).toEqual({ type: 'sys', label: 'code_agent' });
14
+ });
15
+
16
+ it('keeps colons that are part of the name', () => {
17
+ expect(splitInteractionType('nfwf-chatbot:main:rag-agent')).toEqual({ label: 'nfwf-chatbot:main:rag-agent' });
18
+ expect(splitInteractionType('WhatColor')).toEqual({ label: 'WhatColor' });
19
+ });
20
+ });
21
+
22
+ describe('resolveInteractionName', () => {
23
+ it('prefers the resolved ref name over the run snapshot', () => {
24
+ const name = resolveInteractionName({ name: 'Current Name' }, 'Stale Name', '682a822c4dbfdc27017ff6cd');
25
+ expect(name).toBe('Current Name');
26
+ });
27
+
28
+ it('falls back when the ref name is the bare ObjectId the resolver left behind', () => {
29
+ const name = resolveInteractionName({ name: '682a822c4dbfdc27017ff6cd' }, 'Legacy Name');
30
+ expect(name).toBe('Legacy Name');
31
+ });
32
+
33
+ it('skips empty fallbacks and returns undefined when nothing is usable', () => {
34
+ expect(resolveInteractionName(undefined, '', 'ref-string')).toBe('ref-string');
35
+ expect(resolveInteractionName(undefined, undefined, '')).toBeUndefined();
36
+ });
37
+
38
+ it('names a deleted interaction from its id, from either the ref or a bare bucket id', () => {
39
+ // The run row has the ref the server left behind; the facet bucket has only its `_id`.
40
+ // Both must produce the same label or the option stops matching the row it filters for.
41
+ const fromRow = resolveInteractionName({ name: '682a822c4dbfdc27017ff6cd' });
42
+ const fromBucket = resolveInteractionName(undefined, '682a822c4dbfdc27017ff6cd');
43
+ expect(fromRow).toBe('Deleted interaction (~017ff6cd)');
44
+ expect(fromBucket).toBe(fromRow);
45
+ });
46
+ });
47
+
48
+ describe('isUnresolvedInteractionRef', () => {
49
+ it('flags only refs with neither a version nor a status', () => {
50
+ expect(isUnresolvedInteractionRef({ version: 0, status: InteractionStatus.unknown })).toBe(true);
51
+ expect(isUnresolvedInteractionRef({ version: 0, status: InteractionStatus.code })).toBe(false);
52
+ expect(isUnresolvedInteractionRef({ version: 2, status: InteractionStatus.unknown })).toBe(false);
53
+ expect(isUnresolvedInteractionRef(undefined)).toBe(false);
54
+ });
55
+ });
56
+
57
+ describe('InteractionLabel', () => {
58
+ afterEach(cleanup);
59
+
60
+ it('lifts the namespace out of the name and badges the version and status', () => {
61
+ render(
62
+ <InteractionLabel interaction={{ name: 'sys:code_agent', version: 3, status: InteractionStatus.code }} />,
63
+ );
64
+ expect(screen.getByText('code_agent')).toBeTruthy();
65
+ expect(screen.getByText('sys')).toBeTruthy();
66
+ expect(screen.getByText('v3 code')).toBeTruthy();
67
+ });
68
+
69
+ it('badges nothing for a ref the server could not resolve', () => {
70
+ const { container } = render(
71
+ <InteractionLabel
72
+ interaction={{ name: '682a822c4dbfdc27017ff6cd', version: 0, status: InteractionStatus.unknown }}
73
+ fallbacks={['Legacy Name']}
74
+ />,
75
+ );
76
+ expect(container.textContent).toBe('Legacy Name');
77
+ });
78
+
79
+ it('renders the fallback node only when there is no reference at all', () => {
80
+ render(<InteractionLabel fallbackNode={<span>Interaction not found</span>} />);
81
+ expect(screen.getByText('Interaction not found')).toBeTruthy();
82
+ });
83
+
84
+ it('names a deleted interaction rather than falling through to the fallback node', () => {
85
+ const { container } = render(
86
+ <InteractionLabel
87
+ interaction={{ name: '682a822c4dbfdc27017ff6cd', version: 0, status: InteractionStatus.unknown }}
88
+ fallbackNode={<span>Interaction not found</span>}
89
+ />,
90
+ );
91
+ expect(container.textContent).toBe('Deleted interaction (~017ff6cd)');
92
+ });
93
+ });
@@ -0,0 +1,125 @@
1
+ import { InteractionStatus } from '@vertesia/common';
2
+ import { Badge } from '@vertesia/ui/core';
3
+ import type { ReactNode } from 'react';
4
+
5
+ /**
6
+ * The parts of an interaction reference the display helpers below read. Kept structural so runs,
7
+ * facet buckets and full interactions can all be passed as-is.
8
+ */
9
+ export interface InteractionDisplayRef {
10
+ name?: string;
11
+ version?: number;
12
+ status?: InteractionStatus;
13
+ }
14
+
15
+ /**
16
+ * Namespaces that a ref actually uses as a type prefix. Every other colon in a ref belongs to the
17
+ * name itself (`main:rag-agent`, `nfwf-chatbot:main:rag-agent`), so it must not become a badge.
18
+ */
19
+ const INTERACTION_TYPES: string[] = ['sys', 'app', 'tmp'];
20
+
21
+ const OBJECT_ID_RE = /^[0-9a-fA-F]{24}$/;
22
+
23
+ /** Split `<type>:<rest>` into the type badge and the label to display; untyped refs keep their name. */
24
+ export function splitInteractionType(name: string): { type?: string; label: string } {
25
+ const separator = name.indexOf(':');
26
+ const type = separator > 0 ? name.slice(0, separator) : undefined;
27
+ return type && INTERACTION_TYPES.includes(type) ? { type, label: name.slice(separator + 1) } : { label: name };
28
+ }
29
+
30
+ /**
31
+ * Pick the name to display for an interaction reference: the ref's own name, then the fallbacks —
32
+ * a run's `interaction_name` / raw ref string, a facet bucket's id — in order.
33
+ *
34
+ * A bare ObjectId is never a name: it is what a deleted stored interaction leaves behind once the
35
+ * server can no longer resolve it. Those candidates are skipped, and if nothing else is left the
36
+ * id becomes a short "deleted" label instead, so a run row and the facet option that filters for
37
+ * it name the missing interaction identically. Returns undefined when there is no id either.
38
+ */
39
+ export function resolveInteractionName(
40
+ ref: InteractionDisplayRef | undefined,
41
+ ...fallbacks: (string | undefined)[]
42
+ ): string | undefined {
43
+ const candidates = [ref?.name, ...fallbacks].filter((candidate): candidate is string => !!candidate);
44
+ const name = candidates.find((candidate) => !OBJECT_ID_RE.test(candidate));
45
+ if (name) return name;
46
+ const id = candidates[0];
47
+ return id ? `Deleted interaction (~${id.slice(-8)})` : undefined;
48
+ }
49
+
50
+ /**
51
+ * A reference the server couldn't resolve carries neither a version nor a status; it has no status
52
+ * worth badging.
53
+ */
54
+ export function isUnresolvedInteractionRef(ref: InteractionDisplayRef | undefined): boolean {
55
+ return !!ref && ref.version === 0 && ref.status === InteractionStatus.unknown;
56
+ }
57
+
58
+ interface InteractionStatusBadgeProps {
59
+ interaction: InteractionDisplayRef;
60
+ className?: string;
61
+ }
62
+
63
+ export function InteractionStatusBadge({ interaction, className }: InteractionStatusBadgeProps) {
64
+ let variant: 'success' | 'info' | 'destructive' | 'default' = 'success';
65
+ switch (interaction.status) {
66
+ case InteractionStatus.published:
67
+ variant = 'success';
68
+ break;
69
+ case InteractionStatus.archived:
70
+ variant = 'destructive';
71
+ break;
72
+ case InteractionStatus.code:
73
+ variant = 'info';
74
+ break;
75
+ }
76
+ const version = interaction.version ? `v${interaction.version}` : '';
77
+ const status = interaction.status && interaction.status !== InteractionStatus.unknown ? interaction.status : '';
78
+ const text = [version, status].filter(Boolean).join(' ');
79
+ // Nothing resolved (an unresolved ref, or a bucket carrying neither field) — no badge at all.
80
+ if (!text) return null;
81
+ return (
82
+ <Badge variant={variant} className={className}>
83
+ {text}
84
+ </Badge>
85
+ );
86
+ }
87
+
88
+ interface InteractionLabelProps {
89
+ /** The resolved reference, when the server could resolve one. */
90
+ interaction?: InteractionDisplayRef;
91
+ /**
92
+ * Names to fall back on, in order, when the ref carries no usable name — a run's
93
+ * `interaction_name`, the raw ref string it was launched with, a facet bucket id.
94
+ */
95
+ fallbacks?: (string | undefined)[];
96
+ /** Rendered in place of the label when no name resolves at all. */
97
+ fallbackNode?: ReactNode;
98
+ }
99
+
100
+ /**
101
+ * How every run listing names the interaction it ran: the name with its `sys`/`app`/`tmp`
102
+ * namespace lifted into its own badge, above the version/status badge. Keep listings on this
103
+ * component so a row, its quick filter and the interaction facet never disagree.
104
+ */
105
+ export function InteractionLabel({ interaction, fallbacks = [], fallbackNode = null }: InteractionLabelProps) {
106
+ const name = resolveInteractionName(interaction, ...fallbacks);
107
+ if (!name) {
108
+ return <>{fallbackNode}</>;
109
+ }
110
+ const { type, label } = splitInteractionType(name);
111
+ // InteractionStatusBadge renders null for an unresolved ref, so skip the row entirely here
112
+ // rather than emit an empty badge line.
113
+ const showStatus = !!interaction && !isUnresolvedInteractionRef(interaction);
114
+ return (
115
+ <>
116
+ {label}
117
+ {(type || showStatus) && (
118
+ <div className="flex items-center mt-1.5 shrink-0 gap-2">
119
+ {type && <Badge variant="secondary">{type}</Badge>}
120
+ {showStatus && interaction && <InteractionStatusBadge interaction={interaction} />}
121
+ </div>
122
+ )}
123
+ </>
124
+ );
125
+ }
@@ -258,9 +258,9 @@ function ViewMedia({
258
258
  return (
259
259
  <div className={`flex items-center justify-center bg-muted ${className ?? ''}`} aria-hidden="true">
260
260
  {fallback === 'placeholder' ? (
261
- <ImageIcon className="size-10 text-muted-foreground" />
261
+ <ImageIcon className="size-10 text-muted" />
262
262
  ) : (
263
- <FileText className="size-10 text-muted-foreground" />
263
+ <FileText className="size-10 text-muted" />
264
264
  )}
265
265
  </div>
266
266
  );
@@ -379,7 +379,7 @@ function ListResults({
379
379
  )}
380
380
  </div>
381
381
  {display.description && (
382
- <p className="line-clamp-3 text-sm text-muted-foreground">
382
+ <p className="line-clamp-3 text-sm text-muted">
383
383
  <ViewField hit={hit} field={display.description} />
384
384
  </p>
385
385
  )}