@camstack/addon-mqtt-broker 1.1.16 → 1.1.18

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.
@@ -4673,7 +4673,7 @@ function _instanceof(cls, params = {}) {
4673
4673
  return inst;
4674
4674
  }
4675
4675
  //#endregion
4676
- //#region ../types/dist/sleep-BiDFW0E7.mjs
4676
+ //#region ../types/dist/sleep-CZDdRBua.mjs
4677
4677
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4678
4678
  EventCategory["SystemBoot"] = "system.boot";
4679
4679
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -7268,7 +7268,16 @@ var DecoderStatsSchema = object({
7268
7268
  inputFps: number(),
7269
7269
  outputFps: number(),
7270
7270
  avgDecodeTimeMs: number(),
7271
- droppedFrames: number()
7271
+ droppedFrames: number(),
7272
+ /**
7273
+ * Pull-mode adaptive-fps telemetry (optional — only pull sessions run the
7274
+ * lag-driven controller; push sessions omit these). `lagMs` is the EWMA of
7275
+ * the decoder's real-time drift (rising = falling behind live); `adaptiveFps`
7276
+ * is the current lag-throttled emit rate (≤ `effectiveFps` ceiling).
7277
+ */
7278
+ lagMs: number().optional(),
7279
+ effectiveFps: number().optional(),
7280
+ adaptiveFps: number().optional()
7272
7281
  });
