@camstack/addon-pipeline 1.1.55 → 1.1.56

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 (37) hide show
  1. package/dist/audio-analyzer/index.js +1 -1
  2. package/dist/audio-analyzer/index.mjs +1 -1
  3. package/dist/detection-pipeline/index.js +23 -16
  4. package/dist/detection-pipeline/index.mjs +23 -16
  5. package/dist/{dist-DI57FC8K.js → dist-ClE6_i0p.js} +942 -38
  6. package/dist/{dist-RWGGPwVx.mjs → dist-CrjLGrkj.mjs} +942 -38
  7. package/dist/motion-wasm/index.js +1 -1
  8. package/dist/motion-wasm/index.mjs +1 -1
  9. package/dist/pipeline-runner/index.js +119 -11
  10. package/dist/pipeline-runner/index.mjs +119 -11
  11. package/dist/recorder/index.js +1 -1
  12. package/dist/recorder/index.mjs +1 -1
  13. package/dist/{remote-source-plane-DU0aRSPv.mjs → remote-source-plane-B28iGi7h.mjs} +1 -1
  14. package/dist/{remote-source-plane-CHgvzzA6.js → remote-source-plane-BAqEHSgm.js} +1 -1
  15. package/dist/session-decode/decode-worker-child.js +5 -3
  16. package/dist/session-decode/decode-worker-child.mjs +5 -3
  17. package/dist/{step-definitions-CNBFKjZe.js → step-definitions-C9kUXgC7.js} +2 -2
  18. package/dist/{step-definitions-CP9kVSml.mjs → step-definitions-dCghpdRo.mjs} +2 -2
  19. package/dist/stream-broker/_stub.js +79 -79
  20. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-mDCPzmT3.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-D4xH4Tm-.mjs} +2 -2
  21. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D2z_vRMH.mjs +26 -0
  22. package/dist/stream-broker/{_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-Dn_pxzP-.mjs → _virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-TWCUWhCm.mjs} +2 -2
  23. package/dist/stream-broker/{hostInit-GM_CI22k.mjs → hostInit-Di9WUNlQ.mjs} +2 -2
  24. package/dist/stream-broker/index.js +60 -3
  25. package/dist/stream-broker/index.mjs +60 -3
  26. package/dist/stream-broker/remoteEntry.js +1 -1
  27. package/embed-dist/assets/{MaskShapeCanvas-DI4BY7W2-BChW0ntM.js → MaskShapeCanvas-DI4BY7W2-Ca93F1js.js} +1 -1
  28. package/embed-dist/assets/{MotionZonesSettings-NcxxQN8r-DDzqEbSe.js → MotionZonesSettings-NcxxQN8r-CDqgb-WA.js} +1 -1
  29. package/embed-dist/assets/{PrivacyMaskSettings-APgPLF7p-B879GXaf.js → PrivacyMaskSettings-APgPLF7p-BlxPhY_w.js} +1 -1
  30. package/embed-dist/assets/index-B23riUw8.js +81 -0
  31. package/embed-dist/assets/index-Bmpl9O1K.css +2 -0
  32. package/embed-dist/index.html +2 -2
  33. package/package.json +1 -1
  34. package/python/inference_pool.py +11 -1
  35. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-B3gTdHEh.mjs +0 -26
  36. package/embed-dist/assets/index-CC06JBcl.css +0 -2
  37. package/embed-dist/assets/index-CNjQ5rAE.js +0 -81
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-D6vf50IK.js");
6
- const require_dist = require("../dist-DI57FC8K.js");
6
+ const require_dist = require("../dist-ClE6_i0p.js");
7
7
  const require_node_topology_platform = require("../node-topology-platform-CFZ7F4xW.js");
8
8
  const require_model_download_service_C_IHWnXx = require("../model-download-service-C-IHWnXx-BLXzxpRB.js");
9
9
  let node_fs = require("node:fs");
@@ -1,5 +1,5 @@
1
1
  import { t as __require } from "../chunk-BdkLduGY.mjs";
