@camstack/addon-provider-wyze 0.2.155 → 0.2.157

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
@@ -5463,7 +5463,7 @@ var ZodIssueCode = {
5463
5463
  var ZodFirstPartyTypeKind;
5464
5464
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5465
5465
  //#endregion
5466
- //#region ../types/dist/sleep-DJFUfKvA.mjs
5466
+ //#region ../types/dist/sleep-CUp20JkO.mjs
5467
5467
  /**
5468
5468
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5469
5469
  * window to float samples (D455).
@@ -8355,7 +8355,11 @@ var ContributionSectionSchema = object({
8355
8355
  literal(4)
8356
8356
  ]).optional(),
8357
8357
  tab: string().optional(),
8358
- location: _enum(["settings", "top-tab"]).optional(),
8358
+ location: _enum([
8359
+ "settings",
8360
+ "top-tab",
8361
+ "hero"
8362
+ ]).optional(),
8359
8363
  order: number().optional(),
8360
8364
  fields: array(any())
8361
8365
  });
@@ -13322,7 +13326,11 @@ var ConfigSectionWithValuesSchema = object({
13322
13326
  literal(4)
13323
13327
  ]).optional(),
13324
13328
  tab: string().optional(),
13325
- location: _enum(["settings", "top-tab"]).optional(),
13329
+ location: _enum([
13330
+ "settings",
13331
+ "top-tab",
13332
+ "hero"
13333
+ ]).optional(),
13326
13334
  order: number().optional(),
13327
13335
  fields: array(any())
13328
13336
  });
@@ -17202,6 +17210,52 @@ var TierStatusSchema = object({
17202
17210
  countedAt: number().nullable()
17203
17211
  });
17204
17212
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
17213
+ /**
17214
+ * Why a series is orphan. `device-gone`: its device is absent from the
17215
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
17216
+ * key is declared by no capability any more (a field a cap removed).
17217
+ */
17218
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
17219
+ /** Rows held per stored tier. */
17220
+ var TierRowsSchema = object({
17221
+ raw: number().int(),
17222
+ "5m": number().int(),
17223
+ "1h": number().int(),
17224
+ "1d": number().int()
17225
+ });
17226
+ var OrphanSeriesSchema = object({
17227
+ seriesId: number().int(),
17228
+ deviceId: number().int(),
17229
+ key: string(),
17230
+ scope: string(),
17231
+ /** The metric's display name; `null` when its metric row is gone too. */
17232
+ displayName: string().nullable(),
17233
+ reason: DeviceHistoryOrphanReasonSchema,
17234
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
17235
+ missingSince: number().nullable(),
17236
+ firstTs: number(),
17237
+ lastTs: number(),
17238
+ rows: TierRowsSchema
17239
+ });
17240
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
17241
+ "not-found",
17242
+ "not-orphan",
17243
+ "failed"
17244
+ ]);
17245
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
17246
+ seriesId: number().int(),
17247
+ ok: literal(true),
17248
+ deleted: TierRowsSchema
17249
+ }), object({
17250
+ seriesId: number().int(),
17251
+ ok: literal(false),
17252
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
17253
+ })]);
17254
+ var OrphanListSchema = object({
17255
+ series: array(OrphanSeriesSchema).readonly(),
17256
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
17257
+ truncated: boolean()
17258
+ });
17205
17259
  var DeviceHistoryStatusSchema = object({
17206
17260
  startedAt: number(),
17207
17261
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -17299,7 +17353,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
17299
17353
  }), object({ enabled: boolean() }), {
17300
17354
  kind: "mutation",
17301
17355
  auth: "admin"
17302
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
17356
+ }), 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() }), {
17357
+ kind: "mutation",
17358
+ auth: "admin"
17359
+ });
17303
17360
  var DeviceCaStatusSchema = discriminatedUnion("state", [
17304
17361
  object({ state: literal("absent") }),
17305
17362
  object({
@@ -50270,6 +50327,19 @@ var NodeInferenceDeviceSchema = object({
50270
50327
  /** Whether the node's live probe reports the device as usable right now. */
50271
50328
  available: boolean(),
50272
50329
  /**
50330
+ * Is the device on the node at all (D919)? `present` — the live probe
50331
+ * reported it; `absent` — the probe ANSWERED and did not report it, so only
50332
+ * its stored settings remain (unplugged, moved to another node): never
50333
+ * eligible, whatever its stored `enabled`, and forgettable with
50334
+ * `forgetInferenceDevice`; `unknown` — the probe did not answer, nothing is
50335
+ * claimed (D315). Optional only for an orchestrator older than the field.
50336
+ */
50337
+ presence: _enum([
50338
+ "present",
50339
+ "absent",
50340
+ "unknown"
50341
+ ]).optional(),
50342
+ /**
50273
50343
  * Whether this device participates in dispatch. AUTO default (spec C2):
50274
50344
  * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
50275
50345
  * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
@@ -50495,7 +50565,13 @@ method(object({
50495
50565
  }), object({ success: literal(true) }), {
50496
50566
  kind: "mutation",
50497
50567
  auth: "admin"
50498
- }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
50568
+ }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({
50569
+ agentNodeId: string(),
50570
+ deviceKey: string()
50571
+ }), object({ success: literal(true) }), {
50572
+ kind: "mutation",
50573
+ auth: "admin"
50574
+ }), method(object({ agentNodeId: string() }), object({
50499
50575
  success: literal(true),
50500
50576
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
50501
50577
  effectiveModelId: string().nullable(),
@@ -55271,17 +55347,69 @@ var connectivityCapability = {
55271
55347
  volatileStateFields: ["lastChangedAt"]
55272
55348
  };
55273
55349
  /**
55274
- * Generic device-consumables capability — surfaces a device's
55275
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
55276
- * descaling cycles, …) with their remaining life and an optional
55277
- * "Replaced" reset action. Device-agnostic: any provider that knows its
55278
- * device tracks consumables can register it; the cap declares no
55279
- * vocabulary of its own — the provider names each item verbatim.
55350
+ * Generic device-consumables capability — the ONE place a device reports what
55351
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
55352
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
55353
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
55354
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
55355
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
55356
+ * its device tracks consumables registers it; the provider names each item
55357
+ * verbatim and says which `kind` it is.
55358
+ *
55359
+ * The admin UI renders it as ONE collapsible section directly under the
55360
+ * device page's hero card (`placement: 'hero'`), for every device bound to
55361
+ * this cap — never drawn by a device type's hero card itself (D915).
55280
55362
  *
55281
55363
  * Like `childLayout`, the cap is INERT until a provider sets items: no
55282
55364
  * provider populates it by guessing (no HA inference). The UI renders a
55283
55365
  * "No consumables reported" placeholder when `items` is empty.
55284
55366
  */
55367
+ /**
55368
+ * What an item IS, which decides which direction is bad:
55369
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
55370
+ * - `supply` — something the device draws from (clean water, detergent,
55371
+ * salt, rinse aid); low or empty is bad.
55372
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
55373
+ * bad.
55374
+ * Absent = `wear`.
55375
+ */
55376
+ var ConsumableKindSchema = _enum([
55377
+ "wear",
55378
+ "supply",
55379
+ "waste"
55380
+ ]);
55381
+ /**
55382
+ * What an item LOOKS like, which decides how a client draws it — independent
55383
+ * of `kind`, which decides which direction is bad:
55384
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
55385
+ * remaining time and a reset.
55386
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
55387
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
55388
+ * a stepped level and "refill".
55389
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
55390
+ * that warns when full.
55391
+ * Absent = derived from the kind ({@link consumableFormOf}).
55392
+ */
55393
+ var ConsumableFormSchema = _enum([
55394
+ "part",
55395
+ "tank",
55396
+ "product",
55397
+ "bin"
55398
+ ]);
55399
+ /** The provider's own discrete verdict on an item. */
55400
+ var ConsumableStatusSchema = _enum([
55401
+ "ok",
55402
+ "low",
55403
+ "empty",
55404
+ "full",
55405
+ "replace"
55406
+ ]);
55407
+ _enum([
55408
+ "ok",
55409
+ "low",
55410
+ "empty",
55411
+ "full"
55412
+ ]);
55285
55413
  /** Units a remaining-life counter is reported in. Closed: the panel renders
55286
55414
  * each. */
55287
55415
  var ConsumableRemainingUnitSchema = _enum([
@@ -55296,18 +55424,23 @@ var ConsumableRemainingSchema = object({
55296
55424
  unit: ConsumableRemainingUnitSchema
55297
55425
  });
55298
55426
  /** A single consumable item. Either a continuous `level` (remaining
55299
- * life %) or a discrete `status` may be known — both may be null when a
55300
- * provider only knows the item exists. `level` and `status` are not
55301
- * mutually exclusive; a provider may report both. */
55427
+ * life %, or fill % for a `supply` / `waste` item) or a discrete `status`
55428
+ * may be known — both may be null when a provider only knows the item
55429
+ * exists. `level` and `status` are not mutually exclusive; a provider may
55430
+ * report both. */
55302
55431
  var ConsumableItemSchema = object({
55303
55432
  /** Stable id, e.g. 'main-brush'. */
55304
55433
  key: string().min(1),
55305
55434
  /** Display name. */
55306
55435
  label: string().min(1),
55307
- /** Remaining life % when known (0..100). */
55436
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
55308
55437
  level: number().min(0).max(100).nullable(),
55309
- /** Discrete state when known (binary mode). */
55310
- status: _enum(["ok", "replace"]).nullable(),
55438
+ /** The provider's discrete verdict when known (binary mode). */
55439
+ status: ConsumableStatusSchema.nullable(),
55440
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
55441
+ kind: ConsumableKindSchema.optional(),
55442
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
55443
+ form: ConsumableFormSchema.optional(),
55311
55444
  /** Ms epoch of the last replace, when known. */
55312
55445
  lastResetAt: number().nullable(),
55313
55446
  /** Whether `reset()` is meaningful for this item. */
@@ -55330,7 +55463,7 @@ var consumablesCapability = {
55330
55463
  kind: "widget",
55331
55464
  widgetId: "host/consumables-panel",
55332
55465
  tab: "consumables",
55333
- topTab: true,
55466
+ placement: "hero",
55334
55467
  label: "Consumables",
55335
55468
  order: 5
55336
55469
  } },
@@ -55391,9 +55524,37 @@ reset: method(object({
55391
55524
  */
55392
55525
  durability: "restored",
55393
55526
  /**
55394
- * History (D850): none — `items` is an array keyed by runtime ids; a history path never enters it.
55527
+ * History (D850, D917): one series per (item field, item `key`) — the item key
55528
+ * is the series scope, the item `label` names it. A vacuum tank's fill, a
55529
+ * brush's remaining life and a dishwasher's salt are each recorded the moment
55530
+ * their provider reports them; an item that appears later gets its series.
55395
55531
  */
55396
- history: "none",
55532
+ history: {
55533
+ fields: {},
55534
+ items: {
55535
+ path: "items",
55536
+ key: "key",
55537
+ label: "label",
55538
+ fields: {
55539
+ level: {
55540
+ kind: "gauge",
55541
+ unit: "%",
55542
+ deadband: 2,
55543
+ displayName: "Level"
55544
+ },
55545
+ status: {
55546
+ kind: "enum",
55547
+ displayName: "Status"
55548
+ },
55549
+ "remaining.value": {
55550
+ kind: "gauge",
55551
+ unitFrom: "remaining.unit",
55552
+ deadband: 1,
55553
+ displayName: "Remaining"
55554
+ }
55555
+ }
55556
+ }
55557
+ },
55397
55558
  /** Clocks, not content: a re-read that changed no item costs no commit. */
55398
55559
  volatileStateFields: ["lastChangedAt", "lastFetchedAt"]
55399
55560
  };
@@ -55808,8 +55969,9 @@ onStatusChanged: { data: object({
55808
55969
  volatileStateFields: ["lastChangedAt"]
55809
55970
  };
55810
55971
  /**
55811
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
55812
- * consumable levels (salt, rinse aid) and common program options.
55972
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
55973
+ * common program options. Salt and rinse aid are NOT here: they are items of
55974
+ * the device's `consumables` cap, like every other device's (D915).
55813
55975
  *
55814
55976
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
55815
55977
  * by any integration that exposes the same program / option surface.
@@ -55857,11 +56019,6 @@ var DishwasherAvailabilitySchema = _enum([
55857
56019
  "offline",
55858
56020
  "description-missing"
55859
56021
  ]);
55860
- var DishwasherConsumableLevelSchema = _enum([
55861
- "ok",
55862
- "low",
55863
- "empty"
55864
- ]);
55865
56022
  var DishwasherStatusSchema = object({
55866
56023
  availability: DishwasherAvailabilitySchema,
55867
56024
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -55894,8 +56051,6 @@ var DishwasherStatusSchema = object({
55894
56051
  powerOn: boolean().nullable(),
55895
56052
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
55896
56053
  powerState: string().nullable(),
55897
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
55898
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55899
56054
  /**
55900
56055
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
55901
56056
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -58771,7 +58926,7 @@ var motionTriggerCapability = {
58771
58926
  enabled: boolean()
58772
58927
  }), _void(), {
58773
58928
  kind: "mutation",
58774
- auth: "admin"
58929
+ auth: "protected"
58775
58930
  }) },
58776
58931
  events: { onMotionTriggerChanged: { data: object({
58777
58932
  deviceId: number(),
@@ -59501,6 +59656,13 @@ var TopologyNodeSchema = object({
59501
59656
  cpuModel: string().nullable(),
59502
59657
  cpuCores: number(),
59503
59658
  memoryMB: number(),
59659
+ /**
59660
+ * The inference RUNTIMES installed on the node (`pythonRuntimes`: onnx,
59661
+ * openvino, edgetpu …) — not its devices. An installed runtime says nothing
59662
+ * about whether its hardware is there (a Coral delegate stays installed
59663
+ * after the stick leaves, D919); the live device set is
59664
+ * `pipelineOrchestrator.getNodeInferenceDevices`.
59665
+ */
59504
59666
  engines: array(string()).readonly(),
59505
59667
  isHub: boolean(),
59506
59668
  isOnline: boolean(),
@@ -60618,7 +60780,28 @@ var ResolvedInferenceConfigSchema = object({
60618
60780
  format: ModelFormatSchema,
60619
60781
  reason: string()
60620
60782
  });
60621
- method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema);
60783
+ /**
60784
+ * The answer of an accelerator rescan (D919): the node's device list after
60785
+ * the re-probe, what changed, and the evidence that decided the Coral answer
60786
+ * (`usbBus` — could the USB bus be read at all; `decidedBy` — USB ids, the PCI
60787
+ * bus, the installed-delegate fallback, or nothing).
60788
+ */
60789
+ var AcceleratorRescanSchema = object({
60790
+ devices: array(InferenceDeviceDescriptorSchema).readonly(),
60791
+ appeared: array(string()).readonly(),
60792
+ disappeared: array(string()).readonly(),
60793
+ usbBus: _enum(["observed", "unobservable"]),
60794
+ decidedBy: _enum([
60795
+ "usb-ids",
60796
+ "pci",
60797
+ "delegate-fallback",
60798
+ "none"
60799
+ ])
60800
+ });
60801
+ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema), method(_void(), AcceleratorRescanSchema, {
60802
+ kind: "mutation",
60803
+ auth: "admin"
60804
+ });
60622
60805
  /**
60623
60806
  * Multi-metric electrical meter. One slice can carry any combination
60624
60807
  * of instantaneous power (W), cumulative energy (kWh), voltage (V),
@@ -64711,60 +64894,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64711
64894
  auth: "admin",
64712
64895
  access: "delete"
64713
64896
  });
64714
- /**
64715
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
64716
- * cleaning lifecycle plus a return-to-base / locate surface and an
64717
- * optional fan-speed selector.
64718
- *
64719
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
64720
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
64721
- * (0..100) is nullable — some vacuums don't report a battery
64722
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
64723
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
64724
- * tokens the hardware accepts so the UI renders only supported choices.
64725
- *
64726
- * The `setFanSpeed` method takes the bare `speed` token — the provider
64727
- * validates it against the vacuum's own list. `locate` triggers the
64728
- * find-me chirp; `returnToBase` sends it home.
64729
- *
64730
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
64731
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
64732
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
64733
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
64734
- * only when the device has no such tank at all, and use a `TankStatus`
64735
- * with both inner fields `null` when the tank exists but its level is
64736
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
64737
- * so the HA provider leaves all four `null`.
64738
- */
64739
- var VacuumStateSchema = _enum([
64740
- "idle",
64741
- "cleaning",
64742
- "paused",
64743
- "returning",
64744
- "docked",
64745
- "drying",
64746
- "error"
64747
- ]);
64748
- /**
64749
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
64750
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
64751
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
64752
- * level is currently unknown; the OWNING field being `null` means the
64753
- * hardware has no such tank at all.
64754
- */
64755
- var TankStatusSchema = object({
64756
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
64757
- level: number().min(0).max(100).nullable(),
64758
- /** Discrete state when the hardware is binary-mode; null otherwise. */
64759
- status: _enum([
64760
- "ok",
64761
- "low",
64762
- "full"
64763
- ]).nullable()
64764
- });
64765
64897
  var VacuumControlStatusSchema = object({
64766
64898
  /** Lifecycle state of the vacuum. */
64767
- state: VacuumStateSchema,
64899
+ state: _enum([
64900
+ "idle",
64901
+ "cleaning",
64902
+ "paused",
64903
+ "returning",
64904
+ "docked",
64905
+ "drying",
64906
+ "error"
64907
+ ]),
64768
64908
  /** 0..100 battery percentage. Null when the device has no battery
64769
64909
  * reading. */
64770
64910
  batteryLevel: number().min(0).max(100).nullable(),
@@ -64773,14 +64913,6 @@ var VacuumControlStatusSchema = object({
64773
64913
  fanSpeed: string().nullable(),
64774
64914
  /** Speed tokens the hardware accepts — drives the UI selector. */
64775
64915
  availableFanSpeeds: array(string()),
64776
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
64777
- cleanWater: TankStatusSchema.nullable(),
64778
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
64779
- dirtyWater: TankStatusSchema.nullable(),
64780
- /** Detergent tank. Null when the hardware has no detergent tank. */
64781
- detergent: TankStatusSchema.nullable(),
64782
- /** Dust bin. Null when the hardware has no dust bin. */
64783
- dustBin: TankStatusSchema.nullable(),
64784
64916
  /** 0..100 cleaning-completion percentage of the current task, or null. */
64785
64917
  progressPercent: number().min(0).max(100).nullable(),
64786
64918
  /** Current error code (0 / null = no error). */
@@ -64842,35 +64974,14 @@ var vacuumControlCapability = {
64842
64974
  */
64843
64975
  durability: "session",
64844
64976
  /**
64845
- * History (D850): recorded series. Tank levels are fixed-object paths (`cleanWater.level`, ...).
64977
+ * History (D850): recorded series. The tanks moved to `consumables` (D915), whose
64978
+ * items are keyed by runtime ids and record no history.
64846
64979
  */
64847
- history: { fields: {
64848
- batteryLevel: {
64849
- kind: "gauge",
64850
- unit: "%",
64851
- deadband: 2
64852
- },
64853
- "cleanWater.level": {
64854
- kind: "gauge",
64855
- unit: "%",
64856
- deadband: 2
64857
- },
64858
- "dirtyWater.level": {
64859
- kind: "gauge",
64860
- unit: "%",
64861
- deadband: 2
64862
- },
64863
- "detergent.level": {
64864
- kind: "gauge",
64865
- unit: "%",
64866
- deadband: 2
64867
- },
64868
- "dustBin.level": {
64869
- kind: "gauge",
64870
- unit: "%",
64871
- deadband: 2
64872
- }
64873
- } }
64980
+ history: { fields: { batteryLevel: {
64981
+ kind: "gauge",
64982
+ unit: "%",
64983
+ deadband: 2
64984
+ } } }
64874
64985
  };
64875
64986
  var ValveStatusSchema = object({
64876
64987
  /** Lifecycle state of the valve. */
@@ -69264,6 +69375,12 @@ Object.freeze({
69264
69375
  addonId: null,
69265
69376
  access: "create"
69266
69377
  },
69378
+ "deviceHistory.deleteOrphanSeries": {
69379
+ capName: "device-history",
69380
+ capScope: "system",
69381
+ addonId: null,
69382
+ access: "delete"
69383
+ },
69267
69384
  "deviceHistory.getDeviceEnabled": {
69268
69385
  capName: "device-history",
69269
69386
  capScope: "system",
@@ -69282,6 +69399,12 @@ Object.freeze({
69282
69399
  addonId: null,
69283
69400
  access: "view"
69284
69401
  },
69402
+ "deviceHistory.listOrphanSeries": {
69403
+ capName: "device-history",
69404
+ capScope: "system",
69405
+ addonId: null,
69406
+ access: "view"
69407
+ },
69285
69408
  "deviceHistory.listSeries": {
69286
69409
  capName: "device-history",
69287
69410
  capScope: "system",
@@ -72906,6 +73029,12 @@ Object.freeze({
72906
73029
  addonId: null,
72907
73030
  access: "delete"
72908
73031
  },
73032
+ "pipelineOrchestrator.forgetInferenceDevice": {
73033
+ capName: "pipeline-orchestrator",
73034
+ capScope: "system",
73035
+ addonId: null,
73036
+ access: "delete"
73037
+ },
72909
73038
  "pipelineOrchestrator.getAgentLoad": {
72910
73039
  capName: "pipeline-orchestrator",
72911
73040
  capScope: "system",
@@ -73482,6 +73611,12 @@ Object.freeze({
73482
73611
  addonId: null,
73483
73612
  access: "view"
73484
73613
  },
73614
+ "platformProbe.rescanAccelerators": {
73615
+ capName: "platform-probe",
73616
+ capScope: "system",
73617
+ addonId: null,
73618
+ access: "create"
73619
+ },
73485
73620
  "platformProbe.resolveHwAccel": {
73486
73621
  capName: "platform-probe",
73487
73622
  capScope: "system",
@@ -79287,7 +79422,7 @@ var STATE_SUMMARY_VARS = [
79287
79422
  ([...RULE_TEXT], [...COMBINED_ALARM]),
79288
79423
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
79289
79424
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
79290
- ([...RULE_TEXT], [...CONSUMABLE]),
79425
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
79291
79426
  ([...RULE_TEXT], [...TANK]),
79292
79427
  [...RULE_TEXT],
79293
79428
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
package/dist/addon.mjs CHANGED
@@ -5442,7 +5442,7 @@ var ZodIssueCode = {
5442
5442
  var ZodFirstPartyTypeKind;
5443
5443
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5444
5444
  //#endregion
5445
- //#region ../types/dist/sleep-DJFUfKvA.mjs
5445
+ //#region ../types/dist/sleep-CUp20JkO.mjs
5446
5446
  /**
5447
5447
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5448
5448
  * window to float samples (D455).
@@ -8334,7 +8334,11 @@ var ContributionSectionSchema = object({
8334
8334
  literal(4)
8335
8335
  ]).optional(),
8336
8336
  tab: string().optional(),
8337
- location: _enum(["settings", "top-tab"]).optional(),
8337
+ location: _enum([
8338
+ "settings",
8339
+ "top-tab",
8340
+ "hero"
8341
+ ]).optional(),
8338
8342
  order: number().optional(),
8339
8343
  fields: array(any())
8340
8344
  });
@@ -13301,7 +13305,11 @@ var ConfigSectionWithValuesSchema = object({
13301
13305
  literal(4)
13302
13306
  ]).optional(),
13303
13307
  tab: string().optional(),
13304
- location: _enum(["settings", "top-tab"]).optional(),
13308
+ location: _enum([
13309
+ "settings",
13310
+ "top-tab",
13311
+ "hero"
13312
+ ]).optional(),
13305
13313
  order: number().optional(),
13306
13314
  fields: array(any())
13307
13315
  });
@@ -17181,6 +17189,52 @@ var TierStatusSchema = object({
17181
17189
  countedAt: number().nullable()
17182
17190
  });
17183
17191
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
17192
+ /**
17193
+ * Why a series is orphan. `device-gone`: its device is absent from the
17194
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
17195
+ * key is declared by no capability any more (a field a cap removed).
17196
+ */
17197
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
17198
+ /** Rows held per stored tier. */
17199
+ var TierRowsSchema = object({
17200
+ raw: number().int(),
17201
+ "5m": number().int(),
17202
+ "1h": number().int(),
17203
+ "1d": number().int()
17204
+ });
17205
+ var OrphanSeriesSchema = object({
17206
+ seriesId: number().int(),
17207
+ deviceId: number().int(),
17208
+ key: string(),
17209
+ scope: string(),
17210
+ /** The metric's display name; `null` when its metric row is gone too. */
17211
+ displayName: string().nullable(),
17212
+ reason: DeviceHistoryOrphanReasonSchema,
17213
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
17214
+ missingSince: number().nullable(),
17215
+ firstTs: number(),
17216
+ lastTs: number(),
17217
+ rows: TierRowsSchema
17218
+ });
17219
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
17220
+ "not-found",
17221
+ "not-orphan",
17222
+ "failed"
17223
+ ]);
17224
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
17225
+ seriesId: number().int(),
17226
+ ok: literal(true),
17227
+ deleted: TierRowsSchema
17228
+ }), object({
17229
+ seriesId: number().int(),
17230
+ ok: literal(false),
17231
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
17232
+ })]);
17233
+ var OrphanListSchema = object({
17234
+ series: array(OrphanSeriesSchema).readonly(),
17235
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
17236
+ truncated: boolean()
17237
+ });
17184
17238
  var DeviceHistoryStatusSchema = object({
17185
17239
  startedAt: number(),
17186
17240
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -17278,7 +17332,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
17278
17332
  }), object({ enabled: boolean() }), {
17279
17333
  kind: "mutation",
17280
17334
  auth: "admin"
17281
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
17335
+ }), 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() }), {
17336
+ kind: "mutation",
17337
+ auth: "admin"
17338
+ });
17282
17339
  var DeviceCaStatusSchema = discriminatedUnion("state", [
17283
17340
  object({ state: literal("absent") }),
17284
17341
  object({
@@ -50249,6 +50306,19 @@ var NodeInferenceDeviceSchema = object({
50249
50306
  /** Whether the node's live probe reports the device as usable right now. */
50250
50307
  available: boolean(),
50251
50308
  /**
50309
+ * Is the device on the node at all (D919)? `present` — the live probe
50310
+ * reported it; `absent` — the probe ANSWERED and did not report it, so only
50311
+ * its stored settings remain (unplugged, moved to another node): never
50312
+ * eligible, whatever its stored `enabled`, and forgettable with
50313
+ * `forgetInferenceDevice`; `unknown` — the probe did not answer, nothing is
50314
+ * claimed (D315). Optional only for an orchestrator older than the field.
50315
+ */
50316
+ presence: _enum([
50317
+ "present",
50318
+ "absent",
50319
+ "unknown"
50320
+ ]).optional(),
50321
+ /**
50252
50322
  * Whether this device participates in dispatch. AUTO default (spec C2):
50253
50323
  * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
50254
50324
  * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
@@ -50474,7 +50544,13 @@ method(object({
50474
50544
  }), object({ success: literal(true) }), {
50475
50545
  kind: "mutation",
50476
50546
  auth: "admin"
50477
- }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
50547
+ }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({
50548
+ agentNodeId: string(),
50549
+ deviceKey: string()
50550
+ }), object({ success: literal(true) }), {
50551
+ kind: "mutation",
50552
+ auth: "admin"
50553
+ }), method(object({ agentNodeId: string() }), object({
50478
50554
  success: literal(true),
50479
50555
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
50480
50556
  effectiveModelId: string().nullable(),
@@ -55250,17 +55326,69 @@ var connectivityCapability = {
55250
55326
  volatileStateFields: ["lastChangedAt"]
55251
55327
  };
55252
55328
  /**
55253
- * Generic device-consumables capability — surfaces a device's
55254
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
55255
- * descaling cycles, …) with their remaining life and an optional
55256
- * "Replaced" reset action. Device-agnostic: any provider that knows its
55257
- * device tracks consumables can register it; the cap declares no
55258
- * vocabulary of its own — the provider names each item verbatim.
55329
+ * Generic device-consumables capability — the ONE place a device reports what
55330
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
55331
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
55332
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
55333
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
55334
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
55335
+ * its device tracks consumables registers it; the provider names each item
55336
+ * verbatim and says which `kind` it is.
55337
+ *
55338
+ * The admin UI renders it as ONE collapsible section directly under the
55339
+ * device page's hero card (`placement: 'hero'`), for every device bound to
55340
+ * this cap — never drawn by a device type's hero card itself (D915).
55259
55341
  *
55260
55342
  * Like `childLayout`, the cap is INERT until a provider sets items: no
55261
55343
  * provider populates it by guessing (no HA inference). The UI renders a
55262
55344
  * "No consumables reported" placeholder when `items` is empty.
55263
55345
  */
55346
+ /**
55347
+ * What an item IS, which decides which direction is bad:
55348
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
55349
+ * - `supply` — something the device draws from (clean water, detergent,
55350
+ * salt, rinse aid); low or empty is bad.
55351
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
55352
+ * bad.
55353
+ * Absent = `wear`.
55354
+ */
55355
+ var ConsumableKindSchema = _enum([
55356
+ "wear",
55357
+ "supply",
55358
+ "waste"
55359
+ ]);
55360
+ /**
55361
+ * What an item LOOKS like, which decides how a client draws it — independent
55362
+ * of `kind`, which decides which direction is bad:
55363
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
55364
+ * remaining time and a reset.
55365
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
55366
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
55367
+ * a stepped level and "refill".
55368
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
55369
+ * that warns when full.
55370
+ * Absent = derived from the kind ({@link consumableFormOf}).
55371
+ */
55372
+ var ConsumableFormSchema = _enum([
55373
+ "part",
55374
+ "tank",
55375
+ "product",
55376
+ "bin"
55377
+ ]);
55378
+ /** The provider's own discrete verdict on an item. */
55379
+ var ConsumableStatusSchema = _enum([
55380
+ "ok",
55381
+ "low",
55382
+ "empty",
55383
+ "full",
55384
+ "replace"
55385
+ ]);
55386
+ _enum([
55387
+ "ok",
55388
+ "low",
55389
+ "empty",
55390
+ "full"
55391
+ ]);
55264
55392
  /** Units a remaining-life counter is reported in. Closed: the panel renders
55265
55393
  * each. */
55266
55394
  var ConsumableRemainingUnitSchema = _enum([
@@ -55275,18 +55403,23 @@ var ConsumableRemainingSchema = object({
55275
55403
  unit: ConsumableRemainingUnitSchema
55276
55404
  });
55277
55405
  /** A single consumable item. Either a continuous `level` (remaining
55278
- * life %) or a discrete `status` may be known — both may be null when a
55279
- * provider only knows the item exists. `level` and `status` are not
55280
- * mutually exclusive; a provider may report both. */
55406
+ * life %, or fill % for a `supply` / `waste` item) or a discrete `status`
55407
+ * may be known — both may be null when a provider only knows the item
55408
+ * exists. `level` and `status` are not mutually exclusive; a provider may
55409
+ * report both. */
55281
55410
  var ConsumableItemSchema = object({
55282
55411
  /** Stable id, e.g. 'main-brush'. */
55283
55412
  key: string().min(1),
55284
55413
  /** Display name. */
55285
55414
  label: string().min(1),
55286
- /** Remaining life % when known (0..100). */
55415
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
55287
55416
  level: number().min(0).max(100).nullable(),
55288
- /** Discrete state when known (binary mode). */
55289
- status: _enum(["ok", "replace"]).nullable(),
55417
+ /** The provider's discrete verdict when known (binary mode). */
55418
+ status: ConsumableStatusSchema.nullable(),
55419
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
55420
+ kind: ConsumableKindSchema.optional(),
55421
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
55422
+ form: ConsumableFormSchema.optional(),
55290
55423
  /** Ms epoch of the last replace, when known. */
55291
55424
  lastResetAt: number().nullable(),
55292
55425
  /** Whether `reset()` is meaningful for this item. */
@@ -55309,7 +55442,7 @@ var consumablesCapability = {
55309
55442
  kind: "widget",
55310
55443
  widgetId: "host/consumables-panel",
55311
55444
  tab: "consumables",
55312
- topTab: true,
55445
+ placement: "hero",
55313
55446
  label: "Consumables",
55314
55447
  order: 5
55315
55448
  } },
@@ -55370,9 +55503,37 @@ reset: method(object({
55370
55503
  */
55371
55504
  durability: "restored",
55372
55505
  /**
55373
- * History (D850): none — `items` is an array keyed by runtime ids; a history path never enters it.
55506
+ * History (D850, D917): one series per (item field, item `key`) — the item key
55507
+ * is the series scope, the item `label` names it. A vacuum tank's fill, a
55508
+ * brush's remaining life and a dishwasher's salt are each recorded the moment
55509
+ * their provider reports them; an item that appears later gets its series.
55374
55510
  */
55375
- history: "none",
55511
+ history: {
55512
+ fields: {},
55513
+ items: {
55514
+ path: "items",
55515
+ key: "key",
55516
+ label: "label",
55517
+ fields: {
55518
+ level: {
55519
+ kind: "gauge",
55520
+ unit: "%",
55521
+ deadband: 2,
55522
+ displayName: "Level"
55523
+ },
55524
+ status: {
55525
+ kind: "enum",
55526
+ displayName: "Status"
55527
+ },
55528
+ "remaining.value": {
55529
+ kind: "gauge",
55530
+ unitFrom: "remaining.unit",
55531
+ deadband: 1,
55532
+ displayName: "Remaining"
55533
+ }
55534
+ }
55535
+ }
55536
+ },
55376
55537
  /** Clocks, not content: a re-read that changed no item costs no commit. */
55377
55538
  volatileStateFields: ["lastChangedAt", "lastFetchedAt"]
55378
55539
  };
@@ -55787,8 +55948,9 @@ onStatusChanged: { data: object({
55787
55948
  volatileStateFields: ["lastChangedAt"]
55788
55949
  };
55789
55950
  /**
55790
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
55791
- * consumable levels (salt, rinse aid) and common program options.
55951
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
55952
+ * common program options. Salt and rinse aid are NOT here: they are items of
55953
+ * the device's `consumables` cap, like every other device's (D915).
55792
55954
  *
55793
55955
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
55794
55956
  * by any integration that exposes the same program / option surface.
@@ -55836,11 +55998,6 @@ var DishwasherAvailabilitySchema = _enum([
55836
55998
  "offline",
55837
55999
  "description-missing"
55838
56000
  ]);
55839
- var DishwasherConsumableLevelSchema = _enum([
55840
- "ok",
55841
- "low",
55842
- "empty"
55843
- ]);
55844
56001
  var DishwasherStatusSchema = object({
55845
56002
  availability: DishwasherAvailabilitySchema,
55846
56003
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -55873,8 +56030,6 @@ var DishwasherStatusSchema = object({
55873
56030
  powerOn: boolean().nullable(),
55874
56031
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
55875
56032
  powerState: string().nullable(),
55876
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
55877
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55878
56033
  /**
55879
56034
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
55880
56035
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -58750,7 +58905,7 @@ var motionTriggerCapability = {
58750
58905
  enabled: boolean()
58751
58906
  }), _void(), {
58752
58907
  kind: "mutation",
58753
- auth: "admin"
58908
+ auth: "protected"
58754
58909
  }) },
58755
58910
  events: { onMotionTriggerChanged: { data: object({
58756
58911
  deviceId: number(),
@@ -59480,6 +59635,13 @@ var TopologyNodeSchema = object({
59480
59635
  cpuModel: string().nullable(),
59481
59636
  cpuCores: number(),
59482
59637
  memoryMB: number(),
59638
+ /**
59639
+ * The inference RUNTIMES installed on the node (`pythonRuntimes`: onnx,
59640
+ * openvino, edgetpu …) — not its devices. An installed runtime says nothing
59641
+ * about whether its hardware is there (a Coral delegate stays installed
59642
+ * after the stick leaves, D919); the live device set is
59643
+ * `pipelineOrchestrator.getNodeInferenceDevices`.
59644
+ */
59483
59645
  engines: array(string()).readonly(),
59484
59646
  isHub: boolean(),
59485
59647
  isOnline: boolean(),
@@ -60597,7 +60759,28 @@ var ResolvedInferenceConfigSchema = object({
60597
60759
  format: ModelFormatSchema,
60598
60760
  reason: string()
60599
60761
  });
60600
- method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema);
60762
+ /**
60763
+ * The answer of an accelerator rescan (D919): the node's device list after
60764
+ * the re-probe, what changed, and the evidence that decided the Coral answer
60765
+ * (`usbBus` — could the USB bus be read at all; `decidedBy` — USB ids, the PCI
60766
+ * bus, the installed-delegate fallback, or nothing).
60767
+ */
60768
+ var AcceleratorRescanSchema = object({
60769
+ devices: array(InferenceDeviceDescriptorSchema).readonly(),
60770
+ appeared: array(string()).readonly(),
60771
+ disappeared: array(string()).readonly(),
60772
+ usbBus: _enum(["observed", "unobservable"]),
60773
+ decidedBy: _enum([
60774
+ "usb-ids",
60775
+ "pci",
60776
+ "delegate-fallback",
60777
+ "none"
60778
+ ])
60779
+ });
60780
+ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema), method(_void(), AcceleratorRescanSchema, {
60781
+ kind: "mutation",
60782
+ auth: "admin"
60783
+ });
60601
60784
  /**
60602
60785
  * Multi-metric electrical meter. One slice can carry any combination
60603
60786
  * of instantaneous power (W), cumulative energy (kWh), voltage (V),
@@ -64690,60 +64873,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64690
64873
  auth: "admin",
64691
64874
  access: "delete"
64692
64875
  });
64693
- /**
64694
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
64695
- * cleaning lifecycle plus a return-to-base / locate surface and an
64696
- * optional fan-speed selector.
64697
- *
64698
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
64699
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
64700
- * (0..100) is nullable — some vacuums don't report a battery
64701
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
64702
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
64703
- * tokens the hardware accepts so the UI renders only supported choices.
64704
- *
64705
- * The `setFanSpeed` method takes the bare `speed` token — the provider
64706
- * validates it against the vacuum's own list. `locate` triggers the
64707
- * find-me chirp; `returnToBase` sends it home.
64708
- *
64709
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
64710
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
64711
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
64712
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
64713
- * only when the device has no such tank at all, and use a `TankStatus`
64714
- * with both inner fields `null` when the tank exists but its level is
64715
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
64716
- * so the HA provider leaves all four `null`.
64717
- */
64718
- var VacuumStateSchema = _enum([
64719
- "idle",
64720
- "cleaning",
64721
- "paused",
64722
- "returning",
64723
- "docked",
64724
- "drying",
64725
- "error"
64726
- ]);
64727
- /**
64728
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
64729
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
64730
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
64731
- * level is currently unknown; the OWNING field being `null` means the
64732
- * hardware has no such tank at all.
64733
- */
64734
- var TankStatusSchema = object({
64735
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
64736
- level: number().min(0).max(100).nullable(),
64737
- /** Discrete state when the hardware is binary-mode; null otherwise. */
64738
- status: _enum([
64739
- "ok",
64740
- "low",
64741
- "full"
64742
- ]).nullable()
64743
- });
64744
64876
  var VacuumControlStatusSchema = object({
64745
64877
  /** Lifecycle state of the vacuum. */
64746
- state: VacuumStateSchema,
64878
+ state: _enum([
64879
+ "idle",
64880
+ "cleaning",
64881
+ "paused",
64882
+ "returning",
64883
+ "docked",
64884
+ "drying",
64885
+ "error"
64886
+ ]),
64747
64887
  /** 0..100 battery percentage. Null when the device has no battery
64748
64888
  * reading. */
64749
64889
  batteryLevel: number().min(0).max(100).nullable(),
@@ -64752,14 +64892,6 @@ var VacuumControlStatusSchema = object({
64752
64892
  fanSpeed: string().nullable(),
64753
64893
  /** Speed tokens the hardware accepts — drives the UI selector. */
64754
64894
  availableFanSpeeds: array(string()),
64755
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
64756
- cleanWater: TankStatusSchema.nullable(),
64757
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
64758
- dirtyWater: TankStatusSchema.nullable(),
64759
- /** Detergent tank. Null when the hardware has no detergent tank. */
64760
- detergent: TankStatusSchema.nullable(),
64761
- /** Dust bin. Null when the hardware has no dust bin. */
64762
- dustBin: TankStatusSchema.nullable(),
64763
64895
  /** 0..100 cleaning-completion percentage of the current task, or null. */
64764
64896
  progressPercent: number().min(0).max(100).nullable(),
64765
64897
  /** Current error code (0 / null = no error). */
@@ -64821,35 +64953,14 @@ var vacuumControlCapability = {
64821
64953
  */
64822
64954
  durability: "session",
64823
64955
  /**
64824
- * History (D850): recorded series. Tank levels are fixed-object paths (`cleanWater.level`, ...).
64956
+ * History (D850): recorded series. The tanks moved to `consumables` (D915), whose
64957
+ * items are keyed by runtime ids and record no history.
64825
64958
  */
64826
- history: { fields: {
64827
- batteryLevel: {
64828
- kind: "gauge",
64829
- unit: "%",
64830
- deadband: 2
64831
- },
64832
- "cleanWater.level": {
64833
- kind: "gauge",
64834
- unit: "%",
64835
- deadband: 2
64836
- },
64837
- "dirtyWater.level": {
64838
- kind: "gauge",
64839
- unit: "%",
64840
- deadband: 2
64841
- },
64842
- "detergent.level": {
64843
- kind: "gauge",
64844
- unit: "%",
64845
- deadband: 2
64846
- },
64847
- "dustBin.level": {
64848
- kind: "gauge",
64849
- unit: "%",
64850
- deadband: 2
64851
- }
64852
- } }
64959
+ history: { fields: { batteryLevel: {
64960
+ kind: "gauge",
64961
+ unit: "%",
64962
+ deadband: 2
64963
+ } } }
64853
64964
  };
64854
64965
  var ValveStatusSchema = object({
64855
64966
  /** Lifecycle state of the valve. */
@@ -69243,6 +69354,12 @@ Object.freeze({
69243
69354
  addonId: null,
69244
69355
  access: "create"
69245
69356
  },
69357
+ "deviceHistory.deleteOrphanSeries": {
69358
+ capName: "device-history",
69359
+ capScope: "system",
69360
+ addonId: null,
69361
+ access: "delete"
69362
+ },
69246
69363
  "deviceHistory.getDeviceEnabled": {
69247
69364
  capName: "device-history",
69248
69365
  capScope: "system",
@@ -69261,6 +69378,12 @@ Object.freeze({
69261
69378
  addonId: null,
69262
69379
  access: "view"
69263
69380
  },
69381
+ "deviceHistory.listOrphanSeries": {
69382
+ capName: "device-history",
69383
+ capScope: "system",
69384
+ addonId: null,
69385
+ access: "view"
69386
+ },
69264
69387
  "deviceHistory.listSeries": {
69265
69388
  capName: "device-history",
69266
69389
  capScope: "system",
@@ -72885,6 +73008,12 @@ Object.freeze({
72885
73008
  addonId: null,
72886
73009
  access: "delete"
72887
73010
  },
73011
+ "pipelineOrchestrator.forgetInferenceDevice": {
73012
+ capName: "pipeline-orchestrator",
73013
+ capScope: "system",
73014
+ addonId: null,
73015
+ access: "delete"
73016
+ },
72888
73017
  "pipelineOrchestrator.getAgentLoad": {
72889
73018
  capName: "pipeline-orchestrator",
72890
73019
  capScope: "system",
@@ -73461,6 +73590,12 @@ Object.freeze({
73461
73590
  addonId: null,
73462
73591
  access: "view"
73463
73592
  },
73593
+ "platformProbe.rescanAccelerators": {
73594
+ capName: "platform-probe",
73595
+ capScope: "system",
73596
+ addonId: null,
73597
+ access: "create"
73598
+ },
73464
73599
  "platformProbe.resolveHwAccel": {
73465
73600
  capName: "platform-probe",
73466
73601
  capScope: "system",
@@ -79266,7 +79401,7 @@ var STATE_SUMMARY_VARS = [
79266
79401
  ([...RULE_TEXT], [...COMBINED_ALARM]),
79267
79402
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
79268
79403
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
79269
- ([...RULE_TEXT], [...CONSUMABLE]),
79404
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
79270
79405
  ([...RULE_TEXT], [...TANK]),
79271
79406
  [...RULE_TEXT],
79272
79407
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-wyze",
3
- "version": "0.2.155",
3
+ "version": "0.2.157",
4
4
  "description": "Wyze camera device-provider addon for CamStack — wraps the @apocaliss92/wyze-bridge-js P2P/DTLS client, feeding the stream-broker via the pull-rfc4571 lazy-publish path (a structural twin of addon-provider-reolink)",
5
5
  "keywords": [
6
6
  "camstack",