@camstack/addon-export-hap 1.2.95 → 1.2.97

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.
@@ -16612,16 +16612,16 @@ DeviceType.AlarmPanel, method(object({
16612
16612
  code: string().min(1).optional()
16613
16613
  }), _void(), {
16614
16614
  kind: "mutation",
16615
- auth: "admin"
16615
+ auth: "protected"
16616
16616
  }), method(object({
16617
16617
  deviceId: number().int().nonnegative(),
16618
16618
  code: string().min(1).optional()
16619
16619
  }), _void(), {
16620
16620
  kind: "mutation",
16621
- auth: "admin"
16621
+ auth: "protected"
16622
16622
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
16623
16623
  kind: "mutation",
16624
- auth: "admin"
16624
+ auth: "protected"
16625
16625
  });
16626
16626
  /**
16627
16627
  * Shared geometry vocabulary for on-frame shape caps — privacy-mask,
@@ -24280,7 +24280,7 @@ DeviceType.Light, method(object({
24280
24280
  percentage: number().min(0).max(100)
24281
24281
  }), _void(), {
24282
24282
  kind: "mutation",
24283
- auth: "admin"
24283
+ auth: "protected"
24284
24284
  }), object({
24285
24285
  deviceId: number(),
24286
24286
  percentage: number().min(0).max(100),
@@ -24288,7 +24288,7 @@ DeviceType.Light, method(object({
24288
24288
  });
24289
24289
  DeviceType.Button, method(object({ deviceId: number().int().nonnegative() }), _void(), {
24290
24290
  kind: "mutation",
24291
- auth: "admin"
24291
+ auth: "protected"
24292
24292
  });
24293
24293
  /**
24294
24294
  * camera-credentials — device-scoped cap exposing the camera's network
@@ -24451,50 +24451,50 @@ DeviceType.Thermostat, DeviceType.Climate, method(object({
24451
24451
  mode: HvacModeSchema
24452
24452
  }), _void(), {
24453
24453
  kind: "mutation",
24454
- auth: "admin"
24454
+ auth: "protected"
24455
24455
  }), method(object({
24456
24456
  deviceId: number().int().nonnegative(),
24457
24457
  fanMode: string().min(1)
24458
24458
  }), _void(), {
24459
24459
  kind: "mutation",
24460
- auth: "admin"
24460
+ auth: "protected"
24461
24461
  }), method(object({
24462
24462
  deviceId: number().int().nonnegative(),
24463
24463
  preset: string().min(1)
24464
24464
  }), _void(), {
24465
24465
  kind: "mutation",
24466
- auth: "admin"
24466
+ auth: "protected"
24467
24467
  }), method(object({
24468
24468
  deviceId: number().int().nonnegative(),
24469
24469
  target: number()
24470
24470
  }), _void(), {
24471
24471
  kind: "mutation",
24472
- auth: "admin"
24472
+ auth: "protected"
24473
24473
  }), method(object({
24474
24474
  deviceId: number().int().nonnegative(),
24475
24475
  targetLow: number(),
24476
24476
  targetHigh: number()
24477
24477
  }), _void(), {
24478
24478
  kind: "mutation",
24479
- auth: "admin"
24479
+ auth: "protected"
24480
24480
  }), method(object({
24481
24481
  deviceId: number().int().nonnegative(),
24482
24482
  targetHumidity: number().min(0).max(100)
24483
24483
  }), _void(), {
24484
24484
  kind: "mutation",
24485
- auth: "admin"
24485
+ auth: "protected"
24486
24486
  }), method(object({
24487
24487
  deviceId: number().int().nonnegative(),
24488
24488
  on: boolean()
24489
24489
  }), _void(), {
24490
24490
  kind: "mutation",
24491
- auth: "admin"
24491
+ auth: "protected"
24492
24492
  }), method(object({
24493
24493
  deviceId: number().int().nonnegative(),
24494
24494
  on: boolean()
24495
24495
  }), _void(), {
24496
24496
  kind: "mutation",
24497
- auth: "admin"
24497
+ auth: "protected"
24498
24498
  });
24499
24499
  /**
24500
24500
  * Color-light cap. Coexists with `switch` (on/off) and `brightness`
@@ -24569,7 +24569,7 @@ DeviceType.Light, method(object({
24569
24569
  color: ColorInputSchema
24570
24570
  }), _void(), {
24571
24571
  kind: "mutation",
24572
- auth: "admin"
24572
+ auth: "protected"
24573
24573
  }), object({
24574
24574
  deviceId: number(),
24575
24575
  mode: _enum([
@@ -24730,7 +24730,7 @@ DeviceType.Control, method(object({
24730
24730
  control: ControlSetValueInputSchema
24731
24731
  }), _void(), {
24732
24732
  kind: "mutation",
24733
- auth: "admin"
24733
+ auth: "protected"
24734
24734
  });
24735
24735
  object({
24736
24736
  /** Lifecycle state of the cover. */
@@ -24751,25 +24751,25 @@ object({
24751
24751
  });
24752
24752
  DeviceType.Cover, method(object({ deviceId: number().int().nonnegative() }), _void(), {
24753
24753
  kind: "mutation",
24754
- auth: "admin"
24754
+ auth: "protected"
24755
24755
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
24756
24756
  kind: "mutation",
24757
- auth: "admin"
24757
+ auth: "protected"
24758
24758
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
24759
24759
  kind: "mutation",
24760
- auth: "admin"
24760
+ auth: "protected"
24761
24761
  }), method(object({
24762
24762
  deviceId: number().int().nonnegative(),
24763
24763
  position: number().min(0).max(100)
24764
24764
  }), _void(), {
24765
24765
  kind: "mutation",
24766
- auth: "admin"
24766
+ auth: "protected"
24767
24767
  }), method(object({
24768
24768
  deviceId: number().int().nonnegative(),
24769
24769
  tiltPosition: number().min(0).max(100)
24770
24770
  }), _void(), {
24771
24771
  kind: "mutation",
24772
- auth: "admin"
24772
+ auth: "protected"
24773
24773
  });
