@camstack/addon-pipeline 1.2.329 → 1.2.330

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 (33) 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-ChH7Y219.js → default-detection-model-B6gKGnfx.js} +39 -67
  4. package/dist/{default-detection-model-j0nBpRoB.mjs → default-detection-model-CPDT_eFT.mjs} +39 -67
  5. package/dist/detection-pipeline/index.js +197 -31
  6. package/dist/detection-pipeline/index.mjs +197 -31
  7. package/dist/{dist-BlIWhjnu.js → dist-CMeICL07.js} +771 -464
  8. package/dist/{dist-0HoA3wAi.mjs → dist-CuPEyZY2.mjs} +726 -437
  9. package/dist/motion-wasm/index.js +1 -1
  10. package/dist/motion-wasm/index.mjs +1 -1
  11. package/dist/{node-HOMWRPzW.mjs → node-USq5jYwq.mjs} +1 -1
  12. package/dist/{node-BPpVMnZy.js → node-X_0Tka7-.js} +1 -1
  13. package/dist/pipeline-runner/index.js +355 -104
  14. package/dist/pipeline-runner/index.mjs +355 -104
  15. package/dist/{process-memory-DuF8pa2w.mjs → process-memory-07XYts8V.mjs} +1 -1
  16. package/dist/{process-memory-BW06vOIQ.js → process-memory-o4LFWbBN.js} +1 -1
  17. package/dist/recorder/index.js +7 -7
  18. package/dist/recorder/index.mjs +7 -7
  19. package/dist/{segment-demux-js-BU2MXpln.mjs → segment-demux-js-Bq8DrH0b.mjs} +2 -2
  20. package/dist/{segment-demux-js-Dl52Zz8w.js → segment-demux-js-FqaQjG7n.js} +2 -2
  21. package/dist/stream-broker/_stub.js +2 -2
  22. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-vNfS65In.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-EYRUYv_r.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-BnP7C_HO.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-CR0--kRv.mjs +26 -0
  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-Ciacp783.mjs → hostInit-iGdBpvGc.mjs} +2 -2
  28. package/dist/stream-broker/index.js +4 -4
  29. package/dist/stream-broker/index.mjs +4 -4
  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-DfeHvW4k.mjs +0 -26
  33. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BpXPNINd.mjs +0 -26
@@ -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-BlIWhjnu.js");
7
- const require_node = require("../node-BPpVMnZy.js");
8
- const require_default_detection_model = require("../default-detection-model-ChH7Y219.js");
6
+ const require_dist = require("../dist-CMeICL07.js");
7
+ const require_node = require("../node-X_0Tka7-.js");
8
+ const require_default_detection_model = require("../default-detection-model-B6gKGnfx.js");
9
9
  const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
10
- const require_process_memory = require("../process-memory-BW06vOIQ.js");
10
+ const require_process_memory = require("../process-memory-o4LFWbBN.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");
@@ -759,7 +759,7 @@ var POOL_MODEL_LOAD_BOUNDS = {
759
759
  hardMs: 6e5,
760
760
  why: "A cold iGPU compile of the WHOLE model set measured ~25 s on the N100; one model is 1-3 s (YuNet 1.4 s on a fresh worker, 2026-09-26). 120 s is ~5x the worst measured set. No evidence of a legitimate compile past it; the hard bound gives one 5x more before the worker is recycled.",
761
761
  gilMayBeHeldDuringCompile: false,
762
- gilWhy: "The OpenVINO Python binding is believed to release the GIL around compile_model (gil_scoped_release). Not measured on the hub; the passive recipe in D653 checks it."
762
+ gilWhy: "The OpenVINO Python binding is believed to release the GIL around compile_model (gil_scoped_release). Not yet measured on this node."
763
763
  },
764
764
  coreml: {
765
765
  softMs: 3e5,
@@ -5783,6 +5783,26 @@ var PLATE_OCR_CROP_POLICIES = {
5783
5783
  }
5784
5784
  };
