@camstack/addon-provider-unifi 0.2.50 → 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
@@ -15875,6 +15875,8 @@ var NcSystemEventKindSchema = _enum([
15875
15875
  "device-offline",
15876
15876
  "device-disabled",
15877
15877
  "device-enabled",
15878
+ "device-battery-low",
15879
+ "device-battery-normal",
15878
15880
  "stream-online",
15879
15881
  "stream-offline",
15880
15882
  "node-online",
@@ -19189,6 +19191,34 @@ var KeyEventsForDeviceSchema = object({
19189
19191
  deviceId: number(),
19190
19192
  events: array(KeyEventSchema).readonly()
19191
19193
  });
19194
+ /** One non-empty bucket of the timeline histogram. */
19195
+ var EventDensityBucketSchema = object({
19196
+ bucketStart: number(),
19197
+ motion: number().int(),
19198
+ object: number().int(),
19199
+ audio: number().int()
19200
+ });
19201
+ /**
19202
+ * One camera's row in a `getEventDensityBatch` answer.
19203
+ *
19204
+ * TWO facts, and the timeline draws them differently:
19205
+ *
19206
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
19207
+ * claim: read, and nothing happened in the window.
19208
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
19209
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
19210
+ * not quiet.
19211
+ *
19212
+ * Fanned out per camera the difference was free — one query rejected while the
19213
+ * others resolved — and collapsing to a batch is the exact moment it is lost
19214
+ * silently. Every requested id gets a row: a caller that asked for twelve and
19215
+ * got eleven cannot tell which one is missing, or that any is.
19216
+ */
19217
+ var EventDensityForDeviceSchema = object({
19218
+ deviceId: number(),
19219
+ read: _enum(["read", "unreadable"]),
19220
+ buckets: array(EventDensityBucketSchema).readonly()
19221
+ });
19192
19222
  object({
19193
19223
  trackId: string(),
19194
19224
  className: string(),
@@ -19499,12 +19529,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19499
19529
  since: number(),
19500
19530
  until: number(),
19501
19531
  bucketMs: number().int().positive()
19502
- }), array(object({
19503
- bucketStart: number(),
19504
- motion: number().int(),
19505
- object: number().int(),
19506
- audio: number().int()
19507
- })).readonly()), method(object({
19532
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19533
+ deviceIds: array(number()).min(1).max(200),
19534
+ since: number(),
19535
+ until: number(),
19536
+ bucketMs: number().int().positive()
19537
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19508
19538
  deviceId: number(),
19509
19539
  cutoffMs: number()
19510
19540
  }), object({
@@ -28546,6 +28576,39 @@ var RecordingDaysSchema = object({
28546
28576
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28547
28577
  days: array(number())
28548
28578
  });
28579
+ /**
28580
+ * One camera's row in a `getAvailabilityBatch` answer.
28581
+ *
28582
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
28583
+ * batch collapses the transport, not the work — plus the one thing the singular
28584
+ * method never had to say:
28585
+ *
28586
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
28587
+ * no footage in the window", which is a real claim.
28588
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
28589
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
28590
+ * that emptiness means NOTHING.
28591
+ *
28592
+ * A timeline that renders the second as the first tells an operator there is no
28593
+ * footage when the truth is that nobody looked.
28594
+ */
28595
+ var RecordingAvailabilityForDeviceSchema = object({
28596
+ deviceId: number(),
28597
+ read: _enum(["read", "unreadable"]),
28598
+ ranges: array(RecordingRangeSchema).readonly()
28599
+ });
28600
+ /**
28601
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
28602
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
28603
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
28604
+ * the date-picker's day dots must not spell them the same.
28605
+ */
28606
+ var RecordingDaysForDeviceSchema = object({
28607
+ deviceId: number(),
28608
+ read: _enum(["read", "unreadable"]),
28609
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28610
+ days: array(number()).readonly()
28611
+ });
28549
28612
  var RecordingManifestSchema = object({
28550
28613
  deviceId: number(),
28551
28614
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -28780,6 +28843,13 @@ method(object({
28780
28843
  }), RecordingAvailabilitySchema, {
28781
28844
  kind: "query",
28782
28845
  auth: "protected"
28846
+ }), method(object({
28847
+ deviceIds: array(number()).min(1).max(200),
28848
+ fromMs: number(),
28849
+ toMs: number()
28850
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
28851
+ kind: "query",
28852
+ auth: "protected"
28783
28853
  }), method(object({
28784
28854
  deviceId: number(),
28785
28855
  fromMs: number(),
@@ -28788,6 +28858,14 @@ method(object({
28788
28858
  }), RecordingDaysSchema, {
28789
28859
  kind: "query",
28790
28860
  auth: "protected"
28861
+ }), method(object({
28862
+ deviceIds: array(number()).min(1).max(200),
28863
+ fromMs: number(),
28864
+ toMs: number(),
28865
+ tzOffsetMinutes: number()
28866
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
28867
+ kind: "query",
28868
+ auth: "protected"
28791
28869
  }), method(object({
28792
28870
  deviceId: number(),
28793
28871
  fromMs: number(),
@@ -35684,6 +35762,12 @@ Object.freeze({
35684
35762
  addonId: null,
35685
35763
  access: "view"
35686
35764
  },
35765
+ "pipelineAnalytics.getEventDensityBatch": {
35766
+ capName: "pipeline-analytics",
35767
+ capScope: "device",
35768
+ addonId: null,
35769
+ access: "view"
35770
+ },
35687
35771
  "pipelineAnalytics.getEventMedia": {
35688
35772
  capName: "pipeline-analytics",
35689
35773
  capScope: "device",
@@ -36806,12 +36890,24 @@ Object.freeze({
36806
36890
  addonId: null,
36807
36891
  access: "view"
36808
36892
  },
36893
+ "recording.getAvailabilityBatch": {
36894
+ capName: "recording",
36895
+ capScope: "system",
36896
+ addonId: null,
36897
+ access: "view"
36898
+ },
36809
36899
  "recording.getDaysWithRecordings": {
36810
36900
  capName: "recording",
36811
36901
  capScope: "system",
36812
36902
  addonId: null,
36813
36903
  access: "view"
36814
36904
  },
36905
+ "recording.getDaysWithRecordingsBatch": {
36906
+ capName: "recording",
36907
+ capScope: "system",
36908
+ addonId: null,
36909
+ access: "view"
36910
+ },
36815
36911
  "recording.getDeviceConfig": {
36816
36912
  capName: "recording",
36817
36913
  capScope: "system",
@@ -39416,6 +39512,11 @@ Object.freeze({
39416
39512
  form: "single",
39417
39513
  optional: false
39418
39514
  }],
39515
+ "pipelineAnalytics.getEventDensityBatch": [{
39516
+ name: "deviceIds",
39517
+ form: "array",
39518
+ optional: false
39519
+ }],
39419
39520
  "pipelineAnalytics.getEventMedia": [{
39420
39521
  name: "deviceId",
39421
39522
  form: "single",
@@ -39831,11 +39932,21 @@ Object.freeze({
39831
39932
  form: "single",
39832
39933
  optional: false
39833
39934
  }],
39935
+ "recording.getAvailabilityBatch": [{
39936
+ name: "deviceIds",
39937
+ form: "array",
39938
+ optional: false
39939
+ }],
39834
39940
  "recording.getDaysWithRecordings": [{
39835
39941
  name: "deviceId",
39836
39942
  form: "single",
39837
39943
  optional: false
39838
39944
  }],
39945
+ "recording.getDaysWithRecordingsBatch": [{
39946
+ name: "deviceIds",
39947
+ form: "array",
39948
+ optional: false
39949
+ }],
39839
39950
  "recording.getDeviceConfig": [{
39840
39951
  name: "deviceId",
39841
39952
  form: "single",
package/dist/addon.mjs CHANGED
@@ -15874,6 +15874,8 @@ var NcSystemEventKindSchema = _enum([
15874
15874
  "device-offline",
15875
15875
  "device-disabled",
15876
15876
  "device-enabled",
15877
+ "device-battery-low",
15878
+ "device-battery-normal",
15877
15879
  "stream-online",
15878
15880
  "stream-offline",
15879
15881
  "node-online",
@@ -19188,6 +19190,34 @@ var KeyEventsForDeviceSchema = object({
19188
19190
  deviceId: number(),
19189
19191
  events: array(KeyEventSchema).readonly()
19190
19192
  });
19193
+ /** One non-empty bucket of the timeline histogram. */
19194
+ var EventDensityBucketSchema = object({
19195
+ bucketStart: number(),
19196
+ motion: number().int(),
19197
+ object: number().int(),
19198
+ audio: number().int()
19199
+ });
19200
+ /**
19201
+ * One camera's row in a `getEventDensityBatch` answer.
19202
+ *
19203
+ * TWO facts, and the timeline draws them differently:
19204
+ *
19205
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
19206
+ * claim: read, and nothing happened in the window.
19207
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
19208
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
19209
+ * not quiet.
19210
+ *
19211
+ * Fanned out per camera the difference was free — one query rejected while the
19212
+ * others resolved — and collapsing to a batch is the exact moment it is lost
19213
+ * silently. Every requested id gets a row: a caller that asked for twelve and
19214
+ * got eleven cannot tell which one is missing, or that any is.
19215
+ */
19216
+ var EventDensityForDeviceSchema = object({
19217
+ deviceId: number(),
19218
+ read: _enum(["read", "unreadable"]),
19219
+ buckets: array(EventDensityBucketSchema).readonly()
19220
+ });
19191
19221
  object({
19192
19222
  trackId: string(),
19193
19223
  className: string(),
@@ -19498,12 +19528,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19498
19528
  since: number(),
19499
19529
  until: number(),
19500
19530
  bucketMs: number().int().positive()
19501
- }), array(object({
19502
- bucketStart: number(),
19503
- motion: number().int(),
19504
- object: number().int(),
19505
- audio: number().int()
19506
- })).readonly()), method(object({
19531
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19532
+ deviceIds: array(number()).min(1).max(200),
19533
+ since: number(),
19534
+ until: number(),
19535
+ bucketMs: number().int().positive()
19536
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19507
19537
  deviceId: number(),
19508
19538
  cutoffMs: number()
19509
19539
  }), object({
@@ -28545,6 +28575,39 @@ var RecordingDaysSchema = object({
28545
28575
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28546
28576
  days: array(number())
28547
28577
  });
28578
+ /**
28579
+ * One camera's row in a `getAvailabilityBatch` answer.
28580
+ *
28581
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
28582
+ * batch collapses the transport, not the work — plus the one thing the singular
28583
+ * method never had to say:
28584
+ *
28585
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
28586
+ * no footage in the window", which is a real claim.
28587
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
28588
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
28589
+ * that emptiness means NOTHING.
28590
+ *
28591
+ * A timeline that renders the second as the first tells an operator there is no
28592
+ * footage when the truth is that nobody looked.
28593
+ */
28594
+ var RecordingAvailabilityForDeviceSchema = object({
28595
+ deviceId: number(),
28596
+ read: _enum(["read", "unreadable"]),
28597
+ ranges: array(RecordingRangeSchema).readonly()
28598
+ });
28599
+ /**
28600
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
28601
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
28602
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
28603
+ * the date-picker's day dots must not spell them the same.
28604
+ */
28605
+ var RecordingDaysForDeviceSchema = object({
28606
+ deviceId: number(),
28607
+ read: _enum(["read", "unreadable"]),
28608
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28609
+ days: array(number()).readonly()
28610
+ });
28548
28611
  var RecordingManifestSchema = object({
28549
28612
  deviceId: number(),
28550
28613
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -28779,6 +28842,13 @@ method(object({
28779
28842
  }), RecordingAvailabilitySchema, {
28780
28843
  kind: "query",
28781
28844
  auth: "protected"
28845
+ }), method(object({
28846
+ deviceIds: array(number()).min(1).max(200),
28847
+ fromMs: number(),
28848
+ toMs: number()
28849
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
28850
+ kind: "query",
28851
+ auth: "protected"
28782
28852
  }), method(object({
28783
28853
  deviceId: number(),
28784
28854
  fromMs: number(),
@@ -28787,6 +28857,14 @@ method(object({
28787
28857
  }), RecordingDaysSchema, {
28788
28858
  kind: "query",
28789
28859
  auth: "protected"
28860
+ }), method(object({
28861
+ deviceIds: array(number()).min(1).max(200),
28862
+ fromMs: number(),
28863
+ toMs: number(),
28864
+ tzOffsetMinutes: number()
28865
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
28866
+ kind: "query",
28867
+ auth: "protected"
28790
28868
  }), method(object({
28791
28869
  deviceId: number(),
28792
28870
  fromMs: number(),
@@ -35683,6 +35761,12 @@ Object.freeze({
35683
35761
  addonId: null,
35684
35762
  access: "view"
35685
35763
  },
35764
+ "pipelineAnalytics.getEventDensityBatch": {
35765
+ capName: "pipeline-analytics",
35766
+ capScope: "device",
35767
+ addonId: null,
35768
+ access: "view"
35769
+ },
35686
35770
  "pipelineAnalytics.getEventMedia": {
35687
35771
  capName: "pipeline-analytics",
35688
35772
  capScope: "device",
@@ -36805,12 +36889,24 @@ Object.freeze({
36805
36889
  addonId: null,
36806
36890
  access: "view"
36807
36891
  },
36892
+ "recording.getAvailabilityBatch": {
36893
+ capName: "recording",
36894
+ capScope: "system",
36895
+ addonId: null,
36896
+ access: "view"
36897
+ },
36808
36898
  "recording.getDaysWithRecordings": {
36809
36899
  capName: "recording",
36810
36900
  capScope: "system",
36811
36901
  addonId: null,
36812
36902
  access: "view"
36813
36903
  },
36904
+ "recording.getDaysWithRecordingsBatch": {
36905
+ capName: "recording",
36906
+ capScope: "system",
36907
+ addonId: null,
36908
+ access: "view"
36909
+ },
36814
36910
  "recording.getDeviceConfig": {
36815
36911
  capName: "recording",
36816
36912
  capScope: "system",
@@ -39415,6 +39511,11 @@ Object.freeze({
39415
39511
  form: "single",
39416
39512
  optional: false
39417
39513
  }],
39514
+ "pipelineAnalytics.getEventDensityBatch": [{
39515
+ name: "deviceIds",
39516
+ form: "array",
39517
+ optional: false
39518
+ }],
39418
39519
  "pipelineAnalytics.getEventMedia": [{
39419
39520
  name: "deviceId",
39420
39521
  form: "single",
@@ -39830,11 +39931,21 @@ Object.freeze({
39830
39931
  form: "single",
39831
39932
  optional: false
39832
39933
  }],
39934
+ "recording.getAvailabilityBatch": [{
39935
+ name: "deviceIds",
39936
+ form: "array",
39937
+ optional: false
39938
+ }],
39833
39939
  "recording.getDaysWithRecordings": [{
39834
39940
  name: "deviceId",
39835
39941
  form: "single",
39836
39942
  optional: false
39837
39943
  }],
39944
+ "recording.getDaysWithRecordingsBatch": [{
39945
+ name: "deviceIds",
39946
+ form: "array",
39947
+ optional: false
39948
+ }],
39838
39949
  "recording.getDeviceConfig": [{
39839
39950
  name: "deviceId",
39840
39951
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-unifi",
3
- "version": "0.2.50",
3
+ "version": "0.2.52",
4
4
  "description": "UniFi Network controller device-provider addon for CamStack — local-controller infra switches/APs (as containers) + network-client presence. NO cameras/Protect.",
5
5
  "keywords": [
6
6
  "camstack",