@camstack/addon-provider-reolink 1.2.65 → 1.2.66

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 +121 -13
  2. package/dist/addon.mjs +121 -13
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -8329,18 +8329,61 @@ var RelocateFootageInputSchema = object({
8329
8329
  * `RecordingConfig.enabled` or camera wrapper bindings. */
8330
8330
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
8331
8331
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
8332
+ /**
8333
+ * What a `relocateMedia` pass DOES. One engine, three passes — never a second
8334
+ * mover (the engine already walks both collections with a timestamp cursor and
8335
+ * already has a stamp-without-copy path).
8336
+ *
8337
+ * - `move` — the default and the historical behaviour: event-media and
8338
+ * retrain blobs move to `toLocationId` and their rows are
8339
+ * stamped. The enrolled gallery is skipped (D197).
8340
+ * - `seal` — ROWS ONLY, no bytes. Every row whose `locationId` is NULL is
8341
+ * stamped with `toLocationId`. `toLocationId` here is the id the
8342
+ * bytes ALREADY sit on — today's `eventMedia` default — because
8343
+ * a NULL row means "wherever `eventMedia` points *now*", and the
8344
+ * instant a repoint moves that pointer the row reads from the
8345
+ * new disk while its bytes are on the old one.
8346
+ * - `gallery` — the inverse selection of `move`: ONLY the retention-exempt
8347
+ * (enrolled-gallery) rows, which `move` deliberately skips.
8348
+ * `galleryMedia` is `cardinality: 'single'`, so this pass can
8349
+ * never run beside a live second location: it is stop-the-world
8350
+ * by construction, which is acceptable only because the gallery
8351
+ * is a few KB per enrolled sample.
8352
+ */
8353
+ var MediaRelocateModeSchema = _enum([
8354
+ "move",
8355
+ "seal",
8356
+ "gallery"
8357
+ ]);
8332
8358
  var RelocateMediaInputSchema = object({
8333
8359
  toLocationId: string(),
8334
- throttleMbps: number().min(1).max(1e3).optional()
8360
+ throttleMbps: number().min(1).max(1e3).optional(),
8361
+ /** Omitted = `move`, the pre-existing behaviour. */
8362
+ mode: MediaRelocateModeSchema.optional()
8363
+ });
8364
+ /** How many rows still carry NO `locationId` — the population a repoint would
8365
+ * silently re-aim at a disk that does not hold their bytes. Zero is the only
8366
+ * value that permits a non-blocking `eventMedia` cutover. */
8367
+ var UnstampedEventMediaCountSchema = object({
8368
+ media: number().int().nonnegative(),
8369
+ retrainFrames: number().int().nonnegative(),
8370
+ total: number().int().nonnegative()
8335
8371
  });
8336
8372
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8337
- /** The independently selectable logical storage classes. `recordings`
8338
- * encompasses the high and mid segment profiles; `recordingsLow` is low
8339
- * segments; `eventMedia` is post-analysis blobs. */
8373
+ /** The independently selectable logical storage classes — every class
8374
+ * `storage.listLocationDeclarations` reports, so an operator never meets a
8375
+ * Zod enum error where they should meet an explanation.
8376
+ *
8377
+ * `recordings` encompasses the high and mid segment profiles; `recordingsLow`
8378
+ * is low segments; `eventMedia` is post-analysis blobs; `galleryMedia` is the
8379
+ * enrolled gallery; `backups` is the system backup archive. The last two have
8380
+ * their own rules — see {@link StorageMigrationFindingCodeSchema}. */
8340
8381
  var StorageMigrationClassSchema = _enum([
8341
8382
  "recordings",
8342
8383
  "recordingsLow",
8343
- "eventMedia"
8384
+ "eventMedia",
8385
+ "backups",
8386
+ "galleryMedia"
8344
8387
  ]);
8345
8388
  /** A destination is always an existing, fully-qualified location id. The
8346
8389
  * migration API intentionally never changes a source location's `basePath`:
@@ -8348,20 +8391,56 @@ var StorageMigrationClassSchema = _enum([
8348
8391
  var StorageMigrationDestinationsSchema = object({
8349
8392
  recordings: string().min(1).optional(),
8350
8393
  recordingsLow: string().min(1).optional(),
8351
- eventMedia: string().min(1).optional()
8394
+ eventMedia: string().min(1).optional(),
8395
+ backups: string().min(1).optional(),
8396
+ galleryMedia: string().min(1).optional()
8352
8397
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8398
+ /**
8399
+ * How a migration sequences the cutover against the byte move.
8400
+ *
8401
+ * - `blocking` — the historical order: pause, move every byte, repoint,
8402
+ * resume. Recording is stopped for the whole move. Right
8403
+ * for a small or a cold class, and the only legal mode for
8404
+ * a `cardinality: 'single'` class.
8405
+ * - `nonBlocking` — repoint FIRST, drain behind: seal, pause, repoint,
8406
+ * refresh, resume, then move the past with everything
8407
+ * running. The pause is three bounded instants (a detach +
8408
+ * attach round, a write-gate drain, a lease) instead of one
8409
+ * bounded by bytes. 1.09 TB at 7–14 MB/s is thirty hours of
8410
+ * stopped recording under `blocking`; the same move is
8411
+ * seconds of stopped recording under `nonBlocking`.
8412
+ *
8413
+ * The mode is on the JOB, not only on the input, because `status` is where an
8414
+ * operator finds out which one is running.
8415
+ */
8416
+ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8353
8417
  /** Shared input for planning and starting an orchestrated storage migration. */
8354
8418
  var StorageMigrationInputSchema = object({
8355
8419
  destinations: StorageMigrationDestinationsSchema,
8356
- throttleMbps: number().min(1).max(1e3).optional()
8420
+ throttleMbps: number().min(1).max(1e3).optional(),
8421
+ /** Omitted = `blocking`, which stays the default. */
8422
+ mode: StorageMigrationModeSchema.optional()
8357
8423
  });
8358
- /** The durable coordinator state machine. The only phase that changes default
8359
- * locations is `repointing`, after every selected mover has completed and been
8360
- * verified. */
8424
+ /**
8425
+ * The durable coordinator state machine.
8426
+ *
8427
+ * `blocking`:
8428
+ * planning → pausing → moving → verifying → repointing → refreshing → resuming → done
8429
+ *
8430
+ * `nonBlocking`:
8431
+ * planning → sealing → pausing → repointing → refreshing → resuming → draining → verifying → done
8432
+ *
8433
+ * Same phases, different order plus two new ones — not a second mover.
8434
+ * `sealing` closes the `eventMedia` NULL-row hole BEFORE anything is paused;
8435
+ * `draining` runs the same movers UNLEASED, after every writer is back up.
8436
+ * `repointing` is still the only phase that changes a default location.
8437
+ */
8361
8438
  var StorageMigrationPhaseSchema = _enum([
8362
8439
  "planning",
8440
+ "sealing",
8363
8441
  "pausing",
8364
8442
  "moving",
8443
+ "draining",
8365
8444
  "verifying",
8366
8445
  "repointing",
8367
8446
  "refreshing",
@@ -8386,6 +8465,9 @@ var StorageMigrationMoveSchema = object({
8386
8465
  var StorageMigrationJobSchema = object({
8387
8466
  jobId: string(),
8388
8467
  phase: StorageMigrationPhaseSchema,
8468
+ /** Which order this job is running. `status` is the only place an operator
8469
+ * can tell a seconds-long cutover from a thirty-hour one. */
8470
+ mode: StorageMigrationModeSchema,
8389
8471
  destinations: StorageMigrationDestinationsSchema,
8390
8472
  throttleMbps: number(),
8391
8473
  moves: array(StorageMigrationMoveSchema),
@@ -8398,13 +8480,30 @@ var StorageMigrationJobSchema = object({
8398
8480
  finishedAt: number().nullable(),
8399
8481
  error: string().nullable()
8400
8482
  });
8483
+ var StorageMigrationFindingSchema = object({
8484
+ code: _enum([
8485
+ "sharesDeviceWithSource",
8486
+ "deviceIdentityUnknown",
8487
+ "unstampedEventMediaRows",
8488
+ "blockingOnly",
8489
+ "noMover"
8490
+ ]),
8491
+ storageClass: StorageMigrationClassSchema,
8492
+ /** Human-readable, already carrying the ids and counts. */
8493
+ message: string()
8494
+ });
8401
8495
  var StorageMigrationPlanSchema = object({
8402
8496
  destinations: StorageMigrationDestinationsSchema,
8497
+ /** The mode this plan was built for. A plan is only valid for its mode: the
8498
+ * `eventMedia` seal gate and the single-cardinality refusal both depend on
8499
+ * it. */
8500
+ mode: StorageMigrationModeSchema,
8403
8501
  moves: array(object({
8404
8502
  storageClass: StorageMigrationClassSchema,
8405
8503
  fromLocationId: string(),
8406
8504
  toLocationId: string()
8407
- }))
8505
+ })),
8506
+ findings: array(StorageMigrationFindingSchema)
8408
8507
  });
8409
8508
  /**
8410
8509
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
@@ -19590,7 +19689,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19590
19689
  }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
19591
19690
  kind: "mutation",
19592
19691
  auth: "admin"
19593
- }), method(object({}), array(RelocateJobSchema).readonly(), {
19692
+ }), method(object({}), UnstampedEventMediaCountSchema, { auth: "admin" }), method(object({}), array(RelocateJobSchema).readonly(), {
19594
19693
  kind: "query",
19595
19694
  auth: "admin"
19596
19695
  }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
@@ -21601,7 +21700,10 @@ method(object({
21601
21700
  }), StorageLocationSchema, {
21602
21701
  kind: "mutation",
21603
21702
  auth: "admin"
21604
- }), method(object({ id: string() }), _void(), {
21703
+ }), method(object({
21704
+ id: string(),
21705
+ force: boolean().optional()
21706
+ }), _void(), {
21605
21707
  kind: "mutation",
21606
21708
  auth: "admin"
21607
21709
  }), method(object({ id: string() }), object({
@@ -35910,6 +36012,12 @@ Object.freeze({
35910
36012
  addonId: null,
35911
36013
  access: "create"
35912
36014
  },
36015
+ "pipelineAnalytics.countUnstampedEventMedia": {
36016
+ capName: "pipeline-analytics",
36017
+ capScope: "device",
36018
+ addonId: null,
36019
+ access: "view"
36020
+ },
35913
36021
  "pipelineAnalytics.deleteDeviceEvents": {
35914
36022
  capName: "pipeline-analytics",
35915
36023
  capScope: "device",
package/dist/addon.mjs CHANGED
@@ -8324,18 +8324,61 @@ var RelocateFootageInputSchema = object({
8324
8324
  * `RecordingConfig.enabled` or camera wrapper bindings. */
8325
8325
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
8326
8326
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
8327
+ /**
8328
+ * What a `relocateMedia` pass DOES. One engine, three passes — never a second
8329
+ * mover (the engine already walks both collections with a timestamp cursor and
8330
+ * already has a stamp-without-copy path).
8331
+ *
8332
+ * - `move` — the default and the historical behaviour: event-media and
8333
+ * retrain blobs move to `toLocationId` and their rows are
8334
+ * stamped. The enrolled gallery is skipped (D197).
8335
+ * - `seal` — ROWS ONLY, no bytes. Every row whose `locationId` is NULL is
8336
+ * stamped with `toLocationId`. `toLocationId` here is the id the
8337
+ * bytes ALREADY sit on — today's `eventMedia` default — because
8338
+ * a NULL row means "wherever `eventMedia` points *now*", and the
8339
+ * instant a repoint moves that pointer the row reads from the
8340
+ * new disk while its bytes are on the old one.
8341
+ * - `gallery` — the inverse selection of `move`: ONLY the retention-exempt
8342
+ * (enrolled-gallery) rows, which `move` deliberately skips.
8343
+ * `galleryMedia` is `cardinality: 'single'`, so this pass can
8344
+ * never run beside a live second location: it is stop-the-world
8345
+ * by construction, which is acceptable only because the gallery
8346
+ * is a few KB per enrolled sample.
8347
+ */
8348
+ var MediaRelocateModeSchema = _enum([
8349
+ "move",
8350
+ "seal",
8351
+ "gallery"
8352
+ ]);
8327
8353
  var RelocateMediaInputSchema = object({
8328
8354
  toLocationId: string(),
8329
- throttleMbps: number().min(1).max(1e3).optional()
8355
+ throttleMbps: number().min(1).max(1e3).optional(),
8356
+ /** Omitted = `move`, the pre-existing behaviour. */
8357
+ mode: MediaRelocateModeSchema.optional()
8358
+ });
8359
+ /** How many rows still carry NO `locationId` — the population a repoint would
8360
+ * silently re-aim at a disk that does not hold their bytes. Zero is the only
8361
+ * value that permits a non-blocking `eventMedia` cutover. */
8362
+ var UnstampedEventMediaCountSchema = object({
8363
+ media: number().int().nonnegative(),
8364
+ retrainFrames: number().int().nonnegative(),
8365
+ total: number().int().nonnegative()
8330
8366
  });
8331
8367
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8332
- /** The independently selectable logical storage classes. `recordings`
8333
- * encompasses the high and mid segment profiles; `recordingsLow` is low
8334
- * segments; `eventMedia` is post-analysis blobs. */
8368
+ /** The independently selectable logical storage classes — every class
8369
+ * `storage.listLocationDeclarations` reports, so an operator never meets a
8370
+ * Zod enum error where they should meet an explanation.
8371
+ *
8372
+ * `recordings` encompasses the high and mid segment profiles; `recordingsLow`
8373
+ * is low segments; `eventMedia` is post-analysis blobs; `galleryMedia` is the
8374
+ * enrolled gallery; `backups` is the system backup archive. The last two have
8375
+ * their own rules — see {@link StorageMigrationFindingCodeSchema}. */
8335
8376
  var StorageMigrationClassSchema = _enum([
8336
8377
  "recordings",
8337
8378
  "recordingsLow",
8338
- "eventMedia"
8379
+ "eventMedia",
8380
+ "backups",
8381
+ "galleryMedia"
8339
8382
  ]);
8340
8383
  /** A destination is always an existing, fully-qualified location id. The
8341
8384
  * migration API intentionally never changes a source location's `basePath`:
@@ -8343,20 +8386,56 @@ var StorageMigrationClassSchema = _enum([
8343
8386
  var StorageMigrationDestinationsSchema = object({
8344
8387
  recordings: string().min(1).optional(),
8345
8388
  recordingsLow: string().min(1).optional(),
8346
- eventMedia: string().min(1).optional()
8389
+ eventMedia: string().min(1).optional(),
8390
+ backups: string().min(1).optional(),
8391
+ galleryMedia: string().min(1).optional()
8347
8392
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8393
+ /**
8394
+ * How a migration sequences the cutover against the byte move.
8395
+ *
8396
+ * - `blocking` — the historical order: pause, move every byte, repoint,
8397
+ * resume. Recording is stopped for the whole move. Right
8398
+ * for a small or a cold class, and the only legal mode for
8399
+ * a `cardinality: 'single'` class.
8400
+ * - `nonBlocking` — repoint FIRST, drain behind: seal, pause, repoint,
8401
+ * refresh, resume, then move the past with everything
8402
+ * running. The pause is three bounded instants (a detach +
8403
+ * attach round, a write-gate drain, a lease) instead of one
8404
+ * bounded by bytes. 1.09 TB at 7–14 MB/s is thirty hours of
8405
+ * stopped recording under `blocking`; the same move is
8406
+ * seconds of stopped recording under `nonBlocking`.
8407
+ *
8408
+ * The mode is on the JOB, not only on the input, because `status` is where an
8409
+ * operator finds out which one is running.
8410
+ */
8411
+ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8348
8412
  /** Shared input for planning and starting an orchestrated storage migration. */
8349
8413
  var StorageMigrationInputSchema = object({
8350
8414
  destinations: StorageMigrationDestinationsSchema,
8351
- throttleMbps: number().min(1).max(1e3).optional()
8415
+ throttleMbps: number().min(1).max(1e3).optional(),
8416
+ /** Omitted = `blocking`, which stays the default. */
8417
+ mode: StorageMigrationModeSchema.optional()
8352
8418
  });
8353
- /** The durable coordinator state machine. The only phase that changes default
8354
- * locations is `repointing`, after every selected mover has completed and been
8355
- * verified. */
8419
+ /**
8420
+ * The durable coordinator state machine.
8421
+ *
8422
+ * `blocking`:
8423
+ * planning → pausing → moving → verifying → repointing → refreshing → resuming → done
8424
+ *
8425
+ * `nonBlocking`:
8426
+ * planning → sealing → pausing → repointing → refreshing → resuming → draining → verifying → done
8427
+ *
8428
+ * Same phases, different order plus two new ones — not a second mover.
8429
+ * `sealing` closes the `eventMedia` NULL-row hole BEFORE anything is paused;
8430
+ * `draining` runs the same movers UNLEASED, after every writer is back up.
8431
+ * `repointing` is still the only phase that changes a default location.
8432
+ */
8356
8433
  var StorageMigrationPhaseSchema = _enum([
8357
8434
  "planning",
8435
+ "sealing",
8358
8436
  "pausing",
8359
8437
  "moving",
8438
+ "draining",
8360
8439
  "verifying",
8361
8440
  "repointing",
8362
8441
  "refreshing",
@@ -8381,6 +8460,9 @@ var StorageMigrationMoveSchema = object({
8381
8460
  var StorageMigrationJobSchema = object({
8382
8461
  jobId: string(),
8383
8462
  phase: StorageMigrationPhaseSchema,
8463
+ /** Which order this job is running. `status` is the only place an operator
8464
+ * can tell a seconds-long cutover from a thirty-hour one. */
8465
+ mode: StorageMigrationModeSchema,
8384
8466
  destinations: StorageMigrationDestinationsSchema,
8385
8467
  throttleMbps: number(),
8386
8468
  moves: array(StorageMigrationMoveSchema),
@@ -8393,13 +8475,30 @@ var StorageMigrationJobSchema = object({
8393
8475
  finishedAt: number().nullable(),
8394
8476
  error: string().nullable()
8395
8477
  });
8478
+ var StorageMigrationFindingSchema = object({
8479
+ code: _enum([
8480
+ "sharesDeviceWithSource",
8481
+ "deviceIdentityUnknown",
8482
+ "unstampedEventMediaRows",
8483
+ "blockingOnly",
8484
+ "noMover"
8485
+ ]),
8486
+ storageClass: StorageMigrationClassSchema,
8487
+ /** Human-readable, already carrying the ids and counts. */
8488
+ message: string()
8489
+ });
8396
8490
  var StorageMigrationPlanSchema = object({
8397
8491
  destinations: StorageMigrationDestinationsSchema,
8492
+ /** The mode this plan was built for. A plan is only valid for its mode: the
8493
+ * `eventMedia` seal gate and the single-cardinality refusal both depend on
8494
+ * it. */
8495
+ mode: StorageMigrationModeSchema,
8398
8496
  moves: array(object({
8399
8497
  storageClass: StorageMigrationClassSchema,
8400
8498
  fromLocationId: string(),
8401
8499
  toLocationId: string()
8402
- }))
8500
+ })),
8501
+ findings: array(StorageMigrationFindingSchema)
8403
8502
  });
8404
8503
  /**
8405
8504
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
@@ -19585,7 +19684,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19585
19684
  }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
19586
19685
  kind: "mutation",
19587
19686
  auth: "admin"
19588
- }), method(object({}), array(RelocateJobSchema).readonly(), {
19687
+ }), method(object({}), UnstampedEventMediaCountSchema, { auth: "admin" }), method(object({}), array(RelocateJobSchema).readonly(), {
19589
19688
  kind: "query",
19590
19689
  auth: "admin"
19591
19690
  }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
@@ -21596,7 +21695,10 @@ method(object({
21596
21695
  }), StorageLocationSchema, {
21597
21696
  kind: "mutation",
21598
21697
  auth: "admin"
21599
- }), method(object({ id: string() }), _void(), {
21698
+ }), method(object({
21699
+ id: string(),
21700
+ force: boolean().optional()
21701
+ }), _void(), {
21600
21702
  kind: "mutation",
21601
21703
  auth: "admin"
21602
21704
  }), method(object({ id: string() }), object({
@@ -35905,6 +36007,12 @@ Object.freeze({
35905
36007
  addonId: null,
35906
36008
  access: "create"
35907
36009
  },
36010
+ "pipelineAnalytics.countUnstampedEventMedia": {
36011
+ capName: "pipeline-analytics",
36012
+ capScope: "device",
36013
+ addonId: null,
36014
+ access: "view"
36015
+ },
35908
36016
  "pipelineAnalytics.deleteDeviceEvents": {
35909
36017
  capName: "pipeline-analytics",
35910
36018
  capScope: "device",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-reolink",
3
- "version": "1.2.65",
3
+ "version": "1.2.66",
4
4
  "description": "Reolink camera device provider addon for CamStack — native Baichuan protocol",
5
5
  "keywords": [
6
6
  "camstack",