@camstack/addon-ai 0.4.87 → 0.4.89

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
@@ -16108,16 +16108,16 @@ DeviceType.AlarmPanel, method(object({
16108
16108
  code: string().min(1).optional()
16109
16109
  }), _void(), {
16110
16110
  kind: "mutation",
16111
- auth: "admin"
16111
+ auth: "protected"
16112
16112
  }), method(object({
16113
16113
  deviceId: number$1().int().nonnegative(),
16114
16114
  code: string().min(1).optional()
16115
16115
  }), _void(), {
16116
16116
  kind: "mutation",
16117
- auth: "admin"
16117
+ auth: "protected"
16118
16118
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
16119
16119
  kind: "mutation",
16120
- auth: "admin"
16120
+ auth: "protected"
16121
16121
  });
16122
16122
  /**
16123
16123
  * Shared geometry vocabulary for on-frame shape caps — privacy-mask,
@@ -23772,7 +23772,7 @@ DeviceType.Light, method(object({
23772
23772
  percentage: number$1().min(0).max(100)
23773
23773
  }), _void(), {
23774
23774
  kind: "mutation",
23775
- auth: "admin"
23775
+ auth: "protected"
23776
23776
  }), object({
23777
23777
  deviceId: number$1(),
23778
23778
  percentage: number$1().min(0).max(100),
@@ -23780,7 +23780,7 @@ DeviceType.Light, method(object({
23780
23780
  });
23781
23781
  DeviceType.Button, method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
23782
23782
  kind: "mutation",
23783
- auth: "admin"
23783
+ auth: "protected"
23784
23784
  });
23785
23785
  /**
23786
23786
  * camera-credentials — device-scoped cap exposing the camera's network
@@ -23939,50 +23939,50 @@ DeviceType.Thermostat, DeviceType.Climate, method(object({
23939
23939
  mode: HvacModeSchema
23940
23940
  }), _void(), {
23941
23941
  kind: "mutation",
23942
- auth: "admin"
23942
+ auth: "protected"
23943
23943
  }), method(object({
23944
23944
  deviceId: number$1().int().nonnegative(),
23945
23945
  fanMode: string().min(1)
23946
23946
  }), _void(), {
23947
23947
  kind: "mutation",
23948
- auth: "admin"
23948
+ auth: "protected"
23949
23949
  }), method(object({
23950
23950
  deviceId: number$1().int().nonnegative(),
23951
23951
  preset: string().min(1)
23952
23952
  }), _void(), {
23953
23953
  kind: "mutation",
23954
- auth: "admin"
23954
+ auth: "protected"
23955
23955
  }), method(object({
23956
23956
  deviceId: number$1().int().nonnegative(),
23957
23957
  target: number$1()
23958
23958
  }), _void(), {
23959
23959
  kind: "mutation",
23960
- auth: "admin"
23960
+ auth: "protected"
23961
23961
  }), method(object({
23962
23962
  deviceId: number$1().int().nonnegative(),
23963
23963
  targetLow: number$1(),
23964
23964
  targetHigh: number$1()
23965
23965
  }), _void(), {
23966
23966
  kind: "mutation",
23967
- auth: "admin"
23967
+ auth: "protected"
23968
23968
  }), method(object({
23969
23969
  deviceId: number$1().int().nonnegative(),
23970
23970
  targetHumidity: number$1().min(0).max(100)
23971
23971
  }), _void(), {
23972
23972
  kind: "mutation",
23973
- auth: "admin"
23973
+ auth: "protected"
23974
23974
  }), method(object({
23975
23975
  deviceId: number$1().int().nonnegative(),
23976
23976
  on: boolean()
23977
23977
  }), _void(), {
23978
23978
  kind: "mutation",
23979
- auth: "admin"
23979
+ auth: "protected"
23980
23980
  }), method(object({
23981
23981
  deviceId: number$1().int().nonnegative(),
23982
23982
  on: boolean()
23983
23983
  }), _void(), {
23984
23984
  kind: "mutation",
23985
- auth: "admin"
23985
+ auth: "protected"
23986
23986
  });
23987
23987
  /**
23988
23988
  * Color-light cap. Coexists with `switch` (on/off) and `brightness`
@@ -24057,7 +24057,7 @@ DeviceType.Light, method(object({
24057
24057
  color: ColorInputSchema
24058
24058
  }), _void(), {
24059
24059
  kind: "mutation",
24060
- auth: "admin"
24060
+ auth: "protected"
24061
24061
  }), object({
24062
24062
  deviceId: number$1(),
24063
24063
  mode: _enum([
@@ -24206,7 +24206,7 @@ DeviceType.Control, method(object({
24206
24206
  control: ControlSetValueInputSchema
24207
24207
  }), _void(), {
24208
24208
  kind: "mutation",
24209
- auth: "admin"
24209
+ auth: "protected"
24210
24210
  });
24211
24211
  object({
24212
24212
  /** Lifecycle state of the cover. */
@@ -24227,25 +24227,25 @@ object({
24227
24227
  });
24228
24228
  DeviceType.Cover, method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
24229
24229
  kind: "mutation",
24230
- auth: "admin"
24230
+ auth: "protected"
24231
24231
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
24232
24232
  kind: "mutation",
24233
- auth: "admin"
24233
+ auth: "protected"
24234
24234
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
24235
24235
  kind: "mutation",
24236
- auth: "admin"
24236
+ auth: "protected"
24237
24237
  }), method(object({
24238
24238
  deviceId: number$1().int().nonnegative(),
24239
24239
  position: number$1().min(0).max(100)
24240
24240
  }), _void(), {
24241
24241
  kind: "mutation",
24242
- auth: "admin"
24242
+ auth: "protected"
24243
24243
  }), method(object({
24244
24244
  deviceId: number$1().int().nonnegative(),
24245
24245
  tiltPosition: number$1().min(0).max(100)
24246
24246
  }), _void(), {
24247
24247
  kind: "mutation",
24248
- auth: "admin"
24248
+ auth: "protected"
24249
24249
  });
