@camstack/addon-provider-ecowitt 0.2.15 → 0.2.16

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
@@ -13218,11 +13218,33 @@ var NotificationFormatSchema = _enum([
13218
13218
  * Named by INTENT, never by glyph. "check" would tie the vocabulary to one
13219
13219
  * renderer's icon set; "acknowledge" survives an adapter that draws it
13220
13220
  * differently.
13221
+ *
13222
+ * ── A TOKEN IS NOT A WIRE VALUE ─────────────────────────────────────
13223
+ *
13224
+ * These names are for US. **No adapter may forward one verbatim.** Each maps
13225
+ * the whole set onto its own renderer's vocabulary through a
13226
+ * `Record<NotificationActionIcon, string>` — a Record, never a lookup with a
13227
+ * fallback, so adding a member here fails every adapter's build until someone
13228
+ * decides its glyph, which is the only place that decision can be made
13229
+ * honestly.
13230
+ *
13231
+ * This paragraph is the bug. Zentik declared `actionIcons: true` and passed
13232
+ * `disarm` straight through; iOS feeds that string to
13233
+ * `UNNotificationActionIcon(systemImageName:)`, `disarm` is not an SF Symbol,
13234
+ * and every snooze and alarm button arrived BLANK. A pass-through is not a
13235
+ * mapping, and "the field is documented" is not "the value renders".
13236
+ *
13237
+ * Adding a member is TRAIN-BOUND. The enum lives in the published
13238
+ * `@camstack/server` closure and the cap seam validates against the HUB's copy,
13239
+ * so an addon that emits a token the running hub does not know does not lose an
13240
+ * icon — its whole `send` fails Zod validation and the notification never
13241
+ * arrives. Never emit a new token from an addon before the train carrying it.
13221
13242
  */
13222
13243
  var NotificationActionIconSchema = _enum([
13223
13244
  "acknowledge",
13224
13245
  "dismiss",
13225
13246
  "silence",
13247
+ "snooze",
13226
13248
  "view",
13227
13249
  "play",
13228
13250
  "open",
@@ -13230,9 +13252,13 @@ var NotificationActionIconSchema = _enum([
13230
13252
  "lock",
13231
13253
  "unlock",
13232
13254
  "arm",
13255
+ "arm-home",
13256
+ "arm-away",
13257
+ "arm-night",
13233
13258
  "disarm",
13234
13259
  "light",
13235
- "alert"
13260
+ "alert",
13261
+ "camera"
13236
13262
  ]);
13237
13263
  /** A single tap-through action button. */
13238
13264
  var NotificationActionSchema = object({
@@ -13432,6 +13458,24 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
13432
13458
  targetId: string(),
13433
13459
  enabled: boolean()
13434
13460
  }), _void(), { kind: "mutation" });
13461
+ new Set([
13462
+ {
13463
+ id: "person",
13464
+ name: "Person"
13465
+ },
13466
+ {
13467
+ id: "vehicle",
13468
+ name: "Vehicle"
13469
+ },
13470
+ {
13471
+ id: "animal",
13472
+ name: "Animal"
13473
+ },
13474
+ {
13475
+ id: "package",
13476
+ name: "Package"
13477
+ }
13478
+ ].map((l) => l.id));
13435
13479
  var COCO_TO_MACRO = {
13436
13480
  mapping: {
13437
13481
  person: "person",
@@ -14267,6 +14311,8 @@ var NcSystemEventKindSchema = _enum([
14267
14311
  "alarm-triggered",
14268
14312
  "alarm-armed",
14269
14313
  "alarm-disarmed",
14314
+ "alarm-arming",
14315
+ "alarm-arm-refused",
14270
14316
  "camera-online",
14271
14317
  "camera-offline",
14272
14318
  "camera-disabled",
@@ -17539,6 +17585,22 @@ var detectionFpsField = {
17539
17585
  default: 10,
17540
17586
  step: 1
17541
17587
  };
17588
+ /**
17589
+ * The occupancy re-check interval. DEFAULT 300 s (2026-08-13 — was 30 s).
17590
+ *
17591
+ * The recheck is now on by default (a parked car is invisible to occupancy
17592
+ * rules until the stationary registry has been rebuilt by motion, which after a
17593
+ * restart may be never on a quiet camera). Each cycle re-subscribes a detection
17594
+ * session — an RTSP re-dial — so the switch is only affordable at a WIDE
17595
+ * interval: 300 s is ~12 re-dials an hour per camera, against 120 at the old
17596
+ * 30 s. A parked car is therefore counted within 5 minutes of a restart.
17597
+ *
17598
+ * Why not wider: `max` is 300 and raising it is TRAIN-BOUND, not addon-bound —
17599
+ * the host validates `attachCamera` against ITS copy of this schema, so a
17600
+ * runner asked for 600 would be rejected by the hub until a `@camstack/server`
17601
+ * carrying the wider bound is installed everywhere. 300 is the widest value
17602
+ * that ships with an addon deploy.
17603
+ */
17542
17604
  var occupancyRecheckSecField = {
17543
17605
  min: 0,
17544
17606
  max: 300,
@@ -17740,15 +17802,21 @@ var RunnerCameraConfigSchema = object({
17740
17802
  */
17741
17803
  onboardMotionDrivesAnalyzer: boolean().default(true),
17742
17804
  /**
17743
- * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
17744
- * never arms the periodic recheck timer, regardless of `occupancyRecheckSec`
17745
- * this is off by default because the recheck re-subscribes a detection session
17746
- * every N seconds while `watching`, a major source of pull-decoder re-dial
17747
- * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
17805
+ * Master toggle for the occupancy re-check. When `false` the runner never arms
17806
+ * the periodic recheck timer, regardless of `occupancyRecheckSec`; the
17748
17807
  * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
17749
17808
  * (and only render) when this is enabled.
17750
- */
17751
- occupancyRecheckEnabled: boolean().default(false),
17809
+ *
17810
+ * DEFAULT `true` since 2026-08-13 (was `false`). It was off because the
17811
+ * recheck re-subscribes a detection session every N seconds while `watching`
17812
+ * — each cycle creates+tears a session ⇒ an RTSP re-dial ⇒ latency, a major
17813
+ * pull-decoder churn source. What that bought was a blind spot: a STATIONARY
17814
+ * object is counted only while the stationary registry holds it, and the
17815
+ * registry rebuilds from motion, so after a restart a parked car was invisible
17816
+ * to every occupancy rule until something moved in front of it. The churn is
17817
+ * now paid on the interval instead — see `occupancyRecheckSecField`.
17818
+ */
17819
+ occupancyRecheckEnabled: boolean().default(true),
17752
17820
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
17753
17821
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
17754
17822
  /**
package/dist/addon.mjs CHANGED
@@ -13217,11 +13217,33 @@ var NotificationFormatSchema = _enum([
13217
13217
  * Named by INTENT, never by glyph. "check" would tie the vocabulary to one
13218
13218
  * renderer's icon set; "acknowledge" survives an adapter that draws it
13219
13219
  * differently.
13220
+ *
13221
+ * ── A TOKEN IS NOT A WIRE VALUE ─────────────────────────────────────
13222
+ *
13223
+ * These names are for US. **No adapter may forward one verbatim.** Each maps
13224
+ * the whole set onto its own renderer's vocabulary through a
13225
+ * `Record<NotificationActionIcon, string>` — a Record, never a lookup with a
13226
+ * fallback, so adding a member here fails every adapter's build until someone
13227
+ * decides its glyph, which is the only place that decision can be made
13228
+ * honestly.
13229
+ *
13230
+ * This paragraph is the bug. Zentik declared `actionIcons: true` and passed
13231
+ * `disarm` straight through; iOS feeds that string to
13232
+ * `UNNotificationActionIcon(systemImageName:)`, `disarm` is not an SF Symbol,
13233
+ * and every snooze and alarm button arrived BLANK. A pass-through is not a
13234
+ * mapping, and "the field is documented" is not "the value renders".
13235
+ *
13236
+ * Adding a member is TRAIN-BOUND. The enum lives in the published
13237
+ * `@camstack/server` closure and the cap seam validates against the HUB's copy,
13238
+ * so an addon that emits a token the running hub does not know does not lose an
13239
+ * icon — its whole `send` fails Zod validation and the notification never
13240
+ * arrives. Never emit a new token from an addon before the train carrying it.
13220
13241
  */
13221
13242
  var NotificationActionIconSchema = _enum([
13222
13243
  "acknowledge",
13223
13244
  "dismiss",
13224
13245
  "silence",
13246
+ "snooze",
13225
13247
  "view",
13226
13248
  "play",
13227
13249
  "open",
@@ -13229,9 +13251,13 @@ var NotificationActionIconSchema = _enum([
13229
13251
  "lock",
13230
13252
  "unlock",
13231
13253
  "arm",
13254
+ "arm-home",
13255
+ "arm-away",
13256
+ "arm-night",
13232
13257
  "disarm",
13233
13258
  "light",
13234
- "alert"
13259
+ "alert",
13260
+ "camera"
13235
13261
  ]);
13236
13262
  /** A single tap-through action button. */
13237
13263
  var NotificationActionSchema = object({
@@ -13431,6 +13457,24 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
13431
13457
  targetId: string(),
13432
13458
  enabled: boolean()
13433
13459
  }), _void(), { kind: "mutation" });
13460
+ new Set([
13461
+ {
13462
+ id: "person",
13463
+ name: "Person"
13464
+ },
13465
+ {
13466
+ id: "vehicle",
13467
+ name: "Vehicle"
13468
+ },
13469
+ {
13470
+ id: "animal",
13471
+ name: "Animal"
13472
+ },
13473
+ {
13474
+ id: "package",
13475
+ name: "Package"
13476
+ }
13477
+ ].map((l) => l.id));
13434
13478
  var COCO_TO_MACRO = {
13435
13479
  mapping: {
13436
13480
  person: "person",
@@ -14266,6 +14310,8 @@ var NcSystemEventKindSchema = _enum([
14266
14310
  "alarm-triggered",
14267
14311
  "alarm-armed",
14268
14312
  "alarm-disarmed",
14313
+ "alarm-arming",
14314
+ "alarm-arm-refused",
14269
14315
  "camera-online",
14270
14316
  "camera-offline",
14271
14317
  "camera-disabled",
@@ -17538,6 +17584,22 @@ var detectionFpsField = {
17538
17584
  default: 10,
17539
17585
  step: 1
17540
17586
  };
17587
+ /**
17588
+ * The occupancy re-check interval. DEFAULT 300 s (2026-08-13 — was 30 s).
17589
+ *
17590
+ * The recheck is now on by default (a parked car is invisible to occupancy
17591
+ * rules until the stationary registry has been rebuilt by motion, which after a
17592
+ * restart may be never on a quiet camera). Each cycle re-subscribes a detection
17593
+ * session — an RTSP re-dial — so the switch is only affordable at a WIDE
17594
+ * interval: 300 s is ~12 re-dials an hour per camera, against 120 at the old
17595
+ * 30 s. A parked car is therefore counted within 5 minutes of a restart.
17596
+ *
17597
+ * Why not wider: `max` is 300 and raising it is TRAIN-BOUND, not addon-bound —
17598
+ * the host validates `attachCamera` against ITS copy of this schema, so a
17599
+ * runner asked for 600 would be rejected by the hub until a `@camstack/server`
17600
+ * carrying the wider bound is installed everywhere. 300 is the widest value
17601
+ * that ships with an addon deploy.
17602
+ */
17541
17603
  var occupancyRecheckSecField = {
17542
17604
  min: 0,
17543
17605
  max: 300,
@@ -17739,15 +17801,21 @@ var RunnerCameraConfigSchema = object({
17739
17801
  */
17740
17802
  onboardMotionDrivesAnalyzer: boolean().default(true),
17741
17803
  /**
17742
- * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
17743
- * never arms the periodic recheck timer, regardless of `occupancyRecheckSec`
17744
- * this is off by default because the recheck re-subscribes a detection session
17745
- * every N seconds while `watching`, a major source of pull-decoder re-dial
17746
- * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
17804
+ * Master toggle for the occupancy re-check. When `false` the runner never arms
17805
+ * the periodic recheck timer, regardless of `occupancyRecheckSec`; the
17747
17806
  * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
17748
17807
  * (and only render) when this is enabled.
17749
- */
17750
- occupancyRecheckEnabled: boolean().default(false),
17808
+ *
17809
+ * DEFAULT `true` since 2026-08-13 (was `false`). It was off because the
17810
+ * recheck re-subscribes a detection session every N seconds while `watching`
17811
+ * — each cycle creates+tears a session ⇒ an RTSP re-dial ⇒ latency, a major
17812
+ * pull-decoder churn source. What that bought was a blind spot: a STATIONARY
17813
+ * object is counted only while the stationary registry holds it, and the
17814
+ * registry rebuilds from motion, so after a restart a parked car was invisible
17815
+ * to every occupancy rule until something moved in front of it. The churn is
17816
+ * now paid on the interval instead — see `occupancyRecheckSecField`.
17817
+ */
17818
+ occupancyRecheckEnabled: boolean().default(true),
17751
17819
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
17752
17820
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
17753
17821
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-ecowitt",
3
- "version": "0.2.15",
3
+ "version": "0.2.16",
4
4
  "description": "Ecowitt weather-station device-provider addon for CamStack — wraps the @apocaliss92/nodewitt local-poll / push client",
5
5
  "keywords": [
6
6
  "camstack",