@camstack/ui-library 1.2.227 → 1.2.228

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
@@ -7572,8 +7572,12 @@ var useNodesExecuteQuery = trpc.nodes.executeQuery.useMutation;
7572
7572
  var useNotificationOutputListTargetKinds = trpc.notificationOutput.listTargetKinds.useQuery;
7573
7573
  /** Generated alias around `trpc.notificationOutput.listTargets.useQuery`. */
7574
7574
  var useNotificationOutputListTargets = trpc.notificationOutput.listTargets.useQuery;
7575
+ /** Generated alias around `trpc.notificationOutput.getTarget.useQuery`. */
7576
+ var useNotificationOutputGetTarget = trpc.notificationOutput.getTarget.useQuery;
7575
7577
  /** Generated alias around `trpc.notificationOutput.discoverTargets.useQuery`. */
7576
7578
  var useNotificationOutputDiscoverTargets = trpc.notificationOutput.discoverTargets.useQuery;
7579
+ /** Generated alias around `trpc.notificationOutput.probeTargetConfig.useMutation`. */
7580
+ var useNotificationOutputProbeTargetConfig = trpc.notificationOutput.probeTargetConfig.useMutation;
7577
7581
  /** Generated alias around `trpc.notificationOutput.send.useMutation`. */
7578
7582
  var useNotificationOutputSend = trpc.notificationOutput.send.useMutation;
7579
7583
  /** Generated alias around `trpc.notificationOutput.testTarget.useMutation`. */
@@ -12368,8 +12372,8 @@ function selectedDeviceOptions(options, selected) {
12368
12372
  */
12369
12373
  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";
12370
12374
  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";
12371
- var LABEL_CLASS$2 = "block text-[11px] font-medium text-foreground mb-1 break-words";
12372
- var DESC_CLASS$1 = "text-[10px] text-foreground-subtle mt-0.5 break-words";
12375
+ var LABEL_CLASS$3 = "block text-[11px] font-medium text-foreground mb-1 break-words";
12376
+ var DESC_CLASS$2 = "text-[10px] text-foreground-subtle mt-0.5 break-words";
12373
12377
  /** The compact projection of the listAll rows the device fields consume. */
12374
12378
  function toCandidates(rows) {
12375
12379
  if (!Array.isArray(rows)) return [];
@@ -12456,14 +12460,14 @@ function FacetDropdown$1({ label, values, chosen, onChange }) {
12456
12460
  })]
12457
12461
  })] });
12458
12462
  }
