@camstack/addon-export-hap 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.
@@ -4664,7 +4664,7 @@ function _instanceof(cls, params = {}) {
4664
4664
  return inst;
4665
4665
  }
4666
4666
  //#endregion
4667
- //#region ../types/dist/sleep-BiDFW0E7.mjs
4667
+ //#region ../types/dist/sleep-CZDdRBua.mjs
4668
4668
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4669
4669
  EventCategory["SystemBoot"] = "system.boot";
4670
4670
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -7259,7 +7259,16 @@ var DecoderStatsSchema = object({
7259
7259
  inputFps: number(),
7260
7260
  outputFps: number(),
7261
7261
  avgDecodeTimeMs: number(),
7262
- droppedFrames: number()
7262
+ droppedFrames: number(),
7263
+ /**
7264
+ * Pull-mode adaptive-fps telemetry (optional — only pull sessions run the
7265
+ * lag-driven controller; push sessions omit these). `lagMs` is the EWMA of
7266
+ * the decoder's real-time drift (rising = falling behind live); `adaptiveFps`
7267
+ * is the current lag-throttled emit rate (≤ `effectiveFps` ceiling).
7268
+ */
7269
+ lagMs: number().optional(),
7270
+ effectiveFps: number().optional(),
7271
+ adaptiveFps: number().optional()
7263
7272
  });
