@camstack/ui-library 1.2.172 → 1.2.174
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-DNdnFHso.js → MotionZonesSettings-7c3yiT5E.js} +1 -26
- package/dist/{MotionZonesSettings-BP9p0pFB.cjs → MotionZonesSettings-BK9R9NIr.cjs} +1 -26
- package/dist/{PrivacyMaskSettings-CooCVUmA.js → PrivacyMaskSettings-PkYs077O.js} +1 -1
- package/dist/{SceneMonitorEditor-Bfo4BNqA.js → SceneMonitorEditor-BvDy3x3k.js} +1 -1
- package/dist/composites/cap-settings/CameraGridLayoutEditor.d.ts +4 -0
- package/dist/composites/cap-settings/HomePresetPicker.d.ts +6 -0
- package/dist/composites/cap-settings/camera-grid-layout.d.ts +54 -0
- package/dist/generated/system-hooks.d.ts +10 -0
- package/dist/hooks/use-ptz.d.ts +31 -0
- package/dist/index.cjs +828 -166
- package/dist/index.js +826 -170
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -2021,6 +2021,30 @@ var Gauge = createLucideIcon("gauge", [["path", {
|
|
|
2021
2021
|
* This source code is licensed under the ISC license.
|
|
2022
2022
|
* See the LICENSE file in the root directory of this source tree.
|
|
2023
2023
|
*/
|
|
2024
|
+
var Grid2x2 = createLucideIcon("grid-2x2", [
|
|
2025
|
+
["path", {
|
|
2026
|
+
d: "M12 3v18",
|
|
2027
|
+
key: "108xh3"
|
|
2028
|
+
}],
|
|
2029
|
+
["path", {
|
|
2030
|
+
d: "M3 12h18",
|
|
2031
|
+
key: "1i2n21"
|
|
2032
|
+
}],
|
|
2033
|
+
["rect", {
|
|
2034
|
+
x: "3",
|
|
2035
|
+
y: "3",
|
|
2036
|
+
width: "18",
|
|
2037
|
+
height: "18",
|
|
2038
|
+
rx: "2",
|
|
2039
|
+
key: "h1oib"
|
|
2040
|
+
}]
|
|
2041
|
+
]);
|
|
2042
|
+
/**
|
|
2043
|
+
* @license lucide-react v0.576.0 - ISC
|
|
2044
|
+
*
|
|
2045
|
+
* This source code is licensed under the ISC license.
|
|
2046
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
2047
|
+
*/
|
|
2024
2048
|
var GripHorizontal = createLucideIcon("grip-horizontal", [
|
|
2025
2049
|
["circle", {
|
|
2026
2050
|
cx: "12",
|
|
@@ -6571,6 +6595,16 @@ var usePtzDeletePreset = trpc.ptz.deletePreset.useMutation;
|
|
|
6571
6595
|
var usePtzGetOptions = trpc.ptz.getOptions.useQuery;
|
|
6572
6596
|
/** Generated alias around `trpc.ptz.goHome.useMutation`. */
|
|
6573
6597
|
var usePtzGoHome = trpc.ptz.goHome.useMutation;
|
|
6598
|
+
/** Generated alias around `trpc.ptz.getHomePreset.useQuery`. */
|
|
6599
|
+
var usePtzGetHomePreset = trpc.ptz.getHomePreset.useQuery;
|
|
6600
|
+
/** Generated alias around `trpc.ptz.setHomePreset.useMutation`. */
|
|
6601
|
+
var usePtzSetHomePreset = trpc.ptz.setHomePreset.useMutation;
|
|
6602
|
+
/** Generated alias around `trpc.ptz.captureHomeHere.useMutation`. */
|
|
6603
|
+
var usePtzCaptureHomeHere = trpc.ptz.captureHomeHere.useMutation;
|
|
6604
|
+
/** Generated alias around `trpc.ptz.getHomeReturnSeconds.useQuery`. */
|
|
6605
|
+
var usePtzGetHomeReturnSeconds = trpc.ptz.getHomeReturnSeconds.useQuery;
|
|
6606
|
+
/** Generated alias around `trpc.ptz.setHomeReturnSeconds.useMutation`. */
|
|
6607
|
+
var usePtzSetHomeReturnSeconds = trpc.ptz.setHomeReturnSeconds.useMutation;
|
|
6574
6608
|
/** Generated alias around `trpc.ptz.getPosition.useQuery`. */
|
|
6575
6609
|
var usePtzGetPosition = trpc.ptz.getPosition.useQuery;
|
|
6576
6610
|
/** Generated alias around `trpc.ptz.setAutofocus.useMutation`. */
|
|
@@ -16203,6 +16237,611 @@ function AutotrackSection({ deviceId }) {
|
|
|
16203
16237
|
});
|
|
16204
16238
|
}
|
|
16205
16239
|
//#endregion
|
|
16240
|
+
//#region src/hooks/use-devices.ts
|
|
16241
|
+
/**
|
|
16242
|
+
* useDevices / useDevice — reactive sync-mirror reads.
|
|
16243
|
+
*
|
|
16244
|
+
* Both hooks hand out `DeviceProxy` references straight out of the
|
|
16245
|
+
* `System` mirror. The mirror keeps device + binding caches warm via
|
|
16246
|
+
* the `device.registered/unregistered/bindings-changed` event stream,
|
|
16247
|
+
* so re-renders are driven by lifecycle pushes — no React Query
|
|
16248
|
+
* round-trip and no `refetch` plumbing needed at the caller side.
|
|
16249
|
+
*
|
|
16250
|
+
* The hooks defensively read once on mount and assume the System has
|
|
16251
|
+
* been `init()`ed by the host app — calls before the warm-boot
|
|
16252
|
+
* completes simply return an empty array / null and re-render once
|
|
16253
|
+
* the registered listeners fire.
|
|
16254
|
+
*/
|
|
16255
|
+
/**
|
|
16256
|
+
* Reactive list of devices matching the optional filter set. Returns a
|
|
16257
|
+
* stable array reference between updates so consumers passing it as a
|
|
16258
|
+
* prop don't tear down memoized children.
|
|
16259
|
+
*/
|
|
16260
|
+
function useDevices(filters) {
|
|
16261
|
+
const system = useSystem();
|
|
16262
|
+
const filtersKey = useMemo(() => filters ? JSON.stringify(filters) : "", [filters]);
|
|
16263
|
+
const [devices, setDevices] = useState(() => system.listDevices(filters));
|
|
16264
|
+
useEffect(() => {
|
|
16265
|
+
const refresh = () => {
|
|
16266
|
+
setDevices(system.listDevices(filters));
|
|
16267
|
+
};
|
|
16268
|
+
refresh();
|
|
16269
|
+
let unsubAdded = null;
|
|
16270
|
+
let unsubRemoved = null;
|
|
16271
|
+
try {
|
|
16272
|
+
unsubAdded = system.onDeviceAdded(refresh);
|
|
16273
|
+
unsubRemoved = system.onDeviceRemoved(refresh);
|
|
16274
|
+
} catch {}
|
|
16275
|
+
const unsubConn = system.subscribeConnectionEvents((state) => {
|
|
16276
|
+
if (state === "connected") refresh();
|
|
16277
|
+
});
|
|
16278
|
+
return () => {
|
|
16279
|
+
unsubAdded?.();
|
|
16280
|
+
unsubRemoved?.();
|
|
16281
|
+
unsubConn();
|
|
16282
|
+
};
|
|
16283
|
+
}, [
|
|
16284
|
+
system,
|
|
16285
|
+
filters,
|
|
16286
|
+
filtersKey
|
|
16287
|
+
]);
|
|
16288
|
+
return devices;
|
|
16289
|
+
}
|
|
16290
|
+
/**
|
|
16291
|
+
* Single-device variant. Returns `null` until the device is in the
|
|
16292
|
+
* mirror; re-renders when the device is removed (back to `null`) or
|
|
16293
|
+
* added.
|
|
16294
|
+
*/
|
|
16295
|
+
function useDevice(deviceId) {
|
|
16296
|
+
const system = useSystem();
|
|
16297
|
+
const [device, setDevice] = useState(() => deviceId === null ? null : system.getDevice(deviceId));
|
|
16298
|
+
useEffect(() => {
|
|
16299
|
+
if (deviceId === null) {
|
|
16300
|
+
setDevice(null);
|
|
16301
|
+
return;
|
|
16302
|
+
}
|
|
16303
|
+
const refresh = () => {
|
|
16304
|
+
setDevice(system.getDevice(deviceId));
|
|
16305
|
+
};
|
|
16306
|
+
refresh();
|
|
16307
|
+
let unsubAdded = null;
|
|
16308
|
+
let unsubRemoved = null;
|
|
16309
|
+
try {
|
|
16310
|
+
unsubAdded = system.onDeviceAdded(refresh);
|
|
16311
|
+
unsubRemoved = system.onDeviceRemoved(refresh);
|
|
16312
|
+
} catch {}
|
|
16313
|
+
const unsubConn = system.subscribeConnectionEvents((state) => {
|
|
16314
|
+
if (state === "connected") refresh();
|
|
16315
|
+
});
|
|
16316
|
+
return () => {
|
|
16317
|
+
unsubAdded?.();
|
|
16318
|
+
unsubRemoved?.();
|
|
16319
|
+
unsubConn();
|
|
16320
|
+
};
|
|
16321
|
+
}, [system, deviceId]);
|
|
16322
|
+
return device;
|
|
16323
|
+
}
|
|
16324
|
+
//#endregion
|
|
16325
|
+
//#region src/hooks/use-device-snapshot.ts
|
|
16326
|
+
/**
|
|
16327
|
+
* useDeviceSnapshotImage — a device's snapshot as a plain image URL.
|
|
16328
|
+
*
|
|
16329
|
+
* ## What this used to do, and why it stopped
|
|
16330
|
+
*
|
|
16331
|
+
* It fetched `dev.snapshot.getSnapshot()` over tRPC and returned
|
|
16332
|
+
* `data:image/jpeg;base64,…`. That put a full camera capture — up to 4 K,
|
|
16333
|
+
* measured at 758 KB average per camera on the live hub — through the msgpack
|
|
16334
|
+
* WebSocket plane, base64-inflated by a third, and then held it in the
|
|
16335
|
+
* react-query heap for 24 h per device. The device list rendered it into a
|
|
16336
|
+
* **28 × 28 px `<img>`**.
|
|
16337
|
+
*
|
|
16338
|
+
* It also did not do what it appeared to do. `snapshot.getSnapshot` scoped to a
|
|
16339
|
+
* device routes to the NATIVE provider, not the snapshot wrapper, so it bypassed
|
|
16340
|
+
* the wrapper's cache, coalescing and stale-while-revalidate entirely: probed
|
|
16341
|
+
* live, a `force:true` call returned a fresh 1.05 MB JPEG in 0.55 s while the
|
|
16342
|
+
* wrapper's `lastCapturedAt` for that camera did not move. Two snapshot paths,
|
|
16343
|
+
* different behaviour, and only one of them maintained the cache the other one
|
|
16344
|
+
* reported on.
|
|
16345
|
+
*
|
|
16346
|
+
* ## What it does now
|
|
16347
|
+
*
|
|
16348
|
+
* Returns the same URL the viewer uses: `/addon/snapshot/media/<id>.jpg?w=<n>`,
|
|
16349
|
+
* served by the wrapper over the HTTP data plane. Relative and same-origin, so
|
|
16350
|
+
* the admin UI's `camstack_session` cookie authenticates it — the endpoint is
|
|
16351
|
+
* `access: 'authenticated'`, which accepts either a Bearer header or that
|
|
16352
|
+
* cookie, and a bare `<img>` can only send the cookie. This is the same
|
|
16353
|
+
* mechanism the native `<video>` fallback in `hls-video.tsx` already relies on.
|
|
16354
|
+
*
|
|
16355
|
+
* Caching is now the browser's, which is the point: `ETag` +
|
|
16356
|
+
* `Cache-Control: private, max-age=<device maxAgeS>` means a repeat render is a
|
|
16357
|
+
* cache hit and a revalidation is a 0-byte 304. No JS heap, no msgpack, no
|
|
16358
|
+
* base64. Nothing to configure — unlike `expo-image` on native, browsers
|
|
16359
|
+
* revalidate a stale URL rather than treating it as immutable, so the URL stays
|
|
16360
|
+
* stable and does NOT need a version parameter.
|
|
16361
|
+
*/
|
|
16362
|
+
/** The hub-proxied path prefix for the snapshot image data plane, composed
|
|
16363
|
+
* below on `baseUrl` or, for the same-origin case, on the page's mount. */
|
|
16364
|
+
var SNAPSHOT_MEDIA_PATH = "/addon/snapshot/media";
|
|
16365
|
+
function useDeviceSnapshotImage(deviceId, options = {}) {
|
|
16366
|
+
const { width, baseUrl } = options;
|
|
16367
|
+
const [refreshNonce, setRefreshNonce] = useState(0);
|
|
16368
|
+
return {
|
|
16369
|
+
src: useMemo(() => {
|
|
16370
|
+
if (deviceId === null || deviceId <= 0) return null;
|
|
16371
|
+
const base = baseUrl !== void 0 ? baseUrl.replace(/\/+$/, "") : routerBasename();
|
|
16372
|
+
const params = new URLSearchParams();
|
|
16373
|
+
if (width !== void 0 && Number.isInteger(width) && width > 0) params.set("w", String(width));
|
|
16374
|
+
if (refreshNonce > 0) {
|
|
16375
|
+
params.set("force", "1");
|
|
16376
|
+
params.set("r", String(refreshNonce));
|
|
16377
|
+
}
|
|
16378
|
+
const query = params.toString();
|
|
16379
|
+
return `${base}${SNAPSHOT_MEDIA_PATH}/${String(deviceId)}.jpg${query.length > 0 ? `?${query}` : ""}`;
|
|
16380
|
+
}, [
|
|
16381
|
+
deviceId,
|
|
16382
|
+
width,
|
|
16383
|
+
baseUrl,
|
|
16384
|
+
refreshNonce
|
|
16385
|
+
]),
|
|
16386
|
+
loading: false,
|
|
16387
|
+
refresh: useCallback(() => {
|
|
16388
|
+
setRefreshNonce((n) => n + 1);
|
|
16389
|
+
}, [])
|
|
16390
|
+
};
|
|
16391
|
+
}
|
|
16392
|
+
//#endregion
|
|
16393
|
+
//#region src/composites/cap-settings/camera-grid-layout.ts
|
|
16394
|
+
/** Smallest rectangle the editor will produce — ffmpeg refuses a zero-area crop. */
|
|
16395
|
+
var MIN_EXTENT = .02;
|
|
16396
|
+
function isRecord(value) {
|
|
16397
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
16398
|
+
}
|
|
16399
|
+
function readRect(value) {
|
|
16400
|
+
if (!isRecord(value)) return null;
|
|
16401
|
+
const { x, y, width, height } = value;
|
|
16402
|
+
if (typeof x !== "number" || typeof y !== "number" || typeof width !== "number" || typeof height !== "number") return null;
|
|
16403
|
+
if (x < 0 || y < 0 || width <= 0 || height <= 0) return null;
|
|
16404
|
+
if (x + width > 1 || y + height > 1) return null;
|
|
16405
|
+
return {
|
|
16406
|
+
x,
|
|
16407
|
+
y,
|
|
16408
|
+
width,
|
|
16409
|
+
height
|
|
16410
|
+
};
|
|
16411
|
+
}
|
|
16412
|
+
function readCell(value) {
|
|
16413
|
+
if (!isRecord(value)) return null;
|
|
16414
|
+
const deviceId = value["deviceId"];
|
|
16415
|
+
if (typeof deviceId !== "number" || !Number.isInteger(deviceId)) return null;
|
|
16416
|
+
const source = readRect(value["source"]);
|
|
16417
|
+
const cell = readRect(value["cell"]);
|
|
16418
|
+
if (source === null || cell === null) return null;
|
|
16419
|
+
return {
|
|
16420
|
+
deviceId,
|
|
16421
|
+
source,
|
|
16422
|
+
cell
|
|
16423
|
+
};
|
|
16424
|
+
}
|
|
16425
|
+
/** Parse the `getGridForDevice` reply. See {@link GridLayoutReadOutcome}. */
|
|
16426
|
+
function parseGridView(raw) {
|
|
16427
|
+
if (!isRecord(raw) || !("grid" in raw)) return "unreadable";
|
|
16428
|
+
const grid = raw["grid"];
|
|
16429
|
+
if (grid === null) return null;
|
|
16430
|
+
if (!isRecord(grid)) return "unreadable";
|
|
16431
|
+
const { instanceId, deviceId, name, width, height, fps, cells } = grid;
|
|
16432
|
+
if (typeof instanceId !== "string" || typeof deviceId !== "number" || typeof name !== "string" || typeof width !== "number" || typeof height !== "number" || typeof fps !== "number" || !Array.isArray(cells)) return "unreadable";
|
|
16433
|
+
const parsed = [];
|
|
16434
|
+
for (const entry of cells) {
|
|
16435
|
+
const cell = readCell(entry);
|
|
16436
|
+
if (cell === null) return "unreadable";
|
|
16437
|
+
parsed.push(cell);
|
|
16438
|
+
}
|
|
16439
|
+
return {
|
|
16440
|
+
instanceId,
|
|
16441
|
+
deviceId,
|
|
16442
|
+
name,
|
|
16443
|
+
width,
|
|
16444
|
+
height,
|
|
16445
|
+
fps,
|
|
16446
|
+
cells: parsed
|
|
16447
|
+
};
|
|
16448
|
+
}
|
|
16449
|
+
/**
|
|
16450
|
+
* Keep a rectangle inside the unit square.
|
|
16451
|
+
*
|
|
16452
|
+
* The addon THROWS on a rectangle that falls outside — a silently clipped
|
|
16453
|
+
* picture is worse than a refusal — so the editor must never hand it one.
|
|
16454
|
+
*/
|
|
16455
|
+
function clampNormalizedRect(rect) {
|
|
16456
|
+
const width = Math.min(1, Math.max(MIN_EXTENT, rect.width));
|
|
16457
|
+
const height = Math.min(1, Math.max(MIN_EXTENT, rect.height));
|
|
16458
|
+
return {
|
|
16459
|
+
x: Math.min(1 - width, Math.max(0, rect.x)),
|
|
16460
|
+
y: Math.min(1 - height, Math.max(0, rect.y)),
|
|
16461
|
+
width,
|
|
16462
|
+
height
|
|
16463
|
+
};
|
|
16464
|
+
}
|
|
16465
|
+
/** Drag: translate by a normalized delta, clamped. */
|
|
16466
|
+
function moveNormalizedRect(rect, dx, dy) {
|
|
16467
|
+
return clampNormalizedRect({
|
|
16468
|
+
...rect,
|
|
16469
|
+
x: rect.x + dx,
|
|
16470
|
+
y: rect.y + dy
|
|
16471
|
+
});
|
|
16472
|
+
}
|
|
16473
|
+
/** Resize from the bottom-right corner: the origin stays put. */
|
|
16474
|
+
function resizeNormalizedRect(rect, dw, dh) {
|
|
16475
|
+
return clampNormalizedRect({
|
|
16476
|
+
...rect,
|
|
16477
|
+
width: rect.width + dw,
|
|
16478
|
+
height: rect.height + dh
|
|
16479
|
+
});
|
|
16480
|
+
}
|
|
16481
|
+
//#endregion
|
|
16482
|
+
//#region src/composites/cap-settings/CameraGridLayoutEditor.tsx
|
|
16483
|
+
/**
|
|
16484
|
+
* The camera-grid layout editor.
|
|
16485
|
+
*
|
|
16486
|
+
* A grid's geometry is the one thing a DERIVED settings form cannot express: a
|
|
16487
|
+
* generated form renders "cell 1 source = 592, cell 1 crop x = 0.25, cell 1 crop
|
|
16488
|
+
* width = 0.5…" and nobody can hold a picture in their head from that. So the
|
|
16489
|
+
* geometry gets a widget — the canvas, drawn at the grid's own aspect ratio,
|
|
16490
|
+
* with the cells on it — while the knobs that ARE ordinary fields (the name,
|
|
16491
|
+
* the canvas size, the frame rate) sit beside it in the same panel.
|
|
16492
|
+
*
|
|
16493
|
+
* Every rectangle in here is NORMALIZED [0,1], on both sides: the crop taken
|
|
16494
|
+
* out of a source, and the cell it lands in. That is how the addon stores them
|
|
16495
|
+
* (a source camera can change resolution, and a stored pixel rectangle would
|
|
16496
|
+
* quietly start cutting the wrong region), so the editor speaks the same
|
|
16497
|
+
* language rather than converting at the boundary.
|
|
16498
|
+
*
|
|
16499
|
+
* The preview is the source cameras' own snapshots, positioned by CSS from the
|
|
16500
|
+
* SAME normalized numbers that will become the ffmpeg `crop`/`overlay`. It costs
|
|
16501
|
+
* the server nothing and it is wrong in exactly the ways the real composition
|
|
16502
|
+
* would be wrong.
|
|
16503
|
+
*/
|
|
16504
|
+
var ADDON_ID = "camera-grid";
|
|
16505
|
+
var FULL_FRAME = {
|
|
16506
|
+
x: 0,
|
|
16507
|
+
y: 0,
|
|
16508
|
+
width: 1,
|
|
16509
|
+
height: 1
|
|
16510
|
+
};
|
|
16511
|
+
var MAX_CELLS = 16;
|
|
16512
|
+
/** Hoisted so `useDevices` does not re-subscribe on every render. */
|
|
16513
|
+
var CAMERA_FILTER = { type: DeviceType.Camera };
|
|
16514
|
+
function CameraGridLayoutEditor({ deviceId }) {
|
|
16515
|
+
const system = useSystem();
|
|
16516
|
+
const cameras = useMemo(() => system.listDeviceInfos(CAMERA_FILTER), [system, useDevices(CAMERA_FILTER)]);
|
|
16517
|
+
const [loaded, setLoaded] = useState(void 0);
|
|
16518
|
+
const [draft, setDraft] = useState(null);
|
|
16519
|
+
const [saving, setSaving] = useState(false);
|
|
16520
|
+
const [saveError, setSaveError] = useState(null);
|
|
16521
|
+
const [selected, setSelected] = useState(0);
|
|
16522
|
+
const [drag, setDrag] = useState(null);
|
|
16523
|
+
const reload = useCallback(async () => {
|
|
16524
|
+
const outcome = parseGridView(await system.trpcClient.addons.custom.mutate({
|
|
16525
|
+
addonId: ADDON_ID,
|
|
16526
|
+
action: "getGridForDevice",
|
|
16527
|
+
input: { deviceId }
|
|
16528
|
+
}));
|
|
16529
|
+
setLoaded(outcome);
|
|
16530
|
+
setDraft(outcome === null || outcome === "unreadable" ? null : outcome);
|
|
16531
|
+
}, [system, deviceId]);
|
|
16532
|
+
useEffect(() => {
|
|
16533
|
+
reload().catch(() => {
|
|
16534
|
+
setLoaded("unreadable");
|
|
16535
|
+
});
|
|
16536
|
+
}, [reload]);
|
|
16537
|
+
const save = useCallback(async () => {
|
|
16538
|
+
if (draft === null) return;
|
|
16539
|
+
setSaving(true);
|
|
16540
|
+
setSaveError(null);
|
|
16541
|
+
try {
|
|
16542
|
+
const outcome = parseGridView(await system.trpcClient.addons.custom.mutate({
|
|
16543
|
+
addonId: ADDON_ID,
|
|
16544
|
+
action: "saveGridLayout",
|
|
16545
|
+
input: {
|
|
16546
|
+
deviceId,
|
|
16547
|
+
name: draft.name,
|
|
16548
|
+
width: draft.width,
|
|
16549
|
+
height: draft.height,
|
|
16550
|
+
fps: draft.fps,
|
|
16551
|
+
cells: draft.cells.map((cell) => ({ ...cell }))
|
|
16552
|
+
}
|
|
16553
|
+
}));
|
|
16554
|
+
if (outcome !== null && outcome !== "unreadable") {
|
|
16555
|
+
setLoaded(outcome);
|
|
16556
|
+
setDraft(outcome);
|
|
16557
|
+
}
|
|
16558
|
+
} catch (error) {
|
|
16559
|
+
setSaveError(error instanceof Error ? error.message : String(error));
|
|
16560
|
+
} finally {
|
|
16561
|
+
setSaving(false);
|
|
16562
|
+
}
|
|
16563
|
+
}, [
|
|
16564
|
+
system,
|
|
16565
|
+
deviceId,
|
|
16566
|
+
draft
|
|
16567
|
+
]);
|
|
16568
|
+
const patchCell = useCallback((index, patch) => {
|
|
16569
|
+
setDraft((prev) => prev === null ? prev : {
|
|
16570
|
+
...prev,
|
|
16571
|
+
cells: prev.cells.map((cell, i) => i === index ? {
|
|
16572
|
+
...cell,
|
|
16573
|
+
...patch
|
|
16574
|
+
} : cell)
|
|
16575
|
+
});
|
|
16576
|
+
}, []);
|
|
16577
|
+
const canvasAspect = useMemo(() => draft === null ? 16 / 9 : draft.width / draft.height, [draft]);
|
|
16578
|
+
if (loaded === void 0) return /* @__PURE__ */ jsx(WidgetPanel, {
|
|
16579
|
+
title: "Grid layout",
|
|
16580
|
+
icon: /* @__PURE__ */ jsx(Grid2x2, { className: "h-3.5 w-3.5" }),
|
|
16581
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
16582
|
+
className: "flex items-center gap-2 text-[10.5px] text-foreground-subtle",
|
|
16583
|
+
children: [/* @__PURE__ */ jsx(LoaderCircle, { className: "h-3 w-3 animate-spin" }), " Loading the layout…"]
|
|
16584
|
+
})
|
|
16585
|
+
});
|
|
16586
|
+
if (loaded === "unreadable") return /* @__PURE__ */ jsx(WidgetPanel, {
|
|
16587
|
+
title: "Grid layout",
|
|
16588
|
+
icon: /* @__PURE__ */ jsx(Grid2x2, { className: "h-3.5 w-3.5" }),
|
|
16589
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
16590
|
+
className: "flex items-center gap-2 text-[10.5px] text-danger",
|
|
16591
|
+
children: [/* @__PURE__ */ jsx(CircleAlert, { className: "h-3 w-3" }), "The Camera Grids addon did not answer, so this layout is unknown — not empty."]
|
|
16592
|
+
})
|
|
16593
|
+
});
|
|
16594
|
+
if (loaded === null || draft === null) return /* @__PURE__ */ jsx(WidgetPanel, {
|
|
16595
|
+
title: "Grid layout",
|
|
16596
|
+
icon: /* @__PURE__ */ jsx(Grid2x2, { className: "h-3.5 w-3.5" }),
|
|
16597
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
16598
|
+
className: "text-[10.5px] text-foreground-subtle",
|
|
16599
|
+
children: "This camera is not a grid."
|
|
16600
|
+
})
|
|
16601
|
+
});
|
|
16602
|
+
const onPointerMove = (event) => {
|
|
16603
|
+
if (drag === null) return;
|
|
16604
|
+
const bounds = event.currentTarget.getBoundingClientRect();
|
|
16605
|
+
if (bounds.width === 0 || bounds.height === 0) return;
|
|
16606
|
+
const dx = (event.clientX - drag.startX) / bounds.width;
|
|
16607
|
+
const dy = (event.clientY - drag.startY) / bounds.height;
|
|
16608
|
+
patchCell(drag.index, { cell: drag.mode === "move" ? moveNormalizedRect(drag.origin, dx, dy) : resizeNormalizedRect(drag.origin, dx, dy) });
|
|
16609
|
+
};
|
|
16610
|
+
return /* @__PURE__ */ jsx(WidgetPanel, {
|
|
16611
|
+
title: "Grid layout",
|
|
16612
|
+
icon: /* @__PURE__ */ jsx(Grid2x2, { className: "h-3.5 w-3.5" }),
|
|
16613
|
+
headerRight: /* @__PURE__ */ jsxs("button", {
|
|
16614
|
+
type: "button",
|
|
16615
|
+
disabled: saving,
|
|
16616
|
+
onClick: () => void save(),
|
|
16617
|
+
className: "flex items-center gap-1 rounded border border-border px-2 py-0.5 text-[10px] uppercase",
|
|
16618
|
+
children: [saving ? /* @__PURE__ */ jsx(LoaderCircle, { className: "h-3 w-3 animate-spin" }) : /* @__PURE__ */ jsx(Save, { className: "h-3 w-3" }), "Save"]
|
|
16619
|
+
}),
|
|
16620
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
16621
|
+
className: "flex flex-col gap-3",
|
|
16622
|
+
children: [
|
|
16623
|
+
saveError !== null && /* @__PURE__ */ jsxs("div", {
|
|
16624
|
+
className: "flex items-center gap-2 text-[10.5px] text-danger",
|
|
16625
|
+
children: [
|
|
16626
|
+
/* @__PURE__ */ jsx(CircleAlert, { className: "h-3 w-3" }),
|
|
16627
|
+
" ",
|
|
16628
|
+
saveError
|
|
16629
|
+
]
|
|
16630
|
+
}),
|
|
16631
|
+
/* @__PURE__ */ jsxs("div", {
|
|
16632
|
+
className: "relative w-full select-none overflow-hidden rounded border border-border bg-black",
|
|
16633
|
+
style: { aspectRatio: String(canvasAspect) },
|
|
16634
|
+
onPointerMove,
|
|
16635
|
+
onPointerUp: () => {
|
|
16636
|
+
setDrag(null);
|
|
16637
|
+
},
|
|
16638
|
+
onPointerLeave: () => {
|
|
16639
|
+
setDrag(null);
|
|
16640
|
+
},
|
|
16641
|
+
children: [draft.cells.map((cell, index) => /* @__PURE__ */ jsx(GridCellBox, {
|
|
16642
|
+
cell,
|
|
16643
|
+
selected: index === selected,
|
|
16644
|
+
onSelect: () => {
|
|
16645
|
+
setSelected(index);
|
|
16646
|
+
},
|
|
16647
|
+
onDragStart: (mode, event) => {
|
|
16648
|
+
setSelected(index);
|
|
16649
|
+
setDrag({
|
|
16650
|
+
index,
|
|
16651
|
+
mode,
|
|
16652
|
+
startX: event.clientX,
|
|
16653
|
+
startY: event.clientY,
|
|
16654
|
+
origin: cell.cell
|
|
16655
|
+
});
|
|
16656
|
+
}
|
|
16657
|
+
}, `${String(cell.deviceId)}-${String(index)}`)), draft.cells.length === 0 && /* @__PURE__ */ jsx("div", {
|
|
16658
|
+
className: "absolute inset-0 flex items-center justify-center text-[10.5px] text-foreground-subtle",
|
|
16659
|
+
children: "No cells yet — add one below."
|
|
16660
|
+
})]
|
|
16661
|
+
}),
|
|
16662
|
+
/* @__PURE__ */ jsxs("div", {
|
|
16663
|
+
className: "grid grid-cols-4 gap-2 text-[10.5px]",
|
|
16664
|
+
children: [
|
|
16665
|
+
/* @__PURE__ */ jsx(LabelledNumber, {
|
|
16666
|
+
label: "Width",
|
|
16667
|
+
value: draft.width,
|
|
16668
|
+
onChange: (width) => {
|
|
16669
|
+
setDraft({
|
|
16670
|
+
...draft,
|
|
16671
|
+
width
|
|
16672
|
+
});
|
|
16673
|
+
}
|
|
16674
|
+
}),
|
|
16675
|
+
/* @__PURE__ */ jsx(LabelledNumber, {
|
|
16676
|
+
label: "Height",
|
|
16677
|
+
value: draft.height,
|
|
16678
|
+
onChange: (height) => {
|
|
16679
|
+
setDraft({
|
|
16680
|
+
...draft,
|
|
16681
|
+
height
|
|
16682
|
+
});
|
|
16683
|
+
}
|
|
16684
|
+
}),
|
|
16685
|
+
/* @__PURE__ */ jsx(LabelledNumber, {
|
|
16686
|
+
label: "FPS",
|
|
16687
|
+
value: draft.fps,
|
|
16688
|
+
onChange: (fps) => {
|
|
16689
|
+
setDraft({
|
|
16690
|
+
...draft,
|
|
16691
|
+
fps
|
|
16692
|
+
});
|
|
16693
|
+
}
|
|
16694
|
+
}),
|
|
16695
|
+
/* @__PURE__ */ jsxs("button", {
|
|
16696
|
+
type: "button",
|
|
16697
|
+
disabled: draft.cells.length >= MAX_CELLS,
|
|
16698
|
+
onClick: () => {
|
|
16699
|
+
const first = cameras.find((camera) => camera.id !== deviceId);
|
|
16700
|
+
if (!first) return;
|
|
16701
|
+
setDraft({
|
|
16702
|
+
...draft,
|
|
16703
|
+
cells: [...draft.cells, {
|
|
16704
|
+
deviceId: first.id,
|
|
16705
|
+
source: FULL_FRAME,
|
|
16706
|
+
cell: clampNormalizedRect({
|
|
16707
|
+
x: .1,
|
|
16708
|
+
y: .1,
|
|
16709
|
+
width: .4,
|
|
16710
|
+
height: .4
|
|
16711
|
+
})
|
|
16712
|
+
}]
|
|
16713
|
+
});
|
|
16714
|
+
setSelected(draft.cells.length);
|
|
16715
|
+
},
|
|
16716
|
+
className: "flex items-center justify-center gap-1 self-end rounded border border-border px-2 py-1 uppercase",
|
|
16717
|
+
children: [/* @__PURE__ */ jsx(Plus, { className: "h-3 w-3" }), " Cell"]
|
|
16718
|
+
})
|
|
16719
|
+
]
|
|
16720
|
+
}),
|
|
16721
|
+
draft.cells[selected] !== void 0 && /* @__PURE__ */ jsx(CellInspector, {
|
|
16722
|
+
cell: draft.cells[selected],
|
|
16723
|
+
index: selected,
|
|
16724
|
+
cameras: cameras.filter((camera) => camera.id !== deviceId),
|
|
16725
|
+
onChange: (patch) => {
|
|
16726
|
+
patchCell(selected, patch);
|
|
16727
|
+
},
|
|
16728
|
+
onRemove: () => {
|
|
16729
|
+
setDraft({
|
|
16730
|
+
...draft,
|
|
16731
|
+
cells: draft.cells.filter((_, i) => i !== selected)
|
|
16732
|
+
});
|
|
16733
|
+
setSelected(0);
|
|
16734
|
+
}
|
|
16735
|
+
})
|
|
16736
|
+
]
|
|
16737
|
+
})
|
|
16738
|
+
});
|
|
16739
|
+
}
|
|
16740
|
+
function GridCellBox({ cell, selected, onSelect, onDragStart }) {
|
|
16741
|
+
const { src } = useDeviceSnapshotImage(cell.deviceId, { width: 640 });
|
|
16742
|
+
const backgroundSize = `${String(100 / cell.source.width)}% ${String(100 / cell.source.height)}%`;
|
|
16743
|
+
const backgroundPosition = cell.source.width >= 1 && cell.source.height >= 1 ? "center" : `${String(cell.source.x / Math.max(1e-6, 1 - cell.source.width) * 100)}% ${String(cell.source.y / Math.max(1e-6, 1 - cell.source.height) * 100)}%`;
|
|
16744
|
+
return /* @__PURE__ */ jsx("div", {
|
|
16745
|
+
role: "presentation",
|
|
16746
|
+
onPointerDown: (event) => {
|
|
16747
|
+
onSelect();
|
|
16748
|
+
onDragStart("move", event);
|
|
16749
|
+
},
|
|
16750
|
+
className: `absolute cursor-move border ${selected ? "border-accent" : "border-border/60"}`,
|
|
16751
|
+
style: {
|
|
16752
|
+
left: `${String(cell.cell.x * 100)}%`,
|
|
16753
|
+
top: `${String(cell.cell.y * 100)}%`,
|
|
16754
|
+
width: `${String(cell.cell.width * 100)}%`,
|
|
16755
|
+
height: `${String(cell.cell.height * 100)}%`,
|
|
16756
|
+
backgroundImage: src === null ? void 0 : `url(${src})`,
|
|
16757
|
+
backgroundSize,
|
|
16758
|
+
backgroundPosition,
|
|
16759
|
+
backgroundRepeat: "no-repeat"
|
|
16760
|
+
},
|
|
16761
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
16762
|
+
role: "presentation",
|
|
16763
|
+
onPointerDown: (event) => {
|
|
16764
|
+
event.stopPropagation();
|
|
16765
|
+
onDragStart("resize", event);
|
|
16766
|
+
},
|
|
16767
|
+
className: "absolute -bottom-1 -right-1 h-2.5 w-2.5 cursor-se-resize bg-accent"
|
|
16768
|
+
})
|
|
16769
|
+
});
|
|
16770
|
+
}
|
|
16771
|
+
function CellInspector({ cell, index, cameras, onChange, onRemove }) {
|
|
16772
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
16773
|
+
className: "flex flex-col gap-2 rounded border border-border p-2 text-[10.5px]",
|
|
16774
|
+
children: [
|
|
16775
|
+
/* @__PURE__ */ jsxs("div", {
|
|
16776
|
+
className: "flex items-center justify-between",
|
|
16777
|
+
children: [/* @__PURE__ */ jsxs("span", {
|
|
16778
|
+
className: "uppercase text-foreground-subtle",
|
|
16779
|
+
children: ["Cell ", index + 1]
|
|
16780
|
+
}), /* @__PURE__ */ jsx("button", {
|
|
16781
|
+
type: "button",
|
|
16782
|
+
onClick: onRemove,
|
|
16783
|
+
className: "text-danger",
|
|
16784
|
+
children: /* @__PURE__ */ jsx(Trash2, { className: "h-3 w-3" })
|
|
16785
|
+
})]
|
|
16786
|
+
}),
|
|
16787
|
+
/* @__PURE__ */ jsxs("label", {
|
|
16788
|
+
className: "flex items-center gap-2",
|
|
16789
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
16790
|
+
className: "w-16 text-foreground-subtle",
|
|
16791
|
+
children: "Source"
|
|
16792
|
+
}), /* @__PURE__ */ jsx("select", {
|
|
16793
|
+
value: String(cell.deviceId),
|
|
16794
|
+
onChange: (event) => {
|
|
16795
|
+
onChange({ deviceId: Number(event.target.value) });
|
|
16796
|
+
},
|
|
16797
|
+
className: "flex-1 rounded border border-border bg-transparent px-1 py-0.5",
|
|
16798
|
+
children: cameras.map((camera) => /* @__PURE__ */ jsx("option", {
|
|
16799
|
+
value: String(camera.id),
|
|
16800
|
+
children: camera.name
|
|
16801
|
+
}, camera.id))
|
|
16802
|
+
})]
|
|
16803
|
+
}),
|
|
16804
|
+
/* @__PURE__ */ jsx("div", {
|
|
16805
|
+
className: "grid grid-cols-4 gap-2",
|
|
16806
|
+
children: [
|
|
16807
|
+
"x",
|
|
16808
|
+
"y",
|
|
16809
|
+
"width",
|
|
16810
|
+
"height"
|
|
16811
|
+
].map((key) => /* @__PURE__ */ jsx(LabelledNumber, {
|
|
16812
|
+
label: `Crop ${key}`,
|
|
16813
|
+
value: Math.round(cell.source[key] * 100) / 100,
|
|
16814
|
+
step: .01,
|
|
16815
|
+
onChange: (next) => {
|
|
16816
|
+
onChange({ source: clampNormalizedRect({
|
|
16817
|
+
...cell.source,
|
|
16818
|
+
[key]: next
|
|
16819
|
+
}) });
|
|
16820
|
+
}
|
|
16821
|
+
}, key))
|
|
16822
|
+
})
|
|
16823
|
+
]
|
|
16824
|
+
});
|
|
16825
|
+
}
|
|
16826
|
+
function LabelledNumber({ label, value, step = 1, onChange }) {
|
|
16827
|
+
return /* @__PURE__ */ jsxs("label", {
|
|
16828
|
+
className: "flex flex-col gap-0.5",
|
|
16829
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
16830
|
+
className: "text-foreground-subtle",
|
|
16831
|
+
children: label
|
|
16832
|
+
}), /* @__PURE__ */ jsx("input", {
|
|
16833
|
+
type: "number",
|
|
16834
|
+
step,
|
|
16835
|
+
value,
|
|
16836
|
+
onChange: (event) => {
|
|
16837
|
+
const next = Number(event.target.value);
|
|
16838
|
+
if (Number.isFinite(next)) onChange(next);
|
|
16839
|
+
},
|
|
16840
|
+
className: "rounded border border-border bg-transparent px-1 py-0.5"
|
|
16841
|
+
})]
|
|
16842
|
+
});
|
|
16843
|
+
}
|
|
16844
|
+
//#endregion
|
|
16206
16845
|
//#region src/hooks/use-device-proxy.ts
|
|
16207
16846
|
/**
|
|
16208
16847
|
* useDeviceProxy — canonical React entry point for a device.
|
|
@@ -16921,7 +17560,13 @@ function isAbsentProvider(err) {
|
|
|
16921
17560
|
* continuous motion (`cap.continuousMove` + `cap.stop`). Use for
|
|
16922
17561
|
* long-press handlers on touch / mouse-down handlers on desktop.
|
|
16923
17562
|
* - `zoom('in' | 'out')`: discrete zoom step.
|
|
16924
|
-
* - `goHome()`: jump to
|
|
17563
|
+
* - `goHome()`: jump to the camera's configured home. It used to be
|
|
17564
|
+
* "jump to preset 0" — three providers hardcoded a vendor convention that
|
|
17565
|
+
* none of this fleet's cameras honours — so it now REFUSES when nothing is
|
|
17566
|
+
* configured rather than moving the head to an arbitrary slot.
|
|
17567
|
+
* - `homePreset` + `setHomePreset(presetId)`: which preset home points at,
|
|
17568
|
+
* and who decided. `source: 'native'` means the camera homes without a
|
|
17569
|
+
* preset (ONVIF) and there is nothing to pick.
|
|
16925
17570
|
* - `presets` + `goToPreset(presetId)`: list and jump to named presets.
|
|
16926
17571
|
*
|
|
16927
17572
|
* Parametrised by the same `UseDeviceProxyTrpc` shape every other
|
|
@@ -16968,6 +17613,8 @@ function usePTZ(trpc, deviceId, hookOptions) {
|
|
|
16968
17613
|
const enabled = hookOptions?.enabled ?? true;
|
|
16969
17614
|
const ptz = useDeviceProxy(trpc, enabled ? deviceId : null)?.ptz;
|
|
16970
17615
|
const [presets, setPresets] = useState([]);
|
|
17616
|
+
const [homePreset, setHomePresetState] = useState(null);
|
|
17617
|
+
const [homeReturnSeconds, setHomeReturnState] = useState(null);
|
|
16971
17618
|
const [options, setOptions] = useState(null);
|
|
16972
17619
|
const [busy, setBusy] = useState(false);
|
|
16973
17620
|
const [error, setError] = useState(null);
|
|
@@ -16980,6 +17627,24 @@ function usePTZ(trpc, deviceId, hookOptions) {
|
|
|
16980
17627
|
setError(err instanceof Error ? err.message : String(err));
|
|
16981
17628
|
}
|
|
16982
17629
|
}, [ptz, enabled]);
|
|
17630
|
+
const refreshHomePreset = useCallback(async () => {
|
|
17631
|
+
if (!enabled || !ptz) return;
|
|
17632
|
+
try {
|
|
17633
|
+
setHomePresetState(await ptz.getHomePreset({}));
|
|
17634
|
+
} catch (err) {
|
|
17635
|
+
if (isAbsentProvider(err)) return;
|
|
17636
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
17637
|
+
}
|
|
17638
|
+
}, [ptz, enabled]);
|
|
17639
|
+
const refreshHomeReturn = useCallback(async () => {
|
|
17640
|
+
if (!enabled || !ptz) return;
|
|
17641
|
+
try {
|
|
17642
|
+
setHomeReturnState(await ptz.getHomeReturnSeconds({}));
|
|
17643
|
+
} catch (err) {
|
|
17644
|
+
if (isAbsentProvider(err)) return;
|
|
17645
|
+
setHomeReturnState(null);
|
|
17646
|
+
}
|
|
17647
|
+
}, [ptz, enabled]);
|
|
16983
17648
|
const refreshOptions = useCallback(async () => {
|
|
16984
17649
|
if (!enabled || !ptz) return;
|
|
16985
17650
|
try {
|
|
@@ -16992,7 +17657,14 @@ function usePTZ(trpc, deviceId, hookOptions) {
|
|
|
16992
17657
|
useEffect(() => {
|
|
16993
17658
|
refreshPresets();
|
|
16994
17659
|
refreshOptions();
|
|
16995
|
-
|
|
17660
|
+
refreshHomePreset();
|
|
17661
|
+
refreshHomeReturn();
|
|
17662
|
+
}, [
|
|
17663
|
+
refreshPresets,
|
|
17664
|
+
refreshOptions,
|
|
17665
|
+
refreshHomePreset,
|
|
17666
|
+
refreshHomeReturn
|
|
17667
|
+
]);
|
|
16996
17668
|
const wrap = useCallback(async (fn) => {
|
|
16997
17669
|
if (!enabled || !ptz) return void 0;
|
|
16998
17670
|
setError(null);
|
|
@@ -17066,6 +17738,35 @@ function usePTZ(trpc, deviceId, hookOptions) {
|
|
|
17066
17738
|
if (!ptz) return;
|
|
17067
17739
|
await wrap(() => ptz.goHome({}));
|
|
17068
17740
|
}, [ptz, wrap]),
|
|
17741
|
+
homePreset,
|
|
17742
|
+
setHomePreset: useCallback(async (presetId) => {
|
|
17743
|
+
if (!ptz) return;
|
|
17744
|
+
await wrap(() => ptz.setHomePreset({ presetId }));
|
|
17745
|
+
await refreshHomePreset();
|
|
17746
|
+
}, [
|
|
17747
|
+
ptz,
|
|
17748
|
+
wrap,
|
|
17749
|
+
refreshHomePreset
|
|
17750
|
+
]),
|
|
17751
|
+
captureHomeHere: useCallback(async () => {
|
|
17752
|
+
if (!ptz) return;
|
|
17753
|
+
await wrap(() => ptz.captureHomeHere({}));
|
|
17754
|
+
await refreshHomePreset();
|
|
17755
|
+
}, [
|
|
17756
|
+
ptz,
|
|
17757
|
+
wrap,
|
|
17758
|
+
refreshHomePreset
|
|
17759
|
+
]),
|
|
17760
|
+
homeReturnSeconds,
|
|
17761
|
+
setHomeReturnSeconds: useCallback(async (seconds) => {
|
|
17762
|
+
if (!ptz) return;
|
|
17763
|
+
await wrap(() => ptz.setHomeReturnSeconds({ seconds }));
|
|
17764
|
+
await refreshHomeReturn();
|
|
17765
|
+
}, [
|
|
17766
|
+
ptz,
|
|
17767
|
+
wrap,
|
|
17768
|
+
refreshHomeReturn
|
|
17769
|
+
]),
|
|
17069
17770
|
goToPreset: useCallback(async (presetId) => {
|
|
17070
17771
|
if (!ptz) return;
|
|
17071
17772
|
await wrap(() => ptz.goToPreset({ presetId }));
|
|
@@ -17125,6 +17826,109 @@ function usePTZ(trpc, deviceId, hookOptions) {
|
|
|
17125
17826
|
};
|
|
17126
17827
|
}
|
|
17127
17828
|
//#endregion
|
|
17829
|
+
//#region src/composites/cap-settings/HomePresetPicker.tsx
|
|
17830
|
+
/**
|
|
17831
|
+
* Where "Home" sends this camera, and how it is set.
|
|
17832
|
+
*
|
|
17833
|
+
* ## Why this exists at all
|
|
17834
|
+
*
|
|
17835
|
+
* The vendor "convention" was wrong on every camera of this fleet. Three
|
|
17836
|
+
* providers each hardcoded a slot — reolink 0, hikvision '1', amcrest 1 — and
|
|
17837
|
+
* measured on 2026-09-17 those slots held "stanza", "Credenza" and "Preset1":
|
|
17838
|
+
* the operator's own presets, not a home. Two of the three swallowed the
|
|
17839
|
+
* failure, so a head that never moved looked exactly like one that went home.
|
|
17840
|
+
*
|
|
17841
|
+
* ## The mistake this component made first
|
|
17842
|
+
*
|
|
17843
|
+
* Its first version rendered NOTHING for `source: 'native'`, with a comment
|
|
17844
|
+
* saying "the camera homes natively; there is no preset to choose". That is
|
|
17845
|
+
* true for ONVIF, whose home is the fixed PTZ origin. It was written hours
|
|
17846
|
+
* before we learned that Reolink's native home is a GUARD POINT — a stored
|
|
17847
|
+
* position, settable, with its own idle-return timer — so the control was
|
|
17848
|
+
* hidden from the one vendor that most needed it. A comment that is right about
|
|
17849
|
+
* one case and read as covering all of them is exactly the leftover that reads
|
|
17850
|
+
* as verification.
|
|
17851
|
+
*
|
|
17852
|
+
* ## What each state offers now
|
|
17853
|
+
*
|
|
17854
|
+
* `native` — no preset to pick, but "Set home here" and, where the camera
|
|
17855
|
+
* has one, the idle-return delay.
|
|
17856
|
+
* `firmware` — the camera named its own home (Hikvision's "Back to origin").
|
|
17857
|
+
* Preselected; the operator may override.
|
|
17858
|
+
* `operator` — pinned here.
|
|
17859
|
+
* `none` — Home REFUSES, and the UI says so. A disabled feature must
|
|
17860
|
+
* never look like a broken one (D62).
|
|
17861
|
+
*/
|
|
17862
|
+
var SELECT_CLASS$2 = "rounded-md border border-border bg-surface px-2 py-1 text-[11px] text-foreground focus:border-primary focus:outline-none disabled:opacity-50";
|
|
17863
|
+
function HomePresetPicker({ controls }) {
|
|
17864
|
+
const { homePreset, presets, setHomePreset, captureHomeHere, homeReturnSeconds, setHomeReturnSeconds, busy } = controls;
|
|
17865
|
+
const [saving, setSaving] = useState(false);
|
|
17866
|
+
if (homePreset === null) return null;
|
|
17867
|
+
const disabled = busy || saving;
|
|
17868
|
+
const run = (action) => {
|
|
17869
|
+
setSaving(true);
|
|
17870
|
+
action().finally(() => setSaving(false));
|
|
17871
|
+
};
|
|
17872
|
+
const explanation = homePreset.source === "native" ? "This camera stores its own home position. “Set home here” pins it to where the camera is pointing now." : homePreset.source === "firmware" ? "Taken from the camera, which names this preset as its home." : homePreset.source === "none" ? "Nothing is set, so Home refuses rather than moving to an arbitrary preset." : "Pinned here. Clear it to fall back to the camera’s own home.";
|
|
17873
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
17874
|
+
className: "flex flex-col gap-2 px-2 pt-2",
|
|
17875
|
+
children: [
|
|
17876
|
+
homePreset.source !== "native" && /* @__PURE__ */ jsxs("label", {
|
|
17877
|
+
className: "flex flex-col gap-1",
|
|
17878
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
17879
|
+
className: "text-[10px] font-medium text-foreground-subtle",
|
|
17880
|
+
children: "Home preset"
|
|
17881
|
+
}), /* @__PURE__ */ jsxs("select", {
|
|
17882
|
+
value: homePreset.presetId ?? "",
|
|
17883
|
+
disabled,
|
|
17884
|
+
onChange: (e) => {
|
|
17885
|
+
const next = e.target.value === "" ? null : e.target.value;
|
|
17886
|
+
run(() => setHomePreset(next));
|
|
17887
|
+
},
|
|
17888
|
+
className: SELECT_CLASS$2,
|
|
17889
|
+
children: [/* @__PURE__ */ jsx("option", {
|
|
17890
|
+
value: "",
|
|
17891
|
+
children: "Not set — Home is refused"
|
|
17892
|
+
}), presets.map((preset) => /* @__PURE__ */ jsxs("option", {
|
|
17893
|
+
value: preset.id,
|
|
17894
|
+
children: [preset.name || preset.id, preset.fn === "home" ? " (camera’s own home)" : ""]
|
|
17895
|
+
}, preset.id))]
|
|
17896
|
+
})]
|
|
17897
|
+
}),
|
|
17898
|
+
/* @__PURE__ */ jsx("button", {
|
|
17899
|
+
type: "button",
|
|
17900
|
+
disabled,
|
|
17901
|
+
onClick: () => run(() => captureHomeHere()),
|
|
17902
|
+
className: "self-start rounded-md border border-border px-2 py-1 text-[11px] text-foreground hover:bg-primary/10 disabled:opacity-50",
|
|
17903
|
+
children: "Set home here"
|
|
17904
|
+
}),
|
|
17905
|
+
homeReturnSeconds !== null && /* @__PURE__ */ jsxs("label", {
|
|
17906
|
+
className: "flex flex-col gap-1",
|
|
17907
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
17908
|
+
className: "text-[10px] font-medium text-foreground-subtle",
|
|
17909
|
+
children: "Return home after (s)"
|
|
17910
|
+
}), /* @__PURE__ */ jsx("input", {
|
|
17911
|
+
type: "number",
|
|
17912
|
+
min: 0,
|
|
17913
|
+
max: 3600,
|
|
17914
|
+
defaultValue: homeReturnSeconds,
|
|
17915
|
+
disabled,
|
|
17916
|
+
onBlur: (e) => {
|
|
17917
|
+
const next = Number(e.target.value);
|
|
17918
|
+
if (!Number.isFinite(next) || next === homeReturnSeconds) return;
|
|
17919
|
+
run(() => setHomeReturnSeconds(Math.round(next)));
|
|
17920
|
+
},
|
|
17921
|
+
className: SELECT_CLASS$2
|
|
17922
|
+
})]
|
|
17923
|
+
}),
|
|
17924
|
+
/* @__PURE__ */ jsx("span", {
|
|
17925
|
+
className: "text-[10px] text-foreground-subtle",
|
|
17926
|
+
children: explanation
|
|
17927
|
+
})
|
|
17928
|
+
]
|
|
17929
|
+
});
|
|
17930
|
+
}
|
|
17931
|
+
//#endregion
|
|
17128
17932
|
//#region src/composites/ptz-overlay.tsx
|
|
17129
17933
|
/**
|
|
17130
17934
|
* PTZOverlay — pan / tilt / zoom controls.
|
|
@@ -17200,7 +18004,7 @@ function DPadButton({ direction, icon: Icon, disabled, className, variant, onMov
|
|
|
17200
18004
|
});
|
|
17201
18005
|
}
|
|
17202
18006
|
function PTZOverlay({ controls, mode = "overlay", showPresets, showZoom = true, showHome = true, className }) {
|
|
17203
|
-
const { move, startContinuous, stopContinuous, zoom, goHome, goToPreset, savePreset, updatePreset, deletePreset, presets, options, busy, error } = controls;
|
|
18007
|
+
const { move, startContinuous, stopContinuous, zoom, goHome, homePreset, goToPreset, savePreset, updatePreset, deletePreset, presets, options, busy, error } = controls;
|
|
17204
18008
|
const confirm = useConfirm();
|
|
17205
18009
|
const [presetsOpen, setPresetsOpen] = useState(false);
|
|
17206
18010
|
const [presetName, setPresetName] = useState("");
|
|
@@ -17368,8 +18172,8 @@ function PTZOverlay({ controls, mode = "overlay", showPresets, showZoom = true,
|
|
|
17368
18172
|
})] }), showHome && /* @__PURE__ */ jsx("button", {
|
|
17369
18173
|
type: "button",
|
|
17370
18174
|
onClick: () => goHome(),
|
|
17371
|
-
disabled: busy,
|
|
17372
|
-
title: "Go home",
|
|
18175
|
+
disabled: busy || homePreset?.source === "none",
|
|
18176
|
+
title: homePreset?.source === "none" ? "No home preset set for this camera — pick one in PTZ settings" : "Go home",
|
|
17373
18177
|
className: cn("flex items-center justify-center rounded disabled:opacity-40", sideButtonSize, sideButtonHover),
|
|
17374
18178
|
children: /* @__PURE__ */ jsx(House, { className: sideIconSize })
|
|
17375
18179
|
})]
|
|
@@ -17409,7 +18213,7 @@ function PTZOverlay({ controls, mode = "overlay", showPresets, showZoom = true,
|
|
|
17409
18213
|
disabled: busy,
|
|
17410
18214
|
className: cn("flex-1 px-3 py-1.5 text-left text-[10px] disabled:opacity-40", isPanel ? "text-foreground" : "text-white"),
|
|
17411
18215
|
children: p.name || p.id
|
|
17412
|
-
}), presetManagementVisible && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("button", {
|
|
18216
|
+
}), presetManagementVisible && p.writable && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("button", {
|
|
17413
18217
|
type: "button",
|
|
17414
18218
|
onClick: () => void handleUpdatePreset(p.id, p.name || p.id),
|
|
17415
18219
|
disabled: busy,
|
|
@@ -17545,10 +18349,14 @@ function PtzPanel({ deviceId }) {
|
|
|
17545
18349
|
title: "PTZ",
|
|
17546
18350
|
icon: /* @__PURE__ */ jsx(Move, { className: "h-3.5 w-3.5 text-foreground-subtle" }),
|
|
17547
18351
|
bodyClassName: "p-3 flex flex-col overflow-y-auto",
|
|
17548
|
-
children: [
|
|
17549
|
-
|
|
17550
|
-
|
|
17551
|
-
|
|
18352
|
+
children: [
|
|
18353
|
+
/* @__PURE__ */ jsx(PTZOverlay, {
|
|
18354
|
+
controls,
|
|
18355
|
+
mode: "panel"
|
|
18356
|
+
}),
|
|
18357
|
+
/* @__PURE__ */ jsx(HomePresetPicker, { controls }),
|
|
18358
|
+
hasAutofocus && /* @__PURE__ */ jsx(AutofocusToggle, { deviceId })
|
|
18359
|
+
]
|
|
17552
18360
|
});
|
|
17553
18361
|
}
|
|
17554
18362
|
//#endregion
|
|
@@ -19684,13 +20492,14 @@ function RecordingPanel({ deviceId }) {
|
|
|
19684
20492
|
* `type:'widget'` ConfigField. `WidgetSlot` resolves these BEFORE the
|
|
19685
20493
|
* Module-Federation `WidgetRegistry`. ids are namespaced `host/<name>`. */
|
|
19686
20494
|
var HOST_WIDGETS = {
|
|
19687
|
-
"host/motion-zones-grid": lazy(() => import("./MotionZonesSettings-
|
|
19688
|
-
"host/privacy-mask-grid": lazy(() => import("./PrivacyMaskSettings-
|
|
20495
|
+
"host/motion-zones-grid": lazy(() => import("./MotionZonesSettings-7c3yiT5E.js").then((m) => ({ default: m.MotionZonesSettings }))),
|
|
20496
|
+
"host/privacy-mask-grid": lazy(() => import("./PrivacyMaskSettings-PkYs077O.js").then((m) => ({ default: m.PrivacyMaskSettings }))),
|
|
19689
20497
|
"host/ptz-panel": PtzPanel,
|
|
19690
20498
|
"host/navigation-panel": NavigationPanel,
|
|
19691
20499
|
"host/consumables-panel": ConsumablesPanel,
|
|
19692
20500
|
"host/ptz-autotrack": AutotrackSection,
|
|
19693
|
-
"host/recording-panel": RecordingPanel
|
|
20501
|
+
"host/recording-panel": RecordingPanel,
|
|
20502
|
+
"host/camera-grid-layout": CameraGridLayoutEditor
|
|
19694
20503
|
};
|
|
19695
20504
|
//#endregion
|
|
19696
20505
|
//#region src/composites/widget-slot.tsx
|
|
@@ -43140,74 +43949,6 @@ function useDeviceNetworkLink(trpc, deviceId) {
|
|
|
43140
43949
|
return useDeviceState(trpc, deviceId, (s) => s.networkLink) ?? null;
|
|
43141
43950
|
}
|
|
43142
43951
|
//#endregion
|
|
43143
|
-
//#region src/hooks/use-device-snapshot.ts
|
|
43144
|
-
/**
|
|
43145
|
-
* useDeviceSnapshotImage — a device's snapshot as a plain image URL.
|
|
43146
|
-
*
|
|
43147
|
-
* ## What this used to do, and why it stopped
|
|
43148
|
-
*
|
|
43149
|
-
* It fetched `dev.snapshot.getSnapshot()` over tRPC and returned
|
|
43150
|
-
* `data:image/jpeg;base64,…`. That put a full camera capture — up to 4 K,
|
|
43151
|
-
* measured at 758 KB average per camera on the live hub — through the msgpack
|
|
43152
|
-
* WebSocket plane, base64-inflated by a third, and then held it in the
|
|
43153
|
-
* react-query heap for 24 h per device. The device list rendered it into a
|
|
43154
|
-
* **28 × 28 px `<img>`**.
|
|
43155
|
-
*
|
|
43156
|
-
* It also did not do what it appeared to do. `snapshot.getSnapshot` scoped to a
|
|
43157
|
-
* device routes to the NATIVE provider, not the snapshot wrapper, so it bypassed
|
|
43158
|
-
* the wrapper's cache, coalescing and stale-while-revalidate entirely: probed
|
|
43159
|
-
* live, a `force:true` call returned a fresh 1.05 MB JPEG in 0.55 s while the
|
|
43160
|
-
* wrapper's `lastCapturedAt` for that camera did not move. Two snapshot paths,
|
|
43161
|
-
* different behaviour, and only one of them maintained the cache the other one
|
|
43162
|
-
* reported on.
|
|
43163
|
-
*
|
|
43164
|
-
* ## What it does now
|
|
43165
|
-
*
|
|
43166
|
-
* Returns the same URL the viewer uses: `/addon/snapshot/media/<id>.jpg?w=<n>`,
|
|
43167
|
-
* served by the wrapper over the HTTP data plane. Relative and same-origin, so
|
|
43168
|
-
* the admin UI's `camstack_session` cookie authenticates it — the endpoint is
|
|
43169
|
-
* `access: 'authenticated'`, which accepts either a Bearer header or that
|
|
43170
|
-
* cookie, and a bare `<img>` can only send the cookie. This is the same
|
|
43171
|
-
* mechanism the native `<video>` fallback in `hls-video.tsx` already relies on.
|
|
43172
|
-
*
|
|
43173
|
-
* Caching is now the browser's, which is the point: `ETag` +
|
|
43174
|
-
* `Cache-Control: private, max-age=<device maxAgeS>` means a repeat render is a
|
|
43175
|
-
* cache hit and a revalidation is a 0-byte 304. No JS heap, no msgpack, no
|
|
43176
|
-
* base64. Nothing to configure — unlike `expo-image` on native, browsers
|
|
43177
|
-
* revalidate a stale URL rather than treating it as immutable, so the URL stays
|
|
43178
|
-
* stable and does NOT need a version parameter.
|
|
43179
|
-
*/
|
|
43180
|
-
/** The hub-proxied path prefix for the snapshot image data plane, composed
|
|
43181
|
-
* below on `baseUrl` or, for the same-origin case, on the page's mount. */
|
|
43182
|
-
var SNAPSHOT_MEDIA_PATH = "/addon/snapshot/media";
|
|
43183
|
-
function useDeviceSnapshotImage(deviceId, options = {}) {
|
|
43184
|
-
const { width, baseUrl } = options;
|
|
43185
|
-
const [refreshNonce, setRefreshNonce] = useState(0);
|
|
43186
|
-
return {
|
|
43187
|
-
src: useMemo(() => {
|
|
43188
|
-
if (deviceId === null || deviceId <= 0) return null;
|
|
43189
|
-
const base = baseUrl !== void 0 ? baseUrl.replace(/\/+$/, "") : routerBasename();
|
|
43190
|
-
const params = new URLSearchParams();
|
|
43191
|
-
if (width !== void 0 && Number.isInteger(width) && width > 0) params.set("w", String(width));
|
|
43192
|
-
if (refreshNonce > 0) {
|
|
43193
|
-
params.set("force", "1");
|
|
43194
|
-
params.set("r", String(refreshNonce));
|
|
43195
|
-
}
|
|
43196
|
-
const query = params.toString();
|
|
43197
|
-
return `${base}${SNAPSHOT_MEDIA_PATH}/${String(deviceId)}.jpg${query.length > 0 ? `?${query}` : ""}`;
|
|
43198
|
-
}, [
|
|
43199
|
-
deviceId,
|
|
43200
|
-
width,
|
|
43201
|
-
baseUrl,
|
|
43202
|
-
refreshNonce
|
|
43203
|
-
]),
|
|
43204
|
-
loading: false,
|
|
43205
|
-
refresh: useCallback(() => {
|
|
43206
|
-
setRefreshNonce((n) => n + 1);
|
|
43207
|
-
}, [])
|
|
43208
|
-
};
|
|
43209
|
-
}
|
|
43210
|
-
//#endregion
|
|
43211
43952
|
//#region src/composites/hover-zoom-image.tsx
|
|
43212
43953
|
/**
|
|
43213
43954
|
* <HoverZoomImage> — a small thumbnail that expands into a floating
|
|
@@ -50344,91 +51085,6 @@ function useDeviceWebrtc(trpc, deviceId, pollIntervalMs = 5e3) {
|
|
|
50344
51085
|
};
|
|
50345
51086
|
}
|
|
50346
51087
|
//#endregion
|
|
50347
|
-
//#region src/hooks/use-devices.ts
|
|
50348
|
-
/**
|
|
50349
|
-
* useDevices / useDevice — reactive sync-mirror reads.
|
|
50350
|
-
*
|
|
50351
|
-
* Both hooks hand out `DeviceProxy` references straight out of the
|
|
50352
|
-
* `System` mirror. The mirror keeps device + binding caches warm via
|
|
50353
|
-
* the `device.registered/unregistered/bindings-changed` event stream,
|
|
50354
|
-
* so re-renders are driven by lifecycle pushes — no React Query
|
|
50355
|
-
* round-trip and no `refetch` plumbing needed at the caller side.
|
|
50356
|
-
*
|
|
50357
|
-
* The hooks defensively read once on mount and assume the System has
|
|
50358
|
-
* been `init()`ed by the host app — calls before the warm-boot
|
|
50359
|
-
* completes simply return an empty array / null and re-render once
|
|
50360
|
-
* the registered listeners fire.
|
|
50361
|
-
*/
|
|
50362
|
-
/**
|
|
50363
|
-
* Reactive list of devices matching the optional filter set. Returns a
|
|
50364
|
-
* stable array reference between updates so consumers passing it as a
|
|
50365
|
-
* prop don't tear down memoized children.
|
|
50366
|
-
*/
|
|
50367
|
-
function useDevices(filters) {
|
|
50368
|
-
const system = useSystem();
|
|
50369
|
-
const filtersKey = useMemo(() => filters ? JSON.stringify(filters) : "", [filters]);
|
|
50370
|
-
const [devices, setDevices] = useState(() => system.listDevices(filters));
|
|
50371
|
-
useEffect(() => {
|
|
50372
|
-
const refresh = () => {
|
|
50373
|
-
setDevices(system.listDevices(filters));
|
|
50374
|
-
};
|
|
50375
|
-
refresh();
|
|
50376
|
-
let unsubAdded = null;
|
|
50377
|
-
let unsubRemoved = null;
|
|
50378
|
-
try {
|
|
50379
|
-
unsubAdded = system.onDeviceAdded(refresh);
|
|
50380
|
-
unsubRemoved = system.onDeviceRemoved(refresh);
|
|
50381
|
-
} catch {}
|
|
50382
|
-
const unsubConn = system.subscribeConnectionEvents((state) => {
|
|
50383
|
-
if (state === "connected") refresh();
|
|
50384
|
-
});
|
|
50385
|
-
return () => {
|
|
50386
|
-
unsubAdded?.();
|
|
50387
|
-
unsubRemoved?.();
|
|
50388
|
-
unsubConn();
|
|
50389
|
-
};
|
|
50390
|
-
}, [
|
|
50391
|
-
system,
|
|
50392
|
-
filters,
|
|
50393
|
-
filtersKey
|
|
50394
|
-
]);
|
|
50395
|
-
return devices;
|
|
50396
|
-
}
|
|
50397
|
-
/**
|
|
50398
|
-
* Single-device variant. Returns `null` until the device is in the
|
|
50399
|
-
* mirror; re-renders when the device is removed (back to `null`) or
|
|
50400
|
-
* added.
|
|
50401
|
-
*/
|
|
50402
|
-
function useDevice(deviceId) {
|
|
50403
|
-
const system = useSystem();
|
|
50404
|
-
const [device, setDevice] = useState(() => deviceId === null ? null : system.getDevice(deviceId));
|
|
50405
|
-
useEffect(() => {
|
|
50406
|
-
if (deviceId === null) {
|
|
50407
|
-
setDevice(null);
|
|
50408
|
-
return;
|
|
50409
|
-
}
|
|
50410
|
-
const refresh = () => {
|
|
50411
|
-
setDevice(system.getDevice(deviceId));
|
|
50412
|
-
};
|
|
50413
|
-
refresh();
|
|
50414
|
-
let unsubAdded = null;
|
|
50415
|
-
let unsubRemoved = null;
|
|
50416
|
-
try {
|
|
50417
|
-
unsubAdded = system.onDeviceAdded(refresh);
|
|
50418
|
-
unsubRemoved = system.onDeviceRemoved(refresh);
|
|
50419
|
-
} catch {}
|
|
50420
|
-
const unsubConn = system.subscribeConnectionEvents((state) => {
|
|
50421
|
-
if (state === "connected") refresh();
|
|
50422
|
-
});
|
|
50423
|
-
return () => {
|
|
50424
|
-
unsubAdded?.();
|
|
50425
|
-
unsubRemoved?.();
|
|
50426
|
-
unsubConn();
|
|
50427
|
-
};
|
|
50428
|
-
}, [system, deviceId]);
|
|
50429
|
-
return device;
|
|
50430
|
-
}
|
|
50431
|
-
//#endregion
|
|
50432
51088
|
//#region src/hooks/use-doorbell-events.ts
|
|
50433
51089
|
/**
|
|
50434
51090
|
* useDoorbellEvents — subscribe to doorbell.onPressed across the cluster.
|
|
@@ -50693,12 +51349,12 @@ function mirror(input) {
|
|
|
50693
51349
|
* Render inside `<Suspense>` at all call sites. */
|
|
50694
51350
|
var MaskShapeCanvas = lazy(() => import("./MaskShapeCanvas-DI4BY7W2.js").then((m) => ({ default: m.MaskShapeCanvas })));
|
|
50695
51351
|
/** Lazy-wrapped `MotionZonesSettings` — code-split off the main bundle. */
|
|
50696
|
-
var MotionZonesSettings = lazy(() => import("./MotionZonesSettings-
|
|
51352
|
+
var MotionZonesSettings = lazy(() => import("./MotionZonesSettings-7c3yiT5E.js").then((m) => ({ default: m.MotionZonesSettings })));
|
|
50697
51353
|
/** Lazy-wrapped `SceneMonitorEditor` — code-split off the main bundle for the
|
|
50698
51354
|
* same reason: it mounts `MaskShapeCanvas`, which chains react-konva. Render
|
|
50699
51355
|
* inside `<Suspense>`; the admin-ui `/scenes` dialog is its only caller. */
|
|
50700
|
-
var SceneMonitorEditor = lazy(() => import("./SceneMonitorEditor-
|
|
51356
|
+
var SceneMonitorEditor = lazy(() => import("./SceneMonitorEditor-BvDy3x3k.js").then((m) => ({ default: m.SceneMonitorEditor })));
|
|
50701
51357
|
/** Lazy-wrapped `PrivacyMaskSettings` — code-split off the main bundle. */
|
|
50702
|
-
var PrivacyMaskSettings = lazy(() => import("./PrivacyMaskSettings-
|
|
51358
|
+
var PrivacyMaskSettings = lazy(() => import("./PrivacyMaskSettings-PkYs077O.js").then((m) => ({ default: m.PrivacyMaskSettings })));
|
|
50703
51359
|
//#endregion
|
|
50704
|
-
export { AddonGlobalSettingsForm, AgentStepEditor, AlarmHeroCard, AlarmInlineControl as AlarmPanelInlineControl, AppShell, ArcKnob, AudioClassificationList, AudioLevelWaveform, AudioWaveform, AutomationHeroCard, AutomationInlineControl, AutotrackSection, BTN_COMPACT, BTN_COMPACT_DANGER, BTN_COMPACT_PRIMARY, BTN_COMPACT_WARNING, Badge, BatteryBadge, BottomSheet, Breadcrumb, BrightnessPanel, Button, ButtonControl, ButtonHeroCard, CARD_MODE_MIN_COLUMNS, 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, CodeBlock, CollapsibleCard, ConfigFormBuilder, FormField as ConfigFormField, ConfigSchemaField, ConfirmActionButton, ConfirmDialogProvider, ConsumablesPanel, ContainerChildrenProvider, ContainerPrimaryHero, ControlColumn, ControlHeroCard, ControlInlineControl, ControlPanel, CopyButton, CoverHeroCard, CoverInlineControl, CoverPanel, CustomFieldRenderersProvider, DEFAULT_COLOR, DEVICE_COLUMNS, DEVICE_LIST_PAGE_SIZE_KEY, DEVICE_LIST_PAGE_SIZE_OPTIONS, DEVICE_ROLE_META, DEVICE_TYPE_CONTROL, DEVICE_TYPE_META, DISPLAY_ICON_REGISTRY, DataTable, DetectionCanvas, DetectionOverlay, DetectionResultTree, DevShell, DeviceActivityPanel, DeviceBatchToolbar, DeviceCard, DeviceContextProvider, DeviceExportPanel, DeviceGrid, DeviceItem, DeviceList, DeviceMultiSelectField, DeviceSelectField, DeviceSelectorPicker, DeviceStepMatrix, Dialog, DialogBody, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, DiscoveryPanel, DoorbellRecentPanel, Dropdown, DropdownContent, DropdownItem, DropdownTrigger, DummyHeroCard, DummyInline, EVENT_KIND_ICONS, EmptyState, ErrorBox, EventKindGlyph, EventStream, FILL, FLEET_LIST_GC_TIME_MS, FLEET_LIST_QUERY_KEY, FLEET_LIST_STALE_TIME_MS, FanHeroCard, FanInlineControl, FanPanel, FilterBar, FloatingEventStream, FloatingLogStream, FloatingPanel, FormField$1 as FormField, GRID_GAP, GRID_PAIRED, GRID_QUICK_STATS, GripTrack, GroupedModelSelector, HOST_WIDGETS, HlsVideo, HoverZoomImage, HumidifierHeroCard, HumidifierInlineControl, INPUT_COMPACT, IconAction, IconButton, ImageHeroCard, ImageInlineControl, ImageSelector, InferenceConfigSelector, Input, KebabMenu, KeyValueList, LIST_ROW, Label, LawnMowerHeroCard, LawnMowerInlineControl, LightHeroCard, LightInlineControl, LockHeroCard, LockInlineControl, LockPanel, LogStream, LoginForm, MODE_COLOR, MaskShapeCanvas, MediaPlayerHeroCard, MediaPlayerInlineControl, MediaPlayerPanel, MobileDrawer, ModelPicker, MotionZonesSettings, NAVIGATION_DRIVE_INTERVAL_MS, NavigationPanel, NetworkLinkBadge, NodeMultiSelectField, NodePicker, NodeSelectField, OfflineBadge, PHASE_CONFIG, PRIORITY, PTZOverlay, PageHeader, PhaseIcon, PipelineBuilder, PipelineRuntimeSelector, PipelineStep, PipelineTreeMatrix, PlayerOverlaysProvider, Popover, PopoverContent, PopoverRowAction, PopoverTrigger, PrimaryChildPicker, PrivacyMaskSettings, ProviderBadge, PtzPanel, QrCode, RECONNECT_POLICY, RECORDED_PLAYBACK_MODES, RIGHT, ROI_AREA_WARN_FRACTION, ROLE_DESCRIPTOR, RadialGauge, RecordedPlaybackProvider, RecordingPanel, ResponseLog, SCENE_CAPTURE_VARIANTS, 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, SceneMonitorEditor, ScopePicker, ScriptHeroCard, ScriptInlineControl, ScrollArea, Select, SemanticBadge, SensorHeroCard, SensorInlineControl, SensorValueAtom, Separator, SettingRow, Sidebar, SidebarItem, Skeleton, SlideOverPanel, SlideToggle, SnapshotButton, SortHeaderButton, StatCard, StateValuesStream, StatusBadge, StepTimings, StepTreeMaster, Stepper, StreamBrokerSelector, StreamPanel, Switch, SwitchHeroCard, SwitchInlineControl, SwitchPanel, SystemProvider, 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, Tooltip, TooltipContent, TooltipTrigger, VacuumHeroCard, VacuumInlineControl, ValueReadout, ValveHeroCard, ValveInlineControl, VersionBadge, VodPlaybackProvider, WaterHeaterHeroCard, WaterHeaterInlineControl, WeatherHeroCard, WeatherInlineControl, WidgetMetricCard, WidgetPanel, WidgetRegistryProvider, WidgetSlot, ZoneEditingProvider, ImageOff as a, agentColumnKey, allDeviceTypeFilterOptions, applyFleetQueryDefaults, ariaSortForColumn, badgeFor, buildStepTreeFromSchema, createLucideIcon as c, childEntityId, childListName, cn, columnsForContext, containerChildToRef, countableDevices, coverHighlight, coverageLine, createSharedContext, createTheme, cursorFractionFor, darkColors, defaultTheme, deriveDeviceKind, describeDeviceSelector, deviceMatchesFilter, deviceOptionLabel, deviceRoleMeta, deviceRoleMetaOf, deviceTypeLabel, deviceTypeMeta, deviceTypeMetaOf, devicesToOptions, ensureMfHostInit, eventKindLabel, filterDeviceOptions, findTimezone, formatControlDateTime, formatLastSeen, formatNumeric, fuzzyMatch, getClassColor, getPhaseVisual, groupAgentColumns, groupChildrenByLayout, hardwareLabel, hubOrigin, hubPath, hubUrl, hubWsUrl, humanDuration, humidifierTint, Mic as i, initialScrubState, isAbsentProvider, isFieldVisible, lawnMowerActivityMeta, lightColors, loadRemoteBundle, makeScrubBridge, metadataEntries, metadataString, mirror, mountAddonPage, mountPath, Square as n, nextReconnectAction, nextSort, nextSortDirection, nextTableSort, normalizeForSearch, EyeOff as o, openTopLayer, overrideEntityIdFromLink, parseRecordedServerMessage, providerIcons, RotateCcw as r, resetHubMountForTests, resolveContainerPrimary, resolveControlAlign, resolveDeviceControl, resolveDisplayIcon, resolveEffectiveDefaultModel, resolveEffectiveStepModel, resolveEventKindIcon, resolvePrimaryChild, resolveSensorDisplay, resolveStepDefaultModel, resolveTableLayout, roiTooLarge, routerBasename, Camera as s, scrubReducer, selectedDeviceOptions, serializeRecordedCommand, shouldCommit, shouldEmit, shouldUseSingleNode, sortRows, sortRowsByColumn, statusIcons, statusLine, stepHasModelForFormat, stepModelOptions, stripParentNamePrefix, Trash2 as t, tabForSelector, tankAlert, themeToCss, toStationaryOverlayBox, trpc, useAccessoriesGetStatus, useAccessoriesSetChildHidden, useAddonPagesListPages, useAddonSettingsGetDeviceSettings, useAddonSettingsGetGlobalSettings, useAddonSettingsGetIntegrationSettings, useAddonSettingsUpdateDeviceSettings, useAddonSettingsUpdateGlobalSettings, useAddonWidgetsListWidgets, useAddonsApplyAutoUpdateToAll, useAddonsCancelJob, useAddonsCustom, useAddonsForceRefresh, useAddonsGetAddonAutoUpdate, useAddonsGetAutoUpdateSettings, useAddonsGetJob, useAddonsGetLastRestart, useAddonsGetLogs, useAddonsGetVersions, useAddonsInstallFromWorkspace, useAddonsInstallPackage, useAddonsIsWorkspaceAvailable, useAddonsList, useAddonsListCapabilityProviders, useAddonsListFrameworkPackages, 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, useBackupDelete, useBackupDeleteSchedule, useBackupGetEntries, useBackupList, useBackupListArchives, useBackupListDestinations, useBackupListLocations, useBackupListRuns, useBackupListSchedules, useBackupPreviewSchedule, useBackupRestore, 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, useCameraCredentialsGetCredentials, useCameraCredentialsGetStatus, useCameraPipelineConfigApplyDeviceSettingsPatch, useCameraPipelineConfigGetDeviceLiveContribution, useCameraPipelineConfigGetDeviceSettingsContribution, useCameraStreamsGetBrokerStreams, useCameraStreamsGetCameraStreams, useCameraStreamsGetProfileRtspEntries, useCameraStreamsGetRtspEntries, useCameraStreamsPickStream, 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, useCoreBlocksDelete, useCoreBlocksGet, useCoreBlocksGetTypeDefs, useCoreBlocksList, useCoreBlocksRestart, useCoreBlocksSetEnabled, useCoreBlocksUpdate, useCoverClose, useCoverGetStatus, useCoverOpen, useCoverSetPosition, useCoverSetTiltPosition, useCoverStop, useCustomFieldRenderer, useDayNightGetOptions, useDayNightGetStatus, useDayNightSetSettings, useDebouncedString, useDecoderCreateSession, useDecoderDestroySession, useDecoderGetFrame, useDecoderGetInfo, useDecoderGetShmStats, useDecoderGetStats, useDecoderListActiveSessions, useDecoderOpenStream, useDecoderPullFrames, useDecoderPullHandles, useDecoderPushPacket, useDecoderReprobeHwaccel, useDecoderSupportsCodec, useDecoderUpdateConfig, useDetectionPipelineApplyDeviceSettingsPatch, useDetectionPipelineGetDeviceLiveContribution, useDetectionPipelineGetDeviceSettingsContribution, useDevShell, useDevice, useDeviceAdoptionAdopt, useDeviceAdoptionGetCandidate, useDeviceAdoptionGetStatus, useDeviceAdoptionListCandidateFilters, useDeviceAdoptionListCandidates, useDeviceAdoptionRefresh, useDeviceAdoptionRelease, useDeviceAdoptionResync, useDeviceAutotrack, useDeviceBattery, useDeviceCapSlice, useDeviceCapability, useDeviceDetections, useDeviceDiscoveryAdoptDevice, useDeviceDiscoveryGetStatus, useDeviceDiscoveryListDiscovered, useDeviceDiscoveryRefreshDiscovery, useDeviceDiscoveryReleaseDevice, useDeviceExportApplyDeviceSettingsPatch, useDeviceExportExposeDevice, useDeviceExportGetDeviceLiveContribution, useDeviceExportGetDeviceSettingsContribution, useDeviceExportGetStatus, useDeviceExportListExposedDevices, useDeviceExportListSupportedDeviceKinds, useDeviceExportUnexposeDevice, useDeviceId, useDeviceListPageSize, useDeviceManagerAddLocation, useDeviceManagerAdoptDevice, useDeviceManagerAdoptionAdopt, useDeviceManagerAdoptionCancelJob, useDeviceManagerAdoptionListCandidateFilters, useDeviceManagerAdoptionListCandidates, useDeviceManagerAdoptionListJobs, useDeviceManagerAdoptionRefresh, useDeviceManagerAdoptionRelease, useDeviceManagerAdoptionResync, useDeviceManagerAdoptionStartJob, useDeviceManagerAllocateDeviceId, useDeviceManagerApplyDeviceSettingsPatch, useDeviceManagerApplyInitialMeta, useDeviceManagerCreateDevice, useDeviceManagerDisable, useDeviceManagerDiscoverAllProviders, useDeviceManagerDiscoverDevices, useDeviceManagerDiscoverProvider, useDeviceManagerDiscoveryProviders, useDeviceManagerEnable, useDeviceManagerGetAllBindings, useDeviceManagerGetBindings, useDeviceManagerGetBindingsBatch, useDeviceManagerGetChildren, useDeviceManagerGetChildrenBatch, useDeviceManagerGetConfigSchema, useDeviceManagerGetCreationSchema, useDeviceManagerGetDevice, useDeviceManagerGetDeviceAggregate, useDeviceManagerGetDeviceLiveContribution, useDeviceManagerGetDeviceLiveInfoAggregate, useDeviceManagerGetDeviceSettingsAggregate, useDeviceManagerGetDeviceSettingsContribution, useDeviceManagerGetDeviceStatusAggregate, useDeviceManagerGetDeviceStatusAggregateBatch, useDeviceManagerGetLinkedDevices, useDeviceManagerGetLinkedDevicesBatch, useDeviceManagerGetRoleDisplayDefaults, useDeviceManagerGetSettingsSchema, useDeviceManagerGetStreamProfileMap, useDeviceManagerGetStreamSources, useDeviceManagerGetWireableFields, useDeviceManagerListAll, useDeviceManagerListBindableCapsForDeviceType, 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, useDeviceSnapshot, useDeviceSnapshotImage, useDeviceState, useDeviceStateGetAllSnapshots, useDeviceStateGetCapSlice, useDeviceStateGetSnapshot, useDeviceStateSetCapSlice, useDeviceStateSlice, useDeviceStatusGetStatus, useDeviceWebrtc, useDevices, useDoorbellApplyDeviceSettingsPatch, useDoorbellEvents, useDoorbellGetDeviceLiveContribution, useDoorbellGetDeviceSettingsContribution, useDoorbellGetStatus, useEnumSensorGetStatus, useEventEmitterGetStatus, useEventInvalidation, useEventStreamLatest, useEventStreamMap, useEventsGetEventClipUrl, useEventsGetEventThumbnail, useEventsGetEvents, 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, useImageGetStatus, useImageSettingsGetOptions, useImageSettingsGetStatus, useImageSettingsSetSettings, useIntegrationsCreate, useIntegrationsDelete, useIntegrationsGet, useIntegrationsGetAvailableTypes, useIntegrationsGetByAddonId, useIntegrationsGetSettings, useIntegrationsList, useIntegrationsSetSettings, useIntegrationsTestConnection, useIntegrationsUpdate, useIntercomEndTalkSession, useIntercomGetStatus, useIntercomHandleAnswer, useIntercomPushTalkAudio, useIntercomStartSession, useIntercomStartTalkSession, useIntercomStopSession, useIsMidWidth, useIsMobile, useLawnMowerControlDock, useLawnMowerControlGetStatus, useLawnMowerControlPause, useLawnMowerControlStartMowing, useLiveBuffer, useLiveEvent, useLlmCancel, useLlmDeleteModel, useLlmDeleteProfile, useLlmGenerate, useLlmGenerateVision, useLlmGetDefaults, useLlmGetRuntimeStatus, useLlmGetUsage, useLlmInstallModel, useLlmListModelCatalog, useLlmListModels, useLlmListNodeModels, useLlmListProfileKinds, useLlmListProfiles, useLlmListRuntimeNodes, useLlmResolveModelRef, useLlmSetDefault, useLlmStartRuntime, useLlmStopRuntime, useLlmTestProfile, useLlmUpsertProfile, useLocalNetworkDownloadCa, useLocalNetworkGetAllowedAddresses, useLocalNetworkGetConnectionEndpoints, useLocalNetworkGetNotificationEndpoint, useLocalNetworkGetPreferred, useLocalNetworkGetTlsStatus, useLocalNetworkGetViewerEndpoints, useLocalNetworkList, useLocalNetworkRegenerateCertificate, useLocalNetworkResetAllowlistToBestMatch, useLocalNetworkRevertToGeneratedCertificate, useLocalNetworkSetAllowedAddresses, useLocalNetworkSetNotificationEndpoint, useLocalNetworkSetViewerEndpoints, useLocalNetworkUploadCertificate, 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, useNodesExecuteQuery, useNodesGetCapUsageGraph, useNodesGetNodeAddons, useNodesRenameNode, useNodesRestartAddon, useNodesRestartNode, useNodesRestartProcess, useNodesSetProcessLogLevel, useNodesShutdownNode, useNodesTopology, useNodesUndeployAddon, useNotificationOutputDeleteTarget, useNotificationOutputDiscoverTargets, useNotificationOutputListTargetKinds, useNotificationOutputListTargets, useNotificationOutputSend, useNotificationOutputSetTargetEnabled, useNotificationOutputTestTarget, useNotificationOutputUpsertTarget, useNotificationRulesCancelSnooze, useNotificationRulesCreateRule, useNotificationRulesCreateSnooze, useNotificationRulesDeleteRule, useNotificationRulesGetAlarmConfig, useNotificationRulesGetClipRetentionAsks, useNotificationRulesGetConditionCatalog, useNotificationRulesGetHistory, useNotificationRulesGetRule, useNotificationRulesListDeviceMutes, useNotificationRulesListRules, useNotificationRulesListSnoozes, useNotificationRulesResolveArtifactUrl, useNotificationRulesSetAlarmConfig, useNotificationRulesSetDeviceMuted, useNotificationRulesSetRuleEnabled, useNotificationRulesTestRule, useNotificationRulesUpdateRule, useNotifierCancel, useNotifierGetStatus, useNotifierSend, useNumericSensorGetStatus, useOptimisticSlice, useOptionalSystem, useOptionalWidgetRegistry, useOsdGetStatus, useOsdManagerClearSlotBinding, useOsdManagerCopyDeviceConfiguration, useOsdManagerGetConditionSupport, useOsdManagerGetDeviceOsd, useOsdManagerGetSourceCatalog, useOsdManagerPreviewSlot, useOsdManagerRenderDevice, useOsdManagerSetSlotBinding, useOsdSetOverlay, usePTZ, usePetFeederCallPet, usePetFeederCancelFeed, usePetFeederFeed, usePetFeederGetStatus, usePetFeederMarkFoodReplenished, usePetFeederPlaySound, usePetFeederResetDesiccant, usePetFeederSetChildLock, usePetFeederSetFeedSound, usePetFeederSetIndicatorLight, usePetFeederSetVolume, usePipelineAnalyticsApplyDeviceSettingsPatch, usePipelineAnalyticsCancelRelocateMedia, usePipelineAnalyticsCancelStorageMigrationMove, usePipelineAnalyticsClearTracks, usePipelineAnalyticsCompleteRetrainTrack, usePipelineAnalyticsCountRelocatableMedia, usePipelineAnalyticsCountUnstampedEventMedia, usePipelineAnalyticsDeleteDeviceEvents, usePipelineAnalyticsDeleteTracks, usePipelineAnalyticsDeselectRetrainFrame, usePipelineAnalyticsGetActiveTracks, usePipelineAnalyticsGetAudioEvents, usePipelineAnalyticsGetDeviceLiveContribution, usePipelineAnalyticsGetDeviceSettingsContribution, usePipelineAnalyticsGetEventDensity, usePipelineAnalyticsGetEventDensityBatch, usePipelineAnalyticsGetEventMedia, usePipelineAnalyticsGetEventMediaFootprintByKind, usePipelineAnalyticsGetEventStoreFootprint, usePipelineAnalyticsGetKeyEvents, usePipelineAnalyticsGetKeyEventsBatch, usePipelineAnalyticsGetMediaReclaimStatus, usePipelineAnalyticsGetMotionEvents, usePipelineAnalyticsGetObjectEmbeddingRebuildStatus, usePipelineAnalyticsGetObjectEvents, usePipelineAnalyticsGetRetrainExportUrl, usePipelineAnalyticsGetRetrainFrameImage, usePipelineAnalyticsGetSensorEvents, usePipelineAnalyticsGetStorageMigrationMoveStatus, usePipelineAnalyticsGetSummary, usePipelineAnalyticsGetTrack, usePipelineAnalyticsGetTrackMedia, usePipelineAnalyticsGetTrainingExportSummary, usePipelineAnalyticsGetTrainingExportUrl, usePipelineAnalyticsListArchivedDebugNotes, usePipelineAnalyticsListBirthDecisions, usePipelineAnalyticsListEventKinds, usePipelineAnalyticsListEventKindsBatch, usePipelineAnalyticsListEventMedia, usePipelineAnalyticsListOpsLog, usePipelineAnalyticsListRecentSummaries, usePipelineAnalyticsListRecentTracks, usePipelineAnalyticsListRelocateMediaJobs, usePipelineAnalyticsListRetrainAnnotations, usePipelineAnalyticsListRetrainFrames, usePipelineAnalyticsListRetrainStaging, usePipelineAnalyticsListSummaries, usePipelineAnalyticsListTrackMedia, usePipelineAnalyticsListTracks, usePipelineAnalyticsPauseForStorageMigration, usePipelineAnalyticsProposeRetrainAnnotations, usePipelineAnalyticsPruneEvents, usePipelineAnalyticsPruneEventsBefore, usePipelineAnalyticsPruneTracksBefore, usePipelineAnalyticsReadLongTermSeries, usePipelineAnalyticsRebuildObjectEmbeddings, usePipelineAnalyticsReclaimDebugMedia, usePipelineAnalyticsReconcileFromDisk, usePipelineAnalyticsRefreshStorageLocationsForMigration, usePipelineAnalyticsRelocateMedia, usePipelineAnalyticsRestageRetrainTrack, usePipelineAnalyticsResumeForStorageMigration, usePipelineAnalyticsRunReplayFrameProcessor, usePipelineAnalyticsSaveRetrainAnnotations, usePipelineAnalyticsSearchObjectEvents, usePipelineAnalyticsSelectRetrainFrames, usePipelineAnalyticsSetTrackFlags, usePipelineAnalyticsStartStorageMigrationMove, usePipelineAnalyticsWipeAllAnalytics, usePipelineAnalyticsWipeObjectEmbeddings, usePipelineExecutorCacheFrameInPool, usePipelineExecutorClearDeviceOverrides, usePipelineExecutorDeleteModel, usePipelineExecutorDeleteTemplate, usePipelineExecutorDownloadModel, usePipelineExecutorGetAddonModels, usePipelineExecutorGetAudioCapabilities, usePipelineExecutorGetAvailableEngines, usePipelineExecutorGetCapabilities, usePipelineExecutorGetDefaultSteps, usePipelineExecutorGetDetectionConfigSchema, usePipelineExecutorGetEffectiveTuning, usePipelineExecutorGetEngineProvisioning, usePipelineExecutorGetGlobalPipelineConfig, usePipelineExecutorGetGlobalSteps, usePipelineExecutorGetInferenceDeviceHealth, usePipelineExecutorGetOrchestratorConfigSchema, usePipelineExecutorGetReferenceAudio, usePipelineExecutorGetReferenceAudioFiles, usePipelineExecutorGetReferenceImage, usePipelineExecutorGetSchema, usePipelineExecutorGetSelectedEngine, usePipelineExecutorGetVideoPipelineSteps, usePipelineExecutorInferCached, usePipelineExecutorKillEngine, usePipelineExecutorListLoadedEngines, usePipelineExecutorListReferenceImages, usePipelineExecutorListTemplates, usePipelineExecutorRearmInferenceDevice, usePipelineExecutorRunAudioTest, usePipelineExecutorRunPipeline, usePipelineExecutorRunPipelineBatch, usePipelineExecutorSaveTemplate, usePipelineExecutorSetVideoPipelineSteps, usePipelineExecutorSpinEngine, usePipelineExecutorUncacheFrame, usePipelineExecutorUpdateTemplate, usePipelineExecutorValidatePipeline, usePipelineOrchestratorApplyDeviceSettingsPatch, usePipelineOrchestratorAssignAudio, usePipelineOrchestratorAssignPipeline, usePipelineOrchestratorDeleteTemplate, usePipelineOrchestratorGetAgentLoad, usePipelineOrchestratorGetAgentSettings, usePipelineOrchestratorGetAudioAssignment, usePipelineOrchestratorGetAudioAssignments, usePipelineOrchestratorGetAudioNodeLoad, usePipelineOrchestratorGetCameraMetrics, usePipelineOrchestratorGetCameraSettings, usePipelineOrchestratorGetCameraStatus, usePipelineOrchestratorGetCameraStatuses, usePipelineOrchestratorGetCameraStepOverrides, usePipelineOrchestratorGetCameraSwitches, usePipelineOrchestratorGetCapabilityBindings, usePipelineOrchestratorGetDeviceLiveContribution, usePipelineOrchestratorGetDeviceSettingsContribution, usePipelineOrchestratorGetGlobalMetrics, usePipelineOrchestratorGetIngestOwner, usePipelineOrchestratorGetNodeInferenceDevices, usePipelineOrchestratorGetPipelineAssignment, usePipelineOrchestratorGetPipelineAssignments, usePipelineOrchestratorGetPipelineDevicePin, usePipelineOrchestratorGetReconcileFromDiskStatus, usePipelineOrchestratorListAgentSettings, usePipelineOrchestratorListTemplates, usePipelineOrchestratorPauseForStorageMigration, usePipelineOrchestratorRebalance, usePipelineOrchestratorReconcileFromDisk, usePipelineOrchestratorRemoveAgentSettings, usePipelineOrchestratorResetNodePipelineDefaults, usePipelineOrchestratorResolvePipeline, usePipelineOrchestratorResumeForStorageMigration, usePipelineOrchestratorSaveTemplate, usePipelineOrchestratorSetAgentCapabilities, usePipelineOrchestratorSetAgentDecodeLimits, usePipelineOrchestratorSetAgentDetectWeight, usePipelineOrchestratorSetAgentInferenceDevices, usePipelineOrchestratorSetAgentMaxCameras, usePipelineOrchestratorSetAgentReachableHost, usePipelineOrchestratorSetCameraPipelineForAgent, usePipelineOrchestratorSetCameraStepOverride, usePipelineOrchestratorSetCameraStepToggle, usePipelineOrchestratorSetCameraSwitch, usePipelineOrchestratorSetCapabilityBinding, usePipelineOrchestratorSetPipelineDevicePin, usePipelineOrchestratorUnassignAudio, usePipelineOrchestratorUnassignPipeline, usePipelineOrchestratorUpdateTemplate, usePipelineRunnerAttachCamera, usePipelineRunnerDetachCamera, usePipelineRunnerGetAllCameraMetrics, usePipelineRunnerGetCameraMetrics, usePipelineRunnerGetLocalCameras, usePipelineRunnerGetLocalLoad, usePipelineRunnerGetLocalMetrics, usePipelineRunnerGetNativeCrop, usePipelineRunnerGetParkedTrackFrame, usePipelineRunnerParkTrackFrame, usePipelineRunnerReleaseParkedTrackFrames, usePipelineRunnerReportMotion, usePipelineRunnerRequestOccupancyBurst, usePipelineRunnerRunDetailSubtree, usePipelineRunnerRunStatelessStep, 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, usePtzContinuousMove, usePtzDeletePreset, usePtzGetOptions, usePtzGetPosition, usePtzGetPresets, usePtzGetStatus, usePtzGoHome, usePtzGoToPreset, usePtzMove, usePtzSavePreset, usePtzSetAutofocus, usePtzStop, useRebootReboot, useRecordedPlayback, useRecordingApplyDeviceSettingsPatch, useRecordingCancelRelocateJob, useRecordingCancelStorageMigrationMove, useRecordingDeleteFootprint, useRecordingExportCancelExport, useRecordingExportCreateExport, useRecordingExportDeleteExport, useRecordingExportGetDownloadUrl, useRecordingExportGetExport, useRecordingExportListExports, useRecordingExportReadExportBytes, useRecordingGetAvailability, useRecordingGetAvailabilityBatch, useRecordingGetDaysWithRecordings, useRecordingGetDaysWithRecordingsBatch, useRecordingGetDeviceConfig, useRecordingGetDeviceLiveContribution, useRecordingGetDeviceSettingsContribution, useRecordingGetPlacement, useRecordingGetPlaybackManifest, useRecordingGetRelocateResidue, useRecordingGetStatus, useRecordingGetStorageMigrationMoveStatus, useRecordingGetStorageUsage, useRecordingListOpsLog, useRecordingListRelocateJobs, useRecordingLocateSegment, useRecordingPauseForStorageMigration, useRecordingPlanStorageRebalance, useRecordingPruneFootage, useRecordingReadGopBytes, useRecordingReadSegmentBytes, useRecordingReadWindowBytes, useRecordingReconcileLedgerAgainstDisk, useRecordingRefreshStorageLocationsForMigration, useRecordingRelocateFootage, useRecordingRenderClip, useRecordingRenderGif, useRecordingRescanStorage, useRecordingResumeForStorageMigration, useRecordingSetDeviceConfig, useRecordingSetDevicePlacement, useRecordingSignalGetStatus, useRecordingStartStorageMigrationMove, useRecordingStartStorageRebalance, useRemoteComponent, 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, useSettingsStoreUpdate, useSettingsStoreUpdateWhere, useSettingsStoreUpsert, 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, useStreamBrokerAcquireEgressTranscode, useStreamBrokerApplyDeviceSettingsPatch, useStreamBrokerAssignProfile, useStreamBrokerFetchEventMedia, useStreamBrokerForgetDeviceHardware, useStreamBrokerGetAllRtspEntries, useStreamBrokerGetBrokerStats, useStreamBrokerGetDeviceAudioMute, useStreamBrokerGetDeviceLiveContribution, useStreamBrokerGetDeviceSettingsContribution, useStreamBrokerGetPreBufferInfo, useStreamBrokerGetRtspEntry, useStreamBrokerGetRtspPort, useStreamBrokerGetStreamUrl, useStreamBrokerGetStreamWithCodec, useStreamBrokerIsRtspEnabled, useStreamBrokerKillClient, useStreamBrokerListAllCameraStreams, useStreamBrokerListAllProfileSlots, useStreamBrokerListClients, useStreamBrokerProbeStream, useStreamBrokerProduceEventMedia, useStreamBrokerPublishCameraStream, useStreamBrokerPullAudioChunks, useStreamBrokerPullFrameHandles, useStreamBrokerRegenerateRtspToken, useStreamBrokerReleaseEgressTranscode, useStreamBrokerReleaseStreamWithCodec, useStreamBrokerRenderPreBufferClip, useStreamBrokerReportStreamSignal, useStreamBrokerRestartProfile, useStreamBrokerRetractCameraStream, useStreamBrokerSetDeviceAudioMute, useStreamBrokerSetPreBufferDuration, useStreamBrokerSetRtspEnabled, useStreamBrokerSubscribeAudioChunks, useStreamBrokerSubscribeFrames, useStreamBrokerUnassignProfile, useStreamBrokerUnsubscribeAudioChunks, useStreamBrokerUnsubscribeFrames, 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, useTurnProviderGetTurnServers, useUpdateGetStatus, useUpdateInstallUpdate, useUserManagementConfirmTotp, useUserManagementCreateApiKey, useUserManagementCreateScopedToken, useUserManagementCreateUser, useUserManagementDeleteUser, useUserManagementDisableTotp, useUserManagementGetTotpStatus, useUserManagementListApiKeys, useUserManagementListOauthSessions, useUserManagementListScopedTokens, useUserManagementListUsers, useUserManagementOauthExchangeCode, useUserManagementOauthIssueCode, useUserManagementOauthRefresh, useUserManagementOauthVerifyAccessToken, useUserManagementResetPassword, useUserManagementRevokeApiKey, useUserManagementRevokeOauthSession, useUserManagementRevokeScopedToken, useUserManagementSetUserScopes, useUserManagementSetupTotp, useUserManagementUpdateUser, useUserManagementValidateApiKey, useUserManagementValidateCredentials, useUserManagementValidateScopedToken, useUserManagementVerifyTotp, useVacuumControlGetStatus, useVacuumControlLocate, useVacuumControlPause, useVacuumControlReturnToBase, useVacuumControlSetFanSpeed, useVacuumControlStart, useVacuumControlStop, useValveClose, useValveGetStatus, useValveOpen, useValveSetPosition, useValveStop, useVibrationGetStatus, useVideoclipsGetClipPlayback, useVideoclipsListClips, useVodPlayback, useWaterHeaterGetStatus, useWaterHeaterSetAway, useWaterHeaterSetOperationMode, useWaterHeaterSetTargetTemp, useWeatherGetStatus, useWebrtcSessionAddIceCandidate, useWebrtcSessionCloseSession, useWebrtcSessionCreateSession, useWebrtcSessionGetIceCandidates, useWebrtcSessionGetSessionState, useWebrtcSessionHandleAnswer, useWebrtcSessionHandleOffer, useWebrtcSessionHasAdaptiveBitrate, useWebrtcSessionListStreams, useWidget, useWidgetMetadata, useWidgetRegistry, useZoneAnalyticsGetCameraHistory, useZoneAnalyticsGetCurrentSnapshot, useZoneAnalyticsGetCurrentSnapshotBatch, useZoneAnalyticsGetUnzonedHistory, useZoneAnalyticsGetZoneHistory, useZoneEditing, useZoneRulesListRules, useZoneRulesSetRules, useZonesAddZone, useZonesListZones, useZonesRemoveZone, useZonesUpdateZone, vacuumStateMeta, validateScopes, valveStateMeta, variantLabel, waterHeaterPhase, waterHeaterTint, weatherConditionMeta, weatherTint };
|
|
51360
|
+
export { AddonGlobalSettingsForm, AgentStepEditor, AlarmHeroCard, AlarmInlineControl as AlarmPanelInlineControl, AppShell, ArcKnob, AudioClassificationList, AudioLevelWaveform, AudioWaveform, AutomationHeroCard, AutomationInlineControl, AutotrackSection, BTN_COMPACT, BTN_COMPACT_DANGER, BTN_COMPACT_PRIMARY, BTN_COMPACT_WARNING, Badge, BatteryBadge, BottomSheet, Breadcrumb, BrightnessPanel, Button, ButtonControl, ButtonHeroCard, CARD_MODE_MIN_COLUMNS, 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, CodeBlock, CollapsibleCard, ConfigFormBuilder, FormField as ConfigFormField, ConfigSchemaField, ConfirmActionButton, ConfirmDialogProvider, ConsumablesPanel, ContainerChildrenProvider, ContainerPrimaryHero, ControlColumn, ControlHeroCard, ControlInlineControl, ControlPanel, CopyButton, CoverHeroCard, CoverInlineControl, CoverPanel, CustomFieldRenderersProvider, DEFAULT_COLOR, DEVICE_COLUMNS, DEVICE_LIST_PAGE_SIZE_KEY, DEVICE_LIST_PAGE_SIZE_OPTIONS, DEVICE_ROLE_META, DEVICE_TYPE_CONTROL, DEVICE_TYPE_META, DISPLAY_ICON_REGISTRY, DataTable, DetectionCanvas, DetectionOverlay, DetectionResultTree, DevShell, DeviceActivityPanel, DeviceBatchToolbar, DeviceCard, DeviceContextProvider, DeviceExportPanel, DeviceGrid, DeviceItem, DeviceList, DeviceMultiSelectField, DeviceSelectField, DeviceSelectorPicker, DeviceStepMatrix, Dialog, DialogBody, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, DiscoveryPanel, DoorbellRecentPanel, Dropdown, DropdownContent, DropdownItem, DropdownTrigger, DummyHeroCard, DummyInline, EVENT_KIND_ICONS, EmptyState, ErrorBox, EventKindGlyph, EventStream, FILL, FLEET_LIST_GC_TIME_MS, FLEET_LIST_QUERY_KEY, FLEET_LIST_STALE_TIME_MS, FanHeroCard, FanInlineControl, FanPanel, FilterBar, FloatingEventStream, FloatingLogStream, FloatingPanel, FormField$1 as FormField, GRID_GAP, GRID_PAIRED, GRID_QUICK_STATS, GripTrack, GroupedModelSelector, HOST_WIDGETS, HlsVideo, HoverZoomImage, HumidifierHeroCard, HumidifierInlineControl, INPUT_COMPACT, IconAction, IconButton, ImageHeroCard, ImageInlineControl, ImageSelector, InferenceConfigSelector, Input, KebabMenu, KeyValueList, LIST_ROW, Label, LawnMowerHeroCard, LawnMowerInlineControl, LightHeroCard, LightInlineControl, LockHeroCard, LockInlineControl, LockPanel, LogStream, LoginForm, MODE_COLOR, MaskShapeCanvas, MediaPlayerHeroCard, MediaPlayerInlineControl, MediaPlayerPanel, MobileDrawer, ModelPicker, MotionZonesSettings, NAVIGATION_DRIVE_INTERVAL_MS, NavigationPanel, NetworkLinkBadge, NodeMultiSelectField, NodePicker, NodeSelectField, OfflineBadge, PHASE_CONFIG, PRIORITY, PTZOverlay, PageHeader, PhaseIcon, PipelineBuilder, PipelineRuntimeSelector, PipelineStep, PipelineTreeMatrix, PlayerOverlaysProvider, Popover, PopoverContent, PopoverRowAction, PopoverTrigger, PrimaryChildPicker, PrivacyMaskSettings, ProviderBadge, PtzPanel, QrCode, RECONNECT_POLICY, RECORDED_PLAYBACK_MODES, RIGHT, ROI_AREA_WARN_FRACTION, ROLE_DESCRIPTOR, RadialGauge, RecordedPlaybackProvider, RecordingPanel, ResponseLog, SCENE_CAPTURE_VARIANTS, 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, SceneMonitorEditor, ScopePicker, ScriptHeroCard, ScriptInlineControl, ScrollArea, Select, SemanticBadge, SensorHeroCard, SensorInlineControl, SensorValueAtom, Separator, SettingRow, Sidebar, SidebarItem, Skeleton, SlideOverPanel, SlideToggle, SnapshotButton, SortHeaderButton, StatCard, StateValuesStream, StatusBadge, StepTimings, StepTreeMaster, Stepper, StreamBrokerSelector, StreamPanel, Switch, SwitchHeroCard, SwitchInlineControl, SwitchPanel, SystemProvider, 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, Tooltip, TooltipContent, TooltipTrigger, VacuumHeroCard, VacuumInlineControl, ValueReadout, ValveHeroCard, ValveInlineControl, VersionBadge, VodPlaybackProvider, WaterHeaterHeroCard, WaterHeaterInlineControl, WeatherHeroCard, WeatherInlineControl, WidgetMetricCard, WidgetPanel, WidgetRegistryProvider, WidgetSlot, ZoneEditingProvider, ImageOff as a, agentColumnKey, allDeviceTypeFilterOptions, applyFleetQueryDefaults, ariaSortForColumn, badgeFor, buildStepTreeFromSchema, Camera as c, childEntityId, childListName, cn, columnsForContext, containerChildToRef, countableDevices, coverHighlight, coverageLine, createSharedContext, createTheme, cursorFractionFor, darkColors, defaultTheme, deriveDeviceKind, describeDeviceSelector, deviceMatchesFilter, deviceOptionLabel, deviceRoleMeta, deviceRoleMetaOf, deviceTypeLabel, deviceTypeMeta, deviceTypeMetaOf, devicesToOptions, ensureMfHostInit, eventKindLabel, filterDeviceOptions, findTimezone, formatControlDateTime, formatLastSeen, formatNumeric, fuzzyMatch, getClassColor, getPhaseVisual, groupAgentColumns, groupChildrenByLayout, hardwareLabel, hubOrigin, hubPath, hubUrl, hubWsUrl, humanDuration, humidifierTint, Mic as i, initialScrubState, isAbsentProvider, isFieldVisible, createLucideIcon as l, lawnMowerActivityMeta, lightColors, loadRemoteBundle, makeScrubBridge, metadataEntries, metadataString, mirror, mountAddonPage, mountPath, Square as n, nextReconnectAction, nextSort, nextSortDirection, nextTableSort, normalizeForSearch, Grid2x2 as o, openTopLayer, overrideEntityIdFromLink, parseRecordedServerMessage, providerIcons, RotateCcw as r, resetHubMountForTests, resolveContainerPrimary, resolveControlAlign, resolveDeviceControl, resolveDisplayIcon, resolveEffectiveDefaultModel, resolveEffectiveStepModel, resolveEventKindIcon, resolvePrimaryChild, resolveSensorDisplay, resolveStepDefaultModel, resolveTableLayout, roiTooLarge, routerBasename, EyeOff as s, scrubReducer, selectedDeviceOptions, serializeRecordedCommand, shouldCommit, shouldEmit, shouldUseSingleNode, sortRows, sortRowsByColumn, statusIcons, statusLine, stepHasModelForFormat, stepModelOptions, stripParentNamePrefix, Trash2 as t, tabForSelector, tankAlert, themeToCss, toStationaryOverlayBox, trpc, useAccessoriesGetStatus, useAccessoriesSetChildHidden, useAddonPagesListPages, useAddonSettingsGetDeviceSettings, useAddonSettingsGetGlobalSettings, useAddonSettingsGetIntegrationSettings, useAddonSettingsUpdateDeviceSettings, useAddonSettingsUpdateGlobalSettings, useAddonWidgetsListWidgets, useAddonsApplyAutoUpdateToAll, useAddonsCancelJob, useAddonsCustom, useAddonsForceRefresh, useAddonsGetAddonAutoUpdate, useAddonsGetAutoUpdateSettings, useAddonsGetJob, useAddonsGetLastRestart, useAddonsGetLogs, useAddonsGetVersions, useAddonsInstallFromWorkspace, useAddonsInstallPackage, useAddonsIsWorkspaceAvailable, useAddonsList, useAddonsListCapabilityProviders, useAddonsListFrameworkPackages, 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, useBackupDelete, useBackupDeleteSchedule, useBackupGetEntries, useBackupList, useBackupListArchives, useBackupListDestinations, useBackupListLocations, useBackupListRuns, useBackupListSchedules, useBackupPreviewSchedule, useBackupRestore, 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, useCameraCredentialsGetCredentials, useCameraCredentialsGetStatus, useCameraPipelineConfigApplyDeviceSettingsPatch, useCameraPipelineConfigGetDeviceLiveContribution, useCameraPipelineConfigGetDeviceSettingsContribution, useCameraStreamsGetBrokerStreams, useCameraStreamsGetCameraStreams, useCameraStreamsGetProfileRtspEntries, useCameraStreamsGetRtspEntries, useCameraStreamsPickStream, 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, useCoreBlocksDelete, useCoreBlocksGet, useCoreBlocksGetTypeDefs, useCoreBlocksList, useCoreBlocksRestart, useCoreBlocksSetEnabled, useCoreBlocksUpdate, useCoverClose, useCoverGetStatus, useCoverOpen, useCoverSetPosition, useCoverSetTiltPosition, useCoverStop, useCustomFieldRenderer, useDayNightGetOptions, useDayNightGetStatus, useDayNightSetSettings, useDebouncedString, useDecoderCreateSession, useDecoderDestroySession, useDecoderGetFrame, useDecoderGetInfo, useDecoderGetShmStats, useDecoderGetStats, useDecoderListActiveSessions, useDecoderOpenStream, useDecoderPullFrames, useDecoderPullHandles, useDecoderPushPacket, useDecoderReprobeHwaccel, useDecoderSupportsCodec, useDecoderUpdateConfig, useDetectionPipelineApplyDeviceSettingsPatch, useDetectionPipelineGetDeviceLiveContribution, useDetectionPipelineGetDeviceSettingsContribution, useDevShell, useDevice, useDeviceAdoptionAdopt, useDeviceAdoptionGetCandidate, useDeviceAdoptionGetStatus, useDeviceAdoptionListCandidateFilters, useDeviceAdoptionListCandidates, useDeviceAdoptionRefresh, useDeviceAdoptionRelease, useDeviceAdoptionResync, useDeviceAutotrack, useDeviceBattery, useDeviceCapSlice, useDeviceCapability, useDeviceDetections, useDeviceDiscoveryAdoptDevice, useDeviceDiscoveryGetStatus, useDeviceDiscoveryListDiscovered, useDeviceDiscoveryRefreshDiscovery, useDeviceDiscoveryReleaseDevice, useDeviceExportApplyDeviceSettingsPatch, useDeviceExportExposeDevice, useDeviceExportGetDeviceLiveContribution, useDeviceExportGetDeviceSettingsContribution, useDeviceExportGetStatus, useDeviceExportListExposedDevices, useDeviceExportListSupportedDeviceKinds, useDeviceExportUnexposeDevice, useDeviceId, useDeviceListPageSize, useDeviceManagerAddLocation, useDeviceManagerAdoptDevice, useDeviceManagerAdoptionAdopt, useDeviceManagerAdoptionCancelJob, useDeviceManagerAdoptionListCandidateFilters, useDeviceManagerAdoptionListCandidates, useDeviceManagerAdoptionListJobs, useDeviceManagerAdoptionRefresh, useDeviceManagerAdoptionRelease, useDeviceManagerAdoptionResync, useDeviceManagerAdoptionStartJob, useDeviceManagerAllocateDeviceId, useDeviceManagerApplyDeviceSettingsPatch, useDeviceManagerApplyInitialMeta, useDeviceManagerCreateDevice, useDeviceManagerDisable, useDeviceManagerDiscoverAllProviders, useDeviceManagerDiscoverDevices, useDeviceManagerDiscoverProvider, useDeviceManagerDiscoveryProviders, useDeviceManagerEnable, useDeviceManagerGetAllBindings, useDeviceManagerGetBindings, useDeviceManagerGetBindingsBatch, useDeviceManagerGetChildren, useDeviceManagerGetChildrenBatch, useDeviceManagerGetConfigSchema, useDeviceManagerGetCreationSchema, useDeviceManagerGetDevice, useDeviceManagerGetDeviceAggregate, useDeviceManagerGetDeviceLiveContribution, useDeviceManagerGetDeviceLiveInfoAggregate, useDeviceManagerGetDeviceSettingsAggregate, useDeviceManagerGetDeviceSettingsContribution, useDeviceManagerGetDeviceStatusAggregate, useDeviceManagerGetDeviceStatusAggregateBatch, useDeviceManagerGetLinkedDevices, useDeviceManagerGetLinkedDevicesBatch, useDeviceManagerGetRoleDisplayDefaults, useDeviceManagerGetSettingsSchema, useDeviceManagerGetStreamProfileMap, useDeviceManagerGetStreamSources, useDeviceManagerGetWireableFields, useDeviceManagerListAll, useDeviceManagerListBindableCapsForDeviceType, 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, useDeviceSnapshot, useDeviceSnapshotImage, useDeviceState, useDeviceStateGetAllSnapshots, useDeviceStateGetCapSlice, useDeviceStateGetSnapshot, useDeviceStateSetCapSlice, useDeviceStateSlice, useDeviceStatusGetStatus, useDeviceWebrtc, useDevices, useDoorbellApplyDeviceSettingsPatch, useDoorbellEvents, useDoorbellGetDeviceLiveContribution, useDoorbellGetDeviceSettingsContribution, useDoorbellGetStatus, useEnumSensorGetStatus, useEventEmitterGetStatus, useEventInvalidation, useEventStreamLatest, useEventStreamMap, useEventsGetEventClipUrl, useEventsGetEventThumbnail, useEventsGetEvents, 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, useImageGetStatus, useImageSettingsGetOptions, useImageSettingsGetStatus, useImageSettingsSetSettings, useIntegrationsCreate, useIntegrationsDelete, useIntegrationsGet, useIntegrationsGetAvailableTypes, useIntegrationsGetByAddonId, useIntegrationsGetSettings, useIntegrationsList, useIntegrationsSetSettings, useIntegrationsTestConnection, useIntegrationsUpdate, useIntercomEndTalkSession, useIntercomGetStatus, useIntercomHandleAnswer, useIntercomPushTalkAudio, useIntercomStartSession, useIntercomStartTalkSession, useIntercomStopSession, useIsMidWidth, useIsMobile, useLawnMowerControlDock, useLawnMowerControlGetStatus, useLawnMowerControlPause, useLawnMowerControlStartMowing, useLiveBuffer, useLiveEvent, useLlmCancel, useLlmDeleteModel, useLlmDeleteProfile, useLlmGenerate, useLlmGenerateVision, useLlmGetDefaults, useLlmGetRuntimeStatus, useLlmGetUsage, useLlmInstallModel, useLlmListModelCatalog, useLlmListModels, useLlmListNodeModels, useLlmListProfileKinds, useLlmListProfiles, useLlmListRuntimeNodes, useLlmResolveModelRef, useLlmSetDefault, useLlmStartRuntime, useLlmStopRuntime, useLlmTestProfile, useLlmUpsertProfile, useLocalNetworkDownloadCa, useLocalNetworkGetAllowedAddresses, useLocalNetworkGetConnectionEndpoints, useLocalNetworkGetNotificationEndpoint, useLocalNetworkGetPreferred, useLocalNetworkGetTlsStatus, useLocalNetworkGetViewerEndpoints, useLocalNetworkList, useLocalNetworkRegenerateCertificate, useLocalNetworkResetAllowlistToBestMatch, useLocalNetworkRevertToGeneratedCertificate, useLocalNetworkSetAllowedAddresses, useLocalNetworkSetNotificationEndpoint, useLocalNetworkSetViewerEndpoints, useLocalNetworkUploadCertificate, 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, useNodesExecuteQuery, useNodesGetCapUsageGraph, useNodesGetNodeAddons, useNodesRenameNode, useNodesRestartAddon, useNodesRestartNode, useNodesRestartProcess, useNodesSetProcessLogLevel, useNodesShutdownNode, useNodesTopology, useNodesUndeployAddon, useNotificationOutputDeleteTarget, useNotificationOutputDiscoverTargets, useNotificationOutputListTargetKinds, useNotificationOutputListTargets, useNotificationOutputSend, useNotificationOutputSetTargetEnabled, useNotificationOutputTestTarget, useNotificationOutputUpsertTarget, useNotificationRulesCancelSnooze, useNotificationRulesCreateRule, useNotificationRulesCreateSnooze, useNotificationRulesDeleteRule, useNotificationRulesGetAlarmConfig, useNotificationRulesGetClipRetentionAsks, useNotificationRulesGetConditionCatalog, useNotificationRulesGetHistory, useNotificationRulesGetRule, useNotificationRulesListDeviceMutes, useNotificationRulesListRules, useNotificationRulesListSnoozes, useNotificationRulesResolveArtifactUrl, useNotificationRulesSetAlarmConfig, useNotificationRulesSetDeviceMuted, useNotificationRulesSetRuleEnabled, useNotificationRulesTestRule, useNotificationRulesUpdateRule, useNotifierCancel, useNotifierGetStatus, useNotifierSend, useNumericSensorGetStatus, useOptimisticSlice, useOptionalSystem, useOptionalWidgetRegistry, useOsdGetStatus, useOsdManagerClearSlotBinding, useOsdManagerCopyDeviceConfiguration, useOsdManagerGetConditionSupport, useOsdManagerGetDeviceOsd, useOsdManagerGetSourceCatalog, useOsdManagerPreviewSlot, useOsdManagerRenderDevice, useOsdManagerSetSlotBinding, useOsdSetOverlay, usePTZ, usePetFeederCallPet, usePetFeederCancelFeed, usePetFeederFeed, usePetFeederGetStatus, usePetFeederMarkFoodReplenished, usePetFeederPlaySound, usePetFeederResetDesiccant, usePetFeederSetChildLock, usePetFeederSetFeedSound, usePetFeederSetIndicatorLight, usePetFeederSetVolume, usePipelineAnalyticsApplyDeviceSettingsPatch, usePipelineAnalyticsCancelRelocateMedia, usePipelineAnalyticsCancelStorageMigrationMove, usePipelineAnalyticsClearTracks, usePipelineAnalyticsCompleteRetrainTrack, usePipelineAnalyticsCountRelocatableMedia, usePipelineAnalyticsCountUnstampedEventMedia, usePipelineAnalyticsDeleteDeviceEvents, usePipelineAnalyticsDeleteTracks, usePipelineAnalyticsDeselectRetrainFrame, usePipelineAnalyticsGetActiveTracks, usePipelineAnalyticsGetAudioEvents, usePipelineAnalyticsGetDeviceLiveContribution, usePipelineAnalyticsGetDeviceSettingsContribution, usePipelineAnalyticsGetEventDensity, usePipelineAnalyticsGetEventDensityBatch, usePipelineAnalyticsGetEventMedia, usePipelineAnalyticsGetEventMediaFootprintByKind, usePipelineAnalyticsGetEventStoreFootprint, usePipelineAnalyticsGetKeyEvents, usePipelineAnalyticsGetKeyEventsBatch, usePipelineAnalyticsGetMediaReclaimStatus, usePipelineAnalyticsGetMotionEvents, usePipelineAnalyticsGetObjectEmbeddingRebuildStatus, usePipelineAnalyticsGetObjectEvents, usePipelineAnalyticsGetRetrainExportUrl, usePipelineAnalyticsGetRetrainFrameImage, usePipelineAnalyticsGetSensorEvents, usePipelineAnalyticsGetStorageMigrationMoveStatus, usePipelineAnalyticsGetSummary, usePipelineAnalyticsGetTrack, usePipelineAnalyticsGetTrackMedia, usePipelineAnalyticsGetTrainingExportSummary, usePipelineAnalyticsGetTrainingExportUrl, usePipelineAnalyticsListArchivedDebugNotes, usePipelineAnalyticsListBirthDecisions, usePipelineAnalyticsListEventKinds, usePipelineAnalyticsListEventKindsBatch, usePipelineAnalyticsListEventMedia, usePipelineAnalyticsListOpsLog, usePipelineAnalyticsListRecentSummaries, usePipelineAnalyticsListRecentTracks, usePipelineAnalyticsListRelocateMediaJobs, usePipelineAnalyticsListRetrainAnnotations, usePipelineAnalyticsListRetrainFrames, usePipelineAnalyticsListRetrainStaging, usePipelineAnalyticsListSummaries, usePipelineAnalyticsListTrackMedia, usePipelineAnalyticsListTracks, usePipelineAnalyticsPauseForStorageMigration, usePipelineAnalyticsProposeRetrainAnnotations, usePipelineAnalyticsPruneEvents, usePipelineAnalyticsPruneEventsBefore, usePipelineAnalyticsPruneTracksBefore, usePipelineAnalyticsReadLongTermSeries, usePipelineAnalyticsRebuildObjectEmbeddings, usePipelineAnalyticsReclaimDebugMedia, usePipelineAnalyticsReconcileFromDisk, usePipelineAnalyticsRefreshStorageLocationsForMigration, usePipelineAnalyticsRelocateMedia, usePipelineAnalyticsRestageRetrainTrack, usePipelineAnalyticsResumeForStorageMigration, usePipelineAnalyticsRunReplayFrameProcessor, usePipelineAnalyticsSaveRetrainAnnotations, usePipelineAnalyticsSearchObjectEvents, usePipelineAnalyticsSelectRetrainFrames, usePipelineAnalyticsSetTrackFlags, usePipelineAnalyticsStartStorageMigrationMove, usePipelineAnalyticsWipeAllAnalytics, usePipelineAnalyticsWipeObjectEmbeddings, usePipelineExecutorCacheFrameInPool, usePipelineExecutorClearDeviceOverrides, usePipelineExecutorDeleteModel, usePipelineExecutorDeleteTemplate, usePipelineExecutorDownloadModel, usePipelineExecutorGetAddonModels, usePipelineExecutorGetAudioCapabilities, usePipelineExecutorGetAvailableEngines, usePipelineExecutorGetCapabilities, usePipelineExecutorGetDefaultSteps, usePipelineExecutorGetDetectionConfigSchema, usePipelineExecutorGetEffectiveTuning, usePipelineExecutorGetEngineProvisioning, usePipelineExecutorGetGlobalPipelineConfig, usePipelineExecutorGetGlobalSteps, usePipelineExecutorGetInferenceDeviceHealth, usePipelineExecutorGetOrchestratorConfigSchema, usePipelineExecutorGetReferenceAudio, usePipelineExecutorGetReferenceAudioFiles, usePipelineExecutorGetReferenceImage, usePipelineExecutorGetSchema, usePipelineExecutorGetSelectedEngine, usePipelineExecutorGetVideoPipelineSteps, usePipelineExecutorInferCached, usePipelineExecutorKillEngine, usePipelineExecutorListLoadedEngines, usePipelineExecutorListReferenceImages, usePipelineExecutorListTemplates, usePipelineExecutorRearmInferenceDevice, usePipelineExecutorRunAudioTest, usePipelineExecutorRunPipeline, usePipelineExecutorRunPipelineBatch, usePipelineExecutorSaveTemplate, usePipelineExecutorSetVideoPipelineSteps, usePipelineExecutorSpinEngine, usePipelineExecutorUncacheFrame, usePipelineExecutorUpdateTemplate, usePipelineExecutorValidatePipeline, usePipelineOrchestratorApplyDeviceSettingsPatch, usePipelineOrchestratorAssignAudio, usePipelineOrchestratorAssignPipeline, usePipelineOrchestratorDeleteTemplate, usePipelineOrchestratorGetAgentLoad, usePipelineOrchestratorGetAgentSettings, usePipelineOrchestratorGetAudioAssignment, usePipelineOrchestratorGetAudioAssignments, usePipelineOrchestratorGetAudioNodeLoad, usePipelineOrchestratorGetCameraMetrics, usePipelineOrchestratorGetCameraSettings, usePipelineOrchestratorGetCameraStatus, usePipelineOrchestratorGetCameraStatuses, usePipelineOrchestratorGetCameraStepOverrides, usePipelineOrchestratorGetCameraSwitches, usePipelineOrchestratorGetCapabilityBindings, usePipelineOrchestratorGetDeviceLiveContribution, usePipelineOrchestratorGetDeviceSettingsContribution, usePipelineOrchestratorGetGlobalMetrics, usePipelineOrchestratorGetIngestOwner, usePipelineOrchestratorGetNodeInferenceDevices, usePipelineOrchestratorGetPipelineAssignment, usePipelineOrchestratorGetPipelineAssignments, usePipelineOrchestratorGetPipelineDevicePin, usePipelineOrchestratorGetReconcileFromDiskStatus, usePipelineOrchestratorListAgentSettings, usePipelineOrchestratorListTemplates, usePipelineOrchestratorPauseForStorageMigration, usePipelineOrchestratorRebalance, usePipelineOrchestratorReconcileFromDisk, usePipelineOrchestratorRemoveAgentSettings, usePipelineOrchestratorResetNodePipelineDefaults, usePipelineOrchestratorResolvePipeline, usePipelineOrchestratorResumeForStorageMigration, usePipelineOrchestratorSaveTemplate, usePipelineOrchestratorSetAgentCapabilities, usePipelineOrchestratorSetAgentDecodeLimits, usePipelineOrchestratorSetAgentDetectWeight, usePipelineOrchestratorSetAgentInferenceDevices, usePipelineOrchestratorSetAgentMaxCameras, usePipelineOrchestratorSetAgentReachableHost, usePipelineOrchestratorSetCameraPipelineForAgent, usePipelineOrchestratorSetCameraStepOverride, usePipelineOrchestratorSetCameraStepToggle, usePipelineOrchestratorSetCameraSwitch, usePipelineOrchestratorSetCapabilityBinding, usePipelineOrchestratorSetPipelineDevicePin, usePipelineOrchestratorUnassignAudio, usePipelineOrchestratorUnassignPipeline, usePipelineOrchestratorUpdateTemplate, usePipelineRunnerAttachCamera, usePipelineRunnerDetachCamera, usePipelineRunnerGetAllCameraMetrics, usePipelineRunnerGetCameraMetrics, usePipelineRunnerGetLocalCameras, usePipelineRunnerGetLocalLoad, usePipelineRunnerGetLocalMetrics, usePipelineRunnerGetNativeCrop, usePipelineRunnerGetParkedTrackFrame, usePipelineRunnerParkTrackFrame, usePipelineRunnerReleaseParkedTrackFrames, usePipelineRunnerReportMotion, usePipelineRunnerRequestOccupancyBurst, usePipelineRunnerRunDetailSubtree, usePipelineRunnerRunStatelessStep, 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, usePtzGetHomeReturnSeconds, usePtzGetOptions, usePtzGetPosition, usePtzGetPresets, usePtzGetStatus, usePtzGoHome, usePtzGoToPreset, usePtzMove, usePtzSavePreset, usePtzSetAutofocus, usePtzSetHomePreset, usePtzSetHomeReturnSeconds, usePtzStop, useRebootReboot, useRecordedPlayback, useRecordingApplyDeviceSettingsPatch, useRecordingCancelRelocateJob, useRecordingCancelStorageMigrationMove, useRecordingDeleteFootprint, useRecordingExportCancelExport, useRecordingExportCreateExport, useRecordingExportDeleteExport, useRecordingExportGetDownloadUrl, useRecordingExportGetExport, useRecordingExportListExports, useRecordingExportReadExportBytes, useRecordingGetAvailability, useRecordingGetAvailabilityBatch, useRecordingGetDaysWithRecordings, useRecordingGetDaysWithRecordingsBatch, useRecordingGetDeviceConfig, useRecordingGetDeviceLiveContribution, useRecordingGetDeviceSettingsContribution, useRecordingGetPlacement, useRecordingGetPlaybackManifest, useRecordingGetRelocateResidue, useRecordingGetStatus, useRecordingGetStorageMigrationMoveStatus, useRecordingGetStorageUsage, useRecordingListOpsLog, useRecordingListRelocateJobs, useRecordingLocateSegment, useRecordingPauseForStorageMigration, useRecordingPlanStorageRebalance, useRecordingPruneFootage, useRecordingReadGopBytes, useRecordingReadSegmentBytes, useRecordingReadWindowBytes, useRecordingReconcileLedgerAgainstDisk, useRecordingRefreshStorageLocationsForMigration, useRecordingRelocateFootage, useRecordingRenderClip, useRecordingRenderGif, useRecordingRescanStorage, useRecordingResumeForStorageMigration, useRecordingSetDeviceConfig, useRecordingSetDevicePlacement, useRecordingSignalGetStatus, useRecordingStartStorageMigrationMove, useRecordingStartStorageRebalance, useRemoteComponent, 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, useSettingsStoreUpdate, useSettingsStoreUpdateWhere, useSettingsStoreUpsert, 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, useStreamBrokerAcquireEgressTranscode, useStreamBrokerApplyDeviceSettingsPatch, useStreamBrokerAssignProfile, useStreamBrokerFetchEventMedia, useStreamBrokerForgetDeviceHardware, useStreamBrokerGetAllRtspEntries, useStreamBrokerGetBrokerStats, useStreamBrokerGetDeviceAudioMute, useStreamBrokerGetDeviceLiveContribution, useStreamBrokerGetDeviceSettingsContribution, useStreamBrokerGetPreBufferInfo, useStreamBrokerGetRtspEntry, useStreamBrokerGetRtspPort, useStreamBrokerGetStreamUrl, useStreamBrokerGetStreamWithCodec, useStreamBrokerIsRtspEnabled, useStreamBrokerKillClient, useStreamBrokerListAllCameraStreams, useStreamBrokerListAllProfileSlots, useStreamBrokerListClients, useStreamBrokerProbeStream, useStreamBrokerProduceEventMedia, useStreamBrokerPublishCameraStream, useStreamBrokerPullAudioChunks, useStreamBrokerPullFrameHandles, useStreamBrokerRegenerateRtspToken, useStreamBrokerReleaseEgressTranscode, useStreamBrokerReleaseStreamWithCodec, useStreamBrokerRenderPreBufferClip, useStreamBrokerReportStreamSignal, useStreamBrokerRestartProfile, useStreamBrokerRetractCameraStream, useStreamBrokerSetDeviceAudioMute, useStreamBrokerSetPreBufferDuration, useStreamBrokerSetRtspEnabled, useStreamBrokerSubscribeAudioChunks, useStreamBrokerSubscribeFrames, useStreamBrokerUnassignProfile, useStreamBrokerUnsubscribeAudioChunks, useStreamBrokerUnsubscribeFrames, 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, useTurnProviderGetTurnServers, useUpdateGetStatus, useUpdateInstallUpdate, useUserManagementConfirmTotp, useUserManagementCreateApiKey, useUserManagementCreateScopedToken, useUserManagementCreateUser, useUserManagementDeleteUser, useUserManagementDisableTotp, useUserManagementGetTotpStatus, useUserManagementListApiKeys, useUserManagementListOauthSessions, useUserManagementListScopedTokens, useUserManagementListUsers, useUserManagementOauthExchangeCode, useUserManagementOauthIssueCode, useUserManagementOauthRefresh, useUserManagementOauthVerifyAccessToken, useUserManagementResetPassword, useUserManagementRevokeApiKey, useUserManagementRevokeOauthSession, useUserManagementRevokeScopedToken, useUserManagementSetUserScopes, useUserManagementSetupTotp, useUserManagementUpdateUser, useUserManagementValidateApiKey, useUserManagementValidateCredentials, useUserManagementValidateScopedToken, useUserManagementVerifyTotp, useVacuumControlGetStatus, useVacuumControlLocate, useVacuumControlPause, useVacuumControlReturnToBase, useVacuumControlSetFanSpeed, useVacuumControlStart, useVacuumControlStop, useValveClose, useValveGetStatus, useValveOpen, useValveSetPosition, useValveStop, useVibrationGetStatus, useVideoclipsGetClipPlayback, useVideoclipsListClips, useVodPlayback, useWaterHeaterGetStatus, useWaterHeaterSetAway, useWaterHeaterSetOperationMode, useWaterHeaterSetTargetTemp, useWeatherGetStatus, useWebrtcSessionAddIceCandidate, useWebrtcSessionCloseSession, useWebrtcSessionCreateSession, useWebrtcSessionGetIceCandidates, useWebrtcSessionGetSessionState, useWebrtcSessionHandleAnswer, useWebrtcSessionHandleOffer, useWebrtcSessionHasAdaptiveBitrate, useWebrtcSessionListStreams, useWidget, useWidgetMetadata, useWidgetRegistry, useZoneAnalyticsGetCameraHistory, useZoneAnalyticsGetCurrentSnapshot, useZoneAnalyticsGetCurrentSnapshotBatch, useZoneAnalyticsGetUnzonedHistory, useZoneAnalyticsGetZoneHistory, useZoneEditing, useZoneRulesListRules, useZoneRulesSetRules, useZonesAddZone, useZonesListZones, useZonesRemoveZone, useZonesUpdateZone, vacuumStateMeta, validateScopes, valveStateMeta, variantLabel, waterHeaterPhase, waterHeaterTint, weatherConditionMeta, weatherTint };
|