@camstack/addon-agent-ui 1.2.162 → 1.2.164

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 (2) hide show
  1. package/dist/addon.js +611 -142
  2. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -7427,7 +7427,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
7427
7427
  return DeviceRole;
7428
7428
  }({});
7429
7429
  //#endregion
7430
- //#region ../types/dist/composition-43aqsZQj.mjs
7430
+ //#region ../types/dist/composition-Bzr7GwgP.mjs
7431
7431
  /**
7432
7432
  * The ffmpeg build every CamStack node downloads, per platform and arch.
7433
7433
  *
@@ -7481,20 +7481,20 @@ function portable(target) {
7481
7481
  }
7482
7482
  portable("linux64"), portable("linuxarm64"), portable("macarm64"), portable("mac64");
7483
7483
  /**
7484
- * LA tabella "quale booleano di questo tipo di device conta come ALTO", e il
7485
- * valutatore puro del suo FRONTE.
7484
+ * THE table "which boolean of this device type counts as HIGH", and the
7485
+ * pure evaluator of its EDGE.
7486
7486
  *
7487
- * UNA tabella per tutti quelli che chiedono "questo device è ALTO?": il
7488
- * trigger `RecordingTriggers.sensorDeviceIds` del recorder, i marker dei
7489
- * sensori della post-analysis, il bridge camera-sensors dell'orchestratore e
7490
- * le sorgenti di un campanello composto (`doorbellFeatureSources`, D671).
7491
- * Una seconda copia divergerebbe alla prima cap aggiunta, e il sintomo — "il
7492
- * sensore fa suonare il campanello ma non registra" — è esattamente D62.
7487
+ * ONE table for everyone who asks "is this device HIGH?": the
7488
+ * recorder's `RecordingTriggers.sensorDeviceIds` trigger, the post-analysis
7489
+ * sensor markers, the orchestrator's camera-sensors bridge and
7490
+ * the sources of a composite doorbell (`doorbellFeatureSources`, D671).
7491
+ * A second copy would diverge at the first cap added, and the symptom — "the
7492
+ * sensor rings the doorbell but does not record" — is exactly D62.
7493
7493
  *
7494
- * ⚠ NON è `DEVICE_STATE_READERS` (`catalogs/device-state-vocabulary.ts`), e le
7495
- * due non vanno unificate: quella risponde a "qual è la PAROLA di stato per una
7496
- * regola" (e include `presence`, `cover`, `alarm-panel`), questa a "qual è il
7497
- * booleano il cui FRONTE conta". Vocabolari deliberatamente diversi.
7494
+ * ⚠ NOT `DEVICE_STATE_READERS` (`catalogs/device-state-vocabulary.ts`), and the
7495
+ * two must not be unified: that one answers "what is the state WORD for a
7496
+ * rule" (and includes `presence`, `cover`, `alarm-panel`), this one "which
7497
+ * boolean's EDGE counts". Deliberately different vocabularies.
7498
7498
  */
7499
7499
  /**
7500
7500
  * Known binary / switch source caps → the boolean slice field whose
@@ -7515,6 +7515,8 @@ var SOURCE_CAP_ACTIVE_FIELD = {
7515
7515
  vibration: "detected",
7516
7516
  tamper: "tampered"
7517
7517
  };
7518
+ /** Cap names whose presence in a device's bindings qualify it as a source. */
7519
+ var SOURCE_CAPS = Object.keys(SOURCE_CAP_ACTIVE_FIELD);
7518
7520
  /**
7519
7521
  * Error types for the safe expression engine. Two distinct classes so callers
7520
7522
  * can tell a compile-time (grammar) failure from a runtime (evaluation)
@@ -9101,22 +9103,22 @@ var CLASS_MAP_MACRO_TARGETS = [
9101
9103
  "package"
9102
9104
  ];
9103
9105
  /**
9104
- * Le macro classi di PRIMO LIVELLO: quelle che un object detector emette e che
9105
- * un operatore può selezionare.
9106
+ * The FIRST-LEVEL macro classes: those an object detector emits and that
9107
+ * an operator can select.
9106
9108
  *
9107
- * Sono le tre offerte dallo step `object-detection`
9109
+ * They are the three offered by the `object-detection` step
9108
9110
  * (`addon-pipeline/src/detection-pipeline/registry/step-definitions.ts`,
9109
- * `enabledMacroClasses`). `package` sta in {@link CLASS_MAP_MACRO_TARGETS} e in
9110
- * `MACRO_LABELS` — è una macro vera — ma NON qui: appartiene allo step
9111
- * `package-detection`, la cui abilitazione è guidata dalle zone, e offrire la
9112
- * stessa parola due volte ha già fatto accendere a un operatore il proxy COCO
9111
+ * `enabledMacroClasses`). `package` is in {@link CLASS_MAP_MACRO_TARGETS} and in
9112
+ * `MACRO_LABELS` — it is a true macro — but NOT here: it belongs to the step
9113
+ * `package-detection`, whose enablement is driven by zones, and offering the
9114
+ * same word twice has already made an operator turn on the COCO proxy
9113
9115
  * (suitcase/backpack/handbag) lasciando spento il detector dedicato.
9114
9116
  *
9115
- * UNA lista. Prima di oggi le stesse tre erano scritte a mano nell'offerta
9116
- * dello step e una seconda volta come union `FirstLevelMacro`
9117
- * (`types/detection.ts`); una terza copia per il trigger di registrazione
9118
- * (`RecordingTriggers.objectClasses`) avrebbe reso invisibile la divergenza
9119
- * successiva.
9117
+ * ONE list. Before today the same three were hand-written in the step's offer
9118
+ * and a second time as the union `FirstLevelMacro`
9119
+ * (`types/detection.ts`); a third copy for the recording trigger
9120
+ * (`RecordingTriggers.objectClasses`) would have made the later divergence
9121
+ * invisible.
9120
9122
  */
