@camstack/addon-notifiers 1.1.18 → 1.1.20

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.
package/dist/addon.js CHANGED
@@ -4631,7 +4631,7 @@ function _instanceof(cls, params = {}) {
4631
4631
  return inst;
4632
4632
  }
4633
4633
  //#endregion
4634
- //#region ../types/dist/sleep-BiDFW0E7.mjs
4634
+ //#region ../types/dist/sleep-CZDdRBua.mjs
4635
4635
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4636
4636
  EventCategory["SystemBoot"] = "system.boot";
4637
4637
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -7226,7 +7226,16 @@ var DecoderStatsSchema = object({
7226
7226
  inputFps: number(),
7227
7227
  outputFps: number(),
7228
7228
  avgDecodeTimeMs: number(),
7229
- droppedFrames: number()
7229
+ droppedFrames: number(),
7230
+ /**
7231
+ * Pull-mode adaptive-fps telemetry (optional — only pull sessions run the
7232
+ * lag-driven controller; push sessions omit these). `lagMs` is the EWMA of
7233
+ * the decoder's real-time drift (rising = falling behind live); `adaptiveFps`
7234
+ * is the current lag-throttled emit rate (≤ `effectiveFps` ceiling).
7235
+ */
7236
+ lagMs: number().optional(),
7237
+ effectiveFps: number().optional(),
7238
+ adaptiveFps: number().optional()
7230
7239
  });
