@camstack/addon-provider-dreame 0.2.15 → 0.2.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/addon.js +732 -77
  2. package/dist/addon.mjs +732 -77
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -61276,7 +61276,14 @@ var cameraStreamsCapability = {
61276
61276
  low: string().optional()
61277
61277
  }),
61278
61278
  lastChangedAt: number()
61279
- })
61279
+ }),
61280
+ /**
61281
+ * 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.
61282
+ *
61283
+ * See `RuntimeStateDurability`. Enforced by
61284
+ * `scripts/check-runtime-state-durability.ts`.
61285
+ */
61286
+ durability: "session"
61280
61287
  };
61281
61288
  /** Where a block runs. The operator chooses — a block driving a device on an
61282
61289
  * agent is the reason placement is not fixed to the hub. */
@@ -61837,6 +61844,13 @@ var deviceDiscoveryCapability = {
61837
61844
  kind: "poll"
61838
61845
  },
61839
61846
  runtimeState: DeviceDiscoveryStatusSchema.extend({ lastFetchedAt: number().int().nonnegative() }),
61847
+ /**
61848
+ * Runtime-state durability: **session** — 5.7 KB of scan output on the largest device, fully re-derivable by re-scanning.
61849
+ *
61850
+ * See `RuntimeStateDurability`. Enforced by
61851
+ * `scripts/check-runtime-state-durability.ts`.
61852
+ */
61853
+ durability: "session",
61840
61854
  methods: {
61841
61855
  /**
61842
61856
  * Snapshot of the current `discovered` list. Returns the
@@ -63723,11 +63737,33 @@ var NotificationFormatSchema = _enum([
63723
63737
  * Named by INTENT, never by glyph. "check" would tie the vocabulary to one
63724
63738
  * renderer's icon set; "acknowledge" survives an adapter that draws it
63725
63739
  * differently.
63740
+ *
63741
+ * ── A TOKEN IS NOT A WIRE VALUE ─────────────────────────────────────
63742
+ *
63743
+ * These names are for US. **No adapter may forward one verbatim.** Each maps
63744
+ * the whole set onto its own renderer's vocabulary through a
63745
+ * `Record<NotificationActionIcon, string>` — a Record, never a lookup with a
63746
+ * fallback, so adding a member here fails every adapter's build until someone
63747
+ * decides its glyph, which is the only place that decision can be made
63748
+ * honestly.
63749
+ *
63750
+ * This paragraph is the bug. Zentik declared `actionIcons: true` and passed
63751
+ * `disarm` straight through; iOS feeds that string to
63752
+ * `UNNotificationActionIcon(systemImageName:)`, `disarm` is not an SF Symbol,
63753
+ * and every snooze and alarm button arrived BLANK. A pass-through is not a
63754
+ * mapping, and "the field is documented" is not "the value renders".
63755
+ *
63756
+ * Adding a member is TRAIN-BOUND. The enum lives in the published
63757
+ * `@camstack/server` closure and the cap seam validates against the HUB's copy,
63758
+ * so an addon that emits a token the running hub does not know does not lose an
63759
+ * icon — its whole `send` fails Zod validation and the notification never
63760
+ * arrives. Never emit a new token from an addon before the train carrying it.
63726
63761
  */
63727
63762
  var NotificationActionIconSchema = _enum([
63728
63763
  "acknowledge",
63729
63764
  "dismiss",
63730
63765
  "silence",
63766
+ "snooze",
63731
63767
  "view",
63732
63768
  "play",
63733
63769
  "open",
@@ -63735,9 +63771,13 @@ var NotificationActionIconSchema = _enum([
63735
63771
  "lock",
63736
63772
  "unlock",
63737
63773
  "arm",
63774
+ "arm-home",
63775
+ "arm-away",
63776
+ "arm-night",
63738
63777
  "disarm",
63739
63778
  "light",
63740
- "alert"
63779
+ "alert",
63780
+ "camera"
63741
63781
  ]);
63742
63782
  /** A single tap-through action button. */
63743
63783
  var NotificationActionSchema = object({
@@ -63753,7 +63793,23 @@ var NotificationActionSchema = object({
63753
63793
  * else — see `notification-center/action-token.ts` for what that does and
63754
63794
  * does not buy.
63755
63795
  */
63756
- destructive: boolean().optional()
63796
+ destructive: boolean().optional(),
63797
+ /**
63798
+ * How the tap should REACH the url.
63799
+ *
63800
+ * `navigate` (absent, and every button authored before this field) opens it:
63801
+ * the phone leaves the notification and shows whatever the callback returns.
63802
+ * That is right for a button whose answer the operator wants to read.
63803
+ *
63804
+ * `background` fires it as a POST and stays put. It exists for the buttons
63805
+ * whose whole point is not to interrupt — "silence this for 30 minutes" is
63806
+ * an answer to the notification, and being thrown into a browser tab to
63807
+ * confirm it costs more attention than the notification did. A backend that
63808
+ * cannot do a background call renders it as an ordinary link (the adapters
63809
+ * fall back rather than dropping the button), so this is a preference, never
63810
+ * a requirement.
63811
+ */
63812
+ mode: _enum(["navigate", "background"]).optional()
63757
63813
  });
63758
63814
  /**
63759
63815
  * The canonical notification. `body` is the only hard field (Apprise model).
@@ -63921,6 +63977,24 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
63921
63977
  targetId: string(),
63922
63978
  enabled: boolean()
63923
63979
  }), _void(), { kind: "mutation" });
63980
+ new Set([
63981
+ {
63982
+ id: "person",
63983
+ name: "Person"
63984
+ },
63985
+ {
63986
+ id: "vehicle",
63987
+ name: "Vehicle"
63988
+ },
63989
+ {
63990
+ id: "animal",
63991
+ name: "Animal"
63992
+ },
63993
+ {
63994
+ id: "package",
63995
+ name: "Package"
63996
+ }
63997
+ ].map((l) => l.id));
63924
63998
  var COCO_TO_MACRO = {
63925
63999
  mapping: {
63926
64000
  person: "person",
@@ -64605,7 +64679,17 @@ var alarmPanelCapability = {
64605
64679
  * full slice; renders an arm button per `availableModes` entry and
64606
64680
  * a PIN field iff `requiresCode === true`.
64607
64681
  */
64608
- runtimeState: AlarmPanelStatusSchema
64682
+ runtimeState: AlarmPanelStatusSchema,
64683
+ /**
64684
+ * Runtime-state durability: **restored** — armed state is the one thing a panel must not lose across a restart.
64685
+ *
64686
+ * See `RuntimeStateDurability`. Enforced by
64687
+ * `scripts/check-runtime-state-durability.ts`.
64688
+ */
64689
+ durability: "restored",
64690
+ /** Clock fields: written, but excluded from the compare that decides
64691
+ * whether persisting is worth a SQLite commit. */
64692
+ volatileStateFields: ["lastChangedAt"]
64609
64693
  };
64610
64694
  /**
64611
64695
  * Shared geometry vocabulary for on-frame shape caps — privacy-mask,
@@ -64746,6 +64830,8 @@ var NcSystemEventKindSchema = _enum([
64746
64830
  "alarm-triggered",
64747
64831
  "alarm-armed",
64748
64832
  "alarm-disarmed",
64833
+ "alarm-arming",
64834
+ "alarm-arm-refused",
64749
64835
  "camera-online",
64750
64836
  "camera-offline",
64751
64837
  "camera-disabled",
@@ -64782,6 +64868,9 @@ var NcSystemEventConditionSchema = object({
64782
64868
  nodeIds: array(string().min(1)).min(1).optional(),
64783
64869
  packageNames: array(string().min(1)).min(1).optional()
64784
64870
  });
64871
+ /** Hard ceiling on a window (24h). A snooze that could not expire would be an
64872
+ * outage the operator asked for once and forgot. */
64873
+ var NC_SNOOZE_MAX_MINUTES = 1440;
64785
64874
  /** Weekly schedule — OR of windows; absence on the rule = always active. */
64786
64875
  var NcScheduleSchema = object({
64787
64876
  windows: array(object({
@@ -65158,15 +65247,15 @@ var NcConditionsSchema = object({
65158
65247
  * (an `immediate` rule naming an `audio-*` class, one notification per
65159
65248
  * classified sample) stays exactly as it was for rules that already use it.
65160
65249
  *
65161
- * NOT in {@link NC_CONDITION_CATALOG} yet, and that is the sequencing rule
65162
- * rather than an oversight: the viewer mirrors the descriptor enums BY HAND
65163
- * (`camstack/src/data/notification-center.ts`, guarded by
65164
- * `scripts/check-viewer-condition-mirror.ts`) and its rule editor STRIPS the
65250
+ * In {@link NC_CONDITION_CATALOG} since P2, and the ORDER it got there is the
65251
+ * rule rather than an accident: the viewer mirrors the descriptor enums BY
65252
+ * HAND (`camstack/src/data/notification-center.ts`, guarded by
65253
+ * `scripts/check-viewer-condition-mirror.ts`) and its rule editor strips the
65165
65254
  * condition fields it does not know when a rule is saved from the phone.
65166
65255
  * Publishing an editor for a condition the app cannot round-trip is how an
65167
- * operator loses a rule's conditions by opening it — so the descriptor, the
65168
- * admin widget and the viewer mirror land together (P2 + P3), and only then
65169
- * does an audio rule become authorable.
65256
+ * operator loses a rule's conditions by opening it — so the viewer mirror
65257
+ * (P3, shipped) went FIRST, and the descriptor an editor renders from
65258
+ * follows here.
65170
65259
  */
65171
65260
  audio: NcAudioConditionSchema.optional()
65172
65261
  });
@@ -65402,6 +65491,30 @@ var NcRuleInputSchema = object({
65402
65491
  */
65403
65492
  snoozeAllowGlobal: boolean().optional(),
65404
65493
  /**
65494
+ * The snooze durations THIS rule's notification offers as buttons, in
65495
+ * minutes.
65496
+ *
65497
+ * Three states, and all three are distinct — which is exactly why this is
65498
+ * `.optional()` and never `.default()`. A Zod default does not run on the
65499
+ * addon cap path (three production failures in one day), so a schema default
65500
+ * would collapse the first two:
65501
+ *
65502
+ * | value | meaning |
65503
+ * | --- | --- |
65504
+ * | absent | the operator never said ⇒ {@link NC_DEFAULT_SNOOZE_MINUTES} |
65505
+ * | `[]` | **no snooze buttons on this rule** — the explicit override |
65506
+ * | a list | these choices, de-duplicated and sorted, at most four |
65507
+ *
65508
+ * `.max(4)` because the notifier's own action budget is small (ntfy allows
65509
+ * three buttons in total) and a rule that spent it all on snooze choices
65510
+ * would push its own tap-through actions off the notification.
65511
+ *
65512
+ * An empty list is NOT an alarm exemption: a rule the alarm is about, or
65513
+ * that arms the panel, is exempt automatically and cannot be silenced by a
65514
+ * window from anywhere (D133).
65515
+ */
65516
+ snoozeOptions: array(number().int().min(1).max(NC_SNOOZE_MAX_MINUTES)).max(4).optional(),
65517
+ /**
65405
65518
  * Devices this rule ACTUATES — arm the alarm, open a gate, turn on a light.
65406
65519
  *
65407
65520
  * This is what makes the rule set the alarm's trigger set without the alarm
@@ -65501,6 +65614,7 @@ var NcConditionDescriptorSchema = object({
65501
65614
  "device",
65502
65615
  "package",
65503
65616
  "occupancy",
65617
+ "audio",
65504
65618
  "system"
65505
65619
  ]),
65506
65620
  label: string(),
@@ -65519,6 +65633,7 @@ var NcConditionDescriptorSchema = object({
65519
65633
  "crossingSelect",
65520
65634
  "polygonDraw",
65521
65635
  "occupancy",
65636
+ "audio",
65522
65637
  "deviceState",
65523
65638
  "systemEvent"
65524
65639
  ]),
@@ -65670,7 +65785,20 @@ var NcSnoozeInputSchema = object({
65670
65785
  ruleId: string().optional(),
65671
65786
  /** Required when `scope: 'device'`. */
65672
65787
  deviceId: number().int().optional(),
65673
- durationMinutes: number().int().min(1).max(1440),
65788
+ /**
65789
+ * Narrow the window to these subject classes — "the cat, not the person".
65790
+ *
65791
+ * ORTHOGONAL to `scope`, deliberately, and absent means EVERY class: that is
65792
+ * what every window authored before this field meant, so no persisted row
65793
+ * changes meaning and no client has to learn anything to keep working.
65794
+ *
65795
+ * It is what makes the window's real key `(deviceId, classes[])` and lets it
65796
+ * cross rules (D133): the operator points at a camera and a kind of thing,
65797
+ * not at whichever of their four rules happened to produce the notification
65798
+ * they are dismissing.
65799
+ */
65800
+ classes: array(string().min(1)).min(1).optional(),
65801
+ durationMinutes: number().int().min(1).max(NC_SNOOZE_MAX_MINUTES),
65674
65802
  /**
65675
65803
  * Silence this for EVERY recipient, not just the caller. Permission is
65676
65804
  * checked server-side (the rule's `snoozeAllowGlobal`, or admin for the
@@ -65695,6 +65823,10 @@ var NcSnoozeSchema = object({
65695
65823
  scope: NcSnoozeScopeSchema,
65696
65824
  ruleId: string().optional(),
65697
65825
  deviceId: number().int().optional(),
65826
+ /** Subject classes this window covers. ABSENT = every class — see
65827
+ * {@link NcSnoozeInputSchema.shape.classes}. Lives in the JSON blob and has
65828
+ * no SQLite column: nothing queries a window by class. */
65829
+ classes: array(string().min(1)).min(1).optional(),
65698
65830
  startedAt: number(),
65699
65831
  /** Exclusive: at exactly this instant the snooze is over. Expiry is a
65700
65832
  * COMPARISON, not a job — no sweeper can leave the operator silenced. */
@@ -67795,7 +67927,14 @@ var zonesCapability = {
67795
67927
  * handle. Slice shape is `{ zones: Zone[] }` so future extensions
67796
67928
  * (e.g. zone groupings) can sit alongside the polygon list.
67797
67929
  */
67798
- runtimeState: object({ zones: array(ZoneSchema).readonly() })
67930
+ runtimeState: object({ zones: array(ZoneSchema).readonly() }),
67931
+ /**
67932
+ * 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.
67933
+ *
67934
+ * See `RuntimeStateDurability`. Enforced by
67935
+ * `scripts/check-runtime-state-durability.ts`.
67936
+ */
67937
+ durability: "restored"
67799
67938
  };
67800
67939
  /**
67801
67940
  * A bounding box in NORMALIZED [0,1] frame coordinates for `getNativeCrop`. The
@@ -67965,6 +68104,22 @@ var detectionFpsField = {
67965
68104
  default: 10,
67966
68105
  step: 1
67967
68106
  };
68107
+ /**
68108
+ * The occupancy re-check interval. DEFAULT 300 s (2026-08-13 — was 30 s).
68109
+ *
68110
+ * The recheck is now on by default (a parked car is invisible to occupancy
68111
+ * rules until the stationary registry has been rebuilt by motion, which after a
68112
+ * restart may be never on a quiet camera). Each cycle re-subscribes a detection
68113
+ * session — an RTSP re-dial — so the switch is only affordable at a WIDE
68114
+ * interval: 300 s is ~12 re-dials an hour per camera, against 120 at the old
68115
+ * 30 s. A parked car is therefore counted within 5 minutes of a restart.
68116
+ *
68117
+ * Why not wider: `max` is 300 and raising it is TRAIN-BOUND, not addon-bound —
68118
+ * the host validates `attachCamera` against ITS copy of this schema, so a
68119
+ * runner asked for 600 would be rejected by the hub until a `@camstack/server`
68120
+ * carrying the wider bound is installed everywhere. 300 is the widest value
68121
+ * that ships with an addon deploy.
68122
+ */
67968
68123
  var occupancyRecheckSecField = {
67969
68124
  min: 0,
67970
68125
  max: 300,
@@ -68166,15 +68321,21 @@ var RunnerCameraConfigSchema = object({
68166
68321
  */
68167
68322
  onboardMotionDrivesAnalyzer: boolean().default(true),
68168
68323
  /**
68169
- * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
68170
- * never arms the periodic recheck timer, regardless of `occupancyRecheckSec`
68171
- * this is off by default because the recheck re-subscribes a detection session
68172
- * every N seconds while `watching`, a major source of pull-decoder re-dial
68173
- * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
68324
+ * Master toggle for the occupancy re-check. When `false` the runner never arms
68325
+ * the periodic recheck timer, regardless of `occupancyRecheckSec`; the
68174
68326
  * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
68175
68327
  * (and only render) when this is enabled.
68176
- */
68177
- occupancyRecheckEnabled: boolean().default(false),
68328
+ *
68329
+ * DEFAULT `true` since 2026-08-13 (was `false`). It was off because the
68330
+ * recheck re-subscribes a detection session every N seconds while `watching`
68331
+ * — each cycle creates+tears a session ⇒ an RTSP re-dial ⇒ latency, a major
68332
+ * pull-decoder churn source. What that bought was a blind spot: a STATIONARY
68333
+ * object is counted only while the stationary registry holds it, and the
68334
+ * registry rebuilds from motion, so after a restart a parked car was invisible
68335
+ * to every occupancy rule until something moved in front of it. The churn is
68336
+ * now paid on the interval instead — see `occupancyRecheckSecField`.
68337
+ */
68338
+ occupancyRecheckEnabled: boolean().default(true),
68178
68339
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
68179
68340
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
68180
68341
  /**
@@ -70594,7 +70755,17 @@ var airQualitySensorCapability = {
70594
70755
  schema: AirQualitySensorStatusSchema,
70595
70756
  kind: "push"
70596
70757
  },
70597
- runtimeState: AirQualitySensorStatusSchema
70758
+ runtimeState: AirQualitySensorStatusSchema,
70759
+ /**
70760
+ * Runtime-state durability: **restored** — as `numeric-sensor`.
70761
+ *
70762
+ * See `RuntimeStateDurability`. Enforced by
70763
+ * `scripts/check-runtime-state-durability.ts`.
70764
+ */
70765
+ durability: "restored",
70766
+ /** Clock fields: written, but excluded from the compare that decides
70767
+ * whether persisting is worth a SQLite commit. */
70768
+ volatileStateFields: ["lastFetchedAt"]
70598
70769
  };
70599
70770
  /**
70600
70771
  * Ambient illuminance reading in lux. Drives Home Assistant `sensor`
@@ -70626,7 +70797,17 @@ var ambientLightSensorCapability = {
70626
70797
  schema: AmbientLightSensorStatusSchema,
70627
70798
  kind: "push"
70628
70799
  },
70629
- runtimeState: AmbientLightSensorStatusSchema
70800
+ runtimeState: AmbientLightSensorStatusSchema,
70801
+ /**
70802
+ * Runtime-state durability: **restored** — as `numeric-sensor`.
70803
+ *
70804
+ * See `RuntimeStateDurability`. Enforced by
70805
+ * `scripts/check-runtime-state-durability.ts`.
70806
+ */
70807
+ durability: "restored",
70808
+ /** Clock fields: written, but excluded from the compare that decides
70809
+ * whether persisting is worth a SQLite commit. */
70810
+ volatileStateFields: ["lastFetchedAt"]
70630
70811
  };
70631
70812
  /**
70632
70813
  * Per-class audio metrics aggregated over a sliding window.
@@ -70744,7 +70925,14 @@ var audioMetricsCapability = {
70744
70925
  }), AudioMetricsHistorySchema)
70745
70926
  },
70746
70927
  /** Reactive runtime-state mirror — live `device.state.audioMetrics.value`. */
70747
- runtimeState: AudioMetricsSnapshotSchema
70928
+ runtimeState: AudioMetricsSnapshotSchema,
70929
+ /**
70930
+ * 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.
70931
+ *
70932
+ * See `RuntimeStateDurability`. Enforced by
70933
+ * `scripts/check-runtime-state-durability.ts`.
70934
+ */
70935
+ durability: "session"
70748
70936
  };
70749
70937
  /**
70750
70938
  * Automation-control cap. Models HA `automation.*` entities on
@@ -70806,7 +70994,14 @@ var automationControlCapability = {
70806
70994
  * reads `enabled` (toggle) + `isRunning` (spinner) + `lastError`
70807
70995
  * (badge) directly.
70808
70996
  */
70809
- runtimeState: AutomationControlStatusSchema
70997
+ runtimeState: AutomationControlStatusSchema,
70998
+ /**
70999
+ * 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.
71000
+ *
71001
+ * See `RuntimeStateDurability`. Enforced by
71002
+ * `scripts/check-runtime-state-durability.ts`.
71003
+ */
71004
+ durability: "session"
70810
71005
  };
70811
71006
  /**
70812
71007
  * Battery status snapshot. Emitted by providers whose device is
@@ -70912,7 +71107,17 @@ onStatusChanged: { data: object({
70912
71107
  * via `device.runtimeState.getCapState('battery')` regardless of
70913
71108
  * the underlying driver.
70914
71109
  */
70915
- runtimeState: BatteryStatusSchema
71110
+ runtimeState: BatteryStatusSchema,
71111
+ /**
71112
+ * 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.
71113
+ *
71114
+ * See `RuntimeStateDurability`. Enforced by
71115
+ * `scripts/check-runtime-state-durability.ts`.
71116
+ */
71117
+ durability: "restored",
71118
+ /** Clock fields: written, but excluded from the compare that decides
71119
+ * whether persisting is worth a SQLite commit. */
71120
+ volatileStateFields: ["lastUpdated"]
70916
71121
  };
70917
71122
  /**
70918
71123
  * Generic boolean sensor — last-resort fallback when no domain-
@@ -70941,7 +71146,17 @@ var binaryCapability = {
70941
71146
  schema: BinaryStatusSchema,
70942
71147
  kind: "push"
70943
71148
  },
70944
- runtimeState: BinaryStatusSchema
71149
+ runtimeState: BinaryStatusSchema,
71150
+ /**
71151
+ * Runtime-state durability: **restored** — transition-driven sensor state; the restored value gives the boot comparison.
71152
+ *
71153
+ * See `RuntimeStateDurability`. Enforced by
71154
+ * `scripts/check-runtime-state-durability.ts`.
71155
+ */
71156
+ durability: "restored",
71157
+ /** Clock fields: written, but excluded from the compare that decides
71158
+ * whether persisting is worth a SQLite commit. */
71159
+ volatileStateFields: ["lastChangedAt"]
70945
71160
  };
70946
71161
  /**
70947
71162
  * Dimmable-light brightness control. Co-exists with `switch` on the
@@ -70994,7 +71209,14 @@ onBrightnessChanged: { data: object({
70994
71209
  * by the kernel. Read via `device.state.brightness.value` so UI
70995
71210
  * sliders surface the current level without polling the provider.
70996
71211
  */
70997
- runtimeState: BrightnessStatusSchema
71212
+ runtimeState: BrightnessStatusSchema,
71213
+ /**
71214
+ * Runtime-state durability: **session** — live lamp state, re-published by the provider on connect.
71215
+ *
71216
+ * See `RuntimeStateDurability`. Enforced by
71217
+ * `scripts/check-runtime-state-durability.ts`.
71218
+ */
71219
+ durability: "session"
70998
71220
  };
70999
71221
  /**
71000
71222
  * button — device-scoped capability for HA `button.*` / `input_button.*`
@@ -71099,7 +71321,17 @@ var carbonMonoxideCapability = {
71099
71321
  schema: CarbonMonoxideStatusSchema,
71100
71322
  kind: "push"
71101
71323
  },
71102
- runtimeState: CarbonMonoxideStatusSchema
71324
+ runtimeState: CarbonMonoxideStatusSchema,
71325
+ /**
71326
+ * Runtime-state durability: **restored** — as `smoke`.
71327
+ *
71328
+ * See `RuntimeStateDurability`. Enforced by
71329
+ * `scripts/check-runtime-state-durability.ts`.
71330
+ */
71331
+ durability: "restored",
71332
+ /** Clock fields: written, but excluded from the compare that decides
71333
+ * whether persisting is worth a SQLite commit. */
71334
+ volatileStateFields: ["lastChangedAt"]
71103
71335
  };
71104
71336
  /**
71105
71337
  * HVAC / climate control cap. Models the full surface of a HA
@@ -71259,7 +71491,14 @@ var climateControlCapability = {
71259
71491
  * the full slice via `device.state.climate-control.value` and refresh
71260
71492
  * on every push without re-querying the provider.
71261
71493
  */
71262
- runtimeState: ClimateControlStatusSchema
71494
+ runtimeState: ClimateControlStatusSchema,
71495
+ /**
71496
+ * Runtime-state durability: **session** — as `brightness`; `currentTemp` moves continuously and is re-published on connect.
71497
+ *
71498
+ * See `RuntimeStateDurability`. Enforced by
71499
+ * `scripts/check-runtime-state-durability.ts`.
71500
+ */
71501
+ durability: "session"
71263
71502
  };
71264
71503
  /**
71265
71504
  * Color-light cap. Coexists with `switch` (on/off) and `brightness`
@@ -71369,7 +71608,14 @@ onColorChanged: { data: object({
71369
71608
  * kernel. Read via `device.state.color.value` so UI pickers surface
71370
71609
  * the current chromaticity without polling the provider.
71371
71610
  */
71372
- runtimeState: ColorStatusSchema
71611
+ runtimeState: ColorStatusSchema,
71612
+ /**
71613
+ * Runtime-state durability: **session** — as `brightness`.
71614
+ *
71615
+ * See `RuntimeStateDurability`. Enforced by
71616
+ * `scripts/check-runtime-state-durability.ts`.
71617
+ */
71618
+ durability: "session"
71373
71619
  };
71374
71620
  var ConnectionTestOutcomeSchema = discriminatedUnion("outcome", [
71375
71621
  object({
@@ -71435,7 +71681,17 @@ var connectivityCapability = {
71435
71681
  schema: ConnectivityStatusSchema,
71436
71682
  kind: "push"
71437
71683
  },
71438
- runtimeState: ConnectivityStatusSchema
71684
+ runtimeState: ConnectivityStatusSchema,
71685
+ /**
71686
+ * Runtime-state durability: **restored** — same shape and same argument as `device-status`, for links rather than devices.
71687
+ *
71688
+ * See `RuntimeStateDurability`. Enforced by
71689
+ * `scripts/check-runtime-state-durability.ts`.
71690
+ */
71691
+ durability: "restored",
71692
+ /** Clock fields: written, but excluded from the compare that decides
71693
+ * whether persisting is worth a SQLite commit. */
71694
+ volatileStateFields: ["lastChangedAt"]
71439
71695
  };
71440
71696
  /**
71441
71697
  * Generic device-consumables capability — surfaces a device's
@@ -71517,7 +71773,14 @@ reset: method(object({
71517
71773
  }
71518
71774
  }
71519
71775
  },
71520
- runtimeState: ConsumablesStatusSchema.extend({ lastFetchedAt: number() })
71776
+ runtimeState: ConsumablesStatusSchema.extend({ lastFetchedAt: number() }),
71777
+ /**
71778
+ * Runtime-state durability: **session** — the authority is the appliance; the provider re-reads the whole item array on connect.
71779
+ *
71780
+ * See `RuntimeStateDurability`. Enforced by
71781
+ * `scripts/check-runtime-state-durability.ts`.
71782
+ */
71783
+ durability: "session"
71521
71784
  };
71522
71785
  /**
71523
71786
  * Door / window / opening / garage / valve contact sensor. Boolean
@@ -71548,7 +71811,17 @@ var contactCapability = {
71548
71811
  schema: ContactStatusSchema,
71549
71812
  kind: "push"
71550
71813
  },
71551
- runtimeState: ContactStatusSchema
71814
+ runtimeState: ContactStatusSchema,
71815
+ /**
71816
+ * Runtime-state durability: **restored** — a door left open across a restart must still read open.
71817
+ *
71818
+ * See `RuntimeStateDurability`. Enforced by
71819
+ * `scripts/check-runtime-state-durability.ts`.
71820
+ */
71821
+ durability: "restored",
71822
+ /** Clock fields: written, but excluded from the compare that decides
71823
+ * whether persisting is worth a SQLite commit. */
71824
+ volatileStateFields: ["lastChangedAt"]
71552
71825
  };
71553
71826
  /**
71554
71827
  * Status slice — flat object (the framework's `runtimeState` contract
@@ -71654,7 +71927,14 @@ var controlCapability = {
71654
71927
  * dropdown / text field / date picker) read the slice's discriminant
71655
71928
  * and value directly without polling the provider.
71656
71929
  */
71657
- runtimeState: ControlStatusSchema
71930
+ runtimeState: ControlStatusSchema,
71931
+ /**
71932
+ * Runtime-state durability: **session** — a generic control mirrors an external entity that re-publishes on connect; the options array is re-derived with it.
71933
+ *
71934
+ * See `RuntimeStateDurability`. Enforced by
71935
+ * `scripts/check-runtime-state-durability.ts`.
71936
+ */
71937
+ durability: "session"
71658
71938
  };
71659
71939
  var CoverStatusSchema = object({
71660
71940
  /** Lifecycle state of the cover. */
@@ -71715,7 +71995,17 @@ var coverCapability = {
71715
71995
  * Runtime-state slice — mirrored by the kernel. UI controls watch
71716
71996
  * the slice for live position changes during a move.
71717
71997
  */
71718
- runtimeState: CoverStatusSchema
71998
+ runtimeState: CoverStatusSchema,
71999
+ /**
72000
+ * Runtime-state durability: **restored** — position survives a restart on the device; the mirror should agree at boot rather than read blank.
72001
+ *
72002
+ * See `RuntimeStateDurability`. Enforced by
72003
+ * `scripts/check-runtime-state-durability.ts`.
72004
+ */
72005
+ durability: "restored",
72006
+ /** Clock fields: written, but excluded from the compare that decides
72007
+ * whether persisting is worth a SQLite commit. */
72008
+ volatileStateFields: ["lastChangedAt"]
71719
72009
  };
71720
72010
  /**
71721
72011
  * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
@@ -71809,7 +72099,17 @@ var dayNightCapability = {
71809
72099
  schema: DayNightStatusSchema,
71810
72100
  kind: "poll"
71811
72101
  },
71812
- runtimeState: DayNightStatusSchema
72102
+ runtimeState: DayNightStatusSchema,
72103
+ /**
72104
+ * Runtime-state durability: **restored** — operator-set IR-cut behaviour; mutation-driven.
72105
+ *
72106
+ * See `RuntimeStateDurability`. Enforced by
72107
+ * `scripts/check-runtime-state-durability.ts`.
72108
+ */
72109
+ durability: "restored",
72110
+ /** Clock fields: written, but excluded from the compare that decides
72111
+ * whether persisting is worth a SQLite commit. */
72112
+ volatileStateFields: ["lastFetchedAt"]
71813
72113
  };
71814
72114
  /**
71815
72115
  * Generic device-level status snapshot. Auto-registered by `BaseDevice`
@@ -71856,7 +72156,17 @@ onStatusChanged: { data: object({
71856
72156
  schema: DeviceStatusSchema,
71857
72157
  kind: "push"
71858
72158
  },
71859
- runtimeState: DeviceStatusSchema
72159
+ runtimeState: DeviceStatusSchema,
72160
+ /**
72161
+ * 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.
72162
+ *
72163
+ * See `RuntimeStateDurability`. Enforced by
72164
+ * `scripts/check-runtime-state-durability.ts`.
72165
+ */
72166
+ durability: "restored",
72167
+ /** Clock fields: written, but excluded from the compare that decides
72168
+ * whether persisting is worth a SQLite commit. */
72169
+ volatileStateFields: ["lastChangedAt"]
71860
72170
  };
71861
72171
  /**
71862
72172
  * Doorbell button cap. Two kinds of providers coexist behind this cap
@@ -71918,7 +72228,14 @@ onPressed: { data: DoorbellPressEventSchema } },
71918
72228
  * `device.state.doorbell.value`. UIs can show "last ring 5m ago"
71919
72229
  * without subscribing.
71920
72230
  */
71921
- runtimeState: DoorbellStatusSchema
72231
+ runtimeState: DoorbellStatusSchema,
72232
+ /**
72233
+ * 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.
72234
+ *
72235
+ * See `RuntimeStateDurability`. Enforced by
72236
+ * `scripts/check-runtime-state-durability.ts`.
72237
+ */
72238
+ durability: "restored"
71922
72239
  };
71923
72240
  /**
71924
72241
  * Enum-state sensor — a string value picked from a finite option set.
@@ -71958,7 +72275,17 @@ var enumSensorCapability = {
71958
72275
  schema: EnumSensorStatusSchema,
71959
72276
  kind: "push"
71960
72277
  },
71961
- runtimeState: EnumSensorStatusSchema
72278
+ runtimeState: EnumSensorStatusSchema,
72279
+ /**
72280
+ * Runtime-state durability: **restored** — as `numeric-sensor`; 80 devices.
72281
+ *
72282
+ * See `RuntimeStateDurability`. Enforced by
72283
+ * `scripts/check-runtime-state-durability.ts`.
72284
+ */
72285
+ durability: "restored",
72286
+ /** Clock fields: written, but excluded from the compare that decides
72287
+ * whether persisting is worth a SQLite commit. */
72288
+ volatileStateFields: ["lastFetchedAt"]
71962
72289
  };
71963
72290
  /**
71964
72291
  * Generic stateless event emitter. Installed on a `DeviceType.EventEmitter`
@@ -71994,7 +72321,14 @@ var eventEmitterCapability = {
71994
72321
  schema: EventEmitterStatusSchema,
71995
72322
  kind: "push"
71996
72323
  },
71997
- runtimeState: EventEmitterStatusSchema
72324
+ runtimeState: EventEmitterStatusSchema,
72325
+ /**
72326
+ * Runtime-state durability: **session** — `eventCountSinceStart` names its own scope.
72327
+ *
72328
+ * See `RuntimeStateDurability`. Enforced by
72329
+ * `scripts/check-runtime-state-durability.ts`.
72330
+ */
72331
+ durability: "session"
71998
72332
  };
71999
72333
  var EventItemSchema = object({
72000
72334
  id: string(),
@@ -72275,7 +72609,14 @@ var fanControlCapability = {
72275
72609
  * Runtime-state slice — mirrored by the kernel. UI fan speed
72276
72610
  * sliders read `percentage` for live updates.
72277
72611
  */
72278
- runtimeState: FanControlStatusSchema
72612
+ runtimeState: FanControlStatusSchema,
72613
+ /**
72614
+ * Runtime-state durability: **session** — as `brightness`.
72615
+ *
72616
+ * See `RuntimeStateDurability`. Enforced by
72617
+ * `scripts/check-runtime-state-durability.ts`.
72618
+ */
72619
+ durability: "session"
72279
72620
  };
72280
72621
  /**
72281
72622
  * Per-device feature/identity probe slice. Holds the runtime-resolved
@@ -72351,7 +72692,14 @@ onProbeChanged: { data: object({
72351
72692
  schema: FeatureProbeStatusSchema,
72352
72693
  kind: "push"
72353
72694
  },
72354
- runtimeState: FeatureProbeStatusSchema
72695
+ runtimeState: FeatureProbeStatusSchema,
72696
+ /**
72697
+ * 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.
72698
+ *
72699
+ * See `RuntimeStateDurability`. Enforced by
72700
+ * `scripts/check-runtime-state-durability.ts`.
72701
+ */
72702
+ durability: "session"
72355
72703
  };
72356
72704
  /**
72357
72705
  * Water leak / moisture sensor. Boolean "is liquid currently
@@ -72378,7 +72726,17 @@ var floodCapability = {
72378
72726
  schema: FloodStatusSchema,
72379
72727
  kind: "push"
72380
72728
  },
72381
- runtimeState: FloodStatusSchema
72729
+ runtimeState: FloodStatusSchema,
72730
+ /**
72731
+ * Runtime-state durability: **restored** — as `smoke`.
72732
+ *
72733
+ * See `RuntimeStateDurability`. Enforced by
72734
+ * `scripts/check-runtime-state-durability.ts`.
72735
+ */
72736
+ durability: "restored",
72737
+ /** Clock fields: written, but excluded from the compare that decides
72738
+ * whether persisting is worth a SQLite commit. */
72739
+ volatileStateFields: ["lastChangedAt"]
72382
72740
  };
72383
72741
  /**
72384
72742
  * Combustible-gas (LPG / methane / hydrogen) alarm sensor. Drives
@@ -72401,7 +72759,17 @@ var gasCapability = {
72401
72759
  schema: GasStatusSchema,
72402
72760
  kind: "push"
72403
72761
  },
72404
- runtimeState: GasStatusSchema
72762
+ runtimeState: GasStatusSchema,
72763
+ /**
72764
+ * Runtime-state durability: **restored** — as `smoke`.
72765
+ *
72766
+ * See `RuntimeStateDurability`. Enforced by
72767
+ * `scripts/check-runtime-state-durability.ts`.
72768
+ */
72769
+ durability: "restored",
72770
+ /** Clock fields: written, but excluded from the compare that decides
72771
+ * whether persisting is worth a SQLite commit. */
72772
+ volatileStateFields: ["lastChangedAt"]
72405
72773
  };
