@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.
@@ -10990,7 +10990,14 @@ var cameraStreamsCapability = {
10990
10990
  low: string().optional()
10991
10991
  }),
10992
10992
  lastChangedAt: number()
10993
- })
10993
+ }),
10994
+ /**
10995
+ * 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.
10996
+ *
10997
+ * See `RuntimeStateDurability`. Enforced by
10998
+ * `scripts/check-runtime-state-durability.ts`.
10999
+ */
11000
+ durability: "session"
10994
11001
  };
10995
11002
  /** kebab-case cap name → camelCase router-map key. */
10996
11003
  function kebabToCamel(s) {
@@ -11577,6 +11584,13 @@ var deviceDiscoveryCapability = {
11577
11584
  kind: "poll"
11578
11585
  },
11579
11586
  runtimeState: DeviceDiscoveryStatusSchema.extend({ lastFetchedAt: number().int().nonnegative() }),
11587
+ /**
11588
+ * Runtime-state durability: **session** — 5.7 KB of scan output on the largest device, fully re-derivable by re-scanning.
11589
+ *
11590
+ * See `RuntimeStateDurability`. Enforced by
11591
+ * `scripts/check-runtime-state-durability.ts`.
11592
+ */
11593
+ durability: "session",
11580
11594
  methods: {
11581
11595
  /**
11582
11596
  * Snapshot of the current `discovered` list. Returns the
@@ -13401,11 +13415,33 @@ var NotificationFormatSchema = _enum([
13401
13415
  * Named by INTENT, never by glyph. "check" would tie the vocabulary to one
13402
13416
  * renderer's icon set; "acknowledge" survives an adapter that draws it
13403
13417
  * differently.
13418
+ *
13419
+ * ── A TOKEN IS NOT A WIRE VALUE ─────────────────────────────────────
13420
+ *
13421
+ * These names are for US. **No adapter may forward one verbatim.** Each maps
13422
+ * the whole set onto its own renderer's vocabulary through a
13423
+ * `Record<NotificationActionIcon, string>` — a Record, never a lookup with a
13424
+ * fallback, so adding a member here fails every adapter's build until someone
13425
+ * decides its glyph, which is the only place that decision can be made
13426
+ * honestly.
13427
+ *
13428
+ * This paragraph is the bug. Zentik declared `actionIcons: true` and passed
13429
+ * `disarm` straight through; iOS feeds that string to
13430
+ * `UNNotificationActionIcon(systemImageName:)`, `disarm` is not an SF Symbol,
13431
+ * and every snooze and alarm button arrived BLANK. A pass-through is not a
13432
+ * mapping, and "the field is documented" is not "the value renders".
13433
+ *
13434
+ * Adding a member is TRAIN-BOUND. The enum lives in the published
13435
+ * `@camstack/server` closure and the cap seam validates against the HUB's copy,
13436
+ * so an addon that emits a token the running hub does not know does not lose an
13437
+ * icon — its whole `send` fails Zod validation and the notification never
13438
+ * arrives. Never emit a new token from an addon before the train carrying it.
13404
13439
  */
13405
13440
  var NotificationActionIconSchema = _enum([
13406
13441
  "acknowledge",
13407
13442
  "dismiss",
13408
13443
  "silence",
13444
+ "snooze",
13409
13445
  "view",
13410
13446
  "play",
13411
13447
  "open",
@@ -13413,9 +13449,13 @@ var NotificationActionIconSchema = _enum([
13413
13449
  "lock",
13414
13450
  "unlock",
13415
13451
  "arm",
13452
+ "arm-home",
13453
+ "arm-away",
13454
+ "arm-night",
13416
13455
  "disarm",
13417
13456
  "light",
13418
- "alert"
13457
+ "alert",
13458
+ "camera"
13419
13459
  ]);
13420
13460
  /** A single tap-through action button. */
13421
13461
  var NotificationActionSchema = object({
@@ -13431,7 +13471,23 @@ var NotificationActionSchema = object({
13431
13471
  * else — see `notification-center/action-token.ts` for what that does and
13432
13472
  * does not buy.
13433
13473
  */
13434
- destructive: boolean().optional()
13474
+ destructive: boolean().optional(),
13475
+ /**
13476
+ * How the tap should REACH the url.
13477
+ *
13478
+ * `navigate` (absent, and every button authored before this field) opens it:
13479
+ * the phone leaves the notification and shows whatever the callback returns.
13480
+ * That is right for a button whose answer the operator wants to read.
13481
+ *
13482
+ * `background` fires it as a POST and stays put. It exists for the buttons
13483
+ * whose whole point is not to interrupt — "silence this for 30 minutes" is
13484
+ * an answer to the notification, and being thrown into a browser tab to
13485
+ * confirm it costs more attention than the notification did. A backend that
13486
+ * cannot do a background call renders it as an ordinary link (the adapters
13487
+ * fall back rather than dropping the button), so this is a preference, never
13488
+ * a requirement.
13489
+ */
13490
+ mode: _enum(["navigate", "background"]).optional()
13435
13491
  });
13436
13492
  /**
13437
13493
  * The canonical notification. `body` is the only hard field (Apprise model).
@@ -13617,6 +13673,29 @@ var MACRO_LABELS = [
13617
13673
  name: "Package"
13618
13674
  }
13619
13675
  ];
13676
+ /**
13677
+ * The class names a per-class COUNT can ever be keyed on — the macro ids, and
13678
+ * only those.
13679
+ *
13680
+ * `preserveOriginal: false` below is the whole reason this set exists: the
13681
+ * executor maps each raw COCO label onto its macro and DROPS everything else,
13682
+ * so a tracked detection's `className` is always one of {@link MACRO_LABELS}.
13683
+ * Any surface that indexes counts by class name — the ZoneAnalytics occupancy
13684
+ * snapshot's `byClass`, and therefore every occupancy rule — can match nothing
13685
+ * else. Derived from the catalog, never hand-listed, so a new macro joins it by
13686
+ * being declared once.
13687
+ *
13688
+ * Cost of not having it, 2026-08-12: the notification rule editor offered the
13689
+ * full taxonomy for an occupancy class (occupancy is the one condition that
13690
+ * does not go through the engine's macro-expanding `expandClassSelector`), two
13691
+ * live rules were authored on `car`, and both counters read 0 forever.
13692
+ */
13693
+ var DETECTION_MACRO_CLASSES = new Set(MACRO_LABELS.map((l) => l.id));
13694
+ /** True when `className` is a macro the detector can actually emit (and hence a
13695
+ * class a count can be keyed on) — see {@link DETECTION_MACRO_CLASSES}. */
13696
+ function isDetectionMacroClass(className) {
13697
+ return DETECTION_MACRO_CLASSES.has(className.trim().toLowerCase());
13698
+ }
13620
13699
  var COCO_TO_MACRO = {
13621
13700
  mapping: {
13622
13701
  person: "person",
@@ -14310,7 +14389,17 @@ var alarmPanelCapability = {
14310
14389
  * full slice; renders an arm button per `availableModes` entry and
14311
14390
  * a PIN field iff `requiresCode === true`.
14312
14391
  */
14313
- runtimeState: AlarmPanelStatusSchema
14392
+ runtimeState: AlarmPanelStatusSchema,
14393
+ /**
14394
+ * Runtime-state durability: **restored** — armed state is the one thing a panel must not lose across a restart.
14395
+ *
14396
+ * See `RuntimeStateDurability`. Enforced by
14397
+ * `scripts/check-runtime-state-durability.ts`.
14398
+ */
14399
+ durability: "restored",
14400
+ /** Clock fields: written, but excluded from the compare that decides
14401
+ * whether persisting is worth a SQLite commit. */
14402
+ volatileStateFields: ["lastChangedAt"]
14314
14403
  };
14315
14404
  /**
14316
14405
  * Shared geometry vocabulary for on-frame shape caps — privacy-mask,
@@ -14451,6 +14540,8 @@ var NcSystemEventKindSchema = _enum([
14451
14540
  "alarm-triggered",
14452
14541
  "alarm-armed",
14453
14542
  "alarm-disarmed",
14543
+ "alarm-arming",
14544
+ "alarm-arm-refused",
14454
14545
  "camera-online",
14455
14546
  "camera-offline",
14456
14547
  "camera-disabled",
@@ -14465,6 +14556,25 @@ var NC_LEGACY_SYSTEM_EVENT_KINDS = new Set([
14465
14556
  ]);
14466
14557
  NcSystemEventKindSchema.options.filter((kind) => !NC_LEGACY_SYSTEM_EVENT_KINDS.has(kind));
14467
14558
  /**
14559
+ * The panel's transitions, as ONE list.
14560
+ *
14561
+ * Named here rather than spelled out at each of the four sites that need them
14562
+ * (the emitter, the intake, the editor group, the combined-notification gate),
14563
+ * because a transition added to the enum and forgotten at one of them is an
14564
+ * alarm state nobody can be notified about. That is exactly what this list
14565
+ * failed to prevent while it held three: `alarm-arming` was the fourth.
14566
+ *
14567
+ * In LIFECYCLE order, which is the order an editor lists them in and the order
14568
+ * a person experiences them — not the order they were added.
14569
+ */
14570
+ var NC_ALARM_SYSTEM_EVENT_KINDS = [
14571
+ "alarm-arm-refused",
14572
+ "alarm-arming",
14573
+ "alarm-armed",
14574
+ "alarm-triggered",
14575
+ "alarm-disarmed"
14576
+ ];
14577
+ /**
14468
14578
  * One coherent system-event condition. `kinds` is the required opt-in safety
14469
14579
  * gate; the remaining lists are optional narrowing filters relevant to the
14470
14580
  * selected kinds.
@@ -14487,6 +14597,26 @@ var NcSystemEventConditionSchema = object({
14487
14597
  nodeIds: array(string().min(1)).min(1).optional(),
14488
14598
  packageNames: array(string().min(1)).min(1).optional()
14489
14599
  });
14600
+ /** Hard ceiling on a window (24h). A snooze that could not expire would be an
14601
+ * outage the operator asked for once and forgot. */
14602
+ var NC_SNOOZE_MAX_MINUTES = 1440;
14603
+ /**
14604
+ * The durations a notification offers when its rule does not say otherwise.
14605
+ *
14606
+ * MINUTES, and short ones: a snooze button is answered on a lock screen, and
14607
+ * the three choices that fit there are "the next few minutes", "the next half
14608
+ * hour" and "the next hour". Anything longer is a decision somebody sits down
14609
+ * to make, which is what the app's own snooze surface is for.
14610
+ *
14611
+ * Resolved in CODE (`snoozeChoices`), never as a Zod default — see
14612
+ * {@link NcRuleInputSchema.shape.snoozeOptions} for why the distinction is
14613
+ * load-bearing.
14614
+ */
14615
+ var NC_DEFAULT_SNOOZE_MINUTES = [
14616
+ 10,
14617
+ 30,
14618
+ 60
14619
+ ];
14490
14620
  /** Weekly schedule — OR of windows; absence on the rule = always active. */
14491
14621
  var NcScheduleSchema = object({
14492
14622
  windows: array(object({
@@ -14863,15 +14993,15 @@ var NcConditionsSchema = object({
14863
14993
  * (an `immediate` rule naming an `audio-*` class, one notification per
14864
14994
  * classified sample) stays exactly as it was for rules that already use it.
14865
14995
  *
14866
- * NOT in {@link NC_CONDITION_CATALOG} yet, and that is the sequencing rule
14867
- * rather than an oversight: the viewer mirrors the descriptor enums BY HAND
14868
- * (`camstack/src/data/notification-center.ts`, guarded by
14869
- * `scripts/check-viewer-condition-mirror.ts`) and its rule editor STRIPS the
14996
+ * In {@link NC_CONDITION_CATALOG} since P2, and the ORDER it got there is the
14997
+ * rule rather than an accident: the viewer mirrors the descriptor enums BY
14998
+ * HAND (`camstack/src/data/notification-center.ts`, guarded by
14999
+ * `scripts/check-viewer-condition-mirror.ts`) and its rule editor strips the
14870
15000
  * condition fields it does not know when a rule is saved from the phone.
14871
15001
  * Publishing an editor for a condition the app cannot round-trip is how an
14872
- * operator loses a rule's conditions by opening it — so the descriptor, the
14873
- * admin widget and the viewer mirror land together (P2 + P3), and only then
14874
- * does an audio rule become authorable.
15002
+ * operator loses a rule's conditions by opening it — so the viewer mirror
15003
+ * (P3, shipped) went FIRST, and the descriptor an editor renders from
15004
+ * follows here.
14875
15005
  */
14876
15006
  audio: NcAudioConditionSchema.optional()
14877
15007
  });
@@ -15107,6 +15237,30 @@ var NcRuleInputSchema = object({
15107
15237
  */
15108
15238
  snoozeAllowGlobal: boolean().optional(),
15109
15239
  /**
15240
+ * The snooze durations THIS rule's notification offers as buttons, in
15241
+ * minutes.
15242
+ *
15243
+ * Three states, and all three are distinct — which is exactly why this is
15244
+ * `.optional()` and never `.default()`. A Zod default does not run on the
15245
+ * addon cap path (three production failures in one day), so a schema default
15246
+ * would collapse the first two:
15247
+ *
15248
+ * | value | meaning |
15249
+ * | --- | --- |
15250
+ * | absent | the operator never said ⇒ {@link NC_DEFAULT_SNOOZE_MINUTES} |
15251
+ * | `[]` | **no snooze buttons on this rule** — the explicit override |
15252
+ * | a list | these choices, de-duplicated and sorted, at most four |
15253
+ *
15254
+ * `.max(4)` because the notifier's own action budget is small (ntfy allows
15255
+ * three buttons in total) and a rule that spent it all on snooze choices
15256
+ * would push its own tap-through actions off the notification.
15257
+ *
15258
+ * An empty list is NOT an alarm exemption: a rule the alarm is about, or
15259
+ * that arms the panel, is exempt automatically and cannot be silenced by a
15260
+ * window from anywhere (D133).
15261
+ */
15262
+ snoozeOptions: array(number().int().min(1).max(NC_SNOOZE_MAX_MINUTES)).max(4).optional(),
15263
+ /**
15110
15264
  * Devices this rule ACTUATES — arm the alarm, open a gate, turn on a light.
15111
15265
  *
15112
15266
  * This is what makes the rule set the alarm's trigger set without the alarm
@@ -15206,6 +15360,7 @@ var NcConditionDescriptorSchema = object({
15206
15360
  "device",
15207
15361
  "package",
15208
15362
  "occupancy",
15363
+ "audio",
15209
15364
  "system"
15210
15365
  ]),
15211
15366
  label: string(),
@@ -15224,6 +15379,7 @@ var NcConditionDescriptorSchema = object({
15224
15379
  "crossingSelect",
15225
15380
  "polygonDraw",
15226
15381
  "occupancy",
15382
+ "audio",
15227
15383
  "deviceState",
15228
15384
  "systemEvent"
15229
15385
  ]),
@@ -15314,13 +15470,17 @@ var NC_CONDITION_CATALOG = [
15314
15470
  label: "Server update available"
15315
15471
  },
15316
15472
  {
15317
- value: "alarm-triggered",
15318
- label: "Alarm triggered"
15473
+ value: "alarm-arming",
15474
+ label: "Alarm arming (exit delay)"
15319
15475
  },
15320
15476
  {
15321
15477
  value: "alarm-armed",
15322
15478
  label: "Alarm armed"
15323
15479
  },
15480
+ {
15481
+ value: "alarm-triggered",
15482
+ label: "Alarm triggered"
15483
+ },
15324
15484
  {
15325
15485
  value: "alarm-disarmed",
15326
15486
  label: "Alarm disarmed"
@@ -15621,6 +15781,16 @@ var NC_CONDITION_CATALOG = [
15621
15781
  phase: "P1",
15622
15782
  description: "ZoneAnalytics occupancy edge (optionally zone/class-scoped): count crosses the threshold and holds for sustainSeconds. Fail-closed on a missing snapshot."
15623
15783
  },
15784
+ {
15785
+ id: "audio",
15786
+ group: "audio",
15787
+ label: "Sound",
15788
+ valueType: "audio",
15789
+ operator: "anyOf",
15790
+ appliesTo: ["immediate"],
15791
+ phase: "P2",
15792
+ 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)."
15793
+ },
15624
15794
  {
15625
15795
  id: "customZones",
15626
15796
  group: "zones",
@@ -15765,7 +15935,20 @@ var NcSnoozeInputSchema = object({
15765
15935
  ruleId: string().optional(),
15766
15936
  /** Required when `scope: 'device'`. */
15767
15937
  deviceId: number().int().optional(),
15768
- durationMinutes: number().int().min(1).max(1440),
15938
+ /**
15939
+ * Narrow the window to these subject classes — "the cat, not the person".
15940
+ *
15941
+ * ORTHOGONAL to `scope`, deliberately, and absent means EVERY class: that is
15942
+ * what every window authored before this field meant, so no persisted row
15943
+ * changes meaning and no client has to learn anything to keep working.
15944
+ *
15945
+ * It is what makes the window's real key `(deviceId, classes[])` and lets it
15946
+ * cross rules (D133): the operator points at a camera and a kind of thing,
15947
+ * not at whichever of their four rules happened to produce the notification
15948
+ * they are dismissing.
15949
+ */
15950
+ classes: array(string().min(1)).min(1).optional(),
15951
+ durationMinutes: number().int().min(1).max(NC_SNOOZE_MAX_MINUTES),
15769
15952
  /**
15770
15953
  * Silence this for EVERY recipient, not just the caller. Permission is
15771
15954
  * checked server-side (the rule's `snoozeAllowGlobal`, or admin for the
@@ -15790,6 +15973,10 @@ var NcSnoozeSchema = object({
15790
15973
  scope: NcSnoozeScopeSchema,
15791
15974
  ruleId: string().optional(),
15792
15975
  deviceId: number().int().optional(),
15976
+ /** Subject classes this window covers. ABSENT = every class — see
15977
+ * {@link NcSnoozeInputSchema.shape.classes}. Lives in the JSON blob and has
15978
+ * no SQLite column: nothing queries a window by class. */
15979
+ classes: array(string().min(1)).min(1).optional(),
15793
15980
  startedAt: number(),
15794
15981
  /** Exclusive: at exactly this instant the snooze is over. Expiry is a
15795
15982
  * COMPARISON, not a job — no sweeper can leave the operator silenced. */
@@ -18386,7 +18573,14 @@ var zonesCapability = {
18386
18573
  * handle. Slice shape is `{ zones: Zone[] }` so future extensions
18387
18574
  * (e.g. zone groupings) can sit alongside the polygon list.
18388
18575
  */
18389
- runtimeState: object({ zones: array(ZoneSchema).readonly() })
18576
+ runtimeState: object({ zones: array(ZoneSchema).readonly() }),
18577
+ /**
18578
+ * 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.
18579
+ *
18580
+ * See `RuntimeStateDurability`. Enforced by
18581
+ * `scripts/check-runtime-state-durability.ts`.
18582
+ */
18583
+ durability: "restored"
18390
18584
  };
18391
18585
  /**
18392
18586
  * A bounding box in NORMALIZED [0,1] frame coordinates for `getNativeCrop`. The
@@ -18556,6 +18750,22 @@ var detectionFpsField = {
18556
18750
  default: 10,
18557
18751
  step: 1
18558
18752
  };
18753
+ /**
18754
+ * The occupancy re-check interval. DEFAULT 300 s (2026-08-13 — was 30 s).
18755
+ *
18756
+ * The recheck is now on by default (a parked car is invisible to occupancy
18757
+ * rules until the stationary registry has been rebuilt by motion, which after a
18758
+ * restart may be never on a quiet camera). Each cycle re-subscribes a detection
18759
+ * session — an RTSP re-dial — so the switch is only affordable at a WIDE
18760
+ * interval: 300 s is ~12 re-dials an hour per camera, against 120 at the old
18761
+ * 30 s. A parked car is therefore counted within 5 minutes of a restart.
18762
+ *
18763
+ * Why not wider: `max` is 300 and raising it is TRAIN-BOUND, not addon-bound —
18764
+ * the host validates `attachCamera` against ITS copy of this schema, so a
18765
+ * runner asked for 600 would be rejected by the hub until a `@camstack/server`
18766
+ * carrying the wider bound is installed everywhere. 300 is the widest value
18767
+ * that ships with an addon deploy.
18768
+ */
18559
18769
  var occupancyRecheckSecField = {
18560
18770
  min: 0,
18561
18771
  max: 300,
@@ -18757,15 +18967,21 @@ var RunnerCameraConfigSchema = object({
18757
18967
  */
18758
18968
  onboardMotionDrivesAnalyzer: boolean().default(true),
18759
18969
  /**
18760
- * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
18761
- * never arms the periodic recheck timer, regardless of `occupancyRecheckSec` —
18762
- * this is off by default because the recheck re-subscribes a detection session
18763
- * every N seconds while `watching`, a major source of pull-decoder re-dial
18764
- * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
18970
+ * Master toggle for the occupancy re-check. When `false` the runner never arms
18971
+ * the periodic recheck timer, regardless of `occupancyRecheckSec`; the
18765
18972
  * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
18766
18973
  * (and only render) when this is enabled.
18767
- */
18768
- occupancyRecheckEnabled: boolean().default(false),
18974
+ *
18975
+ * DEFAULT `true` since 2026-08-13 (was `false`). It was off because the
18976
+ * recheck re-subscribes a detection session every N seconds while `watching`
18977
+ * — each cycle creates+tears a session ⇒ an RTSP re-dial ⇒ latency, a major
18978
+ * pull-decoder churn source. What that bought was a blind spot: a STATIONARY
18979
+ * object is counted only while the stationary registry holds it, and the
18980
+ * registry rebuilds from motion, so after a restart a parked car was invisible
18981
+ * to every occupancy rule until something moved in front of it. The churn is
18982
+ * now paid on the interval instead — see `occupancyRecheckSecField`.
18983
+ */
18984
+ occupancyRecheckEnabled: boolean().default(true),
18769
18985
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
18770
18986
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
18771
18987
  /**
@@ -21229,7 +21445,17 @@ var airQualitySensorCapability = {
21229
21445
  schema: AirQualitySensorStatusSchema,
21230
21446
  kind: "push"
21231
21447
  },
21232
- runtimeState: AirQualitySensorStatusSchema
21448
+ runtimeState: AirQualitySensorStatusSchema,
21449
+ /**
21450
+ * Runtime-state durability: **restored** — as `numeric-sensor`.
21451
+ *
21452
+ * See `RuntimeStateDurability`. Enforced by
21453
+ * `scripts/check-runtime-state-durability.ts`.
21454
+ */
21455
+ durability: "restored",
21456
+ /** Clock fields: written, but excluded from the compare that decides
21457
+ * whether persisting is worth a SQLite commit. */
21458
+ volatileStateFields: ["lastFetchedAt"]
21233
21459
  };
21234
21460
  /**
21235
21461
  * Ambient illuminance reading in lux. Drives Home Assistant `sensor`
@@ -21261,7 +21487,17 @@ var ambientLightSensorCapability = {
21261
21487
  schema: AmbientLightSensorStatusSchema,
21262
21488
  kind: "push"
21263
21489
  },
21264
- runtimeState: AmbientLightSensorStatusSchema
21490
+ runtimeState: AmbientLightSensorStatusSchema,
21491
+ /**
21492
+ * Runtime-state durability: **restored** — as `numeric-sensor`.
21493
+ *
21494
+ * See `RuntimeStateDurability`. Enforced by
21495
+ * `scripts/check-runtime-state-durability.ts`.
21496
+ */
21497
+ durability: "restored",
21498
+ /** Clock fields: written, but excluded from the compare that decides
21499
+ * whether persisting is worth a SQLite commit. */
21500
+ volatileStateFields: ["lastFetchedAt"]
21265
21501
  };
21266
21502
  /**
21267
21503
  * Per-class audio metrics aggregated over a sliding window.
@@ -21379,7 +21615,14 @@ var audioMetricsCapability = {
21379
21615
  }), AudioMetricsHistorySchema)
21380
21616
  },
21381
21617
  /** Reactive runtime-state mirror — live `device.state.audioMetrics.value`. */
21382
- runtimeState: AudioMetricsSnapshotSchema
21618
+ runtimeState: AudioMetricsSnapshotSchema,
21619
+ /**
21620
+ * 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.
21621
+ *
21622
+ * See `RuntimeStateDurability`. Enforced by
21623
+ * `scripts/check-runtime-state-durability.ts`.
21624
+ */
21625
+ durability: "session"
21383
21626
  };
21384
21627
  /**
21385
21628
  * Automation-control cap. Models HA `automation.*` entities on
@@ -21441,7 +21684,14 @@ var automationControlCapability = {
21441
21684
  * reads `enabled` (toggle) + `isRunning` (spinner) + `lastError`
21442
21685
  * (badge) directly.
21443
21686
  */
21444
- runtimeState: AutomationControlStatusSchema
21687
+ runtimeState: AutomationControlStatusSchema,
21688
+ /**
21689
+ * 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.
21690
+ *
21691
+ * See `RuntimeStateDurability`. Enforced by
21692
+ * `scripts/check-runtime-state-durability.ts`.
21693
+ */
21694
+ durability: "session"
21445
21695
  };
21446
21696
  /**
21447
21697
  * Battery status snapshot. Emitted by providers whose device is
@@ -21547,7 +21797,17 @@ onStatusChanged: { data: object({
21547
21797
  * via `device.runtimeState.getCapState('battery')` regardless of
21548
21798
  * the underlying driver.
21549
21799
  */
21550
- runtimeState: BatteryStatusSchema
21800
+ runtimeState: BatteryStatusSchema,
21801
+ /**
21802
+ * 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.
21803
+ *
21804
+ * See `RuntimeStateDurability`. Enforced by
21805
+ * `scripts/check-runtime-state-durability.ts`.
21806
+ */
21807
+ durability: "restored",
21808
+ /** Clock fields: written, but excluded from the compare that decides
21809
+ * whether persisting is worth a SQLite commit. */
21810
+ volatileStateFields: ["lastUpdated"]
21551
21811
  };
21552
21812
  /**
21553
21813
  * Generic boolean sensor — last-resort fallback when no domain-
@@ -21576,7 +21836,17 @@ var binaryCapability = {
21576
21836
  schema: BinaryStatusSchema,
21577
21837
  kind: "push"
21578
21838
  },
21579
- runtimeState: BinaryStatusSchema
21839
+ runtimeState: BinaryStatusSchema,
21840
+ /**
21841
+ * Runtime-state durability: **restored** — transition-driven sensor state; the restored value gives the boot comparison.
21842
+ *
21843
+ * See `RuntimeStateDurability`. Enforced by
21844
+ * `scripts/check-runtime-state-durability.ts`.
21845
+ */
21846
+ durability: "restored",
21847
+ /** Clock fields: written, but excluded from the compare that decides
21848
+ * whether persisting is worth a SQLite commit. */
21849
+ volatileStateFields: ["lastChangedAt"]
21580
21850
  };
21581
21851
  /**
21582
21852
  * Dimmable-light brightness control. Co-exists with `switch` on the
@@ -21629,7 +21899,14 @@ onBrightnessChanged: { data: object({
21629
21899
  * by the kernel. Read via `device.state.brightness.value` so UI
21630
21900
  * sliders surface the current level without polling the provider.
21631
21901
  */
21632
- runtimeState: BrightnessStatusSchema
21902
+ runtimeState: BrightnessStatusSchema,
21903
+ /**
21904
+ * Runtime-state durability: **session** — live lamp state, re-published by the provider on connect.
21905
+ *
21906
+ * See `RuntimeStateDurability`. Enforced by
21907
+ * `scripts/check-runtime-state-durability.ts`.
21908
+ */
21909
+ durability: "session"
21633
21910
  };
21634
21911
  DeviceType.Button, method(object({ deviceId: number().int().nonnegative() }), _void(), {
21635
21912
  kind: "mutation",
@@ -21717,7 +21994,17 @@ var carbonMonoxideCapability = {
21717
21994
  schema: CarbonMonoxideStatusSchema,
21718
21995
  kind: "push"
21719
21996
  },
21720
- runtimeState: CarbonMonoxideStatusSchema
21997
+ runtimeState: CarbonMonoxideStatusSchema,
21998
+ /**
21999
+ * Runtime-state durability: **restored** — as `smoke`.
22000
+ *
22001
+ * See `RuntimeStateDurability`. Enforced by
22002
+ * `scripts/check-runtime-state-durability.ts`.
22003
+ */
22004
+ durability: "restored",
22005
+ /** Clock fields: written, but excluded from the compare that decides
22006
+ * whether persisting is worth a SQLite commit. */
22007
+ volatileStateFields: ["lastChangedAt"]
21721
22008
  };
21722
22009
  /**
21723
22010
  * HVAC / climate control cap. Models the full surface of a HA
@@ -21877,7 +22164,14 @@ var climateControlCapability = {
21877
22164
  * the full slice via `device.state.climate-control.value` and refresh
21878
22165
  * on every push without re-querying the provider.
21879
22166
  */
21880
- runtimeState: ClimateControlStatusSchema
22167
+ runtimeState: ClimateControlStatusSchema,
22168
+ /**
22169
+ * Runtime-state durability: **session** — as `brightness`; `currentTemp` moves continuously and is re-published on connect.
22170
+ *
22171
+ * See `RuntimeStateDurability`. Enforced by
22172
+ * `scripts/check-runtime-state-durability.ts`.
22173
+ */
22174
+ durability: "session"
21881
22175
  };
21882
22176
  /**
21883
22177
  * Color-light cap. Coexists with `switch` (on/off) and `brightness`
@@ -21987,7 +22281,14 @@ onColorChanged: { data: object({
21987
22281
  * kernel. Read via `device.state.color.value` so UI pickers surface
21988
22282
  * the current chromaticity without polling the provider.
21989
22283
  */
21990
- runtimeState: ColorStatusSchema
22284
+ runtimeState: ColorStatusSchema,
22285
+ /**
22286
+ * Runtime-state durability: **session** — as `brightness`.
22287
+ *
22288
+ * See `RuntimeStateDurability`. Enforced by
22289
+ * `scripts/check-runtime-state-durability.ts`.
22290
+ */
22291
+ durability: "session"
21991
22292
  };
21992
22293
  var ConnectionTestOutcomeSchema = discriminatedUnion("outcome", [
21993
22294
  object({
@@ -22045,7 +22346,17 @@ var connectivityCapability = {
22045
22346
  schema: ConnectivityStatusSchema,
22046
22347
  kind: "push"
22047
22348
  },
22048
- runtimeState: ConnectivityStatusSchema
22349
+ runtimeState: ConnectivityStatusSchema,
22350
+ /**
22351
+ * Runtime-state durability: **restored** — same shape and same argument as `device-status`, for links rather than devices.
22352
+ *
22353
+ * See `RuntimeStateDurability`. Enforced by
22354
+ * `scripts/check-runtime-state-durability.ts`.
22355
+ */
22356
+ durability: "restored",
22357
+ /** Clock fields: written, but excluded from the compare that decides
22358
+ * whether persisting is worth a SQLite commit. */
22359
+ volatileStateFields: ["lastChangedAt"]
22049
22360
  };
22050
22361
  /**
22051
22362
  * Generic device-consumables capability — surfaces a device's
@@ -22127,7 +22438,14 @@ reset: method(object({
22127
22438
  }
22128
22439
  }
22129
22440
  },
22130
- runtimeState: ConsumablesStatusSchema.extend({ lastFetchedAt: number() })
22441
+ runtimeState: ConsumablesStatusSchema.extend({ lastFetchedAt: number() }),
22442
+ /**
22443
+ * Runtime-state durability: **session** — the authority is the appliance; the provider re-reads the whole item array on connect.
22444
+ *
22445
+ * See `RuntimeStateDurability`. Enforced by
22446
+ * `scripts/check-runtime-state-durability.ts`.
22447
+ */
22448
+ durability: "session"
22131
22449
  };
22132
22450
  /**
22133
22451
  * Door / window / opening / garage / valve contact sensor. Boolean
@@ -22158,7 +22476,17 @@ var contactCapability = {
22158
22476
  schema: ContactStatusSchema,
22159
22477
  kind: "push"
22160
22478
  },
22161
- runtimeState: ContactStatusSchema
22479
+ runtimeState: ContactStatusSchema,
22480
+ /**
22481
+ * Runtime-state durability: **restored** — a door left open across a restart must still read open.
22482
+ *
22483
+ * See `RuntimeStateDurability`. Enforced by
22484
+ * `scripts/check-runtime-state-durability.ts`.
22485
+ */
22486
+ durability: "restored",
22487
+ /** Clock fields: written, but excluded from the compare that decides
22488
+ * whether persisting is worth a SQLite commit. */
22489
+ volatileStateFields: ["lastChangedAt"]
22162
22490
  };
22163
22491
  /**
22164
22492
  * Status slice — flat object (the framework's `runtimeState` contract
@@ -22264,7 +22592,14 @@ var controlCapability = {
22264
22592
  * dropdown / text field / date picker) read the slice's discriminant
22265
22593
  * and value directly without polling the provider.
22266
22594
  */
22267
- runtimeState: ControlStatusSchema
22595
+ runtimeState: ControlStatusSchema,
22596
+ /**
22597
+ * Runtime-state durability: **session** — a generic control mirrors an external entity that re-publishes on connect; the options array is re-derived with it.
22598
+ *
22599
+ * See `RuntimeStateDurability`. Enforced by
22600
+ * `scripts/check-runtime-state-durability.ts`.
22601
+ */
22602
+ durability: "session"
22268
22603
  };
22269
22604
  var CoverStatusSchema = object({
22270
22605
  /** Lifecycle state of the cover. */
@@ -22325,7 +22660,17 @@ var coverCapability = {
22325
22660
  * Runtime-state slice — mirrored by the kernel. UI controls watch
22326
22661
  * the slice for live position changes during a move.
22327
22662
  */
22328
- runtimeState: CoverStatusSchema
22663
+ runtimeState: CoverStatusSchema,
22664
+ /**
22665
+ * Runtime-state durability: **restored** — position survives a restart on the device; the mirror should agree at boot rather than read blank.
22666
+ *
22667
+ * See `RuntimeStateDurability`. Enforced by
22668
+ * `scripts/check-runtime-state-durability.ts`.
22669
+ */
22670
+ durability: "restored",
22671
+ /** Clock fields: written, but excluded from the compare that decides
22672
+ * whether persisting is worth a SQLite commit. */
22673
+ volatileStateFields: ["lastChangedAt"]
22329
22674
  };
22330
22675
  /**
22331
22676
  * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
@@ -22419,7 +22764,17 @@ var dayNightCapability = {
22419
22764
  schema: DayNightStatusSchema,
22420
22765
  kind: "poll"
22421
22766
  },
22422
- runtimeState: DayNightStatusSchema
22767
+ runtimeState: DayNightStatusSchema,
22768
+ /**
22769
+ * Runtime-state durability: **restored** — operator-set IR-cut behaviour; mutation-driven.
22770
+ *
22771
+ * See `RuntimeStateDurability`. Enforced by
22772
+ * `scripts/check-runtime-state-durability.ts`.
22773
+ */
22774
+ durability: "restored",
22775
+ /** Clock fields: written, but excluded from the compare that decides
22776
+ * whether persisting is worth a SQLite commit. */
22777
+ volatileStateFields: ["lastFetchedAt"]
22423
22778
  };
22424
22779
  /**
22425
22780
  * Generic device-level status snapshot. Auto-registered by `BaseDevice`
@@ -22466,7 +22821,17 @@ onStatusChanged: { data: object({
22466
22821
  schema: DeviceStatusSchema,
22467
22822
  kind: "push"
22468
22823
  },
22469
- runtimeState: DeviceStatusSchema
22824
+ runtimeState: DeviceStatusSchema,
22825
+ /**
22826
+ * 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.
22827
+ *
22828
+ * See `RuntimeStateDurability`. Enforced by
22829
+ * `scripts/check-runtime-state-durability.ts`.
22830
+ */
22831
+ durability: "restored",
22832
+ /** Clock fields: written, but excluded from the compare that decides
22833
+ * whether persisting is worth a SQLite commit. */
22834
+ volatileStateFields: ["lastChangedAt"]
22470
22835
  };
22471
22836
  /**
22472
22837
  * Doorbell button cap. Two kinds of providers coexist behind this cap
@@ -22528,7 +22893,14 @@ onPressed: { data: DoorbellPressEventSchema } },
22528
22893
  * `device.state.doorbell.value`. UIs can show "last ring 5m ago"
22529
22894
  * without subscribing.
22530
22895
  */
22531
- runtimeState: DoorbellStatusSchema
22896
+ runtimeState: DoorbellStatusSchema,
22897
+ /**
22898
+ * 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.
22899
+ *
22900
+ * See `RuntimeStateDurability`. Enforced by
22901
+ * `scripts/check-runtime-state-durability.ts`.
22902
+ */
22903
+ durability: "restored"
22532
22904
  };
22533
22905
  /**
22534
22906
  * Enum-state sensor — a string value picked from a finite option set.
@@ -22568,7 +22940,17 @@ var enumSensorCapability = {
22568
22940
  schema: EnumSensorStatusSchema,
22569
22941
  kind: "push"
22570
22942
  },
22571
- runtimeState: EnumSensorStatusSchema
22943
+ runtimeState: EnumSensorStatusSchema,
22944
+ /**
22945
+ * Runtime-state durability: **restored** — as `numeric-sensor`; 80 devices.
22946
+ *
22947
+ * See `RuntimeStateDurability`. Enforced by
22948
+ * `scripts/check-runtime-state-durability.ts`.
22949
+ */
22950
+ durability: "restored",
22951
+ /** Clock fields: written, but excluded from the compare that decides
22952
+ * whether persisting is worth a SQLite commit. */
22953
+ volatileStateFields: ["lastFetchedAt"]
22572
22954
  };
22573
22955
  /**
22574
22956
  * Generic stateless event emitter. Installed on a `DeviceType.EventEmitter`
@@ -22604,7 +22986,14 @@ var eventEmitterCapability = {
22604
22986
  schema: EventEmitterStatusSchema,
22605
22987
  kind: "push"
22606
22988
  },
22607
- runtimeState: EventEmitterStatusSchema
22989
+ runtimeState: EventEmitterStatusSchema,
22990
+ /**
22991
+ * Runtime-state durability: **session** — `eventCountSinceStart` names its own scope.
22992
+ *
22993
+ * See `RuntimeStateDurability`. Enforced by
22994
+ * `scripts/check-runtime-state-durability.ts`.
22995
+ */
22996
+ durability: "session"
22608
22997
  };
22609
22998
  var EventItemSchema = object({
22610
22999
  id: string(),
@@ -22911,7 +23300,14 @@ var fanControlCapability = {
22911
23300
  * Runtime-state slice — mirrored by the kernel. UI fan speed
22912
23301
  * sliders read `percentage` for live updates.
22913
23302
  */
22914
- runtimeState: FanControlStatusSchema
23303
+ runtimeState: FanControlStatusSchema,
23304
+ /**
23305
+ * Runtime-state durability: **session** — as `brightness`.
23306
+ *
23307
+ * See `RuntimeStateDurability`. Enforced by
23308
+ * `scripts/check-runtime-state-durability.ts`.
23309
+ */
23310
+ durability: "session"
22915
23311
  };
22916
23312
  /**
22917
23313
  * Per-device feature/identity probe slice. Holds the runtime-resolved
@@ -22987,7 +23383,14 @@ onProbeChanged: { data: object({
22987
23383
  schema: FeatureProbeStatusSchema,
22988
23384
  kind: "push"
22989
23385
  },
22990
- runtimeState: FeatureProbeStatusSchema
23386
+ runtimeState: FeatureProbeStatusSchema,
23387
+ /**
23388
+ * 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.
23389
+ *
23390
+ * See `RuntimeStateDurability`. Enforced by
23391
+ * `scripts/check-runtime-state-durability.ts`.
23392
+ */
23393
+ durability: "session"
22991
23394
  };
22992
23395
  /**
22993
23396
  * Water leak / moisture sensor. Boolean "is liquid currently
@@ -23014,7 +23417,17 @@ var floodCapability = {
23014
23417
  schema: FloodStatusSchema,
23015
23418
  kind: "push"
23016
23419
  },
23017
- runtimeState: FloodStatusSchema
23420
+ runtimeState: FloodStatusSchema,
23421
+ /**
23422
+ * Runtime-state durability: **restored** — as `smoke`.
23423
+ *
23424
+ * See `RuntimeStateDurability`. Enforced by
23425
+ * `scripts/check-runtime-state-durability.ts`.
23426
+ */
23427
+ durability: "restored",
23428
+ /** Clock fields: written, but excluded from the compare that decides
23429
+ * whether persisting is worth a SQLite commit. */
23430
+ volatileStateFields: ["lastChangedAt"]
23018
23431
  };
23019
23432
  /**
23020
23433
  * Combustible-gas (LPG / methane / hydrogen) alarm sensor. Drives
@@ -23037,7 +23450,17 @@ var gasCapability = {
23037
23450
  schema: GasStatusSchema,
23038
23451
  kind: "push"
23039
23452
  },
23040
- runtimeState: GasStatusSchema
23453
+ runtimeState: GasStatusSchema,
23454
+ /**
23455
+ * Runtime-state durability: **restored** — as `smoke`.
23456
+ *
23457
+ * See `RuntimeStateDurability`. Enforced by
23458
+ * `scripts/check-runtime-state-durability.ts`.
23459
+ */
23460
+ durability: "restored",
23461
+ /** Clock fields: written, but excluded from the compare that decides
23462
+ * whether persisting is worth a SQLite commit. */
23463
+ volatileStateFields: ["lastChangedAt"]
23041
23464
  };
23042
23465
  /**
23043
23466
  * Humidifier / dehumidifier cap. Models HA `humidifier.*` entities —
@@ -23113,7 +23536,14 @@ var humidifierCapability = {
23113
23536
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
23114
23537
  * slice for live humidity / mode changes.
23115
23538
  */
23116
- runtimeState: HumidifierStatusSchema
23539
+ runtimeState: HumidifierStatusSchema,
23540
+ /**
23541
+ * Runtime-state durability: **session** — as `climate-control`.
23542
+ *
23543
+ * See `RuntimeStateDurability`. Enforced by
23544
+ * `scripts/check-runtime-state-durability.ts`.
23545
+ */
23546
+ durability: "session"
23117
23547
  };
23118
23548
  /**
23119
23549
  * Single-metric humidity reading. Drives Home Assistant `sensor`
@@ -23149,7 +23579,17 @@ var humiditySensorCapability = {
23149
23579
  schema: HumiditySensorStatusSchema,
23150
23580
  kind: "push"
23151
23581
  },
23152
- runtimeState: HumiditySensorStatusSchema
23582
+ runtimeState: HumiditySensorStatusSchema,
23583
+ /**
23584
+ * Runtime-state durability: **restored** — as `numeric-sensor` (67 of 75 writes were the clock alone).
23585
+ *
23586
+ * See `RuntimeStateDurability`. Enforced by
23587
+ * `scripts/check-runtime-state-durability.ts`.
23588
+ */
23589
+ durability: "restored",
23590
+ /** Clock fields: written, but excluded from the compare that decides
23591
+ * whether persisting is worth a SQLite commit. */
23592
+ volatileStateFields: ["lastFetchedAt"]
23153
23593
  };
23154
23594
  /**
23155
23595
  * Image display cap. Models a single still image exposed by an integration —
@@ -23187,7 +23627,14 @@ var imageCapability = {
23187
23627
  * Runtime-state slice — mirrored by the kernel. The UI reads `url`
23188
23628
  * directly and renders the still image.
23189
23629
  */
23190
- runtimeState: ImageStatusSchema
23630
+ runtimeState: ImageStatusSchema,
23631
+ /**
23632
+ * Runtime-state durability: **session** — a snapshot URL is a session-scoped handle; a restored one points at nothing.
23633
+ *
23634
+ * See `RuntimeStateDurability`. Enforced by
23635
+ * `scripts/check-runtime-state-durability.ts`.
23636
+ */
23637
+ durability: "session"
23191
23638
  };
23192
23639
  /**
23193
23640
  * Vendor-neutral image / picture-adjustment cap — the per-camera config
@@ -23336,7 +23783,17 @@ var imageSettingsCapability = {
23336
23783
  schema: ImageSettingsStatusSchema,
23337
23784
  kind: "poll"
23338
23785
  },
23339
- runtimeState: ImageSettingsStatusSchema
23786
+ runtimeState: ImageSettingsStatusSchema,
23787
+ /**
23788
+ * Runtime-state durability: **restored** — operator-set camera imaging; mutation-driven.
23789
+ *
23790
+ * See `RuntimeStateDurability`. Enforced by
23791
+ * `scripts/check-runtime-state-durability.ts`.
23792
+ */
23793
+ durability: "restored",
23794
+ /** Clock fields: written, but excluded from the compare that decides
23795
+ * whether persisting is worth a SQLite commit. */
23796
+ volatileStateFields: ["lastFetchedAt"]
23340
23797
  };
23341
23798
  /**
23342
23799
  * integrations — system-scoped singleton capability for integration
@@ -23676,7 +24133,14 @@ var lawnMowerControlCapability = {
23676
24133
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
23677
24134
  * slice for live activity + battery changes.
23678
24135
  */
23679
- runtimeState: LawnMowerControlStatusSchema
24136
+ runtimeState: LawnMowerControlStatusSchema,
24137
+ /**
24138
+ * Runtime-state durability: **session** — as `vacuum-control`.
24139
+ *
24140
+ * See `RuntimeStateDurability`. Enforced by
24141
+ * `scripts/check-runtime-state-durability.ts`.
24142
+ */
24143
+ durability: "session"
23680
24144
  };
23681
24145
  /**
23682
24146
  * local-network — hub-only singleton.
@@ -23882,7 +24346,17 @@ var lockControlCapability = {
23882
24346
  * read `state` and disable themselves during `locking`/`unlocking`
23883
24347
  * transitions.
23884
24348
  */
23885
- runtimeState: LockControlStatusSchema
24349
+ runtimeState: LockControlStatusSchema,
24350
+ /**
24351
+ * Runtime-state durability: **restored** — a lock left locked must still read locked.
24352
+ *
24353
+ * See `RuntimeStateDurability`. Enforced by
24354
+ * `scripts/check-runtime-state-durability.ts`.
24355
+ */
24356
+ durability: "restored",
24357
+ /** Clock fields: written, but excluded from the compare that decides
24358
+ * whether persisting is worth a SQLite commit. */
24359
+ volatileStateFields: ["lastChangedAt"]
23886
24360
  };
