@camstack/addon-post-analysis 1.2.68 → 1.2.69

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11021,7 +11021,14 @@ var cameraStreamsCapability = {
11021
11021
  low: string().optional()
11022
11022
  }),
11023
11023
  lastChangedAt: number()
11024
- })
11024
+ }),
11025
+ /**
11026
+ * Runtime-state durability: **session** — a restored `slotStatuses: streaming` for a camera that has been dark for two hours is a lie the UI renders as truth.
11027
+ *
11028
+ * See `RuntimeStateDurability`. Enforced by
11029
+ * `scripts/check-runtime-state-durability.ts`.
11030
+ */
11031
+ durability: "session"
11025
11032
  };
11026
11033
  /** kebab-case cap name → camelCase router-map key. */
11027
11034
  function kebabToCamel(s) {
@@ -11608,6 +11615,13 @@ var deviceDiscoveryCapability = {
11608
11615
  kind: "poll"
11609
11616
  },
11610
11617
  runtimeState: DeviceDiscoveryStatusSchema.extend({ lastFetchedAt: number().int().nonnegative() }),
11618
+ /**
11619
+ * Runtime-state durability: **session** — 5.7 KB of scan output on the largest device, fully re-derivable by re-scanning.
11620
+ *
11621
+ * See `RuntimeStateDurability`. Enforced by
11622
+ * `scripts/check-runtime-state-durability.ts`.
11623
+ */
11624
+ durability: "session",
11611
11625
  methods: {
11612
11626
  /**
11613
11627
  * Snapshot of the current `discovered` list. Returns the
@@ -13462,7 +13476,23 @@ var NotificationActionSchema = object({
13462
13476
  * else — see `notification-center/action-token.ts` for what that does and
13463
13477
  * does not buy.
13464
13478
  */
13465
- destructive: boolean().optional()
13479
+ destructive: boolean().optional(),
13480
+ /**
13481
+ * How the tap should REACH the url.
13482
+ *
13483
+ * `navigate` (absent, and every button authored before this field) opens it:
13484
+ * the phone leaves the notification and shows whatever the callback returns.
13485
+ * That is right for a button whose answer the operator wants to read.
13486
+ *
13487
+ * `background` fires it as a POST and stays put. It exists for the buttons
13488
+ * whose whole point is not to interrupt — "silence this for 30 minutes" is
13489
+ * an answer to the notification, and being thrown into a browser tab to
13490
+ * confirm it costs more attention than the notification did. A backend that
13491
+ * cannot do a background call renders it as an ordinary link (the adapters
13492
+ * fall back rather than dropping the button), so this is a preference, never
13493
+ * a requirement.
13494
+ */
13495
+ mode: _enum(["navigate", "background"]).optional()
13466
13496
  });
13467
13497
  /**
13468
13498
  * The canonical notification. `body` is the only hard field (Apprise model).
@@ -14341,7 +14371,17 @@ var alarmPanelCapability = {
14341
14371
  * full slice; renders an arm button per `availableModes` entry and
14342
14372
  * a PIN field iff `requiresCode === true`.
14343
14373
  */
14344
- runtimeState: AlarmPanelStatusSchema
14374
+ runtimeState: AlarmPanelStatusSchema,
14375
+ /**
14376
+ * Runtime-state durability: **restored** — armed state is the one thing a panel must not lose across a restart.
14377
+ *
14378
+ * See `RuntimeStateDurability`. Enforced by
14379
+ * `scripts/check-runtime-state-durability.ts`.
14380
+ */
14381
+ durability: "restored",
14382
+ /** Clock fields: written, but excluded from the compare that decides
14383
+ * whether persisting is worth a SQLite commit. */
14384
+ volatileStateFields: ["lastChangedAt"]
14345
14385
  };
14346
14386
  /**
14347
14387
  * Shared geometry vocabulary for on-frame shape caps — privacy-mask,
@@ -14496,6 +14536,19 @@ var NC_LEGACY_SYSTEM_EVENT_KINDS = new Set([
14496
14536
  ]);
14497
14537
  NcSystemEventKindSchema.options.filter((kind) => !NC_LEGACY_SYSTEM_EVENT_KINDS.has(kind));
14498
14538
  /**
14539
+ * The panel's three transitions, as ONE list.
14540
+ *
14541
+ * Named here rather than spelled out at each of the four sites that need them
14542
+ * (the emitter, the intake, the editor group, the combined-notification gate),
14543
+ * because a fourth transition added to the enum and forgotten at one of them is
14544
+ * an alarm state nobody can be notified about.
14545
+ */
14546
+ var NC_ALARM_SYSTEM_EVENT_KINDS = [
14547
+ "alarm-triggered",
14548
+ "alarm-armed",
14549
+ "alarm-disarmed"
14550
+ ];
14551
+ /**
14499
14552
  * One coherent system-event condition. `kinds` is the required opt-in safety
14500
14553
  * gate; the remaining lists are optional narrowing filters relevant to the
14501
14554
  * selected kinds.
@@ -14518,6 +14571,26 @@ var NcSystemEventConditionSchema = object({
14518
14571
  nodeIds: array(string().min(1)).min(1).optional(),
14519
14572
  packageNames: array(string().min(1)).min(1).optional()
14520
14573
  });
14574
+ /** Hard ceiling on a window (24h). A snooze that could not expire would be an
14575
+ * outage the operator asked for once and forgot. */
14576
+ var NC_SNOOZE_MAX_MINUTES = 1440;
14577
+ /**
14578
+ * The durations a notification offers when its rule does not say otherwise.
14579
+ *
14580
+ * MINUTES, and short ones: a snooze button is answered on a lock screen, and
14581
+ * the three choices that fit there are "the next few minutes", "the next half
14582
+ * hour" and "the next hour". Anything longer is a decision somebody sits down
14583
+ * to make, which is what the app's own snooze surface is for.
14584
+ *
14585
+ * Resolved in CODE (`snoozeChoices`), never as a Zod default — see
14586
+ * {@link NcRuleInputSchema.shape.snoozeOptions} for why the distinction is
14587
+ * load-bearing.
14588
+ */
14589
+ var NC_DEFAULT_SNOOZE_MINUTES = [
14590
+ 10,
14591
+ 30,
14592
+ 60
14593
+ ];
14521
14594
  /** Weekly schedule — OR of windows; absence on the rule = always active. */
