@camstack/addon-provider-dreo 0.2.23 → 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 +204 -61
- package/dist/addon.mjs +204 -61
- package/package.json +1 -1
package/dist/addon.js
CHANGED
|
@@ -7602,7 +7602,7 @@ var RecordingBandSchema = object({
|
|
|
7602
7602
|
postBufferSec: number().min(0).optional()
|
|
7603
7603
|
});
|
|
7604
7604
|
({
|
|
7605
|
-
preBufferSec:
|
|
7605
|
+
preBufferSec: 15,
|
|
7606
7606
|
postBufferSec: 30
|
|
7607
7607
|
}).postBufferSec * 1e3;
|
|
7608
7608
|
/**
|
|
@@ -13822,128 +13822,103 @@ var COCO_TO_MACRO = {
|
|
|
13822
13822
|
var AUDIO_MACRO_LABELS = [
|
|
13823
13823
|
{
|
|
13824
13824
|
id: "speech",
|
|
13825
|
-
name: "Speech"
|
|
13826
|
-
icon: "🗣️"
|
|
13825
|
+
name: "Speech"
|
|
13827
13826
|
},
|
|
13828
13827
|
{
|
|
13829
13828
|
id: "scream",
|
|
13830
|
-
name: "Scream / Shout"
|
|
13831
|
-
icon: "😱"
|
|
13829
|
+
name: "Scream / Shout"
|
|
13832
13830
|
},
|
|
13833
13831
|
{
|
|
13834
13832
|
id: "crying",
|
|
13835
|
-
name: "Crying / Baby"
|
|
13836
|
-
icon: "😢"
|
|
13833
|
+
name: "Crying / Baby"
|
|
13837
13834
|
},
|
|
13838
13835
|
{
|
|
13839
13836
|
id: "laughter",
|
|
13840
|
-
name: "Laughter"
|
|
13841
|
-
icon: "😂"
|
|
13837
|
+
name: "Laughter"
|
|
13842
13838
|
},
|
|
13843
13839
|
{
|
|
13844
13840
|
id: "music",
|
|
13845
|
-
name: "Music"
|
|
13846
|
-
icon: "🎵"
|
|
13841
|
+
name: "Music"
|
|
13847
13842
|
},
|
|
13848
13843
|
{
|
|
13849
13844
|
id: "dog",
|
|
13850
|
-
name: "Dog"
|
|
13851
|
-
icon: "🐕"
|
|
13845
|
+
name: "Dog"
|
|
13852
13846
|
},
|
|
13853
13847
|
{
|
|
13854
13848
|
id: "cat",
|
|
13855
|
-
name: "Cat"
|
|
13856
|
-
icon: "🐈"
|
|
13849
|
+
name: "Cat"
|
|
13857
13850
|
},
|
|
13858
13851
|
{
|
|
13859
13852
|
id: "bird",
|
|
13860
|
-
name: "Bird"
|
|
13861
|
-
icon: "🐦"
|
|
13853
|
+
name: "Bird"
|
|
13862
13854
|
},
|
|
13863
13855
|
{
|
|
13864
13856
|
id: "animal",
|
|
13865
|
-
name: "Animal (other)"
|
|
13866
|
-
icon: "🐾"
|
|
13857
|
+
name: "Animal (other)"
|
|
13867
13858
|
},
|
|
13868
13859
|
{
|
|
13869
13860
|
id: "alarm",
|
|
13870
|
-
name: "Alarm / Siren"
|
|
13871
|
-
icon: "🚨"
|
|
13861
|
+
name: "Alarm / Siren"
|
|
13872
13862
|
},
|
|
13873
13863
|
{
|
|
13874
13864
|
id: "doorbell",
|
|
13875
|
-
name: "Doorbell / Knock"
|
|
13876
|
-
icon: "🔔"
|
|
13865
|
+
name: "Doorbell / Knock"
|
|
13877
13866
|
},
|
|
13878
13867
|
{
|
|
13879
13868
|
id: "glass_breaking",
|
|
13880
|
-
name: "Glass Breaking"
|
|
13881
|
-
icon: "💥"
|
|
13869
|
+
name: "Glass Breaking"
|
|
13882
13870
|
},
|
|
13883
13871
|
{
|
|
13884
13872
|
id: "gunshot",
|
|
13885
|
-
name: "Gunshot / Explosion"
|
|
13886
|
-
icon: "💣"
|
|
13873
|
+
name: "Gunshot / Explosion"
|
|
13887
13874
|
},
|
|
13888
13875
|
{
|
|
13889
13876
|
id: "vehicle",
|
|
13890
|
-
name: "Vehicle"
|
|
13891
|
-
icon: "🚗"
|
|
13877
|
+
name: "Vehicle"
|
|
13892
13878
|
},
|
|
13893
13879
|
{
|
|
13894
13880
|
id: "siren",
|
|
13895
|
-
name: "Emergency Siren"
|
|
13896
|
-
icon: "🚑"
|
|
13881
|
+
name: "Emergency Siren"
|
|
13897
13882
|
},
|
|
13898
13883
|
{
|
|
13899
13884
|
id: "fire",
|
|
13900
|
-
name: "Fire / Smoke"
|
|
13901
|
-
icon: "🔥"
|
|
13885
|
+
name: "Fire / Smoke"
|
|
13902
13886
|
},
|
|
13903
13887
|
{
|
|
13904
13888
|
id: "water",
|
|
13905
|
-
name: "Water"
|
|
13906
|
-
icon: "💧"
|
|
13889
|
+
name: "Water"
|
|
13907
13890
|
},
|
|
13908
13891
|
{
|
|
13909
13892
|
id: "wind",
|
|
13910
|
-
name: "Wind / Weather"
|
|
13911
|
-
icon: "🌬️"
|
|
13893
|
+
name: "Wind / Weather"
|
|
13912
13894
|
},
|
|
13913
13895
|
{
|
|
13914
13896
|
id: "door",
|
|
13915
|
-
name: "Door"
|
|
13916
|
-
icon: "🚪"
|
|
13897
|
+
name: "Door"
|
|
13917
13898
|
},
|
|
13918
13899
|
{
|
|
13919
13900
|
id: "footsteps",
|
|
13920
|
-
name: "Footsteps"
|
|
13921
|
-
icon: "👣"
|
|
13901
|
+
name: "Footsteps"
|
|
13922
13902
|
},
|
|
13923
13903
|
{
|
|
13924
13904
|
id: "crowd",
|
|
13925
|
-
name: "Crowd / Chatter"
|
|
13926
|
-
icon: "👥"
|
|
13905
|
+
name: "Crowd / Chatter"
|
|
13927
13906
|
},
|
|
13928
13907
|
{
|
|
13929
13908
|
id: "telephone",
|
|
13930
|
-
name: "Telephone"
|
|
13931
|
-
icon: "📞"
|
|
13909
|
+
name: "Telephone"
|
|
13932
13910
|
},
|
|
13933
13911
|
{
|
|
13934
13912
|
id: "engine",
|
|
13935
|
-
name: "Engine / Motor"
|
|
13936
|
-
icon: "⚙️"
|
|
13913
|
+
name: "Engine / Motor"
|
|
13937
13914
|
},
|
|
13938
13915
|
{
|
|
13939
13916
|
id: "tools",
|
|
13940
|
-
name: "Tools / Construction"
|
|
13941
|
-
icon: "🔨"
|
|
13917
|
+
name: "Tools / Construction"
|
|
13942
13918
|
},
|
|
13943
13919
|
{
|
|
13944
13920
|
id: "silence",
|
|
13945
|
-
name: "Silence"
|
|
13946
|
-
icon: "🤫"
|
|
13921
|
+
name: "Silence"
|
|
13947
13922
|
}
|
|
13948
13923
|
];
|
|
13949
13924
|
var YAMNET_TO_MACRO = {
|
|
@@ -16445,7 +16420,7 @@ var TrackEnvelopeSchema = object({
|
|
|
16445
16420
|
* `snapshots[]` references — megabytes across a page of tracks. `slim`
|
|
16446
16421
|
* keeps every scalar the list surfaces actually render (ids, class(es),
|
|
16447
16422
|
* label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
|
|
16448
|
-
* zonesVisited, bestEventId, envelope, hasFace, hasRider) and returns `positions` /
|
|
16423
|
+
* zonesVisited, bestEventId, envelope, hasFace, hasEmbeddedFace, hasRider) and returns `positions` /
|
|
16449
16424
|
* `snapshots` as EMPTY arrays — detail views re-fetch the full row via
|
|
16450
16425
|
* `getTrack`. Mirrors the event-store `projection` convention
|
|
16451
16426
|
* (`getObjectEvents` et al.).
|
|
@@ -16740,6 +16715,35 @@ var TrackSchema = object({
|
|
|
16740
16715
|
*/
|
|
16741
16716
|
hasFace: boolean().optional(),
|
|
16742
16717
|
/**
|
|
16718
|
+
* This track has a face row IN THE GALLERY: a crop **and** an embedding — a
|
|
16719
|
+
* face an operator could ASSIGN to an identity.
|
|
16720
|
+
*
|
|
16721
|
+
* The STRICT twin of {@link hasFace}, and the pair only earns its keep
|
|
16722
|
+
* because the two disagree. `hasFace` is stamped at the TOP of the face
|
|
16723
|
+
* branch, before every gate, and means no more than "a face detector produced
|
|
16724
|
+
* a face detail". This one is stamped at the single moment the gallery row
|
|
16725
|
+
* LANDS — after `FaceRecognizer.onTrackEnd` successfully persists it, i.e.
|
|
16726
|
+
* past the embedding-magnitude verdict, the `minFacePx` detection gate, the
|
|
16727
|
+
* candidate gate, the imageless-track drop (no crop was ever captured) and
|
|
16728
|
+
* the crop-store drop. Everything between the detector and that insert can
|
|
16729
|
+
* legitimately refuse the face, so a flag written any earlier promises the
|
|
16730
|
+
* operator something to assign and delivers nothing.
|
|
16731
|
+
*
|
|
16732
|
+
* **Independent of recognition.** A face collected but never auto-matched is
|
|
16733
|
+
* still assignable — it is in fact the face an operator most wants to reach —
|
|
16734
|
+
* so this is NOT gated on `recognizedIdentityId`. Recognition lands in
|
|
16735
|
+
* `subLabel`; this says only that the raw material exists.
|
|
16736
|
+
*
|
|
16737
|
+
* **Set once, never cleared.** A track that produced a gallery row produced
|
|
16738
|
+
* one; deleting the row later is the gallery's business, not this flag's.
|
|
16739
|
+
*
|
|
16740
|
+
* **Absent ≠ false**, the same rule as {@link hasFace}: every row written
|
|
16741
|
+
* before the column omits it, and so does every server that predates the
|
|
16742
|
+
* field. A consumer must test `=== true` and render nothing otherwise —
|
|
16743
|
+
* never infer "no assignable face".
|
|
16744
|
+
*/
|
|
16745
|
+
hasEmbeddedFace: boolean().optional(),
|
|
16746
|
+
/**
|
|
16743
16747
|
* This subject CONTAINS a folded rider — a person the rider-pairing step
|
|
16744
16748
|
* ([D34](../decisions/adr-0034.md)) removed from the frame BEFORE the tracker,
|
|
16745
16749
|
* so the passage is tracked once and as a VEHICLE.
|
|
@@ -18129,6 +18133,32 @@ var DetailResultSchema = object({
|
|
|
18129
18133
|
/** FRAME-space bbox (already mapped back from crop space). */
|
|
18130
18134
|
bbox: NativeCropBboxSchema.optional(),
|
|
18131
18135
|
embedding: string().optional(),
|
|
18136
|
+
/**
|
|
18137
|
+
* L2 magnitude of the RAW pre-normalization embedding. Additive and optional
|
|
18138
|
+
* so an older runner that does not send it degrades to "unmeasurable", which
|
|
18139
|
+
* the consuming gate treats as accept — never as reject.
|
|
18140
|
+
*/
|
|
18141
|
+
embeddingMagnitude: number().optional(),
|
|
18142
|
+
/**
|
|
18143
|
+
* Model that produced `embedding` — the SAME contract `labelModelId` has for
|
|
18144
|
+
* `label`, and for the same reason: the producing node is the only side that
|
|
18145
|
+
* knows which model actually ran, and re-deriving it downstream is exactly
|
|
18146
|
+
* the inference this model exists to forbid.
|
|
18147
|
+
*
|
|
18148
|
+
* Additive and optional, so a runner that predates it degrades to
|
|
18149
|
+
* "unmeasurable" rather than to a wrong answer — the consumer falls back to
|
|
18150
|
+
* its previous assumption instead of refusing.
|
|
18151
|
+
*
|
|
18152
|
+
* Its absence was not cosmetic. `FaceRecognizer` needs the probe's model id
|
|
18153
|
+
* to use `face-matcher`'s same-model gate (`sample.modelId !== probe.modelId`);
|
|
18154
|
+
* with nothing on the wire it took the id from the GALLERY, so the gate
|
|
18155
|
+
* compared the gallery against itself and could never fire. That turned the
|
|
18156
|
+
* one guard protecting the face feature space into a tautology, and it is
|
|
18157
|
+
* why swapping `face-embedding`'s model would NOT have stranded the enrolled
|
|
18158
|
+
* gallery as the catalog comment predicts — it would have scored the new
|
|
18159
|
+
* model's vectors against the old model's samples in one cosine space.
|
|
18160
|
+
*/
|
|
18161
|
+
embeddingModelId: string().optional(),
|
|
18132
18162
|
label: string().optional(),
|
|
18133
18163
|
/**
|
|
18134
18164
|
* The tier `label` occupies, copied VERBATIM from the producing step's
|
|
@@ -19004,6 +19034,12 @@ var CameraStatusSchema = object({
|
|
|
19004
19034
|
/** Unix timestamp (ms) when this snapshot was composed server-side. */
|
|
19005
19035
|
fetchedAt: number()
|
|
19006
19036
|
});
|
|
19037
|
+
var InferenceDeviceExclusionReasonSchema = _enum([
|
|
19038
|
+
"disabled",
|
|
19039
|
+
"unavailable",
|
|
19040
|
+
"cannot-host-camera-root",
|
|
19041
|
+
"accelerator-preferred"
|
|
19042
|
+
]);
|
|
19007
19043
|
var NodeInferenceDeviceSchema = object({
|
|
19008
19044
|
/** Stable per-node device key, e.g. `openvino:npu`, `edgetpu:usb`, `cpu`. */
|
|
19009
19045
|
key: string(),
|
|
@@ -19034,7 +19070,17 @@ var NodeInferenceDeviceSchema = object({
|
|
|
19034
19070
|
* available per format; this is the stored selection that becomes the
|
|
19035
19071
|
* default for EVERY camera landing on this accelerator.
|
|
19036
19072
|
*/
|
|
19037
|
-
steps: record(string(), DeviceStepConfigSchema).optional()
|
|
19073
|
+
steps: record(string(), DeviceStepConfigSchema).optional(),
|
|
19074
|
+
/**
|
|
19075
|
+
* `null` when the device IS a camera-root candidate on this node; otherwise
|
|
19076
|
+
* the reason the dispatcher drops it. Computed by the SAME
|
|
19077
|
+
* `resolveInferenceDeviceEligibility` the dispatcher runs, so this view can
|
|
19078
|
+
* never disagree with the election — deriving it in the UI from
|
|
19079
|
+
* `enabled`/`available` would silently miss `cannot-host-camera-root` (needs
|
|
19080
|
+
* the node's model catalog) and `accelerator-preferred` (needs the node-wide
|
|
19081
|
+
* "an accelerator is serving" predicate).
|
|
19082
|
+
*/
|
|
19083
|
+
exclusion: InferenceDeviceExclusionReasonSchema.nullable()
|
|
19038
19084
|
});
|
|
19039
19085
|
var NodeInferenceDevicesSchema = object({
|
|
19040
19086
|
nodeId: string(),
|
|
@@ -19539,6 +19585,7 @@ DeviceType.Camera, method(object({
|
|
|
19539
19585
|
isBattery: boolean(),
|
|
19540
19586
|
reason: _enum([
|
|
19541
19587
|
"disabled",
|
|
19588
|
+
"offline",
|
|
19542
19589
|
"sleeping",
|
|
19543
19590
|
"unreachable",
|
|
19544
19591
|
"waking"
|
|
@@ -19584,9 +19631,17 @@ targets: array(object({
|
|
|
19584
19631
|
sleeping: boolean(),
|
|
19585
19632
|
/** Current device state rendered over the cached frame. State images
|
|
19586
19633
|
* remain authoritative even when their photographic background is
|
|
19587
|
-
* old; null means the link must carry a current camera frame.
|
|
19634
|
+
* old; null means the link must carry a current camera frame.
|
|
19635
|
+
*
|
|
19636
|
+
* **This is the ONLY source a surface may derive an inactive tile
|
|
19637
|
+
* from.** A client that reads a device's `online`/`disabled` flags and
|
|
19638
|
+
* draws its own verdict will disagree with the pixels it is painting
|
|
19639
|
+
* — the frame comes from here, and so must the sentence over it
|
|
19640
|
+
* (D190). Pair with `ageMs` for the age of the photograph behind the
|
|
19641
|
+
* state. */
|
|
19588
19642
|
stateReason: _enum([
|
|
19589
19643
|
"disabled",
|
|
19644
|
+
"offline",
|
|
19590
19645
|
"sleeping",
|
|
19591
19646
|
"unreachable",
|
|
19592
19647
|
"waking"
|
|
@@ -23884,7 +23939,12 @@ var ListResultSchema = object({
|
|
|
23884
23939
|
probedAt: number()
|
|
23885
23940
|
});
|
|
23886
23941
|
var PreferredSchema = LocalInterfaceSchema.nullable();
|
|
23887
|
-
|
|
23942
|
+
/**
|
|
23943
|
+
* Candidate base URL for the SDK to race on connect. Order matters —
|
|
23944
|
+
* the SDK should attempt these top-to-bottom with a short per-candidate
|
|
23945
|
+
* timeout (e.g. 1500ms) and cache the winner for the session.
|
|
23946
|
+
*/
|
|
23947
|
+
var ConnectionEndpointSchema = object({
|
|
23888
23948
|
/** Operator-facing label (e.g. "LAN — en0", "Public tunnel"). */
|
|
23889
23949
|
label: string(),
|
|
23890
23950
|
/** Fully-formed base URL with scheme + host + port. */
|
|
@@ -23927,7 +23987,42 @@ var GetConnectionEndpointsResultSchema = object({ endpoints: array(object({
|
|
|
23927
23987
|
* ordering between polls.
|
|
23928
23988
|
*/
|
|
23929
23989
|
priority: number()
|
|
23930
|
-
})
|
|
23990
|
+
});
|
|
23991
|
+
/**
|
|
23992
|
+
* Where the advertised local port came from. Ordered most → least
|
|
23993
|
+
* authoritative, and the whole point of returning it: a client must be able to
|
|
23994
|
+
* tell a FACT about the hub's socket from an echo of its own guess.
|
|
23995
|
+
*/
|
|
23996
|
+
var LocalPortSourceEnum = _enum([
|
|
23997
|
+
"server-config",
|
|
23998
|
+
"server-env",
|
|
23999
|
+
"caller-hint",
|
|
24000
|
+
"default"
|
|
24001
|
+
]);
|
|
24002
|
+
/** The port every LAN/loopback `baseUrl` in the same result was built with. */
|
|
24003
|
+
var AdvertisedLocalPortSchema = object({
|
|
24004
|
+
port: number().int().min(1).max(65535),
|
|
24005
|
+
source: LocalPortSourceEnum
|
|
24006
|
+
});
|
|
24007
|
+
var GetConnectionEndpointsResultSchema = object({
|
|
24008
|
+
endpoints: array(ConnectionEndpointSchema).readonly(),
|
|
24009
|
+
/**
|
|
24010
|
+
* The port the hub built the LAN/loopback URLs with, and where that number
|
|
24011
|
+
* came from.
|
|
24012
|
+
*
|
|
24013
|
+
* Returned rather than merely applied, because "the URL is right" and "the
|
|
24014
|
+
* client can KNOW the URL is right" are different properties. A client that
|
|
24015
|
+
* only sees a corrected URL cannot distinguish a hub that fixed the port from
|
|
24016
|
+
* a hub that echoed the port the client sent, so it cannot decide whether to
|
|
24017
|
+
* race the candidate or discard it. With `source` it can: anything but
|
|
24018
|
+
* `caller-hint` is the hub's own socket.
|
|
24019
|
+
*
|
|
24020
|
+
* Absent on hubs predating this field — a client that finds it missing is
|
|
24021
|
+
* talking to an echoing hub and must degrade exactly as it does for
|
|
24022
|
+
* `caller-hint`.
|
|
24023
|
+
*/
|
|
24024
|
+
localPort: AdvertisedLocalPortSchema
|
|
24025
|
+
});
|
|
23931
24026
|
/**
|
|
23932
24027
|
* The chosen outbound endpoint for notification artifacts. `baseUrl: null` =
|
|
23933
24028
|
* AUTO (resolved from the candidate ranking at send time); `resolved` reports
|
|
@@ -23948,8 +24043,13 @@ var AllowedAddressesSchema = object({
|
|
|
23948
24043
|
*/
|
|
23949
24044
|
addresses: array(string()).readonly() });
|
|
23950
24045
|
method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
|
|
23951
|
-
/**
|
|
23952
|
-
|
|
24046
|
+
/**
|
|
24047
|
+
* LEGACY HINT — do not send from new code. Kept optional so clients
|
|
24048
|
+
* written against the echoing contract keep working; the hub uses it
|
|
24049
|
+
* only when it cannot read its own port, and says so via
|
|
24050
|
+
* `localPort.source === 'caller-hint'`.
|
|
24051
|
+
*/
|
|
24052
|
+
port: number().int().min(1).max(65535).optional(),
|
|
23953
24053
|
/** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
|
|
23954
24054
|
* candidate. Default `true`. */
|
|
23955
24055
|
includeLoopback: boolean().optional(),
|
|
@@ -37137,7 +37237,6 @@ var NC_AUDIO_DEFAULTS = {
|
|
|
37137
37237
|
hitPercent: 60,
|
|
37138
37238
|
samplingSeconds: 10
|
|
37139
37239
|
};
|
|
37140
|
-
new Map(AUDIO_MACRO_LABELS.flatMap((macro) => macro.icon === void 0 ? [] : [[macro.id, macro.icon]]));
|
|
37141
37240
|
new Set(["devices", "classes"]);
|
|
37142
37241
|
NC_AUDIO_DEFAULTS.hitPercent, NC_AUDIO_DEFAULTS.samplingSeconds;
|
|
37143
37242
|
/**
|
|
@@ -37371,6 +37470,39 @@ TimelapseRuleInputSchema.extend({
|
|
|
37371
37470
|
createdAt: number(),
|
|
37372
37471
|
updatedAt: number()
|
|
37373
37472
|
});
|
|
37473
|
+
Object.freeze(Object.fromEntries([{
|
|
37474
|
+
stepId: "face-embedding",
|
|
37475
|
+
label: "Face recognition model",
|
|
37476
|
+
defaultModelId: "arcface-r100",
|
|
37477
|
+
indexName: "the enrolled face gallery",
|
|
37478
|
+
options: [
|
|
37479
|
+
{
|
|
37480
|
+
id: "arcface-r100",
|
|
37481
|
+
label: "ArcFace (ResNet34)"
|
|
37482
|
+
},
|
|
37483
|
+
{
|
|
37484
|
+
id: "auraface-r100",
|
|
37485
|
+
label: "AuraFace R100"
|
|
37486
|
+
},
|
|
37487
|
+
{
|
|
37488
|
+
id: "inception-resnet-v1",
|
|
37489
|
+
label: "Inception ResNet V1"
|
|
37490
|
+
}
|
|
37491
|
+
]
|
|
37492
|
+
}, {
|
|
37493
|
+
stepId: "clip-embedding",
|
|
37494
|
+
label: "Semantic search model",
|
|
37495
|
+
defaultModelId: "mobileclip-s1",
|
|
37496
|
+
indexName: "the object semantic-search index",
|
|
37497
|
+
options: [{
|
|
37498
|
+
id: "mobileclip-s1",
|
|
37499
|
+
label: "MobileCLIP S1"
|
|
37500
|
+
}, {
|
|
37501
|
+
id: "mobileclip-s2",
|
|
37502
|
+
label: "MobileCLIP S2"
|
|
37503
|
+
}]
|
|
37504
|
+
}].map((s) => [s.stepId, s.defaultModelId])));
|
|
37505
|
+
string().min(1);
|
|
37374
37506
|
object({
|
|
37375
37507
|
/**
|
|
37376
37508
|
* Fraction of the box's own size added on EACH side before cutting.
|
|
@@ -37391,10 +37523,21 @@ object({
|
|
|
37391
37523
|
*/
|
|
37392
37524
|
square: boolean()
|
|
37393
37525
|
});
|
|
37394
|
-
|
|
37526
|
+
/**
|
|
37527
|
+
* The convention in force when nobody has configured one — byte-for-byte the
|
|
37528
|
+
* behaviour of the pre-unification LIVE path (`DETAIL_CROP_PADDING_RATIO`).
|
|
37529
|
+
*/
|
|
37530
|
+
var DEFAULT_DETAIL_CROP_CONVENTION = {
|
|
37395
37531
|
paddingRatio: .15,
|
|
37396
37532
|
square: false
|
|
37397
|
-
}
|
|
37533
|
+
};
|
|
37534
|
+
Object.freeze({
|
|
37535
|
+
x: 0,
|
|
37536
|
+
y: 0,
|
|
37537
|
+
w: 1,
|
|
37538
|
+
h: 1
|
|
37539
|
+
});
|
|
37540
|
+
DEFAULT_DETAIL_CROP_CONVENTION.paddingRatio;
|
|
37398
37541
|
/**
|
|
37399
37542
|
* WHICH delivered frames the decode worker retains a native copy of.
|
|
37400
37543
|
*
|
package/dist/addon.mjs
CHANGED
|
@@ -7603,7 +7603,7 @@ var RecordingBandSchema = object({
|
|
|
7603
7603
|
postBufferSec: number().min(0).optional()
|
|
7604
7604
|
});
|
|
7605
7605
|
({
|
|
7606
|
-
preBufferSec:
|
|
7606
|
+
preBufferSec: 15,
|
|
7607
7607
|
postBufferSec: 30
|
|
7608
7608
|
}).postBufferSec * 1e3;
|
|
7609
7609
|
/**
|
|
@@ -13823,128 +13823,103 @@ var COCO_TO_MACRO = {
|
|
|
13823
13823
|
var AUDIO_MACRO_LABELS = [
|
|
13824
13824
|
{
|
|
13825
13825
|
id: "speech",
|
|
13826
|
-
name: "Speech"
|
|
13827
|
-
icon: "🗣️"
|
|
13826
|
+
name: "Speech"
|
|
13828
13827
|
},
|
|
13829
13828
|
{
|
|
13830
13829
|
id: "scream",
|
|
13831
|
-
name: "Scream / Shout"
|
|
13832
|
-
icon: "😱"
|
|
13830
|
+
name: "Scream / Shout"
|
|
13833
13831
|
},
|
|
13834
13832
|
{
|
|
13835
13833
|
id: "crying",
|
|
13836
|
-
name: "Crying / Baby"
|
|
13837
|
-
icon: "😢"
|
|
13834
|
+
name: "Crying / Baby"
|
|
13838
13835
|
},
|
|
13839
13836
|
{
|
|
13840
13837
|
id: "laughter",
|
|
13841
|
-
name: "Laughter"
|
|
13842
|
-
icon: "😂"
|
|
13838
|
+
name: "Laughter"
|
|
13843
13839
|
},
|
|
13844
13840
|
{
|
|
13845
13841
|
id: "music",
|
|
13846
|
-
name: "Music"
|
|
13847
|
-
icon: "🎵"
|
|
13842
|
+
name: "Music"
|
|
13848
13843
|
},
|
|
13849
13844
|
{
|
|
13850
13845
|
id: "dog",
|
|
13851
|
-
name: "Dog"
|
|
13852
|
-
icon: "🐕"
|
|
13846
|
+
name: "Dog"
|
|
13853
13847
|
},
|
|
13854
13848
|
{
|
|
13855
13849
|
id: "cat",
|
|
13856
|
-
name: "Cat"
|
|
13857
|
-
icon: "🐈"
|
|
13850
|
+
name: "Cat"
|
|
13858
13851
|
},
|
|
13859
13852
|
{
|
|
13860
13853
|
id: "bird",
|
|
13861
|
-
name: "Bird"
|
|
13862
|
-
icon: "🐦"
|
|
13854
|
+
name: "Bird"
|
|
13863
13855
|
},
|
|
13864
13856
|
{
|
|
13865
13857
|
id: "animal",
|
|
13866
|
-
name: "Animal (other)"
|
|
13867
|
-
icon: "🐾"
|
|
13858
|
+
name: "Animal (other)"
|
|
13868
13859
|
},
|
|
13869
13860
|
{
|
|
13870
13861
|
id: "alarm",
|
|
13871
|
-
name: "Alarm / Siren"
|
|
13872
|
-
icon: "🚨"
|
|
13862
|
+
name: "Alarm / Siren"
|
|
13873
13863
|
},
|
|
13874
13864
|
{
|
|
13875
13865
|
id: "doorbell",
|
|
13876
|
-
name: "Doorbell / Knock"
|
|
13877
|
-
icon: "🔔"
|
|
13866
|
+
name: "Doorbell / Knock"
|
|
13878
13867
|
},
|
|
13879
13868
|
{
|
|
13880
13869
|
id: "glass_breaking",
|
|
13881
|
-
name: "Glass Breaking"
|
|
13882
|
-
icon: "💥"
|
|
13870
|
+
name: "Glass Breaking"
|
|
13883
13871
|
},
|
|
13884
13872
|
{
|
|
13885
13873
|
id: "gunshot",
|
|
13886
|
-
name: "Gunshot / Explosion"
|
|
13887
|
-
icon: "💣"
|
|
13874
|
+
name: "Gunshot / Explosion"
|
|
13888
13875
|
},
|
|
13889
13876
|
{
|
|
13890
13877
|
id: "vehicle",
|
|
13891
|
-
name: "Vehicle"
|
|
13892
|
-
icon: "🚗"
|
|
13878
|
+
name: "Vehicle"
|
|
13893
13879
|
},
|
|
13894
13880
|
{
|
|
13895
13881
|
id: "siren",
|
|
13896
|
-
name: "Emergency Siren"
|
|
13897
|
-
icon: "🚑"
|
|
13882
|
+
name: "Emergency Siren"
|
|
13898
13883
|
},
|
|
13899
13884
|
{
|
|
13900
13885
|
id: "fire",
|
|
13901
|
-
name: "Fire / Smoke"
|
|
13902
|
-
icon: "🔥"
|
|
13886
|
+
name: "Fire / Smoke"
|
|
13903
13887
|
},
|
|
13904
13888
|
{
|
|
13905
13889
|
id: "water",
|
|
13906
|
-
name: "Water"
|
|
13907
|
-
icon: "💧"
|
|
13890
|
+
name: "Water"
|
|
13908
13891
|
},
|
|
13909
13892
|
{
|
|
13910
13893
|
id: "wind",
|
|
13911
|
-
name: "Wind / Weather"
|
|
13912
|
-
icon: "🌬️"
|
|
13894
|
+
name: "Wind / Weather"
|
|
13913
13895
|
},
|
|
13914
13896
|
{
|
|
13915
13897
|
id: "door",
|
|
13916
|
-
name: "Door"
|
|
13917
|
-
icon: "🚪"
|
|
13898
|
+
name: "Door"
|
|
13918
13899
|
},
|
|
13919
13900
|
{
|
|
13920
13901
|
id: "footsteps",
|
|
13921
|
-
name: "Footsteps"
|
|
13922
|
-
icon: "👣"
|
|
13902
|
+
name: "Footsteps"
|
|
13923
13903
|
},
|
|
13924
13904
|
{
|
|
13925
13905
|
id: "crowd",
|
|
13926
|
-
name: "Crowd / Chatter"
|
|
13927
|
-
icon: "👥"
|
|
13906
|
+
name: "Crowd / Chatter"
|
|
13928
13907
|
},
|
|
13929
13908
|
{
|
|
13930
13909
|
id: "telephone",
|
|
13931
|
-
name: "Telephone"
|
|
13932
|
-
icon: "📞"
|
|
13910
|
+
name: "Telephone"
|
|
13933
13911
|
},
|
|
13934
13912
|
{
|
|
13935
13913
|
id: "engine",
|
|
13936
|
-
name: "Engine / Motor"
|
|
13937
|
-
icon: "⚙️"
|
|
13914
|
+
name: "Engine / Motor"
|
|
13938
13915
|
},
|
|
13939
13916
|
{
|
|
13940
13917
|
id: "tools",
|
|
13941
|
-
name: "Tools / Construction"
|
|
13942
|
-
icon: "🔨"
|
|
13918
|
+
name: "Tools / Construction"
|
|
13943
13919
|
},
|
|
13944
13920
|
{
|
|
13945
13921
|
id: "silence",
|
|
13946
|
-
name: "Silence"
|
|
13947
|
-
icon: "🤫"
|
|
13922
|
+
name: "Silence"
|
|
13948
13923
|
}
|
|
13949
13924
|
];
|
|
13950
13925
|
var YAMNET_TO_MACRO = {
|
|
@@ -16446,7 +16421,7 @@ var TrackEnvelopeSchema = object({
|
|
|
16446
16421
|
* `snapshots[]` references — megabytes across a page of tracks. `slim`
|
|
16447
16422
|
* keeps every scalar the list surfaces actually render (ids, class(es),
|
|
16448
16423
|
* label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
|
|
16449
|
-
* zonesVisited, bestEventId, envelope, hasFace, hasRider) and returns `positions` /
|
|
16424
|
+
* zonesVisited, bestEventId, envelope, hasFace, hasEmbeddedFace, hasRider) and returns `positions` /
|
|
16450
16425
|
* `snapshots` as EMPTY arrays — detail views re-fetch the full row via
|
|
16451
16426
|
* `getTrack`. Mirrors the event-store `projection` convention
|
|
16452
16427
|
* (`getObjectEvents` et al.).
|
|
@@ -16741,6 +16716,35 @@ var TrackSchema = object({
|
|
|
16741
16716
|
*/
|
|
16742
16717
|
hasFace: boolean().optional(),
|
|
16743
16718
|
/**
|
|
16719
|
+
* This track has a face row IN THE GALLERY: a crop **and** an embedding — a
|
|
16720
|
+
* face an operator could ASSIGN to an identity.
|
|
16721
|
+
*
|
|
16722
|
+
* The STRICT twin of {@link hasFace}, and the pair only earns its keep
|
|
16723
|
+
* because the two disagree. `hasFace` is stamped at the TOP of the face
|
|
16724
|
+
* branch, before every gate, and means no more than "a face detector produced
|
|
16725
|
+
* a face detail". This one is stamped at the single moment the gallery row
|
|
16726
|
+
* LANDS — after `FaceRecognizer.onTrackEnd` successfully persists it, i.e.
|
|
16727
|
+
* past the embedding-magnitude verdict, the `minFacePx` detection gate, the
|
|
16728
|
+
* candidate gate, the imageless-track drop (no crop was ever captured) and
|
|
16729
|
+
* the crop-store drop. Everything between the detector and that insert can
|
|
16730
|
+
* legitimately refuse the face, so a flag written any earlier promises the
|
|
16731
|
+
* operator something to assign and delivers nothing.
|
|
16732
|
+
*
|
|
16733
|
+
* **Independent of recognition.** A face collected but never auto-matched is
|
|
16734
|
+
* still assignable — it is in fact the face an operator most wants to reach —
|
|
16735
|
+
* so this is NOT gated on `recognizedIdentityId`. Recognition lands in
|
|
16736
|
+
* `subLabel`; this says only that the raw material exists.
|
|
16737
|
+
*
|
|
16738
|
+
* **Set once, never cleared.** A track that produced a gallery row produced
|
|
16739
|
+
* one; deleting the row later is the gallery's business, not this flag's.
|
|
16740
|
+
*
|
|
16741
|
+
* **Absent ≠ false**, the same rule as {@link hasFace}: every row written
|
|
16742
|
+
* before the column omits it, and so does every server that predates the
|
|
16743
|
+
* field. A consumer must test `=== true` and render nothing otherwise —
|
|
16744
|
+
* never infer "no assignable face".
|
|
16745
|
+
*/
|
|
16746
|
+
hasEmbeddedFace: boolean().optional(),
|
|
16747
|
+
/**
|
|
16744
16748
|
* This subject CONTAINS a folded rider — a person the rider-pairing step
|
|
16745
16749
|
* ([D34](../decisions/adr-0034.md)) removed from the frame BEFORE the tracker,
|
|
16746
16750
|
* so the passage is tracked once and as a VEHICLE.
|
|
@@ -18130,6 +18134,32 @@ var DetailResultSchema = object({
|
|
|
18130
18134
|
/** FRAME-space bbox (already mapped back from crop space). */
|
|
18131
18135
|
bbox: NativeCropBboxSchema.optional(),
|
|
18132
18136
|
embedding: string().optional(),
|
|
18137
|
+
/**
|
|
18138
|
+
* L2 magnitude of the RAW pre-normalization embedding. Additive and optional
|
|
18139
|
+
* so an older runner that does not send it degrades to "unmeasurable", which
|
|
18140
|
+
* the consuming gate treats as accept — never as reject.
|
|
18141
|
+
*/
|
|
18142
|
+
embeddingMagnitude: number().optional(),
|
|
18143
|
+
/**
|
|
18144
|
+
* Model that produced `embedding` — the SAME contract `labelModelId` has for
|
|
18145
|
+
* `label`, and for the same reason: the producing node is the only side that
|
|
18146
|
+
* knows which model actually ran, and re-deriving it downstream is exactly
|
|
18147
|
+
* the inference this model exists to forbid.
|
|
18148
|
+
*
|
|
18149
|
+
* Additive and optional, so a runner that predates it degrades to
|
|
18150
|
+
* "unmeasurable" rather than to a wrong answer — the consumer falls back to
|
|
18151
|
+
* its previous assumption instead of refusing.
|
|
18152
|
+
*
|
|
18153
|
+
* Its absence was not cosmetic. `FaceRecognizer` needs the probe's model id
|
|
18154
|
+
* to use `face-matcher`'s same-model gate (`sample.modelId !== probe.modelId`);
|
|
18155
|
+
* with nothing on the wire it took the id from the GALLERY, so the gate
|
|
18156
|
+
* compared the gallery against itself and could never fire. That turned the
|
|
18157
|
+
* one guard protecting the face feature space into a tautology, and it is
|
|
18158
|
+
* why swapping `face-embedding`'s model would NOT have stranded the enrolled
|
|
18159
|
+
* gallery as the catalog comment predicts — it would have scored the new
|
|
18160
|
+
* model's vectors against the old model's samples in one cosine space.
|
|
18161
|
+
*/
|
|
18162
|
+
embeddingModelId: string().optional(),
|
|
18133
18163
|
label: string().optional(),
|
|
18134
18164
|
/**
|
|
18135
18165
|
* The tier `label` occupies, copied VERBATIM from the producing step's
|
|
@@ -19005,6 +19035,12 @@ var CameraStatusSchema = object({
|
|
|
19005
19035
|
/** Unix timestamp (ms) when this snapshot was composed server-side. */
|
|
19006
19036
|
fetchedAt: number()
|
|
19007
19037
|
});
|
|
19038
|
+
var InferenceDeviceExclusionReasonSchema = _enum([
|
|
19039
|
+
"disabled",
|
|
19040
|
+
"unavailable",
|
|
19041
|
+
"cannot-host-camera-root",
|
|
19042
|
+
"accelerator-preferred"
|
|
19043
|
+
]);
|
|
19008
19044
|
var NodeInferenceDeviceSchema = object({
|
|
19009
19045
|
/** Stable per-node device key, e.g. `openvino:npu`, `edgetpu:usb`, `cpu`. */
|
|
19010
19046
|
key: string(),
|
|
@@ -19035,7 +19071,17 @@ var NodeInferenceDeviceSchema = object({
|
|
|
19035
19071
|
* available per format; this is the stored selection that becomes the
|
|
19036
19072
|
* default for EVERY camera landing on this accelerator.
|
|
19037
19073
|
*/
|
|
19038
|
-
steps: record(string(), DeviceStepConfigSchema).optional()
|
|
19074
|
+
steps: record(string(), DeviceStepConfigSchema).optional(),
|
|
19075
|
+
/**
|
|
19076
|
+
* `null` when the device IS a camera-root candidate on this node; otherwise
|
|
19077
|
+
* the reason the dispatcher drops it. Computed by the SAME
|
|
19078
|
+
* `resolveInferenceDeviceEligibility` the dispatcher runs, so this view can
|
|
19079
|
+
* never disagree with the election — deriving it in the UI from
|
|
19080
|
+
* `enabled`/`available` would silently miss `cannot-host-camera-root` (needs
|
|
19081
|
+
* the node's model catalog) and `accelerator-preferred` (needs the node-wide
|
|
19082
|
+
* "an accelerator is serving" predicate).
|
|
19083
|
+
*/
|
|
19084
|
+
exclusion: InferenceDeviceExclusionReasonSchema.nullable()
|
|
19039
19085
|
});
|
|
19040
19086
|
var NodeInferenceDevicesSchema = object({
|
|
19041
19087
|
nodeId: string(),
|
|
@@ -19540,6 +19586,7 @@ DeviceType.Camera, method(object({
|
|
|
19540
19586
|
isBattery: boolean(),
|
|
19541
19587
|
reason: _enum([
|
|
19542
19588
|
"disabled",
|
|
19589
|
+
"offline",
|
|
19543
19590
|
"sleeping",
|
|
19544
19591
|
"unreachable",
|
|
19545
19592
|
"waking"
|
|
@@ -19585,9 +19632,17 @@ targets: array(object({
|
|
|
19585
19632
|
sleeping: boolean(),
|
|
19586
19633
|
/** Current device state rendered over the cached frame. State images
|
|
19587
19634
|
* remain authoritative even when their photographic background is
|
|
19588
|
-
* old; null means the link must carry a current camera frame.
|
|
19635
|
+
* old; null means the link must carry a current camera frame.
|
|
19636
|
+
*
|
|
19637
|
+
* **This is the ONLY source a surface may derive an inactive tile
|
|
19638
|
+
* from.** A client that reads a device's `online`/`disabled` flags and
|
|
19639
|
+
* draws its own verdict will disagree with the pixels it is painting
|
|
19640
|
+
* — the frame comes from here, and so must the sentence over it
|
|
19641
|
+
* (D190). Pair with `ageMs` for the age of the photograph behind the
|
|
19642
|
+
* state. */
|
|
19589
19643
|
stateReason: _enum([
|
|
19590
19644
|
"disabled",
|
|
19645
|
+
"offline",
|
|
19591
19646
|
"sleeping",
|
|
19592
19647
|
"unreachable",
|
|
19593
19648
|
"waking"
|
|
@@ -23885,7 +23940,12 @@ var ListResultSchema = object({
|
|
|
23885
23940
|
probedAt: number()
|
|
23886
23941
|
});
|
|
23887
23942
|
var PreferredSchema = LocalInterfaceSchema.nullable();
|
|
23888
|
-
|
|
23943
|
+
/**
|
|
23944
|
+
* Candidate base URL for the SDK to race on connect. Order matters —
|
|
23945
|
+
* the SDK should attempt these top-to-bottom with a short per-candidate
|
|
23946
|
+
* timeout (e.g. 1500ms) and cache the winner for the session.
|
|
23947
|
+
*/
|
|
23948
|
+
var ConnectionEndpointSchema = object({
|
|
23889
23949
|
/** Operator-facing label (e.g. "LAN — en0", "Public tunnel"). */
|
|
23890
23950
|
label: string(),
|
|
23891
23951
|
/** Fully-formed base URL with scheme + host + port. */
|
|
@@ -23928,7 +23988,42 @@ var GetConnectionEndpointsResultSchema = object({ endpoints: array(object({
|
|
|
23928
23988
|
* ordering between polls.
|
|
23929
23989
|
*/
|
|
23930
23990
|
priority: number()
|
|
23931
|
-
})
|
|
23991
|
+
});
|
|
23992
|
+
/**
|
|
23993
|
+
* Where the advertised local port came from. Ordered most → least
|
|
23994
|
+
* authoritative, and the whole point of returning it: a client must be able to
|
|
23995
|
+
* tell a FACT about the hub's socket from an echo of its own guess.
|
|
23996
|
+
*/
|
|
23997
|
+
var LocalPortSourceEnum = _enum([
|
|
23998
|
+
"server-config",
|
|
23999
|
+
"server-env",
|
|
24000
|
+
"caller-hint",
|
|
24001
|
+
"default"
|
|
24002
|
+
]);
|
|
24003
|
+
/** The port every LAN/loopback `baseUrl` in the same result was built with. */
|
|
24004
|
+
var AdvertisedLocalPortSchema = object({
|
|
24005
|
+
port: number().int().min(1).max(65535),
|
|
24006
|
+
source: LocalPortSourceEnum
|
|
24007
|
+
});
|
|
24008
|
+
var GetConnectionEndpointsResultSchema = object({
|
|
24009
|
+
endpoints: array(ConnectionEndpointSchema).readonly(),
|
|
24010
|
+
/**
|
|
24011
|
+
* The port the hub built the LAN/loopback URLs with, and where that number
|
|
24012
|
+
* came from.
|
|
24013
|
+
*
|
|
24014
|
+
* Returned rather than merely applied, because "the URL is right" and "the
|
|
24015
|
+
* client can KNOW the URL is right" are different properties. A client that
|
|
24016
|
+
* only sees a corrected URL cannot distinguish a hub that fixed the port from
|
|
24017
|
+
* a hub that echoed the port the client sent, so it cannot decide whether to
|
|
24018
|
+
* race the candidate or discard it. With `source` it can: anything but
|
|
24019
|
+
* `caller-hint` is the hub's own socket.
|
|
24020
|
+
*
|
|
24021
|
+
* Absent on hubs predating this field — a client that finds it missing is
|
|
24022
|
+
* talking to an echoing hub and must degrade exactly as it does for
|
|
24023
|
+
* `caller-hint`.
|
|
24024
|
+
*/
|
|
24025
|
+
localPort: AdvertisedLocalPortSchema
|
|
24026
|
+
});
|
|
23932
24027
|
/**
|
|
23933
24028
|
* The chosen outbound endpoint for notification artifacts. `baseUrl: null` =
|
|
23934
24029
|
* AUTO (resolved from the candidate ranking at send time); `resolved` reports
|
|
@@ -23949,8 +24044,13 @@ var AllowedAddressesSchema = object({
|
|
|
23949
24044
|
*/
|
|
23950
24045
|
addresses: array(string()).readonly() });
|
|
23951
24046
|
method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
|
|
23952
|
-
/**
|
|
23953
|
-
|
|
24047
|
+
/**
|
|
24048
|
+
* LEGACY HINT — do not send from new code. Kept optional so clients
|
|
24049
|
+
* written against the echoing contract keep working; the hub uses it
|
|
24050
|
+
* only when it cannot read its own port, and says so via
|
|
24051
|
+
* `localPort.source === 'caller-hint'`.
|
|
24052
|
+
*/
|
|
24053
|
+
port: number().int().min(1).max(65535).optional(),
|
|
23954
24054
|
/** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
|
|
23955
24055
|
* candidate. Default `true`. */
|
|
23956
24056
|
includeLoopback: boolean().optional(),
|
|
@@ -37138,7 +37238,6 @@ var NC_AUDIO_DEFAULTS = {
|
|
|
37138
37238
|
hitPercent: 60,
|
|
37139
37239
|
samplingSeconds: 10
|
|
37140
37240
|
};
|
|
37141
|
-
new Map(AUDIO_MACRO_LABELS.flatMap((macro) => macro.icon === void 0 ? [] : [[macro.id, macro.icon]]));
|
|
37142
37241
|
new Set(["devices", "classes"]);
|
|
37143
37242
|
NC_AUDIO_DEFAULTS.hitPercent, NC_AUDIO_DEFAULTS.samplingSeconds;
|
|
37144
37243
|
/**
|
|
@@ -37372,6 +37471,39 @@ TimelapseRuleInputSchema.extend({
|
|
|
37372
37471
|
createdAt: number(),
|
|
37373
37472
|
updatedAt: number()
|
|
37374
37473
|
});
|
|
37474
|
+
Object.freeze(Object.fromEntries([{
|
|
37475
|
+
stepId: "face-embedding",
|
|
37476
|
+
label: "Face recognition model",
|
|
37477
|
+
defaultModelId: "arcface-r100",
|
|
37478
|
+
indexName: "the enrolled face gallery",
|
|
37479
|
+
options: [
|
|
37480
|
+
{
|
|
37481
|
+
id: "arcface-r100",
|
|
37482
|
+
label: "ArcFace (ResNet34)"
|
|
37483
|
+
},
|
|
37484
|
+
{
|
|
37485
|
+
id: "auraface-r100",
|
|
37486
|
+
label: "AuraFace R100"
|
|
37487
|
+
},
|
|
37488
|
+
{
|
|
37489
|
+
id: "inception-resnet-v1",
|
|
37490
|
+
label: "Inception ResNet V1"
|
|
37491
|
+
}
|
|
37492
|
+
]
|
|
37493
|
+
}, {
|
|
37494
|
+
stepId: "clip-embedding",
|
|
37495
|
+
label: "Semantic search model",
|
|
37496
|
+
defaultModelId: "mobileclip-s1",
|
|
37497
|
+
indexName: "the object semantic-search index",
|
|
37498
|
+
options: [{
|
|
37499
|
+
id: "mobileclip-s1",
|
|
37500
|
+
label: "MobileCLIP S1"
|
|
37501
|
+
}, {
|
|
37502
|
+
id: "mobileclip-s2",
|
|
37503
|
+
label: "MobileCLIP S2"
|
|
37504
|
+
}]
|
|
37505
|
+
}].map((s) => [s.stepId, s.defaultModelId])));
|
|
37506
|
+
string().min(1);
|
|
37375
37507
|
object({
|
|
37376
37508
|
/**
|
|
37377
37509
|
* Fraction of the box's own size added on EACH side before cutting.
|
|
@@ -37392,10 +37524,21 @@ object({
|
|
|
37392
37524
|
*/
|
|
37393
37525
|
square: boolean()
|
|
37394
37526
|
});
|
|
37395
|
-
|
|
37527
|
+
/**
|
|
37528
|
+
* The convention in force when nobody has configured one — byte-for-byte the
|
|
37529
|
+
* behaviour of the pre-unification LIVE path (`DETAIL_CROP_PADDING_RATIO`).
|
|
37530
|
+
*/
|
|
37531
|
+
var DEFAULT_DETAIL_CROP_CONVENTION = {
|
|
37396
37532
|
paddingRatio: .15,
|
|
37397
37533
|
square: false
|
|
37398
|
-
}
|
|
37534
|
+
};
|
|
37535
|
+
Object.freeze({
|
|
37536
|
+
x: 0,
|
|
37537
|
+
y: 0,
|
|
37538
|
+
w: 1,
|
|
37539
|
+
h: 1
|
|
37540
|
+
});
|
|
37541
|
+
DEFAULT_DETAIL_CROP_CONVENTION.paddingRatio;
|
|
37399
37542
|
/**
|
|
37400
37543
|
* WHICH delivered frames the decode worker retains a native copy of.
|
|
37401
37544
|
*
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-provider-dreo",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.25",
|
|
4
4
|
"description": "Dreo smart-device (fan / air-circulator / purifier / heater / humidifier) device-provider addon for CamStack — wraps the @apocaliss92/nodedreo Dreo cloud client (REST + WebSocket)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|