@camstack/addon-pipeline 1.2.328 → 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 (41) hide show
  1. package/THIRD_PARTY_MODELS.md +2 -2
  2. package/dist/audio-analyzer/index.js +2 -2
  3. package/dist/audio-analyzer/index.mjs +2 -2
  4. package/dist/{default-detection-model-1SadEKsW.js → default-detection-model-B6gKGnfx.js} +53 -71
  5. package/dist/{default-detection-model-CMeVTcPZ.mjs → default-detection-model-CPDT_eFT.mjs} +53 -71
  6. package/dist/detection-pipeline/index.js +607 -39
  7. package/dist/detection-pipeline/index.mjs +607 -39
  8. package/dist/{dist-wJO7mXeO.js → dist-CMeICL07.js} +781 -465
  9. package/dist/{dist-Bpub2VcJ.mjs → dist-CuPEyZY2.mjs} +736 -438
  10. package/dist/motion-wasm/index.js +1 -1
  11. package/dist/motion-wasm/index.mjs +1 -1
  12. package/dist/{node-BjCSgD4M.mjs → node-USq5jYwq.mjs} +1 -1
  13. package/dist/{node-BCrqaejt.js → node-X_0Tka7-.js} +1 -1
  14. package/dist/pipeline-runner/index.js +355 -104
  15. package/dist/pipeline-runner/index.mjs +355 -104
  16. package/dist/{process-memory-BaKQ8u2G.mjs → process-memory-07XYts8V.mjs} +1 -1
  17. package/dist/{process-memory-iUJuTpXs.js → process-memory-o4LFWbBN.js} +1 -1
  18. package/dist/recorder/index.js +7 -7
  19. package/dist/recorder/index.mjs +7 -7
  20. package/dist/{segment-demux-js-C5ez9LYG.mjs → segment-demux-js-Bq8DrH0b.mjs} +2 -2
  21. package/dist/{segment-demux-js-Opx6Hv9G.js → segment-demux-js-FqaQjG7n.js} +2 -2
  22. package/dist/stream-broker/_stub.js +2 -2
  23. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-B94LgsV0.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-EYRUYv_r.mjs} +3 -3
  24. 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
  25. 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
  26. package/dist/stream-broker/demux-worker-child.js +1 -1
  27. package/dist/stream-broker/demux-worker-child.mjs +1 -1
  28. package/dist/stream-broker/{hostInit-xOx7AvgW.mjs → hostInit-iGdBpvGc.mjs} +3 -3
  29. package/dist/stream-broker/index.js +4 -4
  30. package/dist/stream-broker/index.mjs +4 -4
  31. package/dist/stream-broker/remoteEntry.js +1 -1
  32. package/package.json +1 -1
  33. package/python/edgetpu_dequant.py +38 -1
  34. package/python/inference_pool.py +31 -17
  35. package/python/postprocessors/test_yolox_plate_edgetpu.py +126 -0
  36. package/python/postprocessors/test_yunet_edgetpu.py +149 -0
  37. package/python/postprocessors/testdata/yolox_plate_int8_outputs.json +1 -0
  38. package/python/postprocessors/testdata/yunet_int8_outputs.json +1 -0
  39. package/python/postprocessors/yolo.py +44 -0
  40. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BPWYf4_O.mjs +0 -26
  41. 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
@@ -12600,398 +12600,35 @@ var ClipSearchStrictnessSchema = _enum([
12600
12600
  "balanced",
12601
12601
  "strict"
12602
12602
  ]);
