@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
|
@@ -28,9 +28,11 @@ import {
|
|
|
28
28
|
import { MessageThread, type MessageThreadSlots } from "../MessageThread";
|
|
29
29
|
import type { MessageEntryProps } from "../MessageEntry";
|
|
30
30
|
import type { ApprovalCardProps } from "../ApprovalCard";
|
|
31
|
+
import type { ExecutionErrorNoticeProps } from "../ExecutionErrorNotice";
|
|
31
32
|
import type { TodoCardProps } from "../TodoCard";
|
|
32
33
|
import type { TodoRowProps } from "../TodoList";
|
|
33
34
|
import type { SetupProgressProps } from "../SetupProgress";
|
|
35
|
+
import type { LivenessStatusLineProps } from "../LivenessStatusLine";
|
|
34
36
|
import type { PlanCompletionCardProps } from "../PlanCompletionCard";
|
|
35
37
|
import type { PlanArtifactCardProps } from "../PlanArtifactCard";
|
|
36
38
|
import type { PlanStreamingCardProps } from "../PlanStreamingCard";
|
|
@@ -110,6 +112,7 @@ function makeExecution(opts: {
|
|
|
110
112
|
todos?: Record<string, { content: string; status: TodoStatus }>;
|
|
111
113
|
pendingApprovalToolCallId?: string;
|
|
112
114
|
planArtifactName?: string;
|
|
115
|
+
error?: string;
|
|
113
116
|
}): AgentExecution {
|
|
114
117
|
const exec = create(AgentExecutionSchema);
|
|
115
118
|
|
|
@@ -128,6 +131,9 @@ function makeExecution(opts: {
|
|
|
128
131
|
|
|
129
132
|
const status = create(AgentExecutionStatusSchema);
|
|
130
133
|
status.phase = opts.phase ?? ExecutionPhase.EXECUTION_COMPLETED;
|
|
134
|
+
if (opts.error) {
|
|
135
|
+
status.error = opts.error;
|
|
136
|
+
}
|
|
131
137
|
|
|
132
138
|
const aiMsg = create(AgentMessageSchema);
|
|
133
139
|
aiMsg.type = MessageType.MESSAGE_AI;
|
|
@@ -312,6 +318,28 @@ describe("MessageThread slots", () => {
|
|
|
312
318
|
expect(screen.getByTestId("custom-setup").textContent).toBe("waiting");
|
|
313
319
|
});
|
|
314
320
|
|
|
321
|
+
it("renders the LivenessStatusLine slot while the execution is live between events", () => {
|
|
322
|
+
const CustomLiveness = ({ label }: LivenessStatusLineProps) => (
|
|
323
|
+
<div data-testid="custom-liveness">{label ?? "custom-live"}</div>
|
|
324
|
+
);
|
|
325
|
+
|
|
326
|
+
const exec = makeExecution({
|
|
327
|
+
id: "e-live",
|
|
328
|
+
phase: ExecutionPhase.EXECUTION_IN_PROGRESS,
|
|
329
|
+
aiContent: "thinking about it",
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
render(
|
|
333
|
+
<MessageThread
|
|
334
|
+
executions={[]}
|
|
335
|
+
activeStreamExecution={exec}
|
|
336
|
+
slots={{ LivenessStatusLine: CustomLiveness }}
|
|
337
|
+
/>,
|
|
338
|
+
);
|
|
339
|
+
|
|
340
|
+
expect(screen.getByTestId("custom-liveness").textContent).toBe("custom-live");
|
|
341
|
+
});
|
|
342
|
+
|
|
315
343
|
it("renders the PlanCompletionCard slot for an artifact-less completed Plan turn", () => {
|
|
316
344
|
const CustomCompletion = ({ onImplement }: PlanCompletionCardProps) => (
|
|
317
345
|
<button type="button" data-testid="custom-completion" onClick={onImplement}>
|
|
@@ -390,6 +418,70 @@ describe("MessageThread slots", () => {
|
|
|
390
418
|
);
|
|
391
419
|
});
|
|
392
420
|
|
|
421
|
+
it("renders the ExecutionErrorNotice slot with the retry wiring intact", () => {
|
|
422
|
+
const onRetryExecution = vi.fn();
|
|
423
|
+
const CustomNotice = ({ error, retryMessage, onRetry }: ExecutionErrorNoticeProps) => (
|
|
424
|
+
<div data-testid="custom-error-notice">
|
|
425
|
+
<span>{error}</span>
|
|
426
|
+
{onRetry && retryMessage && (
|
|
427
|
+
<button type="button" onClick={() => onRetry(retryMessage)}>
|
|
428
|
+
switch engine and retry
|
|
429
|
+
</button>
|
|
430
|
+
)}
|
|
431
|
+
</div>
|
|
432
|
+
);
|
|
433
|
+
|
|
434
|
+
render(
|
|
435
|
+
<MessageThread
|
|
436
|
+
executions={[
|
|
437
|
+
makeExecution({
|
|
438
|
+
id: "e-failed",
|
|
439
|
+
specMessage: "prompt text",
|
|
440
|
+
phase: ExecutionPhase.EXECUTION_FAILED,
|
|
441
|
+
error: "model capacity exhausted",
|
|
442
|
+
}),
|
|
443
|
+
]}
|
|
444
|
+
onRetryExecution={onRetryExecution}
|
|
445
|
+
slots={{ ExecutionErrorNotice: CustomNotice }}
|
|
446
|
+
/>,
|
|
447
|
+
);
|
|
448
|
+
|
|
449
|
+
const notice = screen.getByTestId("custom-error-notice");
|
|
450
|
+
expect(notice.textContent).toContain("model capacity exhausted");
|
|
451
|
+
// The built-in's clamp toggle must not render alongside the override.
|
|
452
|
+
expect(screen.queryByRole("button", { name: "Show more" })).toBeNull();
|
|
453
|
+
|
|
454
|
+
// The slot's retry contract is identical to the built-in's: it resends
|
|
455
|
+
// the originating message.
|
|
456
|
+
fireEvent.click(screen.getByRole("button", { name: "switch engine and retry" }));
|
|
457
|
+
expect(onRetryExecution).toHaveBeenCalledWith("prompt text");
|
|
458
|
+
});
|
|
459
|
+
|
|
460
|
+
it("falls back to the built-in ExecutionErrorNotice when the slot is omitted", () => {
|
|
461
|
+
const onRetryExecution = vi.fn();
|
|
462
|
+
|
|
463
|
+
render(
|
|
464
|
+
<MessageThread
|
|
465
|
+
executions={[
|
|
466
|
+
makeExecution({
|
|
467
|
+
id: "e-failed",
|
|
468
|
+
specMessage: "prompt text",
|
|
469
|
+
phase: ExecutionPhase.EXECUTION_FAILED,
|
|
470
|
+
error: "model capacity exhausted",
|
|
471
|
+
}),
|
|
472
|
+
]}
|
|
473
|
+
onRetryExecution={onRetryExecution}
|
|
474
|
+
/>,
|
|
475
|
+
);
|
|
476
|
+
|
|
477
|
+
// The built-in renders as a destructive alert with clamp + Retry.
|
|
478
|
+
const alert = screen.getByRole("alert");
|
|
479
|
+
expect(alert.textContent).toContain("model capacity exhausted");
|
|
480
|
+
expect(screen.getByRole("button", { name: "Show more" })).toBeTruthy();
|
|
481
|
+
fireEvent.click(screen.getByRole("button", { name: "Retry" }));
|
|
482
|
+
expect(onRetryExecution).toHaveBeenCalledWith("prompt text");
|
|
483
|
+
});
|
|
484
|
+
|
|
393
485
|
// -------------------------------------------------------------------------
|
|
394
486
|
// Backward compatibility and memo guarantees
|
|
395
487
|
// -------------------------------------------------------------------------
|
|
@@ -78,8 +78,9 @@ describe("useToolPresentation", () => {
|
|
|
78
78
|
|
|
79
79
|
describe("disclosure", () => {
|
|
80
80
|
it("keeps known compact tools as summary", () => {
|
|
81
|
-
// Shell/edit/write are intentionally excluded —
|
|
82
|
-
// categories (output / diff is
|
|
81
|
+
// Shell/edit/write are intentionally excluded — shell is the `tail`
|
|
82
|
+
// category and edit/write are `preview` categories (output / diff is
|
|
83
|
+
// the information), asserted separately below.
|
|
83
84
|
for (const name of ["Read", "Grep", "Glob"]) {
|
|
84
85
|
const tc = makeToolCall({ name, args: { path: "/x", command: "ls", pattern: "p" } });
|
|
85
86
|
const { result } = renderHook(() => useToolPresentation(tc));
|
|
@@ -98,11 +99,25 @@ describe("useToolPresentation", () => {
|
|
|
98
99
|
}
|
|
99
100
|
});
|
|
100
101
|
|
|
101
|
-
it("
|
|
102
|
+
it("gives shell the tail disclosure (live preview, dimmed-tail settle)", () => {
|
|
102
103
|
const tc = makeToolCall({ name: "Shell", args: { command: "ls" }, result: "files" });
|
|
103
104
|
const { result } = renderHook(() => useToolPresentation(tc));
|
|
104
105
|
expect(result.current.category).toBe("shell");
|
|
105
|
-
expect(result.current.disclosure).toBe("
|
|
106
|
+
expect(result.current.disclosure).toBe("tail");
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it("lets a host restore the always-expanded shell preview via the registry", () => {
|
|
110
|
+
// The one-line opt-out for hosts that prefer the pre-tail behaviour.
|
|
111
|
+
const dispose = registerToolPresenter(ToolKind.SHELL, {
|
|
112
|
+
disclosure: () => "preview",
|
|
113
|
+
});
|
|
114
|
+
try {
|
|
115
|
+
const tc = makeToolCall({ name: "Shell", args: { command: "ls" }, result: "files" });
|
|
116
|
+
const { result } = renderHook(() => useToolPresentation(tc));
|
|
117
|
+
expect(result.current.disclosure).toBe("preview");
|
|
118
|
+
} finally {
|
|
119
|
+
dispose();
|
|
120
|
+
}
|
|
106
121
|
});
|
|
107
122
|
|
|
108
123
|
it("foregrounds MCP tools as preview", () => {
|
|
@@ -140,6 +155,28 @@ describe("useToolPresentation", () => {
|
|
|
140
155
|
});
|
|
141
156
|
});
|
|
142
157
|
|
|
158
|
+
describe("chrome", () => {
|
|
159
|
+
it("quiets metadata-only categories and keeps content-bearing ones as cards", () => {
|
|
160
|
+
const quiet = makeToolCall({ name: "Read", args: { path: "/x" } });
|
|
161
|
+
const card = makeToolCall({ name: "Shell", args: { command: "ls" }, result: "files" });
|
|
162
|
+
expect(renderHook(() => useToolPresentation(quiet)).result.current.chrome).toBe("quiet");
|
|
163
|
+
expect(renderHook(() => useToolPresentation(card)).result.current.chrome).toBe("card");
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
it("lets a registered presenter restore the boxed look for a kind", () => {
|
|
167
|
+
const dispose = registerToolPresenter(ToolKind.FILE_READ, {
|
|
168
|
+
chrome: () => "card",
|
|
169
|
+
});
|
|
170
|
+
try {
|
|
171
|
+
const tc = makeToolCall({ name: "Read", args: { path: "/x" } });
|
|
172
|
+
const { result } = renderHook(() => useToolPresentation(tc));
|
|
173
|
+
expect(result.current.chrome).toBe("card");
|
|
174
|
+
} finally {
|
|
175
|
+
dispose();
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
|
|
143
180
|
describe("runGroupable", () => {
|
|
144
181
|
it("folds read-only repetitive categories", () => {
|
|
145
182
|
for (const name of ["Read", "Grep", "Glob"]) {
|
package/src/execution/index.ts
CHANGED
|
@@ -127,6 +127,9 @@ export type { InteractionModeBadgeProps } from "./InteractionModeBadge.js";
|
|
|
127
127
|
export { SetupProgress } from "./SetupProgress.js";
|
|
128
128
|
export type { SetupProgressProps } from "./SetupProgress.js";
|
|
129
129
|
|
|
130
|
+
export { LivenessStatusLine } from "./LivenessStatusLine.js";
|
|
131
|
+
export type { LivenessStatusLineProps } from "./LivenessStatusLine.js";
|
|
132
|
+
|
|
130
133
|
export { ToolCallGroup } from "./ToolCallGroup.js";
|
|
131
134
|
export type { ToolCallGroupProps } from "./ToolCallGroup.js";
|
|
132
135
|
|
|
@@ -154,8 +157,8 @@ export type { ToolArgsViewProps } from "./ToolArgsView.js";
|
|
|
154
157
|
export { ResultView, summarizeResultView } from "./ResultView.js";
|
|
155
158
|
export type { ResultViewProps } from "./ResultView.js";
|
|
156
159
|
|
|
157
|
-
export { TerminalSession } from "./TerminalSession.js";
|
|
158
|
-
export type { TerminalSessionProps } from "./TerminalSession.js";
|
|
160
|
+
export { TerminalSession, TerminalTail } from "./TerminalSession.js";
|
|
161
|
+
export type { TerminalSessionProps, TerminalTailProps } from "./TerminalSession.js";
|
|
159
162
|
|
|
160
163
|
export {
|
|
161
164
|
useToolPresentation,
|
|
@@ -204,6 +207,9 @@ export type {
|
|
|
204
207
|
ThreadContentColumn,
|
|
205
208
|
} from "./MessageThread.js";
|
|
206
209
|
|
|
210
|
+
export { ExecutionErrorNotice } from "./ExecutionErrorNotice.js";
|
|
211
|
+
export type { ExecutionErrorNoticeProps } from "./ExecutionErrorNotice.js";
|
|
212
|
+
|
|
207
213
|
export { ThreadSkeleton } from "./ThreadSkeleton.js";
|
|
208
214
|
export type { ThreadSkeletonProps } from "./ThreadSkeleton.js";
|
|
209
215
|
|
|
@@ -334,6 +340,9 @@ export {
|
|
|
334
340
|
toolKindToCategoryInfo,
|
|
335
341
|
extractPrimaryArg,
|
|
336
342
|
extractPrimaryArgFromPreview,
|
|
343
|
+
extractShellIntent,
|
|
344
|
+
extractShellIntentFromPreview,
|
|
345
|
+
SHELL_INTENT_ARG_FIELD,
|
|
337
346
|
humanizeToolName,
|
|
338
347
|
defaultDisclosureForCategory,
|
|
339
348
|
isRunGroupableCategory,
|
|
@@ -36,16 +36,67 @@ export type ToolCategory =
|
|
|
36
36
|
* `Search … 2 matches`). The full detail is one click away.
|
|
37
37
|
* - `"preview"` — the row renders its result body **always** (no card chevron),
|
|
38
38
|
* because the one-liner cannot convey what happened so the content itself IS
|
|
39
|
-
* the information (
|
|
40
|
-
*
|
|
41
|
-
*
|
|
39
|
+
* the information (an MCP result such as a screenshot, a fetched page, a
|
|
40
|
+
* web-search answer, or an unrecognised tool's output). The body's own
|
|
41
|
+
* in-place reveal expands it beyond the height budget.
|
|
42
|
+
* - `"tail"` — live like `"preview"`, settled like a teaser: while the tool
|
|
43
|
+
* runs (or awaits approval) the full body streams in view; once it settles
|
|
44
|
+
* successfully the row collapses to a dimmed tail of its last output lines —
|
|
45
|
+
* at-a-glance evidence that it ran and what it printed last — expanding on
|
|
46
|
+
* demand via the header chevron. A settled *failure* stays open: error
|
|
47
|
+
* output is content, not context. Shell is the canonical tail category — a
|
|
48
|
+
* working session's compile/validate loops would otherwise dominate the
|
|
49
|
+
* transcript at full contrast (Cursor's chat is the reference UX).
|
|
42
50
|
*
|
|
43
51
|
* This is the *disclosure* axis (how much of a result to show); it is
|
|
44
52
|
* orthogonal to {@link isRunGroupableCategory} (whether consecutive same-kind
|
|
45
53
|
* calls fold into one chip). A category can be result-rich but never folded
|
|
46
54
|
* (`shell`), or foldable but never previewed (`read`).
|
|
47
55
|
*/
|
|
48
|
-
export type ToolDisclosure = "summary" | "preview";
|
|
56
|
+
export type ToolDisclosure = "summary" | "preview" | "tail";
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* How much *chrome* a tool row carries in the thread — the density axis,
|
|
60
|
+
* orthogonal to {@link ToolDisclosure} (how much of the result to show).
|
|
61
|
+
*
|
|
62
|
+
* - `"card"` — a self-contained bordered card. For content-bearing rows
|
|
63
|
+
* (shell, edit, fetch, MCP), where the body is real evidence worth a frame.
|
|
64
|
+
* - `"quiet"` — an unboxed single text line, no border, no card. For
|
|
65
|
+
* metadata-only rows (read / list / search / think) whose label + argument
|
|
66
|
+
* already tell the whole story: a 4 ms directory listing must not shout as
|
|
67
|
+
* loudly as a 3-minute shell run (Cursor's chat is the reference UX — prose
|
|
68
|
+
* with quiet evidence attached, not a stack of equally-loud widgets).
|
|
69
|
+
*
|
|
70
|
+
* This is the *settled default*. A row escalates to `"card"` regardless of
|
|
71
|
+
* category while it carries something the quiet line cannot: a pending
|
|
72
|
+
* approval gate (a decision surface) or a failure (error output is content).
|
|
73
|
+
* That escalation is owned by the component layer and is deliberately not
|
|
74
|
+
* override-able — a gate must never render without its frame.
|
|
75
|
+
*/
|
|
76
|
+
export type ToolChrome = "card" | "quiet";
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Categories whose settled summary row IS the complete information, rendered
|
|
80
|
+
* as quiet unboxed lines by default. Mirrors {@link RUN_GROUPABLE_CATEGORIES}
|
|
81
|
+
* plus `think` (a thought's row reads like narration, not evidence) — the
|
|
82
|
+
* same low-signal set, on the chrome axis instead of the folding axis.
|
|
83
|
+
*/
|
|
84
|
+
const QUIET_CATEGORIES: ReadonlySet<ToolCategory> = new Set<ToolCategory>([
|
|
85
|
+
"read",
|
|
86
|
+
"list",
|
|
87
|
+
"search",
|
|
88
|
+
"think",
|
|
89
|
+
]);
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Returns the default {@link ToolChrome} for a presentation category.
|
|
93
|
+
* Consumers can override per {@link ToolKind} via {@link registerToolPresenter}
|
|
94
|
+
* (`chrome: () => "card"` to restore the boxed look for a kind), exactly like
|
|
95
|
+
* the disclosure axis.
|
|
96
|
+
*/
|
|
97
|
+
export function defaultChromeForCategory(category: ToolCategory): ToolChrome {
|
|
98
|
+
return QUIET_CATEGORIES.has(category) ? "quiet" : "card";
|
|
99
|
+
}
|
|
49
100
|
|
|
50
101
|
/**
|
|
51
102
|
* Categories whose result is foregrounded as a persistent bounded preview by
|
|
@@ -60,7 +111,6 @@ export type ToolDisclosure = "summary" | "preview";
|
|
|
60
111
|
* under control even in turns with many edits.
|
|
61
112
|
*/
|
|
62
113
|
const PREVIEW_CATEGORIES: ReadonlySet<ToolCategory> = new Set<ToolCategory>([
|
|
63
|
-
"shell",
|
|
64
114
|
"edit",
|
|
65
115
|
"write",
|
|
66
116
|
"mcp",
|
|
@@ -69,6 +119,18 @@ const PREVIEW_CATEGORIES: ReadonlySet<ToolCategory> = new Set<ToolCategory>([
|
|
|
69
119
|
"unknown",
|
|
70
120
|
]);
|
|
71
121
|
|
|
122
|
+
/**
|
|
123
|
+
* Categories that stream in full while live but settle to a dimmed tail of
|
|
124
|
+
* their last output lines (see the `"tail"` arm of {@link ToolDisclosure}).
|
|
125
|
+
* Today that is shell alone: its output is evidence worth keeping at a
|
|
126
|
+
* glance, but rarely worth reading line by line once the command succeeded.
|
|
127
|
+
* Consumers can restore the always-expanded preview per kind via
|
|
128
|
+
* {@link registerToolPresenter} (`disclosure: () => "preview"`).
|
|
129
|
+
*/
|
|
130
|
+
const TAIL_CATEGORIES: ReadonlySet<ToolCategory> = new Set<ToolCategory>([
|
|
131
|
+
"shell",
|
|
132
|
+
]);
|
|
133
|
+
|
|
72
134
|
/**
|
|
73
135
|
* Low-signal categories whose consecutive runs fold into a single collapsible
|
|
74
136
|
* "Read 5 files" chip in the thread. These are the read-only, repetitive
|
|
@@ -84,13 +146,15 @@ const RUN_GROUPABLE_CATEGORIES: ReadonlySet<ToolCategory> = new Set<ToolCategory
|
|
|
84
146
|
|
|
85
147
|
/**
|
|
86
148
|
* Returns the default inline {@link ToolDisclosure} for a presentation
|
|
87
|
-
* category. This is the headless policy behind the thread's "
|
|
88
|
-
* preview for
|
|
89
|
-
* consumers can override per {@link ToolKind} via
|
|
149
|
+
* category. This is the headless policy behind the thread's "collapse settled
|
|
150
|
+
* shell to a dimmed tail, keep a live preview for MCP/unknown, keep generic
|
|
151
|
+
* tools compact" behaviour; consumers can override per {@link ToolKind} via
|
|
152
|
+
* {@link registerToolPresenter}.
|
|
90
153
|
*/
|
|
91
154
|
export function defaultDisclosureForCategory(
|
|
92
155
|
category: ToolCategory,
|
|
93
156
|
): ToolDisclosure {
|
|
157
|
+
if (TAIL_CATEGORIES.has(category)) return "tail";
|
|
94
158
|
return PREVIEW_CATEGORIES.has(category) ? "preview" : "summary";
|
|
95
159
|
}
|
|
96
160
|
|
|
@@ -128,6 +192,14 @@ export interface ToolCategoryInfo {
|
|
|
128
192
|
readonly primaryArgField: string;
|
|
129
193
|
/** Fallback argument keys tried when the primary key is absent. */
|
|
130
194
|
readonly fallbackArgFields: readonly string[];
|
|
195
|
+
/**
|
|
196
|
+
* JSON argument key carrying a model-authored intent phrase for this kind
|
|
197
|
+
* (stigmer#276), or `undefined` for kinds without one. Shell is the only
|
|
198
|
+
* carrier today: both harnesses converge on `description` — the Cursor
|
|
199
|
+
* harness's built-in Shell tool ships it natively, and the native harness's
|
|
200
|
+
* tool-intent middleware adds it to the `execute` schema at bind time.
|
|
201
|
+
*/
|
|
202
|
+
readonly intentArgField?: string;
|
|
131
203
|
}
|
|
132
204
|
|
|
133
205
|
interface KindDisplayEntry {
|
|
@@ -135,6 +207,7 @@ interface KindDisplayEntry {
|
|
|
135
207
|
readonly label: string;
|
|
136
208
|
readonly primaryField: string;
|
|
137
209
|
readonly fallbackFields?: readonly string[];
|
|
210
|
+
readonly intentField?: string;
|
|
138
211
|
}
|
|
139
212
|
|
|
140
213
|
// Presentation metadata per ToolKind. Classification (name -> kind) is owned by
|
|
@@ -145,7 +218,7 @@ const KIND_DISPLAY: Partial<Record<ToolKind, KindDisplayEntry>> = {
|
|
|
145
218
|
[ToolKind.FILE_WRITE]: { category: "write", label: "Write", primaryField: "path", fallbackFields: ["file_path", "file", "filename"] },
|
|
146
219
|
[ToolKind.FILE_EDIT]: { category: "edit", label: "Edit", primaryField: "path", fallbackFields: ["file_path", "file", "filename"] },
|
|
147
220
|
[ToolKind.FILE_DELETE]: { category: "delete", label: "Delete", primaryField: "path", fallbackFields: ["file_path", "file", "filename"] },
|
|
148
|
-
[ToolKind.SHELL]: { category: "shell", label: "Shell", primaryField: "command" },
|
|
221
|
+
[ToolKind.SHELL]: { category: "shell", label: "Shell", primaryField: "command", intentField: "description" },
|
|
149
222
|
[ToolKind.SEARCH]: { category: "search", label: "Search", primaryField: "pattern", fallbackFields: ["query", "q"] },
|
|
150
223
|
[ToolKind.LIST]: { category: "list", label: "List", primaryField: "path" },
|
|
151
224
|
[ToolKind.FETCH]: { category: "fetch", label: "Fetch", primaryField: "url", fallbackFields: ["uri"] },
|
|
@@ -200,6 +273,7 @@ export function toolKindToCategoryInfo(
|
|
|
200
273
|
label: entry.label,
|
|
201
274
|
primaryArgField: entry.primaryField,
|
|
202
275
|
fallbackArgFields: entry.fallbackFields ?? [],
|
|
276
|
+
...(entry.intentField ? { intentArgField: entry.intentField } : {}),
|
|
203
277
|
};
|
|
204
278
|
}
|
|
205
279
|
|
|
@@ -376,6 +450,118 @@ export function extractPrimaryArgFromPreview(
|
|
|
376
450
|
}
|
|
377
451
|
}
|
|
378
452
|
|
|
453
|
+
/**
|
|
454
|
+
* Extracts the model-authored intent phrase from a tool call's args
|
|
455
|
+
* (stigmer#276), or `null` when the kind carries none / the model omitted it.
|
|
456
|
+
*
|
|
457
|
+
* The intent is presentation metadata authored by the model *for the user* —
|
|
458
|
+
* "Run unit tests for the parser" — rendered as the row title in place of the
|
|
459
|
+
* bare category label. Extraction is kind-scoped via
|
|
460
|
+
* {@link ToolCategoryInfo.intentArgField} (shell-only today) so a same-named
|
|
461
|
+
* REAL argument on another kind (e.g. the sub-agent task tool's
|
|
462
|
+
* `description`, which is its subject) is never misread as an intent.
|
|
463
|
+
*/
|
|
464
|
+
export function extractIntent(toolCall: ToolCall): string | null {
|
|
465
|
+
const info = resolveToolCategoryFromCall(toolCall);
|
|
466
|
+
if (!info.intentArgField || !toolCall.args) return null;
|
|
467
|
+
const value = toolCall.args[info.intentArgField];
|
|
468
|
+
return typeof value === "string" && value.length > 0 ? value : null;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
/**
|
|
472
|
+
* {@link extractIntent} for surfaces that carry a JSON `argsPreview` string
|
|
473
|
+
* instead of a full {@link ToolCall} — notably `PendingApproval`. Same
|
|
474
|
+
* kind-scoping; returns `null` on parse failure or when absent.
|
|
475
|
+
*/
|
|
476
|
+
export function extractIntentFromPreview(
|
|
477
|
+
toolName: string,
|
|
478
|
+
argsPreview: string,
|
|
479
|
+
mcpServerSlug?: string,
|
|
480
|
+
toolKind?: ToolKind,
|
|
481
|
+
): string | null {
|
|
482
|
+
if (!argsPreview) return null;
|
|
483
|
+
|
|
484
|
+
const info =
|
|
485
|
+
toolKind !== undefined
|
|
486
|
+
? resolveToolCategoryFromKind(toolKind, toolName, mcpServerSlug)
|
|
487
|
+
: resolveToolCategory(toolName, mcpServerSlug);
|
|
488
|
+
if (!info.intentArgField) return null;
|
|
489
|
+
|
|
490
|
+
try {
|
|
491
|
+
const parsed = JSON.parse(argsPreview);
|
|
492
|
+
if (typeof parsed !== "object" || parsed === null) return null;
|
|
493
|
+
const value = (parsed as Record<string, unknown>)[info.intentArgField];
|
|
494
|
+
return typeof value === "string" && value.length > 0 ? value : null;
|
|
495
|
+
} catch {
|
|
496
|
+
return null;
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
/**
|
|
501
|
+
* The tool-call argument that carries a model-authored intent phrase for
|
|
502
|
+
* SHELL tools (stigmer#276) — a short human description of what the command
|
|
503
|
+
* does and why, rendered as the row title with the command as secondary text.
|
|
504
|
+
*
|
|
505
|
+
* Two writers populate it, converged on one wire key by design: the native
|
|
506
|
+
* harness's tool-intent middleware (`backend/services/runner/src/middleware/
|
|
507
|
+
* tool-intent.ts`, `INTENT_ARG`) extends the shell tool's bind-time schema
|
|
508
|
+
* with it, and the Cursor harness's built-in Shell tool carries it natively.
|
|
509
|
+
* The shared, machine-checked contract is
|
|
510
|
+
* `test/fixtures/tool-view/intent-title.json` — keep all three in lockstep.
|
|
511
|
+
*/
|
|
512
|
+
export const SHELL_INTENT_ARG_FIELD = "description";
|
|
513
|
+
|
|
514
|
+
/**
|
|
515
|
+
* The intent-title extraction core: SHELL-kind-scoped on purpose, because
|
|
516
|
+
* `description` means other things on other tools (a task tool's description
|
|
517
|
+
* is the sub-agent subject, never a row title). Blank and non-string values
|
|
518
|
+
* degrade to null — the caller falls back to the category label.
|
|
519
|
+
*/
|
|
520
|
+
function extractIntentFromArgs(kind: ToolKind, args: JsonObject | undefined): string | null {
|
|
521
|
+
if (kind !== ToolKind.SHELL || !args) return null;
|
|
522
|
+
const value = args[SHELL_INTENT_ARG_FIELD];
|
|
523
|
+
if (typeof value !== "string") return null;
|
|
524
|
+
const trimmed = value.trim();
|
|
525
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
/**
|
|
529
|
+
* Extracts the model-authored intent phrase from a SHELL tool call, or null
|
|
530
|
+
* when absent (legacy executions, models that skipped the optional arg, and
|
|
531
|
+
* every non-shell kind). See {@link SHELL_INTENT_ARG_FIELD}.
|
|
532
|
+
*/
|
|
533
|
+
export function extractShellIntent(toolCall: ToolCall): string | null {
|
|
534
|
+
return extractIntentFromArgs(resolveToolKind(toolCall), toolCall.args);
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
/**
|
|
538
|
+
* Preview-string twin of {@link extractShellIntent} for surfaces that carry a
|
|
539
|
+
* `PendingApproval` (JSON `argsPreview`) instead of a full {@link ToolCall} —
|
|
540
|
+
* mirrors {@link extractPrimaryArgFromPreview}'s kind resolution.
|
|
541
|
+
*/
|
|
542
|
+
export function extractShellIntentFromPreview(
|
|
543
|
+
toolName: string,
|
|
544
|
+
argsPreview: string,
|
|
545
|
+
mcpServerSlug?: string,
|
|
546
|
+
toolKind?: ToolKind,
|
|
547
|
+
): string | null {
|
|
548
|
+
if (!argsPreview) return null;
|
|
549
|
+
|
|
550
|
+
const kind =
|
|
551
|
+
toolKind !== undefined && toolKind !== ToolKind.UNSPECIFIED
|
|
552
|
+
? toolKind
|
|
553
|
+
: resolveToolKindByName(toolName, mcpServerSlug);
|
|
554
|
+
if (kind !== ToolKind.SHELL) return null;
|
|
555
|
+
|
|
556
|
+
try {
|
|
557
|
+
const parsed = JSON.parse(argsPreview);
|
|
558
|
+
if (typeof parsed !== "object" || parsed === null) return null;
|
|
559
|
+
return extractIntentFromArgs(kind, parsed as JsonObject);
|
|
560
|
+
} catch {
|
|
561
|
+
return null;
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
|
|
379
565
|
const WRITE_CONTENT_FIELDS = [
|
|
380
566
|
"contents",
|
|
381
567
|
"content",
|
|
@@ -19,10 +19,12 @@ import type { ToolResultView } from "@stigmer/sdk";
|
|
|
19
19
|
import {
|
|
20
20
|
resolveToolCategoryFromCall,
|
|
21
21
|
extractPrimaryArg,
|
|
22
|
+
extractShellIntent,
|
|
23
|
+
defaultChromeForCategory,
|
|
22
24
|
defaultDisclosureForCategory,
|
|
23
25
|
isRunGroupableCategory,
|
|
24
26
|
} from "./tool-categories.js";
|
|
25
|
-
import type { ToolCategory, ToolDisclosure } from "./tool-categories.js";
|
|
27
|
+
import type { ToolCategory, ToolChrome, ToolDisclosure } from "./tool-categories.js";
|
|
26
28
|
import { summarizeResultView } from "./ResultView.js";
|
|
27
29
|
|
|
28
30
|
/** Optional per-kind overrides for label, summary, disclosure, and run-grouping. */
|
|
@@ -37,6 +39,15 @@ export interface ToolPresenter {
|
|
|
37
39
|
* (`() => "preview"`) without forking the components.
|
|
38
40
|
*/
|
|
39
41
|
readonly disclosure?: (toolCall: ToolCall, result: ToolResultView) => ToolDisclosure;
|
|
42
|
+
/**
|
|
43
|
+
* Overrides the default chrome tier — quiet unboxed line vs bordered card
|
|
44
|
+
* (see {@link ToolChrome}). Use to restore the boxed look for a kind
|
|
45
|
+
* (`() => "card"`) or to quiet a chatty custom tool (`() => "quiet"`).
|
|
46
|
+
* A pending approval gate or a failure always escalates the row to a card
|
|
47
|
+
* regardless of this override — a decision surface and error output must
|
|
48
|
+
* never render frameless.
|
|
49
|
+
*/
|
|
50
|
+
readonly chrome?: (toolCall: ToolCall, result: ToolResultView) => ToolChrome;
|
|
40
51
|
/**
|
|
41
52
|
* Overrides whether consecutive same-kind calls fold into one collapsible
|
|
42
53
|
* "Read 5 files" chip. Use to fold a chatty custom tool (`() => true`) or to
|
|
@@ -114,6 +125,21 @@ export interface ToolPresentation {
|
|
|
114
125
|
readonly category: ToolCategory;
|
|
115
126
|
/** Display label, e.g. "Edit", "Shell". */
|
|
116
127
|
readonly label: string;
|
|
128
|
+
/**
|
|
129
|
+
* The model-authored intent phrase for a SHELL call (stigmer#276), or null
|
|
130
|
+
* when absent (legacy executions, skipped optional arg, non-shell kinds).
|
|
131
|
+
* Raw extraction — precedence against overrides is resolved in
|
|
132
|
+
* {@link ToolPresentation.title}.
|
|
133
|
+
*/
|
|
134
|
+
readonly intent: string | null;
|
|
135
|
+
/**
|
|
136
|
+
* The row title: a registered presenter's `label` override wins (a host's
|
|
137
|
+
* explicit wording is never displaced by model output), then the
|
|
138
|
+
* model-authored {@link intent}, then the category {@link label}. Renderers
|
|
139
|
+
* that title a row use this; {@link label} stays the short kind label for
|
|
140
|
+
* chips and badges.
|
|
141
|
+
*/
|
|
142
|
+
readonly title: string;
|
|
117
143
|
/** Primary argument (path, command, pattern...), or null. */
|
|
118
144
|
readonly primaryArg: string | null;
|
|
119
145
|
/** Normalized result view for rendering with {@link ResultView}. */
|
|
@@ -127,6 +153,13 @@ export interface ToolPresentation {
|
|
|
127
153
|
* default.
|
|
128
154
|
*/
|
|
129
155
|
readonly disclosure: ToolDisclosure;
|
|
156
|
+
/**
|
|
157
|
+
* Default chrome tier for this tool — `"quiet"` renders an unboxed line,
|
|
158
|
+
* `"card"` a bordered card (see {@link ToolChrome}). A pending gate or a
|
|
159
|
+
* failure escalates to `"card"` in the component layer; this is the
|
|
160
|
+
* *settled* default.
|
|
161
|
+
*/
|
|
162
|
+
readonly chrome: ToolChrome;
|
|
130
163
|
/**
|
|
131
164
|
* Whether consecutive same-kind calls fold into one collapsible chip — the
|
|
132
165
|
* run-grouping axis, orthogonal to {@link disclosure}. See
|
|
@@ -149,12 +182,18 @@ export function useToolPresentation(toolCall: ToolCall): ToolPresentation {
|
|
|
149
182
|
const result = normalizeToolResult(toolCall);
|
|
150
183
|
const override = registry.get(kind);
|
|
151
184
|
|
|
152
|
-
const
|
|
185
|
+
const overrideLabel = override?.label?.(toolCall);
|
|
186
|
+
const label = overrideLabel ?? categoryInfo.label;
|
|
187
|
+
const intent = extractShellIntent(toolCall);
|
|
188
|
+
const title = overrideLabel ?? intent ?? categoryInfo.label;
|
|
153
189
|
const resultSummary =
|
|
154
190
|
override?.summary?.(toolCall, result) ?? summarizeResultView(result);
|
|
155
191
|
const disclosure =
|
|
156
192
|
override?.disclosure?.(toolCall, result) ??
|
|
157
193
|
defaultDisclosureForCategory(categoryInfo.category);
|
|
194
|
+
const chrome =
|
|
195
|
+
override?.chrome?.(toolCall, result) ??
|
|
196
|
+
defaultChromeForCategory(categoryInfo.category);
|
|
158
197
|
const runGroupable =
|
|
159
198
|
override?.runGroupable?.(toolCall) ??
|
|
160
199
|
isRunGroupableCategory(categoryInfo.category);
|
|
@@ -163,10 +202,13 @@ export function useToolPresentation(toolCall: ToolCall): ToolPresentation {
|
|
|
163
202
|
kind,
|
|
164
203
|
category: categoryInfo.category,
|
|
165
204
|
label,
|
|
205
|
+
intent,
|
|
206
|
+
title,
|
|
166
207
|
primaryArg: extractPrimaryArg(toolCall),
|
|
167
208
|
result,
|
|
168
209
|
resultSummary,
|
|
169
210
|
disclosure,
|
|
211
|
+
chrome,
|
|
170
212
|
runGroupable,
|
|
171
213
|
};
|
|
172
214
|
}, [toolCall]);
|
|
@@ -12,8 +12,7 @@ import {
|
|
|
12
12
|
useApplyResource,
|
|
13
13
|
type ApplyResourceResult,
|
|
14
14
|
} from "../library/useApplyResource.js";
|
|
15
|
-
|
|
16
|
-
const COPIED_FEEDBACK_MS = 2000;
|
|
15
|
+
import { useCopyFeedback } from "../internal/useCopyFeedback.js";
|
|
17
16
|
|
|
18
17
|
/** Options for {@link useArtifactInspection}. */
|
|
19
18
|
export interface UseArtifactInspectionOptions {
|
|
@@ -198,14 +197,11 @@ export function useArtifactInspection(
|
|
|
198
197
|
|
|
199
198
|
// --- Copy -----------------------------------------------------------------
|
|
200
199
|
|
|
201
|
-
const
|
|
200
|
+
const { copy: copyToClipboard, copied } = useCopyFeedback();
|
|
202
201
|
const copy = useCallback(() => {
|
|
203
202
|
if (!content) return;
|
|
204
|
-
void
|
|
205
|
-
|
|
206
|
-
setTimeout(() => setCopied(false), COPIED_FEEDBACK_MS);
|
|
207
|
-
});
|
|
208
|
-
}, [content]);
|
|
203
|
+
void copyToClipboard(content);
|
|
204
|
+
}, [content, copyToClipboard]);
|
|
209
205
|
|
|
210
206
|
return useMemo(
|
|
211
207
|
() => ({
|
|
@@ -12,6 +12,7 @@ import { getUserMessage, iamRoleToString } from "@stigmer/sdk";
|
|
|
12
12
|
import { useCreateIamPolicy } from "./useCreateIamPolicy.js";
|
|
13
13
|
import { RoleSelector } from "./RoleSelector.js";
|
|
14
14
|
import { PrincipalPicker, type SelectedPrincipal } from "./PrincipalPicker.js";
|
|
15
|
+
import { SpinnerIcon } from "../internal/SpinnerIcon.js";
|
|
15
16
|
|
|
16
17
|
/** Props for {@link GrantAccessForm}. */
|
|
17
18
|
export interface GrantAccessFormProps {
|
|
@@ -151,7 +152,7 @@ export function GrantAccessForm({
|
|
|
151
152
|
"stg:disabled:pointer-events-none stg:disabled:opacity-40",
|
|
152
153
|
)}
|
|
153
154
|
>
|
|
154
|
-
{isCreating && <SpinnerIcon />}
|
|
155
|
+
{isCreating && <SpinnerIcon size={12} />}
|
|
155
156
|
Grant access
|
|
156
157
|
</button>
|
|
157
158
|
|
|
@@ -174,20 +175,3 @@ export function GrantAccessForm({
|
|
|
174
175
|
);
|
|
175
176
|
}
|
|
176
177
|
|
|
177
|
-
function SpinnerIcon() {
|
|
178
|
-
return (
|
|
179
|
-
<svg
|
|
180
|
-
width="12"
|
|
181
|
-
height="12"
|
|
182
|
-
viewBox="0 0 16 16"
|
|
183
|
-
fill="none"
|
|
184
|
-
stroke="currentColor"
|
|
185
|
-
strokeWidth="2"
|
|
186
|
-
strokeLinecap="round"
|
|
187
|
-
className="stg:animate-spin"
|
|
188
|
-
aria-hidden="true"
|
|
189
|
-
>
|
|
190
|
-
<path d="M8 2a6 6 0 1 0 6 6" />
|
|
191
|
-
</svg>
|
|
192
|
-
);
|
|
193
|
-
}
|