@camstack/addon-terminal 0.1.18 → 0.1.19

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.js CHANGED
@@ -10856,7 +10856,14 @@ var cameraStreamsCapability = {
10856
10856
  low: string().optional()
10857
10857
  }),
10858
10858
  lastChangedAt: number()
10859
- })
10859
+ }),
10860
+ /**
10861
+ * 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.
10862
+ *
10863
+ * See `RuntimeStateDurability`. Enforced by
10864
+ * `scripts/check-runtime-state-durability.ts`.
10865
+ */
10866
+ durability: "session"
10860
10867
  };
10861
10868
  /** Where a block runs. The operator chooses — a block driving a device on an
10862
10869
  * agent is the reason placement is not fixed to the hub. */
@@ -11417,6 +11424,13 @@ var deviceDiscoveryCapability = {
11417
11424
  kind: "poll"
11418
11425
  },
11419
11426
  runtimeState: DeviceDiscoveryStatusSchema.extend({ lastFetchedAt: number().int().nonnegative() }),
11427
+ /**
11428
+ * Runtime-state durability: **session** — 5.7 KB of scan output on the largest device, fully re-derivable by re-scanning.
11429
+ *
11430
+ * See `RuntimeStateDurability`. Enforced by
11431
+ * `scripts/check-runtime-state-durability.ts`.
11432
+ */
11433
+ durability: "session",
11420
11434
  methods: {
11421
11435
  /**
11422
11436
  * Snapshot of the current `discovered` list. Returns the
@@ -13261,7 +13275,23 @@ var NotificationActionSchema = object({
13261
13275
  * else — see `notification-center/action-token.ts` for what that does and
13262
13276
  * does not buy.
13263
13277
  */
13264
- destructive: boolean().optional()
13278
+ destructive: boolean().optional(),
13279
+ /**
13280
+ * How the tap should REACH the url.
13281
+ *
13282
+ * `navigate` (absent, and every button authored before this field) opens it:
13283
+ * the phone leaves the notification and shows whatever the callback returns.
13284
+ * That is right for a button whose answer the operator wants to read.
13285
+ *
13286
+ * `background` fires it as a POST and stays put. It exists for the buttons
13287
+ * whose whole point is not to interrupt — "silence this for 30 minutes" is
13288
+ * an answer to the notification, and being thrown into a browser tab to
13289
+ * confirm it costs more attention than the notification did. A backend that
13290
+ * cannot do a background call renders it as an ordinary link (the adapters
13291
+ * fall back rather than dropping the button), so this is a preference, never
13292
+ * a requirement.
13293
+ */
13294
+ mode: _enum(["navigate", "background"]).optional()
13265
13295
  });
13266
13296
  /**
13267
13297
  * The canonical notification. `body` is the only hard field (Apprise model).
@@ -14113,7 +14143,17 @@ var alarmPanelCapability = {
14113
14143
  * full slice; renders an arm button per `availableModes` entry and
14114
14144
  * a PIN field iff `requiresCode === true`.
14115
14145
  */
14116
- runtimeState: AlarmPanelStatusSchema
14146
+ runtimeState: AlarmPanelStatusSchema,
14147
+ /**
14148
+ * Runtime-state durability: **restored** — armed state is the one thing a panel must not lose across a restart.
14149
+ *
14150
+ * See `RuntimeStateDurability`. Enforced by
14151
+ * `scripts/check-runtime-state-durability.ts`.
14152
+ */
14153
+ durability: "restored",
14154
+ /** Clock fields: written, but excluded from the compare that decides
14155
+ * whether persisting is worth a SQLite commit. */
14156
+ volatileStateFields: ["lastChangedAt"]
14117
14157
  };
14118
14158
  /**
14119
14159
  * Shared geometry vocabulary for on-frame shape caps — privacy-mask,
@@ -14290,6 +14330,9 @@ var NcSystemEventConditionSchema = object({
14290
14330
  nodeIds: array(string().min(1)).min(1).optional(),
14291
14331
  packageNames: array(string().min(1)).min(1).optional()
14292
14332
  });
14333
+ /** Hard ceiling on a window (24h). A snooze that could not expire would be an
14334
+ * outage the operator asked for once and forgot. */
14335
+ var NC_SNOOZE_MAX_MINUTES = 1440;
14293
14336
  /** Weekly schedule — OR of windows; absence on the rule = always active. */
