@camstack/addon-ai 0.4.84 → 0.4.86

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
@@ -18675,11 +18675,30 @@ var SensorEventSchema = object({
18675
18675
  value: record(string(), unknown()).nullable(),
18676
18676
  timestamp: number$1()
18677
18677
  });
18678
+ /**
18679
+ * One stored sighting on a track's trajectory.
18680
+ *
18681
+ * The array these live in is returned in TIME order (D399) — it is APPENDED in
18682
+ * arrival order, and the two detector passes interleave, so a consumer must not
18683
+ * assume the two are the same on a row written by an older build.
18684
+ */
18678
18685
  var TrackPositionSchema = object({
18679
18686
  x: number$1(),
18680
18687
  y: number$1(),
18681
18688
  timestamp: number$1(),
18682
- bbox: BoundingBoxSchema
18689
+ bbox: BoundingBoxSchema,
18690
+ /**
18691
+ * Which detector pass measured this box (D399): `frame` is the full-frame
18692
+ * pass on the analysis raster, `recovery` is the native-resolution
18693
+ * small-subject second pass (D377/D378). Both write into one array, and until
18694
+ * this field existed the only way to tell them apart was that full-frame boxes
18695
+ * are exact multiples of 1.2 while recovery boxes are full-precision floats.
18696
+ * Absent on rows written before D399.
18697
+ */
18698
+ source: _enum(["frame", "recovery"]).optional(),
18699
+ /** Detection score of this box, so a position can be weighed and not only
18700
+ * plotted. Absent on rows written before D399. */
18701
+ score: number$1().optional()
18683
18702
  });