72406
72774
  /**
72407
72775
  * Humidifier / dehumidifier cap. Models HA `humidifier.*` entities —
@@ -72477,7 +72845,14 @@ var humidifierCapability = {
72477
72845
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
72478
72846
  * slice for live humidity / mode changes.
72479
72847
  */
72480
- runtimeState: HumidifierStatusSchema
72848
+ runtimeState: HumidifierStatusSchema,
72849
+ /**
72850
+ * Runtime-state durability: **session** — as `climate-control`.
72851
+ *
72852
+ * See `RuntimeStateDurability`. Enforced by
72853
+ * `scripts/check-runtime-state-durability.ts`.
72854
+ */
72855
+ durability: "session"
72481
72856
  };
72482
72857
  /**
72483
72858
  * Single-metric humidity reading. Drives Home Assistant `sensor`
@@ -72513,7 +72888,17 @@ var humiditySensorCapability = {
72513
72888
  schema: HumiditySensorStatusSchema,
72514
72889
  kind: "push"
72515
72890
  },
72516
- runtimeState: HumiditySensorStatusSchema
72891
+ runtimeState: HumiditySensorStatusSchema,
72892
+ /**
72893
+ * Runtime-state durability: **restored** — as `numeric-sensor` (67 of 75 writes were the clock alone).
72894
+ *
72895
+ * See `RuntimeStateDurability`. Enforced by
72896
+ * `scripts/check-runtime-state-durability.ts`.
72897
+ */
72898
+ durability: "restored",
72899
+ /** Clock fields: written, but excluded from the compare that decides
72900
+ * whether persisting is worth a SQLite commit. */
72901
+ volatileStateFields: ["lastFetchedAt"]
72517
72902
  };
