@vertesia/ui 1.5.0-dev.20260725.083715Z → 1.5.0-dev.20260806.125520Z
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/core/components/ComboBox.d.ts.map +1 -1
- package/lib/core/components/ComboBox.js +4 -4
- package/lib/core/components/ComboBox.js.map +1 -1
- package/lib/core/components/FileUpload.js.map +1 -1
- package/lib/core/components/MenuList.d.ts +2 -1
- package/lib/core/components/MenuList.d.ts.map +1 -1
- package/lib/core/components/TagsInput.js +1 -1
- package/lib/core/components/popup/PopupController.d.ts.map +1 -1
- package/lib/core/components/popup/PopupController.js.map +1 -1
- package/lib/core/components/popup/position.js.map +1 -1
- package/lib/core/components/popup/utils.js.map +1 -1
- package/lib/core/components/shadcn/LanguageSwitcher.js.map +1 -1
- package/lib/core/components/shadcn/MessageBox.js.map +1 -1
- package/lib/core/components/shadcn/Panel.js +1 -1
- package/lib/core/components/shadcn/badge.d.ts +2 -2
- package/lib/core/components/shadcn/button.d.ts +2 -2
- package/lib/core/components/shadcn/button.js +1 -1
- package/lib/core/components/shadcn/command.d.ts +4 -4
- package/lib/core/components/shadcn/command.d.ts.map +1 -1
- package/lib/core/components/shadcn/filters/DynamicLabel.js +1 -1
- package/lib/core/components/shadcn/filters/comboBox/DateCombobox.d.ts.map +1 -1
- package/lib/core/components/shadcn/filters/comboBox/DateCombobox.js +1 -1
- package/lib/core/components/shadcn/filters/comboBox/SelectCombobox.d.ts.map +1 -1
- package/lib/core/components/shadcn/filters/comboBox/SelectCombobox.js +1 -1
- package/lib/core/components/shadcn/filters/comboBox/StringListCombobox.d.ts.map +1 -1
- package/lib/core/components/shadcn/filters/comboBox/TextCombobox.d.ts.map +1 -1
- package/lib/core/components/shadcn/filters/filter/dateFilter.js +1 -1
- package/lib/core/components/shadcn/filters/filterBar.d.ts.map +1 -1
- package/lib/core/components/shadcn/filters/filters.js.map +1 -1
- package/lib/core/components/shadcn/input.d.ts +2 -2
- package/lib/core/components/shadcn/modal/dialog.d.ts.map +1 -1
- package/lib/core/components/shadcn/popover.d.ts +1 -1
- package/lib/core/components/shadcn/popover.d.ts.map +1 -1
- package/lib/core/components/shadcn/popover.js.map +1 -1
- package/lib/core/components/shadcn/radioGroup.d.ts.map +1 -1
- package/lib/core/components/shadcn/selectBox.js +1 -1
- package/lib/core/components/shadcn/tabs.d.ts.map +1 -1
- package/lib/core/components/shadcn/tabs.js +1 -1
- package/lib/core/components/shadcn/text.d.ts +2 -2
- package/lib/core/components/shadcn/theme/ThemeSwitcher.js.map +1 -1
- package/lib/core/components/toast/ToastProvider.js +1 -1
- package/lib/core/hooks/CompositeState.d.ts +1 -1
- package/lib/core/hooks/CompositeState.d.ts.map +1 -1
- package/lib/core/hooks/CompositeState.js.map +1 -1
- package/lib/core/hooks/SharedState.d.ts.map +1 -1
- package/lib/core/hooks/useFetch.d.ts.map +1 -1
- package/lib/core/hooks/useFetch.js +2 -1
- package/lib/core/hooks/useFetch.js.map +1 -1
- package/lib/core/hooks/useFlag.d.ts.map +1 -1
- package/lib/core/hooks/useIntersectionObserver.js.map +1 -1
- package/lib/core/hooks/useSafeLayoutEffect.d.ts +2 -2
- package/lib/core/hooks/useSafeLayoutEffect.d.ts.map +1 -1
- package/lib/core/hooks/useScrollableSearch.d.ts +1 -1
- package/lib/core/hooks/useScrollableSearch.d.ts.map +1 -1
- package/lib/core/hooks/useScrollableSearch.js +15 -2
- package/lib/core/hooks/useScrollableSearch.js.map +1 -1
- package/lib/core/hooks/useSharedValue.d.ts.map +1 -1
- package/lib/core/hooks/useSharedValue.js.map +1 -1
- package/lib/core/utils/a11y.d.ts.map +1 -1
- package/lib/env/index.d.ts +4 -0
- package/lib/env/index.d.ts.map +1 -1
- package/lib/env/index.js.map +1 -1
- package/lib/features/agent/PayloadBuilder.d.ts +1 -1
- package/lib/features/agent/PayloadBuilder.d.ts.map +1 -1
- package/lib/features/agent/PayloadBuilder.js.map +1 -1
- package/lib/features/agent/chat/AgentRequestInputOverlay.d.ts +1 -1
- package/lib/features/agent/chat/AgentRequestInputOverlay.d.ts.map +1 -1
- package/lib/features/agent/chat/AgentRequestInputOverlay.js +3 -8
- package/lib/features/agent/chat/AgentRequestInputOverlay.js.map +1 -1
- package/lib/features/agent/chat/ArtifactsTab.js +1 -1
- package/lib/features/agent/chat/AskUserWidget.js +1 -1
- package/lib/features/agent/chat/DocumentEditingActionCard.js +1 -1
- package/lib/features/agent/chat/ModernAgentConversation.d.ts +8 -1
- package/lib/features/agent/chat/ModernAgentConversation.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentConversation.js +79 -20
- package/lib/features/agent/chat/ModernAgentConversation.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.d.ts +2 -1
- package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.js +25 -10
- package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/AgentMarkdownAnchor.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/AgentMarkdownAnchor.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js +25 -10
- package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.d.ts +7 -0
- package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.js +40 -3
- package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/BatchProgressPanel.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/Header.js +2 -2
- package/lib/features/agent/chat/ModernAgentOutput/Header.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageInput.d.ts +2 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageInput.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js +2 -2
- package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageItem.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js +2 -2
- package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/ResourceChip.js +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/SlideInPanel.js +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/StreamingMessage.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.js +8 -0
- package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/ToolCallGroup.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/ToolCallGroup.js +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.d.ts +9 -1
- package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.js +97 -2
- package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/utils.d.ts.map +1 -1
- package/lib/features/agent/chat/SlidingThinkingIndicator.js +1 -1
- package/lib/features/agent/chat/VegaLiteChart.js +1 -1
- 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 +38 -3
- package/lib/features/agent/chat/hooks/useAgentStream.js.map +1 -1
- package/lib/features/agent/chat/hooks/useFileProcessing.d.ts +8 -1
- package/lib/features/agent/chat/hooks/useFileProcessing.d.ts.map +1 -1
- package/lib/features/agent/chat/hooks/useFileProcessing.js +31 -2
- package/lib/features/agent/chat/hooks/useFileProcessing.js.map +1 -1
- package/lib/features/agent/chat/index.d.ts +1 -1
- package/lib/features/agent/chat/index.d.ts.map +1 -1
- package/lib/features/agent/chat/index.js.map +1 -1
- package/lib/features/agent/chat/useArtifactUrlCache.js.map +1 -1
- package/lib/features/agent/chat/workstreams.d.ts +1 -1
- package/lib/features/facets/AgentRunnerFacetsNav.d.ts.map +1 -1
- package/lib/features/facets/CollectionsFacetsNav.d.ts.map +1 -1
- package/lib/features/facets/DocumentsFacetsNav.d.ts.map +1 -1
- package/lib/features/facets/InteractionsFacetsNav.d.ts.map +1 -1
- package/lib/features/facets/PromptsFacetsNav.d.ts +8 -6
- package/lib/features/facets/PromptsFacetsNav.d.ts.map +1 -1
- package/lib/features/facets/PromptsFacetsNav.js +8 -3
- package/lib/features/facets/PromptsFacetsNav.js.map +1 -1
- package/lib/features/facets/RunsFacetsNav.d.ts.map +1 -1
- package/lib/features/facets/WorkflowExecutionsFacetsNav.d.ts.map +1 -1
- package/lib/features/magic-pdf/GroundedExtractionView.js +1 -1
- package/lib/features/magic-pdf/MagicPdfProvider.d.ts.map +1 -1
- package/lib/features/magic-pdf/MagicPdfProvider.js.map +1 -1
- package/lib/features/oauth/McpConnectionsButton.js +1 -1
- package/lib/features/oauth/OAuthProviderConnectButton.js +1 -1
- package/lib/features/oauth/RemoteMcpConnectionButton.js +1 -1
- package/lib/features/pdf-viewer/PdfPageRenderer.js +1 -1
- package/lib/features/pdf-viewer/PdfPageSlider.js +1 -1
- package/lib/features/permissions/UserPermissionsProvider.d.ts.map +1 -1
- package/lib/features/permissions/UserPermissionsProvider.js.map +1 -1
- package/lib/features/store/collections/CollectionsTable.js +2 -2
- package/lib/features/store/collections/CollectionsTable.js.map +1 -1
- package/lib/features/store/collections/CreateCollection.js +1 -1
- package/lib/features/store/collections/EditCollectionView.js +1 -1
- package/lib/features/store/objects/DocumentQuickFilter.js +1 -1
- package/lib/features/store/objects/DocumentSelectionProvider.d.ts.map +1 -1
- package/lib/features/store/objects/DocumentSelectionProvider.js.map +1 -1
- package/lib/features/store/objects/components/ContentDispositionButton.d.ts +2 -1
- package/lib/features/store/objects/components/ContentDispositionButton.d.ts.map +1 -1
- package/lib/features/store/objects/components/ContentOverview.js +5 -2
- package/lib/features/store/objects/components/ContentOverview.js.map +1 -1
- package/lib/features/store/objects/components/DocumentEditingPanel.js +1 -1
- package/lib/features/store/objects/components/PropertiesEditorModal.js +1 -1
- package/lib/features/store/objects/components/TextEditorPanel.js +1 -1
- package/lib/features/store/objects/components/documentEditingTarget.d.ts.map +1 -1
- package/lib/features/store/objects/components/useContentPanelHooks.d.ts +31 -3
- package/lib/features/store/objects/components/useContentPanelHooks.d.ts.map +1 -1
- package/lib/features/store/objects/layout/DocumentTableColumn.d.ts +1 -1
- package/lib/features/store/objects/layout/DocumentTableColumn.d.ts.map +1 -1
- package/lib/features/store/objects/layout/DocumentTableColumn.js.map +1 -1
- package/lib/features/store/objects/layout/documentLayout.js +1 -1
- package/lib/features/store/objects/layout/renderers.d.ts.map +1 -1
- package/lib/features/store/objects/search/DocumentSearchContext.d.ts +129 -7
- package/lib/features/store/objects/search/DocumentSearchContext.d.ts.map +1 -1
- package/lib/features/store/objects/search/DocumentSearchContext.js.map +1 -1
- package/lib/features/store/objects/selection/ObjectsActionContext.d.ts +2 -2
- package/lib/features/store/objects/selection/ObjectsActionContext.d.ts.map +1 -1
- package/lib/features/store/objects/selection/ObjectsActionContextClass.d.ts.map +1 -1
- package/lib/features/store/objects/selection/ObjectsActionContextClass.js.map +1 -1
- package/lib/features/store/objects/selection/ObjectsActionSpec.d.ts +2 -2
- package/lib/features/store/objects/selection/ObjectsActionSpec.d.ts.map +1 -1
- package/lib/features/store/objects/selection/SelectionActions.d.ts +2 -2
- package/lib/features/store/objects/selection/SelectionActions.d.ts.map +1 -1
- package/lib/features/store/objects/selection/SelectionActions.js +1 -1
- package/lib/features/store/objects/selection/actions/ConfirmAction.js +1 -1
- package/lib/features/store/objects/selection/actions/DeleteObjectsAction.js +1 -1
- package/lib/features/store/objects/selection/actions/StartWorkflowButton.js +1 -1
- package/lib/features/store/objects/upload/DocumentUploadModal.js +1 -1
- 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/useUploadHandler.d.ts.map +1 -1
- package/lib/features/store/types/ContentObjectTypesSearch.js +1 -1
- package/lib/features/store/types/IntakePolicyEditor.d.ts +2 -2
- package/lib/features/store/types/IntakePolicyEditor.d.ts.map +1 -1
- package/lib/features/store/types/IntakePolicyEditor.js +6 -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 +2 -2
- package/lib/features/store/types/IntakePolicyForm.js.map +1 -1
- package/lib/features/store/types/ObjectSchemaEditor.d.ts +2 -2
- package/lib/features/store/types/ObjectSchemaEditor.d.ts.map +1 -1
- package/lib/features/store/types/SelectContentType.d.ts +2 -2
- package/lib/features/store/types/SelectContentType.d.ts.map +1 -1
- package/lib/features/store/types/SelectContentType.js.map +1 -1
- package/lib/features/store/types/SelectContentTypeModal.d.ts +2 -2
- package/lib/features/store/types/SelectContentTypeModal.d.ts.map +1 -1
- package/lib/features/store/types/SelectContentTypeModal.js.map +1 -1
- package/lib/features/store/types/TableLayoutEditor.d.ts +2 -2
- package/lib/features/store/types/TableLayoutEditor.d.ts.map +1 -1
- package/lib/features/store/types/TypeRegistry.d.ts +1267 -6
- package/lib/features/store/types/TypeRegistry.d.ts.map +1 -1
- package/lib/features/store/types/TypeRegistry.js +5 -0
- package/lib/features/store/types/TypeRegistry.js.map +1 -1
- package/lib/features/store/types/intake-policy-editor.logic.d.ts +9 -1
- package/lib/features/store/types/intake-policy-editor.logic.d.ts.map +1 -1
- package/lib/features/store/types/intake-policy-editor.logic.js +9 -1
- package/lib/features/store/types/intake-policy-editor.logic.js.map +1 -1
- package/lib/features/store/types/search/ObjectTypeSearchContext.d.ts +1252 -2
- package/lib/features/store/types/search/ObjectTypeSearchContext.d.ts.map +1 -1
- package/lib/features/store/types/search/ObjectTypeSearchContext.js.map +1 -1
- package/lib/features/store/types/typeCatalogCache.d.ts +2 -2
- package/lib/features/store/types/typeCatalogCache.d.ts.map +1 -1
- package/lib/features/store/types/typeCatalogCache.js +4 -0
- package/lib/features/store/types/typeCatalogCache.js.map +1 -1
- package/lib/features/user/UserInfo.d.ts +118 -7
- package/lib/features/user/UserInfo.d.ts.map +1 -1
- package/lib/features/user/UserInfo.js +1 -1
- package/lib/features/user/UserInfo.js.map +1 -1
- package/lib/features/utils/mimeType.d.ts.map +1 -1
- package/lib/features/utils/rendition.js.map +1 -1
- package/lib/features/utils/text.js.map +1 -1
- package/lib/i18n/locales/ar.json +27 -1
- package/lib/i18n/locales/de.json +27 -1
- package/lib/i18n/locales/en.json +30 -1
- package/lib/i18n/locales/es.json +27 -1
- package/lib/i18n/locales/fr.json +27 -1
- package/lib/i18n/locales/it.json +27 -1
- package/lib/i18n/locales/ja.json +27 -1
- package/lib/i18n/locales/ko.json +27 -1
- package/lib/i18n/locales/pt.json +27 -1
- package/lib/i18n/locales/ru.json +27 -1
- package/lib/i18n/locales/tr.json +27 -1
- package/lib/i18n/locales/zh-TW.json +27 -1
- package/lib/i18n/locales/zh.json +27 -1
- package/lib/i18n/rtl.d.ts +1 -1
- package/lib/i18n/rtl.d.ts.map +1 -1
- package/lib/layout/FullHeightLayout.d.ts +7 -6
- package/lib/layout/FullHeightLayout.d.ts.map +1 -1
- package/lib/layout/Sidebar.d.ts +1 -1
- package/lib/layout/Sidebar.js +1 -1
- package/lib/rich-text/EditorToolbar.js +1 -1
- package/lib/router/HistoryNavigator.d.ts +2 -2
- package/lib/router/HistoryNavigator.d.ts.map +1 -1
- package/lib/router/HistoryNavigator.js.map +1 -1
- package/lib/router/PathMatcher.d.ts.map +1 -1
- package/lib/router/PathMatcher.js.map +1 -1
- package/lib/router/PathWithParams.d.ts.map +1 -1
- package/lib/router/Redirect.js.map +1 -1
- package/lib/router/Route404.js +1 -1
- package/lib/router/Router.d.ts.map +1 -1
- package/lib/router/Router.js.map +1 -1
- package/lib/session/UserSession.d.ts +18 -4
- package/lib/session/UserSession.d.ts.map +1 -1
- package/lib/session/UserSession.js.map +1 -1
- package/lib/session/UserSessionProvider.d.ts +2 -0
- package/lib/session/UserSessionProvider.d.ts.map +1 -1
- package/lib/session/UserSessionProvider.js +81 -53
- package/lib/session/UserSessionProvider.js.map +1 -1
- package/lib/session/auth/composable.d.ts +49 -1
- package/lib/session/auth/composable.d.ts.map +1 -1
- package/lib/session/auth/composable.js +179 -53
- package/lib/session/auth/composable.js.map +1 -1
- package/lib/shell/VertesiaShell.js +1 -1
- package/lib/shell/apps/AppInstallationProvider.d.ts +230 -2
- package/lib/shell/apps/AppInstallationProvider.d.ts.map +1 -1
- package/lib/shell/apps/AppProjectSelector.js +1 -1
- package/lib/shell/login/InviteAcceptModal.js.map +1 -1
- package/lib/shell/login/SignInEmailStep.js +1 -1
- package/lib/shell/login/SignInPrimitives.d.ts +21 -20
- package/lib/shell/login/SignInPrimitives.d.ts.map +1 -1
- package/lib/shell/login/SignInPrimitives.js.map +1 -1
- package/lib/shell/login/SignInRecoveryStep.d.ts +22 -0
- package/lib/shell/login/SignInRecoveryStep.d.ts.map +1 -0
- package/lib/shell/login/SignInRecoveryStep.js +59 -0
- package/lib/shell/login/SignInRecoveryStep.js.map +1 -0
- package/lib/shell/login/SigninScreen.d.ts.map +1 -1
- package/lib/shell/login/SigninScreen.js +84 -11
- package/lib/shell/login/SigninScreen.js.map +1 -1
- package/lib/shell/login/SignupForm.js +1 -1
- package/lib/shell/login/TerminalLogin.js +1 -1
- package/lib/shell/login/UserSessionMenu.js +1 -1
- package/lib/vertesia-ui-core.js +1 -1
- package/lib/vertesia-ui-core.js.map +1 -1
- package/lib/vertesia-ui-features.js +34 -34
- package/lib/vertesia-ui-features.js.map +1 -1
- package/lib/vertesia-ui-i18n.js +13 -13
- package/lib/vertesia-ui-layout.js.map +1 -1
- package/lib/vertesia-ui-rich-text.js.map +1 -1
- package/lib/vertesia-ui-router.js.map +1 -1
- package/lib/vertesia-ui-session.js +1 -1
- package/lib/vertesia-ui-session.js.map +1 -1
- package/lib/vertesia-ui-shell.js +1 -1
- package/lib/vertesia-ui-shell.js.map +1 -1
- package/lib/vertesia-ui-widgets.js +18 -18
- package/lib/vertesia-ui-widgets.js.map +1 -1
- package/lib/widgets/form/FormContext.d.ts.map +1 -1
- package/lib/widgets/form/FormContext.js.map +1 -1
- package/lib/widgets/form/ManagedObject.d.ts +2 -2
- package/lib/widgets/form/ManagedObject.d.ts.map +1 -1
- package/lib/widgets/form/ManagedObject.js.map +1 -1
- package/lib/widgets/form/schema.d.ts.map +1 -1
- package/lib/widgets/form/schema.js.map +1 -1
- package/lib/widgets/json-view/JSONCode.js +1 -1
- package/lib/widgets/json-view/JSONTable.js +1 -1
- package/lib/widgets/markdown/ArtifactContentRenderer.js.map +1 -1
- package/lib/widgets/markdown/CodeBlockPlaceholder.d.ts +1 -1
- package/lib/widgets/markdown/CodeBlockPlaceholder.d.ts.map +1 -1
- package/lib/widgets/markdown/CodeBlockPlaceholder.js +1 -1
- package/lib/widgets/markdown/CodeBlockRendering.d.ts.map +1 -1
- package/lib/widgets/markdown/CollaborativeMarkdownRenderer.js +1 -1
- package/lib/widgets/markdown/remarkDirectiveHandler.d.ts.map +1 -1
- package/lib/widgets/markdown/textDiff.js.map +1 -1
- package/lib/widgets/monacoEditor/MonacoEditor.d.ts +7 -1
- package/lib/widgets/monacoEditor/MonacoEditor.d.ts.map +1 -1
- package/lib/widgets/monacoEditor/MonacoEditor.js +62 -6
- package/lib/widgets/monacoEditor/MonacoEditor.js.map +1 -1
- package/lib/widgets/schema-editor/ManagedSchema.d.ts.map +1 -1
- package/lib/widgets/schema-editor/editor/PropertyEditor.js +1 -1
- package/lib/widgets/schema-editor/json-schema4-utils.js.map +1 -1
- package/lib/widgets/xml-viewer/components/Elements/index.js +1 -1
- package/lib/widgets/xml-viewer/components/Tag/index.js +1 -1
- package/lib/widgets/xml-viewer/constants/index.d.ts.map +1 -1
- package/lib/widgets/xml-viewer/helpers/index.d.ts +1 -1
- package/lib/widgets/xml-viewer/hooks/useCollapsible.d.ts +1 -1
- package/lib/widgets/xml-viewer/hooks/useCollapsible.d.ts.map +1 -1
- package/package.json +33 -33
- package/src/core/hooks/useFetch.ts +2 -1
- package/src/core/hooks/useScrollableSearch.test.tsx +139 -0
- package/src/core/hooks/useScrollableSearch.tsx +17 -3
- package/src/env/index.ts +2 -0
- package/src/features/agent/chat/AgentChatPlaybackControls.test.tsx +2 -0
- package/src/features/agent/chat/AgentRequestInputOverlay.test.tsx +51 -6
- package/src/features/agent/chat/AgentRequestInputOverlay.tsx +5 -7
- package/src/features/agent/chat/ModernAgentConversation.test.tsx +208 -3
- package/src/features/agent/chat/ModernAgentConversation.tsx +130 -25
- package/src/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.tsx +75 -20
- package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.test.tsx +112 -0
- package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +62 -10
- package/src/features/agent/chat/ModernAgentOutput/AttachmentPreview.test.ts +38 -0
- package/src/features/agent/chat/ModernAgentOutput/AttachmentPreview.tsx +62 -4
- package/src/features/agent/chat/ModernAgentOutput/Header.tsx +2 -2
- package/src/features/agent/chat/ModernAgentOutput/MessageInput.test.tsx +71 -0
- package/src/features/agent/chat/ModernAgentOutput/MessageInput.tsx +3 -1
- package/src/features/agent/chat/ModernAgentOutput/MessageItem.tsx +18 -4
- package/src/features/agent/chat/ModernAgentOutput/SummaryConversation.ts +9 -0
- package/src/features/agent/chat/ModernAgentOutput/requestInputMessages.test.ts +95 -0
- package/src/features/agent/chat/ModernAgentOutput/requestInputMessages.ts +111 -1
- package/src/features/agent/chat/ModernAgentOutput/utils.test.ts +21 -0
- package/src/features/agent/chat/hooks/useAgentStream.test.tsx +172 -0
- package/src/features/agent/chat/hooks/useAgentStream.ts +38 -3
- package/src/features/agent/chat/hooks/useFileProcessing.test.tsx +87 -0
- package/src/features/agent/chat/hooks/useFileProcessing.ts +32 -1
- package/src/features/agent/chat/index.ts +1 -0
- package/src/features/facets/PromptsFacetsNav.tsx +17 -9
- package/src/features/store/collections/CollectionsTable.tsx +1 -1
- package/src/features/store/objects/components/ContentOverview.tsx +4 -1
- package/src/features/store/objects/selection/ObjectsActionContext.tsx +2 -2
- package/src/features/store/objects/selection/ObjectsActionSpec.ts +2 -2
- package/src/features/store/objects/selection/SelectionActions.tsx +2 -2
- package/src/features/store/objects/upload/DocumentUploadModal.tsx +2 -2
- package/src/features/store/types/IntakePolicyEditor.tsx +12 -4
- package/src/features/store/types/IntakePolicyForm.tsx +25 -0
- package/src/features/store/types/ObjectSchemaEditor.tsx +2 -2
- package/src/features/store/types/SelectContentType.tsx +9 -9
- package/src/features/store/types/SelectContentTypeModal.tsx +5 -5
- package/src/features/store/types/TableLayoutEditor.tsx +2 -2
- package/src/features/store/types/TypeRegistry.ts +8 -3
- package/src/features/store/types/intake-policy-editor.logic.ts +10 -2
- package/src/features/store/types/typeCatalogCache.ts +10 -3
- package/src/i18n/locales/ar.json +27 -1
- package/src/i18n/locales/de.json +27 -1
- package/src/i18n/locales/en.json +30 -1
- package/src/i18n/locales/es.json +27 -1
- package/src/i18n/locales/fr.json +27 -1
- package/src/i18n/locales/it.json +27 -1
- package/src/i18n/locales/ja.json +27 -1
- package/src/i18n/locales/ko.json +27 -1
- package/src/i18n/locales/pt.json +27 -1
- package/src/i18n/locales/ru.json +27 -1
- package/src/i18n/locales/tr.json +27 -1
- package/src/i18n/locales/zh-TW.json +27 -1
- package/src/i18n/locales/zh.json +27 -1
- package/src/session/UserSessionProvider.test.ts +69 -0
- package/src/session/UserSessionProvider.tsx +96 -60
- package/src/session/auth/composable.scope.test.ts +88 -0
- package/src/session/auth/composable.test.ts +205 -0
- package/src/session/auth/composable.ts +227 -58
- package/src/shell/login/InviteAcceptModal.tsx +4 -4
- package/src/shell/login/SignInPrimitives.tsx +1 -0
- package/src/shell/login/SignInRecoveryStep.test.tsx +112 -0
- package/src/shell/login/SignInRecoveryStep.tsx +177 -0
- package/src/shell/login/SigninScreen.tsx +145 -27
- package/src/widgets/markdown/ArtifactEditingSurface.test.tsx +13 -9
- package/src/widgets/monacoEditor/MonacoEditor.tsx +83 -7
|
@@ -60,6 +60,7 @@ vi.mock('./ModernAgentOutput/MessageInput', () => ({
|
|
|
60
60
|
onSend: (message: string) => void;
|
|
61
61
|
activeTaskCount?: number;
|
|
62
62
|
activeWorkstreams?: Array<{ workstream_id: string; status: string }>;
|
|
63
|
+
onSelectWorkstream?: (workstreamId: string) => void;
|
|
63
64
|
isCompleted?: boolean;
|
|
64
65
|
isStreaming?: boolean;
|
|
65
66
|
placeholder?: string;
|
|
@@ -90,6 +91,7 @@ vi.mock('./ModernAgentOutput/AllMessagesMixed', async () => {
|
|
|
90
91
|
return {
|
|
91
92
|
default: ({
|
|
92
93
|
messages,
|
|
94
|
+
workstreamSourceMessages,
|
|
93
95
|
streamingMessages,
|
|
94
96
|
isCompleted,
|
|
95
97
|
bottomRef,
|
|
@@ -101,6 +103,7 @@ vi.mock('./ModernAgentOutput/AllMessagesMixed', async () => {
|
|
|
101
103
|
onActiveWorkstreamChange,
|
|
102
104
|
}: {
|
|
103
105
|
messages: AgentMessage[];
|
|
106
|
+
workstreamSourceMessages?: AgentMessage[];
|
|
104
107
|
streamingMessages: Map<string, unknown>;
|
|
105
108
|
isCompleted?: boolean;
|
|
106
109
|
bottomRef: React.RefObject<HTMLDivElement>;
|
|
@@ -118,6 +121,7 @@ vi.mock('./ModernAgentOutput/AllMessagesMixed', async () => {
|
|
|
118
121
|
);
|
|
119
122
|
mocks.allMessagesMixedProps({
|
|
120
123
|
messages,
|
|
124
|
+
workstreamSourceMessages,
|
|
121
125
|
streamingMessages,
|
|
122
126
|
isCompleted,
|
|
123
127
|
onSendMessage,
|
|
@@ -230,6 +234,7 @@ function latestAllMessagesMixedProps() {
|
|
|
230
234
|
return calls[calls.length - 1]?.[0] as
|
|
231
235
|
| {
|
|
232
236
|
messages: AgentMessage[];
|
|
237
|
+
workstreamSourceMessages?: AgentMessage[];
|
|
233
238
|
streamingMessages: Map<string, unknown>;
|
|
234
239
|
isCompleted?: boolean;
|
|
235
240
|
showInitialRequest?: boolean;
|
|
@@ -253,6 +258,7 @@ function latestRightPanelProps() {
|
|
|
253
258
|
describe('ModernAgentConversation send handling', () => {
|
|
254
259
|
beforeEach(() => {
|
|
255
260
|
vi.clearAllMocks();
|
|
261
|
+
window.sessionStorage.clear();
|
|
256
262
|
mocks.restart.mockResolvedValue({ id: 'agent-run-1' });
|
|
257
263
|
mocks.sendSignal.mockResolvedValue({});
|
|
258
264
|
mocks.getActiveWorkstreams.mockResolvedValue({ running: [] });
|
|
@@ -337,6 +343,19 @@ describe('ModernAgentConversation send handling', () => {
|
|
|
337
343
|
await waitFor(() => expect(onAgentWorkingChange).toHaveBeenLastCalledWith(false));
|
|
338
344
|
});
|
|
339
345
|
|
|
346
|
+
it('shows the latest main-workstream error in the failed workflow box', () => {
|
|
347
|
+
mockStreamState({
|
|
348
|
+
messages: [createMessage(AgentMessageType.ERROR, 'Workflow failed: provider request timed out')],
|
|
349
|
+
agentRunStatus: 'FAILED',
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
renderConversation({ hideMessageInput: false });
|
|
353
|
+
|
|
354
|
+
expect(screen.getByText('Failed')).not.toBeNull();
|
|
355
|
+
expect(screen.getByText('Workflow failed: provider request timed out')).not.toBeNull();
|
|
356
|
+
expect(screen.queryByText('This Workflow is FAILED')).toBeNull();
|
|
357
|
+
});
|
|
358
|
+
|
|
340
359
|
it('provides its resourceResolver prop to conversation content', () => {
|
|
341
360
|
mockStreamState({ messages: [createMessage(AgentMessageType.COMPLETE, 'done')] });
|
|
342
361
|
|
|
@@ -561,6 +580,37 @@ describe('ModernAgentConversation send handling', () => {
|
|
|
561
580
|
});
|
|
562
581
|
});
|
|
563
582
|
|
|
583
|
+
it('collapses staged files in the start composer', () => {
|
|
584
|
+
const { container } = renderWithProviders(
|
|
585
|
+
<ModernAgentConversation startWorkflow={vi.fn()} hideHeader initialMessage="" />,
|
|
586
|
+
);
|
|
587
|
+
const input = container.querySelector('input[type="file"]');
|
|
588
|
+
const files = ['alpha.txt', 'beta.txt', 'gamma.txt', 'delta.txt', 'epsilon.txt'].map(
|
|
589
|
+
(name) => new File([name], name, { type: 'text/plain' }),
|
|
590
|
+
);
|
|
591
|
+
|
|
592
|
+
if (!input) {
|
|
593
|
+
throw new Error('Expected hidden file input to be rendered');
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
fireEvent.change(input, {
|
|
597
|
+
target: {
|
|
598
|
+
files,
|
|
599
|
+
},
|
|
600
|
+
});
|
|
601
|
+
|
|
602
|
+
expect(screen.getByText('alpha.txt')).not.toBeNull();
|
|
603
|
+
expect(screen.getByText('gamma.txt')).not.toBeNull();
|
|
604
|
+
expect(screen.queryByText('delta.txt')).toBeNull();
|
|
605
|
+
expect(screen.getByText('+2')).not.toBeNull();
|
|
606
|
+
|
|
607
|
+
fireEvent.click(screen.getByRole('button', { name: /show more/i }));
|
|
608
|
+
|
|
609
|
+
expect(screen.getByText('delta.txt')).not.toBeNull();
|
|
610
|
+
expect(screen.getByText('epsilon.txt')).not.toBeNull();
|
|
611
|
+
expect(screen.getByRole('button', { name: /show less/i })).not.toBeNull();
|
|
612
|
+
});
|
|
613
|
+
|
|
564
614
|
it('signals approval mode changes for an active interactive run', async () => {
|
|
565
615
|
mocks.retrieve.mockResolvedValue({
|
|
566
616
|
tool_approval_mode: 'ask',
|
|
@@ -916,11 +966,13 @@ describe('ModernAgentConversation send handling', () => {
|
|
|
916
966
|
onCompactContext?: () => void | Promise<void>;
|
|
917
967
|
};
|
|
918
968
|
|
|
969
|
+
// Prompt-based, matching the server's checkpoint trigger: `total`
|
|
970
|
+
// includes reasoning/result tokens that never re-enter context.
|
|
919
971
|
expect(latestMessageInputProps.contextWindowUsage).toEqual({
|
|
920
|
-
usedTokens:
|
|
972
|
+
usedTokens: 40_000,
|
|
921
973
|
checkpointTokens: 100_000,
|
|
922
|
-
usedPercent:
|
|
923
|
-
remainingPercent:
|
|
974
|
+
usedPercent: 40,
|
|
975
|
+
remainingPercent: 60,
|
|
924
976
|
});
|
|
925
977
|
|
|
926
978
|
act(() => {
|
|
@@ -1059,6 +1111,7 @@ describe('ModernAgentConversation send handling', () => {
|
|
|
1059
1111
|
const latestMessageInputProps = mocks.messageInputProps.mock.lastCall?.[0] as {
|
|
1060
1112
|
activeTaskCount?: number;
|
|
1061
1113
|
activeWorkstreams?: Array<{ workstream_id: string; status: string }>;
|
|
1114
|
+
onSelectWorkstream?: (workstreamId: string) => void;
|
|
1062
1115
|
};
|
|
1063
1116
|
|
|
1064
1117
|
expect(latestRightPanelProps.activeWorkstreams).toEqual([
|
|
@@ -1072,6 +1125,12 @@ describe('ModernAgentConversation send handling', () => {
|
|
|
1072
1125
|
expect.objectContaining({ workstream_id: 'alpha', status: 'running' }),
|
|
1073
1126
|
expect.objectContaining({ workstream_id: 'beta', status: 'running' }),
|
|
1074
1127
|
]);
|
|
1128
|
+
|
|
1129
|
+
act(() => {
|
|
1130
|
+
latestMessageInputProps.onSelectWorkstream?.('beta');
|
|
1131
|
+
});
|
|
1132
|
+
|
|
1133
|
+
expect(latestAllMessagesMixedProps()?.activeWorkstream).toBe('beta');
|
|
1075
1134
|
});
|
|
1076
1135
|
|
|
1077
1136
|
it('shows completed workstream lifecycle messages in the panel without counting them as active', async () => {
|
|
@@ -1488,6 +1547,80 @@ describe('ModernAgentConversation send handling', () => {
|
|
|
1488
1547
|
);
|
|
1489
1548
|
});
|
|
1490
1549
|
|
|
1550
|
+
it('does not resurrect an answered request overlay after remounting before the persisted echo arrives', async () => {
|
|
1551
|
+
const requestMessage = {
|
|
1552
|
+
...createMessage(AgentMessageType.REQUEST_INPUT, 'What is your favorite color?'),
|
|
1553
|
+
details: {
|
|
1554
|
+
request_id: 'ask-user-1',
|
|
1555
|
+
ux: {
|
|
1556
|
+
options: [
|
|
1557
|
+
{ id: 'red', label: 'Red' },
|
|
1558
|
+
{ id: 'blue', label: 'Blue' },
|
|
1559
|
+
],
|
|
1560
|
+
},
|
|
1561
|
+
},
|
|
1562
|
+
};
|
|
1563
|
+
mockStreamState({
|
|
1564
|
+
messages: [requestMessage],
|
|
1565
|
+
isCompleted: false,
|
|
1566
|
+
agentRunStatus: 'RUNNING',
|
|
1567
|
+
});
|
|
1568
|
+
|
|
1569
|
+
const firstView = renderConversation();
|
|
1570
|
+
fireEvent.click(screen.getByRole('button', { name: /Blue/ }));
|
|
1571
|
+
|
|
1572
|
+
await waitFor(() => expect(mocks.sendSignal).toHaveBeenCalledTimes(1));
|
|
1573
|
+
expect(mocks.sendSignal).toHaveBeenCalledWith(
|
|
1574
|
+
'agent-run-1',
|
|
1575
|
+
'UserInput',
|
|
1576
|
+
expect.objectContaining({
|
|
1577
|
+
metadata: expect.objectContaining({
|
|
1578
|
+
request_input_response: { request_id: 'ask-user-1' },
|
|
1579
|
+
}),
|
|
1580
|
+
}),
|
|
1581
|
+
);
|
|
1582
|
+
|
|
1583
|
+
firstView.unmount();
|
|
1584
|
+
renderConversation();
|
|
1585
|
+
|
|
1586
|
+
expect(screen.queryByText('What is your favorite color?')).toBeNull();
|
|
1587
|
+
expect(screen.queryByRole('button', { name: /Blue/ })).toBeNull();
|
|
1588
|
+
});
|
|
1589
|
+
|
|
1590
|
+
it('restores a request overlay after its response fails to send', async () => {
|
|
1591
|
+
mocks.sendSignal.mockRejectedValueOnce(new Error('offline'));
|
|
1592
|
+
const requestMessage = {
|
|
1593
|
+
...createMessage(AgentMessageType.REQUEST_INPUT, 'What is your favorite color?'),
|
|
1594
|
+
details: {
|
|
1595
|
+
request_id: 'ask-user-1',
|
|
1596
|
+
ux: {
|
|
1597
|
+
options: [
|
|
1598
|
+
{ id: 'red', label: 'Red' },
|
|
1599
|
+
{ id: 'blue', label: 'Blue' },
|
|
1600
|
+
],
|
|
1601
|
+
},
|
|
1602
|
+
},
|
|
1603
|
+
};
|
|
1604
|
+
mockStreamState({
|
|
1605
|
+
messages: [requestMessage],
|
|
1606
|
+
isCompleted: false,
|
|
1607
|
+
agentRunStatus: 'RUNNING',
|
|
1608
|
+
});
|
|
1609
|
+
|
|
1610
|
+
const firstView = renderConversation();
|
|
1611
|
+
fireEvent.click(screen.getByRole('button', { name: /Blue/ }));
|
|
1612
|
+
|
|
1613
|
+
await waitFor(() => {
|
|
1614
|
+
expect(mocks.updateOptimisticMessageStatus).toHaveBeenCalledWith(expect.any(String), 'failed');
|
|
1615
|
+
});
|
|
1616
|
+
|
|
1617
|
+
firstView.unmount();
|
|
1618
|
+
renderConversation();
|
|
1619
|
+
|
|
1620
|
+
expect(screen.getByText('What is your favorite color?')).not.toBeNull();
|
|
1621
|
+
expect(screen.getByRole('button', { name: /Blue/ })).not.toBeNull();
|
|
1622
|
+
});
|
|
1623
|
+
|
|
1491
1624
|
it('hides a stale request overlay when a terminal run cannot continue', () => {
|
|
1492
1625
|
mockStreamState({
|
|
1493
1626
|
messages: [
|
|
@@ -2213,6 +2346,78 @@ describe('ModernAgentConversation send handling', () => {
|
|
|
2213
2346
|
);
|
|
2214
2347
|
});
|
|
2215
2348
|
|
|
2349
|
+
it('hides the debug button when the playback toggle is disabled', () => {
|
|
2350
|
+
mockStreamState({
|
|
2351
|
+
messages: [
|
|
2352
|
+
createMessage(AgentMessageType.QUESTION, 'first question'),
|
|
2353
|
+
createMessage(AgentMessageType.ANSWER, 'first answer'),
|
|
2354
|
+
],
|
|
2355
|
+
});
|
|
2356
|
+
|
|
2357
|
+
renderConversation({ hideHeader: false, showPlaybackToggle: false });
|
|
2358
|
+
|
|
2359
|
+
expect(mocks.headerProps).toHaveBeenLastCalledWith(
|
|
2360
|
+
expect.objectContaining({
|
|
2361
|
+
showPlaybackButton: false,
|
|
2362
|
+
}),
|
|
2363
|
+
);
|
|
2364
|
+
});
|
|
2365
|
+
|
|
2366
|
+
it('filters transcript messages as conversation history updates', () => {
|
|
2367
|
+
const question = createMessage(AgentMessageType.QUESTION, 'Summarize the launch plan.');
|
|
2368
|
+
const internalUpdate = createMessage(AgentMessageType.UPDATE, 'Inspecting internal records.');
|
|
2369
|
+
const answer = createMessage(AgentMessageType.ANSWER, 'The launch plan is ready.');
|
|
2370
|
+
const messageFilter = (message: AgentMessage) => message.type !== AgentMessageType.UPDATE;
|
|
2371
|
+
|
|
2372
|
+
mockStreamState({ messages: [question, internalUpdate] });
|
|
2373
|
+
const view = renderConversation({ messageFilter });
|
|
2374
|
+
|
|
2375
|
+
expect(latestAllMessagesMixedProps()?.messages).toEqual([question]);
|
|
2376
|
+
expect(latestAllMessagesMixedProps()?.workstreamSourceMessages).toEqual([question]);
|
|
2377
|
+
|
|
2378
|
+
mockStreamState({ messages: [question, internalUpdate, answer] });
|
|
2379
|
+
view.rerender(
|
|
2380
|
+
<ModernAgentConversation
|
|
2381
|
+
agentRunId="agent-run-1"
|
|
2382
|
+
title="Agent"
|
|
2383
|
+
hideHeader
|
|
2384
|
+
hideMessageInput
|
|
2385
|
+
showRightPanel={false}
|
|
2386
|
+
messageFilter={messageFilter}
|
|
2387
|
+
/>,
|
|
2388
|
+
);
|
|
2389
|
+
|
|
2390
|
+
expect(latestAllMessagesMixedProps()?.messages).toEqual([question, answer]);
|
|
2391
|
+
expect(latestAllMessagesMixedProps()?.workstreamSourceMessages).toEqual([question, answer]);
|
|
2392
|
+
expect(document.querySelector('[data-agent-live-message-count="3"]')).not.toBeNull();
|
|
2393
|
+
expect(document.querySelector('[data-agent-rendered-message-count="2"]')).not.toBeNull();
|
|
2394
|
+
});
|
|
2395
|
+
|
|
2396
|
+
it('keeps pending request input actionable when its transcript row is filtered out', () => {
|
|
2397
|
+
const requestMessage = {
|
|
2398
|
+
...createMessage(AgentMessageType.REQUEST_INPUT, 'Choose a deployment region.'),
|
|
2399
|
+
details: {
|
|
2400
|
+
ux: {
|
|
2401
|
+
options: [
|
|
2402
|
+
{ id: 'us', label: 'United States' },
|
|
2403
|
+
{ id: 'eu', label: 'Europe' },
|
|
2404
|
+
],
|
|
2405
|
+
},
|
|
2406
|
+
},
|
|
2407
|
+
};
|
|
2408
|
+
mockStreamState({
|
|
2409
|
+
messages: [requestMessage],
|
|
2410
|
+
isCompleted: false,
|
|
2411
|
+
agentRunStatus: 'RUNNING',
|
|
2412
|
+
});
|
|
2413
|
+
|
|
2414
|
+
renderConversation({ messageFilter: () => false });
|
|
2415
|
+
|
|
2416
|
+
expect(latestAllMessagesMixedProps()?.messages).toEqual([]);
|
|
2417
|
+
expect(screen.getByText('Choose a deployment region.')).not.toBeNull();
|
|
2418
|
+
expect(screen.getByRole('button', { name: /Europe/ })).not.toBeNull();
|
|
2419
|
+
});
|
|
2420
|
+
|
|
2216
2421
|
it('keeps the replay fixture export action available while messages are empty', () => {
|
|
2217
2422
|
mockStreamState({
|
|
2218
2423
|
messages: [],
|
|
@@ -35,7 +35,7 @@ import {
|
|
|
35
35
|
AgentResourceResolverProvider,
|
|
36
36
|
isArtifactRefreshEvent,
|
|
37
37
|
} from '@vertesia/ui/widgets';
|
|
38
|
-
import { ArrowUpIcon, Bot, CheckCircle, Cpu, FileTextIcon, UploadIcon, XIcon } from 'lucide-react';
|
|
38
|
+
import { ArrowUpIcon, Bot, CheckCircle, ChevronDown, Cpu, FileTextIcon, UploadIcon, XIcon } from 'lucide-react';
|
|
39
39
|
import type React from 'react';
|
|
40
40
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
41
41
|
import { McpConnectionsActionMenu } from '../../oauth/McpConnectionsButton.js';
|
|
@@ -57,6 +57,7 @@ import type {
|
|
|
57
57
|
AgentInitialRequestTemplateContext,
|
|
58
58
|
} from './ModernAgentOutput/AllMessagesMixed';
|
|
59
59
|
import AllMessagesMixed from './ModernAgentOutput/AllMessagesMixed';
|
|
60
|
+
import { collectDeliveredArtifactRefs } from './ModernAgentOutput/AttachmentPreview';
|
|
60
61
|
import type { BatchProgressPanelClassNames } from './ModernAgentOutput/BatchProgressPanel';
|
|
61
62
|
import Header from './ModernAgentOutput/Header';
|
|
62
63
|
import MessageInput, {
|
|
@@ -65,7 +66,14 @@ import MessageInput, {
|
|
|
65
66
|
type UploadedFile,
|
|
66
67
|
} from './ModernAgentOutput/MessageInput';
|
|
67
68
|
import type { MessageItemClassNames } from './ModernAgentOutput/MessageItem';
|
|
68
|
-
import {
|
|
69
|
+
import {
|
|
70
|
+
clearRequestInputIdAnsweredForSession,
|
|
71
|
+
getPendingRequestInputMessage,
|
|
72
|
+
getRequestInputResolutionKey,
|
|
73
|
+
getRequestInputResponseIdFromMetadata,
|
|
74
|
+
isRequestInputAnsweredForSession,
|
|
75
|
+
markRequestInputIdAnsweredForSession,
|
|
76
|
+
} from './ModernAgentOutput/requestInputMessages';
|
|
69
77
|
import type { StreamingMessageClassNames } from './ModernAgentOutput/StreamingMessage';
|
|
70
78
|
import type { ToolCallGroupClassNames } from './ModernAgentOutput/ToolCallGroup';
|
|
71
79
|
import {
|
|
@@ -98,6 +106,9 @@ export interface StartWorkflowOptions {
|
|
|
98
106
|
tool_approval_mode?: AgentToolApprovalMode;
|
|
99
107
|
}
|
|
100
108
|
|
|
109
|
+
/** Controls whether a persisted message is included in the rendered conversation transcript. */
|
|
110
|
+
export type AgentMessageFilter = (message: AgentMessage) => boolean;
|
|
111
|
+
|
|
101
112
|
export type StartWorkflowFn = (
|
|
102
113
|
initialMessage?: string,
|
|
103
114
|
options?: StartWorkflowOptions,
|
|
@@ -106,6 +117,7 @@ export type StartWorkflowFn = (
|
|
|
106
117
|
export type SendAgentMessageFn = (message: string, inputMetadata?: Record<string, unknown>) => void;
|
|
107
118
|
|
|
108
119
|
const EMPTY_STREAMING_MESSAGES = new Map<string, never>();
|
|
120
|
+
const COLLAPSED_STAGED_FILE_COUNT = 3;
|
|
109
121
|
|
|
110
122
|
function getTimestampMs(timestamp: number | string | undefined): number {
|
|
111
123
|
if (typeof timestamp === 'number') return timestamp;
|
|
@@ -137,8 +149,13 @@ function toContextWindowUsage(messages: AgentMessage[]): ContextWindowUsage | un
|
|
|
137
149
|
const details = messages[index].details;
|
|
138
150
|
if (!details) continue;
|
|
139
151
|
|
|
140
|
-
const tokenUsage = details.token_usage as { total?: unknown } | undefined;
|
|
141
|
-
|
|
152
|
+
const tokenUsage = details.token_usage as { prompt?: unknown; total?: unknown } | undefined;
|
|
153
|
+
// Mirror the server's checkpoint trigger (getContextPressureTokens):
|
|
154
|
+
// the last call's prompt size is the actual context; `total` includes
|
|
155
|
+
// reasoning output that never re-enters context and would overstate
|
|
156
|
+
// pressure on reasoning models. Fall back to total when no breakdown.
|
|
157
|
+
const promptTokens = getNumberDetail(tokenUsage?.prompt);
|
|
158
|
+
const usedTokens = promptTokens && promptTokens > 0 ? promptTokens : getNumberDetail(tokenUsage?.total);
|
|
142
159
|
const checkpointTokens =
|
|
143
160
|
getNumberDetail(details.checkpoint_threshold) ?? getNumberDetail(details.checkpoint_at);
|
|
144
161
|
|
|
@@ -220,12 +237,21 @@ function isWorkstreamActivityFailureMessage(message: AgentMessage): boolean {
|
|
|
220
237
|
tool_event?: unknown;
|
|
221
238
|
tool_run_id?: unknown;
|
|
222
239
|
tool_status?: unknown;
|
|
240
|
+
workstream_id?: unknown;
|
|
223
241
|
workstream_event?: unknown;
|
|
224
242
|
}
|
|
225
243
|
| undefined;
|
|
226
244
|
|
|
227
245
|
if (details?.event_class !== 'activity') return false;
|
|
228
246
|
if (details.workstream_event) return false;
|
|
247
|
+
const workstreamId =
|
|
248
|
+
typeof message.workstream_id === 'string' && message.workstream_id.trim()
|
|
249
|
+
? message.workstream_id.trim()
|
|
250
|
+
: typeof details.workstream_id === 'string'
|
|
251
|
+
? details.workstream_id.trim()
|
|
252
|
+
: '';
|
|
253
|
+
const normalizedWorkstreamId = workstreamId.toLowerCase();
|
|
254
|
+
if (!workstreamId || normalizedWorkstreamId === 'main' || normalizedWorkstreamId === 'all') return false;
|
|
229
255
|
|
|
230
256
|
return !(
|
|
231
257
|
details.tool ||
|
|
@@ -648,6 +674,11 @@ export interface ModernAgentConversationProps {
|
|
|
648
674
|
hideDocumentPanel?: boolean;
|
|
649
675
|
/** Message types to exclude from the conversation view */
|
|
650
676
|
hiddenMessageTypes?: AgentMessageType[];
|
|
677
|
+
/**
|
|
678
|
+
* Optional presentation-only predicate for transcript messages. Returning false hides the message without
|
|
679
|
+
* changing the underlying conversation stream, workflow state, plans, or pending input.
|
|
680
|
+
*/
|
|
681
|
+
messageFilter?: AgentMessageFilter;
|
|
651
682
|
|
|
652
683
|
// Callback to get attached documents when sending messages
|
|
653
684
|
// Returns array of { id, name } to include in message metadata and display
|
|
@@ -727,7 +758,7 @@ export interface ModernAgentConversationProps {
|
|
|
727
758
|
initialToolApprovalMode?: AgentToolApprovalMode;
|
|
728
759
|
/** Force display playback controls on or off. When omitted, local playback can be toggled from the header. */
|
|
729
760
|
enablePlayback?: boolean;
|
|
730
|
-
/** Show
|
|
761
|
+
/** Show the Debug button for local playback controls. Defaults to true; set to false to hide it. */
|
|
731
762
|
showPlaybackToggle?: boolean;
|
|
732
763
|
}
|
|
733
764
|
|
|
@@ -817,6 +848,9 @@ function StartWorkflowView({
|
|
|
817
848
|
|
|
818
849
|
// Staged files - stored locally until workflow starts
|
|
819
850
|
const [stagedFiles, setStagedFiles] = useState<File[]>([]);
|
|
851
|
+
const [areStagedFilesExpanded, setAreStagedFilesExpanded] = useState(false);
|
|
852
|
+
const visibleStagedFiles = areStagedFilesExpanded ? stagedFiles : stagedFiles.slice(0, COLLAPSED_STAGED_FILE_COUNT);
|
|
853
|
+
const hiddenStagedFileCount = stagedFiles.length - COLLAPSED_STAGED_FILE_COUNT;
|
|
820
854
|
|
|
821
855
|
useEffect(() => {
|
|
822
856
|
onAgentWorkingChange?.(isSending);
|
|
@@ -914,6 +948,12 @@ function StartWorkflowView({
|
|
|
914
948
|
setStagedFiles((prev) => prev.filter((_, i) => i !== index));
|
|
915
949
|
}, []);
|
|
916
950
|
|
|
951
|
+
useEffect(() => {
|
|
952
|
+
if (stagedFiles.length <= COLLAPSED_STAGED_FILE_COUNT) {
|
|
953
|
+
setAreStagedFilesExpanded(false);
|
|
954
|
+
}
|
|
955
|
+
}, [stagedFiles.length]);
|
|
956
|
+
|
|
917
957
|
useEffect(() => {
|
|
918
958
|
// Focus the input field when component mounts
|
|
919
959
|
if (inputRef.current) {
|
|
@@ -1208,7 +1248,7 @@ function StartWorkflowView({
|
|
|
1208
1248
|
{/* Staged files display */}
|
|
1209
1249
|
{canStageFiles && stagedFiles.length > 0 && (
|
|
1210
1250
|
<div className="flex flex-wrap gap-2">
|
|
1211
|
-
{
|
|
1251
|
+
{visibleStagedFiles.map((file, index) => (
|
|
1212
1252
|
<div
|
|
1213
1253
|
key={`${file.name}-${file.size}-${file.lastModified}`}
|
|
1214
1254
|
className="flex items-center gap-1.5 rounded-md bg-attention/10 px-2 py-1 text-sm text-attention"
|
|
@@ -1227,6 +1267,26 @@ function StartWorkflowView({
|
|
|
1227
1267
|
</Button>
|
|
1228
1268
|
</div>
|
|
1229
1269
|
))}
|
|
1270
|
+
{stagedFiles.length > COLLAPSED_STAGED_FILE_COUNT && (
|
|
1271
|
+
<Button
|
|
1272
|
+
type="button"
|
|
1273
|
+
variant="ghost"
|
|
1274
|
+
size="sm"
|
|
1275
|
+
aria-expanded={areStagedFilesExpanded}
|
|
1276
|
+
onClick={() => setAreStagedFilesExpanded((expanded) => !expanded)}
|
|
1277
|
+
className="h-8 shrink-0 gap-1 rounded-xl px-2.5 text-xs text-muted"
|
|
1278
|
+
>
|
|
1279
|
+
{!areStagedFilesExpanded && <span>+{hiddenStagedFileCount}</span>}
|
|
1280
|
+
{areStagedFilesExpanded ? t('agent.showLess') : t('agent.showMore')}
|
|
1281
|
+
<ChevronDown
|
|
1282
|
+
className={cn(
|
|
1283
|
+
'size-3.5 transition-transform',
|
|
1284
|
+
areStagedFilesExpanded && 'rotate-180',
|
|
1285
|
+
)}
|
|
1286
|
+
aria-hidden="true"
|
|
1287
|
+
/>
|
|
1288
|
+
</Button>
|
|
1289
|
+
)}
|
|
1230
1290
|
</div>
|
|
1231
1291
|
)}
|
|
1232
1292
|
|
|
@@ -1392,6 +1452,7 @@ function ModernAgentConversationInner({
|
|
|
1392
1452
|
initialToolApprovalMode,
|
|
1393
1453
|
enablePlayback,
|
|
1394
1454
|
showPlaybackToggle = true,
|
|
1455
|
+
messageFilter,
|
|
1395
1456
|
}: ModernAgentConversationProps & { agentRunId: string }) {
|
|
1396
1457
|
const { t } = useUITranslation();
|
|
1397
1458
|
const { client } = useUserSession();
|
|
@@ -1436,8 +1497,9 @@ function ModernAgentConversationInner({
|
|
|
1436
1497
|
updateDocumentTitle,
|
|
1437
1498
|
} = useDocumentPanel(messages);
|
|
1438
1499
|
|
|
1500
|
+
const deliveredArtifactRefs = useMemo(() => collectDeliveredArtifactRefs(messages), [messages]);
|
|
1439
1501
|
const { processingFiles, hasProcessingFiles, handleFileUpload, removeProcessingFile, clearProcessingFiles } =
|
|
1440
|
-
useFileProcessing(client, agentRunId, serverFileUpdates, toast);
|
|
1502
|
+
useFileProcessing(client, agentRunId, serverFileUpdates, toast, deliveredArtifactRefs);
|
|
1441
1503
|
const canUploadFiles = interactive && !hideFileUpload;
|
|
1442
1504
|
|
|
1443
1505
|
const handleRemoveProcessingFile = useCallback(
|
|
@@ -1549,6 +1611,16 @@ function ModernAgentConversationInner({
|
|
|
1549
1611
|
() => effectiveWorkflowStatus?.toUpperCase() === 'FAILED' || agentRunStatus?.toUpperCase() === 'FAILED',
|
|
1550
1612
|
[effectiveWorkflowStatus, agentRunStatus],
|
|
1551
1613
|
);
|
|
1614
|
+
const workflowFailureReason = useMemo(() => {
|
|
1615
|
+
for (let index = messages.length - 1; index >= 0; index--) {
|
|
1616
|
+
const message = messages[index];
|
|
1617
|
+
if (message.type !== AgentMessageType.ERROR) continue;
|
|
1618
|
+
if (getWorkstreamId(message) !== 'main') continue;
|
|
1619
|
+
const text = typeof message.message === 'string' ? message.message.trim() : '';
|
|
1620
|
+
if (text) return text;
|
|
1621
|
+
}
|
|
1622
|
+
return undefined;
|
|
1623
|
+
}, [messages]);
|
|
1552
1624
|
|
|
1553
1625
|
// Read inside handleSendMessage (a stable callback) without widening its deps.
|
|
1554
1626
|
const isWorkflowTerminalRef = useRef(isWorkflowTerminal);
|
|
@@ -1621,13 +1693,16 @@ function ModernAgentConversationInner({
|
|
|
1621
1693
|
|
|
1622
1694
|
const canShowPlaybackToggle = showPlaybackToggle && enablePlayback === undefined && isAgentChatPlaybackAvailable();
|
|
1623
1695
|
const isPlaybackEnabled = enablePlayback ?? (isAgentChatPlaybackEnabled() || isPlaybackToggleEnabled);
|
|
1624
|
-
const
|
|
1696
|
+
const transcriptSourceMessages = useMemo(() => {
|
|
1625
1697
|
// Passive artifact autosaves are surfaced by the editor's own save indicator, not the chat.
|
|
1626
|
-
|
|
1698
|
+
return messages.filter(
|
|
1627
1699
|
(message) => !isPassiveArtifactUpdate(message) && !(hiddenMessageTypes?.includes(message.type) ?? false),
|
|
1628
1700
|
);
|
|
1629
|
-
|
|
1630
|
-
|
|
1701
|
+
}, [hiddenMessageTypes, messages]);
|
|
1702
|
+
const playbackSourceMessages = useMemo(
|
|
1703
|
+
() => filterMessagesForActiveWorkstream(transcriptSourceMessages, activeWorkstream),
|
|
1704
|
+
[activeWorkstream, transcriptSourceMessages],
|
|
1705
|
+
);
|
|
1631
1706
|
const playbackState = useMemo(
|
|
1632
1707
|
() => createPlaybackState(playbackSourceMessages, playbackCursor, isPlaybackEnabled),
|
|
1633
1708
|
[isPlaybackEnabled, playbackCursor, playbackSourceMessages],
|
|
@@ -1637,6 +1712,17 @@ function ModernAgentConversationInner({
|
|
|
1637
1712
|
const isPlaybackAtLatest =
|
|
1638
1713
|
isPlaybackEnabled && !isPlaybackLive && playbackState.cursorIndex === playbackSourceMessages.length - 1;
|
|
1639
1714
|
const displayedMessages = playbackState.displayedMessages;
|
|
1715
|
+
const renderedMessages = useMemo(
|
|
1716
|
+
() => (messageFilter ? displayedMessages.filter((message) => messageFilter(message)) : displayedMessages),
|
|
1717
|
+
[displayedMessages, messageFilter],
|
|
1718
|
+
);
|
|
1719
|
+
const renderedWorkstreamSourceMessages = useMemo(
|
|
1720
|
+
() =>
|
|
1721
|
+
messageFilter
|
|
1722
|
+
? transcriptSourceMessages.filter((message) => messageFilter(message))
|
|
1723
|
+
: transcriptSourceMessages,
|
|
1724
|
+
[messageFilter, transcriptSourceMessages],
|
|
1725
|
+
);
|
|
1640
1726
|
const displayedStreamingMessages = isPlaybackLive ? streamingMessages : EMPTY_STREAMING_MESSAGES;
|
|
1641
1727
|
const playbackDerivedWorkstreams = useMemo(
|
|
1642
1728
|
() => deriveWorkstreamsFromMessages(displayedMessages),
|
|
@@ -1653,10 +1739,15 @@ function ModernAgentConversationInner({
|
|
|
1653
1739
|
useEffect(() => {
|
|
1654
1740
|
onAgentWorkingChange?.(isAgentWorking);
|
|
1655
1741
|
}, [isAgentWorking, onAgentWorkingChange]);
|
|
1656
|
-
const pendingRequestInputMessage = useMemo(
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1742
|
+
const pendingRequestInputMessage = useMemo(() => {
|
|
1743
|
+
const answeredRequestInputKeys = new Set<string>();
|
|
1744
|
+
for (const message of displayedMessages) {
|
|
1745
|
+
if (isRequestInputAnsweredForSession(agentRunId, message)) {
|
|
1746
|
+
answeredRequestInputKeys.add(getRequestInputResolutionKey(message));
|
|
1747
|
+
}
|
|
1748
|
+
}
|
|
1749
|
+
return getPendingRequestInputMessage(displayedMessages, 'main', answeredRequestInputKeys);
|
|
1750
|
+
}, [agentRunId, displayedMessages]);
|
|
1660
1751
|
// A terminal run silently drops user input unless it can be continued (see the guard in
|
|
1661
1752
|
// handleSendMessage), so never surface an actionable question overlay in that state —
|
|
1662
1753
|
// the terminal status box renders instead.
|
|
@@ -1675,7 +1766,7 @@ function ModernAgentConversationInner({
|
|
|
1675
1766
|
agentRunId,
|
|
1676
1767
|
messageCount: messages.length,
|
|
1677
1768
|
playbackMessageCount: playbackSourceMessages.length,
|
|
1678
|
-
displayedMessageCount:
|
|
1769
|
+
displayedMessageCount: renderedMessages.length,
|
|
1679
1770
|
streamingCount: streamingMessages.size,
|
|
1680
1771
|
displayedStreamingCount: displayedStreamingMessages.size,
|
|
1681
1772
|
initialHistoryStatus,
|
|
@@ -1699,7 +1790,7 @@ function ModernAgentConversationInner({
|
|
|
1699
1790
|
agentRunStatus,
|
|
1700
1791
|
clampedPlaybackCursor,
|
|
1701
1792
|
displayedIsCompleted,
|
|
1702
|
-
|
|
1793
|
+
renderedMessages.length,
|
|
1703
1794
|
displayedStreamingMessages.size,
|
|
1704
1795
|
effectiveIsCompleted,
|
|
1705
1796
|
effectiveWorkflowStatus,
|
|
@@ -2078,6 +2169,7 @@ function ModernAgentConversationInner({
|
|
|
2078
2169
|
return;
|
|
2079
2170
|
}
|
|
2080
2171
|
|
|
2172
|
+
const requestInputId = getRequestInputResponseIdFromMetadata(inputMetadata);
|
|
2081
2173
|
setIsSending(true);
|
|
2082
2174
|
|
|
2083
2175
|
const attachedDocs = getAttachedDocs?.() || [];
|
|
@@ -2120,6 +2212,9 @@ function ModernAgentConversationInner({
|
|
|
2120
2212
|
_messageId: messageId,
|
|
2121
2213
|
_deliveryStatus: 'sending',
|
|
2122
2214
|
...(inputMetadata?.editing_action ? { editing_action: inputMetadata.editing_action } : {}),
|
|
2215
|
+
...(inputMetadata?.request_input_response
|
|
2216
|
+
? { request_input_response: inputMetadata.request_input_response }
|
|
2217
|
+
: {}),
|
|
2123
2218
|
},
|
|
2124
2219
|
};
|
|
2125
2220
|
|
|
@@ -2151,6 +2246,9 @@ function ModernAgentConversationInner({
|
|
|
2151
2246
|
// buffers the signal until the new run is ready to receive it. We reconnect
|
|
2152
2247
|
// the stream in place (rather than remounting via onRestart) so the existing
|
|
2153
2248
|
// timeline is preserved and the new exchange appends seamlessly at the bottom.
|
|
2249
|
+
if (requestInputId) {
|
|
2250
|
+
markRequestInputIdAnsweredForSession(agentRunId, requestInputId);
|
|
2251
|
+
}
|
|
2154
2252
|
const deliver = (async () => {
|
|
2155
2253
|
await waitForPendingToolApprovalModeChange();
|
|
2156
2254
|
if (isWorkflowTerminalRef.current) {
|
|
@@ -2163,6 +2261,9 @@ function ModernAgentConversationInner({
|
|
|
2163
2261
|
|
|
2164
2262
|
deliver
|
|
2165
2263
|
.catch((err) => {
|
|
2264
|
+
if (requestInputId) {
|
|
2265
|
+
clearRequestInputIdAnsweredForSession(agentRunId, requestInputId);
|
|
2266
|
+
}
|
|
2166
2267
|
updateOptimisticMessageStatus(messageId, 'failed');
|
|
2167
2268
|
toast({
|
|
2168
2269
|
status: 'error',
|
|
@@ -2202,7 +2303,7 @@ function ModernAgentConversationInner({
|
|
|
2202
2303
|
// conversation for tool re-discovery and resume it with a confirmation message so the agent
|
|
2203
2304
|
// continues automatically with the newly-available tools.
|
|
2204
2305
|
const handleMcpConnected = useCallback(
|
|
2205
|
-
async (cfg: McpConnectUxConfig) => {
|
|
2306
|
+
async (cfg: McpConnectUxConfig, metadata?: Record<string, unknown>) => {
|
|
2206
2307
|
// Await the dirty-flag signal BEFORE sending the follow-up message so Temporal records
|
|
2207
2308
|
// McpConfigChanged ahead of the UserInput. Otherwise the resume turn could run before
|
|
2208
2309
|
// the flag is set and use the stale tool catalog. An omitted disabled list preserves
|
|
@@ -2212,7 +2313,7 @@ function ModernAgentConversationInner({
|
|
|
2212
2313
|
} catch (err: unknown) {
|
|
2213
2314
|
console.error('Failed to signal MCP config change', err);
|
|
2214
2315
|
}
|
|
2215
|
-
handleSendMessage(t('agent.mcpConnectedMessage', { name: cfg.name }));
|
|
2316
|
+
handleSendMessage(t('agent.mcpConnectedMessage', { name: cfg.name }), metadata);
|
|
2216
2317
|
},
|
|
2217
2318
|
[client, agentRunId, handleSendMessage, t],
|
|
2218
2319
|
);
|
|
@@ -2594,7 +2695,7 @@ function ModernAgentConversationInner({
|
|
|
2594
2695
|
data-agent-playback-enabled={isPlaybackEnabled || undefined}
|
|
2595
2696
|
data-agent-playback-cursor={isPlaybackEnabled ? clampedPlaybackCursor : undefined}
|
|
2596
2697
|
data-agent-live-message-count={messages.length}
|
|
2597
|
-
data-agent-rendered-message-count={
|
|
2698
|
+
data-agent-rendered-message-count={renderedMessages.length}
|
|
2598
2699
|
className={cn(
|
|
2599
2700
|
'flex flex-col min-h-0 min-w-0 border-0',
|
|
2600
2701
|
conversationTab
|
|
@@ -2629,8 +2730,8 @@ function ModernAgentConversationInner({
|
|
|
2629
2730
|
<PendingStartConversation message={pendingStartMessage} startedAt={pendingStartTimestamp} />
|
|
2630
2731
|
) : (
|
|
2631
2732
|
<AllMessagesMixed
|
|
2632
|
-
messages={
|
|
2633
|
-
workstreamSourceMessages={
|
|
2733
|
+
messages={renderedMessages}
|
|
2734
|
+
workstreamSourceMessages={renderedWorkstreamSourceMessages}
|
|
2634
2735
|
bottomRef={bottomRef as React.RefObject<HTMLDivElement>}
|
|
2635
2736
|
isCompleted={displayedIsCompleted}
|
|
2636
2737
|
plan={getActivePlan.plan}
|
|
@@ -2681,7 +2782,10 @@ function ModernAgentConversationInner({
|
|
|
2681
2782
|
/>
|
|
2682
2783
|
) : isViewingPlaybackHistory && playbackActiveWorkstreams.length > 0 ? (
|
|
2683
2784
|
<div className="flex-shrink-0 pb-safe-area">
|
|
2684
|
-
<ActiveWorkstreamsSummary
|
|
2785
|
+
<ActiveWorkstreamsSummary
|
|
2786
|
+
activeWorkstreams={playbackActiveWorkstreams}
|
|
2787
|
+
onSelectWorkstream={setActiveWorkstream}
|
|
2788
|
+
/>
|
|
2685
2789
|
</div>
|
|
2686
2790
|
) : (
|
|
2687
2791
|
shouldRenderLiveMessageInputArea && (
|
|
@@ -2691,8 +2795,8 @@ function ModernAgentConversationInner({
|
|
|
2691
2795
|
// never render for a failed run. Use the caller's action when provided,
|
|
2692
2796
|
// otherwise fall back to the default failed message box.
|
|
2693
2797
|
(failedAction ?? (
|
|
2694
|
-
<MessageBox status="error"
|
|
2695
|
-
|
|
2798
|
+
<MessageBox status="error" title={t('agent.failed')} className="m-2">
|
|
2799
|
+
{workflowFailureReason ?? t('agent.error')}
|
|
2696
2800
|
</MessageBox>
|
|
2697
2801
|
))
|
|
2698
2802
|
) : effectiveWorkflowStatus &&
|
|
@@ -2749,6 +2853,7 @@ function ModernAgentConversationInner({
|
|
|
2749
2853
|
isCompactingContext={isCompactingContext}
|
|
2750
2854
|
activeTaskCount={activeTaskCount}
|
|
2751
2855
|
activeWorkstreams={composerActiveWorkstreams}
|
|
2856
|
+
onSelectWorkstream={setActiveWorkstream}
|
|
2752
2857
|
placeholder={composerPlaceholder}
|
|
2753
2858
|
onFilesSelected={canUploadFiles ? handleFileUpload : undefined}
|
|
2754
2859
|
uploadedFiles={uploadedFiles}
|