7273
7282
  var DecoderSessionConfigSchema = object({
7274
7283
  codec: string(),
@@ -7309,7 +7318,15 @@ var DecoderSessionConfigSchema = object({
7309
7318
  * other — `pullFrames` returns nothing for an `'shm'` session and
7310
7319
  * `pullHandles` returns nothing for a `'callback'` session.
7311
7320
  */
7312
- frameSink: _enum(["callback", "shm"]).default("callback")
7321
+ frameSink: _enum(["callback", "shm"]).default("callback"),
7322
+ /**
7323
+ * Per-camera decoder DEBUG facility. When `true`, a pull-mode session emits
7324
+ * a throttled (~1Hz) structured `decoder debug` line (effective/adaptive fps,
7325
+ * real-time lag, dropped-frame delta, avg decode time, hwaccel). Mirrors the
7326
+ * stream-broker's `streamingDebug` gate — off by default so production logs
7327
+ * stay quiet and the emit path pays zero per-frame cost when disabled.
7328
+ */
7329
+ debug: boolean().optional()
7313
7330
  });
7314
7331
  var EncodeProfileSchema = object({
7315
7332
  video: object({
@@ -9467,6 +9484,75 @@ DeviceType.Cover, method(object({ deviceId: number().int().nonnegative() }), _vo
9467
9484
  auth: "admin"
9468
9485
  });
9469
9486
  /**
9487
+ * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
9488
+ * shared by reolink / hikvision / amcrest. Models the common firmware
9489
+ * surface: the IR-cut switching MODE plus the two knobs that gate it
9490
+ * (photocell `sensitivity` + `switchDelaySec`). Each vendor maps these
9491
+ * onto its own ISAPI / Baichuan / Dahua-CGI fields; the cap standardises
9492
+ * the shape so ONE derived-form renders every camera.
9493
+ *
9494
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9495
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9496
+ * injected from `status`) reports the live values, and a single
9497
+ * `setSettings` mutation applies a partial change. No hand-written
9498
+ * settings-contribution methods — the framework derives the UI + save
9499
+ * routing from this surface.
9500
+ */
9501
+ /** IR-cut switching mode. `schedule` = time-of-day table configured on the camera. */
9502
+ var DayNightModeSchema = _enum([
9503
+ "auto",
9504
+ "day",
9505
+ "night",
9506
+ "schedule"
9507
+ ]);
9508
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9509
+ * getOptions availability convention. Normalized values are 0–100. */
9510
+ var NormalizedRangeSchema$1 = object({
9511
+ min: number(),
9512
+ max: number(),
9513
+ step: number()
9514
+ });
9515
+ object({
9516
+ mode: DayNightModeSchema,
9517
+ /** IR-cut trigger sensitivity, NORMALIZED 0–100 (higher = switches to night sooner). */
9518
+ sensitivity: number().optional(),
9519
+ /** Delay before the IR-cut filter flips, in seconds. */
9520
+ switchDelaySec: number().optional(),
9521
+ lastFetchedAt: number()
9522
+ });
9523
+ /**
9524
+ * Per-camera availability descriptor — drives which controls the admin UI
9525
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9526
+ * (normalized 0–100); the mode choice-set as an array. A provider returns
9527
+ * honest, camera-probed values — never hardcoded.
9528
+ */
9529
+ var DayNightOptionsSchema = object({
9530
+ /** Modes this camera accepts. Empty → the camera has no configurable day/night mode. */
9531
+ modes: array(DayNightModeSchema),
9532
+ supportsSensitivity: boolean(),
9533
+ /** Present when `supportsSensitivity` — the normalized 0–100 range. */
9534
+ sensitivity: NormalizedRangeSchema$1.optional(),
9535
+ supportsSwitchDelay: boolean(),
9536
+ /** Present when `supportsSwitchDelay` — the allowed delay range in seconds. */
9537
+ switchDelaySec: NormalizedRangeSchema$1.optional()
9538
+ });
9539
+ /**
9540
+ * Partial change to the day/night config — every field optional. A
9541
+ * provider ignores fields it does not support.
9542
+ */
9543
+ var DayNightSettingsPatchSchema = object({
9544
+ mode: DayNightModeSchema.optional(),
9545
+ sensitivity: number().optional(),
9546
+ switchDelaySec: number().optional()
9547
+ });
9548
+ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema), method(object({
9549
+ deviceId: number(),
9550
+ settings: DayNightSettingsPatchSchema
9551
+ }), _void(), {
9552
+ kind: "mutation",
9553
+ auth: "admin"
9554
+ });
9555
+ /**
9470
9556
  * Identity envelope for a device's upstream-system metadata.
9471
9557
  *
9472
9558
  * Two jobs:
@@ -9822,6 +9908,130 @@ object({
9822
9908
  });
9823
9909
  DeviceType.Image;
9824
9910
  /**
9911
+ * Vendor-neutral image / picture-adjustment cap — the per-camera config
9912
+ * cap shared by reolink / hikvision / amcrest. Models the common ISP
9913
+ * surface: the four picture sliders (brightness / contrast / saturation /
9914
+ * sharpness), orientation (mirror / flip / rotate), white-balance,
9915
+ * exposure and backlight-compensation modes.
9916
+ *
9917
+ * NORMALIZATION: every slider is a normalized int 0–100. Vendors expose
9918
+ * these natively as 0–100 or 0–255 (or other ranges); each provider maps
9919
+ * its native range to/from this normalized 0–100 space so the cap surface
9920
+ * (and the derived form) is identical across cameras. `warmth` (manual
9921
+ * white-balance) is likewise normalized 0–100.
9922
+ *
9923
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9924
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9925
+ * injected from `status`) reports the live values, and a single
9926
+ * `setSettings` mutation applies a partial change. No hand-written
9927
+ * settings-contribution methods — the framework derives the UI + save
9928
+ * routing from this surface.
9929
+ */
9930
+ /** Sensor/image rotation, degrees clockwise. */
9931
+ var ImageRotateSchema = _enum([
9932
+ "0",
9933
+ "90",
9934
+ "180",
9935
+ "270"
9936
+ ]);
9937
+ /** White-balance mode. `manual` unlocks the normalized `warmth` knob. */
9938
+ var WhiteBalanceModeSchema = _enum(["auto", "manual"]);
9939
+ /** Exposure mode. */
9940
+ var ExposureModeSchema = _enum(["auto", "manual"]);
9941
+ /**
9942
+ * Backlight-compensation mode:
9943
+ * - `off` — disabled
9944
+ * - `blc` — backlight compensation
9945
+ * - `wdr` — wide dynamic range
9946
+ * - `hlc` — highlight compensation
9947
+ */
9948
+ var BacklightModeSchema = _enum([
9949
+ "off",
9950
+ "blc",
9951
+ "wdr",
9952
+ "hlc"
9953
+ ]);
9954
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9955
+ * getOptions availability convention. Slider values are normalized 0–100. */
9956
+ var NormalizedRangeSchema = object({
9957
+ min: number(),
9958
+ max: number(),
9959
+ step: number()
9960
+ });
9961
+ object({
9962
+ /** Normalized 0–100. */
9963
+ brightness: number().optional(),
9964
+ /** Normalized 0–100. */
9965
+ contrast: number().optional(),
9966
+ /** Normalized 0–100. */
9967
+ saturation: number().optional(),
9968
+ /** Normalized 0–100. */
9969
+ sharpness: number().optional(),
9970
+ mirror: boolean().optional(),
9971
+ flip: boolean().optional(),
9972
+ rotate: ImageRotateSchema.optional(),
9973
+ whiteBalance: WhiteBalanceModeSchema.optional(),
9974
+ /** Manual white-balance warmth, NORMALIZED 0–100. Meaningful only when `whiteBalance === 'manual'`. */
9975
+ warmth: number().optional(),
9976
+ exposureMode: ExposureModeSchema.optional(),
9977
+ backlightMode: BacklightModeSchema.optional(),
9978
+ lastFetchedAt: number()
9979
+ });
9980
+ /**
9981
+ * Per-camera availability descriptor — drives which controls the admin UI
9982
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9983
+ * (the normalized 0–100 range); enums as arrays of supported values (empty
9984
+ * array → control hidden). A provider returns honest, camera-probed values
9985
+ * — never hardcoded.
9986
+ */
9987
+ var ImageSettingsOptionsSchema = object({
9988
+ supportsBrightness: boolean(),
9989
+ brightness: NormalizedRangeSchema.optional(),
9990
+ supportsContrast: boolean(),
9991
+ contrast: NormalizedRangeSchema.optional(),
9992
+ supportsSaturation: boolean(),
9993
+ saturation: NormalizedRangeSchema.optional(),
9994
+ supportsSharpness: boolean(),
9995
+ sharpness: NormalizedRangeSchema.optional(),
9996
+ supportsMirror: boolean(),
9997
+ supportsFlip: boolean(),
9998
+ /** Supported rotation values. Empty → rotation not configurable. */
9999
+ rotateOptions: array(ImageRotateSchema),
10000
+ /** Supported white-balance modes. Empty → white-balance not configurable. */
10001
+ whiteBalanceModes: array(WhiteBalanceModeSchema),
10002
+ supportsWarmth: boolean(),
10003
+ /** Present when `supportsWarmth` — the normalized 0–100 range. */
10004
+ warmth: NormalizedRangeSchema.optional(),
10005
+ /** Supported exposure modes. Empty → exposure not configurable. */
10006
+ exposureModes: array(ExposureModeSchema),
10007
+ /** Supported backlight modes. Empty → backlight-compensation not configurable. */
10008
+ backlightModes: array(BacklightModeSchema)
10009
+ });
10010
+ /**
10011
+ * Partial change to the image config — every field optional. Slider values
10012
+ * are normalized 0–100. A provider ignores fields it does not support.
10013
+ */
10014
+ var ImageSettingsPatchSchema = object({
10015
+ brightness: number().optional(),
10016
+ contrast: number().optional(),
10017
+ saturation: number().optional(),
10018
+ sharpness: number().optional(),
10019
+ mirror: boolean().optional(),
10020
+ flip: boolean().optional(),
10021
+ rotate: ImageRotateSchema.optional(),
10022
+ whiteBalance: WhiteBalanceModeSchema.optional(),
10023
+ warmth: number().optional(),
10024
+ exposureMode: ExposureModeSchema.optional(),
10025
+ backlightMode: BacklightModeSchema.optional()
10026
+ });
10027
+ DeviceType.Camera, method(object({ deviceId: number() }), ImageSettingsOptionsSchema), method(object({
10028
+ deviceId: number(),
10029
+ settings: ImageSettingsPatchSchema
10030
+ }), _void(), {
10031
+ kind: "mutation",
10032
+ auth: "admin"
10033
+ });
10034
+ /**
9825
10035
  * Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
9826
10036
  * with a mowing lifecycle plus a dock action.
9827
10037
  *
@@ -10716,6 +10926,16 @@ var RunnerCameraConfigSchema = object({
10716
10926
  * this gate is bypassed.
10717
10927
  */
10718
10928
  onboardMotionDrivesAnalyzer: boolean().default(true),
10929
+ /**
10930
+ * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
10931
+ * never arms the periodic recheck timer, regardless of `occupancyRecheckSec` —
10932
+ * this is off by default because the recheck re-subscribes a detection session
10933
+ * every N seconds while `watching`, a major source of pull-decoder re-dial
10934
+ * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
10935
+ * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
10936
+ * (and only render) when this is enabled.
10937
+ */
10938
+ occupancyRecheckEnabled: boolean().default(false),
10719
10939
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
10720
10940
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
10721
10941
  /**
@@ -13061,7 +13281,9 @@ method(object({ codec: string() }), boolean()), method(_void(), object({
13061
13281
  id: string(),
13062
13282
  name: string(),
13063
13283
  isPullMode: boolean().optional(),
13064
- priority: number().optional()
13284
+ priority: number().optional(),
13285
+ hwaccel: string().optional(),
13286
+ probedBestHwaccel: string().optional()
13065
13287
  })), method(DecoderSessionConfigSchema, object({
13066
13288
  sessionId: string(),
13067
13289
  nodeId: string()
@@ -19072,6 +19294,18 @@ Object.freeze({
19072
19294
  addonId: null,
19073
19295
  access: "view"
19074
19296
  },
19297
+ "dayNight.getOptions": {
19298
+ capName: "day-night",
19299
+ capScope: "device",
19300
+ addonId: null,
19301
+ access: "view"
19302
+ },
19303
+ "dayNight.setSettings": {
19304
+ capName: "day-night",
19305
+ capScope: "device",
19306
+ addonId: null,
19307
+ access: "create"
19308
+ },
19075
19309
  "decoder.createSession": {
19076
19310
  capName: "decoder",
19077
19311
  capScope: "system",
@@ -20002,6 +20236,18 @@ Object.freeze({
20002
20236
  addonId: null,
20003
20237
  access: "create"
20004
20238
  },
20239
+ "imageSettings.getOptions": {
20240
+ capName: "image-settings",
20241
+ capScope: "device",
20242
+ addonId: null,
20243
+ access: "view"
20244
+ },
20245
+ "imageSettings.setSettings": {
20246
+ capName: "image-settings",
20247
+ capScope: "device",
20248
+ addonId: null,
20249
+ access: "create"
20250
+ },
20005
20251
  "integrations.create": {
20006
20252
  capName: "integrations",
20007
20253
  capScope: "system",
@@ -4668,7 +4668,7 @@ function _instanceof(cls, params = {}) {
4668
4668
  return inst;
4669
4669
  }
4670
4670
  //#endregion
4671
- //#region ../types/dist/sleep-BiDFW0E7.mjs
4671
+ //#region ../types/dist/sleep-CZDdRBua.mjs
4672
4672
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4673
4673
  EventCategory["SystemBoot"] = "system.boot";
4674
4674
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -7263,7 +7263,16 @@ var DecoderStatsSchema = object({
7263
7263
  inputFps: number(),
7264
7264
  outputFps: number(),
7265
7265
  avgDecodeTimeMs: number(),
7266
- droppedFrames: number()
7266
+ droppedFrames: number(),
7267
+ /**
7268
+ * Pull-mode adaptive-fps telemetry (optional — only pull sessions run the
7269
+ * lag-driven controller; push sessions omit these). `lagMs` is the EWMA of
7270
+ * the decoder's real-time drift (rising = falling behind live); `adaptiveFps`
7271
+ * is the current lag-throttled emit rate (≤ `effectiveFps` ceiling).
7272
+ */
7273
+ lagMs: number().optional(),
7274
+ effectiveFps: number().optional(),
7275
+ adaptiveFps: number().optional()
7267
7276
  });
7268
7277
  var DecoderSessionConfigSchema = object({
7269
7278
  codec: string(),
@@ -7304,7 +7313,15 @@ var DecoderSessionConfigSchema = object({
7304
7313
  * other — `pullFrames` returns nothing for an `'shm'` session and
7305
7314
  * `pullHandles` returns nothing for a `'callback'` session.
7306
7315
  */
7307
- frameSink: _enum(["callback", "shm"]).default("callback")
7316
+ frameSink: _enum(["callback", "shm"]).default("callback"),
7317
+ /**
7318
+ * Per-camera decoder DEBUG facility. When `true`, a pull-mode session emits
7319
+ * a throttled (~1Hz) structured `decoder debug` line (effective/adaptive fps,
7320
+ * real-time lag, dropped-frame delta, avg decode time, hwaccel). Mirrors the
7321
+ * stream-broker's `streamingDebug` gate — off by default so production logs
7322
+ * stay quiet and the emit path pays zero per-frame cost when disabled.
7323
+ */
7324
+ debug: boolean().optional()
7308
7325
  });
7309
7326
  var EncodeProfileSchema = object({
7310
7327
  video: object({
@@ -9462,6 +9479,75 @@ DeviceType.Cover, method(object({ deviceId: number().int().nonnegative() }), _vo
9462
9479
  auth: "admin"
9463
9480
  });
9464
9481
  /**
9482
+ * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
9483
+ * shared by reolink / hikvision / amcrest. Models the common firmware
9484
+ * surface: the IR-cut switching MODE plus the two knobs that gate it
9485
+ * (photocell `sensitivity` + `switchDelaySec`). Each vendor maps these
9486
+ * onto its own ISAPI / Baichuan / Dahua-CGI fields; the cap standardises
9487
+ * the shape so ONE derived-form renders every camera.
9488
+ *
9489
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9490
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9491
+ * injected from `status`) reports the live values, and a single
9492
+ * `setSettings` mutation applies a partial change. No hand-written
9493
+ * settings-contribution methods — the framework derives the UI + save
9494
+ * routing from this surface.
9495
+ */
9496
+ /** IR-cut switching mode. `schedule` = time-of-day table configured on the camera. */
9497
+ var DayNightModeSchema = _enum([
9498
+ "auto",
9499
+ "day",
9500
+ "night",
9501
+ "schedule"
9502
+ ]);
9503
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9504
+ * getOptions availability convention. Normalized values are 0–100. */
9505
+ var NormalizedRangeSchema$1 = object({
9506
+ min: number(),
9507
+ max: number(),
9508
+ step: number()
9509
+ });
9510
+ object({
9511
+ mode: DayNightModeSchema,
9512
+ /** IR-cut trigger sensitivity, NORMALIZED 0–100 (higher = switches to night sooner). */
9513
+ sensitivity: number().optional(),
9514
+ /** Delay before the IR-cut filter flips, in seconds. */
9515
+ switchDelaySec: number().optional(),
9516
+ lastFetchedAt: number()
9517
+ });
9518
+ /**
9519
+ * Per-camera availability descriptor — drives which controls the admin UI
9520
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9521
+ * (normalized 0–100); the mode choice-set as an array. A provider returns
9522
+ * honest, camera-probed values — never hardcoded.
9523
+ */
9524
+ var DayNightOptionsSchema = object({
9525
+ /** Modes this camera accepts. Empty → the camera has no configurable day/night mode. */
9526
+ modes: array(DayNightModeSchema),
9527
+ supportsSensitivity: boolean(),
9528
+ /** Present when `supportsSensitivity` — the normalized 0–100 range. */
9529
+ sensitivity: NormalizedRangeSchema$1.optional(),
9530
+ supportsSwitchDelay: boolean(),
9531
+ /** Present when `supportsSwitchDelay` — the allowed delay range in seconds. */
9532
+ switchDelaySec: NormalizedRangeSchema$1.optional()
9533
+ });
9534
+ /**
9535
+ * Partial change to the day/night config — every field optional. A
9536
+ * provider ignores fields it does not support.
9537
+ */
9538
+ var DayNightSettingsPatchSchema = object({
9539
+ mode: DayNightModeSchema.optional(),
9540
+ sensitivity: number().optional(),
9541
+ switchDelaySec: number().optional()
9542
+ });
9543
+ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema), method(object({
9544
+ deviceId: number(),
9545
+ settings: DayNightSettingsPatchSchema
9546
+ }), _void(), {
9547
+ kind: "mutation",
9548
+ auth: "admin"
9549
+ });
9550
+ /**
9465
9551
  * Identity envelope for a device's upstream-system metadata.
9466
9552
  *
9467
9553
  * Two jobs:
@@ -9817,6 +9903,130 @@ object({
9817
9903
  });
9818
9904
  DeviceType.Image;
9819
9905
  /**
9906
+ * Vendor-neutral image / picture-adjustment cap — the per-camera config
9907
+ * cap shared by reolink / hikvision / amcrest. Models the common ISP
9908
+ * surface: the four picture sliders (brightness / contrast / saturation /
9909
+ * sharpness), orientation (mirror / flip / rotate), white-balance,
9910
+ * exposure and backlight-compensation modes.
9911
+ *
9912
+ * NORMALIZATION: every slider is a normalized int 0–100. Vendors expose
9913
+ * these natively as 0–100 or 0–255 (or other ranges); each provider maps
9914
+ * its native range to/from this normalized 0–100 space so the cap surface
9915
+ * (and the derived form) is identical across cameras. `warmth` (manual
9916
+ * white-balance) is likewise normalized 0–100.
9917
+ *
9918
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9919
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9920
+ * injected from `status`) reports the live values, and a single
9921
+ * `setSettings` mutation applies a partial change. No hand-written
9922
+ * settings-contribution methods — the framework derives the UI + save
9923
+ * routing from this surface.
9924
+ */
9925
+ /** Sensor/image rotation, degrees clockwise. */
9926
+ var ImageRotateSchema = _enum([
9927
+ "0",
9928
+ "90",
9929
+ "180",
9930
+ "270"
9931
+ ]);
9932
+ /** White-balance mode. `manual` unlocks the normalized `warmth` knob. */
9933
+ var WhiteBalanceModeSchema = _enum(["auto", "manual"]);
9934
+ /** Exposure mode. */
9935
+ var ExposureModeSchema = _enum(["auto", "manual"]);
9936
+ /**
9937
+ * Backlight-compensation mode:
9938
+ * - `off` — disabled
9939
+ * - `blc` — backlight compensation
9940
+ * - `wdr` — wide dynamic range
9941
+ * - `hlc` — highlight compensation
9942
+ */
9943
+ var BacklightModeSchema = _enum([
9944
+ "off",
9945
+ "blc",
9946
+ "wdr",
9947
+ "hlc"
9948
+ ]);
9949
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9950
+ * getOptions availability convention. Slider values are normalized 0–100. */
9951
+ var NormalizedRangeSchema = object({
9952
+ min: number(),
9953
+ max: number(),
9954
+ step: number()
9955
+ });
9956
+ object({
9957
+ /** Normalized 0–100. */
9958
+ brightness: number().optional(),
9959
+ /** Normalized 0–100. */
9960
+ contrast: number().optional(),
9961
+ /** Normalized 0–100. */
9962
+ saturation: number().optional(),
9963
+ /** Normalized 0–100. */
9964
+ sharpness: number().optional(),
9965
+ mirror: boolean().optional(),
9966
+ flip: boolean().optional(),
9967
+ rotate: ImageRotateSchema.optional(),
9968
+ whiteBalance: WhiteBalanceModeSchema.optional(),
9969
+ /** Manual white-balance warmth, NORMALIZED 0–100. Meaningful only when `whiteBalance === 'manual'`. */
9970
+ warmth: number().optional(),
9971
+ exposureMode: ExposureModeSchema.optional(),
9972
+ backlightMode: BacklightModeSchema.optional(),
9973
+ lastFetchedAt: number()
9974
+ });
9975
+ /**
9976
+ * Per-camera availability descriptor — drives which controls the admin UI
9977
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9978
+ * (the normalized 0–100 range); enums as arrays of supported values (empty
9979
+ * array → control hidden). A provider returns honest, camera-probed values
9980
+ * — never hardcoded.
9981
+ */
9982
+ var ImageSettingsOptionsSchema = object({
9983
+ supportsBrightness: boolean(),
9984
+ brightness: NormalizedRangeSchema.optional(),
9985
+ supportsContrast: boolean(),
9986
+ contrast: NormalizedRangeSchema.optional(),
9987
+ supportsSaturation: boolean(),
9988
+ saturation: NormalizedRangeSchema.optional(),
9989
+ supportsSharpness: boolean(),
9990
+ sharpness: NormalizedRangeSchema.optional(),
9991
+ supportsMirror: boolean(),
9992
+ supportsFlip: boolean(),
9993
+ /** Supported rotation values. Empty → rotation not configurable. */
9994
+ rotateOptions: array(ImageRotateSchema),
9995
+ /** Supported white-balance modes. Empty → white-balance not configurable. */
9996
+ whiteBalanceModes: array(WhiteBalanceModeSchema),
9997
+ supportsWarmth: boolean(),
9998
+ /** Present when `supportsWarmth` — the normalized 0–100 range. */
9999
+ warmth: NormalizedRangeSchema.optional(),
10000
+ /** Supported exposure modes. Empty → exposure not configurable. */
10001
+ exposureModes: array(ExposureModeSchema),
10002
+ /** Supported backlight modes. Empty → backlight-compensation not configurable. */
10003
+ backlightModes: array(BacklightModeSchema)
10004
+ });
10005
+ /**
10006
+ * Partial change to the image config — every field optional. Slider values
10007
+ * are normalized 0–100. A provider ignores fields it does not support.
10008
+ */
10009
+ var ImageSettingsPatchSchema = object({
10010
+ brightness: number().optional(),
10011
+ contrast: number().optional(),
10012
+ saturation: number().optional(),
10013
+ sharpness: number().optional(),
10014
+ mirror: boolean().optional(),
10015
+ flip: boolean().optional(),
10016
+ rotate: ImageRotateSchema.optional(),
10017
+ whiteBalance: WhiteBalanceModeSchema.optional(),
10018
+ warmth: number().optional(),
10019
+ exposureMode: ExposureModeSchema.optional(),
10020
+ backlightMode: BacklightModeSchema.optional()
10021
+ });
10022
+ DeviceType.Camera, method(object({ deviceId: number() }), ImageSettingsOptionsSchema), method(object({
10023
+ deviceId: number(),
10024
+ settings: ImageSettingsPatchSchema
10025
+ }), _void(), {
10026
+ kind: "mutation",
10027
+ auth: "admin"
10028
+ });
10029
+ /**
9820
10030
  * Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
9821
10031
  * with a mowing lifecycle plus a dock action.
9822
10032
  *
@@ -10711,6 +10921,16 @@ var RunnerCameraConfigSchema = object({
10711
10921
  * this gate is bypassed.
10712
10922
  */
10713
10923
  onboardMotionDrivesAnalyzer: boolean().default(true),
10924
+ /**
10925
+ * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
10926
+ * never arms the periodic recheck timer, regardless of `occupancyRecheckSec` —
10927
+ * this is off by default because the recheck re-subscribes a detection session
10928
+ * every N seconds while `watching`, a major source of pull-decoder re-dial
10929
+ * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
10930
+ * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
10931
+ * (and only render) when this is enabled.
10932
+ */
10933
+ occupancyRecheckEnabled: boolean().default(false),
10714
10934
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
10715
10935
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
10716
10936
  /**
@@ -13056,7 +13276,9 @@ method(object({ codec: string() }), boolean()), method(_void(), object({
13056
13276
  id: string(),
13057
13277
  name: string(),
13058
13278
  isPullMode: boolean().optional(),
13059
- priority: number().optional()
13279
+ priority: number().optional(),
13280
+ hwaccel: string().optional(),
13281
+ probedBestHwaccel: string().optional()
13060
13282
  })), method(DecoderSessionConfigSchema, object({
13061
13283
  sessionId: string(),
13062
13284
  nodeId: string()
@@ -19067,6 +19289,18 @@ Object.freeze({
19067
19289
  addonId: null,
19068
19290
  access: "view"
19069
19291
  },
19292
+ "dayNight.getOptions": {
19293
+ capName: "day-night",
19294
+ capScope: "device",
19295
+ addonId: null,
19296
+ access: "view"
19297
+ },
19298
+ "dayNight.setSettings": {
19299
+ capName: "day-night",
19300
+ capScope: "device",
19301
+ addonId: null,
19302
+ access: "create"
19303
+ },
19070
19304
  "decoder.createSession": {
19071
19305
  capName: "decoder",
19072
19306
  capScope: "system",
@@ -19997,6 +20231,18 @@ Object.freeze({
19997
20231
  addonId: null,
19998
20232
  access: "create"
19999
20233
  },
20234
+ "imageSettings.getOptions": {
20235
+ capName: "image-settings",
20236
+ capScope: "device",
20237
+ addonId: null,
20238
+ access: "view"
20239
+ },
20240
+ "imageSettings.setSettings": {
20241
+ capName: "image-settings",
20242
+ capScope: "device",
20243
+ addonId: null,
20244
+ access: "create"
20245
+ },
20000
20246
  "integrations.create": {
20001
20247
  capName: "integrations",
20002
20248
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-mqtt-broker",
3
- "version": "1.1.16",
3
+ "version": "1.1.18",
4
4
  "description": "MQTT broker registry addon for CamStack — manages external broker entries + an optional embedded aedes broker. Consumers spin up their own `mqtt.js` clients via the `mqtt-broker` cap.",
5
5
  "keywords": [
6
6
  "camstack",