14294
14337
  var NcScheduleSchema = object({
14295
14338
  windows: array(object({
@@ -14666,15 +14709,15 @@ var NcConditionsSchema = object({
14666
14709
  * (an `immediate` rule naming an `audio-*` class, one notification per
14667
14710
  * classified sample) stays exactly as it was for rules that already use it.
14668
14711
  *
14669
- * NOT in {@link NC_CONDITION_CATALOG} yet, and that is the sequencing rule
14670
- * rather than an oversight: the viewer mirrors the descriptor enums BY HAND
14671
- * (`camstack/src/data/notification-center.ts`, guarded by
14672
- * `scripts/check-viewer-condition-mirror.ts`) and its rule editor STRIPS the
14712
+ * In {@link NC_CONDITION_CATALOG} since P2, and the ORDER it got there is the
14713
+ * rule rather than an accident: the viewer mirrors the descriptor enums BY
14714
+ * HAND (`camstack/src/data/notification-center.ts`, guarded by
14715
+ * `scripts/check-viewer-condition-mirror.ts`) and its rule editor strips the
14673
14716
  * condition fields it does not know when a rule is saved from the phone.
14674
14717
  * Publishing an editor for a condition the app cannot round-trip is how an
14675
- * operator loses a rule's conditions by opening it — so the descriptor, the
14676
- * admin widget and the viewer mirror land together (P2 + P3), and only then
14677
- * does an audio rule become authorable.
14718
+ * operator loses a rule's conditions by opening it — so the viewer mirror
14719
+ * (P3, shipped) went FIRST, and the descriptor an editor renders from
14720
+ * follows here.
14678
14721
  */
14679
14722
  audio: NcAudioConditionSchema.optional()
14680
14723
  });
@@ -14910,6 +14953,30 @@ var NcRuleInputSchema = object({
14910
14953
  */
14911
14954
  snoozeAllowGlobal: boolean().optional(),
14912
14955
  /**
14956
+ * The snooze durations THIS rule's notification offers as buttons, in
14957
+ * minutes.
14958
+ *
14959
+ * Three states, and all three are distinct — which is exactly why this is
14960
+ * `.optional()` and never `.default()`. A Zod default does not run on the
14961
+ * addon cap path (three production failures in one day), so a schema default
14962
+ * would collapse the first two:
14963
+ *
14964
+ * | value | meaning |
14965
+ * | --- | --- |
14966
+ * | absent | the operator never said ⇒ {@link NC_DEFAULT_SNOOZE_MINUTES} |
14967
+ * | `[]` | **no snooze buttons on this rule** — the explicit override |
14968
+ * | a list | these choices, de-duplicated and sorted, at most four |
14969
+ *
14970
+ * `.max(4)` because the notifier's own action budget is small (ntfy allows
14971
+ * three buttons in total) and a rule that spent it all on snooze choices
14972
+ * would push its own tap-through actions off the notification.
14973
+ *
14974
+ * An empty list is NOT an alarm exemption: a rule the alarm is about, or
14975
+ * that arms the panel, is exempt automatically and cannot be silenced by a
14976
+ * window from anywhere (D133).
14977
+ */
14978
+ snoozeOptions: array(number().int().min(1).max(NC_SNOOZE_MAX_MINUTES)).max(4).optional(),
14979
+ /**
14913
14980
  * Devices this rule ACTUATES — arm the alarm, open a gate, turn on a light.
14914
14981
  *
14915
14982
  * This is what makes the rule set the alarm's trigger set without the alarm
@@ -15009,6 +15076,7 @@ var NcConditionDescriptorSchema = object({
15009
15076
  "device",
15010
15077
  "package",
15011
15078
  "occupancy",
15079
+ "audio",
15012
15080
  "system"
15013
15081
  ]),
15014
15082
  label: string(),
@@ -15027,6 +15095,7 @@ var NcConditionDescriptorSchema = object({
15027
15095
  "crossingSelect",
15028
15096
  "polygonDraw",
15029
15097
  "occupancy",
15098
+ "audio",
15030
15099
  "deviceState",
15031
15100
  "systemEvent"
15032
15101
  ]),
@@ -15178,7 +15247,20 @@ var NcSnoozeInputSchema = object({
15178
15247
  ruleId: string().optional(),
15179
15248
  /** Required when `scope: 'device'`. */
15180
15249
  deviceId: number().int().optional(),
15181
- durationMinutes: number().int().min(1).max(1440),
15250
+ /**
15251
+ * Narrow the window to these subject classes — "the cat, not the person".
15252
+ *
15253
+ * ORTHOGONAL to `scope`, deliberately, and absent means EVERY class: that is
15254
+ * what every window authored before this field meant, so no persisted row
15255
+ * changes meaning and no client has to learn anything to keep working.
15256
+ *
15257
+ * It is what makes the window's real key `(deviceId, classes[])` and lets it
15258
+ * cross rules (D133): the operator points at a camera and a kind of thing,
15259
+ * not at whichever of their four rules happened to produce the notification
15260
+ * they are dismissing.
15261
+ */
15262
+ classes: array(string().min(1)).min(1).optional(),
15263
+ durationMinutes: number().int().min(1).max(NC_SNOOZE_MAX_MINUTES),
15182
15264
  /**
15183
15265
  * Silence this for EVERY recipient, not just the caller. Permission is
15184
15266
  * checked server-side (the rule's `snoozeAllowGlobal`, or admin for the
@@ -15203,6 +15285,10 @@ var NcSnoozeSchema = object({
15203
15285
  scope: NcSnoozeScopeSchema,
15204
15286
  ruleId: string().optional(),
15205
15287
  deviceId: number().int().optional(),
15288
+ /** Subject classes this window covers. ABSENT = every class — see
15289
+ * {@link NcSnoozeInputSchema.shape.classes}. Lives in the JSON blob and has
15290
+ * no SQLite column: nothing queries a window by class. */
15291
+ classes: array(string().min(1)).min(1).optional(),
15206
15292
  startedAt: number(),
15207
15293
  /** Exclusive: at exactly this instant the snooze is over. Expiry is a
15208
15294
  * COMPARISON, not a job — no sweeper can leave the operator silenced. */
@@ -17303,7 +17389,14 @@ var zonesCapability = {
17303
17389
  * handle. Slice shape is `{ zones: Zone[] }` so future extensions
17304
17390
  * (e.g. zone groupings) can sit alongside the polygon list.
17305
17391
  */
17306
- runtimeState: object({ zones: array(ZoneSchema).readonly() })
17392
+ runtimeState: object({ zones: array(ZoneSchema).readonly() }),
17393
+ /**
17394
+ * 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.
17395
+ *
17396
+ * See `RuntimeStateDurability`. Enforced by
17397
+ * `scripts/check-runtime-state-durability.ts`.
17398
+ */
17399
+ durability: "restored"
17307
17400
  };
17308
17401
  /**
17309
17402
  * A bounding box in NORMALIZED [0,1] frame coordinates for `getNativeCrop`. The
@@ -20240,7 +20333,17 @@ var airQualitySensorCapability = {
20240
20333
  schema: AirQualitySensorStatusSchema,
20241
20334
  kind: "push"
20242
20335
  },
20243
- runtimeState: AirQualitySensorStatusSchema
20336
+ runtimeState: AirQualitySensorStatusSchema,
20337
+ /**
20338
+ * Runtime-state durability: **restored** — as `numeric-sensor`.
20339
+ *
20340
+ * See `RuntimeStateDurability`. Enforced by
20341
+ * `scripts/check-runtime-state-durability.ts`.
20342
+ */
20343
+ durability: "restored",
20344
+ /** Clock fields: written, but excluded from the compare that decides
20345
+ * whether persisting is worth a SQLite commit. */
20346
+ volatileStateFields: ["lastFetchedAt"]
20244
20347
  };
20245
20348
  /**
20246
20349
  * Ambient illuminance reading in lux. Drives Home Assistant `sensor`
@@ -20272,7 +20375,17 @@ var ambientLightSensorCapability = {
20272
20375
  schema: AmbientLightSensorStatusSchema,
20273
20376
  kind: "push"
20274
20377
  },
20275
- runtimeState: AmbientLightSensorStatusSchema
20378
+ runtimeState: AmbientLightSensorStatusSchema,
20379
+ /**
20380
+ * Runtime-state durability: **restored** — as `numeric-sensor`.
20381
+ *
20382
+ * See `RuntimeStateDurability`. Enforced by
20383
+ * `scripts/check-runtime-state-durability.ts`.
20384
+ */
20385
+ durability: "restored",
20386
+ /** Clock fields: written, but excluded from the compare that decides
20387
+ * whether persisting is worth a SQLite commit. */
20388
+ volatileStateFields: ["lastFetchedAt"]
20276
20389
  };
20277
20390
  /**
20278
20391
  * Per-class audio metrics aggregated over a sliding window.
@@ -20390,7 +20503,14 @@ var audioMetricsCapability = {
20390
20503
  }), AudioMetricsHistorySchema)
20391
20504
  },
20392
20505
  /** Reactive runtime-state mirror — live `device.state.audioMetrics.value`. */
20393
- runtimeState: AudioMetricsSnapshotSchema
20506
+ runtimeState: AudioMetricsSnapshotSchema,
20507
+ /**
20508
+ * 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.
20509
+ *
20510
+ * See `RuntimeStateDurability`. Enforced by
20511
+ * `scripts/check-runtime-state-durability.ts`.
20512
+ */
20513
+ durability: "session"
20394
20514
  };
20395
20515
  /**
20396
20516
  * Automation-control cap. Models HA `automation.*` entities on
@@ -20452,7 +20572,14 @@ var automationControlCapability = {
20452
20572
  * reads `enabled` (toggle) + `isRunning` (spinner) + `lastError`
20453
20573
  * (badge) directly.
20454
20574
  */
20455
- runtimeState: AutomationControlStatusSchema
20575
+ runtimeState: AutomationControlStatusSchema,
20576
+ /**
20577
+ * 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.
20578
+ *
20579
+ * See `RuntimeStateDurability`. Enforced by
20580
+ * `scripts/check-runtime-state-durability.ts`.
20581
+ */
20582
+ durability: "session"
20456
20583
  };
20457
20584
  /**
20458
20585
  * Battery status snapshot. Emitted by providers whose device is
@@ -20558,7 +20685,17 @@ onStatusChanged: { data: object({
20558
20685
  * via `device.runtimeState.getCapState('battery')` regardless of
20559
20686
  * the underlying driver.
20560
20687
  */
20561
- runtimeState: BatteryStatusSchema
20688
+ runtimeState: BatteryStatusSchema,
20689
+ /**
20690
+ * 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.
20691
+ *
20692
+ * See `RuntimeStateDurability`. Enforced by
20693
+ * `scripts/check-runtime-state-durability.ts`.
20694
+ */
20695
+ durability: "restored",
20696
+ /** Clock fields: written, but excluded from the compare that decides
20697
+ * whether persisting is worth a SQLite commit. */
20698
+ volatileStateFields: ["lastUpdated"]
20562
20699
  };
20563
20700
  /**
20564
20701
  * Generic boolean sensor — last-resort fallback when no domain-
@@ -20587,7 +20724,17 @@ var binaryCapability = {
20587
20724
  schema: BinaryStatusSchema,
20588
20725
  kind: "push"
20589
20726
  },
20590
- runtimeState: BinaryStatusSchema
20727
+ runtimeState: BinaryStatusSchema,
20728
+ /**
20729
+ * Runtime-state durability: **restored** — transition-driven sensor state; the restored value gives the boot comparison.
20730
+ *
20731
+ * See `RuntimeStateDurability`. Enforced by
20732
+ * `scripts/check-runtime-state-durability.ts`.
20733
+ */
20734
+ durability: "restored",
20735
+ /** Clock fields: written, but excluded from the compare that decides
20736
+ * whether persisting is worth a SQLite commit. */
20737
+ volatileStateFields: ["lastChangedAt"]
20591
20738
  };
20592
20739
  /**
20593
20740
  * Dimmable-light brightness control. Co-exists with `switch` on the
@@ -20640,7 +20787,14 @@ onBrightnessChanged: { data: object({
20640
20787
  * by the kernel. Read via `device.state.brightness.value` so UI
20641
20788
  * sliders surface the current level without polling the provider.
20642
20789
  */
20643
- runtimeState: BrightnessStatusSchema
20790
+ runtimeState: BrightnessStatusSchema,
20791
+ /**
20792
+ * Runtime-state durability: **session** — live lamp state, re-published by the provider on connect.
20793
+ *
20794
+ * See `RuntimeStateDurability`. Enforced by
20795
+ * `scripts/check-runtime-state-durability.ts`.
20796
+ */
20797
+ durability: "session"
20644
20798
  };
