@camstack/addon-matter-broker 0.2.144 → 0.2.146

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
@@ -5578,7 +5578,7 @@ var ZodIssueCode = {
5578
5578
  var ZodFirstPartyTypeKind;
5579
5579
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5580
5580
  //#endregion
5581
- //#region ../types/dist/sleep-DJFUfKvA.mjs
5581
+ //#region ../types/dist/sleep-CUp20JkO.mjs
5582
5582
  /**
5583
5583
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5584
5584
  * window to float samples (D455).
@@ -8658,7 +8658,11 @@ var ContributionSectionSchema = object({
8658
8658
  literal(4)
8659
8659
  ]).optional(),
8660
8660
  tab: string$2().optional(),
8661
- location: _enum(["settings", "top-tab"]).optional(),
8661
+ location: _enum([
8662
+ "settings",
8663
+ "top-tab",
8664
+ "hero"
8665
+ ]).optional(),
8662
8666
  order: number().optional(),
8663
8667
  fields: array(any$2())
8664
8668
  });
@@ -13591,7 +13595,11 @@ var ConfigSectionWithValuesSchema = object({
13591
13595
  literal(4)
13592
13596
  ]).optional(),
13593
13597
  tab: string$2().optional(),
13594
- location: _enum(["settings", "top-tab"]).optional(),
13598
+ location: _enum([
13599
+ "settings",
13600
+ "top-tab",
13601
+ "hero"
13602
+ ]).optional(),
13595
13603
  order: number().optional(),
13596
13604
  fields: array(any$2())
13597
13605
  });
@@ -17520,6 +17528,52 @@ var TierStatusSchema = object({
17520
17528
  countedAt: number().nullable()
17521
17529
  });
17522
17530
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
17531
+ /**
17532
+ * Why a series is orphan. `device-gone`: its device is absent from the
17533
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
17534
+ * key is declared by no capability any more (a field a cap removed).
17535
+ */
17536
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
17537
+ /** Rows held per stored tier. */
17538
+ var TierRowsSchema = object({
17539
+ raw: number().int(),
17540
+ "5m": number().int(),
17541
+ "1h": number().int(),
17542
+ "1d": number().int()
17543
+ });
17544
+ var OrphanSeriesSchema = object({
17545
+ seriesId: number().int(),
17546
+ deviceId: number().int(),
17547
+ key: string$2(),
17548
+ scope: string$2(),
17549
+ /** The metric's display name; `null` when its metric row is gone too. */
17550
+ displayName: string$2().nullable(),
17551
+ reason: DeviceHistoryOrphanReasonSchema,
17552
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
17553
+ missingSince: number().nullable(),
17554
+ firstTs: number(),
17555
+ lastTs: number(),
17556
+ rows: TierRowsSchema
17557
+ });
17558
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
17559
+ "not-found",
17560
+ "not-orphan",
17561
+ "failed"
17562
+ ]);
17563
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
17564
+ seriesId: number().int(),
17565
+ ok: literal(true),
17566
+ deleted: TierRowsSchema
17567
+ }), object({
17568
+ seriesId: number().int(),
17569
+ ok: literal(false),
17570
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
17571
+ })]);
17572
+ var OrphanListSchema = object({
17573
+ series: array(OrphanSeriesSchema).readonly(),
17574
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
17575
+ truncated: boolean()
17576
+ });
17523
17577
  var DeviceHistoryStatusSchema = object({
17524
17578
  startedAt: number(),
17525
17579
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -17617,7 +17671,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
17617
17671
  }), object({ enabled: boolean() }), {
17618
17672
  kind: "mutation",
17619
17673
  auth: "admin"
17620
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
17674
+ }), 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() }), {
17675
+ kind: "mutation",
17676
+ auth: "admin"
17677
+ });
17621
17678
  var DeviceCaStatusSchema = discriminatedUnion("state", [
17622
17679
  object({ state: literal("absent") }),
17623
17680
  object({
@@ -50588,6 +50645,19 @@ var NodeInferenceDeviceSchema = object({
50588
50645
  /** Whether the node's live probe reports the device as usable right now. */
50589
50646
  available: boolean(),
50590
50647
  /**
50648
+ * Is the device on the node at all (D919)? `present` — the live probe
50649
+ * reported it; `absent` — the probe ANSWERED and did not report it, so only
50650
+ * its stored settings remain (unplugged, moved to another node): never
50651
+ * eligible, whatever its stored `enabled`, and forgettable with
50652
+ * `forgetInferenceDevice`; `unknown` — the probe did not answer, nothing is
50653
+ * claimed (D315). Optional only for an orchestrator older than the field.
50654
+ */
50655
+ presence: _enum([
50656
+ "present",
50657
+ "absent",
50658
+ "unknown"
50659
+ ]).optional(),
50660
+ /**
50591
50661
  * Whether this device participates in dispatch. AUTO default (spec C2):
50592
50662
  * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
50593
50663
  * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
@@ -50813,7 +50883,13 @@ method(object({
50813
50883
  }), object({ success: literal(true) }), {
50814
50884
  kind: "mutation",
50815
50885
  auth: "admin"
50816
- }), method(object({ nodeId: string$2() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string$2() }), object({
50886
+ }), method(object({ nodeId: string$2() }), NodeInferenceDevicesSchema), method(object({
50887
+ agentNodeId: string$2(),
50888
+ deviceKey: string$2()
50889
+ }), object({ success: literal(true) }), {
50890
+ kind: "mutation",
50891
+ auth: "admin"
50892
+ }), method(object({ agentNodeId: string$2() }), object({
50817
50893
  success: literal(true),
50818
50894
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
50819
50895
  effectiveModelId: string$2().nullable(),
@@ -55494,17 +55570,69 @@ var connectivityCapability = {
55494
55570
  volatileStateFields: ["lastChangedAt"]
55495
55571
  };
55496
55572
  /**
55497
- * Generic device-consumables capability — surfaces a device's
55498
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
55499
- * descaling cycles, …) with their remaining life and an optional
55500
- * "Replaced" reset action. Device-agnostic: any provider that knows its
55501
- * device tracks consumables can register it; the cap declares no
55502
- * vocabulary of its own — the provider names each item verbatim.
55573
+ * Generic device-consumables capability — the ONE place a device reports what
55574
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
55575
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
55576
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
55577
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
55578
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
55579
+ * its device tracks consumables registers it; the provider names each item
55580
+ * verbatim and says which `kind` it is.
55581
+ *
55582
+ * The admin UI renders it as ONE collapsible section directly under the
55583
+ * device page's hero card (`placement: 'hero'`), for every device bound to
55584
+ * this cap — never drawn by a device type's hero card itself (D915).
55503
55585
  *
55504
55586
  * Like `childLayout`, the cap is INERT until a provider sets items: no
55505
55587
  * provider populates it by guessing (no HA inference). The UI renders a
55506
55588
  * "No consumables reported" placeholder when `items` is empty.
55507
55589
  */
55590
+ /**
55591
+ * What an item IS, which decides which direction is bad:
55592
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
55593
+ * - `supply` — something the device draws from (clean water, detergent,
55594
+ * salt, rinse aid); low or empty is bad.
55595
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
55596
+ * bad.
55597
+ * Absent = `wear`.
55598
+ */
55599
+ var ConsumableKindSchema = _enum([
55600
+ "wear",
55601
+ "supply",
55602
+ "waste"
55603
+ ]);
55604
+ /**
55605
+ * What an item LOOKS like, which decides how a client draws it — independent
55606
+ * of `kind`, which decides which direction is bad:
55607
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
55608
+ * remaining time and a reset.
55609
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
55610
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
55611
+ * a stepped level and "refill".
55612
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
55613
+ * that warns when full.
55614
+ * Absent = derived from the kind ({@link consumableFormOf}).
55615
+ */
55616
+ var ConsumableFormSchema = _enum([
55617
+ "part",
55618
+ "tank",
55619
+ "product",
55620
+ "bin"
55621
+ ]);
55622
+ /** The provider's own discrete verdict on an item. */
55623
+ var ConsumableStatusSchema = _enum([
55624
+ "ok",
55625
+ "low",
55626
+ "empty",
55627
+ "full",
55628
+ "replace"
55629
+ ]);
55630
+ _enum([
55631
+ "ok",
55632
+ "low",
55633
+ "empty",
55634
+ "full"
55635
+ ]);
55508
55636
  /** Units a remaining-life counter is reported in. Closed: the panel renders
55509
55637
  * each. */
55510
55638
  var ConsumableRemainingUnitSchema = _enum([
@@ -55519,18 +55647,23 @@ var ConsumableRemainingSchema = object({
55519
55647
  unit: ConsumableRemainingUnitSchema
55520
55648
  });
55521
55649
  /** A single consumable item. Either a continuous `level` (remaining
55522
- * life %) or a discrete `status` may be known — both may be null when a
55523
- * provider only knows the item exists. `level` and `status` are not
55524
- * mutually exclusive; a provider may report both. */
55650
+ * life %, or fill % for a `supply` / `waste` item) or a discrete `status`
55651
+ * may be known — both may be null when a provider only knows the item
55652
+ * exists. `level` and `status` are not mutually exclusive; a provider may
55653
+ * report both. */
55525
55654
  var ConsumableItemSchema = object({
55526
55655
  /** Stable id, e.g. 'main-brush'. */
55527
55656
  key: string$2().min(1),
55528
55657
  /** Display name. */
55529
55658
  label: string$2().min(1),
55530
- /** Remaining life % when known (0..100). */
55659
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
55531
55660
  level: number().min(0).max(100).nullable(),
55532
- /** Discrete state when known (binary mode). */
55533
- status: _enum(["ok", "replace"]).nullable(),
55661
+ /** The provider's discrete verdict when known (binary mode). */
55662
+ status: ConsumableStatusSchema.nullable(),
55663
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
55664
+ kind: ConsumableKindSchema.optional(),
55665
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
55666
+ form: ConsumableFormSchema.optional(),
55534
55667
  /** Ms epoch of the last replace, when known. */
55535
55668
  lastResetAt: number().nullable(),
55536
55669
  /** Whether `reset()` is meaningful for this item. */
@@ -55553,7 +55686,7 @@ var consumablesCapability = {
55553
55686
  kind: "widget",
55554
55687
  widgetId: "host/consumables-panel",
55555
55688
  tab: "consumables",
55556
- topTab: true,
55689
+ placement: "hero",
55557
55690
  label: "Consumables",
55558
55691
  order: 5
55559
55692
  } },
@@ -55614,9 +55747,37 @@ reset: method(object({
55614
55747
  */
55615
55748
  durability: "restored",
55616
55749
  /**
55617
- * History (D850): none — `items` is an array keyed by runtime ids; a history path never enters it.
55750
+ * History (D850, D917): one series per (item field, item `key`) — the item key
55751
+ * is the series scope, the item `label` names it. A vacuum tank's fill, a
55752
+ * brush's remaining life and a dishwasher's salt are each recorded the moment
55753
+ * their provider reports them; an item that appears later gets its series.
55618
55754
  */
55619
- history: "none",
55755
+ history: {
55756
+ fields: {},
55757
+ items: {
55758
+ path: "items",
55759
+ key: "key",
55760
+ label: "label",
55761
+ fields: {
55762
+ level: {
55763
+ kind: "gauge",
55764
+ unit: "%",
55765
+ deadband: 2,
55766
+ displayName: "Level"
55767
+ },
55768
+ status: {
55769
+ kind: "enum",
55770
+ displayName: "Status"
55771
+ },
55772
+ "remaining.value": {
55773
+ kind: "gauge",
55774
+ unitFrom: "remaining.unit",
55775
+ deadband: 1,
55776
+ displayName: "Remaining"
55777
+ }
55778
+ }
55779
+ }
55780
+ },
55620
55781
  /** Clocks, not content: a re-read that changed no item costs no commit. */
55621
55782
  volatileStateFields: ["lastChangedAt", "lastFetchedAt"]
55622
55783
  };
@@ -56031,8 +56192,9 @@ onStatusChanged: { data: object({
56031
56192
  volatileStateFields: ["lastChangedAt"]
56032
56193
  };
56033
56194
  /**
56034
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
56035
- * consumable levels (salt, rinse aid) and common program options.
56195
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
56196
+ * common program options. Salt and rinse aid are NOT here: they are items of
56197
+ * the device's `consumables` cap, like every other device's (D915).
56036
56198
  *
56037
56199
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
56038
56200
  * by any integration that exposes the same program / option surface.
@@ -56080,11 +56242,6 @@ var DishwasherAvailabilitySchema = _enum([
56080
56242
  "offline",
56081
56243
  "description-missing"
56082
56244
  ]);
56083
- var DishwasherConsumableLevelSchema = _enum([
56084
- "ok",
56085
- "low",
56086
- "empty"
56087
- ]);
56088
56245
  var DishwasherStatusSchema = object({
56089
56246
  availability: DishwasherAvailabilitySchema,
56090
56247
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -56117,8 +56274,6 @@ var DishwasherStatusSchema = object({
56117
56274
  powerOn: boolean().nullable(),
56118
56275
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
56119
56276
  powerState: string$2().nullable(),
56120
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
56121
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56122
56277
  /**
56123
56278
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
56124
56279
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -58994,7 +59149,7 @@ var motionTriggerCapability = {
58994
59149
  enabled: boolean()
58995
59150
  }), _void(), {
58996
59151
  kind: "mutation",
58997
- auth: "admin"
59152
+ auth: "protected"
58998
59153
  }) },
58999
59154
  events: { onMotionTriggerChanged: { data: object({
59000
59155
  deviceId: number(),
@@ -59724,6 +59879,13 @@ var TopologyNodeSchema = object({
59724
59879
  cpuModel: string$2().nullable(),
59725
59880
  cpuCores: number(),
59726
59881
  memoryMB: number(),
59882
+ /**
59883
+ * The inference RUNTIMES installed on the node (`pythonRuntimes`: onnx,
59884
+ * openvino, edgetpu …) — not its devices. An installed runtime says nothing
59885
+ * about whether its hardware is there (a Coral delegate stays installed
59886
+ * after the stick leaves, D919); the live device set is
59887
+ * `pipelineOrchestrator.getNodeInferenceDevices`.
59888
+ */
59727
59889
  engines: array(string$2()).readonly(),
59728
59890
  isHub: boolean(),
59729
59891
  isOnline: boolean(),
@@ -60841,7 +61003,28 @@ var ResolvedInferenceConfigSchema = object({
60841
61003
  format: ModelFormatSchema,
60842
61004
  reason: string$2()
60843
61005
  });
60844
- method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema);
61006
+ /**
61007
+ * The answer of an accelerator rescan (D919): the node's device list after
61008
+ * the re-probe, what changed, and the evidence that decided the Coral answer
61009
+ * (`usbBus` — could the USB bus be read at all; `decidedBy` — USB ids, the PCI
61010
+ * bus, the installed-delegate fallback, or nothing).
61011
+ */
61012
+ var AcceleratorRescanSchema = object({
61013
+ devices: array(InferenceDeviceDescriptorSchema).readonly(),
61014
+ appeared: array(string$2()).readonly(),
61015
+ disappeared: array(string$2()).readonly(),
61016
+ usbBus: _enum(["observed", "unobservable"]),
61017
+ decidedBy: _enum([
61018
+ "usb-ids",
61019
+ "pci",
61020
+ "delegate-fallback",
61021
+ "none"
61022
+ ])
61023
+ });
61024
+ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema), method(_void(), AcceleratorRescanSchema, {
61025
+ kind: "mutation",
61026
+ auth: "admin"
61027
+ });
60845
61028
  /**
60846
61029
  * Multi-metric electrical meter. One slice can carry any combination
60847
61030
  * of instantaneous power (W), cumulative energy (kWh), voltage (V),
@@ -64934,60 +65117,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64934
65117
  auth: "admin",
64935
65118
  access: "delete"
64936
65119
  });
64937
- /**
64938
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
64939
- * cleaning lifecycle plus a return-to-base / locate surface and an
64940
- * optional fan-speed selector.
64941
- *
64942
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
64943
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
64944
- * (0..100) is nullable — some vacuums don't report a battery
64945
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
64946
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
64947
- * tokens the hardware accepts so the UI renders only supported choices.
64948
- *
64949
- * The `setFanSpeed` method takes the bare `speed` token — the provider
64950
- * validates it against the vacuum's own list. `locate` triggers the
64951
- * find-me chirp; `returnToBase` sends it home.
64952
- *
64953
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
64954
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
64955
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
64956
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
64957
- * only when the device has no such tank at all, and use a `TankStatus`
64958
- * with both inner fields `null` when the tank exists but its level is
64959
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
64960
- * so the HA provider leaves all four `null`.
64961
- */
64962
- var VacuumStateSchema = _enum([
64963
- "idle",
64964
- "cleaning",
64965
- "paused",
64966
- "returning",
64967
- "docked",
64968
- "drying",
64969
- "error"
64970
- ]);
64971
- /**
64972
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
64973
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
64974
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
64975
- * level is currently unknown; the OWNING field being `null` means the
64976
- * hardware has no such tank at all.
64977
- */
64978
- var TankStatusSchema = object({
64979
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
64980
- level: number().min(0).max(100).nullable(),
64981
- /** Discrete state when the hardware is binary-mode; null otherwise. */
64982
- status: _enum([
64983
- "ok",
64984
- "low",
64985
- "full"
64986
- ]).nullable()
64987
- });
64988
65120
  var VacuumControlStatusSchema = object({
64989
65121
  /** Lifecycle state of the vacuum. */
64990
- state: VacuumStateSchema,
65122
+ state: _enum([
65123
+ "idle",
65124
+ "cleaning",
65125
+ "paused",
65126
+ "returning",
65127
+ "docked",
65128
+ "drying",
65129
+ "error"
65130
+ ]),
64991
65131
  /** 0..100 battery percentage. Null when the device has no battery
64992
65132
  * reading. */
64993
65133
  batteryLevel: number().min(0).max(100).nullable(),
@@ -64996,14 +65136,6 @@ var VacuumControlStatusSchema = object({
64996
65136
  fanSpeed: string$2().nullable(),
64997
65137
  /** Speed tokens the hardware accepts — drives the UI selector. */
64998
65138
  availableFanSpeeds: array(string$2()),
64999
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
65000
- cleanWater: TankStatusSchema.nullable(),
65001
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
65002
- dirtyWater: TankStatusSchema.nullable(),
65003
- /** Detergent tank. Null when the hardware has no detergent tank. */
65004
- detergent: TankStatusSchema.nullable(),
65005
- /** Dust bin. Null when the hardware has no dust bin. */
65006
- dustBin: TankStatusSchema.nullable(),
65007
65139
  /** 0..100 cleaning-completion percentage of the current task, or null. */
65008
65140
  progressPercent: number().min(0).max(100).nullable(),
65009
65141
  /** Current error code (0 / null = no error). */
@@ -65065,35 +65197,14 @@ var vacuumControlCapability = {
65065
65197
  */
65066
65198
  durability: "session",
65067
65199
  /**
65068
- * History (D850): recorded series. Tank levels are fixed-object paths (`cleanWater.level`, ...).
65200
+ * History (D850): recorded series. The tanks moved to `consumables` (D915), whose
65201
+ * items are keyed by runtime ids and record no history.
65069
65202
  */
65070
- history: { fields: {
65071
- batteryLevel: {
65072
- kind: "gauge",
65073
- unit: "%",
65074
- deadband: 2
65075
- },
65076
- "cleanWater.level": {
65077
- kind: "gauge",
65078
- unit: "%",
65079
- deadband: 2
65080
- },
65081
- "dirtyWater.level": {
65082
- kind: "gauge",
65083
- unit: "%",
65084
- deadband: 2
65085
- },
65086
- "detergent.level": {
65087
- kind: "gauge",
65088
- unit: "%",
65089
- deadband: 2
65090
- },
65091
- "dustBin.level": {
65092
- kind: "gauge",
65093
- unit: "%",
65094
- deadband: 2
65095
- }
65096
- } }
65203
+ history: { fields: { batteryLevel: {
65204
+ kind: "gauge",
65205
+ unit: "%",
65206
+ deadband: 2
65207
+ } } }
65097
65208
  };
65098
65209
  var ValveStatusSchema = object({
65099
65210
  /** Lifecycle state of the valve. */
@@ -69487,6 +69598,12 @@ Object.freeze({
69487
69598
  addonId: null,
69488
69599
  access: "create"
69489
69600
  },
69601
+ "deviceHistory.deleteOrphanSeries": {
69602
+ capName: "device-history",
69603
+ capScope: "system",
69604
+ addonId: null,
69605
+ access: "delete"
69606
+ },
69490
69607
  "deviceHistory.getDeviceEnabled": {
69491
69608
  capName: "device-history",
69492
69609
  capScope: "system",
@@ -69505,6 +69622,12 @@ Object.freeze({
69505
69622
  addonId: null,
69506
69623
  access: "view"
69507
69624
  },
69625
+ "deviceHistory.listOrphanSeries": {
69626
+ capName: "device-history",
69627
+ capScope: "system",
69628
+ addonId: null,
69629
+ access: "view"
69630
+ },
69508
69631
  "deviceHistory.listSeries": {
69509
69632
  capName: "device-history",
69510
69633
  capScope: "system",
@@ -73129,6 +73252,12 @@ Object.freeze({
73129
73252
  addonId: null,
73130
73253
  access: "delete"
73131
73254
  },
73255
+ "pipelineOrchestrator.forgetInferenceDevice": {
73256
+ capName: "pipeline-orchestrator",
73257
+ capScope: "system",
73258
+ addonId: null,
73259
+ access: "delete"
73260
+ },
73132
73261
  "pipelineOrchestrator.getAgentLoad": {
73133
73262
  capName: "pipeline-orchestrator",
73134
73263
  capScope: "system",
@@ -73705,6 +73834,12 @@ Object.freeze({
73705
73834
  addonId: null,
73706
73835
  access: "view"
73707
73836
  },
73837
+ "platformProbe.rescanAccelerators": {
73838
+ capName: "platform-probe",
73839
+ capScope: "system",
73840
+ addonId: null,
73841
+ access: "create"
73842
+ },
73708
73843
  "platformProbe.resolveHwAccel": {
73709
73844
  capName: "platform-probe",
73710
73845
  capScope: "system",
@@ -79510,7 +79645,7 @@ var STATE_SUMMARY_VARS = [
79510
79645
  ([...RULE_TEXT], [...COMBINED_ALARM]),
79511
79646
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
79512
79647
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
79513
- ([...RULE_TEXT], [...CONSUMABLE]),
79648
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
79514
79649
  ([...RULE_TEXT], [...TANK]),
79515
79650
  [...RULE_TEXT],
79516
79651
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
package/dist/addon.mjs CHANGED
@@ -5576,7 +5576,7 @@ var ZodIssueCode = {
5576
5576
  var ZodFirstPartyTypeKind;
5577
5577
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5578
5578
  //#endregion
5579
- //#region ../types/dist/sleep-DJFUfKvA.mjs
5579
+ //#region ../types/dist/sleep-CUp20JkO.mjs
5580
5580
  /**
5581
5581
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5582
5582
  * window to float samples (D455).
@@ -8656,7 +8656,11 @@ var ContributionSectionSchema = object({
8656
8656
  literal(4)
8657
8657
  ]).optional(),
8658
8658
  tab: string$2().optional(),
8659
- location: _enum(["settings", "top-tab"]).optional(),
8659
+ location: _enum([
8660
+ "settings",
8661
+ "top-tab",
8662
+ "hero"
8663
+ ]).optional(),
8660
8664
  order: number().optional(),
8661
8665
  fields: array(any$2())
8662
8666
  });
@@ -13589,7 +13593,11 @@ var ConfigSectionWithValuesSchema = object({
13589
13593
  literal(4)
13590
13594
  ]).optional(),
13591
13595
  tab: string$2().optional(),
13592
- location: _enum(["settings", "top-tab"]).optional(),
13596
+ location: _enum([
13597
+ "settings",
13598
+ "top-tab",
13599
+ "hero"
13600
+ ]).optional(),
13593
13601
  order: number().optional(),
13594
13602
  fields: array(any$2())
13595
13603
  });
@@ -17518,6 +17526,52 @@ var TierStatusSchema = object({
17518
17526
  countedAt: number().nullable()
17519
17527
  });
17520
17528
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
17529
+ /**
17530
+ * Why a series is orphan. `device-gone`: its device is absent from the
17531
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
17532
+ * key is declared by no capability any more (a field a cap removed).
17533
+ */
17534
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
17535
+ /** Rows held per stored tier. */
17536
+ var TierRowsSchema = object({
17537
+ raw: number().int(),
17538
+ "5m": number().int(),
17539
+ "1h": number().int(),
17540
+ "1d": number().int()
17541
+ });
17542
+ var OrphanSeriesSchema = object({
17543
+ seriesId: number().int(),
17544
+ deviceId: number().int(),
17545
+ key: string$2(),
17546
+ scope: string$2(),
17547
+ /** The metric's display name; `null` when its metric row is gone too. */
17548
+ displayName: string$2().nullable(),
17549
+ reason: DeviceHistoryOrphanReasonSchema,
17550
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
17551
+ missingSince: number().nullable(),
17552
+ firstTs: number(),
17553
+ lastTs: number(),
17554
+ rows: TierRowsSchema
17555
+ });
17556
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
17557
+ "not-found",
17558
+ "not-orphan",
17559
+ "failed"
17560
+ ]);
17561
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
17562
+ seriesId: number().int(),
17563
+ ok: literal(true),
17564
+ deleted: TierRowsSchema
17565
+ }), object({
17566
+ seriesId: number().int(),
17567
+ ok: literal(false),
17568
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
17569
+ })]);
17570
+ var OrphanListSchema = object({
17571
+ series: array(OrphanSeriesSchema).readonly(),
17572
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
17573
+ truncated: boolean()
17574
+ });
17521
17575
  var DeviceHistoryStatusSchema = object({
17522
17576
  startedAt: number(),
17523
17577
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -17615,7 +17669,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
17615
17669
  }), object({ enabled: boolean() }), {
17616
17670
  kind: "mutation",
17617
17671
  auth: "admin"
17618
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
17672
+ }), 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() }), {
17673
+ kind: "mutation",
17674
+ auth: "admin"
17675
+ });
17619
17676
  var DeviceCaStatusSchema = discriminatedUnion("state", [
17620
17677
  object({ state: literal("absent") }),
17621
17678
  object({
@@ -50586,6 +50643,19 @@ var NodeInferenceDeviceSchema = object({
50586
50643
  /** Whether the node's live probe reports the device as usable right now. */
50587
50644
  available: boolean(),
50588
50645
  /**
50646
+ * Is the device on the node at all (D919)? `present` — the live probe
50647
+ * reported it; `absent` — the probe ANSWERED and did not report it, so only
50648
+ * its stored settings remain (unplugged, moved to another node): never
50649
+ * eligible, whatever its stored `enabled`, and forgettable with
50650
+ * `forgetInferenceDevice`; `unknown` — the probe did not answer, nothing is
50651
+ * claimed (D315). Optional only for an orchestrator older than the field.
50652
+ */
50653
+ presence: _enum([
50654
+ "present",
50655
+ "absent",
50656
+ "unknown"
50657
+ ]).optional(),
50658
+ /**
50589
50659
  * Whether this device participates in dispatch. AUTO default (spec C2):
50590
50660
  * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
50591
50661
  * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
@@ -50811,7 +50881,13 @@ method(object({
50811
50881
  }), object({ success: literal(true) }), {
50812
50882
  kind: "mutation",
50813
50883
  auth: "admin"
50814
- }), method(object({ nodeId: string$2() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string$2() }), object({
50884
+ }), method(object({ nodeId: string$2() }), NodeInferenceDevicesSchema), method(object({
50885
+ agentNodeId: string$2(),
50886
+ deviceKey: string$2()
50887
+ }), object({ success: literal(true) }), {
50888
+ kind: "mutation",
50889
+ auth: "admin"
50890
+ }), method(object({ agentNodeId: string$2() }), object({
50815
50891
  success: literal(true),
50816
50892
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
50817
50893
  effectiveModelId: string$2().nullable(),
@@ -55492,17 +55568,69 @@ var connectivityCapability = {
55492
55568
  volatileStateFields: ["lastChangedAt"]
55493
55569
  };
55494
55570
  /**
55495
- * Generic device-consumables capability — surfaces a device's
55496
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
55497
- * descaling cycles, …) with their remaining life and an optional
55498
- * "Replaced" reset action. Device-agnostic: any provider that knows its
55499
- * device tracks consumables can register it; the cap declares no
55500
- * vocabulary of its own — the provider names each item verbatim.
55571
+ * Generic device-consumables capability — the ONE place a device reports what
55572
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
55573
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
55574
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
55575
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
55576
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
55577
+ * its device tracks consumables registers it; the provider names each item
55578
+ * verbatim and says which `kind` it is.
55579
+ *
55580
+ * The admin UI renders it as ONE collapsible section directly under the
55581
+ * device page's hero card (`placement: 'hero'`), for every device bound to
55582
+ * this cap — never drawn by a device type's hero card itself (D915).
55501
55583
  *
55502
55584
  * Like `childLayout`, the cap is INERT until a provider sets items: no
55503
55585
  * provider populates it by guessing (no HA inference). The UI renders a
55504
55586
  * "No consumables reported" placeholder when `items` is empty.
55505
55587
  */
55588
+ /**
55589
+ * What an item IS, which decides which direction is bad:
55590
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
55591
+ * - `supply` — something the device draws from (clean water, detergent,
55592
+ * salt, rinse aid); low or empty is bad.
55593
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
55594
+ * bad.
55595
+ * Absent = `wear`.
55596
+ */
55597
+ var ConsumableKindSchema = _enum([
55598
+ "wear",
55599
+ "supply",
55600
+ "waste"
55601
+ ]);
55602
+ /**
55603
+ * What an item LOOKS like, which decides how a client draws it — independent
55604
+ * of `kind`, which decides which direction is bad:
55605
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
55606
+ * remaining time and a reset.
55607
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
55608
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
55609
+ * a stepped level and "refill".
55610
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
55611
+ * that warns when full.
55612
+ * Absent = derived from the kind ({@link consumableFormOf}).
55613
+ */
55614
+ var ConsumableFormSchema = _enum([
55615
+ "part",
55616
+ "tank",
55617
+ "product",
55618
+ "bin"
55619
+ ]);
55620
+ /** The provider's own discrete verdict on an item. */
55621
+ var ConsumableStatusSchema = _enum([
55622
+ "ok",
55623
+ "low",
55624
+ "empty",
55625
+ "full",
55626
+ "replace"
55627
+ ]);
55628
+ _enum([
55629
+ "ok",
55630
+ "low",
55631
+ "empty",
55632
+ "full"
55633
+ ]);
55506
55634
  /** Units a remaining-life counter is reported in. Closed: the panel renders
55507
55635
  * each. */
55508
55636
  var ConsumableRemainingUnitSchema = _enum([
@@ -55517,18 +55645,23 @@ var ConsumableRemainingSchema = object({
55517
55645
  unit: ConsumableRemainingUnitSchema
55518
55646
  });
55519
55647
  /** A single consumable item. Either a continuous `level` (remaining
55520
- * life %) or a discrete `status` may be known — both may be null when a
55521
- * provider only knows the item exists. `level` and `status` are not
55522
- * mutually exclusive; a provider may report both. */
55648
+ * life %, or fill % for a `supply` / `waste` item) or a discrete `status`
55649
+ * may be known — both may be null when a provider only knows the item
55650
+ * exists. `level` and `status` are not mutually exclusive; a provider may
55651
+ * report both. */
55523
55652
  var ConsumableItemSchema = object({
55524
55653
  /** Stable id, e.g. 'main-brush'. */
55525
55654
  key: string$2().min(1),
55526
55655
  /** Display name. */
55527
55656
  label: string$2().min(1),
55528
- /** Remaining life % when known (0..100). */
55657
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
55529
55658
  level: number().min(0).max(100).nullable(),
55530
- /** Discrete state when known (binary mode). */
55531
- status: _enum(["ok", "replace"]).nullable(),
55659
+ /** The provider's discrete verdict when known (binary mode). */
55660
+ status: ConsumableStatusSchema.nullable(),
55661
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
55662
+ kind: ConsumableKindSchema.optional(),
55663
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
55664
+ form: ConsumableFormSchema.optional(),
55532
55665
  /** Ms epoch of the last replace, when known. */
55533
55666
  lastResetAt: number().nullable(),
55534
55667
  /** Whether `reset()` is meaningful for this item. */
@@ -55551,7 +55684,7 @@ var consumablesCapability = {
55551
55684
  kind: "widget",
55552
55685
  widgetId: "host/consumables-panel",
55553
55686
  tab: "consumables",
55554
- topTab: true,
55687
+ placement: "hero",
55555
55688
  label: "Consumables",
55556
55689
  order: 5
55557
55690
  } },
@@ -55612,9 +55745,37 @@ reset: method(object({
55612
55745
  */
55613
55746
  durability: "restored",
55614
55747
  /**
55615
- * History (D850): none — `items` is an array keyed by runtime ids; a history path never enters it.
55748
+ * History (D850, D917): one series per (item field, item `key`) — the item key
55749
+ * is the series scope, the item `label` names it. A vacuum tank's fill, a
55750
+ * brush's remaining life and a dishwasher's salt are each recorded the moment
55751
+ * their provider reports them; an item that appears later gets its series.
55616
55752
  */
55617
- history: "none",
55753
+ history: {
55754
+ fields: {},
55755
+ items: {
55756
+ path: "items",
55757
+ key: "key",
55758
+ label: "label",
55759
+ fields: {
55760
+ level: {
55761
+ kind: "gauge",
55762
+ unit: "%",
55763
+ deadband: 2,
55764
+ displayName: "Level"
55765
+ },
55766
+ status: {
55767
+ kind: "enum",
55768
+ displayName: "Status"
55769
+ },
55770
+ "remaining.value": {
55771
+ kind: "gauge",
55772
+ unitFrom: "remaining.unit",
55773
+ deadband: 1,
55774
+ displayName: "Remaining"
55775
+ }
55776
+ }
55777
+ }
55778
+ },
55618
55779
  /** Clocks, not content: a re-read that changed no item costs no commit. */
55619
55780
  volatileStateFields: ["lastChangedAt", "lastFetchedAt"]
55620
55781
  };
@@ -56029,8 +56190,9 @@ onStatusChanged: { data: object({
56029
56190
  volatileStateFields: ["lastChangedAt"]
56030
56191
  };
56031
56192
  /**
56032
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
56033
- * consumable levels (salt, rinse aid) and common program options.
56193
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
56194
+ * common program options. Salt and rinse aid are NOT here: they are items of
56195
+ * the device's `consumables` cap, like every other device's (D915).
56034
56196
  *
56035
56197
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
56036
56198
  * by any integration that exposes the same program / option surface.
@@ -56078,11 +56240,6 @@ var DishwasherAvailabilitySchema = _enum([
56078
56240
  "offline",
56079
56241
  "description-missing"
56080
56242
  ]);
56081
- var DishwasherConsumableLevelSchema = _enum([
56082
- "ok",
56083
- "low",
56084
- "empty"
56085
- ]);
56086
56243
  var DishwasherStatusSchema = object({
56087
56244
  availability: DishwasherAvailabilitySchema,
56088
56245
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -56115,8 +56272,6 @@ var DishwasherStatusSchema = object({
56115
56272
  powerOn: boolean().nullable(),
56116
56273
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
56117
56274
  powerState: string$2().nullable(),
56118
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
56119
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56120
56275
  /**
56121
56276
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
56122
56277
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -58992,7 +59147,7 @@ var motionTriggerCapability = {
58992
59147
  enabled: boolean()
58993
59148
  }), _void(), {
58994
59149
  kind: "mutation",
58995
- auth: "admin"
59150
+ auth: "protected"
58996
59151
  }) },
58997
59152
  events: { onMotionTriggerChanged: { data: object({
58998
59153
  deviceId: number(),
@@ -59722,6 +59877,13 @@ var TopologyNodeSchema = object({
59722
59877
  cpuModel: string$2().nullable(),
59723
59878
  cpuCores: number(),
59724
59879
  memoryMB: number(),
59880
+ /**
59881
+ * The inference RUNTIMES installed on the node (`pythonRuntimes`: onnx,
59882
+ * openvino, edgetpu …) — not its devices. An installed runtime says nothing
59883
+ * about whether its hardware is there (a Coral delegate stays installed
59884
+ * after the stick leaves, D919); the live device set is
59885
+ * `pipelineOrchestrator.getNodeInferenceDevices`.
59886
+ */
59725
59887
  engines: array(string$2()).readonly(),
59726
59888
  isHub: boolean(),
59727
59889
  isOnline: boolean(),
@@ -60839,7 +61001,28 @@ var ResolvedInferenceConfigSchema = object({
60839
61001
  format: ModelFormatSchema,
60840
61002
  reason: string$2()
60841
61003
  });
60842
- method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema);
61004
+ /**
61005
+ * The answer of an accelerator rescan (D919): the node's device list after
61006
+ * the re-probe, what changed, and the evidence that decided the Coral answer
61007
+ * (`usbBus` — could the USB bus be read at all; `decidedBy` — USB ids, the PCI
61008
+ * bus, the installed-delegate fallback, or nothing).
61009
+ */
61010
+ var AcceleratorRescanSchema = object({
61011
+ devices: array(InferenceDeviceDescriptorSchema).readonly(),
61012
+ appeared: array(string$2()).readonly(),
61013
+ disappeared: array(string$2()).readonly(),
61014
+ usbBus: _enum(["observed", "unobservable"]),
61015
+ decidedBy: _enum([
61016
+ "usb-ids",
61017
+ "pci",
61018
+ "delegate-fallback",
61019
+ "none"
61020
+ ])
61021
+ });
61022
+ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema), method(_void(), AcceleratorRescanSchema, {
61023
+ kind: "mutation",
61024
+ auth: "admin"
61025
+ });
60843
61026
  /**
60844
61027
  * Multi-metric electrical meter. One slice can carry any combination
60845
61028
  * of instantaneous power (W), cumulative energy (kWh), voltage (V),
@@ -64932,60 +65115,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64932
65115
  auth: "admin",
64933
65116
  access: "delete"
64934
65117
  });
64935
- /**
64936
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
64937
- * cleaning lifecycle plus a return-to-base / locate surface and an
64938
- * optional fan-speed selector.
64939
- *
64940
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
64941
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
64942
- * (0..100) is nullable — some vacuums don't report a battery
64943
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
64944
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
64945
- * tokens the hardware accepts so the UI renders only supported choices.
64946
- *
64947
- * The `setFanSpeed` method takes the bare `speed` token — the provider
64948
- * validates it against the vacuum's own list. `locate` triggers the
64949
- * find-me chirp; `returnToBase` sends it home.
64950
- *
64951
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
64952
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
64953
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
64954
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
64955
- * only when the device has no such tank at all, and use a `TankStatus`
64956
- * with both inner fields `null` when the tank exists but its level is
64957
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
64958
- * so the HA provider leaves all four `null`.
64959
- */
64960
- var VacuumStateSchema = _enum([
64961
- "idle",
64962
- "cleaning",
64963
- "paused",
64964
- "returning",
64965
- "docked",
64966
- "drying",
64967
- "error"
64968
- ]);
64969
- /**
64970
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
64971
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
64972
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
64973
- * level is currently unknown; the OWNING field being `null` means the
64974
- * hardware has no such tank at all.
64975
- */
64976
- var TankStatusSchema = object({
64977
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
64978
- level: number().min(0).max(100).nullable(),
64979
- /** Discrete state when the hardware is binary-mode; null otherwise. */
64980
- status: _enum([
64981
- "ok",
64982
- "low",
64983
- "full"
64984
- ]).nullable()
64985
- });
64986
65118
  var VacuumControlStatusSchema = object({
64987
65119
  /** Lifecycle state of the vacuum. */
64988
- state: VacuumStateSchema,
65120
+ state: _enum([
65121
+ "idle",
65122
+ "cleaning",
65123
+ "paused",
65124
+ "returning",
65125
+ "docked",
65126
+ "drying",
65127
+ "error"
65128
+ ]),
64989
65129
  /** 0..100 battery percentage. Null when the device has no battery
64990
65130
  * reading. */
64991
65131
  batteryLevel: number().min(0).max(100).nullable(),
@@ -64994,14 +65134,6 @@ var VacuumControlStatusSchema = object({
64994
65134
  fanSpeed: string$2().nullable(),
64995
65135
  /** Speed tokens the hardware accepts — drives the UI selector. */
64996
65136
  availableFanSpeeds: array(string$2()),
64997
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
64998
- cleanWater: TankStatusSchema.nullable(),
64999
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
65000
- dirtyWater: TankStatusSchema.nullable(),
65001
- /** Detergent tank. Null when the hardware has no detergent tank. */
65002
- detergent: TankStatusSchema.nullable(),
65003
- /** Dust bin. Null when the hardware has no dust bin. */
65004
- dustBin: TankStatusSchema.nullable(),
65005
65137
  /** 0..100 cleaning-completion percentage of the current task, or null. */
65006
65138
  progressPercent: number().min(0).max(100).nullable(),
65007
65139
  /** Current error code (0 / null = no error). */
@@ -65063,35 +65195,14 @@ var vacuumControlCapability = {
65063
65195
  */
65064
65196
  durability: "session",
65065
65197
  /**
65066
- * History (D850): recorded series. Tank levels are fixed-object paths (`cleanWater.level`, ...).
65198
+ * History (D850): recorded series. The tanks moved to `consumables` (D915), whose
65199
+ * items are keyed by runtime ids and record no history.
65067
65200
  */
65068
- history: { fields: {
65069
- batteryLevel: {
65070
- kind: "gauge",
65071
- unit: "%",
65072
- deadband: 2
65073
- },
65074
- "cleanWater.level": {
65075
- kind: "gauge",
65076
- unit: "%",
65077
- deadband: 2
65078
- },
65079
- "dirtyWater.level": {
65080
- kind: "gauge",
65081
- unit: "%",
65082
- deadband: 2
65083
- },
65084
- "detergent.level": {
65085
- kind: "gauge",
65086
- unit: "%",
65087
- deadband: 2
65088
- },
65089
- "dustBin.level": {
65090
- kind: "gauge",
65091
- unit: "%",
65092
- deadband: 2
65093
- }
65094
- } }
65201
+ history: { fields: { batteryLevel: {
65202
+ kind: "gauge",
65203
+ unit: "%",
65204
+ deadband: 2
65205
+ } } }
65095
65206
  };
65096
65207
  var ValveStatusSchema = object({
65097
65208
  /** Lifecycle state of the valve. */
@@ -69485,6 +69596,12 @@ Object.freeze({
69485
69596
  addonId: null,
69486
69597
  access: "create"
69487
69598
  },
69599
+ "deviceHistory.deleteOrphanSeries": {
69600
+ capName: "device-history",
69601
+ capScope: "system",
69602
+ addonId: null,
69603
+ access: "delete"
69604
+ },
69488
69605
  "deviceHistory.getDeviceEnabled": {
69489
69606
  capName: "device-history",
69490
69607
  capScope: "system",
@@ -69503,6 +69620,12 @@ Object.freeze({
69503
69620
  addonId: null,
69504
69621
  access: "view"
69505
69622
  },
69623
+ "deviceHistory.listOrphanSeries": {
69624
+ capName: "device-history",
69625
+ capScope: "system",
69626
+ addonId: null,
69627
+ access: "view"
69628
+ },
69506
69629
  "deviceHistory.listSeries": {
69507
69630
  capName: "device-history",
69508
69631
  capScope: "system",
@@ -73127,6 +73250,12 @@ Object.freeze({
73127
73250
  addonId: null,
73128
73251
  access: "delete"
73129
73252
  },
73253
+ "pipelineOrchestrator.forgetInferenceDevice": {
73254
+ capName: "pipeline-orchestrator",
73255
+ capScope: "system",
73256
+ addonId: null,
73257
+ access: "delete"
73258
+ },
73130
73259
  "pipelineOrchestrator.getAgentLoad": {
73131
73260
  capName: "pipeline-orchestrator",
73132
73261
  capScope: "system",
@@ -73703,6 +73832,12 @@ Object.freeze({
73703
73832
  addonId: null,
73704
73833
  access: "view"
73705
73834
  },
73835
+ "platformProbe.rescanAccelerators": {
73836
+ capName: "platform-probe",
73837
+ capScope: "system",
73838
+ addonId: null,
73839
+ access: "create"
73840
+ },
73706
73841
  "platformProbe.resolveHwAccel": {
73707
73842
  capName: "platform-probe",
73708
73843
  capScope: "system",
@@ -79508,7 +79643,7 @@ var STATE_SUMMARY_VARS = [
79508
79643
  ([...RULE_TEXT], [...COMBINED_ALARM]),
79509
79644
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
79510
79645
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
79511
- ([...RULE_TEXT], [...CONSUMABLE]),
79646
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
79512
79647
  ([...RULE_TEXT], [...TANK]),
79513
79648
  [...RULE_TEXT],
79514
79649
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-matter-broker",
3
- "version": "0.2.144",
3
+ "version": "0.2.146",
4
4
  "description": "Matter broker addon for CamStack — owns a Matter fabric (commissioning + the long-lived controller) via the matter.js controller and brokers commissioned Matter nodes into CamStack",
5
5
  "keywords": [
6
6
  "camstack",