@camstack/addon-model-studio 1.1.207 → 1.1.209

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 (20) hide show
  1. package/dist/MotionZonesSettings-DPVW36SY.mjs +310 -0
  2. package/dist/{PrivacyMaskSettings-4VnzM7CJ.mjs → PrivacyMaskSettings-CE3p-uMG.mjs} +5 -5
  3. package/dist/{SceneMonitorEditor-C2DUWSMy.mjs → SceneMonitorEditor-B0ZWDpU7.mjs} +285 -285
  4. package/dist/_stub.js +6563 -5772
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-q5-p_N0m.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-CXndlwsf.mjs} +3 -3
  6. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DMYNiT-L.mjs +26 -0
  7. package/dist/addon-model-studio.css +1 -1
  8. package/dist/{hostInit-De6t1H5z.mjs → hostInit-DpDYa2D-.mjs} +2 -2
  9. package/dist/model-studio.addon.js +354 -9
  10. package/dist/model-studio.addon.mjs +354 -9
  11. package/dist/{player-overlays-DnuiNM0v.mjs → player-overlays-B06LE_Gr.mjs} +5 -5
  12. package/dist/remoteEntry.js +1 -1
  13. package/dist/{responsive-CIrYx2bw.mjs → responsive-BV0NkBXa.mjs} +3 -3
  14. package/dist/{scene-monitor-copy-AfaY2iTT.mjs → scene-monitor-copy-BEsrfWnh.mjs} +1 -1
  15. package/dist/{square-v2U1PMC1.mjs → square-1mDEdKJ6.mjs} +1 -1
  16. package/dist/{trash-2-BQe8qX4b.mjs → trash-2-BJYsA9Vu.mjs} +1 -1
  17. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-H0G7-sT2.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-CmWc3NQd.mjs} +1 -1
  18. package/package.json +1 -1
  19. package/dist/MotionZonesSettings-Dglm7NRe.mjs +0 -310
  20. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-_AxpyMKA.mjs +0 -26
@@ -11073,7 +11073,53 @@ var ModelFormatEntrySchema = object({
11073
11073
  /** Multi-file payload (directory members or sibling files). */
11074
11074
  files: array(string()).readonly().optional(),
11075
11075
  /** Runtime(s) that can use this format. If omitted, inferred from ModelFormat key */
11076
- runtimes: array(_enum(["python"])).readonly().optional()
11076
+ runtimes: array(_enum(["python"])).readonly().optional(),
11077
+ /**
11078
+ * Content revision of the artefact, for one hosted OFF the CamStack mirror.
11079
+ * A format on the mirror leaves it unset: its revision (the sha256 of its
11080
+ * weight file) comes from the downloader's generated table, kept in step
11081
+ * with the mirror by `scripts/check-hosted-model-revisions.ts` (D744). A
11082
+ * node records the revision it downloaded next to the file
11083
+ * (`<file>.revision`); a copy with no record or a different one is stale
11084
+ * unless its weight file hashes to the revision, and a stale copy is
11085
+ * downloaded again, the old one serving until the new one is complete. No
11086
+ * revision at all ⇒ a file on disk is current, whatever it holds (D743).
11087
+ */
11088
+ revision: string().min(1).optional()
11089
+ });
11090
+ /**
11091
+ * What a node holds for one (model, format) (D746). `current` is a complete
11092
+ * copy at its catalog revision — exactly what `downloaded: true` means.
11093
+ * `stale` is bytes on disk that are not (yet) proven current under D743/D744:
11094
+ * no or a different revision record, or a missing sibling. `missing` is no
11095
+ * copy. `downloaded` alone folds `stale` into "not downloaded", which hid
11096
+ * reclaimable bytes and a copy about to be replaced.
11097
+ */
11098
+ var ModelOnDiskStateSchema = _enum([
11099
+ "current",
11100
+ "stale",
11101
+ "missing"
11102
+ ]);
11103
+ /**
11104
+ * The numeric precision of one format's BUILD (D746) — reported only when the
11105
+ * build states it (file-name token, an INT8 variant, an EdgeTPU compile, a
11106
+ * CamStack Core ML export). Absent means "not stated", never "fp32".
11107
+ */
11108
+ var ModelFormatPrecisionSchema = _enum([
11109
+ "fp32",
11110
+ "fp16",
11111
+ "int8"
11112
+ ]);
11113
+ /**
11114
+ * One format of one model as a node's `pipelineExecutor.getSchema` reports it.
11115
+ * `onDisk` / `precision` are optional for version skew: a runner that predates
11116
+ * them omits them, and a reader falls back to `downloaded`.
11117
+ */
11118
+ var PipelineModelFormatStatusSchema = object({
11119
+ downloaded: boolean(),
11120
+ sizeMB: number(),
11121
+ onDisk: ModelOnDiskStateSchema.optional(),
11122
+ precision: ModelFormatPrecisionSchema.optional()
11077
11123
  });
