@camstack/addon-smtp-nodemailer 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.
@@ -4665,7 +4665,7 @@ function _instanceof(cls, params = {}) {
4665
4665
  return inst;
4666
4666
  }
4667
4667
  //#endregion
4668
- //#region ../types/dist/sleep-BiDFW0E7.mjs
4668
+ //#region ../types/dist/sleep-CZDdRBua.mjs
4669
4669
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4670
4670
  EventCategory["SystemBoot"] = "system.boot";
4671
4671
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -7260,7 +7260,16 @@ var DecoderStatsSchema = object({
7260
7260
  inputFps: number(),
7261
7261
  outputFps: number(),
7262
7262
  avgDecodeTimeMs: number(),
7263
- droppedFrames: number()
7263
+ droppedFrames: number(),
7264
+ /**
7265
+ * Pull-mode adaptive-fps telemetry (optional — only pull sessions run the
7266
+ * lag-driven controller; push sessions omit these). `lagMs` is the EWMA of
7267
+ * the decoder's real-time drift (rising = falling behind live); `adaptiveFps`
7268
+ * is the current lag-throttled emit rate (≤ `effectiveFps` ceiling).
7269
+ */
7270
+ lagMs: number().optional(),
7271
+ effectiveFps: number().optional(),
7272
+ adaptiveFps: number().optional()
7264
7273
  });
