@camstack/addon-import-alexa 0.2.14 → 0.2.15

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 +656 -69
  2. package/dist/addon.mjs +656 -69
  3. package/package.json +1 -1
package/dist/addon.mjs CHANGED
@@ -10997,7 +10997,14 @@ var cameraStreamsCapability = {
10997
10997
  low: string().optional()
10998
10998
  }),
10999
10999
  lastChangedAt: number()
11000
- })
11000
+ }),
11001
+ /**
11002
+ * 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.
11003
+ *
11004
+ * See `RuntimeStateDurability`. Enforced by
11005
+ * `scripts/check-runtime-state-durability.ts`.
11006
+ */
11007
+ durability: "session"
11001
11008
  };
11002
11009
  /** Where a block runs. The operator chooses — a block driving a device on an
11003
11010
  * agent is the reason placement is not fixed to the hub. */
@@ -11558,6 +11565,13 @@ var deviceDiscoveryCapability = {
11558
11565
  kind: "poll"
11559
11566
  },
11560
11567
  runtimeState: DeviceDiscoveryStatusSchema.extend({ lastFetchedAt: number().int().nonnegative() }),
11568
+ /**
11569
+ * Runtime-state durability: **session** — 5.7 KB of scan output on the largest device, fully re-derivable by re-scanning.
11570
+ *
11571
+ * See `RuntimeStateDurability`. Enforced by
11572
+ * `scripts/check-runtime-state-durability.ts`.
11573
+ */
11574
+ durability: "session",
11561
11575
  methods: {
11562
11576
  /**
11563
11577
  * Snapshot of the current `discovered` list. Returns the
@@ -13474,7 +13488,23 @@ var NotificationActionSchema = object({
13474
13488
  * else — see `notification-center/action-token.ts` for what that does and
13475
13489
  * does not buy.
13476
13490
  */
13477
- destructive: boolean().optional()
13491
+ destructive: boolean().optional(),
13492
+ /**
13493
+ * How the tap should REACH the url.
13494
+ *
13495
+ * `navigate` (absent, and every button authored before this field) opens it:
13496
+ * the phone leaves the notification and shows whatever the callback returns.
13497
+ * That is right for a button whose answer the operator wants to read.
13498
+ *
13499
+ * `background` fires it as a POST and stays put. It exists for the buttons
13500
+ * whose whole point is not to interrupt — "silence this for 30 minutes" is
13501
+ * an answer to the notification, and being thrown into a browser tab to
13502
+ * confirm it costs more attention than the notification did. A backend that
13503
+ * cannot do a background call renders it as an ordinary link (the adapters
13504
+ * fall back rather than dropping the button), so this is a preference, never
13505
+ * a requirement.
13506
+ */
13507
+ mode: _enum(["navigate", "background"]).optional()
13478
13508
  });
13479
13509
  /**
13480
13510
  * The canonical notification. `body` is the only hard field (Apprise model).
@@ -14326,7 +14356,17 @@ var alarmPanelCapability = {
14326
14356
  * full slice; renders an arm button per `availableModes` entry and
14327
14357
  * a PIN field iff `requiresCode === true`.
14328
14358
  */
14329
- runtimeState: AlarmPanelStatusSchema
14359
+ runtimeState: AlarmPanelStatusSchema,
14360
+ /**
14361
+ * Runtime-state durability: **restored** — armed state is the one thing a panel must not lose across a restart.
14362
+ *
14363
+ * See `RuntimeStateDurability`. Enforced by
14364
+ * `scripts/check-runtime-state-durability.ts`.
14365
+ */
14366
+ durability: "restored",
14367
+ /** Clock fields: written, but excluded from the compare that decides
14368
+ * whether persisting is worth a SQLite commit. */
14369
+ volatileStateFields: ["lastChangedAt"]
14330
14370
  };
14331
14371
  /**
14332
14372
  * Shared geometry vocabulary for on-frame shape caps — privacy-mask,
@@ -14503,6 +14543,9 @@ var NcSystemEventConditionSchema = object({
14503
14543
  nodeIds: array(string().min(1)).min(1).optional(),
14504
14544
  packageNames: array(string().min(1)).min(1).optional()
14505
14545
  });
14546
+ /** Hard ceiling on a window (24h). A snooze that could not expire would be an
14547
+ * outage the operator asked for once and forgot. */
14548
+ var NC_SNOOZE_MAX_MINUTES = 1440;
14506
14549
  /** Weekly schedule — OR of windows; absence on the rule = always active. */
