@camstack/addon-provider-velux 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
@@ -19191,6 +19191,34 @@ var KeyEventsForDeviceSchema = object({
19191
19191
  deviceId: number(),
19192
19192
  events: array(KeyEventSchema).readonly()
19193
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
+ });
19194
19222
  object({
19195
19223
  trackId: string(),
19196
19224
  className: string(),
@@ -19501,12 +19529,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19501
19529
  since: number(),
19502
19530
  until: number(),
19503
19531
  bucketMs: number().int().positive()
19504
- }), array(object({
19505
- bucketStart: number(),
19506
- motion: number().int(),
19507
- object: number().int(),
19508
- audio: number().int()
19509
- })).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({
19510
19538
  deviceId: number(),
19511
19539
  cutoffMs: number()
19512
19540
  }), object({
@@ -28531,6 +28559,39 @@ var RecordingDaysSchema = object({
28531
28559
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28532
28560
  days: array(number())
28533
28561
  });
28562
+ /**
28563
+ * One camera's row in a `getAvailabilityBatch` answer.
28564
+ *
28565
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
28566
+ * batch collapses the transport, not the work — plus the one thing the singular
28567
+ * method never had to say:
28568
+ *
28569
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
28570
+ * no footage in the window", which is a real claim.
28571
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
28572
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
28573
+ * that emptiness means NOTHING.
28574
+ *
28575
+ * A timeline that renders the second as the first tells an operator there is no
28576
+ * footage when the truth is that nobody looked.
28577
+ */
28578
+ var RecordingAvailabilityForDeviceSchema = object({
28579
+ deviceId: number(),
28580
+ read: _enum(["read", "unreadable"]),
28581
+ ranges: array(RecordingRangeSchema).readonly()
28582
+ });
28583
+ /**
28584
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
28585
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
28586
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
28587
+ * the date-picker's day dots must not spell them the same.
28588
+ */
28589
+ var RecordingDaysForDeviceSchema = object({
28590
+ deviceId: number(),
28591
+ read: _enum(["read", "unreadable"]),
28592
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28593
+ days: array(number()).readonly()
28594
+ });
28534
28595
  var RecordingManifestSchema = object({
28535
28596
  deviceId: number(),
28536
28597
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -28765,6 +28826,13 @@ method(object({
28765
28826
  }), RecordingAvailabilitySchema, {
28766
28827
  kind: "query",
28767
28828
  auth: "protected"
28829
+ }), method(object({
28830
+ deviceIds: array(number()).min(1).max(200),
28831
+ fromMs: number(),
28832
+ toMs: number()
28833
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
28834
+ kind: "query",
28835
+ auth: "protected"
28768
28836
  }), method(object({
28769
28837
  deviceId: number(),
28770
28838
  fromMs: number(),
@@ -28773,6 +28841,14 @@ method(object({
28773
28841
  }), RecordingDaysSchema, {
28774
28842
  kind: "query",
28775
28843
  auth: "protected"
28844
+ }), method(object({
28845
+ deviceIds: array(number()).min(1).max(200),
28846
+ fromMs: number(),
28847
+ toMs: number(),
28848
+ tzOffsetMinutes: number()
28849
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
28850
+ kind: "query",
28851
+ auth: "protected"
28776
28852
  }), method(object({
28777
28853
  deviceId: number(),
28778
28854
  fromMs: number(),
@@ -35669,6 +35745,12 @@ Object.freeze({
35669
35745
  addonId: null,
35670
35746
  access: "view"
35671
35747
  },
35748
+ "pipelineAnalytics.getEventDensityBatch": {
35749
+ capName: "pipeline-analytics",
35750
+ capScope: "device",
35751
+ addonId: null,
35752
+ access: "view"
35753
+ },
35672
35754
  "pipelineAnalytics.getEventMedia": {
35673
35755
  capName: "pipeline-analytics",
35674
35756
  capScope: "device",
@@ -36791,12 +36873,24 @@ Object.freeze({
36791
36873
  addonId: null,
36792
36874
  access: "view"
36793
36875
  },
36876
+ "recording.getAvailabilityBatch": {
36877
+ capName: "recording",
36878
+ capScope: "system",
36879
+ addonId: null,
36880
+ access: "view"
36881
+ },
36794
36882
  "recording.getDaysWithRecordings": {
36795
36883
  capName: "recording",
36796
36884
  capScope: "system",
36797
36885
  addonId: null,
36798
36886
  access: "view"
36799
36887
  },
36888
+ "recording.getDaysWithRecordingsBatch": {
36889
+ capName: "recording",
36890
+ capScope: "system",
36891
+ addonId: null,
36892
+ access: "view"
36893
+ },
36800
36894
  "recording.getDeviceConfig": {
36801
36895
  capName: "recording",
36802
36896
  capScope: "system",
@@ -39401,6 +39495,11 @@ Object.freeze({
39401
39495
  form: "single",
39402
39496
  optional: false
39403
39497
  }],
39498
+ "pipelineAnalytics.getEventDensityBatch": [{
39499
+ name: "deviceIds",
39500
+ form: "array",
39501
+ optional: false
39502
+ }],
39404
39503
  "pipelineAnalytics.getEventMedia": [{
39405
39504
  name: "deviceId",
39406
39505
  form: "single",
@@ -39816,11 +39915,21 @@ Object.freeze({
39816
39915
  form: "single",
39817
39916
  optional: false
39818
39917
  }],
39918
+ "recording.getAvailabilityBatch": [{
39919
+ name: "deviceIds",
39920
+ form: "array",
39921
+ optional: false
39922
+ }],
39819
39923
  "recording.getDaysWithRecordings": [{
39820
39924
  name: "deviceId",
39821
39925
  form: "single",
39822
39926
  optional: false
39823
39927
  }],
39928
+ "recording.getDaysWithRecordingsBatch": [{
39929
+ name: "deviceIds",
39930
+ form: "array",
39931
+ optional: false
39932
+ }],
39824
39933
  "recording.getDeviceConfig": [{
39825
39934
  name: "deviceId",
39826
39935
  form: "single",
package/dist/addon.mjs CHANGED
@@ -19190,6 +19190,34 @@ var KeyEventsForDeviceSchema = object({
19190
19190
  deviceId: number(),
19191
19191
  events: array(KeyEventSchema).readonly()
19192
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
+ });
19193
19221
  object({
19194
19222
  trackId: string(),
19195
19223
  className: string(),
@@ -19500,12 +19528,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19500
19528
  since: number(),
19501
19529
  until: number(),
19502
19530
  bucketMs: number().int().positive()
19503
- }), array(object({
19504
- bucketStart: number(),
19505
- motion: number().int(),
19506
- object: number().int(),
19507
- audio: number().int()
19508
- })).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({
19509
19537
  deviceId: number(),
19510
19538
  cutoffMs: number()
19511
19539
  }), object({
@@ -28530,6 +28558,39 @@ var RecordingDaysSchema = object({
28530
28558
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28531
28559
  days: array(number())
28532
28560
  });
28561
+ /**
28562
+ * One camera's row in a `getAvailabilityBatch` answer.
28563
+ *
28564
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
28565
+ * batch collapses the transport, not the work — plus the one thing the singular
28566
+ * method never had to say:
28567
+ *
28568
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
28569
+ * no footage in the window", which is a real claim.
28570
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
28571
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
28572
+ * that emptiness means NOTHING.
28573
+ *
28574
+ * A timeline that renders the second as the first tells an operator there is no
28575
+ * footage when the truth is that nobody looked.
28576
+ */
28577
+ var RecordingAvailabilityForDeviceSchema = object({
28578
+ deviceId: number(),
28579
+ read: _enum(["read", "unreadable"]),
28580
+ ranges: array(RecordingRangeSchema).readonly()
28581
+ });
28582
+ /**
28583
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
28584
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
28585
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
28586
+ * the date-picker's day dots must not spell them the same.
28587
+ */
28588
+ var RecordingDaysForDeviceSchema = object({
28589
+ deviceId: number(),
28590
+ read: _enum(["read", "unreadable"]),
28591
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28592
+ days: array(number()).readonly()
28593
+ });
28533
28594
  var RecordingManifestSchema = object({
28534
28595
  deviceId: number(),
28535
28596
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -28764,6 +28825,13 @@ method(object({
28764
28825
  }), RecordingAvailabilitySchema, {
28765
28826
  kind: "query",
28766
28827
  auth: "protected"
28828
+ }), method(object({
28829
+ deviceIds: array(number()).min(1).max(200),
28830
+ fromMs: number(),
28831
+ toMs: number()
28832
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
28833
+ kind: "query",
28834
+ auth: "protected"
28767
28835
  }), method(object({
28768
28836
  deviceId: number(),
28769
28837
  fromMs: number(),
@@ -28772,6 +28840,14 @@ method(object({
28772
28840
  }), RecordingDaysSchema, {
28773
28841
  kind: "query",
28774
28842
  auth: "protected"
28843
+ }), method(object({
28844
+ deviceIds: array(number()).min(1).max(200),
28845
+ fromMs: number(),
28846
+ toMs: number(),
28847
+ tzOffsetMinutes: number()
28848
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
28849
+ kind: "query",
28850
+ auth: "protected"
28775
28851
  }), method(object({
28776
28852
  deviceId: number(),
28777
28853
  fromMs: number(),
@@ -35668,6 +35744,12 @@ Object.freeze({
35668
35744
  addonId: null,
35669
35745
  access: "view"
35670
35746
  },
35747
+ "pipelineAnalytics.getEventDensityBatch": {
35748
+ capName: "pipeline-analytics",
35749
+ capScope: "device",
35750
+ addonId: null,
35751
+ access: "view"
35752
+ },
35671
35753
  "pipelineAnalytics.getEventMedia": {
35672
35754
  capName: "pipeline-analytics",
35673
35755
  capScope: "device",
@@ -36790,12 +36872,24 @@ Object.freeze({
36790
36872
  addonId: null,
36791
36873
  access: "view"
36792
36874
  },
36875
+ "recording.getAvailabilityBatch": {
36876
+ capName: "recording",
36877
+ capScope: "system",
36878
+ addonId: null,
36879
+ access: "view"
36880
+ },
36793
36881
  "recording.getDaysWithRecordings": {
36794
36882
  capName: "recording",
36795
36883
  capScope: "system",
36796
36884
  addonId: null,
36797
36885
  access: "view"
36798
36886
  },
36887
+ "recording.getDaysWithRecordingsBatch": {
36888
+ capName: "recording",
36889
+ capScope: "system",
36890
+ addonId: null,
36891
+ access: "view"
36892
+ },
36799
36893
  "recording.getDeviceConfig": {
36800
36894
  capName: "recording",
36801
36895
  capScope: "system",
@@ -39400,6 +39494,11 @@ Object.freeze({
39400
39494
  form: "single",
39401
39495
  optional: false
39402
39496
  }],
39497
+ "pipelineAnalytics.getEventDensityBatch": [{
39498
+ name: "deviceIds",
39499
+ form: "array",
39500
+ optional: false
39501
+ }],
39403
39502
  "pipelineAnalytics.getEventMedia": [{
39404
39503
  name: "deviceId",
39405
39504
  form: "single",
@@ -39815,11 +39914,21 @@ Object.freeze({
39815
39914
  form: "single",
39816
39915
  optional: false
39817
39916
  }],
39917
+ "recording.getAvailabilityBatch": [{
39918
+ name: "deviceIds",
39919
+ form: "array",
39920
+ optional: false
39921
+ }],
39818
39922
  "recording.getDaysWithRecordings": [{
39819
39923
  name: "deviceId",
39820
39924
  form: "single",
39821
39925
  optional: false
39822
39926
  }],
39927
+ "recording.getDaysWithRecordingsBatch": [{
39928
+ name: "deviceIds",
39929
+ form: "array",
39930
+ optional: false
39931
+ }],
39823
39932
  "recording.getDeviceConfig": [{
39824
39933
  name: "deviceId",
39825
39934
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-velux",
3
- "version": "0.2.51",
3
+ "version": "0.2.52",
4
4
  "description": "Velux KLF-200 device-provider addon for CamStack — local-gateway window + shutter covers (positional, no tilt)",
5
5
  "keywords": [
6
6
  "camstack",