20645
20799
  DeviceType.Button, method(object({ deviceId: number().int().nonnegative() }), _void(), {
20646
20800
  kind: "mutation",
@@ -20728,7 +20882,17 @@ var carbonMonoxideCapability = {
20728
20882
  schema: CarbonMonoxideStatusSchema,
20729
20883
  kind: "push"
20730
20884
  },
20731
- runtimeState: CarbonMonoxideStatusSchema
20885
+ runtimeState: CarbonMonoxideStatusSchema,
20886
+ /**
20887
+ * Runtime-state durability: **restored** — as `smoke`.
20888
+ *
20889
+ * See `RuntimeStateDurability`. Enforced by
20890
+ * `scripts/check-runtime-state-durability.ts`.
20891
+ */
20892
+ durability: "restored",
20893
+ /** Clock fields: written, but excluded from the compare that decides
20894
+ * whether persisting is worth a SQLite commit. */
20895
+ volatileStateFields: ["lastChangedAt"]
20732
20896
  };
20733
20897
  /**
20734
20898
  * HVAC / climate control cap. Models the full surface of a HA
@@ -20888,7 +21052,14 @@ var climateControlCapability = {
20888
21052
  * the full slice via `device.state.climate-control.value` and refresh
20889
21053
  * on every push without re-querying the provider.
20890
21054
  */
20891
- runtimeState: ClimateControlStatusSchema
21055
+ runtimeState: ClimateControlStatusSchema,
21056
+ /**
21057
+ * Runtime-state durability: **session** — as `brightness`; `currentTemp` moves continuously and is re-published on connect.
21058
+ *
21059
+ * See `RuntimeStateDurability`. Enforced by
21060
+ * `scripts/check-runtime-state-durability.ts`.
21061
+ */
21062
+ durability: "session"
20892
21063
  };
20893
21064
  /**
20894
21065
  * Color-light cap. Coexists with `switch` (on/off) and `brightness`
@@ -20998,7 +21169,14 @@ onColorChanged: { data: object({
20998
21169
  * kernel. Read via `device.state.color.value` so UI pickers surface
20999
21170
  * the current chromaticity without polling the provider.
21000
21171
  */
21001
- runtimeState: ColorStatusSchema
21172
+ runtimeState: ColorStatusSchema,
21173
+ /**
21174
+ * Runtime-state durability: **session** — as `brightness`.
21175
+ *
21176
+ * See `RuntimeStateDurability`. Enforced by
21177
+ * `scripts/check-runtime-state-durability.ts`.
21178
+ */
21179
+ durability: "session"
21002
21180
  };
21003
21181
  var ConnectionTestOutcomeSchema = discriminatedUnion("outcome", [
21004
21182
  object({
@@ -21056,7 +21234,17 @@ var connectivityCapability = {
21056
21234
  schema: ConnectivityStatusSchema,
21057
21235
  kind: "push"
21058
21236
  },
21059
- runtimeState: ConnectivityStatusSchema
21237
+ runtimeState: ConnectivityStatusSchema,
21238
+ /**
21239
+ * Runtime-state durability: **restored** — same shape and same argument as `device-status`, for links rather than devices.
21240
+ *
21241
+ * See `RuntimeStateDurability`. Enforced by
21242
+ * `scripts/check-runtime-state-durability.ts`.
21243
+ */
21244
+ durability: "restored",
21245
+ /** Clock fields: written, but excluded from the compare that decides
21246
+ * whether persisting is worth a SQLite commit. */
21247
+ volatileStateFields: ["lastChangedAt"]
21060
21248
  };
21061
21249
  /**
21062
21250
  * Generic device-consumables capability — surfaces a device's
@@ -21138,7 +21326,14 @@ reset: method(object({
21138
21326
  }
21139
21327
  }
21140
21328
  },
21141
- runtimeState: ConsumablesStatusSchema.extend({ lastFetchedAt: number() })
21329
+ runtimeState: ConsumablesStatusSchema.extend({ lastFetchedAt: number() }),
21330
+ /**
21331
+ * Runtime-state durability: **session** — the authority is the appliance; the provider re-reads the whole item array on connect.
21332
+ *
21333
+ * See `RuntimeStateDurability`. Enforced by
21334
+ * `scripts/check-runtime-state-durability.ts`.
21335
+ */
21336
+ durability: "session"
21142
21337
  };
21143
21338
  /**
21144
21339
  * Door / window / opening / garage / valve contact sensor. Boolean
@@ -21169,7 +21364,17 @@ var contactCapability = {
21169
21364
  schema: ContactStatusSchema,
21170
21365
  kind: "push"
21171
21366
  },
21172
- runtimeState: ContactStatusSchema
21367
+ runtimeState: ContactStatusSchema,
21368
+ /**
21369
+ * Runtime-state durability: **restored** — a door left open across a restart must still read open.
21370
+ *
21371
+ * See `RuntimeStateDurability`. Enforced by
21372
+ * `scripts/check-runtime-state-durability.ts`.
21373
+ */
21374
+ durability: "restored",
21375
+ /** Clock fields: written, but excluded from the compare that decides
21376
+ * whether persisting is worth a SQLite commit. */
21377
+ volatileStateFields: ["lastChangedAt"]
21173
21378
  };
21174
21379
  /**
21175
21380
  * Status slice — flat object (the framework's `runtimeState` contract
@@ -21275,7 +21480,14 @@ var controlCapability = {
21275
21480
  * dropdown / text field / date picker) read the slice's discriminant
21276
21481
  * and value directly without polling the provider.
21277
21482
  */
21278
- runtimeState: ControlStatusSchema
21483
+ runtimeState: ControlStatusSchema,
21484
+ /**
21485
+ * Runtime-state durability: **session** — a generic control mirrors an external entity that re-publishes on connect; the options array is re-derived with it.
21486
+ *
21487
+ * See `RuntimeStateDurability`. Enforced by
21488
+ * `scripts/check-runtime-state-durability.ts`.
21489
+ */
21490
+ durability: "session"
21279
21491
  };