24250
24250
  /**
24251
24251
  * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
@@ -24450,6 +24450,59 @@ var IdentitySampleInfoSchema = object({
24450
24450
  deviceId: number$1().int().optional(),
24451
24451
  base64: string().optional()
24452
24452
  });
24453
+ /**
24454
+ * One enrolled sample, judged against the gallery it lives in.
24455
+ *
24456
+ * The gallery is the one input to recognition nobody re-reads: a sample
24457
+ * enrolled from the wrong face keeps voting forever, and because the matches it
24458
+ * pulls then look confident, nobody goes back. The 2026-09-08 audit found
24459
+ * exactly one such pair on this cluster — a sample scoring 0.61 against three
24460
+ * samples of ANOTHER person, enrolled from the same camera in the same minute,
24461
+ * where every other cross-identity pair sits under 0.50.
24462
+ */
24463
+ var IdentitySampleAuditRowSchema = object({
24464
+ sampleId: string(),
24465
+ enrolledAt: number$1().int(),
24466
+ deviceId: number$1().int().optional(),
24467
+ source: _enum(["detected", "photo"]),
24468
+ /** The enrolled crop's media key, so the panel can show the evidence. */
24469
+ mediaKey: string().optional(),
24470
+ /**
24471
+ * False = the sample is stamped with a DIFFERENT face model, and a cosine
24472
+ * across feature spaces is a well-formed float with no meaning. Every number
24473
+ * below then says nothing — it must read as "cannot say", never as an
24474
+ * accusation and never as a clean bill: this list ends in a Remove button.
24475
+ */
24476
+ comparable: boolean(),
24477
+ /** Mean cosine against this person's other samples. Null when there are none
24478
+ * to compare with — never 0, which would read as "opposite". */
24479
+ selfMean: number$1().nullable(),
24480
+ /** The other person this sample looks most like, when it looks like one.
24481
+ * This is the half that convicts: not looking like yourself can be a hard
24482
+ * angle; looking like someone the gallery can NAME is a mis-enrolment. */
24483
+ bestForeign: object({
24484
+ identityId: string(),
24485
+ name: string(),
24486
+ score: number$1()
24487
+ }).optional(),
24488
+ /** 0 = nothing to say. Higher = look at this one sooner. */
24489
+ suspicion: number$1()
24490
+ });
24491
+ var IdentitySampleAuditSchema = object({
24492
+ identityId: string(),
24493
+ name: string(),
24494
+ /** The cluster face model every comparison was made in. */
24495
+ modelId: string(),
24496
+ totalSamples: number$1().int(),
24497
+ comparableSamples: number$1().int(),
24498
+ flagged: number$1().int(),
24499
+ /** The bar `flagged` counts against, so the panel states the RULE and not
24500
+ * only its current result. */
24501
+ flagThreshold: number$1(),
24502
+ /** Worst first. A row with nothing to say still appears, at the bottom: the
24503
+ * operator asked to see the gallery, not only its accusations. */
24504
+ rows: array(IdentitySampleAuditRowSchema).readonly()
24505
+ });
24453
24506
  var FaceInfoSchema = object({
24454
24507
  faceId: string(),
24455
24508
  deviceId: number$1().int(),
@@ -24601,7 +24654,7 @@ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly
24601
24654
  }), method(object({ id: string() }), _void(), {
24602
24655
  kind: "mutation",
24603
24656
  auth: "admin"
24604
- }), method(object({ identityId: string() }), array(IdentitySampleInfoSchema).readonly()), method(object({
24657
+ }), method(object({ identityId: string() }), array(IdentitySampleInfoSchema).readonly()), method(object({ identityId: string().min(1) }), IdentitySampleAuditSchema, { auth: "admin" }), method(object({
24605
24658
  identityId: string(),
24606
24659
  sampleId: string()
24607
24660
  }), _void(), {
@@ -24787,25 +24840,25 @@ DeviceType.Fan, method(object({
24787
24840
  percentage: number$1().min(0).max(100)
24788
24841
  }), _void(), {
24789
24842
  kind: "mutation",
24790
- auth: "admin"
24843
+ auth: "protected"
24791
24844
  }), method(object({
24792
24845
  deviceId: number$1().int().nonnegative(),
24793
24846
  preset: string().min(1)
24794
24847
  }), _void(), {
24795
24848
  kind: "mutation",
24796
- auth: "admin"
24849
+ auth: "protected"
24797
24850
  }), method(object({
24798
24851
  deviceId: number$1().int().nonnegative(),
24799
24852
  direction: FanDirectionSchema
24800
24853
  }), _void(), {
24801
24854
  kind: "mutation",
24802
- auth: "admin"
24855
+ auth: "protected"
24803
24856
  }), method(object({
24804
24857
  deviceId: number$1().int().nonnegative(),
24805
24858
  oscillating: boolean()
24806
24859
  }), _void(), {
24807
24860
  kind: "mutation",
24808
- auth: "admin"
24861
+ auth: "protected"
24809
24862
  });
24810
24863
  /**
24811
24864
  * Per-device feature/identity probe slice. Holds the runtime-resolved
@@ -24908,19 +24961,19 @@ DeviceType.Humidifier, method(object({
24908
24961
  on: boolean()
24909
24962
  }), _void(), {
24910
24963
  kind: "mutation",
24911
- auth: "admin"
24964
+ auth: "protected"
24912
24965
  }), method(object({
24913
24966
  deviceId: number$1().int().nonnegative(),
24914
24967
  humidity: number$1().min(0).max(100)
24915
24968
  }), _void(), {
24916
24969
  kind: "mutation",
24917
- auth: "admin"
24970
+ auth: "protected"
24918
24971
  }), method(object({
24919
24972
  deviceId: number$1().int().nonnegative(),
24920
24973
  mode: string().min(1)
24921
24974
  }), _void(), {
24922
24975
  kind: "mutation",
24923
- auth: "admin"
24976
+ auth: "protected"
24924
24977
  });
24925
24978
  object({
24926
24979
  /** Current relative humidity, 0..100. */
@@ -25382,13 +25435,13 @@ object({
25382
25435
  });
25383
25436
  DeviceType.LawnMower, method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
25384
25437
  kind: "mutation",
25385
- auth: "admin"
25438
+ auth: "protected"
25386
25439
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
25387
25440
  kind: "mutation",
25388
- auth: "admin"
25441
+ auth: "protected"
25389
25442
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
25390
25443
  kind: "mutation",
25391
- auth: "admin"
25444
+ auth: "protected"
25392
25445
  });
25393
25446
  /**
25394
25447
  * local-network — hub-only singleton.
@@ -25648,16 +25701,16 @@ DeviceType.Lock, method(object({
25648
25701
  code: string().min(1).optional()
25649
25702
  }), _void(), {
25650
25703
  kind: "mutation",
25651
- auth: "admin"
25704
+ auth: "protected"
25652
25705
  }), method(object({
25653
25706
  deviceId: number$1().int().nonnegative(),
25654
25707
  code: string().min(1).optional()
25655
25708
  }), _void(), {
25656
25709
  kind: "mutation",
25657
- auth: "admin"
25710
+ auth: "protected"
25658
25711
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
25659
25712
  kind: "mutation",
25660
- auth: "admin"
25713
+ auth: "protected"
25661
25714
  });
25662
25715
  /**
25663
25716
  * Media-player cap. Models HA `media_player.*` (Sonos, Chromecast,
@@ -25731,55 +25784,55 @@ object({
25731
25784
  });
25732
25785
  DeviceType.MediaPlayer, method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
25733
25786
  kind: "mutation",
25734
- auth: "admin"
25787
+ auth: "protected"
25735
25788
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
25736
25789
  kind: "mutation",
25737
- auth: "admin"
25790
+ auth: "protected"
25738
25791
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
25739
25792
  kind: "mutation",
25740
- auth: "admin"
25793
+ auth: "protected"
25741
25794
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
25742
25795
  kind: "mutation",
25743
- auth: "admin"
25796
+ auth: "protected"
25744
25797
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
25745
25798
  kind: "mutation",
25746
- auth: "admin"
25799
+ auth: "protected"
25747
25800
  }), method(object({
25748
25801
  deviceId: number$1().int().nonnegative(),
25749
25802
  positionMs: number$1().int().nonnegative()
25750
25803
  }), _void(), {
25751
25804
  kind: "mutation",
25752
- auth: "admin"
25805
+ auth: "protected"
25753
25806
  }), method(object({
25754
25807
  deviceId: number$1().int().nonnegative(),
25755
25808
  volumeLevel: number$1().min(0).max(100)
25756
25809
  }), _void(), {
25757
25810
  kind: "mutation",
25758
- auth: "admin"
25811
+ auth: "protected"
25759
25812
  }), method(object({
25760
25813
  deviceId: number$1().int().nonnegative(),
25761
25814
  muted: boolean()
25762
25815
  }), _void(), {
25763
25816
  kind: "mutation",
25764
- auth: "admin"
25817
+ auth: "protected"
25765
25818
  }), method(object({
25766
25819
  deviceId: number$1().int().nonnegative(),
25767
25820
  shuffle: boolean()
25768
25821
  }), _void(), {
25769
25822
  kind: "mutation",
25770
- auth: "admin"
25823
+ auth: "protected"
25771
25824
  }), method(object({
25772
25825
  deviceId: number$1().int().nonnegative(),
25773
25826
  repeat: MediaPlayerRepeatSchema
25774
25827
  }), _void(), {
25775
25828
  kind: "mutation",
25776
- auth: "admin"
25829
+ auth: "protected"
25777
25830
  }), method(object({
25778
25831
  deviceId: number$1().int().nonnegative(),
25779
25832
  source: string().min(1)
25780
25833
  }), _void(), {
25781
25834
  kind: "mutation",
25782
- auth: "admin"
25835
+ auth: "protected"
25783
25836
  }), method(object({
25784
25837
  deviceId: number$1().int().nonnegative(),
25785
25838
  /** Media identifier / URL. */
@@ -25789,7 +25842,7 @@ DeviceType.MediaPlayer, method(object({ deviceId: number$1().int().nonnegative()
25789
25842
  mediaType: string().min(1)
25790
25843
  }), _void(), {
25791
25844
  kind: "mutation",
25792
- auth: "admin"
25845
+ auth: "protected"
25793
25846
  });
25794
25847
  /**
25795
25848
  * mesh-network — collection cap for mesh-VPN providers.
@@ -26955,49 +27008,49 @@ DeviceType.PetFeeder, method(object({
26955
27008
  hopper2: gramsPortion.optional()
26956
27009
  }), _void(), {
26957
27010
  kind: "mutation",
26958
- auth: "admin"
27011
+ auth: "protected"
26959
27012
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
26960
27013
  kind: "mutation",
26961
- auth: "admin"
27014
+ auth: "protected"
26962
27015
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
26963
27016
  kind: "mutation",
26964
- auth: "admin"
27017
+ auth: "protected"
26965
27018
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
26966
27019
  kind: "mutation",
26967
- auth: "admin"
27020
+ auth: "protected"
26968
27021
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
26969
27022
  kind: "mutation",
26970
- auth: "admin"
27023
+ auth: "protected"
26971
27024
  }), method(object({
26972
27025
  deviceId: number$1().int().nonnegative(),
26973
27026
  soundId: number$1().int().nonnegative()
26974
27027
  }), _void(), {
26975
27028
  kind: "mutation",
26976
- auth: "admin"
27029
+ auth: "protected"
26977
27030
  }), method(object({
26978
27031
  deviceId: number$1().int().nonnegative(),
26979
27032
  on: boolean()
26980
27033
  }), _void(), {
26981
27034
  kind: "mutation",
26982
- auth: "admin"
27035
+ auth: "protected"
26983
27036
  }), method(object({
26984
27037
  deviceId: number$1().int().nonnegative(),
26985
27038
  on: boolean()
26986
27039
  }), _void(), {
26987
27040
  kind: "mutation",
26988
- auth: "admin"
27041
+ auth: "protected"
26989
27042
  }), method(object({
26990
27043
  deviceId: number$1().int().nonnegative(),
26991
27044
  on: boolean()
26992
27045
  }), _void(), {
26993
27046
  kind: "mutation",
26994
- auth: "admin"
27047
+ auth: "protected"
26995
27048
  }), method(object({
26996
27049
  deviceId: number$1().int().nonnegative(),
26997
27050
  level: number$1().int().nonnegative()
26998
27051
  }), _void(), {
26999
27052
  kind: "mutation",
27000
- auth: "admin"
27053
+ auth: "protected"
27001
27054
  });
27002
27055
  var VehicleSchema = object({
27003
27056
  id: string(),
@@ -28784,7 +28837,7 @@ DeviceType.Switch, DeviceType.Siren, DeviceType.Light, method(object({
28784
28837
  on: boolean()
28785
28838
  }), _void(), {
28786
28839
  kind: "mutation",
28787
- auth: "admin"
28840
+ auth: "protected"
28788
28841
  }), object({
28789
28842
  deviceId: number$1(),
28790
28843
  on: boolean(),
@@ -29641,25 +29694,25 @@ object({
29641
29694
  });
29642
29695
  DeviceType.Vacuum, method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
29643
29696
  kind: "mutation",
29644
- auth: "admin"
29697
+ auth: "protected"
29645
29698
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
29646
29699
  kind: "mutation",
29647
- auth: "admin"
29700
+ auth: "protected"
29648
29701
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
29649
29702
  kind: "mutation",
29650
- auth: "admin"
29703
+ auth: "protected"
29651
29704
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
29652
29705
  kind: "mutation",
29653
- auth: "admin"
29706
+ auth: "protected"
29654
29707
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
29655
29708
  kind: "mutation",
29656
- auth: "admin"
29709
+ auth: "protected"
29657
29710
  }), method(object({
29658
29711
  deviceId: number$1().int().nonnegative(),
29659
29712
  speed: string().min(1)
29660
29713
  }), _void(), {
29661
29714
  kind: "mutation",
29662
- auth: "admin"
29715
+ auth: "protected"
29663
29716
  });
29664
29717
  object({
29665
29718
  /** Lifecycle state of the valve. */
@@ -29678,19 +29731,19 @@ object({
29678
29731
  });
29679
29732
  DeviceType.Valve, method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
29680
29733
  kind: "mutation",
29681
- auth: "admin"
29734
+ auth: "protected"
29682
29735
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
29683
29736
  kind: "mutation",
29684
- auth: "admin"
29737
+ auth: "protected"
29685
29738
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
29686
29739
  kind: "mutation",
29687
- auth: "admin"
29740
+ auth: "protected"
29688
29741
  }), method(object({
29689
29742
  deviceId: number$1().int().nonnegative(),
29690
29743
  position: number$1().min(0).max(100)
29691
29744
  }), _void(), {
29692
29745
  kind: "mutation",
29693
- auth: "admin"
29746
+ auth: "protected"
29694
29747
  });
