@camstack/addon-pipeline 1.2.325 → 1.2.327
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/THIRD_PARTY_MODELS.md +29 -55
- package/dist/audio-analyzer/index.js +2 -2
- package/dist/audio-analyzer/index.mjs +2 -2
- package/dist/{default-detection-model-4nJVRIT6.js → default-detection-model-CBIYdAJ5.js} +97 -483
- package/dist/{default-detection-model-lWMQATmQ.mjs → default-detection-model-hql6BX9-.mjs} +98 -478
- package/dist/detection-pipeline/index.js +10 -5
- package/dist/detection-pipeline/index.mjs +10 -5
- package/dist/{dist-CbRb0Zyj.mjs → dist-B9LnBPz9.mjs} +122 -76
- package/dist/{dist-DlgXwnqU.js → dist-BBZwYfSN.js} +122 -76
- package/dist/motion-wasm/index.js +1 -1
- package/dist/motion-wasm/index.mjs +1 -1
- package/dist/{node-CZ5DXcvq.mjs → node-Ci0E-0VP.mjs} +1 -1
- package/dist/{node-s3wZnnJg.js → node-mJQBUiEc.js} +1 -1
- package/dist/pipeline-runner/index.js +41 -14
- package/dist/pipeline-runner/index.mjs +41 -15
- package/dist/{process-memory-CJsA4yRc.mjs → process-memory-B63Jlpev.mjs} +1 -1
- package/dist/{process-memory-C-mZ1LNi.js → process-memory-DgEfKdtC.js} +1 -1
- package/dist/recorder/index.js +10 -10
- package/dist/recorder/index.mjs +10 -10
- package/dist/{segment-demux-js-BbM0_Fmz.js → segment-demux-js-C2ufKMu0.js} +1 -1
- package/dist/{segment-demux-js-CuwXgwpj.mjs → segment-demux-js-DzwHW4Ey.mjs} +1 -1
- package/dist/stream-broker/_stub.js +2 -2
- package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-BobJEk9e.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-B4fPzS-8.mjs} +3 -3
- package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BDGzcgLP.mjs +26 -0
- package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BpXPNINd.mjs +26 -0
- package/dist/stream-broker/demux-worker-child.js +1 -1
- package/dist/stream-broker/demux-worker-child.mjs +1 -1
- package/dist/stream-broker/{hostInit-C_x1pkx-.mjs → hostInit-Cg4IdtE5.mjs} +3 -3
- package/dist/stream-broker/index.js +5 -5
- package/dist/stream-broker/index.mjs +5 -5
- package/dist/stream-broker/remoteEntry.js +1 -1
- package/package.json +1 -1
- package/python/edgetpu_dequant.py +55 -0
- package/python/inference_pool.py +19 -3
- package/python/postprocessors/__init__.py +2 -0
- package/python/postprocessors/scrfd.py +2 -0
- package/python/postprocessors/test_ssd.py +5 -6
- package/python/postprocessors/test_yolo_split_dfl.py +135 -0
- package/python/postprocessors/yolo_split_dfl.py +255 -0
- package/python/test_dequant_edgetpu.py +65 -0
- package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-NkeMtp-v.mjs +0 -26
- package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-mEJkrfvj.mjs +0 -26
|
@@ -3,11 +3,11 @@ Object.defineProperties(exports, {
|
|
|
3
3
|
[Symbol.toStringTag]: { value: "Module" }
|
|
4
4
|
});
|
|
5
5
|
const require_chunk = require("../chunk-emK7D4bc.js");
|
|
6
|
-
const require_dist = require("../dist-
|
|
7
|
-
const require_node = require("../node-
|
|
8
|
-
const require_default_detection_model = require("../default-detection-model-
|
|
6
|
+
const require_dist = require("../dist-BBZwYfSN.js");
|
|
7
|
+
const require_node = require("../node-mJQBUiEc.js");
|
|
8
|
+
const require_default_detection_model = require("../default-detection-model-CBIYdAJ5.js");
|
|
9
9
|
const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
|
|
10
|
-
const require_process_memory = require("../process-memory-
|
|
10
|
+
const require_process_memory = require("../process-memory-DgEfKdtC.js");
|
|
11
11
|
let node_os = require("node:os");
|
|
12
12
|
node_os = require_chunk.__toESM(node_os);
|
|
13
13
|
let node_fs = require("node:fs");
|
|
@@ -2387,6 +2387,7 @@ function resolveEffectivePostprocessorForEntry(definition, entry) {
|
|
|
2387
2387
|
var NMS_CONSUMING_POSTPROCESSORS = new Set([
|
|
2388
2388
|
"yolo",
|
|
2389
2389
|
"yolo-seg",
|
|
2390
|
+
"yolo-split-dfl",
|
|
2390
2391
|
"rfdetr",
|
|
2391
2392
|
"scrfd",
|
|
2392
2393
|
"yunet"
|
|
@@ -4092,7 +4093,7 @@ function requestedModels(steps) {
|
|
|
4092
4093
|
const walk = (nodes) => {
|
|
4093
4094
|
for (const step of nodes) {
|
|
4094
4095
|
if (!step.enabled) continue;
|
|
4095
|
-
out.set(step.addonId, step.modelId);
|
|
4096
|
+
if (step.modelId !== void 0) out.set(step.addonId, step.modelId);
|
|
4096
4097
|
if (step.children !== void 0) walk(step.children);
|
|
4097
4098
|
}
|
|
4098
4099
|
};
|
|
@@ -4403,13 +4404,16 @@ var KNOWN_POSTPROCESSORS = new Set([
|
|
|
4403
4404
|
"yolo",
|
|
4404
4405
|
"ssd",
|
|
4405
4406
|
"rfdetr",
|
|
4407
|
+
"yolonas",
|
|
4406
4408
|
"yolo-seg",
|
|
4409
|
+
"yolo-split-dfl",
|
|
4407
4410
|
"scrfd",
|
|
4408
4411
|
"yunet",
|
|
4409
4412
|
"arcface",
|
|
4410
4413
|
"clip",
|
|
4411
4414
|
"softmax",
|
|
4412
4415
|
"ctc",
|
|
4416
|
+
"plate-slots",
|
|
4413
4417
|
"saliency",
|
|
4414
4418
|
"yamnet"
|
|
4415
4419
|
]);
|
|
@@ -8655,6 +8659,7 @@ var DetectionPipelineProvider = class DetectionPipelineProvider {
|
|
|
8655
8659
|
}
|
|
8656
8660
|
async downloadModel(input) {
|
|
8657
8661
|
const { modelId, format, addonId } = input;
|
|
8662
|
+
await this.customModels.refresh(this.addonCtx?.api, { force: true });
|
|
8658
8663
|
const modelEntry = await this.resolveModelEntry(addonId, modelId);
|
|
8659
8664
|
if (!modelEntry) throw new Error(`Model "${modelId}" not found in step "${addonId}" catalog`);
|
|
8660
8665
|
const formatEntry = modelEntry.formats[format];
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { n as __require } from "../chunk-DnnnRqeS.mjs";
|
|
2
|
-
import { A as PoolMemoryWatchdog, An as sleep, At as overlayClusterStepSettings, Dn as parseJsonUnknown, En as nodePin, Ft as pipelineExecutorCapability, Hn as union, Ht as resolveClusterStepModelId, Jt as runtimeDevices$1, Kt as resolvePoolMemoryPolicy, Mn as array, Mt as pickClusterStepSettings, Rn as object, Sn as hydrateSchema, Un as EventCategory, V as YAMNET_TO_MACRO, Vn as string, Yt as stepModelRunsOnFormat, bt as loadContributionCapability, ct as evaluateZoneRules, d as CLUSTER_MODEL_SCOPED_STEPS, en as supportedRuntimes$1, et as defaultDeviceFor$1, fn as errMsg, h as DEFAULT_CLUSTER_STEP_SETTINGS, it as detectionPipelineCapability, mn as BaseAddon, n as APPLE_SA_TO_MACRO, st as enumerateInferenceDevices, vn as createEvent, y as DEVICE_BACKEND_TO_FORMAT } from "../dist-
|
|
3
|
-
import { s as readProcessCost } from "../node-
|
|
4
|
-
import {
|
|
2
|
+
import { A as PoolMemoryWatchdog, An as sleep, At as overlayClusterStepSettings, Dn as parseJsonUnknown, En as nodePin, Ft as pipelineExecutorCapability, Hn as union, Ht as resolveClusterStepModelId, Jt as runtimeDevices$1, Kt as resolvePoolMemoryPolicy, Mn as array, Mt as pickClusterStepSettings, Rn as object, Sn as hydrateSchema, Un as EventCategory, V as YAMNET_TO_MACRO, Vn as string, Yt as stepModelRunsOnFormat, bt as loadContributionCapability, ct as evaluateZoneRules, d as CLUSTER_MODEL_SCOPED_STEPS, en as supportedRuntimes$1, et as defaultDeviceFor$1, fn as errMsg, h as DEFAULT_CLUSTER_STEP_SETTINGS, it as detectionPipelineCapability, mn as BaseAddon, n as APPLE_SA_TO_MACRO, st as enumerateInferenceDevices, vn as createEvent, y as DEVICE_BACKEND_TO_FORMAT } from "../dist-B9LnBPz9.mjs";
|
|
3
|
+
import { s as readProcessCost } from "../node-Ci0E-0VP.mjs";
|
|
4
|
+
import { _ as getStep, a as buildSubtreeCanRun, b as landmarkPrecisionVerdict, c as macroGateVerdict, g as getDefaultModelForFormat, h as ALL_STEPS, i as mergeCustomModels, m as ALL_PIPELINE_STEPS, n as resolveDefaultDetectionModel, r as CustomModelCatalog, u as localFrameRegistry, v as getStepDefinition, x as resolveModelDefaultConfidence, y as resolveModelForFormat } from "../default-detection-model-hql6BX9-.mjs";
|
|
5
5
|
import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
|
|
6
|
-
import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-
|
|
6
|
+
import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-B63Jlpev.mjs";
|
|
7
7
|
import * as os from "node:os";
|
|
8
8
|
import * as fs from "node:fs";
|
|
9
9
|
import * as path$1 from "node:path";
|
|
@@ -2380,6 +2380,7 @@ function resolveEffectivePostprocessorForEntry(definition, entry) {
|
|
|
2380
2380
|
var NMS_CONSUMING_POSTPROCESSORS = new Set([
|
|
2381
2381
|
"yolo",
|
|
2382
2382
|
"yolo-seg",
|
|
2383
|
+
"yolo-split-dfl",
|
|
2383
2384
|
"rfdetr",
|
|
2384
2385
|
"scrfd",
|
|
2385
2386
|
"yunet"
|
|
@@ -4085,7 +4086,7 @@ function requestedModels(steps) {
|
|
|
4085
4086
|
const walk = (nodes) => {
|
|
4086
4087
|
for (const step of nodes) {
|
|
4087
4088
|
if (!step.enabled) continue;
|
|
4088
|
-
out.set(step.addonId, step.modelId);
|
|
4089
|
+
if (step.modelId !== void 0) out.set(step.addonId, step.modelId);
|
|
4089
4090
|
if (step.children !== void 0) walk(step.children);
|
|
4090
4091
|
}
|
|
4091
4092
|
};
|
|
@@ -4396,13 +4397,16 @@ var KNOWN_POSTPROCESSORS = new Set([
|
|
|
4396
4397
|
"yolo",
|
|
4397
4398
|
"ssd",
|
|
4398
4399
|
"rfdetr",
|
|
4400
|
+
"yolonas",
|
|
4399
4401
|
"yolo-seg",
|
|
4402
|
+
"yolo-split-dfl",
|
|
4400
4403
|
"scrfd",
|
|
4401
4404
|
"yunet",
|
|
4402
4405
|
"arcface",
|
|
4403
4406
|
"clip",
|
|
4404
4407
|
"softmax",
|
|
4405
4408
|
"ctc",
|
|
4409
|
+
"plate-slots",
|
|
4406
4410
|
"saliency",
|
|
4407
4411
|
"yamnet"
|
|
4408
4412
|
]);
|
|
@@ -8648,6 +8652,7 @@ var DetectionPipelineProvider = class DetectionPipelineProvider {
|
|
|
8648
8652
|
}
|
|
8649
8653
|
async downloadModel(input) {
|
|
8650
8654
|
const { modelId, format, addonId } = input;
|
|
8655
|
+
await this.customModels.refresh(this.addonCtx?.api, { force: true });
|
|
8651
8656
|
const modelEntry = await this.resolveModelEntry(addonId, modelId);
|
|
8652
8657
|
if (!modelEntry) throw new Error(`Model "${modelId}" not found in step "${addonId}" catalog`);
|
|
8653
8658
|
const formatEntry = modelEntry.formats[format];
|
|
@@ -12669,11 +12669,11 @@ var ModelVariantGroupSchema = object({
|
|
|
12669
12669
|
/** Quantization axis. Omit ⇒ the fp32 base build. */
|
|
12670
12670
|
precision: _enum(["fp32", "int8"]).optional(),
|
|
12671
12671
|
/**
|
|
12672
|
-
*
|
|
12673
|
-
*
|
|
12674
|
-
*
|
|
12672
|
+
* Training / latency-variant axis. Omit ⇒ the standard build. `test` marks
|
|
12673
|
+
* an alternate training of the same family (Scrypted `relu_test`); chip
|
|
12674
|
+
* label is "Test".
|
|
12675
12675
|
*/
|
|
12676
|
-
optimization: _enum(["standard", "
|
|
12676
|
+
optimization: _enum(["standard", "test"]).optional(),
|
|
12677
12677
|
/**
|
|
12678
12678
|
* Input-resolution axis (square input side, px). Omit ⇒ the family's native
|
|
12679
12679
|
* resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
|
|
@@ -12709,9 +12709,10 @@ function inferModelProvider(entry) {
|
|
|
12709
12709
|
* are per upstream. A persisted custom-model row written when this field was a
|
|
12710
12710
|
* string still parses — the string is lifted into `{ weights }`.
|
|
12711
12711
|
*
|
|
12712
|
-
* Every licence surface (the
|
|
12713
|
-
*
|
|
12714
|
-
*
|
|
12712
|
+
* Every machine licence surface (`THIRD_PARTY_MODELS.md`, the Hugging Face
|
|
12713
|
+
* model table) is GENERATED from these records by
|
|
12714
|
+
* `scripts/gen-model-licenses.ts` (D661). Operator-facing docs live in
|
|
12715
|
+
* `camstack/docs` → `/docs/detection/models`.
|
|
12715
12716
|
*/
|
|
12716
12717
|
var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { weights: value } : value, object({
|
|
12717
12718
|
/** SPDX id of the WEIGHTS' terms, a `LicenseRef-*` for non-SPDX terms, or `UNKNOWN`. */
|
|
@@ -16743,7 +16744,7 @@ var detectionPipelineCapability = {
|
|
|
16743
16744
|
* This matters here more than anywhere else in the repo, because every provider
|
|
16744
16745
|
* that knows a device's host knows its PASSWORD too: `{ host, port, username,
|
|
16745
16746
|
* password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
|
|
16746
|
-
* and `http://admin:hunter2@192.168.
|
|
16747
|
+
* and `http://admin:hunter2@192.168.60.139/` is a URL a browser accepts. The
|
|
16747
16748
|
* camera's own page will ask for its own login. That is correct, and pre-
|
|
16748
16749
|
* filling it is the operator's business, not ours.
|
|
16749
16750
|
*
|
|
@@ -19781,7 +19782,7 @@ method(object({
|
|
|
19781
19782
|
timeoutMs: 6e5
|
|
19782
19783
|
});
|
|
19783
19784
|
method(object({
|
|
19784
|
-
|
|
19785
|
+
targetNodeId: string(),
|
|
19785
19786
|
modelId: string(),
|
|
19786
19787
|
format: _enum(MODEL_FORMATS),
|
|
19787
19788
|
entry: ModelCatalogEntrySchema
|
|
@@ -22590,8 +22591,9 @@ var NcRuleSchema = NcRuleInputSchema.extend({
|
|
|
22590
22591
|
disabledTargetIds: array(string()).default([])
|
|
22591
22592
|
});
|
|
22592
22593
|
/**
|
|
22593
|
-
* The state-summary SECTIONS (D647 / D698): the D637 kind groups that
|
|
22594
|
-
* still-true state. `
|
|
22594
|
+
* The state-summary SECTIONS (D647 / D698 / D708): the D637 kind groups that
|
|
22595
|
+
* report a still-true state. `addons` is the crash-looped addons only and
|
|
22596
|
+
* `addon-updates` the addons that are behind (D708 split them). `backups-exports` and `alarm` are not sections — a completed
|
|
22595
22597
|
* job is not an open state, and the alarm stays instant.
|
|
22596
22598
|
*/
|
|
22597
22599
|
var NcStateSummarySectionIdSchema = _enum([
|
|
@@ -22603,6 +22605,7 @@ var NcStateSummarySectionIdSchema = _enum([
|
|
|
22603
22605
|
"detection-blind",
|
|
22604
22606
|
"nodes",
|
|
22605
22607
|
"addons",
|
|
22608
|
+
"addon-updates",
|
|
22606
22609
|
"updates"
|
|
22607
22610
|
]);
|
|
22608
22611
|
/** One section of a previewed state summary. `unavailable` = its state could not be read. */
|
|
@@ -23083,7 +23086,19 @@ var NcAlarmModeDelaysListSchema = array(object({
|
|
|
23083
23086
|
* When this mode may be armed. Absent / null = always allowed (same as a
|
|
23084
23087
|
* rule with no `schedule`). Evaluated with {@link isScheduleActive}.
|
|
23085
23088
|
*/
|
|
23086
|
-
schedule: NcScheduleSchema.optional()
|
|
23089
|
+
schedule: NcScheduleSchema.optional(),
|
|
23090
|
+
/**
|
|
23091
|
+
* D706: while this mode's ENTRY DELAY runs, do the alarm rules' own pushes go out (as an
|
|
23092
|
+
* intrusion naming the locations)? Absent = false — the entry-delay notification is the
|
|
23093
|
+
* only one, and the matches ride the triggered notification's mosaic (D705).
|
|
23094
|
+
*/
|
|
23095
|
+
notifyDuringEntryDelay: boolean().optional(),
|
|
23096
|
+
/**
|
|
23097
|
+
* D706: notify "watched again" when a sensor this arm bypassed closes and opens again.
|
|
23098
|
+
* Absent = false (logged, not sent). Even when true it is not sent when that same sensor
|
|
23099
|
+
* is the one that starts the entry delay — the entry-delay notification already names it.
|
|
23100
|
+
*/
|
|
23101
|
+
notifySensorRewatched: boolean().optional()
|
|
23087
23102
|
})).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
|
|
23088
23103
|
var NcAlarmModeDelaysEditListSchema = array(object({
|
|
23089
23104
|
mode: AlarmArmModeSchema,
|
|
@@ -23092,7 +23107,11 @@ var NcAlarmModeDelaysEditListSchema = array(object({
|
|
|
23092
23107
|
triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
|
|
23093
23108
|
postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
|
|
23094
23109
|
/** Set a schedule, or `null` to clear (mode always allowed again). */
|
|
23095
|
-
schedule: NcScheduleSchema.nullable().optional()
|
|
23110
|
+
schedule: NcScheduleSchema.nullable().optional(),
|
|
23111
|
+
/** D706: set the switch, or `null` to clear it (back to the default, false). */
|
|
23112
|
+
notifyDuringEntryDelay: boolean().nullable().optional(),
|
|
23113
|
+
/** D706: set the switch, or `null` to clear it (back to the default, false). */
|
|
23114
|
+
notifySensorRewatched: boolean().nullable().optional()
|
|
23096
23115
|
})).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
|
|
23097
23116
|
/** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
|
|
23098
23117
|
var NcAlarmNonBlockingEditSchema = object({
|
|
@@ -24057,39 +24076,19 @@ var CLUSTER_MODEL_SCOPED_STEPS = [{
|
|
|
24057
24076
|
label: "Face recognition model",
|
|
24058
24077
|
defaultModelId: "auraface-r100",
|
|
24059
24078
|
indexName: "the enrolled face gallery",
|
|
24060
|
-
options: [
|
|
24061
|
-
|
|
24062
|
-
|
|
24063
|
-
|
|
24064
|
-
},
|
|
24065
|
-
{
|
|
24066
|
-
id: "arcface-r100",
|
|
24067
|
-
label: "ArcFace (ResNet34)"
|
|
24068
|
-
},
|
|
24069
|
-
{
|
|
24070
|
-
id: "inception-resnet-v1",
|
|
24071
|
-
label: "Inception ResNet V1"
|
|
24072
|
-
}
|
|
24073
|
-
]
|
|
24079
|
+
options: [{
|
|
24080
|
+
id: "auraface-r100",
|
|
24081
|
+
label: "AuraFace R100"
|
|
24082
|
+
}]
|
|
24074
24083
|
}, {
|
|
24075
24084
|
stepId: "clip-embedding",
|
|
24076
24085
|
label: "Semantic search model",
|
|
24077
|
-
defaultModelId: "
|
|
24086
|
+
defaultModelId: "siglip2-b16-224",
|
|
24078
24087
|
indexName: "the object semantic-search index",
|
|
24079
|
-
options: [
|
|
24080
|
-
|
|
24081
|
-
|
|
24082
|
-
|
|
24083
|
-
},
|
|
24084
|
-
{
|
|
24085
|
-
id: "mobileclip-s2",
|
|
24086
|
-
label: "MobileCLIP S2"
|
|
24087
|
-
},
|
|
24088
|
-
{
|
|
24089
|
-
id: "siglip2-b16-224",
|
|
24090
|
-
label: "SigLIP2 B/16 (Apache-2.0)"
|
|
24091
|
-
}
|
|
24092
|
-
]
|
|
24088
|
+
options: [{
|
|
24089
|
+
id: "siglip2-b16-224",
|
|
24090
|
+
label: "SigLIP2 B/16 (Apache-2.0)"
|
|
24091
|
+
}]
|
|
24093
24092
|
}];
|
|
24094
24093
|
Object.freeze(Object.fromEntries(CLUSTER_MODEL_SCOPED_STEPS.map((s) => [s.stepId, s.defaultModelId])));
|
|
24095
24094
|
function isHydratedField$2(entry) {
|
|
@@ -27176,6 +27175,22 @@ var MotionSourceEnum = _enum([
|
|
|
27176
27175
|
"device-activity"
|
|
27177
27176
|
]);
|
|
27178
27177
|
/**
|
|
27178
|
+
* What opened an on-motion detection SESSION: the motion source that passed the
|
|
27179
|
+
* camera's `motionSources` gate, and what raised it (the camera itself, or a
|
|
27180
|
+
* sensor the operator attached — D672). `sensorName` is the attached sensor's
|
|
27181
|
+
* device name as the orchestrator's camera-sensors resolution last read it;
|
|
27182
|
+
* absent when unknown or when the camera itself triggered.
|
|
27183
|
+
*
|
|
27184
|
+
* Carried on the session attach ONLY so the runner's `DetectionPhaseTransition`
|
|
27185
|
+
* can say what started the session (D672 rule 11, amended 2026-10-06). The
|
|
27186
|
+
* runner never decides anything on it.
|
|
27187
|
+
*/
|
|
27188
|
+
var SessionTriggerSchema = object({
|
|
27189
|
+
source: MotionSourceEnum,
|
|
27190
|
+
triggeredBy: MotionTriggeredBySchema,
|
|
27191
|
+
sensorName: string().optional()
|
|
27192
|
+
});
|
|
27193
|
+
/**
|
|
27179
27194
|
* List of motion sources active on a camera. Empty array is valid:
|
|
27180
27195
|
* "no source" — happens for battery cams without firmware motion when
|
|
27181
27196
|
* the operator hasn't opted into the SW analyzer (would hold the
|
|
@@ -27427,6 +27442,14 @@ var RunnerCameraConfigSchema = object({
|
|
|
27427
27442
|
*/
|
|
27428
27443
|
motionSources: MotionSourcesSchema.default(["analyzer"]),
|
|
27429
27444
|
/**
|
|
27445
|
+
* What opened this attach, on a SESSION attach only (see
|
|
27446
|
+
* {@link SessionTriggerSchema}). OPTIONAL with no default: absent on a
|
|
27447
|
+
* standing attach, an occupancy burst, a re-dispatch with no motion event
|
|
27448
|
+
* behind it, and every attach from an orchestrator older than the field — the
|
|
27449
|
+
* runner then names no source on the phase event.
|
|
27450
|
+
*/
|
|
27451
|
+
sessionTrigger: SessionTriggerSchema.optional(),
|
|
27452
|
+
/**
|
|
27430
27453
|
* WHICH root detector runs for this camera. The detection counterpart of
|
|
27431
27454
|
* {@link motionSources}, same shape and same discipline: a per-camera list
|
|
27432
27455
|
* of sources the system understands, vendor-agnostic, owned here.
|
|
@@ -34317,7 +34340,7 @@ var LocalInterfaceSchema = object({
|
|
|
34317
34340
|
name: string(),
|
|
34318
34341
|
family: _enum(["IPv4", "IPv6"]),
|
|
34319
34342
|
address: string(),
|
|
34320
|
-
/** CIDR shorthand (e.g. `192.168.
|
|
34343
|
+
/** CIDR shorthand (e.g. `192.168.10.10/24`). Empty when OS doesn't expose. */
|
|
34321
34344
|
cidr: string(),
|
|
34322
34345
|
/** OS netmask. Stable across calls so the SDK can hash on it. */
|
|
34323
34346
|
netmask: string(),
|
|
@@ -34371,7 +34394,8 @@ var ConnectionEndpointSchema = object({
|
|
|
34371
34394
|
"lan-ipv4",
|
|
34372
34395
|
"lan-ipv6",
|
|
34373
34396
|
"public",
|
|
34374
|
-
"loopback"
|
|
34397
|
+
"loopback",
|
|
34398
|
+
"app-link"
|
|
34375
34399
|
]),
|
|
34376
34400
|
/**
|
|
34377
34401
|
* Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
|
|
@@ -34440,15 +34464,27 @@ var GetConnectionEndpointsResultSchema = object({
|
|
|
34440
34464
|
localPort: AdvertisedLocalPortSchema
|
|
34441
34465
|
});
|
|
34442
34466
|
/**
|
|
34443
|
-
* The
|
|
34444
|
-
*
|
|
34445
|
-
*
|
|
34467
|
+
* The address flagged for notification links. `baseUrl: null` = AUTO, which
|
|
34468
|
+
* since D709 is the CamStack app link; `resolved` reports the effective value,
|
|
34469
|
+
* so the UI can show it either way.
|
|
34446
34470
|
*/
|
|
34447
34471
|
var NotificationEndpointSchema = object({
|
|
34448
34472
|
/** The operator's explicit choice, or null for AUTO. */
|
|
34449
34473
|
baseUrl: string().nullable(),
|
|
34450
|
-
/**
|
|
34451
|
-
|
|
34474
|
+
/**
|
|
34475
|
+
* The effective flagged address: the explicit choice, else (AUTO) the
|
|
34476
|
+
* CamStack app link `https://camstack.zentik.app` (D709). A pre-D709 hub
|
|
34477
|
+
* answered the public tunnel / mesh here, or null.
|
|
34478
|
+
*/
|
|
34479
|
+
resolved: string().nullable(),
|
|
34480
|
+
/**
|
|
34481
|
+
* The hub origin an app link carries as `hub=` (D709): the hub's best
|
|
34482
|
+
* public HTTPS address — the tunnel, then the mesh (Tailscale MagicDNS) —
|
|
34483
|
+
* picked from this cap's own palette by `pickAppLinkHub`. `null` when the
|
|
34484
|
+
* hub advertises neither; the app link is then minted without `hub=`.
|
|
34485
|
+
* Absent on a pre-D709 hub.
|
|
34486
|
+
*/
|
|
34487
|
+
appLinkHub: string().nullable()
|
|
34452
34488
|
});
|
|
34453
34489
|
/**
|
|
34454
34490
|
* The URLs the SDK / viewer should race for API access. `baseUrls` empty =
|
|
@@ -34502,7 +34538,11 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
|
|
|
34502
34538
|
* Pass `'https'` when the caller is itself loaded over HTTPS
|
|
34503
34539
|
* to avoid mixed-content blocks in the browser. The public
|
|
34504
34540
|
* tunnel always emits `https://` regardless. */
|
|
34505
|
-
scheme: _enum(["http", "https"]).optional()
|
|
34541
|
+
scheme: _enum(["http", "https"]).optional(),
|
|
34542
|
+
/** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
|
|
34543
|
+
* an address notification links can be flagged with, not a hub
|
|
34544
|
+
* route. Default `false`: racers and rankers never see it. */
|
|
34545
|
+
includeAppLink: boolean().optional()
|
|
34506
34546
|
}), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), ViewerEndpointsSchema), method(object({ baseUrls: array(string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" }), method(_void(), TlsStatusSchema), method(object({ reason: string().optional() }), TlsStatusSchema, {
|
|
34507
34547
|
kind: "mutation",
|
|
34508
34548
|
auth: "admin"
|
|
@@ -34763,7 +34803,7 @@ var MeshPeerSchema = object({
|
|
|
34763
34803
|
tags: array(string()).readonly(),
|
|
34764
34804
|
/** True when the peer advertises itself as an exit-node candidate. */
|
|
34765
34805
|
exitNodeOption: boolean(),
|
|
34766
|
-
/** Subnet routes the peer advertises (e.g. `["192.168.
|
|
34806
|
+
/** Subnet routes the peer advertises (e.g. `["192.168.10.0/24"]`). */
|
|
34767
34807
|
advertisedRoutes: array(string()).readonly(),
|
|
34768
34808
|
/** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
|
|
34769
34809
|
userLogin: string().nullable(),
|
|
@@ -35707,7 +35747,13 @@ var OsdStatusSchema = object({ overlays: array(object({
|
|
|
35707
35747
|
*/
|
|
35708
35748
|
availablePositions: array(OsdPositionEnum).readonly(),
|
|
35709
35749
|
/** Firmware does not allow editing the `text` field (e.g. timestamp). */
|
|
35710
|
-
readOnly: boolean().optional()
|
|
35750
|
+
readOnly: boolean().optional(),
|
|
35751
|
+
/**
|
|
35752
|
+
* Firmware text ceiling for this overlay. Absent = no known limit.
|
|
35753
|
+
* The OSD manager truncates here on every write — never stores its own
|
|
35754
|
+
* copy on the binding.
|
|
35755
|
+
*/
|
|
35756
|
+
maxCharacters: number().int().positive().optional()
|
|
35711
35757
|
})).readonly() });
|
|
35712
35758
|
var OsdOverlayPatchSchema = object({
|
|
35713
35759
|
enabled: boolean().optional(),
|
|
@@ -35758,7 +35804,9 @@ var OsdTemplateBindingSchema = object({
|
|
|
35758
35804
|
valuePath: string().min(1).max(64),
|
|
35759
35805
|
/** Convert TO this unit at render (`tryConvertUnit`). Absent = source unit. */
|
|
35760
35806
|
displayUnit: string().max(16).optional(),
|
|
35761
|
-
maxDecimals: number().int().min(0).max(4).default(1)
|
|
35807
|
+
maxDecimals: number().int().min(0).max(4).default(1),
|
|
35808
|
+
/** Raw value → display text (same shape as slot binding). Empty string hides. */
|
|
35809
|
+
valueMap: record(string(), string()).optional()
|
|
35762
35810
|
});
|
|
35763
35811
|
/**
|
|
35764
35812
|
* A named template: bindings (alias → leaf field) + a parser that
|
|
@@ -35808,18 +35856,11 @@ var OsdSlotBindingSchema = object({
|
|
|
35808
35856
|
source: OsdSourceSchema,
|
|
35809
35857
|
/** `${value}` and `${unit}` are substituted; every occurrence. */
|
|
35810
35858
|
template: string().max(96).default("${value}"),
|
|
35811
|
-
/** Truncate with an ellipsis past this length. Absent = no limit. */
|
|
35812
|
-
maxCharacters: number().int().min(4).max(64).optional(),
|
|
35813
35859
|
/**
|
|
35814
35860
|
* Decimal places for a numeric value. `0` yields an integer — the
|
|
35815
35861
|
* documented workaround for firmwares that reject `.` in overlay text.
|
|
35816
35862
|
*/
|
|
35817
35863
|
maxDecimals: number().int().min(0).max(4).default(1),
|
|
35818
|
-
/**
|
|
35819
|
-
* Appended via `${unit}` when no unit conversion produces a label.
|
|
35820
|
-
* Prefer `source.displayUnit` for converted device-state values.
|
|
35821
|
-
*/
|
|
35822
|
-
unitLabel: string().max(8).optional(),
|
|
35823
35864
|
/** Raw value → display text, e.g. `{"true":"MOTION","false":""}`. */
|
|
35824
35865
|
valueMap: record(string(), string()).optional(),
|
|
35825
35866
|
/** Time windows in which the slot is shown. Absent = always. */
|
|
@@ -35828,9 +35869,7 @@ var OsdSlotBindingSchema = object({
|
|
|
35828
35869
|
* Display gate, in the notification centre's condition vocabulary.
|
|
35829
35870
|
* Only the keys reported by `getConditionSupport` are accepted.
|
|
35830
35871
|
*/
|
|
35831
|
-
conditions: NcConditionsSchema.optional()
|
|
35832
|
-
/** Rendered when the gate is closed or the value unreadable. Empty = hide. */
|
|
35833
|
-
fallbackText: string().max(64).default("")
|
|
35872
|
+
conditions: NcConditionsSchema.optional()
|
|
35834
35873
|
});
|
|
35835
35874
|
/** One camera slot, as the operator sees it: firmware truth + our binding. */
|
|
35836
35875
|
var OsdSlotViewSchema = object({
|
|
@@ -52096,12 +52135,14 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
|
|
|
52096
52135
|
{
|
|
52097
52136
|
id: "addons",
|
|
52098
52137
|
family: "system",
|
|
52099
|
-
label: "Addons",
|
|
52100
|
-
kinds: [
|
|
52101
|
-
|
|
52102
|
-
|
|
52103
|
-
|
|
52104
|
-
|
|
52138
|
+
label: "Addons stopped",
|
|
52139
|
+
kinds: ["addon-crash-loop"]
|
|
52140
|
+
},
|
|
52141
|
+
{
|
|
52142
|
+
id: "addon-updates",
|
|
52143
|
+
family: "system",
|
|
52144
|
+
label: "Addon updates",
|
|
52145
|
+
kinds: ["addon-update-available", "addon-updated"]
|
|
52105
52146
|
},
|
|
52106
52147
|
{
|
|
52107
52148
|
id: "updates",
|
|
@@ -52261,13 +52302,15 @@ var STATE_SUMMARY_SECTION_VARS = [
|
|
|
52261
52302
|
},
|
|
52262
52303
|
{
|
|
52263
52304
|
name: "summaryAddons",
|
|
52264
|
-
label: "Summary: addons",
|
|
52265
|
-
example: "
|
|
52266
|
-
kinds: [
|
|
52267
|
-
|
|
52268
|
-
|
|
52269
|
-
|
|
52270
|
-
|
|
52305
|
+
label: "Summary: addons stopped",
|
|
52306
|
+
example: "hub — recorder stopped after repeated crashes",
|
|
52307
|
+
kinds: ["addon-crash-loop"]
|
|
52308
|
+
},
|
|
52309
|
+
{
|
|
52310
|
+
name: "summaryAddonUpdates",
|
|
52311
|
+
label: "Summary: addon updates",
|
|
52312
|
+
example: "hub:\n• @camstack/addon-recorder 1.2.3 → 1.2.4",
|
|
52313
|
+
kinds: ["addon-update-available", "addon-updated"]
|
|
52271
52314
|
},
|
|
52272
52315
|
{
|
|
52273
52316
|
name: "summaryUpdates",
|
|
@@ -52351,6 +52394,7 @@ var STATE_SUMMARY_VARS = [
|
|
|
52351
52394
|
[...RULE_BODY_ONLY],
|
|
52352
52395
|
[...RULE_TEXT],
|
|
52353
52396
|
([...RULE_TEXT], [...DEVICE_EVENTS]),
|
|
52397
|
+
([...RULE_TEXT], [...COMBINED_ALARM]),
|
|
52354
52398
|
([...RULE_TEXT], [...DEVICE_EVENTS]),
|
|
52355
52399
|
([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
|
|
52356
52400
|
([...RULE_TEXT], [...CONSUMABLE]),
|
|
@@ -52391,6 +52435,8 @@ var STATE_SUMMARY_VARS = [
|
|
|
52391
52435
|
[...RULE_TEXT],
|
|
52392
52436
|
[...RULE_TEXT],
|
|
52393
52437
|
[...RULE_TEXT],
|
|
52438
|
+
[...RULE_TEXT],
|
|
52439
|
+
[...RULE_TEXT],
|
|
52394
52440
|
...STATE_SUMMARY_VARS
|
|
52395
52441
|
];
|
|
52396
52442
|
new Set([
|