@camstack/addon-post-analysis 1.2.68 → 1.2.70

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.
@@ -11021,7 +11021,14 @@ var cameraStreamsCapability = {
11021
11021
  low: string().optional()
11022
11022
  }),
11023
11023
  lastChangedAt: number()
11024
- })
11024
+ }),
11025
+ /**
11026
+ * Runtime-state durability: **session** — a restored `slotStatuses: streaming` for a camera that has been dark for two hours is a lie the UI renders as truth.
11027
+ *
11028
+ * See `RuntimeStateDurability`. Enforced by
11029
+ * `scripts/check-runtime-state-durability.ts`.
11030
+ */
11031
+ durability: "session"
11025
11032
  };
11026
11033
  /** kebab-case cap name → camelCase router-map key. */
11027
11034
  function kebabToCamel(s) {
@@ -11608,6 +11615,13 @@ var deviceDiscoveryCapability = {
11608
11615
  kind: "poll"
11609
11616
  },
11610
11617
  runtimeState: DeviceDiscoveryStatusSchema.extend({ lastFetchedAt: number().int().nonnegative() }),
11618
+ /**
11619
+ * Runtime-state durability: **session** — 5.7 KB of scan output on the largest device, fully re-derivable by re-scanning.
11620
+ *
11621
+ * See `RuntimeStateDurability`. Enforced by
11622
+ * `scripts/check-runtime-state-durability.ts`.
11623
+ */
11624
+ durability: "session",
11611
11625
  methods: {
11612
11626
  /**
11613
11627
  * Snapshot of the current `discovered` list. Returns the
@@ -13432,11 +13446,33 @@ var NotificationFormatSchema = _enum([
13432
13446
  * Named by INTENT, never by glyph. "check" would tie the vocabulary to one
13433
13447
  * renderer's icon set; "acknowledge" survives an adapter that draws it
13434
13448
  * differently.
13449
+ *
13450
+ * ── A TOKEN IS NOT A WIRE VALUE ─────────────────────────────────────
13451
+ *
13452
+ * These names are for US. **No adapter may forward one verbatim.** Each maps
13453
+ * the whole set onto its own renderer's vocabulary through a
13454
+ * `Record<NotificationActionIcon, string>` — a Record, never a lookup with a
13455
+ * fallback, so adding a member here fails every adapter's build until someone
13456
+ * decides its glyph, which is the only place that decision can be made
13457
+ * honestly.
13458
+ *
13459
+ * This paragraph is the bug. Zentik declared `actionIcons: true` and passed
13460
+ * `disarm` straight through; iOS feeds that string to
13461
+ * `UNNotificationActionIcon(systemImageName:)`, `disarm` is not an SF Symbol,
13462
+ * and every snooze and alarm button arrived BLANK. A pass-through is not a
13463
+ * mapping, and "the field is documented" is not "the value renders".
13464
+ *
13465
+ * Adding a member is TRAIN-BOUND. The enum lives in the published
13466
+ * `@camstack/server` closure and the cap seam validates against the HUB's copy,
13467
+ * so an addon that emits a token the running hub does not know does not lose an
13468
+ * icon — its whole `send` fails Zod validation and the notification never
13469
+ * arrives. Never emit a new token from an addon before the train carrying it.
13435
13470
  */
13436
13471
  var NotificationActionIconSchema = _enum([
13437
13472
  "acknowledge",
13438
13473
  "dismiss",
13439
13474
  "silence",
13475
+ "snooze",
13440
13476
  "view",
13441
13477
  "play",
13442
13478
  "open",
@@ -13444,9 +13480,13 @@ var NotificationActionIconSchema = _enum([
13444
13480
  "lock",
13445
13481
  "unlock",
13446
13482
  "arm",
13483
+ "arm-home",
13484
+ "arm-away",
13485
+ "arm-night",
13447
13486
  "disarm",
13448
13487
  "light",
13449
- "alert"
13488
+ "alert",
13489
+ "camera"
13450
13490
  ]);
13451
13491
  /** A single tap-through action button. */
13452
13492
  var NotificationActionSchema = object({
@@ -13462,7 +13502,23 @@ var NotificationActionSchema = object({
13462
13502
  * else — see `notification-center/action-token.ts` for what that does and
13463
13503
  * does not buy.
13464
13504
  */
13465
- destructive: boolean().optional()
13505
+ destructive: boolean().optional(),
13506
+ /**
13507
+ * How the tap should REACH the url.
13508
+ *
13509
+ * `navigate` (absent, and every button authored before this field) opens it:
13510
+ * the phone leaves the notification and shows whatever the callback returns.
13511
+ * That is right for a button whose answer the operator wants to read.
13512
+ *
13513
+ * `background` fires it as a POST and stays put. It exists for the buttons
13514
+ * whose whole point is not to interrupt — "silence this for 30 minutes" is
13515
+ * an answer to the notification, and being thrown into a browser tab to
13516
+ * confirm it costs more attention than the notification did. A backend that
13517
+ * cannot do a background call renders it as an ordinary link (the adapters
13518
+ * fall back rather than dropping the button), so this is a preference, never
13519
+ * a requirement.
13520
+ */
13521
+ mode: _enum(["navigate", "background"]).optional()
13466
13522
  });
13467
13523
  /**
13468
13524
  * The canonical notification. `body` is the only hard field (Apprise model).
@@ -13648,6 +13704,29 @@ var MACRO_LABELS = [
13648
13704
  name: "Package"
13649
13705
  }
13650
13706
  ];
13707
+ /**
13708
+ * The class names a per-class COUNT can ever be keyed on — the macro ids, and
13709
+ * only those.
13710
+ *
13711
+ * `preserveOriginal: false` below is the whole reason this set exists: the
13712
+ * executor maps each raw COCO label onto its macro and DROPS everything else,
13713
+ * so a tracked detection's `className` is always one of {@link MACRO_LABELS}.
13714
+ * Any surface that indexes counts by class name — the ZoneAnalytics occupancy
13715
+ * snapshot's `byClass`, and therefore every occupancy rule — can match nothing
13716
+ * else. Derived from the catalog, never hand-listed, so a new macro joins it by
13717
+ * being declared once.
13718
+ *
13719
+ * Cost of not having it, 2026-08-12: the notification rule editor offered the
13720
+ * full taxonomy for an occupancy class (occupancy is the one condition that
13721
+ * does not go through the engine's macro-expanding `expandClassSelector`), two
13722
+ * live rules were authored on `car`, and both counters read 0 forever.
13723
+ */
13724
+ var DETECTION_MACRO_CLASSES = new Set(MACRO_LABELS.map((l) => l.id));
13725
+ /** True when `className` is a macro the detector can actually emit (and hence a
13726
+ * class a count can be keyed on) — see {@link DETECTION_MACRO_CLASSES}. */
13727
+ function isDetectionMacroClass(className) {
13728
+ return DETECTION_MACRO_CLASSES.has(className.trim().toLowerCase());
13729
+ }
13651
13730
  var COCO_TO_MACRO = {
13652
13731
  mapping: {
13653
13732
  person: "person",
@@ -14341,7 +14420,17 @@ var alarmPanelCapability = {
14341
14420
  * full slice; renders an arm button per `availableModes` entry and
14342
14421
  * a PIN field iff `requiresCode === true`.
14343
14422
  */
14344
- runtimeState: AlarmPanelStatusSchema
14423
+ runtimeState: AlarmPanelStatusSchema,
14424
+ /**
14425
+ * Runtime-state durability: **restored** — armed state is the one thing a panel must not lose across a restart.
14426
+ *
14427
+ * See `RuntimeStateDurability`. Enforced by
14428
+ * `scripts/check-runtime-state-durability.ts`.
14429
+ */
14430
+ durability: "restored",
14431
+ /** Clock fields: written, but excluded from the compare that decides
14432
+ * whether persisting is worth a SQLite commit. */
14433
+ volatileStateFields: ["lastChangedAt"]
14345
14434
  };
14346
14435
  /**
14347
14436
  * Shared geometry vocabulary for on-frame shape caps — privacy-mask,
@@ -14482,6 +14571,8 @@ var NcSystemEventKindSchema = _enum([
14482
14571
  "alarm-triggered",
14483
14572
  "alarm-armed",
14484
14573
  "alarm-disarmed",
14574
+ "alarm-arming",
14575
+ "alarm-arm-refused",
14485
14576
  "camera-online",
14486
14577
  "camera-offline",
14487
14578
  "camera-disabled",
@@ -14496,6 +14587,25 @@ var NC_LEGACY_SYSTEM_EVENT_KINDS = new Set([
14496
14587
  ]);
14497
14588
  NcSystemEventKindSchema.options.filter((kind) => !NC_LEGACY_SYSTEM_EVENT_KINDS.has(kind));
14498
14589
  /**
14590
+ * The panel's transitions, as ONE list.
14591
+ *
14592
+ * Named here rather than spelled out at each of the four sites that need them
14593
+ * (the emitter, the intake, the editor group, the combined-notification gate),
14594
+ * because a transition added to the enum and forgotten at one of them is an
14595
+ * alarm state nobody can be notified about. That is exactly what this list
14596
+ * failed to prevent while it held three: `alarm-arming` was the fourth.
14597
+ *
14598
+ * In LIFECYCLE order, which is the order an editor lists them in and the order
14599
+ * a person experiences them — not the order they were added.
14600
+ */
14601
+ var NC_ALARM_SYSTEM_EVENT_KINDS = [
14602
+ "alarm-arm-refused",
14603
+ "alarm-arming",
14604
+ "alarm-armed",
14605
+ "alarm-triggered",
14606
+ "alarm-disarmed"
14607
+ ];
14608
+ /**
14499
14609
  * One coherent system-event condition. `kinds` is the required opt-in safety
14500
14610
  * gate; the remaining lists are optional narrowing filters relevant to the
14501
14611
  * selected kinds.
@@ -14518,6 +14628,26 @@ var NcSystemEventConditionSchema = object({
14518
14628
  nodeIds: array(string().min(1)).min(1).optional(),
14519
14629
  packageNames: array(string().min(1)).min(1).optional()
14520
14630
  });
14631
+ /** Hard ceiling on a window (24h). A snooze that could not expire would be an
14632
+ * outage the operator asked for once and forgot. */
14633
+ var NC_SNOOZE_MAX_MINUTES = 1440;
14634
+ /**
14635
+ * The durations a notification offers when its rule does not say otherwise.
14636
+ *
14637
+ * MINUTES, and short ones: a snooze button is answered on a lock screen, and
14638
+ * the three choices that fit there are "the next few minutes", "the next half
14639
+ * hour" and "the next hour". Anything longer is a decision somebody sits down
14640
+ * to make, which is what the app's own snooze surface is for.
14641
+ *
14642
+ * Resolved in CODE (`snoozeChoices`), never as a Zod default — see
14643
+ * {@link NcRuleInputSchema.shape.snoozeOptions} for why the distinction is
14644
+ * load-bearing.
14645
+ */
14646
+ var NC_DEFAULT_SNOOZE_MINUTES = [
14647
+ 10,
14648
+ 30,
14649
+ 60
14650
+ ];
14521
14651
  /** Weekly schedule — OR of windows; absence on the rule = always active. */
14522
14652
  var NcScheduleSchema = object({
14523
14653
  windows: array(object({
@@ -14894,15 +15024,15 @@ var NcConditionsSchema = object({
14894
15024
  * (an `immediate` rule naming an `audio-*` class, one notification per
14895
15025
  * classified sample) stays exactly as it was for rules that already use it.
14896
15026
  *
14897
- * NOT in {@link NC_CONDITION_CATALOG} yet, and that is the sequencing rule
14898
- * rather than an oversight: the viewer mirrors the descriptor enums BY HAND
14899
- * (`camstack/src/data/notification-center.ts`, guarded by
14900
- * `scripts/check-viewer-condition-mirror.ts`) and its rule editor STRIPS the
15027
+ * In {@link NC_CONDITION_CATALOG} since P2, and the ORDER it got there is the
15028
+ * rule rather than an accident: the viewer mirrors the descriptor enums BY
15029
+ * HAND (`camstack/src/data/notification-center.ts`, guarded by
15030
+ * `scripts/check-viewer-condition-mirror.ts`) and its rule editor strips the
14901
15031
  * condition fields it does not know when a rule is saved from the phone.
14902
15032
  * Publishing an editor for a condition the app cannot round-trip is how an
14903
- * operator loses a rule's conditions by opening it — so the descriptor, the
14904
- * admin widget and the viewer mirror land together (P2 + P3), and only then
14905
- * does an audio rule become authorable.
15033
+ * operator loses a rule's conditions by opening it — so the viewer mirror
15034
+ * (P3, shipped) went FIRST, and the descriptor an editor renders from
15035
+ * follows here.
14906
15036
  */
14907
15037
  audio: NcAudioConditionSchema.optional()
14908
15038
  });
@@ -15138,6 +15268,30 @@ var NcRuleInputSchema = object({
15138
15268
  */
15139
15269
  snoozeAllowGlobal: boolean().optional(),
15140
15270
  /**
15271
+ * The snooze durations THIS rule's notification offers as buttons, in
15272
+ * minutes.
15273
+ *
15274
+ * Three states, and all three are distinct — which is exactly why this is
15275
+ * `.optional()` and never `.default()`. A Zod default does not run on the
15276
+ * addon cap path (three production failures in one day), so a schema default
15277
+ * would collapse the first two:
15278
+ *
15279
+ * | value | meaning |
15280
+ * | --- | --- |
15281
+ * | absent | the operator never said ⇒ {@link NC_DEFAULT_SNOOZE_MINUTES} |
15282
+ * | `[]` | **no snooze buttons on this rule** — the explicit override |
15283
+ * | a list | these choices, de-duplicated and sorted, at most four |
15284
+ *
15285
+ * `.max(4)` because the notifier's own action budget is small (ntfy allows
15286
+ * three buttons in total) and a rule that spent it all on snooze choices
15287
+ * would push its own tap-through actions off the notification.
15288
+ *
15289
+ * An empty list is NOT an alarm exemption: a rule the alarm is about, or
15290
+ * that arms the panel, is exempt automatically and cannot be silenced by a
15291
+ * window from anywhere (D133).
15292
+ */
15293
+ snoozeOptions: array(number().int().min(1).max(NC_SNOOZE_MAX_MINUTES)).max(4).optional(),
15294
+ /**
15141
15295
  * Devices this rule ACTUATES — arm the alarm, open a gate, turn on a light.
15142
15296
  *
15143
15297
  * This is what makes the rule set the alarm's trigger set without the alarm
@@ -15237,6 +15391,7 @@ var NcConditionDescriptorSchema = object({
15237
15391
  "device",
15238
15392
  "package",
15239
15393
  "occupancy",
15394
+ "audio",
15240
15395
  "system"
15241
15396
  ]),
15242
15397
  label: string(),
@@ -15255,6 +15410,7 @@ var NcConditionDescriptorSchema = object({
15255
15410
  "crossingSelect",
15256
15411
  "polygonDraw",
15257
15412
  "occupancy",
15413
+ "audio",
15258
15414
  "deviceState",
15259
15415
  "systemEvent"
15260
15416
  ]),
@@ -15345,13 +15501,17 @@ var NC_CONDITION_CATALOG = [
15345
15501
  label: "Server update available"
15346
15502
  },
15347
15503
  {
15348
- value: "alarm-triggered",
15349
- label: "Alarm triggered"
15504
+ value: "alarm-arming",
15505
+ label: "Alarm arming (exit delay)"
15350
15506
  },
15351
15507
  {
15352
15508
  value: "alarm-armed",
15353
15509
  label: "Alarm armed"
15354
15510
  },
15511
+ {
15512
+ value: "alarm-triggered",
15513
+ label: "Alarm triggered"
15514
+ },
15355
15515
  {
15356
15516
  value: "alarm-disarmed",
15357
15517
  label: "Alarm disarmed"
@@ -15652,6 +15812,16 @@ var NC_CONDITION_CATALOG = [
15652
15812
  phase: "P1",
15653
15813
  description: "ZoneAnalytics occupancy edge (optionally zone/class-scoped): count crosses the threshold and holds for sustainSeconds. Fail-closed on a missing snapshot."
15654
15814
  },
15815
+ {
15816
+ id: "audio",
15817
+ group: "audio",
15818
+ label: "Sound",
15819
+ valueType: "audio",
15820
+ operator: "anyOf",
15821
+ appliesTo: ["immediate"],
15822
+ phase: "P2",
15823
+ description: "Fires when at least hitPercent% of the samples in a samplingSeconds window are hits — a hit clears the dBFS floor AND carries one of the chosen sounds. Both filters are optional and independent, but naming NEITHER never matches: every sample would be a hit, so the engine refuses rather than notifying on silence. dBFS is negative-going (0 = full scale, -96 = silence)."
15824
+ },
15655
15825
  {
15656
15826
  id: "customZones",
15657
15827
  group: "zones",
@@ -15796,7 +15966,20 @@ var NcSnoozeInputSchema = object({
15796
15966
  ruleId: string().optional(),
15797
15967
  /** Required when `scope: 'device'`. */
15798
15968
  deviceId: number().int().optional(),
15799
- durationMinutes: number().int().min(1).max(1440),
15969
+ /**
15970
+ * Narrow the window to these subject classes — "the cat, not the person".
15971
+ *
15972
+ * ORTHOGONAL to `scope`, deliberately, and absent means EVERY class: that is
15973
+ * what every window authored before this field meant, so no persisted row
15974
+ * changes meaning and no client has to learn anything to keep working.
15975
+ *
15976
+ * It is what makes the window's real key `(deviceId, classes[])` and lets it
15977
+ * cross rules (D133): the operator points at a camera and a kind of thing,
15978
+ * not at whichever of their four rules happened to produce the notification
15979
+ * they are dismissing.
15980
+ */
15981
+ classes: array(string().min(1)).min(1).optional(),
15982
+ durationMinutes: number().int().min(1).max(NC_SNOOZE_MAX_MINUTES),
15800
15983
  /**
15801
15984
  * Silence this for EVERY recipient, not just the caller. Permission is
15802
15985
  * checked server-side (the rule's `snoozeAllowGlobal`, or admin for the
@@ -15821,6 +16004,10 @@ var NcSnoozeSchema = object({
15821
16004
  scope: NcSnoozeScopeSchema,
15822
16005
  ruleId: string().optional(),
15823
16006
  deviceId: number().int().optional(),
16007
+ /** Subject classes this window covers. ABSENT = every class — see
16008
+ * {@link NcSnoozeInputSchema.shape.classes}. Lives in the JSON blob and has
16009
+ * no SQLite column: nothing queries a window by class. */
16010
+ classes: array(string().min(1)).min(1).optional(),
15824
16011
  startedAt: number(),
15825
16012
  /** Exclusive: at exactly this instant the snooze is over. Expiry is a
15826
16013
  * COMPARISON, not a job — no sweeper can leave the operator silenced. */
@@ -18417,7 +18604,14 @@ var zonesCapability = {
18417
18604
  * handle. Slice shape is `{ zones: Zone[] }` so future extensions
18418
18605
  * (e.g. zone groupings) can sit alongside the polygon list.
18419
18606
  */
18420
- runtimeState: object({ zones: array(ZoneSchema).readonly() })
18607
+ runtimeState: object({ zones: array(ZoneSchema).readonly() }),
18608
+ /**
18609
+ * Runtime-state durability: **restored** — written only on operator mutation, so a camera that never had one has nothing to re-derive from. This is the slice `zone-mirror-hydration.ts` exists to paper over.
18610
+ *
18611
+ * See `RuntimeStateDurability`. Enforced by
18612
+ * `scripts/check-runtime-state-durability.ts`.
18613
+ */
18614
+ durability: "restored"
18421
18615
  };
18422
18616
  /**
18423
18617
  * A bounding box in NORMALIZED [0,1] frame coordinates for `getNativeCrop`. The
@@ -18587,6 +18781,22 @@ var detectionFpsField = {
18587
18781
  default: 10,
18588
18782
  step: 1
18589
18783
  };
18784
+ /**
18785
+ * The occupancy re-check interval. DEFAULT 300 s (2026-08-13 — was 30 s).
18786
+ *
18787
+ * The recheck is now on by default (a parked car is invisible to occupancy
18788
+ * rules until the stationary registry has been rebuilt by motion, which after a
18789
+ * restart may be never on a quiet camera). Each cycle re-subscribes a detection
18790
+ * session — an RTSP re-dial — so the switch is only affordable at a WIDE
18791
+ * interval: 300 s is ~12 re-dials an hour per camera, against 120 at the old
18792
+ * 30 s. A parked car is therefore counted within 5 minutes of a restart.
18793
+ *
18794
+ * Why not wider: `max` is 300 and raising it is TRAIN-BOUND, not addon-bound —
18795
+ * the host validates `attachCamera` against ITS copy of this schema, so a
18796
+ * runner asked for 600 would be rejected by the hub until a `@camstack/server`
18797
+ * carrying the wider bound is installed everywhere. 300 is the widest value
18798
+ * that ships with an addon deploy.
18799
+ */
18590
18800
  var occupancyRecheckSecField = {
18591
18801
  min: 0,
18592
18802
  max: 300,
@@ -18788,15 +18998,21 @@ var RunnerCameraConfigSchema = object({
18788
18998
  */
18789
18999
  onboardMotionDrivesAnalyzer: boolean().default(true),
18790
19000
  /**
18791
- * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
18792
- * never arms the periodic recheck timer, regardless of `occupancyRecheckSec` —
18793
- * this is off by default because the recheck re-subscribes a detection session
18794
- * every N seconds while `watching`, a major source of pull-decoder re-dial
18795
- * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
19001
+ * Master toggle for the occupancy re-check. When `false` the runner never arms
19002
+ * the periodic recheck timer, regardless of `occupancyRecheckSec`; the
18796
19003
  * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
18797
19004
  * (and only render) when this is enabled.
18798
- */
18799
- occupancyRecheckEnabled: boolean().default(false),
19005
+ *
19006
+ * DEFAULT `true` since 2026-08-13 (was `false`). It was off because the
19007
+ * recheck re-subscribes a detection session every N seconds while `watching`
19008
+ * — each cycle creates+tears a session ⇒ an RTSP re-dial ⇒ latency, a major
19009
+ * pull-decoder churn source. What that bought was a blind spot: a STATIONARY
19010
+ * object is counted only while the stationary registry holds it, and the
19011
+ * registry rebuilds from motion, so after a restart a parked car was invisible
19012
+ * to every occupancy rule until something moved in front of it. The churn is
19013
+ * now paid on the interval instead — see `occupancyRecheckSecField`.
19014
+ */
19015
+ occupancyRecheckEnabled: boolean().default(true),
18800
19016
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
18801
19017
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
18802
19018
  /**
@@ -21260,7 +21476,17 @@ var airQualitySensorCapability = {
21260
21476
  schema: AirQualitySensorStatusSchema,
21261
21477
  kind: "push"
21262
21478
  },
21263
- runtimeState: AirQualitySensorStatusSchema
21479
+ runtimeState: AirQualitySensorStatusSchema,
21480
+ /**
21481
+ * Runtime-state durability: **restored** — as `numeric-sensor`.
21482
+ *
21483
+ * See `RuntimeStateDurability`. Enforced by
21484
+ * `scripts/check-runtime-state-durability.ts`.
21485
+ */
21486
+ durability: "restored",
21487
+ /** Clock fields: written, but excluded from the compare that decides
21488
+ * whether persisting is worth a SQLite commit. */
21489
+ volatileStateFields: ["lastFetchedAt"]
21264
21490
  };
21265
21491
  /**
21266
21492
  * Ambient illuminance reading in lux. Drives Home Assistant `sensor`
@@ -21292,7 +21518,17 @@ var ambientLightSensorCapability = {
21292
21518
  schema: AmbientLightSensorStatusSchema,
21293
21519
  kind: "push"
21294
21520
  },
21295
- runtimeState: AmbientLightSensorStatusSchema
21521
+ runtimeState: AmbientLightSensorStatusSchema,
21522
+ /**
21523
+ * Runtime-state durability: **restored** — as `numeric-sensor`.
21524
+ *
21525
+ * See `RuntimeStateDurability`. Enforced by
21526
+ * `scripts/check-runtime-state-durability.ts`.
21527
+ */
21528
+ durability: "restored",
21529
+ /** Clock fields: written, but excluded from the compare that decides
21530
+ * whether persisting is worth a SQLite commit. */
21531
+ volatileStateFields: ["lastFetchedAt"]
21296
21532
  };
21297
21533
  /**
21298
21534
  * Per-class audio metrics aggregated over a sliding window.
@@ -21410,7 +21646,14 @@ var audioMetricsCapability = {
21410
21646
  }), AudioMetricsHistorySchema)
21411
21647
  },
21412
21648
  /** Reactive runtime-state mirror — live `device.state.audioMetrics.value`. */
21413
- runtimeState: AudioMetricsSnapshotSchema
21649
+ runtimeState: AudioMetricsSnapshotSchema,
21650
+ /**
21651
+ * Runtime-state durability: **session** — 1 Hz per camera at the mirror and ~63 % of the fleet's whole runtime-state write rate. `avgDbfs` is a rolling 60 s mean that genuinely moves every second, so no equality fix reclaims it — and a two-hour-old dB reading rendered as current is worse than no reading.
21652
+ *
21653
+ * See `RuntimeStateDurability`. Enforced by
21654
+ * `scripts/check-runtime-state-durability.ts`.
21655
+ */
21656
+ durability: "session"
21414
21657
  };
21415
21658
  /**
21416
21659
  * Automation-control cap. Models HA `automation.*` entities on
@@ -21472,7 +21715,14 @@ var automationControlCapability = {
21472
21715
  * reads `enabled` (toggle) + `isRunning` (spinner) + `lastError`
21473
21716
  * (badge) directly.
21474
21717
  */
21475
- runtimeState: AutomationControlStatusSchema
21718
+ runtimeState: AutomationControlStatusSchema,
21719
+ /**
21720
+ * Runtime-state durability: **session** — the authority for an automation being enabled is the automation store; a restored `isRunning` would be a lie. D62: one authority per switch.
21721
+ *
21722
+ * See `RuntimeStateDurability`. Enforced by
21723
+ * `scripts/check-runtime-state-durability.ts`.
21724
+ */
21725
+ durability: "session"
21476
21726
  };
21477
21727
  /**
21478
21728
  * Battery status snapshot. Emitted by providers whose device is
@@ -21578,7 +21828,17 @@ onStatusChanged: { data: object({
21578
21828
  * via `device.runtimeState.getCapState('battery')` regardless of
21579
21829
  * the underlying driver.
21580
21830
  */
21581
- runtimeState: BatteryStatusSchema
21831
+ runtimeState: BatteryStatusSchema,
21832
+ /**
21833
+ * Runtime-state durability: **restored** — a sleeping battery camera may not report for hours; the restored percentage is the only thing the UI and the sleep gate have. Zero churn once `lastUpdated` is excluded — 526 writes, 0 value changes, in 25 minutes.
21834
+ *
21835
+ * See `RuntimeStateDurability`. Enforced by
21836
+ * `scripts/check-runtime-state-durability.ts`.
21837
+ */
21838
+ durability: "restored",
21839
+ /** Clock fields: written, but excluded from the compare that decides
21840
+ * whether persisting is worth a SQLite commit. */
21841
+ volatileStateFields: ["lastUpdated"]
21582
21842
  };
21583
21843
  /**
21584
21844
  * Generic boolean sensor — last-resort fallback when no domain-
@@ -21607,7 +21867,17 @@ var binaryCapability = {
21607
21867
  schema: BinaryStatusSchema,
21608
21868
  kind: "push"
21609
21869
  },
21610
- runtimeState: BinaryStatusSchema
21870
+ runtimeState: BinaryStatusSchema,
21871
+ /**
21872
+ * Runtime-state durability: **restored** — transition-driven sensor state; the restored value gives the boot comparison.
21873
+ *
21874
+ * See `RuntimeStateDurability`. Enforced by
21875
+ * `scripts/check-runtime-state-durability.ts`.
21876
+ */
21877
+ durability: "restored",
21878
+ /** Clock fields: written, but excluded from the compare that decides
21879
+ * whether persisting is worth a SQLite commit. */
21880
+ volatileStateFields: ["lastChangedAt"]
21611
21881
  };
21612
21882
  /**
21613
21883
  * Dimmable-light brightness control. Co-exists with `switch` on the
@@ -21660,7 +21930,14 @@ onBrightnessChanged: { data: object({
21660
21930
  * by the kernel. Read via `device.state.brightness.value` so UI
21661
21931
  * sliders surface the current level without polling the provider.
21662
21932
  */
21663
- runtimeState: BrightnessStatusSchema
21933
+ runtimeState: BrightnessStatusSchema,
21934
+ /**
21935
+ * Runtime-state durability: **session** — live lamp state, re-published by the provider on connect.
21936
+ *
21937
+ * See `RuntimeStateDurability`. Enforced by
21938
+ * `scripts/check-runtime-state-durability.ts`.
21939
+ */
21940
+ durability: "session"
21664
21941
  };
21665
21942
  DeviceType.Button, method(object({ deviceId: number().int().nonnegative() }), _void(), {
21666
21943
  kind: "mutation",
@@ -21748,7 +22025,17 @@ var carbonMonoxideCapability = {
21748
22025
  schema: CarbonMonoxideStatusSchema,
21749
22026
  kind: "push"
21750
22027
  },
21751
- runtimeState: CarbonMonoxideStatusSchema
22028
+ runtimeState: CarbonMonoxideStatusSchema,
22029
+ /**
22030
+ * Runtime-state durability: **restored** — as `smoke`.
22031
+ *
22032
+ * See `RuntimeStateDurability`. Enforced by
22033
+ * `scripts/check-runtime-state-durability.ts`.
22034
+ */
22035
+ durability: "restored",
22036
+ /** Clock fields: written, but excluded from the compare that decides
22037
+ * whether persisting is worth a SQLite commit. */
22038
+ volatileStateFields: ["lastChangedAt"]
21752
22039
  };
21753
22040
  /**
21754
22041
  * HVAC / climate control cap. Models the full surface of a HA
@@ -21908,7 +22195,14 @@ var climateControlCapability = {
21908
22195
  * the full slice via `device.state.climate-control.value` and refresh
21909
22196
  * on every push without re-querying the provider.
21910
22197
  */
21911
- runtimeState: ClimateControlStatusSchema
22198
+ runtimeState: ClimateControlStatusSchema,
22199
+ /**
22200
+ * Runtime-state durability: **session** — as `brightness`; `currentTemp` moves continuously and is re-published on connect.
22201
+ *
22202
+ * See `RuntimeStateDurability`. Enforced by
22203
+ * `scripts/check-runtime-state-durability.ts`.
22204
+ */
22205
+ durability: "session"
21912
22206
  };
21913
22207
  /**
21914
22208
  * Color-light cap. Coexists with `switch` (on/off) and `brightness`
@@ -22018,7 +22312,14 @@ onColorChanged: { data: object({
22018
22312
  * kernel. Read via `device.state.color.value` so UI pickers surface
22019
22313
  * the current chromaticity without polling the provider.
22020
22314
  */
22021
- runtimeState: ColorStatusSchema
22315
+ runtimeState: ColorStatusSchema,
22316
+ /**
22317
+ * Runtime-state durability: **session** — as `brightness`.
22318
+ *
22319
+ * See `RuntimeStateDurability`. Enforced by
22320
+ * `scripts/check-runtime-state-durability.ts`.
22321
+ */
22322
+ durability: "session"
22022
22323
  };
22023
22324
  var ConnectionTestOutcomeSchema = discriminatedUnion("outcome", [
22024
22325
  object({
@@ -22076,7 +22377,17 @@ var connectivityCapability = {
22076
22377
  schema: ConnectivityStatusSchema,
22077
22378
  kind: "push"
22078
22379
  },
22079
- runtimeState: ConnectivityStatusSchema
22380
+ runtimeState: ConnectivityStatusSchema,
22381
+ /**
22382
+ * Runtime-state durability: **restored** — same shape and same argument as `device-status`, for links rather than devices.
22383
+ *
22384
+ * See `RuntimeStateDurability`. Enforced by
22385
+ * `scripts/check-runtime-state-durability.ts`.
22386
+ */
22387
+ durability: "restored",
22388
+ /** Clock fields: written, but excluded from the compare that decides
22389
+ * whether persisting is worth a SQLite commit. */
22390
+ volatileStateFields: ["lastChangedAt"]
22080
22391
  };
22081
22392
  /**
22082
22393
  * Generic device-consumables capability — surfaces a device's
@@ -22158,7 +22469,14 @@ reset: method(object({
22158
22469
  }
22159
22470
  }
22160
22471
  },
22161
- runtimeState: ConsumablesStatusSchema.extend({ lastFetchedAt: number() })
22472
+ runtimeState: ConsumablesStatusSchema.extend({ lastFetchedAt: number() }),
22473
+ /**
22474
+ * Runtime-state durability: **session** — the authority is the appliance; the provider re-reads the whole item array on connect.
22475
+ *
22476
+ * See `RuntimeStateDurability`. Enforced by
22477
+ * `scripts/check-runtime-state-durability.ts`.
22478
+ */
22479
+ durability: "session"
22162
22480
  };
22163
22481
  /**
22164
22482
  * Door / window / opening / garage / valve contact sensor. Boolean
@@ -22189,7 +22507,17 @@ var contactCapability = {
22189
22507
  schema: ContactStatusSchema,
22190
22508
  kind: "push"
22191
22509
  },
22192
- runtimeState: ContactStatusSchema
22510
+ runtimeState: ContactStatusSchema,
22511
+ /**
22512
+ * Runtime-state durability: **restored** — a door left open across a restart must still read open.
22513
+ *
22514
+ * See `RuntimeStateDurability`. Enforced by
22515
+ * `scripts/check-runtime-state-durability.ts`.
22516
+ */
22517
+ durability: "restored",
22518
+ /** Clock fields: written, but excluded from the compare that decides
22519
+ * whether persisting is worth a SQLite commit. */
22520
+ volatileStateFields: ["lastChangedAt"]
22193
22521
  };
22194
22522
  /**
22195
22523
  * Status slice — flat object (the framework's `runtimeState` contract
@@ -22295,7 +22623,14 @@ var controlCapability = {
22295
22623
  * dropdown / text field / date picker) read the slice's discriminant
22296
22624
  * and value directly without polling the provider.
22297
22625
  */
22298
- runtimeState: ControlStatusSchema
22626
+ runtimeState: ControlStatusSchema,
22627
+ /**
22628
+ * Runtime-state durability: **session** — a generic control mirrors an external entity that re-publishes on connect; the options array is re-derived with it.
22629
+ *
22630
+ * See `RuntimeStateDurability`. Enforced by
22631
+ * `scripts/check-runtime-state-durability.ts`.
22632
+ */
22633
+ durability: "session"
22299
22634
  };
22300
22635
  var CoverStatusSchema = object({
22301
22636
  /** Lifecycle state of the cover. */
@@ -22356,7 +22691,17 @@ var coverCapability = {
22356
22691
  * Runtime-state slice — mirrored by the kernel. UI controls watch
22357
22692
  * the slice for live position changes during a move.
22358
22693
  */
22359
- runtimeState: CoverStatusSchema
22694
+ runtimeState: CoverStatusSchema,
22695
+ /**
22696
+ * Runtime-state durability: **restored** — position survives a restart on the device; the mirror should agree at boot rather than read blank.
22697
+ *
22698
+ * See `RuntimeStateDurability`. Enforced by
22699
+ * `scripts/check-runtime-state-durability.ts`.
22700
+ */
22701
+ durability: "restored",
22702
+ /** Clock fields: written, but excluded from the compare that decides
22703
+ * whether persisting is worth a SQLite commit. */
22704
+ volatileStateFields: ["lastChangedAt"]
22360
22705
  };
22361
22706
  /**
22362
22707
  * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
@@ -22450,7 +22795,17 @@ var dayNightCapability = {
22450
22795
  schema: DayNightStatusSchema,
22451
22796
  kind: "poll"
22452
22797
  },
22453
- runtimeState: DayNightStatusSchema
22798
+ runtimeState: DayNightStatusSchema,
22799
+ /**
22800
+ * Runtime-state durability: **restored** — operator-set IR-cut behaviour; mutation-driven.
22801
+ *
22802
+ * See `RuntimeStateDurability`. Enforced by
22803
+ * `scripts/check-runtime-state-durability.ts`.
22804
+ */
22805
+ durability: "restored",
22806
+ /** Clock fields: written, but excluded from the compare that decides
22807
+ * whether persisting is worth a SQLite commit. */
22808
+ volatileStateFields: ["lastFetchedAt"]
22454
22809
  };
22455
22810
  /**
22456
22811
  * Generic device-level status snapshot. Auto-registered by `BaseDevice`
@@ -22497,7 +22852,17 @@ onStatusChanged: { data: object({
22497
22852
  schema: DeviceStatusSchema,
22498
22853
  kind: "push"
22499
22854
  },
22500
- runtimeState: DeviceStatusSchema
22855
+ runtimeState: DeviceStatusSchema,
22856
+ /**
22857
+ * Runtime-state durability: **restored** — the previous observation is what makes the first reading after a restart a COMPARISON instead of a phantom transition (D130). 32 real flips across 16 devices in 25 min — the busiest slice in the cold half.
22858
+ *
22859
+ * See `RuntimeStateDurability`. Enforced by
22860
+ * `scripts/check-runtime-state-durability.ts`.
22861
+ */
22862
+ durability: "restored",
22863
+ /** Clock fields: written, but excluded from the compare that decides
22864
+ * whether persisting is worth a SQLite commit. */
22865
+ volatileStateFields: ["lastChangedAt"]
22501
22866
  };
22502
22867
  /**
22503
22868
  * Doorbell button cap. Two kinds of providers coexist behind this cap
@@ -22559,7 +22924,14 @@ onPressed: { data: DoorbellPressEventSchema } },
22559
22924
  * `device.state.doorbell.value`. UIs can show "last ring 5m ago"
22560
22925
  * without subscribing.
22561
22926
  */
22562
- runtimeState: DoorbellStatusSchema
22927
+ runtimeState: DoorbellStatusSchema,
22928
+ /**
22929
+ * Runtime-state durability: **restored** — a monotonic accumulator: the slice IS the record. `lastPressedAt` is content here, not a clock, so it is deliberately NOT volatile.
22930
+ *
22931
+ * See `RuntimeStateDurability`. Enforced by
22932
+ * `scripts/check-runtime-state-durability.ts`.
22933
+ */
22934
+ durability: "restored"
22563
22935
  };
22564
22936
  /**
22565
22937
  * Enum-state sensor — a string value picked from a finite option set.
@@ -22599,7 +22971,17 @@ var enumSensorCapability = {
22599
22971
  schema: EnumSensorStatusSchema,
22600
22972
  kind: "push"
22601
22973
  },
22602
- runtimeState: EnumSensorStatusSchema
22974
+ runtimeState: EnumSensorStatusSchema,
22975
+ /**
22976
+ * Runtime-state durability: **restored** — as `numeric-sensor`; 80 devices.
22977
+ *
22978
+ * See `RuntimeStateDurability`. Enforced by
22979
+ * `scripts/check-runtime-state-durability.ts`.
22980
+ */
22981
+ durability: "restored",
22982
+ /** Clock fields: written, but excluded from the compare that decides
22983
+ * whether persisting is worth a SQLite commit. */
22984
+ volatileStateFields: ["lastFetchedAt"]
22603
22985
  };
22604
22986
  /**
22605
22987
  * Generic stateless event emitter. Installed on a `DeviceType.EventEmitter`
@@ -22635,7 +23017,14 @@ var eventEmitterCapability = {
22635
23017
  schema: EventEmitterStatusSchema,
22636
23018
  kind: "push"
22637
23019
  },
22638
- runtimeState: EventEmitterStatusSchema
23020
+ runtimeState: EventEmitterStatusSchema,
23021
+ /**
23022
+ * Runtime-state durability: **session** — `eventCountSinceStart` names its own scope.
23023
+ *
23024
+ * See `RuntimeStateDurability`. Enforced by
23025
+ * `scripts/check-runtime-state-durability.ts`.
23026
+ */
23027
+ durability: "session"
22639
23028
  };
22640
23029
  var EventItemSchema = object({
22641
23030
  id: string(),
@@ -22942,7 +23331,14 @@ var fanControlCapability = {
22942
23331
  * Runtime-state slice — mirrored by the kernel. UI fan speed
22943
23332
  * sliders read `percentage` for live updates.
22944
23333
  */
22945
- runtimeState: FanControlStatusSchema
23334
+ runtimeState: FanControlStatusSchema,
23335
+ /**
23336
+ * Runtime-state durability: **session** — as `brightness`.
23337
+ *
23338
+ * See `RuntimeStateDurability`. Enforced by
23339
+ * `scripts/check-runtime-state-durability.ts`.
23340
+ */
23341
+ durability: "session"
22946
23342
  };
22947
23343
  /**
22948
23344
  * Per-device feature/identity probe slice. Holds the runtime-resolved
@@ -23018,7 +23414,14 @@ onProbeChanged: { data: object({
23018
23414
  schema: FeatureProbeStatusSchema,
23019
23415
  kind: "push"
23020
23416
  },
23021
- runtimeState: FeatureProbeStatusSchema
23417
+ runtimeState: FeatureProbeStatusSchema,
23418
+ /**
23419
+ * Runtime-state durability: **session** — per-session by definition — `lastProbedAt` means "this worker completed a probe THIS session", which is why the mirror seed already blanks it. Persisting it only creates something to blank.
23420
+ *
23421
+ * See `RuntimeStateDurability`. Enforced by
23422
+ * `scripts/check-runtime-state-durability.ts`.
23423
+ */
23424
+ durability: "session"
23022
23425
  };
23023
23426
  /**
23024
23427
  * Water leak / moisture sensor. Boolean "is liquid currently
@@ -23045,7 +23448,17 @@ var floodCapability = {
23045
23448
  schema: FloodStatusSchema,
23046
23449
  kind: "push"
23047
23450
  },
23048
- runtimeState: FloodStatusSchema
23451
+ runtimeState: FloodStatusSchema,
23452
+ /**
23453
+ * Runtime-state durability: **restored** — as `smoke`.
23454
+ *
23455
+ * See `RuntimeStateDurability`. Enforced by
23456
+ * `scripts/check-runtime-state-durability.ts`.
23457
+ */
23458
+ durability: "restored",
23459
+ /** Clock fields: written, but excluded from the compare that decides
23460
+ * whether persisting is worth a SQLite commit. */
23461
+ volatileStateFields: ["lastChangedAt"]
23049
23462
  };
23050
23463
  /**
23051
23464
  * Combustible-gas (LPG / methane / hydrogen) alarm sensor. Drives
@@ -23068,7 +23481,17 @@ var gasCapability = {
23068
23481
  schema: GasStatusSchema,
23069
23482
  kind: "push"
23070
23483
  },
23071
- runtimeState: GasStatusSchema
23484
+ runtimeState: GasStatusSchema,
23485
+ /**
23486
+ * Runtime-state durability: **restored** — as `smoke`.
23487
+ *
23488
+ * See `RuntimeStateDurability`. Enforced by
23489
+ * `scripts/check-runtime-state-durability.ts`.
23490
+ */
23491
+ durability: "restored",
23492
+ /** Clock fields: written, but excluded from the compare that decides
23493
+ * whether persisting is worth a SQLite commit. */
23494
+ volatileStateFields: ["lastChangedAt"]
23072
23495
  };
23073
23496
  /**
23074
23497
  * Humidifier / dehumidifier cap. Models HA `humidifier.*` entities —
@@ -23144,7 +23567,14 @@ var humidifierCapability = {
23144
23567
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
23145
23568
  * slice for live humidity / mode changes.
23146
23569
  */
23147
- runtimeState: HumidifierStatusSchema
23570
+ runtimeState: HumidifierStatusSchema,
23571
+ /**
23572
+ * Runtime-state durability: **session** — as `climate-control`.
23573
+ *
23574
+ * See `RuntimeStateDurability`. Enforced by
23575
+ * `scripts/check-runtime-state-durability.ts`.
23576
+ */
23577
+ durability: "session"
23148
23578
  };
23149
23579
  /**
23150
23580
  * Single-metric humidity reading. Drives Home Assistant `sensor`
@@ -23180,7 +23610,17 @@ var humiditySensorCapability = {
23180
23610
  schema: HumiditySensorStatusSchema,
23181
23611
  kind: "push"
23182
23612
  },
23183
- runtimeState: HumiditySensorStatusSchema
23613
+ runtimeState: HumiditySensorStatusSchema,
23614
+ /**
23615
+ * Runtime-state durability: **restored** — as `numeric-sensor` (67 of 75 writes were the clock alone).
23616
+ *
23617
+ * See `RuntimeStateDurability`. Enforced by
23618
+ * `scripts/check-runtime-state-durability.ts`.
23619
+ */
23620
+ durability: "restored",
23621
+ /** Clock fields: written, but excluded from the compare that decides
23622
+ * whether persisting is worth a SQLite commit. */
23623
+ volatileStateFields: ["lastFetchedAt"]
23184
23624
  };
23185
23625
  /**
23186
23626
  * Image display cap. Models a single still image exposed by an integration —
@@ -23218,7 +23658,14 @@ var imageCapability = {
23218
23658
  * Runtime-state slice — mirrored by the kernel. The UI reads `url`
23219
23659
  * directly and renders the still image.
23220
23660
  */
23221
- runtimeState: ImageStatusSchema
23661
+ runtimeState: ImageStatusSchema,
23662
+ /**
23663
+ * Runtime-state durability: **session** — a snapshot URL is a session-scoped handle; a restored one points at nothing.
23664
+ *
23665
+ * See `RuntimeStateDurability`. Enforced by
23666
+ * `scripts/check-runtime-state-durability.ts`.
23667
+ */
23668
+ durability: "session"
23222
23669
  };
23223
23670
  /**
23224
23671
  * Vendor-neutral image / picture-adjustment cap — the per-camera config
@@ -23367,7 +23814,17 @@ var imageSettingsCapability = {
23367
23814
  schema: ImageSettingsStatusSchema,
23368
23815
  kind: "poll"
23369
23816
  },
23370
- runtimeState: ImageSettingsStatusSchema
23817
+ runtimeState: ImageSettingsStatusSchema,
23818
+ /**
23819
+ * Runtime-state durability: **restored** — operator-set camera imaging; mutation-driven.
23820
+ *
23821
+ * See `RuntimeStateDurability`. Enforced by
23822
+ * `scripts/check-runtime-state-durability.ts`.
23823
+ */
23824
+ durability: "restored",
23825
+ /** Clock fields: written, but excluded from the compare that decides
23826
+ * whether persisting is worth a SQLite commit. */
23827
+ volatileStateFields: ["lastFetchedAt"]
23371
23828
  };
23372
23829
  /**
23373
23830
  * integrations — system-scoped singleton capability for integration
@@ -23707,7 +24164,14 @@ var lawnMowerControlCapability = {
23707
24164
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
23708
24165
  * slice for live activity + battery changes.
23709
24166
  */
23710
- runtimeState: LawnMowerControlStatusSchema
24167
+ runtimeState: LawnMowerControlStatusSchema,
24168
+ /**
24169
+ * Runtime-state durability: **session** — as `vacuum-control`.
24170
+ *
24171
+ * See `RuntimeStateDurability`. Enforced by
24172
+ * `scripts/check-runtime-state-durability.ts`.
24173
+ */
24174
+ durability: "session"
23711
24175
  };
23712
24176
  /**
23713
24177
  * local-network — hub-only singleton.
@@ -23913,7 +24377,17 @@ var lockControlCapability = {
23913
24377
  * read `state` and disable themselves during `locking`/`unlocking`
23914
24378
  * transitions.
23915
24379
  */
23916
- runtimeState: LockControlStatusSchema
24380
+ runtimeState: LockControlStatusSchema,
24381
+ /**
24382
+ * Runtime-state durability: **restored** — a lock left locked must still read locked.
24383
+ *
24384
+ * See `RuntimeStateDurability`. Enforced by
24385
+ * `scripts/check-runtime-state-durability.ts`.
24386
+ */
24387
+ durability: "restored",
24388
+ /** Clock fields: written, but excluded from the compare that decides
24389
+ * whether persisting is worth a SQLite commit. */
24390
+ volatileStateFields: ["lastChangedAt"]
23917
24391
  };