23887
24361
  /**
23888
24362
  * Media-player cap. Models HA `media_player.*` (Sonos, Chromecast,
@@ -24044,7 +24518,14 @@ var mediaPlayerCapability = {
24044
24518
  * full slice for live now-playing, volume, and progress updates
24045
24519
  * without polling.
24046
24520
  */
24047
- runtimeState: MediaPlayerStatusSchema
24521
+ runtimeState: MediaPlayerStatusSchema,
24522
+ /**
24523
+ * Runtime-state durability: **session** — a restored transport position describes a playback that stopped when the hub did.
24524
+ *
24525
+ * See `RuntimeStateDurability`. Enforced by
24526
+ * `scripts/check-runtime-state-durability.ts`.
24527
+ */
24528
+ durability: "session"
24048
24529
  };
24049
24530
  /**
24050
24531
  * mesh-network — collection cap for mesh-VPN providers.
@@ -24308,7 +24789,14 @@ onMotionChanged: { data: MotionOnMotionChangedDataSchema } },
24308
24789
  * `device.state.motion.value`. Reads never invoke the provider, so
24309
24790
  * UIs and other addons can poll the cached state safely.
24310
24791
  */
24311
- runtimeState: MotionStatusSchema
24792
+ runtimeState: MotionStatusSchema,
24793
+ /**
24794
+ * 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.
24795
+ *
24796
+ * See `RuntimeStateDurability`. Enforced by
24797
+ * `scripts/check-runtime-state-durability.ts`.
24798
+ */
24799
+ durability: "session"
24312
24800
  };