7264
7273
  var DecoderSessionConfigSchema = object({
7265
7274
  codec: string(),
@@ -7300,7 +7309,15 @@ var DecoderSessionConfigSchema = object({
7300
7309
  * other — `pullFrames` returns nothing for an `'shm'` session and
7301
7310
  * `pullHandles` returns nothing for a `'callback'` session.
7302
7311
  */
7303
- frameSink: _enum(["callback", "shm"]).default("callback")
7312
+ frameSink: _enum(["callback", "shm"]).default("callback"),
7313
+ /**
7314
+ * Per-camera decoder DEBUG facility. When `true`, a pull-mode session emits
7315
+ * a throttled (~1Hz) structured `decoder debug` line (effective/adaptive fps,
7316
+ * real-time lag, dropped-frame delta, avg decode time, hwaccel). Mirrors the
7317
+ * stream-broker's `streamingDebug` gate — off by default so production logs
7318
+ * stay quiet and the emit path pays zero per-frame cost when disabled.
7319
+ */
7320
+ debug: boolean().optional()
7304
7321
  });
7305
7322
  var EncodeProfileSchema = object({
7306
7323
  video: object({
@@ -9512,6 +9529,75 @@ DeviceType.Cover, method(object({ deviceId: number().int().nonnegative() }), _vo
9512
9529
  auth: "admin"
9513
9530
  });
9514
9531
  /**
9532
+ * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
9533
+ * shared by reolink / hikvision / amcrest. Models the common firmware
9534
+ * surface: the IR-cut switching MODE plus the two knobs that gate it
9535
+ * (photocell `sensitivity` + `switchDelaySec`). Each vendor maps these
9536
+ * onto its own ISAPI / Baichuan / Dahua-CGI fields; the cap standardises
9537
+ * the shape so ONE derived-form renders every camera.
9538
+ *
9539
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9540
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9541
+ * injected from `status`) reports the live values, and a single
9542
+ * `setSettings` mutation applies a partial change. No hand-written
9543
+ * settings-contribution methods — the framework derives the UI + save
9544
+ * routing from this surface.
9545
+ */
9546
+ /** IR-cut switching mode. `schedule` = time-of-day table configured on the camera. */
9547
+ var DayNightModeSchema = _enum([
9548
+ "auto",
9549
+ "day",
9550
+ "night",
9551
+ "schedule"
9552
+ ]);
9553
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9554
+ * getOptions availability convention. Normalized values are 0–100. */
9555
+ var NormalizedRangeSchema$1 = object({
9556
+ min: number(),
9557
+ max: number(),
9558
+ step: number()
9559
+ });
9560
+ object({
9561
+ mode: DayNightModeSchema,
9562
+ /** IR-cut trigger sensitivity, NORMALIZED 0–100 (higher = switches to night sooner). */
9563
+ sensitivity: number().optional(),
9564
+ /** Delay before the IR-cut filter flips, in seconds. */
9565
+ switchDelaySec: number().optional(),
9566
+ lastFetchedAt: number()
9567
+ });
9568
+ /**
9569
+ * Per-camera availability descriptor — drives which controls the admin UI
9570
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9571
+ * (normalized 0–100); the mode choice-set as an array. A provider returns
9572
+ * honest, camera-probed values — never hardcoded.
9573
+ */
9574
+ var DayNightOptionsSchema = object({
9575
+ /** Modes this camera accepts. Empty → the camera has no configurable day/night mode. */
9576
+ modes: array(DayNightModeSchema),
9577
+ supportsSensitivity: boolean(),
9578
+ /** Present when `supportsSensitivity` — the normalized 0–100 range. */
9579
+ sensitivity: NormalizedRangeSchema$1.optional(),
9580
+ supportsSwitchDelay: boolean(),
9581
+ /** Present when `supportsSwitchDelay` — the allowed delay range in seconds. */
9582
+ switchDelaySec: NormalizedRangeSchema$1.optional()
9583
+ });
9584
+ /**
9585
+ * Partial change to the day/night config — every field optional. A
9586
+ * provider ignores fields it does not support.
9587
+ */
9588
+ var DayNightSettingsPatchSchema = object({
9589
+ mode: DayNightModeSchema.optional(),
9590
+ sensitivity: number().optional(),
9591
+ switchDelaySec: number().optional()
9592
+ });
9593
+ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema), method(object({
9594
+ deviceId: number(),
9595
+ settings: DayNightSettingsPatchSchema
9596
+ }), _void(), {
9597
+ kind: "mutation",
9598
+ auth: "admin"
9599
+ });
9600
+ /**
9515
9601
  * Identity envelope for a device's upstream-system metadata.
9516
9602
  *
9517
9603
  * Two jobs:
@@ -9867,6 +9953,130 @@ object({
9867
9953
  });
9868
9954
  DeviceType.Image;
9869
9955
  /**
9956
+ * Vendor-neutral image / picture-adjustment cap — the per-camera config
9957
+ * cap shared by reolink / hikvision / amcrest. Models the common ISP
9958
+ * surface: the four picture sliders (brightness / contrast / saturation /
9959
+ * sharpness), orientation (mirror / flip / rotate), white-balance,
9960
+ * exposure and backlight-compensation modes.
9961
+ *
9962
+ * NORMALIZATION: every slider is a normalized int 0–100. Vendors expose
9963
+ * these natively as 0–100 or 0–255 (or other ranges); each provider maps
9964
+ * its native range to/from this normalized 0–100 space so the cap surface
9965
+ * (and the derived form) is identical across cameras. `warmth` (manual
9966
+ * white-balance) is likewise normalized 0–100.
9967
+ *
9968
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9969
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9970
+ * injected from `status`) reports the live values, and a single
9971
+ * `setSettings` mutation applies a partial change. No hand-written
9972
+ * settings-contribution methods — the framework derives the UI + save
9973
+ * routing from this surface.
9974
+ */
9975
+ /** Sensor/image rotation, degrees clockwise. */
9976
+ var ImageRotateSchema = _enum([
9977
+ "0",
9978
+ "90",
9979
+ "180",
9980
+ "270"
9981
+ ]);
9982
+ /** White-balance mode. `manual` unlocks the normalized `warmth` knob. */
9983
+ var WhiteBalanceModeSchema = _enum(["auto", "manual"]);
9984
+ /** Exposure mode. */
9985
+ var ExposureModeSchema = _enum(["auto", "manual"]);
9986
+ /**
9987
+ * Backlight-compensation mode:
9988
+ * - `off` — disabled
9989
+ * - `blc` — backlight compensation
9990
+ * - `wdr` — wide dynamic range
9991
+ * - `hlc` — highlight compensation
9992
+ */
9993
+ var BacklightModeSchema = _enum([
9994
+ "off",
9995
+ "blc",
9996
+ "wdr",
9997
+ "hlc"
9998
+ ]);
9999
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
10000
+ * getOptions availability convention. Slider values are normalized 0–100. */
10001
+ var NormalizedRangeSchema = object({
10002
+ min: number(),
10003
+ max: number(),
10004
+ step: number()
10005
+ });
10006
+ object({
10007
+ /** Normalized 0–100. */
10008
+ brightness: number().optional(),
10009
+ /** Normalized 0–100. */
10010
+ contrast: number().optional(),
10011
+ /** Normalized 0–100. */
10012
+ saturation: number().optional(),
10013
+ /** Normalized 0–100. */
10014
+ sharpness: number().optional(),
10015
+ mirror: boolean().optional(),
10016
+ flip: boolean().optional(),
10017
+ rotate: ImageRotateSchema.optional(),
10018
+ whiteBalance: WhiteBalanceModeSchema.optional(),
10019
+ /** Manual white-balance warmth, NORMALIZED 0–100. Meaningful only when `whiteBalance === 'manual'`. */
10020
+ warmth: number().optional(),
10021
+ exposureMode: ExposureModeSchema.optional(),
10022
+ backlightMode: BacklightModeSchema.optional(),
10023
+ lastFetchedAt: number()
10024
+ });
10025
+ /**
10026
+ * Per-camera availability descriptor — drives which controls the admin UI
10027
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
10028
+ * (the normalized 0–100 range); enums as arrays of supported values (empty
10029
+ * array → control hidden). A provider returns honest, camera-probed values
10030
+ * — never hardcoded.
10031
+ */
10032
+ var ImageSettingsOptionsSchema = object({
10033
+ supportsBrightness: boolean(),
10034
+ brightness: NormalizedRangeSchema.optional(),
10035
+ supportsContrast: boolean(),
10036
+ contrast: NormalizedRangeSchema.optional(),
10037
+ supportsSaturation: boolean(),
10038
+ saturation: NormalizedRangeSchema.optional(),
10039
+ supportsSharpness: boolean(),
10040
+ sharpness: NormalizedRangeSchema.optional(),
10041
+ supportsMirror: boolean(),
10042
+ supportsFlip: boolean(),
10043
+ /** Supported rotation values. Empty → rotation not configurable. */
10044
+ rotateOptions: array(ImageRotateSchema),
10045
+ /** Supported white-balance modes. Empty → white-balance not configurable. */
10046
+ whiteBalanceModes: array(WhiteBalanceModeSchema),
10047
+ supportsWarmth: boolean(),
10048
+ /** Present when `supportsWarmth` — the normalized 0–100 range. */
10049
+ warmth: NormalizedRangeSchema.optional(),
10050
+ /** Supported exposure modes. Empty → exposure not configurable. */
10051
+ exposureModes: array(ExposureModeSchema),
10052
+ /** Supported backlight modes. Empty → backlight-compensation not configurable. */
10053
+ backlightModes: array(BacklightModeSchema)
10054
+ });
10055
+ /**
10056
+ * Partial change to the image config — every field optional. Slider values
10057
+ * are normalized 0–100. A provider ignores fields it does not support.
10058
+ */
10059
+ var ImageSettingsPatchSchema = object({
10060
+ brightness: number().optional(),
10061
+ contrast: number().optional(),
10062
+ saturation: number().optional(),
10063
+ sharpness: number().optional(),
10064
+ mirror: boolean().optional(),
10065
+ flip: boolean().optional(),
10066
+ rotate: ImageRotateSchema.optional(),
10067
+ whiteBalance: WhiteBalanceModeSchema.optional(),
10068
+ warmth: number().optional(),
10069
+ exposureMode: ExposureModeSchema.optional(),
10070
+ backlightMode: BacklightModeSchema.optional()
10071
+ });
10072
+ DeviceType.Camera, method(object({ deviceId: number() }), ImageSettingsOptionsSchema), method(object({
10073
+ deviceId: number(),
10074
+ settings: ImageSettingsPatchSchema
10075
+ }), _void(), {
10076
+ kind: "mutation",
10077
+ auth: "admin"
10078
+ });
10079
+ /**
9870
10080
  * Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
9871
10081
  * with a mowing lifecycle plus a dock action.
9872
10082
  *
@@ -10761,6 +10971,16 @@ var RunnerCameraConfigSchema = object({
10761
10971
  * this gate is bypassed.
10762
10972
  */
10763
10973
  onboardMotionDrivesAnalyzer: boolean().default(true),
10974
+ /**
10975
+ * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
10976
+ * never arms the periodic recheck timer, regardless of `occupancyRecheckSec` —
10977
+ * this is off by default because the recheck re-subscribes a detection session
10978
+ * every N seconds while `watching`, a major source of pull-decoder re-dial
10979
+ * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
10980
+ * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
10981
+ * (and only render) when this is enabled.
10982
+ */
10983
+ occupancyRecheckEnabled: boolean().default(false),
10764
10984
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
10765
10985
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
10766
10986
  /**
@@ -13057,7 +13277,9 @@ method(object({ codec: string() }), boolean()), method(_void(), object({
13057
13277
  id: string(),
13058
13278
  name: string(),
13059
13279
  isPullMode: boolean().optional(),
13060
- priority: number().optional()
13280
+ priority: number().optional(),
13281
+ hwaccel: string().optional(),
13282
+ probedBestHwaccel: string().optional()
13061
13283
  })), method(DecoderSessionConfigSchema, object({
13062
13284
  sessionId: string(),
13063
13285
  nodeId: string()
@@ -19074,6 +19296,18 @@ Object.freeze({
19074
19296
  addonId: null,
19075
19297
  access: "view"
19076
19298
  },
19299
+ "dayNight.getOptions": {
19300
+ capName: "day-night",
19301
+ capScope: "device",
19302
+ addonId: null,
19303
+ access: "view"
19304
+ },
19305
+ "dayNight.setSettings": {
19306
+ capName: "day-night",
19307
+ capScope: "device",
19308
+ addonId: null,
19309
+ access: "create"
19310
+ },
19077
19311
  "decoder.createSession": {
19078
19312
  capName: "decoder",
19079
19313
  capScope: "system",
@@ -20004,6 +20238,18 @@ Object.freeze({
20004
20238
  addonId: null,
20005
20239
  access: "create"
20006
20240
  },
20241
+ "imageSettings.getOptions": {
20242
+ capName: "image-settings",
20243
+ capScope: "device",
20244
+ addonId: null,
20245
+ access: "view"
20246
+ },
20247
+ "imageSettings.setSettings": {
20248
+ capName: "image-settings",
20249
+ capScope: "device",
20250
+ addonId: null,
20251
+ access: "create"
20252
+ },
20007
20253
  "integrations.create": {
20008
20254
  capName: "integrations",
20009
20255
  capScope: "system",
@@ -4639,7 +4639,7 @@ function _instanceof(cls, params = {}) {
4639
4639
  return inst;
4640
4640
  }
4641
4641
  //#endregion
4642
- //#region ../types/dist/sleep-BiDFW0E7.mjs
4642
+ //#region ../types/dist/sleep-CZDdRBua.mjs
4643
4643
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4644
4644
  EventCategory["SystemBoot"] = "system.boot";
4645
4645
  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({
@@ -9487,6 +9504,75 @@ DeviceType.Cover, method(object({ deviceId: number().int().nonnegative() }), _vo
9487
9504
  auth: "admin"
9488
9505
  });
9489
9506
  /**
9507
+ * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
9508
+ * shared by reolink / hikvision / amcrest. Models the common firmware
9509
+ * surface: the IR-cut switching MODE plus the two knobs that gate it
9510
+ * (photocell `sensitivity` + `switchDelaySec`). Each vendor maps these
9511
+ * onto its own ISAPI / Baichuan / Dahua-CGI fields; the cap standardises
9512
+ * the shape so ONE derived-form renders every camera.
9513
+ *
9514
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9515
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9516
+ * injected from `status`) reports the live values, and a single
9517
+ * `setSettings` mutation applies a partial change. No hand-written
9518
+ * settings-contribution methods — the framework derives the UI + save
9519
+ * routing from this surface.
9520
+ */
9521
+ /** IR-cut switching mode. `schedule` = time-of-day table configured on the camera. */
9522
+ var DayNightModeSchema = _enum([
9523
+ "auto",
9524
+ "day",
9525
+ "night",
9526
+ "schedule"
9527
+ ]);
9528
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9529
+ * getOptions availability convention. Normalized values are 0–100. */
9530
+ var NormalizedRangeSchema$1 = object({
9531
+ min: number(),
9532
+ max: number(),
9533
+ step: number()
9534
+ });
9535
+ object({
9536
+ mode: DayNightModeSchema,
9537
+ /** IR-cut trigger sensitivity, NORMALIZED 0–100 (higher = switches to night sooner). */
9538
+ sensitivity: number().optional(),
9539
+ /** Delay before the IR-cut filter flips, in seconds. */
9540
+ switchDelaySec: number().optional(),
9541
+ lastFetchedAt: number()
9542
+ });
9543
+ /**
9544
+ * Per-camera availability descriptor — drives which controls the admin UI
9545
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9546
+ * (normalized 0–100); the mode choice-set as an array. A provider returns
9547
+ * honest, camera-probed values — never hardcoded.
9548
+ */
9549
+ var DayNightOptionsSchema = object({
9550
+ /** Modes this camera accepts. Empty → the camera has no configurable day/night mode. */
9551
+ modes: array(DayNightModeSchema),
9552
+ supportsSensitivity: boolean(),
9553
+ /** Present when `supportsSensitivity` — the normalized 0–100 range. */
9554
+ sensitivity: NormalizedRangeSchema$1.optional(),
9555
+ supportsSwitchDelay: boolean(),
9556
+ /** Present when `supportsSwitchDelay` — the allowed delay range in seconds. */
9557
+ switchDelaySec: NormalizedRangeSchema$1.optional()
9558
+ });
9559
+ /**
9560
+ * Partial change to the day/night config — every field optional. A
9561
+ * provider ignores fields it does not support.
9562
+ */
9563
+ var DayNightSettingsPatchSchema = object({
9564
+ mode: DayNightModeSchema.optional(),
9565
+ sensitivity: number().optional(),
9566
+ switchDelaySec: number().optional()
9567
+ });
9568
+ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema), method(object({
9569
+ deviceId: number(),
9570
+ settings: DayNightSettingsPatchSchema
9571
+ }), _void(), {
9572
+ kind: "mutation",
9573
+ auth: "admin"
9574
+ });
9575
+ /**
9490
9576
  * Identity envelope for a device's upstream-system metadata.
9491
9577
  *
9492
9578
  * Two jobs:
@@ -9842,6 +9928,130 @@ object({
9842
9928
  });
9843
9929
  DeviceType.Image;
9844
9930
  /**
9931
+ * Vendor-neutral image / picture-adjustment cap — the per-camera config
9932
+ * cap shared by reolink / hikvision / amcrest. Models the common ISP
9933
+ * surface: the four picture sliders (brightness / contrast / saturation /
9934
+ * sharpness), orientation (mirror / flip / rotate), white-balance,
9935
+ * exposure and backlight-compensation modes.
9936
+ *
9937
+ * NORMALIZATION: every slider is a normalized int 0–100. Vendors expose
9938
+ * these natively as 0–100 or 0–255 (or other ranges); each provider maps
9939
+ * its native range to/from this normalized 0–100 space so the cap surface
9940
+ * (and the derived form) is identical across cameras. `warmth` (manual
9941
+ * white-balance) is likewise normalized 0–100.
9942
+ *
9943
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9944
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9945
+ * injected from `status`) reports the live values, and a single
9946
+ * `setSettings` mutation applies a partial change. No hand-written
9947
+ * settings-contribution methods — the framework derives the UI + save
9948
+ * routing from this surface.
9949
+ */
9950
+ /** Sensor/image rotation, degrees clockwise. */
9951
+ var ImageRotateSchema = _enum([
9952
+ "0",
9953
+ "90",
9954
+ "180",
9955
+ "270"
9956
+ ]);
9957
+ /** White-balance mode. `manual` unlocks the normalized `warmth` knob. */
9958
+ var WhiteBalanceModeSchema = _enum(["auto", "manual"]);
9959
+ /** Exposure mode. */
9960
+ var ExposureModeSchema = _enum(["auto", "manual"]);
9961
+ /**
9962
+ * Backlight-compensation mode:
9963
+ * - `off` — disabled
9964
+ * - `blc` — backlight compensation
9965
+ * - `wdr` — wide dynamic range
9966
+ * - `hlc` — highlight compensation
9967
+ */
9968
+ var BacklightModeSchema = _enum([
9969
+ "off",
9970
+ "blc",
9971
+ "wdr",
9972
+ "hlc"
9973
+ ]);
9974
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9975
+ * getOptions availability convention. Slider values are normalized 0–100. */
9976
+ var NormalizedRangeSchema = object({
9977
+ min: number(),
9978
+ max: number(),
9979
+ step: number()
9980
+ });
9981
+ object({
9982
+ /** Normalized 0–100. */
9983
+ brightness: number().optional(),
9984
+ /** Normalized 0–100. */
9985
+ contrast: number().optional(),
9986
+ /** Normalized 0–100. */
9987
+ saturation: number().optional(),
9988
+ /** Normalized 0–100. */
9989
+ sharpness: number().optional(),
9990
+ mirror: boolean().optional(),
9991
+ flip: boolean().optional(),
9992
+ rotate: ImageRotateSchema.optional(),
9993
+ whiteBalance: WhiteBalanceModeSchema.optional(),
9994
+ /** Manual white-balance warmth, NORMALIZED 0–100. Meaningful only when `whiteBalance === 'manual'`. */
9995
+ warmth: number().optional(),
9996
+ exposureMode: ExposureModeSchema.optional(),
9997
+ backlightMode: BacklightModeSchema.optional(),
9998
+ lastFetchedAt: number()
9999
+ });
10000
+ /**
10001
+ * Per-camera availability descriptor — drives which controls the admin UI
10002
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
10003
+ * (the normalized 0–100 range); enums as arrays of supported values (empty
10004
+ * array → control hidden). A provider returns honest, camera-probed values
10005
+ * — never hardcoded.
10006
+ */
10007
+ var ImageSettingsOptionsSchema = object({
10008
+ supportsBrightness: boolean(),
10009
+ brightness: NormalizedRangeSchema.optional(),
10010
+ supportsContrast: boolean(),
10011
+ contrast: NormalizedRangeSchema.optional(),
10012
+ supportsSaturation: boolean(),
10013
+ saturation: NormalizedRangeSchema.optional(),
10014
+ supportsSharpness: boolean(),
10015
+ sharpness: NormalizedRangeSchema.optional(),
10016
+ supportsMirror: boolean(),
10017
+ supportsFlip: boolean(),
10018
+ /** Supported rotation values. Empty → rotation not configurable. */
10019
+ rotateOptions: array(ImageRotateSchema),
10020
+ /** Supported white-balance modes. Empty → white-balance not configurable. */
10021
+ whiteBalanceModes: array(WhiteBalanceModeSchema),
10022
+ supportsWarmth: boolean(),
10023
+ /** Present when `supportsWarmth` — the normalized 0–100 range. */
10024
+ warmth: NormalizedRangeSchema.optional(),
10025
+ /** Supported exposure modes. Empty → exposure not configurable. */
10026
+ exposureModes: array(ExposureModeSchema),
10027
+ /** Supported backlight modes. Empty → backlight-compensation not configurable. */
10028
+ backlightModes: array(BacklightModeSchema)
10029
+ });
10030
+ /**
10031
+ * Partial change to the image config — every field optional. Slider values
10032
+ * are normalized 0–100. A provider ignores fields it does not support.
10033
+ */
10034
+ var ImageSettingsPatchSchema = object({
10035
+ brightness: number().optional(),
10036
+ contrast: number().optional(),
10037
+ saturation: number().optional(),
10038
+ sharpness: number().optional(),
10039
+ mirror: boolean().optional(),
10040
+ flip: boolean().optional(),
10041
+ rotate: ImageRotateSchema.optional(),
10042
+ whiteBalance: WhiteBalanceModeSchema.optional(),
10043
+ warmth: number().optional(),
10044
+ exposureMode: ExposureModeSchema.optional(),
10045
+ backlightMode: BacklightModeSchema.optional()
10046
+ });
10047
+ DeviceType.Camera, method(object({ deviceId: number() }), ImageSettingsOptionsSchema), method(object({
10048
+ deviceId: number(),
10049
+ settings: ImageSettingsPatchSchema
10050
+ }), _void(), {
10051
+ kind: "mutation",
10052
+ auth: "admin"
10053
+ });
10054
+ /**
9845
10055
  * Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
9846
10056
  * with a mowing lifecycle plus a dock action.
9847
10057
  *
@@ -10736,6 +10946,16 @@ var RunnerCameraConfigSchema = object({
10736
10946
  * this gate is bypassed.
10737
10947
  */
10738
10948
  onboardMotionDrivesAnalyzer: boolean().default(true),
10949
+ /**
10950
+ * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
10951
+ * never arms the periodic recheck timer, regardless of `occupancyRecheckSec` —
10952
+ * this is off by default because the recheck re-subscribes a detection session
10953
+ * every N seconds while `watching`, a major source of pull-decoder re-dial
10954
+ * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
10955
+ * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
10956
+ * (and only render) when this is enabled.
10957
+ */
10958
+ occupancyRecheckEnabled: boolean().default(false),
10739
10959
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
10740
10960
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
10741
10961
  /**
@@ -13032,7 +13252,9 @@ method(object({ codec: string() }), boolean()), method(_void(), object({
13032
13252
  id: string(),
13033
13253
  name: string(),
13034
13254
  isPullMode: boolean().optional(),
13035
- priority: number().optional()
13255
+ priority: number().optional(),
13256
+ hwaccel: string().optional(),
13257
+ probedBestHwaccel: string().optional()
13036
13258
  })), method(DecoderSessionConfigSchema, object({
13037
13259
  sessionId: string(),
13038
13260
  nodeId: string()
@@ -19049,6 +19271,18 @@ Object.freeze({
19049
19271
  addonId: null,
19050
19272
  access: "view"
19051
19273
  },
19274
+ "dayNight.getOptions": {
19275
+ capName: "day-night",
19276
+ capScope: "device",
19277
+ addonId: null,
19278
+ access: "view"
19279
+ },
19280
+ "dayNight.setSettings": {
19281
+ capName: "day-night",
19282
+ capScope: "device",
19283
+ addonId: null,
19284
+ access: "create"
19285
+ },
19052
19286
  "decoder.createSession": {
19053
19287
  capName: "decoder",
19054
19288
  capScope: "system",
@@ -19979,6 +20213,18 @@ Object.freeze({
19979
20213
  addonId: null,
19980
20214
  access: "create"
19981
20215
  },
20216
+ "imageSettings.getOptions": {
20217
+ capName: "image-settings",
20218
+ capScope: "device",
20219
+ addonId: null,
20220
+ access: "view"
20221
+ },
20222
+ "imageSettings.setSettings": {
20223
+ capName: "image-settings",
20224
+ capScope: "device",
20225
+ addonId: null,
20226
+ access: "create"
20227
+ },
19982
20228
  "integrations.create": {
19983
20229
  capName: "integrations",
19984
20230
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-export-hap",
3
- "version": "1.1.16",
3
+ "version": "1.1.18",
4
4
  "description": "HomeKit (HAP) bridge exporter for CamStack devices. Publishes a bridged accessory per exposed device — MotionSensor in this MVP; Camera/Doorbell/Switch/Light follow.",
5
5
  "keywords": [
6
6
  "camstack",