@camstack/addon-provider-dreo 0.2.45 → 0.2.46

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
@@ -8039,6 +8039,21 @@ var RelocateJobSchema = object({
8039
8039
  bytesMoved: number().int(),
8040
8040
  /** Total files discovered up front; null while (or when) unknown. */
8041
8041
  filesTotal: number().int().nullable(),
8042
+ /**
8043
+ * Rows this run CORRECTED while moving them — a durable mutation the move
8044
+ * made that nobody asked for, so it is reported where the operator reads the
8045
+ * job rather than only in a log line.
8046
+ *
8047
+ * A footage segment records its byte count in its own NAME, and the durable
8048
+ * hour row derives its aggregates from those names. A file that does not
8049
+ * match its name therefore makes the ledger's sums — and with them quota and
8050
+ * pressure eviction — wrong by the difference, and only a rename can fix it.
8051
+ * On 2026-08-30 one such row also stalled a 110 749-file drain permanently.
8052
+ *
8053
+ * Absent on lanes where the question has no meaning: a media blob's size is
8054
+ * in its row, not in its name, so `MediaRelocateEngine` never reconciles one.
8055
+ */
8056
+ rowsReconciled: number().int().nonnegative().optional(),
8042
8057
  startedAt: number(),
8043
8058
  finishedAt: number().nullable(),
8044
8059
  error: string().nullable()
@@ -8107,14 +8122,42 @@ var RelocateMediaInputSchema = object({
8107
8122
  /** Omitted = `move`, the pre-existing behaviour. */
8108
8123
  mode: MediaRelocateModeSchema.optional()
8109
8124
  });
8110
- /** How many rows still carry NO `locationId` — the population a repoint would
8111
- * silently re-aim at a disk that does not hold their bytes. Zero is the only
8112
- * value that permits a non-blocking `eventMedia` cutover. */
8113
- var UnstampedEventMediaCountSchema = object({
8114
- media: number().int().nonnegative(),
8115
- retrainFrames: number().int().nonnegative(),
8116
- total: number().int().nonnegative()
8125
+ /**
8126
+ * The unstamped population of ONE collection — split, because the gate and the
8127
+ * operator ask two different questions and only one of them has to be cheap.
8128
+ *
8129
+ * `present` is the GATE: "is there at least one row that would be orphaned by a
8130
+ * repoint". It is a single indexed seek to the first matching row, so it stays
8131
+ * answerable on a saturated disk and answers in O(log n) precisely in the state
8132
+ * that matters — after a seal, when the population is empty.
8133
+ *
8134
+ * `rows` is the NUMBER, for the refusal message and the operator's sense of
8135
+ * scale. It is a second, indexed `COUNT(*)`, and `null` means **not
8136
+ * measurable** — never zero. `{ present: true, rows: null }` is a legitimate
8137
+ * and useful answer: "there are some, and this read could not say how many"
8138
+ * still refuses the cutover, which is the whole job.
8139
+ */
8140
+ var UnstampedRowsSchema = object({
8141
+ present: boolean(),
8142
+ rows: number().int().nonnegative().nullable()
8117
8143
  });
8144
+ /**
8145
+ * How many rows still carry NO `locationId` — the population a repoint would
8146
+ * silently re-aim at a disk that does not hold their bytes.
8147
+ *
8148
+ * **`null` = the count could not be taken**, and it is NOT permission to cut
8149
+ * over. The gate opens on a measured absence and on nothing else; an unread
8150
+ * collection and an empty one are different facts, and this repo has already
8151
+ * paid for conflating them (`RelocateResidueSchema`, D295).
8152
+ */
8153
+ var UnstampedEventMediaCountSchema = object({
8154
+ media: UnstampedRowsSchema,
8155
+ retrainFrames: UnstampedRowsSchema,
8156
+ /** True when EITHER collection holds one. The refusal reads this. */
8157
+ anyPresent: boolean(),
8158
+ /** Sum across both, or `null` when either lane could not be counted. */
8159
+ total: number().int().nonnegative().nullable()
8160
+ }).nullable();
8118
8161
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8119
8162
  /** The independently selectable logical storage classes — every class
8120
8163
  * `storage.listLocationDeclarations` reports, so an operator never meets a
@@ -8225,6 +8268,10 @@ var StorageMigrationMoveProgressSchema = object({
8225
8268
  /** The archive census — the **M** of "N of M" (D295). `null` = unknowable. */
8226
8269
  filesTotal: number().int().nonnegative().nullable(),
8227
8270
  bytesMoved: number().int().nonnegative(),
8271
+ /** Rows the mover corrected while moving them — see `RelocateJob`. Absent on
8272
+ * a lane that cannot reconcile. A migration that silently rewrote durable
8273
+ * rows would be the same failure as one that silently skipped them. */
8274
+ rowsReconciled: number().int().nonnegative().optional(),
8228
8275
  /** The MOVER's start, not the migration's: a drain restarted after an addon
8229
8276
  * crash gets a new mover, and a rate computed from the migration's start
8230
8277
  * would silently average in the time nothing was running. */
package/dist/addon.mjs CHANGED
@@ -8040,6 +8040,21 @@ var RelocateJobSchema = object({
8040
8040
  bytesMoved: number().int(),
8041
8041
  /** Total files discovered up front; null while (or when) unknown. */
8042
8042
  filesTotal: number().int().nullable(),
8043
+ /**
8044
+ * Rows this run CORRECTED while moving them — a durable mutation the move
8045
+ * made that nobody asked for, so it is reported where the operator reads the
8046
+ * job rather than only in a log line.
8047
+ *
8048
+ * A footage segment records its byte count in its own NAME, and the durable
8049
+ * hour row derives its aggregates from those names. A file that does not
8050
+ * match its name therefore makes the ledger's sums — and with them quota and
8051
+ * pressure eviction — wrong by the difference, and only a rename can fix it.
8052
+ * On 2026-08-30 one such row also stalled a 110 749-file drain permanently.
8053
+ *
8054
+ * Absent on lanes where the question has no meaning: a media blob's size is
8055
+ * in its row, not in its name, so `MediaRelocateEngine` never reconciles one.
8056
+ */
8057
+ rowsReconciled: number().int().nonnegative().optional(),
8043
8058
  startedAt: number(),
8044
8059
  finishedAt: number().nullable(),
8045
8060
  error: string().nullable()
@@ -8108,14 +8123,42 @@ var RelocateMediaInputSchema = object({
8108
8123
  /** Omitted = `move`, the pre-existing behaviour. */
8109
8124
  mode: MediaRelocateModeSchema.optional()
8110
8125
  });
8111
- /** How many rows still carry NO `locationId` — the population a repoint would
8112
- * silently re-aim at a disk that does not hold their bytes. Zero is the only
8113
- * value that permits a non-blocking `eventMedia` cutover. */
8114
- var UnstampedEventMediaCountSchema = object({
8115
- media: number().int().nonnegative(),
8116
- retrainFrames: number().int().nonnegative(),
8117
- total: number().int().nonnegative()
8126
+ /**
8127
+ * The unstamped population of ONE collection — split, because the gate and the
8128
+ * operator ask two different questions and only one of them has to be cheap.
8129
+ *
8130
+ * `present` is the GATE: "is there at least one row that would be orphaned by a
8131
+ * repoint". It is a single indexed seek to the first matching row, so it stays
8132
+ * answerable on a saturated disk and answers in O(log n) precisely in the state
8133
+ * that matters — after a seal, when the population is empty.
8134
+ *
8135
+ * `rows` is the NUMBER, for the refusal message and the operator's sense of
8136
+ * scale. It is a second, indexed `COUNT(*)`, and `null` means **not
8137
+ * measurable** — never zero. `{ present: true, rows: null }` is a legitimate
8138
+ * and useful answer: "there are some, and this read could not say how many"
8139
+ * still refuses the cutover, which is the whole job.
8140
+ */
8141
+ var UnstampedRowsSchema = object({
8142
+ present: boolean(),
8143
+ rows: number().int().nonnegative().nullable()
8118
8144
  });
8145
+ /**
8146
+ * How many rows still carry NO `locationId` — the population a repoint would
8147
+ * silently re-aim at a disk that does not hold their bytes.
8148
+ *
8149
+ * **`null` = the count could not be taken**, and it is NOT permission to cut
8150
+ * over. The gate opens on a measured absence and on nothing else; an unread
8151
+ * collection and an empty one are different facts, and this repo has already
8152
+ * paid for conflating them (`RelocateResidueSchema`, D295).
8153
+ */
8154
+ var UnstampedEventMediaCountSchema = object({
8155
+ media: UnstampedRowsSchema,
8156
+ retrainFrames: UnstampedRowsSchema,
8157
+ /** True when EITHER collection holds one. The refusal reads this. */
8158
+ anyPresent: boolean(),
8159
+ /** Sum across both, or `null` when either lane could not be counted. */
8160
+ total: number().int().nonnegative().nullable()
8161
+ }).nullable();
8119
8162
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8120
8163
  /** The independently selectable logical storage classes — every class
8121
8164
  * `storage.listLocationDeclarations` reports, so an operator never meets a
@@ -8226,6 +8269,10 @@ var StorageMigrationMoveProgressSchema = object({
8226
8269
  /** The archive census — the **M** of "N of M" (D295). `null` = unknowable. */
8227
8270
  filesTotal: number().int().nonnegative().nullable(),
8228
8271
  bytesMoved: number().int().nonnegative(),
8272
+ /** Rows the mover corrected while moving them — see `RelocateJob`. Absent on
8273
+ * a lane that cannot reconcile. A migration that silently rewrote durable
8274
+ * rows would be the same failure as one that silently skipped them. */
8275
+ rowsReconciled: number().int().nonnegative().optional(),
8229
8276
  /** The MOVER's start, not the migration's: a drain restarted after an addon
8230
8277
  * crash gets a new mover, and a rate computed from the migration's start
8231
8278
  * 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-dreo",
3
- "version": "0.2.45",
3
+ "version": "0.2.46",
4
4
  "description": "Dreo smart-device (fan / air-circulator / purifier / heater / humidifier) device-provider addon for CamStack — wraps the @apocaliss92/nodedreo Dreo cloud client (REST + WebSocket)",
5
5
  "keywords": [
6
6
  "camstack",