@camstack/addon-model-studio 1.1.202 → 1.1.204

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 (19) hide show
  1. package/THIRD_PARTY_MODELS.md +2 -2
  2. package/dist/{MotionZonesSettings-qabihnVu.mjs → MotionZonesSettings-f-Rb4FPx.mjs} +2 -2
  3. package/dist/{PrivacyMaskSettings-CGVI9EVl.mjs → PrivacyMaskSettings-DzrwiikK.mjs} +4 -4
  4. package/dist/{SceneMonitorEditor-BcAVb1c7.mjs → SceneMonitorEditor-pr_u7JDi.mjs} +3 -3
  5. package/dist/_stub.js +3565 -3453
  6. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-CZVL55Bi.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-DD6MdVfP.mjs} +4 -4
  7. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-Cjm3a0Rl.mjs +26 -0
  8. package/dist/{hostInit-D_0AEBSS.mjs → hostInit-dZ-iNlYE.mjs} +3 -3
  9. package/dist/model-studio.addon.js +256 -425
  10. package/dist/model-studio.addon.mjs +256 -425
  11. package/dist/{player-overlays-CgZQeBdy.mjs → player-overlays-DyoPwbMr.mjs} +1 -1
  12. package/dist/remoteEntry.js +1 -1
  13. package/dist/{responsive-dgrtmGP7.mjs → responsive-_Hjo-SPS.mjs} +1 -1
  14. package/dist/{scene-monitor-copy-CWuj3twx.mjs → scene-monitor-copy-DxG4-n1Z.mjs} +1 -1
  15. package/dist/{square-U1jjwP1Q.mjs → square-BIirO7Z1.mjs} +1 -1
  16. package/dist/{trash-2-B3hyZ06m.mjs → trash-2-B9qboTSI.mjs} +1 -1
  17. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-Rw5qHN1M.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-DExLMP5B.mjs} +1 -1
  18. package/package.json +1 -1
  19. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DMrwYkbN.mjs +0 -26
@@ -10926,394 +10926,30 @@ var ClipSearchStrictnessSchema = _enum([
10926
10926
  "balanced",
10927
10927
  "strict"
10928
10928
  ]);
