@camstack/addon-static-turn 1.1.17 → 1.1.19

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.
@@ -4628,7 +4628,7 @@ function _instanceof(cls, params = {}) {
4628
4628
  return inst;
4629
4629
  }
4630
4630
  //#endregion
4631
- //#region ../types/dist/sleep-BiDFW0E7.mjs
4631
+ //#region ../types/dist/sleep-CZDdRBua.mjs
4632
4632
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4633
4633
  EventCategory["SystemBoot"] = "system.boot";
4634
4634
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -7223,7 +7223,16 @@ var DecoderStatsSchema = object({
7223
7223
  inputFps: number(),
7224
7224
  outputFps: number(),
7225
7225
  avgDecodeTimeMs: number(),
7226
- droppedFrames: number()
7226
+ droppedFrames: number(),
7227
+ /**
7228
+ * Pull-mode adaptive-fps telemetry (optional — only pull sessions run the
7229
+ * lag-driven controller; push sessions omit these). `lagMs` is the EWMA of
7230
+ * the decoder's real-time drift (rising = falling behind live); `adaptiveFps`
7231
+ * is the current lag-throttled emit rate (≤ `effectiveFps` ceiling).
7232
+ */
7233
+ lagMs: number().optional(),
7234
+ effectiveFps: number().optional(),
7235
+ adaptiveFps: number().optional()
7227
7236
  });
