@camstack/ui-library 1.2.298 → 1.2.300

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 (25) hide show
  1. package/dist/{MotionZonesSettings-Bv8XzCa3.js → MotionZonesSettings-C3Tj12yc.js} +1 -1
  2. package/dist/{PrivacyMaskSettings-BlkbESYj.js → PrivacyMaskSettings-C9wfHkiB.js} +1 -1
  3. package/dist/{SceneMonitorEditor-i3-nXAEU.js → SceneMonitorEditor-30H29vN4.js} +1 -1
  4. package/dist/composites/addon-global-settings-form.d.ts +1 -1
  5. package/dist/composites/config-form-field.d.ts +3 -1
  6. package/dist/composites/device-controls/ac-panel.d.ts +14 -1
  7. package/dist/composites/device-controls/climate-panel.d.ts +4 -1
  8. package/dist/composites/device-controls/dishwasher-control.d.ts +17 -0
  9. package/dist/composites/device-controls/heating-valve-readout.d.ts +4 -0
  10. package/dist/composites/device-controls/types.d.ts +1 -1
  11. package/dist/composites/index.d.ts +2 -0
  12. package/dist/composites/record-entries/entry-json-schema-form.d.ts +11 -0
  13. package/dist/composites/record-entries/index.d.ts +4 -0
  14. package/dist/composites/record-entries/record-entries-hub.d.ts +9 -0
  15. package/dist/composites/record-entries/record-entries-panel.d.ts +6 -0
  16. package/dist/composites/record-entries/record-entry-secrets.d.ts +9 -0
  17. package/dist/composites/storage-records/index.d.ts +2 -0
  18. package/dist/composites/storage-records/storage-records-hub.d.ts +4 -0
  19. package/dist/composites/storage-records/storage-records-panel.d.ts +6 -0
  20. package/dist/generated/system-hooks.d.ts +20 -0
  21. package/dist/{icons-CLC60C-_.cjs → icons-B1AFXUaZ.cjs} +2 -78
  22. package/dist/{icons-BXXScOuy.js → icons-BT8c2hxp.js} +1 -77
  23. package/dist/index.cjs +1656 -186
  24. package/dist/index.js +1638 -193
  25. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ import * as __mfHostReact from "react";
5
5
  import React, { Fragment, Suspense, cloneElement, createContext, createElement, forwardRef, lazy, useCallback, useContext, useEffect, useId, useImperativeHandle, useLayoutEffect, useMemo, useReducer, useRef, useState, useSyncExternalStore } from "react";
6
6
  import * as __mfHostReactJsxRuntime from "react/jsx-runtime";
7
7
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
8
- import { ALL_CAPABILITY_DEFINITIONS, CAM_PROFILE_ORDER, CLIP_STILL_DISPOSITION_HEADER, CLIP_STILL_REASON_CODE_HEADER, CLIP_STILL_REASON_HEADER, CONTAINER_CHILD_PRIORITY, DEFAULT_EVENTS_BAND_BUFFER_SEC, DEFAULT_EVENT_COLOR, DEVICE_TYPE_CONTROL_KIND, DeviceExportStatusSchema, DeviceFeature, DeviceRole, DeviceType, EVENT_TAXONOMY, EXTENSION_SLOTS, EXTENSION_SLOT_IDS, EventCategory, ExposedDeviceSchema, FIRST_LEVEL_MACRO_CLASSES, ICON_CATEGORIES, KNOWN_CAP_NAMES, MAX_SENSOR_TRIGGER_DEVICES, MODEL_PROVIDER_IDS, NAVIGATION_LIGHT_LEVEL_MAX, NAVIGATION_LIGHT_LEVEL_MIN, NODE_COLOR_IDS, NodeColorIdSchema, PET_FEEDER_MANUAL_FEED_MAX, PET_FEEDER_MANUAL_FEED_MIN, RECORDING_AUDIO_TRIGGER_OFFERED_DBFS, RECORDING_SOURCE_CAMSTACK_ADDON, RecordingConfigSchema, RecordingStatusSchema, SECRET_CLEAR, SOURCE_CAP_ACTIVE_FIELD, STATIONARY_OVERLAY_STYLE, TIMEZONES, USE_ROOT_MODEL_SETTING_KEY, assignNodeColorId, assignNodeColorId as assignNodeColorId$1, buildModelVariantGroups, canConvertUnit, canonicalIconKey, clearModelBoundOverrides, clearModelBoundSetting, clusterStepSettingFieldsFor, collectModelBoundKeys, createDeviceProxy, createLazyTrpcSource, createSliceHandle, deriveRecordingMode, describeModelVariant, effectiveStepSettings, findTimezone, formatParkedFor, hasModelBoundOverrides, iconCategoryLabel, iconsInCategory, isKeychainStoredField, isRootSuppliableStepId, isSecretClear, isSecretFieldView, modelBindingKey, normalizeUnit, publicEventCategories, resolveContainerPrimaryChild, resolveDeviceControlKind, resolveIconKey, resolveModelBoundSetting, resolveRecordingProfiles, resolveRootSupply, resolveVariantModelId, resolveViewableDeviceIds, searchIcons, selectAssignedProfileSlots, stepSettingSource, tryConvertUnit, unitsForDimension, withFieldFrom, withoutField, writeModelBoundSetting } from "@camstack/types";
8
+ import { ALL_CAPABILITY_DEFINITIONS, CAM_PROFILE_ORDER, CLIP_STILL_DISPOSITION_HEADER, CLIP_STILL_REASON_CODE_HEADER, CLIP_STILL_REASON_HEADER, CONTAINER_CHILD_PRIORITY, DEFAULT_EVENTS_BAND_BUFFER_SEC, DEFAULT_EVENT_COLOR, DEVICE_TYPE_CONTROL_KIND, DeviceExportStatusSchema, DeviceFeature, DeviceRole, DeviceType, EVENT_TAXONOMY, EXTENSION_SLOTS, EXTENSION_SLOT_IDS, EventCategory, ExposedDeviceSchema, FIRST_LEVEL_MACRO_CLASSES, ICON_CATEGORIES, KNOWN_CAP_NAMES, MAX_SENSOR_TRIGGER_DEVICES, MODEL_PROVIDER_IDS, NAVIGATION_LIGHT_LEVEL_MAX, NAVIGATION_LIGHT_LEVEL_MIN, NODE_COLOR_IDS, NodeColorIdSchema, PET_FEEDER_MANUAL_FEED_MAX, PET_FEEDER_MANUAL_FEED_MIN, RECORDING_AUDIO_TRIGGER_OFFERED_DBFS, RECORDING_SOURCE_CAMSTACK_ADDON, REDACTED_SECRET, RecordingConfigSchema, RecordingStatusSchema, SECRET_CLEAR, SOURCE_CAP_ACTIVE_FIELD, STATIONARY_OVERLAY_STYLE, TIMEZONES, USE_ROOT_MODEL_SETTING_KEY, assignNodeColorId, assignNodeColorId as assignNodeColorId$1, buildModelVariantGroups, canConvertUnit, canonicalIconKey, clearModelBoundOverrides, clearModelBoundSetting, clusterStepSettingFieldsFor, collectModelBoundKeys, createDeviceProxy, createLazyTrpcSource, createSliceHandle, dehydrateSchema, deriveRecordingMode, describeModelVariant, effectiveStepSettings, findTimezone, formatParkedFor, hasModelBoundOverrides, iconCategoryLabel, iconsInCategory, isKeychainStoredField, isRootSuppliableStepId, isSecretClear, isSecretFieldView, modelBindingKey, normalizeUnit, publicEventCategories, resolveContainerPrimaryChild, resolveDeviceControlKind, resolveIconKey, resolveModelBoundSetting, resolveRecordingProfiles, resolveRootSupply, resolveVariantModelId, resolveViewableDeviceIds, searchIcons, selectAssignedProfileSlots, stepSettingSource, tryConvertUnit, unitsForDimension, withFieldFrom, withoutField, writeModelBoundSetting } from "@camstack/types";
9
9
  import * as __mfHostTrpcReactQuery from "@trpc/react-query";
10
10
  import { createTRPCReact } from "@trpc/react-query";
11
11
  import * as __mfHostReactDOM from "react-dom";
