@stigmer/react 3.12.1 → 3.12.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/access/ManageAccessDialog.d.ts.map +1 -1
- package/access/ManageAccessDialog.js +8 -19
- package/access/ManageAccessDialog.js.map +1 -1
- package/activity/format-relative-time.d.ts +11 -9
- package/activity/format-relative-time.d.ts.map +1 -1
- package/activity/format-relative-time.js +11 -9
- package/activity/format-relative-time.js.map +1 -1
- package/agent/steps/CapabilitiesStep.js +5 -2
- package/agent/steps/CapabilitiesStep.js.map +1 -1
- package/agent/steps/IdentityStep.d.ts.map +1 -1
- package/agent/steps/IdentityStep.js +6 -5
- package/agent/steps/IdentityStep.js.map +1 -1
- package/agent-instance/CreateAgentInstanceDialog.d.ts.map +1 -1
- package/agent-instance/CreateAgentInstanceDialog.js +15 -20
- package/agent-instance/CreateAgentInstanceDialog.js.map +1 -1
- package/api-key/ApiKeyCreatedAlert.d.ts.map +1 -1
- package/api-key/ApiKeyCreatedAlert.js +12 -20
- package/api-key/ApiKeyCreatedAlert.js.map +1 -1
- package/api-key/ApiKeyListPanel.d.ts.map +1 -1
- package/api-key/ApiKeyListPanel.js +3 -23
- package/api-key/ApiKeyListPanel.js.map +1 -1
- package/api-key/CreateApiKeyForm.d.ts.map +1 -1
- package/api-key/CreateApiKeyForm.js +6 -10
- package/api-key/CreateApiKeyForm.js.map +1 -1
- package/approval-defaults-context.d.ts +47 -0
- package/approval-defaults-context.d.ts.map +1 -0
- package/approval-defaults-context.js +27 -0
- package/approval-defaults-context.js.map +1 -0
- package/attachment/AttachmentImageLightbox.d.ts.map +1 -1
- package/attachment/AttachmentImageLightbox.js +8 -23
- package/attachment/AttachmentImageLightbox.js.map +1 -1
- package/attachment/index.d.ts +2 -0
- package/attachment/index.d.ts.map +1 -1
- package/attachment/index.js +1 -0
- package/attachment/index.js.map +1 -1
- package/attachment/vision-preflight.d.ts +113 -0
- package/attachment/vision-preflight.d.ts.map +1 -0
- package/attachment/vision-preflight.js +143 -0
- package/attachment/vision-preflight.js.map +1 -0
- package/billing/AutoRechargeCard.d.ts.map +1 -1
- package/billing/AutoRechargeCard.js +3 -2
- package/billing/AutoRechargeCard.js.map +1 -1
- package/billing/BillingSection.d.ts.map +1 -1
- package/billing/BillingSection.js +3 -2
- package/billing/BillingSection.js.map +1 -1
- package/channel/ChannelConversationsDialog.d.ts.map +1 -1
- package/channel/ChannelConversationsDialog.js +6 -21
- package/channel/ChannelConversationsDialog.js.map +1 -1
- package/channel/ChannelCredentialsDialog.d.ts.map +1 -1
- package/channel/ChannelCredentialsDialog.js +10 -21
- package/channel/ChannelCredentialsDialog.js.map +1 -1
- package/channel/ChannelTemplatesDialog.d.ts.map +1 -1
- package/channel/ChannelTemplatesDialog.js +7 -22
- package/channel/ChannelTemplatesDialog.js.map +1 -1
- package/channel/ConnectSlackDialog.d.ts.map +1 -1
- package/channel/ConnectSlackDialog.js +10 -23
- package/channel/ConnectSlackDialog.js.map +1 -1
- package/channel/ConnectWhatsAppDialog.d.ts.map +1 -1
- package/channel/ConnectWhatsAppDialog.js +10 -23
- package/channel/ConnectWhatsAppDialog.js.map +1 -1
- package/channel/useChannelSessions.d.ts.map +1 -1
- package/channel/useChannelSessions.js.map +1 -1
- package/channel-app/ChannelAppDetailPanel.d.ts.map +1 -1
- package/channel-app/ChannelAppDetailPanel.js +8 -5
- package/channel-app/ChannelAppDetailPanel.js.map +1 -1
- package/channel-app/CreateChannelAppForm.d.ts.map +1 -1
- package/channel-app/CreateChannelAppForm.js +12 -7
- package/channel-app/CreateChannelAppForm.js.map +1 -1
- package/channel-app/internal.d.ts +0 -1
- package/channel-app/internal.d.ts.map +1 -1
- package/channel-app/internal.js +5 -10
- package/channel-app/internal.js.map +1 -1
- package/composer/ComposerToolbar.js +2 -1
- package/composer/ComposerToolbar.js.map +1 -1
- package/composer/SessionComposer.d.ts +1 -1
- package/composer/SessionComposer.d.ts.map +1 -1
- package/composer/SessionComposer.js +120 -13
- package/composer/SessionComposer.js.map +1 -1
- package/composer/icons.d.ts +0 -1
- package/composer/icons.d.ts.map +1 -1
- package/composer/icons.js +0 -3
- package/composer/icons.js.map +1 -1
- package/conversation/ConversationAttentionBanner.d.ts +23 -6
- package/conversation/ConversationAttentionBanner.d.ts.map +1 -1
- package/conversation/ConversationAttentionBanner.js +25 -10
- package/conversation/ConversationAttentionBanner.js.map +1 -1
- package/conversation/ConversationComposer.js +1 -1
- package/conversation/ConversationComposer.js.map +1 -1
- package/conversation/ConversationListPane.d.ts.map +1 -1
- package/conversation/ConversationListPane.js +28 -8
- package/conversation/ConversationListPane.js.map +1 -1
- package/conversation/ConversationsWorkbench.d.ts.map +1 -1
- package/conversation/ConversationsWorkbench.js +1 -1
- package/conversation/ConversationsWorkbench.js.map +1 -1
- package/cursor-accounts/MemberCoverageTable.js +3 -14
- package/cursor-accounts/MemberCoverageTable.js.map +1 -1
- package/dashboard/DashboardFailedRuns.d.ts.map +1 -1
- package/dashboard/DashboardFailedRuns.js +2 -14
- package/dashboard/DashboardFailedRuns.js.map +1 -1
- package/environment/CreateEnvironmentForm.d.ts.map +1 -1
- package/environment/CreateEnvironmentForm.js +4 -8
- package/environment/CreateEnvironmentForm.js.map +1 -1
- package/environment/EnvVarForm.d.ts.map +1 -1
- package/environment/EnvVarForm.js +2 -4
- package/environment/EnvVarForm.js.map +1 -1
- package/environment/EnvironmentVariableEditor.d.ts.map +1 -1
- package/environment/EnvironmentVariableEditor.js +5 -7
- package/environment/EnvironmentVariableEditor.js.map +1 -1
- package/execution/ApprovalCard.d.ts.map +1 -1
- package/execution/ApprovalCard.js +13 -3
- package/execution/ApprovalCard.js.map +1 -1
- package/execution/ArtifactApplyButton.d.ts.map +1 -1
- package/execution/ArtifactApplyButton.js +2 -4
- package/execution/ArtifactApplyButton.js.map +1 -1
- package/execution/ArtifactPreviewModal.d.ts.map +1 -1
- package/execution/ArtifactPreviewModal.js +11 -17
- package/execution/ArtifactPreviewModal.js.map +1 -1
- package/execution/ExecutionErrorNotice.d.ts +36 -0
- package/execution/ExecutionErrorNotice.d.ts.map +1 -0
- package/execution/ExecutionErrorNotice.js +39 -0
- package/execution/ExecutionErrorNotice.js.map +1 -0
- package/execution/FilePathLink.d.ts.map +1 -1
- package/execution/FilePathLink.js +5 -8
- package/execution/FilePathLink.js.map +1 -1
- package/execution/FileReviewCard.d.ts.map +1 -1
- package/execution/FileReviewCard.js +1 -6
- package/execution/FileReviewCard.js.map +1 -1
- package/execution/FollowUpInput.d.ts.map +1 -1
- package/execution/FollowUpInput.js +1 -3
- package/execution/FollowUpInput.js.map +1 -1
- package/execution/LivenessStatusLine.d.ts +40 -0
- package/execution/LivenessStatusLine.d.ts.map +1 -0
- package/execution/LivenessStatusLine.js +34 -0
- package/execution/LivenessStatusLine.js.map +1 -0
- package/execution/MessageEntry.d.ts.map +1 -1
- package/execution/MessageEntry.js +31 -3
- package/execution/MessageEntry.js.map +1 -1
- package/execution/MessageThread.d.ts +25 -0
- package/execution/MessageThread.d.ts.map +1 -1
- package/execution/MessageThread.js +51 -36
- package/execution/MessageThread.js.map +1 -1
- package/execution/SetupProgress.d.ts.map +1 -1
- package/execution/SetupProgress.js +1 -1
- package/execution/SetupProgress.js.map +1 -1
- package/execution/SubAgentSection.d.ts.map +1 -1
- package/execution/SubAgentSection.js +9 -7
- package/execution/SubAgentSection.js.map +1 -1
- package/execution/TerminalSession.d.ts +30 -0
- package/execution/TerminalSession.d.ts.map +1 -1
- package/execution/TerminalSession.js +37 -1
- package/execution/TerminalSession.js.map +1 -1
- package/execution/ToolCallDetail.d.ts +9 -0
- package/execution/ToolCallDetail.d.ts.map +1 -1
- package/execution/ToolCallDetail.js +16 -0
- package/execution/ToolCallDetail.js.map +1 -1
- package/execution/ToolCallItem.d.ts +23 -7
- package/execution/ToolCallItem.d.ts.map +1 -1
- package/execution/ToolCallItem.js +120 -35
- package/execution/ToolCallItem.js.map +1 -1
- package/execution/ToolRunGroup.d.ts.map +1 -1
- package/execution/ToolRunGroup.js +11 -11
- package/execution/ToolRunGroup.js.map +1 -1
- package/execution/WriteBackCard.d.ts.map +1 -1
- package/execution/WriteBackCard.js +5 -20
- package/execution/WriteBackCard.js.map +1 -1
- package/execution/index.d.ts +7 -3
- package/execution/index.d.ts.map +1 -1
- package/execution/index.js +4 -2
- package/execution/index.js.map +1 -1
- package/execution/tool-categories.d.ts +93 -7
- package/execution/tool-categories.d.ts.map +1 -1
- package/execution/tool-categories.js +141 -5
- package/execution/tool-categories.js.map +1 -1
- package/execution/tool-presenter.d.ts +32 -1
- package/execution/tool-presenter.d.ts.map +1 -1
- package/execution/tool-presenter.js +10 -2
- package/execution/tool-presenter.js.map +1 -1
- package/execution/useArtifactInspection.d.ts.map +1 -1
- package/execution/useArtifactInspection.js +4 -7
- package/execution/useArtifactInspection.js.map +1 -1
- package/iam-policy/GrantAccessForm.d.ts.map +1 -1
- package/iam-policy/GrantAccessForm.js +2 -4
- package/iam-policy/GrantAccessForm.js.map +1 -1
- package/iam-policy/OrgMembersPanel.d.ts.map +1 -1
- package/iam-policy/OrgMembersPanel.js +3 -5
- package/iam-policy/OrgMembersPanel.js.map +1 -1
- package/iam-policy/RoleSelector.d.ts.map +1 -1
- package/iam-policy/RoleSelector.js +7 -1
- package/iam-policy/RoleSelector.js.map +1 -1
- package/identity-provider/CreateIdentityProviderForm.d.ts.map +1 -1
- package/identity-provider/CreateIdentityProviderForm.js +6 -9
- package/identity-provider/CreateIdentityProviderForm.js.map +1 -1
- package/identity-provider/IdentityProviderDetailPanel.d.ts.map +1 -1
- package/identity-provider/IdentityProviderDetailPanel.js +17 -26
- package/identity-provider/IdentityProviderDetailPanel.js.map +1 -1
- package/identity-provider/IdentityProviderListPanel.d.ts.map +1 -1
- package/identity-provider/IdentityProviderListPanel.js +2 -4
- package/identity-provider/IdentityProviderListPanel.js.map +1 -1
- package/identity-provider/IdentityProviderWizard.d.ts.map +1 -1
- package/identity-provider/IdentityProviderWizard.js +8 -7
- package/identity-provider/IdentityProviderWizard.js.map +1 -1
- package/identity-provider/SsoLoginPrompt.js +5 -6
- package/identity-provider/SsoLoginPrompt.js.map +1 -1
- package/index.d.ts +9 -8
- package/index.d.ts.map +1 -1
- package/index.js +4 -4
- package/index.js.map +1 -1
- package/internal/DecisionButton.d.ts.map +1 -1
- package/internal/DecisionButton.js +1 -6
- package/internal/DecisionButton.js.map +1 -1
- package/internal/DialogShell.d.ts +77 -0
- package/internal/DialogShell.d.ts.map +1 -0
- package/internal/DialogShell.js +77 -0
- package/internal/DialogShell.js.map +1 -0
- package/internal/SpinnerIcon.d.ts +22 -0
- package/internal/SpinnerIcon.d.ts.map +1 -0
- package/internal/SpinnerIcon.js +23 -0
- package/internal/SpinnerIcon.js.map +1 -0
- package/internal/select-element-text.d.ts +11 -0
- package/internal/select-element-text.d.ts.map +1 -0
- package/internal/select-element-text.js +19 -0
- package/internal/select-element-text.js.map +1 -0
- package/internal/thread-card/ThreadCardShell.d.ts +27 -10
- package/internal/thread-card/ThreadCardShell.d.ts.map +1 -1
- package/internal/thread-card/ThreadCardShell.js +11 -5
- package/internal/thread-card/ThreadCardShell.js.map +1 -1
- package/internal/thread-card/glyphs.d.ts +11 -2
- package/internal/thread-card/glyphs.d.ts.map +1 -1
- package/internal/thread-card/glyphs.js +9 -3
- package/internal/thread-card/glyphs.js.map +1 -1
- package/internal/thread-card/index.d.ts +1 -1
- package/internal/thread-card/index.d.ts.map +1 -1
- package/internal/thread-card/index.js.map +1 -1
- package/internal/useCopyFeedback.d.ts +28 -0
- package/internal/useCopyFeedback.d.ts.map +1 -0
- package/internal/useCopyFeedback.js +40 -0
- package/internal/useCopyFeedback.js.map +1 -0
- package/invitation/InvitationCreatedAlert.d.ts.map +1 -1
- package/invitation/InvitationCreatedAlert.js +12 -19
- package/invitation/InvitationCreatedAlert.js.map +1 -1
- package/invitation/InvitationManager.d.ts.map +1 -1
- package/invitation/InvitationManager.js +14 -21
- package/invitation/InvitationManager.js.map +1 -1
- package/invitation/InvitationRedemption.d.ts.map +1 -1
- package/invitation/InvitationRedemption.js +2 -4
- package/invitation/InvitationRedemption.js.map +1 -1
- package/library/useExportResource.d.ts.map +1 -1
- package/library/useExportResource.js +16 -27
- package/library/useExportResource.js.map +1 -1
- package/manifest/ApplyManifestDialog.d.ts.map +1 -1
- package/manifest/ApplyManifestDialog.js +7 -17
- package/manifest/ApplyManifestDialog.js.map +1 -1
- package/manifest/EditResourceYamlDialog.d.ts.map +1 -1
- package/manifest/EditResourceYamlDialog.js +3 -19
- package/manifest/EditResourceYamlDialog.js.map +1 -1
- package/mcp-server/DefinitionDriftNotice.d.ts +42 -0
- package/mcp-server/DefinitionDriftNotice.d.ts.map +1 -0
- package/mcp-server/DefinitionDriftNotice.js +52 -0
- package/mcp-server/DefinitionDriftNotice.js.map +1 -0
- package/mcp-server/McpServerConnectDialog.d.ts.map +1 -1
- package/mcp-server/McpServerConnectDialog.js +8 -20
- package/mcp-server/McpServerConnectDialog.js.map +1 -1
- package/mcp-server/McpServerDetailView.d.ts.map +1 -1
- package/mcp-server/McpServerDetailView.js +50 -28
- package/mcp-server/McpServerDetailView.js.map +1 -1
- package/mcp-server/OAuthAppForm.d.ts.map +1 -1
- package/mcp-server/OAuthAppForm.js +2 -4
- package/mcp-server/OAuthAppForm.js.map +1 -1
- package/mcp-server/internal/definitionDrift.d.ts +39 -0
- package/mcp-server/internal/definitionDrift.d.ts.map +1 -0
- package/mcp-server/internal/definitionDrift.js +122 -0
- package/mcp-server/internal/definitionDrift.js.map +1 -0
- package/mcp-server/internal/mcpServerToInput.d.ts.map +1 -1
- package/mcp-server/internal/mcpServerToInput.js +3 -0
- package/mcp-server/internal/mcpServerToInput.js.map +1 -1
- package/mcp-server/steps/EnvironmentAuthStep.d.ts.map +1 -1
- package/mcp-server/steps/EnvironmentAuthStep.js +8 -4
- package/mcp-server/steps/EnvironmentAuthStep.js.map +1 -1
- package/mcp-server/steps/IdentityTransportStep.d.ts.map +1 -1
- package/mcp-server/steps/IdentityTransportStep.js +5 -4
- package/mcp-server/steps/IdentityTransportStep.js.map +1 -1
- package/mcp-server/useMcpServerConnect.d.ts +1 -1
- package/mcp-server/useMcpServerDefinitionDrift.d.ts +44 -0
- package/mcp-server/useMcpServerDefinitionDrift.d.ts.map +1 -0
- package/mcp-server/useMcpServerDefinitionDrift.js +61 -0
- package/mcp-server/useMcpServerDefinitionDrift.js.map +1 -0
- package/models/ModelRegistryContext.d.ts +7 -1
- package/models/ModelRegistryContext.d.ts.map +1 -1
- package/models/ModelRegistryContext.js.map +1 -1
- package/models/ModelSelector.js +9 -1
- package/models/ModelSelector.js.map +1 -1
- package/models/index.d.ts +2 -2
- package/models/index.d.ts.map +1 -1
- package/models/index.js +1 -1
- package/models/index.js.map +1 -1
- package/models/registry.d.ts +88 -6
- package/models/registry.d.ts.map +1 -1
- package/models/registry.js +133 -27
- package/models/registry.js.map +1 -1
- package/models/useModelRegistry.d.ts +7 -1
- package/models/useModelRegistry.d.ts.map +1 -1
- package/models/useModelRegistry.js +3 -2
- package/models/useModelRegistry.js.map +1 -1
- package/oauth-app/CreateOAuthAppForm.d.ts.map +1 -1
- package/oauth-app/CreateOAuthAppForm.js +4 -5
- package/oauth-app/CreateOAuthAppForm.js.map +1 -1
- package/oauth-app/OAuthAppDetailPanel.d.ts.map +1 -1
- package/oauth-app/OAuthAppDetailPanel.js +5 -6
- package/oauth-app/OAuthAppDetailPanel.js.map +1 -1
- package/organization/CreateOrganizationForm.d.ts.map +1 -1
- package/organization/CreateOrganizationForm.js +5 -9
- package/organization/CreateOrganizationForm.js.map +1 -1
- package/organization/OrgProfilePanel.d.ts.map +1 -1
- package/organization/OrgProfilePanel.js +7 -16
- package/organization/OrgProfilePanel.js.map +1 -1
- package/package.json +4 -4
- package/platform-client/CreatePlatformClientForm.d.ts.map +1 -1
- package/platform-client/CreatePlatformClientForm.js +5 -6
- package/platform-client/CreatePlatformClientForm.js.map +1 -1
- package/platform-client/PlatformClientDetailPanel.d.ts.map +1 -1
- package/platform-client/PlatformClientDetailPanel.js +6 -7
- package/platform-client/PlatformClientDetailPanel.js.map +1 -1
- package/platform-client/PlatformClientListPanel.d.ts.map +1 -1
- package/platform-client/PlatformClientListPanel.js +2 -4
- package/platform-client/PlatformClientListPanel.js.map +1 -1
- package/platform-client/PlatformClientSecretAlert.d.ts.map +1 -1
- package/platform-client/PlatformClientSecretAlert.js +18 -25
- package/platform-client/PlatformClientSecretAlert.js.map +1 -1
- package/provider.d.ts +34 -1
- package/provider.d.ts.map +1 -1
- package/provider.js +14 -7
- package/provider.js.map +1 -1
- package/resource-creation/WizardNav.d.ts.map +1 -1
- package/resource-creation/WizardNav.js +2 -4
- package/resource-creation/WizardNav.js.map +1 -1
- package/resource-detail/ConfirmDialog.d.ts +2 -3
- package/resource-detail/ConfirmDialog.d.ts.map +1 -1
- package/resource-detail/ConfirmDialog.js +8 -20
- package/resource-detail/ConfirmDialog.js.map +1 -1
- package/resource-detail/useCopyResource.d.ts +4 -3
- package/resource-detail/useCopyResource.d.ts.map +1 -1
- package/resource-detail/useCopyResource.js +10 -19
- package/resource-detail/useCopyResource.js.map +1 -1
- package/schedule/ScheduleDetailView.d.ts.map +1 -1
- package/schedule/ScheduleDetailView.js +2 -4
- package/schedule/ScheduleDetailView.js.map +1 -1
- package/schedule/ScheduleForm.d.ts.map +1 -1
- package/schedule/ScheduleForm.js +6 -7
- package/schedule/ScheduleForm.js.map +1 -1
- package/session/NewSessionViewer.d.ts +52 -2
- package/session/NewSessionViewer.d.ts.map +1 -1
- package/session/NewSessionViewer.js +21 -6
- package/session/NewSessionViewer.js.map +1 -1
- package/session/SessionViewer.d.ts +63 -2
- package/session/SessionViewer.d.ts.map +1 -1
- package/session/SessionViewer.js +43 -17
- package/session/SessionViewer.js.map +1 -1
- package/session/audience.d.ts +17 -0
- package/session/audience.d.ts.map +1 -1
- package/session/index.d.ts +2 -1
- package/session/index.d.ts.map +1 -1
- package/session/index.js.map +1 -1
- package/session/run-config.d.ts +50 -0
- package/session/run-config.d.ts.map +1 -0
- package/session/run-config.js +15 -0
- package/session/run-config.js.map +1 -0
- package/session/useNewSessionFlow.d.ts +11 -0
- package/session/useNewSessionFlow.d.ts.map +1 -1
- package/session/useNewSessionFlow.js +29 -2
- package/session/useNewSessionFlow.js.map +1 -1
- package/session/useSessionConversation.d.ts +7 -7
- package/session/useSessionConversation.d.ts.map +1 -1
- package/session/useSessionConversation.js +2 -0
- package/session/useSessionConversation.js.map +1 -1
- package/session/useSessionPageFlow.d.ts +18 -4
- package/session/useSessionPageFlow.d.ts.map +1 -1
- package/session/useSessionPageFlow.js +33 -6
- package/session/useSessionPageFlow.js.map +1 -1
- package/session/useSessionPanel.d.ts +37 -2
- package/session/useSessionPanel.d.ts.map +1 -1
- package/session/useSessionPanel.js +44 -10
- package/session/useSessionPanel.js.map +1 -1
- package/settings/ApiKeysSection.d.ts.map +1 -1
- package/settings/ApiKeysSection.js +3 -2
- package/settings/ApiKeysSection.js.map +1 -1
- package/settings/ChannelAppsSection.d.ts.map +1 -1
- package/settings/ChannelAppsSection.js +3 -2
- package/settings/ChannelAppsSection.js.map +1 -1
- package/settings/EnvironmentsSection.js +5 -3
- package/settings/EnvironmentsSection.js.map +1 -1
- package/settings/IdentityProvidersSection.d.ts.map +1 -1
- package/settings/IdentityProvidersSection.js +3 -2
- package/settings/IdentityProvidersSection.js.map +1 -1
- package/settings/InvitationsSection.d.ts.map +1 -1
- package/settings/InvitationsSection.js +3 -1
- package/settings/InvitationsSection.js.map +1 -1
- package/settings/MembersSection.d.ts.map +1 -1
- package/settings/MembersSection.js +3 -1
- package/settings/MembersSection.js.map +1 -1
- package/settings/OAuthAppsSection.d.ts.map +1 -1
- package/settings/OAuthAppsSection.js +3 -2
- package/settings/OAuthAppsSection.js.map +1 -1
- package/settings/OrgProfileSection.d.ts.map +1 -1
- package/settings/OrgProfileSection.js +3 -2
- package/settings/OrgProfileSection.js.map +1 -1
- package/settings/PlatformClientsSection.d.ts.map +1 -1
- package/settings/PlatformClientsSection.js +3 -2
- package/settings/PlatformClientsSection.js.map +1 -1
- package/settings/UsageSection.d.ts.map +1 -1
- package/settings/UsageSection.js +3 -1
- package/settings/UsageSection.js.map +1 -1
- package/sharing/ShareAgentDialog.d.ts.map +1 -1
- package/sharing/ShareAgentDialog.js +19 -26
- package/sharing/ShareAgentDialog.js.map +1 -1
- package/sidebar/chrome.d.ts +3 -4
- package/sidebar/chrome.d.ts.map +1 -1
- package/sidebar/chrome.js +5 -4
- package/sidebar/chrome.js.map +1 -1
- package/skill/SkillDiffDialog.d.ts.map +1 -1
- package/skill/SkillDiffDialog.js +5 -21
- package/skill/SkillDiffDialog.js.map +1 -1
- package/src/access/ManageAccessDialog.tsx +14 -28
- package/src/activity/format-relative-time.ts +11 -9
- package/src/agent/steps/CapabilitiesStep.tsx +6 -3
- package/src/agent/steps/IdentityStep.tsx +19 -12
- package/src/agent-instance/CreateAgentInstanceDialog.tsx +29 -33
- package/src/api-key/ApiKeyCreatedAlert.tsx +10 -19
- package/src/api-key/ApiKeyListPanel.tsx +3 -39
- package/src/api-key/CreateApiKeyForm.tsx +12 -26
- package/src/approval-defaults-context.ts +56 -0
- package/src/attachment/AttachmentImageLightbox.tsx +13 -36
- package/src/attachment/__tests__/vision-preflight.test.ts +311 -0
- package/src/attachment/index.ts +12 -0
- package/src/attachment/vision-preflight.ts +236 -0
- package/src/billing/AutoRechargeCard.tsx +5 -4
- package/src/billing/BillingSection.tsx +4 -3
- package/src/channel/ChannelConversationsDialog.tsx +14 -29
- package/src/channel/ChannelCredentialsDialog.tsx +19 -29
- package/src/channel/ChannelTemplatesDialog.tsx +16 -31
- package/src/channel/ConnectSlackDialog.tsx +19 -31
- package/src/channel/ConnectWhatsAppDialog.tsx +19 -31
- package/src/channel/useChannelSessions.ts +3 -0
- package/src/channel-app/ChannelAppDetailPanel.tsx +15 -12
- package/src/channel-app/CreateChannelAppForm.tsx +17 -12
- package/src/channel-app/internal.tsx +5 -25
- package/src/composer/ComposerToolbar.tsx +1 -1
- package/src/composer/SessionComposer.tsx +160 -13
- package/src/composer/__tests__/SessionComposer-modelCoherence.test.tsx +220 -0
- package/src/composer/__tests__/SessionComposer-visionPreflight.test.tsx +222 -0
- package/src/composer/icons.tsx +0 -18
- package/src/conversation/ConversationAttentionBanner.tsx +64 -19
- package/src/conversation/ConversationComposer.tsx +1 -1
- package/src/conversation/ConversationListPane.tsx +46 -20
- package/src/conversation/ConversationsWorkbench.tsx +1 -0
- package/src/conversation/__tests__/ConversationAttentionBanner.test.tsx +76 -2
- package/src/conversation/__tests__/ConversationListPane.test.tsx +15 -4
- package/src/cursor-accounts/MemberCoverageTable.tsx +3 -14
- package/src/cursor-accounts/__tests__/CursorAccountsConsole.test.tsx +2 -10
- package/src/dashboard/DashboardFailedRuns.tsx +2 -12
- package/src/environment/CreateEnvironmentForm.tsx +8 -27
- package/src/environment/EnvVarForm.tsx +2 -18
- package/src/environment/EnvironmentVariableEditor.tsx +5 -21
- package/src/execution/ApprovalCard.tsx +23 -2
- package/src/execution/ArtifactApplyButton.tsx +2 -17
- package/src/execution/ArtifactPreviewModal.tsx +15 -27
- package/src/execution/ExecutionErrorNotice.tsx +99 -0
- package/src/execution/FilePathLink.tsx +5 -9
- package/src/execution/FileReviewCard.tsx +1 -20
- package/src/execution/FollowUpInput.tsx +1 -16
- package/src/execution/LivenessStatusLine.tsx +59 -0
- package/src/execution/MessageEntry.tsx +136 -25
- package/src/execution/MessageThread.tsx +84 -83
- package/src/execution/SetupProgress.tsx +5 -1
- package/src/execution/SubAgentSection.tsx +9 -20
- package/src/execution/TerminalSession.tsx +97 -10
- package/src/execution/ToolCallDetail.tsx +19 -0
- package/src/execution/ToolCallItem.tsx +175 -44
- package/src/execution/ToolRunGroup.tsx +30 -32
- package/src/execution/WriteBackCard.tsx +5 -24
- package/src/execution/__tests__/MessageEntry-copy.test.tsx +125 -0
- package/src/execution/__tests__/MessageThread.test.tsx +97 -0
- package/src/execution/__tests__/TerminalSession.test.tsx +71 -1
- package/src/execution/__tests__/ToolCallDetail.test.tsx +33 -1
- package/src/execution/__tests__/ToolCallItem.test.tsx +299 -11
- package/src/execution/__tests__/ToolRunGroup.test.tsx +41 -9
- package/src/execution/__tests__/intent-title.test.tsx +221 -0
- package/src/execution/__tests__/message-thread-slots.test.tsx +92 -0
- package/src/execution/__tests__/tool-presenter.test.tsx +41 -4
- package/src/execution/index.ts +11 -2
- package/src/execution/tool-categories.ts +195 -9
- package/src/execution/tool-presenter.ts +44 -2
- package/src/execution/useArtifactInspection.ts +4 -8
- package/src/iam-policy/GrantAccessForm.tsx +2 -18
- package/src/iam-policy/OrgMembersPanel.tsx +3 -19
- package/src/iam-policy/RoleSelector.tsx +8 -1
- package/src/identity-provider/CreateIdentityProviderForm.tsx +13 -31
- package/src/identity-provider/IdentityProviderDetailPanel.tsx +24 -49
- package/src/identity-provider/IdentityProviderListPanel.tsx +2 -18
- package/src/identity-provider/IdentityProviderWizard.tsx +15 -32
- package/src/identity-provider/SsoLoginPrompt.tsx +6 -21
- package/src/index.ts +26 -1
- package/src/internal/DecisionButton.tsx +1 -20
- package/src/internal/DialogShell.tsx +169 -0
- package/src/internal/SpinnerIcon.tsx +42 -0
- package/src/internal/__tests__/DialogShell.test.tsx +223 -0
- package/src/internal/__tests__/ThreadCardShell.test.tsx +43 -7
- package/src/internal/__tests__/useCopyFeedback.test.ts +92 -0
- package/src/internal/select-element-text.ts +17 -0
- package/src/internal/thread-card/ThreadCardShell.tsx +53 -21
- package/src/internal/thread-card/glyphs.tsx +24 -3
- package/src/internal/thread-card/index.ts +1 -0
- package/src/internal/useCopyFeedback.ts +61 -0
- package/src/invitation/InvitationCreatedAlert.tsx +10 -18
- package/src/invitation/InvitationManager.tsx +23 -34
- package/src/invitation/InvitationRedemption.tsx +2 -18
- package/src/library/useExportResource.ts +15 -29
- package/src/manifest/ApplyManifestDialog.tsx +8 -26
- package/src/manifest/EditResourceYamlDialog.tsx +4 -31
- package/src/mcp-server/DefinitionDriftNotice.tsx +120 -0
- package/src/mcp-server/McpServerConnectDialog.tsx +15 -29
- package/src/mcp-server/McpServerDetailView.tsx +69 -49
- package/src/mcp-server/OAuthAppForm.tsx +2 -18
- package/src/mcp-server/__tests__/DefinitionDriftNotice.test.tsx +57 -0
- package/src/mcp-server/__tests__/definitionDrift.test.ts +245 -0
- package/src/mcp-server/__tests__/mcpServerToInput.test.ts +201 -0
- package/src/mcp-server/__tests__/useMcpServerDefinitionDrift.test.tsx +173 -0
- package/src/mcp-server/internal/definitionDrift.ts +158 -0
- package/src/mcp-server/internal/mcpServerToInput.ts +3 -0
- package/src/mcp-server/steps/EnvironmentAuthStep.tsx +19 -19
- package/src/mcp-server/steps/IdentityTransportStep.tsx +24 -23
- package/src/mcp-server/useMcpServerConnect.ts +1 -1
- package/src/mcp-server/useMcpServerDefinitionDrift.ts +95 -0
- package/src/models/ModelRegistryContext.ts +7 -1
- package/src/models/ModelSelector.tsx +37 -0
- package/src/models/__tests__/ModelSelector-visionIndicator.test.tsx +129 -0
- package/src/models/__tests__/resolveDefaultModel.test.ts +115 -0
- package/src/models/__tests__/useModelRegistry.test.tsx +99 -4
- package/src/models/index.ts +2 -2
- package/src/models/registry.ts +196 -29
- package/src/models/useModelRegistry.ts +10 -2
- package/src/oauth-app/CreateOAuthAppForm.tsx +16 -31
- package/src/oauth-app/OAuthAppDetailPanel.tsx +16 -31
- package/src/organization/CreateOrganizationForm.tsx +10 -29
- package/src/organization/OrgProfilePanel.tsx +13 -44
- package/src/platform-client/CreatePlatformClientForm.tsx +9 -29
- package/src/platform-client/PlatformClientDetailPanel.tsx +10 -30
- package/src/platform-client/PlatformClientListPanel.tsx +2 -18
- package/src/platform-client/PlatformClientSecretAlert.tsx +26 -55
- package/src/provider.tsx +76 -33
- package/src/resource-creation/WizardNav.tsx +2 -18
- package/src/resource-detail/ConfirmDialog.tsx +9 -30
- package/src/resource-detail/useCopyResource.ts +17 -23
- package/src/schedule/ScheduleDetailView.tsx +2 -18
- package/src/schedule/ScheduleForm.tsx +19 -34
- package/src/session/NewSessionViewer.tsx +85 -7
- package/src/session/SessionViewer.tsx +120 -17
- package/src/session/__tests__/audienceWiring.test.tsx +76 -0
- package/src/session/__tests__/panelNegotiation.test.tsx +302 -0
- package/src/session/__tests__/useNewSessionFlow.test.tsx +134 -5
- package/src/session/__tests__/useSessionPageFlow.autoApprove.test.tsx +74 -0
- package/src/session/__tests__/useSessionPageFlow.runConfig.test.tsx +157 -0
- package/src/session/__tests__/useSessionPanel.test.ts +114 -0
- package/src/session/audience.ts +18 -0
- package/src/session/index.ts +2 -1
- package/src/session/run-config.ts +59 -0
- package/src/session/useNewSessionFlow.ts +39 -2
- package/src/session/useSessionConversation.ts +10 -8
- package/src/session/useSessionPageFlow.ts +51 -10
- package/src/session/useSessionPanel.ts +91 -10
- package/src/settings/ApiKeysSection.tsx +4 -3
- package/src/settings/ChannelAppsSection.tsx +4 -3
- package/src/settings/EnvironmentsSection.tsx +8 -5
- package/src/settings/IdentityProvidersSection.tsx +4 -3
- package/src/settings/InvitationsSection.tsx +4 -2
- package/src/settings/MembersSection.tsx +4 -2
- package/src/settings/OAuthAppsSection.tsx +4 -3
- package/src/settings/OrgProfileSection.tsx +4 -3
- package/src/settings/PlatformClientsSection.tsx +4 -3
- package/src/settings/UsageSection.tsx +4 -2
- package/src/sharing/ShareAgentDialog.tsx +33 -37
- package/src/sidebar/__tests__/WorkspaceSidebar.test.tsx +4 -1
- package/src/sidebar/chrome.tsx +6 -6
- package/src/skill/SkillDiffDialog.tsx +13 -36
- package/src/styles.css +43 -0
- package/src/version-history/VersionTimelineEntry.tsx +1 -21
- package/src/workflow/FailedRunsWidget.tsx +2 -9
- package/src/workflow/PendingApprovalsWidget.tsx +2 -9
- package/src/workflow/ViewYamlDialog.tsx +21 -55
- package/src/workflow/WorkflowArchitectDialog.tsx +17 -68
- package/src/workflow/WorkflowArtifactDocument.tsx +5 -9
- package/src/workflow/WorkflowCanvasEditor.tsx +2 -0
- package/src/workflow/WorkflowCanvasInner.tsx +14 -1
- package/src/workflow/WorkflowDiffGraph.tsx +7 -1
- package/src/workflow/WorkflowExecutionViewer.tsx +88 -11
- package/src/workflow/WorkflowExplainDialog.tsx +18 -60
- package/src/workflow/WorkflowGraphFullscreenDialog.tsx +14 -26
- package/src/workflow/WorkflowOverviewGraph.tsx +9 -1
- package/src/workflow/WorkflowRefinePanel.tsx +2 -18
- package/src/workflow/WorkflowRepairCard.tsx +2 -18
- package/src/workflow/WorkflowRunDialog.tsx +23 -70
- package/src/workflow/WorkflowTaskApprovalSummary.tsx +2 -17
- package/src/workflow/WorkflowVersionBadge.tsx +4 -13
- package/src/workflow/WorkflowVersionTimeline.tsx +1 -25
- package/src/workflow/__tests__/panelNegotiation.test.tsx +230 -0
- package/src/workflow/__tests__/useWorkflowCanvas.dirty.test.tsx +178 -0
- package/src/workflow/__tests__/useWorkflowCanvas.drag.test.tsx +224 -0
- package/src/workflow/__tests__/useWorkflowExecutionPanel.test.ts +100 -0
- package/src/workflow/execution-comparison/ExecutionComparisonPicker.tsx +20 -41
- package/src/workflow/execution-history/ExecutionHistoryTable.tsx +1 -25
- package/src/workflow/index.ts +1 -0
- package/src/workflow/instance/CreateWorkflowInstanceDialog.tsx +14 -27
- package/src/workflow/instance/WorkflowInstanceDetailPanel.tsx +2 -1
- package/src/workflow/picker/BranchAddPopover.tsx +4 -3
- package/src/workflow/templates/WorkflowTemplatePreview.tsx +18 -28
- package/src/workflow/useApprovalBoundary.ts +1 -1
- package/src/workflow/useWorkflowCanvas.ts +114 -11
- package/src/workflow/useWorkflowExecutionPanel.ts +95 -13
- package/styles.css +1 -1
- package/version-history/VersionTimelineEntry.d.ts.map +1 -1
- package/version-history/VersionTimelineEntry.js +1 -23
- package/version-history/VersionTimelineEntry.js.map +1 -1
- package/workflow/CanvasTransitionEdge.d.ts +1 -1
- package/workflow/FailedRunsWidget.d.ts.map +1 -1
- package/workflow/FailedRunsWidget.js +2 -11
- package/workflow/FailedRunsWidget.js.map +1 -1
- package/workflow/PendingApprovalsWidget.d.ts.map +1 -1
- package/workflow/PendingApprovalsWidget.js +2 -11
- package/workflow/PendingApprovalsWidget.js.map +1 -1
- package/workflow/ViewYamlDialog.d.ts.map +1 -1
- package/workflow/ViewYamlDialog.js +14 -49
- package/workflow/ViewYamlDialog.js.map +1 -1
- package/workflow/WorkflowArchitectDialog.d.ts.map +1 -1
- package/workflow/WorkflowArchitectDialog.js +10 -33
- package/workflow/WorkflowArchitectDialog.js.map +1 -1
- package/workflow/WorkflowArtifactDocument.d.ts.map +1 -1
- package/workflow/WorkflowArtifactDocument.js +5 -8
- package/workflow/WorkflowArtifactDocument.js.map +1 -1
- package/workflow/WorkflowCanvasEditor.d.ts.map +1 -1
- package/workflow/WorkflowCanvasEditor.js +1 -1
- package/workflow/WorkflowCanvasEditor.js.map +1 -1
- package/workflow/WorkflowCanvasInner.d.ts +4 -2
- package/workflow/WorkflowCanvasInner.d.ts.map +1 -1
- package/workflow/WorkflowCanvasInner.js +7 -3
- package/workflow/WorkflowCanvasInner.js.map +1 -1
- package/workflow/WorkflowDiffGraph.js +6 -2
- package/workflow/WorkflowDiffGraph.js.map +1 -1
- package/workflow/WorkflowExecutionViewer.d.ts +51 -0
- package/workflow/WorkflowExecutionViewer.d.ts.map +1 -1
- package/workflow/WorkflowExecutionViewer.js +23 -6
- package/workflow/WorkflowExecutionViewer.js.map +1 -1
- package/workflow/WorkflowExplainDialog.d.ts.map +1 -1
- package/workflow/WorkflowExplainDialog.js +10 -28
- package/workflow/WorkflowExplainDialog.js.map +1 -1
- package/workflow/WorkflowGraphFullscreenDialog.d.ts.map +1 -1
- package/workflow/WorkflowGraphFullscreenDialog.js +11 -17
- package/workflow/WorkflowGraphFullscreenDialog.js.map +1 -1
- package/workflow/WorkflowOverviewGraph.js +8 -2
- package/workflow/WorkflowOverviewGraph.js.map +1 -1
- package/workflow/WorkflowRefinePanel.d.ts.map +1 -1
- package/workflow/WorkflowRefinePanel.js +2 -4
- package/workflow/WorkflowRefinePanel.js.map +1 -1
- package/workflow/WorkflowRepairCard.d.ts.map +1 -1
- package/workflow/WorkflowRepairCard.js +2 -4
- package/workflow/WorkflowRepairCard.js.map +1 -1
- package/workflow/WorkflowRunDialog.d.ts.map +1 -1
- package/workflow/WorkflowRunDialog.js +14 -35
- package/workflow/WorkflowRunDialog.js.map +1 -1
- package/workflow/WorkflowTaskApprovalSummary.d.ts.map +1 -1
- package/workflow/WorkflowTaskApprovalSummary.js +2 -4
- package/workflow/WorkflowTaskApprovalSummary.js.map +1 -1
- package/workflow/WorkflowVersionBadge.d.ts.map +1 -1
- package/workflow/WorkflowVersionBadge.js +4 -13
- package/workflow/WorkflowVersionBadge.js.map +1 -1
- package/workflow/WorkflowVersionTimeline.d.ts.map +1 -1
- package/workflow/WorkflowVersionTimeline.js +1 -26
- package/workflow/WorkflowVersionTimeline.js.map +1 -1
- package/workflow/execution-comparison/ExecutionComparisonPicker.d.ts.map +1 -1
- package/workflow/execution-comparison/ExecutionComparisonPicker.js +14 -40
- package/workflow/execution-comparison/ExecutionComparisonPicker.js.map +1 -1
- package/workflow/execution-history/ExecutionHistoryTable.d.ts.map +1 -1
- package/workflow/execution-history/ExecutionHistoryTable.js +1 -24
- package/workflow/execution-history/ExecutionHistoryTable.js.map +1 -1
- package/workflow/index.d.ts +1 -1
- package/workflow/index.d.ts.map +1 -1
- package/workflow/index.js.map +1 -1
- package/workflow/instance/CreateWorkflowInstanceDialog.d.ts.map +1 -1
- package/workflow/instance/CreateWorkflowInstanceDialog.js +7 -20
- package/workflow/instance/CreateWorkflowInstanceDialog.js.map +1 -1
- package/workflow/instance/WorkflowInstanceDetailPanel.d.ts.map +1 -1
- package/workflow/instance/WorkflowInstanceDetailPanel.js +1 -1
- package/workflow/instance/WorkflowInstanceDetailPanel.js.map +1 -1
- package/workflow/picker/BranchAddPopover.d.ts.map +1 -1
- package/workflow/picker/BranchAddPopover.js +3 -2
- package/workflow/picker/BranchAddPopover.js.map +1 -1
- package/workflow/templates/WorkflowTemplatePreview.d.ts +1 -1
- package/workflow/templates/WorkflowTemplatePreview.d.ts.map +1 -1
- package/workflow/templates/WorkflowTemplatePreview.js +10 -22
- package/workflow/templates/WorkflowTemplatePreview.js.map +1 -1
- package/workflow/useApprovalBoundary.d.ts +1 -1
- package/workflow/useApprovalBoundary.js +1 -1
- package/workflow/useWorkflowCanvas.d.ts +5 -1
- package/workflow/useWorkflowCanvas.d.ts.map +1 -1
- package/workflow/useWorkflowCanvas.js +99 -13
- package/workflow/useWorkflowCanvas.js.map +1 -1
- package/workflow/useWorkflowExecutionPanel.d.ts +38 -2
- package/workflow/useWorkflowExecutionPanel.d.ts.map +1 -1
- package/workflow/useWorkflowExecutionPanel.js +46 -13
- package/workflow/useWorkflowExecutionPanel.js.map +1 -1
|
@@ -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
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model-authored intent titles for shell tool calls (stigmer#276).
|
|
3
|
+
*
|
|
4
|
+
* The extraction contract is pinned by the cross-surface fixture
|
|
5
|
+
* test/fixtures/tool-view/intent-title.json — the same file the runner's
|
|
6
|
+
* tool-intent middleware tests assert against, so the wire key and the
|
|
7
|
+
* kind-scoping can never drift between the writer and the readers.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { readFileSync } from "node:fs";
|
|
11
|
+
import { dirname, resolve } from "node:path";
|
|
12
|
+
import { fileURLToPath } from "node:url";
|
|
13
|
+
import { describe, it, expect, afterEach } from "vitest";
|
|
14
|
+
import { render, screen, cleanup } from "@testing-library/react";
|
|
15
|
+
import { renderHook } from "@testing-library/react";
|
|
16
|
+
import { create, type JsonObject } from "@bufbuild/protobuf";
|
|
17
|
+
import {
|
|
18
|
+
ToolCallSchema,
|
|
19
|
+
type ToolCall,
|
|
20
|
+
} from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
|
|
21
|
+
import { PendingApprovalSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/approval_pb";
|
|
22
|
+
import { ToolCallStatus, ToolKind } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
23
|
+
import {
|
|
24
|
+
extractShellIntent,
|
|
25
|
+
extractShellIntentFromPreview,
|
|
26
|
+
SHELL_INTENT_ARG_FIELD,
|
|
27
|
+
} from "../tool-categories";
|
|
28
|
+
import { useToolPresentation, registerToolPresenter } from "../tool-presenter";
|
|
29
|
+
import { ToolCallItem } from "../ToolCallItem";
|
|
30
|
+
import { ApprovalCardHeader } from "../ApprovalCard";
|
|
31
|
+
|
|
32
|
+
afterEach(cleanup);
|
|
33
|
+
|
|
34
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
35
|
+
const fixturePath = resolve(here, "../../../../../test/fixtures/tool-view/intent-title.json");
|
|
36
|
+
|
|
37
|
+
interface IntentFixture {
|
|
38
|
+
argField: string;
|
|
39
|
+
cases: Array<{
|
|
40
|
+
name: string;
|
|
41
|
+
mcpServerSlug: string;
|
|
42
|
+
args: Record<string, unknown>;
|
|
43
|
+
intent: string | null;
|
|
44
|
+
}>;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const fixture = JSON.parse(readFileSync(fixturePath, "utf8")) as IntentFixture;
|
|
48
|
+
|
|
49
|
+
function makeToolCall(opts: {
|
|
50
|
+
name: string;
|
|
51
|
+
args?: Record<string, unknown>;
|
|
52
|
+
mcpServerSlug?: string;
|
|
53
|
+
status?: ToolCallStatus;
|
|
54
|
+
}): ToolCall {
|
|
55
|
+
return create(ToolCallSchema, {
|
|
56
|
+
id: opts.name,
|
|
57
|
+
name: opts.name,
|
|
58
|
+
args: (opts.args ?? {}) as JsonObject,
|
|
59
|
+
mcpServerSlug: opts.mcpServerSlug ?? "",
|
|
60
|
+
status: opts.status ?? ToolCallStatus.TOOL_CALL_COMPLETED,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
describe("intent-title fixture contract", () => {
|
|
65
|
+
it("pins the wire key shared with the runner middleware", () => {
|
|
66
|
+
expect(SHELL_INTENT_ARG_FIELD).toBe(fixture.argField);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it.each(fixture.cases.map((c, i) => [i, c] as const))(
|
|
70
|
+
"case %#: %j",
|
|
71
|
+
(_i, c) => {
|
|
72
|
+
const tc = makeToolCall({
|
|
73
|
+
name: c.name,
|
|
74
|
+
args: c.args,
|
|
75
|
+
mcpServerSlug: c.mcpServerSlug,
|
|
76
|
+
});
|
|
77
|
+
expect(extractShellIntent(tc)).toBe(c.intent);
|
|
78
|
+
},
|
|
79
|
+
);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
describe("extractShellIntentFromPreview", () => {
|
|
83
|
+
it("mirrors the ToolCall extraction on a JSON args preview", () => {
|
|
84
|
+
expect(
|
|
85
|
+
extractShellIntentFromPreview(
|
|
86
|
+
"execute",
|
|
87
|
+
JSON.stringify({ command: "make check", [SHELL_INTENT_ARG_FIELD]: "Verify the build" }),
|
|
88
|
+
),
|
|
89
|
+
).toBe("Verify the build");
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it("prefers the denormalized wire kind over the name", () => {
|
|
93
|
+
// A shell tool whose NAME the classifier does not recognize still
|
|
94
|
+
// resolves via the wire kind — matching extractPrimaryArgFromPreview.
|
|
95
|
+
expect(
|
|
96
|
+
extractShellIntentFromPreview(
|
|
97
|
+
"custom_runner",
|
|
98
|
+
JSON.stringify({ command: "ls", [SHELL_INTENT_ARG_FIELD]: "List files" }),
|
|
99
|
+
"",
|
|
100
|
+
ToolKind.SHELL,
|
|
101
|
+
),
|
|
102
|
+
).toBe("List files");
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it("returns null for malformed previews and non-shell kinds", () => {
|
|
106
|
+
expect(extractShellIntentFromPreview("execute", "not json{")).toBeNull();
|
|
107
|
+
expect(extractShellIntentFromPreview("execute", "")).toBeNull();
|
|
108
|
+
expect(
|
|
109
|
+
extractShellIntentFromPreview(
|
|
110
|
+
"read_file",
|
|
111
|
+
JSON.stringify({ file_path: "a", [SHELL_INTENT_ARG_FIELD]: "x" }),
|
|
112
|
+
),
|
|
113
|
+
).toBeNull();
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
describe("useToolPresentation title precedence", () => {
|
|
118
|
+
it("titles a shell row with the model-authored intent", () => {
|
|
119
|
+
const tc = makeToolCall({
|
|
120
|
+
name: "Shell",
|
|
121
|
+
args: { command: "npm test", [SHELL_INTENT_ARG_FIELD]: "Run the test suite" },
|
|
122
|
+
});
|
|
123
|
+
const { result } = renderHook(() => useToolPresentation(tc));
|
|
124
|
+
|
|
125
|
+
expect(result.current.intent).toBe("Run the test suite");
|
|
126
|
+
expect(result.current.title).toBe("Run the test suite");
|
|
127
|
+
// The short kind label is unchanged — chips and badges keep "Shell".
|
|
128
|
+
expect(result.current.label).toBe("Shell");
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it("falls back to the category label when no intent is present", () => {
|
|
132
|
+
const tc = makeToolCall({ name: "Shell", args: { command: "ls" } });
|
|
133
|
+
const { result } = renderHook(() => useToolPresentation(tc));
|
|
134
|
+
|
|
135
|
+
expect(result.current.intent).toBeNull();
|
|
136
|
+
expect(result.current.title).toBe("Shell");
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it("a registered presenter label override outranks the intent", () => {
|
|
140
|
+
const dispose = registerToolPresenter(ToolKind.SHELL, {
|
|
141
|
+
label: () => "Run command",
|
|
142
|
+
});
|
|
143
|
+
try {
|
|
144
|
+
const tc = makeToolCall({
|
|
145
|
+
name: "Shell",
|
|
146
|
+
args: { command: "ls", [SHELL_INTENT_ARG_FIELD]: "List files" },
|
|
147
|
+
});
|
|
148
|
+
const { result } = renderHook(() => useToolPresentation(tc));
|
|
149
|
+
|
|
150
|
+
expect(result.current.title).toBe("Run command");
|
|
151
|
+
expect(result.current.intent).toBe("List files");
|
|
152
|
+
} finally {
|
|
153
|
+
dispose();
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
describe("ToolCallItem shell header", () => {
|
|
159
|
+
function headerOf(container: HTMLElement): Element {
|
|
160
|
+
const row = container.querySelector('[data-cursor-target="tool-call-row"]')!;
|
|
161
|
+
return row.firstElementChild!;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
it("renders the intent as the title and the command as the subtitle", () => {
|
|
165
|
+
const tc = makeToolCall({
|
|
166
|
+
name: "Shell",
|
|
167
|
+
args: {
|
|
168
|
+
command: "npx vitest run src/parser",
|
|
169
|
+
[SHELL_INTENT_ARG_FIELD]: "Run unit tests for the parser",
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
const { container } = render(<ToolCallItem toolCall={tc} />);
|
|
173
|
+
|
|
174
|
+
const header = headerOf(container);
|
|
175
|
+
expect(header.textContent).toContain("Run unit tests for the parser");
|
|
176
|
+
expect(header.textContent).toContain("npx vitest run src/parser");
|
|
177
|
+
expect(header.textContent).not.toContain("Shell");
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it("renders an intent-less shell row exactly as before: bare label, no subtitle", () => {
|
|
181
|
+
const tc = makeToolCall({
|
|
182
|
+
name: "Shell",
|
|
183
|
+
args: { command: "ls -la" },
|
|
184
|
+
});
|
|
185
|
+
const { container } = render(<ToolCallItem toolCall={tc} />);
|
|
186
|
+
|
|
187
|
+
const header = headerOf(container);
|
|
188
|
+
expect(header.textContent).toContain("Shell");
|
|
189
|
+
// The command lives in the terminal body only — never in the header.
|
|
190
|
+
expect(header.textContent).not.toContain("ls -la");
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
describe("ApprovalCardHeader shell title", () => {
|
|
195
|
+
it("titles a gated shell call with the intent phrase", () => {
|
|
196
|
+
const pending = create(PendingApprovalSchema, {
|
|
197
|
+
toolCallId: "tc-1",
|
|
198
|
+
toolName: "execute",
|
|
199
|
+
toolKind: ToolKind.SHELL,
|
|
200
|
+
argsPreview: JSON.stringify({
|
|
201
|
+
command: "rm -rf build",
|
|
202
|
+
[SHELL_INTENT_ARG_FIELD]: "Clean the build directory",
|
|
203
|
+
}),
|
|
204
|
+
});
|
|
205
|
+
render(<ApprovalCardHeader pendingApproval={pending} />);
|
|
206
|
+
|
|
207
|
+
expect(screen.getByText("Clean the build directory")).toBeDefined();
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it("keeps the bare category label when no intent is present", () => {
|
|
211
|
+
const pending = create(PendingApprovalSchema, {
|
|
212
|
+
toolCallId: "tc-2",
|
|
213
|
+
toolName: "execute",
|
|
214
|
+
toolKind: ToolKind.SHELL,
|
|
215
|
+
argsPreview: JSON.stringify({ command: "rm -rf build" }),
|
|
216
|
+
});
|
|
217
|
+
render(<ApprovalCardHeader pendingApproval={pending} />);
|
|
218
|
+
|
|
219
|
+
expect(screen.getByText("Shell")).toBeDefined();
|
|
220
|
+
});
|
|
221
|
+
});
|