@camstack/addon-osd-manager 0.1.154 → 0.1.156

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 (18) hide show
  1. package/dist/{MotionZonesSettings-DHyaxzBi.mjs → MotionZonesSettings-DaDfau7A.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-D7EH_wl3.mjs → PrivacyMaskSettings-Ci65qYWB.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-CO6VwdkE.mjs → SceneMonitorEditor-BG9mHyrC.mjs} +3 -3
  4. package/dist/_stub.js +2014 -2011
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-Cj3lK2is.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-BDKvyj3r.mjs} +3 -3
  6. package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BTkfkwrM.mjs +26 -0
  7. package/dist/{hostInit-CE3gFb67.mjs → hostInit-DdhUwSkK.mjs} +2 -2
  8. package/dist/index.js +615 -146
  9. package/dist/index.mjs +615 -146
  10. package/dist/{player-overlays-CTsQBdl8.mjs → player-overlays-C_Gmuzev.mjs} +1 -1
  11. package/dist/remoteEntry.js +1 -1
  12. package/dist/{responsive-BPw6Y2I0.mjs → responsive-C-9Ko8kt.mjs} +1 -1
  13. package/dist/{scene-monitor-copy-DNkKk6vF.mjs → scene-monitor-copy-DudW1LZg.mjs} +1 -1
  14. package/dist/{square-BPzhX8Pc.mjs → square-CpweDmax.mjs} +1 -1
  15. package/dist/{trash-2-DemFUbcB.mjs → trash-2-cb_YtxOy.mjs} +1 -1
  16. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-BLAGk27g.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-Dly_n9Qj.mjs} +1 -1
  17. package/package.json +1 -3
  18. package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-1qxETV_o.mjs +0 -26
package/dist/index.js CHANGED
@@ -7523,7 +7523,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
7523
7523
  return DeviceRole;
7524
7524
  }({});
7525
7525
  //#endregion
7526
- //#region ../types/dist/composition-43aqsZQj.mjs
7526
+ //#region ../types/dist/composition-Bzr7GwgP.mjs
7527
7527
  /**
7528
7528
  * The ffmpeg build every CamStack node downloads, per platform and arch.
7529
7529
  *
@@ -7577,20 +7577,20 @@ function portable(target) {
7577
7577
  }
7578
7578
  portable("linux64"), portable("linuxarm64"), portable("macarm64"), portable("mac64");
7579
7579
  /**
7580
- * LA tabella "quale booleano di questo tipo di device conta come ALTO", e il
7581
- * valutatore puro del suo FRONTE.
7580
+ * THE table "which boolean of this device type counts as HIGH", and the
7581
+ * pure evaluator of its EDGE.
7582
7582
  *
7583
- * UNA tabella per tutti quelli che chiedono "questo device è ALTO?": il
7584
- * trigger `RecordingTriggers.sensorDeviceIds` del recorder, i marker dei
7585
- * sensori della post-analysis, il bridge camera-sensors dell'orchestratore e
7586
- * le sorgenti di un campanello composto (`doorbellFeatureSources`, D671).
7587
- * Una seconda copia divergerebbe alla prima cap aggiunta, e il sintomo — "il
7588
- * sensore fa suonare il campanello ma non registra" — è esattamente D62.
7583
+ * ONE table for everyone who asks "is this device HIGH?": the
7584
+ * recorder's `RecordingTriggers.sensorDeviceIds` trigger, the post-analysis
7585
+ * sensor markers, the orchestrator's camera-sensors bridge and
7586
+ * the sources of a composite doorbell (`doorbellFeatureSources`, D671).
7587
+ * A second copy would diverge at the first cap added, and the symptom — "the
7588
+ * sensor rings the doorbell but does not record" — is exactly D62.
7589
7589
  *
7590
- * ⚠ NON è `DEVICE_STATE_READERS` (`catalogs/device-state-vocabulary.ts`), e le
7591
- * due non vanno unificate: quella risponde a "qual è la PAROLA di stato per una
7592
- * regola" (e include `presence`, `cover`, `alarm-panel`), questa a "qual è il
7593
- * booleano il cui FRONTE conta". Vocabolari deliberatamente diversi.
7590
+ * ⚠ NOT `DEVICE_STATE_READERS` (`catalogs/device-state-vocabulary.ts`), and the
7591
+ * two must not be unified: that one answers "what is the state WORD for a
7592
+ * rule" (and includes `presence`, `cover`, `alarm-panel`), this one "which
7593
+ * boolean's EDGE counts". Deliberately different vocabularies.
7594
7594
  */
7595
7595
  /**
7596
7596
  * Known binary / switch source caps → the boolean slice field whose
@@ -7611,6 +7611,8 @@ var SOURCE_CAP_ACTIVE_FIELD = {
7611
7611
  vibration: "detected",
7612
7612
  tamper: "tampered"
7613
7613
  };
7614
+ /** Cap names whose presence in a device's bindings qualify it as a source. */
7615
+ var SOURCE_CAPS = Object.keys(SOURCE_CAP_ACTIVE_FIELD);
7614
7616
  /**
7615
7617
  * Error types for the safe expression engine. Two distinct classes so callers
7616
7618
  * can tell a compile-time (grammar) failure from a runtime (evaluation)
@@ -9197,22 +9199,22 @@ var CLASS_MAP_MACRO_TARGETS = [
9197
9199
  "package"
9198
9200
  ];
9199
9201
  /**
9200
- * Le macro classi di PRIMO LIVELLO: quelle che un object detector emette e che
9201
- * un operatore può selezionare.
9202
+ * The FIRST-LEVEL macro classes: those an object detector emits and that
9203
+ * an operator can select.
9202
9204
  *
9203
- * Sono le tre offerte dallo step `object-detection`
9205
+ * They are the three offered by the `object-detection` step
9204
9206
  * (`addon-pipeline/src/detection-pipeline/registry/step-definitions.ts`,
9205
- * `enabledMacroClasses`). `package` sta in {@link CLASS_MAP_MACRO_TARGETS} e in
9206
- * `MACRO_LABELS` — è una macro vera — ma NON qui: appartiene allo step
9207
- * `package-detection`, la cui abilitazione è guidata dalle zone, e offrire la
9208
- * stessa parola due volte ha già fatto accendere a un operatore il proxy COCO
9207
+ * `enabledMacroClasses`). `package` is in {@link CLASS_MAP_MACRO_TARGETS} and in
9208
+ * `MACRO_LABELS` — it is a true macro — but NOT here: it belongs to the step
9209
+ * `package-detection`, whose enablement is driven by zones, and offering the
9210
+ * same word twice has already made an operator turn on the COCO proxy
9209
9211
  * (suitcase/backpack/handbag) lasciando spento il detector dedicato.
9210
9212
  *
9211
- * UNA lista. Prima di oggi le stesse tre erano scritte a mano nell'offerta
9212
- * dello step e una seconda volta come union `FirstLevelMacro`
9213
- * (`types/detection.ts`); una terza copia per il trigger di registrazione
9214
- * (`RecordingTriggers.objectClasses`) avrebbe reso invisibile la divergenza
9215
- * successiva.
9213
+ * ONE list. Before today the same three were hand-written in the step's offer
9214
+ * and a second time as the union `FirstLevelMacro`
9215
+ * (`types/detection.ts`); a third copy for the recording trigger
9216
+ * (`RecordingTriggers.objectClasses`) would have made the later divergence
9217
+ * invisible.
9216
9218
  */
