@camstack/addon-post-analysis 1.2.293 → 1.2.294

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.
@@ -5370,7 +5370,7 @@ var ZodIssueCode = {
5370
5370
  var ZodFirstPartyTypeKind;
5371
5371
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5372
5372
  //#endregion
5373
- //#region ../types/dist/sleep-jkRQgtSc.mjs
5373
+ //#region ../types/dist/sleep-E6eD4yQS.mjs
5374
5374
  /**
5375
5375
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5376
5376
  * window to float samples (D455).
@@ -6985,6 +6985,10 @@ function toNodeId(idOrRunnerId) {
6985
6985
  const head = idOrRunnerId.split("/")[0];
6986
6986
  return head === void 0 || head.length === 0 ? idOrRunnerId : head;
6987
6987
  }
6988
+ object({
6989
+ field: string().min(1),
6990
+ on: literal("advance")
6991
+ });
6988
6992
  /**
6989
6993
  * Output schema shared by the contribution + live methods.
6990
6994
  *
@@ -7625,7 +7629,7 @@ function errMsg(err) {
7625
7629
  return String(err);
7626
7630
  }
7627
7631
  //#endregion
7628
- //#region ../types/dist/composition-CPFIlFfw.mjs
7632
+ //#region ../types/dist/composition-D5BQywfe.mjs
7629
7633
  /**
7630
7634
  * Deterministic SHA-256 hash of an arbitrary serialisable value. The
7631
7635
  * canonical form sorts object keys alphabetically at every depth so two
@@ -7658,6 +7662,173 @@ function replaceWithSortedKeys(_key, value) {
7658
7662
  return value;
7659
7663
  }
7660
7664
  /**
7665
+ * LA tabella "quale booleano di questo tipo di device conta come ALTO", e il
7666
+ * valutatore puro del suo FRONTE.
7667
+ *
7668
+ * Viveva dentro il builtin virtual-doorbell
7669
+ * (`@camstack/system` — `builtins/doorbell/trigger-engine.ts`) e i suoi
7670
+ * predicati erano privati al modulo. Il recorder ne ha bisogno per il trigger
7671
+ * `RecordingTriggers.sensorDeviceIds`: copiarla avrebbe creato la SECONDA
7672
+ * tabella, che diverge alla prima cap aggiunta e il cui sintomo — "il sensore
7673
+ * fa suonare il campanello ma non registra" — è esattamente D62. Quindi si
7674
+ * SPOSTA qui e il doorbell la ri-esporta.
7675
+ *
7676
+ * ⚠ NON è `DEVICE_STATE_READERS` (`catalogs/device-state-vocabulary.ts`), e le
7677
+ * due non vanno unificate: quella risponde a "qual è la PAROLA di stato per una
7678
+ * regola" (e include `presence`, `cover`, `alarm-panel`), questa a "qual è il
7679
+ * booleano il cui FRONTE conta". Vocabolari deliberatamente diversi.
7680
+ */
7681
+ /**
7682
+ * Known binary / switch source caps → the boolean slice field whose
7683
+ * false→true rise counts as ACTIVE. Every entry is "fire on active".
7684
+ * Sensors whose "active" reading is not a plain boolean (presence's string
7685
+ * state, connectivity's connected flag) are deliberately excluded — a
7686
+ * reconnect is not a doorbell press, and it is not a recording either.
7687
+ */
7688
+ var SOURCE_CAP_ACTIVE_FIELD = {
7689
+ contact: "entryOpen",
7690
+ binary: "on",
7691
+ switch: "on",
7692
+ motion: "detected",
7693
+ flood: "flooded",
7694
+ gas: "detected",
7695
+ smoke: "detected",
7696
+ "carbon-monoxide": "detected",
7697
+ vibration: "detected",
7698
+ tamper: "tampered"
7699
+ };
7700
+ /**
7701
+ * The same caps → the slice field carrying the ms-epoch timestamp of the
7702
+ * last transition. Every source cap MUST appear here (guarded by a spec):
7703
+ * without a transition timestamp the evaluator cannot tell a genuine rise
7704
+ * from a boot-time hydration when the FIRST slice it ever sees is already
7705
+ * active, and errs towards silence — swallowing the rise.
7706
+ *
7707
+ * These timestamps are UPSTREAM ones, not ingest ones: the Home Assistant
7708
+ * provider derives them from `state.last_changed`, so they survive our own
7709
+ * restarts and correctly read as "hours ago" for a state that has been
7710
+ * active for hours. `motion` names its rise timestamp `lastDetectedAt`.
7711
+ */
7712
+ var SOURCE_CAP_CHANGED_AT_FIELD = {
7713
+ contact: "lastChangedAt",
7714
+ binary: "lastChangedAt",
7715
+ switch: "lastChangedAt",
7716
+ motion: "lastDetectedAt",
7717
+ flood: "lastChangedAt",
7718
+ gas: "lastChangedAt",
7719
+ smoke: "lastChangedAt",
7720
+ "carbon-monoxide": "lastChangedAt",
7721
+ vibration: "lastChangedAt",
7722
+ tamper: "lastChangedAt"
7723
+ };
7724
+ /** Cap names whose presence in a device's bindings qualify it as a source. */
7725
+ var SOURCE_CAPS = Object.keys(SOURCE_CAP_ACTIVE_FIELD);
7726
+ /** True when a cap is a recognised binary/switch source. */
7727
+ function isSourceCap(capName) {
7728
+ return Object.prototype.hasOwnProperty.call(SOURCE_CAP_ACTIVE_FIELD, capName);
7729
+ }
7730
+ /** Extract the "active" boolean a source cap's slice carries, or null when
7731
+ * the cap is unknown or the field is missing / non-boolean. */
7732
+ function sliceActiveValue(capName, slice) {
7733
+ const field = SOURCE_CAP_ACTIVE_FIELD[capName];
7734
+ if (field === void 0) return null;
7735
+ const raw = slice[field];
7736
+ return typeof raw === "boolean" ? raw : null;
7737
+ }
7738
+ /** Ms-epoch transition timestamp a source cap's slice carries, or null when
7739
+ * it is absent, non-numeric or the zero "never observed" sentinel. */
7740
+ function sliceChangedAt(capName, slice) {
7741
+ const field = SOURCE_CAP_CHANGED_AT_FIELD[capName];
7742
+ if (field === void 0) return null;
7743
+ const raw = slice[field];
7744
+ if (typeof raw !== "number" || !Number.isFinite(raw) || raw <= 0) return null;
7745
+ return raw;
7746
+ }
7747
+ /**
7748
+ * How recent a source's own transition timestamp must be for a FIRST
7749
+ * sighting that is already active to count as a genuine rise rather than a
7750
+ * hydration of long-standing state.
7751
+ */
7752
+ var DEFAULT_FIRST_SIGHTING_FRESHNESS_MS = 3e4;
7753
+ /**
7754
+ * The source-independent edge rule. The caller supplies an already extracted
7755
+ * boolean level and source timestamp; this function owns first-sighting
7756
+ * freshness and false-to-true detection.
7757
+ */
7758
+ function evaluateSensorLevelEdge(input) {
7759
+ const timestamp = input.changedAt;
7760
+ const freshFloor = Math.max(input.startedAtMs, input.nowMs - input.firstSightingFreshnessMs);
7761
+ const firstRise = input.priorLevel === void 0 && input.level && timestamp !== null && Number.isFinite(timestamp) && timestamp >= freshFloor;
7762
+ const transitionRise = input.priorLevel === false && input.level && timestamp !== null && Number.isFinite(timestamp);
7763
+ if ((firstRise || transitionRise) && timestamp !== null) return {
7764
+ kind: "rise",
7765
+ timestamp
7766
+ };
7767
+ return {
7768
+ kind: "none",
7769
+ nextPriorLevel: input.level
7770
+ };
7771
+ }
7772
+ /**
7773
+ * IL fronte. Puro: nessun orologio proprio, nessuna memoria — il chiamante
7774
+ * porta `prior`, `nowMs` e il proprio `startedAtMs`.
7775
+ *
7776
+ * Il caso della PRIMA slice già attiva è trattato esplicitamente e vale come
7777
+ * fronte solo se il timestamp UPSTREAM della transizione è posteriore a
7778
+ * `startedAtMs` **e** entro `firstSightingFreshnessMs`. Entrambe le metà
7779
+ * servono: la sola freschezza scatterebbe su un'idratazione al boot di uno
7780
+ * stato flippato pochi secondi prima del riavvio, e il solo "dopo che abbiamo
7781
+ * iniziato" scatterebbe, su un processo di lunga vita, per una sorgente
7782
+ * adottata oggi il cui stato è cambiato ieri. Il caso ambiguo ERRA VERSO IL
7783
+ * SILENZIO e lo dichiara (`baseline-seeded-stale-active`).
7784
+ */
7785
+ function evaluateSensorEdge(input) {
7786
+ const value = sliceActiveValue(input.capName, input.slice);
7787
+ if (value === null) return {
7788
+ edge: "none",
7789
+ value: null,
7790
+ reason: isSourceCap(input.capName) ? "non-boolean-value" : "unknown-cap"
7791
+ };
7792
+ if (evaluateSensorLevelEdge({
7793
+ level: value,
7794
+ changedAt: sliceChangedAt(input.capName, input.slice),
7795
+ priorLevel: input.prior,
7796
+ startedAtMs: input.startedAtMs,
7797
+ nowMs: input.nowMs,
7798
+ firstSightingFreshnessMs: input.firstSightingFreshnessMs
7799
+ }).kind === "rise") return {
7800
+ edge: "rising",
7801
+ value: true
7802
+ };
7803
+ if (input.prior === void 0) {
7804
+ if (!value) return {
7805
+ edge: "none",
7806
+ value,
7807
+ reason: "baseline-seeded-inactive"
7808
+ };
7809
+ return {
7810
+ edge: "none",
7811
+ value,
7812
+ reason: "baseline-seeded-stale-active"
7813
+ };
7814
+ }
7815
+ if (input.prior === value) return {
7816
+ edge: "none",
7817
+ value,
7818
+ reason: "no-change"
7819
+ };
7820
+ if (!value) return {
7821
+ edge: "none",
7822
+ value,
7823
+ reason: "falling-edge"
7824
+ };
7825
+ return {
7826
+ edge: "none",
7827
+ value,
7828
+ reason: "missing-timestamp"
7829
+ };
7830
+ }
7831
+ /**
7661
7832
  * Error types for the safe expression engine. Two distinct classes so callers
7662
7833
  * can tell a compile-time (grammar) failure from a runtime (evaluation)
7663
7834
  * failure — both are non-fatal to the host: read paths degrade to "skip link".
@@ -7854,6 +8025,20 @@ var table = {
7854
8025
  const present = args.flatMap((a, i) => a === null ? [] : [asFiniteNumber(a, "latest", i)]);
7855
8026
  return present.length === 0 ? null : finiteResult(Math.max(...present), "latest");
7856
8027
  }
8028
+ },
8029
+ rose: {
8030
+ minArgs: 2,
8031
+ maxArgs: 3,
8032
+ apply: () => {
8033
+ throw new ExpressionEvalError("rose: stateful evaluation context is required");
8034
+ }
8035
+ },
8036
+ count: {
8037
+ minArgs: 1,
8038
+ maxArgs: 1,
8039
+ apply: () => {
8040
+ throw new ExpressionEvalError("count: stateful evaluation context is required");
8041
+ }
7857
8042
  }
7858
8043
  };
7859
8044
  Object.freeze(Object.assign(Object.create(null), table));
@@ -8368,6 +8553,7 @@ var CompositionItemEntrySchema = object({
8368
8553
  var CompositionFeatureSchema = discriminatedUnion("kind", [object({
8369
8554
  kind: literal("fields"),
8370
8555
  cap: string().min(1),
8556
+ enabled: boolean().optional(),
8371
8557
  fields: record(string().min(1), CompositionFieldSourceSchema).refine((fields) => Object.keys(fields).length <= 32, { message: `at most 32 fields per capability` }),
8372
8558
  /**
8373
8559
  * Items of the cap's item array, keyed by item key (D663). Naming `items`
@@ -8379,6 +8565,7 @@ var CompositionFeatureSchema = discriminatedUnion("kind", [object({
8379
8565
  }), object({
8380
8566
  kind: literal("passthrough"),
8381
8567
  cap: string().min(1),
8568
+ enabled: boolean().optional(),
8382
8569
  source: CompositionSourceRefSchema
8383
8570
  })]);
8384
8571
  var CompositionSchema = object({
@@ -13499,6 +13686,15 @@ var cameraStreamsCapability = {
13499
13686
  function kebabToCamel(s) {
13500
13687
  return s.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
13501
13688
  }
13689
+ EventCategory.DoorbellOnPressed;
13690
+ var CompositionEventPlanSchema = object({
13691
+ featureIndex: number().int().nonnegative(),
13692
+ cap: string(),
13693
+ eventName: string(),
13694
+ category: _enum(EventCategory),
13695
+ stateField: string(),
13696
+ fieldKey: string()
13697
+ });
13502
13698
  /** One refusal, named (D391). `path` points into the composition, e.g. `features[0].fields.celsius`. */
13503
13699
  var CompositionProblemSchema = object({
13504
13700
  code: _enum([
@@ -13548,12 +13744,14 @@ var CompositionUnavailableModeSchema = _enum([
13548
13744
  ]);
13549
13745
  /**
13550
13746
  * `derived` reads a source · `clock` reads only `now`, recomputed when a sibling
13551
- * field of its cap changes value · `constant` reads nothing, computed once.
13747
+ * field of its cap changes value · `constant` reads nothing, computed once ·
13748
+ * `accumulator` advances from the target's seed/current output.
13552
13749
  */
13553
13750
  var CompositionFieldRoleSchema = _enum([
13554
13751
  "derived",
13555
13752
  "clock",
13556
- "constant"
13753
+ "constant",
13754
+ "accumulator"
13557
13755
  ]);
13558
13756
  /** The item a planned field belongs to; its `path` is then the dotted path INSIDE the item. */
13559
13757
  var CompositionFieldItemSchema = object({
@@ -13589,6 +13787,7 @@ var CompositionFeatureModeSchema = _enum([
13589
13787
  "replace"
13590
13788
  ]);
13591
13789
  var CompositionFeaturePlanSchema = object({
13790
+ /** Index in the stored feature array; disabled features are omitted rather than re-indexed. */
13592
13791
  featureIndex: number().int().nonnegative(),
13593
13792
  cap: string(),
13594
13793
  mode: CompositionFeatureModeSchema
@@ -13597,7 +13796,8 @@ var CompositionValidationSchema = object({
13597
13796
  ok: boolean(),
13598
13797
  problems: array(CompositionProblemSchema),
13599
13798
  fields: array(CompositionFieldPlanSchema),
13600
- features: array(CompositionFeaturePlanSchema)
13799
+ features: array(CompositionFeaturePlanSchema),
13800
+ events: array(CompositionEventPlanSchema)
13601
13801
  });
13602
13802
  /**
13603
13803
  * Mirrors `CoreBlockStatus`, pinned by `core-blocks-source.spec.ts`. `degraded`:
@@ -28918,148 +29118,6 @@ DeviceType.Camera, method(object({
28918
29118
  auth: "protected"
28919
29119
  });
28920
29120
  /**
28921
- * LA tabella "quale booleano di questo tipo di device conta come ALTO", e il
28922
- * valutatore puro del suo FRONTE.
28923
- *
28924
- * Viveva dentro il builtin virtual-doorbell
28925
- * (`@camstack/system` — `builtins/doorbell/trigger-engine.ts`) e i suoi
28926
- * predicati erano privati al modulo. Il recorder ne ha bisogno per il trigger
28927
- * `RecordingTriggers.sensorDeviceIds`: copiarla avrebbe creato la SECONDA
28928
- * tabella, che diverge alla prima cap aggiunta e il cui sintomo — "il sensore
28929
- * fa suonare il campanello ma non registra" — è esattamente D62. Quindi si
28930
- * SPOSTA qui e il doorbell la ri-esporta.
28931
- *
28932
- * ⚠ NON è `DEVICE_STATE_READERS` (`catalogs/device-state-vocabulary.ts`), e le
28933
- * due non vanno unificate: quella risponde a "qual è la PAROLA di stato per una
28934
- * regola" (e include `presence`, `cover`, `alarm-panel`), questa a "qual è il
28935
- * booleano il cui FRONTE conta". Vocabolari deliberatamente diversi.
28936
- */
28937
- /**
28938
- * Known binary / switch source caps → the boolean slice field whose
28939
- * false→true rise counts as ACTIVE. Every entry is "fire on active".
28940
- * Sensors whose "active" reading is not a plain boolean (presence's string
28941
- * state, connectivity's connected flag) are deliberately excluded — a
28942
- * reconnect is not a doorbell press, and it is not a recording either.
28943
- */
28944
- var SOURCE_CAP_ACTIVE_FIELD = {
28945
- contact: "entryOpen",
28946
- binary: "on",
28947
- switch: "on",
28948
- motion: "detected",
28949
- flood: "flooded",
28950
- gas: "detected",
28951
- smoke: "detected",
28952
- "carbon-monoxide": "detected",
28953
- vibration: "detected",
28954
- tamper: "tampered"
28955
- };
28956
- /**
28957
- * The same caps → the slice field carrying the ms-epoch timestamp of the
28958
- * last transition. Every source cap MUST appear here (guarded by a spec):
28959
- * without a transition timestamp the evaluator cannot tell a genuine rise
28960
- * from a boot-time hydration when the FIRST slice it ever sees is already
28961
- * active, and errs towards silence — swallowing the rise.
28962
- *
28963
- * These timestamps are UPSTREAM ones, not ingest ones: the Home Assistant
28964
- * provider derives them from `state.last_changed`, so they survive our own
28965
- * restarts and correctly read as "hours ago" for a state that has been
28966
- * active for hours. `motion` names its rise timestamp `lastDetectedAt`.
28967
- */
28968
- var SOURCE_CAP_CHANGED_AT_FIELD = {
28969
- contact: "lastChangedAt",
28970
- binary: "lastChangedAt",
28971
- switch: "lastChangedAt",
28972
- motion: "lastDetectedAt",
28973
- flood: "lastChangedAt",
28974
- gas: "lastChangedAt",
28975
- smoke: "lastChangedAt",
28976
- "carbon-monoxide": "lastChangedAt",
28977
- vibration: "lastChangedAt",
28978
- tamper: "lastChangedAt"
28979
- };
28980
- /** Cap names whose presence in a device's bindings qualify it as a source. */
28981
- var SOURCE_CAPS = Object.keys(SOURCE_CAP_ACTIVE_FIELD);
28982
- /** True when a cap is a recognised binary/switch source. */
28983
- function isSourceCap(capName) {
28984
- return Object.prototype.hasOwnProperty.call(SOURCE_CAP_ACTIVE_FIELD, capName);
28985
- }
28986
- /** Extract the "active" boolean a source cap's slice carries, or null when
28987
- * the cap is unknown or the field is missing / non-boolean. */
28988
- function sliceActiveValue(capName, slice) {
28989
- const field = SOURCE_CAP_ACTIVE_FIELD[capName];
28990
- if (field === void 0) return null;
28991
- const raw = slice[field];
28992
- return typeof raw === "boolean" ? raw : null;
28993
- }
28994
- /** Ms-epoch transition timestamp a source cap's slice carries, or null when
28995
- * it is absent, non-numeric or the zero "never observed" sentinel. */
28996
- function sliceChangedAt(capName, slice) {
28997
- const field = SOURCE_CAP_CHANGED_AT_FIELD[capName];
28998
- if (field === void 0) return null;
28999
- const raw = slice[field];
29000
- if (typeof raw !== "number" || !Number.isFinite(raw) || raw <= 0) return null;
29001
- return raw;
29002
- }
29003
- /**
29004
- * How recent a source's own transition timestamp must be for a FIRST
29005
- * sighting that is already active to count as a genuine rise rather than a
29006
- * hydration of long-standing state.
29007
- */
29008
- var DEFAULT_FIRST_SIGHTING_FRESHNESS_MS = 3e4;
29009
- /**
29010
- * IL fronte. Puro: nessun orologio proprio, nessuna memoria — il chiamante
29011
- * porta `prior`, `nowMs` e il proprio `startedAtMs`.
29012
- *
29013
- * Il caso della PRIMA slice già attiva è trattato esplicitamente e vale come
29014
- * fronte solo se il timestamp UPSTREAM della transizione è posteriore a
29015
- * `startedAtMs` **e** entro `firstSightingFreshnessMs`. Entrambe le metà
29016
- * servono: la sola freschezza scatterebbe su un'idratazione al boot di uno
29017
- * stato flippato pochi secondi prima del riavvio, e il solo "dopo che abbiamo
29018
- * iniziato" scatterebbe, su un processo di lunga vita, per una sorgente
29019
- * adottata oggi il cui stato è cambiato ieri. Il caso ambiguo ERRA VERSO IL
29020
- * SILENZIO e lo dichiara (`baseline-seeded-stale-active`).
29021
- */
29022
- function evaluateSensorEdge(input) {
29023
- const value = sliceActiveValue(input.capName, input.slice);
29024
- if (value === null) return {
29025
- edge: "none",
29026
- value: null,
29027
- reason: isSourceCap(input.capName) ? "non-boolean-value" : "unknown-cap"
29028
- };
29029
- if (input.prior === void 0) {
29030
- if (!value) return {
29031
- edge: "none",
29032
- value,
29033
- reason: "baseline-seeded-inactive"
29034
- };
29035
- const changedAt = sliceChangedAt(input.capName, input.slice);
29036
- const floor = Math.max(input.startedAtMs, input.nowMs - input.firstSightingFreshnessMs);
29037
- if (changedAt === null || changedAt < floor) return {
29038
- edge: "none",
29039
- value,
29040
- reason: "baseline-seeded-stale-active"
29041
- };
29042
- return {
29043
- edge: "rising",
29044
- value: true
29045
- };
29046
- }
29047
- if (input.prior === value) return {
29048
- edge: "none",
29049
- value,
29050
- reason: "no-change"
29051
- };
29052
- if (!value) return {
29053
- edge: "none",
29054
- value,
29055
- reason: "falling-edge"
29056
- };
29057
- return {
29058
- edge: "rising",
29059
- value: true
29060
- };
29061
- }
29062
- /**
29063
29121
  * Doorbell button cap. Two kinds of providers coexist behind this cap
29064
29122
  * name (same pattern as `snapshot`):
29065
29123
  *
@@ -29132,7 +29190,13 @@ var doorbellCapability = {
29132
29190
  * push (`ReolinkSimpleEvent.type === 'doorbell'`). There is no
29133
29191
  * release/duration — it's a pulse.
29134
29192
  */
29135
- onPressed: { data: DoorbellPressEventSchema } },
29193
+ onPressed: {
29194
+ data: DoorbellPressEventSchema,
29195
+ fromState: {
29196
+ field: "lastPressedAt",
29197
+ on: "advance"
29198
+ }
29199
+ } },
29136
29200
  status: {
29137
29201
  schema: DoorbellStatusSchema,
29138
29202
  kind: "push"
@@ -37074,12 +37138,21 @@ var RecordingStorageUsageSchema = object({
37074
37138
  */
37075
37139
  devicesRead: _enum(["archive", "unavailable"]).optional(),
37076
37140
  /**
37141
+ * Is the `archive` answer WHOLE (D674): the hour ledger loaded without
37142
+ * hitting its row cap, and at least one location resolved? Only then may a
37143
+ * camera ABSENT from `devices[]` be read as "no footage" — and only then is a
37144
+ * row's `oldestMs` the archive's oldest rather than the oldest of a fraction.
37145
+ * OPTIONAL: a recorder predating D674 omits it, and a consumer must read the
37146
+ * absence as `false`. A retention floor is a delete; it never guesses.
37147
+ */
37148
+ complete: boolean().optional(),
37149
+ /**
37077
37150
  * Per-physical-volume capacity. OPTIONAL, and consumers must render the rest
37078
- * of the payload without it: the hub serves this method through a BAKED
37079
- * router, so a hub whose framework train predates a change to this array
37080
- * strips it out of an answer a newer recorder happily produced. A UI that
37081
- * dereferences it unconditionally crashes the whole Storage page over a
37082
- * missing disk bar.
37151
+ * of the payload without it: a recorder that could not build it omits it. A
37152
+ * UI that dereferences it unconditionally crashes the whole Storage page over
37153
+ * a missing disk bar. (The hub's cap routers pass output through unvalidated
37154
+ * since 2026-07-11 — `cap-router-builder.ts` — so a newer recorder's fields
37155
+ * are not stripped by an older hub.)
37083
37156
  */
37084
37157
  locations: array(RecordingLocationUsageSchema).optional()
37085
37158
  });
@@ -40623,7 +40696,12 @@ Object.freeze({
40623
40696
  number: {
40624
40697
  kind: "fixed",
40625
40698
  result: ["number", "null"]
40626
- }
40699
+ },
40700
+ rose: {
40701
+ kind: "fixed",
40702
+ result: ["number", "null"]
40703
+ },
40704
+ count: NUMBER
40627
40705
  });
40628
40706
  `${COMPOSED_DEVICE_STABLE_ID_PREFIX}`;
40629
40707
  /**
@@ -55148,4 +55226,4 @@ function buildClipModelRegistry(entries) {
55148
55226
  /** The built-in catalog's registry. */
55149
55227
  var BUILTIN_CLIP_MODELS = buildClipModelRegistry(CLIP_IMAGE_MODELS);
55150
55228
  //#endregion
55151
- export { NcRuleSchema as $, EventCategory as $n, isSourceCap as $t, LabelAttributionSchema as A, DeviceType as An, audioMetricsCapability as At, NC_DEFAULT_SNOOZE_MINUTES as B, normalizeNodeId as Bn, embeddingRefusalOf as Bt, EMBEDDING_REQUIREMENTS_FAILED as C, systemEventFilterApplies as Cn, TimelapseRuleInputSchema as Ct, FIRST_LEVEL_MACRO_CLASSES as D, vectorDimFromBase64 as Dn, addonWidgetsSourceCapability as Dt, EVENT_OWNER_TYPES as E, templateVarsFor as En, TrackSourceSchema as Et, MOTION_CLOSE_AFTER_MS as F, customAction as Fn, deriveRecordingMode as Ft, NC_TAXONOMY as G, discriminatedUnion as Gn, evictionPolicyOfLocation as Gt, NC_SNOOZE_MAX_MINUTES as H, _enum as Hn, embeddingRequirementsUnavailableError as Ht, MediaFileKindEnum as I, defineCustomActions as In, describeSystemEventDeliveryProblem as It, NcAlarmSettingsPatchSchema as J, object as Jn, isDetectionMacroClass as Jt, NC_TEMPLATE_VARS as K, literal as Kn, faceGalleryCapability as Kt, NC_ALARM_SYSTEM_EVENT_KINDS as L, hydrateSchema as Ln, describeSystemEventFamilyProblem as Lt, MAX_ARCHIVED_DEBUG_NOTES as M, BaseAddon as Mn, buildEventKindDescriptor as Mt, MAX_BIRTH_DECISION_RECORDS as N, CamProfileSchema as Nn, consumableLowPercentOf as Nt, FULL_IMAGE_BBOX as O, zoneAnalyticsCapability as On, alarmPanelCapability as Ot, MAX_BIRTH_LATENCY_PROXY_MS as P, createEvent as Pn, cosineSimilarity as Pt, NcRulePatchSchema as Q, unknown as Qn, isScheduleActive as Qt, NC_CONDITION_CATALOG as R, isDeviceScopedCap as Rn, embeddingEncoderCapability as Rt, EMBEDDING_MODEL_FAILED as S, systemEventFamilyProblems as Sn, TIMELAPSE_DENSE_FLOOR_SEC as St, EVENT_KIND_BY_CAP as T, templateCarriesSummary as Tn, TimelapseRuleSchema as Tt, NC_SYSTEM_EVENT_KIND_GROUP_SPECS as U, array as Un, encodeVectorBase64 as Ut, NC_SENSOR_TRANSITION_KINDS as V, sleep as Vn, embeddingRequirementsFailedError as Vt, NC_TANK_SYSTEM_EVENT_KINDS as W, boolean as Wn, evaluateSensorEdge as Wt, NcConditionsSchema as X, record as Xn, isKnownTemplateVar as Xt, NcConditionDescriptorSchema as Y, partialRecord as Yn, isEventOwnerType as Yt, NcRuleInputSchema as Z, string as Zn, isMediaOwnerType as Zt, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as _, sensorRaisedOf as _n, SCENE_CONFIRM_DEFAULT_TIMEOUT_MS as _t, CLIP_EMBEDDING_STEP_ID as a, notificationRulesCapability as an, NcSnoozeSuppressedSchema as at, DETECTION_PIPELINE_CAP_NAME as b, subKindsOf as bn, SCENE_DIVERGED as bt, resolveClusterModelPin as c, pipelineAnalyticsCapability as cn, NcTemplatePreviewInputSchema as ct, ArchivedDebugNoteSchema as d, readTimelapseGeneratedAt as dn, OpsLogEntrySchema as dt, isSystemDelivery as en, NcRuleTargetSchema as et, BaseDevice as f, resolveClipSearchMinScore as fn, PoolMemoryWatchdog as ft, DEFAULT_EVENT_COLOR as g, sceneMonitorCapability as gn, RetrainStatusSchema as gt, CoverStateSchema as h, ruleBelongsToAlarm as hn, RebuildObjectEmbeddingsRefusalSchema as ht, CLIP_TEXT_MODELS as i, mayWriteToLocation as in, NcSnoozeSchema as it, LockStateSchema as j, errMsg as jn, audioModeOf as jt, FailureCounters as k, canonicalHash as kn, assertTimelapseCadences as kt, AUDIO_MACRO_LABELS as l, plateGalleryCapability as ln, NcTemplatePreviewSchema as lt, COCO_TO_MACRO as m, resolvePoolMemoryPolicy as mn, RECORDING_SOURCE_CAMSTACK_ADDON as mt, DEFAULT_CLIP_MODEL as n, isVectorIndexDimConflict as nn, NcScheduleSchema as nt, FACE_EMBEDDING_STEP_ID as o, occupancyScope as on, NcSystemEventKindSchema as ot, BirthDecisionRecordSchema as p, resolveLocationMode as pn, RECORDING_EXPORT_MAX_READ_BYTES as pt, NcAlarmConfigSchema as q, number as qn, failureContributionCapability as qt, CLIP_IMAGE_MODELS as r, kebabToCamel as rn, NcSnoozeInputSchema as rt, readClusterModelPinStrict as s, parseProcStatus as sn, NcTaxonomySchema as st, BUILTIN_CLIP_MODELS as t, isSystemEventSummaryRule as tn, NcRuleUpdateInputSchema as tt, AlarmArmModeSchema as u, readDeviceStateFrom as un, NcTemplateVarDescriptorSchema as ut, DEFAULT_TIMELAPSE_PREVIEW_TEXT as v, servedTemplateVars as vn, SCENE_DEFAULT_ANCHOR_THRESHOLD as vt, EMBEDDING_REQUIREMENTS_UNAVAILABLE as w, systemEventSummaryScheduleOf as wn, TimelapseRulePatchSchema as wt, DeclaredDevices as x, systemEventDeliveryProblems as xn, SceneMonitorSchema as xt, DETECTION_MACRO_CLASSES as y, storageOccupancyCapability as yn, SCENE_DEFAULT_UNCOVERED_POLICY as yt, NC_CONSUMABLE_SYSTEM_EVENT_KINDS as z, nodePin as zn, embeddingModelFailedError as zt };
55229
+ export { NcRuleTargetSchema as $, EventCategory as $n, isVectorIndexDimConflict as $t, LockStateSchema as A, DeviceType as An, audioModeOf as At, NC_SENSOR_TRANSITION_KINDS as B, normalizeNodeId as Bn, embeddingRequirementsFailedError as Bt, EMBEDDING_REQUIREMENTS_UNAVAILABLE as C, templateVarsFor as Cn, TimelapseRulePatchSchema as Ct, FULL_IMAGE_BBOX as D, canonicalHash as Dn, alarmPanelCapability as Dt, FIRST_LEVEL_MACRO_CLASSES as E, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as En, addonWidgetsSourceCapability as Et, MediaFileKindEnum as F, customAction as Fn, describeSystemEventDeliveryProblem as Ft, NC_TEMPLATE_VARS as G, discriminatedUnion as Gn, failureContributionCapability as Gt, NC_SYSTEM_EVENT_KIND_GROUP_SPECS as H, _enum as Hn, encodeVectorBase64 as Ht, NC_ALARM_SYSTEM_EVENT_KINDS as I, defineCustomActions as In, describeSystemEventFamilyProblem as It, NcConditionDescriptorSchema as J, object as Jn, isKnownTemplateVar as Jt, NcAlarmConfigSchema as K, literal as Kn, isDetectionMacroClass as Kt, NC_CONDITION_CATALOG as L, hydrateSchema as Ln, embeddingEncoderCapability as Lt, MAX_BIRTH_DECISION_RECORDS as M, BaseAddon as Mn, consumableLowPercentOf as Mt, MAX_BIRTH_LATENCY_PROXY_MS as N, CamProfileSchema as Nn, cosineSimilarity as Nt, FailureCounters as O, evaluateSensorEdge as On, assertTimelapseCadences as Ot, MOTION_CLOSE_AFTER_MS as P, createEvent as Pn, deriveRecordingMode as Pt, NcRuleSchema as Q, unknown as Qn, isSystemEventSummaryRule as Qt, NC_CONSUMABLE_SYSTEM_EVENT_KINDS as R, isDeviceScopedCap as Rn, embeddingModelFailedError as Rt, EMBEDDING_REQUIREMENTS_FAILED as S, templateCarriesSummary as Sn, TimelapseRuleInputSchema as St, EVENT_OWNER_TYPES as T, zoneAnalyticsCapability as Tn, TrackSourceSchema as Tt, NC_TANK_SYSTEM_EVENT_KINDS as U, array as Un, evictionPolicyOfLocation as Ut, NC_SNOOZE_MAX_MINUTES as V, sleep as Vn, embeddingRequirementsUnavailableError as Vt, NC_TAXONOMY as W, boolean as Wn, faceGalleryCapability as Wt, NcRuleInputSchema as X, record as Xn, isScheduleActive as Xt, NcConditionsSchema as Y, partialRecord as Yn, isMediaOwnerType as Yt, NcRulePatchSchema as Z, string as Zn, isSystemDelivery as Zt, DEFAULT_TIMELAPSE_PREVIEW_TEXT as _, subKindsOf as _n, SCENE_DEFAULT_ANCHOR_THRESHOLD as _t, CLIP_EMBEDDING_STEP_ID as a, pipelineAnalyticsCapability as an, NcSystemEventKindSchema as at, DeclaredDevices as b, systemEventFilterApplies as bn, SceneMonitorSchema as bt, resolveClusterModelPin as c, readTimelapseGeneratedAt as cn, NcTemplatePreviewSchema as ct, ArchivedDebugNoteSchema as d, resolvePoolMemoryPolicy as dn, PoolMemoryWatchdog as dt, kebabToCamel as en, NcRuleUpdateInputSchema as et, BaseDevice as f, ruleBelongsToAlarm as fn, RECORDING_EXPORT_MAX_READ_BYTES as ft, DEFAULT_EVENT_COLOR as g, storageOccupancyCapability as gn, SCENE_CONFIRM_DEFAULT_TIMEOUT_MS as gt, CoverStateSchema as h, servedTemplateVars as hn, RetrainStatusSchema as ht, CLIP_TEXT_MODELS as i, parseProcStatus as in, NcSnoozeSuppressedSchema as it, MAX_ARCHIVED_DEBUG_NOTES as j, errMsg as jn, buildEventKindDescriptor as jt, LabelAttributionSchema as k, isSourceCap as kn, audioMetricsCapability as kt, AUDIO_MACRO_LABELS as l, resolveClipSearchMinScore as ln, NcTemplateVarDescriptorSchema as lt, COCO_TO_MACRO as m, sensorRaisedOf as mn, RebuildObjectEmbeddingsRefusalSchema as mt, DEFAULT_CLIP_MODEL as n, notificationRulesCapability as nn, NcSnoozeInputSchema as nt, FACE_EMBEDDING_STEP_ID as o, plateGalleryCapability as on, NcTaxonomySchema as ot, BirthDecisionRecordSchema as p, sceneMonitorCapability as pn, RECORDING_SOURCE_CAMSTACK_ADDON as pt, NcAlarmSettingsPatchSchema as q, number as qn, isEventOwnerType as qt, CLIP_IMAGE_MODELS as r, occupancyScope as rn, NcSnoozeSchema as rt, readClusterModelPinStrict as s, readDeviceStateFrom as sn, NcTemplatePreviewInputSchema as st, BUILTIN_CLIP_MODELS as t, mayWriteToLocation as tn, NcScheduleSchema as tt, AlarmArmModeSchema as u, resolveLocationMode as un, OpsLogEntrySchema as ut, DETECTION_MACRO_CLASSES as v, systemEventDeliveryProblems as vn, SCENE_DEFAULT_UNCOVERED_POLICY as vt, EVENT_KIND_BY_CAP as w, vectorDimFromBase64 as wn, TimelapseRuleSchema as wt, EMBEDDING_MODEL_FAILED as x, systemEventSummaryScheduleOf as xn, TIMELAPSE_DENSE_FLOOR_SEC as xt, DETECTION_PIPELINE_CAP_NAME as y, systemEventFamilyProblems as yn, SCENE_DIVERGED as yt, NC_DEFAULT_SNOOZE_MINUTES as z, nodePin as zn, embeddingRefusalOf as zt };
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_clip_model_registry = require("../clip-model-registry-BAuTHS_s.js");
5
+ const require_clip_model_registry = require("../clip-model-registry-BVhju940.js");
6
6
  let node_fs = require("node:fs");
7
7
  node_fs = require_clip_model_registry.__toESM(node_fs);
8
8
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { Bn as normalizeNodeId, Ht as embeddingRequirementsUnavailableError, Mn as BaseAddon, Rt as embeddingEncoderCapability, Vt as embeddingRequirementsFailedError, a as CLIP_EMBEDDING_STEP_ID, c as resolveClusterModelPin, ft as PoolMemoryWatchdog, i as CLIP_TEXT_MODELS, mn as resolvePoolMemoryPolicy, n as DEFAULT_CLIP_MODEL, r as CLIP_IMAGE_MODELS, sn as parseProcStatus, t as BUILTIN_CLIP_MODELS, zt as embeddingModelFailedError } from "../clip-model-registry-D2zqXamW.mjs";
1
+ import { Bn as normalizeNodeId, Bt as embeddingRequirementsFailedError, Lt as embeddingEncoderCapability, Mn as BaseAddon, Rt as embeddingModelFailedError, Vt as embeddingRequirementsUnavailableError, a as CLIP_EMBEDDING_STEP_ID, c as resolveClusterModelPin, dn as resolvePoolMemoryPolicy, dt as PoolMemoryWatchdog, i as CLIP_TEXT_MODELS, in as parseProcStatus, n as DEFAULT_CLIP_MODEL, r as CLIP_IMAGE_MODELS, t as BUILTIN_CLIP_MODELS } from "../clip-model-registry-Bz5BzfjI.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import * as fs from "node:fs";
4
4
  import * as path$1 from "node:path";
@@ -2,7 +2,7 @@ import { a as e, i as t, n, o as r, r as i, t as a } from "./_virtual_mf___mfe_i
2
2
  import { t as o } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-B3Wx5J80.mjs";
3
3
  import { a as s, i as c, n as l, o as u, r as d, s as f, t as p } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-Bs5QFgmh.mjs";
4
4
  import { n as m, r as h, t as g } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-Bm-iyjmq.mjs";
5
- import { t as _ } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-Boh18P08.mjs";
5
+ import { t as _ } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-T_INdcV8.mjs";
6
6
  //#region ../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
7
7
  var v = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim(), y = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), b = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), x = (e) => {
8
8
  let t = b(e);
@@ -18,7 +18,7 @@ var e = {
18
18
  },
19
19
  "@camstack/types": {
20
20
  name: "@camstack/types",
21
- version: "1.2.268",
21
+ version: "1.2.270",
22
22
  scope: ["default"],
23
23
  loaded: !1,
24
24
  from: "addon_pipeline_analytics_widgets",