Files
Nikolas Garza 1541e3e593 fix(web): lock the SCIM and service-account pages without a license (#16470)
## Description

`/admin/scim` and `/admin/service-accounts` now redirect with "This
feature requires a license" when the license does not cover EE features,
like the other paid admin pages. Fixes
[ENG-4442](https://linear.app/onyx-app/issue/ENG-4442/scim-and-service-account-pages-are-not-locked-after-the-community).

**Why**
- Paid pages are locked by `web/src/proxy.ts:EE_ROUTES`, which rewrites
them to the `/ee` tree whose layout turns an unlicensed deployment away.
- These two paths were never in that list, so after a downgrade SCIM
offered a token button that returns 402, and service accounts showed a
load error.

**What**
- Both paths are added to `EE_ROUTES`.
- Like `/admin/groups`, each has a one-line page stub in `app/admin/`
(keeps typed `Link` hrefs valid) and `app/ee/admin/` (the copy the proxy
serves).
- The SCIM page body moves to `views/admin/ScimPage/`, with
`interfaces.ts` renamed `types.ts` and imports made absolute.
- `src/app/admin` type-coverage floor drops from 97.3 to 97.2 because
typed code left it. Feature-map docs list the new EE routes.

| Before | After |
| --- | --- |
|
![](https://raw.githubusercontent.com/onyx-dot-app/onyx/assets/ui-screenshots/lock-scim-and-service-accounts/before-scim.jpg)
|
![](https://raw.githubusercontent.com/onyx-dot-app/onyx/assets/ui-screenshots/lock-scim-and-service-accounts/after-scim.jpg)
|
|
![](https://raw.githubusercontent.com/onyx-dot-app/onyx/assets/ui-screenshots/lock-scim-and-service-accounts/before-service-accounts.jpg)
|
![](https://raw.githubusercontent.com/onyx-dot-app/onyx/assets/ui-screenshots/lock-scim-and-service-accounts/after-service-accounts.jpg)
|

## How Has This Been Tested?

Live in Chrome against a scratch API with no license
(`ee_features_enabled` false, tier community): on main both pages load
as above. On this branch both redirect to `/app` with the license toast,
the same as `/admin/groups`. With a license seeded, both pages still
load. Jest (`src/app/ee/__tests__/licenseGatedRoutes.test.ts`): the
proxy rewrites both paths to `/ee`, and both cases fail against main's
`proxy.ts`. `types:check` and pre-commit pass.

## Additional Options

- [x] [Optional] Please cherry-pick this PR to the latest release
version.
2026-10-22 01:24:21 +00:00
..