@vertesia/ui 1.5.0-dev.20260714.072725Z → 1.5.0-dev.20260722.120446Z

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 (393) hide show
  1. package/lib/core/components/SidePanel.js +1 -1
  2. package/lib/core/components/SidePanel.js.map +1 -1
  3. package/lib/core/components/shadcn/button.d.ts +10 -3
  4. package/lib/core/components/shadcn/button.d.ts.map +1 -1
  5. package/lib/core/components/shadcn/button.js +41 -9
  6. package/lib/core/components/shadcn/button.js.map +1 -1
  7. package/lib/core/components/shadcn/modal/dialog.js +1 -1
  8. package/lib/core/components/shadcn/modal/dialog.js.map +1 -1
  9. package/lib/core/components/shadcn/theme/ThemeSwitcher.js +1 -1
  10. package/lib/core/components/shadcn/theme/ThemeSwitcher.js.map +1 -1
  11. package/lib/env/index.d.ts +19 -0
  12. package/lib/env/index.d.ts.map +1 -1
  13. package/lib/env/index.js +6 -0
  14. package/lib/env/index.js.map +1 -1
  15. package/lib/features/agent/chat/AgentChatPlaybackControls.d.ts.map +1 -1
  16. package/lib/features/agent/chat/AgentChatPlaybackControls.js +2 -2
  17. package/lib/features/agent/chat/AgentChatPlaybackControls.js.map +1 -1
  18. package/lib/features/agent/chat/AgentRequestInputOverlay.d.ts.map +1 -1
  19. package/lib/features/agent/chat/AgentRequestInputOverlay.js +2 -2
  20. package/lib/features/agent/chat/AgentRequestInputOverlay.js.map +1 -1
  21. package/lib/features/agent/chat/ArtifactsTab.d.ts.map +1 -1
  22. package/lib/features/agent/chat/ArtifactsTab.js +68 -11
  23. package/lib/features/agent/chat/ArtifactsTab.js.map +1 -1
  24. package/lib/features/agent/chat/ImageLightbox.d.ts.map +1 -1
  25. package/lib/features/agent/chat/ImageLightbox.js +1 -1
  26. package/lib/features/agent/chat/ImageLightbox.js.map +1 -1
  27. package/lib/features/agent/chat/ModernAgentConversation.js +52 -49
  28. package/lib/features/agent/chat/ModernAgentConversation.js.map +1 -1
  29. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts.map +1 -1
  30. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js +5 -5
  31. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -1
  32. package/lib/features/agent/chat/ModernAgentOutput/Header.d.ts.map +1 -1
  33. package/lib/features/agent/chat/ModernAgentOutput/Header.js +4 -2
  34. package/lib/features/agent/chat/ModernAgentOutput/Header.js.map +1 -1
  35. package/lib/features/agent/chat/ModernAgentOutput/MessageInput.d.ts.map +1 -1
  36. package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js +2 -2
  37. package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js.map +1 -1
  38. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.d.ts.map +1 -1
  39. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js +2 -1
  40. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js.map +1 -1
  41. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.d.ts +6 -0
  42. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.d.ts.map +1 -1
  43. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.js +15 -1
  44. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.js.map +1 -1
  45. package/lib/features/agent/chat/hooks/useArtifacts.d.ts +8 -1
  46. package/lib/features/agent/chat/hooks/useArtifacts.d.ts.map +1 -1
  47. package/lib/features/agent/chat/hooks/useArtifacts.js +28 -10
  48. package/lib/features/agent/chat/hooks/useArtifacts.js.map +1 -1
  49. package/lib/features/document-viewer/UniversalDocumentViewer.d.ts +73 -0
  50. package/lib/features/document-viewer/UniversalDocumentViewer.d.ts.map +1 -0
  51. package/lib/features/document-viewer/UniversalDocumentViewer.js +415 -0
  52. package/lib/features/document-viewer/UniversalDocumentViewer.js.map +1 -0
  53. package/lib/features/document-viewer/index.d.ts +2 -0
  54. package/lib/features/document-viewer/index.d.ts.map +1 -0
  55. package/lib/features/document-viewer/index.js +2 -0
  56. package/lib/features/document-viewer/index.js.map +1 -0
  57. package/lib/features/environment/SelectEnvironment.d.ts +28 -0
  58. package/lib/features/environment/SelectEnvironment.d.ts.map +1 -0
  59. package/lib/features/environment/SelectEnvironment.js +97 -0
  60. package/lib/features/environment/SelectEnvironment.js.map +1 -0
  61. package/lib/features/environment/index.d.ts +2 -0
  62. package/lib/features/environment/index.d.ts.map +1 -0
  63. package/lib/features/environment/index.js +2 -0
  64. package/lib/features/environment/index.js.map +1 -0
  65. package/lib/features/index.d.ts +3 -0
  66. package/lib/features/index.d.ts.map +1 -1
  67. package/lib/features/index.js +3 -0
  68. package/lib/features/index.js.map +1 -1
  69. package/lib/features/magic-pdf/AnnotatedImageSlider.js +12 -12
  70. package/lib/features/magic-pdf/AnnotatedImageSlider.js.map +1 -1
  71. package/lib/features/magic-pdf/DownloadPopover.d.ts.map +1 -1
  72. package/lib/features/magic-pdf/DownloadPopover.js +3 -17
  73. package/lib/features/magic-pdf/DownloadPopover.js.map +1 -1
  74. package/lib/features/magic-pdf/ExtractedContentView.js +2 -6
  75. package/lib/features/magic-pdf/ExtractedContentView.js.map +1 -1
  76. package/lib/features/magic-pdf/GroundedExtractionAssistantPanel.d.ts +25 -0
  77. package/lib/features/magic-pdf/GroundedExtractionAssistantPanel.d.ts.map +1 -0
  78. package/lib/features/magic-pdf/GroundedExtractionAssistantPanel.js +42 -0
  79. package/lib/features/magic-pdf/GroundedExtractionAssistantPanel.js.map +1 -0
  80. package/lib/features/magic-pdf/GroundedExtractionView.d.ts +27 -0
  81. package/lib/features/magic-pdf/GroundedExtractionView.d.ts.map +1 -0
  82. package/lib/features/magic-pdf/GroundedExtractionView.js +377 -0
  83. package/lib/features/magic-pdf/GroundedExtractionView.js.map +1 -0
  84. package/lib/features/magic-pdf/MagicPdfProvider.d.ts +0 -2
  85. package/lib/features/magic-pdf/MagicPdfProvider.d.ts.map +1 -1
  86. package/lib/features/magic-pdf/MagicPdfProvider.js +15 -42
  87. package/lib/features/magic-pdf/MagicPdfProvider.js.map +1 -1
  88. package/lib/features/magic-pdf/MagicPdfView.d.ts.map +1 -1
  89. package/lib/features/magic-pdf/MagicPdfView.js +2 -19
  90. package/lib/features/magic-pdf/MagicPdfView.js.map +1 -1
  91. package/lib/features/magic-pdf/index.d.ts +1 -0
  92. package/lib/features/magic-pdf/index.d.ts.map +1 -1
  93. package/lib/features/magic-pdf/index.js +1 -0
  94. package/lib/features/magic-pdf/index.js.map +1 -1
  95. package/lib/features/magic-pdf/types.d.ts +1 -1
  96. package/lib/features/magic-pdf/types.d.ts.map +1 -1
  97. package/lib/features/oauth/McpConnectionsButton.d.ts.map +1 -1
  98. package/lib/features/oauth/McpConnectionsButton.js +2 -2
  99. package/lib/features/oauth/McpConnectionsButton.js.map +1 -1
  100. package/lib/features/oauth/McpConnectionsDialog.d.ts.map +1 -1
  101. package/lib/features/oauth/McpConnectionsDialog.js +1 -1
  102. package/lib/features/oauth/McpConnectionsDialog.js.map +1 -1
  103. package/lib/features/oauth/RemoteMcpConnectionButton.d.ts.map +1 -1
  104. package/lib/features/oauth/RemoteMcpConnectionButton.js +1 -1
  105. package/lib/features/oauth/RemoteMcpConnectionButton.js.map +1 -1
  106. package/lib/features/pdf-viewer/PdfPageSlider.js +2 -2
  107. package/lib/features/pdf-viewer/PdfPageSlider.js.map +1 -1
  108. package/lib/features/pdf-viewer/SimplePdfViewer.d.ts.map +1 -1
  109. package/lib/features/pdf-viewer/SimplePdfViewer.js +3 -3
  110. package/lib/features/pdf-viewer/SimplePdfViewer.js.map +1 -1
  111. package/lib/features/permissions/UserPermissionsProvider.d.ts +2 -3
  112. package/lib/features/permissions/UserPermissionsProvider.d.ts.map +1 -1
  113. package/lib/features/permissions/UserPermissionsProvider.js +31 -38
  114. package/lib/features/permissions/UserPermissionsProvider.js.map +1 -1
  115. package/lib/features/store/objects/DocumentQuickFilter.d.ts.map +1 -1
  116. package/lib/features/store/objects/DocumentQuickFilter.js +5 -5
  117. package/lib/features/store/objects/DocumentQuickFilter.js.map +1 -1
  118. package/lib/features/store/objects/DocumentSearchResults.d.ts.map +1 -1
  119. package/lib/features/store/objects/DocumentSearchResults.js +2 -2
  120. package/lib/features/store/objects/DocumentSearchResults.js.map +1 -1
  121. package/lib/features/store/objects/components/ContentDispositionButton.d.ts.map +1 -1
  122. package/lib/features/store/objects/components/ContentDispositionButton.js +1 -1
  123. package/lib/features/store/objects/components/ContentDispositionButton.js.map +1 -1
  124. package/lib/features/store/objects/components/ContentOverview.d.ts.map +1 -1
  125. package/lib/features/store/objects/components/ContentOverview.js +148 -31
  126. package/lib/features/store/objects/components/ContentOverview.js.map +1 -1
  127. package/lib/features/store/objects/components/DocumentIcon.js +1 -1
  128. package/lib/features/store/objects/components/VectorSearchWidget.js +1 -1
  129. package/lib/features/store/objects/components/VectorSearchWidget.js.map +1 -1
  130. package/lib/features/store/objects/components/useContentPanelHooks.d.ts +1 -2
  131. package/lib/features/store/objects/components/useContentPanelHooks.d.ts.map +1 -1
  132. package/lib/features/store/objects/components/useContentPanelHooks.js +4 -8
  133. package/lib/features/store/objects/components/useContentPanelHooks.js.map +1 -1
  134. package/lib/features/store/objects/layout/renderers.d.ts.map +1 -1
  135. package/lib/features/store/objects/layout/renderers.js +2 -2
  136. package/lib/features/store/objects/layout/renderers.js.map +1 -1
  137. package/lib/features/store/objects/selection/SelectionActions.js +1 -1
  138. package/lib/features/store/objects/selection/SelectionActions.js.map +1 -1
  139. package/lib/features/store/types/ContentObjectTypesTable.d.ts.map +1 -1
  140. package/lib/features/store/types/ContentObjectTypesTable.js +4 -4
  141. package/lib/features/store/types/ContentObjectTypesTable.js.map +1 -1
  142. package/lib/features/store/types/IntakePolicyEditor.d.ts +15 -0
  143. package/lib/features/store/types/IntakePolicyEditor.d.ts.map +1 -0
  144. package/lib/features/store/types/IntakePolicyEditor.js +455 -0
  145. package/lib/features/store/types/IntakePolicyEditor.js.map +1 -0
  146. package/lib/features/store/types/IntakePolicyForm.d.ts +11 -0
  147. package/lib/features/store/types/IntakePolicyForm.d.ts.map +1 -0
  148. package/lib/features/store/types/IntakePolicyForm.js +91 -0
  149. package/lib/features/store/types/IntakePolicyForm.js.map +1 -0
  150. package/lib/features/store/types/SelectContentTypeModal.js +1 -1
  151. package/lib/features/store/types/SelectContentTypeModal.js.map +1 -1
  152. package/lib/features/store/types/index.d.ts +2 -0
  153. package/lib/features/store/types/index.d.ts.map +1 -1
  154. package/lib/features/store/types/index.js +2 -0
  155. package/lib/features/store/types/index.js.map +1 -1
  156. package/lib/features/store/types/intake-policy-editor.logic.d.ts +7 -0
  157. package/lib/features/store/types/intake-policy-editor.logic.d.ts.map +1 -0
  158. package/lib/features/store/types/intake-policy-editor.logic.js +60 -0
  159. package/lib/features/store/types/intake-policy-editor.logic.js.map +1 -0
  160. package/lib/features/store/types/typeCatalogCache.d.ts +5 -0
  161. package/lib/features/store/types/typeCatalogCache.d.ts.map +1 -0
  162. package/lib/features/store/types/typeCatalogCache.js +40 -0
  163. package/lib/features/store/types/typeCatalogCache.js.map +1 -0
  164. package/lib/features/user/UserInfo.js +7 -3
  165. package/lib/features/user/UserInfo.js.map +1 -1
  166. package/lib/features/views/ViewExperience.d.ts +20 -0
  167. package/lib/features/views/ViewExperience.d.ts.map +1 -0
  168. package/lib/features/views/ViewExperience.js +188 -0
  169. package/lib/features/views/ViewExperience.js.map +1 -0
  170. package/lib/features/views/ViewNavigation.d.ts +3 -0
  171. package/lib/features/views/ViewNavigation.d.ts.map +1 -0
  172. package/lib/features/views/ViewNavigation.js +36 -0
  173. package/lib/features/views/ViewNavigation.js.map +1 -0
  174. package/lib/features/views/ViewResults.d.ts +9 -0
  175. package/lib/features/views/ViewResults.d.ts.map +1 -0
  176. package/lib/features/views/ViewResults.js +229 -0
  177. package/lib/features/views/ViewResults.js.map +1 -0
  178. package/lib/features/views/ViewSearch.d.ts +3 -0
  179. package/lib/features/views/ViewSearch.d.ts.map +1 -0
  180. package/lib/features/views/ViewSearch.js +74 -0
  181. package/lib/features/views/ViewSearch.js.map +1 -0
  182. package/lib/features/views/index.d.ts +7 -0
  183. package/lib/features/views/index.d.ts.map +1 -0
  184. package/lib/features/views/index.js +7 -0
  185. package/lib/features/views/index.js.map +1 -0
  186. package/lib/features/views/types.d.ts +39 -0
  187. package/lib/features/views/types.d.ts.map +1 -0
  188. package/lib/features/views/types.js +2 -0
  189. package/lib/features/views/types.js.map +1 -0
  190. package/lib/features/views/viewState.d.ts +14 -0
  191. package/lib/features/views/viewState.d.ts.map +1 -0
  192. package/lib/features/views/viewState.js +117 -0
  193. package/lib/features/views/viewState.js.map +1 -0
  194. package/lib/i18n/locales/ar.json +18 -0
  195. package/lib/i18n/locales/de.json +14 -0
  196. package/lib/i18n/locales/en.json +246 -32
  197. package/lib/i18n/locales/es.json +15 -0
  198. package/lib/i18n/locales/fr.json +15 -0
  199. package/lib/i18n/locales/it.json +15 -0
  200. package/lib/i18n/locales/ja.json +13 -0
  201. package/lib/i18n/locales/ko.json +13 -0
  202. package/lib/i18n/locales/pt.json +15 -0
  203. package/lib/i18n/locales/ru.json +16 -0
  204. package/lib/i18n/locales/tr.json +14 -0
  205. package/lib/i18n/locales/zh-TW.json +13 -0
  206. package/lib/i18n/locales/zh.json +13 -0
  207. package/lib/router/HistoryNavigator.d.ts.map +1 -1
  208. package/lib/router/HistoryNavigator.js +27 -14
  209. package/lib/router/HistoryNavigator.js.map +1 -1
  210. package/lib/router/Nav.d.ts.map +1 -1
  211. package/lib/router/Nav.js +21 -6
  212. package/lib/router/Nav.js.map +1 -1
  213. package/lib/router/Router.d.ts.map +1 -1
  214. package/lib/router/Router.js +19 -4
  215. package/lib/router/Router.js.map +1 -1
  216. package/lib/router/path.d.ts +15 -0
  217. package/lib/router/path.d.ts.map +1 -1
  218. package/lib/router/path.js +43 -0
  219. package/lib/router/path.js.map +1 -1
  220. package/lib/session/UserSession.d.ts +6 -0
  221. package/lib/session/UserSession.d.ts.map +1 -1
  222. package/lib/session/UserSession.js +36 -12
  223. package/lib/session/UserSession.js.map +1 -1
  224. package/lib/session/UserSessionProvider.d.ts.map +1 -1
  225. package/lib/session/UserSessionProvider.js +111 -49
  226. package/lib/session/UserSessionProvider.js.map +1 -1
  227. package/lib/session/auth/composable.d.ts.map +1 -1
  228. package/lib/session/auth/composable.js +52 -3
  229. package/lib/session/auth/composable.js.map +1 -1
  230. package/lib/session/auth/domainRouting.d.ts +25 -0
  231. package/lib/session/auth/domainRouting.d.ts.map +1 -1
  232. package/lib/session/auth/domainRouting.js +36 -0
  233. package/lib/session/auth/domainRouting.js.map +1 -1
  234. package/lib/shell/login/SignInRestrictedEnvStep.d.ts +1 -1
  235. package/lib/shell/login/SignInRestrictedEnvStep.js +1 -1
  236. package/lib/shell/login/SigninScreen.js +9 -1
  237. package/lib/shell/login/SigninScreen.js.map +1 -1
  238. package/lib/shell/login/productionUrl.d.ts +0 -14
  239. package/lib/shell/login/productionUrl.d.ts.map +1 -1
  240. package/lib/shell/login/productionUrl.js +14 -5
  241. package/lib/shell/login/productionUrl.js.map +1 -1
  242. package/lib/vertesia-ui-core.js +4 -4
  243. package/lib/vertesia-ui-core.js.map +1 -1
  244. package/lib/vertesia-ui-env.js +1 -1
  245. package/lib/vertesia-ui-env.js.map +1 -1
  246. package/lib/vertesia-ui-features.js +35 -28
  247. package/lib/vertesia-ui-features.js.map +1 -1
  248. package/lib/vertesia-ui-i18n.js +15 -15
  249. package/lib/vertesia-ui-i18n.js.map +1 -1
  250. package/lib/vertesia-ui-router.js +1 -1
  251. package/lib/vertesia-ui-router.js.map +1 -1
  252. package/lib/vertesia-ui-session.js +1 -1
  253. package/lib/vertesia-ui-session.js.map +1 -1
  254. package/lib/vertesia-ui-shell.js +1 -1
  255. package/lib/vertesia-ui-shell.js.map +1 -1
  256. package/lib/vertesia-ui-widgets.js +7 -7
  257. package/lib/vertesia-ui-widgets.js.map +1 -1
  258. package/lib/widgets/form/Form.js +1 -1
  259. package/lib/widgets/form/Form.js.map +1 -1
  260. package/lib/widgets/json-view/JSONSwitcher.js +1 -1
  261. package/lib/widgets/json-view/JSONSwitcher.js.map +1 -1
  262. package/lib/widgets/json-view/JSONView.js +6 -6
  263. package/lib/widgets/json-view/JSONView.js.map +1 -1
  264. package/lib/widgets/monacoEditor/MonacoEditor.d.ts.map +1 -1
  265. package/lib/widgets/monacoEditor/MonacoEditor.js +29 -0
  266. package/lib/widgets/monacoEditor/MonacoEditor.js.map +1 -1
  267. package/lib/widgets/schema-editor/ManagedSchema.d.ts +8 -0
  268. package/lib/widgets/schema-editor/ManagedSchema.d.ts.map +1 -1
  269. package/lib/widgets/schema-editor/ManagedSchema.js +16 -0
  270. package/lib/widgets/schema-editor/ManagedSchema.js.map +1 -1
  271. package/lib/widgets/schema-editor/editor/EditableSchemaProperty.d.ts +2 -0
  272. package/lib/widgets/schema-editor/editor/EditableSchemaProperty.d.ts.map +1 -1
  273. package/lib/widgets/schema-editor/editor/EditableSchemaProperty.js +1 -0
  274. package/lib/widgets/schema-editor/editor/EditableSchemaProperty.js.map +1 -1
  275. package/lib/widgets/schema-editor/editor/PropertyViewer.d.ts.map +1 -1
  276. package/lib/widgets/schema-editor/editor/PropertyViewer.js +4 -1
  277. package/lib/widgets/schema-editor/editor/PropertyViewer.js.map +1 -1
  278. package/lib/widgets/schema-editor/editor/SchemaEditor.d.ts.map +1 -1
  279. package/lib/widgets/schema-editor/editor/SchemaEditor.js +22 -11
  280. package/lib/widgets/schema-editor/editor/SchemaEditor.js.map +1 -1
  281. package/llms.txt +70 -70
  282. package/package.json +33 -32
  283. package/src/__tests__/a11y.test.tsx +73 -0
  284. package/src/core/components/SidePanel.tsx +1 -1
  285. package/src/core/components/shadcn/button.tsx +67 -12
  286. package/src/core/components/shadcn/modal/dialog.tsx +1 -1
  287. package/src/core/components/shadcn/theme/ThemeSwitcher.tsx +1 -1
  288. package/src/env/index.ts +24 -0
  289. package/src/features/agent/chat/AgentChatPlaybackControls.tsx +0 -5
  290. package/src/features/agent/chat/AgentRequestInputOverlay.test.tsx +31 -0
  291. package/src/features/agent/chat/AgentRequestInputOverlay.tsx +6 -2
  292. package/src/features/agent/chat/ArtifactsTab.tsx +165 -21
  293. package/src/features/agent/chat/ImageLightbox.tsx +0 -1
  294. package/src/features/agent/chat/ModernAgentConversation.test.tsx +48 -0
  295. package/src/features/agent/chat/ModernAgentConversation.tsx +53 -51
  296. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.test.tsx +6 -1
  297. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +21 -15
  298. package/src/features/agent/chat/ModernAgentOutput/Header.tsx +3 -3
  299. package/src/features/agent/chat/ModernAgentOutput/MessageInput.tsx +0 -2
  300. package/src/features/agent/chat/ModernAgentOutput/MessageItem.tsx +4 -1
  301. package/src/features/agent/chat/ModernAgentOutput/requestInputMessages.test.ts +80 -0
  302. package/src/features/agent/chat/ModernAgentOutput/requestInputMessages.ts +21 -1
  303. package/src/features/agent/chat/hooks/useArtifacts.ts +44 -11
  304. package/src/features/document-viewer/UniversalDocumentViewer.test.tsx +123 -0
  305. package/src/features/document-viewer/UniversalDocumentViewer.tsx +746 -0
  306. package/src/features/document-viewer/index.ts +1 -0
  307. package/src/features/environment/SelectEnvironment.tsx +186 -0
  308. package/src/features/environment/index.ts +1 -0
  309. package/src/features/index.ts +3 -0
  310. package/src/features/magic-pdf/AnnotatedImageSlider.tsx +62 -66
  311. package/src/features/magic-pdf/DownloadPopover.tsx +5 -48
  312. package/src/features/magic-pdf/ExtractedContentView.tsx +2 -14
  313. package/src/features/magic-pdf/GroundedExtractionAssistantPanel.tsx +86 -0
  314. package/src/features/magic-pdf/GroundedExtractionView.test.tsx +65 -0
  315. package/src/features/magic-pdf/GroundedExtractionView.tsx +1055 -0
  316. package/src/features/magic-pdf/MagicPdfProvider.tsx +17 -47
  317. package/src/features/magic-pdf/MagicPdfView.tsx +3 -51
  318. package/src/features/magic-pdf/index.ts +1 -0
  319. package/src/features/magic-pdf/types.ts +1 -1
  320. package/src/features/oauth/McpConnectionsButton.tsx +0 -2
  321. package/src/features/oauth/McpConnectionsDialog.tsx +0 -1
  322. package/src/features/oauth/RemoteMcpConnectionButton.tsx +0 -1
  323. package/src/features/pdf-viewer/PdfPageSlider.tsx +5 -5
  324. package/src/features/pdf-viewer/SimplePdfViewer.tsx +11 -12
  325. package/src/features/permissions/UserPermissionsProvider.tsx +36 -39
  326. package/src/features/store/objects/DocumentQuickFilter.tsx +13 -15
  327. package/src/features/store/objects/DocumentSearchResults.tsx +3 -6
  328. package/src/features/store/objects/components/ContentDispositionButton.tsx +5 -1
  329. package/src/features/store/objects/components/ContentOverview.tsx +240 -67
  330. package/src/features/store/objects/components/DocumentIcon.tsx +1 -1
  331. package/src/features/store/objects/components/VectorSearchWidget.tsx +2 -2
  332. package/src/features/store/objects/components/useContentPanelHooks.ts +3 -15
  333. package/src/features/store/objects/layout/renderers.tsx +1 -2
  334. package/src/features/store/objects/selection/SelectionActions.tsx +1 -1
  335. package/src/features/store/types/ContentObjectTypesTable.tsx +12 -14
  336. package/src/features/store/types/IntakePolicyEditor.tsx +679 -0
  337. package/src/features/store/types/IntakePolicyForm.tsx +838 -0
  338. package/src/features/store/types/SelectContentTypeModal.tsx +2 -2
  339. package/src/features/store/types/index.ts +2 -0
  340. package/src/features/store/types/intake-policy-editor.logic.test.ts +109 -0
  341. package/src/features/store/types/intake-policy-editor.logic.ts +87 -0
  342. package/src/features/store/types/typeCatalogCache.ts +45 -0
  343. package/src/features/user/UserInfo.tsx +7 -7
  344. package/src/features/views/ViewExperience.test.tsx +273 -0
  345. package/src/features/views/ViewExperience.tsx +408 -0
  346. package/src/features/views/ViewNavigation.test.tsx +86 -0
  347. package/src/features/views/ViewNavigation.tsx +187 -0
  348. package/src/features/views/ViewResults.test.ts +82 -0
  349. package/src/features/views/ViewResults.tsx +609 -0
  350. package/src/features/views/ViewSearch.test.tsx +147 -0
  351. package/src/features/views/ViewSearch.tsx +205 -0
  352. package/src/features/views/index.ts +6 -0
  353. package/src/features/views/types.ts +57 -0
  354. package/src/features/views/viewState.test.ts +111 -0
  355. package/src/features/views/viewState.ts +132 -0
  356. package/src/i18n/locales/ar.json +18 -0
  357. package/src/i18n/locales/de.json +14 -0
  358. package/src/i18n/locales/en.json +965 -751
  359. package/src/i18n/locales/es.json +15 -0
  360. package/src/i18n/locales/fr.json +15 -0
  361. package/src/i18n/locales/it.json +15 -0
  362. package/src/i18n/locales/ja.json +13 -0
  363. package/src/i18n/locales/ko.json +13 -0
  364. package/src/i18n/locales/pt.json +15 -0
  365. package/src/i18n/locales/ru.json +16 -0
  366. package/src/i18n/locales/tr.json +14 -0
  367. package/src/i18n/locales/zh-TW.json +13 -0
  368. package/src/i18n/locales/zh.json +13 -0
  369. package/src/router/HistoryNavigator.test.ts +48 -0
  370. package/src/router/HistoryNavigator.ts +28 -14
  371. package/src/router/Nav.tsx +24 -8
  372. package/src/router/Router.tsx +18 -4
  373. package/src/router/path.test.ts +87 -0
  374. package/src/router/path.ts +38 -0
  375. package/src/session/UserSession.test.ts +39 -0
  376. package/src/session/UserSession.ts +37 -12
  377. package/src/session/UserSessionProvider.tsx +138 -62
  378. package/src/session/auth/composable.test.ts +111 -0
  379. package/src/session/auth/composable.ts +58 -3
  380. package/src/session/auth/domainRouting.test.ts +28 -1
  381. package/src/session/auth/domainRouting.ts +38 -0
  382. package/src/shell/login/SignInRestrictedEnvStep.tsx +1 -1
  383. package/src/shell/login/SigninScreen.tsx +9 -1
  384. package/src/shell/login/productionUrl.test.ts +8 -5
  385. package/src/shell/login/productionUrl.ts +15 -5
  386. package/src/widgets/form/Form.tsx +1 -1
  387. package/src/widgets/json-view/JSONSwitcher.tsx +2 -2
  388. package/src/widgets/json-view/JSONView.tsx +7 -7
  389. package/src/widgets/monacoEditor/MonacoEditor.tsx +29 -0
  390. package/src/widgets/schema-editor/ManagedSchema.ts +22 -0
  391. package/src/widgets/schema-editor/editor/EditableSchemaProperty.tsx +3 -0
  392. package/src/widgets/schema-editor/editor/PropertyViewer.tsx +14 -3
  393. package/src/widgets/schema-editor/editor/SchemaEditor.tsx +80 -29
