Skip to content

feat(ui): add OIDC ConfigureSSO wizard skeleton - #9200

Merged
NicolasLopes7 merged 12 commits into
mainfrom
nicolas/oidc-self-serve-configure
Jul 29, 2026
Merged

feat(ui): add OIDC ConfigureSSO wizard skeleton#9200
NicolasLopes7 merged 12 commits into
mainfrom
nicolas/oidc-self-serve-configure

Conversation

@NicolasLopes7

@NicolasLopes7 NicolasLopes7 commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Adds an experimental OIDC provider path to the ConfigureSSO wizard.
  • Provides redirect URI, claims, endpoints, and credentials step skeletons.
  • Handles derived OIDC provider keys safely and adds localization and coverage.

Testing

  • The focused ConfigureSSO domain and hook tests pass.
  • Component-mount tests and UI type-checking are currently blocked by existing cross-package checkout failures, including a missing timeLimit export during Clerk initialization.
CleanShot.2026-07-20.at.17.28.42.mp4

@vercel

vercel Bot commented Jul 20, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
clerk-js-sandbox Ready Ready Preview, Comment Jul 29, 2026 2:25pm
swingset Ready Ready Preview, Comment Jul 29, 2026 2:25pm

Request Review

@changeset-bot

changeset-bot Bot commented Jul 20, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 0ae71fb

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 23 packages
Name Type
@clerk/clerk-js Patch
@clerk/localizations Patch
@clerk/shared Patch
@clerk/ui Patch
@clerk/chrome-extension Patch
@clerk/electron Patch
@clerk/expo Patch
@clerk/react Patch
@clerk/astro Patch
@clerk/backend Patch
@clerk/expo-passkeys Patch
@clerk/express Patch
@clerk/fastify Patch
@clerk/headless Patch
@clerk/hono Patch
@clerk/msw Patch
@clerk/nextjs Patch
@clerk/nuxt Patch
@clerk/react-router Patch
@clerk/tanstack-react-start Patch
@clerk/testing Patch
@clerk/vue Patch
@clerk/swingset Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@pkg-pr-new

pkg-pr-new Bot commented Jul 20, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@9200

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@9200

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@9200

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@9200

@clerk/electron

npm i https://pkg.pr.new/@clerk/electron@9200

@clerk/electron-passkeys

npm i https://pkg.pr.new/@clerk/electron-passkeys@9200

@clerk/eslint-plugin

npm i https://pkg.pr.new/@clerk/eslint-plugin@9200

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@9200

@clerk/expo-google-signin

npm i https://pkg.pr.new/@clerk/expo-google-signin@9200

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@9200

@clerk/express

npm i https://pkg.pr.new/@clerk/express@9200

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@9200

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@9200

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@9200

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@9200

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@9200

@clerk/react

npm i https://pkg.pr.new/@clerk/react@9200

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@9200

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@9200

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@9200

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@9200

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@9200

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@9200

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@9200

commit: 0ae71fb

@NicolasLopes7
NicolasLopes7 marked this pull request as ready for review July 20, 2026 20:29
@NicolasLopes7
NicolasLopes7 requested a review from dstaley July 20, 2026 20:31
@github-actions

github-actions Bot commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

API Changes Report

Generated by Break Check on 2026-07-29T14:26:39.904Z

Summary

Metric Count
Packages analyzed 19
Packages with changes 1
🔴 Breaking changes 0
🟡 Non-breaking changes 2
🟢 Additions 8

🤖 This report was reviewed by claude-sonnet-4-6.


@clerk/shared

Current version: 4.25.8
Recommended bump: MINOR → 4.26.0

Subpath ./types

🟡 Non-breaking Changes (2)

Modified: __internal_LocalizationResource
Diff (before: 1981 lines, after: 2062 lines). Click to expand.
// ... 1310 unchanged lines elided ...
          google: LocalizationValue;
          microsoft: LocalizationValue;
        };
