@camstack/system 1.2.231 → 1.2.233

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.
Files changed (62) hide show
  1. package/dist/addon-runner.js +1 -1
  2. package/dist/addon-runner.mjs +1 -1
  3. package/dist/addon-utils.d.ts +1 -0
  4. package/dist/addon-utils.js +6 -1
  5. package/dist/addon-utils.mjs +3 -2
  6. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
  7. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
  8. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
  9. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
  10. package/dist/builtins/alerts/alerts.addon.js +1 -1
  11. package/dist/builtins/alerts/alerts.addon.mjs +1 -1
  12. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +17 -1
  13. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +17 -1
  14. package/dist/builtins/console-logging/index.js +1 -1
  15. package/dist/builtins/console-logging/index.mjs +1 -1
  16. package/dist/builtins/core-blocks/core-blocks.addon.js +1 -1
  17. package/dist/builtins/core-blocks/core-blocks.addon.mjs +1 -1
  18. package/dist/builtins/device-manager/device-config-contribution.d.ts +1 -0
  19. package/dist/builtins/device-manager/device-manager.addon.js +46 -3
  20. package/dist/builtins/device-manager/device-manager.addon.mjs +46 -3
  21. package/dist/builtins/device-manager/native-object-detection-config-schema.d.ts +3 -0
  22. package/dist/builtins/doorbell/virtual-doorbell.addon.js +1 -1
  23. package/dist/builtins/doorbell/virtual-doorbell.addon.mjs +1 -1
  24. package/dist/builtins/hub-forwarder/index.js +1 -1
  25. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  26. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  27. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  28. package/dist/builtins/local-auth/local-auth.addon.js +1 -1
  29. package/dist/builtins/local-auth/local-auth.addon.mjs +1 -1
  30. package/dist/builtins/local-network/local-network.addon.js +1 -1
  31. package/dist/builtins/local-network/local-network.addon.mjs +1 -1
  32. package/dist/builtins/loki-logging/index.js +1 -1
  33. package/dist/builtins/loki-logging/index.mjs +1 -1
  34. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  35. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  36. package/dist/builtins/platform-probe/index.js +1 -1
  37. package/dist/builtins/platform-probe/index.mjs +1 -1
  38. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  39. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  40. package/dist/builtins/snapshot/index.js +5 -140
  41. package/dist/builtins/snapshot/index.mjs +2 -137
  42. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  43. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  44. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +0 -0
  45. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +0 -0
  46. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
  47. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
  48. package/dist/builtins/system-config/system-config.addon.js +1 -1
  49. package/dist/builtins/system-config/system-config.addon.mjs +1 -1
  50. package/dist/builtins/winston-logging/index.js +1 -1
  51. package/dist/builtins/winston-logging/index.mjs +1 -1
  52. package/dist/{custom-action-registry-CM03Xda0.mjs → custom-action-registry-CFHYDHAu.mjs} +1 -1
  53. package/dist/{custom-action-registry-DAFhWd0h.js → custom-action-registry-CWFK5UDj.js} +1 -1
  54. package/dist/{dist-Zhe9cTnK.mjs → dist-BIvXRexm.mjs} +291 -18
  55. package/dist/{dist-DUSfUAgz.js → dist-D3lJV9M7.js} +291 -18
  56. package/dist/index.js +2 -2
  57. package/dist/index.mjs +2 -2
  58. package/dist/{retired-settings-keys-BK_geSOq.mjs → retired-settings-keys-CV3ZLGnJ.mjs} +1 -1
  59. package/dist/{retired-settings-keys-D61PxN8L.js → retired-settings-keys-YPsd2Exa.js} +1 -1
  60. package/dist/snapshot-courtesy-LoJNgHHZ.mjs +140 -0
  61. package/dist/snapshot-courtesy-oeTWCXPv.js +165 -0
  62. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  const require_chunk = require("./chunk-Cek0wNdY.js");
2
2
  const require_manifest_system_deps = require("./manifest-system-deps-CrSP0Kkp.js");
3
- const require_custom_action_registry = require("./custom-action-registry-DAFhWd0h.js");
3
+ const require_custom_action_registry = require("./custom-action-registry-CWFK5UDj.js");
4
4
  let node_path = require("node:path");
5
5
  node_path = require_chunk.__toESM(node_path);
6
6
  let node_fs = require("node:fs");
@@ -1,5 +1,5 @@
1
1
  import { A as createUdsLoggerWithControl, It as RUNNER_RSS_BUDGET_ENV, L as LocalChildClient, Yt as startRunnerHeapWatch, a as createUdsAddonContext, bt as resolveAddonClass, it as setWorkerNativeCapsChangeListener, n as installManifestPythonDeps, nt as getWorkerNativeCapSnapshot, ot as validateProviderRegistrations, sn as emitHeapDiagnosticReport, t as installManifestSystemDeps, tt as getWorkerNativeCapProvider, yt as installManifestNativeDeps } from "./manifest-system-deps-BEj9Dpu1.mjs";
