@camstack/addon-model-studio 1.0.16 → 1.0.17

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 (18) hide show
  1. package/dist/{MotionZonesSettings-CBIzICaF.mjs → MotionZonesSettings-E024aAUS.mjs} +1 -1
  2. package/dist/{PrivacyMaskSettings-DOJx8_wS.mjs → PrivacyMaskSettings-Mrl6QwuT.mjs} +2 -2
  3. package/dist/_stub.js +1688 -1467
  4. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-D0mKpt-Q.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-Cbboz9cu.mjs} +4 -4
  5. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BzCPF55l.mjs +26 -0
  6. package/dist/addon-model-studio.css +1 -1
  7. package/dist/{hostInit-DDe7n4G4.mjs → hostInit-Co3iTZ_K.mjs} +3 -3
  8. package/dist/model-studio.addon.js +250 -4
  9. package/dist/model-studio.addon.mjs +250 -4
  10. package/dist/{player-overlays-VyAYk-Z7.mjs → player-overlays-DHoKoGsu.mjs} +1 -1
  11. package/dist/remoteEntry.js +1 -1
  12. package/dist/{trash-2-Cm9XGCye.mjs → trash-2-3H9YXi7g.mjs} +1 -1
  13. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-BXAVy-sS.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-Ds-GThyo.mjs} +1 -1
  14. package/package.json +1 -1
  15. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-B2wIUCRf.mjs +0 -26
  16. package/python/__pycache__/convert.cpython-314.pyc +0 -0
  17. package/python/__pycache__/convert_lib.cpython-314.pyc +0 -0
  18. package/python/__tests__/__pycache__/test_convert_lib.cpython-314.pyc +0 -0
@@ -4661,7 +4661,7 @@ function _instanceof(cls, params = {}) {
4661
4661
  return inst;
4662
4662
  }
4663
4663
  //#endregion
4664
- //#region ../types/dist/sleep-BiDFW0E7.mjs
4664
+ //#region ../types/dist/sleep-CZDdRBua.mjs
4665
4665
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4666
4666
  EventCategory["SystemBoot"] = "system.boot";
4667
4667
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -7257,7 +7257,16 @@ var DecoderStatsSchema = object({
7257
7257
  inputFps: number(),
7258
7258
  outputFps: number(),
7259
7259
  avgDecodeTimeMs: number(),
7260
- droppedFrames: number()
7260
+ droppedFrames: number(),
7261
+ /**
7262
+ * Pull-mode adaptive-fps telemetry (optional — only pull sessions run the
7263
+ * lag-driven controller; push sessions omit these). `lagMs` is the EWMA of
7264
+ * the decoder's real-time drift (rising = falling behind live); `adaptiveFps`
7265
+ * is the current lag-throttled emit rate (≤ `effectiveFps` ceiling).
7266
+ */
7267
+ lagMs: number().optional(),
7268
+ effectiveFps: number().optional(),
7269
+ adaptiveFps: number().optional()
7261
7270
  });
