mounted is now only set to true on successful load. On error, it stays
false so the $effect never fires, activeScopes stays empty, and the
parent-bound scopes prop is never overwritten with [].
Parameters with a non-empty example value are treated as required when
the provider is enabled. Params without an example (e.g. GitLab endpoint
for self-hosted) remain optional regardless of enabled state.
Previously a rejected API call left allScopesList empty and mounted
stuck at false with no feedback to the user. Now catches the error,
displays an inline alert, and sets mounted in finally so the component
settles cleanly.
p8File fields now show a drag-and-drop style upload zone by default.
Users can click to upload a .p8 file directly or toggle to paste mode
for manual entry. Loaded files show a confirmation state with a clear
button.
Fetch listOAuth2Providers alongside listOAuth2Providers (project) in
+page.ts using Promise.all, pass parameters as a prop to mainOAuth.
Modal now opens instantly with no spinner or async fetch.
- Replace hardcoded OAuth2 provider components with a single dynamic
mainOAuth.svelte that fetches labels, placeholders, and hints from
listOAuth2Providers; removes 10 now-unused provider-specific files
- Load OAuth2 provider list and enabled state from project SDK in
+page.ts instead of reading from the project model directly
- Fetch API key scopes from listProjectScopes instead of static
constants; migrate scopes.svelte to Svelte 5 runes
- Add executions.read/write scope definitions and legacy compat pair
for execution. -> executions.
- Secret field uses write-only card pattern (Tag -> expandable Card);
no pre-fill, no silent fallbacks
- Use svelte/store get() for read-only access in headerAlert.get() and
getExcluding() to avoid spurious subscriber notifications on every call
- Fix bannerSpacing.set(undefined) → set(null) to match the store's
declared string | null type (alertStack and headerAlert)
- Remove redundant isImpersonating guard around ImpersonationBanner;
the component self-manages visibility, eliminating the transient
empty-stack layout edge case
The header-alert system previously rendered only the highest-importance
banner. Since the impersonation banner has importance 100, it always
suppressed payment-failed and other billing alerts (importance 1),
making them invisible to operators during impersonation sessions.
Now the impersonation banner renders in a separate fixed-position stack
alongside the highest-priority customer alert, so operators can see
exactly what the customer sees while impersonating.