@camstack/addon-export-google 0.1.48 → 0.1.50

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.
@@ -16077,16 +16077,16 @@ DeviceType.AlarmPanel, method(object({
16077
16077
  code: string().min(1).optional()
16078
16078
  }), _void(), {
16079
16079
  kind: "mutation",
16080
- auth: "admin"
16080
+ auth: "protected"
16081
16081
  }), method(object({
16082
16082
  deviceId: number().int().nonnegative(),
16083
16083
  code: string().min(1).optional()
16084
16084
  }), _void(), {
16085
16085
  kind: "mutation",
16086
- auth: "admin"
16086
+ auth: "protected"
16087
16087
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
16088
16088
  kind: "mutation",
16089
- auth: "admin"
16089
+ auth: "protected"
16090
16090
  });
16091
16091
  /**
16092
16092
  * Shared geometry vocabulary for on-frame shape caps — privacy-mask,
@@ -23769,7 +23769,7 @@ DeviceType.Light, method(object({
23769
23769
  percentage: number().min(0).max(100)
23770
23770
  }), _void(), {
23771
23771
  kind: "mutation",
23772
- auth: "admin"
23772
+ auth: "protected"
23773
23773
  }), object({
23774
23774
  deviceId: number(),
23775
23775
  percentage: number().min(0).max(100),
@@ -23777,7 +23777,7 @@ DeviceType.Light, method(object({
23777
23777
  });
23778
23778
  DeviceType.Button, method(object({ deviceId: number().int().nonnegative() }), _void(), {
23779
23779
  kind: "mutation",
23780
- auth: "admin"
23780
+ auth: "protected"
23781
23781
  });
23782
23782
  /**
23783
23783
  * camera-credentials — device-scoped cap exposing the camera's network
@@ -23936,50 +23936,50 @@ DeviceType.Thermostat, DeviceType.Climate, method(object({
23936
23936
  mode: HvacModeSchema
23937
23937
  }), _void(), {
23938
23938
  kind: "mutation",
23939
- auth: "admin"
23939
+ auth: "protected"
23940
23940
  }), method(object({
23941
23941
  deviceId: number().int().nonnegative(),
23942
23942
  fanMode: string().min(1)
23943
23943
  }), _void(), {
23944
23944
  kind: "mutation",
23945
- auth: "admin"
23945
+ auth: "protected"
23946
23946
  }), method(object({
23947
23947
  deviceId: number().int().nonnegative(),
23948
23948
  preset: string().min(1)
23949
23949
  }), _void(), {
23950
23950
  kind: "mutation",
23951
- auth: "admin"
23951
+ auth: "protected"
23952
23952
  }), method(object({
23953
23953
  deviceId: number().int().nonnegative(),
23954
23954
  target: number()
23955
23955
  }), _void(), {
23956
23956
  kind: "mutation",
23957
- auth: "admin"
23957
+ auth: "protected"
23958
23958
  }), method(object({
23959
23959
  deviceId: number().int().nonnegative(),
23960
23960
  targetLow: number(),
23961
23961
  targetHigh: number()
23962
23962
  }), _void(), {
23963
23963
  kind: "mutation",
23964
- auth: "admin"
23964
+ auth: "protected"
23965
23965
  }), method(object({
23966
23966
  deviceId: number().int().nonnegative(),
23967
23967
  targetHumidity: number().min(0).max(100)
23968
23968
  }), _void(), {
23969
23969
  kind: "mutation",
23970
- auth: "admin"
23970
+ auth: "protected"
23971
23971
  }), method(object({
23972
23972
  deviceId: number().int().nonnegative(),
23973
23973
  on: boolean()
23974
23974
  }), _void(), {
23975
23975
  kind: "mutation",
23976
- auth: "admin"
23976
+ auth: "protected"
23977
23977
  }), method(object({
23978
23978
  deviceId: number().int().nonnegative(),
23979
23979
  on: boolean()
23980
23980
  }), _void(), {
23981
23981
  kind: "mutation",
23982
- auth: "admin"
23982
+ auth: "protected"
23983
23983
  });
23984
23984
  /**
23985
23985
  * Color-light cap. Coexists with `switch` (on/off) and `brightness`
@@ -24054,7 +24054,7 @@ DeviceType.Light, method(object({
24054
24054
  color: ColorInputSchema
24055
24055
  }), _void(), {
24056
24056
  kind: "mutation",
24057
- auth: "admin"
24057
+ auth: "protected"
24058
24058
  }), object({
24059
24059
  deviceId: number(),
24060
24060
  mode: _enum([
@@ -24203,7 +24203,7 @@ DeviceType.Control, method(object({
24203
24203
  control: ControlSetValueInputSchema
24204
24204
  }), _void(), {
24205
24205
  kind: "mutation",
24206
- auth: "admin"
24206
+ auth: "protected"
24207
24207
  });
24208
24208
  var CoverStatusSchema = object({
24209
24209
  /** Lifecycle state of the cover. */
@@ -24224,25 +24224,25 @@ var CoverStatusSchema = object({
24224
24224
  });