23918
24392
  /**
23919
24393
  * Media-player cap. Models HA `media_player.*` (Sonos, Chromecast,
@@ -24075,7 +24549,14 @@ var mediaPlayerCapability = {
24075
24549
  * full slice for live now-playing, volume, and progress updates
24076
24550
  * without polling.
24077
24551
  */
24078
- runtimeState: MediaPlayerStatusSchema
24552
+ runtimeState: MediaPlayerStatusSchema,
24553
+ /**
24554
+ * Runtime-state durability: **session** — a restored transport position describes a playback that stopped when the hub did.
24555
+ *
24556
+ * See `RuntimeStateDurability`. Enforced by
24557
+ * `scripts/check-runtime-state-durability.ts`.
24558
+ */
24559
+ durability: "session"
24079
24560
  };
24080
24561
  /**
24081
24562
  * mesh-network — collection cap for mesh-VPN providers.
@@ -24339,7 +24820,14 @@ onMotionChanged: { data: MotionOnMotionChangedDataSchema } },
24339
24820
  * `device.state.motion.value`. Reads never invoke the provider, so
24340
24821
  * UIs and other addons can poll the cached state safely.
24341
24822
  */
24342
- runtimeState: MotionStatusSchema
24823
+ runtimeState: MotionStatusSchema,
24824
+ /**
24825
+ * Runtime-state durability: **session** — self-clearing by construction (`autoClearAfterMs`); a restored `detected: true` is a frozen event, and the next frame re-publishes the real one.
24826
+ *
24827
+ * See `RuntimeStateDurability`. Enforced by
24828
+ * `scripts/check-runtime-state-durability.ts`.
24829
+ */
24830
+ durability: "session"
24343
24831
  };
