@camstack/addon-provider-petkit 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
@@ -9105,6 +9105,21 @@ var RelocateJobSchema = object({
9105
9105
  bytesMoved: number().int(),
9106
9106
  /** Total files discovered up front; null while (or when) unknown. */
9107
9107
  filesTotal: number().int().nullable(),
9108
+ /**
9109
+ * Rows this run CORRECTED while moving them — a durable mutation the move
9110
+ * made that nobody asked for, so it is reported where the operator reads the
9111
+ * job rather than only in a log line.
9112
+ *
9113
+ * A footage segment records its byte count in its own NAME, and the durable
9114
+ * hour row derives its aggregates from those names. A file that does not
9115
+ * match its name therefore makes the ledger's sums — and with them quota and
9116
+ * pressure eviction — wrong by the difference, and only a rename can fix it.
9117
+ * On 2026-08-30 one such row also stalled a 110 749-file drain permanently.
9118
+ *
9119
+ * Absent on lanes where the question has no meaning: a media blob's size is
9120
+ * in its row, not in its name, so `MediaRelocateEngine` never reconciles one.
9121
+ */
9122
+ rowsReconciled: number().int().nonnegative().optional(),
9108
9123
  startedAt: number(),
9109
9124
  finishedAt: number().nullable(),
9110
9125
  error: string().nullable()
@@ -9173,14 +9188,42 @@ var RelocateMediaInputSchema = object({
9173
9188
  /** Omitted = `move`, the pre-existing behaviour. */
9174
9189
  mode: MediaRelocateModeSchema.optional()
9175
9190
  });
9176
- /** How many rows still carry NO `locationId` — the population a repoint would
9177
- * silently re-aim at a disk that does not hold their bytes. Zero is the only
9178
- * value that permits a non-blocking `eventMedia` cutover. */
9179
- var UnstampedEventMediaCountSchema = object({
9180
- media: number().int().nonnegative(),
9181
- retrainFrames: number().int().nonnegative(),
9182
- total: number().int().nonnegative()
9191
+ /**
9192
+ * The unstamped population of ONE collection split, because the gate and the
9193
+ * operator ask two different questions and only one of them has to be cheap.
9194
+ *
9195
+ * `present` is the GATE: "is there at least one row that would be orphaned by a
9196
+ * repoint". It is a single indexed seek to the first matching row, so it stays
9197
+ * answerable on a saturated disk and answers in O(log n) precisely in the state
9198
+ * that matters — after a seal, when the population is empty.
9199
+ *
9200
+ * `rows` is the NUMBER, for the refusal message and the operator's sense of
9201
+ * scale. It is a second, indexed `COUNT(*)`, and `null` means **not
9202
+ * measurable** — never zero. `{ present: true, rows: null }` is a legitimate
9203
+ * and useful answer: "there are some, and this read could not say how many"
9204
+ * still refuses the cutover, which is the whole job.
9205
+ */
9206
+ var UnstampedRowsSchema = object({
9207
+ present: boolean(),
9208
+ rows: number().int().nonnegative().nullable()
9183
9209
  });
9210
+ /**
9211
+ * How many rows still carry NO `locationId` — the population a repoint would
9212
+ * silently re-aim at a disk that does not hold their bytes.
9213
+ *
9214
+ * **`null` = the count could not be taken**, and it is NOT permission to cut
9215
+ * over. The gate opens on a measured absence and on nothing else; an unread
9216
+ * collection and an empty one are different facts, and this repo has already
9217
+ * paid for conflating them (`RelocateResidueSchema`, D295).
9218
+ */
9219
+ var UnstampedEventMediaCountSchema = object({
9220
+ media: UnstampedRowsSchema,
9221
+ retrainFrames: UnstampedRowsSchema,
9222
+ /** True when EITHER collection holds one. The refusal reads this. */
9223
+ anyPresent: boolean(),
9224
+ /** Sum across both, or `null` when either lane could not be counted. */
9225
+ total: number().int().nonnegative().nullable()
9226
+ }).nullable();
9184
9227
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
9185
9228
  /** The independently selectable logical storage classes — every class
9186
9229
  * `storage.listLocationDeclarations` reports, so an operator never meets a
@@ -9291,6 +9334,10 @@ var StorageMigrationMoveProgressSchema = object({
9291
9334
  /** The archive census — the **M** of "N of M" (D295). `null` = unknowable. */
9292
9335
  filesTotal: number().int().nonnegative().nullable(),
9293
9336
  bytesMoved: number().int().nonnegative(),
9337
+ /** Rows the mover corrected while moving them — see `RelocateJob`. Absent on
9338
+ * a lane that cannot reconcile. A migration that silently rewrote durable
9339
+ * rows would be the same failure as one that silently skipped them. */
9340
+ rowsReconciled: number().int().nonnegative().optional(),
9294
9341
  /** The MOVER's start, not the migration's: a drain restarted after an addon
9295
9342
  * crash gets a new mover, and a rate computed from the migration's start
9296
9343
  * would silently average in the time nothing was running. */
package/dist/addon.mjs CHANGED
@@ -9104,6 +9104,21 @@ var RelocateJobSchema = object({
9104
9104
  bytesMoved: number().int(),
9105
9105
  /** Total files discovered up front; null while (or when) unknown. */
9106
9106
  filesTotal: number().int().nullable(),
9107
+ /**
9108
+ * Rows this run CORRECTED while moving them — a durable mutation the move
9109
+ * made that nobody asked for, so it is reported where the operator reads the
9110
+ * job rather than only in a log line.
9111
+ *
9112
+ * A footage segment records its byte count in its own NAME, and the durable
9113
+ * hour row derives its aggregates from those names. A file that does not
9114
+ * match its name therefore makes the ledger's sums — and with them quota and
9115
+ * pressure eviction — wrong by the difference, and only a rename can fix it.
9116
+ * On 2026-08-30 one such row also stalled a 110 749-file drain permanently.
9117
+ *
9118
+ * Absent on lanes where the question has no meaning: a media blob's size is
9119
+ * in its row, not in its name, so `MediaRelocateEngine` never reconciles one.
9120
+ */
9121
+ rowsReconciled: number().int().nonnegative().optional(),
9107
9122
  startedAt: number(),
9108
9123
  finishedAt: number().nullable(),
9109
9124
  error: string().nullable()
@@ -9172,14 +9187,42 @@ var RelocateMediaInputSchema = object({
9172
9187
  /** Omitted = `move`, the pre-existing behaviour. */
9173
9188
  mode: MediaRelocateModeSchema.optional()
9174
9189
  });
9175
- /** How many rows still carry NO `locationId` — the population a repoint would
9176
- * silently re-aim at a disk that does not hold their bytes. Zero is the only
9177
- * value that permits a non-blocking `eventMedia` cutover. */
9178
- var UnstampedEventMediaCountSchema = object({
9179
- media: number().int().nonnegative(),
9180
- retrainFrames: number().int().nonnegative(),
9181
- total: number().int().nonnegative()
9190
+ /**
9191
+ * The unstamped population of ONE collection split, because the gate and the
9192
+ * operator ask two different questions and only one of them has to be cheap.
9193
+ *
9194
+ * `present` is the GATE: "is there at least one row that would be orphaned by a
9195
+ * repoint". It is a single indexed seek to the first matching row, so it stays
9196
+ * answerable on a saturated disk and answers in O(log n) precisely in the state
9197
+ * that matters — after a seal, when the population is empty.
9198
+ *
9199
+ * `rows` is the NUMBER, for the refusal message and the operator's sense of
9200
+ * scale. It is a second, indexed `COUNT(*)`, and `null` means **not
9201
+ * measurable** — never zero. `{ present: true, rows: null }` is a legitimate
9202
+ * and useful answer: "there are some, and this read could not say how many"
9203
+ * still refuses the cutover, which is the whole job.
9204
+ */
9205
+ var UnstampedRowsSchema = object({
9206
+ present: boolean(),
9207
+ rows: number().int().nonnegative().nullable()
9182
9208
  });
9209
+ /**
9210
+ * How many rows still carry NO `locationId` — the population a repoint would
9211
+ * silently re-aim at a disk that does not hold their bytes.
9212
+ *
9213
+ * **`null` = the count could not be taken**, and it is NOT permission to cut
9214
+ * over. The gate opens on a measured absence and on nothing else; an unread
9215
+ * collection and an empty one are different facts, and this repo has already
9216
+ * paid for conflating them (`RelocateResidueSchema`, D295).
9217
+ */
9218
+ var UnstampedEventMediaCountSchema = object({
9219
+ media: UnstampedRowsSchema,
9220
+ retrainFrames: UnstampedRowsSchema,
9221
+ /** True when EITHER collection holds one. The refusal reads this. */
9222
+ anyPresent: boolean(),
9223
+ /** Sum across both, or `null` when either lane could not be counted. */
9224
+ total: number().int().nonnegative().nullable()
9225
+ }).nullable();
9183
9226
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
9184
9227
  /** The independently selectable logical storage classes — every class
9185
9228
  * `storage.listLocationDeclarations` reports, so an operator never meets a
@@ -9290,6 +9333,10 @@ var StorageMigrationMoveProgressSchema = object({
9290
9333
  /** The archive census — the **M** of "N of M" (D295). `null` = unknowable. */
9291
9334
  filesTotal: number().int().nonnegative().nullable(),
9292
9335
  bytesMoved: number().int().nonnegative(),
9336
+ /** Rows the mover corrected while moving them — see `RelocateJob`. Absent on
9337
+ * a lane that cannot reconcile. A migration that silently rewrote durable
9338
+ * rows would be the same failure as one that silently skipped them. */
9339
+ rowsReconciled: number().int().nonnegative().optional(),
9293
9340
  /** The MOVER's start, not the migration's: a drain restarted after an addon
9294
9341
  * crash gets a new mover, and a rate computed from the migration's start
9295
9342
  * 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-petkit",
3
- "version": "0.2.45",
3
+ "version": "0.2.46",
4
4
  "description": "PetKit smart-feeder device-provider addon for CamStack — wraps the @apocaliss92/nodepetkit PetKit cloud client",
5
5
  "keywords": [
6
6
  "camstack",