@camstack/addon-post-analysis 1.2.93 → 1.2.94

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.
@@ -21525,6 +21525,14 @@ var ClipSchema = object({
21525
21525
  endMs: number()
21526
21526
  }),
21527
21527
  /**
21528
+ * Distinct object classes attached to this visit (`person`, `car`, …),
21529
+ * dominant first, capped at {@link MAX_CLIP_LABELS}. The ribbon renders these
21530
+ * instead of the bare kind — "Object" tells the operator nothing a colour bar
21531
+ * did not. Absent (never empty) when the visit attached no classified object
21532
+ * event, so a motion/audio-only visit keeps its kind label.
21533
+ */
21534
+ labels: array(string()).max(3).optional(),
21535
+ /**
21528
21536
  * Lazy thumbnail URL, never inlined.
21529
21537
  *
21530
21538
  * Recording-derived clips (events-mode keep-window, and the prepared
@@ -21494,6 +21494,14 @@ var ClipSchema = object({
21494
21494
  endMs: number()
21495
21495
  }),
21496
21496
  /**
21497
+ * Distinct object classes attached to this visit (`person`, `car`, …),
21498
+ * dominant first, capped at {@link MAX_CLIP_LABELS}. The ribbon renders these
21499
+ * instead of the bare kind — "Object" tells the operator nothing a colour bar
21500
+ * did not. Absent (never empty) when the visit attached no classified object
21501
+ * event, so a motion/audio-only visit keeps its kind label.
21502
+ */
21503
+ labels: array(string()).max(3).optional(),
21504
+ /**
21497
21505
  * Lazy thumbnail URL, never inlined.
21498
21506
  *
21499
21507
  * Recording-derived clips (events-mode keep-window, and the prepared
@@ -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-DYoWeRRt.js");
5
+ const require_dist = require("../dist-BdojoP7i.js");
6
6
  let node_fs = require("node:fs");
7
7
  let node_fs$1 = require_dist.__toESM(node_fs, 1);
8
8
  node_fs = require_dist.__toESM(node_fs);
@@ -1,4 +1,4 @@
1
- import { O as PoolMemoryWatchdog, Q as embeddingEncoderCapability, dt as resolvePoolMemoryPolicy, ot as parseProcStatus, tt as hfModelUrl, yt as BaseAddon } from "../dist-3QRyOemL.mjs";
1
+ import { O as PoolMemoryWatchdog, Q as embeddingEncoderCapability, dt as resolvePoolMemoryPolicy, ot as parseProcStatus, tt as hfModelUrl, yt as BaseAddon } from "../dist-C-_TL-I1.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import * as fs from "node:fs";
4
4
  import "node:fs";
@@ -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.23",
6
+ version: "1.2.24",
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.87",
21
+ version: "1.2.88",
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.59",
36
+ version: "1.2.60",
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.87",
39
+ version: "1.2.88",
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.23",
48
+ version: "1.2.24",
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.59",
84
+ version: "1.2.60",
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-DYoWeRRt.js");
5
+ const require_dist = require("../dist-BdojoP7i.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");
@@ -30047,6 +30047,22 @@ function stillInstantMs(ranges) {
30047
30047
  if (best === void 0) return void 0;
30048
30048
  return Math.floor((best.startMs + best.endMs) / 2);
30049
30049
  }
30050
+ /**
30051
+ * The distinct object classes attached to a visit, most frequent first,
30052
+ * capped at {@link MAX_CLIP_LABELS}. Empty when nothing classified overlapped
30053
+ * — the caller then omits the field so a motion/audio-only visit keeps its
30054
+ * kind label instead of carrying an empty array every consumer length-checks.
30055
+ */
30056
+ function dominantLabels(attached) {
30057
+ const counts = /* @__PURE__ */ new Map();
30058
+ for (const a of attached) {
30059
+ if (a.kind !== "object") continue;
30060
+ const name = a.event.className;
30061
+ if (typeof name !== "string" || name.length === 0) continue;
30062
+ counts.set(name, (counts.get(name) ?? 0) + 1);
30063
+ }
30064
+ return [...counts.entries()].toSorted((x, y) => y[1] - x[1]).slice(0, 3).map(([name]) => name);
30065
+ }
30050
30066
  function visitsToClips(visits, events, pad, vouched) {
30051
30067
  const tagged = [
30052
30068
  ...events.object.map((event) => ({
@@ -30067,6 +30083,7 @@ function visitsToClips(visits, events, pad, vouched) {
30067
30083
  const kind = dominantKind(attached);
30068
30084
  const withThumb = attached.find((a) => a.kind === kind && a.event.mediaUrl && vouched.has(a.event.id)) ?? attached.find((a) => a.event.mediaUrl && vouched.has(a.event.id));
30069
30085
  const stillAtMs = stillInstantMs(visit.ranges);
30086
+ const labels = dominantLabels(attached);
30070
30087
  return {
30071
30088
  id: `analytics:${visit.startMs}:${visit.endMs}:${VISIT_EVENT_ID}`,
30072
30089
  source: "analytics",
@@ -30079,7 +30096,8 @@ function visitsToClips(visits, events, pad, vouched) {
30079
30096
  ...stillAtMs !== void 0 ? { stillAtMs } : {},
30080
30097
  eventIds: attached.slice(0, 24).map((a) => a.event.id),
30081
30098
  eventCount: attached.length,
30082
- holes: [...visit.holes]
30099
+ holes: [...visit.holes],
30100
+ ...labels.length > 0 ? { labels } : {}
30083
30101
  };
30084
30102
  }).toSorted((a, b) => b.timeRange.startMs - a.timeRange.startMs);
30085
30103
  }
@@ -1,4 +1,4 @@
1
- import { $ as encodeVectorBase64, A as RetrainStatusSchema, At as literal, B as TrackSourceSchema, C as NcSnoozeSchema, Ct as isDeviceScopedCap, D as OpsLogEntrySchema, Dt as array, E as NcTaxonomySchema, Et as _enum, F as SceneMonitorSchema, Ft as string, G as audioMetricsCapability, H as addonWidgetsSourceCapability, I as TIMELAPSE_DENSE_FLOOR_SEC, It as unknown, J as cosineSimilarity$1, K as audioModeOf, L as TimelapseRuleInputSchema, Lt as EventCategory, M as SCENE_DEFAULT_ANCHOR_THRESHOLD, Mt as object, N as SCENE_DEFAULT_UNCOVERED_POLICY, Nt as partialRecord, Ot as boolean, P as SCENE_DIVERGED, Pt as record, R as TimelapseRulePatchSchema, S as NcSnoozeInputSchema, St as hydrateSchema, T as NcSystemEventKindSchema, Tt as sleep, U as alarmPanelCapability, V as VISIT_MERGE_GAP_MS, W as assertTimelapseCadences, X as defineCustomActions, Y as customAction, Z as deriveRecordingMode, _ as NcRuleInputSchema, _t as zoneAnalyticsCapability, at as notificationRulesCapability, b as NcRuleTargetSchema, bt as DeviceType, c as EVENT_PAD_MS, ct as plateGalleryCapability, d as NC_ALARM_SYSTEM_EVENT_KINDS, et as faceGalleryCapability, f as NC_CONDITION_CATALOG, ft as sceneMonitorCapability, g as NcConditionDescriptorSchema, gt as videoclipsCapability, h as NC_TAXONOMY, ht as vectorDimFromBase64, i as DETECTION_MACRO_CLASSES, it as kebabToCamel, jt as number, k as RECORDING_EXPORT_MAX_READ_BYTES, kt as discriminatedUnion, l as LabelAttributionSchema, lt as readDeviceStateFrom, mt as systemEventFilterApplies, n as DEFAULT_EVENT_COLOR, nt as isDetectionMacroClass, o as DeclaredDevices, p as NC_DEFAULT_SNOOZE_MINUTES, pt as subKindsOf, q as buildEventKindDescriptor, rt as isScheduleActive, s as EVENT_KIND_BY_CAP, st as pipelineAnalyticsCapability, t as BaseDevice, u as MACRO_LABELS, ut as readTimelapseGeneratedAt, v as NcRulePatchSchema, vt as errMsg, w as NcSnoozeSuppressedSchema, wt as nodePin, x as NcScheduleSchema, xt as createEvent, y as NcRuleSchema, yt as BaseAddon, z as TimelapseRuleSchema } from "../dist-3QRyOemL.mjs";
1
+ import { $ as encodeVectorBase64, A as RetrainStatusSchema, At as literal, B as TrackSourceSchema, C as NcSnoozeSchema, Ct as isDeviceScopedCap, D as OpsLogEntrySchema, Dt as array, E as NcTaxonomySchema, Et as _enum, F as SceneMonitorSchema, Ft as string, G as audioMetricsCapability, H as addonWidgetsSourceCapability, I as TIMELAPSE_DENSE_FLOOR_SEC, It as unknown, J as cosineSimilarity$1, K as audioModeOf, L as TimelapseRuleInputSchema, Lt as EventCategory, M as SCENE_DEFAULT_ANCHOR_THRESHOLD, Mt as object, N as SCENE_DEFAULT_UNCOVERED_POLICY, Nt as partialRecord, Ot as boolean, P as SCENE_DIVERGED, Pt as record, R as TimelapseRulePatchSchema, S as NcSnoozeInputSchema, St as hydrateSchema, T as NcSystemEventKindSchema, Tt as sleep, U as alarmPanelCapability, V as VISIT_MERGE_GAP_MS, W as assertTimelapseCadences, X as defineCustomActions, Y as customAction, Z as deriveRecordingMode, _ as NcRuleInputSchema, _t as zoneAnalyticsCapability, at as notificationRulesCapability, b as NcRuleTargetSchema, bt as DeviceType, c as EVENT_PAD_MS, ct as plateGalleryCapability, d as NC_ALARM_SYSTEM_EVENT_KINDS, et as faceGalleryCapability, f as NC_CONDITION_CATALOG, ft as sceneMonitorCapability, g as NcConditionDescriptorSchema, gt as videoclipsCapability, h as NC_TAXONOMY, ht as vectorDimFromBase64, i as DETECTION_MACRO_CLASSES, it as kebabToCamel, jt as number, k as RECORDING_EXPORT_MAX_READ_BYTES, kt as discriminatedUnion, l as LabelAttributionSchema, lt as readDeviceStateFrom, mt as systemEventFilterApplies, n as DEFAULT_EVENT_COLOR, nt as isDetectionMacroClass, o as DeclaredDevices, p as NC_DEFAULT_SNOOZE_MINUTES, pt as subKindsOf, q as buildEventKindDescriptor, rt as isScheduleActive, s as EVENT_KIND_BY_CAP, st as pipelineAnalyticsCapability, t as BaseDevice, u as MACRO_LABELS, ut as readTimelapseGeneratedAt, v as NcRulePatchSchema, vt as errMsg, w as NcSnoozeSuppressedSchema, wt as nodePin, x as NcScheduleSchema, xt as createEvent, y as NcRuleSchema, yt as BaseAddon, z as TimelapseRuleSchema } from "../dist-C-_TL-I1.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";
@@ -29988,6 +29988,22 @@ function stillInstantMs(ranges) {
29988
29988
  if (best === void 0) return void 0;
29989
29989
  return Math.floor((best.startMs + best.endMs) / 2);
29990
29990
  }
29991
+ /**
29992
+ * The distinct object classes attached to a visit, most frequent first,
29993
+ * capped at {@link MAX_CLIP_LABELS}. Empty when nothing classified overlapped
29994
+ * — the caller then omits the field so a motion/audio-only visit keeps its
29995
+ * kind label instead of carrying an empty array every consumer length-checks.
29996
+ */
29997
+ function dominantLabels(attached) {
29998
+ const counts = /* @__PURE__ */ new Map();
29999
+ for (const a of attached) {
30000
+ if (a.kind !== "object") continue;
30001
+ const name = a.event.className;
30002
+ if (typeof name !== "string" || name.length === 0) continue;
30003
+ counts.set(name, (counts.get(name) ?? 0) + 1);
30004
+ }
30005
+ return [...counts.entries()].toSorted((x, y) => y[1] - x[1]).slice(0, 3).map(([name]) => name);
30006
+ }
29991
30007
  function visitsToClips(visits, events, pad, vouched) {
29992
30008
  const tagged = [
29993
30009
  ...events.object.map((event) => ({
@@ -30008,6 +30024,7 @@ function visitsToClips(visits, events, pad, vouched) {
30008
30024
  const kind = dominantKind(attached);
30009
30025
  const withThumb = attached.find((a) => a.kind === kind && a.event.mediaUrl && vouched.has(a.event.id)) ?? attached.find((a) => a.event.mediaUrl && vouched.has(a.event.id));
30010
30026
  const stillAtMs = stillInstantMs(visit.ranges);
30027
+ const labels = dominantLabels(attached);
30011
30028
  return {
30012
30029
  id: `analytics:${visit.startMs}:${visit.endMs}:${VISIT_EVENT_ID}`,
30013
30030
  source: "analytics",
@@ -30020,7 +30037,8 @@ function visitsToClips(visits, events, pad, vouched) {
30020
30037
  ...stillAtMs !== void 0 ? { stillAtMs } : {},
30021
30038
  eventIds: attached.slice(0, 24).map((a) => a.event.id),
30022
30039
  eventCount: attached.length,
30023
- holes: [...visit.holes]
30040
+ holes: [...visit.holes],
30041
+ ...labels.length > 0 ? { labels } : {}
30024
30042
  };
30025
30043
  }).toSorted((a, b) => b.timeRange.startMs - a.timeRange.startMs);
30026
30044
  }
@@ -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-C4-ljPpt.mjs")).catch((e) => {
33
+ return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-CeFPqm3h.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.93",
3
+ "version": "1.2.94",
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",