@camstack/addon-provider-dreame 0.2.82 → 0.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
@@ -71436,11 +71436,30 @@ var SensorEventSchema = object({
71436
71436
  value: record(string(), unknown()).nullable(),
71437
71437
  timestamp: number()
71438
71438
  });
71439
+ /**
71440
+ * One stored sighting on a track's trajectory.
71441
+ *
71442
+ * The array these live in is returned in TIME order (D399) — it is APPENDED in
71443
+ * arrival order, and the two detector passes interleave, so a consumer must not
71444
+ * assume the two are the same on a row written by an older build.
71445
+ */
71439
71446
  var TrackPositionSchema = object({
71440
71447
  x: number(),
71441
71448
  y: number(),
71442
71449
  timestamp: number(),
71443
- bbox: BoundingBoxSchema
71450
+ bbox: BoundingBoxSchema,
71451
+ /**
71452
+ * Which detector pass measured this box (D399): `frame` is the full-frame
71453
+ * pass on the analysis raster, `recovery` is the native-resolution
71454
+ * small-subject second pass (D377/D378). Both write into one array, and until
71455
+ * this field existed the only way to tell them apart was that full-frame boxes
71456
+ * are exact multiples of 1.2 while recovery boxes are full-precision floats.
71457
+ * Absent on rows written before D399.
71458
+ */
71459
+ source: _enum(["frame", "recovery"]).optional(),
71460
+ /** Detection score of this box, so a position can be weighed and not only
71461
+ * plotted. Absent on rows written before D399. */
71462
+ score: number().optional()
71444
71463
  });
