@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.
- package/dist/hap-export.addon.js +76 -8
- package/dist/hap-export.addon.mjs +76 -8
- package/package.json +1 -1
package/dist/hap-export.addon.js
CHANGED
|
@@ -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`
|
|
18186
|
-
*
|
|
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
|
-
|
|
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`
|
|
18174
|
-
*
|
|
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
|
-
|
|
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.
|
|
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",
|