14522
14595
  var NcScheduleSchema = object({
14523
14596
  windows: array(object({
@@ -14894,15 +14967,15 @@ var NcConditionsSchema = object({
14894
14967
  * (an `immediate` rule naming an `audio-*` class, one notification per
14895
14968
  * classified sample) stays exactly as it was for rules that already use it.
14896
14969
  *
14897
- * NOT in {@link NC_CONDITION_CATALOG} yet, and that is the sequencing rule
14898
- * rather than an oversight: the viewer mirrors the descriptor enums BY HAND
14899
- * (`camstack/src/data/notification-center.ts`, guarded by
14900
- * `scripts/check-viewer-condition-mirror.ts`) and its rule editor STRIPS the
14970
+ * In {@link NC_CONDITION_CATALOG} since P2, and the ORDER it got there is the
14971
+ * rule rather than an accident: the viewer mirrors the descriptor enums BY
14972
+ * HAND (`camstack/src/data/notification-center.ts`, guarded by
14973
+ * `scripts/check-viewer-condition-mirror.ts`) and its rule editor strips the
14901
14974
  * condition fields it does not know when a rule is saved from the phone.
14902
14975
  * Publishing an editor for a condition the app cannot round-trip is how an
14903
- * operator loses a rule's conditions by opening it — so the descriptor, the
14904
- * admin widget and the viewer mirror land together (P2 + P3), and only then
14905
- * does an audio rule become authorable.
14976
+ * operator loses a rule's conditions by opening it — so the viewer mirror
14977
+ * (P3, shipped) went FIRST, and the descriptor an editor renders from
14978
+ * follows here.
14906
14979
  */
14907
14980
  audio: NcAudioConditionSchema.optional()
14908
14981
  });
@@ -15138,6 +15211,30 @@ var NcRuleInputSchema = object({
15138
15211
  */
15139
15212
  snoozeAllowGlobal: boolean().optional(),
15140
15213
  /**
15214
+ * The snooze durations THIS rule's notification offers as buttons, in
15215
+ * minutes.
15216
+ *
15217
+ * Three states, and all three are distinct — which is exactly why this is
15218
+ * `.optional()` and never `.default()`. A Zod default does not run on the
15219
+ * addon cap path (three production failures in one day), so a schema default
15220
+ * would collapse the first two:
15221
+ *
15222
+ * | value | meaning |
15223
+ * | --- | --- |
15224
+ * | absent | the operator never said ⇒ {@link NC_DEFAULT_SNOOZE_MINUTES} |
15225
+ * | `[]` | **no snooze buttons on this rule** — the explicit override |
15226
+ * | a list | these choices, de-duplicated and sorted, at most four |
15227
+ *
15228
+ * `.max(4)` because the notifier's own action budget is small (ntfy allows
15229
+ * three buttons in total) and a rule that spent it all on snooze choices
15230
+ * would push its own tap-through actions off the notification.
15231
+ *
15232
+ * An empty list is NOT an alarm exemption: a rule the alarm is about, or
15233
+ * that arms the panel, is exempt automatically and cannot be silenced by a
15234
+ * window from anywhere (D133).
15235
+ */
15236
+ snoozeOptions: array(number().int().min(1).max(NC_SNOOZE_MAX_MINUTES)).max(4).optional(),
15237
+ /**
15141
15238
  * Devices this rule ACTUATES — arm the alarm, open a gate, turn on a light.
15142
15239
  *
15143
15240
  * This is what makes the rule set the alarm's trigger set without the alarm
@@ -15237,6 +15334,7 @@ var NcConditionDescriptorSchema = object({
15237
15334
  "device",
15238
15335
  "package",
15239
15336
  "occupancy",
15337
+ "audio",
15240
15338
  "system"
15241
15339
  ]),
15242
15340
  label: string(),
@@ -15255,6 +15353,7 @@ var NcConditionDescriptorSchema = object({
15255
15353
  "crossingSelect",
15256
15354
  "polygonDraw",
15257
15355
  "occupancy",
15356
+ "audio",
15258
15357
  "deviceState",
15259
15358
  "systemEvent"
15260
15359
  ]),
@@ -15652,6 +15751,16 @@ var NC_CONDITION_CATALOG = [
15652
15751
  phase: "P1",
15653
15752
  description: "ZoneAnalytics occupancy edge (optionally zone/class-scoped): count crosses the threshold and holds for sustainSeconds. Fail-closed on a missing snapshot."
15654
15753
  },
15754
+ {
15755
+ id: "audio",
15756
+ group: "audio",
15757
+ label: "Sound",
15758
+ valueType: "audio",
15759
+ operator: "anyOf",
15760
+ appliesTo: ["immediate"],
15761
+ phase: "P2",
15762
+ description: "Fires when at least hitPercent% of the samples in a samplingSeconds window are hits — a hit clears the dBFS floor AND carries one of the chosen sounds. Both filters are optional and independent, but naming NEITHER never matches: every sample would be a hit, so the engine refuses rather than notifying on silence. dBFS is negative-going (0 = full scale, -96 = silence)."
15763
+ },
15655
15764
  {
15656
15765
  id: "customZones",
15657
15766
  group: "zones",
@@ -15796,7 +15905,20 @@ var NcSnoozeInputSchema = object({
15796
15905
  ruleId: string().optional(),
15797
15906
  /** Required when `scope: 'device'`. */
15798
15907
  deviceId: number().int().optional(),
15799
- durationMinutes: number().int().min(1).max(1440),
15908
+ /**
15909
+ * Narrow the window to these subject classes — "the cat, not the person".
15910
+ *
15911
+ * ORTHOGONAL to `scope`, deliberately, and absent means EVERY class: that is
15912
+ * what every window authored before this field meant, so no persisted row
15913
+ * changes meaning and no client has to learn anything to keep working.
15914
+ *
15915
+ * It is what makes the window's real key `(deviceId, classes[])` and lets it
15916
+ * cross rules (D133): the operator points at a camera and a kind of thing,
15917
+ * not at whichever of their four rules happened to produce the notification
15918
+ * they are dismissing.
15919
+ */
15920
+ classes: array(string().min(1)).min(1).optional(),
15921
+ durationMinutes: number().int().min(1).max(NC_SNOOZE_MAX_MINUTES),
15800
15922
  /**
15801
15923
  * Silence this for EVERY recipient, not just the caller. Permission is
15802
15924
  * checked server-side (the rule's `snoozeAllowGlobal`, or admin for the
@@ -15821,6 +15943,10 @@ var NcSnoozeSchema = object({
15821
15943
  scope: NcSnoozeScopeSchema,
15822
15944
  ruleId: string().optional(),
15823
15945
  deviceId: number().int().optional(),
15946
+ /** Subject classes this window covers. ABSENT = every class — see
15947
+ * {@link NcSnoozeInputSchema.shape.classes}. Lives in the JSON blob and has
15948
+ * no SQLite column: nothing queries a window by class. */
15949
+ classes: array(string().min(1)).min(1).optional(),
15824
15950
  startedAt: number(),
15825
15951
  /** Exclusive: at exactly this instant the snooze is over. Expiry is a
15826
15952
  * COMPARISON, not a job — no sweeper can leave the operator silenced. */
@@ -18417,7 +18543,14 @@ var zonesCapability = {
18417
18543
  * handle. Slice shape is `{ zones: Zone[] }` so future extensions
18418
18544
  * (e.g. zone groupings) can sit alongside the polygon list.
18419
18545
  */
18420
- runtimeState: object({ zones: array(ZoneSchema).readonly() })
18546
+ runtimeState: object({ zones: array(ZoneSchema).readonly() }),
18547
+ /**
18548
+ * 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.
18549
+ *
18550
+ * See `RuntimeStateDurability`. Enforced by
18551
+ * `scripts/check-runtime-state-durability.ts`.
18552
+ */
18553
+ durability: "restored"
18421
18554
  };
18422
18555
  /**
18423
18556
  * A bounding box in NORMALIZED [0,1] frame coordinates for `getNativeCrop`. The
@@ -21260,7 +21393,17 @@ var airQualitySensorCapability = {
21260
21393
  schema: AirQualitySensorStatusSchema,
21261
21394
  kind: "push"
21262
21395
  },
21263
- runtimeState: AirQualitySensorStatusSchema
21396
+ runtimeState: AirQualitySensorStatusSchema,
21397
+ /**
21398
+ * Runtime-state durability: **restored** — as `numeric-sensor`.
21399
+ *
21400
+ * See `RuntimeStateDurability`. Enforced by
21401
+ * `scripts/check-runtime-state-durability.ts`.
21402
+ */
21403
+ durability: "restored",
21404
+ /** Clock fields: written, but excluded from the compare that decides
21405
+ * whether persisting is worth a SQLite commit. */
21406
+ volatileStateFields: ["lastFetchedAt"]
21264
21407
  };
21265
21408
  /**
21266
21409
  * Ambient illuminance reading in lux. Drives Home Assistant `sensor`
@@ -21292,7 +21435,17 @@ var ambientLightSensorCapability = {
21292
21435
  schema: AmbientLightSensorStatusSchema,
21293
21436
  kind: "push"
21294
21437
  },
21295
- runtimeState: AmbientLightSensorStatusSchema
21438
+ runtimeState: AmbientLightSensorStatusSchema,
21439
+ /**
21440
+ * Runtime-state durability: **restored** — as `numeric-sensor`.
21441
+ *
21442
+ * See `RuntimeStateDurability`. Enforced by
21443
+ * `scripts/check-runtime-state-durability.ts`.
21444
+ */
21445
+ durability: "restored",
21446
+ /** Clock fields: written, but excluded from the compare that decides
21447
+ * whether persisting is worth a SQLite commit. */
21448
+ volatileStateFields: ["lastFetchedAt"]
21296
21449
  };
21297
21450
  /**
21298
21451
  * Per-class audio metrics aggregated over a sliding window.
@@ -21410,7 +21563,14 @@ var audioMetricsCapability = {
21410
21563
  }), AudioMetricsHistorySchema)
21411
21564
  },
21412
21565
  /** Reactive runtime-state mirror — live `device.state.audioMetrics.value`. */
21413
- runtimeState: AudioMetricsSnapshotSchema
21566
+ runtimeState: AudioMetricsSnapshotSchema,
21567
+ /**
21568
+ * 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.
21569
+ *
21570
+ * See `RuntimeStateDurability`. Enforced by
21571
+ * `scripts/check-runtime-state-durability.ts`.
21572
+ */
21573
+ durability: "session"
21414
21574
  };
21415
21575
  /**
21416
21576
  * Automation-control cap. Models HA `automation.*` entities on
@@ -21472,7 +21632,14 @@ var automationControlCapability = {
21472
21632
  * reads `enabled` (toggle) + `isRunning` (spinner) + `lastError`
21473
21633
  * (badge) directly.
21474
21634
  */
21475
- runtimeState: AutomationControlStatusSchema
21635
+ runtimeState: AutomationControlStatusSchema,
21636
+ /**
21637
+ * 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.
21638
+ *
21639
+ * See `RuntimeStateDurability`. Enforced by
21640
+ * `scripts/check-runtime-state-durability.ts`.
21641
+ */
21642
+ durability: "session"
21476
21643
  };
21477
21644
  /**
21478
21645
  * Battery status snapshot. Emitted by providers whose device is
@@ -21578,7 +21745,17 @@ onStatusChanged: { data: object({
21578
21745
  * via `device.runtimeState.getCapState('battery')` regardless of
21579
21746
  * the underlying driver.
21580
21747
  */
21581
- runtimeState: BatteryStatusSchema
21748
+ runtimeState: BatteryStatusSchema,
21749
+ /**
21750
+ * 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.
21751
+ *
21752
+ * See `RuntimeStateDurability`. Enforced by
21753
+ * `scripts/check-runtime-state-durability.ts`.
21754
+ */
21755
+ durability: "restored",
21756
+ /** Clock fields: written, but excluded from the compare that decides
21757
+ * whether persisting is worth a SQLite commit. */
21758
+ volatileStateFields: ["lastUpdated"]
21582
21759
  };
21583
21760
  /**
21584
21761
  * Generic boolean sensor — last-resort fallback when no domain-
@@ -21607,7 +21784,17 @@ var binaryCapability = {
21607
21784
  schema: BinaryStatusSchema,
21608
21785
  kind: "push"
21609
21786
  },
21610
- runtimeState: BinaryStatusSchema
21787
+ runtimeState: BinaryStatusSchema,
21788
+ /**
21789
+ * Runtime-state durability: **restored** — transition-driven sensor state; the restored value gives the boot comparison.
21790
+ *
21791
+ * See `RuntimeStateDurability`. Enforced by
21792
+ * `scripts/check-runtime-state-durability.ts`.
21793
+ */
21794
+ durability: "restored",
21795
+ /** Clock fields: written, but excluded from the compare that decides
21796
+ * whether persisting is worth a SQLite commit. */
21797
+ volatileStateFields: ["lastChangedAt"]
21611
21798
  };
21612
21799
  /**
21613
21800
  * Dimmable-light brightness control. Co-exists with `switch` on the
@@ -21660,7 +21847,14 @@ onBrightnessChanged: { data: object({
21660
21847
  * by the kernel. Read via `device.state.brightness.value` so UI
21661
21848
  * sliders surface the current level without polling the provider.
21662
21849
  */
21663
- runtimeState: BrightnessStatusSchema
21850
+ runtimeState: BrightnessStatusSchema,
21851
+ /**
21852
+ * Runtime-state durability: **session** — live lamp state, re-published by the provider on connect.
21853
+ *
21854
+ * See `RuntimeStateDurability`. Enforced by
21855
+ * `scripts/check-runtime-state-durability.ts`.
21856
+ */
21857
+ durability: "session"
21664
21858
  };
