@camstack/addon-advanced-notifier 1.1.18 → 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.
package/dist/addon.js CHANGED
@@ -4632,7 +4632,7 @@ function _instanceof(cls, params = {}) {
4632
4632
  return inst;
4633
4633
  }
4634
4634
  //#endregion
4635
- //#region ../types/dist/sleep-BiDFW0E7.mjs
4635
+ //#region ../types/dist/sleep-CZDdRBua.mjs
4636
4636
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4637
4637
  EventCategory["SystemBoot"] = "system.boot";
4638
4638
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -7227,7 +7227,16 @@ var DecoderStatsSchema = object({
7227
7227
  inputFps: number(),
7228
7228
  outputFps: number(),
7229
7229
  avgDecodeTimeMs: number(),
7230
- droppedFrames: number()
7230
+ droppedFrames: number(),
7231
+ /**
7232
+ * Pull-mode adaptive-fps telemetry (optional — only pull sessions run the
7233
+ * lag-driven controller; push sessions omit these). `lagMs` is the EWMA of
7234
+ * the decoder's real-time drift (rising = falling behind live); `adaptiveFps`
7235
+ * is the current lag-throttled emit rate (≤ `effectiveFps` ceiling).
7236
+ */
7237
+ lagMs: number().optional(),
7238
+ effectiveFps: number().optional(),
7239
+ adaptiveFps: number().optional()
7231
7240
  });
