@camstack/addon-provider-vesync 0.2.21 → 0.2.23

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.
package/dist/addon.js CHANGED
@@ -20222,6 +20222,14 @@ var ClipSchema = object({
20222
20222
  endMs: number()
20223
20223
  }),
20224
20224
  /**
20225
+ * Distinct object classes attached to this visit (`person`, `car`, …),
20226
+ * dominant first, capped at {@link MAX_CLIP_LABELS}. The ribbon renders these
20227
+ * instead of the bare kind — "Object" tells the operator nothing a colour bar
20228
+ * did not. Absent (never empty) when the visit attached no classified object
20229
+ * event, so a motion/audio-only visit keeps its kind label.
20230
+ */
20231
+ labels: array(string()).max(3).optional(),
20232
+ /**
20225
20233
  * Lazy thumbnail URL, never inlined.
20226
20234
  *
20227
20235
  * Recording-derived clips (events-mode keep-window, and the prepared
@@ -26244,9 +26252,21 @@ var RecordingLocationUsageSchema = object({
26244
26252
  * previously rendered as two identical "disks" with a nonsensical used
26245
26253
  * split — hydrate attribution across aliases is arbitrary by nature. */
26246
26254
  locationIds: array(string()).optional(),
26247
- /** Bytes of recordings stored on this PHYSICAL volume (all aliases). */
26255
+ /**
26256
+ * Filesystem root of the physical volume this row accounts — the only
26257
+ * operator-legible identity when a location has no `displayName` yet, and
26258
+ * what a "which disk is full" alert has to name. OPTIONAL for the same
26259
+ * train-skew reason as `oldestMs`: a recorder that predates the field omits
26260
+ * it, and this schema must keep validating that older provider's payload.
26261
+ */
26262
+ root: string().optional(),
26263
+ /** Bytes of recordings stored on this PHYSICAL volume (all aliases). This is
26264
+ * the footage's SHARE of the volume, not how full the volume is — the disk
26265
+ * also holds everything that is not recordings. Volume fill is
26266
+ * `(totalBytes - availableBytes) / totalBytes`. */
26248
26267
  usedBytes: number(),
26249
- /** Free bytes on the location's volume; null when capacity is unknown (remote). */
26268
+ /** Free bytes on the location's volume; null when capacity is unknown
26269
+ * (remote/unstattable — the recorder logs the statfs failure with the root). */
26250
26270
  availableBytes: number().nullable(),
26251
26271
  /** Total bytes of the location's volume; null when unknown. */
26252
26272
  totalBytes: number().nullable()
@@ -26258,7 +26278,15 @@ var RecordingStorageUsageSchema = object({
26258
26278
  nodeId: string(),
26259
26279
  totalUsedBytes: number(),
26260
26280
  devices: array(RecordingDeviceUsageSchema),
26261
- locations: array(RecordingLocationUsageSchema)
26281
+ /**
26282
+ * Per-physical-volume capacity. OPTIONAL, and consumers must render the rest
26283
+ * of the payload without it: the hub serves this method through a BAKED
26284
+ * router, so a hub whose framework train predates a change to this array
26285
+ * strips it out of an answer a newer recorder happily produced. A UI that
26286
+ * dereferences it unconditionally crashes the whole Storage page over a
26287
+ * missing disk bar.
26288
+ */
26289
+ locations: array(RecordingLocationUsageSchema).optional()
26262
26290
  });
26263
26291
  /**
26264
26292
  * The OPERATOR-ARMED half of multi-location recordings (D116).
@@ -37043,8 +37071,14 @@ Object.freeze({
37043
37071
  "network-access": "ingress",
37044
37072
  "smtp-provider": "email"
37045
37073
  });
37074
+ /** Schema defaults — an untouched sub-field must author exactly these. */
37075
+ var NC_AUDIO_DEFAULTS = {
37076
+ hitPercent: 60,
37077
+ samplingSeconds: 10
37078
+ };
37046
37079
  new Map(AUDIO_MACRO_LABELS.flatMap((macro) => macro.icon === void 0 ? [] : [[macro.id, macro.icon]]));
37047
37080
  new Set(["devices", "classes"]);