7262
7271
  var DecoderSessionConfigSchema = object({
7263
7272
  codec: string(),
@@ -7298,7 +7307,15 @@ var DecoderSessionConfigSchema = object({
7298
7307
  * other — `pullFrames` returns nothing for an `'shm'` session and
7299
7308
  * `pullHandles` returns nothing for a `'callback'` session.
7300
7309
  */
7301
- frameSink: _enum(["callback", "shm"]).default("callback")
7310
+ frameSink: _enum(["callback", "shm"]).default("callback"),
7311
+ /**
7312
+ * Per-camera decoder DEBUG facility. When `true`, a pull-mode session emits
7313
+ * a throttled (~1Hz) structured `decoder debug` line (effective/adaptive fps,
7314
+ * real-time lag, dropped-frame delta, avg decode time, hwaccel). Mirrors the
7315
+ * stream-broker's `streamingDebug` gate — off by default so production logs
7316
+ * stay quiet and the emit path pays zero per-frame cost when disabled.
7317
+ */
7318
+ debug: boolean().optional()
7302
7319
  });
7303
7320
  var EncodeProfileSchema = object({
7304
7321
  video: object({
@@ -9486,6 +9503,75 @@ DeviceType.Cover, method(object({ deviceId: number().int().nonnegative() }), _vo
9486
9503
  auth: "admin"
9487
9504
  });
9488
9505
  /**
9506
+ * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
9507
+ * shared by reolink / hikvision / amcrest. Models the common firmware
9508
+ * surface: the IR-cut switching MODE plus the two knobs that gate it
9509
+ * (photocell `sensitivity` + `switchDelaySec`). Each vendor maps these
9510
+ * onto its own ISAPI / Baichuan / Dahua-CGI fields; the cap standardises
9511
+ * the shape so ONE derived-form renders every camera.
9512
+ *
9513
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9514
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9515
+ * injected from `status`) reports the live values, and a single
9516
+ * `setSettings` mutation applies a partial change. No hand-written
9517
+ * settings-contribution methods — the framework derives the UI + save
9518
+ * routing from this surface.
9519
+ */
9520
+ /** IR-cut switching mode. `schedule` = time-of-day table configured on the camera. */
9521
+ var DayNightModeSchema = _enum([
9522
+ "auto",
9523
+ "day",
9524
+ "night",
9525
+ "schedule"
9526
+ ]);
9527
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9528
+ * getOptions availability convention. Normalized values are 0–100. */
9529
+ var NormalizedRangeSchema$1 = object({
9530
+ min: number(),
9531
+ max: number(),
9532
+ step: number()
9533
+ });
9534
+ object({
9535
+ mode: DayNightModeSchema,
9536
+ /** IR-cut trigger sensitivity, NORMALIZED 0–100 (higher = switches to night sooner). */
9537
+ sensitivity: number().optional(),
9538
+ /** Delay before the IR-cut filter flips, in seconds. */
9539
+ switchDelaySec: number().optional(),
9540
+ lastFetchedAt: number()
9541
+ });
9542
+ /**
9543
+ * Per-camera availability descriptor — drives which controls the admin UI
9544
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9545
+ * (normalized 0–100); the mode choice-set as an array. A provider returns
9546
+ * honest, camera-probed values — never hardcoded.
9547
+ */
9548
+ var DayNightOptionsSchema = object({
9549
+ /** Modes this camera accepts. Empty → the camera has no configurable day/night mode. */
9550
+ modes: array(DayNightModeSchema),
9551
+ supportsSensitivity: boolean(),
9552
+ /** Present when `supportsSensitivity` — the normalized 0–100 range. */
9553
+ sensitivity: NormalizedRangeSchema$1.optional(),
9554
+ supportsSwitchDelay: boolean(),
9555
+ /** Present when `supportsSwitchDelay` — the allowed delay range in seconds. */
9556
+ switchDelaySec: NormalizedRangeSchema$1.optional()
9557
+ });
9558
+ /**
9559
+ * Partial change to the day/night config — every field optional. A
9560
+ * provider ignores fields it does not support.
9561
+ */
9562
+ var DayNightSettingsPatchSchema = object({
9563
+ mode: DayNightModeSchema.optional(),
9564
+ sensitivity: number().optional(),
9565
+ switchDelaySec: number().optional()
9566
+ });
9567
+ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema), method(object({
9568
+ deviceId: number(),
9569
+ settings: DayNightSettingsPatchSchema
9570
+ }), _void(), {
9571
+ kind: "mutation",
9572
+ auth: "admin"
9573
+ });
9574
+ /**
9489
9575
  * Identity envelope for a device's upstream-system metadata.
9490
9576
  *
9491
9577
  * Two jobs:
@@ -9841,6 +9927,130 @@ object({
9841
9927
  });
9842
9928
  DeviceType.Image;
9843
9929
  /**
9930
+ * Vendor-neutral image / picture-adjustment cap — the per-camera config
9931
+ * cap shared by reolink / hikvision / amcrest. Models the common ISP
9932
+ * surface: the four picture sliders (brightness / contrast / saturation /
9933
+ * sharpness), orientation (mirror / flip / rotate), white-balance,
9934
+ * exposure and backlight-compensation modes.
9935
+ *
9936
+ * NORMALIZATION: every slider is a normalized int 0–100. Vendors expose
9937
+ * these natively as 0–100 or 0–255 (or other ranges); each provider maps
9938
+ * its native range to/from this normalized 0–100 space so the cap surface
9939
+ * (and the derived form) is identical across cameras. `warmth` (manual
9940
+ * white-balance) is likewise normalized 0–100.
9941
+ *
9942
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9943
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9944
+ * injected from `status`) reports the live values, and a single
9945
+ * `setSettings` mutation applies a partial change. No hand-written
9946
+ * settings-contribution methods — the framework derives the UI + save
9947
+ * routing from this surface.
9948
+ */
9949
+ /** Sensor/image rotation, degrees clockwise. */
9950
+ var ImageRotateSchema = _enum([
9951
+ "0",
9952
+ "90",
9953
+ "180",
9954
+ "270"
9955
+ ]);
9956
+ /** White-balance mode. `manual` unlocks the normalized `warmth` knob. */
9957
+ var WhiteBalanceModeSchema = _enum(["auto", "manual"]);
9958
+ /** Exposure mode. */
9959
+ var ExposureModeSchema = _enum(["auto", "manual"]);
9960
+ /**
9961
+ * Backlight-compensation mode:
9962
+ * - `off` — disabled
9963
+ * - `blc` — backlight compensation
9964
+ * - `wdr` — wide dynamic range
9965
+ * - `hlc` — highlight compensation
9966
+ */
9967
+ var BacklightModeSchema = _enum([
9968
+ "off",
9969
+ "blc",
9970
+ "wdr",
9971
+ "hlc"
9972
+ ]);
9973
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9974
+ * getOptions availability convention. Slider values are normalized 0–100. */
9975
+ var NormalizedRangeSchema = object({
9976
+ min: number(),
9977
+ max: number(),
9978
+ step: number()
9979
+ });
9980
+ object({
9981
+ /** Normalized 0–100. */
9982
+ brightness: number().optional(),
9983
+ /** Normalized 0–100. */
9984
+ contrast: number().optional(),
9985
+ /** Normalized 0–100. */
9986
+ saturation: number().optional(),
9987
+ /** Normalized 0–100. */
9988
+ sharpness: number().optional(),
9989
+ mirror: boolean().optional(),
9990
+ flip: boolean().optional(),
9991
+ rotate: ImageRotateSchema.optional(),
9992
+ whiteBalance: WhiteBalanceModeSchema.optional(),
9993
+ /** Manual white-balance warmth, NORMALIZED 0–100. Meaningful only when `whiteBalance === 'manual'`. */
9994
+ warmth: number().optional(),
9995
+ exposureMode: ExposureModeSchema.optional(),
9996
+ backlightMode: BacklightModeSchema.optional(),
9997
+ lastFetchedAt: number()
9998
+ });
9999
+ /**
10000
+ * Per-camera availability descriptor — drives which controls the admin UI
10001
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
10002
+ * (the normalized 0–100 range); enums as arrays of supported values (empty
10003
+ * array → control hidden). A provider returns honest, camera-probed values
10004
+ * — never hardcoded.
10005
+ */
10006
+ var ImageSettingsOptionsSchema = object({
10007
+ supportsBrightness: boolean(),
10008
+ brightness: NormalizedRangeSchema.optional(),
10009
+ supportsContrast: boolean(),
10010
+ contrast: NormalizedRangeSchema.optional(),
10011
+ supportsSaturation: boolean(),
10012
+ saturation: NormalizedRangeSchema.optional(),
10013
+ supportsSharpness: boolean(),
10014
+ sharpness: NormalizedRangeSchema.optional(),
10015
+ supportsMirror: boolean(),
10016
+ supportsFlip: boolean(),
10017
+ /** Supported rotation values. Empty → rotation not configurable. */
10018
+ rotateOptions: array(ImageRotateSchema),
10019
+ /** Supported white-balance modes. Empty → white-balance not configurable. */
10020
+ whiteBalanceModes: array(WhiteBalanceModeSchema),
10021
+ supportsWarmth: boolean(),
10022
+ /** Present when `supportsWarmth` — the normalized 0–100 range. */
10023
+ warmth: NormalizedRangeSchema.optional(),
10024
+ /** Supported exposure modes. Empty → exposure not configurable. */
10025
+ exposureModes: array(ExposureModeSchema),
10026
+ /** Supported backlight modes. Empty → backlight-compensation not configurable. */
10027
+ backlightModes: array(BacklightModeSchema)
10028
+ });
10029
+ /**
10030
+ * Partial change to the image config — every field optional. Slider values
10031
+ * are normalized 0–100. A provider ignores fields it does not support.
10032
+ */
10033
+ var ImageSettingsPatchSchema = object({
10034
+ brightness: number().optional(),
10035
+ contrast: number().optional(),
10036
+ saturation: number().optional(),
10037
+ sharpness: number().optional(),
10038
+ mirror: boolean().optional(),
10039
+ flip: boolean().optional(),
10040
+ rotate: ImageRotateSchema.optional(),
10041
+ whiteBalance: WhiteBalanceModeSchema.optional(),
10042
+ warmth: number().optional(),
10043
+ exposureMode: ExposureModeSchema.optional(),
10044
+ backlightMode: BacklightModeSchema.optional()
10045
+ });
10046
+ DeviceType.Camera, method(object({ deviceId: number() }), ImageSettingsOptionsSchema), method(object({
10047
+ deviceId: number(),
10048
+ settings: ImageSettingsPatchSchema
10049
+ }), _void(), {
10050
+ kind: "mutation",
10051
+ auth: "admin"
10052
+ });
10053
+ /**
9844
10054
  * Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
9845
10055
  * with a mowing lifecycle plus a dock action.
9846
10056
  *
@@ -10735,6 +10945,16 @@ var RunnerCameraConfigSchema = object({
10735
10945
  * this gate is bypassed.
10736
10946
  */
10737
10947
  onboardMotionDrivesAnalyzer: boolean().default(true),
10948
+ /**
10949
+ * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
10950
+ * never arms the periodic recheck timer, regardless of `occupancyRecheckSec` —
10951
+ * this is off by default because the recheck re-subscribes a detection session
10952
+ * every N seconds while `watching`, a major source of pull-decoder re-dial
10953
+ * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
10954
+ * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
10955
+ * (and only render) when this is enabled.
10956
+ */
10957
+ occupancyRecheckEnabled: boolean().default(false),
10738
10958
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
10739
10959
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
10740
10960
  /**
@@ -13064,7 +13284,9 @@ method(object({ codec: string() }), boolean()), method(_void(), object({
13064
13284
  id: string(),
13065
13285
  name: string(),
13066
13286
  isPullMode: boolean().optional(),
13067
- priority: number().optional()
13287
+ priority: number().optional(),
13288
+ hwaccel: string().optional(),
13289
+ probedBestHwaccel: string().optional()
13068
13290
  })), method(DecoderSessionConfigSchema, object({
13069
13291
  sessionId: string(),
13070
13292
  nodeId: string()
@@ -19062,6 +19284,18 @@ Object.freeze({
19062
19284
  addonId: null,
19063
19285
  access: "view"
19064
19286
  },
19287
+ "dayNight.getOptions": {
19288
+ capName: "day-night",
19289
+ capScope: "device",
19290
+ addonId: null,
19291
+ access: "view"
19292
+ },
19293
+ "dayNight.setSettings": {
19294
+ capName: "day-night",
19295
+ capScope: "device",
19296
+ addonId: null,
19297
+ access: "create"
19298
+ },
19065
19299
  "decoder.createSession": {
19066
19300
  capName: "decoder",
19067
19301
  capScope: "system",
@@ -19992,6 +20226,18 @@ Object.freeze({
19992
20226
  addonId: null,
19993
20227
  access: "create"
19994
20228
  },
20229
+ "imageSettings.getOptions": {
20230
+ capName: "image-settings",
20231
+ capScope: "device",
20232
+ addonId: null,
20233
+ access: "view"
20234
+ },
20235
+ "imageSettings.setSettings": {
20236
+ capName: "image-settings",
20237
+ capScope: "device",
20238
+ addonId: null,
20239
+ access: "create"
20240
+ },
19995
20241
  "integrations.create": {
19996
20242
  capName: "integrations",
19997
20243
  capScope: "system",
@@ -4638,7 +4638,7 @@ function _instanceof(cls, params = {}) {
4638
4638
  return inst;
4639
4639
  }
4640
4640
  //#endregion
4641
- //#region ../types/dist/sleep-BiDFW0E7.mjs
4641
+ //#region ../types/dist/sleep-CZDdRBua.mjs
4642
4642
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4643
4643
  EventCategory["SystemBoot"] = "system.boot";
4644
4644
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -7234,7 +7234,16 @@ var DecoderStatsSchema = object({
7234
7234
  inputFps: number(),
7235
7235
  outputFps: number(),
7236
7236
  avgDecodeTimeMs: number(),
7237
- droppedFrames: number()
7237
+ droppedFrames: number(),
7238
+ /**
7239
+ * Pull-mode adaptive-fps telemetry (optional — only pull sessions run the
7240
+ * lag-driven controller; push sessions omit these). `lagMs` is the EWMA of
7241
+ * the decoder's real-time drift (rising = falling behind live); `adaptiveFps`
7242
+ * is the current lag-throttled emit rate (≤ `effectiveFps` ceiling).
7243
+ */
7244
+ lagMs: number().optional(),
7245
+ effectiveFps: number().optional(),
7246
+ adaptiveFps: number().optional()
7238
7247
  });
7239
7248
  var DecoderSessionConfigSchema = object({
7240
7249
  codec: string(),
@@ -7275,7 +7284,15 @@ var DecoderSessionConfigSchema = object({
7275
7284
  * other — `pullFrames` returns nothing for an `'shm'` session and
7276
7285
  * `pullHandles` returns nothing for a `'callback'` session.
7277
7286
  */
7278
- frameSink: _enum(["callback", "shm"]).default("callback")
7287
+ frameSink: _enum(["callback", "shm"]).default("callback"),
7288
+ /**
7289
+ * Per-camera decoder DEBUG facility. When `true`, a pull-mode session emits
7290
+ * a throttled (~1Hz) structured `decoder debug` line (effective/adaptive fps,
7291
+ * real-time lag, dropped-frame delta, avg decode time, hwaccel). Mirrors the
7292
+ * stream-broker's `streamingDebug` gate — off by default so production logs
7293
+ * stay quiet and the emit path pays zero per-frame cost when disabled.
7294
+ */
7295
+ debug: boolean().optional()
7279
7296
  });
7280
7297
  var EncodeProfileSchema = object({
7281
7298
  video: object({
@@ -9463,6 +9480,75 @@ DeviceType.Cover, method(object({ deviceId: number().int().nonnegative() }), _vo
9463
9480
  auth: "admin"
9464
9481
  });
9465
9482
  /**
9483
+ * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
9484
+ * shared by reolink / hikvision / amcrest. Models the common firmware
9485
+ * surface: the IR-cut switching MODE plus the two knobs that gate it
9486
+ * (photocell `sensitivity` + `switchDelaySec`). Each vendor maps these
9487
+ * onto its own ISAPI / Baichuan / Dahua-CGI fields; the cap standardises
9488
+ * the shape so ONE derived-form renders every camera.
9489
+ *
9490
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9491
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9492
+ * injected from `status`) reports the live values, and a single
9493
+ * `setSettings` mutation applies a partial change. No hand-written
9494
+ * settings-contribution methods — the framework derives the UI + save
9495
+ * routing from this surface.
9496
+ */
9497
+ /** IR-cut switching mode. `schedule` = time-of-day table configured on the camera. */
9498
+ var DayNightModeSchema = _enum([
9499
+ "auto",
9500
+ "day",
9501
+ "night",
9502
+ "schedule"
9503
+ ]);
9504
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9505
+ * getOptions availability convention. Normalized values are 0–100. */
9506
+ var NormalizedRangeSchema$1 = object({
9507
+ min: number(),
9508
+ max: number(),
9509
+ step: number()
9510
+ });
9511
+ object({
9512
+ mode: DayNightModeSchema,
9513
+ /** IR-cut trigger sensitivity, NORMALIZED 0–100 (higher = switches to night sooner). */
9514
+ sensitivity: number().optional(),
9515
+ /** Delay before the IR-cut filter flips, in seconds. */
9516
+ switchDelaySec: number().optional(),
9517
+ lastFetchedAt: number()
9518
+ });
9519
+ /**
9520
+ * Per-camera availability descriptor — drives which controls the admin UI
9521
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9522
+ * (normalized 0–100); the mode choice-set as an array. A provider returns
9523
+ * honest, camera-probed values — never hardcoded.
9524
+ */
9525
+ var DayNightOptionsSchema = object({
9526
+ /** Modes this camera accepts. Empty → the camera has no configurable day/night mode. */
9527
+ modes: array(DayNightModeSchema),
9528
+ supportsSensitivity: boolean(),
9529
+ /** Present when `supportsSensitivity` — the normalized 0–100 range. */
9530
+ sensitivity: NormalizedRangeSchema$1.optional(),
9531
+ supportsSwitchDelay: boolean(),
9532
+ /** Present when `supportsSwitchDelay` — the allowed delay range in seconds. */
9533
+ switchDelaySec: NormalizedRangeSchema$1.optional()
9534
+ });
9535
+ /**
9536
+ * Partial change to the day/night config — every field optional. A
9537
+ * provider ignores fields it does not support.
9538
+ */
9539
+ var DayNightSettingsPatchSchema = object({
9540
+ mode: DayNightModeSchema.optional(),
9541
+ sensitivity: number().optional(),
9542
+ switchDelaySec: number().optional()
9543
+ });
9544
+ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema), method(object({
9545
+ deviceId: number(),
9546
+ settings: DayNightSettingsPatchSchema
9547
+ }), _void(), {
9548
+ kind: "mutation",
9549
+ auth: "admin"
9550
+ });
9551
+ /**
9466
9552
  * Identity envelope for a device's upstream-system metadata.
9467
9553
  *
9468
9554
  * Two jobs:
@@ -9818,6 +9904,130 @@ object({
9818
9904
  });
9819
9905
  DeviceType.Image;
9820
9906
  /**
9907
+ * Vendor-neutral image / picture-adjustment cap — the per-camera config
9908
+ * cap shared by reolink / hikvision / amcrest. Models the common ISP
9909
+ * surface: the four picture sliders (brightness / contrast / saturation /
9910
+ * sharpness), orientation (mirror / flip / rotate), white-balance,
9911
+ * exposure and backlight-compensation modes.
9912
+ *
9913
+ * NORMALIZATION: every slider is a normalized int 0–100. Vendors expose
9914
+ * these natively as 0–100 or 0–255 (or other ranges); each provider maps
9915
+ * its native range to/from this normalized 0–100 space so the cap surface
9916
+ * (and the derived form) is identical across cameras. `warmth` (manual
9917
+ * white-balance) is likewise normalized 0–100.
9918
+ *
9919
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9920
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9921
+ * injected from `status`) reports the live values, and a single
9922
+ * `setSettings` mutation applies a partial change. No hand-written
9923
+ * settings-contribution methods — the framework derives the UI + save
9924
+ * routing from this surface.
9925
+ */
9926
+ /** Sensor/image rotation, degrees clockwise. */
9927
+ var ImageRotateSchema = _enum([
9928
+ "0",
9929
+ "90",
9930
+ "180",
9931
+ "270"
9932
+ ]);
9933
+ /** White-balance mode. `manual` unlocks the normalized `warmth` knob. */
9934
+ var WhiteBalanceModeSchema = _enum(["auto", "manual"]);
9935
+ /** Exposure mode. */
9936
+ var ExposureModeSchema = _enum(["auto", "manual"]);
9937
+ /**
9938
+ * Backlight-compensation mode:
9939
+ * - `off` — disabled
9940
+ * - `blc` — backlight compensation
9941
+ * - `wdr` — wide dynamic range
9942
+ * - `hlc` — highlight compensation
9943
+ */
9944
+ var BacklightModeSchema = _enum([
9945
+ "off",
9946
+ "blc",
9947
+ "wdr",
9948
+ "hlc"
9949
+ ]);
9950
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9951
+ * getOptions availability convention. Slider values are normalized 0–100. */
9952
+ var NormalizedRangeSchema = object({
9953
+ min: number(),
9954
+ max: number(),
9955
+ step: number()
9956
+ });
9957
+ object({
9958
+ /** Normalized 0–100. */
9959
+ brightness: number().optional(),
9960
+ /** Normalized 0–100. */
9961
+ contrast: number().optional(),
9962
+ /** Normalized 0–100. */
9963
+ saturation: number().optional(),
9964
+ /** Normalized 0–100. */
9965
+ sharpness: number().optional(),
9966
+ mirror: boolean().optional(),
9967
+ flip: boolean().optional(),
9968
+ rotate: ImageRotateSchema.optional(),
9969
+ whiteBalance: WhiteBalanceModeSchema.optional(),
9970
+ /** Manual white-balance warmth, NORMALIZED 0–100. Meaningful only when `whiteBalance === 'manual'`. */
9971
+ warmth: number().optional(),
9972
+ exposureMode: ExposureModeSchema.optional(),
9973
+ backlightMode: BacklightModeSchema.optional(),
9974
+ lastFetchedAt: number()
9975
+ });
9976
+ /**
9977
+ * Per-camera availability descriptor — drives which controls the admin UI
9978
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9979
+ * (the normalized 0–100 range); enums as arrays of supported values (empty
9980
+ * array → control hidden). A provider returns honest, camera-probed values
9981
+ * — never hardcoded.
9982
+ */
9983
+ var ImageSettingsOptionsSchema = object({
9984
+ supportsBrightness: boolean(),
9985
+ brightness: NormalizedRangeSchema.optional(),
9986
+ supportsContrast: boolean(),
9987
+ contrast: NormalizedRangeSchema.optional(),
9988
+ supportsSaturation: boolean(),
9989
+ saturation: NormalizedRangeSchema.optional(),
9990
+ supportsSharpness: boolean(),
9991
+ sharpness: NormalizedRangeSchema.optional(),
9992
+ supportsMirror: boolean(),
9993
+ supportsFlip: boolean(),
9994
+ /** Supported rotation values. Empty → rotation not configurable. */
9995
+ rotateOptions: array(ImageRotateSchema),
9996
+ /** Supported white-balance modes. Empty → white-balance not configurable. */
9997
+ whiteBalanceModes: array(WhiteBalanceModeSchema),
9998
+ supportsWarmth: boolean(),
9999
+ /** Present when `supportsWarmth` — the normalized 0–100 range. */
10000
+ warmth: NormalizedRangeSchema.optional(),
10001
+ /** Supported exposure modes. Empty → exposure not configurable. */
10002
+ exposureModes: array(ExposureModeSchema),
10003
+ /** Supported backlight modes. Empty → backlight-compensation not configurable. */
10004
+ backlightModes: array(BacklightModeSchema)
10005
+ });
10006
+ /**
10007
+ * Partial change to the image config — every field optional. Slider values
10008
+ * are normalized 0–100. A provider ignores fields it does not support.
10009
+ */
10010
+ var ImageSettingsPatchSchema = object({
10011
+ brightness: number().optional(),
10012
+ contrast: number().optional(),
10013
+ saturation: number().optional(),
10014
+ sharpness: number().optional(),
10015
+ mirror: boolean().optional(),
10016
+ flip: boolean().optional(),
10017
+ rotate: ImageRotateSchema.optional(),
10018
+ whiteBalance: WhiteBalanceModeSchema.optional(),
10019
+ warmth: number().optional(),
10020
+ exposureMode: ExposureModeSchema.optional(),
10021
+ backlightMode: BacklightModeSchema.optional()
10022
+ });
10023
+ DeviceType.Camera, method(object({ deviceId: number() }), ImageSettingsOptionsSchema), method(object({
10024
+ deviceId: number(),
10025
+ settings: ImageSettingsPatchSchema
10026
+ }), _void(), {
10027
+ kind: "mutation",
10028
+ auth: "admin"
10029
+ });
10030
+ /**
9821
10031
  * Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
9822
10032
  * with a mowing lifecycle plus a dock action.
9823
10033
  *
@@ -10712,6 +10922,16 @@ var RunnerCameraConfigSchema = object({
10712
10922
  * this gate is bypassed.
10713
10923
  */
10714
10924
  onboardMotionDrivesAnalyzer: boolean().default(true),
10925
+ /**
10926
+ * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
10927
+ * never arms the periodic recheck timer, regardless of `occupancyRecheckSec` —
10928
+ * this is off by default because the recheck re-subscribes a detection session
10929
+ * every N seconds while `watching`, a major source of pull-decoder re-dial
10930
+ * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
10931
+ * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
10932
+ * (and only render) when this is enabled.
10933
+ */
10934
+ occupancyRecheckEnabled: boolean().default(false),
10715
10935
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
10716
10936
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
10717
10937
  /**
@@ -13041,7 +13261,9 @@ method(object({ codec: string() }), boolean()), method(_void(), object({
13041
13261
  id: string(),
13042
13262
  name: string(),
13043
13263
  isPullMode: boolean().optional(),
13044
- priority: number().optional()
13264
+ priority: number().optional(),
13265
+ hwaccel: string().optional(),
13266
+ probedBestHwaccel: string().optional()
13045
13267
  })), method(DecoderSessionConfigSchema, object({
13046
13268
  sessionId: string(),
13047
13269
  nodeId: string()
@@ -19039,6 +19261,18 @@ Object.freeze({
19039
19261
  addonId: null,
19040
19262
  access: "view"
19041
19263
  },
19264
+ "dayNight.getOptions": {
19265
+ capName: "day-night",
19266
+ capScope: "device",
19267
+ addonId: null,
19268
+ access: "view"
19269
+ },
19270
+ "dayNight.setSettings": {
19271
+ capName: "day-night",
19272
+ capScope: "device",
19273
+ addonId: null,
19274
+ access: "create"
19275
+ },
19042
19276
  "decoder.createSession": {
19043
19277
  capName: "decoder",
19044
19278
  capScope: "system",
@@ -19969,6 +20203,18 @@ Object.freeze({
19969
20203
  addonId: null,
19970
20204
  access: "create"
19971
20205
  },
20206
+ "imageSettings.getOptions": {
20207
+ capName: "image-settings",
20208
+ capScope: "device",
20209
+ addonId: null,
20210
+ access: "view"
20211
+ },
20212
+ "imageSettings.setSettings": {
20213
+ capName: "image-settings",
20214
+ capScope: "device",
20215
+ addonId: null,
20216
+ access: "create"
20217
+ },
19972
20218
  "integrations.create": {
19973
20219
  capName: "integrations",
19974
20220
  capScope: "system",
@@ -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 { n as u, r as d, t as f } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-ds_Ehzaa.mjs";
3
- import { d as p } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-B2wIUCRf.mjs";
3
+ import { d as p } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BzCPF55l.mjs";
4
4
  //#region ../ui-library/src/lib/cap-error.ts
5
5
  function m(e) {
6
6
  if (typeof e != "object" || !e) return null;
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-BXAVy-sS.mjs";
1
+ import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-Ds-GThyo.mjs";
2
2
  export { t as get, e as init };
@@ -1,4 +1,4 @@
1
- import { s as e } from "./player-overlays-VyAYk-Z7.mjs";
1
+ import { s as e } from "./player-overlays-DHoKoGsu.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",
@@ -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-D0mKpt-Q.mjs")).catch((e) => {
2756
+ return tr ||= rr(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-Cbboz9cu.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.0.16",
3
+ "version": "1.0.17",
4
4
  "description": "Custom detection model registry, conversion & distribution for CamStack",
5
5
  "keywords": [
6
6
  "camstack",