14507
14550
  var NcScheduleSchema = object({
14508
14551
  windows: array(object({
@@ -14879,15 +14922,15 @@ var NcConditionsSchema = object({
14879
14922
  * (an `immediate` rule naming an `audio-*` class, one notification per
14880
14923
  * classified sample) stays exactly as it was for rules that already use it.
14881
14924
  *
14882
- * NOT in {@link NC_CONDITION_CATALOG} yet, and that is the sequencing rule
14883
- * rather than an oversight: the viewer mirrors the descriptor enums BY HAND
14884
- * (`camstack/src/data/notification-center.ts`, guarded by
14885
- * `scripts/check-viewer-condition-mirror.ts`) and its rule editor STRIPS the
14925
+ * In {@link NC_CONDITION_CATALOG} since P2, and the ORDER it got there is the
14926
+ * rule rather than an accident: the viewer mirrors the descriptor enums BY
14927
+ * HAND (`camstack/src/data/notification-center.ts`, guarded by
14928
+ * `scripts/check-viewer-condition-mirror.ts`) and its rule editor strips the
14886
14929
  * condition fields it does not know when a rule is saved from the phone.
14887
14930
  * Publishing an editor for a condition the app cannot round-trip is how an
14888
- * operator loses a rule's conditions by opening it — so the descriptor, the
14889
- * admin widget and the viewer mirror land together (P2 + P3), and only then
14890
- * does an audio rule become authorable.
14931
+ * operator loses a rule's conditions by opening it — so the viewer mirror
14932
+ * (P3, shipped) went FIRST, and the descriptor an editor renders from
14933
+ * follows here.
14891
14934
  */
14892
14935
  audio: NcAudioConditionSchema.optional()
14893
14936
  });
@@ -15123,6 +15166,30 @@ var NcRuleInputSchema = object({
15123
15166
  */
15124
15167
  snoozeAllowGlobal: boolean().optional(),
15125
15168
  /**
15169
+ * The snooze durations THIS rule's notification offers as buttons, in
15170
+ * minutes.
15171
+ *
15172
+ * Three states, and all three are distinct — which is exactly why this is
15173
+ * `.optional()` and never `.default()`. A Zod default does not run on the
15174
+ * addon cap path (three production failures in one day), so a schema default
15175
+ * would collapse the first two:
15176
+ *
15177
+ * | value | meaning |
15178
+ * | --- | --- |
15179
+ * | absent | the operator never said ⇒ {@link NC_DEFAULT_SNOOZE_MINUTES} |
15180
+ * | `[]` | **no snooze buttons on this rule** — the explicit override |
15181
+ * | a list | these choices, de-duplicated and sorted, at most four |
15182
+ *
15183
+ * `.max(4)` because the notifier's own action budget is small (ntfy allows
15184
+ * three buttons in total) and a rule that spent it all on snooze choices
15185
+ * would push its own tap-through actions off the notification.
15186
+ *
15187
+ * An empty list is NOT an alarm exemption: a rule the alarm is about, or
15188
+ * that arms the panel, is exempt automatically and cannot be silenced by a
15189
+ * window from anywhere (D133).
15190
+ */
15191
+ snoozeOptions: array(number().int().min(1).max(NC_SNOOZE_MAX_MINUTES)).max(4).optional(),
15192
+ /**
15126
15193
  * Devices this rule ACTUATES — arm the alarm, open a gate, turn on a light.
15127
15194
  *
15128
15195
  * This is what makes the rule set the alarm's trigger set without the alarm
@@ -15222,6 +15289,7 @@ var NcConditionDescriptorSchema = object({
15222
15289
  "device",
15223
15290
  "package",
15224
15291
  "occupancy",
15292
+ "audio",
15225
15293
  "system"
15226
15294
  ]),
15227
15295
  label: string(),
@@ -15240,6 +15308,7 @@ var NcConditionDescriptorSchema = object({
15240
15308
  "crossingSelect",
15241
15309
  "polygonDraw",
15242
15310
  "occupancy",
15311
+ "audio",
15243
15312
  "deviceState",
15244
15313
  "systemEvent"
15245
15314
  ]),
@@ -15391,7 +15460,20 @@ var NcSnoozeInputSchema = object({
15391
15460
  ruleId: string().optional(),
15392
15461
  /** Required when `scope: 'device'`. */
15393
15462
  deviceId: number().int().optional(),
15394
- durationMinutes: number().int().min(1).max(1440),
15463
+ /**
15464
+ * Narrow the window to these subject classes — "the cat, not the person".
15465
+ *
15466
+ * ORTHOGONAL to `scope`, deliberately, and absent means EVERY class: that is
15467
+ * what every window authored before this field meant, so no persisted row
15468
+ * changes meaning and no client has to learn anything to keep working.
15469
+ *
15470
+ * It is what makes the window's real key `(deviceId, classes[])` and lets it
15471
+ * cross rules (D133): the operator points at a camera and a kind of thing,
15472
+ * not at whichever of their four rules happened to produce the notification
15473
+ * they are dismissing.
15474
+ */
15475
+ classes: array(string().min(1)).min(1).optional(),
15476
+ durationMinutes: number().int().min(1).max(NC_SNOOZE_MAX_MINUTES),
15395
15477
  /**
15396
15478
  * Silence this for EVERY recipient, not just the caller. Permission is
15397
15479
  * checked server-side (the rule's `snoozeAllowGlobal`, or admin for the
@@ -15416,6 +15498,10 @@ var NcSnoozeSchema = object({
15416
15498
  scope: NcSnoozeScopeSchema,
15417
15499
  ruleId: string().optional(),
15418
15500
  deviceId: number().int().optional(),
15501
+ /** Subject classes this window covers. ABSENT = every class — see
15502
+ * {@link NcSnoozeInputSchema.shape.classes}. Lives in the JSON blob and has
15503
+ * no SQLite column: nothing queries a window by class. */
15504
+ classes: array(string().min(1)).min(1).optional(),
15419
15505
  startedAt: number(),
15420
15506
  /** Exclusive: at exactly this instant the snooze is over. Expiry is a
15421
15507
  * COMPARISON, not a job — no sweeper can leave the operator silenced. */
@@ -17516,7 +17602,14 @@ var zonesCapability = {
17516
17602
  * handle. Slice shape is `{ zones: Zone[] }` so future extensions
17517
17603
  * (e.g. zone groupings) can sit alongside the polygon list.
17518
17604
  */
17519
- runtimeState: object({ zones: array(ZoneSchema).readonly() })
17605
+ runtimeState: object({ zones: array(ZoneSchema).readonly() }),
17606
+ /**
17607
+ * 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.
17608
+ *
17609
+ * See `RuntimeStateDurability`. Enforced by
17610
+ * `scripts/check-runtime-state-durability.ts`.
17611
+ */
17612
+ durability: "restored"
17520
17613
  };
17521
17614
  /**
17522
17615
  * A bounding box in NORMALIZED [0,1] frame coordinates for `getNativeCrop`. The
@@ -20315,7 +20408,17 @@ var airQualitySensorCapability = {
20315
20408
  schema: AirQualitySensorStatusSchema,
20316
20409
  kind: "push"
20317
20410
  },
20318
- runtimeState: AirQualitySensorStatusSchema
20411
+ runtimeState: AirQualitySensorStatusSchema,
20412
+ /**
20413
+ * Runtime-state durability: **restored** — as `numeric-sensor`.
20414
+ *
20415
+ * See `RuntimeStateDurability`. Enforced by
20416
+ * `scripts/check-runtime-state-durability.ts`.
20417
+ */
20418
+ durability: "restored",
20419
+ /** Clock fields: written, but excluded from the compare that decides
20420
+ * whether persisting is worth a SQLite commit. */
20421
+ volatileStateFields: ["lastFetchedAt"]
20319
20422
  };
20320
20423
  /**
20321
20424
  * Ambient illuminance reading in lux. Drives Home Assistant `sensor`
@@ -20347,7 +20450,17 @@ var ambientLightSensorCapability = {
20347
20450
  schema: AmbientLightSensorStatusSchema,
20348
20451
  kind: "push"
20349
20452
  },
20350
- runtimeState: AmbientLightSensorStatusSchema
20453
+ runtimeState: AmbientLightSensorStatusSchema,
20454
+ /**
20455
+ * Runtime-state durability: **restored** — as `numeric-sensor`.
20456
+ *
20457
+ * See `RuntimeStateDurability`. Enforced by
20458
+ * `scripts/check-runtime-state-durability.ts`.
20459
+ */
20460
+ durability: "restored",
20461
+ /** Clock fields: written, but excluded from the compare that decides
20462
+ * whether persisting is worth a SQLite commit. */
20463
+ volatileStateFields: ["lastFetchedAt"]
20351
20464
  };
20352
20465
  /**
20353
20466
  * Per-class audio metrics aggregated over a sliding window.
@@ -20465,7 +20578,14 @@ var audioMetricsCapability = {
20465
20578
  }), AudioMetricsHistorySchema)
20466
20579
  },
20467
20580
  /** Reactive runtime-state mirror — live `device.state.audioMetrics.value`. */
20468
- runtimeState: AudioMetricsSnapshotSchema
20581
+ runtimeState: AudioMetricsSnapshotSchema,
20582
+ /**
20583
+ * 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.
20584
+ *
20585
+ * See `RuntimeStateDurability`. Enforced by
20586
+ * `scripts/check-runtime-state-durability.ts`.
20587
+ */
20588
+ durability: "session"
20469
20589
  };
20470
20590
  /**
20471
20591
  * Automation-control cap. Models HA `automation.*` entities on
@@ -20527,7 +20647,14 @@ var automationControlCapability = {
20527
20647
  * reads `enabled` (toggle) + `isRunning` (spinner) + `lastError`
20528
20648
  * (badge) directly.
20529
20649
  */
20530
- runtimeState: AutomationControlStatusSchema
20650
+ runtimeState: AutomationControlStatusSchema,
20651
+ /**
20652
+ * 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.
20653
+ *
20654
+ * See `RuntimeStateDurability`. Enforced by
20655
+ * `scripts/check-runtime-state-durability.ts`.
20656
+ */
20657
+ durability: "session"
20531
20658
  };
20532
20659
  /**
20533
20660
  * Battery status snapshot. Emitted by providers whose device is
@@ -20633,7 +20760,17 @@ onStatusChanged: { data: object({
20633
20760
  * via `device.runtimeState.getCapState('battery')` regardless of
20634
20761
  * the underlying driver.
20635
20762
  */
20636
- runtimeState: BatteryStatusSchema
20763
+ runtimeState: BatteryStatusSchema,
20764
+ /**
20765
+ * 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.
20766
+ *
20767
+ * See `RuntimeStateDurability`. Enforced by
20768
+ * `scripts/check-runtime-state-durability.ts`.
20769
+ */
20770
+ durability: "restored",
20771
+ /** Clock fields: written, but excluded from the compare that decides
20772
+ * whether persisting is worth a SQLite commit. */
20773
+ volatileStateFields: ["lastUpdated"]
20637
20774
  };
20638
20775
  /**
20639
20776
  * Generic boolean sensor — last-resort fallback when no domain-
@@ -20662,7 +20799,17 @@ var binaryCapability = {
20662
20799
  schema: BinaryStatusSchema,
20663
20800
  kind: "push"
20664
20801
  },
20665
- runtimeState: BinaryStatusSchema
20802
+ runtimeState: BinaryStatusSchema,
20803
+ /**
20804
+ * Runtime-state durability: **restored** — transition-driven sensor state; the restored value gives the boot comparison.
20805
+ *
20806
+ * See `RuntimeStateDurability`. Enforced by
20807
+ * `scripts/check-runtime-state-durability.ts`.
20808
+ */
20809
+ durability: "restored",
20810
+ /** Clock fields: written, but excluded from the compare that decides
20811
+ * whether persisting is worth a SQLite commit. */
20812
+ volatileStateFields: ["lastChangedAt"]
20666
20813
  };
20667
20814
  /**
20668
20815
  * Dimmable-light brightness control. Co-exists with `switch` on the
@@ -20715,7 +20862,14 @@ onBrightnessChanged: { data: object({
20715
20862
  * by the kernel. Read via `device.state.brightness.value` so UI
20716
20863
  * sliders surface the current level without polling the provider.
20717
20864
  */
20718
- runtimeState: BrightnessStatusSchema
20865
+ runtimeState: BrightnessStatusSchema,
20866
+ /**
20867
+ * Runtime-state durability: **session** — live lamp state, re-published by the provider on connect.
20868
+ *
20869
+ * See `RuntimeStateDurability`. Enforced by
20870
+ * `scripts/check-runtime-state-durability.ts`.
20871
+ */
20872
+ durability: "session"
20719
20873
  };