7232
7241
  var DecoderSessionConfigSchema = object({
7233
7242
  codec: string(),
@@ -7268,7 +7277,15 @@ var DecoderSessionConfigSchema = object({
7268
7277
  * other — `pullFrames` returns nothing for an `'shm'` session and
7269
7278
  * `pullHandles` returns nothing for a `'callback'` session.
7270
7279
  */
7271
- frameSink: _enum(["callback", "shm"]).default("callback")
7280
+ frameSink: _enum(["callback", "shm"]).default("callback"),
7281
+ /**
7282
+ * Per-camera decoder DEBUG facility. When `true`, a pull-mode session emits
7283
+ * a throttled (~1Hz) structured `decoder debug` line (effective/adaptive fps,
7284
+ * real-time lag, dropped-frame delta, avg decode time, hwaccel). Mirrors the
7285
+ * stream-broker's `streamingDebug` gate — off by default so production logs
7286
+ * stay quiet and the emit path pays zero per-frame cost when disabled.
7287
+ */
7288
+ debug: boolean().optional()
7272
7289
  });
7273
7290
  var EncodeProfileSchema = object({
7274
7291
  video: object({
@@ -9440,6 +9457,75 @@ DeviceType.Cover, method(object({ deviceId: number().int().nonnegative() }), _vo
9440
9457
  auth: "admin"
9441
9458
  });
9442
9459
  /**
9460
+ * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
9461
+ * shared by reolink / hikvision / amcrest. Models the common firmware
9462
+ * surface: the IR-cut switching MODE plus the two knobs that gate it
9463
+ * (photocell `sensitivity` + `switchDelaySec`). Each vendor maps these
9464
+ * onto its own ISAPI / Baichuan / Dahua-CGI fields; the cap standardises
9465
+ * the shape so ONE derived-form renders every camera.
9466
+ *
9467
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9468
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9469
+ * injected from `status`) reports the live values, and a single
9470
+ * `setSettings` mutation applies a partial change. No hand-written
9471
+ * settings-contribution methods — the framework derives the UI + save
9472
+ * routing from this surface.
9473
+ */
9474
+ /** IR-cut switching mode. `schedule` = time-of-day table configured on the camera. */
9475
+ var DayNightModeSchema = _enum([
9476
+ "auto",
9477
+ "day",
9478
+ "night",
9479
+ "schedule"
9480
+ ]);
9481
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9482
+ * getOptions availability convention. Normalized values are 0–100. */
9483
+ var NormalizedRangeSchema$1 = object({
9484
+ min: number(),
9485
+ max: number(),
9486
+ step: number()
9487
+ });
9488
+ object({
9489
+ mode: DayNightModeSchema,
9490
+ /** IR-cut trigger sensitivity, NORMALIZED 0–100 (higher = switches to night sooner). */
9491
+ sensitivity: number().optional(),
9492
+ /** Delay before the IR-cut filter flips, in seconds. */
9493
+ switchDelaySec: number().optional(),
9494
+ lastFetchedAt: number()
9495
+ });
9496
+ /**
9497
+ * Per-camera availability descriptor — drives which controls the admin UI
9498
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9499
+ * (normalized 0–100); the mode choice-set as an array. A provider returns
9500
+ * honest, camera-probed values — never hardcoded.
9501
+ */
9502
+ var DayNightOptionsSchema = object({
9503
+ /** Modes this camera accepts. Empty → the camera has no configurable day/night mode. */
9504
+ modes: array(DayNightModeSchema),
9505
+ supportsSensitivity: boolean(),
9506
+ /** Present when `supportsSensitivity` — the normalized 0–100 range. */
9507
+ sensitivity: NormalizedRangeSchema$1.optional(),
9508
+ supportsSwitchDelay: boolean(),
9509
+ /** Present when `supportsSwitchDelay` — the allowed delay range in seconds. */
9510
+ switchDelaySec: NormalizedRangeSchema$1.optional()
9511
+ });
9512
+ /**
9513
+ * Partial change to the day/night config — every field optional. A
9514
+ * provider ignores fields it does not support.
9515
+ */
9516
+ var DayNightSettingsPatchSchema = object({
9517
+ mode: DayNightModeSchema.optional(),
9518
+ sensitivity: number().optional(),
9519
+ switchDelaySec: number().optional()
9520
+ });
9521
+ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema), method(object({
9522
+ deviceId: number(),
9523
+ settings: DayNightSettingsPatchSchema
9524
+ }), _void(), {
9525
+ kind: "mutation",
9526
+ auth: "admin"
9527
+ });
9528
+ /**
9443
9529
  * Identity envelope for a device's upstream-system metadata.
9444
9530
  *
9445
9531
  * Two jobs:
@@ -9795,6 +9881,130 @@ object({
9795
9881
  });
9796
9882
  DeviceType.Image;
9797
9883
  /**
9884
+ * Vendor-neutral image / picture-adjustment cap — the per-camera config
9885
+ * cap shared by reolink / hikvision / amcrest. Models the common ISP
9886
+ * surface: the four picture sliders (brightness / contrast / saturation /
9887
+ * sharpness), orientation (mirror / flip / rotate), white-balance,
9888
+ * exposure and backlight-compensation modes.
9889
+ *
9890
+ * NORMALIZATION: every slider is a normalized int 0–100. Vendors expose
9891
+ * these natively as 0–100 or 0–255 (or other ranges); each provider maps
9892
+ * its native range to/from this normalized 0–100 space so the cap surface
9893
+ * (and the derived form) is identical across cameras. `warmth` (manual
9894
+ * white-balance) is likewise normalized 0–100.
9895
+ *
9896
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9897
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9898
+ * injected from `status`) reports the live values, and a single
9899
+ * `setSettings` mutation applies a partial change. No hand-written
9900
+ * settings-contribution methods — the framework derives the UI + save
9901
+ * routing from this surface.
9902
+ */
9903
+ /** Sensor/image rotation, degrees clockwise. */
9904
+ var ImageRotateSchema = _enum([
9905
+ "0",
9906
+ "90",
9907
+ "180",
9908
+ "270"
9909
+ ]);
9910
+ /** White-balance mode. `manual` unlocks the normalized `warmth` knob. */
9911
+ var WhiteBalanceModeSchema = _enum(["auto", "manual"]);
9912
+ /** Exposure mode. */
9913
+ var ExposureModeSchema = _enum(["auto", "manual"]);
9914
+ /**
9915
+ * Backlight-compensation mode:
9916
+ * - `off` — disabled
9917
+ * - `blc` — backlight compensation
9918
+ * - `wdr` — wide dynamic range
9919
+ * - `hlc` — highlight compensation
9920
+ */
9921
+ var BacklightModeSchema = _enum([
9922
+ "off",
9923
+ "blc",
9924
+ "wdr",
9925
+ "hlc"
9926
+ ]);
9927
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9928
+ * getOptions availability convention. Slider values are normalized 0–100. */
9929
+ var NormalizedRangeSchema = object({
9930
+ min: number(),
9931
+ max: number(),
9932
+ step: number()
9933
+ });
9934
+ object({
9935
+ /** Normalized 0–100. */
9936
+ brightness: number().optional(),
9937
+ /** Normalized 0–100. */
9938
+ contrast: number().optional(),
9939
+ /** Normalized 0–100. */
9940
+ saturation: number().optional(),
9941
+ /** Normalized 0–100. */
9942
+ sharpness: number().optional(),
9943
+ mirror: boolean().optional(),
9944
+ flip: boolean().optional(),
9945
+ rotate: ImageRotateSchema.optional(),
9946
+ whiteBalance: WhiteBalanceModeSchema.optional(),
9947
+ /** Manual white-balance warmth, NORMALIZED 0–100. Meaningful only when `whiteBalance === 'manual'`. */
9948
+ warmth: number().optional(),
9949
+ exposureMode: ExposureModeSchema.optional(),
9950
+ backlightMode: BacklightModeSchema.optional(),
9951
+ lastFetchedAt: number()
9952
+ });
9953
+ /**
9954
+ * Per-camera availability descriptor — drives which controls the admin UI
9955
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9956
+ * (the normalized 0–100 range); enums as arrays of supported values (empty
9957
+ * array → control hidden). A provider returns honest, camera-probed values
9958
+ * — never hardcoded.
9959
+ */
9960
+ var ImageSettingsOptionsSchema = object({
9961
+ supportsBrightness: boolean(),
9962
+ brightness: NormalizedRangeSchema.optional(),
9963
+ supportsContrast: boolean(),
9964
+ contrast: NormalizedRangeSchema.optional(),
9965
+ supportsSaturation: boolean(),
9966
+ saturation: NormalizedRangeSchema.optional(),
9967
+ supportsSharpness: boolean(),
9968
+ sharpness: NormalizedRangeSchema.optional(),
9969
+ supportsMirror: boolean(),
9970
+ supportsFlip: boolean(),
9971
+ /** Supported rotation values. Empty → rotation not configurable. */
9972
+ rotateOptions: array(ImageRotateSchema),
9973
+ /** Supported white-balance modes. Empty → white-balance not configurable. */
9974
+ whiteBalanceModes: array(WhiteBalanceModeSchema),
9975
+ supportsWarmth: boolean(),
9976
+ /** Present when `supportsWarmth` — the normalized 0–100 range. */
9977
+ warmth: NormalizedRangeSchema.optional(),
9978
+ /** Supported exposure modes. Empty → exposure not configurable. */
9979
+ exposureModes: array(ExposureModeSchema),
9980
+ /** Supported backlight modes. Empty → backlight-compensation not configurable. */
9981
+ backlightModes: array(BacklightModeSchema)
9982
+ });
9983
+ /**
9984
+ * Partial change to the image config — every field optional. Slider values
9985
+ * are normalized 0–100. A provider ignores fields it does not support.
9986
+ */
9987
+ var ImageSettingsPatchSchema = object({
9988
+ brightness: number().optional(),
9989
+ contrast: number().optional(),
9990
+ saturation: number().optional(),
9991
+ sharpness: number().optional(),
9992
+ mirror: boolean().optional(),
9993
+ flip: boolean().optional(),
9994
+ rotate: ImageRotateSchema.optional(),
9995
+ whiteBalance: WhiteBalanceModeSchema.optional(),
9996
+ warmth: number().optional(),
9997
+ exposureMode: ExposureModeSchema.optional(),
9998
+ backlightMode: BacklightModeSchema.optional()
9999
+ });
10000
+ DeviceType.Camera, method(object({ deviceId: number() }), ImageSettingsOptionsSchema), method(object({
10001
+ deviceId: number(),
10002
+ settings: ImageSettingsPatchSchema
10003
+ }), _void(), {
10004
+ kind: "mutation",
10005
+ auth: "admin"
10006
+ });
10007
+ /**
9798
10008
  * Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
9799
10009
  * with a mowing lifecycle plus a dock action.
9800
10010
  *
@@ -10689,6 +10899,16 @@ var RunnerCameraConfigSchema = object({
10689
10899
  * this gate is bypassed.
10690
10900
  */
10691
10901
  onboardMotionDrivesAnalyzer: boolean().default(true),
10902
+ /**
10903
+ * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
10904
+ * never arms the periodic recheck timer, regardless of `occupancyRecheckSec` —
10905
+ * this is off by default because the recheck re-subscribes a detection session
10906
+ * every N seconds while `watching`, a major source of pull-decoder re-dial
10907
+ * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
10908
+ * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
10909
+ * (and only render) when this is enabled.
10910
+ */
10911
+ occupancyRecheckEnabled: boolean().default(false),
10692
10912
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
10693
10913
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
10694
10914
  /**
@@ -12997,7 +13217,9 @@ method(object({ codec: string() }), boolean()), method(_void(), object({
12997
13217
  id: string(),
12998
13218
  name: string(),
12999
13219
  isPullMode: boolean().optional(),
13000
- priority: number().optional()
13220
+ priority: number().optional(),
13221
+ hwaccel: string().optional(),
13222
+ probedBestHwaccel: string().optional()
13001
13223
  })), method(DecoderSessionConfigSchema, object({
13002
13224
  sessionId: string(),
13003
13225
  nodeId: string()
@@ -19003,6 +19225,18 @@ Object.freeze({
19003
19225
  addonId: null,
19004
19226
  access: "view"
19005
19227
  },
19228
+ "dayNight.getOptions": {
19229
+ capName: "day-night",
19230
+ capScope: "device",
19231
+ addonId: null,
19232
+ access: "view"
19233
+ },
19234
+ "dayNight.setSettings": {
19235
+ capName: "day-night",
19236
+ capScope: "device",
19237
+ addonId: null,
19238
+ access: "create"
19239
+ },
19006
19240
  "decoder.createSession": {
19007
19241
  capName: "decoder",
19008
19242
  capScope: "system",
@@ -19933,6 +20167,18 @@ Object.freeze({
19933
20167
  addonId: null,
19934
20168
  access: "create"
19935
20169
  },
20170
+ "imageSettings.getOptions": {
20171
+ capName: "image-settings",
20172
+ capScope: "device",
20173
+ addonId: null,
20174
+ access: "view"
20175
+ },
20176
+ "imageSettings.setSettings": {
20177
+ capName: "image-settings",
20178
+ capScope: "device",
20179
+ addonId: null,
20180
+ access: "create"
20181
+ },
19936
20182
  "integrations.create": {
19937
20183
  capName: "integrations",
19938
20184
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -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({
@@ -9436,6 +9453,75 @@ DeviceType.Cover, method(object({ deviceId: number().int().nonnegative() }), _vo
9436
9453
  auth: "admin"
9437
9454
  });
9438
9455
  /**
9456
+ * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
9457
+ * shared by reolink / hikvision / amcrest. Models the common firmware
9458
+ * surface: the IR-cut switching MODE plus the two knobs that gate it
9459
+ * (photocell `sensitivity` + `switchDelaySec`). Each vendor maps these
9460
+ * onto its own ISAPI / Baichuan / Dahua-CGI fields; the cap standardises
9461
+ * the shape so ONE derived-form renders every camera.
9462
+ *
9463
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9464
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9465
+ * injected from `status`) reports the live values, and a single
9466
+ * `setSettings` mutation applies a partial change. No hand-written
9467
+ * settings-contribution methods — the framework derives the UI + save
9468
+ * routing from this surface.
9469
+ */
9470
+ /** IR-cut switching mode. `schedule` = time-of-day table configured on the camera. */
9471
+ var DayNightModeSchema = _enum([
9472
+ "auto",
9473
+ "day",
9474
+ "night",
9475
+ "schedule"
9476
+ ]);
9477
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9478
+ * getOptions availability convention. Normalized values are 0–100. */
9479
+ var NormalizedRangeSchema$1 = object({
9480
+ min: number(),
9481
+ max: number(),
9482
+ step: number()
9483
+ });
9484
+ object({
9485
+ mode: DayNightModeSchema,
9486
+ /** IR-cut trigger sensitivity, NORMALIZED 0–100 (higher = switches to night sooner). */
9487
+ sensitivity: number().optional(),
9488
+ /** Delay before the IR-cut filter flips, in seconds. */
9489
+ switchDelaySec: number().optional(),
9490
+ lastFetchedAt: number()
9491
+ });
9492
+ /**
9493
+ * Per-camera availability descriptor — drives which controls the admin UI
9494
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9495
+ * (normalized 0–100); the mode choice-set as an array. A provider returns
9496
+ * honest, camera-probed values — never hardcoded.
9497
+ */
9498
+ var DayNightOptionsSchema = object({
9499
+ /** Modes this camera accepts. Empty → the camera has no configurable day/night mode. */
9500
+ modes: array(DayNightModeSchema),
9501
+ supportsSensitivity: boolean(),
9502
+ /** Present when `supportsSensitivity` — the normalized 0–100 range. */
9503
+ sensitivity: NormalizedRangeSchema$1.optional(),
9504
+ supportsSwitchDelay: boolean(),
9505
+ /** Present when `supportsSwitchDelay` — the allowed delay range in seconds. */
9506
+ switchDelaySec: NormalizedRangeSchema$1.optional()
9507
+ });
9508
+ /**
9509
+ * Partial change to the day/night config — every field optional. A
9510
+ * provider ignores fields it does not support.
9511
+ */
9512
+ var DayNightSettingsPatchSchema = object({
9513
+ mode: DayNightModeSchema.optional(),
9514
+ sensitivity: number().optional(),
9515
+ switchDelaySec: number().optional()
9516
+ });
9517
+ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema), method(object({
9518
+ deviceId: number(),
9519
+ settings: DayNightSettingsPatchSchema
9520
+ }), _void(), {
9521
+ kind: "mutation",
9522
+ auth: "admin"
9523
+ });
9524
+ /**
9439
9525
  * Identity envelope for a device's upstream-system metadata.
9440
9526
  *
9441
9527
  * Two jobs:
@@ -9791,6 +9877,130 @@ object({
9791
9877
  });
9792
9878
  DeviceType.Image;
9793
9879
  /**
9880
+ * Vendor-neutral image / picture-adjustment cap — the per-camera config
9881
+ * cap shared by reolink / hikvision / amcrest. Models the common ISP
9882
+ * surface: the four picture sliders (brightness / contrast / saturation /
9883
+ * sharpness), orientation (mirror / flip / rotate), white-balance,
9884
+ * exposure and backlight-compensation modes.
9885
+ *
9886
+ * NORMALIZATION: every slider is a normalized int 0–100. Vendors expose
9887
+ * these natively as 0–100 or 0–255 (or other ranges); each provider maps
9888
+ * its native range to/from this normalized 0–100 space so the cap surface
9889
+ * (and the derived form) is identical across cameras. `warmth` (manual
9890
+ * white-balance) is likewise normalized 0–100.
9891
+ *
9892
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9893
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9894
+ * injected from `status`) reports the live values, and a single
9895
+ * `setSettings` mutation applies a partial change. No hand-written
9896
+ * settings-contribution methods — the framework derives the UI + save
9897
+ * routing from this surface.
9898
+ */
9899
+ /** Sensor/image rotation, degrees clockwise. */
9900
+ var ImageRotateSchema = _enum([
9901
+ "0",
9902
+ "90",
9903
+ "180",
9904
+ "270"
9905
+ ]);
9906
+ /** White-balance mode. `manual` unlocks the normalized `warmth` knob. */
9907
+ var WhiteBalanceModeSchema = _enum(["auto", "manual"]);
9908
+ /** Exposure mode. */
9909
+ var ExposureModeSchema = _enum(["auto", "manual"]);
9910
+ /**
9911
+ * Backlight-compensation mode:
9912
+ * - `off` — disabled
9913
+ * - `blc` — backlight compensation
9914
+ * - `wdr` — wide dynamic range
9915
+ * - `hlc` — highlight compensation
9916
+ */
9917
+ var BacklightModeSchema = _enum([
9918
+ "off",
9919
+ "blc",
9920
+ "wdr",
9921
+ "hlc"
9922
+ ]);
9923
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9924
+ * getOptions availability convention. Slider values are normalized 0–100. */
9925
+ var NormalizedRangeSchema = object({
9926
+ min: number(),
9927
+ max: number(),
9928
+ step: number()
9929
+ });
9930
+ object({
9931
+ /** Normalized 0–100. */
9932
+ brightness: number().optional(),
9933
+ /** Normalized 0–100. */
9934
+ contrast: number().optional(),
9935
+ /** Normalized 0–100. */
9936
+ saturation: number().optional(),
9937
+ /** Normalized 0–100. */
9938
+ sharpness: number().optional(),
9939
+ mirror: boolean().optional(),
9940
+ flip: boolean().optional(),
9941
+ rotate: ImageRotateSchema.optional(),
9942
+ whiteBalance: WhiteBalanceModeSchema.optional(),
9943
+ /** Manual white-balance warmth, NORMALIZED 0–100. Meaningful only when `whiteBalance === 'manual'`. */
9944
+ warmth: number().optional(),
9945
+ exposureMode: ExposureModeSchema.optional(),
9946
+ backlightMode: BacklightModeSchema.optional(),
9947
+ lastFetchedAt: number()
9948
+ });
9949
+ /**
9950
+ * Per-camera availability descriptor — drives which controls the admin UI
9951
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9952
+ * (the normalized 0–100 range); enums as arrays of supported values (empty
9953
+ * array → control hidden). A provider returns honest, camera-probed values
9954
+ * — never hardcoded.
9955
+ */
9956
+ var ImageSettingsOptionsSchema = object({
9957
+ supportsBrightness: boolean(),
9958
+ brightness: NormalizedRangeSchema.optional(),
9959
+ supportsContrast: boolean(),
9960
+ contrast: NormalizedRangeSchema.optional(),
9961
+ supportsSaturation: boolean(),
9962
+ saturation: NormalizedRangeSchema.optional(),
9963
+ supportsSharpness: boolean(),
9964
+ sharpness: NormalizedRangeSchema.optional(),
9965
+ supportsMirror: boolean(),
9966
+ supportsFlip: boolean(),
9967
+ /** Supported rotation values. Empty → rotation not configurable. */
9968
+ rotateOptions: array(ImageRotateSchema),
9969
+ /** Supported white-balance modes. Empty → white-balance not configurable. */
9970
+ whiteBalanceModes: array(WhiteBalanceModeSchema),
9971
+ supportsWarmth: boolean(),
9972
+ /** Present when `supportsWarmth` — the normalized 0–100 range. */
9973
+ warmth: NormalizedRangeSchema.optional(),
9974
+ /** Supported exposure modes. Empty → exposure not configurable. */
9975
+ exposureModes: array(ExposureModeSchema),
9976
+ /** Supported backlight modes. Empty → backlight-compensation not configurable. */
9977
+ backlightModes: array(BacklightModeSchema)
9978
+ });
9979
+ /**
9980
+ * Partial change to the image config — every field optional. Slider values
9981
+ * are normalized 0–100. A provider ignores fields it does not support.
9982
+ */
9983
+ var ImageSettingsPatchSchema = object({
9984
+ brightness: number().optional(),
9985
+ contrast: number().optional(),
9986
+ saturation: number().optional(),
9987
+ sharpness: number().optional(),
9988
+ mirror: boolean().optional(),
9989
+ flip: boolean().optional(),
9990
+ rotate: ImageRotateSchema.optional(),
9991
+ whiteBalance: WhiteBalanceModeSchema.optional(),
9992
+ warmth: number().optional(),
9993
+ exposureMode: ExposureModeSchema.optional(),
9994
+ backlightMode: BacklightModeSchema.optional()
9995
+ });
9996
+ DeviceType.Camera, method(object({ deviceId: number() }), ImageSettingsOptionsSchema), method(object({
9997
+ deviceId: number(),
9998
+ settings: ImageSettingsPatchSchema
9999
+ }), _void(), {
10000
+ kind: "mutation",
10001
+ auth: "admin"
10002
+ });
10003
+ /**
9794
10004
  * Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
9795
10005
  * with a mowing lifecycle plus a dock action.
9796
10006
  *
@@ -10685,6 +10895,16 @@ var RunnerCameraConfigSchema = object({
10685
10895
  * this gate is bypassed.
10686
10896
  */
10687
10897
  onboardMotionDrivesAnalyzer: boolean().default(true),
10898
+ /**
10899
+ * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
10900
+ * never arms the periodic recheck timer, regardless of `occupancyRecheckSec` —
10901
+ * this is off by default because the recheck re-subscribes a detection session
10902
+ * every N seconds while `watching`, a major source of pull-decoder re-dial
10903
+ * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
10904
+ * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
10905
+ * (and only render) when this is enabled.
10906
+ */
10907
+ occupancyRecheckEnabled: boolean().default(false),
10688
10908
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
10689
10909
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
10690
10910
  /**
@@ -12993,7 +13213,9 @@ method(object({ codec: string() }), boolean()), method(_void(), object({
12993
13213
  id: string(),
12994
13214
  name: string(),
12995
13215
  isPullMode: boolean().optional(),
12996
- priority: number().optional()
13216
+ priority: number().optional(),
13217
+ hwaccel: string().optional(),
13218
+ probedBestHwaccel: string().optional()
12997
13219
  })), method(DecoderSessionConfigSchema, object({
12998
13220
  sessionId: string(),
12999
13221
  nodeId: string()
@@ -18999,6 +19221,18 @@ Object.freeze({
18999
19221
  addonId: null,
19000
19222
  access: "view"
19001
19223
  },
19224
+ "dayNight.getOptions": {
19225
+ capName: "day-night",
19226
+ capScope: "device",
19227
+ addonId: null,
19228
+ access: "view"
19229
+ },
19230
+ "dayNight.setSettings": {
19231
+ capName: "day-night",
19232
+ capScope: "device",
19233
+ addonId: null,
19234
+ access: "create"
19235
+ },
19002
19236
  "decoder.createSession": {
19003
19237
  capName: "decoder",
19004
19238
  capScope: "system",
@@ -19929,6 +20163,18 @@ Object.freeze({
19929
20163
  addonId: null,
19930
20164
  access: "create"
19931
20165
  },
20166
+ "imageSettings.getOptions": {
20167
+ capName: "image-settings",
20168
+ capScope: "device",
20169
+ addonId: null,
20170
+ access: "view"
20171
+ },
20172
+ "imageSettings.setSettings": {
20173
+ capName: "image-settings",
20174
+ capScope: "device",
20175
+ addonId: null,
20176
+ access: "create"
20177
+ },
19932
20178
  "integrations.create": {
19933
20179
  capName: "integrations",
19934
20180
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-advanced-notifier",
3
- "version": "1.1.18",
3
+ "version": "1.1.19",
4
4
  "description": "Rules-based notification engine for CamStack",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",