@camstack/addon-provider-amcrest 0.2.24 → 0.2.25
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 +138 -56
- package/dist/addon.mjs +138 -56
- package/package.json +1 -1
package/dist/addon.js
CHANGED
|
@@ -7559,7 +7559,7 @@ var RecordingBandSchema = object({
|
|
|
7559
7559
|
postBufferSec: number().min(0).optional()
|
|
7560
7560
|
});
|
|
7561
7561
|
({
|
|
7562
|
-
preBufferSec:
|
|
7562
|
+
preBufferSec: 15,
|
|
7563
7563
|
postBufferSec: 30
|
|
7564
7564
|
}).postBufferSec * 1e3;
|
|
7565
7565
|
/**
|
|
@@ -13762,128 +13762,103 @@ var COCO_TO_MACRO = {
|
|
|
13762
13762
|
var AUDIO_MACRO_LABELS = [
|
|
13763
13763
|
{
|
|
13764
13764
|
id: "speech",
|
|
13765
|
-
name: "Speech"
|
|
13766
|
-
icon: "🗣️"
|
|
13765
|
+
name: "Speech"
|
|
13767
13766
|
},
|
|
13768
13767
|
{
|
|
13769
13768
|
id: "scream",
|
|
13770
|
-
name: "Scream / Shout"
|
|
13771
|
-
icon: "😱"
|
|
13769
|
+
name: "Scream / Shout"
|
|
13772
13770
|
},
|
|
13773
13771
|
{
|
|
13774
13772
|
id: "crying",
|
|
13775
|
-
name: "Crying / Baby"
|
|
13776
|
-
icon: "😢"
|
|
13773
|
+
name: "Crying / Baby"
|
|
13777
13774
|
},
|
|
13778
13775
|
{
|
|
13779
13776
|
id: "laughter",
|
|
13780
|
-
name: "Laughter"
|
|
13781
|
-
icon: "😂"
|
|
13777
|
+
name: "Laughter"
|
|
13782
13778
|
},
|
|
13783
13779
|
{
|
|
13784
13780
|
id: "music",
|
|
13785
|
-
name: "Music"
|
|
13786
|
-
icon: "🎵"
|
|
13781
|
+
name: "Music"
|
|
13787
13782
|
},
|
|
13788
13783
|
{
|
|
13789
13784
|
id: "dog",
|
|
13790
|
-
name: "Dog"
|
|
13791
|
-
icon: "🐕"
|
|
13785
|
+
name: "Dog"
|
|
13792
13786
|
},
|
|
13793
13787
|
{
|
|
13794
13788
|
id: "cat",
|
|
13795
|
-
name: "Cat"
|
|
13796
|
-
icon: "🐈"
|
|
13789
|
+
name: "Cat"
|
|
13797
13790
|
},
|
|
13798
13791
|
{
|
|
13799
13792
|
id: "bird",
|
|
13800
|
-
name: "Bird"
|
|
13801
|
-
icon: "🐦"
|
|
13793
|
+
name: "Bird"
|
|
13802
13794
|
},
|
|
13803
13795
|
{
|
|
13804
13796
|
id: "animal",
|
|
13805
|
-
name: "Animal (other)"
|
|
13806
|
-
icon: "🐾"
|
|
13797
|
+
name: "Animal (other)"
|
|
13807
13798
|
},
|
|
13808
13799
|
{
|
|
13809
13800
|
id: "alarm",
|
|
13810
|
-
name: "Alarm / Siren"
|
|
13811
|
-
icon: "🚨"
|
|
13801
|
+
name: "Alarm / Siren"
|
|
13812
13802
|
},
|
|
13813
13803
|
{
|
|
13814
13804
|
id: "doorbell",
|
|
13815
|
-
name: "Doorbell / Knock"
|
|
13816
|
-
icon: "🔔"
|
|
13805
|
+
name: "Doorbell / Knock"
|
|
13817
13806
|
},
|
|
13818
13807
|
{
|
|
13819
13808
|
id: "glass_breaking",
|
|
13820
|
-
name: "Glass Breaking"
|
|
13821
|
-
icon: "💥"
|
|
13809
|
+
name: "Glass Breaking"
|
|
13822
13810
|
},
|
|
13823
13811
|
{
|
|
13824
13812
|
id: "gunshot",
|
|
13825
|
-
name: "Gunshot / Explosion"
|
|
13826
|
-
icon: "💣"
|
|
13813
|
+
name: "Gunshot / Explosion"
|
|
13827
13814
|
},
|
|
13828
13815
|
{
|
|
13829
13816
|
id: "vehicle",
|
|
13830
|
-
name: "Vehicle"
|
|
13831
|
-
icon: "🚗"
|
|
13817
|
+
name: "Vehicle"
|
|
13832
13818
|
},
|
|
13833
13819
|
{
|
|
13834
13820
|
id: "siren",
|
|
13835
|
-
name: "Emergency Siren"
|
|
13836
|
-
icon: "🚑"
|
|
13821
|
+
name: "Emergency Siren"
|
|
13837
13822
|
},
|
|
13838
13823
|
{
|
|
13839
13824
|
id: "fire",
|
|
13840
|
-
name: "Fire / Smoke"
|
|
13841
|
-
icon: "🔥"
|
|
13825
|
+
name: "Fire / Smoke"
|
|
13842
13826
|
},
|
|
13843
13827
|
{
|
|
13844
13828
|
id: "water",
|
|
13845
|
-
name: "Water"
|
|
13846
|
-
icon: "💧"
|
|
13829
|
+
name: "Water"
|
|
13847
13830
|
},
|
|
13848
13831
|
{
|
|
13849
13832
|
id: "wind",
|
|
13850
|
-
name: "Wind / Weather"
|
|
13851
|
-
icon: "🌬️"
|
|
13833
|
+
name: "Wind / Weather"
|
|
13852
13834
|
},
|
|
13853
13835
|
{
|
|
13854
13836
|
id: "door",
|
|
13855
|
-
name: "Door"
|
|
13856
|
-
icon: "🚪"
|
|
13837
|
+
name: "Door"
|
|
13857
13838
|
},
|
|
13858
13839
|
{
|
|
13859
13840
|
id: "footsteps",
|
|
13860
|
-
name: "Footsteps"
|
|
13861
|
-
icon: "👣"
|
|
13841
|
+
name: "Footsteps"
|
|
13862
13842
|
},
|
|
13863
13843
|
{
|
|
13864
13844
|
id: "crowd",
|
|
13865
|
-
name: "Crowd / Chatter"
|
|
13866
|
-
icon: "👥"
|
|
13845
|
+
name: "Crowd / Chatter"
|
|
13867
13846
|
},
|
|
13868
13847
|
{
|
|
13869
13848
|
id: "telephone",
|
|
13870
|
-
name: "Telephone"
|
|
13871
|
-
icon: "📞"
|
|
13849
|
+
name: "Telephone"
|
|
13872
13850
|
},
|
|
13873
13851
|
{
|
|
13874
13852
|
id: "engine",
|
|
13875
|
-
name: "Engine / Motor"
|
|
13876
|
-
icon: "⚙️"
|
|
13853
|
+
name: "Engine / Motor"
|
|
13877
13854
|
},
|
|
13878
13855
|
{
|
|
13879
13856
|
id: "tools",
|
|
13880
|
-
name: "Tools / Construction"
|
|
13881
|
-
icon: "🔨"
|
|
13857
|
+
name: "Tools / Construction"
|
|
13882
13858
|
},
|
|
13883
13859
|
{
|
|
13884
13860
|
id: "silence",
|
|
13885
|
-
name: "Silence"
|
|
13886
|
-
icon: "🤫"
|
|
13861
|
+
name: "Silence"
|
|
13887
13862
|
}
|
|
13888
13863
|
];
|
|
13889
13864
|
var YAMNET_TO_MACRO = {
|
|
@@ -16385,7 +16360,7 @@ var TrackEnvelopeSchema = object({
|
|
|
16385
16360
|
* `snapshots[]` references — megabytes across a page of tracks. `slim`
|
|
16386
16361
|
* keeps every scalar the list surfaces actually render (ids, class(es),
|
|
16387
16362
|
* label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
|
|
16388
|
-
* zonesVisited, bestEventId, envelope, hasFace, hasRider) and returns `positions` /
|
|
16363
|
+
* zonesVisited, bestEventId, envelope, hasFace, hasEmbeddedFace, hasRider) and returns `positions` /
|
|
16389
16364
|
* `snapshots` as EMPTY arrays — detail views re-fetch the full row via
|
|
16390
16365
|
* `getTrack`. Mirrors the event-store `projection` convention
|
|
16391
16366
|
* (`getObjectEvents` et al.).
|
|
@@ -16680,6 +16655,35 @@ var TrackSchema = object({
|
|
|
16680
16655
|
*/
|
|
16681
16656
|
hasFace: boolean().optional(),
|
|
16682
16657
|
/**
|
|
16658
|
+
* This track has a face row IN THE GALLERY: a crop **and** an embedding — a
|
|
16659
|
+
* face an operator could ASSIGN to an identity.
|
|
16660
|
+
*
|
|
16661
|
+
* The STRICT twin of {@link hasFace}, and the pair only earns its keep
|
|
16662
|
+
* because the two disagree. `hasFace` is stamped at the TOP of the face
|
|
16663
|
+
* branch, before every gate, and means no more than "a face detector produced
|
|
16664
|
+
* a face detail". This one is stamped at the single moment the gallery row
|
|
16665
|
+
* LANDS — after `FaceRecognizer.onTrackEnd` successfully persists it, i.e.
|
|
16666
|
+
* past the embedding-magnitude verdict, the `minFacePx` detection gate, the
|
|
16667
|
+
* candidate gate, the imageless-track drop (no crop was ever captured) and
|
|
16668
|
+
* the crop-store drop. Everything between the detector and that insert can
|
|
16669
|
+
* legitimately refuse the face, so a flag written any earlier promises the
|
|
16670
|
+
* operator something to assign and delivers nothing.
|
|
16671
|
+
*
|
|
16672
|
+
* **Independent of recognition.** A face collected but never auto-matched is
|
|
16673
|
+
* still assignable — it is in fact the face an operator most wants to reach —
|
|
16674
|
+
* so this is NOT gated on `recognizedIdentityId`. Recognition lands in
|
|
16675
|
+
* `subLabel`; this says only that the raw material exists.
|
|
16676
|
+
*
|
|
16677
|
+
* **Set once, never cleared.** A track that produced a gallery row produced
|
|
16678
|
+
* one; deleting the row later is the gallery's business, not this flag's.
|
|
16679
|
+
*
|
|
16680
|
+
* **Absent ≠ false**, the same rule as {@link hasFace}: every row written
|
|
16681
|
+
* before the column omits it, and so does every server that predates the
|
|
16682
|
+
* field. A consumer must test `=== true` and render nothing otherwise —
|
|
16683
|
+
* never infer "no assignable face".
|
|
16684
|
+
*/
|
|
16685
|
+
hasEmbeddedFace: boolean().optional(),
|
|
16686
|
+
/**
|
|
16683
16687
|
* This subject CONTAINS a folded rider — a person the rider-pairing step
|
|
16684
16688
|
* ([D34](../decisions/adr-0034.md)) removed from the frame BEFORE the tracker,
|
|
16685
16689
|
* so the passage is tracked once and as a VEHICLE.
|
|
@@ -18069,6 +18073,32 @@ var DetailResultSchema = object({
|
|
|
18069
18073
|
/** FRAME-space bbox (already mapped back from crop space). */
|
|
18070
18074
|
bbox: NativeCropBboxSchema.optional(),
|
|
18071
18075
|
embedding: string().optional(),
|
|
18076
|
+
/**
|
|
18077
|
+
* L2 magnitude of the RAW pre-normalization embedding. Additive and optional
|
|
18078
|
+
* so an older runner that does not send it degrades to "unmeasurable", which
|
|
18079
|
+
* the consuming gate treats as accept — never as reject.
|
|
18080
|
+
*/
|
|
18081
|
+
embeddingMagnitude: number().optional(),
|
|
18082
|
+
/**
|
|
18083
|
+
* Model that produced `embedding` — the SAME contract `labelModelId` has for
|
|
18084
|
+
* `label`, and for the same reason: the producing node is the only side that
|
|
18085
|
+
* knows which model actually ran, and re-deriving it downstream is exactly
|
|
18086
|
+
* the inference this model exists to forbid.
|
|
18087
|
+
*
|
|
18088
|
+
* Additive and optional, so a runner that predates it degrades to
|
|
18089
|
+
* "unmeasurable" rather than to a wrong answer — the consumer falls back to
|
|
18090
|
+
* its previous assumption instead of refusing.
|
|
18091
|
+
*
|
|
18092
|
+
* Its absence was not cosmetic. `FaceRecognizer` needs the probe's model id
|
|
18093
|
+
* to use `face-matcher`'s same-model gate (`sample.modelId !== probe.modelId`);
|
|
18094
|
+
* with nothing on the wire it took the id from the GALLERY, so the gate
|
|
18095
|
+
* compared the gallery against itself and could never fire. That turned the
|
|
18096
|
+
* one guard protecting the face feature space into a tautology, and it is
|
|
18097
|
+
* why swapping `face-embedding`'s model would NOT have stranded the enrolled
|
|
18098
|
+
* gallery as the catalog comment predicts — it would have scored the new
|
|
18099
|
+
* model's vectors against the old model's samples in one cosine space.
|
|
18100
|
+
*/
|
|
18101
|
+
embeddingModelId: string().optional(),
|
|
18072
18102
|
label: string().optional(),
|
|
18073
18103
|
/**
|
|
18074
18104
|
* The tier `label` occupies, copied VERBATIM from the producing step's
|
|
@@ -19533,6 +19563,7 @@ var snapshotCapability = {
|
|
|
19533
19563
|
isBattery: boolean(),
|
|
19534
19564
|
reason: _enum([
|
|
19535
19565
|
"disabled",
|
|
19566
|
+
"offline",
|
|
19536
19567
|
"sleeping",
|
|
19537
19568
|
"unreachable",
|
|
19538
19569
|
"waking"
|
|
@@ -19622,9 +19653,17 @@ targets: array(object({
|
|
|
19622
19653
|
sleeping: boolean(),
|
|
19623
19654
|
/** Current device state rendered over the cached frame. State images
|
|
19624
19655
|
* remain authoritative even when their photographic background is
|
|
19625
|
-
* old; null means the link must carry a current camera frame.
|
|
19656
|
+
* old; null means the link must carry a current camera frame.
|
|
19657
|
+
*
|
|
19658
|
+
* **This is the ONLY source a surface may derive an inactive tile
|
|
19659
|
+
* from.** A client that reads a device's `online`/`disabled` flags and
|
|
19660
|
+
* draws its own verdict will disagree with the pixels it is painting
|
|
19661
|
+
* — the frame comes from here, and so must the sentence over it
|
|
19662
|
+
* (D190). Pair with `ageMs` for the age of the photograph behind the
|
|
19663
|
+
* state. */
|
|
19626
19664
|
stateReason: _enum([
|
|
19627
19665
|
"disabled",
|
|
19666
|
+
"offline",
|
|
19628
19667
|
"sleeping",
|
|
19629
19668
|
"unreachable",
|
|
19630
19669
|
"waking"
|
|
@@ -37590,7 +37629,6 @@ var NC_AUDIO_DEFAULTS = {
|
|
|
37590
37629
|
hitPercent: 60,
|
|
37591
37630
|
samplingSeconds: 10
|
|
37592
37631
|
};
|
|
37593
|
-
new Map(AUDIO_MACRO_LABELS.flatMap((macro) => macro.icon === void 0 ? [] : [[macro.id, macro.icon]]));
|
|
37594
37632
|
new Set(["devices", "classes"]);
|
|
37595
37633
|
NC_AUDIO_DEFAULTS.hitPercent, NC_AUDIO_DEFAULTS.samplingSeconds;
|
|
37596
37634
|
/**
|
|
@@ -37824,6 +37862,39 @@ TimelapseRuleInputSchema.extend({
|
|
|
37824
37862
|
createdAt: number(),
|
|
37825
37863
|
updatedAt: number()
|
|
37826
37864
|
});
|
|
37865
|
+
Object.freeze(Object.fromEntries([{
|
|
37866
|
+
stepId: "face-embedding",
|
|
37867
|
+
label: "Face recognition model",
|
|
37868
|
+
defaultModelId: "arcface-r100",
|
|
37869
|
+
indexName: "the enrolled face gallery",
|
|
37870
|
+
options: [
|
|
37871
|
+
{
|
|
37872
|
+
id: "arcface-r100",
|
|
37873
|
+
label: "ArcFace (ResNet34)"
|
|
37874
|
+
},
|
|
37875
|
+
{
|
|
37876
|
+
id: "auraface-r100",
|
|
37877
|
+
label: "AuraFace R100"
|
|
37878
|
+
},
|
|
37879
|
+
{
|
|
37880
|
+
id: "inception-resnet-v1",
|
|
37881
|
+
label: "Inception ResNet V1"
|
|
37882
|
+
}
|
|
37883
|
+
]
|
|
37884
|
+
}, {
|
|
37885
|
+
stepId: "clip-embedding",
|
|
37886
|
+
label: "Semantic search model",
|
|
37887
|
+
defaultModelId: "mobileclip-s1",
|
|
37888
|
+
indexName: "the object semantic-search index",
|
|
37889
|
+
options: [{
|
|
37890
|
+
id: "mobileclip-s1",
|
|
37891
|
+
label: "MobileCLIP S1"
|
|
37892
|
+
}, {
|
|
37893
|
+
id: "mobileclip-s2",
|
|
37894
|
+
label: "MobileCLIP S2"
|
|
37895
|
+
}]
|
|
37896
|
+
}].map((s) => [s.stepId, s.defaultModelId])));
|
|
37897
|
+
string().min(1);
|
|
37827
37898
|
object({
|
|
37828
37899
|
/**
|
|
37829
37900
|
* Fraction of the box's own size added on EACH side before cutting.
|
|
@@ -37844,10 +37915,21 @@ object({
|
|
|
37844
37915
|
*/
|
|
37845
37916
|
square: boolean()
|
|
37846
37917
|
});
|
|
37847
|
-
|
|
37918
|
+
/**
|
|
37919
|
+
* The convention in force when nobody has configured one — byte-for-byte the
|
|
37920
|
+
* behaviour of the pre-unification LIVE path (`DETAIL_CROP_PADDING_RATIO`).
|
|
37921
|
+
*/
|
|
37922
|
+
var DEFAULT_DETAIL_CROP_CONVENTION = {
|
|
37848
37923
|
paddingRatio: .15,
|
|
37849
37924
|
square: false
|
|
37850
|
-
}
|
|
37925
|
+
};
|
|
37926
|
+
Object.freeze({
|
|
37927
|
+
x: 0,
|
|
37928
|
+
y: 0,
|
|
37929
|
+
w: 1,
|
|
37930
|
+
h: 1
|
|
37931
|
+
});
|
|
37932
|
+
DEFAULT_DETAIL_CROP_CONVENTION.paddingRatio;
|
|
37851
37933
|
/**
|
|
37852
37934
|
* WHICH delivered frames the decode worker retains a native copy of.
|
|
37853
37935
|
*
|
package/dist/addon.mjs
CHANGED
|
@@ -7560,7 +7560,7 @@ var RecordingBandSchema = object({
|
|
|
7560
7560
|
postBufferSec: number().min(0).optional()
|
|
7561
7561
|
});
|
|
7562
7562
|
({
|
|
7563
|
-
preBufferSec:
|
|
7563
|
+
preBufferSec: 15,
|
|
7564
7564
|
postBufferSec: 30
|
|
7565
7565
|
}).postBufferSec * 1e3;
|
|
7566
7566
|
/**
|
|
@@ -13763,128 +13763,103 @@ var COCO_TO_MACRO = {
|
|
|
13763
13763
|
var AUDIO_MACRO_LABELS = [
|
|
13764
13764
|
{
|
|
13765
13765
|
id: "speech",
|
|
13766
|
-
name: "Speech"
|
|
13767
|
-
icon: "🗣️"
|
|
13766
|
+
name: "Speech"
|
|
13768
13767
|
},
|
|
13769
13768
|
{
|
|
13770
13769
|
id: "scream",
|
|
13771
|
-
name: "Scream / Shout"
|
|
13772
|
-
icon: "😱"
|
|
13770
|
+
name: "Scream / Shout"
|
|
13773
13771
|
},
|
|
13774
13772
|
{
|
|
13775
13773
|
id: "crying",
|
|
13776
|
-
name: "Crying / Baby"
|
|
13777
|
-
icon: "😢"
|
|
13774
|
+
name: "Crying / Baby"
|
|
13778
13775
|
},
|
|
13779
13776
|
{
|
|
13780
13777
|
id: "laughter",
|
|
13781
|
-
name: "Laughter"
|
|
13782
|
-
icon: "😂"
|
|
13778
|
+
name: "Laughter"
|
|
13783
13779
|
},
|
|
13784
13780
|
{
|
|
13785
13781
|
id: "music",
|
|
13786
|
-
name: "Music"
|
|
13787
|
-
icon: "🎵"
|
|
13782
|
+
name: "Music"
|
|
13788
13783
|
},
|
|
13789
13784
|
{
|
|
13790
13785
|
id: "dog",
|
|
13791
|
-
name: "Dog"
|
|
13792
|
-
icon: "🐕"
|
|
13786
|
+
name: "Dog"
|
|
13793
13787
|
},
|
|
13794
13788
|
{
|
|
13795
13789
|
id: "cat",
|
|
13796
|
-
name: "Cat"
|
|
13797
|
-
icon: "🐈"
|
|
13790
|
+
name: "Cat"
|
|
13798
13791
|
},
|
|
13799
13792
|
{
|
|
13800
13793
|
id: "bird",
|
|
13801
|
-
name: "Bird"
|
|
13802
|
-
icon: "🐦"
|
|
13794
|
+
name: "Bird"
|
|
13803
13795
|
},
|
|
13804
13796
|
{
|
|
13805
13797
|
id: "animal",
|
|
13806
|
-
name: "Animal (other)"
|
|
13807
|
-
icon: "🐾"
|
|
13798
|
+
name: "Animal (other)"
|
|
13808
13799
|
},
|
|
13809
13800
|
{
|
|
13810
13801
|
id: "alarm",
|
|
13811
|
-
name: "Alarm / Siren"
|
|
13812
|
-
icon: "🚨"
|
|
13802
|
+
name: "Alarm / Siren"
|
|
13813
13803
|
},
|
|
13814
13804
|
{
|
|
13815
13805
|
id: "doorbell",
|
|
13816
|
-
name: "Doorbell / Knock"
|
|
13817
|
-
icon: "🔔"
|
|
13806
|
+
name: "Doorbell / Knock"
|
|
13818
13807
|
},
|
|
13819
13808
|
{
|
|
13820
13809
|
id: "glass_breaking",
|
|
13821
|
-
name: "Glass Breaking"
|
|
13822
|
-
icon: "💥"
|
|
13810
|
+
name: "Glass Breaking"
|
|
13823
13811
|
},
|
|
13824
13812
|
{
|
|
13825
13813
|
id: "gunshot",
|
|
13826
|
-
name: "Gunshot / Explosion"
|
|
13827
|
-
icon: "💣"
|
|
13814
|
+
name: "Gunshot / Explosion"
|
|
13828
13815
|
},
|
|
13829
13816
|
{
|
|
13830
13817
|
id: "vehicle",
|
|
13831
|
-
name: "Vehicle"
|
|
13832
|
-
icon: "🚗"
|
|
13818
|
+
name: "Vehicle"
|
|
13833
13819
|
},
|
|
13834
13820
|
{
|
|
13835
13821
|
id: "siren",
|
|
13836
|
-
name: "Emergency Siren"
|
|
13837
|
-
icon: "🚑"
|
|
13822
|
+
name: "Emergency Siren"
|
|
13838
13823
|
},
|
|
13839
13824
|
{
|
|
13840
13825
|
id: "fire",
|
|
13841
|
-
name: "Fire / Smoke"
|
|
13842
|
-
icon: "🔥"
|
|
13826
|
+
name: "Fire / Smoke"
|
|
13843
13827
|
},
|
|
13844
13828
|
{
|
|
13845
13829
|
id: "water",
|
|
13846
|
-
name: "Water"
|
|
13847
|
-
icon: "💧"
|
|
13830
|
+
name: "Water"
|
|
13848
13831
|
},
|
|
13849
13832
|
{
|
|
13850
13833
|
id: "wind",
|
|
13851
|
-
name: "Wind / Weather"
|
|
13852
|
-
icon: "🌬️"
|
|
13834
|
+
name: "Wind / Weather"
|
|
13853
13835
|
},
|
|
13854
13836
|
{
|
|
13855
13837
|
id: "door",
|
|
13856
|
-
name: "Door"
|
|
13857
|
-
icon: "🚪"
|
|
13838
|
+
name: "Door"
|
|
13858
13839
|
},
|
|
13859
13840
|
{
|
|
13860
13841
|
id: "footsteps",
|
|
13861
|
-
name: "Footsteps"
|
|
13862
|
-
icon: "👣"
|
|
13842
|
+
name: "Footsteps"
|
|
13863
13843
|
},
|
|
13864
13844
|
{
|
|
13865
13845
|
id: "crowd",
|
|
13866
|
-
name: "Crowd / Chatter"
|
|
13867
|
-
icon: "👥"
|
|
13846
|
+
name: "Crowd / Chatter"
|
|
13868
13847
|
},
|
|
13869
13848
|
{
|
|
13870
13849
|
id: "telephone",
|
|
13871
|
-
name: "Telephone"
|
|
13872
|
-
icon: "📞"
|
|
13850
|
+
name: "Telephone"
|
|
13873
13851
|
},
|
|
13874
13852
|
{
|
|
13875
13853
|
id: "engine",
|
|
13876
|
-
name: "Engine / Motor"
|
|
13877
|
-
icon: "⚙️"
|
|
13854
|
+
name: "Engine / Motor"
|
|
13878
13855
|
},
|
|
13879
13856
|
{
|
|
13880
13857
|
id: "tools",
|
|
13881
|
-
name: "Tools / Construction"
|
|
13882
|
-
icon: "🔨"
|
|
13858
|
+
name: "Tools / Construction"
|
|
13883
13859
|
},
|
|
13884
13860
|
{
|
|
13885
13861
|
id: "silence",
|
|
13886
|
-
name: "Silence"
|
|
13887
|
-
icon: "🤫"
|
|
13862
|
+
name: "Silence"
|
|
13888
13863
|
}
|
|
13889
13864
|
];
|
|
13890
13865
|
var YAMNET_TO_MACRO = {
|
|
@@ -16386,7 +16361,7 @@ var TrackEnvelopeSchema = object({
|
|
|
16386
16361
|
* `snapshots[]` references — megabytes across a page of tracks. `slim`
|
|
16387
16362
|
* keeps every scalar the list surfaces actually render (ids, class(es),
|
|
16388
16363
|
* label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
|
|
16389
|
-
* zonesVisited, bestEventId, envelope, hasFace, hasRider) and returns `positions` /
|
|
16364
|
+
* zonesVisited, bestEventId, envelope, hasFace, hasEmbeddedFace, hasRider) and returns `positions` /
|
|
16390
16365
|
* `snapshots` as EMPTY arrays — detail views re-fetch the full row via
|
|
16391
16366
|
* `getTrack`. Mirrors the event-store `projection` convention
|
|
16392
16367
|
* (`getObjectEvents` et al.).
|
|
@@ -16681,6 +16656,35 @@ var TrackSchema = object({
|
|
|
16681
16656
|
*/
|
|
16682
16657
|
hasFace: boolean().optional(),
|
|
16683
16658
|
/**
|
|
16659
|
+
* This track has a face row IN THE GALLERY: a crop **and** an embedding — a
|
|
16660
|
+
* face an operator could ASSIGN to an identity.
|
|
16661
|
+
*
|
|
16662
|
+
* The STRICT twin of {@link hasFace}, and the pair only earns its keep
|
|
16663
|
+
* because the two disagree. `hasFace` is stamped at the TOP of the face
|
|
16664
|
+
* branch, before every gate, and means no more than "a face detector produced
|
|
16665
|
+
* a face detail". This one is stamped at the single moment the gallery row
|
|
16666
|
+
* LANDS — after `FaceRecognizer.onTrackEnd` successfully persists it, i.e.
|
|
16667
|
+
* past the embedding-magnitude verdict, the `minFacePx` detection gate, the
|
|
16668
|
+
* candidate gate, the imageless-track drop (no crop was ever captured) and
|
|
16669
|
+
* the crop-store drop. Everything between the detector and that insert can
|
|
16670
|
+
* legitimately refuse the face, so a flag written any earlier promises the
|
|
16671
|
+
* operator something to assign and delivers nothing.
|
|
16672
|
+
*
|
|
16673
|
+
* **Independent of recognition.** A face collected but never auto-matched is
|
|
16674
|
+
* still assignable — it is in fact the face an operator most wants to reach —
|
|
16675
|
+
* so this is NOT gated on `recognizedIdentityId`. Recognition lands in
|
|
16676
|
+
* `subLabel`; this says only that the raw material exists.
|
|
16677
|
+
*
|
|
16678
|
+
* **Set once, never cleared.** A track that produced a gallery row produced
|
|
16679
|
+
* one; deleting the row later is the gallery's business, not this flag's.
|
|
16680
|
+
*
|
|
16681
|
+
* **Absent ≠ false**, the same rule as {@link hasFace}: every row written
|
|
16682
|
+
* before the column omits it, and so does every server that predates the
|
|
16683
|
+
* field. A consumer must test `=== true` and render nothing otherwise —
|
|
16684
|
+
* never infer "no assignable face".
|
|
16685
|
+
*/
|
|
16686
|
+
hasEmbeddedFace: boolean().optional(),
|
|
16687
|
+
/**
|
|
16684
16688
|
* This subject CONTAINS a folded rider — a person the rider-pairing step
|
|
16685
16689
|
* ([D34](../decisions/adr-0034.md)) removed from the frame BEFORE the tracker,
|
|
16686
16690
|
* so the passage is tracked once and as a VEHICLE.
|
|
@@ -18070,6 +18074,32 @@ var DetailResultSchema = object({
|
|
|
18070
18074
|
/** FRAME-space bbox (already mapped back from crop space). */
|
|
18071
18075
|
bbox: NativeCropBboxSchema.optional(),
|
|
18072
18076
|
embedding: string().optional(),
|
|
18077
|
+
/**
|
|
18078
|
+
* L2 magnitude of the RAW pre-normalization embedding. Additive and optional
|
|
18079
|
+
* so an older runner that does not send it degrades to "unmeasurable", which
|
|
18080
|
+
* the consuming gate treats as accept — never as reject.
|
|
18081
|
+
*/
|
|
18082
|
+
embeddingMagnitude: number().optional(),
|
|
18083
|
+
/**
|
|
18084
|
+
* Model that produced `embedding` — the SAME contract `labelModelId` has for
|
|
18085
|
+
* `label`, and for the same reason: the producing node is the only side that
|
|
18086
|
+
* knows which model actually ran, and re-deriving it downstream is exactly
|
|
18087
|
+
* the inference this model exists to forbid.
|
|
18088
|
+
*
|
|
18089
|
+
* Additive and optional, so a runner that predates it degrades to
|
|
18090
|
+
* "unmeasurable" rather than to a wrong answer — the consumer falls back to
|
|
18091
|
+
* its previous assumption instead of refusing.
|
|
18092
|
+
*
|
|
18093
|
+
* Its absence was not cosmetic. `FaceRecognizer` needs the probe's model id
|
|
18094
|
+
* to use `face-matcher`'s same-model gate (`sample.modelId !== probe.modelId`);
|
|
18095
|
+
* with nothing on the wire it took the id from the GALLERY, so the gate
|
|
18096
|
+
* compared the gallery against itself and could never fire. That turned the
|
|
18097
|
+
* one guard protecting the face feature space into a tautology, and it is
|
|
18098
|
+
* why swapping `face-embedding`'s model would NOT have stranded the enrolled
|
|
18099
|
+
* gallery as the catalog comment predicts — it would have scored the new
|
|
18100
|
+
* model's vectors against the old model's samples in one cosine space.
|
|
18101
|
+
*/
|
|
18102
|
+
embeddingModelId: string().optional(),
|
|
18073
18103
|
label: string().optional(),
|
|
18074
18104
|
/**
|
|
18075
18105
|
* The tier `label` occupies, copied VERBATIM from the producing step's
|
|
@@ -19534,6 +19564,7 @@ var snapshotCapability = {
|
|
|
19534
19564
|
isBattery: boolean(),
|
|
19535
19565
|
reason: _enum([
|
|
19536
19566
|
"disabled",
|
|
19567
|
+
"offline",
|
|
19537
19568
|
"sleeping",
|
|
19538
19569
|
"unreachable",
|
|
19539
19570
|
"waking"
|
|
@@ -19623,9 +19654,17 @@ targets: array(object({
|
|
|
19623
19654
|
sleeping: boolean(),
|
|
19624
19655
|
/** Current device state rendered over the cached frame. State images
|
|
19625
19656
|
* remain authoritative even when their photographic background is
|
|
19626
|
-
* old; null means the link must carry a current camera frame.
|
|
19657
|
+
* old; null means the link must carry a current camera frame.
|
|
19658
|
+
*
|
|
19659
|
+
* **This is the ONLY source a surface may derive an inactive tile
|
|
19660
|
+
* from.** A client that reads a device's `online`/`disabled` flags and
|
|
19661
|
+
* draws its own verdict will disagree with the pixels it is painting
|
|
19662
|
+
* — the frame comes from here, and so must the sentence over it
|
|
19663
|
+
* (D190). Pair with `ageMs` for the age of the photograph behind the
|
|
19664
|
+
* state. */
|
|
19627
19665
|
stateReason: _enum([
|
|
19628
19666
|
"disabled",
|
|
19667
|
+
"offline",
|
|
19629
19668
|
"sleeping",
|
|
19630
19669
|
"unreachable",
|
|
19631
19670
|
"waking"
|
|
@@ -37591,7 +37630,6 @@ var NC_AUDIO_DEFAULTS = {
|
|
|
37591
37630
|
hitPercent: 60,
|
|
37592
37631
|
samplingSeconds: 10
|
|
37593
37632
|
};
|
|
37594
|
-
new Map(AUDIO_MACRO_LABELS.flatMap((macro) => macro.icon === void 0 ? [] : [[macro.id, macro.icon]]));
|
|
37595
37633
|
new Set(["devices", "classes"]);
|
|
37596
37634
|
NC_AUDIO_DEFAULTS.hitPercent, NC_AUDIO_DEFAULTS.samplingSeconds;
|
|
37597
37635
|
/**
|
|
@@ -37825,6 +37863,39 @@ TimelapseRuleInputSchema.extend({
|
|
|
37825
37863
|
createdAt: number(),
|
|
37826
37864
|
updatedAt: number()
|
|
37827
37865
|
});
|
|
37866
|
+
Object.freeze(Object.fromEntries([{
|
|
37867
|
+
stepId: "face-embedding",
|
|
37868
|
+
label: "Face recognition model",
|
|
37869
|
+
defaultModelId: "arcface-r100",
|
|
37870
|
+
indexName: "the enrolled face gallery",
|
|
37871
|
+
options: [
|
|
37872
|
+
{
|
|
37873
|
+
id: "arcface-r100",
|
|
37874
|
+
label: "ArcFace (ResNet34)"
|
|
37875
|
+
},
|
|
37876
|
+
{
|
|
37877
|
+
id: "auraface-r100",
|
|
37878
|
+
label: "AuraFace R100"
|
|
37879
|
+
},
|
|
37880
|
+
{
|
|
37881
|
+
id: "inception-resnet-v1",
|
|
37882
|
+
label: "Inception ResNet V1"
|
|
37883
|
+
}
|
|
37884
|
+
]
|
|
37885
|
+
}, {
|
|
37886
|
+
stepId: "clip-embedding",
|
|
37887
|
+
label: "Semantic search model",
|
|
37888
|
+
defaultModelId: "mobileclip-s1",
|
|
37889
|
+
indexName: "the object semantic-search index",
|
|
37890
|
+
options: [{
|
|
37891
|
+
id: "mobileclip-s1",
|
|
37892
|
+
label: "MobileCLIP S1"
|
|
37893
|
+
}, {
|
|
37894
|
+
id: "mobileclip-s2",
|
|
37895
|
+
label: "MobileCLIP S2"
|
|
37896
|
+
}]
|
|
37897
|
+
}].map((s) => [s.stepId, s.defaultModelId])));
|
|
37898
|
+
string().min(1);
|
|
37828
37899
|
object({
|
|
37829
37900
|
/**
|
|
37830
37901
|
* Fraction of the box's own size added on EACH side before cutting.
|
|
@@ -37845,10 +37916,21 @@ object({
|
|
|
37845
37916
|
*/
|
|
37846
37917
|
square: boolean()
|
|
37847
37918
|
});
|
|
37848
|
-
|
|
37919
|
+
/**
|
|
37920
|
+
* The convention in force when nobody has configured one — byte-for-byte the
|
|
37921
|
+
* behaviour of the pre-unification LIVE path (`DETAIL_CROP_PADDING_RATIO`).
|
|
37922
|
+
*/
|
|
37923
|
+
var DEFAULT_DETAIL_CROP_CONVENTION = {
|
|
37849
37924
|
paddingRatio: .15,
|
|
37850
37925
|
square: false
|
|
37851
|
-
}
|
|
37926
|
+
};
|
|
37927
|
+
Object.freeze({
|
|
37928
|
+
x: 0,
|
|
37929
|
+
y: 0,
|
|
37930
|
+
w: 1,
|
|
37931
|
+
h: 1
|
|
37932
|
+
});
|
|
37933
|
+
DEFAULT_DETAIL_CROP_CONVENTION.paddingRatio;
|
|
37852
37934
|
/**
|
|
37853
37935
|
* WHICH delivered frames the decode worker retains a native copy of.
|
|
37854
37936
|
*
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-provider-amcrest",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.25",
|
|
4
4
|
"description": "Amcrest/Dahua camera device provider addon for CamStack — Dahua CGI over HTTP(S) with digest auth (snapshot, RTSP catalog, PTZ, image/day-night config)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|