@camstack/addon-notifiers 1.2.96 → 1.2.97

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
@@ -19735,7 +19735,17 @@ var EventDensityBucketSchema = object({
19735
19735
  bucketStart: number(),
19736
19736
  motion: number().int(),
19737
19737
  object: number().int(),
19738
- audio: number().int()
19738
+ audio: number().int(),
19739
+ /**
19740
+ * Energy-weighted mean dBFS of the audio events in this bucket — the LEVEL,
19741
+ * as opposed to `audio`, which is their COUNT (D431).
19742
+ *
19743
+ * ABSENT when the bucket holds no audio event. Absence means "nothing was
19744
+ * measured", which is not the same claim as silence, and a lane that cannot
19745
+ * tell them apart paints a quiet hour at full scale — which is exactly what
19746
+ * the count-on-a-level-meter did.
19747
+ */
19748
+ audioDbfs: number().optional()
19739
19749
  });
19740
19750
  /**
19741
19751
  * One camera's row in a `getEventDensityBatch` answer.
@@ -27902,7 +27912,23 @@ var RecordingRangeSchema = object({
27902
27912
  });
27903
27913
  var RecordingAvailabilitySchema = object({
27904
27914
  deviceId: number(),
27905
- ranges: array(RecordingRangeSchema)
27915
+ ranges: array(RecordingRangeSchema),
27916
+ /**
27917
+ * Every profile this camera has footage in — not only the one `ranges`
27918
+ * describes (D433).
27919
+ *
27920
+ * `ranges` answers for ONE profile by design: the timeline is a single bar,
27921
+ * and enumerating all of them triples the directory reads for a bar that
27922
+ * would look identical. But the answer used to say nothing about that, so a
27923
+ * caller asking "what can I export?" read the single preferred profile as
27924
+ * the only one that exists — on this deployment every camera records `high`
27925
+ * AND `low`, the low tree holding 14 GB for camera 615 alone, and the export
27926
+ * UI could not see it.
27927
+ *
27928
+ * Cheap: it is the same shallow directory read the profile CHOICE already
27929
+ * makes. Ask for a specific profile's ranges with the `profile` input.
27930
+ */
27931
+ profilesWithFootage: array(string())
27906
27932
  });