20720
20874
  /**
20721
20875
  * button — device-scoped capability for HA `button.*` / `input_button.*`
@@ -20820,7 +20974,17 @@ var carbonMonoxideCapability = {
20820
20974
  schema: CarbonMonoxideStatusSchema,
20821
20975
  kind: "push"
20822
20976
  },
20823
- runtimeState: CarbonMonoxideStatusSchema
20977
+ runtimeState: CarbonMonoxideStatusSchema,
20978
+ /**
20979
+ * Runtime-state durability: **restored** — as `smoke`.
20980
+ *
20981
+ * See `RuntimeStateDurability`. Enforced by
20982
+ * `scripts/check-runtime-state-durability.ts`.
20983
+ */
20984
+ durability: "restored",
20985
+ /** Clock fields: written, but excluded from the compare that decides
20986
+ * whether persisting is worth a SQLite commit. */
20987
+ volatileStateFields: ["lastChangedAt"]
20824
20988
  };
20825
20989
  /**
20826
20990
  * HVAC / climate control cap. Models the full surface of a HA
@@ -20980,7 +21144,14 @@ var climateControlCapability = {
20980
21144
  * the full slice via `device.state.climate-control.value` and refresh
20981
21145
  * on every push without re-querying the provider.
20982
21146
  */
20983
- runtimeState: ClimateControlStatusSchema
21147
+ runtimeState: ClimateControlStatusSchema,
21148
+ /**
21149
+ * Runtime-state durability: **session** — as `brightness`; `currentTemp` moves continuously and is re-published on connect.
21150
+ *
21151
+ * See `RuntimeStateDurability`. Enforced by
21152
+ * `scripts/check-runtime-state-durability.ts`.
21153
+ */
21154
+ durability: "session"
20984
21155
  };
20985
21156
  /**
20986
21157
  * Color-light cap. Coexists with `switch` (on/off) and `brightness`
@@ -21090,7 +21261,14 @@ onColorChanged: { data: object({
21090
21261
  * kernel. Read via `device.state.color.value` so UI pickers surface
21091
21262
  * the current chromaticity without polling the provider.
21092
21263
  */
21093
- runtimeState: ColorStatusSchema
21264
+ runtimeState: ColorStatusSchema,
21265
+ /**
21266
+ * Runtime-state durability: **session** — as `brightness`.
21267
+ *
21268
+ * See `RuntimeStateDurability`. Enforced by
21269
+ * `scripts/check-runtime-state-durability.ts`.
21270
+ */
21271
+ durability: "session"
21094
21272
  };
21095
21273
  var ConnectionTestOutcomeSchema = discriminatedUnion("outcome", [
21096
21274
  object({
@@ -21148,7 +21326,17 @@ var connectivityCapability = {
21148
21326
  schema: ConnectivityStatusSchema,
21149
21327
  kind: "push"
21150
21328
  },
21151
- runtimeState: ConnectivityStatusSchema
21329
+ runtimeState: ConnectivityStatusSchema,
21330
+ /**
21331
+ * Runtime-state durability: **restored** — same shape and same argument as `device-status`, for links rather than devices.
21332
+ *
21333
+ * See `RuntimeStateDurability`. Enforced by
21334
+ * `scripts/check-runtime-state-durability.ts`.
21335
+ */
21336
+ durability: "restored",
21337
+ /** Clock fields: written, but excluded from the compare that decides
21338
+ * whether persisting is worth a SQLite commit. */
21339
+ volatileStateFields: ["lastChangedAt"]
21152
21340
  };
21153
21341
  /**
21154
21342
  * Generic device-consumables capability — surfaces a device's
@@ -21230,7 +21418,14 @@ reset: method(object({
21230
21418
  }
21231
21419
  }
21232
21420
  },
21233
- runtimeState: ConsumablesStatusSchema.extend({ lastFetchedAt: number() })
21421
+ runtimeState: ConsumablesStatusSchema.extend({ lastFetchedAt: number() }),
21422
+ /**
21423
+ * Runtime-state durability: **session** — the authority is the appliance; the provider re-reads the whole item array on connect.
21424
+ *
21425
+ * See `RuntimeStateDurability`. Enforced by
21426
+ * `scripts/check-runtime-state-durability.ts`.
21427
+ */
21428
+ durability: "session"
21234
21429
  };
21235
21430
  /**
21236
21431
  * Door / window / opening / garage / valve contact sensor. Boolean
@@ -21261,7 +21456,17 @@ var contactCapability = {
21261
21456
  schema: ContactStatusSchema,
21262
21457
  kind: "push"
21263
21458
  },
21264
- runtimeState: ContactStatusSchema
21459
+ runtimeState: ContactStatusSchema,
21460
+ /**
21461
+ * Runtime-state durability: **restored** — a door left open across a restart must still read open.
21462
+ *
21463
+ * See `RuntimeStateDurability`. Enforced by
21464
+ * `scripts/check-runtime-state-durability.ts`.
21465
+ */
21466
+ durability: "restored",
21467
+ /** Clock fields: written, but excluded from the compare that decides
21468
+ * whether persisting is worth a SQLite commit. */
21469
+ volatileStateFields: ["lastChangedAt"]
21265
21470
  };
21266
21471
  /**
21267
21472
  * Status slice — flat object (the framework's `runtimeState` contract
@@ -21367,7 +21572,14 @@ var controlCapability = {
21367
21572
  * dropdown / text field / date picker) read the slice's discriminant
21368
21573
  * and value directly without polling the provider.
21369
21574
  */
21370
- runtimeState: ControlStatusSchema
21575
+ runtimeState: ControlStatusSchema,
21576
+ /**
21577
+ * Runtime-state durability: **session** — a generic control mirrors an external entity that re-publishes on connect; the options array is re-derived with it.
21578
+ *
21579
+ * See `RuntimeStateDurability`. Enforced by
21580
+ * `scripts/check-runtime-state-durability.ts`.
21581
+ */
21582
+ durability: "session"
21371
21583
  };
