@camstack/addon-provider-rademacher 0.2.143 → 0.2.145

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
@@ -6416,7 +6416,7 @@ var ZodIssueCode = {
6416
6416
  var ZodFirstPartyTypeKind;
6417
6417
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
6418
6418
  //#endregion
6419
- //#region ../types/dist/sleep-DJFUfKvA.mjs
6419
+ //#region ../types/dist/sleep-CUp20JkO.mjs
6420
6420
  /**
6421
6421
  * The audio chunk plane's byte format, and the ONE expansion from a coded
6422
6422
  * window to float samples (D455).
@@ -9308,7 +9308,11 @@ var ContributionSectionSchema = object({
9308
9308
  literal(4)
9309
9309
  ]).optional(),
9310
9310
  tab: string().optional(),
9311
- location: _enum(["settings", "top-tab"]).optional(),
9311
+ location: _enum([
9312
+ "settings",
9313
+ "top-tab",
9314
+ "hero"
9315
+ ]).optional(),
9312
9316
  order: number().optional(),
9313
9317
  fields: array(any())
9314
9318
  });
@@ -14241,7 +14245,11 @@ var ConfigSectionWithValuesSchema = object({
14241
14245
  literal(4)
14242
14246
  ]).optional(),
14243
14247
  tab: string().optional(),
14244
- location: _enum(["settings", "top-tab"]).optional(),
14248
+ location: _enum([
14249
+ "settings",
14250
+ "top-tab",
14251
+ "hero"
14252
+ ]).optional(),
14245
14253
  order: number().optional(),
14246
14254
  fields: array(any())
14247
14255
  });
@@ -18121,6 +18129,52 @@ var TierStatusSchema = object({
18121
18129
  countedAt: number().nullable()
18122
18130
  });
18123
18131
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
18132
+ /**
18133
+ * Why a series is orphan. `device-gone`: its device is absent from the
18134
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
18135
+ * key is declared by no capability any more (a field a cap removed).
18136
+ */
18137
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
18138
+ /** Rows held per stored tier. */
18139
+ var TierRowsSchema = object({
18140
+ raw: number().int(),
18141
+ "5m": number().int(),
18142
+ "1h": number().int(),
18143
+ "1d": number().int()
18144
+ });
18145
+ var OrphanSeriesSchema = object({
18146
+ seriesId: number().int(),
18147
+ deviceId: number().int(),
18148
+ key: string(),
18149
+ scope: string(),
18150
+ /** The metric's display name; `null` when its metric row is gone too. */
18151
+ displayName: string().nullable(),
18152
+ reason: DeviceHistoryOrphanReasonSchema,
18153
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
18154
+ missingSince: number().nullable(),
18155
+ firstTs: number(),
18156
+ lastTs: number(),
18157
+ rows: TierRowsSchema
18158
+ });
18159
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
18160
+ "not-found",
18161
+ "not-orphan",
18162
+ "failed"
18163
+ ]);
18164
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
18165
+ seriesId: number().int(),
18166
+ ok: literal(true),
18167
+ deleted: TierRowsSchema
18168
+ }), object({
18169
+ seriesId: number().int(),
18170
+ ok: literal(false),
18171
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
18172
+ })]);
18173
+ var OrphanListSchema = object({
18174
+ series: array(OrphanSeriesSchema).readonly(),
18175
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
18176
+ truncated: boolean()
18177
+ });
18124
18178
  var DeviceHistoryStatusSchema = object({
18125
18179
  startedAt: number(),
18126
18180
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -18218,7 +18272,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
18218
18272
  }), object({ enabled: boolean() }), {
18219
18273
  kind: "mutation",
18220
18274
  auth: "admin"
18221
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
18275
+ }), 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() }), {
18276
+ kind: "mutation",
18277
+ auth: "admin"
18278
+ });
18222
18279
  var DeviceCaStatusSchema = discriminatedUnion("state", [
18223
18280
  object({ state: literal("absent") }),
18224
18281
  object({
@@ -51285,6 +51342,19 @@ var NodeInferenceDeviceSchema = object({
51285
51342
  /** Whether the node's live probe reports the device as usable right now. */
51286
51343
  available: boolean(),
51287
51344
  /**
51345
+ * Is the device on the node at all (D919)? `present` — the live probe
51346
+ * reported it; `absent` — the probe ANSWERED and did not report it, so only
51347
+ * its stored settings remain (unplugged, moved to another node): never
51348
+ * eligible, whatever its stored `enabled`, and forgettable with
51349
+ * `forgetInferenceDevice`; `unknown` — the probe did not answer, nothing is
51350
+ * claimed (D315). Optional only for an orchestrator older than the field.
51351
+ */
51352
+ presence: _enum([
51353
+ "present",
51354
+ "absent",
51355
+ "unknown"
51356
+ ]).optional(),
51357
+ /**
51288
51358
  * Whether this device participates in dispatch. AUTO default (spec C2):
51289
51359
  * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
51290
51360
  * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
@@ -51510,7 +51580,13 @@ method(object({
51510
51580
  }), object({ success: literal(true) }), {
51511
51581
  kind: "mutation",
51512
51582
  auth: "admin"
51513
- }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
51583
+ }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({
51584
+ agentNodeId: string(),
51585
+ deviceKey: string()
51586
+ }), object({ success: literal(true) }), {
51587
+ kind: "mutation",
51588
+ auth: "admin"
51589
+ }), method(object({ agentNodeId: string() }), object({
51514
51590
  success: literal(true),
51515
51591
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
51516
51592
  effectiveModelId: string().nullable(),
@@ -56174,17 +56250,69 @@ var connectivityCapability = {
56174
56250
  volatileStateFields: ["lastChangedAt"]
56175
56251
  };
56176
56252
  /**
56177
- * Generic device-consumables capability — surfaces a device's
56178
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
56179
- * descaling cycles, …) with their remaining life and an optional
56180
- * "Replaced" reset action. Device-agnostic: any provider that knows its
56181
- * device tracks consumables can register it; the cap declares no
56182
- * vocabulary of its own — the provider names each item verbatim.
56253
+ * Generic device-consumables capability — the ONE place a device reports what
56254
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
56255
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
56256
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
56257
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
56258
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
56259
+ * its device tracks consumables registers it; the provider names each item
56260
+ * verbatim and says which `kind` it is.
56261
+ *
56262
+ * The admin UI renders it as ONE collapsible section directly under the
56263
+ * device page's hero card (`placement: 'hero'`), for every device bound to
56264
+ * this cap — never drawn by a device type's hero card itself (D915).
56183
56265
  *
56184
56266
  * Like `childLayout`, the cap is INERT until a provider sets items: no
56185
56267
  * provider populates it by guessing (no HA inference). The UI renders a
56186
56268
  * "No consumables reported" placeholder when `items` is empty.
56187
56269
  */
56270
+ /**
56271
+ * What an item IS, which decides which direction is bad:
56272
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
56273
+ * - `supply` — something the device draws from (clean water, detergent,
56274
+ * salt, rinse aid); low or empty is bad.
56275
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
56276
+ * bad.
56277
+ * Absent = `wear`.
56278
+ */
56279
+ var ConsumableKindSchema = _enum([
56280
+ "wear",
56281
+ "supply",
56282
+ "waste"
56283
+ ]);
56284
+ /**
56285
+ * What an item LOOKS like, which decides how a client draws it — independent
56286
+ * of `kind`, which decides which direction is bad:
56287
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
56288
+ * remaining time and a reset.
56289
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
56290
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
56291
+ * a stepped level and "refill".
56292
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
56293
+ * that warns when full.
56294
+ * Absent = derived from the kind ({@link consumableFormOf}).
56295
+ */
56296
+ var ConsumableFormSchema = _enum([
56297
+ "part",
56298
+ "tank",
56299
+ "product",
56300
+ "bin"
56301
+ ]);
56302
+ /** The provider's own discrete verdict on an item. */
56303
+ var ConsumableStatusSchema = _enum([
56304
+ "ok",
56305
+ "low",
56306
+ "empty",
56307
+ "full",
56308
+ "replace"
56309
+ ]);
56310
+ _enum([
56311
+ "ok",
56312
+ "low",
56313
+ "empty",
56314
+ "full"
56315
+ ]);
56188
56316
  /** Units a remaining-life counter is reported in. Closed: the panel renders
56189
56317
  * each. */
56190
56318
  var ConsumableRemainingUnitSchema = _enum([
@@ -56199,18 +56327,23 @@ var ConsumableRemainingSchema = object({
56199
56327
  unit: ConsumableRemainingUnitSchema
56200
56328
  });
56201
56329
  /** A single consumable item. Either a continuous `level` (remaining
56202
- * life %) or a discrete `status` may be known — both may be null when a
56203
- * provider only knows the item exists. `level` and `status` are not
56204
- * mutually exclusive; a provider may report both. */
56330
+ * life %, or fill % for a `supply` / `waste` item) or a discrete `status`
56331
+ * may be known — both may be null when a provider only knows the item
56332
+ * exists. `level` and `status` are not mutually exclusive; a provider may
56333
+ * report both. */
56205
56334
  var ConsumableItemSchema = object({
56206
56335
  /** Stable id, e.g. 'main-brush'. */
56207
56336
  key: string().min(1),
56208
56337
  /** Display name. */
56209
56338
  label: string().min(1),
56210
- /** Remaining life % when known (0..100). */
56339
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
56211
56340
  level: number().min(0).max(100).nullable(),
56212
- /** Discrete state when known (binary mode). */
56213
- status: _enum(["ok", "replace"]).nullable(),
56341
+ /** The provider's discrete verdict when known (binary mode). */
56342
+ status: ConsumableStatusSchema.nullable(),
56343
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
56344
+ kind: ConsumableKindSchema.optional(),
56345
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
56346
+ form: ConsumableFormSchema.optional(),
56214
56347
  /** Ms epoch of the last replace, when known. */
56215
56348
  lastResetAt: number().nullable(),
56216
56349
  /** Whether `reset()` is meaningful for this item. */
@@ -56233,7 +56366,7 @@ var consumablesCapability = {
56233
56366
  kind: "widget",
56234
56367
  widgetId: "host/consumables-panel",
56235
56368
  tab: "consumables",
56236
- topTab: true,
56369
+ placement: "hero",
56237
56370
  label: "Consumables",
56238
56371
  order: 5
56239
56372
  } },
@@ -56294,9 +56427,37 @@ reset: method(object({
56294
56427
  */
56295
56428
  durability: "restored",
56296
56429
  /**
56297
- * History (D850): none — `items` is an array keyed by runtime ids; a history path never enters it.
56430
+ * History (D850, D917): one series per (item field, item `key`) — the item key
56431
+ * is the series scope, the item `label` names it. A vacuum tank's fill, a
56432
+ * brush's remaining life and a dishwasher's salt are each recorded the moment
56433
+ * their provider reports them; an item that appears later gets its series.
56298
56434
  */
56299
- history: "none",
56435
+ history: {
56436
+ fields: {},
56437
+ items: {
56438
+ path: "items",
56439
+ key: "key",
56440
+ label: "label",
56441
+ fields: {
56442
+ level: {
56443
+ kind: "gauge",
56444
+ unit: "%",
56445
+ deadband: 2,
56446
+ displayName: "Level"
56447
+ },
56448
+ status: {
56449
+ kind: "enum",
56450
+ displayName: "Status"
56451
+ },
56452
+ "remaining.value": {
56453
+ kind: "gauge",
56454
+ unitFrom: "remaining.unit",
56455
+ deadband: 1,
56456
+ displayName: "Remaining"
56457
+ }
56458
+ }
56459
+ }
56460
+ },
56300
56461
  /** Clocks, not content: a re-read that changed no item costs no commit. */
56301
56462
  volatileStateFields: ["lastChangedAt", "lastFetchedAt"]
56302
56463
  };
@@ -56711,8 +56872,9 @@ onStatusChanged: { data: object({
56711
56872
  volatileStateFields: ["lastChangedAt"]
56712
56873
  };
56713
56874
  /**
56714
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
56715
- * consumable levels (salt, rinse aid) and common program options.
56875
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
56876
+ * common program options. Salt and rinse aid are NOT here: they are items of
56877
+ * the device's `consumables` cap, like every other device's (D915).
56716
56878
  *
56717
56879
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
56718
56880
  * by any integration that exposes the same program / option surface.
@@ -56760,11 +56922,6 @@ var DishwasherAvailabilitySchema = _enum([
56760
56922
  "offline",
56761
56923
  "description-missing"
56762
56924
  ]);
56763
- var DishwasherConsumableLevelSchema = _enum([
56764
- "ok",
56765
- "low",
56766
- "empty"
56767
- ]);
56768
56925
  var DishwasherStatusSchema = object({
56769
56926
  availability: DishwasherAvailabilitySchema,
56770
56927
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -56797,8 +56954,6 @@ var DishwasherStatusSchema = object({
56797
56954
  powerOn: boolean().nullable(),
56798
56955
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
56799
56956
  powerState: string().nullable(),
56800
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
56801
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56802
56957
  /**
56803
56958
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
56804
56959
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -59674,7 +59829,7 @@ var motionTriggerCapability = {
59674
59829
  enabled: boolean()
59675
59830
  }), _void(), {
59676
59831
  kind: "mutation",
59677
- auth: "admin"
59832
+ auth: "protected"
59678
59833
  }) },
59679
59834
  events: { onMotionTriggerChanged: { data: object({
59680
59835
  deviceId: number(),
@@ -60404,6 +60559,13 @@ var TopologyNodeSchema = object({
60404
60559
  cpuModel: string().nullable(),
60405
60560
  cpuCores: number(),
60406
60561
  memoryMB: number(),
60562
+ /**
60563
+ * The inference RUNTIMES installed on the node (`pythonRuntimes`: onnx,
60564
+ * openvino, edgetpu …) — not its devices. An installed runtime says nothing
60565
+ * about whether its hardware is there (a Coral delegate stays installed
60566
+ * after the stick leaves, D919); the live device set is
60567
+ * `pipelineOrchestrator.getNodeInferenceDevices`.
60568
+ */
60407
60569
  engines: array(string()).readonly(),
60408
60570
  isHub: boolean(),
60409
60571
  isOnline: boolean(),
@@ -61521,7 +61683,28 @@ var ResolvedInferenceConfigSchema = object({
61521
61683
  format: ModelFormatSchema,
61522
61684
  reason: string()
61523
61685
  });
61524
- method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema);
61686
+ /**
61687
+ * The answer of an accelerator rescan (D919): the node's device list after
61688
+ * the re-probe, what changed, and the evidence that decided the Coral answer
61689
+ * (`usbBus` — could the USB bus be read at all; `decidedBy` — USB ids, the PCI
61690
+ * bus, the installed-delegate fallback, or nothing).
61691
+ */
61692
+ var AcceleratorRescanSchema = object({
61693
+ devices: array(InferenceDeviceDescriptorSchema).readonly(),
61694
+ appeared: array(string()).readonly(),
61695
+ disappeared: array(string()).readonly(),
61696
+ usbBus: _enum(["observed", "unobservable"]),
61697
+ decidedBy: _enum([
61698
+ "usb-ids",
61699
+ "pci",
61700
+ "delegate-fallback",
61701
+ "none"
61702
+ ])
61703
+ });
61704
+ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema), method(_void(), AcceleratorRescanSchema, {
61705
+ kind: "mutation",
61706
+ auth: "admin"
61707
+ });
61525
61708
  /**
61526
61709
  * Multi-metric electrical meter. One slice can carry any combination
61527
61710
  * of instantaneous power (W), cumulative energy (kWh), voltage (V),
@@ -65614,60 +65797,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
65614
65797
  auth: "admin",
65615
65798
  access: "delete"
65616
65799
  });
65617
- /**
65618
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
65619
- * cleaning lifecycle plus a return-to-base / locate surface and an
65620
- * optional fan-speed selector.
65621
- *
65622
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
65623
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
65624
- * (0..100) is nullable — some vacuums don't report a battery
65625
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
65626
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
65627
- * tokens the hardware accepts so the UI renders only supported choices.
65628
- *
65629
- * The `setFanSpeed` method takes the bare `speed` token — the provider
65630
- * validates it against the vacuum's own list. `locate` triggers the
65631
- * find-me chirp; `returnToBase` sends it home.
65632
- *
65633
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
65634
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
65635
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
65636
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
65637
- * only when the device has no such tank at all, and use a `TankStatus`
65638
- * with both inner fields `null` when the tank exists but its level is
65639
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
65640
- * so the HA provider leaves all four `null`.
65641
- */
65642
- var VacuumStateSchema = _enum([
65643
- "idle",
65644
- "cleaning",
65645
- "paused",
65646
- "returning",
65647
- "docked",
65648
- "drying",
65649
- "error"
65650
- ]);
65651
- /**
65652
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
65653
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
65654
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
65655
- * level is currently unknown; the OWNING field being `null` means the
65656
- * hardware has no such tank at all.
65657
- */
65658
- var TankStatusSchema = object({
65659
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
65660
- level: number().min(0).max(100).nullable(),
65661
- /** Discrete state when the hardware is binary-mode; null otherwise. */
65662
- status: _enum([
65663
- "ok",
65664
- "low",
65665
- "full"
65666
- ]).nullable()
65667
- });
65668
65800
  var VacuumControlStatusSchema = object({
65669
65801
  /** Lifecycle state of the vacuum. */
65670
- state: VacuumStateSchema,
65802
+ state: _enum([
65803
+ "idle",
65804
+ "cleaning",
65805
+ "paused",
65806
+ "returning",
65807
+ "docked",
65808
+ "drying",
65809
+ "error"
65810
+ ]),
65671
65811
  /** 0..100 battery percentage. Null when the device has no battery
65672
65812
  * reading. */
65673
65813
  batteryLevel: number().min(0).max(100).nullable(),
@@ -65676,14 +65816,6 @@ var VacuumControlStatusSchema = object({
65676
65816
  fanSpeed: string().nullable(),
65677
65817
  /** Speed tokens the hardware accepts — drives the UI selector. */
65678
65818
  availableFanSpeeds: array(string()),
65679
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
65680
- cleanWater: TankStatusSchema.nullable(),
65681
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
65682
- dirtyWater: TankStatusSchema.nullable(),
65683
- /** Detergent tank. Null when the hardware has no detergent tank. */
65684
- detergent: TankStatusSchema.nullable(),
65685
- /** Dust bin. Null when the hardware has no dust bin. */
65686
- dustBin: TankStatusSchema.nullable(),
65687
65819
  /** 0..100 cleaning-completion percentage of the current task, or null. */
65688
65820
  progressPercent: number().min(0).max(100).nullable(),
65689
65821
  /** Current error code (0 / null = no error). */
@@ -65745,35 +65877,14 @@ var vacuumControlCapability = {
65745
65877
  */
65746
65878
  durability: "session",
65747
65879
  /**
65748
- * History (D850): recorded series. Tank levels are fixed-object paths (`cleanWater.level`, ...).
65880
+ * History (D850): recorded series. The tanks moved to `consumables` (D915), whose
65881
+ * items are keyed by runtime ids and record no history.
65749
65882
  */
65750
- history: { fields: {
65751
- batteryLevel: {
65752
- kind: "gauge",
65753
- unit: "%",
65754
- deadband: 2
65755
- },
65756
- "cleanWater.level": {
65757
- kind: "gauge",
65758
- unit: "%",
65759
- deadband: 2
65760
- },
65761
- "dirtyWater.level": {
65762
- kind: "gauge",
65763
- unit: "%",
65764
- deadband: 2
65765
- },
65766
- "detergent.level": {
65767
- kind: "gauge",
65768
- unit: "%",
65769
- deadband: 2
65770
- },
65771
- "dustBin.level": {
65772
- kind: "gauge",
65773
- unit: "%",
65774
- deadband: 2
65775
- }
65776
- } }
65883
+ history: { fields: { batteryLevel: {
65884
+ kind: "gauge",
65885
+ unit: "%",
65886
+ deadband: 2
65887
+ } } }
65777
65888
  };
65778
65889
  var ValveStatusSchema = object({
65779
65890
  /** Lifecycle state of the valve. */
@@ -70167,6 +70278,12 @@ Object.freeze({
70167
70278
  addonId: null,
70168
70279
  access: "create"
70169
70280
  },
70281
+ "deviceHistory.deleteOrphanSeries": {
70282
+ capName: "device-history",
70283
+ capScope: "system",
70284
+ addonId: null,
70285
+ access: "delete"
70286
+ },
70170
70287
  "deviceHistory.getDeviceEnabled": {
70171
70288
  capName: "device-history",
70172
70289
  capScope: "system",
@@ -70185,6 +70302,12 @@ Object.freeze({
70185
70302
  addonId: null,
70186
70303
  access: "view"
70187
70304
  },
70305
+ "deviceHistory.listOrphanSeries": {
70306
+ capName: "device-history",
70307
+ capScope: "system",
70308
+ addonId: null,
70309
+ access: "view"
70310
+ },
70188
70311
  "deviceHistory.listSeries": {
70189
70312
  capName: "device-history",
70190
70313
  capScope: "system",
@@ -73809,6 +73932,12 @@ Object.freeze({
73809
73932
  addonId: null,
73810
73933
  access: "delete"
73811
73934
  },
73935
+ "pipelineOrchestrator.forgetInferenceDevice": {
73936
+ capName: "pipeline-orchestrator",
73937
+ capScope: "system",
73938
+ addonId: null,
73939
+ access: "delete"
73940
+ },
73812
73941
  "pipelineOrchestrator.getAgentLoad": {
73813
73942
  capName: "pipeline-orchestrator",
73814
73943
  capScope: "system",
@@ -74385,6 +74514,12 @@ Object.freeze({
74385
74514
  addonId: null,
74386
74515
  access: "view"
74387
74516
  },
74517
+ "platformProbe.rescanAccelerators": {
74518
+ capName: "platform-probe",
74519
+ capScope: "system",
74520
+ addonId: null,
74521
+ access: "create"
74522
+ },
74388
74523
  "platformProbe.resolveHwAccel": {
74389
74524
  capName: "platform-probe",
74390
74525
  capScope: "system",
@@ -80190,7 +80325,7 @@ var STATE_SUMMARY_VARS = [
80190
80325
  ([...RULE_TEXT], [...COMBINED_ALARM]),
80191
80326
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
80192
80327
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
80193
- ([...RULE_TEXT], [...CONSUMABLE]),
80328
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
80194
80329
  ([...RULE_TEXT], [...TANK]),
80195
80330
  [...RULE_TEXT],
80196
80331
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
package/dist/addon.mjs CHANGED
@@ -6415,7 +6415,7 @@ var ZodIssueCode = {
6415
6415
  var ZodFirstPartyTypeKind;
6416
6416
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
6417
6417
  //#endregion
6418
- //#region ../types/dist/sleep-DJFUfKvA.mjs
6418
+ //#region ../types/dist/sleep-CUp20JkO.mjs
6419
6419
  /**
6420
6420
  * The audio chunk plane's byte format, and the ONE expansion from a coded
6421
6421
  * window to float samples (D455).
@@ -9307,7 +9307,11 @@ var ContributionSectionSchema = object({
9307
9307
  literal(4)
9308
9308
  ]).optional(),
9309
9309
  tab: string().optional(),
9310
- location: _enum(["settings", "top-tab"]).optional(),
9310
+ location: _enum([
9311
+ "settings",
9312
+ "top-tab",
9313
+ "hero"
9314
+ ]).optional(),
9311
9315
  order: number().optional(),
9312
9316
  fields: array(any())
9313
9317
  });
@@ -14240,7 +14244,11 @@ var ConfigSectionWithValuesSchema = object({
14240
14244
  literal(4)
14241
14245
  ]).optional(),
14242
14246
  tab: string().optional(),
14243
- location: _enum(["settings", "top-tab"]).optional(),
14247
+ location: _enum([
14248
+ "settings",
14249
+ "top-tab",
14250
+ "hero"
14251
+ ]).optional(),
14244
14252
  order: number().optional(),
14245
14253
  fields: array(any())
14246
14254
  });
@@ -18120,6 +18128,52 @@ var TierStatusSchema = object({
18120
18128
  countedAt: number().nullable()
18121
18129
  });
18122
18130
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
18131
+ /**
18132
+ * Why a series is orphan. `device-gone`: its device is absent from the
18133
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
18134
+ * key is declared by no capability any more (a field a cap removed).
18135
+ */
18136
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
18137
+ /** Rows held per stored tier. */
18138
+ var TierRowsSchema = object({
18139
+ raw: number().int(),
18140
+ "5m": number().int(),
18141
+ "1h": number().int(),
18142
+ "1d": number().int()
18143
+ });
18144
+ var OrphanSeriesSchema = object({
18145
+ seriesId: number().int(),
18146
+ deviceId: number().int(),
18147
+ key: string(),
18148
+ scope: string(),
18149
+ /** The metric's display name; `null` when its metric row is gone too. */
18150
+ displayName: string().nullable(),
18151
+ reason: DeviceHistoryOrphanReasonSchema,
18152
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
18153
+ missingSince: number().nullable(),
18154
+ firstTs: number(),
18155
+ lastTs: number(),
18156
+ rows: TierRowsSchema
18157
+ });
18158
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
18159
+ "not-found",
18160
+ "not-orphan",
18161
+ "failed"
18162
+ ]);
18163
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
18164
+ seriesId: number().int(),
18165
+ ok: literal(true),
18166
+ deleted: TierRowsSchema
18167
+ }), object({
18168
+ seriesId: number().int(),
18169
+ ok: literal(false),
18170
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
18171
+ })]);
18172
+ var OrphanListSchema = object({
18173
+ series: array(OrphanSeriesSchema).readonly(),
18174
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
18175
+ truncated: boolean()
18176
+ });
18123
18177
  var DeviceHistoryStatusSchema = object({
18124
18178
  startedAt: number(),
18125
18179
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -18217,7 +18271,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
18217
18271
  }), object({ enabled: boolean() }), {
18218
18272
  kind: "mutation",
18219
18273
  auth: "admin"
18220
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
18274
+ }), 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() }), {
18275
+ kind: "mutation",
18276
+ auth: "admin"
18277
+ });
18221
18278
  var DeviceCaStatusSchema = discriminatedUnion("state", [
18222
18279
  object({ state: literal("absent") }),
18223
18280
  object({
@@ -51284,6 +51341,19 @@ var NodeInferenceDeviceSchema = object({
51284
51341
  /** Whether the node's live probe reports the device as usable right now. */
51285
51342
  available: boolean(),
51286
51343
  /**
51344
+ * Is the device on the node at all (D919)? `present` — the live probe
51345
+ * reported it; `absent` — the probe ANSWERED and did not report it, so only
51346
+ * its stored settings remain (unplugged, moved to another node): never
51347
+ * eligible, whatever its stored `enabled`, and forgettable with
51348
+ * `forgetInferenceDevice`; `unknown` — the probe did not answer, nothing is
51349
+ * claimed (D315). Optional only for an orchestrator older than the field.
51350
+ */
51351
+ presence: _enum([
51352
+ "present",
51353
+ "absent",
51354
+ "unknown"
51355
+ ]).optional(),
51356
+ /**
51287
51357
  * Whether this device participates in dispatch. AUTO default (spec C2):
51288
51358
  * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
51289
51359
  * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
@@ -51509,7 +51579,13 @@ method(object({
51509
51579
  }), object({ success: literal(true) }), {
51510
51580
  kind: "mutation",
51511
51581
  auth: "admin"
51512
- }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
51582
+ }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({
51583
+ agentNodeId: string(),
51584
+ deviceKey: string()
51585
+ }), object({ success: literal(true) }), {
51586
+ kind: "mutation",
51587
+ auth: "admin"
51588
+ }), method(object({ agentNodeId: string() }), object({
51513
51589
  success: literal(true),
51514
51590
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
51515
51591
  effectiveModelId: string().nullable(),
@@ -56173,17 +56249,69 @@ var connectivityCapability = {
56173
56249
  volatileStateFields: ["lastChangedAt"]
56174
56250
  };
56175
56251
  /**
56176
- * Generic device-consumables capability — surfaces a device's
56177
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
56178
- * descaling cycles, …) with their remaining life and an optional
56179
- * "Replaced" reset action. Device-agnostic: any provider that knows its
56180
- * device tracks consumables can register it; the cap declares no
56181
- * vocabulary of its own — the provider names each item verbatim.
56252
+ * Generic device-consumables capability — the ONE place a device reports what
56253
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
56254
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
56255
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
56256
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
56257
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
56258
+ * its device tracks consumables registers it; the provider names each item
56259
+ * verbatim and says which `kind` it is.
56260
+ *
56261
+ * The admin UI renders it as ONE collapsible section directly under the
56262
+ * device page's hero card (`placement: 'hero'`), for every device bound to
56263
+ * this cap — never drawn by a device type's hero card itself (D915).
56182
56264
  *
56183
56265
  * Like `childLayout`, the cap is INERT until a provider sets items: no
56184
56266
  * provider populates it by guessing (no HA inference). The UI renders a
56185
56267
  * "No consumables reported" placeholder when `items` is empty.
56186
56268
  */
56269
+ /**
56270
+ * What an item IS, which decides which direction is bad:
56271
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
56272
+ * - `supply` — something the device draws from (clean water, detergent,
56273
+ * salt, rinse aid); low or empty is bad.
56274
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
56275
+ * bad.
56276
+ * Absent = `wear`.
56277
+ */
56278
+ var ConsumableKindSchema = _enum([
56279
+ "wear",
56280
+ "supply",
56281
+ "waste"
56282
+ ]);
56283
+ /**
56284
+ * What an item LOOKS like, which decides how a client draws it — independent
56285
+ * of `kind`, which decides which direction is bad:
56286
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
56287
+ * remaining time and a reset.
56288
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
56289
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
56290
+ * a stepped level and "refill".
56291
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
56292
+ * that warns when full.
56293
+ * Absent = derived from the kind ({@link consumableFormOf}).
56294
+ */
56295
+ var ConsumableFormSchema = _enum([
56296
+ "part",
56297
+ "tank",
56298
+ "product",
56299
+ "bin"
56300
+ ]);
56301
+ /** The provider's own discrete verdict on an item. */
56302
+ var ConsumableStatusSchema = _enum([
56303
+ "ok",
56304
+ "low",
56305
+ "empty",
56306
+ "full",
56307
+ "replace"
56308
+ ]);
56309
+ _enum([
56310
+ "ok",
56311
+ "low",
56312
+ "empty",
56313
+ "full"
56314
+ ]);
56187
56315
  /** Units a remaining-life counter is reported in. Closed: the panel renders
56188
56316
  * each. */
56189
56317
  var ConsumableRemainingUnitSchema = _enum([
@@ -56198,18 +56326,23 @@ var ConsumableRemainingSchema = object({
56198
56326
  unit: ConsumableRemainingUnitSchema
56199
56327
  });
56200
56328
  /** A single consumable item. Either a continuous `level` (remaining
56201
- * life %) or a discrete `status` may be known — both may be null when a
56202
- * provider only knows the item exists. `level` and `status` are not
56203
- * mutually exclusive; a provider may report both. */
56329
+ * life %, or fill % for a `supply` / `waste` item) or a discrete `status`
56330
+ * may be known — both may be null when a provider only knows the item
56331
+ * exists. `level` and `status` are not mutually exclusive; a provider may
56332
+ * report both. */
56204
56333
  var ConsumableItemSchema = object({
56205
56334
  /** Stable id, e.g. 'main-brush'. */
56206
56335
  key: string().min(1),
56207
56336
  /** Display name. */
56208
56337
  label: string().min(1),
56209
- /** Remaining life % when known (0..100). */
56338
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
56210
56339
  level: number().min(0).max(100).nullable(),
56211
- /** Discrete state when known (binary mode). */
56212
- status: _enum(["ok", "replace"]).nullable(),
56340
+ /** The provider's discrete verdict when known (binary mode). */
56341
+ status: ConsumableStatusSchema.nullable(),
56342
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
56343
+ kind: ConsumableKindSchema.optional(),
56344
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
56345
+ form: ConsumableFormSchema.optional(),
56213
56346
  /** Ms epoch of the last replace, when known. */
56214
56347
  lastResetAt: number().nullable(),
56215
56348
  /** Whether `reset()` is meaningful for this item. */
@@ -56232,7 +56365,7 @@ var consumablesCapability = {
56232
56365
  kind: "widget",
56233
56366
  widgetId: "host/consumables-panel",
56234
56367
  tab: "consumables",
56235
- topTab: true,
56368
+ placement: "hero",
56236
56369
  label: "Consumables",
56237
56370
  order: 5
56238
56371
  } },
@@ -56293,9 +56426,37 @@ reset: method(object({
56293
56426
  */
56294
56427
  durability: "restored",
56295
56428
  /**
56296
- * History (D850): none — `items` is an array keyed by runtime ids; a history path never enters it.
56429
+ * History (D850, D917): one series per (item field, item `key`) — the item key
56430
+ * is the series scope, the item `label` names it. A vacuum tank's fill, a
56431
+ * brush's remaining life and a dishwasher's salt are each recorded the moment
56432
+ * their provider reports them; an item that appears later gets its series.
56297
56433
  */
56298
- history: "none",
56434
+ history: {
56435
+ fields: {},
56436
+ items: {
56437
+ path: "items",
56438
+ key: "key",
56439
+ label: "label",
56440
+ fields: {
56441
+ level: {
56442
+ kind: "gauge",
56443
+ unit: "%",
56444
+ deadband: 2,
56445
+ displayName: "Level"
56446
+ },
56447
+ status: {
56448
+ kind: "enum",
56449
+ displayName: "Status"
56450
+ },
56451
+ "remaining.value": {
56452
+ kind: "gauge",
56453
+ unitFrom: "remaining.unit",
56454
+ deadband: 1,
56455
+ displayName: "Remaining"
56456
+ }
56457
+ }
56458
+ }
56459
+ },
56299
56460
  /** Clocks, not content: a re-read that changed no item costs no commit. */
56300
56461
  volatileStateFields: ["lastChangedAt", "lastFetchedAt"]
56301
56462
  };
@@ -56710,8 +56871,9 @@ onStatusChanged: { data: object({
56710
56871
  volatileStateFields: ["lastChangedAt"]
56711
56872
  };
56712
56873
  /**
56713
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
56714
- * consumable levels (salt, rinse aid) and common program options.
56874
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
56875
+ * common program options. Salt and rinse aid are NOT here: they are items of
56876
+ * the device's `consumables` cap, like every other device's (D915).
56715
56877
  *
56716
56878
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
56717
56879
  * by any integration that exposes the same program / option surface.
@@ -56759,11 +56921,6 @@ var DishwasherAvailabilitySchema = _enum([
56759
56921
  "offline",
56760
56922
  "description-missing"
56761
56923
  ]);
56762
- var DishwasherConsumableLevelSchema = _enum([
56763
- "ok",
56764
- "low",
56765
- "empty"
56766
- ]);
56767
56924
  var DishwasherStatusSchema = object({
56768
56925
  availability: DishwasherAvailabilitySchema,
56769
56926
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -56796,8 +56953,6 @@ var DishwasherStatusSchema = object({
56796
56953
  powerOn: boolean().nullable(),
56797
56954
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
56798
56955
  powerState: string().nullable(),
56799
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
56800
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56801
56956
  /**
56802
56957
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
56803
56958
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -59673,7 +59828,7 @@ var motionTriggerCapability = {
59673
59828
  enabled: boolean()
59674
59829
  }), _void(), {
59675
59830
  kind: "mutation",
59676
- auth: "admin"
59831
+ auth: "protected"
59677
59832
  }) },
59678
59833
  events: { onMotionTriggerChanged: { data: object({
59679
59834
  deviceId: number(),
@@ -60403,6 +60558,13 @@ var TopologyNodeSchema = object({
60403
60558
  cpuModel: string().nullable(),
60404
60559
  cpuCores: number(),
60405
60560
  memoryMB: number(),
60561
+ /**
60562
+ * The inference RUNTIMES installed on the node (`pythonRuntimes`: onnx,
60563
+ * openvino, edgetpu …) — not its devices. An installed runtime says nothing
60564
+ * about whether its hardware is there (a Coral delegate stays installed
60565
+ * after the stick leaves, D919); the live device set is
60566
+ * `pipelineOrchestrator.getNodeInferenceDevices`.
60567
+ */
60406
60568
  engines: array(string()).readonly(),
60407
60569
  isHub: boolean(),
60408
60570
  isOnline: boolean(),
@@ -61520,7 +61682,28 @@ var ResolvedInferenceConfigSchema = object({
61520
61682
  format: ModelFormatSchema,
61521
61683
  reason: string()
61522
61684
  });
61523
- method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema);
61685
+ /**
61686
+ * The answer of an accelerator rescan (D919): the node's device list after
61687
+ * the re-probe, what changed, and the evidence that decided the Coral answer
61688
+ * (`usbBus` — could the USB bus be read at all; `decidedBy` — USB ids, the PCI
61689
+ * bus, the installed-delegate fallback, or nothing).
61690
+ */
61691
+ var AcceleratorRescanSchema = object({
61692
+ devices: array(InferenceDeviceDescriptorSchema).readonly(),
61693
+ appeared: array(string()).readonly(),
61694
+ disappeared: array(string()).readonly(),
61695
+ usbBus: _enum(["observed", "unobservable"]),
61696
+ decidedBy: _enum([
61697
+ "usb-ids",
61698
+ "pci",
61699
+ "delegate-fallback",
61700
+ "none"
61701
+ ])
61702
+ });
61703
+ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema), method(_void(), AcceleratorRescanSchema, {
61704
+ kind: "mutation",
61705
+ auth: "admin"
61706
+ });
61524
61707
  /**
61525
61708
  * Multi-metric electrical meter. One slice can carry any combination
61526
61709
  * of instantaneous power (W), cumulative energy (kWh), voltage (V),
@@ -65613,60 +65796,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
65613
65796
  auth: "admin",
65614
65797
  access: "delete"
65615
65798
  });
65616
- /**
65617
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
65618
- * cleaning lifecycle plus a return-to-base / locate surface and an
65619
- * optional fan-speed selector.
65620
- *
65621
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
65622
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
65623
- * (0..100) is nullable — some vacuums don't report a battery
65624
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
65625
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
65626
- * tokens the hardware accepts so the UI renders only supported choices.
65627
- *
65628
- * The `setFanSpeed` method takes the bare `speed` token — the provider
65629
- * validates it against the vacuum's own list. `locate` triggers the
65630
- * find-me chirp; `returnToBase` sends it home.
65631
- *
65632
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
65633
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
65634
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
65635
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
65636
- * only when the device has no such tank at all, and use a `TankStatus`
65637
- * with both inner fields `null` when the tank exists but its level is
65638
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
65639
- * so the HA provider leaves all four `null`.
65640
- */
65641
- var VacuumStateSchema = _enum([
65642
- "idle",
65643
- "cleaning",
65644
- "paused",
65645
- "returning",
65646
- "docked",
65647
- "drying",
65648
- "error"
65649
- ]);
65650
- /**
65651
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
65652
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
65653
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
65654
- * level is currently unknown; the OWNING field being `null` means the
65655
- * hardware has no such tank at all.
65656
- */
65657
- var TankStatusSchema = object({
65658
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
65659
- level: number().min(0).max(100).nullable(),
65660
- /** Discrete state when the hardware is binary-mode; null otherwise. */
65661
- status: _enum([
65662
- "ok",
65663
- "low",
65664
- "full"
65665
- ]).nullable()
65666
- });
65667
65799
  var VacuumControlStatusSchema = object({
65668
65800
  /** Lifecycle state of the vacuum. */
65669
- state: VacuumStateSchema,
65801
+ state: _enum([
65802
+ "idle",
65803
+ "cleaning",
65804
+ "paused",
65805
+ "returning",
65806
+ "docked",
65807
+ "drying",
65808
+ "error"
65809
+ ]),
65670
65810
  /** 0..100 battery percentage. Null when the device has no battery
65671
65811
  * reading. */
65672
65812
  batteryLevel: number().min(0).max(100).nullable(),
@@ -65675,14 +65815,6 @@ var VacuumControlStatusSchema = object({
65675
65815
  fanSpeed: string().nullable(),
65676
65816
  /** Speed tokens the hardware accepts — drives the UI selector. */
65677
65817
  availableFanSpeeds: array(string()),
65678
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
65679
- cleanWater: TankStatusSchema.nullable(),
65680
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
65681
- dirtyWater: TankStatusSchema.nullable(),
65682
- /** Detergent tank. Null when the hardware has no detergent tank. */
65683
- detergent: TankStatusSchema.nullable(),
65684
- /** Dust bin. Null when the hardware has no dust bin. */
65685
- dustBin: TankStatusSchema.nullable(),
65686
65818
  /** 0..100 cleaning-completion percentage of the current task, or null. */
65687
65819
  progressPercent: number().min(0).max(100).nullable(),
65688
65820
  /** Current error code (0 / null = no error). */
@@ -65744,35 +65876,14 @@ var vacuumControlCapability = {
65744
65876
  */
65745
65877
  durability: "session",
65746
65878
  /**
65747
- * History (D850): recorded series. Tank levels are fixed-object paths (`cleanWater.level`, ...).
65879
+ * History (D850): recorded series. The tanks moved to `consumables` (D915), whose
65880
+ * items are keyed by runtime ids and record no history.
65748
65881
  */
65749
- history: { fields: {
65750
- batteryLevel: {
65751
- kind: "gauge",
65752
- unit: "%",
65753
- deadband: 2
65754
- },
65755
- "cleanWater.level": {
65756
- kind: "gauge",
65757
- unit: "%",
65758
- deadband: 2
65759
- },
65760
- "dirtyWater.level": {
65761
- kind: "gauge",
65762
- unit: "%",
65763
- deadband: 2
65764
- },
65765
- "detergent.level": {
65766
- kind: "gauge",
65767
- unit: "%",
65768
- deadband: 2
65769
- },
65770
- "dustBin.level": {
65771
- kind: "gauge",
65772
- unit: "%",
65773
- deadband: 2
65774
- }
65775
- } }
65882
+ history: { fields: { batteryLevel: {
65883
+ kind: "gauge",
65884
+ unit: "%",
65885
+ deadband: 2
65886
+ } } }
65776
65887
  };
65777
65888
  var ValveStatusSchema = object({
65778
65889
  /** Lifecycle state of the valve. */
@@ -70166,6 +70277,12 @@ Object.freeze({
70166
70277
  addonId: null,
70167
70278
  access: "create"
70168
70279
  },
70280
+ "deviceHistory.deleteOrphanSeries": {
70281
+ capName: "device-history",
70282
+ capScope: "system",
70283
+ addonId: null,
70284
+ access: "delete"
70285
+ },
70169
70286
  "deviceHistory.getDeviceEnabled": {
70170
70287
  capName: "device-history",
70171
70288
  capScope: "system",
@@ -70184,6 +70301,12 @@ Object.freeze({
70184
70301
  addonId: null,
70185
70302
  access: "view"
70186
70303
  },
70304
+ "deviceHistory.listOrphanSeries": {
70305
+ capName: "device-history",
70306
+ capScope: "system",
70307
+ addonId: null,
70308
+ access: "view"
70309
+ },
70187
70310
  "deviceHistory.listSeries": {
70188
70311
  capName: "device-history",
70189
70312
  capScope: "system",
@@ -73808,6 +73931,12 @@ Object.freeze({
73808
73931
  addonId: null,
73809
73932
  access: "delete"
73810
73933
  },
73934
+ "pipelineOrchestrator.forgetInferenceDevice": {
73935
+ capName: "pipeline-orchestrator",
73936
+ capScope: "system",
73937
+ addonId: null,
73938
+ access: "delete"
73939
+ },
73811
73940
  "pipelineOrchestrator.getAgentLoad": {
73812
73941
  capName: "pipeline-orchestrator",
73813
73942
  capScope: "system",
@@ -74384,6 +74513,12 @@ Object.freeze({
74384
74513
  addonId: null,
74385
74514
  access: "view"
74386
74515
  },
74516
+ "platformProbe.rescanAccelerators": {
74517
+ capName: "platform-probe",
74518
+ capScope: "system",
74519
+ addonId: null,
74520
+ access: "create"
74521
+ },
74387
74522
  "platformProbe.resolveHwAccel": {
74388
74523
  capName: "platform-probe",
74389
74524
  capScope: "system",
@@ -80189,7 +80324,7 @@ var STATE_SUMMARY_VARS = [
80189
80324
  ([...RULE_TEXT], [...COMBINED_ALARM]),
80190
80325
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
80191
80326
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
80192
- ([...RULE_TEXT], [...CONSUMABLE]),
80327
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
80193
80328
  ([...RULE_TEXT], [...TANK]),
80194
80329
  [...RULE_TEXT],
80195
80330
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-rademacher",
3
- "version": "0.2.143",
3
+ "version": "0.2.145",
4
4
  "description": "Rademacher HomePilot device-provider addon for CamStack — wraps the @apocaliss92/noderademacher local-hub client (roller shutters over the cover cap)",
5
5
  "keywords": [
6
6
  "camstack",