@camstack/addon-provider-petkit 0.2.84 → 0.2.85

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/addon.js CHANGED
@@ -26378,6 +26378,59 @@ var IdentitySampleInfoSchema = object({
26378
26378
  deviceId: number().int().optional(),
26379
26379
  base64: string().optional()
26380
26380
  });
26381
+ /**
26382
+ * One enrolled sample, judged against the gallery it lives in.
26383
+ *
26384
+ * The gallery is the one input to recognition nobody re-reads: a sample
26385
+ * enrolled from the wrong face keeps voting forever, and because the matches it
26386
+ * pulls then look confident, nobody goes back. The 2026-09-08 audit found
26387
+ * exactly one such pair on this cluster — a sample scoring 0.61 against three
26388
+ * samples of ANOTHER person, enrolled from the same camera in the same minute,
26389
+ * where every other cross-identity pair sits under 0.50.
26390
+ */
26391
+ var IdentitySampleAuditRowSchema = object({
26392
+ sampleId: string(),
26393
+ enrolledAt: number().int(),
26394
+ deviceId: number().int().optional(),
26395
+ source: _enum(["detected", "photo"]),
26396
+ /** The enrolled crop's media key, so the panel can show the evidence. */
26397
+ mediaKey: string().optional(),
26398
+ /**
26399
+ * False = the sample is stamped with a DIFFERENT face model, and a cosine
26400
+ * across feature spaces is a well-formed float with no meaning. Every number
26401
+ * below then says nothing — it must read as "cannot say", never as an
26402
+ * accusation and never as a clean bill: this list ends in a Remove button.
26403
+ */
26404
+ comparable: boolean(),
26405
+ /** Mean cosine against this person's other samples. Null when there are none
26406
+ * to compare with — never 0, which would read as "opposite". */
26407
+ selfMean: number().nullable(),
26408
+ /** The other person this sample looks most like, when it looks like one.
26409
+ * This is the half that convicts: not looking like yourself can be a hard
26410
+ * angle; looking like someone the gallery can NAME is a mis-enrolment. */
26411
+ bestForeign: object({
26412
+ identityId: string(),
26413
+ name: string(),
26414
+ score: number()
26415
+ }).optional(),
26416
+ /** 0 = nothing to say. Higher = look at this one sooner. */
26417
+ suspicion: number()
26418
+ });
26419
+ var IdentitySampleAuditSchema = object({
26420
+ identityId: string(),
26421
+ name: string(),
26422
+ /** The cluster face model every comparison was made in. */
26423
+ modelId: string(),
26424
+ totalSamples: number().int(),
26425
+ comparableSamples: number().int(),
26426
+ flagged: number().int(),
26427
+ /** The bar `flagged` counts against, so the panel states the RULE and not
26428
+ * only its current result. */
26429
+ flagThreshold: number(),
26430
+ /** Worst first. A row with nothing to say still appears, at the bottom: the
26431
+ * operator asked to see the gallery, not only its accusations. */
26432
+ rows: array(IdentitySampleAuditRowSchema).readonly()
26433
+ });
26381
26434
  var FaceInfoSchema = object({
26382
26435
  faceId: string(),
26383
26436
  deviceId: number().int(),
@@ -26529,7 +26582,7 @@ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly
26529
26582
  }), method(object({ id: string() }), _void(), {
26530
26583
  kind: "mutation",
26531
26584
  auth: "admin"
26532
- }), method(object({ identityId: string() }), array(IdentitySampleInfoSchema).readonly()), method(object({
26585
+ }), method(object({ identityId: string() }), array(IdentitySampleInfoSchema).readonly()), method(object({ identityId: string().min(1) }), IdentitySampleAuditSchema, { auth: "admin" }), method(object({
26533
26586
  identityId: string(),
26534
26587
  sampleId: string()
26535
26588
  }), _void(), {
@@ -37022,6 +37075,12 @@ Object.freeze({
37022
37075
  addonId: null,
37023
37076
  access: "create"
37024
37077
  },
37078
+ "faceGallery.auditIdentitySamples": {
37079
+ capName: "face-gallery",
37080
+ capScope: "system",
37081
+ addonId: null,
37082
+ access: "view"
37083
+ },
37025
37084
  "faceGallery.createIdentity": {
37026
37085
  capName: "face-gallery",
37027
37086
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -26377,6 +26377,59 @@ var IdentitySampleInfoSchema = object({
26377
26377
  deviceId: number().int().optional(),
26378
26378
  base64: string().optional()
26379
26379
  });
26380
+ /**
26381
+ * One enrolled sample, judged against the gallery it lives in.
26382
+ *
26383
+ * The gallery is the one input to recognition nobody re-reads: a sample
26384
+ * enrolled from the wrong face keeps voting forever, and because the matches it
26385
+ * pulls then look confident, nobody goes back. The 2026-09-08 audit found
26386
+ * exactly one such pair on this cluster — a sample scoring 0.61 against three
26387
+ * samples of ANOTHER person, enrolled from the same camera in the same minute,
26388
+ * where every other cross-identity pair sits under 0.50.
26389
+ */
26390
+ var IdentitySampleAuditRowSchema = object({
26391
+ sampleId: string(),
26392
+ enrolledAt: number().int(),
26393
+ deviceId: number().int().optional(),
26394
+ source: _enum(["detected", "photo"]),
26395
+ /** The enrolled crop's media key, so the panel can show the evidence. */
26396
+ mediaKey: string().optional(),
26397
+ /**
26398
+ * False = the sample is stamped with a DIFFERENT face model, and a cosine
26399
+ * across feature spaces is a well-formed float with no meaning. Every number
26400
+ * below then says nothing — it must read as "cannot say", never as an
26401
+ * accusation and never as a clean bill: this list ends in a Remove button.
26402
+ */
26403
+ comparable: boolean(),
26404
+ /** Mean cosine against this person's other samples. Null when there are none
26405
+ * to compare with — never 0, which would read as "opposite". */
26406
+ selfMean: number().nullable(),
26407
+ /** The other person this sample looks most like, when it looks like one.
26408
+ * This is the half that convicts: not looking like yourself can be a hard
26409
+ * angle; looking like someone the gallery can NAME is a mis-enrolment. */
26410
+ bestForeign: object({
26411
+ identityId: string(),
26412
+ name: string(),
26413
+ score: number()
26414
+ }).optional(),
26415
+ /** 0 = nothing to say. Higher = look at this one sooner. */
26416
+ suspicion: number()
26417
+ });
26418
+ var IdentitySampleAuditSchema = object({
26419
+ identityId: string(),
26420
+ name: string(),
26421
+ /** The cluster face model every comparison was made in. */
26422
+ modelId: string(),
26423
+ totalSamples: number().int(),
26424
+ comparableSamples: number().int(),
26425
+ flagged: number().int(),
26426
+ /** The bar `flagged` counts against, so the panel states the RULE and not
26427
+ * only its current result. */
26428
+ flagThreshold: number(),
26429
+ /** Worst first. A row with nothing to say still appears, at the bottom: the
26430
+ * operator asked to see the gallery, not only its accusations. */
26431
+ rows: array(IdentitySampleAuditRowSchema).readonly()
26432
+ });
26380
26433
  var FaceInfoSchema = object({
26381
26434
  faceId: string(),
26382
26435
  deviceId: number().int(),
@@ -26528,7 +26581,7 @@ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly
26528
26581
  }), method(object({ id: string() }), _void(), {
26529
26582
  kind: "mutation",
26530
26583
  auth: "admin"
26531
- }), method(object({ identityId: string() }), array(IdentitySampleInfoSchema).readonly()), method(object({
26584
+ }), method(object({ identityId: string() }), array(IdentitySampleInfoSchema).readonly()), method(object({ identityId: string().min(1) }), IdentitySampleAuditSchema, { auth: "admin" }), method(object({
26532
26585
  identityId: string(),
26533
26586
  sampleId: string()
26534
26587
  }), _void(), {
@@ -37021,6 +37074,12 @@ Object.freeze({
37021
37074
  addonId: null,
37022
37075
  access: "create"
37023
37076
  },
37077
+ "faceGallery.auditIdentitySamples": {
37078
+ capName: "face-gallery",
37079
+ capScope: "system",
37080
+ addonId: null,
37081
+ access: "view"
37082
+ },
37024
37083
  "faceGallery.createIdentity": {
37025
37084
  capName: "face-gallery",
37026
37085
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-petkit",
3
- "version": "0.2.84",
3
+ "version": "0.2.85",
4
4
  "description": "PetKit smart-feeder device-provider addon for CamStack — wraps the @apocaliss92/nodepetkit PetKit cloud client",
5
5
  "keywords": [
6
6
  "camstack",