@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.mjs CHANGED
@@ -7519,7 +7519,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
7519
7519
  return DeviceRole;
7520
7520
  }({});
7521
7521
  //#endregion
7522
- //#region ../types/dist/composition-43aqsZQj.mjs
7522
+ //#region ../types/dist/composition-Bzr7GwgP.mjs
7523
7523
  /**
7524
7524
  * The ffmpeg build every CamStack node downloads, per platform and arch.
7525
7525
  *
@@ -7573,20 +7573,20 @@ function portable(target) {
7573
7573
  }
7574
7574
  portable("linux64"), portable("linuxarm64"), portable("macarm64"), portable("mac64");
7575
7575
  /**
7576
- * LA tabella "quale booleano di questo tipo di device conta come ALTO", e il
7577
- * valutatore puro del suo FRONTE.
7576
+ * THE table "which boolean of this device type counts as HIGH", and the
7577
+ * pure evaluator of its EDGE.
7578
7578
  *
7579
- * UNA tabella per tutti quelli che chiedono "questo device è ALTO?": il
7580
- * trigger `RecordingTriggers.sensorDeviceIds` del recorder, i marker dei
7581
- * sensori della post-analysis, il bridge camera-sensors dell'orchestratore e
7582
- * le sorgenti di un campanello composto (`doorbellFeatureSources`, D671).
7583
- * Una seconda copia divergerebbe alla prima cap aggiunta, e il sintomo — "il
7584
- * sensore fa suonare il campanello ma non registra" — è esattamente D62.
7579
+ * ONE table for everyone who asks "is this device HIGH?": the
7580
+ * recorder's `RecordingTriggers.sensorDeviceIds` trigger, the post-analysis
7581
+ * sensor markers, the orchestrator's camera-sensors bridge and
7582
+ * the sources of a composite doorbell (`doorbellFeatureSources`, D671).
7583
+ * A second copy would diverge at the first cap added, and the symptom — "the
7584
+ * sensor rings the doorbell but does not record" — is exactly D62.
7585
7585
  *
7586
- * ⚠ NON è `DEVICE_STATE_READERS` (`catalogs/device-state-vocabulary.ts`), e le
7587
- * due non vanno unificate: quella risponde a "qual è la PAROLA di stato per una
7588
- * regola" (e include `presence`, `cover`, `alarm-panel`), questa a "qual è il
7589
- * booleano il cui FRONTE conta". Vocabolari deliberatamente diversi.
7586
+ * ⚠ NOT `DEVICE_STATE_READERS` (`catalogs/device-state-vocabulary.ts`), and the
7587
+ * two must not be unified: that one answers "what is the state WORD for a
7588
+ * rule" (and includes `presence`, `cover`, `alarm-panel`), this one "which
7589
+ * boolean's EDGE counts". Deliberately different vocabularies.
7590
7590
  */
7591
7591
  /**
7592
7592
  * Known binary / switch source caps → the boolean slice field whose
@@ -7607,6 +7607,8 @@ var SOURCE_CAP_ACTIVE_FIELD = {
7607
7607
  vibration: "detected",
7608
7608
  tamper: "tampered"
7609
7609
  };
7610
+ /** Cap names whose presence in a device's bindings qualify it as a source. */
7611
+ var SOURCE_CAPS = Object.keys(SOURCE_CAP_ACTIVE_FIELD);
7610
7612
  /**
7611
7613
  * Error types for the safe expression engine. Two distinct classes so callers
7612
7614
  * can tell a compile-time (grammar) failure from a runtime (evaluation)
@@ -9193,22 +9195,22 @@ var CLASS_MAP_MACRO_TARGETS = [
9193
9195
  "package"
9194
9196
  ];
9195
9197
  /**
9196
- * Le macro classi di PRIMO LIVELLO: quelle che un object detector emette e che
9197
- * un operatore può selezionare.
9198
+ * The FIRST-LEVEL macro classes: those an object detector emits and that
9199
+ * an operator can select.
9198
9200
  *
9199
- * Sono le tre offerte dallo step `object-detection`
9201
+ * They are the three offered by the `object-detection` step
9200
9202
  * (`addon-pipeline/src/detection-pipeline/registry/step-definitions.ts`,
9201
- * `enabledMacroClasses`). `package` sta in {@link CLASS_MAP_MACRO_TARGETS} e in
9202
- * `MACRO_LABELS` — è una macro vera — ma NON qui: appartiene allo step
9203
- * `package-detection`, la cui abilitazione è guidata dalle zone, e offrire la
9204
- * stessa parola due volte ha già fatto accendere a un operatore il proxy COCO
9203
+ * `enabledMacroClasses`). `package` is in {@link CLASS_MAP_MACRO_TARGETS} and in
9204
+ * `MACRO_LABELS` — it is a true macro — but NOT here: it belongs to the step
9205
+ * `package-detection`, whose enablement is driven by zones, and offering the
9206
+ * same word twice has already made an operator turn on the COCO proxy
9205
9207
  * (suitcase/backpack/handbag) lasciando spento il detector dedicato.
9206
9208
  *
9207
- * UNA lista. Prima di oggi le stesse tre erano scritte a mano nell'offerta
9208
- * dello step e una seconda volta come union `FirstLevelMacro`
9209
- * (`types/detection.ts`); una terza copia per il trigger di registrazione
9210
- * (`RecordingTriggers.objectClasses`) avrebbe reso invisibile la divergenza
9211
- * successiva.
9209
+ * ONE list. Before today the same three were hand-written in the step's offer
9210
+ * and a second time as the union `FirstLevelMacro`
9211
+ * (`types/detection.ts`); a third copy for the recording trigger
9212
+ * (`RecordingTriggers.objectClasses`) would have made the later divergence
9213
+ * invisible.
9212
9214
  */
