@camstack/addon-provider-hikvision 1.2.53 → 1.2.54

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
@@ -7998,6 +7998,21 @@ var RelocateJobSchema = object({
7998
7998
  bytesMoved: number().int(),
7999
7999
  /** Total files discovered up front; null while (or when) unknown. */
8000
8000
  filesTotal: number().int().nullable(),
8001
+ /**
8002
+ * Rows this run CORRECTED while moving them — a durable mutation the move
8003
+ * made that nobody asked for, so it is reported where the operator reads the
8004
+ * job rather than only in a log line.
8005
+ *
8006
+ * A footage segment records its byte count in its own NAME, and the durable
8007
+ * hour row derives its aggregates from those names. A file that does not
8008
+ * match its name therefore makes the ledger's sums — and with them quota and
8009
+ * pressure eviction — wrong by the difference, and only a rename can fix it.
8010
+ * On 2026-08-30 one such row also stalled a 110 749-file drain permanently.
8011
+ *
8012
+ * Absent on lanes where the question has no meaning: a media blob's size is
8013
+ * in its row, not in its name, so `MediaRelocateEngine` never reconciles one.
8014
+ */
8015
+ rowsReconciled: number().int().nonnegative().optional(),
8001
8016
  startedAt: number(),
8002
8017
  finishedAt: number().nullable(),
8003
8018
  error: string().nullable()
@@ -8066,14 +8081,42 @@ var RelocateMediaInputSchema = object({
8066
8081
  /** Omitted = `move`, the pre-existing behaviour. */
8067
8082
  mode: MediaRelocateModeSchema.optional()
8068
8083
  });
8069
- /** How many rows still carry NO `locationId` — the population a repoint would
8070
- * silently re-aim at a disk that does not hold their bytes. Zero is the only
8071
- * value that permits a non-blocking `eventMedia` cutover. */
8072
- var UnstampedEventMediaCountSchema = object({
8073
- media: number().int().nonnegative(),
8074
- retrainFrames: number().int().nonnegative(),
8075
- total: number().int().nonnegative()
8084
+ /**
8085
+ * The unstamped population of ONE collection split, because the gate and the
8086
+ * operator ask two different questions and only one of them has to be cheap.
8087
+ *
8088
+ * `present` is the GATE: "is there at least one row that would be orphaned by a
8089
+ * repoint". It is a single indexed seek to the first matching row, so it stays
8090
+ * answerable on a saturated disk and answers in O(log n) precisely in the state
8091
+ * that matters — after a seal, when the population is empty.
8092
+ *
8093
+ * `rows` is the NUMBER, for the refusal message and the operator's sense of
8094
+ * scale. It is a second, indexed `COUNT(*)`, and `null` means **not
8095
+ * measurable** — never zero. `{ present: true, rows: null }` is a legitimate
8096
+ * and useful answer: "there are some, and this read could not say how many"
8097
+ * still refuses the cutover, which is the whole job.
8098
+ */
8099
+ var UnstampedRowsSchema = object({
8100
+ present: boolean(),
8101
+ rows: number().int().nonnegative().nullable()
8076
8102
  });
8103
+ /**
8104
+ * How many rows still carry NO `locationId` — the population a repoint would
8105
+ * silently re-aim at a disk that does not hold their bytes.
8106
+ *
8107
+ * **`null` = the count could not be taken**, and it is NOT permission to cut
8108
+ * over. The gate opens on a measured absence and on nothing else; an unread
8109
+ * collection and an empty one are different facts, and this repo has already
8110
+ * paid for conflating them (`RelocateResidueSchema`, D295).
8111
+ */
8112
+ var UnstampedEventMediaCountSchema = object({
8113
+ media: UnstampedRowsSchema,
8114
+ retrainFrames: UnstampedRowsSchema,
8115
+ /** True when EITHER collection holds one. The refusal reads this. */
8116
+ anyPresent: boolean(),
8117
+ /** Sum across both, or `null` when either lane could not be counted. */
8118
+ total: number().int().nonnegative().nullable()
8119
+ }).nullable();
8077
8120
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8078
8121
  /** The independently selectable logical storage classes — every class
8079
8122
  * `storage.listLocationDeclarations` reports, so an operator never meets a
@@ -8184,6 +8227,10 @@ var StorageMigrationMoveProgressSchema = object({
8184
8227
  /** The archive census — the **M** of "N of M" (D295). `null` = unknowable. */
8185
8228
  filesTotal: number().int().nonnegative().nullable(),
8186
8229
  bytesMoved: number().int().nonnegative(),
8230
+ /** Rows the mover corrected while moving them — see `RelocateJob`. Absent on
8231
+ * a lane that cannot reconcile. A migration that silently rewrote durable
8232
+ * rows would be the same failure as one that silently skipped them. */
8233
+ rowsReconciled: number().int().nonnegative().optional(),
8187
8234
  /** The MOVER's start, not the migration's: a drain restarted after an addon
8188
8235
  * crash gets a new mover, and a rate computed from the migration's start
8189
8236
  * would silently average in the time nothing was running. */
package/dist/addon.mjs CHANGED
@@ -7999,6 +7999,21 @@ var RelocateJobSchema = object({
7999
7999
  bytesMoved: number().int(),
8000
8000
  /** Total files discovered up front; null while (or when) unknown. */
8001
8001
  filesTotal: number().int().nullable(),
8002
+ /**
8003
+ * Rows this run CORRECTED while moving them — a durable mutation the move
8004
+ * made that nobody asked for, so it is reported where the operator reads the
8005
+ * job rather than only in a log line.
8006
+ *
8007
+ * A footage segment records its byte count in its own NAME, and the durable
8008
+ * hour row derives its aggregates from those names. A file that does not
8009
+ * match its name therefore makes the ledger's sums — and with them quota and
8010
+ * pressure eviction — wrong by the difference, and only a rename can fix it.
8011
+ * On 2026-08-30 one such row also stalled a 110 749-file drain permanently.
8012
+ *
8013
+ * Absent on lanes where the question has no meaning: a media blob's size is
8014
+ * in its row, not in its name, so `MediaRelocateEngine` never reconciles one.
8015
+ */
8016
+ rowsReconciled: number().int().nonnegative().optional(),
8002
8017
  startedAt: number(),
8003
8018
  finishedAt: number().nullable(),
8004
8019
  error: string().nullable()
@@ -8067,14 +8082,42 @@ var RelocateMediaInputSchema = object({
8067
8082
  /** Omitted = `move`, the pre-existing behaviour. */
8068
8083
  mode: MediaRelocateModeSchema.optional()
8069
8084
  });
8070
- /** How many rows still carry NO `locationId` — the population a repoint would
8071
- * silently re-aim at a disk that does not hold their bytes. Zero is the only
8072
- * value that permits a non-blocking `eventMedia` cutover. */
8073
- var UnstampedEventMediaCountSchema = object({
8074
- media: number().int().nonnegative(),
8075
- retrainFrames: number().int().nonnegative(),
8076
- total: number().int().nonnegative()
8085
+ /**
8086
+ * The unstamped population of ONE collection split, because the gate and the
8087
+ * operator ask two different questions and only one of them has to be cheap.
8088
+ *
8089
+ * `present` is the GATE: "is there at least one row that would be orphaned by a
8090
+ * repoint". It is a single indexed seek to the first matching row, so it stays
8091
+ * answerable on a saturated disk and answers in O(log n) precisely in the state
8092
+ * that matters — after a seal, when the population is empty.
8093
+ *
8094
+ * `rows` is the NUMBER, for the refusal message and the operator's sense of
8095
+ * scale. It is a second, indexed `COUNT(*)`, and `null` means **not
8096
+ * measurable** — never zero. `{ present: true, rows: null }` is a legitimate
8097
+ * and useful answer: "there are some, and this read could not say how many"
8098
+ * still refuses the cutover, which is the whole job.
8099
+ */
8100
+ var UnstampedRowsSchema = object({
8101
+ present: boolean(),
8102
+ rows: number().int().nonnegative().nullable()
8077
8103
  });
8104
+ /**
8105
+ * How many rows still carry NO `locationId` — the population a repoint would
8106
+ * silently re-aim at a disk that does not hold their bytes.
8107
+ *
8108
+ * **`null` = the count could not be taken**, and it is NOT permission to cut
8109
+ * over. The gate opens on a measured absence and on nothing else; an unread
8110
+ * collection and an empty one are different facts, and this repo has already
8111
+ * paid for conflating them (`RelocateResidueSchema`, D295).
8112
+ */
8113
+ var UnstampedEventMediaCountSchema = object({
8114
+ media: UnstampedRowsSchema,
8115
+ retrainFrames: UnstampedRowsSchema,
8116
+ /** True when EITHER collection holds one. The refusal reads this. */
8117
+ anyPresent: boolean(),
8118
+ /** Sum across both, or `null` when either lane could not be counted. */
8119
+ total: number().int().nonnegative().nullable()
8120
+ }).nullable();
8078
8121
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8079
8122
  /** The independently selectable logical storage classes — every class
8080
8123
  * `storage.listLocationDeclarations` reports, so an operator never meets a
@@ -8185,6 +8228,10 @@ var StorageMigrationMoveProgressSchema = object({
8185
8228
  /** The archive census — the **M** of "N of M" (D295). `null` = unknowable. */
8186
8229
  filesTotal: number().int().nonnegative().nullable(),
8187
8230
  bytesMoved: number().int().nonnegative(),
8231
+ /** Rows the mover corrected while moving them — see `RelocateJob`. Absent on
8232
+ * a lane that cannot reconcile. A migration that silently rewrote durable
8233
+ * rows would be the same failure as one that silently skipped them. */
8234
+ rowsReconciled: number().int().nonnegative().optional(),
8188
8235
  /** The MOVER's start, not the migration's: a drain restarted after an addon
8189
8236
  * crash gets a new mover, and a rate computed from the migration's start
8190
8237
  * 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-hikvision",
3
- "version": "1.2.53",
3
+ "version": "1.2.54",
4
4
  "description": "Hikvision camera device provider addon for CamStack — ISAPI over HTTP(S) with digest auth (snapshot, alarm stream, RTSP discovery)",
5
5
  "keywords": [
6
6
  "camstack",