@camstack/addon-post-analysis 1.2.253 → 1.2.255
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/{dist-C1zIwElw.js → dist-BKRsf6XY.js} +54 -2
- package/dist/{dist-DD2IV-TR.mjs → dist-dL5n2m9M.mjs} +54 -2
- package/dist/embedding-encoder/index.js +1 -1
- package/dist/embedding-encoder/index.mjs +1 -1
- package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-CsbWSeev.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-Bg5BCIXu.mjs} +3 -3
- package/dist/pipeline-analytics/{hostInit-Bu4isu5s.mjs → hostInit-CO2_LCUX.mjs} +3 -3
- package/dist/pipeline-analytics/index.js +36 -1
- package/dist/pipeline-analytics/index.mjs +36 -1
- package/dist/pipeline-analytics/remoteEntry.js +1 -1
- package/package.json +1 -1
|
@@ -12929,7 +12929,23 @@ var PickStreamRequirementsSchema = object({
|
|
|
12929
12929
|
* This is what lets one picker serve both the bypass and the full source
|
|
12930
12930
|
* choice, instead of a consumer scoring privately when the bypass misses.
|
|
12931
12931
|
*/
|
|
12932
|
-
allowTranscode: boolean().optional()
|
|
12932
|
+
allowTranscode: boolean().optional(),
|
|
12933
|
+
/**
|
|
12934
|
+
* Consider ONLY streams the broker has bound to a profile slot.
|
|
12935
|
+
*
|
|
12936
|
+
* A consumer that dials the broker — which is every exporter, since none
|
|
12937
|
+
* of them may open the camera's own URL — can do nothing with a source
|
|
12938
|
+
* that has no slot: there is no restream to dial. Without this the picker
|
|
12939
|
+
* can name such a stream, and each consumer discovers the dead end for
|
|
12940
|
+
* itself: Alexa's `profileForCamStream` returns `null` and it quietly
|
|
12941
|
+
* falls back, and HomeKit would have had to grow the same function again.
|
|
12942
|
+
*
|
|
12943
|
+
* Default `false`, and deliberately so: the BROKER itself picks through
|
|
12944
|
+
* here when it decides which source to BIND to a slot
|
|
12945
|
+
* (`computeInitialAssignment`), and it must see the unbound ones or it
|
|
12946
|
+
* could never bind them.
|
|
12947
|
+
*/
|
|
12948
|
+
requireProfileBound: boolean().optional()
|
|
12933
12949
|
}).readonly();
|
|
12934
12950
|
var PickStreamPreferencesSchema = object({
|
|
12935
12951
|
/**
|
|
@@ -12970,7 +12986,43 @@ var PickedCamStreamSchema = object({
|
|
|
12970
12986
|
*/
|
|
12971
12987
|
transcodes: boolean(),
|
|
12972
12988
|
/** One-line explanation of why this stream won — for logs / debug UI. */
|
|
12973
|
-
reason: string()
|
|
12989
|
+
reason: string(),
|
|
12990
|
+
/**
|
|
12991
|
+
* The broker profile slot this source is bound to, when it is bound.
|
|
12992
|
+
*
|
|
12993
|
+
* Answered HERE because every consumer needs it and none of them can get it
|
|
12994
|
+
* from the `camStreamId` alone. Alexa wrote `profileForCamStream` for it —
|
|
12995
|
+
* a second cap read plus a `null` branch — and HomeKit was about to write
|
|
12996
|
+
* the same function a second time.
|
|
12997
|
+
*
|
|
12998
|
+
* Absent when the source has no slot, which a caller passing
|
|
12999
|
+
* `requireProfileBound` can never see.
|
|
13000
|
+
*/
|
|
13001
|
+
profile: CamProfileSchema.optional(),
|
|
13002
|
+
/** The broker id of that slot, for logs that must name what was dialled. */
|
|
13003
|
+
brokerId: string().optional(),
|
|
13004
|
+
/**
|
|
13005
|
+
* The broker restream URL to dial for this stream.
|
|
13006
|
+
*
|
|
13007
|
+
* An exporter must never open the camera's own URL — the broker is the one
|
|
13008
|
+
* that dials the camera, and every consumer goes through its restream. So
|
|
13009
|
+
* the picker answers with the thing a consumer may actually use, instead of
|
|
13010
|
+
* naming a source and leaving each caller to look the URL up.
|
|
13011
|
+
*/
|
|
13012
|
+
url: string().optional(),
|
|
13013
|
+
/**
|
|
13014
|
+
* Frames per second this stream really delivers, and where the number came
|
|
13015
|
+
* from.
|
|
13016
|
+
*
|
|
13017
|
+
* It is here because getting it wrong is expensive and silent: a HomeKit
|
|
13018
|
+
* accessory advertised 720p at 24 fps while the slot serving it ran at 9,
|
|
13019
|
+
* and the controller rendered nothing at all. The source is carried with the
|
|
13020
|
+
* value for the same reason the bitrate evidence is: `published` is what the
|
|
13021
|
+
* publisher declares and `measured` is what the broker observed, and they
|
|
13022
|
+
* are not interchangeable.
|
|
13023
|
+
*/
|
|
13024
|
+
fps: number().positive().optional(),
|
|
13025
|
+
fpsSource: _enum(["published", "measured"]).optional()
|
|
12974
13026
|
});
|
|
12975
13027
|
/**
|
|
12976
13028
|
* Camera streams — device-scoped facade over the system `stream-broker`.
|
|
@@ -12898,7 +12898,23 @@ var PickStreamRequirementsSchema = object({
|
|
|
12898
12898
|
* This is what lets one picker serve both the bypass and the full source
|
|
12899
12899
|
* choice, instead of a consumer scoring privately when the bypass misses.
|
|
12900
12900
|
*/
|
|
12901
|
-
allowTranscode: boolean().optional()
|
|
12901
|
+
allowTranscode: boolean().optional(),
|
|
12902
|
+
/**
|
|
12903
|
+
* Consider ONLY streams the broker has bound to a profile slot.
|
|
12904
|
+
*
|
|
12905
|
+
* A consumer that dials the broker — which is every exporter, since none
|
|
12906
|
+
* of them may open the camera's own URL — can do nothing with a source
|
|
12907
|
+
* that has no slot: there is no restream to dial. Without this the picker
|
|
12908
|
+
* can name such a stream, and each consumer discovers the dead end for
|
|
12909
|
+
* itself: Alexa's `profileForCamStream` returns `null` and it quietly
|
|
12910
|
+
* falls back, and HomeKit would have had to grow the same function again.
|
|
12911
|
+
*
|
|
12912
|
+
* Default `false`, and deliberately so: the BROKER itself picks through
|
|
12913
|
+
* here when it decides which source to BIND to a slot
|
|
12914
|
+
* (`computeInitialAssignment`), and it must see the unbound ones or it
|
|
12915
|
+
* could never bind them.
|
|
12916
|
+
*/
|
|
12917
|
+
requireProfileBound: boolean().optional()
|
|
12902
12918
|
}).readonly();
|
|
12903
12919
|
var PickStreamPreferencesSchema = object({
|
|
12904
12920
|
/**
|
|
@@ -12939,7 +12955,43 @@ var PickedCamStreamSchema = object({
|
|
|
12939
12955
|
*/
|
|
12940
12956
|
transcodes: boolean(),
|
|
12941
12957
|
/** One-line explanation of why this stream won — for logs / debug UI. */
|
|
12942
|
-
reason: string()
|
|
12958
|
+
reason: string(),
|
|
12959
|
+
/**
|
|
12960
|
+
* The broker profile slot this source is bound to, when it is bound.
|
|
12961
|
+
*
|
|
12962
|
+
* Answered HERE because every consumer needs it and none of them can get it
|
|
12963
|
+
* from the `camStreamId` alone. Alexa wrote `profileForCamStream` for it —
|
|
12964
|
+
* a second cap read plus a `null` branch — and HomeKit was about to write
|
|
12965
|
+
* the same function a second time.
|
|
12966
|
+
*
|
|
12967
|
+
* Absent when the source has no slot, which a caller passing
|
|
12968
|
+
* `requireProfileBound` can never see.
|
|
12969
|
+
*/
|
|
12970
|
+
profile: CamProfileSchema.optional(),
|
|
12971
|
+
/** The broker id of that slot, for logs that must name what was dialled. */
|
|
12972
|
+
brokerId: string().optional(),
|
|
12973
|
+
/**
|
|
12974
|
+
* The broker restream URL to dial for this stream.
|
|
12975
|
+
*
|
|
12976
|
+
* An exporter must never open the camera's own URL — the broker is the one
|
|
12977
|
+
* that dials the camera, and every consumer goes through its restream. So
|
|
12978
|
+
* the picker answers with the thing a consumer may actually use, instead of
|
|
12979
|
+
* naming a source and leaving each caller to look the URL up.
|
|
12980
|
+
*/
|
|
12981
|
+
url: string().optional(),
|
|
12982
|
+
/**
|
|
12983
|
+
* Frames per second this stream really delivers, and where the number came
|
|
12984
|
+
* from.
|
|
12985
|
+
*
|
|
12986
|
+
* It is here because getting it wrong is expensive and silent: a HomeKit
|
|
12987
|
+
* accessory advertised 720p at 24 fps while the slot serving it ran at 9,
|
|
12988
|
+
* and the controller rendered nothing at all. The source is carried with the
|
|
12989
|
+
* value for the same reason the bitrate evidence is: `published` is what the
|
|
12990
|
+
* publisher declares and `measured` is what the broker observed, and they
|
|
12991
|
+
* are not interchangeable.
|
|
12992
|
+
*/
|
|
12993
|
+
fps: number().positive().optional(),
|
|
12994
|
+
fpsSource: _enum(["published", "measured"]).optional()
|
|
12943
12995
|
});
|
|
12944
12996
|
/**
|
|
12945
12997
|
* Camera streams — device-scoped facade over the system `stream-broker`.
|
|
@@ -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-BKRsf6XY.js");
|
|
6
6
|
let node_fs = require("node:fs");
|
|
7
7
|
node_fs = require_dist.__toESM(node_fs);
|
|
8
8
|
let node_path = require("node:path");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Et as parseProcStatus, H as PoolMemoryWatchdog, Ht as BaseAddon, Nt as resolvePoolMemoryPolicy, gt as hfModelUrl, ut as embeddingEncoderCapability } from "../dist-
|
|
1
|
+
import { Et as parseProcStatus, H as PoolMemoryWatchdog, Ht as BaseAddon, Nt as resolvePoolMemoryPolicy, gt as hfModelUrl, ut as embeddingEncoderCapability } from "../dist-dL5n2m9M.mjs";
|
|
2
2
|
import { createRequire } from "node:module";
|
|
3
3
|
import * as fs from "node:fs";
|
|
4
4
|
import * as path$1 from "node:path";
|
|
@@ -3,7 +3,7 @@ import "./dist-CYZr2fwk.mjs";
|
|
|
3
3
|
var e = {
|
|
4
4
|
"@camstack/sdk": {
|
|
5
5
|
name: "@camstack/sdk",
|
|
6
|
-
version: "1.2.
|
|
6
|
+
version: "1.2.111",
|
|
7
7
|
scope: ["default"],
|
|
8
8
|
loaded: !1,
|
|
9
9
|
from: "addon_pipeline_analytics_widgets",
|
|
@@ -18,7 +18,7 @@ var e = {
|
|
|
18
18
|
},
|
|
19
19
|
"@camstack/types": {
|
|
20
20
|
name: "@camstack/types",
|
|
21
|
-
version: "1.2.
|
|
21
|
+
version: "1.2.205",
|
|
22
22
|
scope: ["default"],
|
|
23
23
|
loaded: !1,
|
|
24
24
|
from: "addon_pipeline_analytics_widgets",
|
|
@@ -33,7 +33,7 @@ var e = {
|
|
|
33
33
|
},
|
|
34
34
|
"@camstack/ui-library": {
|
|
35
35
|
name: "@camstack/ui-library",
|
|
36
|
-
version: "1.2.
|
|
36
|
+
version: "1.2.170",
|
|
37
37
|
scope: ["default"],
|
|
38
38
|
loaded: !1,
|
|
39
39
|
from: "addon_pipeline_analytics_widgets",
|
|
@@ -36,7 +36,7 @@ async function r() {
|
|
|
36
36
|
}
|
|
37
37
|
},
|
|
38
38
|
"@camstack/types": {
|
|
39
|
-
version: "1.2.
|
|
39
|
+
version: "1.2.205",
|
|
40
40
|
scope: "default",
|
|
41
41
|
shareConfig: {
|
|
42
42
|
singleton: !0,
|
|
@@ -45,7 +45,7 @@ async function r() {
|
|
|
45
45
|
}
|
|
46
46
|
},
|
|
47
47
|
"@camstack/sdk": {
|
|
48
|
-
version: "1.2.
|
|
48
|
+
version: "1.2.111",
|
|
49
49
|
scope: "default",
|
|
50
50
|
shareConfig: {
|
|
51
51
|
singleton: !0,
|
|
@@ -81,7 +81,7 @@ async function r() {
|
|
|
81
81
|
}
|
|
82
82
|
},
|
|
83
83
|
"@camstack/ui-library": {
|
|
84
|
-
version: "1.2.
|
|
84
|
+
version: "1.2.170",
|
|
85
85
|
scope: "default",
|
|
86
86
|
shareConfig: {
|
|
87
87
|
singleton: !0,
|
|
@@ -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-BKRsf6XY.js");
|
|
6
6
|
let node_fs = require("node:fs");
|
|
7
7
|
node_fs = require_dist.__toESM(node_fs, 1);
|
|
8
8
|
let node_path = require("node:path");
|
|
@@ -36683,6 +36683,21 @@ var TripwireTracker = class {
|
|
|
36683
36683
|
return this.tracks.size;
|
|
36684
36684
|
}
|
|
36685
36685
|
};
|
|
36686
|
+
//#endregion
|
|
36687
|
+
//#region src/pipeline-analytics/pipeline/face-parent-containment.ts
|
|
36688
|
+
/**
|
|
36689
|
+
* `true` when the face belongs to this parent by geometry.
|
|
36690
|
+
*
|
|
36691
|
+
* A degenerate box (zero or negative extent) is NOT contained: an empty
|
|
36692
|
+
* rectangle has no centre worth believing, and treating it as a match would
|
|
36693
|
+
* bind a face to whichever parent happened to be asked first.
|
|
36694
|
+
*/
|
|
36695
|
+
function faceIsInsideParent(face, parent) {
|
|
36696
|
+
if (face.w <= 0 || face.h <= 0 || parent.w <= 0 || parent.h <= 0) return false;
|
|
36697
|
+
const cx = face.x + face.w / 2;
|
|
36698
|
+
const cy = face.y + face.h / 2;
|
|
36699
|
+
return cx >= parent.x && cx <= parent.x + parent.w && cy >= parent.y && cy <= parent.y + parent.h;
|
|
36700
|
+
}
|
|
36686
36701
|
var DEFAULT_ZONE_TRANSITION_CONFIG = {
|
|
36687
36702
|
enterFrames: 2,
|
|
36688
36703
|
exitFrames: 4
|
|
@@ -38659,6 +38674,10 @@ var FrameProcessor = class {
|
|
|
38659
38674
|
refusalsThisFrame = [];
|
|
38660
38675
|
/** Running count of refusals-in-zone SEEN — never the throttled number. */
|
|
38661
38676
|
zoneRefusalEventCount = 0;
|
|
38677
|
+
/** Faces refused because their centre was not in the body they were found
|
|
38678
|
+
* for — the padding reaching into a neighbour. See
|
|
38679
|
+
* `face-parent-containment.ts`. */
|
|
38680
|
+
faceOutsideParentCount = 0;
|
|
38662
38681
|
zoneRefusalObserver = null;
|
|
38663
38682
|
/** Track ids whose BIRTH zone history has already been folded in — the fold
|
|
38664
38683
|
* happens once, on the frame a track first becomes visible. */
|
|
@@ -38887,6 +38906,13 @@ var FrameProcessor = class {
|
|
|
38887
38906
|
zoneRefusalEventsEmitted() {
|
|
38888
38907
|
return this.zoneRefusalEventCount;
|
|
38889
38908
|
}
|
|
38909
|
+
/** How many faces this processor refused for belonging to somebody else.
|
|
38910
|
+
* Zero is the expected reading; a rising one means two people stand close
|
|
38911
|
+
* together on this camera, which is worth knowing per-camera rather than
|
|
38912
|
+
* per-fleet. */
|
|
38913
|
+
facesRefusedOutsideParent() {
|
|
38914
|
+
return this.faceOutsideParentCount;
|
|
38915
|
+
}
|
|
38890
38916
|
reportZoneFiltered(excluded) {
|
|
38891
38917
|
const observer = this.spawnRefusalObserver;
|
|
38892
38918
|
if (!observer || excluded.length === 0) return;
|
|
@@ -38959,6 +38985,15 @@ var FrameProcessor = class {
|
|
|
38959
38985
|
if (det.kind !== "detail" || det.macroClass !== "face" || !det.parentId) continue;
|
|
38960
38986
|
const parentBbox = firstLevelBboxById.get(det.parentId);
|
|
38961
38987
|
if (parentBbox === void 0 || faceBboxByBbox.has(parentBbox)) continue;
|
|
38988
|
+
if (!faceIsInsideParent({
|
|
38989
|
+
x: det.bbox.x,
|
|
38990
|
+
y: det.bbox.y,
|
|
38991
|
+
w: det.bbox.width,
|
|
38992
|
+
h: det.bbox.height
|
|
38993
|
+
}, parentBbox)) {
|
|
38994
|
+
this.faceOutsideParentCount += 1;
|
|
38995
|
+
continue;
|
|
38996
|
+
}
|
|
38962
38997
|
faceBboxByBbox.set(parentBbox, {
|
|
38963
38998
|
x: det.bbox.x,
|
|
38964
38999
|
y: det.bbox.y,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $ as TimelapseRuleSchema, $t as array, A as NcConditionDescriptorSchema, At as readDeviceStateFrom, B as NcTaxonomySchema, Bt as zoneAnalyticsCapability, C as MOTION_CLOSE_AFTER_MS, Ct as mayWriteToLocation, D as NC_DEFAULT_SNOOZE_MINUTES, Dt as pickClusterStepModels, E as NC_CONDITION_CATALOG, F as NcScheduleSchema, Ft as storageOccupancyCapability, Gt as createEvent, Ht as BaseAddon, I as NcSnoozeInputSchema, It as subKindsOf, J as SCENE_DIVERGED, Jt as hydrateSchema, K as SCENE_DEFAULT_ANCHOR_THRESHOLD, Kt as customAction, L as NcSnoozeSchema, Lt as systemEventFilterApplies, M as NcRulePatchSchema, Mt as resolveLocationMode, N as NcRuleSchema, Ot as pipelineAnalyticsCapability, P as NcRuleTargetSchema, Pt as sceneMonitorCapability, Q as TimelapseRulePatchSchema, Qt as _enum, R as NcSnoozeSuppressedSchema, Rt as vectorDimFromBase64, St as kebabToCamel, T as NC_ALARM_SYSTEM_EVENT_KINDS, Tt as occupancyScope, U as RECORDING_EXPORT_MAX_READ_BYTES, Ut as CamProfileSchema, V as OpsLogEntrySchema, Vt as errMsg$1, W as RetrainStatusSchema, Wt as DeviceType, X as TIMELAPSE_DENSE_FLOOR_SEC, Xt as nodePin, Y as SceneMonitorSchema, Yt as isDeviceScopedCap, Z as TimelapseRuleInputSchema, Zt as sleep$1, _ as FULL_IMAGE_BBOX, _t as isDetectionMacroClass, a as CLUSTER_MODEL_SCOPED_STEPS, an as partialRecord, at as audioMetricsCapability, b as MAX_ARCHIVED_DEBUG_NOTES, bt as isScheduleActive, cn as unknown, ct as cosineSimilarity$1, dt as encodeVectorBase64, en as boolean, et as TrackSourceSchema, f as DeclaredDevices, ft as evaluateSensorEdge, g as FIRST_LEVEL_MACRO_CLASSES, h as EVENT_PAD_MS, ht as failureContributionCapability, i as BirthDecisionRecordSchema, in as object, it as assertTimelapseCadences, j as NcRuleInputSchema, jt as readTimelapseGeneratedAt, k as NC_TAXONOMY, kt as plateGalleryCapability, ln as EventCategory, lt as deriveRecordingMode, m as EVENT_OWNER_TYPES, mt as faceGalleryCapability, n as ArchivedDebugNoteSchema, nn as literal, nt as addonWidgetsSourceCapability, o as COCO_TO_MACRO, on as record, ot as audioModeOf, p as EVENT_KIND_BY_CAP, pt as evictionPolicyOfLocation, q as SCENE_DEFAULT_UNCOVERED_POLICY, qt as defineCustomActions, r as BaseDevice, rn as number, rt as alarmPanelCapability, s as DEFAULT_EVENT_COLOR, sn as string, st as buildEventKindDescriptor, t as AUDIO_MACRO_LABELS, tn as discriminatedUnion, tt as VISIT_MERGE_GAP_MS, u as DETECTION_MACRO_CLASSES, v as FailureCounters, vt as isEventOwnerType, w as MediaFileKindEnum, wt as notificationRulesCapability, x as MAX_BIRTH_DECISION_RECORDS, xt as isSourceCap, y as LabelAttributionSchema, yt as isMediaOwnerType, z as NcSystemEventKindSchema, zt as videoclipsCapability } from "../dist-
|
|
1
|
+
import { $ as TimelapseRuleSchema, $t as array, A as NcConditionDescriptorSchema, At as readDeviceStateFrom, B as NcTaxonomySchema, Bt as zoneAnalyticsCapability, C as MOTION_CLOSE_AFTER_MS, Ct as mayWriteToLocation, D as NC_DEFAULT_SNOOZE_MINUTES, Dt as pickClusterStepModels, E as NC_CONDITION_CATALOG, F as NcScheduleSchema, Ft as storageOccupancyCapability, Gt as createEvent, Ht as BaseAddon, I as NcSnoozeInputSchema, It as subKindsOf, J as SCENE_DIVERGED, Jt as hydrateSchema, K as SCENE_DEFAULT_ANCHOR_THRESHOLD, Kt as customAction, L as NcSnoozeSchema, Lt as systemEventFilterApplies, M as NcRulePatchSchema, Mt as resolveLocationMode, N as NcRuleSchema, Ot as pipelineAnalyticsCapability, P as NcRuleTargetSchema, Pt as sceneMonitorCapability, Q as TimelapseRulePatchSchema, Qt as _enum, R as NcSnoozeSuppressedSchema, Rt as vectorDimFromBase64, St as kebabToCamel, T as NC_ALARM_SYSTEM_EVENT_KINDS, Tt as occupancyScope, U as RECORDING_EXPORT_MAX_READ_BYTES, Ut as CamProfileSchema, V as OpsLogEntrySchema, Vt as errMsg$1, W as RetrainStatusSchema, Wt as DeviceType, X as TIMELAPSE_DENSE_FLOOR_SEC, Xt as nodePin, Y as SceneMonitorSchema, Yt as isDeviceScopedCap, Z as TimelapseRuleInputSchema, Zt as sleep$1, _ as FULL_IMAGE_BBOX, _t as isDetectionMacroClass, a as CLUSTER_MODEL_SCOPED_STEPS, an as partialRecord, at as audioMetricsCapability, b as MAX_ARCHIVED_DEBUG_NOTES, bt as isScheduleActive, cn as unknown, ct as cosineSimilarity$1, dt as encodeVectorBase64, en as boolean, et as TrackSourceSchema, f as DeclaredDevices, ft as evaluateSensorEdge, g as FIRST_LEVEL_MACRO_CLASSES, h as EVENT_PAD_MS, ht as failureContributionCapability, i as BirthDecisionRecordSchema, in as object, it as assertTimelapseCadences, j as NcRuleInputSchema, jt as readTimelapseGeneratedAt, k as NC_TAXONOMY, kt as plateGalleryCapability, ln as EventCategory, lt as deriveRecordingMode, m as EVENT_OWNER_TYPES, mt as faceGalleryCapability, n as ArchivedDebugNoteSchema, nn as literal, nt as addonWidgetsSourceCapability, o as COCO_TO_MACRO, on as record, ot as audioModeOf, p as EVENT_KIND_BY_CAP, pt as evictionPolicyOfLocation, q as SCENE_DEFAULT_UNCOVERED_POLICY, qt as defineCustomActions, r as BaseDevice, rn as number, rt as alarmPanelCapability, s as DEFAULT_EVENT_COLOR, sn as string, st as buildEventKindDescriptor, t as AUDIO_MACRO_LABELS, tn as discriminatedUnion, tt as VISIT_MERGE_GAP_MS, u as DETECTION_MACRO_CLASSES, v as FailureCounters, vt as isEventOwnerType, w as MediaFileKindEnum, wt as notificationRulesCapability, x as MAX_BIRTH_DECISION_RECORDS, xt as isSourceCap, y as LabelAttributionSchema, yt as isMediaOwnerType, z as NcSystemEventKindSchema, zt as videoclipsCapability } from "../dist-dL5n2m9M.mjs";
|
|
2
2
|
import { t as __exportAll } from "../embedding-encoder/index.mjs";
|
|
3
3
|
import * as fs from "node:fs";
|
|
4
4
|
import { promises } from "node:fs";
|
|
@@ -36658,6 +36658,21 @@ var TripwireTracker = class {
|
|
|
36658
36658
|
return this.tracks.size;
|
|
36659
36659
|
}
|
|
36660
36660
|
};
|
|
36661
|
+
//#endregion
|
|
36662
|
+
//#region src/pipeline-analytics/pipeline/face-parent-containment.ts
|
|
36663
|
+
/**
|
|
36664
|
+
* `true` when the face belongs to this parent by geometry.
|
|
36665
|
+
*
|
|
36666
|
+
* A degenerate box (zero or negative extent) is NOT contained: an empty
|
|
36667
|
+
* rectangle has no centre worth believing, and treating it as a match would
|
|
36668
|
+
* bind a face to whichever parent happened to be asked first.
|
|
36669
|
+
*/
|
|
36670
|
+
function faceIsInsideParent(face, parent) {
|
|
36671
|
+
if (face.w <= 0 || face.h <= 0 || parent.w <= 0 || parent.h <= 0) return false;
|
|
36672
|
+
const cx = face.x + face.w / 2;
|
|
36673
|
+
const cy = face.y + face.h / 2;
|
|
36674
|
+
return cx >= parent.x && cx <= parent.x + parent.w && cy >= parent.y && cy <= parent.y + parent.h;
|
|
36675
|
+
}
|
|
36661
36676
|
var DEFAULT_ZONE_TRANSITION_CONFIG = {
|
|
36662
36677
|
enterFrames: 2,
|
|
36663
36678
|
exitFrames: 4
|
|
@@ -38634,6 +38649,10 @@ var FrameProcessor = class {
|
|
|
38634
38649
|
refusalsThisFrame = [];
|
|
38635
38650
|
/** Running count of refusals-in-zone SEEN — never the throttled number. */
|
|
38636
38651
|
zoneRefusalEventCount = 0;
|
|
38652
|
+
/** Faces refused because their centre was not in the body they were found
|
|
38653
|
+
* for — the padding reaching into a neighbour. See
|
|
38654
|
+
* `face-parent-containment.ts`. */
|
|
38655
|
+
faceOutsideParentCount = 0;
|
|
38637
38656
|
zoneRefusalObserver = null;
|
|
38638
38657
|
/** Track ids whose BIRTH zone history has already been folded in — the fold
|
|
38639
38658
|
* happens once, on the frame a track first becomes visible. */
|
|
@@ -38862,6 +38881,13 @@ var FrameProcessor = class {
|
|
|
38862
38881
|
zoneRefusalEventsEmitted() {
|
|
38863
38882
|
return this.zoneRefusalEventCount;
|
|
38864
38883
|
}
|
|
38884
|
+
/** How many faces this processor refused for belonging to somebody else.
|
|
38885
|
+
* Zero is the expected reading; a rising one means two people stand close
|
|
38886
|
+
* together on this camera, which is worth knowing per-camera rather than
|
|
38887
|
+
* per-fleet. */
|
|
38888
|
+
facesRefusedOutsideParent() {
|
|
38889
|
+
return this.faceOutsideParentCount;
|
|
38890
|
+
}
|
|
38865
38891
|
reportZoneFiltered(excluded) {
|
|
38866
38892
|
const observer = this.spawnRefusalObserver;
|
|
38867
38893
|
if (!observer || excluded.length === 0) return;
|
|
@@ -38934,6 +38960,15 @@ var FrameProcessor = class {
|
|
|
38934
38960
|
if (det.kind !== "detail" || det.macroClass !== "face" || !det.parentId) continue;
|
|
38935
38961
|
const parentBbox = firstLevelBboxById.get(det.parentId);
|
|
38936
38962
|
if (parentBbox === void 0 || faceBboxByBbox.has(parentBbox)) continue;
|
|
38963
|
+
if (!faceIsInsideParent({
|
|
38964
|
+
x: det.bbox.x,
|
|
38965
|
+
y: det.bbox.y,
|
|
38966
|
+
w: det.bbox.width,
|
|
38967
|
+
h: det.bbox.height
|
|
38968
|
+
}, parentBbox)) {
|
|
38969
|
+
this.faceOutsideParentCount += 1;
|
|
38970
|
+
continue;
|
|
38971
|
+
}
|
|
38937
38972
|
faceBboxByBbox.set(parentBbox, {
|
|
38938
38973
|
x: det.bbox.x,
|
|
38939
38974
|
y: det.bbox.y,
|
|
@@ -30,7 +30,7 @@ async function d(e) {
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
async function f() {
|
|
33
|
-
return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-
|
|
33
|
+
return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-Bg5BCIXu.mjs")).catch((e) => {
|
|
34
34
|
throw l = void 0, e;
|
|
35
35
|
}), l;
|
|
36
36
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-post-analysis",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.255",
|
|
4
4
|
"description": "Post-Analysis bundle — enrichment, embedding-encoder, pipeline-analytics. Multi-entry npm package shipping addons that consume pipeline output.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|