@camstack/system 1.2.232 → 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 (59) hide show
  1. package/dist/addon-runner.js +1 -1
  2. package/dist/addon-runner.mjs +1 -1
  3. package/dist/addon-utils.js +1 -1
  4. package/dist/addon-utils.mjs +1 -1
  5. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
  6. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
  7. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
  8. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
  9. package/dist/builtins/alerts/alerts.addon.js +1 -1
  10. package/dist/builtins/alerts/alerts.addon.mjs +1 -1
  11. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +1 -1
  12. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +1 -1
  13. package/dist/builtins/console-logging/index.js +1 -1
  14. package/dist/builtins/console-logging/index.mjs +1 -1
  15. package/dist/builtins/core-blocks/core-blocks.addon.js +1 -1
  16. package/dist/builtins/core-blocks/core-blocks.addon.mjs +1 -1
  17. package/dist/builtins/device-manager/device-config-contribution.d.ts +1 -0
  18. package/dist/builtins/device-manager/device-manager.addon.js +46 -3
  19. package/dist/builtins/device-manager/device-manager.addon.mjs +46 -3
  20. package/dist/builtins/device-manager/native-object-detection-config-schema.d.ts +3 -0
  21. package/dist/builtins/doorbell/virtual-doorbell.addon.js +1 -1
  22. package/dist/builtins/doorbell/virtual-doorbell.addon.mjs +1 -1
  23. package/dist/builtins/hub-forwarder/index.js +1 -1
  24. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  25. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  26. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  27. package/dist/builtins/local-auth/local-auth.addon.js +1 -1
  28. package/dist/builtins/local-auth/local-auth.addon.mjs +1 -1
  29. package/dist/builtins/local-network/local-network.addon.js +1 -1
  30. package/dist/builtins/local-network/local-network.addon.mjs +1 -1
  31. package/dist/builtins/loki-logging/index.js +1 -1
  32. package/dist/builtins/loki-logging/index.mjs +1 -1
  33. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  34. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  35. package/dist/builtins/platform-probe/index.js +1 -1
  36. package/dist/builtins/platform-probe/index.mjs +1 -1
  37. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  38. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  39. package/dist/builtins/snapshot/index.js +1 -1
  40. package/dist/builtins/snapshot/index.mjs +1 -1
  41. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  42. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  43. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +0 -0
  44. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +0 -0
  45. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
  46. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
  47. package/dist/builtins/system-config/system-config.addon.js +1 -1
  48. package/dist/builtins/system-config/system-config.addon.mjs +1 -1
  49. package/dist/builtins/winston-logging/index.js +1 -1
  50. package/dist/builtins/winston-logging/index.mjs +1 -1
  51. package/dist/{custom-action-registry-gaO1AlT2.mjs → custom-action-registry-CFHYDHAu.mjs} +1 -1
  52. package/dist/{custom-action-registry-YHpAdksL.js → custom-action-registry-CWFK5UDj.js} +1 -1
  53. package/dist/{dist-BX6SpI0i.mjs → dist-BIvXRexm.mjs} +75 -10
  54. package/dist/{dist-CEIkHEdy.js → dist-D3lJV9M7.js} +75 -10
  55. package/dist/index.js +2 -2
  56. package/dist/index.mjs +2 -2
  57. package/dist/{retired-settings-keys-DDV06eUr.mjs → retired-settings-keys-CV3ZLGnJ.mjs} +1 -1
  58. package/dist/{retired-settings-keys-FLZlwa2U.js → retired-settings-keys-YPsd2Exa.js} +1 -1
  59. 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-YHpAdksL.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-gaO1AlT2.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";
@@ -1,7 +1,7 @@
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-YHpAdksL.js");
4
+ const require_custom_action_registry = require("./custom-action-registry-CWFK5UDj.js");
5
5
  const require_snapshot_courtesy = require("./snapshot-courtesy-oeTWCXPv.js");
6
6
  exports.COURTESY_DEFAULT_WIDTH = require_snapshot_courtesy.COURTESY_DEFAULT_WIDTH;
7
7
  exports.CustomActionRegistry = require_custom_action_registry.CustomActionRegistry;
@@ -1,4 +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-gaO1AlT2.mjs";
2
+ import { t as CustomActionRegistry } from "./custom-action-registry-CFHYDHAu.mjs";
3
3
  import { i as renderCourtesyOverlayJpeg, n as courtesyCacheKey, r as renderCourtesyJpeg, t as COURTESY_DEFAULT_WIDTH } from "./snapshot-courtesy-LoJNgHHZ.mjs";
