@camstack/addon-provider-dreo 0.2.128 → 0.2.129

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/addon.js +264 -44
  2. package/dist/addon.mjs +264 -44
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -35,7 +35,7 @@ var __toCommonJS = (mod) => __hasOwnProp.call(mod, "module.exports") ? mod["modu
35
35
  //#endregion
36
36
  let crypto$1 = require("crypto");
37
37
  let events = require("events");
38
- //#region ../types/dist/event-category-BvOFi6PY.mjs
38
+ //#region ../types/dist/event-category-DOl51-Ij.mjs
39
39
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
40
40
  EventCategory["SystemBoot"] = "system.boot";
41
41
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -114,9 +114,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
114
114
  /**
115
115
  * The node's one-shot runner boot check (D877): planned runners against the
116
116
  * process service, `degraded` when any is failed, refused or missing. The
117
- * alert centre turns it into one alert and a direct critical push.
117
+ * alert centre turns it into one critical alert.
118
118
  */
119
119
  EventCategory["SystemRunnerCheck"] = "system.runner-check";
120
+ /**
121
+ * An alert EPISODE opened or closed, emitted by the alert centre for alerts
122
+ * of severity `critical` or `error` (`AlertEpisodePayload`). The alert
123
+ * centre sends no notification of its own: Notification Center turns this
124
+ * into the `alert-critical` / `alert-error` / `alert-critical-resolved`
125
+ * system-event kinds, and reconciles from the alerts store because a bus
126
+ * event may be dropped (D8, D11).
127
+ */
128
+ EventCategory["AlertEpisode"] = "alert.episode";
120
129
  EventCategory["AddonError"] = "addon.error";
121
130
  EventCategory["AddonPageReady"] = "addon.page-ready";
122
131
  EventCategory["AddonWidgetReady"] = "addon.widget-ready";
@@ -5441,7 +5450,7 @@ var ZodIssueCode = {
5441
5450
  var ZodFirstPartyTypeKind;
5442
5451
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5443
5452
  //#endregion
5444
- //#region ../types/dist/sleep-BegKjwUu.mjs
5453
+ //#region ../types/dist/sleep-BxjU_fJM.mjs
5445
5454
  /**
5446
5455
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5447
5456
  * window to float samples (D455).
@@ -13204,7 +13213,14 @@ var AlertSeveritySchema = _enum([
13204
13213
  ]);
13205
13214
  var AlertActionSchema = object({
13206
13215
  label: string(),
13207
- href: string().optional()
13216
+ href: string().optional(),
13217
+ /**
13218
+ * How `href` is followed. Absent / `app`: an admin-ui route (client-side).
13219
+ * `server`: a route the HUB serves (an addon HTTP route such as an OAuth
13220
+ * start) — the browser must leave the SPA with a full navigation, because
13221
+ * the SPA has no such route and would bounce to the home page.
13222
+ */
13223
+ navigation: _enum(["app", "server"]).optional()
13208
13224
  });
13209
13225
  var AlertStatusSchema = _enum([
13210
13226
  "active",
@@ -41937,6 +41953,9 @@ var NcSystemEventKindSchema = _enum([
41937
41953
  "server-updated",
41938
41954
  "export-completed",
41939
41955
  "backup-completed",
41956
+ "alert-critical",
41957
+ "alert-error",
41958
+ "alert-critical-resolved",
41940
41959
  "camera-online",
41941
41960
  "camera-offline",
41942
41961
  "camera-disabled",
@@ -51013,7 +51032,10 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
51013
51032
  }), method(object({ jobId: string().optional() }), StorageMigrationJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
51014
51033
  kind: "mutation",
51015
51034
  auth: "admin"
51016
- }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
51035
+ }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({ locationIds: array(string()).readonly() }), object({
51036
+ clear: boolean(),
51037
+ repointLocationId: string().optional()
51038
+ }), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
51017
51039
  kind: "mutation",
51018
51040
  auth: "admin"
51019
51041
  }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