5785
5785
  /**
5786
+ * The margin around a plate box drawn by the ROOT model (D730) — a Frigate+
5787
+ * `license_plate` read in place of `plate-detection`'s own box.
5788
+ *
5789
+ * The margin is a property of the box's detector (see above), and this
5790
+ * detector's boxes have never been measured against the plate readers: 0.15 is
5791
+ * the value that served a TIGHT detector box (the deleted `yolov8n-plate`,
5792
+ * 7/7 Kia reads at 0.13–0.16), on the assumption that Frigate+ boxes are
5793
+ * tight as well. It is uncalibrated and needs measuring on a ground-truth set
5794
+ * of root-supplied plates before it is trusted; until then it applies to every
5795
+ * reader alike, replacing the reader's own detector-specific margin.
5796
+ */
5797
+ var ROOT_SUPPLIED_PLATE_MARGIN_FRACTION = .15;
5798
+ /**
5799
+ * The margin a reader cuts around its plate box: the reader's own, unless the
5800
+ * box was drawn by the root model.
5801
+ */
5802
+ function plateOcrMarginFraction(policy, boxFromRoot) {
5803
+ return boxFromRoot ? ROOT_SUPPLIED_PLATE_MARGIN_FRACTION : policy.marginFraction;
5804
+ }
5805
+ /**
5786
5806
  * The crop policy for a step child, or `null` when the child is not a plate
5787
5807
  * reader at all (a face embedder, a classifier — nothing here applies to them).
5788
5808
  */
@@ -5812,6 +5832,79 @@ function expandBbox(bbox, marginFraction, imageWidth, imageHeight) {
5812
5832
  ];
5813
5833
  }
5814
5834
  //#endregion
5835
+ //#region src/detection-pipeline/pipeline/root-child-boxes.ts
5836
+ /**
5837
+ * Root child boxes (D730) — a root model's `license_plate` / `face` box made
5838
+ * into a DETAIL of the vehicle / person that contains it.
5839
+ *
5840
+ * The labels are deliberately absent from the root's classMap, so they never
5841
+ * make a first-level detection and therefore never a track (D683). When the
5842
+ * root declares a CROP supply for them, the executor keeps the boxes aside
5843
+ * instead of discarding them, and once the frame's first-level detections are
5844
+ * final this attaches each to its containing parent (`containingParentIndex`).
5845
+ * Whether the camera USES them is the runner's decision
5846
+ * (`pipeline-runner/root-supply.ts`); a box nothing contains is discarded.
5847
+ *
5848
+ * Pure.
5849
+ */
5850
+ /** The crop supply a raw root class belongs to, if the root declares one. */
5851
+ function cropSupplyForLabel(supplies, rawClass) {
5852
+ for (const supply of supplies ?? []) if (supply.kind === "crop" && supply.rootLabels.includes(rawClass)) return supply;
5853
+ }
5854
+ function toBox(b) {
5855
+ return {
5856
+ x: b[0],
5857
+ y: b[1],
5858
+ w: b[2] - b[0],
5859
+ h: b[3] - b[1]
5860
+ };
5861
+ }
5862
+ /**
5863
+ * Attach each candidate to the smallest first-level parent of its supply's
5864
+ * macro that contains it. Never mutates the parents.
5865
+ */
5866
+ function attachRootChildBoxes(candidates, parents, modelId, idGen) {
5867
+ const details = [];
5868
+ const uncontained = [];
5869
+ for (const candidate of candidates) {
5870
+ const eligible = parents.filter((p) => p.kind === "first-level" && p.macroClass === candidate.supply.parentMacro);
5871
+ const index = require_dist.containingParentIndex(toBox(candidate.bbox), eligible.map((p) => toBox(p.bbox)));
5872
+ const parent = index >= 0 ? eligible[index] : void 0;
5873
+ if (parent === void 0) {
5874
+ uncontained.push(candidate);
5875
+ continue;
5876
+ }
5877
+ const stepId = candidate.supply.stepId;
5878
+ details.push({
5879
+ id: idGen.next(),
5880
+ kind: "detail",
5881
+ macroClass: candidate.supply.childClass,
5882
+ originalClass: candidate.rawClass,
5883
+ score: candidate.score,
5884
+ bbox: [
5885
+ candidate.bbox[0],
5886
+ candidate.bbox[1],
5887
+ candidate.bbox[2],
5888
+ candidate.bbox[3]
5889
+ ],
5890
+ parentId: parent.id,
5891
+ rootSupplied: {
5892
+ stepId,
5893
+ modelId
5894
+ },
5895
+ ownLabels: [],
5896
+ alternateLabels: {},
5897
+ stepLatencyMs: {},
5898
+ modelIds: { [stepId]: modelId },
5899
+ extractMode: "full-frame"
5900
+ });
5901
+ }
5902
+ return {
5903
+ details,
5904
+ uncontained
5905
+ };
5906
+ }
5907
+ //#endregion
5815
5908
  //#region src/detection-pipeline/pipeline/plate-warp.ts
