@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.
@@ -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-C1zIwElw.js");
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-DD2IV-TR.mjs";
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.110",
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.204",
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.169",
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.204",
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.110",
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.169",
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-C1zIwElw.js");
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-DD2IV-TR.mjs";
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-CsbWSeev.mjs")).catch((e) => {
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.253",
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",