@stigmer/react 3.12.1 → 3.12.3
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/access/ManageAccessDialog.d.ts.map +1 -1
- package/access/ManageAccessDialog.js +8 -19
- package/access/ManageAccessDialog.js.map +1 -1
- package/activity/format-relative-time.d.ts +11 -9
- package/activity/format-relative-time.d.ts.map +1 -1
- package/activity/format-relative-time.js +11 -9
- package/activity/format-relative-time.js.map +1 -1
- package/agent/steps/CapabilitiesStep.js +5 -2
- package/agent/steps/CapabilitiesStep.js.map +1 -1
- package/agent/steps/IdentityStep.d.ts.map +1 -1
- package/agent/steps/IdentityStep.js +6 -5
- package/agent/steps/IdentityStep.js.map +1 -1
- package/agent-instance/CreateAgentInstanceDialog.d.ts.map +1 -1
- package/agent-instance/CreateAgentInstanceDialog.js +15 -20
- package/agent-instance/CreateAgentInstanceDialog.js.map +1 -1
- package/api-key/ApiKeyCreatedAlert.d.ts.map +1 -1
- package/api-key/ApiKeyCreatedAlert.js +12 -20
- package/api-key/ApiKeyCreatedAlert.js.map +1 -1
- package/api-key/ApiKeyListPanel.d.ts.map +1 -1
- package/api-key/ApiKeyListPanel.js +3 -23
- package/api-key/ApiKeyListPanel.js.map +1 -1
- package/api-key/CreateApiKeyForm.d.ts.map +1 -1
- package/api-key/CreateApiKeyForm.js +6 -10
- package/api-key/CreateApiKeyForm.js.map +1 -1
- package/approval-defaults-context.d.ts +47 -0
- package/approval-defaults-context.d.ts.map +1 -0
- package/approval-defaults-context.js +27 -0
- package/approval-defaults-context.js.map +1 -0
- package/attachment/AttachmentImageLightbox.d.ts.map +1 -1
- package/attachment/AttachmentImageLightbox.js +8 -23
- package/attachment/AttachmentImageLightbox.js.map +1 -1
- package/attachment/index.d.ts +2 -0
- package/attachment/index.d.ts.map +1 -1
- package/attachment/index.js +1 -0
- package/attachment/index.js.map +1 -1
- package/attachment/vision-preflight.d.ts +113 -0
- package/attachment/vision-preflight.d.ts.map +1 -0
- package/attachment/vision-preflight.js +143 -0
- package/attachment/vision-preflight.js.map +1 -0
- package/billing/AutoRechargeCard.d.ts.map +1 -1
- package/billing/AutoRechargeCard.js +3 -2
- package/billing/AutoRechargeCard.js.map +1 -1
- package/billing/BillingSection.d.ts.map +1 -1
- package/billing/BillingSection.js +3 -2
- package/billing/BillingSection.js.map +1 -1
- package/channel/ChannelConversationsDialog.d.ts.map +1 -1
- package/channel/ChannelConversationsDialog.js +6 -21
- package/channel/ChannelConversationsDialog.js.map +1 -1
- package/channel/ChannelCredentialsDialog.d.ts.map +1 -1
- package/channel/ChannelCredentialsDialog.js +10 -21
- package/channel/ChannelCredentialsDialog.js.map +1 -1
- package/channel/ChannelTemplatesDialog.d.ts.map +1 -1
- package/channel/ChannelTemplatesDialog.js +7 -22
- package/channel/ChannelTemplatesDialog.js.map +1 -1
- package/channel/ConnectSlackDialog.d.ts.map +1 -1
- package/channel/ConnectSlackDialog.js +10 -23
- package/channel/ConnectSlackDialog.js.map +1 -1
- package/channel/ConnectWhatsAppDialog.d.ts.map +1 -1
- package/channel/ConnectWhatsAppDialog.js +10 -23
- package/channel/ConnectWhatsAppDialog.js.map +1 -1
- package/channel/useChannelSessions.d.ts.map +1 -1
- package/channel/useChannelSessions.js.map +1 -1
- package/channel-app/ChannelAppDetailPanel.d.ts.map +1 -1
- package/channel-app/ChannelAppDetailPanel.js +8 -5
- package/channel-app/ChannelAppDetailPanel.js.map +1 -1
- package/channel-app/CreateChannelAppForm.d.ts.map +1 -1
- package/channel-app/CreateChannelAppForm.js +12 -7
- package/channel-app/CreateChannelAppForm.js.map +1 -1
- package/channel-app/internal.d.ts +0 -1
- package/channel-app/internal.d.ts.map +1 -1
- package/channel-app/internal.js +5 -10
- package/channel-app/internal.js.map +1 -1
- package/composer/ComposerToolbar.js +2 -1
- package/composer/ComposerToolbar.js.map +1 -1
- package/composer/SessionComposer.d.ts +1 -1
- package/composer/SessionComposer.d.ts.map +1 -1
- package/composer/SessionComposer.js +120 -13
- package/composer/SessionComposer.js.map +1 -1
- package/composer/icons.d.ts +0 -1
- package/composer/icons.d.ts.map +1 -1
- package/composer/icons.js +0 -3
- package/composer/icons.js.map +1 -1
- package/conversation/ConversationAttentionBanner.d.ts +23 -6
- package/conversation/ConversationAttentionBanner.d.ts.map +1 -1
- package/conversation/ConversationAttentionBanner.js +25 -10
- package/conversation/ConversationAttentionBanner.js.map +1 -1
- package/conversation/ConversationComposer.js +1 -1
- package/conversation/ConversationComposer.js.map +1 -1
- package/conversation/ConversationListPane.d.ts.map +1 -1
- package/conversation/ConversationListPane.js +28 -8
- package/conversation/ConversationListPane.js.map +1 -1
- package/conversation/ConversationsWorkbench.d.ts.map +1 -1
- package/conversation/ConversationsWorkbench.js +1 -1
- package/conversation/ConversationsWorkbench.js.map +1 -1
- package/cursor-accounts/MemberCoverageTable.js +3 -14
- package/cursor-accounts/MemberCoverageTable.js.map +1 -1
- package/dashboard/DashboardFailedRuns.d.ts.map +1 -1
- package/dashboard/DashboardFailedRuns.js +2 -14
- package/dashboard/DashboardFailedRuns.js.map +1 -1
- package/environment/CreateEnvironmentForm.d.ts.map +1 -1
- package/environment/CreateEnvironmentForm.js +4 -8
- package/environment/CreateEnvironmentForm.js.map +1 -1
- package/environment/EnvVarForm.d.ts.map +1 -1
- package/environment/EnvVarForm.js +2 -4
- package/environment/EnvVarForm.js.map +1 -1
- package/environment/EnvironmentVariableEditor.d.ts.map +1 -1
- package/environment/EnvironmentVariableEditor.js +5 -7
- package/environment/EnvironmentVariableEditor.js.map +1 -1
- package/execution/ApprovalCard.d.ts.map +1 -1
- package/execution/ApprovalCard.js +13 -3
- package/execution/ApprovalCard.js.map +1 -1
- package/execution/ArtifactApplyButton.d.ts.map +1 -1
- package/execution/ArtifactApplyButton.js +2 -4
- package/execution/ArtifactApplyButton.js.map +1 -1
- package/execution/ArtifactPreviewModal.d.ts.map +1 -1
- package/execution/ArtifactPreviewModal.js +11 -17
- package/execution/ArtifactPreviewModal.js.map +1 -1
- package/execution/ExecutionErrorNotice.d.ts +36 -0
- package/execution/ExecutionErrorNotice.d.ts.map +1 -0
- package/execution/ExecutionErrorNotice.js +39 -0
- package/execution/ExecutionErrorNotice.js.map +1 -0
- package/execution/FilePathLink.d.ts.map +1 -1
- package/execution/FilePathLink.js +5 -8
- package/execution/FilePathLink.js.map +1 -1
- package/execution/FileReviewCard.d.ts.map +1 -1
- package/execution/FileReviewCard.js +1 -6
- package/execution/FileReviewCard.js.map +1 -1
- package/execution/FollowUpInput.d.ts.map +1 -1
- package/execution/FollowUpInput.js +1 -3
- package/execution/FollowUpInput.js.map +1 -1
- package/execution/LivenessStatusLine.d.ts +40 -0
- package/execution/LivenessStatusLine.d.ts.map +1 -0
- package/execution/LivenessStatusLine.js +34 -0
- package/execution/LivenessStatusLine.js.map +1 -0
- package/execution/MessageEntry.d.ts.map +1 -1
- package/execution/MessageEntry.js +31 -3
- package/execution/MessageEntry.js.map +1 -1
- package/execution/MessageThread.d.ts +25 -0
- package/execution/MessageThread.d.ts.map +1 -1
- package/execution/MessageThread.js +51 -36
- package/execution/MessageThread.js.map +1 -1
- package/execution/SetupProgress.d.ts.map +1 -1
- package/execution/SetupProgress.js +1 -1
- package/execution/SetupProgress.js.map +1 -1
- package/execution/SubAgentSection.d.ts.map +1 -1
- package/execution/SubAgentSection.js +9 -7
- package/execution/SubAgentSection.js.map +1 -1
- package/execution/TerminalSession.d.ts +30 -0
- package/execution/TerminalSession.d.ts.map +1 -1
- package/execution/TerminalSession.js +37 -1
- package/execution/TerminalSession.js.map +1 -1
- package/execution/ToolCallDetail.d.ts +9 -0
- package/execution/ToolCallDetail.d.ts.map +1 -1
- package/execution/ToolCallDetail.js +16 -0
- package/execution/ToolCallDetail.js.map +1 -1
- package/execution/ToolCallItem.d.ts +23 -7
- package/execution/ToolCallItem.d.ts.map +1 -1
- package/execution/ToolCallItem.js +120 -35
- package/execution/ToolCallItem.js.map +1 -1
- package/execution/ToolRunGroup.d.ts.map +1 -1
- package/execution/ToolRunGroup.js +11 -11
- package/execution/ToolRunGroup.js.map +1 -1
- package/execution/WriteBackCard.d.ts.map +1 -1
- package/execution/WriteBackCard.js +5 -20
- package/execution/WriteBackCard.js.map +1 -1
- package/execution/index.d.ts +7 -3
- package/execution/index.d.ts.map +1 -1
- package/execution/index.js +4 -2
- package/execution/index.js.map +1 -1
- package/execution/tool-categories.d.ts +93 -7
- package/execution/tool-categories.d.ts.map +1 -1
- package/execution/tool-categories.js +141 -5
- package/execution/tool-categories.js.map +1 -1
- package/execution/tool-presenter.d.ts +32 -1
- package/execution/tool-presenter.d.ts.map +1 -1
- package/execution/tool-presenter.js +10 -2
- package/execution/tool-presenter.js.map +1 -1
- package/execution/useArtifactInspection.d.ts.map +1 -1
- package/execution/useArtifactInspection.js +4 -7
- package/execution/useArtifactInspection.js.map +1 -1
- package/iam-policy/GrantAccessForm.d.ts.map +1 -1
- package/iam-policy/GrantAccessForm.js +2 -4
- package/iam-policy/GrantAccessForm.js.map +1 -1
- package/iam-policy/OrgMembersPanel.d.ts.map +1 -1
- package/iam-policy/OrgMembersPanel.js +3 -5
- package/iam-policy/OrgMembersPanel.js.map +1 -1
- package/iam-policy/RoleSelector.d.ts.map +1 -1
- package/iam-policy/RoleSelector.js +7 -1
- package/iam-policy/RoleSelector.js.map +1 -1
- package/identity-provider/CreateIdentityProviderForm.d.ts.map +1 -1
- package/identity-provider/CreateIdentityProviderForm.js +6 -9
- package/identity-provider/CreateIdentityProviderForm.js.map +1 -1
- package/identity-provider/IdentityProviderDetailPanel.d.ts.map +1 -1
- package/identity-provider/IdentityProviderDetailPanel.js +17 -26
- package/identity-provider/IdentityProviderDetailPanel.js.map +1 -1
- package/identity-provider/IdentityProviderListPanel.d.ts.map +1 -1
- package/identity-provider/IdentityProviderListPanel.js +2 -4
- package/identity-provider/IdentityProviderListPanel.js.map +1 -1
- package/identity-provider/IdentityProviderWizard.d.ts.map +1 -1
- package/identity-provider/IdentityProviderWizard.js +8 -7
- package/identity-provider/IdentityProviderWizard.js.map +1 -1
- package/identity-provider/SsoLoginPrompt.js +5 -6
- package/identity-provider/SsoLoginPrompt.js.map +1 -1
- package/index.d.ts +9 -8
- package/index.d.ts.map +1 -1
- package/index.js +4 -4
- package/index.js.map +1 -1
- package/internal/DecisionButton.d.ts.map +1 -1
- package/internal/DecisionButton.js +1 -6
- package/internal/DecisionButton.js.map +1 -1
- package/internal/DialogShell.d.ts +77 -0
- package/internal/DialogShell.d.ts.map +1 -0
- package/internal/DialogShell.js +77 -0
- package/internal/DialogShell.js.map +1 -0
- package/internal/SpinnerIcon.d.ts +22 -0
- package/internal/SpinnerIcon.d.ts.map +1 -0
- package/internal/SpinnerIcon.js +23 -0
- package/internal/SpinnerIcon.js.map +1 -0
- package/internal/select-element-text.d.ts +11 -0
- package/internal/select-element-text.d.ts.map +1 -0
- package/internal/select-element-text.js +19 -0
- package/internal/select-element-text.js.map +1 -0
- package/internal/thread-card/ThreadCardShell.d.ts +27 -10
- package/internal/thread-card/ThreadCardShell.d.ts.map +1 -1
- package/internal/thread-card/ThreadCardShell.js +11 -5
- package/internal/thread-card/ThreadCardShell.js.map +1 -1
- package/internal/thread-card/glyphs.d.ts +11 -2
- package/internal/thread-card/glyphs.d.ts.map +1 -1
- package/internal/thread-card/glyphs.js +9 -3
- package/internal/thread-card/glyphs.js.map +1 -1
- package/internal/thread-card/index.d.ts +1 -1
- package/internal/thread-card/index.d.ts.map +1 -1
- package/internal/thread-card/index.js.map +1 -1
- package/internal/useCopyFeedback.d.ts +28 -0
- package/internal/useCopyFeedback.d.ts.map +1 -0
- package/internal/useCopyFeedback.js +40 -0
- package/internal/useCopyFeedback.js.map +1 -0
- package/invitation/InvitationCreatedAlert.d.ts.map +1 -1
- package/invitation/InvitationCreatedAlert.js +12 -19
- package/invitation/InvitationCreatedAlert.js.map +1 -1
- package/invitation/InvitationManager.d.ts.map +1 -1
- package/invitation/InvitationManager.js +14 -21
- package/invitation/InvitationManager.js.map +1 -1
- package/invitation/InvitationRedemption.d.ts.map +1 -1
- package/invitation/InvitationRedemption.js +2 -4
- package/invitation/InvitationRedemption.js.map +1 -1
- package/library/useExportResource.d.ts.map +1 -1
- package/library/useExportResource.js +16 -27
- package/library/useExportResource.js.map +1 -1
- package/manifest/ApplyManifestDialog.d.ts.map +1 -1
- package/manifest/ApplyManifestDialog.js +7 -17
- package/manifest/ApplyManifestDialog.js.map +1 -1
- package/manifest/EditResourceYamlDialog.d.ts.map +1 -1
- package/manifest/EditResourceYamlDialog.js +3 -19
- package/manifest/EditResourceYamlDialog.js.map +1 -1
- package/mcp-server/DefinitionDriftNotice.d.ts +42 -0
- package/mcp-server/DefinitionDriftNotice.d.ts.map +1 -0
- package/mcp-server/DefinitionDriftNotice.js +52 -0
- package/mcp-server/DefinitionDriftNotice.js.map +1 -0
- package/mcp-server/McpServerConnectDialog.d.ts.map +1 -1
- package/mcp-server/McpServerConnectDialog.js +8 -20
- package/mcp-server/McpServerConnectDialog.js.map +1 -1
- package/mcp-server/McpServerDetailView.d.ts.map +1 -1
- package/mcp-server/McpServerDetailView.js +50 -28
- package/mcp-server/McpServerDetailView.js.map +1 -1
- package/mcp-server/OAuthAppForm.d.ts.map +1 -1
- package/mcp-server/OAuthAppForm.js +2 -4
- package/mcp-server/OAuthAppForm.js.map +1 -1
- package/mcp-server/internal/definitionDrift.d.ts +39 -0
- package/mcp-server/internal/definitionDrift.d.ts.map +1 -0
- package/mcp-server/internal/definitionDrift.js +122 -0
- package/mcp-server/internal/definitionDrift.js.map +1 -0
- package/mcp-server/internal/mcpServerToInput.d.ts.map +1 -1
- package/mcp-server/internal/mcpServerToInput.js +3 -0
- package/mcp-server/internal/mcpServerToInput.js.map +1 -1
- package/mcp-server/steps/EnvironmentAuthStep.d.ts.map +1 -1
- package/mcp-server/steps/EnvironmentAuthStep.js +8 -4
- package/mcp-server/steps/EnvironmentAuthStep.js.map +1 -1
- package/mcp-server/steps/IdentityTransportStep.d.ts.map +1 -1
- package/mcp-server/steps/IdentityTransportStep.js +5 -4
- package/mcp-server/steps/IdentityTransportStep.js.map +1 -1
- package/mcp-server/useMcpServerConnect.d.ts +1 -1
- package/mcp-server/useMcpServerDefinitionDrift.d.ts +44 -0
- package/mcp-server/useMcpServerDefinitionDrift.d.ts.map +1 -0
- package/mcp-server/useMcpServerDefinitionDrift.js +61 -0
- package/mcp-server/useMcpServerDefinitionDrift.js.map +1 -0
- package/models/ModelRegistryContext.d.ts +7 -1
- package/models/ModelRegistryContext.d.ts.map +1 -1
- package/models/ModelRegistryContext.js.map +1 -1
- package/models/ModelSelector.js +9 -1
- package/models/ModelSelector.js.map +1 -1
- package/models/index.d.ts +2 -2
- package/models/index.d.ts.map +1 -1
- package/models/index.js +1 -1
- package/models/index.js.map +1 -1
- package/models/registry.d.ts +88 -6
- package/models/registry.d.ts.map +1 -1
- package/models/registry.js +133 -27
- package/models/registry.js.map +1 -1
- package/models/useModelRegistry.d.ts +7 -1
- package/models/useModelRegistry.d.ts.map +1 -1
- package/models/useModelRegistry.js +3 -2
- package/models/useModelRegistry.js.map +1 -1
- package/oauth-app/CreateOAuthAppForm.d.ts.map +1 -1
- package/oauth-app/CreateOAuthAppForm.js +4 -5
- package/oauth-app/CreateOAuthAppForm.js.map +1 -1
- package/oauth-app/OAuthAppDetailPanel.d.ts.map +1 -1
- package/oauth-app/OAuthAppDetailPanel.js +5 -6
- package/oauth-app/OAuthAppDetailPanel.js.map +1 -1
- package/organization/CreateOrganizationForm.d.ts.map +1 -1
- package/organization/CreateOrganizationForm.js +5 -9
- package/organization/CreateOrganizationForm.js.map +1 -1
- package/organization/OrgProfilePanel.d.ts.map +1 -1
- package/organization/OrgProfilePanel.js +7 -16
- package/organization/OrgProfilePanel.js.map +1 -1
- package/package.json +4 -4
- package/platform-client/CreatePlatformClientForm.d.ts.map +1 -1
- package/platform-client/CreatePlatformClientForm.js +5 -6
- package/platform-client/CreatePlatformClientForm.js.map +1 -1
- package/platform-client/PlatformClientDetailPanel.d.ts.map +1 -1
- package/platform-client/PlatformClientDetailPanel.js +6 -7
- package/platform-client/PlatformClientDetailPanel.js.map +1 -1
- package/platform-client/PlatformClientListPanel.d.ts.map +1 -1
- package/platform-client/PlatformClientListPanel.js +2 -4
- package/platform-client/PlatformClientListPanel.js.map +1 -1
- package/platform-client/PlatformClientSecretAlert.d.ts.map +1 -1
- package/platform-client/PlatformClientSecretAlert.js +18 -25
- package/platform-client/PlatformClientSecretAlert.js.map +1 -1
- package/provider.d.ts +34 -1
- package/provider.d.ts.map +1 -1
- package/provider.js +14 -7
- package/provider.js.map +1 -1
- package/resource-creation/WizardNav.d.ts.map +1 -1
- package/resource-creation/WizardNav.js +2 -4
- package/resource-creation/WizardNav.js.map +1 -1
- package/resource-detail/ConfirmDialog.d.ts +2 -3
- package/resource-detail/ConfirmDialog.d.ts.map +1 -1
- package/resource-detail/ConfirmDialog.js +8 -20
- package/resource-detail/ConfirmDialog.js.map +1 -1
- package/resource-detail/useCopyResource.d.ts +4 -3
- package/resource-detail/useCopyResource.d.ts.map +1 -1
- package/resource-detail/useCopyResource.js +10 -19
- package/resource-detail/useCopyResource.js.map +1 -1
- package/schedule/ScheduleDetailView.d.ts.map +1 -1
- package/schedule/ScheduleDetailView.js +2 -4
- package/schedule/ScheduleDetailView.js.map +1 -1
- package/schedule/ScheduleForm.d.ts.map +1 -1
- package/schedule/ScheduleForm.js +6 -7
- package/schedule/ScheduleForm.js.map +1 -1
- package/session/NewSessionViewer.d.ts +52 -2
- package/session/NewSessionViewer.d.ts.map +1 -1
- package/session/NewSessionViewer.js +21 -6
- package/session/NewSessionViewer.js.map +1 -1
- package/session/SessionViewer.d.ts +63 -2
- package/session/SessionViewer.d.ts.map +1 -1
- package/session/SessionViewer.js +43 -17
- package/session/SessionViewer.js.map +1 -1
- package/session/audience.d.ts +17 -0
- package/session/audience.d.ts.map +1 -1
- package/session/index.d.ts +2 -1
- package/session/index.d.ts.map +1 -1
- package/session/index.js.map +1 -1
- package/session/run-config.d.ts +50 -0
- package/session/run-config.d.ts.map +1 -0
- package/session/run-config.js +15 -0
- package/session/run-config.js.map +1 -0
- package/session/useNewSessionFlow.d.ts +11 -0
- package/session/useNewSessionFlow.d.ts.map +1 -1
- package/session/useNewSessionFlow.js +29 -2
- package/session/useNewSessionFlow.js.map +1 -1
- package/session/useSessionConversation.d.ts +7 -7
- package/session/useSessionConversation.d.ts.map +1 -1
- package/session/useSessionConversation.js +2 -0
- package/session/useSessionConversation.js.map +1 -1
- package/session/useSessionPageFlow.d.ts +18 -4
- package/session/useSessionPageFlow.d.ts.map +1 -1
- package/session/useSessionPageFlow.js +33 -6
- package/session/useSessionPageFlow.js.map +1 -1
- package/session/useSessionPanel.d.ts +37 -2
- package/session/useSessionPanel.d.ts.map +1 -1
- package/session/useSessionPanel.js +44 -10
- package/session/useSessionPanel.js.map +1 -1
- package/settings/ApiKeysSection.d.ts.map +1 -1
- package/settings/ApiKeysSection.js +3 -2
- package/settings/ApiKeysSection.js.map +1 -1
- package/settings/ChannelAppsSection.d.ts.map +1 -1
- package/settings/ChannelAppsSection.js +3 -2
- package/settings/ChannelAppsSection.js.map +1 -1
- package/settings/EnvironmentsSection.js +5 -3
- package/settings/EnvironmentsSection.js.map +1 -1
- package/settings/IdentityProvidersSection.d.ts.map +1 -1
- package/settings/IdentityProvidersSection.js +3 -2
- package/settings/IdentityProvidersSection.js.map +1 -1
- package/settings/InvitationsSection.d.ts.map +1 -1
- package/settings/InvitationsSection.js +3 -1
- package/settings/InvitationsSection.js.map +1 -1
- package/settings/MembersSection.d.ts.map +1 -1
- package/settings/MembersSection.js +3 -1
- package/settings/MembersSection.js.map +1 -1
- package/settings/OAuthAppsSection.d.ts.map +1 -1
- package/settings/OAuthAppsSection.js +3 -2
- package/settings/OAuthAppsSection.js.map +1 -1
- package/settings/OrgProfileSection.d.ts.map +1 -1
- package/settings/OrgProfileSection.js +3 -2
- package/settings/OrgProfileSection.js.map +1 -1
- package/settings/PlatformClientsSection.d.ts.map +1 -1
- package/settings/PlatformClientsSection.js +3 -2
- package/settings/PlatformClientsSection.js.map +1 -1
- package/settings/UsageSection.d.ts.map +1 -1
- package/settings/UsageSection.js +3 -1
- package/settings/UsageSection.js.map +1 -1
- package/sharing/ShareAgentDialog.d.ts.map +1 -1
- package/sharing/ShareAgentDialog.js +19 -26
- package/sharing/ShareAgentDialog.js.map +1 -1
- package/sidebar/chrome.d.ts +3 -4
- package/sidebar/chrome.d.ts.map +1 -1
- package/sidebar/chrome.js +5 -4
- package/sidebar/chrome.js.map +1 -1
- package/skill/SkillDiffDialog.d.ts.map +1 -1
- package/skill/SkillDiffDialog.js +5 -21
- package/skill/SkillDiffDialog.js.map +1 -1
- package/src/access/ManageAccessDialog.tsx +14 -28
- package/src/activity/format-relative-time.ts +11 -9
- package/src/agent/steps/CapabilitiesStep.tsx +6 -3
- package/src/agent/steps/IdentityStep.tsx +19 -12
- package/src/agent-instance/CreateAgentInstanceDialog.tsx +29 -33
- package/src/api-key/ApiKeyCreatedAlert.tsx +10 -19
- package/src/api-key/ApiKeyListPanel.tsx +3 -39
- package/src/api-key/CreateApiKeyForm.tsx +12 -26
- package/src/approval-defaults-context.ts +56 -0
- package/src/attachment/AttachmentImageLightbox.tsx +13 -36
- package/src/attachment/__tests__/vision-preflight.test.ts +311 -0
- package/src/attachment/index.ts +12 -0
- package/src/attachment/vision-preflight.ts +236 -0
- package/src/billing/AutoRechargeCard.tsx +5 -4
- package/src/billing/BillingSection.tsx +4 -3
- package/src/channel/ChannelConversationsDialog.tsx +14 -29
- package/src/channel/ChannelCredentialsDialog.tsx +19 -29
- package/src/channel/ChannelTemplatesDialog.tsx +16 -31
- package/src/channel/ConnectSlackDialog.tsx +19 -31
- package/src/channel/ConnectWhatsAppDialog.tsx +19 -31
- package/src/channel/useChannelSessions.ts +3 -0
- package/src/channel-app/ChannelAppDetailPanel.tsx +15 -12
- package/src/channel-app/CreateChannelAppForm.tsx +17 -12
- package/src/channel-app/internal.tsx +5 -25
- package/src/composer/ComposerToolbar.tsx +1 -1
- package/src/composer/SessionComposer.tsx +160 -13
- package/src/composer/__tests__/SessionComposer-modelCoherence.test.tsx +220 -0
- package/src/composer/__tests__/SessionComposer-visionPreflight.test.tsx +222 -0
- package/src/composer/icons.tsx +0 -18
- package/src/conversation/ConversationAttentionBanner.tsx +64 -19
- package/src/conversation/ConversationComposer.tsx +1 -1
- package/src/conversation/ConversationListPane.tsx +46 -20
- package/src/conversation/ConversationsWorkbench.tsx +1 -0
- package/src/conversation/__tests__/ConversationAttentionBanner.test.tsx +76 -2
- package/src/conversation/__tests__/ConversationListPane.test.tsx +15 -4
- package/src/cursor-accounts/MemberCoverageTable.tsx +3 -14
- package/src/cursor-accounts/__tests__/CursorAccountsConsole.test.tsx +2 -10
- package/src/dashboard/DashboardFailedRuns.tsx +2 -12
- package/src/environment/CreateEnvironmentForm.tsx +8 -27
- package/src/environment/EnvVarForm.tsx +2 -18
- package/src/environment/EnvironmentVariableEditor.tsx +5 -21
- package/src/execution/ApprovalCard.tsx +23 -2
- package/src/execution/ArtifactApplyButton.tsx +2 -17
- package/src/execution/ArtifactPreviewModal.tsx +15 -27
- package/src/execution/ExecutionErrorNotice.tsx +99 -0
- package/src/execution/FilePathLink.tsx +5 -9
- package/src/execution/FileReviewCard.tsx +1 -20
- package/src/execution/FollowUpInput.tsx +1 -16
- package/src/execution/LivenessStatusLine.tsx +59 -0
- package/src/execution/MessageEntry.tsx +136 -25
- package/src/execution/MessageThread.tsx +84 -83
- package/src/execution/SetupProgress.tsx +5 -1
- package/src/execution/SubAgentSection.tsx +9 -20
- package/src/execution/TerminalSession.tsx +97 -10
- package/src/execution/ToolCallDetail.tsx +19 -0
- package/src/execution/ToolCallItem.tsx +175 -44
- package/src/execution/ToolRunGroup.tsx +30 -32
- package/src/execution/WriteBackCard.tsx +5 -24
- package/src/execution/__tests__/MessageEntry-copy.test.tsx +125 -0
- package/src/execution/__tests__/MessageThread.test.tsx +97 -0
- package/src/execution/__tests__/TerminalSession.test.tsx +71 -1
- package/src/execution/__tests__/ToolCallDetail.test.tsx +33 -1
- package/src/execution/__tests__/ToolCallItem.test.tsx +299 -11
- package/src/execution/__tests__/ToolRunGroup.test.tsx +41 -9
- package/src/execution/__tests__/intent-title.test.tsx +221 -0
- package/src/execution/__tests__/message-thread-slots.test.tsx +92 -0
- package/src/execution/__tests__/tool-presenter.test.tsx +41 -4
- package/src/execution/index.ts +11 -2
- package/src/execution/tool-categories.ts +195 -9
- package/src/execution/tool-presenter.ts +44 -2
- package/src/execution/useArtifactInspection.ts +4 -8
- package/src/iam-policy/GrantAccessForm.tsx +2 -18
- package/src/iam-policy/OrgMembersPanel.tsx +3 -19
- package/src/iam-policy/RoleSelector.tsx +8 -1
- package/src/identity-provider/CreateIdentityProviderForm.tsx +13 -31
- package/src/identity-provider/IdentityProviderDetailPanel.tsx +24 -49
- package/src/identity-provider/IdentityProviderListPanel.tsx +2 -18
- package/src/identity-provider/IdentityProviderWizard.tsx +15 -32
- package/src/identity-provider/SsoLoginPrompt.tsx +6 -21
- package/src/index.ts +26 -1
- package/src/internal/DecisionButton.tsx +1 -20
- package/src/internal/DialogShell.tsx +169 -0
- package/src/internal/SpinnerIcon.tsx +42 -0
- package/src/internal/__tests__/DialogShell.test.tsx +223 -0
- package/src/internal/__tests__/ThreadCardShell.test.tsx +43 -7
- package/src/internal/__tests__/useCopyFeedback.test.ts +92 -0
- package/src/internal/select-element-text.ts +17 -0
- package/src/internal/thread-card/ThreadCardShell.tsx +53 -21
- package/src/internal/thread-card/glyphs.tsx +24 -3
- package/src/internal/thread-card/index.ts +1 -0
- package/src/internal/useCopyFeedback.ts +61 -0
- package/src/invitation/InvitationCreatedAlert.tsx +10 -18
- package/src/invitation/InvitationManager.tsx +23 -34
- package/src/invitation/InvitationRedemption.tsx +2 -18
- package/src/library/useExportResource.ts +15 -29
- package/src/manifest/ApplyManifestDialog.tsx +8 -26
- package/src/manifest/EditResourceYamlDialog.tsx +4 -31
- package/src/mcp-server/DefinitionDriftNotice.tsx +120 -0
- package/src/mcp-server/McpServerConnectDialog.tsx +15 -29
- package/src/mcp-server/McpServerDetailView.tsx +69 -49
- package/src/mcp-server/OAuthAppForm.tsx +2 -18
- package/src/mcp-server/__tests__/DefinitionDriftNotice.test.tsx +57 -0
- package/src/mcp-server/__tests__/definitionDrift.test.ts +245 -0
- package/src/mcp-server/__tests__/mcpServerToInput.test.ts +201 -0
- package/src/mcp-server/__tests__/useMcpServerDefinitionDrift.test.tsx +173 -0
- package/src/mcp-server/internal/definitionDrift.ts +158 -0
- package/src/mcp-server/internal/mcpServerToInput.ts +3 -0
- package/src/mcp-server/steps/EnvironmentAuthStep.tsx +19 -19
- package/src/mcp-server/steps/IdentityTransportStep.tsx +24 -23
- package/src/mcp-server/useMcpServerConnect.ts +1 -1
- package/src/mcp-server/useMcpServerDefinitionDrift.ts +95 -0
- package/src/models/ModelRegistryContext.ts +7 -1
- package/src/models/ModelSelector.tsx +37 -0
- package/src/models/__tests__/ModelSelector-visionIndicator.test.tsx +129 -0
- package/src/models/__tests__/resolveDefaultModel.test.ts +115 -0
- package/src/models/__tests__/useModelRegistry.test.tsx +99 -4
- package/src/models/index.ts +2 -2
- package/src/models/registry.ts +196 -29
- package/src/models/useModelRegistry.ts +10 -2
- package/src/oauth-app/CreateOAuthAppForm.tsx +16 -31
- package/src/oauth-app/OAuthAppDetailPanel.tsx +16 -31
- package/src/organization/CreateOrganizationForm.tsx +10 -29
- package/src/organization/OrgProfilePanel.tsx +13 -44
- package/src/platform-client/CreatePlatformClientForm.tsx +9 -29
- package/src/platform-client/PlatformClientDetailPanel.tsx +10 -30
- package/src/platform-client/PlatformClientListPanel.tsx +2 -18
- package/src/platform-client/PlatformClientSecretAlert.tsx +26 -55
- package/src/provider.tsx +76 -33
- package/src/resource-creation/WizardNav.tsx +2 -18
- package/src/resource-detail/ConfirmDialog.tsx +9 -30
- package/src/resource-detail/useCopyResource.ts +17 -23
- package/src/schedule/ScheduleDetailView.tsx +2 -18
- package/src/schedule/ScheduleForm.tsx +19 -34
- package/src/session/NewSessionViewer.tsx +85 -7
- package/src/session/SessionViewer.tsx +120 -17
- package/src/session/__tests__/audienceWiring.test.tsx +76 -0
- package/src/session/__tests__/panelNegotiation.test.tsx +302 -0
- package/src/session/__tests__/useNewSessionFlow.test.tsx +134 -5
- package/src/session/__tests__/useSessionPageFlow.autoApprove.test.tsx +74 -0
- package/src/session/__tests__/useSessionPageFlow.runConfig.test.tsx +157 -0
- package/src/session/__tests__/useSessionPanel.test.ts +114 -0
- package/src/session/audience.ts +18 -0
- package/src/session/index.ts +2 -1
- package/src/session/run-config.ts +59 -0
- package/src/session/useNewSessionFlow.ts +39 -2
- package/src/session/useSessionConversation.ts +10 -8
- package/src/session/useSessionPageFlow.ts +51 -10
- package/src/session/useSessionPanel.ts +91 -10
- package/src/settings/ApiKeysSection.tsx +4 -3
- package/src/settings/ChannelAppsSection.tsx +4 -3
- package/src/settings/EnvironmentsSection.tsx +8 -5
- package/src/settings/IdentityProvidersSection.tsx +4 -3
- package/src/settings/InvitationsSection.tsx +4 -2
- package/src/settings/MembersSection.tsx +4 -2
- package/src/settings/OAuthAppsSection.tsx +4 -3
- package/src/settings/OrgProfileSection.tsx +4 -3
- package/src/settings/PlatformClientsSection.tsx +4 -3
- package/src/settings/UsageSection.tsx +4 -2
- package/src/sharing/ShareAgentDialog.tsx +33 -37
- package/src/sidebar/__tests__/WorkspaceSidebar.test.tsx +4 -1
- package/src/sidebar/chrome.tsx +6 -6
- package/src/skill/SkillDiffDialog.tsx +13 -36
- package/src/styles.css +43 -0
- package/src/version-history/VersionTimelineEntry.tsx +1 -21
- package/src/workflow/FailedRunsWidget.tsx +2 -9
- package/src/workflow/PendingApprovalsWidget.tsx +2 -9
- package/src/workflow/ViewYamlDialog.tsx +21 -55
- package/src/workflow/WorkflowArchitectDialog.tsx +17 -68
- package/src/workflow/WorkflowArtifactDocument.tsx +5 -9
- package/src/workflow/WorkflowCanvasEditor.tsx +2 -0
- package/src/workflow/WorkflowCanvasInner.tsx +14 -1
- package/src/workflow/WorkflowDiffGraph.tsx +7 -1
- package/src/workflow/WorkflowExecutionViewer.tsx +88 -11
- package/src/workflow/WorkflowExplainDialog.tsx +18 -60
- package/src/workflow/WorkflowGraphFullscreenDialog.tsx +14 -26
- package/src/workflow/WorkflowOverviewGraph.tsx +9 -1
- package/src/workflow/WorkflowRefinePanel.tsx +2 -18
- package/src/workflow/WorkflowRepairCard.tsx +2 -18
- package/src/workflow/WorkflowRunDialog.tsx +23 -70
- package/src/workflow/WorkflowTaskApprovalSummary.tsx +2 -17
- package/src/workflow/WorkflowVersionBadge.tsx +4 -13
- package/src/workflow/WorkflowVersionTimeline.tsx +1 -25
- package/src/workflow/__tests__/panelNegotiation.test.tsx +230 -0
- package/src/workflow/__tests__/useWorkflowCanvas.dirty.test.tsx +178 -0
- package/src/workflow/__tests__/useWorkflowCanvas.drag.test.tsx +224 -0
- package/src/workflow/__tests__/useWorkflowExecutionPanel.test.ts +100 -0
- package/src/workflow/execution-comparison/ExecutionComparisonPicker.tsx +20 -41
- package/src/workflow/execution-history/ExecutionHistoryTable.tsx +1 -25
- package/src/workflow/index.ts +1 -0
- package/src/workflow/instance/CreateWorkflowInstanceDialog.tsx +14 -27
- package/src/workflow/instance/WorkflowInstanceDetailPanel.tsx +2 -1
- package/src/workflow/picker/BranchAddPopover.tsx +4 -3
- package/src/workflow/templates/WorkflowTemplatePreview.tsx +18 -28
- package/src/workflow/useApprovalBoundary.ts +1 -1
- package/src/workflow/useWorkflowCanvas.ts +114 -11
- package/src/workflow/useWorkflowExecutionPanel.ts +95 -13
- package/styles.css +1 -1
- package/version-history/VersionTimelineEntry.d.ts.map +1 -1
- package/version-history/VersionTimelineEntry.js +1 -23
- package/version-history/VersionTimelineEntry.js.map +1 -1
- package/workflow/CanvasTransitionEdge.d.ts +1 -1
- package/workflow/FailedRunsWidget.d.ts.map +1 -1
- package/workflow/FailedRunsWidget.js +2 -11
- package/workflow/FailedRunsWidget.js.map +1 -1
- package/workflow/PendingApprovalsWidget.d.ts.map +1 -1
- package/workflow/PendingApprovalsWidget.js +2 -11
- package/workflow/PendingApprovalsWidget.js.map +1 -1
- package/workflow/ViewYamlDialog.d.ts.map +1 -1
- package/workflow/ViewYamlDialog.js +14 -49
- package/workflow/ViewYamlDialog.js.map +1 -1
- package/workflow/WorkflowArchitectDialog.d.ts.map +1 -1
- package/workflow/WorkflowArchitectDialog.js +10 -33
- package/workflow/WorkflowArchitectDialog.js.map +1 -1
- package/workflow/WorkflowArtifactDocument.d.ts.map +1 -1
- package/workflow/WorkflowArtifactDocument.js +5 -8
- package/workflow/WorkflowArtifactDocument.js.map +1 -1
- package/workflow/WorkflowCanvasEditor.d.ts.map +1 -1
- package/workflow/WorkflowCanvasEditor.js +1 -1
- package/workflow/WorkflowCanvasEditor.js.map +1 -1
- package/workflow/WorkflowCanvasInner.d.ts +4 -2
- package/workflow/WorkflowCanvasInner.d.ts.map +1 -1
- package/workflow/WorkflowCanvasInner.js +7 -3
- package/workflow/WorkflowCanvasInner.js.map +1 -1
- package/workflow/WorkflowDiffGraph.js +6 -2
- package/workflow/WorkflowDiffGraph.js.map +1 -1
- package/workflow/WorkflowExecutionViewer.d.ts +51 -0
- package/workflow/WorkflowExecutionViewer.d.ts.map +1 -1
- package/workflow/WorkflowExecutionViewer.js +23 -6
- package/workflow/WorkflowExecutionViewer.js.map +1 -1
- package/workflow/WorkflowExplainDialog.d.ts.map +1 -1
- package/workflow/WorkflowExplainDialog.js +10 -28
- package/workflow/WorkflowExplainDialog.js.map +1 -1
- package/workflow/WorkflowGraphFullscreenDialog.d.ts.map +1 -1
- package/workflow/WorkflowGraphFullscreenDialog.js +11 -17
- package/workflow/WorkflowGraphFullscreenDialog.js.map +1 -1
- package/workflow/WorkflowOverviewGraph.js +8 -2
- package/workflow/WorkflowOverviewGraph.js.map +1 -1
- package/workflow/WorkflowRefinePanel.d.ts.map +1 -1
- package/workflow/WorkflowRefinePanel.js +2 -4
- package/workflow/WorkflowRefinePanel.js.map +1 -1
- package/workflow/WorkflowRepairCard.d.ts.map +1 -1
- package/workflow/WorkflowRepairCard.js +2 -4
- package/workflow/WorkflowRepairCard.js.map +1 -1
- package/workflow/WorkflowRunDialog.d.ts.map +1 -1
- package/workflow/WorkflowRunDialog.js +14 -35
- package/workflow/WorkflowRunDialog.js.map +1 -1
- package/workflow/WorkflowTaskApprovalSummary.d.ts.map +1 -1
- package/workflow/WorkflowTaskApprovalSummary.js +2 -4
- package/workflow/WorkflowTaskApprovalSummary.js.map +1 -1
- package/workflow/WorkflowVersionBadge.d.ts.map +1 -1
- package/workflow/WorkflowVersionBadge.js +4 -13
- package/workflow/WorkflowVersionBadge.js.map +1 -1
- package/workflow/WorkflowVersionTimeline.d.ts.map +1 -1
- package/workflow/WorkflowVersionTimeline.js +1 -26
- package/workflow/WorkflowVersionTimeline.js.map +1 -1
- package/workflow/execution-comparison/ExecutionComparisonPicker.d.ts.map +1 -1
- package/workflow/execution-comparison/ExecutionComparisonPicker.js +14 -40
- package/workflow/execution-comparison/ExecutionComparisonPicker.js.map +1 -1
- package/workflow/execution-history/ExecutionHistoryTable.d.ts.map +1 -1
- package/workflow/execution-history/ExecutionHistoryTable.js +1 -24
- package/workflow/execution-history/ExecutionHistoryTable.js.map +1 -1
- package/workflow/index.d.ts +1 -1
- package/workflow/index.d.ts.map +1 -1
- package/workflow/index.js.map +1 -1
- package/workflow/instance/CreateWorkflowInstanceDialog.d.ts.map +1 -1
- package/workflow/instance/CreateWorkflowInstanceDialog.js +7 -20
- package/workflow/instance/CreateWorkflowInstanceDialog.js.map +1 -1
- package/workflow/instance/WorkflowInstanceDetailPanel.d.ts.map +1 -1
- package/workflow/instance/WorkflowInstanceDetailPanel.js +1 -1
- package/workflow/instance/WorkflowInstanceDetailPanel.js.map +1 -1
- package/workflow/picker/BranchAddPopover.d.ts.map +1 -1
- package/workflow/picker/BranchAddPopover.js +3 -2
- package/workflow/picker/BranchAddPopover.js.map +1 -1
- package/workflow/templates/WorkflowTemplatePreview.d.ts +1 -1
- package/workflow/templates/WorkflowTemplatePreview.d.ts.map +1 -1
- package/workflow/templates/WorkflowTemplatePreview.js +10 -22
- package/workflow/templates/WorkflowTemplatePreview.js.map +1 -1
- package/workflow/useApprovalBoundary.d.ts +1 -1
- package/workflow/useApprovalBoundary.js +1 -1
- package/workflow/useWorkflowCanvas.d.ts +5 -1
- package/workflow/useWorkflowCanvas.d.ts.map +1 -1
- package/workflow/useWorkflowCanvas.js +99 -13
- package/workflow/useWorkflowCanvas.js.map +1 -1
- package/workflow/useWorkflowExecutionPanel.d.ts +38 -2
- package/workflow/useWorkflowExecutionPanel.d.ts.map +1 -1
- package/workflow/useWorkflowExecutionPanel.js +46 -13
- package/workflow/useWorkflowExecutionPanel.js.map +1 -1
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { describe, it, expect, vi, afterEach, beforeAll } from "vitest";
|
|
2
|
+
import { render, screen, cleanup, fireEvent, waitFor } from "@testing-library/react";
|
|
3
|
+
import { type ReactNode } from "react";
|
|
4
|
+
import type { Stigmer } from "@stigmer/sdk";
|
|
5
|
+
import { StigmerContext } from "../../context";
|
|
6
|
+
import { ModelRegistryContext } from "../../models/ModelRegistryContext";
|
|
7
|
+
import type { ModelInfo } from "../../models/registry";
|
|
8
|
+
import { SessionComposer } from "../SessionComposer";
|
|
9
|
+
|
|
10
|
+
// Shim ResizeObserver for Base UI's positioner (the
|
|
11
|
+
// scheduleCreation.test.tsx pattern).
|
|
12
|
+
beforeAll(() => {
|
|
13
|
+
if (!("ResizeObserver" in globalThis)) {
|
|
14
|
+
(globalThis as unknown as { ResizeObserver: unknown }).ResizeObserver =
|
|
15
|
+
class {
|
|
16
|
+
observe() {}
|
|
17
|
+
unobserve() {}
|
|
18
|
+
disconnect() {}
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Effective run selection coherence (stigmer/stigmer#663): the submission
|
|
25
|
+
* must carry exactly the model the pill displays, and "fast" must only
|
|
26
|
+
* ride the wire while the effective model prices it. The original defect:
|
|
27
|
+
* an empty composer displayed the registry fallback with a toggleable
|
|
28
|
+
* FAST badge, then sent `service_tier: fast` with NO model — refused
|
|
29
|
+
* fail-closed by the server ("Couldn't send." + a Retry that can never
|
|
30
|
+
* succeed).
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
const AUTO: ModelInfo = {
|
|
34
|
+
modelId: "default",
|
|
35
|
+
provider: "cursor",
|
|
36
|
+
displayName: "Auto",
|
|
37
|
+
shortDescription: "Automatic model selection",
|
|
38
|
+
speedTier: "fast",
|
|
39
|
+
costTier: "standard",
|
|
40
|
+
harness: "cursor",
|
|
41
|
+
featured: true,
|
|
42
|
+
serviceTiers: [],
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const FAST_CAPABLE: ModelInfo = {
|
|
46
|
+
modelId: "composer-2.5",
|
|
47
|
+
provider: "cursor",
|
|
48
|
+
displayName: "Composer 2.5",
|
|
49
|
+
shortDescription: "Fast agentic model",
|
|
50
|
+
speedTier: "fastest",
|
|
51
|
+
costTier: "economy",
|
|
52
|
+
harness: "cursor",
|
|
53
|
+
featured: true,
|
|
54
|
+
serviceTiers: ["fast"],
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const NO_FAST: ModelInfo = {
|
|
58
|
+
modelId: "gpt-5.3-codex",
|
|
59
|
+
provider: "openai",
|
|
60
|
+
displayName: "GPT-5.3 Codex",
|
|
61
|
+
shortDescription: "No fast variant",
|
|
62
|
+
speedTier: "fast",
|
|
63
|
+
costTier: "standard",
|
|
64
|
+
harness: "cursor",
|
|
65
|
+
featured: true,
|
|
66
|
+
serviceTiers: [],
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
function createMinimalStigmerMock(): Stigmer {
|
|
70
|
+
return {
|
|
71
|
+
agentExecution: { uploadAttachment: vi.fn() },
|
|
72
|
+
environment: { getPersonal: vi.fn().mockResolvedValue(null) },
|
|
73
|
+
baseUrl: "http://localhost:8080",
|
|
74
|
+
getAuthCredential: vi.fn().mockResolvedValue("test-token"),
|
|
75
|
+
config: {
|
|
76
|
+
baseUrl: "http://localhost:8080",
|
|
77
|
+
getAccessToken: vi.fn().mockResolvedValue(""),
|
|
78
|
+
},
|
|
79
|
+
} as unknown as Stigmer;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function createWrapper(
|
|
83
|
+
client: Stigmer,
|
|
84
|
+
registry: { models: readonly ModelInfo[]; isLoading?: boolean },
|
|
85
|
+
) {
|
|
86
|
+
return function Wrapper({ children }: { children: ReactNode }) {
|
|
87
|
+
return (
|
|
88
|
+
<StigmerContext.Provider value={client}>
|
|
89
|
+
<ModelRegistryContext.Provider
|
|
90
|
+
value={{
|
|
91
|
+
models: [...registry.models],
|
|
92
|
+
isLoading: registry.isLoading ?? false,
|
|
93
|
+
error: null,
|
|
94
|
+
refetch: vi.fn(),
|
|
95
|
+
}}
|
|
96
|
+
>
|
|
97
|
+
{children}
|
|
98
|
+
</ModelRegistryContext.Provider>
|
|
99
|
+
</StigmerContext.Provider>
|
|
100
|
+
);
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function submitMessage(message: string) {
|
|
105
|
+
const textarea = screen.getByRole("textbox");
|
|
106
|
+
fireEvent.change(textarea, { target: { value: message } });
|
|
107
|
+
fireEvent.keyDown(textarea, { key: "Enter", shiftKey: false });
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** Open the picker and flip the fast-tier switch (Base UI portals mount
|
|
111
|
+
* asynchronously in jsdom — the switch is awaited). */
|
|
112
|
+
async function toggleFastTier(triggerName: RegExp) {
|
|
113
|
+
fireEvent.click(screen.getByRole("button", { name: triggerName }));
|
|
114
|
+
const toggle = await screen.findByRole("switch", { name: "Fast tier" });
|
|
115
|
+
fireEvent.click(toggle);
|
|
116
|
+
fireEvent.keyDown(document.activeElement ?? document.body, { key: "Escape" });
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
afterEach(cleanup);
|
|
120
|
+
|
|
121
|
+
describe("SessionComposer — effective run selection (#663)", () => {
|
|
122
|
+
it("adopts the displayed harness default when no model is selected", async () => {
|
|
123
|
+
const onSubmit = vi.fn();
|
|
124
|
+
render(
|
|
125
|
+
<SessionComposer onSubmit={onSubmit} harness="cursor" />,
|
|
126
|
+
{ wrapper: createWrapper(createMinimalStigmerMock(), { models: [FAST_CAPABLE, AUTO, NO_FAST] }) },
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
// The pill displays the harness default (Auto for cursor)…
|
|
130
|
+
expect(screen.getByRole("button", { name: /Auto/ })).toBeTruthy();
|
|
131
|
+
|
|
132
|
+
submitMessage("hello");
|
|
133
|
+
|
|
134
|
+
// …and the submission carries exactly that model, never undefined.
|
|
135
|
+
await waitFor(() => expect(onSubmit).toHaveBeenCalledOnce());
|
|
136
|
+
expect(onSubmit.mock.calls[0][1]).toBe("default");
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it("renders no fast-tier switch for a fresh cursor composer (Auto has no tier dimension)", async () => {
|
|
140
|
+
render(
|
|
141
|
+
<SessionComposer onSubmit={vi.fn()} harness="cursor" />,
|
|
142
|
+
{ wrapper: createWrapper(createMinimalStigmerMock(), { models: [FAST_CAPABLE, AUTO, NO_FAST] }) },
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
fireEvent.click(screen.getByRole("button", { name: /Auto/ }));
|
|
146
|
+
// Popover content mounts async; settle on the options area appearing.
|
|
147
|
+
await screen.findByRole("dialog");
|
|
148
|
+
expect(screen.queryByRole("switch", { name: "Fast tier" })).toBeNull();
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
it("drops an armed fast tier when a prop-driven model change lands on a model without a fast variant", async () => {
|
|
152
|
+
const onSubmit = vi.fn();
|
|
153
|
+
const wrapper = createWrapper(createMinimalStigmerMock(), {
|
|
154
|
+
models: [FAST_CAPABLE, AUTO, NO_FAST],
|
|
155
|
+
});
|
|
156
|
+
const { rerender } = render(
|
|
157
|
+
<SessionComposer onSubmit={onSubmit} harness="cursor" defaultModelId="composer-2.5" />,
|
|
158
|
+
{ wrapper },
|
|
159
|
+
);
|
|
160
|
+
|
|
161
|
+
// Arm fast on the fast-capable model (user-driven), then let the host
|
|
162
|
+
// re-sync `defaultModelId` onto a model with no fast variant — the
|
|
163
|
+
// path that bypasses ModelSelector's user-pick reset.
|
|
164
|
+
await toggleFastTier(/Composer 2\.5/);
|
|
165
|
+
rerender(
|
|
166
|
+
<SessionComposer onSubmit={onSubmit} harness="cursor" defaultModelId="gpt-5.3-codex" />,
|
|
167
|
+
);
|
|
168
|
+
|
|
169
|
+
submitMessage("resynced");
|
|
170
|
+
|
|
171
|
+
await waitFor(() => expect(onSubmit).toHaveBeenCalledOnce());
|
|
172
|
+
expect(onSubmit.mock.calls[0][1]).toBe("gpt-5.3-codex");
|
|
173
|
+
// The armed tier is unsendable, not just unstyled (#357 fail-closed rule).
|
|
174
|
+
expect(onSubmit.mock.calls[0][2]?.serviceTier).toBeUndefined();
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it("never adopts a default while the model selector is hidden (the hider owns the model)", async () => {
|
|
178
|
+
const onSubmit = vi.fn();
|
|
179
|
+
render(
|
|
180
|
+
<SessionComposer onSubmit={onSubmit} harness="cursor" showModelSelector={false} />,
|
|
181
|
+
{ wrapper: createWrapper(createMinimalStigmerMock(), { models: [FAST_CAPABLE, AUTO, NO_FAST] }) },
|
|
182
|
+
);
|
|
183
|
+
|
|
184
|
+
submitMessage("guest-shaped send");
|
|
185
|
+
|
|
186
|
+
// No pill, no promise: guests' server-side profile (and #664 pins)
|
|
187
|
+
// own the model — the composer must not invent one.
|
|
188
|
+
await waitFor(() => expect(onSubmit).toHaveBeenCalledOnce());
|
|
189
|
+
expect(onSubmit.mock.calls[0][1]).toBeUndefined();
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
it("adopts the displayed default over a model id the registry no longer lists", async () => {
|
|
193
|
+
const onSubmit = vi.fn();
|
|
194
|
+
render(
|
|
195
|
+
<SessionComposer onSubmit={onSubmit} harness="cursor" defaultModelId="retired-model" />,
|
|
196
|
+
{ wrapper: createWrapper(createMinimalStigmerMock(), { models: [FAST_CAPABLE, AUTO, NO_FAST] }) },
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
submitMessage("stale id");
|
|
200
|
+
|
|
201
|
+
// The pill cannot display "retired-model" (unknown → falls back to the
|
|
202
|
+
// harness default), so the payload must not carry it either.
|
|
203
|
+
await waitFor(() => expect(onSubmit).toHaveBeenCalledOnce());
|
|
204
|
+
expect(onSubmit.mock.calls[0][1]).toBe("default");
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it("passes the raw model id through while the registry is still loading", async () => {
|
|
208
|
+
const onSubmit = vi.fn();
|
|
209
|
+
render(
|
|
210
|
+
<SessionComposer onSubmit={onSubmit} harness="cursor" defaultModelId="composer-2.5" />,
|
|
211
|
+
{ wrapper: createWrapper(createMinimalStigmerMock(), { models: [], isLoading: true }) },
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
submitMessage("early send");
|
|
215
|
+
|
|
216
|
+
// Nothing can be classified mid-load: adopt nothing, rewrite nothing.
|
|
217
|
+
await waitFor(() => expect(onSubmit).toHaveBeenCalledOnce());
|
|
218
|
+
expect(onSubmit.mock.calls[0][1]).toBe("composer-2.5");
|
|
219
|
+
});
|
|
220
|
+
});
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { describe, it, expect, vi, afterEach } from "vitest";
|
|
2
|
+
import { render, screen, cleanup, fireEvent, act } from "@testing-library/react";
|
|
3
|
+
import type { ReactNode } from "react";
|
|
4
|
+
import type { Stigmer } from "@stigmer/sdk";
|
|
5
|
+
import { StigmerContext } from "../../context";
|
|
6
|
+
import { ModelRegistryContext } from "../../models/ModelRegistryContext";
|
|
7
|
+
import type { ModelRegistryState } from "../../models/ModelRegistryContext";
|
|
8
|
+
import { parseRegistryDocument } from "../../models/registry";
|
|
9
|
+
import type { VisionLimits } from "../../models/registry";
|
|
10
|
+
import { SessionComposer } from "../SessionComposer";
|
|
11
|
+
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Helpers
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
|
|
16
|
+
/** The production budget the registry advertises (3 MiB / 4 MiB / 10). */
|
|
17
|
+
const LIMITS: VisionLimits = {
|
|
18
|
+
maxImageBytes: 3 * 1024 * 1024,
|
|
19
|
+
maxTotalBytes: 4 * 1024 * 1024,
|
|
20
|
+
maxImages: 10,
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Registry fixture routed through the REAL document parser so this test
|
|
25
|
+
* also breaks if the parse contract drifts. kimi-k3 mirrors the live
|
|
26
|
+
* registry's explicitly-blind cursor model.
|
|
27
|
+
*/
|
|
28
|
+
const REGISTRY_DOCUMENT = parseRegistryDocument({
|
|
29
|
+
limits: { vision: { ...LIMITS } },
|
|
30
|
+
models: [
|
|
31
|
+
{
|
|
32
|
+
id: "claude-sonnet-4.6",
|
|
33
|
+
displayName: "Claude Sonnet 4.6",
|
|
34
|
+
provider: "anthropic",
|
|
35
|
+
harness: "native",
|
|
36
|
+
costTier: "standard",
|
|
37
|
+
featured: true,
|
|
38
|
+
capabilities: { toolUse: true, vision: true, streaming: true, thinking: true, adaptiveThinking: false },
|
|
39
|
+
pricing: { inputPricePerMillion: 3, outputPricePerMillion: 15, cacheWritePricePerMillion: 3.75, cacheReadPricePerMillion: 0.3 },
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
id: "kimi-k3",
|
|
43
|
+
displayName: "Kimi K3",
|
|
44
|
+
provider: "moonshot",
|
|
45
|
+
harness: "cursor",
|
|
46
|
+
costTier: "economy",
|
|
47
|
+
featured: false,
|
|
48
|
+
capabilities: { toolUse: true, vision: false, streaming: true, thinking: false, adaptiveThinking: false },
|
|
49
|
+
pricing: { inputPricePerMillion: 1, outputPricePerMillion: 3, cacheWritePricePerMillion: 1, cacheReadPricePerMillion: 0.1 },
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
function createUploadMockClient(): Stigmer {
|
|
55
|
+
return {
|
|
56
|
+
agentExecution: {
|
|
57
|
+
uploadAttachment: vi.fn().mockResolvedValue({ storageKey: "attachments/test/file" }),
|
|
58
|
+
},
|
|
59
|
+
environment: { getPersonal: vi.fn().mockResolvedValue(null) },
|
|
60
|
+
baseUrl: "http://localhost:8080",
|
|
61
|
+
getAuthCredential: vi.fn().mockResolvedValue("test-token"),
|
|
62
|
+
config: {
|
|
63
|
+
baseUrl: "http://localhost:8080",
|
|
64
|
+
getAccessToken: vi.fn().mockResolvedValue(""),
|
|
65
|
+
},
|
|
66
|
+
} as unknown as Stigmer;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function createWrapper(registry?: Partial<ModelRegistryState>) {
|
|
70
|
+
const client = createUploadMockClient();
|
|
71
|
+
const state: ModelRegistryState = {
|
|
72
|
+
models: REGISTRY_DOCUMENT.models,
|
|
73
|
+
visionLimits: REGISTRY_DOCUMENT.visionLimits,
|
|
74
|
+
isLoading: false,
|
|
75
|
+
error: null,
|
|
76
|
+
refetch: vi.fn(),
|
|
77
|
+
...registry,
|
|
78
|
+
};
|
|
79
|
+
return function Wrapper({ children }: { children: ReactNode }) {
|
|
80
|
+
return (
|
|
81
|
+
<StigmerContext.Provider value={client}>
|
|
82
|
+
<ModelRegistryContext.Provider value={state}>
|
|
83
|
+
{children}
|
|
84
|
+
</ModelRegistryContext.Provider>
|
|
85
|
+
</StigmerContext.Provider>
|
|
86
|
+
);
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function pngFile(name: string, sizeBytes: number): File {
|
|
91
|
+
return new File([new Uint8Array(sizeBytes)], name, { type: "image/png" });
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function pasteFiles(textarea: Element, files: File[]) {
|
|
95
|
+
fireEvent.paste(textarea, {
|
|
96
|
+
clipboardData: {
|
|
97
|
+
files: files as unknown as FileList,
|
|
98
|
+
getData: () => "",
|
|
99
|
+
types: ["Files"],
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const OVERSIZED = Math.round(3.6 * 1024 * 1024);
|
|
105
|
+
const SMALL = 64 * 1024;
|
|
106
|
+
|
|
107
|
+
afterEach(cleanup);
|
|
108
|
+
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
// Tests
|
|
111
|
+
// ---------------------------------------------------------------------------
|
|
112
|
+
|
|
113
|
+
describe("SessionComposer — vision preflight notice (#365, #386)", () => {
|
|
114
|
+
it("warns at paste time when an image exceeds the advertised per-image cap", async () => {
|
|
115
|
+
render(<SessionComposer onSubmit={vi.fn()} />, { wrapper: createWrapper() });
|
|
116
|
+
const textarea = screen.getByRole("textbox");
|
|
117
|
+
|
|
118
|
+
await act(async () => {
|
|
119
|
+
pasteFiles(textarea, [pngFile("screenshot.png", OVERSIZED)]);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
const notice = screen.getByText(
|
|
123
|
+
/screenshot\.png \(3\.6 MB\) exceeds the 3\.0 MB inline-image limit/,
|
|
124
|
+
);
|
|
125
|
+
expect(notice).toBeTruthy();
|
|
126
|
+
expect(notice.closest('[role="status"]')).toBeTruthy();
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it("stays silent for images within the budget", async () => {
|
|
130
|
+
render(<SessionComposer onSubmit={vi.fn()} />, { wrapper: createWrapper() });
|
|
131
|
+
const textarea = screen.getByRole("textbox");
|
|
132
|
+
|
|
133
|
+
await act(async () => {
|
|
134
|
+
pasteFiles(textarea, [pngFile("small.png", SMALL)]);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
expect(screen.queryByText(/inline-image/)).toBeNull();
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it("stays silent when the server advertises no limits (older server, tri-state)", async () => {
|
|
141
|
+
render(<SessionComposer onSubmit={vi.fn()} />, {
|
|
142
|
+
wrapper: createWrapper({ visionLimits: undefined }),
|
|
143
|
+
});
|
|
144
|
+
const textarea = screen.getByRole("textbox");
|
|
145
|
+
|
|
146
|
+
await act(async () => {
|
|
147
|
+
pasteFiles(textarea, [pngFile("huge.png", OVERSIZED)]);
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
expect(screen.queryByText(/inline-image/)).toBeNull();
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it("clears the warning when the offending attachment is removed", async () => {
|
|
154
|
+
render(<SessionComposer onSubmit={vi.fn()} />, { wrapper: createWrapper() });
|
|
155
|
+
const textarea = screen.getByRole("textbox");
|
|
156
|
+
|
|
157
|
+
await act(async () => {
|
|
158
|
+
pasteFiles(textarea, [pngFile("screenshot.png", OVERSIZED)]);
|
|
159
|
+
});
|
|
160
|
+
expect(screen.getByText(/exceeds the 3\.0 MB inline-image limit/)).toBeTruthy();
|
|
161
|
+
|
|
162
|
+
const removeButton = screen.getByRole("button", { name: /remove screenshot\.png/i });
|
|
163
|
+
await act(async () => {
|
|
164
|
+
fireEvent.click(removeButton);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
expect(screen.queryByText(/inline-image/)).toBeNull();
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it("leads with the model when the selected model is explicitly blind", async () => {
|
|
171
|
+
render(
|
|
172
|
+
<SessionComposer onSubmit={vi.fn()} defaultModelId="cursor/kimi-k3" />,
|
|
173
|
+
{ wrapper: createWrapper() },
|
|
174
|
+
);
|
|
175
|
+
const textarea = screen.getByRole("textbox");
|
|
176
|
+
|
|
177
|
+
await act(async () => {
|
|
178
|
+
pasteFiles(textarea, [pngFile("tiny.png", SMALL)]);
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
expect(
|
|
182
|
+
screen.getByText(
|
|
183
|
+
"Kimi K3 can't view images — attached images will reach the agent as files only.",
|
|
184
|
+
),
|
|
185
|
+
).toBeTruthy();
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
it("never warns about non-image attachments on a blind model", async () => {
|
|
189
|
+
render(
|
|
190
|
+
<SessionComposer onSubmit={vi.fn()} defaultModelId="cursor/kimi-k3" />,
|
|
191
|
+
{ wrapper: createWrapper() },
|
|
192
|
+
);
|
|
193
|
+
const textarea = screen.getByRole("textbox");
|
|
194
|
+
|
|
195
|
+
await act(async () => {
|
|
196
|
+
pasteFiles(textarea, [
|
|
197
|
+
new File([new Uint8Array(SMALL)], "notes.pdf", { type: "application/pdf" }),
|
|
198
|
+
]);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
expect(screen.queryByText(/can't view images/)).toBeNull();
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
it("does not gate the send — the warned message still submits with the attachment", async () => {
|
|
205
|
+
const onSubmit = vi.fn();
|
|
206
|
+
render(<SessionComposer onSubmit={onSubmit} />, { wrapper: createWrapper() });
|
|
207
|
+
const textarea = screen.getByRole("textbox");
|
|
208
|
+
|
|
209
|
+
await act(async () => {
|
|
210
|
+
pasteFiles(textarea, [pngFile("screenshot.png", OVERSIZED)]);
|
|
211
|
+
});
|
|
212
|
+
expect(screen.getByText(/exceeds the 3\.0 MB inline-image limit/)).toBeTruthy();
|
|
213
|
+
|
|
214
|
+
await act(async () => {
|
|
215
|
+
fireEvent.change(textarea, { target: { value: "look at this anyway" } });
|
|
216
|
+
fireEvent.keyDown(textarea, { key: "Enter", shiftKey: false });
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
expect(onSubmit).toHaveBeenCalledTimes(1);
|
|
220
|
+
expect(onSubmit.mock.calls[0][2]?.attachments).toHaveLength(1);
|
|
221
|
+
});
|
|
222
|
+
});
|
package/src/composer/icons.tsx
CHANGED
|
@@ -54,24 +54,6 @@ export function ArrowUpIcon() {
|
|
|
54
54
|
);
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
export function SpinnerIcon() {
|
|
58
|
-
return (
|
|
59
|
-
<svg
|
|
60
|
-
width="16"
|
|
61
|
-
height="16"
|
|
62
|
-
viewBox="0 0 16 16"
|
|
63
|
-
fill="none"
|
|
64
|
-
stroke="currentColor"
|
|
65
|
-
strokeWidth="2"
|
|
66
|
-
strokeLinecap="round"
|
|
67
|
-
className="stg:animate-spin"
|
|
68
|
-
aria-hidden="true"
|
|
69
|
-
>
|
|
70
|
-
<path d="M8 2a6 6 0 1 0 6 6" />
|
|
71
|
-
</svg>
|
|
72
|
-
);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
57
|
/**
|
|
76
58
|
* Filled rounded square — the universal "stop" glyph. Sized to ~62% of the
|
|
77
59
|
* viewBox so it reads as a confident, deliberate mark (not a stray dot) when
|
|
@@ -3,7 +3,10 @@
|
|
|
3
3
|
import { TriangleAlert } from "lucide-react";
|
|
4
4
|
import { cn } from "@stigmer/theme";
|
|
5
5
|
import { getUserMessage } from "@stigmer/sdk";
|
|
6
|
-
import
|
|
6
|
+
import {
|
|
7
|
+
ConversationControl,
|
|
8
|
+
type ChannelConversation,
|
|
9
|
+
} from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/conversation_io_pb";
|
|
7
10
|
import { Button } from "../button/Button.js";
|
|
8
11
|
import type { UseConversationParticipationReturn } from "./useConversationParticipation.js";
|
|
9
12
|
|
|
@@ -13,28 +16,51 @@ export interface ConversationAttentionBannerProps {
|
|
|
13
16
|
readonly conversation: ChannelConversation;
|
|
14
17
|
/** The participation commands (from `useConversationParticipation`). */
|
|
15
18
|
readonly participation: UseConversationParticipationReturn;
|
|
19
|
+
/**
|
|
20
|
+
* Whether the channel's provider has a staff send lane — the same
|
|
21
|
+
* fact `ConversationControlBanner` takes. When `false` the banner
|
|
22
|
+
* offers only Dismiss: a takeover would silence the agent with no way
|
|
23
|
+
* to reply, and the control banner beside this one already explains
|
|
24
|
+
* the missing lane, so a disabled Take over here would duplicate it.
|
|
25
|
+
* Defaults to `true` for hosts that only wire providers with staff
|
|
26
|
+
* lanes.
|
|
27
|
+
*/
|
|
28
|
+
readonly supportsStaffReplies?: boolean;
|
|
16
29
|
/** Additional classes for the banner container. */
|
|
17
30
|
readonly className?: string;
|
|
18
31
|
}
|
|
19
32
|
|
|
20
33
|
/**
|
|
21
34
|
* The needs-attention banner (channel-conversations DD-008): the
|
|
22
|
-
* escalating agent's reason, verbatim, with the
|
|
35
|
+
* escalating agent's reason, verbatim, with the escalation's ANSWER
|
|
36
|
+
* beside its false-alarm dismissal.
|
|
37
|
+
*
|
|
38
|
+
* Take over is the primary action because the human arriving IS the
|
|
39
|
+
* answer to an escalation — taking over clears attention structurally
|
|
40
|
+
* (cloud#266 / F-20: the answer used to live one banner away in
|
|
41
|
+
* equal-weight chrome, so staff read the plea and missed the response).
|
|
42
|
+
* It renders only while the agent holds the conversation on a channel
|
|
43
|
+
* with a staff lane; a human already holding it IS the attention
|
|
44
|
+
* answered, so only Dismiss remains.
|
|
23
45
|
*
|
|
24
46
|
* Dismiss is `clearAttention` — attention clears in place and control
|
|
25
|
-
* never moves
|
|
26
|
-
* human arriving IS the answer to an escalation). Renders nothing while
|
|
27
|
-
* the conversation is unflagged.
|
|
47
|
+
* never moves. Renders nothing while the conversation is unflagged.
|
|
28
48
|
*/
|
|
29
49
|
export function ConversationAttentionBanner({
|
|
30
50
|
conversation,
|
|
31
51
|
participation,
|
|
52
|
+
supportsStaffReplies = true,
|
|
32
53
|
className,
|
|
33
54
|
}: ConversationAttentionBannerProps) {
|
|
34
55
|
if (!conversation.needsAttention) return null;
|
|
35
56
|
|
|
36
|
-
const { clearAttention, pendingCommands, commandErrors } = participation;
|
|
37
|
-
|
|
57
|
+
const { takeOver, clearAttention, pendingCommands, commandErrors } = participation;
|
|
58
|
+
// Take over's failure renders on the control banner too — same
|
|
59
|
+
// command, same truth; a rare failure showing twice on the stacked
|
|
60
|
+
// banners beats it hiding beside the button the staffer pressed.
|
|
61
|
+
const error = commandErrors.get("clearAttention") ?? commandErrors.get("takeOver");
|
|
62
|
+
const humanHeld = conversation.control === ConversationControl.control_human;
|
|
63
|
+
const offersTakeOver = !humanHeld && supportsStaffReplies;
|
|
38
64
|
|
|
39
65
|
return (
|
|
40
66
|
<div
|
|
@@ -56,18 +82,37 @@ export function ConversationAttentionBanner({
|
|
|
56
82
|
)}
|
|
57
83
|
</span>
|
|
58
84
|
</p>
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
85
|
+
{/* One shrink-proof group, right-aligned even after a wrap
|
|
86
|
+
(ml-auto): under a long reason the actions used to wrap to
|
|
87
|
+
the bottom-LEFT and read as part of the message (F-20). */}
|
|
88
|
+
<div className="stg:ml-auto stg:flex stg:shrink-0 stg:items-center stg:gap-2">
|
|
89
|
+
<Button
|
|
90
|
+
variant="outline"
|
|
91
|
+
size="xs"
|
|
92
|
+
onClick={() =>
|
|
93
|
+
void clearAttention().catch(() => {
|
|
94
|
+
// Recorded in commandErrors and rendered below.
|
|
95
|
+
})
|
|
96
|
+
}
|
|
97
|
+
disabled={pendingCommands.has("clearAttention")}
|
|
98
|
+
>
|
|
99
|
+
{pendingCommands.has("clearAttention") ? "Dismissing…" : "Dismiss"}
|
|
100
|
+
</Button>
|
|
101
|
+
{offersTakeOver && (
|
|
102
|
+
<Button
|
|
103
|
+
variant="primary"
|
|
104
|
+
size="xs"
|
|
105
|
+
onClick={() =>
|
|
106
|
+
void takeOver().catch(() => {
|
|
107
|
+
// Recorded in commandErrors and rendered below.
|
|
108
|
+
})
|
|
109
|
+
}
|
|
110
|
+
disabled={pendingCommands.has("takeOver")}
|
|
111
|
+
>
|
|
112
|
+
{pendingCommands.has("takeOver") ? "Taking over…" : "Take over"}
|
|
113
|
+
</Button>
|
|
114
|
+
)}
|
|
115
|
+
</div>
|
|
71
116
|
</div>
|
|
72
117
|
{error && (
|
|
73
118
|
<p className="stg:mt-1 stg:text-xs stg:text-destructive">{getUserMessage(error)}</p>
|
|
@@ -7,7 +7,7 @@ import { getUserMessage } from "@stigmer/sdk";
|
|
|
7
7
|
import { ChannelSendOutcome } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/message_io_pb";
|
|
8
8
|
import type { SendChannelMessageOutput } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/message_io_pb";
|
|
9
9
|
import { Button } from "../button/Button.js";
|
|
10
|
-
import { SpinnerIcon } from "../
|
|
10
|
+
import { SpinnerIcon } from "../internal/SpinnerIcon.js";
|
|
11
11
|
import { useComposer } from "../composer/useComposer.js";
|
|
12
12
|
|
|
13
13
|
/** Props for {@link ConversationComposer}. */
|