72518
72903
  /**
72519
72904
  * Image display cap. Models a single still image exposed by an integration —
@@ -72551,7 +72936,14 @@ var imageCapability = {
72551
72936
  * Runtime-state slice — mirrored by the kernel. The UI reads `url`
72552
72937
  * directly and renders the still image.
72553
72938
  */
72554
- runtimeState: ImageStatusSchema
72939
+ runtimeState: ImageStatusSchema,
72940
+ /**
72941
+ * Runtime-state durability: **session** — a snapshot URL is a session-scoped handle; a restored one points at nothing.
72942
+ *
72943
+ * See `RuntimeStateDurability`. Enforced by
72944
+ * `scripts/check-runtime-state-durability.ts`.
72945
+ */
72946
+ durability: "session"
72555
72947
  };
72556
72948
  /**
72557
72949
  * Vendor-neutral image / picture-adjustment cap — the per-camera config
@@ -72700,7 +73092,17 @@ var imageSettingsCapability = {
72700
73092
  schema: ImageSettingsStatusSchema,
72701
73093
  kind: "poll"
72702
73094
  },
72703
- runtimeState: ImageSettingsStatusSchema
73095
+ runtimeState: ImageSettingsStatusSchema,
73096
+ /**
73097
+ * Runtime-state durability: **restored** — operator-set camera imaging; mutation-driven.
73098
+ *
73099
+ * See `RuntimeStateDurability`. Enforced by
73100
+ * `scripts/check-runtime-state-durability.ts`.
73101
+ */
73102
+ durability: "restored",
73103
+ /** Clock fields: written, but excluded from the compare that decides
73104
+ * whether persisting is worth a SQLite commit. */
73105
+ volatileStateFields: ["lastFetchedAt"]
72704
73106
  };