2
- import { t as CustomActionRegistry } from "./custom-action-registry-CM03Xda0.mjs";
2
+ import { t as CustomActionRegistry } from "./custom-action-registry-CFHYDHAu.mjs";
3
3
  import { register } from "node:module";
4
4
  import * as path$1 from "node:path";
5
5
  import * as fs from "node:fs";
@@ -20,3 +20,4 @@ export { createFileDataPlaneHandler } from './http/file-data-plane.js';
20
20
  export { parseRangeHeader, contentTypeFor, type ByteRange, } from './http/authenticated-file-server.js';
21
21
  export { CustomActionRegistry } from './kernel/custom-action-registry.js';
22
22
  export { attributeStall, STALL_REPORT_MS, STALL_TICK_MS, startEventLoopStallMonitor, type StallVerdict, } from './kernel/event-loop-stall-monitor.js';
23
+ export { renderCourtesyJpeg, renderCourtesyOverlayJpeg, courtesyCacheKey, COURTESY_DEFAULT_WIDTH, type CourtesyReason, type CourtesyFrameSpec, } from './builtins/snapshot/snapshot-courtesy.js';
@@ -1,7 +1,9 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("./chunk-Cek0wNdY.js");
3
3
  const require_event_loop_stall_monitor = require("./event-loop-stall-monitor-CAsHdMwP.js");
4
- const require_custom_action_registry = require("./custom-action-registry-DAFhWd0h.js");
4
+ const require_custom_action_registry = require("./custom-action-registry-CWFK5UDj.js");
5
+ const require_snapshot_courtesy = require("./snapshot-courtesy-oeTWCXPv.js");
6
+ exports.COURTESY_DEFAULT_WIDTH = require_snapshot_courtesy.COURTESY_DEFAULT_WIDTH;
5
7
  exports.CustomActionRegistry = require_custom_action_registry.CustomActionRegistry;
6
8
  exports.ModelDownloadService = require_event_loop_stall_monitor.ModelDownloadService;
7
9
  exports.STALL_REPORT_MS = require_event_loop_stall_monitor.STALL_REPORT_MS;
@@ -9,6 +11,7 @@ exports.STALL_TICK_MS = require_event_loop_stall_monitor.STALL_TICK_MS;
9
11
  exports.attributeStall = require_event_loop_stall_monitor.attributeStall;
10
12
  exports.collectModelFiles = require_event_loop_stall_monitor.collectModelFiles;
11
13
  exports.contentTypeFor = require_event_loop_stall_monitor.contentTypeFor;
14
+ exports.courtesyCacheKey = require_snapshot_courtesy.courtesyCacheKey;
12
15
  exports.createFileDataPlaneHandler = require_event_loop_stall_monitor.createFileDataPlaneHandler;
13
16
  exports.deleteModelFromDisk = require_event_loop_stall_monitor.deleteModelFromDisk;
14
17
  exports.downloadFile = require_event_loop_stall_monitor.downloadFile;
@@ -16,4 +19,6 @@ exports.ensureModel = require_event_loop_stall_monitor.ensureModel;
16
19
  exports.getModelFilePath = require_event_loop_stall_monitor.getModelFilePath;
17
20
  exports.isModelDownloaded = require_event_loop_stall_monitor.isModelDownloaded;
18
21
  exports.parseRangeHeader = require_event_loop_stall_monitor.parseRangeHeader;
22
+ exports.renderCourtesyJpeg = require_snapshot_courtesy.renderCourtesyJpeg;
23
+ exports.renderCourtesyOverlayJpeg = require_snapshot_courtesy.renderCourtesyOverlayJpeg;
19
24
  exports.startEventLoopStallMonitor = require_event_loop_stall_monitor.startEventLoopStallMonitor;
@@ -1,3 +1,4 @@
1
1
  import { a as createFileDataPlaneHandler, c as parseRangeHeader, d as ModelDownloadService, f as collectModelFiles, g as ensureModel, i as startEventLoopStallMonitor, m as downloadFile, n as STALL_TICK_MS, o as contentTypeFor, p as deleteModelFromDisk, r as attributeStall, t as STALL_REPORT_MS, v as getModelFilePath, y as isModelDownloaded } from "./event-loop-stall-monitor-GPrVvx14.mjs";
2
- import { t as CustomActionRegistry } from "./custom-action-registry-CM03Xda0.mjs";
3
- export { CustomActionRegistry, ModelDownloadService, STALL_REPORT_MS, STALL_TICK_MS, attributeStall, collectModelFiles, contentTypeFor, createFileDataPlaneHandler, deleteModelFromDisk, downloadFile, ensureModel, getModelFilePath, isModelDownloaded, parseRangeHeader, startEventLoopStallMonitor };
2
+ import { t as CustomActionRegistry } from "./custom-action-registry-CFHYDHAu.mjs";
3
+ import { i as renderCourtesyOverlayJpeg, n as courtesyCacheKey, r as renderCourtesyJpeg, t as COURTESY_DEFAULT_WIDTH } from "./snapshot-courtesy-LoJNgHHZ.mjs";
4
+ export { COURTESY_DEFAULT_WIDTH, CustomActionRegistry, ModelDownloadService, STALL_REPORT_MS, STALL_TICK_MS, attributeStall, collectModelFiles, contentTypeFor, courtesyCacheKey, createFileDataPlaneHandler, deleteModelFromDisk, downloadFile, ensureModel, getModelFilePath, isModelDownloaded, parseRangeHeader, renderCourtesyJpeg, renderCourtesyOverlayJpeg, startEventLoopStallMonitor };
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DUSfUAgz.js");
6
+ const require_dist = require("../../dist-D3lJV9M7.js");
7
7
  const require_settle_sources = require("../../settle-sources-Bhsy57y-.js");
