@camstack/addon-pipeline 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 (32) hide show
  1. package/dist/audio-analyzer/index.js +2 -2
  2. package/dist/audio-analyzer/index.mjs +2 -2
  3. package/dist/{default-detection-model-C7fsHtHQ.js → default-detection-model-CDhXxOJQ.js} +1 -1
  4. package/dist/{default-detection-model-DC4yVaFM.mjs → default-detection-model-I8kuDTEi.mjs} +1 -1
  5. package/dist/detection-pipeline/index.js +4 -4
  6. package/dist/detection-pipeline/index.mjs +4 -4
  7. package/dist/{dist-DTPYOq7J.mjs → dist-But4XMDJ.mjs} +107 -6
  8. package/dist/{dist-p5lZW8pr.js → dist-NX0e_oWp.js} +107 -6
  9. package/dist/motion-wasm/index.js +1 -1
  10. package/dist/motion-wasm/index.mjs +1 -1
  11. package/dist/{node-Cz92fVGW.mjs → node-BHxRrsoX.mjs} +1 -1
  12. package/dist/{node-CGVUk5S9.js → node-BgM4n8D4.js} +1 -1
  13. package/dist/pipeline-runner/index.js +205 -17
  14. package/dist/pipeline-runner/index.mjs +205 -17
  15. package/dist/{process-memory-BwijtYhM.mjs → process-memory-C3-EOjjf.mjs} +1 -1
  16. package/dist/{process-memory-COypUeEc.js → process-memory-C5_Mo9TI.js} +1 -1
  17. package/dist/recorder/index.js +3 -2
  18. package/dist/recorder/index.mjs +3 -2
  19. package/dist/{segment-demux-js-B-yzHYVc.js → segment-demux-js-BAD7i9RI.js} +1 -1
  20. package/dist/{segment-demux-js-CyaNDtrw.mjs → segment-demux-js-CVZACSOh.mjs} +1 -1
  21. package/dist/stream-broker/_stub.js +2 -2
  22. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-B9KO-igY.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-DN-9qAgC.mjs} +2 -2
  23. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D3XkHB88.mjs +26 -0
  24. package/dist/stream-broker/{_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-JoG-yDpV.mjs → _virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-DDCieNDB.mjs} +1 -1
  25. package/dist/stream-broker/demux-worker-child.js +1 -1
  26. package/dist/stream-broker/demux-worker-child.mjs +1 -1
  27. package/dist/stream-broker/{hostInit-CDwsQyIR.mjs → hostInit-CT06n_gA.mjs} +2 -2
  28. package/dist/stream-broker/index.js +3 -3
  29. package/dist/stream-broker/index.mjs +3 -3
  30. package/dist/stream-broker/remoteEntry.js +1 -1
  31. package/package.json +1 -1
  32. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-mnvO611B.mjs +0 -26
@@ -3,8 +3,8 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-emK7D4bc.js");
6
- const require_dist = require("../dist-p5lZW8pr.js");
7
- const require_process_memory = require("../process-memory-COypUeEc.js");
6
+ const require_dist = require("../dist-NX0e_oWp.js");
7
+ const require_process_memory = require("../process-memory-C5_Mo9TI.js");
8
8
  let node_fs = require("node:fs");
9
9
  node_fs = require_chunk.__toESM(node_fs);
10
10
  let node_path = require("node:path");
@@ -1,6 +1,6 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { $t as hydrateSchema, At as resolvePoolMemoryPolicy, Kt as BaseAddon, N as audioAnalysisCapability, P as audioAnalyzerCapability, Qt as expandAudioChunkToF32le, Xt as audioChunkBytesPerSample, bn as EventCategory, ct as mapAudioLabelToMacro, n as AUDIO_BACKEND_CHOICES, rn as nodePin, s as DEFAULT_AUDIO_ANALYZER_CONFIG, w as PoolMemoryWatchdog, y as HF_BASE_URL, zt as errMsg } from "../dist-DTPYOq7J.mjs";
3
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-BwijtYhM.mjs";
2
+ import { $t as hydrateSchema, At as resolvePoolMemoryPolicy, Kt as BaseAddon, N as audioAnalysisCapability, P as audioAnalyzerCapability, Qt as expandAudioChunkToF32le, Xt as audioChunkBytesPerSample, bn as EventCategory, ct as mapAudioLabelToMacro, n as AUDIO_BACKEND_CHOICES, rn as nodePin, s as DEFAULT_AUDIO_ANALYZER_CONFIG, w as PoolMemoryWatchdog, y as HF_BASE_URL, zt as errMsg } from "../dist-But4XMDJ.mjs";
3
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-C3-EOjjf.mjs";
4
4
  import * as fs from "node:fs";
