@stigmer/react 3.12.1 → 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/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/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 +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/useMcpServerDefinitionDrift.d.ts +44 -0
- package/mcp-server/useMcpServerDefinitionDrift.d.ts.map +1 -0
- package/mcp-server/useMcpServerDefinitionDrift.js +61 -0
- package/mcp-server/useMcpServerDefinitionDrift.js.map +1 -0
- package/models/ModelRegistryContext.d.ts +7 -1
- package/models/ModelRegistryContext.d.ts.map +1 -1
- package/models/ModelRegistryContext.js.map +1 -1
- package/models/ModelSelector.js +9 -1
- package/models/ModelSelector.js.map +1 -1
- package/models/index.d.ts +2 -2
- package/models/index.d.ts.map +1 -1
- package/models/index.js +1 -1
- package/models/index.js.map +1 -1
- package/models/registry.d.ts +88 -6
- package/models/registry.d.ts.map +1 -1
- package/models/registry.js +133 -27
- package/models/registry.js.map +1 -1
- package/models/useModelRegistry.d.ts +7 -1
- package/models/useModelRegistry.d.ts.map +1 -1
- package/models/useModelRegistry.js +3 -2
- package/models/useModelRegistry.js.map +1 -1
- package/oauth-app/CreateOAuthAppForm.d.ts.map +1 -1
- package/oauth-app/CreateOAuthAppForm.js +4 -5
- package/oauth-app/CreateOAuthAppForm.js.map +1 -1
- package/oauth-app/OAuthAppDetailPanel.d.ts.map +1 -1
- package/oauth-app/OAuthAppDetailPanel.js +5 -6
- package/oauth-app/OAuthAppDetailPanel.js.map +1 -1
- package/organization/CreateOrganizationForm.d.ts.map +1 -1
- package/organization/CreateOrganizationForm.js +5 -9
- package/organization/CreateOrganizationForm.js.map +1 -1
- package/organization/OrgProfilePanel.d.ts.map +1 -1
- package/organization/OrgProfilePanel.js +7 -16
- package/organization/OrgProfilePanel.js.map +1 -1
- package/package.json +4 -4
- package/platform-client/CreatePlatformClientForm.d.ts.map +1 -1
- package/platform-client/CreatePlatformClientForm.js +5 -6
- package/platform-client/CreatePlatformClientForm.js.map +1 -1
- package/platform-client/PlatformClientDetailPanel.d.ts.map +1 -1
- package/platform-client/PlatformClientDetailPanel.js +6 -7
- package/platform-client/PlatformClientDetailPanel.js.map +1 -1
- package/platform-client/PlatformClientListPanel.d.ts.map +1 -1
- package/platform-client/PlatformClientListPanel.js +2 -4
- package/platform-client/PlatformClientListPanel.js.map +1 -1
- package/platform-client/PlatformClientSecretAlert.d.ts.map +1 -1
- package/platform-client/PlatformClientSecretAlert.js +18 -25
- package/platform-client/PlatformClientSecretAlert.js.map +1 -1
- package/provider.d.ts +34 -1
- package/provider.d.ts.map +1 -1
- package/provider.js +14 -7
- package/provider.js.map +1 -1
- package/resource-creation/WizardNav.d.ts.map +1 -1
- package/resource-creation/WizardNav.js +2 -4
- package/resource-creation/WizardNav.js.map +1 -1
- package/resource-detail/ConfirmDialog.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 +7 -7
- package/session/useSessionConversation.d.ts.map +1 -1
- package/session/useSessionConversation.js +2 -0
- package/session/useSessionConversation.js.map +1 -1
- package/session/useSessionPageFlow.d.ts +18 -4
- package/session/useSessionPageFlow.d.ts.map +1 -1
- package/session/useSessionPageFlow.js +33 -6
- package/session/useSessionPageFlow.js.map +1 -1
- package/session/useSessionPanel.d.ts +37 -2
- package/session/useSessionPanel.d.ts.map +1 -1
- package/session/useSessionPanel.js +44 -10
- package/session/useSessionPanel.js.map +1 -1
- package/settings/ApiKeysSection.d.ts.map +1 -1
- package/settings/ApiKeysSection.js +3 -2
- package/settings/ApiKeysSection.js.map +1 -1
- package/settings/ChannelAppsSection.d.ts.map +1 -1
- package/settings/ChannelAppsSection.js +3 -2
- package/settings/ChannelAppsSection.js.map +1 -1
- package/settings/EnvironmentsSection.js +5 -3
- package/settings/EnvironmentsSection.js.map +1 -1
- package/settings/IdentityProvidersSection.d.ts.map +1 -1
- package/settings/IdentityProvidersSection.js +3 -2
- package/settings/IdentityProvidersSection.js.map +1 -1
- package/settings/InvitationsSection.d.ts.map +1 -1
- package/settings/InvitationsSection.js +3 -1
- package/settings/InvitationsSection.js.map +1 -1
- package/settings/MembersSection.d.ts.map +1 -1
- package/settings/MembersSection.js +3 -1
- package/settings/MembersSection.js.map +1 -1
- package/settings/OAuthAppsSection.d.ts.map +1 -1
- package/settings/OAuthAppsSection.js +3 -2
- package/settings/OAuthAppsSection.js.map +1 -1
- package/settings/OrgProfileSection.d.ts.map +1 -1
- package/settings/OrgProfileSection.js +3 -2
- package/settings/OrgProfileSection.js.map +1 -1
- package/settings/PlatformClientsSection.d.ts.map +1 -1
- package/settings/PlatformClientsSection.js +3 -2
- package/settings/PlatformClientsSection.js.map +1 -1
- package/settings/UsageSection.d.ts.map +1 -1
- package/settings/UsageSection.js +3 -1
- package/settings/UsageSection.js.map +1 -1
- package/sharing/ShareAgentDialog.d.ts.map +1 -1
- package/sharing/ShareAgentDialog.js +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/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/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/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 +1 -1
- 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__/definitionDrift.test.ts +245 -0
- package/src/mcp-server/__tests__/mcpServerToInput.test.ts +201 -0
- package/src/mcp-server/__tests__/useMcpServerDefinitionDrift.test.tsx +173 -0
- package/src/mcp-server/internal/definitionDrift.ts +158 -0
- package/src/mcp-server/internal/mcpServerToInput.ts +3 -0
- package/src/mcp-server/steps/EnvironmentAuthStep.tsx +19 -19
- package/src/mcp-server/steps/IdentityTransportStep.tsx +24 -23
- package/src/mcp-server/useMcpServerConnect.ts +1 -1
- package/src/mcp-server/useMcpServerDefinitionDrift.ts +95 -0
- package/src/models/ModelRegistryContext.ts +7 -1
- package/src/models/ModelSelector.tsx +37 -0
- package/src/models/__tests__/ModelSelector-visionIndicator.test.tsx +129 -0
- package/src/models/__tests__/resolveDefaultModel.test.ts +115 -0
- package/src/models/__tests__/useModelRegistry.test.tsx +99 -4
- package/src/models/index.ts +2 -2
- package/src/models/registry.ts +196 -29
- package/src/models/useModelRegistry.ts +10 -2
- package/src/oauth-app/CreateOAuthAppForm.tsx +16 -31
- package/src/oauth-app/OAuthAppDetailPanel.tsx +16 -31
- package/src/organization/CreateOrganizationForm.tsx +10 -29
- package/src/organization/OrgProfilePanel.tsx +13 -44
- package/src/platform-client/CreatePlatformClientForm.tsx +9 -29
- package/src/platform-client/PlatformClientDetailPanel.tsx +10 -30
- package/src/platform-client/PlatformClientListPanel.tsx +2 -18
- package/src/platform-client/PlatformClientSecretAlert.tsx +26 -55
- package/src/provider.tsx +76 -33
- package/src/resource-creation/WizardNav.tsx +2 -18
- package/src/resource-detail/ConfirmDialog.tsx +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 +10 -8
- package/src/session/useSessionPageFlow.ts +51 -10
- package/src/session/useSessionPanel.ts +91 -10
- package/src/settings/ApiKeysSection.tsx +4 -3
- package/src/settings/ChannelAppsSection.tsx +4 -3
- package/src/settings/EnvironmentsSection.tsx +8 -5
- package/src/settings/IdentityProvidersSection.tsx +4 -3
- package/src/settings/InvitationsSection.tsx +4 -2
- package/src/settings/MembersSection.tsx +4 -2
- package/src/settings/OAuthAppsSection.tsx +4 -3
- package/src/settings/OrgProfileSection.tsx +4 -3
- package/src/settings/PlatformClientsSection.tsx +4 -3
- package/src/settings/UsageSection.tsx +4 -2
- package/src/sharing/ShareAgentDialog.tsx +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/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 +2 -0
- package/src/workflow/WorkflowCanvasInner.tsx +14 -1
- package/src/workflow/WorkflowDiffGraph.tsx +7 -1
- package/src/workflow/WorkflowExecutionViewer.tsx +88 -11
- package/src/workflow/WorkflowExplainDialog.tsx +8 -24
- 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 +3 -23
- package/src/workflow/WorkflowTaskApprovalSummary.tsx +2 -17
- package/src/workflow/WorkflowVersionBadge.tsx +4 -13
- package/src/workflow/WorkflowVersionTimeline.tsx +1 -25
- package/src/workflow/__tests__/panelNegotiation.test.tsx +230 -0
- package/src/workflow/__tests__/useWorkflowCanvas.dirty.test.tsx +178 -0
- package/src/workflow/__tests__/useWorkflowCanvas.drag.test.tsx +224 -0
- package/src/workflow/__tests__/useWorkflowExecutionPanel.test.ts +100 -0
- package/src/workflow/execution-comparison/ExecutionComparisonPicker.tsx +7 -11
- package/src/workflow/execution-history/ExecutionHistoryTable.tsx +1 -25
- package/src/workflow/index.ts +1 -0
- package/src/workflow/instance/CreateWorkflowInstanceDialog.tsx +1 -1
- package/src/workflow/instance/WorkflowInstanceDetailPanel.tsx +2 -1
- package/src/workflow/picker/BranchAddPopover.tsx +4 -3
- package/src/workflow/templates/WorkflowTemplatePreview.tsx +1 -1
- package/src/workflow/useApprovalBoundary.ts +1 -1
- package/src/workflow/useWorkflowCanvas.ts +114 -11
- package/src/workflow/useWorkflowExecutionPanel.ts +95 -13
- package/styles.css +1 -1
- package/version-history/VersionTimelineEntry.d.ts.map +1 -1
- package/version-history/VersionTimelineEntry.js +1 -23
- package/version-history/VersionTimelineEntry.js.map +1 -1
- package/workflow/CanvasTransitionEdge.d.ts +1 -1
- package/workflow/FailedRunsWidget.d.ts.map +1 -1
- package/workflow/FailedRunsWidget.js +2 -11
- package/workflow/FailedRunsWidget.js.map +1 -1
- package/workflow/PendingApprovalsWidget.d.ts.map +1 -1
- package/workflow/PendingApprovalsWidget.js +2 -11
- package/workflow/PendingApprovalsWidget.js.map +1 -1
- package/workflow/ViewYamlDialog.d.ts.map +1 -1
- package/workflow/ViewYamlDialog.js +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 +1 -1
- package/workflow/WorkflowCanvasEditor.js.map +1 -1
- package/workflow/WorkflowCanvasInner.d.ts +4 -2
- package/workflow/WorkflowCanvasInner.d.ts.map +1 -1
- package/workflow/WorkflowCanvasInner.js +7 -3
- package/workflow/WorkflowCanvasInner.js.map +1 -1
- package/workflow/WorkflowDiffGraph.js +6 -2
- package/workflow/WorkflowDiffGraph.js.map +1 -1
- package/workflow/WorkflowExecutionViewer.d.ts +51 -0
- package/workflow/WorkflowExecutionViewer.d.ts.map +1 -1
- package/workflow/WorkflowExecutionViewer.js +23 -6
- package/workflow/WorkflowExecutionViewer.js.map +1 -1
- package/workflow/WorkflowExplainDialog.d.ts.map +1 -1
- package/workflow/WorkflowExplainDialog.js +6 -8
- package/workflow/WorkflowExplainDialog.js.map +1 -1
- package/workflow/WorkflowOverviewGraph.js +8 -2
- package/workflow/WorkflowOverviewGraph.js.map +1 -1
- package/workflow/WorkflowRefinePanel.d.ts.map +1 -1
- package/workflow/WorkflowRefinePanel.js +2 -4
- package/workflow/WorkflowRefinePanel.js.map +1 -1
- package/workflow/WorkflowRepairCard.d.ts.map +1 -1
- package/workflow/WorkflowRepairCard.js +2 -4
- package/workflow/WorkflowRepairCard.js.map +1 -1
- package/workflow/WorkflowRunDialog.d.ts.map +1 -1
- package/workflow/WorkflowRunDialog.js +2 -7
- 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.js +1 -1
- package/workflow/instance/WorkflowInstanceDetailPanel.d.ts.map +1 -1
- package/workflow/instance/WorkflowInstanceDetailPanel.js +1 -1
- package/workflow/instance/WorkflowInstanceDetailPanel.js.map +1 -1
- package/workflow/picker/BranchAddPopover.d.ts.map +1 -1
- package/workflow/picker/BranchAddPopover.js +3 -2
- package/workflow/picker/BranchAddPopover.js.map +1 -1
- package/workflow/templates/WorkflowTemplatePreview.js +1 -1
- package/workflow/useApprovalBoundary.d.ts +1 -1
- package/workflow/useApprovalBoundary.js +1 -1
- package/workflow/useWorkflowCanvas.d.ts +5 -1
- package/workflow/useWorkflowCanvas.d.ts.map +1 -1
- package/workflow/useWorkflowCanvas.js +99 -13
- package/workflow/useWorkflowCanvas.js.map +1 -1
- package/workflow/useWorkflowExecutionPanel.d.ts +38 -2
- package/workflow/useWorkflowExecutionPanel.d.ts.map +1 -1
- package/workflow/useWorkflowExecutionPanel.js +46 -13
- package/workflow/useWorkflowExecutionPanel.js.map +1 -1
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import type { McpServer } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/api_pb";
|
|
2
|
+
import type { McpServerInput } from "@stigmer/sdk";
|
|
3
|
+
import { mcpServerToInput } from "./mcpServerToInput.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Connection-defining field groups a marketplace definition can drift on.
|
|
7
|
+
*
|
|
8
|
+
* Stable identifiers, not display copy — {@link DefinitionDriftNotice}
|
|
9
|
+
* owns the human-readable labels. Cosmetic fields (description, icon,
|
|
10
|
+
* tags, repository metadata, env var descriptions) are deliberately NOT
|
|
11
|
+
* drift: they cannot break a connection, so they never nag — they simply
|
|
12
|
+
* ride along when the user refreshes.
|
|
13
|
+
*/
|
|
14
|
+
export type DriftFieldId =
|
|
15
|
+
| "transport"
|
|
16
|
+
| "endpoint"
|
|
17
|
+
| "headers"
|
|
18
|
+
| "queryParams"
|
|
19
|
+
| "timeout"
|
|
20
|
+
| "command"
|
|
21
|
+
| "workingDirectory"
|
|
22
|
+
| "environmentVariables"
|
|
23
|
+
| "authentication";
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Deep equality over the plain-object projections produced by
|
|
27
|
+
* `mcpServerToInput`. Key order is irrelevant (proto map iteration order
|
|
28
|
+
* is not canonical); `undefined` values and absent keys are equivalent
|
|
29
|
+
* (the conversion uses `undefined` for proto defaults).
|
|
30
|
+
*/
|
|
31
|
+
function deepEqual(a: unknown, b: unknown): boolean {
|
|
32
|
+
if (Object.is(a, b)) return true;
|
|
33
|
+
if (Array.isArray(a) || Array.isArray(b)) {
|
|
34
|
+
return (
|
|
35
|
+
Array.isArray(a) &&
|
|
36
|
+
Array.isArray(b) &&
|
|
37
|
+
a.length === b.length &&
|
|
38
|
+
a.every((v, i) => deepEqual(v, b[i]))
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
if (isRecord(a) && isRecord(b)) {
|
|
42
|
+
const keys = new Set([...Object.keys(a), ...Object.keys(b)]);
|
|
43
|
+
for (const key of keys) {
|
|
44
|
+
if (!deepEqual(a[key], b[key])) return false;
|
|
45
|
+
}
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function isRecord(v: unknown): v is Record<string, unknown> {
|
|
52
|
+
return typeof v === "object" && v !== null;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* The functional shape of an env declaration map: which vars exist,
|
|
57
|
+
* whether they are secret, whether they are optional. Descriptions are
|
|
58
|
+
* guidance for humans — a description-only template edit must not raise
|
|
59
|
+
* a drift notice.
|
|
60
|
+
*/
|
|
61
|
+
function functionalEnvShape(env: McpServerInput["env"]) {
|
|
62
|
+
if (!env) return undefined;
|
|
63
|
+
const shape: Record<string, { isSecret?: boolean; optional?: boolean }> = {};
|
|
64
|
+
for (const [key, decl] of Object.entries(env)) {
|
|
65
|
+
shape[key] = { isSecret: decl.isSecret, optional: decl.optional };
|
|
66
|
+
}
|
|
67
|
+
return shape;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Compares an org-owned MCP server against the marketplace definition it
|
|
72
|
+
* mirrors and reports which connection-defining field groups differ, or
|
|
73
|
+
* `null` when the connection-defining configuration matches.
|
|
74
|
+
*
|
|
75
|
+
* The comparison runs on `mcpServerToInput` projections rather than raw
|
|
76
|
+
* protos: that conversion is the SDK's canonical read-modify-write lens,
|
|
77
|
+
* and its exhaustiveness is fence-tested — so a new spec field cannot
|
|
78
|
+
* silently bypass this comparison either.
|
|
79
|
+
*/
|
|
80
|
+
export function computeDefinitionDrift(
|
|
81
|
+
current: McpServer,
|
|
82
|
+
template: McpServer,
|
|
83
|
+
): readonly DriftFieldId[] | null {
|
|
84
|
+
const cur = mcpServerToInput(current);
|
|
85
|
+
const tpl = mcpServerToInput(template);
|
|
86
|
+
|
|
87
|
+
const changed: DriftFieldId[] = [];
|
|
88
|
+
|
|
89
|
+
const curTransport = cur.stdio ? "stdio" : cur.http ? "http" : "none";
|
|
90
|
+
const tplTransport = tpl.stdio ? "stdio" : tpl.http ? "http" : "none";
|
|
91
|
+
|
|
92
|
+
if (curTransport !== tplTransport) {
|
|
93
|
+
changed.push("transport");
|
|
94
|
+
} else if (curTransport === "http") {
|
|
95
|
+
if (cur.http!.url !== tpl.http!.url) changed.push("endpoint");
|
|
96
|
+
if (!deepEqual(cur.http!.headers, tpl.http!.headers)) changed.push("headers");
|
|
97
|
+
if (!deepEqual(cur.http!.queryParams, tpl.http!.queryParams)) {
|
|
98
|
+
changed.push("queryParams");
|
|
99
|
+
}
|
|
100
|
+
if (cur.http!.timeoutSeconds !== tpl.http!.timeoutSeconds) {
|
|
101
|
+
changed.push("timeout");
|
|
102
|
+
}
|
|
103
|
+
} else if (curTransport === "stdio") {
|
|
104
|
+
if (
|
|
105
|
+
cur.stdio!.command !== tpl.stdio!.command ||
|
|
106
|
+
!deepEqual(cur.stdio!.args, tpl.stdio!.args)
|
|
107
|
+
) {
|
|
108
|
+
changed.push("command");
|
|
109
|
+
}
|
|
110
|
+
if (cur.stdio!.workingDir !== tpl.stdio!.workingDir) {
|
|
111
|
+
changed.push("workingDirectory");
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (!deepEqual(functionalEnvShape(cur.env), functionalEnvShape(tpl.env))) {
|
|
116
|
+
changed.push("environmentVariables");
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (!deepEqual(cur.auth, tpl.auth)) {
|
|
120
|
+
changed.push("authentication");
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return changed.length > 0 ? changed : null;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Builds the update payload for a one-click "refresh from marketplace".
|
|
128
|
+
*
|
|
129
|
+
* Definition fields — transport, env declarations, auth, and the cosmetic
|
|
130
|
+
* description/icon/tags/repository metadata — come from the template.
|
|
131
|
+
* The user's own choices survive: identity (name/org/slug/labels), tool
|
|
132
|
+
* enablement, and pinned approval policies. Visibility is not part of the
|
|
133
|
+
* input contract at all (the backend preserves it on update;
|
|
134
|
+
* `updateVisibility` is its dedicated write path).
|
|
135
|
+
*
|
|
136
|
+
* Built by merging two `mcpServerToInput` projections, so the preserved
|
|
137
|
+
* set is the explicit override list below and nothing can be lost in
|
|
138
|
+
* translation (the conversion is fence-tested exhaustive).
|
|
139
|
+
*/
|
|
140
|
+
export function buildRefreshInput(
|
|
141
|
+
current: McpServer,
|
|
142
|
+
template: McpServer,
|
|
143
|
+
): McpServerInput {
|
|
144
|
+
const cur = mcpServerToInput(current);
|
|
145
|
+
const tpl = mcpServerToInput(template);
|
|
146
|
+
|
|
147
|
+
return {
|
|
148
|
+
...tpl,
|
|
149
|
+
// Identity: the update must land on the user's own resource.
|
|
150
|
+
name: cur.name,
|
|
151
|
+
org: cur.org,
|
|
152
|
+
slug: cur.slug,
|
|
153
|
+
labels: cur.labels,
|
|
154
|
+
// User policy: never reset by a definition refresh.
|
|
155
|
+
defaultEnabledTools: cur.defaultEnabledTools,
|
|
156
|
+
pinnedToolApprovals: cur.pinnedToolApprovals,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
@@ -36,6 +36,7 @@ export function mcpServerToInput(server: McpServer): McpServerInput {
|
|
|
36
36
|
? spec.pinnedToolApprovals.map((p) => ({
|
|
37
37
|
toolName: p.toolName || undefined,
|
|
38
38
|
message: p.message || undefined,
|
|
39
|
+
fromDestructiveHint: p.fromDestructiveHint || undefined,
|
|
39
40
|
}))
|
|
40
41
|
: undefined;
|
|
41
42
|
|
|
@@ -48,6 +49,7 @@ export function mcpServerToInput(server: McpServer): McpServerInput {
|
|
|
48
49
|
tokenLifetimeHint: spec.auth.tokenLifetimeHint || undefined,
|
|
49
50
|
scopeHints: spec.auth.scopeHints.length > 0 ? [...spec.auth.scopeHints] : undefined,
|
|
50
51
|
discoveryUrl: spec.auth.discoveryUrl || undefined,
|
|
52
|
+
oauthOnly: spec.auth.oauthOnly || undefined,
|
|
51
53
|
}
|
|
52
54
|
: undefined;
|
|
53
55
|
|
|
@@ -60,6 +62,7 @@ export function mcpServerToInput(server: McpServer): McpServerInput {
|
|
|
60
62
|
: undefined,
|
|
61
63
|
description: spec?.description || undefined,
|
|
62
64
|
iconUrl: spec?.iconUrl || undefined,
|
|
65
|
+
tags: spec?.tags?.length ? [...spec.tags] : undefined,
|
|
63
66
|
defaultEnabledTools: spec?.defaultEnabledTools?.length
|
|
64
67
|
? [...spec.defaultEnabledTools]
|
|
65
68
|
: undefined,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import { useCallback, useState } from "react";
|
|
3
|
+
import { useCallback, useId, useState } from "react";
|
|
4
4
|
import { cn } from "@stigmer/theme";
|
|
5
5
|
import type { McpServerWizardData, EnvVarEntry } from "./types.js";
|
|
6
6
|
|
|
@@ -25,6 +25,7 @@ export function EnvironmentAuthStep({
|
|
|
25
25
|
data,
|
|
26
26
|
updateData,
|
|
27
27
|
}: EnvironmentAuthStepProps) {
|
|
28
|
+
const baseId = useId();
|
|
28
29
|
const [envExpanded, setEnvExpanded] = useState(data.env.length > 0);
|
|
29
30
|
|
|
30
31
|
return (
|
|
@@ -41,7 +42,6 @@ export function EnvironmentAuthStep({
|
|
|
41
42
|
|
|
42
43
|
{/* Environment Variables */}
|
|
43
44
|
<CollapsibleSection
|
|
44
|
-
id="env"
|
|
45
45
|
title="Environment Variables"
|
|
46
46
|
subtitle="Secrets and configuration the server requires at runtime"
|
|
47
47
|
count={data.env.length}
|
|
@@ -56,7 +56,6 @@ export function EnvironmentAuthStep({
|
|
|
56
56
|
|
|
57
57
|
{/* Auth Configuration */}
|
|
58
58
|
<CollapsibleSection
|
|
59
|
-
id="auth"
|
|
60
59
|
title="OAuth Authentication"
|
|
61
60
|
subtitle="Configure OAuth for servers that require user authorization"
|
|
62
61
|
expanded={data.authEnabled}
|
|
@@ -66,13 +65,13 @@ export function EnvironmentAuthStep({
|
|
|
66
65
|
<div className="stg:grid stg:gap-4 stg:sm:grid-cols-2">
|
|
67
66
|
<div className="stg:space-y-1.5">
|
|
68
67
|
<label
|
|
69
|
-
htmlFor=
|
|
68
|
+
htmlFor={`${baseId}-app-org`}
|
|
70
69
|
className="stg:text-sm stg:font-medium stg:text-foreground"
|
|
71
70
|
>
|
|
72
71
|
OAuth App Organization
|
|
73
72
|
</label>
|
|
74
73
|
<input
|
|
75
|
-
id=
|
|
74
|
+
id={`${baseId}-app-org`}
|
|
76
75
|
type="text"
|
|
77
76
|
value={data.authOAuthAppOrg}
|
|
78
77
|
onChange={(e) =>
|
|
@@ -89,13 +88,13 @@ export function EnvironmentAuthStep({
|
|
|
89
88
|
|
|
90
89
|
<div className="stg:space-y-1.5">
|
|
91
90
|
<label
|
|
92
|
-
htmlFor=
|
|
91
|
+
htmlFor={`${baseId}-app-slug`}
|
|
93
92
|
className="stg:text-sm stg:font-medium stg:text-foreground"
|
|
94
93
|
>
|
|
95
94
|
OAuth App Slug
|
|
96
95
|
</label>
|
|
97
96
|
<input
|
|
98
|
-
id=
|
|
97
|
+
id={`${baseId}-app-slug`}
|
|
99
98
|
type="text"
|
|
100
99
|
value={data.authOAuthAppSlug}
|
|
101
100
|
onChange={(e) =>
|
|
@@ -113,13 +112,13 @@ export function EnvironmentAuthStep({
|
|
|
113
112
|
|
|
114
113
|
<div className="stg:space-y-1.5">
|
|
115
114
|
<label
|
|
116
|
-
htmlFor=
|
|
115
|
+
htmlFor={`${baseId}-target-var`}
|
|
117
116
|
className="stg:text-sm stg:font-medium stg:text-foreground"
|
|
118
117
|
>
|
|
119
118
|
Target Environment Variable
|
|
120
119
|
</label>
|
|
121
120
|
<input
|
|
122
|
-
id=
|
|
121
|
+
id={`${baseId}-target-var`}
|
|
123
122
|
type="text"
|
|
124
123
|
value={data.authTargetEnvVar}
|
|
125
124
|
onChange={(e) =>
|
|
@@ -140,13 +139,13 @@ export function EnvironmentAuthStep({
|
|
|
140
139
|
<div className="stg:grid stg:gap-4 stg:sm:grid-cols-2">
|
|
141
140
|
<div className="stg:space-y-1.5">
|
|
142
141
|
<label
|
|
143
|
-
htmlFor=
|
|
142
|
+
htmlFor={`${baseId}-lifetime`}
|
|
144
143
|
className="stg:text-sm stg:font-medium stg:text-foreground"
|
|
145
144
|
>
|
|
146
145
|
Token Lifetime Hint
|
|
147
146
|
</label>
|
|
148
147
|
<input
|
|
149
|
-
id=
|
|
148
|
+
id={`${baseId}-lifetime`}
|
|
150
149
|
type="text"
|
|
151
150
|
value={data.authTokenLifetimeHint}
|
|
152
151
|
onChange={(e) =>
|
|
@@ -163,13 +162,13 @@ export function EnvironmentAuthStep({
|
|
|
163
162
|
|
|
164
163
|
<div className="stg:space-y-1.5">
|
|
165
164
|
<label
|
|
166
|
-
htmlFor=
|
|
165
|
+
htmlFor={`${baseId}-scopes`}
|
|
167
166
|
className="stg:text-sm stg:font-medium stg:text-foreground"
|
|
168
167
|
>
|
|
169
168
|
Scope Hints
|
|
170
169
|
</label>
|
|
171
170
|
<input
|
|
172
|
-
id=
|
|
171
|
+
id={`${baseId}-scopes`}
|
|
173
172
|
type="text"
|
|
174
173
|
value={data.authScopeHints}
|
|
175
174
|
onChange={(e) =>
|
|
@@ -190,13 +189,13 @@ export function EnvironmentAuthStep({
|
|
|
190
189
|
|
|
191
190
|
<div className="stg:space-y-1.5">
|
|
192
191
|
<label
|
|
193
|
-
htmlFor=
|
|
192
|
+
htmlFor={`${baseId}-discovery`}
|
|
194
193
|
className="stg:text-sm stg:font-medium stg:text-foreground"
|
|
195
194
|
>
|
|
196
195
|
Discovery URL
|
|
197
196
|
</label>
|
|
198
197
|
<input
|
|
199
|
-
id=
|
|
198
|
+
id={`${baseId}-discovery`}
|
|
200
199
|
type="url"
|
|
201
200
|
value={data.authDiscoveryUrl}
|
|
202
201
|
onChange={(e) =>
|
|
@@ -221,7 +220,6 @@ export function EnvironmentAuthStep({
|
|
|
221
220
|
// ---------------------------------------------------------------------------
|
|
222
221
|
|
|
223
222
|
function CollapsibleSection({
|
|
224
|
-
id,
|
|
225
223
|
title,
|
|
226
224
|
subtitle,
|
|
227
225
|
count,
|
|
@@ -229,7 +227,6 @@ function CollapsibleSection({
|
|
|
229
227
|
onToggle,
|
|
230
228
|
children,
|
|
231
229
|
}: {
|
|
232
|
-
readonly id: string;
|
|
233
230
|
readonly title: string;
|
|
234
231
|
readonly subtitle: string;
|
|
235
232
|
readonly count?: number;
|
|
@@ -237,13 +234,16 @@ function CollapsibleSection({
|
|
|
237
234
|
readonly onToggle: () => void;
|
|
238
235
|
readonly children: React.ReactNode;
|
|
239
236
|
}) {
|
|
237
|
+
// The disclosure-panel DOM id is minted per mount — deriving it from a
|
|
238
|
+
// static section key would collide when two wizards mount on one page.
|
|
239
|
+
const panelId = useId();
|
|
240
240
|
return (
|
|
241
241
|
<div className="stg:overflow-hidden stg:rounded-lg stg:border stg:border-border">
|
|
242
242
|
<button
|
|
243
243
|
type="button"
|
|
244
244
|
onClick={onToggle}
|
|
245
245
|
aria-expanded={expanded}
|
|
246
|
-
aria-controls={
|
|
246
|
+
aria-controls={panelId}
|
|
247
247
|
className={cn(
|
|
248
248
|
"stg:flex stg:w-full stg:items-center stg:justify-between stg:px-4 stg:py-3 stg:text-left stg:transition-colors",
|
|
249
249
|
"stg:hover:bg-accent-hover",
|
|
@@ -269,7 +269,7 @@ function CollapsibleSection({
|
|
|
269
269
|
|
|
270
270
|
{expanded && (
|
|
271
271
|
<div
|
|
272
|
-
id={
|
|
272
|
+
id={panelId}
|
|
273
273
|
className="stg:border-t stg:border-border stg:px-4 stg:py-4"
|
|
274
274
|
>
|
|
275
275
|
{children}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import { useCallback } from "react";
|
|
3
|
+
import { useCallback, useId } from "react";
|
|
4
4
|
import { cn } from "@stigmer/theme";
|
|
5
5
|
import { generateSlug } from "../../internal/slug.js";
|
|
6
6
|
import type { McpServerWizardData, KeyValueEntry } from "./types.js";
|
|
@@ -35,6 +35,7 @@ export function IdentityTransportStep({
|
|
|
35
35
|
updateData,
|
|
36
36
|
validationError,
|
|
37
37
|
}: IdentityTransportStepProps) {
|
|
38
|
+
const baseId = useId();
|
|
38
39
|
const handleNameChange = useCallback(
|
|
39
40
|
(value: string) => {
|
|
40
41
|
if (!data.slugTouched) {
|
|
@@ -79,13 +80,13 @@ export function IdentityTransportStep({
|
|
|
79
80
|
<div className="stg:grid stg:gap-4 stg:sm:grid-cols-2">
|
|
80
81
|
<div className="stg:space-y-1.5">
|
|
81
82
|
<label
|
|
82
|
-
htmlFor=
|
|
83
|
+
htmlFor={`${baseId}-name`}
|
|
83
84
|
className="stg:text-sm stg:font-medium stg:text-foreground"
|
|
84
85
|
>
|
|
85
86
|
Name <span className="stg:text-destructive">*</span>
|
|
86
87
|
</label>
|
|
87
88
|
<input
|
|
88
|
-
id=
|
|
89
|
+
id={`${baseId}-name`}
|
|
89
90
|
type="text"
|
|
90
91
|
value={data.name}
|
|
91
92
|
onChange={(e) => handleNameChange(e.target.value)}
|
|
@@ -101,13 +102,13 @@ export function IdentityTransportStep({
|
|
|
101
102
|
|
|
102
103
|
<div className="stg:space-y-1.5">
|
|
103
104
|
<label
|
|
104
|
-
htmlFor=
|
|
105
|
+
htmlFor={`${baseId}-slug`}
|
|
105
106
|
className="stg:text-sm stg:font-medium stg:text-foreground"
|
|
106
107
|
>
|
|
107
108
|
Slug
|
|
108
109
|
</label>
|
|
109
110
|
<input
|
|
110
|
-
id=
|
|
111
|
+
id={`${baseId}-slug`}
|
|
111
112
|
type="text"
|
|
112
113
|
value={data.slug}
|
|
113
114
|
onChange={(e) => handleSlugChange(e.target.value)}
|
|
@@ -135,13 +136,13 @@ export function IdentityTransportStep({
|
|
|
135
136
|
{/* Description */}
|
|
136
137
|
<div className="stg:space-y-1.5">
|
|
137
138
|
<label
|
|
138
|
-
htmlFor=
|
|
139
|
+
htmlFor={`${baseId}-description`}
|
|
139
140
|
className="stg:text-sm stg:font-medium stg:text-foreground"
|
|
140
141
|
>
|
|
141
142
|
Description
|
|
142
143
|
</label>
|
|
143
144
|
<input
|
|
144
|
-
id=
|
|
145
|
+
id={`${baseId}-description`}
|
|
145
146
|
type="text"
|
|
146
147
|
value={data.description}
|
|
147
148
|
onChange={(e) => updateData({ description: e.target.value })}
|
|
@@ -159,13 +160,13 @@ export function IdentityTransportStep({
|
|
|
159
160
|
<div className="stg:grid stg:gap-4 stg:sm:grid-cols-2">
|
|
160
161
|
<div className="stg:space-y-1.5">
|
|
161
162
|
<label
|
|
162
|
-
htmlFor=
|
|
163
|
+
htmlFor={`${baseId}-icon`}
|
|
163
164
|
className="stg:text-sm stg:font-medium stg:text-foreground"
|
|
164
165
|
>
|
|
165
166
|
Icon URL
|
|
166
167
|
</label>
|
|
167
168
|
<input
|
|
168
|
-
id=
|
|
169
|
+
id={`${baseId}-icon`}
|
|
169
170
|
type="url"
|
|
170
171
|
value={data.iconUrl}
|
|
171
172
|
onChange={(e) => updateData({ iconUrl: e.target.value })}
|
|
@@ -184,14 +185,14 @@ export function IdentityTransportStep({
|
|
|
184
185
|
</legend>
|
|
185
186
|
<div className="stg:flex stg:gap-2">
|
|
186
187
|
<RadioOption
|
|
187
|
-
name=
|
|
188
|
+
name={`${baseId}-visibility`}
|
|
188
189
|
value="private"
|
|
189
190
|
label="Private"
|
|
190
191
|
checked={data.visibility === "private"}
|
|
191
192
|
onChange={() => updateData({ visibility: "private" })}
|
|
192
193
|
/>
|
|
193
194
|
<RadioOption
|
|
194
|
-
name=
|
|
195
|
+
name={`${baseId}-visibility`}
|
|
195
196
|
value="public"
|
|
196
197
|
label="Public"
|
|
197
198
|
checked={data.visibility === "public"}
|
|
@@ -209,14 +210,14 @@ export function IdentityTransportStep({
|
|
|
209
210
|
</legend>
|
|
210
211
|
<div className="stg:flex stg:gap-2">
|
|
211
212
|
<RadioOption
|
|
212
|
-
name=
|
|
213
|
+
name={`${baseId}-transport`}
|
|
213
214
|
value="http"
|
|
214
215
|
label="HTTP (Streamable HTTP / SSE)"
|
|
215
216
|
checked={data.transportType === "http"}
|
|
216
217
|
onChange={() => updateData({ transportType: "http" })}
|
|
217
218
|
/>
|
|
218
219
|
<RadioOption
|
|
219
|
-
name=
|
|
220
|
+
name={`${baseId}-transport`}
|
|
220
221
|
value="stdio"
|
|
221
222
|
label="Stdio (local process)"
|
|
222
223
|
checked={data.transportType === "stdio"}
|
|
@@ -236,13 +237,13 @@ export function IdentityTransportStep({
|
|
|
236
237
|
<div className="stg:flex stg:flex-col stg:gap-4 stg:rounded-lg stg:border stg:border-border stg:p-4">
|
|
237
238
|
<div className="stg:space-y-1.5">
|
|
238
239
|
<label
|
|
239
|
-
htmlFor=
|
|
240
|
+
htmlFor={`${baseId}-http-url`}
|
|
240
241
|
className="stg:text-sm stg:font-medium stg:text-foreground"
|
|
241
242
|
>
|
|
242
243
|
URL <span className="stg:text-destructive">*</span>
|
|
243
244
|
</label>
|
|
244
245
|
<input
|
|
245
|
-
id=
|
|
246
|
+
id={`${baseId}-http-url`}
|
|
246
247
|
type="url"
|
|
247
248
|
value={data.httpUrl}
|
|
248
249
|
onChange={(e) => updateData({ httpUrl: e.target.value })}
|
|
@@ -274,13 +275,13 @@ export function IdentityTransportStep({
|
|
|
274
275
|
|
|
275
276
|
<div className="stg:space-y-1.5">
|
|
276
277
|
<label
|
|
277
|
-
htmlFor=
|
|
278
|
+
htmlFor={`${baseId}-http-timeout`}
|
|
278
279
|
className="stg:text-sm stg:font-medium stg:text-foreground"
|
|
279
280
|
>
|
|
280
281
|
Timeout (seconds)
|
|
281
282
|
</label>
|
|
282
283
|
<input
|
|
283
|
-
id=
|
|
284
|
+
id={`${baseId}-http-timeout`}
|
|
284
285
|
type="number"
|
|
285
286
|
min={0}
|
|
286
287
|
step={1}
|
|
@@ -308,13 +309,13 @@ export function IdentityTransportStep({
|
|
|
308
309
|
<div className="stg:flex stg:flex-col stg:gap-4 stg:rounded-lg stg:border stg:border-border stg:p-4">
|
|
309
310
|
<div className="stg:space-y-1.5">
|
|
310
311
|
<label
|
|
311
|
-
htmlFor=
|
|
312
|
+
htmlFor={`${baseId}-stdio-command`}
|
|
312
313
|
className="stg:text-sm stg:font-medium stg:text-foreground"
|
|
313
314
|
>
|
|
314
315
|
Command <span className="stg:text-destructive">*</span>
|
|
315
316
|
</label>
|
|
316
317
|
<input
|
|
317
|
-
id=
|
|
318
|
+
id={`${baseId}-stdio-command`}
|
|
318
319
|
type="text"
|
|
319
320
|
value={data.stdioCommand}
|
|
320
321
|
onChange={(e) => updateData({ stdioCommand: e.target.value })}
|
|
@@ -329,13 +330,13 @@ export function IdentityTransportStep({
|
|
|
329
330
|
|
|
330
331
|
<div className="stg:space-y-1.5">
|
|
331
332
|
<label
|
|
332
|
-
htmlFor=
|
|
333
|
+
htmlFor={`${baseId}-stdio-args`}
|
|
333
334
|
className="stg:text-sm stg:font-medium stg:text-foreground"
|
|
334
335
|
>
|
|
335
336
|
Arguments
|
|
336
337
|
</label>
|
|
337
338
|
<input
|
|
338
|
-
id=
|
|
339
|
+
id={`${baseId}-stdio-args`}
|
|
339
340
|
type="text"
|
|
340
341
|
value={data.stdioArgs}
|
|
341
342
|
onChange={(e) => updateData({ stdioArgs: e.target.value })}
|
|
@@ -353,13 +354,13 @@ export function IdentityTransportStep({
|
|
|
353
354
|
|
|
354
355
|
<div className="stg:space-y-1.5">
|
|
355
356
|
<label
|
|
356
|
-
htmlFor=
|
|
357
|
+
htmlFor={`${baseId}-stdio-workdir`}
|
|
357
358
|
className="stg:text-sm stg:font-medium stg:text-foreground"
|
|
358
359
|
>
|
|
359
360
|
Working Directory
|
|
360
361
|
</label>
|
|
361
362
|
<input
|
|
362
|
-
id=
|
|
363
|
+
id={`${baseId}-stdio-workdir`}
|
|
363
364
|
type="text"
|
|
364
365
|
value={data.stdioWorkingDir}
|
|
365
366
|
onChange={(e) =>
|
|
@@ -16,7 +16,7 @@ export interface UseMcpServerConnectReturn {
|
|
|
16
16
|
* and classify tool approval policies via a lightweight LLM call.
|
|
17
17
|
*
|
|
18
18
|
* Calls the `connect` RPC which starts a Temporal workflow on the
|
|
19
|
-
*
|
|
19
|
+
* runner. The RPC blocks until the workflow completes
|
|
20
20
|
* (typically 5-15 seconds, ~30s timeout).
|
|
21
21
|
*
|
|
22
22
|
* Platform system env vars (`STIGMER_SERVER_ADDRESS`,
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import type { McpServer } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/api_pb";
|
|
4
|
+
import { useStigmer } from "../hooks.js";
|
|
5
|
+
import { useFetch } from "../internal/useFetch.js";
|
|
6
|
+
import {
|
|
7
|
+
computeDefinitionDrift,
|
|
8
|
+
type DriftFieldId,
|
|
9
|
+
} from "./internal/definitionDrift.js";
|
|
10
|
+
|
|
11
|
+
/** A detected divergence from the marketplace definition. */
|
|
12
|
+
export interface McpServerDefinitionDrift {
|
|
13
|
+
/** The marketplace definition the comparison ran against. */
|
|
14
|
+
readonly template: McpServer;
|
|
15
|
+
/** Connection-defining field groups that differ. Never empty. */
|
|
16
|
+
readonly changedFields: readonly DriftFieldId[];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** Return value of {@link useMcpServerDefinitionDrift}. */
|
|
20
|
+
export interface UseMcpServerDefinitionDriftReturn {
|
|
21
|
+
/**
|
|
22
|
+
* The detected drift, or `null` — which covers all of: still checking,
|
|
23
|
+
* no marketplace counterpart, ambiguous counterpart, configurations
|
|
24
|
+
* match, or the check failed. Consumers need no other state: this is an
|
|
25
|
+
* advisory affordance, not page data.
|
|
26
|
+
*/
|
|
27
|
+
readonly drift: McpServerDefinitionDrift | null;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Detects when an org-owned MCP server's connection-defining
|
|
32
|
+
* configuration has drifted from the marketplace definition it mirrors
|
|
33
|
+
* (stigmer/stigmer#228: a template fix — e.g. monday.com's OAuth header —
|
|
34
|
+
* never reached servers copied before the fix, stranding them on a
|
|
35
|
+
* configuration that can never connect).
|
|
36
|
+
*
|
|
37
|
+
* **How the marketplace counterpart is found.** Connected copies carry no
|
|
38
|
+
* reference back to their template, so the hook uses the platform's own
|
|
39
|
+
* client-side definition of "marketplace": the search RPC's
|
|
40
|
+
* `crossOrgPublic` scope (what the library's "All" tab shows). A public
|
|
41
|
+
* row with the exact same slug from a different org is treated as the
|
|
42
|
+
* template. Zero or multiple candidates means there is nothing
|
|
43
|
+
* trustworthy to compare against — the hook stays quiet.
|
|
44
|
+
*
|
|
45
|
+
* **Fail-quiet by design.** Drift detection is advisory. No network
|
|
46
|
+
* error, missing template, or ambiguity may ever degrade the detail page,
|
|
47
|
+
* so every failure path resolves to `null` rather than an error state.
|
|
48
|
+
*
|
|
49
|
+
* Pass `null` to skip (stable no-op) — callers gate on editability, since
|
|
50
|
+
* the paired refresh action writes to the resource and the notice is
|
|
51
|
+
* meaningless to viewers who cannot act on it.
|
|
52
|
+
*/
|
|
53
|
+
export function useMcpServerDefinitionDrift(
|
|
54
|
+
mcpServer: McpServer | null,
|
|
55
|
+
): UseMcpServerDefinitionDriftReturn {
|
|
56
|
+
const stigmer = useStigmer();
|
|
57
|
+
|
|
58
|
+
const org = mcpServer?.metadata?.org ?? null;
|
|
59
|
+
const slug = mcpServer?.metadata?.slug ?? null;
|
|
60
|
+
|
|
61
|
+
const { data: drift } = useFetch<McpServerDefinitionDrift | null>(
|
|
62
|
+
mcpServer && org && slug
|
|
63
|
+
? async () => {
|
|
64
|
+
try {
|
|
65
|
+
const result = await stigmer.mcpServer.list({
|
|
66
|
+
org,
|
|
67
|
+
query: slug,
|
|
68
|
+
crossOrgPublic: true,
|
|
69
|
+
});
|
|
70
|
+
const candidateOrgs = [
|
|
71
|
+
...new Set(
|
|
72
|
+
result.entries
|
|
73
|
+
.filter((e) => e.slug === slug && e.org && e.org !== org)
|
|
74
|
+
.map((e) => e.org),
|
|
75
|
+
),
|
|
76
|
+
];
|
|
77
|
+
if (candidateOrgs.length !== 1) return null;
|
|
78
|
+
|
|
79
|
+
const template = await stigmer.mcpServer.getByReference({
|
|
80
|
+
org: candidateOrgs[0],
|
|
81
|
+
slug,
|
|
82
|
+
});
|
|
83
|
+
const changedFields = computeDefinitionDrift(mcpServer, template);
|
|
84
|
+
return changedFields ? { template, changedFields } : null;
|
|
85
|
+
} catch {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
: null,
|
|
90
|
+
[mcpServer, org, slug, stigmer],
|
|
91
|
+
null,
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
return { drift };
|
|
95
|
+
}
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
3
|
import { createContext, useContext } from "react";
|
|
4
|
-
import type { ModelInfo } from "./registry.js";
|
|
4
|
+
import type { ModelInfo, VisionLimits } from "./registry.js";
|
|
5
5
|
|
|
6
6
|
/** Internal state held by the model registry context provider. */
|
|
7
7
|
export interface ModelRegistryState {
|
|
8
8
|
readonly models: readonly ModelInfo[];
|
|
9
|
+
/**
|
|
10
|
+
* Document-level vision byte budget (stigmer/stigmer#365).
|
|
11
|
+
* `undefined` while loading or when the served document predates the
|
|
12
|
+
* `limits` block — consumers stay silent rather than assume a budget.
|
|
13
|
+
*/
|
|
14
|
+
readonly visionLimits?: VisionLimits;
|
|
9
15
|
readonly isLoading: boolean;
|
|
10
16
|
readonly error: Error | null;
|
|
11
17
|
/** Retry fetching the model registry. No-op while a fetch is in flight. */
|