24313
24801
  /**
24314
24802
  * Motion-trigger toggle for accessory devices.
@@ -24373,7 +24861,14 @@ var motionTriggerCapability = {
24373
24861
  schema: MotionTriggerStatusSchema,
24374
24862
  kind: "command-driven"
24375
24863
  },
24376
- runtimeState: MotionTriggerRuntimeStateSchema
24864
+ runtimeState: MotionTriggerRuntimeStateSchema,
24865
+ /**
24866
+ * 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.
24867
+ *
24868
+ * See `RuntimeStateDurability`. Enforced by
24869
+ * `scripts/check-runtime-state-durability.ts`.
24870
+ */
24871
+ durability: "session"
24377
24872
  };
24378
24873
  /**
24379
24874
  * Motion-zones share the same MaskShape vocabulary as privacy-mask — the
@@ -24440,7 +24935,17 @@ var motionZonesCapability = {
24440
24935
  schema: MotionZoneStatusSchema,
24441
24936
  kind: "poll"
24442
24937
  },
24443
- runtimeState: MotionZoneStatusSchema
24938
+ runtimeState: MotionZoneStatusSchema,
24939
+ /**
24940
+ * 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.
24941
+ *
24942
+ * See `RuntimeStateDurability`. Enforced by
24943
+ * `scripts/check-runtime-state-durability.ts`.
24944
+ */
24945
+ durability: "restored",
24946
+ /** Clock fields: written, but excluded from the compare that decides
24947
+ * whether persisting is worth a SQLite commit. */
24948
+ volatileStateFields: ["lastFetchedAt"]
24444
24949
  };
