@camstack/addon-provider-amcrest 0.2.154 → 0.2.156

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
@@ -5467,7 +5467,7 @@ var ZodIssueCode = {
5467
5467
  var ZodFirstPartyTypeKind;
5468
5468
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5469
5469
  //#endregion
5470
- //#region ../types/dist/sleep-DJFUfKvA.mjs
5470
+ //#region ../types/dist/sleep-CUp20JkO.mjs
5471
5471
  /**
5472
5472
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5473
5473
  * window to float samples (D455).
@@ -8359,7 +8359,11 @@ var ContributionSectionSchema = object({
8359
8359
  literal(4)
8360
8360
  ]).optional(),
8361
8361
  tab: string().optional(),
8362
- location: _enum(["settings", "top-tab"]).optional(),
8362
+ location: _enum([
8363
+ "settings",
8364
+ "top-tab",
8365
+ "hero"
8366
+ ]).optional(),
8363
8367
  order: number().optional(),
8364
8368
  fields: array(any())
8365
8369
  });
@@ -13316,7 +13320,11 @@ var ConfigSectionWithValuesSchema = object({
13316
13320
  literal(4)
13317
13321
  ]).optional(),
13318
13322
  tab: string().optional(),
13319
- location: _enum(["settings", "top-tab"]).optional(),
13323
+ location: _enum([
13324
+ "settings",
13325
+ "top-tab",
13326
+ "hero"
13327
+ ]).optional(),
13320
13328
  order: number().optional(),
13321
13329
  fields: array(any())
13322
13330
  });
@@ -17196,6 +17204,52 @@ var TierStatusSchema = object({
17196
17204
  countedAt: number().nullable()
17197
17205
  });
17198
17206
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
17207
+ /**
17208
+ * Why a series is orphan. `device-gone`: its device is absent from the
17209
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
17210
+ * key is declared by no capability any more (a field a cap removed).
17211
+ */
17212
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
17213
+ /** Rows held per stored tier. */
17214
+ var TierRowsSchema = object({
17215
+ raw: number().int(),
17216
+ "5m": number().int(),
17217
+ "1h": number().int(),
17218
+ "1d": number().int()
17219
+ });
17220
+ var OrphanSeriesSchema = object({
17221
+ seriesId: number().int(),
17222
+ deviceId: number().int(),
17223
+ key: string(),
17224
+ scope: string(),
17225
+ /** The metric's display name; `null` when its metric row is gone too. */
17226
+ displayName: string().nullable(),
17227
+ reason: DeviceHistoryOrphanReasonSchema,
17228
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
17229
+ missingSince: number().nullable(),
17230
+ firstTs: number(),
17231
+ lastTs: number(),
17232
+ rows: TierRowsSchema
17233
+ });
17234
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
17235
+ "not-found",
17236
+ "not-orphan",
17237
+ "failed"
17238
+ ]);
17239
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
17240
+ seriesId: number().int(),
17241
+ ok: literal(true),
17242
+ deleted: TierRowsSchema
17243
+ }), object({
17244
+ seriesId: number().int(),
17245
+ ok: literal(false),
17246
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
17247
+ })]);
17248
+ var OrphanListSchema = object({
17249
+ series: array(OrphanSeriesSchema).readonly(),
17250
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
17251
+ truncated: boolean()
17252
+ });
17199
17253
  var DeviceHistoryStatusSchema = object({
17200
17254
  startedAt: number(),
17201
17255
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -17293,7 +17347,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
17293
17347
  }), object({ enabled: boolean() }), {
17294
17348
  kind: "mutation",
17295
17349
  auth: "admin"
17296
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
17350
+ }), 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() }), {
17351
+ kind: "mutation",
17352
+ auth: "admin"
17353
+ });
17297
17354
  var DeviceCaStatusSchema = discriminatedUnion("state", [
17298
17355
  object({ state: literal("absent") }),
17299
17356
  object({
@@ -50360,6 +50417,19 @@ var NodeInferenceDeviceSchema = object({
50360
50417
  /** Whether the node's live probe reports the device as usable right now. */
50361
50418
  available: boolean(),
50362
50419
  /**
50420
+ * Is the device on the node at all (D919)? `present` — the live probe
50421
+ * reported it; `absent` — the probe ANSWERED and did not report it, so only
50422
+ * its stored settings remain (unplugged, moved to another node): never
50423
+ * eligible, whatever its stored `enabled`, and forgettable with
50424
+ * `forgetInferenceDevice`; `unknown` — the probe did not answer, nothing is
50425
+ * claimed (D315). Optional only for an orchestrator older than the field.
50426
+ */
50427
+ presence: _enum([
50428
+ "present",
50429
+ "absent",
50430
+ "unknown"
50431
+ ]).optional(),
50432
+ /**
50363
50433
  * Whether this device participates in dispatch. AUTO default (spec C2):
50364
50434
  * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
50365
50435
  * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
@@ -50585,7 +50655,13 @@ method(object({
50585
50655
  }), object({ success: literal(true) }), {
50586
50656
  kind: "mutation",
50587
50657
  auth: "admin"
50588
- }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
50658
+ }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({
50659
+ agentNodeId: string(),
50660
+ deviceKey: string()
50661
+ }), object({ success: literal(true) }), {
50662
+ kind: "mutation",
50663
+ auth: "admin"
50664
+ }), method(object({ agentNodeId: string() }), object({
50589
50665
  success: literal(true),
50590
50666
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
50591
50667
  effectiveModelId: string().nullable(),
@@ -55762,17 +55838,69 @@ var connectivityCapability = {
55762
55838
  volatileStateFields: ["lastChangedAt"]
55763
55839
  };
55764
55840
  /**
55765
- * Generic device-consumables capability — surfaces a device's
55766
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
55767
- * descaling cycles, …) with their remaining life and an optional
55768
- * "Replaced" reset action. Device-agnostic: any provider that knows its
55769
- * device tracks consumables can register it; the cap declares no
55770
- * vocabulary of its own — the provider names each item verbatim.
55841
+ * Generic device-consumables capability — the ONE place a device reports what
55842
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
55843
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
55844
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
55845
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
55846
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
55847
+ * its device tracks consumables registers it; the provider names each item
55848
+ * verbatim and says which `kind` it is.
55849
+ *
55850
+ * The admin UI renders it as ONE collapsible section directly under the
55851
+ * device page's hero card (`placement: 'hero'`), for every device bound to
55852
+ * this cap — never drawn by a device type's hero card itself (D915).
55771
55853
  *
55772
55854
  * Like `childLayout`, the cap is INERT until a provider sets items: no
55773
55855
  * provider populates it by guessing (no HA inference). The UI renders a
55774
55856
  * "No consumables reported" placeholder when `items` is empty.
55775
55857
  */
55858
+ /**
55859
+ * What an item IS, which decides which direction is bad:
55860
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
55861
+ * - `supply` — something the device draws from (clean water, detergent,
55862
+ * salt, rinse aid); low or empty is bad.
55863
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
55864
+ * bad.
55865
+ * Absent = `wear`.
55866
+ */
55867
+ var ConsumableKindSchema = _enum([
55868
+ "wear",
55869
+ "supply",
55870
+ "waste"
55871
+ ]);
55872
+ /**
55873
+ * What an item LOOKS like, which decides how a client draws it — independent
55874
+ * of `kind`, which decides which direction is bad:
55875
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
55876
+ * remaining time and a reset.
55877
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
55878
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
55879
+ * a stepped level and "refill".
55880
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
55881
+ * that warns when full.
55882
+ * Absent = derived from the kind ({@link consumableFormOf}).
55883
+ */
55884
+ var ConsumableFormSchema = _enum([
55885
+ "part",
55886
+ "tank",
55887
+ "product",
55888
+ "bin"
55889
+ ]);
55890
+ /** The provider's own discrete verdict on an item. */
55891
+ var ConsumableStatusSchema = _enum([
55892
+ "ok",
55893
+ "low",
55894
+ "empty",
55895
+ "full",
55896
+ "replace"
55897
+ ]);
55898
+ _enum([
55899
+ "ok",
55900
+ "low",
55901
+ "empty",
55902
+ "full"
55903
+ ]);
55776
55904
  /** Units a remaining-life counter is reported in. Closed: the panel renders
55777
55905
  * each. */
55778
55906
  var ConsumableRemainingUnitSchema = _enum([
@@ -55787,18 +55915,23 @@ var ConsumableRemainingSchema = object({
55787
55915
  unit: ConsumableRemainingUnitSchema
55788
55916
  });
55789
55917
  /** A single consumable item. Either a continuous `level` (remaining
55790
- * life %) or a discrete `status` may be known — both may be null when a
55791
- * provider only knows the item exists. `level` and `status` are not
55792
- * mutually exclusive; a provider may report both. */
55918
+ * life %, or fill % for a `supply` / `waste` item) or a discrete `status`
55919
+ * may be known — both may be null when a provider only knows the item
55920
+ * exists. `level` and `status` are not mutually exclusive; a provider may
55921
+ * report both. */
55793
55922
  var ConsumableItemSchema = object({
55794
55923
  /** Stable id, e.g. 'main-brush'. */
55795
55924
  key: string().min(1),
55796
55925
  /** Display name. */
55797
55926
  label: string().min(1),
55798
- /** Remaining life % when known (0..100). */
55927
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
55799
55928
  level: number().min(0).max(100).nullable(),
55800
- /** Discrete state when known (binary mode). */
55801
- status: _enum(["ok", "replace"]).nullable(),
55929
+ /** The provider's discrete verdict when known (binary mode). */
55930
+ status: ConsumableStatusSchema.nullable(),
55931
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
55932
+ kind: ConsumableKindSchema.optional(),
55933
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
55934
+ form: ConsumableFormSchema.optional(),
55802
55935
  /** Ms epoch of the last replace, when known. */
55803
55936
  lastResetAt: number().nullable(),
55804
55937
  /** Whether `reset()` is meaningful for this item. */
@@ -55821,7 +55954,7 @@ var consumablesCapability = {
55821
55954
  kind: "widget",
55822
55955
  widgetId: "host/consumables-panel",
55823
55956
  tab: "consumables",
55824
- topTab: true,
55957
+ placement: "hero",
55825
55958
  label: "Consumables",
55826
55959
  order: 5
55827
55960
  } },
@@ -55882,9 +56015,37 @@ reset: method(object({
55882
56015
  */
55883
56016
  durability: "restored",
55884
56017
  /**
55885
- * History (D850): none — `items` is an array keyed by runtime ids; a history path never enters it.
56018
+ * History (D850, D917): one series per (item field, item `key`) — the item key
56019
+ * is the series scope, the item `label` names it. A vacuum tank's fill, a
56020
+ * brush's remaining life and a dishwasher's salt are each recorded the moment
56021
+ * their provider reports them; an item that appears later gets its series.
55886
56022
  */
55887
- history: "none",
56023
+ history: {
56024
+ fields: {},
56025
+ items: {
56026
+ path: "items",
56027
+ key: "key",
56028
+ label: "label",
56029
+ fields: {
56030
+ level: {
56031
+ kind: "gauge",
56032
+ unit: "%",
56033
+ deadband: 2,
56034
+ displayName: "Level"
56035
+ },
56036
+ status: {
56037
+ kind: "enum",
56038
+ displayName: "Status"
56039
+ },
56040
+ "remaining.value": {
56041
+ kind: "gauge",
56042
+ unitFrom: "remaining.unit",
56043
+ deadband: 1,
56044
+ displayName: "Remaining"
56045
+ }
56046
+ }
56047
+ }
56048
+ },
55888
56049
  /** Clocks, not content: a re-read that changed no item costs no commit. */
55889
56050
  volatileStateFields: ["lastChangedAt", "lastFetchedAt"]
55890
56051
  };
@@ -56299,8 +56460,9 @@ onStatusChanged: { data: object({
56299
56460
  volatileStateFields: ["lastChangedAt"]
56300
56461
  };
56301
56462
  /**
56302
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
56303
- * consumable levels (salt, rinse aid) and common program options.
56463
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
56464
+ * common program options. Salt and rinse aid are NOT here: they are items of
56465
+ * the device's `consumables` cap, like every other device's (D915).
56304
56466
  *
56305
56467
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
56306
56468
  * by any integration that exposes the same program / option surface.
@@ -56348,11 +56510,6 @@ var DishwasherAvailabilitySchema = _enum([
56348
56510
  "offline",
56349
56511
  "description-missing"
56350
56512
  ]);
56351
- var DishwasherConsumableLevelSchema = _enum([
56352
- "ok",
56353
- "low",
56354
- "empty"
56355
- ]);
56356
56513
  var DishwasherStatusSchema = object({
56357
56514
  availability: DishwasherAvailabilitySchema,
56358
56515
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -56385,8 +56542,6 @@ var DishwasherStatusSchema = object({
56385
56542
  powerOn: boolean().nullable(),
56386
56543
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
56387
56544
  powerState: string().nullable(),
56388
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
56389
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56390
56545
  /**
56391
56546
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
56392
56547
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -59262,7 +59417,7 @@ var motionTriggerCapability = {
59262
59417
  enabled: boolean()
59263
59418
  }), _void(), {
59264
59419
  kind: "mutation",
59265
- auth: "admin"
59420
+ auth: "protected"
59266
59421
  }) },
59267
59422
  events: { onMotionTriggerChanged: { data: object({
59268
59423
  deviceId: number(),
@@ -59992,6 +60147,13 @@ var TopologyNodeSchema = object({
59992
60147
  cpuModel: string().nullable(),
59993
60148
  cpuCores: number(),
59994
60149
  memoryMB: number(),
60150
+ /**
60151
+ * The inference RUNTIMES installed on the node (`pythonRuntimes`: onnx,
60152
+ * openvino, edgetpu …) — not its devices. An installed runtime says nothing
60153
+ * about whether its hardware is there (a Coral delegate stays installed
60154
+ * after the stick leaves, D919); the live device set is
60155
+ * `pipelineOrchestrator.getNodeInferenceDevices`.
60156
+ */
59995
60157
  engines: array(string()).readonly(),
59996
60158
  isHub: boolean(),
59997
60159
  isOnline: boolean(),
@@ -61155,7 +61317,28 @@ var ResolvedInferenceConfigSchema = object({
61155
61317
  format: ModelFormatSchema,
61156
61318
  reason: string()
61157
61319
  });
61158
- method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema);
61320
+ /**
61321
+ * The answer of an accelerator rescan (D919): the node's device list after
61322
+ * the re-probe, what changed, and the evidence that decided the Coral answer
61323
+ * (`usbBus` — could the USB bus be read at all; `decidedBy` — USB ids, the PCI
61324
+ * bus, the installed-delegate fallback, or nothing).
61325
+ */
61326
+ var AcceleratorRescanSchema = object({
61327
+ devices: array(InferenceDeviceDescriptorSchema).readonly(),
61328
+ appeared: array(string()).readonly(),
61329
+ disappeared: array(string()).readonly(),
61330
+ usbBus: _enum(["observed", "unobservable"]),
61331
+ decidedBy: _enum([
61332
+ "usb-ids",
61333
+ "pci",
61334
+ "delegate-fallback",
61335
+ "none"
61336
+ ])
61337
+ });
61338
+ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema), method(_void(), AcceleratorRescanSchema, {
61339
+ kind: "mutation",
61340
+ auth: "admin"
61341
+ });
61159
61342
  /**
61160
61343
  * Multi-metric electrical meter. One slice can carry any combination
61161
61344
  * of instantaneous power (W), cumulative energy (kWh), voltage (V),
@@ -65664,60 +65847,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
65664
65847
  auth: "admin",
65665
65848
  access: "delete"
65666
65849
  });
65667
- /**
65668
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
65669
- * cleaning lifecycle plus a return-to-base / locate surface and an
65670
- * optional fan-speed selector.
65671
- *
65672
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
65673
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
65674
- * (0..100) is nullable — some vacuums don't report a battery
65675
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
65676
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
65677
- * tokens the hardware accepts so the UI renders only supported choices.
65678
- *
65679
- * The `setFanSpeed` method takes the bare `speed` token — the provider
65680
- * validates it against the vacuum's own list. `locate` triggers the
65681
- * find-me chirp; `returnToBase` sends it home.
65682
- *
65683
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
65684
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
65685
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
65686
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
65687
- * only when the device has no such tank at all, and use a `TankStatus`
65688
- * with both inner fields `null` when the tank exists but its level is
65689
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
65690
- * so the HA provider leaves all four `null`.
65691
- */
65692
- var VacuumStateSchema = _enum([
65693
- "idle",
65694
- "cleaning",
65695
- "paused",
65696
- "returning",
65697
- "docked",
65698
- "drying",
65699
- "error"
65700
- ]);
65701
- /**
65702
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
65703
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
65704
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
65705
- * level is currently unknown; the OWNING field being `null` means the
65706
- * hardware has no such tank at all.
65707
- */
65708
- var TankStatusSchema = object({
65709
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
65710
- level: number().min(0).max(100).nullable(),
65711
- /** Discrete state when the hardware is binary-mode; null otherwise. */
65712
- status: _enum([
65713
- "ok",
65714
- "low",
65715
- "full"
65716
- ]).nullable()
65717
- });
65718
65850
  var VacuumControlStatusSchema = object({
65719
65851
  /** Lifecycle state of the vacuum. */
65720
- state: VacuumStateSchema,
65852
+ state: _enum([
65853
+ "idle",
65854
+ "cleaning",
65855
+ "paused",
65856
+ "returning",
65857
+ "docked",
65858
+ "drying",
65859
+ "error"
65860
+ ]),
65721
65861
  /** 0..100 battery percentage. Null when the device has no battery
65722
65862
  * reading. */
65723
65863
  batteryLevel: number().min(0).max(100).nullable(),
@@ -65726,14 +65866,6 @@ var VacuumControlStatusSchema = object({
65726
65866
  fanSpeed: string().nullable(),
65727
65867
  /** Speed tokens the hardware accepts — drives the UI selector. */
65728
65868
  availableFanSpeeds: array(string()),
65729
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
65730
- cleanWater: TankStatusSchema.nullable(),
65731
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
65732
- dirtyWater: TankStatusSchema.nullable(),
65733
- /** Detergent tank. Null when the hardware has no detergent tank. */
65734
- detergent: TankStatusSchema.nullable(),
65735
- /** Dust bin. Null when the hardware has no dust bin. */
65736
- dustBin: TankStatusSchema.nullable(),
65737
65869
  /** 0..100 cleaning-completion percentage of the current task, or null. */
65738
65870
  progressPercent: number().min(0).max(100).nullable(),
65739
65871
  /** Current error code (0 / null = no error). */
@@ -65795,35 +65927,14 @@ var vacuumControlCapability = {
65795
65927
  */
65796
65928
  durability: "session",
65797
65929
  /**
65798
- * History (D850): recorded series. Tank levels are fixed-object paths (`cleanWater.level`, ...).
65930
+ * History (D850): recorded series. The tanks moved to `consumables` (D915), whose
65931
+ * items are keyed by runtime ids and record no history.
65799
65932
  */
65800
- history: { fields: {
65801
- batteryLevel: {
65802
- kind: "gauge",
65803
- unit: "%",
65804
- deadband: 2
65805
- },
65806
- "cleanWater.level": {
65807
- kind: "gauge",
65808
- unit: "%",
65809
- deadband: 2
65810
- },
65811
- "dirtyWater.level": {
65812
- kind: "gauge",
65813
- unit: "%",
65814
- deadband: 2
65815
- },
65816
- "detergent.level": {
65817
- kind: "gauge",
65818
- unit: "%",
65819
- deadband: 2
65820
- },
65821
- "dustBin.level": {
65822
- kind: "gauge",
65823
- unit: "%",
65824
- deadband: 2
65825
- }
65826
- } }
65933
+ history: { fields: { batteryLevel: {
65934
+ kind: "gauge",
65935
+ unit: "%",
65936
+ deadband: 2
65937
+ } } }
65827
65938
  };
65828
65939
  var ValveStatusSchema = object({
65829
65940
  /** Lifecycle state of the valve. */
@@ -70221,6 +70332,12 @@ Object.freeze({
70221
70332
  addonId: null,
70222
70333
  access: "create"
70223
70334
  },
70335
+ "deviceHistory.deleteOrphanSeries": {
70336
+ capName: "device-history",
70337
+ capScope: "system",
70338
+ addonId: null,
70339
+ access: "delete"
70340
+ },
70224
70341
  "deviceHistory.getDeviceEnabled": {
70225
70342
  capName: "device-history",
70226
70343
  capScope: "system",
@@ -70239,6 +70356,12 @@ Object.freeze({
70239
70356
  addonId: null,
70240
70357
  access: "view"
70241
70358
  },
70359
+ "deviceHistory.listOrphanSeries": {
70360
+ capName: "device-history",
70361
+ capScope: "system",
70362
+ addonId: null,
70363
+ access: "view"
70364
+ },
70242
70365
  "deviceHistory.listSeries": {
70243
70366
  capName: "device-history",
70244
70367
  capScope: "system",
@@ -73863,6 +73986,12 @@ Object.freeze({
73863
73986
  addonId: null,
73864
73987
  access: "delete"
73865
73988
  },
73989
+ "pipelineOrchestrator.forgetInferenceDevice": {
73990
+ capName: "pipeline-orchestrator",
73991
+ capScope: "system",
73992
+ addonId: null,
73993
+ access: "delete"
73994
+ },
73866
73995
  "pipelineOrchestrator.getAgentLoad": {
73867
73996
  capName: "pipeline-orchestrator",
73868
73997
  capScope: "system",
@@ -74439,6 +74568,12 @@ Object.freeze({
74439
74568
  addonId: null,
74440
74569
  access: "view"
74441
74570
  },
74571
+ "platformProbe.rescanAccelerators": {
74572
+ capName: "platform-probe",
74573
+ capScope: "system",
74574
+ addonId: null,
74575
+ access: "create"
74576
+ },
74442
74577
  "platformProbe.resolveHwAccel": {
74443
74578
  capName: "platform-probe",
74444
74579
  capScope: "system",
@@ -80450,7 +80585,7 @@ var STATE_SUMMARY_VARS = [
80450
80585
  ([...RULE_TEXT], [...COMBINED_ALARM]),
80451
80586
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
80452
80587
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
80453
- ([...RULE_TEXT], [...CONSUMABLE]),
80588
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
80454
80589
  ([...RULE_TEXT], [...TANK]),
80455
80590
  [...RULE_TEXT],
80456
80591
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
package/dist/addon.mjs CHANGED
@@ -5446,7 +5446,7 @@ var ZodIssueCode = {
5446
5446
  var ZodFirstPartyTypeKind;
5447
5447
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5448
5448
  //#endregion
5449
- //#region ../types/dist/sleep-DJFUfKvA.mjs
5449
+ //#region ../types/dist/sleep-CUp20JkO.mjs
5450
5450
  /**
5451
5451
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5452
5452
  * window to float samples (D455).
@@ -8338,7 +8338,11 @@ var ContributionSectionSchema = object({
8338
8338
  literal(4)
8339
8339
  ]).optional(),
8340
8340
  tab: string().optional(),
8341
- location: _enum(["settings", "top-tab"]).optional(),
8341
+ location: _enum([
8342
+ "settings",
8343
+ "top-tab",
8344
+ "hero"
8345
+ ]).optional(),
8342
8346
  order: number().optional(),
8343
8347
  fields: array(any())
8344
8348
  });
@@ -13295,7 +13299,11 @@ var ConfigSectionWithValuesSchema = object({
13295
13299
  literal(4)
13296
13300
  ]).optional(),
13297
13301
  tab: string().optional(),
13298
- location: _enum(["settings", "top-tab"]).optional(),
13302
+ location: _enum([
13303
+ "settings",
13304
+ "top-tab",
13305
+ "hero"
13306
+ ]).optional(),
13299
13307
  order: number().optional(),
13300
13308
  fields: array(any())
13301
13309
  });
@@ -17175,6 +17183,52 @@ var TierStatusSchema = object({
17175
17183
  countedAt: number().nullable()
17176
17184
  });
17177
17185
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
17186
+ /**
17187
+ * Why a series is orphan. `device-gone`: its device is absent from the
17188
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
17189
+ * key is declared by no capability any more (a field a cap removed).
17190
+ */
17191
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
17192
+ /** Rows held per stored tier. */
17193
+ var TierRowsSchema = object({
17194
+ raw: number().int(),
17195
+ "5m": number().int(),
17196
+ "1h": number().int(),
17197
+ "1d": number().int()
17198
+ });
17199
+ var OrphanSeriesSchema = object({
17200
+ seriesId: number().int(),
17201
+ deviceId: number().int(),
17202
+ key: string(),
17203
+ scope: string(),
17204
+ /** The metric's display name; `null` when its metric row is gone too. */
17205
+ displayName: string().nullable(),
17206
+ reason: DeviceHistoryOrphanReasonSchema,
17207
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
17208
+ missingSince: number().nullable(),
17209
+ firstTs: number(),
17210
+ lastTs: number(),
17211
+ rows: TierRowsSchema
17212
+ });
17213
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
17214
+ "not-found",
17215
+ "not-orphan",
17216
+ "failed"
17217
+ ]);
17218
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
17219
+ seriesId: number().int(),
17220
+ ok: literal(true),
17221
+ deleted: TierRowsSchema
17222
+ }), object({
17223
+ seriesId: number().int(),
17224
+ ok: literal(false),
17225
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
17226
+ })]);
17227
+ var OrphanListSchema = object({
17228
+ series: array(OrphanSeriesSchema).readonly(),
17229
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
17230
+ truncated: boolean()
17231
+ });
17178
17232
  var DeviceHistoryStatusSchema = object({
17179
17233
  startedAt: number(),
17180
17234
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -17272,7 +17326,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
17272
17326
  }), object({ enabled: boolean() }), {
17273
17327
  kind: "mutation",
17274
17328
  auth: "admin"
17275
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
17329
+ }), 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() }), {
17330
+ kind: "mutation",
17331
+ auth: "admin"
17332
+ });
17276
17333
  var DeviceCaStatusSchema = discriminatedUnion("state", [
17277
17334
  object({ state: literal("absent") }),
17278
17335
  object({
@@ -50339,6 +50396,19 @@ var NodeInferenceDeviceSchema = object({
50339
50396
  /** Whether the node's live probe reports the device as usable right now. */
50340
50397
  available: boolean(),
50341
50398
  /**
50399
+ * Is the device on the node at all (D919)? `present` — the live probe
50400
+ * reported it; `absent` — the probe ANSWERED and did not report it, so only
50401
+ * its stored settings remain (unplugged, moved to another node): never
50402
+ * eligible, whatever its stored `enabled`, and forgettable with
50403
+ * `forgetInferenceDevice`; `unknown` — the probe did not answer, nothing is
50404
+ * claimed (D315). Optional only for an orchestrator older than the field.
50405
+ */
50406
+ presence: _enum([
50407
+ "present",
50408
+ "absent",
50409
+ "unknown"
50410
+ ]).optional(),
50411
+ /**
50342
50412
  * Whether this device participates in dispatch. AUTO default (spec C2):
50343
50413
  * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
50344
50414
  * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
@@ -50564,7 +50634,13 @@ method(object({
50564
50634
  }), object({ success: literal(true) }), {
50565
50635
  kind: "mutation",
50566
50636
  auth: "admin"
50567
- }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
50637
+ }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({
50638
+ agentNodeId: string(),
50639
+ deviceKey: string()
50640
+ }), object({ success: literal(true) }), {
50641
+ kind: "mutation",
50642
+ auth: "admin"
50643
+ }), method(object({ agentNodeId: string() }), object({
50568
50644
  success: literal(true),
50569
50645
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
50570
50646
  effectiveModelId: string().nullable(),
@@ -55741,17 +55817,69 @@ var connectivityCapability = {
55741
55817
  volatileStateFields: ["lastChangedAt"]
55742
55818
  };
55743
55819
  /**
55744
- * Generic device-consumables capability — surfaces a device's
55745
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
55746
- * descaling cycles, …) with their remaining life and an optional
55747
- * "Replaced" reset action. Device-agnostic: any provider that knows its
55748
- * device tracks consumables can register it; the cap declares no
55749
- * vocabulary of its own — the provider names each item verbatim.
55820
+ * Generic device-consumables capability — the ONE place a device reports what
55821
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
55822
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
55823
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
55824
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
55825
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
55826
+ * its device tracks consumables registers it; the provider names each item
55827
+ * verbatim and says which `kind` it is.
55828
+ *
55829
+ * The admin UI renders it as ONE collapsible section directly under the
55830
+ * device page's hero card (`placement: 'hero'`), for every device bound to
55831
+ * this cap — never drawn by a device type's hero card itself (D915).
55750
55832
  *
55751
55833
  * Like `childLayout`, the cap is INERT until a provider sets items: no
55752
55834
  * provider populates it by guessing (no HA inference). The UI renders a
55753
55835
  * "No consumables reported" placeholder when `items` is empty.
55754
55836
  */
55837
+ /**
55838
+ * What an item IS, which decides which direction is bad:
55839
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
55840
+ * - `supply` — something the device draws from (clean water, detergent,
55841
+ * salt, rinse aid); low or empty is bad.
55842
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
55843
+ * bad.
55844
+ * Absent = `wear`.
55845
+ */
55846
+ var ConsumableKindSchema = _enum([
55847
+ "wear",
55848
+ "supply",
55849
+ "waste"
55850
+ ]);
55851
+ /**
55852
+ * What an item LOOKS like, which decides how a client draws it — independent
55853
+ * of `kind`, which decides which direction is bad:
55854
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
55855
+ * remaining time and a reset.
55856
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
55857
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
55858
+ * a stepped level and "refill".
55859
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
55860
+ * that warns when full.
55861
+ * Absent = derived from the kind ({@link consumableFormOf}).
55862
+ */
55863
+ var ConsumableFormSchema = _enum([
55864
+ "part",
55865
+ "tank",
55866
+ "product",
55867
+ "bin"
55868
+ ]);
55869
+ /** The provider's own discrete verdict on an item. */
55870
+ var ConsumableStatusSchema = _enum([
55871
+ "ok",
55872
+ "low",
55873
+ "empty",
55874
+ "full",
55875
+ "replace"
55876
+ ]);
55877
+ _enum([
55878
+ "ok",
55879
+ "low",
55880
+ "empty",
55881
+ "full"
55882
+ ]);
55755
55883
  /** Units a remaining-life counter is reported in. Closed: the panel renders
55756
55884
  * each. */
55757
55885
  var ConsumableRemainingUnitSchema = _enum([
@@ -55766,18 +55894,23 @@ var ConsumableRemainingSchema = object({
55766
55894
  unit: ConsumableRemainingUnitSchema
55767
55895
  });
55768
55896
  /** A single consumable item. Either a continuous `level` (remaining
55769
- * life %) or a discrete `status` may be known — both may be null when a
55770
- * provider only knows the item exists. `level` and `status` are not
55771
- * mutually exclusive; a provider may report both. */
55897
+ * life %, or fill % for a `supply` / `waste` item) or a discrete `status`
55898
+ * may be known — both may be null when a provider only knows the item
55899
+ * exists. `level` and `status` are not mutually exclusive; a provider may
55900
+ * report both. */
55772
55901
  var ConsumableItemSchema = object({
55773
55902
  /** Stable id, e.g. 'main-brush'. */
55774
55903
  key: string().min(1),
55775
55904
  /** Display name. */
55776
55905
  label: string().min(1),
55777
- /** Remaining life % when known (0..100). */
55906
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
55778
55907
  level: number().min(0).max(100).nullable(),
55779
- /** Discrete state when known (binary mode). */
55780
- status: _enum(["ok", "replace"]).nullable(),
55908
+ /** The provider's discrete verdict when known (binary mode). */
55909
+ status: ConsumableStatusSchema.nullable(),
55910
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
55911
+ kind: ConsumableKindSchema.optional(),
55912
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
55913
+ form: ConsumableFormSchema.optional(),
55781
55914
  /** Ms epoch of the last replace, when known. */
55782
55915
  lastResetAt: number().nullable(),
55783
55916
  /** Whether `reset()` is meaningful for this item. */
@@ -55800,7 +55933,7 @@ var consumablesCapability = {
55800
55933
  kind: "widget",
55801
55934
  widgetId: "host/consumables-panel",
55802
55935
  tab: "consumables",
55803
- topTab: true,
55936
+ placement: "hero",
55804
55937
  label: "Consumables",
55805
55938
  order: 5
55806
55939
  } },
@@ -55861,9 +55994,37 @@ reset: method(object({
55861
55994
  */
55862
55995
  durability: "restored",
55863
55996
  /**
55864
- * History (D850): none — `items` is an array keyed by runtime ids; a history path never enters it.
55997
+ * History (D850, D917): one series per (item field, item `key`) — the item key
55998
+ * is the series scope, the item `label` names it. A vacuum tank's fill, a
55999
+ * brush's remaining life and a dishwasher's salt are each recorded the moment
56000
+ * their provider reports them; an item that appears later gets its series.
55865
56001
  */
55866
- history: "none",
56002
+ history: {
56003
+ fields: {},
56004
+ items: {
56005
+ path: "items",
56006
+ key: "key",
56007
+ label: "label",
56008
+ fields: {
56009
+ level: {
56010
+ kind: "gauge",
56011
+ unit: "%",
56012
+ deadband: 2,
56013
+ displayName: "Level"
56014
+ },
56015
+ status: {
56016
+ kind: "enum",
56017
+ displayName: "Status"
56018
+ },
56019
+ "remaining.value": {
56020
+ kind: "gauge",
56021
+ unitFrom: "remaining.unit",
56022
+ deadband: 1,
56023
+ displayName: "Remaining"
56024
+ }
56025
+ }
56026
+ }
56027
+ },
55867
56028
  /** Clocks, not content: a re-read that changed no item costs no commit. */
55868
56029
  volatileStateFields: ["lastChangedAt", "lastFetchedAt"]
55869
56030
  };
@@ -56278,8 +56439,9 @@ onStatusChanged: { data: object({
56278
56439
  volatileStateFields: ["lastChangedAt"]
56279
56440
  };
56280
56441
  /**
56281
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
56282
- * consumable levels (salt, rinse aid) and common program options.
56442
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
56443
+ * common program options. Salt and rinse aid are NOT here: they are items of
56444
+ * the device's `consumables` cap, like every other device's (D915).
56283
56445
  *
56284
56446
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
56285
56447
  * by any integration that exposes the same program / option surface.
@@ -56327,11 +56489,6 @@ var DishwasherAvailabilitySchema = _enum([
56327
56489
  "offline",
56328
56490
  "description-missing"
56329
56491
  ]);
56330
- var DishwasherConsumableLevelSchema = _enum([
56331
- "ok",
56332
- "low",
56333
- "empty"
56334
- ]);
56335
56492
  var DishwasherStatusSchema = object({
56336
56493
  availability: DishwasherAvailabilitySchema,
56337
56494
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -56364,8 +56521,6 @@ var DishwasherStatusSchema = object({
56364
56521
  powerOn: boolean().nullable(),
56365
56522
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
56366
56523
  powerState: string().nullable(),
56367
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
56368
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56369
56524
  /**
56370
56525
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
56371
56526
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -59241,7 +59396,7 @@ var motionTriggerCapability = {
59241
59396
  enabled: boolean()
59242
59397
  }), _void(), {
59243
59398
  kind: "mutation",
59244
- auth: "admin"
59399
+ auth: "protected"
59245
59400
  }) },
59246
59401
  events: { onMotionTriggerChanged: { data: object({
59247
59402
  deviceId: number(),
@@ -59971,6 +60126,13 @@ var TopologyNodeSchema = object({
59971
60126
  cpuModel: string().nullable(),
59972
60127
  cpuCores: number(),
59973
60128
  memoryMB: number(),
60129
+ /**
60130
+ * The inference RUNTIMES installed on the node (`pythonRuntimes`: onnx,
60131
+ * openvino, edgetpu …) — not its devices. An installed runtime says nothing
60132
+ * about whether its hardware is there (a Coral delegate stays installed
60133
+ * after the stick leaves, D919); the live device set is
60134
+ * `pipelineOrchestrator.getNodeInferenceDevices`.
60135
+ */
59974
60136
  engines: array(string()).readonly(),
59975
60137
  isHub: boolean(),
59976
60138
  isOnline: boolean(),
@@ -61134,7 +61296,28 @@ var ResolvedInferenceConfigSchema = object({
61134
61296
  format: ModelFormatSchema,
61135
61297
  reason: string()
61136
61298
  });
61137
- method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema);
61299
+ /**
61300
+ * The answer of an accelerator rescan (D919): the node's device list after
61301
+ * the re-probe, what changed, and the evidence that decided the Coral answer
61302
+ * (`usbBus` — could the USB bus be read at all; `decidedBy` — USB ids, the PCI
61303
+ * bus, the installed-delegate fallback, or nothing).
61304
+ */
61305
+ var AcceleratorRescanSchema = object({
61306
+ devices: array(InferenceDeviceDescriptorSchema).readonly(),
61307
+ appeared: array(string()).readonly(),
61308
+ disappeared: array(string()).readonly(),
61309
+ usbBus: _enum(["observed", "unobservable"]),
61310
+ decidedBy: _enum([
61311
+ "usb-ids",
61312
+ "pci",
61313
+ "delegate-fallback",
61314
+ "none"
61315
+ ])
61316
+ });
61317
+ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema), method(_void(), AcceleratorRescanSchema, {
61318
+ kind: "mutation",
61319
+ auth: "admin"
61320
+ });
61138
61321
  /**
61139
61322
  * Multi-metric electrical meter. One slice can carry any combination
61140
61323
  * of instantaneous power (W), cumulative energy (kWh), voltage (V),
@@ -65643,60 +65826,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
65643
65826
  auth: "admin",
65644
65827
  access: "delete"
65645
65828
  });
65646
- /**
65647
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
65648
- * cleaning lifecycle plus a return-to-base / locate surface and an
65649
- * optional fan-speed selector.
65650
- *
65651
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
65652
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
65653
- * (0..100) is nullable — some vacuums don't report a battery
65654
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
65655
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
65656
- * tokens the hardware accepts so the UI renders only supported choices.
65657
- *
65658
- * The `setFanSpeed` method takes the bare `speed` token — the provider
65659
- * validates it against the vacuum's own list. `locate` triggers the
65660
- * find-me chirp; `returnToBase` sends it home.
65661
- *
65662
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
65663
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
65664
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
65665
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
65666
- * only when the device has no such tank at all, and use a `TankStatus`
65667
- * with both inner fields `null` when the tank exists but its level is
65668
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
65669
- * so the HA provider leaves all four `null`.
65670
- */
65671
- var VacuumStateSchema = _enum([
65672
- "idle",
65673
- "cleaning",
65674
- "paused",
65675
- "returning",
65676
- "docked",
65677
- "drying",
65678
- "error"
65679
- ]);
65680
- /**
65681
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
65682
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
65683
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
65684
- * level is currently unknown; the OWNING field being `null` means the
65685
- * hardware has no such tank at all.
65686
- */
65687
- var TankStatusSchema = object({
65688
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
65689
- level: number().min(0).max(100).nullable(),
65690
- /** Discrete state when the hardware is binary-mode; null otherwise. */
65691
- status: _enum([
65692
- "ok",
65693
- "low",
65694
- "full"
65695
- ]).nullable()
65696
- });
65697
65829
  var VacuumControlStatusSchema = object({
65698
65830
  /** Lifecycle state of the vacuum. */
65699
- state: VacuumStateSchema,
65831
+ state: _enum([
65832
+ "idle",
65833
+ "cleaning",
65834
+ "paused",
65835
+ "returning",
65836
+ "docked",
65837
+ "drying",
65838
+ "error"
65839
+ ]),
65700
65840
  /** 0..100 battery percentage. Null when the device has no battery
65701
65841
  * reading. */
65702
65842
  batteryLevel: number().min(0).max(100).nullable(),
@@ -65705,14 +65845,6 @@ var VacuumControlStatusSchema = object({
65705
65845
  fanSpeed: string().nullable(),
65706
65846
  /** Speed tokens the hardware accepts — drives the UI selector. */
65707
65847
  availableFanSpeeds: array(string()),
65708
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
65709
- cleanWater: TankStatusSchema.nullable(),
65710
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
65711
- dirtyWater: TankStatusSchema.nullable(),
65712
- /** Detergent tank. Null when the hardware has no detergent tank. */
65713
- detergent: TankStatusSchema.nullable(),
65714
- /** Dust bin. Null when the hardware has no dust bin. */
65715
- dustBin: TankStatusSchema.nullable(),
65716
65848
  /** 0..100 cleaning-completion percentage of the current task, or null. */
65717
65849
  progressPercent: number().min(0).max(100).nullable(),
65718
65850
  /** Current error code (0 / null = no error). */
@@ -65774,35 +65906,14 @@ var vacuumControlCapability = {
65774
65906
  */
65775
65907
  durability: "session",
65776
65908
  /**
65777
- * History (D850): recorded series. Tank levels are fixed-object paths (`cleanWater.level`, ...).
65909
+ * History (D850): recorded series. The tanks moved to `consumables` (D915), whose
65910
+ * items are keyed by runtime ids and record no history.
65778
65911
  */
65779
- history: { fields: {
65780
- batteryLevel: {
65781
- kind: "gauge",
65782
- unit: "%",
65783
- deadband: 2
65784
- },
65785
- "cleanWater.level": {
65786
- kind: "gauge",
65787
- unit: "%",
65788
- deadband: 2
65789
- },
65790
- "dirtyWater.level": {
65791
- kind: "gauge",
65792
- unit: "%",
65793
- deadband: 2
65794
- },
65795
- "detergent.level": {
65796
- kind: "gauge",
65797
- unit: "%",
65798
- deadband: 2
65799
- },
65800
- "dustBin.level": {
65801
- kind: "gauge",
65802
- unit: "%",
65803
- deadband: 2
65804
- }
65805
- } }
65912
+ history: { fields: { batteryLevel: {
65913
+ kind: "gauge",
65914
+ unit: "%",
65915
+ deadband: 2
65916
+ } } }
65806
65917
  };
65807
65918
  var ValveStatusSchema = object({
65808
65919
  /** Lifecycle state of the valve. */
@@ -70200,6 +70311,12 @@ Object.freeze({
70200
70311
  addonId: null,
70201
70312
  access: "create"
70202
70313
  },
70314
+ "deviceHistory.deleteOrphanSeries": {
70315
+ capName: "device-history",
70316
+ capScope: "system",
70317
+ addonId: null,
70318
+ access: "delete"
70319
+ },
70203
70320
  "deviceHistory.getDeviceEnabled": {
70204
70321
  capName: "device-history",
70205
70322
  capScope: "system",
@@ -70218,6 +70335,12 @@ Object.freeze({
70218
70335
  addonId: null,
70219
70336
  access: "view"
70220
70337
  },
70338
+ "deviceHistory.listOrphanSeries": {
70339
+ capName: "device-history",
70340
+ capScope: "system",
70341
+ addonId: null,
70342
+ access: "view"
70343
+ },
70221
70344
  "deviceHistory.listSeries": {
70222
70345
  capName: "device-history",
70223
70346
  capScope: "system",
@@ -73842,6 +73965,12 @@ Object.freeze({
73842
73965
  addonId: null,
73843
73966
  access: "delete"
73844
73967
  },
73968
+ "pipelineOrchestrator.forgetInferenceDevice": {
73969
+ capName: "pipeline-orchestrator",
73970
+ capScope: "system",
73971
+ addonId: null,
73972
+ access: "delete"
73973
+ },
73845
73974
  "pipelineOrchestrator.getAgentLoad": {
73846
73975
  capName: "pipeline-orchestrator",
73847
73976
  capScope: "system",
@@ -74418,6 +74547,12 @@ Object.freeze({
74418
74547
  addonId: null,
74419
74548
  access: "view"
74420
74549
  },
74550
+ "platformProbe.rescanAccelerators": {
74551
+ capName: "platform-probe",
74552
+ capScope: "system",
74553
+ addonId: null,
74554
+ access: "create"
74555
+ },
74421
74556
  "platformProbe.resolveHwAccel": {
74422
74557
  capName: "platform-probe",
74423
74558
  capScope: "system",
@@ -80429,7 +80564,7 @@ var STATE_SUMMARY_VARS = [
80429
80564
  ([...RULE_TEXT], [...COMBINED_ALARM]),
80430
80565
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
80431
80566
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
80432
- ([...RULE_TEXT], [...CONSUMABLE]),
80567
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
80433
80568
  ([...RULE_TEXT], [...TANK]),
80434
80569
  [...RULE_TEXT],
80435
80570
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-amcrest",
3
- "version": "0.2.154",
3
+ "version": "0.2.156",
4
4
  "description": "Amcrest/Dahua camera device provider addon for CamStack — Dahua CGI over HTTP(S) with digest auth (snapshot, RTSP catalog, PTZ, image/day-night config)",
5
5
  "keywords": [
6
6
  "camstack",