24344
24832
  /**
24345
24833
  * Motion-trigger toggle for accessory devices.
@@ -24404,7 +24892,14 @@ var motionTriggerCapability = {
24404
24892
  schema: MotionTriggerStatusSchema,
24405
24893
  kind: "command-driven"
24406
24894
  },
24407
- runtimeState: MotionTriggerRuntimeStateSchema
24895
+ runtimeState: MotionTriggerRuntimeStateSchema,
24896
+ /**
24897
+ * Runtime-state durability: **session** — the authority for motion-trigger enablement is the provider's own config; the slice is a mirror of it, re-published on connect.
24898
+ *
24899
+ * See `RuntimeStateDurability`. Enforced by
24900
+ * `scripts/check-runtime-state-durability.ts`.
24901
+ */
24902
+ durability: "session"
24408
24903
  };
24409
24904
  /**
24410
24905
  * Motion-zones share the same MaskShape vocabulary as privacy-mask — the
@@ -24471,7 +24966,17 @@ var motionZonesCapability = {
24471
24966
  schema: MotionZoneStatusSchema,
24472
24967
  kind: "poll"
24473
24968
  },
24474
- runtimeState: MotionZoneStatusSchema
24969
+ runtimeState: MotionZoneStatusSchema,
24970
+ /**
24971
+ * Runtime-state durability: **restored** — the 14 KB polygon list is the single largest slice on the fleet and has not changed since the operator drew it. Highest value per byte in the table.
24972
+ *
24973
+ * See `RuntimeStateDurability`. Enforced by
24974
+ * `scripts/check-runtime-state-durability.ts`.
24975
+ */
24976
+ durability: "restored",
24977
+ /** Clock fields: written, but excluded from the compare that decides
24978
+ * whether persisting is worth a SQLite commit. */
24979
+ volatileStateFields: ["lastFetchedAt"]
24475
24980
  };
