@camstack/addon-model-studio 1.1.189 → 1.1.191

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-FMiMjTOe.mjs → MotionZonesSettings-BPTwSN9l.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-C54kjXje.mjs → PrivacyMaskSettings-BUeTedM4.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-D3mHd1Bs.mjs → SceneMonitorEditor-WRXqYE4X.mjs} +3 -3
  4. package/dist/_stub.js +2931 -2928
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-DRuIjSMF.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-DajnZUDj.mjs} +3 -3
  6. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-VZy4YTrJ.mjs +26 -0
  7. package/dist/{hostInit-CWX7SB3f.mjs → hostInit-BSJgrQAJ.mjs} +2 -2
  8. package/dist/model-studio.addon.js +610 -141
  9. package/dist/model-studio.addon.mjs +610 -141
  10. package/dist/{player-overlays-BR1a0BDm.mjs → player-overlays-BcG6COgL.mjs} +1 -1
  11. package/dist/remoteEntry.js +1 -1
  12. package/dist/{responsive-BoGo5jZn.mjs → responsive-CYpgwv3g.mjs} +1 -1
  13. package/dist/{scene-monitor-copy-0evm2MrA.mjs → scene-monitor-copy-DvrdS2az.mjs} +1 -1
  14. package/dist/{square-NiMmxe53.mjs → square-BRARfL3C.mjs} +1 -1
  15. package/dist/{trash-2-DD3Sx3hW.mjs → trash-2-DLomxTVm.mjs} +1 -1
  16. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-DM0hkCAJ.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-DFLwncq5.mjs} +1 -1
  17. package/package.json +1 -3
  18. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-C8mPXBuv.mjs +0 -26
@@ -8060,7 +8060,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
8060
8060
  return DeviceRole;
8061
8061
  }({});
8062
8062
  //#endregion
8063
- //#region ../types/dist/composition-43aqsZQj.mjs
8063
+ //#region ../types/dist/composition-Bzr7GwgP.mjs
8064
8064
  /**
8065
8065
  * The ffmpeg build every CamStack node downloads, per platform and arch.
8066
8066
  *
@@ -8114,20 +8114,20 @@ function portable(target) {
8114
8114
  }
8115
8115
  portable("linux64"), portable("linuxarm64"), portable("macarm64"), portable("mac64");
8116
8116
  /**
8117
- * LA tabella "quale booleano di questo tipo di device conta come ALTO", e il
8118
- * valutatore puro del suo FRONTE.
8117
+ * THE table "which boolean of this device type counts as HIGH", and the
8118
+ * pure evaluator of its EDGE.
8119
8119
  *
8120
- * UNA tabella per tutti quelli che chiedono "questo device è ALTO?": il
8121
- * trigger `RecordingTriggers.sensorDeviceIds` del recorder, i marker dei
8122
- * sensori della post-analysis, il bridge camera-sensors dell'orchestratore e
8123
- * le sorgenti di un campanello composto (`doorbellFeatureSources`, D671).
8124
- * Una seconda copia divergerebbe alla prima cap aggiunta, e il sintomo — "il
8125
- * sensore fa suonare il campanello ma non registra" — è esattamente D62.
8120
+ * ONE table for everyone who asks "is this device HIGH?": the
8121
+ * recorder's `RecordingTriggers.sensorDeviceIds` trigger, the post-analysis
8122
+ * sensor markers, the orchestrator's camera-sensors bridge and
8123
+ * the sources of a composite doorbell (`doorbellFeatureSources`, D671).
8124
+ * A second copy would diverge at the first cap added, and the symptom — "the
8125
+ * sensor rings the doorbell but does not record" — is exactly D62.
8126
8126
  *
8127
- * ⚠ NON è `DEVICE_STATE_READERS` (`catalogs/device-state-vocabulary.ts`), e le
8128
- * due non vanno unificate: quella risponde a "qual è la PAROLA di stato per una
8129
- * regola" (e include `presence`, `cover`, `alarm-panel`), questa a "qual è il
8130
- * booleano il cui FRONTE conta". Vocabolari deliberatamente diversi.
8127
+ * ⚠ NOT `DEVICE_STATE_READERS` (`catalogs/device-state-vocabulary.ts`), and the
8128
+ * two must not be unified: that one answers "what is the state WORD for a
8129
+ * rule" (and includes `presence`, `cover`, `alarm-panel`), this one "which
8130
+ * boolean's EDGE counts". Deliberately different vocabularies.
8131
8131
  */
8132
8132
  /**
8133
8133
  * Known binary / switch source caps → the boolean slice field whose
@@ -8148,6 +8148,8 @@ var SOURCE_CAP_ACTIVE_FIELD = {
8148
8148
  vibration: "detected",
8149
8149
  tamper: "tampered"
8150
8150
  };
8151
+ /** Cap names whose presence in a device's bindings qualify it as a source. */
8152
+ var SOURCE_CAPS = Object.keys(SOURCE_CAP_ACTIVE_FIELD);
8151
8153
  /**
8152
8154
  * Error types for the safe expression engine. Two distinct classes so callers
8153
8155
  * can tell a compile-time (grammar) failure from a runtime (evaluation)
@@ -9734,22 +9736,22 @@ var CLASS_MAP_MACRO_TARGETS = [
9734
9736
  "package"
9735
9737
  ];
9736
9738
  /**
9737
- * Le macro classi di PRIMO LIVELLO: quelle che un object detector emette e che
9738
- * un operatore può selezionare.
9739
+ * The FIRST-LEVEL macro classes: those an object detector emits and that
9740
+ * an operator can select.
9739
9741
  *
9740
- * Sono le tre offerte dallo step `object-detection`
9742
+ * They are the three offered by the `object-detection` step
9741
9743
  * (`addon-pipeline/src/detection-pipeline/registry/step-definitions.ts`,
9742
- * `enabledMacroClasses`). `package` sta in {@link CLASS_MAP_MACRO_TARGETS} e in
9743
- * `MACRO_LABELS` — è una macro vera — ma NON qui: appartiene allo step
9744
- * `package-detection`, la cui abilitazione è guidata dalle zone, e offrire la
9745
- * stessa parola due volte ha già fatto accendere a un operatore il proxy COCO
9744
+ * `enabledMacroClasses`). `package` is in {@link CLASS_MAP_MACRO_TARGETS} and in
9745
+ * `MACRO_LABELS` — it is a true macro — but NOT here: it belongs to the step
9746
+ * `package-detection`, whose enablement is driven by zones, and offering the
9747
+ * same word twice has already made an operator turn on the COCO proxy
9746
9748
  * (suitcase/backpack/handbag) lasciando spento il detector dedicato.
9747
9749
  *
9748
- * UNA lista. Prima di oggi le stesse tre erano scritte a mano nell'offerta
9749
- * dello step e una seconda volta come union `FirstLevelMacro`
9750
- * (`types/detection.ts`); una terza copia per il trigger di registrazione
9751
- * (`RecordingTriggers.objectClasses`) avrebbe reso invisibile la divergenza
9752
- * successiva.
9750
+ * ONE list. Before today the same three were hand-written in the step's offer
9751
+ * and a second time as the union `FirstLevelMacro`
9752
+ * (`types/detection.ts`); a third copy for the recording trigger
9753
+ * (`RecordingTriggers.objectClasses`) would have made the later divergence
9754
+ * invisible.
9753
9755
  */