5816
5909
  /**
5817
5910
  * Plate-crop WARP — perspective rectification of a licence-plate ROI to a
@@ -6368,6 +6461,7 @@ function buildFrameResult(input) {
6368
6461
  } : {},
6369
6462
  labels,
6370
6463
  ...m.parentId !== void 0 ? { parentId: m.parentId } : {},
6464
+ ...m.rootSupplied !== void 0 ? { rootSupplied: m.rootSupplied } : {},
6371
6465
  ...embedding !== void 0 ? {
6372
6466
  embedding,
6373
6467
  ...embeddingModelId !== void 0 ? { embeddingModelId } : {}
@@ -6469,33 +6563,35 @@ function toMutableRootDetection(det, rootStep, idGen, rootStepLatencyMs) {
6469
6563
  //#endregion
6470
6564
  //#region src/detection-pipeline/pipeline/linked-label.ts
6471
6565
  /**
6472
- * The detector's linked label (D715): when the model that RAN declares it
6473
- * fills a step, a detection whose raw class names that step's effect carries
6474
- * the effect as a `ScoredLabel` attributed to `detector-link:<stepId>` — in
6475
- * the step's own vocabulary and tier, so tier 1 means one thing whichever
6566
+ * The detector's linked label (D715, D730): when the model that RAN declares a
6567
+ * LABEL supply for a step, a detection whose raw class names that step's effect
6568
+ * carries the effect as a `ScoredLabel` attributed to `detector-link:<stepId>`
6569
+ * — in the step's own vocabulary and tier, so tier 1 means one thing whichever
6476
6570
  * writer produced it.
6477
6571
  *
6478
6572
  * Written at score 0 here, always: the executor cannot see the camera's whole
6479
6573
  * step tree (a detail step placed on another pool is pruned from the dispatch),
6480
- * so it cannot know who the writer is. The runner, which holds the attach
6481
- * config, raises the score to the detection's own when the detector is
6482
- * authoritative (`pipeline-runner/label-link.ts`). Score 0 is the fallback any
6483
- * scored answer of the step outranks.
6574
+ * so it cannot know whether the camera USES the supply. The runner, which holds
6575
+ * the attach config, decides with `resolveRootSupply` (`pipeline-runner/root-supply.ts`):
6576
+ * effective ⇒ the label is raised to the detection's score, or dropped when the
6577
+ * step's class list switched it off; otherwise it stays the score-0 fallback
6578
+ * any scored answer of the step outranks.
6484
6579
  */
6485
6580
  /** The linked labels one mapped root detection carries. Pure. */
