@camstack/addon-notifiers 1.2.88 → 1.2.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.
package/dist/addon.js CHANGED
@@ -24341,6 +24341,59 @@ var IdentitySampleInfoSchema = object({
24341
24341
  deviceId: number().int().optional(),
24342
24342
  base64: string().optional()
24343
24343
  });
24344
+ /**
24345
+ * One enrolled sample, judged against the gallery it lives in.
24346
+ *
24347
+ * The gallery is the one input to recognition nobody re-reads: a sample
24348
+ * enrolled from the wrong face keeps voting forever, and because the matches it
24349
+ * pulls then look confident, nobody goes back. The 2026-09-08 audit found
24350
+ * exactly one such pair on this cluster — a sample scoring 0.61 against three
24351
+ * samples of ANOTHER person, enrolled from the same camera in the same minute,
24352
+ * where every other cross-identity pair sits under 0.50.
24353
+ */
24354
+ var IdentitySampleAuditRowSchema = object({
24355
+ sampleId: string(),
24356
+ enrolledAt: number().int(),
24357
+ deviceId: number().int().optional(),
24358
+ source: _enum(["detected", "photo"]),
24359
+ /** The enrolled crop's media key, so the panel can show the evidence. */
24360
+ mediaKey: string().optional(),
24361
+ /**
24362
+ * False = the sample is stamped with a DIFFERENT face model, and a cosine
24363
+ * across feature spaces is a well-formed float with no meaning. Every number
24364
+ * below then says nothing — it must read as "cannot say", never as an
24365
+ * accusation and never as a clean bill: this list ends in a Remove button.
24366
+ */
24367
+ comparable: boolean(),
24368
+ /** Mean cosine against this person's other samples. Null when there are none
24369
+ * to compare with — never 0, which would read as "opposite". */
24370
+ selfMean: number().nullable(),
24371
+ /** The other person this sample looks most like, when it looks like one.
24372
+ * This is the half that convicts: not looking like yourself can be a hard
24373
+ * angle; looking like someone the gallery can NAME is a mis-enrolment. */
24374
+ bestForeign: object({
24375
+ identityId: string(),
24376
+ name: string(),
24377
+ score: number()
24378
+ }).optional(),
24379
+ /** 0 = nothing to say. Higher = look at this one sooner. */
24380
+ suspicion: number()
24381
+ });
24382
+ var IdentitySampleAuditSchema = object({
24383
+ identityId: string(),
24384
+ name: string(),
24385
+ /** The cluster face model every comparison was made in. */
24386
+ modelId: string(),
24387
+ totalSamples: number().int(),
24388
+ comparableSamples: number().int(),
24389
+ flagged: number().int(),
24390
+ /** The bar `flagged` counts against, so the panel states the RULE and not
24391
+ * only its current result. */
24392
+ flagThreshold: number(),
24393
+ /** Worst first. A row with nothing to say still appears, at the bottom: the
24394
+ * operator asked to see the gallery, not only its accusations. */
24395
+ rows: array(IdentitySampleAuditRowSchema).readonly()
24396
+ });
24344
24397
  var FaceInfoSchema = object({
24345
24398
  faceId: string(),
24346
24399
  deviceId: number().int(),
@@ -24492,7 +24545,7 @@ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly
24492
24545
  }), method(object({ id: string() }), _void(), {
24493
24546
  kind: "mutation",
24494
24547
  auth: "admin"
24495
- }), method(object({ identityId: string() }), array(IdentitySampleInfoSchema).readonly()), method(object({
24548
+ }), method(object({ identityId: string() }), array(IdentitySampleInfoSchema).readonly()), method(object({ identityId: string().min(1) }), IdentitySampleAuditSchema, { auth: "admin" }), method(object({
24496
24549
  identityId: string(),
24497
24550
  sampleId: string()
24498
24551
  }), _void(), {
@@ -31719,6 +31772,12 @@ Object.freeze({
31719
31772
  addonId: null,
31720
31773
  access: "create"
31721
31774
  },
31775
+ "faceGallery.auditIdentitySamples": {
31776
+ capName: "face-gallery",
31777
+ capScope: "system",
31778
+ addonId: null,
31779
+ access: "view"
31780
+ },
31722
31781
  "faceGallery.createIdentity": {
31723
31782
  capName: "face-gallery",
31724
31783
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -24314,6 +24314,59 @@ var IdentitySampleInfoSchema = object({
24314
24314
  deviceId: number().int().optional(),
24315
24315
  base64: string().optional()
24316
24316
  });
24317
+ /**
24318
+ * One enrolled sample, judged against the gallery it lives in.
24319
+ *
24320
+ * The gallery is the one input to recognition nobody re-reads: a sample
24321
+ * enrolled from the wrong face keeps voting forever, and because the matches it
24322
+ * pulls then look confident, nobody goes back. The 2026-09-08 audit found
24323
+ * exactly one such pair on this cluster — a sample scoring 0.61 against three
24324
+ * samples of ANOTHER person, enrolled from the same camera in the same minute,
24325
+ * where every other cross-identity pair sits under 0.50.
24326
+ */
24327
+ var IdentitySampleAuditRowSchema = object({
24328
+ sampleId: string(),
24329
+ enrolledAt: number().int(),
24330
+ deviceId: number().int().optional(),
24331
+ source: _enum(["detected", "photo"]),
24332
+ /** The enrolled crop's media key, so the panel can show the evidence. */
24333
+ mediaKey: string().optional(),
24334
+ /**
24335
+ * False = the sample is stamped with a DIFFERENT face model, and a cosine
24336
+ * across feature spaces is a well-formed float with no meaning. Every number
24337
+ * below then says nothing — it must read as "cannot say", never as an
24338
+ * accusation and never as a clean bill: this list ends in a Remove button.
24339
+ */
24340
+ comparable: boolean(),
24341
+ /** Mean cosine against this person's other samples. Null when there are none
24342
+ * to compare with — never 0, which would read as "opposite". */
24343
+ selfMean: number().nullable(),
24344
+ /** The other person this sample looks most like, when it looks like one.
24345
+ * This is the half that convicts: not looking like yourself can be a hard
24346
+ * angle; looking like someone the gallery can NAME is a mis-enrolment. */
24347
+ bestForeign: object({
24348
+ identityId: string(),
24349
+ name: string(),
24350
+ score: number()
24351
+ }).optional(),
24352
+ /** 0 = nothing to say. Higher = look at this one sooner. */
24353
+ suspicion: number()
24354
+ });
24355
+ var IdentitySampleAuditSchema = object({
24356
+ identityId: string(),
24357
+ name: string(),
24358
+ /** The cluster face model every comparison was made in. */
24359
+ modelId: string(),
24360
+ totalSamples: number().int(),
24361
+ comparableSamples: number().int(),
24362
+ flagged: number().int(),
24363
+ /** The bar `flagged` counts against, so the panel states the RULE and not
24364
+ * only its current result. */
24365
+ flagThreshold: number(),
24366
+ /** Worst first. A row with nothing to say still appears, at the bottom: the
24367
+ * operator asked to see the gallery, not only its accusations. */
24368
+ rows: array(IdentitySampleAuditRowSchema).readonly()
24369
+ });
24317
24370
  var FaceInfoSchema = object({
24318
24371
  faceId: string(),
24319
24372
  deviceId: number().int(),
@@ -24465,7 +24518,7 @@ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly
24465
24518
  }), method(object({ id: string() }), _void(), {
24466
24519
  kind: "mutation",
24467
24520
  auth: "admin"
24468
- }), method(object({ identityId: string() }), array(IdentitySampleInfoSchema).readonly()), method(object({
24521
+ }), method(object({ identityId: string() }), array(IdentitySampleInfoSchema).readonly()), method(object({ identityId: string().min(1) }), IdentitySampleAuditSchema, { auth: "admin" }), method(object({
24469
24522
  identityId: string(),
24470
24523
  sampleId: string()
24471
24524
  }), _void(), {
@@ -31692,6 +31745,12 @@ Object.freeze({
31692
31745
  addonId: null,
31693
31746
  access: "create"
31694
31747
  },
31748
+ "faceGallery.auditIdentitySamples": {
31749
+ capName: "face-gallery",
31750
+ capScope: "system",
31751
+ addonId: null,
31752
+ access: "view"
31753
+ },
31695
31754
  "faceGallery.createIdentity": {
31696
31755
  capName: "face-gallery",
31697
31756
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-notifiers",
3
- "version": "1.2.88",
3
+ "version": "1.2.89",
4
4
  "description": "System notifiers addon for CamStack — a `notification-output` collection provider hosting per-kind notifier adapters (ntfy, pushover, gotify, telegram, discord, webhook, zentik).",
5
5
  "keywords": [
6
6
  "camstack",