5
5
  import * as path$1 from "node:path";
6
6
  import { downloadFile } from "@camstack/system/addon-utils";
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-p5lZW8pr.js");
1
+ const require_dist = require("./dist-NX0e_oWp.js");
2
2
  let node_crypto = require("node:crypto");
3
3
  //#region src/detection-pipeline/pipeline/landmark-precision-gate.ts
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { F as audioKindId, a as COCO_80_LABELS, o as COCO_TO_MACRO, r as AUDIO_MACRO_LABELS, rt as hfModelUrl } from "./dist-DTPYOq7J.mjs";
1
+ import { F as audioKindId, a as COCO_80_LABELS, o as COCO_TO_MACRO, r as AUDIO_MACRO_LABELS, rt as hfModelUrl } from "./dist-But4XMDJ.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  //#region src/detection-pipeline/pipeline/landmark-precision-gate.ts
4
4
  /**
@@ -3,11 +3,11 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-emK7D4bc.js");
6
- const require_dist = require("../dist-p5lZW8pr.js");
7
- const require_node = require("../node-CGVUk5S9.js");
8
- const require_default_detection_model = require("../default-detection-model-C7fsHtHQ.js");
6
+ const require_dist = require("../dist-NX0e_oWp.js");
7
+ const require_node = require("../node-BgM4n8D4.js");
8
+ const require_default_detection_model = require("../default-detection-model-CDhXxOJQ.js");
9
9
  const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
10
- const require_process_memory = require("../process-memory-COypUeEc.js");
10
+ const require_process_memory = require("../process-memory-C5_Mo9TI.js");
11
11
  let node_os = require("node:os");
12
12
  node_os = require_chunk.__toESM(node_os);
13
13
  let node_fs = require("node:fs");
@@ -1,9 +1,9 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { $t as hydrateSchema, At as resolvePoolMemoryPolicy, Dt as resolveClusterStepModelId, H as defaultDeviceFor$1, Kt as BaseAddon, Lt as supportedRuntimes$1, Mt as runtimeDevices$1, Q as evaluateZoneRules, X as enumerateInferenceDevices, Zt as createEvent, _t as pickClusterStepModels, bn as EventCategory, c as DEFAULT_CLUSTER_STEP_MODELS, hn as object, ht as overlayClusterStepSettings, in as parseJsonUnknown, it as inferModelProvider, j as YAMNET_TO_MACRO, l as DEFAULT_CLUSTER_STEP_SETTINGS, ln as array, m as DEVICE_BACKEND_TO_FORMAT, ot as loadContributionCapability, q as detectionPipelineCapability, rn as nodePin, sn as sleep, t as APPLE_SA_TO_MACRO, vn as string, vt as pickClusterStepSettings, w as PoolMemoryWatchdog, xt as pipelineExecutorCapability, yn as union, zt as errMsg } from "../dist-DTPYOq7J.mjs";
3
- import { o as readProcessCost } from "../node-Cz92fVGW.mjs";
4
- import { a as ALL_PIPELINE_STEPS, c as getStep, d as landmarkPrecisionVerdict, l as getStepDefinition, n as resolveDefaultDetectionModel, o as ALL_STEPS, r as localFrameRegistry, s as getDefaultModelForFormat, u as resolveModelForFormat } from "../default-detection-model-DC4yVaFM.mjs";
2
+ import { $t as hydrateSchema, At as resolvePoolMemoryPolicy, Dt as resolveClusterStepModelId, H as defaultDeviceFor$1, Kt as BaseAddon, Lt as supportedRuntimes$1, Mt as runtimeDevices$1, Q as evaluateZoneRules, X as enumerateInferenceDevices, Zt as createEvent, _t as pickClusterStepModels, bn as EventCategory, c as DEFAULT_CLUSTER_STEP_MODELS, hn as object, ht as overlayClusterStepSettings, in as parseJsonUnknown, it as inferModelProvider, j as YAMNET_TO_MACRO, l as DEFAULT_CLUSTER_STEP_SETTINGS, ln as array, m as DEVICE_BACKEND_TO_FORMAT, ot as loadContributionCapability, q as detectionPipelineCapability, rn as nodePin, sn as sleep, t as APPLE_SA_TO_MACRO, vn as string, vt as pickClusterStepSettings, w as PoolMemoryWatchdog, xt as pipelineExecutorCapability, yn as union, zt as errMsg } from "../dist-But4XMDJ.mjs";
3
+ import { o as readProcessCost } from "../node-BHxRrsoX.mjs";
4
+ import { a as ALL_PIPELINE_STEPS, c as getStep, d as landmarkPrecisionVerdict, l as getStepDefinition, n as resolveDefaultDetectionModel, o as ALL_STEPS, r as localFrameRegistry, s as getDefaultModelForFormat, u as resolveModelForFormat } from "../default-detection-model-I8kuDTEi.mjs";
5
5
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
6
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-BwijtYhM.mjs";
6
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-C3-EOjjf.mjs";
7
7
  import * as os from "node:os";
8
8
  import * as fs from "node:fs";
9
9
  import * as path$1 from "node:path";
@@ -5360,7 +5360,7 @@ var ZodIssueCode = {
5360
5360
  var ZodFirstPartyTypeKind;
5361
5361
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5362
5362
  //#endregion
5363
- //#region ../types/dist/sleep-DEuj7E3j.mjs
5363
+ //#region ../types/dist/sleep-BEyvfshj.mjs
5364
5364
  /**
5365
5365
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5366
5366
  * window to float samples (D455).
@@ -23916,6 +23916,14 @@ var MotionSourceEnum = _enum([
23916
23916
  */
