@camstack/addon-import-alexa 0.2.44 → 0.2.45

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
@@ -8161,6 +8161,21 @@ var RelocateJobSchema = object({
8161
8161
  bytesMoved: number().int(),
8162
8162
  /** Total files discovered up front; null while (or when) unknown. */
8163
8163
  filesTotal: number().int().nullable(),
8164
+ /**
8165
+ * Rows this run CORRECTED while moving them — a durable mutation the move
8166
+ * made that nobody asked for, so it is reported where the operator reads the
8167
+ * job rather than only in a log line.
8168
+ *
8169
+ * A footage segment records its byte count in its own NAME, and the durable
8170
+ * hour row derives its aggregates from those names. A file that does not
8171
+ * match its name therefore makes the ledger's sums — and with them quota and
8172
+ * pressure eviction — wrong by the difference, and only a rename can fix it.
8173
+ * On 2026-08-30 one such row also stalled a 110 749-file drain permanently.
8174
+ *
8175
+ * Absent on lanes where the question has no meaning: a media blob's size is
8176
+ * in its row, not in its name, so `MediaRelocateEngine` never reconciles one.
8177
+ */
8178
+ rowsReconciled: number().int().nonnegative().optional(),
8164
8179
  startedAt: number(),
8165
8180
  finishedAt: number().nullable(),
8166
8181
  error: string().nullable()
@@ -8229,14 +8244,42 @@ var RelocateMediaInputSchema = object({
8229
8244
  /** Omitted = `move`, the pre-existing behaviour. */
8230
8245
  mode: MediaRelocateModeSchema.optional()
8231
8246
  });
8232
- /** How many rows still carry NO `locationId` — the population a repoint would
8233
- * silently re-aim at a disk that does not hold their bytes. Zero is the only
8234
- * value that permits a non-blocking `eventMedia` cutover. */
8235
- var UnstampedEventMediaCountSchema = object({
8236
- media: number().int().nonnegative(),
8237
- retrainFrames: number().int().nonnegative(),
8238
- total: number().int().nonnegative()
8247
+ /**
8248
+ * The unstamped population of ONE collection — split, because the gate and the
8249
+ * operator ask two different questions and only one of them has to be cheap.
8250
+ *
8251
+ * `present` is the GATE: "is there at least one row that would be orphaned by a
8252
+ * repoint". It is a single indexed seek to the first matching row, so it stays
8253
+ * answerable on a saturated disk and answers in O(log n) precisely in the state
8254
+ * that matters — after a seal, when the population is empty.
8255
+ *
8256
+ * `rows` is the NUMBER, for the refusal message and the operator's sense of
8257
+ * scale. It is a second, indexed `COUNT(*)`, and `null` means **not
8258
+ * measurable** — never zero. `{ present: true, rows: null }` is a legitimate
8259
+ * and useful answer: "there are some, and this read could not say how many"
8260
+ * still refuses the cutover, which is the whole job.
8261
+ */
8262
+ var UnstampedRowsSchema = object({
8263
+ present: boolean(),
8264
+ rows: number().int().nonnegative().nullable()
8239
8265
  });
8266
+ /**
8267
+ * How many rows still carry NO `locationId` — the population a repoint would
8268
+ * silently re-aim at a disk that does not hold their bytes.
8269
+ *
8270
+ * **`null` = the count could not be taken**, and it is NOT permission to cut
8271
+ * over. The gate opens on a measured absence and on nothing else; an unread
8272
+ * collection and an empty one are different facts, and this repo has already
8273
+ * paid for conflating them (`RelocateResidueSchema`, D295).
8274
+ */
8275
+ var UnstampedEventMediaCountSchema = object({
8276
+ media: UnstampedRowsSchema,
8277
+ retrainFrames: UnstampedRowsSchema,
8278
+ /** True when EITHER collection holds one. The refusal reads this. */
8279
+ anyPresent: boolean(),
8280
+ /** Sum across both, or `null` when either lane could not be counted. */
8281
+ total: number().int().nonnegative().nullable()
8282
+ }).nullable();
8240
8283
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8241
8284
  /** The independently selectable logical storage classes — every class
8242
8285
  * `storage.listLocationDeclarations` reports, so an operator never meets a
@@ -8347,6 +8390,10 @@ var StorageMigrationMoveProgressSchema = object({
8347
8390
  /** The archive census — the **M** of "N of M" (D295). `null` = unknowable. */
8348
8391
  filesTotal: number().int().nonnegative().nullable(),
8349
8392
  bytesMoved: number().int().nonnegative(),
8393
+ /** Rows the mover corrected while moving them — see `RelocateJob`. Absent on
8394
+ * a lane that cannot reconcile. A migration that silently rewrote durable
8395
+ * rows would be the same failure as one that silently skipped them. */
8396
+ rowsReconciled: number().int().nonnegative().optional(),
8350
8397
  /** The MOVER's start, not the migration's: a drain restarted after an addon
8351
8398
  * crash gets a new mover, and a rate computed from the migration's start
8352
8399
  * would silently average in the time nothing was running. */
package/dist/addon.mjs CHANGED
@@ -8161,6 +8161,21 @@ var RelocateJobSchema = object({
8161
8161
  bytesMoved: number().int(),
8162
8162
  /** Total files discovered up front; null while (or when) unknown. */
8163
8163
  filesTotal: number().int().nullable(),
8164
+ /**
8165
+ * Rows this run CORRECTED while moving them — a durable mutation the move
8166
+ * made that nobody asked for, so it is reported where the operator reads the
8167
+ * job rather than only in a log line.
8168
+ *
8169
+ * A footage segment records its byte count in its own NAME, and the durable
8170
+ * hour row derives its aggregates from those names. A file that does not
8171
+ * match its name therefore makes the ledger's sums — and with them quota and
8172
+ * pressure eviction — wrong by the difference, and only a rename can fix it.
8173
+ * On 2026-08-30 one such row also stalled a 110 749-file drain permanently.
8174
+ *
8175
+ * Absent on lanes where the question has no meaning: a media blob's size is
8176
+ * in its row, not in its name, so `MediaRelocateEngine` never reconciles one.
8177
+ */
8178
+ rowsReconciled: number().int().nonnegative().optional(),
8164
8179
  startedAt: number(),
8165
8180
  finishedAt: number().nullable(),
8166
8181
  error: string().nullable()
@@ -8229,14 +8244,42 @@ var RelocateMediaInputSchema = object({
8229
8244
  /** Omitted = `move`, the pre-existing behaviour. */
8230
8245
  mode: MediaRelocateModeSchema.optional()
8231
8246
  });
8232
- /** How many rows still carry NO `locationId` — the population a repoint would
8233
- * silently re-aim at a disk that does not hold their bytes. Zero is the only
8234
- * value that permits a non-blocking `eventMedia` cutover. */
8235
- var UnstampedEventMediaCountSchema = object({
8236
- media: number().int().nonnegative(),
8237
- retrainFrames: number().int().nonnegative(),
8238
- total: number().int().nonnegative()
8247
+ /**
8248
+ * The unstamped population of ONE collection — split, because the gate and the
8249
+ * operator ask two different questions and only one of them has to be cheap.
8250
+ *
8251
+ * `present` is the GATE: "is there at least one row that would be orphaned by a
8252
+ * repoint". It is a single indexed seek to the first matching row, so it stays
8253
+ * answerable on a saturated disk and answers in O(log n) precisely in the state
8254
+ * that matters — after a seal, when the population is empty.
8255
+ *
8256
+ * `rows` is the NUMBER, for the refusal message and the operator's sense of
8257
+ * scale. It is a second, indexed `COUNT(*)`, and `null` means **not
8258
+ * measurable** — never zero. `{ present: true, rows: null }` is a legitimate
8259
+ * and useful answer: "there are some, and this read could not say how many"
8260
+ * still refuses the cutover, which is the whole job.
8261
+ */
8262
+ var UnstampedRowsSchema = object({
8263
+ present: boolean(),
8264
+ rows: number().int().nonnegative().nullable()
8239
8265
  });
8266
+ /**
8267
+ * How many rows still carry NO `locationId` — the population a repoint would
8268
+ * silently re-aim at a disk that does not hold their bytes.
8269
+ *
8270
+ * **`null` = the count could not be taken**, and it is NOT permission to cut
8271
+ * over. The gate opens on a measured absence and on nothing else; an unread
8272
+ * collection and an empty one are different facts, and this repo has already
8273
+ * paid for conflating them (`RelocateResidueSchema`, D295).
8274
+ */
8275
+ var UnstampedEventMediaCountSchema = object({
8276
+ media: UnstampedRowsSchema,
8277
+ retrainFrames: UnstampedRowsSchema,
8278
+ /** True when EITHER collection holds one. The refusal reads this. */
8279
+ anyPresent: boolean(),
8280
+ /** Sum across both, or `null` when either lane could not be counted. */
8281
+ total: number().int().nonnegative().nullable()
8282
+ }).nullable();
8240
8283
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8241
8284
  /** The independently selectable logical storage classes — every class
8242
8285
  * `storage.listLocationDeclarations` reports, so an operator never meets a
@@ -8347,6 +8390,10 @@ var StorageMigrationMoveProgressSchema = object({
8347
8390
  /** The archive census — the **M** of "N of M" (D295). `null` = unknowable. */
8348
8391
  filesTotal: number().int().nonnegative().nullable(),
8349
8392
  bytesMoved: number().int().nonnegative(),
8393
+ /** Rows the mover corrected while moving them — see `RelocateJob`. Absent on
8394
+ * a lane that cannot reconcile. A migration that silently rewrote durable
8395
+ * rows would be the same failure as one that silently skipped them. */
8396
+ rowsReconciled: number().int().nonnegative().optional(),
8350
8397
  /** The MOVER's start, not the migration's: a drain restarted after an addon
8351
8398
  * crash gets a new mover, and a rate computed from the migration's start
8352
8399
  * would silently average in the time nothing was running. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-import-alexa",
3
- "version": "0.2.44",
3
+ "version": "0.2.45",
4
4
  "description": "Alexa device-import provider for CamStack — imports the smart-home devices in a user's Alexa account via the unofficial alexa-remote2 cookie/token client (the inverse of the Alexa exporter)",
5
5
  "keywords": [
6
6
  "camstack",