24445
24950
  /**
24446
24951
  * On-camera AI object detection cap. Surfaces per-device the classes
@@ -24514,7 +25019,17 @@ var nativeObjectDetectionCapability = {
24514
25019
  schema: NativeObjectDetectionStatusSchema,
24515
25020
  kind: "push"
24516
25021
  },
24517
- runtimeState: NativeObjectDetectionRuntimeStateSchema
25022
+ runtimeState: NativeObjectDetectionRuntimeStateSchema,
25023
+ /**
25024
+ * 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.
25025
+ *
25026
+ * See `RuntimeStateDurability`. Enforced by
25027
+ * `scripts/check-runtime-state-durability.ts`.
25028
+ */
25029
+ durability: "restored",
25030
+ /** Clock fields: written, but excluded from the compare that decides
25031
+ * whether persisting is worth a SQLite commit. */
25032
+ volatileStateFields: ["lastFetchedAt"]
24518
25033
  };
24519
25034
  /**
24520
25035
  * network-quality — system-scoped singleton capability tracking RTT,
@@ -24848,7 +25363,14 @@ onSent: { data: object({
24848
25363
  * form reads `supports` to gate optional fields; history pane reads
24849
25364
  * `lastSentAt` / `lastError` / `queueDepth`.
24850
25365
  */