23917
23917
  var MotionSourcesSchema = array(MotionSourceEnum);
23918
23918
  /**
23919
+ * Which root detectors a camera runs. Deliberately the SAME vocabulary
23920
+ * post-analysis already tags every detection with (`DetectionSource`) rather
23921
+ * than a second spelling of the same two ideas — the value an operator picks
23922
+ * here is the value that comes back on the track, the overlay and the debug
23923
+ * row.
23924
+ */
23925
+ var DetectionSourcesSchema = array(DetectionSourceSchema);
23926
+ /**
23919
23927
  * Input shape for `pipeline-runner.reportMotion` cap method. Exported
23920
23928
  * so cap-side consumers (the orchestrator forward, the runner addon's
23921
23929
  * cap implementation, tests) can reuse the type instead of redeclaring
@@ -24066,6 +24074,35 @@ var RunnerCameraConfigSchema = object({
24066
24074
  * events; the orchestrator forwards to `reportMotion`.
24067
24075
  */
24068
24076
  motionSources: MotionSourcesSchema.default(["analyzer"]),
24077
+ /**
24078
+ * WHICH root detector runs for this camera. The detection counterpart of
24079
+ * {@link motionSources}, same shape and same discipline: a per-camera list
24080
+ * of sources the system understands, vendor-agnostic, owned here.
24081
+ *
24082
+ * - `pipeline` — this runner's own root step on decoded pixels (`steps`).
24083
+ * - `onboard` — the CAMERA's own detector, admitted only when it is named
24084
+ * here. Its boxes reach post-analysis on the same
24085
+ * `PipelineInferenceResult` payload as the pipeline's, so an onboard-born
24086
+ * track gets the same tracker, the same overlay and the same detail
24087
+ * subtree (face / plate / embedding).
24088
+ *
24089
+ * `['onboard']` alone is the REPLACEMENT: this runner's root step does not
24090
+ * run, and that is where a camera with a usable onboard detector buys back
24091
+ * its share of the accelerator. It saves the root inference, not the decode
24092
+ * — the detail subtree still needs pixels to cut crops from.
24093
+ *
24094
+ * A camera whose onboard detections carry no geometry cannot serve as a root
24095
+ * step at all (there is nothing to track), and the cap that knows this says
24096
+ * so on `native-object-detection.getOptions().geometry`. On Reolink that is
24097
+ * every battery camera: the boxes ride a sub-stream a battery camera never
24098
+ * attaches, so such a camera stays on `['pipeline']` and its onboard AI is
24099
+ * worth exactly what it already is — a wake signal with a class.
24100
+ *
24101
+ * Defaults to `['pipeline']`, which is byte-for-byte today's behaviour: a
24102
+ * vendor never turns a detector on for the operator, and neither does a
24103
+ * default.
24104
+ */
24105
+ detectionSources: DetectionSourcesSchema.default(["pipeline"]),
24069
24106
  pipelineEnabled: boolean().default(true),
