@camstack/addon-provider-rtsp 1.2.82 → 1.2.84

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
@@ -18802,11 +18802,30 @@ var SensorEventSchema = object({
18802
18802
  value: record(string(), unknown()).nullable(),
18803
18803
  timestamp: number()
18804
18804
  });
18805
+ /**
18806
+ * One stored sighting on a track's trajectory.
18807
+ *
18808
+ * The array these live in is returned in TIME order (D399) — it is APPENDED in
18809
+ * arrival order, and the two detector passes interleave, so a consumer must not
18810
+ * assume the two are the same on a row written by an older build.
18811
+ */
18805
18812
  var TrackPositionSchema = object({
18806
18813
  x: number(),
18807
18814
  y: number(),
18808
18815
  timestamp: number(),
18809
- bbox: BoundingBoxSchema
18816
+ bbox: BoundingBoxSchema,
18817
+ /**
18818
+ * Which detector pass measured this box (D399): `frame` is the full-frame
18819
+ * pass on the analysis raster, `recovery` is the native-resolution
18820
+ * small-subject second pass (D377/D378). Both write into one array, and until
18821
+ * this field existed the only way to tell them apart was that full-frame boxes
18822
+ * are exact multiples of 1.2 while recovery boxes are full-precision floats.
18823
+ * Absent on rows written before D399.
18824
+ */
18825
+ source: _enum(["frame", "recovery"]).optional(),
18826
+ /** Detection score of this box, so a position can be weighed and not only
18827
+ * plotted. Absent on rows written before D399. */
18828
+ score: number().optional()
18810
18829
  });