+       oidc: {
+         groupLabel: LocalizationValue;
+         oidcProvider: LocalizationValue;
+       };
        warning: LocalizationValue;
      };
      changeProviderDialog: {
        title: LocalizationValue<'provider'>;
        subtitle: LocalizationValue<'provider' | 'currentProvider'>;
        cancelButton: LocalizationValue;
        confirmButton: LocalizationValue;
      };
      organizationDomainsStep: {
        title: LocalizationValue;
        subtitle: LocalizationValue;
        formFieldLabel__domain: LocalizationValue;
        formFieldInputPlaceholder__domain: LocalizationValue;
        formButtonPrimary__add: LocalizationValue;
        domainSuggestion: {
          messageLabel: LocalizationValue<'domain'>;
          formButtonPrimary__add: LocalizationValue<'domain'>;
        };
        domainCard: {
          badge__verified: LocalizationValue;
          badge__unverified: LocalizationValue;
          badge__expired: LocalizationValue;
          verifiedAtLabel: LocalizationValue<'date'>;
          expiredAtLabel: LocalizationValue<'date'>;
          expiredLabel: LocalizationValue;
          verifyAgainButton: LocalizationValue;
          removeButtonTooltip__lastVerifiedDomain: LocalizationValue;
          removeButtonTooltip__lastVerifiedDomainActive: LocalizationValue;
          txtRecord: {
            instructions: LocalizationValue;
            typeLabel: LocalizationValue;
            hostLabel: LocalizationValue;
            valueLabel: LocalizationValue;
          };
        };
        removeDomainDialog: {
          title: LocalizationValue;
          subtitle__active: LocalizationValue<'domain'>;
          subtitle__inactive: LocalizationValue<'domain'>;
          cancelButton: LocalizationValue;
          removeButton: LocalizationValue;
        };
      };
      testConfigurationStep: {
        title: LocalizationValue;
        subtitle: LocalizationValue;
        error__noSuccessfulTestRun: LocalizationValue;
        testUrl: {
          actionLabel__open: LocalizationValue;
        };
        testResults: {
          title: LocalizationValue;
          actionLabel__refresh: LocalizationValue;
          polling: LocalizationValue;
          status__success: LocalizationValue;
          status__failed: LocalizationValue;
          status__pending: LocalizationValue;
          empty: {
            title: LocalizationValue;
            subtitle: LocalizationValue;
          };
        };
        testRunDetails: {
          title: LocalizationValue;
          runDetails: {
            sectionTitle: LocalizationValue;
            timestamp: LocalizationValue;
            status: LocalizationValue;
            errorCode: LocalizationValue;
            fullMessage: LocalizationValue;
            actionLabel__copy: LocalizationValue;
            actionLabel__copied: LocalizationValue;
          };
          parsedUserInfo: {
            sectionTitle: LocalizationValue;
            email: LocalizationValue;
            firstName: LocalizationValue;
          };
          howToFix: {
            sectionTitle: LocalizationValue;
            actionLabel__viewDocumentation: LocalizationValue;
            saml_user_attribute_missing: {
              intro: LocalizationValue;
              step1: LocalizationValue;
              step2: LocalizationValue;
              step3: LocalizationValue;
            };
            saml_response_relaystate_missing: {
              description: LocalizationValue;
            };
            saml_email_address_domain_mismatch: {
              description: LocalizationValue;
            };
            oauth_access_denied: {
              description: LocalizationValue;
            };
            oauth_token_exchange_error: {
              description: LocalizationValue;
            };
            oauth_fetch_user_error: {
              intro: LocalizationValue;
              step1: LocalizationValue;
              step2: LocalizationValue;
            };
          };
        };
      };
      configureStep: {
        attributeMappingTable: {
          badges: {
            required: LocalizationValue;
            optional: LocalizationValue;
          };
        };
        activeConnectionWarning: {
          title: LocalizationValue;
          dismiss: LocalizationValue;
+       };
+       oidcCustom: {
+         mainHeaderTitle: LocalizationValue;
+         redirectUriStep: {
+           headerSubtitle: LocalizationValue;
+           paragraph: LocalizationValue;
+           claims: {
+             description: LocalizationValue;
+             table: {
+               columns: {
+                 attribute: LocalizationValue;
+                 claim: LocalizationValue;
+               };
+               rows: {
+                 email: {
+                   attribute: LocalizationValue;
+                 };
+                 firstName: {
+                   attribute: LocalizationValue;
+                 };
+                 lastName: {
+                   attribute: LocalizationValue;
+                 };
+                 subject: {
+                   attribute: LocalizationValue;
+                 };
+               };
+             };
+           };
+           redirectUri: {
+             label: LocalizationValue;
+           };
+         };
+         endpointsStep: {
+           headerSubtitle: LocalizationValue;
+           discoveryUrl: {
+             description: LocalizationValue;
+             label: LocalizationValue;
+             placeholder: LocalizationValue;
+           };
+           manual: {
+             authUrl: {
+               label: LocalizationValue;
+               placeholder: LocalizationValue;
+             };
+             description: LocalizationValue;
+             tokenUrl: {
+               label: LocalizationValue;
+               placeholder: LocalizationValue;
+             };
+             userInfoUrl: {
+               label: LocalizationValue;
+               placeholder: LocalizationValue;
+             };
+           };
+           modes: {
+             ariaLabel: LocalizationValue;
+             discoveryUrl: LocalizationValue;
+             manual: LocalizationValue;
+           };
+         };
+         credentialsStep: {
+           headerSubtitle: LocalizationValue;
+           clientId: {
+             label: LocalizationValue;
+             placeholder: LocalizationValue;
+           };
+           clientSecret: {
+             label: LocalizationValue;
+             placeholder: LocalizationValue;
+           };
+           paragraph: LocalizationValue;
+         };
+       };
+       unsupportedProvider: {
+         title: LocalizationValue;
+         description: LocalizationValue;
        };
        samlOkta: {
          mainHeaderTitle: LocalizationValue;
// ... 548 unchanged lines elided ...

Static analyzer: Breaking change in type alias __internal_LocalizationResource: Type changed: {locale:string;maintenanceMode:import("@clerk/shared").LocalizationValue;roles:{[r:string]:import("@clerk/shared").Loca…{locale:string;maintenanceMode:import("@clerk/shared").LocalizationValue;roles:{[r:string]:import("@clerk/shared").Loca…

🤖 AI review (reclassified as non-breaking) (82%): __internal_LocalizationResource is used only as the base for LocalizationResource (an output/read type via DeepPartial<DeepLocalizationWithoutObjects<...>>), and the diff shows new fields being added (81 more lines in the after snippet) rather than any removals or type narrowing — adding properties to an output type consumers only read is non-breaking per rule 11.

Modified: FieldId
- type FieldId = 'firstName' | 'lastName' | 'name' | 'slug' | 'emailAddress' | 'phoneNumber' | 'currentPassword' | 'newPassword' | 'signOutOfOtherSessions' | 'passkeyName' | 'password' | 'confirmPassword' | 'identifier' | 'username' | 'code' | 'role' | 'deleteConfirmation' | 'deleteOrganizationConfirmation' | 'enrollmentMode' | 'affiliationEmailAddress' | 'deleteExistingInvitationsSuggestions' | 'legalAccepted' | 'apiKeyDescription' | 'apiKeyExpirationDate' | 'apiKeyRevokeConfirmation' | 'apiKeySecret' | 'idpCertificate' | 'idpEntityId' | 'idpMetadata' | 'idpMetadataUrl' | 'idpSsoUrl' | 'acsUrl' | 'spEntityId' | 'web3WalletName' | 'domain';
+ type FieldId = 'firstName' | 'lastName' | 'name' | 'slug' | 'emailAddress' | 'phoneNumber' | 'currentPassword' | 'newPassword' | 'signOutOfOtherSessions' | 'passkeyName' | 'password' | 'confirmPassword' | 'identifier' | 'username' | 'code' | 'role' | 'deleteConfirmation' | 'deleteOrganizationConfirmation' | 'enrollmentMode' | 'affiliationEmailAddress' | 'deleteExistingInvitationsSuggestions' | 'legalAccepted' | 'apiKeyDescription' | 'apiKeyExpirationDate' | 'apiKeyRevokeConfirmation' | 'apiKeySecret' | 'idpCertificate' | 'idpEntityId' | 'idpMetadata' | 'idpMetadataUrl' | 'idpSsoUrl' | 'discoveryUrl' | 'authUrl' | 'tokenUrl' | 'userInfoUrl' | 'clientId' | 'clientSecret' | 'redirectUri' | 'acsUrl' | 'spEntityId' | 'web3WalletName' | 'domain';

Static analyzer: Breaking change in type alias FieldId: Type changed: 'acsUrl'|'affiliationEmailAddress'|'apiKeyDescription'|'apiKeyExpirationDate'|'apiKeyRevokeConfirmation'|'apiKeySecret'…'acsUrl'|'affiliationEmailAddress'|'apiKeyDescription'|'apiKeyExpirationDate'|'apiKeyRevokeConfirmation'|'apiKeySecret'…

🤖 AI review (reclassified as non-breaking) (85%): FieldId is a union type and the change only adds new string literal members ('discoveryUrl', 'authUrl', 'tokenUrl', 'userInfoUrl', 'clientId', 'clientSecret', 'redirectUri') — widening a union used in output/discriminator positions is non-breaking, and existing consumers' exhaustive checks over the old members remain valid since no member was removed.

🟢 Additions (8)

Added: EnterpriseOAuthConfigJSON.auth_url
+ auth_url?: string;

Added property EnterpriseOAuthConfigJSON.auth_url

Added: EnterpriseOAuthConfigJSON.redirect_uri
+ redirect_uri?: string;

Added property EnterpriseOAuthConfigJSON.redirect_uri

Added: EnterpriseOAuthConfigJSON.token_url
+ token_url?: string;

Added property EnterpriseOAuthConfigJSON.token_url

Added: EnterpriseOAuthConfigJSON.user_info_url
+ user_info_url?: string;

Added property EnterpriseOAuthConfigJSON.user_info_url

Added: EnterpriseOAuthConfigResource.authUrl
+ authUrl?: string;

Added property EnterpriseOAuthConfigResource.authUrl

Added: EnterpriseOAuthConfigResource.redirectUri
+ redirectUri?: string;

Added property EnterpriseOAuthConfigResource.redirectUri

Added: EnterpriseOAuthConfigResource.tokenUrl
+ tokenUrl?: string;

Added property EnterpriseOAuthConfigResource.tokenUrl

Added: EnterpriseOAuthConfigResource.userInfoUrl
+ userInfoUrl?: string;

Added property EnterpriseOAuthConfigResource.userInfoUrl


Report generated by Break Check

Last ran on 0ae71fb.

@coderabbitai

coderabbitai Bot commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds experimental custom OIDC enterprise connection support to Organization Profile SSO configuration, including provider types, OAuth endpoint serialization, feature-gated selection and routing, a three-step configuration wizard, validation, localization resources, shared mode controls, tests, and release metadata.

Estimated code review effort: 4 (Complex) | ~60 minutes

Possibly related PRs

  • clerk/javascript#9156: Updates the related EnterpriseConnection OAuth URL model and serialization fields.

Suggested reviewers: gabrielmeloc22, kalafut, wobsoriano, laurabeatris

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: adding an OIDC ConfigureSSO wizard skeleton in the UI.
Description check ✅ Passed The description matches the changeset and accurately mentions the OIDC provider path, skeleton steps, localization, and tests.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@packages/ui/src/components/ConfigureSSO/domain/organizationEnterpriseConnection.ts`:
- Line 16: Update isOidcProvider to require the `oidc_` prefix, matching the
OidcProviderType contract and excluding bare or malformed values such as `oidc`
and `oidcfoo`; add a regression test covering these unsupported inputs and
preserving valid OIDC values.

In `@packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/index.tsx`:
- Around line 90-96: Localize the unsupported-provider fallback in the
ConfigureStep component by adding typed
configureSSO.configureStep.unsupportedProvider resource keys for the title and
description, then render both through localizationKeys. Follow the existing OIDC
localization contract and keep the terminal UI on the same localization path
instead of using English literals.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: 7c43c83d-8790-40f9-a66e-d611f185371a

📥 Commits

Reviewing files that changed from the base of the PR and between c904fb4 and 09cfbe7.

📒 Files selected for processing (14)
  • .changeset/cool-dragons-march.md
  • .changeset/spotty-items-dream.md
  • packages/localizations/src/en-US.ts
  • packages/shared/src/types/localization.ts
  • packages/ui/src/components/ConfigureSSO/domain/__tests__/organizationEnterpriseConnection.test.ts
  • packages/ui/src/components/ConfigureSSO/domain/organizationEnterpriseConnection.ts
  • packages/ui/src/components/ConfigureSSO/hooks/__tests__/useOrganizationEnterpriseConnection.test.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/__tests__/ConfigureStep.test.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/index.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/oidc/OidcCustomConfigureSteps.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/oidc/index.tsx
  • packages/ui/src/components/ConfigureSSO/steps/SelectProviderStep.tsx
  • packages/ui/src/components/ConfigureSSO/steps/__tests__/SelectProviderStep.test.tsx
  • packages/ui/src/components/ConfigureSSO/types.ts
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • clerk/clerk_go (manual)
  • clerk/dashboard (manual)
  • clerk/accounts (manual)
  • clerk/backoffice (manual)
  • clerk/clerk (manual)
  • clerk/clerk-docs (manual)
  • clerk/cloudflare-workers (manual)

Comment thread packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/index.tsx Outdated

@dstaley dstaley left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm! I think a human-review of all the comments would be a good thing to do. As-is they feel too jargon-y, and my confidence in them is low because they feel too AI written. If they're accurate that's great, but I think we can probably rewrite them to be more clear to others who eventually encounter this code.

Comment thread packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/index.tsx Outdated
Comment thread packages/ui/src/components/ConfigureSSO/types.ts Outdated
@dstaley

dstaley commented Jul 24, 2026

Copy link
Copy Markdown
Member

@NicolasLopes7 before merging please run pnpm --filter @clerk/localizations generate

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (2)
packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/oidc/shared/OidcCredentialsStep.tsx (1)

22-36: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Client secret must be re-entered on every visit, even when already configured.

Unlike SamlCustomConfigureSteps.tsx's certificate step (which tracks existingCertPresent so users aren't forced to re-upload an existing certificate), canSubmit here always requires a fresh clientSecret, with no path to keep a previously-saved secret. This blocks users from re-saving clientId alone or simply continuing through an already-configured connection.

If intentional (secrets always required fresh), consider ignoring; otherwise consider an existingSecretPresent-style flag mirroring the SAML pattern.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/oidc/shared/OidcCredentialsStep.tsx`
around lines 22 - 36, The OIDC credentials flow always requires a newly entered
client secret, preventing reuse of an already-configured connection. Update
OidcCredentialsStep’s initialization and canSubmit logic to track whether an
existing client secret is present, mirroring the existingCertPresent pattern in
the SAML certificate step, and allow submission when the saved secret is
available even if the secret field remains blank.
packages/ui/src/components/ConfigureSSO/domain/__tests__/organizationEnterpriseConnection.test.ts (1)

96-99: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Add direct isOidcProvider boundary tests.
This case only checks that provider is copied through verbatim; it doesn’t exercise the exact oidc_ / oauth_custom_ prefix check. Add focused cases for oidc, oidcfoo, and oauth_custom rejection, plus oidc_x / oauth_custom_x acceptance.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@packages/ui/src/components/ConfigureSSO/domain/__tests__/organizationEnterpriseConnection.test.ts`
around lines 96 - 99, Add focused boundary tests for isOidcProvider covering
rejection of exact “oidc”, “oidcfoo”, and “oauth_custom” values, and acceptance
of “oidc_x” and “oauth_custom_x”. Keep the existing provider passthrough test
unchanged and assert the predicate’s result directly rather than only checking
derive().provider.

Source: Learnings

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@AGENTS.md`:
- Around line 20-36: Remove the entire ephemeral claude-mem context block from
AGENTS.md, including its status, live activity URL, and session-specific
instructions. Leave only stable repository-owned guidance in the committed file,
or omit the generated section entirely.

---

Nitpick comments:
In
`@packages/ui/src/components/ConfigureSSO/domain/__tests__/organizationEnterpriseConnection.test.ts`:
- Around line 96-99: Add focused boundary tests for isOidcProvider covering
rejection of exact “oidc”, “oidcfoo”, and “oauth_custom” values, and acceptance
of “oidc_x” and “oauth_custom_x”. Keep the existing provider passthrough test
unchanged and assert the predicate’s result directly rather than only checking
derive().provider.

In
`@packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/oidc/shared/OidcCredentialsStep.tsx`:
- Around line 22-36: The OIDC credentials flow always requires a newly entered
client secret, preventing reuse of an already-configured connection. Update
OidcCredentialsStep’s initialization and canSubmit logic to track whether an
existing client secret is present, mirroring the existingCertPresent pattern in
the SAML certificate step, and allow submission when the saved secret is
available even if the secret field remains blank.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: 775effe0-af57-487e-bc39-2f4f166b3d01

📥 Commits

Reviewing files that changed from the base of the PR and between 3040083 and 1c66c88.

📒 Files selected for processing (72)
  • AGENTS.md
  • packages/clerk-js/src/core/resources/EnterpriseConnection.ts
  • packages/localizations/src/ar-SA.ts
  • packages/localizations/src/be-BY.ts
  • packages/localizations/src/bg-BG.ts
  • packages/localizations/src/bn-IN.ts
  • packages/localizations/src/ca-ES.ts
  • packages/localizations/src/cs-CZ.ts
  • packages/localizations/src/da-DK.ts
  • packages/localizations/src/de-DE.ts
  • packages/localizations/src/el-GR.ts
  • packages/localizations/src/en-GB.ts
  • packages/localizations/src/en-US.ts
  • packages/localizations/src/es-CR.ts
  • packages/localizations/src/es-ES.ts
  • packages/localizations/src/es-MX.ts
  • packages/localizations/src/es-UY.ts
  • packages/localizations/src/fa-IR.ts
  • packages/localizations/src/fi-FI.ts
  • packages/localizations/src/fr-FR.ts
  • packages/localizations/src/he-IL.ts
  • packages/localizations/src/hi-IN.ts
  • packages/localizations/src/hr-HR.ts
  • packages/localizations/src/hu-HU.ts
  • packages/localizations/src/id-ID.ts
  • packages/localizations/src/is-IS.ts
  • packages/localizations/src/it-IT.ts
  • packages/localizations/src/ja-JP.ts
  • packages/localizations/src/kk-KZ.ts
  • packages/localizations/src/ko-KR.ts
  • packages/localizations/src/mn-MN.ts
  • packages/localizations/src/ms-MY.ts
  • packages/localizations/src/nb-NO.ts
  • packages/localizations/src/nl-BE.ts
  • packages/localizations/src/nl-NL.ts
  • packages/localizations/src/pl-PL.ts
  • packages/localizations/src/pt-BR.ts
  • packages/localizations/src/pt-PT.ts
  • packages/localizations/src/ro-RO.ts
  • packages/localizations/src/ru-RU.ts
  • packages/localizations/src/sk-SK.ts
  • packages/localizations/src/sr-RS.ts
  • packages/localizations/src/sv-SE.ts
  • packages/localizations/src/ta-IN.ts
  • packages/localizations/src/te-IN.ts
  • packages/localizations/src/th-TH.ts
  • packages/localizations/src/tr-TR.ts
  • packages/localizations/src/uk-UA.ts
  • packages/localizations/src/vi-VN.ts
  • packages/localizations/src/zh-CN.ts
  • packages/localizations/src/zh-TW.ts
  • packages/shared/src/types/elementIds.ts
  • packages/shared/src/types/enterpriseConnection.ts
  • packages/shared/src/types/localization.ts
  • packages/ui/src/components/ConfigureSSO/domain/__tests__/organizationEnterpriseConnection.test.ts
  • packages/ui/src/components/ConfigureSSO/domain/organizationEnterpriseConnection.ts
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/__tests__/ConfigureStep.test.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/index.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/oidc/OidcCustomConfigureSteps.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/oidc/shared/OidcCredentialsStep.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/oidc/shared/OidcEndpointsConfigurationForm.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/oidc/shared/OidcEndpointsStep.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/oidc/shared/OidcRedirectUriStep.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlCustomConfigureSteps.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlGoogleConfigureSteps.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlMicrosoftConfigureSteps.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlOktaConfigureSteps.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/shared/IdentityProviderConfigurationForm.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/shared/IdentityProviderConfigurationModes.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/shared/ActiveConnectionAlert.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/shared/IdentityProviderConfigurationModes.tsx
  • packages/ui/src/components/ConfigureSSO/types.ts
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • clerk/clerk_go (manual)
  • clerk/dashboard (manual)
  • clerk/accounts (manual)
  • clerk/backoffice (manual)
  • clerk/clerk (manual)
  • clerk/clerk-docs (manual)
  • clerk/cloudflare-workers (manual)
  • clerk/cli (auto-detected)
  • clerk/clerk-ios (auto-detected)
  • clerk/clerk-android (auto-detected)
💤 Files with no reviewable changes (1)
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/shared/IdentityProviderConfigurationModes.tsx
🚧 Files skipped from review as they are similar to previous changes (43)
  • packages/localizations/src/fr-FR.ts
  • packages/localizations/src/es-UY.ts
  • packages/localizations/src/ro-RO.ts
  • packages/localizations/src/sk-SK.ts
  • packages/localizations/src/ja-JP.ts
  • packages/localizations/src/sv-SE.ts
  • packages/localizations/src/he-IL.ts
  • packages/localizations/src/da-DK.ts
  • packages/localizations/src/en-GB.ts
  • packages/localizations/src/hr-HR.ts
  • packages/ui/src/components/ConfigureSSO/types.ts
  • packages/localizations/src/pt-BR.ts
  • packages/localizations/src/id-ID.ts
  • packages/localizations/src/it-IT.ts
  • packages/localizations/src/fa-IR.ts
  • packages/localizations/src/ms-MY.ts
  • packages/localizations/src/es-CR.ts
  • packages/localizations/src/nb-NO.ts
  • packages/localizations/src/hi-IN.ts
  • packages/localizations/src/pl-PL.ts
  • packages/localizations/src/bn-IN.ts
  • packages/localizations/src/kk-KZ.ts
  • packages/localizations/src/te-IN.ts
  • packages/localizations/src/nl-BE.ts
  • packages/localizations/src/mn-MN.ts
  • packages/localizations/src/hu-HU.ts
  • packages/localizations/src/ta-IN.ts
  • packages/localizations/src/zh-TW.ts
  • packages/localizations/src/pt-PT.ts
  • packages/localizations/src/uk-UA.ts
  • packages/localizations/src/fi-FI.ts
  • packages/localizations/src/ca-ES.ts
  • packages/ui/src/components/ConfigureSSO/domain/organizationEnterpriseConnection.ts
  • packages/localizations/src/es-MX.ts
  • packages/localizations/src/es-ES.ts
  • packages/localizations/src/en-US.ts
  • packages/localizations/src/nl-NL.ts
  • packages/localizations/src/el-GR.ts
  • packages/localizations/src/be-BY.ts
  • packages/localizations/src/th-TH.ts
  • packages/localizations/src/bg-BG.ts
  • packages/localizations/src/cs-CZ.ts
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/index.tsx

Comment thread AGENTS.md Outdated
@NicolasLopes7

Copy link
Copy Markdown
Contributor Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Full review finished.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (1)
packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/oidc/shared/OidcRedirectUriStep.tsx (1)

170-173: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

isDisabled={isLastStep} on Continue is always false here — likely copy-paste leftover.

This step (redirect-uri) is always the first of three fixed OIDC_STEPS, so isLastStep never evaluates true for this component; the binding has no effect and reads as if this could be the wizard's final step, which is misleading. OidcCredentialsStep/OidcEndpointsStep don't use isLastStep for their Continue button.

♻️ Proposed cleanup
-        <Step.Footer.Continue
-          onClick={() => goNext()}
-          isDisabled={isLastStep}
-        />
+        <Step.Footer.Continue onClick={() => goNext()} />
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/oidc/shared/OidcRedirectUriStep.tsx`
around lines 170 - 173, Remove the redundant isDisabled={isLastStep} prop from
the Step.Footer.Continue component in OidcRedirectUriStep, leaving its onClick
behavior unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/oidc/shared/OidcEndpointsStep.tsx`:
- Around line 97-109: Update the non-discovery payload in the OidcEndpointsStep
updateConnection flow to include userInfoUrl only when
userInfoUrlField.value.trim() is non-empty; preserve the existing required
authUrl and tokenUrl fields and discoveryUrl behavior.

In `@packages/ui/src/components/ConfigureSSO/steps/SelectProviderStep.tsx`:
- Around line 86-93: The providerGroups filtering in SelectProviderStep must
retain the OIDC group when currentCard represents an existing oidc_custom
connection, even if isOIDCFlowEnabled is false, so the selected radio remains
visible. Update the condition near providerGroups to account for the existing
selected provider while preserving the flag-based hiding behavior for new OIDC
selections, and add a regression test covering the flag-off existing OIDC
connection case.

---

Nitpick comments:
In
`@packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/oidc/shared/OidcRedirectUriStep.tsx`:
- Around line 170-173: Remove the redundant isDisabled={isLastStep} prop from
the Step.Footer.Continue component in OidcRedirectUriStep, leaving its onClick
behavior unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: fb2289aa-89ba-4454-b5db-ce19d2b15cac

📥 Commits

Reviewing files that changed from the base of the PR and between f67a641 and 0ae71fb.

📒 Files selected for processing (76)
  • .changeset/cool-dragons-march.md
  • packages/clerk-js/src/core/resources/EnterpriseConnection.ts
  • packages/localizations/src/ar-SA.ts
  • packages/localizations/src/be-BY.ts
  • packages/localizations/src/bg-BG.ts
  • packages/localizations/src/bn-IN.ts
  • packages/localizations/src/ca-ES.ts
  • packages/localizations/src/cs-CZ.ts
  • packages/localizations/src/da-DK.ts
  • packages/localizations/src/de-DE.ts
  • packages/localizations/src/el-GR.ts
  • packages/localizations/src/en-GB.ts
  • packages/localizations/src/en-US.ts
  • packages/localizations/src/es-CR.ts
  • packages/localizations/src/es-ES.ts
  • packages/localizations/src/es-MX.ts
  • packages/localizations/src/es-UY.ts
  • packages/localizations/src/fa-IR.ts
  • packages/localizations/src/fi-FI.ts
  • packages/localizations/src/fr-FR.ts
  • packages/localizations/src/he-IL.ts
  • packages/localizations/src/hi-IN.ts
  • packages/localizations/src/hr-HR.ts
  • packages/localizations/src/hu-HU.ts
  • packages/localizations/src/id-ID.ts
  • packages/localizations/src/is-IS.ts
  • packages/localizations/src/it-IT.ts
  • packages/localizations/src/ja-JP.ts
  • packages/localizations/src/kk-KZ.ts
  • packages/localizations/src/ko-KR.ts
  • packages/localizations/src/mn-MN.ts
  • packages/localizations/src/ms-MY.ts
  • packages/localizations/src/nb-NO.ts
  • packages/localizations/src/nl-BE.ts
  • packages/localizations/src/nl-NL.ts
  • packages/localizations/src/pl-PL.ts
  • packages/localizations/src/pt-BR.ts
  • packages/localizations/src/pt-PT.ts
  • packages/localizations/src/ro-RO.ts
  • packages/localizations/src/ru-RU.ts
  • packages/localizations/src/sk-SK.ts
  • packages/localizations/src/sr-RS.ts
  • packages/localizations/src/sv-SE.ts
  • packages/localizations/src/ta-IN.ts
  • packages/localizations/src/te-IN.ts
  • packages/localizations/src/th-TH.ts
  • packages/localizations/src/tr-TR.ts
  • packages/localizations/src/uk-UA.ts
  • packages/localizations/src/vi-VN.ts
  • packages/localizations/src/zh-CN.ts
  • packages/localizations/src/zh-TW.ts
  • packages/shared/src/types/elementIds.ts
  • packages/shared/src/types/enterpriseConnection.ts
  • packages/shared/src/types/localization.ts
  • packages/ui/src/components/ConfigureSSO/domain/__tests__/organizationEnterpriseConnection.test.ts
  • packages/ui/src/components/ConfigureSSO/domain/organizationEnterpriseConnection.ts
  • packages/ui/src/components/ConfigureSSO/hooks/__tests__/useOrganizationEnterpriseConnection.test.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/__tests__/ConfigureStep.test.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/index.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/oidc/OidcCustomConfigureSteps.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/oidc/index.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/oidc/shared/OidcCredentialsStep.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/oidc/shared/OidcEndpointsConfigurationForm.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/oidc/shared/OidcEndpointsStep.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/oidc/shared/OidcRedirectUriStep.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlCustomConfigureSteps.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlGoogleConfigureSteps.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlMicrosoftConfigureSteps.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/SamlOktaConfigureSteps.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/shared/IdentityProviderConfigurationForm.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/shared/IdentityProviderConfigurationModes.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/shared/ActiveConnectionAlert.tsx
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/shared/IdentityProviderConfigurationModes.tsx
  • packages/ui/src/components/ConfigureSSO/steps/SelectProviderStep.tsx
  • packages/ui/src/components/ConfigureSSO/steps/__tests__/SelectProviderStep.test.tsx
  • packages/ui/src/components/ConfigureSSO/types.ts
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • clerk/clerk_go (manual)
  • clerk/dashboard (manual)
  • clerk/accounts (manual)
  • clerk/backoffice (manual)
  • clerk/clerk (manual)
  • clerk/clerk-docs (manual)
  • clerk/cloudflare-workers (manual)
  • clerk/cli (auto-detected)
  • clerk/clerk-ios (auto-detected)
  • clerk/clerk-android (auto-detected)
💤 Files with no reviewable changes (1)
  • packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/saml/shared/IdentityProviderConfigurationModes.tsx

Comment on lines +97 to +109
try {
await updateConnection(
enterpriseConnection.id,
mode === 'discoveryUrl'
? { oidc: { discoveryUrl: discoveryUrlField.value.trim() } }
: {
oidc: {
authUrl: authUrlField.value.trim(),
tokenUrl: tokenUrlField.value.trim(),
userInfoUrl: userInfoUrlField.value.trim(),
},
},
);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Avoid sending an empty userInfoUrl when the optional field is blank.

userInfoUrl is optional (per the OIDC provider contract), but the payload always includes userInfoUrl: userInfoUrlField.value.trim() even when the field is empty. Consider omitting the key entirely when blank so an empty string isn't persisted as an explicit value.

🔧 Suggested fix
       await updateConnection(
         enterpriseConnection.id,
         mode === 'discoveryUrl'
           ? { oidc: { discoveryUrl: discoveryUrlField.value.trim() } }
           : {
               oidc: {
                 authUrl: authUrlField.value.trim(),
                 tokenUrl: tokenUrlField.value.trim(),
-                userInfoUrl: userInfoUrlField.value.trim(),
+                ...(userInfoUrlField.value.trim() ? { userInfoUrl: userInfoUrlField.value.trim() } : {}),
               },
             },
       );
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
try {
await updateConnection(
enterpriseConnection.id,
mode === 'discoveryUrl'
? { oidc: { discoveryUrl: discoveryUrlField.value.trim() } }
: {
oidc: {
authUrl: authUrlField.value.trim(),
tokenUrl: tokenUrlField.value.trim(),
userInfoUrl: userInfoUrlField.value.trim(),
},
},
);
try {
await updateConnection(
enterpriseConnection.id,
mode === 'discoveryUrl'
? { oidc: { discoveryUrl: discoveryUrlField.value.trim() } }
: {
oidc: {
authUrl: authUrlField.value.trim(),
tokenUrl: tokenUrlField.value.trim(),
...(userInfoUrlField.value.trim() ? { userInfoUrl: userInfoUrlField.value.trim() } : {}),
},
},
);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@packages/ui/src/components/ConfigureSSO/steps/ConfigureStep/oidc/shared/OidcEndpointsStep.tsx`
around lines 97 - 109, Update the non-discovery payload in the OidcEndpointsStep
updateConnection flow to include userInfoUrl only when
userInfoUrlField.value.trim() is non-empty; preserve the existing required
authUrl and tokenUrl fields and discoveryUrl behavior.

Comment on lines +86 to +93
const providerGroups = React.useMemo(
() => PROVIDER_GROUPS.filter(group => group.id !== 'oidc' || isOIDCFlowEnabled),
[isOIDCFlowEnabled],
);

const currentCard = c.provider ? toProviderCard(c.provider) : null;

const [selected, setSelected] = React.useState<ProviderType | null>(currentCard);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Existing OIDC connections desync the selected radio when the flag is off.

providerGroups unconditionally hides the 'oidc' group when isOIDCFlowEnabled is false, but currentCard/selected can still resolve to 'oidc_custom' for an org that already has an OIDC/OAuth-custom connection (these can be provisioned outside this UI, per the OAuth/OIDC provider-prefix contract used elsewhere in this PR). The result: the radiogroup renders with no visibly checked option even though a connection is actively configured — confusing, though "Continue" still functions since selected === currentCard.

🐛 Proposed fix
-  const providerGroups = React.useMemo(
-    () => PROVIDER_GROUPS.filter(group => group.id !== 'oidc' || isOIDCFlowEnabled),
-    [isOIDCFlowEnabled],
-  );
-
-  const currentCard = c.provider ? toProviderCard(c.provider) : null;
+  const currentCard = c.provider ? toProviderCard(c.provider) : null;
+
+  const providerGroups = React.useMemo(
+    () => PROVIDER_GROUPS.filter(group => group.id !== 'oidc' || isOIDCFlowEnabled || currentCard === 'oidc_custom'),
+    [isOIDCFlowEnabled, currentCard],
+  );

Also worth a regression test alongside the existing "OIDC provider (experimental flag)" tests in SelectProviderStep.test.tsx for "flag off + existing OIDC connection → tile still shown as selected."

Also applies to: 169-169

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/ui/src/components/ConfigureSSO/steps/SelectProviderStep.tsx` around
lines 86 - 93, The providerGroups filtering in SelectProviderStep must retain
the OIDC group when currentCard represents an existing oidc_custom connection,
even if isOIDCFlowEnabled is false, so the selected radio remains visible.
Update the condition near providerGroups to account for the existing selected
provider while preserving the flag-based hiding behavior for new OIDC
selections, and add a regression test covering the flag-off existing OIDC
connection case.

@NicolasLopes7
NicolasLopes7 merged commit 2974fb0 into main Jul 29, 2026
52 checks passed
@NicolasLopes7
NicolasLopes7 deleted the nicolas/oidc-self-serve-configure branch July 29, 2026 16:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants