A handful of orgs still have realtime bandwidth tracked outside the
bandwidth resource (not billed/rolled in yet). Earlier commit hid
their realtime value entirely once the breakdown bar suppressed it.
Render a standalone informational Realtime bandwidth row only when
realtimeBandwidthValue > bandwidthValue, matching today's pre-merge
behaviour for those orgs while keeping the modern path one row.
A handful of legacy orgs have realtime bandwidth tracked separately
(not yet billed and not added into the bandwidth resource). For them
realtimeBytes > totalBytes, which would otherwise overflow the bar or
collapse the regular segment to zero. Detect that case and render
bandwidth as a single segment instead, preserving today's behaviour
for those orgs.
Backend already rolls realtimeBandwidth value + amount into the
bandwidth resource, so the previous commit was summing them again
(value + amount), inflating both the displayed total and the priced
amount, and over-driving the progress bar.
Use bandwidth?.value / bandwidth?.amount directly (already include
realtime). For the multi-segment progress bar, carve the realtime
slice out of the total instead of summing — regular = total - realtime,
realtime = realtime — so the segments add to the actual bandwidth
total. Same neutral colour family as before, no multi-colour added.
Clamps realtime to [0, total] in case of dirty data.
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.
Merges the standalone "Realtime bandwidth" row into the "Bandwidth" row.
The progress bar now renders two color-coded segments — regular bandwidth
and realtime bandwidth — with hover tooltips showing the realtime value.
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.