24774
24774
  /**
24775
24775
  * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
@@ -24974,6 +24974,59 @@ var IdentitySampleInfoSchema = object({
24974
24974
  deviceId: number().int().optional(),
24975
24975
  base64: string().optional()
24976
24976
  });
24977
+ /**
24978
+ * One enrolled sample, judged against the gallery it lives in.
24979
+ *
24980
+ * The gallery is the one input to recognition nobody re-reads: a sample
24981
+ * enrolled from the wrong face keeps voting forever, and because the matches it
24982
+ * pulls then look confident, nobody goes back. The 2026-09-08 audit found
24983
+ * exactly one such pair on this cluster — a sample scoring 0.61 against three
24984
+ * samples of ANOTHER person, enrolled from the same camera in the same minute,
24985
+ * where every other cross-identity pair sits under 0.50.
24986
+ */
24987
+ var IdentitySampleAuditRowSchema = object({
24988
+ sampleId: string(),
24989
+ enrolledAt: number().int(),
24990
+ deviceId: number().int().optional(),
24991
+ source: _enum(["detected", "photo"]),
24992
+ /** The enrolled crop's media key, so the panel can show the evidence. */
24993
+ mediaKey: string().optional(),
24994
+ /**
24995
+ * False = the sample is stamped with a DIFFERENT face model, and a cosine
24996
+ * across feature spaces is a well-formed float with no meaning. Every number
24997
+ * below then says nothing — it must read as "cannot say", never as an
24998
+ * accusation and never as a clean bill: this list ends in a Remove button.
24999
+ */
25000
+ comparable: boolean(),
25001
+ /** Mean cosine against this person's other samples. Null when there are none
25002
+ * to compare with — never 0, which would read as "opposite". */
25003
+ selfMean: number().nullable(),
25004
+ /** The other person this sample looks most like, when it looks like one.
25005
+ * This is the half that convicts: not looking like yourself can be a hard
25006
+ * angle; looking like someone the gallery can NAME is a mis-enrolment. */
25007
+ bestForeign: object({
25008
+ identityId: string(),
25009
+ name: string(),
25010
+ score: number()
25011
+ }).optional(),
25012
+ /** 0 = nothing to say. Higher = look at this one sooner. */
25013
+ suspicion: number()
25014
+ });
25015
+ var IdentitySampleAuditSchema = object({
25016
+ identityId: string(),
25017
+ name: string(),
25018
+ /** The cluster face model every comparison was made in. */
25019
+ modelId: string(),
25020
+ totalSamples: number().int(),
25021
+ comparableSamples: number().int(),
25022
+ flagged: number().int(),
25023
+ /** The bar `flagged` counts against, so the panel states the RULE and not
25024
+ * only its current result. */
25025
+ flagThreshold: number(),
25026
+ /** Worst first. A row with nothing to say still appears, at the bottom: the
25027
+ * operator asked to see the gallery, not only its accusations. */
25028
+ rows: array(IdentitySampleAuditRowSchema).readonly()
25029
+ });
24977
25030
  var FaceInfoSchema = object({
24978
25031
  faceId: string(),
24979
25032
  deviceId: number().int(),
@@ -25125,7 +25178,7 @@ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly
25125
25178
  }), method(object({ id: string() }), _void(), {
25126
25179
  kind: "mutation",
25127
25180
  auth: "admin"
25128
- }), method(object({ identityId: string() }), array(IdentitySampleInfoSchema).readonly()), method(object({
25181
+ }), method(object({ identityId: string() }), array(IdentitySampleInfoSchema).readonly()), method(object({ identityId: string().min(1) }), IdentitySampleAuditSchema, { auth: "admin" }), method(object({
25129
25182
  identityId: string(),
25130
25183
  sampleId: string()
25131
25184
  }), _void(), {
@@ -25311,25 +25364,25 @@ DeviceType.Fan, method(object({
25311
25364
  percentage: number().min(0).max(100)
25312
25365
  }), _void(), {
25313
25366
  kind: "mutation",
25314
- auth: "admin"
25367
+ auth: "protected"
25315
25368
  }), method(object({
25316
25369
  deviceId: number().int().nonnegative(),
25317
25370
  preset: string().min(1)
25318
25371
  }), _void(), {
25319
25372
  kind: "mutation",
25320
- auth: "admin"
25373
+ auth: "protected"
25321
25374
  }), method(object({
25322
25375
  deviceId: number().int().nonnegative(),
25323
25376
  direction: FanDirectionSchema
25324
25377
  }), _void(), {
25325
25378
  kind: "mutation",
25326
- auth: "admin"
25379
+ auth: "protected"
25327
25380
  }), method(object({
25328
25381
  deviceId: number().int().nonnegative(),
25329
25382
  oscillating: boolean()
25330
25383
  }), _void(), {
25331
25384
  kind: "mutation",
25332
- auth: "admin"
25385
+ auth: "protected"
25333
25386
  });
25334
25387
  /**
25335
25388
  * Per-device feature/identity probe slice. Holds the runtime-resolved
@@ -25440,19 +25493,19 @@ DeviceType.Humidifier, method(object({
25440
25493
  on: boolean()
25441
25494
  }), _void(), {
25442
25495
  kind: "mutation",
25443
- auth: "admin"
25496
+ auth: "protected"
25444
25497
  }), method(object({
25445
25498
  deviceId: number().int().nonnegative(),
25446
25499
  humidity: number().min(0).max(100)
25447
25500
  }), _void(), {
25448
25501
  kind: "mutation",
25449
- auth: "admin"
25502
+ auth: "protected"
25450
25503
  }), method(object({
25451
25504
  deviceId: number().int().nonnegative(),
25452
25505
  mode: string().min(1)
25453
25506
  }), _void(), {
25454
25507
  kind: "mutation",
25455
- auth: "admin"
25508
+ auth: "protected"
25456
25509
  });
25457
25510
  /**
25458
25511
  * Single-metric humidity reading. Drives Home Assistant `sensor`
@@ -25922,13 +25975,13 @@ object({
25922
25975
  });
25923
25976
  DeviceType.LawnMower, method(object({ deviceId: number().int().nonnegative() }), _void(), {
25924
25977
  kind: "mutation",
25925
- auth: "admin"
25978
+ auth: "protected"
25926
25979
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25927
25980
  kind: "mutation",
25928
- auth: "admin"
25981
+ auth: "protected"
25929
25982
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25930
25983
  kind: "mutation",
25931
- auth: "admin"
25984
+ auth: "protected"
25932
25985
  });
25933
25986
  /**
25934
25987
  * local-network — hub-only singleton.
@@ -26188,16 +26241,16 @@ DeviceType.Lock, method(object({
26188
26241
  code: string().min(1).optional()
26189
26242
  }), _void(), {
26190
26243
  kind: "mutation",
26191
- auth: "admin"
26244
+ auth: "protected"
26192
26245
  }), method(object({
26193
26246
  deviceId: number().int().nonnegative(),
26194
26247
  code: string().min(1).optional()
26195
26248
  }), _void(), {
26196
26249
  kind: "mutation",
26197
- auth: "admin"
26250
+ auth: "protected"
26198
26251
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
26199
26252
  kind: "mutation",
26200
- auth: "admin"
26253
+ auth: "protected"
26201
26254
  });
26202
26255
  /**
26203
26256
  * Media-player cap. Models HA `media_player.*` (Sonos, Chromecast,
@@ -26271,55 +26324,55 @@ object({
26271
26324
  });
26272
26325
  DeviceType.MediaPlayer, method(object({ deviceId: number().int().nonnegative() }), _void(), {
26273
26326
  kind: "mutation",
26274
- auth: "admin"
26327
+ auth: "protected"
26275
26328
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
26276
26329
  kind: "mutation",
26277
- auth: "admin"
26330
+ auth: "protected"
26278
26331
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
26279
26332
  kind: "mutation",
26280
- auth: "admin"
26333
+ auth: "protected"
26281
26334
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
26282
26335
  kind: "mutation",
26283
- auth: "admin"
26336
+ auth: "protected"
26284
26337
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
26285
26338
  kind: "mutation",
26286
- auth: "admin"
26339
+ auth: "protected"
26287
26340
  }), method(object({
26288
26341
  deviceId: number().int().nonnegative(),
26289
26342
  positionMs: number().int().nonnegative()
26290
26343
  }), _void(), {
26291
26344
  kind: "mutation",
26292
- auth: "admin"
26345
+ auth: "protected"
26293
26346
  }), method(object({
26294
26347
  deviceId: number().int().nonnegative(),
26295
26348
  volumeLevel: number().min(0).max(100)
26296
26349
  }), _void(), {
26297
26350
  kind: "mutation",
26298
- auth: "admin"
26351
+ auth: "protected"
26299
26352
  }), method(object({
26300
26353
  deviceId: number().int().nonnegative(),
26301
26354
  muted: boolean()
26302
26355
  }), _void(), {
26303
26356
  kind: "mutation",
26304
- auth: "admin"
26357
+ auth: "protected"
26305
26358
  }), method(object({
26306
26359
  deviceId: number().int().nonnegative(),
26307
26360
  shuffle: boolean()
26308
26361
  }), _void(), {
26309
26362
  kind: "mutation",
26310
- auth: "admin"
26363
+ auth: "protected"
26311
26364
  }), method(object({
26312
26365
  deviceId: number().int().nonnegative(),
26313
26366
  repeat: MediaPlayerRepeatSchema
26314
26367
  }), _void(), {
26315
26368
  kind: "mutation",
26316
- auth: "admin"
26369
+ auth: "protected"
26317
26370
  }), method(object({
26318
26371
  deviceId: number().int().nonnegative(),
26319
26372
  source: string().min(1)
26320
26373
  }), _void(), {
26321
26374
  kind: "mutation",
26322
- auth: "admin"
26375
+ auth: "protected"
26323
26376
  }), method(object({
26324
26377
  deviceId: number().int().nonnegative(),
26325
26378
  /** Media identifier / URL. */
@@ -26329,7 +26382,7 @@ DeviceType.MediaPlayer, method(object({ deviceId: number().int().nonnegative() }
26329
26382
  mediaType: string().min(1)
26330
26383
  }), _void(), {
26331
26384
  kind: "mutation",
26332
- auth: "admin"
26385
+ auth: "protected"
26333
26386
  });
26334
26387
  /**
26335
26388
  * mesh-network — collection cap for mesh-VPN providers.
@@ -27507,49 +27560,49 @@ DeviceType.PetFeeder, method(object({
27507
27560
  hopper2: gramsPortion.optional()
27508
27561
  }), _void(), {
27509
27562
  kind: "mutation",
27510
- auth: "admin"
27563
+ auth: "protected"
27511
27564
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
27512
27565
  kind: "mutation",
27513
- auth: "admin"
27566
+ auth: "protected"
27514
27567
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
27515
27568
  kind: "mutation",
27516
- auth: "admin"
27569
+ auth: "protected"
27517
27570
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
27518
27571
  kind: "mutation",
27519
- auth: "admin"
27572
+ auth: "protected"
27520
27573
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
27521
27574
  kind: "mutation",
27522
- auth: "admin"
27575
+ auth: "protected"
27523
27576
  }), method(object({
27524
27577
  deviceId: number().int().nonnegative(),
27525
27578
  soundId: number().int().nonnegative()
27526
27579
  }), _void(), {
27527
27580
  kind: "mutation",
27528
- auth: "admin"
27581
+ auth: "protected"
27529
27582
  }), method(object({
27530
27583
  deviceId: number().int().nonnegative(),
27531
27584
  on: boolean()
27532
27585
  }), _void(), {
27533
27586
  kind: "mutation",
27534
- auth: "admin"
27587
+ auth: "protected"
27535
27588
  }), method(object({
27536
27589
  deviceId: number().int().nonnegative(),
27537
27590
  on: boolean()
27538
27591
  }), _void(), {
27539
27592
  kind: "mutation",
27540
- auth: "admin"
27593
+ auth: "protected"
27541
27594
  }), method(object({
27542
27595
  deviceId: number().int().nonnegative(),
27543
27596
  on: boolean()
27544
27597
  }), _void(), {
27545
27598
  kind: "mutation",
27546
- auth: "admin"
27599
+ auth: "protected"
27547
27600
  }), method(object({
27548
27601
  deviceId: number().int().nonnegative(),
27549
27602
  level: number().int().nonnegative()
27550
27603
  }), _void(), {
27551
27604
  kind: "mutation",
27552
- auth: "admin"
27605
+ auth: "protected"
27553
27606
  });
27554
27607
  var VehicleSchema = object({
27555
27608
  id: string(),
@@ -29345,7 +29398,7 @@ DeviceType.Switch, DeviceType.Siren, DeviceType.Light, method(object({
29345
29398
  on: boolean()
29346
29399
  }), _void(), {
29347
29400
  kind: "mutation",
29348
- auth: "admin"
29401
+ auth: "protected"
29349
29402
  }), object({
29350
29403
  deviceId: number(),
29351
29404
  on: boolean(),
@@ -30218,25 +30271,25 @@ object({
30218
30271
  });
30219
30272
  DeviceType.Vacuum, method(object({ deviceId: number().int().nonnegative() }), _void(), {
30220
30273
  kind: "mutation",
30221
- auth: "admin"
30274
+ auth: "protected"
30222
30275
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
30223
30276
  kind: "mutation",
30224
- auth: "admin"
30277
+ auth: "protected"
30225
30278
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
30226
30279
  kind: "mutation",
30227
- auth: "admin"
30280
+ auth: "protected"
30228
30281
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
30229
30282
  kind: "mutation",
30230
- auth: "admin"
30283
+ auth: "protected"
30231
30284
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
30232
30285
  kind: "mutation",
30233
- auth: "admin"
30286
+ auth: "protected"
30234
30287
  }), method(object({
30235
30288
  deviceId: number().int().nonnegative(),
30236
30289
  speed: string().min(1)
30237
30290
  }), _void(), {
30238
30291
  kind: "mutation",
30239
- auth: "admin"
30292
+ auth: "protected"
30240
30293
  });
30241
30294
  object({
30242
30295
  /** Lifecycle state of the valve. */
@@ -30255,19 +30308,19 @@ object({
30255
30308
  });
30256
30309
  DeviceType.Valve, method(object({ deviceId: number().int().nonnegative() }), _void(), {
30257
30310
  kind: "mutation",
30258
- auth: "admin"
30311
+ auth: "protected"
30259
30312
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
30260
30313
  kind: "mutation",
30261
- auth: "admin"
30314
+ auth: "protected"
30262
30315
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
30263
30316
  kind: "mutation",
30264
- auth: "admin"
30317
+ auth: "protected"
30265
30318
  }), method(object({
30266
30319
  deviceId: number().int().nonnegative(),
30267
30320
  position: number().min(0).max(100)
30268
30321
  }), _void(), {
30269
30322
  kind: "mutation",
30270
- auth: "admin"
30323
+ auth: "protected"
30271
30324
  });
30272
30325
  object({
30273
30326
  detected: boolean(),
@@ -30301,19 +30354,19 @@ DeviceType.WaterHeater, method(object({
30301
30354
  temp: number().finite()
30302
30355
  }), _void(), {
30303
30356
  kind: "mutation",
30304
- auth: "admin"
30357
+ auth: "protected"
30305
30358
  }), method(object({
30306
30359
  deviceId: number().int().nonnegative(),
30307
30360
  mode: string().min(1)
30308
30361
  }), _void(), {
30309
30362
  kind: "mutation",
30310
- auth: "admin"
30363
+ auth: "protected"
30311
30364
  }), method(object({
30312
30365
  deviceId: number().int().nonnegative(),
30313
30366
  on: boolean()
30314
30367
  }), _void(), {
30315
30368
  kind: "mutation",
30316
- auth: "admin"
30369
+ auth: "protected"
30317
30370
  });
30318
30371
  object({
30319
30372
  /** Verbatim HA condition state (`sunny`, `cloudy`, `rainy`, …). Null
@@ -32405,6 +32458,12 @@ Object.freeze({
32405
32458
  addonId: null,
32406
32459
  access: "create"
32407
32460
  },
32461
+ "faceGallery.auditIdentitySamples": {
32462
+ capName: "face-gallery",
32463
+ capScope: "system",
32464
+ addonId: null,
32465
+ access: "view"
32466
+ },
32408
32467
  "faceGallery.createIdentity": {
32409
32468
  capName: "face-gallery",
32410
32469
  capScope: "system",
@@ -16600,16 +16600,16 @@ DeviceType.AlarmPanel, method(object({
16600
16600
  code: string().min(1).optional()
16601
16601
  }), _void(), {
16602
16602
  kind: "mutation",
16603
- auth: "admin"
16603
+ auth: "protected"
16604
16604
  }), method(object({
16605
16605
  deviceId: number().int().nonnegative(),
16606
16606
  code: string().min(1).optional()
16607
16607
  }), _void(), {
16608
16608
  kind: "mutation",
16609
- auth: "admin"
16609
+ auth: "protected"
16610
16610
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
16611
16611
  kind: "mutation",
16612
- auth: "admin"
16612
+ auth: "protected"
16613
16613
  });
16614
16614
  /**
16615
16615
  * Shared geometry vocabulary for on-frame shape caps — privacy-mask,
@@ -24268,7 +24268,7 @@ DeviceType.Light, method(object({
24268
24268
  percentage: number().min(0).max(100)
24269
24269
  }), _void(), {
24270
24270
  kind: "mutation",
24271
- auth: "admin"
24271
+ auth: "protected"
24272
24272
  }), object({
24273
24273
  deviceId: number(),
24274
24274
  percentage: number().min(0).max(100),
@@ -24276,7 +24276,7 @@ DeviceType.Light, method(object({
24276
24276
  });
24277
24277
  DeviceType.Button, method(object({ deviceId: number().int().nonnegative() }), _void(), {
24278
24278
  kind: "mutation",
24279
- auth: "admin"
24279
+ auth: "protected"
24280
24280
  });
24281
24281
  /**
24282
24282
  * camera-credentials — device-scoped cap exposing the camera's network
@@ -24439,50 +24439,50 @@ DeviceType.Thermostat, DeviceType.Climate, method(object({
24439
24439
  mode: HvacModeSchema
24440
24440
  }), _void(), {
24441
24441
  kind: "mutation",
24442
- auth: "admin"
24442
+ auth: "protected"
24443
24443
  }), method(object({
24444
24444
  deviceId: number().int().nonnegative(),
24445
24445
  fanMode: string().min(1)
24446
24446
  }), _void(), {
24447
24447
  kind: "mutation",
24448
- auth: "admin"
24448
+ auth: "protected"
24449
24449
  }), method(object({
24450
24450
  deviceId: number().int().nonnegative(),
24451
24451
  preset: string().min(1)
24452
24452
  }), _void(), {
24453
24453
  kind: "mutation",
24454
- auth: "admin"
24454
+ auth: "protected"
24455
24455
  }), method(object({
24456
24456
  deviceId: number().int().nonnegative(),
24457
24457
  target: number()
24458
24458
  }), _void(), {
24459
24459
  kind: "mutation",
24460
- auth: "admin"
24460
+ auth: "protected"
24461
24461
  }), method(object({
24462
24462
  deviceId: number().int().nonnegative(),
24463
24463
  targetLow: number(),
24464
24464
  targetHigh: number()
24465
24465
  }), _void(), {
24466
24466
  kind: "mutation",
24467
- auth: "admin"
24467
+ auth: "protected"
24468
24468
  }), method(object({
24469
24469
  deviceId: number().int().nonnegative(),
24470
24470
  targetHumidity: number().min(0).max(100)
24471
24471
  }), _void(), {
24472
24472
  kind: "mutation",
24473
- auth: "admin"
24473
+ auth: "protected"
24474
24474
  }), method(object({
24475
24475
  deviceId: number().int().nonnegative(),
24476
24476
  on: boolean()
24477
24477
  }), _void(), {
24478
24478
  kind: "mutation",
24479
- auth: "admin"
24479
+ auth: "protected"
24480
24480
  }), method(object({
24481
24481
  deviceId: number().int().nonnegative(),
24482
24482
  on: boolean()
24483
24483
  }), _void(), {
24484
24484
  kind: "mutation",
24485
- auth: "admin"
24485
+ auth: "protected"
24486
24486
  });
24487
24487
  /**
24488
24488
  * Color-light cap. Coexists with `switch` (on/off) and `brightness`
@@ -24557,7 +24557,7 @@ DeviceType.Light, method(object({
24557
24557
  color: ColorInputSchema
24558
24558
  }), _void(), {
24559
24559
  kind: "mutation",
24560
- auth: "admin"
24560
+ auth: "protected"
24561
24561
  }), object({
24562
24562
  deviceId: number(),
24563
24563
  mode: _enum([
@@ -24718,7 +24718,7 @@ DeviceType.Control, method(object({
24718
24718
  control: ControlSetValueInputSchema
24719
24719
  }), _void(), {
24720
24720
  kind: "mutation",
24721
- auth: "admin"
24721
+ auth: "protected"
24722
24722
  });
24723
24723
  object({
24724
24724
  /** Lifecycle state of the cover. */
@@ -24739,25 +24739,25 @@ object({
24739
24739
  });
24740
24740
  DeviceType.Cover, method(object({ deviceId: number().int().nonnegative() }), _void(), {
24741
24741
  kind: "mutation",
24742
- auth: "admin"
24742
+ auth: "protected"
24743
24743
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
24744
24744
  kind: "mutation",
24745
- auth: "admin"
24745
+ auth: "protected"
24746
24746
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
24747
24747
  kind: "mutation",
24748
- auth: "admin"
24748
+ auth: "protected"
24749
24749
  }), method(object({
24750
24750
  deviceId: number().int().nonnegative(),
24751
24751
  position: number().min(0).max(100)
24752
24752
  }), _void(), {
24753
24753
  kind: "mutation",
24754
- auth: "admin"
24754
+ auth: "protected"
24755
24755
  }), method(object({
24756
24756
  deviceId: number().int().nonnegative(),
24757
24757
  tiltPosition: number().min(0).max(100)
24758
24758
  }), _void(), {
24759
24759
  kind: "mutation",
24760
- auth: "admin"
24760
+ auth: "protected"
24761
24761
  });
24762
24762
  /**
24763
24763
  * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
@@ -24962,6 +24962,59 @@ var IdentitySampleInfoSchema = object({
24962
24962
  deviceId: number().int().optional(),
24963
24963
  base64: string().optional()
24964
24964
  });
24965
+ /**
24966
+ * One enrolled sample, judged against the gallery it lives in.
24967
+ *
24968
+ * The gallery is the one input to recognition nobody re-reads: a sample
24969
+ * enrolled from the wrong face keeps voting forever, and because the matches it
24970
+ * pulls then look confident, nobody goes back. The 2026-09-08 audit found
24971
+ * exactly one such pair on this cluster — a sample scoring 0.61 against three
24972
+ * samples of ANOTHER person, enrolled from the same camera in the same minute,
24973
+ * where every other cross-identity pair sits under 0.50.
24974
+ */
24975
+ var IdentitySampleAuditRowSchema = object({
24976
+ sampleId: string(),
24977
+ enrolledAt: number().int(),
24978
+ deviceId: number().int().optional(),
24979
+ source: _enum(["detected", "photo"]),
24980
+ /** The enrolled crop's media key, so the panel can show the evidence. */
24981
+ mediaKey: string().optional(),
24982
+ /**
24983
+ * False = the sample is stamped with a DIFFERENT face model, and a cosine
24984
+ * across feature spaces is a well-formed float with no meaning. Every number
24985
+ * below then says nothing — it must read as "cannot say", never as an
24986
+ * accusation and never as a clean bill: this list ends in a Remove button.
24987
+ */
24988
+ comparable: boolean(),
24989
+ /** Mean cosine against this person's other samples. Null when there are none
24990
+ * to compare with — never 0, which would read as "opposite". */
24991
+ selfMean: number().nullable(),
24992
+ /** The other person this sample looks most like, when it looks like one.
24993
+ * This is the half that convicts: not looking like yourself can be a hard
24994
+ * angle; looking like someone the gallery can NAME is a mis-enrolment. */
24995
+ bestForeign: object({
24996
+ identityId: string(),
24997
+ name: string(),
24998
+ score: number()
24999
+ }).optional(),
25000
+ /** 0 = nothing to say. Higher = look at this one sooner. */
25001
+ suspicion: number()
25002
+ });
25003
+ var IdentitySampleAuditSchema = object({
25004
+ identityId: string(),
25005
+ name: string(),
25006
+ /** The cluster face model every comparison was made in. */
25007
+ modelId: string(),
25008
+ totalSamples: number().int(),
25009
+ comparableSamples: number().int(),
25010
+ flagged: number().int(),
25011
+ /** The bar `flagged` counts against, so the panel states the RULE and not
25012
+ * only its current result. */
25013
+ flagThreshold: number(),
25014
+ /** Worst first. A row with nothing to say still appears, at the bottom: the
25015
+ * operator asked to see the gallery, not only its accusations. */
25016
+ rows: array(IdentitySampleAuditRowSchema).readonly()
25017
+ });
24965
25018
  var FaceInfoSchema = object({
24966
25019
  faceId: string(),
24967
25020
  deviceId: number().int(),
@@ -25113,7 +25166,7 @@ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly
25113
25166
  }), method(object({ id: string() }), _void(), {
25114
25167
  kind: "mutation",
25115
25168
  auth: "admin"
25116
- }), method(object({ identityId: string() }), array(IdentitySampleInfoSchema).readonly()), method(object({
25169
+ }), method(object({ identityId: string() }), array(IdentitySampleInfoSchema).readonly()), method(object({ identityId: string().min(1) }), IdentitySampleAuditSchema, { auth: "admin" }), method(object({
25117
25170
  identityId: string(),
25118
25171
  sampleId: string()
25119
25172
  }), _void(), {
@@ -25299,25 +25352,25 @@ DeviceType.Fan, method(object({
25299
25352
  percentage: number().min(0).max(100)
25300
25353
  }), _void(), {
25301
25354
  kind: "mutation",
25302
- auth: "admin"
25355
+ auth: "protected"
25303
25356
  }), method(object({
25304
25357
  deviceId: number().int().nonnegative(),
25305
25358
  preset: string().min(1)
25306
25359
  }), _void(), {
25307
25360
  kind: "mutation",
25308
- auth: "admin"
25361
+ auth: "protected"
25309
25362
  }), method(object({
25310
25363
  deviceId: number().int().nonnegative(),
25311
25364
  direction: FanDirectionSchema
25312
25365
  }), _void(), {
25313
25366
  kind: "mutation",
25314
- auth: "admin"
25367
+ auth: "protected"
25315
25368
  }), method(object({
25316
25369
  deviceId: number().int().nonnegative(),
25317
25370
  oscillating: boolean()
25318
25371
  }), _void(), {
25319
25372
  kind: "mutation",
25320
- auth: "admin"
25373
+ auth: "protected"
25321
25374
  });
25322
25375
  /**
25323
25376
  * Per-device feature/identity probe slice. Holds the runtime-resolved
@@ -25428,19 +25481,19 @@ DeviceType.Humidifier, method(object({
25428
25481
  on: boolean()
25429
25482
  }), _void(), {
25430
25483
  kind: "mutation",
25431
- auth: "admin"
25484
+ auth: "protected"
25432
25485
  }), method(object({
25433
25486
  deviceId: number().int().nonnegative(),
25434
25487
  humidity: number().min(0).max(100)
25435
25488
  }), _void(), {
25436
25489
  kind: "mutation",
25437
- auth: "admin"
25490
+ auth: "protected"
25438
25491
  }), method(object({
25439
25492
  deviceId: number().int().nonnegative(),
25440
25493
  mode: string().min(1)
25441
25494
  }), _void(), {
25442
25495
  kind: "mutation",
25443
- auth: "admin"
25496
+ auth: "protected"
25444
25497
  });
25445
25498
  /**
25446
25499
  * Single-metric humidity reading. Drives Home Assistant `sensor`
@@ -25910,13 +25963,13 @@ object({
25910
25963
  });
25911
25964
  DeviceType.LawnMower, method(object({ deviceId: number().int().nonnegative() }), _void(), {
25912
25965
  kind: "mutation",
25913
- auth: "admin"
25966
+ auth: "protected"
25914
25967
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25915
25968
  kind: "mutation",
25916
- auth: "admin"
25969
+ auth: "protected"
25917
25970
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25918
25971
  kind: "mutation",
25919
- auth: "admin"
25972
+ auth: "protected"
25920
25973
  });
25921
25974
  /**
25922
25975
  * local-network — hub-only singleton.
@@ -26176,16 +26229,16 @@ DeviceType.Lock, method(object({
26176
26229
  code: string().min(1).optional()
26177
26230
  }), _void(), {
26178
26231
  kind: "mutation",
26179
- auth: "admin"
26232
+ auth: "protected"
26180
26233
  }), method(object({
26181
26234
  deviceId: number().int().nonnegative(),
26182
26235
  code: string().min(1).optional()
26183
26236
  }), _void(), {
26184
26237
  kind: "mutation",
26185
- auth: "admin"
26238
+ auth: "protected"
26186
26239
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
26187
26240
  kind: "mutation",
26188
- auth: "admin"
26241
+ auth: "protected"
26189
26242
  });
26190
26243
  /**
26191
26244
  * Media-player cap. Models HA `media_player.*` (Sonos, Chromecast,
@@ -26259,55 +26312,55 @@ object({
26259
26312
  });
26260
26313
  DeviceType.MediaPlayer, method(object({ deviceId: number().int().nonnegative() }), _void(), {
26261
26314
  kind: "mutation",
26262
- auth: "admin"
26315
+ auth: "protected"
26263
26316
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
26264
26317
  kind: "mutation",
26265
- auth: "admin"
26318
+ auth: "protected"
26266
26319
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
26267
26320
  kind: "mutation",
26268
- auth: "admin"
26321
+ auth: "protected"
26269
26322
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
26270
26323
  kind: "mutation",
26271
- auth: "admin"
26324
+ auth: "protected"
26272
26325
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
26273
26326
  kind: "mutation",
26274
- auth: "admin"
26327
+ auth: "protected"
26275
26328
  }), method(object({
26276
26329
  deviceId: number().int().nonnegative(),
26277
26330
  positionMs: number().int().nonnegative()
26278
26331
  }), _void(), {
26279
26332
  kind: "mutation",
26280
- auth: "admin"
26333
+ auth: "protected"
26281
26334
  }), method(object({
26282
26335
  deviceId: number().int().nonnegative(),
26283
26336
  volumeLevel: number().min(0).max(100)
26284
26337
  }), _void(), {
26285
26338
  kind: "mutation",
26286
- auth: "admin"
26339
+ auth: "protected"
26287
26340
  }), method(object({
26288
26341
  deviceId: number().int().nonnegative(),
26289
26342
  muted: boolean()
26290
26343
  }), _void(), {
26291
26344
  kind: "mutation",
26292
- auth: "admin"
26345
+ auth: "protected"
26293
26346
  }), method(object({
26294
26347
  deviceId: number().int().nonnegative(),
26295
26348
  shuffle: boolean()
26296
26349
  }), _void(), {
26297
26350
  kind: "mutation",
26298
- auth: "admin"
26351
+ auth: "protected"
26299
26352
  }), method(object({
26300
26353
  deviceId: number().int().nonnegative(),
26301
26354
  repeat: MediaPlayerRepeatSchema
26302
26355
  }), _void(), {
26303
26356
  kind: "mutation",
26304
- auth: "admin"
26357
+ auth: "protected"
26305
26358
  }), method(object({
26306
26359
  deviceId: number().int().nonnegative(),
26307
26360
  source: string().min(1)
26308
26361
  }), _void(), {
26309
26362
  kind: "mutation",
26310
- auth: "admin"
26363
+ auth: "protected"
26311
26364
  }), method(object({
26312
26365
  deviceId: number().int().nonnegative(),
26313
26366
  /** Media identifier / URL. */
@@ -26317,7 +26370,7 @@ DeviceType.MediaPlayer, method(object({ deviceId: number().int().nonnegative() }
26317
26370
  mediaType: string().min(1)
26318
26371
  }), _void(), {
26319
26372
  kind: "mutation",
26320
- auth: "admin"
26373
+ auth: "protected"
26321
26374
  });
26322
26375
  /**
26323
26376
  * mesh-network — collection cap for mesh-VPN providers.
@@ -27495,49 +27548,49 @@ DeviceType.PetFeeder, method(object({
27495
27548
  hopper2: gramsPortion.optional()
27496
27549
  }), _void(), {
27497
27550
  kind: "mutation",
27498
- auth: "admin"
27551
+ auth: "protected"
27499
27552
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
27500
27553
  kind: "mutation",
27501
- auth: "admin"
27554
+ auth: "protected"
27502
27555
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
27503
27556
  kind: "mutation",
27504
- auth: "admin"
27557
+ auth: "protected"
27505
27558
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
27506
27559
  kind: "mutation",
27507
- auth: "admin"
27560
+ auth: "protected"
27508
27561
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
27509
27562
  kind: "mutation",
27510
- auth: "admin"
27563
+ auth: "protected"
27511
27564
  }), method(object({
27512
27565
  deviceId: number().int().nonnegative(),
27513
27566
  soundId: number().int().nonnegative()
27514
27567
  }), _void(), {
27515
27568
  kind: "mutation",
27516
- auth: "admin"
27569
+ auth: "protected"
27517
27570
  }), method(object({
27518
27571
  deviceId: number().int().nonnegative(),
27519
27572
  on: boolean()
27520
27573
  }), _void(), {
27521
27574
  kind: "mutation",
27522
- auth: "admin"
27575
+ auth: "protected"
27523
27576
  }), method(object({
27524
27577
  deviceId: number().int().nonnegative(),
27525
27578
  on: boolean()
27526
27579
  }), _void(), {
27527
27580
  kind: "mutation",
27528
- auth: "admin"
27581
+ auth: "protected"
27529
27582
  }), method(object({
27530
27583
  deviceId: number().int().nonnegative(),
27531
27584
  on: boolean()
27532
27585
  }), _void(), {
27533
27586
  kind: "mutation",
27534
- auth: "admin"
27587
+ auth: "protected"
27535
27588
  }), method(object({
27536
27589
  deviceId: number().int().nonnegative(),
27537
27590
  level: number().int().nonnegative()
27538
27591
  }), _void(), {
27539
27592
  kind: "mutation",
27540
- auth: "admin"
27593
+ auth: "protected"
27541
27594
  });
27542
27595
  var VehicleSchema = object({
27543
27596
  id: string(),
@@ -29333,7 +29386,7 @@ DeviceType.Switch, DeviceType.Siren, DeviceType.Light, method(object({
29333
29386
  on: boolean()
29334
29387
  }), _void(), {
29335
29388
  kind: "mutation",
29336
- auth: "admin"
29389
+ auth: "protected"
29337
29390
  }), object({
29338
29391
  deviceId: number(),
29339
29392
  on: boolean(),
@@ -30206,25 +30259,25 @@ object({
30206
30259
  });
30207
30260
  DeviceType.Vacuum, method(object({ deviceId: number().int().nonnegative() }), _void(), {
30208
30261
  kind: "mutation",
30209
- auth: "admin"
30262
+ auth: "protected"
30210
30263
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
30211
30264
  kind: "mutation",
30212
- auth: "admin"
30265
+ auth: "protected"
30213
30266
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
30214
30267
  kind: "mutation",
30215
- auth: "admin"
30268
+ auth: "protected"
30216
30269
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
30217
30270
  kind: "mutation",
30218
- auth: "admin"
30271
+ auth: "protected"
30219
30272
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
30220
30273
  kind: "mutation",
30221
- auth: "admin"
30274
+ auth: "protected"
30222
30275
  }), method(object({
30223
30276
  deviceId: number().int().nonnegative(),
30224
30277
  speed: string().min(1)
30225
30278
  }), _void(), {
30226
30279
  kind: "mutation",
30227
- auth: "admin"
30280
+ auth: "protected"
30228
30281
  });
30229
30282
  object({
30230
30283
  /** Lifecycle state of the valve. */
@@ -30243,19 +30296,19 @@ object({
30243
30296
  });
30244
30297
  DeviceType.Valve, method(object({ deviceId: number().int().nonnegative() }), _void(), {
30245
30298
  kind: "mutation",
30246
- auth: "admin"
30299
+ auth: "protected"
30247
30300
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
30248
30301
  kind: "mutation",
30249
- auth: "admin"
30302
+ auth: "protected"
30250
30303
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
30251
30304
  kind: "mutation",
30252
- auth: "admin"
30305
+ auth: "protected"
30253
30306
  }), method(object({
30254
30307
  deviceId: number().int().nonnegative(),
30255
30308
  position: number().min(0).max(100)
30256
30309
  }), _void(), {
30257
30310
  kind: "mutation",
30258
- auth: "admin"
30311
+ auth: "protected"
30259
30312
  });
30260
30313
  object({
30261
30314
  detected: boolean(),
@@ -30289,19 +30342,19 @@ DeviceType.WaterHeater, method(object({
30289
30342
  temp: number().finite()
30290
30343
  }), _void(), {
30291
30344
  kind: "mutation",
30292
- auth: "admin"
30345
+ auth: "protected"
30293
30346
  }), method(object({
30294
30347
  deviceId: number().int().nonnegative(),
30295
30348
  mode: string().min(1)
30296
30349
  }), _void(), {
30297
30350
  kind: "mutation",
30298
- auth: "admin"
30351
+ auth: "protected"
30299
30352
  }), method(object({
30300
30353
  deviceId: number().int().nonnegative(),
30301
30354
  on: boolean()
30302
30355
  }), _void(), {
30303
30356
  kind: "mutation",
30304
- auth: "admin"
30357
+ auth: "protected"
30305
30358
  });
30306
30359
  object({
30307
30360
  /** Verbatim HA condition state (`sunny`, `cloudy`, `rainy`, …). Null
@@ -32393,6 +32446,12 @@ Object.freeze({
32393
32446
  addonId: null,
32394
32447
  access: "create"
32395
32448
  },
32449
+ "faceGallery.auditIdentitySamples": {
32450
+ capName: "face-gallery",
32451
+ capScope: "system",
32452
+ addonId: null,
32453
+ access: "view"
32454
+ },
32396
32455
  "faceGallery.createIdentity": {
32397
32456
  capName: "face-gallery",
32398
32457
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-export-hap",
3
- "version": "1.2.95",
3
+ "version": "1.2.97",
4
4
  "description": "HomeKit (HAP) exporter for CamStack devices. Publishes each exposed device as its own HomeKit accessory: cameras and doorbells with SRTP streaming, HomeKit Secure Video, motion, two-way audio, PTZ and battery; switches, lights, locks and sensors through a capability→service table.",
5
5
  "keywords": [
6
6
  "camstack",