@camstack/addon-smtp-nodemailer 1.2.40 → 1.2.42

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.
@@ -8060,18 +8060,61 @@ var RelocateFootageInputSchema = object({
8060
8060
  * `RecordingConfig.enabled` or camera wrapper bindings. */
8061
8061
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
8062
8062
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
8063
+ /**
8064
+ * What a `relocateMedia` pass DOES. One engine, three passes — never a second
8065
+ * mover (the engine already walks both collections with a timestamp cursor and
8066
+ * already has a stamp-without-copy path).
8067
+ *
8068
+ * - `move` — the default and the historical behaviour: event-media and
8069
+ * retrain blobs move to `toLocationId` and their rows are
8070
+ * stamped. The enrolled gallery is skipped (D197).
8071
+ * - `seal` — ROWS ONLY, no bytes. Every row whose `locationId` is NULL is
8072
+ * stamped with `toLocationId`. `toLocationId` here is the id the
8073
+ * bytes ALREADY sit on — today's `eventMedia` default — because
8074
+ * a NULL row means "wherever `eventMedia` points *now*", and the
8075
+ * instant a repoint moves that pointer the row reads from the
8076
+ * new disk while its bytes are on the old one.
8077
+ * - `gallery` — the inverse selection of `move`: ONLY the retention-exempt
8078
+ * (enrolled-gallery) rows, which `move` deliberately skips.
8079
+ * `galleryMedia` is `cardinality: 'single'`, so this pass can
8080
+ * never run beside a live second location: it is stop-the-world
8081
+ * by construction, which is acceptable only because the gallery
8082
+ * is a few KB per enrolled sample.
8083
+ */
8084
+ var MediaRelocateModeSchema = _enum([
8085
+ "move",
8086
+ "seal",
8087
+ "gallery"
8088
+ ]);
8063
8089
  var RelocateMediaInputSchema = object({
8064
8090
  toLocationId: string(),
8065
- throttleMbps: number().min(1).max(1e3).optional()
8091
+ throttleMbps: number().min(1).max(1e3).optional(),
8092
+ /** Omitted = `move`, the pre-existing behaviour. */
8093
+ mode: MediaRelocateModeSchema.optional()
8094
+ });
8095
+ /** How many rows still carry NO `locationId` — the population a repoint would
8096
+ * silently re-aim at a disk that does not hold their bytes. Zero is the only
8097
+ * value that permits a non-blocking `eventMedia` cutover. */
8098
+ var UnstampedEventMediaCountSchema = object({
8099
+ media: number().int().nonnegative(),
8100
+ retrainFrames: number().int().nonnegative(),
8101
+ total: number().int().nonnegative()
8066
8102
  });
8067
8103
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8068
- /** The independently selectable logical storage classes. `recordings`
8069
- * encompasses the high and mid segment profiles; `recordingsLow` is low
8070
- * segments; `eventMedia` is post-analysis blobs. */
8104
+ /** The independently selectable logical storage classes — every class
8105
+ * `storage.listLocationDeclarations` reports, so an operator never meets a
8106
+ * Zod enum error where they should meet an explanation.
8107
+ *
8108
+ * `recordings` encompasses the high and mid segment profiles; `recordingsLow`
8109
+ * is low segments; `eventMedia` is post-analysis blobs; `galleryMedia` is the
8110
+ * enrolled gallery; `backups` is the system backup archive. The last two have
8111
+ * their own rules — see {@link StorageMigrationFindingCodeSchema}. */
8071
8112
  var StorageMigrationClassSchema = _enum([
8072
8113
  "recordings",
8073
8114
  "recordingsLow",
8074
- "eventMedia"
8115
+ "eventMedia",
8116
+ "backups",
8117
+ "galleryMedia"
8075
8118
  ]);
8076
8119
  /** A destination is always an existing, fully-qualified location id. The
8077
8120
  * migration API intentionally never changes a source location's `basePath`:
@@ -8079,20 +8122,56 @@ var StorageMigrationClassSchema = _enum([
8079
8122
  var StorageMigrationDestinationsSchema = object({
8080
8123
  recordings: string().min(1).optional(),
8081
8124
  recordingsLow: string().min(1).optional(),
8082
- eventMedia: string().min(1).optional()
8125
+ eventMedia: string().min(1).optional(),
8126
+ backups: string().min(1).optional(),
8127
+ galleryMedia: string().min(1).optional()
8083
8128
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8129
+ /**
8130
+ * How a migration sequences the cutover against the byte move.
8131
+ *
8132
+ * - `blocking` — the historical order: pause, move every byte, repoint,
8133
+ * resume. Recording is stopped for the whole move. Right
8134
+ * for a small or a cold class, and the only legal mode for
8135
+ * a `cardinality: 'single'` class.
8136
+ * - `nonBlocking` — repoint FIRST, drain behind: seal, pause, repoint,
8137
+ * refresh, resume, then move the past with everything
8138
+ * running. The pause is three bounded instants (a detach +
8139
+ * attach round, a write-gate drain, a lease) instead of one
8140
+ * bounded by bytes. 1.09 TB at 7–14 MB/s is thirty hours of
8141
+ * stopped recording under `blocking`; the same move is
8142
+ * seconds of stopped recording under `nonBlocking`.
8143
+ *
8144
+ * The mode is on the JOB, not only on the input, because `status` is where an
8145
+ * operator finds out which one is running.
8146
+ */
8147
+ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8084
8148
  /** Shared input for planning and starting an orchestrated storage migration. */
8085
8149
  var StorageMigrationInputSchema = object({
8086
8150
  destinations: StorageMigrationDestinationsSchema,
8087
- throttleMbps: number().min(1).max(1e3).optional()
8151
+ throttleMbps: number().min(1).max(1e3).optional(),
8152
+ /** Omitted = `blocking`, which stays the default. */
8153
+ mode: StorageMigrationModeSchema.optional()
8088
8154
  });
8089
- /** The durable coordinator state machine. The only phase that changes default
8090
- * locations is `repointing`, after every selected mover has completed and been
8091
- * verified. */
8155
+ /**
8156
+ * The durable coordinator state machine.
8157
+ *
8158
+ * `blocking`:
8159
+ * planning → pausing → moving → verifying → repointing → refreshing → resuming → done
8160
+ *
8161
+ * `nonBlocking`:
8162
+ * planning → sealing → pausing → repointing → refreshing → resuming → draining → verifying → done
8163
+ *
8164
+ * Same phases, different order plus two new ones — not a second mover.
8165
+ * `sealing` closes the `eventMedia` NULL-row hole BEFORE anything is paused;
8166
+ * `draining` runs the same movers UNLEASED, after every writer is back up.
8167
+ * `repointing` is still the only phase that changes a default location.
8168
+ */
8092
8169
  var StorageMigrationPhaseSchema = _enum([
8093
8170
  "planning",
8171
+ "sealing",
8094
8172
  "pausing",
8095
8173
  "moving",
8174
+ "draining",
8096
8175
  "verifying",
8097
8176
  "repointing",
8098
8177
  "refreshing",
@@ -8117,6 +8196,9 @@ var StorageMigrationMoveSchema = object({
8117
8196
  var StorageMigrationJobSchema = object({
8118
8197
  jobId: string(),
8119
8198
  phase: StorageMigrationPhaseSchema,
8199
+ /** Which order this job is running. `status` is the only place an operator
8200
+ * can tell a seconds-long cutover from a thirty-hour one. */
8201
+ mode: StorageMigrationModeSchema,
8120
8202
  destinations: StorageMigrationDestinationsSchema,
8121
8203
  throttleMbps: number(),
8122
8204
  moves: array(StorageMigrationMoveSchema),
@@ -8129,13 +8211,30 @@ var StorageMigrationJobSchema = object({
8129
8211
  finishedAt: number().nullable(),
8130
8212
  error: string().nullable()
8131
8213
  });
8214
+ var StorageMigrationFindingSchema = object({
8215
+ code: _enum([
8216
+ "sharesDeviceWithSource",
8217
+ "deviceIdentityUnknown",
8218
+ "unstampedEventMediaRows",
8219
+ "blockingOnly",
8220
+ "noMover"
8221
+ ]),
8222
+ storageClass: StorageMigrationClassSchema,
8223
+ /** Human-readable, already carrying the ids and counts. */
8224
+ message: string()
8225
+ });
8132
8226
  var StorageMigrationPlanSchema = object({
8133
8227
  destinations: StorageMigrationDestinationsSchema,
8228
+ /** The mode this plan was built for. A plan is only valid for its mode: the
8229
+ * `eventMedia` seal gate and the single-cardinality refusal both depend on
8230
+ * it. */
8231
+ mode: StorageMigrationModeSchema,
8134
8232
  moves: array(object({
8135
8233
  storageClass: StorageMigrationClassSchema,
8136
8234
  fromLocationId: string(),
8137
8235
  toLocationId: string()
8138
- }))
8236
+ })),
8237
+ findings: array(StorageMigrationFindingSchema)
8139
8238
  });
8140
8239
  /**
8141
8240
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
@@ -18646,7 +18745,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
18646
18745
  }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
18647
18746
  kind: "mutation",
18648
18747
  auth: "admin"
18649
- }), method(object({}), array(RelocateJobSchema).readonly(), {
18748
+ }), method(object({}), UnstampedEventMediaCountSchema, { auth: "admin" }), method(object({}), array(RelocateJobSchema).readonly(), {
18650
18749
  kind: "query",
18651
18750
  auth: "admin"
18652
18751
  }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
@@ -20566,7 +20665,10 @@ method(object({
20566
20665
  }), StorageLocationSchema, {
20567
20666
  kind: "mutation",
20568
20667
  auth: "admin"
20569
- }), method(object({ id: string() }), _void(), {
20668
+ }), method(object({
20669
+ id: string(),
20670
+ force: boolean().optional()
20671
+ }), _void(), {
20570
20672
  kind: "mutation",
20571
20673
  auth: "admin"
20572
20674
  }), method(object({ id: string() }), object({
@@ -23652,23 +23754,23 @@ DeviceType.Camera, method(object({ deviceId: number() }), object({
23652
23754
  sdpOffer: string()
23653
23755
  }), {
23654
23756
  kind: "mutation",
23655
- auth: "admin"
23757
+ auth: "protected"
23656
23758
  }), method(object({
23657
23759
  deviceId: number(),
23658
23760
  sessionId: string(),
23659
23761
  sdpAnswer: string()
23660
23762
  }), _void(), {
23661
23763
  kind: "mutation",
23662
- auth: "admin"
23764
+ auth: "protected"
23663
23765
  }), method(object({
23664
23766
  deviceId: number(),
23665
23767
  sessionId: string()
23666
23768
  }), _void(), {
23667
23769
  kind: "mutation",
23668
- auth: "admin"
23770
+ auth: "protected"
23669
23771
  }), method(object({ deviceId: number() }), object({ sessionId: string() }), {
23670
23772
  kind: "mutation",
23671
- auth: "admin"
23773
+ auth: "protected"
23672
23774
  }), method(object({
23673
23775
  deviceId: number(),
23674
23776
  /** Audio bytes for ONE frame, base64-encoded so the payload
@@ -23687,10 +23789,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), object({
23687
23789
  sequenceNumber: number().int()
23688
23790
  }), object({ accepted: boolean() }), {
23689
23791
  kind: "mutation",
23690
- auth: "admin"
23792
+ auth: "protected"
23691
23793
  }), method(object({ deviceId: number() }), _void(), {
23692
23794
  kind: "mutation",
23693
- auth: "admin"
23795
+ auth: "protected"
23694
23796
  }), object({
23695
23797
  deviceId: number(),
23696
23798
  status: IntercomStatusSchema
@@ -31039,6 +31141,12 @@ Object.freeze({
31039
31141
  addonId: null,
31040
31142
  access: "create"
31041
31143
  },
31144
+ "pipelineAnalytics.countUnstampedEventMedia": {
31145
+ capName: "pipeline-analytics",
31146
+ capScope: "device",
31147
+ addonId: null,
31148
+ access: "view"
31149
+ },
31042
31150
  "pipelineAnalytics.deleteDeviceEvents": {
31043
31151
  capName: "pipeline-analytics",
31044
31152
  capScope: "device",
@@ -8058,18 +8058,61 @@ var RelocateFootageInputSchema = object({
8058
8058
  * `RecordingConfig.enabled` or camera wrapper bindings. */
8059
8059
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
8060
8060
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
8061
+ /**
8062
+ * What a `relocateMedia` pass DOES. One engine, three passes — never a second
8063
+ * mover (the engine already walks both collections with a timestamp cursor and
8064
+ * already has a stamp-without-copy path).
8065
+ *
8066
+ * - `move` — the default and the historical behaviour: event-media and
8067
+ * retrain blobs move to `toLocationId` and their rows are
8068
+ * stamped. The enrolled gallery is skipped (D197).
8069
+ * - `seal` — ROWS ONLY, no bytes. Every row whose `locationId` is NULL is
8070
+ * stamped with `toLocationId`. `toLocationId` here is the id the
8071
+ * bytes ALREADY sit on — today's `eventMedia` default — because
8072
+ * a NULL row means "wherever `eventMedia` points *now*", and the
8073
+ * instant a repoint moves that pointer the row reads from the
8074
+ * new disk while its bytes are on the old one.
8075
+ * - `gallery` — the inverse selection of `move`: ONLY the retention-exempt
8076
+ * (enrolled-gallery) rows, which `move` deliberately skips.
8077
+ * `galleryMedia` is `cardinality: 'single'`, so this pass can
8078
+ * never run beside a live second location: it is stop-the-world
8079
+ * by construction, which is acceptable only because the gallery
8080
+ * is a few KB per enrolled sample.
8081
+ */
8082
+ var MediaRelocateModeSchema = _enum([
8083
+ "move",
8084
+ "seal",
8085
+ "gallery"
8086
+ ]);
8061
8087
  var RelocateMediaInputSchema = object({
8062
8088
  toLocationId: string(),
8063
- throttleMbps: number().min(1).max(1e3).optional()
8089
+ throttleMbps: number().min(1).max(1e3).optional(),
8090
+ /** Omitted = `move`, the pre-existing behaviour. */
8091
+ mode: MediaRelocateModeSchema.optional()
8092
+ });
8093
+ /** How many rows still carry NO `locationId` — the population a repoint would
8094
+ * silently re-aim at a disk that does not hold their bytes. Zero is the only
8095
+ * value that permits a non-blocking `eventMedia` cutover. */
8096
+ var UnstampedEventMediaCountSchema = object({
8097
+ media: number().int().nonnegative(),
8098
+ retrainFrames: number().int().nonnegative(),
8099
+ total: number().int().nonnegative()
8064
8100
  });
8065
8101
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8066
- /** The independently selectable logical storage classes. `recordings`
8067
- * encompasses the high and mid segment profiles; `recordingsLow` is low
8068
- * segments; `eventMedia` is post-analysis blobs. */
8102
+ /** The independently selectable logical storage classes — every class
8103
+ * `storage.listLocationDeclarations` reports, so an operator never meets a
8104
+ * Zod enum error where they should meet an explanation.
8105
+ *
8106
+ * `recordings` encompasses the high and mid segment profiles; `recordingsLow`
8107
+ * is low segments; `eventMedia` is post-analysis blobs; `galleryMedia` is the
8108
+ * enrolled gallery; `backups` is the system backup archive. The last two have
8109
+ * their own rules — see {@link StorageMigrationFindingCodeSchema}. */
8069
8110
  var StorageMigrationClassSchema = _enum([
8070
8111
  "recordings",
8071
8112
  "recordingsLow",
8072
- "eventMedia"
8113
+ "eventMedia",
8114
+ "backups",
8115
+ "galleryMedia"
8073
8116
  ]);
8074
8117
  /** A destination is always an existing, fully-qualified location id. The
8075
8118
  * migration API intentionally never changes a source location's `basePath`:
@@ -8077,20 +8120,56 @@ var StorageMigrationClassSchema = _enum([
8077
8120
  var StorageMigrationDestinationsSchema = object({
8078
8121
  recordings: string().min(1).optional(),
8079
8122
  recordingsLow: string().min(1).optional(),
8080
- eventMedia: string().min(1).optional()
8123
+ eventMedia: string().min(1).optional(),
8124
+ backups: string().min(1).optional(),
8125
+ galleryMedia: string().min(1).optional()
8081
8126
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8127
+ /**
8128
+ * How a migration sequences the cutover against the byte move.
8129
+ *
8130
+ * - `blocking` — the historical order: pause, move every byte, repoint,
8131
+ * resume. Recording is stopped for the whole move. Right
8132
+ * for a small or a cold class, and the only legal mode for
8133
+ * a `cardinality: 'single'` class.
8134
+ * - `nonBlocking` — repoint FIRST, drain behind: seal, pause, repoint,
8135
+ * refresh, resume, then move the past with everything
8136
+ * running. The pause is three bounded instants (a detach +
8137
+ * attach round, a write-gate drain, a lease) instead of one
8138
+ * bounded by bytes. 1.09 TB at 7–14 MB/s is thirty hours of
8139
+ * stopped recording under `blocking`; the same move is
8140
+ * seconds of stopped recording under `nonBlocking`.
8141
+ *
8142
+ * The mode is on the JOB, not only on the input, because `status` is where an
8143
+ * operator finds out which one is running.
8144
+ */
8145
+ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8082
8146
  /** Shared input for planning and starting an orchestrated storage migration. */
8083
8147
  var StorageMigrationInputSchema = object({
8084
8148
  destinations: StorageMigrationDestinationsSchema,
8085
- throttleMbps: number().min(1).max(1e3).optional()
8149
+ throttleMbps: number().min(1).max(1e3).optional(),
8150
+ /** Omitted = `blocking`, which stays the default. */
8151
+ mode: StorageMigrationModeSchema.optional()
8086
8152
  });
8087
- /** The durable coordinator state machine. The only phase that changes default
8088
- * locations is `repointing`, after every selected mover has completed and been
8089
- * verified. */
8153
+ /**
8154
+ * The durable coordinator state machine.
8155
+ *
8156
+ * `blocking`:
8157
+ * planning → pausing → moving → verifying → repointing → refreshing → resuming → done
8158
+ *
8159
+ * `nonBlocking`:
8160
+ * planning → sealing → pausing → repointing → refreshing → resuming → draining → verifying → done
8161
+ *
8162
+ * Same phases, different order plus two new ones — not a second mover.
8163
+ * `sealing` closes the `eventMedia` NULL-row hole BEFORE anything is paused;
8164
+ * `draining` runs the same movers UNLEASED, after every writer is back up.
8165
+ * `repointing` is still the only phase that changes a default location.
8166
+ */
8090
8167
  var StorageMigrationPhaseSchema = _enum([
8091
8168
  "planning",
8169
+ "sealing",
8092
8170
  "pausing",
8093
8171
  "moving",
8172
+ "draining",
8094
8173
  "verifying",
8095
8174
  "repointing",
8096
8175
  "refreshing",
@@ -8115,6 +8194,9 @@ var StorageMigrationMoveSchema = object({
8115
8194
  var StorageMigrationJobSchema = object({
8116
8195
  jobId: string(),
8117
8196
  phase: StorageMigrationPhaseSchema,
8197
+ /** Which order this job is running. `status` is the only place an operator
8198
+ * can tell a seconds-long cutover from a thirty-hour one. */
8199
+ mode: StorageMigrationModeSchema,
8118
8200
  destinations: StorageMigrationDestinationsSchema,
8119
8201
  throttleMbps: number(),
8120
8202
  moves: array(StorageMigrationMoveSchema),
@@ -8127,13 +8209,30 @@ var StorageMigrationJobSchema = object({
8127
8209
  finishedAt: number().nullable(),
8128
8210
  error: string().nullable()
8129
8211
  });
8212
+ var StorageMigrationFindingSchema = object({
8213
+ code: _enum([
8214
+ "sharesDeviceWithSource",
8215
+ "deviceIdentityUnknown",
8216
+ "unstampedEventMediaRows",
8217
+ "blockingOnly",
8218
+ "noMover"
8219
+ ]),
8220
+ storageClass: StorageMigrationClassSchema,
8221
+ /** Human-readable, already carrying the ids and counts. */
8222
+ message: string()
8223
+ });
8130
8224
  var StorageMigrationPlanSchema = object({
8131
8225
  destinations: StorageMigrationDestinationsSchema,
8226
+ /** The mode this plan was built for. A plan is only valid for its mode: the
8227
+ * `eventMedia` seal gate and the single-cardinality refusal both depend on
8228
+ * it. */
8229
+ mode: StorageMigrationModeSchema,
8132
8230
  moves: array(object({
8133
8231
  storageClass: StorageMigrationClassSchema,
8134
8232
  fromLocationId: string(),
8135
8233
  toLocationId: string()
8136
- }))
8234
+ })),
8235
+ findings: array(StorageMigrationFindingSchema)
8137
8236
  });
8138
8237
  /**
8139
8238
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
@@ -18644,7 +18743,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
18644
18743
  }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
18645
18744
  kind: "mutation",
18646
18745
  auth: "admin"
18647
- }), method(object({}), array(RelocateJobSchema).readonly(), {
18746
+ }), method(object({}), UnstampedEventMediaCountSchema, { auth: "admin" }), method(object({}), array(RelocateJobSchema).readonly(), {
18648
18747
  kind: "query",
18649
18748
  auth: "admin"
18650
18749
  }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
@@ -20564,7 +20663,10 @@ method(object({
20564
20663
  }), StorageLocationSchema, {
20565
20664
  kind: "mutation",
20566
20665
  auth: "admin"
20567
- }), method(object({ id: string() }), _void(), {
20666
+ }), method(object({
20667
+ id: string(),
20668
+ force: boolean().optional()
20669
+ }), _void(), {
20568
20670
  kind: "mutation",
20569
20671
  auth: "admin"
20570
20672
  }), method(object({ id: string() }), object({
@@ -23650,23 +23752,23 @@ DeviceType.Camera, method(object({ deviceId: number() }), object({
23650
23752
  sdpOffer: string()
23651
23753
  }), {
23652
23754
  kind: "mutation",
23653
- auth: "admin"
23755
+ auth: "protected"
23654
23756
  }), method(object({
23655
23757
  deviceId: number(),
23656
23758
  sessionId: string(),
23657
23759
  sdpAnswer: string()
23658
23760
  }), _void(), {
23659
23761
  kind: "mutation",
23660
- auth: "admin"
23762
+ auth: "protected"
23661
23763
  }), method(object({
23662
23764
  deviceId: number(),
23663
23765
  sessionId: string()
23664
23766
  }), _void(), {
23665
23767
  kind: "mutation",
23666
- auth: "admin"
23768
+ auth: "protected"
23667
23769
  }), method(object({ deviceId: number() }), object({ sessionId: string() }), {
23668
23770
  kind: "mutation",
23669
- auth: "admin"
23771
+ auth: "protected"
23670
23772
  }), method(object({
23671
23773
  deviceId: number(),
23672
23774
  /** Audio bytes for ONE frame, base64-encoded so the payload
@@ -23685,10 +23787,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), object({
23685
23787
  sequenceNumber: number().int()
23686
23788
  }), object({ accepted: boolean() }), {
23687
23789
  kind: "mutation",
23688
- auth: "admin"
23790
+ auth: "protected"
23689
23791
  }), method(object({ deviceId: number() }), _void(), {
23690
23792
  kind: "mutation",
23691
- auth: "admin"
23793
+ auth: "protected"
23692
23794
  }), object({
23693
23795
  deviceId: number(),
23694
23796
  status: IntercomStatusSchema
@@ -31037,6 +31139,12 @@ Object.freeze({
31037
31139
  addonId: null,
31038
31140
  access: "create"
31039
31141
  },
31142
+ "pipelineAnalytics.countUnstampedEventMedia": {
31143
+ capName: "pipeline-analytics",
31144
+ capScope: "device",
31145
+ addonId: null,
31146
+ access: "view"
31147
+ },
31040
31148
  "pipelineAnalytics.deleteDeviceEvents": {
31041
31149
  capName: "pipeline-analytics",
31042
31150
  capScope: "device",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-smtp-nodemailer",
3
- "version": "1.2.40",
3
+ "version": "1.2.42",
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",