11078
11124
  /**
11079
11125
  * Extra file that must be downloaded alongside the model (e.g., labels JSON, dict.txt).
@@ -11295,6 +11341,35 @@ var ModelCatalogEntrySchema = object({
11295
11341
  */
11296
11342
  defaultConfidence: number().min(0).max(1).optional(),
11297
11343
  /**
11344
+ * Per-MODEL default of the per-class confidence floors (`minConfidence<Macro>`
11345
+ * on a detector step), keyed by macro class: `{ person: 0.45 }`. A class
11346
+ * absent here runs at the step slider's global default. The same row shape
11347
+ * the floor measurement produces (`model-floors.json`: modelId → floors), so
11348
+ * a measured table is copied in as-is. An operator override is bound to the
11349
+ * model it was made for and does not survive a model change (D738). A custom
11350
+ * / imported model may declare it; without it, the global defaults apply.
11351
+ */
11352
+ defaultClassFloors: record(string(), number().min(0).max(1)).optional(),
11353
+ /**
11354
+ * The inference precision this model's OpenVINO IR needs on an Intel GPU.
11355
+ * Absent ⇒ the device default (f16 on a GPU). Set to `'f32'` for an FP32 IR
11356
+ * that produces invalid output at f16 — measured 2026-10-07 for YOLO26
11357
+ * base IRs (`yolo26s`: 0 true / 146 false positives; `yolo26m*`: NaN
11358
+ * scores) on the Core Ultra iGPU and the N100. Threaded to the pool as
11359
+ * `PoolModelConfig.gpuInferencePrecision`; the pool sets
11360
+ * INFERENCE_PRECISION_HINT on a GPU only. Costs ~60% latency on the GPU.
11361
+ */
11362
+ gpuInferencePrecision: _enum(["f32", "f16"]).optional(),
11363
+ /**
11364
+ * ROOT detectors only: per supplied step (`animal-classifier`, …), the
11365
+ * minimum DETECTION score from which this root's own fine label (species,
11366
+ * vehicle type — D736 root supply) is taken (D741). Below it the detection
11367
+ * keeps its macro class without the fine label. `1` = never take it from
11368
+ * this root. Absent ⇒ no floor beyond the macro floor. The supplied step's
11369
+ * `minConfidence` slider, bound to the ROOT model, overrides it.
11370
+ */
11371
+ suppliedLabelFloors: record(string(), number().min(0).max(1)).optional(),
11372
+ /**
11298
11373
  * When true, the executor produces a landmark-aligned crop (similarity warp
11299
11374
  * onto the canonical template) before this step runs, instead of a plain
11300
11375
  * axis-aligned bbox crop. Required for face-recognition embedders (ArcFace):
@@ -23736,7 +23811,7 @@ var FrameRefSchema = object({
23736
23811
  timestamp: number(),
23737
23812
  capturedAt: number().optional()
23738
23813
  });
23739
- var ModelFormatSchema$1 = _enum([
23814
+ var ModelFormatSchema$2 = _enum([
23740
23815
  "onnx",
23741
23816
  "coreml",
23742
23817
  "openvino",
@@ -23754,7 +23829,7 @@ var PipelineSlotSchema = _enum([
23754
23829
  var PipelineEngineChoiceSchema = object({
23755
23830
  runtime: literal("python"),
23756
23831
  backend: string(),
23757
- format: ModelFormatSchema$1,
23832
+ format: ModelFormatSchema$2,
23758
23833
  device: string().optional()
23759
23834
  });
23760
23835
  /**
@@ -23811,10 +23886,7 @@ var PipelineTemplateSchema$1 = object({
23811
23886
  var PipelineModelOptionSchema = object({
23812
23887
  id: string(),
23813
23888
  name: string(),
23814
- formats: record(string(), object({
23815
- downloaded: boolean(),
23816
- sizeMB: number()
23817
- })),
23889
+ formats: record(string(), PipelineModelFormatStatusSchema),
23818
23890
  group: ModelVariantGroupSchema.optional(),
23819
23891
  legacy: boolean().optional(),
23820
23892
  provider: ModelProviderIdSchema.optional(),
@@ -23981,6 +24053,22 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
23981
24053
  }), {
23982
24054
  kind: "mutation",
23983
24055
  auth: "admin"
24056
+ }), method(object({
24057
+ nodeId: string(),
24058
+ deviceIds: array(number()).readonly().optional(),
24059
+ dryRun: boolean()
24060
+ }), object({
24061
+ entries: array(object({
24062
+ deviceId: number(),
24063
+ keys: array(string()).readonly()
24064
+ })).readonly(),
24065
+ refused: array(object({
24066
+ deviceId: number(),
24067
+ reason: string()
24068
+ })).readonly()
24069
+ }), {
24070
+ kind: "mutation",
24071
+ auth: "admin"
23984
24072
  }), method(object({ nodeId: string() }), object({ unhealthy: array(object({
23985
24073
  /** `<backend>:<device>`, e.g. `openvino:gpu`. */