21280
21492
  var CoverStatusSchema = object({
21281
21493
  /** Lifecycle state of the cover. */
@@ -21336,7 +21548,17 @@ var coverCapability = {
21336
21548
  * Runtime-state slice — mirrored by the kernel. UI controls watch
21337
21549
  * the slice for live position changes during a move.
21338
21550
  */
21339
- runtimeState: CoverStatusSchema
21551
+ runtimeState: CoverStatusSchema,
21552
+ /**
21553
+ * Runtime-state durability: **restored** — position survives a restart on the device; the mirror should agree at boot rather than read blank.
21554
+ *
21555
+ * See `RuntimeStateDurability`. Enforced by
21556
+ * `scripts/check-runtime-state-durability.ts`.
21557
+ */
21558
+ durability: "restored",
21559
+ /** Clock fields: written, but excluded from the compare that decides
21560
+ * whether persisting is worth a SQLite commit. */
21561
+ volatileStateFields: ["lastChangedAt"]
21340
21562
  };
21341
21563
  /**
21342
21564
  * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
@@ -21430,7 +21652,17 @@ var dayNightCapability = {
21430
21652
  schema: DayNightStatusSchema,
21431
21653
  kind: "poll"
21432
21654
  },
21433
- runtimeState: DayNightStatusSchema
21655
+ runtimeState: DayNightStatusSchema,
21656
+ /**
21657
+ * Runtime-state durability: **restored** — operator-set IR-cut behaviour; mutation-driven.
21658
+ *
21659
+ * See `RuntimeStateDurability`. Enforced by
21660
+ * `scripts/check-runtime-state-durability.ts`.
21661
+ */
21662
+ durability: "restored",
21663
+ /** Clock fields: written, but excluded from the compare that decides
21664
+ * whether persisting is worth a SQLite commit. */
21665
+ volatileStateFields: ["lastFetchedAt"]
21434
21666
  };
21435
21667
  /**
21436
21668
  * Generic device-level status snapshot. Auto-registered by `BaseDevice`
@@ -21477,7 +21709,17 @@ onStatusChanged: { data: object({
21477
21709
  schema: DeviceStatusSchema,
21478
21710
  kind: "push"
21479
21711
  },
21480
- runtimeState: DeviceStatusSchema
21712
+ runtimeState: DeviceStatusSchema,
21713
+ /**
21714
+ * 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.
21715
+ *
21716
+ * See `RuntimeStateDurability`. Enforced by
21717
+ * `scripts/check-runtime-state-durability.ts`.
21718
+ */
21719
+ durability: "restored",
21720
+ /** Clock fields: written, but excluded from the compare that decides
21721
+ * whether persisting is worth a SQLite commit. */
21722
+ volatileStateFields: ["lastChangedAt"]
21481
21723
  };
21482
21724
  /**
21483
21725
  * Doorbell button cap. Two kinds of providers coexist behind this cap
@@ -21539,7 +21781,14 @@ onPressed: { data: DoorbellPressEventSchema } },
21539
21781
  * `device.state.doorbell.value`. UIs can show "last ring 5m ago"
21540
21782
  * without subscribing.
21541
21783
  */
21542
- runtimeState: DoorbellStatusSchema
21784
+ runtimeState: DoorbellStatusSchema,
21785
+ /**
21786
+ * 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.
21787
+ *
21788
+ * See `RuntimeStateDurability`. Enforced by
21789
+ * `scripts/check-runtime-state-durability.ts`.
21790
+ */
21791
+ durability: "restored"
21543
21792
  };
21544
21793
  /**
21545
21794
  * Enum-state sensor — a string value picked from a finite option set.
@@ -21579,7 +21828,17 @@ var enumSensorCapability = {
21579
21828
  schema: EnumSensorStatusSchema,
21580
21829
  kind: "push"
21581
21830
  },
21582
- runtimeState: EnumSensorStatusSchema
21831
+ runtimeState: EnumSensorStatusSchema,
21832
+ /**
21833
+ * Runtime-state durability: **restored** — as `numeric-sensor`; 80 devices.
21834
+ *
21835
+ * See `RuntimeStateDurability`. Enforced by
21836
+ * `scripts/check-runtime-state-durability.ts`.
21837
+ */
21838
+ durability: "restored",
21839
+ /** Clock fields: written, but excluded from the compare that decides
21840
+ * whether persisting is worth a SQLite commit. */
21841
+ volatileStateFields: ["lastFetchedAt"]
21583
21842
  };
21584
21843
  /**
21585
21844
  * Generic stateless event emitter. Installed on a `DeviceType.EventEmitter`
@@ -21615,7 +21874,14 @@ var eventEmitterCapability = {
21615
21874
  schema: EventEmitterStatusSchema,
21616
21875
  kind: "push"
21617
21876
  },
21618
- runtimeState: EventEmitterStatusSchema
21877
+ runtimeState: EventEmitterStatusSchema,
21878
+ /**
21879
+ * Runtime-state durability: **session** — `eventCountSinceStart` names its own scope.
21880
+ *
21881
+ * See `RuntimeStateDurability`. Enforced by
21882
+ * `scripts/check-runtime-state-durability.ts`.
21883
+ */
21884
+ durability: "session"
21619
21885
  };
21620
21886
  var EventItemSchema = object({
21621
21887
  id: string(),
@@ -21896,7 +22162,14 @@ var fanControlCapability = {
21896
22162
  * Runtime-state slice — mirrored by the kernel. UI fan speed
21897
22163
  * sliders read `percentage` for live updates.
21898
22164
  */
21899
- runtimeState: FanControlStatusSchema
22165
+ runtimeState: FanControlStatusSchema,
22166
+ /**
22167
+ * Runtime-state durability: **session** — as `brightness`.
22168
+ *
22169
+ * See `RuntimeStateDurability`. Enforced by
22170
+ * `scripts/check-runtime-state-durability.ts`.
22171
+ */
22172
+ durability: "session"
21900
22173
  };
21901
22174
  /**
21902
22175
  * Per-device feature/identity probe slice. Holds the runtime-resolved
@@ -21972,7 +22245,14 @@ onProbeChanged: { data: object({
21972
22245
  schema: FeatureProbeStatusSchema,
21973
22246
  kind: "push"
21974
22247
  },
21975
- runtimeState: FeatureProbeStatusSchema
22248
+ runtimeState: FeatureProbeStatusSchema,
22249
+ /**
22250
+ * 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.
22251
+ *
22252
+ * See `RuntimeStateDurability`. Enforced by
22253
+ * `scripts/check-runtime-state-durability.ts`.
22254
+ */
22255
+ durability: "session"
21976
22256
  };
21977
22257
  /**
21978
22258
  * Water leak / moisture sensor. Boolean "is liquid currently
@@ -21999,7 +22279,17 @@ var floodCapability = {
21999
22279
  schema: FloodStatusSchema,
22000
22280
  kind: "push"
22001
22281
  },
22002
- runtimeState: FloodStatusSchema
22282
+ runtimeState: FloodStatusSchema,
22283
+ /**
22284
+ * Runtime-state durability: **restored** — as `smoke`.
22285
+ *
22286
+ * See `RuntimeStateDurability`. Enforced by
22287
+ * `scripts/check-runtime-state-durability.ts`.
22288
+ */
22289
+ durability: "restored",
22290
+ /** Clock fields: written, but excluded from the compare that decides
22291
+ * whether persisting is worth a SQLite commit. */
22292
+ volatileStateFields: ["lastChangedAt"]
22003
22293
  };
