@camstack/addon-provider-dreo 0.2.51 → 0.2.52

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
@@ -19244,6 +19244,34 @@ var KeyEventsForDeviceSchema = object({
19244
19244
  deviceId: number(),
19245
19245
  events: array(KeyEventSchema).readonly()
19246
19246
  });
19247
+ /** One non-empty bucket of the timeline histogram. */
19248
+ var EventDensityBucketSchema = object({
19249
+ bucketStart: number(),
19250
+ motion: number().int(),
19251
+ object: number().int(),
19252
+ audio: number().int()
19253
+ });
19254
+ /**
19255
+ * One camera's row in a `getEventDensityBatch` answer.
19256
+ *
19257
+ * TWO facts, and the timeline draws them differently:
19258
+ *
19259
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
19260
+ * claim: read, and nothing happened in the window.
19261
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
19262
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
19263
+ * not quiet.
19264
+ *
19265
+ * Fanned out per camera the difference was free — one query rejected while the
19266
+ * others resolved — and collapsing to a batch is the exact moment it is lost
19267
+ * silently. Every requested id gets a row: a caller that asked for twelve and
19268
+ * got eleven cannot tell which one is missing, or that any is.
19269
+ */
19270
+ var EventDensityForDeviceSchema = object({
19271
+ deviceId: number(),
19272
+ read: _enum(["read", "unreadable"]),
19273
+ buckets: array(EventDensityBucketSchema).readonly()
19274
+ });
19247
19275
  object({
19248
19276
  trackId: string(),
19249
19277
  className: string(),
@@ -19554,12 +19582,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19554
19582
  since: number(),
19555
19583
  until: number(),
19556
19584
  bucketMs: number().int().positive()
19557
- }), array(object({
19558
- bucketStart: number(),
19559
- motion: number().int(),
19560
- object: number().int(),
19561
- audio: number().int()
19562
- })).readonly()), method(object({
19585
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19586
+ deviceIds: array(number()).min(1).max(200),
19587
+ since: number(),
19588
+ until: number(),
19589
+ bucketMs: number().int().positive()
19590
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19563
19591
  deviceId: number(),
19564
19592
  cutoffMs: number()
19565
19593
  }), object({
@@ -28592,6 +28620,39 @@ var RecordingDaysSchema = object({
28592
28620
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28593
28621
  days: array(number())
28594
28622
  });
28623
+ /**
28624
+ * One camera's row in a `getAvailabilityBatch` answer.
28625
+ *
28626
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
28627
+ * batch collapses the transport, not the work — plus the one thing the singular
28628
+ * method never had to say:
28629
+ *
28630
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
28631
+ * no footage in the window", which is a real claim.
28632
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
28633
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
28634
+ * that emptiness means NOTHING.
28635
+ *
28636
+ * A timeline that renders the second as the first tells an operator there is no
28637
+ * footage when the truth is that nobody looked.
28638
+ */
28639
+ var RecordingAvailabilityForDeviceSchema = object({
28640
+ deviceId: number(),
28641
+ read: _enum(["read", "unreadable"]),
28642
+ ranges: array(RecordingRangeSchema).readonly()
28643
+ });
28644
+ /**
28645
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
28646
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
28647
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
28648
+ * the date-picker's day dots must not spell them the same.
28649
+ */
28650
+ var RecordingDaysForDeviceSchema = object({
28651
+ deviceId: number(),
28652
+ read: _enum(["read", "unreadable"]),
28653
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28654
+ days: array(number()).readonly()
28655
+ });
28595
28656
  var RecordingManifestSchema = object({
28596
28657
  deviceId: number(),
28597
28658
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -28826,6 +28887,13 @@ method(object({
28826
28887
  }), RecordingAvailabilitySchema, {
28827
28888
  kind: "query",
28828
28889
  auth: "protected"
28890
+ }), method(object({
28891
+ deviceIds: array(number()).min(1).max(200),
28892
+ fromMs: number(),
28893
+ toMs: number()
28894
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
28895
+ kind: "query",
28896
+ auth: "protected"
28829
28897
  }), method(object({
28830
28898
  deviceId: number(),
28831
28899
  fromMs: number(),
@@ -28834,6 +28902,14 @@ method(object({
28834
28902
  }), RecordingDaysSchema, {
28835
28903
  kind: "query",
28836
28904
  auth: "protected"
28905
+ }), method(object({
28906
+ deviceIds: array(number()).min(1).max(200),
28907
+ fromMs: number(),
28908
+ toMs: number(),
28909
+ tzOffsetMinutes: number()
28910
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
28911
+ kind: "query",
28912
+ auth: "protected"
28837
28913
  }), method(object({
28838
28914
  deviceId: number(),
28839
28915
  fromMs: number(),
@@ -35730,6 +35806,12 @@ Object.freeze({
35730
35806
  addonId: null,
35731
35807
  access: "view"
35732
35808
  },
35809
+ "pipelineAnalytics.getEventDensityBatch": {
35810
+ capName: "pipeline-analytics",
35811
+ capScope: "device",
35812
+ addonId: null,
35813
+ access: "view"
35814
+ },
35733
35815
  "pipelineAnalytics.getEventMedia": {
35734
35816
  capName: "pipeline-analytics",
35735
35817
  capScope: "device",
@@ -36852,12 +36934,24 @@ Object.freeze({
36852
36934
  addonId: null,
36853
36935
  access: "view"
36854
36936
  },
36937
+ "recording.getAvailabilityBatch": {
36938
+ capName: "recording",
36939
+ capScope: "system",
36940
+ addonId: null,
36941
+ access: "view"
36942
+ },
36855
36943
  "recording.getDaysWithRecordings": {
36856
36944
  capName: "recording",
36857
36945
  capScope: "system",
36858
36946
  addonId: null,
36859
36947
  access: "view"
36860
36948
  },
36949
+ "recording.getDaysWithRecordingsBatch": {
36950
+ capName: "recording",
36951
+ capScope: "system",
36952
+ addonId: null,
36953
+ access: "view"
36954
+ },
36861
36955
  "recording.getDeviceConfig": {
36862
36956
  capName: "recording",
36863
36957
  capScope: "system",
@@ -39462,6 +39556,11 @@ Object.freeze({
39462
39556
  form: "single",
39463
39557
  optional: false
39464
39558
  }],
39559
+ "pipelineAnalytics.getEventDensityBatch": [{
39560
+ name: "deviceIds",
39561
+ form: "array",
39562
+ optional: false
39563
+ }],
39465
39564
  "pipelineAnalytics.getEventMedia": [{
39466
39565
  name: "deviceId",
39467
39566
  form: "single",
@@ -39877,11 +39976,21 @@ Object.freeze({
39877
39976
  form: "single",
39878
39977
  optional: false
39879
39978
  }],
39979
+ "recording.getAvailabilityBatch": [{
39980
+ name: "deviceIds",
39981
+ form: "array",
39982
+ optional: false
39983
+ }],
39880
39984
  "recording.getDaysWithRecordings": [{
39881
39985
  name: "deviceId",
39882
39986
  form: "single",
39883
39987
  optional: false
39884
39988
  }],
39989
+ "recording.getDaysWithRecordingsBatch": [{
39990
+ name: "deviceIds",
39991
+ form: "array",
39992
+ optional: false
39993
+ }],
39885
39994
  "recording.getDeviceConfig": [{
39886
39995
  name: "deviceId",
39887
39996
  form: "single",
package/dist/addon.mjs CHANGED
@@ -19245,6 +19245,34 @@ var KeyEventsForDeviceSchema = object({
19245
19245
  deviceId: number(),
19246
19246
  events: array(KeyEventSchema).readonly()
19247
19247
  });
19248
+ /** One non-empty bucket of the timeline histogram. */
19249
+ var EventDensityBucketSchema = object({
19250
+ bucketStart: number(),
19251
+ motion: number().int(),
19252
+ object: number().int(),
19253
+ audio: number().int()
19254
+ });
19255
+ /**
19256
+ * One camera's row in a `getEventDensityBatch` answer.
19257
+ *
19258
+ * TWO facts, and the timeline draws them differently:
19259
+ *
19260
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
19261
+ * claim: read, and nothing happened in the window.
19262
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
19263
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
19264
+ * not quiet.
19265
+ *
19266
+ * Fanned out per camera the difference was free — one query rejected while the
19267
+ * others resolved — and collapsing to a batch is the exact moment it is lost
19268
+ * silently. Every requested id gets a row: a caller that asked for twelve and
19269
+ * got eleven cannot tell which one is missing, or that any is.
19270
+ */
19271
+ var EventDensityForDeviceSchema = object({
19272
+ deviceId: number(),
19273
+ read: _enum(["read", "unreadable"]),
19274
+ buckets: array(EventDensityBucketSchema).readonly()
19275
+ });
19248
19276
  object({
19249
19277
  trackId: string(),
19250
19278
  className: string(),
@@ -19555,12 +19583,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19555
19583
  since: number(),
19556
19584
  until: number(),
19557
19585
  bucketMs: number().int().positive()
19558
- }), array(object({
19559
- bucketStart: number(),
19560
- motion: number().int(),
19561
- object: number().int(),
19562
- audio: number().int()
19563
- })).readonly()), method(object({
19586
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19587
+ deviceIds: array(number()).min(1).max(200),
19588
+ since: number(),
19589
+ until: number(),
19590
+ bucketMs: number().int().positive()
19591
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19564
19592
  deviceId: number(),
19565
19593
  cutoffMs: number()
19566
19594
  }), object({
@@ -28593,6 +28621,39 @@ var RecordingDaysSchema = object({
28593
28621
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28594
28622
  days: array(number())
28595
28623
  });
28624
+ /**
28625
+ * One camera's row in a `getAvailabilityBatch` answer.
28626
+ *
28627
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
28628
+ * batch collapses the transport, not the work — plus the one thing the singular
28629
+ * method never had to say:
28630
+ *
28631
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
28632
+ * no footage in the window", which is a real claim.
28633
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
28634
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
28635
+ * that emptiness means NOTHING.
28636
+ *
28637
+ * A timeline that renders the second as the first tells an operator there is no
28638
+ * footage when the truth is that nobody looked.
28639
+ */
28640
+ var RecordingAvailabilityForDeviceSchema = object({
28641
+ deviceId: number(),
28642
+ read: _enum(["read", "unreadable"]),
28643
+ ranges: array(RecordingRangeSchema).readonly()
28644
+ });
28645
+ /**
28646
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
28647
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
28648
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
28649
+ * the date-picker's day dots must not spell them the same.
28650
+ */
28651
+ var RecordingDaysForDeviceSchema = object({
28652
+ deviceId: number(),
28653
+ read: _enum(["read", "unreadable"]),
28654
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28655
+ days: array(number()).readonly()
28656
+ });
28596
28657
  var RecordingManifestSchema = object({
28597
28658
  deviceId: number(),
28598
28659
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -28827,6 +28888,13 @@ method(object({
28827
28888
  }), RecordingAvailabilitySchema, {
28828
28889
  kind: "query",
28829
28890
  auth: "protected"
28891
+ }), method(object({
28892
+ deviceIds: array(number()).min(1).max(200),
28893
+ fromMs: number(),
28894
+ toMs: number()
28895
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
28896
+ kind: "query",
28897
+ auth: "protected"
28830
28898
  }), method(object({
28831
28899
  deviceId: number(),
28832
28900
  fromMs: number(),
@@ -28835,6 +28903,14 @@ method(object({
28835
28903
  }), RecordingDaysSchema, {
28836
28904
  kind: "query",
28837
28905
  auth: "protected"
28906
+ }), method(object({
28907
+ deviceIds: array(number()).min(1).max(200),
28908
+ fromMs: number(),
28909
+ toMs: number(),
28910
+ tzOffsetMinutes: number()
28911
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
28912
+ kind: "query",
28913
+ auth: "protected"
28838
28914
  }), method(object({
28839
28915
  deviceId: number(),
28840
28916
  fromMs: number(),
@@ -35731,6 +35807,12 @@ Object.freeze({
35731
35807
  addonId: null,
35732
35808
  access: "view"
35733
35809
  },
35810
+ "pipelineAnalytics.getEventDensityBatch": {
35811
+ capName: "pipeline-analytics",
35812
+ capScope: "device",
35813
+ addonId: null,
35814
+ access: "view"
35815
+ },
35734
35816
  "pipelineAnalytics.getEventMedia": {
35735
35817
  capName: "pipeline-analytics",
35736
35818
  capScope: "device",
@@ -36853,12 +36935,24 @@ Object.freeze({
36853
36935
  addonId: null,
36854
36936
  access: "view"
36855
36937
  },
36938
+ "recording.getAvailabilityBatch": {
36939
+ capName: "recording",
36940
+ capScope: "system",
36941
+ addonId: null,
36942
+ access: "view"
36943
+ },
36856
36944
  "recording.getDaysWithRecordings": {
36857
36945
  capName: "recording",
36858
36946
  capScope: "system",
36859
36947
  addonId: null,
36860
36948
  access: "view"
36861
36949
  },
36950
+ "recording.getDaysWithRecordingsBatch": {
36951
+ capName: "recording",
36952
+ capScope: "system",
36953
+ addonId: null,
36954
+ access: "view"
36955
+ },
36862
36956
  "recording.getDeviceConfig": {
36863
36957
  capName: "recording",
36864
36958
  capScope: "system",
@@ -39463,6 +39557,11 @@ Object.freeze({
39463
39557
  form: "single",
39464
39558
  optional: false
39465
39559
  }],
39560
+ "pipelineAnalytics.getEventDensityBatch": [{
39561
+ name: "deviceIds",
39562
+ form: "array",
39563
+ optional: false
39564
+ }],
39466
39565
  "pipelineAnalytics.getEventMedia": [{
39467
39566
  name: "deviceId",
39468
39567
  form: "single",
@@ -39878,11 +39977,21 @@ Object.freeze({
39878
39977
  form: "single",
39879
39978
  optional: false
39880
39979
  }],
39980
+ "recording.getAvailabilityBatch": [{
39981
+ name: "deviceIds",
39982
+ form: "array",
39983
+ optional: false
39984
+ }],
39881
39985
  "recording.getDaysWithRecordings": [{
39882
39986
  name: "deviceId",
39883
39987
  form: "single",
39884
39988
  optional: false
39885
39989
  }],
39990
+ "recording.getDaysWithRecordingsBatch": [{
39991
+ name: "deviceIds",
39992
+ form: "array",
39993
+ optional: false
39994
+ }],
39886
39995
  "recording.getDeviceConfig": [{
39887
39996
  name: "deviceId",
39888
39997
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-dreo",
3
- "version": "0.2.51",
3
+ "version": "0.2.52",
4
4
  "description": "Dreo smart-device (fan / air-circulator / purifier / heater / humidifier) device-provider addon for CamStack — wraps the @apocaliss92/nodedreo Dreo cloud client (REST + WebSocket)",
5
5
  "keywords": [
6
6
  "camstack",