23986
24074
  deviceKey: string(),
@@ -24017,11 +24105,11 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
24017
24105
  }), PipelineTemplateSchema$1, { kind: "mutation" }), method(object({ id: string() }), _void(), { kind: "mutation" }), method(_void(), InferenceCapabilitiesBridge), method(object({ addonId: string() }), ModelAvailabilityListBridge), method(object({
24018
24106
  addonId: string(),
24019
24107
  modelId: string(),
24020
- format: ModelFormatSchema$1
24108
+ format: ModelFormatSchema$2
24021
24109
  }), DownloadModelResultSchema, { kind: "mutation" }), method(object({
24022
24110
  addonId: string(),
24023
24111
  modelId: string(),
24024
- format: ModelFormatSchema$1
24112
+ format: ModelFormatSchema$2
24025
24113
  }), object({ success: literal(true) }), { kind: "mutation" }), method(object({
24026
24114
  steps: array(PipelineStepInputSchema).min(1),
24027
24115
  frame: FrameInputSchema.optional(),
@@ -24178,6 +24266,204 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
24178
24266
  filename: string().optional(),
24179
24267
  settings: record(string(), unknown()).optional()
24180
24268
  }), AudioTestResultSchema, { kind: "mutation" }), method(_void(), ConfigUISchemaNullableBridge);
