@camstack/addon-notifiers 1.2.88 → 1.2.90

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.
Files changed (3) hide show
  1. package/dist/addon.js +129 -70
  2. package/dist/addon.mjs +129 -70
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -15999,16 +15999,16 @@ DeviceType.AlarmPanel, method(object({
15999
15999
  code: string().min(1).optional()
16000
16000
  }), _void(), {
16001
16001
  kind: "mutation",
16002
- auth: "admin"
16002
+ auth: "protected"
16003
16003
  }), method(object({
16004
16004
  deviceId: number().int().nonnegative(),
16005
16005
  code: string().min(1).optional()
16006
16006
  }), _void(), {
16007
16007
  kind: "mutation",
16008
- auth: "admin"
16008
+ auth: "protected"
16009
16009
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
16010
16010
  kind: "mutation",
16011
- auth: "admin"
16011
+ auth: "protected"
16012
16012
  });
16013
16013
  /**
16014
16014
  * Shared geometry vocabulary for on-frame shape caps — privacy-mask,
@@ -23663,7 +23663,7 @@ DeviceType.Light, method(object({
23663
23663
  percentage: number().min(0).max(100)
23664
23664
  }), _void(), {
23665
23665
  kind: "mutation",
23666
- auth: "admin"
23666
+ auth: "protected"
23667
23667
  }), object({
23668
23668
  deviceId: number(),
23669
23669
  percentage: number().min(0).max(100),
@@ -23671,7 +23671,7 @@ DeviceType.Light, method(object({
23671
23671
  });
23672
23672
  DeviceType.Button, method(object({ deviceId: number().int().nonnegative() }), _void(), {
23673
23673
  kind: "mutation",
23674
- auth: "admin"
23674
+ auth: "protected"
23675
23675
  });
23676
23676
  /**
23677
23677
  * camera-credentials — device-scoped cap exposing the camera's network
@@ -23830,50 +23830,50 @@ DeviceType.Thermostat, DeviceType.Climate, method(object({
23830
23830
  mode: HvacModeSchema
23831
23831
  }), _void(), {
23832
23832
  kind: "mutation",
23833
- auth: "admin"
23833
+ auth: "protected"
23834
23834
  }), method(object({
23835
23835
  deviceId: number().int().nonnegative(),
23836
23836
  fanMode: string().min(1)
23837
23837
  }), _void(), {
23838
23838
  kind: "mutation",
23839
- auth: "admin"
23839
+ auth: "protected"
23840
23840
  }), method(object({
23841
23841
  deviceId: number().int().nonnegative(),
23842
23842
  preset: string().min(1)
23843
23843
  }), _void(), {
23844
23844
  kind: "mutation",
23845
- auth: "admin"
23845
+ auth: "protected"
23846
23846
  }), method(object({
23847
23847
  deviceId: number().int().nonnegative(),
23848
23848
  target: number()
23849
23849
  }), _void(), {
23850
23850
  kind: "mutation",
23851
- auth: "admin"
23851
+ auth: "protected"
23852
23852
  }), method(object({
23853
23853
  deviceId: number().int().nonnegative(),
23854
23854
  targetLow: number(),
23855
23855
  targetHigh: number()
23856
23856
  }), _void(), {
23857
23857
  kind: "mutation",
23858
- auth: "admin"
23858
+ auth: "protected"
23859
23859
  }), method(object({
23860
23860
  deviceId: number().int().nonnegative(),
23861
23861
  targetHumidity: number().min(0).max(100)
23862
23862
  }), _void(), {
23863
23863
  kind: "mutation",
23864
- auth: "admin"
23864
+ auth: "protected"
23865
23865
  }), method(object({
23866
23866
  deviceId: number().int().nonnegative(),
23867
23867
  on: boolean()
23868
23868
  }), _void(), {
23869
23869
  kind: "mutation",
23870
- auth: "admin"
23870
+ auth: "protected"
23871
23871
  }), method(object({
23872
23872
  deviceId: number().int().nonnegative(),
23873
23873
  on: boolean()
23874
23874
  }), _void(), {
23875
23875
  kind: "mutation",
23876
- auth: "admin"
23876
+ auth: "protected"
23877
23877
  });
23878
23878
  /**
23879
23879
  * Color-light cap. Coexists with `switch` (on/off) and `brightness`
@@ -23948,7 +23948,7 @@ DeviceType.Light, method(object({
23948
23948
  color: ColorInputSchema
23949
23949
  }), _void(), {
23950
23950
  kind: "mutation",
23951
- auth: "admin"
23951
+ auth: "protected"
23952
23952
  }), object({
23953
23953
  deviceId: number(),
23954
23954
  mode: _enum([
@@ -24097,7 +24097,7 @@ DeviceType.Control, method(object({
24097
24097
  control: ControlSetValueInputSchema
24098
24098
  }), _void(), {
24099
24099
  kind: "mutation",
24100
- auth: "admin"
24100
+ auth: "protected"
24101
24101
  });
24102
24102
  object({
24103
24103
  /** Lifecycle state of the cover. */
@@ -24118,25 +24118,25 @@ object({
24118
24118
  });
24119
24119
  DeviceType.Cover, method(object({ deviceId: number().int().nonnegative() }), _void(), {
24120
24120
  kind: "mutation",
24121
- auth: "admin"
24121
+ auth: "protected"
24122
24122
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
24123
24123
  kind: "mutation",
24124
- auth: "admin"
24124
+ auth: "protected"
24125
24125
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
24126
24126
  kind: "mutation",
24127
- auth: "admin"
24127
+ auth: "protected"
24128
24128
  }), method(object({
24129
24129
  deviceId: number().int().nonnegative(),
24130
24130
  position: number().min(0).max(100)
24131
24131
  }), _void(), {
24132
24132
  kind: "mutation",
24133
- auth: "admin"
24133
+ auth: "protected"
24134
24134
  }), method(object({
24135
24135
  deviceId: number().int().nonnegative(),
24136
24136
  tiltPosition: number().min(0).max(100)
24137
24137
  }), _void(), {
24138
24138
  kind: "mutation",
24139
- auth: "admin"
24139
+ auth: "protected"
24140
24140
  });