4
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-CEIkHEdy.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-BX6SpI0i.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-CEIkHEdy.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-BX6SpI0i.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-CEIkHEdy.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-BX6SpI0i.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-CEIkHEdy.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");
@@ -1,4 +1,4 @@
1
- import { P as backupCapability, Vt as storageOccupancyCapability, Yt as BaseAddon, bt as mayWriteToLocation, xn as EventCategory } from "../../dist-BX6SpI0i.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";
@@ -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-CEIkHEdy.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-BX6SpI0i.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-CEIkHEdy.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-BX6SpI0i.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-CEIkHEdy.js");
7
- const require_retired_settings_keys = require("../../retired-settings-keys-FLZlwa2U.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-BX6SpI0i.mjs";
2
- import { n as purgeRetiredSettingsRows } from "../../retired-settings-keys-DDV06eUr.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-CEIkHEdy.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-BX6SpI0i.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-CEIkHEdy.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-BX6SpI0i.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-CEIkHEdy.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-BX6SpI0i.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-CEIkHEdy.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-BX6SpI0i.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-CEIkHEdy.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-BX6SpI0i.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-CEIkHEdy.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-BX6SpI0i.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-CEIkHEdy.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-BX6SpI0i.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-CEIkHEdy.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-BX6SpI0i.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-CEIkHEdy.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-BX6SpI0i.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
@@ -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-CEIkHEdy.js");
6
+ const require_dist = require("../../dist-D3lJV9M7.js");
7
7
  const require_snapshot_courtesy = require("../../snapshot-courtesy-oeTWCXPv.js");
8
8
  let zod = require("zod");
9
9
  let node_crypto = require("node:crypto");
@@ -1,4 +1,4 @@
1
- import { $t as DeviceFeature, F as bareAddonId, I as batteryCapability, Jt as errMsg, Rt as snapshotCapability, Ut as streamQualityLabel, W as deriveBatteryPresence, Yt as BaseAddon, i as BatteryStatusSchema, mn as nodePin, tn as DeviceType, xn as EventCategory } from "../../dist-BX6SpI0i.mjs";
1
+ import { $t as DeviceFeature, F as bareAddonId, I as batteryCapability, Jt as errMsg, Rt as snapshotCapability, Ut as streamQualityLabel, W as deriveBatteryPresence, Yt as BaseAddon, i as BatteryStatusSchema, mn as nodePin, tn as DeviceType, xn as EventCategory } from "../../dist-BIvXRexm.mjs";
2
2
  import { i as renderCourtesyOverlayJpeg, n as courtesyCacheKey, r as renderCourtesyJpeg } from "../../snapshot-courtesy-LoJNgHHZ.mjs";
3
3
  import { z } from "zod";
4
4
  import { randomUUID } from "node:crypto";
@@ -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-CEIkHEdy.js");
6
+ const require_dist = require("../../dist-D3lJV9M7.js");
7
7
  let node_crypto = require("node:crypto");
8
8
  let node_fs_promises = require("node:fs/promises");
9
9
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { Ht as storageProviderCapability, Yt as BaseAddon, nt as filesystemBrowseCapability } from "../../dist-BX6SpI0i.mjs";
1
+ import { Ht as storageProviderCapability, Yt as BaseAddon, nt as filesystemBrowseCapability } from "../../dist-BIvXRexm.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { mkdir, readdir, realpath, statfs } from "node:fs/promises";
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-CEIkHEdy.js");
6
+ const require_dist = require("../../dist-D3lJV9M7.js");
7
7
  const require_hub_cap_forward = require("../../hub-cap-forward-DmHNjbB0.js");
8
8
  let zod = require("zod");
9
9
  let node_crypto = require("node:crypto");
@@ -1,4 +1,4 @@
1
- import { Bt as storageMigrationCapability, D as StorageMigrationJobSchema, E as StorageLocationTypeSchema, Lt as settingsStoreCapability, R as collectSecretConfigKeys, St as modeMayWrite, T as StorageLocationModeSchema, Yt as BaseAddon, bt as mayWriteToLocation, et as evictionPolicyOfLocation, g as REDACTED_SECRET, hn as parseJsonObject, it as gbToBytes, jt as resolveLocationMode, m as LegacyStorageLocationDefaultSchema, pt as legacyModeOf, qt as withLocationMode, st as isLocationEnabled, w as StorageCleanupJobSchema, xn as EventCategory, yt as mayReadLocation, zt as storageCapability } from "../../dist-BX6SpI0i.mjs";
1
+ import { Bt as storageMigrationCapability, D as StorageMigrationJobSchema, E as StorageLocationTypeSchema, Lt as settingsStoreCapability, R as collectSecretConfigKeys, St as modeMayWrite, T as StorageLocationModeSchema, Yt as BaseAddon, bt as mayWriteToLocation, et as evictionPolicyOfLocation, g as REDACTED_SECRET, hn as parseJsonObject, it as gbToBytes, jt as resolveLocationMode, m as LegacyStorageLocationDefaultSchema, pt as legacyModeOf, qt as withLocationMode, st as isLocationEnabled, w as StorageCleanupJobSchema, xn as EventCategory, yt as mayReadLocation, zt as storageCapability } from "../../dist-BIvXRexm.mjs";
2
2
  import { t as HUB_CAP_FWD_ACTION } from "../../hub-cap-forward-BdT320dq.mjs";
3
3
  import { z } from "zod";
4
4
  import { randomUUID } from "node:crypto";
@@ -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-CEIkHEdy.js");
6
+ const require_dist = require("../../dist-D3lJV9M7.js");
7
7
  //#region src/builtins/system-config/system-config.addon.ts
8
8
  /**
9
9
  * Built-in `system-config` addon — Phase 4 of the settings redesign.
@@ -1,4 +1,4 @@
1
- import { Jt as errMsg, Yt as BaseAddon, fn as hydrateSchema } from "../../dist-BX6SpI0i.mjs";
1
+ import { Jt as errMsg, Yt as BaseAddon, fn as hydrateSchema } from "../../dist-BIvXRexm.mjs";
2
2
  //#region src/builtins/system-config/system-config.addon.ts
3
3
  /**
4
4
  * Built-in `system-config` addon — Phase 4 of the settings redesign.
@@ -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-CEIkHEdy.js");
6
+ const require_dist = require("../../dist-D3lJV9M7.js");
7
7
  const require_formatter = require("../../formatter-DqAKDlvN.js");
8
8
  let node_path = require("node:path");
9
9
  node_path = require_chunk.__toESM(node_path);
@@ -1,4 +1,4 @@
1
- import { Yt as BaseAddon, gt as logDestinationCapability } from "../../dist-BX6SpI0i.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
  import * as path$1 from "node:path";
4
4
  import path from "node:path";
@@ -1,4 +1,4 @@
1
- import { G as describeCustomActions } from "./dist-BX6SpI0i.mjs";
1
+ import { G as describeCustomActions } from "./dist-BIvXRexm.mjs";
2
2
  //#region src/kernel/custom-action-registry.ts
3
3
  /**
4
4
  * CustomActionRegistry — per-process registry of addon custom actions.
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-CEIkHEdy.js");
1
+ const require_dist = require("./dist-D3lJV9M7.js");
2
2
  //#region src/kernel/custom-action-registry.ts
3
3
  /**
4
4
  * CustomActionRegistry — per-process registry of addon custom actions.
@@ -690,7 +690,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
690
690
  return EventCategory;
691
691
  }({});
692
692
  //#endregion
693
- //#region ../types/dist/sleep-DEuj7E3j.mjs
693
+ //#region ../types/dist/sleep-BEyvfshj.mjs
694
694
  /**
695
695
  * The audio chunk plane's byte format, and the ONE expansion from a coded
696
696
  * window to float samples (D455).
@@ -30181,11 +30181,39 @@ var NativeObjectDetectionStatusSchema = z.object({
30181
30181
  supportedClasses: z.array(NativeObjectClassEnum).readonly(),
30182
30182
  /**
30183
30183
  * Whether forwarding of onboard AI detections is enabled for this device.
30184
- * Default FALSE (opt-in, cold-start) — onboard AI pushes are noisy/sparse and
30185
- * churn the tracker, so forwarding stays off until the operator enables it.
30184
+ *
30185
+ * The COLD-START default is the provider's, and it is not one value for
30186
+ * every camera: a mains camera carries the boxed side-channel and its
30187
+ * detections are usable subjects, so it defaults ON; a battery camera never
30188
+ * attaches that channel, so the same toggle would buy it nothing but a write
30189
+ * — it defaults OFF and an operator who wants it turns it on knowing what it
30190
+ * costs. {@link NativeObjectDetectionOptionsSchema.geometry} is how the UI
30191
+ * says which of the two a camera is.
30186
30192
  */
30187
30193
  enabled: z.boolean()
30188
30194
  });
