@camstack/addon-pipeline 1.2.618 → 1.2.619

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 (38) hide show
  1. package/dist/audio-analyzer/index.js +3 -3
  2. package/dist/audio-analyzer/index.mjs +3 -3
  3. package/dist/{custom-model-catalog-Yu1sxc4A.js → custom-model-catalog-Cn0kRD3w.js} +2 -2
  4. package/dist/{custom-model-catalog-BT8HKaes.mjs → custom-model-catalog-CtwTRnkw.mjs} +2 -2
  5. package/dist/detection-pipeline/index.js +153 -6
  6. package/dist/detection-pipeline/index.mjs +153 -6
  7. package/dist/{dist-CGDR6bSg.js → dist-CKI0TPq_.js} +151 -83
  8. package/dist/{dist-OImyOnr3.mjs → dist-L2gIYUSW.mjs} +151 -83
  9. package/dist/{model-catalogs-Cj101H8x.mjs → model-catalogs-BEL5IntY.mjs} +1 -1
  10. package/dist/{model-catalogs-DV562sqJ.js → model-catalogs-CvjhHSYH.js} +1 -1
  11. package/dist/motion-wasm/index.js +1 -1
  12. package/dist/motion-wasm/index.mjs +1 -1
  13. package/dist/{node-DciF_ZRl.mjs → node-BTcllpO8.mjs} +1 -1
  14. package/dist/{node-CSFdbFlw.js → node-Cl9jPP-W.js} +1 -1
  15. package/dist/pipeline-runner/index.js +52 -20
  16. package/dist/pipeline-runner/index.mjs +52 -20
  17. package/dist/{process-memory-DjIov9TF.mjs → process-memory-BZysh_Ow.mjs} +1 -1
  18. package/dist/{process-memory-CJEkTpRM.js → process-memory-oCLpTRfC.js} +1 -1
  19. package/dist/recorder/index.js +2 -72
  20. package/dist/recorder/index.mjs +2 -72
  21. package/dist/{segment-demux-js-BsqG99U7.js → segment-demux-js-BYhSnRdH.js} +1 -1
  22. package/dist/{segment-demux-js-B5PU-E-G.mjs → segment-demux-js-CRLu3mac.mjs} +1 -1
  23. package/dist/stream-broker/_stub.js +2 -2
  24. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-BZysHyCo.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-CUjRbxP-.mjs} +3 -3
  25. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BaoBRCJs.mjs +26 -0
  26. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BRT-stIJ.mjs +26 -0
  27. package/dist/stream-broker/demux-worker-child.js +1 -1
  28. package/dist/stream-broker/demux-worker-child.mjs +1 -1
  29. package/dist/stream-broker/{hostInit-NqO2jvV2.mjs → hostInit-DXO96V0R.mjs} +3 -3
  30. package/dist/stream-broker/index.js +3 -3
  31. package/dist/stream-broker/index.mjs +3 -3
  32. package/dist/stream-broker/remoteEntry.js +1 -1
  33. package/package.json +1 -1
  34. package/python/inference_pool.py +2 -0
  35. package/python/pool_platform.py +35 -0
  36. package/python/test_pool_platform.py +48 -0
  37. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-C1yyuAzs.mjs +0 -26
  38. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-TnEvW5tZ.mjs +0 -26
@@ -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).
@@ -8773,7 +8773,11 @@ var ContributionSectionSchema = object({
8773
8773
  literal(4)
8774
8774
  ]).optional(),
8775
8775
  tab: string().optional(),
8776
- location: _enum(["settings", "top-tab"]).optional(),
8776
+ location: _enum([
8777
+ "settings",
8778
+ "top-tab",
8779
+ "hero"
8780
+ ]).optional(),
8777
8781
  order: number().optional(),
8778
8782
  fields: array(any())
8779
8783
  });
@@ -16072,7 +16076,11 @@ var ConfigSectionWithValuesSchema = object({
16072
16076
  literal(4)
16073
16077
  ]).optional(),
16074
16078
  tab: string().optional(),
16075
- location: _enum(["settings", "top-tab"]).optional(),
16079
+ location: _enum([
16080
+ "settings",
16081
+ "top-tab",
16082
+ "hero"
16083
+ ]).optional(),
16076
16084
  order: number().optional(),
