@camstack/addon-export-alexa 1.2.98 → 1.2.99

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.
@@ -19858,7 +19858,17 @@ var EventDensityBucketSchema = object({
19858
19858
  bucketStart: number(),
19859
19859
  motion: number().int(),
19860
19860
  object: number().int(),
19861
- audio: number().int()
19861
+ audio: number().int(),
19862
+ /**
19863
+ * Energy-weighted mean dBFS of the audio events in this bucket — the LEVEL,
19864
+ * as opposed to `audio`, which is their COUNT (D431).
19865
+ *
19866
+ * ABSENT when the bucket holds no audio event. Absence means "nothing was
19867
+ * measured", which is not the same claim as silence, and a lane that cannot
19868
+ * tell them apart paints a quiet hour at full scale — which is exactly what
19869
+ * the count-on-a-level-meter did.
19870
+ */
19871
+ audioDbfs: number().optional()
19862
19872
  });
19863
19873
  /**
19864
19874
  * One camera's row in a `getEventDensityBatch` answer.
@@ -28025,7 +28035,23 @@ var RecordingRangeSchema = object({
28025
28035
  });
28026
28036
  var RecordingAvailabilitySchema = object({
28027
28037
  deviceId: number(),
28028
- ranges: array(RecordingRangeSchema)
28038
+ ranges: array(RecordingRangeSchema),
28039
+ /**
28040
+ * Every profile this camera has footage in — not only the one `ranges`
28041
+ * describes (D433).
28042
+ *
28043
+ * `ranges` answers for ONE profile by design: the timeline is a single bar,
28044
+ * and enumerating all of them triples the directory reads for a bar that
28045
+ * would look identical. But the answer used to say nothing about that, so a
28046
+ * caller asking "what can I export?" read the single preferred profile as
28047
+ * the only one that exists — on this deployment every camera records `high`
28048
+ * AND `low`, the low tree holding 14 GB for camera 615 alone, and the export
28049
+ * UI could not see it.
28050
+ *
28051
+ * Cheap: it is the same shallow directory read the profile CHOICE already
28052
+ * makes. Ask for a specific profile's ranges with the `profile` input.
28053
+ */
28054
+ profilesWithFootage: array(string())
28029
28055
  });
