@camstack/addon-osd-manager 0.1.247 → 0.1.249

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 (18) hide show
  1. package/dist/{MotionZonesSettings-qtgrA0zs.mjs → MotionZonesSettings-Cx-ryFCz.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-CDjLk5w5.mjs → PrivacyMaskSettings-B9BuXw-4.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-BVdgxUfp.mjs → SceneMonitorEditor-CH999FH_.mjs} +3 -3
  4. package/dist/_stub.js +4381 -4210
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-5jNfg3X7.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-DM9Sbo7x.mjs} +4 -4
  6. package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-B_G3Hrj-.mjs +26 -0
  7. package/dist/{hostInit-CMF4TS98.mjs → hostInit-BOPePnxq.mjs} +3 -3
  8. package/dist/index.js +541 -241
  9. package/dist/index.mjs +541 -241
  10. package/dist/{player-overlays-CWC5I8Gr.mjs → player-overlays-DMB_7GA5.mjs} +1 -1
  11. package/dist/remoteEntry.js +1 -1
  12. package/dist/{responsive-C0Yg2ySn.mjs → responsive-DHfzTP5J.mjs} +1 -1
  13. package/dist/{scene-monitor-copy-CUvGeueA.mjs → scene-monitor-copy-69r6Iia3.mjs} +1 -1
  14. package/dist/{square-DM5YvAWs.mjs → square-BUOcGLAx.mjs} +1 -1
  15. package/dist/{trash-2-DTlq25ib.mjs → trash-2-yb-HZwuH.mjs} +1 -1
  16. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-Dzba-Vqm.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-BSYsIfpz.mjs} +1 -1
  17. package/package.json +1 -1
  18. package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DJYNsHHl.mjs +0 -26
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- //#region ../types/dist/event-category-BvOFi6PY.mjs
1
+ //#region ../types/dist/event-category-DOl51-Ij.mjs
2
2
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
3
3
  EventCategory["SystemBoot"] = "system.boot";
4
4
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -77,9 +77,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
77
77
  /**
78
78
  * The node's one-shot runner boot check (D877): planned runners against the
79
79
  * process service, `degraded` when any is failed, refused or missing. The
80
- * alert centre turns it into one alert and a direct critical push.
80
+ * alert centre turns it into one critical alert.
81
81
  */
82
82
  EventCategory["SystemRunnerCheck"] = "system.runner-check";
83
+ /**
84
+ * An alert EPISODE opened or closed, emitted by the alert centre for alerts
85
+ * of severity `critical` or `error` (`AlertEpisodePayload`). The alert
86
+ * centre sends no notification of its own: Notification Center turns this
87
+ * into the `alert-critical` / `alert-error` / `alert-critical-resolved`
88
+ * system-event kinds, and reconciles from the alerts store because a bus
89
+ * event may be dropped (D8, D11).
90
+ */
91
+ EventCategory["AlertEpisode"] = "alert.episode";
83
92
  EventCategory["AddonError"] = "addon.error";
84
93
  EventCategory["AddonPageReady"] = "addon.page-ready";
85
94
  EventCategory["AddonWidgetReady"] = "addon.widget-ready";
@@ -5404,7 +5413,7 @@ var ZodIssueCode = {
5404
5413
  var ZodFirstPartyTypeKind;
5405
5414
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5406
5415
  //#endregion
5407
- //#region ../types/dist/sleep-BegKjwUu.mjs
5416
+ //#region ../types/dist/sleep-BxjU_fJM.mjs
5408
5417
  /**
5409
5418
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5410
5419
  * window to float samples (D455).
@@ -7786,6 +7795,12 @@ function normalizeAddonInitResult(result) {
7786
7795
  if (Array.isArray(result)) return { providers: result };
7787
7796
  return result;
7788
7797
  }
7798
+ /**
7799
+ * The share-view scope kinds a `csv_*` share token can carry. The hub mints
7800
+ * and validates them (`share-token.service.ts` builds its enum from this
7801
+ * list); a data plane names the kinds it ACCEPTS in `share`.
7802
+ */
7803
+ var SHARE_VIEW_KINDS = ["grid-view", "events-view"];
7789
7804
  /** The wire shape of {@link PeerBytesTicket} — see the type for what it is. */
7790
7805
  var PeerBytesTicketSchema = object({
7791
7806
  /** `http://127.0.0.1:<port>/<token>`. One `GET` takes it. */
@@ -12370,6 +12385,229 @@ var ConvertResultSchema = object({
12370
12385
  files: array(string()).readonly()
12371
12386
  })).readonly()
12372
12387
  });
