@stigmer/react 3.1.17 → 3.2.0
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/agent-instance/AgentInstanceList.d.ts.map +1 -1
- package/agent-instance/AgentInstanceList.js +11 -3
- package/agent-instance/AgentInstanceList.js.map +1 -1
- package/channel/AgentChannelsPanel.d.ts +60 -0
- package/channel/AgentChannelsPanel.d.ts.map +1 -0
- package/channel/AgentChannelsPanel.js +255 -0
- package/channel/AgentChannelsPanel.js.map +1 -0
- package/channel/ChannelConversationsDialog.d.ts +41 -0
- package/channel/ChannelConversationsDialog.d.ts.map +1 -0
- package/channel/ChannelConversationsDialog.js +94 -0
- package/channel/ChannelConversationsDialog.js.map +1 -0
- package/channel/ChannelCredentialsDialog.d.ts +37 -0
- package/channel/ChannelCredentialsDialog.d.ts.map +1 -0
- package/channel/ChannelCredentialsDialog.js +75 -0
- package/channel/ChannelCredentialsDialog.js.map +1 -0
- package/channel/ChannelToolCredentials.d.ts +31 -0
- package/channel/ChannelToolCredentials.d.ts.map +1 -0
- package/channel/ChannelToolCredentials.js +41 -0
- package/channel/ChannelToolCredentials.js.map +1 -0
- package/channel/ConnectSlackDialog.d.ts +61 -0
- package/channel/ConnectSlackDialog.d.ts.map +1 -0
- package/channel/ConnectSlackDialog.js +238 -0
- package/channel/ConnectSlackDialog.js.map +1 -0
- package/channel/ConnectWhatsAppDialog.d.ts +70 -0
- package/channel/ConnectWhatsAppDialog.d.ts.map +1 -0
- package/channel/ConnectWhatsAppDialog.js +256 -0
- package/channel/ConnectWhatsAppDialog.js.map +1 -0
- package/channel/SlackMarkIcon.d.ts +11 -0
- package/channel/SlackMarkIcon.d.ts.map +1 -0
- package/channel/SlackMarkIcon.js +13 -0
- package/channel/SlackMarkIcon.js.map +1 -0
- package/channel/WhatsAppMarkIcon.d.ts +12 -0
- package/channel/WhatsAppMarkIcon.d.ts.map +1 -0
- package/channel/WhatsAppMarkIcon.js +14 -0
- package/channel/WhatsAppMarkIcon.js.map +1 -0
- package/channel/connect/ServingAppSection.d.ts +57 -0
- package/channel/connect/ServingAppSection.d.ts.map +1 -0
- package/channel/connect/ServingAppSection.js +49 -0
- package/channel/connect/ServingAppSection.js.map +1 -0
- package/channel/connect/ToolCredentialsSection.d.ts +20 -0
- package/channel/connect/ToolCredentialsSection.d.ts.map +1 -0
- package/channel/connect/ToolCredentialsSection.js +22 -0
- package/channel/connect/ToolCredentialsSection.js.map +1 -0
- package/channel/connect/VerbatimRefusal.d.ts +16 -0
- package/channel/connect/VerbatimRefusal.d.ts.map +1 -0
- package/channel/connect/VerbatimRefusal.js +18 -0
- package/channel/connect/VerbatimRefusal.js.map +1 -0
- package/channel/connect/icons.d.ts +16 -0
- package/channel/connect/icons.d.ts.map +1 -0
- package/channel/connect/icons.js +21 -0
- package/channel/connect/icons.js.map +1 -0
- package/channel/index.d.ts +36 -0
- package/channel/index.d.ts.map +1 -0
- package/channel/index.js +19 -0
- package/channel/index.js.map +1 -0
- package/channel/providerPresentation.d.ts +44 -0
- package/channel/providerPresentation.d.ts.map +1 -0
- package/channel/providerPresentation.js +106 -0
- package/channel/providerPresentation.js.map +1 -0
- package/channel/providers.d.ts +62 -0
- package/channel/providers.d.ts.map +1 -0
- package/channel/providers.js +26 -0
- package/channel/providers.js.map +1 -0
- package/channel/useAgentChannel.d.ts +31 -0
- package/channel/useAgentChannel.d.ts.map +1 -0
- package/channel/useAgentChannel.js +34 -0
- package/channel/useAgentChannel.js.map +1 -0
- package/channel/useAgentChannelList.d.ts +43 -0
- package/channel/useAgentChannelList.d.ts.map +1 -0
- package/channel/useAgentChannelList.js +39 -0
- package/channel/useAgentChannelList.js.map +1 -0
- package/channel/useChannelSessions.d.ts +47 -0
- package/channel/useChannelSessions.d.ts.map +1 -0
- package/channel/useChannelSessions.js +38 -0
- package/channel/useChannelSessions.js.map +1 -0
- package/channel/useChannelToolReadiness.d.ts +23 -0
- package/channel/useChannelToolReadiness.d.ts.map +1 -0
- package/channel/useChannelToolReadiness.js +28 -0
- package/channel/useChannelToolReadiness.js.map +1 -0
- package/channel/useConnectSlackChannel.d.ts +75 -0
- package/channel/useConnectSlackChannel.d.ts.map +1 -0
- package/channel/useConnectSlackChannel.js +115 -0
- package/channel/useConnectSlackChannel.js.map +1 -0
- package/channel/useCreateAgentChannel.d.ts +42 -0
- package/channel/useCreateAgentChannel.d.ts.map +1 -0
- package/channel/useCreateAgentChannel.js +48 -0
- package/channel/useCreateAgentChannel.js.map +1 -0
- package/channel/useDeleteAgentChannel.d.ts +40 -0
- package/channel/useDeleteAgentChannel.d.ts.map +1 -0
- package/channel/useDeleteAgentChannel.js +44 -0
- package/channel/useDeleteAgentChannel.js.map +1 -0
- package/channel/useInstallChannel.d.ts +60 -0
- package/channel/useInstallChannel.d.ts.map +1 -0
- package/channel/useInstallChannel.js +63 -0
- package/channel/useInstallChannel.js.map +1 -0
- package/channel/useOrgAgentChannelList.d.ts +32 -0
- package/channel/useOrgAgentChannelList.d.ts.map +1 -0
- package/channel/useOrgAgentChannelList.js +29 -0
- package/channel/useOrgAgentChannelList.js.map +1 -0
- package/channel/useSaveAgentChannel.d.ts +63 -0
- package/channel/useSaveAgentChannel.d.ts.map +1 -0
- package/channel/useSaveAgentChannel.js +104 -0
- package/channel/useSaveAgentChannel.js.map +1 -0
- package/channel-app/ChannelAppDetailPanel.d.ts +46 -0
- package/channel-app/ChannelAppDetailPanel.d.ts.map +1 -0
- package/channel-app/ChannelAppDetailPanel.js +142 -0
- package/channel-app/ChannelAppDetailPanel.js.map +1 -0
- package/channel-app/ChannelAppListPanel.d.ts +36 -0
- package/channel-app/ChannelAppListPanel.d.ts.map +1 -0
- package/channel-app/ChannelAppListPanel.js +63 -0
- package/channel-app/ChannelAppListPanel.js.map +1 -0
- package/channel-app/CreateChannelAppForm.d.ts +54 -0
- package/channel-app/CreateChannelAppForm.d.ts.map +1 -0
- package/channel-app/CreateChannelAppForm.js +140 -0
- package/channel-app/CreateChannelAppForm.js.map +1 -0
- package/channel-app/index.d.ts +18 -0
- package/channel-app/index.d.ts.map +1 -0
- package/channel-app/index.js +10 -0
- package/channel-app/index.js.map +1 -0
- package/channel-app/internal.d.ts +33 -0
- package/channel-app/internal.d.ts.map +1 -0
- package/channel-app/internal.js +44 -0
- package/channel-app/internal.js.map +1 -0
- package/channel-app/slackAppSetup.d.ts +80 -0
- package/channel-app/slackAppSetup.d.ts.map +1 -0
- package/channel-app/slackAppSetup.js +123 -0
- package/channel-app/slackAppSetup.js.map +1 -0
- package/channel-app/useChannelAppList.d.ts +35 -0
- package/channel-app/useChannelAppList.d.ts.map +1 -0
- package/channel-app/useChannelAppList.js +34 -0
- package/channel-app/useChannelAppList.js.map +1 -0
- package/channel-app/useCreateChannelApp.d.ts +39 -0
- package/channel-app/useCreateChannelApp.d.ts.map +1 -0
- package/channel-app/useCreateChannelApp.js +50 -0
- package/channel-app/useCreateChannelApp.js.map +1 -0
- package/channel-app/useDeleteChannelApp.d.ts +31 -0
- package/channel-app/useDeleteChannelApp.d.ts.map +1 -0
- package/channel-app/useDeleteChannelApp.js +43 -0
- package/channel-app/useDeleteChannelApp.js.map +1 -0
- package/channel-app/useUpdateChannelApp.d.ts +39 -0
- package/channel-app/useUpdateChannelApp.d.ts.map +1 -0
- package/channel-app/useUpdateChannelApp.js +50 -0
- package/channel-app/useUpdateChannelApp.js.map +1 -0
- package/channel-app/whatsappAppSetup.d.ts +51 -0
- package/channel-app/whatsappAppSetup.d.ts.map +1 -0
- package/channel-app/whatsappAppSetup.js +57 -0
- package/channel-app/whatsappAppSetup.js.map +1 -0
- package/environment/index.d.ts +2 -0
- package/environment/index.d.ts.map +1 -1
- package/environment/index.js +1 -0
- package/environment/index.js.map +1 -1
- package/environment/useToolCredentialsReadiness.d.ts +52 -0
- package/environment/useToolCredentialsReadiness.d.ts.map +1 -0
- package/environment/useToolCredentialsReadiness.js +84 -0
- package/environment/useToolCredentialsReadiness.js.map +1 -0
- package/execution/ArtifactContentBody.d.ts.map +1 -1
- package/execution/ArtifactContentBody.js +5 -21
- package/execution/ArtifactContentBody.js.map +1 -1
- package/execution/ArtifactFileContent.d.ts +28 -0
- package/execution/ArtifactFileContent.d.ts.map +1 -0
- package/execution/ArtifactFileContent.js +36 -0
- package/execution/ArtifactFileContent.js.map +1 -0
- package/execution/ArtifactRow.d.ts +8 -20
- package/execution/ArtifactRow.d.ts.map +1 -1
- package/execution/ArtifactRow.js +12 -45
- package/execution/ArtifactRow.js.map +1 -1
- package/execution/ArtifactRowView.d.ts +43 -0
- package/execution/ArtifactRowView.d.ts.map +1 -0
- package/execution/ArtifactRowView.js +35 -0
- package/execution/ArtifactRowView.js.map +1 -0
- package/execution/FileChangesView.d.ts.map +1 -1
- package/execution/FileChangesView.js +1 -61
- package/execution/FileChangesView.js.map +1 -1
- package/execution/SubAgentSection.d.ts.map +1 -1
- package/execution/SubAgentSection.js +4 -15
- package/execution/SubAgentSection.js.map +1 -1
- package/execution/ToolCallItem.d.ts.map +1 -1
- package/execution/ToolCallItem.js +16 -61
- package/execution/ToolCallItem.js.map +1 -1
- package/execution/agent-execution-document.d.ts +31 -0
- package/execution/agent-execution-document.d.ts.map +1 -0
- package/execution/agent-execution-document.js +48 -0
- package/execution/agent-execution-document.js.map +1 -0
- package/{session → execution}/artifact-document.d.ts +2 -3
- package/execution/artifact-document.d.ts.map +1 -0
- package/execution/artifact-document.js +23 -0
- package/execution/artifact-document.js.map +1 -0
- package/execution/artifact-row-item.d.ts +56 -0
- package/execution/artifact-row-item.d.ts.map +1 -0
- package/execution/artifact-row-item.js +57 -0
- package/execution/artifact-row-item.js.map +1 -0
- package/execution/deriveExecutionFileChanges.d.ts +55 -0
- package/execution/deriveExecutionFileChanges.d.ts.map +1 -0
- package/execution/deriveExecutionFileChanges.js +216 -0
- package/execution/deriveExecutionFileChanges.js.map +1 -0
- package/execution/file-change-document.d.ts +22 -0
- package/execution/file-change-document.d.ts.map +1 -0
- package/execution/file-change-document.js +34 -0
- package/execution/file-change-document.js.map +1 -0
- package/execution/index.d.ts +14 -0
- package/execution/index.d.ts.map +1 -1
- package/execution/index.js +9 -0
- package/execution/index.js.map +1 -1
- package/execution/useArtifactContentById.d.ts +61 -0
- package/execution/useArtifactContentById.d.ts.map +1 -0
- package/execution/useArtifactContentById.js +63 -0
- package/execution/useArtifactContentById.js.map +1 -0
- package/execution/useArtifactDownload.d.ts +4 -3
- package/execution/useArtifactDownload.d.ts.map +1 -1
- package/execution/useArtifactDownload.js +4 -3
- package/execution/useArtifactDownload.js.map +1 -1
- package/execution/useCreateAgentExecution.d.ts +1 -1
- package/execution/useLiveAgentExecution.d.ts +59 -0
- package/execution/useLiveAgentExecution.d.ts.map +1 -0
- package/execution/useLiveAgentExecution.js +73 -0
- package/execution/useLiveAgentExecution.js.map +1 -0
- package/index.d.ts +15 -10
- package/index.d.ts.map +1 -1
- package/index.js +21 -6
- package/index.js.map +1 -1
- package/internal/DecisionButton.d.ts +4 -3
- package/internal/DecisionButton.d.ts.map +1 -1
- package/internal/DecisionButton.js +4 -3
- package/internal/DecisionButton.js.map +1 -1
- package/internal/oauthPopup.d.ts +101 -0
- package/internal/oauthPopup.d.ts.map +1 -0
- package/internal/oauthPopup.js +208 -0
- package/internal/oauthPopup.js.map +1 -0
- package/internal/store/index.d.ts +0 -2
- package/internal/store/index.d.ts.map +1 -1
- package/internal/store/index.js +0 -1
- package/internal/store/index.js.map +1 -1
- package/internal/store/workflow-execution-event-store.d.ts +34 -1
- package/internal/store/workflow-execution-event-store.d.ts.map +1 -1
- package/internal/store/workflow-execution-event-store.js +81 -3
- package/internal/store/workflow-execution-event-store.js.map +1 -1
- package/internal/store/workspace-file-selection-store.d.ts +1 -2
- package/internal/store/workspace-file-selection-store.d.ts.map +1 -1
- package/internal/store/workspace-file-selection-store.js +2 -5
- package/internal/store/workspace-file-selection-store.js.map +1 -1
- package/internal/thread-card/ThreadCardShell.d.ts +91 -0
- package/internal/thread-card/ThreadCardShell.d.ts.map +1 -0
- package/internal/thread-card/ThreadCardShell.js +41 -0
- package/internal/thread-card/ThreadCardShell.js.map +1 -0
- package/internal/thread-card/glyphs.d.ts +34 -0
- package/internal/thread-card/glyphs.d.ts.map +1 -0
- package/internal/thread-card/glyphs.js +50 -0
- package/internal/thread-card/glyphs.js.map +1 -0
- package/internal/thread-card/index.d.ts +3 -0
- package/internal/thread-card/index.d.ts.map +1 -0
- package/internal/thread-card/index.js +3 -0
- package/internal/thread-card/index.js.map +1 -0
- package/internal/useRevealLine.d.ts +2 -2
- package/internal/useRevealLine.js +2 -2
- package/mcp-server/OAuthCallbackHandler.js +1 -1
- package/mcp-server/OAuthCallbackHandler.js.map +1 -1
- package/mcp-server/useMcpServerOAuthConnect.d.ts +4 -23
- package/mcp-server/useMcpServerOAuthConnect.d.ts.map +1 -1
- package/mcp-server/useMcpServerOAuthConnect.js +12 -145
- package/mcp-server/useMcpServerOAuthConnect.js.map +1 -1
- package/package.json +4 -4
- package/session/NewSessionViewer.d.ts.map +1 -1
- package/session/NewSessionViewer.js +0 -1
- package/session/NewSessionViewer.js.map +1 -1
- package/session/SessionPanelChip.d.ts +7 -22
- package/session/SessionPanelChip.d.ts.map +1 -1
- package/session/SessionPanelChip.js +8 -36
- package/session/SessionPanelChip.js.map +1 -1
- package/session/SessionViewer.d.ts +7 -4
- package/session/SessionViewer.d.ts.map +1 -1
- package/session/SessionViewer.js +32 -30
- package/session/SessionViewer.js.map +1 -1
- package/session/audience.d.ts +15 -1
- package/session/audience.d.ts.map +1 -1
- package/session/channelOrigin.d.ts +33 -0
- package/session/channelOrigin.d.ts.map +1 -0
- package/session/channelOrigin.js +36 -0
- package/session/channelOrigin.js.map +1 -0
- package/session/facets/index.d.ts +0 -2
- package/session/facets/index.d.ts.map +1 -1
- package/session/facets/index.js +0 -1
- package/session/facets/index.js.map +1 -1
- package/session/index.d.ts +2 -2
- package/session/index.d.ts.map +1 -1
- package/session/index.js +5 -3
- package/session/index.js.map +1 -1
- package/session/useSessionFileChanges.d.ts +10 -34
- package/session/useSessionFileChanges.d.ts.map +1 -1
- package/session/useSessionFileChanges.js +9 -141
- package/session/useSessionFileChanges.js.map +1 -1
- package/session/useSessionPanel.d.ts +5 -15
- package/session/useSessionPanel.d.ts.map +1 -1
- package/session/useSessionPanel.js +3 -35
- package/session/useSessionPanel.js.map +1 -1
- package/session/useSessionRailViews.d.ts +3 -6
- package/session/useSessionRailViews.d.ts.map +1 -1
- package/session/useSessionRailViews.js +3 -17
- package/session/useSessionRailViews.js.map +1 -1
- package/settings/ChannelAppsSection.d.ts +13 -0
- package/settings/ChannelAppsSection.d.ts.map +1 -0
- package/settings/ChannelAppsSection.js +48 -0
- package/settings/ChannelAppsSection.js.map +1 -0
- package/settings/index.d.ts +1 -0
- package/settings/index.d.ts.map +1 -1
- package/settings/index.js +1 -0
- package/settings/index.js.map +1 -1
- package/settings/settings-nav.d.ts.map +1 -1
- package/settings/settings-nav.js +6 -1
- package/settings/settings-nav.js.map +1 -1
- package/sharing/AgentShareList.d.ts.map +1 -1
- package/sharing/AgentShareList.js +11 -3
- package/sharing/AgentShareList.js.map +1 -1
- package/sharing/ShareAgentDialog.js +1 -1
- package/sharing/useShareToolReadiness.d.ts +9 -38
- package/sharing/useShareToolReadiness.d.ts.map +1 -1
- package/sharing/useShareToolReadiness.js +7 -72
- package/sharing/useShareToolReadiness.js.map +1 -1
- package/src/agent-instance/AgentInstanceList.tsx +60 -42
- package/src/agent-instance/__tests__/AgentInstanceList.test.tsx +161 -0
- package/src/channel/AgentChannelsPanel.tsx +688 -0
- package/src/channel/ChannelConversationsDialog.tsx +267 -0
- package/src/channel/ChannelCredentialsDialog.tsx +219 -0
- package/src/channel/ChannelToolCredentials.tsx +124 -0
- package/src/channel/ConnectSlackDialog.tsx +611 -0
- package/src/channel/ConnectWhatsAppDialog.tsx +624 -0
- package/src/channel/SlackMarkIcon.tsx +21 -0
- package/src/channel/WhatsAppMarkIcon.tsx +22 -0
- package/src/channel/__tests__/AgentChannelsPanel.test.tsx +638 -0
- package/src/channel/__tests__/ChannelConversationsDialog.test.tsx +114 -0
- package/src/channel/__tests__/ChannelCredentialsDialog.test.tsx +240 -0
- package/src/channel/__tests__/ConnectSlackDialog.test.tsx +659 -0
- package/src/channel/__tests__/ConnectWhatsAppDialog.test.tsx +564 -0
- package/src/channel/__tests__/providers.test.ts +118 -0
- package/src/channel/__tests__/useAgentChannel.test.tsx +116 -0
- package/src/channel/__tests__/useAgentChannelList.test.tsx +166 -0
- package/src/channel/__tests__/useChannelSessions.test.tsx +95 -0
- package/src/channel/__tests__/useChannelToolReadiness.test.tsx +158 -0
- package/src/channel/__tests__/useConnectSlackChannel.test.tsx +276 -0
- package/src/channel/__tests__/useDeleteAgentChannel.test.tsx +97 -0
- package/src/channel/__tests__/useInstallChannel.test.tsx +177 -0
- package/src/channel/__tests__/useSaveAgentChannel.test.tsx +294 -0
- package/src/channel/connect/ServingAppSection.tsx +185 -0
- package/src/channel/connect/ToolCredentialsSection.tsx +67 -0
- package/src/channel/connect/VerbatimRefusal.tsx +27 -0
- package/src/channel/connect/icons.tsx +42 -0
- package/src/channel/index.ts +65 -0
- package/src/channel/providerPresentation.ts +154 -0
- package/src/channel/providers.ts +73 -0
- package/src/channel/useAgentChannel.ts +58 -0
- package/src/channel/useAgentChannelList.ts +69 -0
- package/src/channel/useChannelSessions.ts +73 -0
- package/src/channel/useChannelToolReadiness.ts +39 -0
- package/src/channel/useConnectSlackChannel.ts +195 -0
- package/src/channel/useCreateAgentChannel.ts +73 -0
- package/src/channel/useDeleteAgentChannel.ts +71 -0
- package/src/channel/useInstallChannel.ts +117 -0
- package/src/channel/useOrgAgentChannelList.ts +60 -0
- package/src/channel/useSaveAgentChannel.ts +133 -0
- package/src/channel-app/ChannelAppDetailPanel.tsx +510 -0
- package/src/channel-app/ChannelAppListPanel.tsx +201 -0
- package/src/channel-app/CreateChannelAppForm.tsx +529 -0
- package/src/channel-app/__tests__/channelAppWhatsApp.test.tsx +270 -0
- package/src/channel-app/__tests__/slackAppSetup.test.ts +75 -0
- package/src/channel-app/__tests__/useChannelAppHooks.test.tsx +157 -0
- package/src/channel-app/__tests__/whatsappAppSetup.test.ts +39 -0
- package/src/channel-app/index.ts +30 -0
- package/src/channel-app/internal.tsx +180 -0
- package/src/channel-app/slackAppSetup.ts +153 -0
- package/src/channel-app/useChannelAppList.ts +59 -0
- package/src/channel-app/useCreateChannelApp.ts +70 -0
- package/src/channel-app/useDeleteChannelApp.ts +62 -0
- package/src/channel-app/useUpdateChannelApp.ts +70 -0
- package/src/channel-app/whatsappAppSetup.ts +62 -0
- package/src/environment/index.ts +2 -0
- package/src/environment/useToolCredentialsReadiness.ts +122 -0
- package/src/execution/ArtifactContentBody.tsx +6 -88
- package/src/execution/ArtifactFileContent.tsx +110 -0
- package/src/execution/ArtifactRow.tsx +28 -118
- package/src/execution/ArtifactRowView.tsx +137 -0
- package/src/execution/FileChangesView.tsx +4 -69
- package/src/execution/SubAgentSection.tsx +2 -36
- package/src/execution/ToolCallItem.tsx +48 -175
- package/src/execution/__tests__/ArtifactFileContent.test.tsx +60 -0
- package/src/execution/__tests__/ArtifactRowView.test.tsx +78 -0
- package/src/execution/__tests__/agent-execution-document.test.ts +45 -0
- package/src/execution/__tests__/artifact-row-item.test.ts +128 -0
- package/src/execution/__tests__/deriveExecutionFileChanges.test.ts +270 -0
- package/src/execution/__tests__/useArtifactContentById.test.tsx +85 -0
- package/src/execution/__tests__/useLiveAgentExecution.test.tsx +202 -0
- package/src/execution/agent-execution-document.ts +54 -0
- package/src/execution/artifact-document.ts +24 -0
- package/src/execution/artifact-row-item.ts +97 -0
- package/src/execution/deriveExecutionFileChanges.ts +237 -0
- package/src/execution/file-change-document.ts +37 -0
- package/src/execution/index.ts +36 -0
- package/src/execution/useArtifactContentById.ts +120 -0
- package/src/execution/useArtifactDownload.ts +4 -3
- package/src/execution/useCreateAgentExecution.ts +1 -1
- package/src/execution/useLiveAgentExecution.ts +127 -0
- package/src/index.ts +155 -11
- package/src/internal/DecisionButton.tsx +4 -3
- package/src/internal/__tests__/ThreadCardShell.test.tsx +105 -0
- package/src/internal/__tests__/oauthPopup.test.ts +245 -0
- package/src/internal/oauthPopup.ts +261 -0
- package/src/internal/store/__tests__/workflow-execution-event-store.test.ts +375 -5
- package/src/internal/store/index.ts +0 -3
- package/src/internal/store/workflow-execution-event-store.ts +123 -4
- package/src/internal/store/workspace-file-selection-store.ts +2 -5
- package/src/internal/thread-card/ThreadCardShell.tsx +189 -0
- package/src/internal/thread-card/glyphs.tsx +108 -0
- package/src/internal/thread-card/index.ts +19 -0
- package/src/internal/useRevealLine.ts +2 -2
- package/src/mcp-server/OAuthCallbackHandler.tsx +2 -2
- package/src/mcp-server/useMcpServerOAuthConnect.ts +22 -184
- package/src/session/NewSessionViewer.tsx +0 -1
- package/src/session/SessionPanelChip.tsx +10 -96
- package/src/session/SessionViewer.tsx +170 -144
- package/src/session/__tests__/SessionViewer-artifactTabs.test.tsx +1 -1
- package/src/session/__tests__/observerAudience.test.tsx +241 -0
- package/src/session/__tests__/useSessionPanel.test.ts +6 -61
- package/src/session/__tests__/useSessionRailViews.test.tsx +5 -27
- package/src/session/audience.ts +15 -1
- package/src/session/channelOrigin.ts +45 -0
- package/src/session/facets/index.ts +0 -3
- package/src/session/index.ts +9 -6
- package/src/session/useSessionFileChanges.ts +12 -153
- package/src/session/useSessionPanel.ts +8 -51
- package/src/session/useSessionRailViews.tsx +2 -27
- package/src/settings/ChannelAppsSection.tsx +133 -0
- package/src/settings/index.ts +1 -0
- package/src/settings/settings-nav.ts +6 -0
- package/src/sharing/AgentShareList.tsx +85 -64
- package/src/sharing/ShareAgentDialog.tsx +1 -1
- package/src/sharing/__tests__/AgentShareList.test.tsx +92 -12
- package/src/sharing/useShareToolReadiness.ts +13 -101
- package/src/workflow/WorkflowAgentExecutionDocument.tsx +283 -0
- package/src/workflow/WorkflowApprovalList.tsx +158 -0
- package/src/workflow/WorkflowArtifactDocument.tsx +257 -0
- package/src/workflow/WorkflowExecutionGraph.tsx +40 -78
- package/src/workflow/WorkflowExecutionViewer.tsx +610 -287
- package/src/workflow/WorkflowFileReviewList.tsx +1 -1
- package/src/workflow/WorkflowTaskApprovalCard.tsx +5 -4
- package/src/workflow/WorkflowTaskApprovalSummary.tsx +6 -6
- package/src/workflow/__tests__/WorkflowAgentExecutionDocument.test.tsx +651 -0
- package/src/workflow/__tests__/WorkflowApprovalList.test.tsx +229 -0
- package/src/workflow/__tests__/WorkflowArtifactDocument.test.tsx +90 -0
- package/src/workflow/__tests__/WorkflowArtifactsTab.test.tsx +85 -0
- package/src/workflow/__tests__/WorkflowChangesTab.test.tsx +113 -0
- package/src/workflow/__tests__/WorkflowExecutionViewer.approvals.test.tsx +473 -0
- package/src/workflow/__tests__/WorkflowExecutionViewer.reconciliation.test.tsx +632 -0
- package/src/workflow/__tests__/WorkflowTaskApprovalSummary.test.tsx +1 -1
- package/src/workflow/__tests__/WorkflowTaskThread.test.tsx +947 -0
- package/src/workflow/__tests__/WorkflowUsageTab.test.tsx +163 -0
- package/src/workflow/__tests__/agent-call-live-experience.test.ts +6 -53
- package/src/workflow/__tests__/derive-execution-overlays.test.ts +4 -0
- package/src/workflow/__tests__/deriveWorkflowArtifactItems.test.ts +71 -0
- package/src/workflow/__tests__/deriveWorkflowUsageItems.test.ts +132 -0
- package/src/workflow/__tests__/execution-graph.test.ts +8 -0
- package/src/workflow/__tests__/project-thread-items.test.ts +428 -0
- package/src/workflow/__tests__/structured-data-viewer.test.tsx +1 -1
- package/src/workflow/__tests__/task-approval.test.ts +149 -0
- package/src/workflow/__tests__/task-detail-io.test.ts +40 -0
- package/src/workflow/__tests__/task-presentation.test.ts +479 -0
- package/src/workflow/__tests__/useActiveTaskName.test.ts +4 -0
- package/src/workflow/__tests__/useApprovalBoundary.test.ts +158 -0
- package/src/workflow/__tests__/useExecutionAnnouncements.test.ts +4 -0
- package/src/workflow/__tests__/useFollowExecution.test.ts +2 -89
- package/src/workflow/__tests__/useWorkflowExecutionFileChanges.test.tsx +412 -0
- package/src/workflow/__tests__/useWorkflowExecutionPanel.test.ts +297 -0
- package/src/workflow/__tests__/useWorkflowExecutionRailViews.test.tsx +115 -0
- package/src/workflow/deriveWorkflowArtifactItems.ts +59 -0
- package/src/workflow/deriveWorkflowUsageItems.ts +73 -0
- package/src/workflow/diagnosis-document.ts +31 -0
- package/src/workflow/execution/index.ts +0 -15
- package/src/workflow/facets/WorkflowArtifactsTab.tsx +99 -0
- package/src/workflow/facets/WorkflowChangesTab.tsx +129 -0
- package/src/workflow/facets/WorkflowUsageTab.tsx +258 -0
- package/src/workflow/format-utils.ts +2 -3
- package/src/workflow/index.ts +106 -62
- package/src/workflow/inspector/index.ts +0 -4
- package/src/workflow/instance/WorkflowInstanceList.tsx +59 -41
- package/src/workflow/instance/__tests__/WorkflowInstanceList.test.tsx +156 -0
- package/src/workflow/task-detail/index.ts +11 -0
- package/src/workflow/task-detail/task-approval.ts +158 -0
- package/src/workflow/task-detail/task-detail-io.ts +65 -0
- package/src/workflow/thread/WorkflowTaskThread.tsx +845 -0
- package/src/workflow/thread/project-thread-items.ts +235 -0
- package/src/workflow/thread/task-presentation.ts +427 -0
- package/src/workflow/thread/thread-presentation.ts +59 -0
- package/src/workflow/thread/useWorkflowThreadItems.ts +34 -0
- package/src/workflow/useApprovalBoundary.ts +72 -0
- package/src/workflow/useFollowExecution.ts +0 -26
- package/src/workflow/useWorkflowArtifactDownload.ts +68 -0
- package/src/workflow/useWorkflowExecutionActions.ts +3 -2
- package/src/workflow/useWorkflowExecutionFileChanges.ts +341 -0
- package/src/workflow/useWorkflowExecutionGraph.ts +3 -43
- package/src/workflow/useWorkflowExecutionPanel.ts +292 -0
- package/src/workflow/useWorkflowExecutionRailViews.tsx +173 -0
- package/src/workspace/FileViewer.tsx +3 -3
- package/src/workspace/PanelChip.tsx +103 -0
- package/src/workspace/WorkspaceSurface.tsx +50 -6
- package/src/workspace/__tests__/WorkspaceSurface.test.tsx +110 -0
- package/src/workspace/index.ts +3 -0
- package/styles.css +1 -1
- package/workflow/WorkflowAgentExecutionDocument.d.ts +79 -0
- package/workflow/WorkflowAgentExecutionDocument.d.ts.map +1 -0
- package/workflow/WorkflowAgentExecutionDocument.js +87 -0
- package/workflow/WorkflowAgentExecutionDocument.js.map +1 -0
- package/workflow/WorkflowApprovalList.d.ts +62 -0
- package/workflow/WorkflowApprovalList.d.ts.map +1 -0
- package/workflow/WorkflowApprovalList.js +52 -0
- package/workflow/WorkflowApprovalList.js.map +1 -0
- package/workflow/WorkflowArtifactDocument.d.ts +29 -0
- package/workflow/WorkflowArtifactDocument.d.ts.map +1 -0
- package/workflow/WorkflowArtifactDocument.js +89 -0
- package/workflow/WorkflowArtifactDocument.js.map +1 -0
- package/workflow/WorkflowExecutionGraph.d.ts +15 -13
- package/workflow/WorkflowExecutionGraph.d.ts.map +1 -1
- package/workflow/WorkflowExecutionGraph.js +18 -53
- package/workflow/WorkflowExecutionGraph.js.map +1 -1
- package/workflow/WorkflowExecutionViewer.d.ts +8 -5
- package/workflow/WorkflowExecutionViewer.d.ts.map +1 -1
- package/workflow/WorkflowExecutionViewer.js +329 -54
- package/workflow/WorkflowExecutionViewer.js.map +1 -1
- package/workflow/WorkflowFileReviewList.d.ts +1 -1
- package/workflow/WorkflowFileReviewList.js +1 -1
- package/workflow/WorkflowTaskApprovalCard.d.ts +4 -3
- package/workflow/WorkflowTaskApprovalCard.d.ts.map +1 -1
- package/workflow/WorkflowTaskApprovalCard.js +5 -4
- package/workflow/WorkflowTaskApprovalCard.js.map +1 -1
- package/workflow/WorkflowTaskApprovalSummary.d.ts +6 -6
- package/workflow/WorkflowTaskApprovalSummary.js +5 -5
- package/workflow/deriveWorkflowArtifactItems.d.ts +30 -0
- package/workflow/deriveWorkflowArtifactItems.d.ts.map +1 -0
- package/workflow/deriveWorkflowArtifactItems.js +38 -0
- package/workflow/deriveWorkflowArtifactItems.js.map +1 -0
- package/workflow/deriveWorkflowUsageItems.d.ts +36 -0
- package/workflow/deriveWorkflowUsageItems.d.ts.map +1 -0
- package/workflow/deriveWorkflowUsageItems.js +50 -0
- package/workflow/deriveWorkflowUsageItems.js.map +1 -0
- package/workflow/diagnosis-document.d.ts +17 -0
- package/workflow/diagnosis-document.d.ts.map +1 -0
- package/workflow/diagnosis-document.js +29 -0
- package/workflow/diagnosis-document.js.map +1 -0
- package/workflow/execution/index.d.ts +0 -2
- package/workflow/execution/index.d.ts.map +1 -1
- package/workflow/execution/index.js +0 -2
- package/workflow/execution/index.js.map +1 -1
- package/workflow/facets/WorkflowArtifactsTab.d.ts +26 -0
- package/workflow/facets/WorkflowArtifactsTab.d.ts.map +1 -0
- package/workflow/facets/WorkflowArtifactsTab.js +34 -0
- package/workflow/facets/WorkflowArtifactsTab.js.map +1 -0
- package/workflow/facets/WorkflowChangesTab.d.ts +37 -0
- package/workflow/facets/WorkflowChangesTab.d.ts.map +1 -0
- package/workflow/facets/WorkflowChangesTab.js +50 -0
- package/workflow/facets/WorkflowChangesTab.js.map +1 -0
- package/workflow/facets/WorkflowUsageTab.d.ts +27 -0
- package/workflow/facets/WorkflowUsageTab.d.ts.map +1 -0
- package/workflow/facets/WorkflowUsageTab.js +87 -0
- package/workflow/facets/WorkflowUsageTab.js.map +1 -0
- package/workflow/format-utils.d.ts +2 -3
- package/workflow/format-utils.d.ts.map +1 -1
- package/workflow/format-utils.js +2 -3
- package/workflow/format-utils.js.map +1 -1
- package/workflow/index.d.ts +21 -10
- package/workflow/index.d.ts.map +1 -1
- package/workflow/index.js +29 -14
- package/workflow/index.js.map +1 -1
- package/workflow/inspector/index.d.ts +0 -2
- package/workflow/inspector/index.d.ts.map +1 -1
- package/workflow/inspector/index.js +0 -2
- package/workflow/inspector/index.js.map +1 -1
- package/workflow/instance/WorkflowInstanceList.d.ts.map +1 -1
- package/workflow/instance/WorkflowInstanceList.js +11 -3
- package/workflow/instance/WorkflowInstanceList.js.map +1 -1
- package/workflow/task-detail/StructuredDataViewer.d.ts.map +1 -0
- package/workflow/task-detail/StructuredDataViewer.js.map +1 -0
- package/workflow/task-detail/index.d.ts +4 -0
- package/workflow/task-detail/index.d.ts.map +1 -0
- package/workflow/task-detail/index.js +4 -0
- package/workflow/task-detail/index.js.map +1 -0
- package/workflow/task-detail/task-approval.d.ts +89 -0
- package/workflow/task-detail/task-approval.d.ts.map +1 -0
- package/workflow/task-detail/task-approval.js +84 -0
- package/workflow/task-detail/task-approval.js.map +1 -0
- package/workflow/task-detail/task-detail-io.d.ts +39 -0
- package/workflow/task-detail/task-detail-io.d.ts.map +1 -0
- package/workflow/task-detail/task-detail-io.js +42 -0
- package/workflow/task-detail/task-detail-io.js.map +1 -0
- package/workflow/thread/WorkflowTaskThread.d.ts +91 -0
- package/workflow/thread/WorkflowTaskThread.d.ts.map +1 -0
- package/workflow/thread/WorkflowTaskThread.js +318 -0
- package/workflow/thread/WorkflowTaskThread.js.map +1 -0
- package/workflow/thread/project-thread-items.d.ts +108 -0
- package/workflow/thread/project-thread-items.d.ts.map +1 -0
- package/workflow/thread/project-thread-items.js +126 -0
- package/workflow/thread/project-thread-items.js.map +1 -0
- package/workflow/thread/task-presentation.d.ts +73 -0
- package/workflow/thread/task-presentation.d.ts.map +1 -0
- package/workflow/thread/task-presentation.js +331 -0
- package/workflow/thread/task-presentation.js.map +1 -0
- package/workflow/thread/thread-presentation.d.ts +28 -0
- package/workflow/thread/thread-presentation.d.ts.map +1 -0
- package/workflow/thread/thread-presentation.js +28 -0
- package/workflow/thread/thread-presentation.js.map +1 -0
- package/workflow/thread/useWorkflowThreadItems.d.ts +16 -0
- package/workflow/thread/useWorkflowThreadItems.d.ts.map +1 -0
- package/workflow/thread/useWorkflowThreadItems.js +22 -0
- package/workflow/thread/useWorkflowThreadItems.js.map +1 -0
- package/workflow/useApprovalBoundary.d.ts +38 -0
- package/workflow/useApprovalBoundary.d.ts.map +1 -0
- package/workflow/useApprovalBoundary.js +55 -0
- package/workflow/useApprovalBoundary.js.map +1 -0
- package/workflow/useFollowExecution.d.ts +0 -20
- package/workflow/useFollowExecution.d.ts.map +1 -1
- package/workflow/useFollowExecution.js +0 -17
- package/workflow/useFollowExecution.js.map +1 -1
- package/workflow/useWorkflowArtifactDownload.d.ts +28 -0
- package/workflow/useWorkflowArtifactDownload.d.ts.map +1 -0
- package/workflow/useWorkflowArtifactDownload.js +45 -0
- package/workflow/useWorkflowArtifactDownload.js.map +1 -0
- package/workflow/useWorkflowExecutionActions.d.ts +3 -2
- package/workflow/useWorkflowExecutionActions.d.ts.map +1 -1
- package/workflow/useWorkflowExecutionActions.js.map +1 -1
- package/workflow/useWorkflowExecutionFileChanges.d.ts +107 -0
- package/workflow/useWorkflowExecutionFileChanges.d.ts.map +1 -0
- package/workflow/useWorkflowExecutionFileChanges.js +244 -0
- package/workflow/useWorkflowExecutionFileChanges.js.map +1 -0
- package/workflow/useWorkflowExecutionGraph.d.ts +1 -14
- package/workflow/useWorkflowExecutionGraph.d.ts.map +1 -1
- package/workflow/useWorkflowExecutionGraph.js +2 -25
- package/workflow/useWorkflowExecutionGraph.js.map +1 -1
- package/workflow/useWorkflowExecutionPanel.d.ts +108 -0
- package/workflow/useWorkflowExecutionPanel.d.ts.map +1 -0
- package/workflow/useWorkflowExecutionPanel.js +103 -0
- package/workflow/useWorkflowExecutionPanel.js.map +1 -0
- package/workflow/useWorkflowExecutionRailViews.d.ts +46 -0
- package/workflow/useWorkflowExecutionRailViews.d.ts.map +1 -0
- package/workflow/useWorkflowExecutionRailViews.js +81 -0
- package/workflow/useWorkflowExecutionRailViews.js.map +1 -0
- package/workspace/FileViewer.d.ts +1 -1
- package/workspace/FileViewer.js +3 -3
- package/workspace/FileViewer.js.map +1 -1
- package/workspace/PanelChip.d.ts +27 -0
- package/workspace/PanelChip.d.ts.map +1 -0
- package/workspace/PanelChip.js +42 -0
- package/workspace/PanelChip.js.map +1 -0
- package/workspace/WorkspaceSurface.d.ts +25 -1
- package/workspace/WorkspaceSurface.d.ts.map +1 -1
- package/workspace/WorkspaceSurface.js +21 -9
- package/workspace/WorkspaceSurface.js.map +1 -1
- package/workspace/index.d.ts +3 -1
- package/workspace/index.d.ts.map +1 -1
- package/workspace/index.js +1 -0
- package/workspace/index.js.map +1 -1
- package/execution/ThreadSelectionContext.d.ts +0 -17
- package/execution/ThreadSelectionContext.d.ts.map +0 -1
- package/execution/ThreadSelectionContext.js +0 -18
- package/execution/ThreadSelectionContext.js.map +0 -1
- package/execution/useThreadSelection.d.ts +0 -35
- package/execution/useThreadSelection.d.ts.map +0 -1
- package/execution/useThreadSelection.js +0 -65
- package/execution/useThreadSelection.js.map +0 -1
- package/internal/store/selection-store.d.ts +0 -53
- package/internal/store/selection-store.d.ts.map +0 -1
- package/internal/store/selection-store.js +0 -88
- package/internal/store/selection-store.js.map +0 -1
- package/session/artifact-document.d.ts.map +0 -1
- package/session/artifact-document.js +0 -22
- package/session/artifact-document.js.map +0 -1
- package/session/facets/InspectTab.d.ts +0 -13
- package/session/facets/InspectTab.d.ts.map +0 -1
- package/session/facets/InspectTab.js +0 -19
- package/session/facets/InspectTab.js.map +0 -1
- package/src/execution/ThreadSelectionContext.tsx +0 -20
- package/src/execution/useThreadSelection.ts +0 -95
- package/src/internal/store/__tests__/selection-store.test.ts +0 -115
- package/src/internal/store/selection-store.ts +0 -112
- package/src/session/artifact-document.ts +0 -23
- package/src/session/facets/InspectTab.tsx +0 -57
- package/src/workflow/WorkflowExecutionApprovalCard.tsx +0 -154
- package/src/workflow/WorkflowExecutionArtifactPanel.tsx +0 -107
- package/src/workflow/WorkflowExecutionCostPanel.tsx +0 -120
- package/src/workflow/WorkflowExecutionTaskPanel.tsx +0 -129
- package/src/workflow/WorkflowExecutionTimeline.tsx +0 -151
- package/src/workflow/WorkflowExecutionTimelineEvent.tsx +0 -497
- package/src/workflow/__tests__/ExecutionInspector.test.tsx +0 -155
- package/src/workflow/__tests__/WorkflowExecutionApprovalCard.test.tsx +0 -129
- package/src/workflow/__tests__/derive-task-detail.test.ts +0 -1265
- package/src/workflow/__tests__/derive-waterfall-entries.test.ts +0 -521
- package/src/workflow/__tests__/execution-inspector.test.tsx +0 -332
- package/src/workflow/execution/derive-waterfall-entries.ts +0 -377
- package/src/workflow/execution/useWaterfallEntries.ts +0 -125
- package/src/workflow/execution-inspector/AgentCallTab.tsx +0 -169
- package/src/workflow/execution-inspector/ErrorTab.tsx +0 -110
- package/src/workflow/execution-inspector/EventLogTab.tsx +0 -79
- package/src/workflow/execution-inspector/ExecutionInspector.tsx +0 -341
- package/src/workflow/execution-inspector/InputOutputTab.tsx +0 -325
- package/src/workflow/execution-inspector/RetriesTab.tsx +0 -68
- package/src/workflow/execution-inspector/SummaryTab.tsx +0 -62
- package/src/workflow/execution-inspector/derive-task-detail.ts +0 -584
- package/src/workflow/execution-inspector/index.ts +0 -14
- package/src/workflow/execution-inspector/useExecutionTaskDetail.ts +0 -55
- package/src/workflow/inspector/ExecutionInspectorAdapter.tsx +0 -40
- package/src/workflow/waterfall/WaterfallBar.tsx +0 -167
- package/src/workflow/waterfall/WaterfallRow.tsx +0 -112
- package/src/workflow/waterfall/WaterfallScale.tsx +0 -52
- package/src/workflow/waterfall/WaterfallTimeline.tsx +0 -138
- package/src/workflow/waterfall/WaterfallTooltip.tsx +0 -74
- package/src/workflow/waterfall/index.ts +0 -5
- package/workflow/WorkflowExecutionApprovalCard.d.ts +0 -34
- package/workflow/WorkflowExecutionApprovalCard.d.ts.map +0 -1
- package/workflow/WorkflowExecutionApprovalCard.js +0 -46
- package/workflow/WorkflowExecutionApprovalCard.js.map +0 -1
- package/workflow/WorkflowExecutionArtifactPanel.d.ts +0 -15
- package/workflow/WorkflowExecutionArtifactPanel.d.ts.map +0 -1
- package/workflow/WorkflowExecutionArtifactPanel.js +0 -46
- package/workflow/WorkflowExecutionArtifactPanel.js.map +0 -1
- package/workflow/WorkflowExecutionCostPanel.d.ts +0 -18
- package/workflow/WorkflowExecutionCostPanel.d.ts.map +0 -1
- package/workflow/WorkflowExecutionCostPanel.js +0 -31
- package/workflow/WorkflowExecutionCostPanel.js.map +0 -1
- package/workflow/WorkflowExecutionTaskPanel.d.ts +0 -24
- package/workflow/WorkflowExecutionTaskPanel.d.ts.map +0 -1
- package/workflow/WorkflowExecutionTaskPanel.js +0 -51
- package/workflow/WorkflowExecutionTaskPanel.js.map +0 -1
- package/workflow/WorkflowExecutionTimeline.d.ts +0 -42
- package/workflow/WorkflowExecutionTimeline.d.ts.map +0 -1
- package/workflow/WorkflowExecutionTimeline.js +0 -52
- package/workflow/WorkflowExecutionTimeline.js.map +0 -1
- package/workflow/WorkflowExecutionTimelineEvent.d.ts +0 -25
- package/workflow/WorkflowExecutionTimelineEvent.d.ts.map +0 -1
- package/workflow/WorkflowExecutionTimelineEvent.js +0 -179
- package/workflow/WorkflowExecutionTimelineEvent.js.map +0 -1
- package/workflow/execution/derive-waterfall-entries.d.ts +0 -85
- package/workflow/execution/derive-waterfall-entries.d.ts.map +0 -1
- package/workflow/execution/derive-waterfall-entries.js +0 -268
- package/workflow/execution/derive-waterfall-entries.js.map +0 -1
- package/workflow/execution/useWaterfallEntries.d.ts +0 -25
- package/workflow/execution/useWaterfallEntries.d.ts.map +0 -1
- package/workflow/execution/useWaterfallEntries.js +0 -67
- package/workflow/execution/useWaterfallEntries.js.map +0 -1
- package/workflow/execution-inspector/AgentCallTab.d.ts +0 -21
- package/workflow/execution-inspector/AgentCallTab.d.ts.map +0 -1
- package/workflow/execution-inspector/AgentCallTab.js +0 -36
- package/workflow/execution-inspector/AgentCallTab.js.map +0 -1
- package/workflow/execution-inspector/ErrorTab.d.ts +0 -9
- package/workflow/execution-inspector/ErrorTab.d.ts.map +0 -1
- package/workflow/execution-inspector/ErrorTab.js +0 -29
- package/workflow/execution-inspector/ErrorTab.js.map +0 -1
- package/workflow/execution-inspector/EventLogTab.d.ts +0 -11
- package/workflow/execution-inspector/EventLogTab.d.ts.map +0 -1
- package/workflow/execution-inspector/EventLogTab.js +0 -47
- package/workflow/execution-inspector/EventLogTab.js.map +0 -1
- package/workflow/execution-inspector/ExecutionInspector.d.ts +0 -69
- package/workflow/execution-inspector/ExecutionInspector.d.ts.map +0 -1
- package/workflow/execution-inspector/ExecutionInspector.js +0 -145
- package/workflow/execution-inspector/ExecutionInspector.js.map +0 -1
- package/workflow/execution-inspector/InputOutputTab.d.ts +0 -20
- package/workflow/execution-inspector/InputOutputTab.d.ts.map +0 -1
- package/workflow/execution-inspector/InputOutputTab.js +0 -124
- package/workflow/execution-inspector/InputOutputTab.js.map +0 -1
- package/workflow/execution-inspector/RetriesTab.d.ts +0 -7
- package/workflow/execution-inspector/RetriesTab.d.ts.map +0 -1
- package/workflow/execution-inspector/RetriesTab.js +0 -11
- package/workflow/execution-inspector/RetriesTab.js.map +0 -1
- package/workflow/execution-inspector/StructuredDataViewer.d.ts.map +0 -1
- package/workflow/execution-inspector/StructuredDataViewer.js.map +0 -1
- package/workflow/execution-inspector/SummaryTab.d.ts +0 -7
- package/workflow/execution-inspector/SummaryTab.d.ts.map +0 -1
- package/workflow/execution-inspector/SummaryTab.js +0 -10
- package/workflow/execution-inspector/SummaryTab.js.map +0 -1
- package/workflow/execution-inspector/derive-task-detail.d.ts +0 -140
- package/workflow/execution-inspector/derive-task-detail.d.ts.map +0 -1
- package/workflow/execution-inspector/derive-task-detail.js +0 -366
- package/workflow/execution-inspector/derive-task-detail.js.map +0 -1
- package/workflow/execution-inspector/index.d.ts +0 -4
- package/workflow/execution-inspector/index.d.ts.map +0 -1
- package/workflow/execution-inspector/index.js +0 -4
- package/workflow/execution-inspector/index.js.map +0 -1
- package/workflow/execution-inspector/useExecutionTaskDetail.d.ts +0 -38
- package/workflow/execution-inspector/useExecutionTaskDetail.d.ts.map +0 -1
- package/workflow/execution-inspector/useExecutionTaskDetail.js +0 -37
- package/workflow/execution-inspector/useExecutionTaskDetail.js.map +0 -1
- package/workflow/inspector/ExecutionInspectorAdapter.d.ts +0 -26
- package/workflow/inspector/ExecutionInspectorAdapter.d.ts.map +0 -1
- package/workflow/inspector/ExecutionInspectorAdapter.js +0 -23
- package/workflow/inspector/ExecutionInspectorAdapter.js.map +0 -1
- package/workflow/waterfall/WaterfallBar.d.ts +0 -19
- package/workflow/waterfall/WaterfallBar.d.ts.map +0 -1
- package/workflow/waterfall/WaterfallBar.js +0 -70
- package/workflow/waterfall/WaterfallBar.js.map +0 -1
- package/workflow/waterfall/WaterfallRow.d.ts +0 -18
- package/workflow/waterfall/WaterfallRow.d.ts.map +0 -1
- package/workflow/waterfall/WaterfallRow.js +0 -45
- package/workflow/waterfall/WaterfallRow.js.map +0 -1
- package/workflow/waterfall/WaterfallScale.d.ts +0 -14
- package/workflow/waterfall/WaterfallScale.d.ts.map +0 -1
- package/workflow/waterfall/WaterfallScale.js +0 -22
- package/workflow/waterfall/WaterfallScale.js.map +0 -1
- package/workflow/waterfall/WaterfallTimeline.d.ts +0 -46
- package/workflow/waterfall/WaterfallTimeline.d.ts.map +0 -1
- package/workflow/waterfall/WaterfallTimeline.js +0 -60
- package/workflow/waterfall/WaterfallTimeline.js.map +0 -1
- package/workflow/waterfall/WaterfallTooltip.d.ts +0 -15
- package/workflow/waterfall/WaterfallTooltip.d.ts.map +0 -1
- package/workflow/waterfall/WaterfallTooltip.js +0 -20
- package/workflow/waterfall/WaterfallTooltip.js.map +0 -1
- package/workflow/waterfall/index.d.ts +0 -6
- package/workflow/waterfall/index.d.ts.map +0 -1
- package/workflow/waterfall/index.js +0 -6
- package/workflow/waterfall/index.js.map +0 -1
- /package/src/workflow/{execution-inspector → task-detail}/StructuredDataViewer.tsx +0 -0
- /package/workflow/{execution-inspector → task-detail}/StructuredDataViewer.d.ts +0 -0
- /package/workflow/{execution-inspector → task-detail}/StructuredDataViewer.js +0 -0
|
@@ -0,0 +1,947 @@
|
|
|
1
|
+
// Behavior tests for the WorkflowTaskThread organism: progress header,
|
|
2
|
+
// per-variant card previews, the expand gesture (T06: headers expand or are
|
|
3
|
+
// plain rows — selection died with the Inspect drill-down), the AGENT_CALL
|
|
4
|
+
// transcript affordance (D-T02-2), empty states (DD-006), and the in-thread
|
|
5
|
+
// HITL section (S10/T06 — including the in-card human_input review gate).
|
|
6
|
+
//
|
|
7
|
+
// GUARDRAIL (S5 rationale): the entire file renders WITHOUT a StigmerProvider.
|
|
8
|
+
// Any component reaching for a client hook (the child's agentExecution.*
|
|
9
|
+
// submit path) would throw — so a passing render plus the hitl spies
|
|
10
|
+
// receiving decisions proves in-card gates route through the WORKFLOW-level
|
|
11
|
+
// wiring only. (WorkflowFileReviewList streams its child itself and therefore
|
|
12
|
+
// NEEDS the provider — it is stubbed at the module seam here; its own suite
|
|
13
|
+
// covers the real child-derived rendering. The review gate's inline-payload
|
|
14
|
+
// path is provider-free by design — useReviewPayload touches the client only
|
|
15
|
+
// for artifact-backed payloads — so the human_input tests exercise the REAL
|
|
16
|
+
// gate.)
|
|
17
|
+
|
|
18
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
19
|
+
import { render, screen, fireEvent, cleanup, within } from "@testing-library/react";
|
|
20
|
+
import { create } from "@bufbuild/protobuf";
|
|
21
|
+
import { WorkflowTaskKind } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/enum_pb";
|
|
22
|
+
import {
|
|
23
|
+
WorkflowPendingApprovalSchema,
|
|
24
|
+
WorkflowPendingFileReviewSchema,
|
|
25
|
+
} from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/api_pb";
|
|
26
|
+
import type {
|
|
27
|
+
WorkflowPendingApproval,
|
|
28
|
+
WorkflowPendingFileReview,
|
|
29
|
+
WorkflowTask,
|
|
30
|
+
} from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/api_pb";
|
|
31
|
+
import {
|
|
32
|
+
ApprovalRequestedPayloadSchema,
|
|
33
|
+
ApprovalResolvedPayloadSchema,
|
|
34
|
+
} from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/event_pb";
|
|
35
|
+
import { ApprovalAction } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
36
|
+
import type { DerivedTaskState } from "../../internal/store/workflow-execution-event-store";
|
|
37
|
+
import type { WorkflowFileDecisionSubmit } from "../WorkflowFileReviewList";
|
|
38
|
+
import { formatMetaChips } from "../format-utils";
|
|
39
|
+
import { WorkflowTaskThread, type WorkflowThreadHitl } from "../thread/WorkflowTaskThread";
|
|
40
|
+
|
|
41
|
+
// Streams its child (needs the provider this guardrail file deliberately
|
|
42
|
+
// omits) — stubbed to prove the seam: the gating card hands it the
|
|
43
|
+
// task-scoped references and the workflow-level decision submit.
|
|
44
|
+
vi.mock("../WorkflowFileReviewList", () => ({
|
|
45
|
+
WorkflowFileReviewList: ({
|
|
46
|
+
pendingFileReviews,
|
|
47
|
+
onSubmitFileDecision,
|
|
48
|
+
}: {
|
|
49
|
+
pendingFileReviews: readonly WorkflowPendingFileReview[];
|
|
50
|
+
onSubmitFileDecision: WorkflowFileDecisionSubmit;
|
|
51
|
+
}) => (
|
|
52
|
+
<div data-testid="file-review-list-stub">
|
|
53
|
+
{pendingFileReviews.map((ref) => (
|
|
54
|
+
<button
|
|
55
|
+
key={ref.childAgentExecutionId}
|
|
56
|
+
type="button"
|
|
57
|
+
onClick={() =>
|
|
58
|
+
onSubmitFileDecision(
|
|
59
|
+
ref.childAgentExecutionId,
|
|
60
|
+
ref.changeSetId[0] ?? "",
|
|
61
|
+
1 as never,
|
|
62
|
+
)
|
|
63
|
+
}
|
|
64
|
+
>
|
|
65
|
+
decide-files-{ref.childAgentExecutionId}
|
|
66
|
+
</button>
|
|
67
|
+
))}
|
|
68
|
+
</div>
|
|
69
|
+
),
|
|
70
|
+
}));
|
|
71
|
+
|
|
72
|
+
// Spy-wrapped passthrough: every card render calls formatMetaChips with the
|
|
73
|
+
// item's own metric fields, so its call log is a per-card render probe (the
|
|
74
|
+
// memoized cards have no other module seam to observe bails through).
|
|
75
|
+
vi.mock("../format-utils", async (importOriginal) => {
|
|
76
|
+
const original = await importOriginal<typeof import("../format-utils")>();
|
|
77
|
+
return { ...original, formatMetaChips: vi.fn(original.formatMetaChips) };
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
beforeEach(() => {
|
|
81
|
+
// useAutoScroll depends on browser APIs absent in happy-dom.
|
|
82
|
+
vi.stubGlobal(
|
|
83
|
+
"IntersectionObserver",
|
|
84
|
+
vi.fn(() => ({
|
|
85
|
+
observe: vi.fn(),
|
|
86
|
+
unobserve: vi.fn(),
|
|
87
|
+
disconnect: vi.fn(),
|
|
88
|
+
})),
|
|
89
|
+
);
|
|
90
|
+
vi.stubGlobal(
|
|
91
|
+
"ResizeObserver",
|
|
92
|
+
vi.fn(() => ({ observe: vi.fn(), unobserve: vi.fn(), disconnect: vi.fn() })),
|
|
93
|
+
);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
afterEach(() => {
|
|
97
|
+
cleanup();
|
|
98
|
+
vi.unstubAllGlobals();
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
function taskState(overrides: Partial<DerivedTaskState> & { taskName: string }): DerivedTaskState {
|
|
102
|
+
return {
|
|
103
|
+
taskKind: WorkflowTaskKind.http_call,
|
|
104
|
+
status: "completed",
|
|
105
|
+
durationMs: 1_500,
|
|
106
|
+
costMicros: 0n,
|
|
107
|
+
tokensUsed: 0n,
|
|
108
|
+
attemptNumber: 1,
|
|
109
|
+
error: "",
|
|
110
|
+
childExecutionId: "",
|
|
111
|
+
agentSlug: "",
|
|
112
|
+
currentToolName: "",
|
|
113
|
+
messagesCount: 0,
|
|
114
|
+
toolCallsCount: 0,
|
|
115
|
+
inputSummary: null,
|
|
116
|
+
outputSummary: null,
|
|
117
|
+
approvalRequest: null,
|
|
118
|
+
approvalResolution: null,
|
|
119
|
+
...overrides,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function statesOf(...states: DerivedTaskState[]): ReadonlyMap<string, DerivedTaskState> {
|
|
124
|
+
return new Map(states.map((s) => [s.taskName, s]));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* All card root elements, in thread order. Since T06 a preview-kind card's
|
|
129
|
+
* header is a plain layout row (no role) — the shell's `data-cursor-target`
|
|
130
|
+
* is the stable, gesture-independent handle on a card.
|
|
131
|
+
*/
|
|
132
|
+
function cardRoots(container: HTMLElement): HTMLElement[] {
|
|
133
|
+
return Array.from(
|
|
134
|
+
container.querySelectorAll<HTMLElement>(
|
|
135
|
+
'[data-cursor-target="workflow-task-row"]',
|
|
136
|
+
),
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** The card root whose header names the task. */
|
|
141
|
+
function cardRootOf(container: HTMLElement, taskName: string): HTMLElement {
|
|
142
|
+
const root = cardRoots(container).find((el) =>
|
|
143
|
+
el.textContent?.includes(taskName),
|
|
144
|
+
);
|
|
145
|
+
if (!root) throw new Error(`no card rendered for task "${taskName}"`);
|
|
146
|
+
return root;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
describe("WorkflowTaskThread", () => {
|
|
150
|
+
it("renders the streaming empty state while running with no tasks yet", () => {
|
|
151
|
+
render(
|
|
152
|
+
<WorkflowTaskThread taskStates={new Map()} totalTasks={0} isRunning />,
|
|
153
|
+
);
|
|
154
|
+
expect(screen.getByText("Waiting for the first task to start…")).toBeTruthy();
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it("renders the terminal empty state for event-less finished executions", () => {
|
|
158
|
+
render(
|
|
159
|
+
<WorkflowTaskThread
|
|
160
|
+
taskStates={new Map()}
|
|
161
|
+
totalTasks={0}
|
|
162
|
+
isRunning={false}
|
|
163
|
+
/>,
|
|
164
|
+
);
|
|
165
|
+
expect(
|
|
166
|
+
screen.getByText("No task activity was recorded for this execution."),
|
|
167
|
+
).toBeTruthy();
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it("shows progress with total and active counts", () => {
|
|
171
|
+
render(
|
|
172
|
+
<WorkflowTaskThread
|
|
173
|
+
taskStates={statesOf(
|
|
174
|
+
taskState({ taskName: "a", status: "completed" }),
|
|
175
|
+
taskState({ taskName: "b", status: "running" }),
|
|
176
|
+
)}
|
|
177
|
+
totalTasks={5}
|
|
178
|
+
isRunning
|
|
179
|
+
/>,
|
|
180
|
+
);
|
|
181
|
+
expect(screen.getByText("1 of 5 tasks")).toBeTruthy();
|
|
182
|
+
expect(screen.getByText("1 active")).toBeTruthy();
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
it("renders one card per task in map order with kind labels", () => {
|
|
186
|
+
const { container } = render(
|
|
187
|
+
<WorkflowTaskThread
|
|
188
|
+
taskStates={statesOf(
|
|
189
|
+
taskState({ taskName: "fetch-data" }),
|
|
190
|
+
taskState({ taskName: "notify", taskKind: WorkflowTaskKind.notification }),
|
|
191
|
+
)}
|
|
192
|
+
totalTasks={2}
|
|
193
|
+
isRunning={false}
|
|
194
|
+
/>,
|
|
195
|
+
);
|
|
196
|
+
const cards = cardRoots(container);
|
|
197
|
+
expect(cards[0].textContent).toContain("fetch-data");
|
|
198
|
+
expect(cards[0].textContent).toContain("HTTP Call");
|
|
199
|
+
expect(cards[1].textContent).toContain("notify");
|
|
200
|
+
expect(cards[1].textContent).toContain("Notification");
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
it("previews the live agent on a running AGENT_CALL card", () => {
|
|
204
|
+
const { container } = render(
|
|
205
|
+
<WorkflowTaskThread
|
|
206
|
+
taskStates={statesOf(
|
|
207
|
+
taskState({
|
|
208
|
+
taskName: "call-writer",
|
|
209
|
+
taskKind: WorkflowTaskKind.agent_call,
|
|
210
|
+
status: "running",
|
|
211
|
+
agentSlug: "blog-writer",
|
|
212
|
+
currentToolName: "web_search",
|
|
213
|
+
messagesCount: 7,
|
|
214
|
+
toolCallsCount: 3,
|
|
215
|
+
}),
|
|
216
|
+
)}
|
|
217
|
+
totalTasks={1}
|
|
218
|
+
isRunning
|
|
219
|
+
/>,
|
|
220
|
+
);
|
|
221
|
+
const card = cardRootOf(container, "call-writer");
|
|
222
|
+
expect(card.textContent).toContain("blog-writer");
|
|
223
|
+
expect(card.textContent).toContain("running web_search");
|
|
224
|
+
expect(card.textContent).toContain("7 msgs · 3 tools");
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
it("previews the first error line on a failed card and shows the attempt count", () => {
|
|
228
|
+
const { container } = render(
|
|
229
|
+
<WorkflowTaskThread
|
|
230
|
+
taskStates={statesOf(
|
|
231
|
+
taskState({
|
|
232
|
+
taskName: "flaky",
|
|
233
|
+
status: "failed",
|
|
234
|
+
attemptNumber: 3,
|
|
235
|
+
error: "connection refused\nlong stack trace",
|
|
236
|
+
}),
|
|
237
|
+
)}
|
|
238
|
+
totalTasks={1}
|
|
239
|
+
isRunning={false}
|
|
240
|
+
/>,
|
|
241
|
+
);
|
|
242
|
+
const card = cardRootOf(container, "flaky");
|
|
243
|
+
// The header previews only the first line; the always-visible body of
|
|
244
|
+
// this preview-kind card carries the rest (asserted in its own test).
|
|
245
|
+
expect(within(card).getAllByText(/connection refused/).length).toBeGreaterThan(0);
|
|
246
|
+
expect(card.textContent).toContain("attempt 3");
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
it("previews waiting approval regardless of variant", () => {
|
|
250
|
+
const { container } = render(
|
|
251
|
+
<WorkflowTaskThread
|
|
252
|
+
taskStates={statesOf(
|
|
253
|
+
taskState({
|
|
254
|
+
taskName: "review-gate",
|
|
255
|
+
taskKind: WorkflowTaskKind.human_input,
|
|
256
|
+
status: "waiting_approval",
|
|
257
|
+
}),
|
|
258
|
+
)}
|
|
259
|
+
totalTasks={1}
|
|
260
|
+
isRunning
|
|
261
|
+
/>,
|
|
262
|
+
);
|
|
263
|
+
expect(cardRootOf(container, "review-gate").textContent).toContain(
|
|
264
|
+
"Awaiting approval",
|
|
265
|
+
);
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
it("renders no selection or Inspect affordance — the card IS the surface (T06)", () => {
|
|
269
|
+
const { container } = render(
|
|
270
|
+
<WorkflowTaskThread
|
|
271
|
+
taskStates={statesOf(taskState({ taskName: "fetch-data" }))}
|
|
272
|
+
totalTasks={1}
|
|
273
|
+
isRunning={false}
|
|
274
|
+
/>,
|
|
275
|
+
);
|
|
276
|
+
// A preview-kind card renders NO interactive header at all: no
|
|
277
|
+
// aria-pressed select gesture, no magnifier — nothing to click but the
|
|
278
|
+
// body's own affordances.
|
|
279
|
+
expect(screen.queryByRole("button")).toBeNull();
|
|
280
|
+
expect(container.querySelector("[aria-pressed]")).toBeNull();
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
it("renders an always-visible preview body for an AGENT_CALL (no chevron, T04) and opens the transcript", () => {
|
|
284
|
+
const onOpenAgentExecution = vi.fn();
|
|
285
|
+
render(
|
|
286
|
+
<WorkflowTaskThread
|
|
287
|
+
taskStates={statesOf(
|
|
288
|
+
taskState({
|
|
289
|
+
taskName: "call-writer",
|
|
290
|
+
taskKind: WorkflowTaskKind.agent_call,
|
|
291
|
+
status: "completed",
|
|
292
|
+
agentSlug: "blog-writer",
|
|
293
|
+
childExecutionId: "aex_child_1",
|
|
294
|
+
costMicros: 120_000n,
|
|
295
|
+
tokensUsed: 4_200n,
|
|
296
|
+
}),
|
|
297
|
+
)}
|
|
298
|
+
totalTasks={1}
|
|
299
|
+
isRunning={false}
|
|
300
|
+
onOpenAgentExecution={onOpenAgentExecution}
|
|
301
|
+
/>,
|
|
302
|
+
);
|
|
303
|
+
|
|
304
|
+
// Preview-kind cards carry no expand chevron — the body is always
|
|
305
|
+
// visible (the session preview-card model).
|
|
306
|
+
expect(screen.queryByRole("button", { name: "Expand call-writer" })).toBeNull();
|
|
307
|
+
|
|
308
|
+
fireEvent.click(screen.getByRole("button", { name: "Open transcript" }));
|
|
309
|
+
expect(onOpenAgentExecution).toHaveBeenCalledWith("aex_child_1", "call-writer");
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
it("renders the task's output in the always-visible body from the snapshot (T04)", () => {
|
|
313
|
+
render(
|
|
314
|
+
<WorkflowTaskThread
|
|
315
|
+
taskStates={statesOf(
|
|
316
|
+
taskState({
|
|
317
|
+
taskName: "check_order",
|
|
318
|
+
taskKind: WorkflowTaskKind.validate,
|
|
319
|
+
status: "completed",
|
|
320
|
+
outputSummary: { valid: true },
|
|
321
|
+
}),
|
|
322
|
+
)}
|
|
323
|
+
totalTasks={1}
|
|
324
|
+
isRunning={false}
|
|
325
|
+
taskSnapshotsByName={
|
|
326
|
+
new Map([
|
|
327
|
+
[
|
|
328
|
+
"check_order",
|
|
329
|
+
{
|
|
330
|
+
taskName: "check_order",
|
|
331
|
+
output: { valid: true, errors: [], data: { total: 120 } },
|
|
332
|
+
artifactIds: [],
|
|
333
|
+
} as unknown as WorkflowTask,
|
|
334
|
+
],
|
|
335
|
+
])
|
|
336
|
+
}
|
|
337
|
+
/>,
|
|
338
|
+
);
|
|
339
|
+
|
|
340
|
+
// The collapsed line names the verdict; the body renders the FULL
|
|
341
|
+
// snapshot output without any expand gesture.
|
|
342
|
+
expect(screen.getByText("valid")).toBeTruthy();
|
|
343
|
+
expect(screen.getByText("Output")).toBeTruthy();
|
|
344
|
+
expect(screen.getByText("Valid")).toBeTruthy(); // humanized key
|
|
345
|
+
// Full-snapshot data — no truncation banner.
|
|
346
|
+
expect(screen.queryByText(/truncated summary/)).toBeNull();
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
it("falls back to the truncated event summary with an honesty banner when no snapshot is available (T04)", () => {
|
|
350
|
+
render(
|
|
351
|
+
<WorkflowTaskThread
|
|
352
|
+
taskStates={statesOf(
|
|
353
|
+
taskState({
|
|
354
|
+
taskName: "total",
|
|
355
|
+
taskKind: WorkflowTaskKind.transform,
|
|
356
|
+
status: "completed",
|
|
357
|
+
outputSummary: { result: 42 },
|
|
358
|
+
}),
|
|
359
|
+
)}
|
|
360
|
+
totalTasks={1}
|
|
361
|
+
isRunning={false}
|
|
362
|
+
/>,
|
|
363
|
+
);
|
|
364
|
+
|
|
365
|
+
expect(screen.getByText("Output")).toBeTruthy();
|
|
366
|
+
expect(screen.getByText(/truncated summary/)).toBeTruthy();
|
|
367
|
+
expect(screen.getByText("Result")).toBeTruthy(); // humanized key
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
it("shows the task input in a summary-kind card's chevron detail (T04)", () => {
|
|
371
|
+
// `wait` is one of the few kinds still in summary disclosure after the
|
|
372
|
+
// T05 coverage expansion — the chevron-detail input path lives there.
|
|
373
|
+
render(
|
|
374
|
+
<WorkflowTaskThread
|
|
375
|
+
taskStates={statesOf(
|
|
376
|
+
taskState({
|
|
377
|
+
taskName: "brief_pause",
|
|
378
|
+
taskKind: WorkflowTaskKind.wait,
|
|
379
|
+
status: "completed",
|
|
380
|
+
inputSummary: { duration: "10s" },
|
|
381
|
+
}),
|
|
382
|
+
)}
|
|
383
|
+
totalTasks={1}
|
|
384
|
+
isRunning={false}
|
|
385
|
+
/>,
|
|
386
|
+
);
|
|
387
|
+
|
|
388
|
+
// Summary-kind cards expand from the header itself (the session card's
|
|
389
|
+
// own gesture — T06); the detail carries the input.
|
|
390
|
+
const header = screen.getByRole("button", { name: /^brief_pause/ });
|
|
391
|
+
expect(header.getAttribute("aria-expanded")).toBe("false");
|
|
392
|
+
fireEvent.click(header);
|
|
393
|
+
expect(screen.getByText("Input")).toBeTruthy();
|
|
394
|
+
expect(screen.getByText("10s")).toBeTruthy();
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
it("shows the full error in the always-visible body of a failed preview-kind card (T05)", () => {
|
|
398
|
+
// http_call is a preview kind since T05 — a failure needs no expand
|
|
399
|
+
// gesture: the header carries the first line, the body the full error.
|
|
400
|
+
render(
|
|
401
|
+
<WorkflowTaskThread
|
|
402
|
+
taskStates={statesOf(
|
|
403
|
+
taskState({
|
|
404
|
+
taskName: "flaky",
|
|
405
|
+
status: "failed",
|
|
406
|
+
error: "connection refused\nat dial tcp 10.0.0.1:443",
|
|
407
|
+
}),
|
|
408
|
+
)}
|
|
409
|
+
totalTasks={1}
|
|
410
|
+
isRunning={false}
|
|
411
|
+
/>,
|
|
412
|
+
);
|
|
413
|
+
expect(screen.queryByRole("button", { name: "Expand flaky" })).toBeNull();
|
|
414
|
+
expect(screen.getByText(/at dial tcp 10\.0\.0\.1:443/)).toBeTruthy();
|
|
415
|
+
});
|
|
416
|
+
|
|
417
|
+
it("shows the full error in a summary-kind card's expanded body", () => {
|
|
418
|
+
render(
|
|
419
|
+
<WorkflowTaskThread
|
|
420
|
+
taskStates={statesOf(
|
|
421
|
+
taskState({
|
|
422
|
+
taskName: "flaky",
|
|
423
|
+
taskKind: WorkflowTaskKind.wait,
|
|
424
|
+
status: "failed",
|
|
425
|
+
error: "connection refused\nat dial tcp 10.0.0.1:443",
|
|
426
|
+
}),
|
|
427
|
+
)}
|
|
428
|
+
totalTasks={1}
|
|
429
|
+
isRunning={false}
|
|
430
|
+
/>,
|
|
431
|
+
);
|
|
432
|
+
fireEvent.click(screen.getByRole("button", { name: /^flaky/ }));
|
|
433
|
+
expect(screen.getByText(/at dial tcp 10\.0\.0\.1:443/)).toBeTruthy();
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
it("keeps a card's expanded state across streaming updates (no remount)", () => {
|
|
437
|
+
const running = () =>
|
|
438
|
+
statesOf(
|
|
439
|
+
taskState({ taskName: "settled", taskKind: WorkflowTaskKind.wait }),
|
|
440
|
+
taskState({ taskName: "live", status: "running", messagesCount: 1 }),
|
|
441
|
+
);
|
|
442
|
+
const { rerender } = render(
|
|
443
|
+
<WorkflowTaskThread
|
|
444
|
+
taskStates={running()}
|
|
445
|
+
totalTasks={2}
|
|
446
|
+
isRunning
|
|
447
|
+
/>,
|
|
448
|
+
);
|
|
449
|
+
fireEvent.click(screen.getByRole("button", { name: /^settled/ }));
|
|
450
|
+
expect(
|
|
451
|
+
screen
|
|
452
|
+
.getByRole("button", { name: /^settled/ })
|
|
453
|
+
.getAttribute("aria-expanded"),
|
|
454
|
+
).toBe("true");
|
|
455
|
+
|
|
456
|
+
// A fresh map (as the store produces per event append) with only the
|
|
457
|
+
// live task changed must not reset the settled card's local state.
|
|
458
|
+
rerender(
|
|
459
|
+
<WorkflowTaskThread
|
|
460
|
+
taskStates={statesOf(
|
|
461
|
+
taskState({ taskName: "settled", taskKind: WorkflowTaskKind.wait }),
|
|
462
|
+
taskState({ taskName: "live", status: "running", messagesCount: 2 }),
|
|
463
|
+
)}
|
|
464
|
+
totalTasks={2}
|
|
465
|
+
isRunning
|
|
466
|
+
/>,
|
|
467
|
+
);
|
|
468
|
+
expect(
|
|
469
|
+
screen
|
|
470
|
+
.getByRole("button", { name: /^settled/ })
|
|
471
|
+
.getAttribute("aria-expanded"),
|
|
472
|
+
).toBe("true");
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
it("a streaming append re-renders only the changed card — snapshot-map bodies never invalidate siblings (T04 perf probe)", () => {
|
|
476
|
+
// Both cards are I/O-bearing preview kinds with always-visible bodies
|
|
477
|
+
// fed from the SAME snapshot map. The formatMetaChips spy fires once
|
|
478
|
+
// per card render, so its call log is the per-card render probe.
|
|
479
|
+
const snapshots = new Map<string, WorkflowTask>([
|
|
480
|
+
[
|
|
481
|
+
"settled-check",
|
|
482
|
+
{
|
|
483
|
+
taskName: "settled-check",
|
|
484
|
+
output: { valid: true },
|
|
485
|
+
artifactIds: [],
|
|
486
|
+
} as unknown as WorkflowTask,
|
|
487
|
+
],
|
|
488
|
+
]);
|
|
489
|
+
const mkStates = (liveTokens: bigint) =>
|
|
490
|
+
statesOf(
|
|
491
|
+
taskState({
|
|
492
|
+
taskName: "settled-check",
|
|
493
|
+
taskKind: WorkflowTaskKind.validate,
|
|
494
|
+
status: "completed",
|
|
495
|
+
// Distinctive duration → uniquely identifiable in the call log.
|
|
496
|
+
durationMs: 7_777,
|
|
497
|
+
}),
|
|
498
|
+
taskState({
|
|
499
|
+
taskName: "live-llm",
|
|
500
|
+
taskKind: WorkflowTaskKind.llm_call,
|
|
501
|
+
status: "running",
|
|
502
|
+
durationMs: 0,
|
|
503
|
+
tokensUsed: liveTokens,
|
|
504
|
+
}),
|
|
505
|
+
);
|
|
506
|
+
|
|
507
|
+
const { rerender } = render(
|
|
508
|
+
<WorkflowTaskThread
|
|
509
|
+
taskStates={mkStates(100n)}
|
|
510
|
+
totalTasks={2}
|
|
511
|
+
isRunning
|
|
512
|
+
taskSnapshotsByName={snapshots}
|
|
513
|
+
/>,
|
|
514
|
+
);
|
|
515
|
+
|
|
516
|
+
const probe = vi.mocked(formatMetaChips);
|
|
517
|
+
probe.mockClear();
|
|
518
|
+
// A fresh map (as the store produces per event append) touching ONLY
|
|
519
|
+
// the live task. The settled card's item keeps identity (structural
|
|
520
|
+
// sharing), its snapshot lookup is unchanged, so its memo must bail.
|
|
521
|
+
rerender(
|
|
522
|
+
<WorkflowTaskThread
|
|
523
|
+
taskStates={mkStates(200n)}
|
|
524
|
+
totalTasks={2}
|
|
525
|
+
isRunning
|
|
526
|
+
taskSnapshotsByName={snapshots}
|
|
527
|
+
/>,
|
|
528
|
+
);
|
|
529
|
+
|
|
530
|
+
const renderedDurations = probe.mock.calls.map((c) => c[0]?.durationMs);
|
|
531
|
+
// The live card re-rendered (its token count moved)…
|
|
532
|
+
expect(renderedDurations).toContain(0);
|
|
533
|
+
// …but the settled preview-body card bailed (DD-009/DD-010).
|
|
534
|
+
expect(renderedDurations).not.toContain(7_777);
|
|
535
|
+
});
|
|
536
|
+
|
|
537
|
+
it("renders a fan-out as overlapping running cards in first-started order (D-T02-1)", () => {
|
|
538
|
+
// The concurrency shape of the fan-out fixture (four branches live at
|
|
539
|
+
// once after prepare settled): the flat model shows parallelism as
|
|
540
|
+
// multiple simultaneously-running cards under an honest progress line.
|
|
541
|
+
const { container } = render(
|
|
542
|
+
<WorkflowTaskThread
|
|
543
|
+
taskStates={statesOf(
|
|
544
|
+
taskState({ taskName: "prepare", status: "completed" }),
|
|
545
|
+
taskState({ taskName: "fetch-us", status: "running" }),
|
|
546
|
+
taskState({ taskName: "fetch-eu", status: "running" }),
|
|
547
|
+
taskState({ taskName: "fetch-apac", status: "running" }),
|
|
548
|
+
taskState({ taskName: "fetch-latam", status: "running" }),
|
|
549
|
+
)}
|
|
550
|
+
totalTasks={6}
|
|
551
|
+
isRunning
|
|
552
|
+
/>,
|
|
553
|
+
);
|
|
554
|
+
|
|
555
|
+
const cards = cardRoots(container);
|
|
556
|
+
const expectedOrder = [
|
|
557
|
+
"prepare",
|
|
558
|
+
"fetch-us",
|
|
559
|
+
"fetch-eu",
|
|
560
|
+
"fetch-apac",
|
|
561
|
+
"fetch-latam",
|
|
562
|
+
];
|
|
563
|
+
expect(cards).toHaveLength(expectedOrder.length);
|
|
564
|
+
expectedOrder.forEach((name, i) => {
|
|
565
|
+
expect(cards[i].textContent?.startsWith(name)).toBe(true);
|
|
566
|
+
});
|
|
567
|
+
expect(screen.getByText("1 of 6 tasks")).toBeTruthy();
|
|
568
|
+
expect(screen.getByText("4 active")).toBeTruthy();
|
|
569
|
+
});
|
|
570
|
+
|
|
571
|
+
it("mounts the jump-to-latest affordance (hidden while following)", () => {
|
|
572
|
+
const { container } = render(
|
|
573
|
+
<WorkflowTaskThread
|
|
574
|
+
taskStates={statesOf(taskState({ taskName: "a" }))}
|
|
575
|
+
totalTasks={1}
|
|
576
|
+
isRunning
|
|
577
|
+
/>,
|
|
578
|
+
);
|
|
579
|
+
// Following is the initial auto-scroll state, so the button is mounted
|
|
580
|
+
// but aria-hidden (it fades in only once the user scrolls up) — query
|
|
581
|
+
// by attribute, not by role, since it is out of the a11y tree.
|
|
582
|
+
const button = container.querySelector('[aria-label="Jump to latest"]');
|
|
583
|
+
expect(button).toBeTruthy();
|
|
584
|
+
expect(button?.getAttribute("aria-hidden")).toBe("true");
|
|
585
|
+
});
|
|
586
|
+
});
|
|
587
|
+
|
|
588
|
+
// ---------------------------------------------------------------------------
|
|
589
|
+
// In-thread HITL (S10)
|
|
590
|
+
// ---------------------------------------------------------------------------
|
|
591
|
+
|
|
592
|
+
function makeHitl(overrides: Partial<WorkflowThreadHitl> = {}): WorkflowThreadHitl {
|
|
593
|
+
return {
|
|
594
|
+
submitApproval: vi.fn(),
|
|
595
|
+
approvalSubmittingToolCallIds: new Set<string>(),
|
|
596
|
+
approvalErrorsByToolCallId: new Map<string, Error>(),
|
|
597
|
+
submitTaskApproval: vi.fn(),
|
|
598
|
+
taskApprovalSubmittingTaskNames: new Set<string>(),
|
|
599
|
+
taskApprovalErrorsByTaskName: new Map<string, Error>(),
|
|
600
|
+
submitFileDecision: vi.fn(),
|
|
601
|
+
fileDecisionSubmittingKeys: new Set<string>(),
|
|
602
|
+
fileDecisionErrorsByKey: new Map<string, Error>(),
|
|
603
|
+
...overrides,
|
|
604
|
+
};
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
function pendingApproval(
|
|
608
|
+
childId: string,
|
|
609
|
+
toolCallId: string,
|
|
610
|
+
toolName = "delete_repository",
|
|
611
|
+
): WorkflowPendingApproval {
|
|
612
|
+
return create(WorkflowPendingApprovalSchema, {
|
|
613
|
+
childAgentExecutionId: childId,
|
|
614
|
+
approval: {
|
|
615
|
+
toolCallId,
|
|
616
|
+
toolName,
|
|
617
|
+
message: `Run ${toolName}?`,
|
|
618
|
+
argsPreview: '{"target": "acme/repo"}',
|
|
619
|
+
requestedAt: "2026-07-16T00:00:00Z",
|
|
620
|
+
},
|
|
621
|
+
});
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
function pendingFileReview(
|
|
625
|
+
childId: string,
|
|
626
|
+
changeSetIds: string[] = ["cs-1"],
|
|
627
|
+
): WorkflowPendingFileReview {
|
|
628
|
+
return create(WorkflowPendingFileReviewSchema, {
|
|
629
|
+
childAgentExecutionId: childId,
|
|
630
|
+
changeSetId: changeSetIds,
|
|
631
|
+
});
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
/** A gating AGENT_CALL task bound to its child execution. */
|
|
635
|
+
function gatedAgentCall(taskName: string, childId: string): DerivedTaskState {
|
|
636
|
+
return taskState({
|
|
637
|
+
taskName,
|
|
638
|
+
taskKind: WorkflowTaskKind.agent_call,
|
|
639
|
+
status: "waiting_approval",
|
|
640
|
+
durationMs: 0,
|
|
641
|
+
childExecutionId: childId,
|
|
642
|
+
agentSlug: "helper",
|
|
643
|
+
});
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
/**
|
|
647
|
+
* A gating human_input task carrying its captured `approval_requested`
|
|
648
|
+
* payload — the shape the store derives once the gate's event arrives.
|
|
649
|
+
*/
|
|
650
|
+
function gatedHumanInput(
|
|
651
|
+
taskName: string,
|
|
652
|
+
overrides: Partial<DerivedTaskState> = {},
|
|
653
|
+
): DerivedTaskState {
|
|
654
|
+
return taskState({
|
|
655
|
+
taskName,
|
|
656
|
+
taskKind: WorkflowTaskKind.human_input,
|
|
657
|
+
status: "waiting_approval",
|
|
658
|
+
durationMs: 0,
|
|
659
|
+
approvalRequest: create(ApprovalRequestedPayloadSchema, {
|
|
660
|
+
prompt: "Ship the release?",
|
|
661
|
+
outcomes: [
|
|
662
|
+
{ name: "ship", label: "Ship It" },
|
|
663
|
+
{ name: "hold", label: "Hold" },
|
|
664
|
+
],
|
|
665
|
+
}),
|
|
666
|
+
...overrides,
|
|
667
|
+
});
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
describe("WorkflowTaskThread — in-thread HITL (S10)", () => {
|
|
671
|
+
it("renders the canonical ApprovalCard on the gating card, visible WITHOUT expanding, and routes the decision through the workflow-level submit", () => {
|
|
672
|
+
const hitl = makeHitl();
|
|
673
|
+
render(
|
|
674
|
+
<WorkflowTaskThread
|
|
675
|
+
taskStates={statesOf(gatedAgentCall("call-helper", "aex_1"))}
|
|
676
|
+
totalTasks={1}
|
|
677
|
+
isRunning
|
|
678
|
+
hitl={hitl}
|
|
679
|
+
pendingApprovals={[pendingApproval("aex_1", "tc-1")]}
|
|
680
|
+
/>,
|
|
681
|
+
);
|
|
682
|
+
|
|
683
|
+
// The decision surface is present with no expand gesture at all —
|
|
684
|
+
// agent_call is a preview-kind card and carries no chevron (T04).
|
|
685
|
+
expect(
|
|
686
|
+
screen.queryByRole("button", { name: "Expand call-helper" }),
|
|
687
|
+
).toBeNull();
|
|
688
|
+
const card = screen.getByRole("alert", {
|
|
689
|
+
name: "Approval required for delete_repository",
|
|
690
|
+
});
|
|
691
|
+
expect(card).toBeTruthy();
|
|
692
|
+
|
|
693
|
+
fireEvent.click(within(card).getByRole("button", { name: "Approve" }));
|
|
694
|
+
expect(hitl.submitApproval).toHaveBeenCalledWith(
|
|
695
|
+
"tc-1",
|
|
696
|
+
ApprovalAction.APPROVE,
|
|
697
|
+
undefined,
|
|
698
|
+
);
|
|
699
|
+
});
|
|
700
|
+
|
|
701
|
+
it("scopes each gate to its owning card when parallel children gate at once", () => {
|
|
702
|
+
const { container } = render(
|
|
703
|
+
<WorkflowTaskThread
|
|
704
|
+
taskStates={statesOf(
|
|
705
|
+
gatedAgentCall("call-a", "aex_a"),
|
|
706
|
+
gatedAgentCall("call-b", "aex_b"),
|
|
707
|
+
)}
|
|
708
|
+
totalTasks={2}
|
|
709
|
+
isRunning
|
|
710
|
+
hitl={makeHitl()}
|
|
711
|
+
pendingApprovals={[
|
|
712
|
+
pendingApproval("aex_a", "tc-a", "tool_for_a"),
|
|
713
|
+
pendingApproval("aex_b", "tc-b", "tool_for_b"),
|
|
714
|
+
]}
|
|
715
|
+
/>,
|
|
716
|
+
);
|
|
717
|
+
|
|
718
|
+
expect(
|
|
719
|
+
within(cardRootOf(container, "call-a")).getByRole("alert", {
|
|
720
|
+
name: "Approval required for tool_for_a",
|
|
721
|
+
}),
|
|
722
|
+
).toBeTruthy();
|
|
723
|
+
expect(
|
|
724
|
+
within(cardRootOf(container, "call-b")).getByRole("alert", {
|
|
725
|
+
name: "Approval required for tool_for_b",
|
|
726
|
+
}),
|
|
727
|
+
).toBeTruthy();
|
|
728
|
+
expect(
|
|
729
|
+
within(cardRootOf(container, "call-a")).queryByRole("alert", {
|
|
730
|
+
name: "Approval required for tool_for_b",
|
|
731
|
+
}),
|
|
732
|
+
).toBeNull();
|
|
733
|
+
});
|
|
734
|
+
|
|
735
|
+
it("hands the card's file-review references to WorkflowFileReviewList filtered to its child, decisions on the workflow path", () => {
|
|
736
|
+
const hitl = makeHitl();
|
|
737
|
+
render(
|
|
738
|
+
<WorkflowTaskThread
|
|
739
|
+
taskStates={statesOf(gatedAgentCall("call-helper", "aex_1"))}
|
|
740
|
+
totalTasks={1}
|
|
741
|
+
isRunning
|
|
742
|
+
hitl={hitl}
|
|
743
|
+
pendingFileReviews={[
|
|
744
|
+
pendingFileReview("aex_1", ["cs-1"]),
|
|
745
|
+
// Another child's reference must NOT reach this card's list.
|
|
746
|
+
pendingFileReview("aex_other", ["cs-9"]),
|
|
747
|
+
]}
|
|
748
|
+
/>,
|
|
749
|
+
);
|
|
750
|
+
|
|
751
|
+
const stub = screen.getByTestId("file-review-list-stub");
|
|
752
|
+
expect(within(stub).getByText("decide-files-aex_1")).toBeTruthy();
|
|
753
|
+
expect(within(stub).queryByText("decide-files-aex_other")).toBeNull();
|
|
754
|
+
|
|
755
|
+
fireEvent.click(within(stub).getByText("decide-files-aex_1"));
|
|
756
|
+
expect(hitl.submitFileDecision).toHaveBeenCalledWith("aex_1", "cs-1", 1);
|
|
757
|
+
});
|
|
758
|
+
|
|
759
|
+
it("renders the FULL review gate on a pending human_input card and routes the decision through the workflow-level submit (T06)", () => {
|
|
760
|
+
const hitl = makeHitl();
|
|
761
|
+
render(
|
|
762
|
+
<WorkflowTaskThread
|
|
763
|
+
taskStates={statesOf(gatedHumanInput("review-gate"))}
|
|
764
|
+
totalTasks={1}
|
|
765
|
+
isRunning
|
|
766
|
+
hitl={hitl}
|
|
767
|
+
/>,
|
|
768
|
+
);
|
|
769
|
+
|
|
770
|
+
// The real decision surface — prompt, configured outcomes — right on
|
|
771
|
+
// the card, no drill-down gesture in between.
|
|
772
|
+
const form = screen.getByRole("form", {
|
|
773
|
+
name: "Approval decision for review-gate",
|
|
774
|
+
});
|
|
775
|
+
expect(within(form).getByText("Ship the release?")).toBeTruthy();
|
|
776
|
+
|
|
777
|
+
fireEvent.click(within(form).getByRole("button", { name: "Ship It" }));
|
|
778
|
+
expect(hitl.submitTaskApproval).toHaveBeenCalledWith(
|
|
779
|
+
"review-gate",
|
|
780
|
+
"ship",
|
|
781
|
+
undefined,
|
|
782
|
+
undefined,
|
|
783
|
+
);
|
|
784
|
+
});
|
|
785
|
+
|
|
786
|
+
it("degrades to an honest waiting notice when the gate's request payload was never captured (snapshot fallback path)", () => {
|
|
787
|
+
render(
|
|
788
|
+
<WorkflowTaskThread
|
|
789
|
+
taskStates={statesOf(
|
|
790
|
+
taskState({
|
|
791
|
+
taskName: "review-gate",
|
|
792
|
+
taskKind: WorkflowTaskKind.human_input,
|
|
793
|
+
status: "waiting_approval",
|
|
794
|
+
durationMs: 0,
|
|
795
|
+
// No approvalRequest: an event-less mount (terminal snapshot
|
|
796
|
+
// fallback) cannot present review material it does not have.
|
|
797
|
+
}),
|
|
798
|
+
)}
|
|
799
|
+
totalTasks={1}
|
|
800
|
+
isRunning
|
|
801
|
+
hitl={makeHitl()}
|
|
802
|
+
/>,
|
|
803
|
+
);
|
|
804
|
+
|
|
805
|
+
expect(screen.getByText("Review required to continue this run.")).toBeTruthy();
|
|
806
|
+
expect(screen.queryByRole("form")).toBeNull();
|
|
807
|
+
});
|
|
808
|
+
|
|
809
|
+
it("reports a resolved gate's decision read-only in the card body — never a second decision surface (T06)", () => {
|
|
810
|
+
render(
|
|
811
|
+
<WorkflowTaskThread
|
|
812
|
+
taskStates={statesOf(
|
|
813
|
+
gatedHumanInput("review-gate", {
|
|
814
|
+
status: "completed",
|
|
815
|
+
durationMs: 900,
|
|
816
|
+
approvalResolution: create(ApprovalResolvedPayloadSchema, {
|
|
817
|
+
resolvedBy: "alice",
|
|
818
|
+
comment: "LGTM",
|
|
819
|
+
waitDurationMs: 30_000n,
|
|
820
|
+
}),
|
|
821
|
+
}),
|
|
822
|
+
)}
|
|
823
|
+
totalTasks={1}
|
|
824
|
+
isRunning={false}
|
|
825
|
+
hitl={makeHitl()}
|
|
826
|
+
taskSnapshotsByName={
|
|
827
|
+
new Map([
|
|
828
|
+
[
|
|
829
|
+
"review-gate",
|
|
830
|
+
{
|
|
831
|
+
taskName: "review-gate",
|
|
832
|
+
// The canonical decision record: the runner persists the
|
|
833
|
+
// reviewer's response as the task output.
|
|
834
|
+
output: { outcome: "ship", reviewer: "alice", comment: "LGTM" },
|
|
835
|
+
artifactIds: [],
|
|
836
|
+
} as unknown as WorkflowTask,
|
|
837
|
+
],
|
|
838
|
+
])
|
|
839
|
+
}
|
|
840
|
+
/>,
|
|
841
|
+
);
|
|
842
|
+
|
|
843
|
+
// The decision report renders the chosen outcome's configured label…
|
|
844
|
+
expect(screen.getByText("Ship It")).toBeTruthy();
|
|
845
|
+
expect(screen.getByText(/alice/)).toBeTruthy();
|
|
846
|
+
// …and no decision-collecting form is offered again.
|
|
847
|
+
expect(screen.queryByRole("form")).toBeNull();
|
|
848
|
+
});
|
|
849
|
+
|
|
850
|
+
it("offers the child transcript when an agent-call gates with no surfaced snapshot gates (the cloud refetch window / the OSS steady state)", () => {
|
|
851
|
+
const onOpenAgentExecution = vi.fn();
|
|
852
|
+
render(
|
|
853
|
+
<WorkflowTaskThread
|
|
854
|
+
taskStates={statesOf(gatedAgentCall("call-helper", "aex_1"))}
|
|
855
|
+
totalTasks={1}
|
|
856
|
+
isRunning
|
|
857
|
+
onOpenAgentExecution={onOpenAgentExecution}
|
|
858
|
+
hitl={makeHitl()}
|
|
859
|
+
pendingApprovals={[]}
|
|
860
|
+
pendingFileReviews={[]}
|
|
861
|
+
/>,
|
|
862
|
+
);
|
|
863
|
+
|
|
864
|
+
expect(
|
|
865
|
+
screen.getByText(/The called agent is waiting for an approval/),
|
|
866
|
+
).toBeTruthy();
|
|
867
|
+
fireEvent.click(screen.getByRole("button", { name: "Open transcript" }));
|
|
868
|
+
expect(onOpenAgentExecution).toHaveBeenCalledWith("aex_1", "call-helper");
|
|
869
|
+
});
|
|
870
|
+
|
|
871
|
+
it("stays read-only when hitl is omitted (DD-011), even with gates surfaced", () => {
|
|
872
|
+
render(
|
|
873
|
+
<WorkflowTaskThread
|
|
874
|
+
taskStates={statesOf(
|
|
875
|
+
gatedAgentCall("call-helper", "aex_1"),
|
|
876
|
+
gatedHumanInput("review-gate"),
|
|
877
|
+
)}
|
|
878
|
+
totalTasks={2}
|
|
879
|
+
isRunning
|
|
880
|
+
pendingApprovals={[pendingApproval("aex_1", "tc-1")]}
|
|
881
|
+
/>,
|
|
882
|
+
);
|
|
883
|
+
|
|
884
|
+
expect(screen.queryByRole("alert")).toBeNull();
|
|
885
|
+
expect(screen.queryByRole("form")).toBeNull();
|
|
886
|
+
expect(screen.queryByText(/waiting for an approval/)).toBeNull();
|
|
887
|
+
});
|
|
888
|
+
|
|
889
|
+
it("surfaces a gate's failed decision in-card, keyed to its toolCallId", () => {
|
|
890
|
+
render(
|
|
891
|
+
<WorkflowTaskThread
|
|
892
|
+
taskStates={statesOf(gatedAgentCall("call-helper", "aex_1"))}
|
|
893
|
+
totalTasks={1}
|
|
894
|
+
isRunning
|
|
895
|
+
hitl={makeHitl({
|
|
896
|
+
approvalErrorsByToolCallId: new Map([
|
|
897
|
+
["tc-1", new Error("boom-42: gate submit failed")],
|
|
898
|
+
]),
|
|
899
|
+
})}
|
|
900
|
+
pendingApprovals={[pendingApproval("aex_1", "tc-1")]}
|
|
901
|
+
/>,
|
|
902
|
+
);
|
|
903
|
+
|
|
904
|
+
expect(screen.getByText(/boom-42: gate submit failed/)).toBeTruthy();
|
|
905
|
+
});
|
|
906
|
+
|
|
907
|
+
it("re-renders only the gating card when gate state churns (sibling memo probe)", () => {
|
|
908
|
+
const taskStates = statesOf(
|
|
909
|
+
// Distinctive metrics make the settled card's formatMetaChips calls
|
|
910
|
+
// uniquely identifiable in the probe's call log.
|
|
911
|
+
taskState({ taskName: "settled", durationMs: 7_777 }),
|
|
912
|
+
gatedAgentCall("call-helper", "aex_1"),
|
|
913
|
+
);
|
|
914
|
+
const approvals = [pendingApproval("aex_1", "tc-1")];
|
|
915
|
+
|
|
916
|
+
const { rerender } = render(
|
|
917
|
+
<WorkflowTaskThread
|
|
918
|
+
taskStates={taskStates}
|
|
919
|
+
totalTasks={2}
|
|
920
|
+
isRunning
|
|
921
|
+
hitl={makeHitl()}
|
|
922
|
+
pendingApprovals={approvals}
|
|
923
|
+
/>,
|
|
924
|
+
);
|
|
925
|
+
|
|
926
|
+
const probe = vi.mocked(formatMetaChips);
|
|
927
|
+
probe.mockClear();
|
|
928
|
+
|
|
929
|
+
// A decision goes in flight: the actions hook re-materializes the bundle
|
|
930
|
+
// (fresh submitting Set) — exactly the churn streaming decisions cause.
|
|
931
|
+
rerender(
|
|
932
|
+
<WorkflowTaskThread
|
|
933
|
+
taskStates={taskStates}
|
|
934
|
+
totalTasks={2}
|
|
935
|
+
isRunning
|
|
936
|
+
hitl={makeHitl({ approvalSubmittingToolCallIds: new Set(["tc-1"]) })}
|
|
937
|
+
pendingApprovals={approvals}
|
|
938
|
+
/>,
|
|
939
|
+
);
|
|
940
|
+
|
|
941
|
+
const renderedDurations = probe.mock.calls.map((c) => c[0]?.durationMs);
|
|
942
|
+
// The gating card re-rendered (its spinner state moved)…
|
|
943
|
+
expect(renderedDurations).toContain(0);
|
|
944
|
+
// …but the settled sibling bailed (DD-009/DD-010).
|
|
945
|
+
expect(renderedDurations).not.toContain(7_777);
|
|
946
|
+
});
|
|
947
|
+
});
|