28030
28056
  var RecordingDaysSchema = object({
28031
28057
  deviceId: number(),
@@ -28051,7 +28077,11 @@ var RecordingDaysSchema = object({
28051
28077
  var RecordingAvailabilityForDeviceSchema = object({
28052
28078
  deviceId: number(),
28053
28079
  read: _enum(["read", "unreadable"]),
28054
- ranges: array(RecordingRangeSchema).readonly()
28080
+ ranges: array(RecordingRangeSchema).readonly(),
28081
+ /** Same field, same meaning, as the singular answer (D433). A row that
28082
+ * dropped it would tell a grid caller the archive holds one profile.
28083
+ * Empty on an `'unreadable'` row: nobody looked. */
28084
+ profilesWithFootage: array(string()).readonly()
28055
28085
  });
28056
28086
  /**
28057
28087
  * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
@@ -28341,7 +28371,14 @@ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
28341
28371
  method(object({
28342
28372
  deviceId: number(),
28343
28373
  fromMs: number(),
28344
- toMs: number()
28374
+ toMs: number(),
28375
+ /**
28376
+ * Answer for THIS profile instead of the preferred one (D433). Absent
28377
+ * keeps the timeline's behaviour — one bar, one profile, one set of
28378
+ * reads. `profilesWithFootage` on the answer says what may be asked
28379
+ * for.
28380
+ */
28381
+ profile: string().optional()
28345
28382
  }), RecordingAvailabilitySchema, {
28346
28383
  kind: "query",
28347
28384
  auth: "protected"
@@ -19831,7 +19831,17 @@ var EventDensityBucketSchema = object({
19831
19831
  bucketStart: number(),
19832
19832
  motion: number().int(),
19833
19833
  object: number().int(),
19834
- audio: number().int()
19834
+ audio: number().int(),
19835
+ /**
19836
+ * Energy-weighted mean dBFS of the audio events in this bucket — the LEVEL,
19837
+ * as opposed to `audio`, which is their COUNT (D431).
19838
+ *
19839
+ * ABSENT when the bucket holds no audio event. Absence means "nothing was
19840
+ * measured", which is not the same claim as silence, and a lane that cannot
19841
+ * tell them apart paints a quiet hour at full scale — which is exactly what
19842
+ * the count-on-a-level-meter did.
19843
+ */
19844
+ audioDbfs: number().optional()
19835
19845
  });
19836
19846
  /**
19837
19847
  * One camera's row in a `getEventDensityBatch` answer.
@@ -27998,7 +28008,23 @@ var RecordingRangeSchema = object({
27998
28008
  });
27999
28009
  var RecordingAvailabilitySchema = object({
28000
28010
  deviceId: number(),
28001
- ranges: array(RecordingRangeSchema)
28011
+ ranges: array(RecordingRangeSchema),
28012
+ /**
28013
+ * Every profile this camera has footage in — not only the one `ranges`
28014
+ * describes (D433).
28015
+ *
28016
+ * `ranges` answers for ONE profile by design: the timeline is a single bar,
28017
+ * and enumerating all of them triples the directory reads for a bar that
28018
+ * would look identical. But the answer used to say nothing about that, so a
28019
+ * caller asking "what can I export?" read the single preferred profile as
28020
+ * the only one that exists — on this deployment every camera records `high`
28021
+ * AND `low`, the low tree holding 14 GB for camera 615 alone, and the export
28022
+ * UI could not see it.
28023
+ *
28024
+ * Cheap: it is the same shallow directory read the profile CHOICE already
28025
+ * makes. Ask for a specific profile's ranges with the `profile` input.
28026
+ */
28027
+ profilesWithFootage: array(string())
28002
28028
  });
28003
28029
  var RecordingDaysSchema = object({
28004
28030
  deviceId: number(),
@@ -28024,7 +28050,11 @@ var RecordingDaysSchema = object({
28024
28050
  var RecordingAvailabilityForDeviceSchema = object({
28025
28051
  deviceId: number(),
28026
28052
  read: _enum(["read", "unreadable"]),
28027
- ranges: array(RecordingRangeSchema).readonly()
28053
+ ranges: array(RecordingRangeSchema).readonly(),
28054
+ /** Same field, same meaning, as the singular answer (D433). A row that
28055
+ * dropped it would tell a grid caller the archive holds one profile.
28056
+ * Empty on an `'unreadable'` row: nobody looked. */
28057
+ profilesWithFootage: array(string()).readonly()
28028
28058
  });
28029
28059
  /**
28030
28060
  * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
@@ -28314,7 +28344,14 @@ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
28314
28344
  method(object({
28315
28345
  deviceId: number(),
28316
28346
  fromMs: number(),
28317
- toMs: number()
28347
+ toMs: number(),
28348
+ /**
28349
+ * Answer for THIS profile instead of the preferred one (D433). Absent
28350
+ * keeps the timeline's behaviour — one bar, one profile, one set of
28351
+ * reads. `profilesWithFootage` on the answer says what may be asked
28352
+ * for.
28353
+ */
28354
+ profile: string().optional()
28318
28355
  }), RecordingAvailabilitySchema, {
28319
28356
  kind: "query",
28320
28357
  auth: "protected"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-export-alexa",
3
- "version": "1.2.98",
3
+ "version": "1.2.99",
4
4
  "description": "Alexa Smart Home Skill export — hub-side OAuth provider + directive handler. The companion AWS Lambda forwards Alexa directives to this addon's /addon/export-alexa/directive endpoint.",
5
5
  "keywords": [
6
6
  "camstack",