30195
+ /**
30196
+ * What a camera's onboard detections actually CARRY.
30197
+ *
30198
+ * `boxed` — the firmware ships a bounding box with the class, so a detection is
30199
+ * a subject the pipeline can track, crop and score.
30200
+ * `flag-only` — the firmware ships the class and nothing else. The pipeline
30201
+ * needs geometry to make a subject out of it, so such a push reaches the
30202
+ * tracker as motion and no further. On Reolink this is every battery camera:
30203
+ * the boxes ride the BcMedia sub-stream, which a battery camera never attaches.
30204
+ *
30205
+ * Reported and not inferred, because the operator's question in front of the
30206
+ * toggle is "what do I get", and "a class with no box" and "a subject" are
30207
+ * different answers (D14: the derived form is only as honest as `getOptions`).
30208
+ */
30209
+ var NativeObjectGeometryEnum = z.enum(["boxed", "flag-only"]);
30210
+ var NativeObjectDetectionOptionsSchema = z.object({
30211
+ /** Classes this firmware can detect — the same list the status reports. */
30212
+ supportedClasses: z.array(NativeObjectClassEnum).readonly(),
30213
+ /** What a detection from this camera carries. */
30214
+ geometry: NativeObjectGeometryEnum
30215
+ });
30216
+ var NativeObjectDetectionSettingsPatchSchema = z.object({ enabled: z.boolean().optional() });
30189
30217
  var NativeObjectDetectionRuntimeStateSchema = NativeObjectDetectionStatusSchema.extend({
30190
30218
  /** Required by createRuntimeStateBridge — epoch ms of last refresh. */
30191
30219
  lastFetchedAt: z.number() });