72705
73107
  /**
72706
73108
  * integrations — system-scoped singleton capability for integration
@@ -73040,7 +73442,14 @@ var lawnMowerControlCapability = {
73040
73442
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
73041
73443
  * slice for live activity + battery changes.
73042
73444
  */
73043
- runtimeState: LawnMowerControlStatusSchema
73445
+ runtimeState: LawnMowerControlStatusSchema,
73446
+ /**
73447
+ * Runtime-state durability: **session** — as `vacuum-control`.
73448
+ *
73449
+ * See `RuntimeStateDurability`. Enforced by
73450
+ * `scripts/check-runtime-state-durability.ts`.
73451
+ */
73452
+ durability: "session"
73044
73453
  };
73045
73454
  /**
73046
73455
  * local-network — hub-only singleton.
@@ -73246,7 +73655,17 @@ var lockControlCapability = {
73246
73655
  * read `state` and disable themselves during `locking`/`unlocking`
73247
73656
  * transitions.
73248
73657
  */
73249
- runtimeState: LockControlStatusSchema
73658
+ runtimeState: LockControlStatusSchema,
73659
+ /**
73660
+ * Runtime-state durability: **restored** — a lock left locked must still read locked.
73661
+ *
73662
+ * See `RuntimeStateDurability`. Enforced by
73663
+ * `scripts/check-runtime-state-durability.ts`.
73664
+ */
73665
+ durability: "restored",
73666
+ /** Clock fields: written, but excluded from the compare that decides
73667
+ * whether persisting is worth a SQLite commit. */
73668
+ volatileStateFields: ["lastChangedAt"]
73250
73669
  };
