@camstack/addon-post-analysis 1.2.336 → 1.2.338
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/{clip-model-registry-D7e1kEqc.mjs → clip-model-registry-BLUVLdlY.mjs} +492 -195
- package/dist/{clip-model-registry-BxUHFGUg.js → clip-model-registry-BcSLJ8aL.js} +502 -193
- package/dist/embedding-encoder/index.js +2 -2
- package/dist/embedding-encoder/index.mjs +2 -2
- package/dist/pipeline-analytics/_stub.js +2 -2
- package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-y9isEkU9.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-DDfv_NZB.mjs} +2 -2
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D3jDbheU.mjs +26 -0
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BRmdbHeK.mjs +26 -0
- package/dist/pipeline-analytics/{hostInit-DH7hZ_gJ.mjs → hostInit-BTA95n_5.mjs} +2 -2
- package/dist/pipeline-analytics/index.js +149 -62
- package/dist/pipeline-analytics/index.mjs +149 -62
- package/dist/pipeline-analytics/remoteEntry.js +1 -1
- package/package.json +2 -2
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BZ-aada5.mjs +0 -26
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-DxUsRAkr.mjs +0 -26
|
@@ -5451,7 +5451,7 @@ var ZodIssueCode = {
|
|
|
5451
5451
|
var ZodFirstPartyTypeKind;
|
|
5452
5452
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5453
5453
|
//#endregion
|
|
5454
|
-
//#region ../types/dist/sleep-
|
|
5454
|
+
//#region ../types/dist/sleep-C16NCZR2.mjs
|
|
5455
5455
|
/**
|
|
5456
5456
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5457
5457
|
* window to float samples (D455).
|
|
@@ -11529,89 +11529,51 @@ function resolveClipSearchMinScore(meta, request) {
|
|
|
11529
11529
|
const factor = CLIP_STRICTNESS_FACTOR[request.strictness ?? "loose"];
|
|
11530
11530
|
return Math.min(1, Math.round(meta.searchMinScore * factor * 1e3) / 1e3);
|
|
11531
11531
|
}
|
|
11532
|
-
/**
|
|
11533
|
-
|
|
11534
|
-
* only those.
|
|
11535
|
-
*
|
|
11536
|
-
* `preserveOriginal: false` below is the whole reason this set exists: the
|
|
11537
|
-
* executor maps each raw COCO label onto its macro and DROPS everything else,
|
|
11538
|
-
* so a tracked detection's `className` is always one of {@link MACRO_LABELS}.
|
|
11539
|
-
* Any surface that indexes counts by class name — the ZoneAnalytics occupancy
|
|
11540
|
-
* snapshot's `byClass`, and therefore every occupancy rule — can match nothing
|
|
11541
|
-
* else. Derived from the catalog, never hand-listed, so a new macro joins it by
|
|
11542
|
-
* being declared once.
|
|
11543
|
-
*
|
|
11544
|
-
* Cost of not having it, 2026-08-12: the notification rule editor offered the
|
|
11545
|
-
* full taxonomy for an occupancy class (occupancy is the one condition that
|
|
11546
|
-
* does not go through the engine's macro-expanding `expandClassSelector`), two
|
|
11547
|
-
* live rules were authored on `car`, and both counters read 0 forever.
|
|
11548
|
-
*/
|
|
11549
|
-
var DETECTION_MACRO_CLASSES = new Set([
|
|
11550
|
-
{
|
|
11551
|
-
id: "person",
|
|
11552
|
-
name: "Person"
|
|
11553
|
-
},
|
|
11554
|
-
{
|
|
11555
|
-
id: "vehicle",
|
|
11556
|
-
name: "Vehicle"
|
|
11557
|
-
},
|
|
11558
|
-
{
|
|
11559
|
-
id: "animal",
|
|
11560
|
-
name: "Animal"
|
|
11561
|
-
},
|
|
11562
|
-
{
|
|
11563
|
-
id: "package",
|
|
11564
|
-
name: "Package"
|
|
11565
|
-
}
|
|
11566
|
-
].map((l) => l.id));
|
|
11567
|
-
/** True when `className` is a macro the detector can actually emit (and hence a
|
|
11568
|
-
* class a count can be keyed on) — see {@link DETECTION_MACRO_CLASSES}. */
|
|
11569
|
-
function isDetectionMacroClass(className) {
|
|
11570
|
-
return DETECTION_MACRO_CLASSES.has(className.trim().toLowerCase());
|
|
11571
|
-
}
|
|
11572
|
-
var COCO_TO_MACRO = {
|
|
11573
|
-
mapping: {
|
|
11574
|
-
person: "person",
|
|
11575
|
-
bicycle: "vehicle",
|
|
11576
|
-
car: "vehicle",
|
|
11577
|
-
motorcycle: "vehicle",
|
|
11578
|
-
airplane: "vehicle",
|
|
11579
|
-
bus: "vehicle",
|
|
11580
|
-
train: "vehicle",
|
|
11581
|
-
truck: "vehicle",
|
|
11582
|
-
boat: "vehicle",
|
|
11583
|
-
bird: "animal",
|
|
11584
|
-
cat: "animal",
|
|
11585
|
-
dog: "animal",
|
|
11586
|
-
horse: "animal",
|
|
11587
|
-
sheep: "animal",
|
|
11588
|
-
cow: "animal",
|
|
11589
|
-
elephant: "animal",
|
|
11590
|
-
bear: "animal",
|
|
11591
|
-
zebra: "animal",
|
|
11592
|
-
giraffe: "animal",
|
|
11593
|
-
suitcase: "package",
|
|
11594
|
-
backpack: "package",
|
|
11595
|
-
handbag: "package"
|
|
11596
|
-
},
|
|
11597
|
-
preserveOriginal: false
|
|
11598
|
-
};
|
|
11599
|
-
/** Steps a root detector may declare it fills. */
|
|
11600
|
-
var FILLABLE_STEP_IDS = [
|
|
11532
|
+
/** Steps whose effect a root label can BE. */
|
|
11533
|
+
var LABEL_SUPPLY_STEP_IDS = [
|
|
11601
11534
|
"animal-classifier",
|
|
11602
11535
|
"vehicle-classifier",
|
|
11603
11536
|
"package-detection"
|
|
11604
11537
|
];
|
|
11605
|
-
/**
|
|
11606
|
-
|
|
11607
|
-
|
|
11608
|
-
|
|
11538
|
+
/** Steps whose box a root detection can BE. */
|
|
11539
|
+
var CROP_SUPPLY_STEP_IDS = ["plate-detection", "face-detection"];
|
|
11540
|
+
/** Every step a root model can supply. */
|
|
11541
|
+
var ROOT_SUPPLIABLE_STEP_IDS = [...LABEL_SUPPLY_STEP_IDS, ...CROP_SUPPLY_STEP_IDS];
|
|
11542
|
+
/** Narrow a step id to a suppliable one — type guard, not a cast. */
|
|
11543
|
+
function isRootSuppliableStepId(value) {
|
|
11544
|
+
return ROOT_SUPPLIABLE_STEP_IDS.some((id) => id === value);
|
|
11545
|
+
}
|
|
11546
|
+
/** Narrow a step id to a label-kind one. */
|
|
11547
|
+
function isLabelSupplyStepId(value) {
|
|
11548
|
+
return LABEL_SUPPLY_STEP_IDS.some((id) => id === value);
|
|
11549
|
+
}
|
|
11550
|
+
var CROP_SUPPLY_SOURCES = {
|
|
11551
|
+
"plate-detection": {
|
|
11552
|
+
rootLabels: ["license_plate"],
|
|
11553
|
+
parentMacro: "vehicle",
|
|
11554
|
+
childClass: "plate",
|
|
11555
|
+
servedChildSteps: ["plate-ocr"],
|
|
11556
|
+
use: "as-output"
|
|
11557
|
+
},
|
|
11558
|
+
"face-detection": {
|
|
11559
|
+
rootLabels: ["face"],
|
|
11560
|
+
parentMacro: "person",
|
|
11561
|
+
childClass: "face",
|
|
11562
|
+
servedChildSteps: ["face-embedding"],
|
|
11563
|
+
use: "refine",
|
|
11564
|
+
minRootInputPx: 640
|
|
11565
|
+
}
|
|
11566
|
+
};
|
|
11609
11567
|
/** The step a linked label stands in for, or `undefined` for any other attribution. */
|
|
11610
11568
|
function linkedStepOf(attributionStepId) {
|
|
11611
11569
|
if (attributionStepId === void 0) return void 0;
|
|
11612
11570
|
if (!attributionStepId.startsWith("detector-link:")) return void 0;
|
|
11613
11571
|
const stepId = attributionStepId.slice(14);
|
|
11614
|
-
return
|
|
11572
|
+
return isLabelSupplyStepId(stepId) ? stepId : void 0;
|
|
11573
|
+
}
|
|
11574
|
+
/** The child steps of a crop-kind step that still run on the root's box. */
|
|
11575
|
+
function rootSupplyServes(stepId) {
|
|
11576
|
+
return CROP_SUPPLY_SOURCES[stepId].servedChildSteps;
|
|
11615
11577
|
}
|
|
11616
11578
|
var MODEL_FORMATS = [
|
|
11617
11579
|
"onnx",
|
|
@@ -11745,12 +11707,35 @@ var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { wei
|
|
|
11745
11707
|
/** True when the weights or their data forbid commercial use. */
|
|
11746
11708
|
nonCommercial: boolean().optional()
|
|
11747
11709
|
}));
|
|
11748
|
-
/**
|
|
11749
|
-
|
|
11750
|
-
|
|
11710
|
+
/**
|
|
11711
|
+
* One step a ROOT detector can supply from its own output (D730) — see
|
|
11712
|
+
* `ModelCatalogEntry.suppliesSteps`.
|
|
11713
|
+
*
|
|
11714
|
+
* - `label`: the root's raw class IS the step's answer. `labelToEffect` maps
|
|
11715
|
+
* the root's label to the step's vocabulary; `uncovered` is the vocabulary
|
|
11716
|
+
* the root cannot produce (shown as unavailable, never a blocker).
|
|
11717
|
+
* - `crop`: the root draws the box the step would have found (`license_plate`
|
|
11718
|
+
* for plate-detection, `face` for face-detection). The box becomes a detail
|
|
11719
|
+
* child of the `parentMacro` detection that contains it — never a track.
|
|
11720
|
+
*/
|
|
11721
|
+
var RootStepSupplySchema = discriminatedUnion("kind", [object({
|
|
11722
|
+
kind: literal("label"),
|
|
11723
|
+
stepId: _enum(LABEL_SUPPLY_STEP_IDS),
|
|
11751
11724
|
labelToEffect: record(string(), string()),
|
|
11752
11725
|
uncovered: array(string()).readonly()
|
|
11753
|
-
})
|
|
11726
|
+
}), object({
|
|
11727
|
+
kind: literal("crop"),
|
|
11728
|
+
stepId: _enum(CROP_SUPPLY_STEP_IDS),
|
|
11729
|
+
rootLabels: array(string()).readonly(),
|
|
11730
|
+
parentMacro: _enum(["vehicle", "person"]),
|
|
11731
|
+
childClass: _enum(["plate", "face"]),
|
|
11732
|
+
/**
|
|
11733
|
+
* The root's smaller input side, stamped on read by `rootSuppliesOf` from
|
|
11734
|
+
* the model entry — what a step's `minRootInputPx` gate judges. Never
|
|
11735
|
+
* stored by an import.
|
|
11736
|
+
*/
|
|
11737
|
+
rootInputPx: number().int().positive().optional()
|
|
11738
|
+
})]);
|
|
11754
11739
|
var ModelCatalogEntrySchema = object({
|
|
11755
11740
|
id: string(),
|
|
11756
11741
|
name: string(),
|
|
@@ -11877,15 +11862,15 @@ var ModelCatalogEntrySchema = object({
|
|
|
11877
11862
|
*/
|
|
11878
11863
|
classMap: DetectionCatalogClassMapSchema.optional(),
|
|
11879
11864
|
/**
|
|
11880
|
-
* The pipeline steps this ROOT detector
|
|
11881
|
-
* its labels name
|
|
11882
|
-
*
|
|
11883
|
-
* labelmap by `
|
|
11884
|
-
*
|
|
11885
|
-
*
|
|
11886
|
-
* `
|
|
11865
|
+
* The pipeline steps this ROOT detector can supply from its own output
|
|
11866
|
+
* (D730): its labels name a step's effect (`deer` for `animal-classifier`)
|
|
11867
|
+
* or draw a step's box (`license_plate` for `plate-detection`). Computed at
|
|
11868
|
+
* import from THIS model's labelmap by `deriveRootSupplies`, never written
|
|
11869
|
+
* by hand and never assumed per family; a row without it is derived on read
|
|
11870
|
+
* (`rootSuppliesOf`). Whether a camera uses it is the step's own
|
|
11871
|
+
* `useRootModel` flag (`resolveRootSupply`).
|
|
11887
11872
|
*/
|
|
11888
|
-
|
|
11873
|
+
suppliesSteps: array(RootStepSupplySchema).readonly().optional(),
|
|
11889
11874
|
/**
|
|
11890
11875
|
* The model's CLIP feature-space contract (text encoder, dimension, vector
|
|
11891
11876
|
* index, token window, search floor) — see `clip-model.ts`. Present ONLY on a
|
|
@@ -19469,6 +19454,96 @@ var filesystemBrowseCapability = {
|
|
|
19469
19454
|
})
|
|
19470
19455
|
}
|
|
19471
19456
|
};
|
|
19457
|
+
/** The central link domain the viewer app claims (Universal Links / App Links). */
|
|
19458
|
+
var CAMSTACK_APP_LINK_ORIGIN = "https://camstack.zentik.app";
|
|
19459
|
+
/** Where the hub serves the viewer SPA. */
|
|
19460
|
+
var HUB_VIEWER_MOUNT = "/viewer/camstack";
|
|
19461
|
+
/** True when `baseUrl` names the CamStack app link rather than a hub address. */
|
|
19462
|
+
function isAppLinkBase(baseUrl) {
|
|
19463
|
+
if (baseUrl === null || baseUrl === void 0 || baseUrl === "") return false;
|
|
19464
|
+
try {
|
|
19465
|
+
return new URL(baseUrl).origin === CAMSTACK_APP_LINK_ORIGIN;
|
|
19466
|
+
} catch {
|
|
19467
|
+
return false;
|
|
19468
|
+
}
|
|
19469
|
+
}
|
|
19470
|
+
/**
|
|
19471
|
+
* The base a viewer link is built on, from the flagged notification address:
|
|
19472
|
+
* the effective address is the explicit choice, else AUTO's `resolved`. The
|
|
19473
|
+
* one reading of that answer — the NC's tap and the Network page's preview
|
|
19474
|
+
* both go through it.
|
|
19475
|
+
*/
|
|
19476
|
+
function viewerLinkBaseOf(endpoint) {
|
|
19477
|
+
const flagged = endpoint.baseUrl ?? endpoint.resolved;
|
|
19478
|
+
return isAppLinkBase(flagged) ? {
|
|
19479
|
+
form: "app",
|
|
19480
|
+
hubBaseUrl: endpoint.appLinkHub ?? null
|
|
19481
|
+
} : {
|
|
19482
|
+
form: "hub",
|
|
19483
|
+
hubBaseUrl: flagged
|
|
19484
|
+
};
|
|
19485
|
+
}
|
|
19486
|
+
/**
|
|
19487
|
+
* Reduce a base URL to the bare origin the central page accepts as `hub=`,
|
|
19488
|
+
* or `null` when it cannot be one: not http(s), carries credentials, or does
|
|
19489
|
+
* not parse. A path/query/fragment is dropped — the central page mounts the
|
|
19490
|
+
* viewer under the origin itself.
|
|
19491
|
+
*/
|
|
19492
|
+
function toAppLinkHubOrigin(baseUrl) {
|
|
19493
|
+
let parsed;
|
|
19494
|
+
try {
|
|
19495
|
+
parsed = new URL(baseUrl);
|
|
19496
|
+
} catch {
|
|
19497
|
+
return null;
|
|
19498
|
+
}
|
|
19499
|
+
if (parsed.protocol !== "https:" && parsed.protocol !== "http:") return null;
|
|
19500
|
+
if (parsed.username !== "" || parsed.password !== "") return null;
|
|
19501
|
+
if (parsed.hostname === "") return null;
|
|
19502
|
+
return parsed.origin;
|
|
19503
|
+
}
|
|
19504
|
+
/** The viewer route for a destination, or null when it names nothing. */
|
|
19505
|
+
function viewerRoute(destination) {
|
|
19506
|
+
switch (destination.kind) {
|
|
19507
|
+
case "camera": {
|
|
19508
|
+
if (!Number.isInteger(destination.deviceId) || destination.deviceId <= 0) return null;
|
|
19509
|
+
const at = destination.atMs;
|
|
19510
|
+
return {
|
|
19511
|
+
path: `/camera/${String(destination.deviceId)}`,
|
|
19512
|
+
query: at !== void 0 && Number.isFinite(at) ? [["at", String(Math.trunc(at))]] : []
|
|
19513
|
+
};
|
|
19514
|
+
}
|
|
19515
|
+
case "events": return {
|
|
19516
|
+
path: "/events",
|
|
19517
|
+
query: []
|
|
19518
|
+
};
|
|
19519
|
+
case "notifications": return {
|
|
19520
|
+
path: "/notifications",
|
|
19521
|
+
query: []
|
|
19522
|
+
};
|
|
19523
|
+
}
|
|
19524
|
+
}
|
|
19525
|
+
function encodeQuery(query) {
|
|
19526
|
+
if (query.length === 0) return "";
|
|
19527
|
+
return `?${query.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`).join("&")}`;
|
|
19528
|
+
}
|
|
19529
|
+
/**
|
|
19530
|
+
* The link for a viewer destination, or `null` when none can be minted: an
|
|
19531
|
+
* unknown destination, or the `hub` form with no reachable base (a dead link
|
|
19532
|
+
* is worse than none).
|
|
19533
|
+
*/
|
|
19534
|
+
function buildViewerLink(input) {
|
|
19535
|
+
const route = viewerRoute(input.destination);
|
|
19536
|
+
if (route === null) return null;
|
|
19537
|
+
const raw = input.base.hubBaseUrl;
|
|
19538
|
+
const base = raw === null ? "" : raw.replace(/\/+$/, "");
|
|
19539
|
+
if (input.base.form === "app") {
|
|
19540
|
+
const origin = base === "" ? null : toAppLinkHubOrigin(base);
|
|
19541
|
+
const query = origin === null ? route.query : [...route.query, ["hub", origin]];
|
|
19542
|
+
return `${CAMSTACK_APP_LINK_ORIGIN}${route.path}${encodeQuery(query)}`;
|
|
19543
|
+
}
|
|
19544
|
+
if (base === "" || isAppLinkBase(base)) return null;
|
|
19545
|
+
return `${base}${HUB_VIEWER_MOUNT}${route.path}${encodeQuery(route.query)}`;
|
|
19546
|
+
}
|
|
19472
19547
|
/**
|
|
19473
19548
|
* Transport bounds for AI capability methods.
|
|
19474
19549
|
*
|
|
@@ -21529,6 +21604,73 @@ var notificationOutputCapability = {
|
|
|
21529
21604
|
})
|
|
21530
21605
|
}
|
|
21531
21606
|
};
|
|
21607
|
+
/**
|
|
21608
|
+
* The class names a per-class COUNT can ever be keyed on — the macro ids, and
|
|
21609
|
+
* only those.
|
|
21610
|
+
*
|
|
21611
|
+
* `preserveOriginal: false` below is the whole reason this set exists: the
|
|
21612
|
+
* executor maps each raw COCO label onto its macro and DROPS everything else,
|
|
21613
|
+
* so a tracked detection's `className` is always one of {@link MACRO_LABELS}.
|
|
21614
|
+
* Any surface that indexes counts by class name — the ZoneAnalytics occupancy
|
|
21615
|
+
* snapshot's `byClass`, and therefore every occupancy rule — can match nothing
|
|
21616
|
+
* else. Derived from the catalog, never hand-listed, so a new macro joins it by
|
|
21617
|
+
* being declared once.
|
|
21618
|
+
*
|
|
21619
|
+
* Cost of not having it, 2026-08-12: the notification rule editor offered the
|
|
21620
|
+
* full taxonomy for an occupancy class (occupancy is the one condition that
|
|
21621
|
+
* does not go through the engine's macro-expanding `expandClassSelector`), two
|
|
21622
|
+
* live rules were authored on `car`, and both counters read 0 forever.
|
|
21623
|
+
*/
|
|
21624
|
+
var DETECTION_MACRO_CLASSES = new Set([
|
|
21625
|
+
{
|
|
21626
|
+
id: "person",
|
|
21627
|
+
name: "Person"
|
|
21628
|
+
},
|
|
21629
|
+
{
|
|
21630
|
+
id: "vehicle",
|
|
21631
|
+
name: "Vehicle"
|
|
21632
|
+
},
|
|
21633
|
+
{
|
|
21634
|
+
id: "animal",
|
|
21635
|
+
name: "Animal"
|
|
21636
|
+
},
|
|
21637
|
+
{
|
|
21638
|
+
id: "package",
|
|
21639
|
+
name: "Package"
|
|
21640
|
+
}
|
|
21641
|
+
].map((l) => l.id));
|
|
21642
|
+
/** True when `className` is a macro the detector can actually emit (and hence a
|
|
21643
|
+
* class a count can be keyed on) — see {@link DETECTION_MACRO_CLASSES}. */
|
|
21644
|
+
function isDetectionMacroClass(className) {
|
|
21645
|
+
return DETECTION_MACRO_CLASSES.has(className.trim().toLowerCase());
|
|
21646
|
+
}
|
|
21647
|
+
var COCO_TO_MACRO = {
|
|
21648
|
+
mapping: {
|
|
21649
|
+
person: "person",
|
|
21650
|
+
bicycle: "vehicle",
|
|
21651
|
+
car: "vehicle",
|
|
21652
|
+
motorcycle: "vehicle",
|
|
21653
|
+
airplane: "vehicle",
|
|
21654
|
+
bus: "vehicle",
|
|
21655
|
+
train: "vehicle",
|
|
21656
|
+
truck: "vehicle",
|
|
21657
|
+
boat: "vehicle",
|
|
21658
|
+
bird: "animal",
|
|
21659
|
+
cat: "animal",
|
|
21660
|
+
dog: "animal",
|
|
21661
|
+
horse: "animal",
|
|
21662
|
+
sheep: "animal",
|
|
21663
|
+
cow: "animal",
|
|
21664
|
+
elephant: "animal",
|
|
21665
|
+
bear: "animal",
|
|
21666
|
+
zebra: "animal",
|
|
21667
|
+
giraffe: "animal",
|
|
21668
|
+
suitcase: "package",
|
|
21669
|
+
backpack: "package",
|
|
21670
|
+
handbag: "package"
|
|
21671
|
+
},
|
|
21672
|
+
preserveOriginal: false
|
|
21673
|
+
};
|
|
21532
21674
|
var AUDIO_MACRO_LABELS = [
|
|
21533
21675
|
{
|
|
21534
21676
|
id: "speech",
|
|
@@ -24078,7 +24220,7 @@ var NC_CONDITION_CATALOG = [
|
|
|
24078
24220
|
operator: "in",
|
|
24079
24221
|
appliesTo: ["immediate", "track-end"],
|
|
24080
24222
|
phase: "P1",
|
|
24081
|
-
description: "Only recognised people. Selecting NOBODY means every identity in the face gallery; selecting some narrows to those. Matched on the gallery id, so renaming a person does not break the rule. On Immediate delivery the name must already be known when an event is written — choose Immediate, grouped to wait for it
|
|
24223
|
+
description: "Only recognised people. Selecting NOBODY means every identity in the face gallery; selecting some narrows to those. Matched on the gallery id, so renaming a person does not break the rule. On Immediate delivery the name must already be known when an event is written — choose Immediate, grouped to wait for it."
|
|
24082
24224
|
},
|
|
24083
24225
|
{
|
|
24084
24226
|
id: "plates",
|
|
@@ -28499,6 +28641,34 @@ var pipelineAnalyticsCapability = {
|
|
|
28499
28641
|
}
|
|
28500
28642
|
};
|
|
28501
28643
|
/**
|
|
28644
|
+
* A root model's boxes standing in for one crop-kind step's own inference
|
|
28645
|
+
* (D730) — see `runPipeline.suppliedRoot`.
|
|
28646
|
+
*/
|
|
28647
|
+
var SuppliedRootOutputSchema = object({
|
|
28648
|
+
stepId: string(),
|
|
28649
|
+
/** The root model that drew the boxes — stamped on the result. */
|
|
28650
|
+
modelId: string(),
|
|
28651
|
+
detections: array(object({
|
|
28652
|
+
/** `[x1, y1, x2, y2]` in the pixels of the call's image. */
|
|
28653
|
+
bbox: tuple([
|
|
28654
|
+
number(),
|
|
28655
|
+
number(),
|
|
28656
|
+
number(),
|
|
28657
|
+
number()
|
|
28658
|
+
]),
|
|
28659
|
+
score: number(),
|
|
28660
|
+
/**
|
|
28661
|
+
* Five facial landmarks in the same pixels — a face the step's own
|
|
28662
|
+
* detector already re-found inside a root face box (D730), so its
|
|
28663
|
+
* embedder child aligns it exactly as it aligns any detected face.
|
|
28664
|
+
*/
|
|
28665
|
+
landmarks: array(object({
|
|
28666
|
+
x: number(),
|
|
28667
|
+
y: number()
|
|
28668
|
+
})).optional()
|
|
28669
|
+
})).min(1)
|
|
28670
|
+
});
|
|
28671
|
+
/**
|
|
28502
28672
|
* Reference to the frame's retained NATIVE surface + the parent crop's placement
|
|
28503
28673
|
* within the frame, so the executor can re-cut a leaf child ROI at native
|
|
28504
28674
|
* resolution on the detail plane. See the `runPipeline` `nativeCropRef` field.
|
|
@@ -28629,7 +28799,7 @@ var PipelineModelOptionSchema = object({
|
|
|
28629
28799
|
legacy: boolean().optional(),
|
|
28630
28800
|
provider: ModelProviderIdSchema.optional(),
|
|
28631
28801
|
defaultConfidence: number().optional(),
|
|
28632
|
-
|
|
28802
|
+
suppliesSteps: array(RootStepSupplySchema).readonly().optional()
|
|
28633
28803
|
});
|
|
28634
28804
|
var ConfigFieldBridge = custom();
|
|
28635
28805
|
var PipelineAddonSchemaSchema = object({
|
|
@@ -29033,7 +29203,16 @@ var pipelineExecutorCapability = {
|
|
|
29033
29203
|
* `device-not-servable`), and nothing reaches the camera's live
|
|
29034
29204
|
* trace stream. Absent ⇒ unchanged behaviour.
|
|
29035
29205
|
*/
|
|
29036
|
-
replay: literal(true).optional()
|
|
29206
|
+
replay: literal(true).optional(),
|
|
29207
|
+
/**
|
|
29208
|
+
* Root-supplied detections for the tree's ROOT step (D730). Set by
|
|
29209
|
+
* `runDetailSubtree` when the camera's root model supplies a crop-kind
|
|
29210
|
+
* step (a Frigate+ `license_plate` for `plate-detection`): the step is
|
|
29211
|
+
* NOT inferred, these boxes are its output, and its children (the plate
|
|
29212
|
+
* reader) run on them through their own crop policy. Boxes are in the
|
|
29213
|
+
* PIXELS of the image this call carries. Absent ⇒ the root step runs.
|
|
29214
|
+
*/
|
|
29215
|
+
suppliedRoot: SuppliedRootOutputSchema.optional()
|
|
29037
29216
|
}), PipelineRunResultBridge, { kind: "mutation" }),
|
|
29038
29217
|
/**
|
|
29039
29218
|
* Batched run — N raw frames packed into one cap call. The provider
|
|
@@ -30346,7 +30525,22 @@ var pipelineRunnerCapability = {
|
|
|
30346
30525
|
*/
|
|
30347
30526
|
cropJpeg: string().optional(),
|
|
30348
30527
|
parent: DetailParentSchema,
|
|
30349
|
-
steps: array(string()).optional()
|
|
30528
|
+
steps: array(string()).optional(),
|
|
30529
|
+
/**
|
|
30530
|
+
* The camera's root model already drew this step's boxes (D730): a
|
|
30531
|
+
* `license_plate` inside the parent vehicle. The named step is NOT
|
|
30532
|
+
* inferred — these FRAME-space boxes are its output — and its
|
|
30533
|
+
* requested children (the plate reader) run on them. Absent ⇒ every
|
|
30534
|
+
* requested step infers as before.
|
|
30535
|
+
*/
|
|
30536
|
+
supplied: object({
|
|
30537
|
+
stepId: string(),
|
|
30538
|
+
modelId: string(),
|
|
30539
|
+
boxes: array(object({
|
|
30540
|
+
bbox: NativeCropBboxSchema,
|
|
30541
|
+
score: number()
|
|
30542
|
+
})).min(1)
|
|
30543
|
+
}).optional()
|
|
30350
30544
|
}), object({ details: array(DetailResultSchema) }).nullable(), { kind: "mutation" }),
|
|
30351
30545
|
/**
|
|
30352
30546
|
* Run ONE enrichment step against caller-supplied pixels, with NO camera
|
|
@@ -34427,96 +34621,6 @@ var videoclipsCapability = {
|
|
|
34427
34621
|
})
|
|
34428
34622
|
}
|
|
34429
34623
|
};
|
|
34430
|
-
/** The central link domain the viewer app claims (Universal Links / App Links). */
|
|
34431
|
-
var CAMSTACK_APP_LINK_ORIGIN = "https://camstack.zentik.app";
|
|
34432
|
-
/** Where the hub serves the viewer SPA. */
|
|
34433
|
-
var HUB_VIEWER_MOUNT = "/viewer/camstack";
|
|
34434
|
-
/** True when `baseUrl` names the CamStack app link rather than a hub address. */
|
|
34435
|
-
function isAppLinkBase(baseUrl) {
|
|
34436
|
-
if (baseUrl === null || baseUrl === void 0 || baseUrl === "") return false;
|
|
34437
|
-
try {
|
|
34438
|
-
return new URL(baseUrl).origin === CAMSTACK_APP_LINK_ORIGIN;
|
|
34439
|
-
} catch {
|
|
34440
|
-
return false;
|
|
34441
|
-
}
|
|
34442
|
-
}
|
|
34443
|
-
/**
|
|
34444
|
-
* The base a viewer link is built on, from the flagged notification address:
|
|
34445
|
-
* the effective address is the explicit choice, else AUTO's `resolved`. The
|
|
34446
|
-
* one reading of that answer — the NC's tap and the Network page's preview
|
|
34447
|
-
* both go through it.
|
|
34448
|
-
*/
|
|
34449
|
-
function viewerLinkBaseOf(endpoint) {
|
|
34450
|
-
const flagged = endpoint.baseUrl ?? endpoint.resolved;
|
|
34451
|
-
return isAppLinkBase(flagged) ? {
|
|
34452
|
-
form: "app",
|
|
34453
|
-
hubBaseUrl: endpoint.appLinkHub ?? null
|
|
34454
|
-
} : {
|
|
34455
|
-
form: "hub",
|
|
34456
|
-
hubBaseUrl: flagged
|
|
34457
|
-
};
|
|
34458
|
-
}
|
|
34459
|
-
/**
|
|
34460
|
-
* Reduce a base URL to the bare origin the central page accepts as `hub=`,
|
|
34461
|
-
* or `null` when it cannot be one: not http(s), carries credentials, or does
|
|
34462
|
-
* not parse. A path/query/fragment is dropped — the central page mounts the
|
|
34463
|
-
* viewer under the origin itself.
|
|
34464
|
-
*/
|
|
34465
|
-
function toAppLinkHubOrigin(baseUrl) {
|
|
34466
|
-
let parsed;
|
|
34467
|
-
try {
|
|
34468
|
-
parsed = new URL(baseUrl);
|
|
34469
|
-
} catch {
|
|
34470
|
-
return null;
|
|
34471
|
-
}
|
|
34472
|
-
if (parsed.protocol !== "https:" && parsed.protocol !== "http:") return null;
|
|
34473
|
-
if (parsed.username !== "" || parsed.password !== "") return null;
|
|
34474
|
-
if (parsed.hostname === "") return null;
|
|
34475
|
-
return parsed.origin;
|
|
34476
|
-
}
|
|
34477
|
-
/** The viewer route for a destination, or null when it names nothing. */
|
|
34478
|
-
function viewerRoute(destination) {
|
|
34479
|
-
switch (destination.kind) {
|
|
34480
|
-
case "camera": {
|
|
34481
|
-
if (!Number.isInteger(destination.deviceId) || destination.deviceId <= 0) return null;
|
|
34482
|
-
const at = destination.atMs;
|
|
34483
|
-
return {
|
|
34484
|
-
path: `/camera/${String(destination.deviceId)}`,
|
|
34485
|
-
query: at !== void 0 && Number.isFinite(at) ? [["at", String(Math.trunc(at))]] : []
|
|
34486
|
-
};
|
|
34487
|
-
}
|
|
34488
|
-
case "events": return {
|
|
34489
|
-
path: "/events",
|
|
34490
|
-
query: []
|
|
34491
|
-
};
|
|
34492
|
-
case "notifications": return {
|
|
34493
|
-
path: "/notifications",
|
|
34494
|
-
query: []
|
|
34495
|
-
};
|
|
34496
|
-
}
|
|
34497
|
-
}
|
|
34498
|
-
function encodeQuery(query) {
|
|
34499
|
-
if (query.length === 0) return "";
|
|
34500
|
-
return `?${query.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`).join("&")}`;
|
|
34501
|
-
}
|
|
34502
|
-
/**
|
|
34503
|
-
* The link for a viewer destination, or `null` when none can be minted: an
|
|
34504
|
-
* unknown destination, or the `hub` form with no reachable base (a dead link
|
|
34505
|
-
* is worse than none).
|
|
34506
|
-
*/
|
|
34507
|
-
function buildViewerLink(input) {
|
|
34508
|
-
const route = viewerRoute(input.destination);
|
|
34509
|
-
if (route === null) return null;
|
|
34510
|
-
const raw = input.base.hubBaseUrl;
|
|
34511
|
-
const base = raw === null ? "" : raw.replace(/\/+$/, "");
|
|
34512
|
-
if (input.base.form === "app") {
|
|
34513
|
-
const origin = base === "" ? null : toAppLinkHubOrigin(base);
|
|
34514
|
-
const query = origin === null ? route.query : [...route.query, ["hub", origin]];
|
|
34515
|
-
return `${CAMSTACK_APP_LINK_ORIGIN}${route.path}${encodeQuery(query)}`;
|
|
34516
|
-
}
|
|
34517
|
-
if (base === "" || isAppLinkBase(base)) return null;
|
|
34518
|
-
return `${base}${HUB_VIEWER_MOUNT}${route.path}${encodeQuery(route.query)}`;
|
|
34519
|
-
}
|
|
34520
34624
|
/**
|
|
34521
34625
|
* Optional client-side hints sent at session creation to help the provider
|
|
34522
34626
|
* pick the best native source. All fields optional — a viewer that knows
|
|
@@ -34992,6 +35096,35 @@ var webrtcSessionCapability = {
|
|
|
34992
35096
|
alive: boolean()
|
|
34993
35097
|
})),
|
|
34994
35098
|
/**
|
|
35099
|
+
* The viewer's downlink probe, for ONE live session (D733).
|
|
35100
|
+
*
|
|
35101
|
+
* The player measures `/adaptive-probe` after the session's first decoded
|
|
35102
|
+
* frame (D635). It used to act on the reading itself, by opening a SECOND
|
|
35103
|
+
* session with `hints.downlinkMbps` — every adaptive live open became two
|
|
35104
|
+
* sessions, two ICE + DTLS handshakes and two server pipelines. It now
|
|
35105
|
+
* hands the measurement to the session it already has; the provider picks
|
|
35106
|
+
* the rung exactly as it would from an offer's hints (same viewport
|
|
35107
|
+
* ceiling) and moves the session there — in place when the negotiated
|
|
35108
|
+
* codec carries the new rendition, by the existing re-offer
|
|
35109
|
+
* (`getSessionState.pendingRenegotiation`) when it cannot.
|
|
35110
|
+
*
|
|
35111
|
+
* A MEASUREMENT, never a tier: the client does not choose. A probe only
|
|
35112
|
+
* raises the rung; lowering it stays the ladder's call on delivery.
|
|
35113
|
+
* `held` answers why nothing moved (`not-adaptive`, `pinned`,
|
|
35114
|
+
* `already-there`, `recorded`, …) — a client that gets ANY answer must not
|
|
35115
|
+
* fall back to a reconnect; only a provider that does not know the method
|
|
35116
|
+
* (an older hub) leaves the client its legacy second session.
|
|
35117
|
+
*/
|
|
35118
|
+
applyDownlinkProbe: method(object({
|
|
35119
|
+
deviceId: number().int().nonnegative(),
|
|
35120
|
+
sessionId: string(),
|
|
35121
|
+
downlinkMbps: number().nonnegative()
|
|
35122
|
+
}), object({
|
|
35123
|
+
outcome: _enum(["switching", "held"]),
|
|
35124
|
+
tier: CamProfileSchema.nullable(),
|
|
35125
|
+
reason: string()
|
|
35126
|
+
}), { kind: "mutation" }),
|
|
35127
|
+
/**
|
|
34995
35128
|
* The SERVER's half of the stream-debug overlay, for one live session.
|
|
34996
35129
|
*
|
|
34997
35130
|
* The client can measure its own transport (`getStats()`); it cannot see
|
|
@@ -39242,7 +39375,8 @@ var ConnectionEndpointSchema = object({
|
|
|
39242
39375
|
"lan-ipv6",
|
|
39243
39376
|
"public",
|
|
39244
39377
|
"loopback",
|
|
39245
|
-
"app-link"
|
|
39378
|
+
"app-link",
|
|
39379
|
+
"custom"
|
|
39246
39380
|
]),
|
|
39247
39381
|
/**
|
|
39248
39382
|
* Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
|
|
@@ -39344,6 +39478,76 @@ var ViewerEndpointsSchema = object({
|
|
|
39344
39478
|
/** What the ranking currently resolves to (may be empty if nothing is up). */
|
|
39345
39479
|
resolved: array(string()).readonly()
|
|
39346
39480
|
});
|
|
39481
|
+
/**
|
|
39482
|
+
* DEPRECATED compatibility shape of `getHubAddresses` (D729 amendment, kept
|
|
39483
|
+
* one release for addons built against it): `cluster` is the `agents` role,
|
|
39484
|
+
* `browser` the `signIn` role; `override` is the flagged address.
|
|
39485
|
+
*/
|
|
39486
|
+
var HubAddressSnapshotSchema = object({
|
|
39487
|
+
override: string().nullable(),
|
|
39488
|
+
resolved: string().nullable(),
|
|
39489
|
+
source: _enum([
|
|
39490
|
+
"override",
|
|
39491
|
+
"auto",
|
|
39492
|
+
"none"
|
|
39493
|
+
])
|
|
39494
|
+
});
|
|
39495
|
+
var HubAddressesSchema = object({
|
|
39496
|
+
cluster: HubAddressSnapshotSchema,
|
|
39497
|
+
browser: HubAddressSnapshotSchema
|
|
39498
|
+
});
|
|
39499
|
+
/**
|
|
39500
|
+
* What an address is used for (`hub-address.ts`). `viewer` is many-valued;
|
|
39501
|
+
* `notifications`, `agents` and `signIn` are carried by at most one address.
|
|
39502
|
+
*/
|
|
39503
|
+
var HubAddressRoleSchema = _enum([
|
|
39504
|
+
"viewer",
|
|
39505
|
+
"notifications",
|
|
39506
|
+
"agents",
|
|
39507
|
+
"signIn"
|
|
39508
|
+
]);
|
|
39509
|
+
var RoleSourceSchema = _enum([
|
|
39510
|
+
"flagged",
|
|
39511
|
+
"auto",
|
|
39512
|
+
"none"
|
|
39513
|
+
]);
|
|
39514
|
+
/** One single-valued role: the flagged address, the one in use, and why. */
|
|
39515
|
+
var HubAddressRoleResolutionSchema = object({
|
|
39516
|
+
/** The address carrying the flag, or null = automatic. */
|
|
39517
|
+
flagged: string().nullable(),
|
|
39518
|
+
/** The address in use, or null when nothing qualifies (never loopback). */
|
|
39519
|
+
resolved: string().nullable(),
|
|
39520
|
+
source: RoleSourceSchema
|
|
39521
|
+
});
|
|
39522
|
+
var HubViewerResolutionSchema = object({
|
|
39523
|
+
/** The addresses flagged `viewer`, or empty = automatic. */
|
|
39524
|
+
flagged: array(string()).readonly(),
|
|
39525
|
+
/** What the apps race right now. */
|
|
39526
|
+
resolved: array(string()).readonly(),
|
|
39527
|
+
source: RoleSourceSchema
|
|
39528
|
+
});
|
|
39529
|
+
var HubAddressBookSchema = object({
|
|
39530
|
+
rows: array(ConnectionEndpointSchema.extend({
|
|
39531
|
+
/** In the hub's detected palette right now. */
|
|
39532
|
+
detected: boolean(),
|
|
39533
|
+
/** Entered by the operator (removable). */
|
|
39534
|
+
custom: boolean(),
|
|
39535
|
+
/** The roles explicitly flagged on this address. */
|
|
39536
|
+
flags: array(HubAddressRoleSchema).readonly(),
|
|
39537
|
+
/** The roles this address serves right now — flagged or automatic. */
|
|
39538
|
+
inUse: array(HubAddressRoleSchema).readonly(),
|
|
39539
|
+
/** The roles this address may be flagged with. */
|
|
39540
|
+
eligible: array(HubAddressRoleSchema).readonly()
|
|
39541
|
+
})).readonly(),
|
|
39542
|
+
roles: object({
|
|
39543
|
+
viewer: HubViewerResolutionSchema,
|
|
39544
|
+
notifications: HubAddressRoleResolutionSchema,
|
|
39545
|
+
agents: HubAddressRoleResolutionSchema,
|
|
39546
|
+
signIn: HubAddressRoleResolutionSchema
|
|
39547
|
+
}),
|
|
39548
|
+
/** The `hub=` an app link carries (D709), or null. */
|
|
39549
|
+
appLinkHub: string().nullable()
|
|
39550
|
+
});
|
|
39347
39551
|
var AllowedAddressesSchema = object({
|
|
39348
39552
|
/**
|
|
39349
39553
|
* Allowlist of interface addresses operators have explicitly opted
|
|
@@ -39456,26 +39660,78 @@ var localNetworkCapability = {
|
|
|
39456
39660
|
*/
|
|
39457
39661
|
getNotificationEndpoint: method(_void(), NotificationEndpointSchema),
|
|
39458
39662
|
/**
|
|
39459
|
-
*
|
|
39460
|
-
*
|
|
39461
|
-
*
|
|
39462
|
-
*
|
|
39663
|
+
* @deprecated Use `setAddressRole({ role: 'notifications', … })`. Kept so
|
|
39664
|
+
* an older admin UI keeps working: it writes the same `notifications`
|
|
39665
|
+
* flag, with the same validation. `baseUrl: null` restores automatic; an
|
|
39666
|
+
* address that is not detected becomes a custom address.
|
|
39463
39667
|
*/
|
|
39464
39668
|
setNotificationEndpoint: method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }),
|
|
39465
39669
|
/**
|
|
39466
|
-
* The
|
|
39467
|
-
*
|
|
39468
|
-
*
|
|
39469
|
-
*
|
|
39670
|
+
* The `viewer` role as shipped apps read it: the flagged addresses
|
|
39671
|
+
* (detected or custom), or empty for AUTO — every LAN IPv4 address plus
|
|
39672
|
+
* the public tunnel, never IPv6, mesh, loopback or a custom address.
|
|
39673
|
+
* `resolved` is the set as it stands right now; the custom ones in it are
|
|
39674
|
+
* also in `getConnectionEndpoints`, which the apps filter by it.
|
|
39470
39675
|
*/
|
|
39471
39676
|
getViewerEndpoints: method(_void(), ViewerEndpointsSchema),
|
|
39472
39677
|
/**
|
|
39473
|
-
*
|
|
39474
|
-
*
|
|
39475
|
-
*
|
|
39678
|
+
* @deprecated Use `setAddressRole({ role: 'viewer', … })`. Kept so an
|
|
39679
|
+
* older admin UI keeps working: it replaces the same `viewer` flags.
|
|
39680
|
+
* Empty `baseUrls` restores automatic.
|
|
39476
39681
|
*/
|
|
39477
39682
|
setViewerEndpoints: method(object({ baseUrls: array(string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }),
|
|
39478
39683
|
/**
|
|
39684
|
+
* The Network page's Addresses table and every role's answer — the ONE
|
|
39685
|
+
* reading of "which address is this hub reached at, for what": detected
|
|
39686
|
+
* endpoints and custom addresses with their role flags, and per role the
|
|
39687
|
+
* flagged address, the one in use and whether it is automatic. Agent
|
|
39688
|
+
* deliveries, sign-in and LAN devices read `roles.agents` / `roles.signIn`
|
|
39689
|
+
* here; nothing ranks the palette itself. `scheme` is the one the caller
|
|
39690
|
+
* shows LAN rows in (as `getConnectionEndpoints`); agents and sign-in are
|
|
39691
|
+
* always resolved over the HTTPS palette.
|
|
39692
|
+
*/
|
|
39693
|
+
getAddresses: method(object({ scheme: _enum(["http", "https"]).optional() }).optional(), HubAddressBookSchema),
|
|
39694
|
+
/**
|
|
39695
|
+
* Add a custom address. Validated: an http(s) origin with a host, no
|
|
39696
|
+
* credentials, no path, never loopback — an invalid one is refused with
|
|
39697
|
+
* the reason and nothing is stored. Adding an address that already exists
|
|
39698
|
+
* only updates its label.
|
|
39699
|
+
*/
|
|
39700
|
+
addCustomAddress: method(object({
|
|
39701
|
+
baseUrl: string(),
|
|
39702
|
+
label: string().max(80)
|
|
39703
|
+
}), HubAddressBookSchema, {
|
|
39704
|
+
kind: "mutation",
|
|
39705
|
+
auth: "admin"
|
|
39706
|
+
}),
|
|
39707
|
+
/** Remove a custom address. Its role flags go with it (those roles turn automatic). */
|
|
39708
|
+
removeCustomAddress: method(object({ baseUrl: string() }), HubAddressBookSchema, {
|
|
39709
|
+
kind: "mutation",
|
|
39710
|
+
auth: "admin"
|
|
39711
|
+
}),
|
|
39712
|
+
/**
|
|
39713
|
+
* Flag (`enabled: true`) or unflag an address for a role. For a
|
|
39714
|
+
* single-valued role, flagging moves the flag off every other address.
|
|
39715
|
+
* `baseUrl: null` returns the role to automatic. The address must be a row
|
|
39716
|
+
* of the table (detected, custom, or the app link for notifications);
|
|
39717
|
+
* `signIn` on a plain-http address is refused unless `acceptInsecureHttp`.
|
|
39718
|
+
*/
|
|
39719
|
+
setAddressRole: method(object({
|
|
39720
|
+
role: HubAddressRoleSchema,
|
|
39721
|
+
baseUrl: string().nullable(),
|
|
39722
|
+
enabled: boolean(),
|
|
39723
|
+
acceptInsecureHttp: boolean().optional()
|
|
39724
|
+
}), HubAddressBookSchema, {
|
|
39725
|
+
kind: "mutation",
|
|
39726
|
+
auth: "admin"
|
|
39727
|
+
}),
|
|
39728
|
+
/**
|
|
39729
|
+
* @deprecated Read `getAddresses().roles.agents` / `.signIn`. Kept one
|
|
39730
|
+
* release so an addon built against the D729 amendment keeps resolving:
|
|
39731
|
+
* `cluster` = the `agents` role, `browser` = the `signIn` role.
|
|
39732
|
+
*/
|
|
39733
|
+
getHubAddresses: method(_void(), HubAddressesSchema),
|
|
39734
|
+
/**
|
|
39479
39735
|
* Read the operator's allowlist. Empty = "auto" (no filter). Used
|
|
39480
39736
|
* by the admin UI's address selector to seed its checkbox state.
|
|
39481
39737
|
*/
|
|
@@ -51488,12 +51744,24 @@ Object.freeze({
|
|
|
51488
51744
|
addonId: null,
|
|
51489
51745
|
access: "view"
|
|
51490
51746
|
},
|
|
51747
|
+
"localNetwork.addCustomAddress": {
|
|
51748
|
+
capName: "local-network",
|
|
51749
|
+
capScope: "system",
|
|
51750
|
+
addonId: null,
|
|
51751
|
+
access: "create"
|
|
51752
|
+
},
|
|
51491
51753
|
"localNetwork.downloadCa": {
|
|
51492
51754
|
capName: "local-network",
|
|
51493
51755
|
capScope: "system",
|
|
51494
51756
|
addonId: null,
|
|
51495
51757
|
access: "view"
|
|
51496
51758
|
},
|
|
51759
|
+
"localNetwork.getAddresses": {
|
|
51760
|
+
capName: "local-network",
|
|
51761
|
+
capScope: "system",
|
|
51762
|
+
addonId: null,
|
|
51763
|
+
access: "view"
|
|
51764
|
+
},
|
|
51497
51765
|
"localNetwork.getAllowedAddresses": {
|
|
51498
51766
|
capName: "local-network",
|
|
51499
51767
|
capScope: "system",
|
|
@@ -51506,6 +51774,12 @@ Object.freeze({
|
|
|
51506
51774
|
addonId: null,
|
|
51507
51775
|
access: "view"
|
|
51508
51776
|
},
|
|
51777
|
+
"localNetwork.getHubAddresses": {
|
|
51778
|
+
capName: "local-network",
|
|
51779
|
+
capScope: "system",
|
|
51780
|
+
addonId: null,
|
|
51781
|
+
access: "view"
|
|
51782
|
+
},
|
|
51509
51783
|
"localNetwork.getNotificationEndpoint": {
|
|
51510
51784
|
capName: "local-network",
|
|
51511
51785
|
capScope: "system",
|
|
@@ -51542,6 +51816,12 @@ Object.freeze({
|
|
|
51542
51816
|
addonId: null,
|
|
51543
51817
|
access: "create"
|
|
51544
51818
|
},
|
|
51819
|
+
"localNetwork.removeCustomAddress": {
|
|
51820
|
+
capName: "local-network",
|
|
51821
|
+
capScope: "system",
|
|
51822
|
+
addonId: null,
|
|
51823
|
+
access: "delete"
|
|
51824
|
+
},
|
|
51545
51825
|
"localNetwork.resetAllowlistToBestMatch": {
|
|
51546
51826
|
capName: "local-network",
|
|
51547
51827
|
capScope: "system",
|
|
@@ -51554,6 +51834,12 @@ Object.freeze({
|
|
|
51554
51834
|
addonId: null,
|
|
51555
51835
|
access: "create"
|
|
51556
51836
|
},
|
|
51837
|
+
"localNetwork.setAddressRole": {
|
|
51838
|
+
capName: "local-network",
|
|
51839
|
+
capScope: "system",
|
|
51840
|
+
addonId: null,
|
|
51841
|
+
access: "create"
|
|
51842
|
+
},
|
|
51557
51843
|
"localNetwork.setAllowedAddresses": {
|
|
51558
51844
|
capName: "local-network",
|
|
51559
51845
|
capScope: "system",
|
|
@@ -55808,6 +56094,12 @@ Object.freeze({
|
|
|
55808
56094
|
addonId: null,
|
|
55809
56095
|
access: "create"
|
|
55810
56096
|
},
|
|
56097
|
+
"webrtcSession.applyDownlinkProbe": {
|
|
56098
|
+
capName: "webrtc-session",
|
|
56099
|
+
capScope: "device",
|
|
56100
|
+
addonId: null,
|
|
56101
|
+
access: "create"
|
|
56102
|
+
},
|
|
55811
56103
|
"webrtcSession.closeSession": {
|
|
55812
56104
|
capName: "webrtc-session",
|
|
55813
56105
|
capScope: "device",
|
|
@@ -59906,6 +60198,11 @@ Object.freeze({
|
|
|
59906
60198
|
form: "single",
|
|
59907
60199
|
optional: false
|
|
59908
60200
|
}],
|
|
60201
|
+
"webrtcSession.applyDownlinkProbe": [{
|
|
60202
|
+
name: "deviceId",
|
|
60203
|
+
form: "single",
|
|
60204
|
+
optional: false
|
|
60205
|
+
}],
|
|
59909
60206
|
"webrtcSession.closeSession": [{
|
|
59910
60207
|
name: "deviceId",
|
|
59911
60208
|
form: "single",
|
|
@@ -61290,7 +61587,7 @@ var STATE_SUMMARY_VARS = [
|
|
|
61290
61587
|
{
|
|
61291
61588
|
name: "summarySection",
|
|
61292
61589
|
label: "Summary: this section",
|
|
61293
|
-
description: "The section a per-section summary row is about
|
|
61590
|
+
description: "The section a per-section summary row is about; on a summary sent as one message, every section it reports, comma-separated.",
|
|
61294
61591
|
example: "Batterie scariche",
|
|
61295
61592
|
group: "system",
|
|
61296
61593
|
families: ["rule"],
|
|
@@ -63812,4 +64109,4 @@ function buildClipModelRegistry(entries) {
|
|
|
63812
64109
|
/** The built-in catalog's registry. */
|
|
63813
64110
|
var BUILTIN_CLIP_MODELS = buildClipModelRegistry(CLIP_IMAGE_MODELS);
|
|
63814
64111
|
//#endregion
|
|
63815
|
-
export { NC_ALARM_DEFAULT_TRIGGERED_DURATION_SEC as $, encodeVectorBase64 as $n,
|
|
64112
|
+
export { NC_ALARM_DEFAULT_TRIGGERED_DURATION_SEC as $, encodeVectorBase64 as $n, systemEventDeliveryProblems as $r, RECORDING_SOURCE_CAMSTACK_ADDON as $t, EMBEDDING_MODEL_FAILED as A, literal as Ai, applyModeDelaysEdits as An, plateGalleryCapability as Ar, NcLegacyRuleActionSequenceSchema as At, LabelAttributionSchema as B, union as Bi, coreBlockIdFromAddonId as Bn, rootSupplyServes as Br, NcSnoozeInputSchema as Bt, CoverStateSchema as C, normalizeNodeId as Ci, TrackSideSchema as Cn, linkedStepOf as Cr, NcAlarmConfigSchema as Ct, DETECTION_PIPELINE_CAP_NAME as D, array as Di, alarmDeviceSecureOnArm as Dn, occupancyScope as Dr, NcAlarmSettingsPatchSchema as Dt, DETECTION_MACRO_CLASSES as E, _enum as Ei, addonWidgetsSourceCapability as En, notificationRulesCapability as Er, NcAlarmSensorsSchema as Et, EVENT_OWNER_TYPES as F, record as Fi, audioModeOf as Fn, resolveClipSearchMinScore as Fr, NcRuleSchema as Ft, MAX_BIRTH_DECISION_RECORDS as G, deriveRecordingMode as Gn, ruleKindOf as Gr, NcTaxonomySchema as Gt, ListTrackRelationsResultSchema as H, EventCategory as Hi, createAlarmProfile as Hn, ruleBelongsToAlarm as Hr, NcSnoozeSuppressedSchema as Ht, EXPORT_DENSE_MAX_RANGES as I, strictObject as Ii, buildEventKindDescriptor as In, resolveLocationMode as Ir, NcRuleTargetSchema as It, MAX_TRACK_RELATIONS as J, embeddingEncoderCapability as Jn, sensorRaisedOf as Jr, NcTemplateVarDescriptorSchema as Jt, MAX_BIRTH_LATENCY_PROXY_MS as K, describeSystemEventDeliveryProblem as Kn, sceneMonitorCapability as Kr, NcTemplatePreviewInputSchema as Kt, FIRST_LEVEL_MACRO_CLASSES as L, string as Li, buildViewerLink as Ln, resolveModeDelays as Lr, NcRuleUpdateInputSchema as Lt, EMBEDDING_REQUIREMENTS_UNAVAILABLE as M, number as Mi, applySecureOnArmEdit as Mn, readMotionTriggeredBy as Mr, NcRuleActionsSchema as Mt, EVENT_DENSITY_BATCH_MAX as N, object as Ni, assertTimelapseCadences as Nn, readTimelapseGeneratedAt as Nr, NcRuleInputSchema as Nt, DeclaredDevices as O, boolean as Oi, alarmPanelCapability as On, parseProcStatus as Or, NcConditionDescriptorSchema as Ot, EVENT_KIND_BY_CAP as P, partialRecord as Pi, audioMetricsCapability as Pn, renameAlarmProfile as Pr, NcRulePatchSchema as Pt, NC_ALARM_DEFAULT_PROFILE_ID as Q, embeddingRequirementsUnavailableError as Qn, syncActiveAlarmProfileSettings as Qr, RECORDING_EXPORT_MAX_READ_BYTES as Qt, FULL_IMAGE_BBOX as R, templateLiteral as Ri, cloneAlarmSettings as Rn, resolveModeNotifyPolicy as Rr, NcScheduleSchema as Rt, ClearTrackRelationResultSchema as S, nodePin as Si, TrackRelationSchema as Sn, kebabToCamel as Sr, NC_TEMPLATE_VARS as St, DEFAULT_TIMELAPSE_PREVIEW_TEXT as T, ZodObject as Ti, activateAlarmProfile as Tn, memoizePinnedFfmpeg as Tr, NcAlarmSensorsInputSchema as Tt, LockStateSchema as U, deleteAlarmProfile as Un, ruleDeviceCompatCapQueries as Ur, NcStateSummarySectionIdSchema as Ut, ListTrackRelationsInputSchema as V, unknown as Vi, cosineSimilarity as Vn, ruleAutoTriggersAlarm as Vr, NcSnoozeSchema as Vt, MAX_ARCHIVED_DEBUG_NOTES as W, derivePostTriggeredAction as Wn, ruleGroupingApplies as Wr, NcSystemEventKindSchema as Wt, MediaFileKindEnum as X, embeddingRefusalOf as Xn, storageOccupancyCapability as Xr, OpsLogEntrySchema as Xt, MOTION_CLOSE_AFTER_MS as Y, embeddingModelFailedError as Yn, servedTemplateVars as Yr, OPS_LOG_DEFAULT_LIMIT as Yt, MotionTriggeredBySchema as Z, embeddingRequirementsFailedError as Zn, subKindsOf as Zr, PoolMemoryWatchdog as Zt, BIRTH_DECISION_DEFAULT_LIMIT as _, createEvent as _i, TimelapseRuleInputSchema as _n, isRootSuppliableStepId as _r, NC_SENSOR_TRANSITION_KINDS as _t, CLIP_EMBEDDING_STEP_ID as a, templateVarsFor as ai, SCENE_DEFAULT_CHECK_INTERVAL_SEC as an, gifDeriveSpeed as ar, NC_AUDIO_CONFIRM_HITS_DEFAULT as at, COCO_TO_MACRO as b, hydrateSchema as bi, TrackPuritySchema as bn, isSystemEventSummaryRule as br, NC_TANK_SYSTEM_EVENT_KINDS as bt, resolveClusterModelPin as c, zoneAnalyticsCapability as ci, SCENE_DEFAULT_UNCOVERED_POLICY as cn, isAppLinkBase as cr, NC_CLIP_PRE_ROLL_DEFAULT_SEC as ct, APPEARANCE_BLOCKS as d, evaluateSensorEdge as di, SceneMonitorSchema as dn, isDetectionMacroClass as dr, NC_CONSUMABLE_LOW_PERCENT_DEFAULT as dt, systemEventFamilyProblems as ei, RebuildObjectEmbeddingsRefusalSchema as en, ensureAlarmProfiles as er, NC_ALARM_DELAY_FIELDS as et, APPEARANCE_RESOLVES_AMBIGUITY_DEFAULT as f, isSourceCap as fi, SetTrackPurityInputSchema as fn, isEventKindLabelKey as fr, NC_CONSUMABLE_SYSTEM_EVENT_KINDS as ft, ArchivedDebugNoteSchema as g, CamProfileSchema as gi, TRACK_RELATIONS_DEFAULT_LIMIT as gn, isRetiredClearKey as gr, NC_GROUPING_MIN_SEC as gt, AlarmArmModeSchema as h, BaseAddon as hi, TIMELAPSE_DENSE_FLOOR_SEC as hn, isMediaOwnerType as hr, NC_GROUPING_MAX_SEC as ht, CLIP_TEXT_MODELS as i, templateCarriesSummary as ii, SCENE_DEFAULT_ANCHOR_THRESHOLD as in, failureContributionCapability as ir, NC_ALARM_TRIGGERED_MAX_SEC as it, EMBEDDING_REQUIREMENTS_FAILED as j, looseObject as ji, applyNonBlockingEdit as jn, readDeviceStateFrom as jr, NcRuleActionSchema as jt, DetectionSourceSchema as k, discriminatedUnion as ki, applyBlockingEdit as kn, pipelineAnalyticsCapability as kr, NcConditionsSchema as kt, ALL_CAPABILITY_DEFINITIONS as l, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as li, SCENE_DIVERGED as ln, isAudioClassName as lr, NC_CLIP_RETENTION_MAX_SEC as lt, AUDIO_MACRO_LABELS as m, errMsg as mi, SetTrackRelationInputSchema as mn, isKnownTemplateVar as mr, NC_GROUPING_DEFAULT_SEC as mt, DEFAULT_CLIP_MODEL as n, systemEventSummaryScheduleOf as ni, SCENE_CONFIRM_DEFAULT_MAX_IMAGE_PX as nn, evictionPolicyOfLocation as nr, NC_ALARM_NOTIFY_FIELDS as nt, FACE_EMBEDDING_STEP_ID as o, vectorDimFromBase64 as oi, SCENE_DEFAULT_OBSERVATION_SPACING_SEC as on, gifFromMp4Args as or, NC_AUDIO_CONFIRM_WINDOW_SEC_DEFAULT as ot, ARCHIVED_DEBUG_NOTES_DEFAULT_LIMIT as p, DeviceType as pi, SetTrackPurityResultSchema as pn, isEventOwnerType as pr, NC_DEFAULT_SNOOZE_MINUTES as pt, MAX_TRACK_PURITIES as q, describeSystemEventFamilyProblem as qn, secureActuationFor as qr, NcTemplatePreviewSchema as qt, CLIP_IMAGE_MODELS as r, systemEventSummarySplitOf as ri, SCENE_CONFIRM_DEFAULT_TIMEOUT_MS as rn, faceGalleryCapability as rr, NC_ALARM_SYSTEM_EVENT_KINDS as rt, readClusterModelPinStrict as s, viewerLinkBaseOf as si, SCENE_DEFAULT_QUIET_SECONDS as sn, isAlarmControllableCap as sr, NC_CLIP_POST_ROLL_DEFAULT_SEC as st, BUILTIN_CLIP_MODELS as t, systemEventFilterApplies as ti, RetrainStatusSchema as tn, eventKindLabel as tr, NC_ALARM_DELAY_MAX_SEC as tt, APPEARANCE_BIN_COUNT as u, canonicalHash as ui, SCENE_RESET_RECAPTURES as un, isDefaultAlarmProfileId as ur, NC_CONDITION_CATALOG as ut, BaseDevice as v, customAction as vi, TimelapseRulePatchSchema as vn, isScheduleActive as vr, NC_SNOOZE_MAX_MINUTES as vt, DEFAULT_EVENT_COLOR as w, sleep as wi, TrackSourceSchema as wn, mayWriteToLocation as wr, NcAlarmPostTriggeredActionSchema as wt, ClearTrackRelationInputSchema as x, isDeviceScopedCap as xi, TrackRelationKindSchema as xn, isVectorIndexDimConflict as xr, NC_TAXONOMY as xt, BirthDecisionRecordSchema as y, defineCustomActions as yi, TimelapseRuleSchema as yn, isSystemDelivery as yr, NC_SYSTEM_EVENT_KIND_GROUP_SPECS as yt, FailureCounters as z, tuple as zi, consumableLowPercentOf as zn, resolvePoolMemoryPolicy as zr, NcSharedSequenceSchema as zt };
|