@camstack/addon-export-alexa 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.
@@ -4655,7 +4655,7 @@ function _instanceof(cls, params = {}) {
4655
4655
  return inst;
4656
4656
  }
4657
4657
  //#endregion
4658
- //#region ../types/dist/sleep-BiDFW0E7.mjs
4658
+ //#region ../types/dist/sleep-CZDdRBua.mjs
4659
4659
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4660
4660
  EventCategory["SystemBoot"] = "system.boot";
4661
4661
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -7390,7 +7390,16 @@ var DecoderStatsSchema = object({
7390
7390
  inputFps: number(),
7391
7391
  outputFps: number(),
7392
7392
  avgDecodeTimeMs: number(),
7393
- droppedFrames: number()
7393
+ droppedFrames: number(),
7394
+ /**
7395
+ * Pull-mode adaptive-fps telemetry (optional — only pull sessions run the
7396
+ * lag-driven controller; push sessions omit these). `lagMs` is the EWMA of
7397
+ * the decoder's real-time drift (rising = falling behind live); `adaptiveFps`
7398
+ * is the current lag-throttled emit rate (≤ `effectiveFps` ceiling).
7399
+ */
7400
+ lagMs: number().optional(),
7401
+ effectiveFps: number().optional(),
7402
+ adaptiveFps: number().optional()
7394
7403
  });