@@ -30195,13 +30223,28 @@ var nativeObjectDetectionCapability = {
30195
30223
  deviceNative: true,
30196
30224
  mode: "singleton",
30197
30225
  deviceTypes: [DeviceType.Camera],
30198
- methods: { setEnabled: method(z.object({
30199
- deviceId: z.number(),
30200
- enabled: z.boolean()
30201
- }), z.void(), {
30202
- kind: "mutation",
30203
- auth: "admin"
30204
- }) },
30226
+ deviceConfig: { ui: {
30227
+ kind: "derived-form",
30228
+ builderId: "native-object-detection",
30229
+ tab: "motion"
30230
+ } },
30231
+ methods: {
30232
+ getOptions: method(z.object({ deviceId: z.number() }), NativeObjectDetectionOptionsSchema),
30233
+ setSettings: method(z.object({
30234
+ deviceId: z.number(),
30235
+ settings: NativeObjectDetectionSettingsPatchSchema
30236
+ }), z.void(), {
30237
+ kind: "mutation",
30238
+ auth: "admin"
30239
+ }),
30240
+ setEnabled: method(z.object({
30241
+ deviceId: z.number(),
30242
+ enabled: z.boolean()
30243
+ }), z.void(), {
30244
+ kind: "mutation",
30245
+ auth: "admin"
30246
+ })
30247
+ },
30205
30248
  events: { onDetected: { data: z.object({
30206
30249
  deviceId: z.number(),
30207
30250
  detection: NativeDetectionSchema
@@ -39934,12 +39977,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
39934
39977
  addonId: null,
39935
39978
  access: "create"
39936
39979
  },
39980
+ "nativeObjectDetection.getOptions": {
39981
+ capName: "native-object-detection",
39982
+ capScope: "device",
39983
+ addonId: null,
39984
+ access: "view"
39985
+ },
39937
39986
  "nativeObjectDetection.setEnabled": {
39938
39987
  capName: "native-object-detection",
39939
39988
  capScope: "device",
39940
39989
  addonId: null,
39941
39990
  access: "create"
39942
39991
  },
39992
+ "nativeObjectDetection.setSettings": {
39993
+ capName: "native-object-detection",
39994
+ capScope: "device",
39995
+ addonId: null,
39996
+ access: "create"
39997
+ },
39943
39998
  "navigation.getFeatures": {
39944
39999
  capName: "navigation",
39945
40000
  capScope: "device",
@@ -44166,11 +44221,21 @@ Object.freeze({
44166
44221
  form: "single",
44167
44222
  optional: false
44168
44223
  }],
44224
+ "nativeObjectDetection.getOptions": [{
44225
+ name: "deviceId",
44226
+ form: "single",
44227
+ optional: false
44228
+ }],
44169
44229
  "nativeObjectDetection.setEnabled": [{
44170
44230
  name: "deviceId",
44171
44231
  form: "single",
44172
44232
  optional: false
44173
44233
  }],
44234
+ "nativeObjectDetection.setSettings": [{
44235
+ name: "deviceId",
44236
+ form: "single",
44237
+ optional: false
44238
+ }],
44174
44239
  "navigation.getFeatures": [{
44175
44240
  name: "deviceId",
44176
44241
  form: "single",
@@ -690,7 +690,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
690
690
  return EventCategory;
691
691
  }({});
692
692
  //#endregion
693
- //#region ../types/dist/sleep-DEuj7E3j.mjs
693
+ //#region ../types/dist/sleep-BEyvfshj.mjs
694
694
  /**
695
695
  * The audio chunk plane's byte format, and the ONE expansion from a coded
696
696
  * window to float samples (D455).
@@ -30181,11 +30181,39 @@ var NativeObjectDetectionStatusSchema = zod.z.object({
30181
30181
  supportedClasses: zod.z.array(NativeObjectClassEnum).readonly(),
30182
30182
  /**
30183
30183
  * Whether forwarding of onboard AI detections is enabled for this device.
30184
- * Default FALSE (opt-in, cold-start) — onboard AI pushes are noisy/sparse and
30185
- * churn the tracker, so forwarding stays off until the operator enables it.
30184
+ *
30185
+ * The COLD-START default is the provider's, and it is not one value for
30186
+ * every camera: a mains camera carries the boxed side-channel and its
30187
+ * detections are usable subjects, so it defaults ON; a battery camera never
30188
+ * attaches that channel, so the same toggle would buy it nothing but a write
30189
+ * — it defaults OFF and an operator who wants it turns it on knowing what it
30190
+ * costs. {@link NativeObjectDetectionOptionsSchema.geometry} is how the UI
30191
+ * says which of the two a camera is.
30186
30192
  */
30187
30193
  enabled: zod.z.boolean()
30188
30194
  });
30195
+ /**
30196
+ * What a camera's onboard detections actually CARRY.
30197
+ *
30198
+ * `boxed` — the firmware ships a bounding box with the class, so a detection is
30199
+ * a subject the pipeline can track, crop and score.
30200
+ * `flag-only` — the firmware ships the class and nothing else. The pipeline
30201
+ * needs geometry to make a subject out of it, so such a push reaches the
30202
+ * tracker as motion and no further. On Reolink this is every battery camera:
30203
+ * the boxes ride the BcMedia sub-stream, which a battery camera never attaches.
30204
+ *
30205
+ * Reported and not inferred, because the operator's question in front of the
30206
+ * toggle is "what do I get", and "a class with no box" and "a subject" are
30207
+ * different answers (D14: the derived form is only as honest as `getOptions`).
30208
+ */
30209
+ var NativeObjectGeometryEnum = zod.z.enum(["boxed", "flag-only"]);
30210
+ var NativeObjectDetectionOptionsSchema = zod.z.object({
30211
+ /** Classes this firmware can detect — the same list the status reports. */
30212
+ supportedClasses: zod.z.array(NativeObjectClassEnum).readonly(),
30213
+ /** What a detection from this camera carries. */
30214
+ geometry: NativeObjectGeometryEnum
30215
+ });
30216
+ var NativeObjectDetectionSettingsPatchSchema = zod.z.object({ enabled: zod.z.boolean().optional() });
30189
30217
  var NativeObjectDetectionRuntimeStateSchema = NativeObjectDetectionStatusSchema.extend({
30190
30218
  /** Required by createRuntimeStateBridge — epoch ms of last refresh. */
30191
30219
  lastFetchedAt: zod.z.number() });
@@ -30195,13 +30223,28 @@ var nativeObjectDetectionCapability = {
30195
30223
  deviceNative: true,
30196
30224
  mode: "singleton",
30197
30225
  deviceTypes: [DeviceType.Camera],
30198
- methods: { setEnabled: method(zod.z.object({
30199
- deviceId: zod.z.number(),
30200
- enabled: zod.z.boolean()
30201
- }), zod.z.void(), {
30202
- kind: "mutation",
30203
- auth: "admin"
30204
- }) },
30226
+ deviceConfig: { ui: {
30227
+ kind: "derived-form",
30228
+ builderId: "native-object-detection",
30229
+ tab: "motion"
30230
+ } },
30231
+ methods: {
30232
+ getOptions: method(zod.z.object({ deviceId: zod.z.number() }), NativeObjectDetectionOptionsSchema),
30233
+ setSettings: method(zod.z.object({
30234
+ deviceId: zod.z.number(),
30235
+ settings: NativeObjectDetectionSettingsPatchSchema
30236
+ }), zod.z.void(), {
30237
+ kind: "mutation",
30238
+ auth: "admin"
30239
+ }),
30240
+ setEnabled: method(zod.z.object({
30241
+ deviceId: zod.z.number(),
30242
+ enabled: zod.z.boolean()
30243
+ }), zod.z.void(), {
30244
+ kind: "mutation",
30245
+ auth: "admin"
30246
+ })
30247
+ },
30205
30248
  events: { onDetected: { data: zod.z.object({
30206
30249
  deviceId: zod.z.number(),
30207
30250
  detection: NativeDetectionSchema
@@ -39934,12 +39977,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
39934
39977
  addonId: null,
39935
39978
  access: "create"
39936
39979
  },
39980
+ "nativeObjectDetection.getOptions": {
39981
+ capName: "native-object-detection",
39982
+ capScope: "device",
39983
+ addonId: null,
39984
+ access: "view"
39985
+ },
39937
39986
  "nativeObjectDetection.setEnabled": {
39938
39987
  capName: "native-object-detection",
39939
39988
  capScope: "device",
39940
39989
  addonId: null,
39941
39990
  access: "create"
39942
39991
  },
39992
+ "nativeObjectDetection.setSettings": {
39993
+ capName: "native-object-detection",
39994
+ capScope: "device",
39995
+ addonId: null,
39996
+ access: "create"
39997
+ },
39943
39998
  "navigation.getFeatures": {
39944
39999
  capName: "navigation",
39945
40000
  capScope: "device",
@@ -44166,11 +44221,21 @@ Object.freeze({
44166
44221
  form: "single",
44167
44222
  optional: false
44168
44223
  }],
44224
+ "nativeObjectDetection.getOptions": [{
44225
+ name: "deviceId",
44226
+ form: "single",
44227
+ optional: false
44228
+ }],
44169
44229
  "nativeObjectDetection.setEnabled": [{
44170
44230
  name: "deviceId",
44171
44231
  form: "single",
44172
44232
  optional: false
44173
44233
  }],
44234
+ "nativeObjectDetection.setSettings": [{
44235
+ name: "deviceId",
44236
+ form: "single",
44237
+ optional: false
44238
+ }],
44174
44239
  "navigation.getFeatures": [{
44175
44240
  name: "deviceId",
44176
44241
  form: "single",
package/dist/index.js CHANGED
@@ -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-CEIkHEdy.js");
3
+ const require_dist = require("./dist-D3lJV9M7.js");
4
4
  const require_builtins_alerts_alerts_addon = require("./builtins/alerts/alerts.addon.js");
5
5
  require("./builtins/alerts/index.js");
6
6
  const require_formatter = require("./formatter-DqAKDlvN.js");
@@ -29,7 +29,7 @@ const require_event_loop_stall_monitor = require("./event-loop-stall-monitor-CAs
29
29
  const require_tls$1 = require("./tls-BFs4PzoW.js");
30
30
  const require_manifest_system_deps = require("./manifest-system-deps-CrSP0Kkp.js");
31
31
  const require_resource_monitor = require("./resource-monitor-LVE1BoLs.js");
32
- const require_custom_action_registry = require("./custom-action-registry-YHpAdksL.js");
32
+ const require_custom_action_registry = require("./custom-action-registry-CWFK5UDj.js");
33
33
  let zod = require("zod");
34
34
  let node_crypto = require("node:crypto");
35
35
  let _camstack_types_node = require("@camstack/types/node");
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { a as __toCommonJS, i as __require, n as __esmMin, o as __toESM$1, r as __exportAll, t as __commonJSMin$1 } from "./chunk-CNf5ZN-e.mjs";
2
- import { A as addonSettingsCapability, Dt as procedureAuthKey, Ft as scopesAllowDeviceCap, Jt as errMsg$1, Mt as resolveMethodAuth, Pt as scopesAllowAddon, Qt as DEVICE_STATUS_METHOD, Xt as DATAPLANE_SECRET_HEADER$1, Zt as DEVICE_SETTINGS_CONTRIBUTION_METHODS, _ as RUNTIME_DEFAULTS, _n as readinessKey, _t as logLevelAtMost, an as asJsonObject$1, at as isArrayOutputSchema, cn as createEvent, ct as isObjectInput, dn as expandCapMethods, dt as isVoidInput, ft as kebabToCamel, gn as parseJsonUnknown, h as METHOD_ACCESS_MAP, hn as parseJsonObject, ln as emitDownForOwnedCaps, mt as lifecycleJobSchema, nn as ReadinessRegistry, on as asNumber, ot as isCollectionArrayMethod, p as LOG_LEVEL_RANK, rn as ReadinessTimeoutError, sn as asString$1, t as ALL_CAPABILITY_DEFINITIONS, tt as extractNestedAddonId, vn as resolveCapMount, vt as looseSchema, wt as objectInputDeclaresAddonId, xn as EventCategory$1, yn as scopeKey } from "./dist-BX6SpI0i.mjs";
2
+ import { A as addonSettingsCapability, Dt as procedureAuthKey, Ft as scopesAllowDeviceCap, Jt as errMsg$1, Mt as resolveMethodAuth, Pt as scopesAllowAddon, Qt as DEVICE_STATUS_METHOD, Xt as DATAPLANE_SECRET_HEADER$1, Zt as DEVICE_SETTINGS_CONTRIBUTION_METHODS, _ as RUNTIME_DEFAULTS, _n as readinessKey, _t as logLevelAtMost, an as asJsonObject$1, at as isArrayOutputSchema, cn as createEvent, ct as isObjectInput, dn as expandCapMethods, dt as isVoidInput, ft as kebabToCamel, gn as parseJsonUnknown, h as METHOD_ACCESS_MAP, hn as parseJsonObject, ln as emitDownForOwnedCaps, mt as lifecycleJobSchema, nn as ReadinessRegistry, on as asNumber, ot as isCollectionArrayMethod, p as LOG_LEVEL_RANK, rn as ReadinessTimeoutError, sn as asString$1, t as ALL_CAPABILITY_DEFINITIONS, tt as extractNestedAddonId, vn as resolveCapMount, vt as looseSchema, wt as objectInputDeclaresAddonId, xn as EventCategory$1, yn as scopeKey } from "./dist-BIvXRexm.mjs";
3
3
  import { AlertCenterAddon } from "./builtins/alerts/alerts.addon.mjs";
4
4
  import "./builtins/alerts/index.mjs";
5
5
  import { t as formatLogLine } from "./formatter-B7qW8bPJ.mjs";
@@ -28,7 +28,7 @@ import { _ as fetchJson, a as createFileDataPlaneHandler, c as parseRangeHeader,
28
28
  import { C as registerLanHttpHandler, S as readLanHttpState, _ as DEFAULT_LAN_HTTP_PORT, a as writeTlsMode, b as bindPendingLanHttp, c as loadTlsCert, d as collectCertIdentity, f as CA_VALIDITY_DAYS, g as evaluateExistingCert, h as SERVER_AUTH_OID, i as writeExtraSans, l as reissueTlsLeaf, m as MAX_LEAF_VALIDITY_DAYS, n as readTlsAccessStatus, o as validateUploadedTls, p as LEAF_RENEWAL_WINDOW_DAYS, r as readTlsMode, s as ensureTlsCert, t as readExtraSans, u as CA_COMMON_NAME, v as allFamiliesListenHost, x as closeLanHttp, y as applyLanHttp } from "./tls-2xbgg78V.mjs";
29
29
  import { $ as buildUdsNativeCapProxy, $t as ARRAY_BUFFER_CENSUS_THRESHOLD_MB, A as createUdsLoggerWithControl, An as recordSocketFrame, At as HUB_MAIN_HEAP_WATCH_LABEL, B as readMoleculerFanoutMode, Bn as diffCapActionCensus, Bt as createLoopDelayMeter, C as ipcParentLink, Cn as createSocketPlaneMeter, Ct as runNpm, D as createUdsEventBus, Dn as readSocketQueues, Dt as HEAP_RECLAIM_TRIGGER_MB, E as createUdsEventBridge, En as formatSocketPlane, Et as HEAP_RECLAIM_STEADY_STATE_INTERVAL_MS, F as CapRouteError, Fn as CAP_ACTION_UNLABELLED, Ft as RUNNER_HEAP_WATCH_INTERVAL_MS, G as createLocalTransport, Gn as formatEventPlane, Gt as parseRssBudgetMb, H as PARENT_ROUTED_PROVIDER_ADDON_ID, Hn as createEventPlaneMeter, Ht as describeRss, I as classifyCapRoute, In as EMPTY_CAP_ACTION_READING, It as RUNNER_RSS_BUDGET_ENV, J as SocketChannel, Jt as startHeapWatch, K as UdsLocalTransportClient, Kt as reclaimIntervalMs, L as LocalChildClient, Ln as MAX_CAP_ACTIONS_PER_PEER, Lt as ZERO_LOOP_DELAY, M as AGENT_CAP_FWD_SERVICE, Mn as socketDirectionBytes, Mt as HUB_RSS_BUDGET_ENV, N as CapRouteResolver, Nn as socketDirectionMessages, Nt as RSS_BUDGET_REANNOUNCE_MIN_MS, O as udsChildLogToWorkerEntry, On as EMPTY_SOCKET_DIRECTION, Ot as HEAP_WATCH_INTERVAL_MS, P as callWithServiceDiscovery, Pn as CAP_ACTION_OVERFLOW_LABEL, Pt as RSS_BUDGET_RELEASE_RATIO, Q as buildNativeCapProxy, Qt as ARRAY_BUFFER_CENSUS_SUSTAIN_MS, R as LocalChildRegistry, Rn as capActionLabel, Rt as buildHeapSample, S as buildLinkChain, Sn as SOCKET_QUEUE_TOP_N, St as resolveNpmInvocation, T as createParentUnownedCallHandler, Tn as diffSocketPlane, Tt as HEAP_RECLAIM_MIN_INTERVAL_MS, U as __resetCapUsageRegistryForTests, Un as createEventPlaneReader, Ut as hubMainRssBudget, V as CapUsageRegistry, Vn as EVENT_PLANE_TOP_N, Vt as createV8Reclaimer, W as getCapUsageRegistry, Wn as diffEventPlane, Wt as nextRssBudgetState, X as FrameDecoder, Xt as strandedMb, Y as localEndpointPath, Yt as startRunnerHeapWatch, Z as encodeFrame, Zt as ARRAY_BUFFER_CENSUS_COOLDOWN_MS, _ as AddonDepsManager, _n as MESH_QUEUE_TOP_N, _t as CapabilityUnavailableError, a as createUdsAddonContext, an as DECISIVE_HEAP_SPACES, at as createAddonService, b as brokerCallForCap, bn as EMPTY_SOCKET_PLANE_BASELINE, bt as resolveAddonClass, c as getOrInitReadinessRegistryForClient, cn as formatHeapSpaces, ct as capActionName, d as clusterEventTopic, dn as selectReportedSpaces, dt as capServiceName, en as ARRAY_BUFFER_RELEASE_MIN_DROP_RATIO, et as createBrokerDeviceManagerApi, f as getBrokerEventBus, fn as OUTBOUND_QUEUE_COOLDOWN_MS, ft as parseCapAction, g as subscribePassthrough, gn as formatOutboundQueueVerdict, gt as CapabilityHandle, h as setNodeEventInterest, hn as createOutboundQueueGate, ht as DeviceRegistry, i as createAddonContext, in as isArrayBufferCensusReport, j as AGENT_CAP_FWD_ACTION, jn as sampleSocketDirection, jt as HUB_MAIN_RSS_BUDGET_MB, k as createUdsLogger, kn as createSocketDirectionCounters, kt as HEAP_WATCH_WARN_RATIO, l as setHubConnected, ln as heapSpaceField, lt as capActionSuffix, m as registerEventBusService, mn as OUTBOUND_QUEUE_THRESHOLD_BYTES, mt as serializeTypedArrays, n as installManifestPythonDeps, nn as createInspectorArrayBufferCensus, o as getWorkerDeviceRegistry, on as HEAP_SPACE_REPORT_MIN_MB, ot as validateProviderRegistrations, p as getMoleculerEventStats, pn as OUTBOUND_QUEUE_SUSTAIN_MS, pt as deserializeTypedArrays, q as UdsLocalTransportServer, qt as shouldReclaim, r as adaptBrokerToCluster, rn as formatArrayBufferCensus, rt as mountNativeCapService, s as getOrInitReadinessRegistry, sn as emitHeapDiagnosticReport, st as NATIVE_PROVIDER_SERVICE_INFIX, t as installManifestSystemDeps, tn as createArrayBufferCensusGate, u as EVENT_TOPIC_PREFIX, un as readHeapSpaces, ut as capBareAction, v as createKernelHwAccel, vn as createMeshQueueReader, vt as copyBundledNativeModules, w as localProviderLink, wn as createSocketPlaneReader, wt as createAddonDataPlaneFacility, x as brokerTransportLink, xn as SOCKET_PLANE_TOP_N, xt as buildNpmChildEnv, y as resolveHwAccel, yn as formatMeshQueue, yt as installManifestNativeDeps, z as UDS_NO_ROUTE_PREFIX, zn as createCapActionCensus, zt as createDeferredHeapWatchSink } from "./manifest-system-deps-BEj9Dpu1.mjs";
30
30
  import { n as getSinglePidStats, t as getPidStats } from "./resource-monitor-Vp0bPV3U.mjs";
31
- import { t as CustomActionRegistry } from "./custom-action-registry-gaO1AlT2.mjs";
31
+ import { t as CustomActionRegistry } from "./custom-action-registry-CFHYDHAu.mjs";
32
32
  import { z } from "zod";
33
33
  import { createHash, randomUUID, timingSafeEqual } from "node:crypto";
34
34
  import { PYTHON_VERSION, buildBinaryPath, downloadBinary, ensureBinary, ensureFfmpeg, ensurePython, findInPath, getFfmpegDownloadUrl, getPlatformInfo, getPythonDownloadUrl, installPythonPackages, installPythonRequirements } from "@camstack/types/node";
@@ -1,4 +1,4 @@
1
- import { an as asJsonObject } from "./dist-BX6SpI0i.mjs";
1
+ import { an as asJsonObject } from "./dist-BIvXRexm.mjs";
2
2
  //#region src/builtins/sqlite-storage/retired-settings-keys.ts
3
3
  /**
4
4
  * Is THIS node the one whose settings store is the cluster's authority?
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-CEIkHEdy.js");
1
+ const require_dist = require("./dist-D3lJV9M7.js");
2
2
  //#region src/builtins/sqlite-storage/retired-settings-keys.ts
3
3
  /**
4
4
  * Is THIS node the one whose settings store is the cluster's authority?
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/system",
3
- "version": "1.2.232",
3
+ "version": "1.2.233",
4
4
  "description": "Core addon for CamStack — builtins, pipeline, process management, auth, logging, events",
5
5
  "keywords": [
6
6
  "camstack",