Merge AI operations and error-log discipline into release/v1.42.0

This commit is contained in:
Marc-André Bombeck committed 2026-10-08 09:06:58 +02:00
commit 5c23f9ed63
71 files changed
+3650 -340

No files matched your search

@@ -48,6 +48,14 @@ interface ProviderHealthRow {
lastOkAt: string | null;
lastFailureAt: string | null;
lastFailureStatus: number | null;
/** v1.42 — users this provider is paused for, and when the last lifts. */
pausedUsers?: number;
pausedUntil?: string | null;
/** v1.42 — the operator key's model check, while it is failing. */
modelListing?: {
model: string;
listing: "listed" | "not_listed" | "unknown";
} | null;
}
export function ProviderHealthSection() {
@@ -151,11 +159,33 @@ export function ProviderHealthSection() {
})}`
: ""}
</span>
{p.pausedUsers && p.pausedUntil ? (
<span
className="text-muted-foreground text-xs"
data-slot="provider-paused"
>
{t("admin.providerHealth.pausedHint", {
count: p.pausedUsers,
at: formatDateTime(p.pausedUntil),
})}
</span>
) : null}
{p.modelListing?.listing === "not_listed" ? (
<span className="text-sm" data-slot="provider-model-missing">
{t("admin.providerHealth.modelNotServed", {
model: p.modelListing.model,
})}
</span>
) : null}
</div>
{p.failing === 0 ? (
<Badge variant="secondary">
{t("admin.providerHealth.statusHealthy")}
</Badge>
) : p.pausedUsers ? (
<Badge variant="destructive">
{t("admin.providerHealth.statusPaused")}
</Badge>
) : (
<Badge variant="destructive">
{t("admin.providerHealth.statusFailing", {