@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.
- package/lib/core/components/SidePanel.js +1 -1
- package/lib/core/components/SidePanel.js.map +1 -1
- package/lib/core/components/shadcn/button.d.ts +10 -3
- package/lib/core/components/shadcn/button.d.ts.map +1 -1
- package/lib/core/components/shadcn/button.js +41 -9
- package/lib/core/components/shadcn/button.js.map +1 -1
- package/lib/core/components/shadcn/modal/dialog.js +1 -1
- package/lib/core/components/shadcn/modal/dialog.js.map +1 -1
- package/lib/core/components/shadcn/theme/ThemeSwitcher.js +1 -1
- package/lib/core/components/shadcn/theme/ThemeSwitcher.js.map +1 -1
- package/lib/env/index.d.ts +19 -0
- package/lib/env/index.d.ts.map +1 -1
- package/lib/env/index.js +6 -0
- package/lib/env/index.js.map +1 -1
- package/lib/features/agent/chat/AgentChatPlaybackControls.d.ts.map +1 -1
- package/lib/features/agent/chat/AgentChatPlaybackControls.js +2 -2
- package/lib/features/agent/chat/AgentChatPlaybackControls.js.map +1 -1
- package/lib/features/agent/chat/AgentRequestInputOverlay.d.ts.map +1 -1
- package/lib/features/agent/chat/AgentRequestInputOverlay.js +2 -2
- package/lib/features/agent/chat/AgentRequestInputOverlay.js.map +1 -1
- package/lib/features/agent/chat/ArtifactsTab.d.ts.map +1 -1
- package/lib/features/agent/chat/ArtifactsTab.js +68 -11
- package/lib/features/agent/chat/ArtifactsTab.js.map +1 -1
- package/lib/features/agent/chat/ImageLightbox.d.ts.map +1 -1
- package/lib/features/agent/chat/ImageLightbox.js +1 -1
- package/lib/features/agent/chat/ImageLightbox.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentConversation.js +52 -49
- package/lib/features/agent/chat/ModernAgentConversation.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js +5 -5
- package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/Header.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/Header.js +4 -2
- package/lib/features/agent/chat/ModernAgentOutput/Header.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageInput.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js +2 -2
- package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageItem.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js +2 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.d.ts +6 -0
- package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.js +15 -1
- package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.js.map +1 -1
- package/lib/features/agent/chat/hooks/useArtifacts.d.ts +8 -1
- package/lib/features/agent/chat/hooks/useArtifacts.d.ts.map +1 -1
- package/lib/features/agent/chat/hooks/useArtifacts.js +28 -10
- package/lib/features/agent/chat/hooks/useArtifacts.js.map +1 -1
- package/lib/features/document-viewer/UniversalDocumentViewer.d.ts +73 -0
- package/lib/features/document-viewer/UniversalDocumentViewer.d.ts.map +1 -0
- package/lib/features/document-viewer/UniversalDocumentViewer.js +415 -0
- package/lib/features/document-viewer/UniversalDocumentViewer.js.map +1 -0
- package/lib/features/document-viewer/index.d.ts +2 -0
- package/lib/features/document-viewer/index.d.ts.map +1 -0
- package/lib/features/document-viewer/index.js +2 -0
- package/lib/features/document-viewer/index.js.map +1 -0
- package/lib/features/environment/SelectEnvironment.d.ts +28 -0
- package/lib/features/environment/SelectEnvironment.d.ts.map +1 -0
- package/lib/features/environment/SelectEnvironment.js +97 -0
- package/lib/features/environment/SelectEnvironment.js.map +1 -0
- package/lib/features/environment/index.d.ts +2 -0
- package/lib/features/environment/index.d.ts.map +1 -0
- package/lib/features/environment/index.js +2 -0
- package/lib/features/environment/index.js.map +1 -0
- package/lib/features/index.d.ts +3 -0
- package/lib/features/index.d.ts.map +1 -1
- package/lib/features/index.js +3 -0
- package/lib/features/index.js.map +1 -1
- package/lib/features/magic-pdf/AnnotatedImageSlider.js +12 -12
- package/lib/features/magic-pdf/AnnotatedImageSlider.js.map +1 -1
- package/lib/features/magic-pdf/DownloadPopover.d.ts.map +1 -1
- package/lib/features/magic-pdf/DownloadPopover.js +3 -17
- package/lib/features/magic-pdf/DownloadPopover.js.map +1 -1
- package/lib/features/magic-pdf/ExtractedContentView.js +2 -6
- package/lib/features/magic-pdf/ExtractedContentView.js.map +1 -1
- package/lib/features/magic-pdf/GroundedExtractionAssistantPanel.d.ts +25 -0
- package/lib/features/magic-pdf/GroundedExtractionAssistantPanel.d.ts.map +1 -0
- package/lib/features/magic-pdf/GroundedExtractionAssistantPanel.js +42 -0
- package/lib/features/magic-pdf/GroundedExtractionAssistantPanel.js.map +1 -0
- package/lib/features/magic-pdf/GroundedExtractionView.d.ts +27 -0
- package/lib/features/magic-pdf/GroundedExtractionView.d.ts.map +1 -0
- package/lib/features/magic-pdf/GroundedExtractionView.js +377 -0
- package/lib/features/magic-pdf/GroundedExtractionView.js.map +1 -0
- package/lib/features/magic-pdf/MagicPdfProvider.d.ts +0 -2
- package/lib/features/magic-pdf/MagicPdfProvider.d.ts.map +1 -1
- package/lib/features/magic-pdf/MagicPdfProvider.js +15 -42
- package/lib/features/magic-pdf/MagicPdfProvider.js.map +1 -1
- package/lib/features/magic-pdf/MagicPdfView.d.ts.map +1 -1
- package/lib/features/magic-pdf/MagicPdfView.js +2 -19
- package/lib/features/magic-pdf/MagicPdfView.js.map +1 -1
- package/lib/features/magic-pdf/index.d.ts +1 -0
- package/lib/features/magic-pdf/index.d.ts.map +1 -1
- package/lib/features/magic-pdf/index.js +1 -0
- package/lib/features/magic-pdf/index.js.map +1 -1
- package/lib/features/magic-pdf/types.d.ts +1 -1
- package/lib/features/magic-pdf/types.d.ts.map +1 -1
- package/lib/features/oauth/McpConnectionsButton.d.ts.map +1 -1
- package/lib/features/oauth/McpConnectionsButton.js +2 -2
- package/lib/features/oauth/McpConnectionsButton.js.map +1 -1
- package/lib/features/oauth/McpConnectionsDialog.d.ts.map +1 -1
- package/lib/features/oauth/McpConnectionsDialog.js +1 -1
- package/lib/features/oauth/McpConnectionsDialog.js.map +1 -1
- package/lib/features/oauth/RemoteMcpConnectionButton.d.ts.map +1 -1
- package/lib/features/oauth/RemoteMcpConnectionButton.js +1 -1
- package/lib/features/oauth/RemoteMcpConnectionButton.js.map +1 -1
- package/lib/features/pdf-viewer/PdfPageSlider.js +2 -2
- package/lib/features/pdf-viewer/PdfPageSlider.js.map +1 -1
- package/lib/features/pdf-viewer/SimplePdfViewer.d.ts.map +1 -1
- package/lib/features/pdf-viewer/SimplePdfViewer.js +3 -3
- package/lib/features/pdf-viewer/SimplePdfViewer.js.map +1 -1
- package/lib/features/permissions/UserPermissionsProvider.d.ts +2 -3
- package/lib/features/permissions/UserPermissionsProvider.d.ts.map +1 -1
- package/lib/features/permissions/UserPermissionsProvider.js +31 -38
- package/lib/features/permissions/UserPermissionsProvider.js.map +1 -1
- package/lib/features/store/objects/DocumentQuickFilter.d.ts.map +1 -1
- package/lib/features/store/objects/DocumentQuickFilter.js +5 -5
- package/lib/features/store/objects/DocumentQuickFilter.js.map +1 -1
- package/lib/features/store/objects/DocumentSearchResults.d.ts.map +1 -1
- package/lib/features/store/objects/DocumentSearchResults.js +2 -2
- package/lib/features/store/objects/DocumentSearchResults.js.map +1 -1
- package/lib/features/store/objects/components/ContentDispositionButton.d.ts.map +1 -1
- package/lib/features/store/objects/components/ContentDispositionButton.js +1 -1
- package/lib/features/store/objects/components/ContentDispositionButton.js.map +1 -1
- package/lib/features/store/objects/components/ContentOverview.d.ts.map +1 -1
- package/lib/features/store/objects/components/ContentOverview.js +148 -31
- package/lib/features/store/objects/components/ContentOverview.js.map +1 -1
- package/lib/features/store/objects/components/DocumentIcon.js +1 -1
- package/lib/features/store/objects/components/VectorSearchWidget.js +1 -1
- package/lib/features/store/objects/components/VectorSearchWidget.js.map +1 -1
- package/lib/features/store/objects/components/useContentPanelHooks.d.ts +1 -2
- package/lib/features/store/objects/components/useContentPanelHooks.d.ts.map +1 -1
- package/lib/features/store/objects/components/useContentPanelHooks.js +4 -8
- package/lib/features/store/objects/components/useContentPanelHooks.js.map +1 -1
- package/lib/features/store/objects/layout/renderers.d.ts.map +1 -1
- package/lib/features/store/objects/layout/renderers.js +2 -2
- package/lib/features/store/objects/layout/renderers.js.map +1 -1
- package/lib/features/store/objects/selection/SelectionActions.js +1 -1
- package/lib/features/store/objects/selection/SelectionActions.js.map +1 -1
- package/lib/features/store/types/ContentObjectTypesTable.d.ts.map +1 -1
- package/lib/features/store/types/ContentObjectTypesTable.js +4 -4
- package/lib/features/store/types/ContentObjectTypesTable.js.map +1 -1
- package/lib/features/store/types/IntakePolicyEditor.d.ts +15 -0
- package/lib/features/store/types/IntakePolicyEditor.d.ts.map +1 -0
- package/lib/features/store/types/IntakePolicyEditor.js +455 -0
- package/lib/features/store/types/IntakePolicyEditor.js.map +1 -0
- package/lib/features/store/types/IntakePolicyForm.d.ts +11 -0
- package/lib/features/store/types/IntakePolicyForm.d.ts.map +1 -0
- package/lib/features/store/types/IntakePolicyForm.js +91 -0
- package/lib/features/store/types/IntakePolicyForm.js.map +1 -0
- package/lib/features/store/types/SelectContentTypeModal.js +1 -1
- package/lib/features/store/types/SelectContentTypeModal.js.map +1 -1
- package/lib/features/store/types/index.d.ts +2 -0
- package/lib/features/store/types/index.d.ts.map +1 -1
- package/lib/features/store/types/index.js +2 -0
- package/lib/features/store/types/index.js.map +1 -1
- package/lib/features/store/types/intake-policy-editor.logic.d.ts +7 -0
- package/lib/features/store/types/intake-policy-editor.logic.d.ts.map +1 -0
- package/lib/features/store/types/intake-policy-editor.logic.js +60 -0
- package/lib/features/store/types/intake-policy-editor.logic.js.map +1 -0
- package/lib/features/store/types/typeCatalogCache.d.ts +5 -0
- package/lib/features/store/types/typeCatalogCache.d.ts.map +1 -0
- package/lib/features/store/types/typeCatalogCache.js +40 -0
- package/lib/features/store/types/typeCatalogCache.js.map +1 -0
- package/lib/features/user/UserInfo.js +7 -3
- package/lib/features/user/UserInfo.js.map +1 -1
- package/lib/features/views/ViewExperience.d.ts +20 -0
- package/lib/features/views/ViewExperience.d.ts.map +1 -0
- package/lib/features/views/ViewExperience.js +188 -0
- package/lib/features/views/ViewExperience.js.map +1 -0
- package/lib/features/views/ViewNavigation.d.ts +3 -0
- package/lib/features/views/ViewNavigation.d.ts.map +1 -0
- package/lib/features/views/ViewNavigation.js +36 -0
- package/lib/features/views/ViewNavigation.js.map +1 -0
- package/lib/features/views/ViewResults.d.ts +9 -0
- package/lib/features/views/ViewResults.d.ts.map +1 -0
- package/lib/features/views/ViewResults.js +229 -0
- package/lib/features/views/ViewResults.js.map +1 -0
- package/lib/features/views/ViewSearch.d.ts +3 -0
- package/lib/features/views/ViewSearch.d.ts.map +1 -0
- package/lib/features/views/ViewSearch.js +74 -0
- package/lib/features/views/ViewSearch.js.map +1 -0
- package/lib/features/views/index.d.ts +7 -0
- package/lib/features/views/index.d.ts.map +1 -0
- package/lib/features/views/index.js +7 -0
- package/lib/features/views/index.js.map +1 -0
- package/lib/features/views/types.d.ts +39 -0
- package/lib/features/views/types.d.ts.map +1 -0
- package/lib/features/views/types.js +2 -0
- package/lib/features/views/types.js.map +1 -0
- package/lib/features/views/viewState.d.ts +14 -0
- package/lib/features/views/viewState.d.ts.map +1 -0
- package/lib/features/views/viewState.js +117 -0
- package/lib/features/views/viewState.js.map +1 -0
- package/lib/i18n/locales/ar.json +18 -0
- package/lib/i18n/locales/de.json +14 -0
- package/lib/i18n/locales/en.json +246 -32
- package/lib/i18n/locales/es.json +15 -0
- package/lib/i18n/locales/fr.json +15 -0
- package/lib/i18n/locales/it.json +15 -0
- package/lib/i18n/locales/ja.json +13 -0
- package/lib/i18n/locales/ko.json +13 -0
- package/lib/i18n/locales/pt.json +15 -0
- package/lib/i18n/locales/ru.json +16 -0
- package/lib/i18n/locales/tr.json +14 -0
- package/lib/i18n/locales/zh-TW.json +13 -0
- package/lib/i18n/locales/zh.json +13 -0
- package/lib/router/HistoryNavigator.d.ts.map +1 -1
- package/lib/router/HistoryNavigator.js +27 -14
- package/lib/router/HistoryNavigator.js.map +1 -1
- package/lib/router/Nav.d.ts.map +1 -1
- package/lib/router/Nav.js +21 -6
- package/lib/router/Nav.js.map +1 -1
- package/lib/router/Router.d.ts.map +1 -1
- package/lib/router/Router.js +19 -4
- package/lib/router/Router.js.map +1 -1
- package/lib/router/path.d.ts +15 -0
- package/lib/router/path.d.ts.map +1 -1
- package/lib/router/path.js +43 -0
- package/lib/router/path.js.map +1 -1
- package/lib/session/UserSession.d.ts +6 -0
- package/lib/session/UserSession.d.ts.map +1 -1
- package/lib/session/UserSession.js +36 -12
- package/lib/session/UserSession.js.map +1 -1
- package/lib/session/UserSessionProvider.d.ts.map +1 -1
- package/lib/session/UserSessionProvider.js +111 -49
- package/lib/session/UserSessionProvider.js.map +1 -1
- package/lib/session/auth/composable.d.ts.map +1 -1
- package/lib/session/auth/composable.js +52 -3
- package/lib/session/auth/composable.js.map +1 -1
- package/lib/session/auth/domainRouting.d.ts +25 -0
- package/lib/session/auth/domainRouting.d.ts.map +1 -1
- package/lib/session/auth/domainRouting.js +36 -0
- package/lib/session/auth/domainRouting.js.map +1 -1
- package/lib/shell/login/SignInRestrictedEnvStep.d.ts +1 -1
- package/lib/shell/login/SignInRestrictedEnvStep.js +1 -1
- package/lib/shell/login/SigninScreen.js +9 -1
- package/lib/shell/login/SigninScreen.js.map +1 -1
- package/lib/shell/login/productionUrl.d.ts +0 -14
- package/lib/shell/login/productionUrl.d.ts.map +1 -1
- package/lib/shell/login/productionUrl.js +14 -5
- package/lib/shell/login/productionUrl.js.map +1 -1
- package/lib/vertesia-ui-core.js +4 -4
- package/lib/vertesia-ui-core.js.map +1 -1
- package/lib/vertesia-ui-env.js +1 -1
- package/lib/vertesia-ui-env.js.map +1 -1
- package/lib/vertesia-ui-features.js +35 -28
- package/lib/vertesia-ui-features.js.map +1 -1
- package/lib/vertesia-ui-i18n.js +15 -15
- package/lib/vertesia-ui-i18n.js.map +1 -1
- package/lib/vertesia-ui-router.js +1 -1
- package/lib/vertesia-ui-router.js.map +1 -1
- package/lib/vertesia-ui-session.js +1 -1
- package/lib/vertesia-ui-session.js.map +1 -1
- package/lib/vertesia-ui-shell.js +1 -1
- package/lib/vertesia-ui-shell.js.map +1 -1
- package/lib/vertesia-ui-widgets.js +7 -7
- package/lib/vertesia-ui-widgets.js.map +1 -1
- package/lib/widgets/form/Form.js +1 -1
- package/lib/widgets/form/Form.js.map +1 -1
- package/lib/widgets/json-view/JSONSwitcher.js +1 -1
- package/lib/widgets/json-view/JSONSwitcher.js.map +1 -1
- package/lib/widgets/json-view/JSONView.js +6 -6
- package/lib/widgets/json-view/JSONView.js.map +1 -1
- package/lib/widgets/monacoEditor/MonacoEditor.d.ts.map +1 -1
- package/lib/widgets/monacoEditor/MonacoEditor.js +29 -0
- package/lib/widgets/monacoEditor/MonacoEditor.js.map +1 -1
- package/lib/widgets/schema-editor/ManagedSchema.d.ts +8 -0
- package/lib/widgets/schema-editor/ManagedSchema.d.ts.map +1 -1
- package/lib/widgets/schema-editor/ManagedSchema.js +16 -0
- package/lib/widgets/schema-editor/ManagedSchema.js.map +1 -1
- package/lib/widgets/schema-editor/editor/EditableSchemaProperty.d.ts +2 -0
- package/lib/widgets/schema-editor/editor/EditableSchemaProperty.d.ts.map +1 -1
- package/lib/widgets/schema-editor/editor/EditableSchemaProperty.js +1 -0
- package/lib/widgets/schema-editor/editor/EditableSchemaProperty.js.map +1 -1
- package/lib/widgets/schema-editor/editor/PropertyViewer.d.ts.map +1 -1
- package/lib/widgets/schema-editor/editor/PropertyViewer.js +4 -1
- package/lib/widgets/schema-editor/editor/PropertyViewer.js.map +1 -1
- package/lib/widgets/schema-editor/editor/SchemaEditor.d.ts.map +1 -1
- package/lib/widgets/schema-editor/editor/SchemaEditor.js +22 -11
- package/lib/widgets/schema-editor/editor/SchemaEditor.js.map +1 -1
- package/llms.txt +70 -70
- package/package.json +33 -32
- package/src/__tests__/a11y.test.tsx +73 -0
- package/src/core/components/SidePanel.tsx +1 -1
- package/src/core/components/shadcn/button.tsx +67 -12
- package/src/core/components/shadcn/modal/dialog.tsx +1 -1
- package/src/core/components/shadcn/theme/ThemeSwitcher.tsx +1 -1
- package/src/env/index.ts +24 -0
- package/src/features/agent/chat/AgentChatPlaybackControls.tsx +0 -5
- package/src/features/agent/chat/AgentRequestInputOverlay.test.tsx +31 -0
- package/src/features/agent/chat/AgentRequestInputOverlay.tsx +6 -2
- package/src/features/agent/chat/ArtifactsTab.tsx +165 -21
- package/src/features/agent/chat/ImageLightbox.tsx +0 -1
- package/src/features/agent/chat/ModernAgentConversation.test.tsx +48 -0
- package/src/features/agent/chat/ModernAgentConversation.tsx +53 -51
- package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.test.tsx +6 -1
- package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +21 -15
- package/src/features/agent/chat/ModernAgentOutput/Header.tsx +3 -3
- package/src/features/agent/chat/ModernAgentOutput/MessageInput.tsx +0 -2
- package/src/features/agent/chat/ModernAgentOutput/MessageItem.tsx +4 -1
- package/src/features/agent/chat/ModernAgentOutput/requestInputMessages.test.ts +80 -0
- package/src/features/agent/chat/ModernAgentOutput/requestInputMessages.ts +21 -1
- package/src/features/agent/chat/hooks/useArtifacts.ts +44 -11
- package/src/features/document-viewer/UniversalDocumentViewer.test.tsx +123 -0
- package/src/features/document-viewer/UniversalDocumentViewer.tsx +746 -0
- package/src/features/document-viewer/index.ts +1 -0
- package/src/features/environment/SelectEnvironment.tsx +186 -0
- package/src/features/environment/index.ts +1 -0
- package/src/features/index.ts +3 -0
- package/src/features/magic-pdf/AnnotatedImageSlider.tsx +62 -66
- package/src/features/magic-pdf/DownloadPopover.tsx +5 -48
- package/src/features/magic-pdf/ExtractedContentView.tsx +2 -14
- package/src/features/magic-pdf/GroundedExtractionAssistantPanel.tsx +86 -0
- package/src/features/magic-pdf/GroundedExtractionView.test.tsx +65 -0
- package/src/features/magic-pdf/GroundedExtractionView.tsx +1055 -0
- package/src/features/magic-pdf/MagicPdfProvider.tsx +17 -47
- package/src/features/magic-pdf/MagicPdfView.tsx +3 -51
- package/src/features/magic-pdf/index.ts +1 -0
- package/src/features/magic-pdf/types.ts +1 -1
- package/src/features/oauth/McpConnectionsButton.tsx +0 -2
- package/src/features/oauth/McpConnectionsDialog.tsx +0 -1
- package/src/features/oauth/RemoteMcpConnectionButton.tsx +0 -1
- package/src/features/pdf-viewer/PdfPageSlider.tsx +5 -5
- package/src/features/pdf-viewer/SimplePdfViewer.tsx +11 -12
- package/src/features/permissions/UserPermissionsProvider.tsx +36 -39
- package/src/features/store/objects/DocumentQuickFilter.tsx +13 -15
- package/src/features/store/objects/DocumentSearchResults.tsx +3 -6
- package/src/features/store/objects/components/ContentDispositionButton.tsx +5 -1
- package/src/features/store/objects/components/ContentOverview.tsx +240 -67
- package/src/features/store/objects/components/DocumentIcon.tsx +1 -1
- package/src/features/store/objects/components/VectorSearchWidget.tsx +2 -2
- package/src/features/store/objects/components/useContentPanelHooks.ts +3 -15
- package/src/features/store/objects/layout/renderers.tsx +1 -2
- package/src/features/store/objects/selection/SelectionActions.tsx +1 -1
- package/src/features/store/types/ContentObjectTypesTable.tsx +12 -14
- package/src/features/store/types/IntakePolicyEditor.tsx +679 -0
- package/src/features/store/types/IntakePolicyForm.tsx +838 -0
- package/src/features/store/types/SelectContentTypeModal.tsx +2 -2
- package/src/features/store/types/index.ts +2 -0
- package/src/features/store/types/intake-policy-editor.logic.test.ts +109 -0
- package/src/features/store/types/intake-policy-editor.logic.ts +87 -0
- package/src/features/store/types/typeCatalogCache.ts +45 -0
- package/src/features/user/UserInfo.tsx +7 -7
- package/src/features/views/ViewExperience.test.tsx +273 -0
- package/src/features/views/ViewExperience.tsx +408 -0
- package/src/features/views/ViewNavigation.test.tsx +86 -0
- package/src/features/views/ViewNavigation.tsx +187 -0
- package/src/features/views/ViewResults.test.ts +82 -0
- package/src/features/views/ViewResults.tsx +609 -0
- package/src/features/views/ViewSearch.test.tsx +147 -0
- package/src/features/views/ViewSearch.tsx +205 -0
- package/src/features/views/index.ts +6 -0
- package/src/features/views/types.ts +57 -0
- package/src/features/views/viewState.test.ts +111 -0
- package/src/features/views/viewState.ts +132 -0
- package/src/i18n/locales/ar.json +18 -0
- package/src/i18n/locales/de.json +14 -0
- package/src/i18n/locales/en.json +965 -751
- package/src/i18n/locales/es.json +15 -0
- package/src/i18n/locales/fr.json +15 -0
- package/src/i18n/locales/it.json +15 -0
- package/src/i18n/locales/ja.json +13 -0
- package/src/i18n/locales/ko.json +13 -0
- package/src/i18n/locales/pt.json +15 -0
- package/src/i18n/locales/ru.json +16 -0
- package/src/i18n/locales/tr.json +14 -0
- package/src/i18n/locales/zh-TW.json +13 -0
- package/src/i18n/locales/zh.json +13 -0
- package/src/router/HistoryNavigator.test.ts +48 -0
- package/src/router/HistoryNavigator.ts +28 -14
- package/src/router/Nav.tsx +24 -8
- package/src/router/Router.tsx +18 -4
- package/src/router/path.test.ts +87 -0
- package/src/router/path.ts +38 -0
- package/src/session/UserSession.test.ts +39 -0
- package/src/session/UserSession.ts +37 -12
- package/src/session/UserSessionProvider.tsx +138 -62
- package/src/session/auth/composable.test.ts +111 -0
- package/src/session/auth/composable.ts +58 -3
- package/src/session/auth/domainRouting.test.ts +28 -1
- package/src/session/auth/domainRouting.ts +38 -0
- package/src/shell/login/SignInRestrictedEnvStep.tsx +1 -1
- package/src/shell/login/SigninScreen.tsx +9 -1
- package/src/shell/login/productionUrl.test.ts +8 -5
- package/src/shell/login/productionUrl.ts +15 -5
- package/src/widgets/form/Form.tsx +1 -1
- package/src/widgets/json-view/JSONSwitcher.tsx +2 -2
- package/src/widgets/json-view/JSONView.tsx +7 -7
- package/src/widgets/monacoEditor/MonacoEditor.tsx +29 -0
- package/src/widgets/schema-editor/ManagedSchema.ts +22 -0
- package/src/widgets/schema-editor/editor/EditableSchemaProperty.tsx +3 -0
- package/src/widgets/schema-editor/editor/PropertyViewer.tsx +14 -3
- 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
|
|
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) =>
|
|
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) =>
|
|
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
|
-
<
|
|
3250
|
-
|
|
3251
|
-
|
|
3252
|
-
|
|
3253
|
-
|
|
3254
|
-
|
|
3255
|
-
|
|
3256
|
-
|
|
3257
|
-
|
|
3258
|
-
|
|
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
|
|
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) =>
|
|
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
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
|
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(
|
|
99
|
-
|
|
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
|
|
144
|
+
const relatives = paths.map((p) => stripToRelativePath(p, runId)).filter((p) => !!p);
|
|
117
145
|
|
|
118
|
-
|
|
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
|
-
|
|
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
|
+
});
|