21665
21859
  DeviceType.Button, method(object({ deviceId: number().int().nonnegative() }), _void(), {
21666
21860
  kind: "mutation",
@@ -21748,7 +21942,17 @@ var carbonMonoxideCapability = {
21748
21942
  schema: CarbonMonoxideStatusSchema,
21749
21943
  kind: "push"
21750
21944
  },
21751
- runtimeState: CarbonMonoxideStatusSchema
21945
+ runtimeState: CarbonMonoxideStatusSchema,
21946
+ /**
21947
+ * Runtime-state durability: **restored** — as `smoke`.
21948
+ *
21949
+ * See `RuntimeStateDurability`. Enforced by
21950
+ * `scripts/check-runtime-state-durability.ts`.
21951
+ */
21952
+ durability: "restored",
21953
+ /** Clock fields: written, but excluded from the compare that decides
21954
+ * whether persisting is worth a SQLite commit. */
21955
+ volatileStateFields: ["lastChangedAt"]
21752
21956
  };
21753
21957
  /**
21754
21958
  * HVAC / climate control cap. Models the full surface of a HA
@@ -21908,7 +22112,14 @@ var climateControlCapability = {
21908
22112
  * the full slice via `device.state.climate-control.value` and refresh
21909
22113
  * on every push without re-querying the provider.
21910
22114
  */
21911
- runtimeState: ClimateControlStatusSchema
22115
+ runtimeState: ClimateControlStatusSchema,
22116
+ /**
22117
+ * Runtime-state durability: **session** — as `brightness`; `currentTemp` moves continuously and is re-published on connect.
22118
+ *
22119
+ * See `RuntimeStateDurability`. Enforced by
22120
+ * `scripts/check-runtime-state-durability.ts`.
22121
+ */
22122
+ durability: "session"
21912
22123
  };
21913
22124
  /**
21914
22125
  * Color-light cap. Coexists with `switch` (on/off) and `brightness`
@@ -22018,7 +22229,14 @@ onColorChanged: { data: object({
22018
22229
  * kernel. Read via `device.state.color.value` so UI pickers surface
22019
22230
  * the current chromaticity without polling the provider.
22020
22231
  */
22021
- runtimeState: ColorStatusSchema
22232
+ runtimeState: ColorStatusSchema,
22233
+ /**
22234
+ * Runtime-state durability: **session** — as `brightness`.
22235
+ *
22236
+ * See `RuntimeStateDurability`. Enforced by
22237
+ * `scripts/check-runtime-state-durability.ts`.
22238
+ */
22239
+ durability: "session"
22022
22240
  };
22023
22241
  var ConnectionTestOutcomeSchema = discriminatedUnion("outcome", [
22024
22242
  object({
@@ -22076,7 +22294,17 @@ var connectivityCapability = {
22076
22294
  schema: ConnectivityStatusSchema,
22077
22295
  kind: "push"
22078
22296
  },
22079
- runtimeState: ConnectivityStatusSchema
22297
+ runtimeState: ConnectivityStatusSchema,
22298
+ /**
22299
+ * Runtime-state durability: **restored** — same shape and same argument as `device-status`, for links rather than devices.
22300
+ *
22301
+ * See `RuntimeStateDurability`. Enforced by
22302
+ * `scripts/check-runtime-state-durability.ts`.
22303
+ */
22304
+ durability: "restored",
22305
+ /** Clock fields: written, but excluded from the compare that decides
22306
+ * whether persisting is worth a SQLite commit. */
22307
+ volatileStateFields: ["lastChangedAt"]
22080
22308
  };
22081
22309
  /**
22082
22310
  * Generic device-consumables capability — surfaces a device's
@@ -22158,7 +22386,14 @@ reset: method(object({
22158
22386
  }
22159
22387
  }
22160
22388
  },
22161
- runtimeState: ConsumablesStatusSchema.extend({ lastFetchedAt: number() })
22389
+ runtimeState: ConsumablesStatusSchema.extend({ lastFetchedAt: number() }),
22390
+ /**
22391
+ * Runtime-state durability: **session** — the authority is the appliance; the provider re-reads the whole item array on connect.
22392
+ *
22393
+ * See `RuntimeStateDurability`. Enforced by
22394
+ * `scripts/check-runtime-state-durability.ts`.
22395
+ */
22396
+ durability: "session"
22162
22397
  };
22163
22398
  /**
22164
22399
  * Door / window / opening / garage / valve contact sensor. Boolean
@@ -22189,7 +22424,17 @@ var contactCapability = {
22189
22424
  schema: ContactStatusSchema,
22190
22425
  kind: "push"
22191
22426
  },
22192
- runtimeState: ContactStatusSchema
22427
+ runtimeState: ContactStatusSchema,
22428
+ /**
22429
+ * Runtime-state durability: **restored** — a door left open across a restart must still read open.
22430
+ *
22431
+ * See `RuntimeStateDurability`. Enforced by
22432
+ * `scripts/check-runtime-state-durability.ts`.
22433
+ */
22434
+ durability: "restored",
22435
+ /** Clock fields: written, but excluded from the compare that decides
22436
+ * whether persisting is worth a SQLite commit. */
22437
+ volatileStateFields: ["lastChangedAt"]
22193
22438
  };
22194
22439
  /**
22195
22440
  * Status slice — flat object (the framework's `runtimeState` contract
@@ -22295,7 +22540,14 @@ var controlCapability = {
22295
22540
  * dropdown / text field / date picker) read the slice's discriminant
22296
22541
  * and value directly without polling the provider.
22297
22542
  */
22298
- runtimeState: ControlStatusSchema
22543
+ runtimeState: ControlStatusSchema,
22544
+ /**
22545
+ * Runtime-state durability: **session** — a generic control mirrors an external entity that re-publishes on connect; the options array is re-derived with it.
22546
+ *
22547
+ * See `RuntimeStateDurability`. Enforced by
22548
+ * `scripts/check-runtime-state-durability.ts`.
22549
+ */
22550
+ durability: "session"
22299
22551
  };
