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