@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
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
3
|
import { useState, useCallback, useMemo, useRef, useEffect } from "react";
|
|
4
|
-
import type { RefObject } from "react";
|
|
5
4
|
import { useNodesState, useEdgesState, useReactFlow } from "@xyflow/react";
|
|
6
5
|
import type {
|
|
7
6
|
Node,
|
|
8
7
|
Edge,
|
|
9
8
|
OnNodesChange,
|
|
10
9
|
OnEdgesChange,
|
|
10
|
+
OnNodeDrag,
|
|
11
11
|
Connection,
|
|
12
12
|
IsValidConnection,
|
|
13
13
|
} from "@xyflow/react";
|
|
@@ -68,6 +68,20 @@ import type { LayoutEngine } from "./layout/index.js";
|
|
|
68
68
|
import { serializeSelection, pasteClipboard } from "./clipboard.js";
|
|
69
69
|
import type { ClipboardEntry } from "./clipboard.js";
|
|
70
70
|
|
|
71
|
+
/**
|
|
72
|
+
* Serializes a graph model to canonical YAML, or `null` if serialization
|
|
73
|
+
* fails. graphToYaml is total on models produced by yamlToGraph (its sort is
|
|
74
|
+
* cycle-protected and unknown kinds fall back to `unknown_N`), so `null` is
|
|
75
|
+
* a defensive outcome, not an expected one.
|
|
76
|
+
*/
|
|
77
|
+
function serializeGraphOrNull(model: WorkflowGraphModel): string | null {
|
|
78
|
+
try {
|
|
79
|
+
return graphToYaml(model);
|
|
80
|
+
} catch {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
71
85
|
/** Selection state for the canvas inspector. */
|
|
72
86
|
export interface CanvasSelection {
|
|
73
87
|
readonly type: "node" | "edge";
|
|
@@ -91,6 +105,10 @@ export interface UseWorkflowCanvasReturn {
|
|
|
91
105
|
readonly edges: Edge[];
|
|
92
106
|
readonly onNodesChange: OnNodesChange;
|
|
93
107
|
readonly onEdgesChange: OnEdgesChange;
|
|
108
|
+
/** Marks the model snapshot an in-flight drag started from. */
|
|
109
|
+
readonly onNodeDragStart: OnNodeDrag;
|
|
110
|
+
/** Records a completed node drag into the command history (oss#602). */
|
|
111
|
+
readonly onNodeDragStop: OnNodeDrag;
|
|
94
112
|
readonly onConnect: (connection: Connection) => void;
|
|
95
113
|
readonly isValidConnection: IsValidConnection;
|
|
96
114
|
readonly onDrop: (event: React.DragEvent) => void;
|
|
@@ -165,19 +183,21 @@ export interface UseWorkflowCanvasReturn {
|
|
|
165
183
|
* is derived from the model after each mutation.
|
|
166
184
|
*
|
|
167
185
|
* @param yaml - The workflow YAML to initialize from. Changes trigger re-parse.
|
|
168
|
-
* @param containerRef - Ref to the canvas container for keyboard shortcut scoping.
|
|
169
186
|
* @param options - Optional configuration including a custom layout engine.
|
|
170
187
|
*
|
|
171
188
|
* @since T15 (Visual Canvas Editor)
|
|
172
189
|
*/
|
|
173
190
|
export function useWorkflowCanvas(
|
|
174
191
|
yaml: string | null,
|
|
175
|
-
containerRef: RefObject<HTMLDivElement | null>,
|
|
176
192
|
options?: UseWorkflowCanvasOptions,
|
|
177
193
|
): UseWorkflowCanvasReturn {
|
|
178
194
|
const [error, setError] = useState<string | null>(null);
|
|
179
195
|
const [selection, setSelection] = useState<CanvasSelection | null>(null);
|
|
180
196
|
const initialModelRef = useRef<WorkflowGraphModel | null>(null);
|
|
197
|
+
// Serialized form of the baseline model, kept in lockstep with
|
|
198
|
+
// initialModelRef. Dirty tracking compares serializations, not references —
|
|
199
|
+
// see the "Dirty tracking" section below for why.
|
|
200
|
+
const initialYamlRef = useRef<string | null>(null);
|
|
181
201
|
|
|
182
202
|
const [nodes, setNodes, onNodesChangeRaw] = useNodesState([] as Node[]);
|
|
183
203
|
const [edges, setEdges, onEdgesChangeRaw] = useEdgesState([] as Edge[]);
|
|
@@ -195,7 +215,7 @@ export function useWorkflowCanvas(
|
|
|
195
215
|
}, [yaml]);
|
|
196
216
|
|
|
197
217
|
// Set up graph history with the parsed model
|
|
198
|
-
const history = useGraphHistory(parsedModel
|
|
218
|
+
const history = useGraphHistory(parsedModel);
|
|
199
219
|
|
|
200
220
|
// Sync: when YAML changes, reset the history and RF elements
|
|
201
221
|
useEffect(() => {
|
|
@@ -204,6 +224,7 @@ export function useWorkflowCanvas(
|
|
|
204
224
|
setNodes([]);
|
|
205
225
|
setEdges([]);
|
|
206
226
|
initialModelRef.current = null;
|
|
227
|
+
initialYamlRef.current = null;
|
|
207
228
|
return;
|
|
208
229
|
}
|
|
209
230
|
|
|
@@ -212,6 +233,10 @@ export function useWorkflowCanvas(
|
|
|
212
233
|
const laidOut = applyDagreLayout(parsed);
|
|
213
234
|
history.reset(laidOut);
|
|
214
235
|
initialModelRef.current = laidOut;
|
|
236
|
+
// Baseline is the canonical re-serialization, not the incoming string:
|
|
237
|
+
// dirty comparisons must be canonical-vs-canonical, immune to cosmetic
|
|
238
|
+
// formatting differences in host-provided YAML.
|
|
239
|
+
initialYamlRef.current = serializeGraphOrNull(laidOut);
|
|
215
240
|
setError(null);
|
|
216
241
|
|
|
217
242
|
const elements = toReactFlowElements(laidOut);
|
|
@@ -222,6 +247,7 @@ export function useWorkflowCanvas(
|
|
|
222
247
|
setNodes([]);
|
|
223
248
|
setEdges([]);
|
|
224
249
|
initialModelRef.current = null;
|
|
250
|
+
initialYamlRef.current = null;
|
|
225
251
|
}
|
|
226
252
|
}, [yaml]);
|
|
227
253
|
|
|
@@ -255,6 +281,63 @@ export function useWorkflowCanvas(
|
|
|
255
281
|
[onNodesChangeRaw],
|
|
256
282
|
);
|
|
257
283
|
|
|
284
|
+
// During a drag, React Flow streams position changes into RF state only
|
|
285
|
+
// (via onNodesChange above); the model still holds the pre-drag
|
|
286
|
+
// positions. At drag stop, the completed gesture is recorded as ONE
|
|
287
|
+
// MoveNodesCommand — the auto-layout precedent — so drags survive
|
|
288
|
+
// later syncFromModel calls and are undoable (oss#602).
|
|
289
|
+
//
|
|
290
|
+
// The ref detects mid-drag model mutations: the keyboard undo listener
|
|
291
|
+
// and the host's YAML prop are both reachable while the mouse is down,
|
|
292
|
+
// and either one rebuilds the canvas from a model this drag never saw —
|
|
293
|
+
// recording the drag on top of that would fight the mutation.
|
|
294
|
+
const dragStartModelRef = useRef<WorkflowGraphModel | null>(null);
|
|
295
|
+
|
|
296
|
+
const onNodeDragStart: OnNodeDrag = useCallback(() => {
|
|
297
|
+
dragStartModelRef.current = history.currentModel;
|
|
298
|
+
}, [history.currentModel]);
|
|
299
|
+
|
|
300
|
+
const onNodeDragStop: OnNodeDrag = useCallback(
|
|
301
|
+
(_event, _node, draggedNodes) => {
|
|
302
|
+
const model = history.currentModel;
|
|
303
|
+
const startModel = dragStartModelRef.current;
|
|
304
|
+
dragStartModelRef.current = null;
|
|
305
|
+
if (!startModel || model !== startModel) return;
|
|
306
|
+
|
|
307
|
+
const oldPositions: { id: string; x: number; y: number }[] = [];
|
|
308
|
+
const newPositions: { id: string; x: number; y: number }[] = [];
|
|
309
|
+
for (const dragged of draggedNodes) {
|
|
310
|
+
const modelNode = model.nodes.find((n) => n.id === dragged.id);
|
|
311
|
+
if (!modelNode) continue;
|
|
312
|
+
oldPositions.push({
|
|
313
|
+
id: modelNode.id,
|
|
314
|
+
x: modelNode.position.x,
|
|
315
|
+
y: modelNode.position.y,
|
|
316
|
+
});
|
|
317
|
+
newPositions.push({
|
|
318
|
+
id: dragged.id,
|
|
319
|
+
x: dragged.position.x,
|
|
320
|
+
y: dragged.position.y,
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
const hasChanges = newPositions.some((np, i) => {
|
|
325
|
+
const op = oldPositions[i];
|
|
326
|
+
return Math.abs(op.x - np.x) > 0.5 || Math.abs(op.y - np.y) > 0.5;
|
|
327
|
+
});
|
|
328
|
+
if (!hasChanges) return;
|
|
329
|
+
|
|
330
|
+
// Record-only dispatch — deliberately NOT the syncing dispatch().
|
|
331
|
+
// React Flow already renders the dragged positions, so here the
|
|
332
|
+
// model catches up to the canvas (everywhere else the model leads
|
|
333
|
+
// and syncFromModel makes the canvas follow). Rebuilding the node
|
|
334
|
+
// array would be a visual no-op that wipes React Flow's `selected`
|
|
335
|
+
// flags at the end of every drag, breaking consecutive group drags.
|
|
336
|
+
history.dispatch(new MoveNodesCommand(oldPositions, newPositions));
|
|
337
|
+
},
|
|
338
|
+
[history.currentModel, history.dispatch],
|
|
339
|
+
);
|
|
340
|
+
|
|
258
341
|
const onEdgesChange: OnEdgesChange = useCallback(
|
|
259
342
|
(changes) => {
|
|
260
343
|
onEdgesChangeRaw(changes);
|
|
@@ -390,6 +473,7 @@ export function useWorkflowCanvas(
|
|
|
390
473
|
};
|
|
391
474
|
history.reset(bootstrapModel);
|
|
392
475
|
initialModelRef.current = bootstrapModel;
|
|
476
|
+
initialYamlRef.current = serializeGraphOrNull(bootstrapModel);
|
|
393
477
|
|
|
394
478
|
const autoEdge = {
|
|
395
479
|
id: generateEdgeId(),
|
|
@@ -1083,31 +1167,49 @@ export function useWorkflowCanvas(
|
|
|
1083
1167
|
// Undo / Redo (delegates to history, then syncs RF)
|
|
1084
1168
|
// ---------------------------------------------------------------------------
|
|
1085
1169
|
|
|
1170
|
+
// Sync from the model RETURNED by the mutation, mirroring dispatch().
|
|
1171
|
+
// `history.currentModel` is a render-time snapshot — reading it here
|
|
1172
|
+
// after undo()/redo() yields the PRE-mutation model (oss#588: the
|
|
1173
|
+
// canvas re-rendered the still-deleted graph while the inspector,
|
|
1174
|
+
// reading state on the next render, showed the restored node).
|
|
1086
1175
|
const undo = useCallback(() => {
|
|
1087
|
-
history.undo();
|
|
1088
|
-
syncFromModel(
|
|
1089
|
-
}, [history, syncFromModel]);
|
|
1176
|
+
const next = history.undo();
|
|
1177
|
+
if (next) syncFromModel(next);
|
|
1178
|
+
}, [history.undo, syncFromModel]);
|
|
1090
1179
|
|
|
1091
1180
|
const redo = useCallback(() => {
|
|
1092
|
-
history.redo();
|
|
1093
|
-
syncFromModel(
|
|
1094
|
-
}, [history, syncFromModel]);
|
|
1181
|
+
const next = history.redo();
|
|
1182
|
+
if (next) syncFromModel(next);
|
|
1183
|
+
}, [history.redo, syncFromModel]);
|
|
1095
1184
|
|
|
1096
1185
|
// ---------------------------------------------------------------------------
|
|
1097
|
-
// Dirty tracking:
|
|
1186
|
+
// Dirty tracking: serialization comparison (oss#609)
|
|
1187
|
+
//
|
|
1188
|
+
// Dirty means "saving would change the document". Node positions are not
|
|
1189
|
+
// part of the serialized YAML (dagre recomputes them on every load), so a
|
|
1190
|
+
// position-only edit session (drags, auto-layout) must NOT read as dirty:
|
|
1191
|
+
// its save would round-trip byte-identical YAML, and because hosts reset
|
|
1192
|
+
// the baseline by feeding saved YAML back through the `yaml` prop (whose
|
|
1193
|
+
// re-parse effect is string-change gated), a reference-based flag could
|
|
1194
|
+
// never clear afterwards — an armed Save button that saving cannot disarm.
|
|
1195
|
+
// graphToYaml is total on parsed models (cycle-protected sort, unknown-kind
|
|
1196
|
+
// fallback) and O(nodes+edges), cheap enough to compare per model change.
|
|
1098
1197
|
// ---------------------------------------------------------------------------
|
|
1099
1198
|
|
|
1100
1199
|
const graph = history.currentModel.nodes.length > 0 ? history.currentModel : null;
|
|
1101
|
-
const
|
|
1200
|
+
const currentYaml = useMemo(
|
|
1201
|
+
() => (graph ? serializeGraphOrNull(graph) : null),
|
|
1202
|
+
[graph],
|
|
1203
|
+
);
|
|
1204
|
+
// Reference comparison remains as the fallback for the defensive case where
|
|
1205
|
+
// serialization failed (null); failing dirty-side keeps Save reachable.
|
|
1206
|
+
const isDirty =
|
|
1207
|
+
initialModelRef.current !== null &&
|
|
1208
|
+
(currentYaml !== null && initialYamlRef.current !== null
|
|
1209
|
+
? currentYaml !== initialYamlRef.current
|
|
1210
|
+
: graph !== initialModelRef.current);
|
|
1102
1211
|
|
|
1103
|
-
const serializeToYaml = useCallback((): string | null =>
|
|
1104
|
-
if (!graph) return null;
|
|
1105
|
-
try {
|
|
1106
|
-
return graphToYaml(graph);
|
|
1107
|
-
} catch {
|
|
1108
|
-
return null;
|
|
1109
|
-
}
|
|
1110
|
-
}, [graph]);
|
|
1212
|
+
const serializeToYaml = useCallback((): string | null => currentYaml, [currentYaml]);
|
|
1111
1213
|
|
|
1112
1214
|
return useMemo(
|
|
1113
1215
|
() => ({
|
|
@@ -1115,6 +1217,8 @@ export function useWorkflowCanvas(
|
|
|
1115
1217
|
edges,
|
|
1116
1218
|
onNodesChange,
|
|
1117
1219
|
onEdgesChange,
|
|
1220
|
+
onNodeDragStart,
|
|
1221
|
+
onNodeDragStop,
|
|
1118
1222
|
onConnect,
|
|
1119
1223
|
isValidConnection,
|
|
1120
1224
|
onDrop,
|
|
@@ -1172,7 +1276,8 @@ export function useWorkflowCanvas(
|
|
|
1172
1276
|
getSelectedNodeIds,
|
|
1173
1277
|
}),
|
|
1174
1278
|
[
|
|
1175
|
-
nodes, edges, onNodesChange, onEdgesChange,
|
|
1279
|
+
nodes, edges, onNodesChange, onEdgesChange, onNodeDragStart,
|
|
1280
|
+
onNodeDragStop, onConnect,
|
|
1176
1281
|
isValidConnection, onDrop, onDragOver, onNodesDelete, onEdgesDelete,
|
|
1177
1282
|
selection, selectNode, selectEdge, clearSelection, autoLayout,
|
|
1178
1283
|
undo, redo, history.canUndo, history.canRedo, isDirty, graph, error,
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// State + actions for the workflow execution viewer's WorkspaceSurface panel.
|
|
4
4
|
// Domain: workflow (the lean analog of session/useSessionPanel).
|
|
5
5
|
|
|
6
|
-
import { useCallback, useMemo, useState } from "react";
|
|
6
|
+
import { useCallback, useMemo, useRef, useState } from "react";
|
|
7
7
|
import type { Artifact } from "@stigmer/protos/ai/stigmer/agentic/artifact/v1/api_pb";
|
|
8
8
|
import type { FileChange } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
|
|
9
9
|
import {
|
|
@@ -50,7 +50,11 @@ export function workflowArtifactTabPath(artifact: Artifact): string {
|
|
|
50
50
|
export interface WorkflowExecutionPanelController {
|
|
51
51
|
/** The open-editor group store; subscribe with `useWorkspaceEditors`. */
|
|
52
52
|
readonly editorsStore: WorkspaceEditorsStore;
|
|
53
|
-
/**
|
|
53
|
+
/**
|
|
54
|
+
* Whether the panel is expanded or collapsed to the chip. In controlled
|
|
55
|
+
* mode ({@link UseWorkflowExecutionPanelOptions.open}) this mirrors the
|
|
56
|
+
* host's value.
|
|
57
|
+
*/
|
|
54
58
|
readonly isOpen: boolean;
|
|
55
59
|
/** The active rail view id (an injected facet — `"artifacts"` today). */
|
|
56
60
|
readonly view: string;
|
|
@@ -119,6 +123,38 @@ export interface UseWorkflowExecutionPanelOptions {
|
|
|
119
123
|
* @default "artifacts"
|
|
120
124
|
*/
|
|
121
125
|
readonly defaultView?: string;
|
|
126
|
+
/**
|
|
127
|
+
* Controlled open state. When provided, the host owns whether the panel is
|
|
128
|
+
* expanded: internal open intents (the chip toggle, Diagnose, an
|
|
129
|
+
* artifact/file-change/file open) no longer flip state themselves — they
|
|
130
|
+
* surface through {@link UseWorkflowExecutionPanelOptions.onOpenChange}
|
|
131
|
+
* and the panel follows this value. Leave `undefined` for the
|
|
132
|
+
* self-managing default. The same seam `useSessionPanel` carries (#651);
|
|
133
|
+
* kept domain-local, like the controllers themselves.
|
|
134
|
+
*/
|
|
135
|
+
readonly open?: boolean;
|
|
136
|
+
/**
|
|
137
|
+
* Initial open state in uncontrolled mode. Ignored when
|
|
138
|
+
* {@link UseWorkflowExecutionPanelOptions.open} is provided.
|
|
139
|
+
*
|
|
140
|
+
* @default false
|
|
141
|
+
*/
|
|
142
|
+
readonly defaultOpen?: boolean;
|
|
143
|
+
/**
|
|
144
|
+
* Called on every effective open/close transition — in BOTH modes,
|
|
145
|
+
* matching `useSessionPanel`'s convention (and departing from
|
|
146
|
+
* `useDetailTabs`'s DD-T05A-001 for the same principled reason): this
|
|
147
|
+
* panel opens ITSELF (`openDiagnosis`, `openArtifact`, `openFileChange`,
|
|
148
|
+
* `openFile` all expand a collapsed panel), and an embedding host that
|
|
149
|
+
* must react to those moments — widen a dock, make room for a diagnosis
|
|
150
|
+
* conversation — has no other seam. Passing only this callback observes
|
|
151
|
+
* the panel without controlling it.
|
|
152
|
+
*
|
|
153
|
+
* In controlled mode this fires once per open/close REQUEST (the host may
|
|
154
|
+
* decline by not updating `open` — a later identical request re-fires); in
|
|
155
|
+
* uncontrolled mode it fires once per actual transition.
|
|
156
|
+
*/
|
|
157
|
+
readonly onOpenChange?: (open: boolean) => void;
|
|
122
158
|
}
|
|
123
159
|
|
|
124
160
|
/**
|
|
@@ -126,13 +162,59 @@ export interface UseWorkflowExecutionPanelOptions {
|
|
|
126
162
|
*/
|
|
127
163
|
export function useWorkflowExecutionPanel({
|
|
128
164
|
defaultView = "artifacts",
|
|
165
|
+
open,
|
|
166
|
+
defaultOpen = false,
|
|
167
|
+
onOpenChange,
|
|
129
168
|
}: UseWorkflowExecutionPanelOptions = {}): WorkflowExecutionPanelController {
|
|
130
169
|
const editorsStore = useWorkspaceEditorsStoreRef();
|
|
131
|
-
|
|
170
|
+
|
|
171
|
+
// Uncontrolled-by-default / controlled-when-`open`-is-provided (React's own
|
|
172
|
+
// value/defaultValue convention — presence of the value prop decides, so an
|
|
173
|
+
// observe-only host can pass just `onOpenChange`). Same shape as
|
|
174
|
+
// `useSessionPanel`; re-transcribed rather than extracted because the
|
|
175
|
+
// controllers are deliberately not shared (see the interface doc above).
|
|
176
|
+
const isControlled = open !== undefined;
|
|
177
|
+
const [internalIsOpen, setInternalIsOpen] = useState(defaultOpen);
|
|
178
|
+
const isOpen = isControlled ? open : internalIsOpen;
|
|
179
|
+
|
|
180
|
+
// Latest-ref idiom: the host's callback and the mode/value mirrors live in
|
|
181
|
+
// refs so `requestOpenChange` — and every action callback built on it —
|
|
182
|
+
// stays referentially stable regardless of how the host authored
|
|
183
|
+
// `onOpenChange` (DD-010: an inline lambda must not churn the memoized
|
|
184
|
+
// controller and re-render the panel subtree).
|
|
185
|
+
const onOpenChangeRef = useRef(onOpenChange);
|
|
186
|
+
onOpenChangeRef.current = onOpenChange;
|
|
187
|
+
const isControlledRef = useRef(isControlled);
|
|
188
|
+
isControlledRef.current = isControlled;
|
|
189
|
+
const isOpenRef = useRef(isOpen);
|
|
190
|
+
isOpenRef.current = isOpen;
|
|
191
|
+
|
|
192
|
+
// The single seam every open/close intent routes through — the chip
|
|
193
|
+
// toggle, Diagnose, artifact/file-change/file opens, and the surface's
|
|
194
|
+
// collapse affordance. Uncontrolled: apply + notify (the ref is updated
|
|
195
|
+
// eagerly so two same-tick intents produce one notification). Controlled:
|
|
196
|
+
// notify only — the host owns the state, and the panel follows the `open`
|
|
197
|
+
// prop; the ref is NOT updated, so a declined request stays re-fireable.
|
|
198
|
+
const requestOpenChange = useCallback((next: boolean) => {
|
|
199
|
+
if (isOpenRef.current === next) return;
|
|
200
|
+
if (!isControlledRef.current) {
|
|
201
|
+
isOpenRef.current = next;
|
|
202
|
+
setInternalIsOpen(next);
|
|
203
|
+
}
|
|
204
|
+
onOpenChangeRef.current?.(next);
|
|
205
|
+
}, []);
|
|
206
|
+
|
|
132
207
|
const [view, setViewState] = useState(defaultView);
|
|
133
208
|
|
|
134
|
-
const openPanel = useCallback(
|
|
135
|
-
|
|
209
|
+
const openPanel = useCallback(
|
|
210
|
+
() => requestOpenChange(true),
|
|
211
|
+
[requestOpenChange],
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
const closePanel = useCallback(
|
|
215
|
+
() => requestOpenChange(false),
|
|
216
|
+
[requestOpenChange],
|
|
217
|
+
);
|
|
136
218
|
|
|
137
219
|
const setView = useCallback((viewId: string) => setViewState(viewId), []);
|
|
138
220
|
|
|
@@ -141,15 +223,15 @@ export function useWorkflowExecutionPanel({
|
|
|
141
223
|
DIAGNOSIS_DOCUMENT_ENTRY_ID,
|
|
142
224
|
DIAGNOSIS_DOCUMENT_PATH,
|
|
143
225
|
);
|
|
144
|
-
|
|
145
|
-
}, [editorsStore]);
|
|
226
|
+
requestOpenChange(true);
|
|
227
|
+
}, [editorsStore, requestOpenChange]);
|
|
146
228
|
|
|
147
229
|
const openFile = useCallback(
|
|
148
230
|
(entryId: string, path: string, options?: OpenFileOptions) => {
|
|
149
231
|
editorsStore.openPreview(entryId, path, options);
|
|
150
|
-
|
|
232
|
+
requestOpenChange(true);
|
|
151
233
|
},
|
|
152
|
-
[editorsStore],
|
|
234
|
+
[editorsStore, requestOpenChange],
|
|
153
235
|
);
|
|
154
236
|
|
|
155
237
|
const openArtifact = useCallback(
|
|
@@ -158,9 +240,9 @@ export function useWorkflowExecutionPanel({
|
|
|
158
240
|
ARTIFACT_DOCUMENT_ENTRY_ID,
|
|
159
241
|
workflowArtifactTabPath(artifact),
|
|
160
242
|
);
|
|
161
|
-
|
|
243
|
+
requestOpenChange(true);
|
|
162
244
|
},
|
|
163
|
-
[editorsStore],
|
|
245
|
+
[editorsStore, requestOpenChange],
|
|
164
246
|
);
|
|
165
247
|
|
|
166
248
|
const pinArtifact = useCallback(
|
|
@@ -179,9 +261,9 @@ export function useWorkflowExecutionPanel({
|
|
|
179
261
|
FILE_CHANGE_DOCUMENT_ENTRY_ID,
|
|
180
262
|
fileChangeTabPath(change),
|
|
181
263
|
);
|
|
182
|
-
|
|
264
|
+
requestOpenChange(true);
|
|
183
265
|
},
|
|
184
|
-
[editorsStore],
|
|
266
|
+
[editorsStore, requestOpenChange],
|
|
185
267
|
);
|
|
186
268
|
|
|
187
269
|
const pinFileChange = useCallback(
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { useCallback, useMemo, useRef, useState } from "react";
|
|
4
4
|
import { useStigmer } from "../hooks.js";
|
|
5
|
+
import { isUnimplemented } from "../internal/isUnimplemented.js";
|
|
5
6
|
import { parseWorkflowYaml } from "./serialize-workflow-yaml.js";
|
|
6
7
|
|
|
7
8
|
/** Options for a single save invocation. */
|
|
@@ -57,7 +58,7 @@ export function useWorkflowSave(org: string): UseWorkflowSaveReturn {
|
|
|
57
58
|
const wrapped =
|
|
58
59
|
err instanceof Error ? err : new Error(String(err));
|
|
59
60
|
|
|
60
|
-
if (
|
|
61
|
+
if (isUnimplemented(err)) {
|
|
61
62
|
setError(
|
|
62
63
|
new Error(
|
|
63
64
|
"Workflow save is not yet available on this server. " +
|
|
@@ -77,17 +78,3 @@ export function useWorkflowSave(org: string): UseWorkflowSaveReturn {
|
|
|
77
78
|
|
|
78
79
|
return useMemo(() => ({ save, isSaving, error }), [save, isSaving, error]);
|
|
79
80
|
}
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Detect gRPC UNIMPLEMENTED (code 12) from a Connect error or
|
|
83
|
-
* a StigmerError wrapping one. The SDK's CODE_MAP doesn't include
|
|
84
|
-
* Unimplemented so it surfaces as "unknown" — check connectCode.
|
|
85
|
-
*/
|
|
86
|
-
function isUnimplementedError(err: unknown): boolean {
|
|
87
|
-
if (!err || typeof err !== "object") return false;
|
|
88
|
-
if ("connectCode" in err && (err as { connectCode: number }).connectCode === 12) {
|
|
89
|
-
return true;
|
|
90
|
-
}
|
|
91
|
-
const msg = (err as { message?: string }).message ?? "";
|
|
92
|
-
return msg.includes("[unimplemented]") || msg.includes("UNIMPLEMENTED");
|
|
93
|
-
}
|
|
@@ -58,6 +58,22 @@ export function taskKindToString(kind: WorkflowTaskKind): string {
|
|
|
58
58
|
return TASK_KIND_STRINGS.get(kind) ?? `unknown_${kind}`;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
+
/**
|
|
62
|
+
* Canonical kind key for a graph node.
|
|
63
|
+
*
|
|
64
|
+
* Task nodes resolve to their `WorkflowTaskKind` enum name; the start/end
|
|
65
|
+
* sentinels resolve to their pseudo-kind (`__start__` / `__end__`), which
|
|
66
|
+
* doubles as their node id and their key in the visual registry. Sentinels
|
|
67
|
+
* carry enum value 0, which `taskKindToString` would render as its internal
|
|
68
|
+
* `unknown_*` fallback — routing them through here keeps that fallback out
|
|
69
|
+
* of every user-visible surface (oss#581).
|
|
70
|
+
*/
|
|
71
|
+
export function graphNodeKindString(node: WorkflowGraphNode): string {
|
|
72
|
+
return node.id === START_NODE_ID || node.id === END_NODE_ID
|
|
73
|
+
? node.id
|
|
74
|
+
: taskKindToString(node.kind);
|
|
75
|
+
}
|
|
76
|
+
|
|
61
77
|
export function stringToTaskKind(str: string): WorkflowTaskKind {
|
|
62
78
|
return STRING_TO_TASK_KIND.get(str) ?? WorkflowTaskKind.workflow_task_kind_unspecified;
|
|
63
79
|
}
|
|
@@ -148,7 +164,6 @@ export function yamlToGraph(yaml: string): WorkflowGraphModel {
|
|
|
148
164
|
for (const task of tasks) {
|
|
149
165
|
const config = (task.task_config ?? task.taskConfig ?? {}) as JsonObject;
|
|
150
166
|
const kindEnum = stringToTaskKind(task.kind);
|
|
151
|
-
const kindStr = kindEnum !== WorkflowTaskKind.workflow_task_kind_unspecified ? task.kind : task.kind;
|
|
152
167
|
|
|
153
168
|
nodes.push({
|
|
154
169
|
id: task.name,
|
|
@@ -469,6 +484,13 @@ export interface NodeExecutionState {
|
|
|
469
484
|
export interface CanvasTaskNodeData extends Record<string, unknown> {
|
|
470
485
|
taskName: string;
|
|
471
486
|
kind: WorkflowTaskKind;
|
|
487
|
+
/**
|
|
488
|
+
* Canonical kind key (see {@link graphNodeKindString}): the
|
|
489
|
+
* `WorkflowTaskKind` enum name for task nodes, or the `__start__` /
|
|
490
|
+
* `__end__` pseudo-kind for sentinels — never `taskKindToString`'s
|
|
491
|
+
* internal `unknown_*` fallback. Rendered as the `data-task-kind` DOM
|
|
492
|
+
* attribute on task nodes only; sentinels omit that attribute.
|
|
493
|
+
*/
|
|
472
494
|
kindString: string;
|
|
473
495
|
category: TopologyNodeCategory;
|
|
474
496
|
visualClass: VisualClass;
|
|
@@ -511,8 +533,8 @@ export function toReactFlowElements(graph: WorkflowGraphModel): {
|
|
|
511
533
|
} {
|
|
512
534
|
const nodes: Node[] = graph.nodes.map((node) => {
|
|
513
535
|
const isSentinel = node.id === START_NODE_ID || node.id === END_NODE_ID;
|
|
514
|
-
const kindString =
|
|
515
|
-
const visualSpec = getVisualSpec(
|
|
536
|
+
const kindString = graphNodeKindString(node);
|
|
537
|
+
const visualSpec = getVisualSpec(kindString);
|
|
516
538
|
return {
|
|
517
539
|
id: node.id,
|
|
518
540
|
type: CANVAS_TASK_NODE_TYPE,
|