7228
7237
  var DecoderSessionConfigSchema = object({
7229
7238
  codec: string(),
@@ -7264,7 +7273,15 @@ var DecoderSessionConfigSchema = object({
7264
7273
  * other — `pullFrames` returns nothing for an `'shm'` session and
7265
7274
  * `pullHandles` returns nothing for a `'callback'` session.
7266
7275
  */
7267
- frameSink: _enum(["callback", "shm"]).default("callback")
7276
+ frameSink: _enum(["callback", "shm"]).default("callback"),
7277
+ /**
7278
+ * Per-camera decoder DEBUG facility. When `true`, a pull-mode session emits
7279
+ * a throttled (~1Hz) structured `decoder debug` line (effective/adaptive fps,
7280
+ * real-time lag, dropped-frame delta, avg decode time, hwaccel). Mirrors the
7281
+ * stream-broker's `streamingDebug` gate — off by default so production logs
7282
+ * stay quiet and the emit path pays zero per-frame cost when disabled.
7283
+ */
7284
+ debug: boolean().optional()
7268
7285
  });
7269
7286
  var EncodeProfileSchema = object({
7270
7287
  video: object({
@@ -9422,6 +9439,75 @@ DeviceType.Cover, method(object({ deviceId: number().int().nonnegative() }), _vo
9422
9439
  auth: "admin"
9423
9440
  });
9424
9441
  /**
9442
+ * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
9443
+ * shared by reolink / hikvision / amcrest. Models the common firmware
9444
+ * surface: the IR-cut switching MODE plus the two knobs that gate it
9445
+ * (photocell `sensitivity` + `switchDelaySec`). Each vendor maps these
9446
+ * onto its own ISAPI / Baichuan / Dahua-CGI fields; the cap standardises
9447
+ * the shape so ONE derived-form renders every camera.
9448
+ *
9449
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9450
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9451
+ * injected from `status`) reports the live values, and a single
9452
+ * `setSettings` mutation applies a partial change. No hand-written
9453
+ * settings-contribution methods — the framework derives the UI + save
9454
+ * routing from this surface.
9455
+ */
9456
+ /** IR-cut switching mode. `schedule` = time-of-day table configured on the camera. */
9457
+ var DayNightModeSchema = _enum([
9458
+ "auto",
9459
+ "day",
9460
+ "night",
9461
+ "schedule"
9462
+ ]);
9463
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9464
+ * getOptions availability convention. Normalized values are 0–100. */
9465
+ var NormalizedRangeSchema$1 = object({
9466
+ min: number(),
9467
+ max: number(),
9468
+ step: number()
9469
+ });
9470
+ object({
9471
+ mode: DayNightModeSchema,
9472
+ /** IR-cut trigger sensitivity, NORMALIZED 0–100 (higher = switches to night sooner). */
9473
+ sensitivity: number().optional(),
9474
+ /** Delay before the IR-cut filter flips, in seconds. */
9475
+ switchDelaySec: number().optional(),
9476
+ lastFetchedAt: number()
9477
+ });
9478
+ /**
9479
+ * Per-camera availability descriptor — drives which controls the admin UI
9480
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9481
+ * (normalized 0–100); the mode choice-set as an array. A provider returns
9482
+ * honest, camera-probed values — never hardcoded.
9483
+ */
9484
+ var DayNightOptionsSchema = object({
9485
+ /** Modes this camera accepts. Empty → the camera has no configurable day/night mode. */
9486
+ modes: array(DayNightModeSchema),
9487
+ supportsSensitivity: boolean(),
9488
+ /** Present when `supportsSensitivity` — the normalized 0–100 range. */
9489
+ sensitivity: NormalizedRangeSchema$1.optional(),
9490
+ supportsSwitchDelay: boolean(),
9491
+ /** Present when `supportsSwitchDelay` — the allowed delay range in seconds. */
9492
+ switchDelaySec: NormalizedRangeSchema$1.optional()
9493
+ });
9494
+ /**
9495
+ * Partial change to the day/night config — every field optional. A
9496
+ * provider ignores fields it does not support.
9497
+ */
9498
+ var DayNightSettingsPatchSchema = object({
9499
+ mode: DayNightModeSchema.optional(),
9500
+ sensitivity: number().optional(),
9501
+ switchDelaySec: number().optional()
9502
+ });
9503
+ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema), method(object({
9504
+ deviceId: number(),
9505
+ settings: DayNightSettingsPatchSchema
9506
+ }), _void(), {
9507
+ kind: "mutation",
9508
+ auth: "admin"
9509
+ });
9510
+ /**
9425
9511
  * Identity envelope for a device's upstream-system metadata.
9426
9512
  *
9427
9513
  * Two jobs:
@@ -9777,6 +9863,130 @@ object({
9777
9863
  });
9778
9864
  DeviceType.Image;
9779
9865
  /**
9866
+ * Vendor-neutral image / picture-adjustment cap — the per-camera config
9867
+ * cap shared by reolink / hikvision / amcrest. Models the common ISP
9868
+ * surface: the four picture sliders (brightness / contrast / saturation /
9869
+ * sharpness), orientation (mirror / flip / rotate), white-balance,
9870
+ * exposure and backlight-compensation modes.
9871
+ *
9872
+ * NORMALIZATION: every slider is a normalized int 0–100. Vendors expose
9873
+ * these natively as 0–100 or 0–255 (or other ranges); each provider maps
9874
+ * its native range to/from this normalized 0–100 space so the cap surface
9875
+ * (and the derived form) is identical across cameras. `warmth` (manual
9876
+ * white-balance) is likewise normalized 0–100.
9877
+ *
9878
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9879
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9880
+ * injected from `status`) reports the live values, and a single
9881
+ * `setSettings` mutation applies a partial change. No hand-written
9882
+ * settings-contribution methods — the framework derives the UI + save
9883
+ * routing from this surface.
9884
+ */
9885
+ /** Sensor/image rotation, degrees clockwise. */
9886
+ var ImageRotateSchema = _enum([
9887
+ "0",
9888
+ "90",
9889
+ "180",
9890
+ "270"
9891
+ ]);
9892
+ /** White-balance mode. `manual` unlocks the normalized `warmth` knob. */
9893
+ var WhiteBalanceModeSchema = _enum(["auto", "manual"]);
9894
+ /** Exposure mode. */
9895
+ var ExposureModeSchema = _enum(["auto", "manual"]);
9896
+ /**
9897
+ * Backlight-compensation mode:
9898
+ * - `off` — disabled
9899
+ * - `blc` — backlight compensation
9900
+ * - `wdr` — wide dynamic range
9901
+ * - `hlc` — highlight compensation
9902
+ */
9903
+ var BacklightModeSchema = _enum([
9904
+ "off",
9905
+ "blc",
9906
+ "wdr",
9907
+ "hlc"
9908
+ ]);
9909
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9910
+ * getOptions availability convention. Slider values are normalized 0–100. */
9911
+ var NormalizedRangeSchema = object({
9912
+ min: number(),
9913
+ max: number(),
9914
+ step: number()
9915
+ });
9916
+ object({
9917
+ /** Normalized 0–100. */
9918
+ brightness: number().optional(),
9919
+ /** Normalized 0–100. */
9920
+ contrast: number().optional(),
9921
+ /** Normalized 0–100. */
9922
+ saturation: number().optional(),
9923
+ /** Normalized 0–100. */
9924
+ sharpness: number().optional(),
9925
+ mirror: boolean().optional(),
9926
+ flip: boolean().optional(),
9927
+ rotate: ImageRotateSchema.optional(),
9928
+ whiteBalance: WhiteBalanceModeSchema.optional(),
9929
+ /** Manual white-balance warmth, NORMALIZED 0–100. Meaningful only when `whiteBalance === 'manual'`. */
9930
+ warmth: number().optional(),
9931
+ exposureMode: ExposureModeSchema.optional(),
9932
+ backlightMode: BacklightModeSchema.optional(),
9933
+ lastFetchedAt: number()
9934
+ });
9935
+ /**
9936
+ * Per-camera availability descriptor — drives which controls the admin UI
9937
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9938
+ * (the normalized 0–100 range); enums as arrays of supported values (empty
9939
+ * array → control hidden). A provider returns honest, camera-probed values
9940
+ * — never hardcoded.
9941
+ */
9942
+ var ImageSettingsOptionsSchema = object({
9943
+ supportsBrightness: boolean(),
9944
+ brightness: NormalizedRangeSchema.optional(),
9945
+ supportsContrast: boolean(),
9946
+ contrast: NormalizedRangeSchema.optional(),
9947
+ supportsSaturation: boolean(),
9948
+ saturation: NormalizedRangeSchema.optional(),
9949
+ supportsSharpness: boolean(),
9950
+ sharpness: NormalizedRangeSchema.optional(),
9951
+ supportsMirror: boolean(),
9952
+ supportsFlip: boolean(),
9953
+ /** Supported rotation values. Empty → rotation not configurable. */
9954
+ rotateOptions: array(ImageRotateSchema),
9955
+ /** Supported white-balance modes. Empty → white-balance not configurable. */
9956
+ whiteBalanceModes: array(WhiteBalanceModeSchema),
9957
+ supportsWarmth: boolean(),
9958
+ /** Present when `supportsWarmth` — the normalized 0–100 range. */
9959
+ warmth: NormalizedRangeSchema.optional(),
9960
+ /** Supported exposure modes. Empty → exposure not configurable. */
9961
+ exposureModes: array(ExposureModeSchema),
9962
+ /** Supported backlight modes. Empty → backlight-compensation not configurable. */
9963
+ backlightModes: array(BacklightModeSchema)
9964
+ });
9965
+ /**
9966
+ * Partial change to the image config — every field optional. Slider values
9967
+ * are normalized 0–100. A provider ignores fields it does not support.
9968
+ */
9969
+ var ImageSettingsPatchSchema = object({
9970
+ brightness: number().optional(),
9971
+ contrast: number().optional(),
9972
+ saturation: number().optional(),
9973
+ sharpness: number().optional(),
9974
+ mirror: boolean().optional(),
9975
+ flip: boolean().optional(),
9976
+ rotate: ImageRotateSchema.optional(),
9977
+ whiteBalance: WhiteBalanceModeSchema.optional(),
9978
+ warmth: number().optional(),
9979
+ exposureMode: ExposureModeSchema.optional(),
9980
+ backlightMode: BacklightModeSchema.optional()
9981
+ });
9982
+ DeviceType.Camera, method(object({ deviceId: number() }), ImageSettingsOptionsSchema), method(object({
9983
+ deviceId: number(),
9984
+ settings: ImageSettingsPatchSchema
9985
+ }), _void(), {
9986
+ kind: "mutation",
9987
+ auth: "admin"
9988
+ });
9989
+ /**
9780
9990
  * Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
9781
9991
  * with a mowing lifecycle plus a dock action.
9782
9992
  *
@@ -10671,6 +10881,16 @@ var RunnerCameraConfigSchema = object({
10671
10881
  * this gate is bypassed.
10672
10882
  */
10673
10883
  onboardMotionDrivesAnalyzer: boolean().default(true),
10884
+ /**
10885
+ * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
10886
+ * never arms the periodic recheck timer, regardless of `occupancyRecheckSec` —
10887
+ * this is off by default because the recheck re-subscribes a detection session
10888
+ * every N seconds while `watching`, a major source of pull-decoder re-dial
10889
+ * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
10890
+ * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
10891
+ * (and only render) when this is enabled.
10892
+ */
10893
+ occupancyRecheckEnabled: boolean().default(false),
10674
10894
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
10675
10895
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
10676
10896
  /**
@@ -12967,7 +13187,9 @@ method(object({ codec: string() }), boolean()), method(_void(), object({
12967
13187
  id: string(),
12968
13188
  name: string(),
12969
13189
  isPullMode: boolean().optional(),
12970
- priority: number().optional()
13190
+ priority: number().optional(),
13191
+ hwaccel: string().optional(),
13192
+ probedBestHwaccel: string().optional()
12971
13193
  })), method(DecoderSessionConfigSchema, object({
12972
13194
  sessionId: string(),
12973
13195
  nodeId: string()
@@ -18982,6 +19204,18 @@ Object.freeze({
18982
19204
  addonId: null,
18983
19205
  access: "view"
18984
19206
  },
19207
+ "dayNight.getOptions": {
19208
+ capName: "day-night",
19209
+ capScope: "device",
19210
+ addonId: null,
19211
+ access: "view"
19212
+ },
19213
+ "dayNight.setSettings": {
19214
+ capName: "day-night",
19215
+ capScope: "device",
19216
+ addonId: null,
19217
+ access: "create"
19218
+ },
18985
19219
  "decoder.createSession": {
18986
19220
  capName: "decoder",
18987
19221
  capScope: "system",
@@ -19912,6 +20146,18 @@ Object.freeze({
19912
20146
  addonId: null,
19913
20147
  access: "create"
19914
20148
  },
20149
+ "imageSettings.getOptions": {
20150
+ capName: "image-settings",
20151
+ capScope: "device",
20152
+ addonId: null,
20153
+ access: "view"
20154
+ },
20155
+ "imageSettings.setSettings": {
20156
+ capName: "image-settings",
20157
+ capScope: "device",
20158
+ addonId: null,
20159
+ access: "create"
20160
+ },
19915
20161
  "integrations.create": {
19916
20162
  capName: "integrations",
19917
20163
  capScope: "system",
@@ -4627,7 +4627,7 @@ function _instanceof(cls, params = {}) {
4627
4627
  return inst;
4628
4628
  }
4629
4629
  //#endregion
4630
- //#region ../types/dist/sleep-BiDFW0E7.mjs
4630
+ //#region ../types/dist/sleep-CZDdRBua.mjs
4631
4631
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4632
4632
  EventCategory["SystemBoot"] = "system.boot";
4633
4633
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -7222,7 +7222,16 @@ var DecoderStatsSchema = object({
7222
7222
  inputFps: number(),
7223
7223
  outputFps: number(),
7224
7224
  avgDecodeTimeMs: number(),
7225
- droppedFrames: number()
7225
+ droppedFrames: number(),
7226
+ /**
7227
+ * Pull-mode adaptive-fps telemetry (optional — only pull sessions run the
7228
+ * lag-driven controller; push sessions omit these). `lagMs` is the EWMA of
7229
+ * the decoder's real-time drift (rising = falling behind live); `adaptiveFps`
7230
+ * is the current lag-throttled emit rate (≤ `effectiveFps` ceiling).
7231
+ */
7232
+ lagMs: number().optional(),
7233
+ effectiveFps: number().optional(),
7234
+ adaptiveFps: number().optional()
7226
7235
  });
7227
7236
  var DecoderSessionConfigSchema = object({
7228
7237
  codec: string(),
@@ -7263,7 +7272,15 @@ var DecoderSessionConfigSchema = object({
7263
7272
  * other — `pullFrames` returns nothing for an `'shm'` session and
7264
7273
  * `pullHandles` returns nothing for a `'callback'` session.
7265
7274
  */
7266
- frameSink: _enum(["callback", "shm"]).default("callback")
7275
+ frameSink: _enum(["callback", "shm"]).default("callback"),
7276
+ /**
7277
+ * Per-camera decoder DEBUG facility. When `true`, a pull-mode session emits
7278
+ * a throttled (~1Hz) structured `decoder debug` line (effective/adaptive fps,
7279
+ * real-time lag, dropped-frame delta, avg decode time, hwaccel). Mirrors the
7280
+ * stream-broker's `streamingDebug` gate — off by default so production logs
7281
+ * stay quiet and the emit path pays zero per-frame cost when disabled.
7282
+ */
7283
+ debug: boolean().optional()
7267
7284
  });
7268
7285
  var EncodeProfileSchema = object({
7269
7286
  video: object({
@@ -9421,6 +9438,75 @@ DeviceType.Cover, method(object({ deviceId: number().int().nonnegative() }), _vo
9421
9438
  auth: "admin"
9422
9439
  });
9423
9440
  /**
9441
+ * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
9442
+ * shared by reolink / hikvision / amcrest. Models the common firmware
9443
+ * surface: the IR-cut switching MODE plus the two knobs that gate it
9444
+ * (photocell `sensitivity` + `switchDelaySec`). Each vendor maps these
9445
+ * onto its own ISAPI / Baichuan / Dahua-CGI fields; the cap standardises
9446
+ * the shape so ONE derived-form renders every camera.
9447
+ *
9448
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9449
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9450
+ * injected from `status`) reports the live values, and a single
9451
+ * `setSettings` mutation applies a partial change. No hand-written
9452
+ * settings-contribution methods — the framework derives the UI + save
9453
+ * routing from this surface.
9454
+ */
9455
+ /** IR-cut switching mode. `schedule` = time-of-day table configured on the camera. */
9456
+ var DayNightModeSchema = _enum([
9457
+ "auto",
9458
+ "day",
9459
+ "night",
9460
+ "schedule"
9461
+ ]);
9462
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9463
+ * getOptions availability convention. Normalized values are 0–100. */
9464
+ var NormalizedRangeSchema$1 = object({
9465
+ min: number(),
9466
+ max: number(),
9467
+ step: number()
9468
+ });
9469
+ object({
9470
+ mode: DayNightModeSchema,
9471
+ /** IR-cut trigger sensitivity, NORMALIZED 0–100 (higher = switches to night sooner). */
9472
+ sensitivity: number().optional(),
9473
+ /** Delay before the IR-cut filter flips, in seconds. */
9474
+ switchDelaySec: number().optional(),
9475
+ lastFetchedAt: number()
9476
+ });
9477
+ /**
9478
+ * Per-camera availability descriptor — drives which controls the admin UI
9479
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9480
+ * (normalized 0–100); the mode choice-set as an array. A provider returns
9481
+ * honest, camera-probed values — never hardcoded.
9482
+ */
9483
+ var DayNightOptionsSchema = object({
9484
+ /** Modes this camera accepts. Empty → the camera has no configurable day/night mode. */
9485
+ modes: array(DayNightModeSchema),
9486
+ supportsSensitivity: boolean(),
9487
+ /** Present when `supportsSensitivity` — the normalized 0–100 range. */
9488
+ sensitivity: NormalizedRangeSchema$1.optional(),
9489
+ supportsSwitchDelay: boolean(),
9490
+ /** Present when `supportsSwitchDelay` — the allowed delay range in seconds. */
9491
+ switchDelaySec: NormalizedRangeSchema$1.optional()
9492
+ });
9493
+ /**
9494
+ * Partial change to the day/night config — every field optional. A
9495
+ * provider ignores fields it does not support.
9496
+ */
9497
+ var DayNightSettingsPatchSchema = object({
9498
+ mode: DayNightModeSchema.optional(),
9499
+ sensitivity: number().optional(),
9500
+ switchDelaySec: number().optional()
9501
+ });
9502
+ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema), method(object({
9503
+ deviceId: number(),
9504
+ settings: DayNightSettingsPatchSchema
9505
+ }), _void(), {
9506
+ kind: "mutation",
9507
+ auth: "admin"
9508
+ });
9509
+ /**
9424
9510
  * Identity envelope for a device's upstream-system metadata.
9425
9511
  *
9426
9512
  * Two jobs:
@@ -9776,6 +9862,130 @@ object({
9776
9862
  });
9777
9863
  DeviceType.Image;
9778
9864
  /**
9865
+ * Vendor-neutral image / picture-adjustment cap — the per-camera config
9866
+ * cap shared by reolink / hikvision / amcrest. Models the common ISP
9867
+ * surface: the four picture sliders (brightness / contrast / saturation /
9868
+ * sharpness), orientation (mirror / flip / rotate), white-balance,
9869
+ * exposure and backlight-compensation modes.
9870
+ *
9871
+ * NORMALIZATION: every slider is a normalized int 0–100. Vendors expose
9872
+ * these natively as 0–100 or 0–255 (or other ranges); each provider maps
9873
+ * its native range to/from this normalized 0–100 space so the cap surface
9874
+ * (and the derived form) is identical across cameras. `warmth` (manual
9875
+ * white-balance) is likewise normalized 0–100.
9876
+ *
9877
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9878
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9879
+ * injected from `status`) reports the live values, and a single
9880
+ * `setSettings` mutation applies a partial change. No hand-written
9881
+ * settings-contribution methods — the framework derives the UI + save
9882
+ * routing from this surface.
9883
+ */
9884
+ /** Sensor/image rotation, degrees clockwise. */
9885
+ var ImageRotateSchema = _enum([
9886
+ "0",
9887
+ "90",
9888
+ "180",
9889
+ "270"
9890
+ ]);
9891
+ /** White-balance mode. `manual` unlocks the normalized `warmth` knob. */
9892
+ var WhiteBalanceModeSchema = _enum(["auto", "manual"]);
9893
+ /** Exposure mode. */
9894
+ var ExposureModeSchema = _enum(["auto", "manual"]);
9895
+ /**
9896
+ * Backlight-compensation mode:
9897
+ * - `off` — disabled
9898
+ * - `blc` — backlight compensation
9899
+ * - `wdr` — wide dynamic range
9900
+ * - `hlc` — highlight compensation
9901
+ */
9902
+ var BacklightModeSchema = _enum([
9903
+ "off",
9904
+ "blc",
9905
+ "wdr",
9906
+ "hlc"
9907
+ ]);
9908
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9909
+ * getOptions availability convention. Slider values are normalized 0–100. */
9910
+ var NormalizedRangeSchema = object({
9911
+ min: number(),
9912
+ max: number(),
9913
+ step: number()
9914
+ });
9915
+ object({
9916
+ /** Normalized 0–100. */
9917
+ brightness: number().optional(),
9918
+ /** Normalized 0–100. */
9919
+ contrast: number().optional(),
9920
+ /** Normalized 0–100. */
9921
+ saturation: number().optional(),
9922
+ /** Normalized 0–100. */
9923
+ sharpness: number().optional(),
9924
+ mirror: boolean().optional(),
9925
+ flip: boolean().optional(),
9926
+ rotate: ImageRotateSchema.optional(),
9927
+ whiteBalance: WhiteBalanceModeSchema.optional(),
9928
+ /** Manual white-balance warmth, NORMALIZED 0–100. Meaningful only when `whiteBalance === 'manual'`. */
9929
+ warmth: number().optional(),
9930
+ exposureMode: ExposureModeSchema.optional(),
9931
+ backlightMode: BacklightModeSchema.optional(),
9932
+ lastFetchedAt: number()
9933
+ });
9934
+ /**
9935
+ * Per-camera availability descriptor — drives which controls the admin UI
9936
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9937
+ * (the normalized 0–100 range); enums as arrays of supported values (empty
9938
+ * array → control hidden). A provider returns honest, camera-probed values
9939
+ * — never hardcoded.
9940
+ */
9941
+ var ImageSettingsOptionsSchema = object({
9942
+ supportsBrightness: boolean(),
9943
+ brightness: NormalizedRangeSchema.optional(),
9944
+ supportsContrast: boolean(),
9945
+ contrast: NormalizedRangeSchema.optional(),
9946
+ supportsSaturation: boolean(),
9947
+ saturation: NormalizedRangeSchema.optional(),
9948
+ supportsSharpness: boolean(),
9949
+ sharpness: NormalizedRangeSchema.optional(),
9950
+ supportsMirror: boolean(),
9951
+ supportsFlip: boolean(),
9952
+ /** Supported rotation values. Empty → rotation not configurable. */
9953
+ rotateOptions: array(ImageRotateSchema),
9954
+ /** Supported white-balance modes. Empty → white-balance not configurable. */
9955
+ whiteBalanceModes: array(WhiteBalanceModeSchema),
9956
+ supportsWarmth: boolean(),
9957
+ /** Present when `supportsWarmth` — the normalized 0–100 range. */
9958
+ warmth: NormalizedRangeSchema.optional(),
9959
+ /** Supported exposure modes. Empty → exposure not configurable. */
9960
+ exposureModes: array(ExposureModeSchema),
9961
+ /** Supported backlight modes. Empty → backlight-compensation not configurable. */
9962
+ backlightModes: array(BacklightModeSchema)
9963
+ });
9964
+ /**
9965
+ * Partial change to the image config — every field optional. Slider values
9966
+ * are normalized 0–100. A provider ignores fields it does not support.
9967
+ */
9968
+ var ImageSettingsPatchSchema = object({
9969
+ brightness: number().optional(),
9970
+ contrast: number().optional(),
9971
+ saturation: number().optional(),
9972
+ sharpness: number().optional(),
9973
+ mirror: boolean().optional(),
9974
+ flip: boolean().optional(),
9975
+ rotate: ImageRotateSchema.optional(),
9976
+ whiteBalance: WhiteBalanceModeSchema.optional(),
9977
+ warmth: number().optional(),
9978
+ exposureMode: ExposureModeSchema.optional(),
9979
+ backlightMode: BacklightModeSchema.optional()
9980
+ });
9981
+ DeviceType.Camera, method(object({ deviceId: number() }), ImageSettingsOptionsSchema), method(object({
9982
+ deviceId: number(),
9983
+ settings: ImageSettingsPatchSchema
9984
+ }), _void(), {
9985
+ kind: "mutation",
9986
+ auth: "admin"
9987
+ });
9988
+ /**
9779
9989
  * Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
9780
9990
  * with a mowing lifecycle plus a dock action.
9781
9991
  *
@@ -10670,6 +10880,16 @@ var RunnerCameraConfigSchema = object({
10670
10880
  * this gate is bypassed.
10671
10881
  */
10672
10882
  onboardMotionDrivesAnalyzer: boolean().default(true),
10883
+ /**
10884
+ * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
10885
+ * never arms the periodic recheck timer, regardless of `occupancyRecheckSec` —
10886
+ * this is off by default because the recheck re-subscribes a detection session
10887
+ * every N seconds while `watching`, a major source of pull-decoder re-dial
10888
+ * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
10889
+ * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
10890
+ * (and only render) when this is enabled.
10891
+ */
10892
+ occupancyRecheckEnabled: boolean().default(false),
10673
10893
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
10674
10894
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
10675
10895
  /**
@@ -12966,7 +13186,9 @@ method(object({ codec: string() }), boolean()), method(_void(), object({
12966
13186
  id: string(),
12967
13187
  name: string(),
12968
13188
  isPullMode: boolean().optional(),
12969
- priority: number().optional()
13189
+ priority: number().optional(),
13190
+ hwaccel: string().optional(),
13191
+ probedBestHwaccel: string().optional()
12970
13192
  })), method(DecoderSessionConfigSchema, object({
12971
13193
  sessionId: string(),
12972
13194
  nodeId: string()
@@ -18981,6 +19203,18 @@ Object.freeze({
18981
19203
  addonId: null,
18982
19204
  access: "view"
18983
19205
  },
19206
+ "dayNight.getOptions": {
19207
+ capName: "day-night",
19208
+ capScope: "device",
19209
+ addonId: null,
19210
+ access: "view"
19211
+ },
19212
+ "dayNight.setSettings": {
19213
+ capName: "day-night",
19214
+ capScope: "device",
19215
+ addonId: null,
19216
+ access: "create"
19217
+ },
18984
19218
  "decoder.createSession": {
18985
19219
  capName: "decoder",
18986
19220
  capScope: "system",
@@ -19911,6 +20145,18 @@ Object.freeze({
19911
20145
  addonId: null,
19912
20146
  access: "create"
19913
20147
  },
20148
+ "imageSettings.getOptions": {
20149
+ capName: "image-settings",
20150
+ capScope: "device",
20151
+ addonId: null,
20152
+ access: "view"
20153
+ },
20154
+ "imageSettings.setSettings": {
20155
+ capName: "image-settings",
20156
+ capScope: "device",
20157
+ addonId: null,
20158
+ access: "create"
20159
+ },
19914
20160
  "integrations.create": {
19915
20161
  capName: "integrations",
19916
20162
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-static-turn",
3
- "version": "1.1.17",
3
+ "version": "1.1.19",
4
4
  "description": "Static / self-hosted (coturn) TURN provider for CamStack",
5
5
  "keywords": [
6
6
  "camstack",