7395
7404
  var DecoderSessionConfigSchema = object({
7396
7405
  codec: string(),
@@ -7431,7 +7440,15 @@ var DecoderSessionConfigSchema = object({
7431
7440
  * other — `pullFrames` returns nothing for an `'shm'` session and
7432
7441
  * `pullHandles` returns nothing for a `'callback'` session.
7433
7442
  */
7434
- frameSink: _enum(["callback", "shm"]).default("callback")
7443
+ frameSink: _enum(["callback", "shm"]).default("callback"),
7444
+ /**
7445
+ * Per-camera decoder DEBUG facility. When `true`, a pull-mode session emits
7446
+ * a throttled (~1Hz) structured `decoder debug` line (effective/adaptive fps,
7447
+ * real-time lag, dropped-frame delta, avg decode time, hwaccel). Mirrors the
7448
+ * stream-broker's `streamingDebug` gate — off by default so production logs
7449
+ * stay quiet and the emit path pays zero per-frame cost when disabled.
7450
+ */
7451
+ debug: boolean().optional()
7435
7452
  });
7436
7453
  var EncodeProfileSchema = object({
7437
7454
  video: object({
@@ -9643,6 +9660,75 @@ DeviceType.Cover, method(object({ deviceId: number().int().nonnegative() }), _vo
9643
9660
  auth: "admin"
9644
9661
  });
9645
9662
  /**
9663
+ * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
9664
+ * shared by reolink / hikvision / amcrest. Models the common firmware
9665
+ * surface: the IR-cut switching MODE plus the two knobs that gate it
9666
+ * (photocell `sensitivity` + `switchDelaySec`). Each vendor maps these
9667
+ * onto its own ISAPI / Baichuan / Dahua-CGI fields; the cap standardises
9668
+ * the shape so ONE derived-form renders every camera.
9669
+ *
9670
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9671
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9672
+ * injected from `status`) reports the live values, and a single
9673
+ * `setSettings` mutation applies a partial change. No hand-written
9674
+ * settings-contribution methods — the framework derives the UI + save
9675
+ * routing from this surface.
9676
+ */
9677
+ /** IR-cut switching mode. `schedule` = time-of-day table configured on the camera. */
9678
+ var DayNightModeSchema = _enum([
9679
+ "auto",
9680
+ "day",
9681
+ "night",
9682
+ "schedule"
9683
+ ]);
9684
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9685
+ * getOptions availability convention. Normalized values are 0–100. */
9686
+ var NormalizedRangeSchema$1 = object({
9687
+ min: number(),
9688
+ max: number(),
9689
+ step: number()
9690
+ });
9691
+ object({
9692
+ mode: DayNightModeSchema,
9693
+ /** IR-cut trigger sensitivity, NORMALIZED 0–100 (higher = switches to night sooner). */
9694
+ sensitivity: number().optional(),
9695
+ /** Delay before the IR-cut filter flips, in seconds. */
9696
+ switchDelaySec: number().optional(),
9697
+ lastFetchedAt: number()
9698
+ });
9699
+ /**
9700
+ * Per-camera availability descriptor — drives which controls the admin UI
9701
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9702
+ * (normalized 0–100); the mode choice-set as an array. A provider returns
9703
+ * honest, camera-probed values — never hardcoded.
9704
+ */
9705
+ var DayNightOptionsSchema = object({
9706
+ /** Modes this camera accepts. Empty → the camera has no configurable day/night mode. */
9707
+ modes: array(DayNightModeSchema),
9708
+ supportsSensitivity: boolean(),
9709
+ /** Present when `supportsSensitivity` — the normalized 0–100 range. */
9710
+ sensitivity: NormalizedRangeSchema$1.optional(),
9711
+ supportsSwitchDelay: boolean(),
9712
+ /** Present when `supportsSwitchDelay` — the allowed delay range in seconds. */
9713
+ switchDelaySec: NormalizedRangeSchema$1.optional()
9714
+ });
9715
+ /**
9716
+ * Partial change to the day/night config — every field optional. A
9717
+ * provider ignores fields it does not support.
9718
+ */
9719
+ var DayNightSettingsPatchSchema = object({
9720
+ mode: DayNightModeSchema.optional(),
9721
+ sensitivity: number().optional(),
9722
+ switchDelaySec: number().optional()
9723
+ });
9724
+ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema), method(object({
9725
+ deviceId: number(),
9726
+ settings: DayNightSettingsPatchSchema
9727
+ }), _void(), {
9728
+ kind: "mutation",
9729
+ auth: "admin"
9730
+ });
9731
+ /**
9646
9732
  * Identity envelope for a device's upstream-system metadata.
9647
9733
  *
9648
9734
  * Two jobs:
@@ -9998,6 +10084,130 @@ object({
9998
10084
  });
9999
10085
  DeviceType.Image;
10000
10086
  /**
10087
+ * Vendor-neutral image / picture-adjustment cap — the per-camera config
10088
+ * cap shared by reolink / hikvision / amcrest. Models the common ISP
10089
+ * surface: the four picture sliders (brightness / contrast / saturation /
10090
+ * sharpness), orientation (mirror / flip / rotate), white-balance,
10091
+ * exposure and backlight-compensation modes.
10092
+ *
10093
+ * NORMALIZATION: every slider is a normalized int 0–100. Vendors expose
10094
+ * these natively as 0–100 or 0–255 (or other ranges); each provider maps
10095
+ * its native range to/from this normalized 0–100 space so the cap surface
10096
+ * (and the derived form) is identical across cameras. `warmth` (manual
10097
+ * white-balance) is likewise normalized 0–100.
10098
+ *
10099
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
10100
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
10101
+ * injected from `status`) reports the live values, and a single
10102
+ * `setSettings` mutation applies a partial change. No hand-written
10103
+ * settings-contribution methods — the framework derives the UI + save
10104
+ * routing from this surface.
10105
+ */
10106
+ /** Sensor/image rotation, degrees clockwise. */
10107
+ var ImageRotateSchema = _enum([
10108
+ "0",
10109
+ "90",
10110
+ "180",
10111
+ "270"
10112
+ ]);
10113
+ /** White-balance mode. `manual` unlocks the normalized `warmth` knob. */
10114
+ var WhiteBalanceModeSchema = _enum(["auto", "manual"]);
10115
+ /** Exposure mode. */
10116
+ var ExposureModeSchema = _enum(["auto", "manual"]);
10117
+ /**
10118
+ * Backlight-compensation mode:
10119
+ * - `off` — disabled
10120
+ * - `blc` — backlight compensation
10121
+ * - `wdr` — wide dynamic range
10122
+ * - `hlc` — highlight compensation
10123
+ */
10124
+ var BacklightModeSchema = _enum([
10125
+ "off",
10126
+ "blc",
10127
+ "wdr",
10128
+ "hlc"
10129
+ ]);
10130
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
10131
+ * getOptions availability convention. Slider values are normalized 0–100. */
10132
+ var NormalizedRangeSchema = object({
10133
+ min: number(),
10134
+ max: number(),
10135
+ step: number()
10136
+ });
10137
+ object({
10138
+ /** Normalized 0–100. */
10139
+ brightness: number().optional(),
10140
+ /** Normalized 0–100. */
10141
+ contrast: number().optional(),
10142
+ /** Normalized 0–100. */
10143
+ saturation: number().optional(),
10144
+ /** Normalized 0–100. */
10145
+ sharpness: number().optional(),
10146
+ mirror: boolean().optional(),
10147
+ flip: boolean().optional(),
10148
+ rotate: ImageRotateSchema.optional(),
10149
+ whiteBalance: WhiteBalanceModeSchema.optional(),
10150
+ /** Manual white-balance warmth, NORMALIZED 0–100. Meaningful only when `whiteBalance === 'manual'`. */
10151
+ warmth: number().optional(),
10152
+ exposureMode: ExposureModeSchema.optional(),
10153
+ backlightMode: BacklightModeSchema.optional(),
10154
+ lastFetchedAt: number()
10155
+ });
10156
+ /**
10157
+ * Per-camera availability descriptor — drives which controls the admin UI
10158
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
10159
+ * (the normalized 0–100 range); enums as arrays of supported values (empty
10160
+ * array → control hidden). A provider returns honest, camera-probed values
10161
+ * — never hardcoded.
10162
+ */
10163
+ var ImageSettingsOptionsSchema = object({
10164
+ supportsBrightness: boolean(),
10165
+ brightness: NormalizedRangeSchema.optional(),
10166
+ supportsContrast: boolean(),
10167
+ contrast: NormalizedRangeSchema.optional(),
10168
+ supportsSaturation: boolean(),
10169
+ saturation: NormalizedRangeSchema.optional(),
10170
+ supportsSharpness: boolean(),
10171
+ sharpness: NormalizedRangeSchema.optional(),
10172
+ supportsMirror: boolean(),
10173
+ supportsFlip: boolean(),
10174
+ /** Supported rotation values. Empty → rotation not configurable. */
10175
+ rotateOptions: array(ImageRotateSchema),
10176
+ /** Supported white-balance modes. Empty → white-balance not configurable. */
10177
+ whiteBalanceModes: array(WhiteBalanceModeSchema),
10178
+ supportsWarmth: boolean(),
10179
+ /** Present when `supportsWarmth` — the normalized 0–100 range. */
10180
+ warmth: NormalizedRangeSchema.optional(),
10181
+ /** Supported exposure modes. Empty → exposure not configurable. */
10182
+ exposureModes: array(ExposureModeSchema),
10183
+ /** Supported backlight modes. Empty → backlight-compensation not configurable. */
10184
+ backlightModes: array(BacklightModeSchema)
10185
+ });
10186
+ /**
10187
+ * Partial change to the image config — every field optional. Slider values
10188
+ * are normalized 0–100. A provider ignores fields it does not support.
10189
+ */
10190
+ var ImageSettingsPatchSchema = object({
10191
+ brightness: number().optional(),
10192
+ contrast: number().optional(),
10193
+ saturation: number().optional(),
10194
+ sharpness: number().optional(),
10195
+ mirror: boolean().optional(),
10196
+ flip: boolean().optional(),
10197
+ rotate: ImageRotateSchema.optional(),
10198
+ whiteBalance: WhiteBalanceModeSchema.optional(),
10199
+ warmth: number().optional(),
10200
+ exposureMode: ExposureModeSchema.optional(),
10201
+ backlightMode: BacklightModeSchema.optional()
10202
+ });
10203
+ DeviceType.Camera, method(object({ deviceId: number() }), ImageSettingsOptionsSchema), method(object({
10204
+ deviceId: number(),
10205
+ settings: ImageSettingsPatchSchema
10206
+ }), _void(), {
10207
+ kind: "mutation",
10208
+ auth: "admin"
10209
+ });
10210
+ /**
10001
10211
  * Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
10002
10212
  * with a mowing lifecycle plus a dock action.
10003
10213
  *
@@ -10892,6 +11102,16 @@ var RunnerCameraConfigSchema = object({
10892
11102
  * this gate is bypassed.
10893
11103
  */
10894
11104
  onboardMotionDrivesAnalyzer: boolean().default(true),
11105
+ /**
11106
+ * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
11107
+ * never arms the periodic recheck timer, regardless of `occupancyRecheckSec` —
11108
+ * this is off by default because the recheck re-subscribes a detection session
11109
+ * every N seconds while `watching`, a major source of pull-decoder re-dial
11110
+ * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
11111
+ * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
11112
+ * (and only render) when this is enabled.
11113
+ */
11114
+ occupancyRecheckEnabled: boolean().default(false),
10895
11115
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
10896
11116
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
10897
11117
  /**
@@ -13228,7 +13448,9 @@ method(object({ codec: string() }), boolean()), method(_void(), object({
13228
13448
  id: string(),
13229
13449
  name: string(),
13230
13450
  isPullMode: boolean().optional(),
13231
- priority: number().optional()
13451
+ priority: number().optional(),
13452
+ hwaccel: string().optional(),
13453
+ probedBestHwaccel: string().optional()
13232
13454
  })), method(DecoderSessionConfigSchema, object({
13233
13455
  sessionId: string(),
13234
13456
  nodeId: string()
@@ -15173,7 +15395,17 @@ var AgentAddonConfigSchema = object({
15173
15395
  });
15174
15396
  var AgentPipelineSettingsSchema = object({
15175
15397
  addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
15176
- maxCameras: number().int().nonnegative().nullable().default(null)
15398
+ maxCameras: number().int().nonnegative().nullable().default(null),
15399
+ /** Per-node detection weight (relative share for the quota balancer). */
15400
+ detectWeight: number().positive().optional(),
15401
+ /** Node is eligible to run the detection pipeline (decode + inference). */
15402
+ detect: boolean().optional(),
15403
+ /** Node is eligible to host decoder sessions. */
15404
+ decode: boolean().optional(),
15405
+ /** Node is eligible to run audio-analyzer sessions. */
15406
+ audio: boolean().optional(),
15407
+ /** Node is eligible to be the ingest / source-owner (serve the restream). */
15408
+ ingest: boolean().optional()
15177
15409
  });
15178
15410
  var CameraPipelineForAgentSchema = object({
15179
15411
  steps: array(PipelineStepInputSchema).readonly(),
@@ -15479,6 +15711,21 @@ method(object({
15479
15711
  }), object({ success: literal(true) }), {
15480
15712
  kind: "mutation",
15481
15713
  auth: "admin"
15714
+ }), method(object({
15715
+ agentNodeId: string(),
15716
+ detectWeight: number().positive().nullable()
15717
+ }), object({ success: literal(true) }), {
15718
+ kind: "mutation",
15719
+ auth: "admin"
15720
+ }), method(object({
15721
+ agentNodeId: string(),
15722
+ detect: boolean().nullable().optional(),
15723
+ decode: boolean().nullable().optional(),
15724
+ audio: boolean().nullable().optional(),
15725
+ ingest: boolean().nullable().optional()
15726
+ }), object({ success: literal(true) }), {
15727
+ kind: "mutation",
15728
+ auth: "admin"
15482
15729
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
15483
15730
  deviceId: number(),
15484
15731
  addonId: string(),
@@ -19226,6 +19473,18 @@ Object.freeze({
19226
19473
  addonId: null,
19227
19474
  access: "view"
19228
19475
  },
19476
+ "dayNight.getOptions": {
19477
+ capName: "day-night",
19478
+ capScope: "device",
19479
+ addonId: null,
19480
+ access: "view"
19481
+ },
19482
+ "dayNight.setSettings": {
19483
+ capName: "day-night",
19484
+ capScope: "device",
19485
+ addonId: null,
19486
+ access: "create"
19487
+ },
19229
19488
  "decoder.createSession": {
19230
19489
  capName: "decoder",
19231
19490
  capScope: "system",
@@ -20156,6 +20415,18 @@ Object.freeze({
20156
20415
  addonId: null,
20157
20416
  access: "create"
20158
20417
  },
20418
+ "imageSettings.getOptions": {
20419
+ capName: "image-settings",
20420
+ capScope: "device",
20421
+ addonId: null,
20422
+ access: "view"
20423
+ },
20424
+ "imageSettings.setSettings": {
20425
+ capName: "image-settings",
20426
+ capScope: "device",
20427
+ addonId: null,
20428
+ access: "create"
20429
+ },
20159
20430
  "integrations.create": {
20160
20431
  capName: "integrations",
20161
20432
  capScope: "system",
@@ -21338,6 +21609,18 @@ Object.freeze({
21338
21609
  addonId: null,
21339
21610
  access: "create"
21340
21611
  },
21612
+ "pipelineOrchestrator.setAgentCapabilities": {
21613
+ capName: "pipeline-orchestrator",
21614
+ capScope: "system",
21615
+ addonId: null,
21616
+ access: "create"
21617
+ },
21618
+ "pipelineOrchestrator.setAgentDetectWeight": {
21619
+ capName: "pipeline-orchestrator",
21620
+ capScope: "system",
21621
+ addonId: null,
21622
+ access: "create"
21623
+ },
21341
21624
  "pipelineOrchestrator.setAgentMaxCameras": {
21342
21625
  capName: "pipeline-orchestrator",
21343
21626
  capScope: "system",
@@ -4629,7 +4629,7 @@ function _instanceof(cls, params = {}) {
4629
4629
  return inst;
4630
4630
  }
4631
4631
  //#endregion
4632
- //#region ../types/dist/sleep-BiDFW0E7.mjs
4632
+ //#region ../types/dist/sleep-CZDdRBua.mjs
4633
4633
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4634
4634
  EventCategory["SystemBoot"] = "system.boot";
4635
4635
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -7364,7 +7364,16 @@ var DecoderStatsSchema = object({
7364
7364
  inputFps: number(),
7365
7365
  outputFps: number(),
7366
7366
  avgDecodeTimeMs: number(),
7367
- droppedFrames: number()
7367
+ droppedFrames: number(),
7368
+ /**
7369
+ * Pull-mode adaptive-fps telemetry (optional — only pull sessions run the
7370
+ * lag-driven controller; push sessions omit these). `lagMs` is the EWMA of
7371
+ * the decoder's real-time drift (rising = falling behind live); `adaptiveFps`
7372
+ * is the current lag-throttled emit rate (≤ `effectiveFps` ceiling).
7373
+ */
7374
+ lagMs: number().optional(),
7375
+ effectiveFps: number().optional(),
7376
+ adaptiveFps: number().optional()
7368
7377
  });
7369
7378
  var DecoderSessionConfigSchema = object({
7370
7379
  codec: string(),
@@ -7405,7 +7414,15 @@ var DecoderSessionConfigSchema = object({
7405
7414
  * other — `pullFrames` returns nothing for an `'shm'` session and
7406
7415
  * `pullHandles` returns nothing for a `'callback'` session.
7407
7416
  */
7408
- frameSink: _enum(["callback", "shm"]).default("callback")
7417
+ frameSink: _enum(["callback", "shm"]).default("callback"),
7418
+ /**
7419
+ * Per-camera decoder DEBUG facility. When `true`, a pull-mode session emits
7420
+ * a throttled (~1Hz) structured `decoder debug` line (effective/adaptive fps,
7421
+ * real-time lag, dropped-frame delta, avg decode time, hwaccel). Mirrors the
7422
+ * stream-broker's `streamingDebug` gate — off by default so production logs
7423
+ * stay quiet and the emit path pays zero per-frame cost when disabled.
7424
+ */
7425
+ debug: boolean().optional()
7409
7426
  });
7410
7427
  var EncodeProfileSchema = object({
7411
7428
  video: object({
@@ -9617,6 +9634,75 @@ DeviceType.Cover, method(object({ deviceId: number().int().nonnegative() }), _vo
9617
9634
  auth: "admin"
9618
9635
  });
9619
9636
  /**
9637
+ * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
9638
+ * shared by reolink / hikvision / amcrest. Models the common firmware
9639
+ * surface: the IR-cut switching MODE plus the two knobs that gate it
9640
+ * (photocell `sensitivity` + `switchDelaySec`). Each vendor maps these
9641
+ * onto its own ISAPI / Baichuan / Dahua-CGI fields; the cap standardises
9642
+ * the shape so ONE derived-form renders every camera.
9643
+ *
9644
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
9645
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
9646
+ * injected from `status`) reports the live values, and a single
9647
+ * `setSettings` mutation applies a partial change. No hand-written
9648
+ * settings-contribution methods — the framework derives the UI + save
9649
+ * routing from this surface.
9650
+ */
9651
+ /** IR-cut switching mode. `schedule` = time-of-day table configured on the camera. */
9652
+ var DayNightModeSchema = _enum([
9653
+ "auto",
9654
+ "day",
9655
+ "night",
9656
+ "schedule"
9657
+ ]);
9658
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
9659
+ * getOptions availability convention. Normalized values are 0–100. */
9660
+ var NormalizedRangeSchema$1 = object({
9661
+ min: number(),
9662
+ max: number(),
9663
+ step: number()
9664
+ });
9665
+ object({
9666
+ mode: DayNightModeSchema,
9667
+ /** IR-cut trigger sensitivity, NORMALIZED 0–100 (higher = switches to night sooner). */
9668
+ sensitivity: number().optional(),
9669
+ /** Delay before the IR-cut filter flips, in seconds. */
9670
+ switchDelaySec: number().optional(),
9671
+ lastFetchedAt: number()
9672
+ });
9673
+ /**
9674
+ * Per-camera availability descriptor — drives which controls the admin UI
9675
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
9676
+ * (normalized 0–100); the mode choice-set as an array. A provider returns
9677
+ * honest, camera-probed values — never hardcoded.
9678
+ */
9679
+ var DayNightOptionsSchema = object({
9680
+ /** Modes this camera accepts. Empty → the camera has no configurable day/night mode. */
9681
+ modes: array(DayNightModeSchema),
9682
+ supportsSensitivity: boolean(),
9683
+ /** Present when `supportsSensitivity` — the normalized 0–100 range. */
9684
+ sensitivity: NormalizedRangeSchema$1.optional(),
9685
+ supportsSwitchDelay: boolean(),
9686
+ /** Present when `supportsSwitchDelay` — the allowed delay range in seconds. */
9687
+ switchDelaySec: NormalizedRangeSchema$1.optional()
9688
+ });
9689
+ /**
9690
+ * Partial change to the day/night config — every field optional. A
9691
+ * provider ignores fields it does not support.
9692
+ */
9693
+ var DayNightSettingsPatchSchema = object({
9694
+ mode: DayNightModeSchema.optional(),
9695
+ sensitivity: number().optional(),
9696
+ switchDelaySec: number().optional()
9697
+ });
9698
+ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema), method(object({
9699
+ deviceId: number(),
9700
+ settings: DayNightSettingsPatchSchema
9701
+ }), _void(), {
9702
+ kind: "mutation",
9703
+ auth: "admin"
9704
+ });
9705
+ /**
9620
9706
  * Identity envelope for a device's upstream-system metadata.
9621
9707
  *
9622
9708
  * Two jobs:
@@ -9972,6 +10058,130 @@ object({
9972
10058
  });
9973
10059
  DeviceType.Image;
9974
10060
  /**
10061
+ * Vendor-neutral image / picture-adjustment cap — the per-camera config
10062
+ * cap shared by reolink / hikvision / amcrest. Models the common ISP
10063
+ * surface: the four picture sliders (brightness / contrast / saturation /
10064
+ * sharpness), orientation (mirror / flip / rotate), white-balance,
10065
+ * exposure and backlight-compensation modes.
10066
+ *
10067
+ * NORMALIZATION: every slider is a normalized int 0–100. Vendors expose
10068
+ * these natively as 0–100 or 0–255 (or other ranges); each provider maps
10069
+ * its native range to/from this normalized 0–100 space so the cap surface
10070
+ * (and the derived form) is identical across cameras. `warmth` (manual
10071
+ * white-balance) is likewise normalized 0–100.
10072
+ *
10073
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
10074
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
10075
+ * injected from `status`) reports the live values, and a single
10076
+ * `setSettings` mutation applies a partial change. No hand-written
10077
+ * settings-contribution methods — the framework derives the UI + save
10078
+ * routing from this surface.
10079
+ */
10080
+ /** Sensor/image rotation, degrees clockwise. */
10081
+ var ImageRotateSchema = _enum([
10082
+ "0",
10083
+ "90",
10084
+ "180",
10085
+ "270"
10086
+ ]);
10087
+ /** White-balance mode. `manual` unlocks the normalized `warmth` knob. */
10088
+ var WhiteBalanceModeSchema = _enum(["auto", "manual"]);
10089
+ /** Exposure mode. */
10090
+ var ExposureModeSchema = _enum(["auto", "manual"]);
10091
+ /**
10092
+ * Backlight-compensation mode:
10093
+ * - `off` — disabled
10094
+ * - `blc` — backlight compensation
10095
+ * - `wdr` — wide dynamic range
10096
+ * - `hlc` — highlight compensation
10097
+ */
10098
+ var BacklightModeSchema = _enum([
10099
+ "off",
10100
+ "blc",
10101
+ "wdr",
10102
+ "hlc"
10103
+ ]);
10104
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
10105
+ * getOptions availability convention. Slider values are normalized 0–100. */
10106
+ var NormalizedRangeSchema = object({
10107
+ min: number(),
10108
+ max: number(),
10109
+ step: number()
10110
+ });
10111
+ object({
10112
+ /** Normalized 0–100. */
10113
+ brightness: number().optional(),
10114
+ /** Normalized 0–100. */
10115
+ contrast: number().optional(),
10116
+ /** Normalized 0–100. */
10117
+ saturation: number().optional(),
10118
+ /** Normalized 0–100. */
10119
+ sharpness: number().optional(),
10120
+ mirror: boolean().optional(),
10121
+ flip: boolean().optional(),
10122
+ rotate: ImageRotateSchema.optional(),
10123
+ whiteBalance: WhiteBalanceModeSchema.optional(),
10124
+ /** Manual white-balance warmth, NORMALIZED 0–100. Meaningful only when `whiteBalance === 'manual'`. */
10125
+ warmth: number().optional(),
10126
+ exposureMode: ExposureModeSchema.optional(),
10127
+ backlightMode: BacklightModeSchema.optional(),
10128
+ lastFetchedAt: number()
10129
+ });
10130
+ /**
10131
+ * Per-camera availability descriptor — drives which controls the admin UI
10132
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
10133
+ * (the normalized 0–100 range); enums as arrays of supported values (empty
10134
+ * array → control hidden). A provider returns honest, camera-probed values
10135
+ * — never hardcoded.
10136
+ */
10137
+ var ImageSettingsOptionsSchema = object({
10138
+ supportsBrightness: boolean(),
10139
+ brightness: NormalizedRangeSchema.optional(),
10140
+ supportsContrast: boolean(),
10141
+ contrast: NormalizedRangeSchema.optional(),
10142
+ supportsSaturation: boolean(),
10143
+ saturation: NormalizedRangeSchema.optional(),
10144
+ supportsSharpness: boolean(),
10145
+ sharpness: NormalizedRangeSchema.optional(),
10146
+ supportsMirror: boolean(),
10147
+ supportsFlip: boolean(),
10148
+ /** Supported rotation values. Empty → rotation not configurable. */
10149
+ rotateOptions: array(ImageRotateSchema),
10150
+ /** Supported white-balance modes. Empty → white-balance not configurable. */
10151
+ whiteBalanceModes: array(WhiteBalanceModeSchema),
10152
+ supportsWarmth: boolean(),
10153
+ /** Present when `supportsWarmth` — the normalized 0–100 range. */
10154
+ warmth: NormalizedRangeSchema.optional(),
10155
+ /** Supported exposure modes. Empty → exposure not configurable. */
10156
+ exposureModes: array(ExposureModeSchema),
10157
+ /** Supported backlight modes. Empty → backlight-compensation not configurable. */
10158
+ backlightModes: array(BacklightModeSchema)
10159
+ });
10160
+ /**
10161
+ * Partial change to the image config — every field optional. Slider values
10162
+ * are normalized 0–100. A provider ignores fields it does not support.
10163
+ */
10164
+ var ImageSettingsPatchSchema = object({
10165
+ brightness: number().optional(),
10166
+ contrast: number().optional(),
10167
+ saturation: number().optional(),
10168
+ sharpness: number().optional(),
10169
+ mirror: boolean().optional(),
10170
+ flip: boolean().optional(),
10171
+ rotate: ImageRotateSchema.optional(),
10172
+ whiteBalance: WhiteBalanceModeSchema.optional(),
10173
+ warmth: number().optional(),
10174
+ exposureMode: ExposureModeSchema.optional(),
10175
+ backlightMode: BacklightModeSchema.optional()
10176
+ });
10177
+ DeviceType.Camera, method(object({ deviceId: number() }), ImageSettingsOptionsSchema), method(object({
10178
+ deviceId: number(),
10179
+ settings: ImageSettingsPatchSchema
10180
+ }), _void(), {
10181
+ kind: "mutation",
10182
+ auth: "admin"
10183
+ });
10184
+ /**
9975
10185
  * Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
9976
10186
  * with a mowing lifecycle plus a dock action.
9977
10187
  *
@@ -10866,6 +11076,16 @@ var RunnerCameraConfigSchema = object({
10866
11076
  * this gate is bypassed.
10867
11077
  */
10868
11078
  onboardMotionDrivesAnalyzer: boolean().default(true),
11079
+ /**
11080
+ * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
11081
+ * never arms the periodic recheck timer, regardless of `occupancyRecheckSec` —
11082
+ * this is off by default because the recheck re-subscribes a detection session
11083
+ * every N seconds while `watching`, a major source of pull-decoder re-dial
11084
+ * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
11085
+ * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
11086
+ * (and only render) when this is enabled.
11087
+ */
11088
+ occupancyRecheckEnabled: boolean().default(false),
10869
11089
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
10870
11090
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
10871
11091
  /**
@@ -13202,7 +13422,9 @@ method(object({ codec: string() }), boolean()), method(_void(), object({
13202
13422
  id: string(),
13203
13423
  name: string(),
13204
13424
  isPullMode: boolean().optional(),
13205
- priority: number().optional()
13425
+ priority: number().optional(),
13426
+ hwaccel: string().optional(),
13427
+ probedBestHwaccel: string().optional()
13206
13428
  })), method(DecoderSessionConfigSchema, object({
13207
13429
  sessionId: string(),
13208
13430
  nodeId: string()
@@ -15147,7 +15369,17 @@ var AgentAddonConfigSchema = object({
15147
15369
  });
15148
15370
  var AgentPipelineSettingsSchema = object({
15149
15371
  addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
15150
- maxCameras: number().int().nonnegative().nullable().default(null)
15372
+ maxCameras: number().int().nonnegative().nullable().default(null),
15373
+ /** Per-node detection weight (relative share for the quota balancer). */
15374
+ detectWeight: number().positive().optional(),
15375
+ /** Node is eligible to run the detection pipeline (decode + inference). */
15376
+ detect: boolean().optional(),
15377
+ /** Node is eligible to host decoder sessions. */
15378
+ decode: boolean().optional(),
15379
+ /** Node is eligible to run audio-analyzer sessions. */
15380
+ audio: boolean().optional(),
15381
+ /** Node is eligible to be the ingest / source-owner (serve the restream). */
15382
+ ingest: boolean().optional()
15151
15383
  });
15152
15384
  var CameraPipelineForAgentSchema = object({
15153
15385
  steps: array(PipelineStepInputSchema).readonly(),
@@ -15453,6 +15685,21 @@ method(object({
15453
15685
  }), object({ success: literal(true) }), {
15454
15686
  kind: "mutation",
15455
15687
  auth: "admin"
15688
+ }), method(object({
15689
+ agentNodeId: string(),
15690
+ detectWeight: number().positive().nullable()
15691
+ }), object({ success: literal(true) }), {
15692
+ kind: "mutation",
15693
+ auth: "admin"
15694
+ }), method(object({
15695
+ agentNodeId: string(),
15696
+ detect: boolean().nullable().optional(),
15697
+ decode: boolean().nullable().optional(),
15698
+ audio: boolean().nullable().optional(),
15699
+ ingest: boolean().nullable().optional()
15700
+ }), object({ success: literal(true) }), {
15701
+ kind: "mutation",
15702
+ auth: "admin"
15456
15703
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
15457
15704
  deviceId: number(),
15458
15705
  addonId: string(),
@@ -19200,6 +19447,18 @@ Object.freeze({
19200
19447
  addonId: null,
19201
19448
  access: "view"
19202
19449
  },
19450
+ "dayNight.getOptions": {
19451
+ capName: "day-night",
19452
+ capScope: "device",
19453
+ addonId: null,
19454
+ access: "view"
19455
+ },
19456
+ "dayNight.setSettings": {
19457
+ capName: "day-night",
19458
+ capScope: "device",
19459
+ addonId: null,
19460
+ access: "create"
19461
+ },
19203
19462
  "decoder.createSession": {
19204
19463
  capName: "decoder",
19205
19464
  capScope: "system",
@@ -20130,6 +20389,18 @@ Object.freeze({
20130
20389
  addonId: null,
20131
20390
  access: "create"
20132
20391
  },
20392
+ "imageSettings.getOptions": {
20393
+ capName: "image-settings",
20394
+ capScope: "device",
20395
+ addonId: null,
20396
+ access: "view"
20397
+ },
20398
+ "imageSettings.setSettings": {
20399
+ capName: "image-settings",
20400
+ capScope: "device",
20401
+ addonId: null,
20402
+ access: "create"
20403
+ },
20133
20404
  "integrations.create": {
20134
20405
  capName: "integrations",
20135
20406
  capScope: "system",
@@ -21312,6 +21583,18 @@ Object.freeze({
21312
21583
  addonId: null,
21313
21584
  access: "create"
21314
21585
  },
21586
+ "pipelineOrchestrator.setAgentCapabilities": {
21587
+ capName: "pipeline-orchestrator",
21588
+ capScope: "system",
21589
+ addonId: null,
21590
+ access: "create"
21591
+ },
21592
+ "pipelineOrchestrator.setAgentDetectWeight": {
21593
+ capName: "pipeline-orchestrator",
21594
+ capScope: "system",
21595
+ addonId: null,
21596
+ access: "create"
21597
+ },
21315
21598
  "pipelineOrchestrator.setAgentMaxCameras": {
21316
21599
  capName: "pipeline-orchestrator",
21317
21600
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-export-alexa",
3
- "version": "1.1.15",
3
+ "version": "1.1.17",
4
4
  "description": "Alexa Smart Home Skill export — hub-side OAuth provider + directive handler. The companion AWS Lambda forwards Alexa directives to this addon's /addon/export-alexa/directive endpoint.",
5
5
  "keywords": [
6
6
  "camstack",