24851
- runtimeState: NotifierStatusSchema
25366
+ runtimeState: NotifierStatusSchema,
25367
+ /**
25368
+ * Runtime-state durability: **session** — live queue depth and last-send state; a restored queue depth describes a queue that no longer exists.
25369
+ *
25370
+ * See `RuntimeStateDurability`. Enforced by
25371
+ * `scripts/check-runtime-state-durability.ts`.
25372
+ */
25373
+ durability: "session"
24852
25374
  };
24853
25375
  /**
24854
25376
  * Generic numeric sensor — last-resort fallback when no typed numeric
@@ -24891,7 +25413,17 @@ var numericSensorCapability = {
24891
25413
  schema: NumericSensorStatusSchema,
24892
25414
  kind: "push"
24893
25415
  },
24894
- runtimeState: NumericSensorStatusSchema
25416
+ runtimeState: NumericSensorStatusSchema,
25417
+ /**
25418
+ * 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.
25419
+ *
25420
+ * See `RuntimeStateDurability`. Enforced by
25421
+ * `scripts/check-runtime-state-durability.ts`.
25422
+ */
25423
+ durability: "restored",
25424
+ /** Clock fields: written, but excluded from the compare that decides
25425
+ * whether persisting is worth a SQLite commit. */
25426
+ volatileStateFields: ["lastFetchedAt"]
24895
25427
  };
