@camstack/addon-provider-homematic 1.2.46 → 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.
package/dist/addon.js CHANGED
@@ -8012,6 +8012,21 @@ var RelocateJobSchema = object({
8012
8012
  bytesMoved: number().int(),
8013
8013
  /** Total files discovered up front; null while (or when) unknown. */
8014
8014
  filesTotal: number().int().nullable(),
8015
+ /**
8016
+ * Rows this run CORRECTED while moving them — a durable mutation the move
8017
+ * made that nobody asked for, so it is reported where the operator reads the
8018
+ * job rather than only in a log line.
8019
+ *
8020
+ * A footage segment records its byte count in its own NAME, and the durable
8021
+ * hour row derives its aggregates from those names. A file that does not
8022
+ * match its name therefore makes the ledger's sums — and with them quota and
8023
+ * pressure eviction — wrong by the difference, and only a rename can fix it.
8024
+ * On 2026-08-30 one such row also stalled a 110 749-file drain permanently.
8025
+ *
8026
+ * Absent on lanes where the question has no meaning: a media blob's size is
8027
+ * in its row, not in its name, so `MediaRelocateEngine` never reconciles one.
8028
+ */
8029
+ rowsReconciled: number().int().nonnegative().optional(),
8015
8030
  startedAt: number(),
8016
8031
  finishedAt: number().nullable(),
8017
8032
  error: string().nullable()
@@ -8080,14 +8095,42 @@ var RelocateMediaInputSchema = object({
8080
8095
  /** Omitted = `move`, the pre-existing behaviour. */
8081
8096
  mode: MediaRelocateModeSchema.optional()
8082
8097
  });
8083
- /** How many rows still carry NO `locationId` — the population a repoint would
8084
- * silently re-aim at a disk that does not hold their bytes. Zero is the only
8085
- * value that permits a non-blocking `eventMedia` cutover. */
8086
- var UnstampedEventMediaCountSchema = object({
8087
- media: number().int().nonnegative(),
8088
- retrainFrames: number().int().nonnegative(),
8089
- total: number().int().nonnegative()
8098
+ /**
8099
+ * The unstamped population of ONE collection — split, because the gate and the
8100
+ * operator ask two different questions and only one of them has to be cheap.
8101
+ *
8102
+ * `present` is the GATE: "is there at least one row that would be orphaned by a
8103
+ * repoint". It is a single indexed seek to the first matching row, so it stays
8104
+ * answerable on a saturated disk and answers in O(log n) precisely in the state
8105
+ * that matters — after a seal, when the population is empty.
8106
+ *
8107
+ * `rows` is the NUMBER, for the refusal message and the operator's sense of
8108
+ * scale. It is a second, indexed `COUNT(*)`, and `null` means **not
8109
+ * measurable** — never zero. `{ present: true, rows: null }` is a legitimate
8110
+ * and useful answer: "there are some, and this read could not say how many"
8111
+ * still refuses the cutover, which is the whole job.
8112
+ */
8113
+ var UnstampedRowsSchema = object({
8114
+ present: boolean(),
8115
+ rows: number().int().nonnegative().nullable()
8090
8116
  });
8117
+ /**
8118
+ * How many rows still carry NO `locationId` — the population a repoint would
8119
+ * silently re-aim at a disk that does not hold their bytes.
8120
+ *
8121
+ * **`null` = the count could not be taken**, and it is NOT permission to cut
8122
+ * over. The gate opens on a measured absence and on nothing else; an unread
8123
+ * collection and an empty one are different facts, and this repo has already
8124
+ * paid for conflating them (`RelocateResidueSchema`, D295).
8125
+ */
8126
+ var UnstampedEventMediaCountSchema = object({
8127
+ media: UnstampedRowsSchema,
8128
+ retrainFrames: UnstampedRowsSchema,
8129
+ /** True when EITHER collection holds one. The refusal reads this. */
8130
+ anyPresent: boolean(),
8131
+ /** Sum across both, or `null` when either lane could not be counted. */
8132
+ total: number().int().nonnegative().nullable()
8133
+ }).nullable();
8091
8134
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8092
8135
  /** The independently selectable logical storage classes — every class
8093
8136
  * `storage.listLocationDeclarations` reports, so an operator never meets a
@@ -8198,6 +8241,10 @@ var StorageMigrationMoveProgressSchema = object({
8198
8241
  /** The archive census — the **M** of "N of M" (D295). `null` = unknowable. */
8199
8242
  filesTotal: number().int().nonnegative().nullable(),
8200
8243
  bytesMoved: number().int().nonnegative(),
8244
+ /** Rows the mover corrected while moving them — see `RelocateJob`. Absent on
8245
+ * a lane that cannot reconcile. A migration that silently rewrote durable
8246
+ * rows would be the same failure as one that silently skipped them. */
8247
+ rowsReconciled: number().int().nonnegative().optional(),
8201
8248
  /** The MOVER's start, not the migration's: a drain restarted after an addon
8202
8249
  * crash gets a new mover, and a rate computed from the migration's start
8203
8250
  * would silently average in the time nothing was running. */
package/dist/addon.mjs CHANGED
@@ -8013,6 +8013,21 @@ var RelocateJobSchema = object({
8013
8013
  bytesMoved: number().int(),
8014
8014
  /** Total files discovered up front; null while (or when) unknown. */
8015
8015
  filesTotal: number().int().nullable(),
8016
+ /**
8017
+ * Rows this run CORRECTED while moving them — a durable mutation the move
8018
+ * made that nobody asked for, so it is reported where the operator reads the
8019
+ * job rather than only in a log line.
8020
+ *
8021
+ * A footage segment records its byte count in its own NAME, and the durable
8022
+ * hour row derives its aggregates from those names. A file that does not
8023
+ * match its name therefore makes the ledger's sums — and with them quota and
8024
+ * pressure eviction — wrong by the difference, and only a rename can fix it.
8025
+ * On 2026-08-30 one such row also stalled a 110 749-file drain permanently.
8026
+ *
8027
+ * Absent on lanes where the question has no meaning: a media blob's size is
8028
+ * in its row, not in its name, so `MediaRelocateEngine` never reconciles one.
8029
+ */
8030
+ rowsReconciled: number().int().nonnegative().optional(),
8016
8031
  startedAt: number(),
8017
8032
  finishedAt: number().nullable(),
8018
8033
  error: string().nullable()
@@ -8081,14 +8096,42 @@ var RelocateMediaInputSchema = object({
8081
8096
  /** Omitted = `move`, the pre-existing behaviour. */
8082
8097
  mode: MediaRelocateModeSchema.optional()
8083
8098
  });
8084
- /** How many rows still carry NO `locationId` — the population a repoint would
8085
- * silently re-aim at a disk that does not hold their bytes. Zero is the only
8086
- * value that permits a non-blocking `eventMedia` cutover. */
8087
- var UnstampedEventMediaCountSchema = object({
8088
- media: number().int().nonnegative(),
8089
- retrainFrames: number().int().nonnegative(),
8090
- total: number().int().nonnegative()
8099
+ /**
8100
+ * The unstamped population of ONE collection — split, because the gate and the
8101
+ * operator ask two different questions and only one of them has to be cheap.
8102
+ *
8103
+ * `present` is the GATE: "is there at least one row that would be orphaned by a
8104
+ * repoint". It is a single indexed seek to the first matching row, so it stays
8105
+ * answerable on a saturated disk and answers in O(log n) precisely in the state
8106
+ * that matters — after a seal, when the population is empty.
8107
+ *
8108
+ * `rows` is the NUMBER, for the refusal message and the operator's sense of
8109
+ * scale. It is a second, indexed `COUNT(*)`, and `null` means **not
8110
+ * measurable** — never zero. `{ present: true, rows: null }` is a legitimate
8111
+ * and useful answer: "there are some, and this read could not say how many"
8112
+ * still refuses the cutover, which is the whole job.
8113
+ */
8114
+ var UnstampedRowsSchema = object({
8115
+ present: boolean(),
8116
+ rows: number().int().nonnegative().nullable()
8091
8117
  });
8118
+ /**
8119
+ * How many rows still carry NO `locationId` — the population a repoint would
8120
+ * silently re-aim at a disk that does not hold their bytes.
8121
+ *
8122
+ * **`null` = the count could not be taken**, and it is NOT permission to cut
8123
+ * over. The gate opens on a measured absence and on nothing else; an unread
8124
+ * collection and an empty one are different facts, and this repo has already
8125
+ * paid for conflating them (`RelocateResidueSchema`, D295).
8126
+ */
8127
+ var UnstampedEventMediaCountSchema = object({
8128
+ media: UnstampedRowsSchema,
8129
+ retrainFrames: UnstampedRowsSchema,
8130
+ /** True when EITHER collection holds one. The refusal reads this. */
8131
+ anyPresent: boolean(),
8132
+ /** Sum across both, or `null` when either lane could not be counted. */
8133
+ total: number().int().nonnegative().nullable()
8134
+ }).nullable();
8092
8135
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8093
8136
  /** The independently selectable logical storage classes — every class
8094
8137
  * `storage.listLocationDeclarations` reports, so an operator never meets a
@@ -8199,6 +8242,10 @@ var StorageMigrationMoveProgressSchema = object({
8199
8242
  /** The archive census — the **M** of "N of M" (D295). `null` = unknowable. */
8200
8243
  filesTotal: number().int().nonnegative().nullable(),
8201
8244
  bytesMoved: number().int().nonnegative(),
8245
+ /** Rows the mover corrected while moving them — see `RelocateJob`. Absent on
8246
+ * a lane that cannot reconcile. A migration that silently rewrote durable
8247
+ * rows would be the same failure as one that silently skipped them. */
8248
+ rowsReconciled: number().int().nonnegative().optional(),
8202
8249
  /** The MOVER's start, not the migration's: a drain restarted after an addon
8203
8250
  * crash gets a new mover, and a rate computed from the migration's start
8204
8251
  * 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-homematic",
3
- "version": "1.2.46",
3
+ "version": "1.2.47",
4
4
  "description": "Homematic / HomematicIP (CCU3 / RaspberryMatic) device-provider addon for CamStack — wraps the nodehomematic library",
5
5
  "keywords": [
6
6
  "camstack",