2
- import { C as mapAudioLabelToMacro, I as errMsg, L as BaseAddon, U as hydrateSchema, h as audioAnalyzerCapability, l as HF_BASE_URL, m as audioAnalysisCapability, n as AUDIO_BACKEND_CHOICES, o as DEFAULT_AUDIO_ANALYZER_CONFIG } from "../dist-RWGGPwVx.mjs";
2
+ import { C as mapAudioLabelToMacro, I as errMsg, L as BaseAddon, U as hydrateSchema, h as audioAnalyzerCapability, l as HF_BASE_URL, m as audioAnalysisCapability, n as AUDIO_BACKEND_CHOICES, o as DEFAULT_AUDIO_ANALYZER_CONFIG } from "../dist-CrjLGrkj.mjs";
3
3
  import { t as pickNodePlatformArch } from "../node-topology-platform-BkR_k6WT.mjs";
4
4
  import { r as downloadFile } from "../model-download-service-C-IHWnXx-BPy6aoAx.mjs";
5
5
  import * as fs from "node:fs";
@@ -3,8 +3,8 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-D6vf50IK.js");
6
- const require_dist = require("../dist-DI57FC8K.js");
7
- const require_step_definitions = require("../step-definitions-CNBFKjZe.js");
6
+ const require_dist = require("../dist-ClE6_i0p.js");
7
+ const require_step_definitions = require("../step-definitions-C9kUXgC7.js");
8
8
  const require_node_topology_platform = require("../node-topology-platform-CFZ7F4xW.js");
9
9
  const require_model_download_service_C_IHWnXx = require("../model-download-service-C-IHWnXx-BLXzxpRB.js");
10
10
  let _camstack_shm_ring = require("@camstack/shm-ring");
