@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
|
@@ -11,6 +11,7 @@ import { diffEnv } from "../environment/diffEnv.js";
|
|
|
11
11
|
import { SYSTEM_ENV_VAR_KEYS } from "../environment/systemEnvVars.js";
|
|
12
12
|
import type { EnvVarFormVariable } from "../environment/EnvVarForm.js";
|
|
13
13
|
import { useOAuthGrantStatus } from "./useOAuthGrantStatus.js";
|
|
14
|
+
import { useOrgOAuthApp } from "./useOrgOAuthApp.js";
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
17
|
* Credential acquisition mode for an MCP server.
|
|
@@ -93,9 +94,15 @@ export interface UseMcpServerCredentialsReturn {
|
|
|
93
94
|
* Servers whose env vars are all optional are always ready.
|
|
94
95
|
*/
|
|
95
96
|
readonly isReady: boolean;
|
|
96
|
-
/**
|
|
97
|
+
/**
|
|
98
|
+
* `true` while the personal environment, grant status, or org-override
|
|
99
|
+
* lookup is being fetched.
|
|
100
|
+
*/
|
|
97
101
|
readonly isLoading: boolean;
|
|
98
|
-
/**
|
|
102
|
+
/**
|
|
103
|
+
* Error from the personal environment, grant status, or org-override
|
|
104
|
+
* fetch, or `null`.
|
|
105
|
+
*/
|
|
99
106
|
readonly error: Error | null;
|
|
100
107
|
/**
|
|
101
108
|
* Save the provided credentials to the user's personal environment.
|
|
@@ -131,22 +138,35 @@ export interface UseMcpServerCredentialsReturn {
|
|
|
131
138
|
*/
|
|
132
139
|
readonly isVendorApprovalBlocked: boolean;
|
|
133
140
|
/**
|
|
134
|
-
* Where the effective OAuth app
|
|
141
|
+
* Where the effective OAuth app is resolved from for the caller's org
|
|
142
|
+
* — the same source the connect flow will use.
|
|
135
143
|
*
|
|
136
|
-
*
|
|
137
|
-
* `
|
|
138
|
-
*
|
|
144
|
+
* Resolved client-side from the `getOrgOAuthApp` RPC keyed on this
|
|
145
|
+
* hook's `org` parameter. It cannot come from the fetched McpServer:
|
|
146
|
+
* the caller's active org is client-side context the read RPCs never
|
|
147
|
+
* carry, so `status.oauth_status` fields 3-4 are never populated by
|
|
148
|
+
* any backend (see the OAuthStatus proto).
|
|
149
|
+
*
|
|
150
|
+
* `UNSPECIFIED` when `authMode` is `"manual"` or while the override
|
|
151
|
+
* lookup has not yet resolved.
|
|
139
152
|
*/
|
|
140
153
|
readonly effectiveOAuthSource: OAuthAppSource;
|
|
141
154
|
/**
|
|
142
|
-
* `true` when an org-level BYOA override is active for this server
|
|
143
|
-
* Derived from `
|
|
155
|
+
* `true` when an org-level BYOA override is active for this server
|
|
156
|
+
* and org. Derived from the `getOrgOAuthApp` lookup.
|
|
144
157
|
*/
|
|
145
158
|
readonly isOrgOAuthApp: boolean;
|
|
146
159
|
/**
|
|
147
160
|
* `true` when the BYOA option is relevant for this server: the server
|
|
148
|
-
* uses vendor OAuth (`authMode === "oauth"` with an `oauth_app_ref`)
|
|
149
|
-
*
|
|
161
|
+
* uses vendor OAuth (`authMode === "oauth"` with an `oauth_app_ref`),
|
|
162
|
+
* no org override is currently active, AND the backend supports the
|
|
163
|
+
* org-override surface at all.
|
|
164
|
+
*
|
|
165
|
+
* The last condition is an edition capability, confirmed by probing
|
|
166
|
+
* `getOrgOAuthApp` (see {@link useOrgOAuthApp}): the surface is
|
|
167
|
+
* hosted-only, so on OSS deployments — where the submit could only
|
|
168
|
+
* answer UNIMPLEMENTED — this stays `false` and no BYOA affordance
|
|
169
|
+
* renders (stigmer/stigmer#558).
|
|
150
170
|
*
|
|
151
171
|
* When `true`, the UI should offer "Use your own OAuth app" as either
|
|
152
172
|
* a primary action (when vendor approval is blocked) or a secondary
|
|
@@ -201,6 +221,15 @@ export interface UseMcpServerCredentialsReturn {
|
|
|
201
221
|
* form. Additional non-OAuth vars still appear in `missingVariables`
|
|
202
222
|
* (mixed mode).
|
|
203
223
|
*
|
|
224
|
+
* **Org-override-aware**: for vendor-OAuth servers with an
|
|
225
|
+
* `oauth_app_ref`, the hook also composes {@link useOrgOAuthApp} to
|
|
226
|
+
* resolve which OAuth app the connect flow will use for `org`
|
|
227
|
+
* (`effectiveOAuthSource` / `isOrgOAuthApp` / `canBringOwnApp`).
|
|
228
|
+
* The `org` parameter must therefore be the caller's ACTIVE org — the
|
|
229
|
+
* org credentials are stored in and the org whose BYOA override
|
|
230
|
+
* applies — not necessarily the org that owns the MCP server (they
|
|
231
|
+
* differ when browsing another org's public server).
|
|
232
|
+
*
|
|
204
233
|
* Unlike {@link useMcpServerSetup} which manages multi-server setup
|
|
205
234
|
* for session creation, this hook is scoped to a single server and
|
|
206
235
|
* always persists to the personal environment (no one-time option).
|
|
@@ -281,14 +310,51 @@ export function useMcpServerCredentials(
|
|
|
281
310
|
oauthStatus?.vendorApprovalStatus === VendorApprovalStatus.REJECTED);
|
|
282
311
|
const vendorApprovalDocsUrl = oauthStatus?.vendorApprovalDocsUrl || null;
|
|
283
312
|
|
|
284
|
-
const effectiveOAuthSource =
|
|
285
|
-
oauthStatus?.effectiveOauthSource ??
|
|
286
|
-
OAuthAppSource.OAUTH_APP_SOURCE_UNSPECIFIED;
|
|
287
|
-
const isOrgOAuthApp =
|
|
288
|
-
effectiveOAuthSource === OAuthAppSource.OAUTH_APP_SOURCE_ORG_OVERRIDE;
|
|
289
313
|
const hasOAuthAppRef = Boolean(auth?.oauthAppRef?.slug);
|
|
314
|
+
|
|
315
|
+
// Org-override lookup, two duties in one fetch (shared cross-mount via
|
|
316
|
+
// the hook's fetch cache):
|
|
317
|
+
// 1. Capability probe (`isSupported`) — the org-override surface is
|
|
318
|
+
// hosted-only, so BYOA affordances must hide on OSS (#558).
|
|
319
|
+
// 2. The override signal (`hasOverride`) — which OAuthApp the connect
|
|
320
|
+
// flow will actually use for this org. Resolved client-side because
|
|
321
|
+
// the caller's active org is client-side context the read RPCs never
|
|
322
|
+
// carry (get has no org; getByReference's org is the server's OWNING
|
|
323
|
+
// org, which differs from the caller's org when browsing another
|
|
324
|
+
// org's public server), so the fetched McpServer cannot answer this
|
|
325
|
+
// (stigmer-cloud#401).
|
|
326
|
+
// Scoped to vendor-OAuth servers with a platform app ref — the only
|
|
327
|
+
// shape an override can exist for — so manual/DCR servers pay no RPC.
|
|
328
|
+
const orgOverride = useOrgOAuthApp(
|
|
329
|
+
authMode === "oauth" && hasOAuthAppRef
|
|
330
|
+
? (mcpServer?.metadata?.id ?? null)
|
|
331
|
+
: null,
|
|
332
|
+
org,
|
|
333
|
+
);
|
|
334
|
+
|
|
335
|
+
const isOrgOAuthApp = orgOverride.hasOverride;
|
|
336
|
+
// While the lookup is in flight, failed, or unposable (an app ref exists
|
|
337
|
+
// but no org to resolve an override for), the override state is unknown —
|
|
338
|
+
// report UNSPECIFIED rather than guessing PLATFORM, matching the
|
|
339
|
+
// documented "not yet resolved" contract. UNSUPPORTED is not unknown:
|
|
340
|
+
// on OSS the platform-ref app is truthfully the effective source.
|
|
341
|
+
const overrideUnknown =
|
|
342
|
+
orgOverride.isLoading ||
|
|
343
|
+
orgOverride.error !== null ||
|
|
344
|
+
(hasOAuthAppRef && !org);
|
|
345
|
+
const effectiveOAuthSource =
|
|
346
|
+
authMode !== "oauth" || overrideUnknown
|
|
347
|
+
? OAuthAppSource.OAUTH_APP_SOURCE_UNSPECIFIED
|
|
348
|
+
: isOrgOAuthApp
|
|
349
|
+
? OAuthAppSource.OAUTH_APP_SOURCE_ORG_OVERRIDE
|
|
350
|
+
: hasOAuthAppRef
|
|
351
|
+
? OAuthAppSource.OAUTH_APP_SOURCE_PLATFORM
|
|
352
|
+
: OAuthAppSource.OAUTH_APP_SOURCE_NONE;
|
|
290
353
|
const canBringOwnApp =
|
|
291
|
-
authMode === "oauth" &&
|
|
354
|
+
authMode === "oauth" &&
|
|
355
|
+
hasOAuthAppRef &&
|
|
356
|
+
!isOrgOAuthApp &&
|
|
357
|
+
orgOverride.isSupported;
|
|
292
358
|
|
|
293
359
|
const grantStatus = useOAuthGrantStatus(
|
|
294
360
|
authMode === "oauth" ? (mcpServer?.metadata?.id ?? null) : null,
|
|
@@ -339,7 +405,8 @@ export function useMcpServerCredentials(
|
|
|
339
405
|
const refetch = useCallback(() => {
|
|
340
406
|
personalEnv.refetch();
|
|
341
407
|
grantStatus.refetch();
|
|
342
|
-
|
|
408
|
+
orgOverride.refetch();
|
|
409
|
+
}, [personalEnv, grantStatus, orgOverride]);
|
|
343
410
|
|
|
344
411
|
return {
|
|
345
412
|
authMode,
|
|
@@ -358,8 +425,9 @@ export function useMcpServerCredentials(
|
|
|
358
425
|
manualEntrySupported,
|
|
359
426
|
missingVariables,
|
|
360
427
|
isReady,
|
|
361
|
-
isLoading:
|
|
362
|
-
|
|
428
|
+
isLoading:
|
|
429
|
+
personalEnv.isLoading || grantStatus.isLoading || orgOverride.isLoading,
|
|
430
|
+
error: personalEnv.error ?? grantStatus.error ?? orgOverride.error,
|
|
363
431
|
saveCredentials,
|
|
364
432
|
isSaving: personalEnv.isMutating,
|
|
365
433
|
refetch,
|
|
@@ -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
|
+
}
|
|
@@ -8,11 +8,26 @@ import {
|
|
|
8
8
|
DeleteOrgOAuthAppInputSchema,
|
|
9
9
|
} from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/io_pb";
|
|
10
10
|
import { useStigmer } from "../hooks.js";
|
|
11
|
+
import { isUnimplemented } from "../internal/isUnimplemented.js";
|
|
11
12
|
import { toError } from "../internal/toError.js";
|
|
12
13
|
import { useFetch } from "../internal/useFetch.js";
|
|
13
14
|
|
|
14
15
|
/** Return value of {@link useOrgOAuthApp}. */
|
|
15
16
|
export interface UseOrgOAuthAppReturn {
|
|
17
|
+
/**
|
|
18
|
+
* Whether the backend supports the org-OAuth-app override surface at all.
|
|
19
|
+
*
|
|
20
|
+
* The surface is hosted-only by design: the OSS server answers
|
|
21
|
+
* UNIMPLEMENTED for all three org-override RPCs because its flat
|
|
22
|
+
* OAuthApp store has no override binding (stigmer/stigmer#558 — the
|
|
23
|
+
* self-hosted equivalent is applying an OAuthApp resource and
|
|
24
|
+
* referencing it from `spec.auth.oauth_app_ref`). The fetch doubles
|
|
25
|
+
* as the capability probe: `isSupported` is `false` until the first
|
|
26
|
+
* successful response confirms the surface exists, so BYOA
|
|
27
|
+
* affordances gated on it never flash on deployments where the
|
|
28
|
+
* submit could only fail.
|
|
29
|
+
*/
|
|
30
|
+
readonly isSupported: boolean;
|
|
16
31
|
/** Whether an org-level BYOA override exists for this resource + org. */
|
|
17
32
|
readonly hasOverride: boolean;
|
|
18
33
|
/** System-generated ID of the override's OAuthApp, or `null` when absent. */
|
|
@@ -72,12 +87,25 @@ export interface UseOrgOAuthAppReturn {
|
|
|
72
87
|
}
|
|
73
88
|
|
|
74
89
|
interface OrgOAuthAppData {
|
|
90
|
+
isSupported: boolean;
|
|
75
91
|
hasOverride: boolean;
|
|
76
92
|
oauthAppId: string | null;
|
|
77
93
|
clientId: string | null;
|
|
78
94
|
}
|
|
79
95
|
|
|
80
96
|
const IDLE_DATA: OrgOAuthAppData = {
|
|
97
|
+
isSupported: false,
|
|
98
|
+
hasOverride: false,
|
|
99
|
+
oauthAppId: null,
|
|
100
|
+
clientId: null,
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* The UNIMPLEMENTED answer resolved into data rather than an error:
|
|
105
|
+
* the backend is healthy, it just doesn't have this edition capability.
|
|
106
|
+
*/
|
|
107
|
+
const UNSUPPORTED_DATA: OrgOAuthAppData = {
|
|
108
|
+
isSupported: false,
|
|
81
109
|
hasOverride: false,
|
|
82
110
|
oauthAppId: null,
|
|
83
111
|
clientId: null,
|
|
@@ -110,6 +138,14 @@ const IDLE: UseOrgOAuthAppReturn = {
|
|
|
110
138
|
* mutations bound to the hook's resource + org context, eliminating
|
|
111
139
|
* parameter repetition at call sites.
|
|
112
140
|
*
|
|
141
|
+
* **Edition awareness**: the fetch doubles as a capability probe. The
|
|
142
|
+
* org-override surface is hosted-only; the OSS server answers
|
|
143
|
+
* UNIMPLEMENTED for it, which this hook resolves into
|
|
144
|
+
* `isSupported: false` with no error. Gate every BYOA affordance on
|
|
145
|
+
* `isSupported` (as {@link useMcpServerCredentials} does for
|
|
146
|
+
* `canBringOwnApp`) — the mutations can only fail where the probe
|
|
147
|
+
* reports the surface absent.
|
|
148
|
+
*
|
|
113
149
|
* Pass `null` for either parameter to skip fetching (stable no-op).
|
|
114
150
|
*
|
|
115
151
|
* @example
|
|
@@ -136,18 +172,28 @@ export function useOrgOAuthApp(
|
|
|
136
172
|
const { data, isLoading, isRefetching, error, refetch } = useFetch<OrgOAuthAppData>(
|
|
137
173
|
resourceId && org
|
|
138
174
|
? async () => {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
175
|
+
try {
|
|
176
|
+
const result = await stigmer.mcpServer.getOrgOAuthApp(
|
|
177
|
+
create(GetOrgOAuthAppInputSchema, { resourceId, org }),
|
|
178
|
+
);
|
|
179
|
+
return {
|
|
180
|
+
isSupported: true,
|
|
181
|
+
hasOverride: result.hasOverride,
|
|
182
|
+
oauthAppId: result.oauthAppId || null,
|
|
183
|
+
clientId: result.clientId || null,
|
|
184
|
+
};
|
|
185
|
+
} catch (err) {
|
|
186
|
+
if (isUnimplemented(err)) return UNSUPPORTED_DATA;
|
|
187
|
+
throw err;
|
|
188
|
+
}
|
|
147
189
|
}
|
|
148
190
|
: null,
|
|
149
191
|
[resourceId, org, stigmer],
|
|
150
192
|
IDLE_DATA,
|
|
193
|
+
// Cross-mount cache: the credentials hook composes this fetch as its
|
|
194
|
+
// capability probe, so a detail page mounts two instances — the cache
|
|
195
|
+
// lets the second render from the first's result.
|
|
196
|
+
{ cacheKey: `org-oauth-app:${org}:${resourceId}` },
|
|
151
197
|
);
|
|
152
198
|
|
|
153
199
|
const [isSetting, setIsSetting] = useState(false);
|
|
@@ -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. */
|
|
@@ -629,6 +629,17 @@ function ModelRow({
|
|
|
629
629
|
<div className="stg:flex stg:w-full stg:items-center stg:gap-2">
|
|
630
630
|
<span className="stg:flex-1 stg:truncate stg:text-left stg:font-medium">{model.displayName}</span>
|
|
631
631
|
|
|
632
|
+
{/* Explicit vision:false only (stigmer/stigmer#386) — an unassessed
|
|
633
|
+
model (absent capabilities block) shows nothing, per the
|
|
634
|
+
registry's tri-state convention. Visible text, not a tooltip:
|
|
635
|
+
keyboard and touch users must see it before picking the model. */}
|
|
636
|
+
{model.visionCapability === false && (
|
|
637
|
+
<span className="stg:flex stg:shrink-0 stg:items-center stg:gap-0.5 stg:text-[0.6rem] stg:text-muted-foreground">
|
|
638
|
+
<NoImageInputIcon />
|
|
639
|
+
No image input
|
|
640
|
+
</span>
|
|
641
|
+
)}
|
|
642
|
+
|
|
632
643
|
<span className="stg:shrink-0 stg:text-[0.6rem] stg:text-muted-foreground">
|
|
633
644
|
{showSpeedBadge
|
|
634
645
|
? `${SPEED_TIER_LABEL[model.speedTier]} ${COST_TIER_LABEL[model.costTier]}`
|
|
@@ -683,6 +694,32 @@ function CheckIcon({ className }: { className?: string }) {
|
|
|
683
694
|
);
|
|
684
695
|
}
|
|
685
696
|
|
|
697
|
+
/**
|
|
698
|
+
* "Image with a slash" glyph for models explicitly assessed as unable to
|
|
699
|
+
* see images. Decorative (`aria-hidden`) — the wrapping span carries the
|
|
700
|
+
* accessible text.
|
|
701
|
+
*/
|
|
702
|
+
function NoImageInputIcon() {
|
|
703
|
+
return (
|
|
704
|
+
<svg
|
|
705
|
+
width="11"
|
|
706
|
+
height="11"
|
|
707
|
+
viewBox="0 0 12 12"
|
|
708
|
+
fill="none"
|
|
709
|
+
stroke="currentColor"
|
|
710
|
+
strokeWidth="1.2"
|
|
711
|
+
strokeLinecap="round"
|
|
712
|
+
strokeLinejoin="round"
|
|
713
|
+
aria-hidden
|
|
714
|
+
>
|
|
715
|
+
<rect x="1.5" y="2" width="9" height="8" rx="1.2" />
|
|
716
|
+
<path d="M1.5 8L4.2 5.6L6.4 7.6" />
|
|
717
|
+
<circle cx="7.6" cy="4.6" r="0.8" fill="currentColor" stroke="none" />
|
|
718
|
+
<path d="M1 1L11 11" />
|
|
719
|
+
</svg>
|
|
720
|
+
);
|
|
721
|
+
}
|
|
722
|
+
|
|
686
723
|
function BoltIcon() {
|
|
687
724
|
return (
|
|
688
725
|
<svg
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { describe, it, expect, vi, afterEach, beforeAll } from "vitest";
|
|
2
|
+
import { render, screen, cleanup, fireEvent } from "@testing-library/react";
|
|
3
|
+
import { ModelSelector } from "../ModelSelector";
|
|
4
|
+
import { ModelRegistryContext } from "../ModelRegistryContext";
|
|
5
|
+
import type { ModelInfo } from "../registry";
|
|
6
|
+
|
|
7
|
+
// Shim ResizeObserver for Base UI's positioner (the
|
|
8
|
+
// scheduleCreation.test.tsx pattern).
|
|
9
|
+
beforeAll(() => {
|
|
10
|
+
if (!("ResizeObserver" in globalThis)) {
|
|
11
|
+
(globalThis as unknown as { ResizeObserver: unknown }).ResizeObserver =
|
|
12
|
+
class {
|
|
13
|
+
observe() {}
|
|
14
|
+
unobserve() {}
|
|
15
|
+
disconnect() {}
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* "No image input" indicator on model rows (stigmer/stigmer#386).
|
|
22
|
+
*
|
|
23
|
+
* Tri-state contract: the indicator renders ONLY for models the registry
|
|
24
|
+
* explicitly assessed as blind (`visionCapability === false`). A sighted
|
|
25
|
+
* model shows nothing, and — the load-bearing case — an UNASSESSED model
|
|
26
|
+
* (absent capabilities block) also shows nothing: most registry entries
|
|
27
|
+
* were never capability-assessed, and flagging them all as blind would
|
|
28
|
+
* be wrong for nearly every one.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
const BLIND: ModelInfo = {
|
|
32
|
+
modelId: "kimi-k3",
|
|
33
|
+
provider: "moonshot",
|
|
34
|
+
displayName: "Kimi K3",
|
|
35
|
+
shortDescription: "Text-only economy model",
|
|
36
|
+
speedTier: "fast",
|
|
37
|
+
costTier: "economy",
|
|
38
|
+
harness: "cursor",
|
|
39
|
+
featured: true,
|
|
40
|
+
serviceTiers: [],
|
|
41
|
+
visionCapability: false,
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const SIGHTED: ModelInfo = {
|
|
45
|
+
modelId: "composer-2.5",
|
|
46
|
+
provider: "cursor",
|
|
47
|
+
displayName: "Composer 2.5",
|
|
48
|
+
shortDescription: "Fast agentic model",
|
|
49
|
+
speedTier: "fastest",
|
|
50
|
+
costTier: "economy",
|
|
51
|
+
harness: "cursor",
|
|
52
|
+
featured: true,
|
|
53
|
+
serviceTiers: [],
|
|
54
|
+
visionCapability: true,
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const UNASSESSED: ModelInfo = {
|
|
58
|
+
modelId: "mystery-model",
|
|
59
|
+
provider: "cursor",
|
|
60
|
+
displayName: "Mystery Model",
|
|
61
|
+
shortDescription: "Never capability-assessed",
|
|
62
|
+
speedTier: "fast",
|
|
63
|
+
costTier: "standard",
|
|
64
|
+
harness: "cursor",
|
|
65
|
+
featured: true,
|
|
66
|
+
serviceTiers: [],
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
function renderSelector() {
|
|
70
|
+
return render(
|
|
71
|
+
<ModelRegistryContext.Provider
|
|
72
|
+
value={{
|
|
73
|
+
models: [BLIND, SIGHTED, UNASSESSED],
|
|
74
|
+
isLoading: false,
|
|
75
|
+
error: null,
|
|
76
|
+
refetch: vi.fn(),
|
|
77
|
+
}}
|
|
78
|
+
>
|
|
79
|
+
<ModelSelector
|
|
80
|
+
value="composer-2.5"
|
|
81
|
+
onValueChange={vi.fn()}
|
|
82
|
+
harness="cursor"
|
|
83
|
+
/>
|
|
84
|
+
</ModelRegistryContext.Provider>,
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
async function openPopover(triggerLabel: string) {
|
|
89
|
+
fireEvent.click(screen.getByRole("button", { name: new RegExp(triggerLabel) }));
|
|
90
|
+
await screen.findByPlaceholderText("Search models…");
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** A model row inside the popup list (never matches the trigger). */
|
|
94
|
+
function modelOption(displayName: string): HTMLElement {
|
|
95
|
+
const option = screen
|
|
96
|
+
.getAllByText(displayName)
|
|
97
|
+
.map((el) => el.closest<HTMLElement>("[data-model-option]"))
|
|
98
|
+
.find((el) => el != null);
|
|
99
|
+
if (!option) throw new Error(`No popup option for "${displayName}"`);
|
|
100
|
+
return option;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
afterEach(cleanup);
|
|
104
|
+
|
|
105
|
+
describe("ModelSelector — no-image-input indicator", () => {
|
|
106
|
+
it("marks an explicitly blind model with visible badge text", async () => {
|
|
107
|
+
renderSelector();
|
|
108
|
+
await openPopover("Composer 2.5");
|
|
109
|
+
|
|
110
|
+
// Visible text, not a tooltip — keyboard and touch users must see it
|
|
111
|
+
// before picking the model (stigmer/no-native-title).
|
|
112
|
+
const row = modelOption("Kimi K3");
|
|
113
|
+
expect(row.textContent).toContain("No image input");
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it("shows nothing on an explicitly sighted model", async () => {
|
|
117
|
+
renderSelector();
|
|
118
|
+
await openPopover("Composer 2.5");
|
|
119
|
+
|
|
120
|
+
expect(modelOption("Composer 2.5").textContent).not.toContain("No image input");
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it("shows nothing on an unassessed model (tri-state: absent is not false)", async () => {
|
|
124
|
+
renderSelector();
|
|
125
|
+
await openPopover("Composer 2.5");
|
|
126
|
+
|
|
127
|
+
expect(modelOption("Mystery Model").textContent).not.toContain("No image input");
|
|
128
|
+
});
|
|
129
|
+
});
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import {
|
|
3
|
+
DEFAULT_CURSOR_MODEL_ID,
|
|
4
|
+
DEFAULT_MODEL_ID,
|
|
5
|
+
resolveDefaultModelId,
|
|
6
|
+
type ModelInfo,
|
|
7
|
+
} from "../registry";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The harness-default arm is a contract, not a suggestion
|
|
11
|
+
* (stigmer/stigmer#663): this resolution feeds the composer's pill, and
|
|
12
|
+
* the submission adopts what the pill displays — so the default must be
|
|
13
|
+
* what the platform actually runs for an unpinned execution:
|
|
14
|
+
*
|
|
15
|
+
* - cursor → the registry's Auto entry (the runner coerces an empty
|
|
16
|
+
* model_name to "default")
|
|
17
|
+
* - native → the runner's getDefaultModel() rule (featured + standard
|
|
18
|
+
* cost, then any standard cost)
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
function model(overrides: Partial<ModelInfo> & { modelId: string }): ModelInfo {
|
|
22
|
+
return {
|
|
23
|
+
provider: "anthropic",
|
|
24
|
+
displayName: overrides.modelId,
|
|
25
|
+
shortDescription: "",
|
|
26
|
+
speedTier: "fast",
|
|
27
|
+
costTier: "standard",
|
|
28
|
+
harness: "native",
|
|
29
|
+
featured: false,
|
|
30
|
+
serviceTiers: [],
|
|
31
|
+
...overrides,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
describe("resolveDefaultModelId — cursor harness", () => {
|
|
36
|
+
it("prefers the Auto entry over featured models listed before it (the production order that caused #663)", () => {
|
|
37
|
+
// Mirrors the live registry: featured premium models precede Auto.
|
|
38
|
+
const models = [
|
|
39
|
+
model({ modelId: "claude-opus-4-8", harness: "cursor", featured: true, costTier: "premium" }),
|
|
40
|
+
model({ modelId: DEFAULT_CURSOR_MODEL_ID, harness: "cursor", featured: true }),
|
|
41
|
+
];
|
|
42
|
+
expect(resolveDefaultModelId("cursor", models)).toEqual({
|
|
43
|
+
modelId: DEFAULT_CURSOR_MODEL_ID,
|
|
44
|
+
source: "harness_default",
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it("falls back to the first featured cursor model when the registry has no Auto entry", () => {
|
|
49
|
+
const models = [
|
|
50
|
+
model({ modelId: "composer-2.5", harness: "cursor", featured: true }),
|
|
51
|
+
];
|
|
52
|
+
expect(resolveDefaultModelId("cursor", models).modelId).toBe("composer-2.5");
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it("falls back to the hardcoded cursor id on an empty registry", () => {
|
|
56
|
+
expect(resolveDefaultModelId("cursor", [])).toEqual({
|
|
57
|
+
modelId: DEFAULT_CURSOR_MODEL_ID,
|
|
58
|
+
source: "platform_fallback",
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it("lets an explicit user preference win over Auto", () => {
|
|
63
|
+
const models = [
|
|
64
|
+
model({ modelId: DEFAULT_CURSOR_MODEL_ID, harness: "cursor", featured: true }),
|
|
65
|
+
model({ modelId: "composer-2.5", harness: "cursor", featured: true }),
|
|
66
|
+
];
|
|
67
|
+
expect(
|
|
68
|
+
resolveDefaultModelId("cursor", models, { userPreference: "composer-2.5" }),
|
|
69
|
+
).toEqual({ modelId: "composer-2.5", source: "user_preference" });
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
describe("resolveDefaultModelId — native harness", () => {
|
|
74
|
+
it("skips a featured premium model for the featured standard-cost one (the runner's own rule)", () => {
|
|
75
|
+
const models = [
|
|
76
|
+
model({ modelId: "claude-opus-4.6", featured: true, costTier: "premium" }),
|
|
77
|
+
model({ modelId: "claude-sonnet-4.6", featured: true, costTier: "standard" }),
|
|
78
|
+
];
|
|
79
|
+
expect(resolveDefaultModelId("native", models)).toEqual({
|
|
80
|
+
modelId: "claude-sonnet-4.6",
|
|
81
|
+
source: "harness_default",
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it("falls back to any standard-cost model when no featured one is standard", () => {
|
|
86
|
+
const models = [
|
|
87
|
+
model({ modelId: "claude-opus-4.6", featured: true, costTier: "premium" }),
|
|
88
|
+
model({ modelId: "gpt-4o", featured: false, costTier: "standard" }),
|
|
89
|
+
];
|
|
90
|
+
expect(resolveDefaultModelId("native", models).modelId).toBe("gpt-4o");
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it("falls back to the first featured model when the registry lists no standard-cost model at all", () => {
|
|
94
|
+
const models = [
|
|
95
|
+
model({ modelId: "claude-opus-4.6", featured: true, costTier: "premium" }),
|
|
96
|
+
model({ modelId: "ollama-local", featured: false, costTier: "economy" }),
|
|
97
|
+
];
|
|
98
|
+
expect(resolveDefaultModelId("native", models).modelId).toBe("claude-opus-4.6");
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it("falls back to the hardcoded native id on an empty registry", () => {
|
|
102
|
+
expect(resolveDefaultModelId("native", [])).toEqual({
|
|
103
|
+
modelId: DEFAULT_MODEL_ID,
|
|
104
|
+
source: "platform_fallback",
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it("never resolves across harnesses (a cursor Auto entry is invisible to native)", () => {
|
|
109
|
+
const models = [
|
|
110
|
+
model({ modelId: DEFAULT_CURSOR_MODEL_ID, harness: "cursor", featured: true }),
|
|
111
|
+
model({ modelId: "claude-sonnet-4.6", featured: true, costTier: "standard" }),
|
|
112
|
+
];
|
|
113
|
+
expect(resolveDefaultModelId("native", models).modelId).toBe("claude-sonnet-4.6");
|
|
114
|
+
});
|
|
115
|
+
});
|