@camstack/addon-post-analysis 1.2.170 → 1.2.171

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.
@@ -20213,7 +20213,20 @@ var RecentTracksQueryInput = object({
20213
20213
  projection: TrackProjectionSchema.optional(),
20214
20214
  /** Include stationary-promoted rows (parked objects). Default false: the
20215
20215
  * feed lists passages; parking records live on the stationary registry. */
20216
- includeStationary: boolean().optional()
20216
+ includeStationary: boolean().optional(),
20217
+ /**
20218
+ * Restrict to these track classes. ABSENT or EMPTY means no filter.
20219
+ *
20220
+ * The same filter `listTracks` takes, because the timeline's class chips must
20221
+ * mean the same thing whether the scope is one camera or twelve. Until this
20222
+ * existed the scoped feed downloaded a page and narrowed it on the phone
20223
+ * while the single-camera path narrowed the read — one filter, two costs.
20224
+ *
20225
+ * A SUPERSET prefilter on `classes[]`, like its single-camera twin: rows
20226
+ * whose class list is unreadable are kept, and the client's rule stays the
20227
+ * exact one.
20228
+ */
20229
+ classes: array(string()).optional()
20217
20230
  });
20218
20231
  var RecentTracksPageSchema = object({
20219
20232
  /** Merged page, ordered by (`lastSeen` DESC, `trackId` DESC). */
@@ -24964,8 +24977,22 @@ var automationControlCapability = {
24964
24977
  * threshold.
24965
24978
  */
24966
24979
  var BatteryStatusSchema = object({
24967
- /** 0..100 inclusive. Firmware-reported. */
24968
- percentage: number().min(0).max(100),
24980
+ /**
24981
+ * 0..100 inclusive, firmware-reported. **`null` means NOT YET KNOWN** — the
24982
+ * provider has registered the capability but no reading has landed.
24983
+ *
24984
+ * It is nullable because it was not, and the only value a provider could
24985
+ * seed with was `0`. A battery camera behind an NVR therefore announced
24986
+ * itself at 0% on every start and corrected itself a moment later, which is
24987
+ * indistinguishable from a real flat battery: it fires the low-battery alert
24988
+ * every time the hub restarts. Unknown is not empty (D315), and on a battery
24989
+ * reading the difference is an alarm.
24990
+ *
24991
+ * `vacuum-control` and `lawn-mower-control` already model it this way.
24992
+ * Consumers must SKIP a null rather than coerce it — `battery-band` already
24993
+ * declines to band a non-finite reading, which is the correct shape.
24994
+ */
24995
+ percentage: number().min(0).max(100).nullable(),
24969
24996
  /**
24970
24997
  * Charging source. `'dc'` covers wall/USB adapters; `'solar'` is
24971
24998
  * Reolink-specific for the Solar Panel 2 accessory (will become
@@ -20182,7 +20182,20 @@ var RecentTracksQueryInput = object({
20182
20182
  projection: TrackProjectionSchema.optional(),
20183
20183
  /** Include stationary-promoted rows (parked objects). Default false: the
20184
20184
  * feed lists passages; parking records live on the stationary registry. */
20185
- includeStationary: boolean().optional()
20185
+ includeStationary: boolean().optional(),
20186
+ /**
20187
+ * Restrict to these track classes. ABSENT or EMPTY means no filter.
20188
+ *
20189
+ * The same filter `listTracks` takes, because the timeline's class chips must
20190
+ * mean the same thing whether the scope is one camera or twelve. Until this
20191
+ * existed the scoped feed downloaded a page and narrowed it on the phone
20192
+ * while the single-camera path narrowed the read — one filter, two costs.
20193
+ *
20194
+ * A SUPERSET prefilter on `classes[]`, like its single-camera twin: rows
20195
+ * whose class list is unreadable are kept, and the client's rule stays the
20196
+ * exact one.
20197
+ */
20198
+ classes: array(string()).optional()
20186
20199
  });
20187
20200
  var RecentTracksPageSchema = object({
20188
20201
  /** Merged page, ordered by (`lastSeen` DESC, `trackId` DESC). */
@@ -24933,8 +24946,22 @@ var automationControlCapability = {
24933
24946
  * threshold.
24934
24947
  */
24935
24948
  var BatteryStatusSchema = object({
24936
- /** 0..100 inclusive. Firmware-reported. */
24937
- percentage: number().min(0).max(100),
24949
+ /**
24950
+ * 0..100 inclusive, firmware-reported. **`null` means NOT YET KNOWN** — the
24951
+ * provider has registered the capability but no reading has landed.
24952
+ *
24953
+ * It is nullable because it was not, and the only value a provider could
24954
+ * seed with was `0`. A battery camera behind an NVR therefore announced
24955
+ * itself at 0% on every start and corrected itself a moment later, which is
24956
+ * indistinguishable from a real flat battery: it fires the low-battery alert
24957
+ * every time the hub restarts. Unknown is not empty (D315), and on a battery
24958
+ * reading the difference is an alarm.
24959
+ *
24960
+ * `vacuum-control` and `lawn-mower-control` already model it this way.
24961
+ * Consumers must SKIP a null rather than coerce it — `battery-band` already
24962
+ * declines to band a non-finite reading, which is the correct shape.
24963
+ */
24964
+ percentage: number().min(0).max(100).nullable(),
24938
24965
  /**
24939
24966
  * Charging source. `'dc'` covers wall/USB adapters; `'solar'` is
24940
24967
  * Reolink-specific for the Solar Panel 2 accessory (will become
@@ -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-DEVmtsZY.js");
5
+ const require_dist = require("../dist-0kEjfSjL.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 { At as BaseAddon, F as PoolMemoryWatchdog, St as resolvePoolMemoryPolicy, at as embeddingEncoderCapability, gt as parseProcStatus, ut as hfModelUrl } from "../dist-DSPOn9Cb.mjs";
1
+ import { At as BaseAddon, F as PoolMemoryWatchdog, St as resolvePoolMemoryPolicy, at as embeddingEncoderCapability, gt as parseProcStatus, ut as hfModelUrl } from "../dist-DZmz2kP-.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.60",
6
+ version: "1.2.61",
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.140",
21
+ version: "1.2.141",
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.106",
36
+ version: "1.2.107",
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.140",
39
+ version: "1.2.141",
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.60",
48
+ version: "1.2.61",
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.106",
84
+ version: "1.2.107",
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-DEVmtsZY.js");
5
+ const require_dist = require("../dist-0kEjfSjL.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");
@@ -40738,11 +40738,13 @@ var TrackStore = class {
40738
40738
  nextCursor: null
40739
40739
  };
40740
40740
  const stationaryExclusion = params.excludeStationaryPromotions === true ? { whereNot: { closedReason: "stationary-promotion" } } : {};
40741
+ const classFilter = params.classes !== void 0 && params.classes.length > 0 ? { whereJsonArrayAny: { classes: [...params.classes] } } : {};
40741
40742
  const fetchRange = async (deviceId, range, pageLimit) => this.store.query.query({
40742
40743
  collection: TRACKS_COLLECTION,
40743
40744
  filter: {
40744
40745
  where: { deviceId },
40745
40746
  ...stationaryExclusion,
40747
+ ...classFilter,
40746
40748
  whereBetween: { lastSeen: range },
40747
40749
  orderBy: {
40748
40750
  field: "lastSeen",
@@ -1,4 +1,4 @@
1
- import { $ as audioModeOf, A as NcSnoozeSchema, At as BaseAddon, B as SCENE_DEFAULT_UNCOVERED_POLICY, Bt as boolean, C as NcConditionDescriptorSchema, Ct as sceneMonitorCapability, D as NcRuleTargetSchema, Dt as videoclipsCapability, E as NcRuleSchema, Et as vectorDimFromBase64, Ft as isDeviceScopedCap, G as TimelapseRulePatchSchema, Gt as partialRecord, H as SceneMonitorSchema, Ht as literal, I as RECORDING_EXPORT_MAX_READ_BYTES, It as nodePin, J as VISIT_MERGE_GAP_MS, Jt as unknown, K as TimelapseRuleSchema, Kt as record, L as RetrainStatusSchema, Lt as sleep$1, M as NcSystemEventKindSchema, Mt as DeviceType, N as NcTaxonomySchema, Nt as createEvent, O as NcScheduleSchema, Ot as zoneAnalyticsCapability, P as OpsLogEntrySchema, Pt as hydrateSchema, Q as audioMetricsCapability, Rt as _enum, S as NC_TAXONOMY, T as NcRulePatchSchema, Tt as systemEventFilterApplies, U as TIMELAPSE_DENSE_FLOOR_SEC, Ut as number, V as SCENE_DIVERGED, Vt as discriminatedUnion, W as TimelapseRuleInputSchema, Wt as object, X as alarmPanelCapability, Y as addonWidgetsSourceCapability, Yt as EventCategory, Z as assertTimelapseCadences, _ as MediaFileKindEnum, _t as pickClusterStepModels, a as DEFAULT_EVENT_COLOR, b as NC_DEFAULT_SNOOZE_MINUTES, bt as readDeviceStateFrom, c as DETECTION_MACRO_CLASSES, ct as faceGalleryCapability, d as EVENT_KIND_BY_CAP, dt as isDetectionMacroClass, et as buildEventKindDescriptor, f as EVENT_PAD_MS, ft as isScheduleActive, g as MACRO_LABELS, h as LabelAttributionSchema, ht as notificationRulesCapability, i as COCO_TO_MACRO, it as deriveRecordingMode, j as NcSnoozeSuppressedSchema, jt as CamProfileSchema, k as NcSnoozeInputSchema, kt as errMsg, lt as failureContributionCapability, m as FailureCounters, mt as kebabToCamel, n as BaseDevice, nt as customAction, ot as encodeVectorBase64, p as FULL_IMAGE_BBOX, pt as isSourceCap, q as TrackSourceSchema, qt as string, r as CLUSTER_MODEL_SCOPED_STEPS, rt as defineCustomActions, st as evaluateSensorEdge, t as AUDIO_MACRO_LABELS, tt as cosineSimilarity$1, u as DeclaredDevices, v as NC_ALARM_SYSTEM_EVENT_KINDS, vt as pipelineAnalyticsCapability, w as NcRuleInputSchema, wt as subKindsOf, xt as readTimelapseGeneratedAt, y as NC_CONDITION_CATALOG, yt as plateGalleryCapability, z as SCENE_DEFAULT_ANCHOR_THRESHOLD, zt as array } from "../dist-DSPOn9Cb.mjs";
1
+ import { $ as audioModeOf, A as NcSnoozeSchema, At as BaseAddon, B as SCENE_DEFAULT_UNCOVERED_POLICY, Bt as boolean, C as NcConditionDescriptorSchema, Ct as sceneMonitorCapability, D as NcRuleTargetSchema, Dt as videoclipsCapability, E as NcRuleSchema, Et as vectorDimFromBase64, Ft as isDeviceScopedCap, G as TimelapseRulePatchSchema, Gt as partialRecord, H as SceneMonitorSchema, Ht as literal, I as RECORDING_EXPORT_MAX_READ_BYTES, It as nodePin, J as VISIT_MERGE_GAP_MS, Jt as unknown, K as TimelapseRuleSchema, Kt as record, L as RetrainStatusSchema, Lt as sleep$1, M as NcSystemEventKindSchema, Mt as DeviceType, N as NcTaxonomySchema, Nt as createEvent, O as NcScheduleSchema, Ot as zoneAnalyticsCapability, P as OpsLogEntrySchema, Pt as hydrateSchema, Q as audioMetricsCapability, Rt as _enum, S as NC_TAXONOMY, T as NcRulePatchSchema, Tt as systemEventFilterApplies, U as TIMELAPSE_DENSE_FLOOR_SEC, Ut as number, V as SCENE_DIVERGED, Vt as discriminatedUnion, W as TimelapseRuleInputSchema, Wt as object, X as alarmPanelCapability, Y as addonWidgetsSourceCapability, Yt as EventCategory, Z as assertTimelapseCadences, _ as MediaFileKindEnum, _t as pickClusterStepModels, a as DEFAULT_EVENT_COLOR, b as NC_DEFAULT_SNOOZE_MINUTES, bt as readDeviceStateFrom, c as DETECTION_MACRO_CLASSES, ct as faceGalleryCapability, d as EVENT_KIND_BY_CAP, dt as isDetectionMacroClass, et as buildEventKindDescriptor, f as EVENT_PAD_MS, ft as isScheduleActive, g as MACRO_LABELS, h as LabelAttributionSchema, ht as notificationRulesCapability, i as COCO_TO_MACRO, it as deriveRecordingMode, j as NcSnoozeSuppressedSchema, jt as CamProfileSchema, k as NcSnoozeInputSchema, kt as errMsg, lt as failureContributionCapability, m as FailureCounters, mt as kebabToCamel, n as BaseDevice, nt as customAction, ot as encodeVectorBase64, p as FULL_IMAGE_BBOX, pt as isSourceCap, q as TrackSourceSchema, qt as string, r as CLUSTER_MODEL_SCOPED_STEPS, rt as defineCustomActions, st as evaluateSensorEdge, t as AUDIO_MACRO_LABELS, tt as cosineSimilarity$1, u as DeclaredDevices, v as NC_ALARM_SYSTEM_EVENT_KINDS, vt as pipelineAnalyticsCapability, w as NcRuleInputSchema, wt as subKindsOf, xt as readTimelapseGeneratedAt, y as NC_CONDITION_CATALOG, yt as plateGalleryCapability, z as SCENE_DEFAULT_ANCHOR_THRESHOLD, zt as array } from "../dist-DZmz2kP-.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";
@@ -40713,11 +40713,13 @@ var TrackStore = class {
40713
40713
  nextCursor: null
40714
40714
  };
40715
40715
  const stationaryExclusion = params.excludeStationaryPromotions === true ? { whereNot: { closedReason: "stationary-promotion" } } : {};
40716
+ const classFilter = params.classes !== void 0 && params.classes.length > 0 ? { whereJsonArrayAny: { classes: [...params.classes] } } : {};
40716
40717
  const fetchRange = async (deviceId, range, pageLimit) => this.store.query.query({
40717
40718
  collection: TRACKS_COLLECTION,
40718
40719
  filter: {
40719
40720
  where: { deviceId },
40720
40721
  ...stationaryExclusion,
40722
+ ...classFilter,
40721
40723
  whereBetween: { lastSeen: range },
40722
40724
  orderBy: {
40723
40725
  field: "lastSeen",
@@ -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-DQYIAs-M.mjs")).catch((e) => {
33
+ return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-Bb93NF26.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.170",
3
+ "version": "1.2.171",
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",