24476
24981
  /**
24477
24982
  * On-camera AI object detection cap. Surfaces per-device the classes
@@ -24545,7 +25050,17 @@ var nativeObjectDetectionCapability = {
24545
25050
  schema: NativeObjectDetectionStatusSchema,
24546
25051
  kind: "push"
24547
25052
  },
24548
- runtimeState: NativeObjectDetectionRuntimeStateSchema
25053
+ runtimeState: NativeObjectDetectionRuntimeStateSchema,
25054
+ /**
25055
+ * Runtime-state durability: **restored** — `enabled` is an operator toggle on a camera whose refresh is a no-op and whose staleMs is Infinity. There is no hardware value to re-read — losing it loses the setting.
25056
+ *
25057
+ * See `RuntimeStateDurability`. Enforced by
25058
+ * `scripts/check-runtime-state-durability.ts`.
25059
+ */
25060
+ durability: "restored",
25061
+ /** Clock fields: written, but excluded from the compare that decides
25062
+ * whether persisting is worth a SQLite commit. */
25063
+ volatileStateFields: ["lastFetchedAt"]
24549
25064
  };
24550
25065
  /**
24551
25066
  * network-quality — system-scoped singleton capability tracking RTT,
@@ -24879,7 +25394,14 @@ onSent: { data: object({
24879
25394
  * form reads `supports` to gate optional fields; history pane reads
24880
25395
  * `lastSentAt` / `lastError` / `queueDepth`.
24881
25396
  */