21372
21584
  var CoverStatusSchema = object({
21373
21585
  /** Lifecycle state of the cover. */
@@ -21428,7 +21640,17 @@ var coverCapability = {
21428
21640
  * Runtime-state slice — mirrored by the kernel. UI controls watch
21429
21641
  * the slice for live position changes during a move.
21430
21642
  */
21431
- runtimeState: CoverStatusSchema
21643
+ runtimeState: CoverStatusSchema,
21644
+ /**
21645
+ * Runtime-state durability: **restored** — position survives a restart on the device; the mirror should agree at boot rather than read blank.
21646
+ *
21647
+ * See `RuntimeStateDurability`. Enforced by
21648
+ * `scripts/check-runtime-state-durability.ts`.
21649
+ */
21650
+ durability: "restored",
21651
+ /** Clock fields: written, but excluded from the compare that decides
21652
+ * whether persisting is worth a SQLite commit. */
21653
+ volatileStateFields: ["lastChangedAt"]
21432
21654
  };
21433
21655
  /**
21434
21656
  * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
@@ -21522,7 +21744,17 @@ var dayNightCapability = {
21522
21744
  schema: DayNightStatusSchema,
21523
21745
  kind: "poll"
21524
21746
  },
21525
- runtimeState: DayNightStatusSchema
21747
+ runtimeState: DayNightStatusSchema,
21748
+ /**
21749
+ * Runtime-state durability: **restored** — operator-set IR-cut behaviour; mutation-driven.
21750
+ *
21751
+ * See `RuntimeStateDurability`. Enforced by
21752
+ * `scripts/check-runtime-state-durability.ts`.
21753
+ */
21754
+ durability: "restored",
21755
+ /** Clock fields: written, but excluded from the compare that decides
21756
+ * whether persisting is worth a SQLite commit. */
21757
+ volatileStateFields: ["lastFetchedAt"]
21526
21758
  };
21527
21759
  /**
21528
21760
  * Generic device-level status snapshot. Auto-registered by `BaseDevice`
@@ -21569,7 +21801,17 @@ onStatusChanged: { data: object({
21569
21801
  schema: DeviceStatusSchema,
21570
21802
  kind: "push"
21571
21803
  },
21572
- runtimeState: DeviceStatusSchema
21804
+ runtimeState: DeviceStatusSchema,
21805
+ /**
21806
+ * 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.
21807
+ *
21808
+ * See `RuntimeStateDurability`. Enforced by
21809
+ * `scripts/check-runtime-state-durability.ts`.
21810
+ */
21811
+ durability: "restored",
21812
+ /** Clock fields: written, but excluded from the compare that decides
21813
+ * whether persisting is worth a SQLite commit. */
21814
+ volatileStateFields: ["lastChangedAt"]
21573
21815
  };
21574
21816
  /**
21575
21817
  * Doorbell button cap. Two kinds of providers coexist behind this cap
@@ -21631,7 +21873,14 @@ onPressed: { data: DoorbellPressEventSchema } },
21631
21873
  * `device.state.doorbell.value`. UIs can show "last ring 5m ago"
21632
21874
  * without subscribing.
21633
21875
  */
21634
- runtimeState: DoorbellStatusSchema
21876
+ runtimeState: DoorbellStatusSchema,
21877
+ /**
21878
+ * 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.
21879
+ *
21880
+ * See `RuntimeStateDurability`. Enforced by
21881
+ * `scripts/check-runtime-state-durability.ts`.
21882
+ */
21883
+ durability: "restored"
21635
21884
  };
21636
21885
  /**
21637
21886
  * Enum-state sensor — a string value picked from a finite option set.
@@ -21671,7 +21920,17 @@ var enumSensorCapability = {
21671
21920
  schema: EnumSensorStatusSchema,
21672
21921
  kind: "push"
21673
21922
  },
21674
- runtimeState: EnumSensorStatusSchema
21923
+ runtimeState: EnumSensorStatusSchema,
21924
+ /**
21925
+ * Runtime-state durability: **restored** — as `numeric-sensor`; 80 devices.
21926
+ *
21927
+ * See `RuntimeStateDurability`. Enforced by
21928
+ * `scripts/check-runtime-state-durability.ts`.
21929
+ */
21930
+ durability: "restored",
21931
+ /** Clock fields: written, but excluded from the compare that decides
21932
+ * whether persisting is worth a SQLite commit. */
21933
+ volatileStateFields: ["lastFetchedAt"]
21675
21934
  };
21676
21935
  /**
21677
21936
  * Generic stateless event emitter. Installed on a `DeviceType.EventEmitter`
@@ -21707,7 +21966,14 @@ var eventEmitterCapability = {
21707
21966
  schema: EventEmitterStatusSchema,
21708
21967
  kind: "push"
21709
21968
  },
21710
- runtimeState: EventEmitterStatusSchema
21969
+ runtimeState: EventEmitterStatusSchema,
21970
+ /**
21971
+ * Runtime-state durability: **session** — `eventCountSinceStart` names its own scope.
21972
+ *
21973
+ * See `RuntimeStateDurability`. Enforced by
21974
+ * `scripts/check-runtime-state-durability.ts`.
21975
+ */
21976
+ durability: "session"
21711
21977
  };
21712
21978
  var EventItemSchema = object({
21713
21979
  id: string(),
@@ -21988,7 +22254,14 @@ var fanControlCapability = {
21988
22254
  * Runtime-state slice — mirrored by the kernel. UI fan speed
21989
22255
  * sliders read `percentage` for live updates.
21990
22256
  */
21991
- runtimeState: FanControlStatusSchema
22257
+ runtimeState: FanControlStatusSchema,
22258
+ /**
22259
+ * Runtime-state durability: **session** — as `brightness`.
22260
+ *
22261
+ * See `RuntimeStateDurability`. Enforced by
22262
+ * `scripts/check-runtime-state-durability.ts`.
22263
+ */
22264
+ durability: "session"
21992
22265
  };
21993
22266
  /**
21994
22267
  * Per-device feature/identity probe slice. Holds the runtime-resolved
@@ -22064,7 +22337,14 @@ onProbeChanged: { data: object({
22064
22337
  schema: FeatureProbeStatusSchema,
22065
22338
  kind: "push"
22066
22339
  },
22067
- runtimeState: FeatureProbeStatusSchema
22340
+ runtimeState: FeatureProbeStatusSchema,
22341
+ /**
22342
+ * 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.
22343
+ *
22344
+ * See `RuntimeStateDurability`. Enforced by
22345
+ * `scripts/check-runtime-state-durability.ts`.
22346
+ */
22347
+ durability: "session"
22068
22348
  };
22069
22349
  /**
22070
22350
  * Water leak / moisture sensor. Boolean "is liquid currently
@@ -22091,7 +22371,17 @@ var floodCapability = {
22091
22371
  schema: FloodStatusSchema,
22092
22372
  kind: "push"
22093
22373
  },
22094
- runtimeState: FloodStatusSchema
22374
+ runtimeState: FloodStatusSchema,
22375
+ /**
22376
+ * Runtime-state durability: **restored** — as `smoke`.
22377
+ *
22378
+ * See `RuntimeStateDurability`. Enforced by
22379
+ * `scripts/check-runtime-state-durability.ts`.
22380
+ */
22381
+ durability: "restored",
22382
+ /** Clock fields: written, but excluded from the compare that decides
22383
+ * whether persisting is worth a SQLite commit. */
22384
+ volatileStateFields: ["lastChangedAt"]
22095
22385
  };