22004
22294
  /**
22005
22295
  * Combustible-gas (LPG / methane / hydrogen) alarm sensor. Drives
@@ -22022,7 +22312,17 @@ var gasCapability = {
22022
22312
  schema: GasStatusSchema,
22023
22313
  kind: "push"
22024
22314
  },
22025
- runtimeState: GasStatusSchema
22315
+ runtimeState: GasStatusSchema,
22316
+ /**
22317
+ * Runtime-state durability: **restored** — as `smoke`.
22318
+ *
22319
+ * See `RuntimeStateDurability`. Enforced by
22320
+ * `scripts/check-runtime-state-durability.ts`.
22321
+ */
22322
+ durability: "restored",
22323
+ /** Clock fields: written, but excluded from the compare that decides
22324
+ * whether persisting is worth a SQLite commit. */
22325
+ volatileStateFields: ["lastChangedAt"]
22026
22326
  };
22027
22327
  /**
22028
22328
  * Humidifier / dehumidifier cap. Models HA `humidifier.*` entities —
@@ -22098,7 +22398,14 @@ var humidifierCapability = {
22098
22398
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
22099
22399
  * slice for live humidity / mode changes.
22100
22400
  */
22101
- runtimeState: HumidifierStatusSchema
22401
+ runtimeState: HumidifierStatusSchema,
22402
+ /**
22403
+ * Runtime-state durability: **session** — as `climate-control`.
22404
+ *
22405
+ * See `RuntimeStateDurability`. Enforced by
22406
+ * `scripts/check-runtime-state-durability.ts`.
22407
+ */
22408
+ durability: "session"
22102
22409
  };
22103
22410
  /**
22104
22411
  * Single-metric humidity reading. Drives Home Assistant `sensor`
@@ -22134,7 +22441,17 @@ var humiditySensorCapability = {
22134
22441
  schema: HumiditySensorStatusSchema,
22135
22442
  kind: "push"
22136
22443
  },
22137
- runtimeState: HumiditySensorStatusSchema
22444
+ runtimeState: HumiditySensorStatusSchema,
22445
+ /**
22446
+ * Runtime-state durability: **restored** — as `numeric-sensor` (67 of 75 writes were the clock alone).
22447
+ *
22448
+ * See `RuntimeStateDurability`. Enforced by
22449
+ * `scripts/check-runtime-state-durability.ts`.
22450
+ */
22451
+ durability: "restored",
22452
+ /** Clock fields: written, but excluded from the compare that decides
22453
+ * whether persisting is worth a SQLite commit. */
22454
+ volatileStateFields: ["lastFetchedAt"]
22138
22455
  };
22139
22456
  /**
22140
22457
  * Image display cap. Models a single still image exposed by an integration —
@@ -22172,7 +22489,14 @@ var imageCapability = {
22172
22489
  * Runtime-state slice — mirrored by the kernel. The UI reads `url`
22173
22490
  * directly and renders the still image.
22174
22491
  */
22175
- runtimeState: ImageStatusSchema
22492
+ runtimeState: ImageStatusSchema,
22493
+ /**
22494
+ * Runtime-state durability: **session** — a snapshot URL is a session-scoped handle; a restored one points at nothing.
22495
+ *
22496
+ * See `RuntimeStateDurability`. Enforced by
22497
+ * `scripts/check-runtime-state-durability.ts`.
22498
+ */
22499
+ durability: "session"
22176
22500
  };
22177
22501
  /**
22178
22502
  * Vendor-neutral image / picture-adjustment cap — the per-camera config
@@ -22321,7 +22645,17 @@ var imageSettingsCapability = {
22321
22645
  schema: ImageSettingsStatusSchema,
22322
22646
  kind: "poll"
22323
22647
  },
22324
- runtimeState: ImageSettingsStatusSchema
22648
+ runtimeState: ImageSettingsStatusSchema,
22649
+ /**
22650
+ * Runtime-state durability: **restored** — operator-set camera imaging; mutation-driven.
22651
+ *
22652
+ * See `RuntimeStateDurability`. Enforced by
22653
+ * `scripts/check-runtime-state-durability.ts`.
22654
+ */
22655
+ durability: "restored",
22656
+ /** Clock fields: written, but excluded from the compare that decides
22657
+ * whether persisting is worth a SQLite commit. */
22658
+ volatileStateFields: ["lastFetchedAt"]
22325
22659
  };
22326
22660
  /**
22327
22661
  * integrations — system-scoped singleton capability for integration
@@ -22661,7 +22995,14 @@ var lawnMowerControlCapability = {
22661
22995
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
22662
22996
  * slice for live activity + battery changes.
22663
22997
  */
22664
- runtimeState: LawnMowerControlStatusSchema
22998
+ runtimeState: LawnMowerControlStatusSchema,
22999
+ /**
23000
+ * Runtime-state durability: **session** — as `vacuum-control`.
23001
+ *
23002
+ * See `RuntimeStateDurability`. Enforced by
23003
+ * `scripts/check-runtime-state-durability.ts`.
23004
+ */
23005
+ durability: "session"
22665
23006
  };
22666
23007
  /**
22667
23008
  * local-network — hub-only singleton.
@@ -22867,7 +23208,17 @@ var lockControlCapability = {
22867
23208
  * read `state` and disable themselves during `locking`/`unlocking`
22868
23209
  * transitions.
22869
23210
  */
22870
- runtimeState: LockControlStatusSchema
23211
+ runtimeState: LockControlStatusSchema,
23212
+ /**
23213
+ * Runtime-state durability: **restored** — a lock left locked must still read locked.
23214
+ *
23215
+ * See `RuntimeStateDurability`. Enforced by
23216
+ * `scripts/check-runtime-state-durability.ts`.
23217
+ */
23218
+ durability: "restored",
23219
+ /** Clock fields: written, but excluded from the compare that decides
23220
+ * whether persisting is worth a SQLite commit. */
23221
+ volatileStateFields: ["lastChangedAt"]
22871
23222
  };
22872
23223
  /**
22873
23224
  * Media-player cap. Models HA `media_player.*` (Sonos, Chromecast,
@@ -23029,7 +23380,14 @@ var mediaPlayerCapability = {
23029
23380
  * full slice for live now-playing, volume, and progress updates
23030
23381
  * without polling.
23031
23382
  */
23032
- runtimeState: MediaPlayerStatusSchema
23383
+ runtimeState: MediaPlayerStatusSchema,
23384
+ /**
23385
+ * Runtime-state durability: **session** — a restored transport position describes a playback that stopped when the hub did.
23386
+ *
23387
+ * See `RuntimeStateDurability`. Enforced by
23388
+ * `scripts/check-runtime-state-durability.ts`.
23389
+ */
23390
+ durability: "session"
23033
23391
  };
23034
23392
  /**
23035
23393
  * mesh-network — collection cap for mesh-VPN providers.
@@ -23293,7 +23651,14 @@ onMotionChanged: { data: MotionOnMotionChangedDataSchema } },
23293
23651
  * `device.state.motion.value`. Reads never invoke the provider, so
23294
23652
  * UIs and other addons can poll the cached state safely.
23295
23653
  */
23296
- runtimeState: MotionStatusSchema
23654
+ runtimeState: MotionStatusSchema,
23655
+ /**
23656
+ * 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.
23657
+ *
23658
+ * See `RuntimeStateDurability`. Enforced by
23659
+ * `scripts/check-runtime-state-durability.ts`.
23660
+ */
23661
+ durability: "session"
23297
23662
  };