24882
- runtimeState: NotifierStatusSchema
25397
+ runtimeState: NotifierStatusSchema,
25398
+ /**
25399
+ * Runtime-state durability: **session** — live queue depth and last-send state; a restored queue depth describes a queue that no longer exists.
25400
+ *
25401
+ * See `RuntimeStateDurability`. Enforced by
25402
+ * `scripts/check-runtime-state-durability.ts`.
25403
+ */
25404
+ durability: "session"
24883
25405
  };
24884
25406
  /**
24885
25407
  * Generic numeric sensor — last-resort fallback when no typed numeric
@@ -24922,7 +25444,17 @@ var numericSensorCapability = {
24922
25444
  schema: NumericSensorStatusSchema,
24923
25445
  kind: "push"
24924
25446
  },
24925
- runtimeState: NumericSensorStatusSchema
25447
+ runtimeState: NumericSensorStatusSchema,
25448
+ /**
25449
+ * Runtime-state durability: **restored** — polled value, low churn once the clock is excluded (251 of 669 writes were the clock alone); restoring it removes the cold window before the first poll.
25450
+ *
25451
+ * See `RuntimeStateDurability`. Enforced by
25452
+ * `scripts/check-runtime-state-durability.ts`.
25453
+ */
25454
+ durability: "restored",
25455
+ /** Clock fields: written, but excluded from the compare that decides
25456
+ * whether persisting is worth a SQLite commit. */
25457
+ volatileStateFields: ["lastFetchedAt"]
24926
25458
  };
