@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
|
@@ -52,24 +52,41 @@ function renderSummary(
|
|
|
52
52
|
props: Partial<React.ComponentProps<typeof AllMessagesMixed>> = {},
|
|
53
53
|
) {
|
|
54
54
|
const bottomRef = React.createRef<HTMLDivElement>() as React.RefObject<HTMLDivElement>;
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
const renderConversation = (
|
|
56
|
+
currentMessages: AgentMessage[],
|
|
57
|
+
currentIsCompleted: boolean,
|
|
58
|
+
currentStreamingMessages: Map<string, StreamingData>,
|
|
59
|
+
currentProps: Partial<React.ComponentProps<typeof AllMessagesMixed>>,
|
|
60
|
+
) => (
|
|
57
61
|
<I18nProvider lng="en">
|
|
58
62
|
<ReactRouterContext.Provider value={makeRouterContext()}>
|
|
59
63
|
<AgentResourceResolverProvider value={testResourceResolver}>
|
|
60
64
|
<AllMessagesMixed
|
|
61
|
-
messages={
|
|
65
|
+
messages={currentMessages}
|
|
62
66
|
bottomRef={bottomRef}
|
|
63
67
|
viewMode="sliding"
|
|
64
|
-
isCompleted={
|
|
68
|
+
isCompleted={currentIsCompleted}
|
|
65
69
|
artifactRunId="run-1"
|
|
66
|
-
streamingMessages={
|
|
67
|
-
{...
|
|
70
|
+
streamingMessages={currentStreamingMessages}
|
|
71
|
+
{...currentProps}
|
|
68
72
|
/>
|
|
69
73
|
</AgentResourceResolverProvider>
|
|
70
74
|
</ReactRouterContext.Provider>
|
|
71
|
-
</I18nProvider
|
|
75
|
+
</I18nProvider>
|
|
72
76
|
);
|
|
77
|
+
|
|
78
|
+
const result = render(renderConversation(messages, isCompleted, streamingMessages, props));
|
|
79
|
+
return {
|
|
80
|
+
...result,
|
|
81
|
+
rerenderSummary(
|
|
82
|
+
nextMessages: AgentMessage[],
|
|
83
|
+
nextIsCompleted = false,
|
|
84
|
+
nextStreamingMessages = new Map<string, StreamingData>(),
|
|
85
|
+
nextProps: Partial<React.ComponentProps<typeof AllMessagesMixed>> = {},
|
|
86
|
+
) {
|
|
87
|
+
result.rerender(renderConversation(nextMessages, nextIsCompleted, nextStreamingMessages, nextProps));
|
|
88
|
+
},
|
|
89
|
+
};
|
|
73
90
|
}
|
|
74
91
|
|
|
75
92
|
function renderStacked(
|
|
@@ -766,6 +783,72 @@ describe('AllMessagesMixed summary view', () => {
|
|
|
766
783
|
expect(screen.getByText('Main agent response.')).not.toBeNull();
|
|
767
784
|
});
|
|
768
785
|
|
|
786
|
+
it('keeps streamed and persisted child output in the owning workstream throughout its lifecycle', () => {
|
|
787
|
+
const question = makeMessage({
|
|
788
|
+
timestamp: 1_000,
|
|
789
|
+
type: AgentMessageType.QUESTION,
|
|
790
|
+
message: 'Research the launch plan.',
|
|
791
|
+
});
|
|
792
|
+
const launch = makeMessage({
|
|
793
|
+
timestamp: 2_000,
|
|
794
|
+
type: AgentMessageType.UPDATE,
|
|
795
|
+
message: 'Research workstream launched',
|
|
796
|
+
workstream_id: 'research',
|
|
797
|
+
details: {
|
|
798
|
+
event_class: 'activity',
|
|
799
|
+
workstream_event: 'launched',
|
|
800
|
+
launch_id: 'launch-research',
|
|
801
|
+
workstream_id: 'research',
|
|
802
|
+
child_workflow_id: 'workstream:research',
|
|
803
|
+
child_workflow_run_id: 'run-research',
|
|
804
|
+
},
|
|
805
|
+
});
|
|
806
|
+
const sourceMessages = [question, launch];
|
|
807
|
+
const streamingMessages = new Map<string, StreamingData>([
|
|
808
|
+
[
|
|
809
|
+
'research-stream',
|
|
810
|
+
{
|
|
811
|
+
text: 'Research is still streaming.',
|
|
812
|
+
startTimestamp: 3_000,
|
|
813
|
+
workstreamId: 'research',
|
|
814
|
+
},
|
|
815
|
+
],
|
|
816
|
+
]);
|
|
817
|
+
const { rerenderSummary } = renderSummary(sourceMessages, false, streamingMessages, {
|
|
818
|
+
workstreamSourceMessages: sourceMessages,
|
|
819
|
+
activeWorkstream: 'all',
|
|
820
|
+
});
|
|
821
|
+
|
|
822
|
+
expect(screen.queryByText('Research is still streaming.')).toBeNull();
|
|
823
|
+
|
|
824
|
+
rerenderSummary(sourceMessages, false, streamingMessages, {
|
|
825
|
+
workstreamSourceMessages: sourceMessages,
|
|
826
|
+
activeWorkstream: 'research',
|
|
827
|
+
});
|
|
828
|
+
expect(screen.getByText('Research is still streaming.')).not.toBeNull();
|
|
829
|
+
|
|
830
|
+
const persistedChildAnswer = makeMessage({
|
|
831
|
+
timestamp: 4_000,
|
|
832
|
+
type: AgentMessageType.ANSWER,
|
|
833
|
+
message: 'Research is complete.',
|
|
834
|
+
workstream_id: 'research',
|
|
835
|
+
details: { streamed: true },
|
|
836
|
+
});
|
|
837
|
+
const completedMessages = [...sourceMessages, persistedChildAnswer];
|
|
838
|
+
|
|
839
|
+
rerenderSummary(completedMessages, true, new Map(), {
|
|
840
|
+
workstreamSourceMessages: completedMessages,
|
|
841
|
+
activeWorkstream: 'research',
|
|
842
|
+
});
|
|
843
|
+
expect(screen.getByText('Research is complete.')).not.toBeNull();
|
|
844
|
+
|
|
845
|
+
rerenderSummary(completedMessages, true, new Map(), {
|
|
846
|
+
workstreamSourceMessages: completedMessages,
|
|
847
|
+
activeWorkstream: 'all',
|
|
848
|
+
});
|
|
849
|
+
expect(screen.queryByText('Research is complete.')).toBeNull();
|
|
850
|
+
});
|
|
851
|
+
|
|
769
852
|
it('renders first child workflow activity as a workstream row when the launch event is missing', () => {
|
|
770
853
|
renderSummary(
|
|
771
854
|
[
|
|
@@ -93,6 +93,7 @@ import {
|
|
|
93
93
|
getWorkstreamId,
|
|
94
94
|
groupMessagesWithStreaming,
|
|
95
95
|
isInProgress,
|
|
96
|
+
isStreamingDataVisibleInWorkstream,
|
|
96
97
|
isToolActivityMessage,
|
|
97
98
|
isToolPreambleMessage,
|
|
98
99
|
isUserStoppedMessage,
|
|
@@ -2867,11 +2868,7 @@ function AllMessagesMixedComponent({
|
|
|
2867
2868
|
const complete = new Map<string, StreamingData>();
|
|
2868
2869
|
const incomplete: Array<{ id: string; data: StreamingData }> = [];
|
|
2869
2870
|
streamingMessages.forEach((data, id) => {
|
|
2870
|
-
|
|
2871
|
-
if (activeWorkstream && activeWorkstream !== 'all') {
|
|
2872
|
-
const streamWorkstream = data.workstreamId || 'main';
|
|
2873
|
-
if (activeWorkstream !== streamWorkstream) return;
|
|
2874
|
-
}
|
|
2871
|
+
if (!isStreamingDataVisibleInWorkstream(data, activeWorkstream)) return;
|
|
2875
2872
|
|
|
2876
2873
|
// If a newer persisted message exists, this stream is stale and should be
|
|
2877
2874
|
// treated as complete for ordering purposes.
|
|
@@ -3353,9 +3350,10 @@ function AllMessagesMixedComponent({
|
|
|
3353
3350
|
)}
|
|
3354
3351
|
|
|
3355
3352
|
{displayMessages.length === 0 &&
|
|
3353
|
+
incompleteStreaming.length === 0 &&
|
|
3356
3354
|
!hasRenderableInitialRequest &&
|
|
3357
3355
|
!(isSummaryView && showActivityFallback) ? (
|
|
3358
|
-
activeWorkstream === 'all' && isAgentWorking
|
|
3356
|
+
activeWorkstream === 'all' && isAgentWorking ? (
|
|
3359
3357
|
<div className="flex-1 px-2 py-6 sm:px-4">
|
|
3360
3358
|
<InitialRequestWaitingCard
|
|
3361
3359
|
label={t('agent.preparing')}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type AgentMessage, AgentMessageType } from '@vertesia/common';
|
|
2
2
|
import { describe, expect, it } from 'vitest';
|
|
3
|
-
import { collectDeliveredArtifactRefs } from './AttachmentPreview';
|
|
3
|
+
import { collectDeliveredArtifactRefs, parseUserMessageAttachments } from './AttachmentPreview';
|
|
4
4
|
|
|
5
5
|
function question(message: string, details?: AgentMessage['details']): AgentMessage {
|
|
6
6
|
return {
|
|
@@ -13,7 +13,109 @@ function question(message: string, details?: AgentMessage['details']): AgentMess
|
|
|
13
13
|
};
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
+
describe('parseUserMessageAttachments', () => {
|
|
17
|
+
// Filenames with parentheses (browser download suffixes like "report (6).json") flow
|
|
18
|
+
// verbatim into artifact hrefs. A first-closing-paren href capture made these lines fail
|
|
19
|
+
// to parse: the file rendered as raw text and its chip outlived delivery because the
|
|
20
|
+
// reference never reached collectDeliveredArtifactRefs.
|
|
21
|
+
it('parses hrefs containing parentheses', () => {
|
|
22
|
+
const parsed = parseUserMessageAttachments(
|
|
23
|
+
'Look at this.\n\nUploaded artifacts:\n[report (6).json](artifact:files/report (6).json)',
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
expect(parsed.body).toBe('Look at this.');
|
|
27
|
+
expect(parsed.attachments).toHaveLength(1);
|
|
28
|
+
expect(parsed.attachments[0].name).toBe('report (6).json');
|
|
29
|
+
expect(parsed.attachments[0].href).toBe('artifact:files/report (6).json');
|
|
30
|
+
expect(parsed.attachments[0].artifactPath).toBe('files/report (6).json');
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('splits href from trailing note even when both contain parentheses', () => {
|
|
34
|
+
const parsed = parseUserMessageAttachments(
|
|
35
|
+
[
|
|
36
|
+
'Attachments:',
|
|
37
|
+
'- [scan (2).png](artifact:files/scan (2).png) (image - use view_image tool with path "files/scan (2).png" to see it)',
|
|
38
|
+
'- [notes (v2).pdf](artifact:files/notes (v2).pdf) (text extracted to files/notes (v2).pdf.md)',
|
|
39
|
+
].join('\n'),
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
expect(parsed.attachments).toHaveLength(2);
|
|
43
|
+
expect(parsed.attachments[0].href).toBe('artifact:files/scan (2).png');
|
|
44
|
+
// The note still drives the image content-type heuristic.
|
|
45
|
+
expect(parsed.attachments[0].contentType).toBe('image/*');
|
|
46
|
+
expect(parsed.attachments[1].href).toBe('artifact:files/notes (v2).pdf');
|
|
47
|
+
expect(parsed.attachments[1].contentType).toBeUndefined();
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// Only the two note shapes the server formatter emits may split a line. Without that
|
|
51
|
+
// check, a note-less filename carrying its own parens is cut at the last ") (", yielding
|
|
52
|
+
// a truncated href whose reference never matches — the chip then outlives delivery.
|
|
53
|
+
it('does not split a note-less filename that contains ") ("', () => {
|
|
54
|
+
const parsed = parseUserMessageAttachments(
|
|
55
|
+
'Uploaded artifacts:\n[a (b) (c).pdf](artifact:files/a (b) (c).pdf)',
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
expect(parsed.attachments).toHaveLength(1);
|
|
59
|
+
expect(parsed.attachments[0].name).toBe('a (b) (c).pdf');
|
|
60
|
+
expect(parsed.attachments[0].href).toBe('artifact:files/a (b) (c).pdf');
|
|
61
|
+
expect(parsed.attachments[0].artifactPath).toBe('files/a (b) (c).pdf');
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// The previous regex pair backtracked polynomially on lines packed with ") (" sequences
|
|
65
|
+
// (CodeQL js/polynomial-redos). The scanner must stay linear and still pick the rightmost
|
|
66
|
+
// note split — the same split the greedy regex produced.
|
|
67
|
+
it('handles pathological paren-dense lines in linear time with the rightmost note split', () => {
|
|
68
|
+
const hostile = `[a](${') ('.repeat(20_000)}x) (image - hostile)`;
|
|
69
|
+
const started = performance.now();
|
|
70
|
+
const parsed = parseUserMessageAttachments(`Uploaded artifacts:\n${hostile}`);
|
|
71
|
+
expect(performance.now() - started).toBeLessThan(200);
|
|
72
|
+
|
|
73
|
+
expect(parsed.attachments).toHaveLength(1);
|
|
74
|
+
expect(parsed.attachments[0].href).toBe(`${') ('.repeat(20_000)}x`);
|
|
75
|
+
expect(parsed.attachments[0].contentType).toBe('image/*');
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
// Every ") (" above is a candidate the scanner must reject (unknown note prefix) before
|
|
79
|
+
// falling through to the whole-body href. That rejection path is the one a quadratic
|
|
80
|
+
// implementation would blow up on, so it gets its own budget.
|
|
81
|
+
it('stays linear when every note candidate is rejected', () => {
|
|
82
|
+
const hostile = `[a](${') ('.repeat(20_000)}x)`;
|
|
83
|
+
const started = performance.now();
|
|
84
|
+
const parsed = parseUserMessageAttachments(`Uploaded artifacts:\n${hostile}`);
|
|
85
|
+
expect(performance.now() - started).toBeLessThan(200);
|
|
86
|
+
|
|
87
|
+
expect(parsed.attachments).toHaveLength(1);
|
|
88
|
+
expect(parsed.attachments[0].href).toBe(`${') ('.repeat(20_000)}x`);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it('keeps parsing plain links and note-suffixed links without parentheses', () => {
|
|
92
|
+
const parsed = parseUserMessageAttachments(
|
|
93
|
+
[
|
|
94
|
+
'Uploaded artifacts:',
|
|
95
|
+
'[report.pdf](artifact:files/report.pdf)',
|
|
96
|
+
'- [photo.png](artifact:files/photo.png) (image - use view_image tool with path "files/photo.png" to see it)',
|
|
97
|
+
].join('\n'),
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
expect(parsed.attachments.map((a) => a.href)).toEqual([
|
|
101
|
+
'artifact:files/report.pdf',
|
|
102
|
+
'artifact:files/photo.png',
|
|
103
|
+
]);
|
|
104
|
+
expect(parsed.attachments[1].contentType).toBe('image/*');
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
|
|
16
108
|
describe('collectDeliveredArtifactRefs', () => {
|
|
109
|
+
it('collects references for filenames containing parentheses', () => {
|
|
110
|
+
const refs = collectDeliveredArtifactRefs([
|
|
111
|
+
question(
|
|
112
|
+
'[Files Ready] All 1 file(s)...\n\nUploaded artifacts:\n[filaments-bundle (6).json](artifact:files/filaments-bundle (6).json)',
|
|
113
|
+
),
|
|
114
|
+
]);
|
|
115
|
+
|
|
116
|
+
expect(refs).toEqual(new Set(['artifact:files/filaments-bundle (6).json', 'files/filaments-bundle (6).json']));
|
|
117
|
+
});
|
|
118
|
+
|
|
17
119
|
it('collects attachment references from persisted user messages', () => {
|
|
18
120
|
const refs = collectDeliveredArtifactRefs([
|
|
19
121
|
question('Review this.\n\nUploaded artifacts:\n[report.pdf](artifact:files/report.pdf)'),
|
|
@@ -428,7 +428,53 @@ export function AttachmentPreviewList({
|
|
|
428
428
|
}
|
|
429
429
|
|
|
430
430
|
const ATTACHMENT_SECTION_RE = /^\s*(?:\*\*)?(attachments|uploaded artifacts):(?:\*\*)?\s*$/i;
|
|
431
|
-
|
|
431
|
+
|
|
432
|
+
const SINGLE_WHITESPACE_RE = /\s/;
|
|
433
|
+
|
|
434
|
+
/** The only note shapes the server-side formatter emits (see processUserMessages). */
|
|
435
|
+
const ATTACHMENT_NOTE_PREFIXES = ['image -', 'text extracted to '];
|
|
436
|
+
|
|
437
|
+
interface AttachmentLineParts {
|
|
438
|
+
name: string;
|
|
439
|
+
href: string;
|
|
440
|
+
note?: string;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
/**
|
|
444
|
+
* Parse one attachment line of the form `- [label](href)` or `- [label](href) (note)`.
|
|
445
|
+
*
|
|
446
|
+
* Hrefs mirror user filenames, so they can contain parentheses and spaces
|
|
447
|
+
* ("artifact:files/report (6).json"), and workflow-composed lines append a parenthesized note
|
|
448
|
+
* ("(image - ...)", "(text extracted to ...)") that can itself contain parentheses. A regex for
|
|
449
|
+
* that shape needs overlapping greedy captures, which backtrack polynomially on message content
|
|
450
|
+
* (CodeQL js/polynomial-redos) — so the line is split with a linear scan instead: the label runs
|
|
451
|
+
* to the first "]", and the note starts at the rightmost "(" that is preceded by whitespace and
|
|
452
|
+
* a ")" AND opens one of the known note shapes. Requiring a known prefix is what keeps a
|
|
453
|
+
* note-less filename such as "a (b) (c).pdf" from being split at its own parentheses.
|
|
454
|
+
*/
|
|
455
|
+
function parseAttachmentLine(trimmed: string): AttachmentLineParts | null {
|
|
456
|
+
let text = trimmed;
|
|
457
|
+
if (text.startsWith('-') || text.startsWith('*')) {
|
|
458
|
+
text = text.slice(1).trimStart();
|
|
459
|
+
}
|
|
460
|
+
if (!text.startsWith('[') || !text.endsWith(')')) return null;
|
|
461
|
+
const labelEnd = text.indexOf(']');
|
|
462
|
+
if (labelEnd < 2 || text[labelEnd + 1] !== '(') return null;
|
|
463
|
+
const name = text.slice(1, labelEnd);
|
|
464
|
+
// Everything between "](" and the final ")": either the whole href, or "href) (note".
|
|
465
|
+
const body = text.slice(labelEnd + 2, -1);
|
|
466
|
+
for (let open = body.lastIndexOf('('); open > 0; open = body.lastIndexOf('(', open - 1)) {
|
|
467
|
+
let wsStart = open;
|
|
468
|
+
while (wsStart > 0 && SINGLE_WHITESPACE_RE.test(body[wsStart - 1])) {
|
|
469
|
+
wsStart--;
|
|
470
|
+
}
|
|
471
|
+
if (wsStart === open || wsStart < 2 || body[wsStart - 1] !== ')') continue;
|
|
472
|
+
const note = body.slice(open + 1);
|
|
473
|
+
if (!ATTACHMENT_NOTE_PREFIXES.some((prefix) => note.startsWith(prefix))) continue;
|
|
474
|
+
return { name, href: body.slice(0, wsStart - 1), note };
|
|
475
|
+
}
|
|
476
|
+
return body ? { name, href: body } : null;
|
|
477
|
+
}
|
|
432
478
|
|
|
433
479
|
export function parseUserMessageAttachments(content: string): ParsedUserAttachments {
|
|
434
480
|
const lines = content.split(/\r?\n/);
|
|
@@ -453,14 +499,14 @@ export function parseUserMessageAttachments(content: string): ParsedUserAttachme
|
|
|
453
499
|
continue;
|
|
454
500
|
}
|
|
455
501
|
|
|
456
|
-
const
|
|
457
|
-
if (!
|
|
502
|
+
const parsed = parseAttachmentLine(trimmed);
|
|
503
|
+
if (!parsed) {
|
|
458
504
|
inAttachmentSection = false;
|
|
459
505
|
bodyLines.push(line);
|
|
460
506
|
continue;
|
|
461
507
|
}
|
|
462
508
|
|
|
463
|
-
const
|
|
509
|
+
const { name, href, note } = parsed;
|
|
464
510
|
const artifactPath = href.startsWith('artifact:') ? href.slice('artifact:'.length) : undefined;
|
|
465
511
|
attachments.push({
|
|
466
512
|
id: `${href}-${attachments.length}`,
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { AgentMessage, BatchItemStatus, BatchProgressDetails } from '@vertesia/common';
|
|
2
2
|
import { Button, cn, onActivateKey, useToast } from '@vertesia/ui/core';
|
|
3
3
|
import { useUITranslation } from '@vertesia/ui/i18n';
|
|
4
|
-
import dayjs from 'dayjs';
|
|
5
4
|
import { AlertCircle, CheckCircle, ChevronDown, ChevronRight, CopyIcon, Layers, Loader2 } from 'lucide-react';
|
|
6
5
|
import { memo, useState } from 'react';
|
|
6
|
+
import dayjs from '../../../../core/utils/dayjs.js';
|
|
7
7
|
import { PulsatingCircle } from '../AnimatedThinkingDots';
|
|
8
8
|
|
|
9
9
|
export interface BatchProgressPanelProps {
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
ExternalLink,
|
|
13
13
|
GitFork,
|
|
14
14
|
InfoIcon,
|
|
15
|
+
MessageCirclePlus,
|
|
15
16
|
MessageSquareText,
|
|
16
17
|
MoreVertical,
|
|
17
18
|
Rows3,
|
|
@@ -194,6 +195,22 @@ export default function Header({
|
|
|
194
195
|
</Button>
|
|
195
196
|
)}
|
|
196
197
|
|
|
198
|
+
{resetWorkflow && (
|
|
199
|
+
<Button
|
|
200
|
+
type="button"
|
|
201
|
+
size={variant === 'compact' ? 'icon' : 'sm'}
|
|
202
|
+
variant="ghost"
|
|
203
|
+
onClick={resetWorkflow}
|
|
204
|
+
title={t('agent.startNewConversation')}
|
|
205
|
+
className={cn(
|
|
206
|
+
'transition-all duration-200 rounded-md',
|
|
207
|
+
variant === 'compact' && 'size-8 rounded-lg',
|
|
208
|
+
)}
|
|
209
|
+
>
|
|
210
|
+
<MessageCirclePlus className={cn('size-4', variant === 'full' && 'me-1.5')} />
|
|
211
|
+
</Button>
|
|
212
|
+
)}
|
|
213
|
+
|
|
197
214
|
{/* More actions */}
|
|
198
215
|
<MoreDropdown
|
|
199
216
|
compact={isCompact}
|
|
@@ -237,7 +254,7 @@ export default function Header({
|
|
|
237
254
|
<PayloadBuilderProvider>
|
|
238
255
|
<div
|
|
239
256
|
className={cn(
|
|
240
|
-
'flex flex-wrap items-
|
|
257
|
+
'flex flex-wrap items-center justify-between py-1.5 px-2 border-b shadow-sm flex-shrink-0',
|
|
241
258
|
className,
|
|
242
259
|
)}
|
|
243
260
|
>
|
|
@@ -9,7 +9,6 @@ import { useUITranslation } from '@vertesia/ui/i18n';
|
|
|
9
9
|
import { useRouterContext } from '@vertesia/ui/router';
|
|
10
10
|
import { useUserSession } from '@vertesia/ui/session';
|
|
11
11
|
import { MarkdownRenderer } from '@vertesia/ui/widgets';
|
|
12
|
-
import dayjs from 'dayjs';
|
|
13
12
|
import {
|
|
14
13
|
AlertCircle,
|
|
15
14
|
Bot,
|
|
@@ -26,6 +25,7 @@ import {
|
|
|
26
25
|
} from 'lucide-react';
|
|
27
26
|
import type React from 'react';
|
|
28
27
|
import { memo, useEffect, useMemo, useRef, useState } from 'react';
|
|
28
|
+
import dayjs from '../../../../core/utils/dayjs.js';
|
|
29
29
|
import { useDownloadFile } from '../../../store/objects/components/useDownloadFile.js';
|
|
30
30
|
import { PulsatingCircle } from '../AnimatedThinkingDots';
|
|
31
31
|
import { AskUserWidget } from '../AskUserWidget';
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Button, cn, useToast } from '@vertesia/ui/core';
|
|
2
2
|
import { useUITranslation } from '@vertesia/ui/i18n';
|
|
3
3
|
import { MarkdownRenderer } from '@vertesia/ui/widgets';
|
|
4
|
-
import dayjs from 'dayjs';
|
|
5
4
|
import { Bot, CopyIcon } from 'lucide-react';
|
|
6
5
|
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
6
|
+
import dayjs from '../../../../core/utils/dayjs.js';
|
|
7
7
|
|
|
8
8
|
// PERFORMANCE: Unicode cursor character - rendered inline with text
|
|
9
9
|
// This avoids expensive DOM manipulation with TreeWalker on every update
|
|
@@ -8,9 +8,9 @@ import { Button, cn, onActivateKey, useToast } from '@vertesia/ui/core';
|
|
|
8
8
|
import { useUITranslation } from '@vertesia/ui/i18n';
|
|
9
9
|
import { useUserSession } from '@vertesia/ui/session';
|
|
10
10
|
import { MarkdownRenderer } from '@vertesia/ui/widgets';
|
|
11
|
-
import dayjs from 'dayjs';
|
|
12
11
|
import { AlertCircle, AlertTriangle, Bot, CheckCircle, ChevronDown, ChevronRight, CopyIcon } from 'lucide-react';
|
|
13
12
|
import { memo, useEffect, useMemo, useRef, useState } from 'react';
|
|
13
|
+
import dayjs from '../../../../core/utils/dayjs.js';
|
|
14
14
|
import { PulsatingCircle } from '../AnimatedThinkingDots';
|
|
15
15
|
import { useImageLightbox } from '../ImageLightbox';
|
|
16
16
|
import { getArtifactCacheKey, useArtifactUrlCache } from '../useArtifactUrlCache.js';
|