@camstack/addon-notifiers 1.2.45 → 1.2.47

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.
Files changed (3) hide show
  1. package/dist/addon.js +127 -19
  2. package/dist/addon.mjs +127 -19
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -8172,18 +8172,61 @@ var RelocateFootageInputSchema = object({
8172
8172
  * `RecordingConfig.enabled` or camera wrapper bindings. */
8173
8173
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
8174
8174
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
8175
+ /**
8176
+ * What a `relocateMedia` pass DOES. One engine, three passes — never a second
8177
+ * mover (the engine already walks both collections with a timestamp cursor and
8178
+ * already has a stamp-without-copy path).
8179
+ *
8180
+ * - `move` — the default and the historical behaviour: event-media and
8181
+ * retrain blobs move to `toLocationId` and their rows are
8182
+ * stamped. The enrolled gallery is skipped (D197).
8183
+ * - `seal` — ROWS ONLY, no bytes. Every row whose `locationId` is NULL is
8184
+ * stamped with `toLocationId`. `toLocationId` here is the id the
8185
+ * bytes ALREADY sit on — today's `eventMedia` default — because
8186
+ * a NULL row means "wherever `eventMedia` points *now*", and the
8187
+ * instant a repoint moves that pointer the row reads from the
8188
+ * new disk while its bytes are on the old one.
8189
+ * - `gallery` — the inverse selection of `move`: ONLY the retention-exempt
8190
+ * (enrolled-gallery) rows, which `move` deliberately skips.
8191
+ * `galleryMedia` is `cardinality: 'single'`, so this pass can
8192
+ * never run beside a live second location: it is stop-the-world
8193
+ * by construction, which is acceptable only because the gallery
8194
+ * is a few KB per enrolled sample.
8195
+ */
8196
+ var MediaRelocateModeSchema = _enum([
8197
+ "move",
8198
+ "seal",
8199
+ "gallery"
8200
+ ]);
8175
8201
  var RelocateMediaInputSchema = object({
8176
8202
  toLocationId: string(),
8177
- throttleMbps: number().min(1).max(1e3).optional()
8203
+ throttleMbps: number().min(1).max(1e3).optional(),
8204
+ /** Omitted = `move`, the pre-existing behaviour. */
8205
+ mode: MediaRelocateModeSchema.optional()
8206
+ });
8207
+ /** How many rows still carry NO `locationId` — the population a repoint would
8208
+ * silently re-aim at a disk that does not hold their bytes. Zero is the only
8209
+ * value that permits a non-blocking `eventMedia` cutover. */
8210
+ var UnstampedEventMediaCountSchema = object({
8211
+ media: number().int().nonnegative(),
8212
+ retrainFrames: number().int().nonnegative(),
8213
+ total: number().int().nonnegative()
8178
8214
  });
8179
8215
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8180
- /** The independently selectable logical storage classes. `recordings`
8181
- * encompasses the high and mid segment profiles; `recordingsLow` is low
8182
- * segments; `eventMedia` is post-analysis blobs. */
8216
+ /** The independently selectable logical storage classes — every class
8217
+ * `storage.listLocationDeclarations` reports, so an operator never meets a
8218
+ * Zod enum error where they should meet an explanation.
8219
+ *
8220
+ * `recordings` encompasses the high and mid segment profiles; `recordingsLow`
8221
+ * is low segments; `eventMedia` is post-analysis blobs; `galleryMedia` is the
8222
+ * enrolled gallery; `backups` is the system backup archive. The last two have
8223
+ * their own rules — see {@link StorageMigrationFindingCodeSchema}. */
8183
8224
  var StorageMigrationClassSchema = _enum([
8184
8225
  "recordings",
8185
8226
  "recordingsLow",
8186
- "eventMedia"
8227
+ "eventMedia",
8228
+ "backups",
8229
+ "galleryMedia"
8187
8230
  ]);
8188
8231
  /** A destination is always an existing, fully-qualified location id. The
8189
8232
  * migration API intentionally never changes a source location's `basePath`:
@@ -8191,20 +8234,56 @@ var StorageMigrationClassSchema = _enum([
8191
8234
  var StorageMigrationDestinationsSchema = object({
8192
8235
  recordings: string().min(1).optional(),
8193
8236
  recordingsLow: string().min(1).optional(),
8194
- eventMedia: string().min(1).optional()
8237
+ eventMedia: string().min(1).optional(),
8238
+ backups: string().min(1).optional(),
8239
+ galleryMedia: string().min(1).optional()
8195
8240
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8241
+ /**
8242
+ * How a migration sequences the cutover against the byte move.
8243
+ *
8244
+ * - `blocking` — the historical order: pause, move every byte, repoint,
8245
+ * resume. Recording is stopped for the whole move. Right
8246
+ * for a small or a cold class, and the only legal mode for
8247
+ * a `cardinality: 'single'` class.
8248
+ * - `nonBlocking` — repoint FIRST, drain behind: seal, pause, repoint,
8249
+ * refresh, resume, then move the past with everything
8250
+ * running. The pause is three bounded instants (a detach +
8251
+ * attach round, a write-gate drain, a lease) instead of one
8252
+ * bounded by bytes. 1.09 TB at 7–14 MB/s is thirty hours of
8253
+ * stopped recording under `blocking`; the same move is
8254
+ * seconds of stopped recording under `nonBlocking`.
8255
+ *
8256
+ * The mode is on the JOB, not only on the input, because `status` is where an
8257
+ * operator finds out which one is running.
8258
+ */
8259
+ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8196
8260
  /** Shared input for planning and starting an orchestrated storage migration. */
8197
8261
  var StorageMigrationInputSchema = object({
8198
8262
  destinations: StorageMigrationDestinationsSchema,
8199
- throttleMbps: number().min(1).max(1e3).optional()
8263
+ throttleMbps: number().min(1).max(1e3).optional(),
8264
+ /** Omitted = `blocking`, which stays the default. */
8265
+ mode: StorageMigrationModeSchema.optional()
8200
8266
  });
8201
- /** The durable coordinator state machine. The only phase that changes default
8202
- * locations is `repointing`, after every selected mover has completed and been
8203
- * verified. */
8267
+ /**
8268
+ * The durable coordinator state machine.
8269
+ *
8270
+ * `blocking`:
8271
+ * planning → pausing → moving → verifying → repointing → refreshing → resuming → done
8272
+ *
8273
+ * `nonBlocking`:
8274
+ * planning → sealing → pausing → repointing → refreshing → resuming → draining → verifying → done
8275
+ *
8276
+ * Same phases, different order plus two new ones — not a second mover.
8277
+ * `sealing` closes the `eventMedia` NULL-row hole BEFORE anything is paused;
8278
+ * `draining` runs the same movers UNLEASED, after every writer is back up.
8279
+ * `repointing` is still the only phase that changes a default location.
8280
+ */
8204
8281
  var StorageMigrationPhaseSchema = _enum([
8205
8282
  "planning",
8283
+ "sealing",
8206
8284
  "pausing",
8207
8285
  "moving",
8286
+ "draining",
8208
8287
  "verifying",
8209
8288
  "repointing",
8210
8289
  "refreshing",
@@ -8229,6 +8308,9 @@ var StorageMigrationMoveSchema = object({
8229
8308
  var StorageMigrationJobSchema = object({
8230
8309
  jobId: string(),
8231
8310
  phase: StorageMigrationPhaseSchema,
8311
+ /** Which order this job is running. `status` is the only place an operator
8312
+ * can tell a seconds-long cutover from a thirty-hour one. */
8313
+ mode: StorageMigrationModeSchema,
8232
8314
  destinations: StorageMigrationDestinationsSchema,
8233
8315
  throttleMbps: number(),
8234
8316
  moves: array(StorageMigrationMoveSchema),
@@ -8241,13 +8323,30 @@ var StorageMigrationJobSchema = object({
8241
8323
  finishedAt: number().nullable(),
8242
8324
  error: string().nullable()
8243
8325
  });
8326
+ var StorageMigrationFindingSchema = object({
8327
+ code: _enum([
8328
+ "sharesDeviceWithSource",
8329
+ "deviceIdentityUnknown",
8330
+ "unstampedEventMediaRows",
8331
+ "blockingOnly",
8332
+ "noMover"
8333
+ ]),
8334
+ storageClass: StorageMigrationClassSchema,
8335
+ /** Human-readable, already carrying the ids and counts. */
8336
+ message: string()
8337
+ });
8244
8338
  var StorageMigrationPlanSchema = object({
8245
8339
  destinations: StorageMigrationDestinationsSchema,
8340
+ /** The mode this plan was built for. A plan is only valid for its mode: the
8341
+ * `eventMedia` seal gate and the single-cardinality refusal both depend on
8342
+ * it. */
8343
+ mode: StorageMigrationModeSchema,
8246
8344
  moves: array(object({
8247
8345
  storageClass: StorageMigrationClassSchema,
8248
8346
  fromLocationId: string(),
8249
8347
  toLocationId: string()
8250
- }))
8348
+ })),
8349
+ findings: array(StorageMigrationFindingSchema)
8251
8350
  });
8252
8351
  /**
8253
8352
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
@@ -18813,7 +18912,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
18813
18912
  }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
18814
18913
  kind: "mutation",
18815
18914
  auth: "admin"
18816
- }), method(object({}), array(RelocateJobSchema).readonly(), {
18915
+ }), method(object({}), UnstampedEventMediaCountSchema, { auth: "admin" }), method(object({}), array(RelocateJobSchema).readonly(), {
18817
18916
  kind: "query",
18818
18917
  auth: "admin"
18819
18918
  }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
@@ -20720,7 +20819,10 @@ method(object({
20720
20819
  }), StorageLocationSchema, {
20721
20820
  kind: "mutation",
20722
20821
  auth: "admin"
20723
- }), method(object({ id: string() }), _void(), {
20822
+ }), method(object({
20823
+ id: string(),
20824
+ force: boolean().optional()
20825
+ }), _void(), {
20724
20826
  kind: "mutation",
20725
20827
  auth: "admin"
20726
20828
  }), method(object({ id: string() }), object({
@@ -23806,23 +23908,23 @@ DeviceType.Camera, method(object({ deviceId: number() }), object({
23806
23908
  sdpOffer: string()
23807
23909
  }), {
23808
23910
  kind: "mutation",
23809
- auth: "admin"
23911
+ auth: "protected"
23810
23912
  }), method(object({
23811
23913
  deviceId: number(),
23812
23914
  sessionId: string(),
23813
23915
  sdpAnswer: string()
23814
23916
  }), _void(), {
23815
23917
  kind: "mutation",
23816
- auth: "admin"
23918
+ auth: "protected"
23817
23919
  }), method(object({
23818
23920
  deviceId: number(),
23819
23921
  sessionId: string()
23820
23922
  }), _void(), {
23821
23923
  kind: "mutation",
23822
- auth: "admin"
23924
+ auth: "protected"
23823
23925
  }), method(object({ deviceId: number() }), object({ sessionId: string() }), {
23824
23926
  kind: "mutation",
23825
- auth: "admin"
23927
+ auth: "protected"
23826
23928
  }), method(object({
23827
23929
  deviceId: number(),
23828
23930
  /** Audio bytes for ONE frame, base64-encoded so the payload
@@ -23841,10 +23943,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), object({
23841
23943
  sequenceNumber: number().int()
23842
23944
  }), object({ accepted: boolean() }), {
23843
23945
  kind: "mutation",
23844
- auth: "admin"
23946
+ auth: "protected"
23845
23947
  }), method(object({ deviceId: number() }), _void(), {
23846
23948
  kind: "mutation",
23847
- auth: "admin"
23949
+ auth: "protected"
23848
23950
  }), object({
23849
23951
  deviceId: number(),
23850
23952
  status: IntercomStatusSchema
@@ -31193,6 +31295,12 @@ Object.freeze({
31193
31295
  addonId: null,
31194
31296
  access: "create"
31195
31297
  },
31298
+ "pipelineAnalytics.countUnstampedEventMedia": {
31299
+ capName: "pipeline-analytics",
31300
+ capScope: "device",
31301
+ addonId: null,
31302
+ access: "view"
31303
+ },
31196
31304
  "pipelineAnalytics.deleteDeviceEvents": {
31197
31305
  capName: "pipeline-analytics",
31198
31306
  capScope: "device",
package/dist/addon.mjs CHANGED
@@ -8145,18 +8145,61 @@ var RelocateFootageInputSchema = object({
8145
8145
  * `RecordingConfig.enabled` or camera wrapper bindings. */
8146
8146
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
8147
8147
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
8148
+ /**
8149
+ * What a `relocateMedia` pass DOES. One engine, three passes — never a second
8150
+ * mover (the engine already walks both collections with a timestamp cursor and
8151
+ * already has a stamp-without-copy path).
8152
+ *
8153
+ * - `move` — the default and the historical behaviour: event-media and
8154
+ * retrain blobs move to `toLocationId` and their rows are
8155
+ * stamped. The enrolled gallery is skipped (D197).
8156
+ * - `seal` — ROWS ONLY, no bytes. Every row whose `locationId` is NULL is
8157
+ * stamped with `toLocationId`. `toLocationId` here is the id the
8158
+ * bytes ALREADY sit on — today's `eventMedia` default — because
8159
+ * a NULL row means "wherever `eventMedia` points *now*", and the
8160
+ * instant a repoint moves that pointer the row reads from the
8161
+ * new disk while its bytes are on the old one.
8162
+ * - `gallery` — the inverse selection of `move`: ONLY the retention-exempt
8163
+ * (enrolled-gallery) rows, which `move` deliberately skips.
8164
+ * `galleryMedia` is `cardinality: 'single'`, so this pass can
8165
+ * never run beside a live second location: it is stop-the-world
8166
+ * by construction, which is acceptable only because the gallery
8167
+ * is a few KB per enrolled sample.
8168
+ */
8169
+ var MediaRelocateModeSchema = _enum([
8170
+ "move",
8171
+ "seal",
8172
+ "gallery"
8173
+ ]);
8148
8174
  var RelocateMediaInputSchema = object({
8149
8175
  toLocationId: string(),
8150
- throttleMbps: number().min(1).max(1e3).optional()
8176
+ throttleMbps: number().min(1).max(1e3).optional(),
8177
+ /** Omitted = `move`, the pre-existing behaviour. */
8178
+ mode: MediaRelocateModeSchema.optional()
8179
+ });
8180
+ /** How many rows still carry NO `locationId` — the population a repoint would
8181
+ * silently re-aim at a disk that does not hold their bytes. Zero is the only
8182
+ * value that permits a non-blocking `eventMedia` cutover. */
8183
+ var UnstampedEventMediaCountSchema = object({
8184
+ media: number().int().nonnegative(),
8185
+ retrainFrames: number().int().nonnegative(),
8186
+ total: number().int().nonnegative()
8151
8187
  });
8152
8188
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8153
- /** The independently selectable logical storage classes. `recordings`
8154
- * encompasses the high and mid segment profiles; `recordingsLow` is low
8155
- * segments; `eventMedia` is post-analysis blobs. */
8189
+ /** The independently selectable logical storage classes — every class
8190
+ * `storage.listLocationDeclarations` reports, so an operator never meets a
8191
+ * Zod enum error where they should meet an explanation.
8192
+ *
8193
+ * `recordings` encompasses the high and mid segment profiles; `recordingsLow`
8194
+ * is low segments; `eventMedia` is post-analysis blobs; `galleryMedia` is the
8195
+ * enrolled gallery; `backups` is the system backup archive. The last two have
8196
+ * their own rules — see {@link StorageMigrationFindingCodeSchema}. */
8156
8197
  var StorageMigrationClassSchema = _enum([
8157
8198
  "recordings",
8158
8199
  "recordingsLow",
8159
- "eventMedia"
8200
+ "eventMedia",
8201
+ "backups",
8202
+ "galleryMedia"
8160
8203
  ]);
8161
8204
  /** A destination is always an existing, fully-qualified location id. The
8162
8205
  * migration API intentionally never changes a source location's `basePath`:
@@ -8164,20 +8207,56 @@ var StorageMigrationClassSchema = _enum([
8164
8207
  var StorageMigrationDestinationsSchema = object({
8165
8208
  recordings: string().min(1).optional(),
8166
8209
  recordingsLow: string().min(1).optional(),
8167
- eventMedia: string().min(1).optional()
8210
+ eventMedia: string().min(1).optional(),
8211
+ backups: string().min(1).optional(),
8212
+ galleryMedia: string().min(1).optional()
8168
8213
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8214
+ /**
8215
+ * How a migration sequences the cutover against the byte move.
8216
+ *
8217
+ * - `blocking` — the historical order: pause, move every byte, repoint,
8218
+ * resume. Recording is stopped for the whole move. Right
8219
+ * for a small or a cold class, and the only legal mode for
8220
+ * a `cardinality: 'single'` class.
8221
+ * - `nonBlocking` — repoint FIRST, drain behind: seal, pause, repoint,
8222
+ * refresh, resume, then move the past with everything
8223
+ * running. The pause is three bounded instants (a detach +
8224
+ * attach round, a write-gate drain, a lease) instead of one
8225
+ * bounded by bytes. 1.09 TB at 7–14 MB/s is thirty hours of
8226
+ * stopped recording under `blocking`; the same move is
8227
+ * seconds of stopped recording under `nonBlocking`.
8228
+ *
8229
+ * The mode is on the JOB, not only on the input, because `status` is where an
8230
+ * operator finds out which one is running.
8231
+ */
8232
+ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8169
8233
  /** Shared input for planning and starting an orchestrated storage migration. */
8170
8234
  var StorageMigrationInputSchema = object({
8171
8235
  destinations: StorageMigrationDestinationsSchema,
8172
- throttleMbps: number().min(1).max(1e3).optional()
8236
+ throttleMbps: number().min(1).max(1e3).optional(),
8237
+ /** Omitted = `blocking`, which stays the default. */
8238
+ mode: StorageMigrationModeSchema.optional()
8173
8239
  });
8174
- /** The durable coordinator state machine. The only phase that changes default
8175
- * locations is `repointing`, after every selected mover has completed and been
8176
- * verified. */
8240
+ /**
8241
+ * The durable coordinator state machine.
8242
+ *
8243
+ * `blocking`:
8244
+ * planning → pausing → moving → verifying → repointing → refreshing → resuming → done
8245
+ *
8246
+ * `nonBlocking`:
8247
+ * planning → sealing → pausing → repointing → refreshing → resuming → draining → verifying → done
8248
+ *
8249
+ * Same phases, different order plus two new ones — not a second mover.
8250
+ * `sealing` closes the `eventMedia` NULL-row hole BEFORE anything is paused;
8251
+ * `draining` runs the same movers UNLEASED, after every writer is back up.
8252
+ * `repointing` is still the only phase that changes a default location.
8253
+ */
8177
8254
  var StorageMigrationPhaseSchema = _enum([
8178
8255
  "planning",
8256
+ "sealing",
8179
8257
  "pausing",
8180
8258
  "moving",
8259
+ "draining",
8181
8260
  "verifying",
8182
8261
  "repointing",
8183
8262
  "refreshing",
@@ -8202,6 +8281,9 @@ var StorageMigrationMoveSchema = object({
8202
8281
  var StorageMigrationJobSchema = object({
8203
8282
  jobId: string(),
8204
8283
  phase: StorageMigrationPhaseSchema,
8284
+ /** Which order this job is running. `status` is the only place an operator
8285
+ * can tell a seconds-long cutover from a thirty-hour one. */
8286
+ mode: StorageMigrationModeSchema,
8205
8287
  destinations: StorageMigrationDestinationsSchema,
8206
8288
  throttleMbps: number(),
8207
8289
  moves: array(StorageMigrationMoveSchema),
@@ -8214,13 +8296,30 @@ var StorageMigrationJobSchema = object({
8214
8296
  finishedAt: number().nullable(),
8215
8297
  error: string().nullable()
8216
8298
  });
8299
+ var StorageMigrationFindingSchema = object({
8300
+ code: _enum([
8301
+ "sharesDeviceWithSource",
8302
+ "deviceIdentityUnknown",
8303
+ "unstampedEventMediaRows",
8304
+ "blockingOnly",
8305
+ "noMover"
8306
+ ]),
8307
+ storageClass: StorageMigrationClassSchema,
8308
+ /** Human-readable, already carrying the ids and counts. */
8309
+ message: string()
8310
+ });
8217
8311
  var StorageMigrationPlanSchema = object({
8218
8312
  destinations: StorageMigrationDestinationsSchema,
8313
+ /** The mode this plan was built for. A plan is only valid for its mode: the
8314
+ * `eventMedia` seal gate and the single-cardinality refusal both depend on
8315
+ * it. */
8316
+ mode: StorageMigrationModeSchema,
8219
8317
  moves: array(object({
8220
8318
  storageClass: StorageMigrationClassSchema,
8221
8319
  fromLocationId: string(),
8222
8320
  toLocationId: string()
8223
- }))
8321
+ })),
8322
+ findings: array(StorageMigrationFindingSchema)
8224
8323
  });
8225
8324
  /**
8226
8325
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
@@ -18786,7 +18885,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
18786
18885
  }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
18787
18886
  kind: "mutation",
18788
18887
  auth: "admin"
18789
- }), method(object({}), array(RelocateJobSchema).readonly(), {
18888
+ }), method(object({}), UnstampedEventMediaCountSchema, { auth: "admin" }), method(object({}), array(RelocateJobSchema).readonly(), {
18790
18889
  kind: "query",
18791
18890
  auth: "admin"
18792
18891
  }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
@@ -20693,7 +20792,10 @@ method(object({
20693
20792
  }), StorageLocationSchema, {
20694
20793
  kind: "mutation",
20695
20794
  auth: "admin"
20696
- }), method(object({ id: string() }), _void(), {
20795
+ }), method(object({
20796
+ id: string(),
20797
+ force: boolean().optional()
20798
+ }), _void(), {
20697
20799
  kind: "mutation",
20698
20800
  auth: "admin"
20699
20801
  }), method(object({ id: string() }), object({
@@ -23779,23 +23881,23 @@ DeviceType.Camera, method(object({ deviceId: number() }), object({
23779
23881
  sdpOffer: string()
23780
23882
  }), {
23781
23883
  kind: "mutation",
23782
- auth: "admin"
23884
+ auth: "protected"
23783
23885
  }), method(object({
23784
23886
  deviceId: number(),
23785
23887
  sessionId: string(),
23786
23888
  sdpAnswer: string()
23787
23889
  }), _void(), {
23788
23890
  kind: "mutation",
23789
- auth: "admin"
23891
+ auth: "protected"
23790
23892
  }), method(object({
23791
23893
  deviceId: number(),
23792
23894
  sessionId: string()
23793
23895
  }), _void(), {
23794
23896
  kind: "mutation",
23795
- auth: "admin"
23897
+ auth: "protected"
23796
23898
  }), method(object({ deviceId: number() }), object({ sessionId: string() }), {
23797
23899
  kind: "mutation",
23798
- auth: "admin"
23900
+ auth: "protected"
23799
23901
  }), method(object({
23800
23902
  deviceId: number(),
23801
23903
  /** Audio bytes for ONE frame, base64-encoded so the payload
@@ -23814,10 +23916,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), object({
23814
23916
  sequenceNumber: number().int()
23815
23917
  }), object({ accepted: boolean() }), {
23816
23918
  kind: "mutation",
23817
- auth: "admin"
23919
+ auth: "protected"
23818
23920
  }), method(object({ deviceId: number() }), _void(), {
23819
23921
  kind: "mutation",
23820
- auth: "admin"
23922
+ auth: "protected"
23821
23923
  }), object({
23822
23924
  deviceId: number(),
23823
23925
  status: IntercomStatusSchema
@@ -31166,6 +31268,12 @@ Object.freeze({
31166
31268
  addonId: null,
31167
31269
  access: "create"
31168
31270
  },
31271
+ "pipelineAnalytics.countUnstampedEventMedia": {
31272
+ capName: "pipeline-analytics",
31273
+ capScope: "device",
31274
+ addonId: null,
31275
+ access: "view"
31276
+ },
31169
31277
  "pipelineAnalytics.deleteDeviceEvents": {
31170
31278
  capName: "pipeline-analytics",
31171
31279
  capScope: "device",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-notifiers",
3
- "version": "1.2.45",
3
+ "version": "1.2.47",
4
4
  "description": "System notifiers addon for CamStack — a `notification-output` collection provider hosting per-kind notifier adapters (ntfy, pushover, gotify, telegram, discord, webhook, zentik).",
5
5
  "keywords": [
6
6
  "camstack",