12388
+ /**
12389
+ * Zod schemas for persisted record types.
12390
+ *
12391
+ * These schemas serve as the single source of truth for types that are
12392
+ * stored in the settings-store backend and retrieved via tRPC. They
12393
+ * replace the manual TypeScript interfaces with schema-derived types,
12394
+ * enabling runtime validation when reading from the backend.
12395
+ *
12396
+ * Convention: each schema is named `<Type>Schema`, the inferred TS type
12397
+ * keeps the original name for backward compatibility.
12398
+ */
12399
+ /**
12400
+ * Auth model (v2 — 2026-05-12 caps-only):
12401
+ *
12402
+ * Two principals:
12403
+ * - `isAdmin: true` — full bypass. Admin scope set is ignored.
12404
+ * - `isAdmin: false` — every call gated by `scopes` (see TokenScope).
12405
+ *
12406
+ * No role enum. There used to be `viewer / agent / scoped` and earlier
12407
+ * `super_admin` — collapsed onto the single boolean because every
12408
+ * non-admin caller is governed by the same scope-check rules; the
12409
+ * distinction was only ever used to route role-specific procedures
12410
+ * which we no longer have. CLI / webhook integrations are `cst_*` tokens
12411
+ * with `isAdmin: false` + an explicit scope list.
12412
+ */
12413
+ /** Per-method access flavour. Materialised on every cap method via codegen. */
12414
+ var MethodAccessSchema = _enum([
12415
+ "view",
12416
+ "create",
12417
+ "delete"
12418
+ ]);
12419
+ /**
12420
+ * A single scope grant. Three forms — checked in matcher with OR
12421
+ * semantics; the first match decides whether the call passes:
12422
+ *
12423
+ * - `category` — broadest. `target: 'device' | 'system'` selects every
12424
+ * cap with the matching `scope` declaration. New caps inherit grants
12425
+ * automatically — adding a device cap to the codebase makes it
12426
+ * reachable to every user with `category:device [...]` without a
12427
+ * re-grant. Use this for "family viewer" / "operator" tiers.
12428
+ *
12429
+ * - `addon` — every cap that ships inside a given addon id. Niche;
12430
+ * useful when an integration needs to interact with one specific
12431
+ * addon's surface regardless of how many caps it exports.
12432
+ *
12433
+ * - `capability` — the most precise form. Single cap name. Use for
12434
+ * integration tokens where you want to grant `addons.installPackage`
12435
+ * and nothing else.
12436
+ *
12437
+ * `access` is REQUIRED with min 1 element. `admin` bypass is the
12438
+ * "give me everything" escape; there is no wildcard scope.
12439
+ */
12440
+ var AllowedProviderSchema = union([literal("*"), array(string())]);
12441
+ var AllowedDevicesSchema = record(string(), union([literal("*"), array(string())]));
12442
+ var CapScopeSchema = _enum(["device", "system"]);
12443
+ /**
12444
+ * DeviceSelector (scope model v3 — 2026-08-12).
12445
+ *
12446
+ * A `device` grant no longer carries a frozen list of deviceIds. It carries
12447
+ * a SELECTOR the matcher resolves against the live fleet, so the grant can be
12448
+ * DYNAMIC: a `types:['camera']` selector automatically covers a camera added
12449
+ * AFTER the grant was minted — no re-grant, no re-login.
12450
+ *
12451
+ * - `all` — every device in the deployment. The broad viewer/operator
12452
+ * lever without a `category` grant (a `category` grant also covers device
12453
+ * caps that carry no deviceId; `all` is specifically the device set).
12454
+ * - `ids` — an explicit deviceId list. This is what a v2 `device:[…]`
12455
+ * grant migrates to (see {@link TokenScopeSchema}); STATIC — a new camera
12456
+ * is NOT covered until the grant is edited.
12457
+ * - `types` — every device of a `DeviceType` (e.g. every `camera`).
12458
+ * DYNAMIC. A device that changes type, or a new device of the type,
12459
+ * re-resolves on the next request.
12460
+ * - `locations` — every device whose operator-assigned `location` label is
12461
+ * in the set (e.g. "Garden", "Front door"). DYNAMIC. A device with a
12462
+ * null/unset location matches NO `locations` selector.
12463
+ */
12464
+ var DeviceSelectorSchema = discriminatedUnion("kind", [
12465
+ object({ kind: literal("all") }),
12466
+ object({
12467
+ kind: literal("ids"),
12468
+ ids: array(number().int()).min(1)
12469
+ }),
12470
+ object({
12471
+ kind: literal("types"),
12472
+ types: array(_enum(DeviceType)).min(1)
12473
+ }),
12474
+ object({
12475
+ kind: literal("locations"),
12476
+ locations: array(string().min(1)).min(1)
12477
+ })
12478
+ ]);
12479
+ var DeviceTokenScopeSchema = object({
12480
+ type: literal("device"),
12481
+ /** The device SET this grant covers — resolved against the live fleet. */
12482
+ selector: DeviceSelectorSchema,
12483
+ access: array(MethodAccessSchema).min(1),
12484
+ /**
12485
+ * Whether a grant on a PARENT device transparently covers its accessory
12486
+ * CHILDREN (siren / floodlight / PIR) via the persisted-parentage walk.
12487
+ * Direction is parent → children ONLY.
12488
+ *
12489
+ * Absent → the matcher DERIVES it from the access flavour: `view`
12490
+ * inherits (a camera viewer sees the camera's accessories), `create` /
12491
+ * `delete` do NOT (actuating/removing a child is an explicit act the
12492
+ * operator must grant on the child, not inherit from the parent). Set it
12493
+ * explicitly to override that default per grant.
12494
+ */
12495
+ includeLinked: boolean().optional()
12496
+ });
12497
+ /**
12498
+ * v2 → v3 lazy migration. A pre-v3 `device` grant carried
12499
+ * `targets: string[]` (stringified deviceIds); it rewrites to the equivalent
12500
+ * `selector: {kind:'ids', ids}`. Applied as a `preprocess` so it runs on
12501
+ * EVERY parse path — stored records AND the JWT-carried scope arrays
12502
+ * normalised at the request boundary ({@link normalizeTokenScopes} in
12503
+ * `device-selector.ts`). Chosen over a one-time DB migration because a
12504
+ * migration cannot reach a JWT already in a client's hands; parse-time
12505
+ * migration covers both without a flag day. No cast — the raw object is read
12506
+ * through `Reflect.get` (its static type is `unknown`).
12507
+ */
12508
+ function migrateLegacyTokenScope(raw) {
12509
+ if (raw === null || typeof raw !== "object" || Array.isArray(raw)) return raw;
12510
+ if (Reflect.get(raw, "type") !== "device") return raw;
12511
+ if (Reflect.get(raw, "selector") !== void 0) return raw;
12512
+ const targets = Reflect.get(raw, "targets");
12513
+ if (!Array.isArray(targets)) return raw;
12514
+ return {
12515
+ type: "device",
12516
+ selector: {
12517
+ kind: "ids",
12518
+ ids: targets.map((t) => typeof t === "string" ? Number(t) : t).filter((n) => typeof n === "number" && Number.isInteger(n))
12519
+ },
12520
+ access: Reflect.get(raw, "access")
12521
+ };
12522
+ }
12523
+ var TokenScopeSchema = preprocess(migrateLegacyTokenScope, discriminatedUnion("type", [
12524
+ object({
12525
+ type: literal("category"),
12526
+ target: CapScopeSchema,
12527
+ access: array(MethodAccessSchema).min(1)
12528
+ }),
12529
+ object({
12530
+ type: literal("capability"),
12531
+ target: string(),
12532
+ access: array(MethodAccessSchema).min(1)
12533
+ }),
12534
+ object({
12535
+ type: literal("addon"),
12536
+ target: string(),
12537
+ access: array(MethodAccessSchema).min(1)
12538
+ }),
12539
+ DeviceTokenScopeSchema
12540
+ ]));
12541
+ object({
12542
+ id: string(),
12543
+ username: string(),
12544
+ passwordHash: string(),
12545
+ /**
12546
+ * Admin bypass. When true, the middleware skips the scope-access
12547
+ * check entirely. There is no other axis of privilege; the legacy
12548
+ * role enum collapsed onto this boolean in v2.
12549
+ */
12550
+ isAdmin: boolean().default(false),
12551
+ allowedProviders: AllowedProviderSchema,
12552
+ allowedDevices: AllowedDevicesSchema,
12553
+ /**
12554
+ * Scopes granted to this user. Admins bypass; their `scopes` is
12555
+ * ignored. Non-admins without scopes are locked out of every
12556
+ * protected call.
12557
+ */
12558
+ scopes: array(TokenScopeSchema).default([]),
12559
+ createdAt: number(),
12560
+ updatedAt: number()
12561
+ });
12562
+ object({
12563
+ id: string(),
12564
+ label: string(),
12565
+ isAdmin: boolean().default(false),
12566
+ allowedProviders: AllowedProviderSchema,
12567
+ allowedDevices: AllowedDevicesSchema,
12568
+ tokenHash: string(),
12569
+ tokenPrefix: string(),
12570
+ createdAt: number(),
12571
+ lastUsedAt: number().optional()
12572
+ });
12573
+ object({
12574
+ id: string(),
12575
+ userId: string(),
12576
+ name: string(),
12577
+ tokenHash: string(),
12578
+ tokenPrefix: string(),
12579
+ scopes: array(TokenScopeSchema),
12580
+ expiresAt: number().nullish(),
12581
+ lastUsedAt: number().nullish(),
12582
+ createdAt: number()
12583
+ });
12584
+ /** What a share-view grant lets its holder see. */
12585
+ var ShareViewGrantSchema = object({
12586
+ kind: _enum(SHARE_VIEW_KINDS),
12587
+ deviceIds: array(number().int().nonnegative()).min(1).max(64),
12588
+ /** Talk-back, opt-in at mint time; absent means off. */
12589
+ talk: boolean().optional()
12590
+ });
12591
+ var ShareViewScopeSchema = object({
12592
+ type: literal("share-view"),
12593
+ grant: ShareViewGrantSchema
12594
+ });
12595
+ var AddonRoutesScopeSchema = object({
12596
+ type: literal("addon-routes"),
12597
+ access: array(MethodAccessSchema).min(1)
12598
+ });
12599
+ var CredentialScopeSchema = union([
12600
+ literal("*"),
12601
+ ShareViewScopeSchema,
12602
+ AddonRoutesScopeSchema,
12603
+ TokenScopeSchema
12604
+ ]);
12605
+ object({
12606
+ kind: literal("credential"),
12607
+ sub: string().min(1),
12608
+ jti: string().min(16),
12609
+ scopes: array(CredentialScopeSchema).min(1)
12610
+ });
12373
12611
  _enum(["new-session", "step-up"]);
