@camstack/addon-post-analysis 1.2.79 → 1.2.80

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.
@@ -20683,7 +20683,16 @@ targets: array(object({
20683
20683
  /** A sleeping battery camera: the frame is deliberately stale and will
20684
20684
  * NOT refresh in the background. A surface should say so rather than
20685
20685
  * present it as current. */
20686
- sleeping: boolean()
20686
+ sleeping: boolean(),
20687
+ /** Current device state rendered over the cached frame. State images
20688
+ * remain authoritative even when their photographic background is
20689
+ * old; null means the link must carry a current camera frame. */
20690
+ stateReason: _enum([
20691
+ "disabled",
20692
+ "sleeping",
20693
+ "unreachable",
20694
+ "waking"
20695
+ ]).nullable()
20687
20696
  })));
20688
20697
  /**
20689
20698
  * `sso-bridge` — internal hub-only cap that lets SSO-style auth
@@ -20652,7 +20652,16 @@ targets: array(object({
20652
20652
  /** A sleeping battery camera: the frame is deliberately stale and will
20653
20653
  * NOT refresh in the background. A surface should say so rather than
20654
20654
  * present it as current. */
20655
- sleeping: boolean()
20655
+ sleeping: boolean(),
20656
+ /** Current device state rendered over the cached frame. State images
20657
+ * remain authoritative even when their photographic background is
20658
+ * old; null means the link must carry a current camera frame. */
20659
+ stateReason: _enum([
20660
+ "disabled",
20661
+ "sleeping",
20662
+ "unreachable",
20663
+ "waking"
20664
+ ]).nullable()
20656
20665
  })));
