@camstack/addon-ai 0.4.95 → 0.4.96

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
@@ -19844,7 +19844,17 @@ var EventDensityBucketSchema = object({
19844
19844
  bucketStart: number$1(),
19845
19845
  motion: number$1().int(),
19846
19846
  object: number$1().int(),
19847
- audio: number$1().int()
19847
+ audio: number$1().int(),
19848
+ /**
19849
+ * Energy-weighted mean dBFS of the audio events in this bucket — the LEVEL,
19850
+ * as opposed to `audio`, which is their COUNT (D431).
19851
+ *
19852
+ * ABSENT when the bucket holds no audio event. Absence means "nothing was
19853
+ * measured", which is not the same claim as silence, and a lane that cannot
19854
+ * tell them apart paints a quiet hour at full scale — which is exactly what
19855
+ * the count-on-a-level-meter did.
19856
+ */
19857
+ audioDbfs: number$1().optional()
19848
19858
  });
19849
19859
  /**
19850
19860
  * One camera's row in a `getEventDensityBatch` answer.
@@ -28011,7 +28021,23 @@ var RecordingRangeSchema = object({
28011
28021
  });
28012
28022
  var RecordingAvailabilitySchema = object({
28013
28023
  deviceId: number$1(),
28014
- ranges: array(RecordingRangeSchema)
28024
+ ranges: array(RecordingRangeSchema),
28025
+ /**
28026
+ * Every profile this camera has footage in — not only the one `ranges`
28027
+ * describes (D433).
28028
+ *
28029
+ * `ranges` answers for ONE profile by design: the timeline is a single bar,
28030
+ * and enumerating all of them triples the directory reads for a bar that
28031
+ * would look identical. But the answer used to say nothing about that, so a
28032
+ * caller asking "what can I export?" read the single preferred profile as
28033
+ * the only one that exists — on this deployment every camera records `high`
28034
+ * AND `low`, the low tree holding 14 GB for camera 615 alone, and the export
28035
+ * UI could not see it.
28036
+ *
28037
+ * Cheap: it is the same shallow directory read the profile CHOICE already
28038
+ * makes. Ask for a specific profile's ranges with the `profile` input.
28039
+ */
28040
+ profilesWithFootage: array(string())
28015
28041
  });