22096
22386
  /**
22097
22387
  * Combustible-gas (LPG / methane / hydrogen) alarm sensor. Drives
@@ -22114,7 +22404,17 @@ var gasCapability = {
22114
22404
  schema: GasStatusSchema,
22115
22405
  kind: "push"
22116
22406
  },
22117
- runtimeState: GasStatusSchema
22407
+ runtimeState: GasStatusSchema,
22408
+ /**
22409
+ * Runtime-state durability: **restored** — as `smoke`.
22410
+ *
22411
+ * See `RuntimeStateDurability`. Enforced by
22412
+ * `scripts/check-runtime-state-durability.ts`.
22413
+ */
22414
+ durability: "restored",
22415
+ /** Clock fields: written, but excluded from the compare that decides
22416
+ * whether persisting is worth a SQLite commit. */
22417
+ volatileStateFields: ["lastChangedAt"]
22118
22418
  };
22119
22419
  /**
22120
22420
  * Humidifier / dehumidifier cap. Models HA `humidifier.*` entities —
@@ -22190,7 +22490,14 @@ var humidifierCapability = {
22190
22490
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
22191
22491
  * slice for live humidity / mode changes.
22192
22492
  */
22193
- runtimeState: HumidifierStatusSchema
22493
+ runtimeState: HumidifierStatusSchema,
22494
+ /**
22495
+ * Runtime-state durability: **session** — as `climate-control`.
22496
+ *
22497
+ * See `RuntimeStateDurability`. Enforced by
22498
+ * `scripts/check-runtime-state-durability.ts`.
22499
+ */
22500
+ durability: "session"
22194
22501
  };
22195
22502
  /**
22196
22503
  * Single-metric humidity reading. Drives Home Assistant `sensor`
@@ -22226,7 +22533,17 @@ var humiditySensorCapability = {
22226
22533
  schema: HumiditySensorStatusSchema,
22227
22534
  kind: "push"
22228
22535
  },
22229
- runtimeState: HumiditySensorStatusSchema
22536
+ runtimeState: HumiditySensorStatusSchema,
22537
+ /**
22538
+ * Runtime-state durability: **restored** — as `numeric-sensor` (67 of 75 writes were the clock alone).
22539
+ *
22540
+ * See `RuntimeStateDurability`. Enforced by
22541
+ * `scripts/check-runtime-state-durability.ts`.
22542
+ */
22543
+ durability: "restored",
22544
+ /** Clock fields: written, but excluded from the compare that decides
22545
+ * whether persisting is worth a SQLite commit. */
22546
+ volatileStateFields: ["lastFetchedAt"]
22230
22547
  };
22231
22548
  /**
22232
22549
  * Image display cap. Models a single still image exposed by an integration —
@@ -22264,7 +22581,14 @@ var imageCapability = {
22264
22581
  * Runtime-state slice — mirrored by the kernel. The UI reads `url`
22265
22582
  * directly and renders the still image.
22266
22583
  */
22267
- runtimeState: ImageStatusSchema
22584
+ runtimeState: ImageStatusSchema,
22585
+ /**
22586
+ * Runtime-state durability: **session** — a snapshot URL is a session-scoped handle; a restored one points at nothing.
22587
+ *
22588
+ * See `RuntimeStateDurability`. Enforced by
22589
+ * `scripts/check-runtime-state-durability.ts`.
22590
+ */
22591
+ durability: "session"
22268
22592
  };
22269
22593
  /**
22270
22594
  * Vendor-neutral image / picture-adjustment cap — the per-camera config
@@ -22413,7 +22737,17 @@ var imageSettingsCapability = {
22413
22737
  schema: ImageSettingsStatusSchema,
22414
22738
  kind: "poll"
22415
22739
  },
22416
- runtimeState: ImageSettingsStatusSchema
22740
+ runtimeState: ImageSettingsStatusSchema,
22741
+ /**
22742
+ * Runtime-state durability: **restored** — operator-set camera imaging; mutation-driven.
22743
+ *
22744
+ * See `RuntimeStateDurability`. Enforced by
22745
+ * `scripts/check-runtime-state-durability.ts`.
22746
+ */
22747
+ durability: "restored",
22748
+ /** Clock fields: written, but excluded from the compare that decides
22749
+ * whether persisting is worth a SQLite commit. */
22750
+ volatileStateFields: ["lastFetchedAt"]
22417
22751
  };
22418
22752
  /**
22419
22753
  * integrations — system-scoped singleton capability for integration
@@ -22753,7 +23087,14 @@ var lawnMowerControlCapability = {
22753
23087
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
22754
23088
  * slice for live activity + battery changes.
22755
23089
  */
22756
- runtimeState: LawnMowerControlStatusSchema
23090
+ runtimeState: LawnMowerControlStatusSchema,
23091
+ /**
23092
+ * Runtime-state durability: **session** — as `vacuum-control`.
23093
+ *
23094
+ * See `RuntimeStateDurability`. Enforced by
23095
+ * `scripts/check-runtime-state-durability.ts`.
23096
+ */
23097
+ durability: "session"
22757
23098
  };
22758
23099
  /**
22759
23100
  * local-network — hub-only singleton.
@@ -22959,7 +23300,17 @@ var lockControlCapability = {
22959
23300
  * read `state` and disable themselves during `locking`/`unlocking`
22960
23301
  * transitions.
22961
23302
  */
22962
- runtimeState: LockControlStatusSchema
23303
+ runtimeState: LockControlStatusSchema,
23304
+ /**
23305
+ * Runtime-state durability: **restored** — a lock left locked must still read locked.
23306
+ *
23307
+ * See `RuntimeStateDurability`. Enforced by
23308
+ * `scripts/check-runtime-state-durability.ts`.
23309
+ */
23310
+ durability: "restored",
23311
+ /** Clock fields: written, but excluded from the compare that decides
23312
+ * whether persisting is worth a SQLite commit. */
23313
+ volatileStateFields: ["lastChangedAt"]
22963
23314
  };
22964
23315
  /**
22965
23316
  * Media-player cap. Models HA `media_player.*` (Sonos, Chromecast,
@@ -23121,7 +23472,14 @@ var mediaPlayerCapability = {
23121
23472
  * full slice for live now-playing, volume, and progress updates
23122
23473
  * without polling.
23123
23474
  */
23124
- runtimeState: MediaPlayerStatusSchema
23475
+ runtimeState: MediaPlayerStatusSchema,
23476
+ /**
23477
+ * Runtime-state durability: **session** — a restored transport position describes a playback that stopped when the hub did.
23478
+ *
23479
+ * See `RuntimeStateDurability`. Enforced by
23480
+ * `scripts/check-runtime-state-durability.ts`.
23481
+ */
23482
+ durability: "session"
23125
23483
  };
23126
23484
  /**
23127
23485
  * mesh-network — collection cap for mesh-VPN providers.
@@ -23385,7 +23743,14 @@ onMotionChanged: { data: MotionOnMotionChangedDataSchema } },
23385
23743
  * `device.state.motion.value`. Reads never invoke the provider, so
23386
23744
  * UIs and other addons can poll the cached state safely.
23387
23745
  */
23388
- runtimeState: MotionStatusSchema
23746
+ runtimeState: MotionStatusSchema,
23747
+ /**
23748
+ * 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.
23749
+ *
23750
+ * See `RuntimeStateDurability`. Enforced by
23751
+ * `scripts/check-runtime-state-durability.ts`.
23752
+ */
23753
+ durability: "session"
23389
23754
  };