@@ -399,7 +399,12 @@ describe('AllMessagesMixed summary view', () => {
399
399
 
400
400
  fireEvent.click(screen.getByRole('button', { name: /Allow once/ }));
401
401
 
402
- expect(onSendMessage).toHaveBeenCalledWith('allow_once');
402
+ expect(onSendMessage).toHaveBeenCalledWith('allow_once', {
403
+ tool_approval_response: {
404
+ decision: 'allow_once',
405
+ approval_key: 'create_document:name:News Headlines Today',
406
+ },
407
+ });
403
408
  });
404
409
 
405
410
  it('keeps an approved tool approval continuation in the same active work row', () => {
@@ -6,7 +6,7 @@ import {
6
6
  type JSONSchema,
7
7
  type Plan,
8
8
  } from '@vertesia/common';
9
- import { Badge, Button, cn, VTooltip } from '@vertesia/ui/core';
9
+ import { Badge, Button, cn } from '@vertesia/ui/core';
10
10
  import { i18nInstance, NAMESPACE, useUITranslation } from '@vertesia/ui/i18n';
11
11
  import { NavLink } from '@vertesia/ui/router';
12
12
  import { MarkdownRenderer, type MarkdownRendererProps } from '@vertesia/ui/widgets';
@@ -49,6 +49,7 @@ import {
49
49
  getRequestInputDisplayText,
50
50
  getRequestInputMessageKey,
51
51
  getResolvedToolApprovalKeys,
52
+ getToolApprovalResponseMetadata,
52
53
  hasRequestInputUx,
53
54
  isRequestInputAnswered,
54
55
  isToolApprovalAnswerHidden,
@@ -763,7 +764,9 @@ function SummaryMessage({
763
764
  options={uxConfig.options}
764
765
  variant={uxConfig.variant}
765
766
  multiSelect={uxConfig.multiSelect}
766
- onSelect={(optionId) => onSendMessage?.(optionId)}
767
+ onSelect={(optionId) =>
768
+ onSendMessage?.(optionId, getToolApprovalResponseMetadata(message, optionId))
769
+ }
767
770
  onMultiSelect={(optionIds) => onSendMessage?.(optionIds.join(', '))}
768
771
  allowFreeResponse={!uxConfig.options?.length || !!uxConfig.free_response}
769
772
  placeholder={uxConfig.free_response?.placeholder}
@@ -2240,7 +2243,12 @@ function SummaryActivityRow({
2240
2243
  options={uxConfig.options}
2241
2244
  variant={uxConfig.variant}
2242
2245
  multiSelect={uxConfig.multiSelect}
2243
- onSelect={(optionId) => onSendMessage?.(optionId)}
2246
+ onSelect={(optionId) =>
2247
+ onSendMessage?.(
2248
+ optionId,
2249
+ getToolApprovalResponseMetadata(message, optionId),
2250
+ )
2251
+ }
2244
2252
  onMultiSelect={(optionIds) => onSendMessage?.(optionIds.join(', '))}
2245
2253
  allowFreeResponse={
2246
2254
  !uxConfig.options?.length || !!uxConfig.free_response
@@ -3246,18 +3254,16 @@ function AllMessagesMixedComponent({
3246
3254
  {isSummaryView && activeWorkstream !== 'all' && activeWorkstreamName && (
3247
3255
  <div className="sticky top-0 z-20 -mx-2 bg-background/95 px-2 pb-2 pt-1 backdrop-blur sm:-mx-4 sm:px-4">
3248
3256
  <div className="mx-auto flex w-full max-w-3xl items-center gap-2 border-b border-border/70 pb-3">
3249
- <VTooltip description={t('agent.backToMainAgent')} asChild>
3250
- <Button
3251
- type="button"
3252
- variant="ghost"
3253
- size="icon"
3254
- className="size-8 shrink-0 text-muted hover:text-foreground"
3255
- aria-label={t('agent.backToMainAgent')}
3256
- onClick={handleShowMainAgentChat}
3257
- >
3258
- <ArrowLeft className="size-4" aria-hidden="true" />
3259
- </Button>
3260
- </VTooltip>
3257
+ <Button
3258
+ type="button"
3259
+ variant="ghost"
3260
+ size="icon"
3261
+ className="size-8 shrink-0 text-muted hover:text-foreground"
3262
+ title={t('agent.backToMainAgent')}
3263
+ onClick={handleShowMainAgentChat}
3264
+ >
3265
+ <ArrowLeft className="size-4" aria-hidden="true" />
3266
+ </Button>
3261
3267
  <div className="min-w-0 flex-1 truncate text-sm font-medium text-foreground">
3262
3268
  {activeWorkstreamName}
3263
3269
  </div>
@@ -100,7 +100,9 @@ export default function Header({
100
100
  const controls = (
101
101
  <div
102
102
  className={cn(
103
- isCompact ? 'flex flex-col items-center gap-1' : 'flex justify-end items-center gap-2 ms-auto',
103
+ isCompact
104
+ ? 'flex flex-row items-center gap-1 lg:flex-col'
105
+ : 'flex justify-end items-center gap-2 ms-auto',
104
106
  )}
105
107
  >
106
108
  {showPlanButton && (
@@ -177,7 +179,6 @@ export default function Header({
177
179
  variant={isPlaybackEnabled ? 'primary' : 'ghost'}
178
180
  onClick={onTogglePlayback}
179
181
  aria-pressed={isPlaybackEnabled}
180
- aria-label={t('agent.rewind.label')}
181
182
  title={t('agent.rewind.label')}
182
183
  className={cn(
183
184
  'transition-all duration-200 rounded-md',
@@ -376,7 +377,6 @@ function MoreDropdown({
376
377
  size={compact ? 'icon' : 'xs'}
377
378
  variant="ghost"
378
379
  title={t('agent.moreActions')}
379
- aria-label={t('agent.moreActions')}
380
380
  className={compact ? 'size-8 rounded-lg' : undefined}
381
381
  >
382
382
  <MoreVertical className="size-4" />
@@ -523,7 +523,6 @@ export default function MessageInput({
523
523
  variant="ghost"
524
524
  size="icon"
525
525
  className="size-8 rounded-full text-muted hover:bg-muted"
526
- aria-label={t('agent.addAttachment')}
527
526
  title={t('agent.addAttachment')}
528
527
  >
529
528
  <PlusIcon className="size-4" />
@@ -654,7 +653,6 @@ export default function MessageInput({
654
653
  '[&_svg]:text-destructive disabled:[&_svg]:text-muted',
655
654
  )}
656
655
  title={t('agent.stopTooltip')}
657
- aria-label={t('agent.stopTooltip')}
658
656
  >
659
657
  {isStopping ? (
660
658
  <Spinner size="sm" />
@@ -35,6 +35,7 @@ import { ThinkingMessages } from '../WaitingMessages';
35
35
  import { AttachmentPreviewList, parseUserMessageAttachments } from './AttachmentPreview';
36
36
  import { MessageDeliveryStatus } from './MessageDeliveryStatus';
37
37
  import { processContentForMarkdown } from './processContentForMarkdown';
38
+ import { getToolApprovalResponseMetadata } from './requestInputMessages';
38
39
  import { getWorkstreamId } from './utils';
39
40
 
40
41
  /** className overrides for MessageItem — single source of truth for all className overrides. */
@@ -649,7 +650,9 @@ function MessageItemComponent({
649
650
  options={askUserUx.options}
650
651
  variant={askUserUx.variant}
651
652
  multiSelect={askUserUx.multiSelect}
652
- onSelect={(optionId) => onSendMessage?.(optionId)}
653
+ onSelect={(optionId) =>
654
+ onSendMessage?.(optionId, getToolApprovalResponseMetadata(message, optionId))
655
+ }
653
656
  onMultiSelect={(optionIds) => onSendMessage?.(optionIds.join(', '))}
654
657
  allowFreeResponse={!askUserUx.options?.length || !!askUserUx.free_response}
655
658
  placeholder={askUserUx.free_response?.placeholder}
@@ -0,0 +1,80 @@
1
+ import { type AgentMessage, AgentMessageType } from '@vertesia/common';
2
+ import { describe, expect, it } from 'vitest';
3
+ import {
4
+ getAnsweredToolApprovalRequestInputKeys,
5
+ getRequestInputMessageKey,
6
+ getToolApprovalResponseMetadata,
7
+ } from './requestInputMessages';
8
+
9
+ const APPROVAL_KEY = 'create_interaction:name:JDE AR Payment Processing Agent';
10
+
11
+ function makeApprovalRequest(): AgentMessage {
12
+ return {
13
+ timestamp: 1,
14
+ type: AgentMessageType.REQUEST_INPUT,
15
+ message: 'Approve Create a new draft interaction: JDE AR Payment Processing Agent?',
16
+ workstream_id: 'main',
17
+ details: {
18
+ tool_approval: { tool_name: 'create_interaction', approval_key: APPROVAL_KEY },
19
+ ux: { options: [{ id: 'allow_once' }, { id: 'allow_for_run' }, { id: 'deny' }] },
20
+ },
21
+ } as unknown as AgentMessage;
22
+ }
23
+
24
+ function makeUserAnswer(message: string, metadata?: Record<string, unknown>): AgentMessage {
25
+ return {
26
+ timestamp: 2,
27
+ type: AgentMessageType.QUESTION,
28
+ message,
29
+ workstream_id: 'main',
30
+ details: metadata ? { metadata } : undefined,
31
+ } as unknown as AgentMessage;
32
+ }
33
+
34
+ describe('getToolApprovalResponseMetadata', () => {
35
+ it('builds structured response metadata for approval options', () => {
36
+ expect(getToolApprovalResponseMetadata(makeApprovalRequest(), 'allow_for_run')).toEqual({
37
+ tool_approval_response: { decision: 'allow_for_run', approval_key: APPROVAL_KEY },
38
+ });
39
+ });
40
+
41
+ it('returns undefined for prompts that are not tool approvals', () => {
42
+ const plainPrompt = {
43
+ timestamp: 1,
44
+ type: AgentMessageType.REQUEST_INPUT,
45
+ message: 'Which environment?',
46
+ workstream_id: 'main',
47
+ details: { ux: { options: [{ id: 'staging' }, { id: 'production' }] } },
48
+ } as unknown as AgentMessage;
49
+ expect(getToolApprovalResponseMetadata(plainPrompt, 'staging')).toBeUndefined();
50
+ });
51
+
52
+ it('returns undefined for unknown option ids', () => {
53
+ expect(getToolApprovalResponseMetadata(makeApprovalRequest(), 'staging')).toBeUndefined();
54
+ });
55
+ });
56
+
57
+ describe('getAnsweredToolApprovalRequestInputKeys', () => {
58
+ it('treats a bare option answer as answered', () => {
59
+ const request = makeApprovalRequest();
60
+ const answer = makeUserAnswer('allow_for_run');
61
+ const answered = getAnsweredToolApprovalRequestInputKeys([request, answer]);
62
+ expect(answered.has(getRequestInputMessageKey(request))).toBe(true);
63
+ });
64
+
65
+ it('treats a metadata-carrying answer as answered regardless of its text', () => {
66
+ const request = makeApprovalRequest();
67
+ const answer = makeUserAnswer('Allow this action for this run\n\nUploaded artifacts:\n[a.png](artifact:a)', {
68
+ tool_approval_response: { decision: 'allow_for_run', approval_key: APPROVAL_KEY },
69
+ });
70
+ const answered = getAnsweredToolApprovalRequestInputKeys([request, answer]);
71
+ expect(answered.has(getRequestInputMessageKey(request))).toBe(true);
72
+ });
73
+
74
+ it('does not treat unrelated prose as an approval answer', () => {
75
+ const request = makeApprovalRequest();
76
+ const answer = makeUserAnswer('please proceed\n\nUploaded artifacts:\n[a.png](artifact:a)');
77
+ const answered = getAnsweredToolApprovalRequestInputKeys([request, answer]);
78
+ expect(answered.size).toBe(0);
79
+ });
80
+ });
@@ -169,6 +169,22 @@ export function isToolApprovalRequestInput(message: AgentMessage): boolean {
169
169
  return message.type === AgentMessageType.REQUEST_INPUT && getToolApprovalKey(message) !== undefined;
170
170
  }
171
171
 
172
+ const TOOL_APPROVAL_OPTION_DECISIONS = new Set(['allow_once', 'allow_for_run', 'deny']);
173
+
174
+ /**
175
+ * Metadata to attach when the user picks an option on a tool-approval prompt, so the workflow
176
+ * reads the decision structurally instead of from the message text (which clients may decorate,
177
+ * e.g. with an attachments footer). Returns undefined for non-approval prompts or unknown options.
178
+ */
179
+ export function getToolApprovalResponseMetadata(
180
+ message: AgentMessage,
181
+ optionId: string,
182
+ ): Record<string, unknown> | undefined {
183
+ const approvalKey = getToolApprovalKey(message);
184
+ if (!approvalKey || !TOOL_APPROVAL_OPTION_DECISIONS.has(optionId)) return undefined;
185
+ return { tool_approval_response: { decision: optionId, approval_key: approvalKey } };
186
+ }
187
+
172
188
  function isToolApprovalOptionResponse(message: AgentMessage): boolean {
173
189
  if (message.type !== AgentMessageType.QUESTION) return false;
174
190
  const normalized = getAgentMessageText(message).trim().toLowerCase();
@@ -181,7 +197,11 @@ function isToolApprovalMetadataResponse(message: AgentMessage): boolean {
181
197
  const metadata = getRecord(details?.metadata);
182
198
  const toolApprovalResponse =
183
199
  getRecord(details?.tool_approval_response) ?? getRecord(metadata?.tool_approval_response);
184
- return toolApprovalResponse?.decision === 'deny_with_feedback';
200
+ const decision = toolApprovalResponse?.decision;
201
+ return (
202
+ decision === 'deny_with_feedback' ||
203
+ (typeof decision === 'string' && TOOL_APPROVAL_OPTION_DECISIONS.has(decision))
204
+ );
185
205
  }
186
206
 
187
207
  function isToolApprovalResponse(message: AgentMessage): boolean {
@@ -15,14 +15,31 @@ export interface ArtifactTreeNode {
15
15
  }
16
16
 
17
17
  // ---------------------------------------------------------------------------
18
- // Internal files we never show to the user
18
+ // System artifacts agent execution internals (tool I/O hydration,
19
+ // conversation snapshots, process state, archives). Hidden by default and
20
+ // revealed via the "Show system files" toggle.
19
21
  // ---------------------------------------------------------------------------
20
22
 
21
- const INTERNAL_FILE_PATTERNS = [/conversation\.json$/, /-conversation\.json$/, /^tools\.json$/];
22
-
23
- function isInternalFile(relativePath: string): boolean {
23
+ // Matched against the run-relative path: any path with one of these directory
24
+ // segments is agent scaffolding rather than a user-facing output.
25
+ const SYSTEM_DIR_PATTERN = /(^|\/)(tool-inputs|tool-results|archive)(\/|$)/;
26
+ const SYSTEM_PROCESS_PATTERN = /(^|\/)process\/(history|state)(\/|$)/;
27
+
28
+ // Matched against the file basename.
29
+ const SYSTEM_BASENAME_PATTERNS = [
30
+ /conversation\.json$/, // conversation.json, <id>-conversation.json
31
+ /^conversation-checkpoint-\d+\.json$/,
32
+ /^tools\.json$/,
33
+ /^tool-input-refs\.json$/,
34
+ /^toolu[_-]/i, // per-tool-use input/result hydration payloads
35
+ ];
36
+
37
+ export function isSystemArtifact(relativePath: string): boolean {
38
+ if (SYSTEM_DIR_PATTERN.test(relativePath) || SYSTEM_PROCESS_PATTERN.test(relativePath)) {
39
+ return true;
40
+ }
24
41
  const basename = relativePath.split('/').pop() ?? relativePath;
25
- return INTERNAL_FILE_PATTERNS.some((re) => re.test(basename));
42
+ return SYSTEM_BASENAME_PATTERNS.some((re) => re.test(basename));
26
43
  }
27
44
 
28
45
  // ---------------------------------------------------------------------------
@@ -88,15 +105,26 @@ function stripToRelativePath(fullPath: string, runId: string): string {
88
105
  // ---------------------------------------------------------------------------
89
106
 
90
107
  export interface UseArtifactsResult {
108
+ /** Tree of the currently visible files (respects `showSystem`). */
91
109
  tree: ArtifactTreeNode[];
110
+ /** Currently visible files (respects `showSystem`). */
92
111
  flatFiles: string[];
112
+ /** Total number of artifacts in the run, including system files. */
113
+ totalCount: number;
114
+ /** Number of system files currently hidden (0 when `showSystem` is true). */
115
+ systemHiddenCount: number;
93
116
  isLoading: boolean;
94
117
  error: string | null;
95
118
  refresh: () => void;
96
119
  }
97
120
 
98
- export function useArtifacts(client: VertesiaClient, runId: string | undefined, refreshKey = 0): UseArtifactsResult {
99
- const [flatFiles, setFlatFiles] = useState<string[]>([]);
121
+ export function useArtifacts(
122
+ client: VertesiaClient,
123
+ runId: string | undefined,
124
+ refreshKey = 0,
125
+ showSystem = false,
126
+ ): UseArtifactsResult {
127
+ const [allFiles, setAllFiles] = useState<string[]>([]);
100
128
  const [isLoading, setIsLoading] = useState(false);
101
129
  const [error, setError] = useState<string | null>(null);
102
130
  const [manualRefreshKey, setManualRefreshKey] = useState(0);
@@ -113,13 +141,13 @@ export function useArtifacts(client: VertesiaClient, runId: string | undefined,
113
141
  const paths = await client.files.listArtifacts(runId);
114
142
  if (fetchId !== fetchIdRef.current) return; // stale
115
143
 
116
- const relatives = paths.map((p) => stripToRelativePath(p, runId)).filter((p) => p && !isInternalFile(p));
144
+ const relatives = paths.map((p) => stripToRelativePath(p, runId)).filter((p) => !!p);
117
145
 
118
- setFlatFiles(relatives);
146
+ setAllFiles(relatives);
119
147
  } catch (err) {
120
148
  if (fetchId !== fetchIdRef.current) return;
121
149
  setError(err instanceof Error ? err.message : 'Failed to list artifacts');
122
- setFlatFiles([]);
150
+ setAllFiles([]);
123
151
  } finally {
124
152
  if (fetchId === fetchIdRef.current) {
125
153
  setIsLoading(false);
@@ -133,11 +161,16 @@ export function useArtifacts(client: VertesiaClient, runId: string | undefined,
133
161
  void fetchArtifacts();
134
162
  }, [fetchArtifacts, refreshKey, manualRefreshKey]);
135
163
 
164
+ const flatFiles = useMemo(
165
+ () => (showSystem ? allFiles : allFiles.filter((p) => !isSystemArtifact(p))),
166
+ [allFiles, showSystem],
167
+ );
136
168
  const tree = useMemo(() => buildTree(flatFiles), [flatFiles]);
169
+ const systemHiddenCount = allFiles.length - flatFiles.length;
137
170
 
138
171
  const refresh = useCallback(() => {
139
172
  setManualRefreshKey((k) => k + 1);
140
173
  }, []);
141
174
 
142
- return { tree, flatFiles, isLoading, error, refresh };
175
+ return { tree, flatFiles, totalCount: allFiles.length, systemHiddenCount, isLoading, error, refresh };
143
176
  }
@@ -0,0 +1,123 @@
1
+ import { screen, waitFor } from '@testing-library/react';
2
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
3
+ import { renderWithProviders } from '../../__tests__/test-utils.js';
4
+
5
+ const { getArtifactDownloadUrl, getDownloadUrl } = vi.hoisted(() => ({
6
+ getArtifactDownloadUrl: vi.fn(),
7
+ getDownloadUrl: vi.fn(),
8
+ }));
9
+
10
+ vi.mock('../pdf-viewer/SimplePdfViewer.js', () => ({
11
+ SimplePdfViewer: () => <div data-testid="pdf-viewer" />,
12
+ }));
13
+
14
+ vi.mock('@vertesia/ui/session', () => ({
15
+ useUserSession: () => ({
16
+ client: {
17
+ files: {
18
+ getArtifactDownloadUrl,
19
+ getDownloadUrl,
20
+ },
21
+ },
22
+ }),
23
+ }));
24
+
25
+ import { UniversalDocumentViewer } from './UniversalDocumentViewer';
26
+
27
+ describe('UniversalDocumentViewer TSX sandbox preview', () => {
28
+ beforeEach(() => {
29
+ vi.clearAllMocks();
30
+ getArtifactDownloadUrl.mockImplementation(
31
+ async (_runId: string, path: string, _disposition: 'inline' | 'attachment') => ({
32
+ url: `https://signed.example/${encodeURIComponent(path)}`,
33
+ }),
34
+ );
35
+ getDownloadUrl.mockImplementation(
36
+ async (path: string, _fileName?: string, _disposition?: 'inline' | 'attachment') => ({
37
+ url: `https://signed.example/${encodeURIComponent(path)}`,
38
+ }),
39
+ );
40
+ vi.stubGlobal(
41
+ 'fetch',
42
+ vi.fn(async (url: string) => {
43
+ const decodedUrl = decodeURIComponent(url);
44
+ const body = decodedUrl.endsWith('.render.json')
45
+ ? JSON.stringify({
46
+ ok: true,
47
+ source_artifact: 'files/mockups/Dashboard.tsx',
48
+ screenshot_artifact: 'files/mockups/Dashboard.png',
49
+ rendered_at: '2026-06-03T12:00:00.000Z',
50
+ viewport: { width: 1440, height: 900 },
51
+ dependencies_reused: true,
52
+ status: 200,
53
+ timings_ms: { total_before_cleanup: 11481 },
54
+ })
55
+ : 'export default function Dashboard() { return <main>Dashboard</main>; }';
56
+ return {
57
+ ok: true,
58
+ statusText: 'OK',
59
+ text: async () => body,
60
+ };
61
+ }),
62
+ );
63
+ });
64
+
65
+ it('renders a sibling sandbox PNG preview for TSX artifacts without executing source in Studio', async () => {
66
+ renderWithProviders(
67
+ <UniversalDocumentViewer
68
+ source={{
69
+ fileName: 'Dashboard.tsx',
70
+ contentType: 'text/typescript',
71
+ artifact: {
72
+ runId: 'agent-run-1',
73
+ path: 'files/mockups/Dashboard.tsx',
74
+ },
75
+ }}
76
+ />,
77
+ );
78
+
79
+ await screen.findByText('PNG preview');
80
+ const image = screen.getByAltText('Dashboard.tsx sandbox render') as HTMLImageElement;
81
+ expect(image.getAttribute('src')).toBe('https://signed.example/files%2Fmockups%2FDashboard.png');
82
+ expect(screen.getByText('deps reused')).toBeTruthy();
83
+ expect(screen.getByText('Total 11 s')).toBeTruthy();
84
+ expect(screen.getByText(/export default function Dashboard/)).toBeTruthy();
85
+
86
+ await waitFor(() => {
87
+ expect(getArtifactDownloadUrl).toHaveBeenCalledWith(
88
+ 'agent-run-1',
89
+ 'files/mockups/Dashboard.render.json',
90
+ 'inline',
91
+ );
92
+ });
93
+ expect(getArtifactDownloadUrl).toHaveBeenCalledWith('agent-run-1', 'files/mockups/Dashboard.png', 'inline');
94
+ });
95
+
96
+ it('resolves copied render metadata relative to app design storage paths', async () => {
97
+ renderWithProviders(
98
+ <UniversalDocumentViewer
99
+ source={{
100
+ fileName: 'Dashboard.tsx',
101
+ contentType: 'text/typescript',
102
+ sourcePath: 'apps/store-health/designs/design-1/artifacts/files/mockups/Dashboard.tsx',
103
+ }}
104
+ />,
105
+ );
106
+
107
+ await screen.findByText('PNG preview');
108
+ const image = screen.getByAltText('Dashboard.tsx sandbox render') as HTMLImageElement;
109
+ expect(image.getAttribute('src')).toBe(
110
+ 'https://signed.example/apps%2Fstore-health%2Fdesigns%2Fdesign-1%2Fartifacts%2Ffiles%2Fmockups%2FDashboard.png',
111
+ );
112
+ expect(getDownloadUrl).toHaveBeenCalledWith(
113
+ 'apps/store-health/designs/design-1/artifacts/files/mockups/Dashboard.render.json',
114
+ 'Dashboard.render.json',
115
+ 'inline',
116
+ );
117
+ expect(getDownloadUrl).toHaveBeenCalledWith(
118
+ 'apps/store-health/designs/design-1/artifacts/files/mockups/Dashboard.png',
119
+ 'Dashboard.png',
120
+ 'inline',
121
+ );
122
+ });
123
+ });