@camstack/addon-provider-wyze 0.2.49 → 0.2.50

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