@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
|
@@ -66,6 +66,7 @@ interface MessageInputProps {
|
|
|
66
66
|
isCompactingContext?: boolean;
|
|
67
67
|
activeTaskCount?: number;
|
|
68
68
|
activeWorkstreams?: WorkstreamInfo[];
|
|
69
|
+
onSelectWorkstream?: (workstreamId: string) => void;
|
|
69
70
|
placeholder?: string;
|
|
70
71
|
|
|
71
72
|
// File upload props
|
|
@@ -133,6 +134,7 @@ export default function MessageInput({
|
|
|
133
134
|
isCompactingContext = false,
|
|
134
135
|
activeTaskCount = 0,
|
|
135
136
|
activeWorkstreams = [],
|
|
137
|
+
onSelectWorkstream,
|
|
136
138
|
placeholder,
|
|
137
139
|
// File upload props
|
|
138
140
|
onFilesSelected,
|
|
@@ -474,7 +476,7 @@ export default function MessageInput({
|
|
|
474
476
|
/>
|
|
475
477
|
)}
|
|
476
478
|
|
|
477
|
-
<ActiveWorkstreamsSummary activeWorkstreams={activeWorkstreams} />
|
|
479
|
+
<ActiveWorkstreamsSummary activeWorkstreams={activeWorkstreams} onSelectWorkstream={onSelectWorkstream} />
|
|
478
480
|
|
|
479
481
|
{/* Input row */}
|
|
480
482
|
<div className="mx-auto flex max-w-3xl flex-col gap-2 rounded-2xl border border-border/70 bg-mixer-muted/15 p-2.5 shadow-lg shadow-black/5">
|
|
@@ -37,7 +37,7 @@ import { createAgentMarkdownAnchor } from './AgentMarkdownAnchor';
|
|
|
37
37
|
import { AttachmentPreviewList, parseUserMessageAttachments } from './AttachmentPreview';
|
|
38
38
|
import { MessageDeliveryStatus } from './MessageDeliveryStatus';
|
|
39
39
|
import { processContentForMarkdown } from './processContentForMarkdown';
|
|
40
|
-
import { getToolApprovalResponseMetadata } from './requestInputMessages';
|
|
40
|
+
import { getToolApprovalResponseMetadata, sendRequestInputResponse } from './requestInputMessages';
|
|
41
41
|
import { getWorkstreamId } from './utils';
|
|
42
42
|
|
|
43
43
|
/** className overrides for MessageItem — single source of truth for all className overrides. */
|
|
@@ -625,13 +625,27 @@ function MessageItemComponent({
|
|
|
625
625
|
variant={askUserUx.variant}
|
|
626
626
|
multiSelect={askUserUx.multiSelect}
|
|
627
627
|
onSelect={(optionId) =>
|
|
628
|
-
|
|
628
|
+
sendRequestInputResponse(
|
|
629
|
+
onSendMessage,
|
|
630
|
+
message,
|
|
631
|
+
optionId,
|
|
632
|
+
getToolApprovalResponseMetadata(message, optionId),
|
|
633
|
+
)
|
|
634
|
+
}
|
|
635
|
+
onMultiSelect={(optionIds) =>
|
|
636
|
+
sendRequestInputResponse(onSendMessage, message, optionIds.join(', '))
|
|
629
637
|
}
|
|
630
|
-
onMultiSelect={(optionIds) => onSendMessage?.(optionIds.join(', '))}
|
|
631
638
|
allowFreeResponse={!askUserUx.options?.length || !!askUserUx.free_response}
|
|
632
639
|
placeholder={askUserUx.free_response?.placeholder}
|
|
633
640
|
submitLabel={askUserUx.free_response?.submit_label}
|
|
634
|
-
onSubmit={(value) =>
|
|
641
|
+
onSubmit={(value) =>
|
|
642
|
+
sendRequestInputResponse(
|
|
643
|
+
onSendMessage,
|
|
644
|
+
message,
|
|
645
|
+
value,
|
|
646
|
+
askUserUx.free_response?.metadata,
|
|
647
|
+
)
|
|
648
|
+
}
|
|
635
649
|
hideBorder
|
|
636
650
|
compact
|
|
637
651
|
answered={requestInputAnswered}
|
|
@@ -181,12 +181,21 @@ function isWorkstreamActivityFailureMessage(message: AgentMessage): boolean {
|
|
|
181
181
|
tool_event?: unknown;
|
|
182
182
|
tool_run_id?: unknown;
|
|
183
183
|
tool_status?: unknown;
|
|
184
|
+
workstream_id?: unknown;
|
|
184
185
|
workstream_event?: unknown;
|
|
185
186
|
}
|
|
186
187
|
| undefined;
|
|
187
188
|
|
|
188
189
|
if (details?.event_class !== 'activity') return false;
|
|
189
190
|
if (details.workstream_event) return false;
|
|
191
|
+
const workstreamId =
|
|
192
|
+
typeof message.workstream_id === 'string' && message.workstream_id.trim()
|
|
193
|
+
? message.workstream_id.trim()
|
|
194
|
+
: typeof details.workstream_id === 'string'
|
|
195
|
+
? details.workstream_id.trim()
|
|
196
|
+
: '';
|
|
197
|
+
const normalizedWorkstreamId = workstreamId.toLowerCase();
|
|
198
|
+
if (!workstreamId || normalizedWorkstreamId === 'main' || normalizedWorkstreamId === 'all') return false;
|
|
190
199
|
|
|
191
200
|
return !(
|
|
192
201
|
details.tool ||
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import { type AgentMessage, AgentMessageType } from '@vertesia/common';
|
|
2
2
|
import { describe, expect, it } from 'vitest';
|
|
3
3
|
import {
|
|
4
|
+
clearRequestInputIdAnsweredForSession,
|
|
5
|
+
getAnsweredRequestInputKeys,
|
|
4
6
|
getAnsweredToolApprovalRequestInputKeys,
|
|
7
|
+
getPendingRequestInputMessage,
|
|
5
8
|
getRequestInputMessageKey,
|
|
9
|
+
getRequestInputResponseIdFromMetadata,
|
|
10
|
+
getRequestInputResponseMetadata,
|
|
6
11
|
getToolApprovalResponseMetadata,
|
|
12
|
+
isRequestInputAnsweredForSession,
|
|
13
|
+
markRequestInputIdAnsweredForSession,
|
|
7
14
|
} from './requestInputMessages';
|
|
8
15
|
|
|
9
16
|
const APPROVAL_KEY = 'create_interaction:name:JDE AR Payment Processing Agent';
|
|
@@ -78,3 +85,91 @@ describe('getAnsweredToolApprovalRequestInputKeys', () => {
|
|
|
78
85
|
expect(answered.size).toBe(0);
|
|
79
86
|
});
|
|
80
87
|
});
|
|
88
|
+
|
|
89
|
+
describe('request input correlation', () => {
|
|
90
|
+
it('does not apply session acknowledgement to non-request-input messages with the same id', () => {
|
|
91
|
+
const agentRunId = 'agent-run-1';
|
|
92
|
+
const requestId = 'request-1';
|
|
93
|
+
const request = {
|
|
94
|
+
...makeApprovalRequest(),
|
|
95
|
+
details: { request_id: requestId, ux: { options: [{ id: 'allow_once' }] } },
|
|
96
|
+
};
|
|
97
|
+
const unrelatedMessage = {
|
|
98
|
+
...makeUserAnswer('Still working'),
|
|
99
|
+
details: { request_id: requestId },
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
markRequestInputIdAnsweredForSession(agentRunId, requestId);
|
|
103
|
+
|
|
104
|
+
expect(isRequestInputAnsweredForSession(agentRunId, request)).toBe(true);
|
|
105
|
+
expect(isRequestInputAnsweredForSession(agentRunId, unrelatedMessage)).toBe(false);
|
|
106
|
+
|
|
107
|
+
clearRequestInputIdAnsweredForSession(agentRunId, requestId);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it('correlates a persisted response to the matching request id', () => {
|
|
111
|
+
const firstRequest = {
|
|
112
|
+
...makeApprovalRequest(),
|
|
113
|
+
details: { request_id: 'request-1', ux: { options: [{ id: 'red', label: 'Red' }] } },
|
|
114
|
+
};
|
|
115
|
+
const secondRequest = {
|
|
116
|
+
...makeApprovalRequest(),
|
|
117
|
+
timestamp: 2,
|
|
118
|
+
details: { request_id: 'request-2', ux: { options: [{ id: 'blue', label: 'Blue' }] } },
|
|
119
|
+
};
|
|
120
|
+
const answer = {
|
|
121
|
+
...makeUserAnswer('red'),
|
|
122
|
+
timestamp: 3,
|
|
123
|
+
details: { request_input_response: { request_id: 'request-1' } },
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
const answered = getAnsweredRequestInputKeys([firstRequest, secondRequest, answer]);
|
|
127
|
+
|
|
128
|
+
expect(answered.has(getRequestInputMessageKey(firstRequest))).toBe(true);
|
|
129
|
+
expect(answered.has(getRequestInputMessageKey(secondRequest))).toBe(false);
|
|
130
|
+
expect(getPendingRequestInputMessage([firstRequest, secondRequest, answer])).toBe(secondRequest);
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it('adds the request id without discarding existing response metadata', () => {
|
|
134
|
+
const request = {
|
|
135
|
+
...makeApprovalRequest(),
|
|
136
|
+
details: { request_id: 'request-1', ux: { options: [{ id: 'red', label: 'Red' }] } },
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
expect(getRequestInputResponseMetadata(request, { source: 'free-response' })).toEqual({
|
|
140
|
+
source: 'free-response',
|
|
141
|
+
request_input_response: { request_id: 'request-1' },
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it('does not let an earlier response resolve a later prompt that reused its request id', () => {
|
|
146
|
+
const firstRequest = {
|
|
147
|
+
...makeApprovalRequest(),
|
|
148
|
+
details: { request_id: 'reused-request', ux: { options: [{ id: 'allow_once' }] } },
|
|
149
|
+
};
|
|
150
|
+
const firstAnswer = {
|
|
151
|
+
...makeUserAnswer('allow_once'),
|
|
152
|
+
details: { request_input_response: { request_id: 'reused-request' } },
|
|
153
|
+
};
|
|
154
|
+
const secondRequest = {
|
|
155
|
+
...makeApprovalRequest(),
|
|
156
|
+
timestamp: 3,
|
|
157
|
+
details: { request_id: 'reused-request', ux: { options: [{ id: 'allow_once' }] } },
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
const answered = getAnsweredRequestInputKeys([firstRequest, firstAnswer, secondRequest]);
|
|
161
|
+
|
|
162
|
+
expect(answered.has(getRequestInputMessageKey(firstRequest))).toBe(true);
|
|
163
|
+
expect(answered.has(getRequestInputMessageKey(secondRequest))).toBe(false);
|
|
164
|
+
expect(getPendingRequestInputMessage([firstRequest, firstAnswer, secondRequest])).toBe(secondRequest);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
it('reads a request id from response metadata', () => {
|
|
168
|
+
expect(
|
|
169
|
+
getRequestInputResponseIdFromMetadata({
|
|
170
|
+
request_input_response: { request_id: 'request-1' },
|
|
171
|
+
}),
|
|
172
|
+
).toBe('request-1');
|
|
173
|
+
expect(getRequestInputResponseIdFromMetadata({ request_input_response: {} })).toBeUndefined();
|
|
174
|
+
});
|
|
175
|
+
});
|
|
@@ -96,6 +96,65 @@ export function getRequestInputMessageKey(message: AgentMessage): string {
|
|
|
96
96
|
.join('|');
|
|
97
97
|
}
|
|
98
98
|
|
|
99
|
+
export function getRequestInputId(message: AgentMessage): string | undefined {
|
|
100
|
+
const details = message.details as Record<string, unknown> | undefined;
|
|
101
|
+
const requestId = details?.request_id ?? details?.tool_use_id;
|
|
102
|
+
return typeof requestId === 'string' && requestId ? requestId : undefined;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export function getRequestInputResolutionKey(message: AgentMessage): string {
|
|
106
|
+
return getRequestInputId(message) ?? getRequestInputMessageKey(message);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const ANSWERED_REQUEST_INPUT_STORAGE_PREFIX = 'vertesia:answered-request-input:';
|
|
110
|
+
|
|
111
|
+
function getAnsweredRequestInputStorageKey(agentRunId: string, requestId: string): string {
|
|
112
|
+
return `${ANSWERED_REQUEST_INPUT_STORAGE_PREFIX}${agentRunId}:${requestId}`;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export function markRequestInputIdAnsweredForSession(agentRunId: string, requestId: string): void {
|
|
116
|
+
if (typeof window === 'undefined') return;
|
|
117
|
+
|
|
118
|
+
try {
|
|
119
|
+
window.sessionStorage.setItem(getAnsweredRequestInputStorageKey(agentRunId, requestId), '1');
|
|
120
|
+
} catch {
|
|
121
|
+
// Session storage can be unavailable in privacy-restricted browser contexts.
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export function clearRequestInputIdAnsweredForSession(agentRunId: string, requestId: string): void {
|
|
126
|
+
if (typeof window === 'undefined') return;
|
|
127
|
+
|
|
128
|
+
try {
|
|
129
|
+
window.sessionStorage.removeItem(getAnsweredRequestInputStorageKey(agentRunId, requestId));
|
|
130
|
+
} catch {
|
|
131
|
+
// Session storage can be unavailable in privacy-restricted browser contexts.
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export function isRequestInputAnsweredForSession(agentRunId: string, message: AgentMessage): boolean {
|
|
136
|
+
if (message.type !== AgentMessageType.REQUEST_INPUT) return false;
|
|
137
|
+
|
|
138
|
+
const requestId = getRequestInputId(message);
|
|
139
|
+
if (!requestId || typeof window === 'undefined') return false;
|
|
140
|
+
|
|
141
|
+
try {
|
|
142
|
+
return window.sessionStorage.getItem(getAnsweredRequestInputStorageKey(agentRunId, requestId)) === '1';
|
|
143
|
+
} catch {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function getRequestInputResponseId(message: AgentMessage): string | undefined {
|
|
149
|
+
if (message.type !== AgentMessageType.QUESTION) return undefined;
|
|
150
|
+
|
|
151
|
+
const details = getRecord(message.details);
|
|
152
|
+
const metadata = getRecord(details?.metadata);
|
|
153
|
+
const response = getRecord(details?.request_input_response) ?? getRecord(metadata?.request_input_response);
|
|
154
|
+
const requestId = response?.request_id;
|
|
155
|
+
return typeof requestId === 'string' && requestId ? requestId : undefined;
|
|
156
|
+
}
|
|
157
|
+
|
|
99
158
|
export function getRequestInputAnswerMessageKey(message: AgentMessage): string {
|
|
100
159
|
const details = message.details as Record<string, unknown> | undefined;
|
|
101
160
|
const keyParts = [
|
|
@@ -114,10 +173,22 @@ export function getRequestInputAnswerMessageKey(message: AgentMessage): string {
|
|
|
114
173
|
|
|
115
174
|
export function getAnsweredRequestInputKeys(messages: AgentMessage[]): Set<string> {
|
|
116
175
|
const answered = new Set<string>();
|
|
176
|
+
const latestResponseIndexByRequestId = new Map<string, number>();
|
|
177
|
+
messages.forEach((message, index) => {
|
|
178
|
+
const requestId = getRequestInputResponseId(message);
|
|
179
|
+
if (requestId) latestResponseIndexByRequestId.set(requestId, index);
|
|
180
|
+
});
|
|
117
181
|
|
|
118
182
|
messages.forEach((message, index) => {
|
|
119
183
|
if (message.type !== AgentMessageType.REQUEST_INPUT) return;
|
|
120
184
|
|
|
185
|
+
const requestId = getRequestInputId(message);
|
|
186
|
+
const correlatedResponseIndex = requestId ? latestResponseIndexByRequestId.get(requestId) : undefined;
|
|
187
|
+
if (correlatedResponseIndex !== undefined && correlatedResponseIndex > index) {
|
|
188
|
+
answered.add(getRequestInputMessageKey(message));
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
|
|
121
192
|
const workstreamId = getWorkstreamId(message);
|
|
122
193
|
for (let nextIndex = index + 1; nextIndex < messages.length; nextIndex += 1) {
|
|
123
194
|
const nextMessage = messages[nextIndex];
|
|
@@ -125,7 +196,9 @@ export function getAnsweredRequestInputKeys(messages: AgentMessage[]): Set<strin
|
|
|
125
196
|
|
|
126
197
|
if (nextMessage.type === AgentMessageType.REQUEST_INPUT) break;
|
|
127
198
|
if (nextMessage.type === AgentMessageType.QUESTION) {
|
|
128
|
-
|
|
199
|
+
if (!getRequestInputResponseId(nextMessage)) {
|
|
200
|
+
answered.add(getRequestInputMessageKey(message));
|
|
201
|
+
}
|
|
129
202
|
break;
|
|
130
203
|
}
|
|
131
204
|
}
|
|
@@ -134,6 +207,41 @@ export function getAnsweredRequestInputKeys(messages: AgentMessage[]): Set<strin
|
|
|
134
207
|
return answered;
|
|
135
208
|
}
|
|
136
209
|
|
|
210
|
+
export function getRequestInputResponseMetadata(
|
|
211
|
+
message: AgentMessage,
|
|
212
|
+
metadata?: Record<string, unknown>,
|
|
213
|
+
): Record<string, unknown> | undefined {
|
|
214
|
+
const requestId = getRequestInputId(message);
|
|
215
|
+
if (!requestId) return metadata;
|
|
216
|
+
|
|
217
|
+
return {
|
|
218
|
+
...metadata,
|
|
219
|
+
request_input_response: { request_id: requestId },
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
export function sendRequestInputResponse(
|
|
224
|
+
onSendMessage: ((message: string, metadata?: Record<string, unknown>) => void) | undefined,
|
|
225
|
+
requestMessage: AgentMessage,
|
|
226
|
+
response: string,
|
|
227
|
+
metadata?: Record<string, unknown>,
|
|
228
|
+
): void {
|
|
229
|
+
if (!onSendMessage) return;
|
|
230
|
+
|
|
231
|
+
const responseMetadata = getRequestInputResponseMetadata(requestMessage, metadata);
|
|
232
|
+
if (responseMetadata) {
|
|
233
|
+
onSendMessage(response, responseMetadata);
|
|
234
|
+
} else {
|
|
235
|
+
onSendMessage(response);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
export function getRequestInputResponseIdFromMetadata(metadata?: Record<string, unknown>): string | undefined {
|
|
240
|
+
const response = getRecord(metadata?.request_input_response);
|
|
241
|
+
const requestId = response?.request_id;
|
|
242
|
+
return typeof requestId === 'string' && requestId ? requestId : undefined;
|
|
243
|
+
}
|
|
244
|
+
|
|
137
245
|
export function getResolvedToolApprovalKeys(messages: AgentMessage[]): Set<string> {
|
|
138
246
|
const resolved = new Set<string>();
|
|
139
247
|
|
|
@@ -300,6 +408,7 @@ export function isRequestInputAnswered(message: AgentMessage, answeredRequestInp
|
|
|
300
408
|
export function getPendingRequestInputMessage(
|
|
301
409
|
messages: AgentMessage[],
|
|
302
410
|
workstreamId = 'main',
|
|
411
|
+
locallyAnsweredRequestInputKeys?: ReadonlySet<string>,
|
|
303
412
|
): RequestInputMessageWithUx | undefined {
|
|
304
413
|
const answeredRequestInputKeys = getAnsweredRequestInputKeys(messages);
|
|
305
414
|
const resolvedToolApprovalKeys = getResolvedToolApprovalKeys(messages);
|
|
@@ -308,6 +417,7 @@ export function getPendingRequestInputMessage(
|
|
|
308
417
|
const message = messages[index];
|
|
309
418
|
if (!hasRequestInputUx(message)) continue;
|
|
310
419
|
if (getWorkstreamId(message) !== workstreamId) continue;
|
|
420
|
+
if (locallyAnsweredRequestInputKeys?.has(getRequestInputResolutionKey(message))) continue;
|
|
311
421
|
if (isRequestInputAnswered(message, answeredRequestInputKeys)) continue;
|
|
312
422
|
if (isRequestInputResolvedByToolApprovalEvent(message, resolvedToolApprovalKeys)) continue;
|
|
313
423
|
return message;
|
|
@@ -576,6 +576,27 @@ describe('ModernAgentOutput summary conversation items', () => {
|
|
|
576
576
|
]);
|
|
577
577
|
});
|
|
578
578
|
|
|
579
|
+
it('keeps a main-workstream activity error visible as a primary message', () => {
|
|
580
|
+
const question = makeMessage({
|
|
581
|
+
timestamp: 1000,
|
|
582
|
+
type: AgentMessageType.QUESTION,
|
|
583
|
+
message: 'do the thing',
|
|
584
|
+
});
|
|
585
|
+
const terminationError = makeMessage({
|
|
586
|
+
timestamp: 1100,
|
|
587
|
+
type: AgentMessageType.ERROR,
|
|
588
|
+
message: 'Stopped: the agent called create_document with the same input 4 times in a row.',
|
|
589
|
+
details: { event_class: 'activity' },
|
|
590
|
+
});
|
|
591
|
+
|
|
592
|
+
const items = buildSummaryConversationItems([question, terminationError], true);
|
|
593
|
+
|
|
594
|
+
expect(items).toEqual([
|
|
595
|
+
{ type: 'message', message: question },
|
|
596
|
+
{ type: 'message', message: terminationError },
|
|
597
|
+
]);
|
|
598
|
+
});
|
|
599
|
+
|
|
579
600
|
it('hides transient thinking once the work segment completes', () => {
|
|
580
601
|
const tool = makeMessage({
|
|
581
602
|
timestamp: 1000,
|
|
@@ -312,6 +312,68 @@ describe('useAgentStream', () => {
|
|
|
312
312
|
expect(onMessage).toHaveBeenCalledTimes(1);
|
|
313
313
|
});
|
|
314
314
|
|
|
315
|
+
it('does not apply replayed file_processing snapshots to server file updates', async () => {
|
|
316
|
+
let deliver: ((message: AgentMessage) => void) | undefined;
|
|
317
|
+
const fileSnapshot = (timestamp: number, id: string): AgentMessage => ({
|
|
318
|
+
timestamp,
|
|
319
|
+
workflow_run_id: 'run-1',
|
|
320
|
+
type: AgentMessageType.SYSTEM,
|
|
321
|
+
message: '',
|
|
322
|
+
workstream_id: 'main',
|
|
323
|
+
details: {
|
|
324
|
+
system_type: 'file_processing',
|
|
325
|
+
batch_id: 'batch-1',
|
|
326
|
+
files: [
|
|
327
|
+
{
|
|
328
|
+
id,
|
|
329
|
+
name: `${id}.pdf`,
|
|
330
|
+
content_type: 'application/pdf',
|
|
331
|
+
size: 1,
|
|
332
|
+
status: FileProcessingStatus.READY,
|
|
333
|
+
artifact_path: `files/${id}.pdf`,
|
|
334
|
+
reference: `artifact:files/${id}.pdf`,
|
|
335
|
+
started_at: timestamp,
|
|
336
|
+
},
|
|
337
|
+
],
|
|
338
|
+
pending_count: 0,
|
|
339
|
+
ready_count: 1,
|
|
340
|
+
error_count: 0,
|
|
341
|
+
},
|
|
342
|
+
});
|
|
343
|
+
const historical = fileSnapshot(1_000, 'old-upload');
|
|
344
|
+
const streamMessages = vi.fn<
|
|
345
|
+
(
|
|
346
|
+
id: string,
|
|
347
|
+
onMessage?: (message: AgentMessage, exitFn?: (payload: unknown) => void) => void,
|
|
348
|
+
since?: number,
|
|
349
|
+
signal?: AbortSignal,
|
|
350
|
+
options?: AgentRunStreamMessagesOptions,
|
|
351
|
+
) => Promise<unknown>
|
|
352
|
+
>(async (_id, onMessage, _since, _signal, options) => {
|
|
353
|
+
deliver = onMessage;
|
|
354
|
+
options?.onHistoryLoaded?.([historical]);
|
|
355
|
+
// Completed runs replay archived file_processing snapshots through the
|
|
356
|
+
// live callback; applying them would rehydrate every historical upload
|
|
357
|
+
// as a staged composer chip on reopen.
|
|
358
|
+
onMessage?.(historical);
|
|
359
|
+
return null;
|
|
360
|
+
});
|
|
361
|
+
const client = createClient(streamMessages);
|
|
362
|
+
const { result } = renderHook(() => useAgentStream(client, 'agent-run-1', vi.fn()));
|
|
363
|
+
|
|
364
|
+
await waitFor(() => expect(deliver).toBeDefined());
|
|
365
|
+
// History hydrates the latest archived inventory once so an unconsumed staged file
|
|
366
|
+
// survives a reload; the live replay of that same snapshot is ignored, leaving the
|
|
367
|
+
// hydrated entry untouched. Already-delivered files are dropped downstream by
|
|
368
|
+
// useFileProcessing (consumed_at + delivered artifact refs), not by refusing to hydrate.
|
|
369
|
+
expect(result.current.serverFileUpdates.size).toBe(1);
|
|
370
|
+
expect(result.current.serverFileUpdates.has('old-upload')).toBe(true);
|
|
371
|
+
|
|
372
|
+
act(() => deliver?.(fileSnapshot(1_100, 'new-upload')));
|
|
373
|
+
expect(result.current.serverFileUpdates.size).toBe(1);
|
|
374
|
+
expect(result.current.serverFileUpdates.has('new-upload')).toBe(true);
|
|
375
|
+
});
|
|
376
|
+
|
|
315
377
|
it('marks initial history as errored when the history fetch fails', async () => {
|
|
316
378
|
const streamMessages = vi.fn<
|
|
317
379
|
(
|
|
@@ -786,4 +848,114 @@ describe('useAgentStream', () => {
|
|
|
786
848
|
|
|
787
849
|
expect(result.current.serverFileUpdates.has('file-1')).toBe(false);
|
|
788
850
|
});
|
|
851
|
+
|
|
852
|
+
it('hydrates the latest historical file snapshot once and ignores its live replay', async () => {
|
|
853
|
+
let deliver: ((message: AgentMessage) => void) | undefined;
|
|
854
|
+
const fileSnapshot = (timestamp: number, id: string): AgentMessage => ({
|
|
855
|
+
timestamp,
|
|
856
|
+
workflow_run_id: 'run-1',
|
|
857
|
+
type: AgentMessageType.SYSTEM,
|
|
858
|
+
message: '',
|
|
859
|
+
workstream_id: 'main',
|
|
860
|
+
details: {
|
|
861
|
+
system_type: 'file_processing',
|
|
862
|
+
batch_id: 'batch-1',
|
|
863
|
+
files: [
|
|
864
|
+
{
|
|
865
|
+
id,
|
|
866
|
+
name: `${id}.pdf`,
|
|
867
|
+
content_type: 'application/pdf',
|
|
868
|
+
size: 1,
|
|
869
|
+
status: FileProcessingStatus.READY,
|
|
870
|
+
artifact_path: `files/${id}.pdf`,
|
|
871
|
+
reference: `artifact:files/${id}.pdf`,
|
|
872
|
+
started_at: timestamp,
|
|
873
|
+
},
|
|
874
|
+
],
|
|
875
|
+
pending_count: 0,
|
|
876
|
+
ready_count: 1,
|
|
877
|
+
error_count: 0,
|
|
878
|
+
},
|
|
879
|
+
});
|
|
880
|
+
const olderHistorical = fileSnapshot(1_000, 'older-upload');
|
|
881
|
+
const latestHistorical = fileSnapshot(1_100, 'staged-upload');
|
|
882
|
+
const streamMessages = vi.fn<
|
|
883
|
+
(
|
|
884
|
+
id: string,
|
|
885
|
+
onMessage?: (message: AgentMessage, exitFn?: (payload: unknown) => void) => void,
|
|
886
|
+
since?: number,
|
|
887
|
+
signal?: AbortSignal,
|
|
888
|
+
options?: AgentRunStreamMessagesOptions,
|
|
889
|
+
) => Promise<unknown>
|
|
890
|
+
>(async (_id, onMessage, _since, _signal, options) => {
|
|
891
|
+
deliver = onMessage;
|
|
892
|
+
options?.onHistoryLoaded?.([olderHistorical, latestHistorical]);
|
|
893
|
+
// Completed runs replay archived file_processing snapshots through the
|
|
894
|
+
// live callback. Replaying the older snapshot must not replace the latest
|
|
895
|
+
// inventory selected from history.
|
|
896
|
+
onMessage?.(olderHistorical);
|
|
897
|
+
return null;
|
|
898
|
+
});
|
|
899
|
+
const client = createClient(streamMessages);
|
|
900
|
+
const { result } = renderHook(() => useAgentStream(client, 'agent-run-1'));
|
|
901
|
+
|
|
902
|
+
await waitFor(() => expect(deliver).toBeDefined());
|
|
903
|
+
expect(result.current.serverFileUpdates.size).toBe(1);
|
|
904
|
+
expect(result.current.serverFileUpdates.has('staged-upload')).toBe(true);
|
|
905
|
+
|
|
906
|
+
act(() => deliver?.(fileSnapshot(1_200, 'new-upload')));
|
|
907
|
+
expect(result.current.serverFileUpdates.size).toBe(1);
|
|
908
|
+
expect(result.current.serverFileUpdates.has('new-upload')).toBe(true);
|
|
909
|
+
});
|
|
910
|
+
|
|
911
|
+
it('selects the newest historical file snapshot even when history arrives out of order', async () => {
|
|
912
|
+
let deliver: ((message: AgentMessage) => void) | undefined;
|
|
913
|
+
const fileSnapshot = (timestamp: number, id: string): AgentMessage => ({
|
|
914
|
+
timestamp,
|
|
915
|
+
workflow_run_id: 'run-1',
|
|
916
|
+
type: AgentMessageType.SYSTEM,
|
|
917
|
+
message: '',
|
|
918
|
+
workstream_id: 'main',
|
|
919
|
+
details: {
|
|
920
|
+
system_type: 'file_processing',
|
|
921
|
+
batch_id: 'batch-1',
|
|
922
|
+
files: [
|
|
923
|
+
{
|
|
924
|
+
id,
|
|
925
|
+
name: `${id}.pdf`,
|
|
926
|
+
content_type: 'application/pdf',
|
|
927
|
+
size: 1,
|
|
928
|
+
status: FileProcessingStatus.READY,
|
|
929
|
+
artifact_path: `files/${id}.pdf`,
|
|
930
|
+
reference: `artifact:files/${id}.pdf`,
|
|
931
|
+
started_at: timestamp,
|
|
932
|
+
},
|
|
933
|
+
],
|
|
934
|
+
pending_count: 0,
|
|
935
|
+
ready_count: 1,
|
|
936
|
+
error_count: 0,
|
|
937
|
+
},
|
|
938
|
+
});
|
|
939
|
+
const streamMessages = vi.fn<
|
|
940
|
+
(
|
|
941
|
+
id: string,
|
|
942
|
+
onMessage?: (message: AgentMessage, exitFn?: (payload: unknown) => void) => void,
|
|
943
|
+
since?: number,
|
|
944
|
+
signal?: AbortSignal,
|
|
945
|
+
options?: AgentRunStreamMessagesOptions,
|
|
946
|
+
) => Promise<unknown>
|
|
947
|
+
>(async (_id, onMessage, _since, _signal, options) => {
|
|
948
|
+
deliver = onMessage;
|
|
949
|
+
// retrieveMessages returns GET /updates unsorted, so the newest snapshot is not
|
|
950
|
+
// necessarily last. Selection must be by timestamp, not arrival order.
|
|
951
|
+
options?.onHistoryLoaded?.([fileSnapshot(1_100, 'staged-upload'), fileSnapshot(1_000, 'older-upload')]);
|
|
952
|
+
return null;
|
|
953
|
+
});
|
|
954
|
+
const client = createClient(streamMessages);
|
|
955
|
+
const { result } = renderHook(() => useAgentStream(client, 'agent-run-1'));
|
|
956
|
+
|
|
957
|
+
await waitFor(() => expect(deliver).toBeDefined());
|
|
958
|
+
expect(result.current.serverFileUpdates.size).toBe(1);
|
|
959
|
+
expect(result.current.serverFileUpdates.has('staged-upload')).toBe(true);
|
|
960
|
+
});
|
|
789
961
|
});
|
|
@@ -357,9 +357,12 @@ export function useAgentStream(
|
|
|
357
357
|
(message) => {
|
|
358
358
|
if (abortController.signal.aborted) return;
|
|
359
359
|
// Completed and idle runs replay their archived history through the live
|
|
360
|
-
// stream.
|
|
360
|
+
// stream. Track replay status once, before the cursor advances below —
|
|
361
|
+
// every replay-sensitive consumer in this callback must use it.
|
|
362
|
+
const isReplay = Boolean(message.timestamp && message.timestamp <= lastDeliveredTsRef.current);
|
|
363
|
+
// Only forward genuinely new deliveries so onMessage consumers
|
|
361
364
|
// never treat replayed events as fresh ones.
|
|
362
|
-
if (!
|
|
365
|
+
if (!isReplay) {
|
|
363
366
|
onMessageRef.current?.(message);
|
|
364
367
|
}
|
|
365
368
|
|
|
@@ -426,7 +429,13 @@ export function useAgentStream(
|
|
|
426
429
|
if (message.type === AgentMessageType.SYSTEM) {
|
|
427
430
|
const details = message.details as FileProcessingDetails | undefined;
|
|
428
431
|
if (details?.system_type === 'file_processing' && details.files) {
|
|
429
|
-
|
|
432
|
+
// Replayed snapshots list every file ever uploaded to the run as
|
|
433
|
+
// READY; applying them on reconnect would rehydrate historical
|
|
434
|
+
// uploads as staged composer chips. Only genuinely new updates
|
|
435
|
+
// may touch the file state.
|
|
436
|
+
if (!isReplay) {
|
|
437
|
+
setServerFileUpdates(new Map(details.files.map((file) => [file.id, file])));
|
|
438
|
+
}
|
|
430
439
|
return;
|
|
431
440
|
}
|
|
432
441
|
// Other SYSTEM messages fall through to normal handling
|
|
@@ -467,13 +476,39 @@ export function useAgentStream(
|
|
|
467
476
|
onHistoryLoaded: (historical) => {
|
|
468
477
|
if (abortController.signal.aborted) return;
|
|
469
478
|
const timelineMessages = historical.filter(shouldStoreTimelineMessage);
|
|
479
|
+
let latestFileSnapshot: FileProcessingDetails | undefined;
|
|
480
|
+
let latestFileSnapshotTs = Number.NEGATIVE_INFINITY;
|
|
470
481
|
// Advance the watermark synchronously before React processes the
|
|
471
482
|
// history state update. Some completed streams replay history via
|
|
472
483
|
// the live callback immediately after onHistoryLoaded returns.
|
|
484
|
+
// Must cover every historical message, not just the timeline subset:
|
|
485
|
+
// file_processing snapshots are excluded from timelineMessages, so
|
|
486
|
+
// scanning only that subset would leave the cursor behind them and
|
|
487
|
+
// the replay guard would never fire for a file-only history.
|
|
473
488
|
for (const message of historical) {
|
|
474
489
|
if (message.timestamp && message.timestamp > lastDeliveredTsRef.current) {
|
|
475
490
|
lastDeliveredTsRef.current = message.timestamp;
|
|
476
491
|
}
|
|
492
|
+
if (message.type === AgentMessageType.SYSTEM) {
|
|
493
|
+
const details = message.details as FileProcessingDetails | undefined;
|
|
494
|
+
if (details?.system_type === 'file_processing' && details.files) {
|
|
495
|
+
// GET /updates is returned unsorted (the client only ever
|
|
496
|
+
// takes a Math.max over timestamps), so select the newest
|
|
497
|
+
// snapshot by timestamp instead of trusting arrival order.
|
|
498
|
+
// >= keeps last-wins for ties and for untimestamped messages.
|
|
499
|
+
const timestamp = message.timestamp ?? Number.NEGATIVE_INFINITY;
|
|
500
|
+
if (!latestFileSnapshot || timestamp >= latestFileSnapshotTs) {
|
|
501
|
+
latestFileSnapshot = details;
|
|
502
|
+
latestFileSnapshotTs = timestamp;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
// Hydrate the latest archived inventory once so an unconsumed staged file
|
|
508
|
+
// remains visible after reload. Subsequent live-callback replay is ignored
|
|
509
|
+
// by isReplay above, while useFileProcessing filters consumed/delivered files.
|
|
510
|
+
if (latestFileSnapshot) {
|
|
511
|
+
setServerFileUpdates(new Map(latestFileSnapshot.files.map((file) => [file.id, file])));
|
|
477
512
|
}
|
|
478
513
|
debugAgentChat('history loaded', {
|
|
479
514
|
agentRunId,
|