@@ -2860,12 +2860,19 @@ var PipelineExecutor = class {
2860
2860
  /** Per-key last-warn timestamps, so a persistently-failing/skipping child
2861
2861
  * step surfaces a diagnostic without spamming the log every frame. */
2862
2862
  warnThrottleAt = /* @__PURE__ */ new Map();
2863
- throttledWarn(key, everyMs, message, meta) {
2863
+ throttledWarn(key, everyMs, message, meta, deviceId) {
2864
2864
  const logger = this.opts.logger;
2865
2865
  if (!logger) return;
2866
2866
  const now = Date.now();
2867
2867
  if (now - (this.warnThrottleAt.get(key) ?? 0) < everyMs) return;
2868
2868
  this.warnThrottleAt.set(key, now);
2869
+ if (deviceId !== void 0) {
2870
+ logger.warn(message, {
2871
+ tags: { deviceId },
2872
+ meta
2873
+ });
2874
+ return;
2875
+ }
2869
2876
  logger.warn(message, { meta });
2870
2877
  }
2871
2878
  /**
@@ -2875,15 +2882,15 @@ var PipelineExecutor = class {
2875
2882
  * native crop, the NATIVE face size so an operator sees the size that actually
2876
2883
  * gated. Throttled so it isn't per-frame spam.
2877
2884
  */
2878
- warnFaceTooSmall(child, detShortSidePx, minFaceSizePx, nativeFaceShortSidePx) {
2879
- this.throttledWarn(`face-small:${child.stepId}`, 3e4, "face detected but too small to embed — skipping", {
2885
+ warnFaceTooSmall(child, detShortSidePx, minFaceSizePx, nativeFaceShortSidePx, deviceId) {
2886
+ this.throttledWarn(`face-small:${child.stepId}:${deviceId}`, 3e4, "face detected but too small to embed — skipping", {
2880
2887
  step: child.stepId,
2881
2888
  model: child.modelId,
2882
2889
  faceShortSidePx: Math.round(detShortSidePx),
2883
2890
  minFaceSizePx,
2884
2891
  gatedOn: nativeFaceShortSidePx === void 0 ? "detection" : "native",
2885
2892
  ...nativeFaceShortSidePx === void 0 ? {} : { nativeFaceShortSidePx: Math.round(nativeFaceShortSidePx) }
2886
- });
2893
+ }, deviceId);
2887
2894
  }
2888
2895
  /**
2889
2896
  * Execute the full pipeline tree against a frame.
@@ -2926,7 +2933,7 @@ var PipelineExecutor = class {
2926
2933
  const mutable = this.synthesizeRootDetection(rootOutput, rootStep, idGen, rootMs, imageWidth, imageHeight);
2927
2934
  applyChildOutput(mutable, rootStep, rootOutput, rootMs, ctx);
2928
2935
  try {
2929
- await this.executeChildren(rootStep.children, mutable, fullFrameJpegProvider, imageWidth, imageHeight, traceBuilder, stepTimings, ctx, poolAgg, runOpts?.plane, nativeFaceCropProvider);
2936
+ await this.executeChildren(rootStep.children, mutable, fullFrameJpegProvider, imageWidth, imageHeight, traceBuilder, stepTimings, ctx, poolAgg, runOpts?.plane, deviceId, nativeFaceCropProvider);
2930
2937
  } catch (err) {
2931
2938
  this.opts.logger?.warn("Pipeline child execution failed — keeping parent detection", {
2932
2939
  tags: { deviceId },
@@ -2956,7 +2963,7 @@ var PipelineExecutor = class {
2956
2963
  continue;
2957
2964
  }
2958
2965
  try {
2959
- await this.executeChildren(rootStep.children, mutable, fullFrameJpegProvider, imageWidth, imageHeight, traceBuilder, stepTimings, ctx, poolAgg, runOpts?.plane, nativeFaceCropProvider);
2966
+ await this.executeChildren(rootStep.children, mutable, fullFrameJpegProvider, imageWidth, imageHeight, traceBuilder, stepTimings, ctx, poolAgg, runOpts?.plane, deviceId, nativeFaceCropProvider);
2960
2967
  } catch (err) {
2961
2968
  this.opts.logger?.warn("Pipeline child execution failed — keeping parent detection", {
2962
2969
  tags: { deviceId },
@@ -3081,7 +3088,7 @@ var PipelineExecutor = class {
3081
3088
  });
3082
3089
  return output;
3083
3090
  }
3084
- async executeChildren(children, parentDetection, fullFrameJpegProvider, imageWidth, imageHeight, traceBuilder, stepTimings, ctx, poolAgg, plane, nativeFaceCropProvider) {
3091
+ async executeChildren(children, parentDetection, fullFrameJpegProvider, imageWidth, imageHeight, traceBuilder, stepTimings, ctx, poolAgg, plane, deviceId, nativeFaceCropProvider) {
3085
3092
  for (const child of children) {
3086
3093
  if (plane === "frame" && child.definition.inputClasses !== null) continue;
3087
3094
  if (!this.matchesInputClasses(parentDetection.macroClass, child.inputClasses)) continue;
@@ -3099,13 +3106,13 @@ var PipelineExecutor = class {
3099
3106
  const minFaceSize = typeof child.settings?.["minFaceSize"] === "number" ? child.settings["minFaceSize"] : DEFAULT_MIN_FACE_SIZE_PX;
3100
3107
  const detShortSide = bboxShortSide(parentDetection.bbox);
3101
3108
  if (detShortSide < MIN_FACE_DETECTION_FLOOR_PX) {
3102
- this.warnFaceTooSmall(child, detShortSide, minFaceSize, void 0);
3109
+ this.warnFaceTooSmall(child, detShortSide, minFaceSize, void 0, deviceId);
3103
3110
  continue;
3104
3111
  }
3105
3112
  const lms = parentDetection.landmarks;
3106
3113
  if (lms && lms.length >= 5) {
3107
3114
  if (!nativeFaceCropProvider && detShortSide < minFaceSize) {
3108
- this.warnFaceTooSmall(child, detShortSide, minFaceSize, void 0);
3115
+ this.warnFaceTooSmall(child, detShortSide, minFaceSize, void 0, deviceId);
3109
3116
  continue;
3110
3117
  }
3111
3118
  const aligned = await buildAlignedFaceCrop({
@@ -3122,7 +3129,7 @@ var PipelineExecutor = class {
3122
3129
  });
3123
3130
  const gateShortSide = aligned.nativeFaceShortSidePx ?? detShortSide;
3124
3131
  if (gateShortSide < minFaceSize) {
3125
- this.warnFaceTooSmall(child, detShortSide, minFaceSize, aligned.source === "native" ? gateShortSide : void 0);
3132
+ this.warnFaceTooSmall(child, detShortSide, minFaceSize, aligned.source === "native" ? gateShortSide : void 0, deviceId);
3126
3133
  continue;
3127
3134
  }
3128
3135
  cropJpegBuf = aligned.jpeg;
@@ -3131,7 +3138,7 @@ var PipelineExecutor = class {
3131
3138
  parentDetection.faceAlignedCrop = cropJpegBuf.toString("base64");
3132
3139
  } else {
3133
3140
  if (detShortSide < minFaceSize) {
3134
- this.warnFaceTooSmall(child, detShortSide, minFaceSize, void 0);
3141
+ this.warnFaceTooSmall(child, detShortSide, minFaceSize, void 0, deviceId);
3135
3142
  continue;
3136
3143
  }
3137
3144
  const crop = await cropJpeg(fullFrameJpeg, parentDetection.bbox, imageWidth, imageHeight);
@@ -3163,15 +3170,15 @@ var PipelineExecutor = class {
3163
3170
  y: l.y + py1
3164
3171
  }));
3165
3172
  }
3166
- await this.executeChildren(child.children, detail, fullFrameJpegProvider, imageWidth, imageHeight, traceBuilder, stepTimings, ctx, poolAgg, plane, nativeFaceCropProvider);
3173
+ await this.executeChildren(child.children, detail, fullFrameJpegProvider, imageWidth, imageHeight, traceBuilder, stepTimings, ctx, poolAgg, plane, deviceId, nativeFaceCropProvider);
3167
3174
  }
3168
3175
  }
3169
3176
  } catch (err) {
3170
- this.throttledWarn(`child-fail:${child.stepId}`, 15e3, "pipeline child step failed", {
3177
+ this.throttledWarn(`child-fail:${child.stepId}:${deviceId}`, 15e3, "pipeline child step failed", {
3171
3178
  step: child.stepId,
3172
3179
  model: child.modelId,
3173
3180
  error: require_dist.errMsg(err)
3174
- });
3181
+ }, deviceId);
3175
3182
  }
3176
3183
  }
3177
3184
  }
@@ -1,6 +1,6 @@
1
1
  import { t as __require } from "../chunk-BdkLduGY.mjs";
2
- import { D as nodePin, H as createEvent, I as errMsg, L as BaseAddon, O as pipelineExecutorCapability, P as supportedRuntimes$1, U as hydrateSchema, V as EventCategory, X as sleep, b as detectionPipelineCapability, f as YAMNET_TO_MACRO, j as runtimeDevices$1, q as parseJsonUnknown, t as APPLE_SA_TO_MACRO, v as defaultDeviceFor$1, x as evaluateZoneRules } from "../dist-RWGGPwVx.mjs";
3
- import { a as getStepDefinition, i as getStep, n as ALL_STEPS, o as resolveModelForFormat, r as getDefaultModelForFormat, t as ALL_PIPELINE_STEPS } from "../step-definitions-CP9kVSml.mjs";
2
+ import { D as nodePin, H as createEvent, I as errMsg, L as BaseAddon, O as pipelineExecutorCapability, P as supportedRuntimes$1, U as hydrateSchema, V as EventCategory, X as sleep, b as detectionPipelineCapability, f as YAMNET_TO_MACRO, j as runtimeDevices$1, q as parseJsonUnknown, t as APPLE_SA_TO_MACRO, v as defaultDeviceFor$1, x as evaluateZoneRules } from "../dist-CrjLGrkj.mjs";
3
+ import { a as getStepDefinition, i as getStep, n as ALL_STEPS, o as resolveModelForFormat, r as getDefaultModelForFormat, t as ALL_PIPELINE_STEPS } from "../step-definitions-dCghpdRo.mjs";
4
4
  import { t as pickNodePlatformArch } from "../node-topology-platform-BkR_k6WT.mjs";
5
5
  import { a as isModelDownloaded, i as ensureModel, n as deleteModelFromDisk } from "../model-download-service-C-IHWnXx-BPy6aoAx.mjs";
6
6
  import { FrameRingReaderCache } from "@camstack/shm-ring";
@@ -2852,12 +2852,19 @@ var PipelineExecutor = class {
2852
2852
  /** Per-key last-warn timestamps, so a persistently-failing/skipping child
2853
2853
  * step surfaces a diagnostic without spamming the log every frame. */
2854
2854
  warnThrottleAt = /* @__PURE__ */ new Map();
2855
- throttledWarn(key, everyMs, message, meta) {
2855
+ throttledWarn(key, everyMs, message, meta, deviceId) {
2856
2856
  const logger = this.opts.logger;
2857
2857
  if (!logger) return;
2858
2858
  const now = Date.now();
2859
2859
  if (now - (this.warnThrottleAt.get(key) ?? 0) < everyMs) return;
2860
2860
  this.warnThrottleAt.set(key, now);
2861
+ if (deviceId !== void 0) {
2862
+ logger.warn(message, {
2863
+ tags: { deviceId },
2864
+ meta
2865
+ });
2866
+ return;
2867
+ }
2861
2868
  logger.warn(message, { meta });
2862
2869
  }
2863
2870
  /**
@@ -2867,15 +2874,15 @@ var PipelineExecutor = class {
2867
2874
  * native crop, the NATIVE face size so an operator sees the size that actually
2868
2875
  * gated. Throttled so it isn't per-frame spam.
2869
2876
  */
2870
- warnFaceTooSmall(child, detShortSidePx, minFaceSizePx, nativeFaceShortSidePx) {
2871
- this.throttledWarn(`face-small:${child.stepId}`, 3e4, "face detected but too small to embed — skipping", {
2877
+ warnFaceTooSmall(child, detShortSidePx, minFaceSizePx, nativeFaceShortSidePx, deviceId) {
2878
+ this.throttledWarn(`face-small:${child.stepId}:${deviceId}`, 3e4, "face detected but too small to embed — skipping", {
2872
2879
  step: child.stepId,
2873
2880
  model: child.modelId,
2874
2881
  faceShortSidePx: Math.round(detShortSidePx),
2875
2882
  minFaceSizePx,
2876
2883
  gatedOn: nativeFaceShortSidePx === void 0 ? "detection" : "native",
2877
2884
  ...nativeFaceShortSidePx === void 0 ? {} : { nativeFaceShortSidePx: Math.round(nativeFaceShortSidePx) }
2878
- });
2885
+ }, deviceId);
2879
2886
  }
2880
2887
  /**
2881
2888
  * Execute the full pipeline tree against a frame.
@@ -2918,7 +2925,7 @@ var PipelineExecutor = class {
2918
2925
  const mutable = this.synthesizeRootDetection(rootOutput, rootStep, idGen, rootMs, imageWidth, imageHeight);
2919
2926
  applyChildOutput(mutable, rootStep, rootOutput, rootMs, ctx);
2920
2927
  try {
2921
- await this.executeChildren(rootStep.children, mutable, fullFrameJpegProvider, imageWidth, imageHeight, traceBuilder, stepTimings, ctx, poolAgg, runOpts?.plane, nativeFaceCropProvider);
2928
+ await this.executeChildren(rootStep.children, mutable, fullFrameJpegProvider, imageWidth, imageHeight, traceBuilder, stepTimings, ctx, poolAgg, runOpts?.plane, deviceId, nativeFaceCropProvider);
2922
2929
  } catch (err) {
2923
2930
  this.opts.logger?.warn("Pipeline child execution failed — keeping parent detection", {
2924
2931
  tags: { deviceId },
@@ -2948,7 +2955,7 @@ var PipelineExecutor = class {
2948
2955
  continue;
2949
2956
  }
2950
2957
  try {
2951
- await this.executeChildren(rootStep.children, mutable, fullFrameJpegProvider, imageWidth, imageHeight, traceBuilder, stepTimings, ctx, poolAgg, runOpts?.plane, nativeFaceCropProvider);
2958
+ await this.executeChildren(rootStep.children, mutable, fullFrameJpegProvider, imageWidth, imageHeight, traceBuilder, stepTimings, ctx, poolAgg, runOpts?.plane, deviceId, nativeFaceCropProvider);
2952
2959
  } catch (err) {
2953
2960
  this.opts.logger?.warn("Pipeline child execution failed — keeping parent detection", {
2954
2961
  tags: { deviceId },
@@ -3073,7 +3080,7 @@ var PipelineExecutor = class {
3073
3080
  });
3074
3081
  return output;
3075
3082
  }
3076
- async executeChildren(children, parentDetection, fullFrameJpegProvider, imageWidth, imageHeight, traceBuilder, stepTimings, ctx, poolAgg, plane, nativeFaceCropProvider) {
3083
+ async executeChildren(children, parentDetection, fullFrameJpegProvider, imageWidth, imageHeight, traceBuilder, stepTimings, ctx, poolAgg, plane, deviceId, nativeFaceCropProvider) {
3077
3084
  for (const child of children) {
3078
3085
  if (plane === "frame" && child.definition.inputClasses !== null) continue;
3079
3086
  if (!this.matchesInputClasses(parentDetection.macroClass, child.inputClasses)) continue;
@@ -3091,13 +3098,13 @@ var PipelineExecutor = class {
3091
3098
  const minFaceSize = typeof child.settings?.["minFaceSize"] === "number" ? child.settings["minFaceSize"] : DEFAULT_MIN_FACE_SIZE_PX;
3092
3099
  const detShortSide = bboxShortSide(parentDetection.bbox);
3093
3100
  if (detShortSide < MIN_FACE_DETECTION_FLOOR_PX) {
3094
- this.warnFaceTooSmall(child, detShortSide, minFaceSize, void 0);
3101
+ this.warnFaceTooSmall(child, detShortSide, minFaceSize, void 0, deviceId);
3095
3102
  continue;
3096
3103
  }
3097
3104
  const lms = parentDetection.landmarks;
3098
3105
  if (lms && lms.length >= 5) {
3099
3106
  if (!nativeFaceCropProvider && detShortSide < minFaceSize) {
3100
- this.warnFaceTooSmall(child, detShortSide, minFaceSize, void 0);
3107
+ this.warnFaceTooSmall(child, detShortSide, minFaceSize, void 0, deviceId);
3101
3108
  continue;
3102
3109
  }
3103
3110
  const aligned = await buildAlignedFaceCrop({
@@ -3114,7 +3121,7 @@ var PipelineExecutor = class {
3114
3121
  });
3115
3122
  const gateShortSide = aligned.nativeFaceShortSidePx ?? detShortSide;
3116
3123
  if (gateShortSide < minFaceSize) {
3117
- this.warnFaceTooSmall(child, detShortSide, minFaceSize, aligned.source === "native" ? gateShortSide : void 0);
3124
+ this.warnFaceTooSmall(child, detShortSide, minFaceSize, aligned.source === "native" ? gateShortSide : void 0, deviceId);
3118
3125
  continue;
3119
3126
  }
3120
3127
  cropJpegBuf = aligned.jpeg;
@@ -3123,7 +3130,7 @@ var PipelineExecutor = class {
3123
3130
  parentDetection.faceAlignedCrop = cropJpegBuf.toString("base64");
3124
3131
  } else {
3125
3132
  if (detShortSide < minFaceSize) {
3126
- this.warnFaceTooSmall(child, detShortSide, minFaceSize, void 0);
3133
+ this.warnFaceTooSmall(child, detShortSide, minFaceSize, void 0, deviceId);
3127
3134
  continue;
3128
3135
  }
3129
3136
  const crop = await cropJpeg(fullFrameJpeg, parentDetection.bbox, imageWidth, imageHeight);
@@ -3155,15 +3162,15 @@ var PipelineExecutor = class {
3155
3162
  y: l.y + py1
3156
3163
  }));
3157
3164
  }
3158
- await this.executeChildren(child.children, detail, fullFrameJpegProvider, imageWidth, imageHeight, traceBuilder, stepTimings, ctx, poolAgg, plane, nativeFaceCropProvider);
3165
+ await this.executeChildren(child.children, detail, fullFrameJpegProvider, imageWidth, imageHeight, traceBuilder, stepTimings, ctx, poolAgg, plane, deviceId, nativeFaceCropProvider);
3159
3166
  }
3160
3167
  }
3161
3168
  } catch (err) {
3162
- this.throttledWarn(`child-fail:${child.stepId}`, 15e3, "pipeline child step failed", {
3169
+ this.throttledWarn(`child-fail:${child.stepId}:${deviceId}`, 15e3, "pipeline child step failed", {
3163
3170
  step: child.stepId,
3164
3171
  model: child.modelId,
3165
3172
  error: errMsg(err)
3166
- });
3173
+ }, deviceId);
3167
3174
  }
3168
3175
  }
3169
3176
  }