@camstack/addon-training 0.1.70 → 0.1.72

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (20) hide show
  1. package/dist/{MotionZonesSettings-B9_DluhF.mjs → MotionZonesSettings-DtrBEodK.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-CncKu03o.mjs → PrivacyMaskSettings-DMvD-Aoa.mjs} +2 -2
  3. package/dist/{SceneMonitorEditor-xUwTVl54.mjs → SceneMonitorEditor-DlaZqKNk.mjs} +1 -1
  4. package/dist/_stub.js +14 -14
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-CP9uBDY3.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-CR71IyGN.mjs} +4 -4
  6. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-B4oJE-uP.mjs +26 -0
  7. package/dist/{dist-5U0pW8tJ.mjs → dist-Ch3aUw2u.mjs} +237 -61
  8. package/dist/{dist-BzGklukW.js → dist-F0HQ_GTW.js} +237 -61
  9. package/dist/{hostInit-DRnOjDpM.mjs → hostInit-CqN7AHWD.mjs} +3 -3
  10. package/dist/index.js +1 -1
  11. package/dist/orchestrator/training.addon.js +1 -1
  12. package/dist/orchestrator/training.addon.mjs +1 -1
  13. package/dist/{player-overlays-BqBg6DO2.mjs → player-overlays-_18EagGF.mjs} +1 -1
  14. package/dist/providers/modal/training-modal.addon.js +1 -1
  15. package/dist/providers/modal/training-modal.addon.mjs +1 -1
  16. package/dist/remoteEntry.js +1 -1
  17. package/dist/{responsive-vB1EsOnM.mjs → responsive-pyVT1YFE.mjs} +1 -1
  18. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-DctmQSuv.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-qU7q9e7k.mjs} +1 -1
  19. package/package.json +1 -1
  20. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-p4t7dbDk.mjs +0 -26
@@ -1,5 +1,5 @@
1
1
  import "node:crypto";
2
- //#region ../types/dist/event-category-DOl51-Ij.mjs
2
+ //#region ../types/dist/event-category-BfJwUd2S.mjs
3
3
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4
4
  EventCategory["SystemBoot"] = "system.boot";
5
5
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -316,6 +316,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
316
316
  */
317
317
  EventCategory["PipelineDetectionBlind"] = "pipeline.detection-blind";
318
318
  /**
319
+ * A camera's motion source has fired constantly with no subject for an hour
320
+ * (motion duty or session count over the bar, zero detections) — it is not
321
+ * blind, its motion zones or sensitivity want tuning (D907). Paired with
322
+ * {@link PipelineMotionCalm}.
323
+ */
324
+ EventCategory["PipelineMotionNoisy"] = "pipeline.motion-noisy";
325
+ /** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
326
+ EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
327
+ /**
319
328
  * Per-camera pipeline config was mutated by the orchestrator
320
329
  * (3-level settings change via `setAgentAddonDefaults` /
321
330
  * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
@@ -687,6 +696,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
687
696
  EventCategory["BackupRestored"] = "backup.restored";
688
697
  EventCategory["NotificationDispatched"] = "notification.dispatched";
689
698
  EventCategory["NotificationFailed"] = "notification.failed";
699
+ /**
700
+ * A notification rule that cannot work (D905): its stored row does not load,
701
+ * or it still names a device / delivery target the prune CONFIRMED deleted.
702
+ * One edge per rule per distinct set of reasons; never on an unanswered read.
703
+ */
704
+ EventCategory["NotificationRuleBroken"] = "notification.rule-broken";
705
+ /** The clear of {@link NotificationRuleBroken}: the rule loads and names nothing deleted. */
706
+ EventCategory["NotificationRuleRepaired"] = "notification.rule-repaired";
690
707
  EventCategory["DeviceUpdated"] = "device.updated";
691
708
  /**
692
709
  * Transport-level connectivity. Emitted by the device driver when
@@ -5547,7 +5564,7 @@ var ZodIssueCode = {
5547
5564
  var ZodFirstPartyTypeKind;
5548
5565
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5549
5566
  //#endregion
5550
- //#region ../types/dist/sleep-_sV1BE2f.mjs
5567
+ //#region ../types/dist/sleep-DJFUfKvA.mjs
5551
5568
  /**
5552
5569
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5553
5570
  * window to float samples (D455).
@@ -8139,7 +8156,7 @@ var EntryDescriptorSchema = object({
8139
8156
  /** JSON Schema of the entry body; `secret: true` marks a password field. */
