@camstack/addon-provider-amcrest 0.2.126 → 0.2.127

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 (3) hide show
  1. package/dist/addon.js +600 -141
  2. package/dist/addon.mjs +600 -141
  3. package/package.json +1 -3
package/dist/addon.js CHANGED
@@ -7447,7 +7447,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
7447
7447
  return DeviceRole;
7448
7448
  }({});
7449
7449
  //#endregion
7450
- //#region ../types/dist/composition-43aqsZQj.mjs
7450
+ //#region ../types/dist/composition-Bzr7GwgP.mjs
7451
7451
  /**
7452
7452
  * The ffmpeg build every CamStack node downloads, per platform and arch.
7453
7453
  *
@@ -7501,20 +7501,20 @@ function portable(target) {
7501
7501
  }
7502
7502
  portable("linux64"), portable("linuxarm64"), portable("macarm64"), portable("mac64");
7503
7503
  /**
7504
- * LA tabella "quale booleano di questo tipo di device conta come ALTO", e il
7505
- * valutatore puro del suo FRONTE.
7504
+ * THE table "which boolean of this device type counts as HIGH", and the
7505
+ * pure evaluator of its EDGE.
7506
7506
  *
7507
- * UNA tabella per tutti quelli che chiedono "questo device è ALTO?": il
7508
- * trigger `RecordingTriggers.sensorDeviceIds` del recorder, i marker dei
7509
- * sensori della post-analysis, il bridge camera-sensors dell'orchestratore e
7510
- * le sorgenti di un campanello composto (`doorbellFeatureSources`, D671).
7511
- * Una seconda copia divergerebbe alla prima cap aggiunta, e il sintomo — "il
7512
- * sensore fa suonare il campanello ma non registra" — è esattamente D62.
7507
+ * ONE table for everyone who asks "is this device HIGH?": the
7508
+ * recorder's `RecordingTriggers.sensorDeviceIds` trigger, the post-analysis
7509
+ * sensor markers, the orchestrator's camera-sensors bridge and
7510
+ * the sources of a composite doorbell (`doorbellFeatureSources`, D671).
7511
+ * A second copy would diverge at the first cap added, and the symptom — "the
7512
+ * sensor rings the doorbell but does not record" — is exactly D62.
7513
7513
  *
7514
- * ⚠ NON è `DEVICE_STATE_READERS` (`catalogs/device-state-vocabulary.ts`), e le
7515
- * due non vanno unificate: quella risponde a "qual è la PAROLA di stato per una
7516
- * regola" (e include `presence`, `cover`, `alarm-panel`), questa a "qual è il
7517
- * booleano il cui FRONTE conta". Vocabolari deliberatamente diversi.
7514
+ * ⚠ NOT `DEVICE_STATE_READERS` (`catalogs/device-state-vocabulary.ts`), and the
7515
+ * two must not be unified: that one answers "what is the state WORD for a
7516
+ * rule" (and includes `presence`, `cover`, `alarm-panel`), this one "which
7517
+ * boolean's EDGE counts". Deliberately different vocabularies.
7518
7518
  */
7519
7519
  /**
7520
7520
  * Known binary / switch source caps → the boolean slice field whose
@@ -7535,6 +7535,8 @@ var SOURCE_CAP_ACTIVE_FIELD = {
7535
7535
  vibration: "detected",
7536
7536
  tamper: "tampered"
7537
7537
  };
7538
+ /** Cap names whose presence in a device's bindings qualify it as a source. */
7539
+ var SOURCE_CAPS = Object.keys(SOURCE_CAP_ACTIVE_FIELD);
7538
7540
  /**
7539
7541
  * Error types for the safe expression engine. Two distinct classes so callers
7540
7542
  * can tell a compile-time (grammar) failure from a runtime (evaluation)
@@ -9141,22 +9143,22 @@ var CLASS_MAP_MACRO_TARGETS = [
9141
9143
  "package"
9142
9144
  ];
9143
9145
  /**
9144
- * Le macro classi di PRIMO LIVELLO: quelle che un object detector emette e che
9145
- * un operatore può selezionare.
9146
+ * The FIRST-LEVEL macro classes: those an object detector emits and that
9147
+ * an operator can select.
9146
9148
  *
9147
- * Sono le tre offerte dallo step `object-detection`
9149
+ * They are the three offered by the `object-detection` step
9148
9150
  * (`addon-pipeline/src/detection-pipeline/registry/step-definitions.ts`,
9149
- * `enabledMacroClasses`). `package` sta in {@link CLASS_MAP_MACRO_TARGETS} e in
9150
- * `MACRO_LABELS` — è una macro vera — ma NON qui: appartiene allo step
9151
- * `package-detection`, la cui abilitazione è guidata dalle zone, e offrire la
9152
- * stessa parola due volte ha già fatto accendere a un operatore il proxy COCO
9151
+ * `enabledMacroClasses`). `package` is in {@link CLASS_MAP_MACRO_TARGETS} and in
9152
+ * `MACRO_LABELS` — it is a true macro — but NOT here: it belongs to the step
9153
+ * `package-detection`, whose enablement is driven by zones, and offering the
9154
+ * same word twice has already made an operator turn on the COCO proxy
9153
9155
  * (suitcase/backpack/handbag) lasciando spento il detector dedicato.
9154
9156
  *
9155
- * UNA lista. Prima di oggi le stesse tre erano scritte a mano nell'offerta
9156
- * dello step e una seconda volta come union `FirstLevelMacro`
9157
- * (`types/detection.ts`); una terza copia per il trigger di registrazione
9158
- * (`RecordingTriggers.objectClasses`) avrebbe reso invisibile la divergenza
9159
- * successiva.
9157
+ * ONE list. Before today the same three were hand-written in the step's offer
9158
+ * and a second time as the union `FirstLevelMacro`
9159
+ * (`types/detection.ts`); a third copy for the recording trigger
9160
+ * (`RecordingTriggers.objectClasses`) would have made the later divergence
9161
+ * invisible.
9160
9162
  */
