@camstack/addon-provider-tuya 0.2.142 → 0.2.144

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 +255 -120
  2. package/dist/addon.mjs +255 -120
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -6251,7 +6251,7 @@ var ZodIssueCode = {
6251
6251
  var ZodFirstPartyTypeKind;
6252
6252
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
6253
6253
  //#endregion
6254
- //#region ../types/dist/sleep-DJFUfKvA.mjs
6254
+ //#region ../types/dist/sleep-CUp20JkO.mjs
6255
6255
  /**
6256
6256
  * The audio chunk plane's byte format, and the ONE expansion from a coded
6257
6257
  * window to float samples (D455).
@@ -9143,7 +9143,11 @@ var ContributionSectionSchema = object({
9143
9143
  literal(4)
9144
9144
  ]).optional(),
9145
9145
  tab: string().optional(),
9146
- location: _enum(["settings", "top-tab"]).optional(),
9146
+ location: _enum([
9147
+ "settings",
9148
+ "top-tab",
9149
+ "hero"
9150
+ ]).optional(),
9147
9151
  order: number().optional(),
9148
9152
  fields: array(any())
9149
9153
  });
@@ -14076,7 +14080,11 @@ var ConfigSectionWithValuesSchema = object({
14076
14080
  literal(4)
14077
14081
  ]).optional(),
14078
14082
  tab: string().optional(),
14079
- location: _enum(["settings", "top-tab"]).optional(),
14083
+ location: _enum([
14084
+ "settings",
14085
+ "top-tab",
14086
+ "hero"
14087
+ ]).optional(),
14080
14088
  order: number().optional(),
14081
14089
  fields: array(any())
14082
14090
  });
@@ -17956,6 +17964,52 @@ var TierStatusSchema = object({
17956
17964
  countedAt: number().nullable()
17957
17965
  });
17958
17966
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
17967
+ /**
17968
+ * Why a series is orphan. `device-gone`: its device is absent from the
17969
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
17970
+ * key is declared by no capability any more (a field a cap removed).
17971
+ */
17972
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
17973
+ /** Rows held per stored tier. */
17974
+ var TierRowsSchema = object({
17975
+ raw: number().int(),
17976
+ "5m": number().int(),
17977
+ "1h": number().int(),
17978
+ "1d": number().int()
17979
+ });
17980
+ var OrphanSeriesSchema = object({
17981
+ seriesId: number().int(),
17982
+ deviceId: number().int(),
17983
+ key: string(),
17984
+ scope: string(),
17985
+ /** The metric's display name; `null` when its metric row is gone too. */
17986
+ displayName: string().nullable(),
17987
+ reason: DeviceHistoryOrphanReasonSchema,
17988
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
17989
+ missingSince: number().nullable(),
17990
+ firstTs: number(),
17991
+ lastTs: number(),
17992
+ rows: TierRowsSchema
17993
+ });
17994
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
17995
+ "not-found",
17996
+ "not-orphan",
17997
+ "failed"
17998
+ ]);
17999
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
18000
+ seriesId: number().int(),
18001
+ ok: literal(true),
18002
+ deleted: TierRowsSchema
18003
+ }), object({
18004
+ seriesId: number().int(),
18005
+ ok: literal(false),
18006
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
18007
+ })]);
18008
+ var OrphanListSchema = object({
18009
+ series: array(OrphanSeriesSchema).readonly(),
18010
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
18011
+ truncated: boolean()
18012
+ });
17959
18013
  var DeviceHistoryStatusSchema = object({
17960
18014
  startedAt: number(),
17961
18015
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -18053,7 +18107,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
18053
18107
  }), object({ enabled: boolean() }), {
18054
18108
  kind: "mutation",
18055
18109
  auth: "admin"
18056
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
18110
+ }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" }), method(object({}), OrphanListSchema, { auth: "admin" }), method(object({ seriesIds: array(number().int()).min(1).max(50) }), object({ results: array(OrphanDeleteEntrySchema).readonly() }), {
18111
+ kind: "mutation",
18112
+ auth: "admin"
18113
+ });
18057
18114
  var DeviceCaStatusSchema = discriminatedUnion("state", [
18058
18115
  object({ state: literal("absent") }),
18059
18116
  object({
@@ -51024,6 +51081,19 @@ var NodeInferenceDeviceSchema = object({
51024
51081
  /** Whether the node's live probe reports the device as usable right now. */
51025
51082
  available: boolean(),
51026
51083
  /**
51084
+ * Is the device on the node at all (D919)? `present` — the live probe
51085
+ * reported it; `absent` — the probe ANSWERED and did not report it, so only
51086
+ * its stored settings remain (unplugged, moved to another node): never
51087
+ * eligible, whatever its stored `enabled`, and forgettable with
51088
+ * `forgetInferenceDevice`; `unknown` — the probe did not answer, nothing is
51089
+ * claimed (D315). Optional only for an orchestrator older than the field.
51090
+ */
51091
+ presence: _enum([
51092
+ "present",
51093
+ "absent",
51094
+ "unknown"
51095
+ ]).optional(),
51096
+ /**
51027
51097
  * Whether this device participates in dispatch. AUTO default (spec C2):
51028
51098
  * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
51029
51099
  * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
@@ -51249,7 +51319,13 @@ method(object({
51249
51319
  }), object({ success: literal(true) }), {
51250
51320
  kind: "mutation",
51251
51321
  auth: "admin"
51252
- }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
51322
+ }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({
51323
+ agentNodeId: string(),
51324
+ deviceKey: string()
51325
+ }), object({ success: literal(true) }), {
51326
+ kind: "mutation",
51327
+ auth: "admin"
51328
+ }), method(object({ agentNodeId: string() }), object({
51253
51329
  success: literal(true),
51254
51330
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
51255
51331
  effectiveModelId: string().nullable(),
@@ -55921,17 +55997,69 @@ var connectivityCapability = {
55921
55997
  volatileStateFields: ["lastChangedAt"]
55922
55998
  };
55923
55999
  /**
55924
- * Generic device-consumables capability — surfaces a device's
55925
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
55926
- * descaling cycles, …) with their remaining life and an optional
55927
- * "Replaced" reset action. Device-agnostic: any provider that knows its
55928
- * device tracks consumables can register it; the cap declares no
55929
- * vocabulary of its own — the provider names each item verbatim.
56000
+ * Generic device-consumables capability — the ONE place a device reports what
56001
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
56002
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
56003
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
56004
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
56005
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
56006
+ * its device tracks consumables registers it; the provider names each item
56007
+ * verbatim and says which `kind` it is.
56008
+ *
56009
+ * The admin UI renders it as ONE collapsible section directly under the
56010
+ * device page's hero card (`placement: 'hero'`), for every device bound to
56011
+ * this cap — never drawn by a device type's hero card itself (D915).
55930
56012
  *
55931
56013
  * Like `childLayout`, the cap is INERT until a provider sets items: no
55932
56014
  * provider populates it by guessing (no HA inference). The UI renders a
55933
56015
  * "No consumables reported" placeholder when `items` is empty.
55934
56016
  */
56017
+ /**
56018
+ * What an item IS, which decides which direction is bad:
56019
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
56020
+ * - `supply` — something the device draws from (clean water, detergent,
56021
+ * salt, rinse aid); low or empty is bad.
56022
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
56023
+ * bad.
56024
+ * Absent = `wear`.
56025
+ */
56026
+ var ConsumableKindSchema = _enum([
56027
+ "wear",
56028
+ "supply",
56029
+ "waste"
56030
+ ]);
56031
+ /**
56032
+ * What an item LOOKS like, which decides how a client draws it — independent
56033
+ * of `kind`, which decides which direction is bad:
56034
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
56035
+ * remaining time and a reset.
56036
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
56037
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
56038
+ * a stepped level and "refill".
56039
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
56040
+ * that warns when full.
56041
+ * Absent = derived from the kind ({@link consumableFormOf}).
56042
+ */
56043
+ var ConsumableFormSchema = _enum([
56044
+ "part",
56045
+ "tank",
56046
+ "product",
56047
+ "bin"
56048
+ ]);
56049
+ /** The provider's own discrete verdict on an item. */
56050
+ var ConsumableStatusSchema = _enum([
56051
+ "ok",
56052
+ "low",
56053
+ "empty",
56054
+ "full",
56055
+ "replace"
56056
+ ]);
56057
+ _enum([
56058
+ "ok",
56059
+ "low",
56060
+ "empty",
56061
+ "full"
56062
+ ]);
55935
56063
  /** Units a remaining-life counter is reported in. Closed: the panel renders
55936
56064
  * each. */
55937
56065
  var ConsumableRemainingUnitSchema = _enum([
@@ -55946,18 +56074,23 @@ var ConsumableRemainingSchema = object({
55946
56074
  unit: ConsumableRemainingUnitSchema
55947
56075
  });
55948
56076
  /** A single consumable item. Either a continuous `level` (remaining
55949
- * life %) or a discrete `status` may be known — both may be null when a
55950
- * provider only knows the item exists. `level` and `status` are not
55951
- * mutually exclusive; a provider may report both. */
56077
+ * life %, or fill % for a `supply` / `waste` item) or a discrete `status`
56078
+ * may be known — both may be null when a provider only knows the item
56079
+ * exists. `level` and `status` are not mutually exclusive; a provider may
56080
+ * report both. */
55952
56081
  var ConsumableItemSchema = object({
55953
56082
  /** Stable id, e.g. 'main-brush'. */
55954
56083
  key: string().min(1),
55955
56084
  /** Display name. */
55956
56085
  label: string().min(1),
55957
- /** Remaining life % when known (0..100). */
56086
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
55958
56087
  level: number().min(0).max(100).nullable(),
55959
- /** Discrete state when known (binary mode). */
55960
- status: _enum(["ok", "replace"]).nullable(),
56088
+ /** The provider's discrete verdict when known (binary mode). */
56089
+ status: ConsumableStatusSchema.nullable(),
56090
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
56091
+ kind: ConsumableKindSchema.optional(),
56092
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
56093
+ form: ConsumableFormSchema.optional(),
55961
56094
  /** Ms epoch of the last replace, when known. */
55962
56095
  lastResetAt: number().nullable(),
55963
56096
  /** Whether `reset()` is meaningful for this item. */
@@ -55980,7 +56113,7 @@ var consumablesCapability = {
55980
56113
  kind: "widget",
55981
56114
  widgetId: "host/consumables-panel",
55982
56115
  tab: "consumables",
55983
- topTab: true,
56116
+ placement: "hero",
55984
56117
  label: "Consumables",
55985
56118
  order: 5
55986
56119
  } },
@@ -56041,9 +56174,37 @@ reset: method(object({
56041
56174
  */
56042
56175
  durability: "restored",
56043
56176
  /**
56044
- * History (D850): none — `items` is an array keyed by runtime ids; a history path never enters it.
56177
+ * History (D850, D917): one series per (item field, item `key`) — the item key
56178
+ * is the series scope, the item `label` names it. A vacuum tank's fill, a
56179
+ * brush's remaining life and a dishwasher's salt are each recorded the moment
56180
+ * their provider reports them; an item that appears later gets its series.
56045
56181
  */
56046
- history: "none",
56182
+ history: {
56183
+ fields: {},
56184
+ items: {
56185
+ path: "items",
56186
+ key: "key",
56187
+ label: "label",
56188
+ fields: {
56189
+ level: {
56190
+ kind: "gauge",
56191
+ unit: "%",
56192
+ deadband: 2,
56193
+ displayName: "Level"
56194
+ },
56195
+ status: {
56196
+ kind: "enum",
56197
+ displayName: "Status"
56198
+ },
56199
+ "remaining.value": {
56200
+ kind: "gauge",
56201
+ unitFrom: "remaining.unit",
56202
+ deadband: 1,
56203
+ displayName: "Remaining"
56204
+ }
56205
+ }
56206
+ }
56207
+ },
56047
56208
  /** Clocks, not content: a re-read that changed no item costs no commit. */
56048
56209
  volatileStateFields: ["lastChangedAt", "lastFetchedAt"]
56049
56210
  };
@@ -56458,8 +56619,9 @@ onStatusChanged: { data: object({
56458
56619
  volatileStateFields: ["lastChangedAt"]
56459
56620
  };
56460
56621
  /**
56461
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
56462
- * consumable levels (salt, rinse aid) and common program options.
56622
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
56623
+ * common program options. Salt and rinse aid are NOT here: they are items of
56624
+ * the device's `consumables` cap, like every other device's (D915).
56463
56625
  *
56464
56626
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
56465
56627
  * by any integration that exposes the same program / option surface.
@@ -56507,11 +56669,6 @@ var DishwasherAvailabilitySchema = _enum([
56507
56669
  "offline",
56508
56670
  "description-missing"
56509
56671
  ]);
56510
- var DishwasherConsumableLevelSchema = _enum([
56511
- "ok",
56512
- "low",
56513
- "empty"
56514
- ]);
56515
56672
  var DishwasherStatusSchema = object({
56516
56673
  availability: DishwasherAvailabilitySchema,
56517
56674
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -56544,8 +56701,6 @@ var DishwasherStatusSchema = object({
56544
56701
  powerOn: boolean().nullable(),
56545
56702
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
56546
56703
  powerState: string().nullable(),
56547
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
56548
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56549
56704
  /**
56550
56705
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
56551
56706
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -59421,7 +59576,7 @@ var motionTriggerCapability = {
59421
59576
  enabled: boolean()
59422
59577
  }), _void(), {
59423
59578
  kind: "mutation",
59424
- auth: "admin"
59579
+ auth: "protected"
59425
59580
  }) },
59426
59581
  events: { onMotionTriggerChanged: { data: object({
59427
59582
  deviceId: number(),
@@ -60151,6 +60306,13 @@ var TopologyNodeSchema = object({
60151
60306
  cpuModel: string().nullable(),
60152
60307
  cpuCores: number(),
60153
60308
  memoryMB: number(),
60309
+ /**
60310
+ * The inference RUNTIMES installed on the node (`pythonRuntimes`: onnx,
60311
+ * openvino, edgetpu …) — not its devices. An installed runtime says nothing
60312
+ * about whether its hardware is there (a Coral delegate stays installed
60313
+ * after the stick leaves, D919); the live device set is
60314
+ * `pipelineOrchestrator.getNodeInferenceDevices`.
60315
+ */
60154
60316
  engines: array(string()).readonly(),
60155
60317
  isHub: boolean(),
60156
60318
  isOnline: boolean(),
@@ -61268,7 +61430,28 @@ var ResolvedInferenceConfigSchema = object({
61268
61430
  format: ModelFormatSchema,
61269
61431
  reason: string()
61270
61432
  });
61271
- method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema);
61433
+ /**
61434
+ * The answer of an accelerator rescan (D919): the node's device list after
61435
+ * the re-probe, what changed, and the evidence that decided the Coral answer
61436
+ * (`usbBus` — could the USB bus be read at all; `decidedBy` — USB ids, the PCI
61437
+ * bus, the installed-delegate fallback, or nothing).
61438
+ */
61439
+ var AcceleratorRescanSchema = object({
61440
+ devices: array(InferenceDeviceDescriptorSchema).readonly(),
61441
+ appeared: array(string()).readonly(),
61442
+ disappeared: array(string()).readonly(),
61443
+ usbBus: _enum(["observed", "unobservable"]),
61444
+ decidedBy: _enum([
61445
+ "usb-ids",
61446
+ "pci",
61447
+ "delegate-fallback",
61448
+ "none"
61449
+ ])
61450
+ });
61451
+ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema), method(_void(), AcceleratorRescanSchema, {
61452
+ kind: "mutation",
61453
+ auth: "admin"
61454
+ });
61272
61455
  /**
61273
61456
  * Multi-metric electrical meter. One slice can carry any combination
61274
61457
  * of instantaneous power (W), cumulative energy (kWh), voltage (V),
@@ -65361,60 +65544,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
65361
65544
  auth: "admin",
65362
65545
  access: "delete"
65363
65546
  });
65364
- /**
65365
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
65366
- * cleaning lifecycle plus a return-to-base / locate surface and an
65367
- * optional fan-speed selector.
65368
- *
65369
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
65370
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
65371
- * (0..100) is nullable — some vacuums don't report a battery
65372
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
65373
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
65374
- * tokens the hardware accepts so the UI renders only supported choices.
65375
- *
65376
- * The `setFanSpeed` method takes the bare `speed` token — the provider
65377
- * validates it against the vacuum's own list. `locate` triggers the
65378
- * find-me chirp; `returnToBase` sends it home.
65379
- *
65380
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
65381
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
65382
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
65383
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
65384
- * only when the device has no such tank at all, and use a `TankStatus`
65385
- * with both inner fields `null` when the tank exists but its level is
65386
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
65387
- * so the HA provider leaves all four `null`.
65388
- */
65389
- var VacuumStateSchema = _enum([
65390
- "idle",
65391
- "cleaning",
65392
- "paused",
65393
- "returning",
65394
- "docked",
65395
- "drying",
65396
- "error"
65397
- ]);
65398
- /**
65399
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
65400
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
65401
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
65402
- * level is currently unknown; the OWNING field being `null` means the
65403
- * hardware has no such tank at all.
65404
- */
65405
- var TankStatusSchema = object({
65406
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
65407
- level: number().min(0).max(100).nullable(),
65408
- /** Discrete state when the hardware is binary-mode; null otherwise. */
65409
- status: _enum([
65410
- "ok",
65411
- "low",
65412
- "full"
65413
- ]).nullable()
65414
- });
65415
65547
  var VacuumControlStatusSchema = object({
65416
65548
  /** Lifecycle state of the vacuum. */
65417
- state: VacuumStateSchema,
65549
+ state: _enum([
65550
+ "idle",
65551
+ "cleaning",
65552
+ "paused",
65553
+ "returning",
65554
+ "docked",
65555
+ "drying",
65556
+ "error"
65557
+ ]),
65418
65558
  /** 0..100 battery percentage. Null when the device has no battery
65419
65559
  * reading. */
65420
65560
  batteryLevel: number().min(0).max(100).nullable(),
@@ -65423,14 +65563,6 @@ var VacuumControlStatusSchema = object({
65423
65563
  fanSpeed: string().nullable(),
65424
65564
  /** Speed tokens the hardware accepts — drives the UI selector. */
65425
65565
  availableFanSpeeds: array(string()),
65426
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
65427
- cleanWater: TankStatusSchema.nullable(),
65428
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
65429
- dirtyWater: TankStatusSchema.nullable(),
65430
- /** Detergent tank. Null when the hardware has no detergent tank. */
65431
- detergent: TankStatusSchema.nullable(),
65432
- /** Dust bin. Null when the hardware has no dust bin. */
65433
- dustBin: TankStatusSchema.nullable(),
65434
65566
  /** 0..100 cleaning-completion percentage of the current task, or null. */
65435
65567
  progressPercent: number().min(0).max(100).nullable(),
65436
65568
  /** Current error code (0 / null = no error). */
@@ -65492,35 +65624,14 @@ var vacuumControlCapability = {
65492
65624
  */
65493
65625
  durability: "session",
65494
65626
  /**
65495
- * History (D850): recorded series. Tank levels are fixed-object paths (`cleanWater.level`, ...).
65627
+ * History (D850): recorded series. The tanks moved to `consumables` (D915), whose
65628
+ * items are keyed by runtime ids and record no history.
65496
65629
  */
65497
- history: { fields: {
65498
- batteryLevel: {
65499
- kind: "gauge",
65500
- unit: "%",
65501
- deadband: 2
65502
- },
65503
- "cleanWater.level": {
65504
- kind: "gauge",
65505
- unit: "%",
65506
- deadband: 2
65507
- },
65508
- "dirtyWater.level": {
65509
- kind: "gauge",
65510
- unit: "%",
65511
- deadband: 2
65512
- },
65513
- "detergent.level": {
65514
- kind: "gauge",
65515
- unit: "%",
65516
- deadband: 2
65517
- },
65518
- "dustBin.level": {
65519
- kind: "gauge",
65520
- unit: "%",
65521
- deadband: 2
65522
- }
65523
- } }
65630
+ history: { fields: { batteryLevel: {
65631
+ kind: "gauge",
65632
+ unit: "%",
65633
+ deadband: 2
65634
+ } } }
65524
65635
  };
65525
65636
  var ValveStatusSchema = object({
65526
65637
  /** Lifecycle state of the valve. */
@@ -69914,6 +70025,12 @@ Object.freeze({
69914
70025
  addonId: null,
69915
70026
  access: "create"
69916
70027
  },
70028
+ "deviceHistory.deleteOrphanSeries": {
70029
+ capName: "device-history",
70030
+ capScope: "system",
70031
+ addonId: null,
70032
+ access: "delete"
70033
+ },
69917
70034
  "deviceHistory.getDeviceEnabled": {
69918
70035
  capName: "device-history",
69919
70036
  capScope: "system",
@@ -69932,6 +70049,12 @@ Object.freeze({
69932
70049
  addonId: null,
69933
70050
  access: "view"
69934
70051
  },
70052
+ "deviceHistory.listOrphanSeries": {
70053
+ capName: "device-history",
70054
+ capScope: "system",
70055
+ addonId: null,
70056
+ access: "view"
70057
+ },
69935
70058
  "deviceHistory.listSeries": {
69936
70059
  capName: "device-history",
69937
70060
  capScope: "system",
@@ -73556,6 +73679,12 @@ Object.freeze({
73556
73679
  addonId: null,
73557
73680
  access: "delete"
73558
73681
  },
73682
+ "pipelineOrchestrator.forgetInferenceDevice": {
73683
+ capName: "pipeline-orchestrator",
73684
+ capScope: "system",
73685
+ addonId: null,
73686
+ access: "delete"
73687
+ },
73559
73688
  "pipelineOrchestrator.getAgentLoad": {
73560
73689
  capName: "pipeline-orchestrator",
73561
73690
  capScope: "system",
@@ -74132,6 +74261,12 @@ Object.freeze({
74132
74261
  addonId: null,
74133
74262
  access: "view"
74134
74263
  },
74264
+ "platformProbe.rescanAccelerators": {
74265
+ capName: "platform-probe",
74266
+ capScope: "system",
74267
+ addonId: null,
74268
+ access: "create"
74269
+ },
74135
74270
  "platformProbe.resolveHwAccel": {
74136
74271
  capName: "platform-probe",
74137
74272
  capScope: "system",
@@ -79937,7 +80072,7 @@ var STATE_SUMMARY_VARS = [
79937
80072
  ([...RULE_TEXT], [...COMBINED_ALARM]),
79938
80073
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
79939
80074
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
79940
- ([...RULE_TEXT], [...CONSUMABLE]),
80075
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
79941
80076
  ([...RULE_TEXT], [...TANK]),
79942
80077
  [...RULE_TEXT],
79943
80078
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
package/dist/addon.mjs CHANGED
@@ -6250,7 +6250,7 @@ var ZodIssueCode = {
6250
6250
  var ZodFirstPartyTypeKind;
6251
6251
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
6252
6252
  //#endregion
6253
- //#region ../types/dist/sleep-DJFUfKvA.mjs
6253
+ //#region ../types/dist/sleep-CUp20JkO.mjs
6254
6254
  /**
6255
6255
  * The audio chunk plane's byte format, and the ONE expansion from a coded
6256
6256
  * window to float samples (D455).
@@ -9142,7 +9142,11 @@ var ContributionSectionSchema = object({
9142
9142
  literal(4)
9143
9143
  ]).optional(),
9144
9144
  tab: string().optional(),
9145
- location: _enum(["settings", "top-tab"]).optional(),
9145
+ location: _enum([
9146
+ "settings",
9147
+ "top-tab",
9148
+ "hero"
9149
+ ]).optional(),
9146
9150
  order: number().optional(),
9147
9151
  fields: array(any())
9148
9152
  });
@@ -14075,7 +14079,11 @@ var ConfigSectionWithValuesSchema = object({
14075
14079
  literal(4)
14076
14080
  ]).optional(),
14077
14081
  tab: string().optional(),
14078
- location: _enum(["settings", "top-tab"]).optional(),
14082
+ location: _enum([
14083
+ "settings",
14084
+ "top-tab",
14085
+ "hero"
14086
+ ]).optional(),
14079
14087
  order: number().optional(),
14080
14088
  fields: array(any())
14081
14089
  });
@@ -17955,6 +17963,52 @@ var TierStatusSchema = object({
17955
17963
  countedAt: number().nullable()
17956
17964
  });
17957
17965
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
17966
+ /**
17967
+ * Why a series is orphan. `device-gone`: its device is absent from the
17968
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
17969
+ * key is declared by no capability any more (a field a cap removed).
17970
+ */
17971
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
17972
+ /** Rows held per stored tier. */
17973
+ var TierRowsSchema = object({
17974
+ raw: number().int(),
17975
+ "5m": number().int(),
17976
+ "1h": number().int(),
17977
+ "1d": number().int()
17978
+ });
17979
+ var OrphanSeriesSchema = object({
17980
+ seriesId: number().int(),
17981
+ deviceId: number().int(),
17982
+ key: string(),
17983
+ scope: string(),
17984
+ /** The metric's display name; `null` when its metric row is gone too. */
17985
+ displayName: string().nullable(),
17986
+ reason: DeviceHistoryOrphanReasonSchema,
17987
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
17988
+ missingSince: number().nullable(),
17989
+ firstTs: number(),
17990
+ lastTs: number(),
17991
+ rows: TierRowsSchema
17992
+ });
17993
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
17994
+ "not-found",
17995
+ "not-orphan",
17996
+ "failed"
17997
+ ]);
17998
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
17999
+ seriesId: number().int(),
18000
+ ok: literal(true),
18001
+ deleted: TierRowsSchema
18002
+ }), object({
18003
+ seriesId: number().int(),
18004
+ ok: literal(false),
18005
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
18006
+ })]);
18007
+ var OrphanListSchema = object({
18008
+ series: array(OrphanSeriesSchema).readonly(),
18009
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
18010
+ truncated: boolean()
18011
+ });
17958
18012
  var DeviceHistoryStatusSchema = object({
17959
18013
  startedAt: number(),
17960
18014
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -18052,7 +18106,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
18052
18106
  }), object({ enabled: boolean() }), {
18053
18107
  kind: "mutation",
18054
18108
  auth: "admin"
18055
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
18109
+ }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" }), method(object({}), OrphanListSchema, { auth: "admin" }), method(object({ seriesIds: array(number().int()).min(1).max(50) }), object({ results: array(OrphanDeleteEntrySchema).readonly() }), {
18110
+ kind: "mutation",
18111
+ auth: "admin"
18112
+ });
18056
18113
  var DeviceCaStatusSchema = discriminatedUnion("state", [
18057
18114
  object({ state: literal("absent") }),
18058
18115
  object({
@@ -51023,6 +51080,19 @@ var NodeInferenceDeviceSchema = object({
51023
51080
  /** Whether the node's live probe reports the device as usable right now. */
51024
51081
  available: boolean(),
51025
51082
  /**
51083
+ * Is the device on the node at all (D919)? `present` — the live probe
51084
+ * reported it; `absent` — the probe ANSWERED and did not report it, so only
51085
+ * its stored settings remain (unplugged, moved to another node): never
51086
+ * eligible, whatever its stored `enabled`, and forgettable with
51087
+ * `forgetInferenceDevice`; `unknown` — the probe did not answer, nothing is
51088
+ * claimed (D315). Optional only for an orchestrator older than the field.
51089
+ */
51090
+ presence: _enum([
51091
+ "present",
51092
+ "absent",
51093
+ "unknown"
51094
+ ]).optional(),
51095
+ /**
51026
51096
  * Whether this device participates in dispatch. AUTO default (spec C2):
51027
51097
  * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
51028
51098
  * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
@@ -51248,7 +51318,13 @@ method(object({
51248
51318
  }), object({ success: literal(true) }), {
51249
51319
  kind: "mutation",
51250
51320
  auth: "admin"
51251
- }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
51321
+ }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({
51322
+ agentNodeId: string(),
51323
+ deviceKey: string()
51324
+ }), object({ success: literal(true) }), {
51325
+ kind: "mutation",
51326
+ auth: "admin"
51327
+ }), method(object({ agentNodeId: string() }), object({
51252
51328
  success: literal(true),
51253
51329
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
51254
51330
  effectiveModelId: string().nullable(),
@@ -55920,17 +55996,69 @@ var connectivityCapability = {
55920
55996
  volatileStateFields: ["lastChangedAt"]
55921
55997
  };
55922
55998
  /**
55923
- * Generic device-consumables capability — surfaces a device's
55924
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
55925
- * descaling cycles, …) with their remaining life and an optional
55926
- * "Replaced" reset action. Device-agnostic: any provider that knows its
55927
- * device tracks consumables can register it; the cap declares no
55928
- * vocabulary of its own — the provider names each item verbatim.
55999
+ * Generic device-consumables capability — the ONE place a device reports what
56000
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
56001
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
56002
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
56003
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
56004
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
56005
+ * its device tracks consumables registers it; the provider names each item
56006
+ * verbatim and says which `kind` it is.
56007
+ *
56008
+ * The admin UI renders it as ONE collapsible section directly under the
56009
+ * device page's hero card (`placement: 'hero'`), for every device bound to
56010
+ * this cap — never drawn by a device type's hero card itself (D915).
55929
56011
  *
55930
56012
  * Like `childLayout`, the cap is INERT until a provider sets items: no
55931
56013
  * provider populates it by guessing (no HA inference). The UI renders a
55932
56014
  * "No consumables reported" placeholder when `items` is empty.
55933
56015
  */
56016
+ /**
56017
+ * What an item IS, which decides which direction is bad:
56018
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
56019
+ * - `supply` — something the device draws from (clean water, detergent,
56020
+ * salt, rinse aid); low or empty is bad.
56021
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
56022
+ * bad.
56023
+ * Absent = `wear`.
56024
+ */
56025
+ var ConsumableKindSchema = _enum([
56026
+ "wear",
56027
+ "supply",
56028
+ "waste"
56029
+ ]);
56030
+ /**
56031
+ * What an item LOOKS like, which decides how a client draws it — independent
56032
+ * of `kind`, which decides which direction is bad:
56033
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
56034
+ * remaining time and a reset.
56035
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
56036
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
56037
+ * a stepped level and "refill".
56038
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
56039
+ * that warns when full.
56040
+ * Absent = derived from the kind ({@link consumableFormOf}).
56041
+ */
56042
+ var ConsumableFormSchema = _enum([
56043
+ "part",
56044
+ "tank",
56045
+ "product",
56046
+ "bin"
56047
+ ]);
56048
+ /** The provider's own discrete verdict on an item. */
56049
+ var ConsumableStatusSchema = _enum([
56050
+ "ok",
56051
+ "low",
56052
+ "empty",
56053
+ "full",
56054
+ "replace"
56055
+ ]);
56056
+ _enum([
56057
+ "ok",
56058
+ "low",
56059
+ "empty",
56060
+ "full"
56061
+ ]);
55934
56062
  /** Units a remaining-life counter is reported in. Closed: the panel renders
55935
56063
  * each. */
55936
56064
  var ConsumableRemainingUnitSchema = _enum([
@@ -55945,18 +56073,23 @@ var ConsumableRemainingSchema = object({
55945
56073
  unit: ConsumableRemainingUnitSchema
55946
56074
  });
55947
56075
  /** A single consumable item. Either a continuous `level` (remaining
55948
- * life %) or a discrete `status` may be known — both may be null when a
55949
- * provider only knows the item exists. `level` and `status` are not
55950
- * mutually exclusive; a provider may report both. */
56076
+ * life %, or fill % for a `supply` / `waste` item) or a discrete `status`
56077
+ * may be known — both may be null when a provider only knows the item
56078
+ * exists. `level` and `status` are not mutually exclusive; a provider may
56079
+ * report both. */
55951
56080
  var ConsumableItemSchema = object({
55952
56081
  /** Stable id, e.g. 'main-brush'. */
55953
56082
  key: string().min(1),
55954
56083
  /** Display name. */
55955
56084
  label: string().min(1),
55956
- /** Remaining life % when known (0..100). */
56085
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
55957
56086
  level: number().min(0).max(100).nullable(),
55958
- /** Discrete state when known (binary mode). */
55959
- status: _enum(["ok", "replace"]).nullable(),
56087
+ /** The provider's discrete verdict when known (binary mode). */
56088
+ status: ConsumableStatusSchema.nullable(),
56089
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
56090
+ kind: ConsumableKindSchema.optional(),
56091
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
56092
+ form: ConsumableFormSchema.optional(),
55960
56093
  /** Ms epoch of the last replace, when known. */
55961
56094
  lastResetAt: number().nullable(),
55962
56095
  /** Whether `reset()` is meaningful for this item. */
@@ -55979,7 +56112,7 @@ var consumablesCapability = {
55979
56112
  kind: "widget",
55980
56113
  widgetId: "host/consumables-panel",
55981
56114
  tab: "consumables",
55982
- topTab: true,
56115
+ placement: "hero",
55983
56116
  label: "Consumables",
55984
56117
  order: 5
55985
56118
  } },
@@ -56040,9 +56173,37 @@ reset: method(object({
56040
56173
  */
56041
56174
  durability: "restored",
56042
56175
  /**
56043
- * History (D850): none — `items` is an array keyed by runtime ids; a history path never enters it.
56176
+ * History (D850, D917): one series per (item field, item `key`) — the item key
56177
+ * is the series scope, the item `label` names it. A vacuum tank's fill, a
56178
+ * brush's remaining life and a dishwasher's salt are each recorded the moment
56179
+ * their provider reports them; an item that appears later gets its series.
56044
56180
  */
56045
- history: "none",
56181
+ history: {
56182
+ fields: {},
56183
+ items: {
56184
+ path: "items",
56185
+ key: "key",
56186
+ label: "label",
56187
+ fields: {
56188
+ level: {
56189
+ kind: "gauge",
56190
+ unit: "%",
56191
+ deadband: 2,
56192
+ displayName: "Level"
56193
+ },
56194
+ status: {
56195
+ kind: "enum",
56196
+ displayName: "Status"
56197
+ },
56198
+ "remaining.value": {
56199
+ kind: "gauge",
56200
+ unitFrom: "remaining.unit",
56201
+ deadband: 1,
56202
+ displayName: "Remaining"
56203
+ }
56204
+ }
56205
+ }
56206
+ },
56046
56207
  /** Clocks, not content: a re-read that changed no item costs no commit. */
56047
56208
  volatileStateFields: ["lastChangedAt", "lastFetchedAt"]
56048
56209
  };
@@ -56457,8 +56618,9 @@ onStatusChanged: { data: object({
56457
56618
  volatileStateFields: ["lastChangedAt"]
56458
56619
  };
56459
56620
  /**
56460
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
56461
- * consumable levels (salt, rinse aid) and common program options.
56621
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
56622
+ * common program options. Salt and rinse aid are NOT here: they are items of
56623
+ * the device's `consumables` cap, like every other device's (D915).
56462
56624
  *
56463
56625
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
56464
56626
  * by any integration that exposes the same program / option surface.
@@ -56506,11 +56668,6 @@ var DishwasherAvailabilitySchema = _enum([
56506
56668
  "offline",
56507
56669
  "description-missing"
56508
56670
  ]);
56509
- var DishwasherConsumableLevelSchema = _enum([
56510
- "ok",
56511
- "low",
56512
- "empty"
56513
- ]);
56514
56671
  var DishwasherStatusSchema = object({
56515
56672
  availability: DishwasherAvailabilitySchema,
56516
56673
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -56543,8 +56700,6 @@ var DishwasherStatusSchema = object({
56543
56700
  powerOn: boolean().nullable(),
56544
56701
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
56545
56702
  powerState: string().nullable(),
56546
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
56547
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56548
56703
  /**
56549
56704
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
56550
56705
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -59420,7 +59575,7 @@ var motionTriggerCapability = {
59420
59575
  enabled: boolean()
59421
59576
  }), _void(), {
59422
59577
  kind: "mutation",
59423
- auth: "admin"
59578
+ auth: "protected"
59424
59579
  }) },
59425
59580
  events: { onMotionTriggerChanged: { data: object({
59426
59581
  deviceId: number(),
@@ -60150,6 +60305,13 @@ var TopologyNodeSchema = object({
60150
60305
  cpuModel: string().nullable(),
60151
60306
  cpuCores: number(),
60152
60307
  memoryMB: number(),
60308
+ /**
60309
+ * The inference RUNTIMES installed on the node (`pythonRuntimes`: onnx,
60310
+ * openvino, edgetpu …) — not its devices. An installed runtime says nothing
60311
+ * about whether its hardware is there (a Coral delegate stays installed
60312
+ * after the stick leaves, D919); the live device set is
60313
+ * `pipelineOrchestrator.getNodeInferenceDevices`.
60314
+ */
60153
60315
  engines: array(string()).readonly(),
60154
60316
  isHub: boolean(),
60155
60317
  isOnline: boolean(),
@@ -61267,7 +61429,28 @@ var ResolvedInferenceConfigSchema = object({
61267
61429
  format: ModelFormatSchema,
61268
61430
  reason: string()
61269
61431
  });
61270
- method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema);
61432
+ /**
61433
+ * The answer of an accelerator rescan (D919): the node's device list after
61434
+ * the re-probe, what changed, and the evidence that decided the Coral answer
61435
+ * (`usbBus` — could the USB bus be read at all; `decidedBy` — USB ids, the PCI
61436
+ * bus, the installed-delegate fallback, or nothing).
61437
+ */
61438
+ var AcceleratorRescanSchema = object({
61439
+ devices: array(InferenceDeviceDescriptorSchema).readonly(),
61440
+ appeared: array(string()).readonly(),
61441
+ disappeared: array(string()).readonly(),
61442
+ usbBus: _enum(["observed", "unobservable"]),
61443
+ decidedBy: _enum([
61444
+ "usb-ids",
61445
+ "pci",
61446
+ "delegate-fallback",
61447
+ "none"
61448
+ ])
61449
+ });
61450
+ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema), method(_void(), AcceleratorRescanSchema, {
61451
+ kind: "mutation",
61452
+ auth: "admin"
61453
+ });
61271
61454
  /**
61272
61455
  * Multi-metric electrical meter. One slice can carry any combination
61273
61456
  * of instantaneous power (W), cumulative energy (kWh), voltage (V),
@@ -65360,60 +65543,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
65360
65543
  auth: "admin",
65361
65544
  access: "delete"
65362
65545
  });
65363
- /**
65364
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
65365
- * cleaning lifecycle plus a return-to-base / locate surface and an
65366
- * optional fan-speed selector.
65367
- *
65368
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
65369
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
65370
- * (0..100) is nullable — some vacuums don't report a battery
65371
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
65372
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
65373
- * tokens the hardware accepts so the UI renders only supported choices.
65374
- *
65375
- * The `setFanSpeed` method takes the bare `speed` token — the provider
65376
- * validates it against the vacuum's own list. `locate` triggers the
65377
- * find-me chirp; `returnToBase` sends it home.
65378
- *
65379
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
65380
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
65381
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
65382
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
65383
- * only when the device has no such tank at all, and use a `TankStatus`
65384
- * with both inner fields `null` when the tank exists but its level is
65385
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
65386
- * so the HA provider leaves all four `null`.
65387
- */
65388
- var VacuumStateSchema = _enum([
65389
- "idle",
65390
- "cleaning",
65391
- "paused",
65392
- "returning",
65393
- "docked",
65394
- "drying",
65395
- "error"
65396
- ]);
65397
- /**
65398
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
65399
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
65400
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
65401
- * level is currently unknown; the OWNING field being `null` means the
65402
- * hardware has no such tank at all.
65403
- */
65404
- var TankStatusSchema = object({
65405
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
65406
- level: number().min(0).max(100).nullable(),
65407
- /** Discrete state when the hardware is binary-mode; null otherwise. */
65408
- status: _enum([
65409
- "ok",
65410
- "low",
65411
- "full"
65412
- ]).nullable()
65413
- });
65414
65546
  var VacuumControlStatusSchema = object({
65415
65547
  /** Lifecycle state of the vacuum. */
65416
- state: VacuumStateSchema,
65548
+ state: _enum([
65549
+ "idle",
65550
+ "cleaning",
65551
+ "paused",
65552
+ "returning",
65553
+ "docked",
65554
+ "drying",
65555
+ "error"
65556
+ ]),
65417
65557
  /** 0..100 battery percentage. Null when the device has no battery
65418
65558
  * reading. */
65419
65559
  batteryLevel: number().min(0).max(100).nullable(),
@@ -65422,14 +65562,6 @@ var VacuumControlStatusSchema = object({
65422
65562
  fanSpeed: string().nullable(),
65423
65563
  /** Speed tokens the hardware accepts — drives the UI selector. */
65424
65564
  availableFanSpeeds: array(string()),
65425
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
65426
- cleanWater: TankStatusSchema.nullable(),
65427
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
65428
- dirtyWater: TankStatusSchema.nullable(),
65429
- /** Detergent tank. Null when the hardware has no detergent tank. */
65430
- detergent: TankStatusSchema.nullable(),
65431
- /** Dust bin. Null when the hardware has no dust bin. */
65432
- dustBin: TankStatusSchema.nullable(),
65433
65565
  /** 0..100 cleaning-completion percentage of the current task, or null. */
65434
65566
  progressPercent: number().min(0).max(100).nullable(),
65435
65567
  /** Current error code (0 / null = no error). */
@@ -65491,35 +65623,14 @@ var vacuumControlCapability = {
65491
65623
  */
65492
65624
  durability: "session",
65493
65625
  /**
65494
- * History (D850): recorded series. Tank levels are fixed-object paths (`cleanWater.level`, ...).
65626
+ * History (D850): recorded series. The tanks moved to `consumables` (D915), whose
65627
+ * items are keyed by runtime ids and record no history.
65495
65628
  */
65496
- history: { fields: {
65497
- batteryLevel: {
65498
- kind: "gauge",
65499
- unit: "%",
65500
- deadband: 2
65501
- },
65502
- "cleanWater.level": {
65503
- kind: "gauge",
65504
- unit: "%",
65505
- deadband: 2
65506
- },
65507
- "dirtyWater.level": {
65508
- kind: "gauge",
65509
- unit: "%",
65510
- deadband: 2
65511
- },
65512
- "detergent.level": {
65513
- kind: "gauge",
65514
- unit: "%",
65515
- deadband: 2
65516
- },
65517
- "dustBin.level": {
65518
- kind: "gauge",
65519
- unit: "%",
65520
- deadband: 2
65521
- }
65522
- } }
65629
+ history: { fields: { batteryLevel: {
65630
+ kind: "gauge",
65631
+ unit: "%",
65632
+ deadband: 2
65633
+ } } }
65523
65634
  };
65524
65635
  var ValveStatusSchema = object({
65525
65636
  /** Lifecycle state of the valve. */
@@ -69913,6 +70024,12 @@ Object.freeze({
69913
70024
  addonId: null,
69914
70025
  access: "create"
69915
70026
  },
70027
+ "deviceHistory.deleteOrphanSeries": {
70028
+ capName: "device-history",
70029
+ capScope: "system",
70030
+ addonId: null,
70031
+ access: "delete"
70032
+ },
69916
70033
  "deviceHistory.getDeviceEnabled": {
69917
70034
  capName: "device-history",
69918
70035
  capScope: "system",
@@ -69931,6 +70048,12 @@ Object.freeze({
69931
70048
  addonId: null,
69932
70049
  access: "view"
69933
70050
  },
70051
+ "deviceHistory.listOrphanSeries": {
70052
+ capName: "device-history",
70053
+ capScope: "system",
70054
+ addonId: null,
70055
+ access: "view"
70056
+ },
69934
70057
  "deviceHistory.listSeries": {
69935
70058
  capName: "device-history",
69936
70059
  capScope: "system",
@@ -73555,6 +73678,12 @@ Object.freeze({
73555
73678
  addonId: null,
73556
73679
  access: "delete"
73557
73680
  },
73681
+ "pipelineOrchestrator.forgetInferenceDevice": {
73682
+ capName: "pipeline-orchestrator",
73683
+ capScope: "system",
73684
+ addonId: null,
73685
+ access: "delete"
73686
+ },
73558
73687
  "pipelineOrchestrator.getAgentLoad": {
73559
73688
  capName: "pipeline-orchestrator",
73560
73689
  capScope: "system",
@@ -74131,6 +74260,12 @@ Object.freeze({
74131
74260
  addonId: null,
74132
74261
  access: "view"
74133
74262
  },
74263
+ "platformProbe.rescanAccelerators": {
74264
+ capName: "platform-probe",
74265
+ capScope: "system",
74266
+ addonId: null,
74267
+ access: "create"
74268
+ },
74134
74269
  "platformProbe.resolveHwAccel": {
74135
74270
  capName: "platform-probe",
74136
74271
  capScope: "system",
@@ -79936,7 +80071,7 @@ var STATE_SUMMARY_VARS = [
79936
80071
  ([...RULE_TEXT], [...COMBINED_ALARM]),
79937
80072
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
79938
80073
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
79939
- ([...RULE_TEXT], [...CONSUMABLE]),
80074
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
79940
80075
  ([...RULE_TEXT], [...TANK]),
79941
80076
  [...RULE_TEXT],
79942
80077
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-tuya",
3
- "version": "0.2.142",
3
+ "version": "0.2.144",
4
4
  "description": "Tuya / Smart Life device-provider addon for CamStack — account-onboarded (Tuya IoT cloud fetch of device localKeys) + LOCAL DP control via the @apocaliss92/nodetuya encrypted-LAN client, exposing switch / water-heater-family kettle entities",
5
5
  "keywords": [
6
6
  "camstack",