24927
25459
  /**
24928
25460
  * Generic on-screen-display (video overlay) cap. Each camera exposes
@@ -25307,7 +25839,14 @@ var petFeederCapability = {
25307
25839
  * the full slice via `device.state.petFeeder.value` and refresh on
25308
25840
  * every poll without re-querying the provider.
25309
25841
  */
25310
- runtimeState: PetFeederStatusSchema
25842
+ runtimeState: PetFeederStatusSchema,
25843
+ /**
25844
+ * Runtime-state durability: **session** — live appliance state re-published on connect.
25845
+ *
25846
+ * See `RuntimeStateDurability`. Enforced by
25847
+ * `scripts/check-runtime-state-durability.ts`.
25848
+ */
25849
+ durability: "session"
25311
25850
  };
25312
25851
  var VehicleSchema = object({
25313
25852
  id: string(),
@@ -25653,7 +26192,17 @@ var powerMeterCapability = {
25653
26192
  schema: PowerMeterStatusSchema,
25654
26193
  kind: "push"
25655
26194
  },
25656
- runtimeState: PowerMeterStatusSchema
26195
+ runtimeState: PowerMeterStatusSchema,
26196
+ /**
26197
+ * Runtime-state durability: **restored** — as `numeric-sensor`; `kwhTotal` is an accumulator whose restored value is the baseline.
26198
+ *
26199
+ * See `RuntimeStateDurability`. Enforced by
26200
+ * `scripts/check-runtime-state-durability.ts`.
26201
+ */
26202
+ durability: "restored",
26203
+ /** Clock fields: written, but excluded from the compare that decides
26204
+ * whether persisting is worth a SQLite commit. */
26205
+ volatileStateFields: ["lastFetchedAt"]
25657
26206
  };
25658
26207
  /**
25659
26208
  * Presence cap. Models HA `person.*` and `device_tracker.*` entities
@@ -25710,7 +26259,17 @@ var presenceCapability = {
25710
26259
  * the map pin is rendered (use `DeviceFeature.PresenceGps` for the
25711
26260
  * pre-fetch fast-path check).
25712
26261
  */
25713
- runtimeState: PresenceStatusSchema
26262
+ runtimeState: PresenceStatusSchema,
26263
+ /**
26264
+ * Runtime-state durability: **restored** — occupancy-relevant: the restored state is what an occupancy rule compares the first post-restart observation against.
26265
+ *
26266
+ * See `RuntimeStateDurability`. Enforced by
26267
+ * `scripts/check-runtime-state-durability.ts`.
26268
+ */
26269
+ durability: "restored",
26270
+ /** Clock fields: written, but excluded from the compare that decides
26271
+ * whether persisting is worth a SQLite commit. */
26272
+ volatileStateFields: ["lastChangedAt"]
25714
26273
  };