23390
23755
  /**
23391
23756
  * Motion-trigger toggle for accessory devices.
@@ -23450,7 +23815,14 @@ var motionTriggerCapability = {
23450
23815
  schema: MotionTriggerStatusSchema,
23451
23816
  kind: "command-driven"
23452
23817
  },
23453
- runtimeState: MotionTriggerRuntimeStateSchema
23818
+ runtimeState: MotionTriggerRuntimeStateSchema,
23819
+ /**
23820
+ * 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.
23821
+ *
23822
+ * See `RuntimeStateDurability`. Enforced by
23823
+ * `scripts/check-runtime-state-durability.ts`.
23824
+ */
23825
+ durability: "session"
23454
23826
  };
23455
23827
  /**
23456
23828
  * Motion-zones share the same MaskShape vocabulary as privacy-mask — the
@@ -23517,7 +23889,17 @@ var motionZonesCapability = {
23517
23889
  schema: MotionZoneStatusSchema,
23518
23890
  kind: "poll"
23519
23891
  },
23520
- runtimeState: MotionZoneStatusSchema
23892
+ runtimeState: MotionZoneStatusSchema,
23893
+ /**
23894
+ * 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.
23895
+ *
23896
+ * See `RuntimeStateDurability`. Enforced by
23897
+ * `scripts/check-runtime-state-durability.ts`.
23898
+ */
23899
+ durability: "restored",
23900
+ /** Clock fields: written, but excluded from the compare that decides
23901
+ * whether persisting is worth a SQLite commit. */
23902
+ volatileStateFields: ["lastFetchedAt"]
23521
23903
  };
23522
23904
  /**
23523
23905
  * On-camera AI object detection cap. Surfaces per-device the classes
@@ -23591,7 +23973,17 @@ var nativeObjectDetectionCapability = {
23591
23973
  schema: NativeObjectDetectionStatusSchema,
23592
23974
  kind: "push"
23593
23975
  },
23594
- runtimeState: NativeObjectDetectionRuntimeStateSchema
23976
+ runtimeState: NativeObjectDetectionRuntimeStateSchema,
23977
+ /**
23978
+ * 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.
23979
+ *
23980
+ * See `RuntimeStateDurability`. Enforced by
23981
+ * `scripts/check-runtime-state-durability.ts`.
23982
+ */
23983
+ durability: "restored",
23984
+ /** Clock fields: written, but excluded from the compare that decides
23985
+ * whether persisting is worth a SQLite commit. */
23986
+ volatileStateFields: ["lastFetchedAt"]
23595
23987
  };
23596
23988
  /**
23597
23989
  * network-quality — system-scoped singleton capability tracking RTT,
@@ -23925,7 +24317,14 @@ onSent: { data: object({
23925
24317
  * form reads `supports` to gate optional fields; history pane reads
23926
24318
  * `lastSentAt` / `lastError` / `queueDepth`.
23927
24319
  */
23928
- runtimeState: NotifierStatusSchema
24320
+ runtimeState: NotifierStatusSchema,
24321
+ /**
24322
+ * Runtime-state durability: **session** — live queue depth and last-send state; a restored queue depth describes a queue that no longer exists.
24323
+ *
24324
+ * See `RuntimeStateDurability`. Enforced by
24325
+ * `scripts/check-runtime-state-durability.ts`.
24326
+ */
24327
+ durability: "session"
23929
24328
  };
23930
24329
  /**
23931
24330
  * Generic numeric sensor — last-resort fallback when no typed numeric
@@ -23968,7 +24367,17 @@ var numericSensorCapability = {
23968
24367
  schema: NumericSensorStatusSchema,
23969
24368
  kind: "push"
23970
24369
  },
23971
- runtimeState: NumericSensorStatusSchema
24370
+ runtimeState: NumericSensorStatusSchema,
24371
+ /**
24372
+ * 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.
24373
+ *
24374
+ * See `RuntimeStateDurability`. Enforced by
24375
+ * `scripts/check-runtime-state-durability.ts`.
24376
+ */
24377
+ durability: "restored",
24378
+ /** Clock fields: written, but excluded from the compare that decides
24379
+ * whether persisting is worth a SQLite commit. */
24380
+ volatileStateFields: ["lastFetchedAt"]
23972
24381
  };
23973
24382
  /**
23974
24383
  * Generic on-screen-display (video overlay) cap. Each camera exposes
@@ -24353,7 +24762,14 @@ var petFeederCapability = {
24353
24762
  * the full slice via `device.state.petFeeder.value` and refresh on
24354
24763
  * every poll without re-querying the provider.
24355
24764
  */
24356
- runtimeState: PetFeederStatusSchema
24765
+ runtimeState: PetFeederStatusSchema,
24766
+ /**
24767
+ * Runtime-state durability: **session** — live appliance state re-published on connect.
24768
+ *
24769
+ * See `RuntimeStateDurability`. Enforced by
24770
+ * `scripts/check-runtime-state-durability.ts`.
24771
+ */
24772
+ durability: "session"
24357
24773
  };
24358
24774
  var VehicleSchema = object({
24359
24775
  id: string(),
@@ -24665,7 +25081,17 @@ var powerMeterCapability = {
24665
25081
  schema: PowerMeterStatusSchema,
24666
25082
  kind: "push"
24667
25083
  },
24668
- runtimeState: PowerMeterStatusSchema
25084
+ runtimeState: PowerMeterStatusSchema,
25085
+ /**
25086
+ * Runtime-state durability: **restored** — as `numeric-sensor`; `kwhTotal` is an accumulator whose restored value is the baseline.
25087
+ *
25088
+ * See `RuntimeStateDurability`. Enforced by
25089
+ * `scripts/check-runtime-state-durability.ts`.
25090
+ */
25091
+ durability: "restored",
25092
+ /** Clock fields: written, but excluded from the compare that decides
25093
+ * whether persisting is worth a SQLite commit. */
25094
+ volatileStateFields: ["lastFetchedAt"]
24669
25095
  };
24670
25096
  /**
24671
25097
  * Presence cap. Models HA `person.*` and `device_tracker.*` entities
@@ -24722,7 +25148,17 @@ var presenceCapability = {
24722
25148
  * the map pin is rendered (use `DeviceFeature.PresenceGps` for the
24723
25149
  * pre-fetch fast-path check).
24724
25150
  */
24725
- runtimeState: PresenceStatusSchema
25151
+ runtimeState: PresenceStatusSchema,
25152
+ /**
25153
+ * Runtime-state durability: **restored** — occupancy-relevant: the restored state is what an occupancy rule compares the first post-restart observation against.
25154
+ *
25155
+ * See `RuntimeStateDurability`. Enforced by
25156
+ * `scripts/check-runtime-state-durability.ts`.
25157
+ */
25158
+ durability: "restored",
25159
+ /** Clock fields: written, but excluded from the compare that decides
25160
+ * whether persisting is worth a SQLite commit. */
25161
+ volatileStateFields: ["lastChangedAt"]
24726
25162
  };
24727
25163
  /**
24728
25164
  * Atmospheric pressure reading in hectopascals. Drives Home Assistant
@@ -24758,7 +25194,17 @@ var pressureSensorCapability = {
24758
25194
  schema: PressureSensorStatusSchema,
24759
25195
  kind: "push"
24760
25196
  },
24761
- runtimeState: PressureSensorStatusSchema
25197
+ runtimeState: PressureSensorStatusSchema,
25198
+ /**
25199
+ * Runtime-state durability: **restored** — as `numeric-sensor`.
25200
+ *
25201
+ * See `RuntimeStateDurability`. Enforced by
25202
+ * `scripts/check-runtime-state-durability.ts`.
25203
+ */
25204
+ durability: "restored",
25205
+ /** Clock fields: written, but excluded from the compare that decides
25206
+ * whether persisting is worth a SQLite commit. */
25207
+ volatileStateFields: ["lastFetchedAt"]
24762
25208
  };