22300
22552
  var CoverStatusSchema = object({
22301
22553
  /** Lifecycle state of the cover. */
@@ -22356,7 +22608,17 @@ var coverCapability = {
22356
22608
  * Runtime-state slice — mirrored by the kernel. UI controls watch
22357
22609
  * the slice for live position changes during a move.
22358
22610
  */
22359
- runtimeState: CoverStatusSchema
22611
+ runtimeState: CoverStatusSchema,
22612
+ /**
22613
+ * Runtime-state durability: **restored** — position survives a restart on the device; the mirror should agree at boot rather than read blank.
22614
+ *
22615
+ * See `RuntimeStateDurability`. Enforced by
22616
+ * `scripts/check-runtime-state-durability.ts`.
22617
+ */
22618
+ durability: "restored",
22619
+ /** Clock fields: written, but excluded from the compare that decides
22620
+ * whether persisting is worth a SQLite commit. */
22621
+ volatileStateFields: ["lastChangedAt"]
22360
22622
  };
22361
22623
  /**
22362
22624
  * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
@@ -22450,7 +22712,17 @@ var dayNightCapability = {
22450
22712
  schema: DayNightStatusSchema,
22451
22713
  kind: "poll"
22452
22714
  },
22453
- runtimeState: DayNightStatusSchema
22715
+ runtimeState: DayNightStatusSchema,
22716
+ /**
22717
+ * Runtime-state durability: **restored** — operator-set IR-cut behaviour; mutation-driven.
22718
+ *
22719
+ * See `RuntimeStateDurability`. Enforced by
22720
+ * `scripts/check-runtime-state-durability.ts`.
22721
+ */
22722
+ durability: "restored",
22723
+ /** Clock fields: written, but excluded from the compare that decides
22724
+ * whether persisting is worth a SQLite commit. */
22725
+ volatileStateFields: ["lastFetchedAt"]
22454
22726
  };
22455
22727
  /**
22456
22728
  * Generic device-level status snapshot. Auto-registered by `BaseDevice`
@@ -22497,7 +22769,17 @@ onStatusChanged: { data: object({
22497
22769
  schema: DeviceStatusSchema,
22498
22770
  kind: "push"
22499
22771
  },
22500
- runtimeState: DeviceStatusSchema
22772
+ runtimeState: DeviceStatusSchema,
22773
+ /**
22774
+ * 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.
22775
+ *
22776
+ * See `RuntimeStateDurability`. Enforced by
22777
+ * `scripts/check-runtime-state-durability.ts`.
22778
+ */
22779
+ durability: "restored",
22780
+ /** Clock fields: written, but excluded from the compare that decides
22781
+ * whether persisting is worth a SQLite commit. */
22782
+ volatileStateFields: ["lastChangedAt"]
22501
22783
  };
22502
22784
  /**
22503
22785
  * Doorbell button cap. Two kinds of providers coexist behind this cap
@@ -22559,7 +22841,14 @@ onPressed: { data: DoorbellPressEventSchema } },
22559
22841
  * `device.state.doorbell.value`. UIs can show "last ring 5m ago"
22560
22842
  * without subscribing.
22561
22843
  */
22562
- runtimeState: DoorbellStatusSchema
22844
+ runtimeState: DoorbellStatusSchema,
22845
+ /**
22846
+ * 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.
22847
+ *
22848
+ * See `RuntimeStateDurability`. Enforced by
22849
+ * `scripts/check-runtime-state-durability.ts`.
22850
+ */
22851
+ durability: "restored"
22563
22852
  };
22564
22853
  /**
22565
22854
  * Enum-state sensor — a string value picked from a finite option set.
@@ -22599,7 +22888,17 @@ var enumSensorCapability = {
22599
22888
  schema: EnumSensorStatusSchema,
22600
22889
  kind: "push"
22601
22890
  },
22602
- runtimeState: EnumSensorStatusSchema
22891
+ runtimeState: EnumSensorStatusSchema,
22892
+ /**
22893
+ * Runtime-state durability: **restored** — as `numeric-sensor`; 80 devices.
22894
+ *
22895
+ * See `RuntimeStateDurability`. Enforced by
22896
+ * `scripts/check-runtime-state-durability.ts`.
22897
+ */
22898
+ durability: "restored",
22899
+ /** Clock fields: written, but excluded from the compare that decides
22900
+ * whether persisting is worth a SQLite commit. */
22901
+ volatileStateFields: ["lastFetchedAt"]
22603
22902
  };
22604
22903
  /**
22605
22904
  * Generic stateless event emitter. Installed on a `DeviceType.EventEmitter`
@@ -22635,7 +22934,14 @@ var eventEmitterCapability = {
22635
22934
  schema: EventEmitterStatusSchema,
22636
22935
  kind: "push"
22637
22936
  },
22638
- runtimeState: EventEmitterStatusSchema
22937
+ runtimeState: EventEmitterStatusSchema,
22938
+ /**
22939
+ * Runtime-state durability: **session** — `eventCountSinceStart` names its own scope.
22940
+ *
22941
+ * See `RuntimeStateDurability`. Enforced by
22942
+ * `scripts/check-runtime-state-durability.ts`.
22943
+ */
22944
+ durability: "session"
22639
22945
  };
22640
22946
  var EventItemSchema = object({
22641
22947
  id: string(),
@@ -22942,7 +23248,14 @@ var fanControlCapability = {
22942
23248
  * Runtime-state slice — mirrored by the kernel. UI fan speed
22943
23249
  * sliders read `percentage` for live updates.
22944
23250
  */
22945
- runtimeState: FanControlStatusSchema
23251
+ runtimeState: FanControlStatusSchema,
23252
+ /**
23253
+ * Runtime-state durability: **session** — as `brightness`.
23254
+ *
23255
+ * See `RuntimeStateDurability`. Enforced by
23256
+ * `scripts/check-runtime-state-durability.ts`.
23257
+ */
23258
+ durability: "session"
22946
23259
  };
22947
23260
  /**
22948
23261
  * Per-device feature/identity probe slice. Holds the runtime-resolved
@@ -23018,7 +23331,14 @@ onProbeChanged: { data: object({
23018
23331
  schema: FeatureProbeStatusSchema,
23019
23332
  kind: "push"
23020
23333
  },
23021
- runtimeState: FeatureProbeStatusSchema
23334
+ runtimeState: FeatureProbeStatusSchema,
23335
+ /**
23336
+ * 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.
23337
+ *
23338
+ * See `RuntimeStateDurability`. Enforced by
23339
+ * `scripts/check-runtime-state-durability.ts`.
23340
+ */
23341
+ durability: "session"
23022
23342
  };
23023
23343
  /**
23024
23344
  * Water leak / moisture sensor. Boolean "is liquid currently
@@ -23045,7 +23365,17 @@ var floodCapability = {
23045
23365
  schema: FloodStatusSchema,
23046
23366
  kind: "push"
23047
23367
  },
23048
- runtimeState: FloodStatusSchema
23368
+ runtimeState: FloodStatusSchema,
23369
+ /**
23370
+ * Runtime-state durability: **restored** — as `smoke`.
23371
+ *
23372
+ * See `RuntimeStateDurability`. Enforced by
23373
+ * `scripts/check-runtime-state-durability.ts`.
23374
+ */
23375
+ durability: "restored",
23376
+ /** Clock fields: written, but excluded from the compare that decides
23377
+ * whether persisting is worth a SQLite commit. */
23378
+ volatileStateFields: ["lastChangedAt"]
23049
23379
  };
