@camstack/addon-provider-reolink 1.2.68 → 1.2.69

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.
package/dist/addon.js CHANGED
@@ -8293,6 +8293,21 @@ var RelocateJobSchema = object({
8293
8293
  bytesMoved: number().int(),
8294
8294
  /** Total files discovered up front; null while (or when) unknown. */
8295
8295
  filesTotal: number().int().nullable(),
8296
+ /**
8297
+ * Rows this run CORRECTED while moving them — a durable mutation the move
8298
+ * made that nobody asked for, so it is reported where the operator reads the
8299
+ * job rather than only in a log line.
8300
+ *
8301
+ * A footage segment records its byte count in its own NAME, and the durable
8302
+ * hour row derives its aggregates from those names. A file that does not
8303
+ * match its name therefore makes the ledger's sums — and with them quota and
8304
+ * pressure eviction — wrong by the difference, and only a rename can fix it.
8305
+ * On 2026-08-30 one such row also stalled a 110 749-file drain permanently.
8306
+ *
8307
+ * Absent on lanes where the question has no meaning: a media blob's size is
8308
+ * in its row, not in its name, so `MediaRelocateEngine` never reconciles one.
8309
+ */
8310
+ rowsReconciled: number().int().nonnegative().optional(),
8296
8311
  startedAt: number(),
8297
8312
  finishedAt: number().nullable(),
8298
8313
  error: string().nullable()
@@ -8361,14 +8376,42 @@ var RelocateMediaInputSchema = object({
8361
8376
  /** Omitted = `move`, the pre-existing behaviour. */
8362
8377
  mode: MediaRelocateModeSchema.optional()
8363
8378
  });
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()
8379
+ /**
8380
+ * The unstamped population of ONE collection split, because the gate and the
8381
+ * operator ask two different questions and only one of them has to be cheap.
8382
+ *
8383
+ * `present` is the GATE: "is there at least one row that would be orphaned by a
8384
+ * repoint". It is a single indexed seek to the first matching row, so it stays
8385
+ * answerable on a saturated disk and answers in O(log n) precisely in the state
8386
+ * that matters — after a seal, when the population is empty.
8387
+ *
8388
+ * `rows` is the NUMBER, for the refusal message and the operator's sense of
8389
+ * scale. It is a second, indexed `COUNT(*)`, and `null` means **not
8390
+ * measurable** — never zero. `{ present: true, rows: null }` is a legitimate
8391
+ * and useful answer: "there are some, and this read could not say how many"
8392
+ * still refuses the cutover, which is the whole job.
8393
+ */
8394
+ var UnstampedRowsSchema = object({
8395
+ present: boolean(),
8396
+ rows: number().int().nonnegative().nullable()
8371
8397
  });
8398
+ /**
8399
+ * How many rows still carry NO `locationId` — the population a repoint would
8400
+ * silently re-aim at a disk that does not hold their bytes.
8401
+ *
8402
+ * **`null` = the count could not be taken**, and it is NOT permission to cut
8403
+ * over. The gate opens on a measured absence and on nothing else; an unread
8404
+ * collection and an empty one are different facts, and this repo has already
8405
+ * paid for conflating them (`RelocateResidueSchema`, D295).
8406
+ */
8407
+ var UnstampedEventMediaCountSchema = object({
8408
+ media: UnstampedRowsSchema,
8409
+ retrainFrames: UnstampedRowsSchema,
8410
+ /** True when EITHER collection holds one. The refusal reads this. */
8411
+ anyPresent: boolean(),
8412
+ /** Sum across both, or `null` when either lane could not be counted. */
8413
+ total: number().int().nonnegative().nullable()
8414
+ }).nullable();
8372
8415
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8373
8416
  /** The independently selectable logical storage classes — every class
8374
8417
  * `storage.listLocationDeclarations` reports, so an operator never meets a
@@ -8479,6 +8522,10 @@ var StorageMigrationMoveProgressSchema = object({
8479
8522
  /** The archive census — the **M** of "N of M" (D295). `null` = unknowable. */
8480
8523
  filesTotal: number().int().nonnegative().nullable(),
8481
8524
  bytesMoved: number().int().nonnegative(),
8525
+ /** Rows the mover corrected while moving them — see `RelocateJob`. Absent on
8526
+ * a lane that cannot reconcile. A migration that silently rewrote durable
8527
+ * rows would be the same failure as one that silently skipped them. */
8528
+ rowsReconciled: number().int().nonnegative().optional(),
8482
8529
  /** The MOVER's start, not the migration's: a drain restarted after an addon
8483
8530
  * crash gets a new mover, and a rate computed from the migration's start
8484
8531
  * would silently average in the time nothing was running. */
package/dist/addon.mjs CHANGED
@@ -8288,6 +8288,21 @@ var RelocateJobSchema = object({
8288
8288
  bytesMoved: number().int(),
8289
8289
  /** Total files discovered up front; null while (or when) unknown. */
8290
8290
  filesTotal: number().int().nullable(),
8291
+ /**
8292
+ * Rows this run CORRECTED while moving them — a durable mutation the move
8293
+ * made that nobody asked for, so it is reported where the operator reads the
8294
+ * job rather than only in a log line.
8295
+ *
8296
+ * A footage segment records its byte count in its own NAME, and the durable
8297
+ * hour row derives its aggregates from those names. A file that does not
8298
+ * match its name therefore makes the ledger's sums — and with them quota and
8299
+ * pressure eviction — wrong by the difference, and only a rename can fix it.
8300
+ * On 2026-08-30 one such row also stalled a 110 749-file drain permanently.
8301
+ *
8302
+ * Absent on lanes where the question has no meaning: a media blob's size is
8303
+ * in its row, not in its name, so `MediaRelocateEngine` never reconciles one.
8304
+ */
8305
+ rowsReconciled: number().int().nonnegative().optional(),
8291
8306
  startedAt: number(),
8292
8307
  finishedAt: number().nullable(),
8293
8308
  error: string().nullable()
@@ -8356,14 +8371,42 @@ var RelocateMediaInputSchema = object({
8356
8371
  /** Omitted = `move`, the pre-existing behaviour. */
8357
8372
  mode: MediaRelocateModeSchema.optional()
8358
8373
  });
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()
8374
+ /**
8375
+ * The unstamped population of ONE collection split, because the gate and the
8376
+ * operator ask two different questions and only one of them has to be cheap.
8377
+ *
8378
+ * `present` is the GATE: "is there at least one row that would be orphaned by a
8379
+ * repoint". It is a single indexed seek to the first matching row, so it stays
8380
+ * answerable on a saturated disk and answers in O(log n) precisely in the state
8381
+ * that matters — after a seal, when the population is empty.
8382
+ *
8383
+ * `rows` is the NUMBER, for the refusal message and the operator's sense of
8384
+ * scale. It is a second, indexed `COUNT(*)`, and `null` means **not
8385
+ * measurable** — never zero. `{ present: true, rows: null }` is a legitimate
8386
+ * and useful answer: "there are some, and this read could not say how many"
8387
+ * still refuses the cutover, which is the whole job.
8388
+ */
8389
+ var UnstampedRowsSchema = object({
8390
+ present: boolean(),
8391
+ rows: number().int().nonnegative().nullable()
8366
8392
  });
8393
+ /**
8394
+ * How many rows still carry NO `locationId` — the population a repoint would
8395
+ * silently re-aim at a disk that does not hold their bytes.
8396
+ *
8397
+ * **`null` = the count could not be taken**, and it is NOT permission to cut
8398
+ * over. The gate opens on a measured absence and on nothing else; an unread
8399
+ * collection and an empty one are different facts, and this repo has already
8400
+ * paid for conflating them (`RelocateResidueSchema`, D295).
8401
+ */
8402
+ var UnstampedEventMediaCountSchema = object({
8403
+ media: UnstampedRowsSchema,
8404
+ retrainFrames: UnstampedRowsSchema,
8405
+ /** True when EITHER collection holds one. The refusal reads this. */
8406
+ anyPresent: boolean(),
8407
+ /** Sum across both, or `null` when either lane could not be counted. */
8408
+ total: number().int().nonnegative().nullable()
8409
+ }).nullable();
8367
8410
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8368
8411
  /** The independently selectable logical storage classes — every class
8369
8412
  * `storage.listLocationDeclarations` reports, so an operator never meets a
@@ -8474,6 +8517,10 @@ var StorageMigrationMoveProgressSchema = object({
8474
8517
  /** The archive census — the **M** of "N of M" (D295). `null` = unknowable. */
8475
8518
  filesTotal: number().int().nonnegative().nullable(),
8476
8519
  bytesMoved: number().int().nonnegative(),
8520
+ /** Rows the mover corrected while moving them — see `RelocateJob`. Absent on
8521
+ * a lane that cannot reconcile. A migration that silently rewrote durable
8522
+ * rows would be the same failure as one that silently skipped them. */
8523
+ rowsReconciled: number().int().nonnegative().optional(),
8477
8524
  /** The MOVER's start, not the migration's: a drain restarted after an addon
8478
8525
  * crash gets a new mover, and a rate computed from the migration's start
8479
8526
  * would silently average in the time nothing was running. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-reolink",
3
- "version": "1.2.68",
3
+ "version": "1.2.69",
4
4
  "description": "Reolink camera device provider addon for CamStack — native Baichuan protocol",
5
5
  "keywords": [
6
6
  "camstack",