@camstack/addon-osd-manager 0.1.16 → 0.1.18
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/{MotionZonesSettings-DDk0KstC.mjs → MotionZonesSettings-2bARhPh6.mjs} +2 -2
- package/dist/{PrivacyMaskSettings-CsXnMGKT.mjs → PrivacyMaskSettings-Cdqm3uIC.mjs} +4 -4
- package/dist/{SceneMonitorEditor-8C9vWyuL.mjs → SceneMonitorEditor-C58VvxWO.mjs} +3 -3
- package/dist/_stub.js +196 -196
- package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-Yo6BXk0X.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-AB877qFK.mjs} +4 -4
- package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-KlN_tI2R.mjs +26 -0
- package/dist/addon-osd-manager.css +1 -1
- package/dist/{hostInit-Df_NHE4W.mjs → hostInit-m3PVQphj.mjs} +3 -3
- package/dist/index.js +224 -61
- package/dist/index.mjs +224 -61
- package/dist/{player-overlays-C5TVZDIL.mjs → player-overlays-CQmBy0Zm.mjs} +1 -1
- package/dist/remoteEntry.js +1 -1
- package/dist/{responsive-B6685e2G.mjs → responsive-jU_1DnOd.mjs} +1 -1
- package/dist/{square-ezK9FWt6.mjs → square-BewXHDNm.mjs} +1 -1
- package/dist/{trash-2-BoPZpFI0.mjs → trash-2-h2ZuBBnj.mjs} +1 -1
- package/dist/{use-device-snapshot-BDmozw2y.mjs → use-device-snapshot--wXDROMR.mjs} +1 -1
- package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-CsJNPlNP.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-C8_X3KFr.mjs} +1 -1
- package/package.json +1 -1
- package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-C9zRtW6C.mjs +0 -26
package/dist/index.js
CHANGED
|
@@ -7641,7 +7641,7 @@ var RecordingBandSchema = object({
|
|
|
7641
7641
|
postBufferSec: number().min(0).optional()
|
|
7642
7642
|
});
|
|
7643
7643
|
({
|
|
7644
|
-
preBufferSec:
|
|
7644
|
+
preBufferSec: 15,
|
|
7645
7645
|
postBufferSec: 30
|
|
7646
7646
|
}).postBufferSec * 1e3;
|
|
7647
7647
|
/**
|
|
@@ -15322,128 +15322,103 @@ var COCO_TO_MACRO = {
|
|
|
15322
15322
|
var AUDIO_MACRO_LABELS = [
|
|
15323
15323
|
{
|
|
15324
15324
|
id: "speech",
|
|
15325
|
-
name: "Speech"
|
|
15326
|
-
icon: "🗣️"
|
|
15325
|
+
name: "Speech"
|
|
15327
15326
|
},
|
|
15328
15327
|
{
|
|
15329
15328
|
id: "scream",
|
|
15330
|
-
name: "Scream / Shout"
|
|
15331
|
-
icon: "😱"
|
|
15329
|
+
name: "Scream / Shout"
|
|
15332
15330
|
},
|
|
15333
15331
|
{
|
|
15334
15332
|
id: "crying",
|
|
15335
|
-
name: "Crying / Baby"
|
|
15336
|
-
icon: "😢"
|
|
15333
|
+
name: "Crying / Baby"
|
|
15337
15334
|
},
|
|
15338
15335
|
{
|
|
15339
15336
|
id: "laughter",
|
|
15340
|
-
name: "Laughter"
|
|
15341
|
-
icon: "😂"
|
|
15337
|
+
name: "Laughter"
|
|
15342
15338
|
},
|
|
15343
15339
|
{
|
|
15344
15340
|
id: "music",
|
|
15345
|
-
name: "Music"
|
|
15346
|
-
icon: "🎵"
|
|
15341
|
+
name: "Music"
|
|
15347
15342
|
},
|
|
15348
15343
|
{
|
|
15349
15344
|
id: "dog",
|
|
15350
|
-
name: "Dog"
|
|
15351
|
-
icon: "🐕"
|
|
15345
|
+
name: "Dog"
|
|
15352
15346
|
},
|
|
15353
15347
|
{
|
|
15354
15348
|
id: "cat",
|
|
15355
|
-
name: "Cat"
|
|
15356
|
-
icon: "🐈"
|
|
15349
|
+
name: "Cat"
|
|
15357
15350
|
},
|
|
15358
15351
|
{
|
|
15359
15352
|
id: "bird",
|
|
15360
|
-
name: "Bird"
|
|
15361
|
-
icon: "🐦"
|
|
15353
|
+
name: "Bird"
|
|
15362
15354
|
},
|
|
15363
15355
|
{
|
|
15364
15356
|
id: "animal",
|
|
15365
|
-
name: "Animal (other)"
|
|
15366
|
-
icon: "🐾"
|
|
15357
|
+
name: "Animal (other)"
|
|
15367
15358
|
},
|
|
15368
15359
|
{
|
|
15369
15360
|
id: "alarm",
|
|
15370
|
-
name: "Alarm / Siren"
|
|
15371
|
-
icon: "🚨"
|
|
15361
|
+
name: "Alarm / Siren"
|
|
15372
15362
|
},
|
|
15373
15363
|
{
|
|
15374
15364
|
id: "doorbell",
|
|
15375
|
-
name: "Doorbell / Knock"
|
|
15376
|
-
icon: "🔔"
|
|
15365
|
+
name: "Doorbell / Knock"
|
|
15377
15366
|
},
|
|
15378
15367
|
{
|
|
15379
15368
|
id: "glass_breaking",
|
|
15380
|
-
name: "Glass Breaking"
|
|
15381
|
-
icon: "💥"
|
|
15369
|
+
name: "Glass Breaking"
|
|
15382
15370
|
},
|
|
15383
15371
|
{
|
|
15384
15372
|
id: "gunshot",
|
|
15385
|
-
name: "Gunshot / Explosion"
|
|
15386
|
-
icon: "💣"
|
|
15373
|
+
name: "Gunshot / Explosion"
|
|
15387
15374
|
},
|
|
15388
15375
|
{
|
|
15389
15376
|
id: "vehicle",
|
|
15390
|
-
name: "Vehicle"
|
|
15391
|
-
icon: "🚗"
|
|
15377
|
+
name: "Vehicle"
|
|
15392
15378
|
},
|
|
15393
15379
|
{
|
|
15394
15380
|
id: "siren",
|
|
15395
|
-
name: "Emergency Siren"
|
|
15396
|
-
icon: "🚑"
|
|
15381
|
+
name: "Emergency Siren"
|
|
15397
15382
|
},
|
|
15398
15383
|
{
|
|
15399
15384
|
id: "fire",
|
|
15400
|
-
name: "Fire / Smoke"
|
|
15401
|
-
icon: "🔥"
|
|
15385
|
+
name: "Fire / Smoke"
|
|
15402
15386
|
},
|
|
15403
15387
|
{
|
|
15404
15388
|
id: "water",
|
|
15405
|
-
name: "Water"
|
|
15406
|
-
icon: "💧"
|
|
15389
|
+
name: "Water"
|
|
15407
15390
|
},
|
|
15408
15391
|
{
|
|
15409
15392
|
id: "wind",
|
|
15410
|
-
name: "Wind / Weather"
|
|
15411
|
-
icon: "🌬️"
|
|
15393
|
+
name: "Wind / Weather"
|
|
15412
15394
|
},
|
|
15413
15395
|
{
|
|
15414
15396
|
id: "door",
|
|
15415
|
-
name: "Door"
|
|
15416
|
-
icon: "🚪"
|
|
15397
|
+
name: "Door"
|
|
15417
15398
|
},
|
|
15418
15399
|
{
|
|
15419
15400
|
id: "footsteps",
|
|
15420
|
-
name: "Footsteps"
|
|
15421
|
-
icon: "👣"
|
|
15401
|
+
name: "Footsteps"
|
|
15422
15402
|
},
|
|
15423
15403
|
{
|
|
15424
15404
|
id: "crowd",
|
|
15425
|
-
name: "Crowd / Chatter"
|
|
15426
|
-
icon: "👥"
|
|
15405
|
+
name: "Crowd / Chatter"
|
|
15427
15406
|
},
|
|
15428
15407
|
{
|
|
15429
15408
|
id: "telephone",
|
|
15430
|
-
name: "Telephone"
|
|
15431
|
-
icon: "📞"
|
|
15409
|
+
name: "Telephone"
|
|
15432
15410
|
},
|
|
15433
15411
|
{
|
|
15434
15412
|
id: "engine",
|
|
15435
|
-
name: "Engine / Motor"
|
|
15436
|
-
icon: "⚙️"
|
|
15413
|
+
name: "Engine / Motor"
|
|
15437
15414
|
},
|
|
15438
15415
|
{
|
|
15439
15416
|
id: "tools",
|
|
15440
|
-
name: "Tools / Construction"
|
|
15441
|
-
icon: "🔨"
|
|
15417
|
+
name: "Tools / Construction"
|
|
15442
15418
|
},
|
|
15443
15419
|
{
|
|
15444
15420
|
id: "silence",
|
|
15445
|
-
name: "Silence"
|
|
15446
|
-
icon: "🤫"
|
|
15421
|
+
name: "Silence"
|
|
15447
15422
|
}
|
|
15448
15423
|
];
|
|
15449
15424
|
var YAMNET_TO_MACRO = {
|
|
@@ -18496,7 +18471,7 @@ var TrackEnvelopeSchema = object({
|
|
|
18496
18471
|
* `snapshots[]` references — megabytes across a page of tracks. `slim`
|
|
18497
18472
|
* keeps every scalar the list surfaces actually render (ids, class(es),
|
|
18498
18473
|
* label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
|
|
18499
|
-
* zonesVisited, bestEventId, envelope, hasFace, hasRider) and returns `positions` /
|
|
18474
|
+
* zonesVisited, bestEventId, envelope, hasFace, hasEmbeddedFace, hasRider) and returns `positions` /
|
|
18500
18475
|
* `snapshots` as EMPTY arrays — detail views re-fetch the full row via
|
|
18501
18476
|
* `getTrack`. Mirrors the event-store `projection` convention
|
|
18502
18477
|
* (`getObjectEvents` et al.).
|
|
@@ -18791,6 +18766,35 @@ var TrackSchema = object({
|
|
|
18791
18766
|
*/
|
|
18792
18767
|
hasFace: boolean().optional(),
|
|
18793
18768
|
/**
|
|
18769
|
+
* This track has a face row IN THE GALLERY: a crop **and** an embedding — a
|
|
18770
|
+
* face an operator could ASSIGN to an identity.
|
|
18771
|
+
*
|
|
18772
|
+
* The STRICT twin of {@link hasFace}, and the pair only earns its keep
|
|
18773
|
+
* because the two disagree. `hasFace` is stamped at the TOP of the face
|
|
18774
|
+
* branch, before every gate, and means no more than "a face detector produced
|
|
18775
|
+
* a face detail". This one is stamped at the single moment the gallery row
|
|
18776
|
+
* LANDS — after `FaceRecognizer.onTrackEnd` successfully persists it, i.e.
|
|
18777
|
+
* past the embedding-magnitude verdict, the `minFacePx` detection gate, the
|
|
18778
|
+
* candidate gate, the imageless-track drop (no crop was ever captured) and
|
|
18779
|
+
* the crop-store drop. Everything between the detector and that insert can
|
|
18780
|
+
* legitimately refuse the face, so a flag written any earlier promises the
|
|
18781
|
+
* operator something to assign and delivers nothing.
|
|
18782
|
+
*
|
|
18783
|
+
* **Independent of recognition.** A face collected but never auto-matched is
|
|
18784
|
+
* still assignable — it is in fact the face an operator most wants to reach —
|
|
18785
|
+
* so this is NOT gated on `recognizedIdentityId`. Recognition lands in
|
|
18786
|
+
* `subLabel`; this says only that the raw material exists.
|
|
18787
|
+
*
|
|
18788
|
+
* **Set once, never cleared.** A track that produced a gallery row produced
|
|
18789
|
+
* one; deleting the row later is the gallery's business, not this flag's.
|
|
18790
|
+
*
|
|
18791
|
+
* **Absent ≠ false**, the same rule as {@link hasFace}: every row written
|
|
18792
|
+
* before the column omits it, and so does every server that predates the
|
|
18793
|
+
* field. A consumer must test `=== true` and render nothing otherwise —
|
|
18794
|
+
* never infer "no assignable face".
|
|
18795
|
+
*/
|
|
18796
|
+
hasEmbeddedFace: boolean().optional(),
|
|
18797
|
+
/**
|
|
18794
18798
|
* This subject CONTAINS a folded rider — a person the rider-pairing step
|
|
18795
18799
|
* ([D34](../decisions/adr-0034.md)) removed from the frame BEFORE the tracker,
|
|
18796
18800
|
* so the passage is tracked once and as a VEHICLE.
|
|
@@ -20733,6 +20737,32 @@ var DetailResultSchema = object({
|
|
|
20733
20737
|
/** FRAME-space bbox (already mapped back from crop space). */
|
|
20734
20738
|
bbox: NativeCropBboxSchema.optional(),
|
|
20735
20739
|
embedding: string().optional(),
|
|
20740
|
+
/**
|
|
20741
|
+
* L2 magnitude of the RAW pre-normalization embedding. Additive and optional
|
|
20742
|
+
* so an older runner that does not send it degrades to "unmeasurable", which
|
|
20743
|
+
* the consuming gate treats as accept — never as reject.
|
|
20744
|
+
*/
|
|
20745
|
+
embeddingMagnitude: number().optional(),
|
|
20746
|
+
/**
|
|
20747
|
+
* Model that produced `embedding` — the SAME contract `labelModelId` has for
|
|
20748
|
+
* `label`, and for the same reason: the producing node is the only side that
|
|
20749
|
+
* knows which model actually ran, and re-deriving it downstream is exactly
|
|
20750
|
+
* the inference this model exists to forbid.
|
|
20751
|
+
*
|
|
20752
|
+
* Additive and optional, so a runner that predates it degrades to
|
|
20753
|
+
* "unmeasurable" rather than to a wrong answer — the consumer falls back to
|
|
20754
|
+
* its previous assumption instead of refusing.
|
|
20755
|
+
*
|
|
20756
|
+
* Its absence was not cosmetic. `FaceRecognizer` needs the probe's model id
|
|
20757
|
+
* to use `face-matcher`'s same-model gate (`sample.modelId !== probe.modelId`);
|
|
20758
|
+
* with nothing on the wire it took the id from the GALLERY, so the gate
|
|
20759
|
+
* compared the gallery against itself and could never fire. That turned the
|
|
20760
|
+
* one guard protecting the face feature space into a tautology, and it is
|
|
20761
|
+
* why swapping `face-embedding`'s model would NOT have stranded the enrolled
|
|
20762
|
+
* gallery as the catalog comment predicts — it would have scored the new
|
|
20763
|
+
* model's vectors against the old model's samples in one cosine space.
|
|
20764
|
+
*/
|
|
20765
|
+
embeddingModelId: string().optional(),
|
|
20736
20766
|
label: string().optional(),
|
|
20737
20767
|
/**
|
|
20738
20768
|
* The tier `label` occupies, copied VERBATIM from the producing step's
|
|
@@ -21750,6 +21780,12 @@ var CameraStatusSchema = object({
|
|
|
21750
21780
|
/** Unix timestamp (ms) when this snapshot was composed server-side. */
|
|
21751
21781
|
fetchedAt: number()
|
|
21752
21782
|
});
|
|
21783
|
+
var InferenceDeviceExclusionReasonSchema = _enum([
|
|
21784
|
+
"disabled",
|
|
21785
|
+
"unavailable",
|
|
21786
|
+
"cannot-host-camera-root",
|
|
21787
|
+
"accelerator-preferred"
|
|
21788
|
+
]);
|
|
21753
21789
|
var NodeInferenceDeviceSchema = object({
|
|
21754
21790
|
/** Stable per-node device key, e.g. `openvino:npu`, `edgetpu:usb`, `cpu`. */
|
|
21755
21791
|
key: string(),
|
|
@@ -21780,7 +21816,17 @@ var NodeInferenceDeviceSchema = object({
|
|
|
21780
21816
|
* available per format; this is the stored selection that becomes the
|
|
21781
21817
|
* default for EVERY camera landing on this accelerator.
|
|
21782
21818
|
*/
|
|
21783
|
-
steps: record(string(), DeviceStepConfigSchema).optional()
|
|
21819
|
+
steps: record(string(), DeviceStepConfigSchema).optional(),
|
|
21820
|
+
/**
|
|
21821
|
+
* `null` when the device IS a camera-root candidate on this node; otherwise
|
|
21822
|
+
* the reason the dispatcher drops it. Computed by the SAME
|
|
21823
|
+
* `resolveInferenceDeviceEligibility` the dispatcher runs, so this view can
|
|
21824
|
+
* never disagree with the election — deriving it in the UI from
|
|
21825
|
+
* `enabled`/`available` would silently miss `cannot-host-camera-root` (needs
|
|
21826
|
+
* the node's model catalog) and `accelerator-preferred` (needs the node-wide
|
|
21827
|
+
* "an accelerator is serving" predicate).
|
|
21828
|
+
*/
|
|
21829
|
+
exclusion: InferenceDeviceExclusionReasonSchema.nullable()
|
|
21784
21830
|
});
|
|
21785
21831
|
var NodeInferenceDevicesSchema = object({
|
|
21786
21832
|
nodeId: string(),
|
|
@@ -22695,6 +22741,7 @@ var snapshotCapability = {
|
|
|
22695
22741
|
isBattery: boolean(),
|
|
22696
22742
|
reason: _enum([
|
|
22697
22743
|
"disabled",
|
|
22744
|
+
"offline",
|
|
22698
22745
|
"sleeping",
|
|
22699
22746
|
"unreachable",
|
|
22700
22747
|
"waking"
|
|
@@ -22784,9 +22831,17 @@ targets: array(object({
|
|
|
22784
22831
|
sleeping: boolean(),
|
|
22785
22832
|
/** Current device state rendered over the cached frame. State images
|
|
22786
22833
|
* remain authoritative even when their photographic background is
|
|
22787
|
-
* old; null means the link must carry a current camera frame.
|
|
22834
|
+
* old; null means the link must carry a current camera frame.
|
|
22835
|
+
*
|
|
22836
|
+
* **This is the ONLY source a surface may derive an inactive tile
|
|
22837
|
+
* from.** A client that reads a device's `online`/`disabled` flags and
|
|
22838
|
+
* draws its own verdict will disagree with the pixels it is painting
|
|
22839
|
+
* — the frame comes from here, and so must the sentence over it
|
|
22840
|
+
* (D190). Pair with `ageMs` for the age of the photograph behind the
|
|
22841
|
+
* state. */
|
|
22788
22842
|
stateReason: _enum([
|
|
22789
22843
|
"disabled",
|
|
22844
|
+
"offline",
|
|
22790
22845
|
"sleeping",
|
|
22791
22846
|
"unreachable",
|
|
22792
22847
|
"waking"
|
|
@@ -27744,7 +27799,12 @@ var ListResultSchema = object({
|
|
|
27744
27799
|
probedAt: number()
|
|
27745
27800
|
});
|
|
27746
27801
|
var PreferredSchema = LocalInterfaceSchema.nullable();
|
|
27747
|
-
|
|
27802
|
+
/**
|
|
27803
|
+
* Candidate base URL for the SDK to race on connect. Order matters —
|
|
27804
|
+
* the SDK should attempt these top-to-bottom with a short per-candidate
|
|
27805
|
+
* timeout (e.g. 1500ms) and cache the winner for the session.
|
|
27806
|
+
*/
|
|
27807
|
+
var ConnectionEndpointSchema = object({
|
|
27748
27808
|
/** Operator-facing label (e.g. "LAN — en0", "Public tunnel"). */
|
|
27749
27809
|
label: string(),
|
|
27750
27810
|
/** Fully-formed base URL with scheme + host + port. */
|
|
@@ -27787,7 +27847,42 @@ var GetConnectionEndpointsResultSchema = object({ endpoints: array(object({
|
|
|
27787
27847
|
* ordering between polls.
|
|
27788
27848
|
*/
|
|
27789
27849
|
priority: number()
|
|
27790
|
-
})
|
|
27850
|
+
});
|
|
27851
|
+
/**
|
|
27852
|
+
* Where the advertised local port came from. Ordered most → least
|
|
27853
|
+
* authoritative, and the whole point of returning it: a client must be able to
|
|
27854
|
+
* tell a FACT about the hub's socket from an echo of its own guess.
|
|
27855
|
+
*/
|
|
27856
|
+
var LocalPortSourceEnum = _enum([
|
|
27857
|
+
"server-config",
|
|
27858
|
+
"server-env",
|
|
27859
|
+
"caller-hint",
|
|
27860
|
+
"default"
|
|
27861
|
+
]);
|
|
27862
|
+
/** The port every LAN/loopback `baseUrl` in the same result was built with. */
|
|
27863
|
+
var AdvertisedLocalPortSchema = object({
|
|
27864
|
+
port: number().int().min(1).max(65535),
|
|
27865
|
+
source: LocalPortSourceEnum
|
|
27866
|
+
});
|
|
27867
|
+
var GetConnectionEndpointsResultSchema = object({
|
|
27868
|
+
endpoints: array(ConnectionEndpointSchema).readonly(),
|
|
27869
|
+
/**
|
|
27870
|
+
* The port the hub built the LAN/loopback URLs with, and where that number
|
|
27871
|
+
* came from.
|
|
27872
|
+
*
|
|
27873
|
+
* Returned rather than merely applied, because "the URL is right" and "the
|
|
27874
|
+
* client can KNOW the URL is right" are different properties. A client that
|
|
27875
|
+
* only sees a corrected URL cannot distinguish a hub that fixed the port from
|
|
27876
|
+
* a hub that echoed the port the client sent, so it cannot decide whether to
|
|
27877
|
+
* race the candidate or discard it. With `source` it can: anything but
|
|
27878
|
+
* `caller-hint` is the hub's own socket.
|
|
27879
|
+
*
|
|
27880
|
+
* Absent on hubs predating this field — a client that finds it missing is
|
|
27881
|
+
* talking to an echoing hub and must degrade exactly as it does for
|
|
27882
|
+
* `caller-hint`.
|
|
27883
|
+
*/
|
|
27884
|
+
localPort: AdvertisedLocalPortSchema
|
|
27885
|
+
});
|
|
27791
27886
|
/**
|
|
27792
27887
|
* The chosen outbound endpoint for notification artifacts. `baseUrl: null` =
|
|
27793
27888
|
* AUTO (resolved from the candidate ranking at send time); `resolved` reports
|
|
@@ -27833,10 +27928,35 @@ var localNetworkCapability = {
|
|
|
27833
27928
|
* Honours `getAllowedAddresses()` when set — addresses outside
|
|
27834
27929
|
* the allowlist are dropped (the public tunnel + loopback are
|
|
27835
27930
|
* always included as escape hatches).
|
|
27931
|
+
*
|
|
27932
|
+
* **The port is the hub's, not the caller's** (D62 — a function's fact
|
|
27933
|
+
* belongs to whoever already owns it). This method used to take a `port`
|
|
27934
|
+
* and echo it onto every LAN and loopback URL it advertised, which made
|
|
27935
|
+
* every client a second authority on a socket only the hub binds. A viewer
|
|
27936
|
+
* configured with a port-less public URL (`https://camstack.example.top`)
|
|
27937
|
+
* infers 443 from the scheme, asks with 443, and was handed
|
|
27938
|
+
* `https://192.168.1.9:443` for a hub listening on 4443. That candidate
|
|
27939
|
+
* cannot ever answer, and losing its race reads in the log exactly like
|
|
27940
|
+
* "the LAN was tried and it was slower" — so an operator sitting on his own
|
|
27941
|
+
* WiFi stayed on the public tunnel for weeks, with the LAN candidate born
|
|
27942
|
+
* dead on every single connect.
|
|
27943
|
+
*
|
|
27944
|
+
* The hub now resolves its own listen port and reports it as `localPort`,
|
|
27945
|
+
* with the SOURCE of the number, so a client can tell a fact from an echo.
|
|
27946
|
+
*
|
|
27947
|
+
* Out of scope on purpose: a LAN URL that is not the hub's own socket (a
|
|
27948
|
+
* reverse proxy in front of it on another port) is not this method's to
|
|
27949
|
+
* invent either — pin it with `setNotificationEndpoint` / a configured
|
|
27950
|
+
* origin, which is an operator statement rather than a guess.
|
|
27836
27951
|
*/
|
|
27837
27952
|
getConnectionEndpoints: method(object({
|
|
27838
|
-
/**
|
|
27839
|
-
|
|
27953
|
+
/**
|
|
27954
|
+
* LEGACY HINT — do not send from new code. Kept optional so clients
|
|
27955
|
+
* written against the echoing contract keep working; the hub uses it
|
|
27956
|
+
* only when it cannot read its own port, and says so via
|
|
27957
|
+
* `localPort.source === 'caller-hint'`.
|
|
27958
|
+
*/
|
|
27959
|
+
port: number().int().min(1).max(65535).optional(),
|
|
27840
27960
|
/** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
|
|
27841
27961
|
* candidate. Default `true`. */
|
|
27842
27962
|
includeLoopback: boolean().optional(),
|
|
@@ -40780,7 +40900,6 @@ var NC_AUDIO_DEFAULTS = {
|
|
|
40780
40900
|
hitPercent: 60,
|
|
40781
40901
|
samplingSeconds: 10
|
|
40782
40902
|
};
|
|
40783
|
-
new Map(AUDIO_MACRO_LABELS.flatMap((macro) => macro.icon === void 0 ? [] : [[macro.id, macro.icon]]));
|
|
40784
40903
|
new Set(["devices", "classes"]);
|
|
40785
40904
|
NC_AUDIO_DEFAULTS.hitPercent, NC_AUDIO_DEFAULTS.samplingSeconds;
|
|
40786
40905
|
var WEEKDAY_TO_DAY = {
|
|
@@ -41074,6 +41193,39 @@ TimelapseRuleInputSchema.extend({
|
|
|
41074
41193
|
createdAt: number(),
|
|
41075
41194
|
updatedAt: number()
|
|
41076
41195
|
});
|
|
41196
|
+
Object.freeze(Object.fromEntries([{
|
|
41197
|
+
stepId: "face-embedding",
|
|
41198
|
+
label: "Face recognition model",
|
|
41199
|
+
defaultModelId: "arcface-r100",
|
|
41200
|
+
indexName: "the enrolled face gallery",
|
|
41201
|
+
options: [
|
|
41202
|
+
{
|
|
41203
|
+
id: "arcface-r100",
|
|
41204
|
+
label: "ArcFace (ResNet34)"
|
|
41205
|
+
},
|
|
41206
|
+
{
|
|
41207
|
+
id: "auraface-r100",
|
|
41208
|
+
label: "AuraFace R100"
|
|
41209
|
+
},
|
|
41210
|
+
{
|
|
41211
|
+
id: "inception-resnet-v1",
|
|
41212
|
+
label: "Inception ResNet V1"
|
|
41213
|
+
}
|
|
41214
|
+
]
|
|
41215
|
+
}, {
|
|
41216
|
+
stepId: "clip-embedding",
|
|
41217
|
+
label: "Semantic search model",
|
|
41218
|
+
defaultModelId: "mobileclip-s1",
|
|
41219
|
+
indexName: "the object semantic-search index",
|
|
41220
|
+
options: [{
|
|
41221
|
+
id: "mobileclip-s1",
|
|
41222
|
+
label: "MobileCLIP S1"
|
|
41223
|
+
}, {
|
|
41224
|
+
id: "mobileclip-s2",
|
|
41225
|
+
label: "MobileCLIP S2"
|
|
41226
|
+
}]
|
|
41227
|
+
}].map((s) => [s.stepId, s.defaultModelId])));
|
|
41228
|
+
string().min(1);
|
|
41077
41229
|
object({
|
|
41078
41230
|
/**
|
|
41079
41231
|
* Fraction of the box's own size added on EACH side before cutting.
|
|
@@ -41094,10 +41246,21 @@ object({
|
|
|
41094
41246
|
*/
|
|
41095
41247
|
square: boolean()
|
|
41096
41248
|
});
|
|
41097
|
-
|
|
41249
|
+
/**
|
|
41250
|
+
* The convention in force when nobody has configured one — byte-for-byte the
|
|
41251
|
+
* behaviour of the pre-unification LIVE path (`DETAIL_CROP_PADDING_RATIO`).
|
|
41252
|
+
*/
|
|
41253
|
+
var DEFAULT_DETAIL_CROP_CONVENTION = {
|
|
41098
41254
|
paddingRatio: .15,
|
|
41099
41255
|
square: false
|
|
41100
|
-
}
|
|
41256
|
+
};
|
|
41257
|
+
Object.freeze({
|
|
41258
|
+
x: 0,
|
|
41259
|
+
y: 0,
|
|
41260
|
+
w: 1,
|
|
41261
|
+
h: 1
|
|
41262
|
+
});
|
|
41263
|
+
DEFAULT_DETAIL_CROP_CONVENTION.paddingRatio;
|
|
41101
41264
|
/**
|
|
41102
41265
|
* WHICH delivered frames the decode worker retains a native copy of.
|
|
41103
41266
|
*
|