@camstack/addon-provider-amcrest 0.2.137 → 0.2.139

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
@@ -5441,7 +5441,7 @@ var ZodIssueCode = {
5441
5441
  var ZodFirstPartyTypeKind;
5442
5442
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5443
5443
  //#endregion
5444
- //#region ../types/dist/sleep-bZIhUvjd.mjs
5444
+ //#region ../types/dist/sleep-BegKjwUu.mjs
5445
5445
  /**
5446
5446
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5447
5447
  * window to float samples (D455).
@@ -8474,7 +8474,7 @@ function userError(code, params, englishFallback) {
8474
8474
  return new CamstackError(code, params, englishFallback);
8475
8475
  }
8476
8476
  //#endregion
8477
- //#region ../types/dist/err-msg--2RrYiLO.mjs
8477
+ //#region ../types/dist/err-msg-BXKzRBwg.mjs
8478
8478
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
8479
8479
  DeviceType["Camera"] = "camera";
8480
8480
  DeviceType["Hub"] = "hub";
@@ -8566,6 +8566,10 @@ var DeviceType = /* @__PURE__ */ function(DeviceType) {
8566
8566
  * native PetKit (`nodepetkit` `FeederDevice`), reusable by other feeder
8567
8567
  * integrations sharing the same food/desiccant/hopper surface. */
8568
8568
  DeviceType["PetFeeder"] = "pet-feeder";
8569
+ /** Built-in dishwasher — program lifecycle, door / remote-start gates,
8570
+ * salt and rinse-aid levels. Installed with the `dishwasher` cap.
8571
+ * Sources: native Bosch Home Connect, reusable by similar integrations. */
8572
+ DeviceType["Dishwasher"] = "dishwasher";
8569
8573
  return DeviceType;
8570
8574
  }({});
8571
8575
  var DeviceFeature = /* @__PURE__ */ function(DeviceFeature) {
@@ -8813,7 +8817,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
8813
8817
  return DeviceRole;
8814
8818
  }({});
8815
8819
  //#endregion
8816
- //#region ../types/dist/composition-DOwQB_Ua.mjs
8820
+ //#region ../types/dist/composition-CB6PMT9p.mjs
8817
8821
  /**
8818
8822
  * The ffmpeg build every CamStack node downloads, per platform and arch.
8819
8823
  *
@@ -13219,8 +13223,13 @@ var AlertSeveritySchema = _enum([
13219
13223
  "info",
13220
13224
  "success",
13221
13225
  "warning",
13222
- "error"
13226
+ "error",
13227
+ "critical"
13223
13228
  ]);
13229
+ var AlertActionSchema = object({
13230
+ label: string(),
13231
+ href: string().optional()
13232
+ });
13224
13233
  var AlertStatusSchema = _enum([
13225
13234
  "active",
13226
13235
  "in-progress",
@@ -13238,6 +13247,7 @@ var AlertSchema = object({
13238
13247
  severity: AlertSeveritySchema,
13239
13248
  title: string(),
13240
13249
  message: string(),
13250
+ action: AlertActionSchema.optional(),
13241
13251
  status: AlertStatusSchema,
13242
13252
  progress: number().optional(),
13243
13253
  read: boolean(),
@@ -17712,7 +17722,11 @@ var deviceDiscoveryCapability = {
17712
17722
  };
17713
17723
  /**
17714
17724
  * `device-adoption` — generic discovery + adoption surface,
17715
- * system-scoped singleton. The de-HA-ified successor to `ha-discovery`:
17725
+ * system-scoped collection (one provider per integration addon), routed
17726
+ * by explicit `{ addonId }` on direct `deviceAdoption.*` calls — the same
17727
+ * pin model as `connection-test`. The admin UI keeps using
17728
+ * `deviceManager.adoption*` (which already threads `addonId`). The de-HA-ified
17729
+ * successor to `ha-discovery`:
17716
17730
  * keyed by `integrationId` (the addon resolves integrationId → broker
17717
17731
  * internally) rather than a connection-specific `brokerId`, and it
17718
17732
  * REUSES the shared `DiscoveredChildDevice` candidate type from
@@ -54405,7 +54419,8 @@ var batteryCapability = {
54405
54419
  DeviceType.Button,
54406
54420
  DeviceType.Switch,
54407
54421
  DeviceType.PetFeeder,
54408
- DeviceType.Container
54422
+ DeviceType.Container,
54423
+ DeviceType.Thermostat
54409
54424
  ],
54410
54425
  methods: {
54411
54426
  /**
@@ -55878,6 +55893,161 @@ onStatusChanged: { data: object({
55878
55893
  * whether persisting is worth a SQLite commit. */
55879
55894
  volatileStateFields: ["lastChangedAt"]
55880
55895
  };
