@camstack/addon-export-hap 1.2.26 → 1.2.27

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.
@@ -13738,11 +13738,33 @@ var NotificationFormatSchema = _enum([
13738
13738
  * Named by INTENT, never by glyph. "check" would tie the vocabulary to one
13739
13739
  * renderer's icon set; "acknowledge" survives an adapter that draws it
13740
13740
  * differently.
13741
+ *
13742
+ * ── A TOKEN IS NOT A WIRE VALUE ─────────────────────────────────────
13743
+ *
13744
+ * These names are for US. **No adapter may forward one verbatim.** Each maps
13745
+ * the whole set onto its own renderer's vocabulary through a
13746
+ * `Record<NotificationActionIcon, string>` — a Record, never a lookup with a
13747
+ * fallback, so adding a member here fails every adapter's build until someone
13748
+ * decides its glyph, which is the only place that decision can be made
13749
+ * honestly.
13750
+ *
13751
+ * This paragraph is the bug. Zentik declared `actionIcons: true` and passed
13752
+ * `disarm` straight through; iOS feeds that string to
13753
+ * `UNNotificationActionIcon(systemImageName:)`, `disarm` is not an SF Symbol,
13754
+ * and every snooze and alarm button arrived BLANK. A pass-through is not a
13755
+ * mapping, and "the field is documented" is not "the value renders".
13756
+ *
13757
+ * Adding a member is TRAIN-BOUND. The enum lives in the published
13758
+ * `@camstack/server` closure and the cap seam validates against the HUB's copy,
13759
+ * so an addon that emits a token the running hub does not know does not lose an
13760
+ * icon — its whole `send` fails Zod validation and the notification never
13761
+ * arrives. Never emit a new token from an addon before the train carrying it.
13741
13762
  */
13742
13763
  var NotificationActionIconSchema = _enum([
13743
13764
  "acknowledge",
13744
13765
  "dismiss",
13745
13766
  "silence",
13767
+ "snooze",
13746
13768
  "view",
13747
13769
  "play",
13748
13770
  "open",
@@ -13750,9 +13772,13 @@ var NotificationActionIconSchema = _enum([
13750
13772
  "lock",
13751
13773
  "unlock",
13752
13774
  "arm",
13775
+ "arm-home",
13776
+ "arm-away",
13777
+ "arm-night",
13753
13778
  "disarm",
13754
13779
  "light",
13755
- "alert"
13780
+ "alert",
13781
+ "camera"
13756
13782
  ]);
13757
13783
  /** A single tap-through action button. */
13758
13784
  var NotificationActionSchema = object({
@@ -13952,6 +13978,24 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
13952
13978
  targetId: string(),
13953
13979
  enabled: boolean()
13954
13980
  }), _void(), { kind: "mutation" });
13981
+ new Set([
13982
+ {
13983
+ id: "person",
13984
+ name: "Person"
13985
+ },
13986
+ {
13987
+ id: "vehicle",
13988
+ name: "Vehicle"
13989
+ },
13990
+ {
13991
+ id: "animal",
13992
+ name: "Animal"
13993
+ },
13994
+ {
13995
+ id: "package",
13996
+ name: "Package"
13997
+ }
13998
+ ].map((l) => l.id));
13955
13999
  var COCO_TO_MACRO = {
13956
14000
  mapping: {
13957
14001
  person: "person",
@@ -14749,6 +14793,8 @@ var NcSystemEventKindSchema = _enum([
14749
14793
  "alarm-triggered",
14750
14794
  "alarm-armed",
14751
14795
  "alarm-disarmed",
14796
+ "alarm-arming",
14797
+ "alarm-arm-refused",
14752
14798
  "camera-online",
14753
14799
  "camera-offline",
14754
14800
  "camera-disabled",
@@ -17981,6 +18027,22 @@ var detectionFpsField = {
17981
18027
  default: 10,
17982
18028
  step: 1
17983
18029
  };
18030
+ /**
18031
+ * The occupancy re-check interval. DEFAULT 300 s (2026-08-13 — was 30 s).
18032
+ *
18033
+ * The recheck is now on by default (a parked car is invisible to occupancy
18034
+ * rules until the stationary registry has been rebuilt by motion, which after a
18035
+ * restart may be never on a quiet camera). Each cycle re-subscribes a detection
18036
+ * session — an RTSP re-dial — so the switch is only affordable at a WIDE
18037
+ * interval: 300 s is ~12 re-dials an hour per camera, against 120 at the old
18038
+ * 30 s. A parked car is therefore counted within 5 minutes of a restart.
18039
+ *
18040
+ * Why not wider: `max` is 300 and raising it is TRAIN-BOUND, not addon-bound —
18041
+ * the host validates `attachCamera` against ITS copy of this schema, so a
18042
+ * runner asked for 600 would be rejected by the hub until a `@camstack/server`
18043
+ * carrying the wider bound is installed everywhere. 300 is the widest value
18044
+ * that ships with an addon deploy.
18045
+ */
17984
18046
  var occupancyRecheckSecField = {
17985
18047
  min: 0,
17986
18048
  max: 300,
@@ -18182,15 +18244,21 @@ var RunnerCameraConfigSchema = object({
18182
18244
  */
18183
18245
  onboardMotionDrivesAnalyzer: boolean().default(true),
18184
18246
  /**
18185
- * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
18186
- * never arms the periodic recheck timer, regardless of `occupancyRecheckSec`
18187
- * this is off by default because the recheck re-subscribes a detection session
18188
- * every N seconds while `watching`, a major source of pull-decoder re-dial
18189
- * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
18247
+ * Master toggle for the occupancy re-check. When `false` the runner never arms
18248
+ * the periodic recheck timer, regardless of `occupancyRecheckSec`; the
18190
18249
  * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
18191
18250
  * (and only render) when this is enabled.
18192
- */
18193
- occupancyRecheckEnabled: boolean().default(false),
18251
+ *
18252
+ * DEFAULT `true` since 2026-08-13 (was `false`). It was off because the
18253
+ * recheck re-subscribes a detection session every N seconds while `watching`
18254
+ * — each cycle creates+tears a session ⇒ an RTSP re-dial ⇒ latency, a major
18255
+ * pull-decoder churn source. What that bought was a blind spot: a STATIONARY
18256
+ * object is counted only while the stationary registry holds it, and the
18257
+ * registry rebuilds from motion, so after a restart a parked car was invisible
18258
+ * to every occupancy rule until something moved in front of it. The churn is
18259
+ * now paid on the interval instead — see `occupancyRecheckSecField`.
18260
+ */
18261
+ occupancyRecheckEnabled: boolean().default(true),
18194
18262
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
18195
18263
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
18196
18264
  /**
@@ -13726,11 +13726,33 @@ var NotificationFormatSchema = _enum([
13726
13726
  * Named by INTENT, never by glyph. "check" would tie the vocabulary to one
13727
13727
  * renderer's icon set; "acknowledge" survives an adapter that draws it
13728
13728
  * differently.
13729
+ *
13730
+ * ── A TOKEN IS NOT A WIRE VALUE ─────────────────────────────────────
13731
+ *
13732
+ * These names are for US. **No adapter may forward one verbatim.** Each maps
13733
+ * the whole set onto its own renderer's vocabulary through a
13734
+ * `Record<NotificationActionIcon, string>` — a Record, never a lookup with a
13735
+ * fallback, so adding a member here fails every adapter's build until someone
13736
+ * decides its glyph, which is the only place that decision can be made
13737
+ * honestly.
13738
+ *
13739
+ * This paragraph is the bug. Zentik declared `actionIcons: true` and passed
13740
+ * `disarm` straight through; iOS feeds that string to
13741
+ * `UNNotificationActionIcon(systemImageName:)`, `disarm` is not an SF Symbol,
13742
+ * and every snooze and alarm button arrived BLANK. A pass-through is not a
13743
+ * mapping, and "the field is documented" is not "the value renders".
13744
+ *
13745
+ * Adding a member is TRAIN-BOUND. The enum lives in the published
13746
+ * `@camstack/server` closure and the cap seam validates against the HUB's copy,
13747
+ * so an addon that emits a token the running hub does not know does not lose an
13748
+ * icon — its whole `send` fails Zod validation and the notification never
13749
+ * arrives. Never emit a new token from an addon before the train carrying it.
13729
13750
  */
13730
13751
  var NotificationActionIconSchema = _enum([
13731
13752
  "acknowledge",
13732
13753
  "dismiss",
13733
13754
  "silence",
13755
+ "snooze",
13734
13756
  "view",
13735
13757
  "play",
13736
13758
  "open",
@@ -13738,9 +13760,13 @@ var NotificationActionIconSchema = _enum([
13738
13760
  "lock",
13739
13761
  "unlock",
13740
13762
  "arm",
13763
+ "arm-home",
13764
+ "arm-away",
13765
+ "arm-night",
13741
13766
  "disarm",
13742
13767
  "light",
13743
- "alert"
13768
+ "alert",
13769
+ "camera"
13744
13770
  ]);
13745
13771
  /** A single tap-through action button. */
13746
13772
  var NotificationActionSchema = object({
@@ -13940,6 +13966,24 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
13940
13966
  targetId: string(),
13941
13967
  enabled: boolean()
13942
13968
  }), _void(), { kind: "mutation" });
13969
+ new Set([
13970
+ {
13971
+ id: "person",
13972
+ name: "Person"
13973
+ },
13974
+ {
13975
+ id: "vehicle",
13976
+ name: "Vehicle"
13977
+ },
13978
+ {
13979
+ id: "animal",
13980
+ name: "Animal"
13981
+ },
13982
+ {
13983
+ id: "package",
13984
+ name: "Package"
13985
+ }
13986
+ ].map((l) => l.id));
13943
13987
  var COCO_TO_MACRO = {
13944
13988
  mapping: {
13945
13989
  person: "person",
@@ -14737,6 +14781,8 @@ var NcSystemEventKindSchema = _enum([
14737
14781
  "alarm-triggered",
14738
14782
  "alarm-armed",
14739
14783
  "alarm-disarmed",
14784
+ "alarm-arming",
14785
+ "alarm-arm-refused",
14740
14786
  "camera-online",
14741
14787
  "camera-offline",
14742
14788
  "camera-disabled",
@@ -17969,6 +18015,22 @@ var detectionFpsField = {
17969
18015
  default: 10,
17970
18016
  step: 1
17971
18017
  };
18018
+ /**
18019
+ * The occupancy re-check interval. DEFAULT 300 s (2026-08-13 — was 30 s).
18020
+ *
18021
+ * The recheck is now on by default (a parked car is invisible to occupancy
18022
+ * rules until the stationary registry has been rebuilt by motion, which after a
18023
+ * restart may be never on a quiet camera). Each cycle re-subscribes a detection
18024
+ * session — an RTSP re-dial — so the switch is only affordable at a WIDE
18025
+ * interval: 300 s is ~12 re-dials an hour per camera, against 120 at the old
18026
+ * 30 s. A parked car is therefore counted within 5 minutes of a restart.
18027
+ *
18028
+ * Why not wider: `max` is 300 and raising it is TRAIN-BOUND, not addon-bound —
18029
+ * the host validates `attachCamera` against ITS copy of this schema, so a
18030
+ * runner asked for 600 would be rejected by the hub until a `@camstack/server`
18031
+ * carrying the wider bound is installed everywhere. 300 is the widest value
18032
+ * that ships with an addon deploy.
18033
+ */
17972
18034
  var occupancyRecheckSecField = {
17973
18035
  min: 0,
17974
18036
  max: 300,
@@ -18170,15 +18232,21 @@ var RunnerCameraConfigSchema = object({
18170
18232
  */
18171
18233
  onboardMotionDrivesAnalyzer: boolean().default(true),
18172
18234
  /**
18173
- * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
18174
- * never arms the periodic recheck timer, regardless of `occupancyRecheckSec`
18175
- * this is off by default because the recheck re-subscribes a detection session
18176
- * every N seconds while `watching`, a major source of pull-decoder re-dial
18177
- * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
18235
+ * Master toggle for the occupancy re-check. When `false` the runner never arms
18236
+ * the periodic recheck timer, regardless of `occupancyRecheckSec`; the
18178
18237
  * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
18179
18238
  * (and only render) when this is enabled.
18180
- */
18181
- occupancyRecheckEnabled: boolean().default(false),
18239
+ *
18240
+ * DEFAULT `true` since 2026-08-13 (was `false`). It was off because the
18241
+ * recheck re-subscribes a detection session every N seconds while `watching`
18242
+ * — each cycle creates+tears a session ⇒ an RTSP re-dial ⇒ latency, a major
18243
+ * pull-decoder churn source. What that bought was a blind spot: a STATIONARY
18244
+ * object is counted only while the stationary registry holds it, and the
18245
+ * registry rebuilds from motion, so after a restart a parked car was invisible
18246
+ * to every occupancy rule until something moved in front of it. The churn is
18247
+ * now paid on the interval instead — see `occupancyRecheckSecField`.
18248
+ */
18249
+ occupancyRecheckEnabled: boolean().default(true),
18182
18250
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
18183
18251
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
18184
18252
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-export-hap",
3
- "version": "1.2.26",
3
+ "version": "1.2.27",
4
4
  "description": "HomeKit (HAP) bridge exporter for CamStack devices. Publishes a bridged accessory per exposed device — MotionSensor in this MVP; Camera/Doorbell/Switch/Light follow.",
5
5
  "keywords": [
6
6
  "camstack",