@camstack/addon-export-alexa 1.2.110 → 1.2.112

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.
@@ -19410,13 +19410,26 @@ var TrackAudioLabelSchema = object({
19410
19410
  * - `audio` — an audio event on the camera itself that was anomalous for
19411
19411
  * THAT camera, loud, and heard while nothing visual was happening (D62).
19412
19412
  *
19413
+ * - `onboard` — the CAMERA's own firmware, paired with a decoded frame in
19414
+ * that frame's pixel space. A real root detector and a SPATIAL one: its
19415
+ * boxes are the same kind of fact `pipeline`'s are, produced by a different
19416
+ * detector.
19417
+ *
19418
+ * `onboard` was missing here while `DetectionSourceSchema` already had it, so
19419
+ * a persisted onboard track failed `safeParse` on read and came back with NO
19420
+ * source at all — which `isSpatialTrack` then admitted by accident, through the
19421
+ * `undefined` arm rather than by anybody's decision, and which `excludeSources`
19422
+ * could not name.
19423
+ *
19413
19424
  * The spatial subsystems (tracker association, occupancy count, re-id /
19414
19425
  * embedding, resurrection) MUST skip every synthetic source. Test for that
19415
- * with `isSpatialTrack`, which allow-lists `pipeline` — a `!== 'sensor'`
19416
- * check silently readmits every source added after it was written.
19426
+ * with `isSpatialTrack`, which allow-lists the spatial sources explicitly — a
19427
+ * `!== 'sensor'` check silently readmits every source added after it was
19428
+ * written.
19417
19429
  */
19418
19430
  var TrackSourceSchema = _enum([
19419
19431
  "pipeline",
19432
+ "onboard",
19420
19433
  "sensor",
19421
19434
  "audio"
19422
19435
  ]);
@@ -20004,6 +20017,7 @@ var MediaFileKindEnum = _enum([
20004
20017
  "keyFrame",
20005
20018
  "keyFrameSmall",
20006
20019
  "thumbnailSmall",
20020
+ "confirmationCrop",
20007
20021
  "sceneFrame"
20008
20022
  ]);
20009
20023
  /**
@@ -21498,13 +21512,39 @@ var MotionSourceEnum = _enum([
21498
21512
  */
21499
21513
  var MotionSourcesSchema = array(MotionSourceEnum);
21500
21514
  /**
21501
- * Which root detectors a camera runs. Deliberately the SAME vocabulary
21502
- * post-analysis already tags every detection with (`DetectionSource`) rather
21503
- * than a second spelling of the same two ideas — the value an operator picks
21504
- * here is the value that comes back on the track, the overlay and the debug
21505
- * row.
21515
+ * Which root detector a camera runs — EXACTLY ONE.
21516
+ *
21517
+ * Deliberately the SAME vocabulary post-analysis already tags every detection
21518
+ * with (`DetectionSource`) rather than a second spelling of the same two
21519
+ * ideas: the value an operator picks here is the value that comes back on the
21520
+ * track, the overlay and the debug row.
21521
+ *
21522
+ * ## Why one, and why it is still an array
21523
+ *
21524
+ * Two roots on one camera is a capability nobody asked for and the operator has
21525
+ * since ruled out. It was never free: both planes feed the SAME per-device
21526
+ * stationary registry, both can promote the same parked object, and the two
21527
+ * detectors disagree about the same box by construction — which is the
21528
+ * disagreement D505 had to arbitrate. Removing the case removes the arbitration.
21529
+ *
21530
+ * The ARRAY shape survives because the stored settings and the attach payload
21531
+ * already speak it on every camera of every fleet, and a cap input that
21532
+ * suddenly refuses a stored value makes the camera un-attachable — a fail-closed
21533
+ * in the one direction that costs an operator their cameras. So the wire stays
21534
+ * tolerant and the TYPE is exact: a longer list is truncated to its first
21535
+ * element rather than refused, and `max(1)` is what every consumer can then
21536
+ * rely on.
21537
+ *
21538
+ * AT MOST one, not exactly one. The EMPTY list is a legal, deliberate pick —
21539
+ * a camera an operator left with no root detector — and `planDetectionSources`
21540
+ * has always said so: inventing a root for them is how a default acts without
21541
+ * anybody choosing it. Tightening this to `length(1)` broke that, and the
21542
+ * suite caught it.
21543
+ *
21544
+ * Measured before tightening (2026-09-15, this fleet, 6 h of attaches): 3327
21545
+ * `["pipeline"]` and 2 `["onboard"]`. Not one camera had two.
21506
21546
  */
21507
- var DetectionSourcesSchema = array(DetectionSourceSchema);
21547
+ var DetectionSourcesSchema = preprocess((value) => Array.isArray(value) && value.length > 1 ? value.slice(0, 1) : value, array(DetectionSourceSchema).max(1));
21508
21548
  /**
21509
21549
  * Input shape for `pipeline-runner.reportMotion` cap method. Exported
21510
21550
  * so cap-side consumers (the orchestrator forward, the runner addon's
@@ -19383,13 +19383,26 @@ var TrackAudioLabelSchema = object({
19383
19383
  * - `audio` — an audio event on the camera itself that was anomalous for
19384
19384
  * THAT camera, loud, and heard while nothing visual was happening (D62).
19385
19385
  *
19386
+ * - `onboard` — the CAMERA's own firmware, paired with a decoded frame in
19387
+ * that frame's pixel space. A real root detector and a SPATIAL one: its
19388
+ * boxes are the same kind of fact `pipeline`'s are, produced by a different
19389
+ * detector.
19390
+ *
19391
+ * `onboard` was missing here while `DetectionSourceSchema` already had it, so
19392
+ * a persisted onboard track failed `safeParse` on read and came back with NO
19393
+ * source at all — which `isSpatialTrack` then admitted by accident, through the
19394
+ * `undefined` arm rather than by anybody's decision, and which `excludeSources`
19395
+ * could not name.
19396
+ *
19386
19397
  * The spatial subsystems (tracker association, occupancy count, re-id /
19387
19398
  * embedding, resurrection) MUST skip every synthetic source. Test for that
19388
- * with `isSpatialTrack`, which allow-lists `pipeline` — a `!== 'sensor'`
19389
- * check silently readmits every source added after it was written.
19399
+ * with `isSpatialTrack`, which allow-lists the spatial sources explicitly — a
19400
+ * `!== 'sensor'` check silently readmits every source added after it was
19401
+ * written.
19390
19402
  */
19391
19403
  var TrackSourceSchema = _enum([
19392
19404
  "pipeline",
19405
+ "onboard",
19393
19406
  "sensor",
19394
19407
  "audio"
19395
19408
  ]);
@@ -19977,6 +19990,7 @@ var MediaFileKindEnum = _enum([
19977
19990
  "keyFrame",
19978
19991
  "keyFrameSmall",
19979
19992
  "thumbnailSmall",
19993
+ "confirmationCrop",
19980
19994
  "sceneFrame"
19981
19995
  ]);
19982
19996
  /**
@@ -21471,13 +21485,39 @@ var MotionSourceEnum = _enum([
21471
21485
  */
21472
21486
  var MotionSourcesSchema = array(MotionSourceEnum);
21473
21487
  /**
21474
- * Which root detectors a camera runs. Deliberately the SAME vocabulary
21475
- * post-analysis already tags every detection with (`DetectionSource`) rather
21476
- * than a second spelling of the same two ideas — the value an operator picks
21477
- * here is the value that comes back on the track, the overlay and the debug
21478
- * row.
21488
+ * Which root detector a camera runs — EXACTLY ONE.
21489
+ *
21490
+ * Deliberately the SAME vocabulary post-analysis already tags every detection
21491
+ * with (`DetectionSource`) rather than a second spelling of the same two
21492
+ * ideas: the value an operator picks here is the value that comes back on the
21493
+ * track, the overlay and the debug row.
21494
+ *
21495
+ * ## Why one, and why it is still an array
21496
+ *
21497
+ * Two roots on one camera is a capability nobody asked for and the operator has
21498
+ * since ruled out. It was never free: both planes feed the SAME per-device
21499
+ * stationary registry, both can promote the same parked object, and the two
21500
+ * detectors disagree about the same box by construction — which is the
21501
+ * disagreement D505 had to arbitrate. Removing the case removes the arbitration.
21502
+ *
21503
+ * The ARRAY shape survives because the stored settings and the attach payload
21504
+ * already speak it on every camera of every fleet, and a cap input that
21505
+ * suddenly refuses a stored value makes the camera un-attachable — a fail-closed
21506
+ * in the one direction that costs an operator their cameras. So the wire stays
21507
+ * tolerant and the TYPE is exact: a longer list is truncated to its first
21508
+ * element rather than refused, and `max(1)` is what every consumer can then
21509
+ * rely on.
21510
+ *
21511
+ * AT MOST one, not exactly one. The EMPTY list is a legal, deliberate pick —
21512
+ * a camera an operator left with no root detector — and `planDetectionSources`
21513
+ * has always said so: inventing a root for them is how a default acts without
21514
+ * anybody choosing it. Tightening this to `length(1)` broke that, and the
21515
+ * suite caught it.
21516
+ *
21517
+ * Measured before tightening (2026-09-15, this fleet, 6 h of attaches): 3327
21518
+ * `["pipeline"]` and 2 `["onboard"]`. Not one camera had two.
21479
21519
  */
21480
- var DetectionSourcesSchema = array(DetectionSourceSchema);
21520
+ var DetectionSourcesSchema = preprocess((value) => Array.isArray(value) && value.length > 1 ? value.slice(0, 1) : value, array(DetectionSourceSchema).max(1));
21481
21521
  /**
21482
21522
  * Input shape for `pipeline-runner.reportMotion` cap method. Exported
21483
21523
  * so cap-side consumers (the orchestrator forward, the runner addon's
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-export-alexa",
3
- "version": "1.2.110",
3
+ "version": "1.2.112",
4
4
  "description": "Alexa Smart Home Skill export — hub-side OAuth provider + directive handler. The companion AWS Lambda forwards Alexa directives to this addon's /addon/export-alexa/directive endpoint.",
5
5
  "keywords": [
6
6
  "camstack",