24070
24107
  /** Ordered tree of video steps. Absent → runner skips video detection. */
24071
24108
  steps: array(PipelineStepInputSchema).readonly().optional(),
@@ -30106,7 +30143,7 @@ var NativeDetectionSchema = object({
30106
30143
  /** Firmware-provided confidence [0..1]. Reolink pushes don't carry it → undefined. */
30107
30144
  confidence: number().min(0).max(1).optional()
30108
30145
  });
30109
- object({
30146
+ var NativeObjectDetectionStatusSchema = object({
30110
30147
  /**
30111
30148
  * Last observed instance per class. Missing entries mean the class
30112
30149
  * is supported but nothing has been seen since the provider started.
@@ -30123,14 +30160,56 @@ object({
30123
30160
  supportedClasses: array(NativeObjectClassEnum).readonly(),
30124
30161
  /**
30125
30162
  * Whether forwarding of onboard AI detections is enabled for this device.
30126
- * Default FALSE (opt-in, cold-start) — onboard AI pushes are noisy/sparse and
30127
- * churn the tracker, so forwarding stays off until the operator enables it.
30163
+ *
30164
+ * Cold-start OFF on every camera. A vendor does not decide which detector a
30165
+ * camera runs — that is the operator's choice, and it is made where every
30166
+ * other detection choice is made. `geometry` on
30167
+ * {@link NativeObjectDetectionOptionsSchema} is how the form says what the
30168
+ * choice would buy this particular camera.
30128
30169
  */
30129
30170
  enabled: boolean()
30130
- }).extend({
30171
+ });
30172
+ /**
30173
+ * WHEN a camera's onboard detections carry geometry.
30174
+ *
30175
+ * - `boxed` — always. The provider holds a standing channel for the boxes, so
30176
+ * a detection is a trackable subject whenever the camera sees one.
30177
+ * - `while-streaming` — only while some stream of this camera is already open.
30178
+ * The boxes ride the video's own side-channel rather than a feed of their
30179
+ * own, so they cost nothing and they exist only when something is pulling.
30180
+ * On Reolink this is every BATTERY camera: a persistent second feed is real
30181
+ * radio drain, but a camera that is awake is awake precisely because
30182
+ * something is in front of it, and its stream is already being pulled.
30183
+ * - `flag-only` — never. The firmware ships the class and nothing else; the
30184
+ * pipeline needs geometry to make a subject, so such a push reaches the
30185
+ * tracker as motion and no further.
30186
+ *
30187
+ * Reported and not inferred, because the operator's question in front of the
30188
+ * picker is "what do I get", and these are three different answers (D14: the
30189
+ * derived form is only as honest as `getOptions`).
30190
+ */
30191
+ var NativeObjectGeometryEnum = _enum([
30192
+ "boxed",
30193
+ "while-streaming",
30194
+ "flag-only"
30195
+ ]);
30196
+ var NativeObjectDetectionOptionsSchema = object({
30197
+ /** Classes this firmware can detect — the same list the status reports. */
30198
+ supportedClasses: array(NativeObjectClassEnum).readonly(),
30199
+ /** What a detection from this camera carries. */
30200
+ geometry: NativeObjectGeometryEnum
30201
+ });
30202
+ var NativeObjectDetectionSettingsPatchSchema = object({ enabled: boolean().optional() });
30203
+ NativeObjectDetectionStatusSchema.extend({
30131
30204
  /** Required by createRuntimeStateBridge — epoch ms of last refresh. */
30132
30205
  lastFetchedAt: number() });
30133
- DeviceType.Camera, method(object({
30206
+ DeviceType.Camera, method(object({ deviceId: number() }), NativeObjectDetectionOptionsSchema), method(object({
30207
+ deviceId: number(),
30208
+ settings: NativeObjectDetectionSettingsPatchSchema
30209
+ }), _void(), {
30210
+ kind: "mutation",
30211
+ auth: "admin"
30212
+ }), method(object({
30134
30213
  deviceId: number(),
30135
30214
  enabled: boolean()
30136
30215
  }), _void(), {
@@ -37282,12 +37361,24 @@ Object.freeze({
37282
37361
  addonId: null,
37283
37362
  access: "create"
37284
37363
  },
37364
+ "nativeObjectDetection.getOptions": {
37365
+ capName: "native-object-detection",
37366
+ capScope: "device",
37367
+ addonId: null,
37368
+ access: "view"
37369
+ },
37285
37370
  "nativeObjectDetection.setEnabled": {
37286
37371
  capName: "native-object-detection",
37287
37372
  capScope: "device",
37288
37373
  addonId: null,
37289
37374
  access: "create"
37290
37375
  },
37376
+ "nativeObjectDetection.setSettings": {
37377
+ capName: "native-object-detection",
37378
+ capScope: "device",
37379
+ addonId: null,
37380
+ access: "create"
37381
+ },
37291
37382
  "navigation.getFeatures": {
37292
37383
  capName: "navigation",
37293
37384
  capScope: "device",
@@ -41514,11 +41605,21 @@ Object.freeze({
41514
41605
  form: "single",
41515
41606
  optional: false
41516
41607
  }],
41608
+ "nativeObjectDetection.getOptions": [{
41609
+ name: "deviceId",
41610
+ form: "single",
41611
+ optional: false
41612
+ }],
41517
41613
  "nativeObjectDetection.setEnabled": [{
41518
41614
  name: "deviceId",
41519
41615
  form: "single",
41520
41616
  optional: false
41521
41617
  }],
41618
+ "nativeObjectDetection.setSettings": [{
41619
+ name: "deviceId",
41620
+ form: "single",
41621
+ optional: false
41622
+ }],
41522
41623
  "navigation.getFeatures": [{
41523
41624
  name: "deviceId",
41524
41625
  form: "single",
@@ -5360,7 +5360,7 @@ var ZodIssueCode = {
5360
5360
  var ZodFirstPartyTypeKind;
5361
5361
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5362
5362
  //#endregion
5363
- //#region ../types/dist/sleep-DEuj7E3j.mjs
5363
+ //#region ../types/dist/sleep-BEyvfshj.mjs
5364
5364
  /**
5365
5365
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5366
5366
  * window to float samples (D455).
@@ -23916,6 +23916,14 @@ var MotionSourceEnum = _enum([
23916
23916
  */
23917
23917
  var MotionSourcesSchema = array(MotionSourceEnum);
23918
23918
  /**
23919
+ * Which root detectors a camera runs. Deliberately the SAME vocabulary
23920
+ * post-analysis already tags every detection with (`DetectionSource`) rather
23921
+ * than a second spelling of the same two ideas — the value an operator picks
23922
+ * here is the value that comes back on the track, the overlay and the debug
23923
+ * row.
23924
+ */
23925
+ var DetectionSourcesSchema = array(DetectionSourceSchema);
23926
+ /**
23919
23927
  * Input shape for `pipeline-runner.reportMotion` cap method. Exported
23920
23928
  * so cap-side consumers (the orchestrator forward, the runner addon's
23921
23929
  * cap implementation, tests) can reuse the type instead of redeclaring
@@ -24066,6 +24074,35 @@ var RunnerCameraConfigSchema = object({
24066
24074
  * events; the orchestrator forwards to `reportMotion`.
24067
24075
  */
24068
24076
  motionSources: MotionSourcesSchema.default(["analyzer"]),
24077
+ /**
24078
+ * WHICH root detector runs for this camera. The detection counterpart of
24079
+ * {@link motionSources}, same shape and same discipline: a per-camera list
24080
+ * of sources the system understands, vendor-agnostic, owned here.
24081
+ *
24082
+ * - `pipeline` — this runner's own root step on decoded pixels (`steps`).
24083
+ * - `onboard` — the CAMERA's own detector, admitted only when it is named
24084
+ * here. Its boxes reach post-analysis on the same
24085
+ * `PipelineInferenceResult` payload as the pipeline's, so an onboard-born
24086
+ * track gets the same tracker, the same overlay and the same detail
24087
+ * subtree (face / plate / embedding).
24088
+ *
24089
+ * `['onboard']` alone is the REPLACEMENT: this runner's root step does not
24090
+ * run, and that is where a camera with a usable onboard detector buys back
24091
+ * its share of the accelerator. It saves the root inference, not the decode
24092
+ * — the detail subtree still needs pixels to cut crops from.
24093
+ *
24094
+ * A camera whose onboard detections carry no geometry cannot serve as a root
24095
+ * step at all (there is nothing to track), and the cap that knows this says
24096
+ * so on `native-object-detection.getOptions().geometry`. On Reolink that is
24097
+ * every battery camera: the boxes ride a sub-stream a battery camera never
24098
+ * attaches, so such a camera stays on `['pipeline']` and its onboard AI is
24099
+ * worth exactly what it already is — a wake signal with a class.
24100
+ *
24101
+ * Defaults to `['pipeline']`, which is byte-for-byte today's behaviour: a
24102
+ * vendor never turns a detector on for the operator, and neither does a
24103
+ * default.
24104
+ */
24105
+ detectionSources: DetectionSourcesSchema.default(["pipeline"]),
24069
24106
  pipelineEnabled: boolean().default(true),
24070
24107
  /** Ordered tree of video steps. Absent → runner skips video detection. */
24071
24108
  steps: array(PipelineStepInputSchema).readonly().optional(),
@@ -30106,7 +30143,7 @@ var NativeDetectionSchema = object({
30106
30143
  /** Firmware-provided confidence [0..1]. Reolink pushes don't carry it → undefined. */
30107
30144
  confidence: number().min(0).max(1).optional()
30108
30145
  });
30109
- object({
30146
+ var NativeObjectDetectionStatusSchema = object({
30110
30147
  /**
30111
30148
  * Last observed instance per class. Missing entries mean the class
30112
30149
  * is supported but nothing has been seen since the provider started.
@@ -30123,14 +30160,56 @@ object({
30123
30160
  supportedClasses: array(NativeObjectClassEnum).readonly(),
30124
30161
  /**
30125
30162
  * Whether forwarding of onboard AI detections is enabled for this device.
30126
- * Default FALSE (opt-in, cold-start) — onboard AI pushes are noisy/sparse and
30127
- * churn the tracker, so forwarding stays off until the operator enables it.
30163
+ *
30164
+ * Cold-start OFF on every camera. A vendor does not decide which detector a
30165
+ * camera runs — that is the operator's choice, and it is made where every
30166
+ * other detection choice is made. `geometry` on
30167
+ * {@link NativeObjectDetectionOptionsSchema} is how the form says what the
30168
+ * choice would buy this particular camera.
30128
30169
  */
30129
30170
  enabled: boolean()
30130
- }).extend({
30171
+ });
30172
+ /**
30173
+ * WHEN a camera's onboard detections carry geometry.
30174
+ *
30175
+ * - `boxed` — always. The provider holds a standing channel for the boxes, so
30176
+ * a detection is a trackable subject whenever the camera sees one.
30177
+ * - `while-streaming` — only while some stream of this camera is already open.
30178
+ * The boxes ride the video's own side-channel rather than a feed of their
30179
+ * own, so they cost nothing and they exist only when something is pulling.
30180
+ * On Reolink this is every BATTERY camera: a persistent second feed is real
30181
+ * radio drain, but a camera that is awake is awake precisely because
30182
+ * something is in front of it, and its stream is already being pulled.
30183
+ * - `flag-only` — never. The firmware ships the class and nothing else; the
30184
+ * pipeline needs geometry to make a subject, so such a push reaches the
30185
+ * tracker as motion and no further.
30186
+ *
30187
+ * Reported and not inferred, because the operator's question in front of the
30188
+ * picker is "what do I get", and these are three different answers (D14: the
30189
+ * derived form is only as honest as `getOptions`).
30190
+ */
30191
+ var NativeObjectGeometryEnum = _enum([
30192
+ "boxed",
30193
+ "while-streaming",
30194
+ "flag-only"
30195
+ ]);
30196
+ var NativeObjectDetectionOptionsSchema = object({
30197
+ /** Classes this firmware can detect — the same list the status reports. */
30198
+ supportedClasses: array(NativeObjectClassEnum).readonly(),
30199
+ /** What a detection from this camera carries. */
30200
+ geometry: NativeObjectGeometryEnum
30201
+ });
30202
+ var NativeObjectDetectionSettingsPatchSchema = object({ enabled: boolean().optional() });
30203
+ NativeObjectDetectionStatusSchema.extend({
30131
30204
  /** Required by createRuntimeStateBridge — epoch ms of last refresh. */
30132
30205
  lastFetchedAt: number() });
30133
- DeviceType.Camera, method(object({
30206
+ DeviceType.Camera, method(object({ deviceId: number() }), NativeObjectDetectionOptionsSchema), method(object({
30207
+ deviceId: number(),
30208
+ settings: NativeObjectDetectionSettingsPatchSchema
30209
+ }), _void(), {
30210
+ kind: "mutation",
30211
+ auth: "admin"
30212
+ }), method(object({
30134
30213
  deviceId: number(),
30135
30214
  enabled: boolean()
30136
30215
  }), _void(), {
@@ -37282,12 +37361,24 @@ Object.freeze({
37282
37361
  addonId: null,
37283
37362
  access: "create"
37284
37363
  },
37364
+ "nativeObjectDetection.getOptions": {
37365
+ capName: "native-object-detection",
37366
+ capScope: "device",
37367
+ addonId: null,
37368
+ access: "view"
37369
+ },
37285
37370
  "nativeObjectDetection.setEnabled": {
37286
37371
  capName: "native-object-detection",
37287
37372
  capScope: "device",
37288
37373
  addonId: null,
37289
37374
  access: "create"
37290
37375
  },
37376
+ "nativeObjectDetection.setSettings": {
37377
+ capName: "native-object-detection",
37378
+ capScope: "device",
37379
+ addonId: null,
37380
+ access: "create"
37381
+ },
37291
37382
  "navigation.getFeatures": {
37292
37383
  capName: "navigation",
37293
37384
  capScope: "device",
@@ -41514,11 +41605,21 @@ Object.freeze({
41514
41605
  form: "single",
41515
41606
  optional: false
41516
41607
  }],
41608
+ "nativeObjectDetection.getOptions": [{
41609
+ name: "deviceId",
41610
+ form: "single",
41611
+ optional: false
41612
+ }],
41517
41613
  "nativeObjectDetection.setEnabled": [{
41518
41614
  name: "deviceId",
41519
41615
  form: "single",
41520
41616
  optional: false
41521
41617
  }],
41618
+ "nativeObjectDetection.setSettings": [{
41619
+ name: "deviceId",
41620
+ form: "single",
41621
+ optional: false
41622
+ }],
41522
41623
  "navigation.getFeatures": [{
41523
41624
  name: "deviceId",
41524
41625
  form: "single",
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-p5lZW8pr.js");
5
+ const require_dist = require("../dist-NX0e_oWp.js");
6
6
  const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
7
7
  let node_fs = require("node:fs");
8
8
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { $t as hydrateSchema, Kt as BaseAddon, Q as evaluateZoneRules, Yt as DeviceType, mt as motionDetectionCapability } from "../dist-DTPYOq7J.mjs";
1
+ import { $t as hydrateSchema, Kt as BaseAddon, Q as evaluateZoneRules, Yt as DeviceType, mt as motionDetectionCapability } from "../dist-But4XMDJ.mjs";
2
2
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
3
3
  import { readFileSync } from "node:fs";
4
4
  import { join } from "node:path";
@@ -1,4 +1,4 @@
1
- import { Ht as buildFfmpegArgs, Vt as Fmp4BoxSplitter, Wt as isSoftwareDecode, zt as errMsg } from "./dist-DTPYOq7J.mjs";
1
+ import { Ht as buildFfmpegArgs, Vt as Fmp4BoxSplitter, Wt as isSoftwareDecode, zt as errMsg } from "./dist-But4XMDJ.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { realpathSync } from "node:fs";
4
4
  import path from "node:path";
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require("./chunk-emK7D4bc.js");
2
- const require_dist = require("./dist-p5lZW8pr.js");
2
+ const require_dist = require("./dist-NX0e_oWp.js");
3
3
  let node_crypto = require("node:crypto");
4
4
  let node_fs = require("node:fs");
5
5
  node_fs = require_chunk.__toESM(node_fs, 1);