@camstack/addon-export-alexa 1.2.57 → 1.2.58

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.
@@ -19160,6 +19160,34 @@ var KeyEventsForDeviceSchema = object({
19160
19160
  deviceId: number(),
19161
19161
  events: array(KeyEventSchema).readonly()
19162
19162
  });
19163
+ /** One non-empty bucket of the timeline histogram. */
19164
+ var EventDensityBucketSchema = object({
19165
+ bucketStart: number(),
19166
+ motion: number().int(),
19167
+ object: number().int(),
19168
+ audio: number().int()
19169
+ });
19170
+ /**
19171
+ * One camera's row in a `getEventDensityBatch` answer.
19172
+ *
19173
+ * TWO facts, and the timeline draws them differently:
19174
+ *
19175
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
19176
+ * claim: read, and nothing happened in the window.
19177
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
19178
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
19179
+ * not quiet.
19180
+ *
19181
+ * Fanned out per camera the difference was free — one query rejected while the
19182
+ * others resolved — and collapsing to a batch is the exact moment it is lost
19183
+ * silently. Every requested id gets a row: a caller that asked for twelve and
19184
+ * got eleven cannot tell which one is missing, or that any is.
19185
+ */
19186
+ var EventDensityForDeviceSchema = object({
19187
+ deviceId: number(),
19188
+ read: _enum(["read", "unreadable"]),
19189
+ buckets: array(EventDensityBucketSchema).readonly()
19190
+ });
19163
19191
  object({
19164
19192
  trackId: string(),
19165
19193
  className: string(),
@@ -19470,12 +19498,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19470
19498
  since: number(),
19471
19499
  until: number(),
19472
19500
  bucketMs: number().int().positive()
19473
- }), array(object({
19474
- bucketStart: number(),
19475
- motion: number().int(),
19476
- object: number().int(),
19477
- audio: number().int()
19478
- })).readonly()), method(object({
19501
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19502
+ deviceIds: array(number()).min(1).max(200),
19503
+ since: number(),
19504
+ until: number(),
19505
+ bucketMs: number().int().positive()
19506
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19479
19507
  deviceId: number(),
19480
19508
  cutoffMs: number()
19481
19509
  }), object({
@@ -26785,6 +26813,39 @@ var RecordingDaysSchema = object({
26785
26813
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
26786
26814
  days: array(number())
26787
26815
  });
26816
+ /**
26817
+ * One camera's row in a `getAvailabilityBatch` answer.
26818
+ *
26819
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
26820
+ * batch collapses the transport, not the work — plus the one thing the singular
26821
+ * method never had to say:
26822
+ *
26823
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
26824
+ * no footage in the window", which is a real claim.
26825
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
26826
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
26827
+ * that emptiness means NOTHING.
26828
+ *
26829
+ * A timeline that renders the second as the first tells an operator there is no
26830
+ * footage when the truth is that nobody looked.
26831
+ */
26832
+ var RecordingAvailabilityForDeviceSchema = object({
26833
+ deviceId: number(),
26834
+ read: _enum(["read", "unreadable"]),
26835
+ ranges: array(RecordingRangeSchema).readonly()
26836
+ });
26837
+ /**
26838
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
26839
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
26840
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
26841
+ * the date-picker's day dots must not spell them the same.
26842
+ */
26843
+ var RecordingDaysForDeviceSchema = object({
26844
+ deviceId: number(),
26845
+ read: _enum(["read", "unreadable"]),
26846
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
26847
+ days: array(number()).readonly()
26848
+ });
26788
26849
  var RecordingManifestSchema = object({
26789
26850
  deviceId: number(),
26790
26851
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -27019,6 +27080,13 @@ method(object({
27019
27080
  }), RecordingAvailabilitySchema, {
27020
27081
  kind: "query",
27021
27082
  auth: "protected"
27083
+ }), method(object({
27084
+ deviceIds: array(number()).min(1).max(200),
27085
+ fromMs: number(),
27086
+ toMs: number()
27087
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
27088
+ kind: "query",
27089
+ auth: "protected"
27022
27090
  }), method(object({
27023
27091
  deviceId: number(),
27024
27092
  fromMs: number(),
@@ -27027,6 +27095,14 @@ method(object({
27027
27095
  }), RecordingDaysSchema, {
27028
27096
  kind: "query",
27029
27097
  auth: "protected"
27098
+ }), method(object({
27099
+ deviceIds: array(number()).min(1).max(200),
27100
+ fromMs: number(),
27101
+ toMs: number(),
27102
+ tzOffsetMinutes: number()
27103
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
27104
+ kind: "query",
27105
+ auth: "protected"
27030
27106
  }), method(object({
27031
27107
  deviceId: number(),
27032
27108
  fromMs: number(),
@@ -32224,6 +32300,12 @@ Object.freeze({
32224
32300
  addonId: null,
32225
32301
  access: "view"
32226
32302
  },
32303
+ "pipelineAnalytics.getEventDensityBatch": {
32304
+ capName: "pipeline-analytics",
32305
+ capScope: "device",
32306
+ addonId: null,
32307
+ access: "view"
32308
+ },
32227
32309
  "pipelineAnalytics.getEventMedia": {
32228
32310
  capName: "pipeline-analytics",
32229
32311
  capScope: "device",
@@ -33346,12 +33428,24 @@ Object.freeze({
33346
33428
  addonId: null,
33347
33429
  access: "view"
33348
33430
  },
33431
+ "recording.getAvailabilityBatch": {
33432
+ capName: "recording",
33433
+ capScope: "system",
33434
+ addonId: null,
33435
+ access: "view"
33436
+ },
33349
33437
  "recording.getDaysWithRecordings": {
33350
33438
  capName: "recording",
33351
33439
  capScope: "system",
33352
33440
  addonId: null,
33353
33441
  access: "view"
33354
33442
  },
33443
+ "recording.getDaysWithRecordingsBatch": {
33444
+ capName: "recording",
33445
+ capScope: "system",
33446
+ addonId: null,
33447
+ access: "view"
33448
+ },
33355
33449
  "recording.getDeviceConfig": {
33356
33450
  capName: "recording",
33357
33451
  capScope: "system",
@@ -35956,6 +36050,11 @@ Object.freeze({
35956
36050
  form: "single",
35957
36051
  optional: false
35958
36052
  }],
36053
+ "pipelineAnalytics.getEventDensityBatch": [{
36054
+ name: "deviceIds",
36055
+ form: "array",
36056
+ optional: false
36057
+ }],
35959
36058
  "pipelineAnalytics.getEventMedia": [{
35960
36059
  name: "deviceId",
35961
36060
  form: "single",
@@ -36371,11 +36470,21 @@ Object.freeze({
36371
36470
  form: "single",
36372
36471
  optional: false
36373
36472
  }],
36473
+ "recording.getAvailabilityBatch": [{
36474
+ name: "deviceIds",
36475
+ form: "array",
36476
+ optional: false
36477
+ }],
36374
36478
  "recording.getDaysWithRecordings": [{
36375
36479
  name: "deviceId",
36376
36480
  form: "single",
36377
36481
  optional: false
36378
36482
  }],
36483
+ "recording.getDaysWithRecordingsBatch": [{
36484
+ name: "deviceIds",
36485
+ form: "array",
36486
+ optional: false
36487
+ }],
36379
36488
  "recording.getDeviceConfig": [{
36380
36489
  name: "deviceId",
36381
36490
  form: "single",
@@ -19133,6 +19133,34 @@ var KeyEventsForDeviceSchema = object({
19133
19133
  deviceId: number(),
19134
19134
  events: array(KeyEventSchema).readonly()
19135
19135
  });
19136
+ /** One non-empty bucket of the timeline histogram. */
19137
+ var EventDensityBucketSchema = object({
19138
+ bucketStart: number(),
19139
+ motion: number().int(),
19140
+ object: number().int(),
19141
+ audio: number().int()
19142
+ });
19143
+ /**
19144
+ * One camera's row in a `getEventDensityBatch` answer.
19145
+ *
19146
+ * TWO facts, and the timeline draws them differently:
19147
+ *
19148
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
19149
+ * claim: read, and nothing happened in the window.
19150
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
19151
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
19152
+ * not quiet.
19153
+ *
19154
+ * Fanned out per camera the difference was free — one query rejected while the
19155
+ * others resolved — and collapsing to a batch is the exact moment it is lost
19156
+ * silently. Every requested id gets a row: a caller that asked for twelve and
19157
+ * got eleven cannot tell which one is missing, or that any is.
19158
+ */
19159
+ var EventDensityForDeviceSchema = object({
19160
+ deviceId: number(),
19161
+ read: _enum(["read", "unreadable"]),
19162
+ buckets: array(EventDensityBucketSchema).readonly()
19163
+ });
19136
19164
  object({
19137
19165
  trackId: string(),
19138
19166
  className: string(),
@@ -19443,12 +19471,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19443
19471
  since: number(),
19444
19472
  until: number(),
19445
19473
  bucketMs: number().int().positive()
19446
- }), array(object({
19447
- bucketStart: number(),
19448
- motion: number().int(),
19449
- object: number().int(),
19450
- audio: number().int()
19451
- })).readonly()), method(object({
19474
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19475
+ deviceIds: array(number()).min(1).max(200),
19476
+ since: number(),
19477
+ until: number(),
19478
+ bucketMs: number().int().positive()
19479
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19452
19480
  deviceId: number(),
19453
19481
  cutoffMs: number()
19454
19482
  }), object({
@@ -26758,6 +26786,39 @@ var RecordingDaysSchema = object({
26758
26786
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
26759
26787
  days: array(number())
26760
26788
  });
26789
+ /**
26790
+ * One camera's row in a `getAvailabilityBatch` answer.
26791
+ *
26792
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
26793
+ * batch collapses the transport, not the work — plus the one thing the singular
26794
+ * method never had to say:
26795
+ *
26796
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
26797
+ * no footage in the window", which is a real claim.
26798
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
26799
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
26800
+ * that emptiness means NOTHING.
26801
+ *
26802
+ * A timeline that renders the second as the first tells an operator there is no
26803
+ * footage when the truth is that nobody looked.
26804
+ */
26805
+ var RecordingAvailabilityForDeviceSchema = object({
26806
+ deviceId: number(),
26807
+ read: _enum(["read", "unreadable"]),
26808
+ ranges: array(RecordingRangeSchema).readonly()
26809
+ });
26810
+ /**
26811
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
26812
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
26813
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
26814
+ * the date-picker's day dots must not spell them the same.
26815
+ */
26816
+ var RecordingDaysForDeviceSchema = object({
26817
+ deviceId: number(),
26818
+ read: _enum(["read", "unreadable"]),
26819
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
26820
+ days: array(number()).readonly()
26821
+ });
26761
26822
  var RecordingManifestSchema = object({
26762
26823
  deviceId: number(),
26763
26824
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -26992,6 +27053,13 @@ method(object({
26992
27053
  }), RecordingAvailabilitySchema, {
26993
27054
  kind: "query",
26994
27055
  auth: "protected"
27056
+ }), method(object({
27057
+ deviceIds: array(number()).min(1).max(200),
27058
+ fromMs: number(),
27059
+ toMs: number()
27060
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
27061
+ kind: "query",
27062
+ auth: "protected"
26995
27063
  }), method(object({
26996
27064
  deviceId: number(),
26997
27065
  fromMs: number(),
@@ -27000,6 +27068,14 @@ method(object({
27000
27068
  }), RecordingDaysSchema, {
27001
27069
  kind: "query",
27002
27070
  auth: "protected"
27071
+ }), method(object({
27072
+ deviceIds: array(number()).min(1).max(200),
27073
+ fromMs: number(),
27074
+ toMs: number(),
27075
+ tzOffsetMinutes: number()
27076
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
27077
+ kind: "query",
27078
+ auth: "protected"
27003
27079
  }), method(object({
27004
27080
  deviceId: number(),
27005
27081
  fromMs: number(),
@@ -32197,6 +32273,12 @@ Object.freeze({
32197
32273
  addonId: null,
32198
32274
  access: "view"
32199
32275
  },
32276
+ "pipelineAnalytics.getEventDensityBatch": {
32277
+ capName: "pipeline-analytics",
32278
+ capScope: "device",
32279
+ addonId: null,
32280
+ access: "view"
32281
+ },
32200
32282
  "pipelineAnalytics.getEventMedia": {
32201
32283
  capName: "pipeline-analytics",
32202
32284
  capScope: "device",
@@ -33319,12 +33401,24 @@ Object.freeze({
33319
33401
  addonId: null,
33320
33402
  access: "view"
33321
33403
  },
33404
+ "recording.getAvailabilityBatch": {
33405
+ capName: "recording",
33406
+ capScope: "system",
33407
+ addonId: null,
33408
+ access: "view"
33409
+ },
33322
33410
  "recording.getDaysWithRecordings": {
33323
33411
  capName: "recording",
33324
33412
  capScope: "system",
33325
33413
  addonId: null,
33326
33414
  access: "view"
33327
33415
  },
33416
+ "recording.getDaysWithRecordingsBatch": {
33417
+ capName: "recording",
33418
+ capScope: "system",
33419
+ addonId: null,
33420
+ access: "view"
33421
+ },
33328
33422
  "recording.getDeviceConfig": {
33329
33423
  capName: "recording",
33330
33424
  capScope: "system",
@@ -35929,6 +36023,11 @@ Object.freeze({
35929
36023
  form: "single",
35930
36024
  optional: false
35931
36025
  }],
36026
+ "pipelineAnalytics.getEventDensityBatch": [{
36027
+ name: "deviceIds",
36028
+ form: "array",
36029
+ optional: false
36030
+ }],
35932
36031
  "pipelineAnalytics.getEventMedia": [{
35933
36032
  name: "deviceId",
35934
36033
  form: "single",
@@ -36344,11 +36443,21 @@ Object.freeze({
36344
36443
  form: "single",
36345
36444
  optional: false
36346
36445
  }],
36446
+ "recording.getAvailabilityBatch": [{
36447
+ name: "deviceIds",
36448
+ form: "array",
36449
+ optional: false
36450
+ }],
36347
36451
  "recording.getDaysWithRecordings": [{
36348
36452
  name: "deviceId",
36349
36453
  form: "single",
36350
36454
  optional: false
36351
36455
  }],
36456
+ "recording.getDaysWithRecordingsBatch": [{
36457
+ name: "deviceIds",
36458
+ form: "array",
36459
+ optional: false
36460
+ }],
36352
36461
  "recording.getDeviceConfig": [{
36353
36462
  name: "deviceId",
36354
36463
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-export-alexa",
3
- "version": "1.2.57",
3
+ "version": "1.2.58",
4
4
  "description": "Alexa Smart Home Skill export — hub-side OAuth provider + directive handler. The companion AWS Lambda forwards Alexa directives to this addon's /addon/export-alexa/directive endpoint.",
5
5
  "keywords": [
6
6
  "camstack",