10929
- var COCO_80_LABELS = [
10930
- {
10931
- id: "person",
10932
- name: "Person"
10933
- },
10934
- {
10935
- id: "bicycle",
10936
- name: "Bicycle"
10937
- },
10938
- {
10939
- id: "car",
10940
- name: "Car"
10941
- },
10942
- {
10943
- id: "motorcycle",
10944
- name: "Motorcycle"
10945
- },
10946
- {
10947
- id: "airplane",
10948
- name: "Airplane"
10949
- },
10950
- {
10951
- id: "bus",
10952
- name: "Bus"
10953
- },
10954
- {
10955
- id: "train",
10956
- name: "Train"
10957
- },
10958
- {
10959
- id: "truck",
10960
- name: "Truck"
10961
- },
10962
- {
10963
- id: "boat",
10964
- name: "Boat"
10965
- },
10966
- {
10967
- id: "traffic light",
10968
- name: "Traffic Light"
10969
- },
10970
- {
10971
- id: "fire hydrant",
10972
- name: "Fire Hydrant"
10973
- },
10974
- {
10975
- id: "stop sign",
10976
- name: "Stop Sign"
10977
- },
10978
- {
10979
- id: "parking meter",
10980
- name: "Parking Meter"
10981
- },
10982
- {
10983
- id: "bench",
10984
- name: "Bench"
10985
- },
10986
- {
10987
- id: "bird",
10988
- name: "Bird"
10989
- },
10990
- {
10991
- id: "cat",
10992
- name: "Cat"
10993
- },
10994
- {
10995
- id: "dog",
10996
- name: "Dog"
10997
- },
10998
- {
10999
- id: "horse",
11000
- name: "Horse"
11001
- },
11002
- {
11003
- id: "sheep",
11004
- name: "Sheep"
11005
- },
11006
- {
11007
- id: "cow",
11008
- name: "Cow"
11009
- },
11010
- {
11011
- id: "elephant",
11012
- name: "Elephant"
11013
- },
11014
- {
11015
- id: "bear",
11016
- name: "Bear"
11017
- },
11018
- {
11019
- id: "zebra",
11020
- name: "Zebra"
11021
- },
11022
- {
11023
- id: "giraffe",
11024
- name: "Giraffe"
11025
- },
11026
- {
11027
- id: "backpack",
11028
- name: "Backpack"
11029
- },
11030
- {
11031
- id: "umbrella",
11032
- name: "Umbrella"
11033
- },
11034
- {
11035
- id: "handbag",
11036
- name: "Handbag"
11037
- },
11038
- {
11039
- id: "tie",
11040
- name: "Tie"
11041
- },
11042
- {
11043
- id: "suitcase",
11044
- name: "Suitcase"
11045
- },
11046
- {
11047
- id: "frisbee",
11048
- name: "Frisbee"
11049
- },
11050
- {
11051
- id: "skis",
11052
- name: "Skis"
11053
- },
11054
- {
11055
- id: "snowboard",
11056
- name: "Snowboard"
11057
- },
11058
- {
11059
- id: "sports ball",
11060
- name: "Sports Ball"
11061
- },
11062
- {
11063
- id: "kite",
11064
- name: "Kite"
11065
- },
11066
- {
11067
- id: "baseball bat",
11068
- name: "Baseball Bat"
11069
- },
11070
- {
11071
- id: "baseball glove",
11072
- name: "Baseball Glove"
11073
- },
11074
- {
11075
- id: "skateboard",
11076
- name: "Skateboard"
11077
- },
11078
- {
11079
- id: "surfboard",
11080
- name: "Surfboard"
11081
- },
11082
- {
11083
- id: "tennis racket",
11084
- name: "Tennis Racket"
11085
- },
11086
- {
11087
- id: "bottle",
11088
- name: "Bottle"
11089
- },
11090
- {
11091
- id: "wine glass",
11092
- name: "Wine Glass"
11093
- },
11094
- {
11095
- id: "cup",
11096
- name: "Cup"
11097
- },
11098
- {
11099
- id: "fork",
11100
- name: "Fork"
11101
- },
11102
- {
11103
- id: "knife",
11104
- name: "Knife"
11105
- },
11106
- {
11107
- id: "spoon",
11108
- name: "Spoon"
11109
- },
11110
- {
11111
- id: "bowl",
11112
- name: "Bowl"
11113
- },
11114
- {
11115
- id: "banana",
11116
- name: "Banana"
11117
- },
11118
- {
11119
- id: "apple",
11120
- name: "Apple"
11121
- },
11122
- {
11123
- id: "sandwich",
11124
- name: "Sandwich"
11125
- },
11126
- {
11127
- id: "orange",
11128
- name: "Orange"
11129
- },
11130
- {
11131
- id: "broccoli",
11132
- name: "Broccoli"
11133
- },
11134
- {
11135
- id: "carrot",
11136
- name: "Carrot"
11137
- },
11138
- {
11139
- id: "hot dog",
11140
- name: "Hot Dog"
11141
- },
11142
- {
11143
- id: "pizza",
11144
- name: "Pizza"
11145
- },
11146
- {
11147
- id: "donut",
11148
- name: "Donut"
11149
- },
11150
- {
11151
- id: "cake",
11152
- name: "Cake"
11153
- },
11154
- {
11155
- id: "chair",
11156
- name: "Chair"
11157
- },
11158
- {
11159
- id: "couch",
11160
- name: "Couch"
11161
- },
11162
- {
11163
- id: "potted plant",
11164
- name: "Potted Plant"
11165
- },
11166
- {
11167
- id: "bed",
11168
- name: "Bed"
11169
- },
11170
- {
11171
- id: "dining table",
11172
- name: "Dining Table"
11173
- },
11174
- {
11175
- id: "toilet",
11176
- name: "Toilet"
11177
- },
11178
- {
11179
- id: "tv",
11180
- name: "TV"
11181
- },
11182
- {
11183
- id: "laptop",
11184
- name: "Laptop"
11185
- },
11186
- {
11187
- id: "mouse",
11188
- name: "Mouse"
11189
- },
11190
- {
11191
- id: "remote",
11192
- name: "Remote"
11193
- },
11194
- {
11195
- id: "keyboard",
11196
- name: "Keyboard"
11197
- },
11198
- {
11199
- id: "cell phone",
11200
- name: "Cell Phone"
11201
- },
11202
- {
11203
- id: "microwave",
11204
- name: "Microwave"
11205
- },
11206
- {
11207
- id: "oven",
11208
- name: "Oven"
11209
- },
11210
- {
11211
- id: "toaster",
11212
- name: "Toaster"
11213
- },
11214
- {
11215
- id: "sink",
11216
- name: "Sink"
11217
- },
11218
- {
11219
- id: "refrigerator",
11220
- name: "Refrigerator"
11221
- },
11222
- {
11223
- id: "book",
11224
- name: "Book"
11225
- },
11226
- {
11227
- id: "clock",
11228
- name: "Clock"
11229
- },
11230
- {
11231
- id: "vase",
11232
- name: "Vase"
11233
- },
11234
- {
11235
- id: "scissors",
11236
- name: "Scissors"
11237
- },
11238
- {
11239
- id: "teddy bear",
11240
- name: "Teddy Bear"
11241
- },
11242
- {
11243
- id: "hair drier",
11244
- name: "Hair Drier"
11245
- },
11246
- {
11247
- id: "toothbrush",
11248
- name: "Toothbrush"
11249
- }
11250
- ];
11251
- new Set([
11252
- {
11253
- id: "person",
11254
- name: "Person"
11255
- },
11256
- {
11257
- id: "vehicle",
11258
- name: "Vehicle"
11259
- },
11260
- {
11261
- id: "animal",
11262
- name: "Animal"
11263
- },
11264
- {
11265
- id: "package",
11266
- name: "Package"
11267
- }
11268
- ].map((l) => l.id));
11269
- var COCO_TO_MACRO = {
11270
- mapping: {
11271
- person: "person",
11272
- bicycle: "vehicle",
11273
- car: "vehicle",
11274
- motorcycle: "vehicle",
11275
- airplane: "vehicle",
11276
- bus: "vehicle",
11277
- train: "vehicle",
11278
- truck: "vehicle",
11279
- boat: "vehicle",
11280
- bird: "animal",
11281
- cat: "animal",
11282
- dog: "animal",
11283
- horse: "animal",
11284
- sheep: "animal",
11285
- cow: "animal",
11286
- elephant: "animal",
11287
- bear: "animal",
11288
- zebra: "animal",
11289
- giraffe: "animal",
11290
- suitcase: "package",
11291
- backpack: "package",
11292
- handbag: "package"
11293
- },
11294
- preserveOriginal: false
11295
- };
11296
- /** Steps a root detector may declare it fills. */
11297
- var FILLABLE_STEP_IDS = [
10929
+ /** Steps whose effect a root label can BE. */
10930
+ var LABEL_SUPPLY_STEP_IDS = [
11298
10931
  "animal-classifier",
11299
10932
  "vehicle-classifier",
11300
10933
  "package-detection"
11301
10934
  ];
10935
+ /** Steps whose box a root detection can BE. */
10936
+ var CROP_SUPPLY_STEP_IDS = ["plate-detection", "face-detection"];
10937
+ [...LABEL_SUPPLY_STEP_IDS, ...CROP_SUPPLY_STEP_IDS];
11302
10938
  /**
11303
- * The EFFECT vocabulary of each fillable step: exactly the strings the step
10939
+ * The EFFECT vocabulary of each label-kind step: exactly the strings the step
11304
10940
  * itself emits, in its own spelling. A linked label is one of these and nothing
11305
10941
  * else, so a tier-1 value means the same thing whichever writer produced it.
11306
10942
  *
11307
10943
  * - `animal-classifier`: the PRIMARY model's `-labels.json` (Open Images V7,
11308
10944
  * 8 classes) — also the species allow-list the step offers.
11309
- * - `vehicle-classifier`: `vehicle-type-v1-labels.json`, capitalised as the
11310
- * model emits them (the classifier writes `winner.class` verbatim).
10945
+ * - `vehicle-classifier`: the classifier's labels, capitalised as it emits them
10946
+ * (it writes `winner.class` verbatim).
11311
10947
  * - `package-detection`: its one output class.
11312
10948
  *
11313
- * `scripts/check-label-link-vocabulary.ts` fails the build if a model entry's
10949
+ * `scripts/check-label-link-vocabulary.ts` fails the build if a declared
11314
10950
  * `labelToEffect` names anything outside this table.
11315
10951
  */
11316
- var FILLABLE_STEP_VOCABULARIES = {
10952
+ var LABEL_SUPPLY_VOCABULARIES = {
11317
10953
  "animal-classifier": [
11318
10954
  "bird",
11319
10955
  "cat",
@@ -11336,8 +10972,8 @@ var FILLABLE_STEP_VOCABULARIES = {
11336
10972
  ],
11337
10973
  "package-detection": ["package"]
11338
10974
  };
11339
- /** The macro a detection must carry for the step to apply to it. */
11340
- var FILLABLE_STEP_MACRO = {
10975
+ /** The macro a detection must carry for a label-kind step to apply to it. */
10976
+ var LABEL_SUPPLY_MACRO = {
11341
10977
  "animal-classifier": "animal",
11342
10978
  "vehicle-classifier": "vehicle",
11343
10979
  "package-detection": "package"
@@ -11354,49 +10990,75 @@ var EFFECT_ALIASES = {
11354
10990
  },
11355
10991
  "package-detection": {}
11356
10992
  };
11357
- /**
11358
- * A labelmap is COCO when it carries at least half of the COCO-80 classes. A
11359
- * COCO detector NEVER fills a step (operator decision, D715): its `dog` / `car`
11360
- * is the generic class the classifier exists to refine, and its six animal
11361
- * classes would otherwise read as "fills animal-classifier 6/8". Frigate+
11362
- * shares about a dozen COCO names; a COCO-80 or COCO-91 labelmap carries ~80.
11363
- */
11364
- function isCocoLabelmap(labels) {
11365
- const present = new Set(labels);
11366
- return COCO_80_LABELS.filter((l) => present.has(l.id)).length * 2 >= COCO_80_LABELS.length;
11367
- }
10993
+ var CROP_SUPPLY_SOURCES = {
10994
+ "plate-detection": {
10995
+ rootLabels: ["license_plate"],
10996
+ parentMacro: "vehicle",
10997
+ childClass: "plate",
10998
+ servedChildSteps: ["plate-ocr"],
10999
+ use: "as-output"
11000
+ },
11001
+ "face-detection": {
11002
+ rootLabels: ["face"],
11003
+ parentMacro: "person",
11004
+ childClass: "face",
11005
+ servedChildSteps: ["face-embedding"],
11006
+ use: "refine",
11007
+ minRootInputPx: 640
11008
+ }
11009
+ };
11368
11010
  function effectFor(stepId, label) {
11369
11011
  const alias = EFFECT_ALIASES[stepId][label];
11370
11012
  if (alias !== void 0) return alias;
11371
11013
  const folded = label.toLowerCase();
11372
- return FILLABLE_STEP_VOCABULARIES[stepId].find((v) => v.toLowerCase() === folded);
11014
+ return LABEL_SUPPLY_VOCABULARIES[stepId].find((v) => v.toLowerCase() === folded);
11373
11015
  }
11374
11016
  /**
11375
- * Which steps a root detector fills, from its labelmap and classMap. A label
11376
- * counts for a step only when the model's classMap sends it to that step's
11377
- * macro AND it names a vocabulary entry. A step none of the labels reach is
11378
- * not declared; a COCO labelmap declares nothing.
11017
+ * Which steps a root detector can supply, from its labelmap and classMap.
11018
+ *
11019
+ * - label kind: a label counts for a step only when the classMap sends it to
11020
+ * that step's macro AND it names a vocabulary entry. Every root is judged
11021
+ * the same way — a COCO model supplies the animal classifier with the six
11022
+ * species COCO names, exactly as a Frigate+ model supplies seven.
11023
+ * - crop kind: the labelmap carries one of the step's root labels. Those
11024
+ * labels are deliberately left out of the classMap, so they never make a
11025
+ * track of their own.
11026
+ *
11027
+ * No classMap ⇒ no label supply (nothing says which macro a label lives under).
11379
11028
  */
11380
- function deriveClassifierFills(labels, classMap) {
11381
- if (classMap === void 0 || isCocoLabelmap(labels)) return [];
11382
- const fills = [];
11383
- for (const stepId of FILLABLE_STEP_IDS) {
11029
+ function deriveRootSupplies(labels, classMap) {
11030
+ const supplies = [];
11031
+ if (classMap !== void 0) for (const stepId of LABEL_SUPPLY_STEP_IDS) {
11384
11032
  const labelToEffect = {};
11385
11033
  for (const label of labels) {
11386
- if (classMap.mapping[label] !== FILLABLE_STEP_MACRO[stepId]) continue;
11034
+ if (classMap.mapping[label] !== LABEL_SUPPLY_MACRO[stepId]) continue;
11387
11035
  const effect = effectFor(stepId, label);
11388
11036
  if (effect !== void 0) labelToEffect[label] = effect;
11389
11037
  }
11390
11038
  const covered = new Set(Object.values(labelToEffect));
11391
11039
  if (covered.size === 0) continue;
11392
- const uncovered = FILLABLE_STEP_VOCABULARIES[stepId].filter((v) => !covered.has(v));
11393
- fills.push({
11040
+ const uncovered = LABEL_SUPPLY_VOCABULARIES[stepId].filter((v) => !covered.has(v));
11041
+ supplies.push({
11042
+ kind: "label",
11394
11043
  stepId,
11395
11044
  labelToEffect,
11396
11045
  uncovered
11397
11046
  });
11398
11047
  }
11399
- return fills;
11048
+ const present = new Set(labels);
11049
+ for (const stepId of CROP_SUPPLY_STEP_IDS) {
11050
+ const source = CROP_SUPPLY_SOURCES[stepId];
11051
+ const rootLabels = source.rootLabels.filter((l) => present.has(l));
11052
+ if (rootLabels.length === 0) continue;
11053
+ supplies.push({
11054
+ kind: "crop",
11055
+ stepId,
11056
+ rootLabels,
11057
+ parentMacro: source.parentMacro,
11058
+ childClass: source.childClass
11059
+ });
11060
+ }
11061
+ return supplies;
11400
11062
  }
11401
11063
  var MODEL_FORMATS = [
11402
11064
  "onnx",
@@ -11530,12 +11192,35 @@ var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { wei
11530
11192
  /** True when the weights or their data forbid commercial use. */
11531
11193
  nonCommercial: boolean().optional()
11532
11194
  }));
11533
- /** One `fillsClassifierEffects` entry — see `ModelCatalogEntry.fillsClassifierEffects`. */
11534
- var FillsClassifierEffectSchema = object({
11535
- stepId: _enum(FILLABLE_STEP_IDS),
11195
+ /**
11196
+ * One step a ROOT detector can supply from its own output (D730) — see
11197
+ * `ModelCatalogEntry.suppliesSteps`.
11198
+ *
11199
+ * - `label`: the root's raw class IS the step's answer. `labelToEffect` maps
11200
+ * the root's label to the step's vocabulary; `uncovered` is the vocabulary
11201
+ * the root cannot produce (shown as unavailable, never a blocker).
11202
+ * - `crop`: the root draws the box the step would have found (`license_plate`
11203
+ * for plate-detection, `face` for face-detection). The box becomes a detail
11204
+ * child of the `parentMacro` detection that contains it — never a track.
11205
+ */
11206
+ var RootStepSupplySchema = discriminatedUnion("kind", [object({
11207
+ kind: literal("label"),
11208
+ stepId: _enum(LABEL_SUPPLY_STEP_IDS),
11536
11209
  labelToEffect: record(string(), string()),
11537
11210
  uncovered: array(string()).readonly()
11538
- });
11211
+ }), object({
11212
+ kind: literal("crop"),
11213
+ stepId: _enum(CROP_SUPPLY_STEP_IDS),
11214
+ rootLabels: array(string()).readonly(),
11215
+ parentMacro: _enum(["vehicle", "person"]),
11216
+ childClass: _enum(["plate", "face"]),
11217
+ /**
11218
+ * The root's smaller input side, stamped on read by `rootSuppliesOf` from
11219
+ * the model entry — what a step's `minRootInputPx` gate judges. Never
11220
+ * stored by an import.
11221
+ */
11222
+ rootInputPx: number().int().positive().optional()
11223
+ })]);
11539
11224
  var ModelCatalogEntrySchema = object({
11540
11225
  id: string(),
11541
11226
  name: string(),
@@ -11662,15 +11347,15 @@ var ModelCatalogEntrySchema = object({
11662
11347
  */
11663
11348
  classMap: DetectionCatalogClassMapSchema.optional(),
11664
11349
  /**
11665
- * The pipeline steps this ROOT detector already does the work of (D715):
11666
- * its labels name the effect the step exists to produce (`deer` for
11667
- * `animal-classifier`, `package` for `package-detection`). Derived from the
11668
- * labelmap by `deriveClassifierFills`, never hand-written; a COCO model
11669
- * declares none. Whether a declaration is honoured is the step's own
11670
- * `labelLink` policy (`resolveLabelLink`). `labelToEffect` values are in
11671
- * `FILLABLE_STEP_VOCABULARIES` (guard `check-label-link-vocabulary`).
11350
+ * The pipeline steps this ROOT detector can supply from its own output
11351
+ * (D730): its labels name a step's effect (`deer` for `animal-classifier`)
11352
+ * or draw a step's box (`license_plate` for `plate-detection`). Computed at
11353
+ * import from THIS model's labelmap by `deriveRootSupplies`, never written
11354
+ * by hand and never assumed per family; a row without it is derived on read
11355
+ * (`rootSuppliesOf`). Whether a camera uses it is the step's own
11356
+ * `useRootModel` flag (`resolveRootSupply`).
11672
11357
  */
11673
- fillsClassifierEffects: array(FillsClassifierEffectSchema).readonly().optional(),
11358
+ suppliesSteps: array(RootStepSupplySchema).readonly().optional(),
11674
11359
  /**
11675
11360
  * The model's CLIP feature-space contract (text encoder, dimension, vector
11676
11361
  * index, token window, search floor) — see `clip-model.ts`. Present ONLY on a
@@ -18632,6 +18317,51 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
18632
18317
  kind: "mutation",
18633
18318
  auth: "admin"
18634
18319
  });
18320
+ new Set([
18321
+ {
18322
+ id: "person",
18323
+ name: "Person"
18324
+ },
18325
+ {
18326
+ id: "vehicle",
18327
+ name: "Vehicle"
18328
+ },
18329
+ {
18330
+ id: "animal",
18331
+ name: "Animal"
18332
+ },
18333
+ {
18334
+ id: "package",
18335
+ name: "Package"
18336
+ }
18337
+ ].map((l) => l.id));
18338
+ var COCO_TO_MACRO = {
18339
+ mapping: {
18340
+ person: "person",
18341
+ bicycle: "vehicle",
18342
+ car: "vehicle",
18343
+ motorcycle: "vehicle",
18344
+ airplane: "vehicle",
18345
+ bus: "vehicle",
18346
+ train: "vehicle",
18347
+ truck: "vehicle",
18348
+ boat: "vehicle",
18349
+ bird: "animal",
18350
+ cat: "animal",
18351
+ dog: "animal",
18352
+ horse: "animal",
18353
+ sheep: "animal",
18354
+ cow: "animal",
18355
+ elephant: "animal",
18356
+ bear: "animal",
18357
+ zebra: "animal",
18358
+ giraffe: "animal",
18359
+ suitcase: "package",
18360
+ backpack: "package",
18361
+ handbag: "package"
18362
+ },
18363
+ preserveOriginal: false
18364
+ };
18635
18365
  var AUDIO_MACRO_LABELS = [
18636
18366
  {
18637
18367
  id: "speech",
@@ -19389,6 +19119,8 @@ var NcSystemEventKindSchema = _enum([
19389
19119
  "stream-offline",
19390
19120
  "node-online",
19391
19121
  "node-offline",
19122
+ "node-restarting",
19123
+ "node-updating",
19392
19124
  "node-inference-unavailable",
19393
19125
  "detection-blind",
19394
19126
  "addon-crash-loop",
@@ -23906,6 +23638,34 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
23906
23638
  timestamp: number()
23907
23639
  });
23908
23640
  /**
23641
+ * A root model's boxes standing in for one crop-kind step's own inference
23642
+ * (D730) — see `runPipeline.suppliedRoot`.
23643
+ */
23644
+ var SuppliedRootOutputSchema = object({
23645
+ stepId: string(),
23646
+ /** The root model that drew the boxes — stamped on the result. */
23647
+ modelId: string(),
23648
+ detections: array(object({
23649
+ /** `[x1, y1, x2, y2]` in the pixels of the call's image. */
23650
+ bbox: tuple([
23651
+ number(),
23652
+ number(),
23653
+ number(),
23654
+ number()
23655
+ ]),
23656
+ score: number(),
23657
+ /**
23658
+ * Five facial landmarks in the same pixels — a face the step's own
23659
+ * detector already re-found inside a root face box (D730), so its
23660
+ * embedder child aligns it exactly as it aligns any detected face.
23661
+ */
23662
+ landmarks: array(object({
23663
+ x: number(),
23664
+ y: number()
23665
+ })).optional()
23666
+ })).min(1)
23667
+ });
23668
+ /**
23909
23669
  * Reference to the frame's retained NATIVE surface + the parent crop's placement
23910
23670
  * within the frame, so the executor can re-cut a leaf child ROI at native
23911
23671
  * resolution on the detail plane. See the `runPipeline` `nativeCropRef` field.
@@ -24036,7 +23796,7 @@ var PipelineModelOptionSchema = object({
24036
23796
  legacy: boolean().optional(),
24037
23797
  provider: ModelProviderIdSchema.optional(),
24038
23798
  defaultConfidence: number().optional(),
24039
- fillsClassifierEffects: array(FillsClassifierEffectSchema).readonly().optional()
23799
+ suppliesSteps: array(RootStepSupplySchema).readonly().optional()
24040
23800
  });
24041
23801
  var ConfigFieldBridge = custom();
24042
23802
  var PipelineAddonSchemaSchema = object({
@@ -24304,7 +24064,16 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
24304
24064
  * `device-not-servable`), and nothing reaches the camera's live
24305
24065
  * trace stream. Absent ⇒ unchanged behaviour.
24306
24066
  */
24307
- replay: literal(true).optional()
24067
+ replay: literal(true).optional(),
24068
+ /**
24069
+ * Root-supplied detections for the tree's ROOT step (D730). Set by
24070
+ * `runDetailSubtree` when the camera's root model supplies a crop-kind
24071
+ * step (a Frigate+ `license_plate` for `plate-detection`): the step is
24072
+ * NOT inferred, these boxes are its output, and its children (the plate
24073
+ * reader) run on them through their own crop policy. Boxes are in the
24074
+ * PIXELS of the image this call carries. Absent ⇒ the root step runs.
24075
+ */
24076
+ suppliedRoot: SuppliedRootOutputSchema.optional()
24308
24077
  }), PipelineRunResultBridge, { kind: "mutation" }), method(object({
24309
24078
  steps: array(PipelineStepInputSchema).min(1),
24310
24079
  frames: array(FrameInputSchema).min(1).max(255),
@@ -25406,7 +25175,22 @@ method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mu
25406
25175
  */
25407
25176
  cropJpeg: string().optional(),
25408
25177
  parent: DetailParentSchema,
25409
- steps: array(string()).optional()
25178
+ steps: array(string()).optional(),
25179
+ /**
25180
+ * The camera's root model already drew this step's boxes (D730): a
25181
+ * `license_plate` inside the parent vehicle. The named step is NOT
25182
+ * inferred — these FRAME-space boxes are its output — and its
25183
+ * requested children (the plate reader) run on them. Absent ⇒ every
25184
+ * requested step infers as before.
25185
+ */
25186
+ supplied: object({
25187
+ stepId: string(),
25188
+ modelId: string(),
25189
+ boxes: array(object({
25190
+ bbox: NativeCropBboxSchema,
25191
+ score: number()
25192
+ })).min(1)
25193
+ }).optional()
25410
25194
  }), object({ details: array(DetailResultSchema) }).nullable(), { kind: "mutation" }), method(object({
25411
25195
  /** Catalog step id, e.g. `clip-embedding`. */
25412
25196
  stepId: string(),
@@ -31484,6 +31268,27 @@ var ViewerEndpointsSchema = object({
31484
31268
  /** What the ranking currently resolves to (may be empty if nothing is up). */
31485
31269
  resolved: array(string()).readonly()
31486
31270
  });
31271
+ /**
31272
+ * One audience's hub address (see `hub-address.ts`): the operator's stored
31273
+ * override, the address in use, and where it came from.
31274
+ */
31275
+ var HubAddressSnapshotSchema = object({
31276
+ /** The operator's override, or null for automatic. */
31277
+ override: string().nullable(),
31278
+ /** The address in use, or null when nothing qualifies (never loopback). */
31279
+ resolved: string().nullable(),
31280
+ source: _enum([
31281
+ "override",
31282
+ "auto",
31283
+ "none"
31284
+ ])
31285
+ });
31286
+ var HubAddressesSchema = object({
31287
+ /** "Hub address for agents" — agents' bundle/model pulls, LAN devices. */
31288
+ cluster: HubAddressSnapshotSchema,
31289
+ /** "Public address for sign-in links" — e-mail links, OIDC, WebAuthn, OAuth2. */
31290
+ browser: HubAddressSnapshotSchema
31291
+ });
31487
31292
  var AllowedAddressesSchema = object({
31488
31293
  /**
31489
31294
  * Allowlist of interface addresses operators have explicitly opted
@@ -31530,7 +31335,13 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
31530
31335
  * an address notification links can be flagged with, not a hub
31531
31336
  * route. Default `false`: racers and rankers never see it. */
31532
31337
  includeAppLink: boolean().optional()
31533
- }), 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, {
31338
+ }), 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({
31339
+ audience: _enum(["cluster", "browser"]),
31340
+ baseUrl: string().nullable()
31341
+ }), HubAddressesSchema, {
31342
+ kind: "mutation",
31343
+ auth: "admin"
31344
+ }), 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, {
31534
31345
  kind: "mutation",
31535
31346
  auth: "admin"
31536
31347
  }), method(object({
@@ -31920,7 +31731,8 @@ object({
31920
31731
  * writes this slice (not even a boot seed), and neither does the runner's
31921
31732
  * phase machine: its phase is "a session is attached" for every on-motion
31922
31733
  * session, not motion, and it now has its own `DetectionPhaseTransition`.
31923
- * A provider's `isDetected` answers from the hub's slice.
31734
+ * A provider's `isDetected` and `getStatus` answer from the hub's slice
31735
+ * (`hubMotionNativeProvider`).
31924
31736
  * - **Sensors** (Home Assistant binary sensors, Homematic, Matter, Alexa
31925
31737
  * imports) — the provider pushes both edges itself, from the upstream
31926
31738
  * system's own state change. That is the sensor's own fact.
@@ -37114,17 +36926,18 @@ function buildFrigateClassMap(labels) {
37114
36926
  };
37115
36927
  }
37116
36928
  /**
37117
- * Everything a Frigate / Frigate+ entry derives from its labelmap: the classMap
37118
- * and the steps it fills (D715). Every Frigate builder spreads this, so the two
37119
- * cannot be derived from different label lists. A COCO labelmap gets its map
37120
- * and no fill.
36929
+ * Everything a Frigate / Frigate+ entry derives from ITS OWN labelmap: the
36930
+ * classMap and the steps it can supply (D730) — label and crop kinds alike.
36931
+ * Every Frigate builder spreads this at import, so the two cannot be derived
36932
+ * from different label lists, and no family is assumed to carry a label it
36933
+ * does not list.
37121
36934
  */
37122
36935
  function frigateLabelFields(labels) {
37123
36936
  const classMap = buildFrigateClassMap(labels);
37124
- const fills = deriveClassifierFills(labels, classMap);
37125
- return fills.length > 0 ? {
36937
+ const supplies = deriveRootSupplies(labels, classMap);
36938
+ return supplies.length > 0 ? {
37126
36939
  classMap,
37127
- fillsClassifierEffects: fills
36940
+ suppliesSteps: supplies
37128
36941
  } : { classMap };
37129
36942
  }
37130
36943
  /**
@@ -40073,6 +39886,12 @@ Object.freeze({
40073
39886
  addonId: null,
40074
39887
  access: "view"
40075
39888
  },
39889
+ "localNetwork.getHubAddresses": {
39890
+ capName: "local-network",
39891
+ capScope: "system",
39892
+ addonId: null,
39893
+ access: "view"
39894
+ },
40076
39895
  "localNetwork.getNotificationEndpoint": {
40077
39896
  capName: "local-network",
40078
39897
  capScope: "system",
@@ -40127,6 +39946,12 @@ Object.freeze({
40127
39946
  addonId: null,
40128
39947
  access: "create"
40129
39948
  },
39949
+ "localNetwork.setHubAddress": {
39950
+ capName: "local-network",
39951
+ capScope: "system",
39952
+ addonId: null,
39953
+ access: "create"
39954
+ },
40130
39955
  "localNetwork.setNotificationEndpoint": {
40131
39956
  capName: "local-network",
40132
39957
  capScope: "system",
@@ -48526,6 +48351,8 @@ new Map(Object.entries({
48526
48351
  "detection-blind": "device-events",
48527
48352
  "node-online": "system",
48528
48353
  "node-offline": "system",
48354
+ "node-restarting": "system",
48355
+ "node-updating": "system",
48529
48356
  "node-inference-unavailable": "system",
48530
48357
  "addon-crash-loop": "system",
48531
48358
  "addon-update-available": "system",
@@ -48603,6 +48430,7 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
48603
48430
  kinds: [
48604
48431
  "node-offline",
48605
48432
  "node-online",
48433
+ "node-restarting",
48606
48434
  "node-inference-unavailable"
48607
48435
  ]
48608
48436
  },
@@ -48624,6 +48452,7 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
48624
48452
  label: "Server & container updates",
48625
48453
  kinds: [
48626
48454
  "server-update-available",
48455
+ "node-updating",
48627
48456
  "server-updated",
48628
48457
  "wrapper-update-available"
48629
48458
  ]
@@ -48771,6 +48600,7 @@ var STATE_SUMMARY_SECTION_VARS = [
48771
48600
  kinds: [
48772
48601
  "node-offline",
48773
48602
  "node-online",
48603
+ "node-restarting",
48774
48604
  "node-inference-unavailable"
48775
48605
  ]
48776
48606
  },
@@ -48792,6 +48622,7 @@ var STATE_SUMMARY_SECTION_VARS = [
48792
48622
  example: "server 1.2.377 → 1.2.378",
48793
48623
  kinds: [
48794
48624
  "server-update-available",
48625
+ "node-updating",
48795
48626
  "server-updated",
48796
48627
  "wrapper-update-available"
48797
48628
  ]
@@ -48824,7 +48655,7 @@ var STATE_SUMMARY_VARS = [
48824
48655
  {
48825
48656
  name: "summarySection",
48826
48657
  label: "Summary: this section",
48827
- description: "The section a per-section summary row is about (D698); on a summary sent as one message, every section it reports, comma-separated.",
48658
+ description: "The section a per-section summary row is about; on a summary sent as one message, every section it reports, comma-separated.",
48828
48659
  example: "Batterie scariche",
48829
48660
  group: "system",
48830
48661
  families: ["rule"],