@@ -55277,6 +55299,11 @@ onStatusChanged: { data: object({
55277
55299
  *
55278
55300
  * `kind: 'poll'` — cloud REST APIs typically have no push channel; the
55279
55301
  * provider refreshes the slice on an interval and eagerly after commands.
55302
+ *
55303
+ * UNKNOWN IS NOT OFF. Every field the appliance reports separately is
55304
+ * nullable: `null` means "not known right now" (the appliance has not said,
55305
+ * the link is down, or the description does not carry it) and is never
55306
+ * rendered or exported as `false` / `0`. `availability` says why.
55280
55307
  */
55281
55308
  var DishwasherStateSchema = _enum([
55282
55309
  "idle",
@@ -55286,43 +55313,155 @@ var DishwasherStateSchema = _enum([
55286
55313
  "error",
55287
55314
  "unavailable"
55288
55315
  ]);
55316
+ /**
55317
+ * The appliance's own operation state, uncollapsed. `state` above is the coarse
55318
+ * view for compact surfaces; this is what the appliance said.
55319
+ */
55320
+ var DishwasherOperationStateSchema = _enum([
55321
+ "Inactive",
55322
+ "Ready",
55323
+ "DelayedStart",
55324
+ "Run",
55325
+ "Pause",
55326
+ "ActionRequired",
55327
+ "Finished",
55328
+ "Error",
55329
+ "Aborting"
55330
+ ]);
55331
+ /**
55332
+ * Why fields may be `null`:
55333
+ * - `available` — the link is up and the description is loaded;
55334
+ * - `offline` — the local link is down (values are unknown, not last-known);
55335
+ * - `description-missing` — the link is up but the appliance's description could not
55336
+ * be loaded, so its values cannot be decoded.
55337
+ */
55338
+ var DishwasherAvailabilitySchema = _enum([
55339
+ "available",
55340
+ "offline",
55341
+ "description-missing"
55342
+ ]);
55289
55343
  var DishwasherConsumableLevelSchema = _enum([
55290
55344
  "ok",
55291
55345
  "low",
55292
55346
  "empty"
55293
55347
  ]);
55294
55348
  var DishwasherStatusSchema = object({
55349
+ availability: DishwasherAvailabilitySchema,
55350
+ /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
55295
55351
  state: DishwasherStateSchema,
55296
- /** Active program id/name, or null when none selected / unknown. */
55352
+ /** The appliance's operation state as reported; null when not known. */
55353
+ operationState: DishwasherOperationStateSchema.nullable(),
55354
+ /** Feature key of the ACTIVE (running) program, or null when none runs / not known. */
55297
55355
  program: string().nullable(),
55298
- /** Program tokens the hardware accepts — drives the UI selector. */
55356
+ /** Feature key of the SELECTED program (what Start would run), or null when none / not known. */
55357
+ selectedProgram: string().nullable(),
55358
+ /** Feature keys of the programs the appliance currently offers — drives the UI selector. */
55299
55359
  availablePrograms: array(string()),
55300
- /** Minutes remaining on the active cycle, or null when not running. */
55301
- remainingMinutes: number().int().nonnegative().nullable(),
55360
+ /** Seconds remaining on the active cycle, or null when not running / not known. */
55361
+ remainingSeconds: number().int().nonnegative().nullable(),
55362
+ /** Seconds the delayed start is set to (time until the cycle starts), or null. */
55363
+ delayedStartSeconds: number().int().nonnegative().nullable(),
55302
55364
  /** Cycle completion 0..100, or null when not applicable. */
55303
55365
  progressPercent: number().min(0).max(100).nullable(),
55304
- /** True when the door is reported open. */
55305
- doorOpen: boolean(),
55306
- /** True when remote start is allowed (door closed, power on, etc.). */
55307
- remoteStartAllowed: boolean(),
55308
- /** Main power / switched-on state. */
55309
- powerOn: boolean(),
55366
+ /** True when the door is reported open; null when the door state is not known. */
55367
+ doorOpen: boolean().nullable(),
55368
+ /** True when the door is latched (locked) during a cycle; null when not reported. */
55369
+ doorLocked: boolean().nullable(),
55370
+ /** True when remote start is allowed (door closed, power on, etc.); null when not known. */
55371
+ remoteStartAllowed: boolean().nullable(),
55372
+ /** True when the appliance accepts remote control now; null when not known. */
55373
+ remoteControlActive: boolean().nullable(),
55374
+ /** True while somebody operates the appliance at its panel; null when not reported. */
55375
+ localControlActive: boolean().nullable(),
55376
+ /** Main power / switched-on state; null when not known. */
55377
+ powerOn: boolean().nullable(),
55378
+ /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
55379
+ powerState: string().nullable(),
55310
55380
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
55311
55381
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55312
- halfLoad: boolean(),
55313
- hygienePlus: boolean(),
55382
+ /** Option states: null when the appliance does not expose the option or has not said. */
55383
+ halfLoad: boolean().nullable(),
55384
+ hygienePlus: boolean().nullable(),
55314
55385
  /** Extra dry option when the appliance exposes it. */
55315
- extraDry: boolean(),
55386
+ extraDry: boolean().nullable(),
55316
55387
  /** Intensive zone (lower basket) when the appliance exposes it. */
55317
- intensiveZone: boolean(),
55388
+ intensiveZone: boolean().nullable(),
55318
55389
  /** VarioSpeed / VarioSpeed+ when the appliance exposes it. */
55319
- varioSpeedPlus: boolean(),
55320
- /** Child lock (controls disabled on the appliance). */
55321
- childLock: boolean(),
55390
+ varioSpeedPlus: boolean().nullable(),
55391
+ /** Child lock (controls disabled on the appliance); null when not known. */
55392
+ childLock: boolean().nullable(),
55393
+ /** Feature keys of the events currently raised (salt low, rinse aid low, program finished, …). */
55394
+ activeEvents: array(string()),
55395
+ /** Numeric error code when the appliance reports one; null otherwise. */
55322
55396
  errorCode: number().nullable(),
55397
+ /** Name of the raised alert-level event while the appliance is in error; null otherwise. */
55323
55398
  errorLabel: string().nullable(),
55399
+ /** Ms epoch of the last value received from the appliance; 0 = never. */
55324
55400
  lastFetchedAt: number()
55325
55401
  });
55402
+ var DeviceIdSchema = number().int().nonnegative();
55403
+ /** A value a program option or setting can take. */
55404
+ var DishwasherValueSchema = union([
55405
+ boolean(),
55406
+ string(),
55407
+ number()
55408
+ ]);
55409
+ var DishwasherAccessSchema = _enum([
55410
+ "none",
55411
+ "read",
55412
+ "readWrite",
55413
+ "writeOnly",
55414
+ "readStatic"
55415
+ ]);
55416
+ /**
55417
+ * One option or setting the appliance declares, with the constraints its description
55418
+ * gives. A `readWrite` descriptor that is `available` is what `setOption` accepts.
55419
+ */
55420
+ var DishwasherOptionDescriptorSchema = object({
55421
+ /** Feature key (`Dishcare.Dishwasher.Option.ExtraDry`). */
55422
+ key: string(),
55423
+ /** Last segment of the key, for display. */
55424
+ name: string(),
55425
+ type: _enum([
55426
+ "boolean",
55427
+ "number",
55428
+ "enum",
55429
+ "string"
55430
+ ]),
55431
+ access: DishwasherAccessSchema,
55432
+ /** The appliance reports this entity as currently available. */
55433
+ available: boolean(),
55434
+ /** Unit the description declares for a number; null when it declares none. */
55435
+ unit: string().nullable(),
55436
+ min: number().nullable(),
55437
+ max: number().nullable(),
55438
+ step: number().nullable(),
55439
+ /** Allowed members of an enum; null for other types. */
55440
+ enumValues: array(string()).nullable(),
55441
+ defaultValue: DishwasherValueSchema.nullable()
55442
+ });
55443
+ var DishwasherProgramSchema = object({
55444
+ /** Feature key (`Dishcare.Dishwasher.Program.Eco50`) — what `setProgram` / `start` take. */
55445
+ key: string(),
55446
+ name: string(),
55447
+ /** The appliance currently offers this program. */
55448
+ available: boolean(),
55449
+ /** The options this program lists, with the program-level access / availability / default. */
55450
+ options: array(DishwasherOptionDescriptorSchema)
55451
+ });
55452
+ var DishwasherOptionsSchema = object({
55453
+ availability: DishwasherAvailabilitySchema,
55454
+ /** What the appliance can be told to do, from the commands its description declares. */
55455
+ supportsStart: boolean(),
55456
+ supportsPause: boolean(),
55457
+ supportsResume: boolean(),
55458
+ supportsStop: boolean(),
55459
+ supportsPower: boolean(),
55460
+ /** Every program the description lists, with its options. */
55461
+ programs: array(DishwasherProgramSchema),
55462
+ /** Every option and setting entity the description lists (programs reference these by key). */
55463
+ options: array(DishwasherOptionDescriptorSchema)
55464
+ });
55326
55465
  var dishwasherCapability = {
55327
55466
  name: "dishwasher",
55328
55467
  scope: "device",
@@ -55330,86 +55469,102 @@ var dishwasherCapability = {
55330
55469
  mode: "singleton",
55331
55470
  deviceTypes: [DeviceType.Dishwasher],
55332
55471
  methods: {
55333
- start: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55472
+ /**
55473
+ * Start a program. Without `program` the selected one starts. `options` are
55474
+ * option feature keys; each is checked against the program's constraints.
55475
+ */
55476
+ start: method(object({
55477
+ deviceId: DeviceIdSchema,
55478
+ program: string().min(1).optional(),
55479
+ options: record(string(), DishwasherValueSchema).optional()
55480
+ }), _void(), {
55334
55481
  kind: "mutation",
55335
55482
  auth: "protected"
55336
55483
  }),
55337
- pause: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55484
+ pause: method(object({ deviceId: DeviceIdSchema }), _void(), {
55338
55485
  kind: "mutation",
55339
55486
  auth: "protected"
55340
55487
  }),
55341
- stop: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55488
+ resume: method(object({ deviceId: DeviceIdSchema }), _void(), {
55489
+ kind: "mutation",
55490
+ auth: "protected"
55491
+ }),
55492
+ stop: method(object({ deviceId: DeviceIdSchema }), _void(), {
55342
55493
  kind: "mutation",
55343
55494
  auth: "protected"
55344
55495
  }),
55496
+ /** Select (not start) a program; refused when the appliance does not offer it. */
55345
55497
  setProgram: method(object({
55346
- deviceId: number().int().nonnegative(),
55498
+ deviceId: DeviceIdSchema,
55347
55499
  program: string().min(1)
55348
55500
  }), _void(), {
55349
55501
  kind: "mutation",
55350
55502
  auth: "protected"
55351
55503
  }),
55352
55504
  setPower: method(object({
55353
- deviceId: number().int().nonnegative(),
55505
+ deviceId: DeviceIdSchema,
55354
55506
  on: boolean()
55355
55507
  }), _void(), {
55356
55508
  kind: "mutation",
55357
55509
  auth: "protected"
55358
55510
  }),
55359
55511
  setHalfLoad: method(object({
55360
- deviceId: number().int().nonnegative(),
55512
+ deviceId: DeviceIdSchema,
55361
55513
  on: boolean()
55362
55514
  }), _void(), {
55363
55515
  kind: "mutation",
55364
55516
  auth: "protected"
55365
55517
  }),
55366
55518
  setHygienePlus: method(object({
55367
- deviceId: number().int().nonnegative(),
55519
+ deviceId: DeviceIdSchema,
55368
55520
  on: boolean()
55369
55521
  }), _void(), {
55370
55522
  kind: "mutation",
55371
55523
  auth: "protected"
55372
55524
  }),
55373
55525
  setExtraDry: method(object({
55374
- deviceId: number().int().nonnegative(),
55526
+ deviceId: DeviceIdSchema,
55375
55527
  on: boolean()
55376
55528
  }), _void(), {
55377
55529
  kind: "mutation",
55378
55530
  auth: "protected"
55379
55531
  }),
55380
55532
  setIntensiveZone: method(object({
55381
- deviceId: number().int().nonnegative(),
55533
+ deviceId: DeviceIdSchema,
55382
55534
  on: boolean()
55383
55535
  }), _void(), {
55384
55536
  kind: "mutation",
55385
55537
  auth: "protected"
55386
55538
  }),
55387
55539
  setVarioSpeedPlus: method(object({
55388
- deviceId: number().int().nonnegative(),
55540
+ deviceId: DeviceIdSchema,
55389
55541
  on: boolean()
55390
55542
  }), _void(), {
55391
55543
  kind: "mutation",
55392
55544
  auth: "protected"
55393
55545
  }),
55394
55546
  setChildLock: method(object({
55395
- deviceId: number().int().nonnegative(),
55547
+ deviceId: DeviceIdSchema,
55396
55548
  on: boolean()
55397
55549
  }), _void(), {
55398
55550
  kind: "mutation",
55399
55551
  auth: "protected"
55400
55552
  }),
55553
+ /**
55554
+ * Write any option or setting by feature key. Refused when the description does
55555
+ * not list it, it is not writable or not available now, or the value is outside
55556
+ * its declared range / members.
55557
+ */
55401
55558
  setOption: method(object({
55402
- deviceId: number().int().nonnegative(),
55559
+ deviceId: DeviceIdSchema,
55403
55560
  key: string().min(1),
55404
- value: union([
55405
- boolean(),
55406
- string(),
55407
- number()
55408
- ])
55561
+ value: DishwasherValueSchema
55409
55562
  }), _void(), {
55410
55563
  kind: "mutation",
55411
55564
  auth: "protected"
55412
- })
55565
+ }),
55566
+ /** What this appliance can do, from its own description — the UI is derived from it. */
55567
+ getOptions: method(object({ deviceId: DeviceIdSchema }), DishwasherOptionsSchema, { auth: "protected" })
55413
55568
  },
55414
55569
  status: {
55415
55570
  schema: DishwasherStatusSchema,
@@ -69358,6 +69513,12 @@ Object.freeze({
69358
69513
  addonId: null,
69359
69514
  access: "view"
69360
69515
  },
69516
+ "dishwasher.getOptions": {
69517
+ capName: "dishwasher",
69518
+ capScope: "device",
69519
+ addonId: null,
69520
+ access: "view"
69521
+ },
69361
69522
  "dishwasher.getStatus": {
69362
69523
  capName: "dishwasher",
69363
69524
  capScope: "device",
@@ -69370,6 +69531,12 @@ Object.freeze({
69370
69531
  addonId: null,
69371
69532
  access: "create"
69372
69533
  },
69534
+ "dishwasher.resume": {
69535
+ capName: "dishwasher",
69536
+ capScope: "device",
69537
+ addonId: null,
69538
+ access: "create"
69539
+ },
69373
69540
  "dishwasher.setChildLock": {
69374
69541
  capName: "dishwasher",
69375
69542
  capScope: "device",
@@ -73870,6 +74037,12 @@ Object.freeze({
73870
74037
  addonId: null,
73871
74038
  access: "view"
73872
74039
  },
74040
+ "storageMigration.moverClearance": {
74041
+ capName: "storage-migration",
74042
+ capScope: "system",
74043
+ addonId: null,
74044
+ access: "view"
74045
+ },
73873
74046
  "storageMigration.movers": {
73874
74047
  capName: "storage-migration",
73875
74048
  capScope: "system",
@@ -76063,6 +76236,11 @@ Object.freeze({
76063
76236
  form: "single",
76064
76237
  optional: false
76065
76238
  }],
76239
+ "dishwasher.getOptions": [{
76240
+ name: "deviceId",
76241
+ form: "single",
76242
+ optional: false
76243
+ }],
76066
76244
  "dishwasher.getStatus": [{
76067
76245
  name: "deviceId",
76068
76246
  form: "single",
@@ -76073,6 +76251,11 @@ Object.freeze({
76073
76251
  form: "single",
76074
76252
  optional: false
76075
76253
  }],
76254
+ "dishwasher.resume": [{
76255
+ name: "deviceId",
76256
+ form: "single",
76257
+ optional: false
76258
+ }],
76076
76259
  "dishwasher.setChildLock": [{
76077
76260
  name: "deviceId",
76078
76261
  form: "single",
@@ -78159,6 +78342,9 @@ new Map(Object.entries({
78159
78342
  "wrapper-update-available": "system",
78160
78343
  "backup-completed": "system",
78161
78344
  "export-completed": "system",
78345
+ "alert-critical": "system",
78346
+ "alert-error": "system",
78347
+ "alert-critical-resolved": "system",
78162
78348
  "storage-location-low": "system",
78163
78349
  "storage-location-critical": "system",
78164
78350
  "storage-location-ok": "system",
@@ -78283,6 +78469,16 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78283
78469
  "storage-location-ok"
78284
78470
  ]
78285
78471
  },
78472
+ {
78473
+ id: "alerts",
78474
+ family: "system",
78475
+ label: "Alerts",
78476
+ kinds: [
78477
+ "alert-critical",
78478
+ "alert-error",
78479
+ "alert-critical-resolved"
78480
+ ]
78481
+ },
78286
78482
  {
78287
78483
  id: "alarm",
78288
78484
  family: "alarm",
@@ -78327,6 +78523,21 @@ var NC_SENSOR_RAISED_FIELD_BY_KIND = Object.freeze(Object.fromEntries(Object.ent
78327
78523
  return [[descriptor.kind, field]];
78328
78524
  })));
78329
78525
  Object.freeze(Object.keys(NC_SENSOR_RAISED_FIELD_BY_KIND));
78526
+ object({
78527
+ phase: _enum(["raised", "resolved"]),
78528
+ episodeId: string().min(1),
78529
+ alertId: string().min(1),
78530
+ severity: AlertSeveritySchema,
78531
+ category: string(),
78532
+ title: string(),
78533
+ message: string(),
78534
+ sourceType: string().optional(),
78535
+ sourceId: string().optional(),
78536
+ nodeId: string().optional(),
78537
+ /** The alert's own action link (where the operator acts on it), when it has one. */
78538
+ actionUrl: string().optional(),
78539
+ at: number()
78540
+ });
78330
78541
  var RULE_BODY_ONLY = ["body"];
78331
78542
  var RULE_TEXT = ["title", "body"];
78332
78543
  var BATTERY = ["device-battery-low", "device-battery-normal"];
@@ -78336,6 +78547,11 @@ var TANK = [
78336
78547
  "device-tank-full",
78337
78548
  "device-tank-normal"
78338
78549
  ];
78550
+ var ALERT_EPISODE = [
78551
+ "alert-critical",
78552
+ "alert-error",
78553
+ "alert-critical-resolved"
78554
+ ];
78339
78555
  var UPDATES = [
78340
78556
  "addon-update-available",
78341
78557
  "server-update-available",
@@ -78528,14 +78744,14 @@ var STATE_SUMMARY_VARS = [
78528
78744
  ([...RULE_TEXT], [...CONSUMABLE]),
78529
78745
  ([...RULE_TEXT], [...TANK]),
78530
78746
  [...RULE_TEXT],
78531
- ([...RULE_TEXT], [...UPDATES]),
78532
- ([...RULE_TEXT], [...UPDATES]),
78533
- [...RULE_TEXT],
78747
+ ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
78748
+ ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
78534
78749
  [...RULE_TEXT],
78535
78750
  [...RULE_TEXT],
78536
78751
  [...RULE_TEXT],
78537
78752
  [...RULE_TEXT],
78538
78753
  [...RULE_TEXT],
78754
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78539
78755
  [...RULE_TEXT],
78540
78756
  [...RULE_TEXT],
78541
78757
  [...RULE_TEXT],
@@ -78553,7 +78769,11 @@ var STATE_SUMMARY_VARS = [
78553
78769
  [...RULE_TEXT],
78554
78770
  [...RULE_TEXT],
78555
78771
  [...RULE_TEXT],
78556
- [...RULE_TEXT],
78772
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78773
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78774
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78775
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78776
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78557
78777
  [...RULE_TEXT],
78558
78778
  [...RULE_TEXT],
78559
78779
  [...RULE_TEXT],
package/dist/addon.mjs CHANGED
@@ -36,7 +36,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
36
36
  var __toCommonJS = (mod) => __hasOwnProp.call(mod, "module.exports") ? mod["module.exports"] : __copyProps(__defProp({}, "__esModule", { value: true }), mod);
37
37
  var __require = /* @__PURE__ */ createRequire(import.meta.url);
38
38
  //#endregion
39
- //#region ../types/dist/event-category-BvOFi6PY.mjs
39
+ //#region ../types/dist/event-category-DOl51-Ij.mjs
40
40
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
41
41
  EventCategory["SystemBoot"] = "system.boot";
42
42
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -115,9 +115,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
115
115
  /**
116
116
  * The node's one-shot runner boot check (D877): planned runners against the
117
117
  * process service, `degraded` when any is failed, refused or missing. The
118
- * alert centre turns it into one alert and a direct critical push.
118
+ * alert centre turns it into one critical alert.
119
119
  */
120
120
  EventCategory["SystemRunnerCheck"] = "system.runner-check";
121
+ /**
122
+ * An alert EPISODE opened or closed, emitted by the alert centre for alerts
123
+ * of severity `critical` or `error` (`AlertEpisodePayload`). The alert
124
+ * centre sends no notification of its own: Notification Center turns this
125
+ * into the `alert-critical` / `alert-error` / `alert-critical-resolved`
126
+ * system-event kinds, and reconciles from the alerts store because a bus
127
+ * event may be dropped (D8, D11).
128
+ */
129
+ EventCategory["AlertEpisode"] = "alert.episode";
121
130
  EventCategory["AddonError"] = "addon.error";
122
131
  EventCategory["AddonPageReady"] = "addon.page-ready";
123
132
  EventCategory["AddonWidgetReady"] = "addon.widget-ready";
@@ -5442,7 +5451,7 @@ var ZodIssueCode = {
5442
5451
  var ZodFirstPartyTypeKind;
5443
5452
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5444
5453
  //#endregion
5445
- //#region ../types/dist/sleep-BegKjwUu.mjs
5454
+ //#region ../types/dist/sleep-BxjU_fJM.mjs
5446
5455
  /**
5447
5456
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5448
5457
  * window to float samples (D455).
@@ -13205,7 +13214,14 @@ var AlertSeveritySchema = _enum([
13205
13214
  ]);
13206
13215
  var AlertActionSchema = object({
13207
13216
  label: string(),
13208
- href: string().optional()
13217
+ href: string().optional(),
13218
+ /**
13219
+ * How `href` is followed. Absent / `app`: an admin-ui route (client-side).
13220
+ * `server`: a route the HUB serves (an addon HTTP route such as an OAuth
13221
+ * start) — the browser must leave the SPA with a full navigation, because
13222
+ * the SPA has no such route and would bounce to the home page.
13223
+ */
13224
+ navigation: _enum(["app", "server"]).optional()
13209
13225
  });
13210
13226
  var AlertStatusSchema = _enum([
13211
13227
  "active",
@@ -41938,6 +41954,9 @@ var NcSystemEventKindSchema = _enum([
41938
41954
  "server-updated",
41939
41955
  "export-completed",
41940
41956
  "backup-completed",
41957
+ "alert-critical",
41958
+ "alert-error",
41959
+ "alert-critical-resolved",
41941
41960
  "camera-online",
41942
41961
  "camera-offline",
41943
41962
  "camera-disabled",
@@ -51014,7 +51033,10 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
51014
51033
  }), method(object({ jobId: string().optional() }), StorageMigrationJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
51015
51034
  kind: "mutation",
51016
51035
  auth: "admin"
51017
- }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
51036
+ }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({ locationIds: array(string()).readonly() }), object({
51037
+ clear: boolean(),
51038
+ repointLocationId: string().optional()
51039
+ }), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
51018
51040
  kind: "mutation",
51019
51041
  auth: "admin"
51020
51042
  }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
@@ -55278,6 +55300,11 @@ onStatusChanged: { data: object({
55278
55300
  *
55279
55301
  * `kind: 'poll'` — cloud REST APIs typically have no push channel; the
55280
55302
  * provider refreshes the slice on an interval and eagerly after commands.
55303
+ *
55304
+ * UNKNOWN IS NOT OFF. Every field the appliance reports separately is
55305
+ * nullable: `null` means "not known right now" (the appliance has not said,
55306
+ * the link is down, or the description does not carry it) and is never
55307
+ * rendered or exported as `false` / `0`. `availability` says why.
55281
55308
  */
55282
55309
  var DishwasherStateSchema = _enum([
55283
55310
  "idle",
@@ -55287,43 +55314,155 @@ var DishwasherStateSchema = _enum([
55287
55314
  "error",
55288
55315
  "unavailable"
55289
55316
  ]);
55317
+ /**
55318
+ * The appliance's own operation state, uncollapsed. `state` above is the coarse
55319
+ * view for compact surfaces; this is what the appliance said.
55320
+ */
55321
+ var DishwasherOperationStateSchema = _enum([
55322
+ "Inactive",
55323
+ "Ready",
55324
+ "DelayedStart",
55325
+ "Run",
55326
+ "Pause",
55327
+ "ActionRequired",
55328
+ "Finished",
55329
+ "Error",
55330
+ "Aborting"
55331
+ ]);
55332
+ /**
55333
+ * Why fields may be `null`:
55334
+ * - `available` — the link is up and the description is loaded;
55335
+ * - `offline` — the local link is down (values are unknown, not last-known);
55336
+ * - `description-missing` — the link is up but the appliance's description could not
55337
+ * be loaded, so its values cannot be decoded.
55338
+ */
55339
+ var DishwasherAvailabilitySchema = _enum([
55340
+ "available",
55341
+ "offline",
55342
+ "description-missing"
55343
+ ]);
55290
55344
  var DishwasherConsumableLevelSchema = _enum([
55291
55345
  "ok",
55292
55346
  "low",
55293
55347
  "empty"
55294
55348
  ]);
55295
55349
  var DishwasherStatusSchema = object({
55350
+ availability: DishwasherAvailabilitySchema,
55351
+ /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
55296
55352
  state: DishwasherStateSchema,
55297
- /** Active program id/name, or null when none selected / unknown. */
55353
+ /** The appliance's operation state as reported; null when not known. */
55354
+ operationState: DishwasherOperationStateSchema.nullable(),
55355
+ /** Feature key of the ACTIVE (running) program, or null when none runs / not known. */
55298
55356
  program: string().nullable(),
55299
- /** Program tokens the hardware accepts — drives the UI selector. */
55357
+ /** Feature key of the SELECTED program (what Start would run), or null when none / not known. */
55358
+ selectedProgram: string().nullable(),
55359
+ /** Feature keys of the programs the appliance currently offers — drives the UI selector. */
55300
55360
  availablePrograms: array(string()),
55301
- /** Minutes remaining on the active cycle, or null when not running. */
55302
- remainingMinutes: number().int().nonnegative().nullable(),
55361
+ /** Seconds remaining on the active cycle, or null when not running / not known. */
55362
+ remainingSeconds: number().int().nonnegative().nullable(),
55363
+ /** Seconds the delayed start is set to (time until the cycle starts), or null. */
55364
+ delayedStartSeconds: number().int().nonnegative().nullable(),
55303
55365
  /** Cycle completion 0..100, or null when not applicable. */
55304
55366
  progressPercent: number().min(0).max(100).nullable(),
55305
- /** True when the door is reported open. */
55306
- doorOpen: boolean(),
55307
- /** True when remote start is allowed (door closed, power on, etc.). */
55308
- remoteStartAllowed: boolean(),
55309
- /** Main power / switched-on state. */
55310
- powerOn: boolean(),
55367
+ /** True when the door is reported open; null when the door state is not known. */
55368
+ doorOpen: boolean().nullable(),
55369
+ /** True when the door is latched (locked) during a cycle; null when not reported. */
55370
+ doorLocked: boolean().nullable(),
55371
+ /** True when remote start is allowed (door closed, power on, etc.); null when not known. */
55372
+ remoteStartAllowed: boolean().nullable(),
55373
+ /** True when the appliance accepts remote control now; null when not known. */
55374
+ remoteControlActive: boolean().nullable(),
55375
+ /** True while somebody operates the appliance at its panel; null when not reported. */
55376
+ localControlActive: boolean().nullable(),
55377
+ /** Main power / switched-on state; null when not known. */
55378
+ powerOn: boolean().nullable(),
55379
+ /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
55380
+ powerState: string().nullable(),
55311
55381
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
55312
55382
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55313
- halfLoad: boolean(),
55314
- hygienePlus: boolean(),
55383
+ /** Option states: null when the appliance does not expose the option or has not said. */
55384
+ halfLoad: boolean().nullable(),
55385
+ hygienePlus: boolean().nullable(),
55315
55386
  /** Extra dry option when the appliance exposes it. */
55316
- extraDry: boolean(),
55387
+ extraDry: boolean().nullable(),
55317
55388
  /** Intensive zone (lower basket) when the appliance exposes it. */
55318
- intensiveZone: boolean(),
55389
+ intensiveZone: boolean().nullable(),
55319
55390
  /** VarioSpeed / VarioSpeed+ when the appliance exposes it. */
55320
- varioSpeedPlus: boolean(),
55321
- /** Child lock (controls disabled on the appliance). */
55322
- childLock: boolean(),
55391
+ varioSpeedPlus: boolean().nullable(),
55392
+ /** Child lock (controls disabled on the appliance); null when not known. */
55393
+ childLock: boolean().nullable(),
55394
+ /** Feature keys of the events currently raised (salt low, rinse aid low, program finished, …). */
55395
+ activeEvents: array(string()),
55396
+ /** Numeric error code when the appliance reports one; null otherwise. */
55323
55397
  errorCode: number().nullable(),
55398
+ /** Name of the raised alert-level event while the appliance is in error; null otherwise. */
55324
55399
  errorLabel: string().nullable(),
55400
+ /** Ms epoch of the last value received from the appliance; 0 = never. */
55325
55401
  lastFetchedAt: number()
55326
55402
  });
55403
+ var DeviceIdSchema = number().int().nonnegative();
55404
+ /** A value a program option or setting can take. */
55405
+ var DishwasherValueSchema = union([
55406
+ boolean(),
55407
+ string(),
55408
+ number()
55409
+ ]);
55410
+ var DishwasherAccessSchema = _enum([
55411
+ "none",
55412
+ "read",
55413
+ "readWrite",
55414
+ "writeOnly",
55415
+ "readStatic"
55416
+ ]);
55417
+ /**
55418
+ * One option or setting the appliance declares, with the constraints its description
55419
+ * gives. A `readWrite` descriptor that is `available` is what `setOption` accepts.
55420
+ */
55421
+ var DishwasherOptionDescriptorSchema = object({
55422
+ /** Feature key (`Dishcare.Dishwasher.Option.ExtraDry`). */
55423
+ key: string(),
55424
+ /** Last segment of the key, for display. */
55425
+ name: string(),
55426
+ type: _enum([
55427
+ "boolean",
55428
+ "number",
55429
+ "enum",
55430
+ "string"
55431
+ ]),
55432
+ access: DishwasherAccessSchema,
55433
+ /** The appliance reports this entity as currently available. */
55434
+ available: boolean(),
55435
+ /** Unit the description declares for a number; null when it declares none. */
55436
+ unit: string().nullable(),
55437
+ min: number().nullable(),
55438
+ max: number().nullable(),
55439
+ step: number().nullable(),
55440
+ /** Allowed members of an enum; null for other types. */
55441
+ enumValues: array(string()).nullable(),
55442
+ defaultValue: DishwasherValueSchema.nullable()
55443
+ });
55444
+ var DishwasherProgramSchema = object({
55445
+ /** Feature key (`Dishcare.Dishwasher.Program.Eco50`) — what `setProgram` / `start` take. */
55446
+ key: string(),
55447
+ name: string(),
55448
+ /** The appliance currently offers this program. */
55449
+ available: boolean(),
55450
+ /** The options this program lists, with the program-level access / availability / default. */
55451
+ options: array(DishwasherOptionDescriptorSchema)
55452
+ });
55453
+ var DishwasherOptionsSchema = object({
55454
+ availability: DishwasherAvailabilitySchema,
55455
+ /** What the appliance can be told to do, from the commands its description declares. */
55456
+ supportsStart: boolean(),
55457
+ supportsPause: boolean(),
55458
+ supportsResume: boolean(),
55459
+ supportsStop: boolean(),
55460
+ supportsPower: boolean(),
55461
+ /** Every program the description lists, with its options. */
55462
+ programs: array(DishwasherProgramSchema),
55463
+ /** Every option and setting entity the description lists (programs reference these by key). */
55464
+ options: array(DishwasherOptionDescriptorSchema)
55465
+ });
55327
55466
  var dishwasherCapability = {
55328
55467
  name: "dishwasher",
55329
55468
  scope: "device",
@@ -55331,86 +55470,102 @@ var dishwasherCapability = {
55331
55470
  mode: "singleton",
55332
55471
  deviceTypes: [DeviceType.Dishwasher],
55333
55472
  methods: {
55334
- start: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55473
+ /**
55474
+ * Start a program. Without `program` the selected one starts. `options` are
55475
+ * option feature keys; each is checked against the program's constraints.
55476
+ */
55477
+ start: method(object({
55478
+ deviceId: DeviceIdSchema,
55479
+ program: string().min(1).optional(),
55480
+ options: record(string(), DishwasherValueSchema).optional()
55481
+ }), _void(), {
55335
55482
  kind: "mutation",
55336
55483
  auth: "protected"
55337
55484
  }),
55338
- pause: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55485
+ pause: method(object({ deviceId: DeviceIdSchema }), _void(), {
55339
55486
  kind: "mutation",
55340
55487
  auth: "protected"
55341
55488
  }),
55342
- stop: method(object({ deviceId: number().int().nonnegative() }), _void(), {
55489
+ resume: method(object({ deviceId: DeviceIdSchema }), _void(), {
55490
+ kind: "mutation",
55491
+ auth: "protected"
55492
+ }),
55493
+ stop: method(object({ deviceId: DeviceIdSchema }), _void(), {
55343
55494
  kind: "mutation",
55344
55495
  auth: "protected"
55345
55496
  }),
55497
+ /** Select (not start) a program; refused when the appliance does not offer it. */
55346
55498
  setProgram: method(object({
55347
- deviceId: number().int().nonnegative(),
55499
+ deviceId: DeviceIdSchema,
55348
55500
  program: string().min(1)
55349
55501
  }), _void(), {
55350
55502
  kind: "mutation",
55351
55503
  auth: "protected"
55352
55504
  }),
55353
55505
  setPower: method(object({
55354
- deviceId: number().int().nonnegative(),
55506
+ deviceId: DeviceIdSchema,
55355
55507
  on: boolean()
55356
55508
  }), _void(), {
55357
55509
  kind: "mutation",
55358
55510
  auth: "protected"
55359
55511
  }),
55360
55512
  setHalfLoad: method(object({
55361
- deviceId: number().int().nonnegative(),
55513
+ deviceId: DeviceIdSchema,
55362
55514
  on: boolean()
55363
55515
  }), _void(), {
55364
55516
  kind: "mutation",
55365
55517
  auth: "protected"
55366
55518
  }),
55367
55519
  setHygienePlus: method(object({
55368
- deviceId: number().int().nonnegative(),
55520
+ deviceId: DeviceIdSchema,
55369
55521
  on: boolean()
55370
55522
  }), _void(), {
55371
55523
  kind: "mutation",
55372
55524
  auth: "protected"
55373
55525
  }),
55374
55526
  setExtraDry: method(object({
55375
- deviceId: number().int().nonnegative(),
55527
+ deviceId: DeviceIdSchema,
55376
55528
  on: boolean()
55377
55529
  }), _void(), {
55378
55530
  kind: "mutation",
55379
55531
  auth: "protected"
55380
55532
  }),
55381
55533
  setIntensiveZone: method(object({
55382
- deviceId: number().int().nonnegative(),
55534
+ deviceId: DeviceIdSchema,
55383
55535
  on: boolean()
55384
55536
  }), _void(), {
55385
55537
  kind: "mutation",
55386
55538
  auth: "protected"
55387
55539
  }),
55388
55540
  setVarioSpeedPlus: method(object({
55389
- deviceId: number().int().nonnegative(),
55541
+ deviceId: DeviceIdSchema,
55390
55542
  on: boolean()
55391
55543
  }), _void(), {
55392
55544
  kind: "mutation",
55393
55545
  auth: "protected"
55394
55546
  }),
55395
55547
  setChildLock: method(object({
55396
- deviceId: number().int().nonnegative(),
55548
+ deviceId: DeviceIdSchema,
55397
55549
  on: boolean()
55398
55550
  }), _void(), {
55399
55551
  kind: "mutation",
55400
55552
  auth: "protected"
55401
55553
  }),
55554
+ /**
55555
+ * Write any option or setting by feature key. Refused when the description does
55556
+ * not list it, it is not writable or not available now, or the value is outside
55557
+ * its declared range / members.
55558
+ */
55402
55559
  setOption: method(object({
55403
- deviceId: number().int().nonnegative(),
55560
+ deviceId: DeviceIdSchema,
55404
55561
  key: string().min(1),
55405
- value: union([
55406
- boolean(),
55407
- string(),
55408
- number()
55409
- ])
55562
+ value: DishwasherValueSchema
55410
55563
  }), _void(), {
55411
55564
  kind: "mutation",
55412
55565
  auth: "protected"
55413
- })
55566
+ }),
55567
+ /** What this appliance can do, from its own description — the UI is derived from it. */
55568
+ getOptions: method(object({ deviceId: DeviceIdSchema }), DishwasherOptionsSchema, { auth: "protected" })
55414
55569
  },
55415
55570
  status: {
55416
55571
  schema: DishwasherStatusSchema,
@@ -69359,6 +69514,12 @@ Object.freeze({
69359
69514
  addonId: null,
69360
69515
  access: "view"
69361
69516
  },
69517
+ "dishwasher.getOptions": {
69518
+ capName: "dishwasher",
69519
+ capScope: "device",
69520
+ addonId: null,
69521
+ access: "view"
69522
+ },
69362
69523
  "dishwasher.getStatus": {
69363
69524
  capName: "dishwasher",
69364
69525
  capScope: "device",
@@ -69371,6 +69532,12 @@ Object.freeze({
69371
69532
  addonId: null,
69372
69533
  access: "create"
69373
69534
  },
69535
+ "dishwasher.resume": {
69536
+ capName: "dishwasher",
69537
+ capScope: "device",
69538
+ addonId: null,
69539
+ access: "create"
69540
+ },
69374
69541
  "dishwasher.setChildLock": {
69375
69542
  capName: "dishwasher",
69376
69543
  capScope: "device",
@@ -73871,6 +74038,12 @@ Object.freeze({
73871
74038
  addonId: null,
73872
74039
  access: "view"
73873
74040
  },
74041
+ "storageMigration.moverClearance": {
74042
+ capName: "storage-migration",
74043
+ capScope: "system",
74044
+ addonId: null,
74045
+ access: "view"
74046
+ },
73874
74047
  "storageMigration.movers": {
73875
74048
  capName: "storage-migration",
73876
74049
  capScope: "system",
@@ -76064,6 +76237,11 @@ Object.freeze({
76064
76237
  form: "single",
76065
76238
  optional: false
76066
76239
  }],
76240
+ "dishwasher.getOptions": [{
76241
+ name: "deviceId",
76242
+ form: "single",
76243
+ optional: false
76244
+ }],
76067
76245
  "dishwasher.getStatus": [{
76068
76246
  name: "deviceId",
76069
76247
  form: "single",
@@ -76074,6 +76252,11 @@ Object.freeze({
76074
76252
  form: "single",
76075
76253
  optional: false
76076
76254
  }],
76255
+ "dishwasher.resume": [{
76256
+ name: "deviceId",
76257
+ form: "single",
76258
+ optional: false
76259
+ }],
76077
76260
  "dishwasher.setChildLock": [{
76078
76261
  name: "deviceId",
76079
76262
  form: "single",
@@ -78160,6 +78343,9 @@ new Map(Object.entries({
78160
78343
  "wrapper-update-available": "system",
78161
78344
  "backup-completed": "system",
78162
78345
  "export-completed": "system",
78346
+ "alert-critical": "system",
78347
+ "alert-error": "system",
78348
+ "alert-critical-resolved": "system",
78163
78349
  "storage-location-low": "system",
78164
78350
  "storage-location-critical": "system",
78165
78351
  "storage-location-ok": "system",
@@ -78284,6 +78470,16 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
78284
78470
  "storage-location-ok"
78285
78471
  ]
78286
78472
  },
78473
+ {
78474
+ id: "alerts",
78475
+ family: "system",
78476
+ label: "Alerts",
78477
+ kinds: [
78478
+ "alert-critical",
78479
+ "alert-error",
78480
+ "alert-critical-resolved"
78481
+ ]
78482
+ },
78287
78483
  {
78288
78484
  id: "alarm",
78289
78485
  family: "alarm",
@@ -78328,6 +78524,21 @@ var NC_SENSOR_RAISED_FIELD_BY_KIND = Object.freeze(Object.fromEntries(Object.ent
78328
78524
  return [[descriptor.kind, field]];
78329
78525
  })));
78330
78526
  Object.freeze(Object.keys(NC_SENSOR_RAISED_FIELD_BY_KIND));
78527
+ object({
78528
+ phase: _enum(["raised", "resolved"]),
78529
+ episodeId: string().min(1),
78530
+ alertId: string().min(1),
78531
+ severity: AlertSeveritySchema,
78532
+ category: string(),
78533
+ title: string(),
78534
+ message: string(),
78535
+ sourceType: string().optional(),
78536
+ sourceId: string().optional(),
78537
+ nodeId: string().optional(),
78538
+ /** The alert's own action link (where the operator acts on it), when it has one. */
78539
+ actionUrl: string().optional(),
78540
+ at: number()
78541
+ });
78331
78542
  var RULE_BODY_ONLY = ["body"];
78332
78543
  var RULE_TEXT = ["title", "body"];
78333
78544
  var BATTERY = ["device-battery-low", "device-battery-normal"];
@@ -78337,6 +78548,11 @@ var TANK = [
78337
78548
  "device-tank-full",
78338
78549
  "device-tank-normal"
78339
78550
  ];
78551
+ var ALERT_EPISODE = [
78552
+ "alert-critical",
78553
+ "alert-error",
78554
+ "alert-critical-resolved"
78555
+ ];
78340
78556
  var UPDATES = [
78341
78557
  "addon-update-available",
78342
78558
  "server-update-available",
@@ -78529,14 +78745,14 @@ var STATE_SUMMARY_VARS = [
78529
78745
  ([...RULE_TEXT], [...CONSUMABLE]),
78530
78746
  ([...RULE_TEXT], [...TANK]),
78531
78747
  [...RULE_TEXT],
78532
- ([...RULE_TEXT], [...UPDATES]),
78533
- ([...RULE_TEXT], [...UPDATES]),
78534
- [...RULE_TEXT],
78748
+ ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
78749
+ ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
78535
78750
  [...RULE_TEXT],
78536
78751
  [...RULE_TEXT],
78537
78752
  [...RULE_TEXT],
78538
78753
  [...RULE_TEXT],
78539
78754
  [...RULE_TEXT],
78755
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78540
78756
  [...RULE_TEXT],
78541
78757
  [...RULE_TEXT],
78542
78758
  [...RULE_TEXT],
@@ -78554,7 +78770,11 @@ var STATE_SUMMARY_VARS = [
78554
78770
  [...RULE_TEXT],
78555
78771
  [...RULE_TEXT],
78556
78772
  [...RULE_TEXT],
78557
- [...RULE_TEXT],
78773
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78774
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78775
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78776
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78777
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
78558
78778
  [...RULE_TEXT],
78559
78779
  [...RULE_TEXT],
78560
78780
  [...RULE_TEXT],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-dreo",
3
- "version": "0.2.128",
3
+ "version": "0.2.129",
4
4
  "description": "Dreo smart-device (fan / air-circulator / purifier / heater / humidifier) device-provider addon for CamStack — wraps the @apocaliss92/nodedreo Dreo cloud client (REST + WebSocket)",
5
5
  "keywords": [
6
6
  "camstack",