@camstack/addon-pipeline 1.1.39 → 1.1.41

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.
Files changed (38) hide show
  1. package/dist/audio-analyzer/index.js +168 -61
  2. package/dist/audio-analyzer/index.mjs +168 -61
  3. package/dist/detection-pipeline/index.js +2 -2
  4. package/dist/detection-pipeline/index.mjs +2 -2
  5. package/dist/{dist-DbGdZ8Nr.js → dist-BJTPkJFw.js} +247 -3
  6. package/dist/{dist-DvvYzO58.mjs → dist-v6cKLmU3.mjs} +247 -3
  7. package/dist/{frame-handle-plane-B7jMIZc2.js → frame-handle-plane-BP8YV4sF.js} +54 -5
  8. package/dist/{frame-handle-plane-BFzoIfkd.mjs → frame-handle-plane-DKAXTtfn.mjs} +54 -5
  9. package/dist/motion-wasm/index.js +1 -1
  10. package/dist/motion-wasm/index.mjs +1 -1
  11. package/dist/pipeline-runner/index.js +893 -12
  12. package/dist/pipeline-runner/index.mjs +892 -13
  13. package/dist/recorder/index.js +2 -2
  14. package/dist/recorder/index.mjs +2 -2
  15. package/dist/session-decode/decode-worker-child.js +544 -0
  16. package/dist/session-decode/decode-worker-child.mjs +543 -0
  17. package/dist/stream-broker/_stub.js +44 -44
  18. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-DezFy4Fu.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-C2l0kmD4.mjs} +3 -3
  19. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DqJvWBKS.mjs +26 -0
  20. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-dGka8yZY.mjs +26 -0
  21. package/dist/stream-broker/{hostInit-BOf0hg9q.mjs → hostInit-DHaCRMjM.mjs} +3 -3
  22. package/dist/stream-broker/index.js +268 -38
  23. package/dist/stream-broker/index.mjs +268 -38
  24. package/dist/stream-broker/remoteEntry.js +1 -1
  25. package/dist/worker-protocol-BCfO8gUF.js +67 -0
  26. package/dist/worker-protocol-pk7qdYXt.mjs +56 -0
  27. package/embed-dist/assets/{MaskShapeCanvas-DI4BY7W2-Br2fqwe7.js → MaskShapeCanvas-DI4BY7W2-B6fza7ic.js} +1 -1
  28. package/embed-dist/assets/{MotionZonesSettings-NcxxQN8r-DYXRf30g.js → MotionZonesSettings-NcxxQN8r-Cy-4iTog.js} +1 -1
  29. package/embed-dist/assets/{PrivacyMaskSettings-APgPLF7p-DLpqLgPo.js → PrivacyMaskSettings-APgPLF7p-CYX33lJb.js} +1 -1
  30. package/embed-dist/assets/index-BPkayx9u.js +81 -0
  31. package/embed-dist/assets/index-CSFtK41z.css +2 -0
  32. package/embed-dist/index.html +2 -2
  33. package/package.json +6 -3
  34. package/python/inference_pool.py +3 -1
  35. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DhY3MZ2C.mjs +0 -26
  36. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BsrrdOBU.mjs +0 -26
  37. package/embed-dist/assets/index-C5UpuPr8.css +0 -2
  38. package/embed-dist/assets/index-CR367rYR.js +0 -81
@@ -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";
@@ -7418,7 +7418,16 @@ var DecoderStatsSchema = object({
7418
7418
  inputFps: number(),
7419
7419
  outputFps: number(),
7420
7420
  avgDecodeTimeMs: number(),
7421
- droppedFrames: number()
7421
+ droppedFrames: number(),
7422
+ /**
7423
+ * Pull-mode adaptive-fps telemetry (optional — only pull sessions run the
7424
+ * lag-driven controller; push sessions omit these). `lagMs` is the EWMA of
7425
+ * the decoder's real-time drift (rising = falling behind live); `adaptiveFps`
7426
+ * is the current lag-throttled emit rate (≤ `effectiveFps` ceiling).
7427
+ */
7428
+ lagMs: number().optional(),
7429
+ effectiveFps: number().optional(),
7430
+ adaptiveFps: number().optional()
7422
7431
  });