23298
23663
  /**
23299
23664
  * Motion-trigger toggle for accessory devices.
@@ -23358,7 +23723,14 @@ var motionTriggerCapability = {
23358
23723
  schema: MotionTriggerStatusSchema,
23359
23724
  kind: "command-driven"
23360
23725
  },
23361
- runtimeState: MotionTriggerRuntimeStateSchema
23726
+ runtimeState: MotionTriggerRuntimeStateSchema,
23727
+ /**
23728
+ * 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.
23729
+ *
23730
+ * See `RuntimeStateDurability`. Enforced by
23731
+ * `scripts/check-runtime-state-durability.ts`.
23732
+ */
23733
+ durability: "session"
23362
23734
  };
23363
23735
  /**
23364
23736
  * Motion-zones share the same MaskShape vocabulary as privacy-mask — the
@@ -23425,7 +23797,17 @@ var motionZonesCapability = {
23425
23797
  schema: MotionZoneStatusSchema,
23426
23798
  kind: "poll"
23427
23799
  },
23428
- runtimeState: MotionZoneStatusSchema
23800
+ runtimeState: MotionZoneStatusSchema,
23801
+ /**
23802
+ * 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.
23803
+ *
23804
+ * See `RuntimeStateDurability`. Enforced by
23805
+ * `scripts/check-runtime-state-durability.ts`.
23806
+ */
23807
+ durability: "restored",
23808
+ /** Clock fields: written, but excluded from the compare that decides
23809
+ * whether persisting is worth a SQLite commit. */
23810
+ volatileStateFields: ["lastFetchedAt"]
23429
23811
  };
23430
23812
  /**
23431
23813
  * On-camera AI object detection cap. Surfaces per-device the classes
@@ -23499,7 +23881,17 @@ var nativeObjectDetectionCapability = {
23499
23881
  schema: NativeObjectDetectionStatusSchema,
23500
23882
  kind: "push"
23501
23883
  },
23502
- runtimeState: NativeObjectDetectionRuntimeStateSchema
23884
+ runtimeState: NativeObjectDetectionRuntimeStateSchema,
23885
+ /**
23886
+ * 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.
23887
+ *
23888
+ * See `RuntimeStateDurability`. Enforced by
23889
+ * `scripts/check-runtime-state-durability.ts`.
23890
+ */
23891
+ durability: "restored",
23892
+ /** Clock fields: written, but excluded from the compare that decides
23893
+ * whether persisting is worth a SQLite commit. */
23894
+ volatileStateFields: ["lastFetchedAt"]
23503
23895
  };
23504
23896
  /**
23505
23897
  * network-quality — system-scoped singleton capability tracking RTT,
@@ -23833,7 +24225,14 @@ onSent: { data: object({
23833
24225
  * form reads `supports` to gate optional fields; history pane reads
23834
24226
  * `lastSentAt` / `lastError` / `queueDepth`.
23835
24227
  */
23836
- runtimeState: NotifierStatusSchema
24228
+ runtimeState: NotifierStatusSchema,
24229
+ /**
24230
+ * Runtime-state durability: **session** — live queue depth and last-send state; a restored queue depth describes a queue that no longer exists.
24231
+ *
24232
+ * See `RuntimeStateDurability`. Enforced by
24233
+ * `scripts/check-runtime-state-durability.ts`.
24234
+ */
24235
+ durability: "session"
23837
24236
  };
23838
24237
  /**
23839
24238
  * Generic numeric sensor — last-resort fallback when no typed numeric
@@ -23876,7 +24275,17 @@ var numericSensorCapability = {
23876
24275
  schema: NumericSensorStatusSchema,
23877
24276
  kind: "push"
23878
24277
  },
23879
- runtimeState: NumericSensorStatusSchema
24278
+ runtimeState: NumericSensorStatusSchema,
24279
+ /**
24280
+ * 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.
24281
+ *
24282
+ * See `RuntimeStateDurability`. Enforced by
24283
+ * `scripts/check-runtime-state-durability.ts`.
24284
+ */
24285
+ durability: "restored",
24286
+ /** Clock fields: written, but excluded from the compare that decides
24287
+ * whether persisting is worth a SQLite commit. */
24288
+ volatileStateFields: ["lastFetchedAt"]
23880
24289
  };
23881
24290
  /**
23882
24291
  * Generic on-screen-display (video overlay) cap. Each camera exposes
@@ -24261,7 +24670,14 @@ var petFeederCapability = {
24261
24670
  * the full slice via `device.state.petFeeder.value` and refresh on
24262
24671
  * every poll without re-querying the provider.
24263
24672
  */
24264
- runtimeState: PetFeederStatusSchema
24673
+ runtimeState: PetFeederStatusSchema,
24674
+ /**
24675
+ * Runtime-state durability: **session** — live appliance state re-published on connect.
24676
+ *
24677
+ * See `RuntimeStateDurability`. Enforced by
24678
+ * `scripts/check-runtime-state-durability.ts`.
24679
+ */
24680
+ durability: "session"
24265
24681
  };
24266
24682
  var VehicleSchema = object({
24267
24683
  id: string(),
@@ -24573,7 +24989,17 @@ var powerMeterCapability = {
24573
24989
  schema: PowerMeterStatusSchema,
24574
24990
  kind: "push"
24575
24991
  },
24576
- runtimeState: PowerMeterStatusSchema
24992
+ runtimeState: PowerMeterStatusSchema,
24993
+ /**
24994
+ * Runtime-state durability: **restored** — as `numeric-sensor`; `kwhTotal` is an accumulator whose restored value is the baseline.
24995
+ *
24996
+ * See `RuntimeStateDurability`. Enforced by
24997
+ * `scripts/check-runtime-state-durability.ts`.
24998
+ */
24999
+ durability: "restored",
25000
+ /** Clock fields: written, but excluded from the compare that decides
25001
+ * whether persisting is worth a SQLite commit. */
25002
+ volatileStateFields: ["lastFetchedAt"]
24577
25003
  };
24578
25004
  /**
24579
25005
  * Presence cap. Models HA `person.*` and `device_tracker.*` entities
@@ -24630,7 +25056,17 @@ var presenceCapability = {
24630
25056
  * the map pin is rendered (use `DeviceFeature.PresenceGps` for the
24631
25057
  * pre-fetch fast-path check).
24632
25058
  */
24633
- runtimeState: PresenceStatusSchema
25059
+ runtimeState: PresenceStatusSchema,
25060
+ /**
25061
+ * Runtime-state durability: **restored** — occupancy-relevant: the restored state is what an occupancy rule compares the first post-restart observation against.
25062
+ *
25063
+ * See `RuntimeStateDurability`. Enforced by
25064
+ * `scripts/check-runtime-state-durability.ts`.
25065
+ */
25066
+ durability: "restored",
25067
+ /** Clock fields: written, but excluded from the compare that decides
25068
+ * whether persisting is worth a SQLite commit. */
25069
+ volatileStateFields: ["lastChangedAt"]
24634
25070
  };
24635
25071
  /**
24636
25072
  * Atmospheric pressure reading in hectopascals. Drives Home Assistant
@@ -24666,7 +25102,17 @@ var pressureSensorCapability = {
24666
25102
  schema: PressureSensorStatusSchema,
24667
25103
  kind: "push"
24668
25104
  },
24669
- runtimeState: PressureSensorStatusSchema
25105
+ runtimeState: PressureSensorStatusSchema,
25106
+ /**
25107
+ * Runtime-state durability: **restored** — as `numeric-sensor`.
25108
+ *
25109
+ * See `RuntimeStateDurability`. Enforced by
25110
+ * `scripts/check-runtime-state-durability.ts`.
25111
+ */
25112
+ durability: "restored",
25113
+ /** Clock fields: written, but excluded from the compare that decides
25114
+ * whether persisting is worth a SQLite commit. */
25115
+ volatileStateFields: ["lastFetchedAt"]
24670
25116
  };
