@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
|
@@ -957,3 +957,100 @@ describe("MessageThread", () => {
|
|
|
957
957
|
});
|
|
958
958
|
});
|
|
959
959
|
});
|
|
960
|
+
|
|
961
|
+
// ---------------------------------------------------------------------------
|
|
962
|
+
// Ambient liveness status line (stigmer#277)
|
|
963
|
+
// ---------------------------------------------------------------------------
|
|
964
|
+
|
|
965
|
+
describe("MessageThread liveness status line", () => {
|
|
966
|
+
const LINE = '[data-cursor-target="liveness-status-line"]';
|
|
967
|
+
|
|
968
|
+
it("anchors the thread's tail while the execution is live between visible events", () => {
|
|
969
|
+
// IN_PROGRESS, has responded (AI content), no running tool, no gate —
|
|
970
|
+
// the model-generation gap where the screen would otherwise be still.
|
|
971
|
+
const active = makeExecution({
|
|
972
|
+
id: "exec-live",
|
|
973
|
+
phase: ExecutionPhase.EXECUTION_IN_PROGRESS,
|
|
974
|
+
aiContent: "Let me look around.",
|
|
975
|
+
});
|
|
976
|
+
const { container } = render(
|
|
977
|
+
<MessageThread executions={[]} activeStreamExecution={active} />,
|
|
978
|
+
);
|
|
979
|
+
expect(container.querySelector(LINE)).not.toBeNull();
|
|
980
|
+
});
|
|
981
|
+
|
|
982
|
+
it("yields to a running tool call — that row carries the live signal", () => {
|
|
983
|
+
const active = makeExecution({
|
|
984
|
+
id: "exec-tool",
|
|
985
|
+
phase: ExecutionPhase.EXECUTION_IN_PROGRESS,
|
|
986
|
+
aiContent: "Running a command.",
|
|
987
|
+
});
|
|
988
|
+
const runningTool = create(ToolCallSchema, {
|
|
989
|
+
id: "tc-run",
|
|
990
|
+
name: "Shell",
|
|
991
|
+
args: { command: "sleep 5" },
|
|
992
|
+
status: ToolCallStatus.TOOL_CALL_RUNNING,
|
|
993
|
+
});
|
|
994
|
+
active.status!.messages[1].toolCalls = [runningTool];
|
|
995
|
+
|
|
996
|
+
const { container } = render(
|
|
997
|
+
<MessageThread executions={[]} activeStreamExecution={active} />,
|
|
998
|
+
);
|
|
999
|
+
expect(container.querySelector(LINE)).toBeNull();
|
|
1000
|
+
});
|
|
1001
|
+
|
|
1002
|
+
it("yields to a pending approval — shimmering 'Working…' at a gate would lie", () => {
|
|
1003
|
+
const active = makeExecutionWithApproval("exec-gated", "tc-1", "write_file");
|
|
1004
|
+
const { container } = render(
|
|
1005
|
+
<MessageThread
|
|
1006
|
+
executions={[]}
|
|
1007
|
+
activeStreamExecution={active}
|
|
1008
|
+
onApprovalSubmit={() => {}}
|
|
1009
|
+
/>,
|
|
1010
|
+
);
|
|
1011
|
+
expect(container.querySelector(LINE)).toBeNull();
|
|
1012
|
+
});
|
|
1013
|
+
|
|
1014
|
+
it("disappears the moment the execution settles — phase-driven, never stream-inferred", () => {
|
|
1015
|
+
const done = makeExecution({
|
|
1016
|
+
id: "exec-done",
|
|
1017
|
+
phase: ExecutionPhase.EXECUTION_COMPLETED,
|
|
1018
|
+
aiContent: "All set.",
|
|
1019
|
+
});
|
|
1020
|
+
const { container } = render(
|
|
1021
|
+
<MessageThread executions={[done]} activeStreamExecution={null} />,
|
|
1022
|
+
);
|
|
1023
|
+
expect(container.querySelector(LINE)).toBeNull();
|
|
1024
|
+
});
|
|
1025
|
+
|
|
1026
|
+
it("leaves the pre-first-content window to the setup placeholder", () => {
|
|
1027
|
+
const active = makeExecution({
|
|
1028
|
+
id: "exec-fresh",
|
|
1029
|
+
phase: ExecutionPhase.EXECUTION_IN_PROGRESS,
|
|
1030
|
+
});
|
|
1031
|
+
// No AI content, no tool calls: hasStartedResponding is false.
|
|
1032
|
+
active.status!.messages = [active.status!.messages[0]];
|
|
1033
|
+
|
|
1034
|
+
const { container } = render(
|
|
1035
|
+
<MessageThread executions={[]} activeStreamExecution={active} />,
|
|
1036
|
+
);
|
|
1037
|
+
expect(container.querySelector(LINE)).toBeNull();
|
|
1038
|
+
// The synthetic "Thinking…" setup placeholder owns this window.
|
|
1039
|
+
expect(screen.getByText("Thinking\u2026")).toBeTruthy();
|
|
1040
|
+
});
|
|
1041
|
+
|
|
1042
|
+
it("carries the shared shimmer treatment on its label", () => {
|
|
1043
|
+
const active = makeExecution({
|
|
1044
|
+
id: "exec-live",
|
|
1045
|
+
phase: ExecutionPhase.EXECUTION_IN_PROGRESS,
|
|
1046
|
+
aiContent: "Let me look around.",
|
|
1047
|
+
});
|
|
1048
|
+
const { container } = render(
|
|
1049
|
+
<MessageThread executions={[]} activeStreamExecution={active} />,
|
|
1050
|
+
);
|
|
1051
|
+
const line = container.querySelector(LINE)!;
|
|
1052
|
+
expect(line.querySelector(".stgm-shimmer-label")?.textContent).toBe(
|
|
1053
|
+
"Working\u2026",
|
|
1054
|
+
);
|
|
1055
|
+
});
|
|
1056
|
+
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { describe, it, expect, afterEach } from "vitest";
|
|
2
2
|
import { render, screen, cleanup } from "@testing-library/react";
|
|
3
|
-
import { TerminalSession } from "../TerminalSession";
|
|
3
|
+
import { TerminalSession, TerminalTail } from "../TerminalSession";
|
|
4
4
|
import { SandboxContext } from "../SandboxContext";
|
|
5
5
|
|
|
6
6
|
afterEach(cleanup);
|
|
@@ -70,3 +70,73 @@ describe("TerminalSession", () => {
|
|
|
70
70
|
expect(container.textContent).toContain("src/a.ts");
|
|
71
71
|
});
|
|
72
72
|
});
|
|
73
|
+
|
|
74
|
+
describe("TerminalTail", () => {
|
|
75
|
+
it("keeps the command at full contrast and dims the output tail", () => {
|
|
76
|
+
const { container } = render(
|
|
77
|
+
<TerminalTail command="echo hi" stdout="hi" exitCode={0} />,
|
|
78
|
+
);
|
|
79
|
+
const tail = container.querySelector('[data-cursor-target="terminal-tail"]')!;
|
|
80
|
+
expect(tail.textContent).toContain("$ echo hi");
|
|
81
|
+
// Intent keeps reading contrast; the tail is one step below it.
|
|
82
|
+
expect(screen.getByText(/echo hi/).className).toContain("stg:text-foreground");
|
|
83
|
+
expect(screen.getByText("hi").className).toContain("stg:text-muted-foreground");
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("shows only the last lines, with an honest hidden-line count", () => {
|
|
87
|
+
const stdout = ["one", "two", "three", "four", "five"].join("\n");
|
|
88
|
+
const { container } = render(<TerminalTail command="seq 5" stdout={stdout} />);
|
|
89
|
+
const tail = container.querySelector('[data-cursor-target="terminal-tail"]')!;
|
|
90
|
+
expect(tail.textContent).toContain("three");
|
|
91
|
+
expect(tail.textContent).toContain("five");
|
|
92
|
+
expect(tail.textContent).not.toContain("one");
|
|
93
|
+
expect(tail.textContent).toContain("… +2 lines");
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it("omits the hidden-count marker when everything fits", () => {
|
|
97
|
+
const { container } = render(
|
|
98
|
+
<TerminalTail command="pwd" stdout="/work\nok" />,
|
|
99
|
+
);
|
|
100
|
+
expect(container.textContent).not.toContain("+");
|
|
101
|
+
expect(container.textContent).toContain("/work");
|
|
102
|
+
expect(container.textContent).toContain("ok");
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it("appends stderr after stdout in the combined tail", () => {
|
|
106
|
+
const { container } = render(
|
|
107
|
+
<TerminalTail command="build" stdout="step 1\nstep 2" stderr="warning: slow" />,
|
|
108
|
+
);
|
|
109
|
+
const tail = container.querySelector('[data-cursor-target="terminal-tail"]')!;
|
|
110
|
+
// Last three of the combined stream: step 1, step 2, warning.
|
|
111
|
+
expect(tail.textContent).toContain("step 2");
|
|
112
|
+
expect(tail.textContent).toContain("warning: slow");
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it("keeps the exit badge when a failed session is shown collapsed", () => {
|
|
116
|
+
render(<TerminalTail command="false" stdout="boom" exitCode={2} />);
|
|
117
|
+
expect(screen.getByText("exit 2")).toBeTruthy();
|
|
118
|
+
expect(screen.getByText("Command exited with code 2")).toBeTruthy();
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it("ignores a trailing newline when slicing the tail", () => {
|
|
122
|
+
const { container } = render(
|
|
123
|
+
<TerminalTail command="x" stdout={"a\nb\nc\nd\n"} />,
|
|
124
|
+
);
|
|
125
|
+
const tail = container.querySelector('[data-cursor-target="terminal-tail"]')!;
|
|
126
|
+
expect(tail.textContent).toContain("d");
|
|
127
|
+
expect(tail.textContent).toContain("… +1 line");
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it("normalizes absolute sandbox paths like the full session", () => {
|
|
131
|
+
const { container } = render(
|
|
132
|
+
<SandboxContext.Provider value={{ sandboxWorkspaceRoot: "/home/daytona/workspace" }}>
|
|
133
|
+
<TerminalTail
|
|
134
|
+
command="ls /home/daytona/workspace/src"
|
|
135
|
+
stdout="/home/daytona/workspace/src/a.ts"
|
|
136
|
+
/>
|
|
137
|
+
</SandboxContext.Provider>,
|
|
138
|
+
);
|
|
139
|
+
expect(container.textContent).not.toContain("/home/daytona/workspace/");
|
|
140
|
+
expect(container.textContent).toContain("$ ls src");
|
|
141
|
+
});
|
|
142
|
+
});
|
|
@@ -28,7 +28,9 @@ vi.mock("../useFileChangeContent", () => ({
|
|
|
28
28
|
useFileChangeContent: () => mockContent,
|
|
29
29
|
}));
|
|
30
30
|
|
|
31
|
-
const { ToolCallDetail } = await import(
|
|
31
|
+
const { ToolCallDetail, formatDuration, formatHeaderDuration } = await import(
|
|
32
|
+
"../ToolCallDetail"
|
|
33
|
+
);
|
|
32
34
|
const { FileReviewContext } = await import("../FileReviewContext");
|
|
33
35
|
|
|
34
36
|
beforeEach(() => {
|
|
@@ -379,3 +381,33 @@ describe("ToolCallDetail — write body", () => {
|
|
|
379
381
|
expect(container.querySelector(CLAMP)).not.toBeNull();
|
|
380
382
|
});
|
|
381
383
|
});
|
|
384
|
+
|
|
385
|
+
// ---------------------------------------------------------------------------
|
|
386
|
+
// Duration formatting — the exact helper vs the >= 1s header-chip variant
|
|
387
|
+
// ---------------------------------------------------------------------------
|
|
388
|
+
|
|
389
|
+
describe("formatHeaderDuration", () => {
|
|
390
|
+
const T0 = "2026-08-13T10:00:00.000Z";
|
|
391
|
+
const at = (ms: number) => new Date(Date.parse(T0) + ms).toISOString();
|
|
392
|
+
|
|
393
|
+
it("suppresses sub-second durations that formatDuration would render", () => {
|
|
394
|
+
// The exact helper keeps its public contract...
|
|
395
|
+
expect(formatDuration(T0, at(400))).toBe("400ms");
|
|
396
|
+
// ...while the header-chip variant treats the same span as noise.
|
|
397
|
+
expect(formatHeaderDuration(T0, at(400))).toBeNull();
|
|
398
|
+
});
|
|
399
|
+
|
|
400
|
+
it("passes through everything from one second up, exactly as formatDuration renders it", () => {
|
|
401
|
+
const cases = [1000, 2500, 61_000, 180_000];
|
|
402
|
+
for (const ms of cases) {
|
|
403
|
+
expect(formatHeaderDuration(T0, at(ms))).toBe(formatDuration(T0, at(ms)));
|
|
404
|
+
expect(formatHeaderDuration(T0, at(ms))).not.toBeNull();
|
|
405
|
+
}
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
it("stays null for missing or invalid timestamps, like the exact helper", () => {
|
|
409
|
+
expect(formatHeaderDuration("", at(400))).toBeNull();
|
|
410
|
+
expect(formatHeaderDuration(T0, "")).toBeNull();
|
|
411
|
+
expect(formatHeaderDuration("not-a-date", at(2000))).toBeNull();
|
|
412
|
+
});
|
|
413
|
+
});
|
|
@@ -37,6 +37,8 @@ function makeToolCall(opts: {
|
|
|
37
37
|
mcpServerSlug?: string;
|
|
38
38
|
status?: ToolCallStatus;
|
|
39
39
|
fileChangeSetId?: string;
|
|
40
|
+
startedAt?: string;
|
|
41
|
+
completedAt?: string;
|
|
40
42
|
}): ToolCall {
|
|
41
43
|
return create(ToolCallSchema, {
|
|
42
44
|
id: opts.id ?? opts.name,
|
|
@@ -46,6 +48,8 @@ function makeToolCall(opts: {
|
|
|
46
48
|
mcpServerSlug: opts.mcpServerSlug ?? "",
|
|
47
49
|
status: opts.status ?? ToolCallStatus.TOOL_CALL_COMPLETED,
|
|
48
50
|
fileChangeSetId: opts.fileChangeSetId ?? "",
|
|
51
|
+
startedAt: opts.startedAt ?? "",
|
|
52
|
+
completedAt: opts.completedAt ?? "",
|
|
49
53
|
});
|
|
50
54
|
}
|
|
51
55
|
|
|
@@ -190,10 +194,10 @@ describe("ToolCallItem disclosure", () => {
|
|
|
190
194
|
expect(container.querySelector("table")).not.toBeNull();
|
|
191
195
|
});
|
|
192
196
|
|
|
193
|
-
it("
|
|
194
|
-
// Shell is
|
|
195
|
-
//
|
|
196
|
-
//
|
|
197
|
+
it("settles a successful shell into a collapsed dimmed tail behind a chevron", () => {
|
|
198
|
+
// Shell is the `tail` category: a settled success collapses to the
|
|
199
|
+
// TerminalTail teaser — the `$ command` line plus the last output lines at
|
|
200
|
+
// reduced contrast — with the header chevron as the expand control.
|
|
197
201
|
const { container } = render(
|
|
198
202
|
<ToolCallItem
|
|
199
203
|
toolCall={makeToolCall({
|
|
@@ -203,13 +207,17 @@ describe("ToolCallItem disclosure", () => {
|
|
|
203
207
|
})}
|
|
204
208
|
/>,
|
|
205
209
|
);
|
|
206
|
-
expect(hasHeaderChevron(container)).toBe(
|
|
207
|
-
expect(
|
|
210
|
+
expect(hasHeaderChevron(container)).toBe(true);
|
|
211
|
+
expect(isExpanded(container)).toBe(false);
|
|
212
|
+
expect(
|
|
213
|
+
container.querySelector('[data-cursor-target="terminal-tail"]'),
|
|
214
|
+
).not.toBeNull();
|
|
215
|
+
expect(
|
|
216
|
+
container.querySelector('[data-cursor-target="terminal-session"]'),
|
|
217
|
+
).toBeNull();
|
|
218
|
+
// The teaser still carries the evidence: intent and last output.
|
|
208
219
|
expect(container.textContent).toContain("$ echo hello");
|
|
209
220
|
expect(screen.getByText("hello")).toBeTruthy();
|
|
210
|
-
expect(
|
|
211
|
-
container.querySelectorAll('[data-cursor-target="terminal-session"]'),
|
|
212
|
-
).toHaveLength(1);
|
|
213
221
|
});
|
|
214
222
|
|
|
215
223
|
it("renders a settled MCP tool's result inline with no chevron", () => {
|
|
@@ -248,7 +256,10 @@ describe("ToolCallItem disclosure", () => {
|
|
|
248
256
|
expect(container.textContent).toContain("exit 2");
|
|
249
257
|
});
|
|
250
258
|
|
|
251
|
-
it("
|
|
259
|
+
it("streams a running shell's full session in view (force-open, collapsible)", () => {
|
|
260
|
+
// The auto-open-while-running behaviour is untouched by the tail settle:
|
|
261
|
+
// an active command shows its output streaming. The chevron is present —
|
|
262
|
+
// a user may collapse a noisy long-running command, and their choice wins.
|
|
252
263
|
const { container } = render(
|
|
253
264
|
<ToolCallItem
|
|
254
265
|
toolCall={makeToolCall({
|
|
@@ -259,12 +270,105 @@ describe("ToolCallItem disclosure", () => {
|
|
|
259
270
|
})}
|
|
260
271
|
/>,
|
|
261
272
|
);
|
|
262
|
-
expect(hasHeaderChevron(container)).toBe(
|
|
273
|
+
expect(hasHeaderChevron(container)).toBe(true);
|
|
274
|
+
expect(isExpanded(container)).toBe(true);
|
|
263
275
|
expect(
|
|
264
276
|
container.querySelectorAll('[data-cursor-target="terminal-session"]'),
|
|
265
277
|
).toHaveLength(1);
|
|
266
278
|
});
|
|
267
279
|
|
|
280
|
+
// --- Tail settle lifecycle (issue #275) ------------------------------------
|
|
281
|
+
|
|
282
|
+
it("collapses a running shell to the dimmed tail the moment it succeeds", () => {
|
|
283
|
+
const running = makeToolCall({
|
|
284
|
+
id: "tc-sh",
|
|
285
|
+
name: "Shell",
|
|
286
|
+
args: { command: "make build" },
|
|
287
|
+
result: "compiling…",
|
|
288
|
+
status: ToolCallStatus.TOOL_CALL_RUNNING,
|
|
289
|
+
});
|
|
290
|
+
const { container, rerender } = render(<ToolCallItem toolCall={running} />);
|
|
291
|
+
expect(isExpanded(container)).toBe(true);
|
|
292
|
+
|
|
293
|
+
rerender(
|
|
294
|
+
<ToolCallItem
|
|
295
|
+
toolCall={makeToolCall({
|
|
296
|
+
id: "tc-sh",
|
|
297
|
+
name: "Shell",
|
|
298
|
+
args: { command: "make build" },
|
|
299
|
+
result: "compiling…\nBUILD OK",
|
|
300
|
+
status: ToolCallStatus.TOOL_CALL_COMPLETED,
|
|
301
|
+
})}
|
|
302
|
+
/>,
|
|
303
|
+
);
|
|
304
|
+
expect(isExpanded(container)).toBe(false);
|
|
305
|
+
expect(
|
|
306
|
+
container.querySelector('[data-cursor-target="terminal-tail"]'),
|
|
307
|
+
).not.toBeNull();
|
|
308
|
+
expect(container.textContent).toContain("BUILD OK");
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
it("keeps a failed shell open — error output is content, not context", () => {
|
|
312
|
+
// A non-zero exit means the output is what the user needs next; the row
|
|
313
|
+
// must never settle into the dimmed teaser. The exit marker in the result
|
|
314
|
+
// string is the failure signal (status stays COMPLETED on the wire).
|
|
315
|
+
const { container } = render(
|
|
316
|
+
<ToolCallItem
|
|
317
|
+
toolCall={makeToolCall({
|
|
318
|
+
name: "Shell",
|
|
319
|
+
args: { command: "make build" },
|
|
320
|
+
result: "error: no rule\n[Command failed with exit code 2]",
|
|
321
|
+
})}
|
|
322
|
+
/>,
|
|
323
|
+
);
|
|
324
|
+
expect(hasHeaderChevron(container)).toBe(true);
|
|
325
|
+
expect(isExpanded(container)).toBe(true);
|
|
326
|
+
expect(
|
|
327
|
+
container.querySelector('[data-cursor-target="terminal-session"]'),
|
|
328
|
+
).not.toBeNull();
|
|
329
|
+
expect(container.textContent).toContain("exit 2");
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
it("keeps only the last lines in the collapsed tail, with an honest hidden-count", () => {
|
|
333
|
+
const output = ["one", "two", "three", "four", "five"].join("\n");
|
|
334
|
+
const { container } = render(
|
|
335
|
+
<ToolCallItem
|
|
336
|
+
toolCall={makeToolCall({
|
|
337
|
+
name: "Shell",
|
|
338
|
+
args: { command: "seq 5" },
|
|
339
|
+
result: output,
|
|
340
|
+
})}
|
|
341
|
+
/>,
|
|
342
|
+
);
|
|
343
|
+
const tail = container.querySelector('[data-cursor-target="terminal-tail"]')!;
|
|
344
|
+
expect(tail.textContent).toContain("five");
|
|
345
|
+
expect(tail.textContent).toContain("three");
|
|
346
|
+
expect(tail.textContent).not.toContain("one");
|
|
347
|
+
expect(tail.textContent).toContain("+2 lines");
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
it("expands a collapsed tail to the full session on click, and the choice sticks", () => {
|
|
351
|
+
const settled = makeToolCall({
|
|
352
|
+
id: "tc-sh2",
|
|
353
|
+
name: "Shell",
|
|
354
|
+
args: { command: "echo hi" },
|
|
355
|
+
result: "hi",
|
|
356
|
+
});
|
|
357
|
+
const { container, rerender } = render(<ToolCallItem toolCall={settled} />);
|
|
358
|
+
expect(isExpanded(container)).toBe(false);
|
|
359
|
+
|
|
360
|
+
fireEvent.click(rowHeaderToggle(container)!);
|
|
361
|
+
expect(isExpanded(container)).toBe(true);
|
|
362
|
+
expect(
|
|
363
|
+
container.querySelector('[data-cursor-target="terminal-session"]'),
|
|
364
|
+
).not.toBeNull();
|
|
365
|
+
|
|
366
|
+
// A stream frame re-rendering the same settled call never recollapses a
|
|
367
|
+
// row the user opened (useAutoDisclosure: the manual toggle wins).
|
|
368
|
+
rerender(<ToolCallItem toolCall={settled} />);
|
|
369
|
+
expect(isExpanded(container)).toBe(true);
|
|
370
|
+
});
|
|
371
|
+
|
|
268
372
|
it("suppresses the body for a content-bearing tool that produced nothing", () => {
|
|
269
373
|
// The regression guard: a preview-category tool whose result normalizes to
|
|
270
374
|
// `empty` (no output) must stay a clean one-line row, never an empty padded
|
|
@@ -473,6 +577,190 @@ describe("ToolCallItem disclosure", () => {
|
|
|
473
577
|
});
|
|
474
578
|
});
|
|
475
579
|
|
|
580
|
+
// ---------------------------------------------------------------------------
|
|
581
|
+
// Density tier — quiet unboxed lines for metadata-only rows (stigmer#274)
|
|
582
|
+
// ---------------------------------------------------------------------------
|
|
583
|
+
|
|
584
|
+
function rowRoot(container: HTMLElement): HTMLElement {
|
|
585
|
+
return container.querySelector('[data-cursor-target="tool-call-row"]')!;
|
|
586
|
+
}
|
|
587
|
+
function isQuietLine(container: HTMLElement): boolean {
|
|
588
|
+
const cls = rowRoot(container).className;
|
|
589
|
+
return !cls.includes("stg:rounded-lg") && !cls.includes("stg:border-b");
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
describe("ToolCallItem density tier", () => {
|
|
593
|
+
it("renders metadata-only rows as quiet unboxed lines (read / list / search / think)", () => {
|
|
594
|
+
const cases: ToolCall[] = [
|
|
595
|
+
makeToolCall({ name: "Read", args: { path: "/a.ts" } }),
|
|
596
|
+
makeToolCall({ name: "ls", args: { path: "/src" } }),
|
|
597
|
+
makeToolCall({ name: "Grep", args: { pattern: "foo" }, result: "2 matches" }),
|
|
598
|
+
makeToolCall({ name: "think", args: { thought: "considering options" } }),
|
|
599
|
+
];
|
|
600
|
+
for (const tc of cases) {
|
|
601
|
+
const { container, unmount } = render(<ToolCallItem toolCall={tc} />);
|
|
602
|
+
expect(isQuietLine(container), `${tc.name} should be a quiet line`).toBe(true);
|
|
603
|
+
unmount();
|
|
604
|
+
}
|
|
605
|
+
});
|
|
606
|
+
|
|
607
|
+
it("keeps content-bearing rows as cards (shell / edit)", () => {
|
|
608
|
+
const cases: ToolCall[] = [
|
|
609
|
+
makeToolCall({ name: "Shell", args: { command: "echo hi" }, result: "hi" }),
|
|
610
|
+
makeToolCall({
|
|
611
|
+
name: "StrReplace",
|
|
612
|
+
args: { path: "/a.ts", old_string: "a", new_string: "b" },
|
|
613
|
+
}),
|
|
614
|
+
];
|
|
615
|
+
for (const tc of cases) {
|
|
616
|
+
const { container, unmount } = render(<ToolCallItem toolCall={tc} />);
|
|
617
|
+
expect(rowRoot(container).className, `${tc.name} should stay a card`).toContain(
|
|
618
|
+
"stg:border-border-prominent",
|
|
619
|
+
);
|
|
620
|
+
unmount();
|
|
621
|
+
}
|
|
622
|
+
});
|
|
623
|
+
|
|
624
|
+
it("escalates a quiet row to a card when it fails — error output is content", () => {
|
|
625
|
+
const failed = makeToolCall({
|
|
626
|
+
name: "Read",
|
|
627
|
+
args: { path: "/a.ts" },
|
|
628
|
+
status: ToolCallStatus.TOOL_CALL_FAILED,
|
|
629
|
+
result: '{"status":"error","message":"permission denied"}',
|
|
630
|
+
});
|
|
631
|
+
const { container } = render(<ToolCallItem toolCall={failed} />);
|
|
632
|
+
expect(rowRoot(container).className).toContain("stg:border-border-prominent");
|
|
633
|
+
});
|
|
634
|
+
|
|
635
|
+
it("escalates a quiet row to a card while gated — a decision surface is never frameless", () => {
|
|
636
|
+
const gated = makeToolCall({
|
|
637
|
+
id: "tc-read-gated",
|
|
638
|
+
name: "Read",
|
|
639
|
+
args: { path: "/secret" },
|
|
640
|
+
status: ToolCallStatus.TOOL_CALL_WAITING_APPROVAL,
|
|
641
|
+
});
|
|
642
|
+
const approval: PendingApproval = create(PendingApprovalSchema, {
|
|
643
|
+
toolCallId: "tc-read-gated",
|
|
644
|
+
toolName: "Read",
|
|
645
|
+
argsPreview: '{"path":"/secret"}',
|
|
646
|
+
});
|
|
647
|
+
const ctx: ApprovalContextValue = {
|
|
648
|
+
approvalsByToolCallId: new Map([["tc-read-gated", approval]]),
|
|
649
|
+
onSubmit: () => {},
|
|
650
|
+
submittingIds: new Set(),
|
|
651
|
+
errorsByToolCallId: new Map(),
|
|
652
|
+
};
|
|
653
|
+
const { container } = render(
|
|
654
|
+
<ApprovalContext.Provider value={ctx}>
|
|
655
|
+
<ToolCallItem toolCall={gated} />
|
|
656
|
+
</ApprovalContext.Provider>,
|
|
657
|
+
);
|
|
658
|
+
const cls = rowRoot(container).className;
|
|
659
|
+
expect(cls).toContain("stg:border-border-prominent");
|
|
660
|
+
expect(cls).toContain("stg:border-l-warning");
|
|
661
|
+
});
|
|
662
|
+
|
|
663
|
+
it("stays a quiet line while running — the in-flight state rides the label, not a frame", () => {
|
|
664
|
+
const running = makeToolCall({
|
|
665
|
+
name: "Read",
|
|
666
|
+
args: { path: "/a.ts" },
|
|
667
|
+
status: ToolCallStatus.TOOL_CALL_RUNNING,
|
|
668
|
+
});
|
|
669
|
+
const { container } = render(<ToolCallItem toolCall={running} />);
|
|
670
|
+
expect(isQuietLine(container)).toBe(true);
|
|
671
|
+
expect(container.querySelector(".stg\\:animate-spin")).not.toBeNull();
|
|
672
|
+
});
|
|
673
|
+
|
|
674
|
+
it("sweeps the running label with the ambient-liveness shimmer, settled labels stay static", () => {
|
|
675
|
+
const running = makeToolCall({
|
|
676
|
+
name: "Shell",
|
|
677
|
+
args: { command: "sleep 5" },
|
|
678
|
+
status: ToolCallStatus.TOOL_CALL_RUNNING,
|
|
679
|
+
});
|
|
680
|
+
const { container, rerender } = render(<ToolCallItem toolCall={running} />);
|
|
681
|
+
expect(container.querySelector(".stgm-shimmer-label")?.textContent).toBe("Shell");
|
|
682
|
+
|
|
683
|
+
const settled = makeToolCall({
|
|
684
|
+
name: "Shell",
|
|
685
|
+
args: { command: "sleep 5" },
|
|
686
|
+
result: "done",
|
|
687
|
+
});
|
|
688
|
+
rerender(<ToolCallItem toolCall={settled} />);
|
|
689
|
+
expect(container.querySelector(".stgm-shimmer-label")).toBeNull();
|
|
690
|
+
});
|
|
691
|
+
|
|
692
|
+
it("contains a quiet row's disclosed body under a left rail instead of a border", () => {
|
|
693
|
+
// Grep is a summary category with a real result body: expanding the quiet
|
|
694
|
+
// line must bound the body with the rail (the ThinkingMessage precedent),
|
|
695
|
+
// never leave it bleeding into the thread.
|
|
696
|
+
const tc = makeToolCall({
|
|
697
|
+
name: "Grep",
|
|
698
|
+
args: { pattern: "foo" },
|
|
699
|
+
result: "src/a.ts:1: foo",
|
|
700
|
+
});
|
|
701
|
+
const { container } = render(<ToolCallItem toolCall={tc} />);
|
|
702
|
+
fireEvent.click(rowHeaderToggle(container)!);
|
|
703
|
+
expect(container.querySelector(".stg\\:border-l-2")).not.toBeNull();
|
|
704
|
+
});
|
|
705
|
+
});
|
|
706
|
+
|
|
707
|
+
// ---------------------------------------------------------------------------
|
|
708
|
+
// Status vocabulary — success is silent, everything visible carries signal
|
|
709
|
+
// ---------------------------------------------------------------------------
|
|
710
|
+
|
|
711
|
+
describe("ToolCallItem status vocabulary", () => {
|
|
712
|
+
it("renders no status icon on a completed row — success is the silent default", () => {
|
|
713
|
+
const { container } = render(
|
|
714
|
+
<ToolCallItem
|
|
715
|
+
toolCall={makeToolCall({ name: "Shell", args: { command: "echo hi" }, result: "hi" })}
|
|
716
|
+
/>,
|
|
717
|
+
);
|
|
718
|
+
expect(container.querySelector(".stg\\:text-success")).toBeNull();
|
|
719
|
+
});
|
|
720
|
+
|
|
721
|
+
it("keeps the failed icon — failure shouts", () => {
|
|
722
|
+
const { container } = render(
|
|
723
|
+
<ToolCallItem
|
|
724
|
+
toolCall={makeToolCall({
|
|
725
|
+
name: "Shell",
|
|
726
|
+
args: { command: "false" },
|
|
727
|
+
status: ToolCallStatus.TOOL_CALL_FAILED,
|
|
728
|
+
})}
|
|
729
|
+
/>,
|
|
730
|
+
);
|
|
731
|
+
expect(container.querySelector(".stg\\:text-destructive")).not.toBeNull();
|
|
732
|
+
});
|
|
733
|
+
});
|
|
734
|
+
|
|
735
|
+
// ---------------------------------------------------------------------------
|
|
736
|
+
// Duration chips — shown only when they carry information (>= 1s)
|
|
737
|
+
// ---------------------------------------------------------------------------
|
|
738
|
+
|
|
739
|
+
describe("ToolCallItem duration chip", () => {
|
|
740
|
+
it("suppresses a sub-second duration — the chip would be noise", () => {
|
|
741
|
+
const tc = makeToolCall({
|
|
742
|
+
name: "Read",
|
|
743
|
+
args: { path: "/a.ts" },
|
|
744
|
+
startedAt: "2026-08-13T10:00:00.000Z",
|
|
745
|
+
completedAt: "2026-08-13T10:00:00.400Z",
|
|
746
|
+
});
|
|
747
|
+
render(<ToolCallItem toolCall={tc} />);
|
|
748
|
+
expect(screen.queryByText("400ms")).toBeNull();
|
|
749
|
+
});
|
|
750
|
+
|
|
751
|
+
it("shows a duration of a second or more — it carries information", () => {
|
|
752
|
+
const tc = makeToolCall({
|
|
753
|
+
name: "Shell",
|
|
754
|
+
args: { command: "sleep 2" },
|
|
755
|
+
result: "",
|
|
756
|
+
startedAt: "2026-08-13T10:00:00.000Z",
|
|
757
|
+
completedAt: "2026-08-13T10:00:02.500Z",
|
|
758
|
+
});
|
|
759
|
+
render(<ToolCallItem toolCall={tc} />);
|
|
760
|
+
expect(screen.getByText("2.5s")).toBeTruthy();
|
|
761
|
+
});
|
|
762
|
+
});
|
|
763
|
+
|
|
476
764
|
// ---------------------------------------------------------------------------
|
|
477
765
|
// File-review badge — a stamped edit row's live review state
|
|
478
766
|
// ---------------------------------------------------------------------------
|
|
@@ -90,9 +90,12 @@ describe("ToolRunGroup", () => {
|
|
|
90
90
|
);
|
|
91
91
|
expect(container.querySelector(".stg\\:animate-spin")).toBeNull();
|
|
92
92
|
expect(chipExpanded(container)).toBe(false);
|
|
93
|
-
// The aggregate resolves to the terminal branch
|
|
94
|
-
//
|
|
95
|
-
|
|
93
|
+
// The aggregate resolves to the terminal branch — which is silent
|
|
94
|
+
// (completed renders NO status icon, stigmer#274) — not the non-terminal
|
|
95
|
+
// pending fallback, which renders its muted dot as a third header svg
|
|
96
|
+
// beside the category icon and chevron.
|
|
97
|
+
const headerSvgs = container.querySelectorAll("button svg");
|
|
98
|
+
expect(headerSvgs.length).toBe(2);
|
|
96
99
|
expect(screen.getByText("Read 2 files")).toBeTruthy();
|
|
97
100
|
});
|
|
98
101
|
|
|
@@ -121,7 +124,7 @@ describe("ToolRunGroup", () => {
|
|
|
121
124
|
expect(screen.getByLabelText("Approve")).toBeTruthy();
|
|
122
125
|
});
|
|
123
126
|
|
|
124
|
-
it("is a
|
|
127
|
+
it("is a quiet unboxed line whose expanded children sit under a left rail as divider rows", () => {
|
|
125
128
|
const { container } = render(
|
|
126
129
|
<ToolRunGroup
|
|
127
130
|
category="read"
|
|
@@ -129,15 +132,20 @@ describe("ToolRunGroup", () => {
|
|
|
129
132
|
/>,
|
|
130
133
|
);
|
|
131
134
|
|
|
135
|
+
// Quiet chrome (stigmer#274): the fold is metadata-only by construction,
|
|
136
|
+
// so the chip must never render as a bordered card shouting over the
|
|
137
|
+
// conversation. Class presence only — actual rendering is guarded by the
|
|
138
|
+
// layer-invariant + e2e computed-style tests (happy-dom does not resolve
|
|
139
|
+
// `@layer`).
|
|
132
140
|
const chip = container.querySelector('[data-cursor-target="tool-run-group"]')!;
|
|
133
|
-
expect(chip.className).toContain("stg:rounded-lg");
|
|
134
|
-
|
|
135
|
-
// e2e computed-style tests (happy-dom does not resolve `@layer`).
|
|
136
|
-
expect(chip.className).toContain("stg:border-border-prominent");
|
|
141
|
+
expect(chip.className).not.toContain("stg:rounded-lg");
|
|
142
|
+
expect(chip.className).not.toContain("stg:border-border-prominent");
|
|
137
143
|
|
|
138
144
|
fireEvent.click(screen.getByText("Read 2 files"));
|
|
139
145
|
|
|
140
|
-
//
|
|
146
|
+
// With no card frame, the rail container owns the boundary; child rows
|
|
147
|
+
// are dividers, never nested cards.
|
|
148
|
+
expect(container.querySelector(".stg\\:border-l-2")).not.toBeNull();
|
|
141
149
|
const rows = container.querySelectorAll('[data-cursor-target="tool-call-row"]');
|
|
142
150
|
expect(rows.length).toBe(2);
|
|
143
151
|
for (const row of rows) {
|
|
@@ -146,6 +154,30 @@ describe("ToolRunGroup", () => {
|
|
|
146
154
|
}
|
|
147
155
|
});
|
|
148
156
|
|
|
157
|
+
it("renders no status icon once the run settles successfully — success is silent", () => {
|
|
158
|
+
const { container } = render(
|
|
159
|
+
<ToolRunGroup
|
|
160
|
+
category="read"
|
|
161
|
+
toolCalls={[makeRead("r1", "/a.ts"), makeRead("r2", "/b.ts")]}
|
|
162
|
+
/>,
|
|
163
|
+
);
|
|
164
|
+
// Header svgs: the category icon and the chevron — no green check.
|
|
165
|
+
expect(container.querySelectorAll("button svg").length).toBe(2);
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it("keeps the failed icon when a folded call failed — failure shouts", () => {
|
|
169
|
+
const { container } = render(
|
|
170
|
+
<ToolRunGroup
|
|
171
|
+
category="read"
|
|
172
|
+
toolCalls={[
|
|
173
|
+
makeRead("r1", "/a.ts"),
|
|
174
|
+
makeRead("r2", "/b.ts", ToolCallStatus.TOOL_CALL_FAILED),
|
|
175
|
+
]}
|
|
176
|
+
/>,
|
|
177
|
+
);
|
|
178
|
+
expect(container.querySelector(".stg\\:text-destructive")).not.toBeNull();
|
|
179
|
+
});
|
|
180
|
+
|
|
149
181
|
it("honours a custom label formatter", () => {
|
|
150
182
|
render(
|
|
151
183
|
<ToolRunGroup
|