@vertesia/ui 1.4.0-dev.20260615.042549Z → 1.4.0-dev.20260629.130134Z
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/shadcn/dropdown.d.ts.map +1 -1
- package/lib/core/components/shadcn/dropdown.js +6 -2
- package/lib/core/components/shadcn/dropdown.js.map +1 -1
- package/lib/core/components/shadcn/filters/filterBar.d.ts.map +1 -1
- package/lib/core/components/shadcn/filters/filterBar.js +9 -2
- package/lib/core/components/shadcn/filters/filterBar.js.map +1 -1
- package/lib/core/components/shadcn/modal/ConfirmModal.d.ts +16 -1
- package/lib/core/components/shadcn/modal/ConfirmModal.d.ts.map +1 -1
- package/lib/core/components/shadcn/modal/ConfirmModal.js +25 -3
- package/lib/core/components/shadcn/modal/ConfirmModal.js.map +1 -1
- package/lib/core/components/shadcn/modal/dialog.js +1 -1
- package/lib/core/components/shadcn/modal/dialog.js.map +1 -1
- package/lib/core/components/shadcn/popover.d.ts.map +1 -1
- package/lib/core/components/shadcn/popover.js +3 -1
- package/lib/core/components/shadcn/popover.js.map +1 -1
- package/lib/core/components/shadcn/switch.js +3 -3
- package/lib/core/components/shadcn/switch.js.map +1 -1
- package/lib/core/components/shadcn/tabs.js +1 -1
- package/lib/core/components/shadcn/tabs.js.map +1 -1
- package/lib/core/components/shadcn/tooltip.d.ts.map +1 -1
- package/lib/core/components/shadcn/tooltip.js +3 -1
- package/lib/core/components/shadcn/tooltip.js.map +1 -1
- package/lib/env/index.d.ts +0 -19
- package/lib/env/index.d.ts.map +1 -1
- package/lib/env/index.js +0 -6
- package/lib/env/index.js.map +1 -1
- package/lib/features/agent/PayloadBuilder.d.ts +4 -0
- package/lib/features/agent/PayloadBuilder.d.ts.map +1 -1
- package/lib/features/agent/PayloadBuilder.js +16 -0
- package/lib/features/agent/PayloadBuilder.js.map +1 -1
- package/lib/features/agent/chat/AgentApprovalModeSelector.d.ts +10 -0
- package/lib/features/agent/chat/AgentApprovalModeSelector.d.ts.map +1 -0
- package/lib/features/agent/chat/AgentApprovalModeSelector.js +50 -0
- package/lib/features/agent/chat/AgentApprovalModeSelector.js.map +1 -0
- package/lib/features/agent/chat/AgentChatFixtureReplay.d.ts +2 -1
- package/lib/features/agent/chat/AgentChatFixtureReplay.d.ts.map +1 -1
- package/lib/features/agent/chat/AgentChatFixtureReplay.js +3 -3
- package/lib/features/agent/chat/AgentChatFixtureReplay.js.map +1 -1
- package/lib/features/agent/chat/AgentRequestInputOverlay.d.ts +5 -2
- package/lib/features/agent/chat/AgentRequestInputOverlay.d.ts.map +1 -1
- package/lib/features/agent/chat/AgentRequestInputOverlay.js +41 -7
- package/lib/features/agent/chat/AgentRequestInputOverlay.js.map +1 -1
- package/lib/features/agent/chat/AgentRightPanel.d.ts.map +1 -1
- package/lib/features/agent/chat/AgentRightPanel.js +133 -12
- package/lib/features/agent/chat/AgentRightPanel.js.map +1 -1
- package/lib/features/agent/chat/AnimatedThinkingDots.js +1 -1
- package/lib/features/agent/chat/AnimatedThinkingDots.js.map +1 -1
- package/lib/features/agent/chat/ArtifactsTab.d.ts.map +1 -1
- package/lib/features/agent/chat/ArtifactsTab.js +11 -65
- package/lib/features/agent/chat/ArtifactsTab.js.map +1 -1
- package/lib/features/agent/chat/AskUserWidget.d.ts +3 -1
- package/lib/features/agent/chat/AskUserWidget.d.ts.map +1 -1
- package/lib/features/agent/chat/AskUserWidget.js +4 -3
- package/lib/features/agent/chat/AskUserWidget.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentConversation.d.ts +10 -2
- package/lib/features/agent/chat/ModernAgentConversation.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentConversation.js +526 -117
- package/lib/features/agent/chat/ModernAgentConversation.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.d.ts +8 -0
- package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.d.ts.map +1 -0
- package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.js +19 -0
- package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.js.map +1 -0
- package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts +8 -2
- package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js +551 -92
- package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.js +7 -6
- package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.js.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/MessageDeliveryStatus.d.ts +8 -0
- package/lib/features/agent/chat/ModernAgentOutput/MessageDeliveryStatus.d.ts.map +1 -0
- package/lib/features/agent/chat/ModernAgentOutput/MessageDeliveryStatus.js +61 -0
- package/lib/features/agent/chat/ModernAgentOutput/MessageDeliveryStatus.js.map +1 -0
- package/lib/features/agent/chat/ModernAgentOutput/MessageInput.d.ts +15 -2
- package/lib/features/agent/chat/ModernAgentOutput/MessageInput.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js +28 -38
- package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageItem.d.ts +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageItem.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js +3 -2
- package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/SlideInPanel.js +2 -1
- package/lib/features/agent/chat/ModernAgentOutput/SlideInPanel.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/SlidingMessages.js +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/SlidingMessages.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.d.ts +5 -0
- package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.js +59 -4
- package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js +2 -2
- package/lib/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.d.ts +9 -0
- package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.js +180 -0
- package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/utils.d.ts +6 -0
- package/lib/features/agent/chat/ModernAgentOutput/utils.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/utils.js +92 -2
- package/lib/features/agent/chat/ModernAgentOutput/utils.js.map +1 -1
- package/lib/features/agent/chat/clipboardFiles.d.ts +15 -0
- package/lib/features/agent/chat/clipboardFiles.d.ts.map +1 -0
- package/lib/features/agent/chat/clipboardFiles.js +35 -0
- package/lib/features/agent/chat/clipboardFiles.js.map +1 -0
- package/lib/features/agent/chat/hooks/useAgentStream.d.ts +6 -0
- package/lib/features/agent/chat/hooks/useAgentStream.d.ts.map +1 -1
- package/lib/features/agent/chat/hooks/useAgentStream.js +218 -37
- package/lib/features/agent/chat/hooks/useAgentStream.js.map +1 -1
- package/lib/features/agent/chat/hooks/useArtifacts.d.ts +1 -8
- package/lib/features/agent/chat/hooks/useArtifacts.d.ts.map +1 -1
- package/lib/features/agent/chat/hooks/useArtifacts.js +10 -28
- package/lib/features/agent/chat/hooks/useArtifacts.js.map +1 -1
- package/lib/features/agent/chat/index.d.ts +2 -1
- package/lib/features/agent/chat/index.d.ts.map +1 -1
- package/lib/features/agent/chat/index.js +2 -1
- package/lib/features/agent/chat/index.js.map +1 -1
- package/lib/features/agent/chat/workstreams.d.ts +1 -0
- package/lib/features/agent/chat/workstreams.d.ts.map +1 -1
- package/lib/features/agent/chat/workstreams.js +28 -0
- package/lib/features/agent/chat/workstreams.js.map +1 -1
- package/lib/features/facets/AgentRunnerFacetsNav.d.ts +10 -1
- package/lib/features/facets/AgentRunnerFacetsNav.d.ts.map +1 -1
- package/lib/features/facets/AgentRunnerFacetsNav.js +6 -3
- package/lib/features/facets/AgentRunnerFacetsNav.js.map +1 -1
- package/lib/features/facets/CollectionsFacetsNav.d.ts +10 -1
- package/lib/features/facets/CollectionsFacetsNav.d.ts.map +1 -1
- package/lib/features/facets/CollectionsFacetsNav.js +14 -5
- package/lib/features/facets/CollectionsFacetsNav.js.map +1 -1
- package/lib/features/facets/PromptsFacetsNav.d.ts +10 -1
- package/lib/features/facets/PromptsFacetsNav.d.ts.map +1 -1
- package/lib/features/facets/PromptsFacetsNav.js +14 -5
- package/lib/features/facets/PromptsFacetsNav.js.map +1 -1
- package/lib/features/facets/RunsFacetsNav.d.ts +10 -1
- package/lib/features/facets/RunsFacetsNav.d.ts.map +1 -1
- package/lib/features/facets/RunsFacetsNav.js +14 -5
- package/lib/features/facets/RunsFacetsNav.js.map +1 -1
- package/lib/features/index.d.ts +0 -1
- package/lib/features/index.d.ts.map +1 -1
- package/lib/features/index.js +0 -1
- package/lib/features/index.js.map +1 -1
- package/lib/features/oauth/McpConnectionsButton.d.ts +30 -0
- package/lib/features/oauth/McpConnectionsButton.d.ts.map +1 -0
- package/lib/features/oauth/McpConnectionsButton.js +70 -0
- package/lib/features/oauth/McpConnectionsButton.js.map +1 -0
- package/lib/features/oauth/McpConnectionsDialog.d.ts +25 -0
- package/lib/features/oauth/McpConnectionsDialog.d.ts.map +1 -0
- package/lib/features/oauth/McpConnectionsDialog.js +26 -0
- package/lib/features/oauth/McpConnectionsDialog.js.map +1 -0
- package/lib/features/oauth/RemoteMcpConnectionButton.d.ts.map +1 -1
- package/lib/features/oauth/RemoteMcpConnectionButton.js +14 -6
- package/lib/features/oauth/RemoteMcpConnectionButton.js.map +1 -1
- package/lib/features/oauth/index.d.ts +3 -0
- package/lib/features/oauth/index.d.ts.map +1 -1
- package/lib/features/oauth/index.js +3 -0
- package/lib/features/oauth/index.js.map +1 -1
- package/lib/features/oauth/useMcpConnections.d.ts +44 -0
- package/lib/features/oauth/useMcpConnections.d.ts.map +1 -0
- package/lib/features/oauth/useMcpConnections.js +168 -0
- package/lib/features/oauth/useMcpConnections.js.map +1 -0
- package/lib/features/permissions/UserPermissionsProvider.d.ts +4 -6
- package/lib/features/permissions/UserPermissionsProvider.d.ts.map +1 -1
- package/lib/features/permissions/UserPermissionsProvider.js +40 -42
- package/lib/features/permissions/UserPermissionsProvider.js.map +1 -1
- package/lib/features/store/objects/DocumentPreviewPanel.d.ts.map +1 -1
- package/lib/features/store/objects/DocumentPreviewPanel.js +2 -1
- package/lib/features/store/objects/DocumentPreviewPanel.js.map +1 -1
- package/lib/features/store/objects/DocumentQuickFilter.d.ts +23 -0
- package/lib/features/store/objects/DocumentQuickFilter.d.ts.map +1 -0
- package/lib/features/store/objects/DocumentQuickFilter.js +30 -0
- package/lib/features/store/objects/DocumentQuickFilter.js.map +1 -0
- package/lib/features/store/objects/DocumentSearchResults.d.ts.map +1 -1
- package/lib/features/store/objects/DocumentSearchResults.js +17 -1
- package/lib/features/store/objects/DocumentSearchResults.js.map +1 -1
- package/lib/features/store/objects/components/ContentOverview.d.ts.map +1 -1
- package/lib/features/store/objects/components/ContentOverview.js +17 -74
- package/lib/features/store/objects/components/ContentOverview.js.map +1 -1
- package/lib/features/store/objects/layout/DocumentTableColumn.d.ts +7 -1
- package/lib/features/store/objects/layout/DocumentTableColumn.d.ts.map +1 -1
- package/lib/features/store/objects/layout/DocumentTableColumn.js +27 -3
- 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 +2 -1
- package/lib/features/store/objects/layout/renderers.d.ts.map +1 -1
- package/lib/features/store/objects/layout/renderers.js +27 -20
- package/lib/features/store/objects/layout/renderers.js.map +1 -1
- package/lib/features/store/types/ContentObjectTypesSearch.d.ts.map +1 -1
- package/lib/features/store/types/ContentObjectTypesSearch.js +4 -1
- package/lib/features/store/types/ContentObjectTypesSearch.js.map +1 -1
- package/lib/features/store/types/ContentObjectTypesTable.d.ts +2 -1
- package/lib/features/store/types/ContentObjectTypesTable.d.ts.map +1 -1
- package/lib/features/store/types/ContentObjectTypesTable.js +8 -3
- package/lib/features/store/types/ContentObjectTypesTable.js.map +1 -1
- package/lib/i18n/instance.d.ts.map +1 -1
- package/lib/i18n/instance.js +1 -0
- package/lib/i18n/instance.js.map +1 -1
- package/lib/i18n/locales/ar.json +72 -45
- package/lib/i18n/locales/de.json +65 -34
- package/lib/i18n/locales/en.json +63 -47
- package/lib/i18n/locales/es.json +65 -35
- package/lib/i18n/locales/fr.json +65 -35
- package/lib/i18n/locales/it.json +72 -42
- package/lib/i18n/locales/ja.json +72 -41
- package/lib/i18n/locales/ko.json +72 -41
- package/lib/i18n/locales/pt.json +72 -42
- package/lib/i18n/locales/ru.json +72 -43
- package/lib/i18n/locales/tr.json +72 -41
- package/lib/i18n/locales/zh-TW.json +72 -41
- package/lib/i18n/locales/zh.json +72 -41
- package/lib/session/UserSession.d.ts +0 -6
- package/lib/session/UserSession.d.ts.map +1 -1
- package/lib/session/UserSession.js +0 -15
- package/lib/session/UserSession.js.map +1 -1
- package/lib/session/UserSessionProvider.d.ts.map +1 -1
- package/lib/session/UserSessionProvider.js +39 -98
- package/lib/session/UserSessionProvider.js.map +1 -1
- package/lib/session/auth/composable.d.ts.map +1 -1
- package/lib/session/auth/composable.js +3 -33
- package/lib/session/auth/composable.js.map +1 -1
- package/lib/shell/login/SignInPrimitives.d.ts.map +1 -1
- package/lib/shell/login/SignInPrimitives.js +3 -2
- package/lib/shell/login/SignInPrimitives.js.map +1 -1
- package/lib/vertesia-ui-core.js +1 -1
- package/lib/vertesia-ui-core.js.map +1 -1
- package/lib/vertesia-ui-env.js +1 -1
- package/lib/vertesia-ui-env.js.map +1 -1
- package/lib/vertesia-ui-features.js +1 -1
- package/lib/vertesia-ui-features.js.map +1 -1
- package/lib/vertesia-ui-i18n.js +1 -1
- package/lib/vertesia-ui-i18n.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 +1 -1
- package/lib/vertesia-ui-widgets.js.map +1 -1
- package/lib/widgets/schema-editor/editor/Editable.js +1 -1
- package/lib/widgets/schema-editor/editor/Editable.js.map +1 -1
- package/llms.txt +70 -70
- package/package.json +35 -32
- package/src/core/components/shadcn/dropdown.tsx +2 -0
- package/src/core/components/shadcn/filters/filterBar.tsx +9 -2
- package/src/core/components/shadcn/modal/ConfirmModal.tsx +65 -3
- package/src/core/components/shadcn/modal/dialog.tsx +1 -1
- package/src/core/components/shadcn/popover.tsx +1 -0
- package/src/core/components/shadcn/switch.tsx +4 -4
- package/src/core/components/shadcn/tabs.tsx +1 -1
- package/src/core/components/shadcn/tooltip.tsx +1 -0
- package/src/env/index.ts +0 -24
- package/src/features/agent/PayloadBuilder.tsx +18 -0
- package/src/features/agent/chat/AgentApprovalModeSelector.tsx +130 -0
- package/src/features/agent/chat/AgentChatFixtureReplay.test.tsx +22 -2
- package/src/features/agent/chat/AgentChatFixtureReplay.tsx +33 -27
- package/src/features/agent/chat/AgentRequestInputOverlay.test.tsx +122 -0
- package/src/features/agent/chat/AgentRequestInputOverlay.tsx +91 -17
- package/src/features/agent/chat/AgentRightPanel.tsx +238 -50
- package/src/features/agent/chat/AnimatedThinkingDots.tsx +1 -1
- package/src/features/agent/chat/ArtifactsTab.tsx +21 -155
- package/src/features/agent/chat/AskUserWidget.tsx +6 -2
- package/src/features/agent/chat/ModernAgentConversation.test.tsx +1157 -47
- package/src/features/agent/chat/ModernAgentConversation.tsx +703 -136
- package/src/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.tsx +74 -0
- package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.test.tsx +1420 -126
- package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +934 -111
- package/src/features/agent/chat/ModernAgentOutput/AttachmentPreview.tsx +31 -40
- package/src/features/agent/chat/ModernAgentOutput/Header.tsx +28 -28
- package/src/features/agent/chat/ModernAgentOutput/MessageDeliveryStatus.tsx +83 -0
- package/src/features/agent/chat/ModernAgentOutput/MessageInput.test.tsx +38 -2
- package/src/features/agent/chat/ModernAgentOutput/MessageInput.tsx +121 -98
- package/src/features/agent/chat/ModernAgentOutput/MessageItem.tsx +7 -1
- package/src/features/agent/chat/ModernAgentOutput/SlideInPanel.tsx +3 -3
- package/src/features/agent/chat/ModernAgentOutput/SlidingMessages.tsx +1 -1
- package/src/features/agent/chat/ModernAgentOutput/SummaryConversation.ts +82 -2
- package/src/features/agent/chat/ModernAgentOutput/WorkstreamTabs.tsx +2 -2
- package/src/features/agent/chat/ModernAgentOutput/requestInputMessages.ts +216 -0
- package/src/features/agent/chat/ModernAgentOutput/utils.test.ts +149 -0
- package/src/features/agent/chat/ModernAgentOutput/utils.ts +103 -2
- package/src/features/agent/chat/clipboardFiles.ts +33 -0
- package/src/features/agent/chat/hooks/useAgentStream.test.tsx +355 -4
- package/src/features/agent/chat/hooks/useAgentStream.ts +270 -43
- package/src/features/agent/chat/hooks/useArtifacts.ts +11 -44
- package/src/features/agent/chat/index.ts +10 -1
- package/src/features/agent/chat/workstreams.ts +42 -0
- package/src/features/facets/AgentRunnerFacetsNav.tsx +23 -3
- package/src/features/facets/CollectionsFacetsNav.tsx +30 -5
- package/src/features/facets/PromptsFacetsNav.tsx +30 -5
- package/src/features/facets/RunsFacetsNav.tsx +32 -5
- package/src/features/index.ts +0 -1
- package/src/features/oauth/McpConnectionsButton.test.tsx +248 -0
- package/src/features/oauth/McpConnectionsButton.tsx +269 -0
- package/src/features/oauth/McpConnectionsDialog.tsx +142 -0
- package/src/features/oauth/RemoteMcpConnectionButton.tsx +37 -14
- package/src/features/oauth/index.ts +3 -0
- package/src/features/oauth/useMcpConnections.test.ts +94 -0
- package/src/features/oauth/useMcpConnections.ts +210 -0
- package/src/features/permissions/UserPermissionsProvider.tsx +41 -59
- package/src/features/store/objects/DocumentPreviewPanel.tsx +4 -2
- package/src/features/store/objects/DocumentQuickFilter.tsx +72 -0
- package/src/features/store/objects/DocumentSearchResults.tsx +30 -11
- package/src/features/store/objects/components/ContentOverview.tsx +30 -99
- package/src/features/store/objects/layout/DocumentTableColumn.tsx +29 -4
- package/src/features/store/objects/layout/documentLayout.tsx +1 -1
- package/src/features/store/objects/layout/renderers.tsx +80 -20
- package/src/features/store/types/ContentObjectTypesSearch.tsx +7 -1
- package/src/features/store/types/ContentObjectTypesTable.tsx +34 -4
- package/src/i18n/instance.ts +1 -0
- package/src/i18n/locales/ar.json +72 -45
- package/src/i18n/locales/de.json +65 -34
- package/src/i18n/locales/en.json +63 -47
- package/src/i18n/locales/es.json +65 -35
- package/src/i18n/locales/fr.json +65 -35
- package/src/i18n/locales/it.json +72 -42
- package/src/i18n/locales/ja.json +72 -41
- package/src/i18n/locales/ko.json +72 -41
- package/src/i18n/locales/pt.json +72 -42
- package/src/i18n/locales/ru.json +72 -43
- package/src/i18n/locales/tr.json +72 -41
- package/src/i18n/locales/zh-TW.json +72 -41
- package/src/i18n/locales/zh.json +72 -41
- package/src/i18n/rtl.test.ts +57 -1
- package/src/session/UserSession.ts +0 -16
- package/src/session/UserSessionProvider.tsx +51 -123
- package/src/session/auth/composable.ts +3 -34
- package/src/shell/login/SignInPrimitives.tsx +3 -2
- package/src/widgets/schema-editor/editor/Editable.tsx +1 -1
- package/lib/features/document-viewer/UniversalDocumentViewer.d.ts +0 -73
- package/lib/features/document-viewer/UniversalDocumentViewer.d.ts.map +0 -1
- package/lib/features/document-viewer/UniversalDocumentViewer.js +0 -415
- package/lib/features/document-viewer/UniversalDocumentViewer.js.map +0 -1
- package/lib/features/document-viewer/index.d.ts +0 -2
- package/lib/features/document-viewer/index.d.ts.map +0 -1
- package/lib/features/document-viewer/index.js +0 -2
- package/lib/features/document-viewer/index.js.map +0 -1
- package/src/features/document-viewer/UniversalDocumentViewer.test.tsx +0 -123
- package/src/features/document-viewer/UniversalDocumentViewer.tsx +0 -746
- package/src/features/document-viewer/index.ts +0 -1
- package/src/session/auth/composable.test.ts +0 -79
|
@@ -1,6 +1,36 @@
|
|
|
1
1
|
import type { VertesiaClient } from '@vertesia/client';
|
|
2
2
|
import { type AgentMessage, AgentMessageType } from '@vertesia/common';
|
|
3
3
|
import dayjs from 'dayjs';
|
|
4
|
+
import { getWorkstreamActivityDetails, getWorkstreamLaunchDetails } from '../workstreams.js';
|
|
5
|
+
|
|
6
|
+
function getAgentChatDebugParam(hash: string): string | null {
|
|
7
|
+
const queryStart = hash.indexOf('?');
|
|
8
|
+
if (queryStart === -1) return null;
|
|
9
|
+
return new URLSearchParams(hash.slice(queryStart + 1)).get('agentChatDebug');
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function isAgentChatDebugEnabled(): boolean {
|
|
13
|
+
if (typeof window === 'undefined') return false;
|
|
14
|
+
|
|
15
|
+
const searchValue = new URLSearchParams(window.location.search).get('agentChatDebug');
|
|
16
|
+
const hashValue = getAgentChatDebugParam(window.location.hash);
|
|
17
|
+
const urlValue = searchValue ?? hashValue;
|
|
18
|
+
if (urlValue !== null) {
|
|
19
|
+
return urlValue === '1' || urlValue === 'true';
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
try {
|
|
23
|
+
const stored = window.localStorage.getItem('agentChatDebug');
|
|
24
|
+
return stored === '1' || stored === 'true';
|
|
25
|
+
} catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function debugAgentChat(label: string, details?: Record<string, unknown>) {
|
|
31
|
+
if (!isAgentChatDebugEnabled()) return;
|
|
32
|
+
console.debug(`[agent-chat] ${label}`, details ?? {});
|
|
33
|
+
}
|
|
4
34
|
|
|
5
35
|
export function insertMessageInTimeline(arr: AgentMessage[], m: AgentMessage) {
|
|
6
36
|
const t = typeof m.timestamp === 'number' ? m.timestamp : new Date(m.timestamp).getTime();
|
|
@@ -28,14 +58,22 @@ export const DONE_STATES = [
|
|
|
28
58
|
export function isInProgress(messages: AgentMessage[]) {
|
|
29
59
|
if (!messages.length) return true;
|
|
30
60
|
|
|
61
|
+
const isTerminalOptimisticFailure = (message: AgentMessage) =>
|
|
62
|
+
message.details?._optimistic &&
|
|
63
|
+
message.details?._deliveryStatus === 'failed' &&
|
|
64
|
+
DONE_STATES.includes(message.type);
|
|
65
|
+
|
|
66
|
+
const progressMessages = messages.filter((m) => !isTerminalOptimisticFailure(m));
|
|
67
|
+
|
|
31
68
|
// Only the main workstream determines whether the conversation is in progress.
|
|
32
69
|
// Child workstream COMPLETE/IDLE messages must not flip this flag.
|
|
33
|
-
const mainMessages =
|
|
70
|
+
const mainMessages = progressMessages.filter((m) => getWorkstreamId(m) === 'main');
|
|
34
71
|
|
|
35
72
|
// If there are no main workstream messages yet, check if there's exactly one
|
|
36
73
|
// workstream — treat it as main (handles single-workstream conversations).
|
|
37
74
|
if (mainMessages.length === 0) {
|
|
38
|
-
const lastMessage =
|
|
75
|
+
const lastMessage = progressMessages[progressMessages.length - 1];
|
|
76
|
+
if (!lastMessage) return true;
|
|
39
77
|
return !DONE_STATES.includes(lastMessage.type);
|
|
40
78
|
}
|
|
41
79
|
|
|
@@ -43,6 +81,19 @@ export function isInProgress(messages: AgentMessage[]) {
|
|
|
43
81
|
return !DONE_STATES.includes(lastMainMessage.type);
|
|
44
82
|
}
|
|
45
83
|
|
|
84
|
+
export function isUserStoppedMessage(message: AgentMessage): boolean {
|
|
85
|
+
if (message.type !== AgentMessageType.IDLE) return false;
|
|
86
|
+
|
|
87
|
+
const statusReason = message.details?.status_reason;
|
|
88
|
+
const displayRole = message.details?.display_role;
|
|
89
|
+
if (statusReason === 'user_stopped' || displayRole === 'user_stopped') return true;
|
|
90
|
+
|
|
91
|
+
return String(message.message ?? '')
|
|
92
|
+
.trim()
|
|
93
|
+
.toLowerCase()
|
|
94
|
+
.startsWith('stopped.');
|
|
95
|
+
}
|
|
96
|
+
|
|
46
97
|
export const formatRelative = (ts: number | string) =>
|
|
47
98
|
typeof ts === 'number' ? dayjs(ts).fromNow() : dayjs(new Date(ts)).fromNow();
|
|
48
99
|
|
|
@@ -65,6 +116,42 @@ export function getWorkstreamId(message: AgentMessage): string {
|
|
|
65
116
|
return 'main';
|
|
66
117
|
}
|
|
67
118
|
|
|
119
|
+
function getDetailsRecord(message: AgentMessage): Record<string, unknown> {
|
|
120
|
+
const details = message.details;
|
|
121
|
+
if (!details || typeof details !== 'object' || Array.isArray(details)) return {};
|
|
122
|
+
return details as Record<string, unknown>;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export function isMainChatTimelineMessage(message: AgentMessage): boolean {
|
|
126
|
+
if (getWorkstreamId(message) === 'main') return true;
|
|
127
|
+
|
|
128
|
+
if (getWorkstreamLaunchDetails(message) || getWorkstreamActivityDetails(message)) return true;
|
|
129
|
+
|
|
130
|
+
const details = getDetailsRecord(message);
|
|
131
|
+
const hasChildWorkflow =
|
|
132
|
+
typeof details.child_workflow_id === 'string' || typeof details.child_workflow_run_id === 'string';
|
|
133
|
+
const hasTool = typeof details.tool === 'string' || typeof details.tool_run_id === 'string';
|
|
134
|
+
const isLegacyPreLaunchFailure =
|
|
135
|
+
details.event_class === 'activity' &&
|
|
136
|
+
(message.type === AgentMessageType.ERROR || message.type === AgentMessageType.WARNING) &&
|
|
137
|
+
!hasChildWorkflow &&
|
|
138
|
+
!hasTool;
|
|
139
|
+
|
|
140
|
+
return isLegacyPreLaunchFailure;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export function filterMessagesForActiveWorkstream(messages: AgentMessage[], activeWorkstream: string): AgentMessage[] {
|
|
144
|
+
if (activeWorkstream === 'all') {
|
|
145
|
+
return messages.filter(isMainChatTimelineMessage);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return messages.filter((message) => {
|
|
149
|
+
const workstreamStartDetails = getWorkstreamLaunchDetails(message) ?? getWorkstreamActivityDetails(message);
|
|
150
|
+
if (workstreamStartDetails?.workstreamId === activeWorkstream) return false;
|
|
151
|
+
return getWorkstreamId(message) === activeWorkstream;
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
|
|
68
155
|
export function isSummaryVisibleToolActivity(message: AgentMessage): boolean {
|
|
69
156
|
if (!isToolActivityMessage(message)) return false;
|
|
70
157
|
|
|
@@ -224,6 +311,7 @@ export interface StreamingData {
|
|
|
224
311
|
isComplete?: boolean;
|
|
225
312
|
startTimestamp: number;
|
|
226
313
|
activityId?: string;
|
|
314
|
+
streamingId?: string;
|
|
227
315
|
}
|
|
228
316
|
|
|
229
317
|
function normalizeComparableText(text: unknown): string | undefined {
|
|
@@ -247,6 +335,19 @@ export function isStreamReplacedByMessage(streaming: StreamingData, messages: Ag
|
|
|
247
335
|
if (messageTimestamp < streaming.startTimestamp) return false;
|
|
248
336
|
if (getWorkstreamId(message) !== streamWorkstreamId) return false;
|
|
249
337
|
|
|
338
|
+
const messageStreamingId =
|
|
339
|
+
typeof message.details?.streaming_id === 'string' ? message.details.streaming_id : undefined;
|
|
340
|
+
if (streaming.streamingId && messageStreamingId) {
|
|
341
|
+
if (messageStreamingId !== streaming.streamingId) return false;
|
|
342
|
+
if (message.details?.display_role === 'thinking') {
|
|
343
|
+
return false;
|
|
344
|
+
}
|
|
345
|
+
if (isToolCallMessage(message) || message.details?.tool_status) {
|
|
346
|
+
return false;
|
|
347
|
+
}
|
|
348
|
+
return true;
|
|
349
|
+
}
|
|
350
|
+
|
|
250
351
|
if (streaming.activityId && message.details?.activity_id === streaming.activityId) {
|
|
251
352
|
if (message.details?.display_role === 'thinking') {
|
|
252
353
|
return false;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract pasteable files from a clipboard event's `DataTransferItemList`.
|
|
3
|
+
*
|
|
4
|
+
* Used by both `MessageInput` (live chat) and `StartWorkflowView` (start screen)
|
|
5
|
+
* to handle paste-to-attach. Callers diverge on what they do with the result —
|
|
6
|
+
* the live chat uploads immediately via a parent callback; the start screen
|
|
7
|
+
* stages files locally until the workflow starts — so this helper only covers
|
|
8
|
+
* the shared extraction step.
|
|
9
|
+
*
|
|
10
|
+
* Pasted images often arrive without a meaningful filename (most browsers
|
|
11
|
+
* surface them as `image.png`). Rename those to `pasted-image-<timestamp>.<ext>`
|
|
12
|
+
* so they sort and display sensibly in the staged-file chip list.
|
|
13
|
+
*/
|
|
14
|
+
export function extractFilesFromClipboard(items: DataTransferItemList | undefined): File[] {
|
|
15
|
+
if (!items) return [];
|
|
16
|
+
|
|
17
|
+
const files: File[] = [];
|
|
18
|
+
for (let i = 0; i < items.length; i++) {
|
|
19
|
+
const item = items[i];
|
|
20
|
+
if (item.kind !== 'file') continue;
|
|
21
|
+
|
|
22
|
+
const file = item.getAsFile();
|
|
23
|
+
if (!file) continue;
|
|
24
|
+
|
|
25
|
+
if (item.type.startsWith('image/') && (!file.name || file.name === 'image.png')) {
|
|
26
|
+
const extension = item.type.split('/')[1] || 'png';
|
|
27
|
+
files.push(new File([file], `pasted-image-${Date.now()}.${extension}`, { type: file.type }));
|
|
28
|
+
} else {
|
|
29
|
+
files.push(file);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return files;
|
|
33
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { act, renderHook, waitFor } from '@testing-library/react';
|
|
2
|
-
import type { VertesiaClient } from '@vertesia/client';
|
|
2
|
+
import type { AgentRunStreamMessagesOptions, VertesiaClient } from '@vertesia/client';
|
|
3
3
|
import { type AgentMessage, AgentMessageType, FileProcessingStatus } from '@vertesia/common';
|
|
4
4
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
5
5
|
import { useAgentStream } from './useAgentStream';
|
|
@@ -11,6 +11,7 @@ type StreamMessagesMock = ReturnType<
|
|
|
11
11
|
onMessage?: (message: AgentMessage, exitFn?: (payload: unknown) => void) => void,
|
|
12
12
|
since?: number,
|
|
13
13
|
signal?: AbortSignal,
|
|
14
|
+
options?: AgentRunStreamMessagesOptions,
|
|
14
15
|
) => Promise<unknown>
|
|
15
16
|
>
|
|
16
17
|
>;
|
|
@@ -42,6 +43,109 @@ describe('useAgentStream', () => {
|
|
|
42
43
|
vi.clearAllMocks();
|
|
43
44
|
});
|
|
44
45
|
|
|
46
|
+
it('marks initial history as empty when the history fetch returns no messages', async () => {
|
|
47
|
+
const streamMessages = vi.fn<
|
|
48
|
+
(
|
|
49
|
+
id: string,
|
|
50
|
+
onMessage?: (message: AgentMessage, exitFn?: (payload: unknown) => void) => void,
|
|
51
|
+
since?: number,
|
|
52
|
+
signal?: AbortSignal,
|
|
53
|
+
options?: AgentRunStreamMessagesOptions,
|
|
54
|
+
) => Promise<unknown>
|
|
55
|
+
>(async (_id, _onMessage, _since, _signal, options) => {
|
|
56
|
+
options?.onHistoryLoaded?.([]);
|
|
57
|
+
return null;
|
|
58
|
+
});
|
|
59
|
+
const client = createClient(streamMessages);
|
|
60
|
+
|
|
61
|
+
const { result } = renderHook(() => useAgentStream(client, 'agent-run-1'));
|
|
62
|
+
|
|
63
|
+
await waitFor(() => {
|
|
64
|
+
expect(result.current.initialHistoryStatus).toBe('empty');
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('marks initial history as present when the history fetch returns messages', async () => {
|
|
69
|
+
const historicalMessage = createMessage(AgentMessageType.ANSWER, 1_000, 'from history');
|
|
70
|
+
const streamMessages = vi.fn<
|
|
71
|
+
(
|
|
72
|
+
id: string,
|
|
73
|
+
onMessage?: (message: AgentMessage, exitFn?: (payload: unknown) => void) => void,
|
|
74
|
+
since?: number,
|
|
75
|
+
signal?: AbortSignal,
|
|
76
|
+
options?: AgentRunStreamMessagesOptions,
|
|
77
|
+
) => Promise<unknown>
|
|
78
|
+
>(async (_id, onMessage, _since, _signal, options) => {
|
|
79
|
+
options?.onHistoryLoaded?.([historicalMessage]);
|
|
80
|
+
onMessage?.(historicalMessage);
|
|
81
|
+
return null;
|
|
82
|
+
});
|
|
83
|
+
const client = createClient(streamMessages);
|
|
84
|
+
|
|
85
|
+
const { result } = renderHook(() => useAgentStream(client, 'agent-run-1'));
|
|
86
|
+
|
|
87
|
+
await waitFor(() => {
|
|
88
|
+
expect(result.current.initialHistoryStatus).toBe('has_messages');
|
|
89
|
+
expect(result.current.messages.map((message) => message.message)).toEqual(['from history']);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it('seeds messages from loaded history even if the stream callback does not replay them', async () => {
|
|
94
|
+
const historicalMessages = [
|
|
95
|
+
createMessage(AgentMessageType.QUESTION, 1_000, 'question from history'),
|
|
96
|
+
createMessage(AgentMessageType.THOUGHT, 1_100, 'thinking from history'),
|
|
97
|
+
createMessage(AgentMessageType.ANSWER, 1_200, 'answer from history'),
|
|
98
|
+
createMessage(AgentMessageType.IDLE, 1_300, 'Waiting for your command...'),
|
|
99
|
+
];
|
|
100
|
+
const streamMessages = vi.fn<
|
|
101
|
+
(
|
|
102
|
+
id: string,
|
|
103
|
+
onMessage?: (message: AgentMessage, exitFn?: (payload: unknown) => void) => void,
|
|
104
|
+
since?: number,
|
|
105
|
+
signal?: AbortSignal,
|
|
106
|
+
options?: AgentRunStreamMessagesOptions,
|
|
107
|
+
) => Promise<unknown>
|
|
108
|
+
>(async (_id, _onMessage, _since, _signal, options) => {
|
|
109
|
+
options?.onHistoryLoaded?.(historicalMessages);
|
|
110
|
+
return null;
|
|
111
|
+
});
|
|
112
|
+
const client = createClient(streamMessages);
|
|
113
|
+
|
|
114
|
+
const { result } = renderHook(() => useAgentStream(client, 'agent-run-1'));
|
|
115
|
+
|
|
116
|
+
await waitFor(() => {
|
|
117
|
+
expect(result.current.initialHistoryStatus).toBe('has_messages');
|
|
118
|
+
expect(result.current.messages.map((message) => message.message)).toEqual([
|
|
119
|
+
'question from history',
|
|
120
|
+
'thinking from history',
|
|
121
|
+
'answer from history',
|
|
122
|
+
'Waiting for your command...',
|
|
123
|
+
]);
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it('marks initial history as errored when the history fetch fails', async () => {
|
|
128
|
+
const streamMessages = vi.fn<
|
|
129
|
+
(
|
|
130
|
+
id: string,
|
|
131
|
+
onMessage?: (message: AgentMessage, exitFn?: (payload: unknown) => void) => void,
|
|
132
|
+
since?: number,
|
|
133
|
+
signal?: AbortSignal,
|
|
134
|
+
options?: AgentRunStreamMessagesOptions,
|
|
135
|
+
) => Promise<unknown>
|
|
136
|
+
>(async (_id, _onMessage, _since, _signal, options) => {
|
|
137
|
+
options?.onHistoryError?.(new Error('history failed'));
|
|
138
|
+
return null;
|
|
139
|
+
});
|
|
140
|
+
const client = createClient(streamMessages);
|
|
141
|
+
|
|
142
|
+
const { result } = renderHook(() => useAgentStream(client, 'agent-run-1'));
|
|
143
|
+
|
|
144
|
+
await waitFor(() => {
|
|
145
|
+
expect(result.current.initialHistoryStatus).toBe('error');
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
|
|
45
149
|
it('reconnects the same agent run from the last delivered timestamp without clearing messages', async () => {
|
|
46
150
|
const complete = createMessage(AgentMessageType.COMPLETE, 1_000, 'done');
|
|
47
151
|
const answer = createMessage(AgentMessageType.ANSWER, 1_100, 'continued');
|
|
@@ -133,7 +237,7 @@ describe('useAgentStream', () => {
|
|
|
133
237
|
});
|
|
134
238
|
});
|
|
135
239
|
|
|
136
|
-
it('dedupes re-delivered messages by timestamp and replaces optimistic questions', async () => {
|
|
240
|
+
it('dedupes re-delivered messages by timestamp and replaces ack-matched optimistic questions', async () => {
|
|
137
241
|
let onStreamMessage: ((message: AgentMessage) => void) | undefined;
|
|
138
242
|
const streamMessages = vi.fn<
|
|
139
243
|
(
|
|
@@ -157,7 +261,7 @@ describe('useAgentStream', () => {
|
|
|
157
261
|
act(() => {
|
|
158
262
|
result.current.addOptimisticMessage({
|
|
159
263
|
...createMessage(AgentMessageType.QUESTION, 1_000, 'optimistic'),
|
|
160
|
-
details: { _optimistic: true, _messageId: 'message-1' },
|
|
264
|
+
details: { _optimistic: true, _messageId: 'message-1', _deliveryStatus: 'sending' },
|
|
161
265
|
});
|
|
162
266
|
});
|
|
163
267
|
|
|
@@ -166,12 +270,13 @@ describe('useAgentStream', () => {
|
|
|
166
270
|
act(() => {
|
|
167
271
|
onStreamMessage?.({
|
|
168
272
|
...createMessage(AgentMessageType.QUESTION, 1_100, 'server question'),
|
|
169
|
-
details: {
|
|
273
|
+
details: { ack: 'message-1' },
|
|
170
274
|
});
|
|
171
275
|
});
|
|
172
276
|
|
|
173
277
|
await waitFor(() => {
|
|
174
278
|
expect(result.current.messages.map((message) => message.message)).toEqual(['server question']);
|
|
279
|
+
expect(result.current.messages[0]?.details?._deliveryStatus).toBe('consumed');
|
|
175
280
|
});
|
|
176
281
|
|
|
177
282
|
const answer = createMessage(AgentMessageType.ANSWER, 1_200, 'answer');
|
|
@@ -185,6 +290,252 @@ describe('useAgentStream', () => {
|
|
|
185
290
|
});
|
|
186
291
|
});
|
|
187
292
|
|
|
293
|
+
it('replaces an ack-matched optimistic stop marker when the workflow consumes Stop', async () => {
|
|
294
|
+
let onStreamMessage: ((message: AgentMessage) => void) | undefined;
|
|
295
|
+
const streamMessages = vi.fn<
|
|
296
|
+
(
|
|
297
|
+
id: string,
|
|
298
|
+
onMessage?: (message: AgentMessage, exitFn?: (payload: unknown) => void) => void,
|
|
299
|
+
since?: number,
|
|
300
|
+
signal?: AbortSignal,
|
|
301
|
+
) => Promise<unknown>
|
|
302
|
+
>(async (_id, onMessage) => {
|
|
303
|
+
onStreamMessage = onMessage;
|
|
304
|
+
return null;
|
|
305
|
+
});
|
|
306
|
+
const client = createClient(streamMessages);
|
|
307
|
+
|
|
308
|
+
const { result } = renderHook(() => useAgentStream(client, 'agent-run-1'));
|
|
309
|
+
|
|
310
|
+
await waitFor(() => {
|
|
311
|
+
expect(onStreamMessage).toBeDefined();
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
act(() => {
|
|
315
|
+
result.current.addOptimisticMessage({
|
|
316
|
+
...createMessage(AgentMessageType.IDLE, 1_000, 'Stopped. Waiting for your command...'),
|
|
317
|
+
details: {
|
|
318
|
+
_optimistic: true,
|
|
319
|
+
_messageId: 'stop-1',
|
|
320
|
+
_deliveryStatus: 'received',
|
|
321
|
+
status_reason: 'user_stopped',
|
|
322
|
+
},
|
|
323
|
+
});
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
act(() => {
|
|
327
|
+
onStreamMessage?.({
|
|
328
|
+
...createMessage(AgentMessageType.IDLE, 1_100, 'Stopped. Waiting for your command...'),
|
|
329
|
+
details: { ack: 'stop-1', status_reason: 'user_stopped' },
|
|
330
|
+
});
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
await waitFor(() => {
|
|
334
|
+
expect(result.current.messages).toHaveLength(1);
|
|
335
|
+
expect(result.current.messages[0]?.timestamp).toBe(1_100);
|
|
336
|
+
expect(result.current.messages[0]?.details?._deliveryStatus).toBe('consumed');
|
|
337
|
+
});
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
it('keeps non-matching optimistic questions when an acknowledged server question arrives', async () => {
|
|
341
|
+
let onStreamMessage: ((message: AgentMessage) => void) | undefined;
|
|
342
|
+
const streamMessages = vi.fn<
|
|
343
|
+
(
|
|
344
|
+
id: string,
|
|
345
|
+
onMessage?: (message: AgentMessage, exitFn?: (payload: unknown) => void) => void,
|
|
346
|
+
since?: number,
|
|
347
|
+
signal?: AbortSignal,
|
|
348
|
+
) => Promise<unknown>
|
|
349
|
+
>(async (_id, onMessage) => {
|
|
350
|
+
onStreamMessage = onMessage;
|
|
351
|
+
return null;
|
|
352
|
+
});
|
|
353
|
+
const client = createClient(streamMessages);
|
|
354
|
+
|
|
355
|
+
const { result } = renderHook(() => useAgentStream(client, 'agent-run-1'));
|
|
356
|
+
|
|
357
|
+
await waitFor(() => {
|
|
358
|
+
expect(onStreamMessage).toBeDefined();
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
act(() => {
|
|
362
|
+
result.current.addOptimisticMessage({
|
|
363
|
+
...createMessage(AgentMessageType.QUESTION, 1_000, 'first optimistic'),
|
|
364
|
+
details: { _optimistic: true, _messageId: 'message-1', _deliveryStatus: 'sending' },
|
|
365
|
+
});
|
|
366
|
+
result.current.addOptimisticMessage({
|
|
367
|
+
...createMessage(AgentMessageType.QUESTION, 1_050, 'second optimistic'),
|
|
368
|
+
details: { _optimistic: true, _messageId: 'message-2', _deliveryStatus: 'sending' },
|
|
369
|
+
});
|
|
370
|
+
});
|
|
371
|
+
|
|
372
|
+
act(() => {
|
|
373
|
+
onStreamMessage?.({
|
|
374
|
+
...createMessage(AgentMessageType.QUESTION, 1_100, 'server second question'),
|
|
375
|
+
details: { ack: 'message-2' },
|
|
376
|
+
});
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
await waitFor(() => {
|
|
380
|
+
expect(result.current.messages.map((message) => message.message)).toEqual([
|
|
381
|
+
'first optimistic',
|
|
382
|
+
'server second question',
|
|
383
|
+
]);
|
|
384
|
+
});
|
|
385
|
+
expect(result.current.messages[0]?.details?._deliveryStatus).toBe('sending');
|
|
386
|
+
expect(result.current.messages[1]?.details?._deliveryStatus).toBe('consumed');
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
it('updates optimistic message delivery status', async () => {
|
|
390
|
+
let onStreamMessage: ((message: AgentMessage) => void) | undefined;
|
|
391
|
+
const streamMessages = vi.fn<
|
|
392
|
+
(
|
|
393
|
+
id: string,
|
|
394
|
+
onMessage?: (message: AgentMessage, exitFn?: (payload: unknown) => void) => void,
|
|
395
|
+
since?: number,
|
|
396
|
+
signal?: AbortSignal,
|
|
397
|
+
) => Promise<unknown>
|
|
398
|
+
>(async (_id, onMessage) => {
|
|
399
|
+
onStreamMessage = onMessage;
|
|
400
|
+
return null;
|
|
401
|
+
});
|
|
402
|
+
const client = createClient(streamMessages);
|
|
403
|
+
|
|
404
|
+
const { result } = renderHook(() => useAgentStream(client, 'agent-run-1'));
|
|
405
|
+
|
|
406
|
+
await waitFor(() => {
|
|
407
|
+
expect(onStreamMessage).toBeDefined();
|
|
408
|
+
});
|
|
409
|
+
|
|
410
|
+
act(() => {
|
|
411
|
+
result.current.addOptimisticMessage({
|
|
412
|
+
...createMessage(AgentMessageType.QUESTION, 1_000, 'optimistic'),
|
|
413
|
+
details: { _optimistic: true, _messageId: 'message-1', _deliveryStatus: 'sending' },
|
|
414
|
+
});
|
|
415
|
+
});
|
|
416
|
+
|
|
417
|
+
act(() => {
|
|
418
|
+
result.current.updateOptimisticMessageStatus('message-1', 'received');
|
|
419
|
+
});
|
|
420
|
+
|
|
421
|
+
expect(result.current.messages[0]?.details?._deliveryStatus).toBe('received');
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
it('uses workflow-run scoped streaming ids so reused activity ids do not collide', async () => {
|
|
425
|
+
let onStreamMessage: ((message: AgentMessage) => void) | undefined;
|
|
426
|
+
const streamMessages = vi.fn<
|
|
427
|
+
(
|
|
428
|
+
id: string,
|
|
429
|
+
onMessage?: (message: AgentMessage, exitFn?: (payload: unknown) => void) => void,
|
|
430
|
+
since?: number,
|
|
431
|
+
signal?: AbortSignal,
|
|
432
|
+
) => Promise<unknown>
|
|
433
|
+
>(async (_id, onMessage) => {
|
|
434
|
+
onStreamMessage = onMessage;
|
|
435
|
+
return null;
|
|
436
|
+
});
|
|
437
|
+
const client = createClient(streamMessages);
|
|
438
|
+
|
|
439
|
+
const { result } = renderHook(() => useAgentStream(client, 'agent-run-1'));
|
|
440
|
+
|
|
441
|
+
await waitFor(() => {
|
|
442
|
+
expect(onStreamMessage).toBeDefined();
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
act(() => {
|
|
446
|
+
onStreamMessage?.({
|
|
447
|
+
...createMessage(AgentMessageType.STREAMING_CHUNK, 1_000, 'first'),
|
|
448
|
+
details: {
|
|
449
|
+
streaming_id: 'run-a-activity-7',
|
|
450
|
+
streaming_id_scope: 'workflow_run',
|
|
451
|
+
activity_id: 'activity-7',
|
|
452
|
+
is_final: false,
|
|
453
|
+
},
|
|
454
|
+
});
|
|
455
|
+
onStreamMessage?.({
|
|
456
|
+
...createMessage(AgentMessageType.STREAMING_CHUNK, 1_010, 'second'),
|
|
457
|
+
details: {
|
|
458
|
+
streaming_id: 'run-b-activity-7',
|
|
459
|
+
streaming_id_scope: 'workflow_run',
|
|
460
|
+
activity_id: 'activity-7',
|
|
461
|
+
is_final: false,
|
|
462
|
+
},
|
|
463
|
+
});
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
await waitFor(() => {
|
|
467
|
+
expect([...result.current.streamingMessages.keys()].sort()).toEqual([
|
|
468
|
+
'run-a-activity-7',
|
|
469
|
+
'run-b-activity-7',
|
|
470
|
+
]);
|
|
471
|
+
});
|
|
472
|
+
|
|
473
|
+
act(() => {
|
|
474
|
+
onStreamMessage?.({
|
|
475
|
+
...createMessage(AgentMessageType.ANSWER, 1_100, 'final second'),
|
|
476
|
+
details: {
|
|
477
|
+
streaming_id: 'run-b-activity-7',
|
|
478
|
+
streaming_id_scope: 'workflow_run',
|
|
479
|
+
activity_id: 'activity-7',
|
|
480
|
+
},
|
|
481
|
+
});
|
|
482
|
+
});
|
|
483
|
+
|
|
484
|
+
await waitFor(() => {
|
|
485
|
+
expect([...result.current.streamingMessages.keys()]).toEqual(['run-a-activity-7']);
|
|
486
|
+
});
|
|
487
|
+
});
|
|
488
|
+
|
|
489
|
+
it('keeps legacy activity-id cleanup for streaming chunks without scoped streaming ids', async () => {
|
|
490
|
+
let onStreamMessage: ((message: AgentMessage) => void) | undefined;
|
|
491
|
+
const streamMessages = vi.fn<
|
|
492
|
+
(
|
|
493
|
+
id: string,
|
|
494
|
+
onMessage?: (message: AgentMessage, exitFn?: (payload: unknown) => void) => void,
|
|
495
|
+
since?: number,
|
|
496
|
+
signal?: AbortSignal,
|
|
497
|
+
) => Promise<unknown>
|
|
498
|
+
>(async (_id, onMessage) => {
|
|
499
|
+
onStreamMessage = onMessage;
|
|
500
|
+
return null;
|
|
501
|
+
});
|
|
502
|
+
const client = createClient(streamMessages);
|
|
503
|
+
|
|
504
|
+
const { result } = renderHook(() => useAgentStream(client, 'agent-run-1'));
|
|
505
|
+
|
|
506
|
+
await waitFor(() => {
|
|
507
|
+
expect(onStreamMessage).toBeDefined();
|
|
508
|
+
});
|
|
509
|
+
|
|
510
|
+
act(() => {
|
|
511
|
+
onStreamMessage?.({
|
|
512
|
+
...createMessage(AgentMessageType.STREAMING_CHUNK, 1_000, 'legacy'),
|
|
513
|
+
details: {
|
|
514
|
+
streaming_id: 'main',
|
|
515
|
+
activity_id: 'legacy-activity',
|
|
516
|
+
is_final: false,
|
|
517
|
+
},
|
|
518
|
+
});
|
|
519
|
+
});
|
|
520
|
+
|
|
521
|
+
await waitFor(() => {
|
|
522
|
+
expect([...result.current.streamingMessages.keys()]).toEqual(['legacy-activity']);
|
|
523
|
+
});
|
|
524
|
+
|
|
525
|
+
act(() => {
|
|
526
|
+
onStreamMessage?.({
|
|
527
|
+
...createMessage(AgentMessageType.ANSWER, 1_100, 'legacy final'),
|
|
528
|
+
details: {
|
|
529
|
+
activity_id: 'legacy-activity',
|
|
530
|
+
},
|
|
531
|
+
});
|
|
532
|
+
});
|
|
533
|
+
|
|
534
|
+
await waitFor(() => {
|
|
535
|
+
expect(result.current.streamingMessages.size).toBe(0);
|
|
536
|
+
});
|
|
537
|
+
});
|
|
538
|
+
|
|
188
539
|
it('replaces file processing status with the latest server snapshot', async () => {
|
|
189
540
|
let onStreamMessage: ((message: AgentMessage) => void) | undefined;
|
|
190
541
|
const streamMessages = vi.fn<
|