18811
18830
  var TrackSnapshotSchema = object({
18812
18831
  timestamp: number(),
@@ -19206,14 +19225,25 @@ var TrackSchema = object({
19206
19225
  */
19207
19226
  hasRider: boolean().optional(),
19208
19227
  /**
19209
- * WHY this track ended without a NATIVE best-shot tile
19210
- * ([D276](../decisions/adr-0276-a-stand-in-tile-is-provisional-and-a-close-says-why.md)) —
19228
+ * WHY this track ended without a NATIVE best-shot FRAME
19229
+ * ([D276](../decisions/adr-0276-a-stand-in-tile-is-provisional-and-a-close-says-why.md),
19230
+ * widened by [D400](../decisions/adr-0400-the-picture-is-judged-on-what-is-delivered.md)) —
19211
19231
  * a composed token line (`no-key-frame capture=keyframe:native-missx4`,
19212
- * `derive-returned-null tile=standin`, …) written at close and CLEARED by
19213
- * the late-keyFrame upgrade when a native tile lands after all. The
19214
- * operator-facing answer to "perché manca l'immagine?" on a track whose
19232
+ * `derive-returned-null tile=standin`,
19233
+ * `native-tile tile=native no-key-frame-at-close`, …) written at close and
19234
+ * CLEARED by the late-keyFrame upgrade when a native tile lands after all.
19235
+ * The operator-facing answer to "perché manca l'immagine?" on a track whose
19215
19236
  * tile is a face/plate stand-in, a raster crop, or an icon.
19216
19237
  *
19238
+ * **`no-key-frame-at-close` (D400).** The line used to be written ONLY when
19239
+ * the TILE ranked below native, so a track whose thumbnail landed natively
19240
+ * while its key frame missed carried no reason at all — three of the four
19241
+ * `MISSING_KEYFRAME` tracks in the 2026-09-07 operator audit were exactly
19242
+ * that shape, and their "niente ultimo" had no cause anywhere on the row.
19243
+ * The key frame is the head of a cascade (`keyFrame ⇒ keyFrameSmall ⇒ the
19244
+ * lastFrame copy source`), so its absence is now on this line whatever the
19245
+ * tile ended up being.
19246
+ *
19217
19247
  * **Absent ≠ "missed silently"**: a row written before the column, a hub
19218
19248
  * that predates the field, and every track whose tile landed native all
19219
19249
  * omit it. Render nothing when absent.
@@ -29362,8 +29392,27 @@ var PrivacyMaskRegionSchema = object({
29362
29392
  /** Current on-camera privacy state — mask master enable + zones + microphone. */
29363
29393
  var PrivacyMaskStatusSchema = object({
29364
29394
  enabled: boolean(),
29365
- /** Active zones (normalized 0..1). Length ≤ maxRegions. */
29366
- regions: array(PrivacyMaskRegionSchema),
29395
+ /**
29396
+ * Active zones (normalized 0..1). Length ≤ maxRegions.
29397
+ *
29398
+ * `null` means "no answer" — the provider has never reached this camera
29399
+ * (a cold `runtimeState` slice, a battery camera asleep) or the read
29400
+ * failed. A consumer must render it as UNKNOWN and never as "this camera
29401
+ * has no zones": those two look identical to an operator right up to the
29402
+ * moment one of them is acted on, and acting on them differs completely.
29403
+ * The switch group turned an unanswered read into *"nothing is set up for
29404
+ * it to act on"* — an instruction to go and draw a zone that already
29405
+ * exists — and this editor seeded an EMPTY canvas from it, one Save away
29406
+ * from deleting the mask it could not read.
29407
+ *
29408
+ * Empty-and-answered is `[]` and stays a real answer: this camera genuinely
29409
+ * has no zones. The distinction is the same one {@link
29410
+ * PrivacyMaskStatusSchema.shape.audioEnabled} already draws for the
29411
+ * microphone, on the very same payload — both planes come from ONE refresh,
29412
+ * so it was never coherent for one of them to be able to say "unknown"
29413
+ * while the other could not.
29414
+ */
29415
+ regions: array(PrivacyMaskRegionSchema).nullable(),
29367
29416
  /**
29368
29417
  * Is the camera capturing sound right now? Read from the camera, never from
29369
29418
  * a server-side mirror.
package/dist/addon.mjs CHANGED
@@ -18778,11 +18778,30 @@ var SensorEventSchema = object({
18778
18778
  value: record(string(), unknown()).nullable(),
18779
18779
  timestamp: number()
18780
18780
  });
18781
+ /**
18782
+ * One stored sighting on a track's trajectory.
18783
+ *
18784
+ * The array these live in is returned in TIME order (D399) — it is APPENDED in
18785
+ * arrival order, and the two detector passes interleave, so a consumer must not
18786
+ * assume the two are the same on a row written by an older build.
18787
+ */
18781
18788
  var TrackPositionSchema = object({
18782
18789
  x: number(),
18783
18790
  y: number(),
18784
18791
  timestamp: number(),
18785
- bbox: BoundingBoxSchema
18792
+ bbox: BoundingBoxSchema,
18793
+ /**
18794
+ * Which detector pass measured this box (D399): `frame` is the full-frame
18795
+ * pass on the analysis raster, `recovery` is the native-resolution
18796
+ * small-subject second pass (D377/D378). Both write into one array, and until
18797
+ * this field existed the only way to tell them apart was that full-frame boxes
18798
+ * are exact multiples of 1.2 while recovery boxes are full-precision floats.
18799
+ * Absent on rows written before D399.
18800
+ */
18801
+ source: _enum(["frame", "recovery"]).optional(),
18802
+ /** Detection score of this box, so a position can be weighed and not only
18803
+ * plotted. Absent on rows written before D399. */
18804
+ score: number().optional()
18786
18805
  });
18787
18806
  var TrackSnapshotSchema = object({
18788
18807
  timestamp: number(),
@@ -19182,14 +19201,25 @@ var TrackSchema = object({
19182
19201
  */
19183
19202
  hasRider: boolean().optional(),
19184
19203
  /**
19185
- * WHY this track ended without a NATIVE best-shot tile
19186
- * ([D276](../decisions/adr-0276-a-stand-in-tile-is-provisional-and-a-close-says-why.md)) —
19204
+ * WHY this track ended without a NATIVE best-shot FRAME
19205
+ * ([D276](../decisions/adr-0276-a-stand-in-tile-is-provisional-and-a-close-says-why.md),
19206
+ * widened by [D400](../decisions/adr-0400-the-picture-is-judged-on-what-is-delivered.md)) —
19187
19207
  * a composed token line (`no-key-frame capture=keyframe:native-missx4`,
19188
- * `derive-returned-null tile=standin`, …) written at close and CLEARED by
19189
- * the late-keyFrame upgrade when a native tile lands after all. The
19190
- * operator-facing answer to "perché manca l'immagine?" on a track whose
19208
+ * `derive-returned-null tile=standin`,
19209
+ * `native-tile tile=native no-key-frame-at-close`, …) written at close and
19210
+ * CLEARED by the late-keyFrame upgrade when a native tile lands after all.
19211
+ * The operator-facing answer to "perché manca l'immagine?" on a track whose
19191
19212
  * tile is a face/plate stand-in, a raster crop, or an icon.
19192
19213
  *
19214
+ * **`no-key-frame-at-close` (D400).** The line used to be written ONLY when
19215
+ * the TILE ranked below native, so a track whose thumbnail landed natively
19216
+ * while its key frame missed carried no reason at all — three of the four
19217
+ * `MISSING_KEYFRAME` tracks in the 2026-09-07 operator audit were exactly
19218
+ * that shape, and their "niente ultimo" had no cause anywhere on the row.
19219
+ * The key frame is the head of a cascade (`keyFrame ⇒ keyFrameSmall ⇒ the
19220
+ * lastFrame copy source`), so its absence is now on this line whatever the
19221
+ * tile ended up being.
19222
+ *
19193
19223
  * **Absent ≠ "missed silently"**: a row written before the column, a hub
19194
19224
  * that predates the field, and every track whose tile landed native all
19195
19225
  * omit it. Render nothing when absent.
@@ -29338,8 +29368,27 @@ var PrivacyMaskRegionSchema = object({
29338
29368
  /** Current on-camera privacy state — mask master enable + zones + microphone. */
29339
29369
  var PrivacyMaskStatusSchema = object({
29340
29370
  enabled: boolean(),
29341
- /** Active zones (normalized 0..1). Length ≤ maxRegions. */
29342
- regions: array(PrivacyMaskRegionSchema),
29371
+ /**
29372
+ * Active zones (normalized 0..1). Length ≤ maxRegions.
29373
+ *
29374
+ * `null` means "no answer" — the provider has never reached this camera
29375
+ * (a cold `runtimeState` slice, a battery camera asleep) or the read
29376
+ * failed. A consumer must render it as UNKNOWN and never as "this camera
29377
+ * has no zones": those two look identical to an operator right up to the
29378
+ * moment one of them is acted on, and acting on them differs completely.
29379
+ * The switch group turned an unanswered read into *"nothing is set up for
29380
+ * it to act on"* — an instruction to go and draw a zone that already
29381
+ * exists — and this editor seeded an EMPTY canvas from it, one Save away
29382
+ * from deleting the mask it could not read.
29383
+ *
29384
+ * Empty-and-answered is `[]` and stays a real answer: this camera genuinely
29385
+ * has no zones. The distinction is the same one {@link
29386
+ * PrivacyMaskStatusSchema.shape.audioEnabled} already draws for the
29387
+ * microphone, on the very same payload — both planes come from ONE refresh,
29388
+ * so it was never coherent for one of them to be able to say "unknown"
29389
+ * while the other could not.
29390
+ */
29391
+ regions: array(PrivacyMaskRegionSchema).nullable(),
29343
29392
  /**
29344
29393
  * Is the camera capturing sound right now? Read from the camera, never from
29345
29394
  * a server-side mirror.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-rtsp",
3
- "version": "1.2.82",
3
+ "version": "1.2.84",
4
4
  "description": "Generic RTSP camera device provider addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",