24896
25428
  /**
24897
25429
  * Generic on-screen-display (video overlay) cap. Each camera exposes
@@ -25276,7 +25808,14 @@ var petFeederCapability = {
25276
25808
  * the full slice via `device.state.petFeeder.value` and refresh on
25277
25809
  * every poll without re-querying the provider.
25278
25810
  */
25279
- runtimeState: PetFeederStatusSchema
25811
+ runtimeState: PetFeederStatusSchema,
25812
+ /**
25813
+ * Runtime-state durability: **session** — live appliance state re-published on connect.
25814
+ *
25815
+ * See `RuntimeStateDurability`. Enforced by
25816
+ * `scripts/check-runtime-state-durability.ts`.
25817
+ */
25818
+ durability: "session"
25280
25819
  };
25281
25820
  var VehicleSchema = object({
25282
25821
  id: string(),
@@ -25622,7 +26161,17 @@ var powerMeterCapability = {
25622
26161
  schema: PowerMeterStatusSchema,
25623
26162
  kind: "push"
25624
26163
  },
25625
- runtimeState: PowerMeterStatusSchema
26164
+ runtimeState: PowerMeterStatusSchema,
26165
+ /**
26166
+ * Runtime-state durability: **restored** — as `numeric-sensor`; `kwhTotal` is an accumulator whose restored value is the baseline.
26167
+ *
26168
+ * See `RuntimeStateDurability`. Enforced by
26169
+ * `scripts/check-runtime-state-durability.ts`.
26170
+ */
26171
+ durability: "restored",
26172
+ /** Clock fields: written, but excluded from the compare that decides
26173
+ * whether persisting is worth a SQLite commit. */
26174
+ volatileStateFields: ["lastFetchedAt"]
25626
26175
  };
25627
26176
  /**
25628
26177
  * Presence cap. Models HA `person.*` and `device_tracker.*` entities
@@ -25679,7 +26228,17 @@ var presenceCapability = {
25679
26228
  * the map pin is rendered (use `DeviceFeature.PresenceGps` for the
25680
26229
  * pre-fetch fast-path check).
25681
26230
  */
25682
- runtimeState: PresenceStatusSchema
26231
+ runtimeState: PresenceStatusSchema,
26232
+ /**
26233
+ * Runtime-state durability: **restored** — occupancy-relevant: the restored state is what an occupancy rule compares the first post-restart observation against.
26234
+ *
26235
+ * See `RuntimeStateDurability`. Enforced by
26236
+ * `scripts/check-runtime-state-durability.ts`.
26237
+ */
26238
+ durability: "restored",
26239
+ /** Clock fields: written, but excluded from the compare that decides
26240
+ * whether persisting is worth a SQLite commit. */
26241
+ volatileStateFields: ["lastChangedAt"]
25683
26242
  };
25684
26243
  /**
25685
26244
  * Atmospheric pressure reading in hectopascals. Drives Home Assistant
@@ -25715,7 +26274,17 @@ var pressureSensorCapability = {
25715
26274
  schema: PressureSensorStatusSchema,
25716
26275
  kind: "push"
25717
26276
  },
25718
- runtimeState: PressureSensorStatusSchema
26277
+ runtimeState: PressureSensorStatusSchema,
26278
+ /**
26279
+ * Runtime-state durability: **restored** — as `numeric-sensor`.
26280
+ *
26281
+ * See `RuntimeStateDurability`. Enforced by
26282
+ * `scripts/check-runtime-state-durability.ts`.
26283
+ */
26284
+ durability: "restored",
26285
+ /** Clock fields: written, but excluded from the compare that decides
26286
+ * whether persisting is worth a SQLite commit. */
26287
+ volatileStateFields: ["lastFetchedAt"]
25719
26288
  };
25720
26289
  /**
25721
26290
  * PRIVACY — what the camera deliberately does not capture. Two planes:
@@ -25845,7 +26414,17 @@ var privacyMaskCapability = {
25845
26414
  schema: PrivacyMaskStatusSchema,
25846
26415
  kind: "poll"
25847
26416
  },
25848
- runtimeState: PrivacyMaskStatusSchema
26417
+ runtimeState: PrivacyMaskStatusSchema,
26418
+ /**
26419
+ * Runtime-state durability: **restored** — operator-drawn regions, zero real churn — 22 writes in 25 minutes, every one of them the clock.
26420
+ *
26421
+ * See `RuntimeStateDurability`. Enforced by
26422
+ * `scripts/check-runtime-state-durability.ts`.
26423
+ */
26424
+ durability: "restored",
26425
+ /** Clock fields: written, but excluded from the compare that decides
26426
+ * whether persisting is worth a SQLite commit. */
26427
+ volatileStateFields: ["lastFetchedAt"]
25849
26428
  };