9213
9215
  var FIRST_LEVEL_MACRO_CLASSES = [
9214
9216
  "person",
@@ -9273,17 +9275,17 @@ var RecordingStorageModeSchema = _enum([
9273
9275
  "on-device-decision"
9274
9276
  ]);
9275
9277
  /**
9276
- * Le macro classi che possono aprire una finestra di registrazione — le stesse
9277
- * tre offerte dallo step `object-detection`, da UNA lista
9278
+ * The macro classes that can open a recording window — the same
9279
+ * three offered by the `object-detection` step, from ONE list
9278
9280
  * ({@link FIRST_LEVEL_MACRO_CLASSES}).
9279
9281
  */
9280
9282
  var RecordingObjectTriggerClassSchema = _enum(FIRST_LEVEL_MACRO_CLASSES);
9281
9283
  /**
9282
- * True quando `values` non ripete un elemento.
9284
+ * True when `values` does not repeat an element.
9283
9285
  *
9284
- * Un duplicato non è innocuo: ogni voce di `objectClasses` / `sensorDeviceIds`
9285
- * diventa una SORGENTE in `bandTriggerSources`, e la stessa sorgente due volte
9286
- * conterebbe due volte le sue finestre in `segmentMissedByMs`.
9286
+ * A duplicate is not harmless: every entry of `objectClasses` / `sensorDeviceIds`
9287
+ * becomes a SOURCE in `bandTriggerSources`, and the same source twice
9288
+ * would count its windows twice in `segmentMissedByMs`.
9287
9289
  */
9288
9290
  var noDuplicates = (values) => new Set(values).size === values.length;
9289
9291
  /** Which detectors trigger an `events`-mode band. */
@@ -9291,34 +9293,34 @@ var RecordingTriggersSchema = object({
9291
9293
  motion: boolean().optional(),
9292
9294
  audioThresholdDbfs: number().optional(),
9293
9295
  /**
9294
- * Le macro classi la cui detection apre una finestra. ASSENTE = la sorgente
9295
- * non è ascoltata; un array VUOTO è rifiutato, perché "banda events, trigger
9296
- * object acceso, nessuna classe" è la stessa forma "abilitata e non registra
9297
- * nulla, per sempre" contro cui è scritto `eventsBandCanEverDemand`.
9296
+ * The macro classes whose detection opens a window. ABSENT = the source
9297
+ * is not listened to; an EMPTY array is rejected, because "events band, object
9298
+ * trigger on, no class" is the same shape "enabled and records
9299
+ * nothing, forever" that `eventsBandCanEverDemand` is written against.
9298
9300
  *
9299
- * Il segnale letto è GIÀ FILTRATO: solo detection `source: 'pipeline'`, cioè
9300
- * quelle che hanno attraversato `enabledMacroClasses`, i
9301
- * `minConfidence<Macro>` e il full-frame guard. L'AI a bordo camera
9302
- * (`source: 'onboard'`) non attraversa nessuno di quei gate e NON apre
9303
- * finestre — vedi `recorder/object-trigger.ts`.
9301
+ * The signal read is ALREADY FILTERED: only `source: 'pipeline'` detections, i.e.
9302
+ * those that went through `enabledMacroClasses`, the
9303
+ * `minConfidence<Macro>` and the full-frame guard. The camera's onboard AI
9304
+ * (`source: 'onboard'`) goes through none of those gates and does NOT open
9305
+ * windows — see `recorder/object-trigger.ts`.
9304
9306
  */
9305
9307
  objectClasses: array(RecordingObjectTriggerClassSchema).min(1).refine(noDuplicates, { message: "objectClasses must not repeat a class" }).optional(),
9306
9308
  /**
9307
- * I device LINKED il cui FRONTE ALTO apre una finestra. Assente = la sorgente
9308
- * non è ascoltata; un array vuoto è rifiutato per la stessa ragione di
9309
+ * The LINKED devices whose RISING EDGE opens a window. Absent = the source
9310
+ * is not listened to; an empty array is rejected for the same reason as
9309
9311
  * `objectClasses`.
9310
9312
  *
9311
- * Sono id di device SORGENTE, non camere: la banda li nomina, quindi il
9312
- * percorso caldo (`DeviceStateChanged`, a ritmo di bus su tutta la flotta)
9313
- * non fa RPC. L'OFFERTA da cui l'operatore li sceglie è un'altra domanda, e
9314
- * si risolve con `deviceManager.getLinkedDevices` + `getBindingsBatch` per
9315
- * device (D12) — mai un elenco globale di cap.
9313
+ * These are SOURCE device ids, not cameras: the band names them, so the
9314
+ * hot path (`DeviceStateChanged`, at bus rate across the whole fleet)
9315
+ * does no RPC. The OFFER from which the operator picks them is another question, and
9316
+ * is resolved with `deviceManager.getLinkedDevices` + `getBindingsBatch` per
9317
+ * device (D12) — never a global list of caps.
9316
9318
  *
9317
- * Cosa vuol dire "alto" dipende dal TIPO di device e non è deciso qui:
9318
- * `SOURCE_CAP_ACTIVE_FIELD` (`catalogs/sensor-active-state.ts`) è LA tabella,
9319
- * la stessa del campanello composto (D671). Ed è il FRONTE, non
9320
- * il livello: un contatto trovato già aperto al riavvio del runner non fa
9321
- * registrare.
9319
+ * What "high" means depends on the device TYPE and is not decided here:
9320
+ * `SOURCE_CAP_ACTIVE_FIELD` (`catalogs/sensor-active-state.ts`) is THE table,
9321
+ * the same one as the composite doorbell (D671). And it is the EDGE, not
9322
+ * the level: a contact found already open at runner restart does not
9323
+ * record.
9322
9324
  */
9323
9325
  sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional()
9324
9326
  });
@@ -10395,7 +10397,7 @@ var DecoderSessionConfigSchema = object({
10395
10397
  * - **VALUE** — at which level, for which scope, until when. That stays ONE
10396
10398
  * thing: the logging settings document on the `system` cap. Two authorities
10397
10399
  * over the values is the exact defect
10398
- * `docs/design/plans/2026-08-26-logging-per-componente.md` was written to
10400
+ * `docs/design/plans/2026-08-26-per-component-logging.md` was written to
10399
10401
  * remove; re-introducing it from the cure side would be grotesque.
10400
10402
  *
10401
10403
  * Nothing in this file reads a clock, an env var or a store. The registry is
@@ -12476,7 +12478,7 @@ var BrokerStatusEnum = _enum([
12476
12478
  "unreachable",
12477
12479
  "error"
12478
12480
  ]);
12479
- var BrokerInfoSchema$1 = object({
12481
+ var BrokerInfoSchema = object({
12480
12482
  /** Stable broker id. Persisted; survives addon restarts. */
12481
12483
  id: string(),
12482
12484
  /** Addon id of the provider that OWNS this broker.
@@ -12619,8 +12621,8 @@ var brokerCapability = {
12619
12621
  kind: "poll"
12620
12622
  },
12621
12623
  methods: {
12622
- list: method(ListInputSchema, array(BrokerInfoSchema$1)),
12623
- get: method(GetInputSchema, BrokerInfoSchema$1.nullable()),
12624
+ list: method(ListInputSchema, array(BrokerInfoSchema)),
12625
+ get: method(GetInputSchema, BrokerInfoSchema.nullable()),
12624
12626
  /** Enumerate which addon provides which broker kind(s) for the
12625
12627
  * unified create picker. The auto-mount fans this array across
12626
12628
  * every registered `broker` provider (array-output method), so the
@@ -15026,7 +15028,7 @@ var dataStoreProviderCapability = {
15026
15028
  *
15027
15029
  * ⚠ An earlier version of this comment blamed Zod stripping, and that
15028
15030
  * was wrong — corrected 2026-08-26 after the hop map
15029
- * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
15031
+ * (`docs/design/2026-08-26-topic-hop-map.md`) traced the path.
15030
15032
  * There is **no Zod parse at all** between the door and the engine: the
15031
15033
  * dispatcher forwards the payload verbatim and UDS carries it whole. A
15032
15034
  * field declared here reaches `SqliteSettingsBackend` either way.
@@ -15988,7 +15990,17 @@ var SiteZoneSchema = object({
15988
15990
  var ProviderStatusSchema = object({
15989
15991
  connected: boolean(),
15990
15992
  deviceCount: number(),
15991
- error: string().optional()
15993
+ error: string().optional(),
15994
+ /**
15995
+ * `'orchestrator'`: this provider writes NO camera's `motion` runtime slice
15996
+ * — the orchestrator is its only writer (D696). Set by `BaseDeviceProvider`,
15997
+ * which every provider bundles, so only a provider BUILT from D696-amended
15998
+ * code says it. ABSENT means an older provider that may still write it (raw
15999
+ * VMD writes, a boot seed), and the orchestrator's provider gate keeps that
16000
+ * provider's cameras unwritten (`camera-sensors/motion-slice-provider-gate.ts`)
16001
+ * — the provider twin of the runner's `getLocalLoad().motionSliceWriter`.
16002
+ */
16003
+ motionSliceWriter: literal("orchestrator").optional()
15992
16004
  });
15993
16005
  object({
15994
16006
  externalId: string(),
@@ -17179,7 +17191,7 @@ var deviceManagerCapability = {
17179
17191
  * sources could be switched off without switching off the rest (D556, then
17180
17192
  * D555's re-key by source). The operator removed the whole idea the same
17181
17193
  * day: *"tutti i providers funzionano sempre, non serve
17182
- * disattivarli/attivarli … loro vivono lì"* (D557 amended, third). A
17194
+ * 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
17183
17195
  * collection cap's providers are a DERIVED set — every addon that provides
17184
17196
  * the cap for this device type, computed on every read and persisted
17185
17197
  * nowhere — so there is nothing here to activate, and a verb that accepted
@@ -18017,7 +18029,7 @@ var embeddingEncoderCapability = {
18017
18029
  * per-device window, `KeyFrameCaptureLog`, `bumpCropMetric`. Every one of them
18018
18030
  * ends in a log line, and a log line is the thing the operator asked to stop
18019
18031
  * needing: *"possiamo armare questi errori intanto? Così al prossimo giro
18020
- * ricontrolliamo tutti questi punti"*. Reading them meant grepping Loki and
18032
+ * 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
18021
18033
  * hand-correlating timestamps, which is how a 22% thumbnail gap and a 3-hour
18022
18034
  * media blackout were both diagnosed. The counters stay; this is where they can
18023
18035
  * be READ.
@@ -19665,7 +19677,7 @@ var BrokerStatusSchema$1 = _enum([
19665
19677
  "unreachable",
19666
19678
  "tls-error"
19667
19679
  ]);
19668
- var BrokerInfoSchema = object({
19680
+ var BrokerInfoSchema$1 = object({
19669
19681
  id: string(),
19670
19682
  name: string(),
19671
19683
  url: string(),
@@ -19738,7 +19750,7 @@ var mqttBrokerCapability = {
19738
19750
  kind: "poll"
19739
19751
  },
19740
19752
  methods: {
19741
- listBrokers: method(_void(), array(BrokerInfoSchema)),
19753
+ listBrokers: method(_void(), array(BrokerInfoSchema$1)),
19742
19754
  getBrokerConfig: method(IdInputSchema, BrokerConnectionDetailsSchema, { auth: "admin" }),
19743
19755
  addBroker: method(AddBrokerInputSchema, AddBrokerResultSchema, {
19744
19756
  kind: "mutation",
@@ -21992,78 +22004,16 @@ var NcRuleInputSchema = object({
21992
22004
  */
21993
22005
  confirm: NcConfirmSchema.optional(),
21994
22006
  /**
21995
- * WAIT for face/plate recognition before saying anything.
21996
- *
21997
- * A notification's TEXT is frozen at enqueue and its media is re-resolved at
21998
- * send; the identity is neither. A face is confirmed after `confirmFrames`
21999
- * agreeing observations — p50 **11.4 s** after the track was first seen,
22000
- * measured on this hub — and an `immediate` rule enqueues on the first object
22001
- * event, seconds before that. So "Gianluca è arrivato" is unsayable on the
22002
- * immediate path, and no amount of media re-resolution fixes a sentence.
22003
- *
22004
- * Only two honest answers exist, and this flag picks between them. It has
22005
- * effect ONLY on a rule that declares a recognition scope
22006
- * ({@link NcConditions.identities} or {@link NcConditions.plates}) — on any
22007
- * other rule there is nothing to wait for and the flag is inert.
22008
- *
22009
- * | value | what happens |
22010
- * | --- | --- |
22011
- * | `true` | the rule stops firing on the object event and fires at TRACK CLOSE instead, once, with the name — later, and complete |
22012
- * | 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) |
22013
- *
22014
- * `.optional()` and deliberately NOT `.default()`: a Zod default does not run
22015
- * on the addon cap path, and absent has to keep meaning exactly what every
22016
- * rule authored before this field meant.
22017
- *
22018
- * The cost of `true` is stated here because the editor states it too: a rule
22019
- * that waits also inherits track-close SEMANTICS — its `zones` condition
22020
- * tests every zone the track visited and a `crossing` condition can no longer
22021
- * be satisfied, because a closed track carries no crossing.
22022
- */
22023
- waitForEnhancement: boolean().optional(),
22024
- /**
22025
- * GROUP a burst of subjects into ONE notification that grows.
22026
- *
22027
- * Seconds of quiet after the last matching subject before the burst is
22028
- * considered over. While it is open, the first subject enqueues immediately —
22029
- * **exactly as today, with no added latency** — and every real growth (a new
22030
- * subject, or a name confirmed on one already in it) REPLACES that
22031
- * notification with an updated one naming everybody. The push carries the
22032
- * group's own coalescing tag, so the phone replaces rather than stacks.
22033
- *
22034
- * `0` / absent = off, and off is today's behaviour byte for byte.
22035
- *
22036
- * ### Why an idle cutoff and not a window
22037
- *
22038
- * The measured seven-person arrival on device 590 spans 110 s with every
22039
- * internal gap under 30 s. A 12 s fixed window cuts it into three groups; an
22040
- * idle cutoff holds it as one and ends it when the arrival actually ends.
22041
- * 30 s is a widely shipped value for the same decision.
22042
- *
22043
- * ### What it replaces
22044
- *
22045
- * The blind cooldown, which collapses a burst by DISCARDING it. Measured on
22046
- * device 615 / *Persona su Uscio* over six days: 116 qualifying tracks → 74
22047
- * notifications, **44 (37.9%) suppressed outright**, 23 of them overlapping a
22048
- * track that did fire and 7 carrying a confirmed identity nobody heard about.
22049
- * A group collapses the same volume by MERGING, so the cooldown becomes a
22050
- * budget over GROUPS — which is what it always meant — and a growth is never
22051
- * throttled by the window its own first member spent.
22052
- *
22053
- * ### Interaction with {@link waitForEnhancement}
22054
- *
22055
- * They compose, and the order matters. `waitForEnhancement` defers the rule to
22056
- * TRACK CLOSE, so with both set the group is opened by the first member to
22057
- * CLOSE — already carrying its name — and grows as later members close. That
22058
- * is later, and complete. With grouping alone the group opens on the first
22059
- * object event and picks up names as they are confirmed, through the growth
22060
- * path. Neither combination fires twice for one subject.
22061
- *
22062
- * `.optional()` and deliberately NOT `.default()`: a Zod default does not run
22063
- * on the addon cap path, so absent must keep meaning what it meant before this
22064
- * field existed.
22007
+ * IMMEDIATE GROUPED (D692): the first matching subject opens a window of this many
22008
+ * seconds; the rule sends ONE message when the window closes — early, once every
22009
+ * subject in it is final, never before {@link NC_GROUPING_MIN_SEC} — naming everybody
22010
+ * the rule matched, with one mosaic tile per subject.
22011
+ * Absent = plain immediate (one message per track, at the first match).
22012
+ * Only an `immediate` DETECTION rule may carry it (`ruleGroupingApplies`, enforced on
22013
+ * save by the hub's grouping guard). `.optional()`, never `.default()`: the addon cap
22014
+ * path does not run Zod defaults.
22065
22015
  */
22066
- groupIdleSec: number().int().min(0).max(600).optional()
22016
+ groupingSec: number().int().min(5).max(60).optional()
22067
22017
  });
22068
22018
  /**
22069
22019
  * Partial patch for `updateRule` — any subset of the input fields, plus the
@@ -22111,9 +22061,10 @@ var NcRuleClearableKeySchema = _enum([
22111
22061
  "targetUsers",
22112
22062
  "snoozeOptions",
22113
22063
  "snoozeAllowGlobal",
22114
- "waitForEnhancement",
22115
22064
  "actions",
22116
22065
  "confirm",
22066
+ "groupingSec",
22067
+ "waitForEnhancement",
22117
22068
  "groupIdleSec"
22118
22069
  ]);
22119
22070
  var NcRuleUpdateInputSchema = object({
@@ -22135,9 +22086,25 @@ var NcRuleSchema = NcRuleInputSchema.extend({
22135
22086
  */
22136
22087
  disabledTargetIds: array(string()).default([])
22137
22088
  });
22089
+ /**
22090
+ * The state-summary SECTIONS (D647 / D698): the D637 kind groups that report a
22091
+ * still-true state. `backups-exports` and `alarm` are not sections — a completed
22092
+ * job is not an open state, and the alarm stays instant.
22093
+ */
22094
+ var NcStateSummarySectionIdSchema = _enum([
22095
+ "device-state",
22096
+ "streams",
22097
+ "battery",
22098
+ "consumables",
22099
+ "tanks",
22100
+ "detection-blind",
22101
+ "nodes",
22102
+ "addons",
22103
+ "updates"
22104
+ ]);
22138
22105
  /** One section of a previewed state summary. `unavailable` = its state could not be read. */
22139
22106
  var NcStateSummaryPreviewSectionSchema = object({
22140
- id: string(),
22107
+ id: NcStateSummarySectionIdSchema,
22141
22108
  status: _enum(["read", "unavailable"]),
22142
22109
  items: number().int().nonnegative(),
22143
22110
  reason: string().optional()
@@ -22147,7 +22114,7 @@ var NcStateSummaryPreviewSectionSchema = object({
22147
22114
  * a `rule` split (no `section`), one section's on a `section` split.
22148
22115
  */
22149
22116
  var NcStateSummaryPreviewRowSchema = object({
22150
- section: string().optional(),
22117
+ section: NcStateSummarySectionIdSchema.optional(),
22151
22118
  /** The section's name on a per-section row; every reported section's, joined, on a combined one. */
22152
22119
  title: string(),
22153
22120
  text: string(),
@@ -22665,7 +22632,7 @@ var NC_CONDITION_CATALOG = [
22665
22632
  operator: "in",
22666
22633
  appliesTo: ["immediate", "track-end"],
22667
22634
  phase: "P1",
22668
- 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."
22635
+ 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)."
22669
22636
  },
22670
22637
  {
22671
22638
  id: "plates",
@@ -24770,14 +24737,14 @@ var TrackSchema = object({
24770
24737
  * `derive-returned-null tile=standin`,
24771
24738
  * `native-tile tile=native no-key-frame-at-close`, …) written at close and
24772
24739
  * CLEARED by the late-keyFrame upgrade when a native tile lands after all.
24773
- * The operator-facing answer to "perché manca l'immagine?" on a track whose
24740
+ * The operator-facing answer to "perché manca l'immagine?" [why is the image missing?] on a track whose
24774
24741
  * tile is a face/plate stand-in, a raster crop, or an icon.
24775
24742
  *
24776
24743
  * **`no-key-frame-at-close` (D400).** The line used to be written ONLY when
24777
24744
  * the TILE ranked below native, so a track whose thumbnail landed natively
24778
24745
  * while its key frame missed carried no reason at all — three of the four
24779
24746
  * `MISSING_KEYFRAME` tracks in the 2026-09-07 operator audit were exactly
24780
- * that shape, and their "niente ultimo" had no cause anywhere on the row.
24747
+ * that shape, and their "niente ultimo" [no last frame] had no cause anywhere on the row.
24781
24748
  * The key frame is the head of a cascade (`keyFrame ⇒ keyFrameSmall ⇒ the
24782
24749
  * lastFrame copy source`), so its absence is now on this line whatever the
24783
24750
  * tile ended up being.
@@ -24864,7 +24831,7 @@ var MotionEventSchema = object({
24864
24831
  /**
24865
24832
  * Ms offsets from `timestamp` (the episode's own first rising edge, so the
24866
24833
  * first entry is always `0`) of every genuine off→on transition the
24867
- * episode saw — "ogni evento on si deve salvare" (D475). NOT one entry per
24834
+ * episode saw — "ogni evento on si deve salvare" [every ON event must be saved] (D475). NOT one entry per
24868
24835
  * push: a firmware source that keepalives at ~1 Hz for the whole burst
24869
24836
  * (Reolink, Hikvision) produces exactly one edge; a source that reports an
24870
24837
  * explicit `false` mid-episode and then resumes before the quiet window
@@ -25388,6 +25355,7 @@ var KeyEventSchema = object({
25388
25355
  bestEventId: string(),
25389
25356
  /** Track lifetime in ms (lastSeen - firstSeen). */
25390
25357
  windowMs: number().optional(),
25358
+ audioLabels: array(TrackAudioLabelSchema).readonly().optional(),
25391
25359
  ...TrackFlagFields,
25392
25360
  ...TrackRetrainFields
25393
25361
  });
@@ -32072,7 +32040,7 @@ var ClipPlaybackSchema = object({
32072
32040
  * **One authorised yes is one wake.** `next-natural` — take the clip the next
32073
32041
  * time the camera is awake for its own reasons — is deliberately not a member:
32074
32042
  * it was proposed, it is free on the battery, and the operator declined it on
32075
- * 2026-09-20 (*"Quando un export viene richiesto si sveglia la camera."*,
32043
+ * 2026-09-20 (*"Quando un export viene richiesto si sveglia la camera."* [When an export is requested the camera wakes up],
32076
32044
  * D558 "Considered and not taken").
32077
32045
  */
32078
32046
  var ClipWakeSchema = _enum(["authorised"]);
@@ -32317,7 +32285,7 @@ var videoclipsCapability = {
32317
32285
  * **It is a SECTION of the Recording tab, at the end of it — not a tab of
32318
32286
  * its own.** It shipped as a `clips` top-tab and the operator rejected the
32319
32287
  * placement: *"utilizzerei la stessa tab recordings, lì abbiamo già tutto il
32320
- * necessario, una nuova sezione alla fine per le clips"*. The Recording tab
32288
+ * 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
32321
32289
  * already holds the recorder's panel, the schedule bands and the unified
32322
32290
  * retention policy; footage the camera itself holds is the same question,
32323
32291
  * asked of a different store. `order: 100` puts it after all of them with
@@ -32378,7 +32346,7 @@ var videoclipsCapability = {
32378
32346
  * It replaced `sources?: string[]`, a VIEW filter over source ids that
32379
32347
  * assumed the answer was a fan-out over everything a camera has. The
32380
32348
  * operator settled otherwise on 2026-09-20 — *"l'utilizzatore è uno
32381
- * solo"* — so the list is asked of one provider at a time and there is
32349
+ * solo"* [there is only one user] — so the list is asked of one provider at a time and there is
32382
32350
  * nothing to filter out of it.
32383
32351
  */
32384
32352
  provider: string().min(1)
@@ -41519,7 +41487,7 @@ var ReadGopBytesResultSchema = object({
41519
41487
  /**
41520
41488
  * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
41521
41489
  * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
41522
- * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
41490
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-clip-replay-on-pipeline.md`):
41523
41491
  * a replay needs several seconds of native pixels, not one frame.
41524
41492
  *
41525
41493
  * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
@@ -44127,7 +44095,7 @@ var systemCapability = {
44127
44095
  *
44128
44096
  * This is the surface the operator asked for on 2026-08-28 (*"possiamo
44129
44097
  * armare questi errori intanto? Così al prossimo giro ricontrolliamo tutti
44130
- * questi punti"*). Before it, four live failure modes could only be counted
44098
+ * 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
44131
44099
  * by grepping Loki and hand-correlating timestamps, which is exactly how a
44132
44100
  * 22% thumbnail gap and a 3-hour media blackout were diagnosed — twice.
44133
44101
  *
@@ -45288,6 +45256,7 @@ var zoneRulesCapability = {
45288
45256
  */
45289
45257
  durability: "restored"
45290
45258
  };
45259
+ SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
45291
45260
  /**
45292
45261
  * Most specific first. Extending this list is how a new device kind becomes
45293
45262
  * gateable; nothing else needs to change.
@@ -54077,6 +54046,11 @@ Object.freeze({
54077
54046
  }
54078
54047
  });
54079
54048
  Object.freeze({
54049
+ "accessories.getStatus": [{
54050
+ name: "deviceId",
54051
+ form: "single",
54052
+ optional: false
54053
+ }],
54080
54054
  "accessories.setChildHidden": [{
54081
54055
  name: "childDeviceId",
54082
54056
  form: "single",
@@ -54096,6 +54070,11 @@ Object.freeze({
54096
54070
  form: "single",
54097
54071
  optional: false
54098
54072
  }],
54073
+ "airQualitySensor.getStatus": [{
54074
+ name: "deviceId",
54075
+ form: "single",
54076
+ optional: false
54077
+ }],
54099
54078
  "alarmPanel.arm": [{
54100
54079
  name: "deviceId",
54101
54080
  form: "single",
@@ -54106,11 +54085,36 @@ Object.freeze({
54106
54085
  form: "single",
54107
54086
  optional: false
54108
54087
  }],
54088
+ "alarmPanel.getStatus": [{
54089
+ name: "deviceId",
54090
+ form: "single",
54091
+ optional: false
54092
+ }],
54109
54093
  "alarmPanel.trigger": [{
54110
54094
  name: "deviceId",
54111
54095
  form: "single",
54112
54096
  optional: false
54113
54097
  }],
54098
+ "ambientLightSensor.getStatus": [{
54099
+ name: "deviceId",
54100
+ form: "single",
54101
+ optional: false
54102
+ }],
54103
+ "audioAnalysis.applyDeviceSettingsPatch": [{
54104
+ name: "deviceId",
54105
+ form: "single",
54106
+ optional: false
54107
+ }],
54108
+ "audioAnalysis.getDeviceLiveContribution": [{
54109
+ name: "deviceId",
54110
+ form: "single",
54111
+ optional: false
54112
+ }],
54113
+ "audioAnalysis.getDeviceSettingsContribution": [{
54114
+ name: "deviceId",
54115
+ form: "single",
54116
+ optional: false
54117
+ }],
54114
54118
  "audioAnalysis.resolveDeviceSettings": [{
54115
54119
  name: "deviceId",
54116
54120
  form: "single",
@@ -54151,16 +54155,36 @@ Object.freeze({
54151
54155
  form: "single",
54152
54156
  optional: false
54153
54157
  }],
54158
+ "automationControl.getStatus": [{
54159
+ name: "deviceId",
54160
+ form: "single",
54161
+ optional: false
54162
+ }],
54154
54163
  "automationControl.trigger": [{
54155
54164
  name: "deviceId",
54156
54165
  form: "single",
54157
54166
  optional: false
54158
54167
  }],
54168
+ "battery.getStatus": [{
54169
+ name: "deviceId",
54170
+ form: "single",
54171
+ optional: false
54172
+ }],
54159
54173
  "battery.wakeForStream": [{
54160
54174
  name: "deviceId",
54161
54175
  form: "single",
54162
54176
  optional: false
54163
54177
  }],
54178
+ "binary.getStatus": [{
54179
+ name: "deviceId",
54180
+ form: "single",
54181
+ optional: false
54182
+ }],
54183
+ "brightness.getStatus": [{
54184
+ name: "deviceId",
54185
+ form: "single",
54186
+ optional: false
54187
+ }],
54164
54188
  "brightness.setBrightness": [{
54165
54189
  name: "deviceId",
54166
54190
  form: "single",
@@ -54176,6 +54200,26 @@ Object.freeze({
54176
54200
  form: "single",
54177
54201
  optional: false
54178
54202
  }],
54203
+ "cameraCredentials.getStatus": [{
54204
+ name: "deviceId",
54205
+ form: "single",
54206
+ optional: false
54207
+ }],
54208
+ "cameraGridLayout.applyDeviceSettingsPatch": [{
54209
+ name: "deviceId",
54210
+ form: "single",
54211
+ optional: false
54212
+ }],
54213
+ "cameraGridLayout.getDeviceLiveContribution": [{
54214
+ name: "deviceId",
54215
+ form: "single",
54216
+ optional: false
54217
+ }],
54218
+ "cameraGridLayout.getDeviceSettingsContribution": [{
54219
+ name: "deviceId",
54220
+ form: "single",
54221
+ optional: false
54222
+ }],
54179
54223
  "cameraGridLayout.getLayout": [{
54180
54224
  name: "deviceId",
54181
54225
  form: "single",
@@ -54191,6 +54235,21 @@ Object.freeze({
54191
54235
  form: "single",
54192
54236
  optional: false
54193
54237
  }],
54238
+ "cameraPipelineConfig.applyDeviceSettingsPatch": [{
54239
+ name: "deviceId",
54240
+ form: "single",
54241
+ optional: false
54242
+ }],
54243
+ "cameraPipelineConfig.getDeviceLiveContribution": [{
54244
+ name: "deviceId",
54245
+ form: "single",
54246
+ optional: false
54247
+ }],
54248
+ "cameraPipelineConfig.getDeviceSettingsContribution": [{
54249
+ name: "deviceId",
54250
+ form: "single",
54251
+ optional: false
54252
+ }],
54194
54253
  "cameraStreams.getBrokerStreams": [{
54195
54254
  name: "deviceId",
54196
54255
  form: "single",
@@ -54216,6 +54275,16 @@ Object.freeze({
54216
54275
  form: "single",
54217
54276
  optional: false
54218
54277
  }],
54278
+ "carbonMonoxide.getStatus": [{
54279
+ name: "deviceId",
54280
+ form: "single",
54281
+ optional: false
54282
+ }],
54283
+ "climateControl.getStatus": [{
54284
+ name: "deviceId",
54285
+ form: "single",
54286
+ optional: false
54287
+ }],
54219
54288
  "climateControl.setFanMode": [{
54220
54289
  name: "deviceId",
54221
54290
  form: "single",
@@ -54256,16 +54325,41 @@ Object.freeze({
54256
54325
  form: "single",
54257
54326
  optional: false
54258
54327
  }],
54328
+ "color.getStatus": [{
54329
+ name: "deviceId",
54330
+ form: "single",
54331
+ optional: false
54332
+ }],
54259
54333
  "color.setColor": [{
54260
54334
  name: "deviceId",
54261
54335
  form: "single",
54262
54336
  optional: false
54263
54337
  }],
54338
+ "connectivity.getStatus": [{
54339
+ name: "deviceId",
54340
+ form: "single",
54341
+ optional: false
54342
+ }],
54343
+ "consumables.getStatus": [{
54344
+ name: "deviceId",
54345
+ form: "single",
54346
+ optional: false
54347
+ }],
54264
54348
  "consumables.reset": [{
54265
54349
  name: "deviceId",
54266
54350
  form: "single",
54267
54351
  optional: false
54268
54352
  }],
54353
+ "contact.getStatus": [{
54354
+ name: "deviceId",
54355
+ form: "single",
54356
+ optional: false
54357
+ }],
54358
+ "control.getStatus": [{
54359
+ name: "deviceId",
54360
+ form: "single",
54361
+ optional: false
54362
+ }],
54269
54363
  "control.setValue": [{
54270
54364
  name: "deviceId",
54271
54365
  form: "single",
@@ -54276,6 +54370,11 @@ Object.freeze({
54276
54370
  form: "single",
54277
54371
  optional: false
54278
54372
  }],
54373
+ "cover.getStatus": [{
54374
+ name: "deviceId",
54375
+ form: "single",
54376
+ optional: false
54377
+ }],
54279
54378
  "cover.open": [{
54280
54379
  name: "deviceId",
54281
54380
  form: "single",
@@ -54301,6 +54400,11 @@ Object.freeze({
54301
54400
  form: "single",
54302
54401
  optional: false
54303
54402
  }],
54403
+ "dayNight.getStatus": [{
54404
+ name: "deviceId",
54405
+ form: "single",
54406
+ optional: false
54407
+ }],
54304
54408
  "dayNight.setSettings": [{
54305
54409
  name: "deviceId",
54306
54410
  form: "single",
@@ -54311,11 +54415,31 @@ Object.freeze({
54311
54415
  form: "single",
54312
54416
  optional: true
54313
54417
  }],
54418
+ "detectionPipeline.applyDeviceSettingsPatch": [{
54419
+ name: "deviceId",
54420
+ form: "single",
54421
+ optional: false
54422
+ }],
54423
+ "detectionPipeline.getDeviceLiveContribution": [{
54424
+ name: "deviceId",
54425
+ form: "single",
54426
+ optional: false
54427
+ }],
54428
+ "detectionPipeline.getDeviceSettingsContribution": [{
54429
+ name: "deviceId",
54430
+ form: "single",
54431
+ optional: false
54432
+ }],
54314
54433
  "deviceAdminLink.getAdminLink": [{
54315
54434
  name: "deviceId",
54316
54435
  form: "single",
54317
54436
  optional: false
54318
54437
  }],
54438
+ "deviceAdoption.getStatus": [{
54439
+ name: "deviceId",
54440
+ form: "single",
54441
+ optional: false
54442
+ }],
54319
54443
  "deviceAdoption.release": [{
54320
54444
  name: "camDeviceId",
54321
54445
  form: "single",
@@ -54331,6 +54455,11 @@ Object.freeze({
54331
54455
  form: "single",
54332
54456
  optional: false
54333
54457
  }],
54458
+ "deviceDiscovery.getStatus": [{
54459
+ name: "deviceId",
54460
+ form: "single",
54461
+ optional: false
54462
+ }],
54334
54463
  "deviceDiscovery.listDiscovered": [{
54335
54464
  name: "deviceId",
54336
54465
  form: "single",
@@ -54350,6 +54479,21 @@ Object.freeze({
54350
54479
  form: "single",
54351
54480
  optional: false
54352
54481
  }],
54482
+ "deviceExport.applyDeviceSettingsPatch": [{
54483
+ name: "deviceId",
54484
+ form: "single",
54485
+ optional: false
54486
+ }],
54487
+ "deviceExport.getDeviceLiveContribution": [{
54488
+ name: "deviceId",
54489
+ form: "single",
54490
+ optional: false
54491
+ }],
54492
+ "deviceExport.getDeviceSettingsContribution": [{
54493
+ name: "deviceId",
54494
+ form: "single",
54495
+ optional: false
54496
+ }],
54353
54497
  "deviceExtension.listCandidates": [{
54354
54498
  name: "deviceId",
54355
54499
  form: "single",
@@ -54698,6 +54842,26 @@ Object.freeze({
54698
54842
  form: "single",
54699
54843
  optional: false
54700
54844
  }],
54845
+ "deviceStatus.getStatus": [{
54846
+ name: "deviceId",
54847
+ form: "single",
54848
+ optional: false
54849
+ }],
54850
+ "doorbell.getStatus": [{
54851
+ name: "deviceId",
54852
+ form: "single",
54853
+ optional: false
54854
+ }],
54855
+ "enumSensor.getStatus": [{
54856
+ name: "deviceId",
54857
+ form: "single",
54858
+ optional: false
54859
+ }],
54860
+ "eventEmitter.getStatus": [{
54861
+ name: "deviceId",
54862
+ form: "single",
54863
+ optional: false
54864
+ }],
54701
54865
  "faceGallery.getFaceByTrack": [{
54702
54866
  name: "deviceId",
54703
54867
  form: "single",
@@ -54712,6 +54876,11 @@ Object.freeze({
54712
54876
  form: "array",
54713
54877
  optional: true
54714
54878
  }],
54879
+ "fanControl.getStatus": [{
54880
+ name: "deviceId",
54881
+ form: "single",
54882
+ optional: false
54883
+ }],
54715
54884
  "fanControl.setDirection": [{
54716
54885
  name: "deviceId",
54717
54886
  form: "single",
@@ -54732,6 +54901,26 @@ Object.freeze({
54732
54901
  form: "single",
54733
54902
  optional: false
54734
54903
  }],
54904
+ "featureProbe.getStatus": [{
54905
+ name: "deviceId",
54906
+ form: "single",
54907
+ optional: false
54908
+ }],
54909
+ "flood.getStatus": [{
54910
+ name: "deviceId",
54911
+ form: "single",
54912
+ optional: false
54913
+ }],
54914
+ "gas.getStatus": [{
54915
+ name: "deviceId",
54916
+ form: "single",
54917
+ optional: false
54918
+ }],
54919
+ "humidifier.getStatus": [{
54920
+ name: "deviceId",
54921
+ form: "single",
54922
+ optional: false
54923
+ }],
54735
54924
  "humidifier.setMode": [{
54736
54925
  name: "deviceId",
54737
54926
  form: "single",
@@ -54747,11 +54936,26 @@ Object.freeze({
54747
54936
  form: "single",
54748
54937
  optional: false
54749
54938
  }],
54939
+ "humiditySensor.getStatus": [{
54940
+ name: "deviceId",
54941
+ form: "single",
54942
+ optional: false
54943
+ }],
54944
+ "image.getStatus": [{
54945
+ name: "deviceId",
54946
+ form: "single",
54947
+ optional: false
54948
+ }],
54750
54949
  "imageSettings.getOptions": [{
54751
54950
  name: "deviceId",
54752
54951
  form: "single",
54753
54952
  optional: false
54754
54953
  }],
54954
+ "imageSettings.getStatus": [{
54955
+ name: "deviceId",
54956
+ form: "single",
54957
+ optional: false
54958
+ }],
54755
54959
  "imageSettings.setSettings": [{
54756
54960
  name: "deviceId",
54757
54961
  form: "single",
@@ -54762,6 +54966,11 @@ Object.freeze({
54762
54966
  form: "single",
54763
54967
  optional: false
54764
54968
  }],
54969
+ "intercom.getStatus": [{
54970
+ name: "deviceId",
54971
+ form: "single",
54972
+ optional: false
54973
+ }],
54765
54974
  "intercom.handleAnswer": [{
54766
54975
  name: "deviceId",
54767
54976
  form: "single",
@@ -54792,6 +55001,11 @@ Object.freeze({
54792
55001
  form: "single",
54793
55002
  optional: false
54794
55003
  }],
55004
+ "lawnMowerControl.getStatus": [{
55005
+ name: "deviceId",
55006
+ form: "single",
55007
+ optional: false
55008
+ }],
54795
55009
  "lawnMowerControl.pause": [{
54796
55010
  name: "deviceId",
54797
55011
  form: "single",
@@ -54802,6 +55016,11 @@ Object.freeze({
54802
55016
  form: "single",
54803
55017
  optional: false
54804
55018
  }],
55019
+ "lockControl.getStatus": [{
55020
+ name: "deviceId",
55021
+ form: "single",
55022
+ optional: false
55023
+ }],
54805
55024
  "lockControl.lock": [{
54806
55025
  name: "deviceId",
54807
55026
  form: "single",
@@ -54817,6 +55036,11 @@ Object.freeze({
54817
55036
  form: "single",
54818
55037
  optional: false
54819
55038
  }],
55039
+ "mediaPlayer.getStatus": [{
55040
+ name: "deviceId",
55041
+ form: "single",
55042
+ optional: false
55043
+ }],
54820
55044
  "mediaPlayer.next": [{
54821
55045
  name: "deviceId",
54822
55046
  form: "single",
@@ -54877,6 +55101,11 @@ Object.freeze({
54877
55101
  form: "single",
54878
55102
  optional: false
54879
55103
  }],
55104
+ "motion.getStatus": [{
55105
+ name: "deviceId",
55106
+ form: "single",
55107
+ optional: false
55108
+ }],
54880
55109
  "motion.isDetected": [{
54881
55110
  name: "deviceId",
54882
55111
  form: "single",
@@ -54887,11 +55116,31 @@ Object.freeze({
54887
55116
  form: "single",
54888
55117
  optional: false
54889
55118
  }],
55119
+ "motionDetection.applyDeviceSettingsPatch": [{
55120
+ name: "deviceId",
55121
+ form: "single",
55122
+ optional: false
55123
+ }],
55124
+ "motionDetection.getDeviceLiveContribution": [{
55125
+ name: "deviceId",
55126
+ form: "single",
55127
+ optional: false
55128
+ }],
55129
+ "motionDetection.getDeviceSettingsContribution": [{
55130
+ name: "deviceId",
55131
+ form: "single",
55132
+ optional: false
55133
+ }],
54890
55134
  "motionDetection.removeCamera": [{
54891
55135
  name: "deviceId",
54892
55136
  form: "single",
54893
55137
  optional: false
54894
55138
  }],
55139
+ "motionTrigger.getStatus": [{
55140
+ name: "deviceId",
55141
+ form: "single",
55142
+ optional: false
55143
+ }],
54895
55144
  "motionTrigger.setMotionTrigger": [{
54896
55145
  name: "deviceId",
54897
55146
  form: "single",
@@ -54902,6 +55151,11 @@ Object.freeze({
54902
55151
  form: "single",
54903
55152
  optional: false
54904
55153
  }],
55154
+ "motionZones.getStatus": [{
55155
+ name: "deviceId",
55156
+ form: "single",
55157
+ optional: false
55158
+ }],
54905
55159
  "motionZones.setZone": [{
54906
55160
  name: "deviceId",
54907
55161
  form: "single",
@@ -54912,6 +55166,11 @@ Object.freeze({
54912
55166
  form: "single",
54913
55167
  optional: false
54914
55168
  }],
55169
+ "nativeObjectDetection.getStatus": [{
55170
+ name: "deviceId",
55171
+ form: "single",
55172
+ optional: false
55173
+ }],
54915
55174
  "nativeObjectDetection.setEnabled": [{
54916
55175
  name: "deviceId",
54917
55176
  form: "single",
@@ -54927,6 +55186,11 @@ Object.freeze({
54927
55186
  form: "single",
54928
55187
  optional: false
54929
55188
  }],
55189
+ "navigation.getStatus": [{
55190
+ name: "deviceId",
55191
+ form: "single",
55192
+ optional: false
55193
+ }],
54930
55194
  "navigation.goToPoint": [{
54931
55195
  name: "deviceId",
54932
55196
  form: "single",
@@ -54972,6 +55236,11 @@ Object.freeze({
54972
55236
  form: "single",
54973
55237
  optional: false
54974
55238
  }],
55239
+ "networkLink.getStatus": [{
55240
+ name: "deviceId",
55241
+ form: "single",
55242
+ optional: false
55243
+ }],
54975
55244
  "networkQuality.getDeviceStats": [{
54976
55245
  name: "deviceId",
54977
55246
  form: "single",
@@ -54997,11 +55266,26 @@ Object.freeze({
54997
55266
  form: "single",
54998
55267
  optional: false
54999
55268
  }],
55269
+ "notifier.getStatus": [{
55270
+ name: "deviceId",
55271
+ form: "single",
55272
+ optional: false
55273
+ }],
55000
55274
  "notifier.send": [{
55001
55275
  name: "deviceId",
55002
55276
  form: "single",
55003
55277
  optional: false
55004
55278
  }],
55279
+ "numericSensor.getStatus": [{
55280
+ name: "deviceId",
55281
+ form: "single",
55282
+ optional: false
55283
+ }],
55284
+ "osd.getStatus": [{
55285
+ name: "deviceId",
55286
+ form: "single",
55287
+ optional: false
55288
+ }],
55005
55289
  "osd.setOverlay": [{
55006
55290
  name: "deviceId",
55007
55291
  form: "single",
@@ -55061,6 +55345,11 @@ Object.freeze({
55061
55345
  form: "single",
55062
55346
  optional: false
55063
55347
  }],
55348
+ "petFeeder.getStatus": [{
55349
+ name: "deviceId",
55350
+ form: "single",
55351
+ optional: false
55352
+ }],
55064
55353
  "petFeeder.markFoodReplenished": [{
55065
55354
  name: "deviceId",
55066
55355
  form: "single",
@@ -55096,6 +55385,11 @@ Object.freeze({
55096
55385
  form: "single",
55097
55386
  optional: false
55098
55387
  }],
55388
+ "pipelineAnalytics.applyDeviceSettingsPatch": [{
55389
+ name: "deviceId",
55390
+ form: "single",
55391
+ optional: false
55392
+ }],
55099
55393
  "pipelineAnalytics.clearTrackRelation": [{
55100
55394
  name: "deviceId",
55101
55395
  form: "single",
@@ -55136,6 +55430,16 @@ Object.freeze({
55136
55430
  form: "single",
55137
55431
  optional: false
55138
55432
  }],
55433
+ "pipelineAnalytics.getDeviceLiveContribution": [{
55434
+ name: "deviceId",
55435
+ form: "single",
55436
+ optional: false
55437
+ }],
55438
+ "pipelineAnalytics.getDeviceSettingsContribution": [{
55439
+ name: "deviceId",
55440
+ form: "single",
55441
+ optional: false
55442
+ }],
55139
55443
  "pipelineAnalytics.getEventDensity": [{
55140
55444
  name: "deviceId",
55141
55445
  form: "single",
@@ -55351,6 +55655,11 @@ Object.freeze({
55351
55655
  form: "single",
55352
55656
  optional: true
55353
55657
  }],
55658
+ "pipelineOrchestrator.applyDeviceSettingsPatch": [{
55659
+ name: "deviceId",
55660
+ form: "single",
55661
+ optional: false
55662
+ }],
55354
55663
  "pipelineOrchestrator.assignAudio": [{
55355
55664
  name: "deviceId",
55356
55665
  form: "single",
@@ -55396,6 +55705,16 @@ Object.freeze({
55396
55705
  form: "single",
55397
55706
  optional: false
55398
55707
  }],
55708
+ "pipelineOrchestrator.getDeviceLiveContribution": [{
55709
+ name: "deviceId",
55710
+ form: "single",
55711
+ optional: false
55712
+ }],
55713
+ "pipelineOrchestrator.getDeviceSettingsContribution": [{
55714
+ name: "deviceId",
55715
+ form: "single",
55716
+ optional: false
55717
+ }],
55399
55718
  "pipelineOrchestrator.getPipelineAssignment": [{
55400
55719
  name: "deviceId",
55401
55720
  form: "single",
@@ -55516,11 +55835,31 @@ Object.freeze({
55516
55835
  form: "single",
55517
55836
  optional: true
55518
55837
  }],
55838
+ "powerMeter.getStatus": [{
55839
+ name: "deviceId",
55840
+ form: "single",
55841
+ optional: false
55842
+ }],
55843
+ "presence.getStatus": [{
55844
+ name: "deviceId",
55845
+ form: "single",
55846
+ optional: false
55847
+ }],
55848
+ "pressureSensor.getStatus": [{
55849
+ name: "deviceId",
55850
+ form: "single",
55851
+ optional: false
55852
+ }],
55519
55853
  "privacyMask.getOptions": [{
55520
55854
  name: "deviceId",
55521
55855
  form: "single",
55522
55856
  optional: false
55523
55857
  }],
55858
+ "privacyMask.getStatus": [{
55859
+ name: "deviceId",
55860
+ form: "single",
55861
+ optional: false
55862
+ }],
55524
55863
  "privacyMask.setAudioEnabled": [{
55525
55864
  name: "deviceId",
55526
55865
  form: "single",
@@ -55571,6 +55910,11 @@ Object.freeze({
55571
55910
  form: "single",
55572
55911
  optional: false
55573
55912
  }],
55913
+ "ptz.getStatus": [{
55914
+ name: "deviceId",
55915
+ form: "single",
55916
+ optional: false
55917
+ }],
55574
55918
  "ptz.goHome": [{
55575
55919
  name: "deviceId",
55576
55920
  form: "single",
@@ -55661,6 +56005,11 @@ Object.freeze({
55661
56005
  form: "single",
55662
56006
  optional: false
55663
56007
  }],
56008
+ "recordingArchive.applyDeviceSettingsPatch": [{
56009
+ name: "deviceId",
56010
+ form: "single",
56011
+ optional: false
56012
+ }],
55664
56013
  "recordingArchive.deleteFootprint": [{
55665
56014
  name: "deviceId",
55666
56015
  form: "single",
@@ -55681,6 +56030,21 @@ Object.freeze({
55681
56030
  form: "single",
55682
56031
  optional: false
55683
56032
  }],
56033
+ "recordingArchive.getDeviceLiveContribution": [{
56034
+ name: "deviceId",
56035
+ form: "single",
56036
+ optional: false
56037
+ }],
56038
+ "recordingArchive.getDeviceSettingsContribution": [{
56039
+ name: "deviceId",
56040
+ form: "single",
56041
+ optional: false
56042
+ }],
56043
+ "recordingArchive.getStatus": [{
56044
+ name: "deviceId",
56045
+ form: "single",
56046
+ optional: false
56047
+ }],
55684
56048
  "recordingArchive.listOpsLog": [{
55685
56049
  name: "deviceId",
55686
56050
  form: "single",
@@ -55766,6 +56130,11 @@ Object.freeze({
55766
56130
  form: "single",
55767
56131
  optional: false
55768
56132
  }],
56133
+ "recordingOnboard.getStatus": [{
56134
+ name: "deviceId",
56135
+ form: "single",
56136
+ optional: false
56137
+ }],
55769
56138
  "recordingOnboard.setSettings": [{
55770
56139
  name: "deviceId",
55771
56140
  form: "single",
@@ -55796,6 +56165,11 @@ Object.freeze({
55796
56165
  form: "single",
55797
56166
  optional: false
55798
56167
  }],
56168
+ "sceneMonitor.getStatus": [{
56169
+ name: "deviceId",
56170
+ form: "single",
56171
+ optional: false
56172
+ }],
55799
56173
  "sceneMonitor.listScenes": [{
55800
56174
  name: "deviceId",
55801
56175
  form: "single",
@@ -55821,6 +56195,11 @@ Object.freeze({
55821
56195
  form: "single",
55822
56196
  optional: false
55823
56197
  }],
56198
+ "scriptRunner.getStatus": [{
56199
+ name: "deviceId",
56200
+ form: "single",
56201
+ optional: false
56202
+ }],
55824
56203
  "scriptRunner.run": [{
55825
56204
  name: "deviceId",
55826
56205
  form: "single",
@@ -55831,11 +56210,31 @@ Object.freeze({
55831
56210
  form: "single",
55832
56211
  optional: false
55833
56212
  }],
56213
+ "smoke.getStatus": [{
56214
+ name: "deviceId",
56215
+ form: "single",
56216
+ optional: false
56217
+ }],
56218
+ "snapshot.applyDeviceSettingsPatch": [{
56219
+ name: "deviceId",
56220
+ form: "single",
56221
+ optional: false
56222
+ }],
55834
56223
  "snapshot.getDebugState": [{
55835
56224
  name: "deviceId",
55836
56225
  form: "single",
55837
56226
  optional: false
55838
56227
  }],
56228
+ "snapshot.getDeviceLiveContribution": [{
56229
+ name: "deviceId",
56230
+ form: "single",
56231
+ optional: false
56232
+ }],
56233
+ "snapshot.getDeviceSettingsContribution": [{
56234
+ name: "deviceId",
56235
+ form: "single",
56236
+ optional: false
56237
+ }],
55839
56238
  "snapshot.getSnapshot": [{
55840
56239
  name: "deviceId",
55841
56240
  form: "single",
@@ -55852,6 +56251,11 @@ Object.freeze({
55852
56251
  form: "array",
55853
56252
  optional: false
55854
56253
  }],
56254
+ "snapshot.getStatus": [{
56255
+ name: "deviceId",
56256
+ form: "single",
56257
+ optional: false
56258
+ }],
55855
56259
  "snapshot.invalidateCache": [{
55856
56260
  name: "deviceId",
55857
56261
  form: "single",
@@ -55862,6 +56266,11 @@ Object.freeze({
55862
56266
  form: "single",
55863
56267
  optional: false
55864
56268
  }],
56269
+ "streamBroker.applyDeviceSettingsPatch": [{
56270
+ name: "deviceId",
56271
+ form: "single",
56272
+ optional: false
56273
+ }],
55865
56274
  "streamBroker.assignProfile": [{
55866
56275
  name: "deviceId",
55867
56276
  form: "single",
@@ -55877,6 +56286,16 @@ Object.freeze({
55877
56286
  form: "single",
55878
56287
  optional: false
55879
56288
  }],
56289
+ "streamBroker.getDeviceLiveContribution": [{
56290
+ name: "deviceId",
56291
+ form: "single",
56292
+ optional: false
56293
+ }],
56294
+ "streamBroker.getDeviceSettingsContribution": [{
56295
+ name: "deviceId",
56296
+ form: "single",
56297
+ optional: false
56298
+ }],
55880
56299
  "streamBroker.getStreamWithCodec": [{
55881
56300
  name: "deviceId",
55882
56301
  form: "single",
@@ -55937,16 +56356,46 @@ Object.freeze({
55937
56356
  form: "single",
55938
56357
  optional: false
55939
56358
  }],
56359
+ "streamParams.getStatus": [{
56360
+ name: "deviceId",
56361
+ form: "single",
56362
+ optional: false
56363
+ }],
55940
56364
  "streamParams.setProfile": [{
55941
56365
  name: "deviceId",
55942
56366
  form: "single",
55943
56367
  optional: false
55944
56368
  }],
56369
+ "switch.getStatus": [{
56370
+ name: "deviceId",
56371
+ form: "single",
56372
+ optional: false
56373
+ }],
55945
56374
  "switch.setState": [{
55946
56375
  name: "deviceId",
55947
56376
  form: "single",
55948
56377
  optional: false
55949
56378
  }],
56379
+ "tamper.getStatus": [{
56380
+ name: "deviceId",
56381
+ form: "single",
56382
+ optional: false
56383
+ }],
56384
+ "temperatureSensor.getStatus": [{
56385
+ name: "deviceId",
56386
+ form: "single",
56387
+ optional: false
56388
+ }],
56389
+ "update.getStatus": [{
56390
+ name: "deviceId",
56391
+ form: "single",
56392
+ optional: false
56393
+ }],
56394
+ "vacuumControl.getStatus": [{
56395
+ name: "deviceId",
56396
+ form: "single",
56397
+ optional: false
56398
+ }],
55950
56399
  "vacuumControl.locate": [{
55951
56400
  name: "deviceId",
55952
56401
  form: "single",
@@ -55982,6 +56431,11 @@ Object.freeze({
55982
56431
  form: "single",
55983
56432
  optional: false
55984
56433
  }],
56434
+ "valve.getStatus": [{
56435
+ name: "deviceId",
56436
+ form: "single",
56437
+ optional: false
56438
+ }],
55985
56439
  "valve.open": [{
55986
56440
  name: "deviceId",
55987
56441
  form: "single",
@@ -55997,6 +56451,11 @@ Object.freeze({
55997
56451
  form: "single",
55998
56452
  optional: false
55999
56453
  }],
56454
+ "vibration.getStatus": [{
56455
+ name: "deviceId",
56456
+ form: "single",
56457
+ optional: false
56458
+ }],
56000
56459
  "videoclips.dialClipStream": [{
56001
56460
  name: "deviceId",
56002
56461
  form: "single",
@@ -56032,6 +56491,11 @@ Object.freeze({
56032
56491
  form: "single",
56033
56492
  optional: false
56034
56493
  }],
56494
+ "waterHeater.getStatus": [{
56495
+ name: "deviceId",
56496
+ form: "single",
56497
+ optional: false
56498
+ }],
56035
56499
  "waterHeater.setAway": [{
56036
56500
  name: "deviceId",
56037
56501
  form: "single",
@@ -56047,6 +56511,11 @@ Object.freeze({
56047
56511
  form: "single",
56048
56512
  optional: false
56049
56513
  }],
56514
+ "weather.getStatus": [{
56515
+ name: "deviceId",
56516
+ form: "single",
56517
+ optional: false
56518
+ }],
56050
56519
  "webrtcSession.addIceCandidate": [{
56051
56520
  name: "deviceId",
56052
56521
  form: "single",
@@ -56864,7 +57333,7 @@ var PreviewTextField = string().max(200);
56864
57333
  * Whether the notification's preview is a STILL or a short animation.
56865
57334
  *
56866
57335
  * The operator's ask, verbatim: *"inviato come gif o video (come per le altre
56867
- * rule)"* — the other rules already offer an animated preview, and a ten-hour
57336
+ * rule)"* [sent as a gif or video (as for the other rules)] — the other rules already offer an animated preview, and a ten-hour
56868
57337
  * night reads better as three seconds of motion than as one frame of it. Both
56869
57338
  * modes get the SAME treatment (blurred frame, large centred title); `'gif'`
56870
57339
  * simply applies it to a dozen frames sampled across the render and assembles