8
8
  let node_crypto = require("node:crypto");
9
9
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { Jt as errMsg, Yt as BaseAddon, k as addonPagesCapability, xn as EventCategory } from "../../dist-Zhe9cTnK.mjs";
1
+ import { Jt as errMsg, Yt as BaseAddon, k as addonPagesCapability, xn as EventCategory } from "../../dist-BIvXRexm.mjs";
2
2
  import { t as settleSourcesWithTimeout } from "../../settle-sources-CDtNC8ub.mjs";
3
3
  import { createHash, randomUUID } from "node:crypto";
4
4
  import * as path$1 from "node:path";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DUSfUAgz.js");
6
+ const require_dist = require("../../dist-D3lJV9M7.js");
7
7
  const require_settle_sources = require("../../settle-sources-Bhsy57y-.js");
8
8
  let node_crypto = require("node:crypto");
9
9
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { Jt as errMsg, Yt as BaseAddon, j as addonWidgetsCapability, xn as EventCategory } from "../../dist-Zhe9cTnK.mjs";
1
+ import { Jt as errMsg, Yt as BaseAddon, j as addonWidgetsCapability, xn as EventCategory } from "../../dist-BIvXRexm.mjs";
2
2
  import { t as settleSourcesWithTimeout } from "../../settle-sources-CDtNC8ub.mjs";
3
3
  import { createHash, randomUUID } from "node:crypto";
4
4
  import * as path$1 from "node:path";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DUSfUAgz.js");
6
+ const require_dist = require("../../dist-D3lJV9M7.js");
7
7
  //#region src/builtins/alerts/prune-policy.ts
8
8
  /**
9
9
  * Ids older than `cutoffMs`, oldest first.
@@ -1,4 +1,4 @@
1
- import { Jt as errMsg, M as alertsCapability, Yt as BaseAddon, cn as createEvent, n as AlertSchema, xn as EventCategory } from "../../dist-Zhe9cTnK.mjs";
1
+ import { Jt as errMsg, M as alertsCapability, Yt as BaseAddon, cn as createEvent, n as AlertSchema, xn as EventCategory } from "../../dist-BIvXRexm.mjs";
2
2
  //#region src/builtins/alerts/prune-policy.ts
3
3
  /**
4
4
  * Ids older than `cutoffMs`, oldest first.
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DUSfUAgz.js");
6
+ const require_dist = require("../../dist-D3lJV9M7.js");
7
7
  let node_crypto = require("node:crypto");
8
8
  let buffer = require("buffer");
9
9
  let node_fs_promises = require("node:fs/promises");
@@ -5849,6 +5849,22 @@ var BackupOrchestratorAddon = class extends require_dist.BaseAddon {
5849
5849
  await this.recordDestinationOutcome(dest.id, Date.now(), message);
5850
5850
  }
5851
5851
  }
5852
+ this.ctx.eventBus.emit({
5853
+ id: (0, node_crypto.randomUUID)(),
5854
+ timestamp: /* @__PURE__ */ new Date(),
5855
+ source: {
5856
+ type: "addon",
5857
+ id: "backup-orchestrator"
5858
+ },
5859
+ category: require_dist.EventCategory.BackupRunCompleted,
5860
+ data: {
5861
+ destinationsOk: entries.length,
5862
+ destinationsFailed: Math.max(0, targets.length - entries.length),
5863
+ destinationsTotal: targets.length,
5864
+ sizeMB: Math.round(entries.reduce((acc, e) => acc + (e.sizeBytes ?? 0), 0) / (1024 * 1024)),
5865
+ ...entries[0]?.id === void 0 ? {} : { backupId: entries[0].id }
5866
+ }
5867
+ });
5852
5868
  return entries;
