@camstack/addon-matter-broker 0.2.50 → 0.2.51

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
@@ -19271,6 +19271,34 @@ var KeyEventsForDeviceSchema = object({
19271
19271
  deviceId: number(),
19272
19272
  events: array(KeyEventSchema).readonly()
19273
19273
  });
19274
+ /** One non-empty bucket of the timeline histogram. */
19275
+ var EventDensityBucketSchema = object({
19276
+ bucketStart: number(),
19277
+ motion: number().int(),
19278
+ object: number().int(),
19279
+ audio: number().int()
19280
+ });
19281
+ /**
19282
+ * One camera's row in a `getEventDensityBatch` answer.
19283
+ *
19284
+ * TWO facts, and the timeline draws them differently:
19285
+ *
19286
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
19287
+ * claim: read, and nothing happened in the window.
19288
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
19289
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
19290
+ * not quiet.
19291
+ *
19292
+ * Fanned out per camera the difference was free — one query rejected while the
19293
+ * others resolved — and collapsing to a batch is the exact moment it is lost
19294
+ * silently. Every requested id gets a row: a caller that asked for twelve and
19295
+ * got eleven cannot tell which one is missing, or that any is.
19296
+ */
19297
+ var EventDensityForDeviceSchema = object({
19298
+ deviceId: number(),
19299
+ read: _enum(["read", "unreadable"]),
19300
+ buckets: array(EventDensityBucketSchema).readonly()
19301
+ });
19274
19302
  object({
19275
19303
  trackId: string$2(),
19276
19304
  className: string$2(),
@@ -19581,12 +19609,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19581
19609
  since: number(),
19582
19610
  until: number(),
19583
19611
  bucketMs: number().int().positive()
19584
- }), array(object({
19585
- bucketStart: number(),
19586
- motion: number().int(),
19587
- object: number().int(),
19588
- audio: number().int()
19589
- })).readonly()), method(object({
19612
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19613
+ deviceIds: array(number()).min(1).max(200),
19614
+ since: number(),
19615
+ until: number(),
19616
+ bucketMs: number().int().positive()
19617
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19590
19618
  deviceId: number(),
19591
19619
  cutoffMs: number()
19592
19620
  }), object({
@@ -28628,6 +28656,39 @@ var RecordingDaysSchema = object({
28628
28656
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28629
28657
  days: array(number())
28630
28658
  });
28659
+ /**
28660
+ * One camera's row in a `getAvailabilityBatch` answer.
28661
+ *
28662
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
28663
+ * batch collapses the transport, not the work — plus the one thing the singular
28664
+ * method never had to say:
28665
+ *
28666
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
28667
+ * no footage in the window", which is a real claim.
28668
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
28669
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
28670
+ * that emptiness means NOTHING.
28671
+ *
28672
+ * A timeline that renders the second as the first tells an operator there is no
28673
+ * footage when the truth is that nobody looked.
28674
+ */
28675
+ var RecordingAvailabilityForDeviceSchema = object({
28676
+ deviceId: number(),
28677
+ read: _enum(["read", "unreadable"]),
28678
+ ranges: array(RecordingRangeSchema).readonly()
28679
+ });
28680
+ /**
28681
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
28682
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
28683
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
28684
+ * the date-picker's day dots must not spell them the same.
28685
+ */
28686
+ var RecordingDaysForDeviceSchema = object({
28687
+ deviceId: number(),
28688
+ read: _enum(["read", "unreadable"]),
28689
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28690
+ days: array(number()).readonly()
28691
+ });
28631
28692
  var RecordingManifestSchema = object({
28632
28693
  deviceId: number(),
28633
28694
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -28862,6 +28923,13 @@ method(object({
28862
28923
  }), RecordingAvailabilitySchema, {
28863
28924
  kind: "query",
28864
28925
  auth: "protected"
28926
+ }), method(object({
28927
+ deviceIds: array(number()).min(1).max(200),
28928
+ fromMs: number(),
28929
+ toMs: number()
28930
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
28931
+ kind: "query",
28932
+ auth: "protected"
28865
28933
  }), method(object({
28866
28934
  deviceId: number(),
28867
28935
  fromMs: number(),
@@ -28870,6 +28938,14 @@ method(object({
28870
28938
  }), RecordingDaysSchema, {
28871
28939
  kind: "query",
28872
28940
  auth: "protected"
28941
+ }), method(object({
28942
+ deviceIds: array(number()).min(1).max(200),
28943
+ fromMs: number(),
28944
+ toMs: number(),
28945
+ tzOffsetMinutes: number()
28946
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
28947
+ kind: "query",
28948
+ auth: "protected"
28873
28949
  }), method(object({
28874
28950
  deviceId: number(),
28875
28951
  fromMs: number(),
@@ -35766,6 +35842,12 @@ Object.freeze({
35766
35842
  addonId: null,
35767
35843
  access: "view"
35768
35844
  },
35845
+ "pipelineAnalytics.getEventDensityBatch": {
35846
+ capName: "pipeline-analytics",
35847
+ capScope: "device",
35848
+ addonId: null,
35849
+ access: "view"
35850
+ },
35769
35851
  "pipelineAnalytics.getEventMedia": {
35770
35852
  capName: "pipeline-analytics",
35771
35853
  capScope: "device",
@@ -36888,12 +36970,24 @@ Object.freeze({
36888
36970
  addonId: null,
36889
36971
  access: "view"
36890
36972
  },
36973
+ "recording.getAvailabilityBatch": {
36974
+ capName: "recording",
36975
+ capScope: "system",
36976
+ addonId: null,
36977
+ access: "view"
36978
+ },
36891
36979
  "recording.getDaysWithRecordings": {
36892
36980
  capName: "recording",
36893
36981
  capScope: "system",
36894
36982
  addonId: null,
36895
36983
  access: "view"
36896
36984
  },
36985
+ "recording.getDaysWithRecordingsBatch": {
36986
+ capName: "recording",
36987
+ capScope: "system",
36988
+ addonId: null,
36989
+ access: "view"
36990
+ },
36897
36991
  "recording.getDeviceConfig": {
36898
36992
  capName: "recording",
36899
36993
  capScope: "system",
@@ -39498,6 +39592,11 @@ Object.freeze({
39498
39592
  form: "single",
39499
39593
  optional: false
39500
39594
  }],
39595
+ "pipelineAnalytics.getEventDensityBatch": [{
39596
+ name: "deviceIds",
39597
+ form: "array",
39598
+ optional: false
39599
+ }],
39501
39600
  "pipelineAnalytics.getEventMedia": [{
39502
39601
  name: "deviceId",
39503
39602
  form: "single",
@@ -39913,11 +40012,21 @@ Object.freeze({
39913
40012
  form: "single",
39914
40013
  optional: false
39915
40014
  }],
40015
+ "recording.getAvailabilityBatch": [{
40016
+ name: "deviceIds",
40017
+ form: "array",
40018
+ optional: false
40019
+ }],
39916
40020
  "recording.getDaysWithRecordings": [{
39917
40021
  name: "deviceId",
39918
40022
  form: "single",
39919
40023
  optional: false
39920
40024
  }],
40025
+ "recording.getDaysWithRecordingsBatch": [{
40026
+ name: "deviceIds",
40027
+ form: "array",
40028
+ optional: false
40029
+ }],
39921
40030
  "recording.getDeviceConfig": [{
39922
40031
  name: "deviceId",
39923
40032
  form: "single",
package/dist/addon.mjs CHANGED
@@ -19269,6 +19269,34 @@ var KeyEventsForDeviceSchema = object({
19269
19269
  deviceId: number(),
19270
19270
  events: array(KeyEventSchema).readonly()
19271
19271
  });
19272
+ /** One non-empty bucket of the timeline histogram. */
19273
+ var EventDensityBucketSchema = object({
19274
+ bucketStart: number(),
19275
+ motion: number().int(),
19276
+ object: number().int(),
19277
+ audio: number().int()
19278
+ });
19279
+ /**
19280
+ * One camera's row in a `getEventDensityBatch` answer.
19281
+ *
19282
+ * TWO facts, and the timeline draws them differently:
19283
+ *
19284
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
19285
+ * claim: read, and nothing happened in the window.
19286
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
19287
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
19288
+ * not quiet.
19289
+ *
19290
+ * Fanned out per camera the difference was free — one query rejected while the
19291
+ * others resolved — and collapsing to a batch is the exact moment it is lost
19292
+ * silently. Every requested id gets a row: a caller that asked for twelve and
19293
+ * got eleven cannot tell which one is missing, or that any is.
19294
+ */
19295
+ var EventDensityForDeviceSchema = object({
19296
+ deviceId: number(),
19297
+ read: _enum(["read", "unreadable"]),
19298
+ buckets: array(EventDensityBucketSchema).readonly()
19299
+ });
19272
19300
  object({
19273
19301
  trackId: string$2(),
19274
19302
  className: string$2(),
@@ -19579,12 +19607,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19579
19607
  since: number(),
19580
19608
  until: number(),
19581
19609
  bucketMs: number().int().positive()
19582
- }), array(object({
19583
- bucketStart: number(),
19584
- motion: number().int(),
19585
- object: number().int(),
19586
- audio: number().int()
19587
- })).readonly()), method(object({
19610
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19611
+ deviceIds: array(number()).min(1).max(200),
19612
+ since: number(),
19613
+ until: number(),
19614
+ bucketMs: number().int().positive()
19615
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19588
19616
  deviceId: number(),
19589
19617
  cutoffMs: number()
19590
19618
  }), object({
@@ -28626,6 +28654,39 @@ var RecordingDaysSchema = object({
28626
28654
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28627
28655
  days: array(number())
28628
28656
  });
28657
+ /**
28658
+ * One camera's row in a `getAvailabilityBatch` answer.
28659
+ *
28660
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
28661
+ * batch collapses the transport, not the work — plus the one thing the singular
28662
+ * method never had to say:
28663
+ *
28664
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
28665
+ * no footage in the window", which is a real claim.
28666
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
28667
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
28668
+ * that emptiness means NOTHING.
28669
+ *
28670
+ * A timeline that renders the second as the first tells an operator there is no
28671
+ * footage when the truth is that nobody looked.
28672
+ */
28673
+ var RecordingAvailabilityForDeviceSchema = object({
28674
+ deviceId: number(),
28675
+ read: _enum(["read", "unreadable"]),
28676
+ ranges: array(RecordingRangeSchema).readonly()
28677
+ });
28678
+ /**
28679
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
28680
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
28681
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
28682
+ * the date-picker's day dots must not spell them the same.
28683
+ */
28684
+ var RecordingDaysForDeviceSchema = object({
28685
+ deviceId: number(),
28686
+ read: _enum(["read", "unreadable"]),
28687
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28688
+ days: array(number()).readonly()
28689
+ });
28629
28690
  var RecordingManifestSchema = object({
28630
28691
  deviceId: number(),
28631
28692
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -28860,6 +28921,13 @@ method(object({
28860
28921
  }), RecordingAvailabilitySchema, {
28861
28922
  kind: "query",
28862
28923
  auth: "protected"
28924
+ }), method(object({
28925
+ deviceIds: array(number()).min(1).max(200),
28926
+ fromMs: number(),
28927
+ toMs: number()
28928
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
28929
+ kind: "query",
28930
+ auth: "protected"
28863
28931
  }), method(object({
28864
28932
  deviceId: number(),
28865
28933
  fromMs: number(),
@@ -28868,6 +28936,14 @@ method(object({
28868
28936
  }), RecordingDaysSchema, {
28869
28937
  kind: "query",
28870
28938
  auth: "protected"
28939
+ }), method(object({
28940
+ deviceIds: array(number()).min(1).max(200),
28941
+ fromMs: number(),
28942
+ toMs: number(),
28943
+ tzOffsetMinutes: number()
28944
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
28945
+ kind: "query",
28946
+ auth: "protected"
28871
28947
  }), method(object({
28872
28948
  deviceId: number(),
28873
28949
  fromMs: number(),
@@ -35764,6 +35840,12 @@ Object.freeze({
35764
35840
  addonId: null,
35765
35841
  access: "view"
35766
35842
  },
35843
+ "pipelineAnalytics.getEventDensityBatch": {
35844
+ capName: "pipeline-analytics",
35845
+ capScope: "device",
35846
+ addonId: null,
35847
+ access: "view"
35848
+ },
35767
35849
  "pipelineAnalytics.getEventMedia": {
35768
35850
  capName: "pipeline-analytics",
35769
35851
  capScope: "device",
@@ -36886,12 +36968,24 @@ Object.freeze({
36886
36968
  addonId: null,
36887
36969
  access: "view"
36888
36970
  },
36971
+ "recording.getAvailabilityBatch": {
36972
+ capName: "recording",
36973
+ capScope: "system",
36974
+ addonId: null,
36975
+ access: "view"
36976
+ },
36889
36977
  "recording.getDaysWithRecordings": {
36890
36978
  capName: "recording",
36891
36979
  capScope: "system",
36892
36980
  addonId: null,
36893
36981
  access: "view"
36894
36982
  },
36983
+ "recording.getDaysWithRecordingsBatch": {
36984
+ capName: "recording",
36985
+ capScope: "system",
36986
+ addonId: null,
36987
+ access: "view"
36988
+ },
36895
36989
  "recording.getDeviceConfig": {
36896
36990
  capName: "recording",
36897
36991
  capScope: "system",
@@ -39496,6 +39590,11 @@ Object.freeze({
39496
39590
  form: "single",
39497
39591
  optional: false
39498
39592
  }],
39593
+ "pipelineAnalytics.getEventDensityBatch": [{
39594
+ name: "deviceIds",
39595
+ form: "array",
39596
+ optional: false
39597
+ }],
39499
39598
  "pipelineAnalytics.getEventMedia": [{
39500
39599
  name: "deviceId",
39501
39600
  form: "single",
@@ -39911,11 +40010,21 @@ Object.freeze({
39911
40010
  form: "single",
39912
40011
  optional: false
39913
40012
  }],
40013
+ "recording.getAvailabilityBatch": [{
40014
+ name: "deviceIds",
40015
+ form: "array",
40016
+ optional: false
40017
+ }],
39914
40018
  "recording.getDaysWithRecordings": [{
39915
40019
  name: "deviceId",
39916
40020
  form: "single",
39917
40021
  optional: false
39918
40022
  }],
40023
+ "recording.getDaysWithRecordingsBatch": [{
40024
+ name: "deviceIds",
40025
+ form: "array",
40026
+ optional: false
40027
+ }],
39919
40028
  "recording.getDeviceConfig": [{
39920
40029
  name: "deviceId",
39921
40030
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-matter-broker",
3
- "version": "0.2.50",
3
+ "version": "0.2.51",
4
4
  "description": "Matter broker addon for CamStack — owns a Matter fabric (commissioning + the long-lived controller) via the matter.js controller and brokers commissioned Matter nodes into CamStack",
5
5
  "keywords": [
6
6
  "camstack",