@stigmer/react 3.12.0 → 3.12.2
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 +7 -2
- 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 +10 -2
- 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/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 +5 -4
- package/channel/ChannelConversationsDialog.js.map +1 -1
- package/channel/ChannelCredentialsDialog.d.ts.map +1 -1
- package/channel/ChannelCredentialsDialog.js +9 -4
- package/channel/ChannelCredentialsDialog.js.map +1 -1
- package/channel/ChannelTemplatesDialog.d.ts.map +1 -1
- package/channel/ChannelTemplatesDialog.js +5 -4
- package/channel/ChannelTemplatesDialog.js.map +1 -1
- package/channel/ConnectSlackDialog.d.ts.map +1 -1
- package/channel/ConnectSlackDialog.js +9 -4
- package/channel/ConnectSlackDialog.js.map +1 -1
- package/channel/ConnectWhatsAppDialog.d.ts.map +1 -1
- package/channel/ConnectWhatsAppDialog.js +9 -4
- 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/ConversationComposer.js +1 -1
- package/conversation/ConversationComposer.js.map +1 -1
- package/conversation/ConversationListPane.d.ts.map +1 -1
- package/conversation/ConversationListPane.js +3 -2
- package/conversation/ConversationListPane.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/ArtifactApplyButton.d.ts.map +1 -1
- package/execution/ArtifactApplyButton.js +2 -4
- package/execution/ArtifactApplyButton.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 +20 -6
- package/execution/ToolCallItem.d.ts.map +1 -1
- package/execution/ToolCallItem.js +102 -29
- 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 +6 -2
- package/execution/index.d.ts.map +1 -1
- package/execution/index.js +3 -1
- package/execution/index.js.map +1 -1
- package/execution/tool-categories.d.ts +42 -7
- package/execution/tool-categories.d.ts.map +1 -1
- package/execution/tool-categories.js +38 -4
- package/execution/tool-categories.js.map +1 -1
- package/execution/tool-presenter.d.ts +17 -1
- package/execution/tool-presenter.d.ts.map +1 -1
- package/execution/tool-presenter.js +4 -1
- 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/execution/useCreateAgentExecution.d.ts +3 -2
- package/execution/useCreateAgentExecution.d.ts.map +1 -1
- package/execution/useCreateAgentExecution.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/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/isUnimplemented.d.ts +17 -0
- package/internal/isUnimplemented.d.ts.map +1 -0
- package/internal/isUnimplemented.js +26 -0
- package/internal/isUnimplemented.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.js +1 -1
- package/manifest/EditResourceYamlDialog.js +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.js +8 -4
- package/mcp-server/McpServerConnectDialog.js.map +1 -1
- package/mcp-server/McpServerDetailView.d.ts.map +1 -1
- package/mcp-server/McpServerDetailView.js +47 -14
- 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/useMcpServerCredentials.d.ts +38 -10
- package/mcp-server/useMcpServerCredentials.d.ts.map +1 -1
- package/mcp-server/useMcpServerCredentials.js +50 -7
- package/mcp-server/useMcpServerCredentials.js.map +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/mcp-server/useOrgOAuthApp.d.ts +22 -0
- package/mcp-server/useOrgOAuthApp.d.ts.map +1 -1
- package/mcp-server/useOrgOAuthApp.js +39 -7
- package/mcp-server/useOrgOAuthApp.js.map +1 -1
- 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.js +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 +11 -9
- 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 +18 -7
- 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.js +1 -1
- package/skill/useSkillVersions.d.ts.map +1 -1
- package/skill/useSkillVersions.js +1 -9
- package/skill/useSkillVersions.js.map +1 -1
- package/src/access/ManageAccessDialog.tsx +10 -4
- 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 +17 -8
- 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/__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 +8 -4
- package/src/channel/ChannelCredentialsDialog.tsx +14 -4
- package/src/channel/ChannelTemplatesDialog.tsx +8 -4
- package/src/channel/ConnectSlackDialog.tsx +14 -4
- package/src/channel/ConnectWhatsAppDialog.tsx +14 -4
- 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/ConversationComposer.tsx +1 -1
- package/src/conversation/ConversationListPane.tsx +4 -3
- 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/ArtifactApplyButton.tsx +2 -17
- 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 +157 -37
- 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__/message-thread-slots.test.tsx +92 -0
- package/src/execution/__tests__/tool-presenter.test.tsx +41 -4
- package/src/execution/index.ts +8 -2
- package/src/execution/tool-categories.ts +72 -8
- package/src/execution/tool-presenter.ts +22 -1
- package/src/execution/useArtifactInspection.ts +4 -8
- package/src/execution/useCreateAgentExecution.ts +3 -2
- 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 +23 -1
- package/src/internal/DecisionButton.tsx +1 -20
- package/src/internal/SpinnerIcon.tsx +42 -0
- package/src/internal/__tests__/ThreadCardShell.test.tsx +43 -7
- package/src/internal/__tests__/useCopyFeedback.test.ts +92 -0
- package/src/internal/isUnimplemented.ts +26 -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 +1 -1
- package/src/manifest/EditResourceYamlDialog.tsx +1 -1
- package/src/mcp-server/DefinitionDriftNotice.tsx +120 -0
- package/src/mcp-server/McpServerConnectDialog.tsx +30 -12
- package/src/mcp-server/McpServerDetailView.tsx +58 -26
- package/src/mcp-server/OAuthAppForm.tsx +2 -18
- package/src/mcp-server/__tests__/DefinitionDriftNotice.test.tsx +57 -0
- package/src/mcp-server/__tests__/VendorApprovalBlocked.surfaces.test.tsx +103 -5
- package/src/mcp-server/__tests__/byoaEditionDegradation.test.tsx +323 -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__/useMcpServerCredentials.test.tsx +306 -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/useMcpServerCredentials.ts +87 -19
- package/src/mcp-server/useMcpServerDefinitionDrift.ts +95 -0
- package/src/mcp-server/useOrgOAuthApp.ts +54 -8
- 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 +1 -1
- 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 +14 -10
- 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 +28 -10
- package/src/sidebar/__tests__/WorkspaceSidebar.test.tsx +4 -1
- package/src/sidebar/chrome.tsx +6 -6
- package/src/skill/SkillDiffDialog.tsx +1 -1
- package/src/skill/useSkillVersions.ts +1 -11
- 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 +7 -22
- package/src/workflow/WorkflowArchitectDialog.tsx +8 -27
- package/src/workflow/WorkflowArtifactDocument.tsx +5 -9
- package/src/workflow/WorkflowCanvasEditor.tsx +39 -7
- package/src/workflow/WorkflowCanvasInner.tsx +14 -1
- package/src/workflow/WorkflowDiffGraph.tsx +7 -1
- package/src/workflow/WorkflowExecutionGraph.tsx +26 -1
- package/src/workflow/WorkflowExecutionViewer.tsx +115 -24
- package/src/workflow/WorkflowExplainDialog.tsx +8 -24
- package/src/workflow/WorkflowNode.tsx +5 -2
- 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 +31 -24
- 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__/WorkflowExecutionViewer.reconciliation.test.tsx +48 -1
- package/src/workflow/__tests__/WorkflowNode.test.tsx +93 -0
- package/src/workflow/__tests__/WorkflowRunDialog.test.tsx +127 -0
- package/src/workflow/__tests__/graph-history.test.ts +103 -0
- package/src/workflow/__tests__/overview-graph.test.ts +17 -0
- package/src/workflow/__tests__/panelNegotiation.test.tsx +230 -0
- package/src/workflow/__tests__/useCanvasKeyboardShortcuts.undo.test.ts +115 -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__/useWorkflowCanvas.undo.test.tsx +133 -0
- package/src/workflow/__tests__/useWorkflowExecutionPanel.test.ts +100 -0
- package/src/workflow/execution-comparison/ExecutionComparisonPicker.tsx +7 -11
- package/src/workflow/execution-history/ExecutionHistoryTable.tsx +1 -25
- package/src/workflow/index.ts +1 -0
- package/src/workflow/instance/CreateWorkflowInstanceDialog.tsx +17 -8
- package/src/workflow/instance/WorkflowInstanceDetailPanel.tsx +2 -1
- package/src/workflow/instance/useDeleteWorkflowInstance.ts +9 -4
- package/src/workflow/layout/registry-dimensions.ts +2 -5
- package/src/workflow/node-shell/NodeShell.tsx +4 -0
- package/src/workflow/picker/BranchAddPopover.tsx +4 -3
- package/src/workflow/task-type-visual-registry.ts +5 -3
- package/src/workflow/templates/WorkflowTemplatePreview.tsx +1 -1
- package/src/workflow/useApprovalBoundary.ts +1 -1
- package/src/workflow/useCanvasKeyboardShortcuts.ts +33 -3
- package/src/workflow/useGraphHistory.ts +22 -41
- package/src/workflow/useWorkflowCanvas.ts +126 -21
- package/src/workflow/useWorkflowExecutionPanel.ts +95 -13
- package/src/workflow/useWorkflowSave.ts +2 -15
- package/src/workflow/workflow-graph-conversions.ts +25 -3
- 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 +7 -23
- package/workflow/ViewYamlDialog.js.map +1 -1
- package/workflow/WorkflowArchitectDialog.d.ts.map +1 -1
- package/workflow/WorkflowArchitectDialog.js +7 -11
- 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 +31 -6
- 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/WorkflowExecutionGraph.d.ts.map +1 -1
- package/workflow/WorkflowExecutionGraph.js +27 -1
- package/workflow/WorkflowExecutionGraph.js.map +1 -1
- package/workflow/WorkflowExecutionViewer.d.ts +51 -0
- package/workflow/WorkflowExecutionViewer.d.ts.map +1 -1
- package/workflow/WorkflowExecutionViewer.js +49 -18
- package/workflow/WorkflowExecutionViewer.js.map +1 -1
- package/workflow/WorkflowExplainDialog.d.ts.map +1 -1
- package/workflow/WorkflowExplainDialog.js +6 -8
- package/workflow/WorkflowExplainDialog.js.map +1 -1
- package/workflow/WorkflowNode.d.ts.map +1 -1
- package/workflow/WorkflowNode.js +2 -2
- package/workflow/WorkflowNode.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 +11 -1
- package/workflow/WorkflowRunDialog.d.ts.map +1 -1
- package/workflow/WorkflowRunDialog.js +18 -9
- 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 +7 -15
- 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 +10 -2
- 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/instance/useDeleteWorkflowInstance.d.ts +9 -4
- package/workflow/instance/useDeleteWorkflowInstance.d.ts.map +1 -1
- package/workflow/instance/useDeleteWorkflowInstance.js +4 -2
- package/workflow/instance/useDeleteWorkflowInstance.js.map +1 -1
- package/workflow/layout/registry-dimensions.d.ts.map +1 -1
- package/workflow/layout/registry-dimensions.js +2 -5
- package/workflow/layout/registry-dimensions.js.map +1 -1
- package/workflow/node-shell/NodeShell.js +1 -1
- package/workflow/node-shell/NodeShell.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/task-type-visual-registry.d.ts.map +1 -1
- package/workflow/task-type-visual-registry.js +5 -3
- package/workflow/task-type-visual-registry.js.map +1 -1
- package/workflow/templates/WorkflowTemplatePreview.js +1 -1
- package/workflow/useApprovalBoundary.d.ts +1 -1
- package/workflow/useApprovalBoundary.js +1 -1
- package/workflow/useCanvasKeyboardShortcuts.d.ts +15 -4
- package/workflow/useCanvasKeyboardShortcuts.d.ts.map +1 -1
- package/workflow/useCanvasKeyboardShortcuts.js +25 -4
- package/workflow/useCanvasKeyboardShortcuts.js.map +1 -1
- package/workflow/useGraphHistory.d.ts +16 -9
- package/workflow/useGraphHistory.d.ts.map +1 -1
- package/workflow/useGraphHistory.js +19 -33
- package/workflow/useGraphHistory.js.map +1 -1
- package/workflow/useWorkflowCanvas.d.ts +6 -4
- package/workflow/useWorkflowCanvas.d.ts.map +1 -1
- package/workflow/useWorkflowCanvas.js +115 -23
- 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
- package/workflow/useWorkflowSave.d.ts.map +1 -1
- package/workflow/useWorkflowSave.js +2 -15
- package/workflow/useWorkflowSave.js.map +1 -1
- package/workflow/workflow-graph-conversions.d.ts +19 -1
- package/workflow/workflow-graph-conversions.d.ts.map +1 -1
- package/workflow/workflow-graph-conversions.js +17 -3
- package/workflow/workflow-graph-conversions.js.map +1 -1
|
@@ -15,21 +15,24 @@ import {
|
|
|
15
15
|
ThreadCardShell,
|
|
16
16
|
ThreadCardHeader,
|
|
17
17
|
ThreadCardBody,
|
|
18
|
+
type ThreadCardVariant,
|
|
18
19
|
SpinnerIcon,
|
|
19
20
|
ClockIcon,
|
|
20
|
-
CheckCircleIcon,
|
|
21
21
|
XCircleIcon,
|
|
22
22
|
DotIcon,
|
|
23
23
|
SlashCircleIcon,
|
|
24
24
|
} from "../internal/thread-card/index.js";
|
|
25
|
-
import {
|
|
25
|
+
import { TerminalTail } from "./TerminalSession.js";
|
|
26
|
+
import { ToolCallDetail, formatHeaderDuration } from "./ToolCallDetail.js";
|
|
26
27
|
import { SubAgentSection } from "./SubAgentSection.js";
|
|
27
28
|
import { ApprovalCardBody } from "./ApprovalCard.js";
|
|
28
29
|
import { useApproval } from "./ApprovalContext.js";
|
|
29
30
|
import { useFileReviewRowState } from "./FileReviewContext.js";
|
|
30
31
|
import type { FileReviewRowState } from "./file-review-status.js";
|
|
31
32
|
import { FilePathLink } from "./FilePathLink.js";
|
|
32
|
-
|
|
33
|
+
// ToolChrome is type-only here so the doc link below resolves; the strict
|
|
34
|
+
// tsdoc gate (tsdoc:check) guards it against removal.
|
|
35
|
+
import { isFileCategory, type ToolCategory, type ToolChrome } from "./tool-categories.js";
|
|
33
36
|
import { useToolPresentation } from "./tool-presenter.js";
|
|
34
37
|
import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
|
|
35
38
|
|
|
@@ -63,18 +66,25 @@ export interface ToolCallItemProps {
|
|
|
63
66
|
/**
|
|
64
67
|
* Renders a single tool call as a row in the tool call group.
|
|
65
68
|
*
|
|
66
|
-
*
|
|
67
|
-
* one-line row cannot?**
|
|
69
|
+
* Four rendering modes, set by one rule — **does the body carry content the
|
|
70
|
+
* one-line row cannot, and does it stay content once the call settles?**
|
|
68
71
|
*
|
|
69
72
|
* - **Non-expandable** (completed/skipped Read): a static `<div>` row with a
|
|
70
73
|
* clickable {@link FilePathLink}. The path IS the complete information.
|
|
71
|
-
* - **Preview** (content-bearing:
|
|
74
|
+
* - **Preview** (content-bearing: edit / write / fetch / web-search /
|
|
72
75
|
* unknown / mcp): a plain (non-button) header above an **always-visible**
|
|
73
76
|
* {@link ToolCallDetail} body — Cursor-style "previews aren't collapsible".
|
|
74
77
|
* There is no header chevron; each content block self-bounds with its own
|
|
75
|
-
|
|
76
|
-
* never floods the thread. The body is suppressed only for an `empty` result
|
|
77
|
-
*
|
|
78
|
+
* single in-place reveal (`RevealToggle`), so a long diff or output
|
|
79
|
+
* never floods the thread. The body is suppressed only for an `empty` result,
|
|
80
|
+
* which stays a clean one-line row.
|
|
81
|
+
* - **Tail** (shell): live like preview — the full terminal session streams in
|
|
82
|
+
* view while the command runs or awaits its gate — but a *successful* settle
|
|
83
|
+
* collapses the row to a {@link TerminalTail} teaser (the `$ command` line
|
|
84
|
+
* plus a dimmed tail of the last output lines) behind the header chevron.
|
|
85
|
+
* A settled failure stays open: error output is content, not context. A
|
|
86
|
+
* result that isn't a terminal session (e.g. an offloaded `outputRef`)
|
|
87
|
+
* falls back to the preview layout — never hide evidence we cannot condense.
|
|
78
88
|
* - **Summary / sub-agent** (read / list / search / delete / think, and
|
|
79
89
|
* sub-agent delegations): a chevron-gated `div[role=button]` header that
|
|
80
90
|
* discloses a body hidden by default — {@link ToolCallDetail}, a
|
|
@@ -86,6 +96,13 @@ export interface ToolCallItemProps {
|
|
|
86
96
|
* content-overflow reveal — never govern the same body, which is what removes
|
|
87
97
|
* the old "expand, then Show more" double control.
|
|
88
98
|
*
|
|
99
|
+
* Orthogonal to the layout modes is the **chrome tier** (the density axis,
|
|
100
|
+
* stigmer#274): metadata-only categories (read / list / search / think)
|
|
101
|
+
* render as quiet unboxed lines — no card frame — while content-bearing
|
|
102
|
+
* categories keep their cards. A quiet row escalates to a card while gated
|
|
103
|
+
* or failed; its disclosed body renders under a light left rail instead of a
|
|
104
|
+
* border. See {@link ToolChrome}.
|
|
105
|
+
*
|
|
89
106
|
* Shows category-aware labels (e.g., "Shell", "Read", "Edit") with
|
|
90
107
|
* the primary argument as a subtitle, a category-specific icon, and
|
|
91
108
|
* an inline approval decision badge when applicable.
|
|
@@ -110,11 +127,18 @@ export const ToolCallItem = memo(function ToolCallItem({
|
|
|
110
127
|
useRenderTracer("ToolCallItem", { status: toolCall.status, id: toolCall.id });
|
|
111
128
|
|
|
112
129
|
const status = mapToolCallStatus(toolCall);
|
|
130
|
+
const isRunning = status === "running";
|
|
131
|
+
// Success is the silent default: a completed row renders NO status icon —
|
|
132
|
+
// a green check on every settled row teaches the eye to ignore status
|
|
133
|
+
// entirely, so state is shown only when it says something (running, gated,
|
|
134
|
+
// failed, interrupted). Failure shouts; success is quiet (stigmer#274).
|
|
113
135
|
const StatusIcon = STATUS_ICON[status];
|
|
114
|
-
|
|
136
|
+
// Header chips only when the duration carries information (>= 1s); the
|
|
137
|
+
// sub-second chips were noise pinned to the least interesting rows.
|
|
138
|
+
const duration = formatHeaderDuration(toolCall.startedAt, toolCall.completedAt);
|
|
115
139
|
const isSubAgent = subAgentExecution != null;
|
|
116
140
|
|
|
117
|
-
const { category, label, primaryArg, result, resultSummary, disclosure } =
|
|
141
|
+
const { category, label, primaryArg, result, resultSummary, disclosure, chrome } =
|
|
118
142
|
useToolPresentation(toolCall);
|
|
119
143
|
const CategoryIcon = CATEGORY_ICON[category];
|
|
120
144
|
|
|
@@ -122,13 +146,29 @@ export const ToolCallItem = memo(function ToolCallItem({
|
|
|
122
146
|
// or null. Drives the inline approval panel and forces the row open.
|
|
123
147
|
const approval = useApproval(toolCall.id);
|
|
124
148
|
|
|
125
|
-
//
|
|
126
|
-
//
|
|
127
|
-
//
|
|
128
|
-
//
|
|
129
|
-
|
|
149
|
+
// Tail rows (shell): a settled failure keeps the row open — the error output
|
|
150
|
+
// is the content the user needs next, so it must never settle into a dimmed
|
|
151
|
+
// teaser. Detected on the result, not just the status: a command that
|
|
152
|
+
// "completed" with a non-zero exit is a failure to the reader.
|
|
153
|
+
const isTailCategory = !isSubAgent && disclosure === "tail";
|
|
154
|
+
const tailFailed =
|
|
155
|
+
isTailCategory &&
|
|
156
|
+
(toolCall.status === ToolCallStatus.TOOL_CALL_FAILED ||
|
|
157
|
+
result.type === "error" ||
|
|
158
|
+
(result.type === "terminal" &&
|
|
159
|
+
result.exitCode !== undefined &&
|
|
160
|
+
result.exitCode !== 0));
|
|
161
|
+
|
|
162
|
+
// The card-level disclosure for *summary* and *tail* rows (preview rows
|
|
163
|
+
// ignore it — their body is always visible). Force-open only while the row
|
|
164
|
+
// carries live or actionable content: while it runs, while it awaits
|
|
165
|
+
// approval, or (tail rows) while it shows a failure; a manual toggle takes
|
|
166
|
+
// over from there. Called unconditionally to honour the rules of hooks even
|
|
167
|
+
// though preview rows do not read `expanded`.
|
|
130
168
|
const autoOpen =
|
|
131
|
-
toolCall.status === ToolCallStatus.TOOL_CALL_RUNNING ||
|
|
169
|
+
toolCall.status === ToolCallStatus.TOOL_CALL_RUNNING ||
|
|
170
|
+
approval != null ||
|
|
171
|
+
tailFailed;
|
|
132
172
|
const [expanded, handleToggle] = useAutoDisclosure(autoOpen, {
|
|
133
173
|
initialOpen: defaultExpanded || autoOpen,
|
|
134
174
|
});
|
|
@@ -165,6 +205,24 @@ export const ToolCallItem = memo(function ToolCallItem({
|
|
|
165
205
|
const gateAccent =
|
|
166
206
|
approval != null ? (category === "delete" ? "destructive" : "warning") : null;
|
|
167
207
|
|
|
208
|
+
// The chrome tier (the density axis, stigmer#274): metadata-only rows
|
|
209
|
+
// (read / list / search / think) render as quiet unboxed lines — no card
|
|
210
|
+
// frame — so the conversation reads as prose with quiet evidence attached.
|
|
211
|
+
// A row escalates to a card while it carries something a bare line cannot:
|
|
212
|
+
// a pending gate (the decision surface, including its accent) or a failure
|
|
213
|
+
// (error output is content). Running deliberately does NOT escalate — a
|
|
214
|
+
// quiet row's in-flight state rides its label and status glyph, not a
|
|
215
|
+
// frame. Nested rows (inside an expanded fold chip) stay divider rows:
|
|
216
|
+
// their container owns the frame.
|
|
217
|
+
const rowFailed =
|
|
218
|
+
toolCall.status === ToolCallStatus.TOOL_CALL_FAILED ||
|
|
219
|
+
result.type === "error";
|
|
220
|
+
const variant: ThreadCardVariant = !bordered
|
|
221
|
+
? "row"
|
|
222
|
+
: chrome === "quiet" && !isSubAgent && approval == null && !rowFailed
|
|
223
|
+
? "quiet"
|
|
224
|
+
: "card";
|
|
225
|
+
|
|
168
226
|
// Completed/skipped Read items are non-expandable — the clickable
|
|
169
227
|
// path in the row is the complete information. Failed reads remain
|
|
170
228
|
// expandable to show the error.
|
|
@@ -205,12 +263,14 @@ export const ToolCallItem = memo(function ToolCallItem({
|
|
|
205
263
|
</span>
|
|
206
264
|
)}
|
|
207
265
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
266
|
+
{StatusIcon && (
|
|
267
|
+
<span
|
|
268
|
+
className={cn("stg:shrink-0", STATUS_COLOR[status])}
|
|
269
|
+
aria-hidden="true"
|
|
270
|
+
>
|
|
271
|
+
<StatusIcon />
|
|
272
|
+
</span>
|
|
273
|
+
)}
|
|
214
274
|
|
|
215
275
|
{duration && (
|
|
216
276
|
<span className="stg:shrink-0 stg:tabular-nums stg:text-muted-foreground">
|
|
@@ -223,7 +283,7 @@ export const ToolCallItem = memo(function ToolCallItem({
|
|
|
223
283
|
if (isNonExpandableRead) {
|
|
224
284
|
return (
|
|
225
285
|
<ThreadCardShell
|
|
226
|
-
|
|
286
|
+
variant={variant}
|
|
227
287
|
accent={gateAccent}
|
|
228
288
|
cursorTarget="tool-call-row"
|
|
229
289
|
className={className}
|
|
@@ -260,13 +320,24 @@ export const ToolCallItem = memo(function ToolCallItem({
|
|
|
260
320
|
const subtitleIsFilePath =
|
|
261
321
|
!isSubAgent && primaryArg != null && isFileCategory(category);
|
|
262
322
|
|
|
263
|
-
//
|
|
264
|
-
//
|
|
265
|
-
//
|
|
323
|
+
// A tail row condenses only a terminal session. While gated it renders like
|
|
324
|
+
// preview — decision actions are never hidden behind a chevron — and any
|
|
325
|
+
// other result shape (an offloaded outputRef, bare error text) falls back to
|
|
326
|
+
// preview too: never hide evidence the tail cannot honestly condense.
|
|
327
|
+
const tailSession =
|
|
328
|
+
isTailCategory && approval == null && result.type === "terminal"
|
|
329
|
+
? result
|
|
330
|
+
: null;
|
|
331
|
+
|
|
332
|
+
// Preview categories (edit, write, fetch, web-search, unknown, mcp) render
|
|
333
|
+
// their body ALWAYS — Cursor-style "previews aren't collapsible" — so no
|
|
334
|
+
// header chevron competes with the body's own in-place reveal. Summary
|
|
266
335
|
// categories and sub-agents keep the chevron: their body is genuinely hidden
|
|
267
336
|
// by default, so the chevron has a real job. The two disclosure axes
|
|
268
337
|
// (card-level chevron vs. content-overflow reveal) never govern one body.
|
|
269
|
-
const
|
|
338
|
+
const isPreviewLayout =
|
|
339
|
+
!isSubAgent &&
|
|
340
|
+
(disclosure === "preview" || (isTailCategory && tailSession == null));
|
|
270
341
|
|
|
271
342
|
// The disclosed body, shared by both layouts: a pending gate decides inline,
|
|
272
343
|
// a sub-agent shows its delegation, otherwise the category detail.
|
|
@@ -298,7 +369,15 @@ export const ToolCallItem = memo(function ToolCallItem({
|
|
|
298
369
|
</span>
|
|
299
370
|
|
|
300
371
|
<span className="stg:min-w-0 stg:flex-1 stg:flex stg:items-baseline stg:gap-1.5 stg:overflow-hidden">
|
|
301
|
-
|
|
372
|
+
{/* While the call runs, the label carries the ambient-liveness sweep
|
|
373
|
+
(stigmer#277) — the shimmer class owns `color`, so it replaces
|
|
374
|
+
(never joins) the static color utility. */}
|
|
375
|
+
<span
|
|
376
|
+
className={cn(
|
|
377
|
+
"stg:shrink-0 stg:font-medium",
|
|
378
|
+
isRunning ? "stgm-shimmer-label" : "stg:text-foreground",
|
|
379
|
+
)}
|
|
380
|
+
>
|
|
302
381
|
{displayLabel}
|
|
303
382
|
</span>
|
|
304
383
|
{subtitleIsFilePath && primaryArg ? (
|
|
@@ -340,20 +419,56 @@ export const ToolCallItem = memo(function ToolCallItem({
|
|
|
340
419
|
|
|
341
420
|
// Preview layout: a plain (non-button) header above an always-visible body.
|
|
342
421
|
// The body renders only when it has something to show — a pending gate, or a
|
|
343
|
-
// non-empty result — so a
|
|
344
|
-
//
|
|
345
|
-
if (
|
|
422
|
+
// non-empty result — so a tool that produced nothing stays a clean one-line
|
|
423
|
+
// row, never an empty padded box.
|
|
424
|
+
if (isPreviewLayout) {
|
|
346
425
|
const showBody = approval != null || result.type !== "empty";
|
|
347
426
|
return (
|
|
348
427
|
<ThreadCardShell
|
|
349
|
-
|
|
428
|
+
variant={variant}
|
|
350
429
|
accent={gateAccent}
|
|
351
430
|
cursorTarget="tool-call-row"
|
|
352
431
|
className={className}
|
|
353
432
|
>
|
|
354
433
|
<ThreadCardHeader>{headerInner}</ThreadCardHeader>
|
|
355
434
|
{showBody && (
|
|
435
|
+
<ThreadCardBody cursorTarget="tool-preview" rail={variant === "quiet"}>
|
|
436
|
+
{body}
|
|
437
|
+
</ThreadCardBody>
|
|
438
|
+
)}
|
|
439
|
+
</ThreadCardShell>
|
|
440
|
+
);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
// Tail layout: a chevron-gated header whose body is never fully hidden —
|
|
444
|
+
// expanded it is the live/full terminal session, collapsed it is the dimmed
|
|
445
|
+
// TerminalTail teaser. useAutoDisclosure keeps it open while the command
|
|
446
|
+
// runs and settles a *successful* session closed (tailFailed holds a failed
|
|
447
|
+
// one open); a manual toggle always wins.
|
|
448
|
+
if (tailSession) {
|
|
449
|
+
return (
|
|
450
|
+
<ThreadCardShell
|
|
451
|
+
variant={variant}
|
|
452
|
+
accent={gateAccent}
|
|
453
|
+
cursorTarget="tool-call-row"
|
|
454
|
+
className={className}
|
|
455
|
+
>
|
|
456
|
+
<ThreadCardHeader
|
|
457
|
+
gesture={{ kind: "expand", expanded, onToggle: handleToggle }}
|
|
458
|
+
>
|
|
459
|
+
{headerInner}
|
|
460
|
+
</ThreadCardHeader>
|
|
461
|
+
{expanded ? (
|
|
356
462
|
<ThreadCardBody cursorTarget="tool-preview">{body}</ThreadCardBody>
|
|
463
|
+
) : (
|
|
464
|
+
<ThreadCardBody>
|
|
465
|
+
<TerminalTail
|
|
466
|
+
command={tailSession.command}
|
|
467
|
+
stdout={tailSession.stdout}
|
|
468
|
+
stderr={tailSession.stderr}
|
|
469
|
+
exitCode={tailSession.exitCode}
|
|
470
|
+
/>
|
|
471
|
+
</ThreadCardBody>
|
|
357
472
|
)}
|
|
358
473
|
</ThreadCardShell>
|
|
359
474
|
);
|
|
@@ -364,7 +479,7 @@ export const ToolCallItem = memo(function ToolCallItem({
|
|
|
364
479
|
// header with Enter/Space keyboard parity and the chevron.
|
|
365
480
|
return (
|
|
366
481
|
<ThreadCardShell
|
|
367
|
-
|
|
482
|
+
variant={variant}
|
|
368
483
|
accent={gateAccent}
|
|
369
484
|
cursorTarget="tool-call-row"
|
|
370
485
|
className={className}
|
|
@@ -373,7 +488,9 @@ export const ToolCallItem = memo(function ToolCallItem({
|
|
|
373
488
|
{headerInner}
|
|
374
489
|
</ThreadCardHeader>
|
|
375
490
|
|
|
376
|
-
{expanded &&
|
|
491
|
+
{expanded && (
|
|
492
|
+
<ThreadCardBody rail={variant === "quiet"}>{body}</ThreadCardBody>
|
|
493
|
+
)}
|
|
377
494
|
</ThreadCardShell>
|
|
378
495
|
);
|
|
379
496
|
});
|
|
@@ -595,11 +712,14 @@ function McpPlugIcon() {
|
|
|
595
712
|
// Status icons — the shared thread-card glyph set (T05)
|
|
596
713
|
// ---------------------------------------------------------------------------
|
|
597
714
|
|
|
598
|
-
|
|
715
|
+
// `completed` is deliberately iconless — success is the silent default, so
|
|
716
|
+
// the states that remain visible (spinner, clock, cross, slash) all carry
|
|
717
|
+
// real signal (stigmer#274).
|
|
718
|
+
const STATUS_ICON: Record<ItemStatus, (() => React.JSX.Element) | null> = {
|
|
599
719
|
running: SpinnerIcon,
|
|
600
720
|
waiting: ClockIcon,
|
|
601
721
|
failed: XCircleIcon,
|
|
602
|
-
completed:
|
|
722
|
+
completed: null,
|
|
603
723
|
pending: DotIcon,
|
|
604
724
|
interrupted: SlashCircleIcon,
|
|
605
725
|
};
|
|
@@ -12,6 +12,7 @@ import { useAutoDisclosure } from "../internal/useAutoDisclosure.js";
|
|
|
12
12
|
import { ApprovalContext } from "./ApprovalContext.js";
|
|
13
13
|
import { ToolCallItem, CATEGORY_ICON } from "./ToolCallItem.js";
|
|
14
14
|
import type { ToolCategory } from "./tool-categories.js";
|
|
15
|
+
import { SpinnerIcon } from "../internal/thread-card/glyphs.js";
|
|
15
16
|
|
|
16
17
|
/** Props for {@link ToolRunGroup}. */
|
|
17
18
|
export interface ToolRunGroupProps {
|
|
@@ -59,8 +60,9 @@ export const ToolRunGroup = memo(function ToolRunGroup({
|
|
|
59
60
|
useRenderTracer("ToolRunGroup", { category, count: toolCalls.length });
|
|
60
61
|
|
|
61
62
|
const status = deriveAggregateStatus(toolCalls);
|
|
63
|
+
const isShimmering = status === "running";
|
|
62
64
|
const isActive =
|
|
63
|
-
|
|
65
|
+
isShimmering || status === "waiting" || status === "pending";
|
|
64
66
|
|
|
65
67
|
// A gate raised inside a folded run must be reachable without a click. Reads
|
|
66
68
|
// are ungated by default, but a presenter override (or future policy) could
|
|
@@ -87,11 +89,12 @@ export const ToolRunGroup = memo(function ToolRunGroup({
|
|
|
87
89
|
role="group"
|
|
88
90
|
aria-label={label}
|
|
89
91
|
data-cursor-target="tool-run-group"
|
|
90
|
-
className={
|
|
91
|
-
"stg:rounded-lg stg:border stg:border-border-prominent stg:overflow-hidden",
|
|
92
|
-
className,
|
|
93
|
-
)}
|
|
92
|
+
className={className}
|
|
94
93
|
>
|
|
94
|
+
{/* Quiet chrome (stigmer#274): the folded run is metadata-only by
|
|
95
|
+
construction (its categories are the quiet set), so the chip renders
|
|
96
|
+
as an unboxed line — same tier as the lone read/list/search rows it
|
|
97
|
+
folds — never a bordered card shouting over the conversation. */}
|
|
95
98
|
<button
|
|
96
99
|
type="button"
|
|
97
100
|
aria-expanded={expanded}
|
|
@@ -99,26 +102,36 @@ export const ToolRunGroup = memo(function ToolRunGroup({
|
|
|
99
102
|
className={cn(
|
|
100
103
|
"stg:flex stg:w-full stg:cursor-pointer stg:items-center stg:gap-2 stg:px-2.5 stg:py-1.5 stg:text-left stg:text-xs stg:text-muted-foreground stg:transition-colors",
|
|
101
104
|
"stg:hover:bg-muted-subtle",
|
|
102
|
-
// ring-inset so the card's overflow-hidden does not clip the focus ring.
|
|
103
105
|
"stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-inset stg:focus-visible:ring-ring",
|
|
104
106
|
)}
|
|
105
107
|
>
|
|
106
108
|
<span className="stg:shrink-0 stg:text-muted-foreground" aria-hidden="true">
|
|
107
109
|
<Icon />
|
|
108
110
|
</span>
|
|
109
|
-
|
|
111
|
+
{/* A running fold carries the ambient-liveness sweep on its label
|
|
112
|
+
(stigmer#277); the shimmer class owns `color`, so it replaces the
|
|
113
|
+
static color utility rather than fighting it. */}
|
|
114
|
+
<span
|
|
115
|
+
className={cn(
|
|
116
|
+
"stg:min-w-0 stg:flex-1 stg:truncate stg:font-medium",
|
|
117
|
+
isShimmering ? "stgm-shimmer-label" : "stg:text-foreground",
|
|
118
|
+
)}
|
|
119
|
+
>
|
|
110
120
|
{label}
|
|
111
121
|
</span>
|
|
112
|
-
|
|
113
|
-
<
|
|
114
|
-
|
|
122
|
+
{StatusIcon && (
|
|
123
|
+
<span className={cn("stg:shrink-0", STATUS_COLOR[status])} aria-hidden="true">
|
|
124
|
+
<StatusIcon />
|
|
125
|
+
</span>
|
|
126
|
+
)}
|
|
115
127
|
<ChevronIcon expanded={expanded} />
|
|
116
128
|
</button>
|
|
117
129
|
|
|
118
130
|
{expanded && (
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
131
|
+
// With no card frame, the disclosed rows sit under a light left rail
|
|
132
|
+
// (the quiet-tier body containment, mirroring ThreadCardBody's rail)
|
|
133
|
+
// as divider-separated rows — their container owns the frame.
|
|
134
|
+
<div className="stg:ml-1.5 stg:border-l-2 stg:border-border-muted stg:pl-2">
|
|
122
135
|
{toolCalls.map((tc) => (
|
|
123
136
|
<ToolCallItem key={tc.id || tc.name} toolCall={tc} bordered={false} />
|
|
124
137
|
))}
|
|
@@ -228,11 +241,13 @@ const STATUS_COLOR: Record<AggregateStatus, string> = {
|
|
|
228
241
|
pending: "stg:text-muted-foreground",
|
|
229
242
|
};
|
|
230
243
|
|
|
231
|
-
|
|
244
|
+
// `completed` is deliberately iconless — success is the silent default,
|
|
245
|
+
// matching the tool rows' own status vocabulary (stigmer#274).
|
|
246
|
+
const STATUS_ICON: Record<AggregateStatus, (() => React.JSX.Element) | null> = {
|
|
232
247
|
running: SpinnerIcon,
|
|
233
248
|
waiting: ClockIcon,
|
|
234
249
|
failed: XCircleIcon,
|
|
235
|
-
completed:
|
|
250
|
+
completed: null,
|
|
236
251
|
pending: DotIcon,
|
|
237
252
|
};
|
|
238
253
|
|
|
@@ -240,14 +255,6 @@ const STATUS_ICON: Record<AggregateStatus, () => React.JSX.Element> = {
|
|
|
240
255
|
// Inline SVG icons — kept inline for SDK independence (codebase pattern)
|
|
241
256
|
// ---------------------------------------------------------------------------
|
|
242
257
|
|
|
243
|
-
function SpinnerIcon() {
|
|
244
|
-
return (
|
|
245
|
-
<svg width="10" height="10" viewBox="0 0 12 12" fill="none" stroke="currentColor" strokeWidth="1.5" className="stg:animate-spin">
|
|
246
|
-
<path d="M6 1.5A4.5 4.5 0 1 1 1.5 6" strokeLinecap="round" />
|
|
247
|
-
</svg>
|
|
248
|
-
);
|
|
249
|
-
}
|
|
250
|
-
|
|
251
258
|
function ClockIcon() {
|
|
252
259
|
return (
|
|
253
260
|
<svg width="10" height="10" viewBox="0 0 12 12" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
@@ -257,15 +264,6 @@ function ClockIcon() {
|
|
|
257
264
|
);
|
|
258
265
|
}
|
|
259
266
|
|
|
260
|
-
function CheckCircleIcon() {
|
|
261
|
-
return (
|
|
262
|
-
<svg width="10" height="10" viewBox="0 0 12 12" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
263
|
-
<circle cx="6" cy="6" r="4.5" />
|
|
264
|
-
<path d="M4 6L5.5 7.5L8 4.5" />
|
|
265
|
-
</svg>
|
|
266
|
-
);
|
|
267
|
-
}
|
|
268
|
-
|
|
269
267
|
function XCircleIcon() {
|
|
270
268
|
return (
|
|
271
269
|
<svg width="10" height="10" viewBox="0 0 12 12" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import { useCallback
|
|
3
|
+
import { useCallback } from "react";
|
|
4
4
|
import type { WorkspaceWriteBack } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/writeback_pb";
|
|
5
5
|
import { WorkspaceWriteBackPhase } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/writeback_pb";
|
|
6
6
|
import { cn } from "@stigmer/theme";
|
|
7
7
|
import { DiffSummary } from "../version-history/DiffSummary.js";
|
|
8
8
|
import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
|
|
9
9
|
import { TruncatedText } from "../internal/truncated-text.js";
|
|
10
|
+
import { useCopyFeedback } from "../internal/useCopyFeedback.js";
|
|
10
11
|
import {
|
|
11
12
|
parseDiffStatSummary,
|
|
12
13
|
trailingDiffStatLine,
|
|
@@ -202,9 +203,6 @@ function PullRequestRow({ url, number }: { url: string; number: number }) {
|
|
|
202
203
|
// Branch row — info + sibling hover-revealed copy control
|
|
203
204
|
// ---------------------------------------------------------------------------
|
|
204
205
|
|
|
205
|
-
/** How long the copy control shows its "copied" confirmation. */
|
|
206
|
-
const COPIED_FEEDBACK_MS = 2000;
|
|
207
|
-
|
|
208
206
|
function BranchRow({
|
|
209
207
|
branchName,
|
|
210
208
|
baseBranch,
|
|
@@ -212,27 +210,10 @@ function BranchRow({
|
|
|
212
210
|
branchName: string;
|
|
213
211
|
baseBranch: string;
|
|
214
212
|
}) {
|
|
215
|
-
const
|
|
216
|
-
|
|
217
|
-
// Clear the pending feedback timer on unmount so a resolved copy never
|
|
218
|
-
// sets state on an unmounted component (same guard as useArtifactCopy).
|
|
219
|
-
const copiedTimer = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
220
|
-
useEffect(() => {
|
|
221
|
-
return () => {
|
|
222
|
-
if (copiedTimer.current !== null) clearTimeout(copiedTimer.current);
|
|
223
|
-
};
|
|
224
|
-
}, []);
|
|
225
|
-
|
|
213
|
+
const { copy, copied } = useCopyFeedback();
|
|
226
214
|
const handleCopy = useCallback(() => {
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
if (copiedTimer.current !== null) clearTimeout(copiedTimer.current);
|
|
230
|
-
copiedTimer.current = setTimeout(
|
|
231
|
-
() => setCopied(false),
|
|
232
|
-
COPIED_FEEDBACK_MS,
|
|
233
|
-
);
|
|
234
|
-
});
|
|
235
|
-
}, [branchName]);
|
|
215
|
+
void copy(branchName);
|
|
216
|
+
}, [copy, branchName]);
|
|
236
217
|
|
|
237
218
|
return (
|
|
238
219
|
<div className="stg:group stg:flex stg:items-stretch">
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { describe, it, expect, vi, afterEach } from "vitest";
|
|
2
|
+
import { render, screen, cleanup, fireEvent, waitFor } from "@testing-library/react";
|
|
3
|
+
import { create } from "@bufbuild/protobuf";
|
|
4
|
+
import { AgentMessageSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
|
|
5
|
+
import { MessageType } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
6
|
+
|
|
7
|
+
import { MessageEntry } from "../MessageEntry";
|
|
8
|
+
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// Per-message copy affordance (stigmer/stigmer#278): every settled human and
|
|
11
|
+
// AI message carries a quiet copy control that writes the message's text to
|
|
12
|
+
// the clipboard, with transient "Copied" feedback. The affordance is
|
|
13
|
+
// hover-revealed but always in the DOM (keyboard/screen-reader reachable).
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
|
|
16
|
+
afterEach(() => {
|
|
17
|
+
cleanup();
|
|
18
|
+
vi.unstubAllGlobals();
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
function message(type: MessageType, content: string, isStreaming = false) {
|
|
22
|
+
return create(AgentMessageSchema, { type, content, isStreaming });
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function stubClipboard() {
|
|
26
|
+
const writeText = vi.fn(() => Promise.resolve());
|
|
27
|
+
vi.stubGlobal("navigator", { clipboard: { writeText } });
|
|
28
|
+
return writeText;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
describe("MessageEntry copy affordance", () => {
|
|
32
|
+
it("copies a human message's text on click and flips to Copied feedback", async () => {
|
|
33
|
+
const writeText = stubClipboard();
|
|
34
|
+
render(
|
|
35
|
+
<MessageEntry
|
|
36
|
+
message={message(MessageType.MESSAGE_HUMAN, "run the deploy again")}
|
|
37
|
+
/>,
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
fireEvent.click(screen.getByLabelText("Copy message"));
|
|
41
|
+
expect(writeText).toHaveBeenCalledExactlyOnceWith("run the deploy again");
|
|
42
|
+
|
|
43
|
+
// The affordance answers with its transient feedback state.
|
|
44
|
+
await waitFor(() => {
|
|
45
|
+
expect(screen.getByLabelText("Copied")).toBeTruthy();
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it("copies an AI message's markdown — formatting characters included", () => {
|
|
50
|
+
const writeText = stubClipboard();
|
|
51
|
+
const md = "## Plan\n\n- step **one**\n- step `two`";
|
|
52
|
+
render(<MessageEntry message={message(MessageType.MESSAGE_AI, md)} />);
|
|
53
|
+
|
|
54
|
+
fireEvent.click(screen.getByLabelText("Copy message"));
|
|
55
|
+
expect(writeText).toHaveBeenCalledExactlyOnceWith(md);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("copies the fence-unwrapped markdown the reader actually sees", () => {
|
|
59
|
+
// A model that wraps its whole reply in a ```markdown fence renders
|
|
60
|
+
// unwrapped (MessageEntry's render seam); the copy must match the render,
|
|
61
|
+
// not re-wrap what the user is looking at.
|
|
62
|
+
const writeText = stubClipboard();
|
|
63
|
+
render(
|
|
64
|
+
<MessageEntry
|
|
65
|
+
message={message(MessageType.MESSAGE_AI, "```markdown\n# Title\nbody\n```")}
|
|
66
|
+
/>,
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
fireEvent.click(screen.getByLabelText("Copy message"));
|
|
70
|
+
expect(writeText).toHaveBeenCalledExactlyOnceWith("# Title\nbody");
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it("offers no copy while an AI message is still streaming", () => {
|
|
74
|
+
stubClipboard();
|
|
75
|
+
render(
|
|
76
|
+
<MessageEntry
|
|
77
|
+
message={message(MessageType.MESSAGE_AI, "partial answer…", true)}
|
|
78
|
+
/>,
|
|
79
|
+
);
|
|
80
|
+
expect(screen.queryByLabelText("Copy message")).toBeNull();
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it("offers no copy on system messages", () => {
|
|
84
|
+
stubClipboard();
|
|
85
|
+
render(
|
|
86
|
+
<MessageEntry
|
|
87
|
+
message={message(MessageType.MESSAGE_SYSTEM, "execution resumed")}
|
|
88
|
+
/>,
|
|
89
|
+
);
|
|
90
|
+
expect(screen.queryByLabelText("Copy message")).toBeNull();
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it("keeps copy and edit as siblings on a human bubble when editing is wired", () => {
|
|
94
|
+
stubClipboard();
|
|
95
|
+
const onEdit = vi.fn();
|
|
96
|
+
render(
|
|
97
|
+
<MessageEntry
|
|
98
|
+
message={message(MessageType.MESSAGE_HUMAN, "tweak this")}
|
|
99
|
+
onEdit={onEdit}
|
|
100
|
+
/>,
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
// Both affordances present and independently operable.
|
|
104
|
+
expect(screen.getByLabelText("Copy message")).toBeTruthy();
|
|
105
|
+
fireEvent.click(screen.getByLabelText("Edit message"));
|
|
106
|
+
expect(onEdit).toHaveBeenCalledTimes(1);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it("claims no copy when the clipboard write is rejected", async () => {
|
|
110
|
+
// Insecure context / denied permission: the button must not flash
|
|
111
|
+
// "Copied" for a copy that never happened.
|
|
112
|
+
const writeText = vi.fn(() => Promise.reject(new Error("denied")));
|
|
113
|
+
vi.stubGlobal("navigator", { clipboard: { writeText } });
|
|
114
|
+
render(
|
|
115
|
+
<MessageEntry message={message(MessageType.MESSAGE_HUMAN, "hello")} />,
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
fireEvent.click(screen.getByLabelText("Copy message"));
|
|
119
|
+
await waitFor(() => {
|
|
120
|
+
expect(writeText).toHaveBeenCalledTimes(1);
|
|
121
|
+
});
|
|
122
|
+
expect(screen.queryByLabelText("Copied")).toBeNull();
|
|
123
|
+
expect(screen.getByLabelText("Copy message")).toBeTruthy();
|
|
124
|
+
});
|
|
125
|
+
});
|