@camstack/addon-google-services 0.2.26 → 0.2.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5568,7 +5568,7 @@ var ZodIssueCode = {
5568
5568
  var ZodFirstPartyTypeKind;
5569
5569
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5570
5570
  //#endregion
5571
- //#region ../types/dist/sleep-DJFUfKvA.mjs
5571
+ //#region ../types/dist/sleep-CUp20JkO.mjs
5572
5572
  /**
5573
5573
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5574
5574
  * window to float samples (D455).
@@ -8648,7 +8648,11 @@ var ContributionSectionSchema = object({
8648
8648
  literal(4)
8649
8649
  ]).optional(),
8650
8650
  tab: string().optional(),
8651
- location: _enum(["settings", "top-tab"]).optional(),
8651
+ location: _enum([
8652
+ "settings",
8653
+ "top-tab",
8654
+ "hero"
8655
+ ]).optional(),
8652
8656
  order: number().optional(),
8653
8657
  fields: array(any())
8654
8658
  });
@@ -13717,7 +13721,11 @@ var ConfigSectionWithValuesSchema = object({
13717
13721
  literal(4)
13718
13722
  ]).optional(),
13719
13723
  tab: string().optional(),
13720
- location: _enum(["settings", "top-tab"]).optional(),
13724
+ location: _enum([
13725
+ "settings",
13726
+ "top-tab",
13727
+ "hero"
13728
+ ]).optional(),
13721
13729
  order: number().optional(),
13722
13730
  fields: array(any())
13723
13731
  });
@@ -17540,6 +17548,52 @@ var TierStatusSchema = object({
17540
17548
  countedAt: number().nullable()
17541
17549
  });
17542
17550
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
17551
+ /**
17552
+ * Why a series is orphan. `device-gone`: its device is absent from the
17553
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
17554
+ * key is declared by no capability any more (a field a cap removed).
17555
+ */
17556
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
17557
+ /** Rows held per stored tier. */
17558
+ var TierRowsSchema = object({
17559
+ raw: number().int(),
17560
+ "5m": number().int(),
17561
+ "1h": number().int(),
17562
+ "1d": number().int()
17563
+ });
17564
+ var OrphanSeriesSchema = object({
17565
+ seriesId: number().int(),
17566
+ deviceId: number().int(),
17567
+ key: string(),
17568
+ scope: string(),
17569
+ /** The metric's display name; `null` when its metric row is gone too. */
17570
+ displayName: string().nullable(),
17571
+ reason: DeviceHistoryOrphanReasonSchema,
17572
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
17573
+ missingSince: number().nullable(),
17574
+ firstTs: number(),
17575
+ lastTs: number(),
17576
+ rows: TierRowsSchema
17577
+ });
17578
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
17579
+ "not-found",
17580
+ "not-orphan",
17581
+ "failed"
17582
+ ]);
17583
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
17584
+ seriesId: number().int(),
17585
+ ok: literal(true),
17586
+ deleted: TierRowsSchema
17587
+ }), object({
17588
+ seriesId: number().int(),
17589
+ ok: literal(false),
17590
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
17591
+ })]);
17592
+ var OrphanListSchema = object({
17593
+ series: array(OrphanSeriesSchema).readonly(),
17594
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
17595
+ truncated: boolean()
17596
+ });
17543
17597
  var DeviceHistoryStatusSchema = object({
17544
17598
  startedAt: number(),
17545
17599
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -17637,7 +17691,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
17637
17691
  }), object({ enabled: boolean() }), {
17638
17692
  kind: "mutation",
17639
17693
  auth: "admin"
17640
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
17694
+ }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" }), method(object({}), OrphanListSchema, { auth: "admin" }), method(object({ seriesIds: array(number().int()).min(1).max(50) }), object({ results: array(OrphanDeleteEntrySchema).readonly() }), {
17695
+ kind: "mutation",
17696
+ auth: "admin"
17697
+ });
17641
17698
  var DeviceCaStatusSchema = discriminatedUnion("state", [
17642
17699
  object({ state: literal("absent") }),
17643
17700
  object({
@@ -50311,6 +50368,19 @@ var NodeInferenceDeviceSchema = object({
50311
50368
  /** Whether the node's live probe reports the device as usable right now. */
50312
50369
  available: boolean(),
50313
50370
  /**
50371
+ * Is the device on the node at all (D919)? `present` — the live probe
50372
+ * reported it; `absent` — the probe ANSWERED and did not report it, so only
50373
+ * its stored settings remain (unplugged, moved to another node): never
50374
+ * eligible, whatever its stored `enabled`, and forgettable with
50375
+ * `forgetInferenceDevice`; `unknown` — the probe did not answer, nothing is
50376
+ * claimed (D315). Optional only for an orchestrator older than the field.
50377
+ */
50378
+ presence: _enum([
50379
+ "present",
50380
+ "absent",
50381
+ "unknown"
50382
+ ]).optional(),
50383
+ /**
50314
50384
  * Whether this device participates in dispatch. AUTO default (spec C2):
50315
50385
  * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
50316
50386
  * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
@@ -50536,7 +50606,13 @@ method(object({
50536
50606
  }), object({ success: literal(true) }), {
50537
50607
  kind: "mutation",
50538
50608
  auth: "admin"
50539
- }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
50609
+ }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({
50610
+ agentNodeId: string(),
50611
+ deviceKey: string()
50612
+ }), object({ success: literal(true) }), {
50613
+ kind: "mutation",
50614
+ auth: "admin"
50615
+ }), method(object({ agentNodeId: string() }), object({
50540
50616
  success: literal(true),
50541
50617
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
50542
50618
  effectiveModelId: string().nullable(),
@@ -54669,17 +54745,69 @@ object({
54669
54745
  });
54670
54746
  DeviceType.Sensor;
54671
54747
  /**
54672
- * Generic device-consumables capability — surfaces a device's
54673
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
54674
- * descaling cycles, …) with their remaining life and an optional
54675
- * "Replaced" reset action. Device-agnostic: any provider that knows its
54676
- * device tracks consumables can register it; the cap declares no
54677
- * vocabulary of its own — the provider names each item verbatim.
54748
+ * Generic device-consumables capability — the ONE place a device reports what
54749
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
54750
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
54751
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
54752
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
54753
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
54754
+ * its device tracks consumables registers it; the provider names each item
54755
+ * verbatim and says which `kind` it is.
54756
+ *
54757
+ * The admin UI renders it as ONE collapsible section directly under the
54758
+ * device page's hero card (`placement: 'hero'`), for every device bound to
54759
+ * this cap — never drawn by a device type's hero card itself (D915).
54678
54760
  *
54679
54761
  * Like `childLayout`, the cap is INERT until a provider sets items: no
54680
54762
  * provider populates it by guessing (no HA inference). The UI renders a
54681
54763
  * "No consumables reported" placeholder when `items` is empty.
54682
54764
  */
54765
+ /**
54766
+ * What an item IS, which decides which direction is bad:
54767
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
54768
+ * - `supply` — something the device draws from (clean water, detergent,
54769
+ * salt, rinse aid); low or empty is bad.
54770
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
54771
+ * bad.
54772
+ * Absent = `wear`.
54773
+ */
54774
+ var ConsumableKindSchema = _enum([
54775
+ "wear",
54776
+ "supply",
54777
+ "waste"
54778
+ ]);
54779
+ /**
54780
+ * What an item LOOKS like, which decides how a client draws it — independent
54781
+ * of `kind`, which decides which direction is bad:
54782
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
54783
+ * remaining time and a reset.
54784
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
54785
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
54786
+ * a stepped level and "refill".
54787
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
54788
+ * that warns when full.
54789
+ * Absent = derived from the kind ({@link consumableFormOf}).
54790
+ */
54791
+ var ConsumableFormSchema = _enum([
54792
+ "part",
54793
+ "tank",
54794
+ "product",
54795
+ "bin"
54796
+ ]);
54797
+ /** The provider's own discrete verdict on an item. */
54798
+ var ConsumableStatusSchema = _enum([
54799
+ "ok",
54800
+ "low",
54801
+ "empty",
54802
+ "full",
54803
+ "replace"
54804
+ ]);
54805
+ _enum([
54806
+ "ok",
54807
+ "low",
54808
+ "empty",
54809
+ "full"
54810
+ ]);
54683
54811
  /** Units a remaining-life counter is reported in. Closed: the panel renders
54684
54812
  * each. */
54685
54813
  var ConsumableRemainingUnitSchema = _enum([
@@ -54699,10 +54827,14 @@ var ConsumablesStatusSchema = object({
54699
54827
  key: string().min(1),
54700
54828
  /** Display name. */
54701
54829
  label: string().min(1),
54702
- /** Remaining life % when known (0..100). */
54830
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
54703
54831
  level: number().min(0).max(100).nullable(),
54704
- /** Discrete state when known (binary mode). */
54705
- status: _enum(["ok", "replace"]).nullable(),
54832
+ /** The provider's discrete verdict when known (binary mode). */
54833
+ status: ConsumableStatusSchema.nullable(),
54834
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
54835
+ kind: ConsumableKindSchema.optional(),
54836
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
54837
+ form: ConsumableFormSchema.optional(),
54706
54838
  /** Ms epoch of the last replace, when known. */
54707
54839
  lastResetAt: number().nullable(),
54708
54840
  /** Whether `reset()` is meaningful for this item. */
@@ -54937,8 +55069,9 @@ object({
54937
55069
  status: DeviceStatusSchema
54938
55070
  });
54939
55071
  /**
54940
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
54941
- * consumable levels (salt, rinse aid) and common program options.
55072
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
55073
+ * common program options. Salt and rinse aid are NOT here: they are items of
55074
+ * the device's `consumables` cap, like every other device's (D915).
54942
55075
  *
54943
55076
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
54944
55077
  * by any integration that exposes the same program / option surface.
@@ -54986,11 +55119,6 @@ var DishwasherAvailabilitySchema = _enum([
54986
55119
  "offline",
54987
55120
  "description-missing"
54988
55121
  ]);
54989
- var DishwasherConsumableLevelSchema = _enum([
54990
- "ok",
54991
- "low",
54992
- "empty"
54993
- ]);
54994
55122
  object({
54995
55123
  availability: DishwasherAvailabilitySchema,
54996
55124
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -55023,8 +55151,6 @@ object({
55023
55151
  powerOn: boolean().nullable(),
55024
55152
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
55025
55153
  powerState: string().nullable(),
55026
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
55027
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55028
55154
  /**
55029
55155
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
55030
55156
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -57064,7 +57190,7 @@ DeviceType.Light, DeviceType.Siren, DeviceType.Switch, method(object({
57064
57190
  enabled: boolean()
57065
57191
  }), _void(), {
57066
57192
  kind: "mutation",
57067
- auth: "admin"
57193
+ auth: "protected"
57068
57194
  }), object({
57069
57195
  deviceId: number(),
57070
57196
  enabled: boolean(),
@@ -57554,6 +57680,13 @@ var TopologyNodeSchema = object({
57554
57680
  cpuModel: string().nullable(),
57555
57681
  cpuCores: number(),
57556
57682
  memoryMB: number(),
57683
+ /**
57684
+ * The inference RUNTIMES installed on the node (`pythonRuntimes`: onnx,
57685
+ * openvino, edgetpu …) — not its devices. An installed runtime says nothing
57686
+ * about whether its hardware is there (a Coral delegate stays installed
57687
+ * after the stick leaves, D919); the live device set is
57688
+ * `pipelineOrchestrator.getNodeInferenceDevices`.
57689
+ */
57557
57690
  engines: array(string()).readonly(),
57558
57691
  isHub: boolean(),
57559
57692
  isOnline: boolean(),
@@ -58518,7 +58651,28 @@ var ResolvedInferenceConfigSchema = object({
58518
58651
  format: ModelFormatSchema,
58519
58652
  reason: string()
58520
58653
  });
58521
- method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema);
58654
+ /**
58655
+ * The answer of an accelerator rescan (D919): the node's device list after
58656
+ * the re-probe, what changed, and the evidence that decided the Coral answer
58657
+ * (`usbBus` — could the USB bus be read at all; `decidedBy` — USB ids, the PCI
58658
+ * bus, the installed-delegate fallback, or nothing).
58659
+ */
58660
+ var AcceleratorRescanSchema = object({
58661
+ devices: array(InferenceDeviceDescriptorSchema).readonly(),
58662
+ appeared: array(string()).readonly(),
58663
+ disappeared: array(string()).readonly(),
58664
+ usbBus: _enum(["observed", "unobservable"]),
58665
+ decidedBy: _enum([
58666
+ "usb-ids",
58667
+ "pci",
58668
+ "delegate-fallback",
58669
+ "none"
58670
+ ])
58671
+ });
58672
+ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema), method(_void(), AcceleratorRescanSchema, {
58673
+ kind: "mutation",
58674
+ auth: "admin"
58675
+ });
58522
58676
  object({
58523
58677
  /** Instantaneous power draw in watts. */
58524
58678
  watts: number().optional(),
@@ -61807,60 +61961,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
61807
61961
  auth: "admin",
61808
61962
  access: "delete"
61809
61963
  });
61810
- /**
61811
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
61812
- * cleaning lifecycle plus a return-to-base / locate surface and an
61813
- * optional fan-speed selector.
61814
- *
61815
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
61816
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
61817
- * (0..100) is nullable — some vacuums don't report a battery
61818
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
61819
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
61820
- * tokens the hardware accepts so the UI renders only supported choices.
61821
- *
61822
- * The `setFanSpeed` method takes the bare `speed` token — the provider
61823
- * validates it against the vacuum's own list. `locate` triggers the
61824
- * find-me chirp; `returnToBase` sends it home.
61825
- *
61826
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
61827
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
61828
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
61829
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
61830
- * only when the device has no such tank at all, and use a `TankStatus`
61831
- * with both inner fields `null` when the tank exists but its level is
61832
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
61833
- * so the HA provider leaves all four `null`.
61834
- */
61835
- var VacuumStateSchema = _enum([
61836
- "idle",
61837
- "cleaning",
61838
- "paused",
61839
- "returning",
61840
- "docked",
61841
- "drying",
61842
- "error"
61843
- ]);
61844
- /**
61845
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
61846
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
61847
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
61848
- * level is currently unknown; the OWNING field being `null` means the
61849
- * hardware has no such tank at all.
61850
- */
61851
- var TankStatusSchema = object({
61852
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
61853
- level: number().min(0).max(100).nullable(),
61854
- /** Discrete state when the hardware is binary-mode; null otherwise. */
61855
- status: _enum([
61856
- "ok",
61857
- "low",
61858
- "full"
61859
- ]).nullable()
61860
- });
61861
61964
  object({
61862
61965
  /** Lifecycle state of the vacuum. */
61863
- state: VacuumStateSchema,
61966
+ state: _enum([
61967
+ "idle",
61968
+ "cleaning",
61969
+ "paused",
61970
+ "returning",
61971
+ "docked",
61972
+ "drying",
61973
+ "error"
61974
+ ]),
61864
61975
  /** 0..100 battery percentage. Null when the device has no battery
61865
61976
  * reading. */
61866
61977
  batteryLevel: number().min(0).max(100).nullable(),
@@ -61869,14 +61980,6 @@ object({
61869
61980
  fanSpeed: string().nullable(),
61870
61981
  /** Speed tokens the hardware accepts — drives the UI selector. */
61871
61982
  availableFanSpeeds: array(string()),
61872
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
61873
- cleanWater: TankStatusSchema.nullable(),
61874
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
61875
- dirtyWater: TankStatusSchema.nullable(),
61876
- /** Detergent tank. Null when the hardware has no detergent tank. */
61877
- detergent: TankStatusSchema.nullable(),
61878
- /** Dust bin. Null when the hardware has no dust bin. */
61879
- dustBin: TankStatusSchema.nullable(),
61880
61983
  /** 0..100 cleaning-completion percentage of the current task, or null. */
61881
61984
  progressPercent: number().min(0).max(100).nullable(),
61882
61985
  /** Current error code (0 / null = no error). */
@@ -64417,6 +64520,12 @@ Object.freeze({
64417
64520
  addonId: null,
64418
64521
  access: "create"
64419
64522
  },
64523
+ "deviceHistory.deleteOrphanSeries": {
64524
+ capName: "device-history",
64525
+ capScope: "system",
64526
+ addonId: null,
64527
+ access: "delete"
64528
+ },
64420
64529
  "deviceHistory.getDeviceEnabled": {
64421
64530
  capName: "device-history",
64422
64531
  capScope: "system",
@@ -64435,6 +64544,12 @@ Object.freeze({
64435
64544
  addonId: null,
64436
64545
  access: "view"
64437
64546
  },
64547
+ "deviceHistory.listOrphanSeries": {
64548
+ capName: "device-history",
64549
+ capScope: "system",
64550
+ addonId: null,
64551
+ access: "view"
64552
+ },
64438
64553
  "deviceHistory.listSeries": {
64439
64554
  capName: "device-history",
64440
64555
  capScope: "system",
@@ -68059,6 +68174,12 @@ Object.freeze({
68059
68174
  addonId: null,
68060
68175
  access: "delete"
68061
68176
  },
68177
+ "pipelineOrchestrator.forgetInferenceDevice": {
68178
+ capName: "pipeline-orchestrator",
68179
+ capScope: "system",
68180
+ addonId: null,
68181
+ access: "delete"
68182
+ },
68062
68183
  "pipelineOrchestrator.getAgentLoad": {
68063
68184
  capName: "pipeline-orchestrator",
68064
68185
  capScope: "system",
@@ -68635,6 +68756,12 @@ Object.freeze({
68635
68756
  addonId: null,
68636
68757
  access: "view"
68637
68758
  },
68759
+ "platformProbe.rescanAccelerators": {
68760
+ capName: "platform-probe",
68761
+ capScope: "system",
68762
+ addonId: null,
68763
+ access: "create"
68764
+ },
68638
68765
  "platformProbe.resolveHwAccel": {
68639
68766
  capName: "platform-probe",
68640
68767
  capScope: "system",
@@ -74440,7 +74567,7 @@ var STATE_SUMMARY_VARS = [
74440
74567
  ([...RULE_TEXT], [...COMBINED_ALARM]),
74441
74568
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
74442
74569
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
74443
- ([...RULE_TEXT], [...CONSUMABLE]),
74570
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
74444
74571
  ([...RULE_TEXT], [...TANK]),
74445
74572
  [...RULE_TEXT],
74446
74573
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
@@ -5564,7 +5564,7 @@ var ZodIssueCode = {
5564
5564
  var ZodFirstPartyTypeKind;
5565
5565
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5566
5566
  //#endregion
5567
- //#region ../types/dist/sleep-DJFUfKvA.mjs
5567
+ //#region ../types/dist/sleep-CUp20JkO.mjs
5568
5568
  /**
5569
5569
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5570
5570
  * window to float samples (D455).
@@ -8644,7 +8644,11 @@ var ContributionSectionSchema = object({
8644
8644
  literal(4)
8645
8645
  ]).optional(),
8646
8646
  tab: string().optional(),
8647
- location: _enum(["settings", "top-tab"]).optional(),
8647
+ location: _enum([
8648
+ "settings",
8649
+ "top-tab",
8650
+ "hero"
8651
+ ]).optional(),
8648
8652
  order: number().optional(),
8649
8653
  fields: array(any())
8650
8654
  });
@@ -13713,7 +13717,11 @@ var ConfigSectionWithValuesSchema = object({
13713
13717
  literal(4)
13714
13718
  ]).optional(),
13715
13719
  tab: string().optional(),
13716
- location: _enum(["settings", "top-tab"]).optional(),
13720
+ location: _enum([
13721
+ "settings",
13722
+ "top-tab",
13723
+ "hero"
13724
+ ]).optional(),
13717
13725
  order: number().optional(),
13718
13726
  fields: array(any())
13719
13727
  });
@@ -17536,6 +17544,52 @@ var TierStatusSchema = object({
17536
17544
  countedAt: number().nullable()
17537
17545
  });
17538
17546
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
17547
+ /**
17548
+ * Why a series is orphan. `device-gone`: its device is absent from the
17549
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
17550
+ * key is declared by no capability any more (a field a cap removed).
17551
+ */
17552
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
17553
+ /** Rows held per stored tier. */
17554
+ var TierRowsSchema = object({
17555
+ raw: number().int(),
17556
+ "5m": number().int(),
17557
+ "1h": number().int(),
17558
+ "1d": number().int()
17559
+ });
17560
+ var OrphanSeriesSchema = object({
17561
+ seriesId: number().int(),
17562
+ deviceId: number().int(),
17563
+ key: string(),
17564
+ scope: string(),
17565
+ /** The metric's display name; `null` when its metric row is gone too. */
17566
+ displayName: string().nullable(),
17567
+ reason: DeviceHistoryOrphanReasonSchema,
17568
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
17569
+ missingSince: number().nullable(),
17570
+ firstTs: number(),
17571
+ lastTs: number(),
17572
+ rows: TierRowsSchema
17573
+ });
17574
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
17575
+ "not-found",
17576
+ "not-orphan",
17577
+ "failed"
17578
+ ]);
17579
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
17580
+ seriesId: number().int(),
17581
+ ok: literal(true),
17582
+ deleted: TierRowsSchema
17583
+ }), object({
17584
+ seriesId: number().int(),
17585
+ ok: literal(false),
17586
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
17587
+ })]);
17588
+ var OrphanListSchema = object({
17589
+ series: array(OrphanSeriesSchema).readonly(),
17590
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
17591
+ truncated: boolean()
17592
+ });
17539
17593
  var DeviceHistoryStatusSchema = object({
17540
17594
  startedAt: number(),
17541
17595
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -17633,7 +17687,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
17633
17687
  }), object({ enabled: boolean() }), {
17634
17688
  kind: "mutation",
17635
17689
  auth: "admin"
17636
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
17690
+ }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" }), method(object({}), OrphanListSchema, { auth: "admin" }), method(object({ seriesIds: array(number().int()).min(1).max(50) }), object({ results: array(OrphanDeleteEntrySchema).readonly() }), {
17691
+ kind: "mutation",
17692
+ auth: "admin"
17693
+ });
17637
17694
  var DeviceCaStatusSchema = discriminatedUnion("state", [
17638
17695
  object({ state: literal("absent") }),
17639
17696
  object({
@@ -50307,6 +50364,19 @@ var NodeInferenceDeviceSchema = object({
50307
50364
  /** Whether the node's live probe reports the device as usable right now. */
50308
50365
  available: boolean(),
50309
50366
  /**
50367
+ * Is the device on the node at all (D919)? `present` — the live probe
50368
+ * reported it; `absent` — the probe ANSWERED and did not report it, so only
50369
+ * its stored settings remain (unplugged, moved to another node): never
50370
+ * eligible, whatever its stored `enabled`, and forgettable with
50371
+ * `forgetInferenceDevice`; `unknown` — the probe did not answer, nothing is
50372
+ * claimed (D315). Optional only for an orchestrator older than the field.
50373
+ */
50374
+ presence: _enum([
50375
+ "present",
50376
+ "absent",
50377
+ "unknown"
50378
+ ]).optional(),
50379
+ /**
50310
50380
  * Whether this device participates in dispatch. AUTO default (spec C2):
50311
50381
  * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
50312
50382
  * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
@@ -50532,7 +50602,13 @@ method(object({
50532
50602
  }), object({ success: literal(true) }), {
50533
50603
  kind: "mutation",
50534
50604
  auth: "admin"
50535
- }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
50605
+ }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({
50606
+ agentNodeId: string(),
50607
+ deviceKey: string()
50608
+ }), object({ success: literal(true) }), {
50609
+ kind: "mutation",
50610
+ auth: "admin"
50611
+ }), method(object({ agentNodeId: string() }), object({
50536
50612
  success: literal(true),
50537
50613
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
50538
50614
  effectiveModelId: string().nullable(),
@@ -54665,17 +54741,69 @@ object({
54665
54741
  });
54666
54742
  DeviceType.Sensor;
54667
54743
  /**
54668
- * Generic device-consumables capability — surfaces a device's
54669
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
54670
- * descaling cycles, …) with their remaining life and an optional
54671
- * "Replaced" reset action. Device-agnostic: any provider that knows its
54672
- * device tracks consumables can register it; the cap declares no
54673
- * vocabulary of its own — the provider names each item verbatim.
54744
+ * Generic device-consumables capability — the ONE place a device reports what
54745
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
54746
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
54747
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
54748
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
54749
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
54750
+ * its device tracks consumables registers it; the provider names each item
54751
+ * verbatim and says which `kind` it is.
54752
+ *
54753
+ * The admin UI renders it as ONE collapsible section directly under the
54754
+ * device page's hero card (`placement: 'hero'`), for every device bound to
54755
+ * this cap — never drawn by a device type's hero card itself (D915).
54674
54756
  *
54675
54757
  * Like `childLayout`, the cap is INERT until a provider sets items: no
54676
54758
  * provider populates it by guessing (no HA inference). The UI renders a
54677
54759
  * "No consumables reported" placeholder when `items` is empty.
54678
54760
  */
54761
+ /**
54762
+ * What an item IS, which decides which direction is bad:
54763
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
54764
+ * - `supply` — something the device draws from (clean water, detergent,
54765
+ * salt, rinse aid); low or empty is bad.
54766
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
54767
+ * bad.
54768
+ * Absent = `wear`.
54769
+ */
54770
+ var ConsumableKindSchema = _enum([
54771
+ "wear",
54772
+ "supply",
54773
+ "waste"
54774
+ ]);
54775
+ /**
54776
+ * What an item LOOKS like, which decides how a client draws it — independent
54777
+ * of `kind`, which decides which direction is bad:
54778
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
54779
+ * remaining time and a reset.
54780
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
54781
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
54782
+ * a stepped level and "refill".
54783
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
54784
+ * that warns when full.
54785
+ * Absent = derived from the kind ({@link consumableFormOf}).
54786
+ */
54787
+ var ConsumableFormSchema = _enum([
54788
+ "part",
54789
+ "tank",
54790
+ "product",
54791
+ "bin"
54792
+ ]);
54793
+ /** The provider's own discrete verdict on an item. */
54794
+ var ConsumableStatusSchema = _enum([
54795
+ "ok",
54796
+ "low",
54797
+ "empty",
54798
+ "full",
54799
+ "replace"
54800
+ ]);
54801
+ _enum([
54802
+ "ok",
54803
+ "low",
54804
+ "empty",
54805
+ "full"
54806
+ ]);
54679
54807
  /** Units a remaining-life counter is reported in. Closed: the panel renders
54680
54808
  * each. */
54681
54809
  var ConsumableRemainingUnitSchema = _enum([
@@ -54695,10 +54823,14 @@ var ConsumablesStatusSchema = object({
54695
54823
  key: string().min(1),
54696
54824
  /** Display name. */
54697
54825
  label: string().min(1),
54698
- /** Remaining life % when known (0..100). */
54826
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
54699
54827
  level: number().min(0).max(100).nullable(),
54700
- /** Discrete state when known (binary mode). */
54701
- status: _enum(["ok", "replace"]).nullable(),
54828
+ /** The provider's discrete verdict when known (binary mode). */
54829
+ status: ConsumableStatusSchema.nullable(),
54830
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
54831
+ kind: ConsumableKindSchema.optional(),
54832
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
54833
+ form: ConsumableFormSchema.optional(),
54702
54834
  /** Ms epoch of the last replace, when known. */
54703
54835
  lastResetAt: number().nullable(),
54704
54836
  /** Whether `reset()` is meaningful for this item. */
@@ -54933,8 +55065,9 @@ object({
54933
55065
  status: DeviceStatusSchema
54934
55066
  });
54935
55067
  /**
54936
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
54937
- * consumable levels (salt, rinse aid) and common program options.
55068
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
55069
+ * common program options. Salt and rinse aid are NOT here: they are items of
55070
+ * the device's `consumables` cap, like every other device's (D915).
54938
55071
  *
54939
55072
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
54940
55073
  * by any integration that exposes the same program / option surface.
@@ -54982,11 +55115,6 @@ var DishwasherAvailabilitySchema = _enum([
54982
55115
  "offline",
54983
55116
  "description-missing"
54984
55117
  ]);
54985
- var DishwasherConsumableLevelSchema = _enum([
54986
- "ok",
54987
- "low",
54988
- "empty"
54989
- ]);
54990
55118
  object({
54991
55119
  availability: DishwasherAvailabilitySchema,
54992
55120
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -55019,8 +55147,6 @@ object({
55019
55147
  powerOn: boolean().nullable(),
55020
55148
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
55021
55149
  powerState: string().nullable(),
55022
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
55023
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55024
55150
  /**
55025
55151
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
55026
55152
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -57060,7 +57186,7 @@ DeviceType.Light, DeviceType.Siren, DeviceType.Switch, method(object({
57060
57186
  enabled: boolean()
57061
57187
  }), _void(), {
57062
57188
  kind: "mutation",
57063
- auth: "admin"
57189
+ auth: "protected"
57064
57190
  }), object({
57065
57191
  deviceId: number(),
57066
57192
  enabled: boolean(),
@@ -57550,6 +57676,13 @@ var TopologyNodeSchema = object({
57550
57676
  cpuModel: string().nullable(),
57551
57677
  cpuCores: number(),
57552
57678
  memoryMB: number(),
57679
+ /**
57680
+ * The inference RUNTIMES installed on the node (`pythonRuntimes`: onnx,
57681
+ * openvino, edgetpu …) — not its devices. An installed runtime says nothing
57682
+ * about whether its hardware is there (a Coral delegate stays installed
57683
+ * after the stick leaves, D919); the live device set is
57684
+ * `pipelineOrchestrator.getNodeInferenceDevices`.
57685
+ */
57553
57686
  engines: array(string()).readonly(),
57554
57687
  isHub: boolean(),
57555
57688
  isOnline: boolean(),
@@ -58514,7 +58647,28 @@ var ResolvedInferenceConfigSchema = object({
58514
58647
  format: ModelFormatSchema,
58515
58648
  reason: string()
58516
58649
  });
58517
- method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema);
58650
+ /**
58651
+ * The answer of an accelerator rescan (D919): the node's device list after
58652
+ * the re-probe, what changed, and the evidence that decided the Coral answer
58653
+ * (`usbBus` — could the USB bus be read at all; `decidedBy` — USB ids, the PCI
58654
+ * bus, the installed-delegate fallback, or nothing).
58655
+ */
58656
+ var AcceleratorRescanSchema = object({
58657
+ devices: array(InferenceDeviceDescriptorSchema).readonly(),
58658
+ appeared: array(string()).readonly(),
58659
+ disappeared: array(string()).readonly(),
58660
+ usbBus: _enum(["observed", "unobservable"]),
58661
+ decidedBy: _enum([
58662
+ "usb-ids",
58663
+ "pci",
58664
+ "delegate-fallback",
58665
+ "none"
58666
+ ])
58667
+ });
58668
+ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema), method(_void(), AcceleratorRescanSchema, {
58669
+ kind: "mutation",
58670
+ auth: "admin"
58671
+ });
58518
58672
  object({
58519
58673
  /** Instantaneous power draw in watts. */
58520
58674
  watts: number().optional(),
@@ -61803,60 +61957,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
61803
61957
  auth: "admin",
61804
61958
  access: "delete"
61805
61959
  });
61806
- /**
61807
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
61808
- * cleaning lifecycle plus a return-to-base / locate surface and an
61809
- * optional fan-speed selector.
61810
- *
61811
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
61812
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
61813
- * (0..100) is nullable — some vacuums don't report a battery
61814
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
61815
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
61816
- * tokens the hardware accepts so the UI renders only supported choices.
61817
- *
61818
- * The `setFanSpeed` method takes the bare `speed` token — the provider
61819
- * validates it against the vacuum's own list. `locate` triggers the
61820
- * find-me chirp; `returnToBase` sends it home.
61821
- *
61822
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
61823
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
61824
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
61825
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
61826
- * only when the device has no such tank at all, and use a `TankStatus`
61827
- * with both inner fields `null` when the tank exists but its level is
61828
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
61829
- * so the HA provider leaves all four `null`.
61830
- */
61831
- var VacuumStateSchema = _enum([
61832
- "idle",
61833
- "cleaning",
61834
- "paused",
61835
- "returning",
61836
- "docked",
61837
- "drying",
61838
- "error"
61839
- ]);
61840
- /**
61841
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
61842
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
61843
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
61844
- * level is currently unknown; the OWNING field being `null` means the
61845
- * hardware has no such tank at all.
61846
- */
61847
- var TankStatusSchema = object({
61848
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
61849
- level: number().min(0).max(100).nullable(),
61850
- /** Discrete state when the hardware is binary-mode; null otherwise. */
61851
- status: _enum([
61852
- "ok",
61853
- "low",
61854
- "full"
61855
- ]).nullable()
61856
- });
61857
61960
  object({
61858
61961
  /** Lifecycle state of the vacuum. */
61859
- state: VacuumStateSchema,
61962
+ state: _enum([
61963
+ "idle",
61964
+ "cleaning",
61965
+ "paused",
61966
+ "returning",
61967
+ "docked",
61968
+ "drying",
61969
+ "error"
61970
+ ]),
61860
61971
  /** 0..100 battery percentage. Null when the device has no battery
61861
61972
  * reading. */
61862
61973
  batteryLevel: number().min(0).max(100).nullable(),
@@ -61865,14 +61976,6 @@ object({
61865
61976
  fanSpeed: string().nullable(),
61866
61977
  /** Speed tokens the hardware accepts — drives the UI selector. */
61867
61978
  availableFanSpeeds: array(string()),
61868
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
61869
- cleanWater: TankStatusSchema.nullable(),
61870
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
61871
- dirtyWater: TankStatusSchema.nullable(),
61872
- /** Detergent tank. Null when the hardware has no detergent tank. */
61873
- detergent: TankStatusSchema.nullable(),
61874
- /** Dust bin. Null when the hardware has no dust bin. */
61875
- dustBin: TankStatusSchema.nullable(),
61876
61979
  /** 0..100 cleaning-completion percentage of the current task, or null. */
61877
61980
  progressPercent: number().min(0).max(100).nullable(),
61878
61981
  /** Current error code (0 / null = no error). */
@@ -64413,6 +64516,12 @@ Object.freeze({
64413
64516
  addonId: null,
64414
64517
  access: "create"
64415
64518
  },
64519
+ "deviceHistory.deleteOrphanSeries": {
64520
+ capName: "device-history",
64521
+ capScope: "system",
64522
+ addonId: null,
64523
+ access: "delete"
64524
+ },
64416
64525
  "deviceHistory.getDeviceEnabled": {
64417
64526
  capName: "device-history",
64418
64527
  capScope: "system",
@@ -64431,6 +64540,12 @@ Object.freeze({
64431
64540
  addonId: null,
64432
64541
  access: "view"
64433
64542
  },
64543
+ "deviceHistory.listOrphanSeries": {
64544
+ capName: "device-history",
64545
+ capScope: "system",
64546
+ addonId: null,
64547
+ access: "view"
64548
+ },
64434
64549
  "deviceHistory.listSeries": {
64435
64550
  capName: "device-history",
64436
64551
  capScope: "system",
@@ -68055,6 +68170,12 @@ Object.freeze({
68055
68170
  addonId: null,
68056
68171
  access: "delete"
68057
68172
  },
68173
+ "pipelineOrchestrator.forgetInferenceDevice": {
68174
+ capName: "pipeline-orchestrator",
68175
+ capScope: "system",
68176
+ addonId: null,
68177
+ access: "delete"
68178
+ },
68058
68179
  "pipelineOrchestrator.getAgentLoad": {
68059
68180
  capName: "pipeline-orchestrator",
68060
68181
  capScope: "system",
@@ -68631,6 +68752,12 @@ Object.freeze({
68631
68752
  addonId: null,
68632
68753
  access: "view"
68633
68754
  },
68755
+ "platformProbe.rescanAccelerators": {
68756
+ capName: "platform-probe",
68757
+ capScope: "system",
68758
+ addonId: null,
68759
+ access: "create"
68760
+ },
68634
68761
  "platformProbe.resolveHwAccel": {
68635
68762
  capName: "platform-probe",
68636
68763
  capScope: "system",
@@ -74436,7 +74563,7 @@ var STATE_SUMMARY_VARS = [
74436
74563
  ([...RULE_TEXT], [...COMBINED_ALARM]),
74437
74564
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
74438
74565
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
74439
- ([...RULE_TEXT], [...CONSUMABLE]),
74566
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
74440
74567
  ([...RULE_TEXT], [...TANK]),
74441
74568
  [...RULE_TEXT],
74442
74569
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-google-services",
3
- "version": "0.2.26",
3
+ "version": "0.2.28",
4
4
  "description": "Google Services — Google brokers (OAuth2): Calendar as calendar-source, Gmail send as smtp-provider.",
5
5
  "keywords": [
6
6
  "camstack",