24671
25117
  /**
24672
25118
  * PRIVACY — what the camera deliberately does not capture. Two planes:
@@ -24796,7 +25242,17 @@ var privacyMaskCapability = {
24796
25242
  schema: PrivacyMaskStatusSchema,
24797
25243
  kind: "poll"
24798
25244
  },
24799
- runtimeState: PrivacyMaskStatusSchema
25245
+ runtimeState: PrivacyMaskStatusSchema,
25246
+ /**
25247
+ * Runtime-state durability: **restored** — operator-drawn regions, zero real churn — 22 writes in 25 minutes, every one of them the clock.
25248
+ *
25249
+ * See `RuntimeStateDurability`. Enforced by
25250
+ * `scripts/check-runtime-state-durability.ts`.
25251
+ */
25252
+ durability: "restored",
25253
+ /** Clock fields: written, but excluded from the compare that decides
25254
+ * whether persisting is worth a SQLite commit. */
25255
+ volatileStateFields: ["lastFetchedAt"]
24800
25256
  };
24801
25257
  var PtzPresetSchema = object({
24802
25258
  id: string(),
@@ -24962,7 +25418,14 @@ var ptzAutotrackCapability = {
24962
25418
  * fetch / cache / fallback logic out of the four cap methods —
24963
25419
  * they become trampolines over `runtimeState`.
24964
25420
  */
24965
- runtimeState: PtzAutotrackRuntimeStateSchema
25421
+ runtimeState: PtzAutotrackRuntimeStateSchema,
25422
+ /**
25423
+ * Runtime-state durability: **session** — mirrors the camera's own autotrack config, re-read on connect.
25424
+ *
25425
+ * See `RuntimeStateDurability`. Enforced by
25426
+ * `scripts/check-runtime-state-durability.ts`.
25427
+ */
25428
+ durability: "session"
24966
25429
  };
24967
25430
  DeviceType.Camera, DeviceType.Sensor, DeviceType.Switch, method(object({ deviceId: number().int().nonnegative() }), object({ success: literal(true) }), {
24968
25431
  kind: "mutation",
@@ -25612,7 +26075,14 @@ var sceneMonitorCapability = {
25612
26075
  schema: SceneMonitorStatusSchema,
25613
26076
  kind: "push"
25614
26077
  },
25615
- runtimeState: SceneMonitorStatusSchema
26078
+ runtimeState: SceneMonitorStatusSchema,
26079
+ /**
26080
+ * Runtime-state durability: **session** — re-derived from the current scene on the next evaluation.
26081
+ *
26082
+ * See `RuntimeStateDurability`. Enforced by
26083
+ * `scripts/check-runtime-state-durability.ts`.
26084
+ */
26085
+ durability: "session"
25616
26086
  };
25617
26087
  /**
25618
26088
  * Per-stage gating mode applied to the zones a rule references.
@@ -25756,7 +26226,14 @@ var scriptRunnerCapability = {
25756
26226
  * `isRunning` to render a spinner during execution and surfaces
25757
26227
  * `lastError` / `lastRunSuccess` in the recent-runs panel.
25758
26228
  */
25759
- runtimeState: ScriptRunnerStatusSchema
26229
+ runtimeState: ScriptRunnerStatusSchema,
26230
+ /**
26231
+ * Runtime-state durability: **session** — a restored `isRunning: true` describes a process that died with the previous hub.
26232
+ *
26233
+ * See `RuntimeStateDurability`. Enforced by
26234
+ * `scripts/check-runtime-state-durability.ts`.
26235
+ */
26236
+ durability: "session"
25760
26237
  };
25761
26238
  /**
25762
26239
  * Smoke alarm sensor — boolean "is smoke currently detected" with
@@ -25783,7 +26260,17 @@ var smokeCapability = {
25783
26260
  schema: SmokeStatusSchema,
25784
26261
  kind: "push"
25785
26262
  },
25786
- runtimeState: SmokeStatusSchema
26263
+ runtimeState: SmokeStatusSchema,
26264
+ /**
26265
+ * Runtime-state durability: **restored** — a safety sensor must not read "clear" merely because the hub restarted.
26266
+ *
26267
+ * See `RuntimeStateDurability`. Enforced by
26268
+ * `scripts/check-runtime-state-durability.ts`.
26269
+ */
26270
+ durability: "restored",
26271
+ /** Clock fields: written, but excluded from the compare that decides
26272
+ * whether persisting is worth a SQLite commit. */
26273
+ volatileStateFields: ["lastChangedAt"]
25787
26274
  };
25788
26275
  /**
25789
26276
  * One publishable camera stream as its OWNING PROVIDER describes it — the same
@@ -25969,7 +26456,17 @@ var streamParamsCapability = {
25969
26456
  schema: StreamParamsStatusSchema,
25970
26457
  kind: "poll"
25971
26458
  },
25972
- runtimeState: StreamParamsStatusSchema
26459
+ runtimeState: StreamParamsStatusSchema,
26460
+ /**
26461
+ * Runtime-state durability: **restored** — operator-set encoder profile; mutation-driven.
26462
+ *
26463
+ * See `RuntimeStateDurability`. Enforced by
26464
+ * `scripts/check-runtime-state-durability.ts`.
26465
+ */
26466
+ durability: "restored",
26467
+ /** Clock fields: written, but excluded from the compare that decides
26468
+ * whether persisting is worth a SQLite commit. */
26469
+ volatileStateFields: ["lastFetchedAt"]
25973
26470
  };
25974
26471
  /**
25975
26472
  * Generic on/off switch cap for accessory children (siren, floodlight,
@@ -26015,6 +26512,16 @@ var switchCapability = {
26015
26512
  * not need to re-query the provider after a setState mutation.
26016
26513
  */
26017
26514
  runtimeState: SwitchStatusSchema,
26515
+ /**
26516
+ * Runtime-state durability: **restored** — device state an operator reads as authoritative; 55 devices, transition-driven.
26517
+ *
26518
+ * See `RuntimeStateDurability`. Enforced by
26519
+ * `scripts/check-runtime-state-durability.ts`.
26520
+ */
26521
+ durability: "restored",
26522
+ /** Clock fields: written, but excluded from the compare that decides
26523
+ * whether persisting is worth a SQLite commit. */
26524
+ volatileStateFields: ["lastChangedAt"],
26018
26525
  settings: { bindings: [{
26019
26526
  kind: "scalar",
26020
26527
  statusPath: "on",
@@ -26094,7 +26601,17 @@ var tamperCapability = {
26094
26601
  schema: TamperStatusSchema,
26095
26602
  kind: "push"
26096
26603
  },
26097
- runtimeState: TamperStatusSchema
26604
+ runtimeState: TamperStatusSchema,
26605
+ /**
26606
+ * Runtime-state durability: **restored** — as `smoke`.
26607
+ *
26608
+ * See `RuntimeStateDurability`. Enforced by
26609
+ * `scripts/check-runtime-state-durability.ts`.
26610
+ */
26611
+ durability: "restored",
26612
+ /** Clock fields: written, but excluded from the compare that decides
26613
+ * whether persisting is worth a SQLite commit. */
26614
+ volatileStateFields: ["lastChangedAt"]
26098
26615
  };
26099
26616
  /**
26100
26617
  * Single-metric temperature reading. Drives Home Assistant `sensor`
@@ -26139,7 +26656,17 @@ var temperatureSensorCapability = {
26139
26656
  schema: TemperatureSensorStatusSchema,
26140
26657
  kind: "push"
26141
26658
  },
26142
- runtimeState: TemperatureSensorStatusSchema
26659
+ runtimeState: TemperatureSensorStatusSchema,
26660
+ /**
26661
+ * Runtime-state durability: **restored** — as `numeric-sensor` (69 of 125 writes were the clock alone).
26662
+ *
26663
+ * See `RuntimeStateDurability`. Enforced by
26664
+ * `scripts/check-runtime-state-durability.ts`.
26665
+ */
26666
+ durability: "restored",
26667
+ /** Clock fields: written, but excluded from the compare that decides
26668
+ * whether persisting is worth a SQLite commit. */
26669
+ volatileStateFields: ["lastFetchedAt"]
26143
26670
  };
26144
26671
  /**
26145
26672
  * toast — system-scoped singleton capability that streams toast
@@ -26208,7 +26735,14 @@ var updateCapability = {
26208
26735
  schema: UpdateStatusSchema,
26209
26736
  kind: "poll"
26210
26737
  },
26211
- runtimeState: UpdateStatusSchema
26738
+ runtimeState: UpdateStatusSchema,
26739
+ /**
26740
+ * Runtime-state durability: **session** — a restored `inProgress: true` describes an update that is no longer running; versions are re-probed at boot.
26741
+ *
26742
+ * See `RuntimeStateDurability`. Enforced by
26743
+ * `scripts/check-runtime-state-durability.ts`.
26744
+ */
26745
+ durability: "session"
26212
26746
  };
