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