9121
9123
  var FIRST_LEVEL_MACRO_CLASSES = [
9122
9124
  "person",
@@ -9181,17 +9183,17 @@ var RecordingStorageModeSchema = _enum([
9181
9183
  "on-device-decision"
9182
9184
  ]);
9183
9185
  /**
9184
- * Le macro classi che possono aprire una finestra di registrazione — le stesse
9185
- * tre offerte dallo step `object-detection`, da UNA lista
9186
+ * The macro classes that can open a recording window — the same
9187
+ * three offered by the `object-detection` step, from ONE list
9186
9188
  * ({@link FIRST_LEVEL_MACRO_CLASSES}).
9187
9189
  */
9188
9190
  var RecordingObjectTriggerClassSchema = _enum(FIRST_LEVEL_MACRO_CLASSES);
9189
9191
  /**
9190
- * True quando `values` non ripete un elemento.
9192
+ * True when `values` does not repeat an element.
9191
9193
  *
9192
- * Un duplicato non è innocuo: ogni voce di `objectClasses` / `sensorDeviceIds`
9193
- * diventa una SORGENTE in `bandTriggerSources`, e la stessa sorgente due volte
9194
- * conterebbe due volte le sue finestre in `segmentMissedByMs`.
9194
+ * A duplicate is not harmless: every entry of `objectClasses` / `sensorDeviceIds`
9195
+ * becomes a SOURCE in `bandTriggerSources`, and the same source twice
9196
+ * would count its windows twice in `segmentMissedByMs`.
9195
9197
  */
9196
9198
  var noDuplicates = (values) => new Set(values).size === values.length;
9197
9199
  /** Which detectors trigger an `events`-mode band. */
@@ -9199,34 +9201,34 @@ var RecordingTriggersSchema = object({
9199
9201
  motion: boolean().optional(),
9200
9202
  audioThresholdDbfs: number().optional(),
9201
9203
  /**
9202
- * Le macro classi la cui detection apre una finestra. ASSENTE = la sorgente
9203
- * non è ascoltata; un array VUOTO è rifiutato, perché "banda events, trigger
9204
- * object acceso, nessuna classe" è la stessa forma "abilitata e non registra
9205
- * nulla, per sempre" contro cui è scritto `eventsBandCanEverDemand`.
9204
+ * The macro classes whose detection opens a window. ABSENT = the source
9205
+ * is not listened to; an EMPTY array is rejected, because "events band, object
9206
+ * trigger on, no class" is the same shape "enabled and records
9207
+ * nothing, forever" that `eventsBandCanEverDemand` is written against.
9206
9208
  *
9207
- * Il segnale letto è GIÀ FILTRATO: solo detection `source: 'pipeline'`, cioè
9208
- * quelle che hanno attraversato `enabledMacroClasses`, i
9209
- * `minConfidence<Macro>` e il full-frame guard. L'AI a bordo camera
9210
- * (`source: 'onboard'`) non attraversa nessuno di quei gate e NON apre
9211
- * finestre — vedi `recorder/object-trigger.ts`.
9209
+ * The signal read is ALREADY FILTERED: only `source: 'pipeline'` detections, i.e.
9210
+ * those that went through `enabledMacroClasses`, the
9211
+ * `minConfidence<Macro>` and the full-frame guard. The camera's onboard AI
9212
+ * (`source: 'onboard'`) goes through none of those gates and does NOT open
9213
+ * windows — see `recorder/object-trigger.ts`.
9212
9214
  */
9213
9215
  objectClasses: array(RecordingObjectTriggerClassSchema).min(1).refine(noDuplicates, { message: "objectClasses must not repeat a class" }).optional(),
9214
9216
  /**
9215
- * I device LINKED il cui FRONTE ALTO apre una finestra. Assente = la sorgente
9216
- * non è ascoltata; un array vuoto è rifiutato per la stessa ragione di
9217
+ * The LINKED devices whose RISING EDGE opens a window. Absent = the source
9218
+ * is not listened to; an empty array is rejected for the same reason as
9217
9219
  * `objectClasses`.
9218
9220
  *
9219
- * Sono id di device SORGENTE, non camere: la banda li nomina, quindi il
9220
- * percorso caldo (`DeviceStateChanged`, a ritmo di bus su tutta la flotta)
9221
- * non fa RPC. L'OFFERTA da cui l'operatore li sceglie è un'altra domanda, e
9222
- * si risolve con `deviceManager.getLinkedDevices` + `getBindingsBatch` per
9223
- * device (D12) — mai un elenco globale di cap.
9221
+ * These are SOURCE device ids, not cameras: the band names them, so the
9222
+ * hot path (`DeviceStateChanged`, at bus rate across the whole fleet)
9223
+ * does no RPC. The OFFER from which the operator picks them is another question, and
9224
+ * is resolved with `deviceManager.getLinkedDevices` + `getBindingsBatch` per
9225
+ * device (D12) — never a global list of caps.
9224
9226
  *
9225
- * Cosa vuol dire "alto" dipende dal TIPO di device e non è deciso qui:
9226
- * `SOURCE_CAP_ACTIVE_FIELD` (`catalogs/sensor-active-state.ts`) è LA tabella,
9227
- * la stessa del campanello composto (D671). Ed è il FRONTE, non
9228
- * il livello: un contatto trovato già aperto al riavvio del runner non fa
9229
- * registrare.
9227
+ * What "high" means depends on the device TYPE and is not decided here:
9228
+ * `SOURCE_CAP_ACTIVE_FIELD` (`catalogs/sensor-active-state.ts`) is THE table,
9229
+ * the same one as the composite doorbell (D671). And it is the EDGE, not
9230
+ * the level: a contact found already open at runner restart does not
9231
+ * record.
9230
9232
  */
9231
9233
  sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional()
9232
9234
  });
@@ -10303,7 +10305,7 @@ var DecoderSessionConfigSchema = object({
10303
10305
  * - **VALUE** — at which level, for which scope, until when. That stays ONE
10304
10306
  * thing: the logging settings document on the `system` cap. Two authorities
10305
10307
  * over the values is the exact defect
10306
- * `docs/design/plans/2026-08-26-logging-per-componente.md` was written to
10308
+ * `docs/design/plans/2026-08-26-per-component-logging.md` was written to
10307
10309
  * remove; re-introducing it from the cure side would be grotesque.
10308
10310
  *
10309
10311
  * Nothing in this file reads a clock, an env var or a store. The registry is
@@ -12014,7 +12016,7 @@ var BrokerStatusEnum = _enum([
12014
12016
  "unreachable",
12015
12017
  "error"
12016
12018
  ]);
12017
- var BrokerInfoSchema$1 = object({
12019
+ var BrokerInfoSchema = object({
12018
12020
  /** Stable broker id. Persisted; survives addon restarts. */
12019
12021
  id: string(),
12020
12022
  /** Addon id of the provider that OWNS this broker.
@@ -12147,7 +12149,7 @@ var GetStateInputSchema = object({
12147
12149
  * HA: entity_id (returns the cached entity state). */
12148
12150
  key: string()
12149
12151
  });
12150
- method(ListInputSchema, array(BrokerInfoSchema$1)), method(GetInputSchema, BrokerInfoSchema$1.nullable()), method(_void(), array(BrokerProviderInfoSchema), { auth: "admin" }), method(AddInputSchema, AddResultSchema, {
12152
+ method(ListInputSchema, array(BrokerInfoSchema)), method(GetInputSchema, BrokerInfoSchema.nullable()), method(_void(), array(BrokerProviderInfoSchema), { auth: "admin" }), method(AddInputSchema, AddResultSchema, {
12151
12153
  kind: "mutation",
12152
12154
  auth: "admin"
12153
12155
  }), method(RemoveInputSchema, _void(), {
@@ -13756,7 +13758,7 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
13756
13758
  *
13757
13759
  * ⚠ An earlier version of this comment blamed Zod stripping, and that
13758
13760
  * was wrong — corrected 2026-08-26 after the hop map
13759
- * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
13761
+ * (`docs/design/2026-08-26-topic-hop-map.md`) traced the path.
13760
13762
  * There is **no Zod parse at all** between the door and the engine: the
13761
13763
  * dispatcher forwards the payload verbatim and UDS carries it whole. A
13762
13764
  * field declared here reaches `SqliteSettingsBackend` either way.
@@ -14512,7 +14514,17 @@ var SiteZoneSchema = object({
14512
14514
  var ProviderStatusSchema = object({
14513
14515
  connected: boolean(),
14514
14516
  deviceCount: number(),
14515
- error: string().optional()
14517
+ error: string().optional(),
14518
+ /**
14519
+ * `'orchestrator'`: this provider writes NO camera's `motion` runtime slice
14520
+ * — the orchestrator is its only writer (D696). Set by `BaseDeviceProvider`,
14521
+ * which every provider bundles, so only a provider BUILT from D696-amended
14522
+ * code says it. ABSENT means an older provider that may still write it (raw
14523
+ * VMD writes, a boot seed), and the orchestrator's provider gate keeps that
14524
+ * provider's cameras unwritten (`camera-sensors/motion-slice-provider-gate.ts`)
14525
+ * — the provider twin of the runner's `getLocalLoad().motionSliceWriter`.
14526
+ */
14527
+ motionSliceWriter: literal("orchestrator").optional()
14516
14528
  });
14517
14529
  object({
14518
14530
  externalId: string(),
@@ -15648,7 +15660,7 @@ method(object({
15648
15660
  * per-device window, `KeyFrameCaptureLog`, `bumpCropMetric`. Every one of them
15649
15661
  * ends in a log line, and a log line is the thing the operator asked to stop
15650
15662
  * needing: *"possiamo armare questi errori intanto? Così al prossimo giro
15651
- * ricontrolliamo tutti questi punti"*. Reading them meant grepping Loki and
15663
+ * 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
15652
15664
  * hand-correlating timestamps, which is how a 22% thumbnail gap and a 3-hour
15653
15665
  * media blackout were both diagnosed. The counters stay; this is where they can
15654
15666
  * be READ.
@@ -17024,7 +17036,7 @@ var BrokerStatusSchema$1 = _enum([
17024
17036
  "unreachable",
17025
17037
  "tls-error"
17026
17038
  ]);
17027
- var BrokerInfoSchema = object({
17039
+ var BrokerInfoSchema$1 = object({
17028
17040
  id: string(),
17029
17041
  name: string(),
17030
17042
  url: string(),
@@ -17087,7 +17099,7 @@ var StatusSchema = object({
17087
17099
  brokerCount: number(),
17088
17100
  embeddedRunning: boolean()
17089
17101
  });
17090
- method(_void(), array(BrokerInfoSchema)), method(IdInputSchema, BrokerConnectionDetailsSchema, { auth: "admin" }), method(AddBrokerInputSchema, AddBrokerResultSchema, {
17102
+ method(_void(), array(BrokerInfoSchema$1)), method(IdInputSchema, BrokerConnectionDetailsSchema, { auth: "admin" }), method(AddBrokerInputSchema, AddBrokerResultSchema, {
17091
17103
  kind: "mutation",
17092
17104
  auth: "admin"
17093
17105
  }), method(IdInputSchema, _void(), {
@@ -19263,78 +19275,16 @@ var NcRuleInputSchema = object({
19263
19275
  */
19264
19276
  confirm: NcConfirmSchema.optional(),
19265
19277
  /**
19266
- * WAIT for face/plate recognition before saying anything.
19267
- *
19268
- * A notification's TEXT is frozen at enqueue and its media is re-resolved at
19269
- * send; the identity is neither. A face is confirmed after `confirmFrames`
19270
- * agreeing observations — p50 **11.4 s** after the track was first seen,
19271
- * measured on this hub — and an `immediate` rule enqueues on the first object
19272
- * event, seconds before that. So "Gianluca è arrivato" is unsayable on the
19273
- * immediate path, and no amount of media re-resolution fixes a sentence.
19274
- *
19275
- * Only two honest answers exist, and this flag picks between them. It has
19276
- * effect ONLY on a rule that declares a recognition scope
19277
- * ({@link NcConditions.identities} or {@link NcConditions.plates}) — on any
19278
- * other rule there is nothing to wait for and the flag is inert.
19279
- *
19280
- * | value | what happens |
19281
- * | --- | --- |
19282
- * | `true` | the rule stops firing on the object event and fires at TRACK CLOSE instead, once, with the name — later, and complete |
19283
- * | 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) |
19284
- *
19285
- * `.optional()` and deliberately NOT `.default()`: a Zod default does not run
19286
- * on the addon cap path, and absent has to keep meaning exactly what every
19287
- * rule authored before this field meant.
19288
- *
19289
- * The cost of `true` is stated here because the editor states it too: a rule
19290
- * that waits also inherits track-close SEMANTICS — its `zones` condition
19291
- * tests every zone the track visited and a `crossing` condition can no longer
19292
- * be satisfied, because a closed track carries no crossing.
19293
- */
19294
- waitForEnhancement: boolean().optional(),
19295
- /**
19296
- * GROUP a burst of subjects into ONE notification that grows.
19297
- *
19298
- * Seconds of quiet after the last matching subject before the burst is
19299
- * considered over. While it is open, the first subject enqueues immediately —
19300
- * **exactly as today, with no added latency** — and every real growth (a new
19301
- * subject, or a name confirmed on one already in it) REPLACES that
19302
- * notification with an updated one naming everybody. The push carries the
19303
- * group's own coalescing tag, so the phone replaces rather than stacks.
19304
- *
19305
- * `0` / absent = off, and off is today's behaviour byte for byte.
19306
- *
19307
- * ### Why an idle cutoff and not a window
19308
- *
19309
- * The measured seven-person arrival on device 590 spans 110 s with every
19310
- * internal gap under 30 s. A 12 s fixed window cuts it into three groups; an
19311
- * idle cutoff holds it as one and ends it when the arrival actually ends.
19312
- * 30 s is a widely shipped value for the same decision.
19313
- *
19314
- * ### What it replaces
19315
- *
19316
- * The blind cooldown, which collapses a burst by DISCARDING it. Measured on
19317
- * device 615 / *Persona su Uscio* over six days: 116 qualifying tracks → 74
19318
- * notifications, **44 (37.9%) suppressed outright**, 23 of them overlapping a
19319
- * track that did fire and 7 carrying a confirmed identity nobody heard about.
19320
- * A group collapses the same volume by MERGING, so the cooldown becomes a
19321
- * budget over GROUPS — which is what it always meant — and a growth is never
19322
- * throttled by the window its own first member spent.
19323
- *
19324
- * ### Interaction with {@link waitForEnhancement}
19325
- *
19326
- * They compose, and the order matters. `waitForEnhancement` defers the rule to
19327
- * TRACK CLOSE, so with both set the group is opened by the first member to
19328
- * CLOSE — already carrying its name — and grows as later members close. That
19329
- * is later, and complete. With grouping alone the group opens on the first
19330
- * object event and picks up names as they are confirmed, through the growth
19331
- * path. Neither combination fires twice for one subject.
19332
- *
19333
- * `.optional()` and deliberately NOT `.default()`: a Zod default does not run
19334
- * on the addon cap path, so absent must keep meaning what it meant before this
19335
- * field existed.
19278
+ * IMMEDIATE GROUPED (D692): the first matching subject opens a window of this many
19279
+ * seconds; the rule sends ONE message when the window closes — early, once every
19280
+ * subject in it is final, never before {@link NC_GROUPING_MIN_SEC} — naming everybody
19281
+ * the rule matched, with one mosaic tile per subject.
19282
+ * Absent = plain immediate (one message per track, at the first match).
19283
+ * Only an `immediate` DETECTION rule may carry it (`ruleGroupingApplies`, enforced on
19284
+ * save by the hub's grouping guard). `.optional()`, never `.default()`: the addon cap
19285
+ * path does not run Zod defaults.
19336
19286
  */
19337
- groupIdleSec: number().int().min(0).max(600).optional()
19287
+ groupingSec: number().int().min(5).max(60).optional()
19338
19288
  });
19339
19289
  /**
19340
19290
  * Partial patch for `updateRule` — any subset of the input fields, plus the
@@ -19382,9 +19332,10 @@ var NcRuleClearableKeySchema = _enum([
19382
19332
  "targetUsers",
19383
19333
  "snoozeOptions",
19384
19334
  "snoozeAllowGlobal",
19385
- "waitForEnhancement",
19386
19335
  "actions",
19387
19336
  "confirm",
19337
+ "groupingSec",
19338
+ "waitForEnhancement",
19388
19339
  "groupIdleSec"
19389
19340
  ]);
19390
19341
  var NcRuleUpdateInputSchema = object({
@@ -19406,9 +19357,25 @@ var NcRuleSchema = NcRuleInputSchema.extend({
19406
19357
  */
19407
19358
  disabledTargetIds: array(string()).default([])
19408
19359
  });
19360
+ /**
19361
+ * The state-summary SECTIONS (D647 / D698): the D637 kind groups that report a
19362
+ * still-true state. `backups-exports` and `alarm` are not sections — a completed
19363
+ * job is not an open state, and the alarm stays instant.
19364
+ */
19365
+ var NcStateSummarySectionIdSchema = _enum([
19366
+ "device-state",
19367
+ "streams",
19368
+ "battery",
19369
+ "consumables",
19370
+ "tanks",
19371
+ "detection-blind",
19372
+ "nodes",
19373
+ "addons",
19374
+ "updates"
19375
+ ]);
19409
19376
  /** One section of a previewed state summary. `unavailable` = its state could not be read. */
19410
19377
  var NcStateSummaryPreviewSectionSchema = object({
19411
- id: string(),
19378
+ id: NcStateSummarySectionIdSchema,
19412
19379
  status: _enum(["read", "unavailable"]),
19413
19380
  items: number().int().nonnegative(),
19414
19381
  reason: string().optional()
@@ -19418,7 +19385,7 @@ var NcStateSummaryPreviewSectionSchema = object({
19418
19385
  * a `rule` split (no `section`), one section's on a `section` split.
19419
19386
  */
19420
19387
  var NcStateSummaryPreviewRowSchema = object({
19421
- section: string().optional(),
19388
+ section: NcStateSummarySectionIdSchema.optional(),
19422
19389
  /** The section's name on a per-section row; every reported section's, joined, on a combined one. */
19423
19390
  title: string(),
19424
19391
  text: string(),
@@ -21317,14 +21284,14 @@ var TrackSchema = object({
21317
21284
  * `derive-returned-null tile=standin`,
21318
21285
  * `native-tile tile=native no-key-frame-at-close`, …) written at close and
21319
21286
  * CLEARED by the late-keyFrame upgrade when a native tile lands after all.
21320
- * The operator-facing answer to "perché manca l'immagine?" on a track whose
21287
+ * The operator-facing answer to "perché manca l'immagine?" [why is the image missing?] on a track whose
21321
21288
  * tile is a face/plate stand-in, a raster crop, or an icon.
21322
21289
  *
21323
21290
  * **`no-key-frame-at-close` (D400).** The line used to be written ONLY when
21324
21291
  * the TILE ranked below native, so a track whose thumbnail landed natively
21325
21292
  * while its key frame missed carried no reason at all — three of the four
21326
21293
  * `MISSING_KEYFRAME` tracks in the 2026-09-07 operator audit were exactly
21327
- * that shape, and their "niente ultimo" had no cause anywhere on the row.
21294
+ * that shape, and their "niente ultimo" [no last frame] had no cause anywhere on the row.
21328
21295
  * The key frame is the head of a cascade (`keyFrame ⇒ keyFrameSmall ⇒ the
21329
21296
  * lastFrame copy source`), so its absence is now on this line whatever the
21330
21297
  * tile ended up being.
@@ -21411,7 +21378,7 @@ var MotionEventSchema = object({
21411
21378
  /**
21412
21379
  * Ms offsets from `timestamp` (the episode's own first rising edge, so the
21413
21380
  * first entry is always `0`) of every genuine off→on transition the
21414
- * episode saw — "ogni evento on si deve salvare" (D475). NOT one entry per
21381
+ * episode saw — "ogni evento on si deve salvare" [every ON event must be saved] (D475). NOT one entry per
21415
21382
  * push: a firmware source that keepalives at ~1 Hz for the whole burst
21416
21383
  * (Reolink, Hikvision) produces exactly one edge; a source that reports an
21417
21384
  * explicit `false` mid-episode and then resumes before the quiet window
@@ -21935,6 +21902,7 @@ var KeyEventSchema = object({
21935
21902
  bestEventId: string(),
21936
21903
  /** Track lifetime in ms (lastSeen - firstSeen). */
21937
21904
  windowMs: number().optional(),
21905
+ audioLabels: array(TrackAudioLabelSchema).readonly().optional(),
21938
21906
  ...TrackFlagFields,
21939
21907
  ...TrackRetrainFields
21940
21908
  });
@@ -26647,7 +26615,7 @@ var ClipPlaybackSchema = object({
26647
26615
  * **One authorised yes is one wake.** `next-natural` — take the clip the next
26648
26616
  * time the camera is awake for its own reasons — is deliberately not a member:
26649
26617
  * it was proposed, it is free on the battery, and the operator declined it on
26650
- * 2026-09-20 (*"Quando un export viene richiesto si sveglia la camera."*,
26618
+ * 2026-09-20 (*"Quando un export viene richiesto si sveglia la camera."* [When an export is requested the camera wakes up],
26651
26619
  * D558 "Considered and not taken").
26652
26620
  */
26653
26621
  var ClipWakeSchema = _enum(["authorised"]);
@@ -26908,7 +26876,7 @@ DeviceType.Camera, method(object({
26908
26876
  * It replaced `sources?: string[]`, a VIEW filter over source ids that
26909
26877
  * assumed the answer was a fan-out over everything a camera has. The
26910
26878
  * operator settled otherwise on 2026-09-20 — *"l'utilizzatore è uno
26911
- * solo"* — so the list is asked of one provider at a time and there is
26879
+ * solo"* [there is only one user] — so the list is asked of one provider at a time and there is
26912
26880
  * nothing to filter out of it.
26913
26881
  */
26914
26882
  provider: string().min(1)
@@ -33026,7 +32994,7 @@ var ReadGopBytesResultSchema = object({
33026
32994
  /**
33027
32995
  * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
33028
32996
  * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
33029
- * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
32997
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-clip-replay-on-pipeline.md`):
33030
32998
  * a replay needs several seconds of native pixels, not one frame.
33031
32999
  *
33032
33000
  * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
@@ -35642,6 +35610,7 @@ DeviceType.Camera, method(object({
35642
35610
  detection: array(ZoneRuleSchema).readonly(),
35643
35611
  package: array(ZoneRuleSchema).readonly()
35644
35612
  });
35613
+ SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
35645
35614
  /**
35646
35615
  * Accessory device helpers — shared across drivers.
35647
35616
  *
@@ -44204,6 +44173,11 @@ Object.freeze({
44204
44173
  }
44205
44174
  });
44206
44175
  Object.freeze({
44176
+ "accessories.getStatus": [{
44177
+ name: "deviceId",
44178
+ form: "single",
44179
+ optional: false
44180
+ }],
44207
44181
  "accessories.setChildHidden": [{
44208
44182
  name: "childDeviceId",
44209
44183
  form: "single",
@@ -44223,6 +44197,11 @@ Object.freeze({
44223
44197
  form: "single",
44224
44198
  optional: false
44225
44199
  }],
44200
+ "airQualitySensor.getStatus": [{
44201
+ name: "deviceId",
44202
+ form: "single",
44203
+ optional: false
44204
+ }],
44226
44205
  "alarmPanel.arm": [{
44227
44206
  name: "deviceId",
44228
44207
  form: "single",
@@ -44233,11 +44212,36 @@ Object.freeze({
44233
44212
  form: "single",
44234
44213
  optional: false
44235
44214
  }],
44215
+ "alarmPanel.getStatus": [{
44216
+ name: "deviceId",
44217
+ form: "single",
44218
+ optional: false
44219
+ }],
44236
44220
  "alarmPanel.trigger": [{
44237
44221
  name: "deviceId",
44238
44222
  form: "single",
44239
44223
  optional: false
44240
44224
  }],
44225
+ "ambientLightSensor.getStatus": [{
44226
+ name: "deviceId",
44227
+ form: "single",
44228
+ optional: false
44229
+ }],
44230
+ "audioAnalysis.applyDeviceSettingsPatch": [{
44231
+ name: "deviceId",
44232
+ form: "single",
44233
+ optional: false
44234
+ }],
44235
+ "audioAnalysis.getDeviceLiveContribution": [{
44236
+ name: "deviceId",
44237
+ form: "single",
44238
+ optional: false
44239
+ }],
44240
+ "audioAnalysis.getDeviceSettingsContribution": [{
44241
+ name: "deviceId",
44242
+ form: "single",
44243
+ optional: false
44244
+ }],
44241
44245
  "audioAnalysis.resolveDeviceSettings": [{
44242
44246
  name: "deviceId",
44243
44247
  form: "single",
@@ -44278,16 +44282,36 @@ Object.freeze({
44278
44282
  form: "single",
44279
44283
  optional: false
44280
44284
  }],
44285
+ "automationControl.getStatus": [{
44286
+ name: "deviceId",
44287
+ form: "single",
44288
+ optional: false
44289
+ }],
44281
44290
  "automationControl.trigger": [{
44282
44291
  name: "deviceId",
44283
44292
  form: "single",
44284
44293
  optional: false
44285
44294
  }],
44295
+ "battery.getStatus": [{
44296
+ name: "deviceId",
44297
+ form: "single",
44298
+ optional: false
44299
+ }],
44286
44300
  "battery.wakeForStream": [{
44287
44301
  name: "deviceId",
44288
44302
  form: "single",
44289
44303
  optional: false
44290
44304
  }],
44305
+ "binary.getStatus": [{
44306
+ name: "deviceId",
44307
+ form: "single",
44308
+ optional: false
44309
+ }],
44310
+ "brightness.getStatus": [{
44311
+ name: "deviceId",
44312
+ form: "single",
44313
+ optional: false
44314
+ }],
44291
44315
  "brightness.setBrightness": [{
44292
44316
  name: "deviceId",
44293
44317
  form: "single",
@@ -44303,6 +44327,26 @@ Object.freeze({
44303
44327
  form: "single",
44304
44328
  optional: false
44305
44329
  }],
44330
+ "cameraCredentials.getStatus": [{
44331
+ name: "deviceId",
44332
+ form: "single",
44333
+ optional: false
44334
+ }],
44335
+ "cameraGridLayout.applyDeviceSettingsPatch": [{
44336
+ name: "deviceId",
44337
+ form: "single",
44338
+ optional: false
44339
+ }],
44340
+ "cameraGridLayout.getDeviceLiveContribution": [{
44341
+ name: "deviceId",
44342
+ form: "single",
44343
+ optional: false
44344
+ }],
44345
+ "cameraGridLayout.getDeviceSettingsContribution": [{
44346
+ name: "deviceId",
44347
+ form: "single",
44348
+ optional: false
44349
+ }],
44306
44350
  "cameraGridLayout.getLayout": [{
44307
44351
  name: "deviceId",
44308
44352
  form: "single",
@@ -44318,6 +44362,21 @@ Object.freeze({
44318
44362
  form: "single",
44319
44363
  optional: false
44320
44364
  }],
44365
+ "cameraPipelineConfig.applyDeviceSettingsPatch": [{
44366
+ name: "deviceId",
44367
+ form: "single",
44368
+ optional: false
44369
+ }],
44370
+ "cameraPipelineConfig.getDeviceLiveContribution": [{
44371
+ name: "deviceId",
44372
+ form: "single",
44373
+ optional: false
44374
+ }],
44375
+ "cameraPipelineConfig.getDeviceSettingsContribution": [{
44376
+ name: "deviceId",
44377
+ form: "single",
44378
+ optional: false
44379
+ }],
44321
44380
  "cameraStreams.getBrokerStreams": [{
44322
44381
  name: "deviceId",
44323
44382
  form: "single",
@@ -44343,6 +44402,16 @@ Object.freeze({
44343
44402
  form: "single",
44344
44403
  optional: false
44345
44404
  }],
44405
+ "carbonMonoxide.getStatus": [{
44406
+ name: "deviceId",
44407
+ form: "single",
44408
+ optional: false
44409
+ }],
44410
+ "climateControl.getStatus": [{
44411
+ name: "deviceId",
44412
+ form: "single",
44413
+ optional: false
44414
+ }],
44346
44415
  "climateControl.setFanMode": [{
44347
44416
  name: "deviceId",
44348
44417
  form: "single",
@@ -44383,16 +44452,41 @@ Object.freeze({
44383
44452
  form: "single",
44384
44453
  optional: false
44385
44454
  }],
44455
+ "color.getStatus": [{
44456
+ name: "deviceId",
44457
+ form: "single",
44458
+ optional: false
44459
+ }],
44386
44460
  "color.setColor": [{
44387
44461
  name: "deviceId",
44388
44462
  form: "single",
44389
44463
  optional: false
44390
44464
  }],
44465
+ "connectivity.getStatus": [{
44466
+ name: "deviceId",
44467
+ form: "single",
44468
+ optional: false
44469
+ }],
44470
+ "consumables.getStatus": [{
44471
+ name: "deviceId",
44472
+ form: "single",
44473
+ optional: false
44474
+ }],
44391
44475
  "consumables.reset": [{
44392
44476
  name: "deviceId",
44393
44477
  form: "single",
44394
44478
  optional: false
44395
44479
  }],
44480
+ "contact.getStatus": [{
44481
+ name: "deviceId",
44482
+ form: "single",
44483
+ optional: false
44484
+ }],
44485
+ "control.getStatus": [{
44486
+ name: "deviceId",
44487
+ form: "single",
44488
+ optional: false
44489
+ }],
44396
44490
  "control.setValue": [{
44397
44491
  name: "deviceId",
44398
44492
  form: "single",
@@ -44403,6 +44497,11 @@ Object.freeze({
44403
44497
  form: "single",
44404
44498
  optional: false
44405
44499
  }],
44500
+ "cover.getStatus": [{
44501
+ name: "deviceId",
44502
+ form: "single",
44503
+ optional: false
44504
+ }],
44406
44505
  "cover.open": [{
44407
44506
  name: "deviceId",
44408
44507
  form: "single",
@@ -44428,6 +44527,11 @@ Object.freeze({
44428
44527
  form: "single",
44429
44528
  optional: false
44430
44529
  }],
44530
+ "dayNight.getStatus": [{
44531
+ name: "deviceId",
44532
+ form: "single",
44533
+ optional: false
44534
+ }],
44431
44535
  "dayNight.setSettings": [{
44432
44536
  name: "deviceId",
44433
44537
  form: "single",
@@ -44438,11 +44542,31 @@ Object.freeze({
44438
44542
  form: "single",
44439
44543
  optional: true
44440
44544
  }],
44545
+ "detectionPipeline.applyDeviceSettingsPatch": [{
44546
+ name: "deviceId",
44547
+ form: "single",
44548
+ optional: false
44549
+ }],
44550
+ "detectionPipeline.getDeviceLiveContribution": [{
44551
+ name: "deviceId",
44552
+ form: "single",
44553
+ optional: false
44554
+ }],
44555
+ "detectionPipeline.getDeviceSettingsContribution": [{
44556
+ name: "deviceId",
44557
+ form: "single",
44558
+ optional: false
44559
+ }],
44441
44560
  "deviceAdminLink.getAdminLink": [{
44442
44561
  name: "deviceId",
44443
44562
  form: "single",
44444
44563
  optional: false
44445
44564
  }],
44565
+ "deviceAdoption.getStatus": [{
44566
+ name: "deviceId",
44567
+ form: "single",
44568
+ optional: false
44569
+ }],
44446
44570
  "deviceAdoption.release": [{
44447
44571
  name: "camDeviceId",
44448
44572
  form: "single",
@@ -44458,6 +44582,11 @@ Object.freeze({
44458
44582
  form: "single",
44459
44583
  optional: false
44460
44584
  }],
44585
+ "deviceDiscovery.getStatus": [{
44586
+ name: "deviceId",
44587
+ form: "single",
44588
+ optional: false
44589
+ }],
44461
44590
  "deviceDiscovery.listDiscovered": [{
44462
44591
  name: "deviceId",
44463
44592
  form: "single",
@@ -44477,6 +44606,21 @@ Object.freeze({
44477
44606
  form: "single",
44478
44607
  optional: false
44479
44608
  }],
44609
+ "deviceExport.applyDeviceSettingsPatch": [{
44610
+ name: "deviceId",
44611
+ form: "single",
44612
+ optional: false
44613
+ }],
44614
+ "deviceExport.getDeviceLiveContribution": [{
44615
+ name: "deviceId",
44616
+ form: "single",
44617
+ optional: false
44618
+ }],
44619
+ "deviceExport.getDeviceSettingsContribution": [{
44620
+ name: "deviceId",
44621
+ form: "single",
44622
+ optional: false
44623
+ }],
44480
44624
  "deviceExtension.listCandidates": [{
44481
44625
  name: "deviceId",
44482
44626
  form: "single",
@@ -44825,6 +44969,26 @@ Object.freeze({
44825
44969
  form: "single",
44826
44970
  optional: false
44827
44971
  }],
44972
+ "deviceStatus.getStatus": [{
44973
+ name: "deviceId",
44974
+ form: "single",
44975
+ optional: false
44976
+ }],
44977
+ "doorbell.getStatus": [{
44978
+ name: "deviceId",
44979
+ form: "single",
44980
+ optional: false
44981
+ }],
44982
+ "enumSensor.getStatus": [{
44983
+ name: "deviceId",
44984
+ form: "single",
44985
+ optional: false
44986
+ }],
44987
+ "eventEmitter.getStatus": [{
44988
+ name: "deviceId",
44989
+ form: "single",
44990
+ optional: false
44991
+ }],
44828
44992
  "faceGallery.getFaceByTrack": [{
44829
44993
  name: "deviceId",
44830
44994
  form: "single",
@@ -44839,6 +45003,11 @@ Object.freeze({
44839
45003
  form: "array",
44840
45004
  optional: true
44841
45005
  }],
45006
+ "fanControl.getStatus": [{
45007
+ name: "deviceId",
45008
+ form: "single",
45009
+ optional: false
45010
+ }],
44842
45011
  "fanControl.setDirection": [{
44843
45012
  name: "deviceId",
44844
45013
  form: "single",
@@ -44859,6 +45028,26 @@ Object.freeze({
44859
45028
  form: "single",
44860
45029
  optional: false
44861
45030
  }],
45031
+ "featureProbe.getStatus": [{
45032
+ name: "deviceId",
45033
+ form: "single",
45034
+ optional: false
45035
+ }],
45036
+ "flood.getStatus": [{
45037
+ name: "deviceId",
45038
+ form: "single",
45039
+ optional: false
45040
+ }],
45041
+ "gas.getStatus": [{
45042
+ name: "deviceId",
45043
+ form: "single",
45044
+ optional: false
45045
+ }],
45046
+ "humidifier.getStatus": [{
45047
+ name: "deviceId",
45048
+ form: "single",
45049
+ optional: false
45050
+ }],
44862
45051
  "humidifier.setMode": [{
44863
45052
  name: "deviceId",
44864
45053
  form: "single",
@@ -44874,11 +45063,26 @@ Object.freeze({
44874
45063
  form: "single",
44875
45064
  optional: false
44876
45065
  }],
45066
+ "humiditySensor.getStatus": [{
45067
+ name: "deviceId",
45068
+ form: "single",
45069
+ optional: false
45070
+ }],
45071
+ "image.getStatus": [{
45072
+ name: "deviceId",
45073
+ form: "single",
45074
+ optional: false
45075
+ }],
44877
45076
  "imageSettings.getOptions": [{
44878
45077
  name: "deviceId",
44879
45078
  form: "single",
44880
45079
  optional: false
44881
45080
  }],
45081
+ "imageSettings.getStatus": [{
45082
+ name: "deviceId",
45083
+ form: "single",
45084
+ optional: false
45085
+ }],
44882
45086
  "imageSettings.setSettings": [{
44883
45087
  name: "deviceId",
44884
45088
  form: "single",
@@ -44889,6 +45093,11 @@ Object.freeze({
44889
45093
  form: "single",
44890
45094
  optional: false
44891
45095
  }],
45096
+ "intercom.getStatus": [{
45097
+ name: "deviceId",
45098
+ form: "single",
45099
+ optional: false
45100
+ }],
44892
45101
  "intercom.handleAnswer": [{
44893
45102
  name: "deviceId",
44894
45103
  form: "single",
@@ -44919,6 +45128,11 @@ Object.freeze({
44919
45128
  form: "single",
44920
45129
  optional: false
44921
45130
  }],
45131
+ "lawnMowerControl.getStatus": [{
45132
+ name: "deviceId",
45133
+ form: "single",
45134
+ optional: false
45135
+ }],
44922
45136
  "lawnMowerControl.pause": [{
44923
45137
  name: "deviceId",
44924
45138
  form: "single",
@@ -44929,6 +45143,11 @@ Object.freeze({
44929
45143
  form: "single",
44930
45144
  optional: false
44931
45145
  }],
45146
+ "lockControl.getStatus": [{
45147
+ name: "deviceId",
45148
+ form: "single",
45149
+ optional: false
45150
+ }],
44932
45151
  "lockControl.lock": [{
44933
45152
  name: "deviceId",
44934
45153
  form: "single",
@@ -44944,6 +45163,11 @@ Object.freeze({
44944
45163
  form: "single",
44945
45164
  optional: false
44946
45165
  }],
45166
+ "mediaPlayer.getStatus": [{
45167
+ name: "deviceId",
45168
+ form: "single",
45169
+ optional: false
45170
+ }],
44947
45171
  "mediaPlayer.next": [{
44948
45172
  name: "deviceId",
44949
45173
  form: "single",
@@ -45004,6 +45228,11 @@ Object.freeze({
45004
45228
  form: "single",
45005
45229
  optional: false
45006
45230
  }],
45231
+ "motion.getStatus": [{
45232
+ name: "deviceId",
45233
+ form: "single",
45234
+ optional: false
45235
+ }],
45007
45236
  "motion.isDetected": [{
45008
45237
  name: "deviceId",
45009
45238
  form: "single",
@@ -45014,11 +45243,31 @@ Object.freeze({
45014
45243
  form: "single",
45015
45244
  optional: false
45016
45245
  }],
45246
+ "motionDetection.applyDeviceSettingsPatch": [{
45247
+ name: "deviceId",
45248
+ form: "single",
45249
+ optional: false
45250
+ }],
45251
+ "motionDetection.getDeviceLiveContribution": [{
45252
+ name: "deviceId",
45253
+ form: "single",
45254
+ optional: false
45255
+ }],
45256
+ "motionDetection.getDeviceSettingsContribution": [{
45257
+ name: "deviceId",
45258
+ form: "single",
45259
+ optional: false
45260
+ }],
45017
45261
  "motionDetection.removeCamera": [{
45018
45262
  name: "deviceId",
45019
45263
  form: "single",
45020
45264
  optional: false
45021
45265
  }],
45266
+ "motionTrigger.getStatus": [{
45267
+ name: "deviceId",
45268
+ form: "single",
45269
+ optional: false
45270
+ }],
45022
45271
  "motionTrigger.setMotionTrigger": [{
45023
45272
  name: "deviceId",
45024
45273
  form: "single",
@@ -45029,6 +45278,11 @@ Object.freeze({
45029
45278
  form: "single",
45030
45279
  optional: false
45031
45280
  }],
45281
+ "motionZones.getStatus": [{
45282
+ name: "deviceId",
45283
+ form: "single",
45284
+ optional: false
45285
+ }],
45032
45286
  "motionZones.setZone": [{
45033
45287
  name: "deviceId",
45034
45288
  form: "single",
@@ -45039,6 +45293,11 @@ Object.freeze({
45039
45293
  form: "single",
45040
45294
  optional: false
45041
45295
  }],
45296
+ "nativeObjectDetection.getStatus": [{
45297
+ name: "deviceId",
45298
+ form: "single",
45299
+ optional: false
45300
+ }],
45042
45301
  "nativeObjectDetection.setEnabled": [{
45043
45302
  name: "deviceId",
45044
45303
  form: "single",
@@ -45054,6 +45313,11 @@ Object.freeze({
45054
45313
  form: "single",
45055
45314
  optional: false
45056
45315
  }],
45316
+ "navigation.getStatus": [{
45317
+ name: "deviceId",
45318
+ form: "single",
45319
+ optional: false
45320
+ }],
45057
45321
  "navigation.goToPoint": [{
45058
45322
  name: "deviceId",
45059
45323
  form: "single",
@@ -45099,6 +45363,11 @@ Object.freeze({
45099
45363
  form: "single",
45100
45364
  optional: false
45101
45365
  }],
45366
+ "networkLink.getStatus": [{
45367
+ name: "deviceId",
45368
+ form: "single",
45369
+ optional: false
45370
+ }],
45102
45371
  "networkQuality.getDeviceStats": [{
45103
45372
  name: "deviceId",
45104
45373
  form: "single",
@@ -45124,11 +45393,26 @@ Object.freeze({
45124
45393
  form: "single",
45125
45394
  optional: false
45126
45395
  }],
45396
+ "notifier.getStatus": [{
45397
+ name: "deviceId",
45398
+ form: "single",
45399
+ optional: false
45400
+ }],
45127
45401
  "notifier.send": [{
45128
45402
  name: "deviceId",
45129
45403
  form: "single",
45130
45404
  optional: false
45131
45405
  }],
45406
+ "numericSensor.getStatus": [{
45407
+ name: "deviceId",
45408
+ form: "single",
45409
+ optional: false
45410
+ }],
45411
+ "osd.getStatus": [{
45412
+ name: "deviceId",
45413
+ form: "single",
45414
+ optional: false
45415
+ }],
45132
45416
  "osd.setOverlay": [{
45133
45417
  name: "deviceId",
45134
45418
  form: "single",
@@ -45188,6 +45472,11 @@ Object.freeze({
45188
45472
  form: "single",
45189
45473
  optional: false
45190
45474
  }],
45475
+ "petFeeder.getStatus": [{
45476
+ name: "deviceId",
45477
+ form: "single",
45478
+ optional: false
45479
+ }],
45191
45480
  "petFeeder.markFoodReplenished": [{
45192
45481
  name: "deviceId",
45193
45482
  form: "single",
@@ -45223,6 +45512,11 @@ Object.freeze({
45223
45512
  form: "single",
45224
45513
  optional: false
45225
45514
  }],
45515
+ "pipelineAnalytics.applyDeviceSettingsPatch": [{
45516
+ name: "deviceId",
45517
+ form: "single",
45518
+ optional: false
45519
+ }],
45226
45520
  "pipelineAnalytics.clearTrackRelation": [{
45227
45521
  name: "deviceId",
45228
45522
  form: "single",
@@ -45263,6 +45557,16 @@ Object.freeze({
45263
45557
  form: "single",
45264
45558
  optional: false
45265
45559
  }],
45560
+ "pipelineAnalytics.getDeviceLiveContribution": [{
45561
+ name: "deviceId",
45562
+ form: "single",
45563
+ optional: false
45564
+ }],
45565
+ "pipelineAnalytics.getDeviceSettingsContribution": [{
45566
+ name: "deviceId",
45567
+ form: "single",
45568
+ optional: false
45569
+ }],
45266
45570
  "pipelineAnalytics.getEventDensity": [{
45267
45571
  name: "deviceId",
45268
45572
  form: "single",
@@ -45478,6 +45782,11 @@ Object.freeze({
45478
45782
  form: "single",
45479
45783
  optional: true
45480
45784
  }],
45785
+ "pipelineOrchestrator.applyDeviceSettingsPatch": [{
45786
+ name: "deviceId",
45787
+ form: "single",
45788
+ optional: false
45789
+ }],
45481
45790
  "pipelineOrchestrator.assignAudio": [{
45482
45791
  name: "deviceId",
45483
45792
  form: "single",
@@ -45523,6 +45832,16 @@ Object.freeze({
45523
45832
  form: "single",
45524
45833
  optional: false
45525
45834
  }],
45835
+ "pipelineOrchestrator.getDeviceLiveContribution": [{
45836
+ name: "deviceId",
45837
+ form: "single",
45838
+ optional: false
45839
+ }],
45840
+ "pipelineOrchestrator.getDeviceSettingsContribution": [{
45841
+ name: "deviceId",
45842
+ form: "single",
45843
+ optional: false
45844
+ }],
45526
45845
  "pipelineOrchestrator.getPipelineAssignment": [{
45527
45846
  name: "deviceId",
45528
45847
  form: "single",
@@ -45643,11 +45962,31 @@ Object.freeze({
45643
45962
  form: "single",
45644
45963
  optional: true
45645
45964
  }],
45965
+ "powerMeter.getStatus": [{
45966
+ name: "deviceId",
45967
+ form: "single",
45968
+ optional: false
45969
+ }],
45970
+ "presence.getStatus": [{
45971
+ name: "deviceId",
45972
+ form: "single",
45973
+ optional: false
45974
+ }],
45975
+ "pressureSensor.getStatus": [{
45976
+ name: "deviceId",
45977
+ form: "single",
45978
+ optional: false
45979
+ }],
45646
45980
  "privacyMask.getOptions": [{
45647
45981
  name: "deviceId",
45648
45982
  form: "single",
45649
45983
  optional: false
45650
45984
  }],
45985
+ "privacyMask.getStatus": [{
45986
+ name: "deviceId",
45987
+ form: "single",
45988
+ optional: false
45989
+ }],
45651
45990
  "privacyMask.setAudioEnabled": [{
45652
45991
  name: "deviceId",
45653
45992
  form: "single",
@@ -45698,6 +46037,11 @@ Object.freeze({
45698
46037
  form: "single",
45699
46038
  optional: false
45700
46039
  }],
46040
+ "ptz.getStatus": [{
46041
+ name: "deviceId",
46042
+ form: "single",
46043
+ optional: false
46044
+ }],
45701
46045
  "ptz.goHome": [{
45702
46046
  name: "deviceId",
45703
46047
  form: "single",
@@ -45788,6 +46132,11 @@ Object.freeze({
45788
46132
  form: "single",
45789
46133
  optional: false
45790
46134
  }],
46135
+ "recordingArchive.applyDeviceSettingsPatch": [{
46136
+ name: "deviceId",
46137
+ form: "single",
46138
+ optional: false
46139
+ }],
45791
46140
  "recordingArchive.deleteFootprint": [{
45792
46141
  name: "deviceId",
45793
46142
  form: "single",
@@ -45808,6 +46157,21 @@ Object.freeze({
45808
46157
  form: "single",
45809
46158
  optional: false
45810
46159
  }],
46160
+ "recordingArchive.getDeviceLiveContribution": [{
46161
+ name: "deviceId",
46162
+ form: "single",
46163
+ optional: false
46164
+ }],
46165
+ "recordingArchive.getDeviceSettingsContribution": [{
46166
+ name: "deviceId",
46167
+ form: "single",
46168
+ optional: false
46169
+ }],
46170
+ "recordingArchive.getStatus": [{
46171
+ name: "deviceId",
46172
+ form: "single",
46173
+ optional: false
46174
+ }],
45811
46175
  "recordingArchive.listOpsLog": [{
45812
46176
  name: "deviceId",
45813
46177
  form: "single",
@@ -45893,6 +46257,11 @@ Object.freeze({
45893
46257
  form: "single",
45894
46258
  optional: false
45895
46259
  }],
46260
+ "recordingOnboard.getStatus": [{
46261
+ name: "deviceId",
46262
+ form: "single",
46263
+ optional: false
46264
+ }],
45896
46265
  "recordingOnboard.setSettings": [{
45897
46266
  name: "deviceId",
45898
46267
  form: "single",
@@ -45923,6 +46292,11 @@ Object.freeze({
45923
46292
  form: "single",
45924
46293
  optional: false
45925
46294
  }],
46295
+ "sceneMonitor.getStatus": [{
46296
+ name: "deviceId",
46297
+ form: "single",
46298
+ optional: false
46299
+ }],
45926
46300
  "sceneMonitor.listScenes": [{
45927
46301
  name: "deviceId",
45928
46302
  form: "single",
@@ -45948,6 +46322,11 @@ Object.freeze({
45948
46322
  form: "single",
45949
46323
  optional: false
45950
46324
  }],
46325
+ "scriptRunner.getStatus": [{
46326
+ name: "deviceId",
46327
+ form: "single",
46328
+ optional: false
46329
+ }],
45951
46330
  "scriptRunner.run": [{
45952
46331
  name: "deviceId",
45953
46332
  form: "single",
@@ -45958,11 +46337,31 @@ Object.freeze({
45958
46337
  form: "single",
45959
46338
  optional: false
45960
46339
  }],
46340
+ "smoke.getStatus": [{
46341
+ name: "deviceId",
46342
+ form: "single",
46343
+ optional: false
46344
+ }],
46345
+ "snapshot.applyDeviceSettingsPatch": [{
46346
+ name: "deviceId",
46347
+ form: "single",
46348
+ optional: false
46349
+ }],
45961
46350
  "snapshot.getDebugState": [{
45962
46351
  name: "deviceId",
45963
46352
  form: "single",
45964
46353
  optional: false
45965
46354
  }],
46355
+ "snapshot.getDeviceLiveContribution": [{
46356
+ name: "deviceId",
46357
+ form: "single",
46358
+ optional: false
46359
+ }],
46360
+ "snapshot.getDeviceSettingsContribution": [{
46361
+ name: "deviceId",
46362
+ form: "single",
46363
+ optional: false
46364
+ }],
45966
46365
  "snapshot.getSnapshot": [{
45967
46366
  name: "deviceId",
45968
46367
  form: "single",
@@ -45979,6 +46378,11 @@ Object.freeze({
45979
46378
  form: "array",
45980
46379
  optional: false
45981
46380
  }],
46381
+ "snapshot.getStatus": [{
46382
+ name: "deviceId",
46383
+ form: "single",
46384
+ optional: false
46385
+ }],
45982
46386
  "snapshot.invalidateCache": [{
45983
46387
  name: "deviceId",
45984
46388
  form: "single",
@@ -45989,6 +46393,11 @@ Object.freeze({
45989
46393
  form: "single",
45990
46394
  optional: false
45991
46395
  }],
46396
+ "streamBroker.applyDeviceSettingsPatch": [{
46397
+ name: "deviceId",
46398
+ form: "single",
46399
+ optional: false
46400
+ }],
45992
46401
  "streamBroker.assignProfile": [{
45993
46402
  name: "deviceId",
45994
46403
  form: "single",
@@ -46004,6 +46413,16 @@ Object.freeze({
46004
46413
  form: "single",
46005
46414
  optional: false
46006
46415
  }],
46416
+ "streamBroker.getDeviceLiveContribution": [{
46417
+ name: "deviceId",
46418
+ form: "single",
46419
+ optional: false
46420
+ }],
46421
+ "streamBroker.getDeviceSettingsContribution": [{
46422
+ name: "deviceId",
46423
+ form: "single",
46424
+ optional: false
46425
+ }],
46007
46426
  "streamBroker.getStreamWithCodec": [{
46008
46427
  name: "deviceId",
46009
46428
  form: "single",
@@ -46064,16 +46483,46 @@ Object.freeze({
46064
46483
  form: "single",
46065
46484
  optional: false
46066
46485
  }],
46486
+ "streamParams.getStatus": [{
46487
+ name: "deviceId",
46488
+ form: "single",
46489
+ optional: false
46490
+ }],
46067
46491
  "streamParams.setProfile": [{
46068
46492
  name: "deviceId",
46069
46493
  form: "single",
46070
46494
  optional: false
46071
46495
  }],
46496
+ "switch.getStatus": [{
46497
+ name: "deviceId",
46498
+ form: "single",
46499
+ optional: false
46500
+ }],
46072
46501
  "switch.setState": [{
46073
46502
  name: "deviceId",
46074
46503
  form: "single",
46075
46504
  optional: false
46076
46505
  }],
46506
+ "tamper.getStatus": [{
46507
+ name: "deviceId",
46508
+ form: "single",
46509
+ optional: false
46510
+ }],
46511
+ "temperatureSensor.getStatus": [{
46512
+ name: "deviceId",
46513
+ form: "single",
46514
+ optional: false
46515
+ }],
46516
+ "update.getStatus": [{
46517
+ name: "deviceId",
46518
+ form: "single",
46519
+ optional: false
46520
+ }],
46521
+ "vacuumControl.getStatus": [{
46522
+ name: "deviceId",
46523
+ form: "single",
46524
+ optional: false
46525
+ }],
46077
46526
  "vacuumControl.locate": [{
46078
46527
  name: "deviceId",
46079
46528
  form: "single",
@@ -46109,6 +46558,11 @@ Object.freeze({
46109
46558
  form: "single",
46110
46559
  optional: false
46111
46560
  }],
46561
+ "valve.getStatus": [{
46562
+ name: "deviceId",
46563
+ form: "single",
46564
+ optional: false
46565
+ }],
46112
46566
  "valve.open": [{
46113
46567
  name: "deviceId",
46114
46568
  form: "single",
@@ -46124,6 +46578,11 @@ Object.freeze({
46124
46578
  form: "single",
46125
46579
  optional: false
46126
46580
  }],
46581
+ "vibration.getStatus": [{
46582
+ name: "deviceId",
46583
+ form: "single",
46584
+ optional: false
46585
+ }],
46127
46586
  "videoclips.dialClipStream": [{
46128
46587
  name: "deviceId",
46129
46588
  form: "single",
@@ -46159,6 +46618,11 @@ Object.freeze({
46159
46618
  form: "single",
46160
46619
  optional: false
46161
46620
  }],
46621
+ "waterHeater.getStatus": [{
46622
+ name: "deviceId",
46623
+ form: "single",
46624
+ optional: false
46625
+ }],
46162
46626
  "waterHeater.setAway": [{
46163
46627
  name: "deviceId",
46164
46628
  form: "single",
@@ -46174,6 +46638,11 @@ Object.freeze({
46174
46638
  form: "single",
46175
46639
  optional: false
46176
46640
  }],
46641
+ "weather.getStatus": [{
46642
+ name: "deviceId",
46643
+ form: "single",
46644
+ optional: false
46645
+ }],
46177
46646
  "webrtcSession.addIceCandidate": [{
46178
46647
  name: "deviceId",
46179
46648
  form: "single",
@@ -46911,7 +47380,7 @@ var PreviewTextField = string().max(200);
46911
47380
  * Whether the notification's preview is a STILL or a short animation.
46912
47381
  *
46913
47382
  * The operator's ask, verbatim: *"inviato come gif o video (come per le altre
46914
- * rule)"* — the other rules already offer an animated preview, and a ten-hour
47383
+ * rule)"* [sent as a gif or video (as for the other rules)] — the other rules already offer an animated preview, and a ten-hour
46915
47384
  * night reads better as three seconds of motion than as one frame of it. Both
46916
47385
  * modes get the SAME treatment (blurred frame, large centred title); `'gif'`
46917
47386
  * simply applies it to a dozen frames sampled across the render and assembles
@@ -47253,7 +47722,7 @@ var AgentUIAddon = class extends BaseAddon {
47253
47722
  capability: adminUiCapability,
47254
47723
  provider: {
47255
47724
  getStaticDir: async () => ({ staticDir: path.resolve(__dirname) }),
47256
- getVersion: async () => ({ version: "1.2.162" })
47725
+ getVersion: async () => ({ version: "1.2.164" })
47257
47726
  }
47258
47727
  }];
47259
47728
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-agent-ui",
3
- "version": "1.2.162",
3
+ "version": "1.2.164",
4
4
  "description": "Agent UI — lightweight status dashboard served by every agent node",
5
5
  "keywords": [
6
6
  "camstack",