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