@camstack/addon-google-services 0.2.25 → 0.2.27

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.
@@ -5568,7 +5568,7 @@ var ZodIssueCode = {
5568
5568
  var ZodFirstPartyTypeKind;
5569
5569
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5570
5570
  //#endregion
5571
- //#region ../types/dist/sleep-DJFUfKvA.mjs
5571
+ //#region ../types/dist/sleep-CUp20JkO.mjs
5572
5572
  /**
5573
5573
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5574
5574
  * window to float samples (D455).
@@ -8648,7 +8648,11 @@ var ContributionSectionSchema = object({
8648
8648
  literal(4)
8649
8649
  ]).optional(),
8650
8650
  tab: string().optional(),
8651
- location: _enum(["settings", "top-tab"]).optional(),
8651
+ location: _enum([
8652
+ "settings",
8653
+ "top-tab",
8654
+ "hero"
8655
+ ]).optional(),
8652
8656
  order: number().optional(),
8653
8657
  fields: array(any())
8654
8658
  });
@@ -13717,7 +13721,11 @@ var ConfigSectionWithValuesSchema = object({
13717
13721
  literal(4)
13718
13722
  ]).optional(),
13719
13723
  tab: string().optional(),
13720
- location: _enum(["settings", "top-tab"]).optional(),
13724
+ location: _enum([
13725
+ "settings",
13726
+ "top-tab",
13727
+ "hero"
13728
+ ]).optional(),
13721
13729
  order: number().optional(),
13722
13730
  fields: array(any())
13723
13731
  });
@@ -17540,6 +17548,52 @@ var TierStatusSchema = object({
17540
17548
  countedAt: number().nullable()
17541
17549
  });
17542
17550
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
17551
+ /**
17552
+ * Why a series is orphan. `device-gone`: its device is absent from the
17553
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
17554
+ * key is declared by no capability any more (a field a cap removed).
17555
+ */
17556
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
17557
+ /** Rows held per stored tier. */
17558
+ var TierRowsSchema = object({
17559
+ raw: number().int(),
17560
+ "5m": number().int(),
17561
+ "1h": number().int(),
17562
+ "1d": number().int()
17563
+ });
17564
+ var OrphanSeriesSchema = object({
17565
+ seriesId: number().int(),
17566
+ deviceId: number().int(),
17567
+ key: string(),
17568
+ scope: string(),
17569
+ /** The metric's display name; `null` when its metric row is gone too. */
17570
+ displayName: string().nullable(),
17571
+ reason: DeviceHistoryOrphanReasonSchema,
17572
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
17573
+ missingSince: number().nullable(),
17574
+ firstTs: number(),
17575
+ lastTs: number(),
17576
+ rows: TierRowsSchema
17577
+ });
17578
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
17579
+ "not-found",
17580
+ "not-orphan",
17581
+ "failed"
17582
+ ]);
17583
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
17584
+ seriesId: number().int(),
17585
+ ok: literal(true),
17586
+ deleted: TierRowsSchema
17587
+ }), object({
17588
+ seriesId: number().int(),
17589
+ ok: literal(false),
17590
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
17591
+ })]);
17592
+ var OrphanListSchema = object({
17593
+ series: array(OrphanSeriesSchema).readonly(),
17594
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
17595
+ truncated: boolean()
17596
+ });
17543
17597
  var DeviceHistoryStatusSchema = object({
17544
17598
  startedAt: number(),
17545
17599
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -17637,7 +17691,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
17637
17691
  }), object({ enabled: boolean() }), {
17638
17692
  kind: "mutation",
17639
17693
  auth: "admin"
17640
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
17694
+ }), 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() }), {
17695
+ kind: "mutation",
17696
+ auth: "admin"
17697
+ });
17641
17698
  var DeviceCaStatusSchema = discriminatedUnion("state", [
17642
17699
  object({ state: literal("absent") }),
17643
17700
  object({
@@ -48112,7 +48169,6 @@ var RecommendationReasonSchema = discriminatedUnion("kind", [
48112
48169
  modelId: string()
48113
48170
  }),
48114
48171
  object({ kind: literal("cpu-device") }),
48115
- object({ kind: literal("coral-untouched") }),
48116
48172
  object({ kind: literal("device-disabled") }),
48117
48173
  object({ kind: literal("device-unavailable") }),
48118
48174
  object({ kind: literal("node-offline") }),
@@ -48210,11 +48266,6 @@ var AutoTuneWarningSchema = discriminatedUnion("kind", [
48210
48266
  kind: literal("detector-store-unreadable"),
48211
48267
  error: string()
48212
48268
  }),
48213
- object({
48214
- kind: literal("coral-enabled"),
48215
- nodeId: string(),
48216
- deviceKey: string()
48217
- }),
48218
48269
  object({
48219
48270
  kind: literal("custom-pin-kept"),
48220
48271
  nodeId: string(),
@@ -54675,17 +54726,69 @@ object({
54675
54726
  });
54676
54727
  DeviceType.Sensor;
54677
54728
  /**
54678
- * Generic device-consumables capability — surfaces a device's
54679
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
54680
- * descaling cycles, …) with their remaining life and an optional
54681
- * "Replaced" reset action. Device-agnostic: any provider that knows its
54682
- * device tracks consumables can register it; the cap declares no
54683
- * vocabulary of its own — the provider names each item verbatim.
54729
+ * Generic device-consumables capability — the ONE place a device reports what
54730
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
54731
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
54732
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
54733
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
54734
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
54735
+ * its device tracks consumables registers it; the provider names each item
54736
+ * verbatim and says which `kind` it is.
54737
+ *
54738
+ * The admin UI renders it as ONE collapsible section directly under the
54739
+ * device page's hero card (`placement: 'hero'`), for every device bound to
54740
+ * this cap — never drawn by a device type's hero card itself (D915).
54684
54741
  *
54685
54742
  * Like `childLayout`, the cap is INERT until a provider sets items: no
54686
54743
  * provider populates it by guessing (no HA inference). The UI renders a
54687
54744
  * "No consumables reported" placeholder when `items` is empty.
54688
54745
  */
54746
+ /**
54747
+ * What an item IS, which decides which direction is bad:
54748
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
54749
+ * - `supply` — something the device draws from (clean water, detergent,
54750
+ * salt, rinse aid); low or empty is bad.
54751
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
54752
+ * bad.
54753
+ * Absent = `wear`.
54754
+ */
54755
+ var ConsumableKindSchema = _enum([
54756
+ "wear",
54757
+ "supply",
54758
+ "waste"
54759
+ ]);
54760
+ /**
54761
+ * What an item LOOKS like, which decides how a client draws it — independent
54762
+ * of `kind`, which decides which direction is bad:
54763
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
54764
+ * remaining time and a reset.
54765
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
54766
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
54767
+ * a stepped level and "refill".
54768
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
54769
+ * that warns when full.
54770
+ * Absent = derived from the kind ({@link consumableFormOf}).
54771
+ */
54772
+ var ConsumableFormSchema = _enum([
54773
+ "part",
54774
+ "tank",
54775
+ "product",
54776
+ "bin"
54777
+ ]);
54778
+ /** The provider's own discrete verdict on an item. */
54779
+ var ConsumableStatusSchema = _enum([
54780
+ "ok",
54781
+ "low",
54782
+ "empty",
54783
+ "full",
54784
+ "replace"
54785
+ ]);
54786
+ _enum([
54787
+ "ok",
54788
+ "low",
54789
+ "empty",
54790
+ "full"
54791
+ ]);
54689
54792
  /** Units a remaining-life counter is reported in. Closed: the panel renders
54690
54793
  * each. */
54691
54794
  var ConsumableRemainingUnitSchema = _enum([
@@ -54705,10 +54808,14 @@ var ConsumablesStatusSchema = object({
54705
54808
  key: string().min(1),
54706
54809
  /** Display name. */
54707
54810
  label: string().min(1),
54708
- /** Remaining life % when known (0..100). */
54811
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
54709
54812
  level: number().min(0).max(100).nullable(),
54710
- /** Discrete state when known (binary mode). */
54711
- status: _enum(["ok", "replace"]).nullable(),
54813
+ /** The provider's discrete verdict when known (binary mode). */
54814
+ status: ConsumableStatusSchema.nullable(),
54815
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
54816
+ kind: ConsumableKindSchema.optional(),
54817
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
54818
+ form: ConsumableFormSchema.optional(),
54712
54819
  /** Ms epoch of the last replace, when known. */
54713
54820
  lastResetAt: number().nullable(),
54714
54821
  /** Whether `reset()` is meaningful for this item. */
@@ -54943,8 +55050,9 @@ object({
54943
55050
  status: DeviceStatusSchema
54944
55051
  });
54945
55052
  /**
54946
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
54947
- * consumable levels (salt, rinse aid) and common program options.
55053
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
55054
+ * common program options. Salt and rinse aid are NOT here: they are items of
55055
+ * the device's `consumables` cap, like every other device's (D915).
54948
55056
  *
54949
55057
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
54950
55058
  * by any integration that exposes the same program / option surface.
@@ -54992,11 +55100,6 @@ var DishwasherAvailabilitySchema = _enum([
54992
55100
  "offline",
54993
55101
  "description-missing"
54994
55102
  ]);
54995
- var DishwasherConsumableLevelSchema = _enum([
54996
- "ok",
54997
- "low",
54998
- "empty"
54999
- ]);
55000
55103
  object({
55001
55104
  availability: DishwasherAvailabilitySchema,
55002
55105
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -55029,8 +55132,6 @@ object({
55029
55132
  powerOn: boolean().nullable(),
55030
55133
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
55031
55134
  powerState: string().nullable(),
55032
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
55033
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55034
55135
  /**
55035
55136
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
55036
55137
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -61813,60 +61914,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
61813
61914
  auth: "admin",
61814
61915
  access: "delete"
61815
61916
  });
61816
- /**
61817
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
61818
- * cleaning lifecycle plus a return-to-base / locate surface and an
61819
- * optional fan-speed selector.
61820
- *
61821
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
61822
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
61823
- * (0..100) is nullable — some vacuums don't report a battery
61824
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
61825
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
61826
- * tokens the hardware accepts so the UI renders only supported choices.
61827
- *
61828
- * The `setFanSpeed` method takes the bare `speed` token — the provider
61829
- * validates it against the vacuum's own list. `locate` triggers the
61830
- * find-me chirp; `returnToBase` sends it home.
61831
- *
61832
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
61833
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
61834
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
61835
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
61836
- * only when the device has no such tank at all, and use a `TankStatus`
61837
- * with both inner fields `null` when the tank exists but its level is
61838
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
61839
- * so the HA provider leaves all four `null`.
61840
- */
61841
- var VacuumStateSchema = _enum([
61842
- "idle",
61843
- "cleaning",
61844
- "paused",
61845
- "returning",
61846
- "docked",
61847
- "drying",
61848
- "error"
61849
- ]);
61850
- /**
61851
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
61852
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
61853
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
61854
- * level is currently unknown; the OWNING field being `null` means the
61855
- * hardware has no such tank at all.
61856
- */
61857
- var TankStatusSchema = object({
61858
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
61859
- level: number().min(0).max(100).nullable(),
61860
- /** Discrete state when the hardware is binary-mode; null otherwise. */
61861
- status: _enum([
61862
- "ok",
61863
- "low",
61864
- "full"
61865
- ]).nullable()
61866
- });
61867
61917
  object({
61868
61918
  /** Lifecycle state of the vacuum. */
61869
- state: VacuumStateSchema,
61919
+ state: _enum([
61920
+ "idle",
61921
+ "cleaning",
61922
+ "paused",
61923
+ "returning",
61924
+ "docked",
61925
+ "drying",
61926
+ "error"
61927
+ ]),
61870
61928
  /** 0..100 battery percentage. Null when the device has no battery
61871
61929
  * reading. */
61872
61930
  batteryLevel: number().min(0).max(100).nullable(),
@@ -61875,14 +61933,6 @@ object({
61875
61933
  fanSpeed: string().nullable(),
61876
61934
  /** Speed tokens the hardware accepts — drives the UI selector. */
61877
61935
  availableFanSpeeds: array(string()),
61878
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
61879
- cleanWater: TankStatusSchema.nullable(),
61880
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
61881
- dirtyWater: TankStatusSchema.nullable(),
61882
- /** Detergent tank. Null when the hardware has no detergent tank. */
61883
- detergent: TankStatusSchema.nullable(),
61884
- /** Dust bin. Null when the hardware has no dust bin. */
61885
- dustBin: TankStatusSchema.nullable(),
61886
61936
  /** 0..100 cleaning-completion percentage of the current task, or null. */
61887
61937
  progressPercent: number().min(0).max(100).nullable(),
61888
61938
  /** Current error code (0 / null = no error). */
@@ -64423,6 +64473,12 @@ Object.freeze({
64423
64473
  addonId: null,
64424
64474
  access: "create"
64425
64475
  },
64476
+ "deviceHistory.deleteOrphanSeries": {
64477
+ capName: "device-history",
64478
+ capScope: "system",
64479
+ addonId: null,
64480
+ access: "delete"
64481
+ },
64426
64482
  "deviceHistory.getDeviceEnabled": {
64427
64483
  capName: "device-history",
64428
64484
  capScope: "system",
@@ -64441,6 +64497,12 @@ Object.freeze({
64441
64497
  addonId: null,
64442
64498
  access: "view"
64443
64499
  },
64500
+ "deviceHistory.listOrphanSeries": {
64501
+ capName: "device-history",
64502
+ capScope: "system",
64503
+ addonId: null,
64504
+ access: "view"
64505
+ },
64444
64506
  "deviceHistory.listSeries": {
64445
64507
  capName: "device-history",
64446
64508
  capScope: "system",
@@ -74446,7 +74508,7 @@ var STATE_SUMMARY_VARS = [
74446
74508
  ([...RULE_TEXT], [...COMBINED_ALARM]),
74447
74509
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
74448
74510
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
74449
- ([...RULE_TEXT], [...CONSUMABLE]),
74511
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
74450
74512
  ([...RULE_TEXT], [...TANK]),
74451
74513
  [...RULE_TEXT],
74452
74514
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
@@ -5564,7 +5564,7 @@ var ZodIssueCode = {
5564
5564
  var ZodFirstPartyTypeKind;
5565
5565
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5566
5566
  //#endregion
5567
- //#region ../types/dist/sleep-DJFUfKvA.mjs
5567
+ //#region ../types/dist/sleep-CUp20JkO.mjs
5568
5568
  /**
5569
5569
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5570
5570
  * window to float samples (D455).
@@ -8644,7 +8644,11 @@ var ContributionSectionSchema = object({
8644
8644
  literal(4)
8645
8645
  ]).optional(),
8646
8646
  tab: string().optional(),
8647
- location: _enum(["settings", "top-tab"]).optional(),
8647
+ location: _enum([
8648
+ "settings",
8649
+ "top-tab",
8650
+ "hero"
8651
+ ]).optional(),
8648
8652
  order: number().optional(),
8649
8653
  fields: array(any())
8650
8654
  });
@@ -13713,7 +13717,11 @@ var ConfigSectionWithValuesSchema = object({
13713
13717
  literal(4)
13714
13718
  ]).optional(),
13715
13719
  tab: string().optional(),
13716
- location: _enum(["settings", "top-tab"]).optional(),
13720
+ location: _enum([
13721
+ "settings",
13722
+ "top-tab",
13723
+ "hero"
13724
+ ]).optional(),
13717
13725
  order: number().optional(),
13718
13726
  fields: array(any())
13719
13727
  });
@@ -17536,6 +17544,52 @@ var TierStatusSchema = object({
17536
17544
  countedAt: number().nullable()
17537
17545
  });
17538
17546
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
17547
+ /**
17548
+ * Why a series is orphan. `device-gone`: its device is absent from the
17549
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
17550
+ * key is declared by no capability any more (a field a cap removed).
17551
+ */
17552
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
17553
+ /** Rows held per stored tier. */
17554
+ var TierRowsSchema = object({
17555
+ raw: number().int(),
17556
+ "5m": number().int(),
17557
+ "1h": number().int(),
17558
+ "1d": number().int()
17559
+ });
17560
+ var OrphanSeriesSchema = object({
17561
+ seriesId: number().int(),
17562
+ deviceId: number().int(),
17563
+ key: string(),
17564
+ scope: string(),
17565
+ /** The metric's display name; `null` when its metric row is gone too. */
17566
+ displayName: string().nullable(),
17567
+ reason: DeviceHistoryOrphanReasonSchema,
17568
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
17569
+ missingSince: number().nullable(),
17570
+ firstTs: number(),
17571
+ lastTs: number(),
17572
+ rows: TierRowsSchema
17573
+ });
17574
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
17575
+ "not-found",
17576
+ "not-orphan",
17577
+ "failed"
17578
+ ]);
17579
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
17580
+ seriesId: number().int(),
17581
+ ok: literal(true),
17582
+ deleted: TierRowsSchema
17583
+ }), object({
17584
+ seriesId: number().int(),
17585
+ ok: literal(false),
17586
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
17587
+ })]);
17588
+ var OrphanListSchema = object({
17589
+ series: array(OrphanSeriesSchema).readonly(),
17590
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
17591
+ truncated: boolean()
17592
+ });
17539
17593
  var DeviceHistoryStatusSchema = object({
17540
17594
  startedAt: number(),
17541
17595
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -17633,7 +17687,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
17633
17687
  }), object({ enabled: boolean() }), {
17634
17688
  kind: "mutation",
17635
17689
  auth: "admin"
17636
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
17690
+ }), 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() }), {
17691
+ kind: "mutation",
17692
+ auth: "admin"
17693
+ });
17637
17694
  var DeviceCaStatusSchema = discriminatedUnion("state", [
17638
17695
  object({ state: literal("absent") }),
17639
17696
  object({
@@ -48108,7 +48165,6 @@ var RecommendationReasonSchema = discriminatedUnion("kind", [
48108
48165
  modelId: string()
48109
48166
  }),
48110
48167
  object({ kind: literal("cpu-device") }),
48111
- object({ kind: literal("coral-untouched") }),
48112
48168
  object({ kind: literal("device-disabled") }),
48113
48169
  object({ kind: literal("device-unavailable") }),
48114
48170
  object({ kind: literal("node-offline") }),
@@ -48206,11 +48262,6 @@ var AutoTuneWarningSchema = discriminatedUnion("kind", [
48206
48262
  kind: literal("detector-store-unreadable"),
48207
48263
  error: string()
48208
48264
  }),
48209
- object({
48210
- kind: literal("coral-enabled"),
48211
- nodeId: string(),
48212
- deviceKey: string()
48213
- }),
48214
48265
  object({
48215
48266
  kind: literal("custom-pin-kept"),
48216
48267
  nodeId: string(),
@@ -54671,17 +54722,69 @@ object({
54671
54722
  });
54672
54723
  DeviceType.Sensor;
54673
54724
  /**
54674
- * Generic device-consumables capability — surfaces a device's
54675
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
54676
- * descaling cycles, …) with their remaining life and an optional
54677
- * "Replaced" reset action. Device-agnostic: any provider that knows its
54678
- * device tracks consumables can register it; the cap declares no
54679
- * vocabulary of its own — the provider names each item verbatim.
54725
+ * Generic device-consumables capability — the ONE place a device reports what
54726
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
54727
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
54728
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
54729
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
54730
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
54731
+ * its device tracks consumables registers it; the provider names each item
54732
+ * verbatim and says which `kind` it is.
54733
+ *
54734
+ * The admin UI renders it as ONE collapsible section directly under the
54735
+ * device page's hero card (`placement: 'hero'`), for every device bound to
54736
+ * this cap — never drawn by a device type's hero card itself (D915).
54680
54737
  *
54681
54738
  * Like `childLayout`, the cap is INERT until a provider sets items: no
54682
54739
  * provider populates it by guessing (no HA inference). The UI renders a
54683
54740
  * "No consumables reported" placeholder when `items` is empty.
54684
54741
  */
54742
+ /**
54743
+ * What an item IS, which decides which direction is bad:
54744
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
54745
+ * - `supply` — something the device draws from (clean water, detergent,
54746
+ * salt, rinse aid); low or empty is bad.
54747
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
54748
+ * bad.
54749
+ * Absent = `wear`.
54750
+ */
54751
+ var ConsumableKindSchema = _enum([
54752
+ "wear",
54753
+ "supply",
54754
+ "waste"
54755
+ ]);
54756
+ /**
54757
+ * What an item LOOKS like, which decides how a client draws it — independent
54758
+ * of `kind`, which decides which direction is bad:
54759
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
54760
+ * remaining time and a reset.
54761
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
54762
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
54763
+ * a stepped level and "refill".
54764
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
54765
+ * that warns when full.
54766
+ * Absent = derived from the kind ({@link consumableFormOf}).
54767
+ */
54768
+ var ConsumableFormSchema = _enum([
54769
+ "part",
54770
+ "tank",
54771
+ "product",
54772
+ "bin"
54773
+ ]);
54774
+ /** The provider's own discrete verdict on an item. */
54775
+ var ConsumableStatusSchema = _enum([
54776
+ "ok",
54777
+ "low",
54778
+ "empty",
54779
+ "full",
54780
+ "replace"
54781
+ ]);
54782
+ _enum([
54783
+ "ok",
54784
+ "low",
54785
+ "empty",
54786
+ "full"
54787
+ ]);
54685
54788
  /** Units a remaining-life counter is reported in. Closed: the panel renders
54686
54789
  * each. */
54687
54790
  var ConsumableRemainingUnitSchema = _enum([
@@ -54701,10 +54804,14 @@ var ConsumablesStatusSchema = object({
54701
54804
  key: string().min(1),
54702
54805
  /** Display name. */
54703
54806
  label: string().min(1),
54704
- /** Remaining life % when known (0..100). */
54807
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
54705
54808
  level: number().min(0).max(100).nullable(),
54706
- /** Discrete state when known (binary mode). */
54707
- status: _enum(["ok", "replace"]).nullable(),
54809
+ /** The provider's discrete verdict when known (binary mode). */
54810
+ status: ConsumableStatusSchema.nullable(),
54811
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
54812
+ kind: ConsumableKindSchema.optional(),
54813
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
54814
+ form: ConsumableFormSchema.optional(),
54708
54815
  /** Ms epoch of the last replace, when known. */
54709
54816
  lastResetAt: number().nullable(),
54710
54817
  /** Whether `reset()` is meaningful for this item. */
@@ -54939,8 +55046,9 @@ object({
54939
55046
  status: DeviceStatusSchema
54940
55047
  });
54941
55048
  /**
54942
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
54943
- * consumable levels (salt, rinse aid) and common program options.
55049
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
55050
+ * common program options. Salt and rinse aid are NOT here: they are items of
55051
+ * the device's `consumables` cap, like every other device's (D915).
54944
55052
  *
54945
55053
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
54946
55054
  * by any integration that exposes the same program / option surface.
@@ -54988,11 +55096,6 @@ var DishwasherAvailabilitySchema = _enum([
54988
55096
  "offline",
54989
55097
  "description-missing"
54990
55098
  ]);
54991
- var DishwasherConsumableLevelSchema = _enum([
54992
- "ok",
54993
- "low",
54994
- "empty"
54995
- ]);
54996
55099
  object({
54997
55100
  availability: DishwasherAvailabilitySchema,
54998
55101
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -55025,8 +55128,6 @@ object({
55025
55128
  powerOn: boolean().nullable(),
55026
55129
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
55027
55130
  powerState: string().nullable(),
55028
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
55029
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55030
55131
  /**
55031
55132
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
55032
55133
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -61809,60 +61910,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
61809
61910
  auth: "admin",
61810
61911
  access: "delete"
61811
61912
  });
61812
- /**
61813
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
61814
- * cleaning lifecycle plus a return-to-base / locate surface and an
61815
- * optional fan-speed selector.
61816
- *
61817
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
61818
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
61819
- * (0..100) is nullable — some vacuums don't report a battery
61820
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
61821
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
61822
- * tokens the hardware accepts so the UI renders only supported choices.
61823
- *
61824
- * The `setFanSpeed` method takes the bare `speed` token — the provider
61825
- * validates it against the vacuum's own list. `locate` triggers the
61826
- * find-me chirp; `returnToBase` sends it home.
61827
- *
61828
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
61829
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
61830
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
61831
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
61832
- * only when the device has no such tank at all, and use a `TankStatus`
61833
- * with both inner fields `null` when the tank exists but its level is
61834
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
61835
- * so the HA provider leaves all four `null`.
61836
- */
61837
- var VacuumStateSchema = _enum([
61838
- "idle",
61839
- "cleaning",
61840
- "paused",
61841
- "returning",
61842
- "docked",
61843
- "drying",
61844
- "error"
61845
- ]);
61846
- /**
61847
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
61848
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
61849
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
61850
- * level is currently unknown; the OWNING field being `null` means the
61851
- * hardware has no such tank at all.
61852
- */
61853
- var TankStatusSchema = object({
61854
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
61855
- level: number().min(0).max(100).nullable(),
61856
- /** Discrete state when the hardware is binary-mode; null otherwise. */
61857
- status: _enum([
61858
- "ok",
61859
- "low",
61860
- "full"
61861
- ]).nullable()
61862
- });
61863
61913
  object({
61864
61914
  /** Lifecycle state of the vacuum. */
61865
- state: VacuumStateSchema,
61915
+ state: _enum([
61916
+ "idle",
61917
+ "cleaning",
61918
+ "paused",
61919
+ "returning",
61920
+ "docked",
61921
+ "drying",
61922
+ "error"
61923
+ ]),
61866
61924
  /** 0..100 battery percentage. Null when the device has no battery
61867
61925
  * reading. */
61868
61926
  batteryLevel: number().min(0).max(100).nullable(),
@@ -61871,14 +61929,6 @@ object({
61871
61929
  fanSpeed: string().nullable(),
61872
61930
  /** Speed tokens the hardware accepts — drives the UI selector. */
61873
61931
  availableFanSpeeds: array(string()),
61874
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
61875
- cleanWater: TankStatusSchema.nullable(),
61876
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
61877
- dirtyWater: TankStatusSchema.nullable(),
61878
- /** Detergent tank. Null when the hardware has no detergent tank. */
61879
- detergent: TankStatusSchema.nullable(),
61880
- /** Dust bin. Null when the hardware has no dust bin. */
61881
- dustBin: TankStatusSchema.nullable(),
61882
61932
  /** 0..100 cleaning-completion percentage of the current task, or null. */
61883
61933
  progressPercent: number().min(0).max(100).nullable(),
61884
61934
  /** Current error code (0 / null = no error). */
@@ -64419,6 +64469,12 @@ Object.freeze({
64419
64469
  addonId: null,
64420
64470
  access: "create"
64421
64471
  },
64472
+ "deviceHistory.deleteOrphanSeries": {
64473
+ capName: "device-history",
64474
+ capScope: "system",
64475
+ addonId: null,
64476
+ access: "delete"
64477
+ },
64422
64478
  "deviceHistory.getDeviceEnabled": {
64423
64479
  capName: "device-history",
64424
64480
  capScope: "system",
@@ -64437,6 +64493,12 @@ Object.freeze({
64437
64493
  addonId: null,
64438
64494
  access: "view"
64439
64495
  },
64496
+ "deviceHistory.listOrphanSeries": {
64497
+ capName: "device-history",
64498
+ capScope: "system",
64499
+ addonId: null,
64500
+ access: "view"
64501
+ },
64440
64502
  "deviceHistory.listSeries": {
64441
64503
  capName: "device-history",
64442
64504
  capScope: "system",
@@ -74442,7 +74504,7 @@ var STATE_SUMMARY_VARS = [
74442
74504
  ([...RULE_TEXT], [...COMBINED_ALARM]),
74443
74505
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
74444
74506
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
74445
- ([...RULE_TEXT], [...CONSUMABLE]),
74507
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
74446
74508
  ([...RULE_TEXT], [...TANK]),
74447
74509
  [...RULE_TEXT],
74448
74510
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-google-services",
3
- "version": "0.2.25",
3
+ "version": "0.2.27",
4
4
  "description": "Google Services — Google brokers (OAuth2): Calendar as calendar-source, Gmail send as smtp-provider.",
5
5
  "keywords": [
6
6
  "camstack",