12603
- var COCO_80_LABELS = [
12604
- {
12605
- id: "person",
12606
- name: "Person"
12607
- },
12608
- {
12609
- id: "bicycle",
12610
- name: "Bicycle"
12611
- },
12612
- {
12613
- id: "car",
12614
- name: "Car"
12615
- },
12616
- {
12617
- id: "motorcycle",
12618
- name: "Motorcycle"
12619
- },
12620
- {
12621
- id: "airplane",
12622
- name: "Airplane"
12623
- },
12624
- {
12625
- id: "bus",
12626
- name: "Bus"
12627
- },
12628
- {
12629
- id: "train",
12630
- name: "Train"
12631
- },
12632
- {
12633
- id: "truck",
12634
- name: "Truck"
12635
- },
12636
- {
12637
- id: "boat",
12638
- name: "Boat"
12639
- },
12640
- {
12641
- id: "traffic light",
12642
- name: "Traffic Light"
12643
- },
12644
- {
12645
- id: "fire hydrant",
12646
- name: "Fire Hydrant"
12647
- },
12648
- {
12649
- id: "stop sign",
12650
- name: "Stop Sign"
12651
- },
12652
- {
12653
- id: "parking meter",
12654
- name: "Parking Meter"
12655
- },
12656
- {
12657
- id: "bench",
12658
- name: "Bench"
12659
- },
12660
- {
12661
- id: "bird",
12662
- name: "Bird"
12663
- },
12664
- {
12665
- id: "cat",
12666
- name: "Cat"
12667
- },
12668
- {
12669
- id: "dog",
12670
- name: "Dog"
12671
- },
12672
- {
12673
- id: "horse",
12674
- name: "Horse"
12675
- },
12676
- {
12677
- id: "sheep",
12678
- name: "Sheep"
12679
- },
12680
- {
12681
- id: "cow",
12682
- name: "Cow"
12683
- },
12684
- {
12685
- id: "elephant",
12686
- name: "Elephant"
12687
- },
12688
- {
12689
- id: "bear",
12690
- name: "Bear"
12691
- },
12692
- {
12693
- id: "zebra",
12694
- name: "Zebra"
12695
- },
12696
- {
12697
- id: "giraffe",
12698
- name: "Giraffe"
12699
- },
12700
- {
12701
- id: "backpack",
12702
- name: "Backpack"
12703
- },
12704
- {
12705
- id: "umbrella",
12706
- name: "Umbrella"
12707
- },
12708
- {
12709
- id: "handbag",
12710
- name: "Handbag"
12711
- },
12712
- {
12713
- id: "tie",
12714
- name: "Tie"
12715
- },
12716
- {
12717
- id: "suitcase",
12718
- name: "Suitcase"
12719
- },
12720
- {
12721
- id: "frisbee",
12722
- name: "Frisbee"
12723
- },
12724
- {
12725
- id: "skis",
12726
- name: "Skis"
12727
- },
12728
- {
12729
- id: "snowboard",
12730
- name: "Snowboard"
12731
- },
12732
- {
12733
- id: "sports ball",
12734
- name: "Sports Ball"
12735
- },
12736
- {
12737
- id: "kite",
12738
- name: "Kite"
12739
- },
12740
- {
12741
- id: "baseball bat",
12742
- name: "Baseball Bat"
12743
- },
12744
- {
12745
- id: "baseball glove",
12746
- name: "Baseball Glove"
12747
- },
12748
- {
12749
- id: "skateboard",
12750
- name: "Skateboard"
12751
- },
12752
- {
12753
- id: "surfboard",
12754
- name: "Surfboard"
12755
- },
12756
- {
12757
- id: "tennis racket",
12758
- name: "Tennis Racket"
12759
- },
12760
- {
12761
- id: "bottle",
12762
- name: "Bottle"
12763
- },
12764
- {
12765
- id: "wine glass",
12766
- name: "Wine Glass"
12767
- },
12768
- {
12769
- id: "cup",
12770
- name: "Cup"
12771
- },
12772
- {
12773
- id: "fork",
12774
- name: "Fork"
12775
- },
12776
- {
12777
- id: "knife",
12778
- name: "Knife"
12779
- },
12780
- {
12781
- id: "spoon",
12782
- name: "Spoon"
12783
- },
12784
- {
12785
- id: "bowl",
12786
- name: "Bowl"
12787
- },
12788
- {
12789
- id: "banana",
12790
- name: "Banana"
12791
- },
12792
- {
12793
- id: "apple",
12794
- name: "Apple"
12795
- },
12796
- {
12797
- id: "sandwich",
12798
- name: "Sandwich"
12799
- },
12800
- {
12801
- id: "orange",
12802
- name: "Orange"
12803
- },
12804
- {
12805
- id: "broccoli",
12806
- name: "Broccoli"
12807
- },
12808
- {
12809
- id: "carrot",
12810
- name: "Carrot"
12811
- },
12812
- {
12813
- id: "hot dog",
12814
- name: "Hot Dog"
12815
- },
12816
- {
12817
- id: "pizza",
12818
- name: "Pizza"
12819
- },
12820
- {
12821
- id: "donut",
12822
- name: "Donut"
12823
- },
12824
- {
12825
- id: "cake",
12826
- name: "Cake"
12827
- },
12828
- {
12829
- id: "chair",
12830
- name: "Chair"
12831
- },
12832
- {
12833
- id: "couch",
12834
- name: "Couch"
12835
- },
12836
- {
12837
- id: "potted plant",
12838
- name: "Potted Plant"
12839
- },
12840
- {
12841
- id: "bed",
12842
- name: "Bed"
12843
- },
12844
- {
12845
- id: "dining table",
12846
- name: "Dining Table"
12847
- },
12848
- {
12849
- id: "toilet",
12850
- name: "Toilet"
12851
- },
12852
- {
12853
- id: "tv",
12854
- name: "TV"
12855
- },
12856
- {
12857
- id: "laptop",
12858
- name: "Laptop"
12859
- },
12860
- {
12861
- id: "mouse",
12862
- name: "Mouse"
12863
- },
12864
- {
12865
- id: "remote",
12866
- name: "Remote"
12867
- },
12868
- {
12869
- id: "keyboard",
12870
- name: "Keyboard"
12871
- },
12872
- {
12873
- id: "cell phone",
12874
- name: "Cell Phone"
12875
- },
12876
- {
12877
- id: "microwave",
12878
- name: "Microwave"
12879
- },
12880
- {
12881
- id: "oven",
12882
- name: "Oven"
12883
- },
12884
- {
12885
- id: "toaster",
12886
- name: "Toaster"
12887
- },
12888
- {
12889
- id: "sink",
12890
- name: "Sink"
12891
- },
12892
- {
12893
- id: "refrigerator",
12894
- name: "Refrigerator"
12895
- },
12896
- {
12897
- id: "book",
12898
- name: "Book"
12899
- },
12900
- {
12901
- id: "clock",
12902
- name: "Clock"
12903
- },
12904
- {
12905
- id: "vase",
12906
- name: "Vase"
12907
- },
12908
- {
12909
- id: "scissors",
12910
- name: "Scissors"
12911
- },
12912
- {
12913
- id: "teddy bear",
12914
- name: "Teddy Bear"
12915
- },
12916
- {
12917
- id: "hair drier",
12918
- name: "Hair Drier"
12919
- },
12920
- {
12921
- id: "toothbrush",
12922
- name: "Toothbrush"
12923
- }
12924
- ];
12925
- new Set([
12926
- {
12927
- id: "person",
12928
- name: "Person"
12929
- },
12930
- {
12931
- id: "vehicle",
12932
- name: "Vehicle"
12933
- },
12934
- {
12935
- id: "animal",
12936
- name: "Animal"
12937
- },
12938
- {
12939
- id: "package",
12940
- name: "Package"
12941
- }
12942
- ].map((l) => l.id));
12943
- var COCO_TO_MACRO = {
12944
- mapping: {
12945
- person: "person",
12946
- bicycle: "vehicle",
12947
- car: "vehicle",
12948
- motorcycle: "vehicle",
12949
- airplane: "vehicle",
12950
- bus: "vehicle",
12951
- train: "vehicle",
12952
- truck: "vehicle",
12953
- boat: "vehicle",
12954
- bird: "animal",
12955
- cat: "animal",
12956
- dog: "animal",
12957
- horse: "animal",
12958
- sheep: "animal",
12959
- cow: "animal",
12960
- elephant: "animal",
12961
- bear: "animal",
12962
- zebra: "animal",
12963
- giraffe: "animal",
12964
- suitcase: "package",
12965
- backpack: "package",
12966
- handbag: "package"
12967
- },
12968
- preserveOriginal: false
12969
- };
12970
- /** Steps a root detector may declare it fills. */
12971
- var FILLABLE_STEP_IDS = [
12603
+ /** Steps whose effect a root label can BE. */
12604
+ var LABEL_SUPPLY_STEP_IDS = [
12972
12605
  "animal-classifier",
12973
12606
  "vehicle-classifier",
12974
12607
  "package-detection"
12975
12608
  ];
12976
- /** Narrow a step id to a fillable one — type guard, not a cast. */
12977
- function isFillableStepId(value) {
12978
- return FILLABLE_STEP_IDS.some((id) => id === value);
12609
+ /** Steps whose box a root detection can BE. */
12610
+ var CROP_SUPPLY_STEP_IDS = ["plate-detection", "face-detection"];
12611
+ /** Every step a root model can supply. */
12612
+ var ROOT_SUPPLIABLE_STEP_IDS = [...LABEL_SUPPLY_STEP_IDS, ...CROP_SUPPLY_STEP_IDS];
12613
+ /** Narrow a step id to a label-kind one. */
12614
+ function isLabelSupplyStepId(value) {
12615
+ return LABEL_SUPPLY_STEP_IDS.some((id) => id === value);
12979
12616
  }
12980
12617
  /**
12981
- * The EFFECT vocabulary of each fillable step: exactly the strings the step
12618
+ * The EFFECT vocabulary of each label-kind step: exactly the strings the step
12982
12619
  * itself emits, in its own spelling. A linked label is one of these and nothing
12983
12620
  * else, so a tier-1 value means the same thing whichever writer produced it.
12984
12621
  *
12985
12622
  * - `animal-classifier`: the PRIMARY model's `-labels.json` (Open Images V7,
12986
12623
  * 8 classes) — also the species allow-list the step offers.
12987
- * - `vehicle-classifier`: `vehicle-type-v1-labels.json`, capitalised as the
12988
- * model emits them (the classifier writes `winner.class` verbatim).
12624
+ * - `vehicle-classifier`: the classifier's labels, capitalised as it emits them
12625
+ * (it writes `winner.class` verbatim).
12989
12626
  * - `package-detection`: its one output class.
12990
12627
  *
12991
- * `scripts/check-label-link-vocabulary.ts` fails the build if a model entry's
12628
+ * `scripts/check-label-link-vocabulary.ts` fails the build if a declared
12992
12629
  * `labelToEffect` names anything outside this table.
12993
12630
  */
12994
- var FILLABLE_STEP_VOCABULARIES = {
12631
+ var LABEL_SUPPLY_VOCABULARIES = {
12995
12632
  "animal-classifier": [
12996
12633
  "bird",
12997
12634
  "cat",
@@ -13014,18 +12651,64 @@ var FILLABLE_STEP_VOCABULARIES = {
13014
12651
  ],
13015
12652
  "package-detection": ["package"]
13016
12653
  };
13017
- /** The macro a detection must carry for the step to apply to it. */
13018
- var FILLABLE_STEP_MACRO = {
12654
+ /** The macro a detection must carry for a label-kind step to apply to it. */
12655
+ var LABEL_SUPPLY_MACRO = {
13019
12656
  "animal-classifier": "animal",
13020
12657
  "vehicle-classifier": "vehicle",
13021
12658
  "package-detection": "package"
13022
12659
  };
13023
- /** The policy values of a step's `labelLink` setting. */
13024
- var LABEL_LINK_POLICIES = ["run", "skip-when-filled"];
13025
- /** Absent setting ⇒ this. It changes nothing unless the root model declares a fill. */
13026
- var DEFAULT_LABEL_LINK_POLICY = "skip-when-filled";
13027
- /** The step-settings key the policy is stored under (DeviceStepConfig.settings). */
13028
- var LABEL_LINK_SETTING_KEY = "labelLink";
12660
+ /**
12661
+ * Raw detector labels that name a vocabulary entry under another spelling.
12662
+ * Case-insensitive equality covers the rest (`car` → `Car`).
12663
+ */
12664
+ var EFFECT_ALIASES = {
12665
+ "animal-classifier": {},
12666
+ "vehicle-classifier": {
12667
+ school_bus: "Bus",
12668
+ garbage_truck: "Truck"
12669
+ },
12670
+ "package-detection": {}
12671
+ };
12672
+ var CROP_SUPPLY_SOURCES = {
12673
+ "plate-detection": {
12674
+ rootLabels: ["license_plate"],
12675
+ parentMacro: "vehicle",
12676
+ childClass: "plate",
12677
+ servedChildSteps: ["plate-ocr"],
12678
+ use: "as-output"
12679
+ },
12680
+ "face-detection": {
12681
+ rootLabels: ["face"],
12682
+ parentMacro: "person",
12683
+ childClass: "face",
12684
+ servedChildSteps: ["face-embedding"],
12685
+ use: "refine",
12686
+ minRootInputPx: 640
12687
+ }
12688
+ };
12689
+ /**
12690
+ * Whether an operator intends a step to take the root's output when the
12691
+ * root declares it — the default of the `useRootModel` flag. The label kinds
12692
+ * default ON: the detector's answer is the cheaper one and the classifier
12693
+ * keeps its model for the day the root changes. The crop kinds default OFF: a
12694
+ * root plate box has an uncalibrated OCR margin, and root-face refinement has
12695
+ * not run on live traffic yet.
12696
+ */
12697
+ var USE_ROOT_MODEL_DEFAULTS = {
12698
+ "animal-classifier": true,
12699
+ "vehicle-classifier": true,
12700
+ "package-detection": true,
12701
+ "plate-detection": false,
12702
+ "face-detection": false
12703
+ };
12704
+ /** The step-settings key the flag is stored under (DeviceStepConfig.settings, camera overrides). */
12705
+ var USE_ROOT_MODEL_SETTING_KEY = "useRootModel";
12706
+ /**
12707
+ * The retired D715 policy key. A `skip-when-filled` / `run` value still
12708
+ * stored under it reads as the flag (`true` / `false`) when no flag is stored
12709
+ * — the normal read path, not a migration.
12710
+ */
12711
+ var RETIRED_LABEL_LINK_KEY = "labelLink";
13029
12712
  /** `ScoredLabel.stepId` prefix of a label the detector wrote for a step. */
13030
12713
  var LINKED_LABEL_STEP_PREFIX = "detector-link:";
13031
12714
  /** `detector-link:<stepId>` — the attribution of a linked label. */
@@ -13037,43 +12720,150 @@ function linkedStepOf(attributionStepId) {
13037
12720
  if (attributionStepId === void 0) return void 0;
13038
12721
  if (!attributionStepId.startsWith("detector-link:")) return void 0;
13039
12722
  const stepId = attributionStepId.slice(14);
13040
- return isFillableStepId(stepId) ? stepId : void 0;
13041
- }
13042
- /** Read the `labelLink` policy off a step's settings bag; anything else ⇒ the default. */
13043
- function readLabelLinkPolicy(settings) {
13044
- const raw = settings?.[LABEL_LINK_SETTING_KEY];
13045
- return LABEL_LINK_POLICIES.find((p) => p === raw) ?? "skip-when-filled";
13046
- }
13047
- /**
13048
- * Decide the writer of one filled effect for one camera.
13049
- *
13050
- * - The step is not running (disabled, or not in the camera's tree): the
13051
- * detector is the only writer — authoritative, nothing to skip.
13052
- * - The step runs, the policy is `skip-when-filled` and every coverage gap is
13053
- * switched off in `enabledClasses`: the detector is authoritative and the
13054
- * step is skipped.
13055
- * - Otherwise the step runs and is the writer; the linked label is a score-0
13056
- * fallback.
13057
- */
13058
- function resolveLabelLink(fill, step) {
13059
- const policy = readLabelLinkPolicy(step?.settings);
13060
- const rawEnabled = step?.settings?.["enabledClasses"];
13061
- const allowList = Array.isArray(rawEnabled) && rawEnabled.length > 0 ? rawEnabled.filter((v) => typeof v === "string") : null;
13062
- const openGaps = fill.uncovered.filter((g) => allowList === null || allowList.includes(g));
13063
- if (step === void 0 || !step.enabled) return {
13064
- authoritative: true,
13065
- skip: false,
13066
- policy,
13067
- openGaps
13068
- };
13069
- const skip = policy === "skip-when-filled" && openGaps.length === 0;
12723
+ return isLabelSupplyStepId(stepId) ? stepId : void 0;
12724
+ }
12725
+ function effectFor(stepId, label) {
12726
+ const alias = EFFECT_ALIASES[stepId][label];
12727
+ if (alias !== void 0) return alias;
12728
+ const folded = label.toLowerCase();
12729
+ return LABEL_SUPPLY_VOCABULARIES[stepId].find((v) => v.toLowerCase() === folded);
12730
+ }
12731
+ /**
12732
+ * Which steps a root detector can supply, from its labelmap and classMap.
12733
+ *
12734
+ * - label kind: a label counts for a step only when the classMap sends it to
12735
+ * that step's macro AND it names a vocabulary entry. Every root is judged
12736
+ * the same way — a COCO model supplies the animal classifier with the six
12737
+ * species COCO names, exactly as a Frigate+ model supplies seven.
12738
+ * - crop kind: the labelmap carries one of the step's root labels. Those
12739
+ * labels are deliberately left out of the classMap, so they never make a
12740
+ * track of their own.
12741
+ *
12742
+ * No classMap ⇒ no label supply (nothing says which macro a label lives under).
12743
+ */
12744
+ function deriveRootSupplies(labels, classMap) {
12745
+ const supplies = [];
12746
+ if (classMap !== void 0) for (const stepId of LABEL_SUPPLY_STEP_IDS) {
12747
+ const labelToEffect = {};
12748
+ for (const label of labels) {
12749
+ if (classMap.mapping[label] !== LABEL_SUPPLY_MACRO[stepId]) continue;
12750
+ const effect = effectFor(stepId, label);
12751
+ if (effect !== void 0) labelToEffect[label] = effect;
12752
+ }
12753
+ const covered = new Set(Object.values(labelToEffect));
12754
+ if (covered.size === 0) continue;
12755
+ const uncovered = LABEL_SUPPLY_VOCABULARIES[stepId].filter((v) => !covered.has(v));
12756
+ supplies.push({
12757
+ kind: "label",
12758
+ stepId,
12759
+ labelToEffect,
12760
+ uncovered
12761
+ });
12762
+ }
12763
+ const present = new Set(labels);
12764
+ for (const stepId of CROP_SUPPLY_STEP_IDS) {
12765
+ const source = CROP_SUPPLY_SOURCES[stepId];
12766
+ const rootLabels = source.rootLabels.filter((l) => present.has(l));
12767
+ if (rootLabels.length === 0) continue;
12768
+ supplies.push({
12769
+ kind: "crop",
12770
+ stepId,
12771
+ rootLabels,
12772
+ parentMacro: source.parentMacro,
12773
+ childClass: source.childClass
12774
+ });
12775
+ }
12776
+ return supplies;
12777
+ }
12778
+ /**
12779
+ * The supplies a root model declares. A row registered with a declaration
12780
+ * carries it (`suppliesSteps`, computed at import from the model's own
12781
+ * labelmap); a row without one — a built-in entry, or a custom row registered
12782
+ * before the field existed — is derived here, on read, from the same inputs.
12783
+ */
12784
+ function rootSuppliesOf(entry, stepDefaults) {
12785
+ const declared = entry?.suppliesSteps ?? deriveRootSupplies(entry !== void 0 && entry.labels.length > 0 ? entry.labels.map((l) => l.id) : stepDefaults.labels, entry?.classMap ?? stepDefaults.classMap);
12786
+ const inputPx = entry !== void 0 ? Math.min(entry.inputSize.width, entry.inputSize.height) : void 0;
12787
+ if (inputPx === void 0) return declared;
12788
+ return declared.map((s) => s.kind === "crop" ? {
12789
+ ...s,
12790
+ rootInputPx: inputPx
12791
+ } : s);
12792
+ }
12793
+ /** The supply a root declares for one step, if any. */
12794
+ function supplyFor(supplies, stepId) {
12795
+ return supplies?.find((s) => s.stepId === stepId);
12796
+ }
12797
+ /**
12798
+ * Read the `useRootModel` flag off a step's settings bag. Absent ⇒ the
12799
+ * retired `labelLink` value if one is stored, else the step's default.
12800
+ */
12801
+ function readUseRootModel(stepId, settings) {
12802
+ const raw = settings?.[USE_ROOT_MODEL_SETTING_KEY];
12803
+ if (typeof raw === "boolean") return raw;
12804
+ const retired = settings?.[RETIRED_LABEL_LINK_KEY];
12805
+ if (retired === "skip-when-filled") return true;
12806
+ if (retired === "run") return false;
12807
+ return USE_ROOT_MODEL_DEFAULTS[stepId];
12808
+ }
12809
+ /** Why a DECLARED supply is still not usable, or `undefined` when it is. */
12810
+ function supplyBlocker(supply) {
12811
+ if (supply.kind !== "crop") return void 0;
12812
+ const min = CROP_SUPPLY_SOURCES[supply.stepId].minRootInputPx;
12813
+ if (min === void 0) return void 0;
12814
+ return supply.rootInputPx !== void 0 && supply.rootInputPx >= min ? void 0 : "root-input-too-small";
12815
+ }
12816
+ /**
12817
+ * THE decision. Effective = the operator intends it AND the current root
12818
+ * declares it. It never looks at, changes or clears the step's `modelId`: a
12819
+ * root that cannot supply the step leaves the step running its own model, and
12820
+ * switching back to a root that can re-activates the supply by itself.
12821
+ */
12822
+ function resolveRootSupply(stepId, settings, rootSupplies) {
12823
+ const supply = supplyFor(rootSupplies, stepId);
12824
+ const intent = readUseRootModel(stepId, settings);
12825
+ const blocker = supply === void 0 ? "root-does-not-declare" : supplyBlocker(supply);
13070
12826
  return {
13071
- authoritative: skip,
13072
- skip,
13073
- policy,
13074
- openGaps
12827
+ stepId,
12828
+ supply,
12829
+ intent,
12830
+ effective: intent && blocker === void 0,
12831
+ inactive: intent && blocker !== void 0,
12832
+ ...intent && blocker !== void 0 ? { inactiveReason: blocker } : {}
13075
12833
  };
13076
12834
  }
12835
+ /**
12836
+ * The fine label a supplied root class becomes for a step whose supply is
12837
+ * effective, or `undefined` when the step's `enabledClasses` switched it off —
12838
+ * the detection then stays at its macro (`animal`). Empty / absent allow-list
12839
+ * = every class.
12840
+ */
12841
+ function allowedSuppliedEffect(effect, settings) {
12842
+ const raw = settings?.["enabledClasses"];
12843
+ if (!Array.isArray(raw) || raw.length === 0) return true;
12844
+ return raw.some((v) => v === effect);
12845
+ }
12846
+ /**
12847
+ * The parent a root child box belongs to: among `parents`, the SMALLEST whose
12848
+ * box holds at least {@link ROOT_CHILD_CONTAINMENT_MIN} of the child's area
12849
+ * (a plate inside the car, not inside the bus behind it). `-1` when none does
12850
+ * — the box then belongs to nobody and makes nothing.
12851
+ */
12852
+ function containingParentIndex(child, parents) {
12853
+ const childArea = child.w * child.h;
12854
+ if (!(childArea > 0)) return -1;
12855
+ let best = -1;
12856
+ let bestArea = Number.POSITIVE_INFINITY;
12857
+ parents.forEach((p, i) => {
12858
+ if (Math.max(0, Math.min(child.x + child.w, p.x + p.w) - Math.max(child.x, p.x)) * Math.max(0, Math.min(child.y + child.h, p.y + p.h) - Math.max(child.y, p.y)) / childArea < .9) return;
12859
+ const area = p.w * p.h;
12860
+ if (area < bestArea) {
12861
+ best = i;
12862
+ bestArea = area;
12863
+ }
12864
+ });
12865
+ return best;
12866
+ }
13077
12867
  var MODEL_FORMATS = [
13078
12868
  "onnx",
13079
12869
  "coreml",
@@ -13219,12 +13009,35 @@ var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { wei
13219
13009
  /** True when the weights or their data forbid commercial use. */
13220
13010
  nonCommercial: boolean().optional()
13221
13011
  }));
13222
- /** One `fillsClassifierEffects` entry — see `ModelCatalogEntry.fillsClassifierEffects`. */
13223
- var FillsClassifierEffectSchema = object({
13224
- stepId: _enum(FILLABLE_STEP_IDS),
13012
+ /**
13013
+ * One step a ROOT detector can supply from its own output (D730) — see
13014
+ * `ModelCatalogEntry.suppliesSteps`.
13015
+ *
13016
+ * - `label`: the root's raw class IS the step's answer. `labelToEffect` maps
13017
+ * the root's label to the step's vocabulary; `uncovered` is the vocabulary
13018
+ * the root cannot produce (shown as unavailable, never a blocker).
13019
+ * - `crop`: the root draws the box the step would have found (`license_plate`
13020
+ * for plate-detection, `face` for face-detection). The box becomes a detail
13021
+ * child of the `parentMacro` detection that contains it — never a track.
13022
+ */
13023
+ var RootStepSupplySchema = discriminatedUnion("kind", [object({
13024
+ kind: literal("label"),
13025
+ stepId: _enum(LABEL_SUPPLY_STEP_IDS),
13225
13026
  labelToEffect: record(string(), string()),
13226
13027
  uncovered: array(string()).readonly()
13227
- });
13028
+ }), object({
13029
+ kind: literal("crop"),
13030
+ stepId: _enum(CROP_SUPPLY_STEP_IDS),
13031
+ rootLabels: array(string()).readonly(),
13032
+ parentMacro: _enum(["vehicle", "person"]),
13033
+ childClass: _enum(["plate", "face"]),
13034
+ /**
13035
+ * The root's smaller input side, stamped on read by `rootSuppliesOf` from
13036
+ * the model entry — what a step's `minRootInputPx` gate judges. Never
13037
+ * stored by an import.
13038
+ */
13039
+ rootInputPx: number().int().positive().optional()
13040
+ })]);
13228
13041
  var ModelCatalogEntrySchema = object({
13229
13042
  id: string(),
13230
13043
  name: string(),
@@ -13351,15 +13164,15 @@ var ModelCatalogEntrySchema = object({
13351
13164
  */
13352
13165
  classMap: DetectionCatalogClassMapSchema.optional(),
13353
13166
  /**
13354
- * The pipeline steps this ROOT detector already does the work of (D715):
13355
- * its labels name the effect the step exists to produce (`deer` for
13356
- * `animal-classifier`, `package` for `package-detection`). Derived from the
13357
- * labelmap by `deriveClassifierFills`, never hand-written; a COCO model
13358
- * declares none. Whether a declaration is honoured is the step's own
13359
- * `labelLink` policy (`resolveLabelLink`). `labelToEffect` values are in
13360
- * `FILLABLE_STEP_VOCABULARIES` (guard `check-label-link-vocabulary`).
13167
+ * The pipeline steps this ROOT detector can supply from its own output
13168
+ * (D730): its labels name a step's effect (`deer` for `animal-classifier`)
13169
+ * or draw a step's box (`license_plate` for `plate-detection`). Computed at
13170
+ * import from THIS model's labelmap by `deriveRootSupplies`, never written
13171
+ * by hand and never assumed per family; a row without it is derived on read
13172
+ * (`rootSuppliesOf`). Whether a camera uses it is the step's own
13173
+ * `useRootModel` flag (`resolveRootSupply`).
13361
13174
  */
13362
- fillsClassifierEffects: array(FillsClassifierEffectSchema).readonly().optional(),
13175
+ suppliesSteps: array(RootStepSupplySchema).readonly().optional(),
13363
13176
  /**
13364
13177
  * The model's CLIP feature-space contract (text encoder, dimension, vector
13365
13178
  * index, token window, search floor) — see `clip-model.ts`. Present ONLY on a
@@ -20855,6 +20668,373 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
20855
20668
  kind: "mutation",
20856
20669
  auth: "admin"
20857
20670
  });
20671
+ var COCO_80_LABELS = [
20672
+ {
20673
+ id: "person",
20674
+ name: "Person"
20675
+ },
20676
+ {
20677
+ id: "bicycle",
20678
+ name: "Bicycle"
20679
+ },
20680
+ {
20681
+ id: "car",
20682
+ name: "Car"
20683
+ },
20684
+ {
20685
+ id: "motorcycle",
20686
+ name: "Motorcycle"
20687
+ },
20688
+ {
20689
+ id: "airplane",
20690
+ name: "Airplane"
20691
+ },
20692
+ {
20693
+ id: "bus",
20694
+ name: "Bus"
20695
+ },
20696
+ {
20697
+ id: "train",
20698
+ name: "Train"
20699
+ },
20700
+ {
20701
+ id: "truck",
20702
+ name: "Truck"
20703
+ },
20704
+ {
20705
+ id: "boat",
20706
+ name: "Boat"
20707
+ },
20708
+ {
20709
+ id: "traffic light",
20710
+ name: "Traffic Light"
20711
+ },
20712
+ {
20713
+ id: "fire hydrant",
20714
+ name: "Fire Hydrant"
20715
+ },
20716
+ {
20717
+ id: "stop sign",
20718
+ name: "Stop Sign"
20719
+ },
20720
+ {
20721
+ id: "parking meter",
20722
+ name: "Parking Meter"
20723
+ },
20724
+ {
20725
+ id: "bench",
20726
+ name: "Bench"
20727
+ },
20728
+ {
20729
+ id: "bird",
20730
+ name: "Bird"
20731
+ },
20732
+ {
20733
+ id: "cat",
20734
+ name: "Cat"
20735
+ },
20736
+ {
20737
+ id: "dog",
20738
+ name: "Dog"
20739
+ },
20740
+ {
20741
+ id: "horse",
20742
+ name: "Horse"
20743
+ },
20744
+ {
20745
+ id: "sheep",
20746
+ name: "Sheep"
20747
+ },
20748
+ {
20749
+ id: "cow",
20750
+ name: "Cow"
20751
+ },
20752
+ {
20753
+ id: "elephant",
20754
+ name: "Elephant"
20755
+ },
20756
+ {
20757
+ id: "bear",
20758
+ name: "Bear"
20759
+ },
20760
+ {
20761
+ id: "zebra",
20762
+ name: "Zebra"
20763
+ },
20764
+ {
20765
+ id: "giraffe",
20766
+ name: "Giraffe"
20767
+ },
20768
+ {
20769
+ id: "backpack",
20770
+ name: "Backpack"
20771
+ },
20772
+ {
20773
+ id: "umbrella",
20774
+ name: "Umbrella"
20775
+ },
20776
+ {
20777
+ id: "handbag",
20778
+ name: "Handbag"
20779
+ },
20780
+ {
20781
+ id: "tie",
20782
+ name: "Tie"
20783
+ },
20784
+ {
20785
+ id: "suitcase",
20786
+ name: "Suitcase"
20787
+ },
20788
+ {
20789
+ id: "frisbee",
20790
+ name: "Frisbee"
20791
+ },
20792
+ {
20793
+ id: "skis",
20794
+ name: "Skis"
20795
+ },
20796
+ {
20797
+ id: "snowboard",
20798
+ name: "Snowboard"
20799
+ },
20800
+ {
20801
+ id: "sports ball",
20802
+ name: "Sports Ball"
20803
+ },
20804
+ {
20805
+ id: "kite",
20806
+ name: "Kite"
20807
+ },
20808
+ {
20809
+ id: "baseball bat",
20810
+ name: "Baseball Bat"
20811
+ },
20812
+ {
20813
+ id: "baseball glove",
20814
+ name: "Baseball Glove"
20815
+ },
20816
+ {
20817
+ id: "skateboard",
20818
+ name: "Skateboard"
20819
+ },
20820
+ {
20821
+ id: "surfboard",
20822
+ name: "Surfboard"
20823
+ },
20824
+ {
20825
+ id: "tennis racket",
20826
+ name: "Tennis Racket"
20827
+ },
20828
+ {
20829
+ id: "bottle",
20830
+ name: "Bottle"
20831
+ },
20832
+ {
20833
+ id: "wine glass",
20834
+ name: "Wine Glass"
20835
+ },
20836
+ {
20837
+ id: "cup",
20838
+ name: "Cup"
20839
+ },
20840
+ {
20841
+ id: "fork",
20842
+ name: "Fork"
20843
+ },
20844
+ {
20845
+ id: "knife",
20846
+ name: "Knife"
20847
+ },
20848
+ {
20849
+ id: "spoon",
20850
+ name: "Spoon"
20851
+ },
20852
+ {
20853
+ id: "bowl",
20854
+ name: "Bowl"
20855
+ },
20856
+ {
20857
+ id: "banana",
20858
+ name: "Banana"
20859
+ },
20860
+ {
20861
+ id: "apple",
20862
+ name: "Apple"
20863
+ },
20864
+ {
20865
+ id: "sandwich",
20866
+ name: "Sandwich"
20867
+ },
20868
+ {
20869
+ id: "orange",
20870
+ name: "Orange"
20871
+ },
20872
+ {
20873
+ id: "broccoli",
20874
+ name: "Broccoli"
20875
+ },
20876
+ {
20877
+ id: "carrot",
20878
+ name: "Carrot"
20879
+ },
20880
+ {
20881
+ id: "hot dog",
20882
+ name: "Hot Dog"
20883
+ },
20884
+ {
20885
+ id: "pizza",
20886
+ name: "Pizza"
20887
+ },
20888
+ {
20889
+ id: "donut",
20890
+ name: "Donut"
20891
+ },
20892
+ {
20893
+ id: "cake",
20894
+ name: "Cake"
20895
+ },
20896
+ {
20897
+ id: "chair",
20898
+ name: "Chair"
20899
+ },
20900
+ {
20901
+ id: "couch",
20902
+ name: "Couch"
20903
+ },
20904
+ {
20905
+ id: "potted plant",
20906
+ name: "Potted Plant"
20907
+ },
20908
+ {
20909
+ id: "bed",
20910
+ name: "Bed"
20911
+ },
20912
+ {
20913
+ id: "dining table",
20914
+ name: "Dining Table"
20915
+ },
20916
+ {
20917
+ id: "toilet",
20918
+ name: "Toilet"
20919
+ },
20920
+ {
20921
+ id: "tv",
20922
+ name: "TV"
20923
+ },
20924
+ {
20925
+ id: "laptop",
20926
+ name: "Laptop"
20927
+ },
20928
+ {
20929
+ id: "mouse",
20930
+ name: "Mouse"
20931
+ },
20932
+ {
20933
+ id: "remote",
20934
+ name: "Remote"
20935
+ },
20936
+ {
20937
+ id: "keyboard",
20938
+ name: "Keyboard"
20939
+ },
20940
+ {
20941
+ id: "cell phone",
20942
+ name: "Cell Phone"
20943
+ },
20944
+ {
20945
+ id: "microwave",
20946
+ name: "Microwave"
20947
+ },
20948
+ {
20949
+ id: "oven",
20950
+ name: "Oven"
20951
+ },
20952
+ {
20953
+ id: "toaster",
20954
+ name: "Toaster"
20955
+ },
20956
+ {
20957
+ id: "sink",
20958
+ name: "Sink"
20959
+ },
20960
+ {
20961
+ id: "refrigerator",
20962
+ name: "Refrigerator"
20963
+ },
20964
+ {
20965
+ id: "book",
20966
+ name: "Book"
20967
+ },
20968
+ {
20969
+ id: "clock",
20970
+ name: "Clock"
20971
+ },
20972
+ {
20973
+ id: "vase",
20974
+ name: "Vase"
20975
+ },
20976
+ {
20977
+ id: "scissors",
20978
+ name: "Scissors"
20979
+ },
20980
+ {
20981
+ id: "teddy bear",
20982
+ name: "Teddy Bear"
20983
+ },
20984
+ {
20985
+ id: "hair drier",
20986
+ name: "Hair Drier"
20987
+ },
20988
+ {
20989
+ id: "toothbrush",
20990
+ name: "Toothbrush"
20991
+ }
20992
+ ];
20993
+ new Set([
20994
+ {
20995
+ id: "person",
20996
+ name: "Person"
20997
+ },
20998
+ {
20999
+ id: "vehicle",
21000
+ name: "Vehicle"
21001
+ },
21002
+ {
21003
+ id: "animal",
21004
+ name: "Animal"
21005
+ },
21006
+ {
21007
+ id: "package",
21008
+ name: "Package"
21009
+ }
21010
+ ].map((l) => l.id));
21011
+ var COCO_TO_MACRO = {
21012
+ mapping: {
21013
+ person: "person",
21014
+ bicycle: "vehicle",
21015
+ car: "vehicle",
21016
+ motorcycle: "vehicle",
21017
+ airplane: "vehicle",
21018
+ bus: "vehicle",
21019
+ train: "vehicle",
21020
+ truck: "vehicle",
21021
+ boat: "vehicle",
21022
+ bird: "animal",
21023
+ cat: "animal",
21024
+ dog: "animal",
21025
+ horse: "animal",
21026
+ sheep: "animal",
21027
+ cow: "animal",
21028
+ elephant: "animal",
21029
+ bear: "animal",
21030
+ zebra: "animal",
21031
+ giraffe: "animal",
21032
+ suitcase: "package",
21033
+ backpack: "package",
21034
+ handbag: "package"
21035
+ },
21036
+ preserveOriginal: false
21037
+ };
20858
21038
  var AUDIO_MACRO_LABELS = [
20859
21039
  {
20860
21040
  id: "speech",
@@ -21616,6 +21796,8 @@ var NcSystemEventKindSchema = _enum([
21616
21796
  "stream-offline",
21617
21797
  "node-online",
21618
21798
  "node-offline",
21799
+ "node-restarting",
21800
+ "node-updating",
21619
21801
  "node-inference-unavailable",
21620
21802
  "detection-blind",
21621
21803
  "addon-crash-loop",
@@ -26180,6 +26362,34 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
26180
26362
  timestamp: number()
26181
26363
  });
26182
26364
  /**
26365
+ * A root model's boxes standing in for one crop-kind step's own inference
26366
+ * (D730) — see `runPipeline.suppliedRoot`.
26367
+ */
26368
+ var SuppliedRootOutputSchema = object({
26369
+ stepId: string(),
26370
+ /** The root model that drew the boxes — stamped on the result. */
26371
+ modelId: string(),
26372
+ detections: array(object({
26373
+ /** `[x1, y1, x2, y2]` in the pixels of the call's image. */
26374
+ bbox: tuple([
26375
+ number(),
26376
+ number(),
26377
+ number(),
26378
+ number()
26379
+ ]),
26380
+ score: number(),
26381
+ /**
26382
+ * Five facial landmarks in the same pixels — a face the step's own
26383
+ * detector already re-found inside a root face box (D730), so its
26384
+ * embedder child aligns it exactly as it aligns any detected face.
26385
+ */
26386
+ landmarks: array(object({
26387
+ x: number(),
26388
+ y: number()
26389
+ })).optional()
26390
+ })).min(1)
26391
+ });
26392
+ /**
26183
26393
  * Reference to the frame's retained NATIVE surface + the parent crop's placement
26184
26394
  * within the frame, so the executor can re-cut a leaf child ROI at native
26185
26395
  * resolution on the detail plane. See the `runPipeline` `nativeCropRef` field.
@@ -26310,7 +26520,7 @@ var PipelineModelOptionSchema = object({
26310
26520
  legacy: boolean().optional(),
26311
26521
  provider: ModelProviderIdSchema.optional(),
26312
26522
  defaultConfidence: number().optional(),
26313
- fillsClassifierEffects: array(FillsClassifierEffectSchema).readonly().optional()
26523
+ suppliesSteps: array(RootStepSupplySchema).readonly().optional()
26314
26524
  });
26315
26525
  var ConfigFieldBridge = custom();
26316
26526
  var PipelineAddonSchemaSchema = object({
@@ -26714,7 +26924,16 @@ var pipelineExecutorCapability = {
26714
26924
  * `device-not-servable`), and nothing reaches the camera's live
26715
26925
  * trace stream. Absent ⇒ unchanged behaviour.
26716
26926
  */
26717
- replay: literal(true).optional()
26927
+ replay: literal(true).optional(),
26928
+ /**
26929
+ * Root-supplied detections for the tree's ROOT step (D730). Set by
26930
+ * `runDetailSubtree` when the camera's root model supplies a crop-kind
26931
+ * step (a Frigate+ `license_plate` for `plate-detection`): the step is
26932
+ * NOT inferred, these boxes are its output, and its children (the plate
26933
+ * reader) run on them through their own crop policy. Boxes are in the
26934
+ * PIXELS of the image this call carries. Absent ⇒ the root step runs.
26935
+ */
26936
+ suppliedRoot: SuppliedRootOutputSchema.optional()
26718
26937
  }), PipelineRunResultBridge, { kind: "mutation" }),
26719
26938
  /**
26720
26939
  * Batched run — N raw frames packed into one cap call. The provider
@@ -27987,7 +28206,22 @@ var pipelineRunnerCapability = {
27987
28206
  */
27988
28207
  cropJpeg: string().optional(),
27989
28208
  parent: DetailParentSchema,
27990
- steps: array(string()).optional()
28209
+ steps: array(string()).optional(),
28210
+ /**
28211
+ * The camera's root model already drew this step's boxes (D730): a
28212
+ * `license_plate` inside the parent vehicle. The named step is NOT
28213
+ * inferred — these FRAME-space boxes are its output — and its
28214
+ * requested children (the plate reader) run on them. Absent ⇒ every
28215
+ * requested step infers as before.
28216
+ */
28217
+ supplied: object({
28218
+ stepId: string(),
28219
+ modelId: string(),
28220
+ boxes: array(object({
28221
+ bbox: NativeCropBboxSchema,
28222
+ score: number()
28223
+ })).min(1)
28224
+ }).optional()
27991
28225
  }), object({ details: array(DetailResultSchema) }).nullable(), { kind: "mutation" }),
27992
28226
  /**
27993
28227
  * Run ONE enrichment step against caller-supplied pixels, with NO camera
@@ -34621,6 +34855,27 @@ var ViewerEndpointsSchema = object({
34621
34855
  /** What the ranking currently resolves to (may be empty if nothing is up). */
34622
34856
  resolved: array(string()).readonly()
34623
34857
  });