23050
23380
  /**
23051
23381
  * Combustible-gas (LPG / methane / hydrogen) alarm sensor. Drives
@@ -23068,7 +23398,17 @@ var gasCapability = {
23068
23398
  schema: GasStatusSchema,
23069
23399
  kind: "push"
23070
23400
  },
23071
- runtimeState: GasStatusSchema
23401
+ runtimeState: GasStatusSchema,
23402
+ /**
23403
+ * Runtime-state durability: **restored** — as `smoke`.
23404
+ *
23405
+ * See `RuntimeStateDurability`. Enforced by
23406
+ * `scripts/check-runtime-state-durability.ts`.
23407
+ */
23408
+ durability: "restored",
23409
+ /** Clock fields: written, but excluded from the compare that decides
23410
+ * whether persisting is worth a SQLite commit. */
23411
+ volatileStateFields: ["lastChangedAt"]
23072
23412
  };
23073
23413
  /**
23074
23414
  * Humidifier / dehumidifier cap. Models HA `humidifier.*` entities —
@@ -23144,7 +23484,14 @@ var humidifierCapability = {
23144
23484
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
23145
23485
  * slice for live humidity / mode changes.
23146
23486
  */
23147
- runtimeState: HumidifierStatusSchema
23487
+ runtimeState: HumidifierStatusSchema,
23488
+ /**
23489
+ * Runtime-state durability: **session** — as `climate-control`.
23490
+ *
23491
+ * See `RuntimeStateDurability`. Enforced by
23492
+ * `scripts/check-runtime-state-durability.ts`.
23493
+ */
23494
+ durability: "session"
23148
23495
  };
23149
23496
  /**
23150
23497
  * Single-metric humidity reading. Drives Home Assistant `sensor`
@@ -23180,7 +23527,17 @@ var humiditySensorCapability = {
23180
23527
  schema: HumiditySensorStatusSchema,
23181
23528
  kind: "push"
23182
23529
  },
23183
- runtimeState: HumiditySensorStatusSchema
23530
+ runtimeState: HumiditySensorStatusSchema,
23531
+ /**
23532
+ * Runtime-state durability: **restored** — as `numeric-sensor` (67 of 75 writes were the clock alone).
23533
+ *
23534
+ * See `RuntimeStateDurability`. Enforced by
23535
+ * `scripts/check-runtime-state-durability.ts`.
23536
+ */
23537
+ durability: "restored",
23538
+ /** Clock fields: written, but excluded from the compare that decides
23539
+ * whether persisting is worth a SQLite commit. */
23540
+ volatileStateFields: ["lastFetchedAt"]
23184
23541
  };
23185
23542
  /**
23186
23543
  * Image display cap. Models a single still image exposed by an integration —
@@ -23218,7 +23575,14 @@ var imageCapability = {
23218
23575
  * Runtime-state slice — mirrored by the kernel. The UI reads `url`
23219
23576
  * directly and renders the still image.
23220
23577
  */
23221
- runtimeState: ImageStatusSchema
23578
+ runtimeState: ImageStatusSchema,
23579
+ /**
23580
+ * Runtime-state durability: **session** — a snapshot URL is a session-scoped handle; a restored one points at nothing.
23581
+ *
23582
+ * See `RuntimeStateDurability`. Enforced by
23583
+ * `scripts/check-runtime-state-durability.ts`.
23584
+ */
23585
+ durability: "session"
23222
23586
  };
23223
23587
  /**
23224
23588
  * Vendor-neutral image / picture-adjustment cap — the per-camera config
@@ -23367,7 +23731,17 @@ var imageSettingsCapability = {
23367
23731
  schema: ImageSettingsStatusSchema,
23368
23732
  kind: "poll"
23369
23733
  },
23370
- runtimeState: ImageSettingsStatusSchema
23734
+ runtimeState: ImageSettingsStatusSchema,
23735
+ /**
23736
+ * Runtime-state durability: **restored** — operator-set camera imaging; mutation-driven.
23737
+ *
23738
+ * See `RuntimeStateDurability`. Enforced by
23739
+ * `scripts/check-runtime-state-durability.ts`.
23740
+ */
23741
+ durability: "restored",
23742
+ /** Clock fields: written, but excluded from the compare that decides
23743
+ * whether persisting is worth a SQLite commit. */
23744
+ volatileStateFields: ["lastFetchedAt"]
23371
23745
  };
23372
23746
  /**
23373
23747
  * integrations — system-scoped singleton capability for integration
@@ -23707,7 +24081,14 @@ var lawnMowerControlCapability = {
23707
24081
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
23708
24082
  * slice for live activity + battery changes.
23709
24083
  */
23710
- runtimeState: LawnMowerControlStatusSchema
24084
+ runtimeState: LawnMowerControlStatusSchema,
24085
+ /**
24086
+ * Runtime-state durability: **session** — as `vacuum-control`.
24087
+ *
24088
+ * See `RuntimeStateDurability`. Enforced by
24089
+ * `scripts/check-runtime-state-durability.ts`.
24090
+ */
24091
+ durability: "session"
23711
24092
  };
23712
24093
  /**
23713
24094
  * local-network — hub-only singleton.
@@ -23913,7 +24294,17 @@ var lockControlCapability = {
23913
24294
  * read `state` and disable themselves during `locking`/`unlocking`
23914
24295
  * transitions.
23915
24296
  */
23916
- runtimeState: LockControlStatusSchema
24297
+ runtimeState: LockControlStatusSchema,
24298
+ /**
24299
+ * Runtime-state durability: **restored** — a lock left locked must still read locked.
24300
+ *
24301
+ * See `RuntimeStateDurability`. Enforced by
24302
+ * `scripts/check-runtime-state-durability.ts`.
24303
+ */
24304
+ durability: "restored",
24305
+ /** Clock fields: written, but excluded from the compare that decides
24306
+ * whether persisting is worth a SQLite commit. */
24307
+ volatileStateFields: ["lastChangedAt"]
23917
24308
  };
23918
24309
  /**
23919
24310
  * Media-player cap. Models HA `media_player.*` (Sonos, Chromecast,
@@ -24075,7 +24466,14 @@ var mediaPlayerCapability = {
24075
24466
  * full slice for live now-playing, volume, and progress updates
24076
24467
  * without polling.
24077
24468
  */
24078
- runtimeState: MediaPlayerStatusSchema
24469
+ runtimeState: MediaPlayerStatusSchema,
24470
+ /**
24471
+ * Runtime-state durability: **session** — a restored transport position describes a playback that stopped when the hub did.
24472
+ *
24473
+ * See `RuntimeStateDurability`. Enforced by
24474
+ * `scripts/check-runtime-state-durability.ts`.
24475
+ */
24476
+ durability: "session"
24079
24477
  };
24080
24478
  /**
24081
24479
  * mesh-network — collection cap for mesh-VPN providers.
@@ -24339,7 +24737,14 @@ onMotionChanged: { data: MotionOnMotionChangedDataSchema } },
24339
24737
  * `device.state.motion.value`. Reads never invoke the provider, so
24340
24738
  * UIs and other addons can poll the cached state safely.
24341
24739
  */
24342
- runtimeState: MotionStatusSchema
24740
+ runtimeState: MotionStatusSchema,
24741
+ /**
24742
+ * 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.
24743
+ *
24744
+ * See `RuntimeStateDurability`. Enforced by
24745
+ * `scripts/check-runtime-state-durability.ts`.
24746
+ */
24747
+ durability: "session"
24343
24748
  };
