@camstack/addon-terminal 0.1.50 → 0.1.51

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
@@ -8102,6 +8102,21 @@ var RelocateJobSchema = object({
8102
8102
  bytesMoved: number().int(),
8103
8103
  /** Total files discovered up front; null while (or when) unknown. */
8104
8104
  filesTotal: number().int().nullable(),
8105
+ /**
8106
+ * Rows this run CORRECTED while moving them — a durable mutation the move
8107
+ * made that nobody asked for, so it is reported where the operator reads the
8108
+ * job rather than only in a log line.
8109
+ *
8110
+ * A footage segment records its byte count in its own NAME, and the durable
8111
+ * hour row derives its aggregates from those names. A file that does not
8112
+ * match its name therefore makes the ledger's sums — and with them quota and
8113
+ * pressure eviction — wrong by the difference, and only a rename can fix it.
8114
+ * On 2026-08-30 one such row also stalled a 110 749-file drain permanently.
8115
+ *
8116
+ * Absent on lanes where the question has no meaning: a media blob's size is
8117
+ * in its row, not in its name, so `MediaRelocateEngine` never reconciles one.
8118
+ */
8119
+ rowsReconciled: number().int().nonnegative().optional(),
8105
8120
  startedAt: number(),
8106
8121
  finishedAt: number().nullable(),
8107
8122
  error: string().nullable()
@@ -8170,14 +8185,42 @@ var RelocateMediaInputSchema = object({
8170
8185
  /** Omitted = `move`, the pre-existing behaviour. */
8171
8186
  mode: MediaRelocateModeSchema.optional()
8172
8187
  });
8173
- /** How many rows still carry NO `locationId` — the population a repoint would
8174
- * silently re-aim at a disk that does not hold their bytes. Zero is the only
8175
- * value that permits a non-blocking `eventMedia` cutover. */
8176
- var UnstampedEventMediaCountSchema = object({
8177
- media: number().int().nonnegative(),
8178
- retrainFrames: number().int().nonnegative(),
8179
- total: number().int().nonnegative()
8188
+ /**
8189
+ * The unstamped population of ONE collection split, because the gate and the
8190
+ * operator ask two different questions and only one of them has to be cheap.
8191
+ *
8192
+ * `present` is the GATE: "is there at least one row that would be orphaned by a
8193
+ * repoint". It is a single indexed seek to the first matching row, so it stays
8194
+ * answerable on a saturated disk and answers in O(log n) precisely in the state
8195
+ * that matters — after a seal, when the population is empty.
8196
+ *
8197
+ * `rows` is the NUMBER, for the refusal message and the operator's sense of
8198
+ * scale. It is a second, indexed `COUNT(*)`, and `null` means **not
8199
+ * measurable** — never zero. `{ present: true, rows: null }` is a legitimate
8200
+ * and useful answer: "there are some, and this read could not say how many"
8201
+ * still refuses the cutover, which is the whole job.
8202
+ */
8203
+ var UnstampedRowsSchema = object({
8204
+ present: boolean(),
8205
+ rows: number().int().nonnegative().nullable()
8180
8206
  });
8207
+ /**
8208
+ * How many rows still carry NO `locationId` — the population a repoint would
8209
+ * silently re-aim at a disk that does not hold their bytes.
8210
+ *
8211
+ * **`null` = the count could not be taken**, and it is NOT permission to cut
8212
+ * over. The gate opens on a measured absence and on nothing else; an unread
8213
+ * collection and an empty one are different facts, and this repo has already
8214
+ * paid for conflating them (`RelocateResidueSchema`, D295).
8215
+ */
8216
+ var UnstampedEventMediaCountSchema = object({
8217
+ media: UnstampedRowsSchema,
8218
+ retrainFrames: UnstampedRowsSchema,
8219
+ /** True when EITHER collection holds one. The refusal reads this. */
8220
+ anyPresent: boolean(),
8221
+ /** Sum across both, or `null` when either lane could not be counted. */
8222
+ total: number().int().nonnegative().nullable()
8223
+ }).nullable();
8181
8224
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8182
8225
  /** The independently selectable logical storage classes — every class
8183
8226
  * `storage.listLocationDeclarations` reports, so an operator never meets a
@@ -8288,6 +8331,10 @@ var StorageMigrationMoveProgressSchema = object({
8288
8331
  /** The archive census — the **M** of "N of M" (D295). `null` = unknowable. */
8289
8332
  filesTotal: number().int().nonnegative().nullable(),
8290
8333
  bytesMoved: number().int().nonnegative(),
8334
+ /** Rows the mover corrected while moving them — see `RelocateJob`. Absent on
8335
+ * a lane that cannot reconcile. A migration that silently rewrote durable
8336
+ * rows would be the same failure as one that silently skipped them. */
8337
+ rowsReconciled: number().int().nonnegative().optional(),
8291
8338
  /** The MOVER's start, not the migration's: a drain restarted after an addon
8292
8339
  * crash gets a new mover, and a rate computed from the migration's start
8293
8340
  * would silently average in the time nothing was running. */
package/dist/addon.mjs CHANGED
@@ -8079,6 +8079,21 @@ var RelocateJobSchema = object({
8079
8079
  bytesMoved: number().int(),
8080
8080
  /** Total files discovered up front; null while (or when) unknown. */
8081
8081
  filesTotal: number().int().nullable(),
8082
+ /**
8083
+ * Rows this run CORRECTED while moving them — a durable mutation the move
8084
+ * made that nobody asked for, so it is reported where the operator reads the
8085
+ * job rather than only in a log line.
8086
+ *
8087
+ * A footage segment records its byte count in its own NAME, and the durable
8088
+ * hour row derives its aggregates from those names. A file that does not
8089
+ * match its name therefore makes the ledger's sums — and with them quota and
8090
+ * pressure eviction — wrong by the difference, and only a rename can fix it.
8091
+ * On 2026-08-30 one such row also stalled a 110 749-file drain permanently.
8092
+ *
8093
+ * Absent on lanes where the question has no meaning: a media blob's size is
8094
+ * in its row, not in its name, so `MediaRelocateEngine` never reconciles one.
8095
+ */
8096
+ rowsReconciled: number().int().nonnegative().optional(),
8082
8097
  startedAt: number(),
8083
8098
  finishedAt: number().nullable(),
8084
8099
  error: string().nullable()
@@ -8147,14 +8162,42 @@ var RelocateMediaInputSchema = object({
8147
8162
  /** Omitted = `move`, the pre-existing behaviour. */
8148
8163
  mode: MediaRelocateModeSchema.optional()
8149
8164
  });
8150
- /** How many rows still carry NO `locationId` — the population a repoint would
8151
- * silently re-aim at a disk that does not hold their bytes. Zero is the only
8152
- * value that permits a non-blocking `eventMedia` cutover. */
8153
- var UnstampedEventMediaCountSchema = object({
8154
- media: number().int().nonnegative(),
8155
- retrainFrames: number().int().nonnegative(),
8156
- total: number().int().nonnegative()
8165
+ /**
8166
+ * The unstamped population of ONE collection split, because the gate and the
8167
+ * operator ask two different questions and only one of them has to be cheap.
8168
+ *
8169
+ * `present` is the GATE: "is there at least one row that would be orphaned by a
8170
+ * repoint". It is a single indexed seek to the first matching row, so it stays
8171
+ * answerable on a saturated disk and answers in O(log n) precisely in the state
8172
+ * that matters — after a seal, when the population is empty.
8173
+ *
8174
+ * `rows` is the NUMBER, for the refusal message and the operator's sense of
8175
+ * scale. It is a second, indexed `COUNT(*)`, and `null` means **not
8176
+ * measurable** — never zero. `{ present: true, rows: null }` is a legitimate
8177
+ * and useful answer: "there are some, and this read could not say how many"
8178
+ * still refuses the cutover, which is the whole job.
8179
+ */
8180
+ var UnstampedRowsSchema = object({
8181
+ present: boolean(),
8182
+ rows: number().int().nonnegative().nullable()
8157
8183
  });
8184
+ /**
8185
+ * How many rows still carry NO `locationId` — the population a repoint would
8186
+ * silently re-aim at a disk that does not hold their bytes.
8187
+ *
8188
+ * **`null` = the count could not be taken**, and it is NOT permission to cut
8189
+ * over. The gate opens on a measured absence and on nothing else; an unread
8190
+ * collection and an empty one are different facts, and this repo has already
8191
+ * paid for conflating them (`RelocateResidueSchema`, D295).
8192
+ */
8193
+ var UnstampedEventMediaCountSchema = object({
8194
+ media: UnstampedRowsSchema,
8195
+ retrainFrames: UnstampedRowsSchema,
8196
+ /** True when EITHER collection holds one. The refusal reads this. */
8197
+ anyPresent: boolean(),
8198
+ /** Sum across both, or `null` when either lane could not be counted. */
8199
+ total: number().int().nonnegative().nullable()
8200
+ }).nullable();
8158
8201
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8159
8202
  /** The independently selectable logical storage classes — every class
8160
8203
  * `storage.listLocationDeclarations` reports, so an operator never meets a
@@ -8265,6 +8308,10 @@ var StorageMigrationMoveProgressSchema = object({
8265
8308
  /** The archive census — the **M** of "N of M" (D295). `null` = unknowable. */
8266
8309
  filesTotal: number().int().nonnegative().nullable(),
8267
8310
  bytesMoved: number().int().nonnegative(),
8311
+ /** Rows the mover corrected while moving them — see `RelocateJob`. Absent on
8312
+ * a lane that cannot reconcile. A migration that silently rewrote durable
8313
+ * rows would be the same failure as one that silently skipped them. */
8314
+ rowsReconciled: number().int().nonnegative().optional(),
8268
8315
  /** The MOVER's start, not the migration's: a drain restarted after an addon
8269
8316
  * crash gets a new mover, and a rate computed from the migration's start
8270
8317
  * would silently average in the time nothing was running. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-terminal",
3
- "version": "0.1.50",
3
+ "version": "0.1.51",
4
4
  "description": "Interactive terminal sessions (pty + xterm) as a CamStack addon",
5
5
  "keywords": [
6
6
  "camstack",