@camstack/ui-library 1.2.226 → 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
@@ -6738,8 +6738,10 @@ var useButtonPress = trpc.button.press.useMutation;
6738
6738
  var useCalendarsListCalendars = trpc.calendars.listCalendars.useQuery;
6739
6739
  /** Generated alias around `trpc.calendars.listEvents.useQuery`. */
6740
6740
  var useCalendarsListEvents = trpc.calendars.listEvents.useQuery;
6741
- /** Generated alias around `trpc.calendars.importFromHomeAssistant.useMutation`. */
6742
- var useCalendarsImportFromHomeAssistant = trpc.calendars.importFromHomeAssistant.useMutation;
6741
+ /** Generated alias around `trpc.calendars.getPreferences.useQuery`. */
6742
+ var useCalendarsGetPreferences = trpc.calendars.getPreferences.useQuery;
6743
+ /** Generated alias around `trpc.calendars.setCalendarPreference.useMutation`. */
6744
+ var useCalendarsSetCalendarPreference = trpc.calendars.setCalendarPreference.useMutation;
6743
6745
  /** Generated alias around `trpc.cameraCredentials.getCredentials.useQuery`. */
6744
6746
  var useCameraCredentialsGetCredentials = trpc.cameraCredentials.getCredentials.useQuery;
6745
6747
  /** Generated alias around `trpc.cameraCredentials.getStatus.useQuery`. */
@@ -6826,6 +6828,10 @@ var useCoreBlocksSetEnabled = trpc.coreBlocks.setEnabled.useMutation;
6826
6828
  var useCoreBlocksRestart = trpc.coreBlocks.restart.useMutation;
6827
6829
  /** Generated alias around `trpc.coreBlocks.compile.useMutation`. */
6828
6830
  var useCoreBlocksCompile = trpc.coreBlocks.compile.useMutation;
6831
+ /** Generated alias around `trpc.coreBlocks.getBlockSettings.useQuery`. */
6832
+ var useCoreBlocksGetBlockSettings = trpc.coreBlocks.getBlockSettings.useQuery;
6833
+ /** Generated alias around `trpc.coreBlocks.updateBlockSettings.useMutation`. */
6834
+ var useCoreBlocksUpdateBlockSettings = trpc.coreBlocks.updateBlockSettings.useMutation;
6829
6835
  /** Generated alias around `trpc.coreBlocks.getTypeDefs.useQuery`. */
6830
6836
  var useCoreBlocksGetTypeDefs = trpc.coreBlocks.getTypeDefs.useQuery;
6831
6837
  /** Generated alias around `trpc.coreBlocks.createComposition.useMutation`. */
@@ -7566,8 +7572,12 @@ var useNodesExecuteQuery = trpc.nodes.executeQuery.useMutation;
7566
7572
  var useNotificationOutputListTargetKinds = trpc.notificationOutput.listTargetKinds.useQuery;
7567
7573
  /** Generated alias around `trpc.notificationOutput.listTargets.useQuery`. */
7568
7574
  var useNotificationOutputListTargets = trpc.notificationOutput.listTargets.useQuery;
7575
+ /** Generated alias around `trpc.notificationOutput.getTarget.useQuery`. */
7576
+ var useNotificationOutputGetTarget = trpc.notificationOutput.getTarget.useQuery;
7569
7577
  /** Generated alias around `trpc.notificationOutput.discoverTargets.useQuery`. */
7570
7578
  var useNotificationOutputDiscoverTargets = trpc.notificationOutput.discoverTargets.useQuery;
7579
+ /** Generated alias around `trpc.notificationOutput.probeTargetConfig.useMutation`. */
7580
+ var useNotificationOutputProbeTargetConfig = trpc.notificationOutput.probeTargetConfig.useMutation;
7571
7581
  /** Generated alias around `trpc.notificationOutput.send.useMutation`. */
7572
7582
  var useNotificationOutputSend = trpc.notificationOutput.send.useMutation;
7573
7583
  /** Generated alias around `trpc.notificationOutput.testTarget.useMutation`. */
@@ -7590,6 +7600,16 @@ var useNotificationRulesUpdateRule = trpc.notificationRules.updateRule.useMutati
7590
7600
  var useNotificationRulesDeleteRule = trpc.notificationRules.deleteRule.useMutation;
7591
7601
  /** Generated alias around `trpc.notificationRules.setRuleEnabled.useMutation`. */
7592
7602
  var useNotificationRulesSetRuleEnabled = trpc.notificationRules.setRuleEnabled.useMutation;
7603
+ /** Generated alias around `trpc.notificationRules.listSequences.useQuery`. */
7604
+ var useNotificationRulesListSequences = trpc.notificationRules.listSequences.useQuery;
7605
+ /** Generated alias around `trpc.notificationRules.getSequence.useQuery`. */
7606
+ var useNotificationRulesGetSequence = trpc.notificationRules.getSequence.useQuery;
7607
+ /** Generated alias around `trpc.notificationRules.createSequence.useMutation`. */
7608
+ var useNotificationRulesCreateSequence = trpc.notificationRules.createSequence.useMutation;
7609
+ /** Generated alias around `trpc.notificationRules.updateSequence.useMutation`. */
7610
+ var useNotificationRulesUpdateSequence = trpc.notificationRules.updateSequence.useMutation;
7611
+ /** Generated alias around `trpc.notificationRules.deleteSequence.useMutation`. */
7612
+ var useNotificationRulesDeleteSequence = trpc.notificationRules.deleteSequence.useMutation;
7593
7613
  /** Generated alias around `trpc.notificationRules.getClipRetentionAsks.useQuery`. */
7594
7614
  var useNotificationRulesGetClipRetentionAsks = trpc.notificationRules.getClipRetentionAsks.useQuery;
7595
7615
  /** Generated alias around `trpc.notificationRules.listDeviceMutes.useQuery`. */
@@ -12352,8 +12372,8 @@ function selectedDeviceOptions(options, selected) {
12352
12372
  */
12353
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";
12354
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";
12355
- var LABEL_CLASS$2 = "block text-[11px] font-medium text-foreground mb-1 break-words";
12356
- 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";
12357
12377
  /** The compact projection of the listAll rows the device fields consume. */
12358
12378
  function toCandidates(rows) {
12359
12379
  if (!Array.isArray(rows)) return [];
@@ -12440,14 +12460,14 @@ function FacetDropdown$1({ label, values, chosen, onChange }) {
12440
12460
  })]
12441
12461
  })] });
12442
12462
  }
