@camstack/addon-provider-rademacher 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
@@ -20176,6 +20176,34 @@ var KeyEventsForDeviceSchema = object({
20176
20176
  deviceId: number(),
20177
20177
  events: array(KeyEventSchema).readonly()
20178
20178
  });
20179
+ /** One non-empty bucket of the timeline histogram. */
20180
+ var EventDensityBucketSchema = object({
20181
+ bucketStart: number(),
20182
+ motion: number().int(),
20183
+ object: number().int(),
20184
+ audio: number().int()
20185
+ });
20186
+ /**
20187
+ * One camera's row in a `getEventDensityBatch` answer.
20188
+ *
20189
+ * TWO facts, and the timeline draws them differently:
20190
+ *
20191
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
20192
+ * claim: read, and nothing happened in the window.
20193
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
20194
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
20195
+ * not quiet.
20196
+ *
20197
+ * Fanned out per camera the difference was free — one query rejected while the
20198
+ * others resolved — and collapsing to a batch is the exact moment it is lost
20199
+ * silently. Every requested id gets a row: a caller that asked for twelve and
20200
+ * got eleven cannot tell which one is missing, or that any is.
20201
+ */
20202
+ var EventDensityForDeviceSchema = object({
20203
+ deviceId: number(),
20204
+ read: _enum(["read", "unreadable"]),
20205
+ buckets: array(EventDensityBucketSchema).readonly()
20206
+ });
20179
20207
  object({
20180
20208
  trackId: string(),
20181
20209
  className: string(),
@@ -20486,12 +20514,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20486
20514
  since: number(),
20487
20515
  until: number(),
20488
20516
  bucketMs: number().int().positive()
20489
- }), array(object({
20490
- bucketStart: number(),
20491
- motion: number().int(),
20492
- object: number().int(),
20493
- audio: number().int()
20494
- })).readonly()), method(object({
20517
+ }), array(EventDensityBucketSchema).readonly()), method(object({
20518
+ deviceIds: array(number()).min(1).max(200),
20519
+ since: number(),
20520
+ until: number(),
20521
+ bucketMs: number().int().positive()
20522
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
20495
20523
  deviceId: number(),
20496
20524
  cutoffMs: number()
20497
20525
  }), object({
@@ -29516,6 +29544,39 @@ var RecordingDaysSchema = object({
29516
29544
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
29517
29545
  days: array(number())
29518
29546
  });
29547
+ /**
29548
+ * One camera's row in a `getAvailabilityBatch` answer.
29549
+ *
29550
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
29551
+ * batch collapses the transport, not the work — plus the one thing the singular
29552
+ * method never had to say:
29553
+ *
29554
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
29555
+ * no footage in the window", which is a real claim.
29556
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
29557
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
29558
+ * that emptiness means NOTHING.
29559
+ *
29560
+ * A timeline that renders the second as the first tells an operator there is no
29561
+ * footage when the truth is that nobody looked.
29562
+ */
29563
+ var RecordingAvailabilityForDeviceSchema = object({
29564
+ deviceId: number(),
29565
+ read: _enum(["read", "unreadable"]),
29566
+ ranges: array(RecordingRangeSchema).readonly()
29567
+ });
29568
+ /**
29569
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
29570
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
29571
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
29572
+ * the date-picker's day dots must not spell them the same.
29573
+ */
29574
+ var RecordingDaysForDeviceSchema = object({
29575
+ deviceId: number(),
29576
+ read: _enum(["read", "unreadable"]),
29577
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
29578
+ days: array(number()).readonly()
29579
+ });
29519
29580
  var RecordingManifestSchema = object({
29520
29581
  deviceId: number(),
29521
29582
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -29750,6 +29811,13 @@ method(object({
29750
29811
  }), RecordingAvailabilitySchema, {
29751
29812
  kind: "query",
29752
29813
  auth: "protected"
29814
+ }), method(object({
29815
+ deviceIds: array(number()).min(1).max(200),
29816
+ fromMs: number(),
29817
+ toMs: number()
29818
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
29819
+ kind: "query",
29820
+ auth: "protected"
29753
29821
  }), method(object({
29754
29822
  deviceId: number(),
29755
29823
  fromMs: number(),
@@ -29758,6 +29826,14 @@ method(object({
29758
29826
  }), RecordingDaysSchema, {
29759
29827
  kind: "query",
29760
29828
  auth: "protected"
29829
+ }), method(object({
29830
+ deviceIds: array(number()).min(1).max(200),
29831
+ fromMs: number(),
29832
+ toMs: number(),
29833
+ tzOffsetMinutes: number()
29834
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
29835
+ kind: "query",
29836
+ auth: "protected"
29761
29837
  }), method(object({
29762
29838
  deviceId: number(),
29763
29839
  fromMs: number(),
@@ -36654,6 +36730,12 @@ Object.freeze({
36654
36730
  addonId: null,
36655
36731
  access: "view"
36656
36732
  },
36733
+ "pipelineAnalytics.getEventDensityBatch": {
36734
+ capName: "pipeline-analytics",
36735
+ capScope: "device",
36736
+ addonId: null,
36737
+ access: "view"
36738
+ },
36657
36739
  "pipelineAnalytics.getEventMedia": {
36658
36740
  capName: "pipeline-analytics",
36659
36741
  capScope: "device",
@@ -37776,12 +37858,24 @@ Object.freeze({
37776
37858
  addonId: null,
37777
37859
  access: "view"
37778
37860
  },
37861
+ "recording.getAvailabilityBatch": {
37862
+ capName: "recording",
37863
+ capScope: "system",
37864
+ addonId: null,
37865
+ access: "view"
37866
+ },
37779
37867
  "recording.getDaysWithRecordings": {
37780
37868
  capName: "recording",
37781
37869
  capScope: "system",
37782
37870
  addonId: null,
37783
37871
  access: "view"
37784
37872
  },
37873
+ "recording.getDaysWithRecordingsBatch": {
37874
+ capName: "recording",
37875
+ capScope: "system",
37876
+ addonId: null,
37877
+ access: "view"
37878
+ },
37785
37879
  "recording.getDeviceConfig": {
37786
37880
  capName: "recording",
37787
37881
  capScope: "system",
@@ -40386,6 +40480,11 @@ Object.freeze({
40386
40480
  form: "single",
40387
40481
  optional: false
40388
40482
  }],
40483
+ "pipelineAnalytics.getEventDensityBatch": [{
40484
+ name: "deviceIds",
40485
+ form: "array",
40486
+ optional: false
40487
+ }],
40389
40488
  "pipelineAnalytics.getEventMedia": [{
40390
40489
  name: "deviceId",
40391
40490
  form: "single",
@@ -40801,11 +40900,21 @@ Object.freeze({
40801
40900
  form: "single",
40802
40901
  optional: false
40803
40902
  }],
40903
+ "recording.getAvailabilityBatch": [{
40904
+ name: "deviceIds",
40905
+ form: "array",
40906
+ optional: false
40907
+ }],
40804
40908
  "recording.getDaysWithRecordings": [{
40805
40909
  name: "deviceId",
40806
40910
  form: "single",
40807
40911
  optional: false
40808
40912
  }],
40913
+ "recording.getDaysWithRecordingsBatch": [{
40914
+ name: "deviceIds",
40915
+ form: "array",
40916
+ optional: false
40917
+ }],
40809
40918
  "recording.getDeviceConfig": [{
40810
40919
  name: "deviceId",
40811
40920
  form: "single",
package/dist/addon.mjs CHANGED
@@ -20175,6 +20175,34 @@ var KeyEventsForDeviceSchema = object({
20175
20175
  deviceId: number(),
20176
20176
  events: array(KeyEventSchema).readonly()
20177
20177
  });
20178
+ /** One non-empty bucket of the timeline histogram. */
20179
+ var EventDensityBucketSchema = object({
20180
+ bucketStart: number(),
20181
+ motion: number().int(),
20182
+ object: number().int(),
20183
+ audio: number().int()
20184
+ });
20185
+ /**
20186
+ * One camera's row in a `getEventDensityBatch` answer.
20187
+ *
20188
+ * TWO facts, and the timeline draws them differently:
20189
+ *
20190
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
20191
+ * claim: read, and nothing happened in the window.
20192
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
20193
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
20194
+ * not quiet.
20195
+ *
20196
+ * Fanned out per camera the difference was free — one query rejected while the
20197
+ * others resolved — and collapsing to a batch is the exact moment it is lost
20198
+ * silently. Every requested id gets a row: a caller that asked for twelve and
20199
+ * got eleven cannot tell which one is missing, or that any is.
20200
+ */
20201
+ var EventDensityForDeviceSchema = object({
20202
+ deviceId: number(),
20203
+ read: _enum(["read", "unreadable"]),
20204
+ buckets: array(EventDensityBucketSchema).readonly()
20205
+ });
20178
20206
  object({
20179
20207
  trackId: string(),
20180
20208
  className: string(),
@@ -20485,12 +20513,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20485
20513
  since: number(),
20486
20514
  until: number(),
20487
20515
  bucketMs: number().int().positive()
20488
- }), array(object({
20489
- bucketStart: number(),
20490
- motion: number().int(),
20491
- object: number().int(),
20492
- audio: number().int()
20493
- })).readonly()), method(object({
20516
+ }), array(EventDensityBucketSchema).readonly()), method(object({
20517
+ deviceIds: array(number()).min(1).max(200),
20518
+ since: number(),
20519
+ until: number(),
20520
+ bucketMs: number().int().positive()
20521
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
20494
20522
  deviceId: number(),
20495
20523
  cutoffMs: number()
20496
20524
  }), object({
@@ -29515,6 +29543,39 @@ var RecordingDaysSchema = object({
29515
29543
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
29516
29544
  days: array(number())
29517
29545
  });
29546
+ /**
29547
+ * One camera's row in a `getAvailabilityBatch` answer.
29548
+ *
29549
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
29550
+ * batch collapses the transport, not the work — plus the one thing the singular
29551
+ * method never had to say:
29552
+ *
29553
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
29554
+ * no footage in the window", which is a real claim.
29555
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
29556
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
29557
+ * that emptiness means NOTHING.
29558
+ *
29559
+ * A timeline that renders the second as the first tells an operator there is no
29560
+ * footage when the truth is that nobody looked.
29561
+ */
29562
+ var RecordingAvailabilityForDeviceSchema = object({
29563
+ deviceId: number(),
29564
+ read: _enum(["read", "unreadable"]),
29565
+ ranges: array(RecordingRangeSchema).readonly()
29566
+ });
29567
+ /**
29568
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
29569
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
29570
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
29571
+ * the date-picker's day dots must not spell them the same.
29572
+ */
29573
+ var RecordingDaysForDeviceSchema = object({
29574
+ deviceId: number(),
29575
+ read: _enum(["read", "unreadable"]),
29576
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
29577
+ days: array(number()).readonly()
29578
+ });
29518
29579
  var RecordingManifestSchema = object({
29519
29580
  deviceId: number(),
29520
29581
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -29749,6 +29810,13 @@ method(object({
29749
29810
  }), RecordingAvailabilitySchema, {
29750
29811
  kind: "query",
29751
29812
  auth: "protected"
29813
+ }), method(object({
29814
+ deviceIds: array(number()).min(1).max(200),
29815
+ fromMs: number(),
29816
+ toMs: number()
29817
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
29818
+ kind: "query",
29819
+ auth: "protected"
29752
29820
  }), method(object({
29753
29821
  deviceId: number(),
29754
29822
  fromMs: number(),
@@ -29757,6 +29825,14 @@ method(object({
29757
29825
  }), RecordingDaysSchema, {
29758
29826
  kind: "query",
29759
29827
  auth: "protected"
29828
+ }), method(object({
29829
+ deviceIds: array(number()).min(1).max(200),
29830
+ fromMs: number(),
29831
+ toMs: number(),
29832
+ tzOffsetMinutes: number()
29833
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
29834
+ kind: "query",
29835
+ auth: "protected"
29760
29836
  }), method(object({
29761
29837
  deviceId: number(),
29762
29838
  fromMs: number(),
@@ -36653,6 +36729,12 @@ Object.freeze({
36653
36729
  addonId: null,
36654
36730
  access: "view"
36655
36731
  },
36732
+ "pipelineAnalytics.getEventDensityBatch": {
36733
+ capName: "pipeline-analytics",
36734
+ capScope: "device",
36735
+ addonId: null,
36736
+ access: "view"
36737
+ },
36656
36738
  "pipelineAnalytics.getEventMedia": {
36657
36739
  capName: "pipeline-analytics",
36658
36740
  capScope: "device",
@@ -37775,12 +37857,24 @@ Object.freeze({
37775
37857
  addonId: null,
37776
37858
  access: "view"
37777
37859
  },
37860
+ "recording.getAvailabilityBatch": {
37861
+ capName: "recording",
37862
+ capScope: "system",
37863
+ addonId: null,
37864
+ access: "view"
37865
+ },
37778
37866
  "recording.getDaysWithRecordings": {
37779
37867
  capName: "recording",
37780
37868
  capScope: "system",
37781
37869
  addonId: null,
37782
37870
  access: "view"
37783
37871
  },
37872
+ "recording.getDaysWithRecordingsBatch": {
37873
+ capName: "recording",
37874
+ capScope: "system",
37875
+ addonId: null,
37876
+ access: "view"
37877
+ },
37784
37878
  "recording.getDeviceConfig": {
37785
37879
  capName: "recording",
37786
37880
  capScope: "system",
@@ -40385,6 +40479,11 @@ Object.freeze({
40385
40479
  form: "single",
40386
40480
  optional: false
40387
40481
  }],
40482
+ "pipelineAnalytics.getEventDensityBatch": [{
40483
+ name: "deviceIds",
40484
+ form: "array",
40485
+ optional: false
40486
+ }],
40388
40487
  "pipelineAnalytics.getEventMedia": [{
40389
40488
  name: "deviceId",
40390
40489
  form: "single",
@@ -40800,11 +40899,21 @@ Object.freeze({
40800
40899
  form: "single",
40801
40900
  optional: false
40802
40901
  }],
40902
+ "recording.getAvailabilityBatch": [{
40903
+ name: "deviceIds",
40904
+ form: "array",
40905
+ optional: false
40906
+ }],
40803
40907
  "recording.getDaysWithRecordings": [{
40804
40908
  name: "deviceId",
40805
40909
  form: "single",
40806
40910
  optional: false
40807
40911
  }],
40912
+ "recording.getDaysWithRecordingsBatch": [{
40913
+ name: "deviceIds",
40914
+ form: "array",
40915
+ optional: false
40916
+ }],
40808
40917
  "recording.getDeviceConfig": [{
40809
40918
  name: "deviceId",
40810
40919
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-rademacher",
3
- "version": "0.2.50",
3
+ "version": "0.2.51",
4
4
  "description": "Rademacher HomePilot device-provider addon for CamStack — wraps the @apocaliss92/noderademacher local-hub client (roller shutters over the cover cap)",
5
5
  "keywords": [
6
6
  "camstack",