@camstack/addon-terminal 0.1.149 → 0.1.151

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
@@ -5463,7 +5463,7 @@ var ZodIssueCode = {
5463
5463
  var ZodFirstPartyTypeKind;
5464
5464
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5465
5465
  //#endregion
5466
- //#region ../types/dist/sleep-DJFUfKvA.mjs
5466
+ //#region ../types/dist/sleep-CUp20JkO.mjs
5467
5467
  /**
5468
5468
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5469
5469
  * window to float samples (D455).
@@ -8414,7 +8414,11 @@ var ContributionSectionSchema = object({
8414
8414
  literal(4)
8415
8415
  ]).optional(),
8416
8416
  tab: string().optional(),
8417
- location: _enum(["settings", "top-tab"]).optional(),
8417
+ location: _enum([
8418
+ "settings",
8419
+ "top-tab",
8420
+ "hero"
8421
+ ]).optional(),
8418
8422
  order: number().optional(),
8419
8423
  fields: array(any())
8420
8424
  });
@@ -13379,7 +13383,11 @@ var ConfigSectionWithValuesSchema = object({
13379
13383
  literal(4)
13380
13384
  ]).optional(),
13381
13385
  tab: string().optional(),
13382
- location: _enum(["settings", "top-tab"]).optional(),
13386
+ location: _enum([
13387
+ "settings",
13388
+ "top-tab",
13389
+ "hero"
13390
+ ]).optional(),
13383
13391
  order: number().optional(),
13384
13392
  fields: array(any())
13385
13393
  });
@@ -17259,6 +17267,52 @@ var TierStatusSchema = object({
17259
17267
  countedAt: number().nullable()
17260
17268
  });
17261
17269
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
17270
+ /**
17271
+ * Why a series is orphan. `device-gone`: its device is absent from the
17272
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
17273
+ * key is declared by no capability any more (a field a cap removed).
17274
+ */
17275
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
17276
+ /** Rows held per stored tier. */
17277
+ var TierRowsSchema = object({
17278
+ raw: number().int(),
17279
+ "5m": number().int(),
17280
+ "1h": number().int(),
17281
+ "1d": number().int()
17282
+ });
17283
+ var OrphanSeriesSchema = object({
17284
+ seriesId: number().int(),
17285
+ deviceId: number().int(),
17286
+ key: string(),
17287
+ scope: string(),
17288
+ /** The metric's display name; `null` when its metric row is gone too. */
17289
+ displayName: string().nullable(),
17290
+ reason: DeviceHistoryOrphanReasonSchema,
17291
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
17292
+ missingSince: number().nullable(),
17293
+ firstTs: number(),
17294
+ lastTs: number(),
17295
+ rows: TierRowsSchema
17296
+ });
17297
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
17298
+ "not-found",
17299
+ "not-orphan",
17300
+ "failed"
17301
+ ]);
17302
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
17303
+ seriesId: number().int(),
17304
+ ok: literal(true),
17305
+ deleted: TierRowsSchema
17306
+ }), object({
17307
+ seriesId: number().int(),
17308
+ ok: literal(false),
17309
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
17310
+ })]);
17311
+ var OrphanListSchema = object({
17312
+ series: array(OrphanSeriesSchema).readonly(),
17313
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
17314
+ truncated: boolean()
17315
+ });
17262
17316
  var DeviceHistoryStatusSchema = object({
17263
17317
  startedAt: number(),
17264
17318
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -17356,7 +17410,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
17356
17410
  }), object({ enabled: boolean() }), {
17357
17411
  kind: "mutation",
17358
17412
  auth: "admin"
17359
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
17413
+ }), 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() }), {
17414
+ kind: "mutation",
17415
+ auth: "admin"
17416
+ });
17360
17417
  var DeviceCaStatusSchema = discriminatedUnion("state", [
17361
17418
  object({ state: literal("absent") }),
17362
17419
  object({
@@ -50229,6 +50286,19 @@ var NodeInferenceDeviceSchema = object({
50229
50286
  /** Whether the node's live probe reports the device as usable right now. */
50230
50287
  available: boolean(),
50231
50288
  /**
50289
+ * Is the device on the node at all (D919)? `present` — the live probe
50290
+ * reported it; `absent` — the probe ANSWERED and did not report it, so only
50291
+ * its stored settings remain (unplugged, moved to another node): never
50292
+ * eligible, whatever its stored `enabled`, and forgettable with
50293
+ * `forgetInferenceDevice`; `unknown` — the probe did not answer, nothing is
50294
+ * claimed (D315). Optional only for an orchestrator older than the field.
50295
+ */
50296
+ presence: _enum([
50297
+ "present",
50298
+ "absent",
50299
+ "unknown"
50300
+ ]).optional(),
50301
+ /**
50232
50302
  * Whether this device participates in dispatch. AUTO default (spec C2):
50233
50303
  * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
50234
50304
  * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
@@ -50454,7 +50524,13 @@ method(object({
50454
50524
  }), object({ success: literal(true) }), {
50455
50525
  kind: "mutation",
50456
50526
  auth: "admin"
50457
- }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
50527
+ }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({
50528
+ agentNodeId: string(),
50529
+ deviceKey: string()
50530
+ }), object({ success: literal(true) }), {
50531
+ kind: "mutation",
50532
+ auth: "admin"
50533
+ }), method(object({ agentNodeId: string() }), object({
50458
50534
  success: literal(true),
50459
50535
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
50460
50536
  effectiveModelId: string().nullable(),
@@ -55266,17 +55342,69 @@ var connectivityCapability = {
55266
55342
  volatileStateFields: ["lastChangedAt"]
55267
55343
  };
55268
55344
  /**
55269
- * Generic device-consumables capability — surfaces a device's
55270
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
55271
- * descaling cycles, …) with their remaining life and an optional
55272
- * "Replaced" reset action. Device-agnostic: any provider that knows its
55273
- * device tracks consumables can register it; the cap declares no
55274
- * vocabulary of its own — the provider names each item verbatim.
55345
+ * Generic device-consumables capability — the ONE place a device reports what
55346
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
55347
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
55348
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
55349
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
55350
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
55351
+ * its device tracks consumables registers it; the provider names each item
55352
+ * verbatim and says which `kind` it is.
55353
+ *
55354
+ * The admin UI renders it as ONE collapsible section directly under the
55355
+ * device page's hero card (`placement: 'hero'`), for every device bound to
55356
+ * this cap — never drawn by a device type's hero card itself (D915).
55275
55357
  *
55276
55358
  * Like `childLayout`, the cap is INERT until a provider sets items: no
55277
55359
  * provider populates it by guessing (no HA inference). The UI renders a
55278
55360
  * "No consumables reported" placeholder when `items` is empty.
55279
55361
  */
55362
+ /**
55363
+ * What an item IS, which decides which direction is bad:
55364
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
55365
+ * - `supply` — something the device draws from (clean water, detergent,
55366
+ * salt, rinse aid); low or empty is bad.
55367
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
55368
+ * bad.
55369
+ * Absent = `wear`.
55370
+ */
55371
+ var ConsumableKindSchema = _enum([
55372
+ "wear",
55373
+ "supply",
55374
+ "waste"
55375
+ ]);
55376
+ /**
55377
+ * What an item LOOKS like, which decides how a client draws it — independent
55378
+ * of `kind`, which decides which direction is bad:
55379
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
55380
+ * remaining time and a reset.
55381
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
55382
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
55383
+ * a stepped level and "refill".
55384
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
55385
+ * that warns when full.
55386
+ * Absent = derived from the kind ({@link consumableFormOf}).
55387
+ */
55388
+ var ConsumableFormSchema = _enum([
55389
+ "part",
55390
+ "tank",
55391
+ "product",
55392
+ "bin"
55393
+ ]);
55394
+ /** The provider's own discrete verdict on an item. */
55395
+ var ConsumableStatusSchema = _enum([
55396
+ "ok",
55397
+ "low",
55398
+ "empty",
55399
+ "full",
55400
+ "replace"
55401
+ ]);
55402
+ _enum([
55403
+ "ok",
55404
+ "low",
55405
+ "empty",
55406
+ "full"
55407
+ ]);
55280
55408
  /** Units a remaining-life counter is reported in. Closed: the panel renders
55281
55409
  * each. */
55282
55410
  var ConsumableRemainingUnitSchema = _enum([
@@ -55291,18 +55419,23 @@ var ConsumableRemainingSchema = object({
55291
55419
  unit: ConsumableRemainingUnitSchema
55292
55420
  });
55293
55421
  /** A single consumable item. Either a continuous `level` (remaining
55294
- * life %) or a discrete `status` may be known — both may be null when a
55295
- * provider only knows the item exists. `level` and `status` are not
55296
- * mutually exclusive; a provider may report both. */
55422
+ * life %, or fill % for a `supply` / `waste` item) or a discrete `status`
55423
+ * may be known — both may be null when a provider only knows the item
55424
+ * exists. `level` and `status` are not mutually exclusive; a provider may
55425
+ * report both. */
55297
55426
  var ConsumableItemSchema = object({
55298
55427
  /** Stable id, e.g. 'main-brush'. */
55299
55428
  key: string().min(1),
55300
55429
  /** Display name. */
55301
55430
  label: string().min(1),
55302
- /** Remaining life % when known (0..100). */
55431
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
55303
55432
  level: number().min(0).max(100).nullable(),
55304
- /** Discrete state when known (binary mode). */
55305
- status: _enum(["ok", "replace"]).nullable(),
55433
+ /** The provider's discrete verdict when known (binary mode). */
55434
+ status: ConsumableStatusSchema.nullable(),
55435
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
55436
+ kind: ConsumableKindSchema.optional(),
55437
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
55438
+ form: ConsumableFormSchema.optional(),
55306
55439
  /** Ms epoch of the last replace, when known. */
55307
55440
  lastResetAt: number().nullable(),
55308
55441
  /** Whether `reset()` is meaningful for this item. */
@@ -55325,7 +55458,7 @@ var consumablesCapability = {
55325
55458
  kind: "widget",
55326
55459
  widgetId: "host/consumables-panel",
55327
55460
  tab: "consumables",
55328
- topTab: true,
55461
+ placement: "hero",
55329
55462
  label: "Consumables",
55330
55463
  order: 5
55331
55464
  } },
@@ -55386,9 +55519,37 @@ reset: method(object({
55386
55519
  */
55387
55520
  durability: "restored",
55388
55521
  /**
55389
- * History (D850): none — `items` is an array keyed by runtime ids; a history path never enters it.
55522
+ * History (D850, D917): one series per (item field, item `key`) — the item key
55523
+ * is the series scope, the item `label` names it. A vacuum tank's fill, a
55524
+ * brush's remaining life and a dishwasher's salt are each recorded the moment
55525
+ * their provider reports them; an item that appears later gets its series.
55390
55526
  */
55391
- history: "none",
55527
+ history: {
55528
+ fields: {},
55529
+ items: {
55530
+ path: "items",
55531
+ key: "key",
55532
+ label: "label",
55533
+ fields: {
55534
+ level: {
55535
+ kind: "gauge",
55536
+ unit: "%",
55537
+ deadband: 2,
55538
+ displayName: "Level"
55539
+ },
55540
+ status: {
55541
+ kind: "enum",
55542
+ displayName: "Status"
55543
+ },
55544
+ "remaining.value": {
55545
+ kind: "gauge",
55546
+ unitFrom: "remaining.unit",
55547
+ deadband: 1,
55548
+ displayName: "Remaining"
55549
+ }
55550
+ }
55551
+ }
55552
+ },
55392
55553
  /** Clocks, not content: a re-read that changed no item costs no commit. */
55393
55554
  volatileStateFields: ["lastChangedAt", "lastFetchedAt"]
55394
55555
  };
@@ -55803,8 +55964,9 @@ onStatusChanged: { data: object({
55803
55964
  volatileStateFields: ["lastChangedAt"]
55804
55965
  };
55805
55966
  /**
55806
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
55807
- * consumable levels (salt, rinse aid) and common program options.
55967
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
55968
+ * common program options. Salt and rinse aid are NOT here: they are items of
55969
+ * the device's `consumables` cap, like every other device's (D915).
55808
55970
  *
55809
55971
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
55810
55972
  * by any integration that exposes the same program / option surface.
@@ -55852,11 +56014,6 @@ var DishwasherAvailabilitySchema = _enum([
55852
56014
  "offline",
55853
56015
  "description-missing"
55854
56016
  ]);
55855
- var DishwasherConsumableLevelSchema = _enum([
55856
- "ok",
55857
- "low",
55858
- "empty"
55859
- ]);
55860
56017
  var DishwasherStatusSchema = object({
55861
56018
  availability: DishwasherAvailabilitySchema,
55862
56019
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -55889,8 +56046,6 @@ var DishwasherStatusSchema = object({
55889
56046
  powerOn: boolean().nullable(),
55890
56047
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
55891
56048
  powerState: string().nullable(),
55892
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
55893
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55894
56049
  /**
55895
56050
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
55896
56051
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -58766,7 +58921,7 @@ var motionTriggerCapability = {
58766
58921
  enabled: boolean()
58767
58922
  }), _void(), {
58768
58923
  kind: "mutation",
58769
- auth: "admin"
58924
+ auth: "protected"
58770
58925
  }) },
58771
58926
  events: { onMotionTriggerChanged: { data: object({
58772
58927
  deviceId: number(),
@@ -59496,6 +59651,13 @@ var TopologyNodeSchema = object({
59496
59651
  cpuModel: string().nullable(),
59497
59652
  cpuCores: number(),
59498
59653
  memoryMB: number(),
59654
+ /**
59655
+ * The inference RUNTIMES installed on the node (`pythonRuntimes`: onnx,
59656
+ * openvino, edgetpu …) — not its devices. An installed runtime says nothing
59657
+ * about whether its hardware is there (a Coral delegate stays installed
59658
+ * after the stick leaves, D919); the live device set is
59659
+ * `pipelineOrchestrator.getNodeInferenceDevices`.
59660
+ */
59499
59661
  engines: array(string()).readonly(),
59500
59662
  isHub: boolean(),
59501
59663
  isOnline: boolean(),
@@ -60613,7 +60775,28 @@ var ResolvedInferenceConfigSchema = object({
60613
60775
  format: ModelFormatSchema,
60614
60776
  reason: string()
60615
60777
  });
60616
- method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema);
60778
+ /**
60779
+ * The answer of an accelerator rescan (D919): the node's device list after
60780
+ * the re-probe, what changed, and the evidence that decided the Coral answer
60781
+ * (`usbBus` — could the USB bus be read at all; `decidedBy` — USB ids, the PCI
60782
+ * bus, the installed-delegate fallback, or nothing).
60783
+ */
60784
+ var AcceleratorRescanSchema = object({
60785
+ devices: array(InferenceDeviceDescriptorSchema).readonly(),
60786
+ appeared: array(string()).readonly(),
60787
+ disappeared: array(string()).readonly(),
60788
+ usbBus: _enum(["observed", "unobservable"]),
60789
+ decidedBy: _enum([
60790
+ "usb-ids",
60791
+ "pci",
60792
+ "delegate-fallback",
60793
+ "none"
60794
+ ])
60795
+ });
60796
+ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema), method(_void(), AcceleratorRescanSchema, {
60797
+ kind: "mutation",
60798
+ auth: "admin"
60799
+ });
60617
60800
  /**
60618
60801
  * Multi-metric electrical meter. One slice can carry any combination
60619
60802
  * of instantaneous power (W), cumulative energy (kWh), voltage (V),
@@ -64706,60 +64889,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64706
64889
  auth: "admin",
64707
64890
  access: "delete"
64708
64891
  });
64709
- /**
64710
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
64711
- * cleaning lifecycle plus a return-to-base / locate surface and an
64712
- * optional fan-speed selector.
64713
- *
64714
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
64715
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
64716
- * (0..100) is nullable — some vacuums don't report a battery
64717
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
64718
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
64719
- * tokens the hardware accepts so the UI renders only supported choices.
64720
- *
64721
- * The `setFanSpeed` method takes the bare `speed` token — the provider
64722
- * validates it against the vacuum's own list. `locate` triggers the
64723
- * find-me chirp; `returnToBase` sends it home.
64724
- *
64725
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
64726
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
64727
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
64728
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
64729
- * only when the device has no such tank at all, and use a `TankStatus`
64730
- * with both inner fields `null` when the tank exists but its level is
64731
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
64732
- * so the HA provider leaves all four `null`.
64733
- */
64734
- var VacuumStateSchema = _enum([
64735
- "idle",
64736
- "cleaning",
64737
- "paused",
64738
- "returning",
64739
- "docked",
64740
- "drying",
64741
- "error"
64742
- ]);
64743
- /**
64744
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
64745
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
64746
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
64747
- * level is currently unknown; the OWNING field being `null` means the
64748
- * hardware has no such tank at all.
64749
- */
64750
- var TankStatusSchema = object({
64751
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
64752
- level: number().min(0).max(100).nullable(),
64753
- /** Discrete state when the hardware is binary-mode; null otherwise. */
64754
- status: _enum([
64755
- "ok",
64756
- "low",
64757
- "full"
64758
- ]).nullable()
64759
- });
64760
64892
  var VacuumControlStatusSchema = object({
64761
64893
  /** Lifecycle state of the vacuum. */
64762
- state: VacuumStateSchema,
64894
+ state: _enum([
64895
+ "idle",
64896
+ "cleaning",
64897
+ "paused",
64898
+ "returning",
64899
+ "docked",
64900
+ "drying",
64901
+ "error"
64902
+ ]),
64763
64903
  /** 0..100 battery percentage. Null when the device has no battery
64764
64904
  * reading. */
64765
64905
  batteryLevel: number().min(0).max(100).nullable(),
@@ -64768,14 +64908,6 @@ var VacuumControlStatusSchema = object({
64768
64908
  fanSpeed: string().nullable(),
64769
64909
  /** Speed tokens the hardware accepts — drives the UI selector. */
64770
64910
  availableFanSpeeds: array(string()),
64771
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
64772
- cleanWater: TankStatusSchema.nullable(),
64773
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
64774
- dirtyWater: TankStatusSchema.nullable(),
64775
- /** Detergent tank. Null when the hardware has no detergent tank. */
64776
- detergent: TankStatusSchema.nullable(),
64777
- /** Dust bin. Null when the hardware has no dust bin. */
64778
- dustBin: TankStatusSchema.nullable(),
64779
64911
  /** 0..100 cleaning-completion percentage of the current task, or null. */
64780
64912
  progressPercent: number().min(0).max(100).nullable(),
64781
64913
  /** Current error code (0 / null = no error). */
@@ -64837,35 +64969,14 @@ var vacuumControlCapability = {
64837
64969
  */
64838
64970
  durability: "session",
64839
64971
  /**
64840
- * History (D850): recorded series. Tank levels are fixed-object paths (`cleanWater.level`, ...).
64972
+ * History (D850): recorded series. The tanks moved to `consumables` (D915), whose
64973
+ * items are keyed by runtime ids and record no history.
64841
64974
  */
64842
- history: { fields: {
64843
- batteryLevel: {
64844
- kind: "gauge",
64845
- unit: "%",
64846
- deadband: 2
64847
- },
64848
- "cleanWater.level": {
64849
- kind: "gauge",
64850
- unit: "%",
64851
- deadband: 2
64852
- },
64853
- "dirtyWater.level": {
64854
- kind: "gauge",
64855
- unit: "%",
64856
- deadband: 2
64857
- },
64858
- "detergent.level": {
64859
- kind: "gauge",
64860
- unit: "%",
64861
- deadband: 2
64862
- },
64863
- "dustBin.level": {
64864
- kind: "gauge",
64865
- unit: "%",
64866
- deadband: 2
64867
- }
64868
- } }
64975
+ history: { fields: { batteryLevel: {
64976
+ kind: "gauge",
64977
+ unit: "%",
64978
+ deadband: 2
64979
+ } } }
64869
64980
  };
64870
64981
  var ValveStatusSchema = object({
64871
64982
  /** Lifecycle state of the valve. */
@@ -68776,6 +68887,12 @@ Object.freeze({
68776
68887
  addonId: null,
68777
68888
  access: "create"
68778
68889
  },
68890
+ "deviceHistory.deleteOrphanSeries": {
68891
+ capName: "device-history",
68892
+ capScope: "system",
68893
+ addonId: null,
68894
+ access: "delete"
68895
+ },
68779
68896
  "deviceHistory.getDeviceEnabled": {
68780
68897
  capName: "device-history",
68781
68898
  capScope: "system",
@@ -68794,6 +68911,12 @@ Object.freeze({
68794
68911
  addonId: null,
68795
68912
  access: "view"
68796
68913
  },
68914
+ "deviceHistory.listOrphanSeries": {
68915
+ capName: "device-history",
68916
+ capScope: "system",
68917
+ addonId: null,
68918
+ access: "view"
68919
+ },
68797
68920
  "deviceHistory.listSeries": {
68798
68921
  capName: "device-history",
68799
68922
  capScope: "system",
@@ -72418,6 +72541,12 @@ Object.freeze({
72418
72541
  addonId: null,
72419
72542
  access: "delete"
72420
72543
  },
72544
+ "pipelineOrchestrator.forgetInferenceDevice": {
72545
+ capName: "pipeline-orchestrator",
72546
+ capScope: "system",
72547
+ addonId: null,
72548
+ access: "delete"
72549
+ },
72421
72550
  "pipelineOrchestrator.getAgentLoad": {
72422
72551
  capName: "pipeline-orchestrator",
72423
72552
  capScope: "system",
@@ -72994,6 +73123,12 @@ Object.freeze({
72994
73123
  addonId: null,
72995
73124
  access: "view"
72996
73125
  },
73126
+ "platformProbe.rescanAccelerators": {
73127
+ capName: "platform-probe",
73128
+ capScope: "system",
73129
+ addonId: null,
73130
+ access: "create"
73131
+ },
72997
73132
  "platformProbe.resolveHwAccel": {
72998
73133
  capName: "platform-probe",
72999
73134
  capScope: "system",
@@ -78799,7 +78934,7 @@ var STATE_SUMMARY_VARS = [
78799
78934
  ([...RULE_TEXT], [...COMBINED_ALARM]),
78800
78935
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
78801
78936
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
78802
- ([...RULE_TEXT], [...CONSUMABLE]),
78937
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
78803
78938
  ([...RULE_TEXT], [...TANK]),
78804
78939
  [...RULE_TEXT],
78805
78940
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
package/dist/addon.mjs CHANGED
@@ -5440,7 +5440,7 @@ var ZodIssueCode = {
5440
5440
  var ZodFirstPartyTypeKind;
5441
5441
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5442
5442
  //#endregion
5443
- //#region ../types/dist/sleep-DJFUfKvA.mjs
5443
+ //#region ../types/dist/sleep-CUp20JkO.mjs
5444
5444
  /**
5445
5445
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5446
5446
  * window to float samples (D455).
@@ -8391,7 +8391,11 @@ var ContributionSectionSchema = object({
8391
8391
  literal(4)
8392
8392
  ]).optional(),
8393
8393
  tab: string().optional(),
8394
- location: _enum(["settings", "top-tab"]).optional(),
8394
+ location: _enum([
8395
+ "settings",
8396
+ "top-tab",
8397
+ "hero"
8398
+ ]).optional(),
8395
8399
  order: number().optional(),
8396
8400
  fields: array(any())
8397
8401
  });
@@ -13356,7 +13360,11 @@ var ConfigSectionWithValuesSchema = object({
13356
13360
  literal(4)
13357
13361
  ]).optional(),
13358
13362
  tab: string().optional(),
13359
- location: _enum(["settings", "top-tab"]).optional(),
13363
+ location: _enum([
13364
+ "settings",
13365
+ "top-tab",
13366
+ "hero"
13367
+ ]).optional(),
13360
13368
  order: number().optional(),
13361
13369
  fields: array(any())
13362
13370
  });
@@ -17236,6 +17244,52 @@ var TierStatusSchema = object({
17236
17244
  countedAt: number().nullable()
17237
17245
  });
17238
17246
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
17247
+ /**
17248
+ * Why a series is orphan. `device-gone`: its device is absent from the
17249
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
17250
+ * key is declared by no capability any more (a field a cap removed).
17251
+ */
17252
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
17253
+ /** Rows held per stored tier. */
17254
+ var TierRowsSchema = object({
17255
+ raw: number().int(),
17256
+ "5m": number().int(),
17257
+ "1h": number().int(),
17258
+ "1d": number().int()
17259
+ });
17260
+ var OrphanSeriesSchema = object({
17261
+ seriesId: number().int(),
17262
+ deviceId: number().int(),
17263
+ key: string(),
17264
+ scope: string(),
17265
+ /** The metric's display name; `null` when its metric row is gone too. */
17266
+ displayName: string().nullable(),
17267
+ reason: DeviceHistoryOrphanReasonSchema,
17268
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
17269
+ missingSince: number().nullable(),
17270
+ firstTs: number(),
17271
+ lastTs: number(),
17272
+ rows: TierRowsSchema
17273
+ });
17274
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
17275
+ "not-found",
17276
+ "not-orphan",
17277
+ "failed"
17278
+ ]);
17279
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
17280
+ seriesId: number().int(),
17281
+ ok: literal(true),
17282
+ deleted: TierRowsSchema
17283
+ }), object({
17284
+ seriesId: number().int(),
17285
+ ok: literal(false),
17286
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
17287
+ })]);
17288
+ var OrphanListSchema = object({
17289
+ series: array(OrphanSeriesSchema).readonly(),
17290
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
17291
+ truncated: boolean()
17292
+ });
17239
17293
  var DeviceHistoryStatusSchema = object({
17240
17294
  startedAt: number(),
17241
17295
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -17333,7 +17387,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
17333
17387
  }), object({ enabled: boolean() }), {
17334
17388
  kind: "mutation",
17335
17389
  auth: "admin"
17336
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
17390
+ }), 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() }), {
17391
+ kind: "mutation",
17392
+ auth: "admin"
17393
+ });
17337
17394
  var DeviceCaStatusSchema = discriminatedUnion("state", [
17338
17395
  object({ state: literal("absent") }),
17339
17396
  object({
@@ -50206,6 +50263,19 @@ var NodeInferenceDeviceSchema = object({
50206
50263
  /** Whether the node's live probe reports the device as usable right now. */
50207
50264
  available: boolean(),
50208
50265
  /**
50266
+ * Is the device on the node at all (D919)? `present` — the live probe
50267
+ * reported it; `absent` — the probe ANSWERED and did not report it, so only
50268
+ * its stored settings remain (unplugged, moved to another node): never
50269
+ * eligible, whatever its stored `enabled`, and forgettable with
50270
+ * `forgetInferenceDevice`; `unknown` — the probe did not answer, nothing is
50271
+ * claimed (D315). Optional only for an orchestrator older than the field.
50272
+ */
50273
+ presence: _enum([
50274
+ "present",
50275
+ "absent",
50276
+ "unknown"
50277
+ ]).optional(),
50278
+ /**
50209
50279
  * Whether this device participates in dispatch. AUTO default (spec C2):
50210
50280
  * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
50211
50281
  * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
@@ -50431,7 +50501,13 @@ method(object({
50431
50501
  }), object({ success: literal(true) }), {
50432
50502
  kind: "mutation",
50433
50503
  auth: "admin"
50434
- }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
50504
+ }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({
50505
+ agentNodeId: string(),
50506
+ deviceKey: string()
50507
+ }), object({ success: literal(true) }), {
50508
+ kind: "mutation",
50509
+ auth: "admin"
50510
+ }), method(object({ agentNodeId: string() }), object({
50435
50511
  success: literal(true),
50436
50512
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
50437
50513
  effectiveModelId: string().nullable(),
@@ -55243,17 +55319,69 @@ var connectivityCapability = {
55243
55319
  volatileStateFields: ["lastChangedAt"]
55244
55320
  };
55245
55321
  /**
55246
- * Generic device-consumables capability — surfaces a device's
55247
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
55248
- * descaling cycles, …) with their remaining life and an optional
55249
- * "Replaced" reset action. Device-agnostic: any provider that knows its
55250
- * device tracks consumables can register it; the cap declares no
55251
- * vocabulary of its own — the provider names each item verbatim.
55322
+ * Generic device-consumables capability — the ONE place a device reports what
55323
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
55324
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
55325
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
55326
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
55327
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
55328
+ * its device tracks consumables registers it; the provider names each item
55329
+ * verbatim and says which `kind` it is.
55330
+ *
55331
+ * The admin UI renders it as ONE collapsible section directly under the
55332
+ * device page's hero card (`placement: 'hero'`), for every device bound to
55333
+ * this cap — never drawn by a device type's hero card itself (D915).
55252
55334
  *
55253
55335
  * Like `childLayout`, the cap is INERT until a provider sets items: no
55254
55336
  * provider populates it by guessing (no HA inference). The UI renders a
55255
55337
  * "No consumables reported" placeholder when `items` is empty.
55256
55338
  */
55339
+ /**
55340
+ * What an item IS, which decides which direction is bad:
55341
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
55342
+ * - `supply` — something the device draws from (clean water, detergent,
55343
+ * salt, rinse aid); low or empty is bad.
55344
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
55345
+ * bad.
55346
+ * Absent = `wear`.
55347
+ */
55348
+ var ConsumableKindSchema = _enum([
55349
+ "wear",
55350
+ "supply",
55351
+ "waste"
55352
+ ]);
55353
+ /**
55354
+ * What an item LOOKS like, which decides how a client draws it — independent
55355
+ * of `kind`, which decides which direction is bad:
55356
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
55357
+ * remaining time and a reset.
55358
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
55359
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
55360
+ * a stepped level and "refill".
55361
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
55362
+ * that warns when full.
55363
+ * Absent = derived from the kind ({@link consumableFormOf}).
55364
+ */
55365
+ var ConsumableFormSchema = _enum([
55366
+ "part",
55367
+ "tank",
55368
+ "product",
55369
+ "bin"
55370
+ ]);
55371
+ /** The provider's own discrete verdict on an item. */
55372
+ var ConsumableStatusSchema = _enum([
55373
+ "ok",
55374
+ "low",
55375
+ "empty",
55376
+ "full",
55377
+ "replace"
55378
+ ]);
55379
+ _enum([
55380
+ "ok",
55381
+ "low",
55382
+ "empty",
55383
+ "full"
55384
+ ]);
55257
55385
  /** Units a remaining-life counter is reported in. Closed: the panel renders
55258
55386
  * each. */
55259
55387
  var ConsumableRemainingUnitSchema = _enum([
@@ -55268,18 +55396,23 @@ var ConsumableRemainingSchema = object({
55268
55396
  unit: ConsumableRemainingUnitSchema
55269
55397
  });
55270
55398
  /** A single consumable item. Either a continuous `level` (remaining
55271
- * life %) or a discrete `status` may be known — both may be null when a
55272
- * provider only knows the item exists. `level` and `status` are not
55273
- * mutually exclusive; a provider may report both. */
55399
+ * life %, or fill % for a `supply` / `waste` item) or a discrete `status`
55400
+ * may be known — both may be null when a provider only knows the item
55401
+ * exists. `level` and `status` are not mutually exclusive; a provider may
55402
+ * report both. */
55274
55403
  var ConsumableItemSchema = object({
55275
55404
  /** Stable id, e.g. 'main-brush'. */
55276
55405
  key: string().min(1),
55277
55406
  /** Display name. */
55278
55407
  label: string().min(1),
55279
- /** Remaining life % when known (0..100). */
55408
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
55280
55409
  level: number().min(0).max(100).nullable(),
55281
- /** Discrete state when known (binary mode). */
55282
- status: _enum(["ok", "replace"]).nullable(),
55410
+ /** The provider's discrete verdict when known (binary mode). */
55411
+ status: ConsumableStatusSchema.nullable(),
55412
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
55413
+ kind: ConsumableKindSchema.optional(),
55414
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
55415
+ form: ConsumableFormSchema.optional(),
55283
55416
  /** Ms epoch of the last replace, when known. */
55284
55417
  lastResetAt: number().nullable(),
55285
55418
  /** Whether `reset()` is meaningful for this item. */
@@ -55302,7 +55435,7 @@ var consumablesCapability = {
55302
55435
  kind: "widget",
55303
55436
  widgetId: "host/consumables-panel",
55304
55437
  tab: "consumables",
55305
- topTab: true,
55438
+ placement: "hero",
55306
55439
  label: "Consumables",
55307
55440
  order: 5
55308
55441
  } },
@@ -55363,9 +55496,37 @@ reset: method(object({
55363
55496
  */
55364
55497
  durability: "restored",
55365
55498
  /**
55366
- * History (D850): none — `items` is an array keyed by runtime ids; a history path never enters it.
55499
+ * History (D850, D917): one series per (item field, item `key`) — the item key
55500
+ * is the series scope, the item `label` names it. A vacuum tank's fill, a
55501
+ * brush's remaining life and a dishwasher's salt are each recorded the moment
55502
+ * their provider reports them; an item that appears later gets its series.
55367
55503
  */
55368
- history: "none",
55504
+ history: {
55505
+ fields: {},
55506
+ items: {
55507
+ path: "items",
55508
+ key: "key",
55509
+ label: "label",
55510
+ fields: {
55511
+ level: {
55512
+ kind: "gauge",
55513
+ unit: "%",
55514
+ deadband: 2,
55515
+ displayName: "Level"
55516
+ },
55517
+ status: {
55518
+ kind: "enum",
55519
+ displayName: "Status"
55520
+ },
55521
+ "remaining.value": {
55522
+ kind: "gauge",
55523
+ unitFrom: "remaining.unit",
55524
+ deadband: 1,
55525
+ displayName: "Remaining"
55526
+ }
55527
+ }
55528
+ }
55529
+ },
55369
55530
  /** Clocks, not content: a re-read that changed no item costs no commit. */
55370
55531
  volatileStateFields: ["lastChangedAt", "lastFetchedAt"]
55371
55532
  };
@@ -55780,8 +55941,9 @@ onStatusChanged: { data: object({
55780
55941
  volatileStateFields: ["lastChangedAt"]
55781
55942
  };
55782
55943
  /**
55783
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
55784
- * consumable levels (salt, rinse aid) and common program options.
55944
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
55945
+ * common program options. Salt and rinse aid are NOT here: they are items of
55946
+ * the device's `consumables` cap, like every other device's (D915).
55785
55947
  *
55786
55948
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
55787
55949
  * by any integration that exposes the same program / option surface.
@@ -55829,11 +55991,6 @@ var DishwasherAvailabilitySchema = _enum([
55829
55991
  "offline",
55830
55992
  "description-missing"
55831
55993
  ]);
55832
- var DishwasherConsumableLevelSchema = _enum([
55833
- "ok",
55834
- "low",
55835
- "empty"
55836
- ]);
55837
55994
  var DishwasherStatusSchema = object({
55838
55995
  availability: DishwasherAvailabilitySchema,
55839
55996
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -55866,8 +56023,6 @@ var DishwasherStatusSchema = object({
55866
56023
  powerOn: boolean().nullable(),
55867
56024
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
55868
56025
  powerState: string().nullable(),
55869
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
55870
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55871
56026
  /**
55872
56027
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
55873
56028
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -58743,7 +58898,7 @@ var motionTriggerCapability = {
58743
58898
  enabled: boolean()
58744
58899
  }), _void(), {
58745
58900
  kind: "mutation",
58746
- auth: "admin"
58901
+ auth: "protected"
58747
58902
  }) },
58748
58903
  events: { onMotionTriggerChanged: { data: object({
58749
58904
  deviceId: number(),
@@ -59473,6 +59628,13 @@ var TopologyNodeSchema = object({
59473
59628
  cpuModel: string().nullable(),
59474
59629
  cpuCores: number(),
59475
59630
  memoryMB: number(),
59631
+ /**
59632
+ * The inference RUNTIMES installed on the node (`pythonRuntimes`: onnx,
59633
+ * openvino, edgetpu …) — not its devices. An installed runtime says nothing
59634
+ * about whether its hardware is there (a Coral delegate stays installed
59635
+ * after the stick leaves, D919); the live device set is
59636
+ * `pipelineOrchestrator.getNodeInferenceDevices`.
59637
+ */
59476
59638
  engines: array(string()).readonly(),
59477
59639
  isHub: boolean(),
59478
59640
  isOnline: boolean(),
@@ -60590,7 +60752,28 @@ var ResolvedInferenceConfigSchema = object({
60590
60752
  format: ModelFormatSchema,
60591
60753
  reason: string()
60592
60754
  });
60593
- method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema);
60755
+ /**
60756
+ * The answer of an accelerator rescan (D919): the node's device list after
60757
+ * the re-probe, what changed, and the evidence that decided the Coral answer
60758
+ * (`usbBus` — could the USB bus be read at all; `decidedBy` — USB ids, the PCI
60759
+ * bus, the installed-delegate fallback, or nothing).
60760
+ */
60761
+ var AcceleratorRescanSchema = object({
60762
+ devices: array(InferenceDeviceDescriptorSchema).readonly(),
60763
+ appeared: array(string()).readonly(),
60764
+ disappeared: array(string()).readonly(),
60765
+ usbBus: _enum(["observed", "unobservable"]),
60766
+ decidedBy: _enum([
60767
+ "usb-ids",
60768
+ "pci",
60769
+ "delegate-fallback",
60770
+ "none"
60771
+ ])
60772
+ });
60773
+ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema), method(_void(), AcceleratorRescanSchema, {
60774
+ kind: "mutation",
60775
+ auth: "admin"
60776
+ });
60594
60777
  /**
60595
60778
  * Multi-metric electrical meter. One slice can carry any combination
60596
60779
  * of instantaneous power (W), cumulative energy (kWh), voltage (V),
@@ -64683,60 +64866,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64683
64866
  auth: "admin",
64684
64867
  access: "delete"
64685
64868
  });
64686
- /**
64687
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
64688
- * cleaning lifecycle plus a return-to-base / locate surface and an
64689
- * optional fan-speed selector.
64690
- *
64691
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
64692
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
64693
- * (0..100) is nullable — some vacuums don't report a battery
64694
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
64695
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
64696
- * tokens the hardware accepts so the UI renders only supported choices.
64697
- *
64698
- * The `setFanSpeed` method takes the bare `speed` token — the provider
64699
- * validates it against the vacuum's own list. `locate` triggers the
64700
- * find-me chirp; `returnToBase` sends it home.
64701
- *
64702
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
64703
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
64704
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
64705
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
64706
- * only when the device has no such tank at all, and use a `TankStatus`
64707
- * with both inner fields `null` when the tank exists but its level is
64708
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
64709
- * so the HA provider leaves all four `null`.
64710
- */
64711
- var VacuumStateSchema = _enum([
64712
- "idle",
64713
- "cleaning",
64714
- "paused",
64715
- "returning",
64716
- "docked",
64717
- "drying",
64718
- "error"
64719
- ]);
64720
- /**
64721
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
64722
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
64723
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
64724
- * level is currently unknown; the OWNING field being `null` means the
64725
- * hardware has no such tank at all.
64726
- */
64727
- var TankStatusSchema = object({
64728
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
64729
- level: number().min(0).max(100).nullable(),
64730
- /** Discrete state when the hardware is binary-mode; null otherwise. */
64731
- status: _enum([
64732
- "ok",
64733
- "low",
64734
- "full"
64735
- ]).nullable()
64736
- });
64737
64869
  var VacuumControlStatusSchema = object({
64738
64870
  /** Lifecycle state of the vacuum. */
64739
- state: VacuumStateSchema,
64871
+ state: _enum([
64872
+ "idle",
64873
+ "cleaning",
64874
+ "paused",
64875
+ "returning",
64876
+ "docked",
64877
+ "drying",
64878
+ "error"
64879
+ ]),
64740
64880
  /** 0..100 battery percentage. Null when the device has no battery
64741
64881
  * reading. */
64742
64882
  batteryLevel: number().min(0).max(100).nullable(),
@@ -64745,14 +64885,6 @@ var VacuumControlStatusSchema = object({
64745
64885
  fanSpeed: string().nullable(),
64746
64886
  /** Speed tokens the hardware accepts — drives the UI selector. */
64747
64887
  availableFanSpeeds: array(string()),
64748
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
64749
- cleanWater: TankStatusSchema.nullable(),
64750
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
64751
- dirtyWater: TankStatusSchema.nullable(),
64752
- /** Detergent tank. Null when the hardware has no detergent tank. */
64753
- detergent: TankStatusSchema.nullable(),
64754
- /** Dust bin. Null when the hardware has no dust bin. */
64755
- dustBin: TankStatusSchema.nullable(),
64756
64888
  /** 0..100 cleaning-completion percentage of the current task, or null. */
64757
64889
  progressPercent: number().min(0).max(100).nullable(),
64758
64890
  /** Current error code (0 / null = no error). */
@@ -64814,35 +64946,14 @@ var vacuumControlCapability = {
64814
64946
  */
64815
64947
  durability: "session",
64816
64948
  /**
64817
- * History (D850): recorded series. Tank levels are fixed-object paths (`cleanWater.level`, ...).
64949
+ * History (D850): recorded series. The tanks moved to `consumables` (D915), whose
64950
+ * items are keyed by runtime ids and record no history.
64818
64951
  */
64819
- history: { fields: {
64820
- batteryLevel: {
64821
- kind: "gauge",
64822
- unit: "%",
64823
- deadband: 2
64824
- },
64825
- "cleanWater.level": {
64826
- kind: "gauge",
64827
- unit: "%",
64828
- deadband: 2
64829
- },
64830
- "dirtyWater.level": {
64831
- kind: "gauge",
64832
- unit: "%",
64833
- deadband: 2
64834
- },
64835
- "detergent.level": {
64836
- kind: "gauge",
64837
- unit: "%",
64838
- deadband: 2
64839
- },
64840
- "dustBin.level": {
64841
- kind: "gauge",
64842
- unit: "%",
64843
- deadband: 2
64844
- }
64845
- } }
64952
+ history: { fields: { batteryLevel: {
64953
+ kind: "gauge",
64954
+ unit: "%",
64955
+ deadband: 2
64956
+ } } }
64846
64957
  };
64847
64958
  var ValveStatusSchema = object({
64848
64959
  /** Lifecycle state of the valve. */
@@ -68753,6 +68864,12 @@ Object.freeze({
68753
68864
  addonId: null,
68754
68865
  access: "create"
68755
68866
  },
68867
+ "deviceHistory.deleteOrphanSeries": {
68868
+ capName: "device-history",
68869
+ capScope: "system",
68870
+ addonId: null,
68871
+ access: "delete"
68872
+ },
68756
68873
  "deviceHistory.getDeviceEnabled": {
68757
68874
  capName: "device-history",
68758
68875
  capScope: "system",
@@ -68771,6 +68888,12 @@ Object.freeze({
68771
68888
  addonId: null,
68772
68889
  access: "view"
68773
68890
  },
68891
+ "deviceHistory.listOrphanSeries": {
68892
+ capName: "device-history",
68893
+ capScope: "system",
68894
+ addonId: null,
68895
+ access: "view"
68896
+ },
68774
68897
  "deviceHistory.listSeries": {
68775
68898
  capName: "device-history",
68776
68899
  capScope: "system",
@@ -72395,6 +72518,12 @@ Object.freeze({
72395
72518
  addonId: null,
72396
72519
  access: "delete"
72397
72520
  },
72521
+ "pipelineOrchestrator.forgetInferenceDevice": {
72522
+ capName: "pipeline-orchestrator",
72523
+ capScope: "system",
72524
+ addonId: null,
72525
+ access: "delete"
72526
+ },
72398
72527
  "pipelineOrchestrator.getAgentLoad": {
72399
72528
  capName: "pipeline-orchestrator",
72400
72529
  capScope: "system",
@@ -72971,6 +73100,12 @@ Object.freeze({
72971
73100
  addonId: null,
72972
73101
  access: "view"
72973
73102
  },
73103
+ "platformProbe.rescanAccelerators": {
73104
+ capName: "platform-probe",
73105
+ capScope: "system",
73106
+ addonId: null,
73107
+ access: "create"
73108
+ },
72974
73109
  "platformProbe.resolveHwAccel": {
72975
73110
  capName: "platform-probe",
72976
73111
  capScope: "system",
@@ -78776,7 +78911,7 @@ var STATE_SUMMARY_VARS = [
78776
78911
  ([...RULE_TEXT], [...COMBINED_ALARM]),
78777
78912
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
78778
78913
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
78779
- ([...RULE_TEXT], [...CONSUMABLE]),
78914
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
78780
78915
  ([...RULE_TEXT], [...TANK]),
78781
78916
  [...RULE_TEXT],
78782
78917
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-terminal",
3
- "version": "0.1.149",
3
+ "version": "0.1.151",
4
4
  "description": "Interactive terminal sessions (pty + xterm) as a CamStack addon",
5
5
  "keywords": [
6
6
  "camstack",