16077
16085
  fields: array(any())
16078
16086
  });
@@ -20318,6 +20326,52 @@ var TierStatusSchema = object({
20318
20326
  countedAt: number().nullable()
20319
20327
  });
20320
20328
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
20329
+ /**
20330
+ * Why a series is orphan. `device-gone`: its device is absent from the
20331
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
20332
+ * key is declared by no capability any more (a field a cap removed).
20333
+ */
20334
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
20335
+ /** Rows held per stored tier. */
20336
+ var TierRowsSchema = object({
20337
+ raw: number().int(),
20338
+ "5m": number().int(),
20339
+ "1h": number().int(),
20340
+ "1d": number().int()
20341
+ });
20342
+ var OrphanSeriesSchema = object({
20343
+ seriesId: number().int(),
20344
+ deviceId: number().int(),
20345
+ key: string(),
20346
+ scope: string(),
20347
+ /** The metric's display name; `null` when its metric row is gone too. */
20348
+ displayName: string().nullable(),
20349
+ reason: DeviceHistoryOrphanReasonSchema,
20350
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
20351
+ missingSince: number().nullable(),
20352
+ firstTs: number(),
20353
+ lastTs: number(),
20354
+ rows: TierRowsSchema
20355
+ });
20356
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
20357
+ "not-found",
20358
+ "not-orphan",
20359
+ "failed"
20360
+ ]);
20361
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
20362
+ seriesId: number().int(),
20363
+ ok: literal(true),
20364
+ deleted: TierRowsSchema
20365
+ }), object({
20366
+ seriesId: number().int(),
20367
+ ok: literal(false),
20368
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
20369
+ })]);
20370
+ var OrphanListSchema = object({
20371
+ series: array(OrphanSeriesSchema).readonly(),
20372
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
20373
+ truncated: boolean()
20374
+ });
20321
20375
  var DeviceHistoryStatusSchema = object({
20322
20376
  startedAt: number(),
20323
20377
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -20415,7 +20469,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
20415
20469
  }), object({ enabled: boolean() }), {
20416
20470
  kind: "mutation",
20417
20471
  auth: "admin"
20418
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
20472
+ }), 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() }), {
20473
+ kind: "mutation",
20474
+ auth: "admin"
20475
+ });
20419
20476
  var DeviceCaStatusSchema = discriminatedUnion("state", [
20420
20477
  object({ state: literal("absent") }),
20421
20478
  object({
@@ -58828,17 +58885,69 @@ object({
58828
58885
  });
58829
58886
  DeviceType.Sensor;
58830
58887
  /**
58831
- * Generic device-consumables capability — surfaces a device's
58832
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
58833
- * descaling cycles, …) with their remaining life and an optional
58834
- * "Replaced" reset action. Device-agnostic: any provider that knows its
58835
- * device tracks consumables can register it; the cap declares no
58836
- * vocabulary of its own — the provider names each item verbatim.
58888
+ * Generic device-consumables capability — the ONE place a device reports what
58889
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
58890
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
58891
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
58892
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
58893
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
58894
+ * its device tracks consumables registers it; the provider names each item
58895
+ * verbatim and says which `kind` it is.
58896
+ *
58897
+ * The admin UI renders it as ONE collapsible section directly under the
58898
+ * device page's hero card (`placement: 'hero'`), for every device bound to
58899
+ * this cap — never drawn by a device type's hero card itself (D915).
58837
58900
  *
58838
58901
  * Like `childLayout`, the cap is INERT until a provider sets items: no
58839
58902
  * provider populates it by guessing (no HA inference). The UI renders a
58840
58903
  * "No consumables reported" placeholder when `items` is empty.
58841
58904
  */
58905
+ /**
58906
+ * What an item IS, which decides which direction is bad:
58907
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
58908
+ * - `supply` — something the device draws from (clean water, detergent,
58909
+ * salt, rinse aid); low or empty is bad.
58910
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
58911
+ * bad.
58912
+ * Absent = `wear`.
58913
+ */
58914
+ var ConsumableKindSchema = _enum([
58915
+ "wear",
58916
+ "supply",
58917
+ "waste"
58918
+ ]);
58919
+ /**
58920
+ * What an item LOOKS like, which decides how a client draws it — independent
58921
+ * of `kind`, which decides which direction is bad:
58922
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
58923
+ * remaining time and a reset.
58924
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
58925
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
58926
+ * a stepped level and "refill".
58927
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
58928
+ * that warns when full.
58929
+ * Absent = derived from the kind ({@link consumableFormOf}).
58930
+ */
58931
+ var ConsumableFormSchema = _enum([
58932
+ "part",
58933
+ "tank",
58934
+ "product",
58935
+ "bin"
58936
+ ]);
58937
+ /** The provider's own discrete verdict on an item. */
58938
+ var ConsumableStatusSchema = _enum([
58939
+ "ok",
58940
+ "low",
58941
+ "empty",
58942
+ "full",
58943
+ "replace"
58944
+ ]);
58945
+ _enum([
58946
+ "ok",
58947
+ "low",
58948
+ "empty",
58949
+ "full"
58950
+ ]);
58842
58951
  /** Units a remaining-life counter is reported in. Closed: the panel renders
58843
58952
  * each. */
58844
58953
  var ConsumableRemainingUnitSchema = _enum([
@@ -58858,10 +58967,14 @@ var ConsumablesStatusSchema = object({
58858
58967
  key: string().min(1),
58859
58968
  /** Display name. */
58860
58969
  label: string().min(1),
58861
- /** Remaining life % when known (0..100). */
58970
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
58862
58971
  level: number().min(0).max(100).nullable(),
58863
- /** Discrete state when known (binary mode). */
58864
- status: _enum(["ok", "replace"]).nullable(),
58972
+ /** The provider's discrete verdict when known (binary mode). */
58973
+ status: ConsumableStatusSchema.nullable(),
58974
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
58975
+ kind: ConsumableKindSchema.optional(),
58976
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
58977
+ form: ConsumableFormSchema.optional(),
58865
58978
  /** Ms epoch of the last replace, when known. */
58866
58979
  lastResetAt: number().nullable(),
58867
58980
  /** Whether `reset()` is meaningful for this item. */
@@ -59096,8 +59209,9 @@ object({
59096
59209
  status: DeviceStatusSchema
59097
59210
  });
59098
59211
  /**
59099
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
59100
- * consumable levels (salt, rinse aid) and common program options.
59212
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
59213
+ * common program options. Salt and rinse aid are NOT here: they are items of
59214
+ * the device's `consumables` cap, like every other device's (D915).
59101
59215
  *
59102
59216
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
59103
59217
  * by any integration that exposes the same program / option surface.
@@ -59145,11 +59259,6 @@ var DishwasherAvailabilitySchema = _enum([
59145
59259
  "offline",
59146
59260
  "description-missing"
59147
59261
  ]);
59148
- var DishwasherConsumableLevelSchema = _enum([
59149
- "ok",
59150
- "low",
59151
- "empty"
59152
- ]);
59153
59262
  object({
59154
59263
  availability: DishwasherAvailabilitySchema,
59155
59264
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -59182,8 +59291,6 @@ object({
59182
59291
  powerOn: boolean().nullable(),
59183
59292
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
59184
59293
  powerState: string().nullable(),
59185
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
59186
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
59187
59294
  /**
59188
59295
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
59189
59296
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -66490,60 +66597,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
66490
66597
  auth: "admin",
66491
66598
  access: "delete"
66492
66599
  });
66493
- /**
66494
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
66495
- * cleaning lifecycle plus a return-to-base / locate surface and an
66496
- * optional fan-speed selector.
66497
- *
66498
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
66499
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
66500
- * (0..100) is nullable — some vacuums don't report a battery
66501
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
66502
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
66503
- * tokens the hardware accepts so the UI renders only supported choices.
66504
- *
66505
- * The `setFanSpeed` method takes the bare `speed` token — the provider
66506
- * validates it against the vacuum's own list. `locate` triggers the
66507
- * find-me chirp; `returnToBase` sends it home.
66508
- *
66509
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
66510
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
66511
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
66512
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
66513
- * only when the device has no such tank at all, and use a `TankStatus`
66514
- * with both inner fields `null` when the tank exists but its level is
66515
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
66516
- * so the HA provider leaves all four `null`.
66517
- */
66518
- var VacuumStateSchema = _enum([
66519
- "idle",
66520
- "cleaning",
66521
- "paused",
66522
- "returning",
66523
- "docked",
66524
- "drying",
66525
- "error"
66526
- ]);
66527
- /**
66528
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
66529
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
66530
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
66531
- * level is currently unknown; the OWNING field being `null` means the
66532
- * hardware has no such tank at all.
66533
- */
66534
- var TankStatusSchema = object({
66535
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
66536
- level: number().min(0).max(100).nullable(),
66537
- /** Discrete state when the hardware is binary-mode; null otherwise. */
66538
- status: _enum([
66539
- "ok",
66540
- "low",
66541
- "full"
66542
- ]).nullable()
66543
- });
66544
66600
  object({
66545
66601
  /** Lifecycle state of the vacuum. */
66546
- state: VacuumStateSchema,
66602
+ state: _enum([
66603
+ "idle",
66604
+ "cleaning",
66605
+ "paused",
66606
+ "returning",
66607
+ "docked",
66608
+ "drying",
66609
+ "error"
66610
+ ]),
66547
66611
  /** 0..100 battery percentage. Null when the device has no battery
66548
66612
  * reading. */
66549
66613
  batteryLevel: number().min(0).max(100).nullable(),
@@ -66552,14 +66616,6 @@ object({
66552
66616
  fanSpeed: string().nullable(),
66553
66617
  /** Speed tokens the hardware accepts — drives the UI selector. */
66554
66618
  availableFanSpeeds: array(string()),
66555
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
66556
- cleanWater: TankStatusSchema.nullable(),
66557
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
66558
- dirtyWater: TankStatusSchema.nullable(),
66559
- /** Detergent tank. Null when the hardware has no detergent tank. */
66560
- detergent: TankStatusSchema.nullable(),
66561
- /** Dust bin. Null when the hardware has no dust bin. */
66562
- dustBin: TankStatusSchema.nullable(),
66563
66619
  /** 0..100 cleaning-completion percentage of the current task, or null. */
66564
66620
  progressPercent: number().min(0).max(100).nullable(),
66565
66621
  /** Current error code (0 / null = no error). */
@@ -69118,6 +69174,12 @@ Object.freeze({
69118
69174
  addonId: null,
69119
69175
  access: "create"
69120
69176
  },
69177
+ "deviceHistory.deleteOrphanSeries": {
69178
+ capName: "device-history",
69179
+ capScope: "system",
69180
+ addonId: null,
69181
+ access: "delete"
69182
+ },
69121
69183
  "deviceHistory.getDeviceEnabled": {
69122
69184
  capName: "device-history",
69123
69185
  capScope: "system",
@@ -69136,6 +69198,12 @@ Object.freeze({
69136
69198
  addonId: null,
69137
69199
  access: "view"
69138
69200
  },
69201
+ "deviceHistory.listOrphanSeries": {
69202
+ capName: "device-history",
69203
+ capScope: "system",
69204
+ addonId: null,
69205
+ access: "view"
69206
+ },
69139
69207
  "deviceHistory.listSeries": {
69140
69208
  capName: "device-history",
69141
69209
  capScope: "system",
@@ -79191,7 +79259,7 @@ var STATE_SUMMARY_VARS = [
79191
79259
  ([...RULE_TEXT], [...COMBINED_ALARM]),
79192
79260
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
79193
79261
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
79194
- ([...RULE_TEXT], [...CONSUMABLE]),
79262
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
79195
79263
  ([...RULE_TEXT], [...TANK]),
79196
79264
  [...RULE_TEXT],
79197
79265
  ([...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).
@@ -8773,7 +8773,11 @@ var ContributionSectionSchema = object({
8773
8773
  literal(4)
8774
8774
  ]).optional(),
8775
8775
  tab: string().optional(),
8776
- location: _enum(["settings", "top-tab"]).optional(),
8776
+ location: _enum([
8777
+ "settings",
8778
+ "top-tab",
8779
+ "hero"
8780
+ ]).optional(),
8777
8781
  order: number().optional(),
8778
8782
  fields: array(any())
8779
8783
  });
@@ -16072,7 +16076,11 @@ var ConfigSectionWithValuesSchema = object({
16072
16076
  literal(4)
16073
16077
  ]).optional(),
16074
16078
  tab: string().optional(),
16075
- location: _enum(["settings", "top-tab"]).optional(),
16079
+ location: _enum([
16080
+ "settings",
16081
+ "top-tab",
16082
+ "hero"
16083
+ ]).optional(),
16076
16084
  order: number().optional(),
16077
16085
  fields: array(any())
16078
16086
  });
@@ -20318,6 +20326,52 @@ var TierStatusSchema = object({
20318
20326
  countedAt: number().nullable()
20319
20327
  });
20320
20328
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
20329
+ /**
20330
+ * Why a series is orphan. `device-gone`: its device is absent from the
20331
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
20332
+ * key is declared by no capability any more (a field a cap removed).
20333
+ */
20334
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
20335
+ /** Rows held per stored tier. */
20336
+ var TierRowsSchema = object({
20337
+ raw: number().int(),
20338
+ "5m": number().int(),
20339
+ "1h": number().int(),
20340
+ "1d": number().int()
20341
+ });
20342
+ var OrphanSeriesSchema = object({
20343
+ seriesId: number().int(),
20344
+ deviceId: number().int(),
20345
+ key: string(),
20346
+ scope: string(),
20347
+ /** The metric's display name; `null` when its metric row is gone too. */
20348
+ displayName: string().nullable(),
20349
+ reason: DeviceHistoryOrphanReasonSchema,
20350
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
20351
+ missingSince: number().nullable(),
20352
+ firstTs: number(),
20353
+ lastTs: number(),
20354
+ rows: TierRowsSchema
20355
+ });
20356
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
20357
+ "not-found",
20358
+ "not-orphan",
20359
+ "failed"
20360
+ ]);
20361
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
20362
+ seriesId: number().int(),
20363
+ ok: literal(true),
20364
+ deleted: TierRowsSchema
20365
+ }), object({
20366
+ seriesId: number().int(),
20367
+ ok: literal(false),
20368
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
20369
+ })]);
20370
+ var OrphanListSchema = object({
20371
+ series: array(OrphanSeriesSchema).readonly(),
20372
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
20373
+ truncated: boolean()
20374
+ });
20321
20375
  var DeviceHistoryStatusSchema = object({
20322
20376
  startedAt: number(),
20323
20377
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -20415,7 +20469,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
20415
20469
  }), object({ enabled: boolean() }), {
20416
20470
  kind: "mutation",
20417
20471
  auth: "admin"
20418
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
20472
+ }), 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() }), {
20473
+ kind: "mutation",
20474
+ auth: "admin"
20475
+ });
20419
20476
  var DeviceCaStatusSchema = discriminatedUnion("state", [
20420
20477
  object({ state: literal("absent") }),
20421
20478
  object({
@@ -58828,17 +58885,69 @@ object({
58828
58885
  });
58829
58886
  DeviceType.Sensor;
58830
58887
  /**
58831
- * Generic device-consumables capability — surfaces a device's
58832
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
58833
- * descaling cycles, …) with their remaining life and an optional
58834
- * "Replaced" reset action. Device-agnostic: any provider that knows its
58835
- * device tracks consumables can register it; the cap declares no
58836
- * vocabulary of its own — the provider names each item verbatim.
58888
+ * Generic device-consumables capability — the ONE place a device reports what
58889
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
58890
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
58891
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
58892
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
58893
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
58894
+ * its device tracks consumables registers it; the provider names each item
58895
+ * verbatim and says which `kind` it is.
58896
+ *
58897
+ * The admin UI renders it as ONE collapsible section directly under the
58898
+ * device page's hero card (`placement: 'hero'`), for every device bound to
58899
+ * this cap — never drawn by a device type's hero card itself (D915).
58837
58900
  *
58838
58901
  * Like `childLayout`, the cap is INERT until a provider sets items: no
58839
58902
  * provider populates it by guessing (no HA inference). The UI renders a
58840
58903
  * "No consumables reported" placeholder when `items` is empty.
58841
58904
  */
58905
+ /**
58906
+ * What an item IS, which decides which direction is bad:
58907
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
58908
+ * - `supply` — something the device draws from (clean water, detergent,
58909
+ * salt, rinse aid); low or empty is bad.
58910
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
58911
+ * bad.
58912
+ * Absent = `wear`.
58913
+ */
58914
+ var ConsumableKindSchema = _enum([
58915
+ "wear",
58916
+ "supply",
58917
+ "waste"
58918
+ ]);
58919
+ /**
58920
+ * What an item LOOKS like, which decides how a client draws it — independent
58921
+ * of `kind`, which decides which direction is bad:
58922
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
58923
+ * remaining time and a reset.
58924
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
58925
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
58926
+ * a stepped level and "refill".
58927
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
58928
+ * that warns when full.
58929
+ * Absent = derived from the kind ({@link consumableFormOf}).
58930
+ */
58931
+ var ConsumableFormSchema = _enum([
58932
+ "part",
58933
+ "tank",
58934
+ "product",
58935
+ "bin"
58936
+ ]);
58937
+ /** The provider's own discrete verdict on an item. */
58938
+ var ConsumableStatusSchema = _enum([
58939
+ "ok",
58940
+ "low",
58941
+ "empty",
58942
+ "full",
58943
+ "replace"
58944
+ ]);
58945
+ _enum([
58946
+ "ok",
58947
+ "low",
58948
+ "empty",
58949
+ "full"
58950
+ ]);
58842
58951
  /** Units a remaining-life counter is reported in. Closed: the panel renders
58843
58952
  * each. */
58844
58953
  var ConsumableRemainingUnitSchema = _enum([
@@ -58858,10 +58967,14 @@ var ConsumablesStatusSchema = object({
58858
58967
  key: string().min(1),
58859
58968
  /** Display name. */
58860
58969
  label: string().min(1),
58861
- /** Remaining life % when known (0..100). */
58970
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
58862
58971
  level: number().min(0).max(100).nullable(),
58863
- /** Discrete state when known (binary mode). */
58864
- status: _enum(["ok", "replace"]).nullable(),
58972
+ /** The provider's discrete verdict when known (binary mode). */
58973
+ status: ConsumableStatusSchema.nullable(),
58974
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
58975
+ kind: ConsumableKindSchema.optional(),
58976
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
58977
+ form: ConsumableFormSchema.optional(),
58865
58978
  /** Ms epoch of the last replace, when known. */
58866
58979
  lastResetAt: number().nullable(),
58867
58980
  /** Whether `reset()` is meaningful for this item. */
@@ -59096,8 +59209,9 @@ object({
59096
59209
  status: DeviceStatusSchema
59097
59210
  });
59098
59211
  /**
59099
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
59100
- * consumable levels (salt, rinse aid) and common program options.
59212
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
59213
+ * common program options. Salt and rinse aid are NOT here: they are items of
59214
+ * the device's `consumables` cap, like every other device's (D915).
59101
59215
  *
59102
59216
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
59103
59217
  * by any integration that exposes the same program / option surface.
@@ -59145,11 +59259,6 @@ var DishwasherAvailabilitySchema = _enum([
59145
59259
  "offline",
59146
59260
  "description-missing"
59147
59261
  ]);
59148
- var DishwasherConsumableLevelSchema = _enum([
59149
- "ok",
59150
- "low",
59151
- "empty"
59152
- ]);
59153
59262
  object({
59154
59263
  availability: DishwasherAvailabilitySchema,
59155
59264
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -59182,8 +59291,6 @@ object({
59182
59291
  powerOn: boolean().nullable(),
59183
59292
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
59184
59293
  powerState: string().nullable(),
59185
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
59186
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
59187
59294
  /**
59188
59295
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
59189
59296
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -66490,60 +66597,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
66490
66597
  auth: "admin",
66491
66598
  access: "delete"
66492
66599
  });
66493
- /**
66494
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
66495
- * cleaning lifecycle plus a return-to-base / locate surface and an
66496
- * optional fan-speed selector.
66497
- *
66498
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
66499
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
66500
- * (0..100) is nullable — some vacuums don't report a battery
66501
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
66502
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
66503
- * tokens the hardware accepts so the UI renders only supported choices.
66504
- *
66505
- * The `setFanSpeed` method takes the bare `speed` token — the provider
66506
- * validates it against the vacuum's own list. `locate` triggers the
66507
- * find-me chirp; `returnToBase` sends it home.
66508
- *
66509
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
66510
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
66511
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
66512
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
66513
- * only when the device has no such tank at all, and use a `TankStatus`
66514
- * with both inner fields `null` when the tank exists but its level is
66515
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
66516
- * so the HA provider leaves all four `null`.
66517
- */
66518
- var VacuumStateSchema = _enum([
66519
- "idle",
66520
- "cleaning",
66521
- "paused",
66522
- "returning",
66523
- "docked",
66524
- "drying",
66525
- "error"
66526
- ]);
66527
- /**
66528
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
66529
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
66530
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
66531
- * level is currently unknown; the OWNING field being `null` means the
66532
- * hardware has no such tank at all.
66533
- */
66534
- var TankStatusSchema = object({
66535
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
66536
- level: number().min(0).max(100).nullable(),
66537
- /** Discrete state when the hardware is binary-mode; null otherwise. */
66538
- status: _enum([
66539
- "ok",
66540
- "low",
66541
- "full"
66542
- ]).nullable()
66543
- });
66544
66600
  object({
66545
66601
  /** Lifecycle state of the vacuum. */
66546
- state: VacuumStateSchema,
66602
+ state: _enum([
66603
+ "idle",
66604
+ "cleaning",
66605
+ "paused",
66606
+ "returning",
66607
+ "docked",
66608
+ "drying",
66609
+ "error"
66610
+ ]),
66547
66611
  /** 0..100 battery percentage. Null when the device has no battery
66548
66612
  * reading. */
66549
66613
  batteryLevel: number().min(0).max(100).nullable(),
@@ -66552,14 +66616,6 @@ object({
66552
66616
  fanSpeed: string().nullable(),
66553
66617
  /** Speed tokens the hardware accepts — drives the UI selector. */
66554
66618
  availableFanSpeeds: array(string()),
66555
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
66556
- cleanWater: TankStatusSchema.nullable(),
66557
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
66558
- dirtyWater: TankStatusSchema.nullable(),
66559
- /** Detergent tank. Null when the hardware has no detergent tank. */
66560
- detergent: TankStatusSchema.nullable(),
66561
- /** Dust bin. Null when the hardware has no dust bin. */
66562
- dustBin: TankStatusSchema.nullable(),
66563
66619
  /** 0..100 cleaning-completion percentage of the current task, or null. */
66564
66620
  progressPercent: number().min(0).max(100).nullable(),
66565
66621
  /** Current error code (0 / null = no error). */
@@ -69118,6 +69174,12 @@ Object.freeze({
69118
69174
  addonId: null,
69119
69175
  access: "create"
69120
69176
  },
69177
+ "deviceHistory.deleteOrphanSeries": {
69178
+ capName: "device-history",
69179
+ capScope: "system",
69180
+ addonId: null,
69181
+ access: "delete"
69182
+ },
69121
69183
  "deviceHistory.getDeviceEnabled": {
69122
69184
  capName: "device-history",
69123
69185
  capScope: "system",
@@ -69136,6 +69198,12 @@ Object.freeze({
69136
69198
  addonId: null,
69137
69199
  access: "view"
69138
69200
  },
69201
+ "deviceHistory.listOrphanSeries": {
69202
+ capName: "device-history",
69203
+ capScope: "system",
69204
+ addonId: null,
69205
+ access: "view"
69206
+ },
69139
69207
  "deviceHistory.listSeries": {
69140
69208
  capName: "device-history",
69141
69209
  capScope: "system",
@@ -79191,7 +79259,7 @@ var STATE_SUMMARY_VARS = [
79191
79259
  ([...RULE_TEXT], [...COMBINED_ALARM]),
79192
79260
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
79193
79261
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
79194
- ([...RULE_TEXT], [...CONSUMABLE]),
79262
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
79195
79263
  ([...RULE_TEXT], [...TANK]),
79196
79264
  [...RULE_TEXT],
79197
79265
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),