7231
7240
  var DecoderSessionConfigSchema = object({
7232
7241
  codec: string(),
@@ -7267,7 +7276,15 @@ var DecoderSessionConfigSchema = object({
7267
7276
  * other — `pullFrames` returns nothing for an `'shm'` session and
7268
7277
  * `pullHandles` returns nothing for a `'callback'` session.
7269
7278
  */
7270
- frameSink: _enum(["callback", "shm"]).default("callback")
7279
+ frameSink: _enum(["callback", "shm"]).default("callback"),
7280
+ /**
7281
+ * Per-camera decoder DEBUG facility. When `true`, a pull-mode session emits
7282
+ * a throttled (~1Hz) structured `decoder debug` line (effective/adaptive fps,
7283
+ * real-time lag, dropped-frame delta, avg decode time, hwaccel). Mirrors the
7284
+ * stream-broker's `streamingDebug` gate — off by default so production logs
7285
+ * stay quiet and the emit path pays zero per-frame cost when disabled.
7286
+ */
7287
+ debug: boolean().optional()
7271
7288
  });
7272
7289
  var EncodeProfileSchema = object({
7273
7290
  video: object({
@@ -9618,6 +9635,75 @@ DeviceType.Cover, method(object({ deviceId: number().int().nonnegative() }), _vo
9618
9635
  auth: "admin"
9619
9636
  });
9620
9637
  /**
9638
+ * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
9639
+ * shared by reolink / hikvision / amcrest. Models the common firmware
9640
+ * surface: the IR-cut switching MODE plus the two knobs that gate it
9641
+ * (photocell `sensitivity` + `switchDelaySec`). Each vendor maps these
9642
+ * onto its own ISAPI / Baichuan / Dahua-CGI fields; the cap standardises
9643
+ * the shape so ONE derived-form renders every camera.
9644
+ *
9645
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9646
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9647
+ * injected from `status`) reports the live values, and a single
9648
+ * `setSettings` mutation applies a partial change. No hand-written
9649
+ * settings-contribution methods — the framework derives the UI + save
9650
+ * routing from this surface.
9651
+ */
9652
+ /** IR-cut switching mode. `schedule` = time-of-day table configured on the camera. */
9653
+ var DayNightModeSchema = _enum([
9654
+ "auto",
9655
+ "day",
9656
+ "night",
9657
+ "schedule"
9658
+ ]);
9659
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9660
+ * getOptions availability convention. Normalized values are 0–100. */
9661
+ var NormalizedRangeSchema$1 = object({
9662
+ min: number(),
9663
+ max: number(),
9664
+ step: number()
9665
+ });
9666
+ object({
9667
+ mode: DayNightModeSchema,
9668
+ /** IR-cut trigger sensitivity, NORMALIZED 0–100 (higher = switches to night sooner). */
9669
+ sensitivity: number().optional(),
9670
+ /** Delay before the IR-cut filter flips, in seconds. */
9671
+ switchDelaySec: number().optional(),
9672
+ lastFetchedAt: number()
9673
+ });
9674
+ /**
9675
+ * Per-camera availability descriptor — drives which controls the admin UI
9676
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9677
+ * (normalized 0–100); the mode choice-set as an array. A provider returns
9678
+ * honest, camera-probed values — never hardcoded.
9679
+ */
9680
+ var DayNightOptionsSchema = object({
9681
+ /** Modes this camera accepts. Empty → the camera has no configurable day/night mode. */
9682
+ modes: array(DayNightModeSchema),
9683
+ supportsSensitivity: boolean(),
9684
+ /** Present when `supportsSensitivity` — the normalized 0–100 range. */
9685
+ sensitivity: NormalizedRangeSchema$1.optional(),
9686
+ supportsSwitchDelay: boolean(),
9687
+ /** Present when `supportsSwitchDelay` — the allowed delay range in seconds. */
9688
+ switchDelaySec: NormalizedRangeSchema$1.optional()
9689
+ });
9690
+ /**
9691
+ * Partial change to the day/night config — every field optional. A
9692
+ * provider ignores fields it does not support.
9693
+ */
9694
+ var DayNightSettingsPatchSchema = object({
9695
+ mode: DayNightModeSchema.optional(),
9696
+ sensitivity: number().optional(),
9697
+ switchDelaySec: number().optional()
9698
+ });
9699
+ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema), method(object({
9700
+ deviceId: number(),
9701
+ settings: DayNightSettingsPatchSchema
9702
+ }), _void(), {
9703
+ kind: "mutation",
9704
+ auth: "admin"
9705
+ });
9706
+ /**
9621
9707
  * Identity envelope for a device's upstream-system metadata.
9622
9708
  *
9623
9709
  * Two jobs:
@@ -9973,6 +10059,130 @@ object({
9973
10059
  });
9974
10060
  DeviceType.Image;
9975
10061
  /**
10062
+ * Vendor-neutral image / picture-adjustment cap — the per-camera config
10063
+ * cap shared by reolink / hikvision / amcrest. Models the common ISP
10064
+ * surface: the four picture sliders (brightness / contrast / saturation /
10065
+ * sharpness), orientation (mirror / flip / rotate), white-balance,
10066
+ * exposure and backlight-compensation modes.
10067
+ *
10068
+ * NORMALIZATION: every slider is a normalized int 0–100. Vendors expose
10069
+ * these natively as 0–100 or 0–255 (or other ranges); each provider maps
10070
+ * its native range to/from this normalized 0–100 space so the cap surface
10071
+ * (and the derived form) is identical across cameras. `warmth` (manual
10072
+ * white-balance) is likewise normalized 0–100.
10073
+ *
10074
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
10075
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
10076
+ * injected from `status`) reports the live values, and a single
10077
+ * `setSettings` mutation applies a partial change. No hand-written
10078
+ * settings-contribution methods — the framework derives the UI + save
10079
+ * routing from this surface.
10080
+ */
10081
+ /** Sensor/image rotation, degrees clockwise. */
10082
+ var ImageRotateSchema = _enum([
10083
+ "0",
10084
+ "90",
10085
+ "180",
10086
+ "270"
10087
+ ]);
10088
+ /** White-balance mode. `manual` unlocks the normalized `warmth` knob. */
10089
+ var WhiteBalanceModeSchema = _enum(["auto", "manual"]);
10090
+ /** Exposure mode. */
10091
+ var ExposureModeSchema = _enum(["auto", "manual"]);
10092
+ /**
10093
+ * Backlight-compensation mode:
10094
+ * - `off` — disabled
10095
+ * - `blc` — backlight compensation
10096
+ * - `wdr` — wide dynamic range
10097
+ * - `hlc` — highlight compensation
10098
+ */
10099
+ var BacklightModeSchema = _enum([
10100
+ "off",
10101
+ "blc",
10102
+ "wdr",
10103
+ "hlc"
10104
+ ]);
10105
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
10106
+ * getOptions availability convention. Slider values are normalized 0–100. */
10107
+ var NormalizedRangeSchema = object({
10108
+ min: number(),
10109
+ max: number(),
10110
+ step: number()
10111
+ });
10112
+ object({
10113
+ /** Normalized 0–100. */
10114
+ brightness: number().optional(),
10115
+ /** Normalized 0–100. */
10116
+ contrast: number().optional(),
10117
+ /** Normalized 0–100. */
10118
+ saturation: number().optional(),
10119
+ /** Normalized 0–100. */
10120
+ sharpness: number().optional(),
10121
+ mirror: boolean().optional(),
10122
+ flip: boolean().optional(),
10123
+ rotate: ImageRotateSchema.optional(),
10124
+ whiteBalance: WhiteBalanceModeSchema.optional(),
10125
+ /** Manual white-balance warmth, NORMALIZED 0–100. Meaningful only when `whiteBalance === 'manual'`. */
10126
+ warmth: number().optional(),
10127
+ exposureMode: ExposureModeSchema.optional(),
10128
+ backlightMode: BacklightModeSchema.optional(),
10129
+ lastFetchedAt: number()
10130
+ });
10131
+ /**
10132
+ * Per-camera availability descriptor — drives which controls the admin UI
10133
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
10134
+ * (the normalized 0–100 range); enums as arrays of supported values (empty
10135
+ * array → control hidden). A provider returns honest, camera-probed values
10136
+ * — never hardcoded.
10137
+ */
10138
+ var ImageSettingsOptionsSchema = object({
10139
+ supportsBrightness: boolean(),
10140
+ brightness: NormalizedRangeSchema.optional(),
10141
+ supportsContrast: boolean(),
10142
+ contrast: NormalizedRangeSchema.optional(),
10143
+ supportsSaturation: boolean(),
10144
+ saturation: NormalizedRangeSchema.optional(),
10145
+ supportsSharpness: boolean(),
10146
+ sharpness: NormalizedRangeSchema.optional(),
10147
+ supportsMirror: boolean(),
10148
+ supportsFlip: boolean(),
10149
+ /** Supported rotation values. Empty → rotation not configurable. */
10150
+ rotateOptions: array(ImageRotateSchema),
10151
+ /** Supported white-balance modes. Empty → white-balance not configurable. */
10152
+ whiteBalanceModes: array(WhiteBalanceModeSchema),
10153
+ supportsWarmth: boolean(),
10154
+ /** Present when `supportsWarmth` — the normalized 0–100 range. */
10155
+ warmth: NormalizedRangeSchema.optional(),
10156
+ /** Supported exposure modes. Empty → exposure not configurable. */
10157
+ exposureModes: array(ExposureModeSchema),
10158
+ /** Supported backlight modes. Empty → backlight-compensation not configurable. */
10159
+ backlightModes: array(BacklightModeSchema)
10160
+ });
10161
+ /**
10162
+ * Partial change to the image config — every field optional. Slider values
10163
+ * are normalized 0–100. A provider ignores fields it does not support.
10164
+ */
10165
+ var ImageSettingsPatchSchema = object({
10166
+ brightness: number().optional(),
10167
+ contrast: number().optional(),
10168
+ saturation: number().optional(),
10169
+ sharpness: number().optional(),
10170
+ mirror: boolean().optional(),
10171
+ flip: boolean().optional(),
10172
+ rotate: ImageRotateSchema.optional(),
10173
+ whiteBalance: WhiteBalanceModeSchema.optional(),
10174
+ warmth: number().optional(),
10175
+ exposureMode: ExposureModeSchema.optional(),
10176
+ backlightMode: BacklightModeSchema.optional()
10177
+ });
10178
+ DeviceType.Camera, method(object({ deviceId: number() }), ImageSettingsOptionsSchema), method(object({
10179
+ deviceId: number(),
10180
+ settings: ImageSettingsPatchSchema
10181
+ }), _void(), {
10182
+ kind: "mutation",
10183
+ auth: "admin"
10184
+ });
10185
+ /**
9976
10186
  * Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
9977
10187
  * with a mowing lifecycle plus a dock action.
9978
10188
  *
@@ -10867,6 +11077,16 @@ var RunnerCameraConfigSchema = object({
10867
11077
  * this gate is bypassed.
10868
11078
  */
10869
11079
  onboardMotionDrivesAnalyzer: boolean().default(true),
11080
+ /**
11081
+ * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
11082
+ * never arms the periodic recheck timer, regardless of `occupancyRecheckSec` —
11083
+ * this is off by default because the recheck re-subscribes a detection session
11084
+ * every N seconds while `watching`, a major source of pull-decoder re-dial
11085
+ * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
11086
+ * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
11087
+ * (and only render) when this is enabled.
11088
+ */
11089
+ occupancyRecheckEnabled: boolean().default(false),
10870
11090
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
10871
11091
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
10872
11092
  /**
@@ -13163,7 +13383,9 @@ method(object({ codec: string() }), boolean()), method(_void(), object({
13163
13383
  id: string(),
13164
13384
  name: string(),
13165
13385
  isPullMode: boolean().optional(),
13166
- priority: number().optional()
13386
+ priority: number().optional(),
13387
+ hwaccel: string().optional(),
13388
+ probedBestHwaccel: string().optional()
13167
13389
  })), method(DecoderSessionConfigSchema, object({
13168
13390
  sessionId: string(),
13169
13391
  nodeId: string()
@@ -19169,6 +19391,18 @@ Object.freeze({
19169
19391
  addonId: null,
19170
19392
  access: "view"
19171
19393
  },
19394
+ "dayNight.getOptions": {
19395
+ capName: "day-night",
19396
+ capScope: "device",
19397
+ addonId: null,
19398
+ access: "view"
19399
+ },
19400
+ "dayNight.setSettings": {
19401
+ capName: "day-night",
19402
+ capScope: "device",
19403
+ addonId: null,
19404
+ access: "create"
19405
+ },
19172
19406
  "decoder.createSession": {
19173
19407
  capName: "decoder",
19174
19408
  capScope: "system",
@@ -20099,6 +20333,18 @@ Object.freeze({
20099
20333
  addonId: null,
20100
20334
  access: "create"
20101
20335
  },
20336
+ "imageSettings.getOptions": {
20337
+ capName: "image-settings",
20338
+ capScope: "device",
20339
+ addonId: null,
20340
+ access: "view"
20341
+ },
20342
+ "imageSettings.setSettings": {
20343
+ capName: "image-settings",
20344
+ capScope: "device",
20345
+ addonId: null,
20346
+ access: "create"
20347
+ },
20102
20348
  "integrations.create": {
20103
20349
  capName: "integrations",
20104
20350
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -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({
@@ -9614,6 +9631,75 @@ DeviceType.Cover, method(object({ deviceId: number().int().nonnegative() }), _vo
9614
9631
  auth: "admin"
9615
9632
  });
9616
9633
  /**
9634
+ * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
9635
+ * shared by reolink / hikvision / amcrest. Models the common firmware
9636
+ * surface: the IR-cut switching MODE plus the two knobs that gate it
9637
+ * (photocell `sensitivity` + `switchDelaySec`). Each vendor maps these
9638
+ * onto its own ISAPI / Baichuan / Dahua-CGI fields; the cap standardises
9639
+ * the shape so ONE derived-form renders every camera.
9640
+ *
9641
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9642
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9643
+ * injected from `status`) reports the live values, and a single
9644
+ * `setSettings` mutation applies a partial change. No hand-written
9645
+ * settings-contribution methods — the framework derives the UI + save
9646
+ * routing from this surface.
9647
+ */
9648
+ /** IR-cut switching mode. `schedule` = time-of-day table configured on the camera. */
9649
+ var DayNightModeSchema = _enum([
9650
+ "auto",
9651
+ "day",
9652
+ "night",
9653
+ "schedule"
9654
+ ]);
9655
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9656
+ * getOptions availability convention. Normalized values are 0–100. */
9657
+ var NormalizedRangeSchema$1 = object({
9658
+ min: number(),
9659
+ max: number(),
9660
+ step: number()
9661
+ });
9662
+ object({
9663
+ mode: DayNightModeSchema,
9664
+ /** IR-cut trigger sensitivity, NORMALIZED 0–100 (higher = switches to night sooner). */
9665
+ sensitivity: number().optional(),
9666
+ /** Delay before the IR-cut filter flips, in seconds. */
9667
+ switchDelaySec: number().optional(),
9668
+ lastFetchedAt: number()
9669
+ });
9670
+ /**
9671
+ * Per-camera availability descriptor — drives which controls the admin UI
9672
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9673
+ * (normalized 0–100); the mode choice-set as an array. A provider returns
9674
+ * honest, camera-probed values — never hardcoded.
9675
+ */
9676
+ var DayNightOptionsSchema = object({
9677
+ /** Modes this camera accepts. Empty → the camera has no configurable day/night mode. */
9678
+ modes: array(DayNightModeSchema),
9679
+ supportsSensitivity: boolean(),
9680
+ /** Present when `supportsSensitivity` — the normalized 0–100 range. */
9681
+ sensitivity: NormalizedRangeSchema$1.optional(),
9682
+ supportsSwitchDelay: boolean(),
9683
+ /** Present when `supportsSwitchDelay` — the allowed delay range in seconds. */
9684
+ switchDelaySec: NormalizedRangeSchema$1.optional()
9685
+ });
9686
+ /**
9687
+ * Partial change to the day/night config — every field optional. A
9688
+ * provider ignores fields it does not support.
9689
+ */
9690
+ var DayNightSettingsPatchSchema = object({
9691
+ mode: DayNightModeSchema.optional(),
9692
+ sensitivity: number().optional(),
9693
+ switchDelaySec: number().optional()
9694
+ });
9695
+ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema), method(object({
9696
+ deviceId: number(),
9697
+ settings: DayNightSettingsPatchSchema
9698
+ }), _void(), {
9699
+ kind: "mutation",
9700
+ auth: "admin"
9701
+ });
9702
+ /**
9617
9703
  * Identity envelope for a device's upstream-system metadata.
9618
9704
  *
9619
9705
  * Two jobs:
@@ -9969,6 +10055,130 @@ object({
9969
10055
  });
9970
10056
  DeviceType.Image;
9971
10057
  /**
10058
+ * Vendor-neutral image / picture-adjustment cap — the per-camera config
10059
+ * cap shared by reolink / hikvision / amcrest. Models the common ISP
10060
+ * surface: the four picture sliders (brightness / contrast / saturation /
10061
+ * sharpness), orientation (mirror / flip / rotate), white-balance,
10062
+ * exposure and backlight-compensation modes.
10063
+ *
10064
+ * NORMALIZATION: every slider is a normalized int 0–100. Vendors expose
10065
+ * these natively as 0–100 or 0–255 (or other ranges); each provider maps
10066
+ * its native range to/from this normalized 0–100 space so the cap surface
10067
+ * (and the derived form) is identical across cameras. `warmth` (manual
10068
+ * white-balance) is likewise normalized 0–100.
10069
+ *
10070
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
10071
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
10072
+ * injected from `status`) reports the live values, and a single
10073
+ * `setSettings` mutation applies a partial change. No hand-written
10074
+ * settings-contribution methods — the framework derives the UI + save
10075
+ * routing from this surface.
10076
+ */
10077
+ /** Sensor/image rotation, degrees clockwise. */
10078
+ var ImageRotateSchema = _enum([
10079
+ "0",
10080
+ "90",
10081
+ "180",
10082
+ "270"
10083
+ ]);
10084
+ /** White-balance mode. `manual` unlocks the normalized `warmth` knob. */
10085
+ var WhiteBalanceModeSchema = _enum(["auto", "manual"]);
10086
+ /** Exposure mode. */
10087
+ var ExposureModeSchema = _enum(["auto", "manual"]);
10088
+ /**
10089
+ * Backlight-compensation mode:
10090
+ * - `off` — disabled
10091
+ * - `blc` — backlight compensation
10092
+ * - `wdr` — wide dynamic range
10093
+ * - `hlc` — highlight compensation
10094
+ */
10095
+ var BacklightModeSchema = _enum([
10096
+ "off",
10097
+ "blc",
10098
+ "wdr",
10099
+ "hlc"
10100
+ ]);
10101
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
10102
+ * getOptions availability convention. Slider values are normalized 0–100. */
10103
+ var NormalizedRangeSchema = object({
10104
+ min: number(),
10105
+ max: number(),
10106
+ step: number()
10107
+ });
10108
+ object({
10109
+ /** Normalized 0–100. */
10110
+ brightness: number().optional(),
10111
+ /** Normalized 0–100. */
10112
+ contrast: number().optional(),
10113
+ /** Normalized 0–100. */
10114
+ saturation: number().optional(),
10115
+ /** Normalized 0–100. */
10116
+ sharpness: number().optional(),
10117
+ mirror: boolean().optional(),
10118
+ flip: boolean().optional(),
10119
+ rotate: ImageRotateSchema.optional(),
10120
+ whiteBalance: WhiteBalanceModeSchema.optional(),
10121
+ /** Manual white-balance warmth, NORMALIZED 0–100. Meaningful only when `whiteBalance === 'manual'`. */
10122
+ warmth: number().optional(),
10123
+ exposureMode: ExposureModeSchema.optional(),
10124
+ backlightMode: BacklightModeSchema.optional(),
10125
+ lastFetchedAt: number()
10126
+ });
10127
+ /**
10128
+ * Per-camera availability descriptor — drives which controls the admin UI
10129
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
10130
+ * (the normalized 0–100 range); enums as arrays of supported values (empty
10131
+ * array → control hidden). A provider returns honest, camera-probed values
10132
+ * — never hardcoded.
10133
+ */
10134
+ var ImageSettingsOptionsSchema = object({
10135
+ supportsBrightness: boolean(),
10136
+ brightness: NormalizedRangeSchema.optional(),
10137
+ supportsContrast: boolean(),
10138
+ contrast: NormalizedRangeSchema.optional(),
10139
+ supportsSaturation: boolean(),
10140
+ saturation: NormalizedRangeSchema.optional(),
10141
+ supportsSharpness: boolean(),
10142
+ sharpness: NormalizedRangeSchema.optional(),
10143
+ supportsMirror: boolean(),
10144
+ supportsFlip: boolean(),
10145
+ /** Supported rotation values. Empty → rotation not configurable. */
10146
+ rotateOptions: array(ImageRotateSchema),
10147
+ /** Supported white-balance modes. Empty → white-balance not configurable. */
10148
+ whiteBalanceModes: array(WhiteBalanceModeSchema),
10149
+ supportsWarmth: boolean(),
10150
+ /** Present when `supportsWarmth` — the normalized 0–100 range. */
10151
+ warmth: NormalizedRangeSchema.optional(),
10152
+ /** Supported exposure modes. Empty → exposure not configurable. */
10153
+ exposureModes: array(ExposureModeSchema),
10154
+ /** Supported backlight modes. Empty → backlight-compensation not configurable. */
10155
+ backlightModes: array(BacklightModeSchema)
10156
+ });
10157
+ /**
10158
+ * Partial change to the image config — every field optional. Slider values
10159
+ * are normalized 0–100. A provider ignores fields it does not support.
10160
+ */
10161
+ var ImageSettingsPatchSchema = object({
10162
+ brightness: number().optional(),
10163
+ contrast: number().optional(),
10164
+ saturation: number().optional(),
10165
+ sharpness: number().optional(),
10166
+ mirror: boolean().optional(),
10167
+ flip: boolean().optional(),
10168
+ rotate: ImageRotateSchema.optional(),
10169
+ whiteBalance: WhiteBalanceModeSchema.optional(),
10170
+ warmth: number().optional(),
10171
+ exposureMode: ExposureModeSchema.optional(),
10172
+ backlightMode: BacklightModeSchema.optional()
10173
+ });
10174
+ DeviceType.Camera, method(object({ deviceId: number() }), ImageSettingsOptionsSchema), method(object({
10175
+ deviceId: number(),
10176
+ settings: ImageSettingsPatchSchema
10177
+ }), _void(), {
10178
+ kind: "mutation",
10179
+ auth: "admin"
10180
+ });
10181
+ /**
9972
10182
  * Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
9973
10183
  * with a mowing lifecycle plus a dock action.
9974
10184
  *
@@ -10863,6 +11073,16 @@ var RunnerCameraConfigSchema = object({
10863
11073
  * this gate is bypassed.
10864
11074
  */
10865
11075
  onboardMotionDrivesAnalyzer: boolean().default(true),
11076
+ /**
11077
+ * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
11078
+ * never arms the periodic recheck timer, regardless of `occupancyRecheckSec` —
11079
+ * this is off by default because the recheck re-subscribes a detection session
11080
+ * every N seconds while `watching`, a major source of pull-decoder re-dial
11081
+ * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
11082
+ * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
11083
+ * (and only render) when this is enabled.
11084
+ */
11085
+ occupancyRecheckEnabled: boolean().default(false),
10866
11086
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
10867
11087
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
10868
11088
  /**
@@ -13159,7 +13379,9 @@ method(object({ codec: string() }), boolean()), method(_void(), object({
13159
13379
  id: string(),
13160
13380
  name: string(),
13161
13381
  isPullMode: boolean().optional(),
13162
- priority: number().optional()
13382
+ priority: number().optional(),
13383
+ hwaccel: string().optional(),
13384
+ probedBestHwaccel: string().optional()
13163
13385
  })), method(DecoderSessionConfigSchema, object({
13164
13386
  sessionId: string(),
13165
13387
  nodeId: string()
@@ -19165,6 +19387,18 @@ Object.freeze({
19165
19387
  addonId: null,
19166
19388
  access: "view"
19167
19389
  },
19390
+ "dayNight.getOptions": {
19391
+ capName: "day-night",
19392
+ capScope: "device",
19393
+ addonId: null,
19394
+ access: "view"
19395
+ },
19396
+ "dayNight.setSettings": {
19397
+ capName: "day-night",
19398
+ capScope: "device",
19399
+ addonId: null,
19400
+ access: "create"
19401
+ },
19168
19402
  "decoder.createSession": {
19169
19403
  capName: "decoder",
19170
19404
  capScope: "system",
@@ -20095,6 +20329,18 @@ Object.freeze({
20095
20329
  addonId: null,
20096
20330
  access: "create"
20097
20331
  },
20332
+ "imageSettings.getOptions": {
20333
+ capName: "image-settings",
20334
+ capScope: "device",
20335
+ addonId: null,
20336
+ access: "view"
20337
+ },
20338
+ "imageSettings.setSettings": {
20339
+ capName: "image-settings",
20340
+ capScope: "device",
20341
+ addonId: null,
20342
+ access: "create"
20343
+ },
20098
20344
  "integrations.create": {
20099
20345
  capName: "integrations",
20100
20346
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-notifiers",
3
- "version": "1.1.18",
3
+ "version": "1.1.20",
4
4
  "description": "System notifiers addon for CamStack — a `notification-output` collection provider hosting per-kind notifier adapters (ntfy, pushover, gotify, telegram, discord, webhook, zentik).",
5
5
  "keywords": [
6
6
  "camstack",