5853
5869
  } finally {
5854
5870
  try {
@@ -1,4 +1,4 @@
1
- import { P as backupCapability, Vt as storageOccupancyCapability, Yt as BaseAddon, bt as mayWriteToLocation, xn as EventCategory } from "../../dist-Zhe9cTnK.mjs";
1
+ import { P as backupCapability, Vt as storageOccupancyCapability, Yt as BaseAddon, bt as mayWriteToLocation, xn as EventCategory } from "../../dist-BIvXRexm.mjs";
2
2
  import { randomBytes, randomUUID } from "node:crypto";
3
3
  import { Buffer as Buffer$1 } from "buffer";
4
4
  import * as fsp from "node:fs/promises";
@@ -5834,6 +5834,22 @@ var BackupOrchestratorAddon = class extends BaseAddon {
5834
5834
  await this.recordDestinationOutcome(dest.id, Date.now(), message);
5835
5835
  }
5836
5836
  }
5837
+ this.ctx.eventBus.emit({
5838
+ id: randomUUID(),
5839
+ timestamp: /* @__PURE__ */ new Date(),
5840
+ source: {
5841
+ type: "addon",
5842
+ id: "backup-orchestrator"
5843
+ },
5844
+ category: EventCategory.BackupRunCompleted,
5845
+ data: {
5846
+ destinationsOk: entries.length,
5847
+ destinationsFailed: Math.max(0, targets.length - entries.length),
5848
+ destinationsTotal: targets.length,
5849
+ sizeMB: Math.round(entries.reduce((acc, e) => acc + (e.sizeBytes ?? 0), 0) / (1024 * 1024)),
5850
+ ...entries[0]?.id === void 0 ? {} : { backupId: entries[0].id }
5851
+ }
5852
+ });
5837
5853
  return entries;
5838
5854
  } finally {
5839
5855
  try {
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DUSfUAgz.js");
6
+ const require_dist = require("../../dist-D3lJV9M7.js");
7
7
  const require_formatter = require("../../formatter-DqAKDlvN.js");
8
8
  //#region src/builtins/console-logging/console-destination.ts
9
9
  var LEVEL_RANK = {
@@ -1,4 +1,4 @@
1
- import { Yt as BaseAddon, gt as logDestinationCapability } from "../../dist-Zhe9cTnK.mjs";
1
+ import { Yt as BaseAddon, gt as logDestinationCapability } from "../../dist-BIvXRexm.mjs";
2
2
  import { t as formatLogLine } from "../../formatter-B7qW8bPJ.mjs";
3
3
  //#region src/builtins/console-logging/console-destination.ts
4
4
  var LEVEL_RANK = {
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_chunk = require("../../chunk-Cek0wNdY.js");
3
- const require_dist = require("../../dist-DUSfUAgz.js");
3
+ const require_dist = require("../../dist-D3lJV9M7.js");
4
4
  let node_crypto = require("node:crypto");
5
5
  let node_fs_promises = require("node:fs/promises");
6
6
  node_fs_promises = require_chunk.__toESM(node_fs_promises);
@@ -1,4 +1,4 @@
1
- import { B as coreBlockIdFromAddonId, Jt as errMsg, V as coreBlocksCapability, Yt as BaseAddon, c as CORE_BLOCK_ADDON_PREFIX, d as DeclaredDevices, l as CoreBlockSchema, s as CORE_BLOCKS_ADDON_ID, z as coreBlockAddonId } from "../../dist-Zhe9cTnK.mjs";
1
+ import { B as coreBlockIdFromAddonId, Jt as errMsg, V as coreBlocksCapability, Yt as BaseAddon, c as CORE_BLOCK_ADDON_PREFIX, d as DeclaredDevices, l as CoreBlockSchema, s as CORE_BLOCKS_ADDON_ID, z as coreBlockAddonId } from "../../dist-BIvXRexm.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import * as fs from "node:fs/promises";
4
4
  import * as path$1 from "node:path";
@@ -23,6 +23,7 @@ export type ProfileSetter = (profile: StreamProfile, patch: StreamProfilePatch)
23
23
  export declare const STREAM_PARAMS_BUILDER_ID: "stream-params";
24
24
  export declare const DAY_NIGHT_BUILDER_ID: "day-night";
25
25
  export declare const IMAGE_SETTINGS_BUILDER_ID: "image-settings";
26
+ export declare const NATIVE_OBJECT_DETECTION_BUILDER_ID: "native-object-detection";
26
27
  /**
27
28
  * Build the device-detail form section for a `derived-form` device-config
28
29
  * cap. Returns null when the camera exposes no configurable property.
@@ -3,8 +3,8 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DUSfUAgz.js");
7
- const require_retired_settings_keys = require("../../retired-settings-keys-D61PxN8L.js");
6
+ const require_dist = require("../../dist-D3lJV9M7.js");
7
+ const require_retired_settings_keys = require("../../retired-settings-keys-YPsd2Exa.js");
8
8
  let node_crypto = require("node:crypto");
9
9
  let _camstack_types_node = require("@camstack/types/node");
10
10
  //#region src/builtins/device-manager/adoption-job-engine.ts
@@ -1130,6 +1130,42 @@ function parseImageSettingsFormPatch(patch) {
1130
1130
  return out;
1131
1131
  }
1132
1132
  //#endregion
1133
+ //#region src/builtins/device-manager/native-object-detection-config-schema.ts
1134
+ /**
1135
+ * What the toggle buys, per geometry. Written out rather than computed: the
1136
+ * `flag-only` sentence is the one an operator needs BEFORE flipping the switch,
1137
+ * and a generic "may not be supported" would not have said it.
1138
+ */
1139
+ var GEOMETRY_HELP = {
1140
+ boxed: "This camera ships a bounding box with each detection, so the pipeline tracks it as a subject: it gets a track, a best shot and the notification rules that address onboard detections.",
1141
+ "flag-only": "This camera ships the class with no bounding box — on Reolink that is every battery camera, because the boxes ride a sub-stream a battery camera never attaches. Turning this on makes the detections reach the tracker as motion and no further; it will not produce tracked subjects."
1142
+ };
1143
+ function buildNativeObjectDetectionConfigSchema(options, status) {
1144
+ if (options.supportedClasses.length === 0) return null;
1145
+ const fields = [{
1146
+ type: "boolean",
1147
+ key: "nativeObjectDetection_enabled",
1148
+ label: "Forward onboard AI detections",
1149
+ default: status?.enabled ?? false
1150
+ }];
1151
+ return { sections: [{
1152
+ id: "native-object-detection",
1153
+ tab: "motion",
1154
+ title: "Onboard AI detections",
1155
+ description: `${GEOMETRY_HELP[options.geometry]} Detected by this firmware: ${options.supportedClasses.join(", ")}.`,
1156
+ columns: 1,
1157
+ fields
1158
+ }] };
1159
+ }
1160
+ function parseNativeObjectDetectionFormPatch(patch) {
1161
+ const out = {};
1162
+ if ("nativeObjectDetection_enabled" in patch) {
1163
+ const value = patch.nativeObjectDetection_enabled;
1164
+ if (typeof value === "boolean") out.enabled = value;
1165
+ }
1166
+ return out;
1167
+ }
1168
+ //#endregion
1133
1169
  //#region src/builtins/device-manager/device-config-contribution.ts
1134
1170
  /**
1135
1171
  * D14 device-config archetype — framework-side contribution derivation.
@@ -1157,6 +1193,7 @@ function parseImageSettingsFormPatch(patch) {
1157
1193
  var STREAM_PARAMS_BUILDER_ID = "stream-params";
1158
1194
  var DAY_NIGHT_BUILDER_ID = "day-night";
1159
1195
  var IMAGE_SETTINGS_BUILDER_ID = "image-settings";
1196
+ var NATIVE_OBJECT_DETECTION_BUILDER_ID = "native-object-detection";
1160
1197
  var STREAM_PARAMS_REDUCER = {
1161
1198
  kind: "profile",
1162
1199
  buildSchema: (options, status) => require_dist.buildStreamParamsConfigSchema(options, status ?? null),
@@ -1177,10 +1214,16 @@ var IMAGE_SETTINGS_REDUCER = {
1177
1214
  buildSchema: (options, status) => buildImageSettingsConfigSchema(options, status ?? null),
1178
1215
  parsePatch: (patch) => parseImageSettingsFormPatch(patch)
1179
1216
  };
1217
+ var NATIVE_OBJECT_DETECTION_REDUCER = {
1218
+ kind: "settings",
1219
+ buildSchema: (options, status) => buildNativeObjectDetectionConfigSchema(options, status ?? null),
1220
+ parsePatch: (patch) => parseNativeObjectDetectionFormPatch(patch)
1221
+ };
1180
1222
  var BUILDER_REDUCERS = {
1181
1223
  [STREAM_PARAMS_BUILDER_ID]: STREAM_PARAMS_REDUCER,
1182
1224
  [DAY_NIGHT_BUILDER_ID]: DAY_NIGHT_REDUCER,
1183
- [IMAGE_SETTINGS_BUILDER_ID]: IMAGE_SETTINGS_REDUCER
1225
+ [IMAGE_SETTINGS_BUILDER_ID]: IMAGE_SETTINGS_REDUCER,
1226
+ [NATIVE_OBJECT_DETECTION_BUILDER_ID]: NATIVE_OBJECT_DETECTION_REDUCER
1184
1227
  };
1185
1228
  function resolveReducer(builderId) {
1186
1229
  const reducer = BUILDER_REDUCERS[builderId];
@@ -1,5 +1,5 @@
1
- import { $t as DeviceFeature, At as resolveContainerPrimaryChild, Ct as normalizeUnit, J as deviceStatusCapability, Jt as errMsg, K as deviceManagerCapability, L as buildStreamParamsConfigSchema, Nt as runtimeStatePolicyFor, Q as enumerateSchemaFields, S as STREAM_PROFILE_META, Tt as parseStreamParamsFormPatch, Yt as BaseAddon, Z as enumerateItemArrayFields, a as CAMERA_SWITCH_ORDER, bn as sleep, en as DeviceRole, f as DeviceStatusSchema, in as WELL_KNOWN_TAB_MAP, o as CAP_NAMES_WITH_STATUS, pn as isDeviceConfigCap, q as deviceStateCapability, t as ALL_CAPABILITY_DEFINITIONS, tn as DeviceType, xn as EventCategory } from "../../dist-Zhe9cTnK.mjs";
2
- import { n as purgeRetiredSettingsRows } from "../../retired-settings-keys-BK_geSOq.mjs";
1
+ import { $t as DeviceFeature, At as resolveContainerPrimaryChild, Ct as normalizeUnit, J as deviceStatusCapability, Jt as errMsg, K as deviceManagerCapability, L as buildStreamParamsConfigSchema, Nt as runtimeStatePolicyFor, Q as enumerateSchemaFields, S as STREAM_PROFILE_META, Tt as parseStreamParamsFormPatch, Yt as BaseAddon, Z as enumerateItemArrayFields, a as CAMERA_SWITCH_ORDER, bn as sleep, en as DeviceRole, f as DeviceStatusSchema, in as WELL_KNOWN_TAB_MAP, o as CAP_NAMES_WITH_STATUS, pn as isDeviceConfigCap, q as deviceStateCapability, t as ALL_CAPABILITY_DEFINITIONS, tn as DeviceType, xn as EventCategory } from "../../dist-BIvXRexm.mjs";
2
+ import { n as purgeRetiredSettingsRows } from "../../retired-settings-keys-CV3ZLGnJ.mjs";
3
3
  import { randomUUID } from "node:crypto";
4
4
  import { canonicalDeviceFingerprint } from "@camstack/types/node";
5
5
  //#region src/builtins/device-manager/adoption-job-engine.ts
@@ -1125,6 +1125,42 @@ function parseImageSettingsFormPatch(patch) {
1125
1125
  return out;
1126
1126
  }
1127
1127
  //#endregion
1128
+ //#region src/builtins/device-manager/native-object-detection-config-schema.ts
1129
+ /**
1130
+ * What the toggle buys, per geometry. Written out rather than computed: the
1131
+ * `flag-only` sentence is the one an operator needs BEFORE flipping the switch,
1132
+ * and a generic "may not be supported" would not have said it.
1133
+ */
1134
+ var GEOMETRY_HELP = {
1135
+ boxed: "This camera ships a bounding box with each detection, so the pipeline tracks it as a subject: it gets a track, a best shot and the notification rules that address onboard detections.",
1136
+ "flag-only": "This camera ships the class with no bounding box — on Reolink that is every battery camera, because the boxes ride a sub-stream a battery camera never attaches. Turning this on makes the detections reach the tracker as motion and no further; it will not produce tracked subjects."
1137
+ };
1138
+ function buildNativeObjectDetectionConfigSchema(options, status) {
1139
+ if (options.supportedClasses.length === 0) return null;
1140
+ const fields = [{
1141
+ type: "boolean",
1142
+ key: "nativeObjectDetection_enabled",
1143
+ label: "Forward onboard AI detections",
1144
+ default: status?.enabled ?? false
1145
+ }];
1146
+ return { sections: [{
1147
+ id: "native-object-detection",
1148
+ tab: "motion",
1149
+ title: "Onboard AI detections",
1150
+ description: `${GEOMETRY_HELP[options.geometry]} Detected by this firmware: ${options.supportedClasses.join(", ")}.`,
1151
+ columns: 1,
1152
+ fields
1153
+ }] };
1154
+ }
1155
+ function parseNativeObjectDetectionFormPatch(patch) {
1156
+ const out = {};
1157
+ if ("nativeObjectDetection_enabled" in patch) {
1158
+ const value = patch.nativeObjectDetection_enabled;
1159
+ if (typeof value === "boolean") out.enabled = value;
1160
+ }
1161
+ return out;
1162
+ }
1163
+ //#endregion
1128
1164
  //#region src/builtins/device-manager/device-config-contribution.ts
1129
1165
  /**
1130
1166
  * D14 device-config archetype — framework-side contribution derivation.
@@ -1152,6 +1188,7 @@ function parseImageSettingsFormPatch(patch) {
1152
1188
  var STREAM_PARAMS_BUILDER_ID = "stream-params";
1153
1189
  var DAY_NIGHT_BUILDER_ID = "day-night";
1154
1190
  var IMAGE_SETTINGS_BUILDER_ID = "image-settings";
1191
+ var NATIVE_OBJECT_DETECTION_BUILDER_ID = "native-object-detection";
1155
1192
  var STREAM_PARAMS_REDUCER = {
1156
1193
  kind: "profile",
1157
1194
  buildSchema: (options, status) => buildStreamParamsConfigSchema(options, status ?? null),
@@ -1172,10 +1209,16 @@ var IMAGE_SETTINGS_REDUCER = {
1172
1209
  buildSchema: (options, status) => buildImageSettingsConfigSchema(options, status ?? null),
1173
1210
  parsePatch: (patch) => parseImageSettingsFormPatch(patch)
1174
1211
  };
1212
+ var NATIVE_OBJECT_DETECTION_REDUCER = {
1213
+ kind: "settings",
1214
+ buildSchema: (options, status) => buildNativeObjectDetectionConfigSchema(options, status ?? null),
1215
+ parsePatch: (patch) => parseNativeObjectDetectionFormPatch(patch)
1216
+ };
1175
1217
  var BUILDER_REDUCERS = {
1176
1218
  [STREAM_PARAMS_BUILDER_ID]: STREAM_PARAMS_REDUCER,
1177
1219
  [DAY_NIGHT_BUILDER_ID]: DAY_NIGHT_REDUCER,
1178
- [IMAGE_SETTINGS_BUILDER_ID]: IMAGE_SETTINGS_REDUCER
1220
+ [IMAGE_SETTINGS_BUILDER_ID]: IMAGE_SETTINGS_REDUCER,
1221
+ [NATIVE_OBJECT_DETECTION_BUILDER_ID]: NATIVE_OBJECT_DETECTION_REDUCER
1179
1222
  };
1180
1223
  function resolveReducer(builderId) {
1181
1224
  const reducer = BUILDER_REDUCERS[builderId];
@@ -0,0 +1,3 @@
1
+ import { ConfigUISchema, NativeObjectDetectionOptions, NativeObjectDetectionSettingsPatch, NativeObjectDetectionStatus } from '@camstack/types';
2
+ export declare function buildNativeObjectDetectionConfigSchema(options: NativeObjectDetectionOptions, status: NativeObjectDetectionStatus | null): ConfigUISchema | null;
3
+ export declare function parseNativeObjectDetectionFormPatch(patch: Record<string, unknown>): NativeObjectDetectionSettingsPatch;
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DUSfUAgz.js");
6
+ const require_dist = require("../../dist-D3lJV9M7.js");
7
7
  //#region src/builtins/doorbell/trigger-engine.ts
8
8
  /**
9
9
  * Pure trigger logic for the virtual-doorbell builtin — edge detection over
@@ -1,4 +1,4 @@
1
- import { $ as evaluateSensorEdge, F as bareAddonId, Jt as errMsg, Y as doorbellCapability, Yt as BaseAddon, b as SOURCE_DEVICE_TYPES, cn as createEvent, lt as isSameAddonId, tn as DeviceType, ut as isSourceCap, xn as EventCategory, y as SOURCE_CAPS } from "../../dist-Zhe9cTnK.mjs";
1
+ import { $ as evaluateSensorEdge, F as bareAddonId, Jt as errMsg, Y as doorbellCapability, Yt as BaseAddon, b as SOURCE_DEVICE_TYPES, cn as createEvent, lt as isSameAddonId, tn as DeviceType, ut as isSourceCap, xn as EventCategory, y as SOURCE_CAPS } from "../../dist-BIvXRexm.mjs";
2
2
  //#region src/builtins/doorbell/trigger-engine.ts
3
3
  /**
4
4
  * Pure trigger logic for the virtual-doorbell builtin — edge detection over
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DUSfUAgz.js");
6
+ const require_dist = require("../../dist-D3lJV9M7.js");
7
7
  const require_formatter = require("../../formatter-DqAKDlvN.js");
8
8
  //#region src/builtins/hub-forwarder/hub-forwarder-destination.ts
9
9
  var DEFAULT_OUTBOUND_BUFFER_SIZE = 500;
@@ -1,4 +1,4 @@
1
- import { Yt as BaseAddon, gt as logDestinationCapability } from "../../dist-Zhe9cTnK.mjs";
1
+ import { Yt as BaseAddon, gt as logDestinationCapability } from "../../dist-BIvXRexm.mjs";
2
2
  import { t as formatLogLine } from "../../formatter-B7qW8bPJ.mjs";
3
3
  //#region src/builtins/hub-forwarder/hub-forwarder-destination.ts
4
4
  var DEFAULT_OUTBOUND_BUFFER_SIZE = 500;
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../../chunk-Cek0wNdY.js");
3
- const require_dist = require("../../dist-DUSfUAgz.js");
3
+ const require_dist = require("../../dist-D3lJV9M7.js");
4
4
  //#region src/builtins/liveness-monitor/liveness-checks.ts
5
5
  var NO_DEVICES = "liveness:no-devices";
6
6
  var ALL_OFFLINE = "liveness:all-devices-offline";
@@ -1,4 +1,4 @@
1
- import { Jt as errMsg, Yt as BaseAddon, cn as createEvent, v as RecordingStatusSchema, xn as EventCategory } from "../../dist-Zhe9cTnK.mjs";
1
+ import { Jt as errMsg, Yt as BaseAddon, cn as createEvent, v as RecordingStatusSchema, xn as EventCategory } from "../../dist-BIvXRexm.mjs";
2
2
  //#region src/builtins/liveness-monitor/liveness-checks.ts
3
3
  var NO_DEVICES = "liveness:no-devices";
4
4
  var ALL_OFFLINE = "liveness:all-devices-offline";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DUSfUAgz.js");
6
+ const require_dist = require("../../dist-D3lJV9M7.js");
7
7
  let node_crypto = require("node:crypto");
8
8
  node_crypto = require_chunk.__toESM(node_crypto);
9
9
  let crypto$1 = require("crypto");
@@ -1,5 +1,5 @@
1
1
  import { i as __require, o as __toESM, t as __commonJSMin } from "../../chunk-CNf5ZN-e.mjs";
2
- import { C as ScopedTokenSchema, N as authProviderCapability, O as UserRecordSchema, Wt as userManagementCapability, Yt as BaseAddon, r as ApiKeyRecordSchema } from "../../dist-Zhe9cTnK.mjs";
2
+ import { C as ScopedTokenSchema, N as authProviderCapability, O as UserRecordSchema, Wt as userManagementCapability, Yt as BaseAddon, r as ApiKeyRecordSchema } from "../../dist-BIvXRexm.mjs";
3
3
  import * as crypto$2 from "node:crypto";
4
4
  import { createHash, randomUUID, timingSafeEqual } from "node:crypto";
5
5
  import nodeCrypto from "crypto";
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_chunk = require("../../chunk-Cek0wNdY.js");
3
- const require_dist = require("../../dist-DUSfUAgz.js");
3
+ const require_dist = require("../../dist-D3lJV9M7.js");
4
4
  const require_tls = require("../../tls-BFs4PzoW.js");
5
5
  let node_fs_promises = require("node:fs/promises");
6
6
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { Yt as BaseAddon, ht as localNetworkCapability, xn as EventCategory } from "../../dist-Zhe9cTnK.mjs";
1
+ import { Yt as BaseAddon, ht as localNetworkCapability, xn as EventCategory } from "../../dist-BIvXRexm.mjs";
2
2
  import { S as readLanHttpState, _ as DEFAULT_LAN_HTTP_PORT, a as writeTlsMode, i as writeExtraSans, l as reissueTlsLeaf, n as readTlsAccessStatus, o as validateUploadedTls, r as readTlsMode, s as ensureTlsCert, t as readExtraSans, y as applyLanHttp } from "../../tls-2xbgg78V.mjs";
3
3
  import { mkdir, writeFile } from "node:fs/promises";
4
4
  import { join } from "node:path";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DUSfUAgz.js");
6
+ const require_dist = require("../../dist-D3lJV9M7.js");
7
7
  //#region src/builtins/loki-logging/loki-payload.ts
8
8
  /**
9
9
  * Loki rejects a label name that is not a valid Prometheus label
@@ -1,4 +1,4 @@
1
- import { Yt as BaseAddon, gt as logDestinationCapability } from "../../dist-Zhe9cTnK.mjs";
1
+ import { Yt as BaseAddon, gt as logDestinationCapability } from "../../dist-BIvXRexm.mjs";
2
2
  //#region src/builtins/loki-logging/loki-payload.ts
3
3
  /**
4
4
  * Loki rejects a label name that is not a valid Prometheus label
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DUSfUAgz.js");
6
+ const require_dist = require("../../dist-D3lJV9M7.js");
7
7
  let node_fs_promises = require("node:fs/promises");
8
8
  let node_fs = require("node:fs");
9
9
  node_fs = require_chunk.__toESM(node_fs);
@@ -1,4 +1,4 @@
1
- import { Jt as errMsg, Ot as reducePoints, Yt as BaseAddon, cn as createEvent, kt as resolveBucketMs, rt as foldSnapshotByFunction, xn as EventCategory, xt as metricsProviderCapability } from "../../dist-Zhe9cTnK.mjs";
1
+ import { Jt as errMsg, Ot as reducePoints, Yt as BaseAddon, cn as createEvent, kt as resolveBucketMs, rt as foldSnapshotByFunction, xn as EventCategory, xt as metricsProviderCapability } from "../../dist-BIvXRexm.mjs";
2
2
  import { access, readFile, readdir } from "node:fs/promises";
3
3
  import * as fs from "node:fs";
4
4
  import { constants, readFileSync } from "node:fs";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DUSfUAgz.js");
6
+ const require_dist = require("../../dist-D3lJV9M7.js");
7
7
  let node_fs = require("node:fs");
8
8
  node_fs = require_chunk.__toESM(node_fs);
9
9
  let node_child_process = require("node:child_process");
@@ -1,5 +1,5 @@
1
1
  import { o as __toESM } from "../../chunk-CNf5ZN-e.mjs";
2
- import { Et as platformProbeCapability, It as scoreRuntimes, Jt as errMsg, X as enumerateInferenceDevices, Yt as BaseAddon, un as emitReadiness, xn as EventCategory } from "../../dist-Zhe9cTnK.mjs";
2
+ import { Et as platformProbeCapability, It as scoreRuntimes, Jt as errMsg, X as enumerateInferenceDevices, Yt as BaseAddon, un as emitReadiness, xn as EventCategory } from "../../dist-BIvXRexm.mjs";
3
3
  import * as fs from "node:fs";
4
4
  import { execFile } from "node:child_process";
5
5
  import * as os from "node:os";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-DUSfUAgz.js");
6
+ const require_dist = require("../../dist-D3lJV9M7.js");
7
7
  //#region src/builtins/remote-access-orchestrator/enabled-providers-reconcile.ts
8
8
  /**
9
9
  * Reconcile the durable `enabledProviders` set against authoritative
@@ -1,4 +1,4 @@
1
- import { Yt as BaseAddon, xn as EventCategory } from "../../dist-Zhe9cTnK.mjs";
1
+ import { Yt as BaseAddon, xn as EventCategory } from "../../dist-BIvXRexm.mjs";
2
2
  //#region src/builtins/remote-access-orchestrator/enabled-providers-reconcile.ts
3
3
  /**
4
4
  * Reconcile the durable `enabledProviders` set against authoritative