24344
24749
  /**
24345
24750
  * Motion-trigger toggle for accessory devices.
@@ -24404,7 +24809,14 @@ var motionTriggerCapability = {
24404
24809
  schema: MotionTriggerStatusSchema,
24405
24810
  kind: "command-driven"
24406
24811
  },
24407
- runtimeState: MotionTriggerRuntimeStateSchema
24812
+ runtimeState: MotionTriggerRuntimeStateSchema,
24813
+ /**
24814
+ * 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.
24815
+ *
24816
+ * See `RuntimeStateDurability`. Enforced by
24817
+ * `scripts/check-runtime-state-durability.ts`.
24818
+ */
24819
+ durability: "session"
24408
24820
  };
24409
24821
  /**
24410
24822
  * Motion-zones share the same MaskShape vocabulary as privacy-mask — the
@@ -24471,7 +24883,17 @@ var motionZonesCapability = {
24471
24883
  schema: MotionZoneStatusSchema,
24472
24884
  kind: "poll"
24473
24885
  },
24474
- runtimeState: MotionZoneStatusSchema
24886
+ runtimeState: MotionZoneStatusSchema,
24887
+ /**
24888
+ * 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.
24889
+ *
24890
+ * See `RuntimeStateDurability`. Enforced by
24891
+ * `scripts/check-runtime-state-durability.ts`.
24892
+ */
24893
+ durability: "restored",
24894
+ /** Clock fields: written, but excluded from the compare that decides
24895
+ * whether persisting is worth a SQLite commit. */
24896
+ volatileStateFields: ["lastFetchedAt"]
24475
24897
  };
24476
24898
  /**
24477
24899
  * On-camera AI object detection cap. Surfaces per-device the classes
@@ -24545,7 +24967,17 @@ var nativeObjectDetectionCapability = {
24545
24967
  schema: NativeObjectDetectionStatusSchema,
24546
24968
  kind: "push"
24547
24969
  },
24548
- runtimeState: NativeObjectDetectionRuntimeStateSchema
24970
+ runtimeState: NativeObjectDetectionRuntimeStateSchema,
24971
+ /**
24972
+ * 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.
24973
+ *
24974
+ * See `RuntimeStateDurability`. Enforced by
24975
+ * `scripts/check-runtime-state-durability.ts`.
24976
+ */
24977
+ durability: "restored",
24978
+ /** Clock fields: written, but excluded from the compare that decides
24979
+ * whether persisting is worth a SQLite commit. */
24980
+ volatileStateFields: ["lastFetchedAt"]
24549
24981
  };
24550
24982
  /**
24551
24983
  * network-quality — system-scoped singleton capability tracking RTT,
@@ -24879,7 +25311,14 @@ onSent: { data: object({
24879
25311
  * form reads `supports` to gate optional fields; history pane reads
24880
25312
  * `lastSentAt` / `lastError` / `queueDepth`.
24881
25313
  */
24882
- runtimeState: NotifierStatusSchema
25314
+ runtimeState: NotifierStatusSchema,
25315
+ /**
25316
+ * Runtime-state durability: **session** — live queue depth and last-send state; a restored queue depth describes a queue that no longer exists.
25317
+ *
25318
+ * See `RuntimeStateDurability`. Enforced by
25319
+ * `scripts/check-runtime-state-durability.ts`.
25320
+ */
25321
+ durability: "session"
24883
25322
  };
24884
25323
  /**
24885
25324
  * Generic numeric sensor — last-resort fallback when no typed numeric
@@ -24922,7 +25361,17 @@ var numericSensorCapability = {
24922
25361
  schema: NumericSensorStatusSchema,
24923
25362
  kind: "push"
24924
25363
  },
24925
- runtimeState: NumericSensorStatusSchema
25364
+ runtimeState: NumericSensorStatusSchema,
25365
+ /**
25366
+ * 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.
25367
+ *
25368
+ * See `RuntimeStateDurability`. Enforced by
25369
+ * `scripts/check-runtime-state-durability.ts`.
25370
+ */
25371
+ durability: "restored",
25372
+ /** Clock fields: written, but excluded from the compare that decides
25373
+ * whether persisting is worth a SQLite commit. */
25374
+ volatileStateFields: ["lastFetchedAt"]
24926
25375
  };
24927
25376
  /**
24928
25377
  * Generic on-screen-display (video overlay) cap. Each camera exposes
@@ -25307,7 +25756,14 @@ var petFeederCapability = {
25307
25756
  * the full slice via `device.state.petFeeder.value` and refresh on
25308
25757
  * every poll without re-querying the provider.
25309
25758
  */
25310
- runtimeState: PetFeederStatusSchema
25759
+ runtimeState: PetFeederStatusSchema,
25760
+ /**
25761
+ * Runtime-state durability: **session** — live appliance state re-published on connect.
25762
+ *
25763
+ * See `RuntimeStateDurability`. Enforced by
25764
+ * `scripts/check-runtime-state-durability.ts`.
25765
+ */
25766
+ durability: "session"
25311
25767
  };
25312
25768
  var VehicleSchema = object({
25313
25769
  id: string(),
@@ -25653,7 +26109,17 @@ var powerMeterCapability = {
25653
26109
  schema: PowerMeterStatusSchema,
25654
26110
  kind: "push"
25655
26111
  },
25656
- runtimeState: PowerMeterStatusSchema
26112
+ runtimeState: PowerMeterStatusSchema,
26113
+ /**
26114
+ * Runtime-state durability: **restored** — as `numeric-sensor`; `kwhTotal` is an accumulator whose restored value is the baseline.
26115
+ *
26116
+ * See `RuntimeStateDurability`. Enforced by
26117
+ * `scripts/check-runtime-state-durability.ts`.
26118
+ */
26119
+ durability: "restored",
26120
+ /** Clock fields: written, but excluded from the compare that decides
26121
+ * whether persisting is worth a SQLite commit. */
26122
+ volatileStateFields: ["lastFetchedAt"]
25657
26123
  };
25658
26124
  /**
25659
26125
  * Presence cap. Models HA `person.*` and `device_tracker.*` entities
@@ -25710,7 +26176,17 @@ var presenceCapability = {
25710
26176
  * the map pin is rendered (use `DeviceFeature.PresenceGps` for the
25711
26177
  * pre-fetch fast-path check).
25712
26178
  */
25713
- runtimeState: PresenceStatusSchema
26179
+ runtimeState: PresenceStatusSchema,
26180
+ /**
26181
+ * Runtime-state durability: **restored** — occupancy-relevant: the restored state is what an occupancy rule compares the first post-restart observation against.
26182
+ *
26183
+ * See `RuntimeStateDurability`. Enforced by
26184
+ * `scripts/check-runtime-state-durability.ts`.
26185
+ */
26186
+ durability: "restored",
26187
+ /** Clock fields: written, but excluded from the compare that decides
26188
+ * whether persisting is worth a SQLite commit. */
26189
+ volatileStateFields: ["lastChangedAt"]
25714
26190
  };
25715
26191
  /**
25716
26192
  * Atmospheric pressure reading in hectopascals. Drives Home Assistant
@@ -25746,7 +26222,17 @@ var pressureSensorCapability = {
25746
26222
  schema: PressureSensorStatusSchema,
25747
26223
  kind: "push"
25748
26224
  },
25749
- runtimeState: PressureSensorStatusSchema
26225
+ runtimeState: PressureSensorStatusSchema,
26226
+ /**
26227
+ * Runtime-state durability: **restored** — as `numeric-sensor`.
26228
+ *
26229
+ * See `RuntimeStateDurability`. Enforced by
26230
+ * `scripts/check-runtime-state-durability.ts`.
26231
+ */
26232
+ durability: "restored",
26233
+ /** Clock fields: written, but excluded from the compare that decides
26234
+ * whether persisting is worth a SQLite commit. */
26235
+ volatileStateFields: ["lastFetchedAt"]
25750
26236
  };