24269
+ /**
24270
+ * The wire shapes of the Best settings plan and apply (D745), used by the
24271
+ * `pipeline-orchestrator` cap. The recommender's own types
24272
+ * (`recommend.ts`, `demand.ts`) are the TS face of the same data; these
24273
+ * schemas are what crosses the cap boundary.
24274
+ */
24275
+ var ModelFormatSchema$1 = _enum(MODEL_FORMATS);
24276
+ var HardwareClassIdSchema = _enum([
24277
+ "intel-core-ultra",
24278
+ "intel-n-series",
24279
+ "apple-m-base",
24280
+ "apple-m-pro",
24281
+ "unknown"
24282
+ ]);
24283
+ var AcceleratorKindSchema = _enum([
24284
+ "intel-npu",
24285
+ "intel-igpu",
24286
+ "x86-cpu",
24287
+ "arm-cpu",
24288
+ "apple-ane",
24289
+ "coral"
24290
+ ]);
24291
+ var RecommendationReasonSchema = discriminatedUnion("kind", [
24292
+ object({
24293
+ kind: literal("fits"),
24294
+ utilisation: number()
24295
+ }),
24296
+ object({
24297
+ kind: literal("tie-faster"),
24298
+ over: string(),
24299
+ recallDelta: number()
24300
+ }),
24301
+ object({
24302
+ kind: literal("stepped-down"),
24303
+ from: string(),
24304
+ to: string(),
24305
+ limitedBy: string()
24306
+ }),
24307
+ object({
24308
+ kind: literal("no-fit-lightest"),
24309
+ utilisation: number()
24310
+ }),
24311
+ object({
24312
+ kind: literal("derived-latency"),
24313
+ modelId: string()
24314
+ }),
24315
+ object({
24316
+ kind: literal("estimated-load"),
24317
+ observedForMs: number().nullable()
24318
+ }),
24319
+ object({ kind: literal("cpu-device") }),
24320
+ object({ kind: literal("coral-untouched") }),
24321
+ object({ kind: literal("device-disabled") }),
24322
+ object({ kind: literal("device-unavailable") }),
24323
+ object({ kind: literal("node-offline") }),
24324
+ object({ kind: literal("no-hardware-facts") }),
24325
+ object({
24326
+ kind: literal("no-measured-data"),
24327
+ hardwareClass: HardwareClassIdSchema
24328
+ }),
24329
+ object({
24330
+ kind: literal("no-family-build"),
24331
+ format: ModelFormatSchema$1
24332
+ })
24333
+ ]);
24334
+ var DeviceDemandSchema = object({
24335
+ nodeId: string(),
24336
+ deviceKey: string(),
24337
+ demandFps: number(),
24338
+ maxCameraFps: number(),
24339
+ alwaysOnCameras: number(),
24340
+ onMotionSessions: number(),
24341
+ onMotionSource: _enum([
24342
+ "observed-24h",
24343
+ "estimate",
24344
+ "none"
24345
+ ]),
24346
+ observedForMs: number().nullable()
24347
+ });
24348
+ var DeviceModelChoiceSchema = object({
24349
+ modelId: string(),
24350
+ p50Ms: number(),
24351
+ fps: number(),
24352
+ measured: boolean(),
24353
+ utilisation: number(),
24354
+ personRecall: number()
24355
+ });
24356
+ var DeviceRecommendationSchema = object({
24357
+ deviceKey: string(),
24358
+ accelerator: AcceleratorKindSchema.nullable(),
24359
+ enabled: boolean(),
24360
+ available: boolean(),
24361
+ demand: DeviceDemandSchema.nullable(),
24362
+ chosen: DeviceModelChoiceSchema.nullable(),
24363
+ reasons: array(RecommendationReasonSchema).readonly()
24364
+ });
24365
+ var NodeRecommendationSchema = object({
24366
+ nodeId: string(),
24367
+ reachable: boolean(),
24368
+ hardwareClass: HardwareClassIdSchema.nullable(),
24369
+ cpuModel: string().nullable(),
24370
+ skipped: boolean(),
24371
+ acceleratorModelId: string().nullable(),
24372
+ devices: array(DeviceRecommendationSchema).readonly(),
24373
+ reasons: array(RecommendationReasonSchema).readonly()
24374
+ });
24375
+ var ModelPinChangeSchema = object({
24376
+ stepId: string(),
24377
+ before: string().nullable(),
24378
+ after: string().nullable()
24379
+ });
24380
+ var NodeDeviceChangeSchema = object({
24381
+ nodeId: string(),
24382
+ deviceKey: string(),
24383
+ madeExplicit: boolean(),
24384
+ modelPins: array(ModelPinChangeSchema).readonly(),
24385
+ thresholds: array(object({
24386
+ stepId: string(),
24387
+ keys: array(string()).readonly()
24388
+ })).readonly()
24389
+ });
24390
+ var CameraOverrideClearSchema = object({
24391
+ deviceId: number(),
24392
+ source: _enum(["step-override", "wholesale"]),
24393
+ nodeId: string(),
24394
+ deviceKey: string().nullable(),
24395
+ stepId: string(),
24396
+ modelIdBefore: string().nullable(),
24397
+ keys: array(string()).readonly()
24398
+ });
24399
+ var DetectorStoreClearSchema = object({
24400
+ deviceId: number(),
24401
+ keys: array(string()).readonly()
24402
+ });
24403
+ var BestSettingsWarningSchema = discriminatedUnion("kind", [
24404
+ object({
24405
+ kind: literal("detector-store-cluster-wide"),
24406
+ skippedNodes: array(string()).readonly()
24407
+ }),
24408
+ object({
24409
+ kind: literal("detector-store-unreadable"),
24410
+ error: string()
24411
+ }),
24412
+ object({
24413
+ kind: literal("coral-enabled"),
24414
+ nodeId: string(),
24415
+ deviceKey: string()
24416
+ })
24417
+ ]);
24418
+ var BestSettingsOptionsSchema = object({
24419
+ /** Share of each accelerator's throughput kept free (0.3–0.5). */
24420
+ headroom: number().min(.3).max(.5).default(.4) });
24421
+ var BestSettingsPlanSchema = object({
24422
+ /** Hash of everything the apply will write — the apply refuses a different one. */
24423
+ planHash: string(),
24424
+ family: literal("yolov9"),
24425
+ headroom: number(),
24426
+ generatedAt: number(),
24427
+ nodes: array(NodeRecommendationSchema).readonly(),
24428
+ nodeChanges: array(NodeDeviceChangeSchema).readonly(),
24429
+ cameraClears: array(CameraOverrideClearSchema).readonly(),
24430
+ detectorStoreClears: array(DetectorStoreClearSchema).readonly(),
24431
+ warnings: array(BestSettingsWarningSchema).readonly()
24432
+ });
24433
+ var BestSettingsApplyInputSchema = object({
24434
+ planHash: string(),
24435
+ headroom: number().min(.3).max(.5).default(.4)
24436
+ });
24437
+ var BestSettingsPhaseResultSchema = object({
24438
+ phase: _enum([
24439
+ "download",
24440
+ "camera-overrides",
24441
+ "detector-thresholds",
24442
+ "node-models",
24443
+ "redispatch"
24444
+ ]),
24445
+ ok: boolean(),
24446
+ detail: string()
24447
+ });
24448
+ var BestSettingsApplyResultSchema = discriminatedUnion("kind", [
24449
+ object({
24450
+ kind: literal("applied"),
24451
+ planHash: string(),
24452
+ phases: array(BestSettingsPhaseResultSchema).readonly()
24453
+ }),
24454
+ object({
24455
+ kind: literal("aborted"),
24456
+ phases: array(BestSettingsPhaseResultSchema).readonly()
24457
+ }),
24458
+ object({
24459
+ kind: literal("stale"),
24460
+ plan: BestSettingsPlanSchema
24461
+ }),
24462
+ object({
24463
+ kind: literal("refused"),
24464
+ reason: _enum(["apply-in-progress"])
24465
+ })
24466
+ ]);
24181
24467
  object({
24182
24468
  activeCameras: number(),
24183
24469
  throttledCameras: number(),
@@ -25904,6 +26190,9 @@ method(object({
25904
26190
  }), {
25905
26191
  kind: "mutation",
25906
26192
  auth: "admin"
26193
+ }), method(BestSettingsOptionsSchema, BestSettingsPlanSchema, { auth: "admin" }), method(BestSettingsApplyInputSchema, BestSettingsApplyResultSchema, {
26194
+ kind: "mutation",
26195
+ auth: "admin"
25907
26196
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
25908
26197
  deviceId: number(),
25909
26198
  addonId: string(),
@@ -37029,6 +37318,37 @@ function frigateLabelFields(labels) {
37029
37318
  } : { classMap };
37030
37319
  }
37031
37320
  /**
37321
+ * Per-class confidence-floor defaults of an imported stock Frigate detector
37322
+ * (D738): its per-detection `min_score` default, 0.5, for every class. Its
37323
+ * track-level `threshold` (the median of a track's recent scores) has no
37324
+ * counterpart in CamStack's per-detection floors and is not carried.
37325
+ */
37326
+ var FRIGATE_STOCK_CLASS_FLOORS = Object.freeze({
37327
+ person: .5,
37328
+ vehicle: .5,
37329
+ animal: .5
37330
+ });
37331
+ /**
37332
+ * Per-class floor defaults of an imported Frigate+ detector (D738): the
37333
+ * documented starting `min_score` values for Frigate+ models, which score
37334
+ * higher than the stock ones (person 0.65, car 0.65, cat 0.65, dog 0.70). The
37335
+ * macro `animal` takes the lower of its classes, so no class is cut above its
37336
+ * documented value.
37337
+ */
37338
+ var FRIGATE_PLUS_CLASS_FLOORS = Object.freeze({
37339
+ person: .65,
37340
+ vehicle: .65,
37341
+ animal: .65
37342
+ });
37343
+ /**
37344
+ * The `defaultClassFloors` an imported Frigate entry carries: the import's
37345
+ * own, when it states them, else the defaults of its kind. A fresh object.
37346
+ */
37347
+ function frigateDefaultClassFloors(kind, carried) {
37348
+ if (carried !== void 0) return { ...carried };
37349
+ return { ...kind === "plus" ? FRIGATE_PLUS_CLASS_FLOORS : FRIGATE_STOCK_CLASS_FLOORS };
37350
+ }
37351
+ /**
37032
37352
  * Accessory device helpers — shared across drivers.
37033
37353
  *
37034
37354
  * Many vendor-specific drivers register accessory child devices on
@@ -41546,6 +41866,12 @@ Object.freeze({
41546
41866
  addonId: null,
41547
41867
  access: "delete"
41548
41868
  },
41869
+ "pipelineExecutor.clearModelBoundDeviceOverrides": {
41870
+ capName: "pipeline-executor",
41871
+ capScope: "system",
41872
+ addonId: null,
41873
+ access: "delete"
41874
+ },
41549
41875
  "pipelineExecutor.deleteModel": {
41550
41876
  capName: "pipeline-executor",
41551
41877
  capScope: "system",
@@ -41762,6 +42088,12 @@ Object.freeze({
41762
42088
  addonId: null,
41763
42089
  access: "view"
41764
42090
  },
42091
+ "pipelineOrchestrator.applyBestSettings": {
42092
+ capName: "pipeline-orchestrator",
42093
+ capScope: "system",
42094
+ addonId: null,
42095
+ access: "create"
42096
+ },
41765
42097
  "pipelineOrchestrator.applyDeviceSettingsPatch": {
41766
42098
  capName: "pipeline-orchestrator",
41767
42099
  capScope: "system",
@@ -41936,6 +42268,12 @@ Object.freeze({
41936
42268
  addonId: null,
41937
42269
  access: "create"
41938
42270
  },
42271
+ "pipelineOrchestrator.planBestSettings": {
42272
+ capName: "pipeline-orchestrator",
42273
+ capScope: "system",
42274
+ addonId: null,
42275
+ access: "view"
42276
+ },
41939
42277
  "pipelineOrchestrator.rebalance": {
41940
42278
  capName: "pipeline-orchestrator",
41941
42279
  capScope: "system",
@@ -47358,6 +47696,11 @@ Object.freeze({
47358
47696
  form: "single",
47359
47697
  optional: false
47360
47698
  }],
47699
+ "pipelineExecutor.clearModelBoundDeviceOverrides": [{
47700
+ name: "deviceIds",
47701
+ form: "array",
47702
+ optional: true
47703
+ }],
47361
47704
  "pipelineExecutor.runPipeline": [{
47362
47705
  name: "deviceId",
47363
47706
  form: "single",
@@ -49886,6 +50229,7 @@ function buildFrigateCatalogDescriptor(catalogId, overrides) {
49886
50229
  name
49887
50230
  })),
49888
50231
  ...frigateLabelFields(cat.labels),
50232
+ defaultClassFloors: frigateDefaultClassFloors("stock"),
49889
50233
  preprocessMode: "letterbox",
49890
50234
  provider: "frigate",
49891
50235
  license: cat.license,
@@ -50228,6 +50572,7 @@ function plusInfoToDescriptor(info, opts) {
50228
50572
  name
50229
50573
  })),
50230
50574
  ...frigateLabelFields(labels),
50575
+ defaultClassFloors: frigateDefaultClassFloors("plus"),
50231
50576
  preprocessMode: "letterbox",
50232
50577
  provider: "frigate",
50233
50578
  group: frigateVariantGroup(info.type, info.width),
@@ -1,10 +1,10 @@
1
1
  import { h as e, l as t, u as n, y as r } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react__loadShare__.js-DJDHChgO.mjs";
2
- import { o as i, s as a } from "./responsive-CIrYx2bw.mjs";
2
+ import { b as i, y as a } from "./responsive-BV0NkBXa.mjs";
3
3
  import { n as o, r as s, t as c } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-ds_Ehzaa.mjs";
4
- var l = a("chevron-down", [["path", {
4
+ var l = i("chevron-down", [["path", {
5
5
  d: "m6 9 6 6 6-6",
6
6
  key: "qrunsl"
7
- }]]), u = a("chevron-right", [["path", {
7
+ }]]), u = i("chevron-right", [["path", {
8
8
  d: "m9 18 6-6-6-6",
9
9
  key: "mthhwq"
10
10
  }]]);
@@ -32,8 +32,8 @@ function d({ title: t, icon: n, headerRight: r, collapsible: i = !1, defaultOpen
32
32
  }) : null]
33
33
  });
34
34
  }
35
- r(), i("camstack:player-overlays-state", null);
36
- var f = i("camstack:player-overlays-actions", null);
35
+ r(), a("camstack:player-overlays-state", null);
36
+ var f = a("camstack:player-overlays-actions", null);
37
37
  function p(e) {
38
38
  let r = t(f);
39
39
  n(() => {
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-H0G7-sT2.mjs";
1
+ import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-CmWc3NQd.mjs";
2
2
  export { t as get, e as init };
@@ -1,6 +1,6 @@
1
1
  import { c as e, g as t, h as n, l as r, n as i, p as a, r as o, t as s, u as c, y as l } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react__loadShare__.js-DJDHChgO.mjs";
2
2
  import "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-ds_Ehzaa.mjs";
3
- import { l as u } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-_AxpyMKA.mjs";
3
+ import { d as u } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DMYNiT-L.mjs";
4
4
  //#region ../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
5
5
  l();
6
6
  var d = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim(), f = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), p = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), m = (e) => {
@@ -117,6 +117,6 @@ function E(e) {
117
117
  }
118
118
  //#endregion
119
119
  //#region ../ui-library/src/lib/responsive.ts
120
- var D = "text-[10px] text-foreground-subtle";
120
+ var D = "rounded-lg border border-border bg-surface overflow-hidden", O = "border-b border-border px-3 sm:px-4 py-1.5 sm:py-2", k = "space-y-3 sm:space-y-4", A = "flex min-w-0 flex-col gap-0.5 py-1.5 sm:flex-row sm:items-center", j = "min-w-0 text-[11px] leading-tight text-foreground-subtle sm:w-32 sm:shrink-0 sm:pr-2", M = "flex w-full min-w-0 items-center gap-1 sm:flex-1", N = "min-w-0 break-all text-xs text-foreground sm:truncate", P = "text-[10px] sm:text-[11px] font-semibold text-foreground uppercase tracking-wider", F = "text-[10px] text-foreground-subtle", I = "inline-flex items-center justify-center gap-1 rounded border border-primary/40 bg-primary/15 px-1.5 py-0.5 sm:px-2 sm:py-1 text-[10px] sm:text-[11px] font-medium text-primary hover:bg-primary/25 transition-colors disabled:opacity-40", L = "inline-flex items-center justify-center gap-1 rounded border border-danger/40 bg-danger/10 px-1.5 py-0.5 sm:px-2 sm:py-1 text-[10px] sm:text-[11px] font-medium text-danger hover:bg-danger/20 transition-colors disabled:opacity-40", R = "inline-flex items-center gap-1 rounded-full border px-1.5 py-0.5 text-[10px] font-medium transition-colors", z = "border-primary/50 bg-primary/15 text-primary", B = "border-border bg-surface text-foreground-subtle hover:bg-surface-hover";
121
121
  //#endregion
122
- export { x as a, w as i, E as n, y as o, C as r, v as s, D as t };
122
+ export { w as _, B as a, v as b, A as c, N as d, k as f, C as g, E as h, R as i, j as l, P as m, I as n, D as o, F as p, z as r, O as s, L as t, M as u, x as v, y };
@@ -1,5 +1,5 @@
1
1
  import { c as e, h as t, p as n, y as r } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react__loadShare__.js-DJDHChgO.mjs";
2
- import { s as i } from "./responsive-CIrYx2bw.mjs";
2
+ import { b as i } from "./responsive-BV0NkBXa.mjs";
3
3
  var a = i("camera", [["path", {
4
4
  d: "M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z",
5
5
  key: "18u6gg"
@@ -1,4 +1,4 @@
1
- import { s as e } from "./responsive-CIrYx2bw.mjs";
1
+ import { b as e } from "./responsive-BV0NkBXa.mjs";
2
2
  var t = e("eye-off", [
3
3
  ["path", {
4
4
  d: "M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",
@@ -1,4 +1,4 @@
1
- import { s as e } from "./responsive-CIrYx2bw.mjs";
1
+ import { b as e } from "./responsive-BV0NkBXa.mjs";
2
2
  var t = e("trash-2", [
3
3
  ["path", {
4
4
  d: "M10 11v6",
@@ -2753,7 +2753,7 @@ async function rr(e) {
2753
2753
  }
2754
2754
  }
2755
2755
  async function ir() {
2756
- return tr ||= rr(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-q5-p_N0m.mjs")).catch((e) => {
2756
+ return tr ||= rr(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-CXndlwsf.mjs")).catch((e) => {
2757
2757
  throw tr = void 0, e;
2758
2758
  }), tr;
2759
2759
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-model-studio",
3
- "version": "1.1.207",
3
+ "version": "1.1.209",
4
4
  "description": "Custom detection model registry, conversion & distribution for CamStack",
5
5
  "keywords": [
6
6
  "camstack",