@stigmer/react 3.12.0 → 3.12.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/access/ManageAccessDialog.d.ts.map +1 -1
- package/access/ManageAccessDialog.js +7 -2
- package/access/ManageAccessDialog.js.map +1 -1
- package/activity/format-relative-time.d.ts +11 -9
- package/activity/format-relative-time.d.ts.map +1 -1
- package/activity/format-relative-time.js +11 -9
- package/activity/format-relative-time.js.map +1 -1
- package/agent/steps/CapabilitiesStep.js +5 -2
- package/agent/steps/CapabilitiesStep.js.map +1 -1
- package/agent/steps/IdentityStep.d.ts.map +1 -1
- package/agent/steps/IdentityStep.js +6 -5
- package/agent/steps/IdentityStep.js.map +1 -1
- package/agent-instance/CreateAgentInstanceDialog.d.ts.map +1 -1
- package/agent-instance/CreateAgentInstanceDialog.js +10 -2
- package/agent-instance/CreateAgentInstanceDialog.js.map +1 -1
- package/api-key/ApiKeyCreatedAlert.d.ts.map +1 -1
- package/api-key/ApiKeyCreatedAlert.js +12 -20
- package/api-key/ApiKeyCreatedAlert.js.map +1 -1
- package/api-key/ApiKeyListPanel.d.ts.map +1 -1
- package/api-key/ApiKeyListPanel.js +3 -23
- package/api-key/ApiKeyListPanel.js.map +1 -1
- package/api-key/CreateApiKeyForm.d.ts.map +1 -1
- package/api-key/CreateApiKeyForm.js +6 -10
- package/api-key/CreateApiKeyForm.js.map +1 -1
- package/approval-defaults-context.d.ts +47 -0
- package/approval-defaults-context.d.ts.map +1 -0
- package/approval-defaults-context.js +27 -0
- package/approval-defaults-context.js.map +1 -0
- package/attachment/index.d.ts +2 -0
- package/attachment/index.d.ts.map +1 -1
- package/attachment/index.js +1 -0
- package/attachment/index.js.map +1 -1
- package/attachment/vision-preflight.d.ts +113 -0
- package/attachment/vision-preflight.d.ts.map +1 -0
- package/attachment/vision-preflight.js +143 -0
- package/attachment/vision-preflight.js.map +1 -0
- package/billing/AutoRechargeCard.d.ts.map +1 -1
- package/billing/AutoRechargeCard.js +3 -2
- package/billing/AutoRechargeCard.js.map +1 -1
- package/billing/BillingSection.d.ts.map +1 -1
- package/billing/BillingSection.js +3 -2
- package/billing/BillingSection.js.map +1 -1
- package/channel/ChannelConversationsDialog.d.ts.map +1 -1
- package/channel/ChannelConversationsDialog.js +5 -4
- package/channel/ChannelConversationsDialog.js.map +1 -1
- package/channel/ChannelCredentialsDialog.d.ts.map +1 -1
- package/channel/ChannelCredentialsDialog.js +9 -4
- package/channel/ChannelCredentialsDialog.js.map +1 -1
- package/channel/ChannelTemplatesDialog.d.ts.map +1 -1
- package/channel/ChannelTemplatesDialog.js +5 -4
- package/channel/ChannelTemplatesDialog.js.map +1 -1
- package/channel/ConnectSlackDialog.d.ts.map +1 -1
- package/channel/ConnectSlackDialog.js +9 -4
- package/channel/ConnectSlackDialog.js.map +1 -1
- package/channel/ConnectWhatsAppDialog.d.ts.map +1 -1
- package/channel/ConnectWhatsAppDialog.js +9 -4
- package/channel/ConnectWhatsAppDialog.js.map +1 -1
- package/channel/useChannelSessions.d.ts.map +1 -1
- package/channel/useChannelSessions.js.map +1 -1
- package/channel-app/ChannelAppDetailPanel.d.ts.map +1 -1
- package/channel-app/ChannelAppDetailPanel.js +8 -5
- package/channel-app/ChannelAppDetailPanel.js.map +1 -1
- package/channel-app/CreateChannelAppForm.d.ts.map +1 -1
- package/channel-app/CreateChannelAppForm.js +12 -7
- package/channel-app/CreateChannelAppForm.js.map +1 -1
- package/channel-app/internal.d.ts +0 -1
- package/channel-app/internal.d.ts.map +1 -1
- package/channel-app/internal.js +5 -10
- package/channel-app/internal.js.map +1 -1
- package/composer/ComposerToolbar.js +2 -1
- package/composer/ComposerToolbar.js.map +1 -1
- package/composer/SessionComposer.d.ts +1 -1
- package/composer/SessionComposer.d.ts.map +1 -1
- package/composer/SessionComposer.js +120 -13
- package/composer/SessionComposer.js.map +1 -1
- package/composer/icons.d.ts +0 -1
- package/composer/icons.d.ts.map +1 -1
- package/composer/icons.js +0 -3
- package/composer/icons.js.map +1 -1
- package/conversation/ConversationComposer.js +1 -1
- package/conversation/ConversationComposer.js.map +1 -1
- package/conversation/ConversationListPane.d.ts.map +1 -1
- package/conversation/ConversationListPane.js +3 -2
- package/conversation/ConversationListPane.js.map +1 -1
- package/cursor-accounts/MemberCoverageTable.js +3 -14
- package/cursor-accounts/MemberCoverageTable.js.map +1 -1
- package/dashboard/DashboardFailedRuns.d.ts.map +1 -1
- package/dashboard/DashboardFailedRuns.js +2 -14
- package/dashboard/DashboardFailedRuns.js.map +1 -1
- package/environment/CreateEnvironmentForm.d.ts.map +1 -1
- package/environment/CreateEnvironmentForm.js +4 -8
- package/environment/CreateEnvironmentForm.js.map +1 -1
- package/environment/EnvVarForm.d.ts.map +1 -1
- package/environment/EnvVarForm.js +2 -4
- package/environment/EnvVarForm.js.map +1 -1
- package/environment/EnvironmentVariableEditor.d.ts.map +1 -1
- package/environment/EnvironmentVariableEditor.js +5 -7
- package/environment/EnvironmentVariableEditor.js.map +1 -1
- package/execution/ArtifactApplyButton.d.ts.map +1 -1
- package/execution/ArtifactApplyButton.js +2 -4
- package/execution/ArtifactApplyButton.js.map +1 -1
- package/execution/ExecutionErrorNotice.d.ts +36 -0
- package/execution/ExecutionErrorNotice.d.ts.map +1 -0
- package/execution/ExecutionErrorNotice.js +39 -0
- package/execution/ExecutionErrorNotice.js.map +1 -0
- package/execution/FilePathLink.d.ts.map +1 -1
- package/execution/FilePathLink.js +5 -8
- package/execution/FilePathLink.js.map +1 -1
- package/execution/FileReviewCard.d.ts.map +1 -1
- package/execution/FileReviewCard.js +1 -6
- package/execution/FileReviewCard.js.map +1 -1
- package/execution/FollowUpInput.d.ts.map +1 -1
- package/execution/FollowUpInput.js +1 -3
- package/execution/FollowUpInput.js.map +1 -1
- package/execution/LivenessStatusLine.d.ts +40 -0
- package/execution/LivenessStatusLine.d.ts.map +1 -0
- package/execution/LivenessStatusLine.js +34 -0
- package/execution/LivenessStatusLine.js.map +1 -0
- package/execution/MessageEntry.d.ts.map +1 -1
- package/execution/MessageEntry.js +31 -3
- package/execution/MessageEntry.js.map +1 -1
- package/execution/MessageThread.d.ts +25 -0
- package/execution/MessageThread.d.ts.map +1 -1
- package/execution/MessageThread.js +51 -36
- package/execution/MessageThread.js.map +1 -1
- package/execution/SetupProgress.d.ts.map +1 -1
- package/execution/SetupProgress.js +1 -1
- package/execution/SetupProgress.js.map +1 -1
- package/execution/SubAgentSection.d.ts.map +1 -1
- package/execution/SubAgentSection.js +9 -7
- package/execution/SubAgentSection.js.map +1 -1
- package/execution/TerminalSession.d.ts +30 -0
- package/execution/TerminalSession.d.ts.map +1 -1
- package/execution/TerminalSession.js +37 -1
- package/execution/TerminalSession.js.map +1 -1
- package/execution/ToolCallDetail.d.ts +9 -0
- package/execution/ToolCallDetail.d.ts.map +1 -1
- package/execution/ToolCallDetail.js +16 -0
- package/execution/ToolCallDetail.js.map +1 -1
- package/execution/ToolCallItem.d.ts +20 -6
- package/execution/ToolCallItem.d.ts.map +1 -1
- package/execution/ToolCallItem.js +102 -29
- package/execution/ToolCallItem.js.map +1 -1
- package/execution/ToolRunGroup.d.ts.map +1 -1
- package/execution/ToolRunGroup.js +11 -11
- package/execution/ToolRunGroup.js.map +1 -1
- package/execution/WriteBackCard.d.ts.map +1 -1
- package/execution/WriteBackCard.js +5 -20
- package/execution/WriteBackCard.js.map +1 -1
- package/execution/index.d.ts +6 -2
- package/execution/index.d.ts.map +1 -1
- package/execution/index.js +3 -1
- package/execution/index.js.map +1 -1
- package/execution/tool-categories.d.ts +42 -7
- package/execution/tool-categories.d.ts.map +1 -1
- package/execution/tool-categories.js +38 -4
- package/execution/tool-categories.js.map +1 -1
- package/execution/tool-presenter.d.ts +17 -1
- package/execution/tool-presenter.d.ts.map +1 -1
- package/execution/tool-presenter.js +4 -1
- package/execution/tool-presenter.js.map +1 -1
- package/execution/useArtifactInspection.d.ts.map +1 -1
- package/execution/useArtifactInspection.js +4 -7
- package/execution/useArtifactInspection.js.map +1 -1
- package/execution/useCreateAgentExecution.d.ts +3 -2
- package/execution/useCreateAgentExecution.d.ts.map +1 -1
- package/execution/useCreateAgentExecution.js.map +1 -1
- package/iam-policy/GrantAccessForm.d.ts.map +1 -1
- package/iam-policy/GrantAccessForm.js +2 -4
- package/iam-policy/GrantAccessForm.js.map +1 -1
- package/iam-policy/OrgMembersPanel.d.ts.map +1 -1
- package/iam-policy/OrgMembersPanel.js +3 -5
- package/iam-policy/OrgMembersPanel.js.map +1 -1
- package/iam-policy/RoleSelector.d.ts.map +1 -1
- package/iam-policy/RoleSelector.js +7 -1
- package/iam-policy/RoleSelector.js.map +1 -1
- package/identity-provider/CreateIdentityProviderForm.d.ts.map +1 -1
- package/identity-provider/CreateIdentityProviderForm.js +6 -9
- package/identity-provider/CreateIdentityProviderForm.js.map +1 -1
- package/identity-provider/IdentityProviderDetailPanel.d.ts.map +1 -1
- package/identity-provider/IdentityProviderDetailPanel.js +17 -26
- package/identity-provider/IdentityProviderDetailPanel.js.map +1 -1
- package/identity-provider/IdentityProviderListPanel.d.ts.map +1 -1
- package/identity-provider/IdentityProviderListPanel.js +2 -4
- package/identity-provider/IdentityProviderListPanel.js.map +1 -1
- package/identity-provider/IdentityProviderWizard.d.ts.map +1 -1
- package/identity-provider/IdentityProviderWizard.js +8 -7
- package/identity-provider/IdentityProviderWizard.js.map +1 -1
- package/identity-provider/SsoLoginPrompt.js +5 -6
- package/identity-provider/SsoLoginPrompt.js.map +1 -1
- package/index.d.ts +9 -8
- package/index.d.ts.map +1 -1
- package/index.js +4 -4
- package/index.js.map +1 -1
- package/internal/DecisionButton.d.ts.map +1 -1
- package/internal/DecisionButton.js +1 -6
- package/internal/DecisionButton.js.map +1 -1
- package/internal/SpinnerIcon.d.ts +22 -0
- package/internal/SpinnerIcon.d.ts.map +1 -0
- package/internal/SpinnerIcon.js +23 -0
- package/internal/SpinnerIcon.js.map +1 -0
- package/internal/isUnimplemented.d.ts +17 -0
- package/internal/isUnimplemented.d.ts.map +1 -0
- package/internal/isUnimplemented.js +26 -0
- package/internal/isUnimplemented.js.map +1 -0
- package/internal/select-element-text.d.ts +11 -0
- package/internal/select-element-text.d.ts.map +1 -0
- package/internal/select-element-text.js +19 -0
- package/internal/select-element-text.js.map +1 -0
- package/internal/thread-card/ThreadCardShell.d.ts +27 -10
- package/internal/thread-card/ThreadCardShell.d.ts.map +1 -1
- package/internal/thread-card/ThreadCardShell.js +11 -5
- package/internal/thread-card/ThreadCardShell.js.map +1 -1
- package/internal/thread-card/glyphs.d.ts +11 -2
- package/internal/thread-card/glyphs.d.ts.map +1 -1
- package/internal/thread-card/glyphs.js +9 -3
- package/internal/thread-card/glyphs.js.map +1 -1
- package/internal/thread-card/index.d.ts +1 -1
- package/internal/thread-card/index.d.ts.map +1 -1
- package/internal/thread-card/index.js.map +1 -1
- package/internal/useCopyFeedback.d.ts +28 -0
- package/internal/useCopyFeedback.d.ts.map +1 -0
- package/internal/useCopyFeedback.js +40 -0
- package/internal/useCopyFeedback.js.map +1 -0
- package/invitation/InvitationCreatedAlert.d.ts.map +1 -1
- package/invitation/InvitationCreatedAlert.js +12 -19
- package/invitation/InvitationCreatedAlert.js.map +1 -1
- package/invitation/InvitationManager.d.ts.map +1 -1
- package/invitation/InvitationManager.js +14 -21
- package/invitation/InvitationManager.js.map +1 -1
- package/invitation/InvitationRedemption.d.ts.map +1 -1
- package/invitation/InvitationRedemption.js +2 -4
- package/invitation/InvitationRedemption.js.map +1 -1
- package/library/useExportResource.d.ts.map +1 -1
- package/library/useExportResource.js +16 -27
- package/library/useExportResource.js.map +1 -1
- package/manifest/ApplyManifestDialog.js +1 -1
- package/manifest/EditResourceYamlDialog.js +1 -1
- package/mcp-server/DefinitionDriftNotice.d.ts +42 -0
- package/mcp-server/DefinitionDriftNotice.d.ts.map +1 -0
- package/mcp-server/DefinitionDriftNotice.js +52 -0
- package/mcp-server/DefinitionDriftNotice.js.map +1 -0
- package/mcp-server/McpServerConnectDialog.js +8 -4
- package/mcp-server/McpServerConnectDialog.js.map +1 -1
- package/mcp-server/McpServerDetailView.d.ts.map +1 -1
- package/mcp-server/McpServerDetailView.js +47 -14
- package/mcp-server/McpServerDetailView.js.map +1 -1
- package/mcp-server/OAuthAppForm.d.ts.map +1 -1
- package/mcp-server/OAuthAppForm.js +2 -4
- package/mcp-server/OAuthAppForm.js.map +1 -1
- package/mcp-server/internal/definitionDrift.d.ts +39 -0
- package/mcp-server/internal/definitionDrift.d.ts.map +1 -0
- package/mcp-server/internal/definitionDrift.js +122 -0
- package/mcp-server/internal/definitionDrift.js.map +1 -0
- package/mcp-server/internal/mcpServerToInput.d.ts.map +1 -1
- package/mcp-server/internal/mcpServerToInput.js +3 -0
- package/mcp-server/internal/mcpServerToInput.js.map +1 -1
- package/mcp-server/steps/EnvironmentAuthStep.d.ts.map +1 -1
- package/mcp-server/steps/EnvironmentAuthStep.js +8 -4
- package/mcp-server/steps/EnvironmentAuthStep.js.map +1 -1
- package/mcp-server/steps/IdentityTransportStep.d.ts.map +1 -1
- package/mcp-server/steps/IdentityTransportStep.js +5 -4
- package/mcp-server/steps/IdentityTransportStep.js.map +1 -1
- package/mcp-server/useMcpServerConnect.d.ts +1 -1
- package/mcp-server/useMcpServerCredentials.d.ts +38 -10
- package/mcp-server/useMcpServerCredentials.d.ts.map +1 -1
- package/mcp-server/useMcpServerCredentials.js +50 -7
- package/mcp-server/useMcpServerCredentials.js.map +1 -1
- package/mcp-server/useMcpServerDefinitionDrift.d.ts +44 -0
- package/mcp-server/useMcpServerDefinitionDrift.d.ts.map +1 -0
- package/mcp-server/useMcpServerDefinitionDrift.js +61 -0
- package/mcp-server/useMcpServerDefinitionDrift.js.map +1 -0
- package/mcp-server/useOrgOAuthApp.d.ts +22 -0
- package/mcp-server/useOrgOAuthApp.d.ts.map +1 -1
- package/mcp-server/useOrgOAuthApp.js +39 -7
- package/mcp-server/useOrgOAuthApp.js.map +1 -1
- package/models/ModelRegistryContext.d.ts +7 -1
- package/models/ModelRegistryContext.d.ts.map +1 -1
- package/models/ModelRegistryContext.js.map +1 -1
- package/models/ModelSelector.js +9 -1
- package/models/ModelSelector.js.map +1 -1
- package/models/index.d.ts +2 -2
- package/models/index.d.ts.map +1 -1
- package/models/index.js +1 -1
- package/models/index.js.map +1 -1
- package/models/registry.d.ts +88 -6
- package/models/registry.d.ts.map +1 -1
- package/models/registry.js +133 -27
- package/models/registry.js.map +1 -1
- package/models/useModelRegistry.d.ts +7 -1
- package/models/useModelRegistry.d.ts.map +1 -1
- package/models/useModelRegistry.js +3 -2
- package/models/useModelRegistry.js.map +1 -1
- package/oauth-app/CreateOAuthAppForm.d.ts.map +1 -1
- package/oauth-app/CreateOAuthAppForm.js +4 -5
- package/oauth-app/CreateOAuthAppForm.js.map +1 -1
- package/oauth-app/OAuthAppDetailPanel.d.ts.map +1 -1
- package/oauth-app/OAuthAppDetailPanel.js +5 -6
- package/oauth-app/OAuthAppDetailPanel.js.map +1 -1
- package/organization/CreateOrganizationForm.d.ts.map +1 -1
- package/organization/CreateOrganizationForm.js +5 -9
- package/organization/CreateOrganizationForm.js.map +1 -1
- package/organization/OrgProfilePanel.d.ts.map +1 -1
- package/organization/OrgProfilePanel.js +7 -16
- package/organization/OrgProfilePanel.js.map +1 -1
- package/package.json +4 -4
- package/platform-client/CreatePlatformClientForm.d.ts.map +1 -1
- package/platform-client/CreatePlatformClientForm.js +5 -6
- package/platform-client/CreatePlatformClientForm.js.map +1 -1
- package/platform-client/PlatformClientDetailPanel.d.ts.map +1 -1
- package/platform-client/PlatformClientDetailPanel.js +6 -7
- package/platform-client/PlatformClientDetailPanel.js.map +1 -1
- package/platform-client/PlatformClientListPanel.d.ts.map +1 -1
- package/platform-client/PlatformClientListPanel.js +2 -4
- package/platform-client/PlatformClientListPanel.js.map +1 -1
- package/platform-client/PlatformClientSecretAlert.d.ts.map +1 -1
- package/platform-client/PlatformClientSecretAlert.js +18 -25
- package/platform-client/PlatformClientSecretAlert.js.map +1 -1
- package/provider.d.ts +34 -1
- package/provider.d.ts.map +1 -1
- package/provider.js +14 -7
- package/provider.js.map +1 -1
- package/resource-creation/WizardNav.d.ts.map +1 -1
- package/resource-creation/WizardNav.js +2 -4
- package/resource-creation/WizardNav.js.map +1 -1
- package/resource-detail/ConfirmDialog.js +1 -1
- package/resource-detail/useCopyResource.d.ts +4 -3
- package/resource-detail/useCopyResource.d.ts.map +1 -1
- package/resource-detail/useCopyResource.js +10 -19
- package/resource-detail/useCopyResource.js.map +1 -1
- package/schedule/ScheduleDetailView.d.ts.map +1 -1
- package/schedule/ScheduleDetailView.js +2 -4
- package/schedule/ScheduleDetailView.js.map +1 -1
- package/schedule/ScheduleForm.d.ts.map +1 -1
- package/schedule/ScheduleForm.js +6 -7
- package/schedule/ScheduleForm.js.map +1 -1
- package/session/NewSessionViewer.d.ts +52 -2
- package/session/NewSessionViewer.d.ts.map +1 -1
- package/session/NewSessionViewer.js +21 -6
- package/session/NewSessionViewer.js.map +1 -1
- package/session/SessionViewer.d.ts +63 -2
- package/session/SessionViewer.d.ts.map +1 -1
- package/session/SessionViewer.js +43 -17
- package/session/SessionViewer.js.map +1 -1
- package/session/audience.d.ts +17 -0
- package/session/audience.d.ts.map +1 -1
- package/session/index.d.ts +2 -1
- package/session/index.d.ts.map +1 -1
- package/session/index.js.map +1 -1
- package/session/run-config.d.ts +50 -0
- package/session/run-config.d.ts.map +1 -0
- package/session/run-config.js +15 -0
- package/session/run-config.js.map +1 -0
- package/session/useNewSessionFlow.d.ts +11 -0
- package/session/useNewSessionFlow.d.ts.map +1 -1
- package/session/useNewSessionFlow.js +29 -2
- package/session/useNewSessionFlow.js.map +1 -1
- package/session/useSessionConversation.d.ts +11 -9
- package/session/useSessionConversation.d.ts.map +1 -1
- package/session/useSessionConversation.js +2 -0
- package/session/useSessionConversation.js.map +1 -1
- package/session/useSessionPageFlow.d.ts +18 -4
- package/session/useSessionPageFlow.d.ts.map +1 -1
- package/session/useSessionPageFlow.js +33 -6
- package/session/useSessionPageFlow.js.map +1 -1
- package/session/useSessionPanel.d.ts +37 -2
- package/session/useSessionPanel.d.ts.map +1 -1
- package/session/useSessionPanel.js +44 -10
- package/session/useSessionPanel.js.map +1 -1
- package/settings/ApiKeysSection.d.ts.map +1 -1
- package/settings/ApiKeysSection.js +3 -2
- package/settings/ApiKeysSection.js.map +1 -1
- package/settings/ChannelAppsSection.d.ts.map +1 -1
- package/settings/ChannelAppsSection.js +3 -2
- package/settings/ChannelAppsSection.js.map +1 -1
- package/settings/EnvironmentsSection.js +5 -3
- package/settings/EnvironmentsSection.js.map +1 -1
- package/settings/IdentityProvidersSection.d.ts.map +1 -1
- package/settings/IdentityProvidersSection.js +3 -2
- package/settings/IdentityProvidersSection.js.map +1 -1
- package/settings/InvitationsSection.d.ts.map +1 -1
- package/settings/InvitationsSection.js +3 -1
- package/settings/InvitationsSection.js.map +1 -1
- package/settings/MembersSection.d.ts.map +1 -1
- package/settings/MembersSection.js +3 -1
- package/settings/MembersSection.js.map +1 -1
- package/settings/OAuthAppsSection.d.ts.map +1 -1
- package/settings/OAuthAppsSection.js +3 -2
- package/settings/OAuthAppsSection.js.map +1 -1
- package/settings/OrgProfileSection.d.ts.map +1 -1
- package/settings/OrgProfileSection.js +3 -2
- package/settings/OrgProfileSection.js.map +1 -1
- package/settings/PlatformClientsSection.d.ts.map +1 -1
- package/settings/PlatformClientsSection.js +3 -2
- package/settings/PlatformClientsSection.js.map +1 -1
- package/settings/UsageSection.d.ts.map +1 -1
- package/settings/UsageSection.js +3 -1
- package/settings/UsageSection.js.map +1 -1
- package/sharing/ShareAgentDialog.d.ts.map +1 -1
- package/sharing/ShareAgentDialog.js +18 -7
- package/sharing/ShareAgentDialog.js.map +1 -1
- package/sidebar/chrome.d.ts +3 -4
- package/sidebar/chrome.d.ts.map +1 -1
- package/sidebar/chrome.js +5 -4
- package/sidebar/chrome.js.map +1 -1
- package/skill/SkillDiffDialog.js +1 -1
- package/skill/useSkillVersions.d.ts.map +1 -1
- package/skill/useSkillVersions.js +1 -9
- package/skill/useSkillVersions.js.map +1 -1
- package/src/access/ManageAccessDialog.tsx +10 -4
- package/src/activity/format-relative-time.ts +11 -9
- package/src/agent/steps/CapabilitiesStep.tsx +6 -3
- package/src/agent/steps/IdentityStep.tsx +19 -12
- package/src/agent-instance/CreateAgentInstanceDialog.tsx +17 -8
- package/src/api-key/ApiKeyCreatedAlert.tsx +10 -19
- package/src/api-key/ApiKeyListPanel.tsx +3 -39
- package/src/api-key/CreateApiKeyForm.tsx +12 -26
- package/src/approval-defaults-context.ts +56 -0
- package/src/attachment/__tests__/vision-preflight.test.ts +311 -0
- package/src/attachment/index.ts +12 -0
- package/src/attachment/vision-preflight.ts +236 -0
- package/src/billing/AutoRechargeCard.tsx +5 -4
- package/src/billing/BillingSection.tsx +4 -3
- package/src/channel/ChannelConversationsDialog.tsx +8 -4
- package/src/channel/ChannelCredentialsDialog.tsx +14 -4
- package/src/channel/ChannelTemplatesDialog.tsx +8 -4
- package/src/channel/ConnectSlackDialog.tsx +14 -4
- package/src/channel/ConnectWhatsAppDialog.tsx +14 -4
- package/src/channel/useChannelSessions.ts +3 -0
- package/src/channel-app/ChannelAppDetailPanel.tsx +15 -12
- package/src/channel-app/CreateChannelAppForm.tsx +17 -12
- package/src/channel-app/internal.tsx +5 -25
- package/src/composer/ComposerToolbar.tsx +1 -1
- package/src/composer/SessionComposer.tsx +160 -13
- package/src/composer/__tests__/SessionComposer-modelCoherence.test.tsx +220 -0
- package/src/composer/__tests__/SessionComposer-visionPreflight.test.tsx +222 -0
- package/src/composer/icons.tsx +0 -18
- package/src/conversation/ConversationComposer.tsx +1 -1
- package/src/conversation/ConversationListPane.tsx +4 -3
- package/src/cursor-accounts/MemberCoverageTable.tsx +3 -14
- package/src/cursor-accounts/__tests__/CursorAccountsConsole.test.tsx +2 -10
- package/src/dashboard/DashboardFailedRuns.tsx +2 -12
- package/src/environment/CreateEnvironmentForm.tsx +8 -27
- package/src/environment/EnvVarForm.tsx +2 -18
- package/src/environment/EnvironmentVariableEditor.tsx +5 -21
- package/src/execution/ArtifactApplyButton.tsx +2 -17
- package/src/execution/ExecutionErrorNotice.tsx +99 -0
- package/src/execution/FilePathLink.tsx +5 -9
- package/src/execution/FileReviewCard.tsx +1 -20
- package/src/execution/FollowUpInput.tsx +1 -16
- package/src/execution/LivenessStatusLine.tsx +59 -0
- package/src/execution/MessageEntry.tsx +136 -25
- package/src/execution/MessageThread.tsx +84 -83
- package/src/execution/SetupProgress.tsx +5 -1
- package/src/execution/SubAgentSection.tsx +9 -20
- package/src/execution/TerminalSession.tsx +97 -10
- package/src/execution/ToolCallDetail.tsx +19 -0
- package/src/execution/ToolCallItem.tsx +157 -37
- package/src/execution/ToolRunGroup.tsx +30 -32
- package/src/execution/WriteBackCard.tsx +5 -24
- package/src/execution/__tests__/MessageEntry-copy.test.tsx +125 -0
- package/src/execution/__tests__/MessageThread.test.tsx +97 -0
- package/src/execution/__tests__/TerminalSession.test.tsx +71 -1
- package/src/execution/__tests__/ToolCallDetail.test.tsx +33 -1
- package/src/execution/__tests__/ToolCallItem.test.tsx +299 -11
- package/src/execution/__tests__/ToolRunGroup.test.tsx +41 -9
- package/src/execution/__tests__/message-thread-slots.test.tsx +92 -0
- package/src/execution/__tests__/tool-presenter.test.tsx +41 -4
- package/src/execution/index.ts +8 -2
- package/src/execution/tool-categories.ts +72 -8
- package/src/execution/tool-presenter.ts +22 -1
- package/src/execution/useArtifactInspection.ts +4 -8
- package/src/execution/useCreateAgentExecution.ts +3 -2
- package/src/iam-policy/GrantAccessForm.tsx +2 -18
- package/src/iam-policy/OrgMembersPanel.tsx +3 -19
- package/src/iam-policy/RoleSelector.tsx +8 -1
- package/src/identity-provider/CreateIdentityProviderForm.tsx +13 -31
- package/src/identity-provider/IdentityProviderDetailPanel.tsx +24 -49
- package/src/identity-provider/IdentityProviderListPanel.tsx +2 -18
- package/src/identity-provider/IdentityProviderWizard.tsx +15 -32
- package/src/identity-provider/SsoLoginPrompt.tsx +6 -21
- package/src/index.ts +23 -1
- package/src/internal/DecisionButton.tsx +1 -20
- package/src/internal/SpinnerIcon.tsx +42 -0
- package/src/internal/__tests__/ThreadCardShell.test.tsx +43 -7
- package/src/internal/__tests__/useCopyFeedback.test.ts +92 -0
- package/src/internal/isUnimplemented.ts +26 -0
- package/src/internal/select-element-text.ts +17 -0
- package/src/internal/thread-card/ThreadCardShell.tsx +53 -21
- package/src/internal/thread-card/glyphs.tsx +24 -3
- package/src/internal/thread-card/index.ts +1 -0
- package/src/internal/useCopyFeedback.ts +61 -0
- package/src/invitation/InvitationCreatedAlert.tsx +10 -18
- package/src/invitation/InvitationManager.tsx +23 -34
- package/src/invitation/InvitationRedemption.tsx +2 -18
- package/src/library/useExportResource.ts +15 -29
- package/src/manifest/ApplyManifestDialog.tsx +1 -1
- package/src/manifest/EditResourceYamlDialog.tsx +1 -1
- package/src/mcp-server/DefinitionDriftNotice.tsx +120 -0
- package/src/mcp-server/McpServerConnectDialog.tsx +30 -12
- package/src/mcp-server/McpServerDetailView.tsx +58 -26
- package/src/mcp-server/OAuthAppForm.tsx +2 -18
- package/src/mcp-server/__tests__/DefinitionDriftNotice.test.tsx +57 -0
- package/src/mcp-server/__tests__/VendorApprovalBlocked.surfaces.test.tsx +103 -5
- package/src/mcp-server/__tests__/byoaEditionDegradation.test.tsx +323 -0
- package/src/mcp-server/__tests__/definitionDrift.test.ts +245 -0
- package/src/mcp-server/__tests__/mcpServerToInput.test.ts +201 -0
- package/src/mcp-server/__tests__/useMcpServerCredentials.test.tsx +306 -0
- package/src/mcp-server/__tests__/useMcpServerDefinitionDrift.test.tsx +173 -0
- package/src/mcp-server/internal/definitionDrift.ts +158 -0
- package/src/mcp-server/internal/mcpServerToInput.ts +3 -0
- package/src/mcp-server/steps/EnvironmentAuthStep.tsx +19 -19
- package/src/mcp-server/steps/IdentityTransportStep.tsx +24 -23
- package/src/mcp-server/useMcpServerConnect.ts +1 -1
- package/src/mcp-server/useMcpServerCredentials.ts +87 -19
- package/src/mcp-server/useMcpServerDefinitionDrift.ts +95 -0
- package/src/mcp-server/useOrgOAuthApp.ts +54 -8
- package/src/models/ModelRegistryContext.ts +7 -1
- package/src/models/ModelSelector.tsx +37 -0
- package/src/models/__tests__/ModelSelector-visionIndicator.test.tsx +129 -0
- package/src/models/__tests__/resolveDefaultModel.test.ts +115 -0
- package/src/models/__tests__/useModelRegistry.test.tsx +99 -4
- package/src/models/index.ts +2 -2
- package/src/models/registry.ts +196 -29
- package/src/models/useModelRegistry.ts +10 -2
- package/src/oauth-app/CreateOAuthAppForm.tsx +16 -31
- package/src/oauth-app/OAuthAppDetailPanel.tsx +16 -31
- package/src/organization/CreateOrganizationForm.tsx +10 -29
- package/src/organization/OrgProfilePanel.tsx +13 -44
- package/src/platform-client/CreatePlatformClientForm.tsx +9 -29
- package/src/platform-client/PlatformClientDetailPanel.tsx +10 -30
- package/src/platform-client/PlatformClientListPanel.tsx +2 -18
- package/src/platform-client/PlatformClientSecretAlert.tsx +26 -55
- package/src/provider.tsx +76 -33
- package/src/resource-creation/WizardNav.tsx +2 -18
- package/src/resource-detail/ConfirmDialog.tsx +1 -1
- package/src/resource-detail/useCopyResource.ts +17 -23
- package/src/schedule/ScheduleDetailView.tsx +2 -18
- package/src/schedule/ScheduleForm.tsx +19 -34
- package/src/session/NewSessionViewer.tsx +85 -7
- package/src/session/SessionViewer.tsx +120 -17
- package/src/session/__tests__/audienceWiring.test.tsx +76 -0
- package/src/session/__tests__/panelNegotiation.test.tsx +302 -0
- package/src/session/__tests__/useNewSessionFlow.test.tsx +134 -5
- package/src/session/__tests__/useSessionPageFlow.autoApprove.test.tsx +74 -0
- package/src/session/__tests__/useSessionPageFlow.runConfig.test.tsx +157 -0
- package/src/session/__tests__/useSessionPanel.test.ts +114 -0
- package/src/session/audience.ts +18 -0
- package/src/session/index.ts +2 -1
- package/src/session/run-config.ts +59 -0
- package/src/session/useNewSessionFlow.ts +39 -2
- package/src/session/useSessionConversation.ts +14 -10
- package/src/session/useSessionPageFlow.ts +51 -10
- package/src/session/useSessionPanel.ts +91 -10
- package/src/settings/ApiKeysSection.tsx +4 -3
- package/src/settings/ChannelAppsSection.tsx +4 -3
- package/src/settings/EnvironmentsSection.tsx +8 -5
- package/src/settings/IdentityProvidersSection.tsx +4 -3
- package/src/settings/InvitationsSection.tsx +4 -2
- package/src/settings/MembersSection.tsx +4 -2
- package/src/settings/OAuthAppsSection.tsx +4 -3
- package/src/settings/OrgProfileSection.tsx +4 -3
- package/src/settings/PlatformClientsSection.tsx +4 -3
- package/src/settings/UsageSection.tsx +4 -2
- package/src/sharing/ShareAgentDialog.tsx +28 -10
- package/src/sidebar/__tests__/WorkspaceSidebar.test.tsx +4 -1
- package/src/sidebar/chrome.tsx +6 -6
- package/src/skill/SkillDiffDialog.tsx +1 -1
- package/src/skill/useSkillVersions.ts +1 -11
- package/src/styles.css +43 -0
- package/src/version-history/VersionTimelineEntry.tsx +1 -21
- package/src/workflow/FailedRunsWidget.tsx +2 -9
- package/src/workflow/PendingApprovalsWidget.tsx +2 -9
- package/src/workflow/ViewYamlDialog.tsx +7 -22
- package/src/workflow/WorkflowArchitectDialog.tsx +8 -27
- package/src/workflow/WorkflowArtifactDocument.tsx +5 -9
- package/src/workflow/WorkflowCanvasEditor.tsx +39 -7
- package/src/workflow/WorkflowCanvasInner.tsx +14 -1
- package/src/workflow/WorkflowDiffGraph.tsx +7 -1
- package/src/workflow/WorkflowExecutionGraph.tsx +26 -1
- package/src/workflow/WorkflowExecutionViewer.tsx +115 -24
- package/src/workflow/WorkflowExplainDialog.tsx +8 -24
- package/src/workflow/WorkflowNode.tsx +5 -2
- package/src/workflow/WorkflowOverviewGraph.tsx +9 -1
- package/src/workflow/WorkflowRefinePanel.tsx +2 -18
- package/src/workflow/WorkflowRepairCard.tsx +2 -18
- package/src/workflow/WorkflowRunDialog.tsx +31 -24
- package/src/workflow/WorkflowTaskApprovalSummary.tsx +2 -17
- package/src/workflow/WorkflowVersionBadge.tsx +4 -13
- package/src/workflow/WorkflowVersionTimeline.tsx +1 -25
- package/src/workflow/__tests__/WorkflowExecutionViewer.reconciliation.test.tsx +48 -1
- package/src/workflow/__tests__/WorkflowNode.test.tsx +93 -0
- package/src/workflow/__tests__/WorkflowRunDialog.test.tsx +127 -0
- package/src/workflow/__tests__/graph-history.test.ts +103 -0
- package/src/workflow/__tests__/overview-graph.test.ts +17 -0
- package/src/workflow/__tests__/panelNegotiation.test.tsx +230 -0
- package/src/workflow/__tests__/useCanvasKeyboardShortcuts.undo.test.ts +115 -0
- package/src/workflow/__tests__/useWorkflowCanvas.dirty.test.tsx +178 -0
- package/src/workflow/__tests__/useWorkflowCanvas.drag.test.tsx +224 -0
- package/src/workflow/__tests__/useWorkflowCanvas.undo.test.tsx +133 -0
- package/src/workflow/__tests__/useWorkflowExecutionPanel.test.ts +100 -0
- package/src/workflow/execution-comparison/ExecutionComparisonPicker.tsx +7 -11
- package/src/workflow/execution-history/ExecutionHistoryTable.tsx +1 -25
- package/src/workflow/index.ts +1 -0
- package/src/workflow/instance/CreateWorkflowInstanceDialog.tsx +17 -8
- package/src/workflow/instance/WorkflowInstanceDetailPanel.tsx +2 -1
- package/src/workflow/instance/useDeleteWorkflowInstance.ts +9 -4
- package/src/workflow/layout/registry-dimensions.ts +2 -5
- package/src/workflow/node-shell/NodeShell.tsx +4 -0
- package/src/workflow/picker/BranchAddPopover.tsx +4 -3
- package/src/workflow/task-type-visual-registry.ts +5 -3
- package/src/workflow/templates/WorkflowTemplatePreview.tsx +1 -1
- package/src/workflow/useApprovalBoundary.ts +1 -1
- package/src/workflow/useCanvasKeyboardShortcuts.ts +33 -3
- package/src/workflow/useGraphHistory.ts +22 -41
- package/src/workflow/useWorkflowCanvas.ts +126 -21
- package/src/workflow/useWorkflowExecutionPanel.ts +95 -13
- package/src/workflow/useWorkflowSave.ts +2 -15
- package/src/workflow/workflow-graph-conversions.ts +25 -3
- package/styles.css +1 -1
- package/version-history/VersionTimelineEntry.d.ts.map +1 -1
- package/version-history/VersionTimelineEntry.js +1 -23
- package/version-history/VersionTimelineEntry.js.map +1 -1
- package/workflow/CanvasTransitionEdge.d.ts +1 -1
- package/workflow/FailedRunsWidget.d.ts.map +1 -1
- package/workflow/FailedRunsWidget.js +2 -11
- package/workflow/FailedRunsWidget.js.map +1 -1
- package/workflow/PendingApprovalsWidget.d.ts.map +1 -1
- package/workflow/PendingApprovalsWidget.js +2 -11
- package/workflow/PendingApprovalsWidget.js.map +1 -1
- package/workflow/ViewYamlDialog.d.ts.map +1 -1
- package/workflow/ViewYamlDialog.js +7 -23
- package/workflow/ViewYamlDialog.js.map +1 -1
- package/workflow/WorkflowArchitectDialog.d.ts.map +1 -1
- package/workflow/WorkflowArchitectDialog.js +7 -11
- package/workflow/WorkflowArchitectDialog.js.map +1 -1
- package/workflow/WorkflowArtifactDocument.d.ts.map +1 -1
- package/workflow/WorkflowArtifactDocument.js +5 -8
- package/workflow/WorkflowArtifactDocument.js.map +1 -1
- package/workflow/WorkflowCanvasEditor.d.ts.map +1 -1
- package/workflow/WorkflowCanvasEditor.js +31 -6
- package/workflow/WorkflowCanvasEditor.js.map +1 -1
- package/workflow/WorkflowCanvasInner.d.ts +4 -2
- package/workflow/WorkflowCanvasInner.d.ts.map +1 -1
- package/workflow/WorkflowCanvasInner.js +7 -3
- package/workflow/WorkflowCanvasInner.js.map +1 -1
- package/workflow/WorkflowDiffGraph.js +6 -2
- package/workflow/WorkflowDiffGraph.js.map +1 -1
- package/workflow/WorkflowExecutionGraph.d.ts.map +1 -1
- package/workflow/WorkflowExecutionGraph.js +27 -1
- package/workflow/WorkflowExecutionGraph.js.map +1 -1
- package/workflow/WorkflowExecutionViewer.d.ts +51 -0
- package/workflow/WorkflowExecutionViewer.d.ts.map +1 -1
- package/workflow/WorkflowExecutionViewer.js +49 -18
- package/workflow/WorkflowExecutionViewer.js.map +1 -1
- package/workflow/WorkflowExplainDialog.d.ts.map +1 -1
- package/workflow/WorkflowExplainDialog.js +6 -8
- package/workflow/WorkflowExplainDialog.js.map +1 -1
- package/workflow/WorkflowNode.d.ts.map +1 -1
- package/workflow/WorkflowNode.js +2 -2
- package/workflow/WorkflowNode.js.map +1 -1
- package/workflow/WorkflowOverviewGraph.js +8 -2
- package/workflow/WorkflowOverviewGraph.js.map +1 -1
- package/workflow/WorkflowRefinePanel.d.ts.map +1 -1
- package/workflow/WorkflowRefinePanel.js +2 -4
- package/workflow/WorkflowRefinePanel.js.map +1 -1
- package/workflow/WorkflowRepairCard.d.ts.map +1 -1
- package/workflow/WorkflowRepairCard.js +2 -4
- package/workflow/WorkflowRepairCard.js.map +1 -1
- package/workflow/WorkflowRunDialog.d.ts +11 -1
- package/workflow/WorkflowRunDialog.d.ts.map +1 -1
- package/workflow/WorkflowRunDialog.js +18 -9
- package/workflow/WorkflowRunDialog.js.map +1 -1
- package/workflow/WorkflowTaskApprovalSummary.d.ts.map +1 -1
- package/workflow/WorkflowTaskApprovalSummary.js +2 -4
- package/workflow/WorkflowTaskApprovalSummary.js.map +1 -1
- package/workflow/WorkflowVersionBadge.d.ts.map +1 -1
- package/workflow/WorkflowVersionBadge.js +4 -13
- package/workflow/WorkflowVersionBadge.js.map +1 -1
- package/workflow/WorkflowVersionTimeline.d.ts.map +1 -1
- package/workflow/WorkflowVersionTimeline.js +1 -26
- package/workflow/WorkflowVersionTimeline.js.map +1 -1
- package/workflow/execution-comparison/ExecutionComparisonPicker.d.ts.map +1 -1
- package/workflow/execution-comparison/ExecutionComparisonPicker.js +7 -15
- package/workflow/execution-comparison/ExecutionComparisonPicker.js.map +1 -1
- package/workflow/execution-history/ExecutionHistoryTable.d.ts.map +1 -1
- package/workflow/execution-history/ExecutionHistoryTable.js +1 -24
- package/workflow/execution-history/ExecutionHistoryTable.js.map +1 -1
- package/workflow/index.d.ts +1 -1
- package/workflow/index.d.ts.map +1 -1
- package/workflow/index.js.map +1 -1
- package/workflow/instance/CreateWorkflowInstanceDialog.d.ts.map +1 -1
- package/workflow/instance/CreateWorkflowInstanceDialog.js +10 -2
- package/workflow/instance/CreateWorkflowInstanceDialog.js.map +1 -1
- package/workflow/instance/WorkflowInstanceDetailPanel.d.ts.map +1 -1
- package/workflow/instance/WorkflowInstanceDetailPanel.js +1 -1
- package/workflow/instance/WorkflowInstanceDetailPanel.js.map +1 -1
- package/workflow/instance/useDeleteWorkflowInstance.d.ts +9 -4
- package/workflow/instance/useDeleteWorkflowInstance.d.ts.map +1 -1
- package/workflow/instance/useDeleteWorkflowInstance.js +4 -2
- package/workflow/instance/useDeleteWorkflowInstance.js.map +1 -1
- package/workflow/layout/registry-dimensions.d.ts.map +1 -1
- package/workflow/layout/registry-dimensions.js +2 -5
- package/workflow/layout/registry-dimensions.js.map +1 -1
- package/workflow/node-shell/NodeShell.js +1 -1
- package/workflow/node-shell/NodeShell.js.map +1 -1
- package/workflow/picker/BranchAddPopover.d.ts.map +1 -1
- package/workflow/picker/BranchAddPopover.js +3 -2
- package/workflow/picker/BranchAddPopover.js.map +1 -1
- package/workflow/task-type-visual-registry.d.ts.map +1 -1
- package/workflow/task-type-visual-registry.js +5 -3
- package/workflow/task-type-visual-registry.js.map +1 -1
- package/workflow/templates/WorkflowTemplatePreview.js +1 -1
- package/workflow/useApprovalBoundary.d.ts +1 -1
- package/workflow/useApprovalBoundary.js +1 -1
- package/workflow/useCanvasKeyboardShortcuts.d.ts +15 -4
- package/workflow/useCanvasKeyboardShortcuts.d.ts.map +1 -1
- package/workflow/useCanvasKeyboardShortcuts.js +25 -4
- package/workflow/useCanvasKeyboardShortcuts.js.map +1 -1
- package/workflow/useGraphHistory.d.ts +16 -9
- package/workflow/useGraphHistory.d.ts.map +1 -1
- package/workflow/useGraphHistory.js +19 -33
- package/workflow/useGraphHistory.js.map +1 -1
- package/workflow/useWorkflowCanvas.d.ts +6 -4
- package/workflow/useWorkflowCanvas.d.ts.map +1 -1
- package/workflow/useWorkflowCanvas.js +115 -23
- package/workflow/useWorkflowCanvas.js.map +1 -1
- package/workflow/useWorkflowExecutionPanel.d.ts +38 -2
- package/workflow/useWorkflowExecutionPanel.d.ts.map +1 -1
- package/workflow/useWorkflowExecutionPanel.js +46 -13
- package/workflow/useWorkflowExecutionPanel.js.map +1 -1
- package/workflow/useWorkflowSave.d.ts.map +1 -1
- package/workflow/useWorkflowSave.js +2 -15
- package/workflow/useWorkflowSave.js.map +1 -1
- package/workflow/workflow-graph-conversions.d.ts +19 -1
- package/workflow/workflow-graph-conversions.d.ts.map +1 -1
- package/workflow/workflow-graph-conversions.js +17 -3
- package/workflow/workflow-graph-conversions.js.map +1 -1
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
import {
|
|
17
17
|
useWorkflowExecutionPanel,
|
|
18
18
|
workflowArtifactTabPath,
|
|
19
|
+
type UseWorkflowExecutionPanelOptions,
|
|
19
20
|
} from "../useWorkflowExecutionPanel";
|
|
20
21
|
|
|
21
22
|
function artifact(id: string, displayName: string) {
|
|
@@ -238,3 +239,102 @@ describe("useWorkflowExecutionPanel openDiagnosis", () => {
|
|
|
238
239
|
);
|
|
239
240
|
});
|
|
240
241
|
});
|
|
242
|
+
|
|
243
|
+
// ---------------------------------------------------------------------------
|
|
244
|
+
// The controlled/observable open-state seam — the #651 contract mirrored from
|
|
245
|
+
// useSessionPanel (#654). The panel opens ITSELF (Diagnose, artifact/change
|
|
246
|
+
// opens), so onOpenChange fires in BOTH modes; controlled mode surfaces
|
|
247
|
+
// requests without applying them, and a declined request stays re-fireable.
|
|
248
|
+
// ---------------------------------------------------------------------------
|
|
249
|
+
|
|
250
|
+
function renderSeamPanel(initial?: UseWorkflowExecutionPanelOptions) {
|
|
251
|
+
return renderHook(
|
|
252
|
+
(opts: UseWorkflowExecutionPanelOptions) => useWorkflowExecutionPanel(opts),
|
|
253
|
+
{ initialProps: { ...initial } as UseWorkflowExecutionPanelOptions },
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
describe("useWorkflowExecutionPanel — observed open state (uncontrolled + onOpenChange)", () => {
|
|
258
|
+
it("reports the chip toggle without taking control", () => {
|
|
259
|
+
const seen: boolean[] = [];
|
|
260
|
+
const { result } = renderSeamPanel({ onOpenChange: (o) => seen.push(o) });
|
|
261
|
+
act(() => result.current.openPanel());
|
|
262
|
+
expect(result.current.isOpen).toBe(true);
|
|
263
|
+
act(() => result.current.closePanel());
|
|
264
|
+
expect(result.current.isOpen).toBe(false);
|
|
265
|
+
expect(seen).toEqual([true, false]);
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
it("reports internal open intents (openDiagnosis, openArtifact), once per actual transition", () => {
|
|
269
|
+
const seen: boolean[] = [];
|
|
270
|
+
const { result } = renderSeamPanel({ onOpenChange: (o) => seen.push(o) });
|
|
271
|
+
act(() => result.current.openDiagnosis());
|
|
272
|
+
// Already open — further open intents are not transitions.
|
|
273
|
+
act(() => result.current.openArtifact(artifact("art_1", "report.json")));
|
|
274
|
+
act(() => result.current.openPanel());
|
|
275
|
+
expect(seen).toEqual([true]);
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
it("starts open when defaultOpen is set, without a spurious notification", () => {
|
|
279
|
+
const seen: boolean[] = [];
|
|
280
|
+
const { result } = renderSeamPanel({
|
|
281
|
+
defaultOpen: true,
|
|
282
|
+
onOpenChange: (o) => seen.push(o),
|
|
283
|
+
});
|
|
284
|
+
expect(result.current.isOpen).toBe(true);
|
|
285
|
+
expect(seen).toEqual([]);
|
|
286
|
+
});
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
describe("useWorkflowExecutionPanel — controlled open state", () => {
|
|
290
|
+
it("follows the host's open value and ignores defaultOpen", () => {
|
|
291
|
+
const { result, rerender } = renderSeamPanel({ open: false, defaultOpen: true });
|
|
292
|
+
expect(result.current.isOpen).toBe(false);
|
|
293
|
+
rerender({ open: true, defaultOpen: true });
|
|
294
|
+
expect(result.current.isOpen).toBe(true);
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
it("surfaces intents through onOpenChange without flipping state itself", () => {
|
|
298
|
+
const seen: boolean[] = [];
|
|
299
|
+
const onOpenChange = (o: boolean) => seen.push(o);
|
|
300
|
+
const { result, rerender } = renderSeamPanel({ open: false, onOpenChange });
|
|
301
|
+
act(() => result.current.openPanel());
|
|
302
|
+
expect(seen).toEqual([true]);
|
|
303
|
+
expect(result.current.isOpen).toBe(false);
|
|
304
|
+
// The host grants the request.
|
|
305
|
+
rerender({ open: true, onOpenChange });
|
|
306
|
+
expect(result.current.isOpen).toBe(true);
|
|
307
|
+
act(() => result.current.closePanel());
|
|
308
|
+
expect(seen).toEqual([true, false]);
|
|
309
|
+
expect(result.current.isOpen).toBe(true);
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
it("re-fires a declined request (once per request, not per transition)", () => {
|
|
313
|
+
const seen: boolean[] = [];
|
|
314
|
+
const onOpenChange = (o: boolean) => seen.push(o);
|
|
315
|
+
const { result } = renderSeamPanel({ open: false, onOpenChange });
|
|
316
|
+
act(() => result.current.openArtifact(artifact("art_1", "a.json")));
|
|
317
|
+
// The host declined (open stayed false) — a later intent must re-fire,
|
|
318
|
+
// not be swallowed by a stale "already requested" memory.
|
|
319
|
+
act(() => result.current.openFileChange(fileChange("src/a.ts")));
|
|
320
|
+
expect(seen).toEqual([true, true]);
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
it("Diagnose is reported, not applied — but the tab is pinned and ready", () => {
|
|
324
|
+
const seen: boolean[] = [];
|
|
325
|
+
const onOpenChange = (o: boolean) => seen.push(o);
|
|
326
|
+
const { result } = renderSeamPanel({ open: false, onOpenChange });
|
|
327
|
+
act(() => result.current.openDiagnosis());
|
|
328
|
+
expect(seen).toEqual([true]);
|
|
329
|
+
expect(result.current.isOpen).toBe(false);
|
|
330
|
+
// Tab state stays SDK-owned: the diagnosis tab is pinned regardless, so
|
|
331
|
+
// the moment the host opens the panel the conversation greets the user.
|
|
332
|
+
expect(result.current.editorsStore.getSnapshot().editors).toEqual([
|
|
333
|
+
{
|
|
334
|
+
entryId: DIAGNOSIS_DOCUMENT_ENTRY_ID,
|
|
335
|
+
path: DIAGNOSIS_DOCUMENT_PATH,
|
|
336
|
+
preview: false,
|
|
337
|
+
},
|
|
338
|
+
]);
|
|
339
|
+
});
|
|
340
|
+
});
|
|
@@ -6,6 +6,7 @@ import { ExecutionPhase } from "@stigmer/protos/ai/stigmer/agentic/workflowexecu
|
|
|
6
6
|
import { useWorkflowExecutionList } from "../useWorkflowExecutionList.js";
|
|
7
7
|
import { WorkflowExecutionPhaseBadge } from "../WorkflowExecutionPhaseBadge.js";
|
|
8
8
|
import { formatDuration } from "../format-utils.js";
|
|
9
|
+
import { formatRelativeTime } from "../../activity/format-relative-time.js";
|
|
9
10
|
|
|
10
11
|
/** Props for {@link ExecutionComparisonPicker}. */
|
|
11
12
|
export interface ExecutionComparisonPickerProps {
|
|
@@ -119,7 +120,7 @@ export const ExecutionComparisonPicker = memo(function ExecutionComparisonPicker
|
|
|
119
120
|
ref={dialogRef}
|
|
120
121
|
className={cn(
|
|
121
122
|
"stgm stg:m-auto stg:max-h-[70vh] stg:w-full stg:max-w-md stg:rounded-lg stg:border stg:border-[var(--stgm-border,#e5e5e5)] stg:bg-[var(--stgm-background,#fff)] stg:p-0 stg:shadow-xl",
|
|
122
|
-
"stg:backdrop:bg-
|
|
123
|
+
"stg:backdrop:bg-backdrop",
|
|
123
124
|
)}
|
|
124
125
|
onClick={handleBackdropClick}
|
|
125
126
|
aria-label="Select execution to compare"
|
|
@@ -183,7 +184,7 @@ export const ExecutionComparisonPicker = memo(function ExecutionComparisonPicker
|
|
|
183
184
|
{name}
|
|
184
185
|
</span>
|
|
185
186
|
<span className="stg:text-[10px] stg:text-[var(--stgm-muted-foreground,#737373)]">
|
|
186
|
-
{startedAt ?
|
|
187
|
+
{startedAt ? formatStartedAt(startedAt) : "—"}
|
|
187
188
|
{durationMs != null && ` · ${formatDuration(durationMs)}`}
|
|
188
189
|
</span>
|
|
189
190
|
</div>
|
|
@@ -228,13 +229,8 @@ function getDurationMs(startedAt: string | undefined, completedAt: string | unde
|
|
|
228
229
|
return e - s;
|
|
229
230
|
}
|
|
230
231
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
const diff = now - d.getTime();
|
|
236
|
-
if (diff < 60_000) return "just now";
|
|
237
|
-
if (diff < 3_600_000) return `${Math.floor(diff / 60_000)}m ago`;
|
|
238
|
-
if (diff < 86_400_000) return `${Math.floor(diff / 3_600_000)}h ago`;
|
|
239
|
-
return d.toLocaleDateString(undefined, { month: "short", day: "numeric" });
|
|
232
|
+
/** ISO wire value → the shared compact stamp; unparseable renders as absent. */
|
|
233
|
+
function formatStartedAt(iso: string): string {
|
|
234
|
+
const date = new Date(iso);
|
|
235
|
+
return Number.isNaN(date.getTime()) ? "—" : formatRelativeTime(date);
|
|
240
236
|
}
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
} from "./derive-execution-row.js";
|
|
13
13
|
import { Tooltip, TooltipContent, TooltipTrigger } from "../../internal/tooltip.js";
|
|
14
14
|
import { TruncatedText } from "../../internal/truncated-text.js";
|
|
15
|
+
import { formatRelativeTime } from "../../activity/format-relative-time.js";
|
|
15
16
|
|
|
16
17
|
// ---------------------------------------------------------------------------
|
|
17
18
|
// Column definitions
|
|
@@ -436,28 +437,3 @@ function LoadingSkeleton({
|
|
|
436
437
|
</div>
|
|
437
438
|
);
|
|
438
439
|
}
|
|
439
|
-
|
|
440
|
-
// ---------------------------------------------------------------------------
|
|
441
|
-
// Relative time formatter
|
|
442
|
-
// ---------------------------------------------------------------------------
|
|
443
|
-
|
|
444
|
-
function formatRelativeTime(date: Date): string {
|
|
445
|
-
const now = Date.now();
|
|
446
|
-
const diff = now - date.getTime();
|
|
447
|
-
|
|
448
|
-
if (diff < 0) return date.toLocaleString();
|
|
449
|
-
if (diff < 60_000) return "just now";
|
|
450
|
-
if (diff < 3_600_000) {
|
|
451
|
-
const mins = Math.floor(diff / 60_000);
|
|
452
|
-
return `${mins}m ago`;
|
|
453
|
-
}
|
|
454
|
-
if (diff < 86_400_000) {
|
|
455
|
-
const hours = Math.floor(diff / 3_600_000);
|
|
456
|
-
return `${hours}h ago`;
|
|
457
|
-
}
|
|
458
|
-
if (diff < 604_800_000) {
|
|
459
|
-
const days = Math.floor(diff / 86_400_000);
|
|
460
|
-
return `${days}d ago`;
|
|
461
|
-
}
|
|
462
|
-
return date.toLocaleDateString();
|
|
463
|
-
}
|
package/src/workflow/index.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import { useCallback, useRef, useState } from "react";
|
|
3
|
+
import { useCallback, useId, useRef, useState } from "react";
|
|
4
4
|
import { cn } from "@stigmer/theme";
|
|
5
5
|
import { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
|
|
6
6
|
import type { WorkflowInstance } from "@stigmer/protos/ai/stigmer/agentic/workflowinstance/v1/api_pb";
|
|
@@ -42,6 +42,15 @@ export function CreateWorkflowInstanceDialog({
|
|
|
42
42
|
const dialogRef = useRef<HTMLDialogElement>(null);
|
|
43
43
|
const { create, isCreating, error, clearError } = useCreateWorkflowInstance();
|
|
44
44
|
|
|
45
|
+
// Instance-scoped element ids (oss#571): a reusable component must not
|
|
46
|
+
// hardcode DOM ids — hosts legitimately mount this dialog more than once
|
|
47
|
+
// per page (e.g. zone-cached detail pages), and duplicate ids silently
|
|
48
|
+
// break the label→input association for every copy after the first.
|
|
49
|
+
const baseId = useId();
|
|
50
|
+
const titleId = `${baseId}-title`;
|
|
51
|
+
const nameId = `${baseId}-name`;
|
|
52
|
+
const descriptionId = `${baseId}-description`;
|
|
53
|
+
|
|
45
54
|
const [name, setName] = useState("");
|
|
46
55
|
const [description, setDescription] = useState("");
|
|
47
56
|
const [environmentRefs, setEnvironmentRefs] = useState<ResourceRef[]>([]);
|
|
@@ -106,14 +115,14 @@ export function CreateWorkflowInstanceDialog({
|
|
|
106
115
|
onClose={handleClose}
|
|
107
116
|
className={cn(
|
|
108
117
|
"stg:fixed stg:inset-0 stg:m-auto stg:w-full stg:max-w-lg stg:rounded-xl stg:border stg:border-border stg:bg-popover stg:p-0 stg:shadow-xl",
|
|
109
|
-
"stg:backdrop:bg-
|
|
118
|
+
"stg:backdrop:bg-backdrop",
|
|
110
119
|
)}
|
|
111
|
-
aria-labelledby=
|
|
120
|
+
aria-labelledby={titleId}
|
|
112
121
|
>
|
|
113
122
|
<form onSubmit={handleSubmit} className="stg:flex stg:flex-col">
|
|
114
123
|
{/* Header */}
|
|
115
124
|
<div className="stg:flex stg:items-center stg:justify-between stg:border-b stg:border-border stg:px-6 stg:py-4">
|
|
116
|
-
<h2 id=
|
|
125
|
+
<h2 id={titleId} className="stg:text-base stg:font-semibold stg:text-foreground">
|
|
117
126
|
Create Workflow Instance
|
|
118
127
|
</h2>
|
|
119
128
|
<button
|
|
@@ -134,11 +143,11 @@ export function CreateWorkflowInstanceDialog({
|
|
|
134
143
|
<div className="stg:space-y-5 stg:px-6 stg:py-5">
|
|
135
144
|
{/* Name */}
|
|
136
145
|
<div>
|
|
137
|
-
<label htmlFor=
|
|
146
|
+
<label htmlFor={nameId} className="stg:block stg:text-sm stg:font-medium stg:text-foreground stg:mb-1.5">
|
|
138
147
|
Name <span className="stg:text-destructive">*</span>
|
|
139
148
|
</label>
|
|
140
149
|
<input
|
|
141
|
-
id=
|
|
150
|
+
id={nameId}
|
|
142
151
|
type="text"
|
|
143
152
|
required
|
|
144
153
|
value={name}
|
|
@@ -160,11 +169,11 @@ export function CreateWorkflowInstanceDialog({
|
|
|
160
169
|
|
|
161
170
|
{/* Description */}
|
|
162
171
|
<div>
|
|
163
|
-
<label htmlFor=
|
|
172
|
+
<label htmlFor={descriptionId} className="stg:block stg:text-sm stg:font-medium stg:text-foreground stg:mb-1.5">
|
|
164
173
|
Description
|
|
165
174
|
</label>
|
|
166
175
|
<textarea
|
|
167
|
-
id=
|
|
176
|
+
id={descriptionId}
|
|
168
177
|
value={description}
|
|
169
178
|
onChange={(e) => setDescription(e.target.value)}
|
|
170
179
|
placeholder="What is this instance used for?"
|
|
@@ -296,7 +296,8 @@ export function WorkflowInstanceDetailPanel({
|
|
|
296
296
|
) : (
|
|
297
297
|
<div className="stg:space-y-2 stg:rounded-md stg:border stg:border-destructive/30 stg:p-3 stg:bg-destructive/5">
|
|
298
298
|
<p className="stg:text-xs stg:text-destructive stg:font-medium">
|
|
299
|
-
This
|
|
299
|
+
This permanently removes the instance and its environment bindings. Executions
|
|
300
|
+
already run against it are preserved in the workflow's execution history.
|
|
300
301
|
This action cannot be undone.
|
|
301
302
|
</p>
|
|
302
303
|
{deleteError && (
|
|
@@ -10,8 +10,11 @@ export interface UseDeleteWorkflowInstanceReturn {
|
|
|
10
10
|
/**
|
|
11
11
|
* Delete a workflow instance by ID. Returns the deleted resource.
|
|
12
12
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
13
|
+
* Deletion does NOT cascade to executions: runs already created
|
|
14
|
+
* against the instance are preserved and stay visible in the parent
|
|
15
|
+
* workflow's execution history (every execution carries a
|
|
16
|
+
* denormalized workflow reference). Only the instance itself — its
|
|
17
|
+
* environment bindings and configuration — is removed.
|
|
15
18
|
*/
|
|
16
19
|
readonly deleteInstance: (id: string) => Promise<WorkflowInstance>;
|
|
17
20
|
/** `true` while the delete request is in flight. */
|
|
@@ -29,8 +32,10 @@ export interface UseDeleteWorkflowInstanceReturn {
|
|
|
29
32
|
* The caller is responsible for handling post-delete UI updates
|
|
30
33
|
* (e.g., refreshing the instance list, closing a detail panel).
|
|
31
34
|
*
|
|
32
|
-
* Deletion
|
|
33
|
-
*
|
|
35
|
+
* Deletion is instance-only on both editions — executions are NOT
|
|
36
|
+
* cascaded (deliberate platform posture: they keep a denormalized
|
|
37
|
+
* workflow reference and remain in the workflow's execution history).
|
|
38
|
+
* Confirmation UI must not claim execution history is deleted.
|
|
34
39
|
*
|
|
35
40
|
* @example
|
|
36
41
|
* ```tsx
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { getVisualSpec } from "../task-type-visual-registry.js";
|
|
2
|
-
import {
|
|
3
|
-
import { START_NODE_ID, END_NODE_ID } from "../workflow-graph-model.js";
|
|
2
|
+
import { graphNodeKindString } from "../workflow-graph-conversions.js";
|
|
4
3
|
import type { WorkflowGraphNode } from "../workflow-graph-model.js";
|
|
5
4
|
import type { NodeDimensions } from "./types.js";
|
|
6
5
|
|
|
@@ -23,8 +22,6 @@ import type { NodeDimensions } from "./types.js";
|
|
|
23
22
|
* wrapping in `useCallback` (DD-010).
|
|
24
23
|
*/
|
|
25
24
|
export function registryNodeDimensions(node: WorkflowGraphNode): NodeDimensions {
|
|
26
|
-
const
|
|
27
|
-
const kindKey = isSentinel ? node.id : taskKindToString(node.kind);
|
|
28
|
-
const spec = getVisualSpec(kindKey);
|
|
25
|
+
const spec = getVisualSpec(graphNodeKindString(node));
|
|
29
26
|
return { width: spec.defaultWidth, height: spec.defaultHeight + spec.captionHeight };
|
|
30
27
|
}
|
|
@@ -185,6 +185,10 @@ function SvgShell({
|
|
|
185
185
|
height={shapeHeight}
|
|
186
186
|
viewBox={`0 0 ${width} ${shapeHeight}`}
|
|
187
187
|
aria-hidden="true"
|
|
188
|
+
// The stable hook for "this node renders an SVG shape
|
|
189
|
+
// background" — kind icons are also <svg>s, so a bare svg
|
|
190
|
+
// selector cannot distinguish shaped shells from task cards.
|
|
191
|
+
data-cursor-target="node-shape"
|
|
188
192
|
>
|
|
189
193
|
<path
|
|
190
194
|
d={pathD ?? ""}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import { memo, useState, useCallback, useRef, useEffect } from "react";
|
|
3
|
+
import { memo, useState, useCallback, useId, useRef, useEffect } from "react";
|
|
4
4
|
import { Popover } from "@base-ui/react/popover";
|
|
5
5
|
import { cn } from "@stigmer/theme";
|
|
6
6
|
import { useStigmerPortalContainer } from "../../portal-container.js";
|
|
@@ -76,6 +76,7 @@ export const BranchAddPopover = memo(function BranchAddPopover({
|
|
|
76
76
|
side = "bottom",
|
|
77
77
|
align = "start",
|
|
78
78
|
}: BranchAddPopoverProps) {
|
|
79
|
+
const errorId = useId();
|
|
79
80
|
const portalContainer = useStigmerPortalContainer();
|
|
80
81
|
const config = MODE_CONFIG[mode];
|
|
81
82
|
const nameRef = useRef<HTMLInputElement>(null);
|
|
@@ -175,11 +176,11 @@ export const BranchAddPopover = memo(function BranchAddPopover({
|
|
|
175
176
|
nameError ? "stg:border-[var(--stgm-destructive,#ef4444)]" : "stg:border-border",
|
|
176
177
|
)}
|
|
177
178
|
aria-invalid={!!nameError}
|
|
178
|
-
aria-describedby={nameError ?
|
|
179
|
+
aria-describedby={nameError ? errorId : undefined}
|
|
179
180
|
/>
|
|
180
181
|
{nameError && (
|
|
181
182
|
<p
|
|
182
|
-
id=
|
|
183
|
+
id={errorId}
|
|
183
184
|
className="stg:mt-0.5 stg:text-[10px] stg:text-[var(--stgm-destructive,#ef4444)]"
|
|
184
185
|
>
|
|
185
186
|
{nameError}
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
SENTINEL_NODE_WIDTH,
|
|
5
5
|
SENTINEL_NODE_HEIGHT,
|
|
6
6
|
} from "./canvas-constants.js";
|
|
7
|
+
import { START_NODE_ID, END_NODE_ID } from "./workflow-graph-model.js";
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* Semantic shape identifier for workflow nodes.
|
|
@@ -203,9 +204,10 @@ export const VISUAL_REGISTRY: ReadonlyMap<string, TaskTypeVisualSpec> = Object.f
|
|
|
203
204
|
["notification", EVENT_CIRCLE],
|
|
204
205
|
["raise_error", EVENT_CIRCLE],
|
|
205
206
|
|
|
206
|
-
//
|
|
207
|
-
|
|
208
|
-
[
|
|
207
|
+
// Sentinel pseudo-kinds: keyed by the sentinel node ids, which double
|
|
208
|
+
// as the sentinels' kindString (see graphNodeKindString).
|
|
209
|
+
[START_NODE_ID, TERMINAL_PILL],
|
|
210
|
+
[END_NODE_ID, TERMINAL_PILL_END],
|
|
209
211
|
]),
|
|
210
212
|
);
|
|
211
213
|
|
|
@@ -83,7 +83,7 @@ export function WorkflowTemplatePreview({
|
|
|
83
83
|
ref={dialogRef}
|
|
84
84
|
className={cn(
|
|
85
85
|
"stgm stg:m-auto stg:max-h-[85vh] stg:w-full stg:max-w-3xl stg:rounded-lg stg:border stg:border-border stg:bg-background stg:p-0 stg:shadow-lg",
|
|
86
|
-
"stg:backdrop:bg-
|
|
86
|
+
"stg:backdrop:bg-backdrop",
|
|
87
87
|
)}
|
|
88
88
|
>
|
|
89
89
|
<div className="stg:flex stg:flex-col">
|
|
@@ -29,7 +29,7 @@ export interface ApprovalBoundaryCrossing {
|
|
|
29
29
|
* the decision surface (the panel's Inspect Approval tab) is never hidden
|
|
30
30
|
* while the run is blocked.
|
|
31
31
|
*
|
|
32
|
-
* Same diffing shape as
|
|
32
|
+
* Same diffing shape as `useExecutionAnnouncements` (prev-map ref,
|
|
33
33
|
* diff on each map commit). A task first observed already in
|
|
34
34
|
* `waiting_approval` counts as entered — with rAF-coalesced commits the
|
|
35
35
|
* running→waiting transition can collapse into the task's first appearance.
|
|
@@ -19,6 +19,14 @@ export interface UseCanvasKeyboardShortcutsOptions {
|
|
|
19
19
|
readonly copySelection?: () => void;
|
|
20
20
|
readonly pasteAtCenter?: () => void;
|
|
21
21
|
readonly cutSelection?: () => void;
|
|
22
|
+
/**
|
|
23
|
+
* Undo/redo MUST be the orchestrator's canvas-syncing wrappers
|
|
24
|
+
* (`useWorkflowCanvas.undo`/`redo`), never `useGraphHistory`'s raw
|
|
25
|
+
* mutations — a model mutation that skips the React Flow sync leaves
|
|
26
|
+
* the inspector editing a node the canvas doesn't show (oss#588).
|
|
27
|
+
*/
|
|
28
|
+
readonly undo?: () => void;
|
|
29
|
+
readonly redo?: () => void;
|
|
22
30
|
}
|
|
23
31
|
|
|
24
32
|
function isTextInput(target: EventTarget | null): boolean {
|
|
@@ -39,12 +47,15 @@ function isFocusInsideContainer(container: HTMLElement): boolean {
|
|
|
39
47
|
* Canvas-scoped keyboard shortcuts for the workflow editor.
|
|
40
48
|
*
|
|
41
49
|
* Binds shortcuts that are only active when focus is inside the canvas
|
|
42
|
-
* container, using
|
|
43
|
-
*
|
|
44
|
-
* are suppressed when a text input has focus
|
|
50
|
+
* container, using a capture-phase document listener. Shortcuts that
|
|
51
|
+
* collide with native text-editing (undo/redo, copy/paste/cut, bare
|
|
52
|
+
* keys) are suppressed when a text input has focus, so inspector
|
|
53
|
+
* fields keep their native behavior.
|
|
45
54
|
*
|
|
46
55
|
* | Shortcut | Action |
|
|
47
56
|
* |-------------------|---------------------------------------|
|
|
57
|
+
* | `Ctrl/Cmd+Z` | Undo (canvas-synced, see oss#588) |
|
|
58
|
+
* | `Ctrl/Cmd+Shift+Z`| Redo |
|
|
48
59
|
* | `Ctrl/Cmd+D` | Duplicate selected node |
|
|
49
60
|
* | `Ctrl/Cmd+A` | Select all non-sentinel nodes |
|
|
50
61
|
* | `Ctrl/Cmd+C` | Copy selected node(s) to clipboard |
|
|
@@ -66,6 +77,8 @@ export function useCanvasKeyboardShortcuts({
|
|
|
66
77
|
copySelection,
|
|
67
78
|
pasteAtCenter,
|
|
68
79
|
cutSelection,
|
|
80
|
+
undo,
|
|
81
|
+
redo,
|
|
69
82
|
}: UseCanvasKeyboardShortcutsOptions): void {
|
|
70
83
|
useEffect(() => {
|
|
71
84
|
const container = containerRef.current;
|
|
@@ -76,6 +89,21 @@ export function useCanvasKeyboardShortcuts({
|
|
|
76
89
|
|
|
77
90
|
const isMod = e.metaKey || e.ctrlKey;
|
|
78
91
|
|
|
92
|
+
// Ctrl/Cmd+Z / Ctrl/Cmd+Shift+Z — undo/redo. Text inputs keep
|
|
93
|
+
// their native text undo (deliberate change with oss#588: the old
|
|
94
|
+
// binding hijacked Cmd+Z while typing in inspector fields).
|
|
95
|
+
if (isMod && !e.altKey && e.key.toLowerCase() === "z") {
|
|
96
|
+
if (isTextInput(e.target)) return;
|
|
97
|
+
e.preventDefault();
|
|
98
|
+
e.stopPropagation();
|
|
99
|
+
if (e.shiftKey) {
|
|
100
|
+
redo?.();
|
|
101
|
+
} else {
|
|
102
|
+
undo?.();
|
|
103
|
+
}
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
|
|
79
107
|
// Ctrl/Cmd+D — duplicate selected node
|
|
80
108
|
if (isMod && !e.shiftKey && !e.altKey && e.key.toLowerCase() === "d") {
|
|
81
109
|
e.preventDefault();
|
|
@@ -169,5 +197,7 @@ export function useCanvasKeyboardShortcuts({
|
|
|
169
197
|
copySelection,
|
|
170
198
|
pasteAtCenter,
|
|
171
199
|
cutSelection,
|
|
200
|
+
undo,
|
|
201
|
+
redo,
|
|
172
202
|
]);
|
|
173
203
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import { useState, useCallback, useRef
|
|
4
|
-
import type { RefObject } from "react";
|
|
3
|
+
import { useState, useCallback, useRef } from "react";
|
|
5
4
|
import type { WorkflowGraphModel } from "./workflow-graph-model.js";
|
|
6
5
|
import type { GraphCommand } from "./graph-commands.js";
|
|
7
6
|
import { GraphHistory } from "./graph-commands.js";
|
|
@@ -12,27 +11,34 @@ export interface UseGraphHistoryReturn {
|
|
|
12
11
|
readonly canUndo: boolean;
|
|
13
12
|
readonly canRedo: boolean;
|
|
14
13
|
readonly dispatch: (command: GraphCommand) => WorkflowGraphModel;
|
|
15
|
-
readonly undo: () =>
|
|
16
|
-
readonly redo: () =>
|
|
14
|
+
readonly undo: () => WorkflowGraphModel | null;
|
|
15
|
+
readonly redo: () => WorkflowGraphModel | null;
|
|
17
16
|
readonly reset: (model: WorkflowGraphModel) => void;
|
|
18
17
|
}
|
|
19
18
|
|
|
20
19
|
/**
|
|
21
20
|
* React wrapper around {@link GraphHistory} providing undo/redo state
|
|
22
|
-
* management
|
|
21
|
+
* management.
|
|
23
22
|
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
23
|
+
* Every mutation (`dispatch`, `undo`, `redo`) returns the resulting model
|
|
24
|
+
* SYNCHRONOUSLY so callers can derive dependent state (React Flow
|
|
25
|
+
* elements) in the same event handler. `currentModel` is a render-time
|
|
26
|
+
* snapshot — inside a callback it may be stale, so consumers reacting to
|
|
27
|
+
* a mutation must use the returned model, never `currentModel`
|
|
28
|
+
* (oss#588 was exactly that stale read).
|
|
29
|
+
*
|
|
30
|
+
* This hook deliberately owns NO DOM listeners: it cannot sync the canvas,
|
|
31
|
+
* so letting it mutate the model from a keyboard shortcut would desync
|
|
32
|
+
* model and canvas. Keyboard undo/redo binding lives with the other
|
|
33
|
+
* canvas shortcuts in `useCanvasKeyboardShortcuts`, wired to the
|
|
34
|
+
* orchestrator's syncing wrappers (`useWorkflowCanvas.undo`/`redo`).
|
|
27
35
|
*
|
|
28
36
|
* @param initialModel - The starting graph model (from YAML parse).
|
|
29
|
-
* @param containerRef - Ref to the DOM element that scopes keyboard shortcuts.
|
|
30
37
|
*
|
|
31
38
|
* @since T15 Batch 2 (Node Authoring)
|
|
32
39
|
*/
|
|
33
40
|
export function useGraphHistory(
|
|
34
41
|
initialModel: WorkflowGraphModel | null,
|
|
35
|
-
containerRef: RefObject<HTMLDivElement | null>,
|
|
36
42
|
): UseGraphHistoryReturn {
|
|
37
43
|
const historyRef = useRef<GraphHistory | null>(null);
|
|
38
44
|
const [model, setModel] = useState<WorkflowGraphModel | null>(null);
|
|
@@ -61,20 +67,22 @@ export function useGraphHistory(
|
|
|
61
67
|
[forceUpdate],
|
|
62
68
|
);
|
|
63
69
|
|
|
64
|
-
const undo = useCallback(() => {
|
|
70
|
+
const undo = useCallback((): WorkflowGraphModel | null => {
|
|
65
71
|
const history = historyRef.current;
|
|
66
|
-
if (!history?.canUndo) return;
|
|
72
|
+
if (!history?.canUndo) return null;
|
|
67
73
|
const next = history.undo();
|
|
68
74
|
setModel(next);
|
|
69
75
|
forceUpdate();
|
|
76
|
+
return next;
|
|
70
77
|
}, [forceUpdate]);
|
|
71
78
|
|
|
72
|
-
const redo = useCallback(() => {
|
|
79
|
+
const redo = useCallback((): WorkflowGraphModel | null => {
|
|
73
80
|
const history = historyRef.current;
|
|
74
|
-
if (!history?.canRedo) return;
|
|
81
|
+
if (!history?.canRedo) return null;
|
|
75
82
|
const next = history.redo();
|
|
76
83
|
setModel(next);
|
|
77
84
|
forceUpdate();
|
|
85
|
+
return next;
|
|
78
86
|
}, [forceUpdate]);
|
|
79
87
|
|
|
80
88
|
const reset = useCallback(
|
|
@@ -90,33 +98,6 @@ export function useGraphHistory(
|
|
|
90
98
|
[forceUpdate],
|
|
91
99
|
);
|
|
92
100
|
|
|
93
|
-
// Keyboard shortcuts: Ctrl/Cmd+Z (undo), Ctrl/Cmd+Shift+Z (redo)
|
|
94
|
-
useEffect(() => {
|
|
95
|
-
const container = containerRef.current;
|
|
96
|
-
if (!container) return;
|
|
97
|
-
|
|
98
|
-
function handleKeyDown(e: KeyboardEvent) {
|
|
99
|
-
if (!container?.contains(document.activeElement) && document.activeElement !== container) {
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
const isMod = e.metaKey || e.ctrlKey;
|
|
104
|
-
if (!isMod || e.key.toLowerCase() !== "z") return;
|
|
105
|
-
|
|
106
|
-
e.preventDefault();
|
|
107
|
-
e.stopPropagation();
|
|
108
|
-
|
|
109
|
-
if (e.shiftKey) {
|
|
110
|
-
redo();
|
|
111
|
-
} else {
|
|
112
|
-
undo();
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
document.addEventListener("keydown", handleKeyDown, true);
|
|
117
|
-
return () => document.removeEventListener("keydown", handleKeyDown, true);
|
|
118
|
-
}, [containerRef, undo, redo]);
|
|
119
|
-
|
|
120
101
|
const canUndo = historyRef.current?.canUndo ?? false;
|
|
121
102
|
const canRedo = historyRef.current?.canRedo ?? false;
|
|
122
103
|
|