@stigmer/react 3.1.16 → 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/README.md +16 -1
- 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/provider.d.ts +32 -0
- package/provider.d.ts.map +1 -1
- package/provider.js +25 -1
- package/provider.js.map +1 -1
- 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/__tests__/provider-container.layout.test.tsx +165 -0
- package/src/__tests__/provider-theme-scope.test.tsx +31 -0
- 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/provider.tsx +42 -0
- 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/styles.css +14 -0
- 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,238 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useMemo, useRef, useState } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { getErrorReason } from "@stigmer/sdk";
|
|
6
|
+
import { AgentChannelInstallState } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/status_pb";
|
|
7
|
+
import { Button } from "../button/Button.js";
|
|
8
|
+
import { useChannelAppList } from "../channel-app/useChannelAppList.js";
|
|
9
|
+
import { useDeploymentMode } from "../deployment-mode.js";
|
|
10
|
+
import { CloudFeatureNotice } from "../internal/CloudFeatureNotice.js";
|
|
11
|
+
import { RegisterChannelAppAffordance, ServingAppSection, } from "./connect/ServingAppSection.js";
|
|
12
|
+
import { ToolCredentialsSection } from "./connect/ToolCredentialsSection.js";
|
|
13
|
+
import { RefusalBox, VerbatimRefusal } from "./connect/VerbatimRefusal.js";
|
|
14
|
+
import { CheckIcon, CloseIcon, Spinner } from "./connect/icons.js";
|
|
15
|
+
import { useConnectSlackChannel } from "./useConnectSlackChannel.js";
|
|
16
|
+
import { useCreateAgentChannel } from "./useCreateAgentChannel.js";
|
|
17
|
+
import { useOrgAgentChannelList } from "./useOrgAgentChannelList.js";
|
|
18
|
+
import { SlackMarkIcon } from "./SlackMarkIcon.js";
|
|
19
|
+
/**
|
|
20
|
+
* The connect flow for a Slack channel: create the {@link AgentChannel}
|
|
21
|
+
* (create mode), then run the "Add to Slack" OAuth install in a popup
|
|
22
|
+
* and report progress phase by phase.
|
|
23
|
+
*
|
|
24
|
+
* Requires a deployment with platform Slack app credentials — on a
|
|
25
|
+
* `local` (OSS) backend the flow is preempted with a cloud-feature
|
|
26
|
+
* notice, matching the server's FAILED_PRECONDITION refusal. Install
|
|
27
|
+
* refusals (unconfigured deployment, duplicate workspace, Enterprise
|
|
28
|
+
* Grid) render the server's copy verbatim — the server owns that
|
|
29
|
+
* vocabulary.
|
|
30
|
+
*
|
|
31
|
+
* Built on the native `<dialog>` element for focus trapping and escape
|
|
32
|
+
* handling, matching the SDK's modal convention ({@link ShareAgentDialog}).
|
|
33
|
+
* All visual properties flow through `--stgm-*` design tokens.
|
|
34
|
+
*
|
|
35
|
+
* Most hosts mount it via {@link AgentChannelsPanel} (the Channels tab).
|
|
36
|
+
* Render it directly only when you own the open-state.
|
|
37
|
+
*/
|
|
38
|
+
export function ConnectSlackDialog({ open, onOpenChange, agent, channel, onChannelsChanged, modal = true, channelAppsHref, }) {
|
|
39
|
+
const dialogRef = useRef(null);
|
|
40
|
+
const handleClose = useCallback(() => {
|
|
41
|
+
dialogRef.current?.close();
|
|
42
|
+
onOpenChange(false);
|
|
43
|
+
}, [onOpenChange]);
|
|
44
|
+
// Sync native dialog open state (matches the SDK dialog convention).
|
|
45
|
+
// Non-modal hosts pass `open` as a plain attribute instead — the dialog
|
|
46
|
+
// renders in-flow with no top layer to manage.
|
|
47
|
+
const prevOpenRef = useRef(false);
|
|
48
|
+
if (modal && open !== prevOpenRef.current) {
|
|
49
|
+
prevOpenRef.current = open;
|
|
50
|
+
if (open) {
|
|
51
|
+
requestAnimationFrame(() => {
|
|
52
|
+
if (dialogRef.current && !dialogRef.current.open) {
|
|
53
|
+
dialogRef.current.showModal();
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
else if (dialogRef.current?.open) {
|
|
58
|
+
dialogRef.current.close();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return (_jsx("dialog", { ref: dialogRef, open: modal ? undefined : open, onClose: handleClose, className: cn("w-full max-w-md rounded-xl border border-border bg-popover p-0 shadow-xl", modal ? "fixed inset-0 m-auto backdrop:bg-black/50" : "relative"), "aria-labelledby": "connect-slack-title", children: open && (_jsx(ConnectSlackDialogBody, { agent: agent, channel: channel ?? null, onChannelsChanged: onChannelsChanged, onClose: handleClose, channelAppsHref: channelAppsHref })) }));
|
|
62
|
+
}
|
|
63
|
+
function ConnectSlackDialogBody({ agent, channel, onChannelsChanged, onClose, channelAppsHref, }) {
|
|
64
|
+
const deploymentMode = useDeploymentMode();
|
|
65
|
+
const agentName = agent.metadata?.name || agent.metadata?.slug || "this agent";
|
|
66
|
+
const org = agent.metadata?.org ?? "";
|
|
67
|
+
const { createChannel, isPending: isCreating } = useCreateAgentChannel();
|
|
68
|
+
const slack = useConnectSlackChannel();
|
|
69
|
+
const [name, setName] = useState(() => channel ? (channel.metadata?.name ?? "") : `${agentName} Slack`);
|
|
70
|
+
// Tool credentials bound at connect time (create mode only — a
|
|
71
|
+
// reconnect keeps the channel's existing bindings untouched; edits go
|
|
72
|
+
// through the channel card's credentials dialog).
|
|
73
|
+
const [environmentRefs, setEnvironmentRefs] = useState([]);
|
|
74
|
+
// The serving app (create mode only): null = the platform Stigmer app;
|
|
75
|
+
// a ref = one of the org's own channel apps (BYO — the bot carries that
|
|
76
|
+
// app's name, and each app is its own bot identity). A reconnect keeps
|
|
77
|
+
// the channel's existing binding — an installed channel's app_ref is
|
|
78
|
+
// frozen server-side.
|
|
79
|
+
const [appRef, setAppRef] = useState(null);
|
|
80
|
+
const [installed, setInstalled] = useState(null);
|
|
81
|
+
const [error, setError] = useState(null);
|
|
82
|
+
// The org's channel apps, fetched once here so the serving-app picker,
|
|
83
|
+
// the addressing copy, and the advisory all read one consistent list.
|
|
84
|
+
const { channelApps } = useChannelAppList(org || null);
|
|
85
|
+
const slackApps = useMemo(() => channelApps.filter((app) => app.spec?.providerConfig?.case === "slack"), [channelApps]);
|
|
86
|
+
// The app the install will (or did) go through: the picker's choice in
|
|
87
|
+
// create mode, the frozen spec.app_ref on a reconnect. null = platform.
|
|
88
|
+
const effectiveAppRef = channel
|
|
89
|
+
? channel.spec?.appRef?.slug
|
|
90
|
+
? { org: channel.spec.appRef.org || org, slug: channel.spec.appRef.slug }
|
|
91
|
+
: null
|
|
92
|
+
: appRef;
|
|
93
|
+
const selectedApp = effectiveAppRef
|
|
94
|
+
? slackApps.find((app) => app.metadata?.slug === effectiveAppRef.slug) ?? null
|
|
95
|
+
: null;
|
|
96
|
+
// What members type after "@" in Slack. App-level, not agent-level: the
|
|
97
|
+
// platform app's bot is "Stigmer"; a BYO app's bot carries the name its
|
|
98
|
+
// manifest declared — which the registration form seeded from the
|
|
99
|
+
// ChannelApp's own name.
|
|
100
|
+
const botName = effectiveAppRef
|
|
101
|
+
? selectedApp?.metadata?.name || effectiveAppRef.slug
|
|
102
|
+
: "Stigmer";
|
|
103
|
+
// Workspaces the selected serving app already occupies, matched on the
|
|
104
|
+
// same key the database enforces uniqueness on: (team, channel app).
|
|
105
|
+
// Advisory only — the list is permission-bounded, and other orgs'
|
|
106
|
+
// holds are invisible; completeInstall stays the arbiter.
|
|
107
|
+
const advisoryActive = deploymentMode === "cloud" && !channel && !installed;
|
|
108
|
+
const { channels: orgChannels } = useOrgAgentChannelList(advisoryActive && org ? org : null);
|
|
109
|
+
const alreadyServed = useMemo(() => {
|
|
110
|
+
// Platform app installs stamp an empty channel_app_id.
|
|
111
|
+
const selectedAppId = effectiveAppRef ? selectedApp?.metadata?.id : "";
|
|
112
|
+
if (selectedAppId === undefined)
|
|
113
|
+
return [];
|
|
114
|
+
return orgChannels.filter((c) => c.status?.installState === AgentChannelInstallState.installed &&
|
|
115
|
+
c.status?.providerStatus?.case === "slack" &&
|
|
116
|
+
c.status.providerStatus.value.channelAppId === selectedAppId);
|
|
117
|
+
}, [orgChannels, effectiveAppRef, selectedApp]);
|
|
118
|
+
// One click drives the whole journey: (create →) initiate → popup →
|
|
119
|
+
// complete. It must stay a single synchronous entry point — the popup
|
|
120
|
+
// opens inside connect(), and browsers only allow that from a
|
|
121
|
+
// user-gesture call stack.
|
|
122
|
+
const handleConnect = useCallback(async () => {
|
|
123
|
+
setError(null);
|
|
124
|
+
try {
|
|
125
|
+
let target = channel;
|
|
126
|
+
if (!target) {
|
|
127
|
+
target = await createChannel({
|
|
128
|
+
name: name.trim() || `${agentName} Slack`,
|
|
129
|
+
org,
|
|
130
|
+
agentRef: {
|
|
131
|
+
org,
|
|
132
|
+
slug: agent.metadata?.slug ?? "",
|
|
133
|
+
},
|
|
134
|
+
enabled: true,
|
|
135
|
+
slack: {},
|
|
136
|
+
...(appRef ? { appRef } : {}),
|
|
137
|
+
...(environmentRefs.length > 0 ? { environmentRefs } : {}),
|
|
138
|
+
});
|
|
139
|
+
// The channel now exists even if the install below fails or is
|
|
140
|
+
// abandoned — surface it in the list either way.
|
|
141
|
+
onChannelsChanged?.();
|
|
142
|
+
}
|
|
143
|
+
const result = await slack.connect(target.metadata?.id ?? "");
|
|
144
|
+
setInstalled(result);
|
|
145
|
+
onChannelsChanged?.();
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
// Cancellation is a user decision, not a failure — the hook keeps
|
|
149
|
+
// error null for it; everything else renders below.
|
|
150
|
+
setError(slack.error ?? (err instanceof Error ? err : new Error(String(err))));
|
|
151
|
+
}
|
|
152
|
+
}, [agent, agentName, appRef, channel, createChannel, environmentRefs, name, org, onChannelsChanged, slack]);
|
|
153
|
+
const handleCancel = useCallback(() => {
|
|
154
|
+
slack.clearError();
|
|
155
|
+
setError(null);
|
|
156
|
+
}, [slack]);
|
|
157
|
+
const busy = isCreating || slack.isInProgress;
|
|
158
|
+
return (_jsxs("div", { className: "flex flex-col", children: [_jsxs("div", { className: "flex items-start justify-between gap-3 border-b border-border px-5 py-4", children: [_jsxs("div", { className: "flex items-center gap-2.5", children: [_jsx(SlackMarkIcon, { className: "size-5 text-foreground" }), _jsx("h2", { id: "connect-slack-title", className: "text-sm font-semibold text-foreground", children: channel ? "Reconnect to Slack" : "Connect to Slack" })] }), _jsx("button", { type: "button", onClick: onClose, "aria-label": "Close dialog", className: cn("rounded p-1 text-muted-foreground", "hover:bg-accent-hover hover:text-foreground", "focus:outline-none focus:ring-1 focus:ring-ring"), children: _jsx(CloseIcon, {}) })] }), _jsx("div", { className: "space-y-4 px-5 py-4", children: deploymentMode === "local" ? (
|
|
159
|
+
// Preempt the doomed flow: the OSS backend answers every install
|
|
160
|
+
// with FAILED_PRECONDITION, so don't open a popup destined to fail.
|
|
161
|
+
_jsx(CloudFeatureNotice, { children: "Channel installs require Stigmer Cloud. The local backend manages channel configuration, but connecting to Slack uses the platform's hosted Slack app." })) : installed ? (_jsx(InstalledSummary, { channel: installed, agentName: agentName, botName: botName })) : busy ? (_jsx(FlowProgress, { phase: slack.phase, onCancel: handleCancel })) : (_jsxs(_Fragment, { children: [!channel && (_jsxs("label", { className: "block", children: [_jsx("span", { className: "mb-1.5 block text-xs font-medium text-foreground", children: "Channel name" }), _jsx("input", { type: "text", value: name, onChange: (e) => setName(e.target.value), disabled: busy, className: cn("w-full rounded-md border border-input bg-background px-3 py-1.5", "text-sm text-foreground placeholder:text-muted-foreground", "focus:outline-none focus:ring-1 focus:ring-ring") }), _jsx("span", { className: "mt-1 block text-xs text-muted-foreground", children: "Names the connection in Stigmer \u2014 pick something that identifies the workspace if you connect more than one." })] })), !channel && (_jsx(ServingAppSection, { org: org, apps: slackApps, value: appRef, onChange: setAppRef, disabled: busy, channelAppsHref: channelAppsHref, idPrefix: "stgm-slack-app", platformOption: {
|
|
162
|
+
label: "Stigmer app",
|
|
163
|
+
hint: "Fastest — no setup, the bot is named Stigmer",
|
|
164
|
+
}, appHint: "Your app \u2014 your bot name and icon", emptyBody: _jsxs("p", { className: "text-xs text-muted-foreground", children: ["The platform", " ", _jsx("span", { className: "font-medium text-foreground", children: "Stigmer" }), " ", "app \u2014 no setup needed. Want the bot to carry your own name and icon, or several agents in one workspace?", " ", _jsx(RegisterChannelAppAffordance, { channelAppsHref: channelAppsHref, children: "Register a channel app" }), "."] }) })), alreadyServed.length > 0 && (_jsx(AlreadyServedNote, { botName: botName, channels: alreadyServed })), !channel && (_jsx(ToolCredentialsSection, { agent: agent, org: org, value: environmentRefs, onChange: setEnvironmentRefs, disabled: busy })), _jsx("p", { className: "text-sm text-muted-foreground", children: "When you continue, Slack asks which workspace to add the bot to \u2014 pick the one where your team should chat with this agent." }), _jsxs("p", { className: "text-sm text-muted-foreground", children: ["Members reach the agent by opening a direct message with", " ", _jsx("span", { className: "font-medium text-foreground", children: botName }), ", or typing @ in a channel and picking", " ", _jsx("span", { className: "font-medium text-foreground", children: botName }), " ", "from the list \u2014 it answers as", " ", _jsx("span", { className: "font-medium text-foreground", children: agentName }), "."] }), _jsxs("p", { className: "text-xs text-muted-foreground", children: ["Conversations from Slack are billed to", " ", _jsx("span", { className: "font-medium", children: org }), ". A workspace can host one agent per Slack app."] }), error && (_jsx(InstallRefusal, { error: error, channelAppsHref: channelAppsHref }))] })) }), _jsx("div", { className: "flex justify-end gap-2 border-t border-border px-5 py-3", children: installed || deploymentMode === "local" ? (_jsx(Button, { variant: "outline", size: "sm", onClick: onClose, children: installed ? "Done" : "Close" })) : (_jsxs(_Fragment, { children: [_jsx(Button, { variant: "ghost", size: "sm", onClick: onClose, disabled: busy, children: "Cancel" }), _jsx(Button, { variant: "primary", size: "sm", onClick: () => void handleConnect(), disabled: busy, icon: _jsx(SlackMarkIcon, { className: "size-3.5" }), "data-cursor-target": "dialog-connect-slack", children: error ? "Try again" : channel ? "Reconnect to Slack" : "Connect to Slack" })] })) })] }));
|
|
165
|
+
}
|
|
166
|
+
// ---------------------------------------------------------------------------
|
|
167
|
+
// Install refusal — guided for the duplicate-workspace reason
|
|
168
|
+
// ---------------------------------------------------------------------------
|
|
169
|
+
/**
|
|
170
|
+
* The reason code the server attaches (google.rpc.ErrorInfo, domain
|
|
171
|
+
* stigmer.ai) to a duplicate-workspace completeInstall refusal — see the
|
|
172
|
+
* completeInstall rpc comment for the vocabulary.
|
|
173
|
+
*/
|
|
174
|
+
const REASON_WORKSPACE_ALREADY_CONNECTED = "SLACK_WORKSPACE_ALREADY_CONNECTED";
|
|
175
|
+
/**
|
|
176
|
+
* Install-refusal rendering. The duplicate-workspace refusal is the one
|
|
177
|
+
* a user can act on from here, so it gets a guided treatment — names the
|
|
178
|
+
* occupied workspace (from the ErrorInfo metadata) and offers the
|
|
179
|
+
* register-a-channel-app path. Every other refusal (and any error from a
|
|
180
|
+
* server not attaching reasons) renders the server's copy verbatim — the
|
|
181
|
+
* server owns that vocabulary.
|
|
182
|
+
*/
|
|
183
|
+
function InstallRefusal({ error, channelAppsHref, }) {
|
|
184
|
+
const reason = getErrorReason(error);
|
|
185
|
+
if (reason?.reason !== REASON_WORKSPACE_ALREADY_CONNECTED) {
|
|
186
|
+
return _jsx(VerbatimRefusal, { error: error });
|
|
187
|
+
}
|
|
188
|
+
const team = reason.metadata.team_name || "This workspace";
|
|
189
|
+
return (_jsxs(RefusalBox, { children: [_jsxs("p", { children: [_jsx("span", { className: "font-medium", children: team }), " already hosts an agent through this app \u2014 a workspace hosts one agent per Slack app."] }), _jsxs("p", { children: ["To reach it with this agent, disconnect the existing channel, or", " ", _jsx(RegisterChannelAppAffordance, { channelAppsHref: channelAppsHref, children: "register a channel app" }), " ", "and connect through that instead."] })] }));
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Pre-OAuth advisory: the selected serving app already occupies these
|
|
193
|
+
* workspaces, matched on the exact key the database enforces —
|
|
194
|
+
* (workspace, serving app). Shown before the user spends a Slack OAuth
|
|
195
|
+
* round-trip discovering it. Best-effort by design: the list is bounded
|
|
196
|
+
* by the caller's visibility and cannot see other orgs' holds, so the
|
|
197
|
+
* copy warns rather than forbids.
|
|
198
|
+
*/
|
|
199
|
+
function AlreadyServedNote({ botName, channels, }) {
|
|
200
|
+
return (_jsx("div", { role: "status", className: "space-y-0.5 text-xs text-warning", children: channels.map((c) => {
|
|
201
|
+
const slack = c.status?.providerStatus?.case === "slack"
|
|
202
|
+
? c.status.providerStatus.value
|
|
203
|
+
: null;
|
|
204
|
+
const team = slack?.teamName || slack?.teamId || "a workspace";
|
|
205
|
+
const agent = c.spec?.agentRef?.slug || "another agent";
|
|
206
|
+
return (_jsxs("p", { children: [_jsx("span", { className: "font-medium", children: botName }), " already serves", " ", _jsx("span", { className: "font-medium", children: team }), " via ", agent, " \u2014 a workspace hosts one agent per app, so connect through a different channel app to reach it."] }, c.metadata?.id ?? team));
|
|
207
|
+
}) }));
|
|
208
|
+
}
|
|
209
|
+
// ---------------------------------------------------------------------------
|
|
210
|
+
// Flow progress — one row per phase, the active one live
|
|
211
|
+
// ---------------------------------------------------------------------------
|
|
212
|
+
const FLOW_STEPS = [
|
|
213
|
+
{ phase: "initiating", label: "Contacting Slack" },
|
|
214
|
+
{ phase: "awaiting-callback", label: "Waiting for your approval in the Slack window" },
|
|
215
|
+
{ phase: "completing", label: "Finalizing the connection" },
|
|
216
|
+
];
|
|
217
|
+
function FlowProgress({ phase, onCancel, }) {
|
|
218
|
+
const activeIndex = FLOW_STEPS.findIndex((s) => s.phase === phase);
|
|
219
|
+
return (_jsxs("div", { className: "space-y-3", "aria-live": "polite", children: [_jsx("ul", { className: "space-y-2", children: FLOW_STEPS.map((step, i) => {
|
|
220
|
+
const isActive = i === activeIndex;
|
|
221
|
+
const isDone = activeIndex > i;
|
|
222
|
+
return (_jsxs("li", { className: cn("flex items-center gap-2 text-sm", isActive
|
|
223
|
+
? "text-foreground"
|
|
224
|
+
: isDone
|
|
225
|
+
? "text-muted-foreground"
|
|
226
|
+
: "text-muted-foreground-subtle"), children: [isDone ? (_jsx(CheckIcon, { className: "size-3.5 shrink-0 text-success" })) : isActive ? (_jsx(Spinner, { className: "size-3.5 shrink-0" })) : (_jsx("span", { className: "size-3.5 shrink-0 rounded-full border border-border", "aria-hidden": "true" })), step.label] }, step.phase));
|
|
227
|
+
}) }), _jsx(Button, { variant: "ghost", size: "xs", onClick: onCancel, children: "Cancel" })] }));
|
|
228
|
+
}
|
|
229
|
+
// ---------------------------------------------------------------------------
|
|
230
|
+
// Installed summary — the success state with the observed Slack facts
|
|
231
|
+
// ---------------------------------------------------------------------------
|
|
232
|
+
function InstalledSummary({ channel, agentName, botName, }) {
|
|
233
|
+
const slack = channel.status?.providerStatus?.case === "slack"
|
|
234
|
+
? channel.status.providerStatus.value
|
|
235
|
+
: null;
|
|
236
|
+
return (_jsxs("div", { className: "space-y-2", role: "status", children: [_jsxs("div", { className: "flex items-center gap-2 text-sm font-medium text-foreground", children: [_jsx(CheckIcon, { className: "size-4 text-success" }), "Connected", slack?.teamName ? ` to ${slack.teamName}` : ""] }), _jsxs("p", { className: "text-sm text-muted-foreground", children: ["In Slack, open a direct message with", " ", _jsx("span", { className: "font-medium text-foreground", children: botName }), " \u2014 or type @ in any channel and pick", " ", _jsx("span", { className: "font-medium text-foreground", children: botName }), " from the list \u2014 then ask your question. Answers come from", " ", _jsx("span", { className: "font-medium text-foreground", children: agentName }), "."] })] }));
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=ConnectSlackDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConnectSlackDialog.js","sourceRoot":"","sources":["../../src/channel/ConnectSlackDialog.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { Agent } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
|
|
2
|
+
import type { AgentChannel } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/api_pb";
|
|
3
|
+
/** Props for {@link ConnectWhatsAppDialog}. */
|
|
4
|
+
export interface ConnectWhatsAppDialogProps {
|
|
5
|
+
/** Whether the dialog is open. */
|
|
6
|
+
readonly open: boolean;
|
|
7
|
+
/** Called when the dialog requests an open-state change. */
|
|
8
|
+
readonly onOpenChange: (open: boolean) => void;
|
|
9
|
+
/** The agent the channel connects. */
|
|
10
|
+
readonly agent: Agent;
|
|
11
|
+
/**
|
|
12
|
+
* An existing channel to (re)connect — a `pending_install` channel
|
|
13
|
+
* whose install never completed. Unlike Slack's frozen reconnect, the
|
|
14
|
+
* number and serving app stay editable here: a failed direct install
|
|
15
|
+
* usually means one of them is wrong, and both are server-mutable
|
|
16
|
+
* while the channel isn't installed. When omitted, the dialog opens in
|
|
17
|
+
* **create mode**.
|
|
18
|
+
*/
|
|
19
|
+
readonly channel?: AgentChannel | null;
|
|
20
|
+
/**
|
|
21
|
+
* Called after the channel set changes (created, or install completed).
|
|
22
|
+
* Hosts typically pass the channel list's `refetch`.
|
|
23
|
+
*/
|
|
24
|
+
readonly onChannelsChanged?: () => void;
|
|
25
|
+
/**
|
|
26
|
+
* When `false`, renders as an in-flow open dialog instead of a
|
|
27
|
+
* top-layer modal — no `showModal()`, no backdrop, no focus trap.
|
|
28
|
+
* For embedding the dialog in a constrained surface (documentation
|
|
29
|
+
* demos, visual tests). Interactive hosts keep the default.
|
|
30
|
+
* @default true
|
|
31
|
+
*/
|
|
32
|
+
readonly modal?: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Where the host manages Channel Apps (the console passes
|
|
35
|
+
* `/settings/channel-apps`). When provided, the serving-app section
|
|
36
|
+
* and install refusals render a "Register a channel app" link there.
|
|
37
|
+
* SDK components never hardcode host routes — hosts inject the
|
|
38
|
+
* destination. Absent, the affordance degrades to plain guidance text.
|
|
39
|
+
*/
|
|
40
|
+
readonly channelAppsHref?: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The connect flow for a WhatsApp channel: create the
|
|
44
|
+
* {@link AgentChannel} (create mode), then run the direct install — one
|
|
45
|
+
* server call that verifies the declared phone number against Meta's
|
|
46
|
+
* Graph API through the selected channel app's credentials (DD-WA-1).
|
|
47
|
+
* No consent popup, no callback route.
|
|
48
|
+
*
|
|
49
|
+
* WhatsApp is BYO-only (DD-WA-2): there is no platform Meta app, so a
|
|
50
|
+
* serving channel app is required — with none registered, the flow
|
|
51
|
+
* blocks on registering one first. The declared phone number ID is
|
|
52
|
+
* likewise required: the install proves it, and an empty value can only
|
|
53
|
+
* fail there.
|
|
54
|
+
*
|
|
55
|
+
* Requires Stigmer Cloud — on a `local` (OSS) backend the flow is
|
|
56
|
+
* preempted with a cloud-feature notice, matching the server's
|
|
57
|
+
* FAILED_PRECONDITION refusal. Install refusals render the server's
|
|
58
|
+
* copy verbatim except the duplicate-number refusal, which gets a
|
|
59
|
+
* guided treatment.
|
|
60
|
+
*
|
|
61
|
+
* Built on the native `<dialog>` element for focus trapping and escape
|
|
62
|
+
* handling, matching the SDK's modal convention
|
|
63
|
+
* ({@link ConnectSlackDialog}). All visual properties flow through
|
|
64
|
+
* `--stgm-*` design tokens.
|
|
65
|
+
*
|
|
66
|
+
* Most hosts mount it via {@link AgentChannelsPanel} (the Channels tab).
|
|
67
|
+
* Render it directly only when you own the open-state.
|
|
68
|
+
*/
|
|
69
|
+
export declare function ConnectWhatsAppDialog({ open, onOpenChange, agent, channel, onChannelsChanged, modal, channelAppsHref, }: ConnectWhatsAppDialogProps): import("react/jsx-runtime").JSX.Element;
|
|
70
|
+
//# sourceMappingURL=ConnectWhatsAppDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConnectWhatsAppDialog.d.ts","sourceRoot":"","sources":["../../src/channel/ConnectWhatsAppDialog.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oDAAoD,CAAC;AAChF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2DAA2D,CAAC;AAoB9F,+CAA+C;AAC/C,MAAM,WAAW,0BAA0B;IACzC,kCAAkC;IAClC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,4DAA4D;IAC5D,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,sCAAsC;IACtC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IACvC;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IACxC;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB;;;;;;OAMG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,IAAI,EACJ,YAAY,EACZ,KAAK,EACL,OAAO,EACP,iBAAiB,EACjB,KAAY,EACZ,eAAe,GAChB,EAAE,0BAA0B,2CAiD5B"}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useMemo, useRef, useState } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { getErrorReason } from "@stigmer/sdk";
|
|
6
|
+
import { AgentChannelInstallState } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/status_pb";
|
|
7
|
+
import { Button } from "../button/Button.js";
|
|
8
|
+
import { useChannelAppList } from "../channel-app/useChannelAppList.js";
|
|
9
|
+
import { useDeploymentMode } from "../deployment-mode.js";
|
|
10
|
+
import { useStigmer } from "../hooks.js";
|
|
11
|
+
import { CloudFeatureNotice } from "../internal/CloudFeatureNotice.js";
|
|
12
|
+
import { RegisterChannelAppAffordance, ServingAppSection, } from "./connect/ServingAppSection.js";
|
|
13
|
+
import { ToolCredentialsSection } from "./connect/ToolCredentialsSection.js";
|
|
14
|
+
import { RefusalBox, VerbatimRefusal } from "./connect/VerbatimRefusal.js";
|
|
15
|
+
import { CheckIcon, CloseIcon, Spinner } from "./connect/icons.js";
|
|
16
|
+
import { useCreateAgentChannel } from "./useCreateAgentChannel.js";
|
|
17
|
+
import { useInstallChannel } from "./useInstallChannel.js";
|
|
18
|
+
import { useOrgAgentChannelList } from "./useOrgAgentChannelList.js";
|
|
19
|
+
import { agentChannelToInput, useSaveAgentChannel } from "./useSaveAgentChannel.js";
|
|
20
|
+
import { WhatsAppMarkIcon } from "./WhatsAppMarkIcon.js";
|
|
21
|
+
/**
|
|
22
|
+
* The connect flow for a WhatsApp channel: create the
|
|
23
|
+
* {@link AgentChannel} (create mode), then run the direct install — one
|
|
24
|
+
* server call that verifies the declared phone number against Meta's
|
|
25
|
+
* Graph API through the selected channel app's credentials (DD-WA-1).
|
|
26
|
+
* No consent popup, no callback route.
|
|
27
|
+
*
|
|
28
|
+
* WhatsApp is BYO-only (DD-WA-2): there is no platform Meta app, so a
|
|
29
|
+
* serving channel app is required — with none registered, the flow
|
|
30
|
+
* blocks on registering one first. The declared phone number ID is
|
|
31
|
+
* likewise required: the install proves it, and an empty value can only
|
|
32
|
+
* fail there.
|
|
33
|
+
*
|
|
34
|
+
* Requires Stigmer Cloud — on a `local` (OSS) backend the flow is
|
|
35
|
+
* preempted with a cloud-feature notice, matching the server's
|
|
36
|
+
* FAILED_PRECONDITION refusal. Install refusals render the server's
|
|
37
|
+
* copy verbatim except the duplicate-number refusal, which gets a
|
|
38
|
+
* guided treatment.
|
|
39
|
+
*
|
|
40
|
+
* Built on the native `<dialog>` element for focus trapping and escape
|
|
41
|
+
* handling, matching the SDK's modal convention
|
|
42
|
+
* ({@link ConnectSlackDialog}). All visual properties flow through
|
|
43
|
+
* `--stgm-*` design tokens.
|
|
44
|
+
*
|
|
45
|
+
* Most hosts mount it via {@link AgentChannelsPanel} (the Channels tab).
|
|
46
|
+
* Render it directly only when you own the open-state.
|
|
47
|
+
*/
|
|
48
|
+
export function ConnectWhatsAppDialog({ open, onOpenChange, agent, channel, onChannelsChanged, modal = true, channelAppsHref, }) {
|
|
49
|
+
const dialogRef = useRef(null);
|
|
50
|
+
const handleClose = useCallback(() => {
|
|
51
|
+
dialogRef.current?.close();
|
|
52
|
+
onOpenChange(false);
|
|
53
|
+
}, [onOpenChange]);
|
|
54
|
+
// Sync native dialog open state (matches the SDK dialog convention).
|
|
55
|
+
// Non-modal hosts pass `open` as a plain attribute instead — the dialog
|
|
56
|
+
// renders in-flow with no top layer to manage.
|
|
57
|
+
const prevOpenRef = useRef(false);
|
|
58
|
+
if (modal && open !== prevOpenRef.current) {
|
|
59
|
+
prevOpenRef.current = open;
|
|
60
|
+
if (open) {
|
|
61
|
+
requestAnimationFrame(() => {
|
|
62
|
+
if (dialogRef.current && !dialogRef.current.open) {
|
|
63
|
+
dialogRef.current.showModal();
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
else if (dialogRef.current?.open) {
|
|
68
|
+
dialogRef.current.close();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return (_jsx("dialog", { ref: dialogRef, open: modal ? undefined : open, onClose: handleClose, className: cn("w-full max-w-md rounded-xl border border-border bg-popover p-0 shadow-xl", modal ? "fixed inset-0 m-auto backdrop:bg-black/50" : "relative"), "aria-labelledby": "connect-whatsapp-title", children: open && (_jsx(ConnectWhatsAppDialogBody, { agent: agent, channel: channel ?? null, onChannelsChanged: onChannelsChanged, onClose: handleClose, channelAppsHref: channelAppsHref })) }));
|
|
72
|
+
}
|
|
73
|
+
function ConnectWhatsAppDialogBody({ agent, channel, onChannelsChanged, onClose, channelAppsHref, }) {
|
|
74
|
+
const stigmer = useStigmer();
|
|
75
|
+
const deploymentMode = useDeploymentMode();
|
|
76
|
+
const agentName = agent.metadata?.name || agent.metadata?.slug || "this agent";
|
|
77
|
+
const org = agent.metadata?.org ?? "";
|
|
78
|
+
const { createChannel, isPending: isCreating } = useCreateAgentChannel();
|
|
79
|
+
const { save, isPending: isSaving } = useSaveAgentChannel();
|
|
80
|
+
const installer = useInstallChannel();
|
|
81
|
+
const [name, setName] = useState(() => channel ? (channel.metadata?.name ?? "") : `${agentName} WhatsApp`);
|
|
82
|
+
// The declared number (spec.whatsapp.phone_number_id). Genuinely
|
|
83
|
+
// user-declared — a WABA holds many numbers; the owner picks which one
|
|
84
|
+
// the agent serves. Required client-side: the write path defers it to
|
|
85
|
+
// the install probe, where an empty value can only fail.
|
|
86
|
+
const [phoneNumberId, setPhoneNumberId] = useState(() => channel?.spec?.providerConfig?.case === "whatsapp"
|
|
87
|
+
? channel.spec.providerConfig.value.phoneNumberId
|
|
88
|
+
: "");
|
|
89
|
+
// Tool credentials bound at connect time (create mode only — a retry
|
|
90
|
+
// keeps the channel's existing bindings untouched; edits go through
|
|
91
|
+
// the channel card's credentials dialog).
|
|
92
|
+
const [environmentRefs, setEnvironmentRefs] = useState([]);
|
|
93
|
+
// The serving app — required (DD-WA-2: no platform Meta app exists).
|
|
94
|
+
// Editable in retry mode too: app_ref is server-mutable while the
|
|
95
|
+
// channel isn't installed, and a wrong app is a likely failure cause.
|
|
96
|
+
const [appRef, setAppRef] = useState(() => channel?.spec?.appRef?.slug
|
|
97
|
+
? { org: channel.spec.appRef.org || org, slug: channel.spec.appRef.slug }
|
|
98
|
+
: null);
|
|
99
|
+
const [installed, setInstalled] = useState(null);
|
|
100
|
+
const [error, setError] = useState(null);
|
|
101
|
+
// The org's channel apps, fetched once here so the serving-app picker
|
|
102
|
+
// and the advisory read one consistent list.
|
|
103
|
+
const { channelApps } = useChannelAppList(org || null);
|
|
104
|
+
const whatsappApps = useMemo(() => channelApps.filter((app) => app.spec?.providerConfig?.case === "whatsapp"), [channelApps]);
|
|
105
|
+
// A sole registered app is the only possible choice — preselect it so
|
|
106
|
+
// the required picker never blocks on a decision with one answer
|
|
107
|
+
// (Hick's law). Derived, not effect-synced: apps load async.
|
|
108
|
+
const effectiveAppRef = appRef ??
|
|
109
|
+
(whatsappApps.length === 1
|
|
110
|
+
? { org, slug: whatsappApps[0].metadata?.slug ?? "" }
|
|
111
|
+
: null);
|
|
112
|
+
const selectedApp = effectiveAppRef
|
|
113
|
+
? whatsappApps.find((app) => app.metadata?.slug === effectiveAppRef.slug) ?? null
|
|
114
|
+
: null;
|
|
115
|
+
// Numbers the selected serving app already serves, matched on the same
|
|
116
|
+
// key the database enforces uniqueness on: (phone number, channel app).
|
|
117
|
+
// Advisory only — the list is permission-bounded; the install stays
|
|
118
|
+
// the arbiter.
|
|
119
|
+
const advisoryActive = deploymentMode === "cloud" && !installed;
|
|
120
|
+
const { channels: orgChannels } = useOrgAgentChannelList(advisoryActive && org ? org : null);
|
|
121
|
+
const trimmedNumber = phoneNumberId.trim();
|
|
122
|
+
const alreadyServed = useMemo(() => {
|
|
123
|
+
const selectedAppId = selectedApp?.metadata?.id;
|
|
124
|
+
if (!selectedAppId || !trimmedNumber)
|
|
125
|
+
return [];
|
|
126
|
+
return orgChannels.filter((c) => c.metadata?.id !== channel?.metadata?.id &&
|
|
127
|
+
c.status?.installState === AgentChannelInstallState.installed &&
|
|
128
|
+
c.status?.providerStatus?.case === "whatsapp" &&
|
|
129
|
+
c.status.providerStatus.value.phoneNumberId === trimmedNumber &&
|
|
130
|
+
c.status.providerStatus.value.channelAppId === selectedAppId);
|
|
131
|
+
}, [orgChannels, selectedApp, trimmedNumber, channel]);
|
|
132
|
+
// One click drives the whole journey: (create/update →) direct
|
|
133
|
+
// install → fetch the installed facts. No popup, so nothing here needs
|
|
134
|
+
// the synchronous-gesture treatment the Slack flow does.
|
|
135
|
+
const handleConnect = useCallback(async () => {
|
|
136
|
+
setError(null);
|
|
137
|
+
try {
|
|
138
|
+
let target = channel;
|
|
139
|
+
if (!target) {
|
|
140
|
+
target = await createChannel({
|
|
141
|
+
name: name.trim() || `${agentName} WhatsApp`,
|
|
142
|
+
org,
|
|
143
|
+
agentRef: {
|
|
144
|
+
org,
|
|
145
|
+
slug: agent.metadata?.slug ?? "",
|
|
146
|
+
},
|
|
147
|
+
enabled: true,
|
|
148
|
+
whatsapp: { phoneNumberId: trimmedNumber },
|
|
149
|
+
...(effectiveAppRef ? { appRef: effectiveAppRef } : {}),
|
|
150
|
+
...(environmentRefs.length > 0 ? { environmentRefs } : {}),
|
|
151
|
+
});
|
|
152
|
+
// The channel now exists even if the install below fails —
|
|
153
|
+
// surface it in the list either way.
|
|
154
|
+
onChannelsChanged?.();
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
// Retry mode: persist edits to the number or app before
|
|
158
|
+
// re-installing. Skipped when nothing changed so a plain retry
|
|
159
|
+
// is one call, not two.
|
|
160
|
+
const existingNumber = target.spec?.providerConfig?.case === "whatsapp"
|
|
161
|
+
? target.spec.providerConfig.value.phoneNumberId
|
|
162
|
+
: "";
|
|
163
|
+
const existingAppSlug = target.spec?.appRef?.slug ?? "";
|
|
164
|
+
if (existingNumber !== trimmedNumber ||
|
|
165
|
+
existingAppSlug !== (effectiveAppRef?.slug ?? "")) {
|
|
166
|
+
target = await save({
|
|
167
|
+
...agentChannelToInput(target),
|
|
168
|
+
whatsapp: { phoneNumberId: trimmedNumber },
|
|
169
|
+
...(effectiveAppRef ? { appRef: effectiveAppRef } : {}),
|
|
170
|
+
});
|
|
171
|
+
onChannelsChanged?.();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
await installer.install(target.metadata?.id ?? "");
|
|
175
|
+
// The install answer carries no channel — read the recorded facts
|
|
176
|
+
// (display number, verified name) for the success summary.
|
|
177
|
+
const result = await stigmer.agentChannel.get(target.metadata?.id ?? "");
|
|
178
|
+
setInstalled(result);
|
|
179
|
+
onChannelsChanged?.();
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
setError(installer.error ?? (err instanceof Error ? err : new Error(String(err))));
|
|
183
|
+
}
|
|
184
|
+
}, [agent, agentName, channel, createChannel, effectiveAppRef, environmentRefs, installer, name, org, onChannelsChanged, save, stigmer, trimmedNumber]);
|
|
185
|
+
const busy = isCreating || isSaving || installer.isInProgress;
|
|
186
|
+
const canConnect = trimmedNumber !== "" && effectiveAppRef !== null && !busy;
|
|
187
|
+
return (_jsxs("div", { className: "flex flex-col", children: [_jsxs("div", { className: "flex items-start justify-between gap-3 border-b border-border px-5 py-4", children: [_jsxs("div", { className: "flex items-center gap-2.5", children: [_jsx(WhatsAppMarkIcon, { className: "size-5 text-foreground" }), _jsx("h2", { id: "connect-whatsapp-title", className: "text-sm font-semibold text-foreground", children: channel ? "Reconnect to WhatsApp" : "Connect to WhatsApp" })] }), _jsx("button", { type: "button", onClick: onClose, "aria-label": "Close dialog", className: cn("rounded p-1 text-muted-foreground", "hover:bg-accent-hover hover:text-foreground", "focus:outline-none focus:ring-1 focus:ring-ring"), children: _jsx(CloseIcon, {}) })] }), _jsx("div", { className: "space-y-4 px-5 py-4", children: deploymentMode === "local" ? (
|
|
188
|
+
// Preempt the doomed flow: the OSS backend answers every
|
|
189
|
+
// install with FAILED_PRECONDITION.
|
|
190
|
+
_jsx(CloudFeatureNotice, { children: "Channel installs require Stigmer Cloud. The local backend manages channel configuration, but connecting to WhatsApp verifies your number through Stigmer's hosted webhook infrastructure." })) : installed ? (_jsx(InstalledSummary, { channel: installed, agentName: agentName })) : busy ? (_jsx(InstallingIndicator, {})) : (_jsxs(_Fragment, { children: [!channel && (_jsxs("label", { className: "block", children: [_jsx("span", { className: "mb-1.5 block text-xs font-medium text-foreground", children: "Channel name" }), _jsx("input", { type: "text", value: name, onChange: (e) => setName(e.target.value), disabled: busy, className: cn("w-full rounded-md border border-input bg-background px-3 py-1.5", "text-sm text-foreground placeholder:text-muted-foreground", "focus:outline-none focus:ring-1 focus:ring-ring") }), _jsx("span", { className: "mt-1 block text-xs text-muted-foreground", children: "Names the connection in Stigmer \u2014 pick something that identifies the number if you connect more than one." })] })), _jsxs("label", { className: "block", children: [_jsx("span", { className: "mb-1.5 block text-xs font-medium text-foreground", children: "Phone number ID" }), _jsx("input", { type: "text", value: phoneNumberId, onChange: (e) => setPhoneNumberId(e.target.value), disabled: busy, required: true, placeholder: "106540352242922", "data-cursor-target": "dialog-whatsapp-number", className: cn("w-full rounded-md border border-input bg-background px-3 py-1.5", "font-mono text-sm text-foreground placeholder:text-muted-foreground", "focus:outline-none focus:ring-1 focus:ring-ring") }), _jsx("span", { className: "mt-1 block text-xs text-muted-foreground", children: "From Meta's WhatsApp Manager (API Setup) \u2014 the numeric ID of the number this agent should answer, not the phone number itself." })] }), _jsx(ServingAppSection, { org: org, apps: whatsappApps, value: effectiveAppRef, onChange: setAppRef, disabled: busy, channelAppsHref: channelAppsHref, idPrefix: "stgm-whatsapp-app", appHint: "Your Meta app \u2014 its credentials verify and serve the number", emptyBody: _jsxs("p", { className: "text-xs text-muted-foreground", children: ["WhatsApp channels connect through your own Meta app \u2014 there is no shared platform app.", " ", _jsx(RegisterChannelAppAffordance, { channelAppsHref: channelAppsHref, children: "Register a channel app" }), " ", "with your Meta app's credentials first, then connect here."] }) }), alreadyServed.length > 0 && (_jsx(AlreadyServedNote, { channels: alreadyServed })), !channel && (_jsx(ToolCredentialsSection, { agent: agent, org: org, value: environmentRefs, onChange: setEnvironmentRefs, disabled: busy })), _jsx("p", { className: "text-sm text-muted-foreground", children: "When you continue, Stigmer verifies the number with WhatsApp through the selected app's credentials \u2014 the connection completes right here, with no browser hand-off." }), _jsxs("p", { className: "text-sm text-muted-foreground", children: ["People reach the agent by sending a WhatsApp message to the connected number \u2014 it answers as", " ", _jsx("span", { className: "font-medium text-foreground", children: agentName }), "."] }), _jsxs("p", { className: "text-xs text-muted-foreground", children: ["Conversations from WhatsApp are billed to", " ", _jsx("span", { className: "font-medium", children: org }), ". Each number serves one agent per channel app."] }), error && (_jsx(InstallRefusal, { error: error, channelAppsHref: channelAppsHref }))] })) }), _jsx("div", { className: "flex justify-end gap-2 border-t border-border px-5 py-3", children: installed || deploymentMode === "local" ? (_jsx(Button, { variant: "outline", size: "sm", onClick: onClose, children: installed ? "Done" : "Close" })) : (_jsxs(_Fragment, { children: [_jsx(Button, { variant: "ghost", size: "sm", onClick: onClose, disabled: busy, children: "Cancel" }), _jsx(Button, { variant: "primary", size: "sm", onClick: () => void handleConnect(), disabled: !canConnect, icon: _jsx(WhatsAppMarkIcon, { className: "size-3.5" }), "data-cursor-target": "dialog-connect-whatsapp", children: error ? "Try again" : channel ? "Reconnect to WhatsApp" : "Connect to WhatsApp" })] })) })] }));
|
|
191
|
+
}
|
|
192
|
+
// ---------------------------------------------------------------------------
|
|
193
|
+
// Install refusal — guided for the duplicate-number reason
|
|
194
|
+
// ---------------------------------------------------------------------------
|
|
195
|
+
/**
|
|
196
|
+
* The reason code the server attaches (google.rpc.ErrorInfo, domain
|
|
197
|
+
* stigmer.ai) to a duplicate-number initiateInstall refusal — see the
|
|
198
|
+
* initiateInstall rpc comment for the vocabulary.
|
|
199
|
+
*/
|
|
200
|
+
const REASON_NUMBER_ALREADY_CONNECTED = "WHATSAPP_NUMBER_ALREADY_CONNECTED";
|
|
201
|
+
/**
|
|
202
|
+
* Install-refusal rendering. The duplicate-number refusal is the one a
|
|
203
|
+
* user can act on from here, so it gets a guided treatment — names the
|
|
204
|
+
* occupied number (from the ErrorInfo metadata) and the ways out. Every
|
|
205
|
+
* other refusal (bad token, unknown number, dangling app — and any error
|
|
206
|
+
* from a server not attaching reasons) renders the server's copy
|
|
207
|
+
* verbatim — the server owns that vocabulary.
|
|
208
|
+
*/
|
|
209
|
+
function InstallRefusal({ error, channelAppsHref, }) {
|
|
210
|
+
const reason = getErrorReason(error);
|
|
211
|
+
if (reason?.reason !== REASON_NUMBER_ALREADY_CONNECTED) {
|
|
212
|
+
return _jsx(VerbatimRefusal, { error: error });
|
|
213
|
+
}
|
|
214
|
+
const number = reason.metadata.display_phone_number || "This number";
|
|
215
|
+
return (_jsxs(RefusalBox, { children: [_jsxs("p", { children: [_jsx("span", { className: "font-medium", children: number }), " is already connected to an agent through this channel app \u2014 each number serves one agent."] }), _jsxs("p", { children: ["To reach it with this agent, disconnect the existing channel, use a different number, or", " ", _jsx(RegisterChannelAppAffordance, { channelAppsHref: channelAppsHref, children: "register a channel app" }), " ", "and connect through that instead."] })] }));
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Pre-install advisory: the selected serving app already serves this
|
|
219
|
+
* number, matched on the exact key the database enforces — (phone
|
|
220
|
+
* number, serving app). Shown before the user spends the install
|
|
221
|
+
* round-trip discovering it. Best-effort by design: the list is bounded
|
|
222
|
+
* by the caller's visibility, so the copy warns rather than forbids.
|
|
223
|
+
*/
|
|
224
|
+
function AlreadyServedNote({ channels, }) {
|
|
225
|
+
return (_jsx("div", { role: "status", className: "space-y-0.5 text-xs text-warning", children: channels.map((c) => {
|
|
226
|
+
const whatsapp = c.status?.providerStatus?.case === "whatsapp"
|
|
227
|
+
? c.status.providerStatus.value
|
|
228
|
+
: null;
|
|
229
|
+
const number = whatsapp?.displayPhoneNumber || whatsapp?.phoneNumberId || "this number";
|
|
230
|
+
const agent = c.spec?.agentRef?.slug || "another agent";
|
|
231
|
+
return (_jsxs("p", { children: [_jsx("span", { className: "font-medium", children: number }), " is already served via ", agent, " \u2014 each number serves one agent per channel app, so disconnect that channel or pick a different number."] }, c.metadata?.id ?? number));
|
|
232
|
+
}) }));
|
|
233
|
+
}
|
|
234
|
+
// ---------------------------------------------------------------------------
|
|
235
|
+
// Installing indicator — a single live step, deliberately not a ladder
|
|
236
|
+
// ---------------------------------------------------------------------------
|
|
237
|
+
/**
|
|
238
|
+
* The busy state of a direct install: one server call, so one live line —
|
|
239
|
+
* not the Slack dialog's three-step OAuth ladder, which would render two
|
|
240
|
+
* permanently-empty rungs here. No cancel affordance either: there is no
|
|
241
|
+
* popup to abandon, and the call settles in seconds.
|
|
242
|
+
*/
|
|
243
|
+
function InstallingIndicator() {
|
|
244
|
+
return (_jsxs("div", { className: "flex items-center gap-2 text-sm text-foreground", "aria-live": "polite", children: [_jsx(Spinner, { className: "size-3.5 shrink-0" }), "Verifying the number with WhatsApp\u2026"] }));
|
|
245
|
+
}
|
|
246
|
+
// ---------------------------------------------------------------------------
|
|
247
|
+
// Installed summary — the success state with the observed WhatsApp facts
|
|
248
|
+
// ---------------------------------------------------------------------------
|
|
249
|
+
function InstalledSummary({ channel, agentName, }) {
|
|
250
|
+
const whatsapp = channel.status?.providerStatus?.case === "whatsapp"
|
|
251
|
+
? channel.status.providerStatus.value
|
|
252
|
+
: null;
|
|
253
|
+
const number = whatsapp?.displayPhoneNumber || whatsapp?.phoneNumberId || null;
|
|
254
|
+
return (_jsxs("div", { className: "space-y-2", role: "status", children: [_jsxs("div", { className: "flex items-center gap-2 text-sm font-medium text-foreground", children: [_jsx(CheckIcon, { className: "size-4 text-success" }), "Connected", number ? ` to ${number}` : "", whatsapp?.verifiedName ? ` (${whatsapp.verifiedName})` : ""] }), _jsxs("p", { className: "text-sm text-muted-foreground", children: ["Send a WhatsApp message to", " ", _jsx("span", { className: "font-medium text-foreground", children: number ?? "the connected number" }), " ", "and ask your question \u2014 answers come from", " ", _jsx("span", { className: "font-medium text-foreground", children: agentName }), "."] })] }));
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=ConnectWhatsAppDialog.js.map
|