55896
+ /**
55897
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
55898
+ * consumable levels (salt, rinse aid) and common program options.
55899
+ *
55900
+ * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
55901
+ * by any integration that exposes the same program / option surface.
55902
+ *
55903
+ * `kind: 'poll'` — cloud REST APIs typically have no push channel; the
55904
+ * provider refreshes the slice on an interval and eagerly after commands.
55905
+ */
55906
+ var DishwasherStateSchema = _enum([
55907
+ "idle",
55908
+ "running",
55909
+ "paused",
55910
+ "finished",
55911
+ "error",
55912
+ "unavailable"
55913
+ ]);
55914
+ var DishwasherConsumableLevelSchema = _enum([
55915
+ "ok",
55916
+ "low",
55917
+ "empty"
55918
+ ]);
55919
+ var DishwasherStatusSchema = object({
55920
+ state: DishwasherStateSchema,
55921
+ /** Active program id/name, or null when none selected / unknown. */
55922
+ program: string().nullable(),
55923
+ /** Program tokens the hardware accepts — drives the UI selector. */
55924
+ availablePrograms: array(string()),
55925
+ /** Minutes remaining on the active cycle, or null when not running. */
55926
+ remainingMinutes: number().int().nonnegative().nullable(),
55927
+ /** Cycle completion 0..100, or null when not applicable. */
55928
+ progressPercent: number().min(0).max(100).nullable(),
55929
+ /** True when the door is reported open. */
55930
+ doorOpen: boolean(),
55931
+ /** True when remote start is allowed (door closed, power on, etc.). */
55932
+ remoteStartAllowed: boolean(),
55933
+ /** Main power / switched-on state. */
55934
+ powerOn: boolean(),
55935
+ saltLevel: DishwasherConsumableLevelSchema.nullable(),
55936
+ rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55937
+ halfLoad: boolean(),
55938
+ hygienePlus: boolean(),
55939
+ /** Extra dry option when the appliance exposes it. */
55940
+ extraDry: boolean(),
55941
+ /** Intensive zone (lower basket) when the appliance exposes it. */
55942
+ intensiveZone: boolean(),
55943
+ /** VarioSpeed / VarioSpeed+ when the appliance exposes it. */
55944
+ varioSpeedPlus: boolean(),
55945
+ /** Child lock (controls disabled on the appliance). */
55946
+ childLock: boolean(),
55947
+ errorCode: number().nullable(),
55948
+ errorLabel: string().nullable(),
55949
+ lastFetchedAt: number()
55950
+ });
55951
+ var dishwasherCapability = {
55952
+ name: "dishwasher",
55953
+ scope: "device",
55954
+ deviceNative: true,
55955
+ mode: "singleton",
55956
+ deviceTypes: [DeviceType.Dishwasher],
55957
+ methods: {
55958
+ start: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55959
+ kind: "mutation",
55960
+ auth: "protected"
55961
+ }),
55962
+ pause: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55963
+ kind: "mutation",
55964
+ auth: "protected"
55965
+ }),
55966
+ stop: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55967
+ kind: "mutation",
55968
+ auth: "protected"
55969
+ }),
55970
+ setProgram: method(object({
55971
+ deviceId: number().int().nonnegative(),
55972
+ program: string().min(1)
55973
+ }), _void(), {
55974
+ kind: "mutation",
55975
+ auth: "protected"
55976
+ }),
55977
+ setPower: method(object({
55978
+ deviceId: number().int().nonnegative(),
55979
+ on: boolean()
55980
+ }), _void(), {
55981
+ kind: "mutation",
55982
+ auth: "protected"
55983
+ }),
55984
+ setHalfLoad: method(object({
55985
+ deviceId: number().int().nonnegative(),
55986
+ on: boolean()
55987
+ }), _void(), {
55988
+ kind: "mutation",
55989
+ auth: "protected"
55990
+ }),
55991
+ setHygienePlus: method(object({
55992
+ deviceId: number().int().nonnegative(),
55993
+ on: boolean()
55994
+ }), _void(), {
55995
+ kind: "mutation",
55996
+ auth: "protected"
55997
+ }),
55998
+ setExtraDry: method(object({
55999
+ deviceId: number().int().nonnegative(),
56000
+ on: boolean()
56001
+ }), _void(), {
56002
+ kind: "mutation",
56003
+ auth: "protected"
56004
+ }),
56005
+ setIntensiveZone: method(object({
56006
+ deviceId: number().int().nonnegative(),
56007
+ on: boolean()
56008
+ }), _void(), {
56009
+ kind: "mutation",
56010
+ auth: "protected"
56011
+ }),
56012
+ setVarioSpeedPlus: method(object({
56013
+ deviceId: number().int().nonnegative(),
56014
+ on: boolean()
56015
+ }), _void(), {
56016
+ kind: "mutation",
56017
+ auth: "protected"
56018
+ }),
56019
+ setChildLock: method(object({
56020
+ deviceId: number().int().nonnegative(),
56021
+ on: boolean()
56022
+ }), _void(), {
56023
+ kind: "mutation",
56024
+ auth: "protected"
56025
+ }),
56026
+ setOption: method(object({
56027
+ deviceId: number().int().nonnegative(),
56028
+ key: string().min(1),
56029
+ value: union([
56030
+ boolean(),
56031
+ string(),
56032
+ number()
56033
+ ])
56034
+ }), _void(), {
56035
+ kind: "mutation",
56036
+ auth: "protected"
56037
+ })
56038
+ },
56039
+ status: {
56040
+ schema: DishwasherStatusSchema,
56041
+ kind: "poll"
56042
+ },
56043
+ runtimeState: DishwasherStatusSchema,
56044
+ durability: "session",
56045
+ history: { fields: { progressPercent: {
56046
+ kind: "gauge",
56047
+ unit: "%",
56048
+ deadband: 2
56049
+ } } }
56050
+ };
55881
56051
  var DoorbellStatusSchema = object({
55882
56052
  /** Ms epoch of the last press. null = never observed since this provider started. */
55883
56053
  lastPressedAt: number().nullable(),
@@ -56680,6 +56850,32 @@ var gasCapability = {
56680
56850
  * whether persisting is worth a SQLite commit. */
56681
56851
  volatileStateFields: ["lastChangedAt"]
56682
56852
  };
56853
+ var HeatingValveStatusSchema = object({
56854
+ /** Radiator valve opening 0 (closed) .. 100 (open). Null = not yet known. */
56855
+ position: number().min(0).max(100).nullable(),
56856
+ /** Ms epoch when the slice was last updated (push or poll). */
56857
+ lastFetchedAt: number()
56858
+ });
56859
+ var heatingValveCapability = {
56860
+ name: "heating-valve",
56861
+ scope: "device",
56862
+ deviceNative: true,
56863
+ mode: "singleton",
56864
+ deviceTypes: [DeviceType.Thermostat],
56865
+ methods: {},
56866
+ status: {
56867
+ schema: HeatingValveStatusSchema,
56868
+ kind: "push"
56869
+ },
56870
+ runtimeState: HeatingValveStatusSchema,
56871
+ durability: "session",
56872
+ history: { fields: { position: {
56873
+ kind: "gauge",
56874
+ unit: "%",
56875
+ deadband: 1
56876
+ } } },
56877
+ volatileStateFields: ["lastFetchedAt"]
56878
+ };
56683
56879
  /**
56684
56880
  * Humidifier / dehumidifier cap. Models HA `humidifier.*` entities —
56685
56881
  * an on/off actuator with an optional target-humidity setpoint and an
@@ -66562,6 +66758,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
66562
66758
  dayNight: dayNightCapability,
66563
66759
  deviceDiscovery: deviceDiscoveryCapability,
66564
66760
  deviceStatus: deviceStatusCapability,
66761
+ dishwasher: dishwasherCapability,
66565
66762
  doorbell: doorbellCapability,
66566
66763
  enumSensor: enumSensorCapability,
66567
66764
  eventEmitter: eventEmitterCapability,
@@ -66569,6 +66766,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
66569
66766
  featureProbe: featureProbeCapability,
66570
66767
  flood: floodCapability,
66571
66768
  gas: gasCapability,
66769
+ heatingValve: heatingValveCapability,
66572
66770
  humidifier: humidifierCapability,
66573
66771
  humiditySensor: humiditySensorCapability,
66574
66772
  image: imageCapability,
@@ -67294,6 +67492,12 @@ var BaseDeviceProvider = class extends BaseAddon {
67294
67492
  provider: this
67295
67493
  }];
67296
67494
  }
67495
+ /** Flatten `super.onInitialize()` whether it returned an array or an envelope. */
67496
+ providerRegistrationsFromSuper(result) {
67497
+ if (Array.isArray(result)) return result;
67498
+ if (result !== void 0 && result.providers !== void 0) return [...result.providers];
67499
+ return [];
67500
+ }
67297
67501
  async onShutdown() {
67298
67502
  this._restoreShuttingDown = true;
67299
67503
  this.cancelRestoreRetries();
@@ -67824,7 +68028,7 @@ var BaseDeviceProvider = class extends BaseAddon {
67824
68028
  function widenDeviceConstructor(ctor) {
67825
68029
  return ctor;
67826
68030
  }
67827
- DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Camera, DeviceType.Hub, DeviceType.Switch, DeviceType.Siren, DeviceType.Light, DeviceType.Fan, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder;
68031
+ DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Camera, DeviceType.Hub, DeviceType.Switch, DeviceType.Siren, DeviceType.Light, DeviceType.Fan, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher;
67828
68032
  new Set(Object.values(DeviceType));
67829
68033
  Object.freeze({
67830
68034
  "accessories.getStatus": {
@@ -70245,6 +70449,84 @@ Object.freeze({
70245
70449
  addonId: null,
70246
70450
  access: "view"
70247
70451
  },
70452
+ "dishwasher.getStatus": {
70453
+ capName: "dishwasher",
70454
+ capScope: "device",
70455
+ addonId: null,
70456
+ access: "view"
70457
+ },
70458
+ "dishwasher.pause": {
70459
+ capName: "dishwasher",
70460
+ capScope: "device",
70461
+ addonId: null,
70462
+ access: "create"
70463
+ },
70464
+ "dishwasher.setChildLock": {
70465
+ capName: "dishwasher",
70466
+ capScope: "device",
70467
+ addonId: null,
70468
+ access: "create"
70469
+ },
70470
+ "dishwasher.setExtraDry": {
70471
+ capName: "dishwasher",
70472
+ capScope: "device",
70473
+ addonId: null,
70474
+ access: "create"
70475
+ },
70476
+ "dishwasher.setHalfLoad": {
70477
+ capName: "dishwasher",
70478
+ capScope: "device",
70479
+ addonId: null,
70480
+ access: "create"
70481
+ },
70482
+ "dishwasher.setHygienePlus": {
70483
+ capName: "dishwasher",
70484
+ capScope: "device",
70485
+ addonId: null,
70486
+ access: "create"
70487
+ },
70488
+ "dishwasher.setIntensiveZone": {
70489
+ capName: "dishwasher",
70490
+ capScope: "device",
70491
+ addonId: null,
70492
+ access: "create"
70493
+ },
70494
+ "dishwasher.setOption": {
70495
+ capName: "dishwasher",
70496
+ capScope: "device",
70497
+ addonId: null,
70498
+ access: "create"
70499
+ },
70500
+ "dishwasher.setPower": {
70501
+ capName: "dishwasher",
70502
+ capScope: "device",
70503
+ addonId: null,
70504
+ access: "create"
70505
+ },
70506
+ "dishwasher.setProgram": {
70507
+ capName: "dishwasher",
70508
+ capScope: "device",
70509
+ addonId: null,
70510
+ access: "create"
70511
+ },
70512
+ "dishwasher.setVarioSpeedPlus": {
70513
+ capName: "dishwasher",
70514
+ capScope: "device",
70515
+ addonId: null,
70516
+ access: "create"
70517
+ },
70518
+ "dishwasher.start": {
70519
+ capName: "dishwasher",
70520
+ capScope: "device",
70521
+ addonId: null,
70522
+ access: "create"
70523
+ },
70524
+ "dishwasher.stop": {
70525
+ capName: "dishwasher",
70526
+ capScope: "device",
70527
+ addonId: null,
70528
+ access: "create"
70529
+ },
70248
70530
  "doorbell.getStatus": {
70249
70531
  capName: "doorbell",
70250
70532
  capScope: "device",
@@ -70455,6 +70737,12 @@ Object.freeze({
70455
70737
  addonId: null,
70456
70738
  access: "view"
70457
70739
  },
70740
+ "heatingValve.getStatus": {
70741
+ capName: "heating-valve",
70742
+ capScope: "device",
70743
+ addonId: null,
70744
+ access: "view"
70745
+ },
70458
70746
  "humidifier.getStatus": {
70459
70747
  capName: "humidifier",
70460
70748
  capScope: "device",
@@ -76042,7 +76330,7 @@ Object.freeze({
76042
76330
  access: "create"
76043
76331
  }
76044
76332
  });
76045
- DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder;
76333
+ DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher;
76046
76334
  DeviceFeature.BatteryOperated;
76047
76335
  /** Reject after `ms`; always clears its own timer. */
76048
76336
  async function withTimeout$1(promise, ms, label) {
@@ -77072,6 +77360,71 @@ Object.freeze({
77072
77360
  form: "single",
77073
77361
  optional: false
77074
77362
  }],
77363
+ "dishwasher.getStatus": [{
77364
+ name: "deviceId",
77365
+ form: "single",
77366
+ optional: false
77367
+ }],
77368
+ "dishwasher.pause": [{
77369
+ name: "deviceId",
77370
+ form: "single",
77371
+ optional: false
77372
+ }],
77373
+ "dishwasher.setChildLock": [{
77374
+ name: "deviceId",
77375
+ form: "single",
77376
+ optional: false
77377
+ }],
77378
+ "dishwasher.setExtraDry": [{
77379
+ name: "deviceId",
77380
+ form: "single",
77381
+ optional: false
77382
+ }],
77383
+ "dishwasher.setHalfLoad": [{
77384
+ name: "deviceId",
77385
+ form: "single",
77386
+ optional: false
77387
+ }],
77388
+ "dishwasher.setHygienePlus": [{
77389
+ name: "deviceId",
77390
+ form: "single",
77391
+ optional: false
77392
+ }],
77393
+ "dishwasher.setIntensiveZone": [{
77394
+ name: "deviceId",
77395
+ form: "single",
77396
+ optional: false
77397
+ }],
77398
+ "dishwasher.setOption": [{
77399
+ name: "deviceId",
77400
+ form: "single",
77401
+ optional: false
77402
+ }],
77403
+ "dishwasher.setPower": [{
77404
+ name: "deviceId",
77405
+ form: "single",
77406
+ optional: false
77407
+ }],
77408
+ "dishwasher.setProgram": [{
77409
+ name: "deviceId",
77410
+ form: "single",
77411
+ optional: false
77412
+ }],
77413
+ "dishwasher.setVarioSpeedPlus": [{
77414
+ name: "deviceId",
77415
+ form: "single",
77416
+ optional: false
77417
+ }],
77418
+ "dishwasher.start": [{
77419
+ name: "deviceId",
77420
+ form: "single",
77421
+ optional: false
77422
+ }],
77423
+ "dishwasher.stop": [{
77424
+ name: "deviceId",
77425
+ form: "single",
77426
+ optional: false
77427
+ }],
77075
77428
  "doorbell.getStatus": [{
77076
77429
  name: "deviceId",
77077
77430
  form: "single",
@@ -77141,6 +77494,11 @@ Object.freeze({
77141
77494
  form: "single",
77142
77495
  optional: false
77143
77496
  }],
77497
+ "heatingValve.getStatus": [{
77498
+ name: "deviceId",
77499
+ form: "single",
77500
+ optional: false
77501
+ }],
77144
77502
  "humidifier.getStatus": [{
77145
77503
  name: "deviceId",
77146
77504
  form: "single",
@@ -96944,7 +97302,7 @@ var AmcrestProviderAddon = class extends BaseDeviceProvider {
96944
97302
  throw new Error(`Amcrest: probe on ${host || "(unknown host)"} resolved neither mac nor host address — cannot persist a stable row key. Verify network reachability + credentials, then retry.`);
96945
97303
  }
96946
97304
  async onInitialize() {
96947
- const regs = await super.onInitialize();
97305
+ const regs = this.providerRegistrationsFromSuper(await super.onInitialize());
96948
97306
  this.clipService = createClipService({
96949
97307
  dataDir: this.ctx.dataDir,
96950
97308
  logger: this.ctx.logger,
package/dist/addon.mjs CHANGED
@@ -5420,7 +5420,7 @@ var ZodIssueCode = {
5420
5420
  var ZodFirstPartyTypeKind;
5421
5421
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5422
5422
  //#endregion
5423
- //#region ../types/dist/sleep-bZIhUvjd.mjs
5423
+ //#region ../types/dist/sleep-BegKjwUu.mjs
5424
5424
  /**
5425
5425
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5426
5426
  * window to float samples (D455).
@@ -8453,7 +8453,7 @@ function userError(code, params, englishFallback) {
8453
8453
  return new CamstackError(code, params, englishFallback);
8454
8454
  }
8455
8455
  //#endregion
8456
- //#region ../types/dist/err-msg--2RrYiLO.mjs
8456
+ //#region ../types/dist/err-msg-BXKzRBwg.mjs
8457
8457
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
8458
8458
  DeviceType["Camera"] = "camera";
8459
8459
  DeviceType["Hub"] = "hub";
@@ -8545,6 +8545,10 @@ var DeviceType = /* @__PURE__ */ function(DeviceType) {
8545
8545
  * native PetKit (`nodepetkit` `FeederDevice`), reusable by other feeder
8546
8546
  * integrations sharing the same food/desiccant/hopper surface. */
8547
8547
  DeviceType["PetFeeder"] = "pet-feeder";
8548
+ /** Built-in dishwasher — program lifecycle, door / remote-start gates,
8549
+ * salt and rinse-aid levels. Installed with the `dishwasher` cap.
8550
+ * Sources: native Bosch Home Connect, reusable by similar integrations. */
8551
+ DeviceType["Dishwasher"] = "dishwasher";
8548
8552
  return DeviceType;
8549
8553
  }({});
8550
8554
  var DeviceFeature = /* @__PURE__ */ function(DeviceFeature) {
@@ -8792,7 +8796,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
8792
8796
  return DeviceRole;
8793
8797
  }({});
8794
8798
  //#endregion
8795
- //#region ../types/dist/composition-DOwQB_Ua.mjs
8799
+ //#region ../types/dist/composition-CB6PMT9p.mjs
8796
8800
  /**
8797
8801
  * The ffmpeg build every CamStack node downloads, per platform and arch.
8798
8802
  *
@@ -13198,8 +13202,13 @@ var AlertSeveritySchema = _enum([
13198
13202
  "info",
13199
13203
  "success",
13200
13204
  "warning",
13201
- "error"
13205
+ "error",
13206
+ "critical"
13202
13207
  ]);
13208
+ var AlertActionSchema = object({
13209
+ label: string(),
13210
+ href: string().optional()
13211
+ });
13203
13212
  var AlertStatusSchema = _enum([
13204
13213
  "active",
13205
13214
  "in-progress",
@@ -13217,6 +13226,7 @@ var AlertSchema = object({
13217
13226
  severity: AlertSeveritySchema,
13218
13227
  title: string(),
13219
13228
  message: string(),
13229
+ action: AlertActionSchema.optional(),
13220
13230
  status: AlertStatusSchema,
13221
13231
  progress: number().optional(),
13222
13232
  read: boolean(),
@@ -17691,7 +17701,11 @@ var deviceDiscoveryCapability = {
17691
17701
  };
17692
17702
  /**
17693
17703
  * `device-adoption` — generic discovery + adoption surface,
17694
- * system-scoped singleton. The de-HA-ified successor to `ha-discovery`:
17704
+ * system-scoped collection (one provider per integration addon), routed
17705
+ * by explicit `{ addonId }` on direct `deviceAdoption.*` calls — the same
17706
+ * pin model as `connection-test`. The admin UI keeps using
17707
+ * `deviceManager.adoption*` (which already threads `addonId`). The de-HA-ified
17708
+ * successor to `ha-discovery`:
17695
17709
  * keyed by `integrationId` (the addon resolves integrationId → broker
17696
17710
  * internally) rather than a connection-specific `brokerId`, and it
17697
17711
  * REUSES the shared `DiscoveredChildDevice` candidate type from
@@ -54384,7 +54398,8 @@ var batteryCapability = {
54384
54398
  DeviceType.Button,
54385
54399
  DeviceType.Switch,
54386
54400
  DeviceType.PetFeeder,
54387
- DeviceType.Container
54401
+ DeviceType.Container,
54402
+ DeviceType.Thermostat
54388
54403
  ],
54389
54404
  methods: {
54390
54405
  /**
@@ -55857,6 +55872,161 @@ onStatusChanged: { data: object({
55857
55872
  * whether persisting is worth a SQLite commit. */
55858
55873
  volatileStateFields: ["lastChangedAt"]
55859
55874
  };
55875
+ /**
55876
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
55877
+ * consumable levels (salt, rinse aid) and common program options.
55878
+ *
55879
+ * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
55880
+ * by any integration that exposes the same program / option surface.
55881
+ *
55882
+ * `kind: 'poll'` — cloud REST APIs typically have no push channel; the
55883
+ * provider refreshes the slice on an interval and eagerly after commands.
55884
+ */
55885
+ var DishwasherStateSchema = _enum([
55886
+ "idle",
55887
+ "running",
55888
+ "paused",
55889
+ "finished",
55890
+ "error",
55891
+ "unavailable"
55892
+ ]);
55893
+ var DishwasherConsumableLevelSchema = _enum([
55894
+ "ok",
55895
+ "low",
55896
+ "empty"
55897
+ ]);
55898
+ var DishwasherStatusSchema = object({
55899
+ state: DishwasherStateSchema,
55900
+ /** Active program id/name, or null when none selected / unknown. */
55901
+ program: string().nullable(),
55902
+ /** Program tokens the hardware accepts — drives the UI selector. */
55903
+ availablePrograms: array(string()),
55904
+ /** Minutes remaining on the active cycle, or null when not running. */
55905
+ remainingMinutes: number().int().nonnegative().nullable(),
55906
+ /** Cycle completion 0..100, or null when not applicable. */
55907
+ progressPercent: number().min(0).max(100).nullable(),
55908
+ /** True when the door is reported open. */
55909
+ doorOpen: boolean(),
55910
+ /** True when remote start is allowed (door closed, power on, etc.). */
55911
+ remoteStartAllowed: boolean(),
55912
+ /** Main power / switched-on state. */
55913
+ powerOn: boolean(),
55914
+ saltLevel: DishwasherConsumableLevelSchema.nullable(),
55915
+ rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55916
+ halfLoad: boolean(),
55917
+ hygienePlus: boolean(),
55918
+ /** Extra dry option when the appliance exposes it. */
55919
+ extraDry: boolean(),
55920
+ /** Intensive zone (lower basket) when the appliance exposes it. */
55921
+ intensiveZone: boolean(),
55922
+ /** VarioSpeed / VarioSpeed+ when the appliance exposes it. */
55923
+ varioSpeedPlus: boolean(),
55924
+ /** Child lock (controls disabled on the appliance). */
55925
+ childLock: boolean(),
55926
+ errorCode: number().nullable(),
55927
+ errorLabel: string().nullable(),
55928
+ lastFetchedAt: number()
55929
+ });
55930
+ var dishwasherCapability = {
55931
+ name: "dishwasher",
55932
+ scope: "device",
55933
+ deviceNative: true,
55934
+ mode: "singleton",
55935
+ deviceTypes: [DeviceType.Dishwasher],
55936
+ methods: {
55937
+ start: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55938
+ kind: "mutation",
55939
+ auth: "protected"
55940
+ }),
55941
+ pause: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55942
+ kind: "mutation",
55943
+ auth: "protected"
55944
+ }),
55945
+ stop: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55946
+ kind: "mutation",
55947
+ auth: "protected"
55948
+ }),
55949
+ setProgram: method(object({
55950
+ deviceId: number().int().nonnegative(),
55951
+ program: string().min(1)
55952
+ }), _void(), {
55953
+ kind: "mutation",
55954
+ auth: "protected"
55955
+ }),
55956
+ setPower: method(object({
55957
+ deviceId: number().int().nonnegative(),
55958
+ on: boolean()
55959
+ }), _void(), {
55960
+ kind: "mutation",
55961
+ auth: "protected"
55962
+ }),
55963
+ setHalfLoad: method(object({
55964
+ deviceId: number().int().nonnegative(),
55965
+ on: boolean()
55966
+ }), _void(), {
55967
+ kind: "mutation",
55968
+ auth: "protected"
55969
+ }),
55970
+ setHygienePlus: method(object({
55971
+ deviceId: number().int().nonnegative(),
55972
+ on: boolean()
55973
+ }), _void(), {
55974
+ kind: "mutation",
55975
+ auth: "protected"
55976
+ }),
55977
+ setExtraDry: method(object({
55978
+ deviceId: number().int().nonnegative(),
55979
+ on: boolean()
55980
+ }), _void(), {
55981
+ kind: "mutation",
55982
+ auth: "protected"
55983
+ }),
55984
+ setIntensiveZone: method(object({
55985
+ deviceId: number().int().nonnegative(),
55986
+ on: boolean()
55987
+ }), _void(), {
55988
+ kind: "mutation",
55989
+ auth: "protected"
55990
+ }),
55991
+ setVarioSpeedPlus: method(object({
55992
+ deviceId: number().int().nonnegative(),
55993
+ on: boolean()
55994
+ }), _void(), {
55995
+ kind: "mutation",
55996
+ auth: "protected"
55997
+ }),
55998
+ setChildLock: method(object({
55999
+ deviceId: number().int().nonnegative(),
56000
+ on: boolean()
56001
+ }), _void(), {
56002
+ kind: "mutation",
56003
+ auth: "protected"
56004
+ }),
56005
+ setOption: method(object({
56006
+ deviceId: number().int().nonnegative(),
56007
+ key: string().min(1),
56008
+ value: union([
56009
+ boolean(),
56010
+ string(),
56011
+ number()
56012
+ ])
56013
+ }), _void(), {
56014
+ kind: "mutation",
56015
+ auth: "protected"
56016
+ })
56017
+ },
56018
+ status: {
56019
+ schema: DishwasherStatusSchema,
56020
+ kind: "poll"
56021
+ },
56022
+ runtimeState: DishwasherStatusSchema,
56023
+ durability: "session",
56024
+ history: { fields: { progressPercent: {
56025
+ kind: "gauge",
56026
+ unit: "%",
56027
+ deadband: 2
56028
+ } } }
56029
+ };
55860
56030
  var DoorbellStatusSchema = object({
55861
56031
  /** Ms epoch of the last press. null = never observed since this provider started. */
55862
56032
  lastPressedAt: number().nullable(),
@@ -56659,6 +56829,32 @@ var gasCapability = {
56659
56829
  * whether persisting is worth a SQLite commit. */
56660
56830
  volatileStateFields: ["lastChangedAt"]
56661
56831
  };
56832
+ var HeatingValveStatusSchema = object({
56833
+ /** Radiator valve opening 0 (closed) .. 100 (open). Null = not yet known. */
56834
+ position: number().min(0).max(100).nullable(),
56835
+ /** Ms epoch when the slice was last updated (push or poll). */
56836
+ lastFetchedAt: number()
56837
+ });
56838
+ var heatingValveCapability = {
56839
+ name: "heating-valve",
56840
+ scope: "device",
56841
+ deviceNative: true,
56842
+ mode: "singleton",
56843
+ deviceTypes: [DeviceType.Thermostat],
56844
+ methods: {},
56845
+ status: {
56846
+ schema: HeatingValveStatusSchema,
56847
+ kind: "push"
56848
+ },
56849
+ runtimeState: HeatingValveStatusSchema,
56850
+ durability: "session",
56851
+ history: { fields: { position: {
56852
+ kind: "gauge",
56853
+ unit: "%",
56854
+ deadband: 1
56855
+ } } },
56856
+ volatileStateFields: ["lastFetchedAt"]
56857
+ };
56662
56858
  /**
56663
56859
  * Humidifier / dehumidifier cap. Models HA `humidifier.*` entities —
56664
56860
  * an on/off actuator with an optional target-humidity setpoint and an
@@ -66541,6 +66737,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
66541
66737
  dayNight: dayNightCapability,
66542
66738
  deviceDiscovery: deviceDiscoveryCapability,
66543
66739
  deviceStatus: deviceStatusCapability,
66740
+ dishwasher: dishwasherCapability,
66544
66741
  doorbell: doorbellCapability,
66545
66742
  enumSensor: enumSensorCapability,
66546
66743
  eventEmitter: eventEmitterCapability,
@@ -66548,6 +66745,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
66548
66745
  featureProbe: featureProbeCapability,
66549
66746
  flood: floodCapability,
66550
66747
  gas: gasCapability,
66748
+ heatingValve: heatingValveCapability,
66551
66749
  humidifier: humidifierCapability,
66552
66750
  humiditySensor: humiditySensorCapability,
66553
66751
  image: imageCapability,
@@ -67273,6 +67471,12 @@ var BaseDeviceProvider = class extends BaseAddon {
67273
67471
  provider: this
67274
67472
  }];
67275
67473
  }
67474
+ /** Flatten `super.onInitialize()` whether it returned an array or an envelope. */
67475
+ providerRegistrationsFromSuper(result) {
67476
+ if (Array.isArray(result)) return result;
67477
+ if (result !== void 0 && result.providers !== void 0) return [...result.providers];
67478
+ return [];
67479
+ }
67276
67480
  async onShutdown() {
67277
67481
  this._restoreShuttingDown = true;
67278
67482
  this.cancelRestoreRetries();
@@ -67803,7 +68007,7 @@ var BaseDeviceProvider = class extends BaseAddon {
67803
68007
  function widenDeviceConstructor(ctor) {
67804
68008
  return ctor;
67805
68009
  }
67806
- DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Camera, DeviceType.Hub, DeviceType.Switch, DeviceType.Siren, DeviceType.Light, DeviceType.Fan, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder;
68010
+ DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Camera, DeviceType.Hub, DeviceType.Switch, DeviceType.Siren, DeviceType.Light, DeviceType.Fan, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher;
67807
68011
  new Set(Object.values(DeviceType));
67808
68012
  Object.freeze({
67809
68013
  "accessories.getStatus": {
@@ -70224,6 +70428,84 @@ Object.freeze({
70224
70428
  addonId: null,
70225
70429
  access: "view"
70226
70430
  },
70431
+ "dishwasher.getStatus": {
70432
+ capName: "dishwasher",
70433
+ capScope: "device",
70434
+ addonId: null,
70435
+ access: "view"
70436
+ },
70437
+ "dishwasher.pause": {
70438
+ capName: "dishwasher",
70439
+ capScope: "device",
70440
+ addonId: null,
70441
+ access: "create"
70442
+ },
70443
+ "dishwasher.setChildLock": {
70444
+ capName: "dishwasher",
70445
+ capScope: "device",
70446
+ addonId: null,
70447
+ access: "create"
70448
+ },
70449
+ "dishwasher.setExtraDry": {
70450
+ capName: "dishwasher",
70451
+ capScope: "device",
70452
+ addonId: null,
70453
+ access: "create"
70454
+ },
70455
+ "dishwasher.setHalfLoad": {
70456
+ capName: "dishwasher",
70457
+ capScope: "device",
70458
+ addonId: null,
70459
+ access: "create"
70460
+ },
70461
+ "dishwasher.setHygienePlus": {
70462
+ capName: "dishwasher",
70463
+ capScope: "device",
70464
+ addonId: null,
70465
+ access: "create"
70466
+ },
70467
+ "dishwasher.setIntensiveZone": {
70468
+ capName: "dishwasher",
70469
+ capScope: "device",
70470
+ addonId: null,
70471
+ access: "create"
70472
+ },
70473
+ "dishwasher.setOption": {
70474
+ capName: "dishwasher",
70475
+ capScope: "device",
70476
+ addonId: null,
70477
+ access: "create"
70478
+ },
70479
+ "dishwasher.setPower": {
70480
+ capName: "dishwasher",
70481
+ capScope: "device",
70482
+ addonId: null,
70483
+ access: "create"
70484
+ },
70485
+ "dishwasher.setProgram": {
70486
+ capName: "dishwasher",
70487
+ capScope: "device",
70488
+ addonId: null,
70489
+ access: "create"
70490
+ },
70491
+ "dishwasher.setVarioSpeedPlus": {
70492
+ capName: "dishwasher",
70493
+ capScope: "device",
70494
+ addonId: null,
70495
+ access: "create"
70496
+ },
70497
+ "dishwasher.start": {
70498
+ capName: "dishwasher",
70499
+ capScope: "device",
70500
+ addonId: null,
70501
+ access: "create"
70502
+ },
70503
+ "dishwasher.stop": {
70504
+ capName: "dishwasher",
70505
+ capScope: "device",
70506
+ addonId: null,
70507
+ access: "create"
70508
+ },
70227
70509
  "doorbell.getStatus": {
70228
70510
  capName: "doorbell",
70229
70511
  capScope: "device",
@@ -70434,6 +70716,12 @@ Object.freeze({
70434
70716
  addonId: null,
70435
70717
  access: "view"
70436
70718
  },
70719
+ "heatingValve.getStatus": {
70720
+ capName: "heating-valve",
70721
+ capScope: "device",
70722
+ addonId: null,
70723
+ access: "view"
70724
+ },
70437
70725
  "humidifier.getStatus": {
70438
70726
  capName: "humidifier",
70439
70727
  capScope: "device",
@@ -76021,7 +76309,7 @@ Object.freeze({
76021
76309
  access: "create"
76022
76310
  }
76023
76311
  });
76024
- DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder;
76312
+ DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher;
76025
76313
  DeviceFeature.BatteryOperated;
76026
76314
  /** Reject after `ms`; always clears its own timer. */
76027
76315
  async function withTimeout$1(promise, ms, label) {
@@ -77051,6 +77339,71 @@ Object.freeze({
77051
77339
  form: "single",
77052
77340
  optional: false
77053
77341
  }],
77342
+ "dishwasher.getStatus": [{
77343
+ name: "deviceId",
77344
+ form: "single",
77345
+ optional: false
77346
+ }],
77347
+ "dishwasher.pause": [{
77348
+ name: "deviceId",
77349
+ form: "single",
77350
+ optional: false
77351
+ }],
77352
+ "dishwasher.setChildLock": [{
77353
+ name: "deviceId",
77354
+ form: "single",
77355
+ optional: false
77356
+ }],
77357
+ "dishwasher.setExtraDry": [{
77358
+ name: "deviceId",
77359
+ form: "single",
77360
+ optional: false
77361
+ }],
77362
+ "dishwasher.setHalfLoad": [{
77363
+ name: "deviceId",
77364
+ form: "single",
77365
+ optional: false
77366
+ }],
77367
+ "dishwasher.setHygienePlus": [{
77368
+ name: "deviceId",
77369
+ form: "single",
77370
+ optional: false
77371
+ }],
77372
+ "dishwasher.setIntensiveZone": [{
77373
+ name: "deviceId",
77374
+ form: "single",
77375
+ optional: false
77376
+ }],
77377
+ "dishwasher.setOption": [{
77378
+ name: "deviceId",
77379
+ form: "single",
77380
+ optional: false
77381
+ }],
77382
+ "dishwasher.setPower": [{
77383
+ name: "deviceId",
77384
+ form: "single",
77385
+ optional: false
77386
+ }],
77387
+ "dishwasher.setProgram": [{
77388
+ name: "deviceId",
77389
+ form: "single",
77390
+ optional: false
77391
+ }],
77392
+ "dishwasher.setVarioSpeedPlus": [{
77393
+ name: "deviceId",
77394
+ form: "single",
77395
+ optional: false
77396
+ }],
77397
+ "dishwasher.start": [{
77398
+ name: "deviceId",
77399
+ form: "single",
77400
+ optional: false
77401
+ }],
77402
+ "dishwasher.stop": [{
77403
+ name: "deviceId",
77404
+ form: "single",
77405
+ optional: false
77406
+ }],
77054
77407
  "doorbell.getStatus": [{
77055
77408
  name: "deviceId",
77056
77409
  form: "single",
@@ -77120,6 +77473,11 @@ Object.freeze({
77120
77473
  form: "single",
77121
77474
  optional: false
77122
77475
  }],
77476
+ "heatingValve.getStatus": [{
77477
+ name: "deviceId",
77478
+ form: "single",
77479
+ optional: false
77480
+ }],
77123
77481
  "humidifier.getStatus": [{
77124
77482
  name: "deviceId",
77125
77483
  form: "single",
@@ -96923,7 +97281,7 @@ var AmcrestProviderAddon = class extends BaseDeviceProvider {
96923
97281
  throw new Error(`Amcrest: probe on ${host || "(unknown host)"} resolved neither mac nor host address — cannot persist a stable row key. Verify network reachability + credentials, then retry.`);
96924
97282
  }
96925
97283
  async onInitialize() {
96926
- const regs = await super.onInitialize();
97284
+ const regs = this.providerRegistrationsFromSuper(await super.onInitialize());
96927
97285
  this.clipService = createClipService({
96928
97286
  dataDir: this.ctx.dataDir,
96929
97287
  logger: this.ctx.logger,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-amcrest",
3
- "version": "0.2.137",
3
+ "version": "0.2.139",
4
4
  "description": "Amcrest/Dahua camera device provider addon for CamStack — Dahua CGI over HTTP(S) with digest auth (snapshot, RTSP catalog, PTZ, image/day-night config)",
5
5
  "keywords": [
6
6
  "camstack",