25850
26429
  var PtzPresetSchema = object({
25851
26430
  id: string(),
@@ -26011,7 +26590,14 @@ var ptzAutotrackCapability = {
26011
26590
  * fetch / cache / fallback logic out of the four cap methods —
26012
26591
  * they become trampolines over `runtimeState`.
26013
26592
  */
26014
- runtimeState: PtzAutotrackRuntimeStateSchema
26593
+ runtimeState: PtzAutotrackRuntimeStateSchema,
26594
+ /**
26595
+ * Runtime-state durability: **session** — mirrors the camera's own autotrack config, re-read on connect.
26596
+ *
26597
+ * See `RuntimeStateDurability`. Enforced by
26598
+ * `scripts/check-runtime-state-durability.ts`.
26599
+ */
26600
+ durability: "session"
26015
26601
  };
26016
26602
  DeviceType.Camera, DeviceType.Sensor, DeviceType.Switch, method(object({ deviceId: number().int().nonnegative() }), object({ success: literal(true) }), {
26017
26603
  kind: "mutation",
@@ -26680,7 +27266,14 @@ var sceneMonitorCapability = {
26680
27266
  schema: SceneMonitorStatusSchema,
26681
27267
  kind: "push"
26682
27268
  },
26683
- runtimeState: SceneMonitorStatusSchema
27269
+ runtimeState: SceneMonitorStatusSchema,
27270
+ /**
27271
+ * Runtime-state durability: **session** — re-derived from the current scene on the next evaluation.
27272
+ *
27273
+ * See `RuntimeStateDurability`. Enforced by
27274
+ * `scripts/check-runtime-state-durability.ts`.
27275
+ */
27276
+ durability: "session"
26684
27277
  };
26685
27278
  /**
26686
27279
  * Per-stage gating mode applied to the zones a rule references.
@@ -26824,7 +27417,14 @@ var scriptRunnerCapability = {
26824
27417
  * `isRunning` to render a spinner during execution and surfaces
26825
27418
  * `lastError` / `lastRunSuccess` in the recent-runs panel.
26826
27419
  */
26827
- runtimeState: ScriptRunnerStatusSchema
27420
+ runtimeState: ScriptRunnerStatusSchema,
27421
+ /**
27422
+ * Runtime-state durability: **session** — a restored `isRunning: true` describes a process that died with the previous hub.
27423
+ *
27424
+ * See `RuntimeStateDurability`. Enforced by
27425
+ * `scripts/check-runtime-state-durability.ts`.
27426
+ */
27427
+ durability: "session"
26828
27428
  };
26829
27429
  /**
26830
27430
  * Smoke alarm sensor — boolean "is smoke currently detected" with
@@ -26851,7 +27451,17 @@ var smokeCapability = {
26851
27451
  schema: SmokeStatusSchema,
26852
27452
  kind: "push"
26853
27453
  },
26854
- runtimeState: SmokeStatusSchema
27454
+ runtimeState: SmokeStatusSchema,
27455
+ /**
27456
+ * Runtime-state durability: **restored** — a safety sensor must not read "clear" merely because the hub restarted.
27457
+ *
27458
+ * See `RuntimeStateDurability`. Enforced by
27459
+ * `scripts/check-runtime-state-durability.ts`.
27460
+ */
27461
+ durability: "restored",
27462
+ /** Clock fields: written, but excluded from the compare that decides
27463
+ * whether persisting is worth a SQLite commit. */
27464
+ volatileStateFields: ["lastChangedAt"]
26855
27465
  };
26856
27466
  /**
26857
27467
  * One publishable camera stream as its OWNING PROVIDER describes it — the same
@@ -27024,7 +27634,17 @@ var streamParamsCapability = {
27024
27634
  schema: StreamParamsStatusSchema,
27025
27635
  kind: "poll"
27026
27636
  },
27027
- runtimeState: StreamParamsStatusSchema
27637
+ runtimeState: StreamParamsStatusSchema,
27638
+ /**
27639
+ * Runtime-state durability: **restored** — operator-set encoder profile; mutation-driven.
27640
+ *
27641
+ * See `RuntimeStateDurability`. Enforced by
27642
+ * `scripts/check-runtime-state-durability.ts`.
27643
+ */
27644
+ durability: "restored",
27645
+ /** Clock fields: written, but excluded from the compare that decides
27646
+ * whether persisting is worth a SQLite commit. */
27647
+ volatileStateFields: ["lastFetchedAt"]
27028
27648
  };
27029
27649
  /**
27030
27650
  * Generic on/off switch cap for accessory children (siren, floodlight,
@@ -27070,6 +27690,16 @@ var switchCapability = {
27070
27690
  * not need to re-query the provider after a setState mutation.
27071
27691
  */
27072
27692
  runtimeState: SwitchStatusSchema,
27693
+ /**
27694
+ * Runtime-state durability: **restored** — device state an operator reads as authoritative; 55 devices, transition-driven.
27695
+ *
27696
+ * See `RuntimeStateDurability`. Enforced by
27697
+ * `scripts/check-runtime-state-durability.ts`.
27698
+ */
27699
+ durability: "restored",
27700
+ /** Clock fields: written, but excluded from the compare that decides
27701
+ * whether persisting is worth a SQLite commit. */
27702
+ volatileStateFields: ["lastChangedAt"],
27073
27703
  settings: { bindings: [{
27074
27704
  kind: "scalar",
27075
27705
  statusPath: "on",
@@ -27149,7 +27779,17 @@ var tamperCapability = {
27149
27779
  schema: TamperStatusSchema,
27150
27780
  kind: "push"
27151
27781
  },
27152
- runtimeState: TamperStatusSchema
27782
+ runtimeState: TamperStatusSchema,
27783
+ /**
27784
+ * Runtime-state durability: **restored** — as `smoke`.
27785
+ *
27786
+ * See `RuntimeStateDurability`. Enforced by
27787
+ * `scripts/check-runtime-state-durability.ts`.
27788
+ */
27789
+ durability: "restored",
27790
+ /** Clock fields: written, but excluded from the compare that decides
27791
+ * whether persisting is worth a SQLite commit. */
27792
+ volatileStateFields: ["lastChangedAt"]
27153
27793
  };
27154
27794
  /**
27155
27795
  * Single-metric temperature reading. Drives Home Assistant `sensor`
@@ -27194,7 +27834,17 @@ var temperatureSensorCapability = {
27194
27834
  schema: TemperatureSensorStatusSchema,
27195
27835
  kind: "push"
27196
27836
  },
27197
- runtimeState: TemperatureSensorStatusSchema
27837
+ runtimeState: TemperatureSensorStatusSchema,
27838
+ /**
27839
+ * Runtime-state durability: **restored** — as `numeric-sensor` (69 of 125 writes were the clock alone).
27840
+ *
27841
+ * See `RuntimeStateDurability`. Enforced by
27842
+ * `scripts/check-runtime-state-durability.ts`.
27843
+ */
27844
+ durability: "restored",
27845
+ /** Clock fields: written, but excluded from the compare that decides
27846
+ * whether persisting is worth a SQLite commit. */
27847
+ volatileStateFields: ["lastFetchedAt"]
27198
27848
  };
27199
27849
  /**
27200
27850
  * toast — system-scoped singleton capability that streams toast
@@ -27263,7 +27913,14 @@ var updateCapability = {
27263
27913
  schema: UpdateStatusSchema,
27264
27914
  kind: "poll"
27265
27915
  },
27266
- runtimeState: UpdateStatusSchema
27916
+ runtimeState: UpdateStatusSchema,
27917
+ /**
27918
+ * Runtime-state durability: **session** — a restored `inProgress: true` describes an update that is no longer running; versions are re-probed at boot.
27919
+ *
27920
+ * See `RuntimeStateDurability`. Enforced by
27921
+ * `scripts/check-runtime-state-durability.ts`.
27922
+ */
27923
+ durability: "session"
27267
27924
  };
