@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
|
@@ -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([
|
|
@@ -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-BBZwYfSN.js");
|
|
6
6
|
const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
|
|
7
7
|
let node_fs = require("node:fs");
|
|
8
8
|
let node_path = require("node:path");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Sn as hydrateSchema, ct as evaluateZoneRules, dn as DeviceType, kt as motionDetectionCapability, mn as BaseAddon } from "../dist-
|
|
1
|
+
import { Sn as hydrateSchema, ct as evaluateZoneRules, dn as DeviceType, kt as motionDetectionCapability, mn as BaseAddon } from "../dist-B9LnBPz9.mjs";
|
|
2
2
|
import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
|
|
3
3
|
import { readFileSync } from "node:fs";
|
|
4
4
|
import { join } from "node:path";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { an as Fmp4BoxSplitter, fn as errMsg, ln as isSoftwareDecode, on as buildFfmpegArgs } from "./dist-
|
|
1
|
+
import { an as Fmp4BoxSplitter, fn as errMsg, ln as isSoftwareDecode, on as buildFfmpegArgs } from "./dist-B9LnBPz9.mjs";
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
3
|
import { realpathSync } from "node:fs";
|
|
4
4
|
import path from "node:path";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const require_chunk = require("./chunk-emK7D4bc.js");
|
|
2
|
-
const require_dist = require("./dist-
|
|
2
|
+
const require_dist = require("./dist-BBZwYfSN.js");
|
|
3
3
|
let node_crypto = require("node:crypto");
|
|
4
4
|
let node_fs = require("node:fs");
|
|
5
5
|
node_fs = require_chunk.__toESM(node_fs, 1);
|
|
@@ -3,9 +3,9 @@ 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_hub_hostname = require("../hub-hostname-DAJXlOgV.js");
|
|
10
10
|
const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
|
|
11
11
|
const require_restream_intent = require("../restream-intent-7uDNqMKs.js");
|
|
@@ -5933,12 +5933,10 @@ var PipelineRunner = class {
|
|
|
5933
5933
|
}, (registration.occupancyRecheckSec ?? 0) * 1e3);
|
|
5934
5934
|
if (initialPhase === "active") {
|
|
5935
5935
|
this.detectionStreamHandler?.(deviceId, "subscribe");
|
|
5936
|
-
const cooldownMs = registration.motionCooldownMs ?? DEFAULT_MOTION_COOLDOWN_MS;
|
|
5937
5936
|
this.config.onPhaseChanged?.(deviceId, "active", {
|
|
5938
|
-
|
|
5939
|
-
regions: void 0,
|
|
5937
|
+
cause: "attach",
|
|
5940
5938
|
timestamp: Date.now(),
|
|
5941
|
-
|
|
5939
|
+
...registration.sessionTrigger !== void 0 ? { trigger: registration.sessionTrigger } : {}
|
|
5942
5940
|
});
|
|
5943
5941
|
}
|
|
5944
5942
|
}
|
|
@@ -5953,7 +5951,13 @@ var PipelineRunner = class {
|
|
|
5953
5951
|
clearInterval(state.occupancyTimer);
|
|
5954
5952
|
state.occupancyTimer = null;
|
|
5955
5953
|
}
|
|
5956
|
-
if (state.phase === "active")
|
|
5954
|
+
if (state.phase === "active") {
|
|
5955
|
+
this.detectionStreamHandler?.(deviceId, "unsubscribe");
|
|
5956
|
+
this.config.onPhaseChanged?.(deviceId, "watching", {
|
|
5957
|
+
cause: "detach",
|
|
5958
|
+
timestamp: Date.now()
|
|
5959
|
+
});
|
|
5960
|
+
}
|
|
5957
5961
|
state.motionQueue.clear();
|
|
5958
5962
|
this.discardQueuedDetectionFrames(deviceId, state, "detach");
|
|
5959
5963
|
this.timingSampler.clearDroppedFramesSource(deviceId);
|
|
@@ -6324,6 +6328,7 @@ var PipelineRunner = class {
|
|
|
6324
6328
|
});
|
|
6325
6329
|
this.detectionStreamHandler?.(deviceId, "subscribe");
|
|
6326
6330
|
this.config.onPhaseChanged?.(deviceId, "active", {
|
|
6331
|
+
cause: "motion",
|
|
6327
6332
|
source,
|
|
6328
6333
|
regions,
|
|
6329
6334
|
timestamp: Date.now(),
|
|
@@ -6345,6 +6350,7 @@ var PipelineRunner = class {
|
|
|
6345
6350
|
this.detectionStreamHandler?.(deviceId, "unsubscribe");
|
|
6346
6351
|
const source = state.lastArmedSource ?? "analyzer";
|
|
6347
6352
|
this.config.onPhaseChanged?.(deviceId, "watching", {
|
|
6353
|
+
cause: "motion",
|
|
6348
6354
|
source,
|
|
6349
6355
|
regions: void 0,
|
|
6350
6356
|
timestamp: Date.now(),
|
|
@@ -6738,7 +6744,6 @@ var PipelineRunner = class {
|
|
|
6738
6744
|
//#endregion
|
|
6739
6745
|
//#region src/pipeline-runner/stateless-step.ts
|
|
6740
6746
|
function modelServability(step, modelId, format) {
|
|
6741
|
-
if (require_default_detection_model.RETIRED_MODEL_IDS[step.id]?.includes(modelId) === true) return { kind: "retired" };
|
|
6742
6747
|
const entry = step.models.find((m) => m.id === modelId);
|
|
6743
6748
|
if (entry === void 0) return { kind: "custom-model" };
|
|
6744
6749
|
if (entry.formats[format] !== void 0) return { kind: "catalog-build" };
|
|
@@ -6783,7 +6788,6 @@ async function runStatelessStep(deps, input) {
|
|
|
6783
6788
|
const format = await deps.executionFormat();
|
|
6784
6789
|
if (format === null) return refuse(deps, input, "model-not-servable", "this node could not report the engine format it would dispatch on, so the model pin cannot be verified — running anyway would risk a silent format substitution");
|
|
6785
6790
|
const servability = modelServability(definition, input.modelId, format);
|
|
6786
|
-
if (servability.kind === "retired") return refuse(deps, input, "model-not-servable", `model "${input.modelId}" was retired from the ${definition.id} catalog — this node would have substituted the step default`);
|
|
6787
6791
|
if (servability.kind === "no-build") return refuse(deps, input, "model-not-servable", `model "${input.modelId}" has no ${format} build (catalog ships: ${servability.availableFormats.join(", ") || "none"}) — this node would have substituted the ${format} default`);
|
|
6788
6792
|
let decodeError = null;
|
|
6789
6793
|
const crop = await cutFromFullFrame(input.frameJpeg, {
|
|
@@ -7161,6 +7165,25 @@ var DETECTION_REDIAL_GIVEUP_WINDOW_MS = 6e4;
|
|
|
7161
7165
|
* NOTHING — see D453 for what that costs and why it was not taken either.
|
|
7162
7166
|
*/
|
|
7163
7167
|
/**
|
|
7168
|
+
* The source fields a `DetectionPhaseTransition` carries, per cause. A motion
|
|
7169
|
+
* transition: its source and cooldown. A session attach: the motion that opened
|
|
7170
|
+
* it, as the orchestrator dispatched it — absent when it sent none. A detach:
|
|
7171
|
+
* nothing.
|
|
7172
|
+
*/
|
|
7173
|
+
function phaseTransitionSourceFields(meta) {
|
|
7174
|
+
if (meta.cause === "motion") return {
|
|
7175
|
+
source: meta.source,
|
|
7176
|
+
cooldownMs: meta.cooldownMs
|
|
7177
|
+
};
|
|
7178
|
+
if (meta.cause === "detach" || meta.trigger === void 0) return {};
|
|
7179
|
+
const { source, triggeredBy, sensorName } = meta.trigger;
|
|
7180
|
+
return {
|
|
7181
|
+
source,
|
|
7182
|
+
triggeredBy,
|
|
7183
|
+
...sensorName !== void 0 ? { sensorName } : {}
|
|
7184
|
+
};
|
|
7185
|
+
}
|
|
7186
|
+
/**
|
|
7164
7187
|
* Pure decision helper: returns `true` when a dynamic frame-diff analyzer
|
|
7165
7188
|
* subscription should be opened for an onboard-motion camera.
|
|
7166
7189
|
*
|
|
@@ -8716,6 +8739,7 @@ var PipelineRunnerAddon = class PipelineRunnerAddon extends require_dist.BaseAdd
|
|
|
8716
8739
|
runner.registerCamera(config.deviceId, {
|
|
8717
8740
|
detectionMode: config.detectionMode,
|
|
8718
8741
|
...config.detectionSources !== void 0 ? { detectionSources: config.detectionSources } : {},
|
|
8742
|
+
...config.sessionTrigger !== void 0 ? { sessionTrigger: config.sessionTrigger } : {},
|
|
8719
8743
|
...require_default_detection_model.rootObjectGate(config.steps) !== void 0 ? { objectGate: require_default_detection_model.rootObjectGate(config.steps) } : {},
|
|
8720
8744
|
fps: config.detectionFps,
|
|
8721
8745
|
motionCooldownMs: config.motionCooldownMs,
|
|
@@ -10603,9 +10627,11 @@ var PipelineRunnerAddon = class PipelineRunnerAddon extends require_dist.BaseAdd
|
|
|
10603
10627
|
* The phase is NOT the camera's motion and writes no `motion` runtime slice
|
|
10604
10628
|
* (D696). Every on-motion detection session attaches `always-on`, so the
|
|
10605
10629
|
* phase reads `active` for a whole session, and an always-on camera is
|
|
10606
|
-
* `active` for as long as it is attached
|
|
10630
|
+
* `active` for as long as it is attached (`cause: 'attach'`), and returns to
|
|
10631
|
+
* `watching` on detach (`cause: 'detach'`) — neither names a motion source.
|
|
10607
10632
|
* The slice it used to write was therefore "a session is attached", and was
|
|
10608
|
-
* left `detected: true` after every session
|
|
10633
|
+
* left `detected: true` after every session (the detach close of the EVENT
|
|
10634
|
+
* did not exist either until 2026-10-06). The orchestrator is the only
|
|
10609
10635
|
* writer of that slice, with the EFFECTIVE motion, and this runner says so
|
|
10610
10636
|
* on `getLocalLoad().motionSliceWriter` so that it never writes the slice
|
|
10611
10637
|
* while a runner older than D696 still does.
|
|
@@ -10619,8 +10645,8 @@ var PipelineRunnerAddon = class PipelineRunnerAddon extends require_dist.BaseAdd
|
|
|
10619
10645
|
from: detected ? "watching" : "active",
|
|
10620
10646
|
to: detected ? "active" : "watching",
|
|
10621
10647
|
reason: detected ? "motion_detected" : "cooldown_expired",
|
|
10622
|
-
|
|
10623
|
-
|
|
10648
|
+
cause: meta.cause,
|
|
10649
|
+
...phaseTransitionSourceFields(meta),
|
|
10624
10650
|
timestamp: meta.timestamp
|
|
10625
10651
|
};
|
|
10626
10652
|
this.ctx.eventBus.emit(require_dist.createEvent(require_dist.EventCategory.DetectionPhaseTransition, {
|
|
@@ -11640,6 +11666,7 @@ exports.cameraOwnsMotionViaSensor = require_dist.cameraOwnsMotionViaSensor;
|
|
|
11640
11666
|
exports.customActions = pipelineRunnerBenchActions;
|
|
11641
11667
|
exports.default = PipelineRunnerAddon;
|
|
11642
11668
|
exports.deriveDetailSteps = deriveDetailSteps;
|
|
11669
|
+
exports.phaseTransitionSourceFields = phaseTransitionSourceFields;
|
|
11643
11670
|
exports.resolveMotionFrameSource = resolveMotionFrameSource;
|
|
11644
11671
|
exports.resolveSessionDecodeHostname = resolveSessionDecodeHostname;
|
|
11645
11672
|
exports.resolveSessionDecodeOwnerNodeId = resolveSessionDecodeOwnerNodeId;
|