9217
9219
  var FIRST_LEVEL_MACRO_CLASSES = [
9218
9220
  "person",
@@ -9277,17 +9279,17 @@ var RecordingStorageModeSchema = _enum([
9277
9279
  "on-device-decision"
9278
9280
  ]);
9279
9281
  /**
9280
- * Le macro classi che possono aprire una finestra di registrazione — le stesse
9281
- * tre offerte dallo step `object-detection`, da UNA lista
9282
+ * The macro classes that can open a recording window — the same
9283
+ * three offered by the `object-detection` step, from ONE list
9282
9284
  * ({@link FIRST_LEVEL_MACRO_CLASSES}).
9283
9285
  */
9284
9286
  var RecordingObjectTriggerClassSchema = _enum(FIRST_LEVEL_MACRO_CLASSES);
9285
9287
  /**
9286
- * True quando `values` non ripete un elemento.
9288
+ * True when `values` does not repeat an element.
9287
9289
  *
9288
- * Un duplicato non è innocuo: ogni voce di `objectClasses` / `sensorDeviceIds`
9289
- * diventa una SORGENTE in `bandTriggerSources`, e la stessa sorgente due volte
9290
- * conterebbe due volte le sue finestre in `segmentMissedByMs`.
9290
+ * A duplicate is not harmless: every entry of `objectClasses` / `sensorDeviceIds`
9291
+ * becomes a SOURCE in `bandTriggerSources`, and the same source twice
9292
+ * would count its windows twice in `segmentMissedByMs`.
9291
9293
  */
9292
9294
  var noDuplicates = (values) => new Set(values).size === values.length;
9293
9295
  /** Which detectors trigger an `events`-mode band. */
@@ -9295,34 +9297,34 @@ var RecordingTriggersSchema = object({
9295
9297
  motion: boolean().optional(),
9296
9298
  audioThresholdDbfs: number().optional(),
9297
9299
  /**
9298
- * Le macro classi la cui detection apre una finestra. ASSENTE = la sorgente
9299
- * non è ascoltata; un array VUOTO è rifiutato, perché "banda events, trigger
9300
- * object acceso, nessuna classe" è la stessa forma "abilitata e non registra
9301
- * nulla, per sempre" contro cui è scritto `eventsBandCanEverDemand`.
9300
+ * The macro classes whose detection opens a window. ABSENT = the source
9301
+ * is not listened to; an EMPTY array is rejected, because "events band, object
9302
+ * trigger on, no class" is the same shape "enabled and records
9303
+ * nothing, forever" that `eventsBandCanEverDemand` is written against.
9302
9304
  *
9303
- * Il segnale letto è GIÀ FILTRATO: solo detection `source: 'pipeline'`, cioè
9304
- * quelle che hanno attraversato `enabledMacroClasses`, i
9305
- * `minConfidence<Macro>` e il full-frame guard. L'AI a bordo camera
9306
- * (`source: 'onboard'`) non attraversa nessuno di quei gate e NON apre
9307
- * finestre — vedi `recorder/object-trigger.ts`.
9305
+ * The signal read is ALREADY FILTERED: only `source: 'pipeline'` detections, i.e.
9306
+ * those that went through `enabledMacroClasses`, the
9307
+ * `minConfidence<Macro>` and the full-frame guard. The camera's onboard AI
9308
+ * (`source: 'onboard'`) goes through none of those gates and does NOT open
9309
+ * windows — see `recorder/object-trigger.ts`.
9308
9310
  */
9309
9311
  objectClasses: array(RecordingObjectTriggerClassSchema).min(1).refine(noDuplicates, { message: "objectClasses must not repeat a class" }).optional(),
9310
9312
  /**
9311
- * I device LINKED il cui FRONTE ALTO apre una finestra. Assente = la sorgente
9312
- * non è ascoltata; un array vuoto è rifiutato per la stessa ragione di
9313
+ * The LINKED devices whose RISING EDGE opens a window. Absent = the source
9314
+ * is not listened to; an empty array is rejected for the same reason as
9313
9315
  * `objectClasses`.
9314
9316
  *
9315
- * Sono id di device SORGENTE, non camere: la banda li nomina, quindi il
9316
- * percorso caldo (`DeviceStateChanged`, a ritmo di bus su tutta la flotta)
9317
- * non fa RPC. L'OFFERTA da cui l'operatore li sceglie è un'altra domanda, e
9318
- * si risolve con `deviceManager.getLinkedDevices` + `getBindingsBatch` per
9319
- * device (D12) — mai un elenco globale di cap.
9317
+ * These are SOURCE device ids, not cameras: the band names them, so the
9318
+ * hot path (`DeviceStateChanged`, at bus rate across the whole fleet)
9319
+ * does no RPC. The OFFER from which the operator picks them is another question, and
9320
+ * is resolved with `deviceManager.getLinkedDevices` + `getBindingsBatch` per
9321
+ * device (D12) — never a global list of caps.
9320
9322
  *
9321
- * Cosa vuol dire "alto" dipende dal TIPO di device e non è deciso qui:
9322
- * `SOURCE_CAP_ACTIVE_FIELD` (`catalogs/sensor-active-state.ts`) è LA tabella,
9323
- * la stessa del campanello composto (D671). Ed è il FRONTE, non
9324
- * il livello: un contatto trovato già aperto al riavvio del runner non fa
9325
- * registrare.
9323
+ * What "high" means depends on the device TYPE and is not decided here:
9324
+ * `SOURCE_CAP_ACTIVE_FIELD` (`catalogs/sensor-active-state.ts`) is THE table,
9325
+ * the same one as the composite doorbell (D671). And it is the EDGE, not
9326
+ * the level: a contact found already open at runner restart does not
9327
+ * record.
9326
9328
  */
9327
9329
  sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional()
9328
9330
  });
@@ -10399,7 +10401,7 @@ var DecoderSessionConfigSchema = object({
10399
10401
  * - **VALUE** — at which level, for which scope, until when. That stays ONE
10400
10402
  * thing: the logging settings document on the `system` cap. Two authorities
10401
10403
  * over the values is the exact defect
10402
- * `docs/design/plans/2026-08-26-logging-per-componente.md` was written to
10404
+ * `docs/design/plans/2026-08-26-per-component-logging.md` was written to
10403
10405
  * remove; re-introducing it from the cure side would be grotesque.
10404
10406
  *
10405
10407
  * Nothing in this file reads a clock, an env var or a store. The registry is
@@ -12480,7 +12482,7 @@ var BrokerStatusEnum = _enum([
12480
12482
  "unreachable",
12481
12483
  "error"
12482
12484
  ]);
12483
- var BrokerInfoSchema$1 = object({
12485
+ var BrokerInfoSchema = object({
12484
12486
  /** Stable broker id. Persisted; survives addon restarts. */
12485
12487
  id: string(),
12486
12488
  /** Addon id of the provider that OWNS this broker.
@@ -12623,8 +12625,8 @@ var brokerCapability = {
12623
12625
  kind: "poll"
12624
12626
  },
12625
12627
  methods: {
12626
- list: method(ListInputSchema, array(BrokerInfoSchema$1)),
12627
- get: method(GetInputSchema, BrokerInfoSchema$1.nullable()),
12628
+ list: method(ListInputSchema, array(BrokerInfoSchema)),
12629
+ get: method(GetInputSchema, BrokerInfoSchema.nullable()),
12628
12630
  /** Enumerate which addon provides which broker kind(s) for the
12629
12631
  * unified create picker. The auto-mount fans this array across
12630
12632
  * every registered `broker` provider (array-output method), so the
@@ -15030,7 +15032,7 @@ var dataStoreProviderCapability = {
15030
15032
  *
15031
15033
  * ⚠ An earlier version of this comment blamed Zod stripping, and that
15032
15034
  * was wrong — corrected 2026-08-26 after the hop map
15033
- * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
15035
+ * (`docs/design/2026-08-26-topic-hop-map.md`) traced the path.
15034
15036
  * There is **no Zod parse at all** between the door and the engine: the
15035
15037
  * dispatcher forwards the payload verbatim and UDS carries it whole. A
15036
15038
  * field declared here reaches `SqliteSettingsBackend` either way.
@@ -15992,7 +15994,17 @@ var SiteZoneSchema = object({
15992
15994
  var ProviderStatusSchema = object({
15993
15995
  connected: boolean(),
15994
15996
  deviceCount: number(),
15995
- error: string().optional()
15997
+ error: string().optional(),
15998
+ /**
15999
+ * `'orchestrator'`: this provider writes NO camera's `motion` runtime slice
16000
+ * — the orchestrator is its only writer (D696). Set by `BaseDeviceProvider`,
16001
+ * which every provider bundles, so only a provider BUILT from D696-amended
16002
+ * code says it. ABSENT means an older provider that may still write it (raw
16003
+ * VMD writes, a boot seed), and the orchestrator's provider gate keeps that
16004
+ * provider's cameras unwritten (`camera-sensors/motion-slice-provider-gate.ts`)
16005
+ * — the provider twin of the runner's `getLocalLoad().motionSliceWriter`.
16006
+ */
16007
+ motionSliceWriter: literal("orchestrator").optional()
15996
16008
  });
15997
16009
  object({
15998
16010
  externalId: string(),
@@ -17183,7 +17195,7 @@ var deviceManagerCapability = {
17183
17195
  * sources could be switched off without switching off the rest (D556, then
17184
17196
  * D555's re-key by source). The operator removed the whole idea the same
17185
17197
  * day: *"tutti i providers funzionano sempre, non serve
17186
- * disattivarli/attivarli … loro vivono lì"* (D557 amended, third). A
17198
+ * disattivarli/attivarli … loro vivono lì"* [all the providers always work, there is no need to deactivate/activate them … they live there] (D557 amended, third). A
17187
17199
  * collection cap's providers are a DERIVED set — every addon that provides
17188
17200
  * the cap for this device type, computed on every read and persisted
17189
17201
  * nowhere — so there is nothing here to activate, and a verb that accepted
@@ -18021,7 +18033,7 @@ var embeddingEncoderCapability = {
18021
18033
  * per-device window, `KeyFrameCaptureLog`, `bumpCropMetric`. Every one of them
18022
18034
  * ends in a log line, and a log line is the thing the operator asked to stop
18023
18035
  * needing: *"possiamo armare questi errori intanto? Così al prossimo giro
18024
- * ricontrolliamo tutti questi punti"*. Reading them meant grepping Loki and
18036
+ * ricontrolliamo tutti questi punti"* [can we instrument these errors in the meantime? That way next round we recheck all these points]. Reading them meant grepping Loki and
18025
18037
  * hand-correlating timestamps, which is how a 22% thumbnail gap and a 3-hour
18026
18038
  * media blackout were both diagnosed. The counters stay; this is where they can
18027
18039
  * be READ.
@@ -19669,7 +19681,7 @@ var BrokerStatusSchema$1 = _enum([
19669
19681
  "unreachable",
19670
19682
  "tls-error"
19671
19683
  ]);
19672
- var BrokerInfoSchema = object({
19684
+ var BrokerInfoSchema$1 = object({
19673
19685
  id: string(),
19674
19686
  name: string(),
19675
19687
  url: string(),
@@ -19742,7 +19754,7 @@ var mqttBrokerCapability = {
19742
19754
  kind: "poll"
19743
19755
  },
19744
19756
  methods: {
19745
- listBrokers: method(_void(), array(BrokerInfoSchema)),
19757
+ listBrokers: method(_void(), array(BrokerInfoSchema$1)),
19746
19758
  getBrokerConfig: method(IdInputSchema, BrokerConnectionDetailsSchema, { auth: "admin" }),
19747
19759
  addBroker: method(AddBrokerInputSchema, AddBrokerResultSchema, {
19748
19760
  kind: "mutation",
@@ -21996,78 +22008,16 @@ var NcRuleInputSchema = object({
21996
22008
  */
21997
22009
  confirm: NcConfirmSchema.optional(),
21998
22010
  /**
21999
- * WAIT for face/plate recognition before saying anything.
22000
- *
22001
- * A notification's TEXT is frozen at enqueue and its media is re-resolved at
22002
- * send; the identity is neither. A face is confirmed after `confirmFrames`
22003
- * agreeing observations — p50 **11.4 s** after the track was first seen,
22004
- * measured on this hub — and an `immediate` rule enqueues on the first object
22005
- * event, seconds before that. So "Gianluca è arrivato" is unsayable on the
22006
- * immediate path, and no amount of media re-resolution fixes a sentence.
22007
- *
22008
- * Only two honest answers exist, and this flag picks between them. It has
22009
- * effect ONLY on a rule that declares a recognition scope
22010
- * ({@link NcConditions.identities} or {@link NcConditions.plates}) — on any
22011
- * other rule there is nothing to wait for and the flag is inert.
22012
- *
22013
- * | value | what happens |
22014
- * | --- | --- |
22015
- * | `true` | the rule stops firing on the object event and fires at TRACK CLOSE instead, once, with the name — later, and complete |
22016
- * | absent / `false` | it fires at once WITHOUT the name, and if recognition lands before the track closes a SECOND, "…is Gianluca" notification follows (one per track, per rule, per target) |
22017
- *
22018
- * `.optional()` and deliberately NOT `.default()`: a Zod default does not run
22019
- * on the addon cap path, and absent has to keep meaning exactly what every
22020
- * rule authored before this field meant.
22021
- *
22022
- * The cost of `true` is stated here because the editor states it too: a rule
22023
- * that waits also inherits track-close SEMANTICS — its `zones` condition
22024
- * tests every zone the track visited and a `crossing` condition can no longer
22025
- * be satisfied, because a closed track carries no crossing.
22026
- */
22027
- waitForEnhancement: boolean().optional(),
22028
- /**
22029
- * GROUP a burst of subjects into ONE notification that grows.
22030
- *
22031
- * Seconds of quiet after the last matching subject before the burst is
22032
- * considered over. While it is open, the first subject enqueues immediately —
22033
- * **exactly as today, with no added latency** — and every real growth (a new
22034
- * subject, or a name confirmed on one already in it) REPLACES that
22035
- * notification with an updated one naming everybody. The push carries the
22036
- * group's own coalescing tag, so the phone replaces rather than stacks.
22037
- *
22038
- * `0` / absent = off, and off is today's behaviour byte for byte.
22039
- *
22040
- * ### Why an idle cutoff and not a window
22041
- *
22042
- * The measured seven-person arrival on device 590 spans 110 s with every
22043
- * internal gap under 30 s. A 12 s fixed window cuts it into three groups; an
22044
- * idle cutoff holds it as one and ends it when the arrival actually ends.
22045
- * 30 s is a widely shipped value for the same decision.
22046
- *
22047
- * ### What it replaces
22048
- *
22049
- * The blind cooldown, which collapses a burst by DISCARDING it. Measured on
22050
- * device 615 / *Persona su Uscio* over six days: 116 qualifying tracks → 74
22051
- * notifications, **44 (37.9%) suppressed outright**, 23 of them overlapping a
22052
- * track that did fire and 7 carrying a confirmed identity nobody heard about.
22053
- * A group collapses the same volume by MERGING, so the cooldown becomes a
22054
- * budget over GROUPS — which is what it always meant — and a growth is never
22055
- * throttled by the window its own first member spent.
22056
- *
22057
- * ### Interaction with {@link waitForEnhancement}
22058
- *
22059
- * They compose, and the order matters. `waitForEnhancement` defers the rule to
22060
- * TRACK CLOSE, so with both set the group is opened by the first member to
22061
- * CLOSE — already carrying its name — and grows as later members close. That
22062
- * is later, and complete. With grouping alone the group opens on the first
22063
- * object event and picks up names as they are confirmed, through the growth
22064
- * path. Neither combination fires twice for one subject.
22065
- *
22066
- * `.optional()` and deliberately NOT `.default()`: a Zod default does not run
22067
- * on the addon cap path, so absent must keep meaning what it meant before this
22068
- * field existed.
22011
+ * IMMEDIATE GROUPED (D692): the first matching subject opens a window of this many
22012
+ * seconds; the rule sends ONE message when the window closes — early, once every
22013
+ * subject in it is final, never before {@link NC_GROUPING_MIN_SEC} — naming everybody
22014
+ * the rule matched, with one mosaic tile per subject.
22015
+ * Absent = plain immediate (one message per track, at the first match).
22016
+ * Only an `immediate` DETECTION rule may carry it (`ruleGroupingApplies`, enforced on
22017
+ * save by the hub's grouping guard). `.optional()`, never `.default()`: the addon cap
22018
+ * path does not run Zod defaults.
22069
22019
  */
22070
- groupIdleSec: number().int().min(0).max(600).optional()
22020
+ groupingSec: number().int().min(5).max(60).optional()
22071
22021
  });
22072
22022
  /**
22073
22023
  * Partial patch for `updateRule` — any subset of the input fields, plus the
@@ -22115,9 +22065,10 @@ var NcRuleClearableKeySchema = _enum([
22115
22065
  "targetUsers",
22116
22066
  "snoozeOptions",
22117
22067
  "snoozeAllowGlobal",
22118
- "waitForEnhancement",
22119
22068
  "actions",
22120
22069
  "confirm",
22070
+ "groupingSec",
22071
+ "waitForEnhancement",
22121
22072
  "groupIdleSec"
22122
22073
  ]);
22123
22074
  var NcRuleUpdateInputSchema = object({
@@ -22139,9 +22090,25 @@ var NcRuleSchema = NcRuleInputSchema.extend({
22139
22090
  */
22140
22091
  disabledTargetIds: array(string()).default([])
22141
22092
  });
22093
+ /**
22094
+ * The state-summary SECTIONS (D647 / D698): the D637 kind groups that report a
22095
+ * still-true state. `backups-exports` and `alarm` are not sections — a completed
22096
+ * job is not an open state, and the alarm stays instant.
22097
+ */
22098
+ var NcStateSummarySectionIdSchema = _enum([
22099
+ "device-state",
22100
+ "streams",
22101
+ "battery",
22102
+ "consumables",
22103
+ "tanks",
22104
+ "detection-blind",
22105
+ "nodes",
22106
+ "addons",
22107
+ "updates"
22108
+ ]);
22142
22109
  /** One section of a previewed state summary. `unavailable` = its state could not be read. */
22143
22110
  var NcStateSummaryPreviewSectionSchema = object({
22144
- id: string(),
22111
+ id: NcStateSummarySectionIdSchema,
22145
22112
  status: _enum(["read", "unavailable"]),
22146
22113
  items: number().int().nonnegative(),
22147
22114
  reason: string().optional()
@@ -22151,7 +22118,7 @@ var NcStateSummaryPreviewSectionSchema = object({
22151
22118
  * a `rule` split (no `section`), one section's on a `section` split.
22152
22119
  */
22153
22120
  var NcStateSummaryPreviewRowSchema = object({
22154
- section: string().optional(),
22121
+ section: NcStateSummarySectionIdSchema.optional(),
22155
22122
  /** The section's name on a per-section row; every reported section's, joined, on a combined one. */
22156
22123
  title: string(),
22157
22124
  text: string(),
@@ -22669,7 +22636,7 @@ var NC_CONDITION_CATALOG = [
22669
22636
  operator: "in",
22670
22637
  appliesTo: ["immediate", "track-end"],
22671
22638
  phase: "P1",
22672
- description: "Only recognised people. Selecting NOBODY means every identity in the face gallery; selecting some narrows to those. Matched on the gallery id, so renaming a person does not break the rule. On immediate delivery the name is not known yet when the notification is enqueued — see the rule’s \"wait for recognition\" switch."
22639
+ description: "Only recognised people. Selecting NOBODY means every identity in the face gallery; selecting some narrows to those. Matched on the gallery id, so renaming a person does not break the rule. On Immediate delivery the name must already be known when an event is written — choose Immediate, grouped to wait for it (D692)."
22673
22640
  },
22674
22641
  {
22675
22642
  id: "plates",
@@ -24774,14 +24741,14 @@ var TrackSchema = object({
24774
24741
  * `derive-returned-null tile=standin`,
24775
24742
  * `native-tile tile=native no-key-frame-at-close`, …) written at close and
24776
24743
  * CLEARED by the late-keyFrame upgrade when a native tile lands after all.
24777
- * The operator-facing answer to "perché manca l'immagine?" on a track whose
24744
+ * The operator-facing answer to "perché manca l'immagine?" [why is the image missing?] on a track whose
24778
24745
  * tile is a face/plate stand-in, a raster crop, or an icon.
24779
24746
  *
24780
24747
  * **`no-key-frame-at-close` (D400).** The line used to be written ONLY when
24781
24748
  * the TILE ranked below native, so a track whose thumbnail landed natively
24782
24749
  * while its key frame missed carried no reason at all — three of the four
24783
24750
  * `MISSING_KEYFRAME` tracks in the 2026-09-07 operator audit were exactly
24784
- * that shape, and their "niente ultimo" had no cause anywhere on the row.
24751
+ * that shape, and their "niente ultimo" [no last frame] had no cause anywhere on the row.
24785
24752
  * The key frame is the head of a cascade (`keyFrame ⇒ keyFrameSmall ⇒ the
24786
24753
  * lastFrame copy source`), so its absence is now on this line whatever the
24787
24754
  * tile ended up being.
@@ -24868,7 +24835,7 @@ var MotionEventSchema = object({
24868
24835
  /**
24869
24836
  * Ms offsets from `timestamp` (the episode's own first rising edge, so the
24870
24837
  * first entry is always `0`) of every genuine off→on transition the
24871
- * episode saw — "ogni evento on si deve salvare" (D475). NOT one entry per
24838
+ * episode saw — "ogni evento on si deve salvare" [every ON event must be saved] (D475). NOT one entry per
24872
24839
  * push: a firmware source that keepalives at ~1 Hz for the whole burst
24873
24840
  * (Reolink, Hikvision) produces exactly one edge; a source that reports an
24874
24841
  * explicit `false` mid-episode and then resumes before the quiet window
@@ -25392,6 +25359,7 @@ var KeyEventSchema = object({
25392
25359
  bestEventId: string(),
25393
25360
  /** Track lifetime in ms (lastSeen - firstSeen). */
25394
25361
  windowMs: number().optional(),
25362
+ audioLabels: array(TrackAudioLabelSchema).readonly().optional(),
25395
25363
  ...TrackFlagFields,
25396
25364
  ...TrackRetrainFields
25397
25365
  });
@@ -32076,7 +32044,7 @@ var ClipPlaybackSchema = object({
32076
32044
  * **One authorised yes is one wake.** `next-natural` — take the clip the next
32077
32045
  * time the camera is awake for its own reasons — is deliberately not a member:
32078
32046
  * it was proposed, it is free on the battery, and the operator declined it on
32079
- * 2026-09-20 (*"Quando un export viene richiesto si sveglia la camera."*,
32047
+ * 2026-09-20 (*"Quando un export viene richiesto si sveglia la camera."* [When an export is requested the camera wakes up],
32080
32048
  * D558 "Considered and not taken").
32081
32049
  */
32082
32050
  var ClipWakeSchema = _enum(["authorised"]);
@@ -32321,7 +32289,7 @@ var videoclipsCapability = {
32321
32289
  * **It is a SECTION of the Recording tab, at the end of it — not a tab of
32322
32290
  * its own.** It shipped as a `clips` top-tab and the operator rejected the
32323
32291
  * placement: *"utilizzerei la stessa tab recordings, lì abbiamo già tutto il
32324
- * necessario, una nuova sezione alla fine per le clips"*. The Recording tab
32292
+ * necessario, una nuova sezione alla fine per le clips"* [I would use the same recordings tab, there we already have everything necessary, a new section at the end for the clips]. The Recording tab
32325
32293
  * already holds the recorder's panel, the schedule bands and the unified
32326
32294
  * retention policy; footage the camera itself holds is the same question,
32327
32295
  * asked of a different store. `order: 100` puts it after all of them with
@@ -32382,7 +32350,7 @@ var videoclipsCapability = {
32382
32350
  * It replaced `sources?: string[]`, a VIEW filter over source ids that
32383
32351
  * assumed the answer was a fan-out over everything a camera has. The
32384
32352
  * operator settled otherwise on 2026-09-20 — *"l'utilizzatore è uno
32385
- * solo"* — so the list is asked of one provider at a time and there is
32353
+ * solo"* [there is only one user] — so the list is asked of one provider at a time and there is
32386
32354
  * nothing to filter out of it.
32387
32355
  */
32388
32356
  provider: string().min(1)
@@ -41523,7 +41491,7 @@ var ReadGopBytesResultSchema = object({
41523
41491
  /**
41524
41492
  * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
41525
41493
  * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
41526
- * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
41494
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-clip-replay-on-pipeline.md`):
41527
41495
  * a replay needs several seconds of native pixels, not one frame.
41528
41496
  *
41529
41497
  * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
@@ -44131,7 +44099,7 @@ var systemCapability = {
44131
44099
  *
44132
44100
  * This is the surface the operator asked for on 2026-08-28 (*"possiamo
44133
44101
  * armare questi errori intanto? Così al prossimo giro ricontrolliamo tutti
44134
- * questi punti"*). Before it, four live failure modes could only be counted
44102
+ * questi punti"* [can we instrument these errors in the meantime? That way next round we recheck all these points]). Before it, four live failure modes could only be counted
44135
44103
  * by grepping Loki and hand-correlating timestamps, which is exactly how a
44136
44104
  * 22% thumbnail gap and a 3-hour media blackout were diagnosed — twice.
44137
44105
  *
@@ -45292,6 +45260,7 @@ var zoneRulesCapability = {
45292
45260
  */
45293
45261
  durability: "restored"
45294
45262
  };
45263
+ SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
45295
45264
  /**
45296
45265
  * Most specific first. Extending this list is how a new device kind becomes
45297
45266
  * gateable; nothing else needs to change.
@@ -54081,6 +54050,11 @@ Object.freeze({
54081
54050
  }
54082
54051
  });
54083
54052
  Object.freeze({
54053
+ "accessories.getStatus": [{
54054
+ name: "deviceId",
54055
+ form: "single",
54056
+ optional: false
54057
+ }],
54084
54058
  "accessories.setChildHidden": [{
54085
54059
  name: "childDeviceId",
54086
54060
  form: "single",
@@ -54100,6 +54074,11 @@ Object.freeze({
54100
54074
  form: "single",
54101
54075
  optional: false
54102
54076
  }],
54077
+ "airQualitySensor.getStatus": [{
54078
+ name: "deviceId",
54079
+ form: "single",
54080
+ optional: false
54081
+ }],
54103
54082
  "alarmPanel.arm": [{
54104
54083
  name: "deviceId",
54105
54084
  form: "single",
@@ -54110,11 +54089,36 @@ Object.freeze({
54110
54089
  form: "single",
54111
54090
  optional: false
54112
54091
  }],
54092
+ "alarmPanel.getStatus": [{
54093
+ name: "deviceId",
54094
+ form: "single",
54095
+ optional: false
54096
+ }],
54113
54097
  "alarmPanel.trigger": [{
54114
54098
  name: "deviceId",
54115
54099
  form: "single",
54116
54100
  optional: false
54117
54101
  }],
54102
+ "ambientLightSensor.getStatus": [{
54103
+ name: "deviceId",
54104
+ form: "single",
54105
+ optional: false
54106
+ }],
54107
+ "audioAnalysis.applyDeviceSettingsPatch": [{
54108
+ name: "deviceId",
54109
+ form: "single",
54110
+ optional: false
54111
+ }],
54112
+ "audioAnalysis.getDeviceLiveContribution": [{
54113
+ name: "deviceId",
54114
+ form: "single",
54115
+ optional: false
54116
+ }],
54117
+ "audioAnalysis.getDeviceSettingsContribution": [{
54118
+ name: "deviceId",
54119
+ form: "single",
54120
+ optional: false
54121
+ }],
54118
54122
  "audioAnalysis.resolveDeviceSettings": [{
54119
54123
  name: "deviceId",
54120
54124
  form: "single",
@@ -54155,16 +54159,36 @@ Object.freeze({
54155
54159
  form: "single",
54156
54160
  optional: false
54157
54161
  }],
54162
+ "automationControl.getStatus": [{
54163
+ name: "deviceId",
54164
+ form: "single",
54165
+ optional: false
54166
+ }],
54158
54167
  "automationControl.trigger": [{
54159
54168
  name: "deviceId",
54160
54169
  form: "single",
54161
54170
  optional: false
54162
54171
  }],
54172
+ "battery.getStatus": [{
54173
+ name: "deviceId",
54174
+ form: "single",
54175
+ optional: false
54176
+ }],
54163
54177
  "battery.wakeForStream": [{
54164
54178
  name: "deviceId",
54165
54179
  form: "single",
54166
54180
  optional: false
54167
54181
  }],
54182
+ "binary.getStatus": [{
54183
+ name: "deviceId",
54184
+ form: "single",
54185
+ optional: false
54186
+ }],
54187
+ "brightness.getStatus": [{
54188
+ name: "deviceId",
54189
+ form: "single",
54190
+ optional: false
54191
+ }],
54168
54192
  "brightness.setBrightness": [{
54169
54193
  name: "deviceId",
54170
54194
  form: "single",
@@ -54180,6 +54204,26 @@ Object.freeze({
54180
54204
  form: "single",
54181
54205
  optional: false
54182
54206
  }],
54207
+ "cameraCredentials.getStatus": [{
54208
+ name: "deviceId",
54209
+ form: "single",
54210
+ optional: false
54211
+ }],
54212
+ "cameraGridLayout.applyDeviceSettingsPatch": [{
54213
+ name: "deviceId",
54214
+ form: "single",
54215
+ optional: false
54216
+ }],
54217
+ "cameraGridLayout.getDeviceLiveContribution": [{
54218
+ name: "deviceId",
54219
+ form: "single",
54220
+ optional: false
54221
+ }],
54222
+ "cameraGridLayout.getDeviceSettingsContribution": [{
54223
+ name: "deviceId",
54224
+ form: "single",
54225
+ optional: false
54226
+ }],
54183
54227
  "cameraGridLayout.getLayout": [{
54184
54228
  name: "deviceId",
54185
54229
  form: "single",
@@ -54195,6 +54239,21 @@ Object.freeze({
54195
54239
  form: "single",
54196
54240
  optional: false
54197
54241
  }],
54242
+ "cameraPipelineConfig.applyDeviceSettingsPatch": [{
54243
+ name: "deviceId",
54244
+ form: "single",
54245
+ optional: false
54246
+ }],
54247
+ "cameraPipelineConfig.getDeviceLiveContribution": [{
54248
+ name: "deviceId",
54249
+ form: "single",
54250
+ optional: false
54251
+ }],
54252
+ "cameraPipelineConfig.getDeviceSettingsContribution": [{
54253
+ name: "deviceId",
54254
+ form: "single",
54255
+ optional: false
54256
+ }],
54198
54257
  "cameraStreams.getBrokerStreams": [{
54199
54258
  name: "deviceId",
54200
54259
  form: "single",
@@ -54220,6 +54279,16 @@ Object.freeze({
54220
54279
  form: "single",
54221
54280
  optional: false
54222
54281
  }],
54282
+ "carbonMonoxide.getStatus": [{
54283
+ name: "deviceId",
54284
+ form: "single",
54285
+ optional: false
54286
+ }],
54287
+ "climateControl.getStatus": [{
54288
+ name: "deviceId",
54289
+ form: "single",
54290
+ optional: false
54291
+ }],
54223
54292
  "climateControl.setFanMode": [{
54224
54293
  name: "deviceId",
54225
54294
  form: "single",
@@ -54260,16 +54329,41 @@ Object.freeze({
54260
54329
  form: "single",
54261
54330
  optional: false
54262
54331
  }],
54332
+ "color.getStatus": [{
54333
+ name: "deviceId",
54334
+ form: "single",
54335
+ optional: false
54336
+ }],
54263
54337
  "color.setColor": [{
54264
54338
  name: "deviceId",
54265
54339
  form: "single",
54266
54340
  optional: false
54267
54341
  }],
54342
+ "connectivity.getStatus": [{
54343
+ name: "deviceId",
54344
+ form: "single",
54345
+ optional: false
54346
+ }],
54347
+ "consumables.getStatus": [{
54348
+ name: "deviceId",
54349
+ form: "single",
54350
+ optional: false
54351
+ }],
54268
54352
  "consumables.reset": [{
54269
54353
  name: "deviceId",
54270
54354
  form: "single",
54271
54355
  optional: false
54272
54356
  }],
54357
+ "contact.getStatus": [{
54358
+ name: "deviceId",
54359
+ form: "single",
54360
+ optional: false
54361
+ }],
54362
+ "control.getStatus": [{
54363
+ name: "deviceId",
54364
+ form: "single",
54365
+ optional: false
54366
+ }],
54273
54367
  "control.setValue": [{
54274
54368
  name: "deviceId",
54275
54369
  form: "single",
@@ -54280,6 +54374,11 @@ Object.freeze({
54280
54374
  form: "single",
54281
54375
  optional: false
54282
54376
  }],
54377
+ "cover.getStatus": [{
54378
+ name: "deviceId",
54379
+ form: "single",
54380
+ optional: false
54381
+ }],
54283
54382
  "cover.open": [{
54284
54383
  name: "deviceId",
54285
54384
  form: "single",
@@ -54305,6 +54404,11 @@ Object.freeze({
54305
54404
  form: "single",
54306
54405
  optional: false
54307
54406
  }],
54407
+ "dayNight.getStatus": [{
54408
+ name: "deviceId",
54409
+ form: "single",
54410
+ optional: false
54411
+ }],
54308
54412
  "dayNight.setSettings": [{
54309
54413
  name: "deviceId",
54310
54414
  form: "single",
@@ -54315,11 +54419,31 @@ Object.freeze({
54315
54419
  form: "single",
54316
54420
  optional: true
54317
54421
  }],
54422
+ "detectionPipeline.applyDeviceSettingsPatch": [{
54423
+ name: "deviceId",
54424
+ form: "single",
54425
+ optional: false
54426
+ }],
54427
+ "detectionPipeline.getDeviceLiveContribution": [{
54428
+ name: "deviceId",
54429
+ form: "single",
54430
+ optional: false
54431
+ }],
54432
+ "detectionPipeline.getDeviceSettingsContribution": [{
54433
+ name: "deviceId",
54434
+ form: "single",
54435
+ optional: false
54436
+ }],
54318
54437
  "deviceAdminLink.getAdminLink": [{
54319
54438
  name: "deviceId",
54320
54439
  form: "single",
54321
54440
  optional: false
54322
54441
  }],
54442
+ "deviceAdoption.getStatus": [{
54443
+ name: "deviceId",
54444
+ form: "single",
54445
+ optional: false
54446
+ }],
54323
54447
  "deviceAdoption.release": [{
54324
54448
  name: "camDeviceId",
54325
54449
  form: "single",
@@ -54335,6 +54459,11 @@ Object.freeze({
54335
54459
  form: "single",
54336
54460
  optional: false
54337
54461
  }],
54462
+ "deviceDiscovery.getStatus": [{
54463
+ name: "deviceId",
54464
+ form: "single",
54465
+ optional: false
54466
+ }],
54338
54467
  "deviceDiscovery.listDiscovered": [{
54339
54468
  name: "deviceId",
54340
54469
  form: "single",
@@ -54354,6 +54483,21 @@ Object.freeze({
54354
54483
  form: "single",
54355
54484
  optional: false
54356
54485
  }],
54486
+ "deviceExport.applyDeviceSettingsPatch": [{
54487
+ name: "deviceId",
54488
+ form: "single",
54489
+ optional: false
54490
+ }],
54491
+ "deviceExport.getDeviceLiveContribution": [{
54492
+ name: "deviceId",
54493
+ form: "single",
54494
+ optional: false
54495
+ }],
54496
+ "deviceExport.getDeviceSettingsContribution": [{
54497
+ name: "deviceId",
54498
+ form: "single",
54499
+ optional: false
54500
+ }],
54357
54501
  "deviceExtension.listCandidates": [{
54358
54502
  name: "deviceId",
54359
54503
  form: "single",
@@ -54702,6 +54846,26 @@ Object.freeze({
54702
54846
  form: "single",
54703
54847
  optional: false
54704
54848
  }],
54849
+ "deviceStatus.getStatus": [{
54850
+ name: "deviceId",
54851
+ form: "single",
54852
+ optional: false
54853
+ }],
54854
+ "doorbell.getStatus": [{
54855
+ name: "deviceId",
54856
+ form: "single",
54857
+ optional: false
54858
+ }],
54859
+ "enumSensor.getStatus": [{
54860
+ name: "deviceId",
54861
+ form: "single",
54862
+ optional: false
54863
+ }],
54864
+ "eventEmitter.getStatus": [{
54865
+ name: "deviceId",
54866
+ form: "single",
54867
+ optional: false
54868
+ }],
54705
54869
  "faceGallery.getFaceByTrack": [{
54706
54870
  name: "deviceId",
54707
54871
  form: "single",
@@ -54716,6 +54880,11 @@ Object.freeze({
54716
54880
  form: "array",
54717
54881
  optional: true
54718
54882
  }],
54883
+ "fanControl.getStatus": [{
54884
+ name: "deviceId",
54885
+ form: "single",
54886
+ optional: false
54887
+ }],
54719
54888
  "fanControl.setDirection": [{
54720
54889
  name: "deviceId",
54721
54890
  form: "single",
@@ -54736,6 +54905,26 @@ Object.freeze({
54736
54905
  form: "single",
54737
54906
  optional: false
54738
54907
  }],
54908
+ "featureProbe.getStatus": [{
54909
+ name: "deviceId",
54910
+ form: "single",
54911
+ optional: false
54912
+ }],
54913
+ "flood.getStatus": [{
54914
+ name: "deviceId",
54915
+ form: "single",
54916
+ optional: false
54917
+ }],
54918
+ "gas.getStatus": [{
54919
+ name: "deviceId",
54920
+ form: "single",
54921
+ optional: false
54922
+ }],
54923
+ "humidifier.getStatus": [{
54924
+ name: "deviceId",
54925
+ form: "single",
54926
+ optional: false
54927
+ }],
54739
54928
  "humidifier.setMode": [{
54740
54929
  name: "deviceId",
54741
54930
  form: "single",
@@ -54751,11 +54940,26 @@ Object.freeze({
54751
54940
  form: "single",
54752
54941
  optional: false
54753
54942
  }],
54943
+ "humiditySensor.getStatus": [{
54944
+ name: "deviceId",
54945
+ form: "single",
54946
+ optional: false
54947
+ }],
54948
+ "image.getStatus": [{
54949
+ name: "deviceId",
54950
+ form: "single",
54951
+ optional: false
54952
+ }],
54754
54953
  "imageSettings.getOptions": [{
54755
54954
  name: "deviceId",
54756
54955
  form: "single",
54757
54956
  optional: false
54758
54957
  }],
54958
+ "imageSettings.getStatus": [{
54959
+ name: "deviceId",
54960
+ form: "single",
54961
+ optional: false
54962
+ }],
54759
54963
  "imageSettings.setSettings": [{
54760
54964
  name: "deviceId",
54761
54965
  form: "single",
@@ -54766,6 +54970,11 @@ Object.freeze({
54766
54970
  form: "single",
54767
54971
  optional: false
54768
54972
  }],
54973
+ "intercom.getStatus": [{
54974
+ name: "deviceId",
54975
+ form: "single",
54976
+ optional: false
54977
+ }],
54769
54978
  "intercom.handleAnswer": [{
54770
54979
  name: "deviceId",
54771
54980
  form: "single",
@@ -54796,6 +55005,11 @@ Object.freeze({
54796
55005
  form: "single",
54797
55006
  optional: false
54798
55007
  }],
55008
+ "lawnMowerControl.getStatus": [{
55009
+ name: "deviceId",
55010
+ form: "single",
55011
+ optional: false
55012
+ }],
54799
55013
  "lawnMowerControl.pause": [{
54800
55014
  name: "deviceId",
54801
55015
  form: "single",
@@ -54806,6 +55020,11 @@ Object.freeze({
54806
55020
  form: "single",
54807
55021
  optional: false
54808
55022
  }],
55023
+ "lockControl.getStatus": [{
55024
+ name: "deviceId",
55025
+ form: "single",
55026
+ optional: false
55027
+ }],
54809
55028
  "lockControl.lock": [{
54810
55029
  name: "deviceId",
54811
55030
  form: "single",
@@ -54821,6 +55040,11 @@ Object.freeze({
54821
55040
  form: "single",
54822
55041
  optional: false
54823
55042
  }],
55043
+ "mediaPlayer.getStatus": [{
55044
+ name: "deviceId",
55045
+ form: "single",
55046
+ optional: false
55047
+ }],
54824
55048
  "mediaPlayer.next": [{
54825
55049
  name: "deviceId",
54826
55050
  form: "single",
@@ -54881,6 +55105,11 @@ Object.freeze({
54881
55105
  form: "single",
54882
55106
  optional: false
54883
55107
  }],
55108
+ "motion.getStatus": [{
55109
+ name: "deviceId",
55110
+ form: "single",
55111
+ optional: false
55112
+ }],
54884
55113
  "motion.isDetected": [{
54885
55114
  name: "deviceId",
54886
55115
  form: "single",
@@ -54891,11 +55120,31 @@ Object.freeze({
54891
55120
  form: "single",
54892
55121
  optional: false
54893
55122
  }],
55123
+ "motionDetection.applyDeviceSettingsPatch": [{
55124
+ name: "deviceId",
55125
+ form: "single",
55126
+ optional: false
55127
+ }],
55128
+ "motionDetection.getDeviceLiveContribution": [{
55129
+ name: "deviceId",
55130
+ form: "single",
55131
+ optional: false
55132
+ }],
55133
+ "motionDetection.getDeviceSettingsContribution": [{
55134
+ name: "deviceId",
55135
+ form: "single",
55136
+ optional: false
55137
+ }],
54894
55138
  "motionDetection.removeCamera": [{
54895
55139
  name: "deviceId",
54896
55140
  form: "single",
54897
55141
  optional: false
54898
55142
  }],
55143
+ "motionTrigger.getStatus": [{
55144
+ name: "deviceId",
55145
+ form: "single",
55146
+ optional: false
55147
+ }],
54899
55148
  "motionTrigger.setMotionTrigger": [{
54900
55149
  name: "deviceId",
54901
55150
  form: "single",
@@ -54906,6 +55155,11 @@ Object.freeze({
54906
55155
  form: "single",
54907
55156
  optional: false
54908
55157
  }],
55158
+ "motionZones.getStatus": [{
55159
+ name: "deviceId",
55160
+ form: "single",
55161
+ optional: false
55162
+ }],
54909
55163
  "motionZones.setZone": [{
54910
55164
  name: "deviceId",
54911
55165
  form: "single",
@@ -54916,6 +55170,11 @@ Object.freeze({
54916
55170
  form: "single",
54917
55171
  optional: false
54918
55172
  }],
55173
+ "nativeObjectDetection.getStatus": [{
55174
+ name: "deviceId",
55175
+ form: "single",
55176
+ optional: false
55177
+ }],
54919
55178
  "nativeObjectDetection.setEnabled": [{
54920
55179
  name: "deviceId",
54921
55180
  form: "single",
@@ -54931,6 +55190,11 @@ Object.freeze({
54931
55190
  form: "single",
54932
55191
  optional: false
54933
55192
  }],
55193
+ "navigation.getStatus": [{
55194
+ name: "deviceId",
55195
+ form: "single",
55196
+ optional: false
55197
+ }],
54934
55198
  "navigation.goToPoint": [{
54935
55199
  name: "deviceId",
54936
55200
  form: "single",
@@ -54976,6 +55240,11 @@ Object.freeze({
54976
55240
  form: "single",
54977
55241
  optional: false
54978
55242
  }],
55243
+ "networkLink.getStatus": [{
55244
+ name: "deviceId",
55245
+ form: "single",
55246
+ optional: false
55247
+ }],
54979
55248
  "networkQuality.getDeviceStats": [{
54980
55249
  name: "deviceId",
54981
55250
  form: "single",
@@ -55001,11 +55270,26 @@ Object.freeze({
55001
55270
  form: "single",
55002
55271
  optional: false
55003
55272
  }],
55273
+ "notifier.getStatus": [{
55274
+ name: "deviceId",
55275
+ form: "single",
55276
+ optional: false
55277
+ }],
55004
55278
  "notifier.send": [{
55005
55279
  name: "deviceId",
55006
55280
  form: "single",
55007
55281
  optional: false
55008
55282
  }],
55283
+ "numericSensor.getStatus": [{
55284
+ name: "deviceId",
55285
+ form: "single",
55286
+ optional: false
55287
+ }],
55288
+ "osd.getStatus": [{
55289
+ name: "deviceId",
55290
+ form: "single",
55291
+ optional: false
55292
+ }],
55009
55293
  "osd.setOverlay": [{
55010
55294
  name: "deviceId",
55011
55295
  form: "single",
@@ -55065,6 +55349,11 @@ Object.freeze({
55065
55349
  form: "single",
55066
55350
  optional: false
55067
55351
  }],
55352
+ "petFeeder.getStatus": [{
55353
+ name: "deviceId",
55354
+ form: "single",
55355
+ optional: false
55356
+ }],
55068
55357
  "petFeeder.markFoodReplenished": [{
55069
55358
  name: "deviceId",
55070
55359
  form: "single",
@@ -55100,6 +55389,11 @@ Object.freeze({
55100
55389
  form: "single",
55101
55390
  optional: false
55102
55391
  }],
55392
+ "pipelineAnalytics.applyDeviceSettingsPatch": [{
55393
+ name: "deviceId",
55394
+ form: "single",
55395
+ optional: false
55396
+ }],
55103
55397
  "pipelineAnalytics.clearTrackRelation": [{
55104
55398
  name: "deviceId",
55105
55399
  form: "single",
@@ -55140,6 +55434,16 @@ Object.freeze({
55140
55434
  form: "single",
55141
55435
  optional: false
55142
55436
  }],
55437
+ "pipelineAnalytics.getDeviceLiveContribution": [{
55438
+ name: "deviceId",
55439
+ form: "single",
55440
+ optional: false
55441
+ }],
55442
+ "pipelineAnalytics.getDeviceSettingsContribution": [{
55443
+ name: "deviceId",
55444
+ form: "single",
55445
+ optional: false
55446
+ }],
55143
55447
  "pipelineAnalytics.getEventDensity": [{
55144
55448
  name: "deviceId",
55145
55449
  form: "single",
@@ -55355,6 +55659,11 @@ Object.freeze({
55355
55659
  form: "single",
55356
55660
  optional: true
55357
55661
  }],
55662
+ "pipelineOrchestrator.applyDeviceSettingsPatch": [{
55663
+ name: "deviceId",
55664
+ form: "single",
55665
+ optional: false
55666
+ }],
55358
55667
  "pipelineOrchestrator.assignAudio": [{
55359
55668
  name: "deviceId",
55360
55669
  form: "single",
@@ -55400,6 +55709,16 @@ Object.freeze({
55400
55709
  form: "single",
55401
55710
  optional: false
55402
55711
  }],
55712
+ "pipelineOrchestrator.getDeviceLiveContribution": [{
55713
+ name: "deviceId",
55714
+ form: "single",
55715
+ optional: false
55716
+ }],
55717
+ "pipelineOrchestrator.getDeviceSettingsContribution": [{
55718
+ name: "deviceId",
55719
+ form: "single",
55720
+ optional: false
55721
+ }],
55403
55722
  "pipelineOrchestrator.getPipelineAssignment": [{
55404
55723
  name: "deviceId",
55405
55724
  form: "single",
@@ -55520,11 +55839,31 @@ Object.freeze({
55520
55839
  form: "single",
55521
55840
  optional: true
55522
55841
  }],
55842
+ "powerMeter.getStatus": [{
55843
+ name: "deviceId",
55844
+ form: "single",
55845
+ optional: false
55846
+ }],
55847
+ "presence.getStatus": [{
55848
+ name: "deviceId",
55849
+ form: "single",
55850
+ optional: false
55851
+ }],
55852
+ "pressureSensor.getStatus": [{
55853
+ name: "deviceId",
55854
+ form: "single",
55855
+ optional: false
55856
+ }],
55523
55857
  "privacyMask.getOptions": [{
55524
55858
  name: "deviceId",
55525
55859
  form: "single",
55526
55860
  optional: false
55527
55861
  }],
55862
+ "privacyMask.getStatus": [{
55863
+ name: "deviceId",
55864
+ form: "single",
55865
+ optional: false
55866
+ }],
55528
55867
  "privacyMask.setAudioEnabled": [{
55529
55868
  name: "deviceId",
55530
55869
  form: "single",
@@ -55575,6 +55914,11 @@ Object.freeze({
55575
55914
  form: "single",
55576
55915
  optional: false
55577
55916
  }],
55917
+ "ptz.getStatus": [{
55918
+ name: "deviceId",
55919
+ form: "single",
55920
+ optional: false
55921
+ }],
55578
55922
  "ptz.goHome": [{
55579
55923
  name: "deviceId",
55580
55924
  form: "single",
@@ -55665,6 +56009,11 @@ Object.freeze({
55665
56009
  form: "single",
55666
56010
  optional: false
55667
56011
  }],
56012
+ "recordingArchive.applyDeviceSettingsPatch": [{
56013
+ name: "deviceId",
56014
+ form: "single",
56015
+ optional: false
56016
+ }],
55668
56017
  "recordingArchive.deleteFootprint": [{
55669
56018
  name: "deviceId",
55670
56019
  form: "single",
@@ -55685,6 +56034,21 @@ Object.freeze({
55685
56034
  form: "single",
55686
56035
  optional: false
55687
56036
  }],
56037
+ "recordingArchive.getDeviceLiveContribution": [{
56038
+ name: "deviceId",
56039
+ form: "single",
56040
+ optional: false
56041
+ }],
56042
+ "recordingArchive.getDeviceSettingsContribution": [{
56043
+ name: "deviceId",
56044
+ form: "single",
56045
+ optional: false
56046
+ }],
56047
+ "recordingArchive.getStatus": [{
56048
+ name: "deviceId",
56049
+ form: "single",
56050
+ optional: false
56051
+ }],
55688
56052
  "recordingArchive.listOpsLog": [{
55689
56053
  name: "deviceId",
55690
56054
  form: "single",
@@ -55770,6 +56134,11 @@ Object.freeze({
55770
56134
  form: "single",
55771
56135
  optional: false
55772
56136
  }],
56137
+ "recordingOnboard.getStatus": [{
56138
+ name: "deviceId",
56139
+ form: "single",
56140
+ optional: false
56141
+ }],
55773
56142
  "recordingOnboard.setSettings": [{
55774
56143
  name: "deviceId",
55775
56144
  form: "single",
@@ -55800,6 +56169,11 @@ Object.freeze({
55800
56169
  form: "single",
55801
56170
  optional: false
55802
56171
  }],
56172
+ "sceneMonitor.getStatus": [{
56173
+ name: "deviceId",
56174
+ form: "single",
56175
+ optional: false
56176
+ }],
55803
56177
  "sceneMonitor.listScenes": [{
55804
56178
  name: "deviceId",
55805
56179
  form: "single",
@@ -55825,6 +56199,11 @@ Object.freeze({
55825
56199
  form: "single",
55826
56200
  optional: false
55827
56201
  }],
56202
+ "scriptRunner.getStatus": [{
56203
+ name: "deviceId",
56204
+ form: "single",
56205
+ optional: false
56206
+ }],
55828
56207
  "scriptRunner.run": [{
55829
56208
  name: "deviceId",
55830
56209
  form: "single",
@@ -55835,11 +56214,31 @@ Object.freeze({
55835
56214
  form: "single",
55836
56215
  optional: false
55837
56216
  }],
56217
+ "smoke.getStatus": [{
56218
+ name: "deviceId",
56219
+ form: "single",
56220
+ optional: false
56221
+ }],
56222
+ "snapshot.applyDeviceSettingsPatch": [{
56223
+ name: "deviceId",
56224
+ form: "single",
56225
+ optional: false
56226
+ }],
55838
56227
  "snapshot.getDebugState": [{
55839
56228
  name: "deviceId",
55840
56229
  form: "single",
55841
56230
  optional: false
55842
56231
  }],
56232
+ "snapshot.getDeviceLiveContribution": [{
56233
+ name: "deviceId",
56234
+ form: "single",
56235
+ optional: false
56236
+ }],
56237
+ "snapshot.getDeviceSettingsContribution": [{
56238
+ name: "deviceId",
56239
+ form: "single",
56240
+ optional: false
56241
+ }],
55843
56242
  "snapshot.getSnapshot": [{
55844
56243
  name: "deviceId",
55845
56244
  form: "single",
@@ -55856,6 +56255,11 @@ Object.freeze({
55856
56255
  form: "array",
55857
56256
  optional: false
55858
56257
  }],
56258
+ "snapshot.getStatus": [{
56259
+ name: "deviceId",
56260
+ form: "single",
56261
+ optional: false
56262
+ }],
55859
56263
  "snapshot.invalidateCache": [{
55860
56264
  name: "deviceId",
55861
56265
  form: "single",
@@ -55866,6 +56270,11 @@ Object.freeze({
55866
56270
  form: "single",
55867
56271
  optional: false
55868
56272
  }],
56273
+ "streamBroker.applyDeviceSettingsPatch": [{
56274
+ name: "deviceId",
56275
+ form: "single",
56276
+ optional: false
56277
+ }],
55869
56278
  "streamBroker.assignProfile": [{
55870
56279
  name: "deviceId",
55871
56280
  form: "single",
@@ -55881,6 +56290,16 @@ Object.freeze({
55881
56290
  form: "single",
55882
56291
  optional: false
55883
56292
  }],
56293
+ "streamBroker.getDeviceLiveContribution": [{
56294
+ name: "deviceId",
56295
+ form: "single",
56296
+ optional: false
56297
+ }],
56298
+ "streamBroker.getDeviceSettingsContribution": [{
56299
+ name: "deviceId",
56300
+ form: "single",
56301
+ optional: false
56302
+ }],
55884
56303
  "streamBroker.getStreamWithCodec": [{
55885
56304
  name: "deviceId",
55886
56305
  form: "single",
@@ -55941,16 +56360,46 @@ Object.freeze({
55941
56360
  form: "single",
55942
56361
  optional: false
55943
56362
  }],
56363
+ "streamParams.getStatus": [{
56364
+ name: "deviceId",
56365
+ form: "single",
56366
+ optional: false
56367
+ }],
55944
56368
  "streamParams.setProfile": [{
55945
56369
  name: "deviceId",
55946
56370
  form: "single",
55947
56371
  optional: false
55948
56372
  }],
56373
+ "switch.getStatus": [{
56374
+ name: "deviceId",
56375
+ form: "single",
56376
+ optional: false
56377
+ }],
55949
56378
  "switch.setState": [{
55950
56379
  name: "deviceId",
55951
56380
  form: "single",
55952
56381
  optional: false
55953
56382
  }],
56383
+ "tamper.getStatus": [{
56384
+ name: "deviceId",
56385
+ form: "single",
56386
+ optional: false
56387
+ }],
56388
+ "temperatureSensor.getStatus": [{
56389
+ name: "deviceId",
56390
+ form: "single",
56391
+ optional: false
56392
+ }],
56393
+ "update.getStatus": [{
56394
+ name: "deviceId",
56395
+ form: "single",
56396
+ optional: false
56397
+ }],
56398
+ "vacuumControl.getStatus": [{
56399
+ name: "deviceId",
56400
+ form: "single",
56401
+ optional: false
56402
+ }],
55954
56403
  "vacuumControl.locate": [{
55955
56404
  name: "deviceId",
55956
56405
  form: "single",
@@ -55986,6 +56435,11 @@ Object.freeze({
55986
56435
  form: "single",
55987
56436
  optional: false
55988
56437
  }],
56438
+ "valve.getStatus": [{
56439
+ name: "deviceId",
56440
+ form: "single",
56441
+ optional: false
56442
+ }],
55989
56443
  "valve.open": [{
55990
56444
  name: "deviceId",
55991
56445
  form: "single",
@@ -56001,6 +56455,11 @@ Object.freeze({
56001
56455
  form: "single",
56002
56456
  optional: false
56003
56457
  }],
56458
+ "vibration.getStatus": [{
56459
+ name: "deviceId",
56460
+ form: "single",
56461
+ optional: false
56462
+ }],
56004
56463
  "videoclips.dialClipStream": [{
56005
56464
  name: "deviceId",
56006
56465
  form: "single",
@@ -56036,6 +56495,11 @@ Object.freeze({
56036
56495
  form: "single",
56037
56496
  optional: false
56038
56497
  }],
56498
+ "waterHeater.getStatus": [{
56499
+ name: "deviceId",
56500
+ form: "single",
56501
+ optional: false
56502
+ }],
56039
56503
  "waterHeater.setAway": [{
56040
56504
  name: "deviceId",
56041
56505
  form: "single",
@@ -56051,6 +56515,11 @@ Object.freeze({
56051
56515
  form: "single",
56052
56516
  optional: false
56053
56517
  }],
56518
+ "weather.getStatus": [{
56519
+ name: "deviceId",
56520
+ form: "single",
56521
+ optional: false
56522
+ }],
56054
56523
  "webrtcSession.addIceCandidate": [{
56055
56524
  name: "deviceId",
56056
56525
  form: "single",
@@ -56868,7 +57337,7 @@ var PreviewTextField = string().max(200);
56868
57337
  * Whether the notification's preview is a STILL or a short animation.
56869
57338
  *
56870
57339
  * The operator's ask, verbatim: *"inviato come gif o video (come per le altre
56871
- * rule)"* — the other rules already offer an animated preview, and a ten-hour
57340
+ * rule)"* [sent as a gif or video (as for the other rules)] — the other rules already offer an animated preview, and a ten-hour
56872
57341
  * night reads better as three seconds of motion than as one frame of it. Both
56873
57342
  * modes get the SAME treatment (blurred frame, large centred title); `'gif'`
56874
57343
  * simply applies it to a dozen frames sampled across the render and assembles