@camstack/addon-mqtt-broker 1.2.23 → 1.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/mqtt-broker.addon.js +204 -61
- package/dist/mqtt-broker.addon.mjs +204 -61
- package/package.json +1 -1
|
@@ -7595,7 +7595,7 @@ var RecordingBandSchema = object({
|
|
|
7595
7595
|
postBufferSec: number().min(0).optional()
|
|
7596
7596
|
});
|
|
7597
7597
|
({
|
|
7598
|
-
preBufferSec:
|
|
7598
|
+
preBufferSec: 15,
|
|
7599
7599
|
postBufferSec: 30
|
|
7600
7600
|
}).postBufferSec * 1e3;
|
|
7601
7601
|
/**
|
|
@@ -13602,128 +13602,103 @@ var COCO_TO_MACRO = {
|
|
|
13602
13602
|
var AUDIO_MACRO_LABELS = [
|
|
13603
13603
|
{
|
|
13604
13604
|
id: "speech",
|
|
13605
|
-
name: "Speech"
|
|
13606
|
-
icon: "🗣️"
|
|
13605
|
+
name: "Speech"
|
|
13607
13606
|
},
|
|
13608
13607
|
{
|
|
13609
13608
|
id: "scream",
|
|
13610
|
-
name: "Scream / Shout"
|
|
13611
|
-
icon: "😱"
|
|
13609
|
+
name: "Scream / Shout"
|
|
13612
13610
|
},
|
|
13613
13611
|
{
|
|
13614
13612
|
id: "crying",
|
|
13615
|
-
name: "Crying / Baby"
|
|
13616
|
-
icon: "😢"
|
|
13613
|
+
name: "Crying / Baby"
|
|
13617
13614
|
},
|
|
13618
13615
|
{
|
|
13619
13616
|
id: "laughter",
|
|
13620
|
-
name: "Laughter"
|
|
13621
|
-
icon: "😂"
|
|
13617
|
+
name: "Laughter"
|
|
13622
13618
|
},
|
|
13623
13619
|
{
|
|
13624
13620
|
id: "music",
|
|
13625
|
-
name: "Music"
|
|
13626
|
-
icon: "🎵"
|
|
13621
|
+
name: "Music"
|
|
13627
13622
|
},
|
|
13628
13623
|
{
|
|
13629
13624
|
id: "dog",
|
|
13630
|
-
name: "Dog"
|
|
13631
|
-
icon: "🐕"
|
|
13625
|
+
name: "Dog"
|
|
13632
13626
|
},
|
|
13633
13627
|
{
|
|
13634
13628
|
id: "cat",
|
|
13635
|
-
name: "Cat"
|
|
13636
|
-
icon: "🐈"
|
|
13629
|
+
name: "Cat"
|
|
13637
13630
|
},
|
|
13638
13631
|
{
|
|
13639
13632
|
id: "bird",
|
|
13640
|
-
name: "Bird"
|
|
13641
|
-
icon: "🐦"
|
|
13633
|
+
name: "Bird"
|
|
13642
13634
|
},
|
|
13643
13635
|
{
|
|
13644
13636
|
id: "animal",
|
|
13645
|
-
name: "Animal (other)"
|
|
13646
|
-
icon: "🐾"
|
|
13637
|
+
name: "Animal (other)"
|
|
13647
13638
|
},
|
|
13648
13639
|
{
|
|
13649
13640
|
id: "alarm",
|
|
13650
|
-
name: "Alarm / Siren"
|
|
13651
|
-
icon: "🚨"
|
|
13641
|
+
name: "Alarm / Siren"
|
|
13652
13642
|
},
|
|
13653
13643
|
{
|
|
13654
13644
|
id: "doorbell",
|
|
13655
|
-
name: "Doorbell / Knock"
|
|
13656
|
-
icon: "🔔"
|
|
13645
|
+
name: "Doorbell / Knock"
|
|
13657
13646
|
},
|
|
13658
13647
|
{
|
|
13659
13648
|
id: "glass_breaking",
|
|
13660
|
-
name: "Glass Breaking"
|
|
13661
|
-
icon: "💥"
|
|
13649
|
+
name: "Glass Breaking"
|
|
13662
13650
|
},
|
|
13663
13651
|
{
|
|
13664
13652
|
id: "gunshot",
|
|
13665
|
-
name: "Gunshot / Explosion"
|
|
13666
|
-
icon: "💣"
|
|
13653
|
+
name: "Gunshot / Explosion"
|
|
13667
13654
|
},
|
|
13668
13655
|
{
|
|
13669
13656
|
id: "vehicle",
|
|
13670
|
-
name: "Vehicle"
|
|
13671
|
-
icon: "🚗"
|
|
13657
|
+
name: "Vehicle"
|
|
13672
13658
|
},
|
|
13673
13659
|
{
|
|
13674
13660
|
id: "siren",
|
|
13675
|
-
name: "Emergency Siren"
|
|
13676
|
-
icon: "🚑"
|
|
13661
|
+
name: "Emergency Siren"
|
|
13677
13662
|
},
|
|
13678
13663
|
{
|
|
13679
13664
|
id: "fire",
|
|
13680
|
-
name: "Fire / Smoke"
|
|
13681
|
-
icon: "🔥"
|
|
13665
|
+
name: "Fire / Smoke"
|
|
13682
13666
|
},
|
|
13683
13667
|
{
|
|
13684
13668
|
id: "water",
|
|
13685
|
-
name: "Water"
|
|
13686
|
-
icon: "💧"
|
|
13669
|
+
name: "Water"
|
|
13687
13670
|
},
|
|
13688
13671
|
{
|
|
13689
13672
|
id: "wind",
|
|
13690
|
-
name: "Wind / Weather"
|
|
13691
|
-
icon: "🌬️"
|
|
13673
|
+
name: "Wind / Weather"
|
|
13692
13674
|
},
|
|
13693
13675
|
{
|
|
13694
13676
|
id: "door",
|
|
13695
|
-
name: "Door"
|
|
13696
|
-
icon: "🚪"
|
|
13677
|
+
name: "Door"
|
|
13697
13678
|
},
|
|
13698
13679
|
{
|
|
13699
13680
|
id: "footsteps",
|
|
13700
|
-
name: "Footsteps"
|
|
13701
|
-
icon: "👣"
|
|
13681
|
+
name: "Footsteps"
|
|
13702
13682
|
},
|
|
13703
13683
|
{
|
|
13704
13684
|
id: "crowd",
|
|
13705
|
-
name: "Crowd / Chatter"
|
|
13706
|
-
icon: "👥"
|
|
13685
|
+
name: "Crowd / Chatter"
|
|
13707
13686
|
},
|
|
13708
13687
|
{
|
|
13709
13688
|
id: "telephone",
|
|
13710
|
-
name: "Telephone"
|
|
13711
|
-
icon: "📞"
|
|
13689
|
+
name: "Telephone"
|
|
13712
13690
|
},
|
|
13713
13691
|
{
|
|
13714
13692
|
id: "engine",
|
|
13715
|
-
name: "Engine / Motor"
|
|
13716
|
-
icon: "⚙️"
|
|
13693
|
+
name: "Engine / Motor"
|
|
13717
13694
|
},
|
|
13718
13695
|
{
|
|
13719
13696
|
id: "tools",
|
|
13720
|
-
name: "Tools / Construction"
|
|
13721
|
-
icon: "🔨"
|
|
13697
|
+
name: "Tools / Construction"
|
|
13722
13698
|
},
|
|
13723
13699
|
{
|
|
13724
13700
|
id: "silence",
|
|
13725
|
-
name: "Silence"
|
|
13726
|
-
icon: "🤫"
|
|
13701
|
+
name: "Silence"
|
|
13727
13702
|
}
|
|
13728
13703
|
];
|
|
13729
13704
|
var YAMNET_TO_MACRO = {
|
|
@@ -16187,7 +16162,7 @@ var TrackEnvelopeSchema = object({
|
|
|
16187
16162
|
* `snapshots[]` references — megabytes across a page of tracks. `slim`
|
|
16188
16163
|
* keeps every scalar the list surfaces actually render (ids, class(es),
|
|
16189
16164
|
* label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
|
|
16190
|
-
* zonesVisited, bestEventId, envelope, hasFace, hasRider) and returns `positions` /
|
|
16165
|
+
* zonesVisited, bestEventId, envelope, hasFace, hasEmbeddedFace, hasRider) and returns `positions` /
|
|
16191
16166
|
* `snapshots` as EMPTY arrays — detail views re-fetch the full row via
|
|
16192
16167
|
* `getTrack`. Mirrors the event-store `projection` convention
|
|
16193
16168
|
* (`getObjectEvents` et al.).
|
|
@@ -16482,6 +16457,35 @@ var TrackSchema = object({
|
|
|
16482
16457
|
*/
|
|
16483
16458
|
hasFace: boolean().optional(),
|
|
16484
16459
|
/**
|
|
16460
|
+
* This track has a face row IN THE GALLERY: a crop **and** an embedding — a
|
|
16461
|
+
* face an operator could ASSIGN to an identity.
|
|
16462
|
+
*
|
|
16463
|
+
* The STRICT twin of {@link hasFace}, and the pair only earns its keep
|
|
16464
|
+
* because the two disagree. `hasFace` is stamped at the TOP of the face
|
|
16465
|
+
* branch, before every gate, and means no more than "a face detector produced
|
|
16466
|
+
* a face detail". This one is stamped at the single moment the gallery row
|
|
16467
|
+
* LANDS — after `FaceRecognizer.onTrackEnd` successfully persists it, i.e.
|
|
16468
|
+
* past the embedding-magnitude verdict, the `minFacePx` detection gate, the
|
|
16469
|
+
* candidate gate, the imageless-track drop (no crop was ever captured) and
|
|
16470
|
+
* the crop-store drop. Everything between the detector and that insert can
|
|
16471
|
+
* legitimately refuse the face, so a flag written any earlier promises the
|
|
16472
|
+
* operator something to assign and delivers nothing.
|
|
16473
|
+
*
|
|
16474
|
+
* **Independent of recognition.** A face collected but never auto-matched is
|
|
16475
|
+
* still assignable — it is in fact the face an operator most wants to reach —
|
|
16476
|
+
* so this is NOT gated on `recognizedIdentityId`. Recognition lands in
|
|
16477
|
+
* `subLabel`; this says only that the raw material exists.
|
|
16478
|
+
*
|
|
16479
|
+
* **Set once, never cleared.** A track that produced a gallery row produced
|
|
16480
|
+
* one; deleting the row later is the gallery's business, not this flag's.
|
|
16481
|
+
*
|
|
16482
|
+
* **Absent ≠ false**, the same rule as {@link hasFace}: every row written
|
|
16483
|
+
* before the column omits it, and so does every server that predates the
|
|
16484
|
+
* field. A consumer must test `=== true` and render nothing otherwise —
|
|
16485
|
+
* never infer "no assignable face".
|
|
16486
|
+
*/
|
|
16487
|
+
hasEmbeddedFace: boolean().optional(),
|
|
16488
|
+
/**
|
|
16485
16489
|
* This subject CONTAINS a folded rider — a person the rider-pairing step
|
|
16486
16490
|
* ([D34](../decisions/adr-0034.md)) removed from the frame BEFORE the tracker,
|
|
16487
16491
|
* so the passage is tracked once and as a VEHICLE.
|
|
@@ -17831,6 +17835,32 @@ var DetailResultSchema = object({
|
|
|
17831
17835
|
/** FRAME-space bbox (already mapped back from crop space). */
|
|
17832
17836
|
bbox: NativeCropBboxSchema.optional(),
|
|
17833
17837
|
embedding: string().optional(),
|
|
17838
|
+
/**
|
|
17839
|
+
* L2 magnitude of the RAW pre-normalization embedding. Additive and optional
|
|
17840
|
+
* so an older runner that does not send it degrades to "unmeasurable", which
|
|
17841
|
+
* the consuming gate treats as accept — never as reject.
|
|
17842
|
+
*/
|
|
17843
|
+
embeddingMagnitude: number().optional(),
|
|
17844
|
+
/**
|
|
17845
|
+
* Model that produced `embedding` — the SAME contract `labelModelId` has for
|
|
17846
|
+
* `label`, and for the same reason: the producing node is the only side that
|
|
17847
|
+
* knows which model actually ran, and re-deriving it downstream is exactly
|
|
17848
|
+
* the inference this model exists to forbid.
|
|
17849
|
+
*
|
|
17850
|
+
* Additive and optional, so a runner that predates it degrades to
|
|
17851
|
+
* "unmeasurable" rather than to a wrong answer — the consumer falls back to
|
|
17852
|
+
* its previous assumption instead of refusing.
|
|
17853
|
+
*
|
|
17854
|
+
* Its absence was not cosmetic. `FaceRecognizer` needs the probe's model id
|
|
17855
|
+
* to use `face-matcher`'s same-model gate (`sample.modelId !== probe.modelId`);
|
|
17856
|
+
* with nothing on the wire it took the id from the GALLERY, so the gate
|
|
17857
|
+
* compared the gallery against itself and could never fire. That turned the
|
|
17858
|
+
* one guard protecting the face feature space into a tautology, and it is
|
|
17859
|
+
* why swapping `face-embedding`'s model would NOT have stranded the enrolled
|
|
17860
|
+
* gallery as the catalog comment predicts — it would have scored the new
|
|
17861
|
+
* model's vectors against the old model's samples in one cosine space.
|
|
17862
|
+
*/
|
|
17863
|
+
embeddingModelId: string().optional(),
|
|
17834
17864
|
label: string().optional(),
|
|
17835
17865
|
/**
|
|
17836
17866
|
* The tier `label` occupies, copied VERBATIM from the producing step's
|
|
@@ -18706,6 +18736,12 @@ var CameraStatusSchema = object({
|
|
|
18706
18736
|
/** Unix timestamp (ms) when this snapshot was composed server-side. */
|
|
18707
18737
|
fetchedAt: number()
|
|
18708
18738
|
});
|
|
18739
|
+
var InferenceDeviceExclusionReasonSchema = _enum([
|
|
18740
|
+
"disabled",
|
|
18741
|
+
"unavailable",
|
|
18742
|
+
"cannot-host-camera-root",
|
|
18743
|
+
"accelerator-preferred"
|
|
18744
|
+
]);
|
|
18709
18745
|
var NodeInferenceDeviceSchema = object({
|
|
18710
18746
|
/** Stable per-node device key, e.g. `openvino:npu`, `edgetpu:usb`, `cpu`. */
|
|
18711
18747
|
key: string(),
|
|
@@ -18736,7 +18772,17 @@ var NodeInferenceDeviceSchema = object({
|
|
|
18736
18772
|
* available per format; this is the stored selection that becomes the
|
|
18737
18773
|
* default for EVERY camera landing on this accelerator.
|
|
18738
18774
|
*/
|
|
18739
|
-
steps: record(string(), DeviceStepConfigSchema).optional()
|
|
18775
|
+
steps: record(string(), DeviceStepConfigSchema).optional(),
|
|
18776
|
+
/**
|
|
18777
|
+
* `null` when the device IS a camera-root candidate on this node; otherwise
|
|
18778
|
+
* the reason the dispatcher drops it. Computed by the SAME
|
|
18779
|
+
* `resolveInferenceDeviceEligibility` the dispatcher runs, so this view can
|
|
18780
|
+
* never disagree with the election — deriving it in the UI from
|
|
18781
|
+
* `enabled`/`available` would silently miss `cannot-host-camera-root` (needs
|
|
18782
|
+
* the node's model catalog) and `accelerator-preferred` (needs the node-wide
|
|
18783
|
+
* "an accelerator is serving" predicate).
|
|
18784
|
+
*/
|
|
18785
|
+
exclusion: InferenceDeviceExclusionReasonSchema.nullable()
|
|
18740
18786
|
});
|
|
18741
18787
|
var NodeInferenceDevicesSchema = object({
|
|
18742
18788
|
nodeId: string(),
|
|
@@ -19241,6 +19287,7 @@ DeviceType.Camera, method(object({
|
|
|
19241
19287
|
isBattery: boolean(),
|
|
19242
19288
|
reason: _enum([
|
|
19243
19289
|
"disabled",
|
|
19290
|
+
"offline",
|
|
19244
19291
|
"sleeping",
|
|
19245
19292
|
"unreachable",
|
|
19246
19293
|
"waking"
|
|
@@ -19286,9 +19333,17 @@ targets: array(object({
|
|
|
19286
19333
|
sleeping: boolean(),
|
|
19287
19334
|
/** Current device state rendered over the cached frame. State images
|
|
19288
19335
|
* remain authoritative even when their photographic background is
|
|
19289
|
-
* old; null means the link must carry a current camera frame.
|
|
19336
|
+
* old; null means the link must carry a current camera frame.
|
|
19337
|
+
*
|
|
19338
|
+
* **This is the ONLY source a surface may derive an inactive tile
|
|
19339
|
+
* from.** A client that reads a device's `online`/`disabled` flags and
|
|
19340
|
+
* draws its own verdict will disagree with the pixels it is painting
|
|
19341
|
+
* — the frame comes from here, and so must the sentence over it
|
|
19342
|
+
* (D190). Pair with `ageMs` for the age of the photograph behind the
|
|
19343
|
+
* state. */
|
|
19290
19344
|
stateReason: _enum([
|
|
19291
19345
|
"disabled",
|
|
19346
|
+
"offline",
|
|
19292
19347
|
"sleeping",
|
|
19293
19348
|
"unreachable",
|
|
19294
19349
|
"waking"
|
|
@@ -22485,7 +22540,12 @@ var ListResultSchema = object({
|
|
|
22485
22540
|
probedAt: number()
|
|
22486
22541
|
});
|
|
22487
22542
|
var PreferredSchema = LocalInterfaceSchema.nullable();
|
|
22488
|
-
|
|
22543
|
+
/**
|
|
22544
|
+
* Candidate base URL for the SDK to race on connect. Order matters —
|
|
22545
|
+
* the SDK should attempt these top-to-bottom with a short per-candidate
|
|
22546
|
+
* timeout (e.g. 1500ms) and cache the winner for the session.
|
|
22547
|
+
*/
|
|
22548
|
+
var ConnectionEndpointSchema = object({
|
|
22489
22549
|
/** Operator-facing label (e.g. "LAN — en0", "Public tunnel"). */
|
|
22490
22550
|
label: string(),
|
|
22491
22551
|
/** Fully-formed base URL with scheme + host + port. */
|
|
@@ -22528,7 +22588,42 @@ var GetConnectionEndpointsResultSchema = object({ endpoints: array(object({
|
|
|
22528
22588
|
* ordering between polls.
|
|
22529
22589
|
*/
|
|
22530
22590
|
priority: number()
|
|
22531
|
-
})
|
|
22591
|
+
});
|
|
22592
|
+
/**
|
|
22593
|
+
* Where the advertised local port came from. Ordered most → least
|
|
22594
|
+
* authoritative, and the whole point of returning it: a client must be able to
|
|
22595
|
+
* tell a FACT about the hub's socket from an echo of its own guess.
|
|
22596
|
+
*/
|
|
22597
|
+
var LocalPortSourceEnum = _enum([
|
|
22598
|
+
"server-config",
|
|
22599
|
+
"server-env",
|
|
22600
|
+
"caller-hint",
|
|
22601
|
+
"default"
|
|
22602
|
+
]);
|
|
22603
|
+
/** The port every LAN/loopback `baseUrl` in the same result was built with. */
|
|
22604
|
+
var AdvertisedLocalPortSchema = object({
|
|
22605
|
+
port: number().int().min(1).max(65535),
|
|
22606
|
+
source: LocalPortSourceEnum
|
|
22607
|
+
});
|
|
22608
|
+
var GetConnectionEndpointsResultSchema = object({
|
|
22609
|
+
endpoints: array(ConnectionEndpointSchema).readonly(),
|
|
22610
|
+
/**
|
|
22611
|
+
* The port the hub built the LAN/loopback URLs with, and where that number
|
|
22612
|
+
* came from.
|
|
22613
|
+
*
|
|
22614
|
+
* Returned rather than merely applied, because "the URL is right" and "the
|
|
22615
|
+
* client can KNOW the URL is right" are different properties. A client that
|
|
22616
|
+
* only sees a corrected URL cannot distinguish a hub that fixed the port from
|
|
22617
|
+
* a hub that echoed the port the client sent, so it cannot decide whether to
|
|
22618
|
+
* race the candidate or discard it. With `source` it can: anything but
|
|
22619
|
+
* `caller-hint` is the hub's own socket.
|
|
22620
|
+
*
|
|
22621
|
+
* Absent on hubs predating this field — a client that finds it missing is
|
|
22622
|
+
* talking to an echoing hub and must degrade exactly as it does for
|
|
22623
|
+
* `caller-hint`.
|
|
22624
|
+
*/
|
|
22625
|
+
localPort: AdvertisedLocalPortSchema
|
|
22626
|
+
});
|
|
22532
22627
|
/**
|
|
22533
22628
|
* The chosen outbound endpoint for notification artifacts. `baseUrl: null` =
|
|
22534
22629
|
* AUTO (resolved from the candidate ranking at send time); `resolved` reports
|
|
@@ -22549,8 +22644,13 @@ var AllowedAddressesSchema = object({
|
|
|
22549
22644
|
*/
|
|
22550
22645
|
addresses: array(string()).readonly() });
|
|
22551
22646
|
method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
|
|
22552
|
-
/**
|
|
22553
|
-
|
|
22647
|
+
/**
|
|
22648
|
+
* LEGACY HINT — do not send from new code. Kept optional so clients
|
|
22649
|
+
* written against the echoing contract keep working; the hub uses it
|
|
22650
|
+
* only when it cannot read its own port, and says so via
|
|
22651
|
+
* `localPort.source === 'caller-hint'`.
|
|
22652
|
+
*/
|
|
22653
|
+
port: number().int().min(1).max(65535).optional(),
|
|
22554
22654
|
/** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
|
|
22555
22655
|
* candidate. Default `true`. */
|
|
22556
22656
|
includeLoopback: boolean().optional(),
|
|
@@ -33474,7 +33574,6 @@ var NC_AUDIO_DEFAULTS = {
|
|
|
33474
33574
|
hitPercent: 60,
|
|
33475
33575
|
samplingSeconds: 10
|
|
33476
33576
|
};
|
|
33477
|
-
new Map(AUDIO_MACRO_LABELS.flatMap((macro) => macro.icon === void 0 ? [] : [[macro.id, macro.icon]]));
|
|
33478
33577
|
new Set(["devices", "classes"]);
|
|
33479
33578
|
NC_AUDIO_DEFAULTS.hitPercent, NC_AUDIO_DEFAULTS.samplingSeconds;
|
|
33480
33579
|
/**
|
|
@@ -33708,6 +33807,39 @@ TimelapseRuleInputSchema.extend({
|
|
|
33708
33807
|
createdAt: number(),
|
|
33709
33808
|
updatedAt: number()
|
|
33710
33809
|
});
|
|
33810
|
+
Object.freeze(Object.fromEntries([{
|
|
33811
|
+
stepId: "face-embedding",
|
|
33812
|
+
label: "Face recognition model",
|
|
33813
|
+
defaultModelId: "arcface-r100",
|
|
33814
|
+
indexName: "the enrolled face gallery",
|
|
33815
|
+
options: [
|
|
33816
|
+
{
|
|
33817
|
+
id: "arcface-r100",
|
|
33818
|
+
label: "ArcFace (ResNet34)"
|
|
33819
|
+
},
|
|
33820
|
+
{
|
|
33821
|
+
id: "auraface-r100",
|
|
33822
|
+
label: "AuraFace R100"
|
|
33823
|
+
},
|
|
33824
|
+
{
|
|
33825
|
+
id: "inception-resnet-v1",
|
|
33826
|
+
label: "Inception ResNet V1"
|
|
33827
|
+
}
|
|
33828
|
+
]
|
|
33829
|
+
}, {
|
|
33830
|
+
stepId: "clip-embedding",
|
|
33831
|
+
label: "Semantic search model",
|
|
33832
|
+
defaultModelId: "mobileclip-s1",
|
|
33833
|
+
indexName: "the object semantic-search index",
|
|
33834
|
+
options: [{
|
|
33835
|
+
id: "mobileclip-s1",
|
|
33836
|
+
label: "MobileCLIP S1"
|
|
33837
|
+
}, {
|
|
33838
|
+
id: "mobileclip-s2",
|
|
33839
|
+
label: "MobileCLIP S2"
|
|
33840
|
+
}]
|
|
33841
|
+
}].map((s) => [s.stepId, s.defaultModelId])));
|
|
33842
|
+
string().min(1);
|
|
33711
33843
|
object({
|
|
33712
33844
|
/**
|
|
33713
33845
|
* Fraction of the box's own size added on EACH side before cutting.
|
|
@@ -33728,10 +33860,21 @@ object({
|
|
|
33728
33860
|
*/
|
|
33729
33861
|
square: boolean()
|
|
33730
33862
|
});
|
|
33731
|
-
|
|
33863
|
+
/**
|
|
33864
|
+
* The convention in force when nobody has configured one — byte-for-byte the
|
|
33865
|
+
* behaviour of the pre-unification LIVE path (`DETAIL_CROP_PADDING_RATIO`).
|
|
33866
|
+
*/
|
|
33867
|
+
var DEFAULT_DETAIL_CROP_CONVENTION = {
|
|
33732
33868
|
paddingRatio: .15,
|
|
33733
33869
|
square: false
|
|
33734
|
-
}
|
|
33870
|
+
};
|
|
33871
|
+
Object.freeze({
|
|
33872
|
+
x: 0,
|
|
33873
|
+
y: 0,
|
|
33874
|
+
w: 1,
|
|
33875
|
+
h: 1
|
|
33876
|
+
});
|
|
33877
|
+
DEFAULT_DETAIL_CROP_CONVENTION.paddingRatio;
|
|
33735
33878
|
/**
|
|
33736
33879
|
* WHICH delivered frames the decode worker retains a native copy of.
|
|
33737
33880
|
*
|
|
@@ -7590,7 +7590,7 @@ var RecordingBandSchema = object({
|
|
|
7590
7590
|
postBufferSec: number().min(0).optional()
|
|
7591
7591
|
});
|
|
7592
7592
|
({
|
|
7593
|
-
preBufferSec:
|
|
7593
|
+
preBufferSec: 15,
|
|
7594
7594
|
postBufferSec: 30
|
|
7595
7595
|
}).postBufferSec * 1e3;
|
|
7596
7596
|
/**
|
|
@@ -13597,128 +13597,103 @@ var COCO_TO_MACRO = {
|
|
|
13597
13597
|
var AUDIO_MACRO_LABELS = [
|
|
13598
13598
|
{
|
|
13599
13599
|
id: "speech",
|
|
13600
|
-
name: "Speech"
|
|
13601
|
-
icon: "🗣️"
|
|
13600
|
+
name: "Speech"
|
|
13602
13601
|
},
|
|
13603
13602
|
{
|
|
13604
13603
|
id: "scream",
|
|
13605
|
-
name: "Scream / Shout"
|
|
13606
|
-
icon: "😱"
|
|
13604
|
+
name: "Scream / Shout"
|
|
13607
13605
|
},
|
|
13608
13606
|
{
|
|
13609
13607
|
id: "crying",
|
|
13610
|
-
name: "Crying / Baby"
|
|
13611
|
-
icon: "😢"
|
|
13608
|
+
name: "Crying / Baby"
|
|
13612
13609
|
},
|
|
13613
13610
|
{
|
|
13614
13611
|
id: "laughter",
|
|
13615
|
-
name: "Laughter"
|
|
13616
|
-
icon: "😂"
|
|
13612
|
+
name: "Laughter"
|
|
13617
13613
|
},
|
|
13618
13614
|
{
|
|
13619
13615
|
id: "music",
|
|
13620
|
-
name: "Music"
|
|
13621
|
-
icon: "🎵"
|
|
13616
|
+
name: "Music"
|
|
13622
13617
|
},
|
|
13623
13618
|
{
|
|
13624
13619
|
id: "dog",
|
|
13625
|
-
name: "Dog"
|
|
13626
|
-
icon: "🐕"
|
|
13620
|
+
name: "Dog"
|
|
13627
13621
|
},
|
|
13628
13622
|
{
|
|
13629
13623
|
id: "cat",
|
|
13630
|
-
name: "Cat"
|
|
13631
|
-
icon: "🐈"
|
|
13624
|
+
name: "Cat"
|
|
13632
13625
|
},
|
|
13633
13626
|
{
|
|
13634
13627
|
id: "bird",
|
|
13635
|
-
name: "Bird"
|
|
13636
|
-
icon: "🐦"
|
|
13628
|
+
name: "Bird"
|
|
13637
13629
|
},
|
|
13638
13630
|
{
|
|
13639
13631
|
id: "animal",
|
|
13640
|
-
name: "Animal (other)"
|
|
13641
|
-
icon: "🐾"
|
|
13632
|
+
name: "Animal (other)"
|
|
13642
13633
|
},
|
|
13643
13634
|
{
|
|
13644
13635
|
id: "alarm",
|
|
13645
|
-
name: "Alarm / Siren"
|
|
13646
|
-
icon: "🚨"
|
|
13636
|
+
name: "Alarm / Siren"
|
|
13647
13637
|
},
|
|
13648
13638
|
{
|
|
13649
13639
|
id: "doorbell",
|
|
13650
|
-
name: "Doorbell / Knock"
|
|
13651
|
-
icon: "🔔"
|
|
13640
|
+
name: "Doorbell / Knock"
|
|
13652
13641
|
},
|
|
13653
13642
|
{
|
|
13654
13643
|
id: "glass_breaking",
|
|
13655
|
-
name: "Glass Breaking"
|
|
13656
|
-
icon: "💥"
|
|
13644
|
+
name: "Glass Breaking"
|
|
13657
13645
|
},
|
|
13658
13646
|
{
|
|
13659
13647
|
id: "gunshot",
|
|
13660
|
-
name: "Gunshot / Explosion"
|
|
13661
|
-
icon: "💣"
|
|
13648
|
+
name: "Gunshot / Explosion"
|
|
13662
13649
|
},
|
|
13663
13650
|
{
|
|
13664
13651
|
id: "vehicle",
|
|
13665
|
-
name: "Vehicle"
|
|
13666
|
-
icon: "🚗"
|
|
13652
|
+
name: "Vehicle"
|
|
13667
13653
|
},
|
|
13668
13654
|
{
|
|
13669
13655
|
id: "siren",
|
|
13670
|
-
name: "Emergency Siren"
|
|
13671
|
-
icon: "🚑"
|
|
13656
|
+
name: "Emergency Siren"
|
|
13672
13657
|
},
|
|
13673
13658
|
{
|
|
13674
13659
|
id: "fire",
|
|
13675
|
-
name: "Fire / Smoke"
|
|
13676
|
-
icon: "🔥"
|
|
13660
|
+
name: "Fire / Smoke"
|
|
13677
13661
|
},
|
|
13678
13662
|
{
|
|
13679
13663
|
id: "water",
|
|
13680
|
-
name: "Water"
|
|
13681
|
-
icon: "💧"
|
|
13664
|
+
name: "Water"
|
|
13682
13665
|
},
|
|
13683
13666
|
{
|
|
13684
13667
|
id: "wind",
|
|
13685
|
-
name: "Wind / Weather"
|
|
13686
|
-
icon: "🌬️"
|
|
13668
|
+
name: "Wind / Weather"
|
|
13687
13669
|
},
|
|
13688
13670
|
{
|
|
13689
13671
|
id: "door",
|
|
13690
|
-
name: "Door"
|
|
13691
|
-
icon: "🚪"
|
|
13672
|
+
name: "Door"
|
|
13692
13673
|
},
|
|
13693
13674
|
{
|
|
13694
13675
|
id: "footsteps",
|
|
13695
|
-
name: "Footsteps"
|
|
13696
|
-
icon: "👣"
|
|
13676
|
+
name: "Footsteps"
|
|
13697
13677
|
},
|
|
13698
13678
|
{
|
|
13699
13679
|
id: "crowd",
|
|
13700
|
-
name: "Crowd / Chatter"
|
|
13701
|
-
icon: "👥"
|
|
13680
|
+
name: "Crowd / Chatter"
|
|
13702
13681
|
},
|
|
13703
13682
|
{
|
|
13704
13683
|
id: "telephone",
|
|
13705
|
-
name: "Telephone"
|
|
13706
|
-
icon: "📞"
|
|
13684
|
+
name: "Telephone"
|
|
13707
13685
|
},
|
|
13708
13686
|
{
|
|
13709
13687
|
id: "engine",
|
|
13710
|
-
name: "Engine / Motor"
|
|
13711
|
-
icon: "⚙️"
|
|
13688
|
+
name: "Engine / Motor"
|
|
13712
13689
|
},
|
|
13713
13690
|
{
|
|
13714
13691
|
id: "tools",
|
|
13715
|
-
name: "Tools / Construction"
|
|
13716
|
-
icon: "🔨"
|
|
13692
|
+
name: "Tools / Construction"
|
|
13717
13693
|
},
|
|
13718
13694
|
{
|
|
13719
13695
|
id: "silence",
|
|
13720
|
-
name: "Silence"
|
|
13721
|
-
icon: "🤫"
|
|
13696
|
+
name: "Silence"
|
|
13722
13697
|
}
|
|
13723
13698
|
];
|
|
13724
13699
|
var YAMNET_TO_MACRO = {
|
|
@@ -16182,7 +16157,7 @@ var TrackEnvelopeSchema = object({
|
|
|
16182
16157
|
* `snapshots[]` references — megabytes across a page of tracks. `slim`
|
|
16183
16158
|
* keeps every scalar the list surfaces actually render (ids, class(es),
|
|
16184
16159
|
* label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
|
|
16185
|
-
* zonesVisited, bestEventId, envelope, hasFace, hasRider) and returns `positions` /
|
|
16160
|
+
* zonesVisited, bestEventId, envelope, hasFace, hasEmbeddedFace, hasRider) and returns `positions` /
|
|
16186
16161
|
* `snapshots` as EMPTY arrays — detail views re-fetch the full row via
|
|
16187
16162
|
* `getTrack`. Mirrors the event-store `projection` convention
|
|
16188
16163
|
* (`getObjectEvents` et al.).
|
|
@@ -16477,6 +16452,35 @@ var TrackSchema = object({
|
|
|
16477
16452
|
*/
|
|
16478
16453
|
hasFace: boolean().optional(),
|
|
16479
16454
|
/**
|
|
16455
|
+
* This track has a face row IN THE GALLERY: a crop **and** an embedding — a
|
|
16456
|
+
* face an operator could ASSIGN to an identity.
|
|
16457
|
+
*
|
|
16458
|
+
* The STRICT twin of {@link hasFace}, and the pair only earns its keep
|
|
16459
|
+
* because the two disagree. `hasFace` is stamped at the TOP of the face
|
|
16460
|
+
* branch, before every gate, and means no more than "a face detector produced
|
|
16461
|
+
* a face detail". This one is stamped at the single moment the gallery row
|
|
16462
|
+
* LANDS — after `FaceRecognizer.onTrackEnd` successfully persists it, i.e.
|
|
16463
|
+
* past the embedding-magnitude verdict, the `minFacePx` detection gate, the
|
|
16464
|
+
* candidate gate, the imageless-track drop (no crop was ever captured) and
|
|
16465
|
+
* the crop-store drop. Everything between the detector and that insert can
|
|
16466
|
+
* legitimately refuse the face, so a flag written any earlier promises the
|
|
16467
|
+
* operator something to assign and delivers nothing.
|
|
16468
|
+
*
|
|
16469
|
+
* **Independent of recognition.** A face collected but never auto-matched is
|
|
16470
|
+
* still assignable — it is in fact the face an operator most wants to reach —
|
|
16471
|
+
* so this is NOT gated on `recognizedIdentityId`. Recognition lands in
|
|
16472
|
+
* `subLabel`; this says only that the raw material exists.
|
|
16473
|
+
*
|
|
16474
|
+
* **Set once, never cleared.** A track that produced a gallery row produced
|
|
16475
|
+
* one; deleting the row later is the gallery's business, not this flag's.
|
|
16476
|
+
*
|
|
16477
|
+
* **Absent ≠ false**, the same rule as {@link hasFace}: every row written
|
|
16478
|
+
* before the column omits it, and so does every server that predates the
|
|
16479
|
+
* field. A consumer must test `=== true` and render nothing otherwise —
|
|
16480
|
+
* never infer "no assignable face".
|
|
16481
|
+
*/
|
|
16482
|
+
hasEmbeddedFace: boolean().optional(),
|
|
16483
|
+
/**
|
|
16480
16484
|
* This subject CONTAINS a folded rider — a person the rider-pairing step
|
|
16481
16485
|
* ([D34](../decisions/adr-0034.md)) removed from the frame BEFORE the tracker,
|
|
16482
16486
|
* so the passage is tracked once and as a VEHICLE.
|
|
@@ -17826,6 +17830,32 @@ var DetailResultSchema = object({
|
|
|
17826
17830
|
/** FRAME-space bbox (already mapped back from crop space). */
|
|
17827
17831
|
bbox: NativeCropBboxSchema.optional(),
|
|
17828
17832
|
embedding: string().optional(),
|
|
17833
|
+
/**
|
|
17834
|
+
* L2 magnitude of the RAW pre-normalization embedding. Additive and optional
|
|
17835
|
+
* so an older runner that does not send it degrades to "unmeasurable", which
|
|
17836
|
+
* the consuming gate treats as accept — never as reject.
|
|
17837
|
+
*/
|
|
17838
|
+
embeddingMagnitude: number().optional(),
|
|
17839
|
+
/**
|
|
17840
|
+
* Model that produced `embedding` — the SAME contract `labelModelId` has for
|
|
17841
|
+
* `label`, and for the same reason: the producing node is the only side that
|
|
17842
|
+
* knows which model actually ran, and re-deriving it downstream is exactly
|
|
17843
|
+
* the inference this model exists to forbid.
|
|
17844
|
+
*
|
|
17845
|
+
* Additive and optional, so a runner that predates it degrades to
|
|
17846
|
+
* "unmeasurable" rather than to a wrong answer — the consumer falls back to
|
|
17847
|
+
* its previous assumption instead of refusing.
|
|
17848
|
+
*
|
|
17849
|
+
* Its absence was not cosmetic. `FaceRecognizer` needs the probe's model id
|
|
17850
|
+
* to use `face-matcher`'s same-model gate (`sample.modelId !== probe.modelId`);
|
|
17851
|
+
* with nothing on the wire it took the id from the GALLERY, so the gate
|
|
17852
|
+
* compared the gallery against itself and could never fire. That turned the
|
|
17853
|
+
* one guard protecting the face feature space into a tautology, and it is
|
|
17854
|
+
* why swapping `face-embedding`'s model would NOT have stranded the enrolled
|
|
17855
|
+
* gallery as the catalog comment predicts — it would have scored the new
|
|
17856
|
+
* model's vectors against the old model's samples in one cosine space.
|
|
17857
|
+
*/
|
|
17858
|
+
embeddingModelId: string().optional(),
|
|
17829
17859
|
label: string().optional(),
|
|
17830
17860
|
/**
|
|
17831
17861
|
* The tier `label` occupies, copied VERBATIM from the producing step's
|
|
@@ -18701,6 +18731,12 @@ var CameraStatusSchema = object({
|
|
|
18701
18731
|
/** Unix timestamp (ms) when this snapshot was composed server-side. */
|
|
18702
18732
|
fetchedAt: number()
|
|
18703
18733
|
});
|
|
18734
|
+
var InferenceDeviceExclusionReasonSchema = _enum([
|
|
18735
|
+
"disabled",
|
|
18736
|
+
"unavailable",
|
|
18737
|
+
"cannot-host-camera-root",
|
|
18738
|
+
"accelerator-preferred"
|
|
18739
|
+
]);
|
|
18704
18740
|
var NodeInferenceDeviceSchema = object({
|
|
18705
18741
|
/** Stable per-node device key, e.g. `openvino:npu`, `edgetpu:usb`, `cpu`. */
|
|
18706
18742
|
key: string(),
|
|
@@ -18731,7 +18767,17 @@ var NodeInferenceDeviceSchema = object({
|
|
|
18731
18767
|
* available per format; this is the stored selection that becomes the
|
|
18732
18768
|
* default for EVERY camera landing on this accelerator.
|
|
18733
18769
|
*/
|
|
18734
|
-
steps: record(string(), DeviceStepConfigSchema).optional()
|
|
18770
|
+
steps: record(string(), DeviceStepConfigSchema).optional(),
|
|
18771
|
+
/**
|
|
18772
|
+
* `null` when the device IS a camera-root candidate on this node; otherwise
|
|
18773
|
+
* the reason the dispatcher drops it. Computed by the SAME
|
|
18774
|
+
* `resolveInferenceDeviceEligibility` the dispatcher runs, so this view can
|
|
18775
|
+
* never disagree with the election — deriving it in the UI from
|
|
18776
|
+
* `enabled`/`available` would silently miss `cannot-host-camera-root` (needs
|
|
18777
|
+
* the node's model catalog) and `accelerator-preferred` (needs the node-wide
|
|
18778
|
+
* "an accelerator is serving" predicate).
|
|
18779
|
+
*/
|
|
18780
|
+
exclusion: InferenceDeviceExclusionReasonSchema.nullable()
|
|
18735
18781
|
});
|
|
18736
18782
|
var NodeInferenceDevicesSchema = object({
|
|
18737
18783
|
nodeId: string(),
|
|
@@ -19236,6 +19282,7 @@ DeviceType.Camera, method(object({
|
|
|
19236
19282
|
isBattery: boolean(),
|
|
19237
19283
|
reason: _enum([
|
|
19238
19284
|
"disabled",
|
|
19285
|
+
"offline",
|
|
19239
19286
|
"sleeping",
|
|
19240
19287
|
"unreachable",
|
|
19241
19288
|
"waking"
|
|
@@ -19281,9 +19328,17 @@ targets: array(object({
|
|
|
19281
19328
|
sleeping: boolean(),
|
|
19282
19329
|
/** Current device state rendered over the cached frame. State images
|
|
19283
19330
|
* remain authoritative even when their photographic background is
|
|
19284
|
-
* old; null means the link must carry a current camera frame.
|
|
19331
|
+
* old; null means the link must carry a current camera frame.
|
|
19332
|
+
*
|
|
19333
|
+
* **This is the ONLY source a surface may derive an inactive tile
|
|
19334
|
+
* from.** A client that reads a device's `online`/`disabled` flags and
|
|
19335
|
+
* draws its own verdict will disagree with the pixels it is painting
|
|
19336
|
+
* — the frame comes from here, and so must the sentence over it
|
|
19337
|
+
* (D190). Pair with `ageMs` for the age of the photograph behind the
|
|
19338
|
+
* state. */
|
|
19285
19339
|
stateReason: _enum([
|
|
19286
19340
|
"disabled",
|
|
19341
|
+
"offline",
|
|
19287
19342
|
"sleeping",
|
|
19288
19343
|
"unreachable",
|
|
19289
19344
|
"waking"
|
|
@@ -22480,7 +22535,12 @@ var ListResultSchema = object({
|
|
|
22480
22535
|
probedAt: number()
|
|
22481
22536
|
});
|
|
22482
22537
|
var PreferredSchema = LocalInterfaceSchema.nullable();
|
|
22483
|
-
|
|
22538
|
+
/**
|
|
22539
|
+
* Candidate base URL for the SDK to race on connect. Order matters —
|
|
22540
|
+
* the SDK should attempt these top-to-bottom with a short per-candidate
|
|
22541
|
+
* timeout (e.g. 1500ms) and cache the winner for the session.
|
|
22542
|
+
*/
|
|
22543
|
+
var ConnectionEndpointSchema = object({
|
|
22484
22544
|
/** Operator-facing label (e.g. "LAN — en0", "Public tunnel"). */
|
|
22485
22545
|
label: string(),
|
|
22486
22546
|
/** Fully-formed base URL with scheme + host + port. */
|
|
@@ -22523,7 +22583,42 @@ var GetConnectionEndpointsResultSchema = object({ endpoints: array(object({
|
|
|
22523
22583
|
* ordering between polls.
|
|
22524
22584
|
*/
|
|
22525
22585
|
priority: number()
|
|
22526
|
-
})
|
|
22586
|
+
});
|
|
22587
|
+
/**
|
|
22588
|
+
* Where the advertised local port came from. Ordered most → least
|
|
22589
|
+
* authoritative, and the whole point of returning it: a client must be able to
|
|
22590
|
+
* tell a FACT about the hub's socket from an echo of its own guess.
|
|
22591
|
+
*/
|
|
22592
|
+
var LocalPortSourceEnum = _enum([
|
|
22593
|
+
"server-config",
|
|
22594
|
+
"server-env",
|
|
22595
|
+
"caller-hint",
|
|
22596
|
+
"default"
|
|
22597
|
+
]);
|
|
22598
|
+
/** The port every LAN/loopback `baseUrl` in the same result was built with. */
|
|
22599
|
+
var AdvertisedLocalPortSchema = object({
|
|
22600
|
+
port: number().int().min(1).max(65535),
|
|
22601
|
+
source: LocalPortSourceEnum
|
|
22602
|
+
});
|
|
22603
|
+
var GetConnectionEndpointsResultSchema = object({
|
|
22604
|
+
endpoints: array(ConnectionEndpointSchema).readonly(),
|
|
22605
|
+
/**
|
|
22606
|
+
* The port the hub built the LAN/loopback URLs with, and where that number
|
|
22607
|
+
* came from.
|
|
22608
|
+
*
|
|
22609
|
+
* Returned rather than merely applied, because "the URL is right" and "the
|
|
22610
|
+
* client can KNOW the URL is right" are different properties. A client that
|
|
22611
|
+
* only sees a corrected URL cannot distinguish a hub that fixed the port from
|
|
22612
|
+
* a hub that echoed the port the client sent, so it cannot decide whether to
|
|
22613
|
+
* race the candidate or discard it. With `source` it can: anything but
|
|
22614
|
+
* `caller-hint` is the hub's own socket.
|
|
22615
|
+
*
|
|
22616
|
+
* Absent on hubs predating this field — a client that finds it missing is
|
|
22617
|
+
* talking to an echoing hub and must degrade exactly as it does for
|
|
22618
|
+
* `caller-hint`.
|
|
22619
|
+
*/
|
|
22620
|
+
localPort: AdvertisedLocalPortSchema
|
|
22621
|
+
});
|
|
22527
22622
|
/**
|
|
22528
22623
|
* The chosen outbound endpoint for notification artifacts. `baseUrl: null` =
|
|
22529
22624
|
* AUTO (resolved from the candidate ranking at send time); `resolved` reports
|
|
@@ -22544,8 +22639,13 @@ var AllowedAddressesSchema = object({
|
|
|
22544
22639
|
*/
|
|
22545
22640
|
addresses: array(string()).readonly() });
|
|
22546
22641
|
method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
|
|
22547
|
-
/**
|
|
22548
|
-
|
|
22642
|
+
/**
|
|
22643
|
+
* LEGACY HINT — do not send from new code. Kept optional so clients
|
|
22644
|
+
* written against the echoing contract keep working; the hub uses it
|
|
22645
|
+
* only when it cannot read its own port, and says so via
|
|
22646
|
+
* `localPort.source === 'caller-hint'`.
|
|
22647
|
+
*/
|
|
22648
|
+
port: number().int().min(1).max(65535).optional(),
|
|
22549
22649
|
/** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
|
|
22550
22650
|
* candidate. Default `true`. */
|
|
22551
22651
|
includeLoopback: boolean().optional(),
|
|
@@ -33469,7 +33569,6 @@ var NC_AUDIO_DEFAULTS = {
|
|
|
33469
33569
|
hitPercent: 60,
|
|
33470
33570
|
samplingSeconds: 10
|
|
33471
33571
|
};
|
|
33472
|
-
new Map(AUDIO_MACRO_LABELS.flatMap((macro) => macro.icon === void 0 ? [] : [[macro.id, macro.icon]]));
|
|
33473
33572
|
new Set(["devices", "classes"]);
|
|
33474
33573
|
NC_AUDIO_DEFAULTS.hitPercent, NC_AUDIO_DEFAULTS.samplingSeconds;
|
|
33475
33574
|
/**
|
|
@@ -33703,6 +33802,39 @@ TimelapseRuleInputSchema.extend({
|
|
|
33703
33802
|
createdAt: number(),
|
|
33704
33803
|
updatedAt: number()
|
|
33705
33804
|
});
|
|
33805
|
+
Object.freeze(Object.fromEntries([{
|
|
33806
|
+
stepId: "face-embedding",
|
|
33807
|
+
label: "Face recognition model",
|
|
33808
|
+
defaultModelId: "arcface-r100",
|
|
33809
|
+
indexName: "the enrolled face gallery",
|
|
33810
|
+
options: [
|
|
33811
|
+
{
|
|
33812
|
+
id: "arcface-r100",
|
|
33813
|
+
label: "ArcFace (ResNet34)"
|
|
33814
|
+
},
|
|
33815
|
+
{
|
|
33816
|
+
id: "auraface-r100",
|
|
33817
|
+
label: "AuraFace R100"
|
|
33818
|
+
},
|
|
33819
|
+
{
|
|
33820
|
+
id: "inception-resnet-v1",
|
|
33821
|
+
label: "Inception ResNet V1"
|
|
33822
|
+
}
|
|
33823
|
+
]
|
|
33824
|
+
}, {
|
|
33825
|
+
stepId: "clip-embedding",
|
|
33826
|
+
label: "Semantic search model",
|
|
33827
|
+
defaultModelId: "mobileclip-s1",
|
|
33828
|
+
indexName: "the object semantic-search index",
|
|
33829
|
+
options: [{
|
|
33830
|
+
id: "mobileclip-s1",
|
|
33831
|
+
label: "MobileCLIP S1"
|
|
33832
|
+
}, {
|
|
33833
|
+
id: "mobileclip-s2",
|
|
33834
|
+
label: "MobileCLIP S2"
|
|
33835
|
+
}]
|
|
33836
|
+
}].map((s) => [s.stepId, s.defaultModelId])));
|
|
33837
|
+
string().min(1);
|
|
33706
33838
|
object({
|
|
33707
33839
|
/**
|
|
33708
33840
|
* Fraction of the box's own size added on EACH side before cutting.
|
|
@@ -33723,10 +33855,21 @@ object({
|
|
|
33723
33855
|
*/
|
|
33724
33856
|
square: boolean()
|
|
33725
33857
|
});
|
|
33726
|
-
|
|
33858
|
+
/**
|
|
33859
|
+
* The convention in force when nobody has configured one — byte-for-byte the
|
|
33860
|
+
* behaviour of the pre-unification LIVE path (`DETAIL_CROP_PADDING_RATIO`).
|
|
33861
|
+
*/
|
|
33862
|
+
var DEFAULT_DETAIL_CROP_CONVENTION = {
|
|
33727
33863
|
paddingRatio: .15,
|
|
33728
33864
|
square: false
|
|
33729
|
-
}
|
|
33865
|
+
};
|
|
33866
|
+
Object.freeze({
|
|
33867
|
+
x: 0,
|
|
33868
|
+
y: 0,
|
|
33869
|
+
w: 1,
|
|
33870
|
+
h: 1
|
|
33871
|
+
});
|
|
33872
|
+
DEFAULT_DETAIL_CROP_CONVENTION.paddingRatio;
|
|
33730
33873
|
/**
|
|
33731
33874
|
* WHICH delivered frames the decode worker retains a native copy of.
|
|
33732
33875
|
*
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-mqtt-broker",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.25",
|
|
4
4
|
"description": "MQTT broker registry addon for CamStack — manages external broker entries + an optional embedded aedes broker. Consumers spin up their own `mqtt.js` clients via the `mqtt-broker` cap.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|