@camstack/addon-pipeline 1.2.100 → 1.2.102

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 (34) hide show
  1. package/dist/{addon-utils-eUS6n_Zj.js → addon-utils-CLc6yHCN.js} +1 -1
  2. package/dist/audio-analyzer/index.js +3 -3
  3. package/dist/audio-analyzer/index.mjs +2 -2
  4. package/dist/detection-pipeline/index.js +163 -42
  5. package/dist/detection-pipeline/index.mjs +161 -40
  6. package/dist/{dist-dm3t4BOt.js → dist-C11WuNUP.js} +87 -51
  7. package/dist/{dist-gXdWP96z.mjs → dist-Ccmt3fGJ.mjs} +82 -52
  8. package/dist/{event-loop-stall-monitor-Lki2_mYY.js → event-loop-stall-monitor-Cq_NeC4o.js} +175 -132
  9. package/dist/{event-loop-stall-monitor-TnQ21mu0.mjs → event-loop-stall-monitor-OJrOMeuu.mjs} +170 -133
  10. package/dist/{lazy-sharp-oYppDIZR.js → lazy-sharp-RxUs6on_.js} +1 -1
  11. package/dist/motion-wasm/index.js +2 -2
  12. package/dist/motion-wasm/index.mjs +1 -1
  13. package/dist/pipeline-runner/index.js +5 -4
  14. package/dist/pipeline-runner/index.mjs +4 -3
  15. package/dist/{process-memory-CKWh609B.mjs → process-memory-D0zDmXLI.mjs} +1 -1
  16. package/dist/{process-memory-vkFVOdkV.js → process-memory-DOjQ3MgC.js} +1 -1
  17. package/dist/recorder/index.js +333 -125
  18. package/dist/recorder/index.mjs +332 -124
  19. package/dist/retire-root-keys-DMolfhsP.mjs +308 -0
  20. package/dist/retire-root-keys-KE6D6Xh_.js +319 -0
  21. package/dist/session-decode/decode-worker-child.js +2 -2
  22. package/dist/session-decode/decode-worker-child.mjs +1 -1
  23. package/dist/stream-broker/_stub.js +1 -1
  24. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-B7ERJocD.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-BdgcF1lL.mjs} +2 -2
  25. package/dist/stream-broker/{_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-zT-cYUdF.mjs → _virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DY31bUCj.mjs} +1 -1
  26. package/dist/stream-broker/{hostInit-Cm2rl8-e.mjs → hostInit-Da9wVA2r.mjs} +2 -2
  27. package/dist/stream-broker/index.js +285 -41
  28. package/dist/stream-broker/index.mjs +285 -41
  29. package/dist/stream-broker/remoteEntry.js +1 -1
  30. package/dist/{worker-protocol-BrlrMxXu.js → worker-protocol-BePduZVV.js} +1 -1
  31. package/dist/{worker-protocol-DJWdPLKF.mjs → worker-protocol-DDpliBIW.mjs} +1 -1
  32. package/package.json +1 -1
  33. package/python/postprocessors/ctc.py +56 -3
  34. package/python/postprocessors/test_ctc.py +37 -0
@@ -1,4 +1,4 @@
1
- import { U as hfModelUrl, a as COCO_80_LABELS, o as COCO_TO_MACRO, r as AUDIO_MACRO_LABELS } from "./dist-gXdWP96z.mjs";
1
+ import { W as hfModelUrl, a as COCO_80_LABELS, k as audioKindId, o as COCO_TO_MACRO, r as AUDIO_MACRO_LABELS } from "./dist-Ccmt3fGJ.mjs";
2
2
  import { PerformanceObserver } from "node:perf_hooks";
3
3
  //#region src/detection-pipeline/registry/model-catalogs.ts
4
4
  var HF_REPO = "camstack/camstack-models";