7423
7432
  var DecoderSessionConfigSchema = object({
7424
7433
  codec: string(),
@@ -7459,7 +7468,15 @@ var DecoderSessionConfigSchema = object({
7459
7468
  * other — `pullFrames` returns nothing for an `'shm'` session and
7460
7469
  * `pullHandles` returns nothing for a `'callback'` session.
7461
7470
  */
7462
- frameSink: _enum(["callback", "shm"]).default("callback")
7471
+ frameSink: _enum(["callback", "shm"]).default("callback"),
7472
+ /**
7473
+ * Per-camera decoder DEBUG facility. When `true`, a pull-mode session emits
7474
+ * a throttled (~1Hz) structured `decoder debug` line (effective/adaptive fps,
7475
+ * real-time lag, dropped-frame delta, avg decode time, hwaccel). Mirrors the
7476
+ * stream-broker's `streamingDebug` gate — off by default so production logs
7477
+ * stay quiet and the emit path pays zero per-frame cost when disabled.
7478
+ */
7479
+ debug: boolean().optional()
7463
7480
  });
7464
7481
  var EncodeProfileSchema = object({
7465
7482
  video: object({
@@ -10331,6 +10348,75 @@ DeviceType.Cover, method(object({ deviceId: number().int().nonnegative() }), _vo
10331
10348
  auth: "admin"
10332
10349
  });
10333
10350
  /**
10351
+ * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
10352
+ * shared by reolink / hikvision / amcrest. Models the common firmware
10353
+ * surface: the IR-cut switching MODE plus the two knobs that gate it
10354
+ * (photocell `sensitivity` + `switchDelaySec`). Each vendor maps these
10355
+ * onto its own ISAPI / Baichuan / Dahua-CGI fields; the cap standardises
10356
+ * the shape so ONE derived-form renders every camera.
10357
+ *
10358
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
10359
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
10360
+ * injected from `status`) reports the live values, and a single
10361
+ * `setSettings` mutation applies a partial change. No hand-written
10362
+ * settings-contribution methods — the framework derives the UI + save
10363
+ * routing from this surface.
10364
+ */
10365
+ /** IR-cut switching mode. `schedule` = time-of-day table configured on the camera. */
10366
+ var DayNightModeSchema = _enum([
10367
+ "auto",
10368
+ "day",
10369
+ "night",
10370
+ "schedule"
10371
+ ]);
10372
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
10373
+ * getOptions availability convention. Normalized values are 0–100. */
10374
+ var NormalizedRangeSchema$1 = object({
10375
+ min: number(),
10376
+ max: number(),
10377
+ step: number()
10378
+ });
10379
+ object({
10380
+ mode: DayNightModeSchema,
10381
+ /** IR-cut trigger sensitivity, NORMALIZED 0–100 (higher = switches to night sooner). */
10382
+ sensitivity: number().optional(),
10383
+ /** Delay before the IR-cut filter flips, in seconds. */
10384
+ switchDelaySec: number().optional(),
10385
+ lastFetchedAt: number()
10386
+ });
10387
+ /**
10388
+ * Per-camera availability descriptor — drives which controls the admin UI
10389
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
10390
+ * (normalized 0–100); the mode choice-set as an array. A provider returns
10391
+ * honest, camera-probed values — never hardcoded.
10392
+ */
10393
+ var DayNightOptionsSchema = object({
10394
+ /** Modes this camera accepts. Empty → the camera has no configurable day/night mode. */
10395
+ modes: array(DayNightModeSchema),
10396
+ supportsSensitivity: boolean(),
10397
+ /** Present when `supportsSensitivity` — the normalized 0–100 range. */
10398
+ sensitivity: NormalizedRangeSchema$1.optional(),
10399
+ supportsSwitchDelay: boolean(),
10400
+ /** Present when `supportsSwitchDelay` — the allowed delay range in seconds. */
10401
+ switchDelaySec: NormalizedRangeSchema$1.optional()
10402
+ });
10403
+ /**
10404
+ * Partial change to the day/night config — every field optional. A
10405
+ * provider ignores fields it does not support.
10406
+ */
10407
+ var DayNightSettingsPatchSchema = object({
10408
+ mode: DayNightModeSchema.optional(),
10409
+ sensitivity: number().optional(),
10410
+ switchDelaySec: number().optional()
10411
+ });
10412
+ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema), method(object({
10413
+ deviceId: number(),
10414
+ settings: DayNightSettingsPatchSchema
10415
+ }), _void(), {
10416
+ kind: "mutation",
10417
+ auth: "admin"
10418
+ });
10419
+ /**
10334
10420
  * Identity envelope for a device's upstream-system metadata.
10335
10421
  *
10336
10422
  * Two jobs:
@@ -10686,6 +10772,130 @@ object({
10686
10772
  });
10687
10773
  DeviceType.Image;
10688
10774
  /**
10775
+ * Vendor-neutral image / picture-adjustment cap — the per-camera config
10776
+ * cap shared by reolink / hikvision / amcrest. Models the common ISP
10777
+ * surface: the four picture sliders (brightness / contrast / saturation /
10778
+ * sharpness), orientation (mirror / flip / rotate), white-balance,
10779
+ * exposure and backlight-compensation modes.
10780
+ *
10781
+ * NORMALIZATION: every slider is a normalized int 0–100. Vendors expose
10782
+ * these natively as 0–100 or 0–255 (or other ranges); each provider maps
10783
+ * its native range to/from this normalized 0–100 space so the cap surface
10784
+ * (and the derived form) is identical across cameras. `warmth` (manual
10785
+ * white-balance) is likewise normalized 0–100.
10786
+ *
10787
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
10788
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
10789
+ * injected from `status`) reports the live values, and a single
10790
+ * `setSettings` mutation applies a partial change. No hand-written
10791
+ * settings-contribution methods — the framework derives the UI + save
10792
+ * routing from this surface.
10793
+ */
10794
+ /** Sensor/image rotation, degrees clockwise. */
10795
+ var ImageRotateSchema = _enum([
10796
+ "0",
10797
+ "90",
10798
+ "180",
10799
+ "270"
10800
+ ]);
10801
+ /** White-balance mode. `manual` unlocks the normalized `warmth` knob. */
10802
+ var WhiteBalanceModeSchema = _enum(["auto", "manual"]);
10803
+ /** Exposure mode. */
10804
+ var ExposureModeSchema = _enum(["auto", "manual"]);
10805
+ /**
10806
+ * Backlight-compensation mode:
10807
+ * - `off` — disabled
10808
+ * - `blc` — backlight compensation
10809
+ * - `wdr` — wide dynamic range
10810
+ * - `hlc` — highlight compensation
10811
+ */
10812
+ var BacklightModeSchema = _enum([
10813
+ "off",
10814
+ "blc",
10815
+ "wdr",
10816
+ "hlc"
10817
+ ]);
10818
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
10819
+ * getOptions availability convention. Slider values are normalized 0–100. */
10820
+ var NormalizedRangeSchema = object({
10821
+ min: number(),
10822
+ max: number(),
10823
+ step: number()
10824
+ });
10825
+ object({
10826
+ /** Normalized 0–100. */
10827
+ brightness: number().optional(),
10828
+ /** Normalized 0–100. */
10829
+ contrast: number().optional(),
10830
+ /** Normalized 0–100. */
10831
+ saturation: number().optional(),
10832
+ /** Normalized 0–100. */
10833
+ sharpness: number().optional(),
10834
+ mirror: boolean().optional(),
10835
+ flip: boolean().optional(),
10836
+ rotate: ImageRotateSchema.optional(),
10837
+ whiteBalance: WhiteBalanceModeSchema.optional(),
10838
+ /** Manual white-balance warmth, NORMALIZED 0–100. Meaningful only when `whiteBalance === 'manual'`. */
10839
+ warmth: number().optional(),
10840
+ exposureMode: ExposureModeSchema.optional(),
10841
+ backlightMode: BacklightModeSchema.optional(),
10842
+ lastFetchedAt: number()
10843
+ });
10844
+ /**
10845
+ * Per-camera availability descriptor — drives which controls the admin UI
10846
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
10847
+ * (the normalized 0–100 range); enums as arrays of supported values (empty
10848
+ * array → control hidden). A provider returns honest, camera-probed values
10849
+ * — never hardcoded.
10850
+ */
10851
+ var ImageSettingsOptionsSchema = object({
10852
+ supportsBrightness: boolean(),
10853
+ brightness: NormalizedRangeSchema.optional(),
10854
+ supportsContrast: boolean(),
10855
+ contrast: NormalizedRangeSchema.optional(),
10856
+ supportsSaturation: boolean(),
10857
+ saturation: NormalizedRangeSchema.optional(),
10858
+ supportsSharpness: boolean(),
10859
+ sharpness: NormalizedRangeSchema.optional(),
10860
+ supportsMirror: boolean(),
10861
+ supportsFlip: boolean(),
10862
+ /** Supported rotation values. Empty → rotation not configurable. */
10863
+ rotateOptions: array(ImageRotateSchema),
10864
+ /** Supported white-balance modes. Empty → white-balance not configurable. */
10865
+ whiteBalanceModes: array(WhiteBalanceModeSchema),
10866
+ supportsWarmth: boolean(),
10867
+ /** Present when `supportsWarmth` — the normalized 0–100 range. */
10868
+ warmth: NormalizedRangeSchema.optional(),
10869
+ /** Supported exposure modes. Empty → exposure not configurable. */
10870
+ exposureModes: array(ExposureModeSchema),
10871
+ /** Supported backlight modes. Empty → backlight-compensation not configurable. */
10872
+ backlightModes: array(BacklightModeSchema)
10873
+ });
10874
+ /**
10875
+ * Partial change to the image config — every field optional. Slider values
10876
+ * are normalized 0–100. A provider ignores fields it does not support.
10877
+ */
10878
+ var ImageSettingsPatchSchema = object({
10879
+ brightness: number().optional(),
10880
+ contrast: number().optional(),
10881
+ saturation: number().optional(),
10882
+ sharpness: number().optional(),
10883
+ mirror: boolean().optional(),
10884
+ flip: boolean().optional(),
10885
+ rotate: ImageRotateSchema.optional(),
10886
+ whiteBalance: WhiteBalanceModeSchema.optional(),
10887
+ warmth: number().optional(),
10888
+ exposureMode: ExposureModeSchema.optional(),
10889
+ backlightMode: BacklightModeSchema.optional()
10890
+ });
10891
+ DeviceType.Camera, method(object({ deviceId: number() }), ImageSettingsOptionsSchema), method(object({
10892
+ deviceId: number(),
10893
+ settings: ImageSettingsPatchSchema
10894
+ }), _void(), {
10895
+ kind: "mutation",
10896
+ auth: "admin"
10897
+ });
10898
+ /**
10689
10899
  * Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
10690
10900
  * with a mowing lifecycle plus a dock action.
10691
10901
  *
@@ -11728,6 +11938,16 @@ var RunnerCameraConfigSchema = object({
11728
11938
  * this gate is bypassed.
11729
11939
  */
11730
11940
  onboardMotionDrivesAnalyzer: boolean().default(true),
11941
+ /**
11942
+ * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
11943
+ * never arms the periodic recheck timer, regardless of `occupancyRecheckSec` —
11944
+ * this is off by default because the recheck re-subscribes a detection session
11945
+ * every N seconds while `watching`, a major source of pull-decoder re-dial
11946
+ * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
11947
+ * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
11948
+ * (and only render) when this is enabled.
11949
+ */
11950
+ occupancyRecheckEnabled: boolean().default(false),
11731
11951
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
11732
11952
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
11733
11953
  /**
@@ -20406,6 +20626,18 @@ Object.freeze({
20406
20626
  addonId: null,
20407
20627
  access: "view"
20408
20628
  },
20629
+ "dayNight.getOptions": {
20630
+ capName: "day-night",
20631
+ capScope: "device",
20632
+ addonId: null,
20633
+ access: "view"
20634
+ },
20635
+ "dayNight.setSettings": {
20636
+ capName: "day-night",
20637
+ capScope: "device",
20638
+ addonId: null,
20639
+ access: "create"
20640
+ },
20409
20641
  "decoder.createSession": {
20410
20642
  capName: "decoder",
20411
20643
  capScope: "system",
@@ -21336,6 +21568,18 @@ Object.freeze({
21336
21568
  addonId: null,
21337
21569
  access: "create"
21338
21570
  },
21571
+ "imageSettings.getOptions": {
21572
+ capName: "image-settings",
21573
+ capScope: "device",
21574
+ addonId: null,
21575
+ access: "view"
21576
+ },
21577
+ "imageSettings.setSettings": {
21578
+ capName: "image-settings",
21579
+ capScope: "device",
21580
+ addonId: null,
21581
+ access: "create"
21582
+ },
21339
21583
  "integrations.create": {
21340
21584
  capName: "integrations",
21341
21585
  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";
@@ -7418,7 +7418,16 @@ var DecoderStatsSchema = object({
7418
7418
  inputFps: number(),
7419
7419
  outputFps: number(),
7420
7420
  avgDecodeTimeMs: number(),
7421
- droppedFrames: number()
7421
+ droppedFrames: number(),
7422
+ /**
7423
+ * Pull-mode adaptive-fps telemetry (optional — only pull sessions run the
7424
+ * lag-driven controller; push sessions omit these). `lagMs` is the EWMA of
7425
+ * the decoder's real-time drift (rising = falling behind live); `adaptiveFps`
7426
+ * is the current lag-throttled emit rate (≤ `effectiveFps` ceiling).
7427
+ */
7428
+ lagMs: number().optional(),
7429
+ effectiveFps: number().optional(),
7430
+ adaptiveFps: number().optional()
7422
7431
  });
7423
7432
  var DecoderSessionConfigSchema = object({
7424
7433
  codec: string(),
@@ -7459,7 +7468,15 @@ var DecoderSessionConfigSchema = object({
7459
7468
  * other — `pullFrames` returns nothing for an `'shm'` session and
7460
7469
  * `pullHandles` returns nothing for a `'callback'` session.
7461
7470
  */
7462
- frameSink: _enum(["callback", "shm"]).default("callback")
7471
+ frameSink: _enum(["callback", "shm"]).default("callback"),
7472
+ /**
7473
+ * Per-camera decoder DEBUG facility. When `true`, a pull-mode session emits
7474
+ * a throttled (~1Hz) structured `decoder debug` line (effective/adaptive fps,
7475
+ * real-time lag, dropped-frame delta, avg decode time, hwaccel). Mirrors the
7476
+ * stream-broker's `streamingDebug` gate — off by default so production logs
7477
+ * stay quiet and the emit path pays zero per-frame cost when disabled.
7478
+ */
7479
+ debug: boolean().optional()
7463
7480
  });
7464
7481
  var EncodeProfileSchema = object({
7465
7482
  video: object({
@@ -10331,6 +10348,75 @@ DeviceType.Cover, method(object({ deviceId: number().int().nonnegative() }), _vo
10331
10348
  auth: "admin"
10332
10349
  });
10333
10350
  /**
10351
+ * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
10352
+ * shared by reolink / hikvision / amcrest. Models the common firmware
10353
+ * surface: the IR-cut switching MODE plus the two knobs that gate it
10354
+ * (photocell `sensitivity` + `switchDelaySec`). Each vendor maps these
10355
+ * onto its own ISAPI / Baichuan / Dahua-CGI fields; the cap standardises
10356
+ * the shape so ONE derived-form renders every camera.
10357
+ *
10358
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
10359
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
10360
+ * injected from `status`) reports the live values, and a single
10361
+ * `setSettings` mutation applies a partial change. No hand-written
10362
+ * settings-contribution methods — the framework derives the UI + save
10363
+ * routing from this surface.
10364
+ */
10365
+ /** IR-cut switching mode. `schedule` = time-of-day table configured on the camera. */
10366
+ var DayNightModeSchema = _enum([
10367
+ "auto",
10368
+ "day",
10369
+ "night",
10370
+ "schedule"
10371
+ ]);
10372
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
10373
+ * getOptions availability convention. Normalized values are 0–100. */
10374
+ var NormalizedRangeSchema$1 = object({
10375
+ min: number(),
10376
+ max: number(),
10377
+ step: number()
10378
+ });
10379
+ object({
10380
+ mode: DayNightModeSchema,
10381
+ /** IR-cut trigger sensitivity, NORMALIZED 0–100 (higher = switches to night sooner). */
10382
+ sensitivity: number().optional(),
10383
+ /** Delay before the IR-cut filter flips, in seconds. */
10384
+ switchDelaySec: number().optional(),
10385
+ lastFetchedAt: number()
10386
+ });
10387
+ /**
10388
+ * Per-camera availability descriptor — drives which controls the admin UI
10389
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
10390
+ * (normalized 0–100); the mode choice-set as an array. A provider returns
10391
+ * honest, camera-probed values — never hardcoded.
10392
+ */
10393
+ var DayNightOptionsSchema = object({
10394
+ /** Modes this camera accepts. Empty → the camera has no configurable day/night mode. */
10395
+ modes: array(DayNightModeSchema),
10396
+ supportsSensitivity: boolean(),
10397
+ /** Present when `supportsSensitivity` — the normalized 0–100 range. */
10398
+ sensitivity: NormalizedRangeSchema$1.optional(),
10399
+ supportsSwitchDelay: boolean(),
10400
+ /** Present when `supportsSwitchDelay` — the allowed delay range in seconds. */
10401
+ switchDelaySec: NormalizedRangeSchema$1.optional()
10402
+ });
10403
+ /**
10404
+ * Partial change to the day/night config — every field optional. A
10405
+ * provider ignores fields it does not support.
10406
+ */
10407
+ var DayNightSettingsPatchSchema = object({
10408
+ mode: DayNightModeSchema.optional(),
10409
+ sensitivity: number().optional(),
10410
+ switchDelaySec: number().optional()
10411
+ });
10412
+ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema), method(object({
10413
+ deviceId: number(),
10414
+ settings: DayNightSettingsPatchSchema
10415
+ }), _void(), {
10416
+ kind: "mutation",
10417
+ auth: "admin"
10418
+ });
10419
+ /**
10334
10420
  * Identity envelope for a device's upstream-system metadata.
10335
10421
  *
10336
10422
  * Two jobs:
@@ -10686,6 +10772,130 @@ object({
10686
10772
  });
10687
10773
  DeviceType.Image;
10688
10774
  /**
10775
+ * Vendor-neutral image / picture-adjustment cap — the per-camera config
10776
+ * cap shared by reolink / hikvision / amcrest. Models the common ISP
10777
+ * surface: the four picture sliders (brightness / contrast / saturation /
10778
+ * sharpness), orientation (mirror / flip / rotate), white-balance,
10779
+ * exposure and backlight-compensation modes.
10780
+ *
10781
+ * NORMALIZATION: every slider is a normalized int 0–100. Vendors expose
10782
+ * these natively as 0–100 or 0–255 (or other ranges); each provider maps
10783
+ * its native range to/from this normalized 0–100 space so the cap surface
10784
+ * (and the derived form) is identical across cameras. `warmth` (manual
10785
+ * white-balance) is likewise normalized 0–100.
10786
+ *
10787
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
10788
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
10789
+ * injected from `status`) reports the live values, and a single
10790
+ * `setSettings` mutation applies a partial change. No hand-written
10791
+ * settings-contribution methods — the framework derives the UI + save
10792
+ * routing from this surface.
10793
+ */
10794
+ /** Sensor/image rotation, degrees clockwise. */
10795
+ var ImageRotateSchema = _enum([
10796
+ "0",
10797
+ "90",
10798
+ "180",
10799
+ "270"
10800
+ ]);
10801
+ /** White-balance mode. `manual` unlocks the normalized `warmth` knob. */
10802
+ var WhiteBalanceModeSchema = _enum(["auto", "manual"]);
10803
+ /** Exposure mode. */
10804
+ var ExposureModeSchema = _enum(["auto", "manual"]);
10805
+ /**
10806
+ * Backlight-compensation mode:
10807
+ * - `off` — disabled
10808
+ * - `blc` — backlight compensation
10809
+ * - `wdr` — wide dynamic range
10810
+ * - `hlc` — highlight compensation
10811
+ */
10812
+ var BacklightModeSchema = _enum([
10813
+ "off",
10814
+ "blc",
10815
+ "wdr",
10816
+ "hlc"
10817
+ ]);
10818
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
10819
+ * getOptions availability convention. Slider values are normalized 0–100. */
10820
+ var NormalizedRangeSchema = object({
10821
+ min: number(),
10822
+ max: number(),
10823
+ step: number()
10824
+ });
10825
+ object({
10826
+ /** Normalized 0–100. */
10827
+ brightness: number().optional(),
10828
+ /** Normalized 0–100. */
10829
+ contrast: number().optional(),
10830
+ /** Normalized 0–100. */
10831
+ saturation: number().optional(),
10832
+ /** Normalized 0–100. */
10833
+ sharpness: number().optional(),
10834
+ mirror: boolean().optional(),
10835
+ flip: boolean().optional(),
10836
+ rotate: ImageRotateSchema.optional(),
10837
+ whiteBalance: WhiteBalanceModeSchema.optional(),
10838
+ /** Manual white-balance warmth, NORMALIZED 0–100. Meaningful only when `whiteBalance === 'manual'`. */
10839
+ warmth: number().optional(),
10840
+ exposureMode: ExposureModeSchema.optional(),
10841
+ backlightMode: BacklightModeSchema.optional(),
10842
+ lastFetchedAt: number()
10843
+ });
10844
+ /**
10845
+ * Per-camera availability descriptor — drives which controls the admin UI
10846
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
10847
+ * (the normalized 0–100 range); enums as arrays of supported values (empty
10848
+ * array → control hidden). A provider returns honest, camera-probed values
10849
+ * — never hardcoded.
10850
+ */
10851
+ var ImageSettingsOptionsSchema = object({
10852
+ supportsBrightness: boolean(),
10853
+ brightness: NormalizedRangeSchema.optional(),
10854
+ supportsContrast: boolean(),
10855
+ contrast: NormalizedRangeSchema.optional(),
10856
+ supportsSaturation: boolean(),
10857
+ saturation: NormalizedRangeSchema.optional(),
10858
+ supportsSharpness: boolean(),
10859
+ sharpness: NormalizedRangeSchema.optional(),
10860
+ supportsMirror: boolean(),
10861
+ supportsFlip: boolean(),
10862
+ /** Supported rotation values. Empty → rotation not configurable. */
10863
+ rotateOptions: array(ImageRotateSchema),
10864
+ /** Supported white-balance modes. Empty → white-balance not configurable. */
10865
+ whiteBalanceModes: array(WhiteBalanceModeSchema),
10866
+ supportsWarmth: boolean(),
10867
+ /** Present when `supportsWarmth` — the normalized 0–100 range. */
10868
+ warmth: NormalizedRangeSchema.optional(),
10869
+ /** Supported exposure modes. Empty → exposure not configurable. */
10870
+ exposureModes: array(ExposureModeSchema),
10871
+ /** Supported backlight modes. Empty → backlight-compensation not configurable. */
10872
+ backlightModes: array(BacklightModeSchema)
10873
+ });
10874
+ /**
10875
+ * Partial change to the image config — every field optional. Slider values
10876
+ * are normalized 0–100. A provider ignores fields it does not support.
10877
+ */
10878
+ var ImageSettingsPatchSchema = object({
10879
+ brightness: number().optional(),
10880
+ contrast: number().optional(),
10881
+ saturation: number().optional(),
10882
+ sharpness: number().optional(),
10883
+ mirror: boolean().optional(),
10884
+ flip: boolean().optional(),
10885
+ rotate: ImageRotateSchema.optional(),
10886
+ whiteBalance: WhiteBalanceModeSchema.optional(),
10887
+ warmth: number().optional(),
10888
+ exposureMode: ExposureModeSchema.optional(),
10889
+ backlightMode: BacklightModeSchema.optional()
10890
+ });
10891
+ DeviceType.Camera, method(object({ deviceId: number() }), ImageSettingsOptionsSchema), method(object({
10892
+ deviceId: number(),
10893
+ settings: ImageSettingsPatchSchema
10894
+ }), _void(), {
10895
+ kind: "mutation",
10896
+ auth: "admin"
10897
+ });
10898
+ /**
10689
10899
  * Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
10690
10900
  * with a mowing lifecycle plus a dock action.
10691
10901
  *
@@ -11728,6 +11938,16 @@ var RunnerCameraConfigSchema = object({
11728
11938
  * this gate is bypassed.
11729
11939
  */
11730
11940
  onboardMotionDrivesAnalyzer: boolean().default(true),
11941
+ /**
11942
+ * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
11943
+ * never arms the periodic recheck timer, regardless of `occupancyRecheckSec` —
11944
+ * this is off by default because the recheck re-subscribes a detection session
11945
+ * every N seconds while `watching`, a major source of pull-decoder re-dial
11946
+ * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
11947
+ * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
11948
+ * (and only render) when this is enabled.
11949
+ */
11950
+ occupancyRecheckEnabled: boolean().default(false),
11731
11951
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
11732
11952
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
11733
11953
  /**
@@ -20406,6 +20626,18 @@ Object.freeze({
20406
20626
  addonId: null,
20407
20627
  access: "view"
20408
20628
  },
20629
+ "dayNight.getOptions": {
20630
+ capName: "day-night",
20631
+ capScope: "device",
20632
+ addonId: null,
20633
+ access: "view"
20634
+ },
20635
+ "dayNight.setSettings": {
20636
+ capName: "day-night",
20637
+ capScope: "device",
20638
+ addonId: null,
20639
+ access: "create"
20640
+ },
20409
20641
  "decoder.createSession": {
20410
20642
  capName: "decoder",
20411
20643
  capScope: "system",
@@ -21336,6 +21568,18 @@ Object.freeze({
21336
21568
  addonId: null,
21337
21569
  access: "create"
21338
21570
  },
21571
+ "imageSettings.getOptions": {
21572
+ capName: "image-settings",
21573
+ capScope: "device",
21574
+ addonId: null,
21575
+ access: "view"
21576
+ },
21577
+ "imageSettings.setSettings": {
21578
+ capName: "image-settings",
21579
+ capScope: "device",
21580
+ addonId: null,
21581
+ access: "create"
21582
+ },
21339
21583
  "integrations.create": {
21340
21584
  capName: "integrations",
21341
21585
  capScope: "system",