25715
26274
  /**
25716
26275
  * Atmospheric pressure reading in hectopascals. Drives Home Assistant
@@ -25746,7 +26305,17 @@ var pressureSensorCapability = {
25746
26305
  schema: PressureSensorStatusSchema,
25747
26306
  kind: "push"
25748
26307
  },
25749
- runtimeState: PressureSensorStatusSchema
26308
+ runtimeState: PressureSensorStatusSchema,
26309
+ /**
26310
+ * Runtime-state durability: **restored** — as `numeric-sensor`.
26311
+ *
26312
+ * See `RuntimeStateDurability`. Enforced by
26313
+ * `scripts/check-runtime-state-durability.ts`.
26314
+ */
26315
+ durability: "restored",
26316
+ /** Clock fields: written, but excluded from the compare that decides
26317
+ * whether persisting is worth a SQLite commit. */
26318
+ volatileStateFields: ["lastFetchedAt"]
25750
26319
  };
25751
26320
  /**
25752
26321
  * PRIVACY — what the camera deliberately does not capture. Two planes:
@@ -25876,7 +26445,17 @@ var privacyMaskCapability = {
25876
26445
  schema: PrivacyMaskStatusSchema,
25877
26446
  kind: "poll"
25878
26447
  },
25879
- runtimeState: PrivacyMaskStatusSchema
26448
+ runtimeState: PrivacyMaskStatusSchema,
26449
+ /**
26450
+ * Runtime-state durability: **restored** — operator-drawn regions, zero real churn — 22 writes in 25 minutes, every one of them the clock.
26451
+ *
26452
+ * See `RuntimeStateDurability`. Enforced by
26453
+ * `scripts/check-runtime-state-durability.ts`.
26454
+ */
26455
+ durability: "restored",
26456
+ /** Clock fields: written, but excluded from the compare that decides
26457
+ * whether persisting is worth a SQLite commit. */
26458
+ volatileStateFields: ["lastFetchedAt"]
25880
26459
  };
25881
26460
  var PtzPresetSchema = object({
25882
26461
  id: string(),
@@ -26042,7 +26621,14 @@ var ptzAutotrackCapability = {
26042
26621
  * fetch / cache / fallback logic out of the four cap methods —
26043
26622
  * they become trampolines over `runtimeState`.
26044
26623
  */
26045
- runtimeState: PtzAutotrackRuntimeStateSchema
26624
+ runtimeState: PtzAutotrackRuntimeStateSchema,
26625
+ /**
26626
+ * Runtime-state durability: **session** — mirrors the camera's own autotrack config, re-read on connect.
26627
+ *
26628
+ * See `RuntimeStateDurability`. Enforced by
26629
+ * `scripts/check-runtime-state-durability.ts`.
26630
+ */
26631
+ durability: "session"
26046
26632
  };
26047
26633
  DeviceType.Camera, DeviceType.Sensor, DeviceType.Switch, method(object({ deviceId: number().int().nonnegative() }), object({ success: literal(true) }), {
26048
26634
  kind: "mutation",
@@ -26711,7 +27297,14 @@ var sceneMonitorCapability = {
26711
27297
  schema: SceneMonitorStatusSchema,
26712
27298
  kind: "push"
26713
27299
  },
26714
- runtimeState: SceneMonitorStatusSchema
27300
+ runtimeState: SceneMonitorStatusSchema,
27301
+ /**
27302
+ * Runtime-state durability: **session** — re-derived from the current scene on the next evaluation.
27303
+ *
27304
+ * See `RuntimeStateDurability`. Enforced by
27305
+ * `scripts/check-runtime-state-durability.ts`.
27306
+ */
27307
+ durability: "session"
26715
27308
  };
26716
27309
  /**
26717
27310
  * Per-stage gating mode applied to the zones a rule references.
@@ -26855,7 +27448,14 @@ var scriptRunnerCapability = {
26855
27448
  * `isRunning` to render a spinner during execution and surfaces
26856
27449
  * `lastError` / `lastRunSuccess` in the recent-runs panel.
26857
27450
  */
26858
- runtimeState: ScriptRunnerStatusSchema
27451
+ runtimeState: ScriptRunnerStatusSchema,
27452
+ /**
27453
+ * Runtime-state durability: **session** — a restored `isRunning: true` describes a process that died with the previous hub.
27454
+ *
27455
+ * See `RuntimeStateDurability`. Enforced by
27456
+ * `scripts/check-runtime-state-durability.ts`.
27457
+ */
27458
+ durability: "session"
26859
27459
  };
26860
27460
  /**
26861
27461
  * Smoke alarm sensor — boolean "is smoke currently detected" with
@@ -26882,7 +27482,17 @@ var smokeCapability = {
26882
27482
  schema: SmokeStatusSchema,
26883
27483
  kind: "push"
26884
27484
  },
26885
- runtimeState: SmokeStatusSchema
27485
+ runtimeState: SmokeStatusSchema,
27486
+ /**
27487
+ * Runtime-state durability: **restored** — a safety sensor must not read "clear" merely because the hub restarted.
27488
+ *
27489
+ * See `RuntimeStateDurability`. Enforced by
27490
+ * `scripts/check-runtime-state-durability.ts`.
27491
+ */
27492
+ durability: "restored",
27493
+ /** Clock fields: written, but excluded from the compare that decides
27494
+ * whether persisting is worth a SQLite commit. */
27495
+ volatileStateFields: ["lastChangedAt"]
26886
27496
  };
26887
27497
  /**
26888
27498
  * One publishable camera stream as its OWNING PROVIDER describes it — the same
@@ -27055,7 +27665,17 @@ var streamParamsCapability = {
27055
27665
  schema: StreamParamsStatusSchema,
27056
27666
  kind: "poll"
27057
27667
  },
27058
- runtimeState: StreamParamsStatusSchema
27668
+ runtimeState: StreamParamsStatusSchema,
27669
+ /**
27670
+ * Runtime-state durability: **restored** — operator-set encoder profile; mutation-driven.
27671
+ *
27672
+ * See `RuntimeStateDurability`. Enforced by
27673
+ * `scripts/check-runtime-state-durability.ts`.
27674
+ */
27675
+ durability: "restored",
27676
+ /** Clock fields: written, but excluded from the compare that decides
27677
+ * whether persisting is worth a SQLite commit. */
27678
+ volatileStateFields: ["lastFetchedAt"]
27059
27679
  };
27060
27680
  /**
27061
27681
  * Generic on/off switch cap for accessory children (siren, floodlight,
@@ -27101,6 +27721,16 @@ var switchCapability = {
27101
27721
  * not need to re-query the provider after a setState mutation.
27102
27722
  */
27103
27723
  runtimeState: SwitchStatusSchema,
27724
+ /**
27725
+ * Runtime-state durability: **restored** — device state an operator reads as authoritative; 55 devices, transition-driven.
27726
+ *
27727
+ * See `RuntimeStateDurability`. Enforced by
27728
+ * `scripts/check-runtime-state-durability.ts`.
27729
+ */
27730
+ durability: "restored",
27731
+ /** Clock fields: written, but excluded from the compare that decides
27732
+ * whether persisting is worth a SQLite commit. */
27733
+ volatileStateFields: ["lastChangedAt"],
27104
27734
  settings: { bindings: [{
27105
27735
  kind: "scalar",
27106
27736
  statusPath: "on",
@@ -27180,7 +27810,17 @@ var tamperCapability = {
27180
27810
  schema: TamperStatusSchema,
27181
27811
  kind: "push"
27182
27812
  },
27183
- runtimeState: TamperStatusSchema
27813
+ runtimeState: TamperStatusSchema,
27814
+ /**
27815
+ * Runtime-state durability: **restored** — as `smoke`.
27816
+ *
27817
+ * See `RuntimeStateDurability`. Enforced by
27818
+ * `scripts/check-runtime-state-durability.ts`.
27819
+ */
27820
+ durability: "restored",
27821
+ /** Clock fields: written, but excluded from the compare that decides
27822
+ * whether persisting is worth a SQLite commit. */
27823
+ volatileStateFields: ["lastChangedAt"]
27184
27824
  };
27185
27825
  /**
27186
27826
  * Single-metric temperature reading. Drives Home Assistant `sensor`
@@ -27225,7 +27865,17 @@ var temperatureSensorCapability = {
27225
27865
  schema: TemperatureSensorStatusSchema,
27226
27866
  kind: "push"
27227
27867
  },
27228
- runtimeState: TemperatureSensorStatusSchema
27868
+ runtimeState: TemperatureSensorStatusSchema,
27869
+ /**
27870
+ * Runtime-state durability: **restored** — as `numeric-sensor` (69 of 125 writes were the clock alone).
27871
+ *
27872
+ * See `RuntimeStateDurability`. Enforced by
27873
+ * `scripts/check-runtime-state-durability.ts`.
27874
+ */
27875
+ durability: "restored",
27876
+ /** Clock fields: written, but excluded from the compare that decides
27877
+ * whether persisting is worth a SQLite commit. */
27878
+ volatileStateFields: ["lastFetchedAt"]
27229
27879
  };
27230
27880
  /**
27231
27881
  * toast — system-scoped singleton capability that streams toast
@@ -27294,7 +27944,14 @@ var updateCapability = {
27294
27944
  schema: UpdateStatusSchema,
27295
27945
  kind: "poll"
27296
27946
  },
27297
- runtimeState: UpdateStatusSchema
27947
+ runtimeState: UpdateStatusSchema,
27948
+ /**
27949
+ * Runtime-state durability: **session** — a restored `inProgress: true` describes an update that is no longer running; versions are re-probed at boot.
27950
+ *
27951
+ * See `RuntimeStateDurability`. Enforced by
27952
+ * `scripts/check-runtime-state-durability.ts`.
27953
+ */
27954
+ durability: "session"
27298
27955
  };
