feat: add problem detection framework for common problems (#2412)

Introduces a ProblemManager that detects and surfaces actionable issues
(stale config, legacy frigate-hass-card resources, slow/failed streams)
via status bar indicators and notification popups with fix actions.
This commit is contained in:
Dermot Duffy
2026-03-13 20:00:59 -07:00
committed by GitHub
parent 95faddd9a0
commit ab683df5e8
46 changed files with 2147 additions and 166 deletions
+3
View File
@@ -1,4 +1,5 @@
import { z } from 'zod';
import { linkSchema } from '../common/link';
import { severitySchema } from '../common/severity';
import { statusBarItemBaseSchema } from '../common/status-bar';
import { advancedCameraCardCustomActionsBaseSchema } from './custom/base';
@@ -138,6 +139,7 @@ const notificationSchema = z.object({
controls: notificationControlSchema.array().optional(),
details: notificationDetailSchema.array().optional(),
text: z.string().optional(),
link: linkSchema.optional(),
});
export type Notification = z.infer<typeof notificationSchema>;
@@ -157,6 +159,7 @@ const statusBarItemElementsBaseSchema = statusBarItemBaseSchema.extend({
exclusive: z.boolean().default(false).optional(),
expand: z.boolean().default(false).optional(),
severity: severitySchema.optional(),
title: z.string().optional(),
actions: actionsBaseSchema.optional(),
});
+7
View File
@@ -0,0 +1,7 @@
import { z } from 'zod';
export const linkSchema = z.object({
url: z.string(),
title: z.string(),
});
export type Link = z.infer<typeof linkSchema>;
+19 -5
View File
@@ -26,7 +26,11 @@ export const statusBarConfigDefault = {
severity: statusBarItemDefault,
technology: statusBarItemDefault,
title: statusBarItemDefault,
upgrade: statusBarItemDefault,
// Problems.
problem_config_upgrade: statusBarItemDefault,
problem_legacy_resource: statusBarItemDefault,
problem_stream_not_loading: statusBarItemDefault,
},
position: 'bottom' as const,
style: 'popup' as const,
@@ -46,15 +50,25 @@ export const statusBarConfigSchema = z
items: z
.object({
engine: statusBarItemBaseSchema.default(statusBarConfigDefault.items.engine),
technology: statusBarItemBaseSchema.default(
statusBarConfigDefault.items.technology,
),
resolution: statusBarItemBaseSchema.default(
statusBarConfigDefault.items.resolution,
),
severity: statusBarItemBaseSchema.default(statusBarConfigDefault.items.severity),
technology: statusBarItemBaseSchema.default(
statusBarConfigDefault.items.technology,
),
title: statusBarItemBaseSchema.default(statusBarConfigDefault.items.title),
upgrade: statusBarItemBaseSchema.default(statusBarConfigDefault.items.upgrade),
// Problems.
problem_config_upgrade: statusBarItemBaseSchema.default(
statusBarConfigDefault.items.problem_config_upgrade,
),
problem_legacy_resource: statusBarItemBaseSchema.default(
statusBarConfigDefault.items.problem_legacy_resource,
),
problem_stream_not_loading: statusBarItemBaseSchema.default(
statusBarConfigDefault.items.problem_stream_not_loading,
),
})
.default(statusBarConfigDefault.items),
})