@camstack/addon-tailscale 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/client/tailscale.addon.js +1 -1
- package/dist/client/tailscale.addon.mjs +1 -1
- package/dist/{dist-CEnhGxlH.js → dist-B3cBbqzz.js} +204 -61
- package/dist/{dist-DAzZw-t7.mjs → dist-cyVteDFT.mjs} +204 -61
- package/dist/ingress/tailscale-ingress.addon.js +1 -1
- package/dist/ingress/tailscale-ingress.addon.mjs +1 -1
- package/package.json +1 -1
|
@@ -24,7 +24,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
24
24
|
enumerable: true
|
|
25
25
|
}) : target, mod));
|
|
26
26
|
//#endregion
|
|
27
|
-
const require_dist = require("../dist-
|
|
27
|
+
const require_dist = require("../dist-B3cBbqzz.js");
|
|
28
28
|
let node_child_process = require("node:child_process");
|
|
29
29
|
let node_util = require("node:util");
|
|
30
30
|
let node_fs = require("node:fs");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as EventCategory, i as BaseAddon, n as networkAccessCapability, r as BOOT_RECOVERY_BACKOFF_MS, t as meshNetworkCapability } from "../dist-
|
|
1
|
+
import { a as EventCategory, i as BaseAddon, n as networkAccessCapability, r as BOOT_RECOVERY_BACKOFF_MS, t as meshNetworkCapability } from "../dist-cyVteDFT.mjs";
|
|
2
2
|
import { execFile, spawn } from "node:child_process";
|
|
3
3
|
import { promisify } from "node:util";
|
|
4
4
|
import * as fs from "node:fs";
|
|
@@ -7583,7 +7583,7 @@ var RecordingBandSchema = object({
|
|
|
7583
7583
|
postBufferSec: number().min(0).optional()
|
|
7584
7584
|
});
|
|
7585
7585
|
({
|
|
7586
|
-
preBufferSec:
|
|
7586
|
+
preBufferSec: 15,
|
|
7587
7587
|
postBufferSec: 30
|
|
7588
7588
|
}).postBufferSec * 1e3;
|
|
7589
7589
|
/**
|
|
@@ -13539,128 +13539,103 @@ var COCO_TO_MACRO = {
|
|
|
13539
13539
|
var AUDIO_MACRO_LABELS = [
|
|
13540
13540
|
{
|
|
13541
13541
|
id: "speech",
|
|
13542
|
-
name: "Speech"
|
|
13543
|
-
icon: "🗣️"
|
|
13542
|
+
name: "Speech"
|
|
13544
13543
|
},
|
|
13545
13544
|
{
|
|
13546
13545
|
id: "scream",
|
|
13547
|
-
name: "Scream / Shout"
|
|
13548
|
-
icon: "😱"
|
|
13546
|
+
name: "Scream / Shout"
|
|
13549
13547
|
},
|
|
13550
13548
|
{
|
|
13551
13549
|
id: "crying",
|
|
13552
|
-
name: "Crying / Baby"
|
|
13553
|
-
icon: "😢"
|
|
13550
|
+
name: "Crying / Baby"
|
|
13554
13551
|
},
|
|
13555
13552
|
{
|
|
13556
13553
|
id: "laughter",
|
|
13557
|
-
name: "Laughter"
|
|
13558
|
-
icon: "😂"
|
|
13554
|
+
name: "Laughter"
|
|
13559
13555
|
},
|
|
13560
13556
|
{
|
|
13561
13557
|
id: "music",
|
|
13562
|
-
name: "Music"
|
|
13563
|
-
icon: "🎵"
|
|
13558
|
+
name: "Music"
|
|
13564
13559
|
},
|
|
13565
13560
|
{
|
|
13566
13561
|
id: "dog",
|
|
13567
|
-
name: "Dog"
|
|
13568
|
-
icon: "🐕"
|
|
13562
|
+
name: "Dog"
|
|
13569
13563
|
},
|
|
13570
13564
|
{
|
|
13571
13565
|
id: "cat",
|
|
13572
|
-
name: "Cat"
|
|
13573
|
-
icon: "🐈"
|
|
13566
|
+
name: "Cat"
|
|
13574
13567
|
},
|
|
13575
13568
|
{
|
|
13576
13569
|
id: "bird",
|
|
13577
|
-
name: "Bird"
|
|
13578
|
-
icon: "🐦"
|
|
13570
|
+
name: "Bird"
|
|
13579
13571
|
},
|
|
13580
13572
|
{
|
|
13581
13573
|
id: "animal",
|
|
13582
|
-
name: "Animal (other)"
|
|
13583
|
-
icon: "🐾"
|
|
13574
|
+
name: "Animal (other)"
|
|
13584
13575
|
},
|
|
13585
13576
|
{
|
|
13586
13577
|
id: "alarm",
|
|
13587
|
-
name: "Alarm / Siren"
|
|
13588
|
-
icon: "🚨"
|
|
13578
|
+
name: "Alarm / Siren"
|
|
13589
13579
|
},
|
|
13590
13580
|
{
|
|
13591
13581
|
id: "doorbell",
|
|
13592
|
-
name: "Doorbell / Knock"
|
|
13593
|
-
icon: "🔔"
|
|
13582
|
+
name: "Doorbell / Knock"
|
|
13594
13583
|
},
|
|
13595
13584
|
{
|
|
13596
13585
|
id: "glass_breaking",
|
|
13597
|
-
name: "Glass Breaking"
|
|
13598
|
-
icon: "💥"
|
|
13586
|
+
name: "Glass Breaking"
|
|
13599
13587
|
},
|
|
13600
13588
|
{
|
|
13601
13589
|
id: "gunshot",
|
|
13602
|
-
name: "Gunshot / Explosion"
|
|
13603
|
-
icon: "💣"
|
|
13590
|
+
name: "Gunshot / Explosion"
|
|
13604
13591
|
},
|
|
13605
13592
|
{
|
|
13606
13593
|
id: "vehicle",
|
|
13607
|
-
name: "Vehicle"
|
|
13608
|
-
icon: "🚗"
|
|
13594
|
+
name: "Vehicle"
|
|
13609
13595
|
},
|
|
13610
13596
|
{
|
|
13611
13597
|
id: "siren",
|
|
13612
|
-
name: "Emergency Siren"
|
|
13613
|
-
icon: "🚑"
|
|
13598
|
+
name: "Emergency Siren"
|
|
13614
13599
|
},
|
|
13615
13600
|
{
|
|
13616
13601
|
id: "fire",
|
|
13617
|
-
name: "Fire / Smoke"
|
|
13618
|
-
icon: "🔥"
|
|
13602
|
+
name: "Fire / Smoke"
|
|
13619
13603
|
},
|
|
13620
13604
|
{
|
|
13621
13605
|
id: "water",
|
|
13622
|
-
name: "Water"
|
|
13623
|
-
icon: "💧"
|
|
13606
|
+
name: "Water"
|
|
13624
13607
|
},
|
|
13625
13608
|
{
|
|
13626
13609
|
id: "wind",
|
|
13627
|
-
name: "Wind / Weather"
|
|
13628
|
-
icon: "🌬️"
|
|
13610
|
+
name: "Wind / Weather"
|
|
13629
13611
|
},
|
|
13630
13612
|
{
|
|
13631
13613
|
id: "door",
|
|
13632
|
-
name: "Door"
|
|
13633
|
-
icon: "🚪"
|
|
13614
|
+
name: "Door"
|
|
13634
13615
|
},
|
|
13635
13616
|
{
|
|
13636
13617
|
id: "footsteps",
|
|
13637
|
-
name: "Footsteps"
|
|
13638
|
-
icon: "👣"
|
|
13618
|
+
name: "Footsteps"
|
|
13639
13619
|
},
|
|
13640
13620
|
{
|
|
13641
13621
|
id: "crowd",
|
|
13642
|
-
name: "Crowd / Chatter"
|
|
13643
|
-
icon: "👥"
|
|
13622
|
+
name: "Crowd / Chatter"
|
|
13644
13623
|
},
|
|
13645
13624
|
{
|
|
13646
13625
|
id: "telephone",
|
|
13647
|
-
name: "Telephone"
|
|
13648
|
-
icon: "📞"
|
|
13626
|
+
name: "Telephone"
|
|
13649
13627
|
},
|
|
13650
13628
|
{
|
|
13651
13629
|
id: "engine",
|
|
13652
|
-
name: "Engine / Motor"
|
|
13653
|
-
icon: "⚙️"
|
|
13630
|
+
name: "Engine / Motor"
|
|
13654
13631
|
},
|
|
13655
13632
|
{
|
|
13656
13633
|
id: "tools",
|
|
13657
|
-
name: "Tools / Construction"
|
|
13658
|
-
icon: "🔨"
|
|
13634
|
+
name: "Tools / Construction"
|
|
13659
13635
|
},
|
|
13660
13636
|
{
|
|
13661
13637
|
id: "silence",
|
|
13662
|
-
name: "Silence"
|
|
13663
|
-
icon: "🤫"
|
|
13638
|
+
name: "Silence"
|
|
13664
13639
|
}
|
|
13665
13640
|
];
|
|
13666
13641
|
var YAMNET_TO_MACRO = {
|
|
@@ -16124,7 +16099,7 @@ var TrackEnvelopeSchema = object({
|
|
|
16124
16099
|
* `snapshots[]` references — megabytes across a page of tracks. `slim`
|
|
16125
16100
|
* keeps every scalar the list surfaces actually render (ids, class(es),
|
|
16126
16101
|
* label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
|
|
16127
|
-
* zonesVisited, bestEventId, envelope, hasFace, hasRider) and returns `positions` /
|
|
16102
|
+
* zonesVisited, bestEventId, envelope, hasFace, hasEmbeddedFace, hasRider) and returns `positions` /
|
|
16128
16103
|
* `snapshots` as EMPTY arrays — detail views re-fetch the full row via
|
|
16129
16104
|
* `getTrack`. Mirrors the event-store `projection` convention
|
|
16130
16105
|
* (`getObjectEvents` et al.).
|
|
@@ -16419,6 +16394,35 @@ var TrackSchema = object({
|
|
|
16419
16394
|
*/
|
|
16420
16395
|
hasFace: boolean().optional(),
|
|
16421
16396
|
/**
|
|
16397
|
+
* This track has a face row IN THE GALLERY: a crop **and** an embedding — a
|
|
16398
|
+
* face an operator could ASSIGN to an identity.
|
|
16399
|
+
*
|
|
16400
|
+
* The STRICT twin of {@link hasFace}, and the pair only earns its keep
|
|
16401
|
+
* because the two disagree. `hasFace` is stamped at the TOP of the face
|
|
16402
|
+
* branch, before every gate, and means no more than "a face detector produced
|
|
16403
|
+
* a face detail". This one is stamped at the single moment the gallery row
|
|
16404
|
+
* LANDS — after `FaceRecognizer.onTrackEnd` successfully persists it, i.e.
|
|
16405
|
+
* past the embedding-magnitude verdict, the `minFacePx` detection gate, the
|
|
16406
|
+
* candidate gate, the imageless-track drop (no crop was ever captured) and
|
|
16407
|
+
* the crop-store drop. Everything between the detector and that insert can
|
|
16408
|
+
* legitimately refuse the face, so a flag written any earlier promises the
|
|
16409
|
+
* operator something to assign and delivers nothing.
|
|
16410
|
+
*
|
|
16411
|
+
* **Independent of recognition.** A face collected but never auto-matched is
|
|
16412
|
+
* still assignable — it is in fact the face an operator most wants to reach —
|
|
16413
|
+
* so this is NOT gated on `recognizedIdentityId`. Recognition lands in
|
|
16414
|
+
* `subLabel`; this says only that the raw material exists.
|
|
16415
|
+
*
|
|
16416
|
+
* **Set once, never cleared.** A track that produced a gallery row produced
|
|
16417
|
+
* one; deleting the row later is the gallery's business, not this flag's.
|
|
16418
|
+
*
|
|
16419
|
+
* **Absent ≠ false**, the same rule as {@link hasFace}: every row written
|
|
16420
|
+
* before the column omits it, and so does every server that predates the
|
|
16421
|
+
* field. A consumer must test `=== true` and render nothing otherwise —
|
|
16422
|
+
* never infer "no assignable face".
|
|
16423
|
+
*/
|
|
16424
|
+
hasEmbeddedFace: boolean().optional(),
|
|
16425
|
+
/**
|
|
16422
16426
|
* This subject CONTAINS a folded rider — a person the rider-pairing step
|
|
16423
16427
|
* ([D34](../decisions/adr-0034.md)) removed from the frame BEFORE the tracker,
|
|
16424
16428
|
* so the passage is tracked once and as a VEHICLE.
|
|
@@ -17768,6 +17772,32 @@ var DetailResultSchema = object({
|
|
|
17768
17772
|
/** FRAME-space bbox (already mapped back from crop space). */
|
|
17769
17773
|
bbox: NativeCropBboxSchema.optional(),
|
|
17770
17774
|
embedding: string().optional(),
|
|
17775
|
+
/**
|
|
17776
|
+
* L2 magnitude of the RAW pre-normalization embedding. Additive and optional
|
|
17777
|
+
* so an older runner that does not send it degrades to "unmeasurable", which
|
|
17778
|
+
* the consuming gate treats as accept — never as reject.
|
|
17779
|
+
*/
|
|
17780
|
+
embeddingMagnitude: number().optional(),
|
|
17781
|
+
/**
|
|
17782
|
+
* Model that produced `embedding` — the SAME contract `labelModelId` has for
|
|
17783
|
+
* `label`, and for the same reason: the producing node is the only side that
|
|
17784
|
+
* knows which model actually ran, and re-deriving it downstream is exactly
|
|
17785
|
+
* the inference this model exists to forbid.
|
|
17786
|
+
*
|
|
17787
|
+
* Additive and optional, so a runner that predates it degrades to
|
|
17788
|
+
* "unmeasurable" rather than to a wrong answer — the consumer falls back to
|
|
17789
|
+
* its previous assumption instead of refusing.
|
|
17790
|
+
*
|
|
17791
|
+
* Its absence was not cosmetic. `FaceRecognizer` needs the probe's model id
|
|
17792
|
+
* to use `face-matcher`'s same-model gate (`sample.modelId !== probe.modelId`);
|
|
17793
|
+
* with nothing on the wire it took the id from the GALLERY, so the gate
|
|
17794
|
+
* compared the gallery against itself and could never fire. That turned the
|
|
17795
|
+
* one guard protecting the face feature space into a tautology, and it is
|
|
17796
|
+
* why swapping `face-embedding`'s model would NOT have stranded the enrolled
|
|
17797
|
+
* gallery as the catalog comment predicts — it would have scored the new
|
|
17798
|
+
* model's vectors against the old model's samples in one cosine space.
|
|
17799
|
+
*/
|
|
17800
|
+
embeddingModelId: string().optional(),
|
|
17771
17801
|
label: string().optional(),
|
|
17772
17802
|
/**
|
|
17773
17803
|
* The tier `label` occupies, copied VERBATIM from the producing step's
|
|
@@ -18643,6 +18673,12 @@ var CameraStatusSchema = object({
|
|
|
18643
18673
|
/** Unix timestamp (ms) when this snapshot was composed server-side. */
|
|
18644
18674
|
fetchedAt: number()
|
|
18645
18675
|
});
|
|
18676
|
+
var InferenceDeviceExclusionReasonSchema = _enum([
|
|
18677
|
+
"disabled",
|
|
18678
|
+
"unavailable",
|
|
18679
|
+
"cannot-host-camera-root",
|
|
18680
|
+
"accelerator-preferred"
|
|
18681
|
+
]);
|
|
18646
18682
|
var NodeInferenceDeviceSchema = object({
|
|
18647
18683
|
/** Stable per-node device key, e.g. `openvino:npu`, `edgetpu:usb`, `cpu`. */
|
|
18648
18684
|
key: string(),
|
|
@@ -18673,7 +18709,17 @@ var NodeInferenceDeviceSchema = object({
|
|
|
18673
18709
|
* available per format; this is the stored selection that becomes the
|
|
18674
18710
|
* default for EVERY camera landing on this accelerator.
|
|
18675
18711
|
*/
|
|
18676
|
-
steps: record(string(), DeviceStepConfigSchema).optional()
|
|
18712
|
+
steps: record(string(), DeviceStepConfigSchema).optional(),
|
|
18713
|
+
/**
|
|
18714
|
+
* `null` when the device IS a camera-root candidate on this node; otherwise
|
|
18715
|
+
* the reason the dispatcher drops it. Computed by the SAME
|
|
18716
|
+
* `resolveInferenceDeviceEligibility` the dispatcher runs, so this view can
|
|
18717
|
+
* never disagree with the election — deriving it in the UI from
|
|
18718
|
+
* `enabled`/`available` would silently miss `cannot-host-camera-root` (needs
|
|
18719
|
+
* the node's model catalog) and `accelerator-preferred` (needs the node-wide
|
|
18720
|
+
* "an accelerator is serving" predicate).
|
|
18721
|
+
*/
|
|
18722
|
+
exclusion: InferenceDeviceExclusionReasonSchema.nullable()
|
|
18677
18723
|
});
|
|
18678
18724
|
var NodeInferenceDevicesSchema = object({
|
|
18679
18725
|
nodeId: string(),
|
|
@@ -19178,6 +19224,7 @@ DeviceType.Camera, method(object({
|
|
|
19178
19224
|
isBattery: boolean(),
|
|
19179
19225
|
reason: _enum([
|
|
19180
19226
|
"disabled",
|
|
19227
|
+
"offline",
|
|
19181
19228
|
"sleeping",
|
|
19182
19229
|
"unreachable",
|
|
19183
19230
|
"waking"
|
|
@@ -19223,9 +19270,17 @@ targets: array(object({
|
|
|
19223
19270
|
sleeping: boolean(),
|
|
19224
19271
|
/** Current device state rendered over the cached frame. State images
|
|
19225
19272
|
* remain authoritative even when their photographic background is
|
|
19226
|
-
* old; null means the link must carry a current camera frame.
|
|
19273
|
+
* old; null means the link must carry a current camera frame.
|
|
19274
|
+
*
|
|
19275
|
+
* **This is the ONLY source a surface may derive an inactive tile
|
|
19276
|
+
* from.** A client that reads a device's `online`/`disabled` flags and
|
|
19277
|
+
* draws its own verdict will disagree with the pixels it is painting
|
|
19278
|
+
* — the frame comes from here, and so must the sentence over it
|
|
19279
|
+
* (D190). Pair with `ageMs` for the age of the photograph behind the
|
|
19280
|
+
* state. */
|
|
19227
19281
|
stateReason: _enum([
|
|
19228
19282
|
"disabled",
|
|
19283
|
+
"offline",
|
|
19229
19284
|
"sleeping",
|
|
19230
19285
|
"unreachable",
|
|
19231
19286
|
"waking"
|
|
@@ -22422,7 +22477,12 @@ var ListResultSchema = object({
|
|
|
22422
22477
|
probedAt: number()
|
|
22423
22478
|
});
|
|
22424
22479
|
var PreferredSchema = LocalInterfaceSchema.nullable();
|
|
22425
|
-
|
|
22480
|
+
/**
|
|
22481
|
+
* Candidate base URL for the SDK to race on connect. Order matters —
|
|
22482
|
+
* the SDK should attempt these top-to-bottom with a short per-candidate
|
|
22483
|
+
* timeout (e.g. 1500ms) and cache the winner for the session.
|
|
22484
|
+
*/
|
|
22485
|
+
var ConnectionEndpointSchema = object({
|
|
22426
22486
|
/** Operator-facing label (e.g. "LAN — en0", "Public tunnel"). */
|
|
22427
22487
|
label: string(),
|
|
22428
22488
|
/** Fully-formed base URL with scheme + host + port. */
|
|
@@ -22465,7 +22525,42 @@ var GetConnectionEndpointsResultSchema = object({ endpoints: array(object({
|
|
|
22465
22525
|
* ordering between polls.
|
|
22466
22526
|
*/
|
|
22467
22527
|
priority: number()
|
|
22468
|
-
})
|
|
22528
|
+
});
|
|
22529
|
+
/**
|
|
22530
|
+
* Where the advertised local port came from. Ordered most → least
|
|
22531
|
+
* authoritative, and the whole point of returning it: a client must be able to
|
|
22532
|
+
* tell a FACT about the hub's socket from an echo of its own guess.
|
|
22533
|
+
*/
|
|
22534
|
+
var LocalPortSourceEnum = _enum([
|
|
22535
|
+
"server-config",
|
|
22536
|
+
"server-env",
|
|
22537
|
+
"caller-hint",
|
|
22538
|
+
"default"
|
|
22539
|
+
]);
|
|
22540
|
+
/** The port every LAN/loopback `baseUrl` in the same result was built with. */
|
|
22541
|
+
var AdvertisedLocalPortSchema = object({
|
|
22542
|
+
port: number().int().min(1).max(65535),
|
|
22543
|
+
source: LocalPortSourceEnum
|
|
22544
|
+
});
|
|
22545
|
+
var GetConnectionEndpointsResultSchema = object({
|
|
22546
|
+
endpoints: array(ConnectionEndpointSchema).readonly(),
|
|
22547
|
+
/**
|
|
22548
|
+
* The port the hub built the LAN/loopback URLs with, and where that number
|
|
22549
|
+
* came from.
|
|
22550
|
+
*
|
|
22551
|
+
* Returned rather than merely applied, because "the URL is right" and "the
|
|
22552
|
+
* client can KNOW the URL is right" are different properties. A client that
|
|
22553
|
+
* only sees a corrected URL cannot distinguish a hub that fixed the port from
|
|
22554
|
+
* a hub that echoed the port the client sent, so it cannot decide whether to
|
|
22555
|
+
* race the candidate or discard it. With `source` it can: anything but
|
|
22556
|
+
* `caller-hint` is the hub's own socket.
|
|
22557
|
+
*
|
|
22558
|
+
* Absent on hubs predating this field — a client that finds it missing is
|
|
22559
|
+
* talking to an echoing hub and must degrade exactly as it does for
|
|
22560
|
+
* `caller-hint`.
|
|
22561
|
+
*/
|
|
22562
|
+
localPort: AdvertisedLocalPortSchema
|
|
22563
|
+
});
|
|
22469
22564
|
/**
|
|
22470
22565
|
* The chosen outbound endpoint for notification artifacts. `baseUrl: null` =
|
|
22471
22566
|
* AUTO (resolved from the candidate ranking at send time); `resolved` reports
|
|
@@ -22486,8 +22581,13 @@ var AllowedAddressesSchema = object({
|
|
|
22486
22581
|
*/
|
|
22487
22582
|
addresses: array(string()).readonly() });
|
|
22488
22583
|
method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
|
|
22489
|
-
/**
|
|
22490
|
-
|
|
22584
|
+
/**
|
|
22585
|
+
* LEGACY HINT — do not send from new code. Kept optional so clients
|
|
22586
|
+
* written against the echoing contract keep working; the hub uses it
|
|
22587
|
+
* only when it cannot read its own port, and says so via
|
|
22588
|
+
* `localPort.source === 'caller-hint'`.
|
|
22589
|
+
*/
|
|
22590
|
+
port: number().int().min(1).max(65535).optional(),
|
|
22491
22591
|
/** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
|
|
22492
22592
|
* candidate. Default `true`. */
|
|
22493
22593
|
includeLoopback: boolean().optional(),
|
|
@@ -33472,7 +33572,6 @@ var NC_AUDIO_DEFAULTS = {
|
|
|
33472
33572
|
hitPercent: 60,
|
|
33473
33573
|
samplingSeconds: 10
|
|
33474
33574
|
};
|
|
33475
|
-
new Map(AUDIO_MACRO_LABELS.flatMap((macro) => macro.icon === void 0 ? [] : [[macro.id, macro.icon]]));
|
|
33476
33575
|
new Set(["devices", "classes"]);
|
|
33477
33576
|
NC_AUDIO_DEFAULTS.hitPercent, NC_AUDIO_DEFAULTS.samplingSeconds;
|
|
33478
33577
|
/**
|
|
@@ -33706,6 +33805,39 @@ TimelapseRuleInputSchema.extend({
|
|
|
33706
33805
|
createdAt: number(),
|
|
33707
33806
|
updatedAt: number()
|
|
33708
33807
|
});
|
|
33808
|
+
Object.freeze(Object.fromEntries([{
|
|
33809
|
+
stepId: "face-embedding",
|
|
33810
|
+
label: "Face recognition model",
|
|
33811
|
+
defaultModelId: "arcface-r100",
|
|
33812
|
+
indexName: "the enrolled face gallery",
|
|
33813
|
+
options: [
|
|
33814
|
+
{
|
|
33815
|
+
id: "arcface-r100",
|
|
33816
|
+
label: "ArcFace (ResNet34)"
|
|
33817
|
+
},
|
|
33818
|
+
{
|
|
33819
|
+
id: "auraface-r100",
|
|
33820
|
+
label: "AuraFace R100"
|
|
33821
|
+
},
|
|
33822
|
+
{
|
|
33823
|
+
id: "inception-resnet-v1",
|
|
33824
|
+
label: "Inception ResNet V1"
|
|
33825
|
+
}
|
|
33826
|
+
]
|
|
33827
|
+
}, {
|
|
33828
|
+
stepId: "clip-embedding",
|
|
33829
|
+
label: "Semantic search model",
|
|
33830
|
+
defaultModelId: "mobileclip-s1",
|
|
33831
|
+
indexName: "the object semantic-search index",
|
|
33832
|
+
options: [{
|
|
33833
|
+
id: "mobileclip-s1",
|
|
33834
|
+
label: "MobileCLIP S1"
|
|
33835
|
+
}, {
|
|
33836
|
+
id: "mobileclip-s2",
|
|
33837
|
+
label: "MobileCLIP S2"
|
|
33838
|
+
}]
|
|
33839
|
+
}].map((s) => [s.stepId, s.defaultModelId])));
|
|
33840
|
+
string().min(1);
|
|
33709
33841
|
object({
|
|
33710
33842
|
/**
|
|
33711
33843
|
* Fraction of the box's own size added on EACH side before cutting.
|
|
@@ -33726,10 +33858,21 @@ object({
|
|
|
33726
33858
|
*/
|
|
33727
33859
|
square: boolean()
|
|
33728
33860
|
});
|
|
33729
|
-
|
|
33861
|
+
/**
|
|
33862
|
+
* The convention in force when nobody has configured one — byte-for-byte the
|
|
33863
|
+
* behaviour of the pre-unification LIVE path (`DETAIL_CROP_PADDING_RATIO`).
|
|
33864
|
+
*/
|
|
33865
|
+
var DEFAULT_DETAIL_CROP_CONVENTION = {
|
|
33730
33866
|
paddingRatio: .15,
|
|
33731
33867
|
square: false
|
|
33732
|
-
}
|
|
33868
|
+
};
|
|
33869
|
+
Object.freeze({
|
|
33870
|
+
x: 0,
|
|
33871
|
+
y: 0,
|
|
33872
|
+
w: 1,
|
|
33873
|
+
h: 1
|
|
33874
|
+
});
|
|
33875
|
+
DEFAULT_DETAIL_CROP_CONVENTION.paddingRatio;
|
|
33733
33876
|
/**
|
|
33734
33877
|
* WHICH delivered frames the decode worker retains a native copy of.
|
|
33735
33878
|
*
|
|
@@ -7583,7 +7583,7 @@ var RecordingBandSchema = object({
|
|
|
7583
7583
|
postBufferSec: number().min(0).optional()
|
|
7584
7584
|
});
|
|
7585
7585
|
({
|
|
7586
|
-
preBufferSec:
|
|
7586
|
+
preBufferSec: 15,
|
|
7587
7587
|
postBufferSec: 30
|
|
7588
7588
|
}).postBufferSec * 1e3;
|
|
7589
7589
|
/**
|
|
@@ -13539,128 +13539,103 @@ var COCO_TO_MACRO = {
|
|
|
13539
13539
|
var AUDIO_MACRO_LABELS = [
|
|
13540
13540
|
{
|
|
13541
13541
|
id: "speech",
|
|
13542
|
-
name: "Speech"
|
|
13543
|
-
icon: "🗣️"
|
|
13542
|
+
name: "Speech"
|
|
13544
13543
|
},
|
|
13545
13544
|
{
|
|
13546
13545
|
id: "scream",
|
|
13547
|
-
name: "Scream / Shout"
|
|
13548
|
-
icon: "😱"
|
|
13546
|
+
name: "Scream / Shout"
|
|
13549
13547
|
},
|
|
13550
13548
|
{
|
|
13551
13549
|
id: "crying",
|
|
13552
|
-
name: "Crying / Baby"
|
|
13553
|
-
icon: "😢"
|
|
13550
|
+
name: "Crying / Baby"
|
|
13554
13551
|
},
|
|
13555
13552
|
{
|
|
13556
13553
|
id: "laughter",
|
|
13557
|
-
name: "Laughter"
|
|
13558
|
-
icon: "😂"
|
|
13554
|
+
name: "Laughter"
|
|
13559
13555
|
},
|
|
13560
13556
|
{
|
|
13561
13557
|
id: "music",
|
|
13562
|
-
name: "Music"
|
|
13563
|
-
icon: "🎵"
|
|
13558
|
+
name: "Music"
|
|
13564
13559
|
},
|
|
13565
13560
|
{
|
|
13566
13561
|
id: "dog",
|
|
13567
|
-
name: "Dog"
|
|
13568
|
-
icon: "🐕"
|
|
13562
|
+
name: "Dog"
|
|
13569
13563
|
},
|
|
13570
13564
|
{
|
|
13571
13565
|
id: "cat",
|
|
13572
|
-
name: "Cat"
|
|
13573
|
-
icon: "🐈"
|
|
13566
|
+
name: "Cat"
|
|
13574
13567
|
},
|
|
13575
13568
|
{
|
|
13576
13569
|
id: "bird",
|
|
13577
|
-
name: "Bird"
|
|
13578
|
-
icon: "🐦"
|
|
13570
|
+
name: "Bird"
|
|
13579
13571
|
},
|
|
13580
13572
|
{
|
|
13581
13573
|
id: "animal",
|
|
13582
|
-
name: "Animal (other)"
|
|
13583
|
-
icon: "🐾"
|
|
13574
|
+
name: "Animal (other)"
|
|
13584
13575
|
},
|
|
13585
13576
|
{
|
|
13586
13577
|
id: "alarm",
|
|
13587
|
-
name: "Alarm / Siren"
|
|
13588
|
-
icon: "🚨"
|
|
13578
|
+
name: "Alarm / Siren"
|
|
13589
13579
|
},
|
|
13590
13580
|
{
|
|
13591
13581
|
id: "doorbell",
|
|
13592
|
-
name: "Doorbell / Knock"
|
|
13593
|
-
icon: "🔔"
|
|
13582
|
+
name: "Doorbell / Knock"
|
|
13594
13583
|
},
|
|
13595
13584
|
{
|
|
13596
13585
|
id: "glass_breaking",
|
|
13597
|
-
name: "Glass Breaking"
|
|
13598
|
-
icon: "💥"
|
|
13586
|
+
name: "Glass Breaking"
|
|
13599
13587
|
},
|
|
13600
13588
|
{
|
|
13601
13589
|
id: "gunshot",
|
|
13602
|
-
name: "Gunshot / Explosion"
|
|
13603
|
-
icon: "💣"
|
|
13590
|
+
name: "Gunshot / Explosion"
|
|
13604
13591
|
},
|
|
13605
13592
|
{
|
|
13606
13593
|
id: "vehicle",
|
|
13607
|
-
name: "Vehicle"
|
|
13608
|
-
icon: "🚗"
|
|
13594
|
+
name: "Vehicle"
|
|
13609
13595
|
},
|
|
13610
13596
|
{
|
|
13611
13597
|
id: "siren",
|
|
13612
|
-
name: "Emergency Siren"
|
|
13613
|
-
icon: "🚑"
|
|
13598
|
+
name: "Emergency Siren"
|
|
13614
13599
|
},
|
|
13615
13600
|
{
|
|
13616
13601
|
id: "fire",
|
|
13617
|
-
name: "Fire / Smoke"
|
|
13618
|
-
icon: "🔥"
|
|
13602
|
+
name: "Fire / Smoke"
|
|
13619
13603
|
},
|
|
13620
13604
|
{
|
|
13621
13605
|
id: "water",
|
|
13622
|
-
name: "Water"
|
|
13623
|
-
icon: "💧"
|
|
13606
|
+
name: "Water"
|
|
13624
13607
|
},
|
|
13625
13608
|
{
|
|
13626
13609
|
id: "wind",
|
|
13627
|
-
name: "Wind / Weather"
|
|
13628
|
-
icon: "🌬️"
|
|
13610
|
+
name: "Wind / Weather"
|
|
13629
13611
|
},
|
|
13630
13612
|
{
|
|
13631
13613
|
id: "door",
|
|
13632
|
-
name: "Door"
|
|
13633
|
-
icon: "🚪"
|
|
13614
|
+
name: "Door"
|
|
13634
13615
|
},
|
|
13635
13616
|
{
|
|
13636
13617
|
id: "footsteps",
|
|
13637
|
-
name: "Footsteps"
|
|
13638
|
-
icon: "👣"
|
|
13618
|
+
name: "Footsteps"
|
|
13639
13619
|
},
|
|
13640
13620
|
{
|
|
13641
13621
|
id: "crowd",
|
|
13642
|
-
name: "Crowd / Chatter"
|
|
13643
|
-
icon: "👥"
|
|
13622
|
+
name: "Crowd / Chatter"
|
|
13644
13623
|
},
|
|
13645
13624
|
{
|
|
13646
13625
|
id: "telephone",
|
|
13647
|
-
name: "Telephone"
|
|
13648
|
-
icon: "📞"
|
|
13626
|
+
name: "Telephone"
|
|
13649
13627
|
},
|
|
13650
13628
|
{
|
|
13651
13629
|
id: "engine",
|
|
13652
|
-
name: "Engine / Motor"
|
|
13653
|
-
icon: "⚙️"
|
|
13630
|
+
name: "Engine / Motor"
|
|
13654
13631
|
},
|
|
13655
13632
|
{
|
|
13656
13633
|
id: "tools",
|
|
13657
|
-
name: "Tools / Construction"
|
|
13658
|
-
icon: "🔨"
|
|
13634
|
+
name: "Tools / Construction"
|
|
13659
13635
|
},
|
|
13660
13636
|
{
|
|
13661
13637
|
id: "silence",
|
|
13662
|
-
name: "Silence"
|
|
13663
|
-
icon: "🤫"
|
|
13638
|
+
name: "Silence"
|
|
13664
13639
|
}
|
|
13665
13640
|
];
|
|
13666
13641
|
var YAMNET_TO_MACRO = {
|
|
@@ -16124,7 +16099,7 @@ var TrackEnvelopeSchema = object({
|
|
|
16124
16099
|
* `snapshots[]` references — megabytes across a page of tracks. `slim`
|
|
16125
16100
|
* keeps every scalar the list surfaces actually render (ids, class(es),
|
|
16126
16101
|
* label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
|
|
16127
|
-
* zonesVisited, bestEventId, envelope, hasFace, hasRider) and returns `positions` /
|
|
16102
|
+
* zonesVisited, bestEventId, envelope, hasFace, hasEmbeddedFace, hasRider) and returns `positions` /
|
|
16128
16103
|
* `snapshots` as EMPTY arrays — detail views re-fetch the full row via
|
|
16129
16104
|
* `getTrack`. Mirrors the event-store `projection` convention
|
|
16130
16105
|
* (`getObjectEvents` et al.).
|
|
@@ -16419,6 +16394,35 @@ var TrackSchema = object({
|
|
|
16419
16394
|
*/
|
|
16420
16395
|
hasFace: boolean().optional(),
|
|
16421
16396
|
/**
|
|
16397
|
+
* This track has a face row IN THE GALLERY: a crop **and** an embedding — a
|
|
16398
|
+
* face an operator could ASSIGN to an identity.
|
|
16399
|
+
*
|
|
16400
|
+
* The STRICT twin of {@link hasFace}, and the pair only earns its keep
|
|
16401
|
+
* because the two disagree. `hasFace` is stamped at the TOP of the face
|
|
16402
|
+
* branch, before every gate, and means no more than "a face detector produced
|
|
16403
|
+
* a face detail". This one is stamped at the single moment the gallery row
|
|
16404
|
+
* LANDS — after `FaceRecognizer.onTrackEnd` successfully persists it, i.e.
|
|
16405
|
+
* past the embedding-magnitude verdict, the `minFacePx` detection gate, the
|
|
16406
|
+
* candidate gate, the imageless-track drop (no crop was ever captured) and
|
|
16407
|
+
* the crop-store drop. Everything between the detector and that insert can
|
|
16408
|
+
* legitimately refuse the face, so a flag written any earlier promises the
|
|
16409
|
+
* operator something to assign and delivers nothing.
|
|
16410
|
+
*
|
|
16411
|
+
* **Independent of recognition.** A face collected but never auto-matched is
|
|
16412
|
+
* still assignable — it is in fact the face an operator most wants to reach —
|
|
16413
|
+
* so this is NOT gated on `recognizedIdentityId`. Recognition lands in
|
|
16414
|
+
* `subLabel`; this says only that the raw material exists.
|
|
16415
|
+
*
|
|
16416
|
+
* **Set once, never cleared.** A track that produced a gallery row produced
|
|
16417
|
+
* one; deleting the row later is the gallery's business, not this flag's.
|
|
16418
|
+
*
|
|
16419
|
+
* **Absent ≠ false**, the same rule as {@link hasFace}: every row written
|
|
16420
|
+
* before the column omits it, and so does every server that predates the
|
|
16421
|
+
* field. A consumer must test `=== true` and render nothing otherwise —
|
|
16422
|
+
* never infer "no assignable face".
|
|
16423
|
+
*/
|
|
16424
|
+
hasEmbeddedFace: boolean().optional(),
|
|
16425
|
+
/**
|
|
16422
16426
|
* This subject CONTAINS a folded rider — a person the rider-pairing step
|
|
16423
16427
|
* ([D34](../decisions/adr-0034.md)) removed from the frame BEFORE the tracker,
|
|
16424
16428
|
* so the passage is tracked once and as a VEHICLE.
|
|
@@ -17768,6 +17772,32 @@ var DetailResultSchema = object({
|
|
|
17768
17772
|
/** FRAME-space bbox (already mapped back from crop space). */
|
|
17769
17773
|
bbox: NativeCropBboxSchema.optional(),
|
|
17770
17774
|
embedding: string().optional(),
|
|
17775
|
+
/**
|
|
17776
|
+
* L2 magnitude of the RAW pre-normalization embedding. Additive and optional
|
|
17777
|
+
* so an older runner that does not send it degrades to "unmeasurable", which
|
|
17778
|
+
* the consuming gate treats as accept — never as reject.
|
|
17779
|
+
*/
|
|
17780
|
+
embeddingMagnitude: number().optional(),
|
|
17781
|
+
/**
|
|
17782
|
+
* Model that produced `embedding` — the SAME contract `labelModelId` has for
|
|
17783
|
+
* `label`, and for the same reason: the producing node is the only side that
|
|
17784
|
+
* knows which model actually ran, and re-deriving it downstream is exactly
|
|
17785
|
+
* the inference this model exists to forbid.
|
|
17786
|
+
*
|
|
17787
|
+
* Additive and optional, so a runner that predates it degrades to
|
|
17788
|
+
* "unmeasurable" rather than to a wrong answer — the consumer falls back to
|
|
17789
|
+
* its previous assumption instead of refusing.
|
|
17790
|
+
*
|
|
17791
|
+
* Its absence was not cosmetic. `FaceRecognizer` needs the probe's model id
|
|
17792
|
+
* to use `face-matcher`'s same-model gate (`sample.modelId !== probe.modelId`);
|
|
17793
|
+
* with nothing on the wire it took the id from the GALLERY, so the gate
|
|
17794
|
+
* compared the gallery against itself and could never fire. That turned the
|
|
17795
|
+
* one guard protecting the face feature space into a tautology, and it is
|
|
17796
|
+
* why swapping `face-embedding`'s model would NOT have stranded the enrolled
|
|
17797
|
+
* gallery as the catalog comment predicts — it would have scored the new
|
|
17798
|
+
* model's vectors against the old model's samples in one cosine space.
|
|
17799
|
+
*/
|
|
17800
|
+
embeddingModelId: string().optional(),
|
|
17771
17801
|
label: string().optional(),
|
|
17772
17802
|
/**
|
|
17773
17803
|
* The tier `label` occupies, copied VERBATIM from the producing step's
|
|
@@ -18643,6 +18673,12 @@ var CameraStatusSchema = object({
|
|
|
18643
18673
|
/** Unix timestamp (ms) when this snapshot was composed server-side. */
|
|
18644
18674
|
fetchedAt: number()
|
|
18645
18675
|
});
|
|
18676
|
+
var InferenceDeviceExclusionReasonSchema = _enum([
|
|
18677
|
+
"disabled",
|
|
18678
|
+
"unavailable",
|
|
18679
|
+
"cannot-host-camera-root",
|
|
18680
|
+
"accelerator-preferred"
|
|
18681
|
+
]);
|
|
18646
18682
|
var NodeInferenceDeviceSchema = object({
|
|
18647
18683
|
/** Stable per-node device key, e.g. `openvino:npu`, `edgetpu:usb`, `cpu`. */
|
|
18648
18684
|
key: string(),
|
|
@@ -18673,7 +18709,17 @@ var NodeInferenceDeviceSchema = object({
|
|
|
18673
18709
|
* available per format; this is the stored selection that becomes the
|
|
18674
18710
|
* default for EVERY camera landing on this accelerator.
|
|
18675
18711
|
*/
|
|
18676
|
-
steps: record(string(), DeviceStepConfigSchema).optional()
|
|
18712
|
+
steps: record(string(), DeviceStepConfigSchema).optional(),
|
|
18713
|
+
/**
|
|
18714
|
+
* `null` when the device IS a camera-root candidate on this node; otherwise
|
|
18715
|
+
* the reason the dispatcher drops it. Computed by the SAME
|
|
18716
|
+
* `resolveInferenceDeviceEligibility` the dispatcher runs, so this view can
|
|
18717
|
+
* never disagree with the election — deriving it in the UI from
|
|
18718
|
+
* `enabled`/`available` would silently miss `cannot-host-camera-root` (needs
|
|
18719
|
+
* the node's model catalog) and `accelerator-preferred` (needs the node-wide
|
|
18720
|
+
* "an accelerator is serving" predicate).
|
|
18721
|
+
*/
|
|
18722
|
+
exclusion: InferenceDeviceExclusionReasonSchema.nullable()
|
|
18677
18723
|
});
|
|
18678
18724
|
var NodeInferenceDevicesSchema = object({
|
|
18679
18725
|
nodeId: string(),
|
|
@@ -19178,6 +19224,7 @@ DeviceType.Camera, method(object({
|
|
|
19178
19224
|
isBattery: boolean(),
|
|
19179
19225
|
reason: _enum([
|
|
19180
19226
|
"disabled",
|
|
19227
|
+
"offline",
|
|
19181
19228
|
"sleeping",
|
|
19182
19229
|
"unreachable",
|
|
19183
19230
|
"waking"
|
|
@@ -19223,9 +19270,17 @@ targets: array(object({
|
|
|
19223
19270
|
sleeping: boolean(),
|
|
19224
19271
|
/** Current device state rendered over the cached frame. State images
|
|
19225
19272
|
* remain authoritative even when their photographic background is
|
|
19226
|
-
* old; null means the link must carry a current camera frame.
|
|
19273
|
+
* old; null means the link must carry a current camera frame.
|
|
19274
|
+
*
|
|
19275
|
+
* **This is the ONLY source a surface may derive an inactive tile
|
|
19276
|
+
* from.** A client that reads a device's `online`/`disabled` flags and
|
|
19277
|
+
* draws its own verdict will disagree with the pixels it is painting
|
|
19278
|
+
* — the frame comes from here, and so must the sentence over it
|
|
19279
|
+
* (D190). Pair with `ageMs` for the age of the photograph behind the
|
|
19280
|
+
* state. */
|
|
19227
19281
|
stateReason: _enum([
|
|
19228
19282
|
"disabled",
|
|
19283
|
+
"offline",
|
|
19229
19284
|
"sleeping",
|
|
19230
19285
|
"unreachable",
|
|
19231
19286
|
"waking"
|
|
@@ -22422,7 +22477,12 @@ var ListResultSchema = object({
|
|
|
22422
22477
|
probedAt: number()
|
|
22423
22478
|
});
|
|
22424
22479
|
var PreferredSchema = LocalInterfaceSchema.nullable();
|
|
22425
|
-
|
|
22480
|
+
/**
|
|
22481
|
+
* Candidate base URL for the SDK to race on connect. Order matters —
|
|
22482
|
+
* the SDK should attempt these top-to-bottom with a short per-candidate
|
|
22483
|
+
* timeout (e.g. 1500ms) and cache the winner for the session.
|
|
22484
|
+
*/
|
|
22485
|
+
var ConnectionEndpointSchema = object({
|
|
22426
22486
|
/** Operator-facing label (e.g. "LAN — en0", "Public tunnel"). */
|
|
22427
22487
|
label: string(),
|
|
22428
22488
|
/** Fully-formed base URL with scheme + host + port. */
|
|
@@ -22465,7 +22525,42 @@ var GetConnectionEndpointsResultSchema = object({ endpoints: array(object({
|
|
|
22465
22525
|
* ordering between polls.
|
|
22466
22526
|
*/
|
|
22467
22527
|
priority: number()
|
|
22468
|
-
})
|
|
22528
|
+
});
|
|
22529
|
+
/**
|
|
22530
|
+
* Where the advertised local port came from. Ordered most → least
|
|
22531
|
+
* authoritative, and the whole point of returning it: a client must be able to
|
|
22532
|
+
* tell a FACT about the hub's socket from an echo of its own guess.
|
|
22533
|
+
*/
|
|
22534
|
+
var LocalPortSourceEnum = _enum([
|
|
22535
|
+
"server-config",
|
|
22536
|
+
"server-env",
|
|
22537
|
+
"caller-hint",
|
|
22538
|
+
"default"
|
|
22539
|
+
]);
|
|
22540
|
+
/** The port every LAN/loopback `baseUrl` in the same result was built with. */
|
|
22541
|
+
var AdvertisedLocalPortSchema = object({
|
|
22542
|
+
port: number().int().min(1).max(65535),
|
|
22543
|
+
source: LocalPortSourceEnum
|
|
22544
|
+
});
|
|
22545
|
+
var GetConnectionEndpointsResultSchema = object({
|
|
22546
|
+
endpoints: array(ConnectionEndpointSchema).readonly(),
|
|
22547
|
+
/**
|
|
22548
|
+
* The port the hub built the LAN/loopback URLs with, and where that number
|
|
22549
|
+
* came from.
|
|
22550
|
+
*
|
|
22551
|
+
* Returned rather than merely applied, because "the URL is right" and "the
|
|
22552
|
+
* client can KNOW the URL is right" are different properties. A client that
|
|
22553
|
+
* only sees a corrected URL cannot distinguish a hub that fixed the port from
|
|
22554
|
+
* a hub that echoed the port the client sent, so it cannot decide whether to
|
|
22555
|
+
* race the candidate or discard it. With `source` it can: anything but
|
|
22556
|
+
* `caller-hint` is the hub's own socket.
|
|
22557
|
+
*
|
|
22558
|
+
* Absent on hubs predating this field — a client that finds it missing is
|
|
22559
|
+
* talking to an echoing hub and must degrade exactly as it does for
|
|
22560
|
+
* `caller-hint`.
|
|
22561
|
+
*/
|
|
22562
|
+
localPort: AdvertisedLocalPortSchema
|
|
22563
|
+
});
|
|
22469
22564
|
/**
|
|
22470
22565
|
* The chosen outbound endpoint for notification artifacts. `baseUrl: null` =
|
|
22471
22566
|
* AUTO (resolved from the candidate ranking at send time); `resolved` reports
|
|
@@ -22486,8 +22581,13 @@ var AllowedAddressesSchema = object({
|
|
|
22486
22581
|
*/
|
|
22487
22582
|
addresses: array(string()).readonly() });
|
|
22488
22583
|
method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
|
|
22489
|
-
/**
|
|
22490
|
-
|
|
22584
|
+
/**
|
|
22585
|
+
* LEGACY HINT — do not send from new code. Kept optional so clients
|
|
22586
|
+
* written against the echoing contract keep working; the hub uses it
|
|
22587
|
+
* only when it cannot read its own port, and says so via
|
|
22588
|
+
* `localPort.source === 'caller-hint'`.
|
|
22589
|
+
*/
|
|
22590
|
+
port: number().int().min(1).max(65535).optional(),
|
|
22491
22591
|
/** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
|
|
22492
22592
|
* candidate. Default `true`. */
|
|
22493
22593
|
includeLoopback: boolean().optional(),
|
|
@@ -33472,7 +33572,6 @@ var NC_AUDIO_DEFAULTS = {
|
|
|
33472
33572
|
hitPercent: 60,
|
|
33473
33573
|
samplingSeconds: 10
|
|
33474
33574
|
};
|
|
33475
|
-
new Map(AUDIO_MACRO_LABELS.flatMap((macro) => macro.icon === void 0 ? [] : [[macro.id, macro.icon]]));
|
|
33476
33575
|
new Set(["devices", "classes"]);
|
|
33477
33576
|
NC_AUDIO_DEFAULTS.hitPercent, NC_AUDIO_DEFAULTS.samplingSeconds;
|
|
33478
33577
|
/**
|
|
@@ -33706,6 +33805,39 @@ TimelapseRuleInputSchema.extend({
|
|
|
33706
33805
|
createdAt: number(),
|
|
33707
33806
|
updatedAt: number()
|
|
33708
33807
|
});
|
|
33808
|
+
Object.freeze(Object.fromEntries([{
|
|
33809
|
+
stepId: "face-embedding",
|
|
33810
|
+
label: "Face recognition model",
|
|
33811
|
+
defaultModelId: "arcface-r100",
|
|
33812
|
+
indexName: "the enrolled face gallery",
|
|
33813
|
+
options: [
|
|
33814
|
+
{
|
|
33815
|
+
id: "arcface-r100",
|
|
33816
|
+
label: "ArcFace (ResNet34)"
|
|
33817
|
+
},
|
|
33818
|
+
{
|
|
33819
|
+
id: "auraface-r100",
|
|
33820
|
+
label: "AuraFace R100"
|
|
33821
|
+
},
|
|
33822
|
+
{
|
|
33823
|
+
id: "inception-resnet-v1",
|
|
33824
|
+
label: "Inception ResNet V1"
|
|
33825
|
+
}
|
|
33826
|
+
]
|
|
33827
|
+
}, {
|
|
33828
|
+
stepId: "clip-embedding",
|
|
33829
|
+
label: "Semantic search model",
|
|
33830
|
+
defaultModelId: "mobileclip-s1",
|
|
33831
|
+
indexName: "the object semantic-search index",
|
|
33832
|
+
options: [{
|
|
33833
|
+
id: "mobileclip-s1",
|
|
33834
|
+
label: "MobileCLIP S1"
|
|
33835
|
+
}, {
|
|
33836
|
+
id: "mobileclip-s2",
|
|
33837
|
+
label: "MobileCLIP S2"
|
|
33838
|
+
}]
|
|
33839
|
+
}].map((s) => [s.stepId, s.defaultModelId])));
|
|
33840
|
+
string().min(1);
|
|
33709
33841
|
object({
|
|
33710
33842
|
/**
|
|
33711
33843
|
* Fraction of the box's own size added on EACH side before cutting.
|
|
@@ -33726,10 +33858,21 @@ object({
|
|
|
33726
33858
|
*/
|
|
33727
33859
|
square: boolean()
|
|
33728
33860
|
});
|
|
33729
|
-
|
|
33861
|
+
/**
|
|
33862
|
+
* The convention in force when nobody has configured one — byte-for-byte the
|
|
33863
|
+
* behaviour of the pre-unification LIVE path (`DETAIL_CROP_PADDING_RATIO`).
|
|
33864
|
+
*/
|
|
33865
|
+
var DEFAULT_DETAIL_CROP_CONVENTION = {
|
|
33730
33866
|
paddingRatio: .15,
|
|
33731
33867
|
square: false
|
|
33732
|
-
}
|
|
33868
|
+
};
|
|
33869
|
+
Object.freeze({
|
|
33870
|
+
x: 0,
|
|
33871
|
+
y: 0,
|
|
33872
|
+
w: 1,
|
|
33873
|
+
h: 1
|
|
33874
|
+
});
|
|
33875
|
+
DEFAULT_DETAIL_CROP_CONVENTION.paddingRatio;
|
|
33733
33876
|
/**
|
|
33734
33877
|
* WHICH delivered frames the decode worker retains a native copy of.
|
|
33735
33878
|
*
|
|
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
|
|
|
2
2
|
__esModule: { value: true },
|
|
3
3
|
[Symbol.toStringTag]: { value: "Module" }
|
|
4
4
|
});
|
|
5
|
-
const require_dist = require("../dist-
|
|
5
|
+
const require_dist = require("../dist-B3cBbqzz.js");
|
|
6
6
|
let node_crypto = require("node:crypto");
|
|
7
7
|
let node_child_process = require("node:child_process");
|
|
8
8
|
//#region src/ingress/tailscale-cli.ts
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as EventCategory, i as BaseAddon, n as networkAccessCapability } from "../dist-
|
|
1
|
+
import { a as EventCategory, i as BaseAddon, n as networkAccessCapability } from "../dist-cyVteDFT.mjs";
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
3
|
import { execFile } from "node:child_process";
|
|
4
4
|
import { promisify } from "node:util";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-tailscale",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.25",
|
|
4
4
|
"description": "Tailscale bundle for CamStack — joins the host to a tailnet (client) and exposes the hub via Serve/Funnel (ingress). Multi-entry npm package shipping 2 addons under a single bundle.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|