7265
7274
  var DecoderSessionConfigSchema = object({
7266
7275
  codec: string(),
@@ -7301,7 +7310,15 @@ var DecoderSessionConfigSchema = object({
7301
7310
  * other — `pullFrames` returns nothing for an `'shm'` session and
7302
7311
  * `pullHandles` returns nothing for a `'callback'` session.
7303
7312
  */
7304
- frameSink: _enum(["callback", "shm"]).default("callback")
7313
+ frameSink: _enum(["callback", "shm"]).default("callback"),
7314
+ /**
7315
+ * Per-camera decoder DEBUG facility. When `true`, a pull-mode session emits
7316
+ * a throttled (~1Hz) structured `decoder debug` line (effective/adaptive fps,
7317
+ * real-time lag, dropped-frame delta, avg decode time, hwaccel). Mirrors the
7318
+ * stream-broker's `streamingDebug` gate — off by default so production logs
7319
+ * stay quiet and the emit path pays zero per-frame cost when disabled.
7320
+ */
7321
+ debug: boolean().optional()
7305
7322
  });
7306
7323
  var EncodeProfileSchema = object({
7307
7324
  video: object({
@@ -9459,6 +9476,75 @@ DeviceType.Cover, method(object({ deviceId: number().int().nonnegative() }), _vo
9459
9476
  auth: "admin"
9460
9477
  });
9461
9478
  /**
9479
+ * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
9480
+ * shared by reolink / hikvision / amcrest. Models the common firmware
9481
+ * surface: the IR-cut switching MODE plus the two knobs that gate it
9482
+ * (photocell `sensitivity` + `switchDelaySec`). Each vendor maps these
9483
+ * onto its own ISAPI / Baichuan / Dahua-CGI fields; the cap standardises
9484
+ * the shape so ONE derived-form renders every camera.
9485
+ *
9486
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9487
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9488
+ * injected from `status`) reports the live values, and a single
9489
+ * `setSettings` mutation applies a partial change. No hand-written
9490
+ * settings-contribution methods — the framework derives the UI + save
9491
+ * routing from this surface.
9492
+ */
9493
+ /** IR-cut switching mode. `schedule` = time-of-day table configured on the camera. */
9494
+ var DayNightModeSchema = _enum([
9495
+ "auto",
9496
+ "day",
9497
+ "night",
9498
+ "schedule"
9499
+ ]);
9500
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9501
+ * getOptions availability convention. Normalized values are 0–100. */
9502
+ var NormalizedRangeSchema$1 = object({
9503
+ min: number(),
9504
+ max: number(),
9505
+ step: number()
9506
+ });
9507
+ object({
9508
+ mode: DayNightModeSchema,
9509
+ /** IR-cut trigger sensitivity, NORMALIZED 0–100 (higher = switches to night sooner). */
9510
+ sensitivity: number().optional(),
9511
+ /** Delay before the IR-cut filter flips, in seconds. */
9512
+ switchDelaySec: number().optional(),
9513
+ lastFetchedAt: number()
9514
+ });
9515
+ /**
9516
+ * Per-camera availability descriptor — drives which controls the admin UI
9517
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9518
+ * (normalized 0–100); the mode choice-set as an array. A provider returns
9519
+ * honest, camera-probed values — never hardcoded.
9520
+ */
9521
+ var DayNightOptionsSchema = object({
9522
+ /** Modes this camera accepts. Empty → the camera has no configurable day/night mode. */
9523
+ modes: array(DayNightModeSchema),
9524
+ supportsSensitivity: boolean(),
9525
+ /** Present when `supportsSensitivity` — the normalized 0–100 range. */
9526
+ sensitivity: NormalizedRangeSchema$1.optional(),
9527
+ supportsSwitchDelay: boolean(),
9528
+ /** Present when `supportsSwitchDelay` — the allowed delay range in seconds. */
9529
+ switchDelaySec: NormalizedRangeSchema$1.optional()
9530
+ });
9531
+ /**
9532
+ * Partial change to the day/night config — every field optional. A
9533
+ * provider ignores fields it does not support.
9534
+ */
9535
+ var DayNightSettingsPatchSchema = object({
9536
+ mode: DayNightModeSchema.optional(),
9537
+ sensitivity: number().optional(),
9538
+ switchDelaySec: number().optional()
9539
+ });
9540
+ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema), method(object({
9541
+ deviceId: number(),
9542
+ settings: DayNightSettingsPatchSchema
9543
+ }), _void(), {
9544
+ kind: "mutation",
9545
+ auth: "admin"
9546
+ });
9547
+ /**
9462
9548
  * Identity envelope for a device's upstream-system metadata.
9463
9549
  *
9464
9550
  * Two jobs:
@@ -9814,6 +9900,130 @@ object({
9814
9900
  });
9815
9901
  DeviceType.Image;
9816
9902
  /**
9903
+ * Vendor-neutral image / picture-adjustment cap — the per-camera config
9904
+ * cap shared by reolink / hikvision / amcrest. Models the common ISP
9905
+ * surface: the four picture sliders (brightness / contrast / saturation /
9906
+ * sharpness), orientation (mirror / flip / rotate), white-balance,
9907
+ * exposure and backlight-compensation modes.
9908
+ *
9909
+ * NORMALIZATION: every slider is a normalized int 0–100. Vendors expose
9910
+ * these natively as 0–100 or 0–255 (or other ranges); each provider maps
9911
+ * its native range to/from this normalized 0–100 space so the cap surface
9912
+ * (and the derived form) is identical across cameras. `warmth` (manual
9913
+ * white-balance) is likewise normalized 0–100.
9914
+ *
9915
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9916
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9917
+ * injected from `status`) reports the live values, and a single
9918
+ * `setSettings` mutation applies a partial change. No hand-written
9919
+ * settings-contribution methods — the framework derives the UI + save
9920
+ * routing from this surface.
9921
+ */
9922
+ /** Sensor/image rotation, degrees clockwise. */
9923
+ var ImageRotateSchema = _enum([
9924
+ "0",
9925
+ "90",
9926
+ "180",
9927
+ "270"
9928
+ ]);
9929
+ /** White-balance mode. `manual` unlocks the normalized `warmth` knob. */
9930
+ var WhiteBalanceModeSchema = _enum(["auto", "manual"]);
9931
+ /** Exposure mode. */
9932
+ var ExposureModeSchema = _enum(["auto", "manual"]);
9933
+ /**
9934
+ * Backlight-compensation mode:
9935
+ * - `off` — disabled
9936
+ * - `blc` — backlight compensation
9937
+ * - `wdr` — wide dynamic range
9938
+ * - `hlc` — highlight compensation
9939
+ */
9940
+ var BacklightModeSchema = _enum([
9941
+ "off",
9942
+ "blc",
9943
+ "wdr",
9944
+ "hlc"
9945
+ ]);
9946
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9947
+ * getOptions availability convention. Slider values are normalized 0–100. */
9948
+ var NormalizedRangeSchema = object({
9949
+ min: number(),
9950
+ max: number(),
9951
+ step: number()
9952
+ });
9953
+ object({
9954
+ /** Normalized 0–100. */
9955
+ brightness: number().optional(),
9956
+ /** Normalized 0–100. */
9957
+ contrast: number().optional(),
9958
+ /** Normalized 0–100. */
9959
+ saturation: number().optional(),
9960
+ /** Normalized 0–100. */
9961
+ sharpness: number().optional(),
9962
+ mirror: boolean().optional(),
9963
+ flip: boolean().optional(),
9964
+ rotate: ImageRotateSchema.optional(),
9965
+ whiteBalance: WhiteBalanceModeSchema.optional(),
9966
+ /** Manual white-balance warmth, NORMALIZED 0–100. Meaningful only when `whiteBalance === 'manual'`. */
9967
+ warmth: number().optional(),
9968
+ exposureMode: ExposureModeSchema.optional(),
9969
+ backlightMode: BacklightModeSchema.optional(),
9970
+ lastFetchedAt: number()
9971
+ });
9972
+ /**
9973
+ * Per-camera availability descriptor — drives which controls the admin UI
9974
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9975
+ * (the normalized 0–100 range); enums as arrays of supported values (empty
9976
+ * array → control hidden). A provider returns honest, camera-probed values
9977
+ * — never hardcoded.
9978
+ */
9979
+ var ImageSettingsOptionsSchema = object({
9980
+ supportsBrightness: boolean(),
9981
+ brightness: NormalizedRangeSchema.optional(),
9982
+ supportsContrast: boolean(),
9983
+ contrast: NormalizedRangeSchema.optional(),
9984
+ supportsSaturation: boolean(),
9985
+ saturation: NormalizedRangeSchema.optional(),
9986
+ supportsSharpness: boolean(),
9987
+ sharpness: NormalizedRangeSchema.optional(),
9988
+ supportsMirror: boolean(),
9989
+ supportsFlip: boolean(),
9990
+ /** Supported rotation values. Empty → rotation not configurable. */
9991
+ rotateOptions: array(ImageRotateSchema),
9992
+ /** Supported white-balance modes. Empty → white-balance not configurable. */
9993
+ whiteBalanceModes: array(WhiteBalanceModeSchema),
9994
+ supportsWarmth: boolean(),
9995
+ /** Present when `supportsWarmth` — the normalized 0–100 range. */
9996
+ warmth: NormalizedRangeSchema.optional(),
9997
+ /** Supported exposure modes. Empty → exposure not configurable. */
9998
+ exposureModes: array(ExposureModeSchema),
9999
+ /** Supported backlight modes. Empty → backlight-compensation not configurable. */
10000
+ backlightModes: array(BacklightModeSchema)
10001
+ });
10002
+ /**
10003
+ * Partial change to the image config — every field optional. Slider values
10004
+ * are normalized 0–100. A provider ignores fields it does not support.
10005
+ */
10006
+ var ImageSettingsPatchSchema = object({
10007
+ brightness: number().optional(),
10008
+ contrast: number().optional(),
10009
+ saturation: number().optional(),
10010
+ sharpness: number().optional(),
10011
+ mirror: boolean().optional(),
10012
+ flip: boolean().optional(),
10013
+ rotate: ImageRotateSchema.optional(),
10014
+ whiteBalance: WhiteBalanceModeSchema.optional(),
10015
+ warmth: number().optional(),
10016
+ exposureMode: ExposureModeSchema.optional(),
10017
+ backlightMode: BacklightModeSchema.optional()
10018
+ });
10019
+ DeviceType.Camera, method(object({ deviceId: number() }), ImageSettingsOptionsSchema), method(object({
10020
+ deviceId: number(),
10021
+ settings: ImageSettingsPatchSchema
10022
+ }), _void(), {
10023
+ kind: "mutation",
10024
+ auth: "admin"
10025
+ });
10026
+ /**
9817
10027
  * Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
9818
10028
  * with a mowing lifecycle plus a dock action.
9819
10029
  *
@@ -10708,6 +10918,16 @@ var RunnerCameraConfigSchema = object({
10708
10918
  * this gate is bypassed.
10709
10919
  */
10710
10920
  onboardMotionDrivesAnalyzer: boolean().default(true),
10921
+ /**
10922
+ * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
10923
+ * never arms the periodic recheck timer, regardless of `occupancyRecheckSec` —
10924
+ * this is off by default because the recheck re-subscribes a detection session
10925
+ * every N seconds while `watching`, a major source of pull-decoder re-dial
10926
+ * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
10927
+ * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
10928
+ * (and only render) when this is enabled.
10929
+ */
10930
+ occupancyRecheckEnabled: boolean().default(false),
10711
10931
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
10712
10932
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
10713
10933
  /**
@@ -13004,7 +13224,9 @@ method(object({ codec: string() }), boolean()), method(_void(), object({
13004
13224
  id: string(),
13005
13225
  name: string(),
13006
13226
  isPullMode: boolean().optional(),
13007
- priority: number().optional()
13227
+ priority: number().optional(),
13228
+ hwaccel: string().optional(),
13229
+ probedBestHwaccel: string().optional()
13008
13230
  })), method(DecoderSessionConfigSchema, object({
13009
13231
  sessionId: string(),
13010
13232
  nodeId: string()
@@ -19009,6 +19231,18 @@ Object.freeze({
19009
19231
  addonId: null,
19010
19232
  access: "view"
19011
19233
  },
19234
+ "dayNight.getOptions": {
19235
+ capName: "day-night",
19236
+ capScope: "device",
19237
+ addonId: null,
19238
+ access: "view"
19239
+ },
19240
+ "dayNight.setSettings": {
19241
+ capName: "day-night",
19242
+ capScope: "device",
19243
+ addonId: null,
19244
+ access: "create"
19245
+ },
19012
19246
  "decoder.createSession": {
19013
19247
  capName: "decoder",
19014
19248
  capScope: "system",
@@ -19939,6 +20173,18 @@ Object.freeze({
19939
20173
  addonId: null,
19940
20174
  access: "create"
19941
20175
  },
20176
+ "imageSettings.getOptions": {
20177
+ capName: "image-settings",
20178
+ capScope: "device",
20179
+ addonId: null,
20180
+ access: "view"
20181
+ },
20182
+ "imageSettings.setSettings": {
20183
+ capName: "image-settings",
20184
+ capScope: "device",
20185
+ addonId: null,
20186
+ access: "create"
20187
+ },
19942
20188
  "integrations.create": {
19943
20189
  capName: "integrations",
19944
20190
  capScope: "system",
@@ -4663,7 +4663,7 @@ function _instanceof(cls, params = {}) {
4663
4663
  return inst;
4664
4664
  }
4665
4665
  //#endregion
4666
- //#region ../types/dist/sleep-BiDFW0E7.mjs
4666
+ //#region ../types/dist/sleep-CZDdRBua.mjs
4667
4667
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4668
4668
  EventCategory["SystemBoot"] = "system.boot";
4669
4669
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -7258,7 +7258,16 @@ var DecoderStatsSchema = object({
7258
7258
  inputFps: number(),
7259
7259
  outputFps: number(),
7260
7260
  avgDecodeTimeMs: number(),
7261
- droppedFrames: number()
7261
+ droppedFrames: number(),
7262
+ /**
7263
+ * Pull-mode adaptive-fps telemetry (optional — only pull sessions run the
7264
+ * lag-driven controller; push sessions omit these). `lagMs` is the EWMA of
7265
+ * the decoder's real-time drift (rising = falling behind live); `adaptiveFps`
7266
+ * is the current lag-throttled emit rate (≤ `effectiveFps` ceiling).
7267
+ */
7268
+ lagMs: number().optional(),
7269
+ effectiveFps: number().optional(),
7270
+ adaptiveFps: number().optional()
7262
7271
  });
7263
7272
  var DecoderSessionConfigSchema = object({
7264
7273
  codec: string(),
@@ -7299,7 +7308,15 @@ var DecoderSessionConfigSchema = object({
7299
7308
  * other — `pullFrames` returns nothing for an `'shm'` session and
7300
7309
  * `pullHandles` returns nothing for a `'callback'` session.
7301
7310
  */
7302
- frameSink: _enum(["callback", "shm"]).default("callback")
7311
+ frameSink: _enum(["callback", "shm"]).default("callback"),
7312
+ /**
7313
+ * Per-camera decoder DEBUG facility. When `true`, a pull-mode session emits
7314
+ * a throttled (~1Hz) structured `decoder debug` line (effective/adaptive fps,
7315
+ * real-time lag, dropped-frame delta, avg decode time, hwaccel). Mirrors the
7316
+ * stream-broker's `streamingDebug` gate — off by default so production logs
7317
+ * stay quiet and the emit path pays zero per-frame cost when disabled.
7318
+ */
7319
+ debug: boolean().optional()
7303
7320
  });
7304
7321
  var EncodeProfileSchema = object({
7305
7322
  video: object({
@@ -9457,6 +9474,75 @@ DeviceType.Cover, method(object({ deviceId: number().int().nonnegative() }), _vo
9457
9474
  auth: "admin"
9458
9475
  });
9459
9476
  /**
9477
+ * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
9478
+ * shared by reolink / hikvision / amcrest. Models the common firmware
9479
+ * surface: the IR-cut switching MODE plus the two knobs that gate it
9480
+ * (photocell `sensitivity` + `switchDelaySec`). Each vendor maps these
9481
+ * onto its own ISAPI / Baichuan / Dahua-CGI fields; the cap standardises
9482
+ * the shape so ONE derived-form renders every camera.
9483
+ *
9484
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9485
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9486
+ * injected from `status`) reports the live values, and a single
9487
+ * `setSettings` mutation applies a partial change. No hand-written
9488
+ * settings-contribution methods — the framework derives the UI + save
9489
+ * routing from this surface.
9490
+ */
9491
+ /** IR-cut switching mode. `schedule` = time-of-day table configured on the camera. */
9492
+ var DayNightModeSchema = _enum([
9493
+ "auto",
9494
+ "day",
9495
+ "night",
9496
+ "schedule"
9497
+ ]);
9498
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9499
+ * getOptions availability convention. Normalized values are 0–100. */
9500
+ var NormalizedRangeSchema$1 = object({
9501
+ min: number(),
9502
+ max: number(),
9503
+ step: number()
9504
+ });
9505
+ object({
9506
+ mode: DayNightModeSchema,
9507
+ /** IR-cut trigger sensitivity, NORMALIZED 0–100 (higher = switches to night sooner). */
9508
+ sensitivity: number().optional(),
9509
+ /** Delay before the IR-cut filter flips, in seconds. */
9510
+ switchDelaySec: number().optional(),
9511
+ lastFetchedAt: number()
9512
+ });
9513
+ /**
9514
+ * Per-camera availability descriptor — drives which controls the admin UI
9515
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9516
+ * (normalized 0–100); the mode choice-set as an array. A provider returns
9517
+ * honest, camera-probed values — never hardcoded.
9518
+ */
9519
+ var DayNightOptionsSchema = object({
9520
+ /** Modes this camera accepts. Empty → the camera has no configurable day/night mode. */
9521
+ modes: array(DayNightModeSchema),
9522
+ supportsSensitivity: boolean(),
9523
+ /** Present when `supportsSensitivity` — the normalized 0–100 range. */
9524
+ sensitivity: NormalizedRangeSchema$1.optional(),
9525
+ supportsSwitchDelay: boolean(),
9526
+ /** Present when `supportsSwitchDelay` — the allowed delay range in seconds. */
9527
+ switchDelaySec: NormalizedRangeSchema$1.optional()
9528
+ });
9529
+ /**
9530
+ * Partial change to the day/night config — every field optional. A
9531
+ * provider ignores fields it does not support.
9532
+ */
9533
+ var DayNightSettingsPatchSchema = object({
9534
+ mode: DayNightModeSchema.optional(),
9535
+ sensitivity: number().optional(),
9536
+ switchDelaySec: number().optional()
9537
+ });
9538
+ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema), method(object({
9539
+ deviceId: number(),
9540
+ settings: DayNightSettingsPatchSchema
9541
+ }), _void(), {
9542
+ kind: "mutation",
9543
+ auth: "admin"
9544
+ });
9545
+ /**
9460
9546
  * Identity envelope for a device's upstream-system metadata.
9461
9547
  *
9462
9548
  * Two jobs:
@@ -9812,6 +9898,130 @@ object({
9812
9898
  });
9813
9899
  DeviceType.Image;
9814
9900
  /**
9901
+ * Vendor-neutral image / picture-adjustment cap — the per-camera config
9902
+ * cap shared by reolink / hikvision / amcrest. Models the common ISP
9903
+ * surface: the four picture sliders (brightness / contrast / saturation /
9904
+ * sharpness), orientation (mirror / flip / rotate), white-balance,
9905
+ * exposure and backlight-compensation modes.
9906
+ *
9907
+ * NORMALIZATION: every slider is a normalized int 0–100. Vendors expose
9908
+ * these natively as 0–100 or 0–255 (or other ranges); each provider maps
9909
+ * its native range to/from this normalized 0–100 space so the cap surface
9910
+ * (and the derived form) is identical across cameras. `warmth` (manual
9911
+ * white-balance) is likewise normalized 0–100.
9912
+ *
9913
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9914
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9915
+ * injected from `status`) reports the live values, and a single
9916
+ * `setSettings` mutation applies a partial change. No hand-written
9917
+ * settings-contribution methods — the framework derives the UI + save
9918
+ * routing from this surface.
9919
+ */
9920
+ /** Sensor/image rotation, degrees clockwise. */
9921
+ var ImageRotateSchema = _enum([
9922
+ "0",
9923
+ "90",
9924
+ "180",
9925
+ "270"
9926
+ ]);
9927
+ /** White-balance mode. `manual` unlocks the normalized `warmth` knob. */
9928
+ var WhiteBalanceModeSchema = _enum(["auto", "manual"]);
9929
+ /** Exposure mode. */
9930
+ var ExposureModeSchema = _enum(["auto", "manual"]);
9931
+ /**
9932
+ * Backlight-compensation mode:
9933
+ * - `off` — disabled
9934
+ * - `blc` — backlight compensation
9935
+ * - `wdr` — wide dynamic range
9936
+ * - `hlc` — highlight compensation
9937
+ */
9938
+ var BacklightModeSchema = _enum([
9939
+ "off",
9940
+ "blc",
9941
+ "wdr",
9942
+ "hlc"
9943
+ ]);
9944
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9945
+ * getOptions availability convention. Slider values are normalized 0–100. */
9946
+ var NormalizedRangeSchema = object({
9947
+ min: number(),
9948
+ max: number(),
9949
+ step: number()
9950
+ });
9951
+ object({
9952
+ /** Normalized 0–100. */
9953
+ brightness: number().optional(),
9954
+ /** Normalized 0–100. */
9955
+ contrast: number().optional(),
9956
+ /** Normalized 0–100. */
9957
+ saturation: number().optional(),
9958
+ /** Normalized 0–100. */
9959
+ sharpness: number().optional(),
9960
+ mirror: boolean().optional(),
9961
+ flip: boolean().optional(),
9962
+ rotate: ImageRotateSchema.optional(),
9963
+ whiteBalance: WhiteBalanceModeSchema.optional(),
9964
+ /** Manual white-balance warmth, NORMALIZED 0–100. Meaningful only when `whiteBalance === 'manual'`. */
9965
+ warmth: number().optional(),
9966
+ exposureMode: ExposureModeSchema.optional(),
9967
+ backlightMode: BacklightModeSchema.optional(),
9968
+ lastFetchedAt: number()
9969
+ });
9970
+ /**
9971
+ * Per-camera availability descriptor — drives which controls the admin UI
9972
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9973
+ * (the normalized 0–100 range); enums as arrays of supported values (empty
9974
+ * array → control hidden). A provider returns honest, camera-probed values
9975
+ * — never hardcoded.
9976
+ */
9977
+ var ImageSettingsOptionsSchema = object({
9978
+ supportsBrightness: boolean(),
9979
+ brightness: NormalizedRangeSchema.optional(),
9980
+ supportsContrast: boolean(),
9981
+ contrast: NormalizedRangeSchema.optional(),
9982
+ supportsSaturation: boolean(),
9983
+ saturation: NormalizedRangeSchema.optional(),
9984
+ supportsSharpness: boolean(),
9985
+ sharpness: NormalizedRangeSchema.optional(),
9986
+ supportsMirror: boolean(),
9987
+ supportsFlip: boolean(),
9988
+ /** Supported rotation values. Empty → rotation not configurable. */
9989
+ rotateOptions: array(ImageRotateSchema),
9990
+ /** Supported white-balance modes. Empty → white-balance not configurable. */
9991
+ whiteBalanceModes: array(WhiteBalanceModeSchema),
9992
+ supportsWarmth: boolean(),
9993
+ /** Present when `supportsWarmth` — the normalized 0–100 range. */
9994
+ warmth: NormalizedRangeSchema.optional(),
9995
+ /** Supported exposure modes. Empty → exposure not configurable. */
9996
+ exposureModes: array(ExposureModeSchema),
9997
+ /** Supported backlight modes. Empty → backlight-compensation not configurable. */
9998
+ backlightModes: array(BacklightModeSchema)
9999
+ });
10000
+ /**
10001
+ * Partial change to the image config — every field optional. Slider values
10002
+ * are normalized 0–100. A provider ignores fields it does not support.
10003
+ */
10004
+ var ImageSettingsPatchSchema = object({
10005
+ brightness: number().optional(),
10006
+ contrast: number().optional(),
10007
+ saturation: number().optional(),
10008
+ sharpness: number().optional(),
10009
+ mirror: boolean().optional(),
10010
+ flip: boolean().optional(),
10011
+ rotate: ImageRotateSchema.optional(),
10012
+ whiteBalance: WhiteBalanceModeSchema.optional(),
10013
+ warmth: number().optional(),
10014
+ exposureMode: ExposureModeSchema.optional(),
10015
+ backlightMode: BacklightModeSchema.optional()
10016
+ });
10017
+ DeviceType.Camera, method(object({ deviceId: number() }), ImageSettingsOptionsSchema), method(object({
10018
+ deviceId: number(),
10019
+ settings: ImageSettingsPatchSchema
10020
+ }), _void(), {
10021
+ kind: "mutation",
10022
+ auth: "admin"
10023
+ });
10024
+ /**
9815
10025
  * Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
9816
10026
  * with a mowing lifecycle plus a dock action.
9817
10027
  *
@@ -10706,6 +10916,16 @@ var RunnerCameraConfigSchema = object({
10706
10916
  * this gate is bypassed.
10707
10917
  */
10708
10918
  onboardMotionDrivesAnalyzer: boolean().default(true),
10919
+ /**
10920
+ * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
10921
+ * never arms the periodic recheck timer, regardless of `occupancyRecheckSec` —
10922
+ * this is off by default because the recheck re-subscribes a detection session
10923
+ * every N seconds while `watching`, a major source of pull-decoder re-dial
10924
+ * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
10925
+ * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
10926
+ * (and only render) when this is enabled.
10927
+ */
10928
+ occupancyRecheckEnabled: boolean().default(false),
10709
10929
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
10710
10930
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
10711
10931
  /**
@@ -13002,7 +13222,9 @@ method(object({ codec: string() }), boolean()), method(_void(), object({
13002
13222
  id: string(),
13003
13223
  name: string(),
13004
13224
  isPullMode: boolean().optional(),
13005
- priority: number().optional()
13225
+ priority: number().optional(),
13226
+ hwaccel: string().optional(),
13227
+ probedBestHwaccel: string().optional()
13006
13228
  })), method(DecoderSessionConfigSchema, object({
13007
13229
  sessionId: string(),
13008
13230
  nodeId: string()
@@ -19007,6 +19229,18 @@ Object.freeze({
19007
19229
  addonId: null,
19008
19230
  access: "view"
19009
19231
  },
19232
+ "dayNight.getOptions": {
19233
+ capName: "day-night",
19234
+ capScope: "device",
19235
+ addonId: null,
19236
+ access: "view"
19237
+ },
19238
+ "dayNight.setSettings": {
19239
+ capName: "day-night",
19240
+ capScope: "device",
19241
+ addonId: null,
19242
+ access: "create"
19243
+ },
19010
19244
  "decoder.createSession": {
19011
19245
  capName: "decoder",
19012
19246
  capScope: "system",
@@ -19937,6 +20171,18 @@ Object.freeze({
19937
20171
  addonId: null,
19938
20172
  access: "create"
19939
20173
  },
20174
+ "imageSettings.getOptions": {
20175
+ capName: "image-settings",
20176
+ capScope: "device",
20177
+ addonId: null,
20178
+ access: "view"
20179
+ },
20180
+ "imageSettings.setSettings": {
20181
+ capName: "image-settings",
20182
+ capScope: "device",
20183
+ addonId: null,
20184
+ access: "create"
20185
+ },
19940
20186
  "integrations.create": {
19941
20187
  capName: "integrations",
19942
20188
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-smtp-nodemailer",
3
- "version": "1.1.16",
3
+ "version": "1.1.18",
4
4
  "description": "SMTP email provider addon for CamStack — wraps `nodemailer` and registers a `smtp-provider` cap collection entry. Used by magic-link login + notifier addons.",
5
5
  "keywords": [
6
6
  "camstack",