28016
28042
  var RecordingDaysSchema = object({
28017
28043
  deviceId: number$1(),
@@ -28037,7 +28063,11 @@ var RecordingDaysSchema = object({
28037
28063
  var RecordingAvailabilityForDeviceSchema = object({
28038
28064
  deviceId: number$1(),
28039
28065
  read: _enum(["read", "unreadable"]),
28040
- ranges: array(RecordingRangeSchema).readonly()
28066
+ ranges: array(RecordingRangeSchema).readonly(),
28067
+ /** Same field, same meaning, as the singular answer (D433). A row that
28068
+ * dropped it would tell a grid caller the archive holds one profile.
28069
+ * Empty on an `'unreadable'` row: nobody looked. */
28070
+ profilesWithFootage: array(string()).readonly()
28041
28071
  });
28042
28072
  /**
28043
28073
  * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
@@ -28327,7 +28357,14 @@ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
28327
28357
  method(object({
28328
28358
  deviceId: number$1(),
28329
28359
  fromMs: number$1(),
28330
- toMs: number$1()
28360
+ toMs: number$1(),
28361
+ /**
28362
+ * Answer for THIS profile instead of the preferred one (D433). Absent
28363
+ * keeps the timeline's behaviour — one bar, one profile, one set of
28364
+ * reads. `profilesWithFootage` on the answer says what may be asked
28365
+ * for.
28366
+ */
28367
+ profile: string().optional()
28331
28368
  }), RecordingAvailabilitySchema, {
28332
28369
  kind: "query",
28333
28370
  auth: "protected"
package/dist/addon.mjs CHANGED
@@ -19871,7 +19871,17 @@ var EventDensityBucketSchema = object({
19871
19871
  bucketStart: number$1(),
19872
19872
  motion: number$1().int(),
19873
19873
  object: number$1().int(),
19874
- audio: number$1().int()
19874
+ audio: number$1().int(),
19875
+ /**
19876
+ * Energy-weighted mean dBFS of the audio events in this bucket — the LEVEL,
19877
+ * as opposed to `audio`, which is their COUNT (D431).
19878
+ *
19879
+ * ABSENT when the bucket holds no audio event. Absence means "nothing was
19880
+ * measured", which is not the same claim as silence, and a lane that cannot
19881
+ * tell them apart paints a quiet hour at full scale — which is exactly what
19882
+ * the count-on-a-level-meter did.
19883
+ */
19884
+ audioDbfs: number$1().optional()
19875
19885
  });
19876
19886
  /**
19877
19887
  * One camera's row in a `getEventDensityBatch` answer.
@@ -28038,7 +28048,23 @@ var RecordingRangeSchema = object({
28038
28048
  });
28039
28049
  var RecordingAvailabilitySchema = object({
28040
28050
  deviceId: number$1(),
28041
- ranges: array(RecordingRangeSchema)
28051
+ ranges: array(RecordingRangeSchema),
28052
+ /**
28053
+ * Every profile this camera has footage in — not only the one `ranges`
28054
+ * describes (D433).
28055
+ *
28056
+ * `ranges` answers for ONE profile by design: the timeline is a single bar,
28057
+ * and enumerating all of them triples the directory reads for a bar that
28058
+ * would look identical. But the answer used to say nothing about that, so a
28059
+ * caller asking "what can I export?" read the single preferred profile as
28060
+ * the only one that exists — on this deployment every camera records `high`
28061
+ * AND `low`, the low tree holding 14 GB for camera 615 alone, and the export
28062
+ * UI could not see it.
28063
+ *
28064
+ * Cheap: it is the same shallow directory read the profile CHOICE already
28065
+ * makes. Ask for a specific profile's ranges with the `profile` input.
28066
+ */
28067
+ profilesWithFootage: array(string())
28042
28068
  });
28043
28069
  var RecordingDaysSchema = object({
28044
28070
  deviceId: number$1(),
@@ -28064,7 +28090,11 @@ var RecordingDaysSchema = object({
28064
28090
  var RecordingAvailabilityForDeviceSchema = object({
28065
28091
  deviceId: number$1(),
28066
28092
  read: _enum(["read", "unreadable"]),
28067
- ranges: array(RecordingRangeSchema).readonly()
28093
+ ranges: array(RecordingRangeSchema).readonly(),
28094
+ /** Same field, same meaning, as the singular answer (D433). A row that
28095
+ * dropped it would tell a grid caller the archive holds one profile.
28096
+ * Empty on an `'unreadable'` row: nobody looked. */
28097
+ profilesWithFootage: array(string()).readonly()
28068
28098
  });
28069
28099
  /**
28070
28100
  * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
@@ -28354,7 +28384,14 @@ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
28354
28384
  method(object({
28355
28385
  deviceId: number$1(),
28356
28386
  fromMs: number$1(),
28357
- toMs: number$1()
28387
+ toMs: number$1(),
28388
+ /**
28389
+ * Answer for THIS profile instead of the preferred one (D433). Absent
28390
+ * keeps the timeline's behaviour — one bar, one profile, one set of
28391
+ * reads. `profilesWithFootage` on the answer says what may be asked
28392
+ * for.
28393
+ */
28394
+ profile: string().optional()
28358
28395
  }), RecordingAvailabilitySchema, {
28359
28396
  kind: "query",
28360
28397
  auth: "protected"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-ai",
3
- "version": "0.4.95",
3
+ "version": "0.4.96",
4
4
  "description": "AI addon for CamStack — the `llm` collection provider (cloud, LAN, and camstack-managed local llama.cpp profiles) plus the per-node `llm-runtime` managed executor.",
5
5
  "keywords": [
6
6
  "camstack",