27907
27933
  var RecordingDaysSchema = object({
27908
27934
  deviceId: number(),
@@ -27928,7 +27954,11 @@ var RecordingDaysSchema = object({
27928
27954
  var RecordingAvailabilityForDeviceSchema = object({
27929
27955
  deviceId: number(),
27930
27956
  read: _enum(["read", "unreadable"]),
27931
- ranges: array(RecordingRangeSchema).readonly()
27957
+ ranges: array(RecordingRangeSchema).readonly(),
27958
+ /** Same field, same meaning, as the singular answer (D433). A row that
27959
+ * dropped it would tell a grid caller the archive holds one profile.
27960
+ * Empty on an `'unreadable'` row: nobody looked. */
27961
+ profilesWithFootage: array(string()).readonly()
27932
27962
  });
27933
27963
  /**
27934
27964
  * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
@@ -28218,7 +28248,14 @@ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
28218
28248
  method(object({
28219
28249
  deviceId: number(),
28220
28250
  fromMs: number(),
28221
- toMs: number()
28251
+ toMs: number(),
28252
+ /**
28253
+ * Answer for THIS profile instead of the preferred one (D433). Absent
28254
+ * keeps the timeline's behaviour — one bar, one profile, one set of
28255
+ * reads. `profilesWithFootage` on the answer says what may be asked
28256
+ * for.
28257
+ */
28258
+ profile: string().optional()
28222
28259
  }), RecordingAvailabilitySchema, {
28223
28260
  kind: "query",
28224
28261
  auth: "protected"
package/dist/addon.mjs CHANGED
@@ -19708,7 +19708,17 @@ var EventDensityBucketSchema = object({
19708
19708
  bucketStart: number(),
19709
19709
  motion: number().int(),
19710
19710
  object: number().int(),
19711
- audio: number().int()
19711
+ audio: number().int(),
19712
+ /**
19713
+ * Energy-weighted mean dBFS of the audio events in this bucket — the LEVEL,
19714
+ * as opposed to `audio`, which is their COUNT (D431).
19715
+ *
19716
+ * ABSENT when the bucket holds no audio event. Absence means "nothing was
19717
+ * measured", which is not the same claim as silence, and a lane that cannot
19718
+ * tell them apart paints a quiet hour at full scale — which is exactly what
19719
+ * the count-on-a-level-meter did.
19720
+ */
19721
+ audioDbfs: number().optional()
19712
19722
  });
19713
19723
  /**
19714
19724
  * One camera's row in a `getEventDensityBatch` answer.
@@ -27875,7 +27885,23 @@ var RecordingRangeSchema = object({
27875
27885
  });
27876
27886
  var RecordingAvailabilitySchema = object({
27877
27887
  deviceId: number(),
27878
- ranges: array(RecordingRangeSchema)
27888
+ ranges: array(RecordingRangeSchema),
27889
+ /**
27890
+ * Every profile this camera has footage in — not only the one `ranges`
27891
+ * describes (D433).
27892
+ *
27893
+ * `ranges` answers for ONE profile by design: the timeline is a single bar,
27894
+ * and enumerating all of them triples the directory reads for a bar that
27895
+ * would look identical. But the answer used to say nothing about that, so a
27896
+ * caller asking "what can I export?" read the single preferred profile as
27897
+ * the only one that exists — on this deployment every camera records `high`
27898
+ * AND `low`, the low tree holding 14 GB for camera 615 alone, and the export
27899
+ * UI could not see it.
27900
+ *
27901
+ * Cheap: it is the same shallow directory read the profile CHOICE already
27902
+ * makes. Ask for a specific profile's ranges with the `profile` input.
27903
+ */
27904
+ profilesWithFootage: array(string())
27879
27905
  });
27880
27906
  var RecordingDaysSchema = object({
27881
27907
  deviceId: number(),
@@ -27901,7 +27927,11 @@ var RecordingDaysSchema = object({
27901
27927
  var RecordingAvailabilityForDeviceSchema = object({
27902
27928
  deviceId: number(),
27903
27929
  read: _enum(["read", "unreadable"]),
27904
- ranges: array(RecordingRangeSchema).readonly()
27930
+ ranges: array(RecordingRangeSchema).readonly(),
27931
+ /** Same field, same meaning, as the singular answer (D433). A row that
27932
+ * dropped it would tell a grid caller the archive holds one profile.
27933
+ * Empty on an `'unreadable'` row: nobody looked. */
27934
+ profilesWithFootage: array(string()).readonly()
27905
27935
  });
27906
27936
  /**
27907
27937
  * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
@@ -28191,7 +28221,14 @@ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
28191
28221
  method(object({
28192
28222
  deviceId: number(),
28193
28223
  fromMs: number(),
28194
- toMs: number()
28224
+ toMs: number(),
28225
+ /**
28226
+ * Answer for THIS profile instead of the preferred one (D433). Absent
28227
+ * keeps the timeline's behaviour — one bar, one profile, one set of
28228
+ * reads. `profilesWithFootage` on the answer says what may be asked
28229
+ * for.
28230
+ */
28231
+ profile: string().optional()
28195
28232
  }), RecordingAvailabilitySchema, {
28196
28233
  kind: "query",
28197
28234
  auth: "protected"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-notifiers",
3
- "version": "1.2.96",
3
+ "version": "1.2.97",
4
4
  "description": "System notifiers addon for CamStack — a `notification-output` collection provider hosting per-kind notifier adapters (ntfy, pushover, gotify, telegram, discord, webhook, zentik).",
5
5
  "keywords": [
6
6
  "camstack",