24763
25209
  /**
24764
25210
  * PRIVACY — what the camera deliberately does not capture. Two planes:
@@ -24888,7 +25334,17 @@ var privacyMaskCapability = {
24888
25334
  schema: PrivacyMaskStatusSchema,
24889
25335
  kind: "poll"
24890
25336
  },
24891
- runtimeState: PrivacyMaskStatusSchema
25337
+ runtimeState: PrivacyMaskStatusSchema,
25338
+ /**
25339
+ * Runtime-state durability: **restored** — operator-drawn regions, zero real churn — 22 writes in 25 minutes, every one of them the clock.
25340
+ *
25341
+ * See `RuntimeStateDurability`. Enforced by
25342
+ * `scripts/check-runtime-state-durability.ts`.
25343
+ */
25344
+ durability: "restored",
25345
+ /** Clock fields: written, but excluded from the compare that decides
25346
+ * whether persisting is worth a SQLite commit. */
25347
+ volatileStateFields: ["lastFetchedAt"]
24892
25348
  };
24893
25349
  var PtzPresetSchema = object({
24894
25350
  id: string(),
@@ -25054,7 +25510,14 @@ var ptzAutotrackCapability = {
25054
25510
  * fetch / cache / fallback logic out of the four cap methods —
25055
25511
  * they become trampolines over `runtimeState`.
25056
25512
  */
25057
- runtimeState: PtzAutotrackRuntimeStateSchema
25513
+ runtimeState: PtzAutotrackRuntimeStateSchema,
25514
+ /**
25515
+ * Runtime-state durability: **session** — mirrors the camera's own autotrack config, re-read on connect.
25516
+ *
25517
+ * See `RuntimeStateDurability`. Enforced by
25518
+ * `scripts/check-runtime-state-durability.ts`.
25519
+ */
25520
+ durability: "session"
25058
25521
  };
25059
25522
  DeviceType.Camera, DeviceType.Sensor, DeviceType.Switch, method(object({ deviceId: number().int().nonnegative() }), object({ success: literal(true) }), {
25060
25523
  kind: "mutation",
@@ -25704,7 +26167,14 @@ var sceneMonitorCapability = {
25704
26167
  schema: SceneMonitorStatusSchema,
25705
26168
  kind: "push"
25706
26169
  },
25707
- runtimeState: SceneMonitorStatusSchema
26170
+ runtimeState: SceneMonitorStatusSchema,
26171
+ /**
26172
+ * Runtime-state durability: **session** — re-derived from the current scene on the next evaluation.
26173
+ *
26174
+ * See `RuntimeStateDurability`. Enforced by
26175
+ * `scripts/check-runtime-state-durability.ts`.
26176
+ */
26177
+ durability: "session"
25708
26178
  };
25709
26179
  /**
25710
26180
  * Per-stage gating mode applied to the zones a rule references.
@@ -25848,7 +26318,14 @@ var scriptRunnerCapability = {
25848
26318
  * `isRunning` to render a spinner during execution and surfaces
25849
26319
  * `lastError` / `lastRunSuccess` in the recent-runs panel.
25850
26320
  */
25851
- runtimeState: ScriptRunnerStatusSchema
26321
+ runtimeState: ScriptRunnerStatusSchema,
26322
+ /**
26323
+ * Runtime-state durability: **session** — a restored `isRunning: true` describes a process that died with the previous hub.
26324
+ *
26325
+ * See `RuntimeStateDurability`. Enforced by
26326
+ * `scripts/check-runtime-state-durability.ts`.
26327
+ */
26328
+ durability: "session"
25852
26329
  };
25853
26330
  /**
25854
26331
  * Smoke alarm sensor — boolean "is smoke currently detected" with
@@ -25875,7 +26352,17 @@ var smokeCapability = {
25875
26352
  schema: SmokeStatusSchema,
25876
26353
  kind: "push"
25877
26354
  },
25878
- runtimeState: SmokeStatusSchema
26355
+ runtimeState: SmokeStatusSchema,
26356
+ /**
26357
+ * Runtime-state durability: **restored** — a safety sensor must not read "clear" merely because the hub restarted.
26358
+ *
26359
+ * See `RuntimeStateDurability`. Enforced by
26360
+ * `scripts/check-runtime-state-durability.ts`.
26361
+ */
26362
+ durability: "restored",
26363
+ /** Clock fields: written, but excluded from the compare that decides
26364
+ * whether persisting is worth a SQLite commit. */
26365
+ volatileStateFields: ["lastChangedAt"]
25879
26366
  };
25880
26367
  /**
25881
26368
  * One publishable camera stream as its OWNING PROVIDER describes it — the same
@@ -26048,7 +26535,17 @@ var streamParamsCapability = {
26048
26535
  schema: StreamParamsStatusSchema,
26049
26536
  kind: "poll"
26050
26537
  },
26051
- runtimeState: StreamParamsStatusSchema
26538
+ runtimeState: StreamParamsStatusSchema,
26539
+ /**
26540
+ * Runtime-state durability: **restored** — operator-set encoder profile; mutation-driven.
26541
+ *
26542
+ * See `RuntimeStateDurability`. Enforced by
26543
+ * `scripts/check-runtime-state-durability.ts`.
26544
+ */
26545
+ durability: "restored",
26546
+ /** Clock fields: written, but excluded from the compare that decides
26547
+ * whether persisting is worth a SQLite commit. */
26548
+ volatileStateFields: ["lastFetchedAt"]
26052
26549
  };
26053
26550
  /**
26054
26551
  * Generic on/off switch cap for accessory children (siren, floodlight,
@@ -26094,6 +26591,16 @@ var switchCapability = {
26094
26591
  * not need to re-query the provider after a setState mutation.
26095
26592
  */
26096
26593
  runtimeState: SwitchStatusSchema,
26594
+ /**
26595
+ * Runtime-state durability: **restored** — device state an operator reads as authoritative; 55 devices, transition-driven.
26596
+ *
26597
+ * See `RuntimeStateDurability`. Enforced by
26598
+ * `scripts/check-runtime-state-durability.ts`.
26599
+ */
26600
+ durability: "restored",
26601
+ /** Clock fields: written, but excluded from the compare that decides
26602
+ * whether persisting is worth a SQLite commit. */
26603
+ volatileStateFields: ["lastChangedAt"],
26097
26604
  settings: { bindings: [{
26098
26605
  kind: "scalar",
26099
26606
  statusPath: "on",
@@ -26173,7 +26680,17 @@ var tamperCapability = {
26173
26680
  schema: TamperStatusSchema,
26174
26681
  kind: "push"
26175
26682
  },
26176
- runtimeState: TamperStatusSchema
26683
+ runtimeState: TamperStatusSchema,
26684
+ /**
26685
+ * Runtime-state durability: **restored** — as `smoke`.
26686
+ *
26687
+ * See `RuntimeStateDurability`. Enforced by
26688
+ * `scripts/check-runtime-state-durability.ts`.
26689
+ */
26690
+ durability: "restored",
26691
+ /** Clock fields: written, but excluded from the compare that decides
26692
+ * whether persisting is worth a SQLite commit. */
26693
+ volatileStateFields: ["lastChangedAt"]
26177
26694
  };
26178
26695
  /**
26179
26696
  * Single-metric temperature reading. Drives Home Assistant `sensor`
@@ -26218,7 +26735,17 @@ var temperatureSensorCapability = {
26218
26735
  schema: TemperatureSensorStatusSchema,
26219
26736
  kind: "push"
26220
26737
  },
26221
- runtimeState: TemperatureSensorStatusSchema
26738
+ runtimeState: TemperatureSensorStatusSchema,
26739
+ /**
26740
+ * Runtime-state durability: **restored** — as `numeric-sensor` (69 of 125 writes were the clock alone).
26741
+ *
26742
+ * See `RuntimeStateDurability`. Enforced by
26743
+ * `scripts/check-runtime-state-durability.ts`.
26744
+ */
26745
+ durability: "restored",
26746
+ /** Clock fields: written, but excluded from the compare that decides
26747
+ * whether persisting is worth a SQLite commit. */
26748
+ volatileStateFields: ["lastFetchedAt"]
26222
26749
  };
26223
26750
  /**
26224
26751
  * toast — system-scoped singleton capability that streams toast
@@ -26287,7 +26814,14 @@ var updateCapability = {
26287
26814
  schema: UpdateStatusSchema,
26288
26815
  kind: "poll"
26289
26816
  },
26290
- runtimeState: UpdateStatusSchema
26817
+ runtimeState: UpdateStatusSchema,
26818
+ /**
26819
+ * Runtime-state durability: **session** — a restored `inProgress: true` describes an update that is no longer running; versions are re-probed at boot.
26820
+ *
26821
+ * See `RuntimeStateDurability`. Enforced by
26822
+ * `scripts/check-runtime-state-durability.ts`.
26823
+ */
26824
+ durability: "session"
26291
26825
  };
