@camstack/addon-provider-hikvision 1.2.137 → 1.2.138

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
@@ -7458,7 +7458,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
7458
7458
  return DeviceRole;
7459
7459
  }({});
7460
7460
  //#endregion
7461
- //#region ../types/dist/composition-43aqsZQj.mjs
7461
+ //#region ../types/dist/composition-Bzr7GwgP.mjs
7462
7462
  /**
7463
7463
  * The ffmpeg build every CamStack node downloads, per platform and arch.
7464
7464
  *
@@ -7512,20 +7512,20 @@ function portable(target) {
7512
7512
  }
7513
7513
  portable("linux64"), portable("linuxarm64"), portable("macarm64"), portable("mac64");
7514
7514
  /**
7515
- * LA tabella "quale booleano di questo tipo di device conta come ALTO", e il
7516
- * valutatore puro del suo FRONTE.
7515
+ * THE table "which boolean of this device type counts as HIGH", and the
7516
+ * pure evaluator of its EDGE.
7517
7517
  *
7518
- * UNA tabella per tutti quelli che chiedono "questo device è ALTO?": il
7519
- * trigger `RecordingTriggers.sensorDeviceIds` del recorder, i marker dei
7520
- * sensori della post-analysis, il bridge camera-sensors dell'orchestratore e
7521
- * le sorgenti di un campanello composto (`doorbellFeatureSources`, D671).
7522
- * Una seconda copia divergerebbe alla prima cap aggiunta, e il sintomo — "il
7523
- * sensore fa suonare il campanello ma non registra" — è esattamente D62.
7518
+ * ONE table for everyone who asks "is this device HIGH?": the
7519
+ * recorder's `RecordingTriggers.sensorDeviceIds` trigger, the post-analysis
7520
+ * sensor markers, the orchestrator's camera-sensors bridge and
7521
+ * the sources of a composite doorbell (`doorbellFeatureSources`, D671).
7522
+ * A second copy would diverge at the first cap added, and the symptom — "the
7523
+ * sensor rings the doorbell but does not record" — is exactly D62.
7524
7524
  *
7525
- * ⚠ NON è `DEVICE_STATE_READERS` (`catalogs/device-state-vocabulary.ts`), e le
7526
- * due non vanno unificate: quella risponde a "qual è la PAROLA di stato per una
7527
- * regola" (e include `presence`, `cover`, `alarm-panel`), questa a "qual è il
7528
- * booleano il cui FRONTE conta". Vocabolari deliberatamente diversi.
7525
+ * ⚠ NOT `DEVICE_STATE_READERS` (`catalogs/device-state-vocabulary.ts`), and the
7526
+ * two must not be unified: that one answers "what is the state WORD for a
7527
+ * rule" (and includes `presence`, `cover`, `alarm-panel`), this one "which
7528
+ * boolean's EDGE counts". Deliberately different vocabularies.
7529
7529
  */
7530
7530
  /**
7531
7531
  * Known binary / switch source caps → the boolean slice field whose
@@ -7546,6 +7546,8 @@ var SOURCE_CAP_ACTIVE_FIELD = {
7546
7546
  vibration: "detected",
7547
7547
  tamper: "tampered"
7548
7548
  };
7549
+ /** Cap names whose presence in a device's bindings qualify it as a source. */
7550
+ var SOURCE_CAPS = Object.keys(SOURCE_CAP_ACTIVE_FIELD);
7549
7551
  /**
7550
7552
  * Error types for the safe expression engine. Two distinct classes so callers
7551
7553
  * can tell a compile-time (grammar) failure from a runtime (evaluation)
@@ -9152,22 +9154,22 @@ var CLASS_MAP_MACRO_TARGETS = [
9152
9154
  "package"
9153
9155
  ];
9154
9156
  /**
9155
- * Le macro classi di PRIMO LIVELLO: quelle che un object detector emette e che
9156
- * un operatore può selezionare.
9157
+ * The FIRST-LEVEL macro classes: those an object detector emits and that
9158
+ * an operator can select.
9157
9159
  *
9158
- * Sono le tre offerte dallo step `object-detection`
9160
+ * They are the three offered by the `object-detection` step
9159
9161
  * (`addon-pipeline/src/detection-pipeline/registry/step-definitions.ts`,
9160
- * `enabledMacroClasses`). `package` sta in {@link CLASS_MAP_MACRO_TARGETS} e in
9161
- * `MACRO_LABELS` — è una macro vera — ma NON qui: appartiene allo step
9162
- * `package-detection`, la cui abilitazione è guidata dalle zone, e offrire la
9163
- * stessa parola due volte ha già fatto accendere a un operatore il proxy COCO
9162
+ * `enabledMacroClasses`). `package` is in {@link CLASS_MAP_MACRO_TARGETS} and in
9163
+ * `MACRO_LABELS` — it is a true macro — but NOT here: it belongs to the step
9164
+ * `package-detection`, whose enablement is driven by zones, and offering the
9165
+ * same word twice has already made an operator turn on the COCO proxy
9164
9166
  * (suitcase/backpack/handbag) lasciando spento il detector dedicato.
9165
9167
  *
9166
- * UNA lista. Prima di oggi le stesse tre erano scritte a mano nell'offerta
9167
- * dello step e una seconda volta come union `FirstLevelMacro`
9168
- * (`types/detection.ts`); una terza copia per il trigger di registrazione
9169
- * (`RecordingTriggers.objectClasses`) avrebbe reso invisibile la divergenza
9170
- * successiva.
9168
+ * ONE list. Before today the same three were hand-written in the step's offer
9169
+ * and a second time as the union `FirstLevelMacro`
9170
+ * (`types/detection.ts`); a third copy for the recording trigger
9171
+ * (`RecordingTriggers.objectClasses`) would have made the later divergence
9172
+ * invisible.
9171
9173
  */