71445
71464
  var TrackSnapshotSchema = object({
71446
71465
  timestamp: number(),
@@ -71840,14 +71859,25 @@ var TrackSchema = object({
71840
71859
  */
71841
71860
  hasRider: boolean().optional(),
71842
71861
  /**
71843
- * WHY this track ended without a NATIVE best-shot tile
71844
- * ([D276](../decisions/adr-0276-a-stand-in-tile-is-provisional-and-a-close-says-why.md)) —
71862
+ * WHY this track ended without a NATIVE best-shot FRAME
71863
+ * ([D276](../decisions/adr-0276-a-stand-in-tile-is-provisional-and-a-close-says-why.md),
71864
+ * widened by [D400](../decisions/adr-0400-the-picture-is-judged-on-what-is-delivered.md)) —
71845
71865
  * a composed token line (`no-key-frame capture=keyframe:native-missx4`,
71846
- * `derive-returned-null tile=standin`, …) written at close and CLEARED by
71847
- * the late-keyFrame upgrade when a native tile lands after all. The
71848
- * operator-facing answer to "perché manca l'immagine?" on a track whose
71866
+ * `derive-returned-null tile=standin`,
71867
+ * `native-tile tile=native no-key-frame-at-close`, …) written at close and
71868
+ * CLEARED by the late-keyFrame upgrade when a native tile lands after all.
71869
+ * The operator-facing answer to "perché manca l'immagine?" on a track whose
71849
71870
  * tile is a face/plate stand-in, a raster crop, or an icon.
71850
71871
  *
71872
+ * **`no-key-frame-at-close` (D400).** The line used to be written ONLY when
71873
+ * the TILE ranked below native, so a track whose thumbnail landed natively
71874
+ * while its key frame missed carried no reason at all — three of the four
71875
+ * `MISSING_KEYFRAME` tracks in the 2026-09-07 operator audit were exactly
71876
+ * that shape, and their "niente ultimo" had no cause anywhere on the row.
71877
+ * The key frame is the head of a cascade (`keyFrame ⇒ keyFrameSmall ⇒ the
71878
+ * lastFrame copy source`), so its absence is now on this line whatever the
71879
+ * tile ended up being.
71880
+ *
71851
71881
  * **Absent ≠ "missed silently"**: a row written before the column, a hub
71852
71882
  * that predates the field, and every track whose tile landed native all
71853
71883
  * omit it. Render nothing when absent.
@@ -82057,8 +82087,27 @@ var PrivacyMaskRegionSchema = object({
82057
82087
  /** Current on-camera privacy state — mask master enable + zones + microphone. */
82058
82088
  var PrivacyMaskStatusSchema = object({
82059
82089
  enabled: boolean(),
82060
- /** Active zones (normalized 0..1). Length ≤ maxRegions. */
82061
- regions: array(PrivacyMaskRegionSchema),
82090
+ /**
82091
+ * Active zones (normalized 0..1). Length ≤ maxRegions.
82092
+ *
82093
+ * `null` means "no answer" — the provider has never reached this camera
82094
+ * (a cold `runtimeState` slice, a battery camera asleep) or the read
82095
+ * failed. A consumer must render it as UNKNOWN and never as "this camera
82096
+ * has no zones": those two look identical to an operator right up to the
82097
+ * moment one of them is acted on, and acting on them differs completely.
82098
+ * The switch group turned an unanswered read into *"nothing is set up for
82099
+ * it to act on"* — an instruction to go and draw a zone that already
82100
+ * exists — and this editor seeded an EMPTY canvas from it, one Save away
82101
+ * from deleting the mask it could not read.
82102
+ *
82103
+ * Empty-and-answered is `[]` and stays a real answer: this camera genuinely
82104
+ * has no zones. The distinction is the same one {@link
82105
+ * PrivacyMaskStatusSchema.shape.audioEnabled} already draws for the
82106
+ * microphone, on the very same payload — both planes come from ONE refresh,
82107
+ * so it was never coherent for one of them to be able to say "unknown"
82108
+ * while the other could not.
82109
+ */
82110
+ regions: array(PrivacyMaskRegionSchema).nullable(),
82062
82111
  /**
82063
82112
  * Is the camera capturing sound right now? Read from the camera, never from
82064
82113
  * a server-side mirror.
package/dist/addon.mjs CHANGED
@@ -71433,11 +71433,30 @@ var SensorEventSchema = object({
71433
71433
  value: record(string(), unknown()).nullable(),
71434
71434
  timestamp: number()
71435
71435
  });
71436
+ /**
71437
+ * One stored sighting on a track's trajectory.
71438
+ *
71439
+ * The array these live in is returned in TIME order (D399) — it is APPENDED in
71440
+ * arrival order, and the two detector passes interleave, so a consumer must not
71441
+ * assume the two are the same on a row written by an older build.
71442
+ */
71436
71443
  var TrackPositionSchema = object({
71437
71444
  x: number(),
71438
71445
  y: number(),
71439
71446
  timestamp: number(),
71440
- bbox: BoundingBoxSchema
71447
+ bbox: BoundingBoxSchema,
71448
+ /**
71449
+ * Which detector pass measured this box (D399): `frame` is the full-frame
71450
+ * pass on the analysis raster, `recovery` is the native-resolution
71451
+ * small-subject second pass (D377/D378). Both write into one array, and until
71452
+ * this field existed the only way to tell them apart was that full-frame boxes
71453
+ * are exact multiples of 1.2 while recovery boxes are full-precision floats.
71454
+ * Absent on rows written before D399.
71455
+ */
71456
+ source: _enum(["frame", "recovery"]).optional(),
71457
+ /** Detection score of this box, so a position can be weighed and not only
71458
+ * plotted. Absent on rows written before D399. */
71459
+ score: number().optional()
71441
71460
  });
71442
71461
  var TrackSnapshotSchema = object({
71443
71462
  timestamp: number(),
@@ -71837,14 +71856,25 @@ var TrackSchema = object({
71837
71856
  */
71838
71857
  hasRider: boolean().optional(),
71839
71858
  /**
71840
- * WHY this track ended without a NATIVE best-shot tile
71841
- * ([D276](../decisions/adr-0276-a-stand-in-tile-is-provisional-and-a-close-says-why.md)) —
71859
+ * WHY this track ended without a NATIVE best-shot FRAME
71860
+ * ([D276](../decisions/adr-0276-a-stand-in-tile-is-provisional-and-a-close-says-why.md),
71861
+ * widened by [D400](../decisions/adr-0400-the-picture-is-judged-on-what-is-delivered.md)) —
71842
71862
  * a composed token line (`no-key-frame capture=keyframe:native-missx4`,
71843
- * `derive-returned-null tile=standin`, …) written at close and CLEARED by
71844
- * the late-keyFrame upgrade when a native tile lands after all. The
71845
- * operator-facing answer to "perché manca l'immagine?" on a track whose
71863
+ * `derive-returned-null tile=standin`,
71864
+ * `native-tile tile=native no-key-frame-at-close`, …) written at close and
71865
+ * CLEARED by the late-keyFrame upgrade when a native tile lands after all.
71866
+ * The operator-facing answer to "perché manca l'immagine?" on a track whose
71846
71867
  * tile is a face/plate stand-in, a raster crop, or an icon.
71847
71868
  *
71869
+ * **`no-key-frame-at-close` (D400).** The line used to be written ONLY when
71870
+ * the TILE ranked below native, so a track whose thumbnail landed natively
71871
+ * while its key frame missed carried no reason at all — three of the four
71872
+ * `MISSING_KEYFRAME` tracks in the 2026-09-07 operator audit were exactly
71873
+ * that shape, and their "niente ultimo" had no cause anywhere on the row.
71874
+ * The key frame is the head of a cascade (`keyFrame ⇒ keyFrameSmall ⇒ the
71875
+ * lastFrame copy source`), so its absence is now on this line whatever the
71876
+ * tile ended up being.
71877
+ *
71848
71878
  * **Absent ≠ "missed silently"**: a row written before the column, a hub
71849
71879
  * that predates the field, and every track whose tile landed native all
71850
71880
  * omit it. Render nothing when absent.
@@ -82054,8 +82084,27 @@ var PrivacyMaskRegionSchema = object({
82054
82084
  /** Current on-camera privacy state — mask master enable + zones + microphone. */
82055
82085
  var PrivacyMaskStatusSchema = object({
82056
82086
  enabled: boolean(),
82057
- /** Active zones (normalized 0..1). Length ≤ maxRegions. */
82058
- regions: array(PrivacyMaskRegionSchema),
82087
+ /**
82088
+ * Active zones (normalized 0..1). Length ≤ maxRegions.
82089
+ *
82090
+ * `null` means "no answer" — the provider has never reached this camera
82091
+ * (a cold `runtimeState` slice, a battery camera asleep) or the read
82092
+ * failed. A consumer must render it as UNKNOWN and never as "this camera
82093
+ * has no zones": those two look identical to an operator right up to the
82094
+ * moment one of them is acted on, and acting on them differs completely.
82095
+ * The switch group turned an unanswered read into *"nothing is set up for
82096
+ * it to act on"* — an instruction to go and draw a zone that already
82097
+ * exists — and this editor seeded an EMPTY canvas from it, one Save away
82098
+ * from deleting the mask it could not read.
82099
+ *
82100
+ * Empty-and-answered is `[]` and stays a real answer: this camera genuinely
82101
+ * has no zones. The distinction is the same one {@link
82102
+ * PrivacyMaskStatusSchema.shape.audioEnabled} already draws for the
82103
+ * microphone, on the very same payload — both planes come from ONE refresh,
82104
+ * so it was never coherent for one of them to be able to say "unknown"
82105
+ * while the other could not.
82106
+ */
82107
+ regions: array(PrivacyMaskRegionSchema).nullable(),
82059
82108
  /**
82060
82109
  * Is the camera capturing sound right now? Read from the camera, never from
82061
82110
  * a server-side mirror.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-dreame",
3
- "version": "0.2.82",
3
+ "version": "0.2.84",
4
4
  "description": "Dreame robot-vacuum / lawn-mower device-provider addon for CamStack — wraps the @apocaliss92/nodedreame Dreamehome cloud client",
5
5
  "keywords": [
6
6
  "camstack",