12443
- function FieldShell({ label, description, required, translationFn, children }) {
12463
+ function FieldShell$1({ label, description, required, translationFn, children }) {
12444
12464
  const resolvedLabel = resolveLabel(label, translationFn);
12445
12465
  const resolvedDescription = resolveLabel(description, translationFn);
12446
12466
  return /* @__PURE__ */ jsxs("div", {
12447
12467
  className: "min-w-0",
12448
12468
  children: [
12449
12469
  resolvedLabel !== void 0 && resolvedLabel !== "" && /* @__PURE__ */ jsxs("label", {
12450
- className: LABEL_CLASS$2,
12470
+ className: LABEL_CLASS$3,
12451
12471
  children: [resolvedLabel, required && /* @__PURE__ */ jsx("span", {
12452
12472
  className: "text-danger ml-0.5",
12453
12473
  children: "*"
@@ -12455,7 +12475,7 @@ function FieldShell({ label, description, required, translationFn, children }) {
12455
12475
  }),
12456
12476
  children,
12457
12477
  resolvedDescription && /* @__PURE__ */ jsx("p", {
12458
- className: DESC_CLASS$1,
12478
+ className: DESC_CLASS$2,
12459
12479
  children: resolvedDescription
12460
12480
  })
12461
12481
  ]
@@ -12465,7 +12485,7 @@ function DeviceSelectField({ field, value, onChange, disabled, translationFn })
12465
12485
  const { data } = useDeviceManagerListAll({});
12466
12486
  const options = useMemo(() => devicesToOptions(toCandidates(data), field.deviceFilter), [data, field.deviceFilter]);
12467
12487
  const current = value === void 0 || value === null ? "" : String(value);
12468
- return /* @__PURE__ */ jsx(FieldShell, {
12488
+ return /* @__PURE__ */ jsx(FieldShell$1, {
12469
12489
  label: field.label,
12470
12490
  description: field.description,
12471
12491
  required: field.required,
@@ -12543,7 +12563,7 @@ function DeviceMultiSelectField({ field, value, onChange, disabled, translationF
12543
12563
  className: "min-w-0",
12544
12564
  children: [
12545
12565
  label !== void 0 && label !== "" && /* @__PURE__ */ jsx("label", {
12546
- className: LABEL_CLASS$2,
12566
+ className: LABEL_CLASS$3,
12547
12567
  children: label
12548
12568
  }),
12549
12569
  selectedOptions.length > 0 && /* @__PURE__ */ jsx("div", {
@@ -12666,6 +12686,720 @@ function DeviceMultiSelectField({ field, value, onChange, disabled, translationF
12666
12686
  })
12667
12687
  }),
12668
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", {
12669
13403
  className: DESC_CLASS$1,
12670
13404
  children: description
12671
13405
  })
@@ -12673,6 +13407,242 @@ function DeviceMultiSelectField({ field, value, onChange, disabled, translationF
12673
13407
  });
12674
13408
  }
12675
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
12676
13646
  //#region src/contexts/custom-field-renderers.tsx
12677
13647
  /**
12678
13648
  * Custom field renderer registry.
@@ -12726,115 +13696,6 @@ function useCustomFieldRenderer(type) {
12726
13696
  return useContext(CustomFieldRenderersContext)[type] ?? null;
12727
13697
  }
12728
13698
  //#endregion
12729
- //#region src/composites/event-kind-visuals.tsx
12730
- /**
12731
- * Event-kind VISUALS — the UI-side half of the unified taxonomy dictionary
12732
- * (`@camstack/types` `EVENT_TAXONOMY` owns the serializable data:
12733
- * color / iconId / labelKey; this owns `iconId → lucide component` and
12734
- * `labelKey → t()`).
12735
- *
12736
- * Every UI that renders an event kind (timeline, events tree, chips,
12737
- * detection canvas/tree) resolves its glyph + translated label here — no
12738
- * per-component hardcoded icon or label.
12739
- */
12740
- /**
12741
- * `iconId` → lucide component. Built ONLY from statically-imported icons
12742
- * (bundle-safe). Unknown ids resolve to the neutral `Tag` fallback.
12743
- */
12744
- var EVENT_KIND_ICONS = {
12745
- motion: Activity,
12746
- audio: Volume2,
12747
- person: User,
12748
- vehicle: Car,
12749
- animal: PawPrint,
12750
- package: Package,
12751
- sensor: Radio,
12752
- control: SlidersHorizontal,
12753
- car: Car,
12754
- truck: Truck,
12755
- bus: Bus,
12756
- motorcycle: Bike,
12757
- bicycle: Bike,
12758
- airplane: Plane,
12759
- boat: Sailboat,
12760
- train: TrainFront,
12761
- bird: Bird,
12762
- cat: Cat,
12763
- dog: Dog,
12764
- horse: PawPrint,
12765
- sheep: PawPrint,
12766
- cow: PawPrint,
12767
- elephant: PawPrint,
12768
- bear: PawPrint,
12769
- zebra: PawPrint,
12770
- giraffe: PawPrint,
12771
- door: DoorOpen,
12772
- pir: Radar,
12773
- smoke: Flame,
12774
- water: Droplet,
12775
- gas: Wind,
12776
- vibration: Vibrate,
12777
- tamper: ShieldAlert,
12778
- presence: UserCheck,
12779
- generic: Tag,
12780
- lock: Lock,
12781
- siren: Siren,
12782
- switch: ToggleRight,
12783
- doorbell: BellRing,
12784
- button: CircleDot,
12785
- "audio-speech": MessageSquare,
12786
- "audio-scream": Megaphone,
12787
- "audio-crying": Baby,
12788
- "audio-laughter": Laugh,
12789
- "audio-music": Music,
12790
- "audio-dog": Dog,
12791
- "audio-cat": Cat,
12792
- "audio-bird": Bird,
12793
- "audio-animal": PawPrint,
12794
- "audio-alarm": BellRing,
12795
- "audio-doorbell": BellRing,
12796
- "audio-glass_breaking": TriangleAlert,
12797
- "audio-gunshot": Crosshair,
12798
- "audio-vehicle": Car,
12799
- "audio-siren": Siren,
12800
- "audio-fire": Flame,
12801
- "audio-water": Droplets,
12802
- "audio-wind": Wind,
12803
- "audio-door": DoorOpen,
12804
- "audio-footsteps": Footprints,
12805
- "audio-crowd": Users,
12806
- "audio-telephone": Phone,
12807
- "audio-engine": Cog,
12808
- "audio-tools": Hammer,
12809
- "audio-silence": VolumeX
12810
- };
12811
- /** Resolve an `iconId` to a lucide component (falls back to `Tag`). */
12812
- function resolveEventKindIcon(iconId) {
12813
- if (Object.hasOwn(EVENT_KIND_ICONS, iconId)) return EVENT_KIND_ICONS[iconId];
12814
- if (iconId.startsWith("audio-")) return Volume2;
12815
- return Tag;
12816
- }
12817
- /**
12818
- * Translated label for an event kind — `t(labelKey)` when a translation
12819
- * exists, else the English `label` fallback. Robust to a missing key: an
12820
- * i18n backend that echoes the key unchanged (react-i18next default) is
12821
- * treated as "no translation" and the fallback label is returned, so the UI
12822
- * never renders a raw `eventKind.*` key.
12823
- */
12824
- function eventKindLabel(descriptor, t) {
12825
- if (t === void 0) return descriptor.label;
12826
- const translated = t(descriptor.labelKey);
12827
- return translated === descriptor.labelKey || translated.length === 0 ? descriptor.label : translated;
12828
- }
12829
- /** Small convenience component: renders the lucide glyph for an `iconId`. */
12830
- function EventKindGlyph({ iconId, size = 16, color, className }) {
12831
- return createElement(resolveEventKindIcon(iconId), {
12832
- size,
12833
- color,
12834
- className
12835
- });
12836
- }
12837
- //#endregion
12838
13699
  //#region src/composites/confirm-dialog.tsx
12839
13700
  /**
12840
13701
  * The ONE modal dialog of the product — confirm, alert and prompt.
@@ -19082,59 +19943,6 @@ function useCapabilityPresence(capabilityName) {
19082
19943
  return classifyCapability(query.data);
19083
19944
  }
19084
19945
  //#endregion
19085
- //#region ../../node_modules/class-variance-authority/dist/index.mjs
19086
- /**
19087
- * Copyright 2022 Joe Bell. All rights reserved.
19088
- *
19089
- * This file is licensed to you under the Apache License, Version 2.0
19090
- * (the "License"); you may not use this file except in compliance with the
19091
- * License. You may obtain a copy of the License at
19092
- *
19093
- * http://www.apache.org/licenses/LICENSE-2.0
19094
- *
19095
- * Unless required by applicable law or agreed to in writing, software
19096
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
19097
- * WARRANTIES OR REPRESENTATIONS OF ANY KIND, either express or implied. See the
19098
- * License for the specific language governing permissions and limitations under
19099
- * the License.
19100
- */ var falsyToString = (value) => typeof value === "boolean" ? `${value}` : value === 0 ? "0" : value;
19101
- var cx = clsx;
19102
- var cva = (base, config) => (props) => {
19103
- var _config_compoundVariants;
19104
- 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);
19105
- const { variants, defaultVariants } = config;
19106
- const getVariantClassNames = Object.keys(variants).map((variant) => {
19107
- const variantProp = props === null || props === void 0 ? void 0 : props[variant];
19108
- const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant];
19109
- if (variantProp === null) return null;
19110
- const variantKey = falsyToString(variantProp) || falsyToString(defaultVariantProp);
19111
- return variants[variant][variantKey];
19112
- });
19113
- const propsWithoutUndefined = props && Object.entries(props).reduce((acc, param) => {
19114
- let [key, value] = param;
19115
- if (value === void 0) return acc;
19116
- acc[key] = value;
19117
- return acc;
19118
- }, {});
19119
- 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) => {
19120
- let { class: cvClass, className: cvClassName, ...compoundVariantOptions } = param;
19121
- return Object.entries(compoundVariantOptions).every((param) => {
19122
- let [key, value] = param;
19123
- return Array.isArray(value) ? value.includes({
19124
- ...defaultVariants,
19125
- ...propsWithoutUndefined
19126
- }[key]) : {
19127
- ...defaultVariants,
19128
- ...propsWithoutUndefined
19129
- }[key] === value;
19130
- }) ? [
19131
- ...acc,
19132
- cvClass,
19133
- cvClassName
19134
- ] : acc;
19135
- }, []), props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);
19136
- };
19137
- //#endregion
19138
19946
  //#region src/primitives/button.tsx
19139
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", {
19140
19948
  variants: {
@@ -19997,38 +20805,6 @@ function ClipPanel({ deviceId, clip, profile, onProfileChange }) {
19997
20805
  });
19998
20806
  }
19999
20807
  //#endregion
20000
- //#region src/primitives/badge.tsx
20001
- var badgeVariants = cva("inline-flex items-center rounded-full text-xs font-medium px-2 py-0.5", {
20002
- variants: {
20003
- variant: {
20004
- default: "bg-surface-hover text-foreground",
20005
- success: "bg-success/15 text-success",
20006
- warning: "bg-warning/15 text-warning",
20007
- danger: "bg-danger/15 text-danger",
20008
- info: "bg-info/15 text-info"
20009
- },
20010
- styleVariant: {
20011
- solid: "",
20012
- outline: "border bg-transparent"
20013
- }
20014
- },
20015
- defaultVariants: {
20016
- variant: "default",
20017
- styleVariant: "solid"
20018
- }
20019
- });
20020
- var Badge = forwardRef(({ className, variant, style, ...props }, ref) => {
20021
- return /* @__PURE__ */ jsx("span", {
20022
- ref,
20023
- className: cn(badgeVariants({
20024
- variant,
20025
- styleVariant: style
20026
- }), className),
20027
- ...props
20028
- });
20029
- });
20030
- Badge.displayName = "Badge";
20031
- //#endregion
20032
20808
  //#region src/lib/format-duration.ts
20033
20809
  /**
20034
20810
  * How long something lasted, the way this product says it.
@@ -26059,6 +26835,7 @@ function MultiSelectField({ field, value, onChange, disabled, translationFn }) {
26059
26835
  function PasswordField({ field, value, onChange, disabled, translationFn }) {
26060
26836
  const [show, setShow] = useState(false);
26061
26837
  const showToggle = field.showToggle !== false;
26838
+ const text = value === void 0 || value === null ? "" : String(value);
26062
26839
  return /* @__PURE__ */ jsx(FieldWrapper, {
26063
26840
  label: field.label,
26064
26841
  description: field.description,
@@ -26070,14 +26847,20 @@ function PasswordField({ field, value, onChange, disabled, translationFn }) {
26070
26847
  children: [/* @__PURE__ */ jsx("input", {
26071
26848
  type: show ? "text" : "password",
26072
26849
  className: INPUT_CLASS + (showToggle ? " pr-9" : ""),
26073
- value: value === void 0 || value === null ? "" : String(value),
26850
+ value: text,
26074
26851
  placeholder: field.placeholder,
26075
26852
  disabled: disabled || field.disabled,
26076
- 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
+ }
26077
26859
  }), showToggle && /* @__PURE__ */ jsx("button", {
26078
26860
  type: "button",
26079
26861
  className: "absolute right-2 top-1/2 -translate-y-1/2 text-foreground-subtle hover:text-foreground",
26080
26862
  tabIndex: -1,
26863
+ "aria-label": show ? "Hide password" : "Show password",
26081
26864
  onClick: () => setShow((s) => !s),
26082
26865
  children: show ? /* @__PURE__ */ jsx(EyeOff, { className: "h-3.5 w-3.5" }) : /* @__PURE__ */ jsx(Eye, { className: "h-3.5 w-3.5" })
26083
26866
  })]
@@ -26223,70 +27006,30 @@ function SliderField({ field, value, onChange, disabled, translationFn }) {
26223
27006
  });
26224
27007
  }
26225
27008
  function TagsField({ field, value, onChange, disabled, translationFn }) {
26226
- const tags = Array.isArray(value) ? value : [];
26227
- const [input, setInput] = useState("");
26228
- const inputRef = useRef(null);
26229
- const addTag = useCallback((tag) => {
26230
- const trimmed = tag.trim();
26231
- if (!trimmed || tags.includes(trimmed)) return;
26232
- if (field.maxTags !== void 0 && tags.length >= field.maxTags) return;
26233
- onChange([...tags, trimmed]);
26234
- setInput("");
26235
- }, [
26236
- tags,
26237
- field.maxTags,
26238
- onChange
26239
- ]);
26240
- const removeTag = (tag) => onChange(tags.filter((t) => t !== tag));
26241
- const handleKeyDown = (e) => {
26242
- if (e.key === "Enter" || e.key === ",") {
26243
- e.preventDefault();
26244
- addTag(input);
26245
- } else if (e.key === "Backspace" && input === "" && tags.length > 0) removeTag(tags[tags.length - 1]);
26246
- };
26247
- 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;
26248
27016
  return /* @__PURE__ */ jsx(FieldWrapper, {
26249
27017
  label: field.label,
26250
27018
  description: field.description,
26251
27019
  required: field.required,
26252
27020
  span: field.span,
26253
27021
  translationFn,
26254
- children: /* @__PURE__ */ jsxs("div", {
26255
- className: [
26256
- "flex flex-wrap gap-1.5 rounded-md border border-border bg-background px-2 py-1.5 min-h-[38px] cursor-text",
26257
- "focus-within:border-primary focus-within:ring-1 focus-within:ring-primary/30",
26258
- isDisabled ? "opacity-50 cursor-not-allowed" : ""
26259
- ].join(" "),
26260
- onClick: () => !isDisabled && inputRef.current?.focus(),
26261
- children: [
26262
- tags.map((tag) => /* @__PURE__ */ jsxs("span", {
26263
- className: "inline-flex items-center gap-1 rounded-md bg-primary/10 px-1.5 py-0.5 text-xs text-primary",
26264
- children: [tag, !isDisabled && /* @__PURE__ */ jsx("button", {
26265
- type: "button",
26266
- onClick: () => removeTag(tag),
26267
- className: "hover:text-danger",
26268
- children: /* @__PURE__ */ jsx(X, { className: "h-2.5 w-2.5" })
26269
- })]
26270
- }, tag)),
26271
- /* @__PURE__ */ jsx("input", {
26272
- ref: inputRef,
26273
- type: "text",
26274
- className: "flex-1 min-w-[80px] bg-transparent text-sm text-foreground outline-none placeholder:text-foreground-disabled",
26275
- value: input,
26276
- placeholder: tags.length === 0 ? field.placeholder ?? "Add tags…" : "",
26277
- disabled: isDisabled,
26278
- list: `tags-suggestions-${field.key}`,
26279
- onChange: (e) => setInput(e.target.value),
26280
- onKeyDown: handleKeyDown,
26281
- onBlur: () => {
26282
- if (input.trim()) addTag(input);
26283
- }
26284
- }),
26285
- field.suggestions && /* @__PURE__ */ jsx("datalist", {
26286
- id: `tags-suggestions-${field.key}`,
26287
- children: field.suggestions.map((s) => /* @__PURE__ */ jsx("option", { value: s }, s))
26288
- })
26289
- ]
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}`
26290
27033
  })
26291
27034
  });
26292
27035
  }
@@ -27518,6 +28261,20 @@ function FormField({ field, values, onChange, disabled, translationFn, onTestFie
27518
28261
  disabled,
27519
28262
  translationFn
27520
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
+ });
27521
28278
  case "probe": return /* @__PURE__ */ jsx(ProbeField, {
27522
28279
  field,
27523
28280
  value,
@@ -29050,9 +29807,6 @@ var DialogContent = forwardRef(({ className, width, placement, scroll, children,
29050
29807
  if (open && !el.open) el.showModal();
29051
29808
  if (!open && el.open) el.close();
29052
29809
  }, [open, dialogRef]);
29053
- const handleClick = (e) => {
29054
- if (e.target === e.currentTarget) setOpen(false);
29055
- };
29056
29810
  return /* @__PURE__ */ jsx("dialog", {
29057
29811
  ref: dialogRef,
29058
29812
  id: contentId,
@@ -29061,7 +29815,6 @@ var DialogContent = forwardRef(({ className, width, placement, scroll, children,
29061
29815
  placement,
29062
29816
  scroll
29063
29817
  }), className),
29064
- onClick: handleClick,
29065
29818
  onClose: () => setOpen(false),
29066
29819
  ...props,
29067
29820
  children
@@ -39258,7 +40011,7 @@ function ControlWidget({ slice, busy, setValueFn, layout }) {
39258
40011
  value: e.target.value
39259
40012
  } });
39260
40013
  },
39261
- 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"),
39262
40015
  children: slice.options.map((opt) => /* @__PURE__ */ jsx("option", {
39263
40016
  value: opt,
39264
40017
  children: opt
@@ -40337,12 +41090,13 @@ function BatteryBar({ percent }) {
40337
41090
  });
40338
41091
  }
40339
41092
  function SensorHeroInner({ trpc, device }) {
40340
- 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"];
40341
41094
  const isBattery = isBatterySensorRole(device.role);
40342
41095
  const { data: roleDefaultsData } = useDeviceManagerGetRoleDisplayDefaults({}, { staleTime: 6e4 });
40343
41096
  const dev = useDeviceProxy(trpc, device.id);
40344
41097
  const numericSlice = useDeviceStateSlice(dev !== null && roleDescriptor !== void 0 ? roleDescriptor.getSliceHandle(dev.state) : void 0);
40345
41098
  const binaryBatterySlice = useDeviceStateSlice(dev !== null && isBattery ? dev.state.binary : void 0);
41099
+ const occupancySlice = useDeviceStateSlice(dev !== null && !isBattery ? dev.state.binary : void 0);
40346
41100
  const useBinaryBattery = isBattery && roleDescriptor?.kind === "numeric" && !hasBatteryNumericValue(numericSlice, roleDescriptor.field) && binaryBatterySlice !== void 0;
40347
41101
  const descriptor = useBinaryBattery ? BINARY_BATTERY_DESCRIPTOR : roleDescriptor;
40348
41102
  const slice = useBinaryBattery ? binaryBatterySlice : numericSlice;
@@ -40366,12 +41120,14 @@ function SensorHeroInner({ trpc, device }) {
40366
41120
  const resolved = resolveSensorDisplay({
40367
41121
  display: device.display,
40368
41122
  capName: device.role === "numeric-sensor" ? "numeric-sensor" : void 0,
40369
- roleDefault: device.role != null ? roleDefaultsData?.defaults[device.role] : void 0,
41123
+ roleDefault: device.role != null ? roleDefaultsData?.defaults[device.role] : roleDefaultsData?.defaults["temperature-sensor"],
40370
41124
  sliceUnit: liveUnit,
40371
41125
  slicePrecision,
40372
41126
  canonicalUnit: descriptor.canonicalUnit
40373
41127
  });
40374
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;
40375
41131
  return /* @__PURE__ */ jsxs("div", {
40376
41132
  className: "flex flex-col items-center justify-center gap-2 rounded-lg border border-border bg-surface p-4",
40377
41133
  children: [
@@ -40379,13 +41135,18 @@ function SensorHeroInner({ trpc, device }) {
40379
41135
  className: "flex items-baseline gap-1",
40380
41136
  children: [/* @__PURE__ */ jsx("span", {
40381
41137
  className: "text-3xl font-semibold tabular-nums text-foreground",
40382
- children: formatNumeric(resolved.toDisplayValue(rawValue), resolved.precision)
41138
+ children: formatted
40383
41139
  }), unit && /* @__PURE__ */ jsx("span", {
40384
41140
  className: "text-base text-foreground-subtle",
40385
41141
  children: unit
40386
41142
  })]
40387
41143
  }),
40388
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
+ }),
40389
41150
  /* @__PURE__ */ jsx("span", {
40390
41151
  className: "text-sm text-foreground-subtle",
40391
41152
  children: device.name
@@ -48215,11 +48976,11 @@ function useDeviceAdminLink(trpc, deviceId) {
48215
48976
  cap: (d) => d.deviceAdminLink,
48216
48977
  slice: () => void 0
48217
48978
  });
48218
- 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);
48219
48980
  const [state, setState] = useState({ kind: "pending" });
48220
48981
  useEffect(() => {
48221
- if (!bound || cap === void 0 || cap === null) {
48222
- setState({ kind: "pending" });
48982
+ if (!capBound || cap === void 0 || cap === null) {
48983
+ setState({ kind: "none" });
48223
48984
  return;
48224
48985
  }
48225
48986
  let live = true;
@@ -48240,7 +49001,7 @@ function useDeviceAdminLink(trpc, deviceId) {
48240
49001
  live = false;
48241
49002
  };
48242
49003
  }, [
48243
- bound,
49004
+ capBound,
48244
49005
  cap,
48245
49006
  deviceId
48246
49007
  ]);
@@ -49314,6 +50075,51 @@ function DeviceItemPreview({ trpc, device, status, enabled, showStatusPills = fa
49314
50075
  });
49315
50076
  }
49316
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
49317
50123
  //#region src/composites/device-item/status-dot.tsx
49318
50124
  /** The states that breathe (are "alive"). Offline + disabled are static. */
49319
50125
  function isAlive(status) {
@@ -49591,6 +50397,7 @@ function DeviceItem(props) {
49591
50397
  flags,
49592
50398
  controlPlacement: "right"
49593
50399
  }),
50400
+ /* @__PURE__ */ jsx(DeviceQuickDetailAction, { deviceId: device.id }),
49594
50401
  renderRowAction && /* @__PURE__ */ jsx("span", {
49595
50402
  onClick: (e) => e.stopPropagation(),
49596
50403
  children: renderRowAction(device)
@@ -49673,6 +50480,7 @@ function DeviceItem(props) {
49673
50480
  flags,
49674
50481
  controlPlacement: "right"
49675
50482
  }),
50483
+ /* @__PURE__ */ jsx(DeviceQuickDetailAction, { deviceId: device.id }),
49676
50484
  renderRowAction && /* @__PURE__ */ jsx("span", {
49677
50485
  onClick: (e) => e.stopPropagation(),
49678
50486
  children: renderRowAction(device)
@@ -49774,6 +50582,7 @@ function DeviceItemTableRow(props) {
49774
50582
  enabled: showSnapshot && isCamera,
49775
50583
  showStatusPills: true
49776
50584
  }),
50585
+ /* @__PURE__ */ jsx(DeviceQuickDetailAction, { deviceId: device.id }),
49777
50586
  renderRowAction && /* @__PURE__ */ jsx("span", {
49778
50587
  onClick: (e) => e.stopPropagation(),
49779
50588
  children: renderRowAction(device)
@@ -50871,10 +51680,10 @@ function useDeviceListRealtimeSync() {
50871
51680
  * `renderItem`.
50872
51681
  */
50873
51682
  function GenericModeList(props) {
50874
- 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;
50875
51684
  const [searchInput, setSearchInput] = useState("");
50876
51685
  const debouncedSearch = useDebouncedString(searchInput, 300);
50877
- const [typeFilters, setTypeFilters] = useState([]);
51686
+ const [typeFilters, setTypeFilters] = useState(() => [...initialTypeFilters]);
50878
51687
  const [page, setPage] = useState(1);
50879
51688
  useEffect(() => {
50880
51689
  setPage(1);
@@ -55740,39 +56549,6 @@ function VersionBadge({ version, preRelease, className }) {
55740
56549
  });
55741
56550
  }
55742
56551
  //#endregion
55743
- //#region src/composites/device-picker/SelectedChip.tsx
55744
- /**
55745
- * Removable selection chip + the search-box shell shared by DevicePicker and
55746
- * SearchableMultiSelectField (admin-ui). Lives here so addon MFEs can render
55747
- * the same picker without importing admin-ui.
55748
- */
55749
- /** The search box's shell — shared with multiselect fields that mirror this picker. */
55750
- 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";
55751
- /** One selected entry as a removable chip. */
55752
- function SelectedChip({ label, onRemove, warning = false, iconId, testId }) {
55753
- return /* @__PURE__ */ jsxs("span", {
55754
- "data-testid": testId,
55755
- 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",
55756
- children: [
55757
- iconId !== void 0 && /* @__PURE__ */ jsx(EventKindGlyph, {
55758
- iconId,
55759
- size: 12
55760
- }),
55761
- /* @__PURE__ */ jsx("span", {
55762
- className: "truncate",
55763
- children: label
55764
- }),
55765
- onRemove !== void 0 && /* @__PURE__ */ jsx("button", {
55766
- type: "button",
55767
- className: "shrink-0 hover:text-danger",
55768
- "aria-label": `Remove ${label}`,
55769
- onClick: onRemove,
55770
- children: /* @__PURE__ */ jsx(X, { className: "h-2.5 w-2.5" })
55771
- })
55772
- ]
55773
- });
55774
- }
55775
- //#endregion
55776
56552
  //#region src/composites/device-picker/device-picker-model.ts
55777
56553
  /** Numbers numerically, anything else by its text — the name tie-break. */
55778
56554
  function compareIds(a, b) {
@@ -57225,6 +58001,42 @@ function useZoneEditing() {
57225
58001
  return useContext(ZoneEditingContext);
57226
58002
  }
57227
58003
  //#endregion
58004
+ //#region src/hooks/use-url-query.ts
58005
+ /**
58006
+ * Tiny URL query sync for surfaces that cannot assume react-router
58007
+ * (federated addon pages) or that only need a handful of params.
58008
+ *
58009
+ * Reads on mount + `popstate`; writes with `history.replaceState`. Empty /
58010
+ * null values are deleted so the URL stays short.
58011
+ */
58012
+ function readParam(key) {
58013
+ return new URLSearchParams(window.location.search).get(key);
58014
+ }
58015
+ function writeParam(key, value) {
58016
+ const params = new URLSearchParams(window.location.search);
58017
+ if (value === null || value === "") params.delete(key);
58018
+ else params.set(key, value);
58019
+ const qs = params.toString();
58020
+ const url = qs ? `${window.location.pathname}?${qs}` : window.location.pathname;
58021
+ window.history.replaceState(null, "", url);
58022
+ }
58023
+ /**
58024
+ * One query param as React state. `null` means absent.
58025
+ * Changing it replaces the URL without a navigation.
58026
+ */
58027
+ function useUrlQueryParam(key) {
58028
+ const [value, setValue] = useState(() => readParam(key));
58029
+ useEffect(() => {
58030
+ const onPop = () => setValue(readParam(key));
58031
+ window.addEventListener("popstate", onPop);
58032
+ return () => window.removeEventListener("popstate", onPop);
58033
+ }, [key]);
58034
+ return [value, useCallback((next) => {
58035
+ writeParam(key, next);
58036
+ setValue(next);
58037
+ }, [key])];
58038
+ }
58039
+ //#endregion
57228
58040
  //#region src/hooks/use-device-cap-slice.ts
57229
58041
  /**
57230
58042
  * useDeviceCapSlice — generic runtime-state slice reader for an arbitrary
@@ -58067,4 +58879,4 @@ var SceneMonitorEditor = lazy(() => import("./SceneMonitorEditor-vfWTm6qv.js").t
58067
58879
  /** Lazy-wrapped `PrivacyMaskSettings` — code-split off the main bundle. */
58068
58880
  var PrivacyMaskSettings = lazy(() => import("./PrivacyMaskSettings-DMkchqO1.js").then((m) => ({ default: m.PrivacyMaskSettings })));
58069
58881
  //#endregion
58070
- 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, useCalendarsImportFromHomeAssistant, useCalendarsListCalendars, useCalendarsListEvents, useCameraCredentialsGetCredentials, useCameraCredentialsGetStatus, useCameraGridLayoutApplyDeviceSettingsPatch, useCameraGridLayoutGetDeviceLiveContribution, useCameraGridLayoutGetDeviceSettingsContribution, useCameraGridLayoutGetLayout, useCameraGridLayoutSaveLayout, useCameraPipelineConfigApplyDeviceSettingsPatch, useCameraPipelineConfigGetDeviceLiveContribution, useCameraPipelineConfigGetDeviceSettingsContribution, useCameraStreamsGetBrokerStreams, useCameraStreamsGetCameraStreams, useCameraStreamsGetProfileRtspEntries, useCameraStreamsGetRtspEntries, useCameraStreamsPickStream, useCapabilityPresence, useCarbonMonoxideGetStatus, useClimateControlGetStatus, useClimateControlSetFanMode, useClimateControlSetMode, useClimateControlSetPreset, useClimateControlSetSwingHorizontal, useClimateControlSetSwingVertical, useClimateControlSetTarget, useClimateControlSetTargetHumidity, useClimateControlSetTargetRange, useClusterNodes, useClusterTopology, useColorGetStatus, useColorSetColor, useConfirm, useConnectionTestDescribeTest, useConnectionTestTestSettings, useConnectivityGetStatus, useConsumablesGetStatus, useConsumablesReset, useContactGetStatus, useContainerChildren, useControlGetStatus, useControlSetValue, useCoreBlocksCompile, useCoreBlocksCreate, useCoreBlocksCreateComposition, useCoreBlocksDelete, useCoreBlocksGet, useCoreBlocksGetComposition, useCoreBlocksGetCustomization, useCoreBlocksGetTypeDefs, useCoreBlocksList, useCoreBlocksListComposableCaps, useCoreBlocksListCompositions, useCoreBlocksRestart, useCoreBlocksSetEnabled, useCoreBlocksUpdate, useCoreBlocksUpdateComposition, useCoreBlocksValidateComposition, useCoverClose, useCoverGetStatus, useCoverOpen, useCoverSetPosition, useCoverSetTiltPosition, useCoverStop, useCustomFieldRenderer, useDataTableFilter, useDayNightGetOptions, useDayNightGetStatus, useDayNightSetSettings, useDebouncedString, useDecoderCreateSession, useDecoderDestroySession, useDecoderGetFrame, useDecoderGetInfo, useDecoderGetShmStats, useDecoderGetStats, useDecoderListActiveSessions, useDecoderOpenStream, useDecoderPullFrames, useDecoderPullHandles, useDecoderPushPacket, useDecoderReprobeHwaccel, useDecoderSupportsCodec, useDecoderUpdateConfig, useDetectionPipelineApplyDeviceSettingsPatch, useDetectionPipelineGetDeviceLiveContribution, useDetectionPipelineGetDeviceSettingsContribution, useDevShell, useDevice, useDeviceAdminLink, useDeviceAdminLinkGetAdminLink, useDeviceAdoptionAdopt, useDeviceAdoptionGetCandidate, useDeviceAdoptionGetStatus, useDeviceAdoptionListCandidateFilters, useDeviceAdoptionListCandidates, useDeviceAdoptionRefresh, useDeviceAdoptionRelease, useDeviceAdoptionResync, useDeviceAutotrack, useDeviceBattery, useDeviceCapSlice, useDeviceCapability, useDeviceDetections, useDeviceDiscoveryAdoptDevice, useDeviceDiscoveryGetStatus, useDeviceDiscoveryListDiscovered, useDeviceDiscoveryRefreshDiscovery, useDeviceDiscoveryReleaseDevice, useDeviceExportApplyDeviceSettingsPatch, useDeviceExportExposeDevice, useDeviceExportGetDeviceLiveContribution, useDeviceExportGetDeviceSettingsContribution, useDeviceExportGetStatus, useDeviceExportListExposedDevices, useDeviceExportListSupportedDeviceKinds, useDeviceExportUnexposeDevice, useDeviceExtensionListCandidates, useDeviceExtensionListSlots, useDeviceExtensionListSources, useDeviceExtensionSetSlot, useDeviceId, useDeviceListPageSize, useDeviceManagerAddLocation, useDeviceManagerAdoptDevice, useDeviceManagerAdoptionAdopt, useDeviceManagerAdoptionCancelJob, useDeviceManagerAdoptionListCandidateFilters, useDeviceManagerAdoptionListCandidates, useDeviceManagerAdoptionListJobs, useDeviceManagerAdoptionRefresh, useDeviceManagerAdoptionRelease, useDeviceManagerAdoptionResync, useDeviceManagerAdoptionStartJob, useDeviceManagerAllocateDeviceId, useDeviceManagerApplyInitialMeta, useDeviceManagerCreateDevice, useDeviceManagerDisable, useDeviceManagerDiscoverAllProviders, useDeviceManagerDiscoverDevices, useDeviceManagerDiscoverProvider, useDeviceManagerDiscoveryProviders, useDeviceManagerEnable, useDeviceManagerGetAllBindings, useDeviceManagerGetBindings, useDeviceManagerGetBindingsBatch, useDeviceManagerGetChildren, useDeviceManagerGetChildrenBatch, useDeviceManagerGetConfigSchema, useDeviceManagerGetCreationSchema, useDeviceManagerGetDevice, useDeviceManagerGetDeviceAggregate, useDeviceManagerGetDeviceLiveInfoAggregate, useDeviceManagerGetDeviceSettingsAggregate, useDeviceManagerGetDeviceStatusAggregate, useDeviceManagerGetDeviceStatusAggregateBatch, useDeviceManagerGetLinkedDevices, useDeviceManagerGetLinkedDevicesBatch, useDeviceManagerGetRoleDisplayDefaults, useDeviceManagerGetSettingsSchema, useDeviceManagerGetStreamProfileMap, useDeviceManagerGetStreamSources, useDeviceManagerGetWireableFields, useDeviceManagerGetWrapperActivation, useDeviceManagerListAll, useDeviceManagerListBindableCapsForDeviceType, useDeviceManagerListDeviceIdsByCaps, useDeviceManagerListLocationDescriptions, useDeviceManagerListLocationIcons, useDeviceManagerListLocations, useDeviceManagerListPersistedByAddon, useDeviceManagerListSiteZones, useDeviceManagerListWrappersForCap, useDeviceManagerLoadConfig, useDeviceManagerLoadMeta, useDeviceManagerLoadRuntimeState, useDeviceManagerMigrateDevice, useDeviceManagerPersistConfig, useDeviceManagerProbeStreams, useDeviceManagerProviderCreationType, useDeviceManagerProviderDiscoveryParamsSchema, useDeviceManagerRegisterDevice, useDeviceManagerRemove, useDeviceManagerRemoveByIntegration, useDeviceManagerRemoveDevice, useDeviceManagerRemoveLocation, useDeviceManagerRemoveSiteZone, useDeviceManagerRenameLocation, useDeviceManagerRenameSiteZone, useDeviceManagerRunDeviceAction, useDeviceManagerSetChildLayout, useDeviceManagerSetDisabled, useDeviceManagerSetDisplay, useDeviceManagerSetIntegrationId, useDeviceManagerSetLinkDeviceId, useDeviceManagerSetLocation, useDeviceManagerSetLocationDescription, useDeviceManagerSetLocationIcon, useDeviceManagerSetLocationZone, useDeviceManagerSetMetadata, useDeviceManagerSetName, useDeviceManagerSetPrimaryChildEntityId, useDeviceManagerSetRole, useDeviceManagerSetRoleDisplayDefaults, useDeviceManagerSetSiteZone, useDeviceManagerSetStreamProfileMap, useDeviceManagerSetType, useDeviceManagerSetWrapperActive, useDeviceManagerTestCreationField, useDeviceManagerTestField, useDeviceManagerUpdateConfig, useDeviceManagerUpdateDeviceField, useDeviceManagerUpdateDeviceFieldsBatch, useDeviceNetworkLink, useDeviceOpsGetConfigEntries, useDeviceOpsGetRawState, useDeviceOpsGetSettingsSchema, useDeviceOpsGetStreamSources, useDeviceOpsRemoveDevice, useDeviceOpsRunAction, useDeviceOpsSetConfig, useDeviceProviderAdoptDiscoveredDevice, useDeviceProviderCreateDevice, useDeviceProviderDiscoverDevices, useDeviceProviderGetChildCreationSchema, useDeviceProviderGetDevices, useDeviceProviderGetDiscoveryParamsSchema, useDeviceProviderGetManualCreationType, useDeviceProviderGetStatus, useDeviceProviderReloadDevice, useDeviceProviderStart, useDeviceProviderStop, useDeviceProviderSupportsDiscovery, useDeviceProviderSupportsManualCreation, useDeviceProviderTestCreationField, useDeviceProxy, useDeviceSnapshot, useDeviceSnapshotImage, useDeviceState, useDeviceStateClaimFields, useDeviceStateGetAllSnapshots, useDeviceStateGetCapSlice, useDeviceStateGetNativeCapSlice, useDeviceStateGetSnapshot, useDeviceStateListClaims, useDeviceStatePatchOwnedFields, useDeviceStateReleaseClaim, useDeviceStateSetCapSlice, useDeviceStateSlice, useDeviceStatusGetStatus, useDeviceWebrtc, useDevices, useDoorbellEvents, useDoorbellGetStatus, useEnumSensorGetStatus, useEventEmitterGetStatus, useEventInvalidation, useEventStreamLatest, useEventStreamMap, useFaceGalleryAssignFace, useFaceGalleryAssignFaces, useFaceGalleryAuditIdentitySamples, useFaceGalleryCreateIdentity, useFaceGalleryDeleteFace, useFaceGalleryDeleteIdentity, useFaceGalleryGetFaceByTrack, useFaceGalleryGetFaceMedia, useFaceGalleryListIdentities, useFaceGalleryListIdentitySamples, useFaceGalleryListRecentFaces, useFaceGalleryRemoveSample, useFaceGalleryRenameIdentity, useFaceGallerySuggestFaceClusters, useFaceGalleryUnassignFace, useFaceGalleryUnassignFaces, useFanControlGetStatus, useFanControlSetDirection, useFanControlSetOscillating, useFanControlSetPercentage, useFanControlSetPreset, useFeatureProbeGetStatus, useFloodGetStatus, useGasGetStatus, useHumidifierGetStatus, useHumidifierSetMode, useHumidifierSetOn, useHumidifierSetTargetHumidity, useHumiditySensorGetStatus, useImageGetStatus, useImageSettingsGetOptions, useImageSettingsGetStatus, useImageSettingsSetSettings, useIntegrationsCreate, useIntegrationsDelete, useIntegrationsGet, useIntegrationsGetAvailableTypes, useIntegrationsGetByAddonId, useIntegrationsGetSettings, useIntegrationsList, useIntegrationsSetSettings, useIntegrationsTestConnection, useIntegrationsUpdate, useIntercomEndTalkSession, useIntercomGetStatus, useIntercomHandleAnswer, useIntercomPushTalkAudio, useIntercomStartSession, useIntercomStartTalkSession, useIntercomStopSession, useIsMidWidth, useIsMobile, useLawnMowerControlDock, useLawnMowerControlGetStatus, useLawnMowerControlPause, useLawnMowerControlStartMowing, useLiveBuffer, useLiveEvent, useLlmCancel, useLlmDeleteModel, useLlmDeleteProfile, useLlmGenerate, useLlmGenerateVision, useLlmGetDefaults, useLlmGetRuntimeStatus, useLlmGetUsage, useLlmInstallModel, useLlmListModelCatalog, useLlmListModels, useLlmListNodeModels, useLlmListProfileKinds, useLlmListProfiles, useLlmListRuntimeNodes, useLlmResolveModelRef, useLlmSetDefault, useLlmStartRuntime, useLlmStopRuntime, useLlmTestProfile, useLlmUpsertProfile, useLocalNetworkDownloadCa, useLocalNetworkGetAllowedAddresses, useLocalNetworkGetConnectionEndpoints, useLocalNetworkGetNotificationEndpoint, useLocalNetworkGetPreferred, useLocalNetworkGetTlsStatus, useLocalNetworkGetViewerEndpoints, useLocalNetworkList, useLocalNetworkRegenerateCertificate, useLocalNetworkResetAllowlistToBestMatch, useLocalNetworkRevertToGeneratedCertificate, useLocalNetworkSetAllowedAddresses, useLocalNetworkSetNotificationEndpoint, useLocalNetworkSetViewerEndpoints, useLocalNetworkUploadCertificate, useLockControlGetStatus, useLockControlLock, useLockControlOpen, useLockControlUnlock, useMediaPlayerGetStatus, useMediaPlayerNext, useMediaPlayerPause, useMediaPlayerPlay, useMediaPlayerPlayMedia, useMediaPlayerPrevious, useMediaPlayerSeek, useMediaPlayerSelectSource, useMediaPlayerSetMute, useMediaPlayerSetRepeat, useMediaPlayerSetShuffle, useMediaPlayerSetVolume, useMediaPlayerStop, useMeshNetworkGetStatus, useMeshNetworkJoin, useMeshNetworkLeave, useMeshNetworkListPeers, useMeshNetworkLogout, useMeshNetworkStartLogin, useMeshNetworkTestConnection, useMetricsProviderCollectSnapshot, useMetricsProviderGetAddonStats, useMetricsProviderGetCached, useMetricsProviderGetCpuTemperature, useMetricsProviderGetCurrent, useMetricsProviderGetDiskSpace, useMetricsProviderGetGpuInfo, useMetricsProviderGetLoadSeries, useMetricsProviderGetProcessStats, useMetricsProviderListAddonInstances, useMetricsProviderListNodeProcesses, useMotionDetectionAnalyze, useMotionDetectionApplyDeviceSettingsPatch, useMotionDetectionGetDeviceLiveContribution, useMotionDetectionGetDeviceSettingsContribution, useMotionDetectionRemoveCamera, useMotionDetectionReset, useMotionGetStatus, useMotionIsDetected, useMotionTriggerGetStatus, useMotionTriggerSetMotionTrigger, useMotionZonesGetOptions, useMotionZonesGetStatus, useMotionZonesSetZone, useMqttBrokerAddBroker, useMqttBrokerGetBrokerConfig, useMqttBrokerGetStatus, useMqttBrokerListBrokers, useMqttBrokerRemoveBroker, useMqttBrokerStartEmbeddedBroker, useMqttBrokerStopEmbeddedBroker, useMqttBrokerTestConnection, useNativeObjectDetectionGetOptions, useNativeObjectDetectionGetStatus, useNativeObjectDetectionSetEnabled, useNativeObjectDetectionSetSettings, useNavigation, useNavigationGetFeatures, useNavigationGetStatus, useNavigationGoToPoint, useNavigationListActions, useNavigationMove, useNavigationPlaySound, useNavigationRunAction, useNavigationSetLightLevel, useNavigationSetLightMode, useNavigationSetLightOn, useNavigationStop, useNetworkAccessGetEndpoint, useNetworkAccessGetStatus, useNetworkAccessListEndpoints, useNetworkAccessStart, useNetworkAccessStop, useNetworkLinkGetStatus, useNetworkQualityGetAllStats, useNetworkQualityGetDeviceStats, useNetworkQualityReportClientStats, useNodesClusterAddonStatus, useNodesDeployAddon, useNodesDirectory, useNodesExecuteQuery, useNodesGetCapUsageGraph, useNodesGetNodeAddons, useNodesRenameNode, useNodesRestartAddon, useNodesRestartNode, useNodesRestartProcess, useNodesSetProcessLogLevel, useNodesShutdownNode, useNodesTopology, useNodesUndeployAddon, useNotificationOutputDeleteTarget, useNotificationOutputDiscoverTargets, useNotificationOutputListTargetKinds, useNotificationOutputListTargets, useNotificationOutputSend, useNotificationOutputSetTargetEnabled, useNotificationOutputTestTarget, useNotificationOutputUpsertTarget, useNotificationRulesActivateAlarmProfile, useNotificationRulesCancelSnooze, useNotificationRulesCreateAlarmProfile, useNotificationRulesCreateRule, useNotificationRulesCreateSnooze, useNotificationRulesDeleteAlarmProfile, useNotificationRulesDeleteRule, useNotificationRulesGetAlarmConfig, useNotificationRulesGetAlarmSensors, useNotificationRulesGetClipRetentionAsks, useNotificationRulesGetConditionCatalog, useNotificationRulesGetHistory, useNotificationRulesGetRule, useNotificationRulesGetRuleLastRuns, useNotificationRulesGetTemplateCatalog, useNotificationRulesListDeviceMutes, useNotificationRulesListRules, useNotificationRulesListSnoozes, useNotificationRulesPreviewStateSummary, useNotificationRulesPreviewTemplate, useNotificationRulesRenameAlarmProfile, useNotificationRulesResolveArtifactUrl, useNotificationRulesSetAlarmConfig, useNotificationRulesSetDeviceMuted, useNotificationRulesSetRuleEnabled, useNotificationRulesTestRule, useNotificationRulesUpdateRule, useNotifierCancel, useNotifierGetStatus, useNotifierSend, useNumericSensorGetStatus, useOptimisticSlice, useOptionalSystem, useOptionalWidgetRegistry, useOsdGetStatus, useOsdManagerClearSlotBinding, useOsdManagerCopyDeviceConfiguration, useOsdManagerDeleteTemplate, useOsdManagerGetConditionSupport, useOsdManagerGetDeviceOsd, useOsdManagerGetSourceCatalog, useOsdManagerListTemplates, useOsdManagerPreviewSlot, useOsdManagerRenderDevice, useOsdManagerSetSlotBinding, useOsdManagerUpsertTemplate, useOsdSetOverlay, usePTZ, usePetFeederCallPet, usePetFeederCancelFeed, usePetFeederFeed, usePetFeederGetStatus, usePetFeederMarkFoodReplenished, usePetFeederPlaySound, usePetFeederResetDesiccant, usePetFeederSetChildLock, usePetFeederSetFeedSound, usePetFeederSetIndicatorLight, usePetFeederSetVolume, usePickerSiteZones, usePipelineAnalyticsApplyDeviceSettingsPatch, usePipelineAnalyticsCancelRelocateMedia, usePipelineAnalyticsCancelStorageMigrationMove, usePipelineAnalyticsClearTrackRelation, usePipelineAnalyticsClearTracks, usePipelineAnalyticsCompleteRetrainTrack, usePipelineAnalyticsCountRelocatableMedia, usePipelineAnalyticsCountUnstampedEventMedia, usePipelineAnalyticsDeleteDeviceEvents, usePipelineAnalyticsDeleteTracks, usePipelineAnalyticsDeselectRetrainFrame, usePipelineAnalyticsGetActiveTracks, usePipelineAnalyticsGetAudioEvents, usePipelineAnalyticsGetDeviceLiveContribution, usePipelineAnalyticsGetDeviceSettingsContribution, usePipelineAnalyticsGetEventDensity, usePipelineAnalyticsGetEventDensityBatch, usePipelineAnalyticsGetEventMedia, usePipelineAnalyticsGetEventMediaFootprintByKind, usePipelineAnalyticsGetEventStoreFootprint, usePipelineAnalyticsGetKeyEvents, usePipelineAnalyticsGetKeyEventsBatch, usePipelineAnalyticsGetMediaReclaimStatus, usePipelineAnalyticsGetMotionEvents, usePipelineAnalyticsGetObjectEmbeddingRebuildStatus, usePipelineAnalyticsGetObjectEvents, usePipelineAnalyticsGetRetrainExportUrl, usePipelineAnalyticsGetRetrainFrameImage, usePipelineAnalyticsGetSensorEvents, usePipelineAnalyticsGetStorageMigrationMoveStatus, usePipelineAnalyticsGetTrack, usePipelineAnalyticsGetTrackMedia, usePipelineAnalyticsGetTrainingExportSummary, usePipelineAnalyticsGetTrainingExportUrl, usePipelineAnalyticsListArchivedDebugNotes, usePipelineAnalyticsListBirthDecisions, usePipelineAnalyticsListEventKinds, usePipelineAnalyticsListEventKindsBatch, usePipelineAnalyticsListEventMedia, usePipelineAnalyticsListOpsLog, usePipelineAnalyticsListRecentTracks, usePipelineAnalyticsListRelocateMediaJobs, usePipelineAnalyticsListRetrainAnnotations, usePipelineAnalyticsListRetrainFrames, usePipelineAnalyticsListRetrainStaging, usePipelineAnalyticsListTrackMedia, usePipelineAnalyticsListTrackRelations, usePipelineAnalyticsListTracks, usePipelineAnalyticsOwnersWithMedia, usePipelineAnalyticsPauseForStorageMigration, usePipelineAnalyticsProposeRetrainAnnotations, usePipelineAnalyticsPruneEvents, usePipelineAnalyticsPruneEventsBefore, usePipelineAnalyticsPruneTracksBefore, usePipelineAnalyticsReadLongTermSeries, usePipelineAnalyticsRebuildObjectEmbeddings, usePipelineAnalyticsReclaimDebugMedia, usePipelineAnalyticsReconcileFromDisk, usePipelineAnalyticsRefreshStorageLocationsForMigration, usePipelineAnalyticsRelocateMedia, usePipelineAnalyticsRestageRetrainTrack, usePipelineAnalyticsResumeForStorageMigration, usePipelineAnalyticsSaveRetrainAnnotations, usePipelineAnalyticsSearchObjectEvents, usePipelineAnalyticsSelectRetrainFrames, usePipelineAnalyticsSetTrackFlags, usePipelineAnalyticsSetTrackPurity, usePipelineAnalyticsSetTrackRelation, usePipelineAnalyticsStartStorageMigrationMove, usePipelineAnalyticsWipeAllAnalytics, usePipelineAnalyticsWipeObjectEmbeddings, usePipelineExecutorCacheFrameInPool, usePipelineExecutorClearDeviceOverrides, usePipelineExecutorDeleteModel, usePipelineExecutorDeleteTemplate, usePipelineExecutorDownloadModel, usePipelineExecutorGetAddonModels, usePipelineExecutorGetAudioCapabilities, usePipelineExecutorGetAvailableEngines, usePipelineExecutorGetCapabilities, usePipelineExecutorGetDefaultSteps, usePipelineExecutorGetDetectionConfigSchema, usePipelineExecutorGetEffectiveTuning, usePipelineExecutorGetEngineProvisioning, usePipelineExecutorGetGlobalPipelineConfig, usePipelineExecutorGetGlobalSteps, usePipelineExecutorGetInferenceDeviceHealth, usePipelineExecutorGetOrchestratorConfigSchema, usePipelineExecutorGetReferenceAudio, usePipelineExecutorGetReferenceAudioFiles, usePipelineExecutorGetReferenceImage, usePipelineExecutorGetSchema, usePipelineExecutorGetSelectedEngine, usePipelineExecutorGetVideoPipelineSteps, usePipelineExecutorInferCached, usePipelineExecutorKillEngine, usePipelineExecutorListLoadedEngines, usePipelineExecutorListReferenceImages, usePipelineExecutorListTemplates, usePipelineExecutorRearmInferenceDevice, usePipelineExecutorRunAudioTest, usePipelineExecutorRunPipeline, usePipelineExecutorRunPipelineBatch, usePipelineExecutorSaveTemplate, usePipelineExecutorSetVideoPipelineSteps, usePipelineExecutorSpinEngine, usePipelineExecutorUncacheFrame, usePipelineExecutorUpdateTemplate, usePipelineExecutorValidatePipeline, usePipelineOrchestratorApplyDeviceSettingsPatch, usePipelineOrchestratorAssignAudio, usePipelineOrchestratorAssignPipeline, usePipelineOrchestratorDeleteTemplate, usePipelineOrchestratorGetAgentLoad, usePipelineOrchestratorGetAgentSettings, usePipelineOrchestratorGetAudioAssignment, usePipelineOrchestratorGetAudioAssignments, usePipelineOrchestratorGetAudioNodeLoad, usePipelineOrchestratorGetCameraMetrics, usePipelineOrchestratorGetCameraSettings, usePipelineOrchestratorGetCameraStatus, usePipelineOrchestratorGetCameraStatuses, usePipelineOrchestratorGetCameraStepOverrides, usePipelineOrchestratorGetCameraSwitches, usePipelineOrchestratorGetCapabilityBindings, usePipelineOrchestratorGetClusterModelChoice, usePipelineOrchestratorGetDeviceLiveContribution, usePipelineOrchestratorGetDeviceSettingsContribution, usePipelineOrchestratorGetGlobalMetrics, usePipelineOrchestratorGetIngestOwner, usePipelineOrchestratorGetNodeInferenceDevices, usePipelineOrchestratorGetPipelineAssignment, usePipelineOrchestratorGetPipelineAssignments, usePipelineOrchestratorGetPipelineDevicePin, usePipelineOrchestratorGetReconcileFromDiskStatus, usePipelineOrchestratorListAgentSettings, usePipelineOrchestratorListTemplates, usePipelineOrchestratorPauseForStorageMigration, usePipelineOrchestratorRebalance, usePipelineOrchestratorReconcileFromDisk, usePipelineOrchestratorRemoveAgentSettings, usePipelineOrchestratorRequestOccupancyLook, usePipelineOrchestratorResetNodePipelineDefaults, usePipelineOrchestratorResolvePipeline, usePipelineOrchestratorResumeForStorageMigration, usePipelineOrchestratorSaveTemplate, usePipelineOrchestratorSetAgentCapabilities, usePipelineOrchestratorSetAgentDecodeLimits, usePipelineOrchestratorSetAgentDetectWeight, usePipelineOrchestratorSetAgentInferenceDevices, usePipelineOrchestratorSetAgentMaxCameras, usePipelineOrchestratorSetAgentReachableHost, usePipelineOrchestratorSetCameraPipelineForAgent, usePipelineOrchestratorSetCameraSensors, usePipelineOrchestratorSetCameraStepOverride, usePipelineOrchestratorSetCameraStepToggle, usePipelineOrchestratorSetCameraSwitch, usePipelineOrchestratorSetCapabilityBinding, usePipelineOrchestratorSetPipelineDevicePin, usePipelineOrchestratorUnassignAudio, usePipelineOrchestratorUnassignPipeline, usePipelineOrchestratorUpdateTemplate, usePipelineRunnerAttachCamera, usePipelineRunnerDetachCamera, usePipelineRunnerGetAllCameraMetrics, usePipelineRunnerGetCameraMetrics, usePipelineRunnerGetLocalCameras, usePipelineRunnerGetLocalLoad, usePipelineRunnerGetLocalMetrics, usePipelineRunnerGetNativeCrop, usePipelineRunnerGetParkedTrackFrame, usePipelineRunnerParkTrackFrame, usePipelineRunnerReleaseParkedTrackFrames, usePipelineRunnerReportMotion, usePipelineRunnerRequestOccupancyBurst, usePipelineRunnerRunDetailSubtree, usePipelineRunnerRunStatelessStep, usePlateGalleryAssignPlate, usePlateGalleryAssignPlates, usePlateGalleryCorrectPlateText, usePlateGalleryCreateVehicle, usePlateGalleryDeletePlate, usePlateGalleryDeleteVehicle, usePlateGalleryGetPlateByTrack, usePlateGalleryGetPlateMedia, usePlateGalleryListPlates, usePlateGalleryListVehicleSamples, usePlateGalleryListVehicles, usePlateGalleryRemoveVehicleSample, usePlateGalleryRenameVehicle, usePlateGallerySearchPlates, usePlateGallerySuggestPlateClusters, usePlateGalleryUnassignPlate, usePlateGalleryUnassignPlates, usePlayerOverlayLayer, usePlayerOverlayLayers, usePlayerToolbarButton, usePlayerToolbarButtons, usePowerMeterGetStatus, usePresenceGetStatus, usePressureSensorGetStatus, usePrivacyMaskGetOptions, usePrivacyMaskGetStatus, usePrivacyMaskSetAudioEnabled, usePrivacyMaskSetMask, usePrompt, usePtzAutotrackGetSettings, usePtzAutotrackGetStatus, usePtzAutotrackSetEnabled, usePtzAutotrackSetSettings, usePtzCaptureHomeHere, usePtzContinuousMove, usePtzDeletePreset, usePtzGetHomePreset, usePtzGetHomeReturn, usePtzGetOptions, usePtzGetPosition, usePtzGetPresets, usePtzGetStatus, usePtzGoHome, usePtzGoToPreset, usePtzMove, usePtzSavePreset, usePtzSetAutofocus, usePtzSetHomePreset, usePtzSetHomeReturn, usePtzStop, useRebootReboot, useRecordedPlayback, useRecordingArchiveApplyDeviceSettingsPatch, useRecordingArchiveCancelRelocateJob, useRecordingArchiveCancelStorageMigrationMove, useRecordingArchiveDeleteFootprint, useRecordingArchiveGetAvailabilityBatch, useRecordingArchiveGetDaysWithRecordingsBatch, useRecordingArchiveGetDeviceConfig, useRecordingArchiveGetDeviceLiveContribution, useRecordingArchiveGetDeviceSettingsContribution, useRecordingArchiveGetPlacement, useRecordingArchiveGetRelocateResidue, useRecordingArchiveGetStatus, useRecordingArchiveGetStorageMigrationMoveStatus, useRecordingArchiveGetStorageUsage, useRecordingArchiveListOpsLog, useRecordingArchiveListRelocateJobs, useRecordingArchiveLocateSegment, useRecordingArchivePauseForStorageMigration, useRecordingArchivePlanStorageRebalance, useRecordingArchivePruneFootage, useRecordingArchiveReadGopBytes, useRecordingArchiveReadSegmentBytes, useRecordingArchiveReadWindowBytes, useRecordingArchiveReconcileLedgerAgainstDisk, useRecordingArchiveRefreshStorageLocationsForMigration, useRecordingArchiveRelocateFootage, useRecordingArchiveRenderClip, useRecordingArchiveRenderGif, useRecordingArchiveRescanStorage, useRecordingArchiveResumeForStorageMigration, useRecordingArchiveSetDeviceConfig, useRecordingArchiveSetDevicePlacement, useRecordingArchiveStartStorageMigrationMove, useRecordingArchiveStartStorageRebalance, useRecordingExportCancelExport, useRecordingExportCreateExport, useRecordingExportDeleteExport, useRecordingExportGetDownloadUrl, useRecordingExportGetExport, useRecordingExportListExports, useRecordingExportReadExportBytes, useRecordingGetAvailability, useRecordingGetDaysWithRecordings, useRecordingGetPlayback, useRecordingGetPlaybackOptions, useRecordingListSources, useRecordingOnboardGetOptions, useRecordingOnboardGetStatus, useRecordingOnboardSetSettings, useRecordingSignalGetStatus, useRemoteComponent, useRoleDisplayDefaults, useSceneMonitorCaptureReference, useSceneMonitorCreateScene, useSceneMonitorDeleteReference, useSceneMonitorDeleteScene, useSceneMonitorGetStatus, useSceneMonitorListScenes, useSceneMonitorListScenesBatch, useSceneMonitorRecheckNow, useSceneMonitorResetScene, useSceneMonitorUpdateScene, useScriptRunnerGetStatus, useScriptRunnerRun, useScriptRunnerStop, useScrubController, useServerManagementApplyServerUpdate, useServerManagementCheckServerUpdate, useServerManagementGetServerPackageStatus, useServerManagementRestartServer, useServerManagementRollbackServerUpdate, useSettingsStoreAggregate, useSettingsStoreCount, useSettingsStoreDeclareCollection, useSettingsStoreDelete, useSettingsStoreDeleteWhere, useSettingsStoreGet, useSettingsStoreHistogram, useSettingsStoreInsert, useSettingsStoreInsertMany, useSettingsStoreIsEmpty, useSettingsStoreQuery, useSettingsStoreSet, useSettingsStoreUpdate, useSettingsStoreUpdateWhere, useSettingsStoreUpsert, useSmokeGetStatus, useSnapshotApplyDeviceSettingsPatch, useSnapshotGetDebugState, useSnapshotGetDeviceLiveContribution, useSnapshotGetDeviceSettingsContribution, useSnapshotGetSnapshot, useSnapshotGetSnapshotLinks, useSnapshotGetSnapshotOverview, useSnapshotGetStatus, useSnapshotInvalidateCache, useStationaryOverlay, useStorageAbortUpload, useStorageBeginDownload, useStorageBeginUpload, useStorageDelete, useStorageDeleteLocation, useStorageEndDownload, useStorageExists, useStorageFinalizeUpload, useStorageGetAvailableSpace, useStorageList, useStorageListDrainProgress, useStorageListLocationDeclarations, useStorageListLocations, useStorageListProviders, useStorageMigrationCancel, useStorageMigrationCleanupCancel, useStorageMigrationCleanupStart, useStorageMigrationCleanupStatus, useStorageMigrationDrain, useStorageMigrationHistory, useStorageMigrationMovers, useStorageMigrationPlan, useStorageMigrationResidue, useStorageMigrationStart, useStorageMigrationStatus, useStorageRead, useStorageReadChunk, useStorageResolve, useStorageTestConfig, useStorageTestLocation, useStorageUpsertLocation, useStorageWrite, useStorageWriteChunk, useStoredGroupBy, useStreamBrokerAcquireEgressTranscode, useStreamBrokerApplyDeviceSettingsPatch, useStreamBrokerAssignProfile, useStreamBrokerFetchEventMedia, useStreamBrokerForgetDeviceHardware, useStreamBrokerGetAllRtspEntries, useStreamBrokerGetBrokerStats, useStreamBrokerGetDeviceAudioMute, useStreamBrokerGetDeviceLiveContribution, useStreamBrokerGetDeviceSettingsContribution, useStreamBrokerGetPreBufferInfo, useStreamBrokerGetRtspEntry, useStreamBrokerGetRtspPort, useStreamBrokerGetStreamUrl, useStreamBrokerGetStreamWithCodec, useStreamBrokerIsRtspEnabled, useStreamBrokerKillClient, useStreamBrokerListAllCameraStreams, useStreamBrokerListAllProfileSlots, useStreamBrokerListClients, useStreamBrokerProbeStream, useStreamBrokerProduceEventMedia, useStreamBrokerPublishCameraStream, useStreamBrokerPullAudioChunks, useStreamBrokerPullFrameHandles, useStreamBrokerRegenerateRtspToken, useStreamBrokerReleaseEgressTranscode, useStreamBrokerReleaseStreamWithCodec, useStreamBrokerRenderPreBufferClip, useStreamBrokerReportStreamSignal, useStreamBrokerRestartProfile, useStreamBrokerRetractCameraStream, useStreamBrokerSetDeviceAudioMute, useStreamBrokerSetPreBufferDuration, useStreamBrokerSetRtspEnabled, useStreamBrokerSubscribeAudioChunks, useStreamBrokerSubscribeFrames, useStreamBrokerUnassignProfile, useStreamBrokerUnsubscribeAudioChunks, useStreamBrokerUnsubscribeFrames, useStreamCatalogGetCatalog, useStreamParamsGetConfigSchema, useStreamParamsGetOptions, useStreamParamsGetStatus, useStreamParamsSetProfile, useStreamSignalsListSignals, useSwitchGetStatus, useSwitchSetState, useSystem, useSystemDetectSiteLocation, useSystemFeatureFlags, useSystemForceRetentionCleanup, useSystemGetFailureContributions, useSystemGetLoadContributions, useSystemGetLoggingSettings, useSystemGetRequestCensus, useSystemGetRetentionConfig, useSystemGetSiteLocation, useSystemHealth, useSystemInfo, useSystemMutation, useSystemNetworkAddresses, useSystemQuery, useSystemSetLoggingSettings, useSystemSetRetentionConfig, useSystemSetSiteLocation, useTamperGetStatus, useTemperatureSensorGetStatus, useTerminalSessionAdoptLegacyMonitor, useTerminalSessionClose, useTerminalSessionCreateInstance, useTerminalSessionDeleteInstance, useTerminalSessionListInstances, useTerminalSessionListLegacyCameras, useTerminalSessionListProfiles, useTerminalSessionListSessions, useTerminalSessionOpenSession, useTerminalSessionPullOutput, useTerminalSessionResize, useTerminalSessionSetInstanceEnabled, useTerminalSessionUpdateInstance, useTerminalSessionWriteInput, useThemeMode, useToastOnToast, useTurnProviderGetTurnServers, useUpdateGetStatus, useUpdateInstallUpdate, useUserManagementConfirmTotp, useUserManagementCreateApiKey, useUserManagementCreateScopedToken, useUserManagementCreateUser, useUserManagementDeleteUser, useUserManagementDisableTotp, useUserManagementGetTotpStatus, useUserManagementListApiKeys, useUserManagementListOauthSessions, useUserManagementListScopedTokens, useUserManagementListUsers, useUserManagementOauthExchangeCode, useUserManagementOauthIssueCode, useUserManagementOauthRefresh, useUserManagementOauthVerifyAccessToken, useUserManagementResetPassword, useUserManagementRevokeApiKey, useUserManagementRevokeOauthSession, useUserManagementRevokeScopedToken, useUserManagementSetUserScopes, useUserManagementSetupTotp, useUserManagementUpdateUser, useUserManagementValidateApiKey, useUserManagementValidateCredentials, useUserManagementValidateScopedToken, useUserManagementVerifyTotp, useVacuumControlGetStatus, useVacuumControlLocate, useVacuumControlPause, useVacuumControlReturnToBase, useVacuumControlSetFanSpeed, useVacuumControlStart, useVacuumControlStop, useValveClose, useValveGetStatus, useValveOpen, useValveSetPosition, useValveStop, useVibrationGetStatus, useVideoclipsDialClipStream, useVideoclipsGetClipPlayback, useVideoclipsGetPlaybackOptions, useVideoclipsListClips, useVideoclipsListSources, useVideoclipsOfferClipBytes, useVideoclipsReadClipBytes, useVodPlayback, useWaterHeaterGetStatus, useWaterHeaterSetAway, useWaterHeaterSetOperationMode, useWaterHeaterSetTargetTemp, useWeatherGetStatus, useWebrtcSessionAddIceCandidate, useWebrtcSessionCloseSession, useWebrtcSessionCreateSession, useWebrtcSessionGetIceCandidates, useWebrtcSessionGetSessionDebug, useWebrtcSessionGetSessionState, useWebrtcSessionHandleAnswer, useWebrtcSessionHandleOffer, useWebrtcSessionHasAdaptiveBitrate, useWebrtcSessionListStreams, useWidget, useWidgetMetadata, useWidgetRegistry, useZoneAnalyticsGetCameraHistory, useZoneAnalyticsGetCurrentSnapshot, useZoneAnalyticsGetCurrentSnapshotBatch, useZoneAnalyticsGetUnzonedHistory, useZoneAnalyticsGetZoneHistory, useZoneEditing, useZoneRulesListRules, useZoneRulesSetRules, useZonesAddZone, useZonesListZones, useZonesRemoveZone, useZonesUpdateZone, vacuumStateMeta, validateScopes, valveStateMeta, variantLabel, waterHeaterPhase, waterHeaterTint, weatherConditionMeta, weatherTint, writeStoredGroupBy };
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 };