@camstack/addon-export-google 0.1.56 → 0.1.57

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.
@@ -19829,7 +19829,17 @@ var EventDensityBucketSchema = object({
19829
19829
  bucketStart: number(),
19830
19830
  motion: number().int(),
19831
19831
  object: number().int(),
19832
- audio: number().int()
19832
+ audio: number().int(),
19833
+ /**
19834
+ * Energy-weighted mean dBFS of the audio events in this bucket — the LEVEL,
19835
+ * as opposed to `audio`, which is their COUNT (D431).
19836
+ *
19837
+ * ABSENT when the bucket holds no audio event. Absence means "nothing was
19838
+ * measured", which is not the same claim as silence, and a lane that cannot
19839
+ * tell them apart paints a quiet hour at full scale — which is exactly what
19840
+ * the count-on-a-level-meter did.
19841
+ */
19842
+ audioDbfs: number().optional()
19833
19843
  });
19834
19844
  /**
19835
19845
  * One camera's row in a `getEventDensityBatch` answer.
@@ -28008,7 +28018,23 @@ var RecordingRangeSchema = object({
28008
28018
  });
28009
28019
  var RecordingAvailabilitySchema = object({
28010
28020
  deviceId: number(),
28011
- ranges: array(RecordingRangeSchema)
28021
+ ranges: array(RecordingRangeSchema),
28022
+ /**
28023
+ * Every profile this camera has footage in — not only the one `ranges`
28024
+ * describes (D433).
28025
+ *
28026
+ * `ranges` answers for ONE profile by design: the timeline is a single bar,
28027
+ * and enumerating all of them triples the directory reads for a bar that
28028
+ * would look identical. But the answer used to say nothing about that, so a
28029
+ * caller asking "what can I export?" read the single preferred profile as
28030
+ * the only one that exists — on this deployment every camera records `high`
28031
+ * AND `low`, the low tree holding 14 GB for camera 615 alone, and the export
28032
+ * UI could not see it.
28033
+ *
28034
+ * Cheap: it is the same shallow directory read the profile CHOICE already
28035
+ * makes. Ask for a specific profile's ranges with the `profile` input.
28036
+ */
28037
+ profilesWithFootage: array(string())
28012
28038
  });
