@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
@@ -8039,7 +8039,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
8039
8039
  return DeviceRole;
8040
8040
  }({});
8041
8041
  //#endregion
8042
- //#region ../types/dist/composition-43aqsZQj.mjs
8042
+ //#region ../types/dist/composition-Bzr7GwgP.mjs
8043
8043
  /**
8044
8044
  * The ffmpeg build every CamStack node downloads, per platform and arch.
8045
8045
  *
@@ -8093,20 +8093,20 @@ function portable(target) {
8093
8093
  }
8094
8094
  portable("linux64"), portable("linuxarm64"), portable("macarm64"), portable("mac64");
8095
8095
  /**
8096
- * LA tabella "quale booleano di questo tipo di device conta come ALTO", e il
8097
- * valutatore puro del suo FRONTE.
8096
+ * THE table "which boolean of this device type counts as HIGH", and the
8097
+ * pure evaluator of its EDGE.
8098
8098
  *
8099
- * UNA tabella per tutti quelli che chiedono "questo device è ALTO?": il
8100
- * trigger `RecordingTriggers.sensorDeviceIds` del recorder, i marker dei
8101
- * sensori della post-analysis, il bridge camera-sensors dell'orchestratore e
8102
- * le sorgenti di un campanello composto (`doorbellFeatureSources`, D671).
8103
- * Una seconda copia divergerebbe alla prima cap aggiunta, e il sintomo — "il
8104
- * sensore fa suonare il campanello ma non registra" — è esattamente D62.
8099
+ * ONE table for everyone who asks "is this device HIGH?": the
8100
+ * recorder's `RecordingTriggers.sensorDeviceIds` trigger, the post-analysis
8101
+ * sensor markers, the orchestrator's camera-sensors bridge and
8102
+ * the sources of a composite doorbell (`doorbellFeatureSources`, D671).
8103
+ * A second copy would diverge at the first cap added, and the symptom — "the
8104
+ * sensor rings the doorbell but does not record" — is exactly D62.
8105
8105
  *
8106
- * ⚠ NON è `DEVICE_STATE_READERS` (`catalogs/device-state-vocabulary.ts`), e le
8107
- * due non vanno unificate: quella risponde a "qual è la PAROLA di stato per una
8108
- * regola" (e include `presence`, `cover`, `alarm-panel`), questa a "qual è il
8109
- * booleano il cui FRONTE conta". Vocabolari deliberatamente diversi.
8106
+ * ⚠ NOT `DEVICE_STATE_READERS` (`catalogs/device-state-vocabulary.ts`), and the
8107
+ * two must not be unified: that one answers "what is the state WORD for a
8108
+ * rule" (and includes `presence`, `cover`, `alarm-panel`), this one "which
8109
+ * boolean's EDGE counts". Deliberately different vocabularies.
8110
8110
  */
8111
8111
  /**
8112
8112
  * Known binary / switch source caps → the boolean slice field whose
@@ -8127,6 +8127,8 @@ var SOURCE_CAP_ACTIVE_FIELD = {
8127
8127
  vibration: "detected",
8128
8128
  tamper: "tampered"
8129
8129
  };
8130
+ /** Cap names whose presence in a device's bindings qualify it as a source. */
8131
+ var SOURCE_CAPS = Object.keys(SOURCE_CAP_ACTIVE_FIELD);
8130
8132
  /**
8131
8133
  * Error types for the safe expression engine. Two distinct classes so callers
8132
8134
  * can tell a compile-time (grammar) failure from a runtime (evaluation)
@@ -9713,22 +9715,22 @@ var CLASS_MAP_MACRO_TARGETS = [
9713
9715
  "package"
9714
9716
  ];
9715
9717
  /**
9716
- * Le macro classi di PRIMO LIVELLO: quelle che un object detector emette e che
9717
- * un operatore può selezionare.
9718
+ * The FIRST-LEVEL macro classes: those an object detector emits and that
9719
+ * an operator can select.
9718
9720
  *
9719
- * Sono le tre offerte dallo step `object-detection`
9721
+ * They are the three offered by the `object-detection` step
9720
9722
  * (`addon-pipeline/src/detection-pipeline/registry/step-definitions.ts`,
9721
- * `enabledMacroClasses`). `package` sta in {@link CLASS_MAP_MACRO_TARGETS} e in
9722
- * `MACRO_LABELS` — è una macro vera — ma NON qui: appartiene allo step
9723
- * `package-detection`, la cui abilitazione è guidata dalle zone, e offrire la
9724
- * stessa parola due volte ha già fatto accendere a un operatore il proxy COCO
9723
+ * `enabledMacroClasses`). `package` is in {@link CLASS_MAP_MACRO_TARGETS} and in
9724
+ * `MACRO_LABELS` — it is a true macro — but NOT here: it belongs to the step
9725
+ * `package-detection`, whose enablement is driven by zones, and offering the
9726
+ * same word twice has already made an operator turn on the COCO proxy
9725
9727
  * (suitcase/backpack/handbag) lasciando spento il detector dedicato.
9726
9728
  *
9727
- * UNA lista. Prima di oggi le stesse tre erano scritte a mano nell'offerta
9728
- * dello step e una seconda volta come union `FirstLevelMacro`
9729
- * (`types/detection.ts`); una terza copia per il trigger di registrazione
9730
- * (`RecordingTriggers.objectClasses`) avrebbe reso invisibile la divergenza
9731
- * successiva.
9729
+ * ONE list. Before today the same three were hand-written in the step's offer
9730
+ * and a second time as the union `FirstLevelMacro`
9731
+ * (`types/detection.ts`); a third copy for the recording trigger
9732
+ * (`RecordingTriggers.objectClasses`) would have made the later divergence
9733
+ * invisible.
9732
9734
  */