9754
9756
  var FIRST_LEVEL_MACRO_CLASSES = [
9755
9757
  "person",
@@ -9814,17 +9816,17 @@ var RecordingStorageModeSchema = _enum([
9814
9816
  "on-device-decision"
9815
9817
  ]);
9816
9818
  /**
9817
- * Le macro classi che possono aprire una finestra di registrazione — le stesse
9818
- * tre offerte dallo step `object-detection`, da UNA lista
9819
+ * The macro classes that can open a recording window — the same
9820
+ * three offered by the `object-detection` step, from ONE list
9819
9821
  * ({@link FIRST_LEVEL_MACRO_CLASSES}).
9820
9822
  */
9821
9823
  var RecordingObjectTriggerClassSchema = _enum(FIRST_LEVEL_MACRO_CLASSES);
9822
9824
  /**
9823
- * True quando `values` non ripete un elemento.
9825
+ * True when `values` does not repeat an element.
9824
9826
  *
9825
- * Un duplicato non è innocuo: ogni voce di `objectClasses` / `sensorDeviceIds`
9826
- * diventa una SORGENTE in `bandTriggerSources`, e la stessa sorgente due volte
9827
- * conterebbe due volte le sue finestre in `segmentMissedByMs`.
9827
+ * A duplicate is not harmless: every entry of `objectClasses` / `sensorDeviceIds`
9828
+ * becomes a SOURCE in `bandTriggerSources`, and the same source twice
9829
+ * would count its windows twice in `segmentMissedByMs`.
9828
9830
  */
9829
9831
  var noDuplicates = (values) => new Set(values).size === values.length;
9830
9832
  /** Which detectors trigger an `events`-mode band. */
@@ -9832,34 +9834,34 @@ var RecordingTriggersSchema = object({
9832
9834
  motion: boolean().optional(),
9833
9835
  audioThresholdDbfs: number().optional(),
9834
9836
  /**
9835
- * Le macro classi la cui detection apre una finestra. ASSENTE = la sorgente
9836
- * non è ascoltata; un array VUOTO è rifiutato, perché "banda events, trigger
9837
- * object acceso, nessuna classe" è la stessa forma "abilitata e non registra
9838
- * nulla, per sempre" contro cui è scritto `eventsBandCanEverDemand`.
9837
+ * The macro classes whose detection opens a window. ABSENT = the source
9838
+ * is not listened to; an EMPTY array is rejected, because "events band, object
9839
+ * trigger on, no class" is the same shape "enabled and records
9840
+ * nothing, forever" that `eventsBandCanEverDemand` is written against.
9839
9841
  *
9840
- * Il segnale letto è GIÀ FILTRATO: solo detection `source: 'pipeline'`, cioè
9841
- * quelle che hanno attraversato `enabledMacroClasses`, i
9842
- * `minConfidence<Macro>` e il full-frame guard. L'AI a bordo camera
9843
- * (`source: 'onboard'`) non attraversa nessuno di quei gate e NON apre
9844
- * finestre — vedi `recorder/object-trigger.ts`.
9842
+ * The signal read is ALREADY FILTERED: only `source: 'pipeline'` detections, i.e.
9843
+ * those that went through `enabledMacroClasses`, the
9844
+ * `minConfidence<Macro>` and the full-frame guard. The camera's onboard AI
9845
+ * (`source: 'onboard'`) goes through none of those gates and does NOT open
9846
+ * windows — see `recorder/object-trigger.ts`.
9845
9847
  */
9846
9848
  objectClasses: array(RecordingObjectTriggerClassSchema).min(1).refine(noDuplicates, { message: "objectClasses must not repeat a class" }).optional(),
9847
9849
  /**
9848
- * I device LINKED il cui FRONTE ALTO apre una finestra. Assente = la sorgente
9849
- * non è ascoltata; un array vuoto è rifiutato per la stessa ragione di
9850
+ * The LINKED devices whose RISING EDGE opens a window. Absent = the source
9851
+ * is not listened to; an empty array is rejected for the same reason as
9850
9852
  * `objectClasses`.
9851
9853
  *
9852
- * Sono id di device SORGENTE, non camere: la banda li nomina, quindi il
9853
- * percorso caldo (`DeviceStateChanged`, a ritmo di bus su tutta la flotta)
9854
- * non fa RPC. L'OFFERTA da cui l'operatore li sceglie è un'altra domanda, e
9855
- * si risolve con `deviceManager.getLinkedDevices` + `getBindingsBatch` per
9856
- * device (D12) — mai un elenco globale di cap.
9854
+ * These are SOURCE device ids, not cameras: the band names them, so the
9855
+ * hot path (`DeviceStateChanged`, at bus rate across the whole fleet)
9856
+ * does no RPC. The OFFER from which the operator picks them is another question, and
9857
+ * is resolved with `deviceManager.getLinkedDevices` + `getBindingsBatch` per
9858
+ * device (D12) — never a global list of caps.
9857
9859
  *
9858
- * Cosa vuol dire "alto" dipende dal TIPO di device e non è deciso qui:
9859
- * `SOURCE_CAP_ACTIVE_FIELD` (`catalogs/sensor-active-state.ts`) è LA tabella,
9860
- * la stessa del campanello composto (D671). Ed è il FRONTE, non
9861
- * il livello: un contatto trovato già aperto al riavvio del runner non fa
9862
- * registrare.
9860
+ * What "high" means depends on the device TYPE and is not decided here:
9861
+ * `SOURCE_CAP_ACTIVE_FIELD` (`catalogs/sensor-active-state.ts`) is THE table,
9862
+ * the same one as the composite doorbell (D671). And it is the EDGE, not
9863
+ * the level: a contact found already open at runner restart does not
9864
+ * record.
9863
9865
  */
9864
9866
  sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional()
9865
9867
  });
@@ -10936,7 +10938,7 @@ var DecoderSessionConfigSchema = object({
10936
10938
  * - **VALUE** — at which level, for which scope, until when. That stays ONE
10937
10939
  * thing: the logging settings document on the `system` cap. Two authorities
10938
10940
  * over the values is the exact defect
10939
- * `docs/design/plans/2026-08-26-logging-per-componente.md` was written to
10941
+ * `docs/design/plans/2026-08-26-per-component-logging.md` was written to
10940
10942
  * remove; re-introducing it from the cure side would be grotesque.
10941
10943
  *
10942
10944
  * Nothing in this file reads a clock, an env var or a store. The registry is
@@ -12665,7 +12667,7 @@ var BrokerStatusEnum = _enum([
12665
12667
  "unreachable",
12666
12668
  "error"
12667
12669
  ]);
12668
- var BrokerInfoSchema$1 = object({
12670
+ var BrokerInfoSchema = object({
12669
12671
  /** Stable broker id. Persisted; survives addon restarts. */
12670
12672
  id: string(),
12671
12673
  /** Addon id of the provider that OWNS this broker.
@@ -12798,7 +12800,7 @@ var GetStateInputSchema = object({
12798
12800
  * HA: entity_id (returns the cached entity state). */
12799
12801
  key: string()
12800
12802
  });
12801
- method(ListInputSchema, array(BrokerInfoSchema$1)), method(GetInputSchema, BrokerInfoSchema$1.nullable()), method(_void(), array(BrokerProviderInfoSchema), { auth: "admin" }), method(AddInputSchema, AddResultSchema, {
12803
+ method(ListInputSchema, array(BrokerInfoSchema)), method(GetInputSchema, BrokerInfoSchema.nullable()), method(_void(), array(BrokerProviderInfoSchema), { auth: "admin" }), method(AddInputSchema, AddResultSchema, {
12802
12804
  kind: "mutation",
12803
12805
  auth: "admin"
12804
12806
  }), method(RemoveInputSchema, _void(), {
@@ -14423,7 +14425,7 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
14423
14425
  *
14424
14426
  * ⚠ An earlier version of this comment blamed Zod stripping, and that
14425
14427
  * was wrong — corrected 2026-08-26 after the hop map
14426
- * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
14428
+ * (`docs/design/2026-08-26-topic-hop-map.md`) traced the path.
14427
14429
  * There is **no Zod parse at all** between the door and the engine: the
14428
14430
  * dispatcher forwards the payload verbatim and UDS carries it whole. A
14429
14431
  * field declared here reaches `SqliteSettingsBackend` either way.
@@ -15179,7 +15181,17 @@ var SiteZoneSchema = object({
15179
15181
  var ProviderStatusSchema = object({
15180
15182
  connected: boolean(),
15181
15183
  deviceCount: number(),
15182
- error: string().optional()
15184
+ error: string().optional(),
15185
+ /**
15186
+ * `'orchestrator'`: this provider writes NO camera's `motion` runtime slice
15187
+ * — the orchestrator is its only writer (D696). Set by `BaseDeviceProvider`,
15188
+ * which every provider bundles, so only a provider BUILT from D696-amended
15189
+ * code says it. ABSENT means an older provider that may still write it (raw
15190
+ * VMD writes, a boot seed), and the orchestrator's provider gate keeps that
15191
+ * provider's cameras unwritten (`camera-sensors/motion-slice-provider-gate.ts`)
15192
+ * — the provider twin of the runner's `getLocalLoad().motionSliceWriter`.
15193
+ */
15194
+ motionSliceWriter: literal("orchestrator").optional()
15183
15195
  });
15184
15196
  object({
15185
15197
  externalId: string(),
@@ -16315,7 +16327,7 @@ method(object({
16315
16327
  * per-device window, `KeyFrameCaptureLog`, `bumpCropMetric`. Every one of them
16316
16328
  * ends in a log line, and a log line is the thing the operator asked to stop
16317
16329
  * needing: *"possiamo armare questi errori intanto? Così al prossimo giro
16318
- * ricontrolliamo tutti questi punti"*. Reading them meant grepping Loki and
16330
+ * 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
16319
16331
  * hand-correlating timestamps, which is how a 22% thumbnail gap and a 3-hour
16320
16332
  * media blackout were both diagnosed. The counters stay; this is where they can
16321
16333
  * be READ.
@@ -17697,7 +17709,7 @@ var BrokerStatusSchema$1 = _enum([
17697
17709
  "unreachable",
17698
17710
  "tls-error"
17699
17711
  ]);
17700
- var BrokerInfoSchema = object({
17712
+ var BrokerInfoSchema$1 = object({
17701
17713
  id: string(),
17702
17714
  name: string(),
17703
17715
  url: string(),
@@ -17760,7 +17772,7 @@ var StatusSchema = object({
17760
17772
  brokerCount: number(),
17761
17773
  embeddedRunning: boolean()
17762
17774
  });
17763
- method(_void(), array(BrokerInfoSchema)), method(IdInputSchema, BrokerConnectionDetailsSchema, { auth: "admin" }), method(AddBrokerInputSchema, AddBrokerResultSchema, {
17775
+ method(_void(), array(BrokerInfoSchema$1)), method(IdInputSchema, BrokerConnectionDetailsSchema, { auth: "admin" }), method(AddBrokerInputSchema, AddBrokerResultSchema, {
17764
17776
  kind: "mutation",
17765
17777
  auth: "admin"
17766
17778
  }), method(IdInputSchema, _void(), {
@@ -19936,78 +19948,16 @@ var NcRuleInputSchema = object({
19936
19948
  */
19937
19949
  confirm: NcConfirmSchema.optional(),
19938
19950
  /**
19939
- * WAIT for face/plate recognition before saying anything.
19940
- *
19941
- * A notification's TEXT is frozen at enqueue and its media is re-resolved at
19942
- * send; the identity is neither. A face is confirmed after `confirmFrames`
19943
- * agreeing observations — p50 **11.4 s** after the track was first seen,
19944
- * measured on this hub — and an `immediate` rule enqueues on the first object
19945
- * event, seconds before that. So "Gianluca è arrivato" is unsayable on the
19946
- * immediate path, and no amount of media re-resolution fixes a sentence.
19947
- *
19948
- * Only two honest answers exist, and this flag picks between them. It has
19949
- * effect ONLY on a rule that declares a recognition scope
19950
- * ({@link NcConditions.identities} or {@link NcConditions.plates}) — on any
19951
- * other rule there is nothing to wait for and the flag is inert.
19952
- *
19953
- * | value | what happens |
19954
- * | --- | --- |
19955
- * | `true` | the rule stops firing on the object event and fires at TRACK CLOSE instead, once, with the name — later, and complete |
19956
- * | 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) |
19957
- *
19958
- * `.optional()` and deliberately NOT `.default()`: a Zod default does not run
19959
- * on the addon cap path, and absent has to keep meaning exactly what every
19960
- * rule authored before this field meant.
19961
- *
19962
- * The cost of `true` is stated here because the editor states it too: a rule
19963
- * that waits also inherits track-close SEMANTICS — its `zones` condition
19964
- * tests every zone the track visited and a `crossing` condition can no longer
19965
- * be satisfied, because a closed track carries no crossing.
19966
- */
19967
- waitForEnhancement: boolean().optional(),
19968
- /**
19969
- * GROUP a burst of subjects into ONE notification that grows.
19970
- *
19971
- * Seconds of quiet after the last matching subject before the burst is
19972
- * considered over. While it is open, the first subject enqueues immediately —
19973
- * **exactly as today, with no added latency** — and every real growth (a new
19974
- * subject, or a name confirmed on one already in it) REPLACES that
19975
- * notification with an updated one naming everybody. The push carries the
19976
- * group's own coalescing tag, so the phone replaces rather than stacks.
19977
- *
19978
- * `0` / absent = off, and off is today's behaviour byte for byte.
19979
- *
19980
- * ### Why an idle cutoff and not a window
19981
- *
19982
- * The measured seven-person arrival on device 590 spans 110 s with every
19983
- * internal gap under 30 s. A 12 s fixed window cuts it into three groups; an
19984
- * idle cutoff holds it as one and ends it when the arrival actually ends.
19985
- * 30 s is a widely shipped value for the same decision.
19986
- *
19987
- * ### What it replaces
19988
- *
19989
- * The blind cooldown, which collapses a burst by DISCARDING it. Measured on
19990
- * device 615 / *Persona su Uscio* over six days: 116 qualifying tracks → 74
19991
- * notifications, **44 (37.9%) suppressed outright**, 23 of them overlapping a
19992
- * track that did fire and 7 carrying a confirmed identity nobody heard about.
19993
- * A group collapses the same volume by MERGING, so the cooldown becomes a
19994
- * budget over GROUPS — which is what it always meant — and a growth is never
19995
- * throttled by the window its own first member spent.
19996
- *
19997
- * ### Interaction with {@link waitForEnhancement}
19998
- *
19999
- * They compose, and the order matters. `waitForEnhancement` defers the rule to
20000
- * TRACK CLOSE, so with both set the group is opened by the first member to
20001
- * CLOSE — already carrying its name — and grows as later members close. That
20002
- * is later, and complete. With grouping alone the group opens on the first
20003
- * object event and picks up names as they are confirmed, through the growth
20004
- * path. Neither combination fires twice for one subject.
20005
- *
20006
- * `.optional()` and deliberately NOT `.default()`: a Zod default does not run
20007
- * on the addon cap path, so absent must keep meaning what it meant before this
20008
- * field existed.
19951
+ * IMMEDIATE GROUPED (D692): the first matching subject opens a window of this many
19952
+ * seconds; the rule sends ONE message when the window closes — early, once every
19953
+ * subject in it is final, never before {@link NC_GROUPING_MIN_SEC} — naming everybody
19954
+ * the rule matched, with one mosaic tile per subject.
19955
+ * Absent = plain immediate (one message per track, at the first match).
19956
+ * Only an `immediate` DETECTION rule may carry it (`ruleGroupingApplies`, enforced on
19957
+ * save by the hub's grouping guard). `.optional()`, never `.default()`: the addon cap
19958
+ * path does not run Zod defaults.
20009
19959
  */
20010
- groupIdleSec: number().int().min(0).max(600).optional()
19960
+ groupingSec: number().int().min(5).max(60).optional()
20011
19961
  });
20012
19962
  /**
20013
19963
  * Partial patch for `updateRule` — any subset of the input fields, plus the
@@ -20055,9 +20005,10 @@ var NcRuleClearableKeySchema = _enum([
20055
20005
  "targetUsers",
20056
20006
  "snoozeOptions",
20057
20007
  "snoozeAllowGlobal",
20058
- "waitForEnhancement",
20059
20008
  "actions",
20060
20009
  "confirm",
20010
+ "groupingSec",
20011
+ "waitForEnhancement",
20061
20012
  "groupIdleSec"
20062
20013
  ]);
20063
20014
  var NcRuleUpdateInputSchema = object({
@@ -20079,9 +20030,25 @@ var NcRuleSchema = NcRuleInputSchema.extend({
20079
20030
  */
20080
20031
  disabledTargetIds: array(string()).default([])
20081
20032
  });
20033
+ /**
20034
+ * The state-summary SECTIONS (D647 / D698): the D637 kind groups that report a
20035
+ * still-true state. `backups-exports` and `alarm` are not sections — a completed
20036
+ * job is not an open state, and the alarm stays instant.
20037
+ */
20038
+ var NcStateSummarySectionIdSchema = _enum([
20039
+ "device-state",
20040
+ "streams",
20041
+ "battery",
20042
+ "consumables",
20043
+ "tanks",
20044
+ "detection-blind",
20045
+ "nodes",
20046
+ "addons",
20047
+ "updates"
20048
+ ]);
20082
20049
  /** One section of a previewed state summary. `unavailable` = its state could not be read. */
20083
20050
  var NcStateSummaryPreviewSectionSchema = object({
20084
- id: string(),
20051
+ id: NcStateSummarySectionIdSchema,
20085
20052
  status: _enum(["read", "unavailable"]),
20086
20053
  items: number().int().nonnegative(),
20087
20054
  reason: string().optional()
@@ -20091,7 +20058,7 @@ var NcStateSummaryPreviewSectionSchema = object({
20091
20058
  * a `rule` split (no `section`), one section's on a `section` split.
20092
20059
  */
20093
20060
  var NcStateSummaryPreviewRowSchema = object({
20094
- section: string().optional(),
20061
+ section: NcStateSummarySectionIdSchema.optional(),
20095
20062
  /** The section's name on a per-section row; every reported section's, joined, on a combined one. */
20096
20063
  title: string(),
20097
20064
  text: string(),
@@ -21990,14 +21957,14 @@ var TrackSchema = object({
21990
21957
  * `derive-returned-null tile=standin`,
21991
21958
  * `native-tile tile=native no-key-frame-at-close`, …) written at close and
21992
21959
  * CLEARED by the late-keyFrame upgrade when a native tile lands after all.
21993
- * The operator-facing answer to "perché manca l'immagine?" on a track whose
21960
+ * The operator-facing answer to "perché manca l'immagine?" [why is the image missing?] on a track whose
21994
21961
  * tile is a face/plate stand-in, a raster crop, or an icon.
21995
21962
  *
21996
21963
  * **`no-key-frame-at-close` (D400).** The line used to be written ONLY when
21997
21964
  * the TILE ranked below native, so a track whose thumbnail landed natively
21998
21965
  * while its key frame missed carried no reason at all — three of the four
21999
21966
  * `MISSING_KEYFRAME` tracks in the 2026-09-07 operator audit were exactly
22000
- * that shape, and their "niente ultimo" had no cause anywhere on the row.
21967
+ * that shape, and their "niente ultimo" [no last frame] had no cause anywhere on the row.
22001
21968
  * The key frame is the head of a cascade (`keyFrame ⇒ keyFrameSmall ⇒ the
22002
21969
  * lastFrame copy source`), so its absence is now on this line whatever the
22003
21970
  * tile ended up being.
@@ -22084,7 +22051,7 @@ var MotionEventSchema = object({
22084
22051
  /**
22085
22052
  * Ms offsets from `timestamp` (the episode's own first rising edge, so the
22086
22053
  * first entry is always `0`) of every genuine off→on transition the
22087
- * episode saw — "ogni evento on si deve salvare" (D475). NOT one entry per
22054
+ * episode saw — "ogni evento on si deve salvare" [every ON event must be saved] (D475). NOT one entry per
22088
22055
  * push: a firmware source that keepalives at ~1 Hz for the whole burst
22089
22056
  * (Reolink, Hikvision) produces exactly one edge; a source that reports an
22090
22057
  * explicit `false` mid-episode and then resumes before the quiet window
@@ -22608,6 +22575,7 @@ var KeyEventSchema = object({
22608
22575
  bestEventId: string(),
22609
22576
  /** Track lifetime in ms (lastSeen - firstSeen). */
22610
22577
  windowMs: number().optional(),
22578
+ audioLabels: array(TrackAudioLabelSchema).readonly().optional(),
22611
22579
  ...TrackFlagFields,
22612
22580
  ...TrackRetrainFields
22613
22581
  });
@@ -27320,7 +27288,7 @@ var ClipPlaybackSchema = object({
27320
27288
  * **One authorised yes is one wake.** `next-natural` — take the clip the next
27321
27289
  * time the camera is awake for its own reasons — is deliberately not a member:
27322
27290
  * it was proposed, it is free on the battery, and the operator declined it on
27323
- * 2026-09-20 (*"Quando un export viene richiesto si sveglia la camera."*,
27291
+ * 2026-09-20 (*"Quando un export viene richiesto si sveglia la camera."* [When an export is requested the camera wakes up],
27324
27292
  * D558 "Considered and not taken").
27325
27293
  */
27326
27294
  var ClipWakeSchema = _enum(["authorised"]);
@@ -27581,7 +27549,7 @@ DeviceType.Camera, method(object({
27581
27549
  * It replaced `sources?: string[]`, a VIEW filter over source ids that
27582
27550
  * assumed the answer was a fan-out over everything a camera has. The
27583
27551
  * operator settled otherwise on 2026-09-20 — *"l'utilizzatore è uno
27584
- * solo"* — so the list is asked of one provider at a time and there is
27552
+ * solo"* [there is only one user] — so the list is asked of one provider at a time and there is
27585
27553
  * nothing to filter out of it.
27586
27554
  */
27587
27555
  provider: string().min(1)
@@ -33699,7 +33667,7 @@ var ReadGopBytesResultSchema = object({
33699
33667
  /**
33700
33668
  * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
33701
33669
  * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
33702
- * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
33670
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-clip-replay-on-pipeline.md`):
33703
33671
  * a replay needs several seconds of native pixels, not one frame.
33704
33672
  *
33705
33673
  * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
@@ -36315,6 +36283,7 @@ DeviceType.Camera, method(object({
36315
36283
  detection: array(ZoneRuleSchema).readonly(),
36316
36284
  package: array(ZoneRuleSchema).readonly()
36317
36285
  });
36286
+ SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
36318
36287
  /**
36319
36288
  * Accessory device helpers — shared across drivers.
36320
36289
  *
@@ -44877,6 +44846,11 @@ Object.freeze({
44877
44846
  }
44878
44847
  });
44879
44848
  Object.freeze({
44849
+ "accessories.getStatus": [{
44850
+ name: "deviceId",
44851
+ form: "single",
44852
+ optional: false
44853
+ }],
44880
44854
  "accessories.setChildHidden": [{
44881
44855
  name: "childDeviceId",
44882
44856
  form: "single",
@@ -44896,6 +44870,11 @@ Object.freeze({
44896
44870
  form: "single",
44897
44871
  optional: false
44898
44872
  }],
44873
+ "airQualitySensor.getStatus": [{
44874
+ name: "deviceId",
44875
+ form: "single",
44876
+ optional: false
44877
+ }],
44899
44878
  "alarmPanel.arm": [{
44900
44879
  name: "deviceId",
44901
44880
  form: "single",
@@ -44906,11 +44885,36 @@ Object.freeze({
44906
44885
  form: "single",
44907
44886
  optional: false
44908
44887
  }],
44888
+ "alarmPanel.getStatus": [{
44889
+ name: "deviceId",
44890
+ form: "single",
44891
+ optional: false
44892
+ }],
44909
44893
  "alarmPanel.trigger": [{
44910
44894
  name: "deviceId",
44911
44895
  form: "single",
44912
44896
  optional: false
44913
44897
  }],
44898
+ "ambientLightSensor.getStatus": [{
44899
+ name: "deviceId",
44900
+ form: "single",
44901
+ optional: false
44902
+ }],
44903
+ "audioAnalysis.applyDeviceSettingsPatch": [{
44904
+ name: "deviceId",
44905
+ form: "single",
44906
+ optional: false
44907
+ }],
44908
+ "audioAnalysis.getDeviceLiveContribution": [{
44909
+ name: "deviceId",
44910
+ form: "single",
44911
+ optional: false
44912
+ }],
44913
+ "audioAnalysis.getDeviceSettingsContribution": [{
44914
+ name: "deviceId",
44915
+ form: "single",
44916
+ optional: false
44917
+ }],
44914
44918
  "audioAnalysis.resolveDeviceSettings": [{
44915
44919
  name: "deviceId",
44916
44920
  form: "single",
@@ -44951,16 +44955,36 @@ Object.freeze({
44951
44955
  form: "single",
44952
44956
  optional: false
44953
44957
  }],
44958
+ "automationControl.getStatus": [{
44959
+ name: "deviceId",
44960
+ form: "single",
44961
+ optional: false
44962
+ }],
44954
44963
  "automationControl.trigger": [{
44955
44964
  name: "deviceId",
44956
44965
  form: "single",
44957
44966
  optional: false
44958
44967
  }],
44968
+ "battery.getStatus": [{
44969
+ name: "deviceId",
44970
+ form: "single",
44971
+ optional: false
44972
+ }],
44959
44973
  "battery.wakeForStream": [{
44960
44974
  name: "deviceId",
44961
44975
  form: "single",
44962
44976
  optional: false
44963
44977
  }],
44978
+ "binary.getStatus": [{
44979
+ name: "deviceId",
44980
+ form: "single",
44981
+ optional: false
44982
+ }],
44983
+ "brightness.getStatus": [{
44984
+ name: "deviceId",
44985
+ form: "single",
44986
+ optional: false
44987
+ }],
44964
44988
  "brightness.setBrightness": [{
44965
44989
  name: "deviceId",
44966
44990
  form: "single",
@@ -44976,6 +45000,26 @@ Object.freeze({
44976
45000
  form: "single",
44977
45001
  optional: false
44978
45002
  }],
45003
+ "cameraCredentials.getStatus": [{
45004
+ name: "deviceId",
45005
+ form: "single",
45006
+ optional: false
45007
+ }],
45008
+ "cameraGridLayout.applyDeviceSettingsPatch": [{
45009
+ name: "deviceId",
45010
+ form: "single",
45011
+ optional: false
45012
+ }],
45013
+ "cameraGridLayout.getDeviceLiveContribution": [{
45014
+ name: "deviceId",
45015
+ form: "single",
45016
+ optional: false
45017
+ }],
45018
+ "cameraGridLayout.getDeviceSettingsContribution": [{
45019
+ name: "deviceId",
45020
+ form: "single",
45021
+ optional: false
45022
+ }],
44979
45023
  "cameraGridLayout.getLayout": [{
44980
45024
  name: "deviceId",
44981
45025
  form: "single",
@@ -44991,6 +45035,21 @@ Object.freeze({
44991
45035
  form: "single",
44992
45036
  optional: false
44993
45037
  }],
45038
+ "cameraPipelineConfig.applyDeviceSettingsPatch": [{
45039
+ name: "deviceId",
45040
+ form: "single",
45041
+ optional: false
45042
+ }],
45043
+ "cameraPipelineConfig.getDeviceLiveContribution": [{
45044
+ name: "deviceId",
45045
+ form: "single",
45046
+ optional: false
45047
+ }],
45048
+ "cameraPipelineConfig.getDeviceSettingsContribution": [{
45049
+ name: "deviceId",
45050
+ form: "single",
45051
+ optional: false
45052
+ }],
44994
45053
  "cameraStreams.getBrokerStreams": [{
44995
45054
  name: "deviceId",
44996
45055
  form: "single",
@@ -45016,6 +45075,16 @@ Object.freeze({
45016
45075
  form: "single",
45017
45076
  optional: false
45018
45077
  }],
45078
+ "carbonMonoxide.getStatus": [{
45079
+ name: "deviceId",
45080
+ form: "single",
45081
+ optional: false
45082
+ }],
45083
+ "climateControl.getStatus": [{
45084
+ name: "deviceId",
45085
+ form: "single",
45086
+ optional: false
45087
+ }],
45019
45088
  "climateControl.setFanMode": [{
45020
45089
  name: "deviceId",
45021
45090
  form: "single",
@@ -45056,16 +45125,41 @@ Object.freeze({
45056
45125
  form: "single",
45057
45126
  optional: false
45058
45127
  }],
45128
+ "color.getStatus": [{
45129
+ name: "deviceId",
45130
+ form: "single",
45131
+ optional: false
45132
+ }],
45059
45133
  "color.setColor": [{
45060
45134
  name: "deviceId",
45061
45135
  form: "single",
45062
45136
  optional: false
45063
45137
  }],
45138
+ "connectivity.getStatus": [{
45139
+ name: "deviceId",
45140
+ form: "single",
45141
+ optional: false
45142
+ }],
45143
+ "consumables.getStatus": [{
45144
+ name: "deviceId",
45145
+ form: "single",
45146
+ optional: false
45147
+ }],
45064
45148
  "consumables.reset": [{
45065
45149
  name: "deviceId",
45066
45150
  form: "single",
45067
45151
  optional: false
45068
45152
  }],
45153
+ "contact.getStatus": [{
45154
+ name: "deviceId",
45155
+ form: "single",
45156
+ optional: false
45157
+ }],
45158
+ "control.getStatus": [{
45159
+ name: "deviceId",
45160
+ form: "single",
45161
+ optional: false
45162
+ }],
45069
45163
  "control.setValue": [{
45070
45164
  name: "deviceId",
45071
45165
  form: "single",
@@ -45076,6 +45170,11 @@ Object.freeze({
45076
45170
  form: "single",
45077
45171
  optional: false
45078
45172
  }],
45173
+ "cover.getStatus": [{
45174
+ name: "deviceId",
45175
+ form: "single",
45176
+ optional: false
45177
+ }],
45079
45178
  "cover.open": [{
45080
45179
  name: "deviceId",
45081
45180
  form: "single",
@@ -45101,6 +45200,11 @@ Object.freeze({
45101
45200
  form: "single",
45102
45201
  optional: false
45103
45202
  }],
45203
+ "dayNight.getStatus": [{
45204
+ name: "deviceId",
45205
+ form: "single",
45206
+ optional: false
45207
+ }],
45104
45208
  "dayNight.setSettings": [{
45105
45209
  name: "deviceId",
45106
45210
  form: "single",
@@ -45111,11 +45215,31 @@ Object.freeze({
45111
45215
  form: "single",
45112
45216
  optional: true
45113
45217
  }],
45218
+ "detectionPipeline.applyDeviceSettingsPatch": [{
45219
+ name: "deviceId",
45220
+ form: "single",
45221
+ optional: false
45222
+ }],
45223
+ "detectionPipeline.getDeviceLiveContribution": [{
45224
+ name: "deviceId",
45225
+ form: "single",
45226
+ optional: false
45227
+ }],
45228
+ "detectionPipeline.getDeviceSettingsContribution": [{
45229
+ name: "deviceId",
45230
+ form: "single",
45231
+ optional: false
45232
+ }],
45114
45233
  "deviceAdminLink.getAdminLink": [{
45115
45234
  name: "deviceId",
45116
45235
  form: "single",
45117
45236
  optional: false
45118
45237
  }],
45238
+ "deviceAdoption.getStatus": [{
45239
+ name: "deviceId",
45240
+ form: "single",
45241
+ optional: false
45242
+ }],
45119
45243
  "deviceAdoption.release": [{
45120
45244
  name: "camDeviceId",
45121
45245
  form: "single",
@@ -45131,6 +45255,11 @@ Object.freeze({
45131
45255
  form: "single",
45132
45256
  optional: false
45133
45257
  }],
45258
+ "deviceDiscovery.getStatus": [{
45259
+ name: "deviceId",
45260
+ form: "single",
45261
+ optional: false
45262
+ }],
45134
45263
  "deviceDiscovery.listDiscovered": [{
45135
45264
  name: "deviceId",
45136
45265
  form: "single",
@@ -45150,6 +45279,21 @@ Object.freeze({
45150
45279
  form: "single",
45151
45280
  optional: false
45152
45281
  }],
45282
+ "deviceExport.applyDeviceSettingsPatch": [{
45283
+ name: "deviceId",
45284
+ form: "single",
45285
+ optional: false
45286
+ }],
45287
+ "deviceExport.getDeviceLiveContribution": [{
45288
+ name: "deviceId",
45289
+ form: "single",
45290
+ optional: false
45291
+ }],
45292
+ "deviceExport.getDeviceSettingsContribution": [{
45293
+ name: "deviceId",
45294
+ form: "single",
45295
+ optional: false
45296
+ }],
45153
45297
  "deviceExtension.listCandidates": [{
45154
45298
  name: "deviceId",
45155
45299
  form: "single",
@@ -45498,6 +45642,26 @@ Object.freeze({
45498
45642
  form: "single",
45499
45643
  optional: false
45500
45644
  }],
45645
+ "deviceStatus.getStatus": [{
45646
+ name: "deviceId",
45647
+ form: "single",
45648
+ optional: false
45649
+ }],
45650
+ "doorbell.getStatus": [{
45651
+ name: "deviceId",
45652
+ form: "single",
45653
+ optional: false
45654
+ }],
45655
+ "enumSensor.getStatus": [{
45656
+ name: "deviceId",
45657
+ form: "single",
45658
+ optional: false
45659
+ }],
45660
+ "eventEmitter.getStatus": [{
45661
+ name: "deviceId",
45662
+ form: "single",
45663
+ optional: false
45664
+ }],
45501
45665
  "faceGallery.getFaceByTrack": [{
45502
45666
  name: "deviceId",
45503
45667
  form: "single",
@@ -45512,6 +45676,11 @@ Object.freeze({
45512
45676
  form: "array",
45513
45677
  optional: true
45514
45678
  }],
45679
+ "fanControl.getStatus": [{
45680
+ name: "deviceId",
45681
+ form: "single",
45682
+ optional: false
45683
+ }],
45515
45684
  "fanControl.setDirection": [{
45516
45685
  name: "deviceId",
45517
45686
  form: "single",
@@ -45532,6 +45701,26 @@ Object.freeze({
45532
45701
  form: "single",
45533
45702
  optional: false
45534
45703
  }],
45704
+ "featureProbe.getStatus": [{
45705
+ name: "deviceId",
45706
+ form: "single",
45707
+ optional: false
45708
+ }],
45709
+ "flood.getStatus": [{
45710
+ name: "deviceId",
45711
+ form: "single",
45712
+ optional: false
45713
+ }],
45714
+ "gas.getStatus": [{
45715
+ name: "deviceId",
45716
+ form: "single",
45717
+ optional: false
45718
+ }],
45719
+ "humidifier.getStatus": [{
45720
+ name: "deviceId",
45721
+ form: "single",
45722
+ optional: false
45723
+ }],
45535
45724
  "humidifier.setMode": [{
45536
45725
  name: "deviceId",
45537
45726
  form: "single",
@@ -45547,11 +45736,26 @@ Object.freeze({
45547
45736
  form: "single",
45548
45737
  optional: false
45549
45738
  }],
45739
+ "humiditySensor.getStatus": [{
45740
+ name: "deviceId",
45741
+ form: "single",
45742
+ optional: false
45743
+ }],
45744
+ "image.getStatus": [{
45745
+ name: "deviceId",
45746
+ form: "single",
45747
+ optional: false
45748
+ }],
45550
45749
  "imageSettings.getOptions": [{
45551
45750
  name: "deviceId",
45552
45751
  form: "single",
45553
45752
  optional: false
45554
45753
  }],
45754
+ "imageSettings.getStatus": [{
45755
+ name: "deviceId",
45756
+ form: "single",
45757
+ optional: false
45758
+ }],
45555
45759
  "imageSettings.setSettings": [{
45556
45760
  name: "deviceId",
45557
45761
  form: "single",
@@ -45562,6 +45766,11 @@ Object.freeze({
45562
45766
  form: "single",
45563
45767
  optional: false
45564
45768
  }],
45769
+ "intercom.getStatus": [{
45770
+ name: "deviceId",
45771
+ form: "single",
45772
+ optional: false
45773
+ }],
45565
45774
  "intercom.handleAnswer": [{
45566
45775
  name: "deviceId",
45567
45776
  form: "single",
@@ -45592,6 +45801,11 @@ Object.freeze({
45592
45801
  form: "single",
45593
45802
  optional: false
45594
45803
  }],
45804
+ "lawnMowerControl.getStatus": [{
45805
+ name: "deviceId",
45806
+ form: "single",
45807
+ optional: false
45808
+ }],
45595
45809
  "lawnMowerControl.pause": [{
45596
45810
  name: "deviceId",
45597
45811
  form: "single",
@@ -45602,6 +45816,11 @@ Object.freeze({
45602
45816
  form: "single",
45603
45817
  optional: false
45604
45818
  }],
45819
+ "lockControl.getStatus": [{
45820
+ name: "deviceId",
45821
+ form: "single",
45822
+ optional: false
45823
+ }],
45605
45824
  "lockControl.lock": [{
45606
45825
  name: "deviceId",
45607
45826
  form: "single",
@@ -45617,6 +45836,11 @@ Object.freeze({
45617
45836
  form: "single",
45618
45837
  optional: false
45619
45838
  }],
45839
+ "mediaPlayer.getStatus": [{
45840
+ name: "deviceId",
45841
+ form: "single",
45842
+ optional: false
45843
+ }],
45620
45844
  "mediaPlayer.next": [{
45621
45845
  name: "deviceId",
45622
45846
  form: "single",
@@ -45677,6 +45901,11 @@ Object.freeze({
45677
45901
  form: "single",
45678
45902
  optional: false
45679
45903
  }],
45904
+ "motion.getStatus": [{
45905
+ name: "deviceId",
45906
+ form: "single",
45907
+ optional: false
45908
+ }],
45680
45909
  "motion.isDetected": [{
45681
45910
  name: "deviceId",
45682
45911
  form: "single",
@@ -45687,11 +45916,31 @@ Object.freeze({
45687
45916
  form: "single",
45688
45917
  optional: false
45689
45918
  }],
45919
+ "motionDetection.applyDeviceSettingsPatch": [{
45920
+ name: "deviceId",
45921
+ form: "single",
45922
+ optional: false
45923
+ }],
45924
+ "motionDetection.getDeviceLiveContribution": [{
45925
+ name: "deviceId",
45926
+ form: "single",
45927
+ optional: false
45928
+ }],
45929
+ "motionDetection.getDeviceSettingsContribution": [{
45930
+ name: "deviceId",
45931
+ form: "single",
45932
+ optional: false
45933
+ }],
45690
45934
  "motionDetection.removeCamera": [{
45691
45935
  name: "deviceId",
45692
45936
  form: "single",
45693
45937
  optional: false
45694
45938
  }],
45939
+ "motionTrigger.getStatus": [{
45940
+ name: "deviceId",
45941
+ form: "single",
45942
+ optional: false
45943
+ }],
45695
45944
  "motionTrigger.setMotionTrigger": [{
45696
45945
  name: "deviceId",
45697
45946
  form: "single",
@@ -45702,6 +45951,11 @@ Object.freeze({
45702
45951
  form: "single",
45703
45952
  optional: false
45704
45953
  }],
45954
+ "motionZones.getStatus": [{
45955
+ name: "deviceId",
45956
+ form: "single",
45957
+ optional: false
45958
+ }],
45705
45959
  "motionZones.setZone": [{
45706
45960
  name: "deviceId",
45707
45961
  form: "single",
@@ -45712,6 +45966,11 @@ Object.freeze({
45712
45966
  form: "single",
45713
45967
  optional: false
45714
45968
  }],
45969
+ "nativeObjectDetection.getStatus": [{
45970
+ name: "deviceId",
45971
+ form: "single",
45972
+ optional: false
45973
+ }],
45715
45974
  "nativeObjectDetection.setEnabled": [{
45716
45975
  name: "deviceId",
45717
45976
  form: "single",
@@ -45727,6 +45986,11 @@ Object.freeze({
45727
45986
  form: "single",
45728
45987
  optional: false
45729
45988
  }],
45989
+ "navigation.getStatus": [{
45990
+ name: "deviceId",
45991
+ form: "single",
45992
+ optional: false
45993
+ }],
45730
45994
  "navigation.goToPoint": [{
45731
45995
  name: "deviceId",
45732
45996
  form: "single",
@@ -45772,6 +46036,11 @@ Object.freeze({
45772
46036
  form: "single",
45773
46037
  optional: false
45774
46038
  }],
46039
+ "networkLink.getStatus": [{
46040
+ name: "deviceId",
46041
+ form: "single",
46042
+ optional: false
46043
+ }],
45775
46044
  "networkQuality.getDeviceStats": [{
45776
46045
  name: "deviceId",
45777
46046
  form: "single",
@@ -45797,11 +46066,26 @@ Object.freeze({
45797
46066
  form: "single",
45798
46067
  optional: false
45799
46068
  }],
46069
+ "notifier.getStatus": [{
46070
+ name: "deviceId",
46071
+ form: "single",
46072
+ optional: false
46073
+ }],
45800
46074
  "notifier.send": [{
45801
46075
  name: "deviceId",
45802
46076
  form: "single",
45803
46077
  optional: false
45804
46078
  }],
46079
+ "numericSensor.getStatus": [{
46080
+ name: "deviceId",
46081
+ form: "single",
46082
+ optional: false
46083
+ }],
46084
+ "osd.getStatus": [{
46085
+ name: "deviceId",
46086
+ form: "single",
46087
+ optional: false
46088
+ }],
45805
46089
  "osd.setOverlay": [{
45806
46090
  name: "deviceId",
45807
46091
  form: "single",
@@ -45861,6 +46145,11 @@ Object.freeze({
45861
46145
  form: "single",
45862
46146
  optional: false
45863
46147
  }],
46148
+ "petFeeder.getStatus": [{
46149
+ name: "deviceId",
46150
+ form: "single",
46151
+ optional: false
46152
+ }],
45864
46153
  "petFeeder.markFoodReplenished": [{
45865
46154
  name: "deviceId",
45866
46155
  form: "single",
@@ -45896,6 +46185,11 @@ Object.freeze({
45896
46185
  form: "single",
45897
46186
  optional: false
45898
46187
  }],
46188
+ "pipelineAnalytics.applyDeviceSettingsPatch": [{
46189
+ name: "deviceId",
46190
+ form: "single",
46191
+ optional: false
46192
+ }],
45899
46193
  "pipelineAnalytics.clearTrackRelation": [{
45900
46194
  name: "deviceId",
45901
46195
  form: "single",
@@ -45936,6 +46230,16 @@ Object.freeze({
45936
46230
  form: "single",
45937
46231
  optional: false
45938
46232
  }],
46233
+ "pipelineAnalytics.getDeviceLiveContribution": [{
46234
+ name: "deviceId",
46235
+ form: "single",
46236
+ optional: false
46237
+ }],
46238
+ "pipelineAnalytics.getDeviceSettingsContribution": [{
46239
+ name: "deviceId",
46240
+ form: "single",
46241
+ optional: false
46242
+ }],
45939
46243
  "pipelineAnalytics.getEventDensity": [{
45940
46244
  name: "deviceId",
45941
46245
  form: "single",
@@ -46151,6 +46455,11 @@ Object.freeze({
46151
46455
  form: "single",
46152
46456
  optional: true
46153
46457
  }],
46458
+ "pipelineOrchestrator.applyDeviceSettingsPatch": [{
46459
+ name: "deviceId",
46460
+ form: "single",
46461
+ optional: false
46462
+ }],
46154
46463
  "pipelineOrchestrator.assignAudio": [{
46155
46464
  name: "deviceId",
46156
46465
  form: "single",
@@ -46196,6 +46505,16 @@ Object.freeze({
46196
46505
  form: "single",
46197
46506
  optional: false
46198
46507
  }],
46508
+ "pipelineOrchestrator.getDeviceLiveContribution": [{
46509
+ name: "deviceId",
46510
+ form: "single",
46511
+ optional: false
46512
+ }],
46513
+ "pipelineOrchestrator.getDeviceSettingsContribution": [{
46514
+ name: "deviceId",
46515
+ form: "single",
46516
+ optional: false
46517
+ }],
46199
46518
  "pipelineOrchestrator.getPipelineAssignment": [{
46200
46519
  name: "deviceId",
46201
46520
  form: "single",
@@ -46316,11 +46635,31 @@ Object.freeze({
46316
46635
  form: "single",
46317
46636
  optional: true
46318
46637
  }],
46638
+ "powerMeter.getStatus": [{
46639
+ name: "deviceId",
46640
+ form: "single",
46641
+ optional: false
46642
+ }],
46643
+ "presence.getStatus": [{
46644
+ name: "deviceId",
46645
+ form: "single",
46646
+ optional: false
46647
+ }],
46648
+ "pressureSensor.getStatus": [{
46649
+ name: "deviceId",
46650
+ form: "single",
46651
+ optional: false
46652
+ }],
46319
46653
  "privacyMask.getOptions": [{
46320
46654
  name: "deviceId",
46321
46655
  form: "single",
46322
46656
  optional: false
46323
46657
  }],
46658
+ "privacyMask.getStatus": [{
46659
+ name: "deviceId",
46660
+ form: "single",
46661
+ optional: false
46662
+ }],
46324
46663
  "privacyMask.setAudioEnabled": [{
46325
46664
  name: "deviceId",
46326
46665
  form: "single",
@@ -46371,6 +46710,11 @@ Object.freeze({
46371
46710
  form: "single",
46372
46711
  optional: false
46373
46712
  }],
46713
+ "ptz.getStatus": [{
46714
+ name: "deviceId",
46715
+ form: "single",
46716
+ optional: false
46717
+ }],
46374
46718
  "ptz.goHome": [{
46375
46719
  name: "deviceId",
46376
46720
  form: "single",
@@ -46461,6 +46805,11 @@ Object.freeze({
46461
46805
  form: "single",
46462
46806
  optional: false
46463
46807
  }],
46808
+ "recordingArchive.applyDeviceSettingsPatch": [{
46809
+ name: "deviceId",
46810
+ form: "single",
46811
+ optional: false
46812
+ }],
46464
46813
  "recordingArchive.deleteFootprint": [{
46465
46814
  name: "deviceId",
46466
46815
  form: "single",
@@ -46481,6 +46830,21 @@ Object.freeze({
46481
46830
  form: "single",
46482
46831
  optional: false
46483
46832
  }],
46833
+ "recordingArchive.getDeviceLiveContribution": [{
46834
+ name: "deviceId",
46835
+ form: "single",
46836
+ optional: false
46837
+ }],
46838
+ "recordingArchive.getDeviceSettingsContribution": [{
46839
+ name: "deviceId",
46840
+ form: "single",
46841
+ optional: false
46842
+ }],
46843
+ "recordingArchive.getStatus": [{
46844
+ name: "deviceId",
46845
+ form: "single",
46846
+ optional: false
46847
+ }],
46484
46848
  "recordingArchive.listOpsLog": [{
46485
46849
  name: "deviceId",
46486
46850
  form: "single",
@@ -46566,6 +46930,11 @@ Object.freeze({
46566
46930
  form: "single",
46567
46931
  optional: false
46568
46932
  }],
46933
+ "recordingOnboard.getStatus": [{
46934
+ name: "deviceId",
46935
+ form: "single",
46936
+ optional: false
46937
+ }],
46569
46938
  "recordingOnboard.setSettings": [{
46570
46939
  name: "deviceId",
46571
46940
  form: "single",
@@ -46596,6 +46965,11 @@ Object.freeze({
46596
46965
  form: "single",
46597
46966
  optional: false
46598
46967
  }],
46968
+ "sceneMonitor.getStatus": [{
46969
+ name: "deviceId",
46970
+ form: "single",
46971
+ optional: false
46972
+ }],
46599
46973
  "sceneMonitor.listScenes": [{
46600
46974
  name: "deviceId",
46601
46975
  form: "single",
@@ -46621,6 +46995,11 @@ Object.freeze({
46621
46995
  form: "single",
46622
46996
  optional: false
46623
46997
  }],
46998
+ "scriptRunner.getStatus": [{
46999
+ name: "deviceId",
47000
+ form: "single",
47001
+ optional: false
47002
+ }],
46624
47003
  "scriptRunner.run": [{
46625
47004
  name: "deviceId",
46626
47005
  form: "single",
@@ -46631,11 +47010,31 @@ Object.freeze({
46631
47010
  form: "single",
46632
47011
  optional: false
46633
47012
  }],
47013
+ "smoke.getStatus": [{
47014
+ name: "deviceId",
47015
+ form: "single",
47016
+ optional: false
47017
+ }],
47018
+ "snapshot.applyDeviceSettingsPatch": [{
47019
+ name: "deviceId",
47020
+ form: "single",
47021
+ optional: false
47022
+ }],
46634
47023
  "snapshot.getDebugState": [{
46635
47024
  name: "deviceId",
46636
47025
  form: "single",
46637
47026
  optional: false
46638
47027
  }],
47028
+ "snapshot.getDeviceLiveContribution": [{
47029
+ name: "deviceId",
47030
+ form: "single",
47031
+ optional: false
47032
+ }],
47033
+ "snapshot.getDeviceSettingsContribution": [{
47034
+ name: "deviceId",
47035
+ form: "single",
47036
+ optional: false
47037
+ }],
46639
47038
  "snapshot.getSnapshot": [{
46640
47039
  name: "deviceId",
46641
47040
  form: "single",
@@ -46652,6 +47051,11 @@ Object.freeze({
46652
47051
  form: "array",
46653
47052
  optional: false
46654
47053
  }],
47054
+ "snapshot.getStatus": [{
47055
+ name: "deviceId",
47056
+ form: "single",
47057
+ optional: false
47058
+ }],
46655
47059
  "snapshot.invalidateCache": [{
46656
47060
  name: "deviceId",
46657
47061
  form: "single",
@@ -46662,6 +47066,11 @@ Object.freeze({
46662
47066
  form: "single",
46663
47067
  optional: false
46664
47068
  }],
47069
+ "streamBroker.applyDeviceSettingsPatch": [{
47070
+ name: "deviceId",
47071
+ form: "single",
47072
+ optional: false
47073
+ }],
46665
47074
  "streamBroker.assignProfile": [{
46666
47075
  name: "deviceId",
46667
47076
  form: "single",
@@ -46677,6 +47086,16 @@ Object.freeze({
46677
47086
  form: "single",
46678
47087
  optional: false
46679
47088
  }],
47089
+ "streamBroker.getDeviceLiveContribution": [{
47090
+ name: "deviceId",
47091
+ form: "single",
47092
+ optional: false
47093
+ }],
47094
+ "streamBroker.getDeviceSettingsContribution": [{
47095
+ name: "deviceId",
47096
+ form: "single",
47097
+ optional: false
47098
+ }],
46680
47099
  "streamBroker.getStreamWithCodec": [{
46681
47100
  name: "deviceId",
46682
47101
  form: "single",
@@ -46737,16 +47156,46 @@ Object.freeze({
46737
47156
  form: "single",
46738
47157
  optional: false
46739
47158
  }],
47159
+ "streamParams.getStatus": [{
47160
+ name: "deviceId",
47161
+ form: "single",
47162
+ optional: false
47163
+ }],
46740
47164
  "streamParams.setProfile": [{
46741
47165
  name: "deviceId",
46742
47166
  form: "single",
46743
47167
  optional: false
46744
47168
  }],
47169
+ "switch.getStatus": [{
47170
+ name: "deviceId",
47171
+ form: "single",
47172
+ optional: false
47173
+ }],
46745
47174
  "switch.setState": [{
46746
47175
  name: "deviceId",
46747
47176
  form: "single",
46748
47177
  optional: false
46749
47178
  }],
47179
+ "tamper.getStatus": [{
47180
+ name: "deviceId",
47181
+ form: "single",
47182
+ optional: false
47183
+ }],
47184
+ "temperatureSensor.getStatus": [{
47185
+ name: "deviceId",
47186
+ form: "single",
47187
+ optional: false
47188
+ }],
47189
+ "update.getStatus": [{
47190
+ name: "deviceId",
47191
+ form: "single",
47192
+ optional: false
47193
+ }],
47194
+ "vacuumControl.getStatus": [{
47195
+ name: "deviceId",
47196
+ form: "single",
47197
+ optional: false
47198
+ }],
46750
47199
  "vacuumControl.locate": [{
46751
47200
  name: "deviceId",
46752
47201
  form: "single",
@@ -46782,6 +47231,11 @@ Object.freeze({
46782
47231
  form: "single",
46783
47232
  optional: false
46784
47233
  }],
47234
+ "valve.getStatus": [{
47235
+ name: "deviceId",
47236
+ form: "single",
47237
+ optional: false
47238
+ }],
46785
47239
  "valve.open": [{
46786
47240
  name: "deviceId",
46787
47241
  form: "single",
@@ -46797,6 +47251,11 @@ Object.freeze({
46797
47251
  form: "single",
46798
47252
  optional: false
46799
47253
  }],
47254
+ "vibration.getStatus": [{
47255
+ name: "deviceId",
47256
+ form: "single",
47257
+ optional: false
47258
+ }],
46800
47259
  "videoclips.dialClipStream": [{
46801
47260
  name: "deviceId",
46802
47261
  form: "single",
@@ -46832,6 +47291,11 @@ Object.freeze({
46832
47291
  form: "single",
46833
47292
  optional: false
46834
47293
  }],
47294
+ "waterHeater.getStatus": [{
47295
+ name: "deviceId",
47296
+ form: "single",
47297
+ optional: false
47298
+ }],
46835
47299
  "waterHeater.setAway": [{
46836
47300
  name: "deviceId",
46837
47301
  form: "single",
@@ -46847,6 +47311,11 @@ Object.freeze({
46847
47311
  form: "single",
46848
47312
  optional: false
46849
47313
  }],
47314
+ "weather.getStatus": [{
47315
+ name: "deviceId",
47316
+ form: "single",
47317
+ optional: false
47318
+ }],
46850
47319
  "webrtcSession.addIceCandidate": [{
46851
47320
  name: "deviceId",
46852
47321
  form: "single",
@@ -47584,7 +48053,7 @@ var PreviewTextField = string().max(200);
47584
48053
  * Whether the notification's preview is a STILL or a short animation.
47585
48054
  *
47586
48055
  * The operator's ask, verbatim: *"inviato come gif o video (come per le altre
47587
- * rule)"* — the other rules already offer an animated preview, and a ten-hour
48056
+ * rule)"* [sent as a gif or video (as for the other rules)] — the other rules already offer an animated preview, and a ten-hour
47588
48057
  * night reads better as three seconds of motion than as one frame of it. Both
47589
48058
  * modes get the SAME treatment (blurred frame, large centred title); `'gif'`
47590
48059
  * simply applies it to a dozen frames sampled across the render and assembles