20657
20666
  /**
20658
20667
  * `sso-bridge` — internal hub-only cap that lets SSO-style auth
@@ -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-CWoaZE47.js");
5
+ const require_dist = require("../dist-BTbbBBpS.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 { $ as hfModelUrl, X as embeddingEncoderCapability, mt as BaseAddon } from "../dist-D6_m_zg1.mjs";
1
+ import { $ as hfModelUrl, X as embeddingEncoderCapability, mt as BaseAddon } from "../dist-D9Z7czrz.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import * as fs from "node:fs";
4
4
  import "node:fs";
@@ -18,7 +18,7 @@ var e = {
18
18
  },
19
19
  "@camstack/types": {
20
20
  name: "@camstack/types",
21
- version: "1.2.77",
21
+ version: "1.2.78",
22
22
  scope: ["default"],
23
23
  loaded: !1,
24
24
  from: "addon_pipeline_analytics_widgets",
@@ -36,7 +36,7 @@ async function r() {
36
36
  }
37
37
  },
38
38
  "@camstack/types": {
39
- version: "1.2.77",
39
+ version: "1.2.78",
40
40
  scope: "default",
41
41
  shareConfig: {
42
42
  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-CWoaZE47.js");
5
+ const require_dist = require("../dist-BTbbBBpS.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");
@@ -49899,11 +49899,22 @@ var PipelineAnalyticsAddon = class extends require_dist.BaseAddon {
49899
49899
  async onInitialize() {
49900
49900
  const api = this.ctx.api;
49901
49901
  if (!api) throw new Error("pipeline-analytics requires ctx.api (device-manager + settings-store)");
49902
- await this.declareCollections(api);
49903
- await this.declareAlarmPanel(api);
49902
+ const bootT0 = Date.now();
49903
+ const step = async (name, fn) => {
49904
+ const t0 = Date.now();
49905
+ const out = await fn();
49906
+ this.ctx.logger.info("pipeline-analytics boot step", { meta: {
49907
+ step: name,
49908
+ ms: Date.now() - t0,
49909
+ sinceBootMs: Date.now() - bootT0
49910
+ } });
49911
+ return out;
49912
+ };
49913
+ await step("declareCollections", () => this.declareCollections(api));
49914
+ await step("declareAlarmPanel", () => this.declareAlarmPanel(api));
49904
49915
  const logger = this.ctx.logger;
49905
- const storage = await this.resolveMediaStorage(logger);
49906
- const stores = await this.buildStores(api, logger, storage);
49916
+ const storage = await step("resolveMediaStorage", () => this.resolveMediaStorage(logger));
49917
+ const stores = await step("buildStores", () => this.buildStores(api, logger, storage));
49907
49918
  const rawNodeId = this.ctx.kernel.localNodeId ?? this.ctx.id;
49908
49919
  const ownNodeId = rawNodeId.includes("/") ? rawNodeId.split("/")[0] : rawNodeId;
49909
49920
  this.eventsOpsLog = new OpsLogStore({
@@ -49912,7 +49923,7 @@ var PipelineAnalyticsAddon = class extends require_dist.BaseAddon {
49912
49923
  nodeId: ownNodeId
49913
49924
  });
49914
49925
  {
49915
- const designated = await this.postProcessingNodeState.get();
49926
+ const designated = await step("postProcessingNodeState", () => this.postProcessingNodeState.get());
49916
49927
  this.isPostProcessingNode = ownNodeId === designated;
49917
49928
  if (!this.isPostProcessingNode) logger.info("pipeline-analytics INERT on this node — post-processing assigned elsewhere", { meta: {
49918
49929
  ownNodeId,
@@ -49936,8 +49947,8 @@ var PipelineAnalyticsAddon = class extends require_dist.BaseAddon {
49936
49947
  this.buildRecognizers(api, logger, stores, transport);
49937
49948
  this.buildDetailDispatcher(api, logger, transport);
49938
49949
  const capProviders = this.buildAnalyticsProviders(api, logger);
49939
- await this.buildNotificationCenter(api, logger, stores);
49940
- await this.serveEventMediaDataPlane();
49950
+ await step("buildNotificationCenter", () => this.buildNotificationCenter(api, logger, stores));
49951
+ await step("serveEventMediaDataPlane", () => this.serveEventMediaDataPlane());
49941
49952
  this.subscriptionUnsubs = wireSubscriptions({
49942
49953
  eventBus: this.ctx.eventBus,
49943
49954
  isPostProcessingNode: this.isPostProcessingNode,
@@ -49953,11 +49964,11 @@ var PipelineAnalyticsAddon = class extends require_dist.BaseAddon {
49953
49964
  onClusterTopology: (nodes) => this.nodeLiveness.applySnapshot(nodes, Date.now()),
49954
49965
  onSystemEvent: (event) => this.notificationCenter?.onSystemEvent(event)
49955
49966
  });
49956
- if (this.isPostProcessingNode) await this.startEmbeddingDispatcher(logger, transport);
49957
- await this.buildSceneMonitor(api, logger);
49967
+ if (this.isPostProcessingNode) await step("startEmbeddingDispatcher", () => this.startEmbeddingDispatcher(logger, transport));
49968
+ await step("buildSceneMonitor", () => this.buildSceneMonitor(api, logger));
49958
49969
  this.startSweepTimers();
49959
49970
  this.ctx.logger.info("pipeline-analytics subscribers installed");
49960
- const providers = this.buildProviderRegistrations(api, stores, capProviders);
49971
+ const providers = await step("buildProviderRegistrations", () => this.buildProviderRegistrations(api, stores, capProviders));
49961
49972
  const isHub = ownNodeId === "hub";
49962
49973
  const ncHandlers = isHub ? this.buildNcActionHandlers(api) : void 0;
49963
49974
  return {
@@ -50132,26 +50143,30 @@ var PipelineAnalyticsAddon = class extends require_dist.BaseAddon {
50132
50143
  }
50133
50144
  async declareCollections(api) {
50134
50145
  this.settingsStore = api.settingsStore;
50135
- await TrackStore.declare(api.settingsStore);
50136
- await MediaStore.declare(api.settingsStore);
50137
- await EventStore.declare(api.settingsStore);
50138
- await SensorEventStore.declare(api.settingsStore);
50139
- await IdentityStore.declare(api.settingsStore);
50140
- await FaceStore.declare(api.settingsStore);
50141
- await PlateStore.declare(api.settingsStore);
50142
- await VehicleStore.declare(api.settingsStore);
50143
- await StationaryObjectRegistry.declare(api.settingsStore);
50144
- await RetrainFrameStore.declare(api.settingsStore);
50145
- await RetrainAnnotationStore.declare(api.settingsStore);
50146
- await OpsLogStore.declare(api.settingsStore);
50147
- await AnalyticsLts.declare(api.settingsStore);
50148
- await SceneStore.declare(api.settingsStore);
50149
- await NotificationCenter.declare(api.settingsStore);
50150
- await runLabelTierMigration({
50146
+ await Promise.all([
50147
+ TrackStore.declare(api.settingsStore),
50148
+ MediaStore.declare(api.settingsStore),
50149
+ EventStore.declare(api.settingsStore),
50150
+ SensorEventStore.declare(api.settingsStore),
50151
+ IdentityStore.declare(api.settingsStore),
50152
+ FaceStore.declare(api.settingsStore),
50153
+ PlateStore.declare(api.settingsStore),
50154
+ VehicleStore.declare(api.settingsStore),
50155
+ StationaryObjectRegistry.declare(api.settingsStore),
50156
+ RetrainFrameStore.declare(api.settingsStore),
50157
+ RetrainAnnotationStore.declare(api.settingsStore),
50158
+ OpsLogStore.declare(api.settingsStore),
50159
+ AnalyticsLts.declare(api.settingsStore),
50160
+ SceneStore.declare(api.settingsStore),
50161
+ NotificationCenter.declare(api.settingsStore)
50162
+ ]);
50163
+ runLabelTierMigration({
50151
50164
  store: api.settingsStore,
50152
50165
  logger: this.ctx.logger,
50153
50166
  now: () => Date.now()
50154
- }, [TRACKS_COLLECTION, OBJECT_EVENTS_COLLECTION]);
50167
+ }, [TRACKS_COLLECTION, OBJECT_EVENTS_COLLECTION]).catch((err) => {
50168
+ this.ctx.logger.warn("label tier migration failed — will retry next boot", { meta: { error: err instanceof Error ? err.message : String(err) } });
50169
+ });
50155
50170
  }
50156
50171
  /** Event-media storage. By default it uses `ctx.kernel.storage`, rooted at
50157
50172
  * the node data dir (appData) → heavy thumbnail/track-frame churn hammers
@@ -1,4 +1,4 @@
1
- import { At as string, B as addonWidgetsSourceCapability, C as NcSnoozeSchema, Ct as boolean, D as OpsLogEntrySchema, Dt as object, E as NcTaxonomySchema, Et as number, F as TIMELAPSE_DENSE_FLOOR_SEC, G as buildEventKindDescriptor, H as assertTimelapseCadences, I as TimelapseRuleInputSchema, J as defineCustomActions, K as cosineSimilarity$1, L as TimelapseRulePatchSchema, M as SCENE_DEFAULT_UNCOVERED_POLICY, Mt as EventCategory, N as SCENE_DIVERGED, O as RECORDING_EXPORT_MAX_READ_BYTES, Ot as partialRecord, P as SceneMonitorSchema, Q as faceGalleryCapability, R as TimelapseRuleSchema, S as NcSnoozeInputSchema, St as array, T as NcSystemEventKindSchema, Tt as literal, U as audioMetricsCapability, V as alarmPanelCapability, W as audioModeOf, Y as deriveRecordingMode, Z as encodeVectorBase64, _ as NcRuleInputSchema, _t as hydrateSchema, at as plateGalleryCapability, b as NcRuleTargetSchema, bt as sleep, c as EVENT_PAD_MS, ct as sceneMonitorCapability, d as NC_ALARM_SYSTEM_EVENT_KINDS, dt as videoclipsCapability, et as isDetectionMacroClass, f as NC_CONDITION_CATALOG, ft as zoneAnalyticsCapability, g as NcConditionDescriptorSchema, gt as createEvent, h as NC_TAXONOMY, ht as DeviceType, i as DETECTION_MACRO_CLASSES, it as pipelineAnalyticsCapability, j as SCENE_DEFAULT_ANCHOR_THRESHOLD, jt as unknown, k as RetrainStatusSchema, kt as record, l as LabelAttributionSchema, lt as subKindsOf, mt as BaseAddon, n as DEFAULT_EVENT_COLOR, nt as kebabToCamel, o as DeclaredDevices, ot as readDeviceStateFrom, p as NC_DEFAULT_SNOOZE_MINUTES, pt as errMsg, q as customAction, rt as notificationRulesCapability, s as EVENT_KIND_BY_CAP, st as readTimelapseGeneratedAt, t as BaseDevice, tt as isScheduleActive, u as MACRO_LABELS, ut as vectorDimFromBase64, v as NcRulePatchSchema, vt as isDeviceScopedCap, w as NcSnoozeSuppressedSchema, wt as discriminatedUnion, x as NcScheduleSchema, xt as _enum, y as NcRuleSchema, yt as nodePin, z as TrackSourceSchema } from "../dist-D6_m_zg1.mjs";
1
+ import { At as string, B as addonWidgetsSourceCapability, C as NcSnoozeSchema, Ct as boolean, D as OpsLogEntrySchema, Dt as object, E as NcTaxonomySchema, Et as number, F as TIMELAPSE_DENSE_FLOOR_SEC, G as buildEventKindDescriptor, H as assertTimelapseCadences, I as TimelapseRuleInputSchema, J as defineCustomActions, K as cosineSimilarity$1, L as TimelapseRulePatchSchema, M as SCENE_DEFAULT_UNCOVERED_POLICY, Mt as EventCategory, N as SCENE_DIVERGED, O as RECORDING_EXPORT_MAX_READ_BYTES, Ot as partialRecord, P as SceneMonitorSchema, Q as faceGalleryCapability, R as TimelapseRuleSchema, S as NcSnoozeInputSchema, St as array, T as NcSystemEventKindSchema, Tt as literal, U as audioMetricsCapability, V as alarmPanelCapability, W as audioModeOf, Y as deriveRecordingMode, Z as encodeVectorBase64, _ as NcRuleInputSchema, _t as hydrateSchema, at as plateGalleryCapability, b as NcRuleTargetSchema, bt as sleep, c as EVENT_PAD_MS, ct as sceneMonitorCapability, d as NC_ALARM_SYSTEM_EVENT_KINDS, dt as videoclipsCapability, et as isDetectionMacroClass, f as NC_CONDITION_CATALOG, ft as zoneAnalyticsCapability, g as NcConditionDescriptorSchema, gt as createEvent, h as NC_TAXONOMY, ht as DeviceType, i as DETECTION_MACRO_CLASSES, it as pipelineAnalyticsCapability, j as SCENE_DEFAULT_ANCHOR_THRESHOLD, jt as unknown, k as RetrainStatusSchema, kt as record, l as LabelAttributionSchema, lt as subKindsOf, mt as BaseAddon, n as DEFAULT_EVENT_COLOR, nt as kebabToCamel, o as DeclaredDevices, ot as readDeviceStateFrom, p as NC_DEFAULT_SNOOZE_MINUTES, pt as errMsg, q as customAction, rt as notificationRulesCapability, s as EVENT_KIND_BY_CAP, st as readTimelapseGeneratedAt, t as BaseDevice, tt as isScheduleActive, u as MACRO_LABELS, ut as vectorDimFromBase64, v as NcRulePatchSchema, vt as isDeviceScopedCap, w as NcSnoozeSuppressedSchema, wt as discriminatedUnion, x as NcScheduleSchema, xt as _enum, y as NcRuleSchema, yt as nodePin, z as TrackSourceSchema } from "../dist-D9Z7czrz.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";
@@ -49841,11 +49841,22 @@ var PipelineAnalyticsAddon = class extends BaseAddon {
49841
49841
  async onInitialize() {
49842
49842
  const api = this.ctx.api;
49843
49843
  if (!api) throw new Error("pipeline-analytics requires ctx.api (device-manager + settings-store)");
49844
- await this.declareCollections(api);
49845
- await this.declareAlarmPanel(api);
49844
+ const bootT0 = Date.now();
49845
+ const step = async (name, fn) => {
49846
+ const t0 = Date.now();
49847
+ const out = await fn();
49848
+ this.ctx.logger.info("pipeline-analytics boot step", { meta: {
49849
+ step: name,
49850
+ ms: Date.now() - t0,
49851
+ sinceBootMs: Date.now() - bootT0
49852
+ } });
49853
+ return out;
49854
+ };
49855
+ await step("declareCollections", () => this.declareCollections(api));
49856
+ await step("declareAlarmPanel", () => this.declareAlarmPanel(api));
49846
49857
  const logger = this.ctx.logger;
49847
- const storage = await this.resolveMediaStorage(logger);
49848
- const stores = await this.buildStores(api, logger, storage);
49858
+ const storage = await step("resolveMediaStorage", () => this.resolveMediaStorage(logger));
49859
+ const stores = await step("buildStores", () => this.buildStores(api, logger, storage));
49849
49860
  const rawNodeId = this.ctx.kernel.localNodeId ?? this.ctx.id;
49850
49861
  const ownNodeId = rawNodeId.includes("/") ? rawNodeId.split("/")[0] : rawNodeId;
49851
49862
  this.eventsOpsLog = new OpsLogStore({
@@ -49854,7 +49865,7 @@ var PipelineAnalyticsAddon = class extends BaseAddon {
49854
49865
  nodeId: ownNodeId
49855
49866
  });
49856
49867
  {
49857
- const designated = await this.postProcessingNodeState.get();
49868
+ const designated = await step("postProcessingNodeState", () => this.postProcessingNodeState.get());
49858
49869
  this.isPostProcessingNode = ownNodeId === designated;
49859
49870
  if (!this.isPostProcessingNode) logger.info("pipeline-analytics INERT on this node — post-processing assigned elsewhere", { meta: {
49860
49871
  ownNodeId,
@@ -49878,8 +49889,8 @@ var PipelineAnalyticsAddon = class extends BaseAddon {
49878
49889
  this.buildRecognizers(api, logger, stores, transport);
49879
49890
  this.buildDetailDispatcher(api, logger, transport);
49880
49891
  const capProviders = this.buildAnalyticsProviders(api, logger);
49881
- await this.buildNotificationCenter(api, logger, stores);
49882
- await this.serveEventMediaDataPlane();
49892
+ await step("buildNotificationCenter", () => this.buildNotificationCenter(api, logger, stores));
49893
+ await step("serveEventMediaDataPlane", () => this.serveEventMediaDataPlane());
49883
49894
  this.subscriptionUnsubs = wireSubscriptions({
49884
49895
  eventBus: this.ctx.eventBus,
49885
49896
  isPostProcessingNode: this.isPostProcessingNode,
@@ -49895,11 +49906,11 @@ var PipelineAnalyticsAddon = class extends BaseAddon {
49895
49906
  onClusterTopology: (nodes) => this.nodeLiveness.applySnapshot(nodes, Date.now()),
49896
49907
  onSystemEvent: (event) => this.notificationCenter?.onSystemEvent(event)
49897
49908
  });
49898
- if (this.isPostProcessingNode) await this.startEmbeddingDispatcher(logger, transport);
49899
- await this.buildSceneMonitor(api, logger);
49909
+ if (this.isPostProcessingNode) await step("startEmbeddingDispatcher", () => this.startEmbeddingDispatcher(logger, transport));
49910
+ await step("buildSceneMonitor", () => this.buildSceneMonitor(api, logger));
49900
49911
  this.startSweepTimers();
49901
49912
  this.ctx.logger.info("pipeline-analytics subscribers installed");
49902
- const providers = this.buildProviderRegistrations(api, stores, capProviders);
49913
+ const providers = await step("buildProviderRegistrations", () => this.buildProviderRegistrations(api, stores, capProviders));
49903
49914
  const isHub = ownNodeId === "hub";
49904
49915
  const ncHandlers = isHub ? this.buildNcActionHandlers(api) : void 0;
49905
49916
  return {
@@ -50074,26 +50085,30 @@ var PipelineAnalyticsAddon = class extends BaseAddon {
50074
50085
  }
50075
50086
  async declareCollections(api) {
50076
50087
  this.settingsStore = api.settingsStore;
50077
- await TrackStore.declare(api.settingsStore);
50078
- await MediaStore.declare(api.settingsStore);
50079
- await EventStore.declare(api.settingsStore);
50080
- await SensorEventStore.declare(api.settingsStore);
50081
- await IdentityStore.declare(api.settingsStore);
50082
- await FaceStore.declare(api.settingsStore);
50083
- await PlateStore.declare(api.settingsStore);
50084
- await VehicleStore.declare(api.settingsStore);
50085
- await StationaryObjectRegistry.declare(api.settingsStore);
50086
- await RetrainFrameStore.declare(api.settingsStore);
50087
- await RetrainAnnotationStore.declare(api.settingsStore);
50088
- await OpsLogStore.declare(api.settingsStore);
50089
- await AnalyticsLts.declare(api.settingsStore);
50090
- await SceneStore.declare(api.settingsStore);
50091
- await NotificationCenter.declare(api.settingsStore);
50092
- await runLabelTierMigration({
50088
+ await Promise.all([
50089
+ TrackStore.declare(api.settingsStore),
50090
+ MediaStore.declare(api.settingsStore),
50091
+ EventStore.declare(api.settingsStore),
50092
+ SensorEventStore.declare(api.settingsStore),
50093
+ IdentityStore.declare(api.settingsStore),
50094
+ FaceStore.declare(api.settingsStore),
50095
+ PlateStore.declare(api.settingsStore),
50096
+ VehicleStore.declare(api.settingsStore),
50097
+ StationaryObjectRegistry.declare(api.settingsStore),
50098
+ RetrainFrameStore.declare(api.settingsStore),
50099
+ RetrainAnnotationStore.declare(api.settingsStore),
50100
+ OpsLogStore.declare(api.settingsStore),
50101
+ AnalyticsLts.declare(api.settingsStore),
50102
+ SceneStore.declare(api.settingsStore),
50103
+ NotificationCenter.declare(api.settingsStore)
50104
+ ]);
50105
+ runLabelTierMigration({
50093
50106
  store: api.settingsStore,
50094
50107
  logger: this.ctx.logger,
50095
50108
  now: () => Date.now()
50096
- }, [TRACKS_COLLECTION, OBJECT_EVENTS_COLLECTION]);
50109
+ }, [TRACKS_COLLECTION, OBJECT_EVENTS_COLLECTION]).catch((err) => {
50110
+ this.ctx.logger.warn("label tier migration failed — will retry next boot", { meta: { error: err instanceof Error ? err.message : String(err) } });
50111
+ });
50097
50112
  }
50098
50113
  /** Event-media storage. By default it uses `ctx.kernel.storage`, rooted at
50099
50114
  * the node data dir (appData) → heavy thumbnail/track-frame churn hammers
@@ -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-DhzYNXUk.mjs")).catch((e) => {
33
+ return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-DHm8hb9G.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.79",
3
+ "version": "1.2.80",
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",