27299
27956
  var UserSummarySchema = object({
27300
27957
  id: string(),
@@ -27628,7 +28285,14 @@ var vacuumControlCapability = {
27628
28285
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
27629
28286
  * slice for live state + battery + fan-speed changes.
27630
28287
  */
27631
- runtimeState: VacuumControlStatusSchema
28288
+ runtimeState: VacuumControlStatusSchema,
28289
+ /**
28290
+ * Runtime-state durability: **session** — as `media-player` — a restored `state: cleaning` is a robot that is not cleaning.
28291
+ *
28292
+ * See `RuntimeStateDurability`. Enforced by
28293
+ * `scripts/check-runtime-state-durability.ts`.
28294
+ */
28295
+ durability: "session"
27632
28296
  };
27633
28297
  var ValveStatusSchema = object({
27634
28298
  /** Lifecycle state of the valve. */
@@ -27680,7 +28344,14 @@ var valveCapability = {
27680
28344
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
27681
28345
  * slice for live position changes during a move.
27682
28346
  */
27683
- runtimeState: ValveStatusSchema
28347
+ runtimeState: ValveStatusSchema,
28348
+ /**
28349
+ * Runtime-state durability: **session** — as `brightness`.
28350
+ *
28351
+ * See `RuntimeStateDurability`. Enforced by
28352
+ * `scripts/check-runtime-state-durability.ts`.
28353
+ */
28354
+ durability: "session"
27684
28355
  };
27685
28356
  /**
27686
28357
  * Vibration / shake / impact sensor. Drives Home Assistant
@@ -27702,7 +28373,17 @@ var vibrationCapability = {
27702
28373
  schema: VibrationStatusSchema,
27703
28374
  kind: "push"
27704
28375
  },
27705
- runtimeState: VibrationStatusSchema
28376
+ runtimeState: VibrationStatusSchema,
28377
+ /**
28378
+ * Runtime-state durability: **restored** — as `smoke`.
28379
+ *
28380
+ * See `RuntimeStateDurability`. Enforced by
28381
+ * `scripts/check-runtime-state-durability.ts`.
28382
+ */
28383
+ durability: "restored",
28384
+ /** Clock fields: written, but excluded from the compare that decides
28385
+ * whether persisting is worth a SQLite commit. */
28386
+ volatileStateFields: ["lastChangedAt"]
27706
28387
  };
27707
28388
  /**
27708
28389
  * Water heater / boiler cap. Models HA `water_heater.*` entities — a
@@ -27776,7 +28457,14 @@ var waterHeaterCapability = {
27776
28457
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
27777
28458
  * slice for live temperature / mode / away changes.
27778
28459
  */
27779
- runtimeState: WaterHeaterStatusSchema
28460
+ runtimeState: WaterHeaterStatusSchema,
28461
+ /**
28462
+ * Runtime-state durability: **session** — as `climate-control`.
28463
+ *
28464
+ * See `RuntimeStateDurability`. Enforced by
28465
+ * `scripts/check-runtime-state-durability.ts`.
28466
+ */
28467
+ durability: "session"
27780
28468
  };
27781
28469
  /**
27782
28470
  * Weather provider cap. Models HA `weather.*` entities — a read-only
@@ -27835,7 +28523,14 @@ var weatherCapability = {
27835
28523
  * Runtime-state slice — mirrored by the kernel. The UI reads the
27836
28524
  * current conditions directly from the slice on each weather push.
27837
28525
  */
27838
- runtimeState: WeatherStatusSchema
28526
+ runtimeState: WeatherStatusSchema,
28527
+ /**
28528
+ * Runtime-state durability: **session** — a forecast is stale the moment the hub is down; the provider re-fetches on connect.
28529
+ *
28530
+ * See `RuntimeStateDurability`. Enforced by
28531
+ * `scripts/check-runtime-state-durability.ts`.
28532
+ */
28533
+ durability: "session"
27839
28534
  };
27840
28535
  /**
27841
28536
  * Per-zone occupancy aggregation produced by the analytics frame
@@ -27997,7 +28692,14 @@ var zoneAnalyticsCapability = {
27997
28692
  * automatically; the explicit `getCurrentSnapshot` cap method is
27998
28693
  * still useful for one-off polls without a subscription.
27999
28694
  */
28000
- runtimeState: CameraOccupancySnapshotSchema
28695
+ runtimeState: CameraOccupancySnapshotSchema,
28696
+ /**
28697
+ * Runtime-state durability: **session** — per-frame analytics; with `audio-metrics` it is ~90 % of the offered write rate. Re-derived on the next frame.
28698
+ *
28699
+ * See `RuntimeStateDurability`. Enforced by
28700
+ * `scripts/check-runtime-state-durability.ts`.
28701
+ */
28702
+ durability: "session"
28001
28703
  };
28002
28704
  /**
28003
28705
  * Stages a {@link ZoneRule} can apply to. Discriminator on the rules
@@ -28075,7 +28777,14 @@ var zoneRulesCapability = {
28075
28777
  motion: array(ZoneRuleSchema).readonly(),
28076
28778
  detection: array(ZoneRuleSchema).readonly(),
28077
28779
  package: array(ZoneRuleSchema).readonly()
28078
- })
28780
+ }),
28781
+ /**
28782
+ * Runtime-state durability: **restored** — operator intent, mutation-only, same argument as `zones`.
28783
+ *
28784
+ * See `RuntimeStateDurability`. Enforced by
28785
+ * `scripts/check-runtime-state-durability.ts`.
28786
+ */
28787
+ durability: "restored"
28079
28788
  };
28080
28789
  /**
28081
28790
  * Most specific first. Extending this list is how a new device kind becomes
@@ -34815,6 +35524,7 @@ Object.freeze({
34815
35524
  "network-access": "ingress",
34816
35525
  "smtp-provider": "email"
34817
35526
  });
35527
+ new Map(AUDIO_MACRO_LABELS.flatMap((macro) => macro.icon === void 0 ? [] : [[macro.id, macro.icon]]));
34818
35528
  new Set(["devices", "classes"]);
34819
35529
  var WEEKDAY_TO_DAY = {
34820
35530
  Sun: 0,
@@ -35382,6 +36092,12 @@ Object.defineProperty(exports, "DEFAULT_TIMELAPSE_PREVIEW_TEXT", {
35382
36092
  return DEFAULT_TIMELAPSE_PREVIEW_TEXT;
35383
36093
  }
35384
36094
  });
36095
+ Object.defineProperty(exports, "DETECTION_MACRO_CLASSES", {
36096
+ enumerable: true,
36097
+ get: function() {
36098
+ return DETECTION_MACRO_CLASSES;
36099
+ }
36100
+ });
35385
36101
  Object.defineProperty(exports, "DETECTION_PIPELINE_CAP_NAME", {
35386
36102
  enumerable: true,
35387
36103
  get: function() {
@@ -35430,12 +36146,30 @@ Object.defineProperty(exports, "MACRO_LABELS", {
35430
36146
  return MACRO_LABELS;
35431
36147
  }
35432
36148
  });
36149
+ Object.defineProperty(exports, "NC_ALARM_SYSTEM_EVENT_KINDS", {
36150
+ enumerable: true,
36151
+ get: function() {
36152
+ return NC_ALARM_SYSTEM_EVENT_KINDS;
36153
+ }
36154
+ });
35433
36155
  Object.defineProperty(exports, "NC_CONDITION_CATALOG", {
35434
36156
  enumerable: true,
35435
36157
  get: function() {
35436
36158
  return NC_CONDITION_CATALOG;
35437
36159
  }
35438
36160
  });
36161
+ Object.defineProperty(exports, "NC_DEFAULT_SNOOZE_MINUTES", {
36162
+ enumerable: true,
36163
+ get: function() {
36164
+ return NC_DEFAULT_SNOOZE_MINUTES;
36165
+ }
36166
+ });
36167
+ Object.defineProperty(exports, "NC_SNOOZE_MAX_MINUTES", {
36168
+ enumerable: true,
36169
+ get: function() {
36170
+ return NC_SNOOZE_MAX_MINUTES;
36171
+ }
36172
+ });
35439
36173
  Object.defineProperty(exports, "NC_TAXONOMY", {
35440
36174
  enumerable: true,
35441
36175
  get: function() {
@@ -35682,6 +36416,12 @@ Object.defineProperty(exports, "hydrateSchema", {
35682
36416
  return hydrateSchema;
35683
36417
  }
35684
36418
  });
36419
+ Object.defineProperty(exports, "isDetectionMacroClass", {
36420
+ enumerable: true,
36421
+ get: function() {
36422
+ return isDetectionMacroClass;
36423
+ }
36424
+ });
35685
36425
  Object.defineProperty(exports, "isDeviceScopedCap", {
35686
36426
  enumerable: true,
35687
36427
  get: function() {