@stigmer/react 3.12.1 → 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/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/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 +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/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.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 +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 +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/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/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/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 +1 -1
- 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__/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 +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 +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 +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/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 +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 +8 -24
- 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 +3 -23
- 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 +7 -11
- package/src/workflow/execution-history/ExecutionHistoryTable.tsx +1 -25
- package/src/workflow/index.ts +1 -0
- package/src/workflow/instance/CreateWorkflowInstanceDialog.tsx +1 -1
- package/src/workflow/instance/WorkflowInstanceDetailPanel.tsx +2 -1
- package/src/workflow/picker/BranchAddPopover.tsx +4 -3
- package/src/workflow/templates/WorkflowTemplatePreview.tsx +1 -1
- 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 +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 +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 +6 -8
- package/workflow/WorkflowExplainDialog.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 +2 -7
- 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.js +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.js +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
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
import { PlanDocumentMessage } from "./PlanDocumentMessage.js";
|
|
21
21
|
import { useRenderTracer } from "../internal/dev/index.js";
|
|
22
22
|
import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
|
|
23
|
+
import { useCopyFeedback } from "../internal/useCopyFeedback.js";
|
|
23
24
|
|
|
24
25
|
/** Props for {@link MessageEntry}. */
|
|
25
26
|
export interface MessageEntryProps {
|
|
@@ -192,29 +193,29 @@ function HumanMessage({
|
|
|
192
193
|
/>
|
|
193
194
|
)}
|
|
194
195
|
<p className="stg:text-sm stg:text-foreground stg:whitespace-pre-wrap">{content}</p>
|
|
195
|
-
{
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
"
|
|
206
|
-
|
|
207
|
-
"
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
196
|
+
{/* The hover-revealed action cluster on the bubble's shoulder: copy is
|
|
197
|
+
always offered (the message text is the content), edit only when the
|
|
198
|
+
host wired the callback. */}
|
|
199
|
+
<div className="stg:absolute stg:-top-2.5 stg:-right-2.5 stg:flex stg:gap-1">
|
|
200
|
+
<CopyMessageButton text={content} variant="bubble" />
|
|
201
|
+
{onEdit && (
|
|
202
|
+
<Tooltip>
|
|
203
|
+
<TooltipTrigger
|
|
204
|
+
render={
|
|
205
|
+
<button
|
|
206
|
+
type="button"
|
|
207
|
+
onClick={onEdit}
|
|
208
|
+
aria-label="Edit message"
|
|
209
|
+
className={BUBBLE_ACTION_CLASSES}
|
|
210
|
+
/>
|
|
211
|
+
}
|
|
212
|
+
>
|
|
213
|
+
<EditIcon />
|
|
214
|
+
</TooltipTrigger>
|
|
215
|
+
<TooltipContent side="top">Edit</TooltipContent>
|
|
216
|
+
</Tooltip>
|
|
217
|
+
)}
|
|
218
|
+
</div>
|
|
218
219
|
</div>
|
|
219
220
|
);
|
|
220
221
|
}
|
|
@@ -269,7 +270,7 @@ function AiMessage({
|
|
|
269
270
|
role="article"
|
|
270
271
|
aria-label="AI response"
|
|
271
272
|
aria-busy={isStreaming}
|
|
272
|
-
className={cn("stg:px-4 stg:py-3", className)}
|
|
273
|
+
className={cn("stg:group stg:px-4 stg:py-3", className)}
|
|
273
274
|
>
|
|
274
275
|
<div className="stgm-prose">
|
|
275
276
|
<Streamdown
|
|
@@ -280,10 +281,118 @@ function AiMessage({
|
|
|
280
281
|
{markdown}
|
|
281
282
|
</Streamdown>
|
|
282
283
|
</div>
|
|
284
|
+
{/* The quiet per-message actions row (issue #278). Height is reserved
|
|
285
|
+
whenever it renders, so the hover reveal never shifts the prose; it
|
|
286
|
+
appears only once the message settles — a streaming message's text
|
|
287
|
+
is still changing, so a copy would race the content. Copies the
|
|
288
|
+
display markdown (fence-unwrapped), i.e. what the reader sees. */}
|
|
289
|
+
{!isStreaming && markdown.trim().length > 0 && (
|
|
290
|
+
<div className="stg:mt-1 stg:flex stg:h-6 stg:items-center">
|
|
291
|
+
<CopyMessageButton text={markdown} variant="quiet" />
|
|
292
|
+
</div>
|
|
293
|
+
)}
|
|
283
294
|
</div>
|
|
284
295
|
);
|
|
285
296
|
}
|
|
286
297
|
|
|
298
|
+
// ---------------------------------------------------------------------------
|
|
299
|
+
// Per-message copy affordance (issue #278)
|
|
300
|
+
// ---------------------------------------------------------------------------
|
|
301
|
+
|
|
302
|
+
// The floating circular action on a human bubble's shoulder — shared by the
|
|
303
|
+
// copy and edit buttons so the cluster reads as one control family.
|
|
304
|
+
const BUBBLE_ACTION_CLASSES = cn(
|
|
305
|
+
"stg:inline-flex stg:h-7 stg:w-7 stg:items-center stg:justify-center stg:rounded-full",
|
|
306
|
+
"stg:border stg:border-border stg:bg-card stg:text-muted-foreground stg:shadow-sm stg:transition",
|
|
307
|
+
"stg:hover:text-foreground stg:hover:bg-accent-hover",
|
|
308
|
+
"stg:opacity-0 stg:group-hover:opacity-100 stg:focus-visible:opacity-100",
|
|
309
|
+
"stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-ring",
|
|
310
|
+
);
|
|
311
|
+
|
|
312
|
+
// The quiet in-flow variant for AI prose: no border or fill, one contrast
|
|
313
|
+
// step below the reading text (`muted-foreground-subtle`, rising to
|
|
314
|
+
// `muted-foreground` on hover) — findable when wanted, invisible while
|
|
315
|
+
// reading. The same hover/focus reveal keeps both variants keyboard-reachable.
|
|
316
|
+
const QUIET_ACTION_CLASSES = cn(
|
|
317
|
+
"stg:inline-flex stg:h-6 stg:w-6 stg:items-center stg:justify-center stg:rounded-md",
|
|
318
|
+
"stg:text-muted-foreground-subtle stg:transition",
|
|
319
|
+
"stg:hover:text-muted-foreground stg:hover:bg-accent-hover",
|
|
320
|
+
"stg:opacity-0 stg:group-hover:opacity-100 stg:focus-visible:opacity-100",
|
|
321
|
+
"stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-ring",
|
|
322
|
+
);
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* The per-message copy control: writes the message's text to the clipboard
|
|
326
|
+
* and flips to a check for the feedback window. `variant` selects the visual
|
|
327
|
+
* home — `"bubble"` joins the human bubble's floating action cluster,
|
|
328
|
+
* `"quiet"` sits in the AI message's reserved actions row.
|
|
329
|
+
*/
|
|
330
|
+
function CopyMessageButton({
|
|
331
|
+
text,
|
|
332
|
+
variant,
|
|
333
|
+
}: {
|
|
334
|
+
text: string;
|
|
335
|
+
variant: "bubble" | "quiet";
|
|
336
|
+
}) {
|
|
337
|
+
const { copy, copied } = useCopyFeedback();
|
|
338
|
+
return (
|
|
339
|
+
<Tooltip>
|
|
340
|
+
<TooltipTrigger
|
|
341
|
+
render={
|
|
342
|
+
<button
|
|
343
|
+
type="button"
|
|
344
|
+
onClick={() => void copy(text)}
|
|
345
|
+
aria-label={copied ? "Copied" : "Copy message"}
|
|
346
|
+
className={
|
|
347
|
+
variant === "bubble" ? BUBBLE_ACTION_CLASSES : QUIET_ACTION_CLASSES
|
|
348
|
+
}
|
|
349
|
+
/>
|
|
350
|
+
}
|
|
351
|
+
>
|
|
352
|
+
{copied ? <CheckIcon /> : <CopyMessageIcon />}
|
|
353
|
+
</TooltipTrigger>
|
|
354
|
+
<TooltipContent side="top">{copied ? "Copied" : "Copy"}</TooltipContent>
|
|
355
|
+
</Tooltip>
|
|
356
|
+
);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
function CopyMessageIcon() {
|
|
360
|
+
return (
|
|
361
|
+
<svg
|
|
362
|
+
width="13"
|
|
363
|
+
height="13"
|
|
364
|
+
viewBox="0 0 24 24"
|
|
365
|
+
fill="none"
|
|
366
|
+
stroke="currentColor"
|
|
367
|
+
strokeWidth="2"
|
|
368
|
+
strokeLinecap="round"
|
|
369
|
+
strokeLinejoin="round"
|
|
370
|
+
aria-hidden="true"
|
|
371
|
+
>
|
|
372
|
+
<rect x="9" y="9" width="13" height="13" rx="2" />
|
|
373
|
+
<path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" />
|
|
374
|
+
</svg>
|
|
375
|
+
);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
function CheckIcon() {
|
|
379
|
+
return (
|
|
380
|
+
<svg
|
|
381
|
+
width="13"
|
|
382
|
+
height="13"
|
|
383
|
+
viewBox="0 0 24 24"
|
|
384
|
+
fill="none"
|
|
385
|
+
stroke="currentColor"
|
|
386
|
+
strokeWidth="2"
|
|
387
|
+
strokeLinecap="round"
|
|
388
|
+
strokeLinejoin="round"
|
|
389
|
+
aria-hidden="true"
|
|
390
|
+
>
|
|
391
|
+
<path d="M20 6 9 17l-5-5" />
|
|
392
|
+
</svg>
|
|
393
|
+
);
|
|
394
|
+
}
|
|
395
|
+
|
|
287
396
|
const THINKING_PREVIEW_LENGTH = 80;
|
|
288
397
|
|
|
289
398
|
function ThinkingMessage({
|
|
@@ -320,7 +429,9 @@ function ThinkingMessage({
|
|
|
320
429
|
)}
|
|
321
430
|
>
|
|
322
431
|
<ThinkingIcon isStreaming={isStreaming} />
|
|
323
|
-
|
|
432
|
+
{/* Live reasoning carries the ambient-liveness sweep (stigmer#277) —
|
|
433
|
+
the words themselves signal activity, not just the icon. */}
|
|
434
|
+
<span className={cn("stg:min-w-0 stg:truncate", isStreaming && "stgm-shimmer-label")}>
|
|
324
435
|
{isStreaming && !hasContent
|
|
325
436
|
? "Thinking..."
|
|
326
437
|
: expanded
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import { lazy, memo, Suspense, useCallback, useMemo,
|
|
3
|
+
import { lazy, memo, Suspense, useCallback, useMemo, type ComponentType } from "react";
|
|
4
4
|
import { create } from "@bufbuild/protobuf";
|
|
5
5
|
import type { AgentExecution } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
6
6
|
import type { AgentMessage, ToolCall } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
|
|
@@ -16,6 +16,8 @@ import {
|
|
|
16
16
|
FileChangeSetStatus,
|
|
17
17
|
InteractionMode,
|
|
18
18
|
MessageType,
|
|
19
|
+
SubAgentStatus,
|
|
20
|
+
ToolCallStatus,
|
|
19
21
|
} from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
20
22
|
import type { WorkspaceEntry } from "@stigmer/protos/ai/stigmer/agentic/session/v1/workspace_pb";
|
|
21
23
|
import { displayFileChangeSets } from "@stigmer/sdk";
|
|
@@ -27,7 +29,12 @@ import { ToolCallGroup } from "./ToolCallGroup.js";
|
|
|
27
29
|
import { SubAgentSection } from "./SubAgentSection.js";
|
|
28
30
|
import { ExecutionPhaseBadge } from "./ExecutionPhaseBadge.js";
|
|
29
31
|
import { SetupProgress, type SetupProgressProps } from "./SetupProgress.js";
|
|
32
|
+
import {
|
|
33
|
+
LivenessStatusLine,
|
|
34
|
+
type LivenessStatusLineProps,
|
|
35
|
+
} from "./LivenessStatusLine.js";
|
|
30
36
|
import { ApprovalCard, type ApprovalCardProps } from "./ApprovalCard.js";
|
|
37
|
+
import { ExecutionErrorNotice, type ExecutionErrorNoticeProps } from "./ExecutionErrorNotice.js";
|
|
31
38
|
import { FileReviewCard } from "./FileReviewCard.js";
|
|
32
39
|
import { SummarizationCard } from "./SummarizationCard.js";
|
|
33
40
|
import { PlanCompletionCard, type PlanCompletionCardProps } from "./PlanCompletionCard.js";
|
|
@@ -106,6 +113,20 @@ export interface MessageThreadSlots {
|
|
|
106
113
|
readonly PlanStreamingCard?: ComponentType<PlanStreamingCardProps>;
|
|
107
114
|
/** Pre-first-token setup / "Thinking…" indicator. */
|
|
108
115
|
readonly SetupProgress?: ComponentType<SetupProgressProps>;
|
|
116
|
+
/**
|
|
117
|
+
* The terminal execution-failure notice. Receives the raw server-reported
|
|
118
|
+
* reason and the retry wiring, so a host can turn the failure into its own
|
|
119
|
+
* recovery moment (classify the reason, offer an alternate engine, link
|
|
120
|
+
* support) instead of the built-in Show more / Retry treatment.
|
|
121
|
+
*/
|
|
122
|
+
readonly ExecutionErrorNotice?: ComponentType<ExecutionErrorNoticeProps>;
|
|
123
|
+
/**
|
|
124
|
+
* The ambient-liveness status line at the thread's tail while the active
|
|
125
|
+
* execution is live between visible events (stigmer#277). Override to
|
|
126
|
+
* supply a host-voiced label or richer treatment; the emission policy
|
|
127
|
+
* (when the line appears at all) stays with the thread.
|
|
128
|
+
*/
|
|
129
|
+
readonly LivenessStatusLine?: ComponentType<LivenessStatusLineProps>;
|
|
109
130
|
}
|
|
110
131
|
|
|
111
132
|
/** Props for {@link MessageThread}. */
|
|
@@ -400,6 +421,16 @@ export type ThreadItem =
|
|
|
400
421
|
readonly planTitle?: string;
|
|
401
422
|
/** Length of the plan text streamed so far (drives the live size). */
|
|
402
423
|
readonly planSize: number;
|
|
424
|
+
}
|
|
425
|
+
| {
|
|
426
|
+
/**
|
|
427
|
+
* The ambient-liveness status line at the thread's tail (stigmer#277):
|
|
428
|
+
* emitted while the active execution is IN_PROGRESS with no running
|
|
429
|
+
* tool call, no live sub-agent, and no pending approval — the quiet
|
|
430
|
+
* stretches where the screen would otherwise be completely still.
|
|
431
|
+
*/
|
|
432
|
+
readonly kind: "liveness";
|
|
433
|
+
readonly key: string;
|
|
403
434
|
};
|
|
404
435
|
|
|
405
436
|
/**
|
|
@@ -426,6 +457,30 @@ function hasStartedResponding(execution: AgentExecution): boolean {
|
|
|
426
457
|
});
|
|
427
458
|
}
|
|
428
459
|
|
|
460
|
+
/**
|
|
461
|
+
* True while the active execution already shows a live signal of its own
|
|
462
|
+
* somewhere in the thread — a RUNNING tool call (its row's label carries the
|
|
463
|
+
* shimmer) or an in-flight sub-agent (its section carries a live indicator).
|
|
464
|
+
* Suppresses the bottom liveness line: one ambient signal at a time, riding
|
|
465
|
+
* the words closest to the actual activity.
|
|
466
|
+
*/
|
|
467
|
+
function hasVisiblyRunningActivity(execution: AgentExecution): boolean {
|
|
468
|
+
for (const sub of execution.status?.subAgentExecutions ?? []) {
|
|
469
|
+
if (
|
|
470
|
+
sub.status === SubAgentStatus.SUB_AGENT_IN_PROGRESS ||
|
|
471
|
+
sub.status === SubAgentStatus.SUB_AGENT_PENDING
|
|
472
|
+
) {
|
|
473
|
+
return true;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
for (const msg of execution.status?.messages ?? []) {
|
|
477
|
+
for (const tc of msg.toolCalls) {
|
|
478
|
+
if (tc.status === ToolCallStatus.TOOL_CALL_RUNNING) return true;
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
return false;
|
|
482
|
+
}
|
|
483
|
+
|
|
429
484
|
/**
|
|
430
485
|
* True for an execution that ran in Plan mode and completed — the only kind of
|
|
431
486
|
* execution that has a reviewable plan (streaming/failed/terminated Plan turns
|
|
@@ -1026,6 +1081,26 @@ export function buildThreadItems(
|
|
|
1026
1081
|
// edit row, never appended at the thread tail. Pending decision bars are
|
|
1027
1082
|
// not thread items at all: they live in the composer-docked FileReviewDock.
|
|
1028
1083
|
|
|
1084
|
+
// The ambient-liveness line (stigmer#277): the thread's tail is never a
|
|
1085
|
+
// dead frame while the agent is alive. Emitted only when
|
|
1086
|
+
// - the execution is IN_PROGRESS (phase-driven, DD-009 — WAITING/PAUSED
|
|
1087
|
+
// mean the agent is NOT working, and shimmering there would lie),
|
|
1088
|
+
// - it is past the pre-first-content window (setup-progress owns that),
|
|
1089
|
+
// - nothing else on screen carries its own live signal (a running tool
|
|
1090
|
+
// row or live sub-agent — one ambient signal at a time), and
|
|
1091
|
+
// - no approval is pending (the gate card is the louder, truthful state).
|
|
1092
|
+
// Model-generation gaps between tool calls — the exact moments users doubt
|
|
1093
|
+
// the agent — are precisely what remains.
|
|
1094
|
+
if (
|
|
1095
|
+
activeStreamExecution &&
|
|
1096
|
+
hasStartedResponding(activeStreamExecution) &&
|
|
1097
|
+
activeStreamExecution.status?.phase === ExecutionPhase.EXECUTION_IN_PROGRESS &&
|
|
1098
|
+
(activeStreamExecution.status.pendingApprovals?.length ?? 0) === 0 &&
|
|
1099
|
+
!hasVisiblyRunningActivity(activeStreamExecution)
|
|
1100
|
+
) {
|
|
1101
|
+
items.push({ kind: "liveness", key: "liveness-status" });
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1029
1104
|
if (pendingUserMessage) {
|
|
1030
1105
|
// A FAILED send never created an execution, so an existing execution with
|
|
1031
1106
|
// identical text (e.g. two build attempts of the same plan — both
|
|
@@ -1489,14 +1564,16 @@ export function ThreadItemRenderer({
|
|
|
1489
1564
|
<ExecutionPhaseBadge phase={item.phase} />
|
|
1490
1565
|
</div>
|
|
1491
1566
|
);
|
|
1492
|
-
case "execution-error":
|
|
1567
|
+
case "execution-error": {
|
|
1568
|
+
const ErrorNotice = slots?.ExecutionErrorNotice ?? ExecutionErrorNotice;
|
|
1493
1569
|
return (
|
|
1494
|
-
<
|
|
1570
|
+
<ErrorNotice
|
|
1495
1571
|
error={item.error}
|
|
1496
1572
|
retryMessage={item.retryMessage}
|
|
1497
1573
|
onRetry={onRetryExecution}
|
|
1498
1574
|
/>
|
|
1499
1575
|
);
|
|
1576
|
+
}
|
|
1500
1577
|
case "approval-request":
|
|
1501
1578
|
return (
|
|
1502
1579
|
<ApprovalCardRow
|
|
@@ -1521,6 +1598,10 @@ export function ThreadItemRenderer({
|
|
|
1521
1598
|
}
|
|
1522
1599
|
case "context-compacted":
|
|
1523
1600
|
return <SummarizationCard event={item.event} />;
|
|
1601
|
+
case "liveness": {
|
|
1602
|
+
const Liveness = slots?.LivenessStatusLine ?? LivenessStatusLine;
|
|
1603
|
+
return <Liveness />;
|
|
1604
|
+
}
|
|
1524
1605
|
case "todos": {
|
|
1525
1606
|
const Todos = slots?.TodoCard ?? TodoCard;
|
|
1526
1607
|
return <Todos todos={item.todos} className="stg:mx-4" TodoRow={slots?.TodoRow} />;
|
|
@@ -1624,86 +1705,6 @@ function FailedUserMessage({
|
|
|
1624
1705
|
);
|
|
1625
1706
|
}
|
|
1626
1707
|
|
|
1627
|
-
// ---------------------------------------------------------------------------
|
|
1628
|
-
// ExecutionErrorNotice — server failure reason for a terminal-failed execution
|
|
1629
|
-
// ---------------------------------------------------------------------------
|
|
1630
|
-
|
|
1631
|
-
/**
|
|
1632
|
-
* Recognizes a recoverable *interruption* (worker reaped / heartbeat timeout /
|
|
1633
|
-
* stall) as opposed to a genuine application failure. The runner stamps these
|
|
1634
|
-
* with a stable signature ("[StallTimeoutError]", "Execution interrupted",
|
|
1635
|
-
* "Retry or resume."), and the workflow auto-resumes them while recovery cycles
|
|
1636
|
-
* remain; by the time one reaches the UI as terminal it is resumable from the
|
|
1637
|
-
* session's persisted harness_state_id rather than a dead end.
|
|
1638
|
-
*/
|
|
1639
|
-
function isInterruptedError(error: string): boolean {
|
|
1640
|
-
return /\[StallTimeoutError\]|execution interrupted|retry or resume/i.test(error);
|
|
1641
|
-
}
|
|
1642
|
-
|
|
1643
|
-
/**
|
|
1644
|
-
* Renders the server-reported failure reason (`AgentExecutionStatus.error`)
|
|
1645
|
-
* for an execution that died — typically before producing any messages. The
|
|
1646
|
-
* reason can be a long Temporal error, so it is clamped by default with a
|
|
1647
|
-
* Show more / Show less toggle.
|
|
1648
|
-
*
|
|
1649
|
-
* A genuine failure renders as a destructive alert with a Retry. A *recoverable
|
|
1650
|
-
* interruption* renders as a neutral notice with a Resume — both resend the
|
|
1651
|
-
* originating message, which the server continues from the session's persisted
|
|
1652
|
-
* harness_state_id (the same data path; the framing differs so an interruption
|
|
1653
|
-
* never looks like a dead-end crash).
|
|
1654
|
-
*/
|
|
1655
|
-
function ExecutionErrorNotice({
|
|
1656
|
-
error,
|
|
1657
|
-
retryMessage,
|
|
1658
|
-
onRetry,
|
|
1659
|
-
}: {
|
|
1660
|
-
error: string;
|
|
1661
|
-
retryMessage?: string;
|
|
1662
|
-
onRetry?: (message: string) => void;
|
|
1663
|
-
}) {
|
|
1664
|
-
const [expanded, setExpanded] = useState(false);
|
|
1665
|
-
const canRetry = !!onRetry && !!retryMessage;
|
|
1666
|
-
const interrupted = isInterruptedError(error);
|
|
1667
|
-
|
|
1668
|
-
return (
|
|
1669
|
-
<div
|
|
1670
|
-
role={interrupted ? "status" : "alert"}
|
|
1671
|
-
className={cn(
|
|
1672
|
-
"stg:mx-4 stg:flex stg:flex-col stg:gap-1.5 stg:rounded-md stg:px-3 stg:py-2",
|
|
1673
|
-
interrupted ? "stg:bg-muted" : "stg:bg-destructive-subtle",
|
|
1674
|
-
)}
|
|
1675
|
-
>
|
|
1676
|
-
<p
|
|
1677
|
-
className={cn(
|
|
1678
|
-
"stg:text-xs stg:whitespace-pre-wrap stg:break-words",
|
|
1679
|
-
interrupted ? "stg:text-foreground" : "stg:text-destructive",
|
|
1680
|
-
!expanded && "stg:line-clamp-3",
|
|
1681
|
-
)}
|
|
1682
|
-
>
|
|
1683
|
-
{error}
|
|
1684
|
-
</p>
|
|
1685
|
-
<div className="stg:flex stg:items-center stg:gap-3 stg:text-xs">
|
|
1686
|
-
<button
|
|
1687
|
-
type="button"
|
|
1688
|
-
onClick={() => setExpanded((v) => !v)}
|
|
1689
|
-
className="stg:font-medium stg:text-muted-foreground stg:underline-offset-2 stg:hover:underline stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-ring"
|
|
1690
|
-
>
|
|
1691
|
-
{expanded ? "Show less" : "Show more"}
|
|
1692
|
-
</button>
|
|
1693
|
-
{canRetry && (
|
|
1694
|
-
<button
|
|
1695
|
-
type="button"
|
|
1696
|
-
onClick={() => onRetry!(retryMessage!)}
|
|
1697
|
-
className="stg:font-medium stg:text-foreground stg:underline-offset-2 stg:hover:underline stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-ring"
|
|
1698
|
-
>
|
|
1699
|
-
{interrupted ? "Resume" : "Retry"}
|
|
1700
|
-
</button>
|
|
1701
|
-
)}
|
|
1702
|
-
</div>
|
|
1703
|
-
</div>
|
|
1704
|
-
);
|
|
1705
|
-
}
|
|
1706
|
-
|
|
1707
1708
|
// ---------------------------------------------------------------------------
|
|
1708
1709
|
// ApprovalCardRow — stabilizes the onSubmit callback for React.memo
|
|
1709
1710
|
// ---------------------------------------------------------------------------
|
|
@@ -145,7 +145,11 @@ export const SetupProgress = memo(function SetupProgress({
|
|
|
145
145
|
className={cn("stg:flex stg:items-center stg:gap-2.5 stg:px-4 stg:py-2", className)}
|
|
146
146
|
>
|
|
147
147
|
<PulseIndicator />
|
|
148
|
-
|
|
148
|
+
{/* The setup/thinking label carries the ambient-liveness sweep
|
|
149
|
+
(stigmer#277): this indicator only exists while the execution is
|
|
150
|
+
live, so it always shimmers. The shimmer class owns `color`,
|
|
151
|
+
replacing the static muted utility. */}
|
|
152
|
+
<span className="stg:text-sm stg:animate-in stg:fade-in stg:duration-300 stgm-shimmer-label">
|
|
149
153
|
{currentMessage}
|
|
150
154
|
</span>
|
|
151
155
|
</div>
|
|
@@ -12,7 +12,7 @@ import { useRenderTracer } from "../internal/dev/index.js";
|
|
|
12
12
|
import { useAutoDisclosure } from "../internal/useAutoDisclosure.js";
|
|
13
13
|
import { useElapsedSince, formatElapsed } from "../internal/useElapsedSince.js";
|
|
14
14
|
import { cn } from "@stigmer/theme";
|
|
15
|
-
import {
|
|
15
|
+
import { formatHeaderDuration } from "./ToolCallDetail.js";
|
|
16
16
|
import { MessageEntry } from "./MessageEntry.js";
|
|
17
17
|
import { ToolCallGroup } from "./ToolCallGroup.js";
|
|
18
18
|
import { ApprovalContext } from "./ApprovalContext.js";
|
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
findActiveTodo,
|
|
24
24
|
todoCompletionSummary,
|
|
25
25
|
} from "./TodoList.js";
|
|
26
|
+
import { SpinnerIcon } from "../internal/thread-card/glyphs.js";
|
|
26
27
|
|
|
27
28
|
/** Props for {@link SubAgentSection}. */
|
|
28
29
|
export interface SubAgentSectionProps {
|
|
@@ -80,7 +81,10 @@ export const SubAgentSection = memo(function SubAgentSection({
|
|
|
80
81
|
}: SubAgentSectionProps) {
|
|
81
82
|
useRenderTracer("SubAgentSection", { status: sub.status, name: sub.name });
|
|
82
83
|
|
|
83
|
-
|
|
84
|
+
// Header chip threshold (>= 1s) shared with ToolCallItem — a sub-second
|
|
85
|
+
// sub-agent is noise by the same rule, and the two row kinds must speak
|
|
86
|
+
// one duration vocabulary.
|
|
87
|
+
const duration = formatHeaderDuration(sub.startedAt, sub.completedAt);
|
|
84
88
|
const statusInfo = SUB_AGENT_STATUS_MAP[sub.status];
|
|
85
89
|
const StatusIcon = statusInfo.icon;
|
|
86
90
|
const isFailed = sub.status === SubAgentStatus.SUB_AGENT_FAILED;
|
|
@@ -206,7 +210,7 @@ function CollapsibleCard({
|
|
|
206
210
|
<span className="stg:min-w-0 stg:flex-1 stg:truncate">{displayLabel}</span>
|
|
207
211
|
{isRunning && (
|
|
208
212
|
<span className="stg:shrink-0 stg:text-muted-foreground" aria-hidden="true">
|
|
209
|
-
<SpinnerIcon />
|
|
213
|
+
<SpinnerIcon size={12} />
|
|
210
214
|
</span>
|
|
211
215
|
)}
|
|
212
216
|
<span
|
|
@@ -482,7 +486,8 @@ const SUB_AGENT_STATUS_MAP: Record<SubAgentStatus, SubAgentStatusInfo> = {
|
|
|
482
486
|
label: "Running",
|
|
483
487
|
colorClass: "stg:text-foreground",
|
|
484
488
|
badgeClass: "stg:bg-muted stg:text-foreground",
|
|
485
|
-
|
|
489
|
+
// Sized up to match this map's 12px siblings (the glyph defaults to 10).
|
|
490
|
+
icon: () => <SpinnerIcon size={12} />,
|
|
486
491
|
},
|
|
487
492
|
[SubAgentStatus.SUB_AGENT_COMPLETED]: {
|
|
488
493
|
label: "Completed",
|
|
@@ -508,22 +513,6 @@ const SUB_AGENT_STATUS_MAP: Record<SubAgentStatus, SubAgentStatusInfo> = {
|
|
|
508
513
|
// Inline SVG icons
|
|
509
514
|
// ---------------------------------------------------------------------------
|
|
510
515
|
|
|
511
|
-
function SpinnerIcon() {
|
|
512
|
-
return (
|
|
513
|
-
<svg
|
|
514
|
-
width="12"
|
|
515
|
-
height="12"
|
|
516
|
-
viewBox="0 0 12 12"
|
|
517
|
-
fill="none"
|
|
518
|
-
stroke="currentColor"
|
|
519
|
-
strokeWidth="1.5"
|
|
520
|
-
className="stg:animate-spin"
|
|
521
|
-
>
|
|
522
|
-
<path d="M6 1.5A4.5 4.5 0 1 1 1.5 6" strokeLinecap="round" />
|
|
523
|
-
</svg>
|
|
524
|
-
);
|
|
525
|
-
}
|
|
526
|
-
|
|
527
516
|
function CheckCircleIcon() {
|
|
528
517
|
return (
|
|
529
518
|
<svg
|
|
@@ -75,17 +75,104 @@ export function TerminalSession({
|
|
|
75
75
|
{stderr && (
|
|
76
76
|
<CollapsiblePre content={normalize(stderr)} className="stg:text-destructive" />
|
|
77
77
|
)}
|
|
78
|
-
{failed &&
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
78
|
+
{failed && <ExitBadge exitCode={exitCode} />}
|
|
79
|
+
</div>
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** How many trailing output lines a collapsed terminal tail keeps visible. */
|
|
84
|
+
const TAIL_LINE_LIMIT = 3;
|
|
85
|
+
|
|
86
|
+
/** Props for {@link TerminalTail}. */
|
|
87
|
+
export interface TerminalTailProps {
|
|
88
|
+
/** The command that was run, shown as the `$ <command>` prompt line. */
|
|
89
|
+
readonly command?: string;
|
|
90
|
+
/** Standard output. */
|
|
91
|
+
readonly stdout?: string;
|
|
92
|
+
/** Standard error. */
|
|
93
|
+
readonly stderr?: string;
|
|
94
|
+
/** Process exit code. A non-zero code renders a trailing `exit N` badge. */
|
|
95
|
+
readonly exitCode?: number;
|
|
96
|
+
/** Additional CSS class names for the root container. */
|
|
97
|
+
readonly className?: string;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* The collapsed teaser of a settled terminal session: the `$ command` prompt
|
|
102
|
+
* line plus a dimmed tail of the last few output lines — enough to see at a
|
|
103
|
+
* glance that the command ran and what it printed last, without the full
|
|
104
|
+
* output competing with the conversation.
|
|
105
|
+
*
|
|
106
|
+
* The reduced contrast is deliberate and load-bearing: the tail is *context*,
|
|
107
|
+
* not content, so it renders one contrast step below the reading text
|
|
108
|
+
* (`muted-foreground`), while the command — the user-relevant intent — keeps
|
|
109
|
+
* full contrast. stderr is not colored here for the same reason; the full
|
|
110
|
+
* session (one disclosure away) restores the destructive treatment.
|
|
111
|
+
*
|
|
112
|
+
* Rendered by the tool-call row's `"tail"` disclosure state (see
|
|
113
|
+
* {@link ToolCallItem}); the row's header chevron is the expand control, so
|
|
114
|
+
* this component is presentation-only.
|
|
115
|
+
*/
|
|
116
|
+
export function TerminalTail({
|
|
117
|
+
command,
|
|
118
|
+
stdout,
|
|
119
|
+
stderr,
|
|
120
|
+
exitCode,
|
|
121
|
+
className,
|
|
122
|
+
}: TerminalTailProps) {
|
|
123
|
+
const normalize = useSandboxNormalize();
|
|
124
|
+
const failed = exitCode !== undefined && exitCode !== 0;
|
|
125
|
+
|
|
126
|
+
// One combined stream, in the order the full session renders it. Trailing
|
|
127
|
+
// whitespace is trimmed so an ending newline doesn't blank the last slot.
|
|
128
|
+
const combined = [stdout, stderr]
|
|
129
|
+
.filter((s): s is string => Boolean(s))
|
|
130
|
+
.join("\n")
|
|
131
|
+
.replace(/\s+$/, "");
|
|
132
|
+
const lines = combined ? normalize(combined).split("\n") : [];
|
|
133
|
+
const tail = lines.slice(-TAIL_LINE_LIMIT);
|
|
134
|
+
const hiddenCount = lines.length - tail.length;
|
|
135
|
+
|
|
136
|
+
return (
|
|
137
|
+
<div
|
|
138
|
+
data-cursor-target="terminal-tail"
|
|
139
|
+
className={cn(
|
|
140
|
+
"stg:space-y-1 stg:rounded-md stg:border stg:border-border stg:bg-muted-subtle stg:p-2.5 stg:font-mono stg:text-xs",
|
|
141
|
+
className,
|
|
88
142
|
)}
|
|
143
|
+
>
|
|
144
|
+
{command && (
|
|
145
|
+
<pre className="stg:whitespace-pre-wrap stg:break-words stg:text-foreground">
|
|
146
|
+
<span className="stg:select-none stg:text-muted-foreground">$ </span>
|
|
147
|
+
{normalize(command)}
|
|
148
|
+
</pre>
|
|
149
|
+
)}
|
|
150
|
+
{tail.length > 0 && (
|
|
151
|
+
<pre className="stg:whitespace-pre-wrap stg:break-words stg:text-muted-foreground">
|
|
152
|
+
{hiddenCount > 0 && (
|
|
153
|
+
<span className="stg:block stg:select-none stg:text-muted-foreground-subtle">
|
|
154
|
+
… +{hiddenCount} {hiddenCount === 1 ? "line" : "lines"}
|
|
155
|
+
</span>
|
|
156
|
+
)}
|
|
157
|
+
{tail.join("\n")}
|
|
158
|
+
</pre>
|
|
159
|
+
)}
|
|
160
|
+
{failed && <ExitBadge exitCode={exitCode} />}
|
|
161
|
+
</div>
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/** The `exit N` failure badge, shared by the full session and the tail. */
|
|
166
|
+
function ExitBadge({ exitCode }: { exitCode?: number }) {
|
|
167
|
+
return (
|
|
168
|
+
<div>
|
|
169
|
+
<span className="stg:sr-only">Command exited with code {exitCode}</span>
|
|
170
|
+
<span
|
|
171
|
+
aria-hidden="true"
|
|
172
|
+
className="stg:inline-block stg:rounded stg:bg-destructive-subtle stg:px-1 stg:py-0.5 stg:text-[10px] stg:font-medium stg:leading-none stg:tabular-nums stg:text-destructive"
|
|
173
|
+
>
|
|
174
|
+
exit {exitCode}
|
|
175
|
+
</span>
|
|
89
176
|
</div>
|
|
90
177
|
);
|
|
91
178
|
}
|
|
@@ -347,3 +347,22 @@ export function formatDuration(
|
|
|
347
347
|
const seconds = Math.round((ms % 60_000) / 1000);
|
|
348
348
|
return seconds > 0 ? `${minutes}m ${seconds}s` : `${minutes}m`;
|
|
349
349
|
}
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* {@link formatDuration} for header duration chips: returns `null` below one
|
|
353
|
+
* second. A duration chip earns its place only when it carries information —
|
|
354
|
+
* a `4ms` chip on a directory listing draws the eye to the least interesting
|
|
355
|
+
* row in the thread (stigmer#274), so sub-second work renders no chip at all.
|
|
356
|
+
* `formatDuration` itself stays exact — it is public API with consumers that
|
|
357
|
+
* want the precise value.
|
|
358
|
+
*/
|
|
359
|
+
export function formatHeaderDuration(
|
|
360
|
+
startedAt: string,
|
|
361
|
+
completedAt: string,
|
|
362
|
+
): string | null {
|
|
363
|
+
const formatted = formatDuration(startedAt, completedAt);
|
|
364
|
+
// Exactly the sub-second arm of formatDuration ("123ms"); every other arm
|
|
365
|
+
// is >= 1s by construction.
|
|
366
|
+
if (formatted === null || formatted.endsWith("ms")) return null;
|
|
367
|
+
return formatted;
|
|
368
|
+
}
|