@camstack/ui-library 1.2.222 → 1.2.224

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/index.js CHANGED
@@ -13,7 +13,7 @@ import * as __mfHostReactDOMClient from "react-dom/client";
13
13
  import { createRoot } from "react-dom/client";
14
14
  import * as __mfHostTrpcClient from "@trpc/client";
15
15
  import { createTRPCClient, createWSClient, httpLink, splitLink, wsLink } from "@trpc/client";
16
- import { ALL_CAPABILITY_DEFINITIONS, CAM_PROFILE_ORDER, CLIP_STILL_DISPOSITION_HEADER, CLIP_STILL_REASON_CODE_HEADER, CLIP_STILL_REASON_HEADER, CONTAINER_CHILD_PRIORITY, DEFAULT_EVENTS_BAND_BUFFER_SEC, DEFAULT_EVENT_COLOR, DEVICE_TYPE_CONTROL_KIND, DISPLAY_ICON_GROUPS, DeviceExportStatusSchema, DeviceFeature, DeviceRole, DeviceType, EVENT_TAXONOMY, EXTENSION_SLOTS, EXTENSION_SLOT_IDS, EventCategory, ExposedDeviceSchema, FIRST_LEVEL_MACRO_CLASSES, KNOWN_CAP_NAMES, MAX_SENSOR_TRIGGER_DEVICES, MODEL_PROVIDER_IDS, NAVIGATION_LIGHT_LEVEL_MAX, NAVIGATION_LIGHT_LEVEL_MIN, PET_FEEDER_MANUAL_FEED_MAX, PET_FEEDER_MANUAL_FEED_MIN, RECORDING_AUDIO_TRIGGER_OFFERED_DBFS, RECORDING_SOURCE_CAMSTACK_ADDON, RecordingConfigSchema, RecordingStatusSchema, SOURCE_CAP_ACTIVE_FIELD, STATIONARY_OVERLAY_STYLE, TIMEZONES, buildModelVariantGroups, canConvertUnit, clusterStepSettingFieldsFor, createDeviceProxy, createLazyTrpcSource, createSliceHandle, deriveRecordingMode, describeModelVariant, findTimezone, formatParkedFor, normalizeUnit, publicEventCategories, resolveContainerPrimaryChild, resolveDeviceControlKind, resolveRecordingProfiles, resolveVariantModelId, resolveViewableDeviceIds, searchDisplayIcons, selectAssignedProfileSlots, tryConvertUnit } from "@camstack/types";
16
+ import { ALL_CAPABILITY_DEFINITIONS, CAM_PROFILE_ORDER, CLIP_STILL_DISPOSITION_HEADER, CLIP_STILL_REASON_CODE_HEADER, CLIP_STILL_REASON_HEADER, CONTAINER_CHILD_PRIORITY, DEFAULT_EVENTS_BAND_BUFFER_SEC, DEFAULT_EVENT_COLOR, DEVICE_TYPE_CONTROL_KIND, DISPLAY_ICON_GROUPS, DeviceExportStatusSchema, DeviceFeature, DeviceRole, DeviceType, EVENT_TAXONOMY, EXTENSION_SLOTS, EXTENSION_SLOT_IDS, EventCategory, ExposedDeviceSchema, FIRST_LEVEL_MACRO_CLASSES, KNOWN_CAP_NAMES, MAX_SENSOR_TRIGGER_DEVICES, MODEL_PROVIDER_IDS, NAVIGATION_LIGHT_LEVEL_MAX, NAVIGATION_LIGHT_LEVEL_MIN, PET_FEEDER_MANUAL_FEED_MAX, PET_FEEDER_MANUAL_FEED_MIN, RECORDING_AUDIO_TRIGGER_OFFERED_DBFS, RECORDING_SOURCE_CAMSTACK_ADDON, RecordingConfigSchema, RecordingStatusSchema, SOURCE_CAP_ACTIVE_FIELD, STATIONARY_OVERLAY_STYLE, TIMEZONES, buildModelVariantGroups, canConvertUnit, clusterStepSettingFieldsFor, createDeviceProxy, createLazyTrpcSource, createSliceHandle, deriveRecordingMode, describeModelVariant, findTimezone, formatParkedFor, normalizeUnit, publicEventCategories, resolveContainerPrimaryChild, resolveDeviceControlKind, resolveRecordingProfiles, resolveVariantModelId, resolveViewableDeviceIds, searchDisplayIcons, selectAssignedProfileSlots, tryConvertUnit, unitsForDimension } from "@camstack/types";
17
17
  import { createSystem } from "@camstack/sdk";
18
18
  import { z } from "zod";
19
19
  //#region ../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
@@ -6734,6 +6734,12 @@ var useBrokerGetState = trpc.broker.getState.useQuery;
6734
6734
  var useBrokerGetStatus = trpc.broker.getStatus.useQuery;
6735
6735
  /** Generated alias around `trpc.button.press.useMutation`. */
6736
6736
  var useButtonPress = trpc.button.press.useMutation;
6737
+ /** Generated alias around `trpc.calendars.listCalendars.useQuery`. */
6738
+ var useCalendarsListCalendars = trpc.calendars.listCalendars.useQuery;
6739
+ /** Generated alias around `trpc.calendars.listEvents.useQuery`. */
6740
+ var useCalendarsListEvents = trpc.calendars.listEvents.useQuery;
6741
+ /** Generated alias around `trpc.calendars.importFromHomeAssistant.useMutation`. */
6742
+ var useCalendarsImportFromHomeAssistant = trpc.calendars.importFromHomeAssistant.useMutation;
6737
6743
  /** Generated alias around `trpc.cameraCredentials.getCredentials.useQuery`. */
6738
6744
  var useCameraCredentialsGetCredentials = trpc.cameraCredentials.getCredentials.useQuery;
6739
6745
  /** Generated alias around `trpc.cameraCredentials.getStatus.useQuery`. */
@@ -7646,6 +7652,12 @@ var useOsdManagerCopyDeviceConfiguration = trpc.osdManager.copyDeviceConfigurati
7646
7652
  var useOsdManagerPreviewSlot = trpc.osdManager.previewSlot.useMutation;
7647
7653
  /** Generated alias around `trpc.osdManager.renderDevice.useMutation`. */
7648
7654
  var useOsdManagerRenderDevice = trpc.osdManager.renderDevice.useMutation;
7655
+ /** Generated alias around `trpc.osdManager.listTemplates.useQuery`. */
7656
+ var useOsdManagerListTemplates = trpc.osdManager.listTemplates.useQuery;
7657
+ /** Generated alias around `trpc.osdManager.upsertTemplate.useMutation`. */
7658
+ var useOsdManagerUpsertTemplate = trpc.osdManager.upsertTemplate.useMutation;
7659
+ /** Generated alias around `trpc.osdManager.deleteTemplate.useMutation`. */
7660
+ var useOsdManagerDeleteTemplate = trpc.osdManager.deleteTemplate.useMutation;
7649
7661
  /** Generated alias around `trpc.petFeeder.feed.useMutation`. */
7650
7662
  var usePetFeederFeed = trpc.petFeeder.feed.useMutation;
7651
7663
  /** Generated alias around `trpc.petFeeder.cancelFeed.useMutation`. */
