@camstack/addon-post-analysis 1.2.200 → 1.2.202

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.
@@ -22106,8 +22106,25 @@ var occupancyRecheckFramesField = {
22106
22106
  * (analyzer attaches detected `regions[]`; onboard does not — the
22107
22107
  * camera typically only reports a binary signal plus an optional
22108
22108
  * channel/AI class which lives in dedicated event channels).
22109
- */
22110
- var MotionSourceEnum = _enum(["onboard", "analyzer"]);
22109
+ *
22110
+ * - `onboard` — the camera's firmware said something moved.
22111
+ * - `analyzer` — this runner's frame-diff said so, and attaches `regions[]`.
22112
+ * - `device-activity` — the DEVICE said it is doing its job: the
22113
+ * `recording-signal` LEVEL the same device raises for the recorder
22114
+ * ([D380](../../../../docs/decisions/adr-0380-a-device-decided-recording-is-a-mode-with-no-schedule-seeded-once.md)),
22115
+ * republished as a motion source. It attaches **nothing** — no regions, no
22116
+ * class: the only fact it carries is that the device is active, and a robot
22117
+ * vacuum that is itself the moving object has no region worth sending. It is
22118
+ * a LEVEL, so unlike `onboard` it has a real falling edge, and unlike
22119
+ * `analyzer` it must not open the frame-diff side-channel — the runner's
22120
+ * `handleOnboardMotionAnalyzer` gate is `source === 'onboard'` and stays that
22121
+ * way ([D392](../../../../docs/decisions/adr-0392-a-device-that-says-it-is-working-is-a-motion-source-of-its-own.md)).
22122
+ */
22123
+ var MotionSourceEnum = _enum([
22124
+ "onboard",
22125
+ "analyzer",
22126
+ "device-activity"
22127
+ ]);
22111
22128
  /**
22112
22129
  * List of motion sources active on a camera. Empty array is valid:
22113
22130
  * "no source" — happens for battery cams without firmware motion when
@@ -22137,8 +22137,25 @@ var occupancyRecheckFramesField = {
22137
22137
  * (analyzer attaches detected `regions[]`; onboard does not — the
22138
22138
  * camera typically only reports a binary signal plus an optional
22139
22139
  * channel/AI class which lives in dedicated event channels).
22140
- */
22141
- var MotionSourceEnum = _enum(["onboard", "analyzer"]);
22140
+ *
22141
+ * - `onboard` — the camera's firmware said something moved.
22142
+ * - `analyzer` — this runner's frame-diff said so, and attaches `regions[]`.
22143
+ * - `device-activity` — the DEVICE said it is doing its job: the
22144
+ * `recording-signal` LEVEL the same device raises for the recorder
22145
+ * ([D380](../../../../docs/decisions/adr-0380-a-device-decided-recording-is-a-mode-with-no-schedule-seeded-once.md)),
22146
+ * republished as a motion source. It attaches **nothing** — no regions, no
22147
+ * class: the only fact it carries is that the device is active, and a robot
22148
+ * vacuum that is itself the moving object has no region worth sending. It is
22149
+ * a LEVEL, so unlike `onboard` it has a real falling edge, and unlike
22150
+ * `analyzer` it must not open the frame-diff side-channel — the runner's
22151
+ * `handleOnboardMotionAnalyzer` gate is `source === 'onboard'` and stays that
22152
+ * way ([D392](../../../../docs/decisions/adr-0392-a-device-that-says-it-is-working-is-a-motion-source-of-its-own.md)).
22153
+ */
22154
+ var MotionSourceEnum = _enum([
22155
+ "onboard",
22156
+ "analyzer",
22157
+ "device-activity"
22158
+ ]);
22142
22159
  /**
22143
22160
  * List of motion sources active on a camera. Empty array is valid:
22144
22161
  * "no source" — happens for battery cams without firmware motion when
@@ -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-fmXXxa9D.js");
5
+ const require_dist = require("../dist-DbgfbjZC.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 { F as PoolMemoryWatchdog, Pt as BaseAddon, Tt as resolvePoolMemoryPolicy, at as embeddingEncoderCapability, dt as hfModelUrl, vt as parseProcStatus } from "../dist-BrszC4uJ.mjs";
1
+ import { F as PoolMemoryWatchdog, Pt as BaseAddon, Tt as resolvePoolMemoryPolicy, at as embeddingEncoderCapability, dt as hfModelUrl, vt as parseProcStatus } from "../dist-1xB8qj2h.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.83",
6
+ version: "1.2.84",
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.163",
21
+ version: "1.2.164",
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.131",
36
+ version: "1.2.132",
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.163",
39
+ version: "1.2.164",
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.83",
48
+ version: "1.2.84",
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.131",
84
+ version: "1.2.132",
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-fmXXxa9D.js");
5
+ const require_dist = require("../dist-DbgfbjZC.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");
@@ -35739,12 +35739,7 @@ var FrameProcessor = class {
35739
35739
  trackId: e.detection.trackId,
35740
35740
  className: e.detection.class,
35741
35741
  confidence: e.detection.score,
35742
- bbox: td ? { ...td.bbox } : {
35743
- x: 0,
35744
- y: 0,
35745
- w: 0,
35746
- h: 0
35747
- },
35742
+ ...td ? { bbox: { ...td.bbox } } : {},
35748
35743
  zones,
35749
35744
  state,
35750
35745
  ...crossing !== void 0 ? { zoneCrossing: crossing } : {},
@@ -71693,6 +71688,15 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends require_dist.B
71693
71688
  if (this.eventMediaDispatcher && frameHandle) {
71694
71689
  const mediaEvents = [...result.objectEvents, ...result.appearanceEvents];
71695
71690
  const childCropsByEvent = buildEventChildCrops(mediaEvents, frame.detections);
71691
+ const uncroppable = mediaEvents.filter((e) => e.bbox === void 0 || e.bbox.w <= 0 || e.bbox.h <= 0);
71692
+ if (uncroppable.length > 0) this.ctx.logger.debug("event media: no crop for events with no box in this frame (a departed track has nothing to cut)", {
71693
+ tags: { deviceId },
71694
+ meta: {
71695
+ events: uncroppable.length,
71696
+ states: [...new Set(uncroppable.map((e) => e.state ?? "unknown"))],
71697
+ zeroArea: uncroppable.filter((e) => e.bbox !== void 0).length
71698
+ }
71699
+ });
71696
71700
  const eventTargets = mediaEvents.filter((e) => e.bbox !== void 0 && e.bbox.w > 0 && e.bbox.h > 0).map((e) => {
71697
71701
  const childCrops = childCropsByEvent.get(e.id);
71698
71702
  return {
@@ -1,4 +1,4 @@
1
- import { $ as audioModeOf, $t as EventCategory, A as NcSnoozeSchema, At as vectorDimFromBase64, B as SCENE_DEFAULT_UNCOVERED_POLICY, Bt as nodePin, C as NcConditionDescriptorSchema, Ct as readTimelapseGeneratedAt, D as NcRuleTargetSchema, Dt as storageOccupancyCapability, E as NcRuleSchema, Et as sceneMonitorCapability, Ft as CamProfileSchema, G as TimelapseRulePatchSchema, Gt as discriminatedUnion, H as SceneMonitorSchema, Ht as _enum, I as RECORDING_EXPORT_MAX_READ_BYTES, It as DeviceType, J as VISIT_MERGE_GAP_MS, Jt as object, K as TimelapseRuleSchema, Kt as literal, L as RetrainStatusSchema, Lt as createEvent, M as NcSystemEventKindSchema, Mt as zoneAnalyticsCapability, N as NcTaxonomySchema, Nt as errMsg$1, O as NcScheduleSchema, Ot as subKindsOf, P as OpsLogEntrySchema, Pt as BaseAddon, Q as audioMetricsCapability, Qt as unknown, Rt as hydrateSchema, S as NC_TAXONOMY, St as readDeviceStateFrom, T as NcRulePatchSchema, U as TIMELAPSE_DENSE_FLOOR_SEC, Ut as array, V as SCENE_DIVERGED, Vt as sleep$1, W as TimelapseRuleInputSchema, Wt as boolean, X as alarmPanelCapability, Xt as record, Y as addonWidgetsSourceCapability, Yt as partialRecord, Z as assertTimelapseCadences, Zt as string, _ as MediaFileKindEnum, _t as notificationRulesCapability, a as DEFAULT_EVENT_COLOR, b as NC_DEFAULT_SNOOZE_MINUTES, bt as pipelineAnalyticsCapability, c as DETECTION_MACRO_CLASSES, ct as evictionPolicyOfLocation, d as EVENT_KIND_BY_CAP, et as buildEventKindDescriptor, f as EVENT_PAD_MS, ft as isDetectionMacroClass, g as MACRO_LABELS, gt as mayWriteToLocation, h as LabelAttributionSchema, ht as kebabToCamel, i as COCO_TO_MACRO, it as deriveRecordingMode, j as NcSnoozeSuppressedSchema, jt as videoclipsCapability, k as NcSnoozeInputSchema, kt as systemEventFilterApplies, lt as faceGalleryCapability, m as FailureCounters, mt as isSourceCap, n as BaseDevice, nt as customAction, ot as encodeVectorBase64, p as FULL_IMAGE_BBOX, pt as isScheduleActive, q as TrackSourceSchema, qt as number, r as CLUSTER_MODEL_SCOPED_STEPS, rt as defineCustomActions, st as evaluateSensorEdge, t as AUDIO_MACRO_LABELS, tt as cosineSimilarity$1, u as DeclaredDevices, ut as failureContributionCapability, v as NC_ALARM_SYSTEM_EVENT_KINDS, w as NcRuleInputSchema, wt as resolveLocationMode, xt as plateGalleryCapability, y as NC_CONDITION_CATALOG, yt as pickClusterStepModels, z as SCENE_DEFAULT_ANCHOR_THRESHOLD, zt as isDeviceScopedCap } from "../dist-BrszC4uJ.mjs";
1
+ import { $ as audioModeOf, $t as EventCategory, A as NcSnoozeSchema, At as vectorDimFromBase64, B as SCENE_DEFAULT_UNCOVERED_POLICY, Bt as nodePin, C as NcConditionDescriptorSchema, Ct as readTimelapseGeneratedAt, D as NcRuleTargetSchema, Dt as storageOccupancyCapability, E as NcRuleSchema, Et as sceneMonitorCapability, Ft as CamProfileSchema, G as TimelapseRulePatchSchema, Gt as discriminatedUnion, H as SceneMonitorSchema, Ht as _enum, I as RECORDING_EXPORT_MAX_READ_BYTES, It as DeviceType, J as VISIT_MERGE_GAP_MS, Jt as object, K as TimelapseRuleSchema, Kt as literal, L as RetrainStatusSchema, Lt as createEvent, M as NcSystemEventKindSchema, Mt as zoneAnalyticsCapability, N as NcTaxonomySchema, Nt as errMsg$1, O as NcScheduleSchema, Ot as subKindsOf, P as OpsLogEntrySchema, Pt as BaseAddon, Q as audioMetricsCapability, Qt as unknown, Rt as hydrateSchema, S as NC_TAXONOMY, St as readDeviceStateFrom, T as NcRulePatchSchema, U as TIMELAPSE_DENSE_FLOOR_SEC, Ut as array, V as SCENE_DIVERGED, Vt as sleep$1, W as TimelapseRuleInputSchema, Wt as boolean, X as alarmPanelCapability, Xt as record, Y as addonWidgetsSourceCapability, Yt as partialRecord, Z as assertTimelapseCadences, Zt as string, _ as MediaFileKindEnum, _t as notificationRulesCapability, a as DEFAULT_EVENT_COLOR, b as NC_DEFAULT_SNOOZE_MINUTES, bt as pipelineAnalyticsCapability, c as DETECTION_MACRO_CLASSES, ct as evictionPolicyOfLocation, d as EVENT_KIND_BY_CAP, et as buildEventKindDescriptor, f as EVENT_PAD_MS, ft as isDetectionMacroClass, g as MACRO_LABELS, gt as mayWriteToLocation, h as LabelAttributionSchema, ht as kebabToCamel, i as COCO_TO_MACRO, it as deriveRecordingMode, j as NcSnoozeSuppressedSchema, jt as videoclipsCapability, k as NcSnoozeInputSchema, kt as systemEventFilterApplies, lt as faceGalleryCapability, m as FailureCounters, mt as isSourceCap, n as BaseDevice, nt as customAction, ot as encodeVectorBase64, p as FULL_IMAGE_BBOX, pt as isScheduleActive, q as TrackSourceSchema, qt as number, r as CLUSTER_MODEL_SCOPED_STEPS, rt as defineCustomActions, st as evaluateSensorEdge, t as AUDIO_MACRO_LABELS, tt as cosineSimilarity$1, u as DeclaredDevices, ut as failureContributionCapability, v as NC_ALARM_SYSTEM_EVENT_KINDS, w as NcRuleInputSchema, wt as resolveLocationMode, xt as plateGalleryCapability, y as NC_CONDITION_CATALOG, yt as pickClusterStepModels, z as SCENE_DEFAULT_ANCHOR_THRESHOLD, zt as isDeviceScopedCap } from "../dist-1xB8qj2h.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";
@@ -35714,12 +35714,7 @@ var FrameProcessor = class {
35714
35714
  trackId: e.detection.trackId,
35715
35715
  className: e.detection.class,
35716
35716
  confidence: e.detection.score,
35717
- bbox: td ? { ...td.bbox } : {
35718
- x: 0,
35719
- y: 0,
35720
- w: 0,
35721
- h: 0
35722
- },
35717
+ ...td ? { bbox: { ...td.bbox } } : {},
35723
35718
  zones,
35724
35719
  state,
35725
35720
  ...crossing !== void 0 ? { zoneCrossing: crossing } : {},
@@ -71619,6 +71614,15 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends BaseAddon {
71619
71614
  if (this.eventMediaDispatcher && frameHandle) {
71620
71615
  const mediaEvents = [...result.objectEvents, ...result.appearanceEvents];
71621
71616
  const childCropsByEvent = buildEventChildCrops(mediaEvents, frame.detections);
71617
+ const uncroppable = mediaEvents.filter((e) => e.bbox === void 0 || e.bbox.w <= 0 || e.bbox.h <= 0);
71618
+ if (uncroppable.length > 0) this.ctx.logger.debug("event media: no crop for events with no box in this frame (a departed track has nothing to cut)", {
71619
+ tags: { deviceId },
71620
+ meta: {
71621
+ events: uncroppable.length,
71622
+ states: [...new Set(uncroppable.map((e) => e.state ?? "unknown"))],
71623
+ zeroArea: uncroppable.filter((e) => e.bbox !== void 0).length
71624
+ }
71625
+ });
71622
71626
  const eventTargets = mediaEvents.filter((e) => e.bbox !== void 0 && e.bbox.w > 0 && e.bbox.h > 0).map((e) => {
71623
71627
  const childCrops = childCropsByEvent.get(e.id);
71624
71628
  return {
@@ -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-CTKbm1Jm.mjs")).catch((e) => {
33
+ return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-DwFi68p5.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.200",
3
+ "version": "1.2.202",
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",