12374
12612
  /** The languages the hub's app landing pages are written in (D858). */
12375
12613
  var AppPageLangSchema = _enum(["en", "it"]);
@@ -13103,7 +13341,14 @@ var AlertSeveritySchema = _enum([
13103
13341
  ]);
13104
13342
  var AlertActionSchema = object({
13105
13343
  label: string(),
13106
- href: string().optional()
13344
+ href: string().optional(),
13345
+ /**
13346
+ * How `href` is followed. Absent / `app`: an admin-ui route (client-side).
13347
+ * `server`: a route the HUB serves (an addon HTTP route such as an OAuth
13348
+ * start) — the browser must leave the SPA with a full navigation, because
13349
+ * the SPA has no such route and would bounce to the home page.
13350
+ */
13351
+ navigation: _enum(["app", "server"]).optional()
13107
13352
  });
13108
13353
  var AlertStatusSchema = _enum([
13109
13354
  "active",
@@ -41524,6 +41769,9 @@ var NcSystemEventKindSchema = _enum([
41524
41769
  "server-updated",
41525
41770
  "export-completed",
41526
41771
  "backup-completed",
41772
+ "alert-critical",
41773
+ "alert-error",
41774
+ "alert-critical-resolved",
41527
41775
  "camera-online",
41528
41776
  "camera-offline",
41529
41777
  "camera-disabled",
@@ -42998,6 +43246,18 @@ var NC_CONDITION_CATALOG = [
42998
43246
  value: "backup-completed",
42999
43247
  label: "Backup completed"
43000
43248
  },
43249
+ {
43250
+ value: "alert-critical",
43251
+ label: "Critical alert raised"
43252
+ },
43253
+ {
43254
+ value: "alert-error",
43255
+ label: "Error alert raised"
43256
+ },
43257
+ {
43258
+ value: "alert-critical-resolved",
43259
+ label: "Critical alert resolved"
43260
+ },
43001
43261
  {
43002
43262
  value: "alarm-arm-refused",
43003
43263
  label: "Alarm arm refused"
@@ -44127,202 +44387,6 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
44127
44387
  auth: "admin"
44128
44388
  }), method(NcAlarmSensorsInputSchema, NcAlarmSensorsSchema, { auth: "admin" });
44129
44389
  /**
44130
- * Zod schemas for persisted record types.
44131
- *
44132
- * These schemas serve as the single source of truth for types that are
44133
- * stored in the settings-store backend and retrieved via tRPC. They
44134
- * replace the manual TypeScript interfaces with schema-derived types,
44135
- * enabling runtime validation when reading from the backend.
44136
- *
44137
- * Convention: each schema is named `<Type>Schema`, the inferred TS type
44138
- * keeps the original name for backward compatibility.
44139
- */
44140
- /**
44141
- * Auth model (v2 — 2026-05-12 caps-only):
44142
- *
44143
- * Two principals:
44144
- * - `isAdmin: true` — full bypass. Admin scope set is ignored.
44145
- * - `isAdmin: false` — every call gated by `scopes` (see TokenScope).
44146
- *
44147
- * No role enum. There used to be `viewer / agent / scoped` and earlier
44148
- * `super_admin` — collapsed onto the single boolean because every
44149
- * non-admin caller is governed by the same scope-check rules; the
44150
- * distinction was only ever used to route role-specific procedures
44151
- * which we no longer have. CLI / webhook integrations are `cst_*` tokens
44152
- * with `isAdmin: false` + an explicit scope list.
44153
- */
44154
- /** Per-method access flavour. Materialised on every cap method via codegen. */
44155
- var MethodAccessSchema = _enum([
44156
- "view",
44157
- "create",
44158
- "delete"
44159
- ]);
44160
- /**
44161
- * A single scope grant. Three forms — checked in matcher with OR
44162
- * semantics; the first match decides whether the call passes:
44163
- *
44164
- * - `category` — broadest. `target: 'device' | 'system'` selects every
44165
- * cap with the matching `scope` declaration. New caps inherit grants
44166
- * automatically — adding a device cap to the codebase makes it
44167
- * reachable to every user with `category:device [...]` without a
44168
- * re-grant. Use this for "family viewer" / "operator" tiers.
44169
- *
44170
- * - `addon` — every cap that ships inside a given addon id. Niche;
44171
- * useful when an integration needs to interact with one specific
44172
- * addon's surface regardless of how many caps it exports.
44173
- *
44174
- * - `capability` — the most precise form. Single cap name. Use for
44175
- * integration tokens where you want to grant `addons.installPackage`
44176
- * and nothing else.
44177
- *
44178
- * `access` is REQUIRED with min 1 element. `admin` bypass is the
44179
- * "give me everything" escape; there is no wildcard scope.
44180
- */
44181
- var AllowedProviderSchema = union([literal("*"), array(string())]);
44182
- var AllowedDevicesSchema = record(string(), union([literal("*"), array(string())]));
44183
- var CapScopeSchema = _enum(["device", "system"]);
44184
- /**
44185
- * DeviceSelector (scope model v3 — 2026-08-12).
44186
- *
44187
- * A `device` grant no longer carries a frozen list of deviceIds. It carries
44188
- * a SELECTOR the matcher resolves against the live fleet, so the grant can be
44189
- * DYNAMIC: a `types:['camera']` selector automatically covers a camera added
44190
- * AFTER the grant was minted — no re-grant, no re-login.
44191
- *
44192
- * - `all` — every device in the deployment. The broad viewer/operator
44193
- * lever without a `category` grant (a `category` grant also covers device
44194
- * caps that carry no deviceId; `all` is specifically the device set).
44195
- * - `ids` — an explicit deviceId list. This is what a v2 `device:[…]`
44196
- * grant migrates to (see {@link TokenScopeSchema}); STATIC — a new camera
44197
- * is NOT covered until the grant is edited.
44198
- * - `types` — every device of a `DeviceType` (e.g. every `camera`).
44199
- * DYNAMIC. A device that changes type, or a new device of the type,
44200
- * re-resolves on the next request.
44201
- * - `locations` — every device whose operator-assigned `location` label is
44202
- * in the set (e.g. "Garden", "Front door"). DYNAMIC. A device with a
44203
- * null/unset location matches NO `locations` selector.
44204
- */
44205
- var DeviceSelectorSchema = discriminatedUnion("kind", [
44206
- object({ kind: literal("all") }),
44207
- object({
44208
- kind: literal("ids"),
44209
- ids: array(number().int()).min(1)
44210
- }),
44211
- object({
44212
- kind: literal("types"),
44213
- types: array(_enum(DeviceType)).min(1)
44214
- }),
44215
- object({
44216
- kind: literal("locations"),
44217
- locations: array(string().min(1)).min(1)
44218
- })
44219
- ]);
44220
- var DeviceTokenScopeSchema = object({
44221
- type: literal("device"),
44222
- /** The device SET this grant covers — resolved against the live fleet. */
44223
- selector: DeviceSelectorSchema,
44224
- access: array(MethodAccessSchema).min(1),
44225
- /**
44226
- * Whether a grant on a PARENT device transparently covers its accessory
44227
- * CHILDREN (siren / floodlight / PIR) via the persisted-parentage walk.
44228
- * Direction is parent → children ONLY.
44229
- *
44230
- * Absent → the matcher DERIVES it from the access flavour: `view`
44231
- * inherits (a camera viewer sees the camera's accessories), `create` /
44232
- * `delete` do NOT (actuating/removing a child is an explicit act the
44233
- * operator must grant on the child, not inherit from the parent). Set it
44234
- * explicitly to override that default per grant.
44235
- */
44236
- includeLinked: boolean().optional()
44237
- });
44238
- /**
44239
- * v2 → v3 lazy migration. A pre-v3 `device` grant carried
44240
- * `targets: string[]` (stringified deviceIds); it rewrites to the equivalent
44241
- * `selector: {kind:'ids', ids}`. Applied as a `preprocess` so it runs on
44242
- * EVERY parse path — stored records AND the JWT-carried scope arrays
44243
- * normalised at the request boundary ({@link normalizeTokenScopes} in
44244
- * `device-selector.ts`). Chosen over a one-time DB migration because a
44245
- * migration cannot reach a JWT already in a client's hands; parse-time
44246
- * migration covers both without a flag day. No cast — the raw object is read
44247
- * through `Reflect.get` (its static type is `unknown`).
44248
- */
44249
- function migrateLegacyTokenScope(raw) {
44250
- if (raw === null || typeof raw !== "object" || Array.isArray(raw)) return raw;
44251
- if (Reflect.get(raw, "type") !== "device") return raw;
44252
- if (Reflect.get(raw, "selector") !== void 0) return raw;
44253
- const targets = Reflect.get(raw, "targets");
44254
- if (!Array.isArray(targets)) return raw;
44255
- return {
44256
- type: "device",
44257
- selector: {
44258
- kind: "ids",
44259
- ids: targets.map((t) => typeof t === "string" ? Number(t) : t).filter((n) => typeof n === "number" && Number.isInteger(n))
44260
- },
44261
- access: Reflect.get(raw, "access")
44262
- };
44263
- }
44264
- var TokenScopeSchema = preprocess(migrateLegacyTokenScope, discriminatedUnion("type", [
44265
- object({
44266
- type: literal("category"),
44267
- target: CapScopeSchema,
44268
- access: array(MethodAccessSchema).min(1)
44269
- }),
44270
- object({
44271
- type: literal("capability"),
44272
- target: string(),
44273
- access: array(MethodAccessSchema).min(1)
44274
- }),
44275
- object({
44276
- type: literal("addon"),
44277
- target: string(),
44278
- access: array(MethodAccessSchema).min(1)
44279
- }),
44280
- DeviceTokenScopeSchema
44281
- ]));
44282
- object({
44283
- id: string(),
44284
- username: string(),
44285
- passwordHash: string(),
44286
- /**
44287
- * Admin bypass. When true, the middleware skips the scope-access
44288
- * check entirely. There is no other axis of privilege; the legacy
44289
- * role enum collapsed onto this boolean in v2.
44290
- */
44291
- isAdmin: boolean().default(false),
44292
- allowedProviders: AllowedProviderSchema,
44293
- allowedDevices: AllowedDevicesSchema,
44294
- /**
44295
- * Scopes granted to this user. Admins bypass; their `scopes` is
44296
- * ignored. Non-admins without scopes are locked out of every
44297
- * protected call.
44298
- */
44299
- scopes: array(TokenScopeSchema).default([]),
44300
- createdAt: number(),
44301
- updatedAt: number()
44302
- });
44303
- object({
44304
- id: string(),
44305
- label: string(),
44306
- isAdmin: boolean().default(false),
44307
- allowedProviders: AllowedProviderSchema,
44308
- allowedDevices: AllowedDevicesSchema,
44309
- tokenHash: string(),
44310
- tokenPrefix: string(),
44311
- createdAt: number(),
44312
- lastUsedAt: number().optional()
44313
- });
44314
- object({
44315
- id: string(),
44316
- userId: string(),
44317
- name: string(),
44318
- tokenHash: string(),
44319
- tokenPrefix: string(),
44320
- scopes: array(TokenScopeSchema),
44321
- expiresAt: number().nullish(),
44322
- lastUsedAt: number().nullish(),
44323
- createdAt: number()
44324
- });
44325
- /**
44326
44390
  * `oauth-integration` — a collection cap by which an addon declares
44327
44391
  * itself a linkable OAuth client of the hub's core `/oauth2/*` server.
44328
44392
  * Each provider returns a static descriptor; the core enumerates them
@@ -51124,7 +51188,10 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
51124
51188
  }), method(object({ jobId: string().optional() }), StorageMigrationJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
51125
51189
  kind: "mutation",
51126
51190
  auth: "admin"
51127
- }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
51191
+ }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({ locationIds: array(string()).readonly() }), object({
51192
+ clear: boolean(),
51193
+ repointLocationId: string().optional()
51194
+ }), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
51128
51195
  kind: "mutation",
51129
51196
  auth: "admin"
51130
51197
  }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
@@ -54559,6 +54626,11 @@ object({
54559
54626
  *
54560
54627
  * `kind: 'poll'` — cloud REST APIs typically have no push channel; the
54561
54628
  * provider refreshes the slice on an interval and eagerly after commands.
54629
+ *
54630
+ * UNKNOWN IS NOT OFF. Every field the appliance reports separately is
54631
+ * nullable: `null` means "not known right now" (the appliance has not said,
54632
+ * the link is down, or the description does not carry it) and is never
54633
+ * rendered or exported as `false` / `0`. `availability` says why.
54562
54634
  */
54563
54635
  var DishwasherStateSchema = _enum([
54564
54636
  "idle",
@@ -54568,112 +54640,227 @@ var DishwasherStateSchema = _enum([
54568
54640
  "error",
54569
54641
  "unavailable"
54570
54642
  ]);
54643
+ /**
54644
+ * The appliance's own operation state, uncollapsed. `state` above is the coarse
54645
+ * view for compact surfaces; this is what the appliance said.
54646
+ */
54647
+ var DishwasherOperationStateSchema = _enum([
54648
+ "Inactive",
54649
+ "Ready",
54650
+ "DelayedStart",
54651
+ "Run",
54652
+ "Pause",
54653
+ "ActionRequired",
54654
+ "Finished",
54655
+ "Error",
54656
+ "Aborting"
54657
+ ]);
54658
+ /**
54659
+ * Why fields may be `null`:
54660
+ * - `available` — the link is up and the description is loaded;
54661
+ * - `offline` — the local link is down (values are unknown, not last-known);
54662
+ * - `description-missing` — the link is up but the appliance's description could not
54663
+ * be loaded, so its values cannot be decoded.
54664
+ */
54665
+ var DishwasherAvailabilitySchema = _enum([
54666
+ "available",
54667
+ "offline",
54668
+ "description-missing"
54669
+ ]);
54571
54670
  var DishwasherConsumableLevelSchema = _enum([
54572
54671
  "ok",
54573
54672
  "low",
54574
54673
  "empty"
54575
54674
  ]);
54576
54675
  object({
54676
+ availability: DishwasherAvailabilitySchema,
54677
+ /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
54577
54678
  state: DishwasherStateSchema,
54578
- /** Active program id/name, or null when none selected / unknown. */
54679
+ /** The appliance's operation state as reported; null when not known. */
54680
+ operationState: DishwasherOperationStateSchema.nullable(),
54681
+ /** Feature key of the ACTIVE (running) program, or null when none runs / not known. */
54579
54682
  program: string().nullable(),
54580
- /** Program tokens the hardware accepts — drives the UI selector. */
54683
+ /** Feature key of the SELECTED program (what Start would run), or null when none / not known. */
54684
+ selectedProgram: string().nullable(),
54685
+ /** Feature keys of the programs the appliance currently offers — drives the UI selector. */
54581
54686
  availablePrograms: array(string()),
54582
- /** Minutes remaining on the active cycle, or null when not running. */
54583
- remainingMinutes: number().int().nonnegative().nullable(),
54687
+ /** Seconds remaining on the active cycle, or null when not running / not known. */
54688
+ remainingSeconds: number().int().nonnegative().nullable(),
54689
+ /** Seconds the delayed start is set to (time until the cycle starts), or null. */
54690
+ delayedStartSeconds: number().int().nonnegative().nullable(),
54584
54691
  /** Cycle completion 0..100, or null when not applicable. */
54585
54692
  progressPercent: number().min(0).max(100).nullable(),
54586
- /** True when the door is reported open. */
54587
- doorOpen: boolean(),
54588
- /** True when remote start is allowed (door closed, power on, etc.). */
54589
- remoteStartAllowed: boolean(),
54590
- /** Main power / switched-on state. */
54591
- powerOn: boolean(),
54693
+ /** True when the door is reported open; null when the door state is not known. */
54694
+ doorOpen: boolean().nullable(),
54695
+ /** True when the door is latched (locked) during a cycle; null when not reported. */
54696
+ doorLocked: boolean().nullable(),
54697
+ /** True when remote start is allowed (door closed, power on, etc.); null when not known. */
54698
+ remoteStartAllowed: boolean().nullable(),
54699
+ /** True when the appliance accepts remote control now; null when not known. */
54700
+ remoteControlActive: boolean().nullable(),
54701
+ /** True while somebody operates the appliance at its panel; null when not reported. */
54702
+ localControlActive: boolean().nullable(),
54703
+ /** Main power / switched-on state; null when not known. */
54704
+ powerOn: boolean().nullable(),
54705
+ /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
54706
+ powerState: string().nullable(),
54592
54707
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
54593
54708
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
54594
- halfLoad: boolean(),
54595
- hygienePlus: boolean(),
54709
+ /** Option states: null when the appliance does not expose the option or has not said. */
54710
+ halfLoad: boolean().nullable(),
54711
+ hygienePlus: boolean().nullable(),
54596
54712
  /** Extra dry option when the appliance exposes it. */
54597
- extraDry: boolean(),
54713
+ extraDry: boolean().nullable(),
54598
54714
  /** Intensive zone (lower basket) when the appliance exposes it. */
54599
- intensiveZone: boolean(),
54715
+ intensiveZone: boolean().nullable(),
54600
54716
  /** VarioSpeed / VarioSpeed+ when the appliance exposes it. */
54601
- varioSpeedPlus: boolean(),
54602
- /** Child lock (controls disabled on the appliance). */
54603
- childLock: boolean(),
54717
+ varioSpeedPlus: boolean().nullable(),
54718
+ /** Child lock (controls disabled on the appliance); null when not known. */
54719
+ childLock: boolean().nullable(),
54720
+ /** Feature keys of the events currently raised (salt low, rinse aid low, program finished, …). */
54721
+ activeEvents: array(string()),
54722
+ /** Numeric error code when the appliance reports one; null otherwise. */
54604
54723
  errorCode: number().nullable(),
54724
+ /** Name of the raised alert-level event while the appliance is in error; null otherwise. */
54605
54725
  errorLabel: string().nullable(),
54726
+ /** Ms epoch of the last value received from the appliance; 0 = never. */
54606
54727
  lastFetchedAt: number()
54607
54728
  });
54608
- DeviceType.Dishwasher, method(object({ deviceId: number().int().nonnegative() }), _void(), {
54729
+ var DeviceIdSchema = number().int().nonnegative();
54730
+ /** A value a program option or setting can take. */
54731
+ var DishwasherValueSchema = union([
54732
+ boolean(),
54733
+ string(),
54734
+ number()
54735
+ ]);
54736
+ var DishwasherAccessSchema = _enum([
54737
+ "none",
54738
+ "read",
54739
+ "readWrite",
54740
+ "writeOnly",
54741
+ "readStatic"
54742
+ ]);
54743
+ /**
54744
+ * One option or setting the appliance declares, with the constraints its description
54745
+ * gives. A `readWrite` descriptor that is `available` is what `setOption` accepts.
54746
+ */
54747
+ var DishwasherOptionDescriptorSchema = object({
54748
+ /** Feature key (`Dishcare.Dishwasher.Option.ExtraDry`). */
54749
+ key: string(),
54750
+ /** Last segment of the key, for display. */
54751
+ name: string(),
54752
+ type: _enum([
54753
+ "boolean",
54754
+ "number",
54755
+ "enum",
54756
+ "string"
54757
+ ]),
54758
+ access: DishwasherAccessSchema,
54759
+ /** The appliance reports this entity as currently available. */
54760
+ available: boolean(),
54761
+ /** Unit the description declares for a number; null when it declares none. */
54762
+ unit: string().nullable(),
54763
+ min: number().nullable(),
54764
+ max: number().nullable(),
54765
+ step: number().nullable(),
54766
+ /** Allowed members of an enum; null for other types. */
54767
+ enumValues: array(string()).nullable(),
54768
+ defaultValue: DishwasherValueSchema.nullable()
54769
+ });
54770
+ var DishwasherProgramSchema = object({
54771
+ /** Feature key (`Dishcare.Dishwasher.Program.Eco50`) — what `setProgram` / `start` take. */
54772
+ key: string(),
54773
+ name: string(),
54774
+ /** The appliance currently offers this program. */
54775
+ available: boolean(),
54776
+ /** The options this program lists, with the program-level access / availability / default. */
54777
+ options: array(DishwasherOptionDescriptorSchema)
54778
+ });
54779
+ var DishwasherOptionsSchema = object({
54780
+ availability: DishwasherAvailabilitySchema,
54781
+ /** What the appliance can be told to do, from the commands its description declares. */
54782
+ supportsStart: boolean(),
54783
+ supportsPause: boolean(),
54784
+ supportsResume: boolean(),
54785
+ supportsStop: boolean(),
54786
+ supportsPower: boolean(),
54787
+ /** Every program the description lists, with its options. */
54788
+ programs: array(DishwasherProgramSchema),
54789
+ /** Every option and setting entity the description lists (programs reference these by key). */
54790
+ options: array(DishwasherOptionDescriptorSchema)
54791
+ });
54792
+ DeviceType.Dishwasher, method(object({
54793
+ deviceId: DeviceIdSchema,
54794
+ program: string().min(1).optional(),
54795
+ options: record(string(), DishwasherValueSchema).optional()
54796
+ }), _void(), {
54609
54797
  kind: "mutation",
54610
54798
  auth: "protected"
54611
- }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
54799
+ }), method(object({ deviceId: DeviceIdSchema }), _void(), {
54612
54800
  kind: "mutation",
54613
54801
  auth: "protected"
54614
- }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
54802
+ }), method(object({ deviceId: DeviceIdSchema }), _void(), {
54803
+ kind: "mutation",
54804
+ auth: "protected"
54805
+ }), method(object({ deviceId: DeviceIdSchema }), _void(), {
54615
54806
  kind: "mutation",
54616
54807
  auth: "protected"
54617
54808
  }), method(object({
54618
- deviceId: number().int().nonnegative(),
54809
+ deviceId: DeviceIdSchema,
54619
54810
  program: string().min(1)
54620
54811
  }), _void(), {
54621
54812
  kind: "mutation",
54622
54813
  auth: "protected"
54623
54814
  }), method(object({
54624
- deviceId: number().int().nonnegative(),
54815
+ deviceId: DeviceIdSchema,
54625
54816
  on: boolean()
54626
54817
  }), _void(), {
54627
54818
  kind: "mutation",
54628
54819
  auth: "protected"
54629
54820
  }), method(object({
54630
- deviceId: number().int().nonnegative(),
54821
+ deviceId: DeviceIdSchema,
54631
54822
  on: boolean()
54632
54823
  }), _void(), {
54633
54824
  kind: "mutation",
54634
54825
  auth: "protected"
54635
54826
  }), method(object({
54636
- deviceId: number().int().nonnegative(),
54827
+ deviceId: DeviceIdSchema,
54637
54828
  on: boolean()
54638
54829
  }), _void(), {
54639
54830
  kind: "mutation",
54640
54831
  auth: "protected"
54641
54832
  }), method(object({
54642
- deviceId: number().int().nonnegative(),
54833
+ deviceId: DeviceIdSchema,
54643
54834
  on: boolean()
54644
54835
  }), _void(), {
54645
54836
  kind: "mutation",
54646
54837
  auth: "protected"
54647
54838
  }), method(object({
54648
- deviceId: number().int().nonnegative(),
54839
+ deviceId: DeviceIdSchema,
54649
54840
  on: boolean()
54650
54841
  }), _void(), {
54651
54842
  kind: "mutation",
54652
54843
  auth: "protected"
54653
54844
  }), method(object({
54654
- deviceId: number().int().nonnegative(),
54845
+ deviceId: DeviceIdSchema,
54655
54846
  on: boolean()
54656
54847
  }), _void(), {
54657
54848
  kind: "mutation",
54658
54849
  auth: "protected"
54659
54850
  }), method(object({
54660
- deviceId: number().int().nonnegative(),
54851
+ deviceId: DeviceIdSchema,
54661
54852
  on: boolean()
54662
54853
  }), _void(), {
54663
54854
  kind: "mutation",
54664
54855
  auth: "protected"
54665
54856
  }), method(object({
54666
- deviceId: number().int().nonnegative(),
54857
+ deviceId: DeviceIdSchema,
54667
54858
  key: string().min(1),
54668
- value: union([
54669
- boolean(),
54670
- string(),
54671
- number()
54672
- ])
54859
+ value: DishwasherValueSchema
54673
54860
  }), _void(), {
54674
54861
  kind: "mutation",
54675
54862
  auth: "protected"
54676
- });
54863
+ }), method(object({ deviceId: DeviceIdSchema }), DishwasherOptionsSchema, { auth: "protected" });
54677
54864
  object({
54678
54865
  /** Ms epoch of the last press. null = never observed since this provider started. */
54679
54866
  lastPressedAt: number().nullable(),
@@ -65111,6 +65298,12 @@ Object.freeze({
65111
65298
  addonId: null,
65112
65299
  access: "view"
65113
65300
  },
65301
+ "dishwasher.getOptions": {
65302
+ capName: "dishwasher",
65303
+ capScope: "device",
65304
+ addonId: null,
65305
+ access: "view"
65306
+ },
65114
65307
  "dishwasher.getStatus": {
65115
65308
  capName: "dishwasher",
65116
65309
  capScope: "device",
@@ -65123,6 +65316,12 @@ Object.freeze({
65123
65316
  addonId: null,
65124
65317
  access: "create"
65125
65318
  },
65319
+ "dishwasher.resume": {
65320
+ capName: "dishwasher",
65321
+ capScope: "device",
65322
+ addonId: null,
65323
+ access: "create"
65324
+ },
65126
65325
  "dishwasher.setChildLock": {
65127
65326
  capName: "dishwasher",
65128
65327
  capScope: "device",
@@ -69623,6 +69822,12 @@ Object.freeze({
69623
69822
  addonId: null,
69624
69823
  access: "view"
69625
69824
  },
69825
+ "storageMigration.moverClearance": {
69826
+ capName: "storage-migration",
69827
+ capScope: "system",
69828
+ addonId: null,
69829
+ access: "view"
69830
+ },
69626
69831
  "storageMigration.movers": {
69627
69832
  capName: "storage-migration",
69628
69833
  capScope: "system",
@@ -71816,6 +72021,11 @@ Object.freeze({
71816
72021
  form: "single",
71817
72022
  optional: false
71818
72023
  }],
72024
+ "dishwasher.getOptions": [{
72025
+ name: "deviceId",
72026
+ form: "single",
72027
+ optional: false
72028
+ }],
71819
72029
  "dishwasher.getStatus": [{
71820
72030
  name: "deviceId",
71821
72031
  form: "single",
@@ -71826,6 +72036,11 @@ Object.freeze({
71826
72036
  form: "single",
71827
72037
  optional: false
71828
72038
  }],
72039
+ "dishwasher.resume": [{
72040
+ name: "deviceId",
72041
+ form: "single",
72042
+ optional: false
72043
+ }],
71829
72044
  "dishwasher.setChildLock": [{
71830
72045
  name: "deviceId",
71831
72046
  form: "single",
@@ -73912,6 +74127,9 @@ new Map(Object.entries({
73912
74127
  "wrapper-update-available": "system",
73913
74128
  "backup-completed": "system",
73914
74129
  "export-completed": "system",
74130
+ "alert-critical": "system",
74131
+ "alert-error": "system",
74132
+ "alert-critical-resolved": "system",
73915
74133
  "storage-location-low": "system",
73916
74134
  "storage-location-critical": "system",
73917
74135
  "storage-location-ok": "system",
@@ -74036,6 +74254,16 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
74036
74254
  "storage-location-ok"
74037
74255
  ]
74038
74256
  },
74257
+ {
74258
+ id: "alerts",
74259
+ family: "system",
74260
+ label: "Alerts",
74261
+ kinds: [
74262
+ "alert-critical",
74263
+ "alert-error",
74264
+ "alert-critical-resolved"
74265
+ ]
74266
+ },
74039
74267
  {
74040
74268
  id: "alarm",
74041
74269
  family: "alarm",
@@ -74160,6 +74388,21 @@ var NC_SENSOR_RAISED_FIELD_BY_KIND = Object.freeze(Object.fromEntries(Object.ent
74160
74388
  return [[descriptor.kind, field]];
74161
74389
  })));
74162
74390
  Object.freeze(Object.keys(NC_SENSOR_RAISED_FIELD_BY_KIND));
74391
+ object({
74392
+ phase: _enum(["raised", "resolved"]),
74393
+ episodeId: string().min(1),
74394
+ alertId: string().min(1),
74395
+ severity: AlertSeveritySchema,
74396
+ category: string(),
74397
+ title: string(),
74398
+ message: string(),
74399
+ sourceType: string().optional(),
74400
+ sourceId: string().optional(),
74401
+ nodeId: string().optional(),
74402
+ /** The alert's own action link (where the operator acts on it), when it has one. */
74403
+ actionUrl: string().optional(),
74404
+ at: number()
74405
+ });
74163
74406
  var RULE_BODY_ONLY = ["body"];
74164
74407
  var RULE_TEXT = ["title", "body"];
74165
74408
  var BATTERY = ["device-battery-low", "device-battery-normal"];
@@ -74169,6 +74412,11 @@ var TANK = [
74169
74412
  "device-tank-full",
74170
74413
  "device-tank-normal"
74171
74414
  ];
74415
+ var ALERT_EPISODE = [
74416
+ "alert-critical",
74417
+ "alert-error",
74418
+ "alert-critical-resolved"
74419
+ ];
74172
74420
  var UPDATES = [
74173
74421
  "addon-update-available",
74174
74422
  "server-update-available",
@@ -74361,14 +74609,14 @@ var STATE_SUMMARY_VARS = [
74361
74609
  ([...RULE_TEXT], [...CONSUMABLE]),
74362
74610
  ([...RULE_TEXT], [...TANK]),
74363
74611
  [...RULE_TEXT],
74364
- ([...RULE_TEXT], [...UPDATES]),
74365
- ([...RULE_TEXT], [...UPDATES]),
74366
- [...RULE_TEXT],
74612
+ ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
74613
+ ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
74367
74614
  [...RULE_TEXT],
74368
74615
  [...RULE_TEXT],
74369
74616
  [...RULE_TEXT],
74370
74617
  [...RULE_TEXT],
74371
74618
  [...RULE_TEXT],
74619
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
74372
74620
  [...RULE_TEXT],
74373
74621
  [...RULE_TEXT],
74374
74622
  [...RULE_TEXT],
@@ -74386,7 +74634,11 @@ var STATE_SUMMARY_VARS = [
74386
74634
  [...RULE_TEXT],
74387
74635
  [...RULE_TEXT],
74388
74636
  [...RULE_TEXT],
74389
- [...RULE_TEXT],
74637
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
74638
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
74639
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
74640
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
74641
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
74390
74642
  [...RULE_TEXT],
74391
74643
  [...RULE_TEXT],
74392
74644
  [...RULE_TEXT],
@@ -76460,6 +76712,15 @@ var CAP_STATE_LEAVES = Object.freeze({
76460
76712
  "valueType": "boolean"
76461
76713
  }],
76462
76714
  "dishwasher": [
76715
+ {
76716
+ "path": "availability",
76717
+ "valueType": "enum",
76718
+ "enumValues": [
76719
+ "available",
76720
+ "offline",
76721
+ "description-missing"
76722
+ ]
76723
+ },
76463
76724
  {
76464
76725
  "path": "state",
76465
76726
  "valueType": "enum",
@@ -76472,12 +76733,35 @@ var CAP_STATE_LEAVES = Object.freeze({
76472
76733
  "unavailable"
76473
76734
  ]
76474
76735
  },
76736
+ {
76737
+ "path": "operationState",
76738
+ "valueType": "enum",
76739
+ "enumValues": [
76740
+ "Inactive",
76741
+ "Ready",
76742
+ "DelayedStart",
76743
+ "Run",
76744
+ "Pause",
76745
+ "ActionRequired",
76746
+ "Finished",
76747
+ "Error",
76748
+ "Aborting"
76749
+ ]
76750
+ },
76475
76751
  {
76476
76752
  "path": "program",
76477
76753
  "valueType": "string"
76478
76754
  },
76479
76755
  {
76480
- "path": "remainingMinutes",
76756
+ "path": "selectedProgram",
76757
+ "valueType": "string"
76758
+ },
76759
+ {
76760
+ "path": "remainingSeconds",
76761
+ "valueType": "number"
76762
+ },
76763
+ {
76764
+ "path": "delayedStartSeconds",
76481
76765
  "valueType": "number"
76482
76766
  },
76483
76767
  {
@@ -76488,14 +76772,30 @@ var CAP_STATE_LEAVES = Object.freeze({
76488
76772
  "path": "doorOpen",
76489
76773
  "valueType": "boolean"
76490
76774
  },
76775
+ {
76776
+ "path": "doorLocked",
76777
+ "valueType": "boolean"
76778
+ },
76491
76779
  {
76492
76780
  "path": "remoteStartAllowed",
76493
76781
  "valueType": "boolean"
76494
76782
  },
76783
+ {
76784
+ "path": "remoteControlActive",
76785
+ "valueType": "boolean"
76786
+ },
76787
+ {
76788
+ "path": "localControlActive",
76789
+ "valueType": "boolean"
76790
+ },
76495
76791
  {
76496
76792
  "path": "powerOn",
76497
76793
  "valueType": "boolean"
76498
76794
  },
76795
+ {
76796
+ "path": "powerState",
76797
+ "valueType": "string"
76798
+ },
76499
76799
  {
76500
76800
  "path": "saltLevel",
76501
76801
  "valueType": "enum",