@vertesia/ui 1.5.0-dev.20260807.073259Z → 1.5.0-dev.20260901.005903Z
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/README.md +1 -7
- package/lib/core/components/FormItem.d.ts.map +1 -1
- package/lib/core/components/FormItem.js +2 -3
- package/lib/core/components/FormItem.js.map +1 -1
- package/lib/core/components/InfoTip.d.ts +20 -0
- package/lib/core/components/InfoTip.d.ts.map +1 -0
- package/lib/core/components/InfoTip.js +18 -0
- package/lib/core/components/InfoTip.js.map +1 -0
- package/lib/core/components/index.d.ts +1 -0
- package/lib/core/components/index.d.ts.map +1 -1
- package/lib/core/components/index.js +1 -0
- package/lib/core/components/index.js.map +1 -1
- package/lib/core/components/shadcn/Panel.d.ts.map +1 -1
- package/lib/core/components/shadcn/Panel.js +3 -3
- package/lib/core/components/shadcn/Panel.js.map +1 -1
- package/lib/core/components/shadcn/filters/comboBox/DateCombobox.js +1 -1
- package/lib/core/components/shadcn/filters/comboBox/DateCombobox.js.map +1 -1
- package/lib/core/components/shadcn/filters/filter/dateFilter.d.ts.map +1 -1
- package/lib/core/components/shadcn/filters/filter/dateFilter.js +1 -1
- package/lib/core/components/shadcn/filters/filter/dateFilter.js.map +1 -1
- package/lib/core/components/shadcn/filters/filters.d.ts.map +1 -1
- package/lib/core/components/shadcn/filters/filters.js +1 -1
- package/lib/core/components/shadcn/filters/filters.js.map +1 -1
- package/lib/core/components/shadcn/index.d.ts +1 -0
- package/lib/core/components/shadcn/index.d.ts.map +1 -1
- package/lib/core/components/shadcn/index.js +1 -0
- package/lib/core/components/shadcn/index.js.map +1 -1
- package/lib/core/components/shadcn/modal/dialog.d.ts.map +1 -1
- package/lib/core/components/shadcn/modal/dialog.js +1 -3
- package/lib/core/components/shadcn/modal/dialog.js.map +1 -1
- package/lib/core/components/shadcn/overflowTabs.d.ts +59 -0
- package/lib/core/components/shadcn/overflowTabs.d.ts.map +1 -0
- package/lib/core/components/shadcn/overflowTabs.js +173 -0
- package/lib/core/components/shadcn/overflowTabs.js.map +1 -0
- package/lib/core/components/shadcn/selectBox.js +2 -2
- package/lib/core/components/shadcn/selectBox.js.map +1 -1
- package/lib/core/components/shadcn/theme/ThemeProvider.d.ts +3 -1
- package/lib/core/components/shadcn/theme/ThemeProvider.d.ts.map +1 -1
- package/lib/core/components/shadcn/theme/ThemeProvider.js +8 -9
- package/lib/core/components/shadcn/theme/ThemeProvider.js.map +1 -1
- package/lib/core/utils/dayjs.d.ts +12 -0
- package/lib/core/utils/dayjs.d.ts.map +1 -0
- package/lib/core/utils/dayjs.js +16 -0
- package/lib/core/utils/dayjs.js.map +1 -0
- package/lib/env/index.d.ts +17 -0
- package/lib/env/index.d.ts.map +1 -1
- package/lib/env/index.js +18 -1
- package/lib/env/index.js.map +1 -1
- package/lib/features/agent/PayloadBuilder.d.ts +1 -0
- package/lib/features/agent/PayloadBuilder.d.ts.map +1 -1
- package/lib/features/agent/PayloadBuilder.js +22 -5
- package/lib/features/agent/PayloadBuilder.js.map +1 -1
- package/lib/features/agent/chat/AgentRightPanel.d.ts.map +1 -1
- package/lib/features/agent/chat/AgentRightPanel.js +3 -135
- package/lib/features/agent/chat/AgentRightPanel.js.map +1 -1
- package/lib/features/agent/chat/ArtifactsTab.d.ts.map +1 -1
- package/lib/features/agent/chat/ArtifactsTab.js +1 -1
- package/lib/features/agent/chat/ArtifactsTab.js.map +1 -1
- package/lib/features/agent/chat/AskUserWidget.d.ts.map +1 -1
- package/lib/features/agent/chat/AskUserWidget.js +19 -4
- package/lib/features/agent/chat/AskUserWidget.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentConversation.d.ts +6 -0
- package/lib/features/agent/chat/ModernAgentConversation.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentConversation.js +99 -29
- package/lib/features/agent/chat/ModernAgentConversation.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.js +10 -9
- package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.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 -8
- package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.js +45 -4
- package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/BatchProgressPanel.js +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/BatchProgressPanel.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/Header.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/Header.js +3 -3
- package/lib/features/agent/chat/ModernAgentOutput/Header.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageItem.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/StreamingMessage.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/StreamingMessage.js +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/StreamingMessage.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/ToolCallGroup.js +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/ToolCallGroup.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/WorkstreamTabs.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js +9 -121
- package/lib/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/utils.d.ts +6 -0
- package/lib/features/agent/chat/ModernAgentOutput/utils.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/utils.js +19 -11
- package/lib/features/agent/chat/ModernAgentOutput/utils.js.map +1 -1
- package/lib/features/agent/chat/VegaLiteChart.d.ts.map +1 -1
- package/lib/features/agent/chat/VegaLiteChart.js +11 -3
- package/lib/features/agent/chat/VegaLiteChart.js.map +1 -1
- package/lib/features/agent/chat/hooks/useAgentStream.d.ts.map +1 -1
- package/lib/features/agent/chat/hooks/useAgentStream.js +3 -0
- package/lib/features/agent/chat/hooks/useAgentStream.js.map +1 -1
- package/lib/features/document-viewer/UniversalDocumentViewer.d.ts.map +1 -1
- package/lib/features/document-viewer/UniversalDocumentViewer.js +1 -1
- package/lib/features/document-viewer/UniversalDocumentViewer.js.map +1 -1
- package/lib/features/facets/AgentRunnerFacetsNav.d.ts +14 -2
- package/lib/features/facets/AgentRunnerFacetsNav.d.ts.map +1 -1
- package/lib/features/facets/AgentRunnerFacetsNav.js +20 -2
- package/lib/features/facets/AgentRunnerFacetsNav.js.map +1 -1
- package/lib/features/facets/CollectionsFacetsNav.d.ts +3 -3
- package/lib/features/facets/CollectionsFacetsNav.d.ts.map +1 -1
- package/lib/features/facets/CollectionsFacetsNav.js +6 -1
- package/lib/features/facets/CollectionsFacetsNav.js.map +1 -1
- package/lib/features/facets/DocumentsFacetsNav.d.ts +3 -3
- package/lib/features/facets/DocumentsFacetsNav.d.ts.map +1 -1
- package/lib/features/facets/DocumentsFacetsNav.js +20 -8
- package/lib/features/facets/DocumentsFacetsNav.js.map +1 -1
- package/lib/features/facets/InteractionsFacetsNav.d.ts +3 -3
- package/lib/features/facets/InteractionsFacetsNav.d.ts.map +1 -1
- package/lib/features/facets/InteractionsFacetsNav.js +11 -1
- package/lib/features/facets/InteractionsFacetsNav.js.map +1 -1
- package/lib/features/facets/PromptsFacetsNav.d.ts +3 -3
- package/lib/features/facets/PromptsFacetsNav.d.ts.map +1 -1
- package/lib/features/facets/PromptsFacetsNav.js +6 -1
- package/lib/features/facets/PromptsFacetsNav.js.map +1 -1
- package/lib/features/facets/RunsFacetsNav.d.ts +4 -14
- package/lib/features/facets/RunsFacetsNav.d.ts.map +1 -1
- package/lib/features/facets/RunsFacetsNav.js +26 -15
- package/lib/features/facets/RunsFacetsNav.js.map +1 -1
- package/lib/features/facets/WorkflowExecutionsFacetsNav.d.ts +4 -3
- package/lib/features/facets/WorkflowExecutionsFacetsNav.d.ts.map +1 -1
- package/lib/features/facets/WorkflowExecutionsFacetsNav.js +18 -10
- package/lib/features/facets/WorkflowExecutionsFacetsNav.js.map +1 -1
- package/lib/features/facets/index.d.ts +1 -1
- package/lib/features/facets/index.d.ts.map +1 -1
- package/lib/features/facets/index.js.map +1 -1
- package/lib/features/facets/utils/SearchInterface.d.ts +4 -3
- package/lib/features/facets/utils/SearchInterface.d.ts.map +1 -1
- package/lib/features/facets/utils/SearchInterface.js +4 -0
- package/lib/features/facets/utils/SearchInterface.js.map +1 -1
- package/lib/features/layout/GenericPageNavHeader.d.ts +8 -1
- package/lib/features/layout/GenericPageNavHeader.d.ts.map +1 -1
- package/lib/features/layout/GenericPageNavHeader.js +9 -1
- package/lib/features/layout/GenericPageNavHeader.js.map +1 -1
- package/lib/features/magic-pdf/DownloadPopover.d.ts +3 -2
- package/lib/features/magic-pdf/DownloadPopover.d.ts.map +1 -1
- package/lib/features/magic-pdf/DownloadPopover.js.map +1 -1
- package/lib/features/magic-pdf/GroundedExtractionView.d.ts.map +1 -1
- package/lib/features/magic-pdf/GroundedExtractionView.js +51 -64
- package/lib/features/magic-pdf/GroundedExtractionView.js.map +1 -1
- package/lib/features/oauth/McpConnectionsButton.d.ts +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 +1 -1
- package/lib/features/oauth/McpConnectionsDialog.js +2 -2
- package/lib/features/oauth/McpConnectionsDialog.js.map +1 -1
- package/lib/features/oauth/useMcpConnections.d.ts +4 -5
- package/lib/features/oauth/useMcpConnections.d.ts.map +1 -1
- package/lib/features/oauth/useMcpConnections.js +20 -4
- package/lib/features/oauth/useMcpConnections.js.map +1 -1
- package/lib/features/pdf-viewer/PdfPageRenderer.d.ts.map +1 -1
- package/lib/features/pdf-viewer/PdfPageRenderer.js +9 -11
- package/lib/features/pdf-viewer/PdfPageRenderer.js.map +1 -1
- package/lib/features/pdf-viewer/lazyReactPdf.d.ts +10 -0
- package/lib/features/pdf-viewer/lazyReactPdf.d.ts.map +1 -0
- package/lib/features/pdf-viewer/lazyReactPdf.js +25 -0
- package/lib/features/pdf-viewer/lazyReactPdf.js.map +1 -0
- package/lib/features/store/collections/CollectionsTable.d.ts.map +1 -1
- package/lib/features/store/collections/CollectionsTable.js +1 -3
- package/lib/features/store/collections/CollectionsTable.js.map +1 -1
- package/lib/features/store/collections/EditCollectionView.js +1 -1
- package/lib/features/store/collections/EditCollectionView.js.map +1 -1
- package/lib/features/store/objects/ExportPropertiesModal.d.ts +3 -1
- package/lib/features/store/objects/ExportPropertiesModal.d.ts.map +1 -1
- package/lib/features/store/objects/ExportPropertiesModal.js +5 -5
- package/lib/features/store/objects/ExportPropertiesModal.js.map +1 -1
- package/lib/features/store/objects/components/ContentOverview.d.ts.map +1 -1
- package/lib/features/store/objects/components/ContentOverview.js +4 -10
- package/lib/features/store/objects/components/ContentOverview.js.map +1 -1
- package/lib/features/store/objects/components/TextEditorPanel.d.ts.map +1 -1
- package/lib/features/store/objects/components/TextEditorPanel.js +8 -3
- package/lib/features/store/objects/components/TextEditorPanel.js.map +1 -1
- package/lib/features/store/objects/layout/renderers.d.ts.map +1 -1
- package/lib/features/store/objects/layout/renderers.js +1 -5
- package/lib/features/store/objects/layout/renderers.js.map +1 -1
- package/lib/features/store/objects/search/DocumentSearchContext.d.ts +44 -62
- package/lib/features/store/objects/search/DocumentSearchContext.d.ts.map +1 -1
- package/lib/features/store/objects/search/DocumentSearchContext.js +47 -2
- package/lib/features/store/objects/search/DocumentSearchContext.js.map +1 -1
- package/lib/features/store/objects/selection/actions/DeleteObjectsAction.d.ts.map +1 -1
- package/lib/features/store/objects/selection/actions/DeleteObjectsAction.js +5 -0
- package/lib/features/store/objects/selection/actions/DeleteObjectsAction.js.map +1 -1
- package/lib/features/store/objects/upload/DocumentUploadModal.d.ts +6 -1
- package/lib/features/store/objects/upload/DocumentUploadModal.d.ts.map +1 -1
- package/lib/features/store/objects/upload/DocumentUploadModal.js +4 -3
- package/lib/features/store/objects/upload/DocumentUploadModal.js.map +1 -1
- package/lib/features/store/objects/upload/useSmartFileUploadProcessing.d.ts.map +1 -1
- package/lib/features/store/objects/upload/useSmartFileUploadProcessing.js +2 -2
- package/lib/features/store/objects/upload/useSmartFileUploadProcessing.js.map +1 -1
- package/lib/features/store/types/ContentObjectTypesTable.d.ts.map +1 -1
- package/lib/features/store/types/ContentObjectTypesTable.js +1 -3
- package/lib/features/store/types/ContentObjectTypesTable.js.map +1 -1
- package/lib/features/store/types/IntakePolicyEditor.d.ts.map +1 -1
- package/lib/features/store/types/IntakePolicyEditor.js +12 -2
- package/lib/features/store/types/IntakePolicyEditor.js.map +1 -1
- package/lib/features/store/types/IntakePolicyForm.d.ts.map +1 -1
- package/lib/features/store/types/IntakePolicyForm.js +15 -15
- package/lib/features/store/types/IntakePolicyForm.js.map +1 -1
- package/lib/features/store/types/ObjectSchemaEditor.d.ts.map +1 -1
- package/lib/features/store/types/ObjectSchemaEditor.js +6 -2
- package/lib/features/store/types/ObjectSchemaEditor.js.map +1 -1
- package/lib/features/store/types/TableLayoutEditor.d.ts.map +1 -1
- package/lib/features/store/types/TableLayoutEditor.js +2 -0
- package/lib/features/store/types/TableLayoutEditor.js.map +1 -1
- package/lib/features/store/types/TypeRegistry.d.ts +282 -0
- package/lib/features/store/types/TypeRegistry.d.ts.map +1 -1
- package/lib/features/store/types/search/ObjectTypeSearchContext.d.ts +281 -0
- package/lib/features/store/types/search/ObjectTypeSearchContext.d.ts.map +1 -1
- package/lib/features/user/UserInfo.d.ts.map +1 -1
- package/lib/features/user/UserInfo.js +2 -4
- package/lib/features/user/UserInfo.js.map +1 -1
- package/lib/features/views/ViewActions.d.ts +32 -0
- package/lib/features/views/ViewActions.d.ts.map +1 -0
- package/lib/features/views/ViewActions.js +186 -0
- package/lib/features/views/ViewActions.js.map +1 -0
- package/lib/features/views/ViewDropTarget.d.ts +15 -0
- package/lib/features/views/ViewDropTarget.d.ts.map +1 -0
- package/lib/features/views/ViewDropTarget.js +79 -0
- package/lib/features/views/ViewDropTarget.js.map +1 -0
- package/lib/features/views/ViewExperience.d.ts +3 -2
- package/lib/features/views/ViewExperience.d.ts.map +1 -1
- package/lib/features/views/ViewExperience.js +103 -12
- package/lib/features/views/ViewExperience.js.map +1 -1
- package/lib/features/views/ViewNavigation.d.ts +1 -1
- package/lib/features/views/ViewNavigation.d.ts.map +1 -1
- package/lib/features/views/ViewNavigation.js +14 -5
- package/lib/features/views/ViewNavigation.js.map +1 -1
- package/lib/features/views/ViewResults.d.ts +1 -1
- package/lib/features/views/ViewResults.d.ts.map +1 -1
- package/lib/features/views/ViewResults.js +124 -34
- package/lib/features/views/ViewResults.js.map +1 -1
- package/lib/features/views/index.d.ts +1 -0
- package/lib/features/views/index.d.ts.map +1 -1
- package/lib/features/views/index.js +1 -0
- package/lib/features/views/index.js.map +1 -1
- package/lib/features/views/types.d.ts +46 -1
- package/lib/features/views/types.d.ts.map +1 -1
- package/lib/features/views/viewState.d.ts.map +1 -1
- package/lib/features/views/viewState.js +34 -0
- package/lib/features/views/viewState.js.map +1 -1
- package/lib/i18n/LanguageProvider.d.ts +3 -1
- package/lib/i18n/LanguageProvider.d.ts.map +1 -1
- package/lib/i18n/LanguageProvider.js +9 -7
- package/lib/i18n/LanguageProvider.js.map +1 -1
- package/lib/i18n/instance.d.ts +2 -0
- package/lib/i18n/instance.d.ts.map +1 -1
- package/lib/i18n/instance.js +45 -26
- package/lib/i18n/instance.js.map +1 -1
- package/lib/i18n/locales/ar.json +296 -15
- package/lib/i18n/locales/de.json +294 -13
- package/lib/i18n/locales/en.json +65 -4
- package/lib/i18n/locales/es.json +295 -14
- package/lib/i18n/locales/fr.json +294 -13
- package/lib/i18n/locales/it.json +294 -13
- package/lib/i18n/locales/ja.json +292 -10
- package/lib/i18n/locales/ko.json +292 -10
- package/lib/i18n/locales/pt.json +294 -13
- package/lib/i18n/locales/ru.json +291 -10
- package/lib/i18n/locales/tr.json +291 -10
- package/lib/i18n/locales/zh-TW.json +292 -10
- package/lib/i18n/locales/zh.json +292 -10
- package/lib/router/RouteComponent.d.ts +8 -0
- package/lib/router/RouteComponent.d.ts.map +1 -1
- package/lib/router/RouteComponent.js +41 -9
- package/lib/router/RouteComponent.js.map +1 -1
- package/lib/session/UserSessionProvider.d.ts.map +1 -1
- package/lib/session/UserSessionProvider.js +20 -29
- package/lib/session/UserSessionProvider.js.map +1 -1
- package/lib/session/auth/composable.d.ts.map +1 -1
- package/lib/session/auth/composable.js +25 -19
- package/lib/session/auth/composable.js.map +1 -1
- package/lib/session/auth/domainRouting.d.ts +11 -0
- package/lib/session/auth/domainRouting.d.ts.map +1 -1
- package/lib/session/auth/domainRouting.js +13 -0
- package/lib/session/auth/domainRouting.js.map +1 -1
- package/lib/session/auth/firebase.js +1 -1
- package/lib/session/auth/firebase.js.map +1 -1
- package/lib/session/useUXTracking.d.ts.map +1 -1
- package/lib/session/useUXTracking.js +6 -1
- package/lib/session/useUXTracking.js.map +1 -1
- package/lib/shell/VertesiaShell.d.ts.map +1 -1
- package/lib/shell/VertesiaShell.js +2 -1
- package/lib/shell/VertesiaShell.js.map +1 -1
- package/lib/shell/apps/AppInstallationProvider.d.ts +4 -2
- package/lib/shell/apps/AppInstallationProvider.d.ts.map +1 -1
- package/lib/shell/apps/IframeAppContextSync.d.ts +3 -0
- package/lib/shell/apps/IframeAppContextSync.d.ts.map +1 -0
- package/lib/shell/apps/IframeAppContextSync.js +95 -0
- package/lib/shell/apps/IframeAppContextSync.js.map +1 -0
- package/lib/shell/apps/iframe-auth.d.ts +55 -0
- package/lib/shell/apps/iframe-auth.d.ts.map +1 -0
- package/lib/shell/apps/iframe-auth.js +154 -0
- package/lib/shell/apps/iframe-auth.js.map +1 -0
- package/lib/shell/apps/index.d.ts +2 -0
- package/lib/shell/apps/index.d.ts.map +1 -1
- package/lib/shell/apps/index.js +2 -0
- package/lib/shell/apps/index.js.map +1 -1
- package/lib/vertesia-ui-core.js +199 -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 +975 -35
- package/lib/vertesia-ui-features.js.map +1 -1
- package/lib/vertesia-ui-i18n.BJBGsq-8.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.BJBGsq-8.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.BY5YG5cX.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.BY5YG5cX.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.Bd5_1BXO.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.Bd5_1BXO.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.Bvwej2HH.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.Bvwej2HH.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.CMT3f4gf.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.CMT3f4gf.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.D56DNPJW.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.D56DNPJW.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.DDzKLNx6.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.DDzKLNx6.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.D_Am1LpF.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.D_Am1LpF.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.DrZizgGV.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.DrZizgGV.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.DwHsq86z.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.DwHsq86z.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.PLpo0Bbz.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.PLpo0Bbz.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.js +2 -38
- package/lib/vertesia-ui-i18n.js.map +1 -1
- package/lib/vertesia-ui-i18n.xVbXALqz.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.xVbXALqz.chunk.js.map +1 -0
- package/lib/vertesia-ui-layout.js +80 -1
- package/lib/vertesia-ui-layout.js.map +1 -1
- package/lib/vertesia-ui-rich-text.js +278 -4
- package/lib/vertesia-ui-rich-text.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 +118 -1
- package/lib/vertesia-ui-shell.js.map +1 -1
- package/lib/vertesia-ui-widgets.js +336 -20
- package/lib/vertesia-ui-widgets.js.map +1 -1
- package/lib/widgets/markdown/MarkdownRenderer.d.ts.map +1 -1
- package/lib/widgets/markdown/MarkdownRenderer.js +43 -2
- package/lib/widgets/markdown/MarkdownRenderer.js.map +1 -1
- package/lib/widgets/markdown/MermaidDiagram.d.ts.map +1 -1
- package/lib/widgets/markdown/MermaidDiagram.js +35 -22
- package/lib/widgets/markdown/MermaidDiagram.js.map +1 -1
- package/lib/widgets/monacoEditor/MonacoEditor.d.ts.map +1 -1
- package/lib/widgets/monacoEditor/MonacoEditor.js +14 -10
- package/lib/widgets/monacoEditor/MonacoEditor.js.map +1 -1
- package/lib/widgets/xml-viewer/hooks/useCollapsible.d.ts +1 -1
- package/package.json +24 -29
- package/src/core/components/FormItem.tsx +2 -5
- package/src/core/components/InfoTip.test.tsx +33 -0
- package/src/core/components/InfoTip.tsx +32 -0
- package/src/core/components/index.ts +1 -0
- package/src/core/components/shadcn/Panel.tsx +3 -7
- package/src/core/components/shadcn/filters/comboBox/DateCombobox.tsx +1 -1
- package/src/core/components/shadcn/filters/filter/dateFilter.tsx +1 -1
- package/src/core/components/shadcn/filters/filters.tsx +1 -1
- package/src/core/components/shadcn/index.ts +1 -0
- package/src/core/components/shadcn/modal/dialog.test.tsx +35 -0
- package/src/core/components/shadcn/modal/dialog.tsx +0 -4
- package/src/core/components/shadcn/overflowTabs.tsx +320 -0
- package/src/core/components/shadcn/selectBox.tsx +2 -2
- package/src/core/components/shadcn/theme/ThemeProvider.tsx +10 -9
- package/src/core/utils/dayjs.ts +17 -0
- package/src/css/base.css +78 -0
- package/src/env/index.test.ts +94 -0
- package/src/env/index.ts +36 -1
- package/src/features/agent/PayloadBuilder.test.ts +68 -0
- package/src/features/agent/PayloadBuilder.tsx +28 -4
- package/src/features/agent/chat/AgentRightPanel.tsx +2 -252
- package/src/features/agent/chat/ArtifactsTab.tsx +1 -0
- package/src/features/agent/chat/AskUserWidget.test.tsx +20 -1
- package/src/features/agent/chat/AskUserWidget.tsx +22 -6
- package/src/features/agent/chat/ModernAgentConversation.test.tsx +160 -0
- package/src/features/agent/chat/ModernAgentConversation.tsx +111 -31
- package/src/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.tsx +86 -67
- package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.test.tsx +90 -7
- package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +4 -6
- package/src/features/agent/chat/ModernAgentOutput/AttachmentPreview.test.ts +103 -1
- package/src/features/agent/chat/ModernAgentOutput/AttachmentPreview.tsx +50 -4
- package/src/features/agent/chat/ModernAgentOutput/BatchProgressPanel.tsx +1 -1
- package/src/features/agent/chat/ModernAgentOutput/Header.tsx +18 -1
- package/src/features/agent/chat/ModernAgentOutput/MessageItem.tsx +1 -1
- package/src/features/agent/chat/ModernAgentOutput/StreamingMessage.tsx +1 -1
- package/src/features/agent/chat/ModernAgentOutput/ToolCallGroup.tsx +1 -1
- package/src/features/agent/chat/ModernAgentOutput/WorkstreamTabs.tsx +37 -167
- package/src/features/agent/chat/ModernAgentOutput/utils.test.ts +94 -0
- package/src/features/agent/chat/ModernAgentOutput/utils.ts +19 -10
- package/src/features/agent/chat/VegaLiteChart.tsx +32 -14
- package/src/features/agent/chat/hooks/useAgentStream.test.tsx +18 -0
- package/src/features/agent/chat/hooks/useAgentStream.ts +3 -0
- package/src/features/document-viewer/UniversalDocumentViewer.tsx +1 -1
- package/src/features/facets/AgentRunnerFacetsNav.tsx +44 -4
- package/src/features/facets/CollectionsFacetsNav.tsx +15 -4
- package/src/features/facets/DocumentsFacetsNav.tsx +25 -8
- package/src/features/facets/FacetQueryHandlers.test.ts +84 -0
- package/src/features/facets/InteractionsFacetsNav.tsx +20 -4
- package/src/features/facets/PromptsFacetsNav.tsx +15 -4
- package/src/features/facets/RunsFacetsNav.test.ts +59 -0
- package/src/features/facets/RunsFacetsNav.tsx +40 -30
- package/src/features/facets/WorkflowExecutionsFacetsNav.test.ts +57 -0
- package/src/features/facets/WorkflowExecutionsFacetsNav.tsx +36 -16
- package/src/features/facets/index.ts +1 -0
- package/src/features/facets/utils/SearchInterface.tsx +12 -3
- package/src/features/layout/GenericPageNavHeader.tsx +16 -0
- package/src/features/magic-pdf/DownloadPopover.tsx +1 -2
- package/src/features/magic-pdf/GroundedExtractionView.test.tsx +7 -1
- package/src/features/magic-pdf/GroundedExtractionView.tsx +162 -242
- package/src/features/oauth/McpConnectionsButton.test.tsx +18 -1
- package/src/features/oauth/McpConnectionsButton.tsx +6 -2
- package/src/features/oauth/McpConnectionsDialog.tsx +3 -3
- package/src/features/oauth/useMcpConnections.test.ts +1 -0
- package/src/features/oauth/useMcpConnections.ts +24 -7
- package/src/features/pdf-viewer/PdfPageRenderer.tsx +76 -71
- package/src/features/pdf-viewer/lazyReactPdf.ts +33 -0
- package/src/features/store/collections/CollectionsTable.tsx +1 -4
- package/src/features/store/collections/EditCollectionView.tsx +1 -1
- package/src/features/store/objects/ExportPropertiesModal.tsx +25 -16
- package/src/features/store/objects/components/ContentOverview.tsx +2 -28
- package/src/features/store/objects/components/TextEditorPanel.tsx +13 -3
- package/src/features/store/objects/layout/renderers.tsx +1 -6
- package/src/features/store/objects/search/DocumentSearchContext.test.ts +45 -0
- package/src/features/store/objects/search/DocumentSearchContext.ts +54 -4
- package/src/features/store/objects/selection/actions/DeleteObjectsAction.tsx +5 -0
- package/src/features/store/objects/upload/DocumentUploadModal.tsx +10 -3
- package/src/features/store/objects/upload/useSmartFileUploadProcessing.ts +15 -6
- package/src/features/store/types/ContentObjectTypesTable.tsx +1 -4
- package/src/features/store/types/IntakePolicyEditor.tsx +14 -5
- package/src/features/store/types/IntakePolicyForm.tsx +120 -20
- package/src/features/store/types/ObjectSchemaEditor.tsx +6 -2
- package/src/features/store/types/TableLayoutEditor.tsx +2 -0
- package/src/features/user/UserInfo.test.tsx +10 -0
- package/src/features/user/UserInfo.tsx +2 -7
- package/src/features/views/ViewActions.test.tsx +80 -0
- package/src/features/views/ViewActions.tsx +352 -0
- package/src/features/views/ViewDropTarget.test.tsx +150 -0
- package/src/features/views/ViewDropTarget.tsx +140 -0
- package/src/features/views/ViewExperience.test.tsx +72 -0
- package/src/features/views/ViewExperience.tsx +189 -22
- package/src/features/views/ViewMedia.test.tsx +180 -0
- package/src/features/views/ViewNavigation.test.tsx +42 -0
- package/src/features/views/ViewNavigation.tsx +43 -5
- package/src/features/views/ViewResults.tsx +243 -26
- package/src/features/views/index.ts +1 -0
- package/src/features/views/types.ts +50 -0
- package/src/features/views/viewState.test.ts +7 -1
- package/src/features/views/viewState.ts +32 -0
- package/src/i18n/LanguageProvider.tsx +15 -8
- package/src/i18n/instance.test.ts +30 -0
- package/src/i18n/instance.ts +67 -40
- package/src/i18n/locales/ar.json +1192 -911
- package/src/i18n/locales/de.json +1148 -867
- package/src/i18n/locales/en.json +65 -4
- package/src/i18n/locales/es.json +1159 -878
- package/src/i18n/locales/fr.json +1159 -878
- package/src/i18n/locales/it.json +1159 -878
- package/src/i18n/locales/ja.json +1148 -866
- package/src/i18n/locales/ko.json +1148 -866
- package/src/i18n/locales/pt.json +1159 -878
- package/src/i18n/locales/ru.json +1170 -889
- package/src/i18n/locales/tr.json +1148 -867
- package/src/i18n/locales/zh-TW.json +1148 -866
- package/src/i18n/locales/zh.json +1148 -866
- package/src/i18n/rtl.test.ts +16 -7
- package/src/rich-text/VertesiaRichTextEditor.test.tsx +33 -1
- package/src/router/RouteComponent.test.tsx +139 -0
- package/src/router/RouteComponent.tsx +54 -9
- package/src/session/UserSessionProvider.tsx +20 -31
- package/src/session/auth/composable.scope.test.ts +1 -1
- package/src/session/auth/composable.test.ts +61 -1
- package/src/session/auth/composable.ts +29 -23
- package/src/session/auth/domainRouting.test.ts +24 -1
- package/src/session/auth/domainRouting.ts +29 -0
- package/src/session/auth/firebase.ts +1 -1
- package/src/session/useUXTracking.tsx +6 -1
- package/src/shell/VertesiaShell.tsx +2 -0
- package/src/shell/apps/IframeAppContextSync.test.tsx +196 -0
- package/src/shell/apps/IframeAppContextSync.tsx +101 -0
- package/src/shell/apps/iframe-auth.test.ts +118 -0
- package/src/shell/apps/iframe-auth.ts +193 -0
- package/src/shell/apps/index.ts +2 -0
- package/src/widgets/markdown/ArtifactEditingSurface.test.tsx +12 -3
- package/src/widgets/markdown/MarkdownRenderer.tsx +50 -2
- package/src/widgets/markdown/MermaidDiagram.tsx +38 -22
- package/src/widgets/monacoEditor/MonacoEditor.tsx +27 -20
- package/lib/features/magic-pdf/GroundedExtractionAssistantPanel.d.ts +0 -25
- package/lib/features/magic-pdf/GroundedExtractionAssistantPanel.d.ts.map +0 -1
- package/lib/features/magic-pdf/GroundedExtractionAssistantPanel.js +0 -42
- package/lib/features/magic-pdf/GroundedExtractionAssistantPanel.js.map +0 -1
- package/src/features/magic-pdf/GroundedExtractionAssistantPanel.tsx +0 -86
|
@@ -3,6 +3,7 @@ import { type AgentMessage, AgentMessageType, type ConversationFile, FileProcess
|
|
|
3
3
|
import type React from 'react';
|
|
4
4
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
5
5
|
import { renderWithProviders } from '../../../__tests__/test-utils.js';
|
|
6
|
+
import { ToastContext } from '../../../core/components/toast/ToastContext.js';
|
|
6
7
|
import { ModernAgentConversation } from './ModernAgentConversation';
|
|
7
8
|
|
|
8
9
|
const mocks = vi.hoisted(() => ({
|
|
@@ -12,6 +13,7 @@ const mocks = vi.hoisted(() => ({
|
|
|
12
13
|
reconnect: vi.fn(),
|
|
13
14
|
restart: vi.fn(),
|
|
14
15
|
sendSignal: vi.fn(),
|
|
16
|
+
uploadArtifact: vi.fn(),
|
|
15
17
|
headerProps: vi.fn(),
|
|
16
18
|
allMessagesMixedProps: vi.fn(),
|
|
17
19
|
messageInputProps: vi.fn(),
|
|
@@ -30,6 +32,7 @@ vi.mock('@vertesia/ui/session', () => ({
|
|
|
30
32
|
agents: {
|
|
31
33
|
restart: mocks.restart,
|
|
32
34
|
sendSignal: mocks.sendSignal,
|
|
35
|
+
uploadArtifact: mocks.uploadArtifact,
|
|
33
36
|
getActiveWorkstreams: mocks.getActiveWorkstreams,
|
|
34
37
|
retrieve: mocks.retrieve,
|
|
35
38
|
},
|
|
@@ -261,6 +264,7 @@ describe('ModernAgentConversation send handling', () => {
|
|
|
261
264
|
window.sessionStorage.clear();
|
|
262
265
|
mocks.restart.mockResolvedValue({ id: 'agent-run-1' });
|
|
263
266
|
mocks.sendSignal.mockResolvedValue({});
|
|
267
|
+
mocks.uploadArtifact.mockResolvedValue({});
|
|
264
268
|
mocks.getActiveWorkstreams.mockResolvedValue({ running: [] });
|
|
265
269
|
mocks.retrieve.mockResolvedValue({ disabled_mcp_collections: undefined });
|
|
266
270
|
mocks.useAgentPlans.mockReturnValue({
|
|
@@ -501,6 +505,162 @@ describe('ModernAgentConversation send handling', () => {
|
|
|
501
505
|
});
|
|
502
506
|
});
|
|
503
507
|
|
|
508
|
+
describe('files staged before the run existed', () => {
|
|
509
|
+
// Staging must upload inline in StartWorkflowView, not via a handoff to the conversation
|
|
510
|
+
// view: consumers like StudioAssistantPanel feed the new agentRunId straight back as a
|
|
511
|
+
// prop, which unmounts StartWorkflowView (and any handoff state) the moment the run
|
|
512
|
+
// starts. Regression coverage for the flow where staged files silently vanished.
|
|
513
|
+
it('uploads staged files, closes the batch with a manifest, and sends no follow-up message', async () => {
|
|
514
|
+
const startWorkflow = vi.fn().mockResolvedValue({ agent_run_id: 'agent-run-2' });
|
|
515
|
+
mockStreamState({
|
|
516
|
+
messages: [],
|
|
517
|
+
isCompleted: false,
|
|
518
|
+
initialHistoryStatus: 'empty',
|
|
519
|
+
agentRunStatus: 'RUNNING',
|
|
520
|
+
});
|
|
521
|
+
|
|
522
|
+
const { container } = renderWithProviders(
|
|
523
|
+
<ModernAgentConversation startWorkflow={startWorkflow} hideHeader initialMessage="" />,
|
|
524
|
+
);
|
|
525
|
+
|
|
526
|
+
const file = new File(['pdf'], 'report.pdf', { type: 'application/pdf' });
|
|
527
|
+
const fileInput = container.querySelector('input[type="file"]') as HTMLInputElement;
|
|
528
|
+
expect(fileInput).not.toBeNull();
|
|
529
|
+
fireEvent.change(fileInput, { target: { files: [file] } });
|
|
530
|
+
|
|
531
|
+
fireEvent.change(screen.getByRole('textbox'), { target: { value: 'Look at these files' } });
|
|
532
|
+
fireEvent.click(screen.getByRole('button', { name: 'Start Agent' }));
|
|
533
|
+
|
|
534
|
+
await waitFor(() => {
|
|
535
|
+
expect(mocks.uploadArtifact).toHaveBeenCalledWith('agent-run-2', 'files/report.pdf', file);
|
|
536
|
+
});
|
|
537
|
+
await waitFor(() => {
|
|
538
|
+
expect(mocks.sendSignal).toHaveBeenCalledWith(
|
|
539
|
+
'agent-run-2',
|
|
540
|
+
'FileUploaded',
|
|
541
|
+
expect.objectContaining({
|
|
542
|
+
name: 'report.pdf',
|
|
543
|
+
artifact_path: 'files/report.pdf',
|
|
544
|
+
}),
|
|
545
|
+
);
|
|
546
|
+
});
|
|
547
|
+
|
|
548
|
+
// The closing manifest defines the batch's membership: the workflow delivers only
|
|
549
|
+
// when every listed file has settled, so a fast first file can never trigger a
|
|
550
|
+
// partial delivery.
|
|
551
|
+
const uploadedCall = mocks.sendSignal.mock.calls.find((call) => call[1] === 'FileUploaded');
|
|
552
|
+
const uploadedId = (uploadedCall?.[2] as { id?: string } | undefined)?.id;
|
|
553
|
+
expect(uploadedId).toEqual(expect.stringMatching(/^file-/));
|
|
554
|
+
await waitFor(() => {
|
|
555
|
+
expect(mocks.sendSignal).toHaveBeenCalledWith(
|
|
556
|
+
'agent-run-2',
|
|
557
|
+
'FileBatchClosed',
|
|
558
|
+
expect.objectContaining({
|
|
559
|
+
batch_id: expect.stringMatching(/^batch-/),
|
|
560
|
+
file_ids: [uploadedId],
|
|
561
|
+
}),
|
|
562
|
+
);
|
|
563
|
+
});
|
|
564
|
+
|
|
565
|
+
// The workflow owns the "[Files Ready]" turn: the client must not send a UserInput
|
|
566
|
+
// of its own — it would race the workflow's delivery.
|
|
567
|
+
const userInputCalls = mocks.sendSignal.mock.calls.filter((call) => call[1] === 'UserInput');
|
|
568
|
+
expect(userInputCalls).toHaveLength(0);
|
|
569
|
+
|
|
570
|
+
// The staged note still rides on the initial message so the agent knows to wait.
|
|
571
|
+
expect(startWorkflow).toHaveBeenCalledWith(
|
|
572
|
+
expect.stringContaining('1 file(s) are being uploaded'),
|
|
573
|
+
expect.anything(),
|
|
574
|
+
);
|
|
575
|
+
});
|
|
576
|
+
|
|
577
|
+
it('carries client-side upload failures in the manifest', async () => {
|
|
578
|
+
const startWorkflow = vi.fn().mockResolvedValue({ agent_run_id: 'agent-run-3' });
|
|
579
|
+
// Only the second upload succeeds. Without the failure in the manifest the workflow
|
|
580
|
+
// would see a complete one-file batch and never report the missing file.
|
|
581
|
+
mocks.uploadArtifact.mockRejectedValueOnce(new Error('storage unavailable')).mockResolvedValueOnce({});
|
|
582
|
+
mockStreamState({
|
|
583
|
+
messages: [],
|
|
584
|
+
isCompleted: false,
|
|
585
|
+
initialHistoryStatus: 'empty',
|
|
586
|
+
agentRunStatus: 'RUNNING',
|
|
587
|
+
});
|
|
588
|
+
|
|
589
|
+
const { container } = renderWithProviders(
|
|
590
|
+
<ModernAgentConversation startWorkflow={startWorkflow} hideHeader initialMessage="" />,
|
|
591
|
+
);
|
|
592
|
+
|
|
593
|
+
const fileInput = container.querySelector('input[type="file"]') as HTMLInputElement;
|
|
594
|
+
fireEvent.change(fileInput, {
|
|
595
|
+
target: {
|
|
596
|
+
files: [
|
|
597
|
+
new File(['a'], 'broken.pdf', { type: 'application/pdf' }),
|
|
598
|
+
new File(['b'], 'good.pdf', { type: 'application/pdf' }),
|
|
599
|
+
],
|
|
600
|
+
},
|
|
601
|
+
});
|
|
602
|
+
fireEvent.change(screen.getByRole('textbox'), { target: { value: 'Look at these files' } });
|
|
603
|
+
fireEvent.click(screen.getByRole('button', { name: 'Start Agent' }));
|
|
604
|
+
|
|
605
|
+
await waitFor(() => {
|
|
606
|
+
expect(mocks.sendSignal).toHaveBeenCalledWith(
|
|
607
|
+
'agent-run-3',
|
|
608
|
+
'FileBatchClosed',
|
|
609
|
+
expect.objectContaining({
|
|
610
|
+
file_ids: [expect.stringMatching(/^file-/)],
|
|
611
|
+
failed_uploads: [{ name: 'broken.pdf', error: 'storage unavailable' }],
|
|
612
|
+
}),
|
|
613
|
+
);
|
|
614
|
+
});
|
|
615
|
+
});
|
|
616
|
+
|
|
617
|
+
it('retries a failed manifest and reports the failure instead of a successful start', async () => {
|
|
618
|
+
const startWorkflow = vi.fn().mockResolvedValue({ agent_run_id: 'agent-run-4' });
|
|
619
|
+
const toast = vi.fn();
|
|
620
|
+
mocks.sendSignal.mockImplementation((_id: string, signalName: string) =>
|
|
621
|
+
signalName === 'FileBatchClosed' ? Promise.reject(new Error('network down')) : Promise.resolve({}),
|
|
622
|
+
);
|
|
623
|
+
mockStreamState({
|
|
624
|
+
messages: [],
|
|
625
|
+
isCompleted: false,
|
|
626
|
+
initialHistoryStatus: 'empty',
|
|
627
|
+
agentRunStatus: 'RUNNING',
|
|
628
|
+
});
|
|
629
|
+
|
|
630
|
+
const { container } = renderWithProviders(
|
|
631
|
+
<ToastContext.Provider value={toast}>
|
|
632
|
+
<ModernAgentConversation startWorkflow={startWorkflow} hideHeader initialMessage="" />
|
|
633
|
+
</ToastContext.Provider>,
|
|
634
|
+
);
|
|
635
|
+
|
|
636
|
+
const fileInput = container.querySelector('input[type="file"]') as HTMLInputElement;
|
|
637
|
+
fireEvent.change(fileInput, {
|
|
638
|
+
target: { files: [new File(['pdf'], 'report.pdf', { type: 'application/pdf' })] },
|
|
639
|
+
});
|
|
640
|
+
fireEvent.change(screen.getByRole('textbox'), { target: { value: 'Look at these files' } });
|
|
641
|
+
fireEvent.click(screen.getByRole('button', { name: 'Start Agent' }));
|
|
642
|
+
|
|
643
|
+
// Three attempts: the manifest is the workflow's only notice that the batch is
|
|
644
|
+
// complete, so losing it strands the agent on a "[Files Ready]" that never arrives.
|
|
645
|
+
await waitFor(
|
|
646
|
+
() => {
|
|
647
|
+
expect(mocks.sendSignal.mock.calls.filter((call) => call[1] === 'FileBatchClosed')).toHaveLength(3);
|
|
648
|
+
},
|
|
649
|
+
{ timeout: 5000 },
|
|
650
|
+
);
|
|
651
|
+
|
|
652
|
+
await waitFor(() => {
|
|
653
|
+
expect(toast).toHaveBeenCalledWith(
|
|
654
|
+
expect.objectContaining({
|
|
655
|
+
status: 'error',
|
|
656
|
+
title: 'Files were not delivered to the agent',
|
|
657
|
+
}),
|
|
658
|
+
);
|
|
659
|
+
});
|
|
660
|
+
expect(toast).not.toHaveBeenCalledWith(expect.objectContaining({ title: 'Agent started' }));
|
|
661
|
+
});
|
|
662
|
+
});
|
|
663
|
+
|
|
504
664
|
it('does not restart or send from a terminal run that cannot continue', () => {
|
|
505
665
|
mockStreamState({
|
|
506
666
|
messages: [createMessage(AgentMessageType.COMPLETE, 'done')],
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { VertesiaClient } from '@vertesia/client';
|
|
1
2
|
import {
|
|
2
3
|
type ActiveWorkstreamEntry,
|
|
3
4
|
type AgentMessage,
|
|
@@ -6,6 +7,7 @@ import {
|
|
|
6
7
|
type AgentToolApprovalMode,
|
|
7
8
|
type CompletedWorkstreamEntry,
|
|
8
9
|
type ConversationFile,
|
|
10
|
+
type ConversationFileBatchRef,
|
|
9
11
|
type ConversationFileRef,
|
|
10
12
|
FileProcessingStatus,
|
|
11
13
|
type McpConnectUxConfig,
|
|
@@ -119,6 +121,35 @@ export type SendAgentMessageFn = (message: string, inputMetadata?: Record<string
|
|
|
119
121
|
const EMPTY_STREAMING_MESSAGES = new Map<string, never>();
|
|
120
122
|
const COLLAPSED_STAGED_FILE_COUNT = 3;
|
|
121
123
|
|
|
124
|
+
const BATCH_CLOSE_RETRY_DELAYS_MS = [400, 1200];
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Send the staged-upload manifest, retrying with bounded backoff.
|
|
128
|
+
*
|
|
129
|
+
* The manifest is the workflow's only notice that the batch is complete: the start message told
|
|
130
|
+
* the agent to wait for "[Files Ready]", so dropping it leaves the run waiting for a turn that
|
|
131
|
+
* never comes. Retries reuse the same `batch_id`, which the workflow treats as idempotent.
|
|
132
|
+
* Returns false once the retries are exhausted so the caller can report the failure.
|
|
133
|
+
*/
|
|
134
|
+
async function closeStagedFileBatch(
|
|
135
|
+
client: VertesiaClient,
|
|
136
|
+
agentId: string,
|
|
137
|
+
batch: ConversationFileBatchRef,
|
|
138
|
+
): Promise<boolean> {
|
|
139
|
+
for (let attempt = 0; ; attempt++) {
|
|
140
|
+
try {
|
|
141
|
+
await client.agents.sendSignal(agentId, 'FileBatchClosed', batch);
|
|
142
|
+
return true;
|
|
143
|
+
} catch (err) {
|
|
144
|
+
if (attempt >= BATCH_CLOSE_RETRY_DELAYS_MS.length) {
|
|
145
|
+
console.error('Failed to close staged file batch:', err);
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
await new Promise((resolve) => setTimeout(resolve, BATCH_CLOSE_RETRY_DELAYS_MS[attempt]));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
122
153
|
function getTimestampMs(timestamp: number | string | undefined): number {
|
|
123
154
|
if (typeof timestamp === 'number') return timestamp;
|
|
124
155
|
if (!timestamp) return Date.now();
|
|
@@ -592,6 +623,12 @@ export interface ModernAgentConversationProps {
|
|
|
592
623
|
onShowDetails?: () => void;
|
|
593
624
|
/** Whether workflow control actions such as cancel should be shown. */
|
|
594
625
|
allowWorkflowControl?: boolean;
|
|
626
|
+
/**
|
|
627
|
+
* Workstream selected on mount instead of "all" — use it to open the conversation on one
|
|
628
|
+
* sub-agent (a process agent node's workstream is its node id). Initial value only; the user's
|
|
629
|
+
* later tab choices win.
|
|
630
|
+
*/
|
|
631
|
+
initialWorkstream?: string;
|
|
595
632
|
|
|
596
633
|
// File upload props - passed through to MessageInput
|
|
597
634
|
/** Called when files are dropped/pasted/selected */
|
|
@@ -1014,56 +1051,85 @@ function StartWorkflowView({
|
|
|
1014
1051
|
|
|
1015
1052
|
const agentId = newRun.agent_run_id;
|
|
1016
1053
|
|
|
1017
|
-
// Upload staged files
|
|
1018
|
-
|
|
1054
|
+
// Upload the staged files inline, NOT via the conversation view: consumers like
|
|
1055
|
+
// StudioAssistantPanel feed the new agentRunId straight back as a prop, which
|
|
1056
|
+
// switches ModernAgentConversation to its agentRunId branch and unmounts this
|
|
1057
|
+
// view — any state handoff dies with it. Inline client calls survive regardless
|
|
1058
|
+
// of what renders next. The closing FileBatchClosed manifest names the batch's
|
|
1059
|
+
// exact membership, so the workflow delivers the "[Files Ready]" turn itself
|
|
1060
|
+
// once — and only once — every listed file has settled, even when a small file
|
|
1061
|
+
// finishes processing while a larger one is still uploading. Once the manifest
|
|
1062
|
+
// lands, delivery no longer depends on this client: extraction can outlast a
|
|
1063
|
+
// reload. The upload loop below still does — a tab closed mid-loop never closes
|
|
1064
|
+
// the batch, which is why the send is retried and its failure surfaced.
|
|
1065
|
+
let stagedBatchDelivered = true;
|
|
1019
1066
|
if (canStageFiles && stagedFiles.length > 0) {
|
|
1067
|
+
const batchId = `batch-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
1068
|
+
const uploadedFileIds: string[] = [];
|
|
1069
|
+
const failedUploads: { name: string; error?: string }[] = [];
|
|
1020
1070
|
for (const file of stagedFiles) {
|
|
1021
1071
|
try {
|
|
1022
1072
|
const artifactPath = `files/${file.name}`;
|
|
1023
1073
|
await client.agents.uploadArtifact(agentId, artifactPath, file);
|
|
1024
|
-
|
|
1025
|
-
// Signal agent that file was uploaded
|
|
1074
|
+
const fileId = `file-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
1026
1075
|
await client.agents.sendSignal(agentId, 'FileUploaded', {
|
|
1027
|
-
id:
|
|
1076
|
+
id: fileId,
|
|
1028
1077
|
name: file.name,
|
|
1029
1078
|
content_type: file.type || 'application/octet-stream',
|
|
1030
1079
|
reference: `artifact:${artifactPath}`,
|
|
1031
1080
|
artifact_path: artifactPath,
|
|
1032
1081
|
} as ConversationFileRef);
|
|
1033
|
-
|
|
1082
|
+
uploadedFileIds.push(fileId);
|
|
1034
1083
|
} catch (uploadErr) {
|
|
1035
1084
|
console.error(`Failed to upload staged file ${file.name}:`, uploadErr);
|
|
1036
|
-
//
|
|
1085
|
+
// Carried in the manifest: a 1-of-2 batch would otherwise look
|
|
1086
|
+
// complete to the workflow and the agent would never hear about it.
|
|
1087
|
+
failedUploads.push({
|
|
1088
|
+
name: file.name,
|
|
1089
|
+
error: uploadErr instanceof Error ? uploadErr.message : String(uploadErr),
|
|
1090
|
+
});
|
|
1037
1091
|
}
|
|
1038
1092
|
}
|
|
1039
|
-
|
|
1040
|
-
//
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1093
|
+
// Close the batch even when every upload failed — the manifest is what lets
|
|
1094
|
+
// the workflow report the outcome instead of leaving the agent parked.
|
|
1095
|
+
stagedBatchDelivered = await closeStagedFileBatch(client, agentId, {
|
|
1096
|
+
batch_id: batchId,
|
|
1097
|
+
file_ids: uploadedFileIds,
|
|
1098
|
+
failed_uploads: failedUploads.length > 0 ? failedUploads : undefined,
|
|
1099
|
+
});
|
|
1100
|
+
if (stagedBatchDelivered) {
|
|
1101
|
+
setStagedFiles([]);
|
|
1102
|
+
}
|
|
1103
|
+
if (failedUploads.length > 0) {
|
|
1104
|
+
toast({
|
|
1105
|
+
title: t('agent.stagedFilesUploadFailed'),
|
|
1106
|
+
status: 'warning',
|
|
1107
|
+
duration: 6000,
|
|
1108
|
+
description: failedUploads.map((f) => f.name).join(', '),
|
|
1109
|
+
});
|
|
1053
1110
|
}
|
|
1054
|
-
|
|
1055
|
-
setStagedFiles([]);
|
|
1056
1111
|
}
|
|
1057
1112
|
|
|
1058
1113
|
// Clear attachments after successful start
|
|
1059
1114
|
onAttachmentsSent?.();
|
|
1060
1115
|
setStartedAgentRunId(agentId);
|
|
1061
1116
|
setInputValue('');
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1117
|
+
if (stagedBatchDelivered) {
|
|
1118
|
+
toast({
|
|
1119
|
+
title: t('agent.agentStarted'),
|
|
1120
|
+
status: 'success',
|
|
1121
|
+
duration: 3000,
|
|
1122
|
+
});
|
|
1123
|
+
} else {
|
|
1124
|
+
// The run exists, but the agent was told to wait for files it will never be
|
|
1125
|
+
// told about — reporting success here would hide that.
|
|
1126
|
+
toast({
|
|
1127
|
+
title: t('agent.stagedFilesNotDelivered'),
|
|
1128
|
+
status: 'error',
|
|
1129
|
+
duration: 8000,
|
|
1130
|
+
description: t('agent.stagedFilesNotDeliveredDescription'),
|
|
1131
|
+
});
|
|
1132
|
+
}
|
|
1067
1133
|
} catch (err: unknown) {
|
|
1068
1134
|
setPendingStartMessage(null);
|
|
1069
1135
|
setPendingStartTimestamp(null);
|
|
@@ -1300,8 +1366,11 @@ function StartWorkflowView({
|
|
|
1300
1366
|
disabled={isSending}
|
|
1301
1367
|
rows={2}
|
|
1302
1368
|
className={cn(
|
|
1303
|
-
'min-h-[72px] resize-none
|
|
1304
|
-
|
|
1369
|
+
'min-h-[72px] resize-none border-0 bg-transparent px-0 py-0 text-sm leading-6 shadow-none focus-visible:ring-0',
|
|
1370
|
+
// The expanded composer is a fixed-height flex box (adjustTextareaHeight
|
|
1371
|
+
// pins it to 100%), so it has to scroll its own overflow. The auto-growing
|
|
1372
|
+
// variant hides overflow because it resizes to fit instead.
|
|
1373
|
+
isExpandedStartComposer ? 'min-h-0 flex-1 overflow-y-auto' : 'overflow-hidden',
|
|
1305
1374
|
inputClassName,
|
|
1306
1375
|
)}
|
|
1307
1376
|
style={
|
|
@@ -1453,6 +1522,7 @@ function ModernAgentConversationInner({
|
|
|
1453
1522
|
enablePlayback,
|
|
1454
1523
|
showPlaybackToggle = true,
|
|
1455
1524
|
messageFilter,
|
|
1525
|
+
initialWorkstream,
|
|
1456
1526
|
}: ModernAgentConversationProps & { agentRunId: string }) {
|
|
1457
1527
|
const { t } = useUITranslation();
|
|
1458
1528
|
const { client } = useUserSession();
|
|
@@ -1531,7 +1601,17 @@ function ModernAgentConversationInner({
|
|
|
1531
1601
|
);
|
|
1532
1602
|
const [isStopping, setIsStopping] = useState(false);
|
|
1533
1603
|
const [isDragOver, setIsDragOver] = useState(false);
|
|
1534
|
-
const [activeWorkstream, setActiveWorkstream] = useState('all');
|
|
1604
|
+
const [activeWorkstream, setActiveWorkstream] = useState(initialWorkstream || 'all');
|
|
1605
|
+
// The route can move to another workstream while this component stays mounted — e.g. between
|
|
1606
|
+
// two agent nodes of the same process run, which differ only by a path param — so follow the
|
|
1607
|
+
// prop whenever it actually changes. A manual tab click still wins until it changes again.
|
|
1608
|
+
const requestedWorkstreamRef = useRef(initialWorkstream);
|
|
1609
|
+
useEffect(() => {
|
|
1610
|
+
if (initialWorkstream && initialWorkstream !== requestedWorkstreamRef.current) {
|
|
1611
|
+
requestedWorkstreamRef.current = initialWorkstream;
|
|
1612
|
+
setActiveWorkstream(initialWorkstream);
|
|
1613
|
+
}
|
|
1614
|
+
}, [initialWorkstream]);
|
|
1535
1615
|
const [playbackCursor, setPlaybackCursor] = useState<AgentChatPlaybackCursor>('live');
|
|
1536
1616
|
const [isPlaybackToggleEnabled, setIsPlaybackToggleEnabled] = useState(false);
|
|
1537
1617
|
const [playbackScrollRequestId, setPlaybackScrollRequestId] = useState(0);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Button, cn } from '@vertesia/ui/core';
|
|
2
2
|
import { useUITranslation } from '@vertesia/ui/i18n';
|
|
3
|
-
import { Bot, ChevronDown, ChevronRight } from 'lucide-react';
|
|
3
|
+
import { Bot, ChevronDown, ChevronRight, ChevronUp } from 'lucide-react';
|
|
4
4
|
import { useEffect, useId, useMemo, useState } from 'react';
|
|
5
5
|
import {
|
|
6
6
|
formatWorkstreamName,
|
|
@@ -24,6 +24,7 @@ export function ActiveWorkstreamsSummary({
|
|
|
24
24
|
}: ActiveWorkstreamsSummaryProps) {
|
|
25
25
|
const { t } = useUITranslation();
|
|
26
26
|
const [isExpanded, setIsExpanded] = useState(false);
|
|
27
|
+
const [isCollapsed, setIsCollapsed] = useState(false);
|
|
27
28
|
const listId = useId();
|
|
28
29
|
const runningWorkstreams = useMemo(
|
|
29
30
|
() => activeWorkstreams.filter((ws) => ws.status === 'running' || ws.status === 'canceling'),
|
|
@@ -49,79 +50,97 @@ export function ActiveWorkstreamsSummary({
|
|
|
49
50
|
className="flex flex-col gap-1.5 rounded-2xl border border-border/70 bg-background/95 p-2 text-xs text-muted shadow-lg shadow-black/5"
|
|
50
51
|
aria-live="polite"
|
|
51
52
|
>
|
|
52
|
-
<div className="flex
|
|
53
|
-
<
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
53
|
+
<div className="flex items-center justify-between gap-2">
|
|
54
|
+
<div className="flex min-w-0 items-center gap-2 px-1 font-medium">
|
|
55
|
+
<Bot className="size-3.5 shrink-0 text-muted" aria-hidden="true" />
|
|
56
|
+
<span className="truncate">
|
|
57
|
+
{t('agent.activeWorkstreams', { count: runningWorkstreams.length })}
|
|
58
|
+
</span>
|
|
59
|
+
</div>
|
|
60
|
+
<Button
|
|
61
|
+
variant="ghost"
|
|
62
|
+
size="icon"
|
|
63
|
+
onClick={() => setIsCollapsed(!isCollapsed)}
|
|
64
|
+
title={isCollapsed ? t('agent.showActiveWorkstreams') : t('agent.hideActiveWorkstreams')}
|
|
65
|
+
>
|
|
66
|
+
{isCollapsed ? <ChevronUp className="size-4" /> : <ChevronDown className="size-4" />}
|
|
67
|
+
{isCollapsed ? t('agent.showActiveWorkstreams') : t('agent.hideActiveWorkstreams')}
|
|
68
|
+
</Button>
|
|
57
69
|
</div>
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
workstream
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
{
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
70
|
+
{isCollapsed ? null : (
|
|
71
|
+
<>
|
|
72
|
+
<div id={listId} className="flex flex-col gap-0.5">
|
|
73
|
+
{visibleRunningWorkstreams.map((workstream) => {
|
|
74
|
+
const workstreamName = getWorkstreamDisplayName(
|
|
75
|
+
workstream.workstream_id,
|
|
76
|
+
workstream.interaction,
|
|
77
|
+
);
|
|
78
|
+
const content = (
|
|
79
|
+
<>
|
|
80
|
+
<span
|
|
81
|
+
className={cn(
|
|
82
|
+
'size-1.5 shrink-0 rounded-full',
|
|
83
|
+
getWorkstreamStatusClass(workstream.status),
|
|
84
|
+
)}
|
|
85
|
+
aria-hidden="true"
|
|
86
|
+
/>
|
|
87
|
+
<span className="truncate font-medium">{workstreamName}</span>
|
|
88
|
+
{workstream.phase && (
|
|
89
|
+
<span className="truncate text-xs text-muted/75">
|
|
90
|
+
{formatWorkstreamName(workstream.phase)}
|
|
91
|
+
</span>
|
|
92
|
+
)}
|
|
93
|
+
</>
|
|
94
|
+
);
|
|
81
95
|
|
|
82
|
-
|
|
96
|
+
return onSelectWorkstream ? (
|
|
97
|
+
<Button
|
|
98
|
+
key={workstream.launch_id || workstream.workstream_id}
|
|
99
|
+
type="button"
|
|
100
|
+
variant="ghost"
|
|
101
|
+
className="h-auto min-w-0 justify-start gap-2 rounded-lg px-1 py-1 text-sm text-foreground/80"
|
|
102
|
+
title={workstreamName}
|
|
103
|
+
onClick={() => {
|
|
104
|
+
setIsExpanded(false);
|
|
105
|
+
onSelectWorkstream(workstream.workstream_id);
|
|
106
|
+
}}
|
|
107
|
+
>
|
|
108
|
+
{content}
|
|
109
|
+
<ChevronRight
|
|
110
|
+
className="ms-auto size-3.5 shrink-0 rtl:rotate-180"
|
|
111
|
+
aria-hidden="true"
|
|
112
|
+
/>
|
|
113
|
+
</Button>
|
|
114
|
+
) : (
|
|
115
|
+
<div
|
|
116
|
+
key={workstream.launch_id || workstream.workstream_id}
|
|
117
|
+
className="flex min-w-0 items-center gap-2 rounded-lg px-1 py-1 text-sm text-foreground/80"
|
|
118
|
+
title={workstreamName}
|
|
119
|
+
>
|
|
120
|
+
{content}
|
|
121
|
+
</div>
|
|
122
|
+
);
|
|
123
|
+
})}
|
|
124
|
+
</div>
|
|
125
|
+
{canExpand && (
|
|
83
126
|
<Button
|
|
84
|
-
key={workstream.launch_id || workstream.workstream_id}
|
|
85
127
|
type="button"
|
|
86
128
|
variant="ghost"
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}}
|
|
129
|
+
size="sm"
|
|
130
|
+
className="h-8 w-fit shrink-0 gap-1 rounded-xl px-2.5 text-xs text-muted"
|
|
131
|
+
aria-expanded={isExpanded}
|
|
132
|
+
aria-controls={listId}
|
|
133
|
+
onClick={() => setIsExpanded((expanded) => !expanded)}
|
|
93
134
|
>
|
|
94
|
-
{
|
|
95
|
-
|
|
135
|
+
{!isExpanded && <span>+{hiddenRunningWorkstreamCount}</span>}
|
|
136
|
+
{isExpanded ? t('agent.showLess') : t('agent.showMore')}
|
|
137
|
+
<ChevronDown
|
|
138
|
+
className={cn('size-3.5 transition-transform', isExpanded && 'rotate-180')}
|
|
139
|
+
aria-hidden="true"
|
|
140
|
+
/>
|
|
96
141
|
</Button>
|
|
97
|
-
)
|
|
98
|
-
|
|
99
|
-
key={workstream.launch_id || workstream.workstream_id}
|
|
100
|
-
className="flex min-w-0 items-center gap-2 rounded-lg px-1 py-1 text-sm text-foreground/80"
|
|
101
|
-
title={workstreamName}
|
|
102
|
-
>
|
|
103
|
-
{content}
|
|
104
|
-
</div>
|
|
105
|
-
);
|
|
106
|
-
})}
|
|
107
|
-
</div>
|
|
108
|
-
{canExpand && (
|
|
109
|
-
<Button
|
|
110
|
-
type="button"
|
|
111
|
-
variant="ghost"
|
|
112
|
-
size="sm"
|
|
113
|
-
className="h-8 w-fit shrink-0 gap-1 rounded-xl px-2.5 text-xs text-muted"
|
|
114
|
-
aria-expanded={isExpanded}
|
|
115
|
-
aria-controls={listId}
|
|
116
|
-
onClick={() => setIsExpanded((expanded) => !expanded)}
|
|
117
|
-
>
|
|
118
|
-
{!isExpanded && <span>+{hiddenRunningWorkstreamCount}</span>}
|
|
119
|
-
{isExpanded ? t('agent.showLess') : t('agent.showMore')}
|
|
120
|
-
<ChevronDown
|
|
121
|
-
className={cn('size-3.5 transition-transform', isExpanded && 'rotate-180')}
|
|
122
|
-
aria-hidden="true"
|
|
123
|
-
/>
|
|
124
|
-
</Button>
|
|
142
|
+
)}
|
|
143
|
+
</>
|
|
125
144
|
)}
|
|
126
145
|
</output>
|
|
127
146
|
</div>
|