@vertesia/ui 1.5.0-dev.20260807.073259Z → 1.5.0-dev.20260826.064249Z

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 (432) hide show
  1. package/README.md +1 -7
  2. package/lib/core/components/shadcn/filters/comboBox/DateCombobox.js +1 -1
  3. package/lib/core/components/shadcn/filters/comboBox/DateCombobox.js.map +1 -1
  4. package/lib/core/components/shadcn/filters/filter/dateFilter.d.ts.map +1 -1
  5. package/lib/core/components/shadcn/filters/filter/dateFilter.js +1 -1
  6. package/lib/core/components/shadcn/filters/filter/dateFilter.js.map +1 -1
  7. package/lib/core/components/shadcn/filters/filters.d.ts.map +1 -1
  8. package/lib/core/components/shadcn/filters/filters.js +1 -1
  9. package/lib/core/components/shadcn/filters/filters.js.map +1 -1
  10. package/lib/core/components/shadcn/index.d.ts +1 -0
  11. package/lib/core/components/shadcn/index.d.ts.map +1 -1
  12. package/lib/core/components/shadcn/index.js +1 -0
  13. package/lib/core/components/shadcn/index.js.map +1 -1
  14. package/lib/core/components/shadcn/modal/dialog.d.ts.map +1 -1
  15. package/lib/core/components/shadcn/modal/dialog.js +1 -3
  16. package/lib/core/components/shadcn/modal/dialog.js.map +1 -1
  17. package/lib/core/components/shadcn/overflowTabs.d.ts +59 -0
  18. package/lib/core/components/shadcn/overflowTabs.d.ts.map +1 -0
  19. package/lib/core/components/shadcn/overflowTabs.js +173 -0
  20. package/lib/core/components/shadcn/overflowTabs.js.map +1 -0
  21. package/lib/core/components/shadcn/selectBox.js +2 -2
  22. package/lib/core/components/shadcn/selectBox.js.map +1 -1
  23. package/lib/core/components/shadcn/theme/ThemeProvider.d.ts +3 -1
  24. package/lib/core/components/shadcn/theme/ThemeProvider.d.ts.map +1 -1
  25. package/lib/core/components/shadcn/theme/ThemeProvider.js +8 -9
  26. package/lib/core/components/shadcn/theme/ThemeProvider.js.map +1 -1
  27. package/lib/core/utils/dayjs.d.ts +12 -0
  28. package/lib/core/utils/dayjs.d.ts.map +1 -0
  29. package/lib/core/utils/dayjs.js +16 -0
  30. package/lib/core/utils/dayjs.js.map +1 -0
  31. package/lib/env/index.d.ts +17 -0
  32. package/lib/env/index.d.ts.map +1 -1
  33. package/lib/env/index.js +18 -1
  34. package/lib/env/index.js.map +1 -1
  35. package/lib/features/agent/PayloadBuilder.d.ts +1 -0
  36. package/lib/features/agent/PayloadBuilder.d.ts.map +1 -1
  37. package/lib/features/agent/PayloadBuilder.js +22 -5
  38. package/lib/features/agent/PayloadBuilder.js.map +1 -1
  39. package/lib/features/agent/chat/AgentRightPanel.d.ts.map +1 -1
  40. package/lib/features/agent/chat/AgentRightPanel.js +3 -135
  41. package/lib/features/agent/chat/AgentRightPanel.js.map +1 -1
  42. package/lib/features/agent/chat/ArtifactsTab.d.ts.map +1 -1
  43. package/lib/features/agent/chat/ArtifactsTab.js +1 -1
  44. package/lib/features/agent/chat/ArtifactsTab.js.map +1 -1
  45. package/lib/features/agent/chat/AskUserWidget.d.ts.map +1 -1
  46. package/lib/features/agent/chat/AskUserWidget.js +19 -4
  47. package/lib/features/agent/chat/AskUserWidget.js.map +1 -1
  48. package/lib/features/agent/chat/ModernAgentConversation.d.ts +6 -0
  49. package/lib/features/agent/chat/ModernAgentConversation.d.ts.map +1 -1
  50. package/lib/features/agent/chat/ModernAgentConversation.js +99 -29
  51. package/lib/features/agent/chat/ModernAgentConversation.js.map +1 -1
  52. package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.d.ts.map +1 -1
  53. package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.js +10 -9
  54. package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.js.map +1 -1
  55. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts.map +1 -1
  56. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js +5 -8
  57. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -1
  58. package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.d.ts.map +1 -1
  59. package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.js +45 -4
  60. package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.js.map +1 -1
  61. package/lib/features/agent/chat/ModernAgentOutput/BatchProgressPanel.js +1 -1
  62. package/lib/features/agent/chat/ModernAgentOutput/BatchProgressPanel.js.map +1 -1
  63. package/lib/features/agent/chat/ModernAgentOutput/Header.d.ts.map +1 -1
  64. package/lib/features/agent/chat/ModernAgentOutput/Header.js +3 -3
  65. package/lib/features/agent/chat/ModernAgentOutput/Header.js.map +1 -1
  66. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.d.ts.map +1 -1
  67. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js +1 -1
  68. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js.map +1 -1
  69. package/lib/features/agent/chat/ModernAgentOutput/StreamingMessage.d.ts.map +1 -1
  70. package/lib/features/agent/chat/ModernAgentOutput/StreamingMessage.js +1 -1
  71. package/lib/features/agent/chat/ModernAgentOutput/StreamingMessage.js.map +1 -1
  72. package/lib/features/agent/chat/ModernAgentOutput/ToolCallGroup.js +1 -1
  73. package/lib/features/agent/chat/ModernAgentOutput/ToolCallGroup.js.map +1 -1
  74. package/lib/features/agent/chat/ModernAgentOutput/WorkstreamTabs.d.ts.map +1 -1
  75. package/lib/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js +9 -121
  76. package/lib/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js.map +1 -1
  77. package/lib/features/agent/chat/ModernAgentOutput/utils.d.ts +6 -0
  78. package/lib/features/agent/chat/ModernAgentOutput/utils.d.ts.map +1 -1
  79. package/lib/features/agent/chat/ModernAgentOutput/utils.js +19 -11
  80. package/lib/features/agent/chat/ModernAgentOutput/utils.js.map +1 -1
  81. package/lib/features/agent/chat/VegaLiteChart.d.ts.map +1 -1
  82. package/lib/features/agent/chat/VegaLiteChart.js +11 -3
  83. package/lib/features/agent/chat/VegaLiteChart.js.map +1 -1
  84. package/lib/features/agent/chat/hooks/useAgentStream.d.ts.map +1 -1
  85. package/lib/features/agent/chat/hooks/useAgentStream.js +3 -0
  86. package/lib/features/agent/chat/hooks/useAgentStream.js.map +1 -1
  87. package/lib/features/document-viewer/UniversalDocumentViewer.d.ts.map +1 -1
  88. package/lib/features/document-viewer/UniversalDocumentViewer.js +1 -1
  89. package/lib/features/document-viewer/UniversalDocumentViewer.js.map +1 -1
  90. package/lib/features/facets/AgentRunnerFacetsNav.d.ts +14 -2
  91. package/lib/features/facets/AgentRunnerFacetsNav.d.ts.map +1 -1
  92. package/lib/features/facets/AgentRunnerFacetsNav.js +20 -2
  93. package/lib/features/facets/AgentRunnerFacetsNav.js.map +1 -1
  94. package/lib/features/facets/CollectionsFacetsNav.d.ts +3 -3
  95. package/lib/features/facets/CollectionsFacetsNav.d.ts.map +1 -1
  96. package/lib/features/facets/CollectionsFacetsNav.js +6 -1
  97. package/lib/features/facets/CollectionsFacetsNav.js.map +1 -1
  98. package/lib/features/facets/DocumentsFacetsNav.d.ts +3 -3
  99. package/lib/features/facets/DocumentsFacetsNav.d.ts.map +1 -1
  100. package/lib/features/facets/DocumentsFacetsNav.js +20 -8
  101. package/lib/features/facets/DocumentsFacetsNav.js.map +1 -1
  102. package/lib/features/facets/InteractionsFacetsNav.d.ts +3 -3
  103. package/lib/features/facets/InteractionsFacetsNav.d.ts.map +1 -1
  104. package/lib/features/facets/InteractionsFacetsNav.js +11 -1
  105. package/lib/features/facets/InteractionsFacetsNav.js.map +1 -1
  106. package/lib/features/facets/PromptsFacetsNav.d.ts +3 -3
  107. package/lib/features/facets/PromptsFacetsNav.d.ts.map +1 -1
  108. package/lib/features/facets/PromptsFacetsNav.js +6 -1
  109. package/lib/features/facets/PromptsFacetsNav.js.map +1 -1
  110. package/lib/features/facets/RunsFacetsNav.d.ts +4 -14
  111. package/lib/features/facets/RunsFacetsNav.d.ts.map +1 -1
  112. package/lib/features/facets/RunsFacetsNav.js +26 -15
  113. package/lib/features/facets/RunsFacetsNav.js.map +1 -1
  114. package/lib/features/facets/WorkflowExecutionsFacetsNav.d.ts +4 -3
  115. package/lib/features/facets/WorkflowExecutionsFacetsNav.d.ts.map +1 -1
  116. package/lib/features/facets/WorkflowExecutionsFacetsNav.js +18 -10
  117. package/lib/features/facets/WorkflowExecutionsFacetsNav.js.map +1 -1
  118. package/lib/features/facets/index.d.ts +1 -1
  119. package/lib/features/facets/index.d.ts.map +1 -1
  120. package/lib/features/facets/index.js.map +1 -1
  121. package/lib/features/facets/utils/SearchInterface.d.ts +4 -3
  122. package/lib/features/facets/utils/SearchInterface.d.ts.map +1 -1
  123. package/lib/features/facets/utils/SearchInterface.js +4 -0
  124. package/lib/features/facets/utils/SearchInterface.js.map +1 -1
  125. package/lib/features/layout/GenericPageNavHeader.d.ts +8 -1
  126. package/lib/features/layout/GenericPageNavHeader.d.ts.map +1 -1
  127. package/lib/features/layout/GenericPageNavHeader.js +9 -1
  128. package/lib/features/layout/GenericPageNavHeader.js.map +1 -1
  129. package/lib/features/magic-pdf/DownloadPopover.d.ts +3 -2
  130. package/lib/features/magic-pdf/DownloadPopover.d.ts.map +1 -1
  131. package/lib/features/magic-pdf/DownloadPopover.js.map +1 -1
  132. package/lib/features/magic-pdf/GroundedExtractionView.d.ts.map +1 -1
  133. package/lib/features/magic-pdf/GroundedExtractionView.js +51 -64
  134. package/lib/features/magic-pdf/GroundedExtractionView.js.map +1 -1
  135. package/lib/features/oauth/McpConnectionsButton.d.ts +1 -1
  136. package/lib/features/oauth/McpConnectionsButton.d.ts.map +1 -1
  137. package/lib/features/oauth/McpConnectionsButton.js +2 -2
  138. package/lib/features/oauth/McpConnectionsButton.js.map +1 -1
  139. package/lib/features/oauth/McpConnectionsDialog.d.ts +1 -1
  140. package/lib/features/oauth/McpConnectionsDialog.js +2 -2
  141. package/lib/features/oauth/McpConnectionsDialog.js.map +1 -1
  142. package/lib/features/oauth/useMcpConnections.d.ts +4 -5
  143. package/lib/features/oauth/useMcpConnections.d.ts.map +1 -1
  144. package/lib/features/oauth/useMcpConnections.js +20 -4
  145. package/lib/features/oauth/useMcpConnections.js.map +1 -1
  146. package/lib/features/pdf-viewer/PdfPageRenderer.d.ts.map +1 -1
  147. package/lib/features/pdf-viewer/PdfPageRenderer.js +9 -11
  148. package/lib/features/pdf-viewer/PdfPageRenderer.js.map +1 -1
  149. package/lib/features/pdf-viewer/lazyReactPdf.d.ts +10 -0
  150. package/lib/features/pdf-viewer/lazyReactPdf.d.ts.map +1 -0
  151. package/lib/features/pdf-viewer/lazyReactPdf.js +25 -0
  152. package/lib/features/pdf-viewer/lazyReactPdf.js.map +1 -0
  153. package/lib/features/store/collections/CollectionsTable.d.ts.map +1 -1
  154. package/lib/features/store/collections/CollectionsTable.js +1 -3
  155. package/lib/features/store/collections/CollectionsTable.js.map +1 -1
  156. package/lib/features/store/collections/EditCollectionView.js +1 -1
  157. package/lib/features/store/collections/EditCollectionView.js.map +1 -1
  158. package/lib/features/store/objects/ExportPropertiesModal.d.ts +3 -1
  159. package/lib/features/store/objects/ExportPropertiesModal.d.ts.map +1 -1
  160. package/lib/features/store/objects/ExportPropertiesModal.js +5 -5
  161. package/lib/features/store/objects/ExportPropertiesModal.js.map +1 -1
  162. package/lib/features/store/objects/components/ContentOverview.d.ts.map +1 -1
  163. package/lib/features/store/objects/components/ContentOverview.js +4 -10
  164. package/lib/features/store/objects/components/ContentOverview.js.map +1 -1
  165. package/lib/features/store/objects/components/TextEditorPanel.d.ts.map +1 -1
  166. package/lib/features/store/objects/components/TextEditorPanel.js +8 -3
  167. package/lib/features/store/objects/components/TextEditorPanel.js.map +1 -1
  168. package/lib/features/store/objects/layout/renderers.d.ts.map +1 -1
  169. package/lib/features/store/objects/layout/renderers.js +1 -5
  170. package/lib/features/store/objects/layout/renderers.js.map +1 -1
  171. package/lib/features/store/objects/search/DocumentSearchContext.d.ts +29 -62
  172. package/lib/features/store/objects/search/DocumentSearchContext.d.ts.map +1 -1
  173. package/lib/features/store/objects/search/DocumentSearchContext.js +2 -0
  174. package/lib/features/store/objects/search/DocumentSearchContext.js.map +1 -1
  175. package/lib/features/store/objects/upload/DocumentUploadModal.d.ts +6 -1
  176. package/lib/features/store/objects/upload/DocumentUploadModal.d.ts.map +1 -1
  177. package/lib/features/store/objects/upload/DocumentUploadModal.js +4 -3
  178. package/lib/features/store/objects/upload/DocumentUploadModal.js.map +1 -1
  179. package/lib/features/store/objects/upload/useSmartFileUploadProcessing.d.ts.map +1 -1
  180. package/lib/features/store/objects/upload/useSmartFileUploadProcessing.js +2 -2
  181. package/lib/features/store/objects/upload/useSmartFileUploadProcessing.js.map +1 -1
  182. package/lib/features/store/types/ContentObjectTypesTable.d.ts.map +1 -1
  183. package/lib/features/store/types/ContentObjectTypesTable.js +1 -3
  184. package/lib/features/store/types/ContentObjectTypesTable.js.map +1 -1
  185. package/lib/features/store/types/IntakePolicyEditor.d.ts.map +1 -1
  186. package/lib/features/store/types/IntakePolicyEditor.js +11 -1
  187. package/lib/features/store/types/IntakePolicyEditor.js.map +1 -1
  188. package/lib/features/store/types/ObjectSchemaEditor.d.ts.map +1 -1
  189. package/lib/features/store/types/ObjectSchemaEditor.js +6 -2
  190. package/lib/features/store/types/ObjectSchemaEditor.js.map +1 -1
  191. package/lib/features/store/types/TableLayoutEditor.d.ts.map +1 -1
  192. package/lib/features/store/types/TableLayoutEditor.js +2 -0
  193. package/lib/features/store/types/TableLayoutEditor.js.map +1 -1
  194. package/lib/features/store/types/TypeRegistry.d.ts +272 -0
  195. package/lib/features/store/types/TypeRegistry.d.ts.map +1 -1
  196. package/lib/features/store/types/search/ObjectTypeSearchContext.d.ts +271 -0
  197. package/lib/features/store/types/search/ObjectTypeSearchContext.d.ts.map +1 -1
  198. package/lib/features/user/UserInfo.d.ts.map +1 -1
  199. package/lib/features/user/UserInfo.js +2 -4
  200. package/lib/features/user/UserInfo.js.map +1 -1
  201. package/lib/features/views/ViewActions.d.ts +32 -0
  202. package/lib/features/views/ViewActions.d.ts.map +1 -0
  203. package/lib/features/views/ViewActions.js +186 -0
  204. package/lib/features/views/ViewActions.js.map +1 -0
  205. package/lib/features/views/ViewDropTarget.d.ts +15 -0
  206. package/lib/features/views/ViewDropTarget.d.ts.map +1 -0
  207. package/lib/features/views/ViewDropTarget.js +79 -0
  208. package/lib/features/views/ViewDropTarget.js.map +1 -0
  209. package/lib/features/views/ViewExperience.d.ts +3 -2
  210. package/lib/features/views/ViewExperience.d.ts.map +1 -1
  211. package/lib/features/views/ViewExperience.js +103 -12
  212. package/lib/features/views/ViewExperience.js.map +1 -1
  213. package/lib/features/views/ViewNavigation.d.ts +1 -1
  214. package/lib/features/views/ViewNavigation.d.ts.map +1 -1
  215. package/lib/features/views/ViewNavigation.js +14 -5
  216. package/lib/features/views/ViewNavigation.js.map +1 -1
  217. package/lib/features/views/ViewResults.d.ts +1 -1
  218. package/lib/features/views/ViewResults.d.ts.map +1 -1
  219. package/lib/features/views/ViewResults.js +124 -34
  220. package/lib/features/views/ViewResults.js.map +1 -1
  221. package/lib/features/views/index.d.ts +1 -0
  222. package/lib/features/views/index.d.ts.map +1 -1
  223. package/lib/features/views/index.js +1 -0
  224. package/lib/features/views/index.js.map +1 -1
  225. package/lib/features/views/types.d.ts +46 -1
  226. package/lib/features/views/types.d.ts.map +1 -1
  227. package/lib/features/views/viewState.d.ts.map +1 -1
  228. package/lib/features/views/viewState.js +34 -0
  229. package/lib/features/views/viewState.js.map +1 -1
  230. package/lib/i18n/LanguageProvider.d.ts +3 -1
  231. package/lib/i18n/LanguageProvider.d.ts.map +1 -1
  232. package/lib/i18n/LanguageProvider.js +9 -7
  233. package/lib/i18n/LanguageProvider.js.map +1 -1
  234. package/lib/i18n/instance.d.ts +2 -0
  235. package/lib/i18n/instance.d.ts.map +1 -1
  236. package/lib/i18n/instance.js +45 -26
  237. package/lib/i18n/instance.js.map +1 -1
  238. package/lib/i18n/locales/ar.json +261 -15
  239. package/lib/i18n/locales/de.json +259 -13
  240. package/lib/i18n/locales/en.json +30 -4
  241. package/lib/i18n/locales/es.json +260 -14
  242. package/lib/i18n/locales/fr.json +259 -13
  243. package/lib/i18n/locales/it.json +259 -13
  244. package/lib/i18n/locales/ja.json +257 -10
  245. package/lib/i18n/locales/ko.json +257 -10
  246. package/lib/i18n/locales/pt.json +259 -13
  247. package/lib/i18n/locales/ru.json +256 -10
  248. package/lib/i18n/locales/tr.json +256 -10
  249. package/lib/i18n/locales/zh-TW.json +257 -10
  250. package/lib/i18n/locales/zh.json +257 -10
  251. package/lib/session/UserSessionProvider.d.ts.map +1 -1
  252. package/lib/session/UserSessionProvider.js +8 -16
  253. package/lib/session/UserSessionProvider.js.map +1 -1
  254. package/lib/session/auth/composable.d.ts.map +1 -1
  255. package/lib/session/auth/composable.js +25 -19
  256. package/lib/session/auth/composable.js.map +1 -1
  257. package/lib/session/auth/firebase.js +1 -1
  258. package/lib/session/auth/firebase.js.map +1 -1
  259. package/lib/shell/VertesiaShell.d.ts.map +1 -1
  260. package/lib/shell/VertesiaShell.js +2 -1
  261. package/lib/shell/VertesiaShell.js.map +1 -1
  262. package/lib/shell/apps/AppInstallationProvider.d.ts +4 -2
  263. package/lib/shell/apps/AppInstallationProvider.d.ts.map +1 -1
  264. package/lib/shell/apps/IframeAppContextSync.d.ts +3 -0
  265. package/lib/shell/apps/IframeAppContextSync.d.ts.map +1 -0
  266. package/lib/shell/apps/IframeAppContextSync.js +95 -0
  267. package/lib/shell/apps/IframeAppContextSync.js.map +1 -0
  268. package/lib/shell/apps/iframe-auth.d.ts +55 -0
  269. package/lib/shell/apps/iframe-auth.d.ts.map +1 -0
  270. package/lib/shell/apps/iframe-auth.js +154 -0
  271. package/lib/shell/apps/iframe-auth.js.map +1 -0
  272. package/lib/shell/apps/index.d.ts +2 -0
  273. package/lib/shell/apps/index.d.ts.map +1 -1
  274. package/lib/shell/apps/index.js +2 -0
  275. package/lib/shell/apps/index.js.map +1 -1
  276. package/lib/vertesia-ui-core.js +4 -4
  277. package/lib/vertesia-ui-core.js.map +1 -1
  278. package/lib/vertesia-ui-env.js +1 -1
  279. package/lib/vertesia-ui-env.js.map +1 -1
  280. package/lib/vertesia-ui-features.js +32 -34
  281. package/lib/vertesia-ui-features.js.map +1 -1
  282. package/lib/vertesia-ui-i18n.js +16 -16
  283. package/lib/vertesia-ui-i18n.js.map +1 -1
  284. package/lib/vertesia-ui-rich-text.js +4 -4
  285. package/lib/vertesia-ui-rich-text.js.map +1 -1
  286. package/lib/vertesia-ui-router.js +1 -1
  287. package/lib/vertesia-ui-router.js.map +1 -1
  288. package/lib/vertesia-ui-session.js +1 -1
  289. package/lib/vertesia-ui-session.js.map +1 -1
  290. package/lib/vertesia-ui-shell.js +1 -1
  291. package/lib/vertesia-ui-shell.js.map +1 -1
  292. package/lib/vertesia-ui-widgets.js +20 -20
  293. package/lib/vertesia-ui-widgets.js.map +1 -1
  294. package/lib/widgets/markdown/MarkdownRenderer.d.ts.map +1 -1
  295. package/lib/widgets/markdown/MarkdownRenderer.js +43 -2
  296. package/lib/widgets/markdown/MarkdownRenderer.js.map +1 -1
  297. package/lib/widgets/markdown/MermaidDiagram.d.ts.map +1 -1
  298. package/lib/widgets/markdown/MermaidDiagram.js +35 -22
  299. package/lib/widgets/markdown/MermaidDiagram.js.map +1 -1
  300. package/lib/widgets/monacoEditor/MonacoEditor.d.ts.map +1 -1
  301. package/lib/widgets/monacoEditor/MonacoEditor.js +14 -10
  302. package/lib/widgets/monacoEditor/MonacoEditor.js.map +1 -1
  303. package/lib/widgets/xml-viewer/hooks/useCollapsible.d.ts +1 -1
  304. package/package.json +24 -29
  305. package/src/core/components/shadcn/filters/comboBox/DateCombobox.tsx +1 -1
  306. package/src/core/components/shadcn/filters/filter/dateFilter.tsx +1 -1
  307. package/src/core/components/shadcn/filters/filters.tsx +1 -1
  308. package/src/core/components/shadcn/index.ts +1 -0
  309. package/src/core/components/shadcn/modal/dialog.test.tsx +35 -0
  310. package/src/core/components/shadcn/modal/dialog.tsx +0 -4
  311. package/src/core/components/shadcn/overflowTabs.tsx +320 -0
  312. package/src/core/components/shadcn/selectBox.tsx +2 -2
  313. package/src/core/components/shadcn/theme/ThemeProvider.tsx +10 -9
  314. package/src/core/utils/dayjs.ts +17 -0
  315. package/src/css/base.css +78 -0
  316. package/src/env/index.test.ts +94 -0
  317. package/src/env/index.ts +36 -1
  318. package/src/features/agent/PayloadBuilder.test.ts +68 -0
  319. package/src/features/agent/PayloadBuilder.tsx +28 -4
  320. package/src/features/agent/chat/AgentRightPanel.tsx +2 -252
  321. package/src/features/agent/chat/ArtifactsTab.tsx +1 -0
  322. package/src/features/agent/chat/AskUserWidget.test.tsx +20 -1
  323. package/src/features/agent/chat/AskUserWidget.tsx +22 -6
  324. package/src/features/agent/chat/ModernAgentConversation.test.tsx +160 -0
  325. package/src/features/agent/chat/ModernAgentConversation.tsx +111 -31
  326. package/src/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.tsx +86 -67
  327. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.test.tsx +90 -7
  328. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +4 -6
  329. package/src/features/agent/chat/ModernAgentOutput/AttachmentPreview.test.ts +103 -1
  330. package/src/features/agent/chat/ModernAgentOutput/AttachmentPreview.tsx +50 -4
  331. package/src/features/agent/chat/ModernAgentOutput/BatchProgressPanel.tsx +1 -1
  332. package/src/features/agent/chat/ModernAgentOutput/Header.tsx +18 -1
  333. package/src/features/agent/chat/ModernAgentOutput/MessageItem.tsx +1 -1
  334. package/src/features/agent/chat/ModernAgentOutput/StreamingMessage.tsx +1 -1
  335. package/src/features/agent/chat/ModernAgentOutput/ToolCallGroup.tsx +1 -1
  336. package/src/features/agent/chat/ModernAgentOutput/WorkstreamTabs.tsx +37 -167
  337. package/src/features/agent/chat/ModernAgentOutput/utils.test.ts +94 -0
  338. package/src/features/agent/chat/ModernAgentOutput/utils.ts +19 -10
  339. package/src/features/agent/chat/VegaLiteChart.tsx +32 -14
  340. package/src/features/agent/chat/hooks/useAgentStream.test.tsx +18 -0
  341. package/src/features/agent/chat/hooks/useAgentStream.ts +3 -0
  342. package/src/features/document-viewer/UniversalDocumentViewer.tsx +1 -1
  343. package/src/features/facets/AgentRunnerFacetsNav.tsx +44 -4
  344. package/src/features/facets/CollectionsFacetsNav.tsx +15 -4
  345. package/src/features/facets/DocumentsFacetsNav.tsx +25 -8
  346. package/src/features/facets/FacetQueryHandlers.test.ts +84 -0
  347. package/src/features/facets/InteractionsFacetsNav.tsx +20 -4
  348. package/src/features/facets/PromptsFacetsNav.tsx +15 -4
  349. package/src/features/facets/RunsFacetsNav.test.ts +59 -0
  350. package/src/features/facets/RunsFacetsNav.tsx +40 -30
  351. package/src/features/facets/WorkflowExecutionsFacetsNav.test.ts +57 -0
  352. package/src/features/facets/WorkflowExecutionsFacetsNav.tsx +36 -16
  353. package/src/features/facets/index.ts +1 -0
  354. package/src/features/facets/utils/SearchInterface.tsx +12 -3
  355. package/src/features/layout/GenericPageNavHeader.tsx +16 -0
  356. package/src/features/magic-pdf/DownloadPopover.tsx +1 -2
  357. package/src/features/magic-pdf/GroundedExtractionView.test.tsx +7 -1
  358. package/src/features/magic-pdf/GroundedExtractionView.tsx +162 -242
  359. package/src/features/oauth/McpConnectionsButton.test.tsx +18 -1
  360. package/src/features/oauth/McpConnectionsButton.tsx +6 -2
  361. package/src/features/oauth/McpConnectionsDialog.tsx +3 -3
  362. package/src/features/oauth/useMcpConnections.test.ts +1 -0
  363. package/src/features/oauth/useMcpConnections.ts +24 -7
  364. package/src/features/pdf-viewer/PdfPageRenderer.tsx +76 -71
  365. package/src/features/pdf-viewer/lazyReactPdf.ts +33 -0
  366. package/src/features/store/collections/CollectionsTable.tsx +1 -4
  367. package/src/features/store/collections/EditCollectionView.tsx +1 -1
  368. package/src/features/store/objects/ExportPropertiesModal.tsx +25 -16
  369. package/src/features/store/objects/components/ContentOverview.tsx +2 -28
  370. package/src/features/store/objects/components/TextEditorPanel.tsx +13 -3
  371. package/src/features/store/objects/layout/renderers.tsx +1 -6
  372. package/src/features/store/objects/search/DocumentSearchContext.ts +4 -2
  373. package/src/features/store/objects/upload/DocumentUploadModal.tsx +10 -3
  374. package/src/features/store/objects/upload/useSmartFileUploadProcessing.ts +15 -6
  375. package/src/features/store/types/ContentObjectTypesTable.tsx +1 -4
  376. package/src/features/store/types/IntakePolicyEditor.tsx +11 -1
  377. package/src/features/store/types/ObjectSchemaEditor.tsx +6 -2
  378. package/src/features/store/types/TableLayoutEditor.tsx +2 -0
  379. package/src/features/user/UserInfo.test.tsx +10 -0
  380. package/src/features/user/UserInfo.tsx +2 -7
  381. package/src/features/views/ViewActions.test.tsx +80 -0
  382. package/src/features/views/ViewActions.tsx +352 -0
  383. package/src/features/views/ViewDropTarget.test.tsx +150 -0
  384. package/src/features/views/ViewDropTarget.tsx +140 -0
  385. package/src/features/views/ViewExperience.test.tsx +72 -0
  386. package/src/features/views/ViewExperience.tsx +189 -22
  387. package/src/features/views/ViewMedia.test.tsx +180 -0
  388. package/src/features/views/ViewNavigation.test.tsx +42 -0
  389. package/src/features/views/ViewNavigation.tsx +43 -5
  390. package/src/features/views/ViewResults.tsx +243 -26
  391. package/src/features/views/index.ts +1 -0
  392. package/src/features/views/types.ts +50 -0
  393. package/src/features/views/viewState.test.ts +7 -1
  394. package/src/features/views/viewState.ts +32 -0
  395. package/src/i18n/LanguageProvider.tsx +15 -8
  396. package/src/i18n/instance.test.ts +30 -0
  397. package/src/i18n/instance.ts +67 -40
  398. package/src/i18n/locales/ar.json +1157 -911
  399. package/src/i18n/locales/de.json +1113 -867
  400. package/src/i18n/locales/en.json +30 -4
  401. package/src/i18n/locales/es.json +1124 -878
  402. package/src/i18n/locales/fr.json +1124 -878
  403. package/src/i18n/locales/it.json +1124 -878
  404. package/src/i18n/locales/ja.json +1113 -866
  405. package/src/i18n/locales/ko.json +1113 -866
  406. package/src/i18n/locales/pt.json +1124 -878
  407. package/src/i18n/locales/ru.json +1135 -889
  408. package/src/i18n/locales/tr.json +1113 -867
  409. package/src/i18n/locales/zh-TW.json +1113 -866
  410. package/src/i18n/locales/zh.json +1113 -866
  411. package/src/i18n/rtl.test.ts +16 -7
  412. package/src/rich-text/VertesiaRichTextEditor.test.tsx +33 -1
  413. package/src/session/UserSessionProvider.tsx +8 -20
  414. package/src/session/auth/composable.scope.test.ts +1 -1
  415. package/src/session/auth/composable.test.ts +61 -1
  416. package/src/session/auth/composable.ts +29 -23
  417. package/src/session/auth/firebase.ts +1 -1
  418. package/src/shell/VertesiaShell.tsx +2 -0
  419. package/src/shell/apps/IframeAppContextSync.test.tsx +196 -0
  420. package/src/shell/apps/IframeAppContextSync.tsx +101 -0
  421. package/src/shell/apps/iframe-auth.test.ts +118 -0
  422. package/src/shell/apps/iframe-auth.ts +193 -0
  423. package/src/shell/apps/index.ts +2 -0
  424. package/src/widgets/markdown/ArtifactEditingSurface.test.tsx +12 -3
  425. package/src/widgets/markdown/MarkdownRenderer.tsx +50 -2
  426. package/src/widgets/markdown/MermaidDiagram.tsx +38 -22
  427. package/src/widgets/monacoEditor/MonacoEditor.tsx +27 -20
  428. package/lib/features/magic-pdf/GroundedExtractionAssistantPanel.d.ts +0 -25
  429. package/lib/features/magic-pdf/GroundedExtractionAssistantPanel.d.ts.map +0 -1
  430. package/lib/features/magic-pdf/GroundedExtractionAssistantPanel.js +0 -42
  431. package/lib/features/magic-pdf/GroundedExtractionAssistantPanel.js.map +0 -1
  432. package/src/features/magic-pdf/GroundedExtractionAssistantPanel.tsx +0 -86