27268
27925
  var UserSummarySchema = object({
27269
27926
  id: string(),
@@ -27597,7 +28254,14 @@ var vacuumControlCapability = {
27597
28254
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
27598
28255
  * slice for live state + battery + fan-speed changes.
27599
28256
  */
27600
- runtimeState: VacuumControlStatusSchema
28257
+ runtimeState: VacuumControlStatusSchema,
28258
+ /**
28259
+ * Runtime-state durability: **session** — as `media-player` — a restored `state: cleaning` is a robot that is not cleaning.
28260
+ *
28261
+ * See `RuntimeStateDurability`. Enforced by
28262
+ * `scripts/check-runtime-state-durability.ts`.
28263
+ */
28264
+ durability: "session"
27601
28265
  };
27602
28266
  var ValveStatusSchema = object({
27603
28267
  /** Lifecycle state of the valve. */
@@ -27649,7 +28313,14 @@ var valveCapability = {
27649
28313
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
27650
28314
  * slice for live position changes during a move.
27651
28315
  */
27652
- runtimeState: ValveStatusSchema
28316
+ runtimeState: ValveStatusSchema,
28317
+ /**
28318
+ * Runtime-state durability: **session** — as `brightness`.
28319
+ *
28320
+ * See `RuntimeStateDurability`. Enforced by
28321
+ * `scripts/check-runtime-state-durability.ts`.
28322
+ */
28323
+ durability: "session"
27653
28324
  };
27654
28325
  /**
27655
28326
  * Vibration / shake / impact sensor. Drives Home Assistant
@@ -27671,7 +28342,17 @@ var vibrationCapability = {
27671
28342
  schema: VibrationStatusSchema,
27672
28343
  kind: "push"
27673
28344
  },
27674
- runtimeState: VibrationStatusSchema
28345
+ runtimeState: VibrationStatusSchema,
28346
+ /**
28347
+ * Runtime-state durability: **restored** — as `smoke`.
28348
+ *
28349
+ * See `RuntimeStateDurability`. Enforced by
28350
+ * `scripts/check-runtime-state-durability.ts`.
28351
+ */
28352
+ durability: "restored",
28353
+ /** Clock fields: written, but excluded from the compare that decides
28354
+ * whether persisting is worth a SQLite commit. */
28355
+ volatileStateFields: ["lastChangedAt"]
27675
28356
  };
27676
28357
  /**
27677
28358
  * Water heater / boiler cap. Models HA `water_heater.*` entities — a
@@ -27745,7 +28426,14 @@ var waterHeaterCapability = {
27745
28426
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
27746
28427
  * slice for live temperature / mode / away changes.
27747
28428
  */
27748
- runtimeState: WaterHeaterStatusSchema
28429
+ runtimeState: WaterHeaterStatusSchema,
28430
+ /**
28431
+ * Runtime-state durability: **session** — as `climate-control`.
28432
+ *
28433
+ * See `RuntimeStateDurability`. Enforced by
28434
+ * `scripts/check-runtime-state-durability.ts`.
28435
+ */
28436
+ durability: "session"
27749
28437
  };
27750
28438
  /**
27751
28439
  * Weather provider cap. Models HA `weather.*` entities — a read-only
@@ -27804,7 +28492,14 @@ var weatherCapability = {
27804
28492
  * Runtime-state slice — mirrored by the kernel. The UI reads the
27805
28493
  * current conditions directly from the slice on each weather push.
27806
28494
  */
27807
- runtimeState: WeatherStatusSchema
28495
+ runtimeState: WeatherStatusSchema,
28496
+ /**
28497
+ * Runtime-state durability: **session** — a forecast is stale the moment the hub is down; the provider re-fetches on connect.
28498
+ *
28499
+ * See `RuntimeStateDurability`. Enforced by
28500
+ * `scripts/check-runtime-state-durability.ts`.
28501
+ */
28502
+ durability: "session"
27808
28503
  };
27809
28504
  /**
27810
28505
  * Per-zone occupancy aggregation produced by the analytics frame
@@ -27966,7 +28661,14 @@ var zoneAnalyticsCapability = {
27966
28661
  * automatically; the explicit `getCurrentSnapshot` cap method is
27967
28662
  * still useful for one-off polls without a subscription.
27968
28663
  */
27969
- runtimeState: CameraOccupancySnapshotSchema
28664
+ runtimeState: CameraOccupancySnapshotSchema,
28665
+ /**
28666
+ * Runtime-state durability: **session** — per-frame analytics; with `audio-metrics` it is ~90 % of the offered write rate. Re-derived on the next frame.
28667
+ *
28668
+ * See `RuntimeStateDurability`. Enforced by
28669
+ * `scripts/check-runtime-state-durability.ts`.
28670
+ */
28671
+ durability: "session"
27970
28672
  };
27971
28673
  /**
27972
28674
  * Stages a {@link ZoneRule} can apply to. Discriminator on the rules
@@ -28044,7 +28746,14 @@ var zoneRulesCapability = {
28044
28746
  motion: array(ZoneRuleSchema).readonly(),
28045
28747
  detection: array(ZoneRuleSchema).readonly(),
28046
28748
  package: array(ZoneRuleSchema).readonly()
28047
- })
28749
+ }),
28750
+ /**
28751
+ * Runtime-state durability: **restored** — operator intent, mutation-only, same argument as `zones`.
28752
+ *
28753
+ * See `RuntimeStateDurability`. Enforced by
28754
+ * `scripts/check-runtime-state-durability.ts`.
28755
+ */
28756
+ durability: "restored"
28048
28757
  };
28049
28758
  /**
28050
28759
  * Most specific first. Extending this list is how a new device kind becomes
@@ -34784,6 +35493,7 @@ Object.freeze({
34784
35493
  "network-access": "ingress",
34785
35494
  "smtp-provider": "email"
34786
35495
  });
35496
+ new Map(AUDIO_MACRO_LABELS.flatMap((macro) => macro.icon === void 0 ? [] : [[macro.id, macro.icon]]));
34787
35497
  new Set(["devices", "classes"]);
34788
35498
  var WEEKDAY_TO_DAY = {
34789
35499
  Sun: 0,
@@ -35327,4 +36037,4 @@ function vectorDimFromBase64(encoded) {
35327
36037
  return Math.floor(Buffer.from(encoded, "base64").byteLength / 4);
35328
36038
  }
35329
36039
  //#endregion
35330
- export { zoneAnalyticsCapability as $, addonWidgetsSourceCapability as A, encodeVectorBase64 as B, RECORDING_EXPORT_MAX_READ_BYTES as C, TimelapseRulePatchSchema as D, TimelapseRuleInputSchema as E, cosineSimilarity as F, notificationRulesCapability as G, hfModelUrl as H, customAction as I, readDeviceStateFrom as J, pipelineAnalyticsCapability as K, defineCustomActions as L, assertTimelapseCadences as M, audioMetricsCapability as N, TimelapseRuleSchema as O, buildEventKindDescriptor as P, videoclipsCapability as Q, deriveRecordingMode as R, OpsLogEntrySchema as S, TIMELAPSE_DENSE_FLOOR_SEC as T, isScheduleActive as U, faceGalleryCapability as V, kebabToCamel as W, subKindsOf as X, readTimelapseGeneratedAt as Y, vectorDimFromBase64 as Z, NcScheduleSchema as _, string as _t, DeclaredDevices as a, isDeviceScopedCap as at, NcSnoozeSuppressedSchema as b, LabelAttributionSchema as c, _enum as ct, NC_TAXONOMY as d, discriminatedUnion as dt, errMsg as et, NcConditionDescriptorSchema as f, literal as ft, NcRuleTargetSchema as g, record as gt, NcRuleSchema as h, partialRecord as ht, DETECTION_PIPELINE_CAP_NAME as i, hydrateSchema as it, alarmPanelCapability as j, TrackSourceSchema as k, MACRO_LABELS as l, array as lt, NcRulePatchSchema as m, object as mt, DEFAULT_EVENT_COLOR as n, DeviceType as nt, EVENT_KIND_BY_CAP as o, nodePin as ot, NcRuleInputSchema as p, number as pt, plateGalleryCapability as q, DEFAULT_TIMELAPSE_PREVIEW_TEXT as r, createEvent as rt, EVENT_PAD_MS as s, sleep as st, BaseDevice as t, BaseAddon as tt, NC_CONDITION_CATALOG as u, boolean as ut, NcSnoozeInputSchema as v, unknown as vt, RetrainStatusSchema as w, NcTaxonomySchema as x, NcSnoozeSchema as y, EventCategory as yt, embeddingEncoderCapability as z };
36040
+ export { readDeviceStateFrom as $, TimelapseRuleInputSchema as A, customAction as B, NcSnoozeSchema as C, unknown as Ct, RECORDING_EXPORT_MAX_READ_BYTES as D, OpsLogEntrySchema as E, alarmPanelCapability as F, faceGalleryCapability as G, deriveRecordingMode as H, assertTimelapseCadences as I, isScheduleActive as J, hfModelUrl as K, audioMetricsCapability as L, TimelapseRuleSchema as M, TrackSourceSchema as N, RetrainStatusSchema as O, addonWidgetsSourceCapability as P, plateGalleryCapability as Q, buildEventKindDescriptor as R, NcSnoozeInputSchema as S, string as St, NcTaxonomySchema as T, embeddingEncoderCapability as U, defineCustomActions as V, encodeVectorBase64 as W, notificationRulesCapability as X, kebabToCamel as Y, pipelineAnalyticsCapability as Z, NcRuleInputSchema as _, literal as _t, DETECTION_PIPELINE_CAP_NAME as a, errMsg as at, NcRuleTargetSchema as b, partialRecord as bt, EVENT_PAD_MS as c, createEvent as ct, NC_ALARM_SYSTEM_EVENT_KINDS as d, nodePin as dt, readTimelapseGeneratedAt as et, NC_CONDITION_CATALOG as f, sleep as ft, NcConditionDescriptorSchema as g, discriminatedUnion as gt, NC_TAXONOMY as h, boolean as ht, DETECTION_MACRO_CLASSES as i, zoneAnalyticsCapability as it, TimelapseRulePatchSchema as j, TIMELAPSE_DENSE_FLOOR_SEC as k, LabelAttributionSchema as l, hydrateSchema as lt, NC_SNOOZE_MAX_MINUTES as m, array as mt, DEFAULT_EVENT_COLOR as n, vectorDimFromBase64 as nt, DeclaredDevices as o, BaseAddon as ot, NC_DEFAULT_SNOOZE_MINUTES as p, _enum as pt, isDetectionMacroClass as q, DEFAULT_TIMELAPSE_PREVIEW_TEXT as r, videoclipsCapability as rt, EVENT_KIND_BY_CAP as s, DeviceType as st, BaseDevice as t, subKindsOf as tt, MACRO_LABELS as u, isDeviceScopedCap as ut, NcRulePatchSchema as v, number as vt, NcSnoozeSuppressedSchema as w, EventCategory as wt, NcScheduleSchema as x, record as xt, NcRuleSchema as y, object as yt, cosineSimilarity as z };