25751
26237
  /**
25752
26238
  * PRIVACY — what the camera deliberately does not capture. Two planes:
@@ -25876,7 +26362,17 @@ var privacyMaskCapability = {
25876
26362
  schema: PrivacyMaskStatusSchema,
25877
26363
  kind: "poll"
25878
26364
  },
25879
- runtimeState: PrivacyMaskStatusSchema
26365
+ runtimeState: PrivacyMaskStatusSchema,
26366
+ /**
26367
+ * Runtime-state durability: **restored** — operator-drawn regions, zero real churn — 22 writes in 25 minutes, every one of them the clock.
26368
+ *
26369
+ * See `RuntimeStateDurability`. Enforced by
26370
+ * `scripts/check-runtime-state-durability.ts`.
26371
+ */
26372
+ durability: "restored",
26373
+ /** Clock fields: written, but excluded from the compare that decides
26374
+ * whether persisting is worth a SQLite commit. */
26375
+ volatileStateFields: ["lastFetchedAt"]
25880
26376
  };
25881
26377
  var PtzPresetSchema = object({
25882
26378
  id: string(),
@@ -26042,7 +26538,14 @@ var ptzAutotrackCapability = {
26042
26538
  * fetch / cache / fallback logic out of the four cap methods —
26043
26539
  * they become trampolines over `runtimeState`.
26044
26540
  */
26045
- runtimeState: PtzAutotrackRuntimeStateSchema
26541
+ runtimeState: PtzAutotrackRuntimeStateSchema,
26542
+ /**
26543
+ * Runtime-state durability: **session** — mirrors the camera's own autotrack config, re-read on connect.
26544
+ *
26545
+ * See `RuntimeStateDurability`. Enforced by
26546
+ * `scripts/check-runtime-state-durability.ts`.
26547
+ */
26548
+ durability: "session"
26046
26549
  };
26047
26550
  DeviceType.Camera, DeviceType.Sensor, DeviceType.Switch, method(object({ deviceId: number().int().nonnegative() }), object({ success: literal(true) }), {
26048
26551
  kind: "mutation",
@@ -26711,7 +27214,14 @@ var sceneMonitorCapability = {
26711
27214
  schema: SceneMonitorStatusSchema,
26712
27215
  kind: "push"
26713
27216
  },
26714
- runtimeState: SceneMonitorStatusSchema
27217
+ runtimeState: SceneMonitorStatusSchema,
27218
+ /**
27219
+ * Runtime-state durability: **session** — re-derived from the current scene on the next evaluation.
27220
+ *
27221
+ * See `RuntimeStateDurability`. Enforced by
27222
+ * `scripts/check-runtime-state-durability.ts`.
27223
+ */
27224
+ durability: "session"
26715
27225
  };
26716
27226
  /**
26717
27227
  * Per-stage gating mode applied to the zones a rule references.
@@ -26855,7 +27365,14 @@ var scriptRunnerCapability = {
26855
27365
  * `isRunning` to render a spinner during execution and surfaces
26856
27366
  * `lastError` / `lastRunSuccess` in the recent-runs panel.
26857
27367
  */
26858
- runtimeState: ScriptRunnerStatusSchema
27368
+ runtimeState: ScriptRunnerStatusSchema,
27369
+ /**
27370
+ * Runtime-state durability: **session** — a restored `isRunning: true` describes a process that died with the previous hub.
27371
+ *
27372
+ * See `RuntimeStateDurability`. Enforced by
27373
+ * `scripts/check-runtime-state-durability.ts`.
27374
+ */
27375
+ durability: "session"
26859
27376
  };
26860
27377
  /**
26861
27378
  * Smoke alarm sensor — boolean "is smoke currently detected" with
@@ -26882,7 +27399,17 @@ var smokeCapability = {
26882
27399
  schema: SmokeStatusSchema,
26883
27400
  kind: "push"
26884
27401
  },
26885
- runtimeState: SmokeStatusSchema
27402
+ runtimeState: SmokeStatusSchema,
27403
+ /**
27404
+ * Runtime-state durability: **restored** — a safety sensor must not read "clear" merely because the hub restarted.
27405
+ *
27406
+ * See `RuntimeStateDurability`. Enforced by
27407
+ * `scripts/check-runtime-state-durability.ts`.
27408
+ */
27409
+ durability: "restored",
27410
+ /** Clock fields: written, but excluded from the compare that decides
27411
+ * whether persisting is worth a SQLite commit. */
27412
+ volatileStateFields: ["lastChangedAt"]
26886
27413
  };
26887
27414
  /**
26888
27415
  * One publishable camera stream as its OWNING PROVIDER describes it — the same
@@ -27055,7 +27582,17 @@ var streamParamsCapability = {
27055
27582
  schema: StreamParamsStatusSchema,
27056
27583
  kind: "poll"
27057
27584
  },
27058
- runtimeState: StreamParamsStatusSchema
27585
+ runtimeState: StreamParamsStatusSchema,
27586
+ /**
27587
+ * Runtime-state durability: **restored** — operator-set encoder profile; mutation-driven.
27588
+ *
27589
+ * See `RuntimeStateDurability`. Enforced by
27590
+ * `scripts/check-runtime-state-durability.ts`.
27591
+ */
27592
+ durability: "restored",
27593
+ /** Clock fields: written, but excluded from the compare that decides
27594
+ * whether persisting is worth a SQLite commit. */
27595
+ volatileStateFields: ["lastFetchedAt"]
27059
27596
  };
27060
27597
  /**
27061
27598
  * Generic on/off switch cap for accessory children (siren, floodlight,
@@ -27101,6 +27638,16 @@ var switchCapability = {
27101
27638
  * not need to re-query the provider after a setState mutation.
27102
27639
  */
27103
27640
  runtimeState: SwitchStatusSchema,
27641
+ /**
27642
+ * Runtime-state durability: **restored** — device state an operator reads as authoritative; 55 devices, transition-driven.
27643
+ *
27644
+ * See `RuntimeStateDurability`. Enforced by
27645
+ * `scripts/check-runtime-state-durability.ts`.
27646
+ */
27647
+ durability: "restored",
27648
+ /** Clock fields: written, but excluded from the compare that decides
27649
+ * whether persisting is worth a SQLite commit. */
27650
+ volatileStateFields: ["lastChangedAt"],
27104
27651
  settings: { bindings: [{
27105
27652
  kind: "scalar",
27106
27653
  statusPath: "on",
@@ -27180,7 +27727,17 @@ var tamperCapability = {
27180
27727
  schema: TamperStatusSchema,
27181
27728
  kind: "push"
27182
27729
  },
27183
- runtimeState: TamperStatusSchema
27730
+ runtimeState: TamperStatusSchema,
27731
+ /**
27732
+ * Runtime-state durability: **restored** — as `smoke`.
27733
+ *
27734
+ * See `RuntimeStateDurability`. Enforced by
27735
+ * `scripts/check-runtime-state-durability.ts`.
27736
+ */
27737
+ durability: "restored",
27738
+ /** Clock fields: written, but excluded from the compare that decides
27739
+ * whether persisting is worth a SQLite commit. */
27740
+ volatileStateFields: ["lastChangedAt"]
27184
27741
  };
27185
27742
  /**
27186
27743
  * Single-metric temperature reading. Drives Home Assistant `sensor`
@@ -27225,7 +27782,17 @@ var temperatureSensorCapability = {
27225
27782
  schema: TemperatureSensorStatusSchema,
27226
27783
  kind: "push"
27227
27784
  },
27228
- runtimeState: TemperatureSensorStatusSchema
27785
+ runtimeState: TemperatureSensorStatusSchema,
27786
+ /**
27787
+ * Runtime-state durability: **restored** — as `numeric-sensor` (69 of 125 writes were the clock alone).
27788
+ *
27789
+ * See `RuntimeStateDurability`. Enforced by
27790
+ * `scripts/check-runtime-state-durability.ts`.
27791
+ */
27792
+ durability: "restored",
27793
+ /** Clock fields: written, but excluded from the compare that decides
27794
+ * whether persisting is worth a SQLite commit. */
27795
+ volatileStateFields: ["lastFetchedAt"]
27229
27796
  };
27230
27797
  /**
27231
27798
  * toast — system-scoped singleton capability that streams toast
@@ -27294,7 +27861,14 @@ var updateCapability = {
27294
27861
  schema: UpdateStatusSchema,
27295
27862
  kind: "poll"
27296
27863
  },
27297
- runtimeState: UpdateStatusSchema
27864
+ runtimeState: UpdateStatusSchema,
27865
+ /**
27866
+ * Runtime-state durability: **session** — a restored `inProgress: true` describes an update that is no longer running; versions are re-probed at boot.
27867
+ *
27868
+ * See `RuntimeStateDurability`. Enforced by
27869
+ * `scripts/check-runtime-state-durability.ts`.
27870
+ */
27871
+ durability: "session"
27298
27872
  };