12459
- function FieldShell({ label, description, required, translationFn, children }) {
12463
+ function FieldShell$1({ label, description, required, translationFn, children }) {
12460
12464
  const resolvedLabel = resolveLabel(label, translationFn);
12461
12465
  const resolvedDescription = resolveLabel(description, translationFn);
12462
12466
  return /* @__PURE__ */ jsxs("div", {
12463
12467
  className: "min-w-0",
12464
12468
  children: [
12465
12469
  resolvedLabel !== void 0 && resolvedLabel !== "" && /* @__PURE__ */ jsxs("label", {
12466
- className: LABEL_CLASS$2,
12470
+ className: LABEL_CLASS$3,
12467
12471
  children: [resolvedLabel, required && /* @__PURE__ */ jsx("span", {
12468
12472
  className: "text-danger ml-0.5",
12469
12473
  children: "*"
@@ -12471,7 +12475,7 @@ function FieldShell({ label, description, required, translationFn, children }) {
12471
12475
  }),
12472
12476
  children,
12473
12477
  resolvedDescription && /* @__PURE__ */ jsx("p", {
12474
- className: DESC_CLASS$1,
12478
+ className: DESC_CLASS$2,
12475
12479
  children: resolvedDescription
12476
12480
  })
12477
12481
  ]
@@ -12481,7 +12485,7 @@ function DeviceSelectField({ field, value, onChange, disabled, translationFn })
12481
12485
  const { data } = useDeviceManagerListAll({});
12482
12486
  const options = useMemo(() => devicesToOptions(toCandidates(data), field.deviceFilter), [data, field.deviceFilter]);
12483
12487
  const current = value === void 0 || value === null ? "" : String(value);
12484
- return /* @__PURE__ */ jsx(FieldShell, {
12488
+ return /* @__PURE__ */ jsx(FieldShell$1, {
12485
12489
  label: field.label,
12486
12490
  description: field.description,
12487
12491
  required: field.required,
@@ -12559,7 +12563,7 @@ function DeviceMultiSelectField({ field, value, onChange, disabled, translationF
12559
12563
  className: "min-w-0",
12560
12564
  children: [
12561
12565
  label !== void 0 && label !== "" && /* @__PURE__ */ jsx("label", {
12562
- className: LABEL_CLASS$2,
12566
+ className: LABEL_CLASS$3,
12563
12567
  children: label
12564
12568
  }),
12565
12569
  selectedOptions.length > 0 && /* @__PURE__ */ jsx("div", {
@@ -12682,6 +12686,720 @@ function DeviceMultiSelectField({ field, value, onChange, disabled, translationF
12682
12686
  })
12683
12687
  }),
12684
12688
  description && /* @__PURE__ */ jsx("p", {
12689
+ className: DESC_CLASS$2,
12690
+ children: description
12691
+ })
12692
+ ]
12693
+ });
12694
+ }
12695
+ //#endregion
12696
+ //#region ../../node_modules/class-variance-authority/dist/index.mjs
12697
+ /**
12698
+ * Copyright 2022 Joe Bell. All rights reserved.
12699
+ *
12700
+ * This file is licensed to you under the Apache License, Version 2.0
12701
+ * (the "License"); you may not use this file except in compliance with the
12702
+ * License. You may obtain a copy of the License at
12703
+ *
12704
+ * http://www.apache.org/licenses/LICENSE-2.0
12705
+ *
12706
+ * Unless required by applicable law or agreed to in writing, software
12707
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12708
+ * WARRANTIES OR REPRESENTATIONS OF ANY KIND, either express or implied. See the
12709
+ * License for the specific language governing permissions and limitations under
12710
+ * the License.
12711
+ */ var falsyToString = (value) => typeof value === "boolean" ? `${value}` : value === 0 ? "0" : value;
12712
+ var cx = clsx;
12713
+ var cva = (base, config) => (props) => {
12714
+ var _config_compoundVariants;
12715
+ if ((config === null || config === void 0 ? void 0 : config.variants) == null) return cx(base, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);
12716
+ const { variants, defaultVariants } = config;
12717
+ const getVariantClassNames = Object.keys(variants).map((variant) => {
12718
+ const variantProp = props === null || props === void 0 ? void 0 : props[variant];
12719
+ const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant];
12720
+ if (variantProp === null) return null;
12721
+ const variantKey = falsyToString(variantProp) || falsyToString(defaultVariantProp);
12722
+ return variants[variant][variantKey];
12723
+ });
12724
+ const propsWithoutUndefined = props && Object.entries(props).reduce((acc, param) => {
12725
+ let [key, value] = param;
12726
+ if (value === void 0) return acc;
12727
+ acc[key] = value;
12728
+ return acc;
12729
+ }, {});
12730
+ return cx(base, getVariantClassNames, config === null || config === void 0 ? void 0 : (_config_compoundVariants = config.compoundVariants) === null || _config_compoundVariants === void 0 ? void 0 : _config_compoundVariants.reduce((acc, param) => {
12731
+ let { class: cvClass, className: cvClassName, ...compoundVariantOptions } = param;
12732
+ return Object.entries(compoundVariantOptions).every((param) => {
12733
+ let [key, value] = param;
12734
+ return Array.isArray(value) ? value.includes({
12735
+ ...defaultVariants,
12736
+ ...propsWithoutUndefined
12737
+ }[key]) : {
12738
+ ...defaultVariants,
12739
+ ...propsWithoutUndefined
12740
+ }[key] === value;
12741
+ }) ? [
12742
+ ...acc,
12743
+ cvClass,
12744
+ cvClassName
12745
+ ] : acc;
12746
+ }, []), props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);
12747
+ };
12748
+ //#endregion
12749
+ //#region src/primitives/badge.tsx
12750
+ var badgeVariants = cva("inline-flex items-center rounded-full text-xs font-medium px-2 py-0.5", {
12751
+ variants: {
12752
+ variant: {
12753
+ default: "bg-surface-hover text-foreground",
12754
+ success: "bg-success/15 text-success",
12755
+ warning: "bg-warning/15 text-warning",
12756
+ danger: "bg-danger/15 text-danger",
12757
+ info: "bg-info/15 text-info"
12758
+ },
12759
+ styleVariant: {
12760
+ solid: "",
12761
+ outline: "border bg-transparent"
12762
+ }
12763
+ },
12764
+ defaultVariants: {
12765
+ variant: "default",
12766
+ styleVariant: "solid"
12767
+ }
12768
+ });
12769
+ var Badge = forwardRef(({ className, variant, style, ...props }, ref) => {
12770
+ return /* @__PURE__ */ jsx("span", {
12771
+ ref,
12772
+ className: cn(badgeVariants({
12773
+ variant,
12774
+ styleVariant: style
12775
+ }), className),
12776
+ ...props
12777
+ });
12778
+ });
12779
+ Badge.displayName = "Badge";
12780
+ //#endregion
12781
+ //#region src/composites/event-kind-visuals.tsx
12782
+ /**
12783
+ * Event-kind VISUALS — the UI-side half of the unified taxonomy dictionary
12784
+ * (`@camstack/types` `EVENT_TAXONOMY` owns the serializable data:
12785
+ * color / iconId / labelKey; this owns `iconId → lucide component` and
12786
+ * `labelKey → t()`).
12787
+ *
12788
+ * Every UI that renders an event kind (timeline, events tree, chips,
12789
+ * detection canvas/tree) resolves its glyph + translated label here — no
12790
+ * per-component hardcoded icon or label.
12791
+ */
12792
+ /**
12793
+ * `iconId` → lucide component. Built ONLY from statically-imported icons
12794
+ * (bundle-safe). Unknown ids resolve to the neutral `Tag` fallback.
12795
+ */
12796
+ var EVENT_KIND_ICONS = {
12797
+ motion: Activity,
12798
+ audio: Volume2,
12799
+ person: User,
12800
+ vehicle: Car,
12801
+ animal: PawPrint,
12802
+ package: Package,
12803
+ sensor: Radio,
12804
+ control: SlidersHorizontal,
12805
+ car: Car,
12806
+ truck: Truck,
12807
+ bus: Bus,
12808
+ motorcycle: Bike,
12809
+ bicycle: Bike,
12810
+ airplane: Plane,
12811
+ boat: Sailboat,
12812
+ train: TrainFront,
12813
+ bird: Bird,
12814
+ cat: Cat,
12815
+ dog: Dog,
12816
+ horse: PawPrint,
12817
+ sheep: PawPrint,
12818
+ cow: PawPrint,
12819
+ elephant: PawPrint,
12820
+ bear: PawPrint,
12821
+ zebra: PawPrint,
12822
+ giraffe: PawPrint,
12823
+ door: DoorOpen,
12824
+ pir: Radar,
12825
+ smoke: Flame,
12826
+ water: Droplet,
12827
+ gas: Wind,
12828
+ vibration: Vibrate,
12829
+ tamper: ShieldAlert,
12830
+ presence: UserCheck,
12831
+ generic: Tag,
12832
+ lock: Lock,
12833
+ siren: Siren,
12834
+ switch: ToggleRight,
12835
+ doorbell: BellRing,
12836
+ button: CircleDot,
12837
+ "audio-speech": MessageSquare,
12838
+ "audio-scream": Megaphone,
12839
+ "audio-crying": Baby,
12840
+ "audio-laughter": Laugh,
12841
+ "audio-music": Music,
12842
+ "audio-dog": Dog,
12843
+ "audio-cat": Cat,
12844
+ "audio-bird": Bird,
12845
+ "audio-animal": PawPrint,
12846
+ "audio-alarm": BellRing,
12847
+ "audio-doorbell": BellRing,
12848
+ "audio-glass_breaking": TriangleAlert,
12849
+ "audio-gunshot": Crosshair,
12850
+ "audio-vehicle": Car,
12851
+ "audio-siren": Siren,
12852
+ "audio-fire": Flame,
12853
+ "audio-water": Droplets,
12854
+ "audio-wind": Wind,
12855
+ "audio-door": DoorOpen,
12856
+ "audio-footsteps": Footprints,
12857
+ "audio-crowd": Users,
12858
+ "audio-telephone": Phone,
12859
+ "audio-engine": Cog,
12860
+ "audio-tools": Hammer,
12861
+ "audio-silence": VolumeX
12862
+ };
12863
+ /** Resolve an `iconId` to a lucide component (falls back to `Tag`). */
12864
+ function resolveEventKindIcon(iconId) {
12865
+ if (Object.hasOwn(EVENT_KIND_ICONS, iconId)) return EVENT_KIND_ICONS[iconId];
12866
+ if (iconId.startsWith("audio-")) return Volume2;
12867
+ return Tag;
12868
+ }
12869
+ /**
12870
+ * Translated label for an event kind — `t(labelKey)` when a translation
12871
+ * exists, else the English `label` fallback. Robust to a missing key: an
12872
+ * i18n backend that echoes the key unchanged (react-i18next default) is
12873
+ * treated as "no translation" and the fallback label is returned, so the UI
12874
+ * never renders a raw `eventKind.*` key.
12875
+ */
12876
+ function eventKindLabel(descriptor, t) {
12877
+ if (t === void 0) return descriptor.label;
12878
+ const translated = t(descriptor.labelKey);
12879
+ return translated === descriptor.labelKey || translated.length === 0 ? descriptor.label : translated;
12880
+ }
12881
+ /** Small convenience component: renders the lucide glyph for an `iconId`. */
12882
+ function EventKindGlyph({ iconId, size = 16, color, className }) {
12883
+ return createElement(resolveEventKindIcon(iconId), {
12884
+ size,
12885
+ color,
12886
+ className
12887
+ });
12888
+ }
12889
+ //#endregion
12890
+ //#region src/composites/device-picker/SelectedChip.tsx
12891
+ /**
12892
+ * Removable selection chip + the search-box shell shared by DevicePicker and
12893
+ * SearchableMultiSelectField (admin-ui). Lives here so addon MFEs can render
12894
+ * the same picker without importing admin-ui.
12895
+ */
12896
+ /** The search box's shell — shared with multiselect fields that mirror this picker. */
12897
+ 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";
12898
+ /** One selected entry as a removable chip. */
12899
+ function SelectedChip({ label, onRemove, warning = false, iconId, iconUrl, testId }) {
12900
+ return /* @__PURE__ */ jsxs("span", {
12901
+ "data-testid": testId,
12902
+ 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",
12903
+ children: [
12904
+ iconUrl !== void 0 ? /* @__PURE__ */ jsx("img", {
12905
+ src: iconUrl,
12906
+ alt: "",
12907
+ className: "h-3 w-3 shrink-0 rounded-sm object-contain"
12908
+ }) : iconId !== void 0 ? /* @__PURE__ */ jsx(EventKindGlyph, {
12909
+ iconId,
12910
+ size: 12
12911
+ }) : null,
12912
+ /* @__PURE__ */ jsx("span", {
12913
+ className: "truncate",
12914
+ children: label
12915
+ }),
12916
+ onRemove !== void 0 && /* @__PURE__ */ jsx("button", {
12917
+ type: "button",
12918
+ className: "shrink-0 hover:text-danger",
12919
+ "aria-label": `Remove ${label}`,
12920
+ onClick: onRemove,
12921
+ children: /* @__PURE__ */ jsx(X, { className: "h-2.5 w-2.5" })
12922
+ })
12923
+ ]
12924
+ });
12925
+ }
12926
+ //#endregion
12927
+ //#region src/composites/option-select/option-select-model.ts
12928
+ /** Number of options at/above which search is enabled by default (unless creatable). */
12929
+ var OPTION_SELECT_SEARCH_MIN_OPTIONS = 8;
12930
+ /** Fold an option into a single lower-cased haystack (value + label + description). */
12931
+ function optionSearchText(opt) {
12932
+ return [
12933
+ opt.value,
12934
+ opt.label,
12935
+ opt.description
12936
+ ].filter((p) => typeof p === "string" && p.length > 0).join(" ").toLowerCase();
12937
+ }
12938
+ /**
12939
+ * Filter options by a free-text query. An empty / whitespace-only query
12940
+ * returns every option (identity, preserving order).
12941
+ */
12942
+ function filterOptions(options, query) {
12943
+ const tokens = query.trim().toLowerCase().split(/\s+/).filter(Boolean);
12944
+ if (tokens.length === 0) return options;
12945
+ return options.filter((opt) => {
12946
+ const hay = optionSearchText(opt);
12947
+ return tokens.every((t) => hay.includes(t));
12948
+ });
12949
+ }
12950
+ /**
12951
+ * Split options into the currently-selected set (in selection order) and the
12952
+ * rest. Selected values with no matching option are surfaced as synthetic
12953
+ * options whose label falls back to the raw value.
12954
+ */
12955
+ function partitionSelected(options, selected) {
12956
+ const byValue = new Map(options.map((o) => [o.value, o]));
12957
+ const selectedSet = new Set(selected);
12958
+ return {
12959
+ selectedOptions: selected.map((v) => byValue.get(v) ?? {
12960
+ value: v,
12961
+ label: v
12962
+ }),
12963
+ unselected: options.filter((o) => !selectedSet.has(o.value))
12964
+ };
12965
+ }
12966
+ function resolveSearchable(optionCount, creatable, searchable) {
12967
+ if (searchable !== void 0) return searchable;
12968
+ return optionCount >= 8 || creatable;
12969
+ }
12970
+ /** Trimmed non-empty draft from the search box, or null when absent. */
12971
+ function draftFromQuery(query) {
12972
+ const trimmed = query.trim();
12973
+ return trimmed.length > 0 ? trimmed : null;
12974
+ }
12975
+ /**
12976
+ * True when an existing catalog option already represents this draft (value or
12977
+ * label, case-insensitive). Used to hide the “Use «query»” row when redundant.
12978
+ */
12979
+ function catalogHasDraft(options, draft) {
12980
+ const lower = draft.toLowerCase();
12981
+ return options.some((o) => o.value.toLowerCase() === lower || o.label.toLowerCase() === lower);
12982
+ }
12983
+ /**
12984
+ * Show the footer “Add new…” action only when creatable AND the caller
12985
+ * provided `onCreateRequest` (e.g. open a dedicated create dialog).
12986
+ *
12987
+ * Without that hook the footer was a no-op (it only focused the search box),
12988
+ * which read as “Add new is broken”. Free-form create already works via the
12989
+ * “Use «query»” row once the operator types — no footer needed.
12990
+ */
12991
+ function shouldShowAddNewFooter(creatable, hasCreateRequest) {
12992
+ return creatable && hasCreateRequest;
12993
+ }
12994
+ /**
12995
+ * Show the “Use «query»” commit row: creatable, a non-empty draft, and no
12996
+ * catalog option that already matches the draft.
12997
+ */
12998
+ function shouldShowUseQueryRow(creatable, query, options) {
12999
+ if (!creatable) return false;
13000
+ const draft = draftFromQuery(query);
13001
+ if (draft === null) return false;
13002
+ return !catalogHasDraft(options, draft);
13003
+ }
13004
+ //#endregion
13005
+ //#region src/composites/option-select/OptionSelect.tsx
13006
+ var LISTBOX_GAP_PX = 4;
13007
+ var LISTBOX_MAX_HEIGHT_PX = 224;
13008
+ var VIEWPORT_MARGIN_PX = 8;
13009
+ var LABEL_CLASS$2 = "block text-[11px] font-medium text-foreground mb-1 break-words";
13010
+ var DESC_CLASS$1 = "text-[10px] text-foreground-subtle mt-0.5 break-words";
13011
+ function OptionIcon({ opt }) {
13012
+ if (opt.iconUrl !== void 0) return /* @__PURE__ */ jsx("img", {
13013
+ src: opt.iconUrl,
13014
+ alt: "",
13015
+ className: "h-3.5 w-3.5 shrink-0 rounded-sm object-contain"
13016
+ });
13017
+ if (opt.iconId !== void 0) return /* @__PURE__ */ jsx(EventKindGlyph, {
13018
+ iconId: opt.iconId,
13019
+ size: 13
13020
+ });
13021
+ return null;
13022
+ }
13023
+ function OptionSelect(props) {
13024
+ const { mode, options, placeholder = "Select…", disabled = false, emptyMessage = "No options available.", creatable = false, createLabel = "Add new…", onCreateRequest, label, description, testId, optionTestIdPrefix, listboxId: listboxIdProp } = props;
13025
+ const isDisabled = disabled;
13026
+ const searchable = resolveSearchable(options.length, creatable, props.searchable);
13027
+ const listboxId = listboxIdProp ?? testId ?? "option-select-listbox";
13028
+ const selectedValues = mode === "single" ? props.value.length > 0 ? [props.value] : [] : props.value;
13029
+ const maxItems = mode === "multi" ? props.maxItems : void 0;
13030
+ const atMax = mode === "multi" && maxItems !== void 0 && selectedValues.length >= maxItems;
13031
+ const [query, setQuery] = useState("");
13032
+ const [open, setOpen] = useState(false);
13033
+ const [highlight, setHighlight] = useState(0);
13034
+ const [coords, setCoords] = useState(null);
13035
+ const inputRef = useRef(null);
13036
+ const triggerRef = useRef(null);
13037
+ const listboxRef = useRef(null);
13038
+ const blurTimer = useRef(null);
13039
+ const computeListboxCoords = () => {
13040
+ const trigger = triggerRef.current;
13041
+ if (trigger === null) return null;
13042
+ const rect = trigger.getBoundingClientRect();
13043
+ const spaceBelow = window.innerHeight - rect.bottom - VIEWPORT_MARGIN_PX;
13044
+ const spaceAbove = rect.top - VIEWPORT_MARGIN_PX;
13045
+ const preferBelow = spaceBelow >= Math.min(LISTBOX_MAX_HEIGHT_PX, spaceAbove) || spaceBelow >= 120;
13046
+ const maxHeight = Math.max(96, Math.min(LISTBOX_MAX_HEIGHT_PX, preferBelow ? spaceBelow : spaceAbove));
13047
+ const left = Math.max(VIEWPORT_MARGIN_PX, Math.min(rect.left, window.innerWidth - rect.width - VIEWPORT_MARGIN_PX));
13048
+ if (preferBelow) return {
13049
+ top: rect.bottom + LISTBOX_GAP_PX,
13050
+ left,
13051
+ width: rect.width,
13052
+ maxHeight,
13053
+ placement: "below"
13054
+ };
13055
+ return {
13056
+ top: Math.max(VIEWPORT_MARGIN_PX, rect.top - LISTBOX_GAP_PX - maxHeight),
13057
+ left,
13058
+ width: rect.width,
13059
+ maxHeight,
13060
+ placement: "above"
13061
+ };
13062
+ };
13063
+ const { selectedOptions } = useMemo(() => partitionSelected(options, selectedValues), [options, selectedValues]);
13064
+ const filtered = useMemo(() => filterOptions(options, query), [options, query]);
13065
+ const showUseQuery = shouldShowUseQueryRow(creatable, query, options);
13066
+ const showAddNewFooter = shouldShowAddNewFooter(creatable, onCreateRequest !== void 0);
13067
+ const dropdownRows = useMemo(() => {
13068
+ const rows = filtered.map((opt, index) => ({
13069
+ kind: "option",
13070
+ opt,
13071
+ index
13072
+ }));
13073
+ if (showUseQuery) {
13074
+ const draft = draftFromQuery(query);
13075
+ if (draft !== null) rows.push({
13076
+ kind: "use-query",
13077
+ draft
13078
+ });
13079
+ }
13080
+ return rows;
13081
+ }, [
13082
+ filtered,
13083
+ showUseQuery,
13084
+ query
13085
+ ]);
13086
+ useLayoutEffect(() => {
13087
+ if (!open || isDisabled) {
13088
+ setCoords(null);
13089
+ return;
13090
+ }
13091
+ const update = () => {
13092
+ setCoords(computeListboxCoords());
13093
+ };
13094
+ update();
13095
+ window.addEventListener("resize", update);
13096
+ window.addEventListener("scroll", update, true);
13097
+ return () => {
13098
+ window.removeEventListener("resize", update);
13099
+ window.removeEventListener("scroll", update, true);
13100
+ };
13101
+ }, [
13102
+ open,
13103
+ isDisabled,
13104
+ selectedValues.length,
13105
+ query,
13106
+ dropdownRows.length
13107
+ ]);
13108
+ useEffect(() => {
13109
+ if (!open) return;
13110
+ const onPointer = (e) => {
13111
+ const target = e.target;
13112
+ if (listboxRef.current?.contains(target)) return;
13113
+ if (triggerRef.current?.contains(target)) return;
13114
+ setOpen(false);
13115
+ };
13116
+ document.addEventListener("mousedown", onPointer);
13117
+ return () => {
13118
+ document.removeEventListener("mousedown", onPointer);
13119
+ };
13120
+ }, [open]);
13121
+ const commitDraft = (draft) => {
13122
+ const trimmed = draft.trim();
13123
+ if (trimmed.length === 0) return;
13124
+ if (onCreateRequest !== void 0) {
13125
+ onCreateRequest(trimmed);
13126
+ setQuery("");
13127
+ setOpen(false);
13128
+ return;
13129
+ }
13130
+ if (mode === "single") {
13131
+ props.onChange(trimmed);
13132
+ setQuery("");
13133
+ setOpen(false);
13134
+ return;
13135
+ }
13136
+ if (props.value.includes(trimmed)) return;
13137
+ if (maxItems !== void 0 && props.value.length >= maxItems) return;
13138
+ props.onChange([...props.value, trimmed]);
13139
+ setQuery("");
13140
+ };
13141
+ const toggleMulti = (optValue) => {
13142
+ if (mode !== "multi" || isDisabled) return;
13143
+ if (props.value.includes(optValue)) props.onChange(props.value.filter((v) => v !== optValue));
13144
+ else {
13145
+ if (maxItems !== void 0 && props.value.length >= maxItems) return;
13146
+ props.onChange([...props.value, optValue]);
13147
+ }
13148
+ };
13149
+ const selectSingle = (optValue) => {
13150
+ if (mode !== "single" || isDisabled) return;
13151
+ props.onChange(optValue);
13152
+ setQuery("");
13153
+ setOpen(false);
13154
+ };
13155
+ const activateRow = (row) => {
13156
+ if (row.kind === "option") {
13157
+ if (row.opt.disabled === true) return;
13158
+ if (mode === "single") selectSingle(row.opt.value);
13159
+ else toggleMulti(row.opt.value);
13160
+ } else if (row.kind === "use-query") commitDraft(row.draft);
13161
+ };
13162
+ const rowCount = dropdownRows.length + (showAddNewFooter && !showUseQuery ? 1 : 0);
13163
+ const handleKeyDown = (e) => {
13164
+ if (e.key === "ArrowDown") {
13165
+ e.preventDefault();
13166
+ setOpen(true);
13167
+ setHighlight((h) => rowCount === 0 ? 0 : (h + 1) % rowCount);
13168
+ } else if (e.key === "ArrowUp") {
13169
+ e.preventDefault();
13170
+ setOpen(true);
13171
+ setHighlight((h) => rowCount === 0 ? 0 : (h - 1 + rowCount) % rowCount);
13172
+ } else if (e.key === "Enter") {
13173
+ e.preventDefault();
13174
+ if (showUseQuery && highlight === dropdownRows.length) {
13175
+ const draft = draftFromQuery(query);
13176
+ if (draft !== null) commitDraft(draft);
13177
+ return;
13178
+ }
13179
+ if (showAddNewFooter && !showUseQuery && highlight === dropdownRows.length) {
13180
+ inputRef.current?.focus();
13181
+ return;
13182
+ }
13183
+ const row = dropdownRows[highlight];
13184
+ if (row) activateRow(row);
13185
+ else if (creatable) {
13186
+ const draft = draftFromQuery(query);
13187
+ if (draft !== null) commitDraft(draft);
13188
+ }
13189
+ } else if (e.key === "Escape") setOpen(false);
13190
+ else if (e.key === "Backspace" && query === "" && mode === "multi" && props.value.length > 0) props.onChange(props.value.slice(0, -1));
13191
+ };
13192
+ const handleNonSearchKeyDown = (e) => {
13193
+ if (e.key === "Enter" || e.key === " ") {
13194
+ e.preventDefault();
13195
+ setOpen((o) => !o);
13196
+ } else if (e.key === "Escape") setOpen(false);
13197
+ };
13198
+ const removeChip = (value) => {
13199
+ if (mode === "single") props.onChange("");
13200
+ else props.onChange(props.value.filter((v) => v !== value));
13201
+ };
13202
+ const triggerPlaceholder = atMax === true ? `Max ${maxItems} selected` : placeholder;
13203
+ const showEmptyCatalog = options.length === 0 && !showUseQuery && dropdownRows.length === 0 && open;
13204
+ let dropdownBody;
13205
+ if (showEmptyCatalog) dropdownBody = /* @__PURE__ */ jsx("div", {
13206
+ className: "px-2.5 py-2 text-[11px] text-foreground-subtle",
13207
+ children: emptyMessage
13208
+ });
13209
+ else if (dropdownRows.length === 0 && !creatable) dropdownBody = /* @__PURE__ */ jsxs("div", {
13210
+ className: "px-2.5 py-2 text-[11px] text-foreground-subtle italic",
13211
+ children: [
13212
+ "No matches for “",
13213
+ query,
13214
+ "”"
13215
+ ]
13216
+ });
13217
+ else dropdownBody = /* @__PURE__ */ jsx(Fragment$1, { children: dropdownRows.map((row, i) => {
13218
+ if (row.kind === "use-query") return /* @__PURE__ */ jsxs("button", {
13219
+ type: "button",
13220
+ role: "option",
13221
+ "aria-selected": false,
13222
+ className: [
13223
+ "flex w-full items-center gap-2 px-2.5 py-1.5 text-left text-xs transition-colors",
13224
+ i === highlight ? "bg-primary/10" : "hover:bg-surface-hover",
13225
+ "cursor-pointer"
13226
+ ].join(" "),
13227
+ onMouseEnter: () => setHighlight(i),
13228
+ onClick: () => commitDraft(row.draft),
13229
+ children: [/* @__PURE__ */ jsx(Plus, { className: "h-3.5 w-3.5 shrink-0 text-primary" }), /* @__PURE__ */ jsxs("span", {
13230
+ className: "truncate text-foreground",
13231
+ children: [
13232
+ "Use “",
13233
+ row.draft,
13234
+ "”"
13235
+ ]
13236
+ })]
13237
+ }, "__use-query__");
13238
+ if (row.kind !== "option") return null;
13239
+ const { opt } = row;
13240
+ const checked = mode === "single" ? props.value === opt.value : props.value.includes(opt.value);
13241
+ const blockedByMax = mode === "multi" && !checked && atMax === true;
13242
+ const optionDisabled = opt.disabled === true || blockedByMax;
13243
+ return /* @__PURE__ */ jsxs("button", {
13244
+ type: "button",
13245
+ role: "option",
13246
+ "aria-selected": checked,
13247
+ disabled: optionDisabled,
13248
+ "data-testid": optionTestIdPrefix !== void 0 ? `${optionTestIdPrefix}-${opt.value}` : void 0,
13249
+ className: [
13250
+ "flex w-full items-center gap-2 px-2.5 py-1.5 text-left text-xs transition-colors",
13251
+ i === highlight ? "bg-primary/10" : "hover:bg-surface-hover",
13252
+ optionDisabled ? "opacity-40 cursor-not-allowed" : "cursor-pointer"
13253
+ ].join(" "),
13254
+ onMouseEnter: () => setHighlight(i),
13255
+ onClick: () => activateRow(row),
13256
+ children: [
13257
+ /* @__PURE__ */ jsx("span", {
13258
+ className: ["flex h-3.5 w-3.5 shrink-0 items-center justify-center rounded border", checked ? "border-primary bg-primary text-white" : "border-border"].join(" "),
13259
+ children: checked && /* @__PURE__ */ jsx(Check, { className: "h-2.5 w-2.5" })
13260
+ }),
13261
+ /* @__PURE__ */ jsx(OptionIcon, { opt }),
13262
+ /* @__PURE__ */ jsx("span", {
13263
+ className: "min-w-0 flex-1 truncate text-foreground",
13264
+ children: opt.label
13265
+ }),
13266
+ opt.badge !== void 0 && opt.badge.length > 0 ? /* @__PURE__ */ jsx(Badge, {
13267
+ variant: "default",
13268
+ children: opt.badge
13269
+ }) : null
13270
+ ]
13271
+ }, opt.value);
13272
+ }) });
13273
+ const footerAddNewIndex = dropdownRows.length;
13274
+ return /* @__PURE__ */ jsxs("div", {
13275
+ className: "min-w-0 space-y-1",
13276
+ "data-testid": testId,
13277
+ children: [
13278
+ label !== void 0 && label.length > 0 && /* @__PURE__ */ jsx("label", {
13279
+ className: LABEL_CLASS$2,
13280
+ children: label
13281
+ }),
13282
+ mode === "multi" && selectedOptions.length > 0 && /* @__PURE__ */ jsx("div", {
13283
+ className: "flex flex-wrap gap-1 mb-1.5",
13284
+ children: selectedOptions.map((opt) => /* @__PURE__ */ jsx(SelectedChip, {
13285
+ label: opt.label,
13286
+ ...opt.iconUrl !== void 0 ? { iconUrl: opt.iconUrl } : {},
13287
+ ...opt.iconId !== void 0 ? { iconId: opt.iconId } : {},
13288
+ ...!isDisabled ? { onRemove: () => removeChip(opt.value) } : {},
13289
+ ...optionTestIdPrefix !== void 0 ? { testId: `${optionTestIdPrefix}-chip-${opt.value}` } : {}
13290
+ }, opt.value))
13291
+ }),
13292
+ mode === "single" && selectedOptions.length > 0 && /* @__PURE__ */ jsx("div", {
13293
+ className: "flex flex-wrap gap-1 mb-1.5",
13294
+ children: selectedOptions.map((opt) => /* @__PURE__ */ jsx(SelectedChip, {
13295
+ label: opt.label,
13296
+ ...opt.iconUrl !== void 0 ? { iconUrl: opt.iconUrl } : {},
13297
+ ...opt.iconId !== void 0 ? { iconId: opt.iconId } : {},
13298
+ ...!isDisabled ? { onRemove: () => removeChip(opt.value) } : {}
13299
+ }, opt.value))
13300
+ }),
13301
+ searchable ? /* @__PURE__ */ jsxs("div", {
13302
+ ref: (el) => {
13303
+ triggerRef.current = el;
13304
+ },
13305
+ className: INPUT_SHELL + (isDisabled ? " opacity-50" : ""),
13306
+ children: [
13307
+ /* @__PURE__ */ jsx(Search, { className: "h-3.5 w-3.5 shrink-0 text-foreground-subtle" }),
13308
+ /* @__PURE__ */ jsx("input", {
13309
+ ref: inputRef,
13310
+ type: "text",
13311
+ role: "combobox",
13312
+ "aria-expanded": open,
13313
+ "aria-controls": listboxId,
13314
+ className: "min-w-0 flex-1 bg-transparent text-xs text-foreground outline-none placeholder:text-foreground-disabled",
13315
+ value: query,
13316
+ placeholder: triggerPlaceholder,
13317
+ disabled: isDisabled,
13318
+ onChange: (e) => {
13319
+ setQuery(e.target.value);
13320
+ setOpen(true);
13321
+ setHighlight(0);
13322
+ },
13323
+ onFocus: () => setOpen(true),
13324
+ onBlur: () => {
13325
+ blurTimer.current = setTimeout(() => {
13326
+ const active = document.activeElement;
13327
+ if (listboxRef.current?.contains(active)) return;
13328
+ setOpen(false);
13329
+ }, 120);
13330
+ },
13331
+ onKeyDown: handleKeyDown
13332
+ }),
13333
+ /* @__PURE__ */ jsx(ChevronDown, {
13334
+ className: "h-3.5 w-3.5 shrink-0 cursor-pointer text-foreground-subtle",
13335
+ onMouseDown: (e) => {
13336
+ e.preventDefault();
13337
+ if (blurTimer.current) clearTimeout(blurTimer.current);
13338
+ setOpen((o) => !o);
13339
+ inputRef.current?.focus();
13340
+ }
13341
+ })
13342
+ ]
13343
+ }) : /* @__PURE__ */ jsxs("button", {
13344
+ ref: (el) => {
13345
+ triggerRef.current = el;
13346
+ },
13347
+ type: "button",
13348
+ role: "combobox",
13349
+ "aria-expanded": open,
13350
+ "aria-controls": listboxId,
13351
+ disabled: isDisabled,
13352
+ className: [
13353
+ INPUT_SHELL,
13354
+ "w-full justify-between text-xs text-foreground",
13355
+ isDisabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer"
13356
+ ].join(" "),
13357
+ onClick: () => !isDisabled && setOpen((o) => !o),
13358
+ onKeyDown: handleNonSearchKeyDown,
13359
+ children: [/* @__PURE__ */ jsx("span", {
13360
+ className: "truncate text-foreground-subtle",
13361
+ children: selectedOptions[0]?.label ?? triggerPlaceholder
13362
+ }), /* @__PURE__ */ jsx(ChevronDown, { className: "h-3.5 w-3.5 shrink-0 text-foreground-subtle" })]
13363
+ }),
13364
+ open && !isDisabled && coords !== null && typeof document !== "undefined" && createPortal(/* @__PURE__ */ jsxs("div", {
13365
+ ref: listboxRef,
13366
+ id: listboxId,
13367
+ role: "listbox",
13368
+ style: {
13369
+ position: "fixed",
13370
+ top: coords.top,
13371
+ left: coords.left,
13372
+ width: coords.width,
13373
+ maxHeight: coords.maxHeight,
13374
+ zIndex: 9999
13375
+ },
13376
+ className: "overflow-y-auto rounded-md border border-border bg-surface shadow-lg",
13377
+ onMouseDown: (e) => {
13378
+ e.preventDefault();
13379
+ if (blurTimer.current) clearTimeout(blurTimer.current);
13380
+ },
13381
+ children: [dropdownBody, showAddNewFooter && /* @__PURE__ */ jsxs("button", {
13382
+ type: "button",
13383
+ className: [
13384
+ "flex w-full items-center gap-2 border-t border-border px-2.5 py-1.5 text-left text-xs transition-colors",
13385
+ footerAddNewIndex === highlight ? "bg-primary/10" : "hover:bg-surface-hover",
13386
+ "cursor-pointer text-primary"
13387
+ ].join(" "),
13388
+ onMouseEnter: () => setHighlight(footerAddNewIndex),
13389
+ onClick: () => {
13390
+ const draft = draftFromQuery(query);
13391
+ if (draft !== null) {
13392
+ onCreateRequest?.(draft);
13393
+ setQuery("");
13394
+ setOpen(false);
13395
+ return;
13396
+ }
13397
+ inputRef.current?.focus();
13398
+ },
13399
+ children: [/* @__PURE__ */ jsx(Plus, { className: "h-3.5 w-3.5 shrink-0" }), createLabel]
13400
+ })]
13401
+ }), document.body),
13402
+ description !== void 0 && description.length > 0 && /* @__PURE__ */ jsx("p", {
12685
13403
  className: DESC_CLASS$1,
12686
13404
  children: description
12687
13405
  })
@@ -12689,6 +13407,242 @@ function DeviceMultiSelectField({ field, value, onChange, disabled, translationF
12689
13407
  });
12690
13408
  }
12691
13409
  //#endregion
13410
+ //#region src/composites/notification-targets-options.ts
13411
+ function kindIconKey(addonId, kind) {
13412
+ return `${addonId}:${kind}`;
13413
+ }
13414
+ function targetsToOptions(targets, kindIconUrls, noteIds, noteLabel) {
13415
+ return targets.map((target) => {
13416
+ const iconUrl = target.addonId !== void 0 && target.kind !== void 0 ? kindIconUrls.get(kindIconKey(target.addonId, target.kind)) : void 0;
13417
+ let badge;
13418
+ if (noteIds?.has(target.id) === true) badge = noteLabel;
13419
+ else if (!target.enabled) badge = "disabled";
13420
+ return {
13421
+ value: target.id,
13422
+ label: target.name,
13423
+ ...iconUrl !== void 0 ? { iconUrl } : {},
13424
+ ...badge !== void 0 ? { badge } : {}
13425
+ };
13426
+ });
13427
+ }
13428
+ function buildKindIconMap(rows) {
13429
+ const map = /* @__PURE__ */ new Map();
13430
+ if (!Array.isArray(rows)) return map;
13431
+ for (const row of rows) {
13432
+ if (row === null || typeof row !== "object") continue;
13433
+ const kind = Reflect.get(row, "kind");
13434
+ const addonId = Reflect.get(row, "addonId");
13435
+ const iconUrl = Reflect.get(row, "iconUrl");
13436
+ if (typeof kind !== "string" || typeof addonId !== "string") continue;
13437
+ if (typeof iconUrl === "string" && iconUrl.length > 0) map.set(kindIconKey(addonId, kind), iconUrl);
13438
+ }
13439
+ return map;
13440
+ }
13441
+ function toTargetOptions(rows) {
13442
+ if (!Array.isArray(rows)) return [];
13443
+ const out = [];
13444
+ for (const row of rows) {
13445
+ if (row === null || typeof row !== "object") continue;
13446
+ const id = Reflect.get(row, "id");
13447
+ const name = Reflect.get(row, "name");
13448
+ const enabled = Reflect.get(row, "enabled");
13449
+ const kind = Reflect.get(row, "kind");
13450
+ const addonId = Reflect.get(row, "addonId");
13451
+ if (typeof id !== "string" || typeof name !== "string") continue;
13452
+ if (typeof kind !== "string" || typeof addonId !== "string") continue;
13453
+ out.push({
13454
+ id,
13455
+ name,
13456
+ enabled: enabled === true,
13457
+ kind,
13458
+ addonId
13459
+ });
13460
+ }
13461
+ return out;
13462
+ }
13463
+ //#endregion
13464
+ //#region src/composites/notification-targets-field.tsx
13465
+ /**
13466
+ * Shared notification-output target pickers.
13467
+ *
13468
+ * The Notification Center editors (Summaries, Timelapses, Rules, Calendar
13469
+ * events) and ConfigUISchema forms (script settings, addon settings) all
13470
+ * pick the same catalog — `notificationOutput.listTargets`. One presentational
13471
+ * control plus two ConfigUISchema wrappers so a script can declare
13472
+ * `notification-target-select` / `notification-target-multiselect` without
13473
+ * inventing a parallel picker.
13474
+ *
13475
+ * A DISABLED target is offered and marked, never hidden: it is a legitimate
13476
+ * choice (the operator re-enables it later), and hiding it would make a rule
13477
+ * whose only target is off look like a rule with no target at all.
13478
+ *
13479
+ * Single and multi both render through `OptionSelect` (dropdown + pills,
13480
+ * searchable, kind brand icons via `iconUrl`).
13481
+ */
13482
+ var DEFAULT_EMPTY = "No delivery target is configured. Add one on the Targets tab first — without one the notification is rendered and thrown away.";
13483
+ /**
13484
+ * Multi-select of delivery targets (NC Summaries / Timelapses / Rules shape).
13485
+ */
13486
+ function NotificationTargetsField({ targets, value, onChange, disabled = false, maxItems, testIdPrefix = "notification-target", emptyMessage = DEFAULT_EMPTY, noteIds, noteLabel = "note", label, description, kindIconUrls: kindIconUrlsProp }) {
13487
+ const kindsQuery = useNotificationOutputListTargetKinds({});
13488
+ const kindIconUrlsFromQuery = useMemo(() => buildKindIconMap(kindsQuery.data), [kindsQuery.data]);
13489
+ const kindIconUrls = kindIconUrlsProp ?? kindIconUrlsFromQuery;
13490
+ return /* @__PURE__ */ jsx(OptionSelect, {
13491
+ mode: "multi",
13492
+ options: useMemo(() => targetsToOptions(targets, kindIconUrls, noteIds, noteLabel), [
13493
+ targets,
13494
+ kindIconUrls,
13495
+ noteIds,
13496
+ noteLabel
13497
+ ]),
13498
+ value,
13499
+ onChange,
13500
+ disabled,
13501
+ searchable: true,
13502
+ creatable: false,
13503
+ ...maxItems !== void 0 ? { maxItems } : {},
13504
+ emptyMessage,
13505
+ placeholder: "Search targets…",
13506
+ label,
13507
+ description,
13508
+ testId: `${testIdPrefix}s`,
13509
+ optionTestIdPrefix: testIdPrefix,
13510
+ listboxId: `${testIdPrefix}-listbox`
13511
+ });
13512
+ }
13513
+ /**
13514
+ * Single-select of one delivery target (Calendar events / script settings).
13515
+ */
13516
+ function NotificationTargetSelectField({ targets, value, onChange, disabled = false, emptyMessage = DEFAULT_EMPTY, placeholder = "Select…", testId = "notification-target-select", label, description, kindIconUrls: kindIconUrlsProp }) {
13517
+ const kindsQuery = useNotificationOutputListTargetKinds({});
13518
+ const kindIconUrlsFromQuery = useMemo(() => buildKindIconMap(kindsQuery.data), [kindsQuery.data]);
13519
+ const kindIconUrls = kindIconUrlsProp ?? kindIconUrlsFromQuery;
13520
+ return /* @__PURE__ */ jsx(OptionSelect, {
13521
+ mode: "single",
13522
+ options: useMemo(() => targetsToOptions(targets, kindIconUrls, void 0, "note"), [targets, kindIconUrls]),
13523
+ value,
13524
+ onChange,
13525
+ disabled,
13526
+ searchable: true,
13527
+ creatable: false,
13528
+ emptyMessage,
13529
+ placeholder,
13530
+ label,
13531
+ description,
13532
+ testId,
13533
+ optionTestIdPrefix: testId,
13534
+ listboxId: `${testId}-listbox`
13535
+ });
13536
+ }
13537
+ function FieldShell({ label, description, required, translationFn, children }) {
13538
+ return /* @__PURE__ */ jsxs("div", {
13539
+ className: "space-y-1",
13540
+ children: [
13541
+ /* @__PURE__ */ jsxs("label", {
13542
+ className: "block text-[11px] font-medium text-foreground mb-1 break-words",
13543
+ children: [resolveLabel(label, translationFn), required === true ? /* @__PURE__ */ jsx("span", {
13544
+ className: "text-danger",
13545
+ children: " *"
13546
+ }) : null]
13547
+ }),
13548
+ children,
13549
+ description !== void 0 && /* @__PURE__ */ jsx("p", {
13550
+ className: "text-[10px] text-foreground-subtle mt-0.5 break-words",
13551
+ children: resolveLabel(description, translationFn)
13552
+ })
13553
+ ]
13554
+ });
13555
+ }
13556
+ /**
13557
+ * ConfigUISchema `notification-target-multiselect` — fetches listTargets and
13558
+ * stores a `string[]` of target ids.
13559
+ */
13560
+ function ConfigNotificationTargetMultiSelectFieldView({ field, value, onChange, disabled, translationFn }) {
13561
+ const targetsQuery = useNotificationOutputListTargets({});
13562
+ const kindsQuery = useNotificationOutputListTargetKinds({});
13563
+ const targets = useMemo(() => toTargetOptions(targetsQuery.data), [targetsQuery.data]);
13564
+ const kindIconUrls = useMemo(() => buildKindIconMap(kindsQuery.data), [kindsQuery.data]);
13565
+ const selected = Array.isArray(value) ? value.filter((v) => typeof v === "string") : typeof value === "string" && value.length > 0 ? [value] : [];
13566
+ const pending = targetsQuery.isPending || kindsQuery.isPending;
13567
+ const error = targetsQuery.isError ? targetsQuery.error : kindsQuery.isError ? kindsQuery.error : null;
13568
+ if (pending) return /* @__PURE__ */ jsx(FieldShell, {
13569
+ label: field.label,
13570
+ description: field.description,
13571
+ required: field.required,
13572
+ translationFn,
13573
+ children: /* @__PURE__ */ jsx("p", {
13574
+ className: "text-[11px] text-foreground-subtle",
13575
+ children: "Loading targets…"
13576
+ })
13577
+ });
13578
+ if (error !== null) return /* @__PURE__ */ jsx(FieldShell, {
13579
+ label: field.label,
13580
+ description: field.description,
13581
+ required: field.required,
13582
+ translationFn,
13583
+ children: /* @__PURE__ */ jsxs("p", {
13584
+ className: "text-[11px] text-danger",
13585
+ children: ["Could not load targets: ", error instanceof Error ? error.message : String(error)]
13586
+ })
13587
+ });
13588
+ return /* @__PURE__ */ jsx(NotificationTargetsField, {
13589
+ targets,
13590
+ value: selected,
13591
+ onChange: (next) => onChange(next),
13592
+ disabled: disabled === true || field.disabled === true,
13593
+ ...field.maxItems !== void 0 ? { maxItems: field.maxItems } : {},
13594
+ kindIconUrls,
13595
+ label: resolveLabel(field.label, translationFn),
13596
+ description: field.description !== void 0 ? resolveLabel(field.description, translationFn) : void 0,
13597
+ emptyMessage: "No delivery target is configured. Add one under Notification Center → Targets first.",
13598
+ testIdPrefix: `config-target-${field.key}`
13599
+ });
13600
+ }
13601
+ /**
13602
+ * ConfigUISchema `notification-target-select` — fetches listTargets and stores
13603
+ * one target id string.
13604
+ */
13605
+ function ConfigNotificationTargetSelectFieldView({ field, value, onChange, disabled, translationFn }) {
13606
+ const targetsQuery = useNotificationOutputListTargets({});
13607
+ const kindsQuery = useNotificationOutputListTargetKinds({});
13608
+ const targets = useMemo(() => toTargetOptions(targetsQuery.data), [targetsQuery.data]);
13609
+ const kindIconUrls = useMemo(() => buildKindIconMap(kindsQuery.data), [kindsQuery.data]);
13610
+ const current = typeof value === "string" ? value : "";
13611
+ const pending = targetsQuery.isPending || kindsQuery.isPending;
13612
+ const error = targetsQuery.isError ? targetsQuery.error : kindsQuery.isError ? kindsQuery.error : null;
13613
+ if (pending) return /* @__PURE__ */ jsx(FieldShell, {
13614
+ label: field.label,
13615
+ description: field.description,
13616
+ required: field.required,
13617
+ translationFn,
13618
+ children: /* @__PURE__ */ jsx("p", {
13619
+ className: "text-[11px] text-foreground-subtle",
13620
+ children: "Loading targets…"
13621
+ })
13622
+ });
13623
+ if (error !== null) return /* @__PURE__ */ jsx(FieldShell, {
13624
+ label: field.label,
13625
+ description: field.description,
13626
+ required: field.required,
13627
+ translationFn,
13628
+ children: /* @__PURE__ */ jsxs("p", {
13629
+ className: "text-[11px] text-danger",
13630
+ children: ["Could not load targets: ", error instanceof Error ? error.message : String(error)]
13631
+ })
13632
+ });
13633
+ return /* @__PURE__ */ jsx(NotificationTargetSelectField, {
13634
+ targets,
13635
+ value: current,
13636
+ onChange: (next) => onChange(next),
13637
+ disabled: disabled === true || field.disabled === true,
13638
+ kindIconUrls,
13639
+ label: resolveLabel(field.label, translationFn),
13640
+ description: field.description !== void 0 ? resolveLabel(field.description, translationFn) : void 0,
13641
+ emptyMessage: "No delivery target is configured. Add one under Notification Center → Targets first.",
13642
+ testId: `config-target-${field.key}`
13643
+ });
13644
+ }
13645
+ //#endregion
12692
13646
  //#region src/contexts/custom-field-renderers.tsx
12693
13647
  /**
12694
13648
  * Custom field renderer registry.
@@ -12742,115 +13696,6 @@ function useCustomFieldRenderer(type) {
12742
13696
  return useContext(CustomFieldRenderersContext)[type] ?? null;
12743
13697
  }
12744
13698
  //#endregion
12745
- //#region src/composites/event-kind-visuals.tsx
12746
- /**
12747
- * Event-kind VISUALS — the UI-side half of the unified taxonomy dictionary
12748
- * (`@camstack/types` `EVENT_TAXONOMY` owns the serializable data:
12749
- * color / iconId / labelKey; this owns `iconId → lucide component` and
12750
- * `labelKey → t()`).
12751
- *
12752
- * Every UI that renders an event kind (timeline, events tree, chips,
12753
- * detection canvas/tree) resolves its glyph + translated label here — no
12754
- * per-component hardcoded icon or label.
12755
- */
12756
- /**
12757
- * `iconId` → lucide component. Built ONLY from statically-imported icons
12758
- * (bundle-safe). Unknown ids resolve to the neutral `Tag` fallback.
12759
- */
12760
- var EVENT_KIND_ICONS = {
12761
- motion: Activity,
12762
- audio: Volume2,
12763
- person: User,
12764
- vehicle: Car,
12765
- animal: PawPrint,
12766
- package: Package,
12767
- sensor: Radio,
12768
- control: SlidersHorizontal,
12769
- car: Car,
12770
- truck: Truck,
12771
- bus: Bus,
12772
- motorcycle: Bike,
12773
- bicycle: Bike,
12774
- airplane: Plane,
12775
- boat: Sailboat,
12776
- train: TrainFront,
12777
- bird: Bird,
12778
- cat: Cat,
12779
- dog: Dog,
12780
- horse: PawPrint,
12781
- sheep: PawPrint,
12782
- cow: PawPrint,
12783
- elephant: PawPrint,
12784
- bear: PawPrint,
12785
- zebra: PawPrint,
12786
- giraffe: PawPrint,
12787
- door: DoorOpen,
12788
- pir: Radar,
12789
- smoke: Flame,
12790
- water: Droplet,
12791
- gas: Wind,
12792
- vibration: Vibrate,
12793
- tamper: ShieldAlert,
12794
- presence: UserCheck,
12795
- generic: Tag,
12796
- lock: Lock,
12797
- siren: Siren,
12798
- switch: ToggleRight,
12799
- doorbell: BellRing,
12800
- button: CircleDot,
12801
- "audio-speech": MessageSquare,
12802
- "audio-scream": Megaphone,
12803
- "audio-crying": Baby,
12804
- "audio-laughter": Laugh,
12805
- "audio-music": Music,
12806
- "audio-dog": Dog,
12807
- "audio-cat": Cat,
12808
- "audio-bird": Bird,
12809
- "audio-animal": PawPrint,
12810
- "audio-alarm": BellRing,
12811
- "audio-doorbell": BellRing,
12812
- "audio-glass_breaking": TriangleAlert,
12813
- "audio-gunshot": Crosshair,
12814
- "audio-vehicle": Car,
12815
- "audio-siren": Siren,
12816
- "audio-fire": Flame,
12817
- "audio-water": Droplets,
12818
- "audio-wind": Wind,
12819
- "audio-door": DoorOpen,
12820
- "audio-footsteps": Footprints,
12821
- "audio-crowd": Users,
12822
- "audio-telephone": Phone,
12823
- "audio-engine": Cog,
12824
- "audio-tools": Hammer,
12825
- "audio-silence": VolumeX
12826
- };
12827
- /** Resolve an `iconId` to a lucide component (falls back to `Tag`). */
12828
- function resolveEventKindIcon(iconId) {
12829
- if (Object.hasOwn(EVENT_KIND_ICONS, iconId)) return EVENT_KIND_ICONS[iconId];
12830
- if (iconId.startsWith("audio-")) return Volume2;
12831
- return Tag;
12832
- }
12833
- /**
12834
- * Translated label for an event kind — `t(labelKey)` when a translation
12835
- * exists, else the English `label` fallback. Robust to a missing key: an
12836
- * i18n backend that echoes the key unchanged (react-i18next default) is
12837
- * treated as "no translation" and the fallback label is returned, so the UI
12838
- * never renders a raw `eventKind.*` key.
12839
- */
12840
- function eventKindLabel(descriptor, t) {
12841
- if (t === void 0) return descriptor.label;
12842
- const translated = t(descriptor.labelKey);
12843
- return translated === descriptor.labelKey || translated.length === 0 ? descriptor.label : translated;
12844
- }
12845
- /** Small convenience component: renders the lucide glyph for an `iconId`. */
12846
- function EventKindGlyph({ iconId, size = 16, color, className }) {
12847
- return createElement(resolveEventKindIcon(iconId), {
12848
- size,
12849
- color,
12850
- className
12851
- });
12852
- }
12853
- //#endregion
12854
13699
  //#region src/composites/confirm-dialog.tsx
12855
13700
  /**
12856
13701
  * The ONE modal dialog of the product — confirm, alert and prompt.
@@ -19098,59 +19943,6 @@ function useCapabilityPresence(capabilityName) {
19098
19943
  return classifyCapability(query.data);
19099
19944
  }
19100
19945
  //#endregion
19101
- //#region ../../node_modules/class-variance-authority/dist/index.mjs
19102
- /**
19103
- * Copyright 2022 Joe Bell. All rights reserved.
19104
- *
19105
- * This file is licensed to you under the Apache License, Version 2.0
19106
- * (the "License"); you may not use this file except in compliance with the
19107
- * License. You may obtain a copy of the License at
19108
- *
19109
- * http://www.apache.org/licenses/LICENSE-2.0
19110
- *
19111
- * Unless required by applicable law or agreed to in writing, software
19112
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
19113
- * WARRANTIES OR REPRESENTATIONS OF ANY KIND, either express or implied. See the
19114
- * License for the specific language governing permissions and limitations under
19115
- * the License.
19116
- */ var falsyToString = (value) => typeof value === "boolean" ? `${value}` : value === 0 ? "0" : value;
19117
- var cx = clsx;
19118
- var cva = (base, config) => (props) => {
19119
- var _config_compoundVariants;
19120
- if ((config === null || config === void 0 ? void 0 : config.variants) == null) return cx(base, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);
19121
- const { variants, defaultVariants } = config;
19122
- const getVariantClassNames = Object.keys(variants).map((variant) => {
19123
- const variantProp = props === null || props === void 0 ? void 0 : props[variant];
19124
- const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant];
19125
- if (variantProp === null) return null;
19126
- const variantKey = falsyToString(variantProp) || falsyToString(defaultVariantProp);
19127
- return variants[variant][variantKey];
19128
- });
19129
- const propsWithoutUndefined = props && Object.entries(props).reduce((acc, param) => {
19130
- let [key, value] = param;
19131
- if (value === void 0) return acc;
19132
- acc[key] = value;
19133
- return acc;
19134
- }, {});
19135
- return cx(base, getVariantClassNames, config === null || config === void 0 ? void 0 : (_config_compoundVariants = config.compoundVariants) === null || _config_compoundVariants === void 0 ? void 0 : _config_compoundVariants.reduce((acc, param) => {
19136
- let { class: cvClass, className: cvClassName, ...compoundVariantOptions } = param;
19137
- return Object.entries(compoundVariantOptions).every((param) => {
19138
- let [key, value] = param;
19139
- return Array.isArray(value) ? value.includes({
19140
- ...defaultVariants,
19141
- ...propsWithoutUndefined
19142
- }[key]) : {
19143
- ...defaultVariants,
19144
- ...propsWithoutUndefined
19145
- }[key] === value;
19146
- }) ? [
19147
- ...acc,
19148
- cvClass,
19149
- cvClassName
19150
- ] : acc;
19151
- }, []), props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);
19152
- };
19153
- //#endregion
19154
19946
  //#region src/primitives/button.tsx
19155
19947
  var buttonVariants = cva("inline-flex items-center justify-center rounded-md font-medium transition-colors cursor-pointer disabled:opacity-50 disabled:pointer-events-none", {
19156
19948
  variants: {
@@ -20013,38 +20805,6 @@ function ClipPanel({ deviceId, clip, profile, onProfileChange }) {
20013
20805
  });
20014
20806
  }
20015
20807
  //#endregion
20016
- //#region src/primitives/badge.tsx
20017
- var badgeVariants = cva("inline-flex items-center rounded-full text-xs font-medium px-2 py-0.5", {
20018
- variants: {
20019
- variant: {
20020
- default: "bg-surface-hover text-foreground",
20021
- success: "bg-success/15 text-success",
20022
- warning: "bg-warning/15 text-warning",
20023
- danger: "bg-danger/15 text-danger",
20024
- info: "bg-info/15 text-info"
20025
- },
20026
- styleVariant: {
20027
- solid: "",
20028
- outline: "border bg-transparent"
20029
- }
20030
- },
20031
- defaultVariants: {
20032
- variant: "default",
20033
- styleVariant: "solid"
20034
- }
20035
- });
20036
- var Badge = forwardRef(({ className, variant, style, ...props }, ref) => {
20037
- return /* @__PURE__ */ jsx("span", {
20038
- ref,
20039
- className: cn(badgeVariants({
20040
- variant,
20041
- styleVariant: style
20042
- }), className),
20043
- ...props
20044
- });
20045
- });
20046
- Badge.displayName = "Badge";
20047
- //#endregion
20048
20808
  //#region src/lib/format-duration.ts
20049
20809
  /**
20050
20810
  * How long something lasted, the way this product says it.
@@ -26075,6 +26835,7 @@ function MultiSelectField({ field, value, onChange, disabled, translationFn }) {
26075
26835
  function PasswordField({ field, value, onChange, disabled, translationFn }) {
26076
26836
  const [show, setShow] = useState(false);
26077
26837
  const showToggle = field.showToggle !== false;
26838
+ const text = value === void 0 || value === null ? "" : String(value);
26078
26839
  return /* @__PURE__ */ jsx(FieldWrapper, {
26079
26840
  label: field.label,
26080
26841
  description: field.description,
@@ -26086,14 +26847,20 @@ function PasswordField({ field, value, onChange, disabled, translationFn }) {
26086
26847
  children: [/* @__PURE__ */ jsx("input", {
26087
26848
  type: show ? "text" : "password",
26088
26849
  className: INPUT_CLASS + (showToggle ? " pr-9" : ""),
26089
- value: value === void 0 || value === null ? "" : String(value),
26850
+ value: text,
26090
26851
  placeholder: field.placeholder,
26091
26852
  disabled: disabled || field.disabled,
26092
- onChange: (e) => onChange(e.target.value)
26853
+ autoComplete: "new-password",
26854
+ spellCheck: false,
26855
+ onChange: (e) => onChange(e.target.value),
26856
+ onFocus: (e) => {
26857
+ if (text.length > 0 && /^[•●*]{4,}$/u.test(text)) e.currentTarget.select();
26858
+ }
26093
26859
  }), showToggle && /* @__PURE__ */ jsx("button", {
26094
26860
  type: "button",
26095
26861
  className: "absolute right-2 top-1/2 -translate-y-1/2 text-foreground-subtle hover:text-foreground",
26096
26862
  tabIndex: -1,
26863
+ "aria-label": show ? "Hide password" : "Show password",
26097
26864
  onClick: () => setShow((s) => !s),
26098
26865
  children: show ? /* @__PURE__ */ jsx(EyeOff, { className: "h-3.5 w-3.5" }) : /* @__PURE__ */ jsx(Eye, { className: "h-3.5 w-3.5" })
26099
26866
  })]
@@ -26239,70 +27006,30 @@ function SliderField({ field, value, onChange, disabled, translationFn }) {
26239
27006
  });
26240
27007
  }
26241
27008
  function TagsField({ field, value, onChange, disabled, translationFn }) {
26242
- const tags = Array.isArray(value) ? value : [];
26243
- const [input, setInput] = useState("");
26244
- const inputRef = useRef(null);
26245
- const addTag = useCallback((tag) => {
26246
- const trimmed = tag.trim();
26247
- if (!trimmed || tags.includes(trimmed)) return;
26248
- if (field.maxTags !== void 0 && tags.length >= field.maxTags) return;
26249
- onChange([...tags, trimmed]);
26250
- setInput("");
26251
- }, [
26252
- tags,
26253
- field.maxTags,
26254
- onChange
26255
- ]);
26256
- const removeTag = (tag) => onChange(tags.filter((t) => t !== tag));
26257
- const handleKeyDown = (e) => {
26258
- if (e.key === "Enter" || e.key === ",") {
26259
- e.preventDefault();
26260
- addTag(input);
26261
- } else if (e.key === "Backspace" && input === "" && tags.length > 0) removeTag(tags[tags.length - 1]);
26262
- };
26263
- const isDisabled = disabled || field.disabled;
27009
+ const tags = Array.isArray(value) ? value.filter((v) => typeof v === "string") : [];
27010
+ const creatable = field.creatable !== false;
27011
+ const options = (field.suggestions ?? []).map((s) => ({
27012
+ value: s,
27013
+ label: s
27014
+ }));
27015
+ const isDisabled = disabled === true || field.disabled === true;
26264
27016
  return /* @__PURE__ */ jsx(FieldWrapper, {
26265
27017
  label: field.label,
26266
27018
  description: field.description,
26267
27019
  required: field.required,
26268
27020
  span: field.span,
26269
27021
  translationFn,
26270
- children: /* @__PURE__ */ jsxs("div", {
26271
- className: [
26272
- "flex flex-wrap gap-1.5 rounded-md border border-border bg-background px-2 py-1.5 min-h-[38px] cursor-text",
26273
- "focus-within:border-primary focus-within:ring-1 focus-within:ring-primary/30",
26274
- isDisabled ? "opacity-50 cursor-not-allowed" : ""
26275
- ].join(" "),
26276
- onClick: () => !isDisabled && inputRef.current?.focus(),
26277
- children: [
26278
- tags.map((tag) => /* @__PURE__ */ jsxs("span", {
26279
- className: "inline-flex items-center gap-1 rounded-md bg-primary/10 px-1.5 py-0.5 text-xs text-primary",
26280
- children: [tag, !isDisabled && /* @__PURE__ */ jsx("button", {
26281
- type: "button",
26282
- onClick: () => removeTag(tag),
26283
- className: "hover:text-danger",
26284
- children: /* @__PURE__ */ jsx(X, { className: "h-2.5 w-2.5" })
26285
- })]
26286
- }, tag)),
26287
- /* @__PURE__ */ jsx("input", {
26288
- ref: inputRef,
26289
- type: "text",
26290
- className: "flex-1 min-w-[80px] bg-transparent text-sm text-foreground outline-none placeholder:text-foreground-disabled",
26291
- value: input,
26292
- placeholder: tags.length === 0 ? field.placeholder ?? "Add tags…" : "",
26293
- disabled: isDisabled,
26294
- list: `tags-suggestions-${field.key}`,
26295
- onChange: (e) => setInput(e.target.value),
26296
- onKeyDown: handleKeyDown,
26297
- onBlur: () => {
26298
- if (input.trim()) addTag(input);
26299
- }
26300
- }),
26301
- field.suggestions && /* @__PURE__ */ jsx("datalist", {
26302
- id: `tags-suggestions-${field.key}`,
26303
- children: field.suggestions.map((s) => /* @__PURE__ */ jsx("option", { value: s }, s))
26304
- })
26305
- ]
27022
+ children: /* @__PURE__ */ jsx(OptionSelect, {
27023
+ mode: "multi",
27024
+ options,
27025
+ value: tags,
27026
+ onChange: (next) => onChange(next),
27027
+ disabled: isDisabled,
27028
+ creatable,
27029
+ ...field.createLabel !== void 0 ? { createLabel: field.createLabel } : {},
27030
+ ...field.maxTags !== void 0 ? { maxItems: field.maxTags } : {},
27031
+ placeholder: field.placeholder ?? "Search or add…",
27032
+ testId: `config-tags-${field.key}`
26306
27033
  })
26307
27034
  });
26308
27035
  }
@@ -27534,6 +28261,20 @@ function FormField({ field, values, onChange, disabled, translationFn, onTestFie
27534
28261
  disabled,
27535
28262
  translationFn
27536
28263
  });
28264
+ case "notification-target-select": return /* @__PURE__ */ jsx(ConfigNotificationTargetSelectFieldView, {
28265
+ field,
28266
+ value,
28267
+ onChange: handleChange,
28268
+ disabled,
28269
+ translationFn
28270
+ });
28271
+ case "notification-target-multiselect": return /* @__PURE__ */ jsx(ConfigNotificationTargetMultiSelectFieldView, {
28272
+ field,
28273
+ value,
28274
+ onChange: handleChange,
28275
+ disabled,
28276
+ translationFn
28277
+ });
27537
28278
  case "probe": return /* @__PURE__ */ jsx(ProbeField, {
27538
28279
  field,
27539
28280
  value,
@@ -29066,9 +29807,6 @@ var DialogContent = forwardRef(({ className, width, placement, scroll, children,
29066
29807
  if (open && !el.open) el.showModal();
29067
29808
  if (!open && el.open) el.close();
29068
29809
  }, [open, dialogRef]);
29069
- const handleClick = (e) => {
29070
- if (e.target === e.currentTarget) setOpen(false);
29071
- };
29072
29810
  return /* @__PURE__ */ jsx("dialog", {
29073
29811
  ref: dialogRef,
29074
29812
  id: contentId,
@@ -29077,7 +29815,6 @@ var DialogContent = forwardRef(({ className, width, placement, scroll, children,
29077
29815
  placement,
29078
29816
  scroll
29079
29817
  }), className),
29080
- onClick: handleClick,
29081
29818
  onClose: () => setOpen(false),
29082
29819
  ...props,
29083
29820
  children
@@ -39274,7 +40011,7 @@ function ControlWidget({ slice, busy, setValueFn, layout }) {
39274
40011
  value: e.target.value
39275
40012
  } });
39276
40013
  },
39277
- className: cn("w-full max-w-full min-w-0 truncate rounded border border-border bg-surface px-1 py-0.5 text-xs", busy && "opacity-40 cursor-not-allowed"),
40014
+ className: cn("w-full max-w-full min-w-0 truncate rounded bg-transparent px-0.5 py-0.5 text-xs", busy && "opacity-40 cursor-not-allowed"),
39278
40015
  children: slice.options.map((opt) => /* @__PURE__ */ jsx("option", {
39279
40016
  value: opt,
39280
40017
  children: opt
@@ -40353,12 +41090,13 @@ function BatteryBar({ percent }) {
40353
41090
  });
40354
41091
  }
40355
41092
  function SensorHeroInner({ trpc, device }) {
40356
- const roleDescriptor = device.role != null ? ROLE_DESCRIPTOR[device.role] : void 0;
41093
+ const roleDescriptor = device.role != null ? ROLE_DESCRIPTOR[device.role] : ROLE_DESCRIPTOR["temperature-sensor"];
40357
41094
  const isBattery = isBatterySensorRole(device.role);
40358
41095
  const { data: roleDefaultsData } = useDeviceManagerGetRoleDisplayDefaults({}, { staleTime: 6e4 });
40359
41096
  const dev = useDeviceProxy(trpc, device.id);
40360
41097
  const numericSlice = useDeviceStateSlice(dev !== null && roleDescriptor !== void 0 ? roleDescriptor.getSliceHandle(dev.state) : void 0);
40361
41098
  const binaryBatterySlice = useDeviceStateSlice(dev !== null && isBattery ? dev.state.binary : void 0);
41099
+ const occupancySlice = useDeviceStateSlice(dev !== null && !isBattery ? dev.state.binary : void 0);
40362
41100
  const useBinaryBattery = isBattery && roleDescriptor?.kind === "numeric" && !hasBatteryNumericValue(numericSlice, roleDescriptor.field) && binaryBatterySlice !== void 0;
40363
41101
  const descriptor = useBinaryBattery ? BINARY_BATTERY_DESCRIPTOR : roleDescriptor;
40364
41102
  const slice = useBinaryBattery ? binaryBatterySlice : numericSlice;
@@ -40382,12 +41120,14 @@ function SensorHeroInner({ trpc, device }) {
40382
41120
  const resolved = resolveSensorDisplay({
40383
41121
  display: device.display,
40384
41122
  capName: device.role === "numeric-sensor" ? "numeric-sensor" : void 0,
40385
- roleDefault: device.role != null ? roleDefaultsData?.defaults[device.role] : void 0,
41123
+ roleDefault: device.role != null ? roleDefaultsData?.defaults[device.role] : roleDefaultsData?.defaults["temperature-sensor"],
40386
41124
  sliceUnit: liveUnit,
40387
41125
  slicePrecision,
40388
41126
  canonicalUnit: descriptor.canonicalUnit
40389
41127
  });
40390
41128
  const unit = resolved.unit;
41129
+ const formatted = formatNumeric(resolved.toDisplayValue(rawValue), resolved.precision);
41130
+ const occupancyOn = occupancySlice !== void 0 && isBinarySliceValue(occupancySlice) && typeof occupancySlice["on"] === "boolean" ? Boolean(occupancySlice["on"]) : null;
40391
41131
  return /* @__PURE__ */ jsxs("div", {
40392
41132
  className: "flex flex-col items-center justify-center gap-2 rounded-lg border border-border bg-surface p-4",
40393
41133
  children: [
@@ -40395,13 +41135,18 @@ function SensorHeroInner({ trpc, device }) {
40395
41135
  className: "flex items-baseline gap-1",
40396
41136
  children: [/* @__PURE__ */ jsx("span", {
40397
41137
  className: "text-3xl font-semibold tabular-nums text-foreground",
40398
- children: formatNumeric(resolved.toDisplayValue(rawValue), resolved.precision)
41138
+ children: formatted
40399
41139
  }), unit && /* @__PURE__ */ jsx("span", {
40400
41140
  className: "text-base text-foreground-subtle",
40401
41141
  children: unit
40402
41142
  })]
40403
41143
  }),
40404
41144
  isBattery && /* @__PURE__ */ jsx(BatteryBar, { percent: rawValue }),
41145
+ occupancyOn !== null && /* @__PURE__ */ jsx("span", {
41146
+ className: cn("inline-flex items-center rounded px-2 py-0.5 text-xs font-medium", occupancyOn ? "bg-warning/15 text-warning" : "bg-surface-subtle text-foreground-subtle"),
41147
+ "data-testid": "sensor-hero-occupancy",
41148
+ children: occupancyOn ? "Occupied" : "Clear"
41149
+ }),
40405
41150
  /* @__PURE__ */ jsx("span", {
40406
41151
  className: "text-sm text-foreground-subtle",
40407
41152
  children: device.name
@@ -48231,11 +48976,11 @@ function useDeviceAdminLink(trpc, deviceId) {
48231
48976
  cap: (d) => d.deviceAdminLink,
48232
48977
  slice: () => void 0
48233
48978
  });
48234
- const bound = dev !== null && cap !== void 0 && cap !== null;
48979
+ const capBound = dev !== null && cap !== void 0 && cap !== null && (dev.binding?.entries.some((e) => e.capName === "device-admin-link") ?? true);
48235
48980
  const [state, setState] = useState({ kind: "pending" });
48236
48981
  useEffect(() => {
48237
- if (!bound || cap === void 0 || cap === null) {
48238
- setState({ kind: "pending" });
48982
+ if (!capBound || cap === void 0 || cap === null) {
48983
+ setState({ kind: "none" });
48239
48984
  return;
48240
48985
  }
48241
48986
  let live = true;
@@ -48256,7 +49001,7 @@ function useDeviceAdminLink(trpc, deviceId) {
48256
49001
  live = false;
48257
49002
  };
48258
49003
  }, [
48259
- bound,
49004
+ capBound,
48260
49005
  cap,
48261
49006
  deviceId
48262
49007
  ]);
@@ -49330,6 +50075,51 @@ function DeviceItemPreview({ trpc, device, status, enabled, showStatusPills = fa
49330
50075
  });
49331
50076
  }
49332
50077
  //#endregion
50078
+ //#region src/contexts/device-quick-detail.tsx
50079
+ /**
50080
+ * Optional host-provided "open quick detail for this device id" callback.
50081
+ *
50082
+ * The devices table (`DeviceItem` / `DeviceList`) draws a discreet quick-
50083
+ * detail glyph whenever a host has published a handler — admin-ui mounts
50084
+ * ONE provider at the app shell with the modal. Call sites never wire the
50085
+ * button themselves; absence of a provider means no glyph (unit tests,
50086
+ * embeds that do not host the modal).
50087
+ */
50088
+ var DeviceQuickDetailContext = createSharedContext("camstack:device-quick-detail", null);
50089
+ function DeviceQuickDetailProvider({ open, children }) {
50090
+ return /* @__PURE__ */ jsx(DeviceQuickDetailContext.Provider, {
50091
+ value: open,
50092
+ children
50093
+ });
50094
+ }
50095
+ /** The host's open callback, or null when no provider is mounted. */
50096
+ function useDeviceQuickDetailOpen() {
50097
+ return useContext(DeviceQuickDetailContext);
50098
+ }
50099
+ //#endregion
50100
+ //#region src/composites/device-item/quick-detail-action.tsx
50101
+ /**
50102
+ * Built-in row glyph for the host's quick-detail modal. Renders nothing
50103
+ * unless a `DeviceQuickDetailProvider` is mounted above — same "draw
50104
+ * nothing rather than something dead" rule as `AdminLinkQuickAction`.
50105
+ */
50106
+ function DeviceQuickDetailAction({ deviceId, className }) {
50107
+ const open = useDeviceQuickDetailOpen();
50108
+ if (open === null) return null;
50109
+ return /* @__PURE__ */ jsx("button", {
50110
+ type: "button",
50111
+ onClick: (e) => {
50112
+ e.stopPropagation();
50113
+ open(deviceId);
50114
+ },
50115
+ className: cn("inline-flex items-center justify-center rounded text-foreground-subtle hover:text-foreground transition-colors flex-shrink-0", className),
50116
+ title: "Quick detail",
50117
+ "aria-label": "Quick detail",
50118
+ "data-testid": "device-quick-detail",
50119
+ children: /* @__PURE__ */ jsx(Settings, { className: "h-3 w-3" })
50120
+ });
50121
+ }
50122
+ //#endregion
49333
50123
  //#region src/composites/device-item/status-dot.tsx
49334
50124
  /** The states that breathe (are "alive"). Offline + disabled are static. */
49335
50125
  function isAlive(status) {
@@ -49607,6 +50397,7 @@ function DeviceItem(props) {
49607
50397
  flags,
49608
50398
  controlPlacement: "right"
49609
50399
  }),
50400
+ /* @__PURE__ */ jsx(DeviceQuickDetailAction, { deviceId: device.id }),
49610
50401
  renderRowAction && /* @__PURE__ */ jsx("span", {
49611
50402
  onClick: (e) => e.stopPropagation(),
49612
50403
  children: renderRowAction(device)
@@ -49689,6 +50480,7 @@ function DeviceItem(props) {
49689
50480
  flags,
49690
50481
  controlPlacement: "right"
49691
50482
  }),
50483
+ /* @__PURE__ */ jsx(DeviceQuickDetailAction, { deviceId: device.id }),
49692
50484
  renderRowAction && /* @__PURE__ */ jsx("span", {
49693
50485
  onClick: (e) => e.stopPropagation(),
49694
50486
  children: renderRowAction(device)
@@ -49790,6 +50582,7 @@ function DeviceItemTableRow(props) {
49790
50582
  enabled: showSnapshot && isCamera,
49791
50583
  showStatusPills: true
49792
50584
  }),
50585
+ /* @__PURE__ */ jsx(DeviceQuickDetailAction, { deviceId: device.id }),
49793
50586
  renderRowAction && /* @__PURE__ */ jsx("span", {
49794
50587
  onClick: (e) => e.stopPropagation(),
49795
50588
  children: renderRowAction(device)
@@ -50887,10 +51680,10 @@ function useDeviceListRealtimeSync() {
50887
51680
  * `renderItem`.
50888
51681
  */
50889
51682
  function GenericModeList(props) {
50890
- const { items, getKey, getSearchText, renderItem, getFilterType, mapFilterOption, filterOptions, filterLabel = "Type", columns, renderExpanded, isExpanded, rowClassName, onRowClick, isLoading = false, searchPlaceholder = "Search", emptyLabel = "No items found.", pageSize = 100, toolbar } = props;
51683
+ const { items, getKey, getSearchText, renderItem, getFilterType, mapFilterOption, filterOptions, filterLabel = "Type", initialTypeFilters = [], columns, renderExpanded, isExpanded, rowClassName, onRowClick, isLoading = false, searchPlaceholder = "Search", emptyLabel = "No items found.", pageSize = 100, toolbar } = props;
50891
51684
  const [searchInput, setSearchInput] = useState("");
50892
51685
  const debouncedSearch = useDebouncedString(searchInput, 300);
50893
- const [typeFilters, setTypeFilters] = useState([]);
51686
+ const [typeFilters, setTypeFilters] = useState(() => [...initialTypeFilters]);
50894
51687
  const [page, setPage] = useState(1);
50895
51688
  useEffect(() => {
50896
51689
  setPage(1);
@@ -55756,39 +56549,6 @@ function VersionBadge({ version, preRelease, className }) {
55756
56549
  });
55757
56550
  }
55758
56551
  //#endregion
55759
- //#region src/composites/device-picker/SelectedChip.tsx
55760
- /**
55761
- * Removable selection chip + the search-box shell shared by DevicePicker and
55762
- * SearchableMultiSelectField (admin-ui). Lives here so addon MFEs can render
55763
- * the same picker without importing admin-ui.
55764
- */
55765
- /** The search box's shell — shared with multiselect fields that mirror this picker. */
55766
- 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";
55767
- /** One selected entry as a removable chip. */
55768
- function SelectedChip({ label, onRemove, warning = false, iconId, testId }) {
55769
- return /* @__PURE__ */ jsxs("span", {
55770
- "data-testid": testId,
55771
- 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",
55772
- children: [
55773
- iconId !== void 0 && /* @__PURE__ */ jsx(EventKindGlyph, {
55774
- iconId,
55775
- size: 12
55776
- }),
55777
- /* @__PURE__ */ jsx("span", {
55778
- className: "truncate",
55779
- children: label
55780
- }),
55781
- onRemove !== void 0 && /* @__PURE__ */ jsx("button", {
55782
- type: "button",
55783
- className: "shrink-0 hover:text-danger",
55784
- "aria-label": `Remove ${label}`,
55785
- onClick: onRemove,
55786
- children: /* @__PURE__ */ jsx(X, { className: "h-2.5 w-2.5" })
55787
- })
55788
- ]
55789
- });
55790
- }
55791
- //#endregion
55792
56552
  //#region src/composites/device-picker/device-picker-model.ts
55793
56553
  /** Numbers numerically, anything else by its text — the name tie-break. */
55794
56554
  function compareIds(a, b) {
@@ -58119,4 +58879,4 @@ var SceneMonitorEditor = lazy(() => import("./SceneMonitorEditor-vfWTm6qv.js").t
58119
58879
  /** Lazy-wrapped `PrivacyMaskSettings` — code-split off the main bundle. */
58120
58880
  var PrivacyMaskSettings = lazy(() => import("./PrivacyMaskSettings-DMkchqO1.js").then((m) => ({ default: m.PrivacyMaskSettings })));
58121
58881
  //#endregion
58122
- 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, fleetViewOf, 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, useCalendarsGetPreferences, useCalendarsListCalendars, useCalendarsListEvents, useCalendarsSetCalendarPreference, useCameraCredentialsGetCredentials, useCameraCredentialsGetStatus, useCameraGridLayoutApplyDeviceSettingsPatch, useCameraGridLayoutGetDeviceLiveContribution, useCameraGridLayoutGetDeviceSettingsContribution, useCameraGridLayoutGetLayout, useCameraGridLayoutSaveLayout, useCameraPipelineConfigApplyDeviceSettingsPatch, useCameraPipelineConfigGetDeviceLiveContribution, useCameraPipelineConfigGetDeviceSettingsContribution, useCameraStreamsGetBrokerStreams, useCameraStreamsGetCameraStreams, useCameraStreamsGetProfileRtspEntries, useCameraStreamsGetRtspEntries, useCameraStreamsPickStream, useCapabilityPresence, useCarbonMonoxideGetStatus, useClimateControlGetStatus, useClimateControlSetFanMode, useClimateControlSetMode, useClimateControlSetPreset, useClimateControlSetSwingHorizontal, useClimateControlSetSwingVertical, useClimateControlSetTarget, useClimateControlSetTargetHumidity, useClimateControlSetTargetRange, useClusterNodes, useClusterTopology, useColorGetStatus, useColorSetColor, useConfirm, useConnectionTestDescribeTest, useConnectionTestTestSettings, useConnectivityGetStatus, useConsumablesGetStatus, useConsumablesReset, useContactGetStatus, useContainerChildren, useControlGetStatus, useControlSetValue, useCoreBlocksCompile, useCoreBlocksCreate, useCoreBlocksCreateComposition, useCoreBlocksDelete, useCoreBlocksGet, useCoreBlocksGetBlockSettings, useCoreBlocksGetComposition, useCoreBlocksGetCustomization, useCoreBlocksGetTypeDefs, useCoreBlocksList, useCoreBlocksListComposableCaps, useCoreBlocksListCompositions, useCoreBlocksRestart, useCoreBlocksSetEnabled, useCoreBlocksUpdate, useCoreBlocksUpdateBlockSettings, 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, useNotificationRulesActivateAlarmProfile, useNotificationRulesCancelSnooze, useNotificationRulesCreateAlarmProfile, useNotificationRulesCreateRule, useNotificationRulesCreateSequence, useNotificationRulesCreateSnooze, useNotificationRulesDeleteAlarmProfile, useNotificationRulesDeleteRule, useNotificationRulesDeleteSequence, useNotificationRulesGetAlarmConfig, useNotificationRulesGetAlarmSensors, useNotificationRulesGetClipRetentionAsks, useNotificationRulesGetConditionCatalog, useNotificationRulesGetHistory, useNotificationRulesGetRule, useNotificationRulesGetRuleLastRuns, useNotificationRulesGetSequence, useNotificationRulesGetTemplateCatalog, useNotificationRulesListDeviceMutes, useNotificationRulesListRules, useNotificationRulesListSequences, useNotificationRulesListSnoozes, useNotificationRulesPreviewStateSummary, useNotificationRulesPreviewTemplate, useNotificationRulesRenameAlarmProfile, useNotificationRulesResolveArtifactUrl, useNotificationRulesSetAlarmConfig, useNotificationRulesSetDeviceMuted, useNotificationRulesSetRuleEnabled, useNotificationRulesTestRule, useNotificationRulesUpdateRule, useNotificationRulesUpdateSequence, useNotifierCancel, useNotifierGetStatus, useNotifierSend, useNumericSensorGetStatus, 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, useUrlQueryParam, 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 };
58882
+ 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, ConfigNotificationTargetMultiSelectFieldView, ConfigNotificationTargetSelectFieldView, 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, DeviceQuickDetailProvider, 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, NotificationTargetSelectField, NotificationTargetsField, OPTION_SELECT_SEARCH_MIN_OPTIONS, OfflineBadge, OptionSelect, 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, catalogHasDraft, 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, draftFromQuery, emptyDevicesWidens, ensureMfHostInit, eventKindLabel, filterDataTableRows, filterDeviceOptions, filterOptions as filterOptionSelectOptions, filterPickerDevices, findTimezone, flattenPickerGrouping, flattenPickerRows, fleetViewOf, 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, optionSearchText as optionSelectSearchText, orphanDeviceLabel, overrideEntityIdFromLink, pageRows, parsePickerGroupBy, parseRecordedServerMessage, partitionSelected as partitionOptionSelectSelected, 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, resolveSearchable as resolveOptionSelectSearchable, resolvePrimaryChild, resolveSelectedDevices, resolveSensorDisplay, resolveStepDefaultModel, resolveTableLayout, roiTooLarge, routerBasename, Grid2x2 as s, scrubReducer, selectPickerGroup, selectedDeviceOptions, serializeRecordedCommand, shouldCommit, shouldEmit, shouldShowAddNewFooter, shouldShowUseQueryRow, 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, useCalendarsGetPreferences, useCalendarsListCalendars, useCalendarsListEvents, useCalendarsSetCalendarPreference, useCameraCredentialsGetCredentials, useCameraCredentialsGetStatus, useCameraGridLayoutApplyDeviceSettingsPatch, useCameraGridLayoutGetDeviceLiveContribution, useCameraGridLayoutGetDeviceSettingsContribution, useCameraGridLayoutGetLayout, useCameraGridLayoutSaveLayout, useCameraPipelineConfigApplyDeviceSettingsPatch, useCameraPipelineConfigGetDeviceLiveContribution, useCameraPipelineConfigGetDeviceSettingsContribution, useCameraStreamsGetBrokerStreams, useCameraStreamsGetCameraStreams, useCameraStreamsGetProfileRtspEntries, useCameraStreamsGetRtspEntries, useCameraStreamsPickStream, useCapabilityPresence, useCarbonMonoxideGetStatus, useClimateControlGetStatus, useClimateControlSetFanMode, useClimateControlSetMode, useClimateControlSetPreset, useClimateControlSetSwingHorizontal, useClimateControlSetSwingVertical, useClimateControlSetTarget, useClimateControlSetTargetHumidity, useClimateControlSetTargetRange, useClusterNodes, useClusterTopology, useColorGetStatus, useColorSetColor, useConfirm, useConnectionTestDescribeTest, useConnectionTestTestSettings, useConnectivityGetStatus, useConsumablesGetStatus, useConsumablesReset, useContactGetStatus, useContainerChildren, useControlGetStatus, useControlSetValue, useCoreBlocksCompile, useCoreBlocksCreate, useCoreBlocksCreateComposition, useCoreBlocksDelete, useCoreBlocksGet, useCoreBlocksGetBlockSettings, useCoreBlocksGetComposition, useCoreBlocksGetCustomization, useCoreBlocksGetTypeDefs, useCoreBlocksList, useCoreBlocksListComposableCaps, useCoreBlocksListCompositions, useCoreBlocksRestart, useCoreBlocksSetEnabled, useCoreBlocksUpdate, useCoreBlocksUpdateBlockSettings, 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, useDeviceQuickDetailOpen, 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, useNotificationOutputGetTarget, useNotificationOutputListTargetKinds, useNotificationOutputListTargets, useNotificationOutputProbeTargetConfig, useNotificationOutputSend, useNotificationOutputSetTargetEnabled, useNotificationOutputTestTarget, useNotificationOutputUpsertTarget, useNotificationRulesActivateAlarmProfile, useNotificationRulesCancelSnooze, useNotificationRulesCreateAlarmProfile, useNotificationRulesCreateRule, useNotificationRulesCreateSequence, useNotificationRulesCreateSnooze, useNotificationRulesDeleteAlarmProfile, useNotificationRulesDeleteRule, useNotificationRulesDeleteSequence, useNotificationRulesGetAlarmConfig, useNotificationRulesGetAlarmSensors, useNotificationRulesGetClipRetentionAsks, useNotificationRulesGetConditionCatalog, useNotificationRulesGetHistory, useNotificationRulesGetRule, useNotificationRulesGetRuleLastRuns, useNotificationRulesGetSequence, useNotificationRulesGetTemplateCatalog, useNotificationRulesListDeviceMutes, useNotificationRulesListRules, useNotificationRulesListSequences, useNotificationRulesListSnoozes, useNotificationRulesPreviewStateSummary, useNotificationRulesPreviewTemplate, useNotificationRulesRenameAlarmProfile, useNotificationRulesResolveArtifactUrl, useNotificationRulesSetAlarmConfig, useNotificationRulesSetDeviceMuted, useNotificationRulesSetRuleEnabled, useNotificationRulesTestRule, useNotificationRulesUpdateRule, useNotificationRulesUpdateSequence, useNotifierCancel, useNotifierGetStatus, useNotifierSend, useNumericSensorGetStatus, 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, useUrlQueryParam, 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 };