@camstack/addon-provider-tuya 0.2.16 → 0.2.17

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
@@ -14052,11 +14052,33 @@ var NotificationFormatSchema = _enum([
14052
14052
  * Named by INTENT, never by glyph. "check" would tie the vocabulary to one
14053
14053
  * renderer's icon set; "acknowledge" survives an adapter that draws it
14054
14054
  * differently.
14055
+ *
14056
+ * ── A TOKEN IS NOT A WIRE VALUE ─────────────────────────────────────
14057
+ *
14058
+ * These names are for US. **No adapter may forward one verbatim.** Each maps
14059
+ * the whole set onto its own renderer's vocabulary through a
14060
+ * `Record<NotificationActionIcon, string>` — a Record, never a lookup with a
14061
+ * fallback, so adding a member here fails every adapter's build until someone
14062
+ * decides its glyph, which is the only place that decision can be made
14063
+ * honestly.
14064
+ *
14065
+ * This paragraph is the bug. Zentik declared `actionIcons: true` and passed
14066
+ * `disarm` straight through; iOS feeds that string to
14067
+ * `UNNotificationActionIcon(systemImageName:)`, `disarm` is not an SF Symbol,
14068
+ * and every snooze and alarm button arrived BLANK. A pass-through is not a
14069
+ * mapping, and "the field is documented" is not "the value renders".
14070
+ *
14071
+ * Adding a member is TRAIN-BOUND. The enum lives in the published
14072
+ * `@camstack/server` closure and the cap seam validates against the HUB's copy,
14073
+ * so an addon that emits a token the running hub does not know does not lose an
14074
+ * icon — its whole `send` fails Zod validation and the notification never
14075
+ * arrives. Never emit a new token from an addon before the train carrying it.
14055
14076
  */
14056
14077
  var NotificationActionIconSchema = _enum([
14057
14078
  "acknowledge",
14058
14079
  "dismiss",
14059
14080
  "silence",
14081
+ "snooze",
14060
14082
  "view",
14061
14083
  "play",
14062
14084
  "open",
@@ -14064,9 +14086,13 @@ var NotificationActionIconSchema = _enum([
14064
14086
  "lock",
14065
14087
  "unlock",
14066
14088
  "arm",
14089
+ "arm-home",
14090
+ "arm-away",
14091
+ "arm-night",
14067
14092
  "disarm",
14068
14093
  "light",
14069
- "alert"
14094
+ "alert",
14095
+ "camera"
14070
14096
  ]);
14071
14097
  /** A single tap-through action button. */
14072
14098
  var NotificationActionSchema = object({
@@ -14266,6 +14292,24 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
14266
14292
  targetId: string(),
14267
14293
  enabled: boolean()
14268
14294
  }), _void(), { kind: "mutation" });
14295
+ new Set([
14296
+ {
14297
+ id: "person",
14298
+ name: "Person"
14299
+ },
14300
+ {
14301
+ id: "vehicle",
14302
+ name: "Vehicle"
14303
+ },
14304
+ {
14305
+ id: "animal",
14306
+ name: "Animal"
14307
+ },
14308
+ {
14309
+ id: "package",
14310
+ name: "Package"
14311
+ }
14312
+ ].map((l) => l.id));
14269
14313
  var COCO_TO_MACRO = {
14270
14314
  mapping: {
14271
14315
  person: "person",
@@ -15101,6 +15145,8 @@ var NcSystemEventKindSchema = _enum([
15101
15145
  "alarm-triggered",
15102
15146
  "alarm-armed",
15103
15147
  "alarm-disarmed",
15148
+ "alarm-arming",
15149
+ "alarm-arm-refused",
15104
15150
  "camera-online",
15105
15151
  "camera-offline",
15106
15152
  "camera-disabled",
@@ -18373,6 +18419,22 @@ var detectionFpsField = {
18373
18419
  default: 10,
18374
18420
  step: 1
18375
18421
  };
18422
+ /**
18423
+ * The occupancy re-check interval. DEFAULT 300 s (2026-08-13 — was 30 s).
18424
+ *
18425
+ * The recheck is now on by default (a parked car is invisible to occupancy
18426
+ * rules until the stationary registry has been rebuilt by motion, which after a
18427
+ * restart may be never on a quiet camera). Each cycle re-subscribes a detection
18428
+ * session — an RTSP re-dial — so the switch is only affordable at a WIDE
18429
+ * interval: 300 s is ~12 re-dials an hour per camera, against 120 at the old
18430
+ * 30 s. A parked car is therefore counted within 5 minutes of a restart.
18431
+ *
18432
+ * Why not wider: `max` is 300 and raising it is TRAIN-BOUND, not addon-bound —
18433
+ * the host validates `attachCamera` against ITS copy of this schema, so a
18434
+ * runner asked for 600 would be rejected by the hub until a `@camstack/server`
18435
+ * carrying the wider bound is installed everywhere. 300 is the widest value
18436
+ * that ships with an addon deploy.
18437
+ */
18376
18438
  var occupancyRecheckSecField = {
18377
18439
  min: 0,
18378
18440
  max: 300,
@@ -18574,15 +18636,21 @@ var RunnerCameraConfigSchema = object({
18574
18636
  */
18575
18637
  onboardMotionDrivesAnalyzer: boolean().default(true),
18576
18638
  /**
18577
- * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
18578
- * never arms the periodic recheck timer, regardless of `occupancyRecheckSec`
18579
- * this is off by default because the recheck re-subscribes a detection session
18580
- * every N seconds while `watching`, a major source of pull-decoder re-dial
18581
- * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
18639
+ * Master toggle for the occupancy re-check. When `false` the runner never arms
18640
+ * the periodic recheck timer, regardless of `occupancyRecheckSec`; the
18582
18641
  * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
18583
18642
  * (and only render) when this is enabled.
18584
- */
18585
- occupancyRecheckEnabled: boolean().default(false),
18643
+ *
18644
+ * DEFAULT `true` since 2026-08-13 (was `false`). It was off because the
18645
+ * recheck re-subscribes a detection session every N seconds while `watching`
18646
+ * — each cycle creates+tears a session ⇒ an RTSP re-dial ⇒ latency, a major
18647
+ * pull-decoder churn source. What that bought was a blind spot: a STATIONARY
18648
+ * object is counted only while the stationary registry holds it, and the
18649
+ * registry rebuilds from motion, so after a restart a parked car was invisible
18650
+ * to every occupancy rule until something moved in front of it. The churn is
18651
+ * now paid on the interval instead — see `occupancyRecheckSecField`.
18652
+ */
18653
+ occupancyRecheckEnabled: boolean().default(true),
18586
18654
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
18587
18655
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
18588
18656
  /**
package/dist/addon.mjs CHANGED
@@ -14051,11 +14051,33 @@ var NotificationFormatSchema = _enum([
14051
14051
  * Named by INTENT, never by glyph. "check" would tie the vocabulary to one
14052
14052
  * renderer's icon set; "acknowledge" survives an adapter that draws it
14053
14053
  * differently.
14054
+ *
14055
+ * ── A TOKEN IS NOT A WIRE VALUE ─────────────────────────────────────
14056
+ *
14057
+ * These names are for US. **No adapter may forward one verbatim.** Each maps
14058
+ * the whole set onto its own renderer's vocabulary through a
14059
+ * `Record<NotificationActionIcon, string>` — a Record, never a lookup with a
14060
+ * fallback, so adding a member here fails every adapter's build until someone
14061
+ * decides its glyph, which is the only place that decision can be made
14062
+ * honestly.
14063
+ *
14064
+ * This paragraph is the bug. Zentik declared `actionIcons: true` and passed
14065
+ * `disarm` straight through; iOS feeds that string to
14066
+ * `UNNotificationActionIcon(systemImageName:)`, `disarm` is not an SF Symbol,
14067
+ * and every snooze and alarm button arrived BLANK. A pass-through is not a
14068
+ * mapping, and "the field is documented" is not "the value renders".
14069
+ *
14070
+ * Adding a member is TRAIN-BOUND. The enum lives in the published
14071
+ * `@camstack/server` closure and the cap seam validates against the HUB's copy,
14072
+ * so an addon that emits a token the running hub does not know does not lose an
14073
+ * icon — its whole `send` fails Zod validation and the notification never
14074
+ * arrives. Never emit a new token from an addon before the train carrying it.
14054
14075
  */
14055
14076
  var NotificationActionIconSchema = _enum([
14056
14077
  "acknowledge",
14057
14078
  "dismiss",
14058
14079
  "silence",
14080
+ "snooze",
14059
14081
  "view",
14060
14082
  "play",
14061
14083
  "open",
@@ -14063,9 +14085,13 @@ var NotificationActionIconSchema = _enum([
14063
14085
  "lock",
14064
14086
  "unlock",
14065
14087
  "arm",
14088
+ "arm-home",
14089
+ "arm-away",
14090
+ "arm-night",
14066
14091
  "disarm",
14067
14092
  "light",
14068
- "alert"
14093
+ "alert",
14094
+ "camera"
14069
14095
  ]);
14070
14096
  /** A single tap-through action button. */
14071
14097
  var NotificationActionSchema = object({
@@ -14265,6 +14291,24 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
14265
14291
  targetId: string(),
14266
14292
  enabled: boolean()
14267
14293
  }), _void(), { kind: "mutation" });
14294
+ new Set([
14295
+ {
14296
+ id: "person",
14297
+ name: "Person"
14298
+ },
14299
+ {
14300
+ id: "vehicle",
14301
+ name: "Vehicle"
14302
+ },
14303
+ {
14304
+ id: "animal",
14305
+ name: "Animal"
14306
+ },
14307
+ {
14308
+ id: "package",
14309
+ name: "Package"
14310
+ }
14311
+ ].map((l) => l.id));
14268
14312
  var COCO_TO_MACRO = {
14269
14313
  mapping: {
14270
14314
  person: "person",
@@ -15100,6 +15144,8 @@ var NcSystemEventKindSchema = _enum([
15100
15144
  "alarm-triggered",
15101
15145
  "alarm-armed",
15102
15146
  "alarm-disarmed",
15147
+ "alarm-arming",
15148
+ "alarm-arm-refused",
15103
15149
  "camera-online",
15104
15150
  "camera-offline",
15105
15151
  "camera-disabled",
@@ -18372,6 +18418,22 @@ var detectionFpsField = {
18372
18418
  default: 10,
18373
18419
  step: 1
18374
18420
  };
18421
+ /**
18422
+ * The occupancy re-check interval. DEFAULT 300 s (2026-08-13 — was 30 s).
18423
+ *
18424
+ * The recheck is now on by default (a parked car is invisible to occupancy
18425
+ * rules until the stationary registry has been rebuilt by motion, which after a
18426
+ * restart may be never on a quiet camera). Each cycle re-subscribes a detection
18427
+ * session — an RTSP re-dial — so the switch is only affordable at a WIDE
18428
+ * interval: 300 s is ~12 re-dials an hour per camera, against 120 at the old
18429
+ * 30 s. A parked car is therefore counted within 5 minutes of a restart.
18430
+ *
18431
+ * Why not wider: `max` is 300 and raising it is TRAIN-BOUND, not addon-bound —
18432
+ * the host validates `attachCamera` against ITS copy of this schema, so a
18433
+ * runner asked for 600 would be rejected by the hub until a `@camstack/server`
18434
+ * carrying the wider bound is installed everywhere. 300 is the widest value
18435
+ * that ships with an addon deploy.
18436
+ */
18375
18437
  var occupancyRecheckSecField = {
18376
18438
  min: 0,
18377
18439
  max: 300,
@@ -18573,15 +18635,21 @@ var RunnerCameraConfigSchema = object({
18573
18635
  */
18574
18636
  onboardMotionDrivesAnalyzer: boolean().default(true),
18575
18637
  /**
18576
- * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
18577
- * never arms the periodic recheck timer, regardless of `occupancyRecheckSec`
18578
- * this is off by default because the recheck re-subscribes a detection session
18579
- * every N seconds while `watching`, a major source of pull-decoder re-dial
18580
- * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
18638
+ * Master toggle for the occupancy re-check. When `false` the runner never arms
18639
+ * the periodic recheck timer, regardless of `occupancyRecheckSec`; the
18581
18640
  * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
18582
18641
  * (and only render) when this is enabled.
18583
- */
18584
- occupancyRecheckEnabled: boolean().default(false),
18642
+ *
18643
+ * DEFAULT `true` since 2026-08-13 (was `false`). It was off because the
18644
+ * recheck re-subscribes a detection session every N seconds while `watching`
18645
+ * — each cycle creates+tears a session ⇒ an RTSP re-dial ⇒ latency, a major
18646
+ * pull-decoder churn source. What that bought was a blind spot: a STATIONARY
18647
+ * object is counted only while the stationary registry holds it, and the
18648
+ * registry rebuilds from motion, so after a restart a parked car was invisible
18649
+ * to every occupancy rule until something moved in front of it. The churn is
18650
+ * now paid on the interval instead — see `occupancyRecheckSecField`.
18651
+ */
18652
+ occupancyRecheckEnabled: boolean().default(true),
18585
18653
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
18586
18654
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
18587
18655
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-tuya",
3
- "version": "0.2.16",
3
+ "version": "0.2.17",
4
4
  "description": "Tuya / Smart Life device-provider addon for CamStack — account-onboarded (Tuya IoT cloud fetch of device localKeys) + LOCAL DP control via the @apocaliss92/nodetuya encrypted-LAN client, exposing switch / water-heater-family kettle entities",
5
5
  "keywords": [
6
6
  "camstack",