9733
9735
  var FIRST_LEVEL_MACRO_CLASSES = [
9734
9736
  "person",
@@ -9793,17 +9795,17 @@ var RecordingStorageModeSchema = _enum([
9793
9795
  "on-device-decision"
9794
9796
  ]);
9795
9797
  /**
9796
- * Le macro classi che possono aprire una finestra di registrazione — le stesse
9797
- * tre offerte dallo step `object-detection`, da UNA lista
9798
+ * The macro classes that can open a recording window — the same
9799
+ * three offered by the `object-detection` step, from ONE list
9798
9800
  * ({@link FIRST_LEVEL_MACRO_CLASSES}).
9799
9801
  */
9800
9802
  var RecordingObjectTriggerClassSchema = _enum(FIRST_LEVEL_MACRO_CLASSES);
9801
9803
  /**
9802
- * True quando `values` non ripete un elemento.
9804
+ * True when `values` does not repeat an element.
9803
9805
  *
9804
- * Un duplicato non è innocuo: ogni voce di `objectClasses` / `sensorDeviceIds`
9805
- * diventa una SORGENTE in `bandTriggerSources`, e la stessa sorgente due volte
9806
- * conterebbe due volte le sue finestre in `segmentMissedByMs`.
9806
+ * A duplicate is not harmless: every entry of `objectClasses` / `sensorDeviceIds`
9807
+ * becomes a SOURCE in `bandTriggerSources`, and the same source twice
9808
+ * would count its windows twice in `segmentMissedByMs`.
9807
9809
  */
9808
9810
  var noDuplicates = (values) => new Set(values).size === values.length;
9809
9811
  /** Which detectors trigger an `events`-mode band. */
@@ -9811,34 +9813,34 @@ var RecordingTriggersSchema = object({
9811
9813
  motion: boolean().optional(),
9812
9814
  audioThresholdDbfs: number().optional(),
9813
9815
  /**
9814
- * Le macro classi la cui detection apre una finestra. ASSENTE = la sorgente
9815
- * non è ascoltata; un array VUOTO è rifiutato, perché "banda events, trigger
9816
- * object acceso, nessuna classe" è la stessa forma "abilitata e non registra
9817
- * nulla, per sempre" contro cui è scritto `eventsBandCanEverDemand`.
9816
+ * The macro classes whose detection opens a window. ABSENT = the source
9817
+ * is not listened to; an EMPTY array is rejected, because "events band, object
9818
+ * trigger on, no class" is the same shape "enabled and records
9819
+ * nothing, forever" that `eventsBandCanEverDemand` is written against.
9818
9820
  *
9819
- * Il segnale letto è GIÀ FILTRATO: solo detection `source: 'pipeline'`, cioè
9820
- * quelle che hanno attraversato `enabledMacroClasses`, i
9821
- * `minConfidence<Macro>` e il full-frame guard. L'AI a bordo camera
9822
- * (`source: 'onboard'`) non attraversa nessuno di quei gate e NON apre
9823
- * finestre — vedi `recorder/object-trigger.ts`.
9821
+ * The signal read is ALREADY FILTERED: only `source: 'pipeline'` detections, i.e.
9822
+ * those that went through `enabledMacroClasses`, the
9823
+ * `minConfidence<Macro>` and the full-frame guard. The camera's onboard AI
9824
+ * (`source: 'onboard'`) goes through none of those gates and does NOT open
9825
+ * windows — see `recorder/object-trigger.ts`.
9824
9826
  */
9825
9827
  objectClasses: array(RecordingObjectTriggerClassSchema).min(1).refine(noDuplicates, { message: "objectClasses must not repeat a class" }).optional(),
9826
9828
  /**
9827
- * I device LINKED il cui FRONTE ALTO apre una finestra. Assente = la sorgente
9828
- * non è ascoltata; un array vuoto è rifiutato per la stessa ragione di
9829
+ * The LINKED devices whose RISING EDGE opens a window. Absent = the source
9830
+ * is not listened to; an empty array is rejected for the same reason as
9829
9831
  * `objectClasses`.
9830
9832
  *
9831
- * Sono id di device SORGENTE, non camere: la banda li nomina, quindi il
9832
- * percorso caldo (`DeviceStateChanged`, a ritmo di bus su tutta la flotta)
9833
- * non fa RPC. L'OFFERTA da cui l'operatore li sceglie è un'altra domanda, e
9834
- * si risolve con `deviceManager.getLinkedDevices` + `getBindingsBatch` per
9835
- * device (D12) — mai un elenco globale di cap.
9833
+ * These are SOURCE device ids, not cameras: the band names them, so the
9834
+ * hot path (`DeviceStateChanged`, at bus rate across the whole fleet)
9835
+ * does no RPC. The OFFER from which the operator picks them is another question, and
9836
+ * is resolved with `deviceManager.getLinkedDevices` + `getBindingsBatch` per
9837
+ * device (D12) — never a global list of caps.
9836
9838
  *
9837
- * Cosa vuol dire "alto" dipende dal TIPO di device e non è deciso qui:
9838
- * `SOURCE_CAP_ACTIVE_FIELD` (`catalogs/sensor-active-state.ts`) è LA tabella,
9839
- * la stessa del campanello composto (D671). Ed è il FRONTE, non
9840
- * il livello: un contatto trovato già aperto al riavvio del runner non fa
9841
- * registrare.
9839
+ * What "high" means depends on the device TYPE and is not decided here:
9840
+ * `SOURCE_CAP_ACTIVE_FIELD` (`catalogs/sensor-active-state.ts`) is THE table,
9841
+ * the same one as the composite doorbell (D671). And it is the EDGE, not
9842
+ * the level: a contact found already open at runner restart does not
9843
+ * record.
9842
9844
  */
9843
9845
  sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional()
9844
9846
  });
@@ -10915,7 +10917,7 @@ var DecoderSessionConfigSchema = object({
10915
10917
  * - **VALUE** — at which level, for which scope, until when. That stays ONE
10916
10918
  * thing: the logging settings document on the `system` cap. Two authorities
10917
10919
  * over the values is the exact defect
10918
- * `docs/design/plans/2026-08-26-logging-per-componente.md` was written to
10920
+ * `docs/design/plans/2026-08-26-per-component-logging.md` was written to
10919
10921
  * remove; re-introducing it from the cure side would be grotesque.
10920
10922
  *
10921
10923
  * Nothing in this file reads a clock, an env var or a store. The registry is
@@ -12644,7 +12646,7 @@ var BrokerStatusEnum = _enum([
12644
12646
  "unreachable",
12645
12647
  "error"
12646
12648
  ]);
12647
- var BrokerInfoSchema$1 = object({
12649
+ var BrokerInfoSchema = object({
12648
12650
  /** Stable broker id. Persisted; survives addon restarts. */
12649
12651
  id: string(),
12650
12652
  /** Addon id of the provider that OWNS this broker.
@@ -12777,7 +12779,7 @@ var GetStateInputSchema = object({
12777
12779
  * HA: entity_id (returns the cached entity state). */
12778
12780
  key: string()
12779
12781
  });
12780
- method(ListInputSchema, array(BrokerInfoSchema$1)), method(GetInputSchema, BrokerInfoSchema$1.nullable()), method(_void(), array(BrokerProviderInfoSchema), { auth: "admin" }), method(AddInputSchema, AddResultSchema, {
12782
+ method(ListInputSchema, array(BrokerInfoSchema)), method(GetInputSchema, BrokerInfoSchema.nullable()), method(_void(), array(BrokerProviderInfoSchema), { auth: "admin" }), method(AddInputSchema, AddResultSchema, {
12781
12783
  kind: "mutation",
12782
12784
  auth: "admin"
12783
12785
  }), method(RemoveInputSchema, _void(), {
@@ -14402,7 +14404,7 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
14402
14404
  *
14403
14405
  * ⚠ An earlier version of this comment blamed Zod stripping, and that
14404
14406
  * was wrong — corrected 2026-08-26 after the hop map
14405
- * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
14407
+ * (`docs/design/2026-08-26-topic-hop-map.md`) traced the path.
14406
14408
  * There is **no Zod parse at all** between the door and the engine: the
14407
14409
  * dispatcher forwards the payload verbatim and UDS carries it whole. A
14408
14410
  * field declared here reaches `SqliteSettingsBackend` either way.
@@ -15158,7 +15160,17 @@ var SiteZoneSchema = object({
15158
15160
  var ProviderStatusSchema = object({
15159
15161
  connected: boolean(),
15160
15162
  deviceCount: number(),
15161
- error: string().optional()
15163
+ error: string().optional(),
15164
+ /**
15165
+ * `'orchestrator'`: this provider writes NO camera's `motion` runtime slice
15166
+ * — the orchestrator is its only writer (D696). Set by `BaseDeviceProvider`,
15167
+ * which every provider bundles, so only a provider BUILT from D696-amended
15168
+ * code says it. ABSENT means an older provider that may still write it (raw
15169
+ * VMD writes, a boot seed), and the orchestrator's provider gate keeps that
15170
+ * provider's cameras unwritten (`camera-sensors/motion-slice-provider-gate.ts`)
15171
+ * — the provider twin of the runner's `getLocalLoad().motionSliceWriter`.
15172
+ */
15173
+ motionSliceWriter: literal("orchestrator").optional()
15162
15174
  });
15163
15175
  object({
15164
15176
  externalId: string(),
@@ -16294,7 +16306,7 @@ method(object({
16294
16306
  * per-device window, `KeyFrameCaptureLog`, `bumpCropMetric`. Every one of them
16295
16307
  * ends in a log line, and a log line is the thing the operator asked to stop
16296
16308
  * needing: *"possiamo armare questi errori intanto? Così al prossimo giro
16297
- * ricontrolliamo tutti questi punti"*. Reading them meant grepping Loki and
16309
+ * 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
16298
16310
  * hand-correlating timestamps, which is how a 22% thumbnail gap and a 3-hour
16299
16311
  * media blackout were both diagnosed. The counters stay; this is where they can
16300
16312
  * be READ.
@@ -17676,7 +17688,7 @@ var BrokerStatusSchema$1 = _enum([
17676
17688
  "unreachable",
17677
17689
  "tls-error"
17678
17690
  ]);
17679
- var BrokerInfoSchema = object({
17691
+ var BrokerInfoSchema$1 = object({
17680
17692
  id: string(),
17681
17693
  name: string(),
17682
17694
  url: string(),
@@ -17739,7 +17751,7 @@ var StatusSchema = object({
17739
17751
  brokerCount: number(),
17740
17752
  embeddedRunning: boolean()
17741
17753
  });
17742
- method(_void(), array(BrokerInfoSchema)), method(IdInputSchema, BrokerConnectionDetailsSchema, { auth: "admin" }), method(AddBrokerInputSchema, AddBrokerResultSchema, {
17754
+ method(_void(), array(BrokerInfoSchema$1)), method(IdInputSchema, BrokerConnectionDetailsSchema, { auth: "admin" }), method(AddBrokerInputSchema, AddBrokerResultSchema, {
17743
17755
  kind: "mutation",
17744
17756
  auth: "admin"
17745
17757
  }), method(IdInputSchema, _void(), {
@@ -19915,78 +19927,16 @@ var NcRuleInputSchema = object({
19915
19927
  */
19916
19928
  confirm: NcConfirmSchema.optional(),
19917
19929
  /**
19918
- * WAIT for face/plate recognition before saying anything.
19919
- *
19920
- * A notification's TEXT is frozen at enqueue and its media is re-resolved at
19921
- * send; the identity is neither. A face is confirmed after `confirmFrames`
19922
- * agreeing observations — p50 **11.4 s** after the track was first seen,
19923
- * measured on this hub — and an `immediate` rule enqueues on the first object
19924
- * event, seconds before that. So "Gianluca è arrivato" is unsayable on the
19925
- * immediate path, and no amount of media re-resolution fixes a sentence.
19926
- *
19927
- * Only two honest answers exist, and this flag picks between them. It has
19928
- * effect ONLY on a rule that declares a recognition scope
19929
- * ({@link NcConditions.identities} or {@link NcConditions.plates}) — on any
19930
- * other rule there is nothing to wait for and the flag is inert.
19931
- *
19932
- * | value | what happens |
19933
- * | --- | --- |
19934
- * | `true` | the rule stops firing on the object event and fires at TRACK CLOSE instead, once, with the name — later, and complete |
19935
- * | 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) |
19936
- *
19937
- * `.optional()` and deliberately NOT `.default()`: a Zod default does not run
19938
- * on the addon cap path, and absent has to keep meaning exactly what every
19939
- * rule authored before this field meant.
19940
- *
19941
- * The cost of `true` is stated here because the editor states it too: a rule
19942
- * that waits also inherits track-close SEMANTICS — its `zones` condition
19943
- * tests every zone the track visited and a `crossing` condition can no longer
19944
- * be satisfied, because a closed track carries no crossing.
19945
- */
19946
- waitForEnhancement: boolean().optional(),
19947
- /**
19948
- * GROUP a burst of subjects into ONE notification that grows.
19949
- *
19950
- * Seconds of quiet after the last matching subject before the burst is
19951
- * considered over. While it is open, the first subject enqueues immediately —
19952
- * **exactly as today, with no added latency** — and every real growth (a new
19953
- * subject, or a name confirmed on one already in it) REPLACES that
19954
- * notification with an updated one naming everybody. The push carries the
19955
- * group's own coalescing tag, so the phone replaces rather than stacks.
19956
- *
19957
- * `0` / absent = off, and off is today's behaviour byte for byte.
19958
- *
19959
- * ### Why an idle cutoff and not a window
19960
- *
19961
- * The measured seven-person arrival on device 590 spans 110 s with every
19962
- * internal gap under 30 s. A 12 s fixed window cuts it into three groups; an
19963
- * idle cutoff holds it as one and ends it when the arrival actually ends.
19964
- * 30 s is a widely shipped value for the same decision.
19965
- *
19966
- * ### What it replaces
19967
- *
19968
- * The blind cooldown, which collapses a burst by DISCARDING it. Measured on
19969
- * device 615 / *Persona su Uscio* over six days: 116 qualifying tracks → 74
19970
- * notifications, **44 (37.9%) suppressed outright**, 23 of them overlapping a
19971
- * track that did fire and 7 carrying a confirmed identity nobody heard about.
19972
- * A group collapses the same volume by MERGING, so the cooldown becomes a
19973
- * budget over GROUPS — which is what it always meant — and a growth is never
19974
- * throttled by the window its own first member spent.
19975
- *
19976
- * ### Interaction with {@link waitForEnhancement}
19977
- *
19978
- * They compose, and the order matters. `waitForEnhancement` defers the rule to
19979
- * TRACK CLOSE, so with both set the group is opened by the first member to
19980
- * CLOSE — already carrying its name — and grows as later members close. That
19981
- * is later, and complete. With grouping alone the group opens on the first
19982
- * object event and picks up names as they are confirmed, through the growth
19983
- * path. Neither combination fires twice for one subject.
19984
- *
19985
- * `.optional()` and deliberately NOT `.default()`: a Zod default does not run
19986
- * on the addon cap path, so absent must keep meaning what it meant before this
19987
- * field existed.
19930
+ * IMMEDIATE GROUPED (D692): the first matching subject opens a window of this many
19931
+ * seconds; the rule sends ONE message when the window closes — early, once every
19932
+ * subject in it is final, never before {@link NC_GROUPING_MIN_SEC} — naming everybody
19933
+ * the rule matched, with one mosaic tile per subject.
19934
+ * Absent = plain immediate (one message per track, at the first match).
19935
+ * Only an `immediate` DETECTION rule may carry it (`ruleGroupingApplies`, enforced on
19936
+ * save by the hub's grouping guard). `.optional()`, never `.default()`: the addon cap
19937
+ * path does not run Zod defaults.
19988
19938
  */
19989
- groupIdleSec: number().int().min(0).max(600).optional()
19939
+ groupingSec: number().int().min(5).max(60).optional()
19990
19940
  });
19991
19941
  /**
19992
19942
  * Partial patch for `updateRule` — any subset of the input fields, plus the
@@ -20034,9 +19984,10 @@ var NcRuleClearableKeySchema = _enum([
20034
19984
  "targetUsers",
20035
19985
  "snoozeOptions",
20036
19986
  "snoozeAllowGlobal",
20037
- "waitForEnhancement",
20038
19987
  "actions",
20039
19988
  "confirm",
19989
+ "groupingSec",
19990
+ "waitForEnhancement",
20040
19991
  "groupIdleSec"
20041
19992
  ]);
20042
19993
  var NcRuleUpdateInputSchema = object({
@@ -20058,9 +20009,25 @@ var NcRuleSchema = NcRuleInputSchema.extend({
20058
20009
  */
20059
20010
  disabledTargetIds: array(string()).default([])
20060
20011
  });
20012
+ /**
20013
+ * The state-summary SECTIONS (D647 / D698): the D637 kind groups that report a
20014
+ * still-true state. `backups-exports` and `alarm` are not sections — a completed
20015
+ * job is not an open state, and the alarm stays instant.
20016
+ */
20017
+ var NcStateSummarySectionIdSchema = _enum([
20018
+ "device-state",
20019
+ "streams",
20020
+ "battery",
20021
+ "consumables",
20022
+ "tanks",
20023
+ "detection-blind",
20024
+ "nodes",
20025
+ "addons",
20026
+ "updates"
20027
+ ]);
20061
20028
  /** One section of a previewed state summary. `unavailable` = its state could not be read. */
20062
20029
  var NcStateSummaryPreviewSectionSchema = object({
20063
- id: string(),
20030
+ id: NcStateSummarySectionIdSchema,
20064
20031
  status: _enum(["read", "unavailable"]),
20065
20032
  items: number().int().nonnegative(),
20066
20033
  reason: string().optional()
@@ -20070,7 +20037,7 @@ var NcStateSummaryPreviewSectionSchema = object({
20070
20037
  * a `rule` split (no `section`), one section's on a `section` split.
20071
20038
  */
20072
20039
  var NcStateSummaryPreviewRowSchema = object({
20073
- section: string().optional(),
20040
+ section: NcStateSummarySectionIdSchema.optional(),
20074
20041
  /** The section's name on a per-section row; every reported section's, joined, on a combined one. */
20075
20042
  title: string(),
20076
20043
  text: string(),
@@ -21969,14 +21936,14 @@ var TrackSchema = object({
21969
21936
  * `derive-returned-null tile=standin`,
21970
21937
  * `native-tile tile=native no-key-frame-at-close`, …) written at close and
21971
21938
  * CLEARED by the late-keyFrame upgrade when a native tile lands after all.
21972
- * The operator-facing answer to "perché manca l'immagine?" on a track whose
21939
+ * The operator-facing answer to "perché manca l'immagine?" [why is the image missing?] on a track whose
21973
21940
  * tile is a face/plate stand-in, a raster crop, or an icon.
21974
21941
  *
21975
21942
  * **`no-key-frame-at-close` (D400).** The line used to be written ONLY when
21976
21943
  * the TILE ranked below native, so a track whose thumbnail landed natively
21977
21944
  * while its key frame missed carried no reason at all — three of the four
21978
21945
  * `MISSING_KEYFRAME` tracks in the 2026-09-07 operator audit were exactly
21979
- * that shape, and their "niente ultimo" had no cause anywhere on the row.
21946
+ * that shape, and their "niente ultimo" [no last frame] had no cause anywhere on the row.
21980
21947
  * The key frame is the head of a cascade (`keyFrame ⇒ keyFrameSmall ⇒ the
21981
21948
  * lastFrame copy source`), so its absence is now on this line whatever the
21982
21949
  * tile ended up being.
@@ -22063,7 +22030,7 @@ var MotionEventSchema = object({
22063
22030
  /**
22064
22031
  * Ms offsets from `timestamp` (the episode's own first rising edge, so the
22065
22032
  * first entry is always `0`) of every genuine off→on transition the
22066
- * episode saw — "ogni evento on si deve salvare" (D475). NOT one entry per
22033
+ * episode saw — "ogni evento on si deve salvare" [every ON event must be saved] (D475). NOT one entry per
22067
22034
  * push: a firmware source that keepalives at ~1 Hz for the whole burst
22068
22035
  * (Reolink, Hikvision) produces exactly one edge; a source that reports an
22069
22036
  * explicit `false` mid-episode and then resumes before the quiet window
@@ -22587,6 +22554,7 @@ var KeyEventSchema = object({
22587
22554
  bestEventId: string(),
22588
22555
  /** Track lifetime in ms (lastSeen - firstSeen). */
22589
22556
  windowMs: number().optional(),
22557
+ audioLabels: array(TrackAudioLabelSchema).readonly().optional(),
22590
22558
  ...TrackFlagFields,
22591
22559
  ...TrackRetrainFields
22592
22560
  });
@@ -27299,7 +27267,7 @@ var ClipPlaybackSchema = object({
27299
27267
  * **One authorised yes is one wake.** `next-natural` — take the clip the next
27300
27268
  * time the camera is awake for its own reasons — is deliberately not a member:
27301
27269
  * it was proposed, it is free on the battery, and the operator declined it on
27302
- * 2026-09-20 (*"Quando un export viene richiesto si sveglia la camera."*,
27270
+ * 2026-09-20 (*"Quando un export viene richiesto si sveglia la camera."* [When an export is requested the camera wakes up],
27303
27271
  * D558 "Considered and not taken").
27304
27272
  */
27305
27273
  var ClipWakeSchema = _enum(["authorised"]);
@@ -27560,7 +27528,7 @@ DeviceType.Camera, method(object({
27560
27528
  * It replaced `sources?: string[]`, a VIEW filter over source ids that
27561
27529
  * assumed the answer was a fan-out over everything a camera has. The
27562
27530
  * operator settled otherwise on 2026-09-20 — *"l'utilizzatore è uno
27563
- * solo"* — so the list is asked of one provider at a time and there is
27531
+ * solo"* [there is only one user] — so the list is asked of one provider at a time and there is
27564
27532
  * nothing to filter out of it.
27565
27533
  */
27566
27534
  provider: string().min(1)
@@ -33678,7 +33646,7 @@ var ReadGopBytesResultSchema = object({
33678
33646
  /**
33679
33647
  * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
33680
33648
  * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
33681
- * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
33649
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-clip-replay-on-pipeline.md`):
33682
33650
  * a replay needs several seconds of native pixels, not one frame.
33683
33651
  *
33684
33652
  * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
@@ -36294,6 +36262,7 @@ DeviceType.Camera, method(object({
36294
36262
  detection: array(ZoneRuleSchema).readonly(),
36295
36263
  package: array(ZoneRuleSchema).readonly()
36296
36264
  });
36265
+ SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
36297
36266
  /**
36298
36267
  * Accessory device helpers — shared across drivers.
36299
36268
  *
@@ -44856,6 +44825,11 @@ Object.freeze({
44856
44825
  }
44857
44826
  });
44858
44827
  Object.freeze({
44828
+ "accessories.getStatus": [{
44829
+ name: "deviceId",
44830
+ form: "single",
44831
+ optional: false
44832
+ }],
44859
44833
  "accessories.setChildHidden": [{
44860
44834
  name: "childDeviceId",
44861
44835
  form: "single",
@@ -44875,6 +44849,11 @@ Object.freeze({
44875
44849
  form: "single",
44876
44850
  optional: false
44877
44851
  }],
44852
+ "airQualitySensor.getStatus": [{
44853
+ name: "deviceId",
44854
+ form: "single",
44855
+ optional: false
44856
+ }],
44878
44857
  "alarmPanel.arm": [{
44879
44858
  name: "deviceId",
44880
44859
  form: "single",
@@ -44885,11 +44864,36 @@ Object.freeze({
44885
44864
  form: "single",
44886
44865
  optional: false
44887
44866
  }],
44867
+ "alarmPanel.getStatus": [{
44868
+ name: "deviceId",
44869
+ form: "single",
44870
+ optional: false
44871
+ }],
44888
44872
  "alarmPanel.trigger": [{
44889
44873
  name: "deviceId",
44890
44874
  form: "single",
44891
44875
  optional: false
44892
44876
  }],
44877
+ "ambientLightSensor.getStatus": [{
44878
+ name: "deviceId",
44879
+ form: "single",
44880
+ optional: false
44881
+ }],
44882
+ "audioAnalysis.applyDeviceSettingsPatch": [{
44883
+ name: "deviceId",
44884
+ form: "single",
44885
+ optional: false
44886
+ }],
44887
+ "audioAnalysis.getDeviceLiveContribution": [{
44888
+ name: "deviceId",
44889
+ form: "single",
44890
+ optional: false
44891
+ }],
44892
+ "audioAnalysis.getDeviceSettingsContribution": [{
44893
+ name: "deviceId",
44894
+ form: "single",
44895
+ optional: false
44896
+ }],
44893
44897
  "audioAnalysis.resolveDeviceSettings": [{
44894
44898
  name: "deviceId",
44895
44899
  form: "single",
@@ -44930,16 +44934,36 @@ Object.freeze({
44930
44934
  form: "single",
44931
44935
  optional: false
44932
44936
  }],
44937
+ "automationControl.getStatus": [{
44938
+ name: "deviceId",
44939
+ form: "single",
44940
+ optional: false
44941
+ }],
44933
44942
  "automationControl.trigger": [{
44934
44943
  name: "deviceId",
44935
44944
  form: "single",
44936
44945
  optional: false
44937
44946
  }],
44947
+ "battery.getStatus": [{
44948
+ name: "deviceId",
44949
+ form: "single",
44950
+ optional: false
44951
+ }],
44938
44952
  "battery.wakeForStream": [{
44939
44953
  name: "deviceId",
44940
44954
  form: "single",
44941
44955
  optional: false
44942
44956
  }],
44957
+ "binary.getStatus": [{
44958
+ name: "deviceId",
44959
+ form: "single",
44960
+ optional: false
44961
+ }],
44962
+ "brightness.getStatus": [{
44963
+ name: "deviceId",
44964
+ form: "single",
44965
+ optional: false
44966
+ }],
44943
44967
  "brightness.setBrightness": [{
44944
44968
  name: "deviceId",
44945
44969
  form: "single",
@@ -44955,6 +44979,26 @@ Object.freeze({
44955
44979
  form: "single",
44956
44980
  optional: false
44957
44981
  }],
44982
+ "cameraCredentials.getStatus": [{
44983
+ name: "deviceId",
44984
+ form: "single",
44985
+ optional: false
44986
+ }],
44987
+ "cameraGridLayout.applyDeviceSettingsPatch": [{
44988
+ name: "deviceId",
44989
+ form: "single",
44990
+ optional: false
44991
+ }],
44992
+ "cameraGridLayout.getDeviceLiveContribution": [{
44993
+ name: "deviceId",
44994
+ form: "single",
44995
+ optional: false
44996
+ }],
44997
+ "cameraGridLayout.getDeviceSettingsContribution": [{
44998
+ name: "deviceId",
44999
+ form: "single",
45000
+ optional: false
45001
+ }],
44958
45002
  "cameraGridLayout.getLayout": [{
44959
45003
  name: "deviceId",
44960
45004
  form: "single",
@@ -44970,6 +45014,21 @@ Object.freeze({
44970
45014
  form: "single",
44971
45015
  optional: false
44972
45016
  }],
45017
+ "cameraPipelineConfig.applyDeviceSettingsPatch": [{
45018
+ name: "deviceId",
45019
+ form: "single",
45020
+ optional: false
45021
+ }],
45022
+ "cameraPipelineConfig.getDeviceLiveContribution": [{
45023
+ name: "deviceId",
45024
+ form: "single",
45025
+ optional: false
45026
+ }],
45027
+ "cameraPipelineConfig.getDeviceSettingsContribution": [{
45028
+ name: "deviceId",
45029
+ form: "single",
45030
+ optional: false
45031
+ }],
44973
45032
  "cameraStreams.getBrokerStreams": [{
44974
45033
  name: "deviceId",
44975
45034
  form: "single",
@@ -44995,6 +45054,16 @@ Object.freeze({
44995
45054
  form: "single",
44996
45055
  optional: false
44997
45056
  }],
45057
+ "carbonMonoxide.getStatus": [{
45058
+ name: "deviceId",
45059
+ form: "single",
45060
+ optional: false
45061
+ }],
45062
+ "climateControl.getStatus": [{
45063
+ name: "deviceId",
45064
+ form: "single",
45065
+ optional: false
45066
+ }],
44998
45067
  "climateControl.setFanMode": [{
44999
45068
  name: "deviceId",
45000
45069
  form: "single",
@@ -45035,16 +45104,41 @@ Object.freeze({
45035
45104
  form: "single",
45036
45105
  optional: false
45037
45106
  }],
45107
+ "color.getStatus": [{
45108
+ name: "deviceId",
45109
+ form: "single",
45110
+ optional: false
45111
+ }],
45038
45112
  "color.setColor": [{
45039
45113
  name: "deviceId",
45040
45114
  form: "single",
45041
45115
  optional: false
45042
45116
  }],
45117
+ "connectivity.getStatus": [{
45118
+ name: "deviceId",
45119
+ form: "single",
45120
+ optional: false
45121
+ }],
45122
+ "consumables.getStatus": [{
45123
+ name: "deviceId",
45124
+ form: "single",
45125
+ optional: false
45126
+ }],
45043
45127
  "consumables.reset": [{
45044
45128
  name: "deviceId",
45045
45129
  form: "single",
45046
45130
  optional: false
45047
45131
  }],
45132
+ "contact.getStatus": [{
45133
+ name: "deviceId",
45134
+ form: "single",
45135
+ optional: false
45136
+ }],
45137
+ "control.getStatus": [{
45138
+ name: "deviceId",
45139
+ form: "single",
45140
+ optional: false
45141
+ }],
45048
45142
  "control.setValue": [{
45049
45143
  name: "deviceId",
45050
45144
  form: "single",
@@ -45055,6 +45149,11 @@ Object.freeze({
45055
45149
  form: "single",
45056
45150
  optional: false
45057
45151
  }],
45152
+ "cover.getStatus": [{
45153
+ name: "deviceId",
45154
+ form: "single",
45155
+ optional: false
45156
+ }],
45058
45157
  "cover.open": [{
45059
45158
  name: "deviceId",
45060
45159
  form: "single",
@@ -45080,6 +45179,11 @@ Object.freeze({
45080
45179
  form: "single",
45081
45180
  optional: false
45082
45181
  }],
45182
+ "dayNight.getStatus": [{
45183
+ name: "deviceId",
45184
+ form: "single",
45185
+ optional: false
45186
+ }],
45083
45187
  "dayNight.setSettings": [{
45084
45188
  name: "deviceId",
45085
45189
  form: "single",
@@ -45090,11 +45194,31 @@ Object.freeze({
45090
45194
  form: "single",
45091
45195
  optional: true
45092
45196
  }],
45197
+ "detectionPipeline.applyDeviceSettingsPatch": [{
45198
+ name: "deviceId",
45199
+ form: "single",
45200
+ optional: false
45201
+ }],
45202
+ "detectionPipeline.getDeviceLiveContribution": [{
45203
+ name: "deviceId",
45204
+ form: "single",
45205
+ optional: false
45206
+ }],
45207
+ "detectionPipeline.getDeviceSettingsContribution": [{
45208
+ name: "deviceId",
45209
+ form: "single",
45210
+ optional: false
45211
+ }],
45093
45212
  "deviceAdminLink.getAdminLink": [{
45094
45213
  name: "deviceId",
45095
45214
  form: "single",
45096
45215
  optional: false
45097
45216
  }],
45217
+ "deviceAdoption.getStatus": [{
45218
+ name: "deviceId",
45219
+ form: "single",
45220
+ optional: false
45221
+ }],
45098
45222
  "deviceAdoption.release": [{
45099
45223
  name: "camDeviceId",
45100
45224
  form: "single",
@@ -45110,6 +45234,11 @@ Object.freeze({
45110
45234
  form: "single",
45111
45235
  optional: false
45112
45236
  }],
45237
+ "deviceDiscovery.getStatus": [{
45238
+ name: "deviceId",
45239
+ form: "single",
45240
+ optional: false
45241
+ }],
45113
45242
  "deviceDiscovery.listDiscovered": [{
45114
45243
  name: "deviceId",
45115
45244
  form: "single",
@@ -45129,6 +45258,21 @@ Object.freeze({
45129
45258
  form: "single",
45130
45259
  optional: false
45131
45260
  }],
45261
+ "deviceExport.applyDeviceSettingsPatch": [{
45262
+ name: "deviceId",
45263
+ form: "single",
45264
+ optional: false
45265
+ }],
45266
+ "deviceExport.getDeviceLiveContribution": [{
45267
+ name: "deviceId",
45268
+ form: "single",
45269
+ optional: false
45270
+ }],
45271
+ "deviceExport.getDeviceSettingsContribution": [{
45272
+ name: "deviceId",
45273
+ form: "single",
45274
+ optional: false
45275
+ }],
45132
45276
  "deviceExtension.listCandidates": [{
45133
45277
  name: "deviceId",
45134
45278
  form: "single",
@@ -45477,6 +45621,26 @@ Object.freeze({
45477
45621
  form: "single",
45478
45622
  optional: false
45479
45623
  }],
45624
+ "deviceStatus.getStatus": [{
45625
+ name: "deviceId",
45626
+ form: "single",
45627
+ optional: false
45628
+ }],
45629
+ "doorbell.getStatus": [{
45630
+ name: "deviceId",
45631
+ form: "single",
45632
+ optional: false
45633
+ }],
45634
+ "enumSensor.getStatus": [{
45635
+ name: "deviceId",
45636
+ form: "single",
45637
+ optional: false
45638
+ }],
45639
+ "eventEmitter.getStatus": [{
45640
+ name: "deviceId",
45641
+ form: "single",
45642
+ optional: false
45643
+ }],
45480
45644
  "faceGallery.getFaceByTrack": [{
45481
45645
  name: "deviceId",
45482
45646
  form: "single",
@@ -45491,6 +45655,11 @@ Object.freeze({
45491
45655
  form: "array",
45492
45656
  optional: true
45493
45657
  }],
45658
+ "fanControl.getStatus": [{
45659
+ name: "deviceId",
45660
+ form: "single",
45661
+ optional: false
45662
+ }],
45494
45663
  "fanControl.setDirection": [{
45495
45664
  name: "deviceId",
45496
45665
  form: "single",
@@ -45511,6 +45680,26 @@ Object.freeze({
45511
45680
  form: "single",
45512
45681
  optional: false
45513
45682
  }],
45683
+ "featureProbe.getStatus": [{
45684
+ name: "deviceId",
45685
+ form: "single",
45686
+ optional: false
45687
+ }],
45688
+ "flood.getStatus": [{
45689
+ name: "deviceId",
45690
+ form: "single",
45691
+ optional: false
45692
+ }],
45693
+ "gas.getStatus": [{
45694
+ name: "deviceId",
45695
+ form: "single",
45696
+ optional: false
45697
+ }],
45698
+ "humidifier.getStatus": [{
45699
+ name: "deviceId",
45700
+ form: "single",
45701
+ optional: false
45702
+ }],
45514
45703
  "humidifier.setMode": [{
45515
45704
  name: "deviceId",
45516
45705
  form: "single",
@@ -45526,11 +45715,26 @@ Object.freeze({
45526
45715
  form: "single",
45527
45716
  optional: false
45528
45717
  }],
45718
+ "humiditySensor.getStatus": [{
45719
+ name: "deviceId",
45720
+ form: "single",
45721
+ optional: false
45722
+ }],
45723
+ "image.getStatus": [{
45724
+ name: "deviceId",
45725
+ form: "single",
45726
+ optional: false
45727
+ }],
45529
45728
  "imageSettings.getOptions": [{
45530
45729
  name: "deviceId",
45531
45730
  form: "single",
45532
45731
  optional: false
45533
45732
  }],
45733
+ "imageSettings.getStatus": [{
45734
+ name: "deviceId",
45735
+ form: "single",
45736
+ optional: false
45737
+ }],
45534
45738
  "imageSettings.setSettings": [{
45535
45739
  name: "deviceId",
45536
45740
  form: "single",
@@ -45541,6 +45745,11 @@ Object.freeze({
45541
45745
  form: "single",
45542
45746
  optional: false
45543
45747
  }],
45748
+ "intercom.getStatus": [{
45749
+ name: "deviceId",
45750
+ form: "single",
45751
+ optional: false
45752
+ }],
45544
45753
  "intercom.handleAnswer": [{
45545
45754
  name: "deviceId",
45546
45755
  form: "single",
@@ -45571,6 +45780,11 @@ Object.freeze({
45571
45780
  form: "single",
45572
45781
  optional: false
45573
45782
  }],
45783
+ "lawnMowerControl.getStatus": [{
45784
+ name: "deviceId",
45785
+ form: "single",
45786
+ optional: false
45787
+ }],
45574
45788
  "lawnMowerControl.pause": [{
45575
45789
  name: "deviceId",
45576
45790
  form: "single",
@@ -45581,6 +45795,11 @@ Object.freeze({
45581
45795
  form: "single",
45582
45796
  optional: false
45583
45797
  }],
45798
+ "lockControl.getStatus": [{
45799
+ name: "deviceId",
45800
+ form: "single",
45801
+ optional: false
45802
+ }],
45584
45803
  "lockControl.lock": [{
45585
45804
  name: "deviceId",
45586
45805
  form: "single",
@@ -45596,6 +45815,11 @@ Object.freeze({
45596
45815
  form: "single",
45597
45816
  optional: false
45598
45817
  }],
45818
+ "mediaPlayer.getStatus": [{
45819
+ name: "deviceId",
45820
+ form: "single",
45821
+ optional: false
45822
+ }],
45599
45823
  "mediaPlayer.next": [{
45600
45824
  name: "deviceId",
45601
45825
  form: "single",
@@ -45656,6 +45880,11 @@ Object.freeze({
45656
45880
  form: "single",
45657
45881
  optional: false
45658
45882
  }],
45883
+ "motion.getStatus": [{
45884
+ name: "deviceId",
45885
+ form: "single",
45886
+ optional: false
45887
+ }],
45659
45888
  "motion.isDetected": [{
45660
45889
  name: "deviceId",
45661
45890
  form: "single",
@@ -45666,11 +45895,31 @@ Object.freeze({
45666
45895
  form: "single",
45667
45896
  optional: false
45668
45897
  }],
45898
+ "motionDetection.applyDeviceSettingsPatch": [{
45899
+ name: "deviceId",
45900
+ form: "single",
45901
+ optional: false
45902
+ }],
45903
+ "motionDetection.getDeviceLiveContribution": [{
45904
+ name: "deviceId",
45905
+ form: "single",
45906
+ optional: false
45907
+ }],
45908
+ "motionDetection.getDeviceSettingsContribution": [{
45909
+ name: "deviceId",
45910
+ form: "single",
45911
+ optional: false
45912
+ }],
45669
45913
  "motionDetection.removeCamera": [{
45670
45914
  name: "deviceId",
45671
45915
  form: "single",
45672
45916
  optional: false
45673
45917
  }],
45918
+ "motionTrigger.getStatus": [{
45919
+ name: "deviceId",
45920
+ form: "single",
45921
+ optional: false
45922
+ }],
45674
45923
  "motionTrigger.setMotionTrigger": [{
45675
45924
  name: "deviceId",
45676
45925
  form: "single",
@@ -45681,6 +45930,11 @@ Object.freeze({
45681
45930
  form: "single",
45682
45931
  optional: false
45683
45932
  }],
45933
+ "motionZones.getStatus": [{
45934
+ name: "deviceId",
45935
+ form: "single",
45936
+ optional: false
45937
+ }],
45684
45938
  "motionZones.setZone": [{
45685
45939
  name: "deviceId",
45686
45940
  form: "single",
@@ -45691,6 +45945,11 @@ Object.freeze({
45691
45945
  form: "single",
45692
45946
  optional: false
45693
45947
  }],
45948
+ "nativeObjectDetection.getStatus": [{
45949
+ name: "deviceId",
45950
+ form: "single",
45951
+ optional: false
45952
+ }],
45694
45953
  "nativeObjectDetection.setEnabled": [{
45695
45954
  name: "deviceId",
45696
45955
  form: "single",
@@ -45706,6 +45965,11 @@ Object.freeze({
45706
45965
  form: "single",
45707
45966
  optional: false
45708
45967
  }],
45968
+ "navigation.getStatus": [{
45969
+ name: "deviceId",
45970
+ form: "single",
45971
+ optional: false
45972
+ }],
45709
45973
  "navigation.goToPoint": [{
45710
45974
  name: "deviceId",
45711
45975
  form: "single",
@@ -45751,6 +46015,11 @@ Object.freeze({
45751
46015
  form: "single",
45752
46016
  optional: false
45753
46017
  }],
46018
+ "networkLink.getStatus": [{
46019
+ name: "deviceId",
46020
+ form: "single",
46021
+ optional: false
46022
+ }],
45754
46023
  "networkQuality.getDeviceStats": [{
45755
46024
  name: "deviceId",
45756
46025
  form: "single",
@@ -45776,11 +46045,26 @@ Object.freeze({
45776
46045
  form: "single",
45777
46046
  optional: false
45778
46047
  }],
46048
+ "notifier.getStatus": [{
46049
+ name: "deviceId",
46050
+ form: "single",
46051
+ optional: false
46052
+ }],
45779
46053
  "notifier.send": [{
45780
46054
  name: "deviceId",
45781
46055
  form: "single",
45782
46056
  optional: false
45783
46057
  }],
46058
+ "numericSensor.getStatus": [{
46059
+ name: "deviceId",
46060
+ form: "single",
46061
+ optional: false
46062
+ }],
46063
+ "osd.getStatus": [{
46064
+ name: "deviceId",
46065
+ form: "single",
46066
+ optional: false
46067
+ }],
45784
46068
  "osd.setOverlay": [{
45785
46069
  name: "deviceId",
45786
46070
  form: "single",
@@ -45840,6 +46124,11 @@ Object.freeze({
45840
46124
  form: "single",
45841
46125
  optional: false
45842
46126
  }],
46127
+ "petFeeder.getStatus": [{
46128
+ name: "deviceId",
46129
+ form: "single",
46130
+ optional: false
46131
+ }],
45843
46132
  "petFeeder.markFoodReplenished": [{
45844
46133
  name: "deviceId",
45845
46134
  form: "single",
@@ -45875,6 +46164,11 @@ Object.freeze({
45875
46164
  form: "single",
45876
46165
  optional: false
45877
46166
  }],
46167
+ "pipelineAnalytics.applyDeviceSettingsPatch": [{
46168
+ name: "deviceId",
46169
+ form: "single",
46170
+ optional: false
46171
+ }],
45878
46172
  "pipelineAnalytics.clearTrackRelation": [{
45879
46173
  name: "deviceId",
45880
46174
  form: "single",
@@ -45915,6 +46209,16 @@ Object.freeze({
45915
46209
  form: "single",
45916
46210
  optional: false
45917
46211
  }],
46212
+ "pipelineAnalytics.getDeviceLiveContribution": [{
46213
+ name: "deviceId",
46214
+ form: "single",
46215
+ optional: false
46216
+ }],
46217
+ "pipelineAnalytics.getDeviceSettingsContribution": [{
46218
+ name: "deviceId",
46219
+ form: "single",
46220
+ optional: false
46221
+ }],
45918
46222
  "pipelineAnalytics.getEventDensity": [{
45919
46223
  name: "deviceId",
45920
46224
  form: "single",
@@ -46130,6 +46434,11 @@ Object.freeze({
46130
46434
  form: "single",
46131
46435
  optional: true
46132
46436
  }],
46437
+ "pipelineOrchestrator.applyDeviceSettingsPatch": [{
46438
+ name: "deviceId",
46439
+ form: "single",
46440
+ optional: false
46441
+ }],
46133
46442
  "pipelineOrchestrator.assignAudio": [{
46134
46443
  name: "deviceId",
46135
46444
  form: "single",
@@ -46175,6 +46484,16 @@ Object.freeze({
46175
46484
  form: "single",
46176
46485
  optional: false
46177
46486
  }],
46487
+ "pipelineOrchestrator.getDeviceLiveContribution": [{
46488
+ name: "deviceId",
46489
+ form: "single",
46490
+ optional: false
46491
+ }],
46492
+ "pipelineOrchestrator.getDeviceSettingsContribution": [{
46493
+ name: "deviceId",
46494
+ form: "single",
46495
+ optional: false
46496
+ }],
46178
46497
  "pipelineOrchestrator.getPipelineAssignment": [{
46179
46498
  name: "deviceId",
46180
46499
  form: "single",
@@ -46295,11 +46614,31 @@ Object.freeze({
46295
46614
  form: "single",
46296
46615
  optional: true
46297
46616
  }],
46617
+ "powerMeter.getStatus": [{
46618
+ name: "deviceId",
46619
+ form: "single",
46620
+ optional: false
46621
+ }],
46622
+ "presence.getStatus": [{
46623
+ name: "deviceId",
46624
+ form: "single",
46625
+ optional: false
46626
+ }],
46627
+ "pressureSensor.getStatus": [{
46628
+ name: "deviceId",
46629
+ form: "single",
46630
+ optional: false
46631
+ }],
46298
46632
  "privacyMask.getOptions": [{
46299
46633
  name: "deviceId",
46300
46634
  form: "single",
46301
46635
  optional: false
46302
46636
  }],
46637
+ "privacyMask.getStatus": [{
46638
+ name: "deviceId",
46639
+ form: "single",
46640
+ optional: false
46641
+ }],
46303
46642
  "privacyMask.setAudioEnabled": [{
46304
46643
  name: "deviceId",
46305
46644
  form: "single",
@@ -46350,6 +46689,11 @@ Object.freeze({
46350
46689
  form: "single",
46351
46690
  optional: false
46352
46691
  }],
46692
+ "ptz.getStatus": [{
46693
+ name: "deviceId",
46694
+ form: "single",
46695
+ optional: false
46696
+ }],
46353
46697
  "ptz.goHome": [{
46354
46698
  name: "deviceId",
46355
46699
  form: "single",
@@ -46440,6 +46784,11 @@ Object.freeze({
46440
46784
  form: "single",
46441
46785
  optional: false
46442
46786
  }],
46787
+ "recordingArchive.applyDeviceSettingsPatch": [{
46788
+ name: "deviceId",
46789
+ form: "single",
46790
+ optional: false
46791
+ }],
46443
46792
  "recordingArchive.deleteFootprint": [{
46444
46793
  name: "deviceId",
46445
46794
  form: "single",
@@ -46460,6 +46809,21 @@ Object.freeze({
46460
46809
  form: "single",
46461
46810
  optional: false
46462
46811
  }],
46812
+ "recordingArchive.getDeviceLiveContribution": [{
46813
+ name: "deviceId",
46814
+ form: "single",
46815
+ optional: false
46816
+ }],
46817
+ "recordingArchive.getDeviceSettingsContribution": [{
46818
+ name: "deviceId",
46819
+ form: "single",
46820
+ optional: false
46821
+ }],
46822
+ "recordingArchive.getStatus": [{
46823
+ name: "deviceId",
46824
+ form: "single",
46825
+ optional: false
46826
+ }],
46463
46827
  "recordingArchive.listOpsLog": [{
46464
46828
  name: "deviceId",
46465
46829
  form: "single",
@@ -46545,6 +46909,11 @@ Object.freeze({
46545
46909
  form: "single",
46546
46910
  optional: false
46547
46911
  }],
46912
+ "recordingOnboard.getStatus": [{
46913
+ name: "deviceId",
46914
+ form: "single",
46915
+ optional: false
46916
+ }],
46548
46917
  "recordingOnboard.setSettings": [{
46549
46918
  name: "deviceId",
46550
46919
  form: "single",
@@ -46575,6 +46944,11 @@ Object.freeze({
46575
46944
  form: "single",
46576
46945
  optional: false
46577
46946
  }],
46947
+ "sceneMonitor.getStatus": [{
46948
+ name: "deviceId",
46949
+ form: "single",
46950
+ optional: false
46951
+ }],
46578
46952
  "sceneMonitor.listScenes": [{
46579
46953
  name: "deviceId",
46580
46954
  form: "single",
@@ -46600,6 +46974,11 @@ Object.freeze({
46600
46974
  form: "single",
46601
46975
  optional: false
46602
46976
  }],
46977
+ "scriptRunner.getStatus": [{
46978
+ name: "deviceId",
46979
+ form: "single",
46980
+ optional: false
46981
+ }],
46603
46982
  "scriptRunner.run": [{
46604
46983
  name: "deviceId",
46605
46984
  form: "single",
@@ -46610,11 +46989,31 @@ Object.freeze({
46610
46989
  form: "single",
46611
46990
  optional: false
46612
46991
  }],
46992
+ "smoke.getStatus": [{
46993
+ name: "deviceId",
46994
+ form: "single",
46995
+ optional: false
46996
+ }],
46997
+ "snapshot.applyDeviceSettingsPatch": [{
46998
+ name: "deviceId",
46999
+ form: "single",
47000
+ optional: false
47001
+ }],
46613
47002
  "snapshot.getDebugState": [{
46614
47003
  name: "deviceId",
46615
47004
  form: "single",
46616
47005
  optional: false
46617
47006
  }],
47007
+ "snapshot.getDeviceLiveContribution": [{
47008
+ name: "deviceId",
47009
+ form: "single",
47010
+ optional: false
47011
+ }],
47012
+ "snapshot.getDeviceSettingsContribution": [{
47013
+ name: "deviceId",
47014
+ form: "single",
47015
+ optional: false
47016
+ }],
46618
47017
  "snapshot.getSnapshot": [{
46619
47018
  name: "deviceId",
46620
47019
  form: "single",
@@ -46631,6 +47030,11 @@ Object.freeze({
46631
47030
  form: "array",
46632
47031
  optional: false
46633
47032
  }],
47033
+ "snapshot.getStatus": [{
47034
+ name: "deviceId",
47035
+ form: "single",
47036
+ optional: false
47037
+ }],
46634
47038
  "snapshot.invalidateCache": [{
46635
47039
  name: "deviceId",
46636
47040
  form: "single",
@@ -46641,6 +47045,11 @@ Object.freeze({
46641
47045
  form: "single",
46642
47046
  optional: false
46643
47047
  }],
47048
+ "streamBroker.applyDeviceSettingsPatch": [{
47049
+ name: "deviceId",
47050
+ form: "single",
47051
+ optional: false
47052
+ }],
46644
47053
  "streamBroker.assignProfile": [{
46645
47054
  name: "deviceId",
46646
47055
  form: "single",
@@ -46656,6 +47065,16 @@ Object.freeze({
46656
47065
  form: "single",
46657
47066
  optional: false
46658
47067
  }],
47068
+ "streamBroker.getDeviceLiveContribution": [{
47069
+ name: "deviceId",
47070
+ form: "single",
47071
+ optional: false
47072
+ }],
47073
+ "streamBroker.getDeviceSettingsContribution": [{
47074
+ name: "deviceId",
47075
+ form: "single",
47076
+ optional: false
47077
+ }],
46659
47078
  "streamBroker.getStreamWithCodec": [{
46660
47079
  name: "deviceId",
46661
47080
  form: "single",
@@ -46716,16 +47135,46 @@ Object.freeze({
46716
47135
  form: "single",
46717
47136
  optional: false
46718
47137
  }],
47138
+ "streamParams.getStatus": [{
47139
+ name: "deviceId",
47140
+ form: "single",
47141
+ optional: false
47142
+ }],
46719
47143
  "streamParams.setProfile": [{
46720
47144
  name: "deviceId",
46721
47145
  form: "single",
46722
47146
  optional: false
46723
47147
  }],
47148
+ "switch.getStatus": [{
47149
+ name: "deviceId",
47150
+ form: "single",
47151
+ optional: false
47152
+ }],
46724
47153
  "switch.setState": [{
46725
47154
  name: "deviceId",
46726
47155
  form: "single",
46727
47156
  optional: false
46728
47157
  }],
47158
+ "tamper.getStatus": [{
47159
+ name: "deviceId",
47160
+ form: "single",
47161
+ optional: false
47162
+ }],
47163
+ "temperatureSensor.getStatus": [{
47164
+ name: "deviceId",
47165
+ form: "single",
47166
+ optional: false
47167
+ }],
47168
+ "update.getStatus": [{
47169
+ name: "deviceId",
47170
+ form: "single",
47171
+ optional: false
47172
+ }],
47173
+ "vacuumControl.getStatus": [{
47174
+ name: "deviceId",
47175
+ form: "single",
47176
+ optional: false
47177
+ }],
46729
47178
  "vacuumControl.locate": [{
46730
47179
  name: "deviceId",
46731
47180
  form: "single",
@@ -46761,6 +47210,11 @@ Object.freeze({
46761
47210
  form: "single",
46762
47211
  optional: false
46763
47212
  }],
47213
+ "valve.getStatus": [{
47214
+ name: "deviceId",
47215
+ form: "single",
47216
+ optional: false
47217
+ }],
46764
47218
  "valve.open": [{
46765
47219
  name: "deviceId",
46766
47220
  form: "single",
@@ -46776,6 +47230,11 @@ Object.freeze({
46776
47230
  form: "single",
46777
47231
  optional: false
46778
47232
  }],
47233
+ "vibration.getStatus": [{
47234
+ name: "deviceId",
47235
+ form: "single",
47236
+ optional: false
47237
+ }],
46779
47238
  "videoclips.dialClipStream": [{
46780
47239
  name: "deviceId",
46781
47240
  form: "single",
@@ -46811,6 +47270,11 @@ Object.freeze({
46811
47270
  form: "single",
46812
47271
  optional: false
46813
47272
  }],
47273
+ "waterHeater.getStatus": [{
47274
+ name: "deviceId",
47275
+ form: "single",
47276
+ optional: false
47277
+ }],
46814
47278
  "waterHeater.setAway": [{
46815
47279
  name: "deviceId",
46816
47280
  form: "single",
@@ -46826,6 +47290,11 @@ Object.freeze({
46826
47290
  form: "single",
46827
47291
  optional: false
46828
47292
  }],
47293
+ "weather.getStatus": [{
47294
+ name: "deviceId",
47295
+ form: "single",
47296
+ optional: false
47297
+ }],
46829
47298
  "webrtcSession.addIceCandidate": [{
46830
47299
  name: "deviceId",
46831
47300
  form: "single",
@@ -47563,7 +48032,7 @@ var PreviewTextField = string().max(200);
47563
48032
  * Whether the notification's preview is a STILL or a short animation.
47564
48033
  *
47565
48034
  * The operator's ask, verbatim: *"inviato come gif o video (come per le altre
47566
- * rule)"* — the other rules already offer an animated preview, and a ten-hour
48035
+ * rule)"* [sent as a gif or video (as for the other rules)] — the other rules already offer an animated preview, and a ten-hour
47567
48036
  * night reads better as three seconds of motion than as one frame of it. Both
47568
48037
  * modes get the SAME treatment (blurred frame, large centred title); `'gif'`
47569
48038
  * simply applies it to a dozen frames sampled across the render and assembles