18684
18703
  var TrackSnapshotSchema = object({
18685
18704
  timestamp: number$1(),
@@ -19079,14 +19098,25 @@ var TrackSchema = object({
19079
19098
  */
19080
19099
  hasRider: boolean().optional(),
19081
19100
  /**
19082
- * WHY this track ended without a NATIVE best-shot tile
19083
- * ([D276](../decisions/adr-0276-a-stand-in-tile-is-provisional-and-a-close-says-why.md)) —
19101
+ * WHY this track ended without a NATIVE best-shot FRAME
19102
+ * ([D276](../decisions/adr-0276-a-stand-in-tile-is-provisional-and-a-close-says-why.md),
19103
+ * widened by [D400](../decisions/adr-0400-the-picture-is-judged-on-what-is-delivered.md)) —
19084
19104
  * a composed token line (`no-key-frame capture=keyframe:native-missx4`,
19085
- * `derive-returned-null tile=standin`, …) written at close and CLEARED by
19086
- * the late-keyFrame upgrade when a native tile lands after all. The
19087
- * operator-facing answer to "perché manca l'immagine?" on a track whose
19105
+ * `derive-returned-null tile=standin`,
19106
+ * `native-tile tile=native no-key-frame-at-close`, …) written at close and
19107
+ * CLEARED by the late-keyFrame upgrade when a native tile lands after all.
19108
+ * The operator-facing answer to "perché manca l'immagine?" on a track whose
19088
19109
  * tile is a face/plate stand-in, a raster crop, or an icon.
19089
19110
  *
19111
+ * **`no-key-frame-at-close` (D400).** The line used to be written ONLY when
19112
+ * the TILE ranked below native, so a track whose thumbnail landed natively
19113
+ * while its key frame missed carried no reason at all — three of the four
19114
+ * `MISSING_KEYFRAME` tracks in the 2026-09-07 operator audit were exactly
19115
+ * that shape, and their "niente ultimo" had no cause anywhere on the row.
19116
+ * The key frame is the head of a cascade (`keyFrame ⇒ keyFrameSmall ⇒ the
19117
+ * lastFrame copy source`), so its absence is now on this line whatever the
19118
+ * tile ended up being.
19119
+ *
19090
19120
  * **Absent ≠ "missed silently"**: a row written before the column, a hub
19091
19121
  * that predates the field, and every track whose tile landed native all
19092
19122
  * omit it. Render nothing when absent.
@@ -27394,8 +27424,27 @@ var PrivacyMaskRegionSchema = object({
27394
27424
  });
27395
27425
  object({
27396
27426
  enabled: boolean(),
27397
- /** Active zones (normalized 0..1). Length ≤ maxRegions. */
27398
- regions: array(PrivacyMaskRegionSchema),
27427
+ /**
27428
+ * Active zones (normalized 0..1). Length ≤ maxRegions.
27429
+ *
27430
+ * `null` means "no answer" — the provider has never reached this camera
27431
+ * (a cold `runtimeState` slice, a battery camera asleep) or the read
27432
+ * failed. A consumer must render it as UNKNOWN and never as "this camera
27433
+ * has no zones": those two look identical to an operator right up to the
27434
+ * moment one of them is acted on, and acting on them differs completely.
27435
+ * The switch group turned an unanswered read into *"nothing is set up for
27436
+ * it to act on"* — an instruction to go and draw a zone that already
27437
+ * exists — and this editor seeded an EMPTY canvas from it, one Save away
27438
+ * from deleting the mask it could not read.
27439
+ *
27440
+ * Empty-and-answered is `[]` and stays a real answer: this camera genuinely
27441
+ * has no zones. The distinction is the same one {@link
27442
+ * PrivacyMaskStatusSchema.shape.audioEnabled} already draws for the
27443
+ * microphone, on the very same payload — both planes come from ONE refresh,
27444
+ * so it was never coherent for one of them to be able to say "unknown"
27445
+ * while the other could not.
27446
+ */
27447
+ regions: array(PrivacyMaskRegionSchema).nullable(),
27399
27448
  /**
27400
27449
  * Is the camera capturing sound right now? Read from the camera, never from
27401
27450
  * a server-side mirror.
package/dist/addon.mjs CHANGED
@@ -18702,11 +18702,30 @@ var SensorEventSchema = object({
18702
18702
  value: record(string(), unknown()).nullable(),
18703
18703
  timestamp: number$1()
18704
18704
  });
18705
+ /**
18706
+ * One stored sighting on a track's trajectory.
18707
+ *
18708
+ * The array these live in is returned in TIME order (D399) — it is APPENDED in
18709
+ * arrival order, and the two detector passes interleave, so a consumer must not
18710
+ * assume the two are the same on a row written by an older build.
18711
+ */
18705
18712
  var TrackPositionSchema = object({
18706
18713
  x: number$1(),
18707
18714
  y: number$1(),
18708
18715
  timestamp: number$1(),
18709
- bbox: BoundingBoxSchema
18716
+ bbox: BoundingBoxSchema,
18717
+ /**
18718
+ * Which detector pass measured this box (D399): `frame` is the full-frame
18719
+ * pass on the analysis raster, `recovery` is the native-resolution
18720
+ * small-subject second pass (D377/D378). Both write into one array, and until
18721
+ * this field existed the only way to tell them apart was that full-frame boxes
18722
+ * are exact multiples of 1.2 while recovery boxes are full-precision floats.
18723
+ * Absent on rows written before D399.
18724
+ */
18725
+ source: _enum(["frame", "recovery"]).optional(),
18726
+ /** Detection score of this box, so a position can be weighed and not only
18727
+ * plotted. Absent on rows written before D399. */
18728
+ score: number$1().optional()
18710
18729
  });
18711
18730
  var TrackSnapshotSchema = object({
18712
18731
  timestamp: number$1(),
@@ -19106,14 +19125,25 @@ var TrackSchema = object({
19106
19125
  */
19107
19126
  hasRider: boolean().optional(),
19108
19127
  /**
19109
- * WHY this track ended without a NATIVE best-shot tile
19110
- * ([D276](../decisions/adr-0276-a-stand-in-tile-is-provisional-and-a-close-says-why.md)) —
19128
+ * WHY this track ended without a NATIVE best-shot FRAME
19129
+ * ([D276](../decisions/adr-0276-a-stand-in-tile-is-provisional-and-a-close-says-why.md),
19130
+ * widened by [D400](../decisions/adr-0400-the-picture-is-judged-on-what-is-delivered.md)) —
19111
19131
  * a composed token line (`no-key-frame capture=keyframe:native-missx4`,
19112
- * `derive-returned-null tile=standin`, …) written at close and CLEARED by
19113
- * the late-keyFrame upgrade when a native tile lands after all. The
19114
- * operator-facing answer to "perché manca l'immagine?" on a track whose
19132
+ * `derive-returned-null tile=standin`,
19133
+ * `native-tile tile=native no-key-frame-at-close`, …) written at close and
19134
+ * CLEARED by the late-keyFrame upgrade when a native tile lands after all.
19135
+ * The operator-facing answer to "perché manca l'immagine?" on a track whose
19115
19136
  * tile is a face/plate stand-in, a raster crop, or an icon.
19116
19137
  *
19138
+ * **`no-key-frame-at-close` (D400).** The line used to be written ONLY when
19139
+ * the TILE ranked below native, so a track whose thumbnail landed natively
19140
+ * while its key frame missed carried no reason at all — three of the four
19141
+ * `MISSING_KEYFRAME` tracks in the 2026-09-07 operator audit were exactly
19142
+ * that shape, and their "niente ultimo" had no cause anywhere on the row.
19143
+ * The key frame is the head of a cascade (`keyFrame ⇒ keyFrameSmall ⇒ the
19144
+ * lastFrame copy source`), so its absence is now on this line whatever the
19145
+ * tile ended up being.
19146
+ *
19117
19147
  * **Absent ≠ "missed silently"**: a row written before the column, a hub
19118
19148
  * that predates the field, and every track whose tile landed native all
19119
19149
  * omit it. Render nothing when absent.
@@ -27421,8 +27451,27 @@ var PrivacyMaskRegionSchema = object({
27421
27451
  });
27422
27452
  object({
27423
27453
  enabled: boolean(),
27424
- /** Active zones (normalized 0..1). Length ≤ maxRegions. */
27425
- regions: array(PrivacyMaskRegionSchema),
27454
+ /**
27455
+ * Active zones (normalized 0..1). Length ≤ maxRegions.
27456
+ *
27457
+ * `null` means "no answer" — the provider has never reached this camera
27458
+ * (a cold `runtimeState` slice, a battery camera asleep) or the read
27459
+ * failed. A consumer must render it as UNKNOWN and never as "this camera
27460
+ * has no zones": those two look identical to an operator right up to the
27461
+ * moment one of them is acted on, and acting on them differs completely.
27462
+ * The switch group turned an unanswered read into *"nothing is set up for
27463
+ * it to act on"* — an instruction to go and draw a zone that already
27464
+ * exists — and this editor seeded an EMPTY canvas from it, one Save away
27465
+ * from deleting the mask it could not read.
27466
+ *
27467
+ * Empty-and-answered is `[]` and stays a real answer: this camera genuinely
27468
+ * has no zones. The distinction is the same one {@link
27469
+ * PrivacyMaskStatusSchema.shape.audioEnabled} already draws for the
27470
+ * microphone, on the very same payload — both planes come from ONE refresh,
27471
+ * so it was never coherent for one of them to be able to say "unknown"
27472
+ * while the other could not.
27473
+ */
27474
+ regions: array(PrivacyMaskRegionSchema).nullable(),
27426
27475
  /**
27427
27476
  * Is the camera capturing sound right now? Read from the camera, never from
27428
27477
  * a server-side mirror.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-ai",
3
- "version": "0.4.84",
3
+ "version": "0.4.86",
4
4
  "description": "AI addon for CamStack — the `llm` collection provider (cloud, LAN, and camstack-managed local llama.cpp profiles) plus the per-node `llm-runtime` managed executor.",
5
5
  "keywords": [
6
6
  "camstack",