8140
8157
  fields: record(string(), unknown())
8141
8158
  }).strict();
8142
- /** What crosses the wire and sits in the engine's catalog: JSON only, no Zod. */
8159
+ /** What crosses the wire from an addon: JSON only, no Zod. An unknown key is refused. */
8143
8160
  var RecordKindDeclarationSchema = object({
8144
8161
  database: _enum(RECORD_DATABASES).default("settings"),
8145
8162
  class: _enum(RECORD_CLASSES),
@@ -8158,14 +8175,6 @@ var RecordKindDeclarationSchema = object({
8158
8175
  secretPaths: array(string().min(1)).default([]),
8159
8176
  /** The id key of each array that carries a secret (`{ headers: 'name' }`). */
8160
8177
  secretArrayKeys: record(string(), string()).default({}),
8161
- /**
8162
- * RETIRED (D900): the legacy table a kind adopted from during the records
8163
- * migration. Nothing declares it any more and nothing reads it; the schema
8164
- * still ACCEPTS it because the catalog rows the migration wrote carry it
8165
- * (an orphaned kind is never redeclared) and an addon built before the
8166
- * removal still sends it. Never set it.
8167
- */
8168
- adoptsFrom: string().min(1).optional(),
8169
8178
  /** Kinds that must agree through `transact` sit in one file under one family name. */
8170
8179
  transactFamily: string().min(1).optional(),
8171
8180
  entry: EntryDescriptorSchema.optional()
@@ -12965,17 +12974,6 @@ object({
12965
12974
  createdAt: number(),
12966
12975
  updatedAt: number()
12967
12976
  });
12968
- object({
12969
- id: string(),
12970
- label: string(),
12971
- isAdmin: boolean().default(false),
12972
- allowedProviders: AllowedProviderSchema,
12973
- allowedDevices: AllowedDevicesSchema,
12974
- tokenHash: string(),
12975
- tokenPrefix: string(),
12976
- createdAt: number(),
12977
- lastUsedAt: number().optional()
12978
- });
12979
12977
  object({
12980
12978
  id: string(),
12981
12979
  userId: string(),
@@ -16868,16 +16866,36 @@ var RecordKindStateSchema = _enum([
16868
16866
  var DeclareKindResultSchema = object({
16869
16867
  kindId: number().int(),
16870
16868
  state: RecordKindStateSchema,
16871
- createdIndexes: array(string()),
16872
- /**
16873
- * RETIRED (D900): always `null`. It carried the records-migration boot guard;
16874
- * it stays on the wire, null, because an addon built before the removal reads
16875
- * an ABSENT field as "adoption pending" and refuses to start.
16876
- */
16877
- adoptionPending: _null()
16869
+ createdIndexes: array(string())
16878
16870
  });
16879
16871
  /** Keychain refs a write released (the old marker is gone from the row): the owner deletes the values. */
16880
16872
  var SecretRefsList = array(string());
16873
+ /**
16874
+ * One op of a `transact`: the single-row writes, each on a kind of the caller.
16875
+ * All ops of one call share ONE database file and ONE `transactFamily`.
16876
+ */
16877
+ var RecordTransactOpSchema = discriminatedUnion("op", [
16878
+ object({
16879
+ op: literal("put"),
16880
+ kind: RecordKindNameSchema,
16881
+ record: RecordInputSchema,
16882
+ ifRev: number().int().min(0).optional()
16883
+ }),
16884
+ object({
16885
+ op: literal("patch"),
16886
+ kind: RecordKindNameSchema,
16887
+ id: RecordIdSchema,
16888
+ data: RecordBodySchema,
16889
+ at: number().int().nullable().optional(),
16890
+ expiresAt: number().int().nullable().optional(),
16891
+ ifRev: number().int().min(1).optional()
16892
+ }),
16893
+ object({
16894
+ op: literal("delete"),
16895
+ kind: RecordKindNameSchema,
16896
+ id: RecordIdSchema
16897
+ })
16898
+ ]);
16881
16899
  var RecordSecretRefsSchema = record(string(), record(string(), string()));
16882
16900
  method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema) }), object({ kinds: record(string(), DeclareKindResultSchema) }), {
16883
16901
  kind: "mutation",
@@ -16984,6 +17002,16 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
16984
17002
  }), {
16985
17003
  kind: "mutation",
16986
17004
  auth: "admin"
17005
+ }), method(object({ ops: array(RecordTransactOpSchema).min(1).max(RECORD_BATCH_MAX) }), object({
17006
+ results: array(object({
17007
+ rev: number().int().nullable(),
17008
+ deleted: boolean()
17009
+ })),
17010
+ releasedRefs: SecretRefsList,
17011
+ secretRefs: SecretRefsList
17012
+ }), {
17013
+ kind: "mutation",
17014
+ auth: "admin"
16987
17015
  }), method(object({
16988
17016
  deviceId: number().int(),
16989
17017
  kinds: array(RecordKindNameSchema).optional()
@@ -42342,9 +42370,13 @@ var NcSystemEventKindSchema = _enum([
42342
42370
  "node-updating",
42343
42371
  "node-inference-unavailable",
42344
42372
  "detection-blind",
42373
+ "motion-noisy",
42374
+ "motion-calm",
42345
42375
  "recording-stalled",
42346
42376
  "recording-healthy",
42347
42377
  "recording-degraded",
42378
+ "device-attention-required",
42379
+ "device-attention-resolved",
42348
42380
  "storage-location-low",
42349
42381
  "storage-location-critical",
42350
42382
  "storage-location-ok",
@@ -42368,6 +42400,8 @@ var NcSystemEventKindSchema = _enum([
42368
42400
  "alert-critical",
42369
42401
  "alert-error",
42370
42402
  "alert-critical-resolved",
42403
+ "rule-broken",
42404
+ "rule-repaired",
42371
42405
  "camera-online",
42372
42406
  "camera-offline",
42373
42407
  "camera-disabled",
@@ -54799,6 +54833,16 @@ object({
54799
54833
  powerState: string().nullable(),
54800
54834
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
54801
54835
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
54836
+ /**
54837
+ * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
54838
+ * combined care-and-filter reminder raised); false when every such reminder reads clear; null
54839
+ * when none is reported. A cleared reminder is not an unknown one.
54840
+ */
54841
+ filterCleaningDue: boolean().nullable(),
54842
+ /** True while the machine-care (descaling / cleaning-program) reminder is raised; false when clear; null when not reported. */
54843
+ machineCareDue: boolean().nullable(),
54844
+ /** Program runs left before the machine-care reminder is due; null when the appliance does not say. */
54845
+ machineCareRemainingRuns: number().int().nonnegative().nullable(),
54802
54846
  /** Option states: null when the appliance does not expose the option or has not said. */
54803
54847
  halfLoad: boolean().nullable(),
54804
54848
  hygienePlus: boolean().nullable(),
@@ -61416,16 +61460,6 @@ var UpdateUserInputSchema = object({
61416
61460
  allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
61417
61461
  scopes: array(TokenScopeSchema).optional()
61418
61462
  });
61419
- var ApiKeySummarySchema = object({
61420
- id: string(),
61421
- label: string(),
61422
- isAdmin: boolean().default(false),
61423
- allowedProviders: union([array(string()), literal("*")]).optional(),
61424
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
61425
- tokenPrefix: string(),
61426
- createdAt: number(),
61427
- lastUsedAt: number().optional()
61428
- });
61429
61463
  var OauthSessionSummarySchema = object({
61430
61464
  id: string(),
61431
61465
  userId: string(),
@@ -61447,8 +61481,7 @@ var TotpStatusSchema = object({
61447
61481
  confirmedAt: number().nullable()
61448
61482
  });
61449
61483
  /**
61450
- * user-management — singleton capability for user accounts and the
61451
- * legacy API-key rows.
61484
+ * user-management — singleton capability for user accounts.
61452
61485
  *
61453
61486
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
61454
61487
  * — the subset check on `setUserScopes` is moot
@@ -61504,10 +61537,6 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
61504
61537
  }), UserSummarySchema.extend({ passwordHash: string() }).nullable(), {
61505
61538
  kind: "mutation",
61506
61539
  access: "view"
61507
- }), method(_void(), array(ApiKeySummarySchema), { auth: "admin" }), method(object({ id: string() }), object({ success: literal(true) }), {
61508
- kind: "mutation",
61509
- auth: "admin",
61510
- access: "delete"
61511
61540
  }), method(object({ userId: string() }), TotpSetupResultSchema, {
61512
61541
  kind: "mutation",
61513
61542
  auth: "admin",
@@ -69120,6 +69149,12 @@ Object.freeze({
69120
69149
  addonId: null,
69121
69150
  access: "view"
69122
69151
  },
69152
+ "records.transact": {
69153
+ capName: "records",
69154
+ capScope: "system",
69155
+ addonId: null,
69156
+ access: "create"
69157
+ },
69123
69158
  "sceneMonitor.captureReference": {
69124
69159
  capName: "scene-monitor",
69125
69160
  capScope: "device",
@@ -70452,12 +70487,6 @@ Object.freeze({
70452
70487
  addonId: null,
70453
70488
  access: "view"
70454
70489
  },
70455
- "userManagement.listApiKeys": {
70456
- capName: "user-management",
70457
- capScope: "system",
70458
- addonId: null,
70459
- access: "view"
70460
- },
70461
70490
  "userManagement.listExternalIdentities": {
70462
70491
  capName: "user-management",
70463
70492
  capScope: "system",
@@ -70512,12 +70541,6 @@ Object.freeze({
70512
70541
  addonId: null,
70513
70542
  access: "create"
70514
70543
  },
70515
- "userManagement.revokeApiKey": {
70516
- capName: "user-management",
70517
- capScope: "system",
70518
- addonId: null,
70519
- access: "delete"
70520
- },
70521
70544
  "userManagement.revokeOauthSession": {
70522
70545
  capName: "user-management",
70523
70546
  capScope: "system",
@@ -73882,9 +73905,13 @@ new Map(Object.entries({
73882
73905
  "stream-online": "device-events",
73883
73906
  "stream-offline": "device-events",
73884
73907
  "detection-blind": "device-events",
73908
+ "motion-noisy": "device-events",
73909
+ "motion-calm": "device-events",
73885
73910
  "recording-stalled": "device-events",
73886
73911
  "recording-healthy": "device-events",
73887
73912
  "recording-degraded": "device-events",
73913
+ "device-attention-required": "device-events",
73914
+ "device-attention-resolved": "device-events",
73888
73915
  "node-online": "system",
73889
73916
  "node-offline": "system",
73890
73917
  "node-restarting": "system",
@@ -73901,6 +73928,8 @@ new Map(Object.entries({
73901
73928
  "alert-critical": "system",
73902
73929
  "alert-error": "system",
73903
73930
  "alert-critical-resolved": "system",
73931
+ "rule-broken": "system",
73932
+ "rule-repaired": "system",
73904
73933
  "storage-location-low": "system",
73905
73934
  "storage-location-critical": "system",
73906
73935
  "storage-location-ok": "system",
@@ -73965,6 +73994,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
73965
73994
  label: "Detecting nothing",
73966
73995
  kinds: ["detection-blind"]
73967
73996
  },
73997
+ {
73998
+ id: "motion-noise",
73999
+ family: "device-events",
74000
+ label: "Motion without a subject",
74001
+ kinds: ["motion-noisy", "motion-calm"]
74002
+ },
73968
74003
  {
73969
74004
  id: "recording",
73970
74005
  family: "device-events",
@@ -73975,6 +74010,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
73975
74010
  "recording-degraded"
73976
74011
  ]
73977
74012
  },
74013
+ {
74014
+ id: "device-attention",
74015
+ family: "device-events",
74016
+ label: "Needs attention",
74017
+ kinds: ["device-attention-required", "device-attention-resolved"]
74018
+ },
73978
74019
  {
73979
74020
  id: "nodes",
73980
74021
  family: "system",
@@ -74035,6 +74076,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
74035
74076
  "alert-critical-resolved"
74036
74077
  ]
74037
74078
  },
74079
+ {
74080
+ id: "rule-health",
74081
+ family: "system",
74082
+ label: "Notification rules",
74083
+ kinds: ["rule-broken", "rule-repaired"]
74084
+ },
74038
74085
  {
74039
74086
  id: "alarm",
74040
74087
  family: "alarm",
@@ -74108,6 +74155,7 @@ var ALERT_EPISODE = [
74108
74155
  "alert-error",
74109
74156
  "alert-critical-resolved"
74110
74157
  ];
74158
+ var DEVICE_ATTENTION = ["device-attention-required", "device-attention-resolved"];
74111
74159
  var UPDATES = [
74112
74160
  "addon-update-available",
74113
74161
  "server-update-available",
@@ -74137,9 +74185,12 @@ var DEVICE_EVENTS = [
74137
74185
  "stream-online",
74138
74186
  "stream-offline",
74139
74187
  "detection-blind",
74188
+ "motion-noisy",
74189
+ "motion-calm",
74140
74190
  "recording-stalled",
74141
74191
  "recording-healthy",
74142
74192
  "recording-degraded",
74193
+ ...DEVICE_ATTENTION,
74143
74194
  ...ALARM
74144
74195
  ];
74145
74196
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -74307,7 +74358,13 @@ var STATE_SUMMARY_VARS = [
74307
74358
  [...RULE_TEXT],
74308
74359
  [...RULE_TEXT],
74309
74360
  [...RULE_TEXT],
74310
- ([...RULE_TEXT], [...ALERT_EPISODE]),
74361
+ [...RULE_TEXT],
74362
+ [...RULE_TEXT],
74363
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
74364
+ [...RULE_TEXT],
74365
+ [...RULE_TEXT],
74366
+ [...RULE_TEXT],
74367
+ [...RULE_TEXT],
74311
74368
  [...RULE_TEXT],
74312
74369
  [...RULE_TEXT],
74313
74370
  [...RULE_TEXT],
@@ -74325,11 +74382,11 @@ var STATE_SUMMARY_VARS = [
74325
74382
  [...RULE_TEXT],
74326
74383
  [...RULE_TEXT],
74327
74384
  [...RULE_TEXT],
74385
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
74328
74386
  ([...RULE_TEXT], [...ALERT_EPISODE]),
74387
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
74329
74388
  ([...RULE_TEXT], [...ALERT_EPISODE]),
74330
- ([...RULE_TEXT], [...ALERT_EPISODE]),
74331
- ([...RULE_TEXT], [...ALERT_EPISODE]),
74332
- ([...RULE_TEXT], [...ALERT_EPISODE]),
74389
+ ([...RULE_TEXT], [...DEVICE_ATTENTION, ...ALERT_EPISODE]),
74333
74390
  [...RULE_TEXT],
74334
74391
  [...RULE_TEXT],
74335
74392
  [...RULE_TEXT],
@@ -74350,6 +74407,125 @@ var STATE_SUMMARY_VARS = [
74350
74407
  [...RULE_TEXT],
74351
74408
  ...STATE_SUMMARY_VARS
74352
74409
  ];
74410
+ new Map([
74411
+ {
74412
+ id: "device-connectivity",
74413
+ family: "device-events",
74414
+ label: "Device connectivity (offline / back online)",
74415
+ bad: ["device-offline"],
74416
+ recovery: ["device-online"],
74417
+ snapshotLabel: "Devices offline now",
74418
+ snapshotSection: "device-state"
74419
+ },
74420
+ {
74421
+ id: "device-switch",
74422
+ family: "device-events",
74423
+ label: "Device switched off / back on",
74424
+ bad: ["device-disabled"],
74425
+ recovery: ["device-enabled"],
74426
+ snapshotLabel: "Devices switched off now",
74427
+ snapshotSection: "device-state"
74428
+ },
74429
+ {
74430
+ id: "stream-connectivity",
74431
+ family: "device-events",
74432
+ label: "Stream connectivity (offline / back online)",
74433
+ bad: ["stream-offline"],
74434
+ recovery: ["stream-online"],
74435
+ snapshotLabel: "Streams offline now",
74436
+ snapshotSection: "streams"
74437
+ },
74438
+ {
74439
+ id: "battery",
74440
+ family: "device-events",
74441
+ label: "Battery (low / back to normal)",
74442
+ bad: ["device-battery-low"],
74443
+ recovery: ["device-battery-normal"],
74444
+ snapshotLabel: "Batteries low now",
74445
+ snapshotSection: "battery"
74446
+ },
74447
+ {
74448
+ id: "consumables",
74449
+ family: "device-events",
74450
+ label: "Consumables (low / replaced)",
74451
+ bad: ["device-consumable-low"],
74452
+ recovery: ["device-consumable-normal"],
74453
+ snapshotLabel: "Consumables low now",
74454
+ snapshotSection: "consumables"
74455
+ },
74456
+ {
74457
+ id: "tanks",
74458
+ family: "device-events",
74459
+ label: "Tanks (low or full / back to normal)",
74460
+ bad: ["device-tank-low", "device-tank-full"],
74461
+ recovery: ["device-tank-normal"],
74462
+ snapshotLabel: "Tanks low or full now",
74463
+ snapshotSection: "tanks"
74464
+ },
74465
+ {
74466
+ id: "motion-noise",
74467
+ family: "device-events",
74468
+ label: "Motion without a subject (constant / calm again)",
74469
+ bad: ["motion-noisy"],
74470
+ recovery: ["motion-calm"],
74471
+ snapshotLabel: "Cameras with constant motion now",
74472
+ snapshotSection: null
74473
+ },
74474
+ {
74475
+ id: "recording-health",
74476
+ family: "device-events",
74477
+ label: "Recording health (stalled or degraded / recording again)",
74478
+ bad: ["recording-stalled", "recording-degraded"],
74479
+ recovery: ["recording-healthy"],
74480
+ snapshotLabel: "Recordings stalled now",
74481
+ snapshotSection: null
74482
+ },
74483
+ {
74484
+ id: "device-attention",
74485
+ family: "device-events",
74486
+ label: "Device needs attention (raised / resolved)",
74487
+ bad: ["device-attention-required"],
74488
+ recovery: ["device-attention-resolved"],
74489
+ snapshotLabel: "Devices needing attention now",
74490
+ snapshotSection: null
74491
+ },
74492
+ {
74493
+ id: "node-connectivity",
74494
+ family: "system",
74495
+ label: "Node connectivity (offline / back online)",
74496
+ bad: ["node-offline"],
74497
+ recovery: ["node-online"],
74498
+ snapshotLabel: "Nodes offline now",
74499
+ snapshotSection: "nodes"
74500
+ },
74501
+ {
74502
+ id: "storage-space",
74503
+ family: "system",
74504
+ label: "Storage space (low or critical / ok again)",
74505
+ bad: ["storage-location-low", "storage-location-critical"],
74506
+ recovery: ["storage-location-ok"],
74507
+ snapshotLabel: "Storage locations low now",
74508
+ snapshotSection: null
74509
+ },
74510
+ {
74511
+ id: "critical-alerts",
74512
+ family: "system",
74513
+ label: "Critical alerts (raised / resolved)",
74514
+ bad: ["alert-critical"],
74515
+ recovery: ["alert-critical-resolved"],
74516
+ snapshotLabel: "Critical alerts open now",
74517
+ snapshotSection: null
74518
+ },
74519
+ {
74520
+ id: "rule-health",
74521
+ family: "system",
74522
+ label: "Rule health (broken / repaired)",
74523
+ bad: ["rule-broken"],
74524
+ recovery: ["rule-repaired"],
74525
+ snapshotLabel: "Notification rules broken now",
74526
+ snapshotSection: null
74527
+ }
74528
+ ].flatMap((spec) => [...spec.bad, ...spec.recovery].map((kind) => [kind, spec])));
74353
74529
  new Set([
74354
74530
  "disarmed",
74355
74531
  "armed_home",