28013
28039
  var RecordingDaysSchema = object({
28014
28040
  deviceId: number(),
@@ -28034,7 +28060,11 @@ var RecordingDaysSchema = object({
28034
28060
  var RecordingAvailabilityForDeviceSchema = object({
28035
28061
  deviceId: number(),
28036
28062
  read: _enum(["read", "unreadable"]),
28037
- ranges: array(RecordingRangeSchema).readonly()
28063
+ ranges: array(RecordingRangeSchema).readonly(),
28064
+ /** Same field, same meaning, as the singular answer (D433). A row that
28065
+ * dropped it would tell a grid caller the archive holds one profile.
28066
+ * Empty on an `'unreadable'` row: nobody looked. */
28067
+ profilesWithFootage: array(string()).readonly()
28038
28068
  });
28039
28069
  /**
28040
28070
  * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
@@ -28324,7 +28354,14 @@ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
28324
28354
  method(object({
28325
28355
  deviceId: number(),
28326
28356
  fromMs: number(),
28327
- toMs: number()
28357
+ toMs: number(),
28358
+ /**
28359
+ * Answer for THIS profile instead of the preferred one (D433). Absent
28360
+ * keeps the timeline's behaviour — one bar, one profile, one set of
28361
+ * reads. `profilesWithFootage` on the answer says what may be asked
28362
+ * for.
28363
+ */
28364
+ profile: string().optional()
28328
28365
  }), RecordingAvailabilitySchema, {
28329
28366
  kind: "query",
28330
28367
  auth: "protected"
@@ -19825,7 +19825,17 @@ var EventDensityBucketSchema = object({
19825
19825
  bucketStart: number(),
19826
19826
  motion: number().int(),
19827
19827
  object: number().int(),
19828
- audio: number().int()
19828
+ audio: number().int(),
19829
+ /**
19830
+ * Energy-weighted mean dBFS of the audio events in this bucket — the LEVEL,
19831
+ * as opposed to `audio`, which is their COUNT (D431).
19832
+ *
19833
+ * ABSENT when the bucket holds no audio event. Absence means "nothing was
19834
+ * measured", which is not the same claim as silence, and a lane that cannot
19835
+ * tell them apart paints a quiet hour at full scale — which is exactly what
19836
+ * the count-on-a-level-meter did.
19837
+ */
19838
+ audioDbfs: number().optional()
19829
19839
  });
19830
19840
  /**
19831
19841
  * One camera's row in a `getEventDensityBatch` answer.
@@ -28004,7 +28014,23 @@ var RecordingRangeSchema = object({
28004
28014
  });
28005
28015
  var RecordingAvailabilitySchema = object({
28006
28016
  deviceId: number(),
28007
- ranges: array(RecordingRangeSchema)
28017
+ ranges: array(RecordingRangeSchema),
28018
+ /**
28019
+ * Every profile this camera has footage in — not only the one `ranges`
28020
+ * describes (D433).
28021
+ *
28022
+ * `ranges` answers for ONE profile by design: the timeline is a single bar,
28023
+ * and enumerating all of them triples the directory reads for a bar that
28024
+ * would look identical. But the answer used to say nothing about that, so a
28025
+ * caller asking "what can I export?" read the single preferred profile as
28026
+ * the only one that exists — on this deployment every camera records `high`
28027
+ * AND `low`, the low tree holding 14 GB for camera 615 alone, and the export
28028
+ * UI could not see it.
28029
+ *
28030
+ * Cheap: it is the same shallow directory read the profile CHOICE already
28031
+ * makes. Ask for a specific profile's ranges with the `profile` input.
28032
+ */
28033
+ profilesWithFootage: array(string())
28008
28034
  });
28009
28035
  var RecordingDaysSchema = object({
28010
28036
  deviceId: number(),
@@ -28030,7 +28056,11 @@ var RecordingDaysSchema = object({
28030
28056
  var RecordingAvailabilityForDeviceSchema = object({
28031
28057
  deviceId: number(),
28032
28058
  read: _enum(["read", "unreadable"]),
28033
- ranges: array(RecordingRangeSchema).readonly()
28059
+ ranges: array(RecordingRangeSchema).readonly(),
28060
+ /** Same field, same meaning, as the singular answer (D433). A row that
28061
+ * dropped it would tell a grid caller the archive holds one profile.
28062
+ * Empty on an `'unreadable'` row: nobody looked. */
28063
+ profilesWithFootage: array(string()).readonly()
28034
28064
  });
28035
28065
  /**
28036
28066
  * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
@@ -28320,7 +28350,14 @@ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
28320
28350
  method(object({
28321
28351
  deviceId: number(),
28322
28352
  fromMs: number(),
28323
- toMs: number()
28353
+ toMs: number(),
28354
+ /**
28355
+ * Answer for THIS profile instead of the preferred one (D433). Absent
28356
+ * keeps the timeline's behaviour — one bar, one profile, one set of
28357
+ * reads. `profilesWithFootage` on the answer says what may be asked
28358
+ * for.
28359
+ */
28360
+ profile: string().optional()
28324
28361
  }), RecordingAvailabilitySchema, {
28325
28362
  kind: "query",
28326
28363
  auth: "protected"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-export-google",
3
- "version": "0.1.56",
3
+ "version": "0.1.57",
4
4
  "description": "Google Home export — hub-side smart-home fulfillment (SYNC / QUERY / EXECUTE / DISCONNECT) for the non-camera fleet, served over the hub's own OAuth account link. No Google credential is stored, sent or required.",
5
5
  "keywords": [
6
6
  "camstack",