9161
9163
  var FIRST_LEVEL_MACRO_CLASSES = [
9162
9164
  "person",
@@ -9221,17 +9223,17 @@ var RecordingStorageModeSchema = _enum([
9221
9223
  "on-device-decision"
9222
9224
  ]);
9223
9225
  /**
9224
- * Le macro classi che possono aprire una finestra di registrazione — le stesse
9225
- * tre offerte dallo step `object-detection`, da UNA lista
9226
+ * The macro classes that can open a recording window — the same
9227
+ * three offered by the `object-detection` step, from ONE list
9226
9228
  * ({@link FIRST_LEVEL_MACRO_CLASSES}).
9227
9229
  */
9228
9230
  var RecordingObjectTriggerClassSchema = _enum(FIRST_LEVEL_MACRO_CLASSES);
9229
9231
  /**
9230
- * True quando `values` non ripete un elemento.
9232
+ * True when `values` does not repeat an element.
9231
9233
  *
9232
- * Un duplicato non è innocuo: ogni voce di `objectClasses` / `sensorDeviceIds`
9233
- * diventa una SORGENTE in `bandTriggerSources`, e la stessa sorgente due volte
9234
- * conterebbe due volte le sue finestre in `segmentMissedByMs`.
9234
+ * A duplicate is not harmless: every entry of `objectClasses` / `sensorDeviceIds`
9235
+ * becomes a SOURCE in `bandTriggerSources`, and the same source twice
9236
+ * would count its windows twice in `segmentMissedByMs`.
9235
9237
  */
9236
9238
  var noDuplicates = (values) => new Set(values).size === values.length;
9237
9239
  /** Which detectors trigger an `events`-mode band. */
@@ -9239,34 +9241,34 @@ var RecordingTriggersSchema = object({
9239
9241
  motion: boolean().optional(),
9240
9242
  audioThresholdDbfs: number().optional(),
9241
9243
  /**
9242
- * Le macro classi la cui detection apre una finestra. ASSENTE = la sorgente
9243
- * non è ascoltata; un array VUOTO è rifiutato, perché "banda events, trigger
9244
- * object acceso, nessuna classe" è la stessa forma "abilitata e non registra
9245
- * nulla, per sempre" contro cui è scritto `eventsBandCanEverDemand`.
9244
+ * The macro classes whose detection opens a window. ABSENT = the source
9245
+ * is not listened to; an EMPTY array is rejected, because "events band, object
9246
+ * trigger on, no class" is the same shape "enabled and records
9247
+ * nothing, forever" that `eventsBandCanEverDemand` is written against.
9246
9248
  *
9247
- * Il segnale letto è GIÀ FILTRATO: solo detection `source: 'pipeline'`, cioè
9248
- * quelle che hanno attraversato `enabledMacroClasses`, i
9249
- * `minConfidence<Macro>` e il full-frame guard. L'AI a bordo camera
9250
- * (`source: 'onboard'`) non attraversa nessuno di quei gate e NON apre
9251
- * finestre — vedi `recorder/object-trigger.ts`.
9249
+ * The signal read is ALREADY FILTERED: only `source: 'pipeline'` detections, i.e.
9250
+ * those that went through `enabledMacroClasses`, the
9251
+ * `minConfidence<Macro>` and the full-frame guard. The camera's onboard AI
9252
+ * (`source: 'onboard'`) goes through none of those gates and does NOT open
9253
+ * windows — see `recorder/object-trigger.ts`.
9252
9254
  */
9253
9255
  objectClasses: array(RecordingObjectTriggerClassSchema).min(1).refine(noDuplicates, { message: "objectClasses must not repeat a class" }).optional(),
9254
9256
  /**
9255
- * I device LINKED il cui FRONTE ALTO apre una finestra. Assente = la sorgente
9256
- * non è ascoltata; un array vuoto è rifiutato per la stessa ragione di
9257
+ * The LINKED devices whose RISING EDGE opens a window. Absent = the source
9258
+ * is not listened to; an empty array is rejected for the same reason as
9257
9259
  * `objectClasses`.
9258
9260
  *
9259
- * Sono id di device SORGENTE, non camere: la banda li nomina, quindi il
9260
- * percorso caldo (`DeviceStateChanged`, a ritmo di bus su tutta la flotta)
9261
- * non fa RPC. L'OFFERTA da cui l'operatore li sceglie è un'altra domanda, e
9262
- * si risolve con `deviceManager.getLinkedDevices` + `getBindingsBatch` per
9263
- * device (D12) — mai un elenco globale di cap.
9261
+ * These are SOURCE device ids, not cameras: the band names them, so the
9262
+ * hot path (`DeviceStateChanged`, at bus rate across the whole fleet)
9263
+ * does no RPC. The OFFER from which the operator picks them is another question, and
9264
+ * is resolved with `deviceManager.getLinkedDevices` + `getBindingsBatch` per
9265
+ * device (D12) — never a global list of caps.
9264
9266
  *
9265
- * Cosa vuol dire "alto" dipende dal TIPO di device e non è deciso qui:
9266
- * `SOURCE_CAP_ACTIVE_FIELD` (`catalogs/sensor-active-state.ts`) è LA tabella,
9267
- * la stessa del campanello composto (D671). Ed è il FRONTE, non
9268
- * il livello: un contatto trovato già aperto al riavvio del runner non fa
9269
- * registrare.
9267
+ * What "high" means depends on the device TYPE and is not decided here:
9268
+ * `SOURCE_CAP_ACTIVE_FIELD` (`catalogs/sensor-active-state.ts`) is THE table,
9269
+ * the same one as the composite doorbell (D671). And it is the EDGE, not
9270
+ * the level: a contact found already open at runner restart does not
9271
+ * record.
9270
9272
  */
9271
9273
  sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional()
9272
9274
  });
@@ -10343,7 +10345,7 @@ var DecoderSessionConfigSchema = object({
10343
10345
  * - **VALUE** — at which level, for which scope, until when. That stays ONE
10344
10346
  * thing: the logging settings document on the `system` cap. Two authorities
10345
10347
  * over the values is the exact defect
10346
- * `docs/design/plans/2026-08-26-logging-per-componente.md` was written to
10348
+ * `docs/design/plans/2026-08-26-per-component-logging.md` was written to
10347
10349
  * remove; re-introducing it from the cure side would be grotesque.
10348
10350
  *
10349
10351
  * Nothing in this file reads a clock, an env var or a store. The registry is
@@ -12054,7 +12056,7 @@ var BrokerStatusEnum = _enum([
12054
12056
  "unreachable",
12055
12057
  "error"
12056
12058
  ]);
12057
- var BrokerInfoSchema$1 = object({
12059
+ var BrokerInfoSchema = object({
12058
12060
  /** Stable broker id. Persisted; survives addon restarts. */
12059
12061
  id: string(),
12060
12062
  /** Addon id of the provider that OWNS this broker.
@@ -12187,7 +12189,7 @@ var GetStateInputSchema = object({
12187
12189
  * HA: entity_id (returns the cached entity state). */
12188
12190
  key: string()
12189
12191
  });
12190
- method(ListInputSchema, array(BrokerInfoSchema$1)), method(GetInputSchema, BrokerInfoSchema$1.nullable()), method(_void(), array(BrokerProviderInfoSchema), { auth: "admin" }), method(AddInputSchema, AddResultSchema, {
12192
+ method(ListInputSchema, array(BrokerInfoSchema)), method(GetInputSchema, BrokerInfoSchema.nullable()), method(_void(), array(BrokerProviderInfoSchema), { auth: "admin" }), method(AddInputSchema, AddResultSchema, {
12191
12193
  kind: "mutation",
12192
12194
  auth: "admin"
12193
12195
  }), method(RemoveInputSchema, _void(), {
@@ -13898,7 +13900,7 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
13898
13900
  *
13899
13901
  * ⚠ An earlier version of this comment blamed Zod stripping, and that
13900
13902
  * was wrong — corrected 2026-08-26 after the hop map
13901
- * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
13903
+ * (`docs/design/2026-08-26-topic-hop-map.md`) traced the path.
13902
13904
  * There is **no Zod parse at all** between the door and the engine: the
13903
13905
  * dispatcher forwards the payload verbatim and UDS carries it whole. A
13904
13906
  * field declared here reaches `SqliteSettingsBackend` either way.
@@ -16101,7 +16103,7 @@ method(object({
16101
16103
  * per-device window, `KeyFrameCaptureLog`, `bumpCropMetric`. Every one of them
16102
16104
  * ends in a log line, and a log line is the thing the operator asked to stop
16103
16105
  * needing: *"possiamo armare questi errori intanto? Così al prossimo giro
16104
- * ricontrolliamo tutti questi punti"*. Reading them meant grepping Loki and
16106
+ * 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
16105
16107
  * hand-correlating timestamps, which is how a 22% thumbnail gap and a 3-hour
16106
16108
  * media blackout were both diagnosed. The counters stay; this is where they can
16107
16109
  * be READ.
@@ -17477,7 +17479,7 @@ var BrokerStatusSchema$1 = _enum([
17477
17479
  "unreachable",
17478
17480
  "tls-error"
17479
17481
  ]);
17480
- var BrokerInfoSchema = object({
17482
+ var BrokerInfoSchema$1 = object({
17481
17483
  id: string(),
17482
17484
  name: string(),
17483
17485
  url: string(),
@@ -17540,7 +17542,7 @@ var StatusSchema = object({
17540
17542
  brokerCount: number(),
17541
17543
  embeddedRunning: boolean()
17542
17544
  });
17543
- method(_void(), array(BrokerInfoSchema)), method(IdInputSchema, BrokerConnectionDetailsSchema, { auth: "admin" }), method(AddBrokerInputSchema, AddBrokerResultSchema, {
17545
+ method(_void(), array(BrokerInfoSchema$1)), method(IdInputSchema, BrokerConnectionDetailsSchema, { auth: "admin" }), method(AddBrokerInputSchema, AddBrokerResultSchema, {
17544
17546
  kind: "mutation",
17545
17547
  auth: "admin"
17546
17548
  }), method(IdInputSchema, _void(), {
@@ -19754,78 +19756,16 @@ var NcRuleInputSchema = object({
19754
19756
  */
19755
19757
  confirm: NcConfirmSchema.optional(),
19756
19758
  /**
19757
- * WAIT for face/plate recognition before saying anything.
19758
- *
19759
- * A notification's TEXT is frozen at enqueue and its media is re-resolved at
19760
- * send; the identity is neither. A face is confirmed after `confirmFrames`
19761
- * agreeing observations — p50 **11.4 s** after the track was first seen,
19762
- * measured on this hub — and an `immediate` rule enqueues on the first object
19763
- * event, seconds before that. So "Gianluca è arrivato" is unsayable on the
19764
- * immediate path, and no amount of media re-resolution fixes a sentence.
19765
- *
19766
- * Only two honest answers exist, and this flag picks between them. It has
19767
- * effect ONLY on a rule that declares a recognition scope
19768
- * ({@link NcConditions.identities} or {@link NcConditions.plates}) — on any
19769
- * other rule there is nothing to wait for and the flag is inert.
19770
- *
19771
- * | value | what happens |
19772
- * | --- | --- |
19773
- * | `true` | the rule stops firing on the object event and fires at TRACK CLOSE instead, once, with the name — later, and complete |
19774
- * | 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) |
19775
- *
19776
- * `.optional()` and deliberately NOT `.default()`: a Zod default does not run
19777
- * on the addon cap path, and absent has to keep meaning exactly what every
19778
- * rule authored before this field meant.
19779
- *
19780
- * The cost of `true` is stated here because the editor states it too: a rule
19781
- * that waits also inherits track-close SEMANTICS — its `zones` condition
19782
- * tests every zone the track visited and a `crossing` condition can no longer
19783
- * be satisfied, because a closed track carries no crossing.
19759
+ * IMMEDIATE GROUPED (D692): the first matching subject opens a window of this many
19760
+ * seconds; the rule sends ONE message when the window closes — early, once every
19761
+ * subject in it is final, never before {@link NC_GROUPING_MIN_SEC} — naming everybody
19762
+ * the rule matched, with one mosaic tile per subject.
19763
+ * Absent = plain immediate (one message per track, at the first match).
19764
+ * Only an `immediate` DETECTION rule may carry it (`ruleGroupingApplies`, enforced on
19765
+ * save by the hub's grouping guard). `.optional()`, never `.default()`: the addon cap
19766
+ * path does not run Zod defaults.
19784
19767
  */
19785
- waitForEnhancement: boolean().optional(),
19786
- /**
19787
- * GROUP a burst of subjects into ONE notification that grows.
19788
- *
19789
- * Seconds of quiet after the last matching subject before the burst is
19790
- * considered over. While it is open, the first subject enqueues immediately —
19791
- * **exactly as today, with no added latency** — and every real growth (a new
19792
- * subject, or a name confirmed on one already in it) REPLACES that
19793
- * notification with an updated one naming everybody. The push carries the
19794
- * group's own coalescing tag, so the phone replaces rather than stacks.
19795
- *
19796
- * `0` / absent = off, and off is today's behaviour byte for byte.
19797
- *
19798
- * ### Why an idle cutoff and not a window
19799
- *
19800
- * The measured seven-person arrival on device 590 spans 110 s with every
19801
- * internal gap under 30 s. A 12 s fixed window cuts it into three groups; an
19802
- * idle cutoff holds it as one and ends it when the arrival actually ends.
19803
- * 30 s is a widely shipped value for the same decision.
19804
- *
19805
- * ### What it replaces
19806
- *
19807
- * The blind cooldown, which collapses a burst by DISCARDING it. Measured on
19808
- * device 615 / *Persona su Uscio* over six days: 116 qualifying tracks → 74
19809
- * notifications, **44 (37.9%) suppressed outright**, 23 of them overlapping a
19810
- * track that did fire and 7 carrying a confirmed identity nobody heard about.
19811
- * A group collapses the same volume by MERGING, so the cooldown becomes a
19812
- * budget over GROUPS — which is what it always meant — and a growth is never
19813
- * throttled by the window its own first member spent.
19814
- *
19815
- * ### Interaction with {@link waitForEnhancement}
19816
- *
19817
- * They compose, and the order matters. `waitForEnhancement` defers the rule to
19818
- * TRACK CLOSE, so with both set the group is opened by the first member to
19819
- * CLOSE — already carrying its name — and grows as later members close. That
19820
- * is later, and complete. With grouping alone the group opens on the first
19821
- * object event and picks up names as they are confirmed, through the growth
19822
- * path. Neither combination fires twice for one subject.
19823
- *
19824
- * `.optional()` and deliberately NOT `.default()`: a Zod default does not run
19825
- * on the addon cap path, so absent must keep meaning what it meant before this
19826
- * field existed.
19827
- */
19828
- groupIdleSec: number().int().min(0).max(600).optional()
19768
+ groupingSec: number().int().min(5).max(60).optional()
19829
19769
  });
19830
19770
  /**
19831
19771
  * Partial patch for `updateRule` — any subset of the input fields, plus the
@@ -19873,9 +19813,10 @@ var NcRuleClearableKeySchema = _enum([
19873
19813
  "targetUsers",
19874
19814
  "snoozeOptions",
19875
19815
  "snoozeAllowGlobal",
19876
- "waitForEnhancement",
19877
19816
  "actions",
19878
19817
  "confirm",
19818
+ "groupingSec",
19819
+ "waitForEnhancement",
19879
19820
  "groupIdleSec"
19880
19821
  ]);
19881
19822
  var NcRuleUpdateInputSchema = object({
@@ -19897,9 +19838,25 @@ var NcRuleSchema = NcRuleInputSchema.extend({
19897
19838
  */
19898
19839
  disabledTargetIds: array(string()).default([])
19899
19840
  });
19841
+ /**
19842
+ * The state-summary SECTIONS (D647 / D698): the D637 kind groups that report a
19843
+ * still-true state. `backups-exports` and `alarm` are not sections — a completed
19844
+ * job is not an open state, and the alarm stays instant.
19845
+ */
19846
+ var NcStateSummarySectionIdSchema = _enum([
19847
+ "device-state",
19848
+ "streams",
19849
+ "battery",
19850
+ "consumables",
19851
+ "tanks",
19852
+ "detection-blind",
19853
+ "nodes",
19854
+ "addons",
19855
+ "updates"
19856
+ ]);
19900
19857
  /** One section of a previewed state summary. `unavailable` = its state could not be read. */
19901
19858
  var NcStateSummaryPreviewSectionSchema = object({
19902
- id: string(),
19859
+ id: NcStateSummarySectionIdSchema,
19903
19860
  status: _enum(["read", "unavailable"]),
19904
19861
  items: number().int().nonnegative(),
19905
19862
  reason: string().optional()
@@ -19909,7 +19866,7 @@ var NcStateSummaryPreviewSectionSchema = object({
19909
19866
  * a `rule` split (no `section`), one section's on a `section` split.
19910
19867
  */
19911
19868
  var NcStateSummaryPreviewRowSchema = object({
19912
- section: string().optional(),
19869
+ section: NcStateSummarySectionIdSchema.optional(),
19913
19870
  /** The section's name on a per-section row; every reported section's, joined, on a combined one. */
19914
19871
  title: string(),
19915
19872
  text: string(),
@@ -21808,14 +21765,14 @@ var TrackSchema = object({
21808
21765
  * `derive-returned-null tile=standin`,
21809
21766
  * `native-tile tile=native no-key-frame-at-close`, …) written at close and
21810
21767
  * CLEARED by the late-keyFrame upgrade when a native tile lands after all.
21811
- * The operator-facing answer to "perché manca l'immagine?" on a track whose
21768
+ * The operator-facing answer to "perché manca l'immagine?" [why is the image missing?] on a track whose
21812
21769
  * tile is a face/plate stand-in, a raster crop, or an icon.
21813
21770
  *
21814
21771
  * **`no-key-frame-at-close` (D400).** The line used to be written ONLY when
21815
21772
  * the TILE ranked below native, so a track whose thumbnail landed natively
21816
21773
  * while its key frame missed carried no reason at all — three of the four
21817
21774
  * `MISSING_KEYFRAME` tracks in the 2026-09-07 operator audit were exactly
21818
- * that shape, and their "niente ultimo" had no cause anywhere on the row.
21775
+ * that shape, and their "niente ultimo" [no last frame] had no cause anywhere on the row.
21819
21776
  * The key frame is the head of a cascade (`keyFrame ⇒ keyFrameSmall ⇒ the
21820
21777
  * lastFrame copy source`), so its absence is now on this line whatever the
21821
21778
  * tile ended up being.
@@ -21902,7 +21859,7 @@ var MotionEventSchema = object({
21902
21859
  /**
21903
21860
  * Ms offsets from `timestamp` (the episode's own first rising edge, so the
21904
21861
  * first entry is always `0`) of every genuine off→on transition the
21905
- * episode saw — "ogni evento on si deve salvare" (D475). NOT one entry per
21862
+ * episode saw — "ogni evento on si deve salvare" [every ON event must be saved] (D475). NOT one entry per
21906
21863
  * push: a firmware source that keepalives at ~1 Hz for the whole burst
21907
21864
  * (Reolink, Hikvision) produces exactly one edge; a source that reports an
21908
21865
  * explicit `false` mid-episode and then resumes before the quiet window
@@ -22426,6 +22383,7 @@ var KeyEventSchema = object({
22426
22383
  bestEventId: string(),
22427
22384
  /** Track lifetime in ms (lastSeen - firstSeen). */
22428
22385
  windowMs: number().optional(),
22386
+ audioLabels: array(TrackAudioLabelSchema).readonly().optional(),
22429
22387
  ...TrackFlagFields,
22430
22388
  ...TrackRetrainFields
22431
22389
  });
@@ -27350,7 +27308,7 @@ var ClipPlaybackSchema = object({
27350
27308
  * **One authorised yes is one wake.** `next-natural` — take the clip the next
27351
27309
  * time the camera is awake for its own reasons — is deliberately not a member:
27352
27310
  * it was proposed, it is free on the battery, and the operator declined it on
27353
- * 2026-09-20 (*"Quando un export viene richiesto si sveglia la camera."*,
27311
+ * 2026-09-20 (*"Quando un export viene richiesto si sveglia la camera."* [When an export is requested the camera wakes up],
27354
27312
  * D558 "Considered and not taken").
27355
27313
  */
27356
27314
  var ClipWakeSchema = _enum(["authorised"]);
@@ -27746,7 +27704,7 @@ var videoclipsCapability = {
27746
27704
  * **It is a SECTION of the Recording tab, at the end of it — not a tab of
27747
27705
  * its own.** It shipped as a `clips` top-tab and the operator rejected the
27748
27706
  * placement: *"utilizzerei la stessa tab recordings, lì abbiamo già tutto il
27749
- * necessario, una nuova sezione alla fine per le clips"*. The Recording tab
27707
+ * necessario, una nuova sezione alla fine per le clips"* [I would use the same recordings tab, there we already have everything necessary, a new section at the end for the clips]. The Recording tab
27750
27708
  * already holds the recorder's panel, the schedule bands and the unified
27751
27709
  * retention policy; footage the camera itself holds is the same question,
27752
27710
  * asked of a different store. `order: 100` puts it after all of them with
@@ -27807,7 +27765,7 @@ var videoclipsCapability = {
27807
27765
  * It replaced `sources?: string[]`, a VIEW filter over source ids that
27808
27766
  * assumed the answer was a fan-out over everything a camera has. The
27809
27767
  * operator settled otherwise on 2026-09-20 — *"l'utilizzatore è uno
27810
- * solo"* — so the list is asked of one provider at a time and there is
27768
+ * solo"* [there is only one user] — so the list is asked of one provider at a time and there is
27811
27769
  * nothing to filter out of it.
27812
27770
  */
27813
27771
  provider: string().min(1)
@@ -36129,7 +36087,7 @@ var ReadGopBytesResultSchema = object({
36129
36087
  /**
36130
36088
  * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
36131
36089
  * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
36132
- * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
36090
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-clip-replay-on-pipeline.md`):
36133
36091
  * a replay needs several seconds of native pixels, not one frame.
36134
36092
  *
36135
36093
  * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
@@ -39797,6 +39755,7 @@ var zoneRulesCapability = {
39797
39755
  */
39798
39756
  durability: "restored"
39799
39757
  };
39758
+ SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
39800
39759
  /**
39801
39760
  * Accessory device helpers — shared across drivers.
39802
39761
  *
@@ -50089,6 +50048,11 @@ Object.freeze({
50089
50048
  }
50090
50049
  });
50091
50050
  Object.freeze({
50051
+ "accessories.getStatus": [{
50052
+ name: "deviceId",
50053
+ form: "single",
50054
+ optional: false
50055
+ }],
50092
50056
  "accessories.setChildHidden": [{
50093
50057
  name: "childDeviceId",
50094
50058
  form: "single",
@@ -50108,6 +50072,11 @@ Object.freeze({
50108
50072
  form: "single",
50109
50073
  optional: false
50110
50074
  }],
50075
+ "airQualitySensor.getStatus": [{
50076
+ name: "deviceId",
50077
+ form: "single",
50078
+ optional: false
50079
+ }],
50111
50080
  "alarmPanel.arm": [{
50112
50081
  name: "deviceId",
50113
50082
  form: "single",
@@ -50118,11 +50087,36 @@ Object.freeze({
50118
50087
  form: "single",
50119
50088
  optional: false
50120
50089
  }],
50090
+ "alarmPanel.getStatus": [{
50091
+ name: "deviceId",
50092
+ form: "single",
50093
+ optional: false
50094
+ }],
50121
50095
  "alarmPanel.trigger": [{
50122
50096
  name: "deviceId",
50123
50097
  form: "single",
50124
50098
  optional: false
50125
50099
  }],
50100
+ "ambientLightSensor.getStatus": [{
50101
+ name: "deviceId",
50102
+ form: "single",
50103
+ optional: false
50104
+ }],
50105
+ "audioAnalysis.applyDeviceSettingsPatch": [{
50106
+ name: "deviceId",
50107
+ form: "single",
50108
+ optional: false
50109
+ }],
50110
+ "audioAnalysis.getDeviceLiveContribution": [{
50111
+ name: "deviceId",
50112
+ form: "single",
50113
+ optional: false
50114
+ }],
50115
+ "audioAnalysis.getDeviceSettingsContribution": [{
50116
+ name: "deviceId",
50117
+ form: "single",
50118
+ optional: false
50119
+ }],
50126
50120
  "audioAnalysis.resolveDeviceSettings": [{
50127
50121
  name: "deviceId",
50128
50122
  form: "single",
@@ -50163,16 +50157,36 @@ Object.freeze({
50163
50157
  form: "single",
50164
50158
  optional: false
50165
50159
  }],
50160
+ "automationControl.getStatus": [{
50161
+ name: "deviceId",
50162
+ form: "single",
50163
+ optional: false
50164
+ }],
50166
50165
  "automationControl.trigger": [{
50167
50166
  name: "deviceId",
50168
50167
  form: "single",
50169
50168
  optional: false
50170
50169
  }],
50170
+ "battery.getStatus": [{
50171
+ name: "deviceId",
50172
+ form: "single",
50173
+ optional: false
50174
+ }],
50171
50175
  "battery.wakeForStream": [{
50172
50176
  name: "deviceId",
50173
50177
  form: "single",
50174
50178
  optional: false
50175
50179
  }],
50180
+ "binary.getStatus": [{
50181
+ name: "deviceId",
50182
+ form: "single",
50183
+ optional: false
50184
+ }],
50185
+ "brightness.getStatus": [{
50186
+ name: "deviceId",
50187
+ form: "single",
50188
+ optional: false
50189
+ }],
50176
50190
  "brightness.setBrightness": [{
50177
50191
  name: "deviceId",
50178
50192
  form: "single",
@@ -50188,6 +50202,26 @@ Object.freeze({
50188
50202
  form: "single",
50189
50203
  optional: false
50190
50204
  }],
50205
+ "cameraCredentials.getStatus": [{
50206
+ name: "deviceId",
50207
+ form: "single",
50208
+ optional: false
50209
+ }],
50210
+ "cameraGridLayout.applyDeviceSettingsPatch": [{
50211
+ name: "deviceId",
50212
+ form: "single",
50213
+ optional: false
50214
+ }],
50215
+ "cameraGridLayout.getDeviceLiveContribution": [{
50216
+ name: "deviceId",
50217
+ form: "single",
50218
+ optional: false
50219
+ }],
50220
+ "cameraGridLayout.getDeviceSettingsContribution": [{
50221
+ name: "deviceId",
50222
+ form: "single",
50223
+ optional: false
50224
+ }],
50191
50225
  "cameraGridLayout.getLayout": [{
50192
50226
  name: "deviceId",
50193
50227
  form: "single",
@@ -50203,6 +50237,21 @@ Object.freeze({
50203
50237
  form: "single",
50204
50238
  optional: false
50205
50239
  }],
50240
+ "cameraPipelineConfig.applyDeviceSettingsPatch": [{
50241
+ name: "deviceId",
50242
+ form: "single",
50243
+ optional: false
50244
+ }],
50245
+ "cameraPipelineConfig.getDeviceLiveContribution": [{
50246
+ name: "deviceId",
50247
+ form: "single",
50248
+ optional: false
50249
+ }],
50250
+ "cameraPipelineConfig.getDeviceSettingsContribution": [{
50251
+ name: "deviceId",
50252
+ form: "single",
50253
+ optional: false
50254
+ }],
50206
50255
  "cameraStreams.getBrokerStreams": [{
50207
50256
  name: "deviceId",
50208
50257
  form: "single",
@@ -50228,6 +50277,16 @@ Object.freeze({
50228
50277
  form: "single",
50229
50278
  optional: false
50230
50279
  }],
50280
+ "carbonMonoxide.getStatus": [{
50281
+ name: "deviceId",
50282
+ form: "single",
50283
+ optional: false
50284
+ }],
50285
+ "climateControl.getStatus": [{
50286
+ name: "deviceId",
50287
+ form: "single",
50288
+ optional: false
50289
+ }],
50231
50290
  "climateControl.setFanMode": [{
50232
50291
  name: "deviceId",
50233
50292
  form: "single",
@@ -50268,16 +50327,41 @@ Object.freeze({
50268
50327
  form: "single",
50269
50328
  optional: false
50270
50329
  }],
50330
+ "color.getStatus": [{
50331
+ name: "deviceId",
50332
+ form: "single",
50333
+ optional: false
50334
+ }],
50271
50335
  "color.setColor": [{
50272
50336
  name: "deviceId",
50273
50337
  form: "single",
50274
50338
  optional: false
50275
50339
  }],
50340
+ "connectivity.getStatus": [{
50341
+ name: "deviceId",
50342
+ form: "single",
50343
+ optional: false
50344
+ }],
50345
+ "consumables.getStatus": [{
50346
+ name: "deviceId",
50347
+ form: "single",
50348
+ optional: false
50349
+ }],
50276
50350
  "consumables.reset": [{
50277
50351
  name: "deviceId",
50278
50352
  form: "single",
50279
50353
  optional: false
50280
50354
  }],
50355
+ "contact.getStatus": [{
50356
+ name: "deviceId",
50357
+ form: "single",
50358
+ optional: false
50359
+ }],
50360
+ "control.getStatus": [{
50361
+ name: "deviceId",
50362
+ form: "single",
50363
+ optional: false
50364
+ }],
50281
50365
  "control.setValue": [{
50282
50366
  name: "deviceId",
50283
50367
  form: "single",
@@ -50288,6 +50372,11 @@ Object.freeze({
50288
50372
  form: "single",
50289
50373
  optional: false
50290
50374
  }],
50375
+ "cover.getStatus": [{
50376
+ name: "deviceId",
50377
+ form: "single",
50378
+ optional: false
50379
+ }],
50291
50380
  "cover.open": [{
50292
50381
  name: "deviceId",
50293
50382
  form: "single",
@@ -50313,6 +50402,11 @@ Object.freeze({
50313
50402
  form: "single",
50314
50403
  optional: false
50315
50404
  }],
50405
+ "dayNight.getStatus": [{
50406
+ name: "deviceId",
50407
+ form: "single",
50408
+ optional: false
50409
+ }],
50316
50410
  "dayNight.setSettings": [{
50317
50411
  name: "deviceId",
50318
50412
  form: "single",
@@ -50323,11 +50417,31 @@ Object.freeze({
50323
50417
  form: "single",
50324
50418
  optional: true
50325
50419
  }],
50420
+ "detectionPipeline.applyDeviceSettingsPatch": [{
50421
+ name: "deviceId",
50422
+ form: "single",
50423
+ optional: false
50424
+ }],
50425
+ "detectionPipeline.getDeviceLiveContribution": [{
50426
+ name: "deviceId",
50427
+ form: "single",
50428
+ optional: false
50429
+ }],
50430
+ "detectionPipeline.getDeviceSettingsContribution": [{
50431
+ name: "deviceId",
50432
+ form: "single",
50433
+ optional: false
50434
+ }],
50326
50435
  "deviceAdminLink.getAdminLink": [{
50327
50436
  name: "deviceId",
50328
50437
  form: "single",
50329
50438
  optional: false
50330
50439
  }],
50440
+ "deviceAdoption.getStatus": [{
50441
+ name: "deviceId",
50442
+ form: "single",
50443
+ optional: false
50444
+ }],
50331
50445
  "deviceAdoption.release": [{
50332
50446
  name: "camDeviceId",
50333
50447
  form: "single",
@@ -50343,6 +50457,11 @@ Object.freeze({
50343
50457
  form: "single",
50344
50458
  optional: false
50345
50459
  }],
50460
+ "deviceDiscovery.getStatus": [{
50461
+ name: "deviceId",
50462
+ form: "single",
50463
+ optional: false
50464
+ }],
50346
50465
  "deviceDiscovery.listDiscovered": [{
50347
50466
  name: "deviceId",
50348
50467
  form: "single",
@@ -50362,6 +50481,21 @@ Object.freeze({
50362
50481
  form: "single",
50363
50482
  optional: false
50364
50483
  }],
50484
+ "deviceExport.applyDeviceSettingsPatch": [{
50485
+ name: "deviceId",
50486
+ form: "single",
50487
+ optional: false
50488
+ }],
50489
+ "deviceExport.getDeviceLiveContribution": [{
50490
+ name: "deviceId",
50491
+ form: "single",
50492
+ optional: false
50493
+ }],
50494
+ "deviceExport.getDeviceSettingsContribution": [{
50495
+ name: "deviceId",
50496
+ form: "single",
50497
+ optional: false
50498
+ }],
50365
50499
  "deviceExtension.listCandidates": [{
50366
50500
  name: "deviceId",
50367
50501
  form: "single",
@@ -50710,6 +50844,26 @@ Object.freeze({
50710
50844
  form: "single",
50711
50845
  optional: false
50712
50846
  }],
50847
+ "deviceStatus.getStatus": [{
50848
+ name: "deviceId",
50849
+ form: "single",
50850
+ optional: false
50851
+ }],
50852
+ "doorbell.getStatus": [{
50853
+ name: "deviceId",
50854
+ form: "single",
50855
+ optional: false
50856
+ }],
50857
+ "enumSensor.getStatus": [{
50858
+ name: "deviceId",
50859
+ form: "single",
50860
+ optional: false
50861
+ }],
50862
+ "eventEmitter.getStatus": [{
50863
+ name: "deviceId",
50864
+ form: "single",
50865
+ optional: false
50866
+ }],
50713
50867
  "faceGallery.getFaceByTrack": [{
50714
50868
  name: "deviceId",
50715
50869
  form: "single",
@@ -50724,6 +50878,11 @@ Object.freeze({
50724
50878
  form: "array",
50725
50879
  optional: true
50726
50880
  }],
50881
+ "fanControl.getStatus": [{
50882
+ name: "deviceId",
50883
+ form: "single",
50884
+ optional: false
50885
+ }],
50727
50886
  "fanControl.setDirection": [{
50728
50887
  name: "deviceId",
50729
50888
  form: "single",
@@ -50744,6 +50903,26 @@ Object.freeze({
50744
50903
  form: "single",
50745
50904
  optional: false
50746
50905
  }],
50906
+ "featureProbe.getStatus": [{
50907
+ name: "deviceId",
50908
+ form: "single",
50909
+ optional: false
50910
+ }],
50911
+ "flood.getStatus": [{
50912
+ name: "deviceId",
50913
+ form: "single",
50914
+ optional: false
50915
+ }],
50916
+ "gas.getStatus": [{
50917
+ name: "deviceId",
50918
+ form: "single",
50919
+ optional: false
50920
+ }],
50921
+ "humidifier.getStatus": [{
50922
+ name: "deviceId",
50923
+ form: "single",
50924
+ optional: false
50925
+ }],
50747
50926
  "humidifier.setMode": [{
50748
50927
  name: "deviceId",
50749
50928
  form: "single",
@@ -50759,11 +50938,26 @@ Object.freeze({
50759
50938
  form: "single",
50760
50939
  optional: false
50761
50940
  }],
50941
+ "humiditySensor.getStatus": [{
50942
+ name: "deviceId",
50943
+ form: "single",
50944
+ optional: false
50945
+ }],
50946
+ "image.getStatus": [{
50947
+ name: "deviceId",
50948
+ form: "single",
50949
+ optional: false
50950
+ }],
50762
50951
  "imageSettings.getOptions": [{
50763
50952
  name: "deviceId",
50764
50953
  form: "single",
50765
50954
  optional: false
50766
50955
  }],
50956
+ "imageSettings.getStatus": [{
50957
+ name: "deviceId",
50958
+ form: "single",
50959
+ optional: false
50960
+ }],
50767
50961
  "imageSettings.setSettings": [{
50768
50962
  name: "deviceId",
50769
50963
  form: "single",
@@ -50774,6 +50968,11 @@ Object.freeze({
50774
50968
  form: "single",
50775
50969
  optional: false
50776
50970
  }],
50971
+ "intercom.getStatus": [{
50972
+ name: "deviceId",
50973
+ form: "single",
50974
+ optional: false
50975
+ }],
50777
50976
  "intercom.handleAnswer": [{
50778
50977
  name: "deviceId",
50779
50978
  form: "single",
@@ -50804,6 +51003,11 @@ Object.freeze({
50804
51003
  form: "single",
50805
51004
  optional: false
50806
51005
  }],
51006
+ "lawnMowerControl.getStatus": [{
51007
+ name: "deviceId",
51008
+ form: "single",
51009
+ optional: false
51010
+ }],
50807
51011
  "lawnMowerControl.pause": [{
50808
51012
  name: "deviceId",
50809
51013
  form: "single",
@@ -50814,6 +51018,11 @@ Object.freeze({
50814
51018
  form: "single",
50815
51019
  optional: false
50816
51020
  }],
51021
+ "lockControl.getStatus": [{
51022
+ name: "deviceId",
51023
+ form: "single",
51024
+ optional: false
51025
+ }],
50817
51026
  "lockControl.lock": [{
50818
51027
  name: "deviceId",
50819
51028
  form: "single",
@@ -50829,6 +51038,11 @@ Object.freeze({
50829
51038
  form: "single",
50830
51039
  optional: false
50831
51040
  }],
51041
+ "mediaPlayer.getStatus": [{
51042
+ name: "deviceId",
51043
+ form: "single",
51044
+ optional: false
51045
+ }],
50832
51046
  "mediaPlayer.next": [{
50833
51047
  name: "deviceId",
50834
51048
  form: "single",
@@ -50889,6 +51103,11 @@ Object.freeze({
50889
51103
  form: "single",
50890
51104
  optional: false
50891
51105
  }],
51106
+ "motion.getStatus": [{
51107
+ name: "deviceId",
51108
+ form: "single",
51109
+ optional: false
51110
+ }],
50892
51111
  "motion.isDetected": [{
50893
51112
  name: "deviceId",
50894
51113
  form: "single",
@@ -50899,11 +51118,31 @@ Object.freeze({
50899
51118
  form: "single",
50900
51119
  optional: false
50901
51120
  }],
51121
+ "motionDetection.applyDeviceSettingsPatch": [{
51122
+ name: "deviceId",
51123
+ form: "single",
51124
+ optional: false
51125
+ }],
51126
+ "motionDetection.getDeviceLiveContribution": [{
51127
+ name: "deviceId",
51128
+ form: "single",
51129
+ optional: false
51130
+ }],
51131
+ "motionDetection.getDeviceSettingsContribution": [{
51132
+ name: "deviceId",
51133
+ form: "single",
51134
+ optional: false
51135
+ }],
50902
51136
  "motionDetection.removeCamera": [{
50903
51137
  name: "deviceId",
50904
51138
  form: "single",
50905
51139
  optional: false
50906
51140
  }],
51141
+ "motionTrigger.getStatus": [{
51142
+ name: "deviceId",
51143
+ form: "single",
51144
+ optional: false
51145
+ }],
50907
51146
  "motionTrigger.setMotionTrigger": [{
50908
51147
  name: "deviceId",
50909
51148
  form: "single",
@@ -50914,6 +51153,11 @@ Object.freeze({
50914
51153
  form: "single",
50915
51154
  optional: false
50916
51155
  }],
51156
+ "motionZones.getStatus": [{
51157
+ name: "deviceId",
51158
+ form: "single",
51159
+ optional: false
51160
+ }],
50917
51161
  "motionZones.setZone": [{
50918
51162
  name: "deviceId",
50919
51163
  form: "single",
@@ -50924,6 +51168,11 @@ Object.freeze({
50924
51168
  form: "single",
50925
51169
  optional: false
50926
51170
  }],
51171
+ "nativeObjectDetection.getStatus": [{
51172
+ name: "deviceId",
51173
+ form: "single",
51174
+ optional: false
51175
+ }],
50927
51176
  "nativeObjectDetection.setEnabled": [{
50928
51177
  name: "deviceId",
50929
51178
  form: "single",
@@ -50939,6 +51188,11 @@ Object.freeze({
50939
51188
  form: "single",
50940
51189
  optional: false
50941
51190
  }],
51191
+ "navigation.getStatus": [{
51192
+ name: "deviceId",
51193
+ form: "single",
51194
+ optional: false
51195
+ }],
50942
51196
  "navigation.goToPoint": [{
50943
51197
  name: "deviceId",
50944
51198
  form: "single",
@@ -50984,6 +51238,11 @@ Object.freeze({
50984
51238
  form: "single",
50985
51239
  optional: false
50986
51240
  }],
51241
+ "networkLink.getStatus": [{
51242
+ name: "deviceId",
51243
+ form: "single",
51244
+ optional: false
51245
+ }],
50987
51246
  "networkQuality.getDeviceStats": [{
50988
51247
  name: "deviceId",
50989
51248
  form: "single",
@@ -51009,11 +51268,26 @@ Object.freeze({
51009
51268
  form: "single",
51010
51269
  optional: false
51011
51270
  }],
51271
+ "notifier.getStatus": [{
51272
+ name: "deviceId",
51273
+ form: "single",
51274
+ optional: false
51275
+ }],
51012
51276
  "notifier.send": [{
51013
51277
  name: "deviceId",
51014
51278
  form: "single",
51015
51279
  optional: false
51016
51280
  }],
51281
+ "numericSensor.getStatus": [{
51282
+ name: "deviceId",
51283
+ form: "single",
51284
+ optional: false
51285
+ }],
51286
+ "osd.getStatus": [{
51287
+ name: "deviceId",
51288
+ form: "single",
51289
+ optional: false
51290
+ }],
51017
51291
  "osd.setOverlay": [{
51018
51292
  name: "deviceId",
51019
51293
  form: "single",
@@ -51073,6 +51347,11 @@ Object.freeze({
51073
51347
  form: "single",
51074
51348
  optional: false
51075
51349
  }],
51350
+ "petFeeder.getStatus": [{
51351
+ name: "deviceId",
51352
+ form: "single",
51353
+ optional: false
51354
+ }],
51076
51355
  "petFeeder.markFoodReplenished": [{
51077
51356
  name: "deviceId",
51078
51357
  form: "single",
@@ -51108,6 +51387,11 @@ Object.freeze({
51108
51387
  form: "single",
51109
51388
  optional: false
51110
51389
  }],
51390
+ "pipelineAnalytics.applyDeviceSettingsPatch": [{
51391
+ name: "deviceId",
51392
+ form: "single",
51393
+ optional: false
51394
+ }],
51111
51395
  "pipelineAnalytics.clearTrackRelation": [{
51112
51396
  name: "deviceId",
51113
51397
  form: "single",
@@ -51148,6 +51432,16 @@ Object.freeze({
51148
51432
  form: "single",
51149
51433
  optional: false
51150
51434
  }],
51435
+ "pipelineAnalytics.getDeviceLiveContribution": [{
51436
+ name: "deviceId",
51437
+ form: "single",
51438
+ optional: false
51439
+ }],
51440
+ "pipelineAnalytics.getDeviceSettingsContribution": [{
51441
+ name: "deviceId",
51442
+ form: "single",
51443
+ optional: false
51444
+ }],
51151
51445
  "pipelineAnalytics.getEventDensity": [{
51152
51446
  name: "deviceId",
51153
51447
  form: "single",
@@ -51363,6 +51657,11 @@ Object.freeze({
51363
51657
  form: "single",
51364
51658
  optional: true
51365
51659
  }],
51660
+ "pipelineOrchestrator.applyDeviceSettingsPatch": [{
51661
+ name: "deviceId",
51662
+ form: "single",
51663
+ optional: false
51664
+ }],
51366
51665
  "pipelineOrchestrator.assignAudio": [{
51367
51666
  name: "deviceId",
51368
51667
  form: "single",
@@ -51408,6 +51707,16 @@ Object.freeze({
51408
51707
  form: "single",
51409
51708
  optional: false
51410
51709
  }],
51710
+ "pipelineOrchestrator.getDeviceLiveContribution": [{
51711
+ name: "deviceId",
51712
+ form: "single",
51713
+ optional: false
51714
+ }],
51715
+ "pipelineOrchestrator.getDeviceSettingsContribution": [{
51716
+ name: "deviceId",
51717
+ form: "single",
51718
+ optional: false
51719
+ }],
51411
51720
  "pipelineOrchestrator.getPipelineAssignment": [{
51412
51721
  name: "deviceId",
51413
51722
  form: "single",
@@ -51528,11 +51837,31 @@ Object.freeze({
51528
51837
  form: "single",
51529
51838
  optional: true
51530
51839
  }],
51840
+ "powerMeter.getStatus": [{
51841
+ name: "deviceId",
51842
+ form: "single",
51843
+ optional: false
51844
+ }],
51845
+ "presence.getStatus": [{
51846
+ name: "deviceId",
51847
+ form: "single",
51848
+ optional: false
51849
+ }],
51850
+ "pressureSensor.getStatus": [{
51851
+ name: "deviceId",
51852
+ form: "single",
51853
+ optional: false
51854
+ }],
51531
51855
  "privacyMask.getOptions": [{
51532
51856
  name: "deviceId",
51533
51857
  form: "single",
51534
51858
  optional: false
51535
51859
  }],
51860
+ "privacyMask.getStatus": [{
51861
+ name: "deviceId",
51862
+ form: "single",
51863
+ optional: false
51864
+ }],
51536
51865
  "privacyMask.setAudioEnabled": [{
51537
51866
  name: "deviceId",
51538
51867
  form: "single",
@@ -51583,6 +51912,11 @@ Object.freeze({
51583
51912
  form: "single",
51584
51913
  optional: false
51585
51914
  }],
51915
+ "ptz.getStatus": [{
51916
+ name: "deviceId",
51917
+ form: "single",
51918
+ optional: false
51919
+ }],
51586
51920
  "ptz.goHome": [{
51587
51921
  name: "deviceId",
51588
51922
  form: "single",
@@ -51673,6 +52007,11 @@ Object.freeze({
51673
52007
  form: "single",
51674
52008
  optional: false
51675
52009
  }],
52010
+ "recordingArchive.applyDeviceSettingsPatch": [{
52011
+ name: "deviceId",
52012
+ form: "single",
52013
+ optional: false
52014
+ }],
51676
52015
  "recordingArchive.deleteFootprint": [{
51677
52016
  name: "deviceId",
51678
52017
  form: "single",
@@ -51693,6 +52032,21 @@ Object.freeze({
51693
52032
  form: "single",
51694
52033
  optional: false
51695
52034
  }],
52035
+ "recordingArchive.getDeviceLiveContribution": [{
52036
+ name: "deviceId",
52037
+ form: "single",
52038
+ optional: false
52039
+ }],
52040
+ "recordingArchive.getDeviceSettingsContribution": [{
52041
+ name: "deviceId",
52042
+ form: "single",
52043
+ optional: false
52044
+ }],
52045
+ "recordingArchive.getStatus": [{
52046
+ name: "deviceId",
52047
+ form: "single",
52048
+ optional: false
52049
+ }],
51696
52050
  "recordingArchive.listOpsLog": [{
51697
52051
  name: "deviceId",
51698
52052
  form: "single",
@@ -51778,6 +52132,11 @@ Object.freeze({
51778
52132
  form: "single",
51779
52133
  optional: false
51780
52134
  }],
52135
+ "recordingOnboard.getStatus": [{
52136
+ name: "deviceId",
52137
+ form: "single",
52138
+ optional: false
52139
+ }],
51781
52140
  "recordingOnboard.setSettings": [{
51782
52141
  name: "deviceId",
51783
52142
  form: "single",
@@ -51808,6 +52167,11 @@ Object.freeze({
51808
52167
  form: "single",
51809
52168
  optional: false
51810
52169
  }],
52170
+ "sceneMonitor.getStatus": [{
52171
+ name: "deviceId",
52172
+ form: "single",
52173
+ optional: false
52174
+ }],
51811
52175
  "sceneMonitor.listScenes": [{
51812
52176
  name: "deviceId",
51813
52177
  form: "single",
@@ -51833,6 +52197,11 @@ Object.freeze({
51833
52197
  form: "single",
51834
52198
  optional: false
51835
52199
  }],
52200
+ "scriptRunner.getStatus": [{
52201
+ name: "deviceId",
52202
+ form: "single",
52203
+ optional: false
52204
+ }],
51836
52205
  "scriptRunner.run": [{
51837
52206
  name: "deviceId",
51838
52207
  form: "single",
@@ -51843,11 +52212,31 @@ Object.freeze({
51843
52212
  form: "single",
51844
52213
  optional: false
51845
52214
  }],
52215
+ "smoke.getStatus": [{
52216
+ name: "deviceId",
52217
+ form: "single",
52218
+ optional: false
52219
+ }],
52220
+ "snapshot.applyDeviceSettingsPatch": [{
52221
+ name: "deviceId",
52222
+ form: "single",
52223
+ optional: false
52224
+ }],
51846
52225
  "snapshot.getDebugState": [{
51847
52226
  name: "deviceId",
51848
52227
  form: "single",
51849
52228
  optional: false
51850
52229
  }],
52230
+ "snapshot.getDeviceLiveContribution": [{
52231
+ name: "deviceId",
52232
+ form: "single",
52233
+ optional: false
52234
+ }],
52235
+ "snapshot.getDeviceSettingsContribution": [{
52236
+ name: "deviceId",
52237
+ form: "single",
52238
+ optional: false
52239
+ }],
51851
52240
  "snapshot.getSnapshot": [{
51852
52241
  name: "deviceId",
51853
52242
  form: "single",
@@ -51864,6 +52253,11 @@ Object.freeze({
51864
52253
  form: "array",
51865
52254
  optional: false
51866
52255
  }],
52256
+ "snapshot.getStatus": [{
52257
+ name: "deviceId",
52258
+ form: "single",
52259
+ optional: false
52260
+ }],
51867
52261
  "snapshot.invalidateCache": [{
51868
52262
  name: "deviceId",
51869
52263
  form: "single",
@@ -51874,6 +52268,11 @@ Object.freeze({
51874
52268
  form: "single",
51875
52269
  optional: false
51876
52270
  }],
52271
+ "streamBroker.applyDeviceSettingsPatch": [{
52272
+ name: "deviceId",
52273
+ form: "single",
52274
+ optional: false
52275
+ }],
51877
52276
  "streamBroker.assignProfile": [{
51878
52277
  name: "deviceId",
51879
52278
  form: "single",
@@ -51889,6 +52288,16 @@ Object.freeze({
51889
52288
  form: "single",
51890
52289
  optional: false
51891
52290
  }],
52291
+ "streamBroker.getDeviceLiveContribution": [{
52292
+ name: "deviceId",
52293
+ form: "single",
52294
+ optional: false
52295
+ }],
52296
+ "streamBroker.getDeviceSettingsContribution": [{
52297
+ name: "deviceId",
52298
+ form: "single",
52299
+ optional: false
52300
+ }],
51892
52301
  "streamBroker.getStreamWithCodec": [{
51893
52302
  name: "deviceId",
51894
52303
  form: "single",
@@ -51949,16 +52358,46 @@ Object.freeze({
51949
52358
  form: "single",
51950
52359
  optional: false
51951
52360
  }],
52361
+ "streamParams.getStatus": [{
52362
+ name: "deviceId",
52363
+ form: "single",
52364
+ optional: false
52365
+ }],
51952
52366
  "streamParams.setProfile": [{
51953
52367
  name: "deviceId",
51954
52368
  form: "single",
51955
52369
  optional: false
51956
52370
  }],
52371
+ "switch.getStatus": [{
52372
+ name: "deviceId",
52373
+ form: "single",
52374
+ optional: false
52375
+ }],
51957
52376
  "switch.setState": [{
51958
52377
  name: "deviceId",
51959
52378
  form: "single",
51960
52379
  optional: false
51961
52380
  }],
52381
+ "tamper.getStatus": [{
52382
+ name: "deviceId",
52383
+ form: "single",
52384
+ optional: false
52385
+ }],
52386
+ "temperatureSensor.getStatus": [{
52387
+ name: "deviceId",
52388
+ form: "single",
52389
+ optional: false
52390
+ }],
52391
+ "update.getStatus": [{
52392
+ name: "deviceId",
52393
+ form: "single",
52394
+ optional: false
52395
+ }],
52396
+ "vacuumControl.getStatus": [{
52397
+ name: "deviceId",
52398
+ form: "single",
52399
+ optional: false
52400
+ }],
51962
52401
  "vacuumControl.locate": [{
51963
52402
  name: "deviceId",
51964
52403
  form: "single",
@@ -51994,6 +52433,11 @@ Object.freeze({
51994
52433
  form: "single",
51995
52434
  optional: false
51996
52435
  }],
52436
+ "valve.getStatus": [{
52437
+ name: "deviceId",
52438
+ form: "single",
52439
+ optional: false
52440
+ }],
51997
52441
  "valve.open": [{
51998
52442
  name: "deviceId",
51999
52443
  form: "single",
@@ -52009,6 +52453,11 @@ Object.freeze({
52009
52453
  form: "single",
52010
52454
  optional: false
52011
52455
  }],
52456
+ "vibration.getStatus": [{
52457
+ name: "deviceId",
52458
+ form: "single",
52459
+ optional: false
52460
+ }],
52012
52461
  "videoclips.dialClipStream": [{
52013
52462
  name: "deviceId",
52014
52463
  form: "single",
@@ -52044,6 +52493,11 @@ Object.freeze({
52044
52493
  form: "single",
52045
52494
  optional: false
52046
52495
  }],
52496
+ "waterHeater.getStatus": [{
52497
+ name: "deviceId",
52498
+ form: "single",
52499
+ optional: false
52500
+ }],
52047
52501
  "waterHeater.setAway": [{
52048
52502
  name: "deviceId",
52049
52503
  form: "single",
@@ -52059,6 +52513,11 @@ Object.freeze({
52059
52513
  form: "single",
52060
52514
  optional: false
52061
52515
  }],
52516
+ "weather.getStatus": [{
52517
+ name: "deviceId",
52518
+ form: "single",
52519
+ optional: false
52520
+ }],
52062
52521
  "webrtcSession.addIceCandidate": [{
52063
52522
  name: "deviceId",
52064
52523
  form: "single",
@@ -52796,7 +53255,7 @@ var PreviewTextField = string().max(200);
52796
53255
  * Whether the notification's preview is a STILL or a short animation.
52797
53256
  *
52798
53257
  * The operator's ask, verbatim: *"inviato come gif o video (come per le altre
52799
- * rule)"* — the other rules already offer an animated preview, and a ten-hour
53258
+ * rule)"* [sent as a gif or video (as for the other rules)] — the other rules already offer an animated preview, and a ten-hour
52800
53259
  * night reads better as three seconds of motion than as one frame of it. Both
52801
53260
  * modes get the SAME treatment (blurred frame, large centred title); `'gif'`
52802
53261
  * simply applies it to a dozen frames sampled across the render and assembles