26213
26747
  var UserSummarySchema = object({
26214
26748
  id: string(),
@@ -26542,7 +27076,14 @@ var vacuumControlCapability = {
26542
27076
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
26543
27077
  * slice for live state + battery + fan-speed changes.
26544
27078
  */
26545
- runtimeState: VacuumControlStatusSchema
27079
+ runtimeState: VacuumControlStatusSchema,
27080
+ /**
27081
+ * Runtime-state durability: **session** — as `media-player` — a restored `state: cleaning` is a robot that is not cleaning.
27082
+ *
27083
+ * See `RuntimeStateDurability`. Enforced by
27084
+ * `scripts/check-runtime-state-durability.ts`.
27085
+ */
27086
+ durability: "session"
26546
27087
  };
26547
27088
  var ValveStatusSchema = object({
26548
27089
  /** Lifecycle state of the valve. */
@@ -26594,7 +27135,14 @@ var valveCapability = {
26594
27135
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
26595
27136
  * slice for live position changes during a move.
26596
27137
  */
26597
- runtimeState: ValveStatusSchema
27138
+ runtimeState: ValveStatusSchema,
27139
+ /**
27140
+ * Runtime-state durability: **session** — as `brightness`.
27141
+ *
27142
+ * See `RuntimeStateDurability`. Enforced by
27143
+ * `scripts/check-runtime-state-durability.ts`.
27144
+ */
27145
+ durability: "session"
26598
27146
  };
26599
27147
  /**
26600
27148
  * Vibration / shake / impact sensor. Drives Home Assistant
@@ -26616,7 +27164,17 @@ var vibrationCapability = {
26616
27164
  schema: VibrationStatusSchema,
26617
27165
  kind: "push"
26618
27166
  },
26619
- runtimeState: VibrationStatusSchema
27167
+ runtimeState: VibrationStatusSchema,
27168
+ /**
27169
+ * Runtime-state durability: **restored** — as `smoke`.
27170
+ *
27171
+ * See `RuntimeStateDurability`. Enforced by
27172
+ * `scripts/check-runtime-state-durability.ts`.
27173
+ */
27174
+ durability: "restored",
27175
+ /** Clock fields: written, but excluded from the compare that decides
27176
+ * whether persisting is worth a SQLite commit. */
27177
+ volatileStateFields: ["lastChangedAt"]
26620
27178
  };
26621
27179
  /**
26622
27180
  * Water heater / boiler cap. Models HA `water_heater.*` entities — a
@@ -26690,7 +27248,14 @@ var waterHeaterCapability = {
26690
27248
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
26691
27249
  * slice for live temperature / mode / away changes.
26692
27250
  */
26693
- runtimeState: WaterHeaterStatusSchema
27251
+ runtimeState: WaterHeaterStatusSchema,
27252
+ /**
27253
+ * Runtime-state durability: **session** — as `climate-control`.
27254
+ *
27255
+ * See `RuntimeStateDurability`. Enforced by
27256
+ * `scripts/check-runtime-state-durability.ts`.
27257
+ */
27258
+ durability: "session"
26694
27259
  };
26695
27260
  /**
26696
27261
  * Weather provider cap. Models HA `weather.*` entities — a read-only
@@ -26749,7 +27314,14 @@ var weatherCapability = {
26749
27314
  * Runtime-state slice — mirrored by the kernel. The UI reads the
26750
27315
  * current conditions directly from the slice on each weather push.
26751
27316
  */
26752
- runtimeState: WeatherStatusSchema
27317
+ runtimeState: WeatherStatusSchema,
27318
+ /**
27319
+ * Runtime-state durability: **session** — a forecast is stale the moment the hub is down; the provider re-fetches on connect.
27320
+ *
27321
+ * See `RuntimeStateDurability`. Enforced by
27322
+ * `scripts/check-runtime-state-durability.ts`.
27323
+ */
27324
+ durability: "session"
26753
27325
  };
26754
27326
  /**
26755
27327
  * Per-zone occupancy aggregation produced by the analytics frame
@@ -26911,7 +27483,14 @@ var zoneAnalyticsCapability = {
26911
27483
  * automatically; the explicit `getCurrentSnapshot` cap method is
26912
27484
  * still useful for one-off polls without a subscription.
26913
27485
  */
26914
- runtimeState: CameraOccupancySnapshotSchema
27486
+ runtimeState: CameraOccupancySnapshotSchema,
27487
+ /**
27488
+ * Runtime-state durability: **session** — per-frame analytics; with `audio-metrics` it is ~90 % of the offered write rate. Re-derived on the next frame.
27489
+ *
27490
+ * See `RuntimeStateDurability`. Enforced by
27491
+ * `scripts/check-runtime-state-durability.ts`.
27492
+ */
27493
+ durability: "session"
26915
27494
  };
26916
27495
  /**
26917
27496
  * Stages a {@link ZoneRule} can apply to. Discriminator on the rules
@@ -26989,7 +27568,14 @@ var zoneRulesCapability = {
26989
27568
  motion: array(ZoneRuleSchema).readonly(),
26990
27569
  detection: array(ZoneRuleSchema).readonly(),
26991
27570
  package: array(ZoneRuleSchema).readonly()
26992
- })
27571
+ }),
27572
+ /**
27573
+ * Runtime-state durability: **restored** — operator intent, mutation-only, same argument as `zones`.
27574
+ *
27575
+ * See `RuntimeStateDurability`. Enforced by
27576
+ * `scripts/check-runtime-state-durability.ts`.
27577
+ */
27578
+ durability: "restored"
26993
27579
  };
26994
27580
  /**
26995
27581
  * Accessory device helpers — shared across drivers.
@@ -33675,6 +34261,7 @@ Object.freeze({
33675
34261
  "network-access": "ingress",
33676
34262
  "smtp-provider": "email"
33677
34263
  });
34264
+ new Map(AUDIO_MACRO_LABELS.flatMap((macro) => macro.icon === void 0 ? [] : [[macro.id, macro.icon]]));
33678
34265
  new Set(["devices", "classes"]);
33679
34266
  /**
33680
34267
  * TimelapseRule — the STANDALONE scheduled timelapse producer's rule model.