@camstack/addon-provider-wyze 0.2.107 → 0.2.108

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
@@ -19487,13 +19487,26 @@ var TrackAudioLabelSchema = object({
19487
19487
  * - `audio` — an audio event on the camera itself that was anomalous for
19488
19488
  * THAT camera, loud, and heard while nothing visual was happening (D62).
19489
19489
  *
19490
+ * - `onboard` — the CAMERA's own firmware, paired with a decoded frame in
19491
+ * that frame's pixel space. A real root detector and a SPATIAL one: its
19492
+ * boxes are the same kind of fact `pipeline`'s are, produced by a different
19493
+ * detector.
19494
+ *
19495
+ * `onboard` was missing here while `DetectionSourceSchema` already had it, so
19496
+ * a persisted onboard track failed `safeParse` on read and came back with NO
19497
+ * source at all — which `isSpatialTrack` then admitted by accident, through the
19498
+ * `undefined` arm rather than by anybody's decision, and which `excludeSources`
19499
+ * could not name.
19500
+ *
19490
19501
  * The spatial subsystems (tracker association, occupancy count, re-id /
19491
19502
  * embedding, resurrection) MUST skip every synthetic source. Test for that
19492
- * with `isSpatialTrack`, which allow-lists `pipeline` — a `!== 'sensor'`
19493
- * check silently readmits every source added after it was written.
19503
+ * with `isSpatialTrack`, which allow-lists the spatial sources explicitly — a
19504
+ * `!== 'sensor'` check silently readmits every source added after it was
19505
+ * written.
19494
19506
  */
19495
19507
  var TrackSourceSchema = _enum([
19496
19508
  "pipeline",
19509
+ "onboard",
19497
19510
  "sensor",
19498
19511
  "audio"
19499
19512
  ]);
@@ -21575,13 +21588,39 @@ var MotionSourceEnum = _enum([
21575
21588
  */
21576
21589
  var MotionSourcesSchema = array(MotionSourceEnum);
21577
21590
  /**
21578
- * Which root detectors a camera runs. Deliberately the SAME vocabulary
21579
- * post-analysis already tags every detection with (`DetectionSource`) rather
21580
- * than a second spelling of the same two ideas — the value an operator picks
21581
- * here is the value that comes back on the track, the overlay and the debug
21582
- * row.
21591
+ * Which root detector a camera runs — EXACTLY ONE.
21592
+ *
21593
+ * Deliberately the SAME vocabulary post-analysis already tags every detection
21594
+ * with (`DetectionSource`) rather than a second spelling of the same two
21595
+ * ideas: the value an operator picks here is the value that comes back on the
21596
+ * track, the overlay and the debug row.
21597
+ *
21598
+ * ## Why one, and why it is still an array
21599
+ *
21600
+ * Two roots on one camera is a capability nobody asked for and the operator has
21601
+ * since ruled out. It was never free: both planes feed the SAME per-device
21602
+ * stationary registry, both can promote the same parked object, and the two
21603
+ * detectors disagree about the same box by construction — which is the
21604
+ * disagreement D505 had to arbitrate. Removing the case removes the arbitration.
21605
+ *
21606
+ * The ARRAY shape survives because the stored settings and the attach payload
21607
+ * already speak it on every camera of every fleet, and a cap input that
21608
+ * suddenly refuses a stored value makes the camera un-attachable — a fail-closed
21609
+ * in the one direction that costs an operator their cameras. So the wire stays
21610
+ * tolerant and the TYPE is exact: a longer list is truncated to its first
21611
+ * element rather than refused, and `max(1)` is what every consumer can then
21612
+ * rely on.
21613
+ *
21614
+ * AT MOST one, not exactly one. The EMPTY list is a legal, deliberate pick —
21615
+ * a camera an operator left with no root detector — and `planDetectionSources`
21616
+ * has always said so: inventing a root for them is how a default acts without
21617
+ * anybody choosing it. Tightening this to `length(1)` broke that, and the
21618
+ * suite caught it.
21619
+ *
21620
+ * Measured before tightening (2026-09-15, this fleet, 6 h of attaches): 3327
21621
+ * `["pipeline"]` and 2 `["onboard"]`. Not one camera had two.
21583
21622
  */
21584
- var DetectionSourcesSchema = array(DetectionSourceSchema);
21623
+ var DetectionSourcesSchema = preprocess((value) => Array.isArray(value) && value.length > 1 ? value.slice(0, 1) : value, array(DetectionSourceSchema).max(1));
21585
21624
  /**
21586
21625
  * Input shape for `pipeline-runner.reportMotion` cap method. Exported
21587
21626
  * so cap-side consumers (the orchestrator forward, the runner addon's
package/dist/addon.mjs CHANGED
@@ -19466,13 +19466,26 @@ var TrackAudioLabelSchema = object({
19466
19466
  * - `audio` — an audio event on the camera itself that was anomalous for
19467
19467
  * THAT camera, loud, and heard while nothing visual was happening (D62).
19468
19468
  *
19469
+ * - `onboard` — the CAMERA's own firmware, paired with a decoded frame in
19470
+ * that frame's pixel space. A real root detector and a SPATIAL one: its
19471
+ * boxes are the same kind of fact `pipeline`'s are, produced by a different
19472
+ * detector.
19473
+ *
19474
+ * `onboard` was missing here while `DetectionSourceSchema` already had it, so
19475
+ * a persisted onboard track failed `safeParse` on read and came back with NO
19476
+ * source at all — which `isSpatialTrack` then admitted by accident, through the
19477
+ * `undefined` arm rather than by anybody's decision, and which `excludeSources`
19478
+ * could not name.
19479
+ *
19469
19480
  * The spatial subsystems (tracker association, occupancy count, re-id /
19470
19481
  * embedding, resurrection) MUST skip every synthetic source. Test for that
19471
- * with `isSpatialTrack`, which allow-lists `pipeline` — a `!== 'sensor'`
19472
- * check silently readmits every source added after it was written.
19482
+ * with `isSpatialTrack`, which allow-lists the spatial sources explicitly — a
19483
+ * `!== 'sensor'` check silently readmits every source added after it was
19484
+ * written.
19473
19485
  */
19474
19486
  var TrackSourceSchema = _enum([
19475
19487
  "pipeline",
19488
+ "onboard",
19476
19489
  "sensor",
19477
19490
  "audio"
19478
19491
  ]);
@@ -21554,13 +21567,39 @@ var MotionSourceEnum = _enum([
21554
21567
  */
21555
21568
  var MotionSourcesSchema = array(MotionSourceEnum);
21556
21569
  /**
21557
- * Which root detectors a camera runs. Deliberately the SAME vocabulary
21558
- * post-analysis already tags every detection with (`DetectionSource`) rather
21559
- * than a second spelling of the same two ideas — the value an operator picks
21560
- * here is the value that comes back on the track, the overlay and the debug
21561
- * row.
21570
+ * Which root detector a camera runs — EXACTLY ONE.
21571
+ *
21572
+ * Deliberately the SAME vocabulary post-analysis already tags every detection
21573
+ * with (`DetectionSource`) rather than a second spelling of the same two
21574
+ * ideas: the value an operator picks here is the value that comes back on the
21575
+ * track, the overlay and the debug row.
21576
+ *
21577
+ * ## Why one, and why it is still an array
21578
+ *
21579
+ * Two roots on one camera is a capability nobody asked for and the operator has
21580
+ * since ruled out. It was never free: both planes feed the SAME per-device
21581
+ * stationary registry, both can promote the same parked object, and the two
21582
+ * detectors disagree about the same box by construction — which is the
21583
+ * disagreement D505 had to arbitrate. Removing the case removes the arbitration.
21584
+ *
21585
+ * The ARRAY shape survives because the stored settings and the attach payload
21586
+ * already speak it on every camera of every fleet, and a cap input that
21587
+ * suddenly refuses a stored value makes the camera un-attachable — a fail-closed
21588
+ * in the one direction that costs an operator their cameras. So the wire stays
21589
+ * tolerant and the TYPE is exact: a longer list is truncated to its first
21590
+ * element rather than refused, and `max(1)` is what every consumer can then
21591
+ * rely on.
21592
+ *
21593
+ * AT MOST one, not exactly one. The EMPTY list is a legal, deliberate pick —
21594
+ * a camera an operator left with no root detector — and `planDetectionSources`
21595
+ * has always said so: inventing a root for them is how a default acts without
21596
+ * anybody choosing it. Tightening this to `length(1)` broke that, and the
21597
+ * suite caught it.
21598
+ *
21599
+ * Measured before tightening (2026-09-15, this fleet, 6 h of attaches): 3327
21600
+ * `["pipeline"]` and 2 `["onboard"]`. Not one camera had two.
21562
21601
  */
21563
- var DetectionSourcesSchema = array(DetectionSourceSchema);
21602
+ var DetectionSourcesSchema = preprocess((value) => Array.isArray(value) && value.length > 1 ? value.slice(0, 1) : value, array(DetectionSourceSchema).max(1));
21564
21603
  /**
21565
21604
  * Input shape for `pipeline-runner.reportMotion` cap method. Exported
21566
21605
  * 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-provider-wyze",
3
- "version": "0.2.107",
3
+ "version": "0.2.108",
4
4
  "description": "Wyze camera device-provider addon for CamStack — wraps the @apocaliss92/wyze-bridge-js P2P/DTLS client, feeding the stream-broker via the pull-rfc4571 lazy-publish path (a structural twin of addon-provider-reolink)",
5
5
  "keywords": [
6
6
  "camstack",