24225
24225
  DeviceType.Cover, method(object({ deviceId: number().int().nonnegative() }), _void(), {
24226
24226
  kind: "mutation",
24227
- auth: "admin"
24227
+ auth: "protected"
24228
24228
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
24229
24229
  kind: "mutation",
24230
- auth: "admin"
24230
+ auth: "protected"
24231
24231
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
24232
24232
  kind: "mutation",
24233
- auth: "admin"
24233
+ auth: "protected"
24234
24234
  }), method(object({
24235
24235
  deviceId: number().int().nonnegative(),
24236
24236
  position: number().min(0).max(100)
24237
24237
  }), _void(), {
24238
24238
  kind: "mutation",
24239
- auth: "admin"
24239
+ auth: "protected"
24240
24240
  }), method(object({
24241
24241
  deviceId: number().int().nonnegative(),
24242
24242
  tiltPosition: number().min(0).max(100)
24243
24243
  }), _void(), {
24244
24244
  kind: "mutation",
24245
- auth: "admin"
24245
+ auth: "protected"
24246
24246
  });
24247
24247
  /**
24248
24248
  * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
@@ -24447,6 +24447,59 @@ var IdentitySampleInfoSchema = object({
24447
24447
  deviceId: number().int().optional(),
24448
24448
  base64: string().optional()
24449
24449
  });
24450
+ /**
24451
+ * One enrolled sample, judged against the gallery it lives in.
24452
+ *
24453
+ * The gallery is the one input to recognition nobody re-reads: a sample
24454
+ * enrolled from the wrong face keeps voting forever, and because the matches it
24455
+ * pulls then look confident, nobody goes back. The 2026-09-08 audit found
24456
+ * exactly one such pair on this cluster — a sample scoring 0.61 against three
24457
+ * samples of ANOTHER person, enrolled from the same camera in the same minute,
24458
+ * where every other cross-identity pair sits under 0.50.
24459
+ */
24460
+ var IdentitySampleAuditRowSchema = object({
24461
+ sampleId: string(),
24462
+ enrolledAt: number().int(),
24463
+ deviceId: number().int().optional(),
24464
+ source: _enum(["detected", "photo"]),
24465
+ /** The enrolled crop's media key, so the panel can show the evidence. */
24466
+ mediaKey: string().optional(),
24467
+ /**
24468
+ * False = the sample is stamped with a DIFFERENT face model, and a cosine
24469
+ * across feature spaces is a well-formed float with no meaning. Every number
24470
+ * below then says nothing — it must read as "cannot say", never as an
24471
+ * accusation and never as a clean bill: this list ends in a Remove button.
24472
+ */
24473
+ comparable: boolean(),
24474
+ /** Mean cosine against this person's other samples. Null when there are none
24475
+ * to compare with — never 0, which would read as "opposite". */
24476
+ selfMean: number().nullable(),
24477
+ /** The other person this sample looks most like, when it looks like one.
24478
+ * This is the half that convicts: not looking like yourself can be a hard
24479
+ * angle; looking like someone the gallery can NAME is a mis-enrolment. */
24480
+ bestForeign: object({
24481
+ identityId: string(),
24482
+ name: string(),
24483
+ score: number()
24484
+ }).optional(),
24485
+ /** 0 = nothing to say. Higher = look at this one sooner. */
24486
+ suspicion: number()
24487
+ });
24488
+ var IdentitySampleAuditSchema = object({
24489
+ identityId: string(),
24490
+ name: string(),
24491
+ /** The cluster face model every comparison was made in. */
24492
+ modelId: string(),
24493
+ totalSamples: number().int(),
24494
+ comparableSamples: number().int(),
24495
+ flagged: number().int(),
24496
+ /** The bar `flagged` counts against, so the panel states the RULE and not
24497
+ * only its current result. */
24498
+ flagThreshold: number(),
24499
+ /** Worst first. A row with nothing to say still appears, at the bottom: the
24500
+ * operator asked to see the gallery, not only its accusations. */
24501
+ rows: array(IdentitySampleAuditRowSchema).readonly()
24502
+ });
24450
24503
  var FaceInfoSchema = object({
24451
24504
  faceId: string(),
24452
24505
  deviceId: number().int(),
@@ -24598,7 +24651,7 @@ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly
24598
24651
  }), method(object({ id: string() }), _void(), {
24599
24652
  kind: "mutation",
24600
24653
  auth: "admin"
24601
- }), method(object({ identityId: string() }), array(IdentitySampleInfoSchema).readonly()), method(object({
24654
+ }), method(object({ identityId: string() }), array(IdentitySampleInfoSchema).readonly()), method(object({ identityId: string().min(1) }), IdentitySampleAuditSchema, { auth: "admin" }), method(object({
24602
24655
  identityId: string(),
24603
24656
  sampleId: string()
24604
24657
  }), _void(), {
@@ -24784,25 +24837,25 @@ DeviceType.Fan, method(object({
24784
24837
  percentage: number().min(0).max(100)
24785
24838
  }), _void(), {
24786
24839
  kind: "mutation",
24787
- auth: "admin"
24840
+ auth: "protected"
24788
24841
  }), method(object({
24789
24842
  deviceId: number().int().nonnegative(),
24790
24843
  preset: string().min(1)
24791
24844
  }), _void(), {
24792
24845
  kind: "mutation",
24793
- auth: "admin"
24846
+ auth: "protected"
24794
24847
  }), method(object({
24795
24848
  deviceId: number().int().nonnegative(),
24796
24849
  direction: FanDirectionSchema
24797
24850
  }), _void(), {
24798
24851
  kind: "mutation",
24799
- auth: "admin"
24852
+ auth: "protected"
24800
24853
  }), method(object({
24801
24854
  deviceId: number().int().nonnegative(),
24802
24855
  oscillating: boolean()
24803
24856
  }), _void(), {
24804
24857
  kind: "mutation",
24805
- auth: "admin"
24858
+ auth: "protected"
24806
24859
  });
24807
24860
  /**
24808
24861
  * Per-device feature/identity probe slice. Holds the runtime-resolved
@@ -24905,19 +24958,19 @@ DeviceType.Humidifier, method(object({
24905
24958
  on: boolean()
24906
24959
  }), _void(), {
24907
24960
  kind: "mutation",
24908
- auth: "admin"
24961
+ auth: "protected"
24909
24962
  }), method(object({
24910
24963
  deviceId: number().int().nonnegative(),
24911
24964
  humidity: number().min(0).max(100)
24912
24965
  }), _void(), {
24913
24966
  kind: "mutation",
24914
- auth: "admin"
24967
+ auth: "protected"
24915
24968
  }), method(object({
24916
24969
  deviceId: number().int().nonnegative(),
24917
24970
  mode: string().min(1)
24918
24971
  }), _void(), {
24919
24972
  kind: "mutation",
24920
- auth: "admin"
24973
+ auth: "protected"
24921
24974
  });
24922
24975
  object({
24923
24976
  /** Current relative humidity, 0..100. */
@@ -25379,13 +25432,13 @@ object({
25379
25432
  });
25380
25433
  DeviceType.LawnMower, method(object({ deviceId: number().int().nonnegative() }), _void(), {
25381
25434
  kind: "mutation",
25382
- auth: "admin"
25435
+ auth: "protected"
25383
25436
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25384
25437
  kind: "mutation",
25385
- auth: "admin"
25438
+ auth: "protected"
25386
25439
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25387
25440
  kind: "mutation",
25388
- auth: "admin"
25441
+ auth: "protected"
25389
25442
  });
25390
25443
  /**
25391
25444
  * local-network — hub-only singleton.
@@ -25645,16 +25698,16 @@ DeviceType.Lock, method(object({
25645
25698
  code: string().min(1).optional()
25646
25699
  }), _void(), {
25647
25700
  kind: "mutation",
25648
- auth: "admin"
25701
+ auth: "protected"
25649
25702
  }), method(object({
25650
25703
  deviceId: number().int().nonnegative(),
25651
25704
  code: string().min(1).optional()
25652
25705
  }), _void(), {
25653
25706
  kind: "mutation",
25654
- auth: "admin"
25707
+ auth: "protected"
25655
25708
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25656
25709
  kind: "mutation",
25657
- auth: "admin"
25710
+ auth: "protected"
25658
25711
  });
25659
25712
  /**
25660
25713
  * Media-player cap. Models HA `media_player.*` (Sonos, Chromecast,
@@ -25728,55 +25781,55 @@ object({
25728
25781
  });
25729
25782
  DeviceType.MediaPlayer, method(object({ deviceId: number().int().nonnegative() }), _void(), {
25730
25783
  kind: "mutation",
25731
- auth: "admin"
25784
+ auth: "protected"
25732
25785
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25733
25786
  kind: "mutation",
25734
- auth: "admin"
25787
+ auth: "protected"
25735
25788
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25736
25789
  kind: "mutation",
25737
- auth: "admin"
25790
+ auth: "protected"
25738
25791
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25739
25792
  kind: "mutation",
25740
- auth: "admin"
25793
+ auth: "protected"
25741
25794
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25742
25795
  kind: "mutation",
25743
- auth: "admin"
25796
+ auth: "protected"
25744
25797
  }), method(object({
25745
25798
  deviceId: number().int().nonnegative(),
25746
25799
  positionMs: number().int().nonnegative()
25747
25800
  }), _void(), {
25748
25801
  kind: "mutation",
25749
- auth: "admin"
25802
+ auth: "protected"
25750
25803
  }), method(object({
25751
25804
  deviceId: number().int().nonnegative(),
25752
25805
  volumeLevel: number().min(0).max(100)
25753
25806
  }), _void(), {
25754
25807
  kind: "mutation",
25755
- auth: "admin"
25808
+ auth: "protected"
25756
25809
  }), method(object({
25757
25810
  deviceId: number().int().nonnegative(),
25758
25811
  muted: boolean()
25759
25812
  }), _void(), {
25760
25813
  kind: "mutation",
25761
- auth: "admin"
25814
+ auth: "protected"
25762
25815
  }), method(object({
25763
25816
  deviceId: number().int().nonnegative(),
25764
25817
  shuffle: boolean()
25765
25818
  }), _void(), {
25766
25819
  kind: "mutation",
25767
- auth: "admin"
25820
+ auth: "protected"
25768
25821
  }), method(object({
25769
25822
  deviceId: number().int().nonnegative(),
25770
25823
  repeat: MediaPlayerRepeatSchema
25771
25824
  }), _void(), {
25772
25825
  kind: "mutation",
25773
- auth: "admin"
25826
+ auth: "protected"
25774
25827
  }), method(object({
25775
25828
  deviceId: number().int().nonnegative(),
25776
25829
  source: string().min(1)
25777
25830
  }), _void(), {
25778
25831
  kind: "mutation",
25779
- auth: "admin"
25832
+ auth: "protected"
25780
25833
  }), method(object({
25781
25834
  deviceId: number().int().nonnegative(),
25782
25835
  /** Media identifier / URL. */
@@ -25786,7 +25839,7 @@ DeviceType.MediaPlayer, method(object({ deviceId: number().int().nonnegative() }
25786
25839
  mediaType: string().min(1)
25787
25840
  }), _void(), {
25788
25841
  kind: "mutation",
25789
- auth: "admin"
25842
+ auth: "protected"
25790
25843
  });
25791
25844
  /**
25792
25845
  * mesh-network — collection cap for mesh-VPN providers.
@@ -26952,49 +27005,49 @@ DeviceType.PetFeeder, method(object({
26952
27005
  hopper2: gramsPortion.optional()
26953
27006
  }), _void(), {
26954
27007
  kind: "mutation",
26955
- auth: "admin"
27008
+ auth: "protected"
26956
27009
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
26957
27010
  kind: "mutation",
26958
- auth: "admin"
27011
+ auth: "protected"
26959
27012
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
26960
27013
  kind: "mutation",
26961
- auth: "admin"
27014
+ auth: "protected"
26962
27015
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
26963
27016
  kind: "mutation",
26964
- auth: "admin"
27017
+ auth: "protected"
26965
27018
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
26966
27019
  kind: "mutation",
26967
- auth: "admin"
27020
+ auth: "protected"
26968
27021
  }), method(object({
26969
27022
  deviceId: number().int().nonnegative(),
26970
27023
  soundId: number().int().nonnegative()
26971
27024
  }), _void(), {
26972
27025
  kind: "mutation",
26973
- auth: "admin"
27026
+ auth: "protected"
26974
27027
  }), method(object({
26975
27028
  deviceId: number().int().nonnegative(),
26976
27029
  on: boolean()
26977
27030
  }), _void(), {
26978
27031
  kind: "mutation",
26979
- auth: "admin"
27032
+ auth: "protected"
26980
27033
  }), method(object({
26981
27034
  deviceId: number().int().nonnegative(),
26982
27035
  on: boolean()
26983
27036
  }), _void(), {
26984
27037
  kind: "mutation",
26985
- auth: "admin"
27038
+ auth: "protected"
26986
27039
  }), method(object({
26987
27040
  deviceId: number().int().nonnegative(),
26988
27041
  on: boolean()
26989
27042
  }), _void(), {
26990
27043
  kind: "mutation",
26991
- auth: "admin"
27044
+ auth: "protected"
26992
27045
  }), method(object({
26993
27046
  deviceId: number().int().nonnegative(),
26994
27047
  level: number().int().nonnegative()
26995
27048
  }), _void(), {
26996
27049
  kind: "mutation",
26997
- auth: "admin"
27050
+ auth: "protected"
26998
27051
  });
26999
27052
  var VehicleSchema = object({
27000
27053
  id: string(),
@@ -28788,7 +28841,7 @@ DeviceType.Switch, DeviceType.Siren, DeviceType.Light, method(object({
28788
28841
  on: boolean()
28789
28842
  }), _void(), {
28790
28843
  kind: "mutation",
28791
- auth: "admin"
28844
+ auth: "protected"
28792
28845
  }), object({
28793
28846
  deviceId: number(),
28794
28847
  on: boolean(),
@@ -29645,25 +29698,25 @@ object({
29645
29698
  });
29646
29699
  DeviceType.Vacuum, method(object({ deviceId: number().int().nonnegative() }), _void(), {
29647
29700
  kind: "mutation",
29648
- auth: "admin"
29701
+ auth: "protected"
29649
29702
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
29650
29703
  kind: "mutation",
29651
- auth: "admin"
29704
+ auth: "protected"
29652
29705
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
29653
29706
  kind: "mutation",
29654
- auth: "admin"
29707
+ auth: "protected"
29655
29708
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
29656
29709
  kind: "mutation",
29657
- auth: "admin"
29710
+ auth: "protected"
29658
29711
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
29659
29712
  kind: "mutation",
29660
- auth: "admin"
29713
+ auth: "protected"
29661
29714
  }), method(object({
29662
29715
  deviceId: number().int().nonnegative(),
29663
29716
  speed: string().min(1)
29664
29717
  }), _void(), {
29665
29718
  kind: "mutation",
29666
- auth: "admin"
29719
+ auth: "protected"
29667
29720
  });
29668
29721
  object({
29669
29722
  /** Lifecycle state of the valve. */
@@ -29682,19 +29735,19 @@ object({
29682
29735
  });
29683
29736
  DeviceType.Valve, method(object({ deviceId: number().int().nonnegative() }), _void(), {
29684
29737
  kind: "mutation",
29685
- auth: "admin"
29738
+ auth: "protected"
29686
29739
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
29687
29740
  kind: "mutation",
29688
- auth: "admin"
29741
+ auth: "protected"
29689
29742
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
29690
29743
  kind: "mutation",
29691
- auth: "admin"
29744
+ auth: "protected"
29692
29745
  }), method(object({
29693
29746
  deviceId: number().int().nonnegative(),
29694
29747
  position: number().min(0).max(100)
29695
29748
  }), _void(), {
29696
29749
  kind: "mutation",
29697
- auth: "admin"
29750
+ auth: "protected"
29698
29751
  });
29699
29752
  object({
29700
29753
  detected: boolean(),
@@ -29728,19 +29781,19 @@ DeviceType.WaterHeater, method(object({
29728
29781
  temp: number().finite()
29729
29782
  }), _void(), {
29730
29783
  kind: "mutation",
29731
- auth: "admin"
29784
+ auth: "protected"
29732
29785
  }), method(object({
29733
29786
  deviceId: number().int().nonnegative(),
29734
29787
  mode: string().min(1)
29735
29788
  }), _void(), {
29736
29789
  kind: "mutation",
29737
- auth: "admin"
29790
+ auth: "protected"
29738
29791
  }), method(object({
29739
29792
  deviceId: number().int().nonnegative(),
29740
29793
  on: boolean()
29741
29794
  }), _void(), {
29742
29795
  kind: "mutation",
29743
- auth: "admin"
29796
+ auth: "protected"
29744
29797
  });
29745
29798
  object({
29746
29799
  /** Verbatim HA condition state (`sunny`, `cloudy`, `rainy`, …). Null
@@ -31832,6 +31885,12 @@ Object.freeze({
31832
31885
  addonId: null,
31833
31886
  access: "create"
31834
31887
  },
31888
+ "faceGallery.auditIdentitySamples": {
31889
+ capName: "face-gallery",
31890
+ capScope: "system",
31891
+ addonId: null,
31892
+ access: "view"
31893
+ },
31835
31894
  "faceGallery.createIdentity": {
31836
31895
  capName: "face-gallery",
31837
31896
  capScope: "system",
@@ -16073,16 +16073,16 @@ DeviceType.AlarmPanel, method(object({
16073
16073
  code: string().min(1).optional()
16074
16074
  }), _void(), {
16075
16075
  kind: "mutation",
16076
- auth: "admin"
16076
+ auth: "protected"
16077
16077
  }), method(object({
16078
16078
  deviceId: number().int().nonnegative(),
16079
16079
  code: string().min(1).optional()
16080
16080
  }), _void(), {
16081
16081
  kind: "mutation",
16082
- auth: "admin"
16082
+ auth: "protected"
16083
16083
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
16084
16084
  kind: "mutation",
16085
- auth: "admin"
16085
+ auth: "protected"
16086
16086
  });
16087
16087
  /**
16088
16088
  * Shared geometry vocabulary for on-frame shape caps — privacy-mask,
@@ -23765,7 +23765,7 @@ DeviceType.Light, method(object({
23765
23765
  percentage: number().min(0).max(100)
23766
23766
  }), _void(), {
23767
23767
  kind: "mutation",
23768
- auth: "admin"
23768
+ auth: "protected"
23769
23769
  }), object({
23770
23770
  deviceId: number(),
23771
23771
  percentage: number().min(0).max(100),
@@ -23773,7 +23773,7 @@ DeviceType.Light, method(object({
23773
23773
  });
23774
23774
  DeviceType.Button, method(object({ deviceId: number().int().nonnegative() }), _void(), {
23775
23775
  kind: "mutation",
23776
- auth: "admin"
23776
+ auth: "protected"
23777
23777
  });
23778
23778
  /**
23779
23779
  * camera-credentials — device-scoped cap exposing the camera's network
@@ -23932,50 +23932,50 @@ DeviceType.Thermostat, DeviceType.Climate, method(object({
23932
23932
  mode: HvacModeSchema
23933
23933
  }), _void(), {
23934
23934
  kind: "mutation",
23935
- auth: "admin"
23935
+ auth: "protected"
23936
23936
  }), method(object({
23937
23937
  deviceId: number().int().nonnegative(),
23938
23938
  fanMode: string().min(1)
23939
23939
  }), _void(), {
23940
23940
  kind: "mutation",
23941
- auth: "admin"
23941
+ auth: "protected"
23942
23942
  }), method(object({
23943
23943
  deviceId: number().int().nonnegative(),
23944
23944
  preset: string().min(1)
23945
23945
  }), _void(), {
23946
23946
  kind: "mutation",
23947
- auth: "admin"
23947
+ auth: "protected"
23948
23948
  }), method(object({
23949
23949
  deviceId: number().int().nonnegative(),
23950
23950
  target: number()
23951
23951
  }), _void(), {
23952
23952
  kind: "mutation",
23953
- auth: "admin"
23953
+ auth: "protected"
23954
23954
  }), method(object({
23955
23955
  deviceId: number().int().nonnegative(),
23956
23956
  targetLow: number(),
23957
23957
  targetHigh: number()
23958
23958
  }), _void(), {
23959
23959
  kind: "mutation",
23960
- auth: "admin"
23960
+ auth: "protected"
23961
23961
  }), method(object({
23962
23962
  deviceId: number().int().nonnegative(),
23963
23963
  targetHumidity: number().min(0).max(100)
23964
23964
  }), _void(), {
23965
23965
  kind: "mutation",
23966
- auth: "admin"
23966
+ auth: "protected"
23967
23967
  }), method(object({
23968
23968
  deviceId: number().int().nonnegative(),
23969
23969
  on: boolean()
23970
23970
  }), _void(), {
23971
23971
  kind: "mutation",
23972
- auth: "admin"
23972
+ auth: "protected"
23973
23973
  }), method(object({
23974
23974
  deviceId: number().int().nonnegative(),
23975
23975
  on: boolean()
23976
23976
  }), _void(), {
23977
23977
  kind: "mutation",
23978
- auth: "admin"
23978
+ auth: "protected"
23979
23979
  });
23980
23980
  /**
23981
23981
  * Color-light cap. Coexists with `switch` (on/off) and `brightness`
@@ -24050,7 +24050,7 @@ DeviceType.Light, method(object({
24050
24050
  color: ColorInputSchema
24051
24051
  }), _void(), {
24052
24052
  kind: "mutation",
24053
- auth: "admin"
24053
+ auth: "protected"
24054
24054
  }), object({
24055
24055
  deviceId: number(),
24056
24056
  mode: _enum([
@@ -24199,7 +24199,7 @@ DeviceType.Control, method(object({
24199
24199
  control: ControlSetValueInputSchema
24200
24200
  }), _void(), {
24201
24201
  kind: "mutation",
24202
- auth: "admin"
24202
+ auth: "protected"
24203
24203
  });
24204
24204
  var CoverStatusSchema = object({
24205
24205
  /** Lifecycle state of the cover. */
@@ -24220,25 +24220,25 @@ var CoverStatusSchema = object({
24220
24220
  });
24221
24221
  DeviceType.Cover, method(object({ deviceId: number().int().nonnegative() }), _void(), {
24222
24222
  kind: "mutation",
24223
- auth: "admin"
24223
+ auth: "protected"
24224
24224
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
24225
24225
  kind: "mutation",
24226
- auth: "admin"
24226
+ auth: "protected"
24227
24227
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
24228
24228
  kind: "mutation",
24229
- auth: "admin"
24229
+ auth: "protected"
24230
24230
  }), method(object({
24231
24231
  deviceId: number().int().nonnegative(),
24232
24232
  position: number().min(0).max(100)
24233
24233
  }), _void(), {
24234
24234
  kind: "mutation",
24235
- auth: "admin"
24235
+ auth: "protected"
24236
24236
  }), method(object({
24237
24237
  deviceId: number().int().nonnegative(),
24238
24238
  tiltPosition: number().min(0).max(100)
24239
24239
  }), _void(), {
24240
24240
  kind: "mutation",
24241
- auth: "admin"
24241
+ auth: "protected"
24242
24242
  });
24243
24243
  /**
24244
24244
  * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
@@ -24443,6 +24443,59 @@ var IdentitySampleInfoSchema = object({
24443
24443
  deviceId: number().int().optional(),
24444
24444
  base64: string().optional()
24445
24445
  });
24446
+ /**
24447
+ * One enrolled sample, judged against the gallery it lives in.
24448
+ *
24449
+ * The gallery is the one input to recognition nobody re-reads: a sample
24450
+ * enrolled from the wrong face keeps voting forever, and because the matches it
24451
+ * pulls then look confident, nobody goes back. The 2026-09-08 audit found
24452
+ * exactly one such pair on this cluster — a sample scoring 0.61 against three
24453
+ * samples of ANOTHER person, enrolled from the same camera in the same minute,
24454
+ * where every other cross-identity pair sits under 0.50.
24455
+ */
24456
+ var IdentitySampleAuditRowSchema = object({
24457
+ sampleId: string(),
24458
+ enrolledAt: number().int(),
24459
+ deviceId: number().int().optional(),
24460
+ source: _enum(["detected", "photo"]),
24461
+ /** The enrolled crop's media key, so the panel can show the evidence. */
24462
+ mediaKey: string().optional(),
24463
+ /**
24464
+ * False = the sample is stamped with a DIFFERENT face model, and a cosine
24465
+ * across feature spaces is a well-formed float with no meaning. Every number
24466
+ * below then says nothing — it must read as "cannot say", never as an
24467
+ * accusation and never as a clean bill: this list ends in a Remove button.
24468
+ */
24469
+ comparable: boolean(),
24470
+ /** Mean cosine against this person's other samples. Null when there are none
24471
+ * to compare with — never 0, which would read as "opposite". */
24472
+ selfMean: number().nullable(),
24473
+ /** The other person this sample looks most like, when it looks like one.
24474
+ * This is the half that convicts: not looking like yourself can be a hard
24475
+ * angle; looking like someone the gallery can NAME is a mis-enrolment. */
24476
+ bestForeign: object({
24477
+ identityId: string(),
24478
+ name: string(),
24479
+ score: number()
24480
+ }).optional(),
24481
+ /** 0 = nothing to say. Higher = look at this one sooner. */
24482
+ suspicion: number()
24483
+ });
24484
+ var IdentitySampleAuditSchema = object({
24485
+ identityId: string(),
24486
+ name: string(),
24487
+ /** The cluster face model every comparison was made in. */
24488
+ modelId: string(),
24489
+ totalSamples: number().int(),
24490
+ comparableSamples: number().int(),
24491
+ flagged: number().int(),
24492
+ /** The bar `flagged` counts against, so the panel states the RULE and not
24493
+ * only its current result. */
24494
+ flagThreshold: number(),
24495
+ /** Worst first. A row with nothing to say still appears, at the bottom: the
24496
+ * operator asked to see the gallery, not only its accusations. */
24497
+ rows: array(IdentitySampleAuditRowSchema).readonly()
24498
+ });
24446
24499
  var FaceInfoSchema = object({
24447
24500
  faceId: string(),
24448
24501
  deviceId: number().int(),
@@ -24594,7 +24647,7 @@ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly
24594
24647
  }), method(object({ id: string() }), _void(), {
24595
24648
  kind: "mutation",
24596
24649
  auth: "admin"
24597
- }), method(object({ identityId: string() }), array(IdentitySampleInfoSchema).readonly()), method(object({
24650
+ }), method(object({ identityId: string() }), array(IdentitySampleInfoSchema).readonly()), method(object({ identityId: string().min(1) }), IdentitySampleAuditSchema, { auth: "admin" }), method(object({
24598
24651
  identityId: string(),
24599
24652
  sampleId: string()
24600
24653
  }), _void(), {
@@ -24780,25 +24833,25 @@ DeviceType.Fan, method(object({
24780
24833
  percentage: number().min(0).max(100)
24781
24834
  }), _void(), {
24782
24835
  kind: "mutation",
24783
- auth: "admin"
24836
+ auth: "protected"
24784
24837
  }), method(object({
24785
24838
  deviceId: number().int().nonnegative(),
24786
24839
  preset: string().min(1)
24787
24840
  }), _void(), {
24788
24841
  kind: "mutation",
24789
- auth: "admin"
24842
+ auth: "protected"
24790
24843
  }), method(object({
24791
24844
  deviceId: number().int().nonnegative(),
24792
24845
  direction: FanDirectionSchema
24793
24846
  }), _void(), {
24794
24847
  kind: "mutation",
24795
- auth: "admin"
24848
+ auth: "protected"
24796
24849
  }), method(object({
24797
24850
  deviceId: number().int().nonnegative(),
24798
24851
  oscillating: boolean()
24799
24852
  }), _void(), {
24800
24853
  kind: "mutation",
24801
- auth: "admin"
24854
+ auth: "protected"
24802
24855
  });
24803
24856
  /**
24804
24857
  * Per-device feature/identity probe slice. Holds the runtime-resolved
@@ -24901,19 +24954,19 @@ DeviceType.Humidifier, method(object({
24901
24954
  on: boolean()
24902
24955
  }), _void(), {
24903
24956
  kind: "mutation",
24904
- auth: "admin"
24957
+ auth: "protected"
24905
24958
  }), method(object({
24906
24959
  deviceId: number().int().nonnegative(),
24907
24960
  humidity: number().min(0).max(100)
24908
24961
  }), _void(), {
24909
24962
  kind: "mutation",
24910
- auth: "admin"
24963
+ auth: "protected"
24911
24964
  }), method(object({
24912
24965
  deviceId: number().int().nonnegative(),
24913
24966
  mode: string().min(1)
24914
24967
  }), _void(), {
24915
24968
  kind: "mutation",
24916
- auth: "admin"
24969
+ auth: "protected"
24917
24970
  });
24918
24971
  object({
24919
24972
  /** Current relative humidity, 0..100. */
@@ -25375,13 +25428,13 @@ object({
25375
25428
  });
25376
25429
  DeviceType.LawnMower, method(object({ deviceId: number().int().nonnegative() }), _void(), {
25377
25430
  kind: "mutation",
25378
- auth: "admin"
25431
+ auth: "protected"
25379
25432
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25380
25433
  kind: "mutation",
25381
- auth: "admin"
25434
+ auth: "protected"
25382
25435
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25383
25436
  kind: "mutation",
25384
- auth: "admin"
25437
+ auth: "protected"
25385
25438
  });
25386
25439
  /**
25387
25440
  * local-network — hub-only singleton.
@@ -25641,16 +25694,16 @@ DeviceType.Lock, method(object({
25641
25694
  code: string().min(1).optional()
25642
25695
  }), _void(), {
25643
25696
  kind: "mutation",
25644
- auth: "admin"
25697
+ auth: "protected"
25645
25698
  }), method(object({
25646
25699
  deviceId: number().int().nonnegative(),
25647
25700
  code: string().min(1).optional()
25648
25701
  }), _void(), {
25649
25702
  kind: "mutation",
25650
- auth: "admin"
25703
+ auth: "protected"
25651
25704
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25652
25705
  kind: "mutation",
25653
- auth: "admin"
25706
+ auth: "protected"
25654
25707
  });
25655
25708
  /**
25656
25709
  * Media-player cap. Models HA `media_player.*` (Sonos, Chromecast,
@@ -25724,55 +25777,55 @@ object({
25724
25777
  });
25725
25778
  DeviceType.MediaPlayer, method(object({ deviceId: number().int().nonnegative() }), _void(), {
25726
25779
  kind: "mutation",
25727
- auth: "admin"
25780
+ auth: "protected"
25728
25781
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25729
25782
  kind: "mutation",
25730
- auth: "admin"
25783
+ auth: "protected"
25731
25784
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25732
25785
  kind: "mutation",
25733
- auth: "admin"
25786
+ auth: "protected"
25734
25787
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25735
25788
  kind: "mutation",
25736
- auth: "admin"
25789
+ auth: "protected"
25737
25790
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
25738
25791
  kind: "mutation",
25739
- auth: "admin"
25792
+ auth: "protected"
25740
25793
  }), method(object({
25741
25794
  deviceId: number().int().nonnegative(),
25742
25795
  positionMs: number().int().nonnegative()
25743
25796
  }), _void(), {
25744
25797
  kind: "mutation",
25745
- auth: "admin"
25798
+ auth: "protected"
25746
25799
  }), method(object({
25747
25800
  deviceId: number().int().nonnegative(),
25748
25801
  volumeLevel: number().min(0).max(100)
25749
25802
  }), _void(), {
25750
25803
  kind: "mutation",
25751
- auth: "admin"
25804
+ auth: "protected"
25752
25805
  }), method(object({
25753
25806
  deviceId: number().int().nonnegative(),
25754
25807
  muted: boolean()
25755
25808
  }), _void(), {
25756
25809
  kind: "mutation",
25757
- auth: "admin"
25810
+ auth: "protected"
25758
25811
  }), method(object({
25759
25812
  deviceId: number().int().nonnegative(),
25760
25813
  shuffle: boolean()
25761
25814
  }), _void(), {
25762
25815
  kind: "mutation",
25763
- auth: "admin"
25816
+ auth: "protected"
25764
25817
  }), method(object({
25765
25818
  deviceId: number().int().nonnegative(),
25766
25819
  repeat: MediaPlayerRepeatSchema
25767
25820
  }), _void(), {
25768
25821
  kind: "mutation",
25769
- auth: "admin"
25822
+ auth: "protected"
25770
25823
  }), method(object({
25771
25824
  deviceId: number().int().nonnegative(),
25772
25825
  source: string().min(1)
25773
25826
  }), _void(), {
25774
25827
  kind: "mutation",
25775
- auth: "admin"
25828
+ auth: "protected"
25776
25829
  }), method(object({
25777
25830
  deviceId: number().int().nonnegative(),
25778
25831
  /** Media identifier / URL. */
@@ -25782,7 +25835,7 @@ DeviceType.MediaPlayer, method(object({ deviceId: number().int().nonnegative() }
25782
25835
  mediaType: string().min(1)
25783
25836
  }), _void(), {
25784
25837
  kind: "mutation",
25785
- auth: "admin"
25838
+ auth: "protected"
25786
25839
  });
25787
25840
  /**
25788
25841
  * mesh-network — collection cap for mesh-VPN providers.
@@ -26948,49 +27001,49 @@ DeviceType.PetFeeder, method(object({
26948
27001
  hopper2: gramsPortion.optional()
26949
27002
  }), _void(), {
26950
27003
  kind: "mutation",
26951
- auth: "admin"
27004
+ auth: "protected"
26952
27005
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
26953
27006
  kind: "mutation",
26954
- auth: "admin"
27007
+ auth: "protected"
26955
27008
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
26956
27009
  kind: "mutation",
26957
- auth: "admin"
27010
+ auth: "protected"
26958
27011
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
26959
27012
  kind: "mutation",
26960
- auth: "admin"
27013
+ auth: "protected"
26961
27014
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
26962
27015
  kind: "mutation",
26963
- auth: "admin"
27016
+ auth: "protected"
26964
27017
  }), method(object({
26965
27018
  deviceId: number().int().nonnegative(),
26966
27019
  soundId: number().int().nonnegative()
26967
27020
  }), _void(), {
26968
27021
  kind: "mutation",
26969
- auth: "admin"
27022
+ auth: "protected"
26970
27023
  }), method(object({
26971
27024
  deviceId: number().int().nonnegative(),
26972
27025
  on: boolean()
26973
27026
  }), _void(), {
26974
27027
  kind: "mutation",
26975
- auth: "admin"
27028
+ auth: "protected"
26976
27029
  }), method(object({
26977
27030
  deviceId: number().int().nonnegative(),
26978
27031
  on: boolean()
26979
27032
  }), _void(), {
26980
27033
  kind: "mutation",
26981
- auth: "admin"
27034
+ auth: "protected"
26982
27035
  }), method(object({
26983
27036
  deviceId: number().int().nonnegative(),
26984
27037
  on: boolean()
26985
27038
  }), _void(), {
26986
27039
  kind: "mutation",
26987
- auth: "admin"
27040
+ auth: "protected"
26988
27041
  }), method(object({
26989
27042
  deviceId: number().int().nonnegative(),
26990
27043
  level: number().int().nonnegative()
26991
27044
  }), _void(), {
26992
27045
  kind: "mutation",
26993
- auth: "admin"
27046
+ auth: "protected"
26994
27047
  });
26995
27048
  var VehicleSchema = object({
26996
27049
  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(),
28790
28843
  on: boolean(),
@@ -29641,25 +29694,25 @@ object({
29641
29694
  });
29642
29695
  DeviceType.Vacuum, method(object({ deviceId: number().int().nonnegative() }), _void(), {
29643
29696
  kind: "mutation",
29644
- auth: "admin"
29697
+ auth: "protected"
29645
29698
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
29646
29699
  kind: "mutation",
29647
- auth: "admin"
29700
+ auth: "protected"
29648
29701
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
29649
29702
  kind: "mutation",
29650
- auth: "admin"
29703
+ auth: "protected"
29651
29704
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
29652
29705
  kind: "mutation",
29653
- auth: "admin"
29706
+ auth: "protected"
29654
29707
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
29655
29708
  kind: "mutation",
29656
- auth: "admin"
29709
+ auth: "protected"
29657
29710
  }), method(object({
29658
29711
  deviceId: number().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().int().nonnegative() }), _void(), {
29680
29733
  kind: "mutation",
29681
- auth: "admin"
29734
+ auth: "protected"
29682
29735
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
29683
29736
  kind: "mutation",
29684
- auth: "admin"
29737
+ auth: "protected"
29685
29738
  }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
29686
29739
  kind: "mutation",
29687
- auth: "admin"
29740
+ auth: "protected"
29688
29741
  }), method(object({
29689
29742
  deviceId: number().int().nonnegative(),
29690
29743
  position: number().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().finite()
29725
29778
  }), _void(), {
29726
29779
  kind: "mutation",
29727
- auth: "admin"
29780
+ auth: "protected"
29728
29781
  }), method(object({
29729
29782
  deviceId: number().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().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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-export-google",
3
- "version": "0.1.48",
3
+ "version": "0.1.50",
4
4
  "description": "Google Home export — hub-side smart-home fulfillment (SYNC / QUERY / EXECUTE / DISCONNECT) for the non-camera fleet, served over the hub's own OAuth account link. No Google credential is stored, sent or required.",
5
5
  "keywords": [
6
6
  "camstack",