37081
+ NC_AUDIO_DEFAULTS.hitPercent, NC_AUDIO_DEFAULTS.samplingSeconds;
37048
37082
  /**
37049
37083
  * TimelapseRule — the STANDALONE scheduled timelapse producer's rule model.
37050
37084
  *
package/dist/addon.mjs CHANGED
@@ -20221,6 +20221,14 @@ var ClipSchema = object({
20221
20221
  endMs: number()
20222
20222
  }),
20223
20223
  /**
20224
+ * Distinct object classes attached to this visit (`person`, `car`, …),
20225
+ * dominant first, capped at {@link MAX_CLIP_LABELS}. The ribbon renders these
20226
+ * instead of the bare kind — "Object" tells the operator nothing a colour bar
20227
+ * did not. Absent (never empty) when the visit attached no classified object
20228
+ * event, so a motion/audio-only visit keeps its kind label.
20229
+ */
20230
+ labels: array(string()).max(3).optional(),
20231
+ /**
20224
20232
  * Lazy thumbnail URL, never inlined.
20225
20233
  *
20226
20234
  * Recording-derived clips (events-mode keep-window, and the prepared
@@ -26243,9 +26251,21 @@ var RecordingLocationUsageSchema = object({
26243
26251
  * previously rendered as two identical "disks" with a nonsensical used
26244
26252
  * split — hydrate attribution across aliases is arbitrary by nature. */
26245
26253
  locationIds: array(string()).optional(),
26246
- /** Bytes of recordings stored on this PHYSICAL volume (all aliases). */
26254
+ /**
26255
+ * Filesystem root of the physical volume this row accounts — the only
26256
+ * operator-legible identity when a location has no `displayName` yet, and
26257
+ * what a "which disk is full" alert has to name. OPTIONAL for the same
26258
+ * train-skew reason as `oldestMs`: a recorder that predates the field omits
26259
+ * it, and this schema must keep validating that older provider's payload.
26260
+ */
26261
+ root: string().optional(),
26262
+ /** Bytes of recordings stored on this PHYSICAL volume (all aliases). This is
26263
+ * the footage's SHARE of the volume, not how full the volume is — the disk
26264
+ * also holds everything that is not recordings. Volume fill is
26265
+ * `(totalBytes - availableBytes) / totalBytes`. */
26247
26266
  usedBytes: number(),
26248
- /** Free bytes on the location's volume; null when capacity is unknown (remote). */
26267
+ /** Free bytes on the location's volume; null when capacity is unknown
26268
+ * (remote/unstattable — the recorder logs the statfs failure with the root). */
26249
26269
  availableBytes: number().nullable(),
26250
26270
  /** Total bytes of the location's volume; null when unknown. */
26251
26271
  totalBytes: number().nullable()
@@ -26257,7 +26277,15 @@ var RecordingStorageUsageSchema = object({
26257
26277
  nodeId: string(),
26258
26278
  totalUsedBytes: number(),
26259
26279
  devices: array(RecordingDeviceUsageSchema),
26260
- locations: array(RecordingLocationUsageSchema)
26280
+ /**
26281
+ * Per-physical-volume capacity. OPTIONAL, and consumers must render the rest
26282
+ * of the payload without it: the hub serves this method through a BAKED
26283
+ * router, so a hub whose framework train predates a change to this array
26284
+ * strips it out of an answer a newer recorder happily produced. A UI that
26285
+ * dereferences it unconditionally crashes the whole Storage page over a
26286
+ * missing disk bar.
26287
+ */
26288
+ locations: array(RecordingLocationUsageSchema).optional()
26261
26289
  });
26262
26290
  /**
26263
26291
  * The OPERATOR-ARMED half of multi-location recordings (D116).
@@ -37042,8 +37070,14 @@ Object.freeze({
37042
37070
  "network-access": "ingress",
37043
37071
  "smtp-provider": "email"
37044
37072
  });
37073
+ /** Schema defaults — an untouched sub-field must author exactly these. */
37074
+ var NC_AUDIO_DEFAULTS = {
37075
+ hitPercent: 60,
37076
+ samplingSeconds: 10
37077
+ };
37045
37078
  new Map(AUDIO_MACRO_LABELS.flatMap((macro) => macro.icon === void 0 ? [] : [[macro.id, macro.icon]]));
37046
37079
  new Set(["devices", "classes"]);
37080
+ NC_AUDIO_DEFAULTS.hitPercent, NC_AUDIO_DEFAULTS.samplingSeconds;
37047
37081
  /**
37048
37082
  * TimelapseRule — the STANDALONE scheduled timelapse producer's rule model.
37049
37083
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-vesync",
3
- "version": "0.2.21",
3
+ "version": "0.2.23",
4
4
  "description": "VeSync cloud-account device-provider addon for CamStack — Levoit / Cosori air purifiers as Fan devices (power, speed, preset, child-lock, display, air-quality + filter-life sensors)",
5
5
  "keywords": [
6
6
  "camstack",