@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.
- package/dist/{MotionZonesSettings-Bv8XzCa3.js → MotionZonesSettings-C3Tj12yc.js} +1 -1
- package/dist/{PrivacyMaskSettings-BlkbESYj.js → PrivacyMaskSettings-C9wfHkiB.js} +1 -1
- package/dist/{SceneMonitorEditor-i3-nXAEU.js → SceneMonitorEditor-30H29vN4.js} +1 -1
- package/dist/composites/addon-global-settings-form.d.ts +1 -1
- package/dist/composites/config-form-field.d.ts +3 -1
- package/dist/composites/device-controls/ac-panel.d.ts +14 -1
- package/dist/composites/device-controls/climate-panel.d.ts +4 -1
- package/dist/composites/device-controls/dishwasher-control.d.ts +17 -0
- package/dist/composites/device-controls/heating-valve-readout.d.ts +4 -0
- package/dist/composites/device-controls/types.d.ts +1 -1
- package/dist/composites/index.d.ts +2 -0
- package/dist/composites/record-entries/entry-json-schema-form.d.ts +11 -0
- package/dist/composites/record-entries/index.d.ts +4 -0
- package/dist/composites/record-entries/record-entries-hub.d.ts +9 -0
- package/dist/composites/record-entries/record-entries-panel.d.ts +6 -0
- package/dist/composites/record-entries/record-entry-secrets.d.ts +9 -0
- package/dist/composites/storage-records/index.d.ts +2 -0
- package/dist/composites/storage-records/storage-records-hub.d.ts +4 -0
- package/dist/composites/storage-records/storage-records-panel.d.ts +6 -0
- package/dist/generated/system-hooks.d.ts +20 -0
- package/dist/{icons-CLC60C-_.cjs → icons-B1AFXUaZ.cjs} +2 -78
- package/dist/{icons-BXXScOuy.js → icons-BT8c2hxp.js} +1 -77
- package/dist/index.cjs +1656 -186
- package/dist/index.js +1638 -193
- 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-
|
|
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-
|
|
26258
|
-
"host/privacy-mask-grid": lazy(() => import("./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 -
|
|
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
|
|
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 -
|
|
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
|
|
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 -
|
|
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
|
|
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 -
|
|
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
|
|
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-
|
|
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:
|
|
48800
|
-
max:
|
|
48801
|
-
|
|
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
|
-
|
|
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
|
-
/**
|
|
48961
|
-
function RangeTrack({ value, min, max, accent }) {
|
|
48962
|
-
const
|
|
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
|
-
|
|
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
|
|
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
|
|
49211
|
-
|
|
49212
|
-
|
|
49213
|
-
|
|
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: [
|
|
49225
|
-
|
|
49226
|
-
|
|
49227
|
-
|
|
49228
|
-
|
|
49229
|
-
|
|
49230
|
-
|
|
49231
|
-
|
|
49232
|
-
|
|
49233
|
-
|
|
49234
|
-
|
|
49235
|
-
|
|
49236
|
-
|
|
49237
|
-
|
|
49238
|
-
|
|
49239
|
-
|
|
49240
|
-
|
|
49241
|
-
|
|
49242
|
-
|
|
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
|
-
|
|
49283
|
-
|
|
49284
|
-
|
|
49285
|
-
|
|
49286
|
-
|
|
49287
|
-
|
|
49288
|
-
|
|
49289
|
-
|
|
49290
|
-
|
|
49291
|
-
|
|
49292
|
-
|
|
49293
|
-
|
|
49294
|
-
|
|
49295
|
-
|
|
49296
|
-
|
|
49297
|
-
|
|
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
|
-
}),
|
|
49321
|
-
|
|
49322
|
-
|
|
49323
|
-
|
|
49324
|
-
|
|
49325
|
-
|
|
49326
|
-
|
|
49327
|
-
|
|
49328
|
-
|
|
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
|
-
|
|
49333
|
-
|
|
49334
|
-
|
|
49335
|
-
|
|
49336
|
-
|
|
49337
|
-
|
|
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
|
|
50858
|
-
|
|
50859
|
-
return /* @__PURE__ */ jsx(ClimatePanel, {
|
|
51505
|
+
function useHeatingValveCapGuard(trpc, deviceId) {
|
|
51506
|
+
const { cap } = useDeviceCapability({
|
|
50860
51507
|
trpc,
|
|
50861
51508
|
deviceId,
|
|
50862
|
-
|
|
50863
|
-
|
|
50864
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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 };
|