@@ -2,8 +2,10 @@ import {
2
2
  Badge,
3
3
  Button,
4
4
  cn,
5
+ Dropdown,
5
6
  ErrorBox,
6
7
  errorMessage,
8
+ MenuItem,
7
9
  ResizableHandle,
8
10
  ResizablePanel,
9
11
  ResizablePanelGroup,
@@ -13,21 +15,23 @@ import {
13
15
  } from '@vertesia/ui/core';
14
16
  import { useUITranslation } from '@vertesia/ui/i18n';
15
17
  import { useUserSession } from '@vertesia/ui/session';
18
+ import { computeTitleFromName } from '@vertesia/ui/widgets';
16
19
  import {
17
20
  CheckCircle2,
18
21
  ChevronLeft,
19
22
  ChevronRight,
23
+ Download,
20
24
  Eye,
21
25
  FileDown,
22
26
  FileJson2,
23
27
  FileText,
24
28
  Grid3X3,
25
29
  Image as ImageIcon,
30
+ Info,
26
31
  Sparkles,
27
32
  X,
28
33
  } from 'lucide-react';
29
- import { useEffect, useMemo, useState } from 'react';
30
- import { GroundedExtractionAssistantPanel } from './GroundedExtractionAssistantPanel';
34
+ import { Fragment, useEffect, useMemo, useState } from 'react';
31
35
 
32
36
  const ADVANCED_PROCESSING_PREFIX = 'magic-pdf';
33
37
 
@@ -173,7 +177,6 @@ export function GroundedExtractionPanel({ objectId, onClose }: GroundedExtractio
173
177
  data: extraction,
174
178
  error,
175
179
  isLoading,
176
- refetch,
177
180
  } = useFetch<GroundedExtractionFile>(async () => {
178
181
  const response = await client.files.getDownloadUrl(
179
182
  `${ADVANCED_PROCESSING_PREFIX}/${objectId}/grounded-extraction.json`,
@@ -210,12 +213,7 @@ export function GroundedExtractionPanel({ objectId, onClose }: GroundedExtractio
210
213
 
211
214
  return (
212
215
  <div className="relative h-full">
213
- <GroundedExtractionViewImpl
214
- extraction={extraction}
215
- objectId={objectId}
216
- onClose={onClose}
217
- onExtractionChanged={refetch}
218
- />
216
+ <GroundedExtractionViewImpl extraction={extraction} objectId={objectId} onClose={onClose} />
219
217
  </div>
220
218
  );
221
219
  }
@@ -235,12 +233,10 @@ function GroundedExtractionViewImpl({
235
233
  extraction,
236
234
  objectId,
237
235
  onClose,
238
- onExtractionChanged,
239
236
  }: {
240
237
  extraction: GroundedExtractionFile;
241
238
  objectId: string;
242
239
  onClose?: () => void;
243
- onExtractionChanged?: () => void;
244
240
  }) {
245
241
  const { t } = useUITranslation();
246
242
  const { client } = useUserSession();
@@ -262,10 +258,8 @@ function GroundedExtractionViewImpl({
262
258
  };
263
259
  const [page, setPage] = useState(pageNumbers[0] ?? 1);
264
260
  const [selectedPath, setSelectedPath] = useState<string | undefined>(undefined);
265
- const [showBreakdown, setShowBreakdown] = useState(false);
266
- const [showVerdict, setShowVerdict] = useState(false);
261
+ const [showDetails, setShowDetails] = useState(false);
267
262
  const [pageImageMode, setPageImageMode] = useState<PageImageMode>('original');
268
- const [assistantOpen, setAssistantOpen] = useState(false);
269
263
 
270
264
  const breakdown = useMemo(() => {
271
265
  const groups = { digital: 0, ocr: 0, reviewerConfirmed: 0, snapped: 0, imageRead: 0 };
@@ -314,6 +308,7 @@ function GroundedExtractionViewImpl({
314
308
  }, [extraction.citations]);
315
309
 
316
310
  const totalCitations = extraction.citations.length;
311
+ const allVerified = breakdown.totalVerified === totalCitations;
317
312
 
318
313
  const selectPath = (path: string) => {
319
314
  setSelectedPath(path);
@@ -357,7 +352,7 @@ function GroundedExtractionViewImpl({
357
352
  >
358
353
  <ChevronLeft className="size-4" />
359
354
  </Button>
360
- <span className="text-xs text-muted-foreground">
355
+ <span className="text-xs text-muted">
361
356
  {t('pdf.pageOf', { pageNumber: page, totalPages: pageNumbers.length })}
362
357
  </span>
363
358
  <Button
@@ -418,128 +413,48 @@ function GroundedExtractionViewImpl({
418
413
  <div className="flex h-9 items-center justify-between shrink-0 bg-sidebar px-2 border-b border-sidebar-border">
419
414
  <span className="text-sm font-medium">{t('grounded.title')}</span>
420
415
  <div className="flex items-center gap-2">
421
- <VTooltip description={t('grounded.assistantTooltip')} placement="bottom" size="xs" asChild>
422
- <Button
423
- variant={assistantOpen ? 'primary' : 'ghost'}
424
- size="xs"
425
- aria-label={t('grounded.assistant')}
426
- onClick={() => setAssistantOpen((v) => !v)}
427
- >
428
- <Sparkles className="size-4" />
429
- </Button>
430
- </VTooltip>
431
- {extraction.verdict && (
432
- <button
433
- type="button"
434
- className="cursor-pointer"
435
- onClick={() => setShowVerdict((v) => !v)}
436
- aria-expanded={showVerdict}
437
- aria-label={t('grounded.verdictDetails')}
438
- >
439
- <Badge variant={extraction.verdict === 'good_to_go' ? 'success' : 'attention'}>
440
- {extraction.verdict === 'good_to_go'
441
- ? t('grounded.verdictGoodToGo')
442
- : t('grounded.verdictNeedsReview')}
443
- </Badge>
444
- </button>
445
- )}
446
- {typeof extraction.hardness?.score === 'number' && (
447
- <Badge
448
- variant={
449
- extraction.hardness.score >= 0.5
450
- ? 'attention'
451
- : extraction.hardness.score >= 0.2
452
- ? 'info'
453
- : 'secondary'
454
- }
455
- title={t('grounded.hardnessHint')}
456
- >
457
- {t('grounded.hardness', {
458
- percent: Math.round(extraction.hardness.score * 100),
459
- })}
460
- {extraction.hardness.escalated ? ' ↑' : ''}
461
- </Badge>
462
- )}
463
- {extraction.citations.length > 0 &&
464
- (() => {
465
- // Real verification: fraction of values actually confirmed —
466
- // digitally (verbatim/OCR match) OR by the reviewer against the
467
- // image. NOT mean confidence, which scores image-read values high
468
- // even when nothing was verified (e.g. 98% "confidence" on 2/64).
469
- const verifiedPct = Math.round(
470
- (100 * breakdown.totalVerified) / extraction.citations.length,
471
- );
472
- return (
473
- <Badge
474
- variant={
475
- verifiedPct >= 95
476
- ? 'success'
477
- : verifiedPct >= 50
478
- ? 'attention'
479
- : 'destructive'
480
- }
481
- title={t('grounded.confidenceHint')}
482
- >
483
- {t('grounded.confidence', { percent: verifiedPct })}
484
- </Badge>
485
- );
486
- })()}
487
- <button
488
- type="button"
489
- className="flex cursor-pointer items-center gap-1"
490
- onClick={() => setShowBreakdown((v) => !v)}
491
- aria-expanded={showBreakdown}
492
- aria-label={t('grounded.breakdownTitle')}
493
- >
494
- {breakdown.digitallyVerified > 0 && (
495
- <Badge variant="success" title={t('grounded.digitalVerifiedHint')}>
496
- {t('grounded.digitalVerifiedOf', {
497
- count: breakdown.digitallyVerified,
416
+ {totalCitations > 0 && (
417
+ <VTooltip description={t('grounded.confidenceHint')} placement="bottom" size="xs" asChild>
418
+ <Badge
419
+ variant={allVerified ? 'success' : 'attention'}
420
+ className="gap-1 text-nowrap cursor-pointer"
421
+ onClick={() => setShowDetails((v) => !v)}
422
+ aria-expanded={showDetails}
423
+ >
424
+ {allVerified ? <CheckCircle2 className="size-3.5" /> : <Eye className="size-3.5" />}
425
+ {t('grounded.verifiedOf', {
426
+ verified: breakdown.totalVerified,
498
427
  total: totalCitations,
499
428
  })}
500
429
  </Badge>
501
- )}
502
- {breakdown.modelVerified > 0 && (
503
- <Badge variant="success" title={t('grounded.modelVerifiedHint')}>
504
- {t('grounded.modelVerifiedOf', {
505
- count: breakdown.modelVerified,
506
- total: totalCitations,
507
- })}
508
- </Badge>
509
- )}
510
- {breakdown.groups.imageRead > 0 && (
511
- <Badge variant="attention" title={t('grounded.unverifiedHint')}>
512
- {t('grounded.unverifiedCount', { count: breakdown.groups.imageRead })}
513
- </Badge>
514
- )}
515
- </button>
516
- <Button
517
- variant="ghost"
518
- size="xs"
519
- aria-label={t('grounded.downloadCitations')}
520
- title={t('grounded.downloadCitations')}
521
- onClick={() => downloadArtifact('grounded-extraction.json')}
522
- >
523
- <FileJson2 className="size-4" />
524
- </Button>
525
- <Button
526
- variant="ghost"
527
- size="xs"
528
- aria-label={t('grounded.downloadBlocks')}
529
- title={t('grounded.downloadBlocks')}
530
- onClick={() => downloadArtifact(`pages/page-${page}.json`)}
531
- >
532
- <FileText className="size-4" />
533
- </Button>
534
- <Button
535
- variant="ghost"
536
- size="xs"
537
- aria-label={t('grounded.downloadAnnotated')}
538
- title={t('grounded.downloadAnnotated')}
539
- onClick={() => downloadArtifact('grounded-annotated.pdf')}
430
+ </VTooltip>
431
+ )}
432
+ <Dropdown
433
+ align="right"
434
+ trigger={
435
+ <Button
436
+ variant="ghost"
437
+ size="xs"
438
+ aria-label={t('pdf.download')}
439
+ title={t('pdf.download')}
440
+ >
441
+ <Download className="size-4" />
442
+ </Button>
443
+ }
540
444
  >
541
- <FileDown className="size-4" />
542
- </Button>
445
+ <MenuItem className="text-xs" onClick={() => downloadArtifact('grounded-extraction.json')}>
446
+ <FileJson2 className="size-4" />
447
+ {t('grounded.downloadCitations')}
448
+ </MenuItem>
449
+ <MenuItem className="text-xs" onClick={() => downloadArtifact(`pages/page-${page}.json`)}>
450
+ <FileText className="size-4" />
451
+ {t('grounded.downloadBlocks')}
452
+ </MenuItem>
453
+ <MenuItem className="text-xs" onClick={() => downloadArtifact('grounded-annotated.pdf')}>
454
+ <FileDown className="size-4" />
455
+ {t('grounded.downloadAnnotated')}
456
+ </MenuItem>
457
+ </Dropdown>
543
458
  {!!onClose && (
544
459
  <Button variant="ghost" size="xs" onClick={onClose} aria-label={t('pdf.close')}>
545
460
  <X className="size-4" />
@@ -547,49 +462,14 @@ function GroundedExtractionViewImpl({
547
462
  )}
548
463
  </div>
549
464
  </div>
550
- {showVerdict && extraction.verdict && (
551
- <div className="shrink-0 border-b border-border bg-background px-3 py-2 text-sm">
552
- <div className="flex items-center gap-2">
553
- <span
554
- className={cn(
555
- 'font-medium',
556
- extraction.verdict === 'good_to_go' ? 'text-success' : 'text-attention',
557
- )}
558
- >
559
- {extraction.verdict === 'good_to_go'
560
- ? t('grounded.verdictGoodToGo')
561
- : t('grounded.verdictNeedsReview')}
562
- </span>
563
- <span className="text-xs text-muted-foreground">
564
- {extraction.review
565
- ? t('grounded.verdictByReviewer')
566
- : t('grounded.verdictByConfidence')}
567
- </span>
568
- </div>
569
- {(extraction.verdict_reason ?? extraction.review?.verdict_reason) && (
570
- <p className="mt-1 text-xs">
571
- {extraction.verdict_reason ?? extraction.review?.verdict_reason}
572
- </p>
573
- )}
574
- {extraction.review?.summary && (
575
- <p className="mt-2 text-xs text-muted-foreground">
576
- <span className="font-medium text-foreground">{t('grounded.reviewSummary')}: </span>
577
- {extraction.review.summary}
578
- </p>
579
- )}
580
- {typeof extraction.review?.corrections_applied === 'number' &&
581
- extraction.review.corrections_applied > 0 && (
582
- <p className="mt-1 text-xs text-info">
583
- {t('grounded.reviewCorrections', {
584
- count: extraction.review.corrections_applied,
585
- })}
586
- </p>
587
- )}
588
- </div>
589
- )}
590
- {showBreakdown && (
465
+ {showDetails && (
591
466
  <div className="shrink-0 border-b border-border bg-background px-3 py-2 text-sm max-h-72 overflow-auto">
592
- <div className="font-medium mb-1">{t('grounded.breakdownTitle')}</div>
467
+ <div className="mb-1 flex items-center gap-1">
468
+ <span className="font-medium">{t('grounded.breakdownTitle')}</span>
469
+ <VTooltip description={t('grounded.breakdownVerificationHelp')} size="xs">
470
+ <Info className="size-3 text-muted" />
471
+ </VTooltip>
472
+ </div>
593
473
  <div className="grid grid-cols-2 gap-x-4 text-xs">
594
474
  <span className="col-span-2 mt-1 font-medium text-success">
595
475
  {t('grounded.digitalVerifiedOf', {
@@ -597,11 +477,11 @@ function GroundedExtractionViewImpl({
597
477
  total: totalCitations,
598
478
  })}
599
479
  </span>
600
- <span className="ps-2 text-muted-foreground">{t('grounded.breakdownDigital')}</span>
480
+ <span className="ps-2 text-muted">{t('grounded.breakdownDigital')}</span>
601
481
  <span className="text-end text-success">{breakdown.groups.digital}</span>
602
- <span className="ps-2 text-muted-foreground">{t('grounded.breakdownOcr')}</span>
482
+ <span className="ps-2 text-muted">{t('grounded.breakdownOcr')}</span>
603
483
  <span className="text-end text-success">{breakdown.groups.ocr}</span>
604
- <span className="ps-2 text-muted-foreground">{t('grounded.breakdownSnapped')}</span>
484
+ <span className="ps-2 text-muted">{t('grounded.breakdownSnapped')}</span>
605
485
  <span className="text-end text-success">{breakdown.groups.snapped}</span>
606
486
  <span className="col-span-2 mt-2 font-medium text-success">
607
487
  {t('grounded.modelVerifiedOf', {
@@ -609,24 +489,48 @@ function GroundedExtractionViewImpl({
609
489
  total: totalCitations,
610
490
  })}
611
491
  </span>
612
- <span className="ps-2 text-muted-foreground">{t('grounded.breakdownReviewer')}</span>
492
+ <span className="ps-2 text-muted">{t('grounded.breakdownReviewer')}</span>
613
493
  <span className="text-end text-success">{breakdown.groups.reviewerConfirmed}</span>
614
494
  {breakdown.groups.imageRead > 0 && (
615
495
  <>
616
496
  <span className="col-span-2 mt-2 font-medium text-attention">
617
497
  {t('grounded.unverifiedCount', { count: breakdown.groups.imageRead })}
618
498
  </span>
619
- <span className="ps-2 text-muted-foreground">
620
- {t('grounded.breakdownImageRead')}
621
- </span>
499
+ <span className="ps-2 text-muted">{t('grounded.breakdownImageRead')}</span>
622
500
  <span className="text-end text-attention">{breakdown.groups.imageRead}</span>
623
501
  </>
624
502
  )}
625
503
  </div>
626
- <p className="mt-2 text-xs text-muted-foreground">{t('grounded.breakdownVerificationHelp')}</p>
504
+ {typeof extraction.hardness?.score === 'number' && (
505
+ <p className="mt-2 text-xs text-muted" title={t('grounded.hardnessHint')}>
506
+ {t('grounded.hardness', {
507
+ percent: Math.round(extraction.hardness.score * 100),
508
+ })}
509
+ {extraction.hardness.escalated ? ' ↑' : ''}
510
+ </p>
511
+ )}
512
+ {(extraction.verdict_reason ?? extraction.review?.verdict_reason) && (
513
+ <p className="mt-2 text-xs">
514
+ {extraction.verdict_reason ?? extraction.review?.verdict_reason}
515
+ </p>
516
+ )}
517
+ {extraction.review?.summary && (
518
+ <p className="mt-2 text-xs text-muted">
519
+ <span className="font-medium text-foreground">{t('grounded.reviewSummary')}: </span>
520
+ {extraction.review.summary}
521
+ </p>
522
+ )}
523
+ {typeof extraction.review?.corrections_applied === 'number' &&
524
+ extraction.review.corrections_applied > 0 && (
525
+ <p className="mt-1 text-xs text-info">
526
+ {t('grounded.reviewCorrections', {
527
+ count: extraction.review.corrections_applied,
528
+ })}
529
+ </p>
530
+ )}
627
531
  {breakdown.unverified.length > 0 && (
628
532
  <div className="mt-2">
629
- <div className="text-xs font-medium text-muted-foreground mb-1">
533
+ <div className="text-xs font-medium text-muted mb-1">
630
534
  {t('grounded.breakdownUnverifiedList')}
631
535
  </div>
632
536
  <ul className="space-y-0.5">
@@ -637,10 +541,10 @@ function GroundedExtractionViewImpl({
637
541
  className="w-full text-start text-xs rounded px-1 py-0.5 hover:bg-muted cursor-pointer"
638
542
  onClick={() => {
639
543
  selectPath(c.path);
640
- setShowBreakdown(false);
544
+ setShowDetails(false);
641
545
  }}
642
546
  >
643
- <span className="text-muted-foreground">{c.path}</span>{' '}
547
+ <span className="text-muted">{c.path}</span>{' '}
644
548
  <span>{String(c.value ?? '')}</span>
645
549
  </button>
646
550
  </li>
@@ -666,19 +570,6 @@ function GroundedExtractionViewImpl({
666
570
  )}
667
571
  </div>
668
572
  </ResizablePanel>
669
- {assistantOpen && (
670
- <>
671
- <ResizableHandle className="w-[4px] bg-border cursor-ew-resize" />
672
- <ResizablePanel defaultSize={30} minSize={20} className="flex flex-col border-s border-border">
673
- <GroundedExtractionAssistantPanel
674
- objectId={objectId}
675
- onExtractionChanged={onExtractionChanged}
676
- selectedField={selectedPath}
677
- onClose={() => setAssistantOpen(false)}
678
- />
679
- </ResizablePanel>
680
- </>
681
- )}
682
573
  </ResizablePanelGroup>
683
574
  );
684
575
  }
@@ -741,35 +632,51 @@ function PageWithOverlay({
741
632
  : `${citation.cells.start}:${citation.cells.end}`
742
633
  : undefined;
743
634
  return (
744
- <button
635
+ <VTooltip
745
636
  key={`${citation.path}-${i}`}
746
- type="button"
747
- aria-label={citation.path}
748
- title={`${citation.path}${cellRange ? `\n${cellRange}` : ''}${citation.source_text ? `\n${citation.source_text}` : ''}`}
749
- onClick={() => onSelectPath(normalizeCitationPath(citation.path))}
750
- className={cn(
751
- 'absolute cursor-pointer border rounded-[1px] transition-colors',
752
- citation.misaligned && 'border-dashed',
753
- isSelected
754
- ? 'border-2 border-destructive bg-destructive/20 z-10'
755
- : selectedPath
756
- ? 'border-info/30 hover:border-info'
757
- : citation.verified
758
- ? 'border-success/70 hover:bg-success/20'
759
- : citation.reviewed
760
- ? 'border-info/70 hover:bg-info/20'
761
- : 'border-attention/80 hover:bg-attention/20',
762
- )}
763
- style={{
764
- // inline position: the app's button base styles override the
765
- // `absolute` utility class with position: relative
766
- position: 'absolute',
767
- left: `${(box.x / dims.width) * 100}%`,
768
- top: `${(box.y / dims.height) * 100}%`,
769
- width: `${(box.w / dims.width) * 100}%`,
770
- height: `${(box.h / dims.height) * 100}%`,
771
- }}
772
- />
637
+ description={
638
+ <span className="flex flex-col gap-0.5">
639
+ <span className="flex items-center gap-1 font-medium">
640
+ {citationPathLabels(citation.path).map((label, index) => (
641
+ <Fragment key={`${index}:${label}`}>
642
+ {index > 0 && <ChevronRight className="size-3 shrink-0 cn-rtl-flip" />}
643
+ {label}
644
+ </Fragment>
645
+ ))}
646
+ </span>
647
+ {cellRange && <span className="font-mono">{cellRange}</span>}
648
+ {citation.source_text && <span>{citation.source_text}</span>}
649
+ </span>
650
+ }
651
+ size="xs"
652
+ asChild
653
+ >
654
+ <button
655
+ type="button"
656
+ aria-label={citation.path}
657
+ onClick={() => onSelectPath(normalizeCitationPath(citation.path))}
658
+ className={cn(
659
+ 'absolute cursor-pointer border rounded-[1px] transition-colors',
660
+ citation.misaligned && 'border-dashed',
661
+ isSelected
662
+ ? 'border-2 border-primary bg-primary/20 z-10'
663
+ : citation.verified
664
+ ? 'border-success/70 hover:bg-success/20'
665
+ : citation.reviewed
666
+ ? 'border-info/70 hover:bg-info/20'
667
+ : 'border-attention/80 hover:bg-attention/20',
668
+ )}
669
+ style={{
670
+ // inline position: the app's button base styles override the
671
+ // `absolute` utility class with position: relative
672
+ position: 'absolute',
673
+ left: `${(box.x / dims.width) * 100}%`,
674
+ top: `${(box.y / dims.height) * 100}%`,
675
+ width: `${(box.w / dims.width) * 100}%`,
676
+ height: `${(box.h / dims.height) * 100}%`,
677
+ }}
678
+ />
679
+ </VTooltip>
773
680
  );
774
681
  }),
775
682
  );
@@ -876,11 +783,7 @@ function DataNode({
876
783
  child.every((item) => item !== null && typeof item === 'object');
877
784
  return (
878
785
  <div key={childPath} className="pt-1">
879
- {!rendersOwnLabel && (
880
- <div className="text-xs font-semibold text-muted-foreground uppercase tracking-wide">
881
- {key}
882
- </div>
883
- )}
786
+ {!rendersOwnLabel && <div className="text-sm font-semibold">{propertyTitle(key)}</div>}
884
787
  <DataNode
885
788
  value={child}
886
789
  path={childPath}
@@ -921,16 +824,16 @@ function ArrayTable({
921
824
 
922
825
  return (
923
826
  <div className="pt-1">
924
- <div className="text-xs font-semibold text-muted-foreground uppercase tracking-wide">
925
- {path.split('.').pop()} ({items.length})
827
+ <div className="text-sm font-semibold">
828
+ {propertyTitle(path.split('.').pop())} ({items.length})
926
829
  </div>
927
830
  <div className="overflow-x-auto">
928
831
  <table className="w-full text-xs">
929
832
  <thead>
930
- <tr className="text-start text-muted-foreground">
833
+ <tr className="text-start text-muted">
931
834
  {columns.map((col) => (
932
835
  <th key={col} scope="col" className="py-1 pe-2 font-medium">
933
- {col}
836
+ {propertyTitle(col)}
934
837
  </th>
935
838
  ))}
936
839
  </tr>
@@ -950,10 +853,10 @@ function ArrayTable({
950
853
  className={cn(
951
854
  'text-start rounded px-1 w-full',
952
855
  isSelected
953
- ? 'bg-destructive/15 ring-1 ring-destructive'
856
+ ? 'bg-primary/15 ring-1 ring-primary'
954
857
  : citation
955
858
  ? 'hover:bg-muted cursor-pointer'
956
- : 'text-muted-foreground cursor-default',
859
+ : 'text-muted cursor-default',
957
860
  )}
958
861
  >
959
862
  {formatValue(item[col])}
@@ -963,7 +866,7 @@ function ArrayTable({
963
866
  'ms-1 text-[10px]',
964
867
  scoreColor(citation.confidence),
965
868
  )}
966
- title={t('grounded.confidenceHint')}
869
+ title={t('grounded.scoreHint')}
967
870
  >
968
871
  {formatScore(citation.confidence)}
969
872
  </span>
@@ -1006,16 +909,16 @@ function LeafRow({
1006
909
  onClick={() => citation && onSelect(path)}
1007
910
  className={cn(
1008
911
  'flex items-center gap-2 w-full text-start text-sm rounded px-1.5 py-0.5',
1009
- isSelected ? 'bg-destructive/15 ring-1 ring-destructive' : citation ? 'hover:bg-muted' : '',
912
+ isSelected ? 'bg-primary/15 ring-1 ring-primary' : citation ? 'hover:bg-muted' : '',
1010
913
  !citation && 'cursor-default',
1011
914
  )}
1012
915
  >
1013
- <span className="text-muted-foreground min-w-28 shrink-0">{label}</span>
916
+ <span className="min-w-28 shrink-0 font-semibold">{propertyTitle(label)}:</span>
1014
917
  <span className="flex-1 wrap-break-word">{formatValue(value)}</span>
1015
918
  {citation && typeof citation.confidence === 'number' && (
1016
919
  <span
1017
920
  className={cn('text-xs shrink-0', scoreColor(citation.confidence))}
1018
- title={t('grounded.confidenceHint')}
921
+ title={t('grounded.scoreHint')}
1019
922
  >
1020
923
  {formatScore(citation.confidence)}
1021
924
  </span>
@@ -1032,6 +935,23 @@ function LeafRow({
1032
935
  );
1033
936
  }
1034
937
 
938
+ /**
939
+ * Friendly trail for a citation path, matching the labels in the data panel:
940
+ * "line_items[1].unit_price" -> ["Line items", "Unit price"]. The array index is
941
+ * dropped — the highlighted box already says which row it is.
942
+ */
943
+ function citationPathLabels(path: string): string[] {
944
+ return normalizeCitationPath(path)
945
+ .split('.')
946
+ .map((segment) => propertyTitle(segment.replace(/\[\d+\]/g, '')))
947
+ .filter(Boolean);
948
+ }
949
+
950
+ /** Friendly label for a property key, matching the standard properties view. */
951
+ function propertyTitle(name: string | undefined): string {
952
+ return name ? computeTitleFromName(name) : '';
953
+ }
954
+
1035
955
  /**
1036
956
  * Tier scores (1.0, 0.99, 0.5...) are policy values and display as integers;
1037
957
  * OCR-measured scores carry real decimals from tesseract and keep two.
@@ -77,6 +77,14 @@ describe('MCP connection controls', () => {
77
77
  namespace: 'github',
78
78
  url: 'https://github-mcp.example.com',
79
79
  },
80
+ {
81
+ type: 'mcp',
82
+ id: 'api-key-tools',
83
+ name: 'API Key Tools',
84
+ namespace: 'api_key_tools',
85
+ url: 'https://api-key-mcp.example.com',
86
+ auth: 'api_key',
87
+ },
80
88
  ],
81
89
  },
82
90
  oauth_collection_ids: ['jira', 'miro', 'linear', 'github'],
@@ -107,6 +115,12 @@ describe('MCP connection controls', () => {
107
115
  collection_name: 'GitHub',
108
116
  mcp_server_url: 'https://github-mcp.example.com',
109
117
  },
118
+ {
119
+ authenticated: true,
120
+ collection_id: 'api-key-tools',
121
+ collection_name: 'API Key Tools',
122
+ mcp_server_url: 'https://api-key-mcp.example.com',
123
+ },
110
124
  ]);
111
125
  const onChange = vi.fn();
112
126
 
@@ -118,13 +132,16 @@ describe('MCP connection controls', () => {
118
132
  expect(screen.getByText('Miro')).not.toBeNull();
119
133
  expect(screen.getByText('Linear')).not.toBeNull();
120
134
  expect(screen.getByText('GitHub')).not.toBeNull();
135
+ expect(screen.getByText('API Key Tools')).not.toBeNull();
136
+ const apiKeyBadge = screen.getByText('API key');
137
+ expect(apiKeyBadge.className).toContain('w-32');
121
138
  expect(screen.queryByText('Connected')).toBeNull();
122
139
  expect(screen.getAllByRole('button', { name: 'Disconnect' })).toHaveLength(3);
123
140
  const connectButton = screen.getByRole('button', { name: 'Connect' });
124
141
  const disconnectButton = screen.getAllByRole('button', { name: 'Disconnect' })[0];
125
142
  expect(connectButton.className).toContain('w-32');
126
143
  expect(disconnectButton.className).toContain('w-32');
127
- expect(screen.getAllByText('Enabled')).toHaveLength(3);
144
+ expect(screen.getAllByText('Enabled')).toHaveLength(4);
128
145
  expect(screen.getByText('Disabled')).not.toBeNull();
129
146
  });
130
147