73251
73670
  /**
73252
73671
  * Media-player cap. Models HA `media_player.*` (Sonos, Chromecast,
@@ -73408,7 +73827,14 @@ var mediaPlayerCapability = {
73408
73827
  * full slice for live now-playing, volume, and progress updates
73409
73828
  * without polling.
73410
73829
  */
73411
- runtimeState: MediaPlayerStatusSchema
73830
+ runtimeState: MediaPlayerStatusSchema,
73831
+ /**
73832
+ * Runtime-state durability: **session** — a restored transport position describes a playback that stopped when the hub did.
73833
+ *
73834
+ * See `RuntimeStateDurability`. Enforced by
73835
+ * `scripts/check-runtime-state-durability.ts`.
73836
+ */
73837
+ durability: "session"
73412
73838
  };
73413
73839
  /**
73414
73840
  * mesh-network — collection cap for mesh-VPN providers.
@@ -73672,7 +74098,14 @@ onMotionChanged: { data: MotionOnMotionChangedDataSchema } },
73672
74098
  * `device.state.motion.value`. Reads never invoke the provider, so
73673
74099
  * UIs and other addons can poll the cached state safely.
73674
74100
  */
73675
- runtimeState: MotionStatusSchema
74101
+ runtimeState: MotionStatusSchema,
74102
+ /**
74103
+ * 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.
74104
+ *
74105
+ * See `RuntimeStateDurability`. Enforced by
74106
+ * `scripts/check-runtime-state-durability.ts`.
74107
+ */
74108
+ durability: "session"
73676
74109
  };
