@camstack/addon-smtp-nodemailer 1.2.50 → 1.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.
@@ -18870,6 +18870,34 @@ var KeyEventsForDeviceSchema = object({
18870
18870
  deviceId: number(),
18871
18871
  events: array(KeyEventSchema).readonly()
18872
18872
  });
18873
+ /** One non-empty bucket of the timeline histogram. */
18874
+ var EventDensityBucketSchema = object({
18875
+ bucketStart: number(),
18876
+ motion: number().int(),
18877
+ object: number().int(),
18878
+ audio: number().int()
18879
+ });
18880
+ /**
18881
+ * One camera's row in a `getEventDensityBatch` answer.
18882
+ *
18883
+ * TWO facts, and the timeline draws them differently:
18884
+ *
18885
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
18886
+ * claim: read, and nothing happened in the window.
18887
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
18888
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
18889
+ * not quiet.
18890
+ *
18891
+ * Fanned out per camera the difference was free — one query rejected while the
18892
+ * others resolved — and collapsing to a batch is the exact moment it is lost
18893
+ * silently. Every requested id gets a row: a caller that asked for twelve and
18894
+ * got eleven cannot tell which one is missing, or that any is.
18895
+ */
18896
+ var EventDensityForDeviceSchema = object({
18897
+ deviceId: number(),
18898
+ read: _enum(["read", "unreadable"]),
18899
+ buckets: array(EventDensityBucketSchema).readonly()
18900
+ });
18873
18901
  object({
18874
18902
  trackId: string(),
18875
18903
  className: string(),
@@ -19180,12 +19208,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19180
19208
  since: number(),
19181
19209
  until: number(),
19182
19210
  bucketMs: number().int().positive()
19183
- }), array(object({
19184
- bucketStart: number(),
19185
- motion: number().int(),
19186
- object: number().int(),
19187
- audio: number().int()
19188
- })).readonly()), method(object({
19211
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19212
+ deviceIds: array(number()).min(1).max(200),
19213
+ since: number(),
19214
+ until: number(),
19215
+ bucketMs: number().int().positive()
19216
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19189
19217
  deviceId: number(),
19190
19218
  cutoffMs: number()
19191
19219
  }), object({
@@ -26508,6 +26536,39 @@ var RecordingDaysSchema = object({
26508
26536
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
26509
26537
  days: array(number())
26510
26538
  });
26539
+ /**
26540
+ * One camera's row in a `getAvailabilityBatch` answer.
26541
+ *
26542
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
26543
+ * batch collapses the transport, not the work — plus the one thing the singular
26544
+ * method never had to say:
26545
+ *
26546
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
26547
+ * no footage in the window", which is a real claim.
26548
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
26549
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
26550
+ * that emptiness means NOTHING.
26551
+ *
26552
+ * A timeline that renders the second as the first tells an operator there is no
26553
+ * footage when the truth is that nobody looked.
26554
+ */
26555
+ var RecordingAvailabilityForDeviceSchema = object({
26556
+ deviceId: number(),
26557
+ read: _enum(["read", "unreadable"]),
26558
+ ranges: array(RecordingRangeSchema).readonly()
26559
+ });
26560
+ /**
26561
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
26562
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
26563
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
26564
+ * the date-picker's day dots must not spell them the same.
26565
+ */
26566
+ var RecordingDaysForDeviceSchema = object({
26567
+ deviceId: number(),
26568
+ read: _enum(["read", "unreadable"]),
26569
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
26570
+ days: array(number()).readonly()
26571
+ });
26511
26572
  var RecordingManifestSchema = object({
26512
26573
  deviceId: number(),
26513
26574
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -26742,6 +26803,13 @@ method(object({
26742
26803
  }), RecordingAvailabilitySchema, {
26743
26804
  kind: "query",
26744
26805
  auth: "protected"
26806
+ }), method(object({
26807
+ deviceIds: array(number()).min(1).max(200),
26808
+ fromMs: number(),
26809
+ toMs: number()
26810
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
26811
+ kind: "query",
26812
+ auth: "protected"
26745
26813
  }), method(object({
26746
26814
  deviceId: number(),
26747
26815
  fromMs: number(),
@@ -26750,6 +26818,14 @@ method(object({
26750
26818
  }), RecordingDaysSchema, {
26751
26819
  kind: "query",
26752
26820
  auth: "protected"
26821
+ }), method(object({
26822
+ deviceIds: array(number()).min(1).max(200),
26823
+ fromMs: number(),
26824
+ toMs: number(),
26825
+ tzOffsetMinutes: number()
26826
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
26827
+ kind: "query",
26828
+ auth: "protected"
26753
26829
  }), method(object({
26754
26830
  deviceId: number(),
26755
26831
  fromMs: number(),
@@ -31947,6 +32023,12 @@ Object.freeze({
31947
32023
  addonId: null,
31948
32024
  access: "view"
31949
32025
  },
32026
+ "pipelineAnalytics.getEventDensityBatch": {
32027
+ capName: "pipeline-analytics",
32028
+ capScope: "device",
32029
+ addonId: null,
32030
+ access: "view"
32031
+ },
31950
32032
  "pipelineAnalytics.getEventMedia": {
31951
32033
  capName: "pipeline-analytics",
31952
32034
  capScope: "device",
@@ -33069,12 +33151,24 @@ Object.freeze({
33069
33151
  addonId: null,
33070
33152
  access: "view"
33071
33153
  },
33154
+ "recording.getAvailabilityBatch": {
33155
+ capName: "recording",
33156
+ capScope: "system",
33157
+ addonId: null,
33158
+ access: "view"
33159
+ },
33072
33160
  "recording.getDaysWithRecordings": {
33073
33161
  capName: "recording",
33074
33162
  capScope: "system",
33075
33163
  addonId: null,
33076
33164
  access: "view"
33077
33165
  },
33166
+ "recording.getDaysWithRecordingsBatch": {
33167
+ capName: "recording",
33168
+ capScope: "system",
33169
+ addonId: null,
33170
+ access: "view"
33171
+ },
33078
33172
  "recording.getDeviceConfig": {
33079
33173
  capName: "recording",
33080
33174
  capScope: "system",
@@ -35679,6 +35773,11 @@ Object.freeze({
35679
35773
  form: "single",
35680
35774
  optional: false
35681
35775
  }],
35776
+ "pipelineAnalytics.getEventDensityBatch": [{
35777
+ name: "deviceIds",
35778
+ form: "array",
35779
+ optional: false
35780
+ }],
35682
35781
  "pipelineAnalytics.getEventMedia": [{
35683
35782
  name: "deviceId",
35684
35783
  form: "single",
@@ -36094,11 +36193,21 @@ Object.freeze({
36094
36193
  form: "single",
36095
36194
  optional: false
36096
36195
  }],
36196
+ "recording.getAvailabilityBatch": [{
36197
+ name: "deviceIds",
36198
+ form: "array",
36199
+ optional: false
36200
+ }],
36097
36201
  "recording.getDaysWithRecordings": [{
36098
36202
  name: "deviceId",
36099
36203
  form: "single",
36100
36204
  optional: false
36101
36205
  }],
36206
+ "recording.getDaysWithRecordingsBatch": [{
36207
+ name: "deviceIds",
36208
+ form: "array",
36209
+ optional: false
36210
+ }],
36102
36211
  "recording.getDeviceConfig": [{
36103
36212
  name: "deviceId",
36104
36213
  form: "single",
@@ -18868,6 +18868,34 @@ var KeyEventsForDeviceSchema = object({
18868
18868
  deviceId: number(),
18869
18869
  events: array(KeyEventSchema).readonly()
18870
18870
  });
18871
+ /** One non-empty bucket of the timeline histogram. */
18872
+ var EventDensityBucketSchema = object({
18873
+ bucketStart: number(),
18874
+ motion: number().int(),
18875
+ object: number().int(),
18876
+ audio: number().int()
18877
+ });
18878
+ /**
18879
+ * One camera's row in a `getEventDensityBatch` answer.
18880
+ *
18881
+ * TWO facts, and the timeline draws them differently:
18882
+ *
18883
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
18884
+ * claim: read, and nothing happened in the window.
18885
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
18886
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
18887
+ * not quiet.
18888
+ *
18889
+ * Fanned out per camera the difference was free — one query rejected while the
18890
+ * others resolved — and collapsing to a batch is the exact moment it is lost
18891
+ * silently. Every requested id gets a row: a caller that asked for twelve and
18892
+ * got eleven cannot tell which one is missing, or that any is.
18893
+ */
18894
+ var EventDensityForDeviceSchema = object({
18895
+ deviceId: number(),
18896
+ read: _enum(["read", "unreadable"]),
18897
+ buckets: array(EventDensityBucketSchema).readonly()
18898
+ });
18871
18899
  object({
18872
18900
  trackId: string(),
18873
18901
  className: string(),
@@ -19178,12 +19206,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19178
19206
  since: number(),
19179
19207
  until: number(),
19180
19208
  bucketMs: number().int().positive()
19181
- }), array(object({
19182
- bucketStart: number(),
19183
- motion: number().int(),
19184
- object: number().int(),
19185
- audio: number().int()
19186
- })).readonly()), method(object({
19209
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19210
+ deviceIds: array(number()).min(1).max(200),
19211
+ since: number(),
19212
+ until: number(),
19213
+ bucketMs: number().int().positive()
19214
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19187
19215
  deviceId: number(),
19188
19216
  cutoffMs: number()
19189
19217
  }), object({
@@ -26506,6 +26534,39 @@ var RecordingDaysSchema = object({
26506
26534
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
26507
26535
  days: array(number())
26508
26536
  });
26537
+ /**
26538
+ * One camera's row in a `getAvailabilityBatch` answer.
26539
+ *
26540
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
26541
+ * batch collapses the transport, not the work — plus the one thing the singular
26542
+ * method never had to say:
26543
+ *
26544
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
26545
+ * no footage in the window", which is a real claim.
26546
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
26547
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
26548
+ * that emptiness means NOTHING.
26549
+ *
26550
+ * A timeline that renders the second as the first tells an operator there is no
26551
+ * footage when the truth is that nobody looked.
26552
+ */
26553
+ var RecordingAvailabilityForDeviceSchema = object({
26554
+ deviceId: number(),
26555
+ read: _enum(["read", "unreadable"]),
26556
+ ranges: array(RecordingRangeSchema).readonly()
26557
+ });
26558
+ /**
26559
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
26560
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
26561
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
26562
+ * the date-picker's day dots must not spell them the same.
26563
+ */
26564
+ var RecordingDaysForDeviceSchema = object({
26565
+ deviceId: number(),
26566
+ read: _enum(["read", "unreadable"]),
26567
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
26568
+ days: array(number()).readonly()
26569
+ });
26509
26570
  var RecordingManifestSchema = object({
26510
26571
  deviceId: number(),
26511
26572
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -26740,6 +26801,13 @@ method(object({
26740
26801
  }), RecordingAvailabilitySchema, {
26741
26802
  kind: "query",
26742
26803
  auth: "protected"
26804
+ }), method(object({
26805
+ deviceIds: array(number()).min(1).max(200),
26806
+ fromMs: number(),
26807
+ toMs: number()
26808
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
26809
+ kind: "query",
26810
+ auth: "protected"
26743
26811
  }), method(object({
26744
26812
  deviceId: number(),
26745
26813
  fromMs: number(),
@@ -26748,6 +26816,14 @@ method(object({
26748
26816
  }), RecordingDaysSchema, {
26749
26817
  kind: "query",
26750
26818
  auth: "protected"
26819
+ }), method(object({
26820
+ deviceIds: array(number()).min(1).max(200),
26821
+ fromMs: number(),
26822
+ toMs: number(),
26823
+ tzOffsetMinutes: number()
26824
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
26825
+ kind: "query",
26826
+ auth: "protected"
26751
26827
  }), method(object({
26752
26828
  deviceId: number(),
26753
26829
  fromMs: number(),
@@ -31945,6 +32021,12 @@ Object.freeze({
31945
32021
  addonId: null,
31946
32022
  access: "view"
31947
32023
  },
32024
+ "pipelineAnalytics.getEventDensityBatch": {
32025
+ capName: "pipeline-analytics",
32026
+ capScope: "device",
32027
+ addonId: null,
32028
+ access: "view"
32029
+ },
31948
32030
  "pipelineAnalytics.getEventMedia": {
31949
32031
  capName: "pipeline-analytics",
31950
32032
  capScope: "device",
@@ -33067,12 +33149,24 @@ Object.freeze({
33067
33149
  addonId: null,
33068
33150
  access: "view"
33069
33151
  },
33152
+ "recording.getAvailabilityBatch": {
33153
+ capName: "recording",
33154
+ capScope: "system",
33155
+ addonId: null,
33156
+ access: "view"
33157
+ },
33070
33158
  "recording.getDaysWithRecordings": {
33071
33159
  capName: "recording",
33072
33160
  capScope: "system",
33073
33161
  addonId: null,
33074
33162
  access: "view"
33075
33163
  },
33164
+ "recording.getDaysWithRecordingsBatch": {
33165
+ capName: "recording",
33166
+ capScope: "system",
33167
+ addonId: null,
33168
+ access: "view"
33169
+ },
33076
33170
  "recording.getDeviceConfig": {
33077
33171
  capName: "recording",
33078
33172
  capScope: "system",
@@ -35677,6 +35771,11 @@ Object.freeze({
35677
35771
  form: "single",
35678
35772
  optional: false
35679
35773
  }],
35774
+ "pipelineAnalytics.getEventDensityBatch": [{
35775
+ name: "deviceIds",
35776
+ form: "array",
35777
+ optional: false
35778
+ }],
35680
35779
  "pipelineAnalytics.getEventMedia": [{
35681
35780
  name: "deviceId",
35682
35781
  form: "single",
@@ -36092,11 +36191,21 @@ Object.freeze({
36092
36191
  form: "single",
36093
36192
  optional: false
36094
36193
  }],
36194
+ "recording.getAvailabilityBatch": [{
36195
+ name: "deviceIds",
36196
+ form: "array",
36197
+ optional: false
36198
+ }],
36095
36199
  "recording.getDaysWithRecordings": [{
36096
36200
  name: "deviceId",
36097
36201
  form: "single",
36098
36202
  optional: false
36099
36203
  }],
36204
+ "recording.getDaysWithRecordingsBatch": [{
36205
+ name: "deviceIds",
36206
+ form: "array",
36207
+ optional: false
36208
+ }],
36100
36209
  "recording.getDeviceConfig": [{
36101
36210
  name: "deviceId",
36102
36211
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-smtp-nodemailer",
3
- "version": "1.2.50",
3
+ "version": "1.2.51",
4
4
  "description": "SMTP email provider addon for CamStack — wraps `nodemailer` and registers a `smtp-provider` cap collection entry. Used by magic-link login + notifier addons.",
5
5
  "keywords": [
6
6
  "camstack",