34858
+ /**
34859
+ * One audience's hub address (see `hub-address.ts`): the operator's stored
34860
+ * override, the address in use, and where it came from.
34861
+ */
34862
+ var HubAddressSnapshotSchema = object({
34863
+ /** The operator's override, or null for automatic. */
34864
+ override: string().nullable(),
34865
+ /** The address in use, or null when nothing qualifies (never loopback). */
34866
+ resolved: string().nullable(),
34867
+ source: _enum([
34868
+ "override",
34869
+ "auto",
34870
+ "none"
34871
+ ])
34872
+ });
34873
+ var HubAddressesSchema = object({
34874
+ /** "Hub address for agents" — agents' bundle/model pulls, LAN devices. */
34875
+ cluster: HubAddressSnapshotSchema,
34876
+ /** "Public address for sign-in links" — e-mail links, OIDC, WebAuthn, OAuth2. */
34877
+ browser: HubAddressSnapshotSchema
34878
+ });
34624
34879
  var AllowedAddressesSchema = object({
34625
34880
  /**
34626
34881
  * Allowlist of interface addresses operators have explicitly opted
@@ -34667,7 +34922,13 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
34667
34922
  * an address notification links can be flagged with, not a hub
34668
34923
  * route. Default `false`: racers and rankers never see it. */
34669
34924
  includeAppLink: boolean().optional()
34670
- }), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), ViewerEndpointsSchema), method(object({ baseUrls: array(string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" }), method(_void(), TlsStatusSchema), method(object({ reason: string().optional() }), TlsStatusSchema, {
34925
+ }), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), ViewerEndpointsSchema), method(object({ baseUrls: array(string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }), method(_void(), HubAddressesSchema), method(object({
34926
+ audience: _enum(["cluster", "browser"]),
34927
+ baseUrl: string().nullable()
34928
+ }), HubAddressesSchema, {
34929
+ kind: "mutation",
34930
+ auth: "admin"
34931
+ }), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" }), method(_void(), TlsStatusSchema), method(object({ reason: string().optional() }), TlsStatusSchema, {
34671
34932
  kind: "mutation",
34672
34933
  auth: "admin"
34673
34934
  }), method(object({
@@ -35057,7 +35318,8 @@ object({
35057
35318
  * writes this slice (not even a boot seed), and neither does the runner's
35058
35319
  * phase machine: its phase is "a session is attached" for every on-motion
35059
35320
  * session, not motion, and it now has its own `DetectionPhaseTransition`.
35060
- * A provider's `isDetected` answers from the hub's slice.
35321
+ * A provider's `isDetected` and `getStatus` answer from the hub's slice
35322
+ * (`hubMotionNativeProvider`).
35061
35323
  * - **Sensors** (Home Assistant binary sensors, Homematic, Matter, Alexa
35062
35324
  * imports) — the provider pushes both edges itself, from the upstream
35063
35325
  * system's own state change. That is the sensor's own fact.
@@ -43673,6 +43935,12 @@ Object.freeze({
43673
43935
  addonId: null,
43674
43936
  access: "view"
43675
43937
  },
43938
+ "localNetwork.getHubAddresses": {
43939
+ capName: "local-network",
43940
+ capScope: "system",
43941
+ addonId: null,
43942
+ access: "view"
43943
+ },
43676
43944
  "localNetwork.getNotificationEndpoint": {
43677
43945
  capName: "local-network",
43678
43946
  capScope: "system",
@@ -43727,6 +43995,12 @@ Object.freeze({
43727
43995
  addonId: null,
43728
43996
  access: "create"
43729
43997
  },
43998
+ "localNetwork.setHubAddress": {
43999
+ capName: "local-network",
44000
+ capScope: "system",
44001
+ addonId: null,
44002
+ access: "create"
44003
+ },
43730
44004
  "localNetwork.setNotificationEndpoint": {
43731
44005
  capName: "local-network",
43732
44006
  capScope: "system",
@@ -52176,6 +52450,8 @@ new Map(Object.entries({
52176
52450
  "detection-blind": "device-events",
52177
52451
  "node-online": "system",
52178
52452
  "node-offline": "system",
52453
+ "node-restarting": "system",
52454
+ "node-updating": "system",
52179
52455
  "node-inference-unavailable": "system",
52180
52456
  "addon-crash-loop": "system",
52181
52457
  "addon-update-available": "system",
@@ -52253,6 +52529,7 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
52253
52529
  kinds: [
52254
52530
  "node-offline",
52255
52531
  "node-online",
52532
+ "node-restarting",
52256
52533
  "node-inference-unavailable"
52257
52534
  ]
52258
52535
  },
@@ -52274,6 +52551,7 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
52274
52551
  label: "Server & container updates",
52275
52552
  kinds: [
52276
52553
  "server-update-available",
52554
+ "node-updating",
52277
52555
  "server-updated",
52278
52556
  "wrapper-update-available"
52279
52557
  ]
@@ -52421,6 +52699,7 @@ var STATE_SUMMARY_SECTION_VARS = [
52421
52699
  kinds: [
52422
52700
  "node-offline",
52423
52701
  "node-online",
52702
+ "node-restarting",
52424
52703
  "node-inference-unavailable"
52425
52704
  ]
52426
52705
  },
@@ -52442,6 +52721,7 @@ var STATE_SUMMARY_SECTION_VARS = [
52442
52721
  example: "server 1.2.377 → 1.2.378",
52443
52722
  kinds: [
52444
52723
  "server-update-available",
52724
+ "node-updating",
52445
52725
  "server-updated",
52446
52726
  "wrapper-update-available"
52447
52727
  ]
@@ -52474,7 +52754,7 @@ var STATE_SUMMARY_VARS = [
52474
52754
  {
52475
52755
  name: "summarySection",
52476
52756
  label: "Summary: this section",
52477
- description: "The section a per-section summary row is about (D698); on a summary sent as one message, every section it reports, comma-separated.",
52757
+ description: "The section a per-section summary row is about; on a summary sent as one message, every section it reports, comma-separated.",
52478
52758
  example: "Batterie scariche",
52479
52759
  group: "system",
52480
52760
  families: ["rule"],
@@ -52916,6 +53196,24 @@ function stepModelRunsOnFormat(models, modelId, format) {
52916
53196
  }
52917
53197
  return models.some((m) => m.legacy !== true && hasBuild(m, format));
52918
53198
  }
53199
+ /** Side of the square, as a multiple of the face box's longer side. */
53200
+ var ROOT_FACE_REFINE_SCALE = 1.6;
53201
+ /**
53202
+ * The square (frame-space pixels) a root face box is refined in: centred on
53203
+ * the box, side `ROOT_FACE_REFINE_SCALE ×` its longer side, slid inside the
53204
+ * frame, and shrunk only when the frame's shorter side is smaller. Pure.
53205
+ */
53206
+ function deriveRootFaceRefineRect(face, frameWidth, frameHeight) {
53207
+ const side = Math.min(Math.max(face.w, face.h) * ROOT_FACE_REFINE_SCALE, Math.min(frameWidth, frameHeight));
53208
+ const cx = face.x + face.w / 2;
53209
+ const cy = face.y + face.h / 2;
53210
+ return {
53211
+ x: Math.min(Math.max(0, cx - side / 2), frameWidth - side),
53212
+ y: Math.min(Math.max(0, cy - side / 2), frameHeight - side),
53213
+ w: side,
53214
+ h: side
53215
+ };
53216
+ }
52919
53217
  var DETAIL_CROP_PADDING_KEY = "detailCropPaddingRatio";
52920
53218
  var DETAIL_CROP_SQUARE_KEY = "detailCropSquare";
52921
53219
  /**
@@ -54218,6 +54516,12 @@ Object.defineProperty(exports, "COCO_TO_MACRO", {
54218
54516
  return COCO_TO_MACRO;
54219
54517
  }
54220
54518
  });
54519
+ Object.defineProperty(exports, "CROP_SUPPLY_SOURCES", {
54520
+ enumerable: true,
54521
+ get: function() {
54522
+ return CROP_SUPPLY_SOURCES;
54523
+ }
54524
+ });
54221
54525
  Object.defineProperty(exports, "CamProfileSchema", {
54222
54526
  enumerable: true,
54223
54527
  get: function() {
@@ -54254,12 +54558,6 @@ Object.defineProperty(exports, "DEFAULT_FIRST_SIGHTING_FRESHNESS_MS", {
54254
54558
  return DEFAULT_FIRST_SIGHTING_FRESHNESS_MS;
54255
54559
  }
54256
54560
  });
54257
- Object.defineProperty(exports, "DEFAULT_LABEL_LINK_POLICY", {
54258
- enumerable: true,
54259
- get: function() {
54260
- return DEFAULT_LABEL_LINK_POLICY;
54261
- }
54262
- });
54263
54561
  Object.defineProperty(exports, "DEFAULT_NATIVE_LEASE_SETTINGS", {
54264
54562
  enumerable: true,
54265
54563
  get: function() {
@@ -54314,18 +54612,6 @@ Object.defineProperty(exports, "ExportRecordSchema", {
54314
54612
  return ExportRecordSchema;
54315
54613
  }
54316
54614
  });
54317
- Object.defineProperty(exports, "FILLABLE_STEP_MACRO", {
54318
- enumerable: true,
54319
- get: function() {
54320
- return FILLABLE_STEP_MACRO;
54321
- }
54322
- });
54323
- Object.defineProperty(exports, "FILLABLE_STEP_VOCABULARIES", {
54324
- enumerable: true,
54325
- get: function() {
54326
- return FILLABLE_STEP_VOCABULARIES;
54327
- }
54328
- });
54329
54615
  Object.defineProperty(exports, "FailureCounters", {
54330
54616
  enumerable: true,
54331
54617
  get: function() {
@@ -54350,16 +54636,16 @@ Object.defineProperty(exports, "HF_BASE_URL", {
54350
54636
  return HF_BASE_URL;
54351
54637
  }
54352
54638
  });
54353
- Object.defineProperty(exports, "LABEL_LINK_POLICIES", {
54639
+ Object.defineProperty(exports, "LABEL_SUPPLY_MACRO", {
54354
54640
  enumerable: true,
54355
54641
  get: function() {
54356
- return LABEL_LINK_POLICIES;
54642
+ return LABEL_SUPPLY_MACRO;
54357
54643
  }
54358
54644
  });
54359
- Object.defineProperty(exports, "LABEL_LINK_SETTING_KEY", {
54645
+ Object.defineProperty(exports, "LABEL_SUPPLY_VOCABULARIES", {
54360
54646
  enumerable: true,
54361
54647
  get: function() {
54362
- return LABEL_LINK_SETTING_KEY;
54648
+ return LABEL_SUPPLY_VOCABULARIES;
54363
54649
  }
54364
54650
  });
54365
54651
  Object.defineProperty(exports, "NativeLeaseAdmissionSchema", {
@@ -54416,6 +54702,12 @@ Object.defineProperty(exports, "RECORDING_SOURCE_CAMSTACK_ADDON", {
54416
54702
  return RECORDING_SOURCE_CAMSTACK_ADDON;
54417
54703
  }
54418
54704
  });
54705
+ Object.defineProperty(exports, "ROOT_SUPPLIABLE_STEP_IDS", {
54706
+ enumerable: true,
54707
+ get: function() {
54708
+ return ROOT_SUPPLIABLE_STEP_IDS;
54709
+ }
54710
+ });
54419
54711
  Object.defineProperty(exports, "RecordingConfigSchema", {
54420
54712
  enumerable: true,
54421
54713
  get: function() {
@@ -54464,6 +54756,12 @@ Object.defineProperty(exports, "addonWidgetsSourceCapability", {
54464
54756
  return addonWidgetsSourceCapability;
54465
54757
  }
54466
54758
  });
54759
+ Object.defineProperty(exports, "allowedSuppliedEffect", {
54760
+ enumerable: true,
54761
+ get: function() {
54762
+ return allowedSuppliedEffect;
54763
+ }
54764
+ });
54467
54765
  Object.defineProperty(exports, "array", {
54468
54766
  enumerable: true,
54469
54767
  get: function() {
@@ -54536,6 +54834,12 @@ Object.defineProperty(exports, "clipExportFailureOf", {
54536
54834
  return clipExportFailureOf;
54537
54835
  }
54538
54836
  });
54837
+ Object.defineProperty(exports, "containingParentIndex", {
54838
+ enumerable: true,
54839
+ get: function() {
54840
+ return containingParentIndex;
54841
+ }
54842
+ });
54539
54843
  Object.defineProperty(exports, "createEvent", {
54540
54844
  enumerable: true,
54541
54845
  get: function() {
@@ -54596,6 +54900,12 @@ Object.defineProperty(exports, "deriveRecordingMode", {
54596
54900
  return deriveRecordingMode;
54597
54901
  }
54598
54902
  });
54903
+ Object.defineProperty(exports, "deriveRootFaceRefineRect", {
54904
+ enumerable: true,
54905
+ get: function() {
54906
+ return deriveRootFaceRefineRect;
54907
+ }
54908
+ });
54599
54909
  Object.defineProperty(exports, "detectionPipelineCapability", {
54600
54910
  enumerable: true,
54601
54911
  get: function() {
@@ -54968,12 +55278,6 @@ Object.defineProperty(exports, "resolveEgressDecodeHwAccel", {
54968
55278
  return resolveEgressDecodeHwAccel;
54969
55279
  }
54970
55280
  });
54971
- Object.defineProperty(exports, "resolveLabelLink", {
54972
- enumerable: true,
54973
- get: function() {
54974
- return resolveLabelLink;
54975
- }
54976
- });
54977
55281
  Object.defineProperty(exports, "resolveLocationMode", {
54978
55282
  enumerable: true,
54979
55283
  get: function() {
@@ -54992,6 +55296,18 @@ Object.defineProperty(exports, "resolveRecordingProfiles", {
54992
55296
  return resolveRecordingProfiles;
54993
55297
  }
54994
55298
  });
55299
+ Object.defineProperty(exports, "resolveRootSupply", {
55300
+ enumerable: true,
55301
+ get: function() {
55302
+ return resolveRootSupply;
55303
+ }
55304
+ });
55305
+ Object.defineProperty(exports, "rootSuppliesOf", {
55306
+ enumerable: true,
55307
+ get: function() {
55308
+ return rootSuppliesOf;
55309
+ }
55310
+ });
54995
55311
  Object.defineProperty(exports, "runtimeDevices", {
54996
55312
  enumerable: true,
54997
55313
  get: function() {