@@ -12331,8 +12343,8 @@ function selectedDeviceOptions(options, selected) {
12331
12343
  * renders the shared form field gets them without extra registration.
12332
12344
  */
12333
12345
  var INPUT_CLASS$1 = "w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-xs text-foreground focus:border-primary focus:ring-1 focus:ring-primary/30 outline-none disabled:opacity-50 disabled:cursor-not-allowed";
12334
- var INPUT_SHELL = "flex items-center gap-1.5 rounded-md border border-border bg-background px-2 py-1.5 focus-within:border-primary focus-within:ring-1 focus-within:ring-primary/30";
12335
- var LABEL_CLASS$1 = "block text-[11px] font-medium text-foreground mb-1 break-words";
12346
+ var INPUT_SHELL$1 = "flex items-center gap-1.5 rounded-md border border-border bg-background px-2 py-1.5 focus-within:border-primary focus-within:ring-1 focus-within:ring-primary/30";
12347
+ var LABEL_CLASS$2 = "block text-[11px] font-medium text-foreground mb-1 break-words";
12336
12348
  var DESC_CLASS$1 = "text-[10px] text-foreground-subtle mt-0.5 break-words";
12337
12349
  /** The compact projection of the listAll rows the device fields consume. */
12338
12350
  function toCandidates(rows) {
@@ -12369,7 +12381,7 @@ var FACET_ITEM = "flex h-7 w-full items-center gap-2 px-2 text-left text-xs text
12369
12381
  * The operator asked for dropdowns over rows of chips (2026-09-05): with
12370
12382
  * sixteen rooms and a dozen types the chips ate the panel.
12371
12383
  */
12372
- function FacetDropdown({ label, values, chosen, onChange }) {
12384
+ function FacetDropdown$1({ label, values, chosen, onChange }) {
12373
12385
  if (values.length < 2) return null;
12374
12386
  const summary = chosen.length === 0 ? "All" : chosen.join(", ");
12375
12387
  const toggle = (value) => {
@@ -12427,7 +12439,7 @@ function FieldShell({ label, description, required, translationFn, children }) {
12427
12439
  className: "min-w-0",
12428
12440
  children: [
12429
12441
  resolvedLabel !== void 0 && resolvedLabel !== "" && /* @__PURE__ */ jsxs("label", {
12430
- className: LABEL_CLASS$1,
12442
+ className: LABEL_CLASS$2,
12431
12443
  children: [resolvedLabel, required && /* @__PURE__ */ jsx("span", {
12432
12444
  className: "text-danger ml-0.5",
12433
12445
  children: "*"
@@ -12523,7 +12535,7 @@ function DeviceMultiSelectField({ field, value, onChange, disabled, translationF
12523
12535
  className: "min-w-0",
12524
12536
  children: [
12525
12537
  label !== void 0 && label !== "" && /* @__PURE__ */ jsx("label", {
12526
- className: LABEL_CLASS$1,
12538
+ className: LABEL_CLASS$2,
12527
12539
  children: label
12528
12540
  }),
12529
12541
  selectedOptions.length > 0 && /* @__PURE__ */ jsx("div", {
@@ -12544,7 +12556,7 @@ function DeviceMultiSelectField({ field, value, onChange, disabled, translationF
12544
12556
  }),
12545
12557
  smart && /* @__PURE__ */ jsxs("div", {
12546
12558
  className: "mb-1.5 flex flex-wrap gap-1.5",
12547
- children: [/* @__PURE__ */ jsx(FacetDropdown, {
12559
+ children: [/* @__PURE__ */ jsx(FacetDropdown$1, {
12548
12560
  label: "Location",
12549
12561
  values: facetValues.locations,
12550
12562
  chosen: facets.locations,
@@ -12552,7 +12564,7 @@ function DeviceMultiSelectField({ field, value, onChange, disabled, translationF
12552
12564
  ...f,
12553
12565
  locations
12554
12566
  }))
12555
- }), /* @__PURE__ */ jsx(FacetDropdown, {
12567
+ }), /* @__PURE__ */ jsx(FacetDropdown$1, {
12556
12568
  label: "Type",
12557
12569
  values: facetValues.types,
12558
12570
  chosen: facets.types,
@@ -12563,7 +12575,7 @@ function DeviceMultiSelectField({ field, value, onChange, disabled, translationF
12563
12575
  })]
12564
12576
  }),
12565
12577
  /* @__PURE__ */ jsxs("div", {
12566
- className: INPUT_SHELL + (isDisabled ? " opacity-50" : ""),
12578
+ className: INPUT_SHELL$1 + (isDisabled ? " opacity-50" : ""),
12567
12579
  children: [
12568
12580
  /* @__PURE__ */ jsx(Search, { className: "h-3.5 w-3.5 shrink-0 text-foreground-subtle" }),
12569
12581
  /* @__PURE__ */ jsx("input", {
@@ -25786,7 +25798,7 @@ function TimezoneSelector({ value, onChange, disabled }) {
25786
25798
  //#endregion
25787
25799
  //#region src/composites/config-form-field.tsx
25788
25800
  var INPUT_CLASS = "w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-xs text-foreground focus:border-primary focus:ring-1 focus:ring-primary/30 outline-none disabled:opacity-50 disabled:cursor-not-allowed";
25789
- var LABEL_CLASS = "block text-[11px] font-medium text-foreground mb-1 break-words";
25801
+ var LABEL_CLASS$1 = "block text-[11px] font-medium text-foreground mb-1 break-words";
25790
25802
  var DESC_CLASS = "text-[10px] text-foreground-subtle mt-0.5 break-words";
25791
25803
  function FieldWrapper({ label, description, required, span, children, translationFn }) {
25792
25804
  const colSpanClass = span === 2 ? "col-span-1 @[480px]:col-span-2" : span === 3 ? "col-span-1 @[480px]:col-span-2 @[880px]:col-span-3" : span === 4 ? "col-span-1 @[480px]:col-span-2 @[1140px]:col-span-4" : "col-span-1";
@@ -25797,7 +25809,7 @@ function FieldWrapper({ label, description, required, span, children, translatio
25797
25809
  className: `${colSpanClass} min-w-0`,
25798
25810
  children: [
25799
25811
  hasLabel && /* @__PURE__ */ jsxs("label", {
25800
- className: LABEL_CLASS,
25812
+ className: LABEL_CLASS$1,
25801
25813
  children: [resolvedLabel, required && /* @__PURE__ */ jsx("span", {
25802
25814
  className: "text-danger ml-0.5",
25803
25815
  children: "*"
@@ -26487,7 +26499,7 @@ function SubTabsField({ field, values, onChange, disabled, translationFn, onTest
26487
26499
  return /* @__PURE__ */ jsxs("div", {
26488
26500
  className: `${colSpanClass} min-w-0`,
26489
26501
  children: [field.label && /* @__PURE__ */ jsx("div", {
26490
- className: LABEL_CLASS,
26502
+ className: LABEL_CLASS$1,
26491
26503
  children: resolveLabel(field.label, translationFn)
26492
26504
  }), /* @__PURE__ */ jsxs("div", {
26493
26505
  className: "@container rounded-lg border border-border-subtle bg-surface-hover/40 overflow-hidden",
@@ -27285,7 +27297,7 @@ function MultipleFieldWrapper({ field, values, onChange, disabled, translationFn
27285
27297
  return /* @__PURE__ */ jsxs("div", {
27286
27298
  className: "space-y-1",
27287
27299
  children: [itemLabel && /* @__PURE__ */ jsx("div", {
27288
- className: LABEL_CLASS,
27300
+ className: LABEL_CLASS$1,
27289
27301
  children: itemLabel
27290
27302
  }), /* @__PURE__ */ jsxs("div", {
27291
27303
  className: "flex items-center gap-2",
@@ -50555,7 +50567,7 @@ function SectionRows({ title, count, open, colSpan, onToggle, rows, trpc, parent
50555
50567
  //#region src/composites/device-list/sort.ts
50556
50568
  /** Human-facing type label used for the `type` comparator — matches the label
50557
50569
  * the row renders, so the sort order reads as the user sees it. */
50558
- function typeLabel(device) {
50570
+ function typeLabel$1(device) {
50559
50571
  return deviceTypeMetaOf(device.type).label.toLowerCase();
50560
50572
  }
50561
50573
  function nameKey(device) {
@@ -50564,7 +50576,7 @@ function nameKey(device) {
50564
50576
  /** Ascending comparator for a given sortable column. */
50565
50577
  function ascComparator(columnId) {
50566
50578
  if (columnId === "name") return (a, b) => nameKey(a).localeCompare(nameKey(b));
50567
- if (columnId === "type") return (a, b) => typeLabel(a).localeCompare(typeLabel(b));
50579
+ if (columnId === "type") return (a, b) => typeLabel$1(a).localeCompare(typeLabel$1(b));
50568
50580
  return compareHardware;
50569
50581
  }
50570
50582
  /**
@@ -55720,6 +55732,1366 @@ function VersionBadge({ version, preRelease, className }) {
55720
55732
  });
55721
55733
  }
55722
55734
  //#endregion
55735
+ //#region src/composites/device-picker/SelectedChip.tsx
55736
+ /**
55737
+ * Removable selection chip + the search-box shell shared by DevicePicker and
55738
+ * SearchableMultiSelectField (admin-ui). Lives here so addon MFEs can render
55739
+ * the same picker without importing admin-ui.
55740
+ */
55741
+ /** The search box's shell — shared with multiselect fields that mirror this picker. */
55742
+ var INPUT_SHELL = "flex items-center gap-1.5 rounded-md border border-border bg-background px-2 py-1.5 focus-within:border-primary focus-within:ring-1 focus-within:ring-primary/30";
55743
+ /** One selected entry as a removable chip. */
55744
+ function SelectedChip({ label, onRemove, warning = false, iconId, testId }) {
55745
+ return /* @__PURE__ */ jsxs("span", {
55746
+ "data-testid": testId,
55747
+ className: warning ? "inline-flex items-center gap-1 rounded-md bg-warning/10 px-1.5 py-0.5 text-[11px] text-warning max-w-full" : "inline-flex items-center gap-1 rounded-md bg-primary/10 px-1.5 py-0.5 text-[11px] text-primary max-w-full",
55748
+ children: [
55749
+ iconId !== void 0 && /* @__PURE__ */ jsx(EventKindGlyph, {
55750
+ iconId,
55751
+ size: 12
55752
+ }),
55753
+ /* @__PURE__ */ jsx("span", {
55754
+ className: "truncate",
55755
+ children: label
55756
+ }),
55757
+ onRemove !== void 0 && /* @__PURE__ */ jsx("button", {
55758
+ type: "button",
55759
+ className: "shrink-0 hover:text-danger",
55760
+ "aria-label": `Remove ${label}`,
55761
+ onClick: onRemove,
55762
+ children: /* @__PURE__ */ jsx(X, { className: "h-2.5 w-2.5" })
55763
+ })
55764
+ ]
55765
+ });
55766
+ }
55767
+ //#endregion
55768
+ //#region src/composites/device-picker/device-picker-model.ts
55769
+ /** Numbers numerically, anything else by its text — the name tie-break. */
55770
+ function compareIds(a, b) {
55771
+ if (typeof a === "number" && typeof b === "number") return a - b;
55772
+ return String(a).localeCompare(String(b));
55773
+ }
55774
+ /** How long the search waits after the last keystroke. */
55775
+ var PICKER_SEARCH_DEBOUNCE_MS = 200;
55776
+ /** A group with more devices than this starts collapsed (unless searching). */
55777
+ var PICKER_GROUP_COLLAPSE_AT = 8;
55778
+ /** How many selected chips are drawn before "+N more". */
55779
+ var PICKER_CHIP_LIMIT = 6;
55780
+ /** Rows a capped render draws per "show more". */
55781
+ var PICKER_PAGE_SIZE = 60;
55782
+ /** Rows a virtualised list renders per batch and initially. */
55783
+ var PICKER_WINDOW = 30;
55784
+ /** Everything a query can match on, lower-cased. */
55785
+ function pickerSearchText(device) {
55786
+ return `${[
55787
+ device.name,
55788
+ device.location ?? "",
55789
+ device.type ?? "",
55790
+ device.detail ?? ""
55791
+ ].join(" ")} ${String(device.id)}`.toLowerCase();
55792
+ }
55793
+ /** The query's tokens; empty for a blank query. */
55794
+ function pickerQueryTokens(query) {
55795
+ return query.trim().toLowerCase().split(/\s+/).filter((token) => token.length > 0);
55796
+ }
55797
+ /** Devices matching EVERY token. A blank query keeps the list as it is. */
55798
+ function filterPickerDevices(devices, query) {
55799
+ const tokens = pickerQueryTokens(query);
55800
+ if (tokens.length === 0) return devices;
55801
+ return devices.filter((device) => {
55802
+ const hay = pickerSearchText(device);
55803
+ return tokens.every((token) => hay.includes(token));
55804
+ });
55805
+ }
55806
+ function compareNullableLast(a, b) {
55807
+ if (a === b) return 0;
55808
+ if (a === null) return 1;
55809
+ if (b === null) return -1;
55810
+ return a.localeCompare(b);
55811
+ }
55812
+ function blankToNull(value) {
55813
+ return value === void 0 || value === null || value.trim() === "" ? null : value;
55814
+ }
55815
+ /** The key a group is remembered by (collapsed / expanded). */
55816
+ function pickerGroupKey(type, location) {
55817
+ return `${type ?? ""}|${location ?? ""}`;
55818
+ }
55819
+ /** Group by type, then room; both ascending, "none" last; devices by name. */
55820
+ function groupPickerDevices(devices, selected) {
55821
+ const picked = new Set(selected);
55822
+ const buckets = /* @__PURE__ */ new Map();
55823
+ for (const device of devices) {
55824
+ const type = blankToNull(device.type);
55825
+ const location = blankToNull(device.location);
55826
+ const key = pickerGroupKey(type, location);
55827
+ const bucket = buckets.get(key);
55828
+ if (bucket === void 0) buckets.set(key, {
55829
+ type,
55830
+ location,
55831
+ devices: [device]
55832
+ });
55833
+ else bucket.devices.push(device);
55834
+ }
55835
+ const groups = [];
55836
+ for (const [key, bucket] of buckets) {
55837
+ const sorted = [...bucket.devices].sort((a, b) => a.name.localeCompare(b.name) || compareIds(a.id, b.id));
55838
+ groups.push({
55839
+ key,
55840
+ type: bucket.type,
55841
+ location: bucket.location,
55842
+ devices: sorted,
55843
+ selectedCount: sorted.filter((device) => picked.has(device.id)).length
55844
+ });
55845
+ }
55846
+ return groups.sort((a, b) => compareNullableLast(a.type, b.type) || compareNullableLast(a.location, b.location));
55847
+ }
55848
+ /**
55849
+ * Whether a group is open. The operator's own toggle wins; otherwise a small
55850
+ * group is open, a big one is closed — unless a search is running (the result
55851
+ * IS what they asked to see) or it holds a selected device.
55852
+ */
55853
+ function isGroupExpanded(group, toggles, searching) {
55854
+ const own = toggles.get(group.key);
55855
+ if (own !== void 0) return own;
55856
+ if (searching || group.selectedCount > 0) return true;
55857
+ return group.devices.length <= 8;
55858
+ }
55859
+ /** The groups as ONE list of rows — what a virtualised list renders. */
55860
+ function flattenPickerRows(groups, selected, toggles, searching) {
55861
+ const picked = new Set(selected);
55862
+ const rows = [];
55863
+ for (const group of groups) {
55864
+ const expanded = isGroupExpanded(group, toggles, searching);
55865
+ rows.push({
55866
+ kind: "header",
55867
+ key: `h:${group.key}`,
55868
+ group,
55869
+ expanded
55870
+ });
55871
+ if (!expanded) continue;
55872
+ for (const device of group.devices) rows.push({
55873
+ kind: "device",
55874
+ key: `d:${String(device.id)}`,
55875
+ device,
55876
+ groupKey: group.key,
55877
+ selected: picked.has(device.id)
55878
+ });
55879
+ }
55880
+ return rows;
55881
+ }
55882
+ /** Tick or untick one id. The order of the rest is kept. */
55883
+ function togglePickerDevice(value, id) {
55884
+ return value.includes(id) ? value.filter((v) => v !== id) : [...value, id];
55885
+ }
55886
+ /** Add every device of the group (only the ones the current search shows). */
55887
+ function selectPickerGroup(value, group) {
55888
+ const next = [...value];
55889
+ const have = new Set(value);
55890
+ for (const device of group.devices) if (!have.has(device.id)) next.push(device.id);
55891
+ return next;
55892
+ }
55893
+ /** Remove every device of the group; ids outside it are untouched. */
55894
+ function clearPickerGroup(value, group) {
55895
+ const drop = new Set(group.devices.map((device) => device.id));
55896
+ return value.filter((id) => !drop.has(id));
55897
+ }
55898
+ function chipOverflow(items, expanded) {
55899
+ if (expanded || items.length <= 6) return {
55900
+ shown: items,
55901
+ hidden: 0
55902
+ };
55903
+ return {
55904
+ shown: items.slice(0, 6),
55905
+ hidden: items.length - 6
55906
+ };
55907
+ }
55908
+ function pageRows(rows, shown) {
55909
+ const count = Math.max(0, Math.min(rows.length, shown));
55910
+ return {
55911
+ rows: rows.slice(0, count),
55912
+ remaining: rows.length - count
55913
+ };
55914
+ }
55915
+ /** The modes, in the order the control draws them. */
55916
+ var PICKER_GROUP_BY_MODES = [
55917
+ "zone",
55918
+ "location",
55919
+ "none"
55920
+ ];
55921
+ /** What an operator who never chose gets. */
55922
+ var PICKER_DEFAULT_GROUP_BY = "zone";
55923
+ /** A stored choice; anything unreadable is the default. */
55924
+ function parsePickerGroupBy(raw) {
55925
+ return raw === "zone" || raw === "location" || raw === "none" ? raw : PICKER_DEFAULT_GROUP_BY;
55926
+ }
55927
+ /** The folded key a location label joins a zone by — `siteZoneKey`'s fold. */
55928
+ function pickerLocationKey(label) {
55929
+ return label.trim().toLowerCase();
55930
+ }
55931
+ var NO_ZONE_RANK = 1;
55932
+ var NO_LOCATION_RANK = 2;
55933
+ function byName(a, b) {
55934
+ return a.name.localeCompare(b.name) || compareIds(a.id, b.id);
55935
+ }
55936
+ function headingLabel(heading) {
55937
+ return heading.kind === "zone" || heading.kind === "location" ? heading.label : "";
55938
+ }
55939
+ var NO_LOCATION = {
55940
+ key: "-location",
55941
+ heading: { kind: "no-location" },
55942
+ rank: NO_LOCATION_RANK
55943
+ };
55944
+ var NO_ZONE = {
55945
+ key: "-zone",
55946
+ heading: { kind: "no-zone" },
55947
+ rank: NO_ZONE_RANK
55948
+ };
55949
+ /** Every zone by the folded location keys it holds; the first zone wins a key. */
55950
+ function zoneByLocation(zones) {
55951
+ const out = /* @__PURE__ */ new Map();
55952
+ for (const zone of zones) for (const key of zone.locationKeys) {
55953
+ const folded = pickerLocationKey(key);
55954
+ if (!out.has(folded)) out.set(folded, zone);
55955
+ }
55956
+ return out;
55957
+ }
55958
+ function placeByLocation(location) {
55959
+ if (location === null) return NO_LOCATION;
55960
+ return {
55961
+ key: `l:${pickerLocationKey(location)}`,
55962
+ heading: {
55963
+ kind: "location",
55964
+ label: location.trim()
55965
+ },
55966
+ rank: 0
55967
+ };
55968
+ }
55969
+ function placeByZone(location, zones) {
55970
+ if (location === null) return NO_LOCATION;
55971
+ const zone = zones.get(pickerLocationKey(location));
55972
+ if (zone === void 0) return NO_ZONE;
55973
+ return {
55974
+ key: `z:${zone.zoneKey}`,
55975
+ heading: {
55976
+ kind: "zone",
55977
+ label: zone.label
55978
+ },
55979
+ rank: 0
55980
+ };
55981
+ }
55982
+ /**
55983
+ * Group the list by zone, location or nothing.
55984
+ *
55985
+ * Zone: a group per site zone that holds a listed device (by label), then
55986
+ * "No zone" (a location no zone holds), then "No location". Location: a group
55987
+ * per location (folded; named after the first device's trimmed spelling), then "No
55988
+ * location". None: one flat list by name, then id.
55989
+ *
55990
+ * A zone read that is pending or failed can NOT say a location is in no zone
55991
+ * (D315), so Zone mode then groups by location and returns the reason as
55992
+ * {@link PickerGrouping.fallback} for the UI's one-line note.
55993
+ */
55994
+ function groupPickerDevicesBy(devices, selected, groupBy, zones) {
55995
+ const picked = new Set(selected);
55996
+ const sorted = [...devices].sort(byName);
55997
+ const count = (list) => list.filter((device) => picked.has(device.id)).length;
55998
+ if (groupBy === "none") return {
55999
+ groupBy,
56000
+ fallback: null,
56001
+ flat: true,
56002
+ groups: [{
56003
+ key: "all",
56004
+ type: null,
56005
+ location: null,
56006
+ devices: sorted,
56007
+ selectedCount: count(sorted)
56008
+ }]
56009
+ };
56010
+ const fallback = groupBy === "zone" && zones.state !== "answered" ? zones.state : null;
56011
+ const effective = fallback === null ? groupBy : "location";
56012
+ const zoneMap = zones.state === "answered" ? zoneByLocation(zones.zones) : /* @__PURE__ */ new Map();
56013
+ const buckets = /* @__PURE__ */ new Map();
56014
+ for (const device of sorted) {
56015
+ const location = blankToNull(device.location);
56016
+ const place = effective === "zone" ? placeByZone(location, zoneMap) : placeByLocation(location);
56017
+ const bucket = buckets.get(place.key);
56018
+ if (bucket === void 0) buckets.set(place.key, {
56019
+ heading: place.heading,
56020
+ rank: place.rank,
56021
+ devices: [device]
56022
+ });
56023
+ else bucket.devices.push(device);
56024
+ }
56025
+ return {
56026
+ groupBy: effective,
56027
+ fallback,
56028
+ flat: false,
56029
+ groups: [...buckets].sort(([, a], [, b]) => a.rank - b.rank || headingLabel(a.heading).localeCompare(headingLabel(b.heading))).map(([key, bucket]) => ({
56030
+ key,
56031
+ type: null,
56032
+ location: bucket.heading.kind === "location" ? bucket.heading.label : null,
56033
+ devices: bucket.devices,
56034
+ selectedCount: count(bucket.devices),
56035
+ heading: bucket.heading
56036
+ }))
56037
+ };
56038
+ }
56039
+ /** The grouping as rows: a flat grouping draws no header and is always open. */
56040
+ function flattenPickerGrouping(grouping, selected, toggles, searching) {
56041
+ if (!grouping.flat) return flattenPickerRows(grouping.groups, selected, toggles, searching);
56042
+ const picked = new Set(selected);
56043
+ const rows = [];
56044
+ for (const group of grouping.groups) for (const device of group.devices) rows.push({
56045
+ kind: "device",
56046
+ key: `d:${String(device.id)}`,
56047
+ device,
56048
+ groupKey: group.key,
56049
+ selected: picked.has(device.id)
56050
+ });
56051
+ return rows;
56052
+ }
56053
+ function pickerRowFacts(device, groupBy) {
56054
+ return {
56055
+ location: groupBy === "location" ? null : blankToNull(device.location),
56056
+ type: blankToNull(device.type)
56057
+ };
56058
+ }
56059
+ /** The filter key of an item with no type / no location / no zone. */
56060
+ var PICKER_NONE_KEY = "(none)";
56061
+ var PICKER_NO_FILTERS = {
56062
+ query: "",
56063
+ types: [],
56064
+ zones: [],
56065
+ locations: []
56066
+ };
56067
+ var NO_FACET_VALUE = {
56068
+ key: PICKER_NONE_KEY,
56069
+ label: null
56070
+ };
56071
+ function facetValue(item, facet, zones) {
56072
+ if (facet === "type") {
56073
+ const type = blankToNull(item.type);
56074
+ return type === null ? NO_FACET_VALUE : {
56075
+ key: type,
56076
+ label: type
56077
+ };
56078
+ }
56079
+ const location = blankToNull(item.location);
56080
+ if (location === null) return NO_FACET_VALUE;
56081
+ if (facet === "location") return {
56082
+ key: pickerLocationKey(location),
56083
+ label: location.trim()
56084
+ };
56085
+ if (zones.state !== "answered") return NO_FACET_VALUE;
56086
+ const zone = zoneByLocation(zones.zones).get(pickerLocationKey(location));
56087
+ return zone === void 0 ? NO_FACET_VALUE : {
56088
+ key: zone.zoneKey,
56089
+ label: zone.label
56090
+ };
56091
+ }
56092
+ /** The key an item filters by under one facet; `(none)` when it has no such value. */
56093
+ function pickerFacetKey(item, facet, zones) {
56094
+ return facetValue(item, facet, zones).key;
56095
+ }
56096
+ function compareFacetOptions(a, b) {
56097
+ if (a.key === "(none)" || b.key === "(none)") return a.key === b.key ? 0 : a.key === "(none)" ? 1 : -1;
56098
+ return (a.label ?? "").localeCompare(b.label ?? "");
56099
+ }
56100
+ /** Every value of a facet the list holds (plus chosen ones it no longer holds, at 0). */
56101
+ function pickerFacetOptions(items, facet, chosen, zones) {
56102
+ if (facet === "zone" && zones.state !== "answered") return [];
56103
+ const byKey = /* @__PURE__ */ new Map();
56104
+ for (const item of items) {
56105
+ const value = facetValue(item, facet, zones);
56106
+ const have = byKey.get(value.key);
56107
+ if (have === void 0) byKey.set(value.key, {
56108
+ label: value.label,
56109
+ count: 1
56110
+ });
56111
+ else have.count++;
56112
+ }
56113
+ for (const key of chosen) if (!byKey.has(key)) byKey.set(key, {
56114
+ label: key === "(none)" ? null : key,
56115
+ count: 0
56116
+ });
56117
+ const options = [];
56118
+ for (const [key, entry] of byKey) options.push({
56119
+ key,
56120
+ label: entry.label,
56121
+ count: entry.count
56122
+ });
56123
+ return options.sort(compareFacetOptions);
56124
+ }
56125
+ /** A zone filter is chosen but the zones read has not answered: it is paused, not applied. */
56126
+ function pickerZoneFilterSuspended(filters, zones) {
56127
+ return filters.zones.length > 0 && zones.state !== "answered";
56128
+ }
56129
+ function keepFacet(items, facet, chosen, zones) {
56130
+ if (chosen.length === 0) return items;
56131
+ return items.filter((item) => chosen.includes(pickerFacetKey(item, facet, zones)));
56132
+ }
56133
+ /** Search, then Type, Zone (only from an answered read), Location. No filter: the list itself. */
56134
+ function applyPickerFilters(items, filters, zones) {
56135
+ const typed = keepFacet(filterPickerDevices(items, filters.query), "type", filters.types, zones);
56136
+ return keepFacet(zones.state === "answered" ? keepFacet(typed, "zone", filters.zones, zones) : typed, "location", filters.locations, zones);
56137
+ }
56138
+ /** Tick or untick one filter key. */
56139
+ function togglePickerKey(chosen, key) {
56140
+ return chosen.includes(key) ? chosen.filter((k) => k !== key) : [...chosen, key];
56141
+ }
56142
+ function pickerFiltersActive(filters) {
56143
+ return filters.query.trim() !== "" || filters.types.length > 0 || filters.zones.length > 0 || filters.locations.length > 0;
56144
+ }
56145
+ /** Reset clears search, Type, Zone and Location — never "Group by". */
56146
+ function resetPickerFilters() {
56147
+ return PICKER_NO_FILTERS;
56148
+ }
56149
+ /**
56150
+ * Selected ids the current filters hide — they stay selected, they are only not listed. Only a
56151
+ * LISTED device can be hidden: an id the list does not hold at all (removed, unknown, off-offer)
56152
+ * is not "hidden", so it is not counted.
56153
+ */
56154
+ function pickerHiddenSelectedCount(selected, list, matches) {
56155
+ const listed = new Set(list.map((item) => item.id));
56156
+ const shown = new Set(matches.map((item) => item.id));
56157
+ return selected.filter((id) => listed.has(id) && !shown.has(id)).length;
56158
+ }
56159
+ /** A dropdown is drawn when it can narrow (two values or more) or a key is chosen. */
56160
+ function pickerFacetFilterShown(options, chosen) {
56161
+ return options.length >= 2 || chosen.length > 0;
56162
+ }
56163
+ //#endregion
56164
+ //#region src/composites/device-picker/device-filter-bar.tsx
56165
+ /**
56166
+ * The filter bar above a picker's list (D697): search, "Group by" (when the
56167
+ * list offers it), the Type / Zone / Location dropdowns and "Reset filters".
56168
+ *
56169
+ * It owns no filter state — the caller holds `PickerFilters` and applies them
56170
+ * (`applyPickerFilters`); this only draws the controls and reports changes.
56171
+ * The search box keeps its own text so typing is instant, and tells the
56172
+ * caller `PICKER_SEARCH_DEBOUNCE_MS` after the last keystroke.
56173
+ *
56174
+ * The Zone and Location dropdowns are provisional (operator answer Q1): to
56175
+ * drop them, delete the two `FacetDropdown` uses in {@link DeviceFilterBar}
56176
+ * and their option props — the model side is described in
56177
+ * `device-picker-model.ts`.
56178
+ *
56179
+ * - D315: a zones read that has not answered draws the Zone dropdown
56180
+ * DISABLED ("loading zones…" / "zones unavailable"), never empty, and a
56181
+ * chosen zone is reported as paused, not as matching nothing.
56182
+ * - "Reset filters" clears search, Type, Zone and Location and leaves the
56183
+ * Group-by choice alone.
56184
+ */
56185
+ /** "media-player" → "Media player"; null → "No type". */
56186
+ function typeLabel(type) {
56187
+ if (type === null) return "No type";
56188
+ const spaced = type.replaceAll("-", " ");
56189
+ return spaced.charAt(0).toUpperCase() + spaced.slice(1);
56190
+ }
56191
+ var GROUP_BY_LABEL = {
56192
+ zone: "Zone",
56193
+ location: "Location",
56194
+ none: "None"
56195
+ };
56196
+ var FACET_TITLE = {
56197
+ type: "Type",
56198
+ zone: "Zone",
56199
+ location: "Location"
56200
+ };
56201
+ var NO_VALUE_LABEL = {
56202
+ type: "No type",
56203
+ zone: "No zone",
56204
+ location: "No location"
56205
+ };
56206
+ function optionLabel(facet, option) {
56207
+ if (option.key === "(none)" || option.label === null) return NO_VALUE_LABEL[facet];
56208
+ return facet === "type" ? typeLabel(option.label) : option.label;
56209
+ }
56210
+ /** "Group by: Zone | Location | None", and why Zone is showing locations. */
56211
+ function GroupByControl({ grouping }) {
56212
+ return /* @__PURE__ */ jsxs("div", {
56213
+ className: "mb-1.5",
56214
+ children: [/* @__PURE__ */ jsxs("div", {
56215
+ role: "radiogroup",
56216
+ "aria-label": "Group by",
56217
+ className: "flex flex-wrap items-center gap-1 text-[10px] text-foreground-subtle",
56218
+ children: [/* @__PURE__ */ jsx("span", {
56219
+ className: "mr-1 font-semibold uppercase tracking-wide",
56220
+ children: "Group by"
56221
+ }), PICKER_GROUP_BY_MODES.map((mode) => {
56222
+ const active = mode === grouping.groupBy;
56223
+ return /* @__PURE__ */ jsx("button", {
56224
+ type: "button",
56225
+ role: "radio",
56226
+ "aria-checked": active,
56227
+ onClick: () => grouping.onGroupByChange(mode),
56228
+ className: active ? "rounded-md border border-primary bg-primary/10 px-1.5 py-0.5 text-[11px] text-primary" : "rounded-md border border-border px-1.5 py-0.5 text-[11px] text-foreground-subtle hover:bg-surface-hover",
56229
+ children: GROUP_BY_LABEL[mode]
56230
+ }, mode);
56231
+ })]
56232
+ }), grouping.fallback !== null && /* @__PURE__ */ jsx("p", {
56233
+ className: "mt-0.5 text-[10px] text-foreground-subtle",
56234
+ "data-testid": "picker-zones-note",
56235
+ children: grouping.fallback === "pending" ? "Loading zones — grouped by location for now" : "Zones unavailable — grouped by location"
56236
+ })]
56237
+ });
56238
+ }
56239
+ function FacetDropdown({ facet, options, chosen, onChange, unavailable, disabled }) {
56240
+ const title = FACET_TITLE[facet];
56241
+ const summary = unavailable !== void 0 ? unavailable : chosen.length === 0 ? "All" : `${String(chosen.length)} selected`;
56242
+ return /* @__PURE__ */ jsx("div", {
56243
+ "data-testid": `picker-filter-${facet}`,
56244
+ children: /* @__PURE__ */ jsxs(Popover, { children: [/* @__PURE__ */ jsxs(PopoverTrigger, {
56245
+ disabled: disabled || unavailable !== void 0,
56246
+ className: "rounded-md border border-border px-1.5 py-0.5 text-[11px] text-foreground hover:bg-surface-hover disabled:opacity-50",
56247
+ children: [
56248
+ title,
56249
+ ": ",
56250
+ summary
56251
+ ]
56252
+ }), /* @__PURE__ */ jsx(PopoverContent, {
56253
+ className: "min-w-[200px] max-h-[40vh] overflow-y-auto p-1",
56254
+ children: options.map((option) => {
56255
+ const label = optionLabel(facet, option);
56256
+ return /* @__PURE__ */ jsxs("label", {
56257
+ className: "flex cursor-pointer items-center gap-2 px-2 py-1 text-xs text-foreground hover:bg-surface-hover",
56258
+ children: [
56259
+ /* @__PURE__ */ jsx(Checkbox, {
56260
+ checked: chosen.includes(option.key),
56261
+ onChange: () => onChange(togglePickerKey(chosen, option.key)),
56262
+ "aria-label": label
56263
+ }),
56264
+ /* @__PURE__ */ jsx("span", {
56265
+ className: "min-w-0 flex-1 truncate",
56266
+ children: label
56267
+ }),
56268
+ /* @__PURE__ */ jsxs("span", {
56269
+ className: "text-[10px] text-foreground-subtle",
56270
+ children: [
56271
+ "(",
56272
+ option.count,
56273
+ ")"
56274
+ ]
56275
+ })
56276
+ ]
56277
+ }, option.key);
56278
+ })
56279
+ })] })
56280
+ });
56281
+ }
56282
+ /** Why the Zone dropdown cannot be used, or undefined when the read answered. */
56283
+ function zoneUnavailable(zones) {
56284
+ if (zones.state === "pending") return "loading zones…";
56285
+ if (zones.state === "failed") return "zones unavailable";
56286
+ }
56287
+ function DeviceFilterBar({ filters, onFiltersChange, typeOptions, zoneOptions, locationOptions, zones, grouping, searchPlaceholder, searchLabel, disabled = false }) {
56288
+ const [text, setText] = useState(filters.query);
56289
+ const latest = useRef({
56290
+ filters,
56291
+ onFiltersChange
56292
+ });
56293
+ latest.current = {
56294
+ filters,
56295
+ onFiltersChange
56296
+ };
56297
+ useEffect(() => {
56298
+ if (text === latest.current.filters.query) return;
56299
+ const timer = setTimeout(() => latest.current.onFiltersChange({
56300
+ ...latest.current.filters,
56301
+ query: text
56302
+ }), 200);
56303
+ return () => clearTimeout(timer);
56304
+ }, [text]);
56305
+ const unavailable = zoneUnavailable(zones);
56306
+ const zoneShown = unavailable !== void 0 || pickerFacetFilterShown(zoneOptions, filters.zones);
56307
+ const active = pickerFiltersActive(filters) || text.trim() !== "";
56308
+ return /* @__PURE__ */ jsxs("div", {
56309
+ className: "space-y-1.5",
56310
+ "data-testid": "device-filter-bar",
56311
+ children: [
56312
+ grouping !== void 0 && /* @__PURE__ */ jsx(GroupByControl, { grouping }),
56313
+ /* @__PURE__ */ jsxs("div", {
56314
+ className: INPUT_SHELL,
56315
+ children: [/* @__PURE__ */ jsx(Search, { className: "h-3.5 w-3.5 shrink-0 text-foreground-subtle" }), /* @__PURE__ */ jsx("input", {
56316
+ type: "text",
56317
+ value: text,
56318
+ placeholder: searchPlaceholder,
56319
+ "aria-label": searchLabel,
56320
+ className: "min-w-0 flex-1 bg-transparent text-xs text-foreground outline-none placeholder:text-foreground-disabled",
56321
+ onChange: (e) => setText(e.target.value)
56322
+ })]
56323
+ }),
56324
+ /* @__PURE__ */ jsxs("div", {
56325
+ className: "flex flex-wrap items-center gap-1",
56326
+ children: [
56327
+ pickerFacetFilterShown(typeOptions, filters.types) && /* @__PURE__ */ jsx(FacetDropdown, {
56328
+ facet: "type",
56329
+ options: typeOptions,
56330
+ chosen: filters.types,
56331
+ onChange: (types) => onFiltersChange({
56332
+ ...filters,
56333
+ types
56334
+ }),
56335
+ disabled
56336
+ }),
56337
+ zoneShown && /* @__PURE__ */ jsx(FacetDropdown, {
56338
+ facet: "zone",
56339
+ options: zoneOptions,
56340
+ chosen: filters.zones,
56341
+ onChange: (next) => onFiltersChange({
56342
+ ...filters,
56343
+ zones: next
56344
+ }),
56345
+ ...unavailable !== void 0 ? { unavailable } : {},
56346
+ disabled
56347
+ }),
56348
+ pickerFacetFilterShown(locationOptions, filters.locations) && /* @__PURE__ */ jsx(FacetDropdown, {
56349
+ facet: "location",
56350
+ options: locationOptions,
56351
+ chosen: filters.locations,
56352
+ onChange: (locations) => onFiltersChange({
56353
+ ...filters,
56354
+ locations
56355
+ }),
56356
+ disabled
56357
+ }),
56358
+ active && /* @__PURE__ */ jsx(Button, {
56359
+ variant: "ghost",
56360
+ "data-testid": "picker-reset-filters",
56361
+ onClick: () => {
56362
+ setText("");
56363
+ onFiltersChange(resetPickerFilters());
56364
+ },
56365
+ children: "Reset filters"
56366
+ })
56367
+ ]
56368
+ }),
56369
+ pickerZoneFilterSuspended(filters, zones) && /* @__PURE__ */ jsx("p", {
56370
+ className: "text-[10px] text-foreground-subtle",
56371
+ "data-testid": "picker-zone-filter-paused",
56372
+ children: "Zone filter paused — zones not loaded"
56373
+ })
56374
+ ]
56375
+ });
56376
+ }
56377
+ //#endregion
56378
+ //#region src/composites/device-picker/device-picker-grouping.ts
56379
+ /**
56380
+ * The admin side of the device picker's "Group by" (Zone | Location | None):
56381
+ * the remembered choice, and the site-zone read. What each mode DRAWS is
56382
+ * `device-picker-model.ts` (shared with the viewer); this only supplies what
56383
+ * is side-specific.
56384
+ *
56385
+ * - The choice lives in `localStorage`, one value for every device picker in
56386
+ * this browser. Storage that throws or holds an unknown value is the
56387
+ * default (`zone`), never an error.
56388
+ * - The zones are read whenever the picker's panel is open (the Zone filter
56389
+ * needs them even in Location or None mode) — the caller mounts this with
56390
+ * the panel — and a failure stays a FAILURE: an
56391
+ * empty list would put every device under "No zone", a claim of absence
56392
+ * from a read that did not answer (D315). The model then groups by
56393
+ * location and the panel says why.
56394
+ */
56395
+ var DEVICE_PICKER_GROUP_STORAGE_KEY = "camstack.admin.device-picker.group-by";
56396
+ /**
56397
+ * Under `listSiteZones`'s own prefix, so the Locations page's invalidation of
56398
+ * `[['deviceManager', 'listSiteZones']]` refreshes it too.
56399
+ */
56400
+ var PICKER_ZONES_QUERY_KEY = [["deviceManager", "listSiteZones"], "device-picker"];
56401
+ var PICKER_ZONES_STALE_MS = 6e4;
56402
+ /** The stored choice; the default when storage is absent, throws or is unreadable. */
56403
+ function readStoredGroupBy() {
56404
+ try {
56405
+ const raw = globalThis.localStorage?.getItem("camstack.admin.device-picker.group-by") ?? null;
56406
+ return raw === null ? PICKER_DEFAULT_GROUP_BY : parsePickerGroupBy(raw);
56407
+ } catch {
56408
+ return PICKER_DEFAULT_GROUP_BY;
56409
+ }
56410
+ }
56411
+ /** Remember the choice; a storage that refuses keeps it for this page only. */
56412
+ function writeStoredGroupBy(next) {
56413
+ try {
56414
+ globalThis.localStorage?.setItem(DEVICE_PICKER_GROUP_STORAGE_KEY, next);
56415
+ } catch {}
56416
+ }
56417
+ function useStoredGroupBy() {
56418
+ const [groupBy, setState] = useState(readStoredGroupBy);
56419
+ const setGroupBy = (next) => {
56420
+ setState(next);
56421
+ writeStoredGroupBy(next);
56422
+ };
56423
+ return {
56424
+ groupBy,
56425
+ setGroupBy
56426
+ };
56427
+ }
56428
+ /** The site zones, with whether the read ANSWERED — read only while `enabled`. */
56429
+ function usePickerSiteZones(enabled) {
56430
+ const trpcClient = useSystem().trpcClient;
56431
+ const { data, isError } = useQuery({
56432
+ queryKey: PICKER_ZONES_QUERY_KEY,
56433
+ enabled,
56434
+ staleTime: PICKER_ZONES_STALE_MS,
56435
+ queryFn: () => trpcClient.deviceManager.listSiteZones.query()
56436
+ });
56437
+ return useMemo(() => {
56438
+ if (data !== void 0) return {
56439
+ state: "answered",
56440
+ zones: data
56441
+ };
56442
+ return isError ? { state: "failed" } : { state: "pending" };
56443
+ }, [data, isError]);
56444
+ }
56445
+ //#endregion
56446
+ //#region src/composites/device-picker/device-selection.ts
56447
+ function deviceListStateOf(query) {
56448
+ if (query.data !== void 0) return "answered";
56449
+ return query.isError ? "failed" : "pending";
56450
+ }
56451
+ function resolveSelectedDevices(selectedIds, cameras, state) {
56452
+ if (state !== "answered" || cameras === void 0) return selectedIds.map((id) => ({
56453
+ id,
56454
+ removed: false
56455
+ }));
56456
+ const byId = new Map(cameras.map((cam) => [cam.id, cam.name]));
56457
+ return selectedIds.map((id) => {
56458
+ const name = byId.get(id);
56459
+ return name === void 0 ? {
56460
+ id,
56461
+ removed: true
56462
+ } : {
56463
+ id,
56464
+ name,
56465
+ removed: false
56466
+ };
56467
+ });
56468
+ }
56469
+ /**
56470
+ * The selected ids a picker's DRAWN list does not contain, judged against the
56471
+ * WHOLE fleet — never against the drawn list itself. A camera picker draws
56472
+ * cameras, but a rule's devices can be a sensor picked on another surface: the
56473
+ * camera list lacking it says nothing about whether it still exists. Each row
56474
+ * is `removed` (the answered fleet lacks it), named (the fleet has it) or
56475
+ * unnamed (the fleet has not answered).
56476
+ */
56477
+ function offListSelections(selectedIds, listed, fleet, fleetState) {
56478
+ const listedIds = new Set((listed ?? []).map((device) => device.id));
56479
+ return resolveSelectedDevices(selectedIds.filter((id) => !listedIds.has(id)), fleet, fleetState);
56480
+ }
56481
+ /** The "no cameras" hint: only an ANSWERED empty list with nothing selected. */
56482
+ function showsNoCamerasHint(state, cameraCount, selectedCount) {
56483
+ return state === "answered" && cameraCount === 0 && selectedCount === 0;
56484
+ }
56485
+ /**
56486
+ * The widening warning: on a picker where an empty selection means ALL
56487
+ * devices, an empty selection that once held devices must say so.
56488
+ */
56489
+ function emptyDevicesWidens(emptyMeansAll, selectedCount, hadDevices) {
56490
+ return emptyMeansAll && selectedCount === 0 && hadDevices;
56491
+ }
56492
+ //#endregion
56493
+ //#region src/composites/device-picker/device-selection-rows.tsx
56494
+ /** Each noun's plural. */
56495
+ var PICKER_NOUN_PLURAL = {
56496
+ camera: "cameras",
56497
+ device: "devices",
56498
+ node: "nodes",
56499
+ package: "packages",
56500
+ class: "classes",
56501
+ zone: "zones",
56502
+ face: "faces",
56503
+ calendar: "calendars"
56504
+ };
56505
+ /** The label a picker gives a selected id its drawn list does not contain. */
56506
+ function orphanDeviceLabel(row, noun = "device") {
56507
+ const id = String(row.id);
56508
+ switch (noun) {
56509
+ case "node":
56510
+ if (row.removed) return `Node ${id} — unknown to the hub`;
56511
+ return row.name ?? `Node ${id}`;
56512
+ case "package":
56513
+ if (row.removed) return `${id} — not installed`;
56514
+ return row.name ?? id;
56515
+ case "class":
56516
+ if (row.removed) return `${id} — not in the class list`;
56517
+ return row.name ?? id;
56518
+ case "zone":
56519
+ if (row.removed) return `${id} — zone not found`;
56520
+ return row.name ?? `${id} — zone unavailable`;
56521
+ case "face":
56522
+ if (row.removed) return `${id} — not in the face gallery`;
56523
+ return row.name ?? id;
56524
+ case "calendar":
56525
+ if (row.removed) return `${id} — calendar not found`;
56526
+ return row.name ?? id;
56527
+ case "camera":
56528
+ case "device":
56529
+ if (row.removed) return `Device #${id} — removed`;
56530
+ return row.name ?? `Device #${id}`;
56531
+ }
56532
+ }
56533
+ /** Said under a picker whose empty selection means EVERY device. */
56534
+ function DevicesWidenWarning({ noun = "camera" }) {
56535
+ return /* @__PURE__ */ jsxs("p", {
56536
+ className: "mt-1 text-[11px] text-warning",
56537
+ "data-testid": "devices-widen-warning",
56538
+ children: [
56539
+ "No ",
56540
+ noun,
56541
+ " selected: the rule will apply to ALL ",
56542
+ PICKER_NOUN_PLURAL[noun],
56543
+ "."
56544
+ ]
56545
+ });
56546
+ }
56547
+ /** A list that has not answered: never an absence claim (D315). */
56548
+ function DevicesLoadingLine({ noun = "cameras" }) {
56549
+ return /* @__PURE__ */ jsxs("p", {
56550
+ className: "text-[11px] text-foreground-subtle",
56551
+ children: [
56552
+ "Loading ",
56553
+ noun,
56554
+ "…"
56555
+ ]
56556
+ });
56557
+ }
56558
+ /** A list that failed: said, while the selected ids stay removable. */
56559
+ function DevicesFailedLine({ noun = "devices" }) {
56560
+ return /* @__PURE__ */ jsxs("p", {
56561
+ className: "text-[11px] text-warning",
56562
+ children: [
56563
+ "The hub did not return its ",
56564
+ noun,
56565
+ " — selected ones are listed by id so they can still be removed."
56566
+ ]
56567
+ });
56568
+ }
56569
+ //#endregion
56570
+ //#region src/composites/device-picker/DevicePicker.tsx
56571
+ /**
56572
+ * The smart device picker every notification editor uses: the selection as
56573
+ * compact chips, and a searchable, grouped list opened only to change it.
56574
+ *
56575
+ * It replaces the long checklists (a rule's devices, a system rule's
56576
+ * include/exclude, the timelapse and digest cameras, the alarm's non-blocking
56577
+ * openings) with the same UX the viewer's picker has (D636). The decisions are
56578
+ * `device-picker-model.ts` (shared with the viewer, byte-identical); what a
56579
+ * selected id the list does not draw IS — removed, named, or unknown — is
56580
+ * `device-selection.ts`, and so are the two rules that shaped it:
56581
+ *
56582
+ * - D315: only a list that ANSWERED may call an id removed or say "no
56583
+ * cameras"; a pending list is a loading line and names nothing absent.
56584
+ * - D49: a read never drops a selected id; every one is a chip the operator
56585
+ * can remove, and only the operator removes one.
56586
+ *
56587
+ * It reads nothing. It filters the list its caller already holds, and judges
56588
+ * an off-list id against the caller's fleet (a camera picker draws cameras,
56589
+ * and a selected sensor missing from it still exists).
56590
+ *
56591
+ * Generic over the id since D637: the system family's node and package pickers
56592
+ * (`scope-pickers.tsx`) are this picker over string ids, with their own noun
56593
+ * and group titles.
56594
+ *
56595
+ * Bounded at hundreds of devices of one type: big groups start collapsed, the
56596
+ * rows are rendered a page at a time with "Show N more", and the chips stop at
56597
+ * `PICKER_CHIP_LIMIT` with a "+N more". `showAll` turns all three off, and the
56598
+ * list is always open: the rule editor's Devices tab exists to show every
56599
+ * device (R15, D690).
56600
+ *
56601
+ * "Group by" (Zone | Location | None) sits at the top of a DEVICE picker's
56602
+ * list only — the node and package pickers keep their own groups, and so does
56603
+ * the CLASS picker (D641), whose groups are the taxonomy's categories. The choice
56604
+ * is remembered in `localStorage`, and the site zones are read whenever the
56605
+ * panel is open (the Zone filter needs them; `device-picker-grouping.ts`); a zone read that has
56606
+ * not answered groups by location with a one-line note, never "No zone"
56607
+ * (D315).
56608
+ */
56609
+ /** A "Group by" group's title: the zone or room, or which one it lacks. */
56610
+ function headingTitle(heading) {
56611
+ switch (heading.kind) {
56612
+ case "zone":
56613
+ case "location": return heading.label;
56614
+ case "no-zone": return "No zone";
56615
+ case "no-location": return "No location";
56616
+ }
56617
+ }
56618
+ function deviceGroupTitle(group) {
56619
+ if (group.heading !== void 0) return headingTitle(group.heading);
56620
+ return `${typeLabel(group.type)} · ${group.location ?? "No room"}`;
56621
+ }
56622
+ /** Whether a picker lists devices — the only kind with "Group by". */
56623
+ function isDeviceNoun(noun) {
56624
+ return noun === "camera" || noun === "device";
56625
+ }
56626
+ function chipsOf(value, devices, fleet, noun) {
56627
+ const byId = new Map(devices.map((device) => [device.id, device.name]));
56628
+ const orphans = new Map(offListSelections(value, devices, fleet.devices, fleet.state).map((row) => [row.id, row]));
56629
+ return value.map((id) => {
56630
+ const name = byId.get(id);
56631
+ if (name !== void 0) return {
56632
+ id,
56633
+ label: name,
56634
+ removed: false
56635
+ };
56636
+ const row = orphans.get(id) ?? {
56637
+ id,
56638
+ removed: false
56639
+ };
56640
+ return {
56641
+ id,
56642
+ label: orphanDeviceLabel(row, noun),
56643
+ removed: row.removed
56644
+ };
56645
+ });
56646
+ }
56647
+ /** The empty-list sentence: the device pickers keep the words they shipped with. */
56648
+ function noItemsSentence(noun, emptyMeansAll) {
56649
+ const plural = PICKER_NOUN_PLURAL[noun];
56650
+ if (!emptyMeansAll) return `No ${plural} available.`;
56651
+ if (noun === "camera" || noun === "device") return "No cameras available — the rule applies to all devices.";
56652
+ return `No ${plural} available — the rule applies to every ${noun}.`;
56653
+ }
56654
+ function DevicePicker({ devices, listState, fleet, value, onChange, emptyMeansAll = false, savedHadDevices = false, noun = "camera", groupTitle = deviceGroupTitle, emptyLabel, annotate, disabled = false, testId, showAll = false }) {
56655
+ const judge = fleet ?? {
56656
+ state: listState,
56657
+ devices: listState === "answered" ? devices : void 0
56658
+ };
56659
+ const [open, setOpen] = useState(false);
56660
+ const [chipsExpanded, setChipsExpanded] = useState(false);
56661
+ const [hadDevices, setHadDevices] = useState(savedHadDevices || value.length > 0);
56662
+ if (value.length > 0 && !hadDevices) setHadDevices(true);
56663
+ const chips = chipsOf(value, devices, judge, noun);
56664
+ const overflow = chipOverflow(chips, chipsExpanded || showAll);
56665
+ const listOpen = open || showAll;
56666
+ const widening = emptyDevicesWidens(emptyMeansAll, value.length, hadDevices);
56667
+ const plural = PICKER_NOUN_PLURAL[noun];
56668
+ if (listState === "answered" && showsNoCamerasHint(listState, devices.length, value.length)) return /* @__PURE__ */ jsxs("div", {
56669
+ "data-testid": testId,
56670
+ children: [/* @__PURE__ */ jsx("p", {
56671
+ className: "text-[10px] text-foreground-subtle mt-0.5",
56672
+ children: noItemsSentence(noun, emptyMeansAll)
56673
+ }), widening && /* @__PURE__ */ jsx(DevicesWidenWarning, { noun })]
56674
+ });
56675
+ return /* @__PURE__ */ jsxs("div", {
56676
+ className: "mt-1 space-y-1.5",
56677
+ "data-testid": testId,
56678
+ children: [
56679
+ listState === "pending" && /* @__PURE__ */ jsx(DevicesLoadingLine, { noun: plural }),
56680
+ listState === "failed" && /* @__PURE__ */ jsx(DevicesFailedLine, { noun: noun === "camera" ? "devices" : plural }),
56681
+ /* @__PURE__ */ jsxs("div", {
56682
+ className: "flex flex-wrap items-center gap-1",
56683
+ children: [
56684
+ chips.length === 0 ? /* @__PURE__ */ jsx("span", {
56685
+ className: "text-[11px] text-foreground-subtle",
56686
+ children: emptyLabel ?? (emptyMeansAll ? `Every ${noun} — no restriction` : "None selected")
56687
+ }) : overflow.shown.map((chip) => /* @__PURE__ */ jsx(SelectedChip, {
56688
+ testId: `picker-chip-${String(chip.id)}`,
56689
+ label: chip.label,
56690
+ warning: chip.removed,
56691
+ ...!disabled ? { onRemove: () => onChange(value.filter((id) => id !== chip.id)) } : {}
56692
+ }, chip.id)),
56693
+ overflow.hidden > 0 && /* @__PURE__ */ jsxs("button", {
56694
+ type: "button",
56695
+ className: "rounded-md border border-border px-1.5 py-0.5 text-[11px] text-foreground-subtle hover:bg-surface-hover",
56696
+ onClick: () => setChipsExpanded(true),
56697
+ children: [
56698
+ "+",
56699
+ overflow.hidden,
56700
+ " more"
56701
+ ]
56702
+ }),
56703
+ chipsExpanded && chips.length > 6 && /* @__PURE__ */ jsx("button", {
56704
+ type: "button",
56705
+ className: "text-[11px] text-foreground-subtle underline",
56706
+ onClick: () => setChipsExpanded(false),
56707
+ children: "Show fewer"
56708
+ }),
56709
+ listState !== "pending" && !showAll && /* @__PURE__ */ jsx("button", {
56710
+ type: "button",
56711
+ disabled,
56712
+ "aria-expanded": open,
56713
+ onClick: () => setOpen((o) => !o),
56714
+ className: "rounded-md border border-dashed border-border px-1.5 py-0.5 text-[11px] text-foreground hover:bg-surface-hover disabled:opacity-50",
56715
+ children: open ? "Done" : value.length === 0 ? `Add ${plural}…` : "Edit…"
56716
+ })
56717
+ ]
56718
+ }),
56719
+ listOpen && listState === "answered" && (isDeviceNoun(noun) ? /* @__PURE__ */ jsx(GroupedPickerPanel, {
56720
+ devices,
56721
+ value,
56722
+ onChange,
56723
+ annotate,
56724
+ groupTitle,
56725
+ noun,
56726
+ disabled,
56727
+ showAll
56728
+ }) : /* @__PURE__ */ jsx(PickerPanel, {
56729
+ devices,
56730
+ value,
56731
+ onChange,
56732
+ annotate,
56733
+ groupTitle,
56734
+ noun,
56735
+ disabled,
56736
+ showAll
56737
+ })),
56738
+ widening && /* @__PURE__ */ jsx(DevicesWidenWarning, { noun })
56739
+ ]
56740
+ });
56741
+ }
56742
+ /**
56743
+ * The device picker's panel: mounted only while the list is open, so the zone
56744
+ * read below happens only then (for Zone grouping and the Zone filter).
56745
+ */
56746
+ function GroupedPickerPanel(props) {
56747
+ const { groupBy, setGroupBy } = useStoredGroupBy();
56748
+ const zones = usePickerSiteZones(true);
56749
+ return /* @__PURE__ */ jsx(PickerPanel, {
56750
+ ...props,
56751
+ grouping: {
56752
+ groupBy,
56753
+ onGroupByChange: setGroupBy,
56754
+ zones
56755
+ }
56756
+ });
56757
+ }
56758
+ /** The search box's hint: a device has a room and a type, a class a category, a node or package an id. */
56759
+ function searchPlaceholder(noun) {
56760
+ if (noun === "camera" || noun === "device") return "Search by name, room or type…";
56761
+ if (noun === "class") return "Search by class or category…";
56762
+ if (noun === "zone") return "Search by camera or zone…";
56763
+ return "Search by name or id…";
56764
+ }
56765
+ /** An answered read with no zones: what the pickers without "Group by" are judged against. */
56766
+ var NO_ZONES = {
56767
+ state: "answered",
56768
+ zones: []
56769
+ };
56770
+ /** The searchable, grouped list — rendered one page at a time. */
56771
+ function PickerPanel({ devices, value, onChange, annotate, groupTitle, noun, disabled, showAll, grouping }) {
56772
+ const [filters, setFilters] = useState(PICKER_NO_FILTERS);
56773
+ const [toggles, setToggles] = useState(/* @__PURE__ */ new Map());
56774
+ const [shown, setShown] = useState(60);
56775
+ const searching = showAll || pickerQueryTokens(filters.query).length > 0;
56776
+ const groupBy = grouping?.groupBy;
56777
+ const zones = grouping?.zones ?? NO_ZONES;
56778
+ const matches = useMemo(() => applyPickerFilters(devices, filters, zones), [
56779
+ devices,
56780
+ filters,
56781
+ zones
56782
+ ]);
56783
+ const grouped = useMemo(() => groupBy !== void 0 ? groupPickerDevicesBy(matches, value, groupBy, zones) : null, [
56784
+ matches,
56785
+ value,
56786
+ groupBy,
56787
+ zones
56788
+ ]);
56789
+ const rows = useMemo(() => grouped !== null ? flattenPickerGrouping(grouped, value, toggles, searching) : flattenPickerRows(groupPickerDevices(matches, value), value, toggles, searching), [
56790
+ grouped,
56791
+ matches,
56792
+ value,
56793
+ toggles,
56794
+ searching
56795
+ ]);
56796
+ const shownBy = grouped?.groupBy ?? null;
56797
+ const typeOptions = useMemo(() => pickerFacetOptions(devices, "type", filters.types, zones), [
56798
+ devices,
56799
+ filters.types,
56800
+ zones
56801
+ ]);
56802
+ const zoneOptions = useMemo(() => pickerFacetOptions(devices, "zone", filters.zones, zones), [
56803
+ devices,
56804
+ filters.zones,
56805
+ zones
56806
+ ]);
56807
+ const locationOptions = useMemo(() => grouping === void 0 ? [] : pickerFacetOptions(devices, "location", filters.locations, zones), [
56808
+ devices,
56809
+ filters.locations,
56810
+ zones,
56811
+ grouping
56812
+ ]);
56813
+ const hiddenSelected = useMemo(() => pickerHiddenSelectedCount(value, devices, matches), [
56814
+ devices,
56815
+ value,
56816
+ matches
56817
+ ]);
56818
+ const page = pageRows(rows, showAll ? rows.length : shown);
56819
+ const toggleGroup = (group, expanded) => setToggles((current) => new Map([...current, [group.key, !expanded]]));
56820
+ return /* @__PURE__ */ jsxs("div", {
56821
+ className: "rounded-md border border-border bg-surface p-2",
56822
+ "data-testid": "device-picker-panel",
56823
+ children: [
56824
+ /* @__PURE__ */ jsx(DeviceFilterBar, {
56825
+ filters,
56826
+ onFiltersChange: (next) => {
56827
+ setFilters(next);
56828
+ setShown(60);
56829
+ },
56830
+ typeOptions,
56831
+ zoneOptions,
56832
+ locationOptions,
56833
+ zones,
56834
+ ...grouping !== void 0 ? { grouping: {
56835
+ groupBy: grouping.groupBy,
56836
+ onGroupByChange: grouping.onGroupByChange,
56837
+ fallback: grouped?.fallback ?? null
56838
+ } } : {},
56839
+ searchPlaceholder: searchPlaceholder(noun),
56840
+ searchLabel: noun === "camera" || noun === "device" ? "Search devices" : `Search ${PICKER_NOUN_PLURAL[noun]}`,
56841
+ disabled
56842
+ }),
56843
+ /* @__PURE__ */ jsxs("p", {
56844
+ className: "mt-1 text-[10px] text-foreground-subtle",
56845
+ children: [
56846
+ matches.length,
56847
+ " of ",
56848
+ devices.length,
56849
+ " shown · ",
56850
+ value.length,
56851
+ " selected"
56852
+ ]
56853
+ }),
56854
+ rows.length === 0 ? /* @__PURE__ */ jsx("p", {
56855
+ className: "py-2 text-[11px] text-foreground-subtle italic",
56856
+ children: noun === "camera" || noun === "device" ? "No device matches." : `No ${noun} matches.`
56857
+ }) : /* @__PURE__ */ jsxs("div", {
56858
+ className: showAll ? "mt-1" : "mt-1 max-h-72 overflow-y-auto",
56859
+ "data-testid": "device-picker-rows",
56860
+ children: [page.rows.map((row) => /* @__PURE__ */ jsx(PickerRowView, {
56861
+ row,
56862
+ value,
56863
+ onChange,
56864
+ onToggleGroup: toggleGroup,
56865
+ annotate,
56866
+ groupTitle,
56867
+ groupBy: shownBy,
56868
+ disabled
56869
+ }, row.key)), page.remaining > 0 && /* @__PURE__ */ jsxs("button", {
56870
+ type: "button",
56871
+ className: "mt-1 w-full rounded border border-border py-1 text-[11px] text-foreground-subtle hover:bg-surface-hover",
56872
+ onClick: () => setShown((n) => n + 60),
56873
+ children: [
56874
+ "Show ",
56875
+ Math.min(page.remaining, 60),
56876
+ " more (",
56877
+ page.remaining,
56878
+ " left)"
56879
+ ]
56880
+ })]
56881
+ }),
56882
+ hiddenSelected > 0 && /* @__PURE__ */ jsxs("p", {
56883
+ className: "mt-1 text-[10px] text-foreground-subtle",
56884
+ "data-testid": "picker-hidden-selected",
56885
+ children: [hiddenSelected, " selected hidden by filters"]
56886
+ })
56887
+ ]
56888
+ });
56889
+ }
56890
+ /** The second line: under "Group by" the room (where the header lacks it) and type, then the container. */
56891
+ function secondLine(device, groupBy) {
56892
+ if (groupBy === null) return device.detail;
56893
+ const facts = pickerRowFacts(device, groupBy);
56894
+ const parts = [
56895
+ facts.location,
56896
+ facts.type === null ? null : typeLabel(facts.type),
56897
+ device.detail ?? null
56898
+ ].filter((part) => part !== null);
56899
+ return parts.length > 0 ? parts.join(" · ") : void 0;
56900
+ }
56901
+ function PickerRowView({ row, value, onChange, onToggleGroup, annotate, groupTitle, groupBy, disabled }) {
56902
+ if (row.kind === "header") {
56903
+ const { group, expanded } = row;
56904
+ return /* @__PURE__ */ jsxs("div", {
56905
+ className: "flex items-center gap-2 border-b border-border px-1 py-1",
56906
+ "data-testid": "device-picker-group",
56907
+ children: [
56908
+ /* @__PURE__ */ jsxs("button", {
56909
+ type: "button",
56910
+ "aria-expanded": expanded,
56911
+ onClick: () => onToggleGroup(group, expanded),
56912
+ className: "flex min-w-0 flex-1 items-center gap-1 text-left text-[10px] font-semibold uppercase tracking-wide text-foreground-subtle",
56913
+ children: [
56914
+ /* @__PURE__ */ jsx("span", { children: expanded ? "▾" : "▸" }),
56915
+ /* @__PURE__ */ jsx("span", {
56916
+ className: "truncate",
56917
+ children: groupTitle(group)
56918
+ }),
56919
+ /* @__PURE__ */ jsxs("span", {
56920
+ className: "font-normal normal-case",
56921
+ children: [
56922
+ "(",
56923
+ group.selectedCount,
56924
+ "/",
56925
+ group.devices.length,
56926
+ ")"
56927
+ ]
56928
+ })
56929
+ ]
56930
+ }),
56931
+ /* @__PURE__ */ jsx("button", {
56932
+ type: "button",
56933
+ disabled,
56934
+ className: "text-[10px] text-primary hover:underline disabled:opacity-50",
56935
+ onClick: () => onChange(selectPickerGroup(value, group)),
56936
+ children: "All"
56937
+ }),
56938
+ /* @__PURE__ */ jsx("button", {
56939
+ type: "button",
56940
+ disabled,
56941
+ className: "text-[10px] text-foreground-subtle hover:underline disabled:opacity-50",
56942
+ onClick: () => onChange(clearPickerGroup(value, group)),
56943
+ children: "Clear"
56944
+ })
56945
+ ]
56946
+ });
56947
+ }
56948
+ const note = annotate?.(row.device.id);
56949
+ const second = secondLine(row.device, groupBy);
56950
+ return /* @__PURE__ */ jsxs("label", {
56951
+ className: "flex cursor-pointer items-center gap-2.5 px-3 py-1 text-xs text-foreground hover:bg-surface-hover",
56952
+ "data-testid": "device-picker-row",
56953
+ children: [/* @__PURE__ */ jsx("input", {
56954
+ type: "checkbox",
56955
+ checked: row.selected,
56956
+ disabled,
56957
+ onChange: () => onChange(togglePickerDevice(value, row.device.id)),
56958
+ className: "accent-primary",
56959
+ "data-device-id": String(row.device.id)
56960
+ }), /* @__PURE__ */ jsxs("span", {
56961
+ className: "flex min-w-0 flex-1 flex-col",
56962
+ children: [
56963
+ /* @__PURE__ */ jsx("span", {
56964
+ className: "truncate",
56965
+ children: row.device.name
56966
+ }),
56967
+ second !== void 0 && /* @__PURE__ */ jsx("span", {
56968
+ className: "truncate text-[10px] text-foreground-subtle",
56969
+ children: second
56970
+ }),
56971
+ note !== void 0 && /* @__PURE__ */ jsx("span", {
56972
+ className: "text-[10px] text-warning",
56973
+ children: note
56974
+ })
56975
+ ]
56976
+ })]
56977
+ });
56978
+ }
56979
+ //#endregion
56980
+ //#region src/composites/unit-picker/UnitPicker.tsx
56981
+ /**
56982
+ * Same-dimension unit picker. Lists only `unitsForDimension(dimension)`; an
56983
+ * empty dimension disables the control and shows `emptyReason` so the operator
56984
+ * never sees a refused conversion as a pickable option.
56985
+ */
56986
+ var FIELD_CLASS = "w-full min-w-0 px-1.5 py-0.5 text-[11px] bg-background border border-border rounded focus:outline-none focus:border-primary disabled:opacity-50 disabled:cursor-not-allowed";
56987
+ function UnitPicker({ dimension, value, onChange, disabled = false, emptyReason, inheritLabel, className, id, "aria-label": ariaLabel }) {
56988
+ const choices = dimension !== void 0 ? unitsForDimension(dimension) : [];
56989
+ const isEmpty = dimension === void 0;
56990
+ const selectDisabled = disabled || isEmpty;
56991
+ const handleChange = (event) => {
56992
+ const raw = event.target.value;
56993
+ if (raw === "") {
56994
+ onChange("");
56995
+ return;
56996
+ }
56997
+ onChange(normalizeUnit(raw) ?? raw);
56998
+ };
56999
+ return /* @__PURE__ */ jsxs("div", {
57000
+ className: "flex flex-col gap-0.5 min-w-0 w-full",
57001
+ children: [/* @__PURE__ */ jsxs("select", {
57002
+ id,
57003
+ className: className ?? FIELD_CLASS,
57004
+ "aria-label": ariaLabel,
57005
+ value,
57006
+ onChange: handleChange,
57007
+ disabled: selectDisabled,
57008
+ children: [inheritLabel !== void 0 && /* @__PURE__ */ jsx("option", {
57009
+ value: "",
57010
+ children: inheritLabel
57011
+ }), choices.map((unit) => /* @__PURE__ */ jsx("option", {
57012
+ value: unit,
57013
+ children: unit
57014
+ }, unit))]
57015
+ }), isEmpty && emptyReason !== void 0 && emptyReason !== "" && /* @__PURE__ */ jsx("span", {
57016
+ className: "text-[10px] text-foreground-subtle",
57017
+ children: emptyReason
57018
+ })]
57019
+ });
57020
+ }
57021
+ //#endregion
57022
+ //#region src/composites/placeholder-field/PlaceholderChipField.tsx
57023
+ /**
57024
+ * Text field with insertable placeholder chips — the same interaction model
57025
+ * as Notification Center's TemplateField, without the NC variable catalog.
57026
+ */
57027
+ var LABEL_CLASS = "block text-[11px] font-medium text-foreground mb-1";
57028
+ var TEXTAREA_CLASS = "w-full rounded-md border border-border bg-surface px-2.5 py-1.5 text-xs text-foreground placeholder:text-foreground-subtle focus:outline-none focus:ring-1 focus:ring-primary";
57029
+ function insertAtSelection(value, selection, token) {
57030
+ const before = value.slice(0, selection.start);
57031
+ return {
57032
+ value: `${before}${token}${value.slice(selection.end)}`,
57033
+ cursor: before.length + token.length
57034
+ };
57035
+ }
57036
+ function PlaceholderChipField({ label, value, onChange, chips, multiline = false, placeholder, disabled = false, testId, maxLength }) {
57037
+ const inputRef = useRef(null);
57038
+ const areaRef = useRef(null);
57039
+ const insert = (token) => {
57040
+ const element = multiline ? areaRef.current : inputRef.current;
57041
+ const result = insertAtSelection(value, {
57042
+ start: element?.selectionStart ?? value.length,
57043
+ end: element?.selectionEnd ?? value.length
57044
+ }, token);
57045
+ onChange(result.value);
57046
+ requestAnimationFrame(() => {
57047
+ element?.focus();
57048
+ element?.setSelectionRange(result.cursor, result.cursor);
57049
+ });
57050
+ };
57051
+ const handle = (e) => onChange(e.target.value);
57052
+ return /* @__PURE__ */ jsxs("div", {
57053
+ className: "space-y-1",
57054
+ "data-testid": testId,
57055
+ children: [
57056
+ /* @__PURE__ */ jsx("label", {
57057
+ className: LABEL_CLASS,
57058
+ children: label
57059
+ }),
57060
+ multiline ? /* @__PURE__ */ jsx("textarea", {
57061
+ ref: areaRef,
57062
+ value,
57063
+ rows: 2,
57064
+ disabled,
57065
+ placeholder,
57066
+ maxLength,
57067
+ onChange: handle,
57068
+ className: TEXTAREA_CLASS,
57069
+ "data-testid": `${testId}-input`
57070
+ }) : /* @__PURE__ */ jsx(Input, {
57071
+ ref: inputRef,
57072
+ value,
57073
+ disabled,
57074
+ placeholder,
57075
+ maxLength,
57076
+ onChange: handle,
57077
+ "data-testid": `${testId}-input`
57078
+ }),
57079
+ chips !== void 0 && chips.length > 0 && /* @__PURE__ */ jsx("div", {
57080
+ className: "flex flex-wrap gap-1 pt-0.5",
57081
+ "data-testid": `${testId}-chips`,
57082
+ children: chips.map((chip) => /* @__PURE__ */ jsx("button", {
57083
+ type: "button",
57084
+ disabled,
57085
+ className: "rounded-md bg-primary/10 px-1.5 py-0.5 text-[10px] text-primary hover:bg-primary/20 disabled:opacity-50",
57086
+ onClick: () => insert(chip.token),
57087
+ "data-testid": `${testId}-chip-${chip.id}`,
57088
+ children: chip.label
57089
+ }, chip.id))
57090
+ })
57091
+ ]
57092
+ });
57093
+ }
57094
+ //#endregion
55723
57095
  //#region src/contexts/zone-editing.tsx
55724
57096
  /**
55725
57097
  * Per-device zone-editing state shared between the player overlay
@@ -56671,4 +58043,4 @@ var SceneMonitorEditor = lazy(() => import("./SceneMonitorEditor-vfWTm6qv.js").t
56671
58043
  /** Lazy-wrapped `PrivacyMaskSettings` — code-split off the main bundle. */
56672
58044
  var PrivacyMaskSettings = lazy(() => import("./PrivacyMaskSettings-DMkchqO1.js").then((m) => ({ default: m.PrivacyMaskSettings })));
56673
58045
  //#endregion
56674
- export { AddonGlobalSettingsForm, AdminLinkQuickAction, 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, DataTableFilterBar, 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, EMPTY_DATA_TABLE_FILTER, EVENT_KIND_ICONS, EmptyState, ErrorBox, EventKindGlyph, EventStream, ExtensionsPanel, 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, IconPicker, 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, RoleDisplayDefaultsFromServer, RoleDisplayDefaultsProvider, 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, StreamDebugOverlay, 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, MicOff as a, agentColumnKey, allDeviceTypeFilterOptions, applyFleetQueryDefaults, ariaSortForColumn, badgeFor, buildStepTreeFromSchema, EyeOff as c, childEntityId, childListName, classifyCapability, cn, columnsForContext, containerChildToRef, countableDevices, coverHighlight, coverageLine, createSharedContext, createTheme, cursorFractionFor, darkColors, dataTableFacets, defaultTheme, deriveDeviceKind, deriveWebrtcDebugStats, describeDeviceSelector, deviceIntegrationResolver, deviceMatchesFilter, deviceOptionLabel, deviceRoleMeta, deviceRoleMetaOf, deviceTypeLabel, deviceTypeMeta, deviceTypeMetaOf, devicesToOptions, ensureMfHostInit, eventKindLabel, filterDataTableRows, filterDeviceOptions, findTimezone, formatControlDateTime, formatLastSeen, formatNumeric, freezeVerdict, fuzzyMatch, getClassColor, getPhaseVisual, groupAgentColumns, groupChildrenByLayout, hardwareLabel, hubOrigin, hubPath, hubUrl, hubWsUrl, humanDuration, humidifierTint, Mic as i, initialScrubState, isAbsentProvider, isDataTableFilterActive, isFieldVisible, Camera as l, lawnMowerActivityMeta, lightColors, loadRemoteBundle, makeScrubBridge, metadataEntries, metadataString, mirror, mountAddonPage, mountPath, Square as n, nextReconnectAction, nextSort, nextSortDirection, nextTableSort, normalizeForSearch, ImageOff as o, openTopLayer, overrideEntityIdFromLink, parseRecordedServerMessage, providerIcons, RotateCcw as r, resetHubMountForTests, resolveContainerPrimary, resolveControlAlign, resolveDeviceControl, resolveDeviceIntegration, resolveDisplayIcon, resolveEffectiveDefaultModel, resolveEffectiveStepModel, resolveEventKindIcon, resolvePrimaryChild, resolveSensorDisplay, resolveStepDefaultModel, resolveTableLayout, roiTooLarge, routerBasename, Grid2x2 as s, scrubReducer, selectedDeviceOptions, serializeRecordedCommand, shouldCommit, shouldEmit, shouldUseSingleNode, sortRows, sortRowsByColumn, statusIcons, statusLine, stepHasModelForFormat, stepModelOptions, stripParentNamePrefix, Trash2 as t, tabForSelector, tankAlert, themeToCss, toStationaryOverlayBox, toggleDataTableFacet, trpc, createLucideIcon as u, 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, useCameraGridLayoutApplyDeviceSettingsPatch, useCameraGridLayoutGetDeviceLiveContribution, useCameraGridLayoutGetDeviceSettingsContribution, useCameraGridLayoutGetLayout, useCameraGridLayoutSaveLayout, useCameraPipelineConfigApplyDeviceSettingsPatch, useCameraPipelineConfigGetDeviceLiveContribution, useCameraPipelineConfigGetDeviceSettingsContribution, useCameraStreamsGetBrokerStreams, useCameraStreamsGetCameraStreams, useCameraStreamsGetProfileRtspEntries, useCameraStreamsGetRtspEntries, useCameraStreamsPickStream, useCapabilityPresence, useCarbonMonoxideGetStatus, useClimateControlGetStatus, useClimateControlSetFanMode, useClimateControlSetMode, useClimateControlSetPreset, useClimateControlSetSwingHorizontal, useClimateControlSetSwingVertical, useClimateControlSetTarget, useClimateControlSetTargetHumidity, useClimateControlSetTargetRange, useClusterNodes, useClusterTopology, useColorGetStatus, useColorSetColor, useConfirm, useConnectionTestDescribeTest, useConnectionTestTestSettings, useConnectivityGetStatus, useConsumablesGetStatus, useConsumablesReset, useContactGetStatus, useContainerChildren, useControlGetStatus, useControlSetValue, useCoreBlocksCompile, useCoreBlocksCreate, useCoreBlocksCreateComposition, useCoreBlocksDelete, useCoreBlocksGet, useCoreBlocksGetComposition, useCoreBlocksGetCustomization, useCoreBlocksGetTypeDefs, useCoreBlocksList, useCoreBlocksListComposableCaps, useCoreBlocksListCompositions, useCoreBlocksRestart, useCoreBlocksSetEnabled, useCoreBlocksUpdate, useCoreBlocksUpdateComposition, useCoreBlocksValidateComposition, useCoverClose, useCoverGetStatus, useCoverOpen, useCoverSetPosition, useCoverSetTiltPosition, useCoverStop, useCustomFieldRenderer, useDataTableFilter, useDayNightGetOptions, useDayNightGetStatus, useDayNightSetSettings, useDebouncedString, useDecoderCreateSession, useDecoderDestroySession, useDecoderGetFrame, useDecoderGetInfo, useDecoderGetShmStats, useDecoderGetStats, useDecoderListActiveSessions, useDecoderOpenStream, useDecoderPullFrames, useDecoderPullHandles, useDecoderPushPacket, useDecoderReprobeHwaccel, useDecoderSupportsCodec, useDecoderUpdateConfig, useDetectionPipelineApplyDeviceSettingsPatch, useDetectionPipelineGetDeviceLiveContribution, useDetectionPipelineGetDeviceSettingsContribution, useDevShell, useDevice, useDeviceAdminLink, useDeviceAdminLinkGetAdminLink, 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, useDeviceExtensionListCandidates, useDeviceExtensionListSlots, useDeviceExtensionListSources, useDeviceExtensionSetSlot, useDeviceId, useDeviceListPageSize, useDeviceManagerAddLocation, useDeviceManagerAdoptDevice, useDeviceManagerAdoptionAdopt, useDeviceManagerAdoptionCancelJob, useDeviceManagerAdoptionListCandidateFilters, useDeviceManagerAdoptionListCandidates, useDeviceManagerAdoptionListJobs, useDeviceManagerAdoptionRefresh, useDeviceManagerAdoptionRelease, useDeviceManagerAdoptionResync, useDeviceManagerAdoptionStartJob, useDeviceManagerAllocateDeviceId, useDeviceManagerApplyInitialMeta, useDeviceManagerCreateDevice, useDeviceManagerDisable, useDeviceManagerDiscoverAllProviders, useDeviceManagerDiscoverDevices, useDeviceManagerDiscoverProvider, useDeviceManagerDiscoveryProviders, useDeviceManagerEnable, useDeviceManagerGetAllBindings, useDeviceManagerGetBindings, useDeviceManagerGetBindingsBatch, useDeviceManagerGetChildren, useDeviceManagerGetChildrenBatch, useDeviceManagerGetConfigSchema, useDeviceManagerGetCreationSchema, useDeviceManagerGetDevice, useDeviceManagerGetDeviceAggregate, useDeviceManagerGetDeviceLiveInfoAggregate, useDeviceManagerGetDeviceSettingsAggregate, useDeviceManagerGetDeviceStatusAggregate, useDeviceManagerGetDeviceStatusAggregateBatch, useDeviceManagerGetLinkedDevices, useDeviceManagerGetLinkedDevicesBatch, useDeviceManagerGetRoleDisplayDefaults, useDeviceManagerGetSettingsSchema, useDeviceManagerGetStreamProfileMap, useDeviceManagerGetStreamSources, useDeviceManagerGetWireableFields, useDeviceManagerGetWrapperActivation, useDeviceManagerListAll, useDeviceManagerListBindableCapsForDeviceType, useDeviceManagerListDeviceIdsByCaps, useDeviceManagerListLocationDescriptions, useDeviceManagerListLocationIcons, useDeviceManagerListLocations, useDeviceManagerListPersistedByAddon, useDeviceManagerListSiteZones, useDeviceManagerListWrappersForCap, useDeviceManagerLoadConfig, useDeviceManagerLoadMeta, useDeviceManagerLoadRuntimeState, useDeviceManagerMigrateDevice, useDeviceManagerPersistConfig, useDeviceManagerProbeStreams, useDeviceManagerProviderCreationType, useDeviceManagerProviderDiscoveryParamsSchema, useDeviceManagerRegisterDevice, useDeviceManagerRemove, useDeviceManagerRemoveByIntegration, useDeviceManagerRemoveDevice, useDeviceManagerRemoveLocation, useDeviceManagerRemoveSiteZone, useDeviceManagerRenameLocation, useDeviceManagerRenameSiteZone, useDeviceManagerRunDeviceAction, useDeviceManagerSetChildLayout, useDeviceManagerSetDisabled, useDeviceManagerSetDisplay, useDeviceManagerSetIntegrationId, useDeviceManagerSetLinkDeviceId, useDeviceManagerSetLocation, useDeviceManagerSetLocationDescription, useDeviceManagerSetLocationIcon, useDeviceManagerSetLocationZone, useDeviceManagerSetMetadata, useDeviceManagerSetName, useDeviceManagerSetPrimaryChildEntityId, useDeviceManagerSetRole, useDeviceManagerSetRoleDisplayDefaults, useDeviceManagerSetSiteZone, useDeviceManagerSetStreamProfileMap, useDeviceManagerSetType, useDeviceManagerSetWrapperActive, useDeviceManagerTestCreationField, useDeviceManagerTestField, useDeviceManagerUpdateConfig, useDeviceManagerUpdateDeviceField, useDeviceManagerUpdateDeviceFieldsBatch, useDeviceNetworkLink, useDeviceOpsGetConfigEntries, useDeviceOpsGetRawState, useDeviceOpsGetSettingsSchema, useDeviceOpsGetStreamSources, useDeviceOpsRemoveDevice, useDeviceOpsRunAction, useDeviceOpsSetConfig, useDeviceProviderAdoptDiscoveredDevice, useDeviceProviderCreateDevice, useDeviceProviderDiscoverDevices, useDeviceProviderGetChildCreationSchema, useDeviceProviderGetDevices, useDeviceProviderGetDiscoveryParamsSchema, useDeviceProviderGetManualCreationType, useDeviceProviderGetStatus, useDeviceProviderReloadDevice, useDeviceProviderStart, useDeviceProviderStop, useDeviceProviderSupportsDiscovery, useDeviceProviderSupportsManualCreation, useDeviceProviderTestCreationField, useDeviceProxy, useDeviceSnapshot, useDeviceSnapshotImage, useDeviceState, useDeviceStateClaimFields, useDeviceStateGetAllSnapshots, useDeviceStateGetCapSlice, useDeviceStateGetNativeCapSlice, useDeviceStateGetSnapshot, useDeviceStateListClaims, useDeviceStatePatchOwnedFields, useDeviceStateReleaseClaim, useDeviceStateSetCapSlice, useDeviceStateSlice, useDeviceStatusGetStatus, useDeviceWebrtc, useDevices, useDoorbellEvents, useDoorbellGetStatus, useEnumSensorGetStatus, useEventEmitterGetStatus, useEventInvalidation, useEventStreamLatest, useEventStreamMap, useFaceGalleryAssignFace, useFaceGalleryAssignFaces, useFaceGalleryAuditIdentitySamples, useFaceGalleryCreateIdentity, useFaceGalleryDeleteFace, useFaceGalleryDeleteIdentity, useFaceGalleryGetFaceByTrack, useFaceGalleryGetFaceMedia, useFaceGalleryListIdentities, useFaceGalleryListIdentitySamples, useFaceGalleryListRecentFaces, useFaceGalleryRemoveSample, useFaceGalleryRenameIdentity, useFaceGallerySuggestFaceClusters, useFaceGalleryUnassignFace, useFaceGalleryUnassignFaces, useFanControlGetStatus, useFanControlSetDirection, useFanControlSetOscillating, useFanControlSetPercentage, useFanControlSetPreset, useFeatureProbeGetStatus, useFloodGetStatus, useGasGetStatus, useHumidifierGetStatus, useHumidifierSetMode, useHumidifierSetOn, useHumidifierSetTargetHumidity, useHumiditySensorGetStatus, 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, useNodesDirectory, useNodesExecuteQuery, useNodesGetCapUsageGraph, useNodesGetNodeAddons, useNodesRenameNode, useNodesRestartAddon, useNodesRestartNode, useNodesRestartProcess, useNodesSetProcessLogLevel, useNodesShutdownNode, useNodesTopology, useNodesUndeployAddon, useNotificationOutputDeleteTarget, useNotificationOutputDiscoverTargets, useNotificationOutputListTargetKinds, useNotificationOutputListTargets, useNotificationOutputSend, useNotificationOutputSetTargetEnabled, useNotificationOutputTestTarget, useNotificationOutputUpsertTarget, useNotificationRulesCancelSnooze, useNotificationRulesCreateRule, useNotificationRulesCreateSnooze, useNotificationRulesDeleteRule, useNotificationRulesGetAlarmConfig, useNotificationRulesGetAlarmSensors, useNotificationRulesGetClipRetentionAsks, useNotificationRulesGetConditionCatalog, useNotificationRulesGetHistory, useNotificationRulesGetRule, useNotificationRulesGetRuleLastRuns, useNotificationRulesGetTemplateCatalog, useNotificationRulesListDeviceMutes, useNotificationRulesListRules, useNotificationRulesListSnoozes, useNotificationRulesPreviewStateSummary, useNotificationRulesPreviewTemplate, 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, usePipelineAnalyticsClearTrackRelation, 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, usePipelineAnalyticsGetTrack, usePipelineAnalyticsGetTrackMedia, usePipelineAnalyticsGetTrainingExportSummary, usePipelineAnalyticsGetTrainingExportUrl, usePipelineAnalyticsListArchivedDebugNotes, usePipelineAnalyticsListBirthDecisions, usePipelineAnalyticsListEventKinds, usePipelineAnalyticsListEventKindsBatch, usePipelineAnalyticsListEventMedia, usePipelineAnalyticsListOpsLog, usePipelineAnalyticsListRecentTracks, usePipelineAnalyticsListRelocateMediaJobs, usePipelineAnalyticsListRetrainAnnotations, usePipelineAnalyticsListRetrainFrames, usePipelineAnalyticsListRetrainStaging, usePipelineAnalyticsListTrackMedia, usePipelineAnalyticsListTrackRelations, usePipelineAnalyticsListTracks, usePipelineAnalyticsOwnersWithMedia, usePipelineAnalyticsPauseForStorageMigration, usePipelineAnalyticsProposeRetrainAnnotations, usePipelineAnalyticsPruneEvents, usePipelineAnalyticsPruneEventsBefore, usePipelineAnalyticsPruneTracksBefore, usePipelineAnalyticsReadLongTermSeries, usePipelineAnalyticsRebuildObjectEmbeddings, usePipelineAnalyticsReclaimDebugMedia, usePipelineAnalyticsReconcileFromDisk, usePipelineAnalyticsRefreshStorageLocationsForMigration, usePipelineAnalyticsRelocateMedia, usePipelineAnalyticsRestageRetrainTrack, usePipelineAnalyticsResumeForStorageMigration, usePipelineAnalyticsSaveRetrainAnnotations, usePipelineAnalyticsSearchObjectEvents, usePipelineAnalyticsSelectRetrainFrames, usePipelineAnalyticsSetTrackFlags, usePipelineAnalyticsSetTrackPurity, usePipelineAnalyticsSetTrackRelation, 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, usePipelineOrchestratorGetClusterModelChoice, usePipelineOrchestratorGetDeviceLiveContribution, usePipelineOrchestratorGetDeviceSettingsContribution, usePipelineOrchestratorGetGlobalMetrics, usePipelineOrchestratorGetIngestOwner, usePipelineOrchestratorGetNodeInferenceDevices, usePipelineOrchestratorGetPipelineAssignment, usePipelineOrchestratorGetPipelineAssignments, usePipelineOrchestratorGetPipelineDevicePin, usePipelineOrchestratorGetReconcileFromDiskStatus, usePipelineOrchestratorListAgentSettings, usePipelineOrchestratorListTemplates, usePipelineOrchestratorPauseForStorageMigration, usePipelineOrchestratorRebalance, usePipelineOrchestratorReconcileFromDisk, usePipelineOrchestratorRemoveAgentSettings, usePipelineOrchestratorRequestOccupancyLook, usePipelineOrchestratorResetNodePipelineDefaults, usePipelineOrchestratorResolvePipeline, usePipelineOrchestratorResumeForStorageMigration, usePipelineOrchestratorSaveTemplate, usePipelineOrchestratorSetAgentCapabilities, usePipelineOrchestratorSetAgentDecodeLimits, usePipelineOrchestratorSetAgentDetectWeight, usePipelineOrchestratorSetAgentInferenceDevices, usePipelineOrchestratorSetAgentMaxCameras, usePipelineOrchestratorSetAgentReachableHost, usePipelineOrchestratorSetCameraPipelineForAgent, usePipelineOrchestratorSetCameraSensors, 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, usePtzGetHomeReturn, usePtzGetOptions, usePtzGetPosition, usePtzGetPresets, usePtzGetStatus, usePtzGoHome, usePtzGoToPreset, usePtzMove, usePtzSavePreset, usePtzSetAutofocus, usePtzSetHomePreset, usePtzSetHomeReturn, usePtzStop, useRebootReboot, useRecordedPlayback, useRecordingArchiveApplyDeviceSettingsPatch, useRecordingArchiveCancelRelocateJob, useRecordingArchiveCancelStorageMigrationMove, useRecordingArchiveDeleteFootprint, useRecordingArchiveGetAvailabilityBatch, useRecordingArchiveGetDaysWithRecordingsBatch, useRecordingArchiveGetDeviceConfig, useRecordingArchiveGetDeviceLiveContribution, useRecordingArchiveGetDeviceSettingsContribution, useRecordingArchiveGetPlacement, useRecordingArchiveGetRelocateResidue, useRecordingArchiveGetStatus, useRecordingArchiveGetStorageMigrationMoveStatus, useRecordingArchiveGetStorageUsage, useRecordingArchiveListOpsLog, useRecordingArchiveListRelocateJobs, useRecordingArchiveLocateSegment, useRecordingArchivePauseForStorageMigration, useRecordingArchivePlanStorageRebalance, useRecordingArchivePruneFootage, useRecordingArchiveReadGopBytes, useRecordingArchiveReadSegmentBytes, useRecordingArchiveReadWindowBytes, useRecordingArchiveReconcileLedgerAgainstDisk, useRecordingArchiveRefreshStorageLocationsForMigration, useRecordingArchiveRelocateFootage, useRecordingArchiveRenderClip, useRecordingArchiveRenderGif, useRecordingArchiveRescanStorage, useRecordingArchiveResumeForStorageMigration, useRecordingArchiveSetDeviceConfig, useRecordingArchiveSetDevicePlacement, useRecordingArchiveStartStorageMigrationMove, useRecordingArchiveStartStorageRebalance, useRecordingExportCancelExport, useRecordingExportCreateExport, useRecordingExportDeleteExport, useRecordingExportGetDownloadUrl, useRecordingExportGetExport, useRecordingExportListExports, useRecordingExportReadExportBytes, useRecordingGetAvailability, useRecordingGetDaysWithRecordings, useRecordingGetPlayback, useRecordingGetPlaybackOptions, useRecordingListSources, useRecordingOnboardGetOptions, useRecordingOnboardGetStatus, useRecordingOnboardSetSettings, useRecordingSignalGetStatus, useRemoteComponent, useRoleDisplayDefaults, useSceneMonitorCaptureReference, useSceneMonitorCreateScene, useSceneMonitorDeleteReference, useSceneMonitorDeleteScene, useSceneMonitorGetStatus, useSceneMonitorListScenes, useSceneMonitorListScenesBatch, useSceneMonitorRecheckNow, useSceneMonitorResetScene, useSceneMonitorUpdateScene, useScriptRunnerGetStatus, useScriptRunnerRun, useScriptRunnerStop, useScrubController, useServerManagementApplyServerUpdate, useServerManagementCheckServerUpdate, useServerManagementGetServerPackageStatus, useServerManagementRestartServer, useServerManagementRollbackServerUpdate, useSettingsStoreAggregate, useSettingsStoreCount, useSettingsStoreDeclareCollection, useSettingsStoreDelete, useSettingsStoreDeleteWhere, useSettingsStoreGet, useSettingsStoreHistogram, useSettingsStoreInsert, useSettingsStoreInsertMany, useSettingsStoreIsEmpty, useSettingsStoreQuery, useSettingsStoreSet, 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, useVideoclipsDialClipStream, useVideoclipsGetClipPlayback, useVideoclipsGetPlaybackOptions, useVideoclipsListClips, useVideoclipsListSources, useVideoclipsOfferClipBytes, useVideoclipsReadClipBytes, useVodPlayback, useWaterHeaterGetStatus, useWaterHeaterSetAway, useWaterHeaterSetOperationMode, useWaterHeaterSetTargetTemp, useWeatherGetStatus, useWebrtcSessionAddIceCandidate, useWebrtcSessionCloseSession, useWebrtcSessionCreateSession, useWebrtcSessionGetIceCandidates, useWebrtcSessionGetSessionDebug, 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 };
58046
+ export { AddonGlobalSettingsForm, AdminLinkQuickAction, 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_PICKER_GROUP_STORAGE_KEY, DEVICE_ROLE_META, DEVICE_TYPE_CONTROL, DEVICE_TYPE_META, DISPLAY_ICON_REGISTRY, DataTable, DataTableFilterBar, DetectionCanvas, DetectionOverlay, DetectionResultTree, DevShell, DeviceActivityPanel, DeviceBatchToolbar, DeviceCard, DeviceContextProvider, DeviceExportPanel, DeviceFilterBar, DeviceGrid, DeviceItem, DeviceList, DeviceMultiSelectField, DevicePicker, DeviceSelectField, DeviceSelectorPicker, DeviceStepMatrix, DevicesFailedLine, DevicesLoadingLine, DevicesWidenWarning, Dialog, DialogBody, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, DiscoveryPanel, DoorbellRecentPanel, Dropdown, DropdownContent, DropdownItem, DropdownTrigger, DummyHeroCard, DummyInline, EMPTY_DATA_TABLE_FILTER, EVENT_KIND_ICONS, EmptyState, ErrorBox, EventKindGlyph, EventStream, ExtensionsPanel, 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, INPUT_SHELL, IconAction, IconButton, IconPicker, 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, PICKER_CHIP_LIMIT, PICKER_DEFAULT_GROUP_BY, PICKER_GROUP_BY_MODES, PICKER_GROUP_COLLAPSE_AT, PICKER_NONE_KEY, PICKER_NOUN_PLURAL, PICKER_NO_FILTERS, PICKER_PAGE_SIZE, PICKER_SEARCH_DEBOUNCE_MS, PICKER_WINDOW, PRIORITY, PTZOverlay, PageHeader, PhaseIcon, PipelineBuilder, PipelineRuntimeSelector, PipelineStep, PipelineTreeMatrix, PlaceholderChipField, 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, RoleDisplayDefaultsFromServer, RoleDisplayDefaultsProvider, 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, SelectedChip, SemanticBadge, SensorHeroCard, SensorInlineControl, SensorValueAtom, Separator, SettingRow, Sidebar, SidebarItem, Skeleton, SlideOverPanel, SlideToggle, SnapshotButton, SortHeaderButton, StatCard, StateValuesStream, StatusBadge, StepTimings, StepTreeMaster, Stepper, StreamBrokerSelector, StreamDebugOverlay, 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, UnitPicker, VacuumHeroCard, VacuumInlineControl, ValueReadout, ValveHeroCard, ValveInlineControl, VersionBadge, VodPlaybackProvider, WaterHeaterHeroCard, WaterHeaterInlineControl, WeatherHeroCard, WeatherInlineControl, WidgetMetricCard, WidgetPanel, WidgetRegistryProvider, WidgetSlot, ZoneEditingProvider, MicOff as a, agentColumnKey, allDeviceTypeFilterOptions, applyFleetQueryDefaults, applyPickerFilters, ariaSortForColumn, badgeFor, buildStepTreeFromSchema, EyeOff as c, childEntityId, childListName, chipOverflow, classifyCapability, clearPickerGroup, cn, columnsForContext, containerChildToRef, countableDevices, coverHighlight, coverageLine, createSharedContext, createTheme, cursorFractionFor, darkColors, dataTableFacets, defaultTheme, deriveDeviceKind, deriveWebrtcDebugStats, describeDeviceSelector, deviceIntegrationResolver, deviceListStateOf, deviceMatchesFilter, deviceOptionLabel, deviceRoleMeta, deviceRoleMetaOf, deviceTypeLabel, deviceTypeMeta, deviceTypeMetaOf, devicesToOptions, emptyDevicesWidens, ensureMfHostInit, eventKindLabel, filterDataTableRows, filterDeviceOptions, filterPickerDevices, findTimezone, flattenPickerGrouping, flattenPickerRows, formatControlDateTime, formatLastSeen, formatNumeric, freezeVerdict, fuzzyMatch, getClassColor, getPhaseVisual, groupAgentColumns, groupChildrenByLayout, groupPickerDevices, groupPickerDevicesBy, hardwareLabel, hubOrigin, hubPath, hubUrl, hubWsUrl, humanDuration, humidifierTint, Mic as i, initialScrubState, insertAtSelection, isAbsentProvider, isDataTableFilterActive, isFieldVisible, isGroupExpanded, Camera as l, lawnMowerActivityMeta, lightColors, loadRemoteBundle, makeScrubBridge, metadataEntries, metadataString, mirror, mountAddonPage, mountPath, Square as n, nextReconnectAction, nextSort, nextSortDirection, nextTableSort, normalizeForSearch, ImageOff as o, offListSelections, openTopLayer, orphanDeviceLabel, overrideEntityIdFromLink, pageRows, parsePickerGroupBy, parseRecordedServerMessage, pickerFacetFilterShown, pickerFacetKey, pickerFacetOptions, pickerFiltersActive, pickerGroupKey, pickerHiddenSelectedCount, pickerLocationKey, pickerQueryTokens, pickerRowFacts, pickerSearchText, pickerZoneFilterSuspended, providerIcons, RotateCcw as r, readStoredGroupBy, resetHubMountForTests, resetPickerFilters, resolveContainerPrimary, resolveControlAlign, resolveDeviceControl, resolveDeviceIntegration, resolveDisplayIcon, resolveEffectiveDefaultModel, resolveEffectiveStepModel, resolveEventKindIcon, resolvePrimaryChild, resolveSelectedDevices, resolveSensorDisplay, resolveStepDefaultModel, resolveTableLayout, roiTooLarge, routerBasename, Grid2x2 as s, scrubReducer, selectPickerGroup, selectedDeviceOptions, serializeRecordedCommand, shouldCommit, shouldEmit, shouldUseSingleNode, showsNoCamerasHint, sortRows, sortRowsByColumn, statusIcons, statusLine, stepHasModelForFormat, stepModelOptions, stripParentNamePrefix, Trash2 as t, tabForSelector, tankAlert, themeToCss, toStationaryOverlayBox, toggleDataTableFacet, togglePickerDevice, togglePickerKey, trpc, typeLabel, createLucideIcon as u, 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, useCalendarsImportFromHomeAssistant, useCalendarsListCalendars, useCalendarsListEvents, useCameraCredentialsGetCredentials, useCameraCredentialsGetStatus, useCameraGridLayoutApplyDeviceSettingsPatch, useCameraGridLayoutGetDeviceLiveContribution, useCameraGridLayoutGetDeviceSettingsContribution, useCameraGridLayoutGetLayout, useCameraGridLayoutSaveLayout, useCameraPipelineConfigApplyDeviceSettingsPatch, useCameraPipelineConfigGetDeviceLiveContribution, useCameraPipelineConfigGetDeviceSettingsContribution, useCameraStreamsGetBrokerStreams, useCameraStreamsGetCameraStreams, useCameraStreamsGetProfileRtspEntries, useCameraStreamsGetRtspEntries, useCameraStreamsPickStream, useCapabilityPresence, useCarbonMonoxideGetStatus, useClimateControlGetStatus, useClimateControlSetFanMode, useClimateControlSetMode, useClimateControlSetPreset, useClimateControlSetSwingHorizontal, useClimateControlSetSwingVertical, useClimateControlSetTarget, useClimateControlSetTargetHumidity, useClimateControlSetTargetRange, useClusterNodes, useClusterTopology, useColorGetStatus, useColorSetColor, useConfirm, useConnectionTestDescribeTest, useConnectionTestTestSettings, useConnectivityGetStatus, useConsumablesGetStatus, useConsumablesReset, useContactGetStatus, useContainerChildren, useControlGetStatus, useControlSetValue, useCoreBlocksCompile, useCoreBlocksCreate, useCoreBlocksCreateComposition, useCoreBlocksDelete, useCoreBlocksGet, useCoreBlocksGetComposition, useCoreBlocksGetCustomization, useCoreBlocksGetTypeDefs, useCoreBlocksList, useCoreBlocksListComposableCaps, useCoreBlocksListCompositions, useCoreBlocksRestart, useCoreBlocksSetEnabled, useCoreBlocksUpdate, useCoreBlocksUpdateComposition, useCoreBlocksValidateComposition, useCoverClose, useCoverGetStatus, useCoverOpen, useCoverSetPosition, useCoverSetTiltPosition, useCoverStop, useCustomFieldRenderer, useDataTableFilter, useDayNightGetOptions, useDayNightGetStatus, useDayNightSetSettings, useDebouncedString, useDecoderCreateSession, useDecoderDestroySession, useDecoderGetFrame, useDecoderGetInfo, useDecoderGetShmStats, useDecoderGetStats, useDecoderListActiveSessions, useDecoderOpenStream, useDecoderPullFrames, useDecoderPullHandles, useDecoderPushPacket, useDecoderReprobeHwaccel, useDecoderSupportsCodec, useDecoderUpdateConfig, useDetectionPipelineApplyDeviceSettingsPatch, useDetectionPipelineGetDeviceLiveContribution, useDetectionPipelineGetDeviceSettingsContribution, useDevShell, useDevice, useDeviceAdminLink, useDeviceAdminLinkGetAdminLink, 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, useDeviceExtensionListCandidates, useDeviceExtensionListSlots, useDeviceExtensionListSources, useDeviceExtensionSetSlot, useDeviceId, useDeviceListPageSize, useDeviceManagerAddLocation, useDeviceManagerAdoptDevice, useDeviceManagerAdoptionAdopt, useDeviceManagerAdoptionCancelJob, useDeviceManagerAdoptionListCandidateFilters, useDeviceManagerAdoptionListCandidates, useDeviceManagerAdoptionListJobs, useDeviceManagerAdoptionRefresh, useDeviceManagerAdoptionRelease, useDeviceManagerAdoptionResync, useDeviceManagerAdoptionStartJob, useDeviceManagerAllocateDeviceId, useDeviceManagerApplyInitialMeta, useDeviceManagerCreateDevice, useDeviceManagerDisable, useDeviceManagerDiscoverAllProviders, useDeviceManagerDiscoverDevices, useDeviceManagerDiscoverProvider, useDeviceManagerDiscoveryProviders, useDeviceManagerEnable, useDeviceManagerGetAllBindings, useDeviceManagerGetBindings, useDeviceManagerGetBindingsBatch, useDeviceManagerGetChildren, useDeviceManagerGetChildrenBatch, useDeviceManagerGetConfigSchema, useDeviceManagerGetCreationSchema, useDeviceManagerGetDevice, useDeviceManagerGetDeviceAggregate, useDeviceManagerGetDeviceLiveInfoAggregate, useDeviceManagerGetDeviceSettingsAggregate, useDeviceManagerGetDeviceStatusAggregate, useDeviceManagerGetDeviceStatusAggregateBatch, useDeviceManagerGetLinkedDevices, useDeviceManagerGetLinkedDevicesBatch, useDeviceManagerGetRoleDisplayDefaults, useDeviceManagerGetSettingsSchema, useDeviceManagerGetStreamProfileMap, useDeviceManagerGetStreamSources, useDeviceManagerGetWireableFields, useDeviceManagerGetWrapperActivation, useDeviceManagerListAll, useDeviceManagerListBindableCapsForDeviceType, useDeviceManagerListDeviceIdsByCaps, useDeviceManagerListLocationDescriptions, useDeviceManagerListLocationIcons, useDeviceManagerListLocations, useDeviceManagerListPersistedByAddon, useDeviceManagerListSiteZones, useDeviceManagerListWrappersForCap, useDeviceManagerLoadConfig, useDeviceManagerLoadMeta, useDeviceManagerLoadRuntimeState, useDeviceManagerMigrateDevice, useDeviceManagerPersistConfig, useDeviceManagerProbeStreams, useDeviceManagerProviderCreationType, useDeviceManagerProviderDiscoveryParamsSchema, useDeviceManagerRegisterDevice, useDeviceManagerRemove, useDeviceManagerRemoveByIntegration, useDeviceManagerRemoveDevice, useDeviceManagerRemoveLocation, useDeviceManagerRemoveSiteZone, useDeviceManagerRenameLocation, useDeviceManagerRenameSiteZone, useDeviceManagerRunDeviceAction, useDeviceManagerSetChildLayout, useDeviceManagerSetDisabled, useDeviceManagerSetDisplay, useDeviceManagerSetIntegrationId, useDeviceManagerSetLinkDeviceId, useDeviceManagerSetLocation, useDeviceManagerSetLocationDescription, useDeviceManagerSetLocationIcon, useDeviceManagerSetLocationZone, useDeviceManagerSetMetadata, useDeviceManagerSetName, useDeviceManagerSetPrimaryChildEntityId, useDeviceManagerSetRole, useDeviceManagerSetRoleDisplayDefaults, useDeviceManagerSetSiteZone, useDeviceManagerSetStreamProfileMap, useDeviceManagerSetType, useDeviceManagerSetWrapperActive, useDeviceManagerTestCreationField, useDeviceManagerTestField, useDeviceManagerUpdateConfig, useDeviceManagerUpdateDeviceField, useDeviceManagerUpdateDeviceFieldsBatch, useDeviceNetworkLink, useDeviceOpsGetConfigEntries, useDeviceOpsGetRawState, useDeviceOpsGetSettingsSchema, useDeviceOpsGetStreamSources, useDeviceOpsRemoveDevice, useDeviceOpsRunAction, useDeviceOpsSetConfig, useDeviceProviderAdoptDiscoveredDevice, useDeviceProviderCreateDevice, useDeviceProviderDiscoverDevices, useDeviceProviderGetChildCreationSchema, useDeviceProviderGetDevices, useDeviceProviderGetDiscoveryParamsSchema, useDeviceProviderGetManualCreationType, useDeviceProviderGetStatus, useDeviceProviderReloadDevice, useDeviceProviderStart, useDeviceProviderStop, useDeviceProviderSupportsDiscovery, useDeviceProviderSupportsManualCreation, useDeviceProviderTestCreationField, useDeviceProxy, useDeviceSnapshot, useDeviceSnapshotImage, useDeviceState, useDeviceStateClaimFields, useDeviceStateGetAllSnapshots, useDeviceStateGetCapSlice, useDeviceStateGetNativeCapSlice, useDeviceStateGetSnapshot, useDeviceStateListClaims, useDeviceStatePatchOwnedFields, useDeviceStateReleaseClaim, useDeviceStateSetCapSlice, useDeviceStateSlice, useDeviceStatusGetStatus, useDeviceWebrtc, useDevices, useDoorbellEvents, useDoorbellGetStatus, useEnumSensorGetStatus, useEventEmitterGetStatus, useEventInvalidation, useEventStreamLatest, useEventStreamMap, useFaceGalleryAssignFace, useFaceGalleryAssignFaces, useFaceGalleryAuditIdentitySamples, useFaceGalleryCreateIdentity, useFaceGalleryDeleteFace, useFaceGalleryDeleteIdentity, useFaceGalleryGetFaceByTrack, useFaceGalleryGetFaceMedia, useFaceGalleryListIdentities, useFaceGalleryListIdentitySamples, useFaceGalleryListRecentFaces, useFaceGalleryRemoveSample, useFaceGalleryRenameIdentity, useFaceGallerySuggestFaceClusters, useFaceGalleryUnassignFace, useFaceGalleryUnassignFaces, useFanControlGetStatus, useFanControlSetDirection, useFanControlSetOscillating, useFanControlSetPercentage, useFanControlSetPreset, useFeatureProbeGetStatus, useFloodGetStatus, useGasGetStatus, useHumidifierGetStatus, useHumidifierSetMode, useHumidifierSetOn, useHumidifierSetTargetHumidity, useHumiditySensorGetStatus, 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, useNodesDirectory, useNodesExecuteQuery, useNodesGetCapUsageGraph, useNodesGetNodeAddons, useNodesRenameNode, useNodesRestartAddon, useNodesRestartNode, useNodesRestartProcess, useNodesSetProcessLogLevel, useNodesShutdownNode, useNodesTopology, useNodesUndeployAddon, useNotificationOutputDeleteTarget, useNotificationOutputDiscoverTargets, useNotificationOutputListTargetKinds, useNotificationOutputListTargets, useNotificationOutputSend, useNotificationOutputSetTargetEnabled, useNotificationOutputTestTarget, useNotificationOutputUpsertTarget, useNotificationRulesCancelSnooze, useNotificationRulesCreateRule, useNotificationRulesCreateSnooze, useNotificationRulesDeleteRule, useNotificationRulesGetAlarmConfig, useNotificationRulesGetAlarmSensors, useNotificationRulesGetClipRetentionAsks, useNotificationRulesGetConditionCatalog, useNotificationRulesGetHistory, useNotificationRulesGetRule, useNotificationRulesGetRuleLastRuns, useNotificationRulesGetTemplateCatalog, useNotificationRulesListDeviceMutes, useNotificationRulesListRules, useNotificationRulesListSnoozes, useNotificationRulesPreviewStateSummary, useNotificationRulesPreviewTemplate, useNotificationRulesResolveArtifactUrl, useNotificationRulesSetAlarmConfig, useNotificationRulesSetDeviceMuted, useNotificationRulesSetRuleEnabled, useNotificationRulesTestRule, useNotificationRulesUpdateRule, useNotifierCancel, useNotifierGetStatus, useNotifierSend, useNumericSensorGetStatus, useOptimisticSlice, useOptionalSystem, useOptionalWidgetRegistry, useOsdGetStatus, useOsdManagerClearSlotBinding, useOsdManagerCopyDeviceConfiguration, useOsdManagerDeleteTemplate, useOsdManagerGetConditionSupport, useOsdManagerGetDeviceOsd, useOsdManagerGetSourceCatalog, useOsdManagerListTemplates, useOsdManagerPreviewSlot, useOsdManagerRenderDevice, useOsdManagerSetSlotBinding, useOsdManagerUpsertTemplate, useOsdSetOverlay, usePTZ, usePetFeederCallPet, usePetFeederCancelFeed, usePetFeederFeed, usePetFeederGetStatus, usePetFeederMarkFoodReplenished, usePetFeederPlaySound, usePetFeederResetDesiccant, usePetFeederSetChildLock, usePetFeederSetFeedSound, usePetFeederSetIndicatorLight, usePetFeederSetVolume, usePickerSiteZones, usePipelineAnalyticsApplyDeviceSettingsPatch, usePipelineAnalyticsCancelRelocateMedia, usePipelineAnalyticsCancelStorageMigrationMove, usePipelineAnalyticsClearTrackRelation, 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, usePipelineAnalyticsGetTrack, usePipelineAnalyticsGetTrackMedia, usePipelineAnalyticsGetTrainingExportSummary, usePipelineAnalyticsGetTrainingExportUrl, usePipelineAnalyticsListArchivedDebugNotes, usePipelineAnalyticsListBirthDecisions, usePipelineAnalyticsListEventKinds, usePipelineAnalyticsListEventKindsBatch, usePipelineAnalyticsListEventMedia, usePipelineAnalyticsListOpsLog, usePipelineAnalyticsListRecentTracks, usePipelineAnalyticsListRelocateMediaJobs, usePipelineAnalyticsListRetrainAnnotations, usePipelineAnalyticsListRetrainFrames, usePipelineAnalyticsListRetrainStaging, usePipelineAnalyticsListTrackMedia, usePipelineAnalyticsListTrackRelations, usePipelineAnalyticsListTracks, usePipelineAnalyticsOwnersWithMedia, usePipelineAnalyticsPauseForStorageMigration, usePipelineAnalyticsProposeRetrainAnnotations, usePipelineAnalyticsPruneEvents, usePipelineAnalyticsPruneEventsBefore, usePipelineAnalyticsPruneTracksBefore, usePipelineAnalyticsReadLongTermSeries, usePipelineAnalyticsRebuildObjectEmbeddings, usePipelineAnalyticsReclaimDebugMedia, usePipelineAnalyticsReconcileFromDisk, usePipelineAnalyticsRefreshStorageLocationsForMigration, usePipelineAnalyticsRelocateMedia, usePipelineAnalyticsRestageRetrainTrack, usePipelineAnalyticsResumeForStorageMigration, usePipelineAnalyticsSaveRetrainAnnotations, usePipelineAnalyticsSearchObjectEvents, usePipelineAnalyticsSelectRetrainFrames, usePipelineAnalyticsSetTrackFlags, usePipelineAnalyticsSetTrackPurity, usePipelineAnalyticsSetTrackRelation, 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, usePipelineOrchestratorGetClusterModelChoice, usePipelineOrchestratorGetDeviceLiveContribution, usePipelineOrchestratorGetDeviceSettingsContribution, usePipelineOrchestratorGetGlobalMetrics, usePipelineOrchestratorGetIngestOwner, usePipelineOrchestratorGetNodeInferenceDevices, usePipelineOrchestratorGetPipelineAssignment, usePipelineOrchestratorGetPipelineAssignments, usePipelineOrchestratorGetPipelineDevicePin, usePipelineOrchestratorGetReconcileFromDiskStatus, usePipelineOrchestratorListAgentSettings, usePipelineOrchestratorListTemplates, usePipelineOrchestratorPauseForStorageMigration, usePipelineOrchestratorRebalance, usePipelineOrchestratorReconcileFromDisk, usePipelineOrchestratorRemoveAgentSettings, usePipelineOrchestratorRequestOccupancyLook, usePipelineOrchestratorResetNodePipelineDefaults, usePipelineOrchestratorResolvePipeline, usePipelineOrchestratorResumeForStorageMigration, usePipelineOrchestratorSaveTemplate, usePipelineOrchestratorSetAgentCapabilities, usePipelineOrchestratorSetAgentDecodeLimits, usePipelineOrchestratorSetAgentDetectWeight, usePipelineOrchestratorSetAgentInferenceDevices, usePipelineOrchestratorSetAgentMaxCameras, usePipelineOrchestratorSetAgentReachableHost, usePipelineOrchestratorSetCameraPipelineForAgent, usePipelineOrchestratorSetCameraSensors, 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, usePtzGetHomeReturn, usePtzGetOptions, usePtzGetPosition, usePtzGetPresets, usePtzGetStatus, usePtzGoHome, usePtzGoToPreset, usePtzMove, usePtzSavePreset, usePtzSetAutofocus, usePtzSetHomePreset, usePtzSetHomeReturn, usePtzStop, useRebootReboot, useRecordedPlayback, useRecordingArchiveApplyDeviceSettingsPatch, useRecordingArchiveCancelRelocateJob, useRecordingArchiveCancelStorageMigrationMove, useRecordingArchiveDeleteFootprint, useRecordingArchiveGetAvailabilityBatch, useRecordingArchiveGetDaysWithRecordingsBatch, useRecordingArchiveGetDeviceConfig, useRecordingArchiveGetDeviceLiveContribution, useRecordingArchiveGetDeviceSettingsContribution, useRecordingArchiveGetPlacement, useRecordingArchiveGetRelocateResidue, useRecordingArchiveGetStatus, useRecordingArchiveGetStorageMigrationMoveStatus, useRecordingArchiveGetStorageUsage, useRecordingArchiveListOpsLog, useRecordingArchiveListRelocateJobs, useRecordingArchiveLocateSegment, useRecordingArchivePauseForStorageMigration, useRecordingArchivePlanStorageRebalance, useRecordingArchivePruneFootage, useRecordingArchiveReadGopBytes, useRecordingArchiveReadSegmentBytes, useRecordingArchiveReadWindowBytes, useRecordingArchiveReconcileLedgerAgainstDisk, useRecordingArchiveRefreshStorageLocationsForMigration, useRecordingArchiveRelocateFootage, useRecordingArchiveRenderClip, useRecordingArchiveRenderGif, useRecordingArchiveRescanStorage, useRecordingArchiveResumeForStorageMigration, useRecordingArchiveSetDeviceConfig, useRecordingArchiveSetDevicePlacement, useRecordingArchiveStartStorageMigrationMove, useRecordingArchiveStartStorageRebalance, useRecordingExportCancelExport, useRecordingExportCreateExport, useRecordingExportDeleteExport, useRecordingExportGetDownloadUrl, useRecordingExportGetExport, useRecordingExportListExports, useRecordingExportReadExportBytes, useRecordingGetAvailability, useRecordingGetDaysWithRecordings, useRecordingGetPlayback, useRecordingGetPlaybackOptions, useRecordingListSources, useRecordingOnboardGetOptions, useRecordingOnboardGetStatus, useRecordingOnboardSetSettings, useRecordingSignalGetStatus, useRemoteComponent, useRoleDisplayDefaults, useSceneMonitorCaptureReference, useSceneMonitorCreateScene, useSceneMonitorDeleteReference, useSceneMonitorDeleteScene, useSceneMonitorGetStatus, useSceneMonitorListScenes, useSceneMonitorListScenesBatch, useSceneMonitorRecheckNow, useSceneMonitorResetScene, useSceneMonitorUpdateScene, useScriptRunnerGetStatus, useScriptRunnerRun, useScriptRunnerStop, useScrubController, useServerManagementApplyServerUpdate, useServerManagementCheckServerUpdate, useServerManagementGetServerPackageStatus, useServerManagementRestartServer, useServerManagementRollbackServerUpdate, useSettingsStoreAggregate, useSettingsStoreCount, useSettingsStoreDeclareCollection, useSettingsStoreDelete, useSettingsStoreDeleteWhere, useSettingsStoreGet, useSettingsStoreHistogram, useSettingsStoreInsert, useSettingsStoreInsertMany, useSettingsStoreIsEmpty, useSettingsStoreQuery, useSettingsStoreSet, 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, useStoredGroupBy, 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, useVideoclipsDialClipStream, useVideoclipsGetClipPlayback, useVideoclipsGetPlaybackOptions, useVideoclipsListClips, useVideoclipsListSources, useVideoclipsOfferClipBytes, useVideoclipsReadClipBytes, useVodPlayback, useWaterHeaterGetStatus, useWaterHeaterSetAway, useWaterHeaterSetOperationMode, useWaterHeaterSetTargetTemp, useWeatherGetStatus, useWebrtcSessionAddIceCandidate, useWebrtcSessionCloseSession, useWebrtcSessionCreateSession, useWebrtcSessionGetIceCandidates, useWebrtcSessionGetSessionDebug, 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, writeStoredGroupBy };