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