73677
74110
  /**
73678
74111
  * Motion-trigger toggle for accessory devices.
@@ -73737,7 +74170,14 @@ var motionTriggerCapability = {
73737
74170
  schema: MotionTriggerStatusSchema,
73738
74171
  kind: "command-driven"
73739
74172
  },
73740
- runtimeState: MotionTriggerRuntimeStateSchema
74173
+ runtimeState: MotionTriggerRuntimeStateSchema,
74174
+ /**
74175
+ * 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.
74176
+ *
74177
+ * See `RuntimeStateDurability`. Enforced by
74178
+ * `scripts/check-runtime-state-durability.ts`.
74179
+ */
74180
+ durability: "session"
73741
74181
  };
73742
74182
  /**
73743
74183
  * Motion-zones share the same MaskShape vocabulary as privacy-mask — the
@@ -73804,7 +74244,17 @@ var motionZonesCapability = {
73804
74244
  schema: MotionZoneStatusSchema,
73805
74245
  kind: "poll"
73806
74246
  },
73807
- runtimeState: MotionZoneStatusSchema
74247
+ runtimeState: MotionZoneStatusSchema,
74248
+ /**
74249
+ * 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.
74250
+ *
74251
+ * See `RuntimeStateDurability`. Enforced by
74252
+ * `scripts/check-runtime-state-durability.ts`.
74253
+ */
74254
+ durability: "restored",
74255
+ /** Clock fields: written, but excluded from the compare that decides
74256
+ * whether persisting is worth a SQLite commit. */
74257
+ volatileStateFields: ["lastFetchedAt"]
73808
74258
  };
73809
74259
  /**
73810
74260
  * On-camera AI object detection cap. Surfaces per-device the classes
@@ -73878,7 +74328,17 @@ var nativeObjectDetectionCapability = {
73878
74328
  schema: NativeObjectDetectionStatusSchema,
73879
74329
  kind: "push"
73880
74330
  },
73881
- runtimeState: NativeObjectDetectionRuntimeStateSchema
74331
+ runtimeState: NativeObjectDetectionRuntimeStateSchema,
74332
+ /**
74333
+ * 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.
74334
+ *
74335
+ * See `RuntimeStateDurability`. Enforced by
74336
+ * `scripts/check-runtime-state-durability.ts`.
74337
+ */
74338
+ durability: "restored",
74339
+ /** Clock fields: written, but excluded from the compare that decides
74340
+ * whether persisting is worth a SQLite commit. */
74341
+ volatileStateFields: ["lastFetchedAt"]
73882
74342
  };
73883
74343
  /**
73884
74344
  * network-quality — system-scoped singleton capability tracking RTT,
@@ -74212,7 +74672,14 @@ onSent: { data: object({
74212
74672
  * form reads `supports` to gate optional fields; history pane reads
74213
74673
  * `lastSentAt` / `lastError` / `queueDepth`.
74214
74674
  */
74215
- runtimeState: NotifierStatusSchema
74675
+ runtimeState: NotifierStatusSchema,
74676
+ /**
74677
+ * Runtime-state durability: **session** — live queue depth and last-send state; a restored queue depth describes a queue that no longer exists.
74678
+ *
74679
+ * See `RuntimeStateDurability`. Enforced by
74680
+ * `scripts/check-runtime-state-durability.ts`.
74681
+ */
74682
+ durability: "session"
74216
74683
  };
74217
74684
  /**
74218
74685
  * Generic numeric sensor — last-resort fallback when no typed numeric
@@ -74255,7 +74722,17 @@ var numericSensorCapability = {
74255
74722
  schema: NumericSensorStatusSchema,
74256
74723
  kind: "push"
74257
74724
  },
74258
- runtimeState: NumericSensorStatusSchema
74725
+ runtimeState: NumericSensorStatusSchema,
74726
+ /**
74727
+ * 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.
74728
+ *
74729
+ * See `RuntimeStateDurability`. Enforced by
74730
+ * `scripts/check-runtime-state-durability.ts`.
74731
+ */
74732
+ durability: "restored",
74733
+ /** Clock fields: written, but excluded from the compare that decides
74734
+ * whether persisting is worth a SQLite commit. */
74735
+ volatileStateFields: ["lastFetchedAt"]
74259
74736
  };
74260
74737
  /**
74261
74738
  * Generic on-screen-display (video overlay) cap. Each camera exposes
@@ -74640,7 +75117,14 @@ var petFeederCapability = {
74640
75117
  * the full slice via `device.state.petFeeder.value` and refresh on
74641
75118
  * every poll without re-querying the provider.
74642
75119
  */
74643
- runtimeState: PetFeederStatusSchema
75120
+ runtimeState: PetFeederStatusSchema,
75121
+ /**
75122
+ * Runtime-state durability: **session** — live appliance state re-published on connect.
75123
+ *
75124
+ * See `RuntimeStateDurability`. Enforced by
75125
+ * `scripts/check-runtime-state-durability.ts`.
75126
+ */
75127
+ durability: "session"
74644
75128
  };
74645
75129
  var VehicleSchema = object({
74646
75130
  id: string(),
@@ -74952,7 +75436,17 @@ var powerMeterCapability = {
74952
75436
  schema: PowerMeterStatusSchema,
74953
75437
  kind: "push"
74954
75438
  },
74955
- runtimeState: PowerMeterStatusSchema
75439
+ runtimeState: PowerMeterStatusSchema,
75440
+ /**
75441
+ * Runtime-state durability: **restored** — as `numeric-sensor`; `kwhTotal` is an accumulator whose restored value is the baseline.
75442
+ *
75443
+ * See `RuntimeStateDurability`. Enforced by
75444
+ * `scripts/check-runtime-state-durability.ts`.
75445
+ */
75446
+ durability: "restored",
75447
+ /** Clock fields: written, but excluded from the compare that decides
75448
+ * whether persisting is worth a SQLite commit. */
75449
+ volatileStateFields: ["lastFetchedAt"]
74956
75450
  };
74957
75451
  /**
74958
75452
  * Presence cap. Models HA `person.*` and `device_tracker.*` entities
@@ -75009,7 +75503,17 @@ var presenceCapability = {
75009
75503
  * the map pin is rendered (use `DeviceFeature.PresenceGps` for the
75010
75504
  * pre-fetch fast-path check).
75011
75505
  */
75012
- runtimeState: PresenceStatusSchema
75506
+ runtimeState: PresenceStatusSchema,
75507
+ /**
75508
+ * Runtime-state durability: **restored** — occupancy-relevant: the restored state is what an occupancy rule compares the first post-restart observation against.
75509
+ *
75510
+ * See `RuntimeStateDurability`. Enforced by
75511
+ * `scripts/check-runtime-state-durability.ts`.
75512
+ */
75513
+ durability: "restored",
75514
+ /** Clock fields: written, but excluded from the compare that decides
75515
+ * whether persisting is worth a SQLite commit. */
75516
+ volatileStateFields: ["lastChangedAt"]
75013
75517
  };
