@camstack/addon-post-analysis 1.2.312 → 1.2.314

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.
@@ -875,6 +875,14 @@ var propertyKeyTypes = /* @__PURE__*/ new Set([
875
875
  "number",
876
876
  "symbol"
877
877
  ]);
878
+ var primitiveTypes = /* @__PURE__*/ new Set([
879
+ "string",
880
+ "number",
881
+ "bigint",
882
+ "boolean",
883
+ "symbol",
884
+ "undefined"
885
+ ]);
878
886
  function escapeRegex(str) {
879
887
  return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
880
888
  }
@@ -3122,6 +3130,43 @@ function handleReadonlyResult(payload) {
3122
3130
  payload.value = Object.freeze(payload.value);
3123
3131
  return payload;
3124
3132
  }
3133
+ var $ZodTemplateLiteral = /*@__PURE__*/ $constructor("$ZodTemplateLiteral", (inst, def) => {
3134
+ $ZodType.init(inst, def);
3135
+ const regexParts = [];
3136
+ for (const part of def.parts) if (typeof part === "object" && part !== null) {
3137
+ if (!part._zod.pattern) throw new Error(`Invalid template literal part, no pattern found: ${[...part._zod.traits].shift()}`);
3138
+ const source = part._zod.pattern instanceof RegExp ? part._zod.pattern.source : part._zod.pattern;
3139
+ if (!source) throw new Error(`Invalid template literal part: ${part._zod.traits}`);
3140
+ const start = source.startsWith("^") ? 1 : 0;
3141
+ const end = source.endsWith("$") ? source.length - 1 : source.length;
3142
+ regexParts.push(source.slice(start, end));
3143
+ } else if (part === null || primitiveTypes.has(typeof part)) regexParts.push(escapeRegex(`${part}`));
3144
+ else throw new Error(`Invalid template literal part: ${part}`);
3145
+ inst._zod.pattern = new RegExp(`^${regexParts.join("")}$`);
3146
+ inst._zod.parse = (payload, _ctx) => {
3147
+ if (typeof payload.value !== "string") {
3148
+ payload.issues.push({
3149
+ input: payload.value,
3150
+ inst,
3151
+ expected: "string",
3152
+ code: "invalid_type"
3153
+ });
3154
+ return payload;
3155
+ }
3156
+ inst._zod.pattern.lastIndex = 0;
3157
+ if (!inst._zod.pattern.test(payload.value)) {
3158
+ payload.issues.push({
3159
+ input: payload.value,
3160
+ inst,
3161
+ code: "invalid_format",
3162
+ format: def.format ?? "template_literal",
3163
+ pattern: inst._zod.pattern.source
3164
+ });
3165
+ return payload;
3166
+ }
3167
+ return payload;
3168
+ };
3169
+ });
3125
3170
  var $ZodLazy = /*@__PURE__*/ $constructor("$ZodLazy", (inst, def) => {
3126
3171
  $ZodType.init(inst, def);
3127
3172
  defineLazy(inst._zod, "innerType", () => {
@@ -4141,6 +4186,13 @@ var literalProcessor = (schema, ctx, json, _params) => {
4141
4186
  json.enum = vals;
4142
4187
  }
4143
4188
  };
4189
+ var templateLiteralProcessor = (schema, _ctx, json, _params) => {
4190
+ const _json = json;
4191
+ const pattern = schema._zod.pattern;
4192
+ if (!pattern) throw new Error("Pattern not found in template literal");
4193
+ _json.type = "string";
4194
+ _json.pattern = pattern.source;
4195
+ };
4144
4196
  var customProcessor = (_schema, ctx, _json, _params) => {
4145
4197
  if (ctx.unrepresentable === "throw") throw new Error("Custom types cannot be represented in JSON Schema");
4146
4198
  };
@@ -5314,6 +5366,18 @@ function readonly(innerType) {
5314
5366
  innerType
5315
5367
  });
5316
5368
  }
5369
+ var ZodTemplateLiteral = /*@__PURE__*/ $constructor("ZodTemplateLiteral", (inst, def) => {
5370
+ $ZodTemplateLiteral.init(inst, def);
5371
+ ZodType.init(inst, def);
5372
+ inst._zod.processJSONSchema = (ctx, json, params) => templateLiteralProcessor(inst, ctx, json, params);
5373
+ });
5374
+ function templateLiteral(parts, params) {
5375
+ return new ZodTemplateLiteral({
5376
+ type: "template_literal",
5377
+ parts,
5378
+ ...normalizeParams(params)
5379
+ });
5380
+ }
5317
5381
  var ZodLazy = /*@__PURE__*/ $constructor("ZodLazy", (inst, def) => {
5318
5382
  $ZodLazy.init(inst, def);
5319
5383
  ZodType.init(inst, def);
@@ -7646,7 +7710,7 @@ function errMsg(err) {
7646
7710
  return String(err);
7647
7711
  }
7648
7712
  //#endregion
7649
- //#region ../types/dist/composition-43aqsZQj.mjs
7713
+ //#region ../types/dist/composition-D7ULvLdD.mjs
7650
7714
  /**
7651
7715
  * Deterministic SHA-256 hash of an arbitrary serialisable value. The
7652
7716
  * canonical form sorts object keys alphabetically at every depth so two
@@ -7731,20 +7795,20 @@ function portable(target) {
7731
7795
  }
7732
7796
  portable("linux64"), portable("linuxarm64"), portable("macarm64"), portable("mac64");
7733
7797
  /**
7734
- * LA tabella "quale booleano di questo tipo di device conta come ALTO", e il
7735
- * valutatore puro del suo FRONTE.
7798
+ * THE table "which boolean of this device type counts as HIGH", and the
7799
+ * pure evaluator of its EDGE.
7736
7800
  *
7737
- * UNA tabella per tutti quelli che chiedono "questo device è ALTO?": il
7738
- * trigger `RecordingTriggers.sensorDeviceIds` del recorder, i marker dei
7739
- * sensori della post-analysis, il bridge camera-sensors dell'orchestratore e
7740
- * le sorgenti di un campanello composto (`doorbellFeatureSources`, D671).
7741
- * Una seconda copia divergerebbe alla prima cap aggiunta, e il sintomo — "il
7742
- * sensore fa suonare il campanello ma non registra" — è esattamente D62.
7801
+ * ONE table for everyone who asks "is this device HIGH?": the
7802
+ * recorder's `RecordingTriggers.sensorDeviceIds` trigger, the post-analysis
7803
+ * sensor markers, the orchestrator's camera-sensors bridge and
7804
+ * the sources of a composite doorbell (`doorbellFeatureSources`, D671).
7805
+ * A second copy would diverge at the first cap added, and the symptom — "the
7806
+ * sensor rings the doorbell but does not record" — is exactly D62.
7743
7807
  *
7744
- * ⚠ NON è `DEVICE_STATE_READERS` (`catalogs/device-state-vocabulary.ts`), e le
7745
- * due non vanno unificate: quella risponde a "qual è la PAROLA di stato per una
7746
- * regola" (e include `presence`, `cover`, `alarm-panel`), questa a "qual è il
7747
- * booleano il cui FRONTE conta". Vocabolari deliberatamente diversi.
7808
+ * ⚠ NOT `DEVICE_STATE_READERS` (`catalogs/device-state-vocabulary.ts`), and the
7809
+ * two must not be unified: that one answers "what is the state WORD for a
7810
+ * rule" (and includes `presence`, `cover`, `alarm-panel`), this one "which
7811
+ * boolean's EDGE counts". Deliberately different vocabularies.
7748
7812
  */
7749
7813
  /**
7750
7814
  * Known binary / switch source caps → the boolean slice field whose
@@ -7836,17 +7900,17 @@ function evaluateSensorLevelEdge(input) {
7836
7900
  };
7837
7901
  }
7838
7902
  /**
7839
- * IL fronte. Puro: nessun orologio proprio, nessuna memoria — il chiamante
7840
- * porta `prior`, `nowMs` e il proprio `startedAtMs`.
7903
+ * THE edge. Pure: no clock of its own, no memory — the caller
7904
+ * brings `prior`, `nowMs` and its own `startedAtMs`.
7841
7905
  *
7842
- * Il caso della PRIMA slice già attiva è trattato esplicitamente e vale come
7843
- * fronte solo se il timestamp UPSTREAM della transizione è posteriore a
7844
- * `startedAtMs` **e** entro `firstSightingFreshnessMs`. Entrambe le metà
7845
- * servono: la sola freschezza scatterebbe su un'idratazione al boot di uno
7846
- * stato flippato pochi secondi prima del riavvio, e il solo "dopo che abbiamo
7847
- * iniziato" scatterebbe, su un processo di lunga vita, per una sorgente
7848
- * adottata oggi il cui stato è cambiato ieri. Il caso ambiguo ERRA VERSO IL
7849
- * SILENZIO e lo dichiara (`baseline-seeded-stale-active`).
7906
+ * The case of the FIRST slice already active is treated explicitly and counts as an
7907
+ * edge only if the UPSTREAM timestamp of the transition is later than
7908
+ * `startedAtMs` **and** within `firstSightingFreshnessMs`. Both halves
7909
+ * are needed: freshness alone would fire on a boot-time hydration of a
7910
+ * state flipped a few seconds before the restart, and "after we started"
7911
+ * alone would fire, on a long-lived process, for a source
7912
+ * adopted today whose state changed yesterday. The ambiguous case ERRS TOWARD
7913
+ * SILENCE and declares it (`baseline-seeded-stale-active`).
7850
7914
  */
7851
7915
  function evaluateSensorEdge(input) {
7852
7916
  const value = sliceActiveValue(input.capName, input.slice);
@@ -9746,22 +9810,22 @@ var CLASS_MAP_MACRO_TARGETS = [
9746
9810
  "package"
9747
9811
  ];
9748
9812
  /**
9749
- * Le macro classi di PRIMO LIVELLO: quelle che un object detector emette e che
9750
- * un operatore può selezionare.
9813
+ * The FIRST-LEVEL macro classes: those an object detector emits and that
9814
+ * an operator can select.
9751
9815
  *
9752
- * Sono le tre offerte dallo step `object-detection`
9816
+ * They are the three offered by the `object-detection` step
9753
9817
  * (`addon-pipeline/src/detection-pipeline/registry/step-definitions.ts`,
9754
- * `enabledMacroClasses`). `package` sta in {@link CLASS_MAP_MACRO_TARGETS} e in
9755
- * `MACRO_LABELS` — è una macro vera — ma NON qui: appartiene allo step
9756
- * `package-detection`, la cui abilitazione è guidata dalle zone, e offrire la
9757
- * stessa parola due volte ha già fatto accendere a un operatore il proxy COCO
9818
+ * `enabledMacroClasses`). `package` is in {@link CLASS_MAP_MACRO_TARGETS} and in
9819
+ * `MACRO_LABELS` — it is a true macro — but NOT here: it belongs to the step
9820
+ * `package-detection`, whose enablement is driven by zones, and offering the
9821
+ * same word twice has already made an operator turn on the COCO proxy
9758
9822
  * (suitcase/backpack/handbag) lasciando spento il detector dedicato.
9759
9823
  *
9760
- * UNA lista. Prima di oggi le stesse tre erano scritte a mano nell'offerta
9761
- * dello step e una seconda volta come union `FirstLevelMacro`
9762
- * (`types/detection.ts`); una terza copia per il trigger di registrazione
9763
- * (`RecordingTriggers.objectClasses`) avrebbe reso invisibile la divergenza
9764
- * successiva.
9824
+ * ONE list. Before today the same three were hand-written in the step's offer
9825
+ * and a second time as the union `FirstLevelMacro`
9826
+ * (`types/detection.ts`); a third copy for the recording trigger
9827
+ * (`RecordingTriggers.objectClasses`) would have made the later divergence
9828
+ * invisible.
9765
9829
  */
9766
9830
  var FIRST_LEVEL_MACRO_CLASSES = [
9767
9831
  "person",
@@ -9826,17 +9890,17 @@ var RecordingStorageModeSchema = _enum([
9826
9890
  "on-device-decision"
9827
9891
  ]);
9828
9892
  /**
9829
- * Le macro classi che possono aprire una finestra di registrazione — le stesse
9830
- * tre offerte dallo step `object-detection`, da UNA lista
9893
+ * The macro classes that can open a recording window — the same
9894
+ * three offered by the `object-detection` step, from ONE list
9831
9895
  * ({@link FIRST_LEVEL_MACRO_CLASSES}).
9832
9896
  */
9833
9897
  var RecordingObjectTriggerClassSchema = _enum(FIRST_LEVEL_MACRO_CLASSES);
9834
9898
  /**
9835
- * True quando `values` non ripete un elemento.
9899
+ * True when `values` does not repeat an element.
9836
9900
  *
9837
- * Un duplicato non è innocuo: ogni voce di `objectClasses` / `sensorDeviceIds`
9838
- * diventa una SORGENTE in `bandTriggerSources`, e la stessa sorgente due volte
9839
- * conterebbe due volte le sue finestre in `segmentMissedByMs`.
9901
+ * A duplicate is not harmless: every entry of `objectClasses` / `sensorDeviceIds`
9902
+ * becomes a SOURCE in `bandTriggerSources`, and the same source twice
9903
+ * would count its windows twice in `segmentMissedByMs`.
9840
9904
  */
9841
9905
  var noDuplicates = (values) => new Set(values).size === values.length;
9842
9906
  /** Which detectors trigger an `events`-mode band. */
@@ -9844,34 +9908,34 @@ var RecordingTriggersSchema = object({
9844
9908
  motion: boolean().optional(),
9845
9909
  audioThresholdDbfs: number().optional(),
9846
9910
  /**
9847
- * Le macro classi la cui detection apre una finestra. ASSENTE = la sorgente
9848
- * non è ascoltata; un array VUOTO è rifiutato, perché "banda events, trigger
9849
- * object acceso, nessuna classe" è la stessa forma "abilitata e non registra
9850
- * nulla, per sempre" contro cui è scritto `eventsBandCanEverDemand`.
9911
+ * The macro classes whose detection opens a window. ABSENT = the source
9912
+ * is not listened to; an EMPTY array is rejected, because "events band, object
9913
+ * trigger on, no class" is the same shape "enabled and records
9914
+ * nothing, forever" that `eventsBandCanEverDemand` is written against.
9851
9915
  *
9852
- * Il segnale letto è GIÀ FILTRATO: solo detection `source: 'pipeline'`, cioè
9853
- * quelle che hanno attraversato `enabledMacroClasses`, i
9854
- * `minConfidence<Macro>` e il full-frame guard. L'AI a bordo camera
9855
- * (`source: 'onboard'`) non attraversa nessuno di quei gate e NON apre
9856
- * finestre — vedi `recorder/object-trigger.ts`.
9916
+ * The signal read is ALREADY FILTERED: only `source: 'pipeline'` detections, i.e.
9917
+ * those that went through `enabledMacroClasses`, the
9918
+ * `minConfidence<Macro>` and the full-frame guard. The camera's onboard AI
9919
+ * (`source: 'onboard'`) goes through none of those gates and does NOT open
9920
+ * windows — see `recorder/object-trigger.ts`.
9857
9921
  */
9858
9922
  objectClasses: array(RecordingObjectTriggerClassSchema).min(1).refine(noDuplicates, { message: "objectClasses must not repeat a class" }).optional(),
9859
9923
  /**
9860
- * I device LINKED il cui FRONTE ALTO apre una finestra. Assente = la sorgente
9861
- * non è ascoltata; un array vuoto è rifiutato per la stessa ragione di
9924
+ * The LINKED devices whose RISING EDGE opens a window. Absent = the source
9925
+ * is not listened to; an empty array is rejected for the same reason as
9862
9926
  * `objectClasses`.
9863
9927
  *
9864
- * Sono id di device SORGENTE, non camere: la banda li nomina, quindi il
9865
- * percorso caldo (`DeviceStateChanged`, a ritmo di bus su tutta la flotta)
9866
- * non fa RPC. L'OFFERTA da cui l'operatore li sceglie è un'altra domanda, e
9867
- * si risolve con `deviceManager.getLinkedDevices` + `getBindingsBatch` per
9868
- * device (D12) — mai un elenco globale di cap.
9928
+ * These are SOURCE device ids, not cameras: the band names them, so the
9929
+ * hot path (`DeviceStateChanged`, at bus rate across the whole fleet)
9930
+ * does no RPC. The OFFER from which the operator picks them is another question, and
9931
+ * is resolved with `deviceManager.getLinkedDevices` + `getBindingsBatch` per
9932
+ * device (D12) — never a global list of caps.
9869
9933
  *
9870
- * Cosa vuol dire "alto" dipende dal TIPO di device e non è deciso qui:
9871
- * `SOURCE_CAP_ACTIVE_FIELD` (`catalogs/sensor-active-state.ts`) è LA tabella,
9872
- * la stessa del campanello composto (D671). Ed è il FRONTE, non
9873
- * il livello: un contatto trovato già aperto al riavvio del runner non fa
9874
- * registrare.
9934
+ * What "high" means depends on the device TYPE and is not decided here:
9935
+ * `SOURCE_CAP_ACTIVE_FIELD` (`catalogs/sensor-active-state.ts`) is THE table,
9936
+ * the same one as the composite doorbell (D671). And it is the EDGE, not
9937
+ * the level: a contact found already open at runner restart does not
9938
+ * record.
9875
9939
  */
9876
9940
  sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional()
9877
9941
  });
@@ -11045,7 +11109,7 @@ var DecoderSessionConfigSchema = object({
11045
11109
  * - **VALUE** — at which level, for which scope, until when. That stays ONE
11046
11110
  * thing: the logging settings document on the `system` cap. Two authorities
11047
11111
  * over the values is the exact defect
11048
- * `docs/design/plans/2026-08-26-logging-per-componente.md` was written to
11112
+ * `docs/design/plans/2026-08-26-per-component-logging.md` was written to
11049
11113
  * remove; re-introducing it from the cure side would be grotesque.
11050
11114
  *
11051
11115
  * Nothing in this file reads a clock, an env var or a store. The registry is
@@ -14768,7 +14832,7 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
14768
14832
  *
14769
14833
  * ⚠ An earlier version of this comment blamed Zod stripping, and that
14770
14834
  * was wrong — corrected 2026-08-26 after the hop map
14771
- * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
14835
+ * (`docs/design/2026-08-26-topic-hop-map.md`) traced the path.
14772
14836
  * There is **no Zod parse at all** between the door and the engine: the
14773
14837
  * dispatcher forwards the payload verbatim and UDS carries it whole. A
14774
14838
  * field declared here reaches `SqliteSettingsBackend` either way.
@@ -16848,7 +16912,7 @@ var embeddingEncoderCapability = {
16848
16912
  * per-device window, `KeyFrameCaptureLog`, `bumpCropMetric`. Every one of them
16849
16913
  * ends in a log line, and a log line is the thing the operator asked to stop
16850
16914
  * needing: *"possiamo armare questi errori intanto? Così al prossimo giro
16851
- * ricontrolliamo tutti questi punti"*. Reading them meant grepping Loki and
16915
+ * 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
16852
16916
  * hand-correlating timestamps, which is how a 22% thumbnail gap and a 3-hour
16853
16917
  * media blackout were both diagnosed. The counters stay; this is where they can
16854
16918
  * be READ.
@@ -20506,6 +20570,19 @@ var NcConfirmSchema = object({
20506
20570
  /** Longest edge the judged image is downscaled to before it is sent. */
20507
20571
  maxImagePx: number().int().min(64).max(2048).default(448)
20508
20572
  });
20573
+ /**
20574
+ * IMMEDIATE GROUPED (D692) — the window bounds. ONE owner; both editors import them.
20575
+ * MIN: below it nothing has time to be promoted, and operator decision 1 (2026-10-01) makes
20576
+ * it the window's floor too — a window never closes earlier, so companions arriving
20577
+ * together share one message.
20578
+ * DEFAULT: equals the tracker's face-settle cap (`FACE_SETTLE_HOLD_MS`, D683 (f)); what an
20579
+ * editor PRE-FILLS, never what absence means (absent = plain immediate).
20580
+ * MAX: equals {@link NC_CLIP_RETENTION_MAX_SEC} — past it a gif/clip is always a recordings cut,
20581
+ * and a lock-screen alert a minute late has lost its purpose.
20582
+ */
20583
+ var NC_GROUPING_MIN_SEC = 5;
20584
+ var NC_GROUPING_DEFAULT_SEC = 20;
20585
+ var NC_GROUPING_MAX_SEC = 60;
20509
20586
  /** Client-supplied rule fields (server stamps id/createdBy/createdAt/updatedAt). */
20510
20587
  var NcRuleInputSchema = object({
20511
20588
  name: string().min(1).max(200),
@@ -20608,78 +20685,16 @@ var NcRuleInputSchema = object({
20608
20685
  */
20609
20686
  confirm: NcConfirmSchema.optional(),
20610
20687
  /**
20611
- * WAIT for face/plate recognition before saying anything.
20612
- *
20613
- * A notification's TEXT is frozen at enqueue and its media is re-resolved at
20614
- * send; the identity is neither. A face is confirmed after `confirmFrames`
20615
- * agreeing observations — p50 **11.4 s** after the track was first seen,
20616
- * measured on this hub — and an `immediate` rule enqueues on the first object
20617
- * event, seconds before that. So "Gianluca è arrivato" is unsayable on the
20618
- * immediate path, and no amount of media re-resolution fixes a sentence.
20619
- *
20620
- * Only two honest answers exist, and this flag picks between them. It has
20621
- * effect ONLY on a rule that declares a recognition scope
20622
- * ({@link NcConditions.identities} or {@link NcConditions.plates}) — on any
20623
- * other rule there is nothing to wait for and the flag is inert.
20624
- *
20625
- * | value | what happens |
20626
- * | --- | --- |
20627
- * | `true` | the rule stops firing on the object event and fires at TRACK CLOSE instead, once, with the name — later, and complete |
20628
- * | 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) |
20629
- *
20630
- * `.optional()` and deliberately NOT `.default()`: a Zod default does not run
20631
- * on the addon cap path, and absent has to keep meaning exactly what every
20632
- * rule authored before this field meant.
20633
- *
20634
- * The cost of `true` is stated here because the editor states it too: a rule
20635
- * that waits also inherits track-close SEMANTICS — its `zones` condition
20636
- * tests every zone the track visited and a `crossing` condition can no longer
20637
- * be satisfied, because a closed track carries no crossing.
20688
+ * IMMEDIATE GROUPED (D692): the first matching subject opens a window of this many
20689
+ * seconds; the rule sends ONE message when the window closes — early, once every
20690
+ * subject in it is final, never before {@link NC_GROUPING_MIN_SEC} — naming everybody
20691
+ * the rule matched, with one mosaic tile per subject.
20692
+ * Absent = plain immediate (one message per track, at the first match).
20693
+ * Only an `immediate` DETECTION rule may carry it (`ruleGroupingApplies`, enforced on
20694
+ * save by the hub's grouping guard). `.optional()`, never `.default()`: the addon cap
20695
+ * path does not run Zod defaults.
20638
20696
  */
20639
- waitForEnhancement: boolean().optional(),
20640
- /**
20641
- * GROUP a burst of subjects into ONE notification that grows.
20642
- *
20643
- * Seconds of quiet after the last matching subject before the burst is
20644
- * considered over. While it is open, the first subject enqueues immediately —
20645
- * **exactly as today, with no added latency** — and every real growth (a new
20646
- * subject, or a name confirmed on one already in it) REPLACES that
20647
- * notification with an updated one naming everybody. The push carries the
20648
- * group's own coalescing tag, so the phone replaces rather than stacks.
20649
- *
20650
- * `0` / absent = off, and off is today's behaviour byte for byte.
20651
- *
20652
- * ### Why an idle cutoff and not a window
20653
- *
20654
- * The measured seven-person arrival on device 590 spans 110 s with every
20655
- * internal gap under 30 s. A 12 s fixed window cuts it into three groups; an
20656
- * idle cutoff holds it as one and ends it when the arrival actually ends.
20657
- * 30 s is a widely shipped value for the same decision.
20658
- *
20659
- * ### What it replaces
20660
- *
20661
- * The blind cooldown, which collapses a burst by DISCARDING it. Measured on
20662
- * device 615 / *Persona su Uscio* over six days: 116 qualifying tracks → 74
20663
- * notifications, **44 (37.9%) suppressed outright**, 23 of them overlapping a
20664
- * track that did fire and 7 carrying a confirmed identity nobody heard about.
20665
- * A group collapses the same volume by MERGING, so the cooldown becomes a
20666
- * budget over GROUPS — which is what it always meant — and a growth is never
20667
- * throttled by the window its own first member spent.
20668
- *
20669
- * ### Interaction with {@link waitForEnhancement}
20670
- *
20671
- * They compose, and the order matters. `waitForEnhancement` defers the rule to
20672
- * TRACK CLOSE, so with both set the group is opened by the first member to
20673
- * CLOSE — already carrying its name — and grows as later members close. That
20674
- * is later, and complete. With grouping alone the group opens on the first
20675
- * object event and picks up names as they are confirmed, through the growth
20676
- * path. Neither combination fires twice for one subject.
20677
- *
20678
- * `.optional()` and deliberately NOT `.default()`: a Zod default does not run
20679
- * on the addon cap path, so absent must keep meaning what it meant before this
20680
- * field existed.
20681
- */
20682
- groupIdleSec: number().int().min(0).max(600).optional()
20697
+ groupingSec: number().int().min(5).max(60).optional()
20683
20698
  });
20684
20699
  /**
20685
20700
  * Partial patch for `updateRule` — any subset of the input fields, plus the
@@ -20721,15 +20736,31 @@ var NcRulePatchSchema = NcRuleInputSchema.partial().extend({
20721
20736
  throttle: NcThrottleSchema.optional(),
20722
20737
  priority: number().int().min(1).max(5).optional()
20723
20738
  });
20739
+ /**
20740
+ * Keys an older client may still name in `clear` (D692 §2.3). Accepted so its saves are never
20741
+ * refused. They are no longer rule fields: `NcRuleStore.update` only strips them from the
20742
+ * STORED row, and `NcRuleStore.load` projects what a stored row still carries (D692 §9).
20743
+ * Removed one release after the viewer pin in camstack-server stops sending them.
20744
+ */
20745
+ var NC_RULE_RETIRED_CLEAR_KEYS = ["waitForEnhancement", "groupIdleSec"];
20746
+ /**
20747
+ * Is this clearable key one of the retired ones? A type guard, so the store can split the
20748
+ * `clear` list WITHOUT a cast: a retired key is no property of `NcRulePatch` or `NcRule`, and
20749
+ * indexing either with it does not compile.
20750
+ */
20751
+ function isRetiredClearKey(key) {
20752
+ return NC_RULE_RETIRED_CLEAR_KEYS.some((retired) => retired === key);
20753
+ }
20724
20754
  var NcRuleClearableKeySchema = _enum([
20725
20755
  "template",
20726
20756
  "schedule",
20727
20757
  "targetUsers",
20728
20758
  "snoozeOptions",
20729
20759
  "snoozeAllowGlobal",
20730
- "waitForEnhancement",
20731
20760
  "actions",
20732
20761
  "confirm",
20762
+ "groupingSec",
20763
+ "waitForEnhancement",
20733
20764
  "groupIdleSec"
20734
20765
  ]);
20735
20766
  var NcRuleUpdateInputSchema = object({
@@ -21281,7 +21312,7 @@ var NC_CONDITION_CATALOG = [
21281
21312
  operator: "in",
21282
21313
  appliesTo: ["immediate", "track-end"],
21283
21314
  phase: "P1",
21284
- description: "Only recognised people. Selecting NOBODY means every identity in the face gallery; selecting some narrows to those. Matched on the gallery id, so renaming a person does not break the rule. On immediate delivery the name is not known yet when the notification is enqueued — see the rule’s \"wait for recognition\" switch."
21315
+ description: "Only recognised people. Selecting NOBODY means every identity in the face gallery; selecting some narrows to those. Matched on the gallery id, so renaming a person does not break the rule. On Immediate delivery the name must already be known when an event is written — choose Immediate, grouped to wait for it (D692)."
21285
21316
  },
21286
21317
  {
21287
21318
  id: "plates",
@@ -23477,14 +23508,14 @@ var TrackSchema = object({
23477
23508
  * `derive-returned-null tile=standin`,
23478
23509
  * `native-tile tile=native no-key-frame-at-close`, …) written at close and
23479
23510
  * CLEARED by the late-keyFrame upgrade when a native tile lands after all.
23480
- * The operator-facing answer to "perché manca l'immagine?" on a track whose
23511
+ * The operator-facing answer to "perché manca l'immagine?" [why is the image missing?] on a track whose
23481
23512
  * tile is a face/plate stand-in, a raster crop, or an icon.
23482
23513
  *
23483
23514
  * **`no-key-frame-at-close` (D400).** The line used to be written ONLY when
23484
23515
  * the TILE ranked below native, so a track whose thumbnail landed natively
23485
23516
  * while its key frame missed carried no reason at all — three of the four
23486
23517
  * `MISSING_KEYFRAME` tracks in the 2026-09-07 operator audit were exactly
23487
- * that shape, and their "niente ultimo" had no cause anywhere on the row.
23518
+ * that shape, and their "niente ultimo" [no last frame] had no cause anywhere on the row.
23488
23519
  * The key frame is the head of a cascade (`keyFrame ⇒ keyFrameSmall ⇒ the
23489
23520
  * lastFrame copy source`), so its absence is now on this line whatever the
23490
23521
  * tile ended up being.
@@ -23571,7 +23602,7 @@ var MotionEventSchema = object({
23571
23602
  /**
23572
23603
  * Ms offsets from `timestamp` (the episode's own first rising edge, so the
23573
23604
  * first entry is always `0`) of every genuine off→on transition the
23574
- * episode saw — "ogni evento on si deve salvare" (D475). NOT one entry per
23605
+ * episode saw — "ogni evento on si deve salvare" [every ON event must be saved] (D475). NOT one entry per
23575
23606
  * push: a firmware source that keepalives at ~1 Hz for the whole burst
23576
23607
  * (Reolink, Hikvision) produces exactly one edge; a source that reports an
23577
23608
  * explicit `false` mid-episode and then resumes before the quiet window
@@ -29628,7 +29659,7 @@ var ClipPlaybackSchema = object({
29628
29659
  * **One authorised yes is one wake.** `next-natural` — take the clip the next
29629
29660
  * time the camera is awake for its own reasons — is deliberately not a member:
29630
29661
  * it was proposed, it is free on the battery, and the operator declined it on
29631
- * 2026-09-20 (*"Quando un export viene richiesto si sveglia la camera."*,
29662
+ * 2026-09-20 (*"Quando un export viene richiesto si sveglia la camera."* [When an export is requested the camera wakes up],
29632
29663
  * D558 "Considered and not taken").
29633
29664
  */
29634
29665
  var ClipWakeSchema = _enum(["authorised"]);
@@ -29889,7 +29920,7 @@ DeviceType.Camera, method(object({
29889
29920
  * It replaced `sources?: string[]`, a VIEW filter over source ids that
29890
29921
  * assumed the answer was a fan-out over everything a camera has. The
29891
29922
  * operator settled otherwise on 2026-09-20 — *"l'utilizzatore è uno
29892
- * solo"* — so the list is asked of one provider at a time and there is
29923
+ * solo"* [there is only one user] — so the list is asked of one provider at a time and there is
29893
29924
  * nothing to filter out of it.
29894
29925
  */
29895
29926
  provider: string().min(1)
@@ -34783,7 +34814,7 @@ authKey: string().optional() }), object({
34783
34814
  */
34784
34815
  /**
34785
34816
  * How long after a camera's last rising edge `pipeline-analytics` closes the
34786
- * motion EPISODE row it kept open for it (D475) — "il delay della cap", in
34817
+ * motion EPISODE row it kept open for it (D475) — "il delay della cap" [the cap's delay], in
34787
34818
  * the operator's words. One authority for the whole system: the writer of a
34788
34819
  * `Camera` device's slice (the orchestrator, D696) writes this SAME constant
34789
34820
  * in `autoClearAfterMs` while `detected: true` (never a camera's own clock —
@@ -38023,7 +38054,7 @@ var ReadGopBytesResultSchema = object({
38023
38054
  /**
38024
38055
  * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
38025
38056
  * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
38026
- * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
38057
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-clip-replay-on-pipeline.md`):
38027
38058
  * a replay needs several seconds of native pixels, not one frame.
38028
38059
  *
38029
38060
  * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
@@ -51096,6 +51127,11 @@ Object.freeze({
51096
51127
  }
51097
51128
  });
51098
51129
  Object.freeze({
51130
+ "accessories.getStatus": [{
51131
+ name: "deviceId",
51132
+ form: "single",
51133
+ optional: false
51134
+ }],
51099
51135
  "accessories.setChildHidden": [{
51100
51136
  name: "childDeviceId",
51101
51137
  form: "single",
@@ -51115,6 +51151,11 @@ Object.freeze({
51115
51151
  form: "single",
51116
51152
  optional: false
51117
51153
  }],
51154
+ "airQualitySensor.getStatus": [{
51155
+ name: "deviceId",
51156
+ form: "single",
51157
+ optional: false
51158
+ }],
51118
51159
  "alarmPanel.arm": [{
51119
51160
  name: "deviceId",
51120
51161
  form: "single",
@@ -51125,11 +51166,36 @@ Object.freeze({
51125
51166
  form: "single",
51126
51167
  optional: false
51127
51168
  }],
51169
+ "alarmPanel.getStatus": [{
51170
+ name: "deviceId",
51171
+ form: "single",
51172
+ optional: false
51173
+ }],
51128
51174
  "alarmPanel.trigger": [{
51129
51175
  name: "deviceId",
51130
51176
  form: "single",
51131
51177
  optional: false
51132
51178
  }],
51179
+ "ambientLightSensor.getStatus": [{
51180
+ name: "deviceId",
51181
+ form: "single",
51182
+ optional: false
51183
+ }],
51184
+ "audioAnalysis.applyDeviceSettingsPatch": [{
51185
+ name: "deviceId",
51186
+ form: "single",
51187
+ optional: false
51188
+ }],
51189
+ "audioAnalysis.getDeviceLiveContribution": [{
51190
+ name: "deviceId",
51191
+ form: "single",
51192
+ optional: false
51193
+ }],
51194
+ "audioAnalysis.getDeviceSettingsContribution": [{
51195
+ name: "deviceId",
51196
+ form: "single",
51197
+ optional: false
51198
+ }],
51133
51199
  "audioAnalysis.resolveDeviceSettings": [{
51134
51200
  name: "deviceId",
51135
51201
  form: "single",
@@ -51170,16 +51236,36 @@ Object.freeze({
51170
51236
  form: "single",
51171
51237
  optional: false
51172
51238
  }],
51239
+ "automationControl.getStatus": [{
51240
+ name: "deviceId",
51241
+ form: "single",
51242
+ optional: false
51243
+ }],
51173
51244
  "automationControl.trigger": [{
51174
51245
  name: "deviceId",
51175
51246
  form: "single",
51176
51247
  optional: false
51177
51248
  }],
51249
+ "battery.getStatus": [{
51250
+ name: "deviceId",
51251
+ form: "single",
51252
+ optional: false
51253
+ }],
51178
51254
  "battery.wakeForStream": [{
51179
51255
  name: "deviceId",
51180
51256
  form: "single",
51181
51257
  optional: false
51182
51258
  }],
51259
+ "binary.getStatus": [{
51260
+ name: "deviceId",
51261
+ form: "single",
51262
+ optional: false
51263
+ }],
51264
+ "brightness.getStatus": [{
51265
+ name: "deviceId",
51266
+ form: "single",
51267
+ optional: false
51268
+ }],
51183
51269
  "brightness.setBrightness": [{
51184
51270
  name: "deviceId",
51185
51271
  form: "single",
@@ -51195,6 +51281,26 @@ Object.freeze({
51195
51281
  form: "single",
51196
51282
  optional: false
51197
51283
  }],
51284
+ "cameraCredentials.getStatus": [{
51285
+ name: "deviceId",
51286
+ form: "single",
51287
+ optional: false
51288
+ }],
51289
+ "cameraGridLayout.applyDeviceSettingsPatch": [{
51290
+ name: "deviceId",
51291
+ form: "single",
51292
+ optional: false
51293
+ }],
51294
+ "cameraGridLayout.getDeviceLiveContribution": [{
51295
+ name: "deviceId",
51296
+ form: "single",
51297
+ optional: false
51298
+ }],
51299
+ "cameraGridLayout.getDeviceSettingsContribution": [{
51300
+ name: "deviceId",
51301
+ form: "single",
51302
+ optional: false
51303
+ }],
51198
51304
  "cameraGridLayout.getLayout": [{
51199
51305
  name: "deviceId",
51200
51306
  form: "single",
@@ -51210,6 +51316,21 @@ Object.freeze({
51210
51316
  form: "single",
51211
51317
  optional: false
51212
51318
  }],
51319
+ "cameraPipelineConfig.applyDeviceSettingsPatch": [{
51320
+ name: "deviceId",
51321
+ form: "single",
51322
+ optional: false
51323
+ }],
51324
+ "cameraPipelineConfig.getDeviceLiveContribution": [{
51325
+ name: "deviceId",
51326
+ form: "single",
51327
+ optional: false
51328
+ }],
51329
+ "cameraPipelineConfig.getDeviceSettingsContribution": [{
51330
+ name: "deviceId",
51331
+ form: "single",
51332
+ optional: false
51333
+ }],
51213
51334
  "cameraStreams.getBrokerStreams": [{
51214
51335
  name: "deviceId",
51215
51336
  form: "single",
@@ -51235,6 +51356,16 @@ Object.freeze({
51235
51356
  form: "single",
51236
51357
  optional: false
51237
51358
  }],
51359
+ "carbonMonoxide.getStatus": [{
51360
+ name: "deviceId",
51361
+ form: "single",
51362
+ optional: false
51363
+ }],
51364
+ "climateControl.getStatus": [{
51365
+ name: "deviceId",
51366
+ form: "single",
51367
+ optional: false
51368
+ }],
51238
51369
  "climateControl.setFanMode": [{
51239
51370
  name: "deviceId",
51240
51371
  form: "single",
@@ -51275,16 +51406,41 @@ Object.freeze({
51275
51406
  form: "single",
51276
51407
  optional: false
51277
51408
  }],
51409
+ "color.getStatus": [{
51410
+ name: "deviceId",
51411
+ form: "single",
51412
+ optional: false
51413
+ }],
51278
51414
  "color.setColor": [{
51279
51415
  name: "deviceId",
51280
51416
  form: "single",
51281
51417
  optional: false
51282
51418
  }],
51419
+ "connectivity.getStatus": [{
51420
+ name: "deviceId",
51421
+ form: "single",
51422
+ optional: false
51423
+ }],
51424
+ "consumables.getStatus": [{
51425
+ name: "deviceId",
51426
+ form: "single",
51427
+ optional: false
51428
+ }],
51283
51429
  "consumables.reset": [{
51284
51430
  name: "deviceId",
51285
51431
  form: "single",
51286
51432
  optional: false
51287
51433
  }],
51434
+ "contact.getStatus": [{
51435
+ name: "deviceId",
51436
+ form: "single",
51437
+ optional: false
51438
+ }],
51439
+ "control.getStatus": [{
51440
+ name: "deviceId",
51441
+ form: "single",
51442
+ optional: false
51443
+ }],
51288
51444
  "control.setValue": [{
51289
51445
  name: "deviceId",
51290
51446
  form: "single",
@@ -51295,6 +51451,11 @@ Object.freeze({
51295
51451
  form: "single",
51296
51452
  optional: false
51297
51453
  }],
51454
+ "cover.getStatus": [{
51455
+ name: "deviceId",
51456
+ form: "single",
51457
+ optional: false
51458
+ }],
51298
51459
  "cover.open": [{
51299
51460
  name: "deviceId",
51300
51461
  form: "single",
@@ -51320,6 +51481,11 @@ Object.freeze({
51320
51481
  form: "single",
51321
51482
  optional: false
51322
51483
  }],
51484
+ "dayNight.getStatus": [{
51485
+ name: "deviceId",
51486
+ form: "single",
51487
+ optional: false
51488
+ }],
51323
51489
  "dayNight.setSettings": [{
51324
51490
  name: "deviceId",
51325
51491
  form: "single",
@@ -51330,11 +51496,31 @@ Object.freeze({
51330
51496
  form: "single",
51331
51497
  optional: true
51332
51498
  }],
51499
+ "detectionPipeline.applyDeviceSettingsPatch": [{
51500
+ name: "deviceId",
51501
+ form: "single",
51502
+ optional: false
51503
+ }],
51504
+ "detectionPipeline.getDeviceLiveContribution": [{
51505
+ name: "deviceId",
51506
+ form: "single",
51507
+ optional: false
51508
+ }],
51509
+ "detectionPipeline.getDeviceSettingsContribution": [{
51510
+ name: "deviceId",
51511
+ form: "single",
51512
+ optional: false
51513
+ }],
51333
51514
  "deviceAdminLink.getAdminLink": [{
51334
51515
  name: "deviceId",
51335
51516
  form: "single",
51336
51517
  optional: false
51337
51518
  }],
51519
+ "deviceAdoption.getStatus": [{
51520
+ name: "deviceId",
51521
+ form: "single",
51522
+ optional: false
51523
+ }],
51338
51524
  "deviceAdoption.release": [{
51339
51525
  name: "camDeviceId",
51340
51526
  form: "single",
@@ -51350,6 +51536,11 @@ Object.freeze({
51350
51536
  form: "single",
51351
51537
  optional: false
51352
51538
  }],
51539
+ "deviceDiscovery.getStatus": [{
51540
+ name: "deviceId",
51541
+ form: "single",
51542
+ optional: false
51543
+ }],
51353
51544
  "deviceDiscovery.listDiscovered": [{
51354
51545
  name: "deviceId",
51355
51546
  form: "single",
@@ -51369,6 +51560,21 @@ Object.freeze({
51369
51560
  form: "single",
51370
51561
  optional: false
51371
51562
  }],
51563
+ "deviceExport.applyDeviceSettingsPatch": [{
51564
+ name: "deviceId",
51565
+ form: "single",
51566
+ optional: false
51567
+ }],
51568
+ "deviceExport.getDeviceLiveContribution": [{
51569
+ name: "deviceId",
51570
+ form: "single",
51571
+ optional: false
51572
+ }],
51573
+ "deviceExport.getDeviceSettingsContribution": [{
51574
+ name: "deviceId",
51575
+ form: "single",
51576
+ optional: false
51577
+ }],
51372
51578
  "deviceExtension.listCandidates": [{
51373
51579
  name: "deviceId",
51374
51580
  form: "single",
@@ -51717,6 +51923,26 @@ Object.freeze({
51717
51923
  form: "single",
51718
51924
  optional: false
51719
51925
  }],
51926
+ "deviceStatus.getStatus": [{
51927
+ name: "deviceId",
51928
+ form: "single",
51929
+ optional: false
51930
+ }],
51931
+ "doorbell.getStatus": [{
51932
+ name: "deviceId",
51933
+ form: "single",
51934
+ optional: false
51935
+ }],
51936
+ "enumSensor.getStatus": [{
51937
+ name: "deviceId",
51938
+ form: "single",
51939
+ optional: false
51940
+ }],
51941
+ "eventEmitter.getStatus": [{
51942
+ name: "deviceId",
51943
+ form: "single",
51944
+ optional: false
51945
+ }],
51720
51946
  "faceGallery.getFaceByTrack": [{
51721
51947
  name: "deviceId",
51722
51948
  form: "single",
@@ -51731,6 +51957,11 @@ Object.freeze({
51731
51957
  form: "array",
51732
51958
  optional: true
51733
51959
  }],
51960
+ "fanControl.getStatus": [{
51961
+ name: "deviceId",
51962
+ form: "single",
51963
+ optional: false
51964
+ }],
51734
51965
  "fanControl.setDirection": [{
51735
51966
  name: "deviceId",
51736
51967
  form: "single",
@@ -51751,6 +51982,26 @@ Object.freeze({
51751
51982
  form: "single",
51752
51983
  optional: false
51753
51984
  }],
51985
+ "featureProbe.getStatus": [{
51986
+ name: "deviceId",
51987
+ form: "single",
51988
+ optional: false
51989
+ }],
51990
+ "flood.getStatus": [{
51991
+ name: "deviceId",
51992
+ form: "single",
51993
+ optional: false
51994
+ }],
51995
+ "gas.getStatus": [{
51996
+ name: "deviceId",
51997
+ form: "single",
51998
+ optional: false
51999
+ }],
52000
+ "humidifier.getStatus": [{
52001
+ name: "deviceId",
52002
+ form: "single",
52003
+ optional: false
52004
+ }],
51754
52005
  "humidifier.setMode": [{
51755
52006
  name: "deviceId",
51756
52007
  form: "single",
@@ -51766,11 +52017,26 @@ Object.freeze({
51766
52017
  form: "single",
51767
52018
  optional: false
51768
52019
  }],
52020
+ "humiditySensor.getStatus": [{
52021
+ name: "deviceId",
52022
+ form: "single",
52023
+ optional: false
52024
+ }],
52025
+ "image.getStatus": [{
52026
+ name: "deviceId",
52027
+ form: "single",
52028
+ optional: false
52029
+ }],
51769
52030
  "imageSettings.getOptions": [{
51770
52031
  name: "deviceId",
51771
52032
  form: "single",
51772
52033
  optional: false
51773
52034
  }],
52035
+ "imageSettings.getStatus": [{
52036
+ name: "deviceId",
52037
+ form: "single",
52038
+ optional: false
52039
+ }],
51774
52040
  "imageSettings.setSettings": [{
51775
52041
  name: "deviceId",
51776
52042
  form: "single",
@@ -51781,6 +52047,11 @@ Object.freeze({
51781
52047
  form: "single",
51782
52048
  optional: false
51783
52049
  }],
52050
+ "intercom.getStatus": [{
52051
+ name: "deviceId",
52052
+ form: "single",
52053
+ optional: false
52054
+ }],
51784
52055
  "intercom.handleAnswer": [{
51785
52056
  name: "deviceId",
51786
52057
  form: "single",
@@ -51811,6 +52082,11 @@ Object.freeze({
51811
52082
  form: "single",
51812
52083
  optional: false
51813
52084
  }],
52085
+ "lawnMowerControl.getStatus": [{
52086
+ name: "deviceId",
52087
+ form: "single",
52088
+ optional: false
52089
+ }],
51814
52090
  "lawnMowerControl.pause": [{
51815
52091
  name: "deviceId",
51816
52092
  form: "single",
@@ -51821,6 +52097,11 @@ Object.freeze({
51821
52097
  form: "single",
51822
52098
  optional: false
51823
52099
  }],
52100
+ "lockControl.getStatus": [{
52101
+ name: "deviceId",
52102
+ form: "single",
52103
+ optional: false
52104
+ }],
51824
52105
  "lockControl.lock": [{
51825
52106
  name: "deviceId",
51826
52107
  form: "single",
@@ -51836,6 +52117,11 @@ Object.freeze({
51836
52117
  form: "single",
51837
52118
  optional: false
51838
52119
  }],
52120
+ "mediaPlayer.getStatus": [{
52121
+ name: "deviceId",
52122
+ form: "single",
52123
+ optional: false
52124
+ }],
51839
52125
  "mediaPlayer.next": [{
51840
52126
  name: "deviceId",
51841
52127
  form: "single",
@@ -51896,6 +52182,11 @@ Object.freeze({
51896
52182
  form: "single",
51897
52183
  optional: false
51898
52184
  }],
52185
+ "motion.getStatus": [{
52186
+ name: "deviceId",
52187
+ form: "single",
52188
+ optional: false
52189
+ }],
51899
52190
  "motion.isDetected": [{
51900
52191
  name: "deviceId",
51901
52192
  form: "single",
@@ -51906,11 +52197,31 @@ Object.freeze({
51906
52197
  form: "single",
51907
52198
  optional: false
51908
52199
  }],
52200
+ "motionDetection.applyDeviceSettingsPatch": [{
52201
+ name: "deviceId",
52202
+ form: "single",
52203
+ optional: false
52204
+ }],
52205
+ "motionDetection.getDeviceLiveContribution": [{
52206
+ name: "deviceId",
52207
+ form: "single",
52208
+ optional: false
52209
+ }],
52210
+ "motionDetection.getDeviceSettingsContribution": [{
52211
+ name: "deviceId",
52212
+ form: "single",
52213
+ optional: false
52214
+ }],
51909
52215
  "motionDetection.removeCamera": [{
51910
52216
  name: "deviceId",
51911
52217
  form: "single",
51912
52218
  optional: false
51913
52219
  }],
52220
+ "motionTrigger.getStatus": [{
52221
+ name: "deviceId",
52222
+ form: "single",
52223
+ optional: false
52224
+ }],
51914
52225
  "motionTrigger.setMotionTrigger": [{
51915
52226
  name: "deviceId",
51916
52227
  form: "single",
@@ -51921,6 +52232,11 @@ Object.freeze({
51921
52232
  form: "single",
51922
52233
  optional: false
51923
52234
  }],
52235
+ "motionZones.getStatus": [{
52236
+ name: "deviceId",
52237
+ form: "single",
52238
+ optional: false
52239
+ }],
51924
52240
  "motionZones.setZone": [{
51925
52241
  name: "deviceId",
51926
52242
  form: "single",
@@ -51931,6 +52247,11 @@ Object.freeze({
51931
52247
  form: "single",
51932
52248
  optional: false
51933
52249
  }],
52250
+ "nativeObjectDetection.getStatus": [{
52251
+ name: "deviceId",
52252
+ form: "single",
52253
+ optional: false
52254
+ }],
51934
52255
  "nativeObjectDetection.setEnabled": [{
51935
52256
  name: "deviceId",
51936
52257
  form: "single",
@@ -51946,6 +52267,11 @@ Object.freeze({
51946
52267
  form: "single",
51947
52268
  optional: false
51948
52269
  }],
52270
+ "navigation.getStatus": [{
52271
+ name: "deviceId",
52272
+ form: "single",
52273
+ optional: false
52274
+ }],
51949
52275
  "navigation.goToPoint": [{
51950
52276
  name: "deviceId",
51951
52277
  form: "single",
@@ -51991,6 +52317,11 @@ Object.freeze({
51991
52317
  form: "single",
51992
52318
  optional: false
51993
52319
  }],
52320
+ "networkLink.getStatus": [{
52321
+ name: "deviceId",
52322
+ form: "single",
52323
+ optional: false
52324
+ }],
51994
52325
  "networkQuality.getDeviceStats": [{
51995
52326
  name: "deviceId",
51996
52327
  form: "single",
@@ -52016,11 +52347,26 @@ Object.freeze({
52016
52347
  form: "single",
52017
52348
  optional: false
52018
52349
  }],
52350
+ "notifier.getStatus": [{
52351
+ name: "deviceId",
52352
+ form: "single",
52353
+ optional: false
52354
+ }],
52019
52355
  "notifier.send": [{
52020
52356
  name: "deviceId",
52021
52357
  form: "single",
52022
52358
  optional: false
52023
52359
  }],
52360
+ "numericSensor.getStatus": [{
52361
+ name: "deviceId",
52362
+ form: "single",
52363
+ optional: false
52364
+ }],
52365
+ "osd.getStatus": [{
52366
+ name: "deviceId",
52367
+ form: "single",
52368
+ optional: false
52369
+ }],
52024
52370
  "osd.setOverlay": [{
52025
52371
  name: "deviceId",
52026
52372
  form: "single",
@@ -52080,6 +52426,11 @@ Object.freeze({
52080
52426
  form: "single",
52081
52427
  optional: false
52082
52428
  }],
52429
+ "petFeeder.getStatus": [{
52430
+ name: "deviceId",
52431
+ form: "single",
52432
+ optional: false
52433
+ }],
52083
52434
  "petFeeder.markFoodReplenished": [{
52084
52435
  name: "deviceId",
52085
52436
  form: "single",
@@ -52115,6 +52466,11 @@ Object.freeze({
52115
52466
  form: "single",
52116
52467
  optional: false
52117
52468
  }],
52469
+ "pipelineAnalytics.applyDeviceSettingsPatch": [{
52470
+ name: "deviceId",
52471
+ form: "single",
52472
+ optional: false
52473
+ }],
52118
52474
  "pipelineAnalytics.clearTrackRelation": [{
52119
52475
  name: "deviceId",
52120
52476
  form: "single",
@@ -52155,6 +52511,16 @@ Object.freeze({
52155
52511
  form: "single",
52156
52512
  optional: false
52157
52513
  }],
52514
+ "pipelineAnalytics.getDeviceLiveContribution": [{
52515
+ name: "deviceId",
52516
+ form: "single",
52517
+ optional: false
52518
+ }],
52519
+ "pipelineAnalytics.getDeviceSettingsContribution": [{
52520
+ name: "deviceId",
52521
+ form: "single",
52522
+ optional: false
52523
+ }],
52158
52524
  "pipelineAnalytics.getEventDensity": [{
52159
52525
  name: "deviceId",
52160
52526
  form: "single",
@@ -52370,6 +52736,11 @@ Object.freeze({
52370
52736
  form: "single",
52371
52737
  optional: true
52372
52738
  }],
52739
+ "pipelineOrchestrator.applyDeviceSettingsPatch": [{
52740
+ name: "deviceId",
52741
+ form: "single",
52742
+ optional: false
52743
+ }],
52373
52744
  "pipelineOrchestrator.assignAudio": [{
52374
52745
  name: "deviceId",
52375
52746
  form: "single",
@@ -52415,6 +52786,16 @@ Object.freeze({
52415
52786
  form: "single",
52416
52787
  optional: false
52417
52788
  }],
52789
+ "pipelineOrchestrator.getDeviceLiveContribution": [{
52790
+ name: "deviceId",
52791
+ form: "single",
52792
+ optional: false
52793
+ }],
52794
+ "pipelineOrchestrator.getDeviceSettingsContribution": [{
52795
+ name: "deviceId",
52796
+ form: "single",
52797
+ optional: false
52798
+ }],
52418
52799
  "pipelineOrchestrator.getPipelineAssignment": [{
52419
52800
  name: "deviceId",
52420
52801
  form: "single",
@@ -52535,11 +52916,31 @@ Object.freeze({
52535
52916
  form: "single",
52536
52917
  optional: true
52537
52918
  }],
52919
+ "powerMeter.getStatus": [{
52920
+ name: "deviceId",
52921
+ form: "single",
52922
+ optional: false
52923
+ }],
52924
+ "presence.getStatus": [{
52925
+ name: "deviceId",
52926
+ form: "single",
52927
+ optional: false
52928
+ }],
52929
+ "pressureSensor.getStatus": [{
52930
+ name: "deviceId",
52931
+ form: "single",
52932
+ optional: false
52933
+ }],
52538
52934
  "privacyMask.getOptions": [{
52539
52935
  name: "deviceId",
52540
52936
  form: "single",
52541
52937
  optional: false
52542
52938
  }],
52939
+ "privacyMask.getStatus": [{
52940
+ name: "deviceId",
52941
+ form: "single",
52942
+ optional: false
52943
+ }],
52543
52944
  "privacyMask.setAudioEnabled": [{
52544
52945
  name: "deviceId",
52545
52946
  form: "single",
@@ -52590,6 +52991,11 @@ Object.freeze({
52590
52991
  form: "single",
52591
52992
  optional: false
52592
52993
  }],
52994
+ "ptz.getStatus": [{
52995
+ name: "deviceId",
52996
+ form: "single",
52997
+ optional: false
52998
+ }],
52593
52999
  "ptz.goHome": [{
52594
53000
  name: "deviceId",
52595
53001
  form: "single",
@@ -52680,6 +53086,11 @@ Object.freeze({
52680
53086
  form: "single",
52681
53087
  optional: false
52682
53088
  }],
53089
+ "recordingArchive.applyDeviceSettingsPatch": [{
53090
+ name: "deviceId",
53091
+ form: "single",
53092
+ optional: false
53093
+ }],
52683
53094
  "recordingArchive.deleteFootprint": [{
52684
53095
  name: "deviceId",
52685
53096
  form: "single",
@@ -52700,6 +53111,21 @@ Object.freeze({
52700
53111
  form: "single",
52701
53112
  optional: false
52702
53113
  }],
53114
+ "recordingArchive.getDeviceLiveContribution": [{
53115
+ name: "deviceId",
53116
+ form: "single",
53117
+ optional: false
53118
+ }],
53119
+ "recordingArchive.getDeviceSettingsContribution": [{
53120
+ name: "deviceId",
53121
+ form: "single",
53122
+ optional: false
53123
+ }],
53124
+ "recordingArchive.getStatus": [{
53125
+ name: "deviceId",
53126
+ form: "single",
53127
+ optional: false
53128
+ }],
52703
53129
  "recordingArchive.listOpsLog": [{
52704
53130
  name: "deviceId",
52705
53131
  form: "single",
@@ -52785,6 +53211,11 @@ Object.freeze({
52785
53211
  form: "single",
52786
53212
  optional: false
52787
53213
  }],
53214
+ "recordingOnboard.getStatus": [{
53215
+ name: "deviceId",
53216
+ form: "single",
53217
+ optional: false
53218
+ }],
52788
53219
  "recordingOnboard.setSettings": [{
52789
53220
  name: "deviceId",
52790
53221
  form: "single",
@@ -52815,6 +53246,11 @@ Object.freeze({
52815
53246
  form: "single",
52816
53247
  optional: false
52817
53248
  }],
53249
+ "sceneMonitor.getStatus": [{
53250
+ name: "deviceId",
53251
+ form: "single",
53252
+ optional: false
53253
+ }],
52818
53254
  "sceneMonitor.listScenes": [{
52819
53255
  name: "deviceId",
52820
53256
  form: "single",
@@ -52840,6 +53276,11 @@ Object.freeze({
52840
53276
  form: "single",
52841
53277
  optional: false
52842
53278
  }],
53279
+ "scriptRunner.getStatus": [{
53280
+ name: "deviceId",
53281
+ form: "single",
53282
+ optional: false
53283
+ }],
52843
53284
  "scriptRunner.run": [{
52844
53285
  name: "deviceId",
52845
53286
  form: "single",
@@ -52850,11 +53291,31 @@ Object.freeze({
52850
53291
  form: "single",
52851
53292
  optional: false
52852
53293
  }],
53294
+ "smoke.getStatus": [{
53295
+ name: "deviceId",
53296
+ form: "single",
53297
+ optional: false
53298
+ }],
53299
+ "snapshot.applyDeviceSettingsPatch": [{
53300
+ name: "deviceId",
53301
+ form: "single",
53302
+ optional: false
53303
+ }],
52853
53304
  "snapshot.getDebugState": [{
52854
53305
  name: "deviceId",
52855
53306
  form: "single",
52856
53307
  optional: false
52857
53308
  }],
53309
+ "snapshot.getDeviceLiveContribution": [{
53310
+ name: "deviceId",
53311
+ form: "single",
53312
+ optional: false
53313
+ }],
53314
+ "snapshot.getDeviceSettingsContribution": [{
53315
+ name: "deviceId",
53316
+ form: "single",
53317
+ optional: false
53318
+ }],
52858
53319
  "snapshot.getSnapshot": [{
52859
53320
  name: "deviceId",
52860
53321
  form: "single",
@@ -52871,6 +53332,11 @@ Object.freeze({
52871
53332
  form: "array",
52872
53333
  optional: false
52873
53334
  }],
53335
+ "snapshot.getStatus": [{
53336
+ name: "deviceId",
53337
+ form: "single",
53338
+ optional: false
53339
+ }],
52874
53340
  "snapshot.invalidateCache": [{
52875
53341
  name: "deviceId",
52876
53342
  form: "single",
@@ -52881,6 +53347,11 @@ Object.freeze({
52881
53347
  form: "single",
52882
53348
  optional: false
52883
53349
  }],
53350
+ "streamBroker.applyDeviceSettingsPatch": [{
53351
+ name: "deviceId",
53352
+ form: "single",
53353
+ optional: false
53354
+ }],
52884
53355
  "streamBroker.assignProfile": [{
52885
53356
  name: "deviceId",
52886
53357
  form: "single",
@@ -52896,6 +53367,16 @@ Object.freeze({
52896
53367
  form: "single",
52897
53368
  optional: false
52898
53369
  }],
53370
+ "streamBroker.getDeviceLiveContribution": [{
53371
+ name: "deviceId",
53372
+ form: "single",
53373
+ optional: false
53374
+ }],
53375
+ "streamBroker.getDeviceSettingsContribution": [{
53376
+ name: "deviceId",
53377
+ form: "single",
53378
+ optional: false
53379
+ }],
52899
53380
  "streamBroker.getStreamWithCodec": [{
52900
53381
  name: "deviceId",
52901
53382
  form: "single",
@@ -52956,16 +53437,46 @@ Object.freeze({
52956
53437
  form: "single",
52957
53438
  optional: false
52958
53439
  }],
53440
+ "streamParams.getStatus": [{
53441
+ name: "deviceId",
53442
+ form: "single",
53443
+ optional: false
53444
+ }],
52959
53445
  "streamParams.setProfile": [{
52960
53446
  name: "deviceId",
52961
53447
  form: "single",
52962
53448
  optional: false
52963
53449
  }],
53450
+ "switch.getStatus": [{
53451
+ name: "deviceId",
53452
+ form: "single",
53453
+ optional: false
53454
+ }],
52964
53455
  "switch.setState": [{
52965
53456
  name: "deviceId",
52966
53457
  form: "single",
52967
53458
  optional: false
52968
53459
  }],
53460
+ "tamper.getStatus": [{
53461
+ name: "deviceId",
53462
+ form: "single",
53463
+ optional: false
53464
+ }],
53465
+ "temperatureSensor.getStatus": [{
53466
+ name: "deviceId",
53467
+ form: "single",
53468
+ optional: false
53469
+ }],
53470
+ "update.getStatus": [{
53471
+ name: "deviceId",
53472
+ form: "single",
53473
+ optional: false
53474
+ }],
53475
+ "vacuumControl.getStatus": [{
53476
+ name: "deviceId",
53477
+ form: "single",
53478
+ optional: false
53479
+ }],
52969
53480
  "vacuumControl.locate": [{
52970
53481
  name: "deviceId",
52971
53482
  form: "single",
@@ -53001,6 +53512,11 @@ Object.freeze({
53001
53512
  form: "single",
53002
53513
  optional: false
53003
53514
  }],
53515
+ "valve.getStatus": [{
53516
+ name: "deviceId",
53517
+ form: "single",
53518
+ optional: false
53519
+ }],
53004
53520
  "valve.open": [{
53005
53521
  name: "deviceId",
53006
53522
  form: "single",
@@ -53016,6 +53532,11 @@ Object.freeze({
53016
53532
  form: "single",
53017
53533
  optional: false
53018
53534
  }],
53535
+ "vibration.getStatus": [{
53536
+ name: "deviceId",
53537
+ form: "single",
53538
+ optional: false
53539
+ }],
53019
53540
  "videoclips.dialClipStream": [{
53020
53541
  name: "deviceId",
53021
53542
  form: "single",
@@ -53051,6 +53572,11 @@ Object.freeze({
53051
53572
  form: "single",
53052
53573
  optional: false
53053
53574
  }],
53575
+ "waterHeater.getStatus": [{
53576
+ name: "deviceId",
53577
+ form: "single",
53578
+ optional: false
53579
+ }],
53054
53580
  "waterHeater.setAway": [{
53055
53581
  name: "deviceId",
53056
53582
  form: "single",
@@ -53066,6 +53592,11 @@ Object.freeze({
53066
53592
  form: "single",
53067
53593
  optional: false
53068
53594
  }],
53595
+ "weather.getStatus": [{
53596
+ name: "deviceId",
53597
+ form: "single",
53598
+ optional: false
53599
+ }],
53069
53600
  "webrtcSession.addIceCandidate": [{
53070
53601
  name: "deviceId",
53071
53602
  form: "single",
@@ -53685,6 +54216,16 @@ function ruleKindOf(rule) {
53685
54216
  return "detection";
53686
54217
  }
53687
54218
  /**
54219
+ * May this rule carry `groupingSec` (D692 §2.2)? Only an `immediate` DETECTION rule: a
54220
+ * track-end rule fires at close and already carries the name; a parcel, a sound (its
54221
+ * `trackId` is a photograph owner, not a subject), a sensor, an occupancy edge and every
54222
+ * system family have no subject to promote and no tile per subject. ONE predicate, read by
54223
+ * both editors and the hub's save guard.
54224
+ */
54225
+ function ruleGroupingApplies(rule) {
54226
+ return rule.delivery === "immediate" && ruleKindOf(rule) === "detection";
54227
+ }
54228
+ /**
53688
54229
  * A system rule's kind: its one family, or `mixed` (D637).
53689
54230
  *
53690
54231
  * Takes the UNTYPED condition for the same reason {@link NcRuleConditionsSubject}
@@ -55132,7 +55673,7 @@ var PreviewTextField = string().max(200);
55132
55673
  * Whether the notification's preview is a STILL or a short animation.
55133
55674
  *
55134
55675
  * The operator's ask, verbatim: *"inviato come gif o video (come per le altre
55135
- * rule)"* — the other rules already offer an animated preview, and a ten-hour
55676
+ * rule)"* [sent as a gif or video (as for the other rules)] — the other rules already offer an animated preview, and a ten-hour
55136
55677
  * night reads better as three seconds of motion than as one frame of it. Both
55137
55678
  * modes get the SAME treatment (blurred frame, large centred title); `'gif'`
55138
55679
  * simply applies it to a dozen frames sampled across the render and assembles
@@ -56306,4 +56847,4 @@ function buildClipModelRegistry(entries) {
56306
56847
  /** The built-in catalog's registry. */
56307
56848
  var BUILTIN_CLIP_MODELS = buildClipModelRegistry(CLIP_IMAGE_MODELS);
56308
56849
  //#endregion
56309
- export { NC_ALARM_SYSTEM_EVENT_KINDS as $, readDeviceStateFrom as $n, union as $r, SetTrackPurityInputSchema as $t, EMBEDDING_REQUIREMENTS_FAILED as A, encodeVectorBase64 as An, CamProfileSchema as Ar, NcSnoozeSuppressedSchema as At, ListTrackRelationsInputSchema as B, isMediaOwnerType as Bn, _enum as Br, RECORDING_SOURCE_CAMSTACK_ADDON as Bt, DEFAULT_EVENT_COLOR as C, describeSystemEventDeliveryProblem as Cn, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as Cr, NcRulePatchSchema as Ct, DeclaredDevices as D, embeddingRefusalOf as Dn, DeviceType as Dr, NcScheduleSchema as Dt, DETECTION_PIPELINE_CAP_NAME as E, embeddingModelFailedError as En, isSourceCap as Er, NcRuleUpdateInputSchema as Et, EXPORT_DENSE_MAX_RANGES as F, gifFromMp4Args as Fn, isDeviceScopedCap as Fr, NcTemplateVarDescriptorSchema as Ft, MAX_BIRTH_LATENCY_PROXY_MS as G, kebabToCamel as Gn, looseObject as Gr, SCENE_DEFAULT_ANCHOR_THRESHOLD as Gt, LockStateSchema as H, isSystemDelivery as Hn, boolean as Hr, RetrainStatusSchema as Ht, FIRST_LEVEL_MACRO_CLASSES as I, isAudioClassName as In, nodePin as Ir, OPS_LOG_DEFAULT_LIMIT as It, MOTION_CLOSE_AFTER_MS as J, notificationRulesCapability as Jn, partialRecord as Jr, SCENE_DEFAULT_QUIET_SECONDS as Jt, MAX_TRACK_PURITIES as K, mayWriteToLocation as Kn, number as Kr, SCENE_DEFAULT_CHECK_INTERVAL_SEC as Kt, FULL_IMAGE_BBOX as L, isDetectionMacroClass as Ln, normalizeNodeId as Lr, OpsLogEntrySchema as Lt, EVENT_DENSITY_BATCH_MAX as M, faceGalleryCapability as Mn, customAction as Mr, NcTaxonomySchema as Mt, EVENT_KIND_BY_CAP as N, failureContributionCapability as Nn, defineCustomActions as Nr, NcTemplatePreviewInputSchema as Nt, DetectionSourceSchema as O, embeddingRequirementsFailedError as On, errMsg as Or, NcSnoozeInputSchema as Ot, EVENT_OWNER_TYPES as P, gifDeriveSpeed as Pn, hydrateSchema as Pr, NcTemplatePreviewSchema as Pt, NC_ALARM_DELAY_MAX_SEC as Q, plateGalleryCapability as Qn, tuple as Qr, SceneMonitorSchema as Qt, FailureCounters as R, isEventOwnerType as Rn, sleep as Rr, PoolMemoryWatchdog as Rt, CoverStateSchema as S, deriveRecordingMode as Sn, zoneAnalyticsCapability as Sr, NcRuleInputSchema as St, DETECTION_MACRO_CLASSES as T, embeddingEncoderCapability as Tn, evaluateSensorEdge as Tr, NcRuleTargetSchema as Tt, MAX_ARCHIVED_DEBUG_NOTES as U, isSystemEventSummaryRule as Un, discriminatedUnion as Ur, SCENE_CONFIRM_DEFAULT_MAX_IMAGE_PX as Ut, ListTrackRelationsResultSchema as V, isScheduleActive as Vn, array as Vr, RebuildObjectEmbeddingsRefusalSchema as Vt, MAX_BIRTH_DECISION_RECORDS as W, isVectorIndexDimConflict as Wn, literal as Wr, SCENE_CONFIRM_DEFAULT_TIMEOUT_MS as Wt, MotionTriggeredBySchema as X, parseProcStatus as Xn, strictObject as Xr, SCENE_DIVERGED as Xt, MediaFileKindEnum as Y, occupancyScope as Yn, record as Yr, SCENE_DEFAULT_UNCOVERED_POLICY as Yt, NC_ALARM_DELAY_FIELDS as Z, pipelineAnalyticsCapability as Zn, string as Zr, SCENE_RESET_RECAPTURES as Zt, BaseDevice as _, audioMetricsCapability as _n, systemEventSummaryScheduleOf as _r, NcAlarmSensorsInputSchema as _t, CLIP_EMBEDDING_STEP_ID as a, TimelapseRulePatchSchema as an, resolvePoolMemoryPolicy as ar, NC_CLIP_RETENTION_MAX_SEC as at, ClearTrackRelationInputSchema as b, consumableLowPercentOf as bn, templateVarsFor as br, NcConditionDescriptorSchema as bt, resolveClusterModelPin as c, TrackRelationKindSchema as cn, ruleKindOf as cr, NC_CONSUMABLE_SYSTEM_EVENT_KINDS as ct, APPEARANCE_RESOLVES_AMBIGUITY_DEFAULT as d, TrackSourceSchema as dn, servedTemplateVars as dr, NC_SNOOZE_MAX_MINUTES as dt, unknown as ei, SetTrackPurityResultSchema as en, readMotionTriggeredBy as er, NC_ALARM_TRIGGERED_MAX_SEC as et, ARCHIVED_DEBUG_NOTES_DEFAULT_LIMIT as f, addonWidgetsSourceCapability as fn, storageOccupancyCapability as fr, NC_SYSTEM_EVENT_KIND_GROUP_SPECS as ft, BIRTH_DECISION_DEFAULT_LIMIT as g, assertTimelapseCadences as gn, systemEventFilterApplies as gr, NcAlarmConfigSchema as gt, ArchivedDebugNoteSchema as h, applyNonBlockingEdit as hn, systemEventFamilyProblems as hr, NC_TEMPLATE_VARS as ht, CLIP_TEXT_MODELS as i, TimelapseRuleInputSchema as in, resolveModeDelays as ir, NC_CLIP_PRE_ROLL_DEFAULT_SEC as it, EMBEDDING_REQUIREMENTS_UNAVAILABLE as j, evictionPolicyOfLocation as jn, createEvent as jr, NcSystemEventKindSchema as jt, EMBEDDING_MODEL_FAILED as k, embeddingRequirementsUnavailableError as kn, BaseAddon as kr, NcSnoozeSchema as kt, APPEARANCE_BIN_COUNT as l, TrackRelationSchema as ln, sceneMonitorCapability as lr, NC_DEFAULT_SNOOZE_MINUTES as lt, AlarmArmModeSchema as m, applyModeDelaysEdits as mn, systemEventDeliveryProblems as mr, NC_TAXONOMY as mt, DEFAULT_CLIP_MODEL as n, TIMELAPSE_DENSE_FLOOR_SEC as nn, resolveClipSearchMinScore as nr, NC_AUDIO_CONFIRM_WINDOW_SEC_DEFAULT as nt, FACE_EMBEDDING_STEP_ID as o, TimelapseRuleSchema as on, ruleBelongsToAlarm as or, NC_CONDITION_CATALOG as ot, AUDIO_MACRO_LABELS as p, alarmPanelCapability as pn, subKindsOf as pr, NC_TANK_SYSTEM_EVENT_KINDS as pt, MAX_TRACK_RELATIONS as q, memoizePinnedFfmpeg as qn, object as qr, SCENE_DEFAULT_OBSERVATION_SPACING_SEC as qt, CLIP_IMAGE_MODELS as r, TRACK_RELATIONS_DEFAULT_LIMIT as rn, resolveLocationMode as rr, NC_CLIP_POST_ROLL_DEFAULT_SEC as rt, readClusterModelPinStrict as s, TrackPuritySchema as sn, ruleDeviceCompatCapQueries as sr, NC_CONSUMABLE_LOW_PERCENT_DEFAULT as st, BUILTIN_CLIP_MODELS as t, EventCategory as ti, SetTrackRelationInputSchema as tn, readTimelapseGeneratedAt as tr, NC_AUDIO_CONFIRM_HITS_DEFAULT as tt, APPEARANCE_BLOCKS as u, TrackSideSchema as un, sensorRaisedOf as ur, NC_SENSOR_TRANSITION_KINDS as ut, BirthDecisionRecordSchema as v, audioModeOf as vn, systemEventSummarySplitOf as vr, NcAlarmSensorsSchema as vt, DEFAULT_TIMELAPSE_PREVIEW_TEXT as w, describeSystemEventFamilyProblem as wn, canonicalHash as wr, NcRuleSchema as wt, ClearTrackRelationResultSchema as x, cosineSimilarity as xn, vectorDimFromBase64 as xr, NcConditionsSchema as xt, COCO_TO_MACRO as y, buildEventKindDescriptor as yn, templateCarriesSummary as yr, NcAlarmSettingsPatchSchema as yt, LabelAttributionSchema as z, isKnownTemplateVar as zn, ZodObject as zr, RECORDING_EXPORT_MAX_READ_BYTES as zt };
56850
+ export { NC_ALARM_SYSTEM_EVENT_KINDS as $, occupancyScope as $n, partialRecord as $r, SCENE_DIVERGED as $t, EMBEDDING_REQUIREMENTS_FAILED as A, embeddingRefusalOf as An, evaluateSensorEdge as Ar, NcScheduleSchema as At, ListTrackRelationsInputSchema as B, isDetectionMacroClass as Bn, isDeviceScopedCap as Br, OpsLogEntrySchema as Bt, DEFAULT_EVENT_COLOR as C, consumableLowPercentOf as Cn, systemEventSummarySplitOf as Cr, NcConditionDescriptorSchema as Ct, DeclaredDevices as D, describeSystemEventFamilyProblem as Dn, zoneAnalyticsCapability as Dr, NcRuleSchema as Dt, DETECTION_PIPELINE_CAP_NAME as E, describeSystemEventDeliveryProblem as En, vectorDimFromBase64 as Er, NcRulePatchSchema as Et, EXPORT_DENSE_MAX_RANGES as F, faceGalleryCapability as Fn, CamProfileSchema as Fr, NcTaxonomySchema as Ft, MAX_BIRTH_LATENCY_PROXY_MS as G, isScheduleActive as Gn, _enum as Gr, RetrainStatusSchema as Gt, LockStateSchema as H, isKnownTemplateVar as Hn, normalizeNodeId as Hr, RECORDING_EXPORT_MAX_READ_BYTES as Ht, FIRST_LEVEL_MACRO_CLASSES as I, failureContributionCapability as In, createEvent as Ir, NcTemplatePreviewInputSchema as It, MOTION_CLOSE_AFTER_MS as J, isVectorIndexDimConflict as Jn, discriminatedUnion as Jr, SCENE_DEFAULT_ANCHOR_THRESHOLD as Jt, MAX_TRACK_PURITIES as K, isSystemDelivery as Kn, array as Kr, SCENE_CONFIRM_DEFAULT_MAX_IMAGE_PX as Kt, FULL_IMAGE_BBOX as L, gifDeriveSpeed as Ln, customAction as Lr, NcTemplatePreviewSchema as Lt, EVENT_DENSITY_BATCH_MAX as M, embeddingRequirementsUnavailableError as Mn, DeviceType as Mr, NcSnoozeSchema as Mt, EVENT_KIND_BY_CAP as N, encodeVectorBase64 as Nn, errMsg as Nr, NcSnoozeSuppressedSchema as Nt, DetectionSourceSchema as O, embeddingEncoderCapability as On, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as Or, NcRuleTargetSchema as Ot, EVENT_OWNER_TYPES as P, evictionPolicyOfLocation as Pn, BaseAddon as Pr, NcSystemEventKindSchema as Pt, NC_ALARM_DELAY_MAX_SEC as Q, notificationRulesCapability as Qn, object as Qr, SCENE_DEFAULT_UNCOVERED_POLICY as Qt, FailureCounters as R, gifFromMp4Args as Rn, defineCustomActions as Rr, NcTemplateVarDescriptorSchema as Rt, CoverStateSchema as S, buildEventKindDescriptor as Sn, systemEventSummaryScheduleOf as Sr, NcAlarmSettingsPatchSchema as St, DETECTION_MACRO_CLASSES as T, deriveRecordingMode as Tn, templateVarsFor as Tr, NcRuleInputSchema as Tt, MAX_ARCHIVED_DEBUG_NOTES as U, isMediaOwnerType as Un, sleep as Ur, RECORDING_SOURCE_CAMSTACK_ADDON as Ut, ListTrackRelationsResultSchema as V, isEventOwnerType as Vn, nodePin as Vr, PoolMemoryWatchdog as Vt, MAX_BIRTH_DECISION_RECORDS as W, isRetiredClearKey as Wn, ZodObject as Wr, RebuildObjectEmbeddingsRefusalSchema as Wt, MotionTriggeredBySchema as X, mayWriteToLocation as Xn, looseObject as Xr, SCENE_DEFAULT_OBSERVATION_SPACING_SEC as Xt, MediaFileKindEnum as Y, kebabToCamel as Yn, literal as Yr, SCENE_DEFAULT_CHECK_INTERVAL_SEC as Yt, NC_ALARM_DELAY_FIELDS as Z, memoizePinnedFfmpeg as Zn, number as Zr, SCENE_DEFAULT_QUIET_SECONDS as Zt, BaseDevice as _, applyModeDelaysEdits as _n, storageOccupancyCapability as _r, NC_TAXONOMY as _t, CLIP_EMBEDDING_STEP_ID as a, union as ai, TIMELAPSE_DENSE_FLOOR_SEC as an, readTimelapseGeneratedAt as ar, NC_CLIP_RETENTION_MAX_SEC as at, ClearTrackRelationInputSchema as b, audioMetricsCapability as bn, systemEventFamilyProblems as br, NcAlarmSensorsInputSchema as bt, resolveClusterModelPin as c, TimelapseRulePatchSchema as cn, resolveModeDelays as cr, NC_CONSUMABLE_SYSTEM_EVENT_KINDS as ct, APPEARANCE_RESOLVES_AMBIGUITY_DEFAULT as d, TrackRelationKindSchema as dn, ruleDeviceCompatCapQueries as dr, NC_GROUPING_MAX_SEC as dt, record as ei, SCENE_RESET_RECAPTURES as en, parseProcStatus as er, NC_ALARM_TRIGGERED_MAX_SEC as et, ARCHIVED_DEBUG_NOTES_DEFAULT_LIMIT as f, TrackRelationSchema as fn, ruleGroupingApplies as fr, NC_GROUPING_MIN_SEC as ft, BIRTH_DECISION_DEFAULT_LIMIT as g, alarmPanelCapability as gn, servedTemplateVars as gr, NC_TANK_SYSTEM_EVENT_KINDS as gt, ArchivedDebugNoteSchema as h, addonWidgetsSourceCapability as hn, sensorRaisedOf as hr, NC_SYSTEM_EVENT_KIND_GROUP_SPECS as ht, CLIP_TEXT_MODELS as i, tuple as ii, SetTrackRelationInputSchema as in, readMotionTriggeredBy as ir, NC_CLIP_PRE_ROLL_DEFAULT_SEC as it, EMBEDDING_REQUIREMENTS_UNAVAILABLE as j, embeddingRequirementsFailedError as jn, isSourceCap as jr, NcSnoozeInputSchema as jt, EMBEDDING_MODEL_FAILED as k, embeddingModelFailedError as kn, canonicalHash as kr, NcRuleUpdateInputSchema as kt, APPEARANCE_BIN_COUNT as l, TimelapseRuleSchema as ln, resolvePoolMemoryPolicy as lr, NC_DEFAULT_SNOOZE_MINUTES as lt, AlarmArmModeSchema as m, TrackSourceSchema as mn, sceneMonitorCapability as mr, NC_SNOOZE_MAX_MINUTES as mt, DEFAULT_CLIP_MODEL as n, string as ni, SetTrackPurityInputSchema as nn, plateGalleryCapability as nr, NC_AUDIO_CONFIRM_WINDOW_SEC_DEFAULT as nt, FACE_EMBEDDING_STEP_ID as o, unknown as oi, TRACK_RELATIONS_DEFAULT_LIMIT as on, resolveClipSearchMinScore as or, NC_CONDITION_CATALOG as ot, AUDIO_MACRO_LABELS as p, TrackSideSchema as pn, ruleKindOf as pr, NC_SENSOR_TRANSITION_KINDS as pt, MAX_TRACK_RELATIONS as q, isSystemEventSummaryRule as qn, boolean as qr, SCENE_CONFIRM_DEFAULT_TIMEOUT_MS as qt, CLIP_IMAGE_MODELS as r, templateLiteral as ri, SetTrackPurityResultSchema as rn, readDeviceStateFrom as rr, NC_CLIP_POST_ROLL_DEFAULT_SEC as rt, readClusterModelPinStrict as s, EventCategory as si, TimelapseRuleInputSchema as sn, resolveLocationMode as sr, NC_CONSUMABLE_LOW_PERCENT_DEFAULT as st, BUILTIN_CLIP_MODELS as t, strictObject as ti, SceneMonitorSchema as tn, pipelineAnalyticsCapability as tr, NC_AUDIO_CONFIRM_HITS_DEFAULT as tt, APPEARANCE_BLOCKS as u, TrackPuritySchema as un, ruleBelongsToAlarm as ur, NC_GROUPING_DEFAULT_SEC as ut, BirthDecisionRecordSchema as v, applyNonBlockingEdit as vn, subKindsOf as vr, NC_TEMPLATE_VARS as vt, DEFAULT_TIMELAPSE_PREVIEW_TEXT as w, cosineSimilarity as wn, templateCarriesSummary as wr, NcConditionsSchema as wt, ClearTrackRelationResultSchema as x, audioModeOf as xn, systemEventFilterApplies as xr, NcAlarmSensorsSchema as xt, COCO_TO_MACRO as y, assertTimelapseCadences as yn, systemEventDeliveryProblems as yr, NcAlarmConfigSchema as yt, LabelAttributionSchema as z, isAudioClassName as zn, hydrateSchema as zr, OPS_LOG_DEFAULT_LIMIT as zt };