6486
- function linkedLabelsFor(fills, rawClass, macroClass, modelId) {
6487
- if (fills === void 0 || fills.length === 0) return [];
6581
+ function linkedLabelsFor(supplies, rawClass, macroClass, modelId) {
6582
+ if (supplies === void 0 || supplies.length === 0) return [];
6488
6583
  const out = [];
6489
- for (const fill of fills) {
6490
- if (require_dist.FILLABLE_STEP_MACRO[fill.stepId] !== macroClass) continue;
6491
- const effect = fill.labelToEffect[rawClass];
6584
+ for (const supply of supplies) {
6585
+ if (supply.kind !== "label") continue;
6586
+ if (require_dist.LABEL_SUPPLY_MACRO[supply.stepId] !== macroClass) continue;
6587
+ const effect = supply.labelToEffect[rawClass];
6492
6588
  if (effect === void 0 || effect === macroClass) continue;
6493
- const tier = require_default_detection_model.getStepDefinition(fill.stepId).labelTier;
6589
+ const tier = require_default_detection_model.getStepDefinition(supply.stepId).labelTier;
6494
6590
  out.push({
6495
6591
  label: effect,
6496
6592
  score: 0,
6497
6593
  ...tier !== void 0 ? { tier } : {},
6498
- stepId: require_dist.linkedLabelStepId(fill.stepId),
6594
+ stepId: require_dist.linkedLabelStepId(supply.stepId),
6499
6595
  modelId
6500
6596
  });
6501
6597
  }
@@ -6724,10 +6820,19 @@ var PipelineExecutor = class {
6724
6820
  const rootView = rootInputViewProvider ? await rootInputViewProvider(rootStep, rootCrop) : null;
6725
6821
  const cropPrep = !rootView && rootCrop !== void 0 ? await this.prepareCropZoneInput(rootCrop, fullFrameJpegProvider, imageWidth, imageHeight, deviceId) : null;
6726
6822
  const rootStart = Date.now();
6727
- const rawRootOutput = await this.executeStep(rootStep, rootView?.input ?? cropPrep?.input ?? withInferenceDeviceId(rootInput, deviceId), rootView?.width ?? cropPrep?.width ?? imageWidth, rootView?.height ?? cropPrep?.height ?? imageHeight, "full-frame", void 0, void 0, traceBuilder, stepTimings, poolAgg, rootShed);
6823
+ const supplied = runOpts?.suppliedRoot?.stepId === rootStep.stepId ? runOpts.suppliedRoot : void 0;
6824
+ const rawRootOutput = supplied ? {
6825
+ kind: "detections",
6826
+ detections: supplied.detections.map((d) => ({
6827
+ class: rootStep.definition.outputClasses[0] ?? rootStep.stepId,
6828
+ score: d.score,
6829
+ bbox: d.bbox,
6830
+ ...d.landmarks !== void 0 ? { landmarks: d.landmarks } : {}
6831
+ }))
6832
+ } : await this.executeStep(rootStep, rootView?.input ?? cropPrep?.input ?? withInferenceDeviceId(rootInput, deviceId), rootView?.width ?? cropPrep?.width ?? imageWidth, rootView?.height ?? cropPrep?.height ?? imageHeight, "full-frame", void 0, void 0, traceBuilder, stepTimings, poolAgg, rootShed);
6728
6833
  const rootMs = Date.now() - rootStart;
6729
6834
  if (rawRootOutput === null) continue;
6730
- const rootOutput = rootView && rawRootOutput.kind === "detections" ? reprojectViewDetections(rawRootOutput, rootView.geometry) : cropPrep && rawRootOutput.kind === "detections" ? reprojectCropZoneDetections(rawRootOutput, cropPrep.origin) : rawRootOutput;
6835
+ const rootOutput = supplied ? rawRootOutput : rootView && rawRootOutput.kind === "detections" ? reprojectViewDetections(rawRootOutput, rootView.geometry) : cropPrep && rawRootOutput.kind === "detections" ? reprojectCropZoneDetections(rawRootOutput, cropPrep.origin) : rawRootOutput;
6731
6836
  if (rootOutput.kind !== "detections") {
6732
6837
  if (isEnrichmentOutput(rootOutput)) {
6733
6838
  const mutable = this.synthesizeRootDetection(rootOutput, rootStep, idGen, rootMs, imageWidth, imageHeight);
@@ -6749,8 +6854,33 @@ var PipelineExecutor = class {
6749
6854
  }
6750
6855
  continue;
6751
6856
  }
6857
+ const rootChildCandidates = [];
6858
+ const firstLevelStart = firstLevel.length;
6752
6859
  for (const det of rootOutput.detections) {
6753
- const mutable = toMutableRootDetection(det, rootStep, idGen, rootMs);
6860
+ const cropSupply = cropSupplyForLabel(rootStep.rootSupplies, det.class);
6861
+ if (cropSupply !== void 0) {
6862
+ rootChildCandidates.push({
6863
+ rawClass: det.class,
6864
+ score: det.score,
6865
+ bbox: [
6866
+ det.bbox[0],
6867
+ det.bbox[1],
6868
+ det.bbox[2],
6869
+ det.bbox[3]
6870
+ ],
6871
+ supply: cropSupply
6872
+ });
6873
+ continue;
6874
+ }
6875
+ const seeded = toMutableRootDetection(det, rootStep, idGen, rootMs);
6876
+ const mutable = supplied ? {
6877
+ ...seeded,
6878
+ rootSupplied: {
6879
+ stepId: rootStep.stepId,
6880
+ modelId: supplied.modelId
6881
+ },
6882
+ modelIds: { [rootStep.stepId]: supplied.modelId }
6883
+ } : seeded;
6754
6884
  if (rootStep.effectiveClassMap) {
6755
6885
  const mapped = rootStep.effectiveClassMap.mapping[det.class];
6756
6886
  if (mapped) {
@@ -6771,7 +6901,7 @@ var PipelineExecutor = class {
6771
6901
  continue;
6772
6902
  }
6773
6903
  }
6774
- for (const linked of linkedLabelsFor(rootStep.fillsClassifierEffects, det.class, mutable.macroClass, rootStep.modelId)) mutable.ownLabels.push(linked);
6904
+ for (const linked of linkedLabelsFor(rootStep.rootSupplies, det.class, mutable.macroClass, rootStep.modelId)) mutable.ownLabels.push(linked);
6775
6905
  const filterVerdict = this.macroFilterVerdict(mutable.macroClass, mutable.score, rootStep.settings);
6776
6906
  if (filterVerdict !== "pass") {
6777
6907
  (discarded ??= []).push({
@@ -6853,6 +6983,21 @@ var PipelineExecutor = class {
6853
6983
  }
6854
6984
  firstLevel.push(mutable);
6855
6985
  }
6986
+ if (rootChildCandidates.length > 0) {
6987
+ const attached = attachRootChildBoxes(rootChildCandidates, firstLevel.slice(firstLevelStart), rootStep.modelId, idGen);
6988
+ details.push(...attached.details);
6989
+ for (const c of attached.uncontained) (discarded ??= []).push({
6990
+ bbox: [
6991
+ c.bbox[0],
6992
+ c.bbox[1],
6993
+ c.bbox[2],
6994
+ c.bbox[3]
6995
+ ],
6996
+ macroClass: c.supply.childClass,
6997
+ score: c.score,
6998
+ reason: "class-filter"
6999
+ });
7000
+ }
6856
7001
  }
6857
7002
  const totalMs = Date.now() - startMs;
6858
7003
  return {
@@ -7120,7 +7265,8 @@ var PipelineExecutor = class {
7120
7265
  }
7121
7266
  } else {
7122
7267
  const cropPolicy = resolvePlateOcrCropPolicy(resolveEffectivePostprocessor(child.definition, child.modelId));
7123
- const cropBbox = cropPolicy ? expandBbox(parentDetection.bbox, cropPolicy.marginFraction, imageWidth, imageHeight) : parentDetection.bbox;
7268
+ const marginFraction = cropPolicy ? plateOcrMarginFraction(cropPolicy, parentDetection.rootSupplied !== void 0) : 0;
7269
+ const cropBbox = cropPolicy ? expandBbox(parentDetection.bbox, marginFraction, imageWidth, imageHeight) : parentDetection.bbox;
7124
7270
  const nativeChild = nativeCropProvider && child.children.length === 0 ? await nativeChildCrop(nativeCropProvider, cropBbox, imageWidth, imageHeight, NATIVE_CHILD_CROP_MAX_WIDTH) : null;
7125
7271
  if (nativeChild) {
7126
7272
  cropJpegBuf = nativeChild.jpeg;
@@ -7143,7 +7289,8 @@ var PipelineExecutor = class {
7143
7289
  plateLongSidePx: Math.round(plateLongSidePx),
7144
7290
  plateShortSidePx: Math.round(Math.min(cropW, cropH)),
7145
7291
  minPlateLongSidePx: cropPolicy.minLongSidePx,
7146
- marginFraction: cropPolicy.marginFraction,
7292
+ marginFraction,
7293
+ boxFrom: parentDetection.rootSupplied !== void 0 ? "root-model" : "step",
7147
7294
  source: nativeChild ? "native" : "detection-tile"
7148
7295
  }
7149
7296
  });
@@ -7341,9 +7488,18 @@ function buildNode(step, getEngine, resolveModel, onMissingVariant, resolved) {
7341
7488
  children,
7342
7489
  ...Object.keys(mergedSettings).length > 0 ? { settings: mergedSettings } : {},
7343
7490
  ...effectiveClassMap !== void 0 ? { effectiveClassMap } : {},
7344
- ...modelEntry?.fillsClassifierEffects !== void 0 ? { fillsClassifierEffects: modelEntry.fillsClassifierEffects } : {}
7491
+ ...rootSuppliesField(definition, modelEntry)
7345
7492
  };
7346
7493
  }
7494
+ /** A root step's supplies, omitted when it declares none (and for every child step). */
7495
+ function rootSuppliesField(definition, modelEntry) {
7496
+ if (definition.inputClasses !== null) return {};
7497
+ const supplies = require_dist.rootSuppliesOf(modelEntry, {
7498
+ labels: definition.labels ?? [],
7499
+ ...definition.classMap !== void 0 ? { classMap: definition.classMap } : {}
7500
+ });
7501
+ return supplies.length > 0 ? { rootSupplies: supplies } : {};
7502
+ }
7347
7503
  /**
7348
7504
  * Walk the step's declared `getConfigSchema()` and collect every field
7349
7505
  * with a primitive `default` value into a plain record. Group fields
@@ -9489,7 +9645,8 @@ var DetectionPipelineProvider = class DetectionPipelineProvider {
9489
9645
  execution = await executor.run(effectiveTree, rootInput, jpegProvider, imageWidth, imageHeight, effectiveDeviceId, {
9490
9646
  traceVerbosity: isRuntime ? this.eventBus ? "summary" : "off" : "full",
9491
9647
  plane: input.plane,
9492
- occasion: input.replay === true ? "replay" : "live"
9648
+ occasion: input.replay === true ? "replay" : "live",
9649
+ ...input.suppliedRoot !== void 0 ? { suppliedRoot: input.suppliedRoot } : {}
9493
9650
  }, nativeCropProvider, cropZoneBbox, rootInputViewProvider);
9494
9651
  executionSucceeded = true;
9495
9652
  } finally {
@@ -11050,7 +11207,7 @@ function buildSchemaSlots(formats, modelsDir, customByStep) {
11050
11207
  ...m.legacy !== void 0 ? { legacy: m.legacy } : {},
11051
11208
  provider: m.provider ?? "camstack",
11052
11209
  defaultConfidence: require_default_detection_model.resolveModelDefaultConfidence(step, m),
11053
- ...m.fillsClassifierEffects !== void 0 ? { fillsClassifierEffects: m.fillsClassifierEffects } : {}
11210
+ ...modelSuppliesField(step, m)
11054
11211
  })),
11055
11212
  defaultModelId: step.defaultModelId,
11056
11213
  ...step.defaultModelIdByFormat ? { defaultModelIdByFormat: { ...step.defaultModelIdByFormat } } : {},
@@ -11186,6 +11343,15 @@ function isDetailPlaneStep(addonId) {
11186
11343
  return false;
11187
11344
  }
11188
11345
  }
11346
+ /** A root model's supplies for the schema, omitted when it supplies nothing. */
11347
+ function modelSuppliesField(step, model) {
11348
+ if (step.inputClasses !== null) return {};
11349
+ const supplies = require_dist.rootSuppliesOf(model, {
11350
+ labels: step.labels ?? [],
11351
+ ...step.classMap !== void 0 ? { classMap: step.classMap } : {}
11352
+ });
11353
+ return supplies.length > 0 ? { suppliesSteps: supplies } : {};
11354
+ }
11189
11355
  /**
11190
11356
  * What a dispatch runs after its per-step loads (D657).
11191
11357
  *
@@ -11434,7 +11600,7 @@ var DetectionPipelineAddon = class extends require_dist.BaseAddon {
11434
11600
  type: "select",
11435
11601
  key: "batchMode",
11436
11602
  label: "Batch dispatch mode",
11437
- description: "How the Python pool GROUPS predict requests — it never changes a model's compiled batch SHAPE, which is derived from (engine, device) at load and is not configurable (D202). `none` = one call per frame. `window` = per-model accumulator coalesces concurrent calls within Window (ms). Auto uses the matrix-sweep default for the current backend. Applies to THIS node only.",
11603
+ description: "How the Python pool GROUPS predict requests — it never changes a model's compiled batch SHAPE, which is derived from (engine, device) at load and is not configurable. `none` = one call per frame. `window` = per-model accumulator coalesces concurrent calls within Window (ms). Auto uses the matrix-sweep default for the current backend. Applies to THIS node only.",
11438
11604
  options: [
11439
11605
  {
11440
11606
  value: "",
@@ -11478,7 +11644,7 @@ var DetectionPipelineAddon = class extends require_dist.BaseAddon {
11478
11644
  type: "slider",
11479
11645
  key: "maxBatchSize",
11480
11646
  label: "Max batch size",
11481
- description: "Cap on how many requests are GROUPED into one batched predict call. Not the model's compiled batch shape — that is derived from (engine, device) at load and is not configurable (D202); a stacked tensor is only ever built for an export that declares a flexible batch axis itself. Auto = backend default. Applies to THIS node only.",
11647
+ description: "Cap on how many requests are GROUPED into one batched predict call. Not the model's compiled batch shape — that is derived from (engine, device) at load and is not configurable; a stacked tensor is only ever built for an export that declares a flexible batch axis itself. Auto = backend default. Applies to THIS node only.",
11482
11648
  min: 1,
11483
11649
  max: 16,
11484
11650
  step: 1,