75014
75518
  /**
75015
75519
  * Atmospheric pressure reading in hectopascals. Drives Home Assistant
@@ -75045,7 +75549,17 @@ var pressureSensorCapability = {
75045
75549
  schema: PressureSensorStatusSchema,
75046
75550
  kind: "push"
75047
75551
  },
75048
- runtimeState: PressureSensorStatusSchema
75552
+ runtimeState: PressureSensorStatusSchema,
75553
+ /**
75554
+ * Runtime-state durability: **restored** — as `numeric-sensor`.
75555
+ *
75556
+ * See `RuntimeStateDurability`. Enforced by
75557
+ * `scripts/check-runtime-state-durability.ts`.
75558
+ */
75559
+ durability: "restored",
75560
+ /** Clock fields: written, but excluded from the compare that decides
75561
+ * whether persisting is worth a SQLite commit. */
75562
+ volatileStateFields: ["lastFetchedAt"]
75049
75563
  };
75050
75564
  /**
75051
75565
  * PRIVACY — what the camera deliberately does not capture. Two planes:
@@ -75175,7 +75689,17 @@ var privacyMaskCapability = {
75175
75689
  schema: PrivacyMaskStatusSchema,
75176
75690
  kind: "poll"
75177
75691
  },
75178
- runtimeState: PrivacyMaskStatusSchema
75692
+ runtimeState: PrivacyMaskStatusSchema,
75693
+ /**
75694
+ * Runtime-state durability: **restored** — operator-drawn regions, zero real churn — 22 writes in 25 minutes, every one of them the clock.
75695
+ *
75696
+ * See `RuntimeStateDurability`. Enforced by
75697
+ * `scripts/check-runtime-state-durability.ts`.
75698
+ */
75699
+ durability: "restored",
75700
+ /** Clock fields: written, but excluded from the compare that decides
75701
+ * whether persisting is worth a SQLite commit. */
75702
+ volatileStateFields: ["lastFetchedAt"]
75179
75703
  };
75180
75704
  var PtzPresetSchema = object({
75181
75705
  id: string(),
@@ -75341,7 +75865,14 @@ var ptzAutotrackCapability = {
75341
75865
  * fetch / cache / fallback logic out of the four cap methods —
75342
75866
  * they become trampolines over `runtimeState`.
75343
75867
  */
75344
- runtimeState: PtzAutotrackRuntimeStateSchema
75868
+ runtimeState: PtzAutotrackRuntimeStateSchema,
75869
+ /**
75870
+ * Runtime-state durability: **session** — mirrors the camera's own autotrack config, re-read on connect.
75871
+ *
75872
+ * See `RuntimeStateDurability`. Enforced by
75873
+ * `scripts/check-runtime-state-durability.ts`.
75874
+ */
75875
+ durability: "session"
75345
75876
  };
75346
75877
  DeviceType.Camera, DeviceType.Sensor, DeviceType.Switch, method(object({ deviceId: number().int().nonnegative() }), object({ success: literal(true) }), {
75347
75878
  kind: "mutation",
@@ -75991,7 +76522,14 @@ var sceneMonitorCapability = {
75991
76522
  schema: SceneMonitorStatusSchema,
75992
76523
  kind: "push"
75993
76524
  },
75994
- runtimeState: SceneMonitorStatusSchema
76525
+ runtimeState: SceneMonitorStatusSchema,
76526
+ /**
76527
+ * Runtime-state durability: **session** — re-derived from the current scene on the next evaluation.
76528
+ *
76529
+ * See `RuntimeStateDurability`. Enforced by
76530
+ * `scripts/check-runtime-state-durability.ts`.
76531
+ */
76532
+ durability: "session"
75995
76533
  };
75996
76534
  /**
75997
76535
  * Per-stage gating mode applied to the zones a rule references.
@@ -76135,7 +76673,14 @@ var scriptRunnerCapability = {
76135
76673
  * `isRunning` to render a spinner during execution and surfaces
76136
76674
  * `lastError` / `lastRunSuccess` in the recent-runs panel.
76137
76675
  */
76138
- runtimeState: ScriptRunnerStatusSchema
76676
+ runtimeState: ScriptRunnerStatusSchema,
76677
+ /**
76678
+ * Runtime-state durability: **session** — a restored `isRunning: true` describes a process that died with the previous hub.
76679
+ *
76680
+ * See `RuntimeStateDurability`. Enforced by
76681
+ * `scripts/check-runtime-state-durability.ts`.
76682
+ */
76683
+ durability: "session"
76139
76684
  };
76140
76685
  /**
76141
76686
  * Smoke alarm sensor — boolean "is smoke currently detected" with
@@ -76162,7 +76707,17 @@ var smokeCapability = {
76162
76707
  schema: SmokeStatusSchema,
76163
76708
  kind: "push"
76164
76709
  },
76165
- runtimeState: SmokeStatusSchema
76710
+ runtimeState: SmokeStatusSchema,
76711
+ /**
76712
+ * Runtime-state durability: **restored** — a safety sensor must not read "clear" merely because the hub restarted.
76713
+ *
76714
+ * See `RuntimeStateDurability`. Enforced by
76715
+ * `scripts/check-runtime-state-durability.ts`.
76716
+ */
76717
+ durability: "restored",
76718
+ /** Clock fields: written, but excluded from the compare that decides
76719
+ * whether persisting is worth a SQLite commit. */
76720
+ volatileStateFields: ["lastChangedAt"]
76166
76721
  };
76167
76722
  /**
76168
76723
  * One publishable camera stream as its OWNING PROVIDER describes it — the same
@@ -76335,7 +76890,17 @@ var streamParamsCapability = {
76335
76890
  schema: StreamParamsStatusSchema,
76336
76891
  kind: "poll"
76337
76892
  },
76338
- runtimeState: StreamParamsStatusSchema
76893
+ runtimeState: StreamParamsStatusSchema,
76894
+ /**
76895
+ * Runtime-state durability: **restored** — operator-set encoder profile; mutation-driven.
76896
+ *
76897
+ * See `RuntimeStateDurability`. Enforced by
76898
+ * `scripts/check-runtime-state-durability.ts`.
76899
+ */
76900
+ durability: "restored",
76901
+ /** Clock fields: written, but excluded from the compare that decides
76902
+ * whether persisting is worth a SQLite commit. */
76903
+ volatileStateFields: ["lastFetchedAt"]
76339
76904
  };
76340
76905
  /**
76341
76906
  * Generic on/off switch cap for accessory children (siren, floodlight,
@@ -76381,6 +76946,16 @@ var switchCapability = {
76381
76946
  * not need to re-query the provider after a setState mutation.
76382
76947
  */
76383
76948
  runtimeState: SwitchStatusSchema,