@@ -48,7 +48,8 @@ var ovPrecisionVariant = (baseId, ovDir, baseName, precision, sizeMB, legacy = f
48
48
  ...precision === "int8" ? { group: {
49
49
  family: baseId.slice(0, -1),
50
50
  tier: baseId.slice(-1),
51
- precision: "int8"
51
+ precision: "int8",
52
+ resolution: 640
52
53
  } } : {}
53
54
  });
54
55
  var MLPACKAGE_FILES = [
@@ -191,7 +192,8 @@ var OBJECT_DETECTION_MODELS = [
191
192
  id: "yolo26n",
192
193
  group: {
193
194
  family: "yolo26",
194
- tier: "n"
195
+ tier: "n",
196
+ resolution: 640
195
197
  },
196
198
  name: "YOLO26 Nano",
197
199
  description: "YOLO26 Nano — latest generation ultra-lightweight detector with attention mechanism",
@@ -220,7 +222,8 @@ var OBJECT_DETECTION_MODELS = [
220
222
  id: "yolo26s",
221
223
  group: {
222
224
  family: "yolo26",
223
- tier: "s"
225
+ tier: "s",
226
+ resolution: 640
224
227
  },
225
228
  name: "YOLO26 Small",
226
229
  description: "YOLO26 Small — balanced speed/accuracy with attention-based architecture",
@@ -249,7 +252,8 @@ var OBJECT_DETECTION_MODELS = [
249
252
  id: "yolo26m",
250
253
  group: {
251
254
  family: "yolo26",
252
- tier: "m"
255
+ tier: "m",
256
+ resolution: 640
253
257
  },
254
258
  name: "YOLO26 Medium",
255
259
  description: "YOLO26 Medium — high accuracy general-purpose detector",
@@ -278,7 +282,8 @@ var OBJECT_DETECTION_MODELS = [
278
282
  id: "yolo26l",
279
283
  group: {
280
284
  family: "yolo26",
281
- tier: "l"
285
+ tier: "l",
286
+ resolution: 640
282
287
  },
283
288
  name: "YOLO26 Large",
284
289
  description: "YOLO26 Large — maximum accuracy for demanding deployments",
@@ -474,7 +479,7 @@ var FACE_DETECTION_MODELS = [
474
479
  {
475
480
  id: "scrfd-2.5g",
476
481
  name: "SCRFD 2.5G",
477
- description: "SCRFD 2.5G — balanced face detection model",
482
+ description: "SCRFD 2.5G bnkps — balanced face detection with 5 keypoints (WIDER FACE 93.80/92.02/77.13). InsightFace pretrained weights.",
478
483
  inputSize: {
479
484
  width: 640,
480
485
  height: 640
@@ -484,6 +489,7 @@ var FACE_DETECTION_MODELS = [
484
489
  name: "Face"
485
490
  }],
486
491
  preprocessMode: "letterbox",
492
+ license: "InsightFace-NonCommercial-Research",
487
493
  formats: {
488
494
  onnx: {
489
495
  url: hf("faceDetection/scrfd/onnx/camstack-scrfd-2.5g.onnx"),
@@ -512,6 +518,7 @@ var FACE_DETECTION_MODELS = [
512
518
  name: "Face"
513
519
  }],
514
520
  preprocessMode: "letterbox",
521
+ license: "UNKNOWN",
515
522
  formats: {
516
523
  onnx: {
517
524
  url: hfScrypted("onnx/scrypted_yolov9t_relu_face/scrypted_yolov9t_relu_face.onnx"),
@@ -550,63 +557,98 @@ var FACE_DETECTION_MODELS = [
550
557
  } }
551
558
  }
552
559
  ];
553
- var FACE_EMBEDDING_MODELS = [{
554
- id: "arcface-r100",
555
- name: "ArcFace R100",
556
- description: "ArcFace ResNet-100 — high-accuracy face recognition embeddings (512-d)",
557
- inputSize: {
558
- width: 112,
559
- height: 112
560
- },
561
- inputLayout: "nhwc",
562
- labels: [{
563
- id: "embedding",
564
- name: "Face Embedding"
565
- }],
566
- preprocessMode: "resize",
567
- faceAlignment: true,
568
- formats: {
569
- onnx: {
570
- url: hf("faceRecognition/arcface/onnx/camstack-arcface-arcface.onnx"),
571
- sizeMB: 130
572
- },
573
- coreml: {
574
- url: hf("faceRecognition/arcface/coreml/camstack-arcface-r100.mlpackage"),
575
- sizeMB: 65,
576
- isDirectory: true,
577
- files: [...MLPACKAGE_FILES],
578
- runtimes: ["python"]
560
+ var FACE_EMBEDDING_MODELS = [
561
+ {
562
+ id: "arcface-r100",
563
+ name: "ArcFace (ResNet34)",
564
+ description: "ArcFace ResNet34 — face recognition embeddings (512-d). NOTE: despite the `arcface-r100` id this is a ResNet34, not a ResNet-100 (verified 2026-08-19).",
565
+ inputSize: {
566
+ width: 112,
567
+ height: 112
579
568
  },
580
- openvino: ovFormat(hf("faceRecognition/arcface/openvino/camstack-arcface-r100.xml"), 65)
581
- }
582
- }, {
583
- id: "inception-resnet-v1",
584
- name: "Inception ResNet V1",
585
- description: "FaceNet-style face recognition embeddings (512-d) — hosted on plugin-models HF repo",
586
- inputSize: {
587
- width: 160,
588
- height: 160
569
+ inputLayout: "nhwc",
570
+ labels: [{
571
+ id: "embedding",
572
+ name: "Face Embedding"
573
+ }],
574
+ preprocessMode: "resize",
575
+ faceAlignment: true,
576
+ license: "UNKNOWN",
577
+ formats: {
578
+ onnx: {
579
+ url: hf("faceRecognition/arcface/onnx/camstack-arcface-arcface.onnx"),
580
+ sizeMB: 130
581
+ },
582
+ coreml: {
583
+ url: hf("faceRecognition/arcface/coreml/camstack-arcface-r100.mlpackage"),
584
+ sizeMB: 65,
585
+ isDirectory: true,
586
+ files: [...MLPACKAGE_FILES],
587
+ runtimes: ["python"]
588
+ },
589
+ openvino: ovFormat(hf("faceRecognition/arcface/openvino/camstack-arcface-r100.xml"), 65)
590
+ }
589
591
  },
590
- labels: [{
591
- id: "embedding",
592
- name: "Face Embedding"
593
- }],
594
- preprocessMode: "resize",
595
- formats: {
596
- onnx: {
597
- url: hfScrypted("onnx/inception_resnet_v1/inception_resnet_v1.onnx"),
598
- sizeMB: 89.6
592
+ {
593
+ id: "auraface-r100",
594
+ name: "AuraFace R100",
595
+ description: "AuraFace v1 (fal.ai) — iResNet-100 ArcFace face recognition embeddings (512-d), Apache-2.0. Benchmarks published by fal: LFW 99.65, CFP-FP 95.19, AgeDB 96.10, CALFW 94.70, CPLFW 90.93. Genuinely a ResNet-100 (65 M params) — roughly twice the depth of the `arcface-r100` entry, which is a ResNet34.",
596
+ inputSize: {
597
+ width: 112,
598
+ height: 112
599
599
  },
600
- coreml: {
601
- url: hfScrypted("coreml/inception_resnet_v1/inception_resnet_v1.mlpackage"),
602
- sizeMB: 45,
603
- isDirectory: true,
604
- files: [...MLPACKAGE_FILES],
605
- runtimes: ["python"]
600
+ labels: [{
601
+ id: "embedding",
602
+ name: "Face Embedding"
603
+ }],
604
+ preprocessMode: "resize",
605
+ faceAlignment: true,
606
+ license: "Apache-2.0",
607
+ formats: {
608
+ onnx: {
609
+ url: hf("faceRecognition/auraface/onnx/camstack-auraface-r100.onnx"),
610
+ sizeMB: 261
611
+ },
612
+ coreml: {
613
+ url: hf("faceRecognition/auraface/coreml/camstack-auraface-r100.mlpackage"),
614
+ sizeMB: 131,
615
+ isDirectory: true,
616
+ files: [...MLPACKAGE_FILES],
617
+ runtimes: ["python"]
618
+ },
619
+ openvino: ovFormat(hf("faceRecognition/auraface/openvino/camstack-auraface-r100.xml"), 131)
620
+ }
621
+ },
622
+ {
623
+ id: "inception-resnet-v1",
624
+ name: "Inception ResNet V1",
625
+ description: "FaceNet-style face recognition embeddings (512-d) — hosted on plugin-models HF repo",
626
+ inputSize: {
627
+ width: 160,
628
+ height: 160
606
629
  },
607
- openvino: ovFormat(hf("faceRecognition/inception-resnet-v1/openvino/camstack-inception-resnet-v1.xml"), 45)
630
+ labels: [{
631
+ id: "embedding",
632
+ name: "Face Embedding"
633
+ }],
634
+ preprocessMode: "resize",
635
+ license: "UNKNOWN",
636
+ formats: {
637
+ onnx: {
638
+ url: hfScrypted("onnx/inception_resnet_v1/inception_resnet_v1.onnx"),
639
+ sizeMB: 89.6
640
+ },
641
+ coreml: {
642
+ url: hfScrypted("coreml/inception_resnet_v1/inception_resnet_v1.mlpackage"),
643
+ sizeMB: 45,
644
+ isDirectory: true,
645
+ files: [...MLPACKAGE_FILES],
646
+ runtimes: ["python"]
647
+ },
648
+ openvino: ovFormat(hf("faceRecognition/inception-resnet-v1/openvino/camstack-inception-resnet-v1.xml"), 45)
649
+ }
608
650
  }
609
- }];
651
+ ];
610
652
  var PLATE_DETECTION_MODELS = [{
611
653
  id: "yolov8n-plate",
612
654
  name: "YOLOv8 Nano — License Plate",
@@ -1192,6 +1234,22 @@ var AUDIO_CLASSIFIER_MODELS = [{
1192
1234
  } }
1193
1235
  }];
1194
1236
  //#endregion
1237
+ //#region src/detection-pipeline/pipeline/landmark-precision-gate.ts
1238
+ /**
1239
+ * `null` = admit. A verdict = refuse, carrying both numbers so the caller can
1240
+ * name them in a log. Pure.
1241
+ */
1242
+ function landmarkPrecisionVerdict(input) {
1243
+ const { detectionShortSidePx, floorPx } = input;
1244
+ if (!(floorPx > 0)) return null;
1245
+ if (!Number.isFinite(detectionShortSidePx)) return null;
1246
+ if (detectionShortSidePx >= floorPx) return null;
1247
+ return {
1248
+ detectionShortSidePx,
1249
+ floorPx
1250
+ };
1251
+ }
1252
+ //#endregion
1195
1253
  //#region src/detection-pipeline/registry/step-definitions.ts
1196
1254
  var ANIMAL_10_LABELS = [
1197
1255
  "cat",
@@ -1272,7 +1330,7 @@ var ObjectDetectionStep = class {
1272
1330
  type: "multiselect",
1273
1331
  key: "enabledMacroClasses",
1274
1332
  label: "Enabled Classes",
1275
- description: "Which macro classes to detect (empty = all three).",
1333
+ description: "Which macro classes to detect (empty = every class listed here).",
1276
1334
  options: [
1277
1335
  {
1278
1336
  value: "person",
@@ -1285,10 +1343,6 @@ var ObjectDetectionStep = class {
1285
1343
  {
1286
1344
  value: "animal",
1287
1345
  label: "Animal"
1288
- },
1289
- {
1290
- value: "package",
1291
- label: "Package"
1292
1346
  }
1293
1347
  ],
1294
1348
  default: [
@@ -1341,21 +1395,6 @@ var ObjectDetectionStep = class {
1341
1395
  default: .5,
1342
1396
  showValue: true
1343
1397
  },
1344
- {
1345
- type: "slider",
1346
- key: "minConfidencePackage",
1347
- label: "Min Confidence — Package",
1348
- description: "Drop package predictions below this score.",
1349
- min: 0,
1350
- max: 1,
1351
- step: .05,
1352
- default: .5,
1353
- showValue: true,
1354
- showWhen: {
1355
- field: "enabledMacroClasses",
1356
- includes: "package"
1357
- }
1358
- },
1359
1398
  {
1360
1399
  type: "slider",
1361
1400
  key: "nmsIouThreshold",
@@ -1393,7 +1432,8 @@ var AudioClassifierStep = class {
1393
1432
  description: "Which audio macro classes to surface (empty = all).",
1394
1433
  options: AUDIO_MACRO_LABELS.map((l) => ({
1395
1434
  value: l.id,
1396
- label: `${l.icon ?? ""} ${l.name}`.trim()
1435
+ label: l.name,
1436
+ iconId: audioKindId(l.id)
1397
1437
  })),
1398
1438
  default: [
1399
1439
  "scream",
@@ -1520,66 +1560,36 @@ var ClassifierWithMinConfidence = class extends PipelineStepBase {
1520
1560
  var PLATE_OCR_DEFAULT_REGION = "DE";
1521
1561
  var PLATE_OCR_DEFAULT_MIN_TEXT_LENGTH = 3;
1522
1562
  var PLATE_OCR_DEFAULT_MIN_TEXT_CONFIDENCE = 0;
1523
- var PLATE_OCR_REGION_OPTIONS = [{
1524
- value: "off",
1525
- label: "Off (no format correction)"
1526
- }, {
1527
- value: "DE",
1528
- label: "Germany"
1529
- }];
1530
1563
  /**
1531
1564
  * Plate OCR step — exposes a `rectify` toggle (default ON) that deskews the
1532
1565
  * plate crop (rotation rectification) before the CTC recognizer reads it.
1533
1566
  * Oblique cameras (steeply angled plates) skew the text baseline and collapse
1534
1567
  * CTC beyond ~10-15°; a frontal camera loses nothing at 0° because the executor
1535
- * skips the warp when the estimated angle is ~0. Per-camera configurable.
1568
+ * skips the warp when the estimated angle is ~0. Per-camera configurable, and
1569
+ * the ONLY per-camera knob this step has — see below.
1536
1570
  *
1537
- * Also exposes the format-aware rescoring controls (`plateRegion` grammar +
1538
- * plausibility-gate thresholds) forwarded to the Python CTC postprocessor.
1571
+ * `plateRegion` / `minTextLength` / `minTextConfidence` are NOT offered here.
1572
+ * They are consumed inside the Python CTC postprocessor, whose config is bound
1573
+ * when the model is loaded into the shared inference pool — node-level by
1574
+ * construction, exactly like `nmsIouThreshold` and the pool confidence floor.
1575
+ * They used to be rendered as per-camera sliders that wrote a settings row
1576
+ * nobody read: `engine-factory.buildPoolModelConfig` takes the STATIC value off
1577
+ * the step definition below, so the operator moved a slider and the runtime
1578
+ * kept the default (D62 — a per-camera switch that stores nothing is worse than
1579
+ * no switch). Making them genuinely per-camera means a per-REQUEST config
1580
+ * override through SharedInferencePool → inference_pool.py → ModelSlot.config,
1581
+ * i.e. a new wire protocol, not a step-schema entry.
1539
1582
  */
1540
1583
  var PlateOcrStep = class extends PipelineStepBase {
1541
1584
  getConfigSchema() {
1542
- return [
1543
- {
1544
- type: "boolean",
1545
- key: "rectify",
1546
- label: "Deskew Plate Crop",
1547
- description: "Rotate the plate crop to level the text baseline before OCR. Recommended for oblique/angled cameras; a frontal camera is unaffected (no rotation applied at ~0°).",
1548
- default: true,
1549
- style: "switch"
1550
- },
1551
- {
1552
- type: "select",
1553
- key: "plateRegion",
1554
- label: "Plate Format",
1555
- description: "Validate each read against a country plate grammar and repair OCR confusables (0↔O, 1↔I, 8↔B, …) to the highest-scoring conforming read. Never drops a plausible read — only fixes or annotates it. \"Off\" disables correction.",
1556
- options: PLATE_OCR_REGION_OPTIONS,
1557
- default: PLATE_OCR_DEFAULT_REGION,
1558
- immediate: true
1559
- },
1560
- {
1561
- type: "slider",
1562
- key: "minTextLength",
1563
- label: "Min Plate Length",
1564
- description: "Suppress reads shorter than this many characters as low-resolution noise (never stored as a plate).",
1565
- min: 1,
1566
- max: 8,
1567
- step: 1,
1568
- default: PLATE_OCR_DEFAULT_MIN_TEXT_LENGTH,
1569
- showValue: true
1570
- },
1571
- {
1572
- type: "slider",
1573
- key: "minTextConfidence",
1574
- label: "Min OCR Confidence",
1575
- description: "Suppress reads whose mean character confidence is below this floor. 0 disables the confidence gate (length is the primary discriminator).",
1576
- min: 0,
1577
- max: 1,
1578
- step: .05,
1579
- default: PLATE_OCR_DEFAULT_MIN_TEXT_CONFIDENCE,
1580
- showValue: true
1581
- }
1582
- ];
1585
+ return [{
1586
+ type: "boolean",
1587
+ key: "rectify",
1588
+ label: "Deskew Plate Crop",
1589
+ description: "Rotate the plate crop to level the text baseline before OCR. Recommended for oblique/angled cameras; a frontal camera is unaffected (no rotation applied at ~0°).",
1590
+ default: true,
1591
+ style: "switch"
1592
+ }];
1583
1593
  }
1584
1594
  };
1585
1595
  var STEP_FACE_DETECTION = new PipelineStepBase({
@@ -1599,7 +1609,34 @@ var STEP_FACE_DETECTION = new PipelineStepBase({
1599
1609
  minIntervalMs: 1e3
1600
1610
  }
1601
1611
  });
1602
- var STEP_FACE_EMBEDDING = new PipelineStepBase({
1612
+ /**
1613
+ * `face-embedding` — carries the LANDMARK-PRECISION floor as its only operator
1614
+ * knob.
1615
+ *
1616
+ * It has to live here rather than beside the other face thresholds in
1617
+ * post-analysis's `face-settings.ts`: the gate is enforced in the runner's
1618
+ * executor, on the detection-frame measurement, BEFORE the native-size
1619
+ * substitution — and `child.settings` (hydrated from this schema by
1620
+ * `tree-builder`) is the only channel that reaches that code. A copy in
1621
+ * `face-settings.ts` would be a second knob that writes a store the gate never
1622
+ * reads, which this repo has shipped twice already.
1623
+ */
1624
+ var FaceEmbeddingStep = class extends PipelineStepBase {
1625
+ getConfigSchema() {
1626
+ return [{
1627
+ type: "slider",
1628
+ key: "minLandmarkFaceSize",
1629
+ label: "Min face size for recognition (detection px)",
1630
+ description: "Refuse to embed a face smaller than this IN THE DETECTION FRAME — not at native resolution. The 5 landmarks that align the crop are regressed at detection scale, so below this floor the aligned crop is not reliably a face, and a native-resolution cutout cannot fix it. Measured on 60 live crops: at 24px, 61% come out correctly aligned versus 20% with no floor, at the cost of about 70% of the volume. Lower it if you are losing too many faces; 0 disables the gate. A degenerate crop is worse than no crop — it scores high similarity against everyone and poisons the gallery.",
1631
+ min: 0,
1632
+ max: 64,
1633
+ step: 2,
1634
+ showValue: true,
1635
+ default: 24
1636
+ }];
1637
+ }
1638
+ };
1639
+ var STEP_FACE_EMBEDDING = new FaceEmbeddingStep({
1603
1640
  id: "face-embedding",
1604
1641
  name: "Face Embedding",
1605
1642
  slot: "classifier",
@@ -1995,4 +2032,4 @@ function startEventLoopStallMonitor(logger, reportThresholdMs = STALL_REPORT_MS)
1995
2032
  };
1996
2033
  }
1997
2034
  //#endregion
1998
- export { getDefaultModelForFormat as a, getStepDefinition as c, ALL_STEPS as i, resolveModelForFormat as l, startEventLoopStallMonitor as n, getDefaultModelForFormatFromDef as o, ALL_PIPELINE_STEPS as r, getStep as s, attributeStall as t };
2035
+ export { getDefaultModelForFormat as a, getStepDefinition as c, ALL_STEPS as i, resolveModelForFormat as l, startEventLoopStallMonitor as n, getDefaultModelForFormatFromDef as o, ALL_PIPELINE_STEPS as r, getStep as s, attributeStall as t, landmarkPrecisionVerdict as u };
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-dm3t4BOt.js");
1
+ const require_dist = require("./dist-C11WuNUP.js");
2
2
  let node_url = require("node:url");
3
3
  let node_module = require("node:module");
4
4
  let node_path = require("node:path");
@@ -2,8 +2,8 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-dm3t4BOt.js");
6
- const require_lazy_sharp = require("../lazy-sharp-oYppDIZR.js");
5
+ const require_dist = require("../dist-C11WuNUP.js");
6
+ const require_lazy_sharp = require("../lazy-sharp-RxUs6on_.js");
7
7
  let node_path = require("node:path");
8
8
  let node_fs = require("node:fs");
9
9
  //#region src/motion-wasm/wasm-motion-detector.ts
@@ -1,4 +1,4 @@
1
- import { H as evaluateZoneRules, K as motionDetectionCapability, _t as DeviceType, mt as BaseAddon, yt as hydrateSchema } from "../dist-gXdWP96z.mjs";
1
+ import { U as evaluateZoneRules, bt as hydrateSchema, ht as BaseAddon, q as motionDetectionCapability, vt as DeviceType } from "../dist-Ccmt3fGJ.mjs";
2
2
  import { t as getSharp } from "../lazy-sharp-6oymT_yf.mjs";
3
3
  import { join } from "node:path";
4
4
  import { readFileSync } from "node:fs";
@@ -2,11 +2,11 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-dm3t4BOt.js");
6
- const require_event_loop_stall_monitor = require("../event-loop-stall-monitor-Lki2_mYY.js");
7
- const require_worker_protocol = require("../worker-protocol-BrlrMxXu.js");
5
+ const require_dist = require("../dist-C11WuNUP.js");
6
+ const require_event_loop_stall_monitor = require("../event-loop-stall-monitor-Cq_NeC4o.js");
7
+ const require_worker_protocol = require("../worker-protocol-BePduZVV.js");
8
8
  const require_hub_hostname = require("../hub-hostname-DAJXlOgV.js");
9
- const require_lazy_sharp = require("../lazy-sharp-oYppDIZR.js");
9
+ const require_lazy_sharp = require("../lazy-sharp-RxUs6on_.js");
10
10
  const require_remote_restream = require("../remote-restream-BYbAsgUf.js");
11
11
  let sharp = require("sharp");
12
12
  sharp = require_dist.__toESM(sharp);
@@ -2091,6 +2091,7 @@ function toDetailResult(detection, stepId, crop) {
2091
2091
  score: detection.score,
2092
2092
  bbox: mapBboxToFrameSpace(detection.bbox, crop),
2093
2093
  ...detection.embedding !== void 0 ? { embedding: encodeEmbeddingBase64(detection.embedding) } : {},
2094
+ ...detection.embeddingMagnitude !== void 0 ? { embeddingMagnitude: detection.embeddingMagnitude } : {},
2094
2095
  ...label !== void 0 ? {
2095
2096
  label: label.label,
2096
2097
  ...label.tier !== void 0 ? { labelTier: label.tier } : {},
@@ -1,6 +1,6 @@
1
- import { At as boolean, Ct as nodePin, Ft as object, I as deriveDetailCropRect, J as pickDetailCropConvention, Lt as string, M as customAction, Mt as lazy, Nt as literal, Ot as _enum, P as defineCustomActions, Pt as number, Y as pickNativeLeaseOverride, Z as pipelineRunnerCapability, c as DEFAULT_DETAIL_CROP_CONVENTION, ct as errMsg, d as DEVICE_BACKEND_TO_FORMAT, kt as array, mt as BaseAddon, vt as createEvent, zt as EventCategory } from "../dist-gXdWP96z.mjs";
2
- import { c as getStepDefinition, t as attributeStall } from "../event-loop-stall-monitor-TnQ21mu0.mjs";
3
- import { a as nativeLeaseSettingEnv, t as isWorkerReply } from "../worker-protocol-DJWdPLKF.mjs";
1
+ import { At as array, Bt as EventCategory, F as defineCustomActions, Ft as number, It as object, L as deriveDetailCropRect, N as customAction, Nt as lazy, Pt as literal, Q as pipelineRunnerCapability, Rt as string, X as pickNativeLeaseOverride, Y as pickDetailCropConvention, c as DEFAULT_DETAIL_CROP_CONVENTION, d as DEVICE_BACKEND_TO_FORMAT, ht as BaseAddon, jt as boolean, kt as _enum, lt as errMsg, wt as nodePin, yt as createEvent } from "../dist-Ccmt3fGJ.mjs";
2
+ import { c as getStepDefinition, t as attributeStall } from "../event-loop-stall-monitor-OJrOMeuu.mjs";
3
+ import { a as nativeLeaseSettingEnv, t as isWorkerReply } from "../worker-protocol-DDpliBIW.mjs";
4
4
  import { t as resolveHubHostname } from "../hub-hostname-cCknRYKj.mjs";
5
5
  import { t as getSharp } from "../lazy-sharp-6oymT_yf.mjs";
6
6
  import { i as withDetectionIntent, n as profileForStreamId, t as isRemoteRestream } from "../remote-restream-Ci7RXNGb.mjs";
@@ -2084,6 +2084,7 @@ function toDetailResult(detection, stepId, crop) {
2084
2084
  score: detection.score,
2085
2085
  bbox: mapBboxToFrameSpace(detection.bbox, crop),
2086
2086
  ...detection.embedding !== void 0 ? { embedding: encodeEmbeddingBase64(detection.embedding) } : {},
2087
+ ...detection.embeddingMagnitude !== void 0 ? { embeddingMagnitude: detection.embeddingMagnitude } : {},
2087
2088
  ...label !== void 0 ? {
2088
2089
  label: label.label,
2089
2090
  ...label.tier !== void 0 ? { labelTier: label.tier } : {},
@@ -1,4 +1,4 @@
1
- import { q as parseProcStatus } from "./dist-gXdWP96z.mjs";
1
+ import { J as parseProcStatus } from "./dist-Ccmt3fGJ.mjs";
2
2
  import { execFile } from "node:child_process";
3
3
  import * as fs from "node:fs";
4
4
  //#region src/shared/node-topology-platform.ts
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-dm3t4BOt.js");
1
+ const require_dist = require("./dist-C11WuNUP.js");
2
2
  let node_child_process = require("node:child_process");
3
3
  let node_fs = require("node:fs");
4
4
  node_fs = require_dist.__toESM(node_fs);