29695
29748
  object({
29696
29749
  detected: boolean(),
@@ -29724,19 +29777,19 @@ DeviceType.WaterHeater, method(object({
29724
29777
  temp: number$1().finite()
29725
29778
  }), _void(), {
29726
29779
  kind: "mutation",
29727
- auth: "admin"
29780
+ auth: "protected"
29728
29781
  }), method(object({
29729
29782
  deviceId: number$1().int().nonnegative(),
29730
29783
  mode: string().min(1)
29731
29784
  }), _void(), {
29732
29785
  kind: "mutation",
29733
- auth: "admin"
29786
+ auth: "protected"
29734
29787
  }), method(object({
29735
29788
  deviceId: number$1().int().nonnegative(),
29736
29789
  on: boolean()
29737
29790
  }), _void(), {
29738
29791
  kind: "mutation",
29739
- auth: "admin"
29792
+ auth: "protected"
29740
29793
  });
29741
29794
  object({
29742
29795
  /** Verbatim HA condition state (`sunny`, `cloudy`, `rainy`, …). Null
@@ -31828,6 +31881,12 @@ Object.freeze({
31828
31881
  addonId: null,
31829
31882
  access: "create"
31830
31883
  },
31884
+ "faceGallery.auditIdentitySamples": {
31885
+ capName: "face-gallery",
31886
+ capScope: "system",
31887
+ addonId: null,
31888
+ access: "view"
31889
+ },
31831
31890
  "faceGallery.createIdentity": {
31832
31891
  capName: "face-gallery",
31833
31892
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -16135,16 +16135,16 @@ DeviceType.AlarmPanel, method(object({
16135
16135
  code: string().min(1).optional()
16136
16136
  }), _void(), {
16137
16137
  kind: "mutation",
16138
- auth: "admin"
16138
+ auth: "protected"
16139
16139
  }), method(object({
16140
16140
  deviceId: number$1().int().nonnegative(),
16141
16141
  code: string().min(1).optional()
16142
16142
  }), _void(), {
16143
16143
  kind: "mutation",
16144
- auth: "admin"
16144
+ auth: "protected"
16145
16145
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
16146
16146
  kind: "mutation",
16147
- auth: "admin"
16147
+ auth: "protected"
16148
16148
  });
16149
16149
  /**
16150
16150
  * Shared geometry vocabulary for on-frame shape caps — privacy-mask,
@@ -23799,7 +23799,7 @@ DeviceType.Light, method(object({
23799
23799
  percentage: number$1().min(0).max(100)
23800
23800
  }), _void(), {
23801
23801
  kind: "mutation",
23802
- auth: "admin"
23802
+ auth: "protected"
23803
23803
  }), object({
23804
23804
  deviceId: number$1(),
23805
23805
  percentage: number$1().min(0).max(100),
@@ -23807,7 +23807,7 @@ DeviceType.Light, method(object({
23807
23807
  });
23808
23808
  DeviceType.Button, method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
23809
23809
  kind: "mutation",
23810
- auth: "admin"
23810
+ auth: "protected"
23811
23811
  });
23812
23812
  /**
23813
23813
  * camera-credentials — device-scoped cap exposing the camera's network
@@ -23966,50 +23966,50 @@ DeviceType.Thermostat, DeviceType.Climate, method(object({
23966
23966
  mode: HvacModeSchema
23967
23967
  }), _void(), {
23968
23968
  kind: "mutation",
23969
- auth: "admin"
23969
+ auth: "protected"
23970
23970
  }), method(object({
23971
23971
  deviceId: number$1().int().nonnegative(),
23972
23972
  fanMode: string().min(1)
23973
23973
  }), _void(), {
23974
23974
  kind: "mutation",
23975
- auth: "admin"
23975
+ auth: "protected"
23976
23976
  }), method(object({
23977
23977
  deviceId: number$1().int().nonnegative(),
23978
23978
  preset: string().min(1)
23979
23979
  }), _void(), {
23980
23980
  kind: "mutation",
23981
- auth: "admin"
23981
+ auth: "protected"
23982
23982
  }), method(object({
23983
23983
  deviceId: number$1().int().nonnegative(),
23984
23984
  target: number$1()
23985
23985
  }), _void(), {
23986
23986
  kind: "mutation",
23987
- auth: "admin"
23987
+ auth: "protected"
23988
23988
  }), method(object({
23989
23989
  deviceId: number$1().int().nonnegative(),
23990
23990
  targetLow: number$1(),
23991
23991
  targetHigh: number$1()
23992
23992
  }), _void(), {
23993
23993
  kind: "mutation",
23994
- auth: "admin"
23994
+ auth: "protected"
23995
23995
  }), method(object({
23996
23996
  deviceId: number$1().int().nonnegative(),
23997
23997
  targetHumidity: number$1().min(0).max(100)
23998
23998
  }), _void(), {
23999
23999
  kind: "mutation",
24000
- auth: "admin"
24000
+ auth: "protected"
24001
24001
  }), method(object({
24002
24002
  deviceId: number$1().int().nonnegative(),
24003
24003
  on: boolean()
24004
24004
  }), _void(), {
24005
24005
  kind: "mutation",
24006
- auth: "admin"
24006
+ auth: "protected"
24007
24007
  }), method(object({
24008
24008
  deviceId: number$1().int().nonnegative(),
24009
24009
  on: boolean()
24010
24010
  }), _void(), {
24011
24011
  kind: "mutation",
24012
- auth: "admin"
24012
+ auth: "protected"
24013
24013
  });
24014
24014
  /**
24015
24015
  * Color-light cap. Coexists with `switch` (on/off) and `brightness`
@@ -24084,7 +24084,7 @@ DeviceType.Light, method(object({
24084
24084
  color: ColorInputSchema
24085
24085
  }), _void(), {
24086
24086
  kind: "mutation",
24087
- auth: "admin"
24087
+ auth: "protected"
24088
24088
  }), object({
24089
24089
  deviceId: number$1(),
24090
24090
  mode: _enum([
@@ -24233,7 +24233,7 @@ DeviceType.Control, method(object({
24233
24233
  control: ControlSetValueInputSchema
24234
24234
  }), _void(), {
24235
24235
  kind: "mutation",
24236
- auth: "admin"
24236
+ auth: "protected"
24237
24237
  });
24238
24238
  object({
24239
24239
  /** Lifecycle state of the cover. */
@@ -24254,25 +24254,25 @@ object({
24254
24254
  });
24255
24255
  DeviceType.Cover, method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
24256
24256
  kind: "mutation",
24257
- auth: "admin"
24257
+ auth: "protected"
24258
24258
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
24259
24259
  kind: "mutation",
24260
- auth: "admin"
24260
+ auth: "protected"
24261
24261
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
24262
24262
  kind: "mutation",
24263
- auth: "admin"
24263
+ auth: "protected"
24264
24264
  }), method(object({
24265
24265
  deviceId: number$1().int().nonnegative(),
24266
24266
  position: number$1().min(0).max(100)
24267
24267
  }), _void(), {
24268
24268
  kind: "mutation",
24269
- auth: "admin"
24269
+ auth: "protected"
24270
24270
  }), method(object({
24271
24271
  deviceId: number$1().int().nonnegative(),
24272
24272
  tiltPosition: number$1().min(0).max(100)
24273
24273
  }), _void(), {
24274
24274
  kind: "mutation",
24275
- auth: "admin"
24275
+ auth: "protected"
24276
24276
  });
24277
24277
  /**
24278
24278
  * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
@@ -24477,6 +24477,59 @@ var IdentitySampleInfoSchema = object({
24477
24477
  deviceId: number$1().int().optional(),
24478
24478
  base64: string().optional()
24479
24479
  });
24480
+ /**
24481
+ * One enrolled sample, judged against the gallery it lives in.
24482
+ *
24483
+ * The gallery is the one input to recognition nobody re-reads: a sample
24484
+ * enrolled from the wrong face keeps voting forever, and because the matches it
24485
+ * pulls then look confident, nobody goes back. The 2026-09-08 audit found
24486
+ * exactly one such pair on this cluster — a sample scoring 0.61 against three
24487
+ * samples of ANOTHER person, enrolled from the same camera in the same minute,
24488
+ * where every other cross-identity pair sits under 0.50.
24489
+ */
24490
+ var IdentitySampleAuditRowSchema = object({
24491
+ sampleId: string(),
24492
+ enrolledAt: number$1().int(),
24493
+ deviceId: number$1().int().optional(),
24494
+ source: _enum(["detected", "photo"]),
24495
+ /** The enrolled crop's media key, so the panel can show the evidence. */
24496
+ mediaKey: string().optional(),
24497
+ /**
24498
+ * False = the sample is stamped with a DIFFERENT face model, and a cosine
24499
+ * across feature spaces is a well-formed float with no meaning. Every number
24500
+ * below then says nothing — it must read as "cannot say", never as an
24501
+ * accusation and never as a clean bill: this list ends in a Remove button.
24502
+ */
24503
+ comparable: boolean(),
24504
+ /** Mean cosine against this person's other samples. Null when there are none
24505
+ * to compare with — never 0, which would read as "opposite". */
24506
+ selfMean: number$1().nullable(),
24507
+ /** The other person this sample looks most like, when it looks like one.
24508
+ * This is the half that convicts: not looking like yourself can be a hard
24509
+ * angle; looking like someone the gallery can NAME is a mis-enrolment. */
24510
+ bestForeign: object({
24511
+ identityId: string(),
24512
+ name: string(),
24513
+ score: number$1()
24514
+ }).optional(),
24515
+ /** 0 = nothing to say. Higher = look at this one sooner. */
24516
+ suspicion: number$1()
24517
+ });
24518
+ var IdentitySampleAuditSchema = object({
24519
+ identityId: string(),
24520
+ name: string(),
24521
+ /** The cluster face model every comparison was made in. */
24522
+ modelId: string(),
24523
+ totalSamples: number$1().int(),
24524
+ comparableSamples: number$1().int(),
24525
+ flagged: number$1().int(),
24526
+ /** The bar `flagged` counts against, so the panel states the RULE and not
24527
+ * only its current result. */
24528
+ flagThreshold: number$1(),
24529
+ /** Worst first. A row with nothing to say still appears, at the bottom: the
24530
+ * operator asked to see the gallery, not only its accusations. */
24531
+ rows: array(IdentitySampleAuditRowSchema).readonly()
24532
+ });
24480
24533
  var FaceInfoSchema = object({
24481
24534
  faceId: string(),
24482
24535
  deviceId: number$1().int(),
@@ -24628,7 +24681,7 @@ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly
24628
24681
  }), method(object({ id: string() }), _void(), {
24629
24682
  kind: "mutation",
24630
24683
  auth: "admin"
24631
- }), method(object({ identityId: string() }), array(IdentitySampleInfoSchema).readonly()), method(object({
24684
+ }), method(object({ identityId: string() }), array(IdentitySampleInfoSchema).readonly()), method(object({ identityId: string().min(1) }), IdentitySampleAuditSchema, { auth: "admin" }), method(object({
24632
24685
  identityId: string(),
24633
24686
  sampleId: string()
24634
24687
  }), _void(), {
@@ -24814,25 +24867,25 @@ DeviceType.Fan, method(object({
24814
24867
  percentage: number$1().min(0).max(100)
24815
24868
  }), _void(), {
24816
24869
  kind: "mutation",
24817
- auth: "admin"
24870
+ auth: "protected"
24818
24871
  }), method(object({
24819
24872
  deviceId: number$1().int().nonnegative(),
24820
24873
  preset: string().min(1)
24821
24874
  }), _void(), {
24822
24875
  kind: "mutation",
24823
- auth: "admin"
24876
+ auth: "protected"
24824
24877
  }), method(object({
24825
24878
  deviceId: number$1().int().nonnegative(),
24826
24879
  direction: FanDirectionSchema
24827
24880
  }), _void(), {
24828
24881
  kind: "mutation",
24829
- auth: "admin"
24882
+ auth: "protected"
24830
24883
  }), method(object({
24831
24884
  deviceId: number$1().int().nonnegative(),
24832
24885
  oscillating: boolean()
24833
24886
  }), _void(), {
24834
24887
  kind: "mutation",
24835
- auth: "admin"
24888
+ auth: "protected"
24836
24889
  });
24837
24890
  /**
24838
24891
  * Per-device feature/identity probe slice. Holds the runtime-resolved
@@ -24935,19 +24988,19 @@ DeviceType.Humidifier, method(object({
24935
24988
  on: boolean()
24936
24989
  }), _void(), {
24937
24990
  kind: "mutation",
24938
- auth: "admin"
24991
+ auth: "protected"
24939
24992
  }), method(object({
24940
24993
  deviceId: number$1().int().nonnegative(),
24941
24994
  humidity: number$1().min(0).max(100)
24942
24995
  }), _void(), {
24943
24996
  kind: "mutation",
24944
- auth: "admin"
24997
+ auth: "protected"
24945
24998
  }), method(object({
24946
24999
  deviceId: number$1().int().nonnegative(),
24947
25000
  mode: string().min(1)
24948
25001
  }), _void(), {
24949
25002
  kind: "mutation",
24950
- auth: "admin"
25003
+ auth: "protected"
24951
25004
  });
24952
25005
  object({
24953
25006
  /** Current relative humidity, 0..100. */
@@ -25409,13 +25462,13 @@ object({
25409
25462
  });
25410
25463
  DeviceType.LawnMower, method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
25411
25464
  kind: "mutation",
25412
- auth: "admin"
25465
+ auth: "protected"
25413
25466
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
25414
25467
  kind: "mutation",
25415
- auth: "admin"
25468
+ auth: "protected"
25416
25469
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
25417
25470
  kind: "mutation",
25418
- auth: "admin"
25471
+ auth: "protected"
25419
25472
  });
25420
25473
  /**
25421
25474
  * local-network — hub-only singleton.
@@ -25675,16 +25728,16 @@ DeviceType.Lock, method(object({
25675
25728
  code: string().min(1).optional()
25676
25729
  }), _void(), {
25677
25730
  kind: "mutation",
25678
- auth: "admin"
25731
+ auth: "protected"
25679
25732
  }), method(object({
25680
25733
  deviceId: number$1().int().nonnegative(),
25681
25734
  code: string().min(1).optional()
25682
25735
  }), _void(), {
25683
25736
  kind: "mutation",
25684
- auth: "admin"
25737
+ auth: "protected"
25685
25738
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
25686
25739
  kind: "mutation",
25687
- auth: "admin"
25740
+ auth: "protected"
25688
25741
  });
25689
25742
  /**
25690
25743
  * Media-player cap. Models HA `media_player.*` (Sonos, Chromecast,
@@ -25758,55 +25811,55 @@ object({
25758
25811
  });
25759
25812
  DeviceType.MediaPlayer, method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
25760
25813
  kind: "mutation",
25761
- auth: "admin"
25814
+ auth: "protected"
25762
25815
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
25763
25816
  kind: "mutation",
25764
- auth: "admin"
25817
+ auth: "protected"
25765
25818
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
25766
25819
  kind: "mutation",
25767
- auth: "admin"
25820
+ auth: "protected"
25768
25821
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
25769
25822
  kind: "mutation",
25770
- auth: "admin"
25823
+ auth: "protected"
25771
25824
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
25772
25825
  kind: "mutation",
25773
- auth: "admin"
25826
+ auth: "protected"
25774
25827
  }), method(object({
25775
25828
  deviceId: number$1().int().nonnegative(),
25776
25829
  positionMs: number$1().int().nonnegative()
25777
25830
  }), _void(), {
25778
25831
  kind: "mutation",
25779
- auth: "admin"
25832
+ auth: "protected"
25780
25833
  }), method(object({
25781
25834
  deviceId: number$1().int().nonnegative(),
25782
25835
  volumeLevel: number$1().min(0).max(100)
25783
25836
  }), _void(), {
25784
25837
  kind: "mutation",
25785
- auth: "admin"
25838
+ auth: "protected"
25786
25839
  }), method(object({
25787
25840
  deviceId: number$1().int().nonnegative(),
25788
25841
  muted: boolean()
25789
25842
  }), _void(), {
25790
25843
  kind: "mutation",
25791
- auth: "admin"
25844
+ auth: "protected"
25792
25845
  }), method(object({
25793
25846
  deviceId: number$1().int().nonnegative(),
25794
25847
  shuffle: boolean()
25795
25848
  }), _void(), {
25796
25849
  kind: "mutation",
25797
- auth: "admin"
25850
+ auth: "protected"
25798
25851
  }), method(object({
25799
25852
  deviceId: number$1().int().nonnegative(),
25800
25853
  repeat: MediaPlayerRepeatSchema
25801
25854
  }), _void(), {
25802
25855
  kind: "mutation",
25803
- auth: "admin"
25856
+ auth: "protected"
25804
25857
  }), method(object({
25805
25858
  deviceId: number$1().int().nonnegative(),
25806
25859
  source: string().min(1)
25807
25860
  }), _void(), {
25808
25861
  kind: "mutation",
25809
- auth: "admin"
25862
+ auth: "protected"
25810
25863
  }), method(object({
25811
25864
  deviceId: number$1().int().nonnegative(),
25812
25865
  /** Media identifier / URL. */
@@ -25816,7 +25869,7 @@ DeviceType.MediaPlayer, method(object({ deviceId: number$1().int().nonnegative()
25816
25869
  mediaType: string().min(1)
25817
25870
  }), _void(), {
25818
25871
  kind: "mutation",
25819
- auth: "admin"
25872
+ auth: "protected"
25820
25873
  });
25821
25874
  /**
25822
25875
  * mesh-network — collection cap for mesh-VPN providers.
@@ -26982,49 +27035,49 @@ DeviceType.PetFeeder, method(object({
26982
27035
  hopper2: gramsPortion.optional()
26983
27036
  }), _void(), {
26984
27037
  kind: "mutation",
26985
- auth: "admin"
27038
+ auth: "protected"
26986
27039
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
26987
27040
  kind: "mutation",
26988
- auth: "admin"
27041
+ auth: "protected"
26989
27042
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
26990
27043
  kind: "mutation",
26991
- auth: "admin"
27044
+ auth: "protected"
26992
27045
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
26993
27046
  kind: "mutation",
26994
- auth: "admin"
27047
+ auth: "protected"
26995
27048
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
26996
27049
  kind: "mutation",
26997
- auth: "admin"
27050
+ auth: "protected"
26998
27051
  }), method(object({
26999
27052
  deviceId: number$1().int().nonnegative(),
27000
27053
  soundId: number$1().int().nonnegative()
27001
27054
  }), _void(), {
27002
27055
  kind: "mutation",
27003
- auth: "admin"
27056
+ auth: "protected"
27004
27057
  }), method(object({
27005
27058
  deviceId: number$1().int().nonnegative(),
27006
27059
  on: boolean()
27007
27060
  }), _void(), {
27008
27061
  kind: "mutation",
27009
- auth: "admin"
27062
+ auth: "protected"
27010
27063
  }), method(object({
27011
27064
  deviceId: number$1().int().nonnegative(),
27012
27065
  on: boolean()
27013
27066
  }), _void(), {
27014
27067
  kind: "mutation",
27015
- auth: "admin"
27068
+ auth: "protected"
27016
27069
  }), method(object({
27017
27070
  deviceId: number$1().int().nonnegative(),
27018
27071
  on: boolean()
27019
27072
  }), _void(), {
27020
27073
  kind: "mutation",
27021
- auth: "admin"
27074
+ auth: "protected"
27022
27075
  }), method(object({
27023
27076
  deviceId: number$1().int().nonnegative(),
27024
27077
  level: number$1().int().nonnegative()
27025
27078
  }), _void(), {
27026
27079
  kind: "mutation",
27027
- auth: "admin"
27080
+ auth: "protected"
27028
27081
  });
27029
27082
  var VehicleSchema = object({
27030
27083
  id: string(),
@@ -28811,7 +28864,7 @@ DeviceType.Switch, DeviceType.Siren, DeviceType.Light, method(object({
28811
28864
  on: boolean()
28812
28865
  }), _void(), {
28813
28866
  kind: "mutation",
28814
- auth: "admin"
28867
+ auth: "protected"
28815
28868
  }), object({
28816
28869
  deviceId: number$1(),
28817
28870
  on: boolean(),
@@ -29668,25 +29721,25 @@ object({
29668
29721
  });
29669
29722
  DeviceType.Vacuum, method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
29670
29723
  kind: "mutation",
29671
- auth: "admin"
29724
+ auth: "protected"
29672
29725
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
29673
29726
  kind: "mutation",
29674
- auth: "admin"
29727
+ auth: "protected"
29675
29728
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
29676
29729
  kind: "mutation",
29677
- auth: "admin"
29730
+ auth: "protected"
29678
29731
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
29679
29732
  kind: "mutation",
29680
- auth: "admin"
29733
+ auth: "protected"
29681
29734
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
29682
29735
  kind: "mutation",
29683
- auth: "admin"
29736
+ auth: "protected"
29684
29737
  }), method(object({
29685
29738
  deviceId: number$1().int().nonnegative(),
29686
29739
  speed: string().min(1)
29687
29740
  }), _void(), {
29688
29741
  kind: "mutation",
29689
- auth: "admin"
29742
+ auth: "protected"
29690
29743
  });
29691
29744
  object({
29692
29745
  /** Lifecycle state of the valve. */
@@ -29705,19 +29758,19 @@ object({
29705
29758
  });
29706
29759
  DeviceType.Valve, method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
29707
29760
  kind: "mutation",
29708
- auth: "admin"
29761
+ auth: "protected"
29709
29762
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
29710
29763
  kind: "mutation",
29711
- auth: "admin"
29764
+ auth: "protected"
29712
29765
  }), method(object({ deviceId: number$1().int().nonnegative() }), _void(), {
29713
29766
  kind: "mutation",
29714
- auth: "admin"
29767
+ auth: "protected"
29715
29768
  }), method(object({
29716
29769
  deviceId: number$1().int().nonnegative(),
29717
29770
  position: number$1().min(0).max(100)
29718
29771
  }), _void(), {
29719
29772
  kind: "mutation",
29720
- auth: "admin"
29773
+ auth: "protected"
29721
29774
  });
29722
29775
  object({
29723
29776
  detected: boolean(),
@@ -29751,19 +29804,19 @@ DeviceType.WaterHeater, method(object({
29751
29804
  temp: number$1().finite()
29752
29805
  }), _void(), {
29753
29806
  kind: "mutation",
29754
- auth: "admin"
29807
+ auth: "protected"
29755
29808
  }), method(object({
29756
29809
  deviceId: number$1().int().nonnegative(),
29757
29810
  mode: string().min(1)
29758
29811
  }), _void(), {
29759
29812
  kind: "mutation",
29760
- auth: "admin"
29813
+ auth: "protected"
29761
29814
  }), method(object({
29762
29815
  deviceId: number$1().int().nonnegative(),
29763
29816
  on: boolean()
29764
29817
  }), _void(), {
29765
29818
  kind: "mutation",
29766
- auth: "admin"
29819
+ auth: "protected"
29767
29820
  });
29768
29821
  object({
29769
29822
  /** Verbatim HA condition state (`sunny`, `cloudy`, `rainy`, …). Null
@@ -31855,6 +31908,12 @@ Object.freeze({
31855
31908
  addonId: null,
31856
31909
  access: "create"
31857
31910
  },
31911
+ "faceGallery.auditIdentitySamples": {
31912
+ capName: "face-gallery",
31913
+ capScope: "system",
31914
+ addonId: null,
31915
+ access: "view"
31916
+ },
31858
31917
  "faceGallery.createIdentity": {
31859
31918
  capName: "face-gallery",
31860
31919
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-ai",
3
- "version": "0.4.87",
3
+ "version": "0.4.89",
4
4
  "description": "AI addon for CamStack — the `llm` collection provider (cloud, LAN, and camstack-managed local llama.cpp profiles) plus the per-node `llm-runtime` managed executor.",
5
5
  "keywords": [
6
6
  "camstack",