76949
+ /**
76950
+ * Runtime-state durability: **restored** — device state an operator reads as authoritative; 55 devices, transition-driven.
76951
+ *
76952
+ * See `RuntimeStateDurability`. Enforced by
76953
+ * `scripts/check-runtime-state-durability.ts`.
76954
+ */
76955
+ durability: "restored",
76956
+ /** Clock fields: written, but excluded from the compare that decides
76957
+ * whether persisting is worth a SQLite commit. */
76958
+ volatileStateFields: ["lastChangedAt"],
76384
76959
  settings: { bindings: [{
76385
76960
  kind: "scalar",
76386
76961
  statusPath: "on",
@@ -76460,7 +77035,17 @@ var tamperCapability = {
76460
77035
  schema: TamperStatusSchema,
76461
77036
  kind: "push"
76462
77037
  },
76463
- runtimeState: TamperStatusSchema
77038
+ runtimeState: TamperStatusSchema,
77039
+ /**
77040
+ * Runtime-state durability: **restored** — as `smoke`.
77041
+ *
77042
+ * See `RuntimeStateDurability`. Enforced by
77043
+ * `scripts/check-runtime-state-durability.ts`.
77044
+ */
77045
+ durability: "restored",
77046
+ /** Clock fields: written, but excluded from the compare that decides
77047
+ * whether persisting is worth a SQLite commit. */
77048
+ volatileStateFields: ["lastChangedAt"]
76464
77049
  };
76465
77050
  /**
76466
77051
  * Single-metric temperature reading. Drives Home Assistant `sensor`
@@ -76505,7 +77090,17 @@ var temperatureSensorCapability = {
76505
77090
  schema: TemperatureSensorStatusSchema,
76506
77091
  kind: "push"
76507
77092
  },
76508
- runtimeState: TemperatureSensorStatusSchema
77093
+ runtimeState: TemperatureSensorStatusSchema,
77094
+ /**
77095
+ * Runtime-state durability: **restored** — as `numeric-sensor` (69 of 125 writes were the clock alone).
77096
+ *
77097
+ * See `RuntimeStateDurability`. Enforced by
77098
+ * `scripts/check-runtime-state-durability.ts`.
77099
+ */
77100
+ durability: "restored",
77101
+ /** Clock fields: written, but excluded from the compare that decides
77102
+ * whether persisting is worth a SQLite commit. */
77103
+ volatileStateFields: ["lastFetchedAt"]
76509
77104
  };
76510
77105
  /**
76511
77106
  * toast — system-scoped singleton capability that streams toast
@@ -76574,7 +77169,14 @@ var updateCapability = {
76574
77169
  schema: UpdateStatusSchema,
76575
77170
  kind: "poll"
76576
77171
  },
76577
- runtimeState: UpdateStatusSchema
77172
+ runtimeState: UpdateStatusSchema,
77173
+ /**
77174
+ * Runtime-state durability: **session** — a restored `inProgress: true` describes an update that is no longer running; versions are re-probed at boot.
77175
+ *
77176
+ * See `RuntimeStateDurability`. Enforced by
77177
+ * `scripts/check-runtime-state-durability.ts`.
77178
+ */
77179
+ durability: "session"
76578
77180
  };
76579
77181
  var UserSummarySchema = object({
76580
77182
  id: string(),
@@ -76908,7 +77510,14 @@ var vacuumControlCapability = {
76908
77510
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
76909
77511
  * slice for live state + battery + fan-speed changes.
76910
77512
  */
76911
- runtimeState: VacuumControlStatusSchema
77513
+ runtimeState: VacuumControlStatusSchema,
77514
+ /**
77515
+ * Runtime-state durability: **session** — as `media-player` — a restored `state: cleaning` is a robot that is not cleaning.
77516
+ *
77517
+ * See `RuntimeStateDurability`. Enforced by
77518
+ * `scripts/check-runtime-state-durability.ts`.
77519
+ */
77520
+ durability: "session"
76912
77521
  };
76913
77522
  var ValveStatusSchema = object({
76914
77523
  /** Lifecycle state of the valve. */
@@ -76960,7 +77569,14 @@ var valveCapability = {
76960
77569
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
76961
77570
  * slice for live position changes during a move.
76962
77571
  */
76963
- runtimeState: ValveStatusSchema
77572
+ runtimeState: ValveStatusSchema,
77573
+ /**
77574
+ * Runtime-state durability: **session** — as `brightness`.
77575
+ *
77576
+ * See `RuntimeStateDurability`. Enforced by
77577
+ * `scripts/check-runtime-state-durability.ts`.
77578
+ */
77579
+ durability: "session"
76964
77580
  };
76965
77581
  /**
76966
77582
  * Vibration / shake / impact sensor. Drives Home Assistant
@@ -76982,7 +77598,17 @@ var vibrationCapability = {
76982
77598
  schema: VibrationStatusSchema,
76983
77599
  kind: "push"
76984
77600
  },
76985
- runtimeState: VibrationStatusSchema
77601
+ runtimeState: VibrationStatusSchema,
77602
+ /**
77603
+ * Runtime-state durability: **restored** — as `smoke`.
77604
+ *
77605
+ * See `RuntimeStateDurability`. Enforced by
77606
+ * `scripts/check-runtime-state-durability.ts`.
77607
+ */
77608
+ durability: "restored",
77609
+ /** Clock fields: written, but excluded from the compare that decides
77610
+ * whether persisting is worth a SQLite commit. */
77611
+ volatileStateFields: ["lastChangedAt"]
76986
77612
  };
76987
77613
  /**
76988
77614
  * Water heater / boiler cap. Models HA `water_heater.*` entities — a
@@ -77056,7 +77682,14 @@ var waterHeaterCapability = {
77056
77682
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
77057
77683
  * slice for live temperature / mode / away changes.
77058
77684
  */
77059
- runtimeState: WaterHeaterStatusSchema
77685
+ runtimeState: WaterHeaterStatusSchema,
77686
+ /**
77687
+ * Runtime-state durability: **session** — as `climate-control`.
77688
+ *
77689
+ * See `RuntimeStateDurability`. Enforced by
77690
+ * `scripts/check-runtime-state-durability.ts`.
77691
+ */
77692
+ durability: "session"
77060
77693
  };
77061
77694
  /**
77062
77695
  * Weather provider cap. Models HA `weather.*` entities — a read-only
@@ -77115,7 +77748,14 @@ var weatherCapability = {
77115
77748
  * Runtime-state slice — mirrored by the kernel. The UI reads the
77116
77749
  * current conditions directly from the slice on each weather push.
77117
77750
  */
77118
- runtimeState: WeatherStatusSchema
77751
+ runtimeState: WeatherStatusSchema,
77752
+ /**
77753
+ * Runtime-state durability: **session** — a forecast is stale the moment the hub is down; the provider re-fetches on connect.
77754
+ *
77755
+ * See `RuntimeStateDurability`. Enforced by
77756
+ * `scripts/check-runtime-state-durability.ts`.
77757
+ */
77758
+ durability: "session"
77119
77759
  };
77120
77760
  /**
77121
77761
  * Per-zone occupancy aggregation produced by the analytics frame
@@ -77277,7 +77917,14 @@ var zoneAnalyticsCapability = {
77277
77917
  * automatically; the explicit `getCurrentSnapshot` cap method is
77278
77918
  * still useful for one-off polls without a subscription.
77279
77919
  */
77280
- runtimeState: CameraOccupancySnapshotSchema
77920
+ runtimeState: CameraOccupancySnapshotSchema,
77921
+ /**
77922
+ * Runtime-state durability: **session** — per-frame analytics; with `audio-metrics` it is ~90 % of the offered write rate. Re-derived on the next frame.
77923
+ *
77924
+ * See `RuntimeStateDurability`. Enforced by
77925
+ * `scripts/check-runtime-state-durability.ts`.
77926
+ */
77927
+ durability: "session"
77281
77928
  };
77282
77929
  /**
77283
77930
  * Stages a {@link ZoneRule} can apply to. Discriminator on the rules
@@ -77355,7 +78002,14 @@ var zoneRulesCapability = {
77355
78002
  motion: array(ZoneRuleSchema).readonly(),
77356
78003
  detection: array(ZoneRuleSchema).readonly(),
77357
78004
  package: array(ZoneRuleSchema).readonly()
77358
- })
78005
+ }),
78006
+ /**
78007
+ * Runtime-state durability: **restored** — operator intent, mutation-only, same argument as `zones`.
78008
+ *
78009
+ * See `RuntimeStateDurability`. Enforced by
78010
+ * `scripts/check-runtime-state-durability.ts`.
78011
+ */
78012
+ durability: "restored"
77359
78013
  };
77360
78014
  /**
77361
78015
  * Accessory device helpers — shared across drivers.
@@ -84042,6 +84696,7 @@ Object.freeze({
84042
84696
  "network-access": "ingress",
84043
84697
  "smtp-provider": "email"
84044
84698
  });
84699
+ new Map(AUDIO_MACRO_LABELS.flatMap((macro) => macro.icon === void 0 ? [] : [[macro.id, macro.icon]]));
84045
84700
  new Set(["devices", "classes"]);
84046
84701
  /**
84047
84702
  * TimelapseRule — the STANDALONE scheduled timelapse producer's rule model.