24141
24141
  /**
24142
24142
  * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
@@ -24341,6 +24341,59 @@ var IdentitySampleInfoSchema = object({
24341
24341
  deviceId: number().int().optional(),
24342
24342
  base64: string().optional()
24343
24343
  });
24344
+ /**
24345
+ * One enrolled sample, judged against the gallery it lives in.
24346
+ *
24347
+ * The gallery is the one input to recognition nobody re-reads: a sample
24348
+ * enrolled from the wrong face keeps voting forever, and because the matches it
24349
+ * pulls then look confident, nobody goes back. The 2026-09-08 audit found
24350
+ * exactly one such pair on this cluster — a sample scoring 0.61 against three
24351
+ * samples of ANOTHER person, enrolled from the same camera in the same minute,
24352
+ * where every other cross-identity pair sits under 0.50.
24353
+ */
24354
+ var IdentitySampleAuditRowSchema = object({
24355
+ sampleId: string(),
24356
+ enrolledAt: number().int(),
24357
+ deviceId: number().int().optional(),
24358
+ source: _enum(["detected", "photo"]),
24359
+ /** The enrolled crop's media key, so the panel can show the evidence. */
24360
+ mediaKey: string().optional(),
24361
+ /**
24362
+ * False = the sample is stamped with a DIFFERENT face model, and a cosine
24363
+ * across feature spaces is a well-formed float with no meaning. Every number
24364
+ * below then says nothing — it must read as "cannot say", never as an
24365
+ * accusation and never as a clean bill: this list ends in a Remove button.
24366
+ */
24367
+ comparable: boolean(),
24368
+ /** Mean cosine against this person's other samples. Null when there are none
24369
+ * to compare with — never 0, which would read as "opposite". */
24370
+ selfMean: number().nullable(),
24371
+ /** The other person this sample looks most like, when it looks like one.
24372
+ * This is the half that convicts: not looking like yourself can be a hard
24373
+ * angle; looking like someone the gallery can NAME is a mis-enrolment. */
24374
+ bestForeign: object({
24375
+ identityId: string(),
24376
+ name: string(),
24377
+ score: number()
24378
+ }).optional(),
24379
+ /** 0 = nothing to say. Higher = look at this one sooner. */
24380
+ suspicion: number()
24381
+ });
24382
+ var IdentitySampleAuditSchema = object({
24383
+ identityId: string(),
24384
+ name: string(),
24385
+ /** The cluster face model every comparison was made in. */
24386
+ modelId: string(),
24387
+ totalSamples: number().int(),
24388
+ comparableSamples: number().int(),
24389
+ flagged: number().int(),
24390
+ /** The bar `flagged` counts against, so the panel states the RULE and not
24391
+ * only its current result. */
24392
+ flagThreshold: number(),
24393
+ /** Worst first. A row with nothing to say still appears, at the bottom: the
24394
+ * operator asked to see the gallery, not only its accusations. */
24395
+ rows: array(IdentitySampleAuditRowSchema).readonly()
24396
+ });
24344
24397
  var FaceInfoSchema = object({
24345
24398
  faceId: string(),
24346
24399
  deviceId: number().int(),
@@ -24492,7 +24545,7 @@ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly
24492
24545
  }), method(object({ id: string() }), _void(), {
24493
24546
  kind: "mutation",
24494
24547
  auth: "admin"
24495
- }), method(object({ identityId: string() }), array(IdentitySampleInfoSchema).readonly()), method(object({
24548
+ }), method(object({ identityId: string() }), array(IdentitySampleInfoSchema).readonly()), method(object({ identityId: string().min(1) }), IdentitySampleAuditSchema, { auth: "admin" }), method(object({
24496
24549
  identityId: string(),
24497
24550
  sampleId: string()
24498
24551
  }), _void(), {
@@ -24678,25 +24731,25 @@ DeviceType.Fan, method(object({
24678
24731
  percentage: number().min(0).max(100)
24679
24732
  }), _void(), {
24680
24733
  kind: "mutation",
24681
- auth: "admin"
24734
+ auth: "protected"
24682
24735
  }), method(object({
24683
24736
  deviceId: number().int().nonnegative(),
24684
24737
  preset: string().min(1)
24685
24738
  }), _void(), {
24686
24739
  kind: "mutation",
24687
- auth: "admin"
24740
+ auth: "protected"
24688
24741
  }), method(object({
24689
24742
  deviceId: number().int().nonnegative(),
24690
24743
  direction: FanDirectionSchema
24691
24744
  }), _void(), {
24692
24745
  kind: "mutation",
24693
- auth: "admin"
24746
+ auth: "protected"
24694
24747
  }), method(object({
24695
24748
  deviceId: number().int().nonnegative(),
24696
24749
  oscillating: boolean()
24697
24750
  }), _void(), {
24698
24751
  kind: "mutation",
24699
- auth: "admin"
24752
+ auth: "protected"
24700
24753
  });
24701
24754
  /**
24702
24755
  * Per-device feature/identity probe slice. Holds the runtime-resolved
@@ -24799,19 +24852,19 @@ DeviceType.Humidifier, method(object({
24799
24852
  on: boolean()
24800
24853
  }), _void(), {
24801
24854
  kind: "mutation",
24802
- auth: "admin"
24855
+ auth: "protected"
24803
24856
  }), method(object({
24804
24857
  deviceId: number().int().nonnegative(),
24805
24858
  humidity: number().min(0).max(100)
24806
24859
  }), _void(), {
24807
24860
  kind: "mutation",
24808
- auth: "admin"
24861
+ auth: "protected"
24809
24862
  }), method(object({
24810
24863
  deviceId: number().int().nonnegative(),
24811
24864
  mode: string().min(1)
24812
24865
  }), _void(), {
24813
24866
  kind: "mutation",
24814
- auth: "admin"
24867
+ auth: "protected"
24815
24868
  });
24816
24869
  object({
24817
24870
  /** Current relative humidity, 0..100. */
@@ -25273,13 +25326,13 @@ object({
25273
25326
  });
25274
25327
  DeviceType.LawnMower, method(object({ deviceId: number().int().nonnegative() }), _void(), {
25275
25328
  kind: "mutation",
25276
- auth: "admin"
25329
+ auth: "protected"
25277
25330
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25278
25331
  kind: "mutation",
25279
- auth: "admin"
25332
+ auth: "protected"
25280
25333
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25281
25334
  kind: "mutation",
25282
- auth: "admin"
25335
+ auth: "protected"
25283
25336
  });
25284
25337
  /**
25285
25338
  * local-network — hub-only singleton.
@@ -25539,16 +25592,16 @@ DeviceType.Lock, method(object({
25539
25592
  code: string().min(1).optional()
25540
25593
  }), _void(), {
25541
25594
  kind: "mutation",
25542
- auth: "admin"
25595
+ auth: "protected"
25543
25596
  }), method(object({
25544
25597
  deviceId: number().int().nonnegative(),
25545
25598
  code: string().min(1).optional()
25546
25599
  }), _void(), {
25547
25600
  kind: "mutation",
25548
- auth: "admin"
25601
+ auth: "protected"
25549
25602
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25550
25603
  kind: "mutation",
25551
- auth: "admin"
25604
+ auth: "protected"
25552
25605
  });
25553
25606
  /**
25554
25607
  * Media-player cap. Models HA `media_player.*` (Sonos, Chromecast,
@@ -25622,55 +25675,55 @@ object({
25622
25675
  });
25623
25676
  DeviceType.MediaPlayer, method(object({ deviceId: number().int().nonnegative() }), _void(), {
25624
25677
  kind: "mutation",
25625
- auth: "admin"
25678
+ auth: "protected"
25626
25679
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25627
25680
  kind: "mutation",
25628
- auth: "admin"
25681
+ auth: "protected"
25629
25682
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25630
25683
  kind: "mutation",
25631
- auth: "admin"
25684
+ auth: "protected"
25632
25685
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25633
25686
  kind: "mutation",
25634
- auth: "admin"
25687
+ auth: "protected"
25635
25688
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25636
25689
  kind: "mutation",
25637
- auth: "admin"
25690
+ auth: "protected"
25638
25691
  }), method(object({
25639
25692
  deviceId: number().int().nonnegative(),
25640
25693
  positionMs: number().int().nonnegative()
25641
25694
  }), _void(), {
25642
25695
  kind: "mutation",
25643
- auth: "admin"
25696
+ auth: "protected"
25644
25697
  }), method(object({
25645
25698
  deviceId: number().int().nonnegative(),
25646
25699
  volumeLevel: number().min(0).max(100)
25647
25700
  }), _void(), {
25648
25701
  kind: "mutation",
25649
- auth: "admin"
25702
+ auth: "protected"
25650
25703
  }), method(object({
25651
25704
  deviceId: number().int().nonnegative(),
25652
25705
  muted: boolean()
25653
25706
  }), _void(), {
25654
25707
  kind: "mutation",
25655
- auth: "admin"
25708
+ auth: "protected"
25656
25709
  }), method(object({
25657
25710
  deviceId: number().int().nonnegative(),
25658
25711
  shuffle: boolean()
25659
25712
  }), _void(), {
25660
25713
  kind: "mutation",
25661
- auth: "admin"
25714
+ auth: "protected"
25662
25715
  }), method(object({
25663
25716
  deviceId: number().int().nonnegative(),
25664
25717
  repeat: MediaPlayerRepeatSchema
25665
25718
  }), _void(), {
25666
25719
  kind: "mutation",
25667
- auth: "admin"
25720
+ auth: "protected"
25668
25721
  }), method(object({
25669
25722
  deviceId: number().int().nonnegative(),
25670
25723
  source: string().min(1)
25671
25724
  }), _void(), {
25672
25725
  kind: "mutation",
25673
- auth: "admin"
25726
+ auth: "protected"
25674
25727
  }), method(object({
25675
25728
  deviceId: number().int().nonnegative(),
25676
25729
  /** Media identifier / URL. */
@@ -25680,7 +25733,7 @@ DeviceType.MediaPlayer, method(object({ deviceId: number().int().nonnegative() }
25680
25733
  mediaType: string().min(1)
25681
25734
  }), _void(), {
25682
25735
  kind: "mutation",
25683
- auth: "admin"
25736
+ auth: "protected"
25684
25737
  });
25685
25738
  /**
25686
25739
  * mesh-network — collection cap for mesh-VPN providers.
@@ -26846,49 +26899,49 @@ DeviceType.PetFeeder, method(object({
26846
26899
  hopper2: gramsPortion.optional()
26847
26900
  }), _void(), {
26848
26901
  kind: "mutation",
26849
- auth: "admin"
26902
+ auth: "protected"
26850
26903
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
26851
26904
  kind: "mutation",
26852
- auth: "admin"
26905
+ auth: "protected"
26853
26906
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
26854
26907
  kind: "mutation",
26855
- auth: "admin"
26908
+ auth: "protected"
26856
26909
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
26857
26910
  kind: "mutation",
26858
- auth: "admin"
26911
+ auth: "protected"
26859
26912
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
26860
26913
  kind: "mutation",
26861
- auth: "admin"
26914
+ auth: "protected"
26862
26915
  }), method(object({
26863
26916
  deviceId: number().int().nonnegative(),
26864
26917
  soundId: number().int().nonnegative()
26865
26918
  }), _void(), {
26866
26919
  kind: "mutation",
26867
- auth: "admin"
26920
+ auth: "protected"
26868
26921
  }), method(object({
26869
26922
  deviceId: number().int().nonnegative(),
26870
26923
  on: boolean()
26871
26924
  }), _void(), {
26872
26925
  kind: "mutation",
26873
- auth: "admin"
26926
+ auth: "protected"
26874
26927
  }), method(object({
26875
26928
  deviceId: number().int().nonnegative(),
26876
26929
  on: boolean()
26877
26930
  }), _void(), {
26878
26931
  kind: "mutation",
26879
- auth: "admin"
26932
+ auth: "protected"
26880
26933
  }), method(object({
26881
26934
  deviceId: number().int().nonnegative(),
26882
26935
  on: boolean()
26883
26936
  }), _void(), {
26884
26937
  kind: "mutation",
26885
- auth: "admin"
26938
+ auth: "protected"
26886
26939
  }), method(object({
26887
26940
  deviceId: number().int().nonnegative(),
26888
26941
  level: number().int().nonnegative()
26889
26942
  }), _void(), {
26890
26943
  kind: "mutation",
26891
- auth: "admin"
26944
+ auth: "protected"
26892
26945
  });
26893
26946
  var VehicleSchema = object({
26894
26947
  id: string(),
@@ -28675,7 +28728,7 @@ DeviceType.Switch, DeviceType.Siren, DeviceType.Light, method(object({
28675
28728
  on: boolean()
28676
28729
  }), _void(), {
28677
28730
  kind: "mutation",
28678
- auth: "admin"
28731
+ auth: "protected"
28679
28732
  }), object({
28680
28733
  deviceId: number(),
28681
28734
  on: boolean(),
@@ -29532,25 +29585,25 @@ object({
29532
29585
  });
29533
29586
  DeviceType.Vacuum, method(object({ deviceId: number().int().nonnegative() }), _void(), {
29534
29587
  kind: "mutation",
29535
- auth: "admin"
29588
+ auth: "protected"
29536
29589
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
29537
29590
  kind: "mutation",
29538
- auth: "admin"
29591
+ auth: "protected"
29539
29592
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
29540
29593
  kind: "mutation",
29541
- auth: "admin"
29594
+ auth: "protected"
29542
29595
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
29543
29596
  kind: "mutation",
29544
- auth: "admin"
29597
+ auth: "protected"
29545
29598
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
29546
29599
  kind: "mutation",
29547
- auth: "admin"
29600
+ auth: "protected"
29548
29601
  }), method(object({
29549
29602
  deviceId: number().int().nonnegative(),
29550
29603
  speed: string().min(1)
29551
29604
  }), _void(), {
29552
29605
  kind: "mutation",
29553
- auth: "admin"
29606
+ auth: "protected"
29554
29607
  });
29555
29608
  object({
29556
29609
  /** Lifecycle state of the valve. */
@@ -29569,19 +29622,19 @@ object({
29569
29622
  });
29570
29623
  DeviceType.Valve, method(object({ deviceId: number().int().nonnegative() }), _void(), {
29571
29624
  kind: "mutation",
29572
- auth: "admin"
29625
+ auth: "protected"
29573
29626
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
29574
29627
  kind: "mutation",
29575
- auth: "admin"
29628
+ auth: "protected"
29576
29629
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
29577
29630
  kind: "mutation",
29578
- auth: "admin"
29631
+ auth: "protected"
29579
29632
  }), method(object({
29580
29633
  deviceId: number().int().nonnegative(),
29581
29634
  position: number().min(0).max(100)
29582
29635
  }), _void(), {
29583
29636
  kind: "mutation",
29584
- auth: "admin"
29637
+ auth: "protected"
29585
29638
  });
29586
29639
  object({
29587
29640
  detected: boolean(),
@@ -29615,19 +29668,19 @@ DeviceType.WaterHeater, method(object({
29615
29668
  temp: number().finite()
29616
29669
  }), _void(), {
29617
29670
  kind: "mutation",
29618
- auth: "admin"
29671
+ auth: "protected"
29619
29672
  }), method(object({
29620
29673
  deviceId: number().int().nonnegative(),
29621
29674
  mode: string().min(1)
29622
29675
  }), _void(), {
29623
29676
  kind: "mutation",
29624
- auth: "admin"
29677
+ auth: "protected"
29625
29678
  }), method(object({
29626
29679
  deviceId: number().int().nonnegative(),
29627
29680
  on: boolean()
29628
29681
  }), _void(), {
29629
29682
  kind: "mutation",
29630
- auth: "admin"
29683
+ auth: "protected"
29631
29684
  });
29632
29685
  object({
29633
29686
  /** Verbatim HA condition state (`sunny`, `cloudy`, `rainy`, …). Null
@@ -31719,6 +31772,12 @@ Object.freeze({
31719
31772
  addonId: null,
31720
31773
  access: "create"
31721
31774
  },
31775
+ "faceGallery.auditIdentitySamples": {
31776
+ capName: "face-gallery",
31777
+ capScope: "system",
31778
+ addonId: null,
31779
+ access: "view"
31780
+ },
31722
31781
  "faceGallery.createIdentity": {
31723
31782
  capName: "face-gallery",
31724
31783
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -15972,16 +15972,16 @@ DeviceType.AlarmPanel, method(object({
15972
15972
  code: string().min(1).optional()
15973
15973
  }), _void(), {
15974
15974
  kind: "mutation",
15975
- auth: "admin"
15975
+ auth: "protected"
15976
15976
  }), method(object({
15977
15977
  deviceId: number().int().nonnegative(),
15978
15978
  code: string().min(1).optional()
15979
15979
  }), _void(), {
15980
15980
  kind: "mutation",
15981
- auth: "admin"
15981
+ auth: "protected"
15982
15982
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
15983
15983
  kind: "mutation",
15984
- auth: "admin"
15984
+ auth: "protected"
15985
15985
  });
15986
15986
  /**
15987
15987
  * Shared geometry vocabulary for on-frame shape caps — privacy-mask,
@@ -23636,7 +23636,7 @@ DeviceType.Light, method(object({
23636
23636
  percentage: number().min(0).max(100)
23637
23637
  }), _void(), {
23638
23638
  kind: "mutation",
23639
- auth: "admin"
23639
+ auth: "protected"
23640
23640
  }), object({
23641
23641
  deviceId: number(),
23642
23642
  percentage: number().min(0).max(100),
@@ -23644,7 +23644,7 @@ DeviceType.Light, method(object({
23644
23644
  });
23645
23645
  DeviceType.Button, method(object({ deviceId: number().int().nonnegative() }), _void(), {
23646
23646
  kind: "mutation",
23647
- auth: "admin"
23647
+ auth: "protected"
23648
23648
  });
23649
23649
  /**
23650
23650
  * camera-credentials — device-scoped cap exposing the camera's network
@@ -23803,50 +23803,50 @@ DeviceType.Thermostat, DeviceType.Climate, method(object({
23803
23803
  mode: HvacModeSchema
23804
23804
  }), _void(), {
23805
23805
  kind: "mutation",
23806
- auth: "admin"
23806
+ auth: "protected"
23807
23807
  }), method(object({
23808
23808
  deviceId: number().int().nonnegative(),
23809
23809
  fanMode: string().min(1)
23810
23810
  }), _void(), {
23811
23811
  kind: "mutation",
23812
- auth: "admin"
23812
+ auth: "protected"
23813
23813
  }), method(object({
23814
23814
  deviceId: number().int().nonnegative(),
23815
23815
  preset: string().min(1)
23816
23816
  }), _void(), {
23817
23817
  kind: "mutation",
23818
- auth: "admin"
23818
+ auth: "protected"
23819
23819
  }), method(object({
23820
23820
  deviceId: number().int().nonnegative(),
23821
23821
  target: number()
23822
23822
  }), _void(), {
23823
23823
  kind: "mutation",
23824
- auth: "admin"
23824
+ auth: "protected"
23825
23825
  }), method(object({
23826
23826
  deviceId: number().int().nonnegative(),
23827
23827
  targetLow: number(),
23828
23828
  targetHigh: number()
23829
23829
  }), _void(), {
23830
23830
  kind: "mutation",
23831
- auth: "admin"
23831
+ auth: "protected"
23832
23832
  }), method(object({
23833
23833
  deviceId: number().int().nonnegative(),
23834
23834
  targetHumidity: number().min(0).max(100)
23835
23835
  }), _void(), {
23836
23836
  kind: "mutation",
23837
- auth: "admin"
23837
+ auth: "protected"
23838
23838
  }), method(object({
23839
23839
  deviceId: number().int().nonnegative(),
23840
23840
  on: boolean()
23841
23841
  }), _void(), {
23842
23842
  kind: "mutation",
23843
- auth: "admin"
23843
+ auth: "protected"
23844
23844
  }), method(object({
23845
23845
  deviceId: number().int().nonnegative(),
23846
23846
  on: boolean()
23847
23847
  }), _void(), {
23848
23848
  kind: "mutation",
23849
- auth: "admin"
23849
+ auth: "protected"
23850
23850
  });
23851
23851
  /**
23852
23852
  * Color-light cap. Coexists with `switch` (on/off) and `brightness`
@@ -23921,7 +23921,7 @@ DeviceType.Light, method(object({
23921
23921
  color: ColorInputSchema
23922
23922
  }), _void(), {
23923
23923
  kind: "mutation",
23924
- auth: "admin"
23924
+ auth: "protected"
23925
23925
  }), object({
23926
23926
  deviceId: number(),
23927
23927
  mode: _enum([
@@ -24070,7 +24070,7 @@ DeviceType.Control, method(object({
24070
24070
  control: ControlSetValueInputSchema
24071
24071
  }), _void(), {
24072
24072
  kind: "mutation",
24073
- auth: "admin"
24073
+ auth: "protected"
24074
24074
  });
24075
24075
  object({
24076
24076
  /** Lifecycle state of the cover. */
@@ -24091,25 +24091,25 @@ object({
24091
24091
  });
24092
24092
  DeviceType.Cover, method(object({ deviceId: number().int().nonnegative() }), _void(), {
24093
24093
  kind: "mutation",
24094
- auth: "admin"
24094
+ auth: "protected"
24095
24095
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
24096
24096
  kind: "mutation",
24097
- auth: "admin"
24097
+ auth: "protected"
24098
24098
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
24099
24099
  kind: "mutation",
24100
- auth: "admin"
24100
+ auth: "protected"
24101
24101
  }), method(object({
24102
24102
  deviceId: number().int().nonnegative(),
24103
24103
  position: number().min(0).max(100)
24104
24104
  }), _void(), {
24105
24105
  kind: "mutation",
24106
- auth: "admin"
24106
+ auth: "protected"
24107
24107
  }), method(object({
24108
24108
  deviceId: number().int().nonnegative(),
24109
24109
  tiltPosition: number().min(0).max(100)
24110
24110
  }), _void(), {
24111
24111
  kind: "mutation",
24112
- auth: "admin"
24112
+ auth: "protected"
24113
24113
  });
24114
24114
  /**
24115
24115
  * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
@@ -24314,6 +24314,59 @@ var IdentitySampleInfoSchema = object({
24314
24314
  deviceId: number().int().optional(),
24315
24315
  base64: string().optional()
24316
24316
  });
24317
+ /**
24318
+ * One enrolled sample, judged against the gallery it lives in.
24319
+ *
24320
+ * The gallery is the one input to recognition nobody re-reads: a sample
24321
+ * enrolled from the wrong face keeps voting forever, and because the matches it
24322
+ * pulls then look confident, nobody goes back. The 2026-09-08 audit found
24323
+ * exactly one such pair on this cluster — a sample scoring 0.61 against three
24324
+ * samples of ANOTHER person, enrolled from the same camera in the same minute,
24325
+ * where every other cross-identity pair sits under 0.50.
24326
+ */
24327
+ var IdentitySampleAuditRowSchema = object({
24328
+ sampleId: string(),
24329
+ enrolledAt: number().int(),
24330
+ deviceId: number().int().optional(),
24331
+ source: _enum(["detected", "photo"]),
24332
+ /** The enrolled crop's media key, so the panel can show the evidence. */
24333
+ mediaKey: string().optional(),
24334
+ /**
24335
+ * False = the sample is stamped with a DIFFERENT face model, and a cosine
24336
+ * across feature spaces is a well-formed float with no meaning. Every number
24337
+ * below then says nothing — it must read as "cannot say", never as an
24338
+ * accusation and never as a clean bill: this list ends in a Remove button.
24339
+ */
24340
+ comparable: boolean(),
24341
+ /** Mean cosine against this person's other samples. Null when there are none
24342
+ * to compare with — never 0, which would read as "opposite". */
24343
+ selfMean: number().nullable(),
24344
+ /** The other person this sample looks most like, when it looks like one.
24345
+ * This is the half that convicts: not looking like yourself can be a hard
24346
+ * angle; looking like someone the gallery can NAME is a mis-enrolment. */
24347
+ bestForeign: object({
24348
+ identityId: string(),
24349
+ name: string(),
24350
+ score: number()
24351
+ }).optional(),
24352
+ /** 0 = nothing to say. Higher = look at this one sooner. */
24353
+ suspicion: number()
24354
+ });
24355
+ var IdentitySampleAuditSchema = object({
24356
+ identityId: string(),
24357
+ name: string(),
24358
+ /** The cluster face model every comparison was made in. */
24359
+ modelId: string(),
24360
+ totalSamples: number().int(),
24361
+ comparableSamples: number().int(),
24362
+ flagged: number().int(),
24363
+ /** The bar `flagged` counts against, so the panel states the RULE and not
24364
+ * only its current result. */
24365
+ flagThreshold: number(),
24366
+ /** Worst first. A row with nothing to say still appears, at the bottom: the
24367
+ * operator asked to see the gallery, not only its accusations. */
24368
+ rows: array(IdentitySampleAuditRowSchema).readonly()
24369
+ });
24317
24370
  var FaceInfoSchema = object({
24318
24371
  faceId: string(),
24319
24372
  deviceId: number().int(),
@@ -24465,7 +24518,7 @@ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly
24465
24518
  }), method(object({ id: string() }), _void(), {
24466
24519
  kind: "mutation",
24467
24520
  auth: "admin"
24468
- }), method(object({ identityId: string() }), array(IdentitySampleInfoSchema).readonly()), method(object({
24521
+ }), method(object({ identityId: string() }), array(IdentitySampleInfoSchema).readonly()), method(object({ identityId: string().min(1) }), IdentitySampleAuditSchema, { auth: "admin" }), method(object({
24469
24522
  identityId: string(),
24470
24523
  sampleId: string()
24471
24524
  }), _void(), {
@@ -24651,25 +24704,25 @@ DeviceType.Fan, method(object({
24651
24704
  percentage: number().min(0).max(100)
24652
24705
  }), _void(), {
24653
24706
  kind: "mutation",
24654
- auth: "admin"
24707
+ auth: "protected"
24655
24708
  }), method(object({
24656
24709
  deviceId: number().int().nonnegative(),
24657
24710
  preset: string().min(1)
24658
24711
  }), _void(), {
24659
24712
  kind: "mutation",
24660
- auth: "admin"
24713
+ auth: "protected"
24661
24714
  }), method(object({
24662
24715
  deviceId: number().int().nonnegative(),
24663
24716
  direction: FanDirectionSchema
24664
24717
  }), _void(), {
24665
24718
  kind: "mutation",
24666
- auth: "admin"
24719
+ auth: "protected"
24667
24720
  }), method(object({
24668
24721
  deviceId: number().int().nonnegative(),
24669
24722
  oscillating: boolean()
24670
24723
  }), _void(), {
24671
24724
  kind: "mutation",
24672
- auth: "admin"
24725
+ auth: "protected"
24673
24726
  });
24674
24727
  /**
24675
24728
  * Per-device feature/identity probe slice. Holds the runtime-resolved
@@ -24772,19 +24825,19 @@ DeviceType.Humidifier, method(object({
24772
24825
  on: boolean()
24773
24826
  }), _void(), {
24774
24827
  kind: "mutation",
24775
- auth: "admin"
24828
+ auth: "protected"
24776
24829
  }), method(object({
24777
24830
  deviceId: number().int().nonnegative(),
24778
24831
  humidity: number().min(0).max(100)
24779
24832
  }), _void(), {
24780
24833
  kind: "mutation",
24781
- auth: "admin"
24834
+ auth: "protected"
24782
24835
  }), method(object({
24783
24836
  deviceId: number().int().nonnegative(),
24784
24837
  mode: string().min(1)
24785
24838
  }), _void(), {
24786
24839
  kind: "mutation",
24787
- auth: "admin"
24840
+ auth: "protected"
24788
24841
  });
24789
24842
  object({
24790
24843
  /** Current relative humidity, 0..100. */
@@ -25246,13 +25299,13 @@ object({
25246
25299
  });
25247
25300
  DeviceType.LawnMower, method(object({ deviceId: number().int().nonnegative() }), _void(), {
25248
25301
  kind: "mutation",
25249
- auth: "admin"
25302
+ auth: "protected"
25250
25303
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25251
25304
  kind: "mutation",
25252
- auth: "admin"
25305
+ auth: "protected"
25253
25306
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25254
25307
  kind: "mutation",
25255
- auth: "admin"
25308
+ auth: "protected"
25256
25309
  });
25257
25310
  /**
25258
25311
  * local-network — hub-only singleton.
@@ -25512,16 +25565,16 @@ DeviceType.Lock, method(object({
25512
25565
  code: string().min(1).optional()
25513
25566
  }), _void(), {
25514
25567
  kind: "mutation",
25515
- auth: "admin"
25568
+ auth: "protected"
25516
25569
  }), method(object({
25517
25570
  deviceId: number().int().nonnegative(),
25518
25571
  code: string().min(1).optional()
25519
25572
  }), _void(), {
25520
25573
  kind: "mutation",
25521
- auth: "admin"
25574
+ auth: "protected"
25522
25575
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25523
25576
  kind: "mutation",
25524
- auth: "admin"
25577
+ auth: "protected"
25525
25578
  });
25526
25579
  /**
25527
25580
  * Media-player cap. Models HA `media_player.*` (Sonos, Chromecast,
@@ -25595,55 +25648,55 @@ object({
25595
25648
  });
25596
25649
  DeviceType.MediaPlayer, method(object({ deviceId: number().int().nonnegative() }), _void(), {
25597
25650
  kind: "mutation",
25598
- auth: "admin"
25651
+ auth: "protected"
25599
25652
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25600
25653
  kind: "mutation",
25601
- auth: "admin"
25654
+ auth: "protected"
25602
25655
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25603
25656
  kind: "mutation",
25604
- auth: "admin"
25657
+ auth: "protected"
25605
25658
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25606
25659
  kind: "mutation",
25607
- auth: "admin"
25660
+ auth: "protected"
25608
25661
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25609
25662
  kind: "mutation",
25610
- auth: "admin"
25663
+ auth: "protected"
25611
25664
  }), method(object({
25612
25665
  deviceId: number().int().nonnegative(),
25613
25666
  positionMs: number().int().nonnegative()
25614
25667
  }), _void(), {
25615
25668
  kind: "mutation",
25616
- auth: "admin"
25669
+ auth: "protected"
25617
25670
  }), method(object({
25618
25671
  deviceId: number().int().nonnegative(),
25619
25672
  volumeLevel: number().min(0).max(100)
25620
25673
  }), _void(), {
25621
25674
  kind: "mutation",
25622
- auth: "admin"
25675
+ auth: "protected"
25623
25676
  }), method(object({
25624
25677
  deviceId: number().int().nonnegative(),
25625
25678
  muted: boolean()
25626
25679
  }), _void(), {
25627
25680
  kind: "mutation",
25628
- auth: "admin"
25681
+ auth: "protected"
25629
25682
  }), method(object({
25630
25683
  deviceId: number().int().nonnegative(),
25631
25684
  shuffle: boolean()
25632
25685
  }), _void(), {
25633
25686
  kind: "mutation",
25634
- auth: "admin"
25687
+ auth: "protected"
25635
25688
  }), method(object({
25636
25689
  deviceId: number().int().nonnegative(),
25637
25690
  repeat: MediaPlayerRepeatSchema
25638
25691
  }), _void(), {
25639
25692
  kind: "mutation",
25640
- auth: "admin"
25693
+ auth: "protected"
25641
25694
  }), method(object({
25642
25695
  deviceId: number().int().nonnegative(),
25643
25696
  source: string().min(1)
25644
25697
  }), _void(), {
25645
25698
  kind: "mutation",
25646
- auth: "admin"
25699
+ auth: "protected"
25647
25700
  }), method(object({
25648
25701
  deviceId: number().int().nonnegative(),
25649
25702
  /** Media identifier / URL. */
@@ -25653,7 +25706,7 @@ DeviceType.MediaPlayer, method(object({ deviceId: number().int().nonnegative() }
25653
25706
  mediaType: string().min(1)
25654
25707
  }), _void(), {
25655
25708
  kind: "mutation",
25656
- auth: "admin"
25709
+ auth: "protected"
25657
25710
  });
25658
25711
  /**
25659
25712
  * mesh-network — collection cap for mesh-VPN providers.
@@ -26819,49 +26872,49 @@ DeviceType.PetFeeder, method(object({
26819
26872
  hopper2: gramsPortion.optional()
26820
26873
  }), _void(), {
26821
26874
  kind: "mutation",
26822
- auth: "admin"
26875
+ auth: "protected"
26823
26876
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
26824
26877
  kind: "mutation",
26825
- auth: "admin"
26878
+ auth: "protected"
26826
26879
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
26827
26880
  kind: "mutation",
26828
- auth: "admin"
26881
+ auth: "protected"
26829
26882
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
26830
26883
  kind: "mutation",
26831
- auth: "admin"
26884
+ auth: "protected"
26832
26885
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
26833
26886
  kind: "mutation",
26834
- auth: "admin"
26887
+ auth: "protected"
26835
26888
  }), method(object({
26836
26889
  deviceId: number().int().nonnegative(),
26837
26890
  soundId: number().int().nonnegative()
26838
26891
  }), _void(), {
26839
26892
  kind: "mutation",
26840
- auth: "admin"
26893
+ auth: "protected"
26841
26894
  }), method(object({
26842
26895
  deviceId: number().int().nonnegative(),
26843
26896
  on: boolean()
26844
26897
  }), _void(), {
26845
26898
  kind: "mutation",
26846
- auth: "admin"
26899
+ auth: "protected"
26847
26900
  }), method(object({
26848
26901
  deviceId: number().int().nonnegative(),
26849
26902
  on: boolean()
26850
26903
  }), _void(), {
26851
26904
  kind: "mutation",
26852
- auth: "admin"
26905
+ auth: "protected"
26853
26906
  }), method(object({
26854
26907
  deviceId: number().int().nonnegative(),
26855
26908
  on: boolean()
26856
26909
  }), _void(), {
26857
26910
  kind: "mutation",
26858
- auth: "admin"
26911
+ auth: "protected"
26859
26912
  }), method(object({
26860
26913
  deviceId: number().int().nonnegative(),
26861
26914
  level: number().int().nonnegative()
26862
26915
  }), _void(), {
26863
26916
  kind: "mutation",
26864
- auth: "admin"
26917
+ auth: "protected"
26865
26918
  });
26866
26919
  var VehicleSchema = object({
26867
26920
  id: string(),
@@ -28648,7 +28701,7 @@ DeviceType.Switch, DeviceType.Siren, DeviceType.Light, method(object({
28648
28701
  on: boolean()
28649
28702
  }), _void(), {
28650
28703
  kind: "mutation",
28651
- auth: "admin"
28704
+ auth: "protected"
28652
28705
  }), object({
28653
28706
  deviceId: number(),
28654
28707
  on: boolean(),
@@ -29505,25 +29558,25 @@ object({
29505
29558
  });
29506
29559
  DeviceType.Vacuum, method(object({ deviceId: number().int().nonnegative() }), _void(), {
29507
29560
  kind: "mutation",
29508
- auth: "admin"
29561
+ auth: "protected"
29509
29562
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
29510
29563
  kind: "mutation",
29511
- auth: "admin"
29564
+ auth: "protected"
29512
29565
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
29513
29566
  kind: "mutation",
29514
- auth: "admin"
29567
+ auth: "protected"
29515
29568
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
29516
29569
  kind: "mutation",
29517
- auth: "admin"
29570
+ auth: "protected"
29518
29571
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
29519
29572
  kind: "mutation",
29520
- auth: "admin"
29573
+ auth: "protected"
29521
29574
  }), method(object({
29522
29575
  deviceId: number().int().nonnegative(),
29523
29576
  speed: string().min(1)
29524
29577
  }), _void(), {
29525
29578
  kind: "mutation",
29526
- auth: "admin"
29579
+ auth: "protected"
29527
29580
  });
29528
29581
  object({
29529
29582
  /** Lifecycle state of the valve. */
@@ -29542,19 +29595,19 @@ object({
29542
29595
  });
29543
29596
  DeviceType.Valve, method(object({ deviceId: number().int().nonnegative() }), _void(), {
29544
29597
  kind: "mutation",
29545
- auth: "admin"
29598
+ auth: "protected"
29546
29599
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
29547
29600
  kind: "mutation",
29548
- auth: "admin"
29601
+ auth: "protected"
29549
29602
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
29550
29603
  kind: "mutation",
29551
- auth: "admin"
29604
+ auth: "protected"
29552
29605
  }), method(object({
29553
29606
  deviceId: number().int().nonnegative(),
29554
29607
  position: number().min(0).max(100)
29555
29608
  }), _void(), {
29556
29609
  kind: "mutation",
29557
- auth: "admin"
29610
+ auth: "protected"
29558
29611
  });
29559
29612
  object({
29560
29613
  detected: boolean(),
@@ -29588,19 +29641,19 @@ DeviceType.WaterHeater, method(object({
29588
29641
  temp: number().finite()
29589
29642
  }), _void(), {
29590
29643
  kind: "mutation",
29591
- auth: "admin"
29644
+ auth: "protected"
29592
29645
  }), method(object({
29593
29646
  deviceId: number().int().nonnegative(),
29594
29647
  mode: string().min(1)
29595
29648
  }), _void(), {
29596
29649
  kind: "mutation",
29597
- auth: "admin"
29650
+ auth: "protected"
29598
29651
  }), method(object({
29599
29652
  deviceId: number().int().nonnegative(),
29600
29653
  on: boolean()
29601
29654
  }), _void(), {
29602
29655
  kind: "mutation",
29603
- auth: "admin"
29656
+ auth: "protected"
29604
29657
  });
29605
29658
  object({
29606
29659
  /** Verbatim HA condition state (`sunny`, `cloudy`, `rainy`, …). Null
@@ -31692,6 +31745,12 @@ Object.freeze({
31692
31745
  addonId: null,
31693
31746
  access: "create"
31694
31747
  },
31748
+ "faceGallery.auditIdentitySamples": {
31749
+ capName: "face-gallery",
31750
+ capScope: "system",
31751
+ addonId: null,
31752
+ access: "view"
31753
+ },
31695
31754
  "faceGallery.createIdentity": {
31696
31755
  capName: "face-gallery",
31697
31756
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-notifiers",
3
- "version": "1.2.88",
3
+ "version": "1.2.90",
4
4
  "description": "System notifiers addon for CamStack — a `notification-output` collection provider hosting per-kind notifier adapters (ntfy, pushover, gotify, telegram, discord, webhook, zentik).",
5
5
  "keywords": [
6
6
  "camstack",