27299
27873
  var UserSummarySchema = object({
27300
27874
  id: string(),
@@ -27628,7 +28202,14 @@ var vacuumControlCapability = {
27628
28202
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
27629
28203
  * slice for live state + battery + fan-speed changes.
27630
28204
  */
27631
- runtimeState: VacuumControlStatusSchema
28205
+ runtimeState: VacuumControlStatusSchema,
28206
+ /**
28207
+ * Runtime-state durability: **session** — as `media-player` — a restored `state: cleaning` is a robot that is not cleaning.
28208
+ *
28209
+ * See `RuntimeStateDurability`. Enforced by
28210
+ * `scripts/check-runtime-state-durability.ts`.
28211
+ */
28212
+ durability: "session"
27632
28213
  };
27633
28214
  var ValveStatusSchema = object({
27634
28215
  /** Lifecycle state of the valve. */
@@ -27680,7 +28261,14 @@ var valveCapability = {
27680
28261
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
27681
28262
  * slice for live position changes during a move.
27682
28263
  */
27683
- runtimeState: ValveStatusSchema
28264
+ runtimeState: ValveStatusSchema,
28265
+ /**
28266
+ * Runtime-state durability: **session** — as `brightness`.
28267
+ *
28268
+ * See `RuntimeStateDurability`. Enforced by
28269
+ * `scripts/check-runtime-state-durability.ts`.
28270
+ */
28271
+ durability: "session"
27684
28272
  };
27685
28273
  /**
27686
28274
  * Vibration / shake / impact sensor. Drives Home Assistant
@@ -27702,7 +28290,17 @@ var vibrationCapability = {
27702
28290
  schema: VibrationStatusSchema,
27703
28291
  kind: "push"
27704
28292
  },
27705
- runtimeState: VibrationStatusSchema
28293
+ runtimeState: VibrationStatusSchema,
28294
+ /**
28295
+ * Runtime-state durability: **restored** — as `smoke`.
28296
+ *
28297
+ * See `RuntimeStateDurability`. Enforced by
28298
+ * `scripts/check-runtime-state-durability.ts`.
28299
+ */
28300
+ durability: "restored",
28301
+ /** Clock fields: written, but excluded from the compare that decides
28302
+ * whether persisting is worth a SQLite commit. */
28303
+ volatileStateFields: ["lastChangedAt"]
27706
28304
  };
27707
28305
  /**
27708
28306
  * Water heater / boiler cap. Models HA `water_heater.*` entities — a
@@ -27776,7 +28374,14 @@ var waterHeaterCapability = {
27776
28374
  * Runtime-state slice — mirrored by the kernel. UI controls watch the
27777
28375
  * slice for live temperature / mode / away changes.
27778
28376
  */
27779
- runtimeState: WaterHeaterStatusSchema
28377
+ runtimeState: WaterHeaterStatusSchema,
28378
+ /**
28379
+ * Runtime-state durability: **session** — as `climate-control`.
28380
+ *
28381
+ * See `RuntimeStateDurability`. Enforced by
28382
+ * `scripts/check-runtime-state-durability.ts`.
28383
+ */
28384
+ durability: "session"
27780
28385
  };
27781
28386
  /**
27782
28387
  * Weather provider cap. Models HA `weather.*` entities — a read-only
@@ -27835,7 +28440,14 @@ var weatherCapability = {
27835
28440
  * Runtime-state slice — mirrored by the kernel. The UI reads the
27836
28441
  * current conditions directly from the slice on each weather push.
27837
28442
  */
27838
- runtimeState: WeatherStatusSchema
28443
+ runtimeState: WeatherStatusSchema,
28444
+ /**
28445
+ * Runtime-state durability: **session** — a forecast is stale the moment the hub is down; the provider re-fetches on connect.
28446
+ *
28447
+ * See `RuntimeStateDurability`. Enforced by
28448
+ * `scripts/check-runtime-state-durability.ts`.
28449
+ */
28450
+ durability: "session"
27839
28451
  };
27840
28452
  /**
27841
28453
  * Per-zone occupancy aggregation produced by the analytics frame
@@ -27997,7 +28609,14 @@ var zoneAnalyticsCapability = {
27997
28609
  * automatically; the explicit `getCurrentSnapshot` cap method is
27998
28610
  * still useful for one-off polls without a subscription.
27999
28611
  */
28000
- runtimeState: CameraOccupancySnapshotSchema
28612
+ runtimeState: CameraOccupancySnapshotSchema,
28613
+ /**
28614
+ * Runtime-state durability: **session** — per-frame analytics; with `audio-metrics` it is ~90 % of the offered write rate. Re-derived on the next frame.
28615
+ *
28616
+ * See `RuntimeStateDurability`. Enforced by
28617
+ * `scripts/check-runtime-state-durability.ts`.
28618
+ */
28619
+ durability: "session"
28001
28620
  };
28002
28621
  /**
28003
28622
  * Stages a {@link ZoneRule} can apply to. Discriminator on the rules
@@ -28075,7 +28694,14 @@ var zoneRulesCapability = {
28075
28694
  motion: array(ZoneRuleSchema).readonly(),
28076
28695
  detection: array(ZoneRuleSchema).readonly(),
28077
28696
  package: array(ZoneRuleSchema).readonly()
28078
- })
28697
+ }),
28698
+ /**
28699
+ * Runtime-state durability: **restored** — operator intent, mutation-only, same argument as `zones`.
28700
+ *
28701
+ * See `RuntimeStateDurability`. Enforced by
28702
+ * `scripts/check-runtime-state-durability.ts`.
28703
+ */
28704
+ durability: "restored"
28079
28705
  };
28080
28706
  /**
28081
28707
  * Most specific first. Extending this list is how a new device kind becomes
@@ -34815,6 +35441,7 @@ Object.freeze({
34815
35441
  "network-access": "ingress",
34816
35442
  "smtp-provider": "email"
34817
35443
  });
35444
+ new Map(AUDIO_MACRO_LABELS.flatMap((macro) => macro.icon === void 0 ? [] : [[macro.id, macro.icon]]));
34818
35445
  new Set(["devices", "classes"]);
34819
35446
  var WEEKDAY_TO_DAY = {
34820
35447
  Sun: 0,
@@ -35430,12 +36057,30 @@ Object.defineProperty(exports, "MACRO_LABELS", {
35430
36057
  return MACRO_LABELS;
35431
36058
  }
35432
36059
  });
36060
+ Object.defineProperty(exports, "NC_ALARM_SYSTEM_EVENT_KINDS", {
36061
+ enumerable: true,
36062
+ get: function() {
36063
+ return NC_ALARM_SYSTEM_EVENT_KINDS;
36064
+ }
36065
+ });
35433
36066
  Object.defineProperty(exports, "NC_CONDITION_CATALOG", {
35434
36067
  enumerable: true,
35435
36068
  get: function() {
35436
36069
  return NC_CONDITION_CATALOG;
35437
36070
  }
35438
36071
  });
36072
+ Object.defineProperty(exports, "NC_DEFAULT_SNOOZE_MINUTES", {
36073
+ enumerable: true,
36074
+ get: function() {
36075
+ return NC_DEFAULT_SNOOZE_MINUTES;
36076
+ }
36077
+ });
36078
+ Object.defineProperty(exports, "NC_SNOOZE_MAX_MINUTES", {
36079
+ enumerable: true,
36080
+ get: function() {
36081
+ return NC_SNOOZE_MAX_MINUTES;
36082
+ }
36083
+ });
35439
36084
  Object.defineProperty(exports, "NC_TAXONOMY", {
35440
36085
  enumerable: true,
35441
36086
  get: function() {