@stigmer/react 0.0.71 → 0.0.73
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/agent/AgentEnvForm.d.ts +2 -0
- package/agent/AgentEnvForm.d.ts.map +1 -1
- package/agent/AgentEnvForm.js.map +1 -1
- package/agent/AgentPicker.d.ts +2 -0
- package/agent/AgentPicker.d.ts.map +1 -1
- package/agent/AgentPicker.js.map +1 -1
- package/agent/agentSetupReducer.d.ts +69 -7
- package/agent/agentSetupReducer.d.ts.map +1 -1
- package/agent/agentSetupReducer.js.map +1 -1
- package/agent/useAgentCount.d.ts +2 -0
- package/agent/useAgentCount.d.ts.map +1 -1
- package/agent/useAgentCount.js.map +1 -1
- package/attachment/AttachmentChipList.d.ts +15 -0
- package/attachment/AttachmentChipList.d.ts.map +1 -1
- package/attachment/AttachmentChipList.js +15 -0
- package/attachment/AttachmentChipList.js.map +1 -1
- package/attachment/useAttachments.d.ts +14 -0
- package/attachment/useAttachments.d.ts.map +1 -1
- package/attachment/useAttachments.js.map +1 -1
- package/composer/useComposer.d.ts +5 -0
- package/composer/useComposer.d.ts.map +1 -1
- package/composer/useComposer.js.map +1 -1
- package/execution/ExecutionPhaseBadge.d.ts +1 -1
- package/execution/ExecutionPhaseBadge.js +1 -1
- package/execution/McpToolDetail.d.ts +16 -8
- package/execution/McpToolDetail.d.ts.map +1 -1
- package/execution/McpToolDetail.js +0 -6
- package/execution/McpToolDetail.js.map +1 -1
- package/execution/TodoList.d.ts +8 -0
- package/execution/TodoList.d.ts.map +1 -1
- package/execution/TodoList.js +8 -0
- package/execution/TodoList.js.map +1 -1
- package/execution/ToolArgsView.d.ts +1 -0
- package/execution/ToolArgsView.d.ts.map +1 -1
- package/execution/ToolArgsView.js.map +1 -1
- package/execution/UsageWidget.d.ts +1 -1
- package/execution/UsageWidget.js +1 -1
- package/execution/file-path-resolver.d.ts +10 -0
- package/execution/file-path-resolver.d.ts.map +1 -1
- package/execution/file-path-resolver.js.map +1 -1
- package/execution/index.d.ts +1 -1
- package/execution/index.d.ts.map +1 -1
- package/execution/index.js.map +1 -1
- package/execution/useArtifactContent.d.ts +33 -0
- package/execution/useArtifactContent.d.ts.map +1 -1
- package/execution/useArtifactContent.js +33 -0
- package/execution/useArtifactContent.js.map +1 -1
- package/execution/useSubmitApproval.d.ts +2 -0
- package/execution/useSubmitApproval.d.ts.map +1 -1
- package/execution/useSubmitApproval.js.map +1 -1
- package/github/GitHubRepoPicker.d.ts +13 -0
- package/github/GitHubRepoPicker.d.ts.map +1 -1
- package/github/GitHubRepoPicker.js +13 -0
- package/github/GitHubRepoPicker.js.map +1 -1
- package/github/useGitHubConnection.d.ts +29 -1
- package/github/useGitHubConnection.d.ts.map +1 -1
- package/github/useGitHubConnection.js +29 -1
- package/github/useGitHubConnection.js.map +1 -1
- package/github/useGitHubRepos.d.ts +31 -0
- package/github/useGitHubRepos.d.ts.map +1 -1
- package/github/useGitHubRepos.js +31 -0
- package/github/useGitHubRepos.js.map +1 -1
- package/github/useGitHubSearch.d.ts +25 -0
- package/github/useGitHubSearch.d.ts.map +1 -1
- package/github/useGitHubSearch.js +25 -0
- package/github/useGitHubSearch.js.map +1 -1
- package/iam-policy/GrantAccessForm.d.ts +39 -0
- package/iam-policy/GrantAccessForm.d.ts.map +1 -0
- package/iam-policy/GrantAccessForm.js +75 -0
- package/iam-policy/GrantAccessForm.js.map +1 -0
- package/iam-policy/OrgMembersPanel.d.ts +28 -0
- package/iam-policy/OrgMembersPanel.d.ts.map +1 -0
- package/iam-policy/OrgMembersPanel.js +192 -0
- package/iam-policy/OrgMembersPanel.js.map +1 -0
- package/iam-policy/RoleSelector.d.ts +37 -0
- package/iam-policy/RoleSelector.d.ts.map +1 -0
- package/iam-policy/RoleSelector.js +42 -0
- package/iam-policy/RoleSelector.js.map +1 -0
- package/iam-policy/index.d.ts +12 -0
- package/iam-policy/index.d.ts.map +1 -0
- package/iam-policy/index.js +12 -0
- package/iam-policy/index.js.map +1 -0
- package/iam-policy/useCreateIamPolicy.d.ts +35 -0
- package/iam-policy/useCreateIamPolicy.d.ts.map +1 -0
- package/iam-policy/useCreateIamPolicy.js +46 -0
- package/iam-policy/useCreateIamPolicy.js.map +1 -0
- package/iam-policy/useDeleteIamPolicy.d.ts +34 -0
- package/iam-policy/useDeleteIamPolicy.d.ts.map +1 -0
- package/iam-policy/useDeleteIamPolicy.js +45 -0
- package/iam-policy/useDeleteIamPolicy.js.map +1 -0
- package/iam-policy/useGrantableRoles.d.ts +28 -0
- package/iam-policy/useGrantableRoles.d.ts.map +1 -0
- package/iam-policy/useGrantableRoles.js +32 -0
- package/iam-policy/useGrantableRoles.js.map +1 -0
- package/iam-policy/usePrincipalsCount.d.ts +31 -0
- package/iam-policy/usePrincipalsCount.d.ts.map +1 -0
- package/iam-policy/usePrincipalsCount.js +72 -0
- package/iam-policy/usePrincipalsCount.js.map +1 -0
- package/iam-policy/useResourceAccess.d.ts +51 -0
- package/iam-policy/useResourceAccess.d.ts.map +1 -0
- package/iam-policy/useResourceAccess.js +85 -0
- package/iam-policy/useResourceAccess.js.map +1 -0
- package/iam-policy/useRevokeOrgAccess.d.ts +36 -0
- package/iam-policy/useRevokeOrgAccess.d.ts.map +1 -0
- package/iam-policy/useRevokeOrgAccess.js +48 -0
- package/iam-policy/useRevokeOrgAccess.js.map +1 -0
- package/iam-policy/useRoleSelector.d.ts +52 -0
- package/iam-policy/useRoleSelector.d.ts.map +1 -0
- package/iam-policy/useRoleSelector.js +50 -0
- package/iam-policy/useRoleSelector.js.map +1 -0
- package/iam-policy/useWhoAmI.d.ts +30 -0
- package/iam-policy/useWhoAmI.d.ts.map +1 -0
- package/iam-policy/useWhoAmI.js +56 -0
- package/iam-policy/useWhoAmI.js.map +1 -0
- package/identity-provider/CreateIdentityProviderForm.d.ts +39 -0
- package/identity-provider/CreateIdentityProviderForm.d.ts.map +1 -0
- package/identity-provider/CreateIdentityProviderForm.js +102 -0
- package/identity-provider/CreateIdentityProviderForm.js.map +1 -0
- package/identity-provider/IdentityProviderDetailPanel.d.ts +42 -0
- package/identity-provider/IdentityProviderDetailPanel.d.ts.map +1 -0
- package/identity-provider/IdentityProviderDetailPanel.js +156 -0
- package/identity-provider/IdentityProviderDetailPanel.js.map +1 -0
- package/identity-provider/IdentityProviderListPanel.d.ts +41 -0
- package/identity-provider/IdentityProviderListPanel.d.ts.map +1 -0
- package/identity-provider/IdentityProviderListPanel.js +110 -0
- package/identity-provider/IdentityProviderListPanel.js.map +1 -0
- package/identity-provider/IdentityProviderWizard.d.ts +40 -0
- package/identity-provider/IdentityProviderWizard.d.ts.map +1 -0
- package/identity-provider/IdentityProviderWizard.js +180 -0
- package/identity-provider/IdentityProviderWizard.js.map +1 -0
- package/identity-provider/ProviderPicker.d.ts +28 -0
- package/identity-provider/ProviderPicker.d.ts.map +1 -0
- package/identity-provider/ProviderPicker.js +64 -0
- package/identity-provider/ProviderPicker.js.map +1 -0
- package/identity-provider/SsoLoginPrompt.d.ts +51 -0
- package/identity-provider/SsoLoginPrompt.d.ts.map +1 -0
- package/identity-provider/SsoLoginPrompt.js +119 -0
- package/identity-provider/SsoLoginPrompt.js.map +1 -0
- package/identity-provider/index.d.ts +14 -0
- package/identity-provider/index.d.ts.map +1 -0
- package/identity-provider/index.js +14 -0
- package/identity-provider/index.js.map +1 -0
- package/identity-provider/presets.d.ts +65 -0
- package/identity-provider/presets.d.ts.map +1 -0
- package/identity-provider/presets.js +200 -0
- package/identity-provider/presets.js.map +1 -0
- package/identity-provider/useCreateIdentityProvider.d.ts +37 -0
- package/identity-provider/useCreateIdentityProvider.d.ts.map +1 -0
- package/identity-provider/useCreateIdentityProvider.js +48 -0
- package/identity-provider/useCreateIdentityProvider.js.map +1 -0
- package/identity-provider/useDeleteIdentityProvider.d.ts +34 -0
- package/identity-provider/useDeleteIdentityProvider.d.ts.map +1 -0
- package/identity-provider/useDeleteIdentityProvider.js +45 -0
- package/identity-provider/useDeleteIdentityProvider.js.map +1 -0
- package/identity-provider/useIdentityProvider.d.ts +37 -0
- package/identity-provider/useIdentityProvider.d.ts.map +1 -0
- package/identity-provider/useIdentityProvider.js +62 -0
- package/identity-provider/useIdentityProvider.js.map +1 -0
- package/identity-provider/useIdentityProviderList.d.ts +48 -0
- package/identity-provider/useIdentityProviderList.d.ts.map +1 -0
- package/identity-provider/useIdentityProviderList.js +75 -0
- package/identity-provider/useIdentityProviderList.js.map +1 -0
- package/identity-provider/useOidcDiscovery.d.ts +39 -0
- package/identity-provider/useOidcDiscovery.d.ts.map +1 -0
- package/identity-provider/useOidcDiscovery.js +76 -0
- package/identity-provider/useOidcDiscovery.js.map +1 -0
- package/identity-provider/useSsoProvider.d.ts +50 -0
- package/identity-provider/useSsoProvider.d.ts.map +1 -0
- package/identity-provider/useSsoProvider.js +83 -0
- package/identity-provider/useSsoProvider.js.map +1 -0
- package/identity-provider/useUpdateIdentityProvider.d.ts +38 -0
- package/identity-provider/useUpdateIdentityProvider.d.ts.map +1 -0
- package/identity-provider/useUpdateIdentityProvider.js +49 -0
- package/identity-provider/useUpdateIdentityProvider.js.map +1 -0
- package/index.d.ts +14 -5
- package/index.d.ts.map +1 -1
- package/index.js +10 -2
- package/index.js.map +1 -1
- package/internal/CloudFeatureNotice.d.ts +12 -0
- package/internal/CloudFeatureNotice.d.ts.map +1 -1
- package/internal/CloudFeatureNotice.js +12 -0
- package/internal/CloudFeatureNotice.js.map +1 -1
- package/invitation/InvitationCreatedAlert.d.ts +35 -0
- package/invitation/InvitationCreatedAlert.d.ts.map +1 -0
- package/invitation/InvitationCreatedAlert.js +60 -0
- package/invitation/InvitationCreatedAlert.js.map +1 -0
- package/invitation/InvitationManager.d.ts +44 -0
- package/invitation/InvitationManager.d.ts.map +1 -0
- package/invitation/InvitationManager.js +248 -0
- package/invitation/InvitationManager.js.map +1 -0
- package/invitation/InvitationRedemption.d.ts +69 -0
- package/invitation/InvitationRedemption.d.ts.map +1 -0
- package/invitation/InvitationRedemption.js +140 -0
- package/invitation/InvitationRedemption.js.map +1 -0
- package/invitation/index.d.ts +17 -0
- package/invitation/index.d.ts.map +1 -0
- package/invitation/index.js +9 -0
- package/invitation/index.js.map +1 -0
- package/invitation/useCreateInvitation.d.ts +52 -0
- package/invitation/useCreateInvitation.d.ts.map +1 -0
- package/invitation/useCreateInvitation.js +55 -0
- package/invitation/useCreateInvitation.js.map +1 -0
- package/invitation/useInvitationPreview.d.ts +51 -0
- package/invitation/useInvitationPreview.d.ts.map +1 -0
- package/invitation/useInvitationPreview.js +80 -0
- package/invitation/useInvitationPreview.js.map +1 -0
- package/invitation/useOrgInvitations.d.ts +36 -0
- package/invitation/useOrgInvitations.d.ts.map +1 -0
- package/invitation/useOrgInvitations.js +65 -0
- package/invitation/useOrgInvitations.js.map +1 -0
- package/invitation/useRedeemInvitation.d.ts +47 -0
- package/invitation/useRedeemInvitation.d.ts.map +1 -0
- package/invitation/useRedeemInvitation.js +53 -0
- package/invitation/useRedeemInvitation.js.map +1 -0
- package/invitation/useRevokeInvitation.d.ts +35 -0
- package/invitation/useRevokeInvitation.d.ts.map +1 -0
- package/invitation/useRevokeInvitation.js +47 -0
- package/invitation/useRevokeInvitation.js.map +1 -0
- package/library/detect-skill-package.d.ts +1 -0
- package/library/detect-skill-package.d.ts.map +1 -1
- package/library/detect-skill-package.js.map +1 -1
- package/library/detect-stigmer-resource.d.ts +1 -0
- package/library/detect-stigmer-resource.d.ts.map +1 -1
- package/library/detect-stigmer-resource.js.map +1 -1
- package/library/parse-resource-yaml.d.ts +4 -0
- package/library/parse-resource-yaml.d.ts.map +1 -1
- package/library/parse-resource-yaml.js.map +1 -1
- package/mcp-server/McpServerDetailView.d.ts +2 -2
- package/mcp-server/McpServerDetailView.d.ts.map +1 -1
- package/mcp-server/McpServerDetailView.js.map +1 -1
- package/mcp-server/index.d.ts +1 -1
- package/mcp-server/index.d.ts.map +1 -1
- package/mcp-server/index.js.map +1 -1
- package/mcp-server/mcpServerSetupReducer.d.ts +54 -0
- package/mcp-server/mcpServerSetupReducer.d.ts.map +1 -1
- package/mcp-server/mcpServerSetupReducer.js.map +1 -1
- package/models/ModelSelector.d.ts +9 -0
- package/models/ModelSelector.d.ts.map +1 -1
- package/models/ModelSelector.js +9 -0
- package/models/ModelSelector.js.map +1 -1
- package/models/registry.d.ts +11 -1
- package/models/registry.d.ts.map +1 -1
- package/models/registry.js.map +1 -1
- package/models/useModelRegistry.d.ts +20 -0
- package/models/useModelRegistry.d.ts.map +1 -1
- package/models/useModelRegistry.js +20 -0
- package/models/useModelRegistry.js.map +1 -1
- package/organization/OrgProfilePanel.d.ts +31 -0
- package/organization/OrgProfilePanel.d.ts.map +1 -0
- package/organization/OrgProfilePanel.js +147 -0
- package/organization/OrgProfilePanel.js.map +1 -0
- package/organization/index.d.ts +6 -0
- package/organization/index.d.ts.map +1 -1
- package/organization/index.js +3 -0
- package/organization/index.js.map +1 -1
- package/organization/useOrganization.d.ts +31 -0
- package/organization/useOrganization.d.ts.map +1 -0
- package/organization/useOrganization.js +56 -0
- package/organization/useOrganization.js.map +1 -0
- package/organization/useUpdateOrganization.d.ts +40 -0
- package/organization/useUpdateOrganization.d.ts.map +1 -0
- package/organization/useUpdateOrganization.js +51 -0
- package/organization/useUpdateOrganization.js.map +1 -0
- package/package.json +4 -4
- package/provider.d.ts +1 -0
- package/provider.d.ts.map +1 -1
- package/provider.js.map +1 -1
- package/search/useResourceList.d.ts +4 -2
- package/search/useResourceList.d.ts.map +1 -1
- package/search/useResourceList.js +2 -1
- package/search/useResourceList.js.map +1 -1
- package/search/useResourceSearch.d.ts +10 -2
- package/search/useResourceSearch.d.ts.map +1 -1
- package/search/useResourceSearch.js +2 -1
- package/search/useResourceSearch.js.map +1 -1
- package/session/group-sessions.d.ts +23 -0
- package/session/group-sessions.d.ts.map +1 -1
- package/session/group-sessions.js +23 -0
- package/session/group-sessions.js.map +1 -1
- package/session/index.d.ts +1 -1
- package/session/index.d.ts.map +1 -1
- package/session/index.js.map +1 -1
- package/session/useCreateSession.d.ts +11 -2
- package/session/useCreateSession.d.ts.map +1 -1
- package/session/useCreateSession.js.map +1 -1
- package/session/useSession.d.ts +24 -0
- package/session/useSession.d.ts.map +1 -1
- package/session/useSession.js +24 -0
- package/session/useSession.js.map +1 -1
- package/session/useSessionArtifacts.d.ts +1 -0
- package/session/useSessionArtifacts.d.ts.map +1 -1
- package/session/useSessionArtifacts.js.map +1 -1
- package/session/useSessionConversation.d.ts +7 -0
- package/session/useSessionConversation.d.ts.map +1 -1
- package/session/useSessionConversation.js.map +1 -1
- package/session/useSessionExecutions.d.ts +23 -0
- package/session/useSessionExecutions.d.ts.map +1 -1
- package/session/useSessionExecutions.js +23 -0
- package/session/useSessionExecutions.js.map +1 -1
- package/session/useSessionList.d.ts +19 -0
- package/session/useSessionList.d.ts.map +1 -1
- package/session/useSessionList.js +19 -0
- package/session/useSessionList.js.map +1 -1
- package/session/useSessionWriteBacks.d.ts +1 -0
- package/session/useSessionWriteBacks.d.ts.map +1 -1
- package/session/useSessionWriteBacks.js.map +1 -1
- package/session/useUpdateSession.d.ts +22 -0
- package/session/useUpdateSession.d.ts.map +1 -1
- package/session/useUpdateSession.js +22 -0
- package/session/useUpdateSession.js.map +1 -1
- package/skill/SkillPicker.d.ts +15 -0
- package/skill/SkillPicker.d.ts.map +1 -1
- package/skill/SkillPicker.js +15 -0
- package/skill/SkillPicker.js.map +1 -1
- package/src/agent/AgentEnvForm.tsx +2 -0
- package/src/agent/AgentPicker.tsx +2 -0
- package/src/agent/agentSetupReducer.ts +109 -20
- package/src/agent/useAgentCount.ts +2 -0
- package/src/attachment/AttachmentChipList.tsx +15 -0
- package/src/attachment/useAttachments.ts +14 -0
- package/src/composer/useComposer.ts +5 -0
- package/src/execution/ExecutionPhaseBadge.tsx +1 -1
- package/src/execution/McpToolDetail.tsx +18 -6
- package/src/execution/TodoList.tsx +8 -0
- package/src/execution/ToolArgsView.tsx +1 -0
- package/src/execution/UsageWidget.tsx +1 -1
- package/src/execution/file-path-resolver.ts +28 -4
- package/src/execution/index.ts +5 -1
- package/src/execution/useArtifactContent.ts +33 -0
- package/src/execution/useSubmitApproval.ts +2 -0
- package/src/github/GitHubRepoPicker.tsx +13 -0
- package/src/github/useGitHubConnection.ts +29 -1
- package/src/github/useGitHubRepos.ts +31 -0
- package/src/github/useGitHubSearch.ts +25 -0
- package/src/iam-policy/GrantAccessForm.tsx +198 -0
- package/src/iam-policy/OrgMembersPanel.tsx +572 -0
- package/src/iam-policy/RoleSelector.tsx +105 -0
- package/src/iam-policy/index.ts +51 -0
- package/src/iam-policy/useCreateIamPolicy.ts +66 -0
- package/src/iam-policy/useDeleteIamPolicy.ts +65 -0
- package/src/iam-policy/useGrantableRoles.ts +45 -0
- package/src/iam-policy/usePrincipalsCount.ts +96 -0
- package/src/iam-policy/useResourceAccess.ts +128 -0
- package/src/iam-policy/useRevokeOrgAccess.ts +74 -0
- package/src/iam-policy/useRoleSelector.ts +97 -0
- package/src/iam-policy/useWhoAmI.ts +78 -0
- package/src/identity-provider/CreateIdentityProviderForm.tsx +308 -0
- package/src/identity-provider/IdentityProviderDetailPanel.tsx +583 -0
- package/src/identity-provider/IdentityProviderListPanel.tsx +370 -0
- package/src/identity-provider/IdentityProviderWizard.tsx +684 -0
- package/src/identity-provider/ProviderPicker.tsx +152 -0
- package/src/identity-provider/SsoLoginPrompt.tsx +404 -0
- package/src/identity-provider/index.ts +67 -0
- package/src/identity-provider/presets.ts +262 -0
- package/src/identity-provider/useCreateIdentityProvider.ts +68 -0
- package/src/identity-provider/useDeleteIdentityProvider.ts +65 -0
- package/src/identity-provider/useIdentityProvider.ts +86 -0
- package/src/identity-provider/useIdentityProviderList.ts +100 -0
- package/src/identity-provider/useOidcDiscovery.ts +124 -0
- package/src/identity-provider/useSsoProvider.ts +99 -0
- package/src/identity-provider/useUpdateIdentityProvider.ts +69 -0
- package/src/index.ts +121 -1
- package/src/internal/CloudFeatureNotice.tsx +12 -0
- package/src/invitation/InvitationCreatedAlert.tsx +185 -0
- package/src/invitation/InvitationManager.tsx +842 -0
- package/src/invitation/InvitationRedemption.tsx +434 -0
- package/src/invitation/index.ts +16 -0
- package/src/invitation/useCreateInvitation.ts +83 -0
- package/src/invitation/useInvitationPreview.ts +103 -0
- package/src/invitation/useOrgInvitations.ts +88 -0
- package/src/invitation/useRedeemInvitation.ts +82 -0
- package/src/invitation/useRevokeInvitation.ts +66 -0
- package/src/library/detect-skill-package.ts +4 -1
- package/src/library/detect-stigmer-resource.ts +4 -1
- package/src/library/parse-resource-yaml.ts +12 -2
- package/src/mcp-server/McpServerDetailView.tsx +2 -1
- package/src/mcp-server/index.ts +4 -1
- package/src/mcp-server/mcpServerSetupReducer.ts +86 -8
- package/src/models/ModelSelector.tsx +9 -0
- package/src/models/registry.ts +11 -1
- package/src/models/useModelRegistry.ts +20 -0
- package/src/organization/OrgProfilePanel.tsx +451 -0
- package/src/organization/index.ts +6 -0
- package/src/organization/useOrganization.ts +79 -0
- package/src/organization/useUpdateOrganization.ts +71 -0
- package/src/provider.tsx +1 -0
- package/src/search/useResourceList.ts +6 -3
- package/src/search/useResourceSearch.ts +12 -3
- package/src/session/group-sessions.ts +23 -0
- package/src/session/index.ts +1 -0
- package/src/session/useCreateSession.ts +19 -3
- package/src/session/useSession.ts +24 -0
- package/src/session/useSessionArtifacts.ts +1 -0
- package/src/session/useSessionConversation.ts +7 -0
- package/src/session/useSessionExecutions.ts +23 -0
- package/src/session/useSessionList.ts +19 -0
- package/src/session/useSessionWriteBacks.ts +1 -0
- package/src/session/useUpdateSession.ts +22 -0
- package/src/skill/SkillPicker.tsx +15 -0
- package/src/usage/OrgUsagePanel.tsx +465 -0
- package/src/usage/date-range.ts +86 -0
- package/src/usage/index.ts +13 -0
- package/src/usage/useOrgUsageReport.ts +110 -0
- package/src/workspace/FolderBrowser.tsx +9 -0
- package/src/workspace/WorkspaceEditor.tsx +17 -0
- package/src/workspace/useFolderListing.ts +24 -0
- package/src/workspace/useWorkspaceEntries.ts +38 -0
- package/styles.css +1 -1
- package/usage/OrgUsagePanel.d.ts +24 -0
- package/usage/OrgUsagePanel.d.ts.map +1 -0
- package/usage/OrgUsagePanel.js +134 -0
- package/usage/OrgUsagePanel.js.map +1 -0
- package/usage/date-range.d.ts +36 -0
- package/usage/date-range.d.ts.map +1 -0
- package/usage/date-range.js +69 -0
- package/usage/date-range.js.map +1 -0
- package/usage/index.d.ts +7 -0
- package/usage/index.d.ts.map +1 -0
- package/usage/index.js +4 -0
- package/usage/index.js.map +1 -0
- package/usage/useOrgUsageReport.d.ts +48 -0
- package/usage/useOrgUsageReport.d.ts.map +1 -0
- package/usage/useOrgUsageReport.js +72 -0
- package/usage/useOrgUsageReport.js.map +1 -0
- package/workspace/FolderBrowser.d.ts +9 -0
- package/workspace/FolderBrowser.d.ts.map +1 -1
- package/workspace/FolderBrowser.js +9 -0
- package/workspace/FolderBrowser.js.map +1 -1
- package/workspace/WorkspaceEditor.d.ts +17 -0
- package/workspace/WorkspaceEditor.d.ts.map +1 -1
- package/workspace/WorkspaceEditor.js +17 -0
- package/workspace/WorkspaceEditor.js.map +1 -1
- package/workspace/useFolderListing.d.ts +24 -0
- package/workspace/useFolderListing.d.ts.map +1 -1
- package/workspace/useFolderListing.js +24 -0
- package/workspace/useFolderListing.js.map +1 -1
- package/workspace/useWorkspaceEntries.d.ts +38 -0
- package/workspace/useWorkspaceEntries.d.ts.map +1 -1
- package/workspace/useWorkspaceEntries.js +25 -0
- package/workspace/useWorkspaceEntries.js.map +1 -1
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useState } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { getUserMessage } from "@stigmer/sdk";
|
|
6
|
+
import { timestampDate } from "@bufbuild/protobuf/wkt";
|
|
7
|
+
import { useUpdateIdentityProvider } from "./useUpdateIdentityProvider";
|
|
8
|
+
/**
|
|
9
|
+
* View and edit panel for an existing identity provider.
|
|
10
|
+
*
|
|
11
|
+
* In **view mode**, displays all OIDC configuration fields in a
|
|
12
|
+
* structured label/value layout with an "Edit" button.
|
|
13
|
+
*
|
|
14
|
+
* In **edit mode**, fields become editable inputs. The SSO toggle and
|
|
15
|
+
* OIDC client ID are editable. "Save" submits the update via
|
|
16
|
+
* {@link useUpdateIdentityProvider}; "Cancel" discards changes and
|
|
17
|
+
* returns to view mode.
|
|
18
|
+
*
|
|
19
|
+
* All visual properties flow through `--stgm-*` design tokens.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```tsx
|
|
23
|
+
* <IdentityProviderDetailPanel
|
|
24
|
+
* identityProvider={idp}
|
|
25
|
+
* onUpdated={(updated) => refetch()}
|
|
26
|
+
* onBack={() => setFlow({ phase: "idle" })}
|
|
27
|
+
* />
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export function IdentityProviderDetailPanel({ identityProvider, onUpdated, onBack, ssoLoginUrl, className, }) {
|
|
31
|
+
const spec = identityProvider.spec;
|
|
32
|
+
const meta = identityProvider.metadata;
|
|
33
|
+
const { update, isUpdating, error, clearError } = useUpdateIdentityProvider();
|
|
34
|
+
const [mode, setMode] = useState("view");
|
|
35
|
+
// Edit form state — initialized from current resource
|
|
36
|
+
const [displayName, setDisplayName] = useState(spec?.displayName ?? "");
|
|
37
|
+
const [jwksUri, setJwksUri] = useState(spec?.jwksUri ?? "");
|
|
38
|
+
const [issuers, setIssuers] = useState(spec?.allowedIssuers.join(", ") ?? "");
|
|
39
|
+
const [audience, setAudience] = useState(spec?.expectedAudience ?? "");
|
|
40
|
+
const [userinfoEndpoint, setUserinfoEndpoint] = useState(spec?.userinfoEndpoint ?? "");
|
|
41
|
+
const [isSso, setIsSso] = useState(spec?.isSsoProvider ?? false);
|
|
42
|
+
const [oidcClientId, setOidcClientId] = useState(spec?.oidcClientId ?? "");
|
|
43
|
+
const enterEdit = useCallback(() => {
|
|
44
|
+
setDisplayName(spec?.displayName ?? "");
|
|
45
|
+
setJwksUri(spec?.jwksUri ?? "");
|
|
46
|
+
setIssuers(spec?.allowedIssuers.join(", ") ?? "");
|
|
47
|
+
setAudience(spec?.expectedAudience ?? "");
|
|
48
|
+
setUserinfoEndpoint(spec?.userinfoEndpoint ?? "");
|
|
49
|
+
setIsSso(spec?.isSsoProvider ?? false);
|
|
50
|
+
setOidcClientId(spec?.oidcClientId ?? "");
|
|
51
|
+
clearError();
|
|
52
|
+
setMode("edit");
|
|
53
|
+
}, [spec, clearError]);
|
|
54
|
+
const cancelEdit = useCallback(() => {
|
|
55
|
+
clearError();
|
|
56
|
+
setMode("view");
|
|
57
|
+
}, [clearError]);
|
|
58
|
+
const handleSave = useCallback(async (e) => {
|
|
59
|
+
e.preventDefault();
|
|
60
|
+
clearError();
|
|
61
|
+
try {
|
|
62
|
+
const updated = await update({
|
|
63
|
+
name: meta?.name ?? "",
|
|
64
|
+
slug: meta?.slug,
|
|
65
|
+
org: meta?.org ?? "",
|
|
66
|
+
displayName: displayName.trim(),
|
|
67
|
+
jwksUri: jwksUri.trim(),
|
|
68
|
+
allowedIssuers: issuers
|
|
69
|
+
.split(",")
|
|
70
|
+
.map((s) => s.trim())
|
|
71
|
+
.filter(Boolean),
|
|
72
|
+
expectedAudience: audience.trim(),
|
|
73
|
+
userinfoEndpoint: userinfoEndpoint.trim() || undefined,
|
|
74
|
+
isSsoProvider: isSso,
|
|
75
|
+
oidcClientId: isSso ? oidcClientId.trim() : undefined,
|
|
76
|
+
});
|
|
77
|
+
setMode("view");
|
|
78
|
+
onUpdated?.(updated);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// error state is managed by useUpdateIdentityProvider
|
|
82
|
+
}
|
|
83
|
+
}, [
|
|
84
|
+
meta, displayName, jwksUri, issuers, audience,
|
|
85
|
+
userinfoEndpoint, isSso, oidcClientId, update, clearError, onUpdated,
|
|
86
|
+
]);
|
|
87
|
+
const canSave = displayName.trim() !== "" &&
|
|
88
|
+
jwksUri.trim() !== "" &&
|
|
89
|
+
issuers.trim() !== "" &&
|
|
90
|
+
audience.trim() !== "" &&
|
|
91
|
+
(!isSso || oidcClientId.trim() !== "") &&
|
|
92
|
+
!isUpdating;
|
|
93
|
+
const createdAt = identityProvider.status?.audit?.specAudit?.createdAt;
|
|
94
|
+
const updatedAt = identityProvider.status?.audit?.specAudit?.updatedAt;
|
|
95
|
+
return (_jsxs("div", { className: cn("space-y-4", className), children: [_jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [onBack && (_jsxs("button", { type: "button", onClick: onBack, className: "text-muted-foreground hover:text-foreground mb-1 flex items-center gap-1 text-xs transition-colors", children: [_jsx(ArrowLeftIcon, {}), "Back to list"] })), _jsx("h3", { className: "text-foreground truncate text-sm font-semibold", children: spec?.displayName || meta?.name || "Identity Provider" }), _jsxs("div", { className: "flex items-center gap-2", children: [meta?.slug && (_jsx("span", { className: "text-muted-foreground font-mono text-xs", children: meta.slug })), spec?.isSsoProvider && (_jsx("span", { className: "inline-flex items-center rounded-full border border-primary/30 bg-primary-subtle px-2 py-0.5 text-[0.65rem] font-medium text-primary", children: "SSO" }))] })] }), mode === "view" && (_jsx("button", { type: "button", onClick: enterEdit, className: cn("shrink-0 rounded-md px-2.5 py-1.5 text-xs font-medium", "text-muted-foreground hover:text-foreground hover:bg-accent/50", "transition-colors"), children: "Edit" }))] }), mode === "view" ? (_jsx(ViewMode, { spec: spec, ssoLoginUrl: ssoLoginUrl, createdAt: createdAt, updatedAt: updatedAt })) : (_jsxs("form", { onSubmit: handleSave, className: "space-y-3", children: [_jsx(FieldInput, { id: "stgm-idp-edit-name", label: "Display name", value: displayName, onChange: setDisplayName, placeholder: "e.g., Acme Corp SSO", disabled: isUpdating, required: true }), _jsx(FieldInput, { id: "stgm-idp-edit-jwks", label: "JWKS URI", value: jwksUri, onChange: setJwksUri, placeholder: "https://example.com/.well-known/jwks.json", disabled: isUpdating, required: true }), _jsx(FieldInput, { id: "stgm-idp-edit-issuers", label: "Allowed issuers", value: issuers, onChange: setIssuers, placeholder: "https://issuer.example.com/", hint: "Comma-separated list of trusted JWT issuer values", disabled: isUpdating, required: true }), _jsx(FieldInput, { id: "stgm-idp-edit-audience", label: "Expected audience", value: audience, onChange: setAudience, placeholder: "stigmer-api", disabled: isUpdating, required: true }), _jsx(FieldInput, { id: "stgm-idp-edit-userinfo", label: "Userinfo endpoint", value: userinfoEndpoint, onChange: setUserinfoEndpoint, placeholder: "https://example.com/userinfo", hint: "Optional \u2014 used to fetch user profile data", disabled: isUpdating }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("button", { type: "button", role: "switch", "aria-checked": isSso, onClick: () => setIsSso((v) => !v), disabled: isUpdating, className: cn("relative inline-flex h-5 w-9 shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors", isSso ? "bg-primary" : "bg-muted", "disabled:pointer-events-none disabled:opacity-50"), children: _jsx("span", { className: cn("pointer-events-none inline-block h-4 w-4 rounded-full bg-background shadow-sm ring-0 transition-transform", isSso ? "translate-x-4" : "translate-x-0") }) }), _jsx("span", { className: "text-xs font-medium text-foreground", children: "SSO provider" })] }), isSso && (_jsx(FieldInput, { id: "stgm-idp-edit-client-id", label: "OIDC client ID", value: oidcClientId, onChange: setOidcClientId, placeholder: "public-client-id", hint: "Client ID for the PKCE-based Authorization Code flow", disabled: isUpdating, required: true })), error && (_jsx("p", { className: "text-destructive text-[0.65rem]", role: "alert", children: getUserMessage(error) })), _jsxs("div", { className: "flex items-center gap-2 pt-1", children: [_jsxs("button", { type: "submit", disabled: !canSave, className: cn("inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium", "bg-primary text-primary-foreground hover:bg-primary/90", "disabled:pointer-events-none disabled:opacity-40"), children: [isUpdating && _jsx(SpinnerIcon, {}), "Save changes"] }), _jsx("button", { type: "button", onClick: cancelEdit, disabled: isUpdating, className: cn("rounded-md px-2.5 py-1.5 text-xs", "text-muted-foreground hover:text-foreground hover:bg-accent/50", "disabled:pointer-events-none disabled:opacity-50"), children: "Cancel" })] })] }))] }));
|
|
96
|
+
}
|
|
97
|
+
// ---------------------------------------------------------------------------
|
|
98
|
+
// View mode
|
|
99
|
+
// ---------------------------------------------------------------------------
|
|
100
|
+
function ViewMode({ spec, ssoLoginUrl, createdAt, updatedAt, }) {
|
|
101
|
+
return (_jsxs("dl", { className: "space-y-2.5", children: [_jsx(Field, { label: "JWKS URI", value: spec?.jwksUri, mono: true }), _jsx(Field, { label: "Allowed issuers", value: spec?.allowedIssuers.join(", "), mono: true }), _jsx(Field, { label: "Expected audience", value: spec?.expectedAudience, mono: true }), spec?.userinfoEndpoint && (_jsx(Field, { label: "Userinfo endpoint", value: spec.userinfoEndpoint, mono: true })), spec?.isSsoProvider && (_jsx(Field, { label: "OIDC client ID", value: spec.oidcClientId, mono: true })), spec?.isSsoProvider && ssoLoginUrl && (_jsx(CopyableField, { label: "SSO login URL", value: ssoLoginUrl, hint: "Share this URL with your team members to sign in via SSO" })), (spec?.rateLimitBudget ?? 0) > 0 && (_jsx(Field, { label: "Rate limit", value: `${spec.rateLimitBudget} req/min` })), _jsxs("div", { className: "flex gap-6", children: [createdAt && (_jsx(Field, { label: "Created", value: formatDate(timestampDate(createdAt)) })), updatedAt && (_jsx(Field, { label: "Updated", value: formatDate(timestampDate(updatedAt)) }))] })] }));
|
|
102
|
+
}
|
|
103
|
+
function Field({ label, value, mono, }) {
|
|
104
|
+
if (!value)
|
|
105
|
+
return null;
|
|
106
|
+
return (_jsxs("div", { children: [_jsx("dt", { className: "text-muted-foreground text-[0.65rem] font-medium", children: label }), _jsx("dd", { className: cn("text-foreground mt-0.5 break-all text-xs", mono && "font-mono"), children: value })] }));
|
|
107
|
+
}
|
|
108
|
+
// ---------------------------------------------------------------------------
|
|
109
|
+
// View mode — copyable field
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
const COPIED_FEEDBACK_MS = 2000;
|
|
112
|
+
function CopyableField({ label, value, hint, }) {
|
|
113
|
+
const [copied, setCopied] = useState(false);
|
|
114
|
+
const valueId = "stgm-idp-sso-login-url";
|
|
115
|
+
const handleCopy = useCallback(async () => {
|
|
116
|
+
try {
|
|
117
|
+
await navigator.clipboard.writeText(value);
|
|
118
|
+
setCopied(true);
|
|
119
|
+
setTimeout(() => setCopied(false), COPIED_FEEDBACK_MS);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
const el = document.getElementById(valueId);
|
|
123
|
+
if (el) {
|
|
124
|
+
const selection = window.getSelection();
|
|
125
|
+
const range = document.createRange();
|
|
126
|
+
range.selectNodeContents(el);
|
|
127
|
+
selection?.removeAllRanges();
|
|
128
|
+
selection?.addRange(range);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}, [value]);
|
|
132
|
+
return (_jsxs("div", { children: [_jsx("dt", { className: "text-muted-foreground text-[0.65rem] font-medium", children: label }), _jsxs("dd", { className: "mt-0.5", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { id: valueId, className: "text-foreground break-all font-mono text-xs select-all", children: value }), _jsx("button", { type: "button", onClick: handleCopy, className: cn("shrink-0 rounded px-1.5 py-0.5 text-[0.6rem]", "text-muted-foreground hover:text-foreground hover:bg-accent/50", "transition-colors"), "aria-label": `Copy ${label}`, children: copied ? "Copied" : "Copy" })] }), hint && (_jsx("p", { className: "text-muted-foreground mt-0.5 text-[0.65rem]", children: hint })), _jsx("div", { role: "status", "aria-live": "polite", "aria-atomic": "true", className: "sr-only", children: copied && "SSO login URL copied to clipboard" })] })] }));
|
|
133
|
+
}
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
// Shared primitives
|
|
136
|
+
// ---------------------------------------------------------------------------
|
|
137
|
+
function FieldInput({ id, label, value, onChange, placeholder, hint, disabled, required, }) {
|
|
138
|
+
return (_jsxs("div", { className: "space-y-1", children: [_jsx("label", { htmlFor: id, className: "text-xs font-medium text-foreground", children: label }), _jsx("input", { id: id, type: "text", value: value, onChange: (e) => onChange(e.target.value), placeholder: placeholder, disabled: disabled, required: required, className: cn("w-full rounded-md border border-input bg-background px-2.5 py-1.5 text-xs text-foreground", "placeholder:text-muted-foreground", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", "disabled:pointer-events-none disabled:opacity-50") }), hint && (_jsx("p", { className: "text-[0.65rem] text-muted-foreground", children: hint }))] }));
|
|
139
|
+
}
|
|
140
|
+
function formatDate(date) {
|
|
141
|
+
return date.toLocaleDateString(undefined, {
|
|
142
|
+
month: "short",
|
|
143
|
+
day: "numeric",
|
|
144
|
+
year: "numeric",
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
// ---------------------------------------------------------------------------
|
|
148
|
+
// Icons
|
|
149
|
+
// ---------------------------------------------------------------------------
|
|
150
|
+
function ArrowLeftIcon() {
|
|
151
|
+
return (_jsx("svg", { width: "12", height: "12", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: "M10 3L5 8l5 5" }) }));
|
|
152
|
+
}
|
|
153
|
+
function SpinnerIcon() {
|
|
154
|
+
return (_jsx("svg", { width: "12", height: "12", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", className: "animate-spin", "aria-hidden": "true", children: _jsx("path", { d: "M8 2a6 6 0 1 0 6 6" }) }));
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=IdentityProviderDetailPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IdentityProviderDetailPanel.js","sourceRoot":"","sources":["../../src/identity-provider/IdentityProviderDetailPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { IdentityProvider } from "@stigmer/protos/ai/stigmer/iam/identityprovider/v1/api_pb";
|
|
2
|
+
/** Props for {@link IdentityProviderListPanel}. */
|
|
3
|
+
export interface IdentityProviderListPanelProps {
|
|
4
|
+
/** Organization slug whose identity providers should be listed. */
|
|
5
|
+
readonly org: string;
|
|
6
|
+
/** Fired when the user wants to edit an identity provider. */
|
|
7
|
+
readonly onEdit?: (idp: IdentityProvider) => void;
|
|
8
|
+
/** Expose the refetch function so parents can trigger a list refresh. */
|
|
9
|
+
readonly onRefetchRef?: (refetch: () => void) => void;
|
|
10
|
+
/** Additional CSS class names for the root container. */
|
|
11
|
+
readonly className?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Displays a list of {@link IdentityProvider} resources for an
|
|
15
|
+
* organization with inline delete confirmation.
|
|
16
|
+
*
|
|
17
|
+
* Each provider is rendered as a row showing name, slug, SSO badge
|
|
18
|
+
* (when `is_sso_provider` is true), and creation date. A delete
|
|
19
|
+
* button triggers an inline confirmation flow.
|
|
20
|
+
*
|
|
21
|
+
* Identity providers are admin-level resources with small cardinality
|
|
22
|
+
* (typically 1–3 per org), so the list is rendered without pagination.
|
|
23
|
+
*
|
|
24
|
+
* All visual properties flow through `--stgm-*` design tokens.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```tsx
|
|
28
|
+
* <IdentityProviderListPanel org="acme" />
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```tsx
|
|
33
|
+
* <IdentityProviderListPanel
|
|
34
|
+
* org="acme"
|
|
35
|
+
* onEdit={(idp) => navigate(`/settings/idp/${idp.metadata?.id}`)}
|
|
36
|
+
* onRefetchRef={(refetch) => { listRefetchRef.current = refetch; }}
|
|
37
|
+
* />
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare function IdentityProviderListPanel({ org, onEdit, onRefetchRef, className, }: IdentityProviderListPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
41
|
+
//# sourceMappingURL=IdentityProviderListPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IdentityProviderListPanel.d.ts","sourceRoot":"","sources":["../../src/identity-provider/IdentityProviderListPanel.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAIlG,mDAAmD;AACnD,MAAM,WAAW,8BAA8B;IAC7C,mEAAmE;IACnE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClD,yEAAyE;IACzE,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACtD,yDAAyD;IACzD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,yBAAyB,CAAC,EACxC,GAAG,EACH,MAAM,EACN,YAAY,EACZ,SAAS,GACV,EAAE,8BAA8B,2CAwEhC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useState } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { getUserMessage } from "@stigmer/sdk";
|
|
6
|
+
import { timestampDate } from "@bufbuild/protobuf/wkt";
|
|
7
|
+
import { useIdentityProviderList } from "./useIdentityProviderList";
|
|
8
|
+
import { useDeleteIdentityProvider } from "./useDeleteIdentityProvider";
|
|
9
|
+
/**
|
|
10
|
+
* Displays a list of {@link IdentityProvider} resources for an
|
|
11
|
+
* organization with inline delete confirmation.
|
|
12
|
+
*
|
|
13
|
+
* Each provider is rendered as a row showing name, slug, SSO badge
|
|
14
|
+
* (when `is_sso_provider` is true), and creation date. A delete
|
|
15
|
+
* button triggers an inline confirmation flow.
|
|
16
|
+
*
|
|
17
|
+
* Identity providers are admin-level resources with small cardinality
|
|
18
|
+
* (typically 1–3 per org), so the list is rendered without pagination.
|
|
19
|
+
*
|
|
20
|
+
* All visual properties flow through `--stgm-*` design tokens.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```tsx
|
|
24
|
+
* <IdentityProviderListPanel org="acme" />
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```tsx
|
|
29
|
+
* <IdentityProviderListPanel
|
|
30
|
+
* org="acme"
|
|
31
|
+
* onEdit={(idp) => navigate(`/settings/idp/${idp.metadata?.id}`)}
|
|
32
|
+
* onRefetchRef={(refetch) => { listRefetchRef.current = refetch; }}
|
|
33
|
+
* />
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export function IdentityProviderListPanel({ org, onEdit, onRefetchRef, className, }) {
|
|
37
|
+
const { identityProviders, isLoading, error, refetch } = useIdentityProviderList(org);
|
|
38
|
+
const [confirmingId, setConfirmingId] = useState(null);
|
|
39
|
+
if (onRefetchRef) {
|
|
40
|
+
onRefetchRef(refetch);
|
|
41
|
+
}
|
|
42
|
+
if (isLoading) {
|
|
43
|
+
return (_jsx("div", { className: cn("space-y-2", className), "aria-busy": "true", "aria-label": "Loading identity providers", children: Array.from({ length: 2 }, (_, i) => (_jsx("div", { className: "bg-muted/40 h-14 animate-pulse rounded-lg" }, i))) }));
|
|
44
|
+
}
|
|
45
|
+
if (error) {
|
|
46
|
+
return (_jsx("p", { className: cn("text-destructive text-xs", className), role: "alert", children: getUserMessage(error) }));
|
|
47
|
+
}
|
|
48
|
+
if (identityProviders.length === 0) {
|
|
49
|
+
return (_jsx("p", { className: cn("text-muted-foreground py-4 text-center text-xs", className), children: "No identity providers configured." }));
|
|
50
|
+
}
|
|
51
|
+
return (_jsx("div", { className: cn("space-y-2", className), role: "list", "aria-label": "Identity providers", children: identityProviders.map((idp) => {
|
|
52
|
+
const id = idp.metadata?.id ?? "";
|
|
53
|
+
return (_jsx(IdpRow, { identityProvider: idp, isConfirming: confirmingId === id, onEdit: onEdit ? () => onEdit(idp) : undefined, onConfirmDelete: () => setConfirmingId(id), onCancelDelete: () => setConfirmingId(null), onDeleted: () => {
|
|
54
|
+
setConfirmingId(null);
|
|
55
|
+
refetch();
|
|
56
|
+
} }, id));
|
|
57
|
+
}) }));
|
|
58
|
+
}
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
// IdpRow (internal)
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
function IdpRow({ identityProvider, isConfirming, onEdit, onConfirmDelete, onCancelDelete, onDeleted, }) {
|
|
63
|
+
const { deleteProvider, isDeleting, error } = useDeleteIdentityProvider();
|
|
64
|
+
const id = identityProvider.metadata?.id ?? "";
|
|
65
|
+
const name = identityProvider.spec?.displayName ||
|
|
66
|
+
identityProvider.metadata?.name ||
|
|
67
|
+
"Unnamed provider";
|
|
68
|
+
const slug = identityProvider.metadata?.slug;
|
|
69
|
+
const isSso = identityProvider.spec?.isSsoProvider;
|
|
70
|
+
const createdAt = identityProvider.status?.audit?.specAudit?.createdAt;
|
|
71
|
+
const handleDelete = useCallback(async () => {
|
|
72
|
+
try {
|
|
73
|
+
await deleteProvider({ resourceId: id });
|
|
74
|
+
onDeleted();
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// error state is surfaced via the hook
|
|
78
|
+
}
|
|
79
|
+
}, [id, deleteProvider, onDeleted]);
|
|
80
|
+
if (isConfirming) {
|
|
81
|
+
return (_jsxs("div", { role: "listitem", className: "flex items-center justify-between rounded-lg border border-destructive/30 bg-destructive/5 px-3 py-2.5", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("p", { className: "text-xs text-foreground", children: ["Delete ", _jsx("span", { className: "font-medium", children: name }), "?"] }), error && (_jsx("p", { className: "mt-0.5 text-[0.65rem] text-destructive", children: getUserMessage(error) }))] }), _jsxs("div", { className: "flex shrink-0 items-center gap-1.5", children: [_jsxs("button", { type: "button", onClick: handleDelete, disabled: isDeleting, className: cn("inline-flex items-center gap-1 rounded-md px-2.5 py-1 text-xs font-medium", "bg-destructive text-destructive-foreground hover:bg-destructive/90", "disabled:pointer-events-none disabled:opacity-50"), children: [isDeleting && _jsx(SpinnerIcon, {}), "Delete"] }), _jsx("button", { type: "button", onClick: onCancelDelete, disabled: isDeleting, className: cn("rounded-md px-2.5 py-1 text-xs", "text-muted-foreground hover:text-foreground hover:bg-accent/50", "disabled:pointer-events-none disabled:opacity-50"), children: "Cancel" })] })] }));
|
|
82
|
+
}
|
|
83
|
+
return (_jsxs("div", { role: "listitem", className: "flex items-center gap-3 rounded-lg border border-border/60 px-3 py-2.5 hover:border-border transition-colors", children: [_jsx(ShieldIcon, {}), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("span", { className: "block truncate text-sm font-medium text-foreground", children: name }), slug && (_jsx("span", { className: "block text-xs text-muted-foreground font-mono", children: slug }))] }), _jsxs("div", { className: "hidden sm:flex shrink-0 items-center gap-3 text-xs text-muted-foreground", children: [isSso && (_jsx("span", { className: "inline-flex items-center rounded-full border border-primary/30 bg-primary-subtle px-2 py-0.5 text-[0.65rem] font-medium text-primary", children: "SSO" })), createdAt && (_jsx("span", { title: `Created ${timestampDate(createdAt).toISOString()}`, children: formatShortDate(timestampDate(createdAt)) }))] }), _jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [onEdit && (_jsx("button", { type: "button", onClick: onEdit, "aria-label": `Edit ${name}`, className: cn("shrink-0 rounded p-1", "text-muted-foreground hover:text-foreground hover:bg-accent/50", "transition-colors"), children: _jsx(PencilIcon, {}) })), _jsx("button", { type: "button", onClick: onConfirmDelete, "aria-label": `Delete ${name}`, className: cn("shrink-0 rounded p-1", "text-muted-foreground hover:text-destructive hover:bg-destructive/10", "transition-colors"), children: _jsx(TrashIcon, {}) })] })] }));
|
|
84
|
+
}
|
|
85
|
+
// ---------------------------------------------------------------------------
|
|
86
|
+
// Formatting helpers
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
function formatShortDate(date) {
|
|
89
|
+
return date.toLocaleDateString(undefined, {
|
|
90
|
+
month: "short",
|
|
91
|
+
day: "numeric",
|
|
92
|
+
year: "numeric",
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
// ---------------------------------------------------------------------------
|
|
96
|
+
// Icons
|
|
97
|
+
// ---------------------------------------------------------------------------
|
|
98
|
+
function ShieldIcon() {
|
|
99
|
+
return (_jsx("svg", { width: "14", height: "14", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", className: "shrink-0 text-muted-foreground", children: _jsx("path", { d: "M8 1.5L2 4v4c0 3.5 2.5 5.5 6 7 3.5-1.5 6-3.5 6-7V4L8 1.5z" }) }));
|
|
100
|
+
}
|
|
101
|
+
function PencilIcon() {
|
|
102
|
+
return (_jsx("svg", { width: "14", height: "14", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: "M11 2.5l2.5 2.5L5 13.5H2.5V11L11 2.5z" }) }));
|
|
103
|
+
}
|
|
104
|
+
function TrashIcon() {
|
|
105
|
+
return (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [_jsx("path", { d: "M2.5 4h11M5.5 4V2.5a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1V4" }), _jsx("path", { d: "M12.5 4v9a1 1 0 0 1-1 1h-7a1 1 0 0 1-1-1V4" }), _jsx("line", { x1: "6.5", y1: "7", x2: "6.5", y2: "11" }), _jsx("line", { x1: "9.5", y1: "7", x2: "9.5", y2: "11" })] }));
|
|
106
|
+
}
|
|
107
|
+
function SpinnerIcon() {
|
|
108
|
+
return (_jsx("svg", { width: "12", height: "12", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", className: "animate-spin", "aria-hidden": "true", children: _jsx("path", { d: "M8 2a6 6 0 1 0 6 6" }) }));
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=IdentityProviderListPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IdentityProviderListPanel.js","sourceRoot":"","sources":["../../src/identity-provider/IdentityProviderListPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { IdentityProvider } from "@stigmer/protos/ai/stigmer/iam/identityprovider/v1/api_pb";
|
|
2
|
+
/** Props for {@link IdentityProviderWizard}. */
|
|
3
|
+
export interface IdentityProviderWizardProps {
|
|
4
|
+
/** Organization slug — the IdP will be created in this org. */
|
|
5
|
+
readonly org: string;
|
|
6
|
+
/** Fired with the newly created identity provider on success. */
|
|
7
|
+
readonly onCreated?: (idp: IdentityProvider) => void;
|
|
8
|
+
/** Fired when the user cancels the wizard. */
|
|
9
|
+
readonly onCancel?: () => void;
|
|
10
|
+
/** Additional CSS class names for the root container. */
|
|
11
|
+
readonly className?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Multi-step wizard for creating a new identity provider.
|
|
15
|
+
*
|
|
16
|
+
* Guides the user through three steps:
|
|
17
|
+
*
|
|
18
|
+
* 1. **Pick** — select a well-known provider preset or "Custom OIDC"
|
|
19
|
+
* 2. **Configure** — fill in provider-specific variables (e.g., Auth0
|
|
20
|
+
* tenant name) plus the IdP display name and expected audience
|
|
21
|
+
* 3. **Review** — verify auto-populated OIDC configuration, optionally
|
|
22
|
+
* enable SSO, and submit
|
|
23
|
+
*
|
|
24
|
+
* For known presets, URLs are constructed from deterministic templates
|
|
25
|
+
* (no network call). For "Custom OIDC", the wizard attempts OIDC
|
|
26
|
+
* Discovery and falls back to manual entry if the fetch fails.
|
|
27
|
+
*
|
|
28
|
+
* All visual properties flow through `--stgm-*` design tokens.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```tsx
|
|
32
|
+
* <IdentityProviderWizard
|
|
33
|
+
* org="acme"
|
|
34
|
+
* onCreated={(idp) => { refetch(); setShowWizard(false); }}
|
|
35
|
+
* onCancel={() => setShowWizard(false)}
|
|
36
|
+
* />
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export declare function IdentityProviderWizard({ org, onCreated, onCancel, className, }: IdentityProviderWizardProps): import("react/jsx-runtime").JSX.Element;
|
|
40
|
+
//# sourceMappingURL=IdentityProviderWizard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IdentityProviderWizard.d.ts","sourceRoot":"","sources":["../../src/identity-provider/IdentityProviderWizard.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAMlG,gDAAgD;AAChD,MAAM,WAAW,2BAA2B;IAC1C,+DAA+D;IAC/D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACrD,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,yDAAyD;IACzD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAID;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,GAAG,EACH,SAAS,EACT,QAAQ,EACR,SAAS,GACV,EAAE,2BAA2B,2CAuK7B"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useState, } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { getUserMessage } from "@stigmer/sdk";
|
|
6
|
+
import { ProviderPicker } from "./ProviderPicker";
|
|
7
|
+
import { useCreateIdentityProvider } from "./useCreateIdentityProvider";
|
|
8
|
+
import { useOidcDiscovery } from "./useOidcDiscovery";
|
|
9
|
+
/**
|
|
10
|
+
* Multi-step wizard for creating a new identity provider.
|
|
11
|
+
*
|
|
12
|
+
* Guides the user through three steps:
|
|
13
|
+
*
|
|
14
|
+
* 1. **Pick** — select a well-known provider preset or "Custom OIDC"
|
|
15
|
+
* 2. **Configure** — fill in provider-specific variables (e.g., Auth0
|
|
16
|
+
* tenant name) plus the IdP display name and expected audience
|
|
17
|
+
* 3. **Review** — verify auto-populated OIDC configuration, optionally
|
|
18
|
+
* enable SSO, and submit
|
|
19
|
+
*
|
|
20
|
+
* For known presets, URLs are constructed from deterministic templates
|
|
21
|
+
* (no network call). For "Custom OIDC", the wizard attempts OIDC
|
|
22
|
+
* Discovery and falls back to manual entry if the fetch fails.
|
|
23
|
+
*
|
|
24
|
+
* All visual properties flow through `--stgm-*` design tokens.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```tsx
|
|
28
|
+
* <IdentityProviderWizard
|
|
29
|
+
* org="acme"
|
|
30
|
+
* onCreated={(idp) => { refetch(); setShowWizard(false); }}
|
|
31
|
+
* onCancel={() => setShowWizard(false)}
|
|
32
|
+
* />
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export function IdentityProviderWizard({ org, onCreated, onCancel, className, }) {
|
|
36
|
+
const { create, isCreating, error: createError, clearError } = useCreateIdentityProvider();
|
|
37
|
+
const { discover, isDiscovering, error: discoveryError } = useOidcDiscovery();
|
|
38
|
+
// Step state
|
|
39
|
+
const [step, setStep] = useState("pick");
|
|
40
|
+
const [preset, setPreset] = useState(null);
|
|
41
|
+
// Configure step
|
|
42
|
+
const [vars, setVars] = useState({});
|
|
43
|
+
const [name, setName] = useState("");
|
|
44
|
+
const [audience, setAudience] = useState("");
|
|
45
|
+
// Review step
|
|
46
|
+
const [jwksUri, setJwksUri] = useState("");
|
|
47
|
+
const [issuers, setIssuers] = useState("");
|
|
48
|
+
const [userinfoEndpoint, setUserinfoEndpoint] = useState("");
|
|
49
|
+
const [isSso, setIsSso] = useState(false);
|
|
50
|
+
const [oidcClientId, setOidcClientId] = useState("");
|
|
51
|
+
const [discoveryFailed, setDiscoveryFailed] = useState(false);
|
|
52
|
+
// -- Step transitions ------------------------------------------------
|
|
53
|
+
const handlePickProvider = useCallback((selected) => {
|
|
54
|
+
setPreset(selected);
|
|
55
|
+
setVars(Object.fromEntries(selected.variables.map((v) => [v.key, v.options?.[0]?.value ?? ""])));
|
|
56
|
+
setName("");
|
|
57
|
+
setAudience("");
|
|
58
|
+
setStep("configure");
|
|
59
|
+
}, []);
|
|
60
|
+
const handleBackToPick = useCallback(() => {
|
|
61
|
+
setStep("pick");
|
|
62
|
+
setPreset(null);
|
|
63
|
+
}, []);
|
|
64
|
+
const populateReview = useCallback((config) => {
|
|
65
|
+
setJwksUri(config?.jwksUri ?? "");
|
|
66
|
+
setIssuers(config?.allowedIssuers.join(", ") ?? "");
|
|
67
|
+
setUserinfoEndpoint(config?.userinfoEndpoint ?? "");
|
|
68
|
+
setIsSso(false);
|
|
69
|
+
setOidcClientId("");
|
|
70
|
+
setDiscoveryFailed(!config);
|
|
71
|
+
}, []);
|
|
72
|
+
const handleContinueToReview = useCallback(async () => {
|
|
73
|
+
if (!preset)
|
|
74
|
+
return;
|
|
75
|
+
if (preset.id === "custom") {
|
|
76
|
+
const result = await discover(vars.issuerUrl ?? "");
|
|
77
|
+
populateReview(result
|
|
78
|
+
? { ...result, allowedIssuers: [result.issuer] }
|
|
79
|
+
: null);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
populateReview(preset.buildConfig(vars));
|
|
83
|
+
}
|
|
84
|
+
setStep("review");
|
|
85
|
+
}, [preset, vars, discover, populateReview]);
|
|
86
|
+
const handleBackToConfigure = useCallback(() => {
|
|
87
|
+
setStep("configure");
|
|
88
|
+
clearError();
|
|
89
|
+
}, [clearError]);
|
|
90
|
+
// -- Submit ----------------------------------------------------------
|
|
91
|
+
const handleSubmit = useCallback(async (e) => {
|
|
92
|
+
e.preventDefault();
|
|
93
|
+
clearError();
|
|
94
|
+
try {
|
|
95
|
+
const idp = await create({
|
|
96
|
+
name: name.trim(),
|
|
97
|
+
org,
|
|
98
|
+
displayName: name.trim(),
|
|
99
|
+
jwksUri: jwksUri.trim(),
|
|
100
|
+
allowedIssuers: issuers
|
|
101
|
+
.split(",")
|
|
102
|
+
.map((s) => s.trim())
|
|
103
|
+
.filter(Boolean),
|
|
104
|
+
expectedAudience: audience.trim(),
|
|
105
|
+
userinfoEndpoint: userinfoEndpoint.trim() || undefined,
|
|
106
|
+
...(isSso && {
|
|
107
|
+
isSsoProvider: true,
|
|
108
|
+
oidcClientId: oidcClientId.trim(),
|
|
109
|
+
}),
|
|
110
|
+
});
|
|
111
|
+
onCreated?.(idp);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// error state is managed by useCreateIdentityProvider
|
|
115
|
+
}
|
|
116
|
+
}, [
|
|
117
|
+
name, org, jwksUri, issuers, audience, userinfoEndpoint,
|
|
118
|
+
isSso, oidcClientId, create, clearError, onCreated,
|
|
119
|
+
]);
|
|
120
|
+
// -- Render ----------------------------------------------------------
|
|
121
|
+
return (_jsxs("div", { className: cn("space-y-4", className), children: [_jsx(StepIndicator, { current: step }), step === "pick" && (_jsxs(_Fragment, { children: [_jsx("p", { className: "text-muted-foreground text-xs", children: "Choose your identity provider to get started. Known providers will have their OIDC configuration auto-populated." }), _jsx(ProviderPicker, { onSelect: handlePickProvider }), onCancel && (_jsx("div", { className: "pt-1", children: _jsx(CancelButton, { onClick: onCancel }) }))] })), step === "configure" && preset && (_jsx(ConfigureStep, { preset: preset, vars: vars, onVarChange: (key, value) => setVars((prev) => ({ ...prev, [key]: value })), name: name, onNameChange: setName, audience: audience, onAudienceChange: setAudience, isLoading: isDiscovering, discoveryError: discoveryError, onBack: handleBackToPick, onContinue: handleContinueToReview, onCancel: onCancel })), step === "review" && (_jsx(ReviewStep, { discoveryFailed: discoveryFailed, jwksUri: jwksUri, onJwksUriChange: setJwksUri, issuers: issuers, onIssuersChange: setIssuers, userinfoEndpoint: userinfoEndpoint, onUserinfoEndpointChange: setUserinfoEndpoint, isSso: isSso, onIsSsoChange: setIsSso, oidcClientId: oidcClientId, onOidcClientIdChange: setOidcClientId, isCreating: isCreating, createError: createError, onBack: handleBackToConfigure, onSubmit: handleSubmit, onCancel: onCancel }))] }));
|
|
122
|
+
}
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
// Step indicator
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
const STEPS = [
|
|
127
|
+
{ key: "pick", label: "Provider" },
|
|
128
|
+
{ key: "configure", label: "Configure" },
|
|
129
|
+
{ key: "review", label: "Review" },
|
|
130
|
+
];
|
|
131
|
+
function StepIndicator({ current }) {
|
|
132
|
+
const currentIdx = STEPS.findIndex((s) => s.key === current);
|
|
133
|
+
return (_jsx("nav", { "aria-label": "Wizard progress", className: "flex items-center gap-1.5", children: STEPS.map((s, i) => {
|
|
134
|
+
const state = i < currentIdx ? "done" : i === currentIdx ? "active" : "upcoming";
|
|
135
|
+
return (_jsxs("span", { className: "flex items-center gap-1.5", children: [i > 0 && (_jsx("span", { className: cn("h-px w-4", state === "upcoming" ? "bg-border" : "bg-primary/40") })), _jsx("span", { className: cn("text-[0.65rem] font-medium", state === "active"
|
|
136
|
+
? "text-primary"
|
|
137
|
+
: state === "done"
|
|
138
|
+
? "text-muted-foreground"
|
|
139
|
+
: "text-muted-foreground/50"), children: s.label })] }, s.key));
|
|
140
|
+
}) }));
|
|
141
|
+
}
|
|
142
|
+
// ---------------------------------------------------------------------------
|
|
143
|
+
// Configure step (step 2)
|
|
144
|
+
// ---------------------------------------------------------------------------
|
|
145
|
+
function ConfigureStep({ preset, vars, onVarChange, name, onNameChange, audience, onAudienceChange, isLoading, discoveryError, onBack, onContinue, onCancel, }) {
|
|
146
|
+
const allVarsFilled = preset.variables.every((v) => (vars[v.key] ?? "").trim() !== "");
|
|
147
|
+
const canContinue = allVarsFilled &&
|
|
148
|
+
name.trim() !== "" &&
|
|
149
|
+
audience.trim() !== "" &&
|
|
150
|
+
!isLoading;
|
|
151
|
+
return (_jsxs("div", { className: "space-y-3", children: [_jsx("p", { className: "text-muted-foreground text-xs", children: preset.variables.length > 0
|
|
152
|
+
? `Enter your ${preset.label} details to auto-populate the OIDC configuration.`
|
|
153
|
+
: `${preset.label} configuration is fully automatic — just provide a name and audience.` }), preset.variables.map((v) => (_jsx(FieldInput, { id: `stgm-idp-var-${v.key}`, label: v.label, value: vars[v.key] ?? "", onChange: (val) => onVarChange(v.key, val), placeholder: v.placeholder, hint: v.hint, disabled: isLoading, type: v.type, options: v.options }, v.key))), _jsx("hr", { className: "border-border/40" }), _jsx(FieldInput, { id: "stgm-idp-wiz-name", label: "Display name", value: name, onChange: onNameChange, placeholder: "e.g., Acme Corp SSO", hint: "Human-readable name shown in the UI", disabled: isLoading }), _jsx(FieldInput, { id: "stgm-idp-wiz-audience", label: "Expected audience", value: audience, onChange: onAudienceChange, placeholder: "stigmer-api", hint: "The aud claim value expected in JWTs from this provider", disabled: isLoading }), discoveryError && (_jsx("p", { className: "text-destructive text-[0.65rem]", role: "alert", children: getUserMessage(discoveryError) })), _jsxs("div", { className: "flex items-center gap-2 pt-1", children: [_jsxs("button", { type: "button", onClick: onContinue, disabled: !canContinue, className: cn("inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium", "bg-primary text-primary-foreground hover:bg-primary/90", "disabled:pointer-events-none disabled:opacity-40"), children: [isLoading && _jsx(SpinnerIcon, {}), "Continue"] }), _jsx(TextButton, { onClick: onBack, disabled: isLoading, children: "Back" }), onCancel && (_jsx(CancelButton, { onClick: onCancel, disabled: isLoading }))] })] }));
|
|
154
|
+
}
|
|
155
|
+
// ---------------------------------------------------------------------------
|
|
156
|
+
// Review step (step 3)
|
|
157
|
+
// ---------------------------------------------------------------------------
|
|
158
|
+
function ReviewStep({ discoveryFailed, jwksUri, onJwksUriChange, issuers, onIssuersChange, userinfoEndpoint, onUserinfoEndpointChange, isSso, onIsSsoChange, oidcClientId, onOidcClientIdChange, isCreating, createError, onBack, onSubmit, onCancel, }) {
|
|
159
|
+
const canSubmit = jwksUri.trim() !== "" &&
|
|
160
|
+
issuers.trim() !== "" &&
|
|
161
|
+
(!isSso || oidcClientId.trim() !== "") &&
|
|
162
|
+
!isCreating;
|
|
163
|
+
return (_jsxs("form", { onSubmit: onSubmit, className: "space-y-3", children: [discoveryFailed && (_jsx("div", { className: "rounded-md border border-warning/30 bg-warning/5 px-3 py-2 text-xs text-warning-foreground", role: "alert", children: "Auto-discovery could not reach the provider. Enter the configuration manually below." })), _jsx("p", { className: "text-muted-foreground text-xs", children: "Review the OIDC configuration. All fields are editable." }), _jsx(FieldInput, { id: "stgm-idp-wiz-jwks", label: "JWKS URI", value: jwksUri, onChange: onJwksUriChange, placeholder: "https://example.com/.well-known/jwks.json", disabled: isCreating, required: true }), _jsx(FieldInput, { id: "stgm-idp-wiz-issuers", label: "Allowed issuers", value: issuers, onChange: onIssuersChange, placeholder: "https://issuer.example.com/", hint: "Comma-separated list of trusted JWT issuer values", disabled: isCreating, required: true }), _jsx(FieldInput, { id: "stgm-idp-wiz-userinfo", label: "Userinfo endpoint", value: userinfoEndpoint, onChange: onUserinfoEndpointChange, placeholder: "https://example.com/userinfo", hint: "Optional \u2014 used to fetch user profile data during token exchange", disabled: isCreating }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("button", { type: "button", role: "switch", "aria-checked": isSso, onClick: () => onIsSsoChange(!isSso), disabled: isCreating, className: cn("relative inline-flex h-5 w-9 shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors", isSso ? "bg-primary" : "bg-muted", "disabled:pointer-events-none disabled:opacity-50"), children: _jsx("span", { className: cn("pointer-events-none inline-block h-4 w-4 rounded-full bg-background shadow-sm ring-0 transition-transform", isSso ? "translate-x-4" : "translate-x-0") }) }), _jsx("span", { className: "text-xs font-medium text-foreground", children: "SSO provider" })] }), isSso && (_jsx(FieldInput, { id: "stgm-idp-wiz-client-id", label: "OIDC client ID", value: oidcClientId, onChange: onOidcClientIdChange, placeholder: "public-client-id", hint: "Client ID for the PKCE-based Authorization Code flow", disabled: isCreating, required: true })), createError && (_jsx("p", { className: "text-destructive text-[0.65rem]", role: "alert", children: getUserMessage(createError) })), _jsxs("div", { className: "flex items-center gap-2 pt-1", children: [_jsxs("button", { type: "submit", disabled: !canSubmit, className: cn("inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium", "bg-primary text-primary-foreground hover:bg-primary/90", "disabled:pointer-events-none disabled:opacity-40"), children: [isCreating && _jsx(SpinnerIcon, {}), "Create identity provider"] }), _jsx(TextButton, { onClick: onBack, disabled: isCreating, children: "Back" }), onCancel && (_jsx(CancelButton, { onClick: onCancel, disabled: isCreating }))] })] }));
|
|
164
|
+
}
|
|
165
|
+
// ---------------------------------------------------------------------------
|
|
166
|
+
// Shared primitives
|
|
167
|
+
// ---------------------------------------------------------------------------
|
|
168
|
+
function FieldInput({ id, label, value, onChange, placeholder, hint, disabled, required, type = "text", options, }) {
|
|
169
|
+
return (_jsxs("div", { className: "space-y-1", children: [_jsx("label", { htmlFor: id, className: "text-xs font-medium text-foreground", children: label }), type === "select" && options ? (_jsx("select", { id: id, value: value, onChange: (e) => onChange(e.target.value), disabled: disabled, className: cn("w-full rounded-md border border-input bg-background px-2.5 py-1.5 text-xs text-foreground", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", "disabled:pointer-events-none disabled:opacity-50"), children: options.map((opt) => (_jsx("option", { value: opt.value, children: opt.label }, opt.value))) })) : (_jsx("input", { id: id, type: "text", value: value, onChange: (e) => onChange(e.target.value), placeholder: placeholder, disabled: disabled, required: required, className: cn("w-full rounded-md border border-input bg-background px-2.5 py-1.5 text-xs text-foreground", "placeholder:text-muted-foreground", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", "disabled:pointer-events-none disabled:opacity-50") })), hint && (_jsx("p", { className: "text-[0.65rem] text-muted-foreground", children: hint }))] }));
|
|
170
|
+
}
|
|
171
|
+
function TextButton({ onClick, disabled, children, }) {
|
|
172
|
+
return (_jsx("button", { type: "button", onClick: onClick, disabled: disabled, className: cn("rounded-md px-2.5 py-1.5 text-xs", "text-muted-foreground hover:text-foreground hover:bg-accent/50", "disabled:pointer-events-none disabled:opacity-50"), children: children }));
|
|
173
|
+
}
|
|
174
|
+
function CancelButton({ onClick, disabled, }) {
|
|
175
|
+
return (_jsx(TextButton, { onClick: onClick, disabled: disabled, children: "Cancel" }));
|
|
176
|
+
}
|
|
177
|
+
function SpinnerIcon() {
|
|
178
|
+
return (_jsx("svg", { width: "12", height: "12", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", className: "animate-spin", "aria-hidden": "true", children: _jsx("path", { d: "M8 2a6 6 0 1 0 6 6" }) }));
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=IdentityProviderWizard.js.map
|