26292
26826
  var UserSummarySchema = object({
26293
26827
  id: string(),
@@ -26621,7 +27155,14 @@ var vacuumControlCapability = {
26621
27155
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
26622
27156
  * slice for live state + battery + fan-speed changes.
26623
27157
  */
26624
- runtimeState: VacuumControlStatusSchema
27158
+ runtimeState: VacuumControlStatusSchema,
27159
+ /**
27160
+ * Runtime-state durability: **session** — as `media-player` — a restored `state: cleaning` is a robot that is not cleaning.
27161
+ *
27162
+ * See `RuntimeStateDurability`. Enforced by
27163
+ * `scripts/check-runtime-state-durability.ts`.
27164
+ */
27165
+ durability: "session"
26625
27166
  };
26626
27167
  var ValveStatusSchema = object({
26627
27168
  /** Lifecycle state of the valve. */
@@ -26673,7 +27214,14 @@ var valveCapability = {
26673
27214
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
26674
27215
  * slice for live position changes during a move.
26675
27216
  */
26676
- runtimeState: ValveStatusSchema
27217
+ runtimeState: ValveStatusSchema,
27218
+ /**
27219
+ * Runtime-state durability: **session** — as `brightness`.
27220
+ *
27221
+ * See `RuntimeStateDurability`. Enforced by
27222
+ * `scripts/check-runtime-state-durability.ts`.
27223
+ */
27224
+ durability: "session"
26677
27225
  };
26678
27226
  /**
26679
27227
  * Vibration / shake / impact sensor. Drives Home Assistant
@@ -26695,7 +27243,17 @@ var vibrationCapability = {
26695
27243
  schema: VibrationStatusSchema,
26696
27244
  kind: "push"
26697
27245
  },
26698
- runtimeState: VibrationStatusSchema
27246
+ runtimeState: VibrationStatusSchema,
27247
+ /**
27248
+ * Runtime-state durability: **restored** — as `smoke`.
27249
+ *
27250
+ * See `RuntimeStateDurability`. Enforced by
27251
+ * `scripts/check-runtime-state-durability.ts`.
27252
+ */
27253
+ durability: "restored",
27254
+ /** Clock fields: written, but excluded from the compare that decides
27255
+ * whether persisting is worth a SQLite commit. */
27256
+ volatileStateFields: ["lastChangedAt"]
26699
27257
  };
26700
27258
  /**
26701
27259
  * Water heater / boiler cap. Models HA `water_heater.*` entities — a
@@ -26769,7 +27327,14 @@ var waterHeaterCapability = {
26769
27327
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
26770
27328
  * slice for live temperature / mode / away changes.
26771
27329
  */
26772
- runtimeState: WaterHeaterStatusSchema
27330
+ runtimeState: WaterHeaterStatusSchema,
27331
+ /**
27332
+ * Runtime-state durability: **session** — as `climate-control`.
27333
+ *
27334
+ * See `RuntimeStateDurability`. Enforced by
27335
+ * `scripts/check-runtime-state-durability.ts`.
27336
+ */
27337
+ durability: "session"
26773
27338
  };
26774
27339
  /**
26775
27340
  * Weather provider cap. Models HA `weather.*` entities — a read-only
@@ -26828,7 +27393,14 @@ var weatherCapability = {
26828
27393
  * Runtime-state slice — mirrored by the kernel. The UI reads the
26829
27394
  * current conditions directly from the slice on each weather push.
26830
27395
  */
26831
- runtimeState: WeatherStatusSchema
27396
+ runtimeState: WeatherStatusSchema,
27397
+ /**
27398
+ * Runtime-state durability: **session** — a forecast is stale the moment the hub is down; the provider re-fetches on connect.
27399
+ *
27400
+ * See `RuntimeStateDurability`. Enforced by
27401
+ * `scripts/check-runtime-state-durability.ts`.
27402
+ */
27403
+ durability: "session"
26832
27404
  };
26833
27405
  /**
26834
27406
  * Per-zone occupancy aggregation produced by the analytics frame
@@ -26990,7 +27562,14 @@ var zoneAnalyticsCapability = {
26990
27562
  * automatically; the explicit `getCurrentSnapshot` cap method is
26991
27563
  * still useful for one-off polls without a subscription.
26992
27564
  */
26993
- runtimeState: CameraOccupancySnapshotSchema
27565
+ runtimeState: CameraOccupancySnapshotSchema,
27566
+ /**
27567
+ * Runtime-state durability: **session** — per-frame analytics; with `audio-metrics` it is ~90 % of the offered write rate. Re-derived on the next frame.
27568
+ *
27569
+ * See `RuntimeStateDurability`. Enforced by
27570
+ * `scripts/check-runtime-state-durability.ts`.
27571
+ */
27572
+ durability: "session"
26994
27573
  };
26995
27574
  /**
26996
27575
  * Stages a {@link ZoneRule} can apply to. Discriminator on the rules
@@ -27068,7 +27647,14 @@ var zoneRulesCapability = {
27068
27647
  motion: array(ZoneRuleSchema).readonly(),
27069
27648
  detection: array(ZoneRuleSchema).readonly(),
27070
27649
  package: array(ZoneRuleSchema).readonly()
27071
- })
27650
+ }),
27651
+ /**
27652
+ * Runtime-state durability: **restored** — operator intent, mutation-only, same argument as `zones`.
27653
+ *
27654
+ * See `RuntimeStateDurability`. Enforced by
27655
+ * `scripts/check-runtime-state-durability.ts`.
27656
+ */
27657
+ durability: "restored"
27072
27658
  };
27073
27659
  /**
27074
27660
  * Accessory device helpers — shared across drivers.
@@ -33755,6 +34341,7 @@ Object.freeze({
33755
34341
  "network-access": "ingress",
33756
34342
  "smtp-provider": "email"
33757
34343
  });
34344
+ new Map(AUDIO_MACRO_LABELS.flatMap((macro) => macro.icon === void 0 ? [] : [[macro.id, macro.icon]]));
33758
34345
  new Set(["devices", "classes"]);
33759
34346
  /**
33760
34347
  * TimelapseRule — the STANDALONE scheduled timelapse producer's rule model.