@camstack/addon-provider-onvif 1.1.15 → 1.1.17

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";
@@ -7238,7 +7238,16 @@ var DecoderStatsSchema = object({
7238
7238
  inputFps: number(),
7239
7239
  outputFps: number(),
7240
7240
  avgDecodeTimeMs: number(),
7241
- droppedFrames: number()
7241
+ droppedFrames: number(),
7242
+ /**
7243
+ * Pull-mode adaptive-fps telemetry (optional — only pull sessions run the
7244
+ * lag-driven controller; push sessions omit these). `lagMs` is the EWMA of
7245
+ * the decoder's real-time drift (rising = falling behind live); `adaptiveFps`
7246
+ * is the current lag-throttled emit rate (≤ `effectiveFps` ceiling).
7247
+ */
7248
+ lagMs: number().optional(),
7249
+ effectiveFps: number().optional(),
7250
+ adaptiveFps: number().optional()
7242
7251
  });
7243
7252
  var DecoderSessionConfigSchema = object({
7244
7253
  codec: string(),
@@ -7279,7 +7288,15 @@ var DecoderSessionConfigSchema = object({
7279
7288
  * other — `pullFrames` returns nothing for an `'shm'` session and
7280
7289
  * `pullHandles` returns nothing for a `'callback'` session.
7281
7290
  */
7282
- frameSink: _enum(["callback", "shm"]).default("callback")
7291
+ frameSink: _enum(["callback", "shm"]).default("callback"),
7292
+ /**
7293
+ * Per-camera decoder DEBUG facility. When `true`, a pull-mode session emits
7294
+ * a throttled (~1Hz) structured `decoder debug` line (effective/adaptive fps,
7295
+ * real-time lag, dropped-frame delta, avg decode time, hwaccel). Mirrors the
7296
+ * stream-broker's `streamingDebug` gate — off by default so production logs
7297
+ * stay quiet and the emit path pays zero per-frame cost when disabled.
7298
+ */
7299
+ debug: boolean().optional()
7283
7300
  });
7284
7301
  var EncodeProfileSchema = object({
7285
7302
  video: object({
@@ -9541,6 +9558,75 @@ DeviceType.Cover, method(object({ deviceId: number().int().nonnegative() }), _vo
9541
9558
  auth: "admin"
9542
9559
  });
9543
9560
  /**
9561
+ * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
9562
+ * shared by reolink / hikvision / amcrest. Models the common firmware
9563
+ * surface: the IR-cut switching MODE plus the two knobs that gate it
9564
+ * (photocell `sensitivity` + `switchDelaySec`). Each vendor maps these
9565
+ * onto its own ISAPI / Baichuan / Dahua-CGI fields; the cap standardises
9566
+ * the shape so ONE derived-form renders every camera.
9567
+ *
9568
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9569
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9570
+ * injected from `status`) reports the live values, and a single
9571
+ * `setSettings` mutation applies a partial change. No hand-written
9572
+ * settings-contribution methods — the framework derives the UI + save
9573
+ * routing from this surface.
9574
+ */
9575
+ /** IR-cut switching mode. `schedule` = time-of-day table configured on the camera. */
9576
+ var DayNightModeSchema = _enum([
9577
+ "auto",
9578
+ "day",
9579
+ "night",
9580
+ "schedule"
9581
+ ]);
9582
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9583
+ * getOptions availability convention. Normalized values are 0–100. */
9584
+ var NormalizedRangeSchema$1 = object({
9585
+ min: number(),
9586
+ max: number(),
9587
+ step: number()
9588
+ });
9589
+ object({
9590
+ mode: DayNightModeSchema,
9591
+ /** IR-cut trigger sensitivity, NORMALIZED 0–100 (higher = switches to night sooner). */
9592
+ sensitivity: number().optional(),
9593
+ /** Delay before the IR-cut filter flips, in seconds. */
9594
+ switchDelaySec: number().optional(),
9595
+ lastFetchedAt: number()
9596
+ });
9597
+ /**
9598
+ * Per-camera availability descriptor — drives which controls the admin UI
9599
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9600
+ * (normalized 0–100); the mode choice-set as an array. A provider returns
9601
+ * honest, camera-probed values — never hardcoded.
9602
+ */
9603
+ var DayNightOptionsSchema = object({
9604
+ /** Modes this camera accepts. Empty → the camera has no configurable day/night mode. */
9605
+ modes: array(DayNightModeSchema),
9606
+ supportsSensitivity: boolean(),
9607
+ /** Present when `supportsSensitivity` — the normalized 0–100 range. */
9608
+ sensitivity: NormalizedRangeSchema$1.optional(),
9609
+ supportsSwitchDelay: boolean(),
9610
+ /** Present when `supportsSwitchDelay` — the allowed delay range in seconds. */
9611
+ switchDelaySec: NormalizedRangeSchema$1.optional()
9612
+ });
9613
+ /**
9614
+ * Partial change to the day/night config — every field optional. A
9615
+ * provider ignores fields it does not support.
9616
+ */
9617
+ var DayNightSettingsPatchSchema = object({
9618
+ mode: DayNightModeSchema.optional(),
9619
+ sensitivity: number().optional(),
9620
+ switchDelaySec: number().optional()
9621
+ });
9622
+ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema), method(object({
9623
+ deviceId: number(),
9624
+ settings: DayNightSettingsPatchSchema
9625
+ }), _void(), {
9626
+ kind: "mutation",
9627
+ auth: "admin"
9628
+ });
9629
+ /**
9544
9630
  * Identity envelope for a device's upstream-system metadata.
9545
9631
  *
9546
9632
  * Two jobs:
@@ -9896,6 +9982,130 @@ object({
9896
9982
  });
9897
9983
  DeviceType.Image;
9898
9984
  /**
9985
+ * Vendor-neutral image / picture-adjustment cap — the per-camera config
9986
+ * cap shared by reolink / hikvision / amcrest. Models the common ISP
9987
+ * surface: the four picture sliders (brightness / contrast / saturation /
9988
+ * sharpness), orientation (mirror / flip / rotate), white-balance,
9989
+ * exposure and backlight-compensation modes.
9990
+ *
9991
+ * NORMALIZATION: every slider is a normalized int 0–100. Vendors expose
9992
+ * these natively as 0–100 or 0–255 (or other ranges); each provider maps
9993
+ * its native range to/from this normalized 0–100 space so the cap surface
9994
+ * (and the derived form) is identical across cameras. `warmth` (manual
9995
+ * white-balance) is likewise normalized 0–100.
9996
+ *
9997
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9998
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9999
+ * injected from `status`) reports the live values, and a single
10000
+ * `setSettings` mutation applies a partial change. No hand-written
10001
+ * settings-contribution methods — the framework derives the UI + save
10002
+ * routing from this surface.
10003
+ */
10004
+ /** Sensor/image rotation, degrees clockwise. */
10005
+ var ImageRotateSchema = _enum([
10006
+ "0",
10007
+ "90",
10008
+ "180",
10009
+ "270"
10010
+ ]);
10011
+ /** White-balance mode. `manual` unlocks the normalized `warmth` knob. */
10012
+ var WhiteBalanceModeSchema = _enum(["auto", "manual"]);
10013
+ /** Exposure mode. */
10014
+ var ExposureModeSchema = _enum(["auto", "manual"]);
10015
+ /**
10016
+ * Backlight-compensation mode:
10017
+ * - `off` — disabled
10018
+ * - `blc` — backlight compensation
10019
+ * - `wdr` — wide dynamic range
10020
+ * - `hlc` — highlight compensation
10021
+ */
10022
+ var BacklightModeSchema = _enum([
10023
+ "off",
10024
+ "blc",
10025
+ "wdr",
10026
+ "hlc"
10027
+ ]);
10028
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
10029
+ * getOptions availability convention. Slider values are normalized 0–100. */
10030
+ var NormalizedRangeSchema = object({
10031
+ min: number(),
10032
+ max: number(),
10033
+ step: number()
10034
+ });
10035
+ object({
10036
+ /** Normalized 0–100. */
10037
+ brightness: number().optional(),
10038
+ /** Normalized 0–100. */
10039
+ contrast: number().optional(),
10040
+ /** Normalized 0–100. */
10041
+ saturation: number().optional(),
10042
+ /** Normalized 0–100. */
10043
+ sharpness: number().optional(),
10044
+ mirror: boolean().optional(),
10045
+ flip: boolean().optional(),
10046
+ rotate: ImageRotateSchema.optional(),
10047
+ whiteBalance: WhiteBalanceModeSchema.optional(),
10048
+ /** Manual white-balance warmth, NORMALIZED 0–100. Meaningful only when `whiteBalance === 'manual'`. */
10049
+ warmth: number().optional(),
10050
+ exposureMode: ExposureModeSchema.optional(),
10051
+ backlightMode: BacklightModeSchema.optional(),
10052
+ lastFetchedAt: number()
10053
+ });
10054
+ /**
10055
+ * Per-camera availability descriptor — drives which controls the admin UI
10056
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
10057
+ * (the normalized 0–100 range); enums as arrays of supported values (empty
10058
+ * array → control hidden). A provider returns honest, camera-probed values
10059
+ * — never hardcoded.
10060
+ */
10061
+ var ImageSettingsOptionsSchema = object({
10062
+ supportsBrightness: boolean(),
10063
+ brightness: NormalizedRangeSchema.optional(),
10064
+ supportsContrast: boolean(),
10065
+ contrast: NormalizedRangeSchema.optional(),
10066
+ supportsSaturation: boolean(),
10067
+ saturation: NormalizedRangeSchema.optional(),
10068
+ supportsSharpness: boolean(),
10069
+ sharpness: NormalizedRangeSchema.optional(),
10070
+ supportsMirror: boolean(),
10071
+ supportsFlip: boolean(),
10072
+ /** Supported rotation values. Empty → rotation not configurable. */
10073
+ rotateOptions: array(ImageRotateSchema),
10074
+ /** Supported white-balance modes. Empty → white-balance not configurable. */
10075
+ whiteBalanceModes: array(WhiteBalanceModeSchema),
10076
+ supportsWarmth: boolean(),
10077
+ /** Present when `supportsWarmth` — the normalized 0–100 range. */
10078
+ warmth: NormalizedRangeSchema.optional(),
10079
+ /** Supported exposure modes. Empty → exposure not configurable. */
10080
+ exposureModes: array(ExposureModeSchema),
10081
+ /** Supported backlight modes. Empty → backlight-compensation not configurable. */
10082
+ backlightModes: array(BacklightModeSchema)
10083
+ });
10084
+ /**
10085
+ * Partial change to the image config — every field optional. Slider values
10086
+ * are normalized 0–100. A provider ignores fields it does not support.
10087
+ */
10088
+ var ImageSettingsPatchSchema = object({
10089
+ brightness: number().optional(),
10090
+ contrast: number().optional(),
10091
+ saturation: number().optional(),
10092
+ sharpness: number().optional(),
10093
+ mirror: boolean().optional(),
10094
+ flip: boolean().optional(),
10095
+ rotate: ImageRotateSchema.optional(),
10096
+ whiteBalance: WhiteBalanceModeSchema.optional(),
10097
+ warmth: number().optional(),
10098
+ exposureMode: ExposureModeSchema.optional(),
10099
+ backlightMode: BacklightModeSchema.optional()
10100
+ });
10101
+ DeviceType.Camera, method(object({ deviceId: number() }), ImageSettingsOptionsSchema), method(object({
10102
+ deviceId: number(),
10103
+ settings: ImageSettingsPatchSchema
10104
+ }), _void(), {
10105
+ kind: "mutation",
10106
+ auth: "admin"
10107
+ });
10108
+ /**
9899
10109
  * Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
9900
10110
  * with a mowing lifecycle plus a dock action.
9901
10111
  *
@@ -10790,6 +11000,16 @@ var RunnerCameraConfigSchema = object({
10790
11000
  * this gate is bypassed.
10791
11001
  */
10792
11002
  onboardMotionDrivesAnalyzer: boolean().default(true),
11003
+ /**
11004
+ * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
11005
+ * never arms the periodic recheck timer, regardless of `occupancyRecheckSec` —
11006
+ * this is off by default because the recheck re-subscribes a detection session
11007
+ * every N seconds while `watching`, a major source of pull-decoder re-dial
11008
+ * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
11009
+ * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
11010
+ * (and only render) when this is enabled.
11011
+ */
11012
+ occupancyRecheckEnabled: boolean().default(false),
10793
11013
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
10794
11014
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
10795
11015
  /**
@@ -13380,7 +13600,9 @@ method(object({ codec: string() }), boolean()), method(_void(), object({
13380
13600
  id: string(),
13381
13601
  name: string(),
13382
13602
  isPullMode: boolean().optional(),
13383
- priority: number().optional()
13603
+ priority: number().optional(),
13604
+ hwaccel: string().optional(),
13605
+ probedBestHwaccel: string().optional()
13384
13606
  })), method(DecoderSessionConfigSchema, object({
13385
13607
  sessionId: string(),
13386
13608
  nodeId: string()
@@ -15294,7 +15516,17 @@ var AgentAddonConfigSchema = object({
15294
15516
  });
15295
15517
  var AgentPipelineSettingsSchema = object({
15296
15518
  addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
15297
- maxCameras: number().int().nonnegative().nullable().default(null)
15519
+ maxCameras: number().int().nonnegative().nullable().default(null),
15520
+ /** Per-node detection weight (relative share for the quota balancer). */
15521
+ detectWeight: number().positive().optional(),
15522
+ /** Node is eligible to run the detection pipeline (decode + inference). */
15523
+ detect: boolean().optional(),
15524
+ /** Node is eligible to host decoder sessions. */
15525
+ decode: boolean().optional(),
15526
+ /** Node is eligible to run audio-analyzer sessions. */
15527
+ audio: boolean().optional(),
15528
+ /** Node is eligible to be the ingest / source-owner (serve the restream). */
15529
+ ingest: boolean().optional()
15298
15530
  });
15299
15531
  var CameraPipelineForAgentSchema = object({
15300
15532
  steps: array(PipelineStepInputSchema).readonly(),
@@ -15600,6 +15832,21 @@ method(object({
15600
15832
  }), object({ success: literal(true) }), {
15601
15833
  kind: "mutation",
15602
15834
  auth: "admin"
15835
+ }), method(object({
15836
+ agentNodeId: string(),
15837
+ detectWeight: number().positive().nullable()
15838
+ }), object({ success: literal(true) }), {
15839
+ kind: "mutation",
15840
+ auth: "admin"
15841
+ }), method(object({
15842
+ agentNodeId: string(),
15843
+ detect: boolean().nullable().optional(),
15844
+ decode: boolean().nullable().optional(),
15845
+ audio: boolean().nullable().optional(),
15846
+ ingest: boolean().nullable().optional()
15847
+ }), object({ success: literal(true) }), {
15848
+ kind: "mutation",
15849
+ auth: "admin"
15603
15850
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
15604
15851
  deviceId: number(),
15605
15852
  addonId: string(),
@@ -19432,6 +19679,18 @@ Object.freeze({
19432
19679
  addonId: null,
19433
19680
  access: "view"
19434
19681
  },
19682
+ "dayNight.getOptions": {
19683
+ capName: "day-night",
19684
+ capScope: "device",
19685
+ addonId: null,
19686
+ access: "view"
19687
+ },
19688
+ "dayNight.setSettings": {
19689
+ capName: "day-night",
19690
+ capScope: "device",
19691
+ addonId: null,
19692
+ access: "create"
19693
+ },
19435
19694
  "decoder.createSession": {
19436
19695
  capName: "decoder",
19437
19696
  capScope: "system",
@@ -20362,6 +20621,18 @@ Object.freeze({
20362
20621
  addonId: null,
20363
20622
  access: "create"
20364
20623
  },
20624
+ "imageSettings.getOptions": {
20625
+ capName: "image-settings",
20626
+ capScope: "device",
20627
+ addonId: null,
20628
+ access: "view"
20629
+ },
20630
+ "imageSettings.setSettings": {
20631
+ capName: "image-settings",
20632
+ capScope: "device",
20633
+ addonId: null,
20634
+ access: "create"
20635
+ },
20365
20636
  "integrations.create": {
20366
20637
  capName: "integrations",
20367
20638
  capScope: "system",
@@ -21544,6 +21815,18 @@ Object.freeze({
21544
21815
  addonId: null,
21545
21816
  access: "create"
21546
21817
  },
21818
+ "pipelineOrchestrator.setAgentCapabilities": {
21819
+ capName: "pipeline-orchestrator",
21820
+ capScope: "system",
21821
+ addonId: null,
21822
+ access: "create"
21823
+ },
21824
+ "pipelineOrchestrator.setAgentDetectWeight": {
21825
+ capName: "pipeline-orchestrator",
21826
+ capScope: "system",
21827
+ addonId: null,
21828
+ access: "create"
21829
+ },
21547
21830
  "pipelineOrchestrator.setAgentMaxCameras": {
21548
21831
  capName: "pipeline-orchestrator",
21549
21832
  capScope: "system",
package/dist/addon.mjs 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";
@@ -7239,7 +7239,16 @@ var DecoderStatsSchema = object({
7239
7239
  inputFps: number(),
7240
7240
  outputFps: number(),
7241
7241
  avgDecodeTimeMs: number(),
7242
- droppedFrames: number()
7242
+ droppedFrames: number(),
7243
+ /**
7244
+ * Pull-mode adaptive-fps telemetry (optional — only pull sessions run the
7245
+ * lag-driven controller; push sessions omit these). `lagMs` is the EWMA of
7246
+ * the decoder's real-time drift (rising = falling behind live); `adaptiveFps`
7247
+ * is the current lag-throttled emit rate (≤ `effectiveFps` ceiling).
7248
+ */
7249
+ lagMs: number().optional(),
7250
+ effectiveFps: number().optional(),
7251
+ adaptiveFps: number().optional()
7243
7252
  });
7244
7253
  var DecoderSessionConfigSchema = object({
7245
7254
  codec: string(),
@@ -7280,7 +7289,15 @@ var DecoderSessionConfigSchema = object({
7280
7289
  * other — `pullFrames` returns nothing for an `'shm'` session and
7281
7290
  * `pullHandles` returns nothing for a `'callback'` session.
7282
7291
  */
7283
- frameSink: _enum(["callback", "shm"]).default("callback")
7292
+ frameSink: _enum(["callback", "shm"]).default("callback"),
7293
+ /**
7294
+ * Per-camera decoder DEBUG facility. When `true`, a pull-mode session emits
7295
+ * a throttled (~1Hz) structured `decoder debug` line (effective/adaptive fps,
7296
+ * real-time lag, dropped-frame delta, avg decode time, hwaccel). Mirrors the
7297
+ * stream-broker's `streamingDebug` gate — off by default so production logs
7298
+ * stay quiet and the emit path pays zero per-frame cost when disabled.
7299
+ */
7300
+ debug: boolean().optional()
7284
7301
  });
7285
7302
  var EncodeProfileSchema = object({
7286
7303
  video: object({
@@ -9542,6 +9559,75 @@ DeviceType.Cover, method(object({ deviceId: number().int().nonnegative() }), _vo
9542
9559
  auth: "admin"
9543
9560
  });
9544
9561
  /**
9562
+ * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
9563
+ * shared by reolink / hikvision / amcrest. Models the common firmware
9564
+ * surface: the IR-cut switching MODE plus the two knobs that gate it
9565
+ * (photocell `sensitivity` + `switchDelaySec`). Each vendor maps these
9566
+ * onto its own ISAPI / Baichuan / Dahua-CGI fields; the cap standardises
9567
+ * the shape so ONE derived-form renders every camera.
9568
+ *
9569
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9570
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9571
+ * injected from `status`) reports the live values, and a single
9572
+ * `setSettings` mutation applies a partial change. No hand-written
9573
+ * settings-contribution methods — the framework derives the UI + save
9574
+ * routing from this surface.
9575
+ */
9576
+ /** IR-cut switching mode. `schedule` = time-of-day table configured on the camera. */
9577
+ var DayNightModeSchema = _enum([
9578
+ "auto",
9579
+ "day",
9580
+ "night",
9581
+ "schedule"
9582
+ ]);
9583
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9584
+ * getOptions availability convention. Normalized values are 0–100. */
9585
+ var NormalizedRangeSchema$1 = object({
9586
+ min: number(),
9587
+ max: number(),
9588
+ step: number()
9589
+ });
9590
+ object({
9591
+ mode: DayNightModeSchema,
9592
+ /** IR-cut trigger sensitivity, NORMALIZED 0–100 (higher = switches to night sooner). */
9593
+ sensitivity: number().optional(),
9594
+ /** Delay before the IR-cut filter flips, in seconds. */
9595
+ switchDelaySec: number().optional(),
9596
+ lastFetchedAt: number()
9597
+ });
9598
+ /**
9599
+ * Per-camera availability descriptor — drives which controls the admin UI
9600
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9601
+ * (normalized 0–100); the mode choice-set as an array. A provider returns
9602
+ * honest, camera-probed values — never hardcoded.
9603
+ */
9604
+ var DayNightOptionsSchema = object({
9605
+ /** Modes this camera accepts. Empty → the camera has no configurable day/night mode. */
9606
+ modes: array(DayNightModeSchema),
9607
+ supportsSensitivity: boolean(),
9608
+ /** Present when `supportsSensitivity` — the normalized 0–100 range. */
9609
+ sensitivity: NormalizedRangeSchema$1.optional(),
9610
+ supportsSwitchDelay: boolean(),
9611
+ /** Present when `supportsSwitchDelay` — the allowed delay range in seconds. */
9612
+ switchDelaySec: NormalizedRangeSchema$1.optional()
9613
+ });
9614
+ /**
9615
+ * Partial change to the day/night config — every field optional. A
9616
+ * provider ignores fields it does not support.
9617
+ */
9618
+ var DayNightSettingsPatchSchema = object({
9619
+ mode: DayNightModeSchema.optional(),
9620
+ sensitivity: number().optional(),
9621
+ switchDelaySec: number().optional()
9622
+ });
9623
+ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema), method(object({
9624
+ deviceId: number(),
9625
+ settings: DayNightSettingsPatchSchema
9626
+ }), _void(), {
9627
+ kind: "mutation",
9628
+ auth: "admin"
9629
+ });
9630
+ /**
9545
9631
  * Identity envelope for a device's upstream-system metadata.
9546
9632
  *
9547
9633
  * Two jobs:
@@ -9897,6 +9983,130 @@ object({
9897
9983
  });
9898
9984
  DeviceType.Image;
9899
9985
  /**
9986
+ * Vendor-neutral image / picture-adjustment cap — the per-camera config
9987
+ * cap shared by reolink / hikvision / amcrest. Models the common ISP
9988
+ * surface: the four picture sliders (brightness / contrast / saturation /
9989
+ * sharpness), orientation (mirror / flip / rotate), white-balance,
9990
+ * exposure and backlight-compensation modes.
9991
+ *
9992
+ * NORMALIZATION: every slider is a normalized int 0–100. Vendors expose
9993
+ * these natively as 0–100 or 0–255 (or other ranges); each provider maps
9994
+ * its native range to/from this normalized 0–100 space so the cap surface
9995
+ * (and the derived form) is identical across cameras. `warmth` (manual
9996
+ * white-balance) is likewise normalized 0–100.
9997
+ *
9998
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9999
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
10000
+ * injected from `status`) reports the live values, and a single
10001
+ * `setSettings` mutation applies a partial change. No hand-written
10002
+ * settings-contribution methods — the framework derives the UI + save
10003
+ * routing from this surface.
10004
+ */
10005
+ /** Sensor/image rotation, degrees clockwise. */
10006
+ var ImageRotateSchema = _enum([
10007
+ "0",
10008
+ "90",
10009
+ "180",
10010
+ "270"
10011
+ ]);
10012
+ /** White-balance mode. `manual` unlocks the normalized `warmth` knob. */
10013
+ var WhiteBalanceModeSchema = _enum(["auto", "manual"]);
10014
+ /** Exposure mode. */
10015
+ var ExposureModeSchema = _enum(["auto", "manual"]);
10016
+ /**
10017
+ * Backlight-compensation mode:
10018
+ * - `off` — disabled
10019
+ * - `blc` — backlight compensation
10020
+ * - `wdr` — wide dynamic range
10021
+ * - `hlc` — highlight compensation
10022
+ */
10023
+ var BacklightModeSchema = _enum([
10024
+ "off",
10025
+ "blc",
10026
+ "wdr",
10027
+ "hlc"
10028
+ ]);
10029
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
10030
+ * getOptions availability convention. Slider values are normalized 0–100. */
10031
+ var NormalizedRangeSchema = object({
10032
+ min: number(),
10033
+ max: number(),
10034
+ step: number()
10035
+ });
10036
+ object({
10037
+ /** Normalized 0–100. */
10038
+ brightness: number().optional(),
10039
+ /** Normalized 0–100. */
10040
+ contrast: number().optional(),
10041
+ /** Normalized 0–100. */
10042
+ saturation: number().optional(),
10043
+ /** Normalized 0–100. */
10044
+ sharpness: number().optional(),
10045
+ mirror: boolean().optional(),
10046
+ flip: boolean().optional(),
10047
+ rotate: ImageRotateSchema.optional(),
10048
+ whiteBalance: WhiteBalanceModeSchema.optional(),
10049
+ /** Manual white-balance warmth, NORMALIZED 0–100. Meaningful only when `whiteBalance === 'manual'`. */
10050
+ warmth: number().optional(),
10051
+ exposureMode: ExposureModeSchema.optional(),
10052
+ backlightMode: BacklightModeSchema.optional(),
10053
+ lastFetchedAt: number()
10054
+ });
10055
+ /**
10056
+ * Per-camera availability descriptor — drives which controls the admin UI
10057
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
10058
+ * (the normalized 0–100 range); enums as arrays of supported values (empty
10059
+ * array → control hidden). A provider returns honest, camera-probed values
10060
+ * — never hardcoded.
10061
+ */
10062
+ var ImageSettingsOptionsSchema = object({
10063
+ supportsBrightness: boolean(),
10064
+ brightness: NormalizedRangeSchema.optional(),
10065
+ supportsContrast: boolean(),
10066
+ contrast: NormalizedRangeSchema.optional(),
10067
+ supportsSaturation: boolean(),
10068
+ saturation: NormalizedRangeSchema.optional(),
10069
+ supportsSharpness: boolean(),
10070
+ sharpness: NormalizedRangeSchema.optional(),
10071
+ supportsMirror: boolean(),
10072
+ supportsFlip: boolean(),
10073
+ /** Supported rotation values. Empty → rotation not configurable. */
10074
+ rotateOptions: array(ImageRotateSchema),
10075
+ /** Supported white-balance modes. Empty → white-balance not configurable. */
10076
+ whiteBalanceModes: array(WhiteBalanceModeSchema),
10077
+ supportsWarmth: boolean(),
10078
+ /** Present when `supportsWarmth` — the normalized 0–100 range. */
10079
+ warmth: NormalizedRangeSchema.optional(),
10080
+ /** Supported exposure modes. Empty → exposure not configurable. */
10081
+ exposureModes: array(ExposureModeSchema),
10082
+ /** Supported backlight modes. Empty → backlight-compensation not configurable. */
10083
+ backlightModes: array(BacklightModeSchema)
10084
+ });
10085
+ /**
10086
+ * Partial change to the image config — every field optional. Slider values
10087
+ * are normalized 0–100. A provider ignores fields it does not support.
10088
+ */
10089
+ var ImageSettingsPatchSchema = object({
10090
+ brightness: number().optional(),
10091
+ contrast: number().optional(),
10092
+ saturation: number().optional(),
10093
+ sharpness: number().optional(),
10094
+ mirror: boolean().optional(),
10095
+ flip: boolean().optional(),
10096
+ rotate: ImageRotateSchema.optional(),
10097
+ whiteBalance: WhiteBalanceModeSchema.optional(),
10098
+ warmth: number().optional(),
10099
+ exposureMode: ExposureModeSchema.optional(),
10100
+ backlightMode: BacklightModeSchema.optional()
10101
+ });
10102
+ DeviceType.Camera, method(object({ deviceId: number() }), ImageSettingsOptionsSchema), method(object({
10103
+ deviceId: number(),
10104
+ settings: ImageSettingsPatchSchema
10105
+ }), _void(), {
10106
+ kind: "mutation",
10107
+ auth: "admin"
10108
+ });
10109
+ /**
9900
10110
  * Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
9901
10111
  * with a mowing lifecycle plus a dock action.
9902
10112
  *
@@ -10791,6 +11001,16 @@ var RunnerCameraConfigSchema = object({
10791
11001
  * this gate is bypassed.
10792
11002
  */
10793
11003
  onboardMotionDrivesAnalyzer: boolean().default(true),
11004
+ /**
11005
+ * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
11006
+ * never arms the periodic recheck timer, regardless of `occupancyRecheckSec` —
11007
+ * this is off by default because the recheck re-subscribes a detection session
11008
+ * every N seconds while `watching`, a major source of pull-decoder re-dial
11009
+ * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
11010
+ * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
11011
+ * (and only render) when this is enabled.
11012
+ */
11013
+ occupancyRecheckEnabled: boolean().default(false),
10794
11014
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
10795
11015
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
10796
11016
  /**
@@ -13381,7 +13601,9 @@ method(object({ codec: string() }), boolean()), method(_void(), object({
13381
13601
  id: string(),
13382
13602
  name: string(),
13383
13603
  isPullMode: boolean().optional(),
13384
- priority: number().optional()
13604
+ priority: number().optional(),
13605
+ hwaccel: string().optional(),
13606
+ probedBestHwaccel: string().optional()
13385
13607
  })), method(DecoderSessionConfigSchema, object({
13386
13608
  sessionId: string(),
13387
13609
  nodeId: string()
@@ -15295,7 +15517,17 @@ var AgentAddonConfigSchema = object({
15295
15517
  });
15296
15518
  var AgentPipelineSettingsSchema = object({
15297
15519
  addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
15298
- maxCameras: number().int().nonnegative().nullable().default(null)
15520
+ maxCameras: number().int().nonnegative().nullable().default(null),
15521
+ /** Per-node detection weight (relative share for the quota balancer). */
15522
+ detectWeight: number().positive().optional(),
15523
+ /** Node is eligible to run the detection pipeline (decode + inference). */
15524
+ detect: boolean().optional(),
15525
+ /** Node is eligible to host decoder sessions. */
15526
+ decode: boolean().optional(),
15527
+ /** Node is eligible to run audio-analyzer sessions. */
15528
+ audio: boolean().optional(),
15529
+ /** Node is eligible to be the ingest / source-owner (serve the restream). */
15530
+ ingest: boolean().optional()
15299
15531
  });
15300
15532
  var CameraPipelineForAgentSchema = object({
15301
15533
  steps: array(PipelineStepInputSchema).readonly(),
@@ -15601,6 +15833,21 @@ method(object({
15601
15833
  }), object({ success: literal(true) }), {
15602
15834
  kind: "mutation",
15603
15835
  auth: "admin"
15836
+ }), method(object({
15837
+ agentNodeId: string(),
15838
+ detectWeight: number().positive().nullable()
15839
+ }), object({ success: literal(true) }), {
15840
+ kind: "mutation",
15841
+ auth: "admin"
15842
+ }), method(object({
15843
+ agentNodeId: string(),
15844
+ detect: boolean().nullable().optional(),
15845
+ decode: boolean().nullable().optional(),
15846
+ audio: boolean().nullable().optional(),
15847
+ ingest: boolean().nullable().optional()
15848
+ }), object({ success: literal(true) }), {
15849
+ kind: "mutation",
15850
+ auth: "admin"
15604
15851
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
15605
15852
  deviceId: number(),
15606
15853
  addonId: string(),
@@ -19433,6 +19680,18 @@ Object.freeze({
19433
19680
  addonId: null,
19434
19681
  access: "view"
19435
19682
  },
19683
+ "dayNight.getOptions": {
19684
+ capName: "day-night",
19685
+ capScope: "device",
19686
+ addonId: null,
19687
+ access: "view"
19688
+ },
19689
+ "dayNight.setSettings": {
19690
+ capName: "day-night",
19691
+ capScope: "device",
19692
+ addonId: null,
19693
+ access: "create"
19694
+ },
19436
19695
  "decoder.createSession": {
19437
19696
  capName: "decoder",
19438
19697
  capScope: "system",
@@ -20363,6 +20622,18 @@ Object.freeze({
20363
20622
  addonId: null,
20364
20623
  access: "create"
20365
20624
  },
20625
+ "imageSettings.getOptions": {
20626
+ capName: "image-settings",
20627
+ capScope: "device",
20628
+ addonId: null,
20629
+ access: "view"
20630
+ },
20631
+ "imageSettings.setSettings": {
20632
+ capName: "image-settings",
20633
+ capScope: "device",
20634
+ addonId: null,
20635
+ access: "create"
20636
+ },
20366
20637
  "integrations.create": {
20367
20638
  capName: "integrations",
20368
20639
  capScope: "system",
@@ -21545,6 +21816,18 @@ Object.freeze({
21545
21816
  addonId: null,
21546
21817
  access: "create"
21547
21818
  },
21819
+ "pipelineOrchestrator.setAgentCapabilities": {
21820
+ capName: "pipeline-orchestrator",
21821
+ capScope: "system",
21822
+ addonId: null,
21823
+ access: "create"
21824
+ },
21825
+ "pipelineOrchestrator.setAgentDetectWeight": {
21826
+ capName: "pipeline-orchestrator",
21827
+ capScope: "system",
21828
+ addonId: null,
21829
+ access: "create"
21830
+ },
21548
21831
  "pipelineOrchestrator.setAgentMaxCameras": {
21549
21832
  capName: "pipeline-orchestrator",
21550
21833
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-onvif",
3
- "version": "1.1.15",
3
+ "version": "1.1.17",
4
4
  "description": "ONVIF camera device provider addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",