@@ -2161,6 +2161,54 @@ var Hash = createLucideIcon("hash", [
2161
2161
  * This source code is licensed under the ISC license.
2162
2162
  * See the LICENSE file in the root directory of this source tree.
2163
2163
  */
2164
+ var Heater = createLucideIcon("heater", [
2165
+ ["path", {
2166
+ d: "M11 8c2-3-2-3 0-6",
2167
+ key: "1ldv5m"
2168
+ }],
2169
+ ["path", {
2170
+ d: "M15.5 8c2-3-2-3 0-6",
2171
+ key: "1otqoz"
2172
+ }],
2173
+ ["path", {
2174
+ d: "M6 10h.01",
2175
+ key: "1lbq93"
2176
+ }],
2177
+ ["path", {
2178
+ d: "M6 14h.01",
2179
+ key: "zudwn7"
2180
+ }],
2181
+ ["path", {
2182
+ d: "M10 16v-4",
2183
+ key: "1c25yv"
2184
+ }],
2185
+ ["path", {
2186
+ d: "M14 16v-4",
2187
+ key: "1dkbt8"
2188
+ }],
2189
+ ["path", {
2190
+ d: "M18 16v-4",
2191
+ key: "1yg9me"
2192
+ }],
2193
+ ["path", {
2194
+ d: "M20 6a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h3",
2195
+ key: "1ubg90"
2196
+ }],
2197
+ ["path", {
2198
+ d: "M5 20v2",
2199
+ key: "1abpe8"
2200
+ }],
2201
+ ["path", {
2202
+ d: "M19 20v2",
2203
+ key: "kqn6ft"
2204
+ }]
2205
+ ]);
2206
+ /**
2207
+ * @license lucide-react v0.576.0 - ISC
2208
+ *
2209
+ * This source code is licensed under the ISC license.
2210
+ * See the LICENSE file in the root directory of this source tree.
2211
+ */
2164
2212
  var House = createLucideIcon("house", [["path", {
2165
2213
  d: "M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8",
2166
2214
  key: "5wwlr5"
@@ -4149,6 +4197,34 @@ var Thermometer = createLucideIcon("thermometer", [["path", {
4149
4197
  * This source code is licensed under the ISC license.
4150
4198
  * See the LICENSE file in the root directory of this source tree.
4151
4199
  */
4200
+ var Timer = createLucideIcon("timer", [
4201
+ ["line", {
4202
+ x1: "10",
4203
+ x2: "14",
4204
+ y1: "2",
4205
+ y2: "2",
4206
+ key: "14vaq8"
4207
+ }],
4208
+ ["line", {
4209
+ x1: "12",
4210
+ x2: "15",
4211
+ y1: "14",
4212
+ y2: "11",
4213
+ key: "17fdiu"
4214
+ }],
4215
+ ["circle", {
4216
+ cx: "12",
4217
+ cy: "14",
4218
+ r: "8",
4219
+ key: "1e1u0o"
4220
+ }]
4221
+ ]);
4222
+ /**
4223
+ * @license lucide-react v0.576.0 - ISC
4224
+ *
4225
+ * This source code is licensed under the ISC license.
4226
+ * See the LICENSE file in the root directory of this source tree.
4227
+ */
4152
4228
  var ToggleLeft = createLucideIcon("toggle-left", [["circle", {
4153
4229
  cx: "9",
4154
4230
  cy: "12",
@@ -5251,6 +5327,11 @@ var DEVICE_TYPE_META = {
5251
5327
  icon: Bone,
5252
5328
  labelKey: "uiLibrary.deviceMeta.type.petFeeder",
5253
5329
  labelFallback: "Pet feeder"
5330
+ },
5331
+ [DeviceType.Dishwasher]: {
5332
+ icon: Waves,
5333
+ labelKey: "uiLibrary.deviceMeta.type.dishwasher",
5334
+ labelFallback: "Dishwasher"
5254
5335
  }
5255
5336
  };
5256
5337
  var DEVICE_ROLE_META = {
@@ -5732,7 +5813,7 @@ function lucideExportName(key) {
5732
5813
  function loadIconGlyphs() {
5733
5814
  if (fullTable !== void 0) return Promise.resolve();
5734
5815
  if (failure !== void 0) return Promise.reject(failure);
5735
- pending ??= import("./icons-BXXScOuy.js").then((module) => {
5816
+ pending ??= import("./icons-BT8c2hxp.js").then((module) => {
5736
5817
  fullTable = module;
5737
5818
  publish();
5738
5819
  }, (error) => {
@@ -10907,6 +10988,24 @@ var useDeviceStateListClaims = trpc.deviceState.listClaims.useQuery;
10907
10988
  var useDeviceStateGetNativeCapSlice = trpc.deviceState.getNativeCapSlice.useQuery;
10908
10989
  /** Generated alias around `trpc.deviceStatus.getStatus.useQuery`. */
10909
10990
  var useDeviceStatusGetStatus = trpc.deviceStatus.getStatus.useQuery;
10991
+ /** Generated alias around `trpc.dishwasher.start.useMutation`. */
10992
+ var useDishwasherStart = trpc.dishwasher.start.useMutation;
10993
+ /** Generated alias around `trpc.dishwasher.pause.useMutation`. */
10994
+ var useDishwasherPause = trpc.dishwasher.pause.useMutation;
10995
+ /** Generated alias around `trpc.dishwasher.stop.useMutation`. */
10996
+ var useDishwasherStop = trpc.dishwasher.stop.useMutation;
10997
+ /** Generated alias around `trpc.dishwasher.setProgram.useMutation`. */
10998
+ var useDishwasherSetProgram = trpc.dishwasher.setProgram.useMutation;
10999
+ /** Generated alias around `trpc.dishwasher.setPower.useMutation`. */
11000
+ var useDishwasherSetPower = trpc.dishwasher.setPower.useMutation;
11001
+ /** Generated alias around `trpc.dishwasher.setHalfLoad.useMutation`. */
11002
+ var useDishwasherSetHalfLoad = trpc.dishwasher.setHalfLoad.useMutation;
11003
+ /** Generated alias around `trpc.dishwasher.setHygienePlus.useMutation`. */
11004
+ var useDishwasherSetHygienePlus = trpc.dishwasher.setHygienePlus.useMutation;
11005
+ /** Generated alias around `trpc.dishwasher.setOption.useMutation`. */
11006
+ var useDishwasherSetOption = trpc.dishwasher.setOption.useMutation;
11007
+ /** Generated alias around `trpc.dishwasher.getStatus.useQuery`. */
11008
+ var useDishwasherGetStatus = trpc.dishwasher.getStatus.useQuery;
10910
11009
  /** Generated alias around `trpc.doorbell.getStatus.useQuery`. */
10911
11010
  var useDoorbellGetStatus = trpc.doorbell.getStatus.useQuery;
10912
11011
  /** Generated alias around `trpc.enumSensor.getStatus.useQuery`. */
@@ -10961,6 +11060,8 @@ var useFeatureProbeGetStatus = trpc.featureProbe.getStatus.useQuery;
10961
11060
  var useFloodGetStatus = trpc.flood.getStatus.useQuery;
10962
11061
  /** Generated alias around `trpc.gas.getStatus.useQuery`. */
10963
11062
  var useGasGetStatus = trpc.gas.getStatus.useQuery;
11063
+ /** Generated alias around `trpc.heatingValve.getStatus.useQuery`. */
11064
+ var useHeatingValveGetStatus = trpc.heatingValve.getStatus.useQuery;
10964
11065
  /** Generated alias around `trpc.humidifier.setOn.useMutation`. */
10965
11066
  var useHumidifierSetOn = trpc.humidifier.setOn.useMutation;
10966
11067
  /** Generated alias around `trpc.humidifier.setTargetHumidity.useMutation`. */
@@ -14111,7 +14212,7 @@ function ConfigNotificationTargetMultiSelectFieldView({ field, value, onChange,
14111
14212
  const kindsQuery = useNotificationOutputListTargetKinds({});
14112
14213
  const targets = useMemo(() => toTargetOptions(targetsQuery.data), [targetsQuery.data]);
14113
14214
  const kindIconUrls = useMemo(() => buildKindIconMap(kindsQuery.data), [kindsQuery.data]);
14114
- const selected = Array.isArray(value) ? value.filter((v) => typeof v === "string") : typeof value === "string" && value.length > 0 ? [value] : [];
14215
+ const selected = Array.isArray(value) ? value.filter((v) => typeof v === "string") : typeof value === "string" && value.length > 0 ? value.includes(",") ? value.split(",").map((id) => id.trim()).filter((id) => id.length > 0) : [value] : [];
14115
14216
  const pending = targetsQuery.isPending || kindsQuery.isPending;
14116
14217
  const error = targetsQuery.isError ? targetsQuery.error : kindsQuery.isError ? kindsQuery.error : null;
14117
14218
  if (pending) return /* @__PURE__ */ jsx(FieldShell, {
@@ -19474,11 +19575,11 @@ function useDeviceSnapshotImage(deviceId, options = {}) {
19474
19575
  //#region src/composites/cap-settings/camera-grid-layout.ts
19475
19576
  /** Smallest rectangle the editor will produce — ffmpeg refuses a zero-area crop. */
19476
19577
  var MIN_EXTENT = .02;
19477
- function isRecord(value) {
19578
+ function isRecord$2(value) {
19478
19579
  return value !== null && typeof value === "object" && !Array.isArray(value);
19479
19580
  }
19480
19581
  function readRect(value) {
19481
- if (!isRecord(value)) return null;
19582
+ if (!isRecord$2(value)) return null;
19482
19583
  const { x, y, width, height } = value;
19483
19584
  if (typeof x !== "number" || typeof y !== "number" || typeof width !== "number" || typeof height !== "number") return null;
19484
19585
  if (x < 0 || y < 0 || width <= 0 || height <= 0) return null;
@@ -19491,7 +19592,7 @@ function readRect(value) {
19491
19592
  };
19492
19593
  }
19493
19594
  function readCell(value) {
19494
- if (!isRecord(value)) return null;
19595
+ if (!isRecord$2(value)) return null;
19495
19596
  const deviceId = value["deviceId"];
19496
19597
  if (typeof deviceId !== "number" || !Number.isInteger(deviceId)) return null;
19497
19598
  const source = readRect(value["source"]);
@@ -19504,7 +19605,7 @@ function readCell(value) {
19504
19605
  };
19505
19606
  }
19506
19607
  function readProfileOffer(value) {
19507
- if (!isRecord(value)) return null;
19608
+ if (!isRecord$2(value)) return null;
19508
19609
  const profile = value["profile"];
19509
19610
  const offered = value["offered"];
19510
19611
  const missing = value["missingSources"];
@@ -19533,7 +19634,7 @@ function readProfileOffer(value) {
19533
19634
  */
19534
19635
  function parseGridView(raw) {
19535
19636
  if (raw === null) return null;
19536
- if (!isRecord(raw)) return "unreadable";
19637
+ if (!isRecord$2(raw)) return "unreadable";
19537
19638
  const { instanceId, deviceId, name, fps, cells, profiles } = raw;
19538
19639
  if (typeof instanceId !== "string" || typeof deviceId !== "number" || typeof name !== "string" || typeof fps !== "number" || !Array.isArray(cells) || !Array.isArray(profiles)) return "unreadable";
19539
19640
  const parsed = [];
@@ -25690,7 +25791,7 @@ function mergeAvailabilitySpans(ranges) {
25690
25791
  * significant digits (binary prefixes, matching recording sizes elsewhere).
25691
25792
  * KB and up render one decimal under 100, none above; bytes never get a decimal.
25692
25793
  */
25693
- function formatBytes(bytes) {
25794
+ function formatBytes$1(bytes) {
25694
25795
  if (!Number.isFinite(bytes) || bytes < 0) return "—";
25695
25796
  if (bytes < 1024) return `${Math.round(bytes)} B`;
25696
25797
  const units = [
@@ -26223,7 +26324,7 @@ function RecordingPanel({ deviceId }) {
26223
26324
  /* @__PURE__ */ jsx(WidgetMetricCard, {
26224
26325
  label: t("uiLibrary.recordingPanel.storage", "Storage"),
26225
26326
  icon: /* @__PURE__ */ jsx(HardDrive, { className: "h-3.5 w-3.5" }),
26226
- children: status ? formatBytes(status.storageBytes) : "—"
26327
+ children: status ? formatBytes$1(status.storageBytes) : "—"
26227
26328
  }),
26228
26329
  /* @__PURE__ */ jsx(WidgetMetricCard, {
26229
26330
  label: t("uiLibrary.recordingPanel.recorded24h", "Recorded (24h)"),
@@ -26254,8 +26355,8 @@ function RecordingPanel({ deviceId }) {
26254
26355
  * `type:'widget'` ConfigField. `WidgetSlot` resolves these BEFORE the
26255
26356
  * Module-Federation `WidgetRegistry`. ids are namespaced `host/<name>`. */
26256
26357
  var HOST_WIDGETS = {
26257
- "host/motion-zones-grid": lazy(() => import("./MotionZonesSettings-Bv8XzCa3.js").then((m) => ({ default: m.MotionZonesSettings }))),
26258
- "host/privacy-mask-grid": lazy(() => import("./PrivacyMaskSettings-BlkbESYj.js").then((m) => ({ default: m.PrivacyMaskSettings }))),
26358
+ "host/motion-zones-grid": lazy(() => import("./MotionZonesSettings-C3Tj12yc.js").then((m) => ({ default: m.MotionZonesSettings }))),
26359
+ "host/privacy-mask-grid": lazy(() => import("./PrivacyMaskSettings-C9wfHkiB.js").then((m) => ({ default: m.PrivacyMaskSettings }))),
26259
26360
  "host/ptz-panel": PtzPanel,
26260
26361
  "host/navigation-panel": NavigationPanel,
26261
26362
  "host/consumables-panel": ConsumablesPanel,
@@ -28791,7 +28892,7 @@ function AddonActionSelectField({ field, value, values, onChange, disabled, onAc
28791
28892
  })()
28792
28893
  });
28793
28894
  }
28794
- function AddonActionButtonField({ field, values, disabled, onAction }) {
28895
+ function AddonActionButtonField({ field, values, disabled, onAction, onChange, onChangeMany }) {
28795
28896
  const t = useUiText();
28796
28897
  const [loading, setLoading] = useState(false);
28797
28898
  const [status, setStatus] = useState(null);
@@ -28823,6 +28924,17 @@ function AddonActionButtonField({ field, values, disabled, onAction }) {
28823
28924
  try {
28824
28925
  const result = await onAction(field.action, field.key, params);
28825
28926
  const resultRecord = typeof result === "object" && result !== null ? result : null;
28927
+ if (resultRecord !== null && field.assignResult && (onChange || onChangeMany)) {
28928
+ const patch = {};
28929
+ for (const [formKey, resultKey] of Object.entries(field.assignResult)) {
28930
+ const assigned = resultRecord[resultKey];
28931
+ if (typeof assigned === "string") patch[formKey] = assigned;
28932
+ }
28933
+ if (Object.keys(patch).length > 0) {
28934
+ if (onChangeMany) onChangeMany(patch);
28935
+ else if (onChange) for (const [formKey, assigned] of Object.entries(patch)) onChange(formKey, assigned);
28936
+ }
28937
+ }
28826
28938
  setStatus({
28827
28939
  kind: "ok",
28828
28940
  text: field.successMessage ? field.successMessage.replace(/\{(\w+)\}/g, (_, k) => {
@@ -29171,7 +29283,7 @@ function isFieldVisible(field, values, allFields) {
29171
29283
  if (condition.notIncludes !== void 0) return !Array.isArray(condVal) || !condVal.includes(condition.notIncludes);
29172
29284
  return true;
29173
29285
  }
29174
- function FormField({ field, values, onChange, disabled, translationFn, onTestField, externalProbe, allFields, onAction }) {
29286
+ function FormField({ field, values, onChange, onChangeMany, disabled, translationFn, onTestField, externalProbe, allFields, onAction }) {
29175
29287
  if (hasMultiple(field)) return /* @__PURE__ */ jsx(MultipleFieldWrapper, {
29176
29288
  field,
29177
29289
  values,
@@ -29407,7 +29519,9 @@ function FormField({ field, values, onChange, disabled, translationFn, onTestFie
29407
29519
  field,
29408
29520
  values,
29409
29521
  disabled,
29410
- onAction
29522
+ onAction,
29523
+ onChange,
29524
+ onChangeMany
29411
29525
  });
29412
29526
  case "device-action-button": return /* @__PURE__ */ jsx(DeviceActionButtonField, {
29413
29527
  field,
@@ -29584,17 +29698,7 @@ function applyValuesToSchema(schema, nextValues) {
29584
29698
  };
29585
29699
  }
29586
29700
  function stripValues(schema) {
29587
- return {
29588
- ...schema,
29589
- sections: schema.sections.map((s) => ({
29590
- ...s,
29591
- fields: s.fields.map((f) => {
29592
- if (!isValueBearingField(f)) return f;
29593
- const { value: _drop, ...rest } = f;
29594
- return rest;
29595
- })
29596
- }))
29597
- };
29701
+ return dehydrateSchema(schema);
29598
29702
  }
29599
29703
  function AddonGlobalSettingsForm({ trpc, addonId, nodeId, title, disabled, onAfterChange, refreshToken, sectionIds, bare = false, collapsible, defaultOpen, mode, onOverrideChange }) {
29600
29704
  const t = useUiText();
@@ -42900,6 +43004,19 @@ function FanPanel({ trpc, deviceId, features, layout, optimistic }) {
42900
43004
  }
42901
43005
  //#endregion
42902
43006
  //#region src/composites/device-controls/climate-panel.tsx
43007
+ /** Step size for target ± buttons; defaults to 1 °C when unset or invalid. */
43008
+ function resolveClimateTempStep(tempStep) {
43009
+ if (typeof tempStep === "number" && Number.isFinite(tempStep) && tempStep > 0) return tempStep;
43010
+ return 1;
43011
+ }
43012
+ function nextClimateTarget(current, deltaSteps, display) {
43013
+ let next = current + deltaSteps * resolveClimateTempStep(display.tempStep);
43014
+ const min = display.minTemp;
43015
+ const max = display.maxTemp;
43016
+ if (typeof min === "number" && Number.isFinite(min)) next = Math.max(next, min);
43017
+ if (typeof max === "number" && Number.isFinite(max)) next = Math.min(next, max);
43018
+ return next;
43019
+ }
42903
43020
  /**
42904
43021
  * Exhaustive colour map — one entry per HvacMode. Build will fail if a
42905
43022
  * mode is added to the enum and not reflected here (Record<HvacMode, ...>
@@ -42980,7 +43097,7 @@ function ClimatePanel({ trpc, deviceId, features: _features, layout, optimistic
42980
43097
  onClick: (e) => {
42981
43098
  e.stopPropagation();
42982
43099
  if (!busy && display.target !== null) {
42983
- const next = display.target - 1;
43100
+ const next = nextClimateTarget(display.target, -1, display);
42984
43101
  applyOptimistic({ target: next });
42985
43102
  cap.setTarget({ target: next });
42986
43103
  }
@@ -42994,7 +43111,7 @@ function ClimatePanel({ trpc, deviceId, features: _features, layout, optimistic
42994
43111
  onClick: (e) => {
42995
43112
  e.stopPropagation();
42996
43113
  if (!busy && display.target !== null) {
42997
- const next = display.target + 1;
43114
+ const next = nextClimateTarget(display.target, 1, display);
42998
43115
  applyOptimistic({ target: next });
42999
43116
  cap.setTarget({ target: next });
43000
43117
  }
@@ -43049,7 +43166,7 @@ function ClimatePanel({ trpc, deviceId, features: _features, layout, optimistic
43049
43166
  onClick: (e) => {
43050
43167
  e.stopPropagation();
43051
43168
  if (!busy && display.target !== null) {
43052
- const next = display.target - 1;
43169
+ const next = nextClimateTarget(display.target, -1, display);
43053
43170
  applyOptimistic({ target: next });
43054
43171
  cap.setTarget({ target: next });
43055
43172
  }
@@ -43064,7 +43181,7 @@ function ClimatePanel({ trpc, deviceId, features: _features, layout, optimistic
43064
43181
  onClick: (e) => {
43065
43182
  e.stopPropagation();
43066
43183
  if (!busy && display.target !== null) {
43067
- const next = display.target + 1;
43184
+ const next = nextClimateTarget(display.target, 1, display);
43068
43185
  applyOptimistic({ target: next });
43069
43186
  cap.setTarget({ target: next });
43070
43187
  }
@@ -43722,7 +43839,8 @@ var CONTROL_CAP_NAMES = [
43722
43839
  "climate-control",
43723
43840
  "media-player",
43724
43841
  "control",
43725
- "pet-feeder"
43842
+ "pet-feeder",
43843
+ "dishwasher"
43726
43844
  ];
43727
43845
  //#endregion
43728
43846
  //#region src/composites/device-controls/popover-row-action.tsx
@@ -48533,7 +48651,405 @@ function PetFeederHeroCard({ trpc, deviceId, features, optimistic }) {
48533
48651
  });
48534
48652
  }
48535
48653
  //#endregion
48654
+ //#region src/composites/device-controls/dishwasher-control.tsx
48655
+ /**
48656
+ * Dishwasher controls for a `DeviceType.Dishwasher` device.
48657
+ *
48658
+ * Reads the `dishwasher` cap status slice and renders inline + hero surfaces
48659
+ * mirroring vacuum-control / pet-feeder patterns.
48660
+ */
48661
+ function dishwasherStateMeta(state, t = defaultUiText) {
48662
+ switch (state) {
48663
+ case "running": return {
48664
+ label: t("uiLibrary.dishwasher.running", "Running"),
48665
+ tone: "text-primary"
48666
+ };
48667
+ case "paused": return {
48668
+ label: t("uiLibrary.dishwasher.paused", "Paused"),
48669
+ tone: "text-warning"
48670
+ };
48671
+ case "finished": return {
48672
+ label: t("uiLibrary.dishwasher.finished", "Finished"),
48673
+ tone: "text-success"
48674
+ };
48675
+ case "error": return {
48676
+ label: t("uiLibrary.dishwasher.error", "Error"),
48677
+ tone: "text-destructive"
48678
+ };
48679
+ case "unavailable": return {
48680
+ label: t("uiLibrary.dishwasher.unavailable", "Unavailable"),
48681
+ tone: "text-foreground-subtle"
48682
+ };
48683
+ case "idle": return {
48684
+ label: t("uiLibrary.dishwasher.idle", "Idle"),
48685
+ tone: "text-foreground-subtle"
48686
+ };
48687
+ case void 0: return {
48688
+ label: t("uiLibrary.dishwasher.unknown", "Unknown"),
48689
+ tone: "text-foreground-subtle"
48690
+ };
48691
+ }
48692
+ }
48693
+ function consumableTone(level) {
48694
+ switch (level) {
48695
+ case "ok": return "text-success";
48696
+ case "low": return "text-warning";
48697
+ case "empty": return "text-destructive";
48698
+ case null: return "text-foreground-subtle";
48699
+ }
48700
+ }
48701
+ function useDishwasher(trpc, deviceId) {
48702
+ return useDeviceCapability({
48703
+ trpc,
48704
+ deviceId,
48705
+ cap: (d) => d.dishwasher,
48706
+ slice: (d) => d.state.dishwasher
48707
+ });
48708
+ }
48709
+ function DishwasherIconButton({ label, busy, active, onClick, children }) {
48710
+ return /* @__PURE__ */ jsx("button", {
48711
+ type: "button",
48712
+ "aria-label": label,
48713
+ title: label,
48714
+ disabled: busy,
48715
+ onClick: (e) => {
48716
+ e.stopPropagation();
48717
+ onClick();
48718
+ },
48719
+ className: cn("inline-flex h-5 w-5 items-center justify-center rounded text-foreground-subtle hover:text-foreground hover:bg-surface-hover transition-colors", active && "bg-primary text-primary-foreground", busy && "opacity-40 cursor-not-allowed"),
48720
+ children
48721
+ });
48722
+ }
48723
+ function ConsumableBadge({ label, level }) {
48724
+ if (level === null) return null;
48725
+ return /* @__PURE__ */ jsxs("span", {
48726
+ className: cn("text-xs font-medium capitalize", consumableTone(level)),
48727
+ children: [
48728
+ label,
48729
+ ": ",
48730
+ level
48731
+ ]
48732
+ });
48733
+ }
48734
+ function DishwasherGraphic({ state, progressPercent }) {
48735
+ const running = state === "running";
48736
+ const pct = progressPercent != null ? Math.max(0, Math.min(100, progressPercent)) : running ? 40 : 0;
48737
+ return /* @__PURE__ */ jsxs("div", {
48738
+ "aria-hidden": "true",
48739
+ className: "relative w-28 h-36 rounded border-2 border-border bg-gradient-to-b from-surface-hover to-surface overflow-hidden flex-shrink-0",
48740
+ style: { boxShadow: "inset 0 0 0 2px rgba(255,255,255,.06)" },
48741
+ children: [/* @__PURE__ */ jsx("div", {
48742
+ className: cn("absolute inset-x-0 bottom-0 bg-primary/25 transition-[height] duration-500", running && "animate-pulse"),
48743
+ style: { height: `${pct}%` }
48744
+ }), /* @__PURE__ */ jsx("div", {
48745
+ className: "absolute inset-0 flex items-center justify-center text-foreground-subtle",
48746
+ children: /* @__PURE__ */ jsx(Waves, { className: "h-10 w-10 opacity-70" })
48747
+ })]
48748
+ });
48749
+ }
48750
+ function DishwasherPanel({ trpc, deviceId, layout, optimistic }) {
48751
+ const t = useUiText();
48752
+ const { cap, slice, available } = useDishwasher(trpc, deviceId);
48753
+ const { display, applyOptimistic } = useOptimisticSlice(slice, { enabled: optimistic ?? true });
48754
+ if (cap === void 0) return null;
48755
+ if (display === void 0) return null;
48756
+ const busy = !available;
48757
+ const meta = dishwasherStateMeta(display.state, t);
48758
+ const running = display.state === "running";
48759
+ const paused = display.state === "paused";
48760
+ const press = (fn, patch) => {
48761
+ if (busy) return;
48762
+ applyOptimistic(patch);
48763
+ fn();
48764
+ };
48765
+ if (layout === "compact") return /* @__PURE__ */ jsxs("div", {
48766
+ className: "inline-flex items-center gap-1",
48767
+ children: [
48768
+ display.doorOpen && /* @__PURE__ */ jsx("span", {
48769
+ className: "inline-flex text-warning",
48770
+ title: t("uiLibrary.dishwasher.doorOpen", "Door open"),
48771
+ "aria-label": t("uiLibrary.dishwasher.doorOpen", "Door open"),
48772
+ children: /* @__PURE__ */ jsx(DoorOpen, { className: "h-3.5 w-3.5" })
48773
+ }),
48774
+ /* @__PURE__ */ jsx("span", {
48775
+ className: cn("text-xs font-medium tabular-nums", meta.tone),
48776
+ children: meta.label
48777
+ }),
48778
+ display.remainingMinutes != null && /* @__PURE__ */ jsxs("span", {
48779
+ className: "inline-flex items-center gap-0.5 text-xs text-foreground-subtle tabular-nums",
48780
+ children: [
48781
+ /* @__PURE__ */ jsx(Timer, { className: "h-3 w-3" }),
48782
+ display.remainingMinutes,
48783
+ "m"
48784
+ ]
48785
+ }),
48786
+ /* @__PURE__ */ jsx(DishwasherIconButton, {
48787
+ label: t("uiLibrary.dishwasher.start", "Start"),
48788
+ busy: busy || !display.remoteStartAllowed,
48789
+ active: running,
48790
+ onClick: () => press(() => cap.start({}), {
48791
+ state: "running",
48792
+ remoteStartAllowed: false
48793
+ }),
48794
+ children: /* @__PURE__ */ jsx(Play, { className: "h-3 w-3" })
48795
+ }),
48796
+ /* @__PURE__ */ jsx(DishwasherIconButton, {
48797
+ label: t("uiLibrary.dishwasher.pause", "Pause"),
48798
+ busy: busy || !running,
48799
+ active: paused,
48800
+ onClick: () => press(() => cap.pause({}), { state: "paused" }),
48801
+ children: /* @__PURE__ */ jsx(Pause, { className: "h-3 w-3" })
48802
+ })
48803
+ ]
48804
+ });
48805
+ const programs = display.availablePrograms;
48806
+ return /* @__PURE__ */ jsxs("div", {
48807
+ className: "flex flex-col gap-3 rounded-lg border border-border bg-surface p-4",
48808
+ children: [
48809
+ /* @__PURE__ */ jsxs("div", {
48810
+ className: "flex items-start gap-4",
48811
+ children: [/* @__PURE__ */ jsx(DishwasherGraphic, {
48812
+ state: display.state,
48813
+ progressPercent: display.progressPercent
48814
+ }), /* @__PURE__ */ jsxs("div", {
48815
+ className: "flex min-w-0 flex-1 flex-col gap-2",
48816
+ children: [
48817
+ /* @__PURE__ */ jsxs("div", {
48818
+ className: "flex flex-wrap items-center gap-2",
48819
+ children: [/* @__PURE__ */ jsx("span", {
48820
+ className: cn("text-3xl font-semibold", meta.tone),
48821
+ children: meta.label
48822
+ }), !display.powerOn && /* @__PURE__ */ jsx("span", {
48823
+ className: "text-xs font-medium text-foreground-subtle",
48824
+ children: t("uiLibrary.dishwasher.powerOff", "Power off")
48825
+ })]
48826
+ }),
48827
+ display.program != null && /* @__PURE__ */ jsx("span", {
48828
+ className: "text-sm text-foreground-subtle",
48829
+ children: display.program
48830
+ }),
48831
+ display.progressPercent != null && /* @__PURE__ */ jsxs("div", {
48832
+ className: "flex items-center gap-2",
48833
+ children: [/* @__PURE__ */ jsx("div", {
48834
+ className: "h-1.5 flex-1 rounded bg-surface-hover overflow-hidden",
48835
+ children: /* @__PURE__ */ jsx("div", {
48836
+ className: "h-full bg-primary transition-[width] duration-500",
48837
+ style: { width: `${Math.max(0, Math.min(100, display.progressPercent))}%` }
48838
+ })
48839
+ }), /* @__PURE__ */ jsxs("span", {
48840
+ className: "tabular-nums text-xs text-foreground-subtle",
48841
+ children: [Math.round(display.progressPercent), "%"]
48842
+ })]
48843
+ }),
48844
+ /* @__PURE__ */ jsxs("div", {
48845
+ className: "flex flex-wrap gap-3",
48846
+ children: [
48847
+ /* @__PURE__ */ jsx(ConsumableBadge, {
48848
+ label: t("uiLibrary.dishwasher.salt", "Salt"),
48849
+ level: display.saltLevel
48850
+ }),
48851
+ /* @__PURE__ */ jsx(ConsumableBadge, {
48852
+ label: t("uiLibrary.dishwasher.rinseAid", "Rinse aid"),
48853
+ level: display.rinseAidLevel
48854
+ }),
48855
+ display.doorOpen && /* @__PURE__ */ jsxs("span", {
48856
+ className: "inline-flex items-center gap-1 text-xs text-warning",
48857
+ children: [/* @__PURE__ */ jsx(DoorOpen, { className: "h-3.5 w-3.5" }), t("uiLibrary.dishwasher.doorOpen", "Door open")]
48858
+ })
48859
+ ]
48860
+ }),
48861
+ display.errorCode != null && display.errorCode !== 0 && /* @__PURE__ */ jsxs("div", {
48862
+ className: "inline-flex items-center gap-1 text-xs text-destructive",
48863
+ children: [/* @__PURE__ */ jsx(TriangleAlert, { className: "h-3.5 w-3.5" }), /* @__PURE__ */ jsx("span", { children: display.errorLabel ?? t("uiLibrary.dishwasher.errorCode", "Error {{code}}", { code: display.errorCode }) })]
48864
+ }),
48865
+ /* @__PURE__ */ jsxs("div", {
48866
+ className: "flex flex-wrap items-center gap-2",
48867
+ children: [
48868
+ /* @__PURE__ */ jsx(DishwasherIconButton, {
48869
+ label: t("uiLibrary.dishwasher.start", "Start"),
48870
+ busy: busy || !display.remoteStartAllowed,
48871
+ active: running,
48872
+ onClick: () => press(() => cap.start({}), {
48873
+ state: "running",
48874
+ remoteStartAllowed: false
48875
+ }),
48876
+ children: /* @__PURE__ */ jsx(Play, { className: "h-4 w-4" })
48877
+ }),
48878
+ /* @__PURE__ */ jsx(DishwasherIconButton, {
48879
+ label: t("uiLibrary.dishwasher.pause", "Pause"),
48880
+ busy: busy || !running,
48881
+ active: paused,
48882
+ onClick: () => press(() => cap.pause({}), { state: "paused" }),
48883
+ children: /* @__PURE__ */ jsx(Pause, { className: "h-4 w-4" })
48884
+ }),
48885
+ /* @__PURE__ */ jsx(DishwasherIconButton, {
48886
+ label: t("uiLibrary.dishwasher.stop", "Stop"),
48887
+ busy,
48888
+ active: false,
48889
+ onClick: () => press(() => cap.stop({}), {
48890
+ state: "idle",
48891
+ remainingMinutes: null
48892
+ }),
48893
+ children: /* @__PURE__ */ jsx(Square, { className: "h-3.5 w-3.5" })
48894
+ }),
48895
+ /* @__PURE__ */ jsx(DishwasherIconButton, {
48896
+ label: t("uiLibrary.dishwasher.power", "Power"),
48897
+ busy,
48898
+ active: display.powerOn,
48899
+ onClick: () => {
48900
+ const next = !display.powerOn;
48901
+ press(() => cap.setPower({ on: next }), { powerOn: next });
48902
+ },
48903
+ children: /* @__PURE__ */ jsx(Power, { className: "h-4 w-4" })
48904
+ })
48905
+ ]
48906
+ })
48907
+ ]
48908
+ })]
48909
+ }),
48910
+ programs.length > 0 && /* @__PURE__ */ jsxs("label", {
48911
+ className: "flex items-center gap-2 text-xs text-foreground-subtle",
48912
+ children: [/* @__PURE__ */ jsx("span", {
48913
+ className: "w-16 shrink-0",
48914
+ children: t("uiLibrary.dishwasher.program", "Program")
48915
+ }), /* @__PURE__ */ jsxs("select", {
48916
+ "aria-label": t("uiLibrary.dishwasher.program", "Program"),
48917
+ value: display.program ?? "",
48918
+ disabled: busy,
48919
+ onChange: (e) => {
48920
+ const program = e.target.value;
48921
+ if (!program) return;
48922
+ applyOptimistic({ program });
48923
+ cap.setProgram({ program });
48924
+ },
48925
+ onClick: (e) => {
48926
+ e.stopPropagation();
48927
+ },
48928
+ className: "flex-1 rounded border border-border bg-surface px-2 py-1 text-foreground disabled:opacity-50",
48929
+ children: [display.program == null && /* @__PURE__ */ jsx("option", {
48930
+ value: "",
48931
+ children: "—"
48932
+ }), programs.map((p) => /* @__PURE__ */ jsx("option", {
48933
+ value: p,
48934
+ children: p
48935
+ }, p))]
48936
+ })]
48937
+ }),
48938
+ /* @__PURE__ */ jsxs("div", {
48939
+ className: "flex flex-wrap gap-4 text-xs",
48940
+ children: [/* @__PURE__ */ jsx(ToggleRow, {
48941
+ label: t("uiLibrary.dishwasher.halfLoad", "Half load"),
48942
+ checked: display.halfLoad,
48943
+ busy,
48944
+ onChange: (on) => {
48945
+ applyOptimistic({ halfLoad: on });
48946
+ cap.setHalfLoad({ on });
48947
+ }
48948
+ }), /* @__PURE__ */ jsx(ToggleRow, {
48949
+ label: t("uiLibrary.dishwasher.hygienePlus", "Hygiene plus"),
48950
+ checked: display.hygienePlus,
48951
+ busy,
48952
+ onChange: (on) => {
48953
+ applyOptimistic({ hygienePlus: on });
48954
+ cap.setHygienePlus({ on });
48955
+ }
48956
+ })]
48957
+ })
48958
+ ]
48959
+ });
48960
+ }
48961
+ function ToggleRow({ label, checked, busy, onChange }) {
48962
+ return /* @__PURE__ */ jsxs("label", {
48963
+ className: "inline-flex items-center gap-2 cursor-pointer",
48964
+ children: [/* @__PURE__ */ jsx("input", {
48965
+ type: "checkbox",
48966
+ checked,
48967
+ disabled: busy,
48968
+ onChange: (e) => {
48969
+ onChange(e.target.checked);
48970
+ },
48971
+ onClick: (e) => {
48972
+ e.stopPropagation();
48973
+ },
48974
+ className: "rounded border-border"
48975
+ }), /* @__PURE__ */ jsx("span", { children: label })]
48976
+ });
48977
+ }
48978
+ function DishwasherInlineControl(props) {
48979
+ return /* @__PURE__ */ jsx(DishwasherPanel, {
48980
+ ...props,
48981
+ layout: "compact"
48982
+ });
48983
+ }
48984
+ function DishwasherHeroCard(props) {
48985
+ return /* @__PURE__ */ jsx(DishwasherPanel, {
48986
+ ...props,
48987
+ layout: "full"
48988
+ });
48989
+ }
48990
+ //#endregion
48991
+ //#region src/composites/device-controls/heating-valve-readout.tsx
48992
+ function formatHeatingValvePosition(position) {
48993
+ return position !== null ? `${position}%` : "—";
48994
+ }
48995
+ function HeatingValveReadout({ trpc, deviceId, layout }) {
48996
+ const t = useUiText();
48997
+ const { cap, slice } = useDeviceCapability({
48998
+ trpc,
48999
+ deviceId,
49000
+ cap: (d) => d.heatingValve,
49001
+ slice: (d) => d.state.heatingValve
49002
+ });
49003
+ if (cap === void 0 || slice === void 0) return null;
49004
+ const label = t("uiLibrary.heatingValveReadout.valve", "Valve");
49005
+ const value = formatHeatingValvePosition(slice.position);
49006
+ if (layout === "compact") return /* @__PURE__ */ jsx("span", {
49007
+ className: "inline-flex items-center text-xs tabular-nums text-foreground-subtle",
49008
+ "aria-label": `${label} ${value}`,
49009
+ children: value
49010
+ });
49011
+ return /* @__PURE__ */ jsxs("div", {
49012
+ className: "flex items-center gap-2 text-xs tabular-nums text-foreground-subtle",
49013
+ children: [/* @__PURE__ */ jsx("span", { children: label }), /* @__PURE__ */ jsx("span", {
49014
+ className: "font-medium text-foreground",
49015
+ children: value
49016
+ })]
49017
+ });
49018
+ }
49019
+ //#endregion
48536
49020
  //#region src/composites/device-controls/ac-panel.tsx
49021
+ /** Modes that mean the device can cool, dry, or move air — an air conditioner. */
49022
+ var COOLING_MODES = new Set([
49023
+ "cool",
49024
+ "heat_cool",
49025
+ "dry",
49026
+ "fan_only"
49027
+ ]);
49028
+ /** A heater offers heat (and maybe auto/off) and none of the cooling modes. */
49029
+ function climateOffersCooling(modes) {
49030
+ return modes.some((mode) => COOLING_MODES.has(mode));
49031
+ }
49032
+ /** Setpoint track bounds. Absent when the integration did not report both ends. */
49033
+ function climateSetpointBounds(status) {
49034
+ const min = status.minTemp;
49035
+ const max = status.maxTemp;
49036
+ if (typeof min !== "number" || typeof max !== "number") return null;
49037
+ if (!Number.isFinite(min) || !Number.isFinite(max) || max <= min) return null;
49038
+ return {
49039
+ min,
49040
+ max
49041
+ };
49042
+ }
49043
+ /** Map a 0–1 drag fraction onto the setpoint, snapped to `tempStep`. */
49044
+ function climateTargetFromFraction(fraction, bounds, tempStep) {
49045
+ const step = resolveClimateTempStep(tempStep);
49046
+ const clamped = Math.min(1, Math.max(0, fraction));
49047
+ const raw = bounds.min + clamped * (bounds.max - bounds.min);
49048
+ const steps = Math.round((raw - bounds.min) / step);
49049
+ const snapped = bounds.min + steps * step;
49050
+ const rounded = Math.round(snapped * 1e3) / 1e3;
49051
+ return Math.min(bounds.max, Math.max(bounds.min, rounded));
49052
+ }
48537
49053
  /** AC-appropriate short mode labels. Exhaustive over HvacMode. */
48538
49054
  function modeLabel(t, mode) {
48539
49055
  switch (mode) {
@@ -48567,9 +49083,6 @@ var MODE_ACCENT = {
48567
49083
  dry: "#22d3ee",
48568
49084
  off: "#a1a1aa"
48569
49085
  };
48570
- /** Practical AC setpoint range (Celsius) for the target range track. */
48571
- var TARGET_MIN = 16;
48572
- var TARGET_MAX = 30;
48573
49086
  /** Title-case a snake/lower token for a selector option ('medium_low' → 'Medium
48574
49087
  * low', 'turbo' → 'Turbo'). Shared by the fan + preset selectors. */
48575
49088
  function fanLabel(token) {
@@ -48656,7 +49169,7 @@ function AcPanel({ trpc, deviceId, layout, optimistic }) {
48656
49169
  onClick: (e) => {
48657
49170
  e.stopPropagation();
48658
49171
  if (!busy && display.target !== null) {
48659
- const next = display.target - 1;
49172
+ const next = nextClimateTarget(display.target, -1, display);
48660
49173
  applyOptimistic({ target: next });
48661
49174
  cap.setTarget({ target: next });
48662
49175
  }
@@ -48670,7 +49183,7 @@ function AcPanel({ trpc, deviceId, layout, optimistic }) {
48670
49183
  onClick: (e) => {
48671
49184
  e.stopPropagation();
48672
49185
  if (!busy && display.target !== null) {
48673
- const next = display.target + 1;
49186
+ const next = nextClimateTarget(display.target, 1, display);
48674
49187
  applyOptimistic({ target: next });
48675
49188
  cap.setTarget({ target: next });
48676
49189
  }
@@ -48700,6 +49213,8 @@ function AcPanel({ trpc, deviceId, layout, optimistic }) {
48700
49213
  });
48701
49214
  const accent = MODE_ACCENT[display.mode];
48702
49215
  const on = display.mode !== "off";
49216
+ const heatingOnly = !climateOffersCooling(display.availableModes);
49217
+ const setpointBounds = climateSetpointBounds(display);
48703
49218
  const CurrentPresetIcon = presetIcon(display.preset);
48704
49219
  const boost = display.preset === "turbo";
48705
49220
  const period = Math.max(.55, airflowPeriodSec(display.fanMode) * (boost ? .6 : 1));
@@ -48716,11 +49231,12 @@ function AcPanel({ trpc, deviceId, layout, optimistic }) {
48716
49231
  children: [
48717
49232
  /* @__PURE__ */ jsx("div", {
48718
49233
  className: "pointer-events-none absolute inset-0 opacity-60",
48719
- children: /* @__PURE__ */ jsx(AirflowViz, {
49234
+ children: heatingOnly && !on ? /* @__PURE__ */ jsx(RadiatorFins, {}) : /* @__PURE__ */ jsx(AirflowViz, {
48720
49235
  mode: display.mode,
48721
49236
  accent,
48722
49237
  periodSec: period,
48723
- swaying
49238
+ swaying,
49239
+ forceRising: heatingOnly
48724
49240
  })
48725
49241
  }),
48726
49242
  /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-0 bg-gradient-to-b from-surface/50 via-transparent to-surface/50" }),
@@ -48738,6 +49254,7 @@ function AcPanel({ trpc, deviceId, layout, optimistic }) {
48738
49254
  children: [
48739
49255
  /* @__PURE__ */ jsx(ModeIcon, {
48740
49256
  mode: display.mode,
49257
+ heatingOnly,
48741
49258
  className: "h-3.5 w-3.5"
48742
49259
  }),
48743
49260
  modeLabel(t, display.mode),
@@ -48764,7 +49281,7 @@ function AcPanel({ trpc, deviceId, layout, optimistic }) {
48764
49281
  disabled: busy,
48765
49282
  onClick: () => {
48766
49283
  if (busy || display.target === null) return;
48767
- const next = display.target - 1;
49284
+ const next = nextClimateTarget(display.target, -1, display);
48768
49285
  applyOptimistic({ target: next });
48769
49286
  cap.setTarget({ target: next });
48770
49287
  }
@@ -48786,19 +49303,29 @@ function AcPanel({ trpc, deviceId, layout, optimistic }) {
48786
49303
  disabled: busy,
48787
49304
  onClick: () => {
48788
49305
  if (busy || display.target === null) return;
48789
- const next = display.target + 1;
49306
+ const next = nextClimateTarget(display.target, 1, display);
48790
49307
  applyOptimistic({ target: next });
48791
49308
  cap.setTarget({ target: next });
48792
49309
  }
48793
49310
  })
48794
49311
  ]
48795
- }), /* @__PURE__ */ jsx("div", {
48796
- className: "relative z-10 w-36",
49312
+ }), setpointBounds !== null && /* @__PURE__ */ jsx("div", {
49313
+ className: "relative z-10 w-full px-1",
48797
49314
  children: /* @__PURE__ */ jsx(RangeTrack, {
48798
49315
  value: display.target,
48799
- min: TARGET_MIN,
48800
- max: TARGET_MAX,
48801
- accent
49316
+ min: setpointBounds.min,
49317
+ max: setpointBounds.max,
49318
+ step: display.tempStep,
49319
+ accent,
49320
+ disabled: busy,
49321
+ label: t("uiLibrary.acPanel.setpoint", "Setpoint"),
49322
+ onPreview: (next) => {
49323
+ applyOptimistic({ target: next });
49324
+ },
49325
+ onCommit: (next) => {
49326
+ applyOptimistic({ target: next });
49327
+ cap.setTarget({ target: next });
49328
+ }
48802
49329
  })
48803
49330
  })] }) : /* @__PURE__ */ jsxs("div", {
48804
49331
  className: "relative z-10 flex items-baseline gap-0.5",
@@ -48822,6 +49349,7 @@ function AcPanel({ trpc, deviceId, layout, optimistic }) {
48822
49349
  className: "flex",
48823
49350
  children: /* @__PURE__ */ jsx(ModeIcon, {
48824
49351
  mode: display.mode,
49352
+ heatingOnly,
48825
49353
  className: "h-4 w-4"
48826
49354
  })
48827
49355
  }),
@@ -48905,9 +49433,8 @@ function Field({ label, children }) {
48905
49433
  }), children]
48906
49434
  });
48907
49435
  }
48908
- function ModeIcon({ mode, className }) {
48909
- const Icon = MODE_ICON[mode];
48910
- return /* @__PURE__ */ jsx(Icon, {
49436
+ function ModeIcon({ mode, heatingOnly = false, className }) {
49437
+ return /* @__PURE__ */ jsx(heatingOnly && mode === "heat" ? Heater : MODE_ICON[mode], {
48911
49438
  className,
48912
49439
  "aria-hidden": true
48913
49440
  });
@@ -48957,11 +49484,89 @@ function RoundStep({ label, symbol, disabled, onClick }) {
48957
49484
  children: symbol
48958
49485
  });
48959
49486
  }
48960
- /** Thin gradient range track with a knob at the setpoint fraction. */
48961
- function RangeTrack({ value, min, max, accent }) {
48962
- const pct = `${Math.min(1, Math.max(0, (value - min) / (max - min))) * 100}%`;
49487
+ /** Setpoint track. Drag previews; the command is sent when the pointer is released. */
49488
+ function RangeTrack({ value, min, max, step, accent, disabled, label, onPreview, onCommit }) {
49489
+ const trackRef = useRef(null);
49490
+ const draggingRef = useRef(false);
49491
+ const [draft, setDraft] = useState(null);
49492
+ const shown = draft ?? value;
49493
+ const pct = `${Math.min(1, Math.max(0, (shown - min) / (max - min))) * 100}%`;
49494
+ const tempAt = (clientX) => {
49495
+ const el = trackRef.current;
49496
+ if (el === null) return value;
49497
+ const rect = el.getBoundingClientRect();
49498
+ if (rect.width <= 0) return value;
49499
+ return climateTargetFromFraction((clientX - rect.left) / rect.width, {
49500
+ min,
49501
+ max
49502
+ }, step);
49503
+ };
49504
+ const onPointerDown = (event) => {
49505
+ if (disabled) return;
49506
+ event.stopPropagation();
49507
+ event.preventDefault();
49508
+ draggingRef.current = true;
49509
+ if (typeof event.currentTarget.setPointerCapture === "function") event.currentTarget.setPointerCapture(event.pointerId);
49510
+ const next = tempAt(event.clientX);
49511
+ setDraft(next);
49512
+ onPreview(next);
49513
+ };
49514
+ const onPointerMove = (event) => {
49515
+ if (disabled || !draggingRef.current) return;
49516
+ event.stopPropagation();
49517
+ const next = tempAt(event.clientX);
49518
+ setDraft(next);
49519
+ onPreview(next);
49520
+ };
49521
+ const endDrag = (event) => {
49522
+ if (!draggingRef.current) return;
49523
+ event.stopPropagation();
49524
+ draggingRef.current = false;
49525
+ const next = tempAt(event.clientX);
49526
+ setDraft(null);
49527
+ if (event.currentTarget.hasPointerCapture?.(event.pointerId) === true) event.currentTarget.releasePointerCapture(event.pointerId);
49528
+ onCommit(next);
49529
+ };
49530
+ const onKeyDown = (event) => {
49531
+ if (disabled) return;
49532
+ const current = draft ?? value;
49533
+ if (event.key === "ArrowRight" || event.key === "ArrowUp") {
49534
+ event.preventDefault();
49535
+ onCommit(nextClimateTarget(current, 1, {
49536
+ tempStep: step,
49537
+ minTemp: min,
49538
+ maxTemp: max
49539
+ }));
49540
+ } else if (event.key === "ArrowLeft" || event.key === "ArrowDown") {
49541
+ event.preventDefault();
49542
+ onCommit(nextClimateTarget(current, -1, {
49543
+ tempStep: step,
49544
+ minTemp: min,
49545
+ maxTemp: max
49546
+ }));
49547
+ } else if (event.key === "Home") {
49548
+ event.preventDefault();
49549
+ onCommit(min);
49550
+ } else if (event.key === "End") {
49551
+ event.preventDefault();
49552
+ onCommit(max);
49553
+ }
49554
+ };
48963
49555
  return /* @__PURE__ */ jsxs("div", {
48964
- className: "mt-2 w-full",
49556
+ ref: trackRef,
49557
+ role: "slider",
49558
+ "aria-label": label,
49559
+ "aria-valuemin": min,
49560
+ "aria-valuemax": max,
49561
+ "aria-valuenow": shown,
49562
+ "aria-disabled": disabled,
49563
+ tabIndex: disabled ? -1 : 0,
49564
+ onPointerDown,
49565
+ onPointerMove,
49566
+ onPointerUp: endDrag,
49567
+ onPointerCancel: endDrag,
49568
+ onKeyDown,
49569
+ className: cn("mt-1 w-full touch-none select-none py-2", disabled ? "cursor-not-allowed opacity-40" : "cursor-ew-resize"),
48965
49570
  children: [/* @__PURE__ */ jsxs("div", {
48966
49571
  className: "relative h-1.5 w-full rounded-full bg-surface-subtle",
48967
49572
  children: [/* @__PURE__ */ jsx("div", {
@@ -48971,7 +49576,7 @@ function RangeTrack({ value, min, max, accent }) {
48971
49576
  background: accent
48972
49577
  }
48973
49578
  }), /* @__PURE__ */ jsx("div", {
48974
- className: "absolute top-1/2 h-3 w-3 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-surface shadow",
49579
+ className: "absolute top-1/2 h-3.5 w-3.5 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-surface shadow",
48975
49580
  style: {
48976
49581
  left: pct,
48977
49582
  background: accent
@@ -48988,7 +49593,7 @@ function RangeTrack({ value, min, max, accent }) {
48988
49593
  * vent; every active mode renders drifting particles that FALL (cool/dry/auto)
48989
49594
  * or RISE (heat), with a horizontal sweep overlaid when a swing axis is active.
48990
49595
  */
48991
- function AirflowViz({ mode, accent, periodSec, swaying }) {
49596
+ function AirflowViz({ mode, accent, periodSec, swaying, forceRising = false }) {
48992
49597
  const columns = [
48993
49598
  0,
48994
49599
  1,
@@ -48997,7 +49602,7 @@ function AirflowViz({ mode, accent, periodSec, swaying }) {
48997
49602
  4,
48998
49603
  5
48999
49604
  ];
49000
- const rising = mode === "heat";
49605
+ const rising = forceRising || mode === "heat";
49001
49606
  const isDroplet = mode === "dry";
49002
49607
  return /* @__PURE__ */ jsx("div", {
49003
49608
  "aria-hidden": true,
@@ -49013,6 +49618,7 @@ function AirflowViz({ mode, accent, periodSec, swaying }) {
49013
49618
  size: 56
49014
49619
  })
49015
49620
  }) : /* @__PURE__ */ jsx("div", {
49621
+ "data-testid": forceRising ? "climate-heat-rise" : void 0,
49016
49622
  className: cn("acv-sway-wrap absolute inset-0", swaying && "acv-sway"),
49017
49623
  style: swaying ? { animation: "acv-sway 2.6s ease-in-out infinite" } : void 0,
49018
49624
  children: columns.map((i) => {
@@ -49035,6 +49641,23 @@ function AirflowViz({ mode, accent, periodSec, swaying }) {
49035
49641
  })
49036
49642
  });
49037
49643
  }
49644
+ /** Still radiator fins — the off state of a heating-only climate. */
49645
+ function RadiatorFins() {
49646
+ return /* @__PURE__ */ jsx("div", {
49647
+ "data-testid": "climate-radiator",
49648
+ "aria-hidden": true,
49649
+ className: "flex h-full items-end justify-center gap-1.5 px-8 pb-3 opacity-40",
49650
+ children: [
49651
+ 0,
49652
+ 1,
49653
+ 2,
49654
+ 3,
49655
+ 4,
49656
+ 5,
49657
+ 6
49658
+ ].map((i) => /* @__PURE__ */ jsx("span", { className: "h-10 w-1.5 rounded-t-full bg-foreground-subtle" }, i))
49659
+ });
49660
+ }
49038
49661
  /** Big spinning fan for `fan_only` mode. */
49039
49662
  function FanBlades({ color, periodSec, size }) {
49040
49663
  return /* @__PURE__ */ jsxs("svg", {
@@ -49201,16 +49824,33 @@ var MODE_ARC_COLOR = {
49201
49824
  */
49202
49825
  function ThermostatHeroCard({ trpc, deviceId, features: _features, optimistic }) {
49203
49826
  const t = useUiText();
49204
- const { cap, slice, available } = useDeviceCapability({
49827
+ const climate = useDeviceCapability({
49205
49828
  trpc,
49206
49829
  deviceId,
49207
49830
  cap: (d) => d.climateControl,
49208
49831
  slice: (d) => d.state.climateControl
49209
49832
  });
49210
- const { display, applyOptimistic } = useOptimisticSlice(slice, { enabled: optimistic ?? true });
49211
- if (cap === void 0) return null;
49212
- if (display === void 0) return null;
49213
- const busy = !available;
49833
+ const valve = useDeviceCapability({
49834
+ trpc,
49835
+ deviceId,
49836
+ cap: (d) => d.heatingValve,
49837
+ slice: (d) => d.state.heatingValve
49838
+ });
49839
+ const { display, applyOptimistic } = useOptimisticSlice(climate.slice, { enabled: optimistic ?? true });
49840
+ const hasClimate = climate.cap !== void 0 && display !== void 0;
49841
+ const hasValve = valve.cap !== void 0;
49842
+ if (!hasClimate && !hasValve) return null;
49843
+ if (!hasClimate && hasValve) return /* @__PURE__ */ jsx("div", {
49844
+ className: "flex flex-col items-stretch gap-3 rounded-lg border border-border bg-surface p-4",
49845
+ children: /* @__PURE__ */ jsx(HeatingValveReadout, {
49846
+ trpc,
49847
+ deviceId,
49848
+ layout: "full"
49849
+ })
49850
+ });
49851
+ if (climate.cap === void 0 || display === void 0) return null;
49852
+ const cap = climate.cap;
49853
+ const busy = !climate.available;
49214
49854
  const color = MODE_ARC_COLOR[display.mode];
49215
49855
  const isRange = display.mode === "heat_cool" || display.targetLow !== null && display.targetHigh !== null;
49216
49856
  const min = DEFAULT_TEMP_MIN;
@@ -49221,132 +49861,140 @@ function ThermostatHeroCard({ trpc, deviceId, features: _features, optimistic })
49221
49861
  return /* @__PURE__ */ jsxs("div", {
49222
49862
  "data-mode": display.mode,
49223
49863
  className: cn("flex flex-col items-stretch gap-4 rounded-lg border border-border bg-surface p-4 transition-colors", MODE_COLOR[display.mode]),
49224
- children: [/* @__PURE__ */ jsxs("div", {
49225
- className: "flex flex-col items-center gap-3",
49226
- children: [/* @__PURE__ */ jsxs("div", {
49227
- className: "relative",
49228
- style: {
49229
- width: GAUGE_SIZE,
49230
- height: GAUGE_SIZE
49231
- },
49232
- children: [
49233
- isRange ? /* @__PURE__ */ jsx(GaugeRing, {
49234
- mode: "band",
49235
- band: {
49236
- from: fractionLow,
49237
- to: fractionHigh
49238
- },
49239
- color
49240
- }) : /* @__PURE__ */ jsx(GaugeRing, {
49241
- mode: "fill",
49242
- fraction: singleFraction,
49243
- color
49244
- }),
49245
- isRange ? /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("div", {
49246
- "data-testid": "arc-knob",
49247
- children: /* @__PURE__ */ jsx(ArcKnob, {
49248
- fraction: fractionLow,
49249
- color,
49250
- knobTopPx: THERMOSTAT_KNOB_TOP_PX,
49251
- onDragFraction: (f) => {
49252
- if (busy || display.targetHigh === null) return;
49253
- const next = Math.min(fractionToTemp(f, min, max), display.targetHigh);
49254
- applyOptimistic({ targetLow: next });
49255
- cap.setTargetRange({
49256
- targetLow: next,
49257
- targetHigh: display.targetHigh
49258
- });
49259
- }
49260
- })
49261
- }), /* @__PURE__ */ jsx("div", {
49262
- "data-testid": "arc-knob",
49263
- children: /* @__PURE__ */ jsx(ArcKnob, {
49264
- fraction: fractionHigh,
49265
- color,
49266
- knobTopPx: THERMOSTAT_KNOB_TOP_PX,
49267
- onDragFraction: (f) => {
49268
- if (busy || display.targetLow === null) return;
49269
- const next = Math.max(fractionToTemp(f, min, max), display.targetLow);
49270
- applyOptimistic({ targetHigh: next });
49271
- cap.setTargetRange({
49272
- targetLow: display.targetLow,
49273
- targetHigh: next
49274
- });
49275
- }
49276
- })
49277
- })] }) : /* @__PURE__ */ jsx("div", {
49278
- "data-testid": "arc-knob",
49279
- children: /* @__PURE__ */ jsx(ArcKnob, {
49864
+ children: [
49865
+ /* @__PURE__ */ jsxs("div", {
49866
+ className: "flex flex-col items-center gap-3",
49867
+ children: [/* @__PURE__ */ jsxs("div", {
49868
+ className: "relative",
49869
+ style: {
49870
+ width: GAUGE_SIZE,
49871
+ height: GAUGE_SIZE
49872
+ },
49873
+ children: [
49874
+ isRange ? /* @__PURE__ */ jsx(GaugeRing, {
49875
+ mode: "band",
49876
+ band: {
49877
+ from: fractionLow,
49878
+ to: fractionHigh
49879
+ },
49880
+ color
49881
+ }) : /* @__PURE__ */ jsx(GaugeRing, {
49882
+ mode: "fill",
49280
49883
  fraction: singleFraction,
49281
- color,
49282
- knobTopPx: THERMOSTAT_KNOB_TOP_PX,
49283
- onDragFraction: (f) => {
49284
- if (busy) return;
49285
- const next = fractionToTemp(f, min, max);
49286
- applyOptimistic({ target: next });
49287
- cap.setTarget({ target: next });
49288
- }
49289
- })
49290
- }),
49291
- /* @__PURE__ */ jsxs("div", {
49292
- className: "absolute inset-0 flex flex-col items-center justify-center gap-0.5 pointer-events-none",
49293
- children: [
49294
- /* @__PURE__ */ jsxs("div", {
49295
- "data-testid": "current-temp",
49296
- className: "text-4xl font-bold tabular-nums text-foreground leading-none",
49297
- children: [display.currentTemp !== null ? display.currentTemp : "—", /* @__PURE__ */ jsx("span", {
49298
- className: "text-lg text-foreground-subtle font-normal ml-0.5",
49299
- children: "°"
49300
- })]
49301
- }),
49302
- !isRange && display.target !== null && /* @__PURE__ */ jsx("div", {
49303
- className: "text-xs font-semibold",
49304
- style: { color },
49305
- children: t("uiLibrary.thermostatHeroCard.setTo", "set {{value}}°", { value: display.target })
49306
- }),
49307
- isRange && display.targetLow !== null && display.targetHigh !== null && /* @__PURE__ */ jsxs("div", {
49308
- className: "text-xs font-semibold",
49309
- style: { color },
49310
- children: [
49311
- display.targetLow,
49312
- "° – ",
49313
- display.targetHigh,
49314
- "°"
49315
- ]
49884
+ color
49885
+ }),
49886
+ isRange ? /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("div", {
49887
+ "data-testid": "arc-knob",
49888
+ children: /* @__PURE__ */ jsx(ArcKnob, {
49889
+ fraction: fractionLow,
49890
+ color,
49891
+ knobTopPx: THERMOSTAT_KNOB_TOP_PX,
49892
+ onDragFraction: (f) => {
49893
+ if (busy || display.targetHigh === null) return;
49894
+ const next = Math.min(fractionToTemp(f, min, max), display.targetHigh);
49895
+ applyOptimistic({ targetLow: next });
49896
+ cap.setTargetRange({
49897
+ targetLow: next,
49898
+ targetHigh: display.targetHigh
49899
+ });
49900
+ }
49316
49901
  })
49317
- ]
49902
+ }), /* @__PURE__ */ jsx("div", {
49903
+ "data-testid": "arc-knob",
49904
+ children: /* @__PURE__ */ jsx(ArcKnob, {
49905
+ fraction: fractionHigh,
49906
+ color,
49907
+ knobTopPx: THERMOSTAT_KNOB_TOP_PX,
49908
+ onDragFraction: (f) => {
49909
+ if (busy || display.targetLow === null) return;
49910
+ const next = Math.max(fractionToTemp(f, min, max), display.targetLow);
49911
+ applyOptimistic({ targetHigh: next });
49912
+ cap.setTargetRange({
49913
+ targetLow: display.targetLow,
49914
+ targetHigh: next
49915
+ });
49916
+ }
49917
+ })
49918
+ })] }) : /* @__PURE__ */ jsx("div", {
49919
+ "data-testid": "arc-knob",
49920
+ children: /* @__PURE__ */ jsx(ArcKnob, {
49921
+ fraction: singleFraction,
49922
+ color,
49923
+ knobTopPx: THERMOSTAT_KNOB_TOP_PX,
49924
+ onDragFraction: (f) => {
49925
+ if (busy) return;
49926
+ const next = fractionToTemp(f, min, max);
49927
+ applyOptimistic({ target: next });
49928
+ cap.setTarget({ target: next });
49929
+ }
49930
+ })
49931
+ }),
49932
+ /* @__PURE__ */ jsxs("div", {
49933
+ className: "absolute inset-0 flex flex-col items-center justify-center gap-0.5 pointer-events-none",
49934
+ children: [
49935
+ /* @__PURE__ */ jsxs("div", {
49936
+ "data-testid": "current-temp",
49937
+ className: "text-4xl font-bold tabular-nums text-foreground leading-none",
49938
+ children: [display.currentTemp !== null ? display.currentTemp : "—", /* @__PURE__ */ jsx("span", {
49939
+ className: "text-lg text-foreground-subtle font-normal ml-0.5",
49940
+ children: "°"
49941
+ })]
49942
+ }),
49943
+ !isRange && display.target !== null && /* @__PURE__ */ jsx("div", {
49944
+ className: "text-xs font-semibold",
49945
+ style: { color },
49946
+ children: t("uiLibrary.thermostatHeroCard.setTo", "set {{value}}°", { value: display.target })
49947
+ }),
49948
+ isRange && display.targetLow !== null && display.targetHigh !== null && /* @__PURE__ */ jsxs("div", {
49949
+ className: "text-xs font-semibold",
49950
+ style: { color },
49951
+ children: [
49952
+ display.targetLow,
49953
+ "° – ",
49954
+ display.targetHigh,
49955
+ "°"
49956
+ ]
49957
+ })
49958
+ ]
49959
+ })
49960
+ ]
49961
+ }), !isRange && display.target !== null && /* @__PURE__ */ jsx("div", {
49962
+ className: "w-[200px]",
49963
+ children: /* @__PURE__ */ jsx(Stepper, {
49964
+ value: `${display.target}°`,
49965
+ onDelta: (d) => {
49966
+ if (busy || display.target === null) return;
49967
+ const next = display.target + d;
49968
+ applyOptimistic({ target: next });
49969
+ cap.setTarget({ target: next });
49970
+ }
49318
49971
  })
49319
- ]
49320
- }), !isRange && display.target !== null && /* @__PURE__ */ jsx("div", {
49321
- className: "w-[200px]",
49322
- children: /* @__PURE__ */ jsx(Stepper, {
49323
- value: `${display.target}°`,
49324
- onDelta: (d) => {
49325
- if (busy || display.target === null) return;
49326
- const next = display.target + d;
49327
- applyOptimistic({ target: next });
49328
- cap.setTarget({ target: next });
49972
+ })]
49973
+ }),
49974
+ hasValve ? /* @__PURE__ */ jsx(HeatingValveReadout, {
49975
+ trpc,
49976
+ deviceId,
49977
+ layout: "full"
49978
+ }) : null,
49979
+ /* @__PURE__ */ jsx("select", {
49980
+ "aria-label": t("uiLibrary.thermostatHeroCard.mode", "Mode"),
49981
+ value: display.mode,
49982
+ disabled: busy,
49983
+ onChange: (e) => {
49984
+ e.stopPropagation();
49985
+ const mode = e.target.value;
49986
+ if (!busy && mode) {
49987
+ applyOptimistic({ mode: display.availableModes.find((m) => m === mode) ?? display.mode });
49988
+ cap.setMode({ mode: display.availableModes.find((m) => m === mode) ?? display.mode });
49329
49989
  }
49330
- })
49331
- })]
49332
- }), /* @__PURE__ */ jsx("select", {
49333
- "aria-label": t("uiLibrary.thermostatHeroCard.mode", "Mode"),
49334
- value: display.mode,
49335
- disabled: busy,
49336
- onChange: (e) => {
49337
- e.stopPropagation();
49338
- const mode = e.target.value;
49339
- if (!busy && mode) {
49340
- applyOptimistic({ mode: display.availableModes.find((m) => m === mode) ?? display.mode });
49341
- cap.setMode({ mode: display.availableModes.find((m) => m === mode) ?? display.mode });
49342
- }
49343
- },
49344
- className: cn("w-full rounded border border-border bg-surface px-3 py-1.5 text-sm", busy && "opacity-40 cursor-not-allowed"),
49345
- children: display.availableModes.map((m) => /* @__PURE__ */ jsx("option", {
49346
- value: m,
49347
- children: m
49348
- }, m))
49349
- })]
49990
+ },
49991
+ className: cn("w-full rounded border border-border bg-surface px-3 py-1.5 text-sm", busy && "opacity-40 cursor-not-allowed"),
49992
+ children: display.availableModes.map((m) => /* @__PURE__ */ jsx("option", {
49993
+ value: m,
49994
+ children: m
49995
+ }, m))
49996
+ })
49997
+ ]
49350
49998
  });
49351
49999
  }
49352
50000
  //#endregion
@@ -50854,14 +51502,32 @@ function useClimateCapGuard(trpc, deviceId) {
50854
51502
  });
50855
51503
  return cap !== void 0;
50856
51504
  }
50857
- function ThermostatInlineControl({ trpc, deviceId, features, optimistic }) {
50858
- if (!useClimateCapGuard(trpc, deviceId)) return null;
50859
- return /* @__PURE__ */ jsx(ClimatePanel, {
51505
+ function useHeatingValveCapGuard(trpc, deviceId) {
51506
+ const { cap } = useDeviceCapability({
50860
51507
  trpc,
50861
51508
  deviceId,
50862
- features,
50863
- layout: "compact",
50864
- optimistic
51509
+ cap: (d) => d.heatingValve,
51510
+ slice: (d) => d.state.heatingValve
51511
+ });
51512
+ return cap !== void 0;
51513
+ }
51514
+ function ThermostatInlineControl({ trpc, deviceId, features, optimistic }) {
51515
+ const hasClimate = useClimateCapGuard(trpc, deviceId);
51516
+ const hasValve = useHeatingValveCapGuard(trpc, deviceId);
51517
+ if (!hasClimate && !hasValve) return null;
51518
+ return /* @__PURE__ */ jsxs("span", {
51519
+ className: "inline-flex items-center gap-2",
51520
+ children: [hasClimate ? /* @__PURE__ */ jsx(ClimatePanel, {
51521
+ trpc,
51522
+ deviceId,
51523
+ features,
51524
+ layout: "compact",
51525
+ optimistic
51526
+ }) : null, hasValve ? /* @__PURE__ */ jsx(HeatingValveReadout, {
51527
+ trpc,
51528
+ deviceId,
51529
+ layout: "compact"
51530
+ }) : null]
50865
51531
  });
50866
51532
  }
50867
51533
  function AcInlineControl({ trpc, deviceId, features, optimistic }) {
@@ -51026,6 +51692,10 @@ var CONTROL_KIND_COMPONENTS = {
51026
51692
  InlineControl: PetFeederInlineControl,
51027
51693
  HeroCard: PetFeederHeroCard
51028
51694
  },
51695
+ dishwasher: {
51696
+ InlineControl: DishwasherInlineControl,
51697
+ HeroCard: DishwasherHeroCard
51698
+ },
51029
51699
  script: {
51030
51700
  InlineControl: ScriptInlineControl,
51031
51701
  HeroCard: ScriptHeroCard
@@ -51102,7 +51772,8 @@ var CONTROL_FILLS = {
51102
51772
  [DeviceType.Weather]: false,
51103
51773
  [DeviceType.Container]: false,
51104
51774
  [DeviceType.Image]: false,
51105
- [DeviceType.PetFeeder]: false
51775
+ [DeviceType.PetFeeder]: false,
51776
+ [DeviceType.Dishwasher]: false
51106
51777
  };
51107
51778
  var DEVICE_TYPE_VALUES = new Set(Object.values(DeviceType));
51108
51779
  /**
@@ -58659,6 +59330,780 @@ function EntryIcon({ url }) {
58659
59330
  });
58660
59331
  }
58661
59332
  //#endregion
59333
+ //#region src/composites/record-entries/record-entry-secrets.ts
59334
+ /** Whether a record entry field still holds the redaction token from a read. */
59335
+ function isRedactedSecret(value) {
59336
+ return value === REDACTED_SECRET;
59337
+ }
59338
+ /** Text shown in a password box for a redacted stored secret (empty — placeholder carries the hint). */
59339
+ function secretDisplayValue(value) {
59340
+ if (isRedactedSecret(value)) return "";
59341
+ return typeof value === "string" ? value : "";
59342
+ }
59343
+ /** Merge an edited password box back into the body sent to `putEntry`. */
59344
+ function mergeSecretForSubmit(draft, original) {
59345
+ if (!isRedactedSecret(original)) return draft;
59346
+ if (draft.length === 0) return REDACTED_SECRET;
59347
+ return draft;
59348
+ }
59349
+ /** Is this JSON-schema leaf (or path) a credential field? */
59350
+ function isSecretField(path, secretPaths, schemaNode) {
59351
+ if (schemaNode["secret"] === true) return true;
59352
+ return secretPaths.includes(path);
59353
+ }
59354
+ //#endregion
59355
+ //#region src/composites/record-entries/entry-json-schema-form.tsx
59356
+ function isRecord$1(value) {
59357
+ return typeof value === "object" && value !== null && !Array.isArray(value);
59358
+ }
59359
+ function labelFor(key, node) {
59360
+ const desc = node["description"];
59361
+ if (typeof desc === "string" && desc.length > 0) return desc;
59362
+ return key.replace(/([A-Z])/g, " $1").replace(/^./, (c) => c.toUpperCase());
59363
+ }
59364
+ function readString(value) {
59365
+ return typeof value === "string" ? value : "";
59366
+ }
59367
+ function readNumber(value) {
59368
+ return typeof value === "number" && Number.isFinite(value) ? value : void 0;
59369
+ }
59370
+ function readBool(value) {
59371
+ return value === true;
59372
+ }
59373
+ function objectFromJson(text) {
59374
+ try {
59375
+ const parsed = JSON.parse(text);
59376
+ return isRecord$1(parsed) ? parsed : null;
59377
+ } catch {
59378
+ return null;
59379
+ }
59380
+ }
59381
+ function RecordEntrySecretField({ label, required, value, disabled, onPatch }) {
59382
+ const [shown, setShown] = useState(false);
59383
+ const stored = isRedactedSecret(value);
59384
+ return /* @__PURE__ */ jsx(FormField$1, {
59385
+ label,
59386
+ required,
59387
+ children: /* @__PURE__ */ jsx(PasswordInput, {
59388
+ value: secretDisplayValue(value),
59389
+ onValueChange: (text) => onPatch(mergeSecretForSubmit(text, value)),
59390
+ shown,
59391
+ onToggleShown: () => setShown((s) => !s),
59392
+ disabled,
59393
+ placeholder: stored ? SECRET_MASK_PLACEHOLDER : `Enter ${label.toLowerCase()}`
59394
+ })
59395
+ });
59396
+ }
59397
+ function SchemaField(props) {
59398
+ const { path, name, node, value, secretPaths, required, disabled, onPatch } = props;
59399
+ const label = labelFor(name, node);
59400
+ if (isSecretField(path, secretPaths, node)) return /* @__PURE__ */ jsx(RecordEntrySecretField, {
59401
+ label,
59402
+ required,
59403
+ value,
59404
+ disabled,
59405
+ onPatch: (next) => onPatch(path, next)
59406
+ });
59407
+ const enumValues = node["enum"];
59408
+ if (Array.isArray(enumValues) && enumValues.every((v) => typeof v === "string")) return /* @__PURE__ */ jsx(FormField$1, {
59409
+ label,
59410
+ required,
59411
+ children: /* @__PURE__ */ jsx(Select, {
59412
+ value: readString(value),
59413
+ onChange: (e) => onPatch(path, e.target.value),
59414
+ disabled,
59415
+ options: enumValues.map((opt) => ({
59416
+ value: opt,
59417
+ label: opt
59418
+ }))
59419
+ })
59420
+ });
59421
+ const type = node["type"];
59422
+ if (type === "boolean") return /* @__PURE__ */ jsx(FormField$1, {
59423
+ label,
59424
+ required,
59425
+ children: /* @__PURE__ */ jsx(Switch, {
59426
+ checked: readBool(value),
59427
+ onCheckedChange: (v) => onPatch(path, v),
59428
+ disabled
59429
+ })
59430
+ });
59431
+ if (type === "integer" || type === "number") return /* @__PURE__ */ jsx(FormField$1, {
59432
+ label,
59433
+ required,
59434
+ children: /* @__PURE__ */ jsx(Input, {
59435
+ type: "number",
59436
+ value: readNumber(value) ?? "",
59437
+ onChange: (e) => {
59438
+ const raw = e.target.value;
59439
+ onPatch(path, raw === "" ? void 0 : Number(raw));
59440
+ },
59441
+ disabled
59442
+ })
59443
+ });
59444
+ if (type === "object") {
59445
+ const properties = node["properties"];
59446
+ if (isRecord$1(properties)) {
59447
+ const childValue = isRecord$1(value) ? value : {};
59448
+ const childRequired = Array.isArray(node["required"]) ? node["required"].filter((k) => typeof k === "string") : [];
59449
+ return /* @__PURE__ */ jsxs("fieldset", {
59450
+ className: "space-y-3 rounded-lg border border-border-subtle p-3",
59451
+ children: [/* @__PURE__ */ jsx("legend", {
59452
+ className: "px-1 text-xs font-medium text-foreground-muted",
59453
+ children: label
59454
+ }), Object.entries(properties).map(([key, childNode]) => isRecord$1(childNode) ? /* @__PURE__ */ jsx(SchemaField, {
59455
+ path: `${path}.${key}`,
59456
+ name: key,
59457
+ node: childNode,
59458
+ value: childValue[key],
59459
+ secretPaths,
59460
+ required: childRequired.includes(key),
59461
+ disabled,
59462
+ onPatch
59463
+ }, key) : null)]
59464
+ });
59465
+ }
59466
+ const jsonText = isRecord$1(value) ? JSON.stringify(value, null, 2) : "{}";
59467
+ return /* @__PURE__ */ jsx(FormField$1, {
59468
+ label,
59469
+ required,
59470
+ description: "JSON object",
59471
+ children: /* @__PURE__ */ jsx("textarea", {
59472
+ className: cn("min-h-[8rem] w-full resize-y rounded-md border border-border bg-surface px-2.5 py-2 font-mono text-xs text-foreground", "placeholder:text-foreground-subtle focus:outline-none focus:ring-1 focus:ring-inset focus:ring-primary", "disabled:cursor-not-allowed disabled:opacity-50"),
59473
+ rows: 6,
59474
+ defaultValue: jsonText,
59475
+ disabled,
59476
+ onBlur: (e) => {
59477
+ const parsed = objectFromJson(e.target.value);
59478
+ if (parsed !== null) onPatch(path, parsed);
59479
+ }
59480
+ })
59481
+ });
59482
+ }
59483
+ if (type === "string" || type === void 0) return /* @__PURE__ */ jsx(FormField$1, {
59484
+ label,
59485
+ required,
59486
+ children: /* @__PURE__ */ jsx(Input, {
59487
+ value: readString(value),
59488
+ onChange: (e) => onPatch(path, e.target.value),
59489
+ disabled
59490
+ })
59491
+ });
59492
+ return null;
59493
+ }
59494
+ function setAtPath(root, path, next) {
59495
+ const parts = path.split(".");
59496
+ if (parts.length === 1) return {
59497
+ ...root,
59498
+ [parts[0]]: next
59499
+ };
59500
+ const [head, ...rest] = parts;
59501
+ const key = head;
59502
+ const child = isRecord$1(root[key]) ? root[key] : {};
59503
+ return {
59504
+ ...root,
59505
+ [key]: setAtPath(child, rest.join("."), next)
59506
+ };
59507
+ }
59508
+ /** Renders an entry body from the engine's JSON Schema descriptor. */
59509
+ function EntryJsonSchemaForm({ schema, secretPaths, value, onChange, disabled }) {
59510
+ const properties = schema["properties"];
59511
+ if (!isRecord$1(properties)) return null;
59512
+ const required = Array.isArray(schema["required"]) ? schema["required"].filter((k) => typeof k === "string") : [];
59513
+ const onPatch = (path, next) => {
59514
+ onChange(setAtPath(value, path, next));
59515
+ };
59516
+ return /* @__PURE__ */ jsx("div", {
59517
+ className: "space-y-3",
59518
+ children: Object.entries(properties).map(([key, node]) => isRecord$1(node) ? /* @__PURE__ */ jsx(SchemaField, {
59519
+ path: key,
59520
+ name: key,
59521
+ node,
59522
+ value: value[key],
59523
+ secretPaths,
59524
+ required: required.includes(key),
59525
+ disabled,
59526
+ onPatch
59527
+ }, key) : null)
59528
+ });
59529
+ }
59530
+ //#endregion
59531
+ //#region src/composites/record-entries/record-entries-panel.tsx
59532
+ function isRecord(value) {
59533
+ return typeof value === "object" && value !== null && !Array.isArray(value);
59534
+ }
59535
+ function defaultBody(schema) {
59536
+ const properties = schema["properties"];
59537
+ if (!isRecord(properties)) return {};
59538
+ const out = {};
59539
+ for (const [key, node] of Object.entries(properties)) {
59540
+ if (!isRecord(node)) continue;
59541
+ if (node["default"] !== void 0) {
59542
+ out[key] = node["default"];
59543
+ continue;
59544
+ }
59545
+ if (node["type"] === "boolean") out[key] = false;
59546
+ else if (node["type"] === "object") out[key] = {};
59547
+ }
59548
+ return out;
59549
+ }
59550
+ function RecordEntriesPanel({ kind }) {
59551
+ const t = useUiText();
59552
+ const queryClient = useQueryClient();
59553
+ const confirm = useConfirm();
59554
+ const formUrl = useItemFormUrl({
59555
+ newKey: "entryNew",
59556
+ editKey: "entryEdit"
59557
+ });
59558
+ const listQuery = useRecordEntriesListEntries({
59559
+ owner: kind.owner,
59560
+ kind: kind.kind
59561
+ }, { staleTime: 15e3 });
59562
+ const putMutation = useRecordEntriesPutEntry({ onSuccess: async () => {
59563
+ await queryClient.invalidateQueries({ queryKey: [["recordEntries"]] });
59564
+ formUrl.close();
59565
+ } });
59566
+ const deleteMutation = useRecordEntriesDeleteEntry({ onSuccess: async () => {
59567
+ await queryClient.invalidateQueries({ queryKey: [["recordEntries"]] });
59568
+ } });
59569
+ const entries = listQuery.data?.entries ?? [];
59570
+ const editing = useMemo(() => {
59571
+ const st = formUrl.state;
59572
+ if (st.mode !== "edit") return null;
59573
+ return entries.find((e) => e.id === st.id) ?? null;
59574
+ }, [entries, formUrl.state]);
59575
+ const [draft, setDraft] = useState({});
59576
+ const [saveError, setSaveError] = useState(null);
59577
+ const openNew = useCallback(() => {
59578
+ setDraft(defaultBody(kind.fields));
59579
+ setSaveError(null);
59580
+ formUrl.openNew();
59581
+ }, [formUrl, kind.fields]);
59582
+ const openEdit = useCallback((entry) => {
59583
+ setDraft({ ...entry.data });
59584
+ setSaveError(null);
59585
+ formUrl.openEdit(entry.id);
59586
+ }, [formUrl]);
59587
+ const onDelete = useCallback(async (entry) => {
59588
+ if (!await confirm({
59589
+ title: t("uiLibrary.recordEntries.deleteTitle", "Delete entry"),
59590
+ message: t("uiLibrary.recordEntries.deleteDescription", "Remove \"{{name}}\" permanently?", { name: entry.name }),
59591
+ confirmLabel: t("uiLibrary.recordEntries.deleteConfirm", "Delete"),
59592
+ variant: "danger"
59593
+ })) return;
59594
+ await deleteMutation.mutateAsync({
59595
+ owner: kind.owner,
59596
+ kind: kind.kind,
59597
+ id: entry.id
59598
+ });
59599
+ }, [
59600
+ confirm,
59601
+ deleteMutation,
59602
+ kind.kind,
59603
+ kind.owner,
59604
+ t
59605
+ ]);
59606
+ const columns = useMemo(() => {
59607
+ return [
59608
+ {
59609
+ key: "name",
59610
+ header: t("uiLibrary.recordEntries.colName", "Name"),
59611
+ render: (row) => /* @__PURE__ */ jsx(Button, {
59612
+ type: "button",
59613
+ variant: "ghost",
59614
+ size: "sm",
59615
+ className: "h-auto max-w-full justify-start px-0 py-0 font-medium hover:underline",
59616
+ onClick: () => openEdit(row),
59617
+ children: /* @__PURE__ */ jsx("span", {
59618
+ className: "truncate",
59619
+ children: row.name
59620
+ })
59621
+ })
59622
+ },
59623
+ {
59624
+ key: "updated",
59625
+ header: t("uiLibrary.recordEntries.colUpdated", "Updated"),
59626
+ nowrap: true,
59627
+ render: (row) => /* @__PURE__ */ jsx("span", {
59628
+ className: "text-[11px] text-foreground-subtle",
59629
+ children: new Date(row.updatedAt).toLocaleString()
59630
+ })
59631
+ },
59632
+ {
59633
+ key: "actions",
59634
+ header: "",
59635
+ align: "right",
59636
+ nowrap: true,
59637
+ render: (row) => /* @__PURE__ */ jsxs("span", {
59638
+ className: "flex justify-end gap-1",
59639
+ children: [/* @__PURE__ */ jsx(Button, {
59640
+ size: "sm",
59641
+ variant: "ghost",
59642
+ type: "button",
59643
+ onClick: () => openEdit(row),
59644
+ children: /* @__PURE__ */ jsx(Pencil, { className: "h-3.5 w-3.5" })
59645
+ }), /* @__PURE__ */ jsx(Button, {
59646
+ size: "sm",
59647
+ variant: "ghost",
59648
+ type: "button",
59649
+ onClick: () => void onDelete(row),
59650
+ children: /* @__PURE__ */ jsx(Trash2, { className: "h-3.5 w-3.5 text-danger" })
59651
+ })]
59652
+ })
59653
+ }
59654
+ ];
59655
+ }, [
59656
+ onDelete,
59657
+ openEdit,
59658
+ t
59659
+ ]);
59660
+ const dialogOpen = formUrl.state.mode !== "closed";
59661
+ const dialogTitle = formUrl.state.mode === "new" ? t("uiLibrary.recordEntries.addTitle", "Add entry") : t("uiLibrary.recordEntries.editTitle", "Edit entry");
59662
+ const onSave = async () => {
59663
+ setSaveError(null);
59664
+ try {
59665
+ if (formUrl.state.mode === "new") await putMutation.mutateAsync({
59666
+ owner: kind.owner,
59667
+ kind: kind.kind,
59668
+ data: draft
59669
+ });
59670
+ else if (formUrl.state.mode === "edit" && editing !== null) await putMutation.mutateAsync({
59671
+ owner: kind.owner,
59672
+ kind: kind.kind,
59673
+ id: editing.id,
59674
+ data: draft,
59675
+ ifRev: editing.rev
59676
+ });
59677
+ else {
59678
+ setSaveError(t("uiLibrary.recordEntries.saveUnavailable", "Nothing to save"));
59679
+ return;
59680
+ }
59681
+ } catch (err) {
59682
+ setSaveError(err instanceof Error ? err.message : t("uiLibrary.recordEntries.saveFailed", "Save failed"));
59683
+ }
59684
+ };
59685
+ return /* @__PURE__ */ jsxs("div", {
59686
+ className: "space-y-3",
59687
+ children: [
59688
+ /* @__PURE__ */ jsx("div", {
59689
+ className: "flex justify-end",
59690
+ children: /* @__PURE__ */ jsxs(Button, {
59691
+ type: "button",
59692
+ size: "sm",
59693
+ onClick: openNew,
59694
+ children: [/* @__PURE__ */ jsx(Plus, { className: "mr-1 h-3.5 w-3.5" }), t("uiLibrary.recordEntries.add", "Add")]
59695
+ })
59696
+ }),
59697
+ listQuery.isError && /* @__PURE__ */ jsx(ErrorBox, { message: listQuery.error instanceof Error ? listQuery.error.message : t("uiLibrary.recordEntries.loadFailed", "Could not load entries") }),
59698
+ listQuery.isPending ? /* @__PURE__ */ jsx("div", {
59699
+ className: "flex justify-center py-8 text-foreground-subtle",
59700
+ children: /* @__PURE__ */ jsx(LoaderCircle, { className: "h-5 w-5 animate-spin" })
59701
+ }) : entries.length === 0 ? /* @__PURE__ */ jsx(EmptyState, {
59702
+ title: t("uiLibrary.recordEntries.emptyTitle", "No entries yet"),
59703
+ description: t("uiLibrary.recordEntries.emptyDescription", "Add the first row for this kind.")
59704
+ }) : /* @__PURE__ */ jsx(DataTable, {
59705
+ columns,
59706
+ rows: entries,
59707
+ rowKey: (r) => r.id,
59708
+ maxBodyHeight: TABLE_SCROLL_MAX_H,
59709
+ emptyMessage: t("uiLibrary.recordEntries.emptyTitle", "No entries yet")
59710
+ }),
59711
+ /* @__PURE__ */ jsx(ItemFormDialog, {
59712
+ open: dialogOpen,
59713
+ onClose: formUrl.close,
59714
+ title: dialogTitle,
59715
+ error: saveError,
59716
+ footer: /* @__PURE__ */ jsx(Button, {
59717
+ type: "button",
59718
+ size: "sm",
59719
+ disabled: putMutation.isPending,
59720
+ onClick: () => void onSave(),
59721
+ children: putMutation.isPending ? /* @__PURE__ */ jsx(LoaderCircle, { className: "h-3.5 w-3.5 animate-spin" }) : t("uiLibrary.recordEntries.save", "Save")
59722
+ }),
59723
+ children: /* @__PURE__ */ jsx(EntryJsonSchemaForm, {
59724
+ schema: kind.fields,
59725
+ secretPaths: kind.secretPaths,
59726
+ value: draft,
59727
+ onChange: setDraft,
59728
+ disabled: putMutation.isPending
59729
+ })
59730
+ })
59731
+ ]
59732
+ });
59733
+ }
59734
+ //#endregion
59735
+ //#region src/composites/record-entries/record-entries-hub.tsx
59736
+ var RECORD_ENTRY_OWNER_PARAM = "entryOwner";
59737
+ var RECORD_ENTRY_KIND_PARAM = "entryKind";
59738
+ function kindKey$1(k) {
59739
+ return `${k.owner}/${k.kind}`;
59740
+ }
59741
+ function RecordEntriesHub({ filter }) {
59742
+ const t = useUiText();
59743
+ const kindsQuery = useRecordEntriesListEntryKinds({}, { staleTime: 3e4 });
59744
+ const [ownerParam, setOwner] = useUrlQueryParam(RECORD_ENTRY_OWNER_PARAM);
59745
+ const [kindParam, setKind] = useUrlQueryParam(RECORD_ENTRY_KIND_PARAM);
59746
+ const kinds = useMemo(() => {
59747
+ return (kindsQuery.data?.kinds ?? []).filter((k) => {
59748
+ if (filter?.owner !== void 0 && k.owner !== filter.owner) return false;
59749
+ if (filter?.kind !== void 0 && k.kind !== filter.kind) return false;
59750
+ return true;
59751
+ });
59752
+ }, [
59753
+ filter?.kind,
59754
+ filter?.owner,
59755
+ kindsQuery.data?.kinds
59756
+ ]);
59757
+ const active = useMemo(() => {
59758
+ if (kinds.length === 0) return null;
59759
+ return kinds.find((k) => k.owner === ownerParam && k.kind === kindParam) ?? kinds[0] ?? null;
59760
+ }, [
59761
+ kindParam,
59762
+ kinds,
59763
+ ownerParam
59764
+ ]);
59765
+ const selectKind = (k) => {
59766
+ setOwner(k.owner);
59767
+ setKind(k.kind);
59768
+ };
59769
+ if (kindsQuery.isError) return /* @__PURE__ */ jsx(ErrorBox, { message: kindsQuery.error instanceof Error ? kindsQuery.error.message : t("uiLibrary.recordEntries.kindsFailed", "Could not load entry kinds") });
59770
+ if (kindsQuery.isPending) return /* @__PURE__ */ jsx("div", {
59771
+ className: "flex justify-center py-10 text-foreground-subtle",
59772
+ children: /* @__PURE__ */ jsx(LoaderCircle, { className: "h-5 w-5 animate-spin" })
59773
+ });
59774
+ if (kinds.length === 0) return /* @__PURE__ */ jsx(EmptyState, {
59775
+ title: t("uiLibrary.recordEntries.noKindsTitle", "No entry kinds"),
59776
+ description: t("uiLibrary.recordEntries.noKindsDescription", "No addon has declared an entry record kind yet.")
59777
+ });
59778
+ const activeKey = active === null ? "" : kindKey$1(active);
59779
+ return /* @__PURE__ */ jsxs("div", {
59780
+ className: "space-y-4",
59781
+ children: [kinds.length > 1 && /* @__PURE__ */ jsx(Tabs, {
59782
+ appearance: "pills",
59783
+ value: activeKey,
59784
+ onValueChange: (key) => {
59785
+ const found = kinds.find((k) => kindKey$1(k) === key);
59786
+ if (found !== void 0) selectKind(found);
59787
+ },
59788
+ children: /* @__PURE__ */ jsx(TabsList, {
59789
+ className: "flex flex-wrap gap-1",
59790
+ children: kinds.map((k) => /* @__PURE__ */ jsxs(TabsTrigger, {
59791
+ value: kindKey$1(k),
59792
+ children: [k.title, k.rows > 0 ? ` (${k.rows})` : ""]
59793
+ }, kindKey$1(k)))
59794
+ })
59795
+ }), active !== null && /* @__PURE__ */ jsxs("div", { children: [kinds.length === 1 && /* @__PURE__ */ jsx("h3", {
59796
+ className: "mb-2 text-sm font-semibold text-foreground",
59797
+ children: active.title
59798
+ }), /* @__PURE__ */ jsx(RecordEntriesPanel, { kind: active })] })]
59799
+ });
59800
+ }
59801
+ //#endregion
59802
+ //#region src/composites/storage-records/storage-records-panel.tsx
59803
+ function StorageRecordsPanel({ kind }) {
59804
+ const t = useUiText();
59805
+ const [inspect, setInspect] = useState(null);
59806
+ const recordsQuery = trpc.storageAdmin.readRecords.useQuery({
59807
+ owner: kind.owner,
59808
+ kind: kind.kind,
59809
+ limit: 100,
59810
+ desc: true
59811
+ }, { staleTime: 15e3 });
59812
+ const records = recordsQuery.data?.records ?? [];
59813
+ const columns = useMemo(() => {
59814
+ return [
59815
+ {
59816
+ key: "id",
59817
+ header: t("uiLibrary.storageRecords.colId", "Id"),
59818
+ render: (row) => /* @__PURE__ */ jsx(Button, {
59819
+ type: "button",
59820
+ variant: "ghost",
59821
+ size: "sm",
59822
+ className: "h-auto max-w-full justify-start px-0 py-0 font-mono text-xs hover:underline",
59823
+ onClick: () => setInspect(row),
59824
+ children: /* @__PURE__ */ jsx("span", {
59825
+ className: "truncate",
59826
+ children: row.id
59827
+ })
59828
+ })
59829
+ },
59830
+ {
59831
+ key: "deviceId",
59832
+ header: t("uiLibrary.storageRecords.colDevice", "Device"),
59833
+ nowrap: true,
59834
+ render: (row) => row.deviceId === null ? /* @__PURE__ */ jsx("span", {
59835
+ className: "text-foreground-subtle",
59836
+ children: "—"
59837
+ }) : /* @__PURE__ */ jsx("span", {
59838
+ className: "font-mono text-xs",
59839
+ children: row.deviceId
59840
+ })
59841
+ },
59842
+ {
59843
+ key: "at",
59844
+ header: t("uiLibrary.storageRecords.colAt", "At"),
59845
+ nowrap: true,
59846
+ render: (row) => /* @__PURE__ */ jsx("span", {
59847
+ className: "text-[11px] text-foreground-subtle",
59848
+ children: row.at === null ? "—" : new Date(row.at).toLocaleString()
59849
+ })
59850
+ },
59851
+ {
59852
+ key: "updatedAt",
59853
+ header: t("uiLibrary.storageRecords.colUpdated", "Updated"),
59854
+ nowrap: true,
59855
+ render: (row) => /* @__PURE__ */ jsx("span", {
59856
+ className: "text-[11px] text-foreground-subtle",
59857
+ children: new Date(row.updatedAt).toLocaleString()
59858
+ })
59859
+ }
59860
+ ];
59861
+ }, [t]);
59862
+ return /* @__PURE__ */ jsxs("div", {
59863
+ className: "space-y-3",
59864
+ children: [
59865
+ /* @__PURE__ */ jsxs("div", {
59866
+ className: "flex flex-wrap items-center gap-2",
59867
+ children: [
59868
+ /* @__PURE__ */ jsx("h3", {
59869
+ className: "text-sm font-semibold text-foreground",
59870
+ children: `${kind.owner}/${kind.kind}`
59871
+ }),
59872
+ /* @__PURE__ */ jsx(Badge, {
59873
+ variant: "neutral",
59874
+ style: "outline",
59875
+ children: kind.database
59876
+ }),
59877
+ /* @__PURE__ */ jsx(Badge, {
59878
+ variant: "neutral",
59879
+ style: "outline",
59880
+ children: kind.class
59881
+ }),
59882
+ /* @__PURE__ */ jsx(Badge, {
59883
+ variant: kind.state === "declared" ? "default" : "neutral",
59884
+ children: kind.state
59885
+ }),
59886
+ kind.entry ? /* @__PURE__ */ jsx(Badge, {
59887
+ variant: "info",
59888
+ children: t("uiLibrary.storageRecords.entryKind", "Entry")
59889
+ }) : null
59890
+ ]
59891
+ }),
59892
+ recordsQuery.isError ? /* @__PURE__ */ jsx(ErrorBox, { message: recordsQuery.error instanceof Error ? recordsQuery.error.message : t("uiLibrary.storageRecords.loadFailed", "Could not load records") }) : recordsQuery.isPending ? /* @__PURE__ */ jsx("div", {
59893
+ className: "flex justify-center py-8 text-foreground-subtle",
59894
+ children: /* @__PURE__ */ jsx(LoaderCircle, { className: "h-5 w-5 animate-spin" })
59895
+ }) : records.length === 0 ? /* @__PURE__ */ jsx(EmptyState, {
59896
+ title: t("uiLibrary.storageRecords.emptyTitle", "No rows"),
59897
+ description: t("uiLibrary.storageRecords.emptyDescription", "This kind has no stored records yet.")
59898
+ }) : /* @__PURE__ */ jsx(DataTable, {
59899
+ columns,
59900
+ rows: records,
59901
+ rowKey: (r) => r.id,
59902
+ maxBodyHeight: TABLE_SCROLL_MAX_H,
59903
+ emptyMessage: t("uiLibrary.storageRecords.emptyTitle", "No rows")
59904
+ }),
59905
+ /* @__PURE__ */ jsx(Dialog, {
59906
+ open: inspect !== null,
59907
+ onOpenChange: (open) => !open && setInspect(null),
59908
+ children: /* @__PURE__ */ jsxs(DialogContent, {
59909
+ width: "lg",
59910
+ placement: "sheet-on-mobile",
59911
+ scroll: "body",
59912
+ children: [/* @__PURE__ */ jsxs(DialogHeader, { children: [/* @__PURE__ */ jsx(DialogTitle, { children: t("uiLibrary.storageRecords.inspectTitle", "Record") }), inspect !== null ? /* @__PURE__ */ jsx(DialogDescription, {
59913
+ className: "font-mono",
59914
+ children: inspect.id
59915
+ }) : null] }), /* @__PURE__ */ jsx(DialogBody, { children: inspect !== null ? /* @__PURE__ */ jsx(CodeBlock, {
59916
+ maxHeight: 480,
59917
+ children: JSON.stringify(inspect, null, 2)
59918
+ }) : null })]
59919
+ })
59920
+ })
59921
+ ]
59922
+ });
59923
+ }
59924
+ //#endregion
59925
+ //#region src/composites/storage-records/storage-records-hub.tsx
59926
+ var STORAGE_RECORDS_OWNER_PARAM = "recordsOwner";
59927
+ var STORAGE_RECORDS_KIND_PARAM = "recordsKind";
59928
+ function kindKey(k) {
59929
+ return `${k.owner}/${k.kind}`;
59930
+ }
59931
+ function formatBytes(n) {
59932
+ if (n === null) return "—";
59933
+ if (n < 1024) return `${n} B`;
59934
+ if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KiB`;
59935
+ return `${(n / (1024 * 1024)).toFixed(1)} MiB`;
59936
+ }
59937
+ function StorageRecordsHub() {
59938
+ const t = useUiText();
59939
+ const kindsQuery = trpc.storageAdmin.listKinds.useQuery({}, { staleTime: 3e4 });
59940
+ const [ownerParam, setOwner] = useUrlQueryParam(STORAGE_RECORDS_OWNER_PARAM);
59941
+ const [kindParam, setKind] = useUrlQueryParam(STORAGE_RECORDS_KIND_PARAM);
59942
+ const kinds = kindsQuery.data?.kinds ?? [];
59943
+ const filter = useDataTableFilter(kinds, {
59944
+ searchText: (row) => [
59945
+ row.owner,
59946
+ row.kind,
59947
+ row.class,
59948
+ row.database,
59949
+ row.state
59950
+ ],
59951
+ facetGroups: [{
59952
+ id: "owner",
59953
+ value: (row) => row.owner
59954
+ }, {
59955
+ id: "database",
59956
+ value: (row) => row.database
59957
+ }]
59958
+ });
59959
+ const active = useMemo(() => {
59960
+ if (kinds.length === 0) return null;
59961
+ return kinds.find((k) => k.owner === ownerParam && k.kind === kindParam) ?? null;
59962
+ }, [
59963
+ kindParam,
59964
+ kinds,
59965
+ ownerParam
59966
+ ]);
59967
+ const selectKind = useCallback((k) => {
59968
+ setOwner(k.owner);
59969
+ setKind(k.kind);
59970
+ }, [setKind, setOwner]);
59971
+ const columns = useMemo(() => {
59972
+ return [
59973
+ {
59974
+ key: "kind",
59975
+ header: t("uiLibrary.storageRecords.colKind", "Kind"),
59976
+ render: (row) => /* @__PURE__ */ jsxs("span", {
59977
+ className: "font-mono text-xs",
59978
+ children: [
59979
+ row.owner,
59980
+ "/",
59981
+ row.kind
59982
+ ]
59983
+ }),
59984
+ sortValue: (row) => kindKey(row)
59985
+ },
59986
+ {
59987
+ key: "database",
59988
+ header: t("uiLibrary.storageRecords.colDatabase", "DB"),
59989
+ nowrap: true,
59990
+ render: (row) => /* @__PURE__ */ jsx(Badge, {
59991
+ variant: "neutral",
59992
+ style: "outline",
59993
+ children: row.database
59994
+ }),
59995
+ sortValue: (row) => row.database
59996
+ },
59997
+ {
59998
+ key: "class",
59999
+ header: t("uiLibrary.storageRecords.colClass", "Class"),
60000
+ nowrap: true,
60001
+ render: (row) => /* @__PURE__ */ jsx("span", {
60002
+ className: "text-xs text-foreground-muted",
60003
+ children: row.class
60004
+ }),
60005
+ sortValue: (row) => row.class
60006
+ },
60007
+ {
60008
+ key: "state",
60009
+ header: t("uiLibrary.storageRecords.colState", "State"),
60010
+ nowrap: true,
60011
+ render: (row) => /* @__PURE__ */ jsx(Badge, {
60012
+ variant: row.state === "declared" ? "default" : "neutral",
60013
+ children: row.state
60014
+ }),
60015
+ sortValue: (row) => row.state
60016
+ },
60017
+ {
60018
+ key: "rows",
60019
+ header: t("uiLibrary.storageRecords.colRows", "Rows"),
60020
+ align: "right",
60021
+ nowrap: true,
60022
+ render: (row) => /* @__PURE__ */ jsx("span", {
60023
+ className: "font-mono text-xs tabular-nums",
60024
+ children: row.rows === null ? "—" : row.rows
60025
+ }),
60026
+ sortValue: (row) => row.rows ?? -1
60027
+ },
60028
+ {
60029
+ key: "bytes",
60030
+ header: t("uiLibrary.storageRecords.colSize", "Est. size"),
60031
+ align: "right",
60032
+ nowrap: true,
60033
+ render: (row) => /* @__PURE__ */ jsx("span", {
60034
+ className: "text-xs text-foreground-subtle",
60035
+ children: formatBytes(row.bytesEstimate)
60036
+ }),
60037
+ sortValue: (row) => row.bytesEstimate ?? -1
60038
+ },
60039
+ {
60040
+ key: "inspect",
60041
+ header: "",
60042
+ align: "right",
60043
+ nowrap: true,
60044
+ render: (row) => {
60045
+ return /* @__PURE__ */ jsx(Button, {
60046
+ type: "button",
60047
+ size: "sm",
60048
+ variant: active !== null && kindKey(active) === kindKey(row) ? "primary" : "outline",
60049
+ onClick: () => selectKind(row),
60050
+ children: t("uiLibrary.storageRecords.viewRows", "View rows")
60051
+ });
60052
+ },
60053
+ notSortableReason: t("uiLibrary.storageRecords.actionColumn", "Actions")
60054
+ }
60055
+ ];
60056
+ }, [
60057
+ active,
60058
+ selectKind,
60059
+ t
60060
+ ]);
60061
+ if (kindsQuery.isError) return /* @__PURE__ */ jsx(ErrorBox, { message: kindsQuery.error instanceof Error ? kindsQuery.error.message : t("uiLibrary.storageRecords.kindsFailed", "Could not load record kinds") });
60062
+ if (kindsQuery.isPending) return /* @__PURE__ */ jsx("div", {
60063
+ className: "flex justify-center py-10 text-foreground-subtle",
60064
+ children: /* @__PURE__ */ jsx(LoaderCircle, { className: "h-5 w-5 animate-spin" })
60065
+ });
60066
+ if (kinds.length === 0) return /* @__PURE__ */ jsx(EmptyState, {
60067
+ title: t("uiLibrary.storageRecords.noKindsTitle", "No record kinds"),
60068
+ description: t("uiLibrary.storageRecords.noKindsDescription", "No addon has declared a record kind on this hub yet.")
60069
+ });
60070
+ return /* @__PURE__ */ jsxs("div", {
60071
+ className: "space-y-4",
60072
+ children: [
60073
+ /* @__PURE__ */ jsx(DataTableFilterBar, {
60074
+ state: filter.state,
60075
+ facets: filter.facets,
60076
+ groups: filter.groups.map((g) => ({
60077
+ ...g,
60078
+ label: g.id === "owner" ? t("uiLibrary.storageRecords.facetOwner", "Owner") : t("uiLibrary.storageRecords.facetDatabase", "Database")
60079
+ })),
60080
+ labels: {
60081
+ searchPlaceholder: t("uiLibrary.storageRecords.search", "Search kinds…"),
60082
+ searchLabel: t("uiLibrary.storageRecords.searchLabel", "Search record kinds"),
60083
+ facetsLabel: t("uiLibrary.storageRecords.facetsLabel", "Filter record kinds"),
60084
+ clearLabel: t("uiLibrary.storageRecords.clearFilters", "Clear filters")
60085
+ },
60086
+ onSearch: filter.setSearch,
60087
+ onToggleFacet: filter.toggleFacet,
60088
+ onToggleGroupFacet: filter.toggleGroupFacet,
60089
+ onClear: filter.clear
60090
+ }),
60091
+ /* @__PURE__ */ jsx(DataTable, {
60092
+ columns,
60093
+ rows: filter.rows,
60094
+ rowKey: (k) => kindKey(k),
60095
+ maxBodyHeight: TABLE_SCROLL_MAX_H,
60096
+ defaultSort: {
60097
+ columnKey: "kind",
60098
+ dir: "asc"
60099
+ },
60100
+ emptyMessage: t("uiLibrary.storageRecords.noMatch", "No kinds match the filter")
60101
+ }),
60102
+ active !== null ? /* @__PURE__ */ jsx(StorageRecordsPanel, { kind: active }) : null
60103
+ ]
60104
+ });
60105
+ }
60106
+ //#endregion
58662
60107
  //#region src/composites/response-log.tsx
58663
60108
  /**
58664
60109
  * Expandable log box showing the raw JSON response from a pipeline run.
@@ -62931,12 +64376,12 @@ function mirror(input, t = defaultUiText) {
62931
64376
  * Render inside `<Suspense>` at all call sites. */
62932
64377
  var MaskShapeCanvas = lazy(() => import("./MaskShapeCanvas-C9cJlxvG.js").then((m) => ({ default: m.MaskShapeCanvas })));
62933
64378
  /** Lazy-wrapped `MotionZonesSettings` — code-split off the main bundle. */
62934
- var MotionZonesSettings = lazy(() => import("./MotionZonesSettings-Bv8XzCa3.js").then((m) => ({ default: m.MotionZonesSettings })));
64379
+ var MotionZonesSettings = lazy(() => import("./MotionZonesSettings-C3Tj12yc.js").then((m) => ({ default: m.MotionZonesSettings })));
62935
64380
  /** Lazy-wrapped `SceneMonitorEditor` — code-split off the main bundle for the
62936
64381
  * same reason: it mounts `MaskShapeCanvas`, which chains react-konva. Render
62937
64382
  * inside `<Suspense>`; the admin-ui `/scenes` dialog is its only caller. */
62938
- var SceneMonitorEditor = lazy(() => import("./SceneMonitorEditor-i3-nXAEU.js").then((m) => ({ default: m.SceneMonitorEditor })));
64383
+ var SceneMonitorEditor = lazy(() => import("./SceneMonitorEditor-30H29vN4.js").then((m) => ({ default: m.SceneMonitorEditor })));
62939
64384
  /** Lazy-wrapped `PrivacyMaskSettings` — code-split off the main bundle. */
62940
- var PrivacyMaskSettings = lazy(() => import("./PrivacyMaskSettings-BlkbESYj.js").then((m) => ({ default: m.PrivacyMaskSettings })));
64385
+ var PrivacyMaskSettings = lazy(() => import("./PrivacyMaskSettings-C9wfHkiB.js").then((m) => ({ default: m.PrivacyMaskSettings })));
62941
64386
  //#endregion
62942
- export { ShieldCheck as $, CircleX as $n, List as $t, TrainFront as A, AddProviderEntryDialog, AddonGlobalSettingsForm, AdminLinkQuickAction, AgentStepEditor, AlarmHeroCard, AlarmInlineControl as AlarmPanelInlineControl, Eye as An, AppShell, Battery as Ar, ArcKnob, Package as At, AudioClassificationList, AudioLevelWaveform, AudioWaveform, AutomationHeroCard, AutomationInlineControl, AutotrackSection, Star as B, BTN_COMPACT, BTN_COMPACT_DANGER, BTN_COMPACT_PRIMARY, BTN_COMPACT_WARNING, BackToStepsButton, Badge, BatteryBadge, Database as Bn, BottomSheet, ArrowRight as Br, Breadcrumb, BrightnessPanel, Minus as Bt, Button, ButtonControl, ButtonHeroCard, Undo2 as C, CENTER, CHIP_ACTIVE, CHIP_BASE, CHIP_INACTIVE, CLASS_COLORS, COLUMN_BREAKPOINT_CLASS, COLUMN_PRIORITY, COMMIT_DEDUPE_TOLERANCE_MS, COMMIT_DEDUPE_WINDOW_MS, CONTROL_CAP_NAMES, CONTROL_FILLS, CameraStreamPlayer, Card, Checkbox, ChildSectionAccordion, ClimatePanel, FlaskConical as Cn, CodeBlock, CollapsibleCard, ConfigFormBuilder, FormField as ConfigFormField, ConfigNotificationTargetMultiSelectFieldView, ConfigNotificationTargetSelectFieldView, ConfigSchemaField, ConfirmActionButton, ConfirmDialogProvider, ConsumablesPanel, ContainerChildrenProvider, ContainerPrimaryHero, ControlColumn, ControlHeroCard, ControlInlineControl, ControlPanel, CopyButton, CoverHeroCard, CoverInlineControl, CoverPanel, Bot as Cr, Plane as Ct, CustomFieldRenderersProvider, TrendingDown as D, DEFAULT_COLOR, DEFAULT_PAGINATION_LABELS, DEVICE_COLUMNS, DEVICE_EXPORT_PAGE_SIZE_KEY, DEVICE_LIST_PAGE_SIZE_KEY, DEVICE_LIST_PAGE_SIZE_OPTIONS, DEVICE_PICKER_GROUP_STORAGE_KEY, DEVICE_ROLE_META, DEVICE_TYPE_CONTROL, DEVICE_TYPE_META, DataTable, DataTableFilterBar, DataTablePager, DetectionCanvas, DetectionOverlay, DetectionResultTree, DevShell, DeviceActivityPanel, DeviceBatchToolbar, DeviceCard, DeviceContextProvider, DeviceExportPanel, DeviceExportSetup, DeviceFilterBar, DeviceGrid, DeviceItem, DeviceList, DeviceMultiSelectField, DevicePicker, DeviceQuickDetailProvider, DeviceSelectField, DeviceSelectorPicker, DeviceStepMatrix, DevicesFailedLine, DevicesLoadingLine, DevicesWidenWarning, Dialog, DialogBody, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, DiscoveryPanel, Film as Dn, DoorbellRecentPanel, Bike as Dr, Dropdown, DropdownContent, DropdownItem, DropdownTrigger, Pencil as Dt, DummyHeroCard, DummyInline, TriangleAlert as E, EMPTY_DATA_TABLE_FILTER, EVENT_KIND_ICONS, EmptyState, Flame as En, EndpointResultsCard, EndpointTestCard, Bird as Er, ErrorBox, Phone as Et, EventKindGlyph, EventStream, ExtensionsPanel, Target as F, FAST_ICON_GLYPHS, FILL, FLEET_LIST_GC_TIME_MS, FLEET_LIST_QUERY_KEY, FLEET_LIST_STALE_TIME_MS, FanHeroCard, FanInlineControl, FanPanel, FilterBar, FloatingEventStream, FloatingLogStream, FloatingPanel, Droplet as Fn, FormField$1 as FormField, Bath as Fr, MoveVertical as Ft, Smartphone as G, GRID_GAP, GRID_PAIRED, GRID_QUICK_STATS, GateBadge, GateControl, Cloud as Gn, AirVent as Gr, GripTrack, GroupedModelSelector, Megaphone as Gt, Sprout as H, HOST_WIDGETS, HUB_SESSION_RUN_MS, HlsVideo, Cpu as Hn, HoverZoomImage, ArrowDown as Hr, Mic as Ht, HubSessionTestCard, HumidifierHeroCard, HumidifierInlineControl, Tag as I, INPUT_COMPACT, INPUT_SHELL, IconAction, IconButton, IconPicker, ImageHeroCard, ImageInlineControl, ImageSelector, Download as In, InferenceConfigSelector, Input, Ban as Ir, MoveHorizontal as It, ItemFormDialog, SkipBack as J, CloudRain as Jn, Mail as Jt, SlidersHorizontal as K, KebabMenu, KeyValueList, CloudSun as Kn, Activity as Kr, Maximize2 as Kt, Sunrise as L, LIST_ROW, Label, LawnMowerHeroCard, LawnMowerInlineControl, LayeredSettingsForm, LightHeroCard, LightInlineControl, DoorOpen as Ln, LockHeroCard, LockInlineControl, LockPanel, LogStream, LoginForm, Baby as Lr, MousePointerClick as Lt, ToggleRight as M, MEDIA_GRID, MODE_COLOR, MaskShapeCanvas, MediaCard, MediaGrid, MediaPlayerHeroCard, MediaPlayerInlineControl, MediaPlayerPanel, ExternalLink as Mn, MobileDrawer, ModelPicker, MotionZonesSettings, BatteryMedium as Mr, Navigation as Mt, ToggleLeft as N, NAVIGATION_DRIVE_INTERVAL_MS, NODE_COLOR_IDS, NatResultCard, NavigationPanel, NetworkLinkBadge, EllipsisVertical as Nn, NodeMultiSelectField, NodePicker, NodeSelectField, NotificationTargetSelectField, NotificationTargetsField, BatteryLow as Nr, Music as Nt, TrendingUp as O, OPTION_SELECT_SEARCH_MIN_OPTIONS, OfflineBadge, Feather as On, OptionSelect, Bell as Or, PawPrint as Ot, Thermometer as P, PAGE_SIZE_ALL, PHASE_CONFIG, PICKER_CHIP_LIMIT, PICKER_DEFAULT_GROUP_BY, PICKER_GROUP_BY_MODES, PICKER_GROUP_COLLAPSE_AT, PICKER_NONE_KEY, PICKER_NOUN_PLURAL, PICKER_NO_FILTERS, PICKER_PAGE_SIZE, PICKER_SEARCH_DEBOUNCE_MS, PICKER_WINDOW, PRIORITY, PTZOverlay, PageHeader, PageShell, PageSizeSelect, Pagination, PasswordInput, PhaseIcon, PipelineBuilder, PipelineRuntimeSelector, PipelineStep, PlaceholderChipField, PlayerOverlaysProvider, Droplets as Pn, Popover, PopoverContent, PopoverRowAction, PopoverTrigger, BatteryFull as Pr, PrimaryChildPicker, PrivacyMaskSettings, ProviderBadge, ProviderEntryPills, Move as Pt, PtzPanel, ShieldOff as Q, Clapperboard as Qn, QrCode, LoaderCircle as Qt, Sun as R, RECONNECT_POLICY, RECORDED_PLAYBACK_MODES, RIGHT, ROI_AREA_WARN_FRACTION, ROLE_DESCRIPTOR, ROOT_DETECTOR_STEP_ID, RadialGauge, RecordedPlaybackProvider, RecordingPanel, ResponseLog, RetrainReviewBadge, DoorClosed as Rn, RoleDisplayDefaultsFromServer, RoleDisplayDefaultsProvider, RoleNodePill, RootModelSourceControl, RootSuppliedModelNote, ArrowUp as Rr, Moon as Rt, RunReport, Unlink2 as S, SCENE_CAPTURE_VARIANTS, SECRET_MASK_PLACEHOLDER, SECRET_REVEAL_MS, SECTION_BODY, SECTION_CARD, SECTION_HEADER, SETTING_ROW, SETTING_ROW_LABEL, SETTING_ROW_STACK_BREAKPOINT, SETTING_ROW_VALUE, SETTING_ROW_VALUE_TEXT, SNAPSHOT_MEDIA_PATH, SPLIT_PANEL_OUTER, SPLIT_PANEL_SIDE, STACK_GAP, STATE_COLOR, STEP_DOCK_WIDTH_PX, SceneMonitorEditor, ScopePicker, ScriptHeroCard, ScriptInlineControl, ScrollArea, SecretFieldControl, SecretRevealProvider, SectionCard, SectionToolbar, SectionedPage, SegmentedChoice, Select, SelectedChip, SemanticBadge, SendFrameToTrainingButton, SensorHeroCard, SensorInlineControl, SensorValueAtom, Separator, SettingRow, Sidebar, SidebarItem, Skeleton, SlideToggle, Footprints as Sn, SnapshotButton, SortHeaderButton, Box as Sr, Play as St, StableTabPanel, StatCard, StateValuesStream, StatusBadge, StepDetailDock, StepInspectorPanel, StepModelRow, StepTimings, Stepper, StreamBrokerSelector, StreamDebugOverlay, StreamPanel, Switch, SwitchHeroCard, SwitchInlineControl, SwitchPanel, SystemProvider, Truck as T, TABLE_SCROLL_MAX_H, TEXT_FIELD_LABEL, TEXT_HINT, TEXT_METRIC, TEXT_SECTION_LABEL, TEXT_VALUE, TIMEZONES, Tabs, TabsContent, TabsList, TabsTrigger, TapToggle, ThemeProvider, ThermostatHeroCard, ThermostatInlineControl, TimezoneSelector, FlashlightOff as Tn, Tooltip, TooltipContent, TooltipTrigger, Blinds as Tr, TrainingBaseModelPicker, TrainingCollectionPicker, Pin as Tt, Sparkles as U, UiTextProvider, UiTrans, Copy as Un, UnitPicker, ArrowDownToLine as Ur, MessageSquare as Ut, Square as V, VacuumHeroCard, VacuumInlineControl, ValueReadout, ValveHeroCard, ValveInlineControl, VersionBadge, Crosshair as Vn, VodPlaybackProvider, ArrowLeft as Vr, Minimize2 as Vt, Snowflake as W, WaterHeaterHeroCard, WaterHeaterInlineControl, WeatherHeroCard, WeatherInlineControl, WidgetMetricCard, WidgetPanel, WidgetRegistryProvider, WidgetSlot, Cog as Wn, AlarmSmoke as Wr, Menu as Wt, Ship as X, CloudFog as Xn, LockOpen as Xt, Siren as Y, CloudLightning as Yn, Lock as Yt, Shield as Z, Clock as Zn, ZoneEditingProvider, LocateFixed as Zt, UtensilsCrossed as _, Grid2x2 as _n, Car as _r, Puzzle as _t, Wrench as a, acceleratorLabel, acceleratorShortLabel, agentColumnKey, allDeviceTypeFilterOptions, Laugh as an, applyFleetQueryDefaults, applyPickerFilters, CircleCheck as ar, ariaSortForColumn, assignNodeColorId, ScrollText as at, UserCheck as b, badgeFor, bindsToModel, Gamepad2 as bn, Bus as br, Plug as bt, buildColorByNodeId, buildPeerConnectionConfig, buildStepTreeFromSchema, Wifi as c, catalogHasDraft, childEntityId, childListName, chipOverflow, classifyAddressScope, classifyCapability, classifySessionVerdict, clearPickerGroup, clusterRootModelIds, cn, colorIdForNode, columnsForContext, compareSrflxMappings, computePageButtons, containerChildToRef, countableDevices, coverHighlight, coverageLine, ChevronsUpDown as cr, createAddonI18n, createSharedContext, createTheme, Sailboat as ct, currentAddonLanguage, cursorFractionFor, WifiLow as d, darkColors, dataTableFacetGroups, dataTableFacets, defaultOfField, defaultSelectClusterRoots, defaultSingleClusterRoot, defaultTheme, defaultUiText, deriveDeviceKind, deriveWebrtcDebugStats, describeDeviceSelector, deviceIntegrationResolver, deviceListStateOf, deviceMatchesFilter, deviceOptionLabel, deviceRoleMeta, deviceRoleMetaOf, deviceTypeLabel, deviceTypeMeta, deviceTypeMetaOf, devicesToOptions, House as dn, dockBox, ChevronRight as dr, draftFromQuery, RotateCcw as dt, effectivePageSize, emptyDevicesWidens, emptySessionRun, ListChecks as en, ensureMfHostInit, CircleStop as er, ShieldAlert as et, eventKindLabel, WifiHigh as f, filterDataTableRows, filterDeviceOptions, filterOptions as filterOptionSelectOptions, filterPickerDevices, finalizeSessionRun, findTimezone, flattenPickerGrouping, flattenPickerRows, fleetViewOf, Hash as fn, formatControlDateTime, formatLastSeen, formatNumeric, formatSettingValue, ChevronLeft as fr, freezeVerdict, RefreshCw as ft, fuzzyMatch, Vibrate as g, getClassColor, getPhaseVisual, GripHorizontal as gn, Cast as gr, groupAgentColumns, groupChildrenByLayout, groupPickerDevices, groupPickerDevicesBy, QrCode$1 as gt, Volume2 as h, hardwareLabel, Hammer as hn, Cat as hr, Radar as ht, hubOrigin, hubPath, hubUrl, hubWsUrl, humanDuration, humidifierTint, X as i, iconGlyphsFailed, iconGlyphsLoaded, LayoutGrid as in, initialScrubState, insertAtSelection, CircleDot as ir, isAbsentProvider, isDataTableFilterActive, isFieldVisible, isGroupExpanded, isKeychainFieldValue, isValueField, Search as it, Tractor as j, EyeOff as jn, BatteryWarning as jr, Network as jt, Trash2 as k, Fan as kn, BellRing as kr, Pause as kt, WifiZero as l, lawnMowerActivityMeta, lightColors, Image as ln, loadIconGlyphs, loadRemoteBundle, ChevronsDownUp as lr, Route as lt, lucideExportName, VolumeX as m, makeScrubBridge, mapRootDetectorPlacements, metadataEntries, metadataString, mirror, Hand as mn, mountAddonPage, mountPath, Check as mr, RadioTower as mt, ZoomIn as n, nextGridPosition, nextReconnectAction, nextSort, nextSortDirection, nextTableSort, Lightbulb as nn, nodeColorClass, nodeSoftBgClass, nodeTextColorClass, normalizeForSearch, normalizeLanguage, CirclePlus as nr, Settings as nt, Workflow as o, offListSelections, Info as on, openTopLayer, optionSearchText as optionSelectSearchText, CircleCheckBig as or, orphanDeviceLabel, Scan as ot, overrideEntityIdFromLink, Waves as p, pageRows, pageSizeLabel, paginateRows, parentDetailOf, parseIceCandidate, parsePickerGroupBy, parseRecordedServerMessage, partitionSelected as partitionOptionSelectSelected, partitionSuggested, pickerFacetFilterShown, pickerFacetKey, pickerFacetOptions, pickerFiltersActive, pickerGroupKey, pickerHiddenSelectedCount, pickerLocationKey, pickerQueryTokens, pickerRowFacts, pickerSearchText, pickerZoneFilterSuspended, pinnedStreamChoices, placePopover, HardDrive as pn, ChevronDown as pr, providerIcons, Radio as pt, SkipForward as q, CloudSnow as qn, MapPin as qt, Zap as r, readStoredGroupBy, reduceSessionRun, registerAddonBundle, renderMarkup, renderTagged, resetHubMountForTests, resetPickerFilters, resolveContainerPrimary, resolveControlAlign, resolveDeviceControl, resolveDeviceIntegration, resolveDisplayIcon, resolveEffectiveDefaultModel, resolveEffectiveStepModel, resolveEventKindIcon, resolveSearchable as resolveOptionSelectSearchable, resolveParentNames, resolvePrimaryChild, resolveSelectedDevices, resolveSensorDisplay, resolveStepDefaultModel, retrainReviewBadgeLook, Leaf as rn, roiTooLarge, rootSourceState, routerBasename, CirclePause as rr, Server as rt, Wind as s, sameLocationSuggestions, scrubReducer, searchSteps, secretSubmitValue, selectPickerGroup, selectedDeviceOptions, serializeRecordedCommand, settingsModelIdFor, shouldCommit, shouldEmit, shouldShowAddNewFooter, shouldShowUseQueryRow, shouldUseSingleNode, showsNoCamerasHint, Inbox as sn, sortRows, sortRowsByColumn, CircleAlert as sr, Save as st, statusIcons, statusLine, stepFieldDomId, stepHasModelForFormat, stepLocalFields, stepModelOptions, stripParentNamePrefix, summarizeHubCandidates, ZoomOut as t, tabForSelector, tankAlert, themeToCss, themeToRootCss, Link2 as tn, toStationaryOverlayBox, toggleDataTableFacet, toggleDataTableGroupFacet, togglePickerDevice, togglePickerKey, CircleQuestionMark as tr, trainingRefusalText, translateAddonKey, trpc, Share2 as tt, typeLabel, WifiOff as u, ImageOff as un, ChevronUp as ur, useAccessoriesGetStatus, useAccessoriesSetChildHidden, useAddonPagesListPages, useAddonSettingsGetDeviceSettings, useAddonSettingsGetGlobalSettings, useAddonSettingsGetIntegrationSettings, useAddonSettingsUpdateDeviceSettings, useAddonSettingsUpdateGlobalSettings, useAddonT, useAddonWidgetsListWidgets, useAddonsApplyAutoUpdateToAll, useAddonsCancelJob, useAddonsCustom, useAddonsForceRefresh, useAddonsGetAddonAutoUpdate, useAddonsGetAutoUpdateSettings, useAddonsGetJob, useAddonsGetLastRestart, useAddonsGetLogs, useAddonsGetVersions, useAddonsInstallFromWorkspace, useAddonsInstallPackage, useAddonsIsWorkspaceAvailable, useAddonsList, useAddonsListCapabilityProviders, useAddonsListFrameworkPackages, useAddonsListInstallations, useAddonsListJobs, useAddonsListPackages, useAddonsListUpdates, useAddonsListWorkspacePackages, useAddonsOnAddonLogs, useAddonsReloadPackages, useAddonsRestartAddon, useAddonsRestartServer, useAddonsRetryLoad, useAddonsRollbackPackage, useAddonsSearchAvailable, useAddonsSetAddonAutoUpdate, useAddonsSetAutoUpdateSettings, useAddonsSetCapabilityProviderEnabled, useAddonsStartJob, useAddonsUninstallPackage, useAddonsUpdatePackage, useAirQualitySensorGetStatus, useAlarmPanelArm, useAlarmPanelDisarm, useAlarmPanelGetStatus, useAlarmPanelTrigger, useAlert, useAlertsDismiss, useAlertsEmit, useAlertsGetUnreadCount, useAlertsList, useAlertsMarkAllRead, useAlertsMarkRead, useAlertsUpdate, useAllWidgets, useAmbientLightSensorGetStatus, useAudioAnalysisApplyDeviceSettingsPatch, useAudioAnalysisGetDeviceLiveContribution, useAudioAnalysisGetDeviceSettingsContribution, useAudioAnalysisResolveDeviceSettings, useAudioAnalyzerAnalyseChunk, useAudioAnalyzerAttachDevice, useAudioAnalyzerClassify, useAudioAnalyzerDetachDevice, useAudioAnalyzerDispose, useAudioAnalyzerIsReady, useAudioAnalyzerReprobeAudioEngine, useAudioCodecCanHandle, useAudioCodecCloseSession, useAudioCodecCreateDecodeSession, useAudioCodecCreateEncodeSession, useAudioCodecFlushEncode, useAudioCodecListActiveSessions, useAudioCodecListSupportedCodecs, useAudioCodecPullEncoded, useAudioCodecPullPcm, useAudioCodecPushEncodedFrame, useAudioCodecPushPcm, useAudioMetricsGetCurrentSnapshot, useAudioMetricsGetHistory, useAutomationControlDisable, useAutomationControlEnable, useAutomationControlGetStatus, useAutomationControlTrigger, useBackupCancel, useBackupCheckBackupKey, useBackupDelete, useBackupDeleteSchedule, useBackupDisableEncryption, useBackupGetEncryption, useBackupGetEntries, useBackupList, useBackupListArchives, useBackupListAvailableDatabases, useBackupListDestinations, useBackupListLocations, useBackupListRuns, useBackupListSchedules, useBackupPreviewSchedule, useBackupRestore, useBackupSetupEncryption, useBackupTrigger, useBackupUpsertDestinationPolicy, useBackupUpsertSchedule, useBatteryGetStatus, useBatteryWakeForStream, useBinaryGetStatus, useBrightnessGetStatus, useBrightnessSetBrightness, useBrokerAdd, useBrokerGet, useBrokerGetBrokerConfig, useBrokerGetSettings, useBrokerGetSettingsSchema, useBrokerGetState, useBrokerGetStatus, useBrokerList, useBrokerListProviders, useBrokerPublish, useBrokerRemove, useBrokerSetSettings, useBrokerSubscribe, useBrokerTestConnection, useBrokerTestSettings, useBrokerUnsubscribe, useButtonPress, useCalendarsGetPreferences, useCalendarsListCalendars, useCalendarsListEvents, useCalendarsSetCalendarPreference, useCameraCredentialsGetCredentials, useCameraCredentialsGetStatus, useCameraGridLayoutApplyDeviceSettingsPatch, useCameraGridLayoutGetDeviceLiveContribution, useCameraGridLayoutGetDeviceSettingsContribution, useCameraGridLayoutGetLayout, useCameraGridLayoutSaveLayout, useCameraPipelineConfigApplyDeviceSettingsPatch, useCameraPipelineConfigGetDeviceLiveContribution, useCameraPipelineConfigGetDeviceSettingsContribution, useCameraStreamsGetBrokerStreams, useCameraStreamsGetCameraStreams, useCameraStreamsGetProfileRtspEntries, useCameraStreamsGetRtspEntries, useCameraStreamsPickStream, useCapabilityPresence, useCarbonMonoxideGetStatus, useClimateControlGetStatus, useClimateControlSetFanMode, useClimateControlSetMode, useClimateControlSetPreset, useClimateControlSetSwingHorizontal, useClimateControlSetSwingVertical, useClimateControlSetTarget, useClimateControlSetTargetHumidity, useClimateControlSetTargetRange, useClusterNodes, useClusterTopology, useColorGetStatus, useColorSetColor, useConfirm, useConnectionTestDescribeTest, useConnectionTestTestSettings, useConnectivityGetStatus, useConsumablesGetStatus, useConsumablesReset, useContactGetStatus, useContainerChildren, useControlGetStatus, useControlSetValue, useCoreBlocksCompile, useCoreBlocksCreate, useCoreBlocksCreateComposition, useCoreBlocksDelete, useCoreBlocksGet, useCoreBlocksGetBlockSettings, useCoreBlocksGetComposition, useCoreBlocksGetCustomization, useCoreBlocksGetTypeDefs, useCoreBlocksList, useCoreBlocksListComposableCaps, useCoreBlocksListCompositions, useCoreBlocksMigrateRawSecrets, useCoreBlocksRestart, useCoreBlocksSetEnabled, useCoreBlocksUpdate, useCoreBlocksUpdateBlockSettings, useCoreBlocksUpdateComposition, useCoreBlocksValidateComposition, useCoverClose, useCoverGetStatus, useCoverOpen, useCoverSetPosition, useCoverSetTiltPosition, useCoverStop, useCustomFieldRenderer, useDataTableFilter, useDayNightGetOptions, useDayNightGetStatus, useDayNightSetSettings, useDebouncedString, useDecoderGetInfo, useDecoderReprobeHwaccel, useDetectionPipelineApplyDeviceSettingsPatch, useDetectionPipelineGetDeviceLiveContribution, useDetectionPipelineGetDeviceSettingsContribution, useDevShell, useDevice, useDeviceAdminLink, useDeviceAdminLinkGetAdminLink, useDeviceAdoptionAdopt, useDeviceAdoptionGetCandidate, useDeviceAdoptionGetStatus, useDeviceAdoptionListCandidateFilters, useDeviceAdoptionListCandidates, useDeviceAdoptionRefresh, useDeviceAdoptionRelease, useDeviceAdoptionResync, useDeviceAutotrack, useDeviceBattery, useDeviceCapSlice, useDeviceCapability, useDeviceCredentialsDeleteDeviceCredential, useDeviceCredentialsGetDeviceCaStatus, useDeviceCredentialsGetDeviceCertificateSettings, useDeviceCredentialsListDeviceCredentials, useDeviceCredentialsRenameDeviceCredential, useDeviceCredentialsRevokeDeviceCredential, useDeviceCredentialsSetDeviceCertificateSettings, useDeviceCredentialsStartEnrollment, useDeviceDetections, useDeviceDiscoveryAdoptDevice, useDeviceDiscoveryGetStatus, useDeviceDiscoveryListDiscovered, useDeviceDiscoveryRefreshDiscovery, useDeviceDiscoveryReleaseDevice, useDeviceExportApplyDeviceSettingsPatch, useDeviceExportExposeDevice, useDeviceExportGetDeviceLiveContribution, useDeviceExportGetDeviceSettingsContribution, useDeviceExportGetStatus, useDeviceExportListExposedDevices, useDeviceExportListSupportedDeviceKinds, useDeviceExportUnexposeDevice, useDeviceExtensionListCandidates, useDeviceExtensionListSlots, useDeviceExtensionListSources, useDeviceExtensionSetSlot, useDeviceHistoryDeclareSeries, useDeviceHistoryGetDeviceEnabled, useDeviceHistoryGetStatus, useDeviceHistoryListNodeSeries, useDeviceHistoryListSeries, useDeviceHistoryQuery, useDeviceHistoryQueryNode, useDeviceHistoryRecord, useDeviceHistoryRecordBuckets, useDeviceHistorySetDeviceEnabled, useDeviceId, useDeviceListPageSize, useDeviceManagerAddLocation, useDeviceManagerAdoptDevice, useDeviceManagerAdoptionAdopt, useDeviceManagerAdoptionCancelJob, useDeviceManagerAdoptionListCandidateFilters, useDeviceManagerAdoptionListCandidates, useDeviceManagerAdoptionListJobs, useDeviceManagerAdoptionRefresh, useDeviceManagerAdoptionRelease, useDeviceManagerAdoptionResync, useDeviceManagerAdoptionStartJob, useDeviceManagerAllocateDeviceId, useDeviceManagerApplyInitialMeta, useDeviceManagerCleanupDeletedDevicesData, useDeviceManagerCreateDevice, useDeviceManagerDisable, useDeviceManagerDiscoverAllProviders, useDeviceManagerDiscoverDevices, useDeviceManagerDiscoverProvider, useDeviceManagerDiscoveryProviders, useDeviceManagerEnable, useDeviceManagerGetAllBindings, useDeviceManagerGetBindings, useDeviceManagerGetBindingsBatch, useDeviceManagerGetChildren, useDeviceManagerGetChildrenBatch, useDeviceManagerGetConfigSchema, useDeviceManagerGetCreationSchema, useDeviceManagerGetDevice, useDeviceManagerGetDeviceAggregate, useDeviceManagerGetDeviceLiveInfoAggregate, useDeviceManagerGetDeviceSettingsAggregate, useDeviceManagerGetDeviceStatusAggregate, useDeviceManagerGetDeviceStatusAggregateBatch, useDeviceManagerGetLinkedDevices, useDeviceManagerGetLinkedDevicesBatch, useDeviceManagerGetRoleDisplayDefaults, useDeviceManagerGetSettingsSchema, useDeviceManagerGetStreamProfileMap, useDeviceManagerGetStreamSources, useDeviceManagerGetWireableFields, useDeviceManagerGetWrapperActivation, useDeviceManagerListAll, useDeviceManagerListBindableCapsForDeviceType, useDeviceManagerListDeletedSince, useDeviceManagerListDeviceIdsByCaps, useDeviceManagerListLocationDescriptions, useDeviceManagerListLocationIcons, useDeviceManagerListLocations, useDeviceManagerListPersistedByAddon, useDeviceManagerListSiteZones, useDeviceManagerListWrappersForCap, useDeviceManagerLoadConfig, useDeviceManagerLoadMeta, useDeviceManagerLoadRuntimeState, useDeviceManagerMigrateDevice, useDeviceManagerPersistConfig, useDeviceManagerProbeStreams, useDeviceManagerProviderCreationType, useDeviceManagerProviderDiscoveryParamsSchema, useDeviceManagerRegisterDevice, useDeviceManagerRemove, useDeviceManagerRemoveByIntegration, useDeviceManagerRemoveDevice, useDeviceManagerRemoveLocation, useDeviceManagerRemoveSiteZone, useDeviceManagerRenameLocation, useDeviceManagerRenameSiteZone, useDeviceManagerRunDeviceAction, useDeviceManagerSetChildLayout, useDeviceManagerSetDisabled, useDeviceManagerSetDisplay, useDeviceManagerSetIntegrationId, useDeviceManagerSetLinkDeviceId, useDeviceManagerSetLocation, useDeviceManagerSetLocationDescription, useDeviceManagerSetLocationIcon, useDeviceManagerSetLocationZone, useDeviceManagerSetMetadata, useDeviceManagerSetName, useDeviceManagerSetPrimaryChildEntityId, useDeviceManagerSetRole, useDeviceManagerSetRoleDisplayDefaults, useDeviceManagerSetSiteZone, useDeviceManagerSetStreamProfileMap, useDeviceManagerSetType, useDeviceManagerSetWrapperActive, useDeviceManagerTestCreationField, useDeviceManagerTestField, useDeviceManagerUpdateConfig, useDeviceManagerUpdateDeviceField, useDeviceManagerUpdateDeviceFieldsBatch, useDeviceNetworkLink, useDeviceOpsGetConfigEntries, useDeviceOpsGetRawState, useDeviceOpsGetSettingsSchema, useDeviceOpsGetStreamSources, useDeviceOpsRemoveDevice, useDeviceOpsRunAction, useDeviceOpsSetConfig, useDeviceProviderAdoptDiscoveredDevice, useDeviceProviderCreateDevice, useDeviceProviderDiscoverDevices, useDeviceProviderGetChildCreationSchema, useDeviceProviderGetDevices, useDeviceProviderGetDiscoveryParamsSchema, useDeviceProviderGetManualCreationType, useDeviceProviderGetStatus, useDeviceProviderReloadDevice, useDeviceProviderStart, useDeviceProviderStop, useDeviceProviderSupportsDiscovery, useDeviceProviderSupportsManualCreation, useDeviceProviderTestCreationField, useDeviceProxy, useDeviceQuickDetailOpen, useDeviceSnapshot, useDeviceSnapshotImage, useDeviceState, useDeviceStateClaimFields, useDeviceStateGetAllSnapshots, useDeviceStateGetCapSlice, useDeviceStateGetNativeCapSlice, useDeviceStateGetSnapshot, useDeviceStateListClaims, useDeviceStatePatchOwnedFields, useDeviceStateReleaseClaim, useDeviceStateSetCapSlice, useDeviceStateSlice, useDeviceStatusGetStatus, useDeviceWebrtc, useDevices, useDisplayIconResolver, useDoorbellEvents, useDoorbellGetStatus, useEnumSensorGetStatus, useEventEmitterGetStatus, useEventInvalidation, useEventStreamLatest, useEventStreamMap, useFaceGalleryAssignFace, useFaceGalleryAssignFaces, useFaceGalleryAuditIdentitySamples, useFaceGalleryCreateIdentity, useFaceGalleryDeleteFace, useFaceGalleryDeleteIdentity, useFaceGalleryGetFaceByTrack, useFaceGalleryGetFaceMedia, useFaceGalleryListIdentities, useFaceGalleryListIdentitySamples, useFaceGalleryListRecentFaces, useFaceGalleryRemoveSample, useFaceGalleryRenameIdentity, useFaceGallerySuggestFaceClusters, useFaceGalleryUnassignFace, useFaceGalleryUnassignFaces, useFanControlGetStatus, useFanControlSetDirection, useFanControlSetOscillating, useFanControlSetPercentage, useFanControlSetPreset, useFeatureProbeGetStatus, useFloodGetStatus, useGasGetStatus, useHumidifierGetStatus, useHumidifierSetMode, useHumidifierSetOn, useHumidifierSetTargetHumidity, useHumiditySensorGetStatus, useIconGlyphsVersion, useImageGetStatus, useImageSettingsGetOptions, useImageSettingsGetStatus, useImageSettingsSetSettings, useIntegrationsCreate, useIntegrationsDelete, useIntegrationsGet, useIntegrationsGetAvailableTypes, useIntegrationsGetByAddonId, useIntegrationsGetSettings, useIntegrationsList, useIntegrationsSetSettings, useIntegrationsTestConnection, useIntegrationsUpdate, useIntercomEndTalkSession, useIntercomGetStatus, useIntercomHandleAnswer, useIntercomPushTalkAudio, useIntercomStartSession, useIntercomStartTalkSession, useIntercomStopSession, useIsMidWidth, useIsMobile, useItemFormUrl, useKeychainAdminAcknowledgeReset, useKeychainAdminDeleteOrphans, useKeychainAdminDownloadRecoveryKey, useKeychainAdminImportSecret, useKeychainAdminListAudit, useKeychainAdminListSecrets, useKeychainAdminPurgeRetiredKeys, useKeychainAdminResetKeychain, useKeychainAdminResetReport, useKeychainAdminReveal, useKeychainAdminRotateMasterKey, useKeychainAdminSetSystemSecret, useKeychainAdminStatus, useLawnMowerControlDock, useLawnMowerControlGetStatus, useLawnMowerControlPause, useLawnMowerControlStartMowing, useLiveBuffer, useLiveEvent, useLlmCancel, useLlmDeleteModel, useLlmDeleteProfile, useLlmGenerate, useLlmGenerateVision, useLlmGetDefaults, useLlmGetRuntimeStatus, useLlmGetUsage, useLlmInstallModel, useLlmListModelCatalog, useLlmListModels, useLlmListNodeModels, useLlmListProfileKinds, useLlmListProfiles, useLlmListRuntimeNodes, useLlmMigrateRawSecrets, useLlmResolveModelRef, useLlmSetDefault, useLlmStartRuntime, useLlmStopRuntime, useLlmTestProfile, useLlmUpsertProfile, useLocalNetworkAddCustomAddress, useLocalNetworkDownloadCa, useLocalNetworkGetAddresses, useLocalNetworkGetAllowedAddresses, useLocalNetworkGetConnectionEndpoints, useLocalNetworkGetHubAddresses, useLocalNetworkGetNotificationEndpoint, useLocalNetworkGetPreferred, useLocalNetworkGetTlsStatus, useLocalNetworkGetViewerEndpoints, useLocalNetworkList, useLocalNetworkRegenerateCertificate, useLocalNetworkRemoveCustomAddress, useLocalNetworkResetAllowlistToBestMatch, useLocalNetworkRevertToGeneratedCertificate, useLocalNetworkSetAddressRole, useLocalNetworkSetAllowedAddresses, useLocalNetworkSetNotificationEndpoint, useLocalNetworkSetViewerEndpoints, useLocalNetworkUploadCertificate, useLocalNetworkUseStoredUploadedCertificate, useLockControlGetStatus, useLockControlLock, useLockControlOpen, useLockControlUnlock, useMediaPlayerGetStatus, useMediaPlayerNext, useMediaPlayerPause, useMediaPlayerPlay, useMediaPlayerPlayMedia, useMediaPlayerPrevious, useMediaPlayerSeek, useMediaPlayerSelectSource, useMediaPlayerSetMute, useMediaPlayerSetRepeat, useMediaPlayerSetShuffle, useMediaPlayerSetVolume, useMediaPlayerStop, useMeshNetworkGetStatus, useMeshNetworkJoin, useMeshNetworkLeave, useMeshNetworkListPeers, useMeshNetworkLogout, useMeshNetworkStartLogin, useMeshNetworkTestConnection, useMetricsProviderCollectSnapshot, useMetricsProviderGetAddonStats, useMetricsProviderGetCached, useMetricsProviderGetCpuTemperature, useMetricsProviderGetCurrent, useMetricsProviderGetDiskSpace, useMetricsProviderGetGpuInfo, useMetricsProviderGetLoadSeries, useMetricsProviderGetProcessStats, useMetricsProviderListAddonInstances, useMetricsProviderListNodeProcesses, useMotionDetectionAnalyze, useMotionDetectionApplyDeviceSettingsPatch, useMotionDetectionGetDeviceLiveContribution, useMotionDetectionGetDeviceSettingsContribution, useMotionDetectionRemoveCamera, useMotionDetectionReset, useMotionGetStatus, useMotionIsDetected, useMotionTriggerGetStatus, useMotionTriggerSetMotionTrigger, useMotionZonesGetOptions, useMotionZonesGetStatus, useMotionZonesSetZone, useMqttBrokerAddBroker, useMqttBrokerGetBrokerConfig, useMqttBrokerGetStatus, useMqttBrokerListBrokers, useMqttBrokerRemoveBroker, useMqttBrokerStartEmbeddedBroker, useMqttBrokerStopEmbeddedBroker, useMqttBrokerTestConnection, useNativeObjectDetectionGetOptions, useNativeObjectDetectionGetStatus, useNativeObjectDetectionSetEnabled, useNativeObjectDetectionSetSettings, useNavigation, useNavigationGetFeatures, useNavigationGetStatus, useNavigationGoToPoint, useNavigationListActions, useNavigationMove, useNavigationPlaySound, useNavigationRunAction, useNavigationSetLightLevel, useNavigationSetLightMode, useNavigationSetLightOn, useNavigationStop, useNetworkAccessGetEndpoint, useNetworkAccessGetStatus, useNetworkAccessListEndpoints, useNetworkAccessStart, useNetworkAccessStop, useNetworkLinkGetStatus, useNetworkQualityGetAllStats, useNetworkQualityGetDeviceStats, useNetworkQualityReportClientStats, useNodesClusterAddonStatus, useNodesDeployAddon, useNodesDirectory, useNodesExecuteQuery, useNodesGetCapUsageGraph, useNodesGetNodeAddons, useNodesRenameNode, useNodesRestartAddon, useNodesRestartNode, useNodesRestartProcess, useNodesSetProcessLogLevel, useNodesShutdownNode, useNodesTopology, useNodesUndeployAddon, useNotificationOutputDeleteTarget, useNotificationOutputDiscoverTargets, useNotificationOutputGetTarget, useNotificationOutputListTargetKinds, useNotificationOutputListTargets, useNotificationOutputProbeTargetConfig, useNotificationOutputSend, useNotificationOutputSetTargetEnabled, useNotificationOutputTestTarget, useNotificationOutputUpsertTarget, useNotificationRulesActivateAlarmProfile, useNotificationRulesCancelSnooze, useNotificationRulesCreateAlarmProfile, useNotificationRulesCreateRule, useNotificationRulesCreateSequence, useNotificationRulesCreateSnooze, useNotificationRulesDeleteAlarmProfile, useNotificationRulesDeleteRule, useNotificationRulesDeleteSequence, useNotificationRulesGetAlarmConfig, useNotificationRulesGetAlarmSensors, useNotificationRulesGetClipRetentionAsks, useNotificationRulesGetConditionCatalog, useNotificationRulesGetHistory, useNotificationRulesGetRule, useNotificationRulesGetRuleLastRuns, useNotificationRulesGetSequence, useNotificationRulesGetTemplateCatalog, useNotificationRulesListDeviceMutes, useNotificationRulesListRules, useNotificationRulesListSequences, useNotificationRulesListSnoozes, useNotificationRulesPreviewStateSummary, useNotificationRulesPreviewTemplate, useNotificationRulesRenameAlarmProfile, useNotificationRulesResolveArtifactUrl, useNotificationRulesSetAlarmConfig, useNotificationRulesSetDeviceMuted, useNotificationRulesSetRuleEnabled, useNotificationRulesTestRule, useNotificationRulesUpdateRule, useNotificationRulesUpdateSequence, useNotifierCancel, useNotifierGetStatus, useNotifierSend, useNumericSensorGetStatus, useOidcConnectionsConnectionFormSchema, useOidcConnectionsCreateConnection, useOidcConnectionsDeleteConnection, useOidcConnectionsListConnections, useOidcConnectionsUpdateConnection, useOptimisticSlice, useOptionalSystem, useOptionalWidgetRegistry, useOsdGetStatus, useOsdManagerClearSlotBinding, useOsdManagerCopyDeviceConfiguration, useOsdManagerDeleteTemplate, useOsdManagerGetConditionSupport, useOsdManagerGetDeviceOsd, useOsdManagerGetSourceCatalog, useOsdManagerListTemplates, useOsdManagerPreviewSlot, useOsdManagerRenderDevice, useOsdManagerSetSlotBinding, useOsdManagerSetSlotCameraEnabled, useOsdManagerUpsertTemplate, useOsdSetOverlay, usePTZ, usePersistedPageSize, usePetFeederCallPet, usePetFeederCancelFeed, usePetFeederFeed, usePetFeederGetStatus, usePetFeederMarkFoodReplenished, usePetFeederPlaySound, usePetFeederResetDesiccant, usePetFeederSetChildLock, usePetFeederSetFeedSound, usePetFeederSetIndicatorLight, usePetFeederSetVolume, usePickerSiteZones, usePipelineAnalyticsAddRetrainFrameFromRecording, usePipelineAnalyticsAddRetrainFramesToCollection, usePipelineAnalyticsApplyDeviceSettingsPatch, usePipelineAnalyticsBackfillRetrainOrigins, usePipelineAnalyticsCancelRelocateMedia, usePipelineAnalyticsCancelStorageMigrationMove, usePipelineAnalyticsClearTrackRelation, usePipelineAnalyticsClearTracks, usePipelineAnalyticsCompleteRetrainTrack, usePipelineAnalyticsCountRelocatableMedia, usePipelineAnalyticsCountUnstampedEventMedia, usePipelineAnalyticsCreateRetrainCollection, usePipelineAnalyticsDeleteDeviceEvents, usePipelineAnalyticsDeleteRetrainCollection, usePipelineAnalyticsDeleteTracks, usePipelineAnalyticsDeselectRetrainFrame, usePipelineAnalyticsGetActiveTracks, usePipelineAnalyticsGetAudioEvents, usePipelineAnalyticsGetDeviceLiveContribution, usePipelineAnalyticsGetDeviceSettingsContribution, usePipelineAnalyticsGetEventDensity, usePipelineAnalyticsGetEventDensityBatch, usePipelineAnalyticsGetEventMedia, usePipelineAnalyticsGetEventMediaFootprintByKind, usePipelineAnalyticsGetEventStoreFootprint, usePipelineAnalyticsGetKeyEvents, usePipelineAnalyticsGetKeyEventsBatch, usePipelineAnalyticsGetMediaReclaimStatus, usePipelineAnalyticsGetMotionEvents, usePipelineAnalyticsGetObjectEmbeddingRebuildStatus, usePipelineAnalyticsGetObjectEvents, usePipelineAnalyticsGetRetrainCorpusKpi, usePipelineAnalyticsGetRetrainExportUrl, usePipelineAnalyticsGetRetrainFrameImage, usePipelineAnalyticsGetSensorEvents, usePipelineAnalyticsGetStorageMigrationMoveStatus, usePipelineAnalyticsGetTrack, usePipelineAnalyticsGetTrackMedia, usePipelineAnalyticsGetTrainingExportSummary, usePipelineAnalyticsGetTrainingExportUrl, usePipelineAnalyticsListArchivedDebugNotes, usePipelineAnalyticsListBirthDecisions, usePipelineAnalyticsListEventKinds, usePipelineAnalyticsListEventKindsBatch, usePipelineAnalyticsListEventMedia, usePipelineAnalyticsListOpsLog, usePipelineAnalyticsListRecentTracks, usePipelineAnalyticsListRelocateMediaJobs, usePipelineAnalyticsListRetrainAnnotations, usePipelineAnalyticsListRetrainAssistProfiles, usePipelineAnalyticsListRetrainCollectionFrames, usePipelineAnalyticsListRetrainCollections, usePipelineAnalyticsListRetrainCorpusPage, usePipelineAnalyticsListRetrainFrames, usePipelineAnalyticsListRetrainStaging, usePipelineAnalyticsListTrackMedia, usePipelineAnalyticsListTrackRelations, usePipelineAnalyticsListTracks, usePipelineAnalyticsOfferRetrainArchive, usePipelineAnalyticsOwnersWithMedia, usePipelineAnalyticsPauseForStorageMigration, usePipelineAnalyticsProposeRetrainAnnotations, usePipelineAnalyticsProposeRetrainAnnotationsWithLlm, usePipelineAnalyticsPruneEvents, usePipelineAnalyticsPruneEventsBefore, usePipelineAnalyticsPruneTracksBefore, usePipelineAnalyticsReadLongTermSeries, usePipelineAnalyticsRebuildObjectEmbeddings, usePipelineAnalyticsReclaimDebugMedia, usePipelineAnalyticsReconcileFromDisk, usePipelineAnalyticsRefreshStorageLocationsForMigration, usePipelineAnalyticsRelocateMedia, usePipelineAnalyticsRemoveRetrainFrameFromCollection, usePipelineAnalyticsRenameRetrainCollection, usePipelineAnalyticsResolveRetrainTrainingCorpus, usePipelineAnalyticsRestageRetrainTrack, usePipelineAnalyticsResumeForStorageMigration, usePipelineAnalyticsSaveRetrainAnnotations, usePipelineAnalyticsSearchObjectEvents, usePipelineAnalyticsSelectRetrainFrames, usePipelineAnalyticsSetRetrainFrameComplete, usePipelineAnalyticsSetTrackFlags, usePipelineAnalyticsSetTrackPurity, usePipelineAnalyticsSetTrackRelation, usePipelineAnalyticsStartStorageMigrationMove, usePipelineAnalyticsWipeAllAnalytics, usePipelineAnalyticsWipeObjectEmbeddings, usePipelineAnalyticsWriteRetrainArchive, usePipelineExecutorCacheFrameInPool, usePipelineExecutorClearDeviceOverrides, usePipelineExecutorClearModelBoundDeviceOverrides, usePipelineExecutorDeleteModel, usePipelineExecutorDownloadModel, usePipelineExecutorGetAddonModels, usePipelineExecutorGetAudioCapabilities, usePipelineExecutorGetAvailableEngines, usePipelineExecutorGetCapabilities, usePipelineExecutorGetDefaultSteps, usePipelineExecutorGetDetectionConfigSchema, usePipelineExecutorGetEffectiveTuning, usePipelineExecutorGetEngineProvisioning, usePipelineExecutorGetGlobalPipelineConfig, usePipelineExecutorGetGlobalSteps, usePipelineExecutorGetInferenceDeviceHealth, usePipelineExecutorGetOrchestratorConfigSchema, usePipelineExecutorGetReferenceAudio, usePipelineExecutorGetReferenceAudioFiles, usePipelineExecutorGetReferenceImage, usePipelineExecutorGetSchema, usePipelineExecutorGetSelectedEngine, usePipelineExecutorGetVideoPipelineSteps, usePipelineExecutorInferCached, usePipelineExecutorKillEngine, usePipelineExecutorListLoadedEngines, usePipelineExecutorListReferenceImages, usePipelineExecutorRearmInferenceDevice, usePipelineExecutorRunAudioTest, usePipelineExecutorRunPipeline, usePipelineExecutorRunPipelineBatch, usePipelineExecutorSetVideoPipelineSteps, usePipelineExecutorSpinEngine, usePipelineExecutorUncacheFrame, usePipelineExecutorValidatePipeline, usePipelineOrchestratorAbortNodeBenchmark, usePipelineOrchestratorApplyAutoTune, usePipelineOrchestratorApplyDeviceSettingsPatch, usePipelineOrchestratorAssignAudio, usePipelineOrchestratorAssignPipeline, usePipelineOrchestratorDeleteNodeBenchmarkResult, usePipelineOrchestratorGetAgentLoad, usePipelineOrchestratorGetAgentSettings, usePipelineOrchestratorGetAudioAssignment, usePipelineOrchestratorGetAudioAssignments, usePipelineOrchestratorGetAudioNodeLoad, usePipelineOrchestratorGetCameraDetectionSource, usePipelineOrchestratorGetCameraMetrics, usePipelineOrchestratorGetCameraSettings, usePipelineOrchestratorGetCameraStatus, usePipelineOrchestratorGetCameraStatuses, usePipelineOrchestratorGetCameraStepOverrides, usePipelineOrchestratorGetCameraSwitches, usePipelineOrchestratorGetCapabilityBindings, usePipelineOrchestratorGetClusterModelChoice, usePipelineOrchestratorGetDeviceLiveContribution, usePipelineOrchestratorGetDeviceSettingsContribution, usePipelineOrchestratorGetEffectiveShares, usePipelineOrchestratorGetGlobalMetrics, usePipelineOrchestratorGetIngestOwner, usePipelineOrchestratorGetNodeBenchmarkCandidates, usePipelineOrchestratorGetNodeBenchmarkPreflight, usePipelineOrchestratorGetNodeBenchmarkStatus, usePipelineOrchestratorGetNodeInferenceDevices, usePipelineOrchestratorGetPipelineAssignment, usePipelineOrchestratorGetPipelineAssignments, usePipelineOrchestratorGetPipelineDevicePin, usePipelineOrchestratorGetPlacementStats, usePipelineOrchestratorGetReconcileFromDiskStatus, usePipelineOrchestratorListAgentSettings, usePipelineOrchestratorListNodeBenchmarkResults, usePipelineOrchestratorPauseForStorageMigration, usePipelineOrchestratorPlanAutoTune, usePipelineOrchestratorRebalance, usePipelineOrchestratorReconcileFromDisk, usePipelineOrchestratorRemoveAgentSettings, usePipelineOrchestratorRequestOccupancyLook, usePipelineOrchestratorResetNodePipelineDefaults, usePipelineOrchestratorResolvePipeline, usePipelineOrchestratorResumeForStorageMigration, usePipelineOrchestratorSetAgentCapabilities, usePipelineOrchestratorSetAgentDecodeLimits, usePipelineOrchestratorSetAgentInferenceDevices, usePipelineOrchestratorSetAgentMaxCameras, usePipelineOrchestratorSetAgentReachableHost, usePipelineOrchestratorSetCameraDetectionSource, usePipelineOrchestratorSetCameraPipelineForAgent, usePipelineOrchestratorSetCameraSensors, usePipelineOrchestratorSetCameraStepOverride, usePipelineOrchestratorSetCameraStepSettings, usePipelineOrchestratorSetCameraStepToggle, usePipelineOrchestratorSetCameraSwitch, usePipelineOrchestratorSetCapabilityBinding, usePipelineOrchestratorSetLoadBalancingShares, usePipelineOrchestratorSetPipelineDevicePin, usePipelineOrchestratorSetShareSource, usePipelineOrchestratorStartNodeBenchmark, usePipelineOrchestratorSuggestShares, usePipelineOrchestratorUnassignAudio, usePipelineOrchestratorUnassignPipeline, usePipelineRunnerAbortNodeBench, usePipelineRunnerAttachCamera, usePipelineRunnerDetachCamera, usePipelineRunnerGetAllCameraMetrics, usePipelineRunnerGetCameraMetrics, usePipelineRunnerGetLocalCameras, usePipelineRunnerGetLocalLoad, usePipelineRunnerGetLocalMetrics, usePipelineRunnerGetNativeCrop, usePipelineRunnerGetNodeBenchStatus, usePipelineRunnerGetParkedTrackFrame, usePipelineRunnerParkTrackFrame, usePipelineRunnerReleaseParkedTrackFrames, usePipelineRunnerReportMotion, usePipelineRunnerRequestOccupancyBurst, usePipelineRunnerRunDetailSubtree, usePipelineRunnerRunStatelessStep, usePipelineRunnerStartNodeBench, usePlateGalleryAssignPlate, usePlateGalleryAssignPlates, usePlateGalleryCorrectPlateText, usePlateGalleryCreateVehicle, usePlateGalleryDeletePlate, usePlateGalleryDeleteVehicle, usePlateGalleryGetPlateByTrack, usePlateGalleryGetPlateMedia, usePlateGalleryListPlates, usePlateGalleryListVehicleSamples, usePlateGalleryListVehicles, usePlateGalleryRemoveVehicleSample, usePlateGalleryRenameVehicle, usePlateGallerySearchPlates, usePlateGallerySuggestPlateClusters, usePlateGalleryUnassignPlate, usePlateGalleryUnassignPlates, usePlayerOverlayLayer, usePlayerOverlayLayers, usePlayerToolbarButton, usePlayerToolbarButtons, usePowerMeterGetStatus, usePresenceGetStatus, usePressureSensorGetStatus, usePrivacyMaskGetOptions, usePrivacyMaskGetStatus, usePrivacyMaskSetAudioEnabled, usePrivacyMaskSetMask, usePrompt, usePtzAutotrackGetSettings, usePtzAutotrackGetStatus, usePtzAutotrackSetEnabled, usePtzAutotrackSetSettings, usePtzCaptureHomeHere, usePtzContinuousMove, usePtzDeletePreset, usePtzGetHomePreset, usePtzGetHomeReturn, usePtzGetOptions, usePtzGetPosition, usePtzGetPresets, usePtzGetStatus, usePtzGoHome, usePtzGoToPreset, usePtzMove, usePtzSavePreset, usePtzSetAutofocus, usePtzSetHomePreset, usePtzSetHomeReturn, usePtzStop, useRebootReboot, useRecordEntriesDeleteEntry, useRecordEntriesListEntries, useRecordEntriesListEntryKinds, useRecordEntriesPutEntry, useRecordedPlayback, useRecordingArchiveApplyDeviceSettingsPatch, useRecordingArchiveCancelRelocateJob, useRecordingArchiveCancelStorageMigrationMove, useRecordingArchiveDeleteFootprint, useRecordingArchiveGetAvailabilityBatch, useRecordingArchiveGetDaysWithRecordingsBatch, useRecordingArchiveGetDeviceConfig, useRecordingArchiveGetDeviceLiveContribution, useRecordingArchiveGetDeviceSettingsContribution, useRecordingArchiveGetPlacement, useRecordingArchiveGetRelocateResidue, useRecordingArchiveGetStatus, useRecordingArchiveGetStorageMigrationMoveStatus, useRecordingArchiveGetStorageUsage, useRecordingArchiveListOpsLog, useRecordingArchiveListRelocateJobs, useRecordingArchiveLocateSegment, useRecordingArchivePauseForStorageMigration, useRecordingArchivePlanStorageRebalance, useRecordingArchivePruneFootage, useRecordingArchiveReadGopBytes, useRecordingArchiveReadSegmentBytes, useRecordingArchiveReadWindowBytes, useRecordingArchiveReconcileLedgerAgainstDisk, useRecordingArchiveRefreshStorageLocationsForMigration, useRecordingArchiveRelocateFootage, useRecordingArchiveRenderClip, useRecordingArchiveRenderGif, useRecordingArchiveRescanStorage, useRecordingArchiveResumeForStorageMigration, useRecordingArchiveSetDeviceConfig, useRecordingArchiveSetDevicePlacement, useRecordingArchiveStartStorageMigrationMove, useRecordingArchiveStartStorageRebalance, useRecordingExportCancelExport, useRecordingExportCreateExport, useRecordingExportDeleteExport, useRecordingExportGetDownloadUrl, useRecordingExportGetExport, useRecordingExportListExports, useRecordingExportReadExportBytes, useRecordingGetAvailability, useRecordingGetDaysWithRecordings, useRecordingGetPlayback, useRecordingGetPlaybackOptions, useRecordingListSources, useRecordingOnboardGetOptions, useRecordingOnboardGetStatus, useRecordingOnboardSetSettings, useRecordingSignalGetStatus, useRemoteComponent, useRoleDisplayDefaults, useSceneMonitorCaptureReference, useSceneMonitorCreateScene, useSceneMonitorDeleteReference, useSceneMonitorDeleteScene, useSceneMonitorGetStatus, useSceneMonitorListScenes, useSceneMonitorListScenesBatch, useSceneMonitorRecheckNow, useSceneMonitorResetScene, useSceneMonitorUpdateScene, useScriptRunnerGetStatus, useScriptRunnerRun, useScriptRunnerStop, useScrubController, useServerManagementApplyServerUpdate, useServerManagementCheckServerUpdate, useServerManagementGetServerPackageStatus, useServerManagementRestartServer, useServerManagementRollbackServerUpdate, useSettingsStoreAggregate, useSettingsStoreCount, useSettingsStoreDeclareCollection, useSettingsStoreDelete, useSettingsStoreDeleteWhere, useSettingsStoreGet, useSettingsStoreHistogram, useSettingsStoreInsert, useSettingsStoreInsertMany, useSettingsStoreIsEmpty, useSettingsStoreQuery, useSettingsStoreSet, useSettingsStoreTransact, useSettingsStoreUpdate, useSettingsStoreUpdateWhere, useSettingsStoreUpsert, useSettingsStoreUpsertMany, useSmokeGetStatus, useSnapshotApplyDeviceSettingsPatch, useSnapshotGetDebugState, useSnapshotGetDeviceLiveContribution, useSnapshotGetDeviceSettingsContribution, useSnapshotGetSnapshot, useSnapshotGetSnapshotLinks, useSnapshotGetSnapshotOverview, useSnapshotGetStatus, useSnapshotInvalidateCache, useStationaryOverlay, useStorageAbortUpload, useStorageBeginDownload, useStorageBeginUpload, useStorageDelete, useStorageDeleteLocation, useStorageEndDownload, useStorageExists, useStorageFinalizeUpload, useStorageGetAvailableSpace, useStorageList, useStorageListDrainProgress, useStorageListLocationDeclarations, useStorageListLocations, useStorageListProviders, useStorageMigrationCancel, useStorageMigrationCleanupCancel, useStorageMigrationCleanupStart, useStorageMigrationCleanupStatus, useStorageMigrationDrain, useStorageMigrationHistory, useStorageMigrationMovers, useStorageMigrationPlan, useStorageMigrationResidue, useStorageMigrationStart, useStorageMigrationStatus, useStorageRead, useStorageReadChunk, useStorageResolve, useStorageTestConfig, useStorageTestLocation, useStorageUpsertLocation, useStorageWrite, useStorageWriteChunk, useStoredGroupBy, useStreamBrokerAcquireEgressTranscode, useStreamBrokerApplyDeviceSettingsPatch, useStreamBrokerAssignProfile, useStreamBrokerFetchEventMedia, useStreamBrokerForgetDeviceHardware, useStreamBrokerGetAllRtspEntries, useStreamBrokerGetBrokerStats, useStreamBrokerGetDeviceAudioMute, useStreamBrokerGetDeviceLiveContribution, useStreamBrokerGetDeviceSettingsContribution, useStreamBrokerGetLiveViewerCounts, useStreamBrokerGetPreBufferInfo, useStreamBrokerGetRtspEntry, useStreamBrokerGetRtspPort, useStreamBrokerGetStreamUrl, useStreamBrokerGetStreamWithCodec, useStreamBrokerIsRtspEnabled, useStreamBrokerKillClient, useStreamBrokerListAllCameraStreams, useStreamBrokerListAllProfileSlots, useStreamBrokerListClients, useStreamBrokerProbeStream, useStreamBrokerProduceEventMedia, useStreamBrokerPublishCameraStream, useStreamBrokerPullAudioChunks, useStreamBrokerRegenerateRtspToken, useStreamBrokerReleaseEgressTranscode, useStreamBrokerReleaseStreamWithCodec, useStreamBrokerRenderPreBufferClip, useStreamBrokerReportStreamSignal, useStreamBrokerRestartProfile, useStreamBrokerRetractCameraStream, useStreamBrokerSetDeviceAudioMute, useStreamBrokerSetPreBufferDuration, useStreamBrokerSetRtspEnabled, useStreamBrokerSubscribeAudioChunks, useStreamBrokerUnassignProfile, useStreamBrokerUnsubscribeAudioChunks, useStreamCatalogGetCatalog, useStreamParamsGetConfigSchema, useStreamParamsGetOptions, useStreamParamsGetStatus, useStreamParamsSetProfile, useStreamSignalsListSignals, useSwitchGetStatus, useSwitchSetState, useSystem, useSystemDetectSiteLocation, useSystemFeatureFlags, useSystemForceRetentionCleanup, useSystemGetFailureContributions, useSystemGetLoadContributions, useSystemGetLoggingSettings, useSystemGetRequestCensus, useSystemGetRetentionConfig, useSystemGetSiteLocation, useSystemHealth, useSystemInfo, useSystemMutation, useSystemNetworkAddresses, useSystemQuery, useSystemSetLoggingSettings, useSystemSetRetentionConfig, useSystemSetSiteLocation, useTamperGetStatus, useTemperatureSensorGetStatus, useTerminalSessionAdoptLegacyMonitor, useTerminalSessionClose, useTerminalSessionCreateInstance, useTerminalSessionDeleteInstance, useTerminalSessionListInstances, useTerminalSessionListLegacyCameras, useTerminalSessionListProfiles, useTerminalSessionListSessions, useTerminalSessionOpenSession, useTerminalSessionPullOutput, useTerminalSessionResize, useTerminalSessionSetInstanceEnabled, useTerminalSessionUpdateInstance, useTerminalSessionWriteInput, useThemeMode, useToastOnToast, useTrainingCanaryResult, useTrainingCancelJob, useTrainingDiscardResult, useTrainingGetJob, useTrainingGetJobResult, useTrainingListBaseModels, useTrainingListJobs, useTrainingPlanJob, useTrainingRegisterResult, useTrainingRollbackCanary, useTrainingStartJob, useTrainingStartJobBatch, useTurnProviderGetTurnServers, useUiText, useUpdateGetStatus, useUpdateInstallUpdate, useUrlQueryParam, useUserManagementConfirmTotp, useUserManagementCreateScopedToken, useUserManagementCreateUser, useUserManagementDeleteUser, useUserManagementDisableTotp, useUserManagementFindUserByExternalIdentity, useUserManagementGetTotpStatus, useUserManagementListApiKeys, useUserManagementListExternalIdentities, useUserManagementListOauthSessions, useUserManagementListScopedTokens, useUserManagementListUsers, useUserManagementMigrateRawSecrets, useUserManagementOauthExchangeCode, useUserManagementOauthIssueCode, useUserManagementOauthRefresh, useUserManagementOauthVerifyAccessToken, useUserManagementResetPassword, useUserManagementRevokeApiKey, useUserManagementRevokeOauthSession, useUserManagementRevokeScopedToken, useUserManagementSetUserScopes, useUserManagementSetupTotp, useUserManagementUnlinkExternalIdentity, useUserManagementUpdateUser, useUserManagementValidateCredentials, useUserManagementValidateScopedToken, useUserManagementVerifyTotp, useVacuumControlGetStatus, useVacuumControlLocate, useVacuumControlPause, useVacuumControlReturnToBase, useVacuumControlSetFanSpeed, useVacuumControlStart, useVacuumControlStop, useValveClose, useValveGetStatus, useValveOpen, useValveSetPosition, useValveStop, useVibrationGetStatus, useVideoclipsDialClipStream, useVideoclipsGetClipPlayback, useVideoclipsGetPlaybackOptions, useVideoclipsListClips, useVideoclipsListSources, useVideoclipsOfferClipBytes, useVideoclipsReadClipBytes, useVodPlayback, useWaterHeaterGetStatus, useWaterHeaterSetAway, useWaterHeaterSetOperationMode, useWaterHeaterSetTargetTemp, useWeatherGetStatus, useWebrtcSessionAddIceCandidate, useWebrtcSessionApplyDownlinkProbe, useWebrtcSessionCloseSession, useWebrtcSessionCreateSession, useWebrtcSessionGetIceCandidates, useWebrtcSessionGetSessionDebug, useWebrtcSessionGetSessionState, useWebrtcSessionHandleAnswer, useWebrtcSessionHandleOffer, useWebrtcSessionHasAdaptiveBitrate, useWebrtcSessionListStreams, useWidget, useWidgetMetadata, useWidgetRegistry, useZoneAnalyticsGetCameraHistory, useZoneAnalyticsGetCurrentSnapshot, useZoneAnalyticsGetCurrentSnapshotBatch, useZoneAnalyticsGetUnzonedHistory, useZoneAnalyticsGetZoneHistory, useZoneEditing, useZoneRulesListRules, useZoneRulesSetRules, useZonesAddZone, useZonesListZones, useZonesRemoveZone, useZonesUpdateZone, RotateCw as ut, Users as v, vacuumStateMeta, validateScopes, valveStateMeta, variantLabel, GraduationCap as vn, Camera as vr, Power as vt, Type as w, waterHeaterPhase, waterHeaterTint, weatherConditionMeta, weatherTint, withResolvedParentDetail, withUseRootModel, Flashlight as wn, Bone as wr, writeStoredGroupBy, Pipette as wt, Upload as x, Funnel as xn, Bug as xr, Plus as xt, User as y, Gauge as yn, Cable as yr, PowerOff as yt, SunMedium as z, Dog as zn, ArrowUpToLine as zr, MonitorPlay as zt };
64387
+ export { ShieldOff as $, Clock as $n, LoaderCircle as $t, TrainFront as A, AddProviderEntryDialog, AddonGlobalSettingsForm, AdminLinkQuickAction, AgentStepEditor, AlarmHeroCard, AlarmInlineControl as AlarmPanelInlineControl, Feather as An, AppShell, Bell as Ar, ArcKnob, Pause as At, AudioClassificationList, AudioLevelWaveform, AudioWaveform, AutomationHeroCard, AutomationInlineControl, AutotrackSection, SunMedium as B, BTN_COMPACT, BTN_COMPACT_DANGER, BTN_COMPACT_PRIMARY, BTN_COMPACT_WARNING, BackToStepsButton, Badge, BatteryBadge, DoorClosed as Bn, BottomSheet, ArrowUp as Br, Breadcrumb, BrightnessPanel, MonitorPlay as Bt, Button, ButtonControl, ButtonHeroCard, Undo2 as C, CENTER, CHIP_ACTIVE, CHIP_BASE, CHIP_INACTIVE, CLASS_COLORS, COLUMN_BREAKPOINT_CLASS, COLUMN_PRIORITY, COMMIT_DEDUPE_TOLERANCE_MS, COMMIT_DEDUPE_WINDOW_MS, CONTROL_CAP_NAMES, CONTROL_FILLS, CameraStreamPlayer, Card, Checkbox, ChildSectionAccordion, ClimatePanel, Funnel as Cn, CodeBlock, CollapsibleCard, ConfigFormBuilder, FormField as ConfigFormField, ConfigNotificationTargetMultiSelectFieldView, ConfigNotificationTargetSelectFieldView, ConfigSchemaField, ConfirmActionButton, ConfirmDialogProvider, ConsumablesPanel, ContainerChildrenProvider, ContainerPrimaryHero, ControlColumn, ControlHeroCard, ControlInlineControl, ControlPanel, CopyButton, CoverHeroCard, CoverInlineControl, CoverPanel, Bug as Cr, Play as Ct, CustomFieldRenderersProvider, TrendingDown as D, DEFAULT_COLOR, DEFAULT_PAGINATION_LABELS, DEVICE_COLUMNS, DEVICE_EXPORT_PAGE_SIZE_KEY, DEVICE_LIST_PAGE_SIZE_KEY, DEVICE_LIST_PAGE_SIZE_OPTIONS, DEVICE_PICKER_GROUP_STORAGE_KEY, DEVICE_ROLE_META, DEVICE_TYPE_CONTROL, DEVICE_TYPE_META, DataTable, DataTableFilterBar, DataTablePager, DetectionCanvas, DetectionOverlay, DetectionResultTree, DevShell, DeviceActivityPanel, DeviceBatchToolbar, DeviceCard, DeviceContextProvider, DeviceExportPanel, DeviceExportSetup, DeviceFilterBar, DeviceGrid, DeviceItem, DeviceList, DeviceMultiSelectField, DevicePicker, DeviceQuickDetailProvider, DeviceSelectField, DeviceSelectorPicker, DeviceStepMatrix, DevicesFailedLine, DevicesLoadingLine, DevicesWidenWarning, Dialog, DialogBody, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, DiscoveryPanel, FlashlightOff as Dn, DoorbellRecentPanel, Blinds as Dr, Dropdown, DropdownContent, DropdownItem, DropdownTrigger, Phone as Dt, DummyHeroCard, DummyInline, TriangleAlert as E, EMPTY_DATA_TABLE_FILTER, EVENT_KIND_ICONS, EmptyState, Flashlight as En, EndpointResultsCard, EndpointTestCard, EntryJsonSchemaForm, Bone as Er, ErrorBox, Pin as Et, EventKindGlyph, EventStream, ExtensionsPanel, Thermometer as F, FAST_ICON_GLYPHS, FILL, FLEET_LIST_GC_TIME_MS, FLEET_LIST_QUERY_KEY, FLEET_LIST_STALE_TIME_MS, FanHeroCard, FanInlineControl, FanPanel, FilterBar, FloatingEventStream, FloatingLogStream, FloatingPanel, EllipsisVertical as Fn, FormField$1 as FormField, BatteryLow as Fr, Move as Ft, Snowflake as G, GRID_GAP, GRID_PAIRED, GRID_QUICK_STATS, GateBadge, GateControl, Copy as Gn, ArrowDownToLine as Gr, GripTrack, GroupedModelSelector, Menu as Gt, Square as H, HOST_WIDGETS, HUB_SESSION_RUN_MS, HlsVideo, Database as Hn, HoverZoomImage, ArrowRight as Hr, Minimize2 as Ht, HubSessionTestCard, HumidifierHeroCard, HumidifierInlineControl, Target as I, INPUT_COMPACT, INPUT_SHELL, IconAction, IconButton, IconPicker, ImageHeroCard, ImageInlineControl, ImageSelector, Droplets as In, InferenceConfigSelector, Input, BatteryFull as Ir, MoveVertical as It, ItemFormDialog, SkipForward as J, CloudSun as Jn, Activity as Jr, MapPin as Jt, Smartphone as K, KebabMenu, KeyValueList, Cog as Kn, AlarmSmoke as Kr, Megaphone as Kt, Tag as L, LIST_ROW, Label, LawnMowerHeroCard, LawnMowerInlineControl, LayeredSettingsForm, LightHeroCard, LightInlineControl, Droplet as Ln, LockHeroCard, LockInlineControl, LockPanel, LogStream, LoginForm, Bath as Lr, MoveHorizontal as Lt, ToggleRight as M, MEDIA_GRID, MODE_COLOR, MaskShapeCanvas, MediaCard, MediaGrid, MediaPlayerHeroCard, MediaPlayerInlineControl, MediaPlayerPanel, Eye as Mn, MobileDrawer, ModelPicker, MotionZonesSettings, Battery as Mr, Network as Mt, ToggleLeft as N, NAVIGATION_DRIVE_INTERVAL_MS, NODE_COLOR_IDS, NatResultCard, NavigationPanel, NetworkLinkBadge, EyeOff as Nn, NodeMultiSelectField, NodePicker, NodeSelectField, NotificationTargetSelectField, NotificationTargetsField, BatteryWarning as Nr, Navigation as Nt, TrendingUp as O, OPTION_SELECT_SEARCH_MIN_OPTIONS, OfflineBadge, Flame as On, OptionSelect, Bird as Or, Pencil as Ot, Timer as P, PAGE_SIZE_ALL, PHASE_CONFIG, PICKER_CHIP_LIMIT, PICKER_DEFAULT_GROUP_BY, PICKER_GROUP_BY_MODES, PICKER_GROUP_COLLAPSE_AT, PICKER_NONE_KEY, PICKER_NOUN_PLURAL, PICKER_NO_FILTERS, PICKER_PAGE_SIZE, PICKER_SEARCH_DEBOUNCE_MS, PICKER_WINDOW, PRIORITY, PTZOverlay, PageHeader, PageShell, PageSizeSelect, Pagination, PasswordInput, PhaseIcon, PipelineBuilder, PipelineRuntimeSelector, PipelineStep, PlaceholderChipField, PlayerOverlaysProvider, ExternalLink as Pn, Popover, PopoverContent, PopoverRowAction, PopoverTrigger, BatteryMedium as Pr, PrimaryChildPicker, PrivacyMaskSettings, ProviderBadge, ProviderEntryPills, Music as Pt, PtzPanel, Shield as Q, CloudFog as Qn, QrCode, LocateFixed as Qt, Sunrise as R, RECONNECT_POLICY, RECORDED_PLAYBACK_MODES, RECORD_ENTRY_KIND_PARAM, RECORD_ENTRY_OWNER_PARAM, RIGHT, ROI_AREA_WARN_FRACTION, ROLE_DESCRIPTOR, ROOT_DETECTOR_STEP_ID, RadialGauge, RecordEntriesHub, RecordEntriesPanel, RecordedPlaybackProvider, RecordingPanel, ResponseLog, RetrainReviewBadge, Download as Rn, RoleDisplayDefaultsFromServer, RoleDisplayDefaultsProvider, RoleNodePill, RootModelSourceControl, RootSuppliedModelNote, Ban as Rr, MousePointerClick as Rt, RunReport, Unlink2 as S, SCENE_CAPTURE_VARIANTS, SECRET_MASK_PLACEHOLDER, SECRET_REVEAL_MS, SECTION_BODY, SECTION_CARD, SECTION_HEADER, SETTING_ROW, SETTING_ROW_LABEL, SETTING_ROW_STACK_BREAKPOINT, SETTING_ROW_VALUE, SETTING_ROW_VALUE_TEXT, SNAPSHOT_MEDIA_PATH, SPLIT_PANEL_OUTER, SPLIT_PANEL_SIDE, STACK_GAP, STATE_COLOR, STEP_DOCK_WIDTH_PX, STORAGE_RECORDS_KIND_PARAM, STORAGE_RECORDS_OWNER_PARAM, SceneMonitorEditor, ScopePicker, ScriptHeroCard, ScriptInlineControl, ScrollArea, SecretFieldControl, SecretRevealProvider, SectionCard, SectionToolbar, SectionedPage, SegmentedChoice, Select, SelectedChip, SemanticBadge, SendFrameToTrainingButton, SensorHeroCard, SensorInlineControl, SensorValueAtom, Separator, SettingRow, Sidebar, SidebarItem, Skeleton, SlideToggle, Gamepad2 as Sn, SnapshotButton, SortHeaderButton, Bus as Sr, Plus as St, StableTabPanel, StatCard, StateValuesStream, StatusBadge, StepDetailDock, StepInspectorPanel, StepModelRow, StepTimings, Stepper, StorageRecordsHub, StorageRecordsPanel, StreamBrokerSelector, StreamDebugOverlay, StreamPanel, Switch, SwitchHeroCard, SwitchInlineControl, SwitchPanel, SystemProvider, Truck as T, TABLE_SCROLL_MAX_H, TEXT_FIELD_LABEL, TEXT_HINT, TEXT_METRIC, TEXT_SECTION_LABEL, TEXT_VALUE, TIMEZONES, Tabs, TabsContent, TabsList, TabsTrigger, TapToggle, ThemeProvider, ThermostatHeroCard, ThermostatInlineControl, TimezoneSelector, FlaskConical as Tn, Tooltip, TooltipContent, TooltipTrigger, Bot as Tr, TrainingBaseModelPicker, TrainingCollectionPicker, Pipette as Tt, Sprout as U, UiTextProvider, UiTrans, Crosshair as Un, UnitPicker, ArrowLeft as Ur, Mic as Ut, Star as V, VacuumHeroCard, VacuumInlineControl, ValueReadout, ValveHeroCard, ValveInlineControl, VersionBadge, Dog as Vn, VodPlaybackProvider, ArrowUpToLine as Vr, Minus as Vt, Sparkles as W, WaterHeaterHeroCard, WaterHeaterInlineControl, WeatherHeroCard, WeatherInlineControl, WidgetMetricCard, WidgetPanel, WidgetRegistryProvider, WidgetSlot, Cpu as Wn, ArrowDown as Wr, MessageSquare as Wt, Siren as X, CloudRain as Xn, Lock as Xt, SkipBack as Y, CloudSnow as Yn, Mail as Yt, Ship as Z, CloudLightning as Zn, ZoneEditingProvider, LockOpen as Zt, UtensilsCrossed as _, Hammer as _n, Cat as _r, QrCode$1 as _t, Wrench as a, acceleratorLabel, acceleratorShortLabel, agentColumnKey, allDeviceTypeFilterOptions, LayoutGrid as an, applyFleetQueryDefaults, applyPickerFilters, CirclePause as ar, ariaSortForColumn, assignNodeColorId, Search as at, UserCheck as b, badgeFor, bindsToModel, GraduationCap as bn, Camera as br, PowerOff as bt, buildColorByNodeId, buildPeerConnectionConfig, buildStepTreeFromSchema, Wifi as c, catalogHasDraft, childEntityId, childListName, chipOverflow, classifyAddressScope, classifyCapability, classifySessionVerdict, clearPickerGroup, clusterRootModelIds, cn, colorIdForNode, columnsForContext, compareSrflxMappings, computePageButtons, containerChildToRef, countableDevices, coverHighlight, coverageLine, CircleCheckBig as cr, createAddonI18n, createSharedContext, createTheme, Save as ct, currentAddonLanguage, cursorFractionFor, WifiLow as d, darkColors, dataTableFacetGroups, dataTableFacets, defaultOfField, defaultSelectClusterRoots, defaultSingleClusterRoot, defaultTheme, defaultUiText, deriveDeviceKind, deriveWebrtcDebugStats, describeDeviceSelector, deviceIntegrationResolver, deviceListStateOf, deviceMatchesFilter, deviceOptionLabel, deviceRoleMeta, deviceRoleMetaOf, deviceTypeLabel, deviceTypeMeta, deviceTypeMetaOf, devicesToOptions, ImageOff as dn, dockBox, ChevronsDownUp as dr, draftFromQuery, RotateCw as dt, effectivePageSize, emptyDevicesWidens, emptySessionRun, List as en, ensureMfHostInit, Clapperboard as er, ShieldCheck as et, eventKindLabel, WifiHigh as f, filterDataTableRows, filterDeviceOptions, filterOptions as filterOptionSelectOptions, filterPickerDevices, finalizeSessionRun, findTimezone, flattenPickerGrouping, flattenPickerRows, fleetViewOf, House as fn, formatControlDateTime, formatLastSeen, formatNumeric, formatSettingValue, ChevronUp as fr, freezeVerdict, RotateCcw as ft, fuzzyMatch, Vibrate as g, getClassColor, getPhaseVisual, Hand as gn, Check as gr, groupAgentColumns, groupChildrenByLayout, groupPickerDevices, groupPickerDevicesBy, Radar as gt, Volume2 as h, hardwareLabel, HardDrive as hn, ChevronDown as hr, RadioTower as ht, hubOrigin, hubPath, hubUrl, hubWsUrl, humanDuration, humidifierTint, X as i, iconGlyphsFailed, iconGlyphsLoaded, Leaf as in, initialScrubState, insertAtSelection, CirclePlus as ir, isAbsentProvider, isDataTableFilterActive, isFieldVisible, isGroupExpanded, isKeychainFieldValue, isRedactedSecret, isSecretField, isValueField, Server as it, Tractor as j, Fan as jn, BellRing as jr, Package as jt, Trash2 as k, Film as kn, Bike as kr, PawPrint as kt, WifiZero as l, lawnMowerActivityMeta, lightColors, Inbox as ln, loadIconGlyphs, loadRemoteBundle, CircleAlert as lr, Sailboat as lt, lucideExportName, VolumeX as m, makeScrubBridge, mapRootDetectorPlacements, mergeSecretForSubmit, metadataEntries, metadataString, mirror, Hash as mn, mountAddonPage, mountPath, ChevronLeft as mr, Radio as mt, ZoomIn as n, nextGridPosition, nextReconnectAction, nextSort, nextSortDirection, nextTableSort, Link2 as nn, nodeColorClass, nodeSoftBgClass, nodeTextColorClass, normalizeForSearch, normalizeLanguage, CircleStop as nr, Share2 as nt, Workflow as o, offListSelections, Laugh as on, openTopLayer, optionSearchText as optionSelectSearchText, CircleDot as or, orphanDeviceLabel, ScrollText as ot, overrideEntityIdFromLink, Waves as p, pageRows, pageSizeLabel, paginateRows, parentDetailOf, parseIceCandidate, parsePickerGroupBy, parseRecordedServerMessage, partitionSelected as partitionOptionSelectSelected, partitionSuggested, pickerFacetFilterShown, pickerFacetKey, pickerFacetOptions, pickerFiltersActive, pickerGroupKey, pickerHiddenSelectedCount, pickerLocationKey, pickerQueryTokens, pickerRowFacts, pickerSearchText, pickerZoneFilterSuspended, pinnedStreamChoices, placePopover, Heater as pn, ChevronRight as pr, providerIcons, RefreshCw as pt, SlidersHorizontal as q, Cloud as qn, AirVent as qr, Maximize2 as qt, Zap as r, readStoredGroupBy, reduceSessionRun, registerAddonBundle, renderMarkup, renderTagged, resetHubMountForTests, resetPickerFilters, resolveContainerPrimary, resolveControlAlign, resolveDeviceControl, resolveDeviceIntegration, resolveDisplayIcon, resolveEffectiveDefaultModel, resolveEffectiveStepModel, resolveEventKindIcon, resolveSearchable as resolveOptionSelectSearchable, resolveParentNames, resolvePrimaryChild, resolveSelectedDevices, resolveSensorDisplay, resolveStepDefaultModel, retrainReviewBadgeLook, Lightbulb as rn, roiTooLarge, rootSourceState, routerBasename, CircleQuestionMark as rr, Settings as rt, Wind as s, sameLocationSuggestions, scrubReducer, searchSteps, secretDisplayValue, secretSubmitValue, selectPickerGroup, selectedDeviceOptions, serializeRecordedCommand, settingsModelIdFor, shouldCommit, shouldEmit, shouldShowAddNewFooter, shouldShowUseQueryRow, shouldUseSingleNode, showsNoCamerasHint, Info as sn, sortRows, sortRowsByColumn, CircleCheck as sr, Scan as st, statusIcons, statusLine, stepFieldDomId, stepHasModelForFormat, stepLocalFields, stepModelOptions, stripParentNamePrefix, summarizeHubCandidates, ZoomOut as t, tabForSelector, tankAlert, themeToCss, themeToRootCss, ListChecks as tn, toStationaryOverlayBox, toggleDataTableFacet, toggleDataTableGroupFacet, togglePickerDevice, togglePickerKey, CircleX as tr, trainingRefusalText, translateAddonKey, trpc, ShieldAlert as tt, typeLabel, WifiOff as u, Image as un, ChevronsUpDown as ur, useAccessoriesGetStatus, useAccessoriesSetChildHidden, useAddonPagesListPages, useAddonSettingsGetDeviceSettings, useAddonSettingsGetGlobalSettings, useAddonSettingsGetIntegrationSettings, useAddonSettingsUpdateDeviceSettings, useAddonSettingsUpdateGlobalSettings, useAddonT, useAddonWidgetsListWidgets, useAddonsApplyAutoUpdateToAll, useAddonsCancelJob, useAddonsCustom, useAddonsForceRefresh, useAddonsGetAddonAutoUpdate, useAddonsGetAutoUpdateSettings, useAddonsGetJob, useAddonsGetLastRestart, useAddonsGetLogs, useAddonsGetVersions, useAddonsInstallFromWorkspace, useAddonsInstallPackage, useAddonsIsWorkspaceAvailable, useAddonsList, useAddonsListCapabilityProviders, useAddonsListFrameworkPackages, useAddonsListInstallations, useAddonsListJobs, useAddonsListPackages, useAddonsListUpdates, useAddonsListWorkspacePackages, useAddonsOnAddonLogs, useAddonsReloadPackages, useAddonsRestartAddon, useAddonsRestartServer, useAddonsRetryLoad, useAddonsRollbackPackage, useAddonsSearchAvailable, useAddonsSetAddonAutoUpdate, useAddonsSetAutoUpdateSettings, useAddonsSetCapabilityProviderEnabled, useAddonsStartJob, useAddonsUninstallPackage, useAddonsUpdatePackage, useAirQualitySensorGetStatus, useAlarmPanelArm, useAlarmPanelDisarm, useAlarmPanelGetStatus, useAlarmPanelTrigger, useAlert, useAlertsDismiss, useAlertsEmit, useAlertsGetUnreadCount, useAlertsList, useAlertsMarkAllRead, useAlertsMarkRead, useAlertsUpdate, useAllWidgets, useAmbientLightSensorGetStatus, useAudioAnalysisApplyDeviceSettingsPatch, useAudioAnalysisGetDeviceLiveContribution, useAudioAnalysisGetDeviceSettingsContribution, useAudioAnalysisResolveDeviceSettings, useAudioAnalyzerAnalyseChunk, useAudioAnalyzerAttachDevice, useAudioAnalyzerClassify, useAudioAnalyzerDetachDevice, useAudioAnalyzerDispose, useAudioAnalyzerIsReady, useAudioAnalyzerReprobeAudioEngine, useAudioCodecCanHandle, useAudioCodecCloseSession, useAudioCodecCreateDecodeSession, useAudioCodecCreateEncodeSession, useAudioCodecFlushEncode, useAudioCodecListActiveSessions, useAudioCodecListSupportedCodecs, useAudioCodecPullEncoded, useAudioCodecPullPcm, useAudioCodecPushEncodedFrame, useAudioCodecPushPcm, useAudioMetricsGetCurrentSnapshot, useAudioMetricsGetHistory, useAutomationControlDisable, useAutomationControlEnable, useAutomationControlGetStatus, useAutomationControlTrigger, useBackupCancel, useBackupCheckBackupKey, useBackupDelete, useBackupDeleteSchedule, useBackupDisableEncryption, useBackupGetEncryption, useBackupGetEntries, useBackupList, useBackupListArchives, useBackupListAvailableDatabases, useBackupListDestinations, useBackupListLocations, useBackupListRuns, useBackupListSchedules, useBackupPreviewSchedule, useBackupRestore, useBackupSetupEncryption, useBackupTrigger, useBackupUpsertDestinationPolicy, useBackupUpsertSchedule, useBatteryGetStatus, useBatteryWakeForStream, useBinaryGetStatus, useBrightnessGetStatus, useBrightnessSetBrightness, useBrokerAdd, useBrokerGet, useBrokerGetBrokerConfig, useBrokerGetSettings, useBrokerGetSettingsSchema, useBrokerGetState, useBrokerGetStatus, useBrokerList, useBrokerListProviders, useBrokerPublish, useBrokerRemove, useBrokerSetSettings, useBrokerSubscribe, useBrokerTestConnection, useBrokerTestSettings, useBrokerUnsubscribe, useButtonPress, useCalendarsGetPreferences, useCalendarsListCalendars, useCalendarsListEvents, useCalendarsSetCalendarPreference, useCameraCredentialsGetCredentials, useCameraCredentialsGetStatus, useCameraGridLayoutApplyDeviceSettingsPatch, useCameraGridLayoutGetDeviceLiveContribution, useCameraGridLayoutGetDeviceSettingsContribution, useCameraGridLayoutGetLayout, useCameraGridLayoutSaveLayout, useCameraPipelineConfigApplyDeviceSettingsPatch, useCameraPipelineConfigGetDeviceLiveContribution, useCameraPipelineConfigGetDeviceSettingsContribution, useCameraStreamsGetBrokerStreams, useCameraStreamsGetCameraStreams, useCameraStreamsGetProfileRtspEntries, useCameraStreamsGetRtspEntries, useCameraStreamsPickStream, useCapabilityPresence, useCarbonMonoxideGetStatus, useClimateControlGetStatus, useClimateControlSetFanMode, useClimateControlSetMode, useClimateControlSetPreset, useClimateControlSetSwingHorizontal, useClimateControlSetSwingVertical, useClimateControlSetTarget, useClimateControlSetTargetHumidity, useClimateControlSetTargetRange, useClusterNodes, useClusterTopology, useColorGetStatus, useColorSetColor, useConfirm, useConnectionTestDescribeTest, useConnectionTestTestSettings, useConnectivityGetStatus, useConsumablesGetStatus, useConsumablesReset, useContactGetStatus, useContainerChildren, useControlGetStatus, useControlSetValue, useCoreBlocksCompile, useCoreBlocksCreate, useCoreBlocksCreateComposition, useCoreBlocksDelete, useCoreBlocksGet, useCoreBlocksGetBlockSettings, useCoreBlocksGetComposition, useCoreBlocksGetCustomization, useCoreBlocksGetTypeDefs, useCoreBlocksList, useCoreBlocksListComposableCaps, useCoreBlocksListCompositions, useCoreBlocksMigrateRawSecrets, useCoreBlocksRestart, useCoreBlocksSetEnabled, useCoreBlocksUpdate, useCoreBlocksUpdateBlockSettings, useCoreBlocksUpdateComposition, useCoreBlocksValidateComposition, useCoverClose, useCoverGetStatus, useCoverOpen, useCoverSetPosition, useCoverSetTiltPosition, useCoverStop, useCustomFieldRenderer, useDataTableFilter, useDayNightGetOptions, useDayNightGetStatus, useDayNightSetSettings, useDebouncedString, useDecoderGetInfo, useDecoderReprobeHwaccel, useDetectionPipelineApplyDeviceSettingsPatch, useDetectionPipelineGetDeviceLiveContribution, useDetectionPipelineGetDeviceSettingsContribution, useDevShell, useDevice, useDeviceAdminLink, useDeviceAdminLinkGetAdminLink, useDeviceAdoptionAdopt, useDeviceAdoptionGetCandidate, useDeviceAdoptionGetStatus, useDeviceAdoptionListCandidateFilters, useDeviceAdoptionListCandidates, useDeviceAdoptionRefresh, useDeviceAdoptionRelease, useDeviceAdoptionResync, useDeviceAutotrack, useDeviceBattery, useDeviceCapSlice, useDeviceCapability, useDeviceCredentialsDeleteDeviceCredential, useDeviceCredentialsGetDeviceCaStatus, useDeviceCredentialsGetDeviceCertificateSettings, useDeviceCredentialsListDeviceCredentials, useDeviceCredentialsRenameDeviceCredential, useDeviceCredentialsRevokeDeviceCredential, useDeviceCredentialsSetDeviceCertificateSettings, useDeviceCredentialsStartEnrollment, useDeviceDetections, useDeviceDiscoveryAdoptDevice, useDeviceDiscoveryGetStatus, useDeviceDiscoveryListDiscovered, useDeviceDiscoveryRefreshDiscovery, useDeviceDiscoveryReleaseDevice, useDeviceExportApplyDeviceSettingsPatch, useDeviceExportExposeDevice, useDeviceExportGetDeviceLiveContribution, useDeviceExportGetDeviceSettingsContribution, useDeviceExportGetStatus, useDeviceExportListExposedDevices, useDeviceExportListSupportedDeviceKinds, useDeviceExportUnexposeDevice, useDeviceExtensionListCandidates, useDeviceExtensionListSlots, useDeviceExtensionListSources, useDeviceExtensionSetSlot, useDeviceHistoryDeclareSeries, useDeviceHistoryGetDeviceEnabled, useDeviceHistoryGetStatus, useDeviceHistoryListNodeSeries, useDeviceHistoryListSeries, useDeviceHistoryQuery, useDeviceHistoryQueryNode, useDeviceHistoryRecord, useDeviceHistoryRecordBuckets, useDeviceHistorySetDeviceEnabled, useDeviceId, useDeviceListPageSize, useDeviceManagerAddLocation, useDeviceManagerAdoptDevice, useDeviceManagerAdoptionAdopt, useDeviceManagerAdoptionCancelJob, useDeviceManagerAdoptionListCandidateFilters, useDeviceManagerAdoptionListCandidates, useDeviceManagerAdoptionListJobs, useDeviceManagerAdoptionRefresh, useDeviceManagerAdoptionRelease, useDeviceManagerAdoptionResync, useDeviceManagerAdoptionStartJob, useDeviceManagerAllocateDeviceId, useDeviceManagerApplyInitialMeta, useDeviceManagerCleanupDeletedDevicesData, useDeviceManagerCreateDevice, useDeviceManagerDisable, useDeviceManagerDiscoverAllProviders, useDeviceManagerDiscoverDevices, useDeviceManagerDiscoverProvider, useDeviceManagerDiscoveryProviders, useDeviceManagerEnable, useDeviceManagerGetAllBindings, useDeviceManagerGetBindings, useDeviceManagerGetBindingsBatch, useDeviceManagerGetChildren, useDeviceManagerGetChildrenBatch, useDeviceManagerGetConfigSchema, useDeviceManagerGetCreationSchema, useDeviceManagerGetDevice, useDeviceManagerGetDeviceAggregate, useDeviceManagerGetDeviceLiveInfoAggregate, useDeviceManagerGetDeviceSettingsAggregate, useDeviceManagerGetDeviceStatusAggregate, useDeviceManagerGetDeviceStatusAggregateBatch, useDeviceManagerGetLinkedDevices, useDeviceManagerGetLinkedDevicesBatch, useDeviceManagerGetRoleDisplayDefaults, useDeviceManagerGetSettingsSchema, useDeviceManagerGetStreamProfileMap, useDeviceManagerGetStreamSources, useDeviceManagerGetWireableFields, useDeviceManagerGetWrapperActivation, useDeviceManagerListAll, useDeviceManagerListBindableCapsForDeviceType, useDeviceManagerListDeletedSince, useDeviceManagerListDeviceIdsByCaps, useDeviceManagerListLocationDescriptions, useDeviceManagerListLocationIcons, useDeviceManagerListLocations, useDeviceManagerListPersistedByAddon, useDeviceManagerListSiteZones, useDeviceManagerListWrappersForCap, useDeviceManagerLoadConfig, useDeviceManagerLoadMeta, useDeviceManagerLoadRuntimeState, useDeviceManagerMigrateDevice, useDeviceManagerPersistConfig, useDeviceManagerProbeStreams, useDeviceManagerProviderCreationType, useDeviceManagerProviderDiscoveryParamsSchema, useDeviceManagerRegisterDevice, useDeviceManagerRemove, useDeviceManagerRemoveByIntegration, useDeviceManagerRemoveDevice, useDeviceManagerRemoveLocation, useDeviceManagerRemoveSiteZone, useDeviceManagerRenameLocation, useDeviceManagerRenameSiteZone, useDeviceManagerRunDeviceAction, useDeviceManagerSetChildLayout, useDeviceManagerSetDisabled, useDeviceManagerSetDisplay, useDeviceManagerSetIntegrationId, useDeviceManagerSetLinkDeviceId, useDeviceManagerSetLocation, useDeviceManagerSetLocationDescription, useDeviceManagerSetLocationIcon, useDeviceManagerSetLocationZone, useDeviceManagerSetMetadata, useDeviceManagerSetName, useDeviceManagerSetPrimaryChildEntityId, useDeviceManagerSetRole, useDeviceManagerSetRoleDisplayDefaults, useDeviceManagerSetSiteZone, useDeviceManagerSetStreamProfileMap, useDeviceManagerSetType, useDeviceManagerSetWrapperActive, useDeviceManagerTestCreationField, useDeviceManagerTestField, useDeviceManagerUpdateConfig, useDeviceManagerUpdateDeviceField, useDeviceManagerUpdateDeviceFieldsBatch, useDeviceNetworkLink, useDeviceOpsGetConfigEntries, useDeviceOpsGetRawState, useDeviceOpsGetSettingsSchema, useDeviceOpsGetStreamSources, useDeviceOpsRemoveDevice, useDeviceOpsRunAction, useDeviceOpsSetConfig, useDeviceProviderAdoptDiscoveredDevice, useDeviceProviderCreateDevice, useDeviceProviderDiscoverDevices, useDeviceProviderGetChildCreationSchema, useDeviceProviderGetDevices, useDeviceProviderGetDiscoveryParamsSchema, useDeviceProviderGetManualCreationType, useDeviceProviderGetStatus, useDeviceProviderReloadDevice, useDeviceProviderStart, useDeviceProviderStop, useDeviceProviderSupportsDiscovery, useDeviceProviderSupportsManualCreation, useDeviceProviderTestCreationField, useDeviceProxy, useDeviceQuickDetailOpen, useDeviceSnapshot, useDeviceSnapshotImage, useDeviceState, useDeviceStateClaimFields, useDeviceStateGetAllSnapshots, useDeviceStateGetCapSlice, useDeviceStateGetNativeCapSlice, useDeviceStateGetSnapshot, useDeviceStateListClaims, useDeviceStatePatchOwnedFields, useDeviceStateReleaseClaim, useDeviceStateSetCapSlice, useDeviceStateSlice, useDeviceStatusGetStatus, useDeviceWebrtc, useDevices, useDishwasherGetStatus, useDishwasherPause, useDishwasherSetHalfLoad, useDishwasherSetHygienePlus, useDishwasherSetOption, useDishwasherSetPower, useDishwasherSetProgram, useDishwasherStart, useDishwasherStop, useDisplayIconResolver, useDoorbellEvents, useDoorbellGetStatus, useEnumSensorGetStatus, useEventEmitterGetStatus, useEventInvalidation, useEventStreamLatest, useEventStreamMap, useFaceGalleryAssignFace, useFaceGalleryAssignFaces, useFaceGalleryAuditIdentitySamples, useFaceGalleryCreateIdentity, useFaceGalleryDeleteFace, useFaceGalleryDeleteIdentity, useFaceGalleryGetFaceByTrack, useFaceGalleryGetFaceMedia, useFaceGalleryListIdentities, useFaceGalleryListIdentitySamples, useFaceGalleryListRecentFaces, useFaceGalleryRemoveSample, useFaceGalleryRenameIdentity, useFaceGallerySuggestFaceClusters, useFaceGalleryUnassignFace, useFaceGalleryUnassignFaces, useFanControlGetStatus, useFanControlSetDirection, useFanControlSetOscillating, useFanControlSetPercentage, useFanControlSetPreset, useFeatureProbeGetStatus, useFloodGetStatus, useGasGetStatus, useHeatingValveGetStatus, useHumidifierGetStatus, useHumidifierSetMode, useHumidifierSetOn, useHumidifierSetTargetHumidity, useHumiditySensorGetStatus, useIconGlyphsVersion, useImageGetStatus, useImageSettingsGetOptions, useImageSettingsGetStatus, useImageSettingsSetSettings, useIntegrationsCreate, useIntegrationsDelete, useIntegrationsGet, useIntegrationsGetAvailableTypes, useIntegrationsGetByAddonId, useIntegrationsGetSettings, useIntegrationsList, useIntegrationsSetSettings, useIntegrationsTestConnection, useIntegrationsUpdate, useIntercomEndTalkSession, useIntercomGetStatus, useIntercomHandleAnswer, useIntercomPushTalkAudio, useIntercomStartSession, useIntercomStartTalkSession, useIntercomStopSession, useIsMidWidth, useIsMobile, useItemFormUrl, useKeychainAdminAcknowledgeReset, useKeychainAdminDeleteOrphans, useKeychainAdminDownloadRecoveryKey, useKeychainAdminImportSecret, useKeychainAdminListAudit, useKeychainAdminListSecrets, useKeychainAdminPurgeRetiredKeys, useKeychainAdminResetKeychain, useKeychainAdminResetReport, useKeychainAdminReveal, useKeychainAdminRotateMasterKey, useKeychainAdminSetSystemSecret, useKeychainAdminStatus, useLawnMowerControlDock, useLawnMowerControlGetStatus, useLawnMowerControlPause, useLawnMowerControlStartMowing, useLiveBuffer, useLiveEvent, useLlmCancel, useLlmDeleteModel, useLlmDeleteProfile, useLlmGenerate, useLlmGenerateVision, useLlmGetDefaults, useLlmGetRuntimeStatus, useLlmGetUsage, useLlmInstallModel, useLlmListModelCatalog, useLlmListModels, useLlmListNodeModels, useLlmListProfileKinds, useLlmListProfiles, useLlmListRuntimeNodes, useLlmMigrateRawSecrets, useLlmResolveModelRef, useLlmSetDefault, useLlmStartRuntime, useLlmStopRuntime, useLlmTestProfile, useLlmUpsertProfile, useLocalNetworkAddCustomAddress, useLocalNetworkDownloadCa, useLocalNetworkGetAddresses, useLocalNetworkGetAllowedAddresses, useLocalNetworkGetConnectionEndpoints, useLocalNetworkGetHubAddresses, useLocalNetworkGetNotificationEndpoint, useLocalNetworkGetPreferred, useLocalNetworkGetTlsStatus, useLocalNetworkGetViewerEndpoints, useLocalNetworkList, useLocalNetworkRegenerateCertificate, useLocalNetworkRemoveCustomAddress, useLocalNetworkResetAllowlistToBestMatch, useLocalNetworkRevertToGeneratedCertificate, useLocalNetworkSetAddressRole, useLocalNetworkSetAllowedAddresses, useLocalNetworkSetNotificationEndpoint, useLocalNetworkSetViewerEndpoints, useLocalNetworkUploadCertificate, useLocalNetworkUseStoredUploadedCertificate, useLockControlGetStatus, useLockControlLock, useLockControlOpen, useLockControlUnlock, useMediaPlayerGetStatus, useMediaPlayerNext, useMediaPlayerPause, useMediaPlayerPlay, useMediaPlayerPlayMedia, useMediaPlayerPrevious, useMediaPlayerSeek, useMediaPlayerSelectSource, useMediaPlayerSetMute, useMediaPlayerSetRepeat, useMediaPlayerSetShuffle, useMediaPlayerSetVolume, useMediaPlayerStop, useMeshNetworkGetStatus, useMeshNetworkJoin, useMeshNetworkLeave, useMeshNetworkListPeers, useMeshNetworkLogout, useMeshNetworkStartLogin, useMeshNetworkTestConnection, useMetricsProviderCollectSnapshot, useMetricsProviderGetAddonStats, useMetricsProviderGetCached, useMetricsProviderGetCpuTemperature, useMetricsProviderGetCurrent, useMetricsProviderGetDiskSpace, useMetricsProviderGetGpuInfo, useMetricsProviderGetLoadSeries, useMetricsProviderGetProcessStats, useMetricsProviderListAddonInstances, useMetricsProviderListNodeProcesses, useMotionDetectionAnalyze, useMotionDetectionApplyDeviceSettingsPatch, useMotionDetectionGetDeviceLiveContribution, useMotionDetectionGetDeviceSettingsContribution, useMotionDetectionRemoveCamera, useMotionDetectionReset, useMotionGetStatus, useMotionIsDetected, useMotionTriggerGetStatus, useMotionTriggerSetMotionTrigger, useMotionZonesGetOptions, useMotionZonesGetStatus, useMotionZonesSetZone, useMqttBrokerAddBroker, useMqttBrokerGetBrokerConfig, useMqttBrokerGetStatus, useMqttBrokerListBrokers, useMqttBrokerRemoveBroker, useMqttBrokerStartEmbeddedBroker, useMqttBrokerStopEmbeddedBroker, useMqttBrokerTestConnection, useNativeObjectDetectionGetOptions, useNativeObjectDetectionGetStatus, useNativeObjectDetectionSetEnabled, useNativeObjectDetectionSetSettings, useNavigation, useNavigationGetFeatures, useNavigationGetStatus, useNavigationGoToPoint, useNavigationListActions, useNavigationMove, useNavigationPlaySound, useNavigationRunAction, useNavigationSetLightLevel, useNavigationSetLightMode, useNavigationSetLightOn, useNavigationStop, useNetworkAccessGetEndpoint, useNetworkAccessGetStatus, useNetworkAccessListEndpoints, useNetworkAccessStart, useNetworkAccessStop, useNetworkLinkGetStatus, useNetworkQualityGetAllStats, useNetworkQualityGetDeviceStats, useNetworkQualityReportClientStats, useNodesClusterAddonStatus, useNodesDeployAddon, useNodesDirectory, useNodesExecuteQuery, useNodesGetCapUsageGraph, useNodesGetNodeAddons, useNodesRenameNode, useNodesRestartAddon, useNodesRestartNode, useNodesRestartProcess, useNodesSetProcessLogLevel, useNodesShutdownNode, useNodesTopology, useNodesUndeployAddon, useNotificationOutputDeleteTarget, useNotificationOutputDiscoverTargets, useNotificationOutputGetTarget, useNotificationOutputListTargetKinds, useNotificationOutputListTargets, useNotificationOutputProbeTargetConfig, useNotificationOutputSend, useNotificationOutputSetTargetEnabled, useNotificationOutputTestTarget, useNotificationOutputUpsertTarget, useNotificationRulesActivateAlarmProfile, useNotificationRulesCancelSnooze, useNotificationRulesCreateAlarmProfile, useNotificationRulesCreateRule, useNotificationRulesCreateSequence, useNotificationRulesCreateSnooze, useNotificationRulesDeleteAlarmProfile, useNotificationRulesDeleteRule, useNotificationRulesDeleteSequence, useNotificationRulesGetAlarmConfig, useNotificationRulesGetAlarmSensors, useNotificationRulesGetClipRetentionAsks, useNotificationRulesGetConditionCatalog, useNotificationRulesGetHistory, useNotificationRulesGetRule, useNotificationRulesGetRuleLastRuns, useNotificationRulesGetSequence, useNotificationRulesGetTemplateCatalog, useNotificationRulesListDeviceMutes, useNotificationRulesListRules, useNotificationRulesListSequences, useNotificationRulesListSnoozes, useNotificationRulesPreviewStateSummary, useNotificationRulesPreviewTemplate, useNotificationRulesRenameAlarmProfile, useNotificationRulesResolveArtifactUrl, useNotificationRulesSetAlarmConfig, useNotificationRulesSetDeviceMuted, useNotificationRulesSetRuleEnabled, useNotificationRulesTestRule, useNotificationRulesUpdateRule, useNotificationRulesUpdateSequence, useNotifierCancel, useNotifierGetStatus, useNotifierSend, useNumericSensorGetStatus, useOidcConnectionsConnectionFormSchema, useOidcConnectionsCreateConnection, useOidcConnectionsDeleteConnection, useOidcConnectionsListConnections, useOidcConnectionsUpdateConnection, useOptimisticSlice, useOptionalSystem, useOptionalWidgetRegistry, useOsdGetStatus, useOsdManagerClearSlotBinding, useOsdManagerCopyDeviceConfiguration, useOsdManagerDeleteTemplate, useOsdManagerGetConditionSupport, useOsdManagerGetDeviceOsd, useOsdManagerGetSourceCatalog, useOsdManagerListTemplates, useOsdManagerPreviewSlot, useOsdManagerRenderDevice, useOsdManagerSetSlotBinding, useOsdManagerSetSlotCameraEnabled, useOsdManagerUpsertTemplate, useOsdSetOverlay, usePTZ, usePersistedPageSize, usePetFeederCallPet, usePetFeederCancelFeed, usePetFeederFeed, usePetFeederGetStatus, usePetFeederMarkFoodReplenished, usePetFeederPlaySound, usePetFeederResetDesiccant, usePetFeederSetChildLock, usePetFeederSetFeedSound, usePetFeederSetIndicatorLight, usePetFeederSetVolume, usePickerSiteZones, usePipelineAnalyticsAddRetrainFrameFromRecording, usePipelineAnalyticsAddRetrainFramesToCollection, usePipelineAnalyticsApplyDeviceSettingsPatch, usePipelineAnalyticsBackfillRetrainOrigins, usePipelineAnalyticsCancelRelocateMedia, usePipelineAnalyticsCancelStorageMigrationMove, usePipelineAnalyticsClearTrackRelation, usePipelineAnalyticsClearTracks, usePipelineAnalyticsCompleteRetrainTrack, usePipelineAnalyticsCountRelocatableMedia, usePipelineAnalyticsCountUnstampedEventMedia, usePipelineAnalyticsCreateRetrainCollection, usePipelineAnalyticsDeleteDeviceEvents, usePipelineAnalyticsDeleteRetrainCollection, usePipelineAnalyticsDeleteTracks, usePipelineAnalyticsDeselectRetrainFrame, usePipelineAnalyticsGetActiveTracks, usePipelineAnalyticsGetAudioEvents, usePipelineAnalyticsGetDeviceLiveContribution, usePipelineAnalyticsGetDeviceSettingsContribution, usePipelineAnalyticsGetEventDensity, usePipelineAnalyticsGetEventDensityBatch, usePipelineAnalyticsGetEventMedia, usePipelineAnalyticsGetEventMediaFootprintByKind, usePipelineAnalyticsGetEventStoreFootprint, usePipelineAnalyticsGetKeyEvents, usePipelineAnalyticsGetKeyEventsBatch, usePipelineAnalyticsGetMediaReclaimStatus, usePipelineAnalyticsGetMotionEvents, usePipelineAnalyticsGetObjectEmbeddingRebuildStatus, usePipelineAnalyticsGetObjectEvents, usePipelineAnalyticsGetRetrainCorpusKpi, usePipelineAnalyticsGetRetrainExportUrl, usePipelineAnalyticsGetRetrainFrameImage, usePipelineAnalyticsGetSensorEvents, usePipelineAnalyticsGetStorageMigrationMoveStatus, usePipelineAnalyticsGetTrack, usePipelineAnalyticsGetTrackMedia, usePipelineAnalyticsGetTrainingExportSummary, usePipelineAnalyticsGetTrainingExportUrl, usePipelineAnalyticsListArchivedDebugNotes, usePipelineAnalyticsListBirthDecisions, usePipelineAnalyticsListEventKinds, usePipelineAnalyticsListEventKindsBatch, usePipelineAnalyticsListEventMedia, usePipelineAnalyticsListOpsLog, usePipelineAnalyticsListRecentTracks, usePipelineAnalyticsListRelocateMediaJobs, usePipelineAnalyticsListRetrainAnnotations, usePipelineAnalyticsListRetrainAssistProfiles, usePipelineAnalyticsListRetrainCollectionFrames, usePipelineAnalyticsListRetrainCollections, usePipelineAnalyticsListRetrainCorpusPage, usePipelineAnalyticsListRetrainFrames, usePipelineAnalyticsListRetrainStaging, usePipelineAnalyticsListTrackMedia, usePipelineAnalyticsListTrackRelations, usePipelineAnalyticsListTracks, usePipelineAnalyticsOfferRetrainArchive, usePipelineAnalyticsOwnersWithMedia, usePipelineAnalyticsPauseForStorageMigration, usePipelineAnalyticsProposeRetrainAnnotations, usePipelineAnalyticsProposeRetrainAnnotationsWithLlm, usePipelineAnalyticsPruneEvents, usePipelineAnalyticsPruneEventsBefore, usePipelineAnalyticsPruneTracksBefore, usePipelineAnalyticsReadLongTermSeries, usePipelineAnalyticsRebuildObjectEmbeddings, usePipelineAnalyticsReclaimDebugMedia, usePipelineAnalyticsReconcileFromDisk, usePipelineAnalyticsRefreshStorageLocationsForMigration, usePipelineAnalyticsRelocateMedia, usePipelineAnalyticsRemoveRetrainFrameFromCollection, usePipelineAnalyticsRenameRetrainCollection, usePipelineAnalyticsResolveRetrainTrainingCorpus, usePipelineAnalyticsRestageRetrainTrack, usePipelineAnalyticsResumeForStorageMigration, usePipelineAnalyticsSaveRetrainAnnotations, usePipelineAnalyticsSearchObjectEvents, usePipelineAnalyticsSelectRetrainFrames, usePipelineAnalyticsSetRetrainFrameComplete, usePipelineAnalyticsSetTrackFlags, usePipelineAnalyticsSetTrackPurity, usePipelineAnalyticsSetTrackRelation, usePipelineAnalyticsStartStorageMigrationMove, usePipelineAnalyticsWipeAllAnalytics, usePipelineAnalyticsWipeObjectEmbeddings, usePipelineAnalyticsWriteRetrainArchive, usePipelineExecutorCacheFrameInPool, usePipelineExecutorClearDeviceOverrides, usePipelineExecutorClearModelBoundDeviceOverrides, usePipelineExecutorDeleteModel, usePipelineExecutorDownloadModel, usePipelineExecutorGetAddonModels, usePipelineExecutorGetAudioCapabilities, usePipelineExecutorGetAvailableEngines, usePipelineExecutorGetCapabilities, usePipelineExecutorGetDefaultSteps, usePipelineExecutorGetDetectionConfigSchema, usePipelineExecutorGetEffectiveTuning, usePipelineExecutorGetEngineProvisioning, usePipelineExecutorGetGlobalPipelineConfig, usePipelineExecutorGetGlobalSteps, usePipelineExecutorGetInferenceDeviceHealth, usePipelineExecutorGetOrchestratorConfigSchema, usePipelineExecutorGetReferenceAudio, usePipelineExecutorGetReferenceAudioFiles, usePipelineExecutorGetReferenceImage, usePipelineExecutorGetSchema, usePipelineExecutorGetSelectedEngine, usePipelineExecutorGetVideoPipelineSteps, usePipelineExecutorInferCached, usePipelineExecutorKillEngine, usePipelineExecutorListLoadedEngines, usePipelineExecutorListReferenceImages, usePipelineExecutorRearmInferenceDevice, usePipelineExecutorRunAudioTest, usePipelineExecutorRunPipeline, usePipelineExecutorRunPipelineBatch, usePipelineExecutorSetVideoPipelineSteps, usePipelineExecutorSpinEngine, usePipelineExecutorUncacheFrame, usePipelineExecutorValidatePipeline, usePipelineOrchestratorAbortNodeBenchmark, usePipelineOrchestratorApplyAutoTune, usePipelineOrchestratorApplyDeviceSettingsPatch, usePipelineOrchestratorAssignAudio, usePipelineOrchestratorAssignPipeline, usePipelineOrchestratorDeleteNodeBenchmarkResult, usePipelineOrchestratorGetAgentLoad, usePipelineOrchestratorGetAgentSettings, usePipelineOrchestratorGetAudioAssignment, usePipelineOrchestratorGetAudioAssignments, usePipelineOrchestratorGetAudioNodeLoad, usePipelineOrchestratorGetCameraDetectionSource, usePipelineOrchestratorGetCameraMetrics, usePipelineOrchestratorGetCameraSettings, usePipelineOrchestratorGetCameraStatus, usePipelineOrchestratorGetCameraStatuses, usePipelineOrchestratorGetCameraStepOverrides, usePipelineOrchestratorGetCameraSwitches, usePipelineOrchestratorGetCapabilityBindings, usePipelineOrchestratorGetClusterModelChoice, usePipelineOrchestratorGetDeviceLiveContribution, usePipelineOrchestratorGetDeviceSettingsContribution, usePipelineOrchestratorGetEffectiveShares, usePipelineOrchestratorGetGlobalMetrics, usePipelineOrchestratorGetIngestOwner, usePipelineOrchestratorGetNodeBenchmarkCandidates, usePipelineOrchestratorGetNodeBenchmarkPreflight, usePipelineOrchestratorGetNodeBenchmarkStatus, usePipelineOrchestratorGetNodeInferenceDevices, usePipelineOrchestratorGetPipelineAssignment, usePipelineOrchestratorGetPipelineAssignments, usePipelineOrchestratorGetPipelineDevicePin, usePipelineOrchestratorGetPlacementStats, usePipelineOrchestratorGetReconcileFromDiskStatus, usePipelineOrchestratorListAgentSettings, usePipelineOrchestratorListNodeBenchmarkResults, usePipelineOrchestratorPauseForStorageMigration, usePipelineOrchestratorPlanAutoTune, usePipelineOrchestratorRebalance, usePipelineOrchestratorReconcileFromDisk, usePipelineOrchestratorRemoveAgentSettings, usePipelineOrchestratorRequestOccupancyLook, usePipelineOrchestratorResetNodePipelineDefaults, usePipelineOrchestratorResolvePipeline, usePipelineOrchestratorResumeForStorageMigration, usePipelineOrchestratorSetAgentCapabilities, usePipelineOrchestratorSetAgentDecodeLimits, usePipelineOrchestratorSetAgentInferenceDevices, usePipelineOrchestratorSetAgentMaxCameras, usePipelineOrchestratorSetAgentReachableHost, usePipelineOrchestratorSetCameraDetectionSource, usePipelineOrchestratorSetCameraPipelineForAgent, usePipelineOrchestratorSetCameraSensors, usePipelineOrchestratorSetCameraStepOverride, usePipelineOrchestratorSetCameraStepSettings, usePipelineOrchestratorSetCameraStepToggle, usePipelineOrchestratorSetCameraSwitch, usePipelineOrchestratorSetCapabilityBinding, usePipelineOrchestratorSetLoadBalancingShares, usePipelineOrchestratorSetPipelineDevicePin, usePipelineOrchestratorSetShareSource, usePipelineOrchestratorStartNodeBenchmark, usePipelineOrchestratorSuggestShares, usePipelineOrchestratorUnassignAudio, usePipelineOrchestratorUnassignPipeline, usePipelineRunnerAbortNodeBench, usePipelineRunnerAttachCamera, usePipelineRunnerDetachCamera, usePipelineRunnerGetAllCameraMetrics, usePipelineRunnerGetCameraMetrics, usePipelineRunnerGetLocalCameras, usePipelineRunnerGetLocalLoad, usePipelineRunnerGetLocalMetrics, usePipelineRunnerGetNativeCrop, usePipelineRunnerGetNodeBenchStatus, usePipelineRunnerGetParkedTrackFrame, usePipelineRunnerParkTrackFrame, usePipelineRunnerReleaseParkedTrackFrames, usePipelineRunnerReportMotion, usePipelineRunnerRequestOccupancyBurst, usePipelineRunnerRunDetailSubtree, usePipelineRunnerRunStatelessStep, usePipelineRunnerStartNodeBench, usePlateGalleryAssignPlate, usePlateGalleryAssignPlates, usePlateGalleryCorrectPlateText, usePlateGalleryCreateVehicle, usePlateGalleryDeletePlate, usePlateGalleryDeleteVehicle, usePlateGalleryGetPlateByTrack, usePlateGalleryGetPlateMedia, usePlateGalleryListPlates, usePlateGalleryListVehicleSamples, usePlateGalleryListVehicles, usePlateGalleryRemoveVehicleSample, usePlateGalleryRenameVehicle, usePlateGallerySearchPlates, usePlateGallerySuggestPlateClusters, usePlateGalleryUnassignPlate, usePlateGalleryUnassignPlates, usePlayerOverlayLayer, usePlayerOverlayLayers, usePlayerToolbarButton, usePlayerToolbarButtons, usePowerMeterGetStatus, usePresenceGetStatus, usePressureSensorGetStatus, usePrivacyMaskGetOptions, usePrivacyMaskGetStatus, usePrivacyMaskSetAudioEnabled, usePrivacyMaskSetMask, usePrompt, usePtzAutotrackGetSettings, usePtzAutotrackGetStatus, usePtzAutotrackSetEnabled, usePtzAutotrackSetSettings, usePtzCaptureHomeHere, usePtzContinuousMove, usePtzDeletePreset, usePtzGetHomePreset, usePtzGetHomeReturn, usePtzGetOptions, usePtzGetPosition, usePtzGetPresets, usePtzGetStatus, usePtzGoHome, usePtzGoToPreset, usePtzMove, usePtzSavePreset, usePtzSetAutofocus, usePtzSetHomePreset, usePtzSetHomeReturn, usePtzStop, useRebootReboot, useRecordEntriesDeleteEntry, useRecordEntriesListEntries, useRecordEntriesListEntryKinds, useRecordEntriesPutEntry, useRecordedPlayback, useRecordingArchiveApplyDeviceSettingsPatch, useRecordingArchiveCancelRelocateJob, useRecordingArchiveCancelStorageMigrationMove, useRecordingArchiveDeleteFootprint, useRecordingArchiveGetAvailabilityBatch, useRecordingArchiveGetDaysWithRecordingsBatch, useRecordingArchiveGetDeviceConfig, useRecordingArchiveGetDeviceLiveContribution, useRecordingArchiveGetDeviceSettingsContribution, useRecordingArchiveGetPlacement, useRecordingArchiveGetRelocateResidue, useRecordingArchiveGetStatus, useRecordingArchiveGetStorageMigrationMoveStatus, useRecordingArchiveGetStorageUsage, useRecordingArchiveListOpsLog, useRecordingArchiveListRelocateJobs, useRecordingArchiveLocateSegment, useRecordingArchivePauseForStorageMigration, useRecordingArchivePlanStorageRebalance, useRecordingArchivePruneFootage, useRecordingArchiveReadGopBytes, useRecordingArchiveReadSegmentBytes, useRecordingArchiveReadWindowBytes, useRecordingArchiveReconcileLedgerAgainstDisk, useRecordingArchiveRefreshStorageLocationsForMigration, useRecordingArchiveRelocateFootage, useRecordingArchiveRenderClip, useRecordingArchiveRenderGif, useRecordingArchiveRescanStorage, useRecordingArchiveResumeForStorageMigration, useRecordingArchiveSetDeviceConfig, useRecordingArchiveSetDevicePlacement, useRecordingArchiveStartStorageMigrationMove, useRecordingArchiveStartStorageRebalance, useRecordingExportCancelExport, useRecordingExportCreateExport, useRecordingExportDeleteExport, useRecordingExportGetDownloadUrl, useRecordingExportGetExport, useRecordingExportListExports, useRecordingExportReadExportBytes, useRecordingGetAvailability, useRecordingGetDaysWithRecordings, useRecordingGetPlayback, useRecordingGetPlaybackOptions, useRecordingListSources, useRecordingOnboardGetOptions, useRecordingOnboardGetStatus, useRecordingOnboardSetSettings, useRecordingSignalGetStatus, useRemoteComponent, useRoleDisplayDefaults, useSceneMonitorCaptureReference, useSceneMonitorCreateScene, useSceneMonitorDeleteReference, useSceneMonitorDeleteScene, useSceneMonitorGetStatus, useSceneMonitorListScenes, useSceneMonitorListScenesBatch, useSceneMonitorRecheckNow, useSceneMonitorResetScene, useSceneMonitorUpdateScene, useScriptRunnerGetStatus, useScriptRunnerRun, useScriptRunnerStop, useScrubController, useServerManagementApplyServerUpdate, useServerManagementCheckServerUpdate, useServerManagementGetServerPackageStatus, useServerManagementRestartServer, useServerManagementRollbackServerUpdate, useSettingsStoreAggregate, useSettingsStoreCount, useSettingsStoreDeclareCollection, useSettingsStoreDelete, useSettingsStoreDeleteWhere, useSettingsStoreGet, useSettingsStoreHistogram, useSettingsStoreInsert, useSettingsStoreInsertMany, useSettingsStoreIsEmpty, useSettingsStoreQuery, useSettingsStoreSet, useSettingsStoreTransact, useSettingsStoreUpdate, useSettingsStoreUpdateWhere, useSettingsStoreUpsert, useSettingsStoreUpsertMany, useSmokeGetStatus, useSnapshotApplyDeviceSettingsPatch, useSnapshotGetDebugState, useSnapshotGetDeviceLiveContribution, useSnapshotGetDeviceSettingsContribution, useSnapshotGetSnapshot, useSnapshotGetSnapshotLinks, useSnapshotGetSnapshotOverview, useSnapshotGetStatus, useSnapshotInvalidateCache, useStationaryOverlay, useStorageAbortUpload, useStorageBeginDownload, useStorageBeginUpload, useStorageDelete, useStorageDeleteLocation, useStorageEndDownload, useStorageExists, useStorageFinalizeUpload, useStorageGetAvailableSpace, useStorageList, useStorageListDrainProgress, useStorageListLocationDeclarations, useStorageListLocations, useStorageListProviders, useStorageMigrationCancel, useStorageMigrationCleanupCancel, useStorageMigrationCleanupStart, useStorageMigrationCleanupStatus, useStorageMigrationDrain, useStorageMigrationHistory, useStorageMigrationMovers, useStorageMigrationPlan, useStorageMigrationResidue, useStorageMigrationStart, useStorageMigrationStatus, useStorageRead, useStorageReadChunk, useStorageResolve, useStorageTestConfig, useStorageTestLocation, useStorageUpsertLocation, useStorageWrite, useStorageWriteChunk, useStoredGroupBy, useStreamBrokerAcquireEgressTranscode, useStreamBrokerApplyDeviceSettingsPatch, useStreamBrokerAssignProfile, useStreamBrokerFetchEventMedia, useStreamBrokerForgetDeviceHardware, useStreamBrokerGetAllRtspEntries, useStreamBrokerGetBrokerStats, useStreamBrokerGetDeviceAudioMute, useStreamBrokerGetDeviceLiveContribution, useStreamBrokerGetDeviceSettingsContribution, useStreamBrokerGetLiveViewerCounts, useStreamBrokerGetPreBufferInfo, useStreamBrokerGetRtspEntry, useStreamBrokerGetRtspPort, useStreamBrokerGetStreamUrl, useStreamBrokerGetStreamWithCodec, useStreamBrokerIsRtspEnabled, useStreamBrokerKillClient, useStreamBrokerListAllCameraStreams, useStreamBrokerListAllProfileSlots, useStreamBrokerListClients, useStreamBrokerProbeStream, useStreamBrokerProduceEventMedia, useStreamBrokerPublishCameraStream, useStreamBrokerPullAudioChunks, useStreamBrokerRegenerateRtspToken, useStreamBrokerReleaseEgressTranscode, useStreamBrokerReleaseStreamWithCodec, useStreamBrokerRenderPreBufferClip, useStreamBrokerReportStreamSignal, useStreamBrokerRestartProfile, useStreamBrokerRetractCameraStream, useStreamBrokerSetDeviceAudioMute, useStreamBrokerSetPreBufferDuration, useStreamBrokerSetRtspEnabled, useStreamBrokerSubscribeAudioChunks, useStreamBrokerUnassignProfile, useStreamBrokerUnsubscribeAudioChunks, useStreamCatalogGetCatalog, useStreamParamsGetConfigSchema, useStreamParamsGetOptions, useStreamParamsGetStatus, useStreamParamsSetProfile, useStreamSignalsListSignals, useSwitchGetStatus, useSwitchSetState, useSystem, useSystemDetectSiteLocation, useSystemFeatureFlags, useSystemForceRetentionCleanup, useSystemGetFailureContributions, useSystemGetLoadContributions, useSystemGetLoggingSettings, useSystemGetRequestCensus, useSystemGetRetentionConfig, useSystemGetSiteLocation, useSystemHealth, useSystemInfo, useSystemMutation, useSystemNetworkAddresses, useSystemQuery, useSystemSetLoggingSettings, useSystemSetRetentionConfig, useSystemSetSiteLocation, useTamperGetStatus, useTemperatureSensorGetStatus, useTerminalSessionAdoptLegacyMonitor, useTerminalSessionClose, useTerminalSessionCreateInstance, useTerminalSessionDeleteInstance, useTerminalSessionListInstances, useTerminalSessionListLegacyCameras, useTerminalSessionListProfiles, useTerminalSessionListSessions, useTerminalSessionOpenSession, useTerminalSessionPullOutput, useTerminalSessionResize, useTerminalSessionSetInstanceEnabled, useTerminalSessionUpdateInstance, useTerminalSessionWriteInput, useThemeMode, useToastOnToast, useTrainingCanaryResult, useTrainingCancelJob, useTrainingDiscardResult, useTrainingGetJob, useTrainingGetJobResult, useTrainingListBaseModels, useTrainingListJobs, useTrainingPlanJob, useTrainingRegisterResult, useTrainingRollbackCanary, useTrainingStartJob, useTrainingStartJobBatch, useTurnProviderGetTurnServers, useUiText, useUpdateGetStatus, useUpdateInstallUpdate, useUrlQueryParam, useUserManagementConfirmTotp, useUserManagementCreateScopedToken, useUserManagementCreateUser, useUserManagementDeleteUser, useUserManagementDisableTotp, useUserManagementFindUserByExternalIdentity, useUserManagementGetTotpStatus, useUserManagementListApiKeys, useUserManagementListExternalIdentities, useUserManagementListOauthSessions, useUserManagementListScopedTokens, useUserManagementListUsers, useUserManagementMigrateRawSecrets, useUserManagementOauthExchangeCode, useUserManagementOauthIssueCode, useUserManagementOauthRefresh, useUserManagementOauthVerifyAccessToken, useUserManagementResetPassword, useUserManagementRevokeApiKey, useUserManagementRevokeOauthSession, useUserManagementRevokeScopedToken, useUserManagementSetUserScopes, useUserManagementSetupTotp, useUserManagementUnlinkExternalIdentity, useUserManagementUpdateUser, useUserManagementValidateCredentials, useUserManagementValidateScopedToken, useUserManagementVerifyTotp, useVacuumControlGetStatus, useVacuumControlLocate, useVacuumControlPause, useVacuumControlReturnToBase, useVacuumControlSetFanSpeed, useVacuumControlStart, useVacuumControlStop, useValveClose, useValveGetStatus, useValveOpen, useValveSetPosition, useValveStop, useVibrationGetStatus, useVideoclipsDialClipStream, useVideoclipsGetClipPlayback, useVideoclipsGetPlaybackOptions, useVideoclipsListClips, useVideoclipsListSources, useVideoclipsOfferClipBytes, useVideoclipsReadClipBytes, useVodPlayback, useWaterHeaterGetStatus, useWaterHeaterSetAway, useWaterHeaterSetOperationMode, useWaterHeaterSetTargetTemp, useWeatherGetStatus, useWebrtcSessionAddIceCandidate, useWebrtcSessionApplyDownlinkProbe, useWebrtcSessionCloseSession, useWebrtcSessionCreateSession, useWebrtcSessionGetIceCandidates, useWebrtcSessionGetSessionDebug, useWebrtcSessionGetSessionState, useWebrtcSessionHandleAnswer, useWebrtcSessionHandleOffer, useWebrtcSessionHasAdaptiveBitrate, useWebrtcSessionListStreams, useWidget, useWidgetMetadata, useWidgetRegistry, useZoneAnalyticsGetCameraHistory, useZoneAnalyticsGetCurrentSnapshot, useZoneAnalyticsGetCurrentSnapshotBatch, useZoneAnalyticsGetUnzonedHistory, useZoneAnalyticsGetZoneHistory, useZoneEditing, useZoneRulesListRules, useZoneRulesSetRules, useZonesAddZone, useZonesListZones, useZonesRemoveZone, useZonesUpdateZone, Route as ut, Users as v, vacuumStateMeta, validateScopes, valveStateMeta, variantLabel, GripHorizontal as vn, Cast as vr, Puzzle as vt, Type as w, waterHeaterPhase, waterHeaterTint, weatherConditionMeta, weatherTint, withResolvedParentDetail, withUseRootModel, Footprints as wn, Box as wr, writeStoredGroupBy, Plane as wt, Upload as x, Gauge as xn, Cable as xr, Plug as xt, User as y, Grid2x2 as yn, Car as yr, Power as yt, Sun as z, DoorOpen as zn, Baby as zr, Moon as zt };