9172
9174
  var FIRST_LEVEL_MACRO_CLASSES = [
9173
9175
  "person",
@@ -9232,17 +9234,17 @@ var RecordingStorageModeSchema = _enum([
9232
9234
  "on-device-decision"
9233
9235
  ]);
9234
9236
  /**
9235
- * Le macro classi che possono aprire una finestra di registrazione — le stesse
9236
- * tre offerte dallo step `object-detection`, da UNA lista
9237
+ * The macro classes that can open a recording window — the same
9238
+ * three offered by the `object-detection` step, from ONE list
9237
9239
  * ({@link FIRST_LEVEL_MACRO_CLASSES}).
9238
9240
  */
9239
9241
  var RecordingObjectTriggerClassSchema = _enum(FIRST_LEVEL_MACRO_CLASSES);
9240
9242
  /**
9241
- * True quando `values` non ripete un elemento.
9243
+ * True when `values` does not repeat an element.
9242
9244
  *
9243
- * Un duplicato non è innocuo: ogni voce di `objectClasses` / `sensorDeviceIds`
9244
- * diventa una SORGENTE in `bandTriggerSources`, e la stessa sorgente due volte
9245
- * conterebbe due volte le sue finestre in `segmentMissedByMs`.
9245
+ * A duplicate is not harmless: every entry of `objectClasses` / `sensorDeviceIds`
9246
+ * becomes a SOURCE in `bandTriggerSources`, and the same source twice
9247
+ * would count its windows twice in `segmentMissedByMs`.
9246
9248
  */
9247
9249
  var noDuplicates = (values) => new Set(values).size === values.length;
9248
9250
  /** Which detectors trigger an `events`-mode band. */
@@ -9250,34 +9252,34 @@ var RecordingTriggersSchema = object({
9250
9252
  motion: boolean().optional(),
9251
9253
  audioThresholdDbfs: number().optional(),
9252
9254
  /**
9253
- * Le macro classi la cui detection apre una finestra. ASSENTE = la sorgente
9254
- * non è ascoltata; un array VUOTO è rifiutato, perché "banda events, trigger
9255
- * object acceso, nessuna classe" è la stessa forma "abilitata e non registra
9256
- * nulla, per sempre" contro cui è scritto `eventsBandCanEverDemand`.
9255
+ * The macro classes whose detection opens a window. ABSENT = the source
9256
+ * is not listened to; an EMPTY array is rejected, because "events band, object
9257
+ * trigger on, no class" is the same shape "enabled and records
9258
+ * nothing, forever" that `eventsBandCanEverDemand` is written against.
9257
9259
  *
9258
- * Il segnale letto è GIÀ FILTRATO: solo detection `source: 'pipeline'`, cioè
9259
- * quelle che hanno attraversato `enabledMacroClasses`, i
9260
- * `minConfidence<Macro>` e il full-frame guard. L'AI a bordo camera
9261
- * (`source: 'onboard'`) non attraversa nessuno di quei gate e NON apre
9262
- * finestre — vedi `recorder/object-trigger.ts`.
9260
+ * The signal read is ALREADY FILTERED: only `source: 'pipeline'` detections, i.e.
9261
+ * those that went through `enabledMacroClasses`, the
9262
+ * `minConfidence<Macro>` and the full-frame guard. The camera's onboard AI
9263
+ * (`source: 'onboard'`) goes through none of those gates and does NOT open
9264
+ * windows — see `recorder/object-trigger.ts`.
9263
9265
  */
9264
9266
  objectClasses: array(RecordingObjectTriggerClassSchema).min(1).refine(noDuplicates, { message: "objectClasses must not repeat a class" }).optional(),
9265
9267
  /**
9266
- * I device LINKED il cui FRONTE ALTO apre una finestra. Assente = la sorgente
9267
- * non è ascoltata; un array vuoto è rifiutato per la stessa ragione di
9268
+ * The LINKED devices whose RISING EDGE opens a window. Absent = the source
9269
+ * is not listened to; an empty array is rejected for the same reason as
9268
9270
  * `objectClasses`.
9269
9271
  *
9270
- * Sono id di device SORGENTE, non camere: la banda li nomina, quindi il
9271
- * percorso caldo (`DeviceStateChanged`, a ritmo di bus su tutta la flotta)
9272
- * non fa RPC. L'OFFERTA da cui l'operatore li sceglie è un'altra domanda, e
9273
- * si risolve con `deviceManager.getLinkedDevices` + `getBindingsBatch` per
9274
- * device (D12) — mai un elenco globale di cap.
9272
+ * These are SOURCE device ids, not cameras: the band names them, so the
9273
+ * hot path (`DeviceStateChanged`, at bus rate across the whole fleet)
9274
+ * does no RPC. The OFFER from which the operator picks them is another question, and
9275
+ * is resolved with `deviceManager.getLinkedDevices` + `getBindingsBatch` per
9276
+ * device (D12) — never a global list of caps.
9275
9277
  *
9276
- * Cosa vuol dire "alto" dipende dal TIPO di device e non è deciso qui:
9277
- * `SOURCE_CAP_ACTIVE_FIELD` (`catalogs/sensor-active-state.ts`) è LA tabella,
9278
- * la stessa del campanello composto (D671). Ed è il FRONTE, non
9279
- * il livello: un contatto trovato già aperto al riavvio del runner non fa
9280
- * registrare.
9278
+ * What "high" means depends on the device TYPE and is not decided here:
9279
+ * `SOURCE_CAP_ACTIVE_FIELD` (`catalogs/sensor-active-state.ts`) is THE table,
9280
+ * the same one as the composite doorbell (D671). And it is the EDGE, not
9281
+ * the level: a contact found already open at runner restart does not
9282
+ * record.
9281
9283
  */
9282
9284
  sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional()
9283
9285
  });
@@ -10529,7 +10531,7 @@ function findTimezone(id) {
10529
10531
  * - **VALUE** — at which level, for which scope, until when. That stays ONE
10530
10532
  * thing: the logging settings document on the `system` cap. Two authorities
10531
10533
  * over the values is the exact defect
10532
- * `docs/design/plans/2026-08-26-logging-per-componente.md` was written to
10534
+ * `docs/design/plans/2026-08-26-per-component-logging.md` was written to
10533
10535
  * remove; re-introducing it from the cure side would be grotesque.
10534
10536
  *
10535
10537
  * Nothing in this file reads a clock, an env var or a store. The registry is
@@ -12346,7 +12348,7 @@ var BrokerStatusEnum = _enum([
12346
12348
  "unreachable",
12347
12349
  "error"
12348
12350
  ]);
12349
- var BrokerInfoSchema$1 = object({
12351
+ var BrokerInfoSchema = object({
12350
12352
  /** Stable broker id. Persisted; survives addon restarts. */
12351
12353
  id: string(),
12352
12354
  /** Addon id of the provider that OWNS this broker.
@@ -12479,7 +12481,7 @@ var GetStateInputSchema = object({
12479
12481
  * HA: entity_id (returns the cached entity state). */
12480
12482
  key: string()
12481
12483
  });
12482
- method(ListInputSchema, array(BrokerInfoSchema$1)), method(GetInputSchema, BrokerInfoSchema$1.nullable()), method(_void(), array(BrokerProviderInfoSchema), { auth: "admin" }), method(AddInputSchema, AddResultSchema, {
12484
+ method(ListInputSchema, array(BrokerInfoSchema)), method(GetInputSchema, BrokerInfoSchema.nullable()), method(_void(), array(BrokerProviderInfoSchema), { auth: "admin" }), method(AddInputSchema, AddResultSchema, {
12483
12485
  kind: "mutation",
12484
12486
  auth: "admin"
12485
12487
  }), method(RemoveInputSchema, _void(), {
@@ -14190,7 +14192,7 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
14190
14192
  *
14191
14193
  * ⚠ An earlier version of this comment blamed Zod stripping, and that
14192
14194
  * was wrong — corrected 2026-08-26 after the hop map
14193
- * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
14195
+ * (`docs/design/2026-08-26-topic-hop-map.md`) traced the path.
14194
14196
  * There is **no Zod parse at all** between the door and the engine: the
14195
14197
  * dispatcher forwards the payload verbatim and UDS carries it whole. A
14196
14198
  * field declared here reaches `SqliteSettingsBackend` either way.
@@ -16393,7 +16395,7 @@ method(object({
16393
16395
  * per-device window, `KeyFrameCaptureLog`, `bumpCropMetric`. Every one of them
16394
16396
  * ends in a log line, and a log line is the thing the operator asked to stop
16395
16397
  * needing: *"possiamo armare questi errori intanto? Così al prossimo giro
16396
- * ricontrolliamo tutti questi punti"*. Reading them meant grepping Loki and
16398
+ * 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
16397
16399
  * hand-correlating timestamps, which is how a 22% thumbnail gap and a 3-hour
16398
16400
  * media blackout were both diagnosed. The counters stay; this is where they can
16399
16401
  * be READ.
@@ -17788,7 +17790,7 @@ var BrokerStatusSchema$1 = _enum([
17788
17790
  "unreachable",
17789
17791
  "tls-error"
17790
17792
  ]);
17791
- var BrokerInfoSchema = object({
17793
+ var BrokerInfoSchema$1 = object({
17792
17794
  id: string(),
17793
17795
  name: string(),
17794
17796
  url: string(),
@@ -17851,7 +17853,7 @@ var StatusSchema = object({
17851
17853
  brokerCount: number(),
17852
17854
  embeddedRunning: boolean()
17853
17855
  });
17854
- method(_void(), array(BrokerInfoSchema)), method(IdInputSchema, BrokerConnectionDetailsSchema, { auth: "admin" }), method(AddBrokerInputSchema, AddBrokerResultSchema, {
17856
+ method(_void(), array(BrokerInfoSchema$1)), method(IdInputSchema, BrokerConnectionDetailsSchema, { auth: "admin" }), method(AddBrokerInputSchema, AddBrokerResultSchema, {
17855
17857
  kind: "mutation",
17856
17858
  auth: "admin"
17857
17859
  }), method(IdInputSchema, _void(), {
@@ -20065,78 +20067,16 @@ var NcRuleInputSchema = object({
20065
20067
  */
20066
20068
  confirm: NcConfirmSchema.optional(),
20067
20069
  /**
20068
- * WAIT for face/plate recognition before saying anything.
20069
- *
20070
- * A notification's TEXT is frozen at enqueue and its media is re-resolved at
20071
- * send; the identity is neither. A face is confirmed after `confirmFrames`
20072
- * agreeing observations — p50 **11.4 s** after the track was first seen,
20073
- * measured on this hub — and an `immediate` rule enqueues on the first object
20074
- * event, seconds before that. So "Gianluca è arrivato" is unsayable on the
20075
- * immediate path, and no amount of media re-resolution fixes a sentence.
20076
- *
20077
- * Only two honest answers exist, and this flag picks between them. It has
20078
- * effect ONLY on a rule that declares a recognition scope
20079
- * ({@link NcConditions.identities} or {@link NcConditions.plates}) — on any
20080
- * other rule there is nothing to wait for and the flag is inert.
20081
- *
20082
- * | value | what happens |
20083
- * | --- | --- |
20084
- * | `true` | the rule stops firing on the object event and fires at TRACK CLOSE instead, once, with the name — later, and complete |
20085
- * | 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) |
20086
- *
20087
- * `.optional()` and deliberately NOT `.default()`: a Zod default does not run
20088
- * on the addon cap path, and absent has to keep meaning exactly what every
20089
- * rule authored before this field meant.
20090
- *
20091
- * The cost of `true` is stated here because the editor states it too: a rule
20092
- * that waits also inherits track-close SEMANTICS — its `zones` condition
20093
- * tests every zone the track visited and a `crossing` condition can no longer
20094
- * be satisfied, because a closed track carries no crossing.
20070
+ * IMMEDIATE GROUPED (D692): the first matching subject opens a window of this many
20071
+ * seconds; the rule sends ONE message when the window closes — early, once every
20072
+ * subject in it is final, never before {@link NC_GROUPING_MIN_SEC} — naming everybody
20073
+ * the rule matched, with one mosaic tile per subject.
20074
+ * Absent = plain immediate (one message per track, at the first match).
20075
+ * Only an `immediate` DETECTION rule may carry it (`ruleGroupingApplies`, enforced on
20076
+ * save by the hub's grouping guard). `.optional()`, never `.default()`: the addon cap
20077
+ * path does not run Zod defaults.
20095
20078
  */
20096
- waitForEnhancement: boolean().optional(),
20097
- /**
20098
- * GROUP a burst of subjects into ONE notification that grows.
20099
- *
20100
- * Seconds of quiet after the last matching subject before the burst is
20101
- * considered over. While it is open, the first subject enqueues immediately —
20102
- * **exactly as today, with no added latency** — and every real growth (a new
20103
- * subject, or a name confirmed on one already in it) REPLACES that
20104
- * notification with an updated one naming everybody. The push carries the
20105
- * group's own coalescing tag, so the phone replaces rather than stacks.
20106
- *
20107
- * `0` / absent = off, and off is today's behaviour byte for byte.
20108
- *
20109
- * ### Why an idle cutoff and not a window
20110
- *
20111
- * The measured seven-person arrival on device 590 spans 110 s with every
20112
- * internal gap under 30 s. A 12 s fixed window cuts it into three groups; an
20113
- * idle cutoff holds it as one and ends it when the arrival actually ends.
20114
- * 30 s is a widely shipped value for the same decision.
20115
- *
20116
- * ### What it replaces
20117
- *
20118
- * The blind cooldown, which collapses a burst by DISCARDING it. Measured on
20119
- * device 615 / *Persona su Uscio* over six days: 116 qualifying tracks → 74
20120
- * notifications, **44 (37.9%) suppressed outright**, 23 of them overlapping a
20121
- * track that did fire and 7 carrying a confirmed identity nobody heard about.
20122
- * A group collapses the same volume by MERGING, so the cooldown becomes a
20123
- * budget over GROUPS — which is what it always meant — and a growth is never
20124
- * throttled by the window its own first member spent.
20125
- *
20126
- * ### Interaction with {@link waitForEnhancement}
20127
- *
20128
- * They compose, and the order matters. `waitForEnhancement` defers the rule to
20129
- * TRACK CLOSE, so with both set the group is opened by the first member to
20130
- * CLOSE — already carrying its name — and grows as later members close. That
20131
- * is later, and complete. With grouping alone the group opens on the first
20132
- * object event and picks up names as they are confirmed, through the growth
20133
- * path. Neither combination fires twice for one subject.
20134
- *
20135
- * `.optional()` and deliberately NOT `.default()`: a Zod default does not run
20136
- * on the addon cap path, so absent must keep meaning what it meant before this
20137
- * field existed.
20138
- */
20139
- groupIdleSec: number().int().min(0).max(600).optional()
20079
+ groupingSec: number().int().min(5).max(60).optional()
20140
20080
  });
20141
20081
  /**
20142
20082
  * Partial patch for `updateRule` — any subset of the input fields, plus the
@@ -20184,9 +20124,10 @@ var NcRuleClearableKeySchema = _enum([
20184
20124
  "targetUsers",
20185
20125
  "snoozeOptions",
20186
20126
  "snoozeAllowGlobal",
20187
- "waitForEnhancement",
20188
20127
  "actions",
20189
20128
  "confirm",
20129
+ "groupingSec",
20130
+ "waitForEnhancement",
20190
20131
  "groupIdleSec"
20191
20132
  ]);
20192
20133
  var NcRuleUpdateInputSchema = object({
@@ -20208,9 +20149,25 @@ var NcRuleSchema = NcRuleInputSchema.extend({
20208
20149
  */
20209
20150
  disabledTargetIds: array(string()).default([])
20210
20151
  });
20152
+ /**
20153
+ * The state-summary SECTIONS (D647 / D698): the D637 kind groups that report a
20154
+ * still-true state. `backups-exports` and `alarm` are not sections — a completed
20155
+ * job is not an open state, and the alarm stays instant.
20156
+ */
20157
+ var NcStateSummarySectionIdSchema = _enum([
20158
+ "device-state",
20159
+ "streams",
20160
+ "battery",
20161
+ "consumables",
20162
+ "tanks",
20163
+ "detection-blind",
20164
+ "nodes",
20165
+ "addons",
20166
+ "updates"
20167
+ ]);
20211
20168
  /** One section of a previewed state summary. `unavailable` = its state could not be read. */
20212
20169
  var NcStateSummaryPreviewSectionSchema = object({
20213
- id: string(),
20170
+ id: NcStateSummarySectionIdSchema,
20214
20171
  status: _enum(["read", "unavailable"]),
20215
20172
  items: number().int().nonnegative(),
20216
20173
  reason: string().optional()
@@ -20220,7 +20177,7 @@ var NcStateSummaryPreviewSectionSchema = object({
20220
20177
  * a `rule` split (no `section`), one section's on a `section` split.
20221
20178
  */
20222
20179
  var NcStateSummaryPreviewRowSchema = object({
20223
- section: string().optional(),
20180
+ section: NcStateSummarySectionIdSchema.optional(),
20224
20181
  /** The section's name on a per-section row; every reported section's, joined, on a combined one. */
20225
20182
  title: string(),
20226
20183
  text: string(),
@@ -22119,14 +22076,14 @@ var TrackSchema = object({
22119
22076
  * `derive-returned-null tile=standin`,
22120
22077
  * `native-tile tile=native no-key-frame-at-close`, …) written at close and
22121
22078
  * CLEARED by the late-keyFrame upgrade when a native tile lands after all.
22122
- * The operator-facing answer to "perché manca l'immagine?" on a track whose
22079
+ * The operator-facing answer to "perché manca l'immagine?" [why is the image missing?] on a track whose
22123
22080
  * tile is a face/plate stand-in, a raster crop, or an icon.
22124
22081
  *
22125
22082
  * **`no-key-frame-at-close` (D400).** The line used to be written ONLY when
22126
22083
  * the TILE ranked below native, so a track whose thumbnail landed natively
22127
22084
  * while its key frame missed carried no reason at all — three of the four
22128
22085
  * `MISSING_KEYFRAME` tracks in the 2026-09-07 operator audit were exactly
22129
- * that shape, and their "niente ultimo" had no cause anywhere on the row.
22086
+ * that shape, and their "niente ultimo" [no last frame] had no cause anywhere on the row.
22130
22087
  * The key frame is the head of a cascade (`keyFrame ⇒ keyFrameSmall ⇒ the
22131
22088
  * lastFrame copy source`), so its absence is now on this line whatever the
22132
22089
  * tile ended up being.
@@ -22213,7 +22170,7 @@ var MotionEventSchema = object({
22213
22170
  /**
22214
22171
  * Ms offsets from `timestamp` (the episode's own first rising edge, so the
22215
22172
  * first entry is always `0`) of every genuine off→on transition the
22216
- * episode saw — "ogni evento on si deve salvare" (D475). NOT one entry per
22173
+ * episode saw — "ogni evento on si deve salvare" [every ON event must be saved] (D475). NOT one entry per
22217
22174
  * push: a firmware source that keepalives at ~1 Hz for the whole burst
22218
22175
  * (Reolink, Hikvision) produces exactly one edge; a source that reports an
22219
22176
  * explicit `false` mid-episode and then resumes before the quiet window
@@ -22737,6 +22694,7 @@ var KeyEventSchema = object({
22737
22694
  bestEventId: string(),
22738
22695
  /** Track lifetime in ms (lastSeen - firstSeen). */
22739
22696
  windowMs: number().optional(),
22697
+ audioLabels: array(TrackAudioLabelSchema).readonly().optional(),
22740
22698
  ...TrackFlagFields,
22741
22699
  ...TrackRetrainFields
22742
22700
  });
@@ -27670,7 +27628,7 @@ var ClipPlaybackSchema = object({
27670
27628
  * **One authorised yes is one wake.** `next-natural` — take the clip the next
27671
27629
  * time the camera is awake for its own reasons — is deliberately not a member:
27672
27630
  * it was proposed, it is free on the battery, and the operator declined it on
27673
- * 2026-09-20 (*"Quando un export viene richiesto si sveglia la camera."*,
27631
+ * 2026-09-20 (*"Quando un export viene richiesto si sveglia la camera."* [When an export is requested the camera wakes up],
27674
27632
  * D558 "Considered and not taken").
27675
27633
  */
27676
27634
  var ClipWakeSchema = _enum(["authorised"]);
@@ -28066,7 +28024,7 @@ var videoclipsCapability = {
28066
28024
  * **It is a SECTION of the Recording tab, at the end of it — not a tab of
28067
28025
  * its own.** It shipped as a `clips` top-tab and the operator rejected the
28068
28026
  * placement: *"utilizzerei la stessa tab recordings, lì abbiamo già tutto il
28069
- * necessario, una nuova sezione alla fine per le clips"*. The Recording tab
28027
+ * 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
28070
28028
  * already holds the recorder's panel, the schedule bands and the unified
28071
28029
  * retention policy; footage the camera itself holds is the same question,
28072
28030
  * asked of a different store. `order: 100` puts it after all of them with
@@ -28127,7 +28085,7 @@ var videoclipsCapability = {
28127
28085
  * It replaced `sources?: string[]`, a VIEW filter over source ids that
28128
28086
  * assumed the answer was a fan-out over everything a camera has. The
28129
28087
  * operator settled otherwise on 2026-09-20 — *"l'utilizzatore è uno
28130
- * solo"* — so the list is asked of one provider at a time and there is
28088
+ * solo"* [there is only one user] — so the list is asked of one provider at a time and there is
28131
28089
  * nothing to filter out of it.
28132
28090
  */
28133
28091
  provider: string().min(1)
@@ -36474,7 +36432,7 @@ var ReadGopBytesResultSchema = object({
36474
36432
  /**
36475
36433
  * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
36476
36434
  * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
36477
- * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
36435
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-clip-replay-on-pipeline.md`):
36478
36436
  * a replay needs several seconds of native pixels, not one frame.
36479
36437
  *
36480
36438
  * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
@@ -40216,6 +40174,7 @@ var zoneRulesCapability = {
40216
40174
  */
40217
40175
  durability: "restored"
40218
40176
  };
40177
+ SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
40219
40178
  /**
40220
40179
  * Accessory device helpers — shared across drivers.
40221
40180
  *
@@ -50535,6 +50494,11 @@ Object.freeze({
50535
50494
  }
50536
50495
  });
50537
50496
  Object.freeze({
50497
+ "accessories.getStatus": [{
50498
+ name: "deviceId",
50499
+ form: "single",
50500
+ optional: false
50501
+ }],
50538
50502
  "accessories.setChildHidden": [{
50539
50503
  name: "childDeviceId",
50540
50504
  form: "single",
@@ -50554,6 +50518,11 @@ Object.freeze({
50554
50518
  form: "single",
50555
50519
  optional: false
50556
50520
  }],
50521
+ "airQualitySensor.getStatus": [{
50522
+ name: "deviceId",
50523
+ form: "single",
50524
+ optional: false
50525
+ }],
50557
50526
  "alarmPanel.arm": [{
50558
50527
  name: "deviceId",
50559
50528
  form: "single",
@@ -50564,11 +50533,36 @@ Object.freeze({
50564
50533
  form: "single",
50565
50534
  optional: false
50566
50535
  }],
50536
+ "alarmPanel.getStatus": [{
50537
+ name: "deviceId",
50538
+ form: "single",
50539
+ optional: false
50540
+ }],
50567
50541
  "alarmPanel.trigger": [{
50568
50542
  name: "deviceId",
50569
50543
  form: "single",
50570
50544
  optional: false
50571
50545
  }],
50546
+ "ambientLightSensor.getStatus": [{
50547
+ name: "deviceId",
50548
+ form: "single",
50549
+ optional: false
50550
+ }],
50551
+ "audioAnalysis.applyDeviceSettingsPatch": [{
50552
+ name: "deviceId",
50553
+ form: "single",
50554
+ optional: false
50555
+ }],
50556
+ "audioAnalysis.getDeviceLiveContribution": [{
50557
+ name: "deviceId",
50558
+ form: "single",
50559
+ optional: false
50560
+ }],
50561
+ "audioAnalysis.getDeviceSettingsContribution": [{
50562
+ name: "deviceId",
50563
+ form: "single",
50564
+ optional: false
50565
+ }],
50572
50566
  "audioAnalysis.resolveDeviceSettings": [{
50573
50567
  name: "deviceId",
50574
50568
  form: "single",
@@ -50609,16 +50603,36 @@ Object.freeze({
50609
50603
  form: "single",
50610
50604
  optional: false
50611
50605
  }],
50606
+ "automationControl.getStatus": [{
50607
+ name: "deviceId",
50608
+ form: "single",
50609
+ optional: false
50610
+ }],
50612
50611
  "automationControl.trigger": [{
50613
50612
  name: "deviceId",
50614
50613
  form: "single",
50615
50614
  optional: false
50616
50615
  }],
50616
+ "battery.getStatus": [{
50617
+ name: "deviceId",
50618
+ form: "single",
50619
+ optional: false
50620
+ }],
50617
50621
  "battery.wakeForStream": [{
50618
50622
  name: "deviceId",
50619
50623
  form: "single",
50620
50624
  optional: false
50621
50625
  }],
50626
+ "binary.getStatus": [{
50627
+ name: "deviceId",
50628
+ form: "single",
50629
+ optional: false
50630
+ }],
50631
+ "brightness.getStatus": [{
50632
+ name: "deviceId",
50633
+ form: "single",
50634
+ optional: false
50635
+ }],
50622
50636
  "brightness.setBrightness": [{
50623
50637
  name: "deviceId",
50624
50638
  form: "single",
@@ -50634,6 +50648,26 @@ Object.freeze({
50634
50648
  form: "single",
50635
50649
  optional: false
50636
50650
  }],
50651
+ "cameraCredentials.getStatus": [{
50652
+ name: "deviceId",
50653
+ form: "single",
50654
+ optional: false
50655
+ }],
50656
+ "cameraGridLayout.applyDeviceSettingsPatch": [{
50657
+ name: "deviceId",
50658
+ form: "single",
50659
+ optional: false
50660
+ }],
50661
+ "cameraGridLayout.getDeviceLiveContribution": [{
50662
+ name: "deviceId",
50663
+ form: "single",
50664
+ optional: false
50665
+ }],
50666
+ "cameraGridLayout.getDeviceSettingsContribution": [{
50667
+ name: "deviceId",
50668
+ form: "single",
50669
+ optional: false
50670
+ }],
50637
50671
  "cameraGridLayout.getLayout": [{
50638
50672
  name: "deviceId",
50639
50673
  form: "single",
@@ -50649,6 +50683,21 @@ Object.freeze({
50649
50683
  form: "single",
50650
50684
  optional: false
50651
50685
  }],
50686
+ "cameraPipelineConfig.applyDeviceSettingsPatch": [{
50687
+ name: "deviceId",
50688
+ form: "single",
50689
+ optional: false
50690
+ }],
50691
+ "cameraPipelineConfig.getDeviceLiveContribution": [{
50692
+ name: "deviceId",
50693
+ form: "single",
50694
+ optional: false
50695
+ }],
50696
+ "cameraPipelineConfig.getDeviceSettingsContribution": [{
50697
+ name: "deviceId",
50698
+ form: "single",
50699
+ optional: false
50700
+ }],
50652
50701
  "cameraStreams.getBrokerStreams": [{
50653
50702
  name: "deviceId",
50654
50703
  form: "single",
@@ -50674,6 +50723,16 @@ Object.freeze({
50674
50723
  form: "single",
50675
50724
  optional: false
50676
50725
  }],
50726
+ "carbonMonoxide.getStatus": [{
50727
+ name: "deviceId",
50728
+ form: "single",
50729
+ optional: false
50730
+ }],
50731
+ "climateControl.getStatus": [{
50732
+ name: "deviceId",
50733
+ form: "single",
50734
+ optional: false
50735
+ }],
50677
50736
  "climateControl.setFanMode": [{
50678
50737
  name: "deviceId",
50679
50738
  form: "single",
@@ -50714,16 +50773,41 @@ Object.freeze({
50714
50773
  form: "single",
50715
50774
  optional: false
50716
50775
  }],
50776
+ "color.getStatus": [{
50777
+ name: "deviceId",
50778
+ form: "single",
50779
+ optional: false
50780
+ }],
50717
50781
  "color.setColor": [{
50718
50782
  name: "deviceId",
50719
50783
  form: "single",
50720
50784
  optional: false
50721
50785
  }],
50786
+ "connectivity.getStatus": [{
50787
+ name: "deviceId",
50788
+ form: "single",
50789
+ optional: false
50790
+ }],
50791
+ "consumables.getStatus": [{
50792
+ name: "deviceId",
50793
+ form: "single",
50794
+ optional: false
50795
+ }],
50722
50796
  "consumables.reset": [{
50723
50797
  name: "deviceId",
50724
50798
  form: "single",
50725
50799
  optional: false
50726
50800
  }],
50801
+ "contact.getStatus": [{
50802
+ name: "deviceId",
50803
+ form: "single",
50804
+ optional: false
50805
+ }],
50806
+ "control.getStatus": [{
50807
+ name: "deviceId",
50808
+ form: "single",
50809
+ optional: false
50810
+ }],
50727
50811
  "control.setValue": [{
50728
50812
  name: "deviceId",
50729
50813
  form: "single",
@@ -50734,6 +50818,11 @@ Object.freeze({
50734
50818
  form: "single",
50735
50819
  optional: false
50736
50820
  }],
50821
+ "cover.getStatus": [{
50822
+ name: "deviceId",
50823
+ form: "single",
50824
+ optional: false
50825
+ }],
50737
50826
  "cover.open": [{
50738
50827
  name: "deviceId",
50739
50828
  form: "single",
@@ -50759,6 +50848,11 @@ Object.freeze({
50759
50848
  form: "single",
50760
50849
  optional: false
50761
50850
  }],
50851
+ "dayNight.getStatus": [{
50852
+ name: "deviceId",
50853
+ form: "single",
50854
+ optional: false
50855
+ }],
50762
50856
  "dayNight.setSettings": [{
50763
50857
  name: "deviceId",
50764
50858
  form: "single",
@@ -50769,11 +50863,31 @@ Object.freeze({
50769
50863
  form: "single",
50770
50864
  optional: true
50771
50865
  }],
50866
+ "detectionPipeline.applyDeviceSettingsPatch": [{
50867
+ name: "deviceId",
50868
+ form: "single",
50869
+ optional: false
50870
+ }],
50871
+ "detectionPipeline.getDeviceLiveContribution": [{
50872
+ name: "deviceId",
50873
+ form: "single",
50874
+ optional: false
50875
+ }],
50876
+ "detectionPipeline.getDeviceSettingsContribution": [{
50877
+ name: "deviceId",
50878
+ form: "single",
50879
+ optional: false
50880
+ }],
50772
50881
  "deviceAdminLink.getAdminLink": [{
50773
50882
  name: "deviceId",
50774
50883
  form: "single",
50775
50884
  optional: false
50776
50885
  }],
50886
+ "deviceAdoption.getStatus": [{
50887
+ name: "deviceId",
50888
+ form: "single",
50889
+ optional: false
50890
+ }],
50777
50891
  "deviceAdoption.release": [{
50778
50892
  name: "camDeviceId",
50779
50893
  form: "single",
@@ -50789,6 +50903,11 @@ Object.freeze({
50789
50903
  form: "single",
50790
50904
  optional: false
50791
50905
  }],
50906
+ "deviceDiscovery.getStatus": [{
50907
+ name: "deviceId",
50908
+ form: "single",
50909
+ optional: false
50910
+ }],
50792
50911
  "deviceDiscovery.listDiscovered": [{
50793
50912
  name: "deviceId",
50794
50913
  form: "single",
@@ -50808,6 +50927,21 @@ Object.freeze({
50808
50927
  form: "single",
50809
50928
  optional: false
50810
50929
  }],
50930
+ "deviceExport.applyDeviceSettingsPatch": [{
50931
+ name: "deviceId",
50932
+ form: "single",
50933
+ optional: false
50934
+ }],
50935
+ "deviceExport.getDeviceLiveContribution": [{
50936
+ name: "deviceId",
50937
+ form: "single",
50938
+ optional: false
50939
+ }],
50940
+ "deviceExport.getDeviceSettingsContribution": [{
50941
+ name: "deviceId",
50942
+ form: "single",
50943
+ optional: false
50944
+ }],
50811
50945
  "deviceExtension.listCandidates": [{
50812
50946
  name: "deviceId",
50813
50947
  form: "single",
@@ -51156,6 +51290,26 @@ Object.freeze({
51156
51290
  form: "single",
51157
51291
  optional: false
51158
51292
  }],
51293
+ "deviceStatus.getStatus": [{
51294
+ name: "deviceId",
51295
+ form: "single",
51296
+ optional: false
51297
+ }],
51298
+ "doorbell.getStatus": [{
51299
+ name: "deviceId",
51300
+ form: "single",
51301
+ optional: false
51302
+ }],
51303
+ "enumSensor.getStatus": [{
51304
+ name: "deviceId",
51305
+ form: "single",
51306
+ optional: false
51307
+ }],
51308
+ "eventEmitter.getStatus": [{
51309
+ name: "deviceId",
51310
+ form: "single",
51311
+ optional: false
51312
+ }],
51159
51313
  "faceGallery.getFaceByTrack": [{
51160
51314
  name: "deviceId",
51161
51315
  form: "single",
@@ -51170,6 +51324,11 @@ Object.freeze({
51170
51324
  form: "array",
51171
51325
  optional: true
51172
51326
  }],
51327
+ "fanControl.getStatus": [{
51328
+ name: "deviceId",
51329
+ form: "single",
51330
+ optional: false
51331
+ }],
51173
51332
  "fanControl.setDirection": [{
51174
51333
  name: "deviceId",
51175
51334
  form: "single",
@@ -51190,6 +51349,26 @@ Object.freeze({
51190
51349
  form: "single",
51191
51350
  optional: false
51192
51351
  }],
51352
+ "featureProbe.getStatus": [{
51353
+ name: "deviceId",
51354
+ form: "single",
51355
+ optional: false
51356
+ }],
51357
+ "flood.getStatus": [{
51358
+ name: "deviceId",
51359
+ form: "single",
51360
+ optional: false
51361
+ }],
51362
+ "gas.getStatus": [{
51363
+ name: "deviceId",
51364
+ form: "single",
51365
+ optional: false
51366
+ }],
51367
+ "humidifier.getStatus": [{
51368
+ name: "deviceId",
51369
+ form: "single",
51370
+ optional: false
51371
+ }],
51193
51372
  "humidifier.setMode": [{
51194
51373
  name: "deviceId",
51195
51374
  form: "single",
@@ -51205,11 +51384,26 @@ Object.freeze({
51205
51384
  form: "single",
51206
51385
  optional: false
51207
51386
  }],
51387
+ "humiditySensor.getStatus": [{
51388
+ name: "deviceId",
51389
+ form: "single",
51390
+ optional: false
51391
+ }],
51392
+ "image.getStatus": [{
51393
+ name: "deviceId",
51394
+ form: "single",
51395
+ optional: false
51396
+ }],
51208
51397
  "imageSettings.getOptions": [{
51209
51398
  name: "deviceId",
51210
51399
  form: "single",
51211
51400
  optional: false
51212
51401
  }],
51402
+ "imageSettings.getStatus": [{
51403
+ name: "deviceId",
51404
+ form: "single",
51405
+ optional: false
51406
+ }],
51213
51407
  "imageSettings.setSettings": [{
51214
51408
  name: "deviceId",
51215
51409
  form: "single",
@@ -51220,6 +51414,11 @@ Object.freeze({
51220
51414
  form: "single",
51221
51415
  optional: false
51222
51416
  }],
51417
+ "intercom.getStatus": [{
51418
+ name: "deviceId",
51419
+ form: "single",
51420
+ optional: false
51421
+ }],
51223
51422
  "intercom.handleAnswer": [{
51224
51423
  name: "deviceId",
51225
51424
  form: "single",
@@ -51250,6 +51449,11 @@ Object.freeze({
51250
51449
  form: "single",
51251
51450
  optional: false
51252
51451
  }],
51452
+ "lawnMowerControl.getStatus": [{
51453
+ name: "deviceId",
51454
+ form: "single",
51455
+ optional: false
51456
+ }],
51253
51457
  "lawnMowerControl.pause": [{
51254
51458
  name: "deviceId",
51255
51459
  form: "single",
@@ -51260,6 +51464,11 @@ Object.freeze({
51260
51464
  form: "single",
51261
51465
  optional: false
51262
51466
  }],
51467
+ "lockControl.getStatus": [{
51468
+ name: "deviceId",
51469
+ form: "single",
51470
+ optional: false
51471
+ }],
51263
51472
  "lockControl.lock": [{
51264
51473
  name: "deviceId",
51265
51474
  form: "single",
@@ -51275,6 +51484,11 @@ Object.freeze({
51275
51484
  form: "single",
51276
51485
  optional: false
51277
51486
  }],
51487
+ "mediaPlayer.getStatus": [{
51488
+ name: "deviceId",
51489
+ form: "single",
51490
+ optional: false
51491
+ }],
51278
51492
  "mediaPlayer.next": [{
51279
51493
  name: "deviceId",
51280
51494
  form: "single",
@@ -51335,6 +51549,11 @@ Object.freeze({
51335
51549
  form: "single",
51336
51550
  optional: false
51337
51551
  }],
51552
+ "motion.getStatus": [{
51553
+ name: "deviceId",
51554
+ form: "single",
51555
+ optional: false
51556
+ }],
51338
51557
  "motion.isDetected": [{
51339
51558
  name: "deviceId",
51340
51559
  form: "single",
@@ -51345,11 +51564,31 @@ Object.freeze({
51345
51564
  form: "single",
51346
51565
  optional: false
51347
51566
  }],
51567
+ "motionDetection.applyDeviceSettingsPatch": [{
51568
+ name: "deviceId",
51569
+ form: "single",
51570
+ optional: false
51571
+ }],
51572
+ "motionDetection.getDeviceLiveContribution": [{
51573
+ name: "deviceId",
51574
+ form: "single",
51575
+ optional: false
51576
+ }],
51577
+ "motionDetection.getDeviceSettingsContribution": [{
51578
+ name: "deviceId",
51579
+ form: "single",
51580
+ optional: false
51581
+ }],
51348
51582
  "motionDetection.removeCamera": [{
51349
51583
  name: "deviceId",
51350
51584
  form: "single",
51351
51585
  optional: false
51352
51586
  }],
51587
+ "motionTrigger.getStatus": [{
51588
+ name: "deviceId",
51589
+ form: "single",
51590
+ optional: false
51591
+ }],
51353
51592
  "motionTrigger.setMotionTrigger": [{
51354
51593
  name: "deviceId",
51355
51594
  form: "single",
@@ -51360,6 +51599,11 @@ Object.freeze({
51360
51599
  form: "single",
51361
51600
  optional: false
51362
51601
  }],
51602
+ "motionZones.getStatus": [{
51603
+ name: "deviceId",
51604
+ form: "single",
51605
+ optional: false
51606
+ }],
51363
51607
  "motionZones.setZone": [{
51364
51608
  name: "deviceId",
51365
51609
  form: "single",
@@ -51370,6 +51614,11 @@ Object.freeze({
51370
51614
  form: "single",
51371
51615
  optional: false
51372
51616
  }],
51617
+ "nativeObjectDetection.getStatus": [{
51618
+ name: "deviceId",
51619
+ form: "single",
51620
+ optional: false
51621
+ }],
51373
51622
  "nativeObjectDetection.setEnabled": [{
51374
51623
  name: "deviceId",
51375
51624
  form: "single",
@@ -51385,6 +51634,11 @@ Object.freeze({
51385
51634
  form: "single",
51386
51635
  optional: false
51387
51636
  }],
51637
+ "navigation.getStatus": [{
51638
+ name: "deviceId",
51639
+ form: "single",
51640
+ optional: false
51641
+ }],
51388
51642
  "navigation.goToPoint": [{
51389
51643
  name: "deviceId",
51390
51644
  form: "single",
@@ -51430,6 +51684,11 @@ Object.freeze({
51430
51684
  form: "single",
51431
51685
  optional: false
51432
51686
  }],
51687
+ "networkLink.getStatus": [{
51688
+ name: "deviceId",
51689
+ form: "single",
51690
+ optional: false
51691
+ }],
51433
51692
  "networkQuality.getDeviceStats": [{
51434
51693
  name: "deviceId",
51435
51694
  form: "single",
@@ -51455,11 +51714,26 @@ Object.freeze({
51455
51714
  form: "single",
51456
51715
  optional: false
51457
51716
  }],
51717
+ "notifier.getStatus": [{
51718
+ name: "deviceId",
51719
+ form: "single",
51720
+ optional: false
51721
+ }],
51458
51722
  "notifier.send": [{
51459
51723
  name: "deviceId",
51460
51724
  form: "single",
51461
51725
  optional: false
51462
51726
  }],
51727
+ "numericSensor.getStatus": [{
51728
+ name: "deviceId",
51729
+ form: "single",
51730
+ optional: false
51731
+ }],
51732
+ "osd.getStatus": [{
51733
+ name: "deviceId",
51734
+ form: "single",
51735
+ optional: false
51736
+ }],
51463
51737
  "osd.setOverlay": [{
51464
51738
  name: "deviceId",
51465
51739
  form: "single",
@@ -51519,6 +51793,11 @@ Object.freeze({
51519
51793
  form: "single",
51520
51794
  optional: false
51521
51795
  }],
51796
+ "petFeeder.getStatus": [{
51797
+ name: "deviceId",
51798
+ form: "single",
51799
+ optional: false
51800
+ }],
51522
51801
  "petFeeder.markFoodReplenished": [{
51523
51802
  name: "deviceId",
51524
51803
  form: "single",
@@ -51554,6 +51833,11 @@ Object.freeze({
51554
51833
  form: "single",
51555
51834
  optional: false
51556
51835
  }],
51836
+ "pipelineAnalytics.applyDeviceSettingsPatch": [{
51837
+ name: "deviceId",
51838
+ form: "single",
51839
+ optional: false
51840
+ }],
51557
51841
  "pipelineAnalytics.clearTrackRelation": [{
51558
51842
  name: "deviceId",
51559
51843
  form: "single",
@@ -51594,6 +51878,16 @@ Object.freeze({
51594
51878
  form: "single",
51595
51879
  optional: false
51596
51880
  }],
51881
+ "pipelineAnalytics.getDeviceLiveContribution": [{
51882
+ name: "deviceId",
51883
+ form: "single",
51884
+ optional: false
51885
+ }],
51886
+ "pipelineAnalytics.getDeviceSettingsContribution": [{
51887
+ name: "deviceId",
51888
+ form: "single",
51889
+ optional: false
51890
+ }],
51597
51891
  "pipelineAnalytics.getEventDensity": [{
51598
51892
  name: "deviceId",
51599
51893
  form: "single",
@@ -51809,6 +52103,11 @@ Object.freeze({
51809
52103
  form: "single",
51810
52104
  optional: true
51811
52105
  }],
52106
+ "pipelineOrchestrator.applyDeviceSettingsPatch": [{
52107
+ name: "deviceId",
52108
+ form: "single",
52109
+ optional: false
52110
+ }],
51812
52111
  "pipelineOrchestrator.assignAudio": [{
51813
52112
  name: "deviceId",
51814
52113
  form: "single",
@@ -51854,6 +52153,16 @@ Object.freeze({
51854
52153
  form: "single",
51855
52154
  optional: false
51856
52155
  }],
52156
+ "pipelineOrchestrator.getDeviceLiveContribution": [{
52157
+ name: "deviceId",
52158
+ form: "single",
52159
+ optional: false
52160
+ }],
52161
+ "pipelineOrchestrator.getDeviceSettingsContribution": [{
52162
+ name: "deviceId",
52163
+ form: "single",
52164
+ optional: false
52165
+ }],
51857
52166
  "pipelineOrchestrator.getPipelineAssignment": [{
51858
52167
  name: "deviceId",
51859
52168
  form: "single",
@@ -51974,11 +52283,31 @@ Object.freeze({
51974
52283
  form: "single",
51975
52284
  optional: true
51976
52285
  }],
52286
+ "powerMeter.getStatus": [{
52287
+ name: "deviceId",
52288
+ form: "single",
52289
+ optional: false
52290
+ }],
52291
+ "presence.getStatus": [{
52292
+ name: "deviceId",
52293
+ form: "single",
52294
+ optional: false
52295
+ }],
52296
+ "pressureSensor.getStatus": [{
52297
+ name: "deviceId",
52298
+ form: "single",
52299
+ optional: false
52300
+ }],
51977
52301
  "privacyMask.getOptions": [{
51978
52302
  name: "deviceId",
51979
52303
  form: "single",
51980
52304
  optional: false
51981
52305
  }],
52306
+ "privacyMask.getStatus": [{
52307
+ name: "deviceId",
52308
+ form: "single",
52309
+ optional: false
52310
+ }],
51982
52311
  "privacyMask.setAudioEnabled": [{
51983
52312
  name: "deviceId",
51984
52313
  form: "single",
@@ -52029,6 +52358,11 @@ Object.freeze({
52029
52358
  form: "single",
52030
52359
  optional: false
52031
52360
  }],
52361
+ "ptz.getStatus": [{
52362
+ name: "deviceId",
52363
+ form: "single",
52364
+ optional: false
52365
+ }],
52032
52366
  "ptz.goHome": [{
52033
52367
  name: "deviceId",
52034
52368
  form: "single",
@@ -52119,6 +52453,11 @@ Object.freeze({
52119
52453
  form: "single",
52120
52454
  optional: false
52121
52455
  }],
52456
+ "recordingArchive.applyDeviceSettingsPatch": [{
52457
+ name: "deviceId",
52458
+ form: "single",
52459
+ optional: false
52460
+ }],
52122
52461
  "recordingArchive.deleteFootprint": [{
52123
52462
  name: "deviceId",
52124
52463
  form: "single",
@@ -52139,6 +52478,21 @@ Object.freeze({
52139
52478
  form: "single",
52140
52479
  optional: false
52141
52480
  }],
52481
+ "recordingArchive.getDeviceLiveContribution": [{
52482
+ name: "deviceId",
52483
+ form: "single",
52484
+ optional: false
52485
+ }],
52486
+ "recordingArchive.getDeviceSettingsContribution": [{
52487
+ name: "deviceId",
52488
+ form: "single",
52489
+ optional: false
52490
+ }],
52491
+ "recordingArchive.getStatus": [{
52492
+ name: "deviceId",
52493
+ form: "single",
52494
+ optional: false
52495
+ }],
52142
52496
  "recordingArchive.listOpsLog": [{
52143
52497
  name: "deviceId",
52144
52498
  form: "single",
@@ -52224,6 +52578,11 @@ Object.freeze({
52224
52578
  form: "single",
52225
52579
  optional: false
52226
52580
  }],
52581
+ "recordingOnboard.getStatus": [{
52582
+ name: "deviceId",
52583
+ form: "single",
52584
+ optional: false
52585
+ }],
52227
52586
  "recordingOnboard.setSettings": [{
52228
52587
  name: "deviceId",
52229
52588
  form: "single",
@@ -52254,6 +52613,11 @@ Object.freeze({
52254
52613
  form: "single",
52255
52614
  optional: false
52256
52615
  }],
52616
+ "sceneMonitor.getStatus": [{
52617
+ name: "deviceId",
52618
+ form: "single",
52619
+ optional: false
52620
+ }],
52257
52621
  "sceneMonitor.listScenes": [{
52258
52622
  name: "deviceId",
52259
52623
  form: "single",
@@ -52279,6 +52643,11 @@ Object.freeze({
52279
52643
  form: "single",
52280
52644
  optional: false
52281
52645
  }],
52646
+ "scriptRunner.getStatus": [{
52647
+ name: "deviceId",
52648
+ form: "single",
52649
+ optional: false
52650
+ }],
52282
52651
  "scriptRunner.run": [{
52283
52652
  name: "deviceId",
52284
52653
  form: "single",
@@ -52289,11 +52658,31 @@ Object.freeze({
52289
52658
  form: "single",
52290
52659
  optional: false
52291
52660
  }],
52661
+ "smoke.getStatus": [{
52662
+ name: "deviceId",
52663
+ form: "single",
52664
+ optional: false
52665
+ }],
52666
+ "snapshot.applyDeviceSettingsPatch": [{
52667
+ name: "deviceId",
52668
+ form: "single",
52669
+ optional: false
52670
+ }],
52292
52671
  "snapshot.getDebugState": [{
52293
52672
  name: "deviceId",
52294
52673
  form: "single",
52295
52674
  optional: false
52296
52675
  }],
52676
+ "snapshot.getDeviceLiveContribution": [{
52677
+ name: "deviceId",
52678
+ form: "single",
52679
+ optional: false
52680
+ }],
52681
+ "snapshot.getDeviceSettingsContribution": [{
52682
+ name: "deviceId",
52683
+ form: "single",
52684
+ optional: false
52685
+ }],
52297
52686
  "snapshot.getSnapshot": [{
52298
52687
  name: "deviceId",
52299
52688
  form: "single",
@@ -52310,6 +52699,11 @@ Object.freeze({
52310
52699
  form: "array",
52311
52700
  optional: false
52312
52701
  }],
52702
+ "snapshot.getStatus": [{
52703
+ name: "deviceId",
52704
+ form: "single",
52705
+ optional: false
52706
+ }],
52313
52707
  "snapshot.invalidateCache": [{
52314
52708
  name: "deviceId",
52315
52709
  form: "single",
@@ -52320,6 +52714,11 @@ Object.freeze({
52320
52714
  form: "single",
52321
52715
  optional: false
52322
52716
  }],
52717
+ "streamBroker.applyDeviceSettingsPatch": [{
52718
+ name: "deviceId",
52719
+ form: "single",
52720
+ optional: false
52721
+ }],
52323
52722
  "streamBroker.assignProfile": [{
52324
52723
  name: "deviceId",
52325
52724
  form: "single",
@@ -52335,6 +52734,16 @@ Object.freeze({
52335
52734
  form: "single",
52336
52735
  optional: false
52337
52736
  }],
52737
+ "streamBroker.getDeviceLiveContribution": [{
52738
+ name: "deviceId",
52739
+ form: "single",
52740
+ optional: false
52741
+ }],
52742
+ "streamBroker.getDeviceSettingsContribution": [{
52743
+ name: "deviceId",
52744
+ form: "single",
52745
+ optional: false
52746
+ }],
52338
52747
  "streamBroker.getStreamWithCodec": [{
52339
52748
  name: "deviceId",
52340
52749
  form: "single",
@@ -52395,16 +52804,46 @@ Object.freeze({
52395
52804
  form: "single",
52396
52805
  optional: false
52397
52806
  }],
52807
+ "streamParams.getStatus": [{
52808
+ name: "deviceId",
52809
+ form: "single",
52810
+ optional: false
52811
+ }],
52398
52812
  "streamParams.setProfile": [{
52399
52813
  name: "deviceId",
52400
52814
  form: "single",
52401
52815
  optional: false
52402
52816
  }],
52817
+ "switch.getStatus": [{
52818
+ name: "deviceId",
52819
+ form: "single",
52820
+ optional: false
52821
+ }],
52403
52822
  "switch.setState": [{
52404
52823
  name: "deviceId",
52405
52824
  form: "single",
52406
52825
  optional: false
52407
52826
  }],
52827
+ "tamper.getStatus": [{
52828
+ name: "deviceId",
52829
+ form: "single",
52830
+ optional: false
52831
+ }],
52832
+ "temperatureSensor.getStatus": [{
52833
+ name: "deviceId",
52834
+ form: "single",
52835
+ optional: false
52836
+ }],
52837
+ "update.getStatus": [{
52838
+ name: "deviceId",
52839
+ form: "single",
52840
+ optional: false
52841
+ }],
52842
+ "vacuumControl.getStatus": [{
52843
+ name: "deviceId",
52844
+ form: "single",
52845
+ optional: false
52846
+ }],
52408
52847
  "vacuumControl.locate": [{
52409
52848
  name: "deviceId",
52410
52849
  form: "single",
@@ -52440,6 +52879,11 @@ Object.freeze({
52440
52879
  form: "single",
52441
52880
  optional: false
52442
52881
  }],
52882
+ "valve.getStatus": [{
52883
+ name: "deviceId",
52884
+ form: "single",
52885
+ optional: false
52886
+ }],
52443
52887
  "valve.open": [{
52444
52888
  name: "deviceId",
52445
52889
  form: "single",
@@ -52455,6 +52899,11 @@ Object.freeze({
52455
52899
  form: "single",
52456
52900
  optional: false
52457
52901
  }],
52902
+ "vibration.getStatus": [{
52903
+ name: "deviceId",
52904
+ form: "single",
52905
+ optional: false
52906
+ }],
52458
52907
  "videoclips.dialClipStream": [{
52459
52908
  name: "deviceId",
52460
52909
  form: "single",
@@ -52490,6 +52939,11 @@ Object.freeze({
52490
52939
  form: "single",
52491
52940
  optional: false
52492
52941
  }],
52942
+ "waterHeater.getStatus": [{
52943
+ name: "deviceId",
52944
+ form: "single",
52945
+ optional: false
52946
+ }],
52493
52947
  "waterHeater.setAway": [{
52494
52948
  name: "deviceId",
52495
52949
  form: "single",
@@ -52505,6 +52959,11 @@ Object.freeze({
52505
52959
  form: "single",
52506
52960
  optional: false
52507
52961
  }],
52962
+ "weather.getStatus": [{
52963
+ name: "deviceId",
52964
+ form: "single",
52965
+ optional: false
52966
+ }],
52508
52967
  "webrtcSession.addIceCandidate": [{
52509
52968
  name: "deviceId",
52510
52969
  form: "single",
@@ -53242,7 +53701,7 @@ var PreviewTextField = string().max(200);
53242
53701
  * Whether the notification's preview is a STILL or a short animation.
53243
53702
  *
53244
53703
  * The operator's ask, verbatim: *"inviato come gif o video (come per le altre
53245
- * rule)"* — the other rules already offer an animated preview, and a ten-hour
53704
+ * rule)"* [sent as a gif or video (as for the other rules)] — the other rules already offer an animated preview, and a ten-hour
53246
53705
  * night reads better as three seconds of motion than as one frame of it. Both
53247
53706
  * modes get the SAME treatment (blurred frame, large centred title); `'gif'`
53248
53707
  * simply applies it to a dozen frames sampled across the render and assembles