@camstack/ui-library 1.2.12 → 1.2.14

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
@@ -3,7 +3,7 @@ import * as __mfHostReact from "react";
3
3
  import React, { Fragment, Suspense, createContext, createElement, forwardRef, lazy, useCallback, useContext, useEffect, useId, useLayoutEffect, useMemo, useReducer, useRef, useState, useSyncExternalStore } from "react";
4
4
  import * as __mfHostReactJsxRuntime from "react/jsx-runtime";
5
5
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
6
- import { ALL_CAPABILITY_DEFINITIONS, DEFAULT_EVENT_COLOR, DEFAULT_SCRUB_THUMBNAIL_PRESET, DEVICE_TYPE_CONTROL_KIND, DeviceExportStatusSchema, DeviceFeature, DeviceRole, DeviceType, EVENT_TAXONOMY, EventCategory, ExposedDeviceSchema, KNOWN_CAP_NAMES, PET_FEEDER_MANUAL_FEED_MAX, PET_FEEDER_MANUAL_FEED_MIN, RecordingConfigSchema, RecordingStatusSchema, SCRUB_THUMBNAIL_PRESET_LABELS, SCRUB_THUMBNAIL_PRESET_ORDER, ScrubThumbnailPresetSchema, SourceInfoSchema, TIMEZONES, buildModelVariantGroups, canConvertUnit, createDeviceProxy, createLazyTrpcSource, createSliceHandle, describeModelVariant, findTimezone, resolveDeviceControlKind, resolveVariantModelId, tryConvertUnit } from "@camstack/types";
6
+ import { ALL_CAPABILITY_DEFINITIONS, DEFAULT_EVENT_COLOR, DEVICE_TYPE_CONTROL_KIND, DeviceExportStatusSchema, DeviceFeature, DeviceRole, DeviceType, EVENT_TAXONOMY, EventCategory, ExposedDeviceSchema, KNOWN_CAP_NAMES, PET_FEEDER_MANUAL_FEED_MAX, PET_FEEDER_MANUAL_FEED_MIN, RecordingConfigSchema, RecordingStatusSchema, SourceInfoSchema, TIMEZONES, buildModelVariantGroups, canConvertUnit, createDeviceProxy, createLazyTrpcSource, createSliceHandle, deriveRecordingMode, describeModelVariant, findTimezone, resolveDeviceControlKind, resolveVariantModelId, tryConvertUnit } from "@camstack/types";
7
7
  import * as __mfHostReactDOM from "react-dom";
8
8
  import { createPortal } from "react-dom";
9
9
  import * as __mfHostReactDOMClient from "react-dom/client";
@@ -12620,7 +12620,7 @@ var buttonVariants = cva("inline-flex items-center justify-center rounded-md fon
12620
12620
  secondary: "bg-surface text-foreground hover:bg-surface-hover",
12621
12621
  ghost: "hover:bg-surface-hover text-foreground-muted",
12622
12622
  danger: "bg-danger text-white hover:bg-danger/90",
12623
- outline: "border border-border bg-transparent hover:bg-surface-hover"
12623
+ outline: "border border-border bg-transparent text-foreground hover:bg-surface-hover"
12624
12624
  },
12625
12625
  size: {
12626
12626
  sm: "h-7 px-2.5 text-xs gap-1.5",
@@ -12925,7 +12925,7 @@ function DialogTrigger({ children, ...props }) {
12925
12925
  * `w-full` (which would overflow/clip a centered dialog); the per-variant
12926
12926
  * `max-w-*` keeps small dialogs small while the cap prevents overflow.
12927
12927
  */
12928
- var contentVariants = cva("fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 m-0 w-[calc(100vw-2rem)] bg-background-elevated border border-border rounded-lg p-4 backdrop:bg-black/50 backdrop:backdrop-blur-sm max-h-[calc(100dvh-2rem)] overflow-y-auto [&:not([open])]:hidden", {
12928
+ var contentVariants = cva("fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 m-0 w-[calc(100vw-2rem)] bg-background-elevated text-foreground border border-border rounded-lg p-4 backdrop:bg-black/50 backdrop:backdrop-blur-sm max-h-[calc(100dvh-2rem)] overflow-y-auto [&:not([open])]:hidden", {
12929
12929
  variants: {
12930
12930
  width: {
12931
12931
  sm: "max-w-sm",
@@ -18480,6 +18480,8 @@ var useDeviceManagerProviderDiscoveryParamsSchema = trpc.deviceManager.providerD
18480
18480
  var useDeviceManagerTestField = trpc.deviceManager.testField.useMutation;
18481
18481
  /** Generated alias around `trpc.deviceManager.getDeviceStatusAggregate.useQuery`. */
18482
18482
  var useDeviceManagerGetDeviceStatusAggregate = trpc.deviceManager.getDeviceStatusAggregate.useQuery;
18483
+ /** Generated alias around `trpc.deviceManager.getDeviceStatusAggregateBatch.useQuery`. */
18484
+ var useDeviceManagerGetDeviceStatusAggregateBatch = trpc.deviceManager.getDeviceStatusAggregateBatch.useQuery;
18483
18485
  /** Generated alias around `trpc.deviceManager.getDeviceSettingsContribution.useQuery`. */
18484
18486
  var useDeviceManagerGetDeviceSettingsContribution = trpc.deviceManager.getDeviceSettingsContribution.useQuery;
18485
18487
  /** Generated alias around `trpc.deviceManager.getDeviceLiveContribution.useQuery`. */
@@ -18704,6 +18706,10 @@ var useLocalNetworkList = trpc.localNetwork.list.useQuery;
18704
18706
  var useLocalNetworkGetPreferred = trpc.localNetwork.getPreferred.useQuery;
18705
18707
  /** Generated alias around `trpc.localNetwork.getConnectionEndpoints.useQuery`. */
18706
18708
  var useLocalNetworkGetConnectionEndpoints = trpc.localNetwork.getConnectionEndpoints.useQuery;
18709
+ /** Generated alias around `trpc.localNetwork.getNotificationEndpoint.useQuery`. */
18710
+ var useLocalNetworkGetNotificationEndpoint = trpc.localNetwork.getNotificationEndpoint.useQuery;
18711
+ /** Generated alias around `trpc.localNetwork.setNotificationEndpoint.useMutation`. */
18712
+ var useLocalNetworkSetNotificationEndpoint = trpc.localNetwork.setNotificationEndpoint.useMutation;
18707
18713
  /** Generated alias around `trpc.localNetwork.getAllowedAddresses.useQuery`. */
18708
18714
  var useLocalNetworkGetAllowedAddresses = trpc.localNetwork.getAllowedAddresses.useQuery;
18709
18715
  /** Generated alias around `trpc.localNetwork.setAllowedAddresses.useMutation`. */
@@ -18976,6 +18982,12 @@ var usePipelineAnalyticsGetEventStoreFootprint = trpc.pipelineAnalytics.getEvent
18976
18982
  var usePipelineAnalyticsPruneEvents = trpc.pipelineAnalytics.pruneEvents.useMutation;
18977
18983
  /** Generated alias around `trpc.pipelineAnalytics.deleteDeviceEvents.useMutation`. */
18978
18984
  var usePipelineAnalyticsDeleteDeviceEvents = trpc.pipelineAnalytics.deleteDeviceEvents.useMutation;
18985
+ /** Generated alias around `trpc.pipelineAnalytics.relocateMedia.useMutation`. */
18986
+ var usePipelineAnalyticsRelocateMedia = trpc.pipelineAnalytics.relocateMedia.useMutation;
18987
+ /** Generated alias around `trpc.pipelineAnalytics.getMediaRelocateStatus.useQuery`. */
18988
+ var usePipelineAnalyticsGetMediaRelocateStatus = trpc.pipelineAnalytics.getMediaRelocateStatus.useQuery;
18989
+ /** Generated alias around `trpc.pipelineAnalytics.cancelMediaRelocate.useMutation`. */
18990
+ var usePipelineAnalyticsCancelMediaRelocate = trpc.pipelineAnalytics.cancelMediaRelocate.useMutation;
18979
18991
  /** Generated alias around `trpc.pipelineAnalytics.listOpsLog.useQuery`. */
18980
18992
  var usePipelineAnalyticsListOpsLog = trpc.pipelineAnalytics.listOpsLog.useQuery;
18981
18993
  /** Generated alias around `trpc.pipelineAnalytics.getEventMedia.useQuery`. */
@@ -19272,6 +19284,16 @@ var useRecordingPruneFootage = trpc.recording.pruneFootage.useMutation;
19272
19284
  var useRecordingDeleteFootprint = trpc.recording.deleteFootprint.useMutation;
19273
19285
  /** Generated alias around `trpc.recording.listOpsLog.useQuery`. */
19274
19286
  var useRecordingListOpsLog = trpc.recording.listOpsLog.useQuery;
19287
+ /** Generated alias around `trpc.recording.renderGif.useMutation`. */
19288
+ var useRecordingRenderGif = trpc.recording.renderGif.useMutation;
19289
+ /** Generated alias around `trpc.recording.renderClip.useMutation`. */
19290
+ var useRecordingRenderClip = trpc.recording.renderClip.useMutation;
19291
+ /** Generated alias around `trpc.recording.relocateFootage.useMutation`. */
19292
+ var useRecordingRelocateFootage = trpc.recording.relocateFootage.useMutation;
19293
+ /** Generated alias around `trpc.recording.getRelocateStatus.useQuery`. */
19294
+ var useRecordingGetRelocateStatus = trpc.recording.getRelocateStatus.useQuery;
19295
+ /** Generated alias around `trpc.recording.cancelRelocate.useMutation`. */
19296
+ var useRecordingCancelRelocate = trpc.recording.cancelRelocate.useMutation;
19275
19297
  /** Generated alias around `trpc.recording.getStatus.useQuery`. */
19276
19298
  var useRecordingGetStatus = trpc.recording.getStatus.useQuery;
19277
19299
  /** Generated alias around `trpc.recording.getDeviceSettingsContribution.useQuery`. */
@@ -19412,6 +19434,8 @@ var useStreamBrokerRetractCameraStream = trpc.streamBroker.retractCameraStream.u
19412
19434
  var useStreamBrokerAssignProfile = trpc.streamBroker.assignProfile.useMutation;
19413
19435
  /** Generated alias around `trpc.streamBroker.unassignProfile.useMutation`. */
19414
19436
  var useStreamBrokerUnassignProfile = trpc.streamBroker.unassignProfile.useMutation;
19437
+ /** Generated alias around `trpc.streamBroker.renderPreBufferClip.useMutation`. */
19438
+ var useStreamBrokerRenderPreBufferClip = trpc.streamBroker.renderPreBufferClip.useMutation;
19415
19439
  /** Generated alias around `trpc.streamBroker.listAllCameraStreams.useQuery`. */
19416
19440
  var useStreamBrokerListAllCameraStreams = trpc.streamBroker.listAllCameraStreams.useQuery;
19417
19441
  /** Generated alias around `trpc.streamBroker.listAllProfileSlots.useQuery`. */
@@ -34711,315 +34735,108 @@ function AutotrackSection({ deviceId }) {
34711
34735
  }
34712
34736
  //#endregion
34713
34737
  //#region src/composites/cap-settings/recording-config-form.ts
34714
- function emptyRule() {
34738
+ /** Every weekday — the `days` of a band that covers the whole week. */
34739
+ var ALL_WEEKDAYS = [
34740
+ 0,
34741
+ 1,
34742
+ 2,
34743
+ 3,
34744
+ 4,
34745
+ 5,
34746
+ 6
34747
+ ];
34748
+ /** The full-day span of an always-on band (`HH:MM`, 23:59 = end of day). */
34749
+ var ALL_DAY_START = "00:00";
34750
+ var ALL_DAY_END = "23:59";
34751
+ /** A band covering every day, all day, in `mode` — what the Base tab authors. */
34752
+ function alwaysBand(mode, rest) {
34715
34753
  return {
34716
- schedule: { kind: "always" },
34717
- mode: "continuous",
34718
- preBufferSec: 0,
34719
- postBufferSec: 0,
34720
- resetTimeoutOnNewEvent: true
34754
+ days: [...ALL_WEEKDAYS],
34755
+ start: ALL_DAY_START,
34756
+ end: ALL_DAY_END,
34757
+ mode,
34758
+ ...rest
34721
34759
  };
34722
34760
  }
34723
- function isTriggerMode(mode) {
34724
- return mode === "onMotion" || mode === "onAudioThreshold";
34761
+ /** A fresh row for the Advanced band table: every day, office hours, continuous. */
34762
+ function emptyBand() {
34763
+ return {
34764
+ days: [...ALL_WEEKDAYS],
34765
+ start: "09:00",
34766
+ end: "18:00",
34767
+ mode: "continuous"
34768
+ };
34725
34769
  }
34726
- function withRuleAt(rules, index, patch) {
34727
- return rules.map((r, i) => i === index ? {
34728
- ...r,
34770
+ function withBandAt(bands, index, patch) {
34771
+ return bands.map((band, i) => i === index ? {
34772
+ ...band,
34729
34773
  ...patch
34730
- } : r);
34774
+ } : band);
34775
+ }
34776
+ function removeBandAt(bands, index) {
34777
+ return bands.filter((_, i) => i !== index);
34731
34778
  }
34732
- function removeRuleAt(rules, index) {
34733
- return rules.filter((_, i) => i !== index);
34779
+ /** Does this band cover the whole week, all day? (the Base-tab shape) */
34780
+ function isAlwaysBand(band) {
34781
+ return (band.days.length === 0 || ALL_WEEKDAYS.every((d) => band.days.includes(d))) && band.start === "00:00" && band.end === "23:59";
34734
34782
  }
34735
- /** Recording bands normalized: explicit `schedules[]` wins, the deprecated
34736
- * singular `schedule` is lifted, absent = empty (= always). */
34737
- function bandsOf(cfg) {
34738
- if (cfg.schedules && cfg.schedules.length > 0) return [...cfg.schedules];
34739
- if (cfg.schedule) return [cfg.schedule];
34740
- return [];
34783
+ /**
34784
+ * A config is "advanced" when its bands cannot be expressed by the Base tab —
34785
+ * i.e. more than one band, or a single band restricted in time or weekday. Such
34786
+ * a config opens directly in the Advanced band table so nothing is silently
34787
+ * flattened by the simpler form.
34788
+ */
34789
+ function isAdvancedConfig(cfg) {
34790
+ if (cfg.bands.length > 1) return true;
34791
+ const [only] = cfg.bands;
34792
+ return only !== void 0 && !isAlwaysBand(only);
34741
34793
  }
34742
- /** Read a persisted/migrated config into the Basic form state. `mode` is read
34743
- * directly; a legacy mode-less config falls back to continuous/off by `enabled`. */
34794
+ /**
34795
+ * Read a persisted config into the Basic form state. `mode` is DERIVED from the
34796
+ * bands by the same function the recorder stamps `config.mode` with; the
34797
+ * `events` parameters come from the first events band, so re-opening the form
34798
+ * shows what is actually recorded.
34799
+ */
34744
34800
  function formStateFromConfig(cfg) {
34801
+ const eventsBand = cfg.bands.find((band) => band.mode === "events");
34745
34802
  return {
34746
- mode: cfg.mode ?? (cfg.enabled ? "continuous" : "off"),
34803
+ mode: deriveRecordingMode(cfg),
34747
34804
  profiles: cfg.profiles,
34748
34805
  segmentSeconds: cfg.segmentSeconds,
34749
- schedules: bandsOf(cfg),
34750
- triggers: cfg.triggers ?? {},
34751
- preBufferSec: cfg.preBufferSec,
34752
- postBufferSec: cfg.postBufferSec,
34806
+ triggers: eventsBand?.triggers ?? {},
34807
+ preBufferSec: eventsBand?.preBufferSec,
34808
+ postBufferSec: eventsBand?.postBufferSec,
34753
34809
  retention: cfg.retention,
34754
34810
  scrubThumbnails: cfg.scrubThumbnails
34755
34811
  };
34756
34812
  }
34757
- /** Serialize the Basic form state back to the wire config. `enabled` is derived
34758
- * from `mode`; `rules`/singular `schedule` are never emitted. Schedules,
34759
- * triggers and buffers are preserved even when off so they survive a re-enable. */
34813
+ /**
34814
+ * Serialize the Basic form state to the wire config: one always-on band of the
34815
+ * chosen mode, none when `off`. `enabled` follows the mode; `mode` itself is
34816
+ * NOT sent — the recorder stamps it as the derived summary of the bands.
34817
+ */
34760
34818
  function configFromFormState(state) {
34761
34819
  return {
34762
34820
  enabled: state.mode !== "off",
34763
- mode: state.mode,
34821
+ bands: bandsFromFormState(state),
34764
34822
  profiles: state.profiles ? [...state.profiles] : void 0,
34765
34823
  segmentSeconds: state.segmentSeconds,
34766
- schedules: state.schedules.length > 0 ? [...state.schedules] : void 0,
34767
- triggers: Object.keys(state.triggers).length > 0 ? state.triggers : void 0,
34768
- preBufferSec: state.preBufferSec,
34769
- postBufferSec: state.postBufferSec,
34770
34824
  retention: state.retention,
34771
34825
  scrubThumbnails: state.scrubThumbnails
34772
34826
  };
34773
34827
  }
34774
- /**
34775
- * A config is "advanced" when it carries `rules[]` that the backend could NOT
34776
- * cleanly collapse to a `mode` (the non-destructive `migrateRulesToMode` leaves
34777
- * `mode` absent). The settings UI opens such a config in the Advanced rules tab.
34778
- */
34779
- function isAdvancedConfig(cfg) {
34780
- return cfg.mode == null && (cfg.rules?.length ?? 0) > 0;
34781
- }
34782
- //#endregion
34783
- //#region src/composites/cap-settings/RecordingRulesEditor.tsx
34784
- var DAYS = [
34785
- {
34786
- d: 0,
34787
- label: "S"
34788
- },
34789
- {
34790
- d: 1,
34791
- label: "M"
34792
- },
34793
- {
34794
- d: 2,
34795
- label: "T"
34796
- },
34797
- {
34798
- d: 3,
34799
- label: "W"
34800
- },
34801
- {
34802
- d: 4,
34803
- label: "T"
34804
- },
34805
- {
34806
- d: 5,
34807
- label: "F"
34808
- },
34809
- {
34810
- d: 6,
34811
- label: "S"
34812
- }
34813
- ];
34814
- /** Converts a select string value to RecordingMode without a cast. */
34815
- function toMode(v) {
34816
- return v === "onMotion" || v === "onAudioThreshold" ? v : "continuous";
34817
- }
34818
- /**
34819
- * The rule patch to apply when the mode changes, normalising the fields that
34820
- * only apply to certain modes so a saved rule never carries stale values:
34821
- * `continuous` drops the pre/post buffers + threshold; trigger modes drop the
34822
- * threshold unless it's `onAudioThreshold`, which is seeded to -30 dBFS when
34823
- * unset so the displayed default is the value actually persisted.
34824
- */
34825
- function modePatch(rule, mode) {
34826
- if (mode === "onAudioThreshold") return {
34827
- mode,
34828
- thresholdDbfs: rule.thresholdDbfs ?? -30
34829
- };
34830
- if (mode === "onMotion") return {
34831
- mode,
34832
- thresholdDbfs: void 0
34833
- };
34834
- return {
34835
- mode,
34836
- preBufferSec: 0,
34837
- postBufferSec: 0,
34838
- thresholdDbfs: void 0
34839
- };
34840
- }
34841
- function TimeOfDayRow({ schedule, onChange }) {
34842
- const toggleDay = (d) => {
34843
- const cur = schedule.days ?? [
34844
- 0,
34845
- 1,
34846
- 2,
34847
- 3,
34848
- 4,
34849
- 5,
34850
- 6
34851
- ];
34852
- const days = cur.includes(d) ? cur.filter((x) => x !== d) : [...cur, d].toSorted((a, b) => a - b);
34853
- onChange({
34854
- ...schedule,
34855
- days
34856
- });
34857
- };
34858
- return /* @__PURE__ */ jsxs("div", {
34859
- className: "flex flex-wrap items-center gap-2 text-xs",
34860
- children: [
34861
- /* @__PURE__ */ jsx("input", {
34862
- type: "time",
34863
- value: schedule.start,
34864
- onChange: (e) => onChange({
34865
- ...schedule,
34866
- start: e.target.value
34867
- }),
34868
- className: "rounded-md border border-border bg-background px-2 py-1 text-xs"
34869
- }),
34870
- /* @__PURE__ */ jsx("span", { children: "–" }),
34871
- /* @__PURE__ */ jsx("input", {
34872
- type: "time",
34873
- value: schedule.end,
34874
- onChange: (e) => onChange({
34875
- ...schedule,
34876
- end: e.target.value
34877
- }),
34878
- className: "rounded-md border border-border bg-background px-2 py-1 text-xs"
34879
- }),
34880
- /* @__PURE__ */ jsx("div", {
34881
- className: "flex gap-1",
34882
- children: DAYS.map(({ d, label }) => {
34883
- return /* @__PURE__ */ jsx("button", {
34884
- type: "button",
34885
- onClick: () => toggleDay(d),
34886
- className: `h-6 w-6 rounded text-[10px] ${!schedule.days || schedule.days.includes(d) ? "bg-primary text-primary-foreground" : "bg-surface-hover text-foreground-subtle"}`,
34887
- children: label
34888
- }, d);
34889
- })
34890
- })
34891
- ]
34892
- });
34893
- }
34894
- function RecordingRulesEditor({ rules, onChange }) {
34895
- return /* @__PURE__ */ jsxs("div", {
34896
- className: "space-y-2",
34897
- children: [
34898
- rules.length === 0 ? /* @__PURE__ */ jsx("p", {
34899
- className: "text-xs text-foreground-subtle",
34900
- children: "No rules — recording is continuous (always) when enabled."
34901
- }) : null,
34902
- rules.map((rule, i) => /* @__PURE__ */ jsxs("div", {
34903
- className: "space-y-2 rounded-lg border border-border bg-surface p-3",
34904
- children: [
34905
- /* @__PURE__ */ jsxs("div", {
34906
- className: "flex items-center justify-between gap-2",
34907
- children: [/* @__PURE__ */ jsxs("select", {
34908
- className: "rounded-md border border-border bg-background px-2 py-1 text-xs",
34909
- value: rule.schedule.kind,
34910
- onChange: (e) => {
34911
- onChange(withRuleAt(rules, i, { schedule: e.target.value === "timeOfDay" ? {
34912
- kind: "timeOfDay",
34913
- start: "00:00",
34914
- end: "23:59"
34915
- } : { kind: "always" } }));
34916
- },
34917
- children: [/* @__PURE__ */ jsx("option", {
34918
- value: "always",
34919
- children: "Always"
34920
- }), /* @__PURE__ */ jsx("option", {
34921
- value: "timeOfDay",
34922
- children: "Time of day"
34923
- })]
34924
- }), /* @__PURE__ */ jsx("button", {
34925
- type: "button",
34926
- onClick: () => onChange(removeRuleAt(rules, i)),
34927
- className: "text-foreground-subtle hover:text-red-500",
34928
- children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4" })
34929
- })]
34930
- }),
34931
- rule.schedule.kind === "timeOfDay" ? /* @__PURE__ */ jsx(TimeOfDayRow, {
34932
- schedule: rule.schedule,
34933
- onChange: (schedule) => onChange(withRuleAt(rules, i, { schedule }))
34934
- }) : null,
34935
- /* @__PURE__ */ jsxs("div", {
34936
- className: "flex flex-wrap items-center gap-2 text-xs",
34937
- children: [
34938
- /* @__PURE__ */ jsxs("select", {
34939
- className: "rounded-md border border-border bg-background px-2 py-1 text-xs",
34940
- value: rule.mode,
34941
- onChange: (e) => onChange(withRuleAt(rules, i, modePatch(rule, toMode(e.target.value)))),
34942
- children: [
34943
- /* @__PURE__ */ jsx("option", {
34944
- value: "continuous",
34945
- children: "Continuous"
34946
- }),
34947
- /* @__PURE__ */ jsx("option", {
34948
- value: "onMotion",
34949
- children: "On motion"
34950
- }),
34951
- /* @__PURE__ */ jsx("option", {
34952
- value: "onAudioThreshold",
34953
- children: "On audio"
34954
- })
34955
- ]
34956
- }),
34957
- isTriggerMode(rule.mode) ? /* @__PURE__ */ jsxs(Fragment$1, { children: [
34958
- /* @__PURE__ */ jsxs("label", {
34959
- className: "flex items-center gap-1",
34960
- children: [
34961
- "pre",
34962
- /* @__PURE__ */ jsx("input", {
34963
- type: "number",
34964
- min: 0,
34965
- value: rule.preBufferSec,
34966
- onChange: (e) => onChange(withRuleAt(rules, i, { preBufferSec: Number(e.target.value) })),
34967
- className: "w-14 rounded-md border border-border bg-background px-1 py-1 text-xs"
34968
- }),
34969
- "s"
34970
- ]
34971
- }),
34972
- /* @__PURE__ */ jsxs("label", {
34973
- className: "flex items-center gap-1",
34974
- children: [
34975
- "post",
34976
- /* @__PURE__ */ jsx("input", {
34977
- type: "number",
34978
- min: 0,
34979
- value: rule.postBufferSec,
34980
- onChange: (e) => onChange(withRuleAt(rules, i, { postBufferSec: Number(e.target.value) })),
34981
- className: "w-14 rounded-md border border-border bg-background px-1 py-1 text-xs"
34982
- }),
34983
- "s"
34984
- ]
34985
- }),
34986
- /* @__PURE__ */ jsxs("label", {
34987
- className: "flex items-center gap-1",
34988
- children: [/* @__PURE__ */ jsx("input", {
34989
- type: "checkbox",
34990
- checked: rule.resetTimeoutOnNewEvent,
34991
- onChange: (e) => onChange(withRuleAt(rules, i, { resetTimeoutOnNewEvent: e.target.checked }))
34992
- }), "reset"]
34993
- })
34994
- ] }) : null,
34995
- rule.mode === "onAudioThreshold" ? /* @__PURE__ */ jsxs("label", {
34996
- className: "flex items-center gap-1",
34997
- children: [
34998
- "thr",
34999
- /* @__PURE__ */ jsx("input", {
35000
- type: "number",
35001
- value: rule.thresholdDbfs ?? -30,
35002
- onChange: (e) => onChange(withRuleAt(rules, i, { thresholdDbfs: Number(e.target.value) })),
35003
- className: "w-16 rounded-md border border-border bg-background px-1 py-1 text-xs"
35004
- }),
35005
- "dBFS"
35006
- ]
35007
- }) : null
35008
- ]
35009
- })
35010
- ]
35011
- }, i)),
35012
- /* @__PURE__ */ jsxs("button", {
35013
- type: "button",
35014
- onClick: () => onChange([...rules, emptyRule()]),
35015
- className: "flex items-center gap-1 rounded-md border border-dashed border-border px-3 py-1.5 text-xs text-foreground-subtle hover:border-primary hover:text-foreground",
35016
- children: [/* @__PURE__ */ jsx(Plus, { className: "h-3.5 w-3.5" }), " Add rule"]
35017
- })
35018
- ]
35019
- });
34828
+ /** The Base tab's bands: one always-on band of the chosen mode (none = off). */
34829
+ function bandsFromFormState(state) {
34830
+ if (state.mode === "off") return [];
34831
+ if (state.mode === "continuous") return [alwaysBand("continuous")];
34832
+ return [alwaysBand("events", {
34833
+ ...Object.keys(state.triggers).length > 0 ? { triggers: state.triggers } : {},
34834
+ ...state.preBufferSec !== void 0 ? { preBufferSec: state.preBufferSec } : {},
34835
+ ...state.postBufferSec !== void 0 ? { postBufferSec: state.postBufferSec } : {}
34836
+ })];
35020
34837
  }
35021
34838
  //#endregion
35022
- //#region src/composites/cap-settings/ScheduleBandsEditor.tsx
34839
+ //#region src/composites/cap-settings/RecordingBandsEditor.tsx
35023
34840
  /** Weekday chips in display order (Mon→Sun); value is `Date.getDay()` (0=Sun). */
35024
34841
  var WEEKDAYS = [
35025
34842
  {
@@ -35051,115 +34868,177 @@ var WEEKDAYS = [
35051
34868
  label: "Sun"
35052
34869
  }
35053
34870
  ];
35054
- function newBand() {
35055
- return {
35056
- kind: "timeOfDay",
35057
- start: "09:00",
35058
- end: "18:00"
35059
- };
35060
- }
35061
- function ScheduleBandsEditor({ schedules, onChange }) {
35062
- const replaceAt = (i, band) => onChange(schedules.map((s, idx) => idx === i ? band : s));
35063
- const removeAt = (i) => onChange(schedules.filter((_, idx) => idx !== i));
35064
- const addBand = () => onChange([...schedules, newBand()]);
34871
+ var BAND_MODES = [{
34872
+ value: "continuous",
34873
+ label: "Continuous"
34874
+ }, {
34875
+ value: "events",
34876
+ label: "Events"
34877
+ }];
34878
+ /**
34879
+ * The band table the ONLY authoring surface for recording intent since the
34880
+ * legacy mode/schedules/triggers/rules model was retired (2026-07-30).
34881
+ *
34882
+ * Each row is one `RecordingBand`: when it applies (weekdays + `HH:MM` span,
34883
+ * `end <= start` wraps past midnight) and how it records (continuous, or events
34884
+ * with its own triggers and pre/post buffers). No band covering *now* = nothing
34885
+ * is recorded then; "off" is the absence of a band, never a band value.
34886
+ */
34887
+ function RecordingBandsEditor({ bands, onChange }) {
35065
34888
  return /* @__PURE__ */ jsxs("div", {
35066
34889
  className: "space-y-2",
35067
- children: [schedules.length === 0 ? /* @__PURE__ */ jsx("p", {
34890
+ children: [bands.length === 0 ? /* @__PURE__ */ jsx("p", {
35068
34891
  className: "text-[11px] text-foreground-subtle",
35069
- children: "Always (24/7)add a band to restrict hours."
35070
- }) : schedules.map((band, i) => /* @__PURE__ */ jsx(BandRow, {
34892
+ children: "No bandsnothing is recorded. Add one to start."
34893
+ }) : bands.map((band, i) => /* @__PURE__ */ jsx(BandRow, {
35071
34894
  band,
35072
- onChange: (b) => replaceAt(i, b),
35073
- onRemove: () => removeAt(i)
34895
+ onChange: (patch) => onChange(withBandAt(bands, i, patch)),
34896
+ onRemove: () => onChange(removeBandAt(bands, i))
35074
34897
  }, i)), /* @__PURE__ */ jsxs("button", {
35075
34898
  type: "button",
35076
- onClick: addBand,
34899
+ onClick: () => onChange([...bands, emptyBand()]),
35077
34900
  className: "flex items-center gap-1 rounded-md bg-surface-hover px-2 py-1 text-[11px] text-foreground-subtle hover:text-foreground",
35078
34901
  children: [/* @__PURE__ */ jsx(Plus, { className: "h-3 w-3" }), " Add band"]
35079
34902
  })]
35080
34903
  });
35081
34904
  }
34905
+ function numOrUndef(value) {
34906
+ return value === "" ? void 0 : Number(value);
34907
+ }
35082
34908
  function BandRow({ band, onChange, onRemove }) {
35083
- if (band.kind === "always") return /* @__PURE__ */ jsxs("div", {
35084
- className: "flex items-center gap-2 text-xs",
35085
- children: [
35086
- /* @__PURE__ */ jsx("span", {
35087
- className: "flex-1",
35088
- children: "Always"
35089
- }),
35090
- /* @__PURE__ */ jsx("button", {
35091
- type: "button",
35092
- onClick: () => onChange(newBand()),
35093
- className: "text-foreground-subtle hover:text-foreground underline",
35094
- children: "Set band"
35095
- }),
35096
- /* @__PURE__ */ jsx("button", {
35097
- type: "button",
35098
- onClick: onRemove,
35099
- "aria-label": "Remove band",
35100
- className: "text-foreground-subtle hover:text-red-500",
35101
- children: /* @__PURE__ */ jsx(Trash2, { className: "h-3.5 w-3.5" })
35102
- })
35103
- ]
35104
- });
35105
- const days = band.days ?? [];
35106
34909
  const toggleDay = (value) => {
35107
- const next = days.includes(value) ? days.filter((d) => d !== value) : [...days, value];
35108
- onChange({
35109
- ...band,
35110
- days: next.length > 0 ? next : void 0
35111
- });
34910
+ const current = band.days.length === 0 ? WEEKDAYS.map((d) => d.value) : band.days;
34911
+ onChange({ days: current.includes(value) ? current.filter((d) => d !== value) : [...current, value] });
35112
34912
  };
34913
+ const setTriggers = (patch) => onChange({ triggers: {
34914
+ ...band.triggers,
34915
+ ...patch
34916
+ } });
35113
34917
  return /* @__PURE__ */ jsxs("div", {
35114
34918
  className: "space-y-1.5 rounded-md border border-border p-2",
35115
- children: [/* @__PURE__ */ jsxs("div", {
35116
- className: "flex items-center gap-2 text-xs",
35117
- children: [
35118
- /* @__PURE__ */ jsx("input", {
35119
- type: "time",
35120
- value: band.start,
35121
- onChange: (e) => onChange({
35122
- ...band,
35123
- start: e.target.value
34919
+ children: [
34920
+ /* @__PURE__ */ jsxs("div", {
34921
+ className: "flex flex-wrap items-center gap-2 text-xs",
34922
+ children: [
34923
+ /* @__PURE__ */ jsx("input", {
34924
+ type: "time",
34925
+ "aria-label": "Band start",
34926
+ value: band.start,
34927
+ onChange: (e) => onChange({ start: e.target.value }),
34928
+ className: "rounded-md border border-border bg-background px-1 py-0.5"
35124
34929
  }),
35125
- className: "rounded-md border border-border bg-background px-1 py-0.5"
35126
- }),
35127
- /* @__PURE__ */ jsx("span", {
35128
- className: "text-foreground-subtle",
35129
- children: "→"
35130
- }),
35131
- /* @__PURE__ */ jsx("input", {
35132
- type: "time",
35133
- value: band.end,
35134
- onChange: (e) => onChange({
35135
- ...band,
35136
- end: e.target.value
34930
+ /* @__PURE__ */ jsx("span", {
34931
+ className: "text-foreground-subtle",
34932
+ children: ""
35137
34933
  }),
35138
- className: "rounded-md border border-border bg-background px-1 py-0.5"
35139
- }),
35140
- /* @__PURE__ */ jsx("span", { className: "flex-1" }),
35141
- /* @__PURE__ */ jsx("button", {
35142
- type: "button",
35143
- onClick: onRemove,
35144
- "aria-label": "Remove band",
35145
- className: "text-foreground-subtle hover:text-red-500",
35146
- children: /* @__PURE__ */ jsx(Trash2, { className: "h-3.5 w-3.5" })
35147
- })
35148
- ]
35149
- }), /* @__PURE__ */ jsxs("div", {
35150
- className: "flex flex-wrap gap-1",
35151
- children: [WEEKDAYS.map((d) => {
35152
- return /* @__PURE__ */ jsx("button", {
35153
- type: "button",
35154
- onClick: () => toggleDay(d.value),
35155
- className: `rounded px-1.5 py-0.5 text-[10px] ${days.includes(d.value) ? "bg-primary text-primary-foreground" : "bg-surface-hover text-foreground-subtle"}`,
35156
- children: d.label
35157
- }, d.value);
35158
- }), days.length === 0 ? /* @__PURE__ */ jsx("span", {
35159
- className: "self-center text-[10px] text-foreground-subtle",
35160
- children: "every day"
35161
- }) : null]
35162
- })]
34934
+ /* @__PURE__ */ jsx("input", {
34935
+ type: "time",
34936
+ "aria-label": "Band end",
34937
+ value: band.end,
34938
+ onChange: (e) => onChange({ end: e.target.value }),
34939
+ className: "rounded-md border border-border bg-background px-1 py-0.5"
34940
+ }),
34941
+ /* @__PURE__ */ jsx("span", {
34942
+ className: "flex gap-1",
34943
+ children: BAND_MODES.map((m) => /* @__PURE__ */ jsx("button", {
34944
+ type: "button",
34945
+ onClick: () => onChange({ mode: m.value }),
34946
+ className: `rounded px-2 py-0.5 ${band.mode === m.value ? "bg-primary text-primary-foreground" : "bg-surface-hover text-foreground-subtle"}`,
34947
+ children: m.label
34948
+ }, m.value))
34949
+ }),
34950
+ /* @__PURE__ */ jsx("span", { className: "flex-1" }),
34951
+ /* @__PURE__ */ jsx("button", {
34952
+ type: "button",
34953
+ onClick: onRemove,
34954
+ "aria-label": "Remove band",
34955
+ className: "text-foreground-subtle hover:text-red-500",
34956
+ children: /* @__PURE__ */ jsx(Trash2, { className: "h-3.5 w-3.5" })
34957
+ })
34958
+ ]
34959
+ }),
34960
+ /* @__PURE__ */ jsxs("div", {
34961
+ className: "flex flex-wrap gap-1",
34962
+ children: [WEEKDAYS.map((d) => {
34963
+ return /* @__PURE__ */ jsx("button", {
34964
+ type: "button",
34965
+ onClick: () => toggleDay(d.value),
34966
+ className: `rounded px-1.5 py-0.5 text-[10px] ${band.days.length === 0 || band.days.includes(d.value) ? "bg-primary text-primary-foreground" : "bg-surface-hover text-foreground-subtle"}`,
34967
+ children: d.label
34968
+ }, d.value);
34969
+ }), band.days.length === 0 ? /* @__PURE__ */ jsx("span", {
34970
+ className: "self-center text-[10px] text-foreground-subtle",
34971
+ children: "every day"
34972
+ }) : null]
34973
+ }),
34974
+ band.mode === "events" ? /* @__PURE__ */ jsxs("div", {
34975
+ className: "space-y-1.5 border-t border-border pt-1.5",
34976
+ children: [
34977
+ /* @__PURE__ */ jsxs("label", {
34978
+ className: "flex items-center gap-2 text-xs",
34979
+ children: [/* @__PURE__ */ jsx("input", {
34980
+ type: "checkbox",
34981
+ checked: band.triggers?.motion ?? false,
34982
+ onChange: (e) => setTriggers({ motion: e.target.checked ? true : void 0 })
34983
+ }), "Motion"]
34984
+ }),
34985
+ /* @__PURE__ */ jsxs("label", {
34986
+ className: "flex items-center gap-2 text-xs",
34987
+ children: [
34988
+ /* @__PURE__ */ jsx("input", {
34989
+ type: "checkbox",
34990
+ checked: band.triggers?.audioThresholdDbfs != null,
34991
+ onChange: (e) => setTriggers({ audioThresholdDbfs: e.target.checked ? -30 : void 0 })
34992
+ }),
34993
+ "Audio above threshold",
34994
+ band.triggers?.audioThresholdDbfs != null ? /* @__PURE__ */ jsx("input", {
34995
+ type: "number",
34996
+ "aria-label": "Audio threshold dBFS",
34997
+ value: band.triggers.audioThresholdDbfs,
34998
+ onChange: (e) => setTriggers({ audioThresholdDbfs: numOrUndef(e.target.value) }),
34999
+ className: "w-16 rounded-md border border-border bg-background px-1 py-0.5 text-xs"
35000
+ }) : null,
35001
+ /* @__PURE__ */ jsx("span", {
35002
+ className: "text-foreground-subtle",
35003
+ children: "dBFS"
35004
+ })
35005
+ ]
35006
+ }),
35007
+ /* @__PURE__ */ jsxs("div", {
35008
+ className: "flex flex-wrap items-center gap-3 text-xs",
35009
+ children: [/* @__PURE__ */ jsxs("label", {
35010
+ className: "flex items-center gap-1",
35011
+ children: [
35012
+ "Pre-buffer",
35013
+ /* @__PURE__ */ jsx("input", {
35014
+ type: "number",
35015
+ min: 0,
35016
+ value: band.preBufferSec ?? "",
35017
+ placeholder: "0",
35018
+ onChange: (e) => onChange({ preBufferSec: numOrUndef(e.target.value) }),
35019
+ className: "w-16 rounded-md border border-border bg-background px-1 py-1 text-xs"
35020
+ }),
35021
+ "s"
35022
+ ]
35023
+ }), /* @__PURE__ */ jsxs("label", {
35024
+ className: "flex items-center gap-1",
35025
+ children: [
35026
+ "Post-buffer",
35027
+ /* @__PURE__ */ jsx("input", {
35028
+ type: "number",
35029
+ min: 0,
35030
+ value: band.postBufferSec ?? "",
35031
+ placeholder: "0",
35032
+ onChange: (e) => onChange({ postBufferSec: numOrUndef(e.target.value) }),
35033
+ className: "w-16 rounded-md border border-border bg-background px-1 py-1 text-xs"
35034
+ }),
35035
+ "s"
35036
+ ]
35037
+ })]
35038
+ })
35039
+ ]
35040
+ }) : null
35041
+ ]
35163
35042
  });
35164
35043
  }
35165
35044
  //#endregion
@@ -35183,16 +35062,15 @@ var MODES = [
35183
35062
  label: "Continuous"
35184
35063
  }
35185
35064
  ];
35186
- function RecordingSettings({ initial, saving, onSave }) {
35065
+ function RecordingSettings({ initial, saving, onSave, onRegenerateStrips, regeneratingStrips }) {
35187
35066
  const [tab, setTab] = useState(isAdvancedConfig(initial) ? "advanced" : "base");
35188
35067
  const [base, setBase] = useState(formStateFromConfig(initial));
35189
- const [advEnabled, setAdvEnabled] = useState(initial.enabled);
35190
- const [rules, setRules] = useState(initial.rules ? [...initial.rules] : []);
35068
+ const [bands, setBands] = useState([...initial.bands]);
35191
35069
  const [common, setCommon] = useState({
35192
35070
  profiles: initial.profiles,
35193
35071
  segmentSeconds: initial.segmentSeconds,
35194
35072
  retention: initial.retention,
35195
- scrubThumbnails: initial.scrubThumbnails
35073
+ stripsEnabled: initial.stripsEnabled
35196
35074
  });
35197
35075
  const ret = common.retention ?? {};
35198
35076
  const setRet = (patch) => setCommon({
@@ -35203,10 +35081,6 @@ function RecordingSettings({ initial, saving, onSave }) {
35203
35081
  }
35204
35082
  });
35205
35083
  const numOrUndef = (v) => v === "" ? void 0 : Number(v);
35206
- const parsePreset = (v) => {
35207
- const parsed = ScrubThumbnailPresetSchema.safeParse(v);
35208
- return parsed.success ? parsed.data : DEFAULT_SCRUB_THUMBNAIL_PRESET;
35209
- };
35210
35084
  const toggleProfile = (p) => {
35211
35085
  const cur = common.profiles ?? [...PROFILES];
35212
35086
  const next = cur.includes(p) ? cur.filter((x) => x !== p) : [...cur, p];
@@ -35223,24 +35097,31 @@ function RecordingSettings({ initial, saving, onSave }) {
35223
35097
  }
35224
35098
  });
35225
35099
  const switchTab = (next) => {
35226
- if (next === "advanced" && rules.length === 0) setRules([emptyRule()]);
35100
+ if (next === "advanced") setBands(bandsFromFormState(base));
35101
+ else setBase(formStateFromConfig({
35102
+ enabled: bands.length > 0,
35103
+ bands
35104
+ }));
35227
35105
  setTab(next);
35228
35106
  };
35229
35107
  const handleSave = () => {
35230
- if (tab === "base") onSave(configFromFormState({
35231
- ...base,
35232
- profiles: common.profiles,
35233
- segmentSeconds: common.segmentSeconds,
35234
- retention: common.retention,
35235
- scrubThumbnails: common.scrubThumbnails
35236
- }));
35237
- else onSave({
35238
- enabled: advEnabled,
35239
- rules,
35108
+ const shared = {
35240
35109
  profiles: common.profiles ? [...common.profiles] : void 0,
35241
35110
  segmentSeconds: common.segmentSeconds,
35242
35111
  retention: common.retention,
35243
- scrubThumbnails: common.scrubThumbnails
35112
+ ...common.stripsEnabled === void 0 ? {} : { stripsEnabled: common.stripsEnabled }
35113
+ };
35114
+ if (tab === "base") onSave({
35115
+ ...configFromFormState({
35116
+ ...base,
35117
+ ...shared
35118
+ }),
35119
+ ...shared
35120
+ });
35121
+ else onSave({
35122
+ enabled: bands.length > 0,
35123
+ bands,
35124
+ ...shared
35244
35125
  });
35245
35126
  };
35246
35127
  return /* @__PURE__ */ jsxs("div", {
@@ -35252,7 +35133,7 @@ function RecordingSettings({ initial, saving, onSave }) {
35252
35133
  type: "button",
35253
35134
  onClick: () => switchTab(t),
35254
35135
  className: `rounded px-2.5 py-1 ${tab === t ? "bg-primary text-primary-foreground" : "bg-surface-hover text-foreground-subtle"}`,
35255
- children: t === "base" ? "Base" : "Advanced (rules)"
35136
+ children: t === "base" ? "Base" : "Advanced (bands)"
35256
35137
  }, t))
35257
35138
  }),
35258
35139
  tab === "base" ? /* @__PURE__ */ jsxs("div", {
@@ -35273,16 +35154,17 @@ function RecordingSettings({ initial, saving, onSave }) {
35273
35154
  children: m.label
35274
35155
  }, m.value))]
35275
35156
  }),
35276
- base.mode !== "off" ? /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
35277
- className: "mb-1.5 text-[11px] font-semibold uppercase tracking-wider text-foreground-subtle",
35278
- children: "Time bands"
35279
- }), /* @__PURE__ */ jsx(ScheduleBandsEditor, {
35280
- schedules: base.schedules,
35281
- onChange: (schedules) => setBase({
35282
- ...base,
35283
- schedules
35284
- })
35285
- })] }) : null,
35157
+ base.mode !== "off" ? /* @__PURE__ */ jsxs("p", {
35158
+ className: "text-[11px] text-foreground-subtle",
35159
+ children: [
35160
+ "Records 24/7. Use ",
35161
+ /* @__PURE__ */ jsx("span", {
35162
+ className: "font-medium",
35163
+ children: "Advanced (bands)"
35164
+ }),
35165
+ " to restrict hours or weekdays, or to mix continuous and event windows."
35166
+ ]
35167
+ }) : null,
35286
35168
  base.mode === "events" ? /* @__PURE__ */ jsxs("div", {
35287
35169
  className: "space-y-2",
35288
35170
  children: [
@@ -35360,22 +35242,22 @@ function RecordingSettings({ initial, saving, onSave }) {
35360
35242
  ]
35361
35243
  }) : null
35362
35244
  ]
35363
- }) : /* @__PURE__ */ jsxs("div", {
35245
+ }) : /* @__PURE__ */ jsx("div", {
35364
35246
  className: "space-y-4",
35365
- children: [/* @__PURE__ */ jsxs("label", {
35366
- className: "flex items-center gap-2 text-xs",
35367
- children: [/* @__PURE__ */ jsx("input", {
35368
- type: "checkbox",
35369
- checked: advEnabled,
35370
- onChange: (e) => setAdvEnabled(e.target.checked)
35371
- }), "Record this camera"]
35372
- }), /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
35373
- className: "mb-1.5 text-[11px] font-semibold uppercase tracking-wider text-foreground-subtle",
35374
- children: "Rules"
35375
- }), /* @__PURE__ */ jsx(RecordingRulesEditor, {
35376
- rules,
35377
- onChange: setRules
35378
- })] })]
35247
+ children: /* @__PURE__ */ jsxs("div", { children: [
35248
+ /* @__PURE__ */ jsx("div", {
35249
+ className: "mb-1.5 text-[11px] font-semibold uppercase tracking-wider text-foreground-subtle",
35250
+ children: "Recording bands"
35251
+ }),
35252
+ /* @__PURE__ */ jsx(RecordingBandsEditor, {
35253
+ bands,
35254
+ onChange: setBands
35255
+ }),
35256
+ /* @__PURE__ */ jsx("p", {
35257
+ className: "mt-1.5 text-[11px] text-foreground-subtle",
35258
+ children: "A band says WHEN to record and HOW. Nothing is recorded outside every band — an empty table means this camera is off."
35259
+ })
35260
+ ] })
35379
35261
  }),
35380
35262
  /* @__PURE__ */ jsxs("div", {
35381
35263
  className: "flex flex-wrap items-center gap-4 text-xs",
@@ -35414,27 +35296,30 @@ function RecordingSettings({ initial, saving, onSave }) {
35414
35296
  }),
35415
35297
  /* @__PURE__ */ jsxs("label", {
35416
35298
  className: "flex items-center gap-1",
35417
- children: [/* @__PURE__ */ jsx("span", {
35418
- className: "text-foreground-subtle",
35419
- children: "Scrub preview quality"
35420
- }), /* @__PURE__ */ jsx("select", {
35421
- value: common.scrubThumbnails ?? DEFAULT_SCRUB_THUMBNAIL_PRESET,
35299
+ children: [/* @__PURE__ */ jsx("input", {
35300
+ type: "checkbox",
35301
+ checked: common.stripsEnabled === true,
35422
35302
  onChange: (e) => setCommon({
35423
35303
  ...common,
35424
- scrubThumbnails: parsePreset(e.target.value)
35425
- }),
35426
- className: "rounded-md border border-border bg-background px-1 py-1 text-xs",
35427
- children: SCRUB_THUMBNAIL_PRESET_ORDER.map((p) => /* @__PURE__ */ jsx("option", {
35428
- value: p,
35429
- children: SCRUB_THUMBNAIL_PRESET_LABELS[p]
35430
- }, p))
35304
+ stripsEnabled: e.target.checked
35305
+ })
35306
+ }), /* @__PURE__ */ jsx("span", {
35307
+ className: "text-foreground-subtle",
35308
+ children: "Scrub thumbnail strips"
35431
35309
  })]
35432
- })
35310
+ }),
35311
+ onRegenerateStrips ? /* @__PURE__ */ jsx("button", {
35312
+ type: "button",
35313
+ onClick: onRegenerateStrips,
35314
+ disabled: regeneratingStrips === true,
35315
+ className: "rounded-md border border-border bg-surface-hover px-2 py-1 text-xs text-foreground-subtle transition-colors hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50",
35316
+ children: regeneratingStrips === true ? "Regenerating…" : "Regenerate strips"
35317
+ }) : null
35433
35318
  ]
35434
35319
  }),
35435
35320
  /* @__PURE__ */ jsx("p", {
35436
35321
  className: "text-[11px] text-foreground-subtle",
35437
- children: "Timeline scrub-preview resolution + quality. Higher = crisper previews but larger sprite sheets. Applies to NEW recordings only existing preview sheets keep their original resolution."
35322
+ children: "OPT-IN: save every keyframe of the low recording as a JPEG strip for fluid fast scrubbing. Costs disk (a derived cache, reclaimed with the footage). Regenerate clears and rebuilds the recent days from the segments already on disk."
35438
35323
  }),
35439
35324
  /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
35440
35325
  className: "mb-1.5 text-[11px] font-semibold uppercase tracking-wider text-foreground-subtle",
@@ -36683,6 +36568,14 @@ function RecordingPanel({ deviceId }) {
36683
36568
  const configQuery = useRecordingGetDeviceConfig({ deviceId });
36684
36569
  const setConfig = useRecordingSetDeviceConfig();
36685
36570
  const rescanStorage = useRecordingRescanStorage();
36571
+ const customAction = useAddonsCustom();
36572
+ const regenerateStrips = useCallback(() => {
36573
+ customAction.mutate({
36574
+ addonId: "recorder",
36575
+ action: "regenerateStrips",
36576
+ input: { deviceId }
36577
+ });
36578
+ }, [customAction, deviceId]);
36686
36579
  const saveConfig = (config) => {
36687
36580
  setConfig.mutate({
36688
36581
  deviceId,
@@ -36724,7 +36617,9 @@ function RecordingPanel({ deviceId }) {
36724
36617
  children: resolvedConfig ? /* @__PURE__ */ jsx(RecordingSettings, {
36725
36618
  initial: resolvedConfig,
36726
36619
  saving: setConfig.isPending,
36727
- onSave: saveConfig
36620
+ onSave: saveConfig,
36621
+ onRegenerateStrips: regenerateStrips,
36622
+ regeneratingStrips: customAction.isPending
36728
36623
  }, JSON.stringify(resolvedConfig)) : /* @__PURE__ */ jsx("div", {
36729
36624
  className: "px-1 py-2 text-xs text-foreground-subtle",
36730
36625
  children: "Loading settings…"
@@ -40290,6 +40185,21 @@ function DetectionBoxes({ detections, frameWidth, frameHeight }) {
40290
40185
  }
40291
40186
  //#endregion
40292
40187
  //#region src/composites/camera-stream-player.tsx
40188
+ /**
40189
+ * Silence (or restore) a live WebRTC stream FOR REAL.
40190
+ *
40191
+ * `video.muted` alone is not enough: iOS WebKit keeps playing a
40192
+ * `MediaStream`'s audio track through a muted element, which is why live audio
40193
+ * kept sounding under recorded playback on the viewer. Gating the audio TRACK
40194
+ * (`track.enabled`) is what actually stops it, so both are set together — and
40195
+ * re-applied at every stream swap, because a freshly-attached stream arrives
40196
+ * with its tracks enabled whatever the element says.
40197
+ */
40198
+ function applyStreamMute(video, muted) {
40199
+ video.muted = muted;
40200
+ const stream = video.srcObject;
40201
+ if (stream instanceof MediaStream) for (const track of stream.getAudioTracks()) track.enabled = !muted;
40202
+ }
40293
40203
  function isTouchDevice() {
40294
40204
  if (typeof window === "undefined") return false;
40295
40205
  return window.matchMedia("(hover: none) and (pointer: coarse)").matches || typeof navigator !== "undefined" && navigator.maxTouchPoints > 0 || "ontouchstart" in window;
@@ -40372,6 +40282,11 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
40372
40282
  const [state, setState] = useState("idle");
40373
40283
  const [errorMessage, setErrorMessage] = useState("");
40374
40284
  const [isMuted, setIsMuted] = useState(initialMuted);
40285
+ /** Read by the async stream-swap closures: a freshly-promoted stream must
40286
+ * arrive already respecting the CURRENT mute, not the one captured at
40287
+ * connect time. */
40288
+ const isMutedRef = useRef(isMuted);
40289
+ isMutedRef.current = isMuted;
40375
40290
  const [isFullscreen, setIsFullscreen] = useState(false);
40376
40291
  const [isPipSupported, setIsPipSupported] = useState(false);
40377
40292
  const isTouch = isTouchDevice();
@@ -40501,6 +40416,7 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
40501
40416
  pcRef.current = pc;
40502
40417
  if (videoRef.current) {
40503
40418
  videoRef.current.srcObject = combinedStream;
40419
+ applyStreamMute(videoRef.current, isMutedRef.current);
40504
40420
  videoRef.current.play().catch(() => {});
40505
40421
  }
40506
40422
  if (oldPc && oldPc !== pc) try {
@@ -40520,6 +40436,7 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
40520
40436
  }
40521
40437
  if (videoRef.current) {
40522
40438
  videoRef.current.srcObject = combinedStream;
40439
+ applyStreamMute(videoRef.current, isMutedRef.current);
40523
40440
  videoRef.current.play().catch(() => {});
40524
40441
  }
40525
40442
  };
@@ -40606,6 +40523,7 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
40606
40523
  whepStream.addTrack(event.track);
40607
40524
  if (videoRef.current) {
40608
40525
  videoRef.current.srcObject = whepStream;
40526
+ applyStreamMute(videoRef.current, isMutedRef.current);
40609
40527
  videoRef.current.play().catch(() => {});
40610
40528
  }
40611
40529
  };
@@ -40678,6 +40596,7 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
40678
40596
  pcRef.current = pc;
40679
40597
  if (videoRef.current) {
40680
40598
  videoRef.current.srcObject = combinedStream;
40599
+ applyStreamMute(videoRef.current, isMutedRef.current);
40681
40600
  videoRef.current.play().catch(() => {});
40682
40601
  }
40683
40602
  if (oldPc && oldPc !== pc) try {
@@ -40698,6 +40617,7 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
40698
40617
  }
40699
40618
  if (videoRef.current) {
40700
40619
  videoRef.current.srcObject = combinedStream;
40620
+ applyStreamMute(videoRef.current, isMutedRef.current);
40701
40621
  videoRef.current.play().catch(() => {});
40702
40622
  }
40703
40623
  };
@@ -41022,7 +40942,7 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
41022
40942
  mountedRef.current = false;
41023
40943
  cleanup();
41024
40944
  };
41025
- }, [serverUrl, streamKey]);
40945
+ }, []);
41026
40946
  const hasSignaledRef = useRef(false);
41027
40947
  useEffect(() => {
41028
40948
  if (!autoPlay) return;
@@ -41060,6 +40980,23 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
41060
40980
  }
41061
40981
  connect();
41062
40982
  };
40983
+ const prevServerUrlRef = useRef(serverUrl);
40984
+ const prevStreamKeyRef = useRef(streamKey);
40985
+ useEffect(() => {
40986
+ const serverChanged = prevServerUrlRef.current !== serverUrl;
40987
+ const keyChanged = prevStreamKeyRef.current !== streamKey;
40988
+ prevServerUrlRef.current = serverUrl;
40989
+ prevStreamKeyRef.current = streamKey;
40990
+ if (!serverChanged && !keyChanged) return;
40991
+ if (!mountedRef.current) return;
40992
+ reconnectAttemptsRef.current = 0;
40993
+ if (serverChanged) {
40994
+ cleanup();
40995
+ connect();
40996
+ return;
40997
+ }
40998
+ handleSeamlessReconnect();
40999
+ }, [serverUrl, streamKey]);
41063
41000
  const prevReconnectSignalRef = useRef(reconnectSignal);
41064
41001
  useEffect(() => {
41065
41002
  if (prevReconnectSignalRef.current === reconnectSignal) return;
@@ -41069,8 +41006,9 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
41069
41006
  }, [reconnectSignal]);
41070
41007
  const toggleMute = () => {
41071
41008
  if (videoRef.current) {
41072
- videoRef.current.muted = !videoRef.current.muted;
41073
- setIsMuted(videoRef.current.muted);
41009
+ const next = !videoRef.current.muted;
41010
+ applyStreamMute(videoRef.current, next);
41011
+ setIsMuted(next);
41074
41012
  }
41075
41013
  };
41076
41014
  const toggleFullscreen = async () => {
@@ -41298,7 +41236,7 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
41298
41236
  setIsMuted(initialMuted);
41299
41237
  const video = videoRef.current;
41300
41238
  if (!video) return;
41301
- video.muted = initialMuted;
41239
+ applyStreamMute(video, initialMuted);
41302
41240
  if (!initialMuted) video.play().catch(() => {});
41303
41241
  }, [initialMuted]);
41304
41242
  const showToolbarBriefly = () => {
@@ -42410,7 +42348,7 @@ function StreamPanel({ serverUrl, createSession, sendAnswer, handleOffer, getIce
42410
42348
  extraOverlay,
42411
42349
  ptzOverlayVisible && ptzOverlay
42412
42350
  ] }) : void 0
42413
- }, effectiveStreamId)
42351
+ })
42414
42352
  }) : /* @__PURE__ */ jsx(SnapshotPreview, {
42415
42353
  src: snapshotSrc ?? null,
42416
42354
  isLoading: snapshotLoading,
@@ -46791,6 +46729,15 @@ function useDeviceDetections(trpc, deviceId) {
46791
46729
  * @param deviceId - numeric device ID (null = disabled)
46792
46730
  * @param pollIntervalMs - how often to refresh profile slots (default: 5000)
46793
46731
  */
46732
+ /** TTL for the TURN/STUN credential cache. Short enough that rotated creds
46733
+ * are picked up promptly, long enough to cover a connect + several profile
46734
+ * switches without re-paying the fetch. */
46735
+ var TURN_CACHE_TTL_MS = 5 * 6e4;
46736
+ /** Keyed on the caller's trpc client object (stable per connected system —
46737
+ * NOT on `trpc.turnProvider`, which is a proxy minted fresh on every property
46738
+ * access), so two admin tabs pointed at different hubs never cross-serve
46739
+ * credentials. An unstable key degrades to a cache miss, never to wrong creds. */
46740
+ var turnServersCache = /* @__PURE__ */ new WeakMap();
46794
46741
  function useDeviceWebrtc(trpc, deviceId, pollIntervalMs = 5e3) {
46795
46742
  const [remoteStreams, setRemoteStreams] = useState([]);
46796
46743
  useEffect(() => {
@@ -46860,18 +46807,28 @@ function useDeviceWebrtc(trpc, deviceId, pollIntervalMs = 5e3) {
46860
46807
  }, [deviceId, remoteStreams]);
46861
46808
  const getIceServers = useCallback(async () => {
46862
46809
  if (!trpc.turnProvider) return void 0;
46810
+ const cached = turnServersCache.get(trpc);
46811
+ if (cached && Date.now() - cached.fetchedAt < TURN_CACHE_TTL_MS) return cached.servers;
46863
46812
  try {
46864
- return (await trpc.turnProvider.getTurnServers.query()).map((s) => {
46813
+ const mapped = (await trpc.turnProvider.getTurnServers.query()).map((s) => {
46865
46814
  return {
46866
46815
  urls: typeof s.urls === "string" ? s.urls : [...s.urls],
46867
46816
  ...s.username !== void 0 ? { username: s.username } : {},
46868
46817
  ...s.credential !== void 0 ? { credential: s.credential } : {}
46869
46818
  };
46870
46819
  });
46820
+ turnServersCache.set(trpc, {
46821
+ servers: mapped,
46822
+ fetchedAt: Date.now()
46823
+ });
46824
+ return mapped;
46871
46825
  } catch {
46872
- return;
46826
+ return cached?.servers;
46873
46827
  }
46874
46828
  }, [trpc]);
46829
+ useEffect(() => {
46830
+ getIceServers();
46831
+ }, [getIceServers]);
46875
46832
  const createSession = useCallback(async (target, hints) => {
46876
46833
  if (deviceId === null) throw new Error("No device selected");
46877
46834
  const res = await trpc.webrtcSession.createSession.mutate({
@@ -47241,4 +47198,4 @@ var MotionZonesSettings = lazy(() => import("./MotionZonesSettings-NcxxQN8r.js")
47241
47198
  /** Lazy-wrapped `PrivacyMaskSettings` — code-split off the main bundle. */
47242
47199
  var PrivacyMaskSettings = lazy(() => import("./PrivacyMaskSettings-APgPLF7p.js").then((m) => ({ default: m.PrivacyMaskSettings })));
47243
47200
  //#endregion
47244
- export { AddonGlobalSettingsForm, AgentStepEditor, AlarmHeroCard, AlarmInlineControl as AlarmPanelInlineControl, AppShell, ArcKnob, AudioClassificationList, AudioLevelWaveform, AudioWaveform, AutotrackSection, BTN_COMPACT, BTN_COMPACT_DANGER, BTN_COMPACT_PRIMARY, BTN_COMPACT_WARNING, Badge, BatteryBadge, BottomSheet, Breadcrumb, BrightnessPanel, Button, ButtonControl, ButtonHeroCard, CENTER, CHIP_ACTIVE, CHIP_BASE, CHIP_INACTIVE, CLASS_COLORS, COLUMN_BREAKPOINT_CLASS, COLUMN_PRIORITY, COMMIT_DEDUPE_TOLERANCE_MS, COMMIT_DEDUPE_WINDOW_MS, CONTROL_CAP_NAMES, CONTROL_FILLS, CameraStreamPlayer, Card, Checkbox, ChildSectionAccordion, ClimatePanel, CodeBlock, CollapsibleCard, ConfigFormBuilder, FormField as ConfigFormField, ConfigSchemaField, ConfirmActionButton, ConfirmDialogProvider, ConsumablesPanel, ContainerChildrenProvider, ContainerPrimaryHero, ControlColumn, ControlHeroCard, ControlInlineControl, ControlPanel, CopyButton, CoverHeroCard, CoverInlineControl, CoverPanel, CustomFieldRenderersProvider, DEFAULT_COLOR, DEVICE_COLUMNS, DEVICE_LIST_PAGE_SIZE_KEY, DEVICE_LIST_PAGE_SIZE_OPTIONS, DEVICE_ROLE_META, DEVICE_TYPE_CONTROL, DEVICE_TYPE_META, DISPLAY_ICON_REGISTRY, DataTable, DetectionCanvas, DetectionOverlay, DetectionResultTree, DevShell, DeviceActivityPanel, DeviceBatchToolbar, DeviceCard, DeviceContextProvider, DeviceExportPanel, DeviceGrid, DeviceItem, DeviceList, DeviceMultiSelectField, DeviceSelectField, DeviceStepMatrix, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, DiscoveryPanel, DoorbellRecentPanel, Dropdown, DropdownContent, DropdownItem, DropdownTrigger, DummyHeroCard, DummyInline, EVENT_KIND_ICONS, EmptyState, ErrorBox, EventKindGlyph, EventStream, FILL, FanHeroCard, FanInlineControl, FanPanel, FilterBar, FloatingEventStream, FloatingLogStream, FloatingPanel, FormField$1 as FormField, GRID_GAP, GRID_PAIRED, GRID_QUICK_STATS, GripTrack, GroupedModelSelector, HOST_WIDGETS, HlsVideo, HoverZoomImage, HumidifierHeroCard, HumidifierInlineControl, INPUT_COMPACT, IconAction, IconButton, ImageHeroCard, ImageInlineControl, ImageSelector, InferenceConfigSelector, Input, KebabMenu, KeyValueList, LIST_ROW, Label, LawnMowerHeroCard, LawnMowerInlineControl, LightHeroCard, LightInlineControl, LockHeroCard, LockInlineControl, LockPanel, LogStream, LoginForm, MODE_COLOR, MaskShapeCanvas, MediaPlayerHeroCard, MediaPlayerInlineControl, MediaPlayerPanel, MobileDrawer, ModelPicker, MotionZonesSettings, NodeMultiSelectField, NodePicker, NodeSelectField, OfflineBadge, PHASE_CONFIG, PRIORITY, PTZOverlay, PageHeader, PhaseIcon, PipelineBuilder, PipelineRuntimeSelector, PipelineStep, PipelineTreeMatrix, PlayerOverlaysProvider, Popover, PopoverContent, PopoverRowAction, PopoverTrigger, PrimaryChildPicker, PrivacyMaskSettings, ProviderBadge, PtzPanel, QrCode, RECORDED_PLAYBACK_MODES, RIGHT, ROLE_DESCRIPTOR, RadialGauge, RecordedPlaybackProvider, RecordingPanel, ResponseLog, SECTION_BODY, SECTION_CARD, SECTION_HEADER, SPLIT_PANEL_OUTER, SPLIT_PANEL_SIDE, STACK_GAP, STATE_COLOR, ScopePicker, ScrollArea, Select, SemanticBadge, SensorHeroCard, SensorInlineControl, SensorValueAtom, Separator, Sidebar, SidebarItem, Skeleton, SlideOverPanel, SlideToggle, SnapshotButton, StatCard, StateValuesStream, StatusBadge, StepTimings, StepTreeMaster, Stepper, StreamBrokerSelector, StreamPanel, Switch, SwitchHeroCard, SwitchInlineControl, SwitchPanel, SystemProvider, TEXT_FIELD_LABEL, TEXT_HINT, TEXT_METRIC, TEXT_SECTION_LABEL, TEXT_VALUE, TIMEZONES, Tabs, TabsContent, TabsList, TabsTrigger, TapToggle, ThemeProvider, ThermostatHeroCard, ThermostatInlineControl, TimezoneSelector, Tooltip, TooltipContent, TooltipTrigger, VacuumHeroCard, VacuumInlineControl, ValueReadout, ValveHeroCard, ValveInlineControl, VersionBadge, VodPlaybackProvider, WaterHeaterHeroCard, WaterHeaterInlineControl, WeatherHeroCard, WeatherInlineControl, WidgetMetricCard, WidgetPanel, WidgetRegistryProvider, WidgetSlot, ZoneEditingProvider, agentColumnKey, allDeviceTypeFilterOptions, buildStepTreeFromSchema, childEntityId, childListName, cn, columnsForContext, containerChildToRef, countableDevices, coverHighlight, createSharedContext, createTheme, cursorFractionFor, darkColors, defaultTheme, deriveDeviceKind, deviceMatchesFilter, deviceOptionLabel, deviceRoleMeta, deviceRoleMetaOf, deviceTypeMeta, deviceTypeMetaOf, devicesToOptions, ensureMfHostInit, eventKindLabel, filterDeviceOptions, findTimezone, formatControlDateTime, formatLastSeen, formatNumeric, fuzzyMatch, getClassColor, getPhaseVisual, groupAgentColumns, groupChildrenByLayout, hardwareLabel, humidifierTint, createLucideIcon as i, initialScrubState, isAbsentProvider, isFieldVisible, lawnMowerActivityMeta, lightColors, loadRemoteBundle, makeScrubBridge, metadataEntries, metadataString, mirror, mountAddonPage, Square as n, nextSort, normalizeForSearch, overrideEntityIdFromLink, parseRecordedServerMessage, providerIcons, EyeOff as r, resolveContainerPrimary, resolveControlAlign, resolveDeviceControl, resolveDisplayIcon, resolveEventKindIcon, resolvePrimaryChild, resolveSensorDisplay, resolveStepDefaultModel, scrubReducer, selectedDeviceOptions, serializeRecordedCommand, shouldCommit, shouldEmit, shouldUseSingleNode, sortRows, statusIcons, stripParentNamePrefix, Trash2 as t, tankAlert, themeToCss, trpc, useAccessoriesGetStatus, useAccessoriesSetChildHidden, useAddonPagesListPages, useAddonSettingsGetDeviceSettings, useAddonSettingsGetGlobalSettings, 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, useAlertsDismiss, useAlertsEmit, useAlertsGetUnreadCount, useAlertsList, useAlertsMarkAllRead, useAlertsMarkRead, useAlertsUpdate, useAllWidgets, useAmbientLightSensorGetStatus, useAudioAnalysisApplyDeviceSettingsPatch, useAudioAnalysisGetDeviceLiveContribution, useAudioAnalysisGetDeviceSettingsContribution, useAudioAnalysisResolveDeviceSettings, useAudioAnalyzerAnalyseChunk, useAudioAnalyzerClassify, useAudioAnalyzerDispose, useAudioAnalyzerIsReady, useAudioAnalyzerReprobeAudioEngine, useAudioCodecCanHandle, useAudioCodecCloseSession, useAudioCodecCreateDecodeSession, useAudioCodecCreateEncodeSession, useAudioCodecFlushEncode, useAudioCodecListActiveSessions, useAudioCodecListSupportedCodecs, useAudioCodecPullEncoded, useAudioCodecPullPcm, useAudioCodecPushEncodedFrame, useAudioCodecPushPcm, useAudioMetricsGetCurrentSnapshot, useAudioMetricsGetHistory, useAutomationControlDisable, useAutomationControlEnable, useAutomationControlGetStatus, useAutomationControlTrigger, useBackupDelete, useBackupDeleteSchedule, useBackupGetEntries, useBackupList, useBackupListArchives, useBackupListDestinations, useBackupListLocations, useBackupListSchedules, useBackupPreviewSchedule, useBackupRestore, useBackupTrigger, useBackupUpsertDestinationPolicy, useBackupUpsertSchedule, useBatteryGetStatus, useBatteryWakeForStream, useBinaryGetStatus, useBrightnessGetStatus, useBrightnessSetBrightness, useBrokerAdd, useBrokerGet, useBrokerGetBrokerConfig, useBrokerGetSettings, useBrokerGetSettingsSchema, useBrokerGetState, useBrokerGetStatus, useBrokerList, useBrokerListProviders, useBrokerPublish, useBrokerRemove, useBrokerSetSettings, useBrokerSubscribe, useBrokerTestConnection, useBrokerTestSettings, useBrokerUnsubscribe, useButtonPress, useCameraCredentialsGetCredentials, useCameraCredentialsGetStatus, useCameraPipelineConfigApplyDeviceSettingsPatch, useCameraPipelineConfigGetDeviceLiveContribution, useCameraPipelineConfigGetDeviceSettingsContribution, useCameraStreamsGetBrokerStreams, useCameraStreamsGetCameraStreams, useCameraStreamsGetProfileRtspEntries, useCameraStreamsGetRtspEntries, useCameraStreamsPickStream, useCarbonMonoxideGetStatus, useClimateControlGetStatus, useClimateControlSetFanMode, useClimateControlSetMode, useClimateControlSetPreset, useClimateControlSetSwingHorizontal, useClimateControlSetSwingVertical, useClimateControlSetTarget, useClimateControlSetTargetHumidity, useClimateControlSetTargetRange, useClusterNodes, useColorGetStatus, useColorSetColor, useConfirm, useConnectivityGetStatus, useConsumablesGetStatus, useConsumablesReset, useContactGetStatus, useContainerChildren, useControlGetStatus, useControlSetValue, useCoverClose, useCoverGetStatus, useCoverOpen, useCoverSetPosition, useCoverSetTiltPosition, useCoverStop, useCustomFieldRenderer, useDayNightGetOptions, useDayNightGetStatus, useDayNightSetSettings, useDebouncedString, useDecoderCreateSession, useDecoderDestroySession, useDecoderGetFrame, useDecoderGetInfo, useDecoderGetShmStats, useDecoderGetStats, useDecoderListActiveSessions, useDecoderOpenStream, useDecoderPullFrames, useDecoderPullHandles, useDecoderPushPacket, useDecoderReprobeHwaccel, useDecoderSupportsCodec, useDecoderUpdateConfig, useDetectionPipelineApplyDeviceSettingsPatch, useDetectionPipelineGetDeviceLiveContribution, useDetectionPipelineGetDeviceSettingsContribution, useDevShell, useDevice, useDeviceAdoptionAdopt, useDeviceAdoptionGetCandidate, useDeviceAdoptionGetStatus, useDeviceAdoptionListCandidateFilters, useDeviceAdoptionListCandidates, useDeviceAdoptionRefresh, useDeviceAdoptionRelease, useDeviceAdoptionResync, useDeviceAutotrack, useDeviceBattery, useDeviceCapSlice, useDeviceCapability, useDeviceDetections, useDeviceDiscoveryAdoptDevice, useDeviceDiscoveryGetStatus, useDeviceDiscoveryListDiscovered, useDeviceDiscoveryRefreshDiscovery, useDeviceDiscoveryReleaseDevice, useDeviceExportApplyDeviceSettingsPatch, useDeviceExportExposeDevice, useDeviceExportGetDeviceLiveContribution, useDeviceExportGetDeviceSettingsContribution, useDeviceExportGetStatus, useDeviceExportListExposedDevices, useDeviceExportListSupportedDeviceKinds, useDeviceExportUnexposeDevice, useDeviceId, useDeviceListPageSize, useDeviceManagerAddLocation, useDeviceManagerAdoptDevice, useDeviceManagerAdoptionAdopt, useDeviceManagerAdoptionListCandidateFilters, useDeviceManagerAdoptionListCandidates, useDeviceManagerAdoptionRefresh, useDeviceManagerAdoptionRelease, useDeviceManagerAdoptionResync, useDeviceManagerAllocateDeviceId, useDeviceManagerApplyDeviceSettingsPatch, useDeviceManagerApplyInitialMeta, useDeviceManagerCreateDevice, useDeviceManagerDisable, useDeviceManagerDiscoverAllProviders, useDeviceManagerDiscoverDevices, useDeviceManagerDiscoverProvider, useDeviceManagerDiscoveryProviders, useDeviceManagerEnable, useDeviceManagerGetAllBindings, useDeviceManagerGetBindings, useDeviceManagerGetChildren, useDeviceManagerGetConfigSchema, useDeviceManagerGetCreationSchema, useDeviceManagerGetDevice, useDeviceManagerGetDeviceAggregate, useDeviceManagerGetDeviceLiveContribution, useDeviceManagerGetDeviceLiveInfoAggregate, useDeviceManagerGetDeviceSettingsAggregate, useDeviceManagerGetDeviceSettingsContribution, useDeviceManagerGetDeviceStatusAggregate, useDeviceManagerGetLinkedDevices, useDeviceManagerGetRoleDisplayDefaults, useDeviceManagerGetSettingsSchema, useDeviceManagerGetStreamProfileMap, useDeviceManagerGetStreamSources, useDeviceManagerGetWireableFields, useDeviceManagerListAll, useDeviceManagerListBindableCapsForDeviceType, useDeviceManagerListLocations, useDeviceManagerListPersistedByAddon, useDeviceManagerListWrappersForCap, useDeviceManagerLoadConfig, useDeviceManagerLoadMeta, useDeviceManagerLoadRuntimeState, useDeviceManagerPersistConfig, useDeviceManagerProbeStreams, useDeviceManagerProviderCreationType, useDeviceManagerProviderDiscoveryParamsSchema, useDeviceManagerRegisterDevice, useDeviceManagerRemove, useDeviceManagerRemoveByIntegration, useDeviceManagerRemoveDevice, useDeviceManagerRemoveLocation, useDeviceManagerRunDeviceAction, useDeviceManagerSetChildLayout, useDeviceManagerSetDeviceLinks, useDeviceManagerSetDisabled, useDeviceManagerSetDisplay, useDeviceManagerSetIntegrationId, useDeviceManagerSetLinkDeviceId, useDeviceManagerSetLocation, useDeviceManagerSetMetadata, useDeviceManagerSetName, useDeviceManagerSetPrimaryChildEntityId, useDeviceManagerSetRole, useDeviceManagerSetRoleDisplayDefaults, useDeviceManagerSetStreamProfileMap, useDeviceManagerSetType, useDeviceManagerSetWrapperActive, useDeviceManagerTestCreationField, useDeviceManagerTestField, useDeviceManagerUpdateConfig, useDeviceManagerUpdateDeviceField, useDeviceManagerUpdateDeviceFieldsBatch, useDeviceOpsGetConfigEntries, useDeviceOpsGetRawState, useDeviceOpsGetSettingsSchema, useDeviceOpsGetStreamSources, useDeviceOpsRemoveDevice, useDeviceOpsRunAction, useDeviceOpsSetConfig, useDeviceProviderAdoptDiscoveredDevice, useDeviceProviderCreateDevice, useDeviceProviderDiscoverDevices, useDeviceProviderGetChildCreationSchema, useDeviceProviderGetDevices, useDeviceProviderGetDiscoveryParamsSchema, useDeviceProviderGetManualCreationType, useDeviceProviderGetStatus, useDeviceProviderStart, useDeviceProviderStop, useDeviceProviderSupportsDiscovery, useDeviceProviderSupportsManualCreation, useDeviceProviderTestCreationField, useDeviceProxy, useDeviceSnapshot, useDeviceSnapshotImage, useDeviceState, useDeviceStateGetAllSnapshots, useDeviceStateGetCapSlice, useDeviceStateGetSnapshot, useDeviceStateSetCapSlice, useDeviceStateSlice, useDeviceStatusGetStatus, useDeviceWebrtc, useDevices, useDoorbellApplyDeviceSettingsPatch, useDoorbellEvents, useDoorbellGetDeviceLiveContribution, useDoorbellGetDeviceSettingsContribution, useDoorbellGetStatus, useEnumSensorGetStatus, useEventEmitterGetStatus, useEventInvalidation, useEventStreamLatest, useEventStreamMap, useEventsGetEventClipUrl, useEventsGetEventThumbnail, useEventsGetEvents, useFaceGalleryAssignFace, useFaceGalleryAssignFaces, 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, useLlmDeleteModel, useLlmDeleteProfile, useLlmGenerate, useLlmGenerateVision, useLlmGetDefaults, useLlmGetRuntimeStatus, useLlmGetUsage, useLlmInstallModel, useLlmListModelCatalog, useLlmListModels, useLlmListNodeModels, useLlmListProfileKinds, useLlmListProfiles, useLlmListRuntimeNodes, useLlmSetDefault, useLlmStartRuntime, useLlmStopRuntime, useLlmTestProfile, useLlmUpsertProfile, useLocalNetworkGetAllowedAddresses, useLocalNetworkGetConnectionEndpoints, useLocalNetworkGetPreferred, useLocalNetworkList, useLocalNetworkResetAllowlistToBestMatch, useLocalNetworkSetAllowedAddresses, 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, useMetricsProviderDumpHeapSnapshot, useMetricsProviderGetAddonStats, useMetricsProviderGetCached, useMetricsProviderGetCpuTemperature, useMetricsProviderGetCurrent, useMetricsProviderGetDiskSpace, useMetricsProviderGetGpuInfo, useMetricsProviderGetProcessStats, useMetricsProviderKillProcess, useMetricsProviderListAddonInstances, useMetricsProviderListNodeProcesses, useMotionDetectionAnalyze, useMotionDetectionApplyDeviceSettingsPatch, useMotionDetectionGetDeviceLiveContribution, useMotionDetectionGetDeviceSettingsContribution, useMotionDetectionRemoveCamera, useMotionDetectionReset, useMotionGetStatus, useMotionIsDetected, useMotionTriggerGetStatus, useMotionTriggerSetMotionTrigger, useMotionZonesGetOptions, useMotionZonesGetStatus, useMotionZonesSetZone, useMqttBrokerAddBroker, useMqttBrokerGetBrokerConfig, useMqttBrokerGetStatus, useMqttBrokerListBrokers, useMqttBrokerRemoveBroker, useMqttBrokerStartEmbeddedBroker, useMqttBrokerStopEmbeddedBroker, useMqttBrokerTestConnection, useNativeObjectDetectionGetStatus, useNativeObjectDetectionSetEnabled, useNetworkAccessGetEndpoint, useNetworkAccessGetStatus, useNetworkAccessListEndpoints, useNetworkAccessStart, useNetworkAccessStop, useNetworkQualityGetAllStats, useNetworkQualityGetDeviceStats, useNetworkQualityReportClientStats, useNodesClusterAddonStatus, useNodesDeployAddon, useNodesExecuteQuery, useNodesGetCapUsageGraph, useNodesGetNodeAddons, useNodesRenameNode, useNodesRestartAddon, useNodesRestartNode, useNodesRestartProcess, useNodesSetProcessLogLevel, useNodesShutdownNode, useNodesTopology, useNodesUndeployAddon, useNotificationOutputDeleteTarget, useNotificationOutputDiscoverTargets, useNotificationOutputListTargetKinds, useNotificationOutputListTargets, useNotificationOutputSend, useNotificationOutputSetTargetEnabled, useNotificationOutputTestTarget, useNotificationOutputUpsertTarget, useNotificationRulesCreateRule, useNotificationRulesDeleteRule, useNotificationRulesGetConditionCatalog, useNotificationRulesGetHistory, useNotificationRulesGetRule, useNotificationRulesListRules, useNotificationRulesSetRuleEnabled, useNotificationRulesTestRule, useNotificationRulesUpdateRule, useNotifierCancel, useNotifierGetStatus, useNotifierSend, useNumericSensorGetStatus, useOptimisticSlice, useOptionalSystem, useOptionalWidgetRegistry, useOsdGetStatus, useOsdSetOverlay, usePTZ, usePetFeederCallPet, usePetFeederCancelFeed, usePetFeederFeed, usePetFeederGetStatus, usePetFeederMarkFoodReplenished, usePetFeederPlaySound, usePetFeederResetDesiccant, usePetFeederSetChildLock, usePetFeederSetFeedSound, usePetFeederSetIndicatorLight, usePetFeederSetVolume, usePipelineAnalyticsApplyDeviceSettingsPatch, usePipelineAnalyticsClearTracks, usePipelineAnalyticsDeleteDeviceEvents, usePipelineAnalyticsDeleteTracks, usePipelineAnalyticsGetActiveTracks, usePipelineAnalyticsGetAudioEvents, usePipelineAnalyticsGetDeviceLiveContribution, usePipelineAnalyticsGetDeviceSettingsContribution, usePipelineAnalyticsGetEventDensity, usePipelineAnalyticsGetEventMedia, usePipelineAnalyticsGetEventStoreFootprint, usePipelineAnalyticsGetKeyEvents, usePipelineAnalyticsGetMotionEvents, usePipelineAnalyticsGetObjectEvents, usePipelineAnalyticsGetSensorEvents, usePipelineAnalyticsGetTrack, usePipelineAnalyticsGetTrackMedia, usePipelineAnalyticsListEventKinds, usePipelineAnalyticsListOpsLog, usePipelineAnalyticsListRecentTracks, usePipelineAnalyticsListTracks, usePipelineAnalyticsPruneEvents, usePipelineAnalyticsPruneEventsBefore, usePipelineAnalyticsPruneTracksBefore, usePipelineAnalyticsSearchObjectEvents, usePipelineAnalyticsWipeAllAnalytics, usePipelineExecutorCacheFrameInPool, usePipelineExecutorClearDeviceOverrides, usePipelineExecutorDeleteModel, usePipelineExecutorDeleteTemplate, usePipelineExecutorDownloadModel, usePipelineExecutorGetAddonModels, usePipelineExecutorGetAudioCapabilities, usePipelineExecutorGetAvailableEngines, usePipelineExecutorGetCapabilities, usePipelineExecutorGetDefaultSteps, usePipelineExecutorGetDetectionConfigSchema, usePipelineExecutorGetEffectiveTuning, usePipelineExecutorGetEngineProvisioning, usePipelineExecutorGetGlobalPipelineConfig, usePipelineExecutorGetGlobalSteps, usePipelineExecutorGetOrchestratorConfigSchema, usePipelineExecutorGetReferenceAudio, usePipelineExecutorGetReferenceAudioFiles, usePipelineExecutorGetReferenceImage, usePipelineExecutorGetSchema, usePipelineExecutorGetSelectedEngine, usePipelineExecutorGetVideoPipelineSteps, usePipelineExecutorInferCached, usePipelineExecutorKillEngine, usePipelineExecutorListLoadedEngines, usePipelineExecutorListReferenceImages, usePipelineExecutorListTemplates, usePipelineExecutorRunAudioTest, usePipelineExecutorRunPipeline, usePipelineExecutorRunPipelineBatch, usePipelineExecutorSaveTemplate, usePipelineExecutorSetVideoPipelineSteps, usePipelineExecutorSpinEngine, usePipelineExecutorUncacheFrame, usePipelineExecutorUpdateTemplate, usePipelineExecutorValidatePipeline, usePipelineOrchestratorApplyDeviceSettingsPatch, usePipelineOrchestratorAssignAudio, usePipelineOrchestratorAssignPipeline, usePipelineOrchestratorDeleteTemplate, usePipelineOrchestratorGetAgentLoad, usePipelineOrchestratorGetAgentSettings, usePipelineOrchestratorGetAudioAssignment, usePipelineOrchestratorGetAudioAssignments, usePipelineOrchestratorGetAudioNodeLoad, usePipelineOrchestratorGetCameraMetrics, usePipelineOrchestratorGetCameraSettings, usePipelineOrchestratorGetCameraStatus, usePipelineOrchestratorGetCameraStatuses, usePipelineOrchestratorGetCameraStepOverrides, usePipelineOrchestratorGetCapabilityBindings, usePipelineOrchestratorGetDeviceLiveContribution, usePipelineOrchestratorGetDeviceSettingsContribution, usePipelineOrchestratorGetGlobalMetrics, usePipelineOrchestratorGetIngestOwner, usePipelineOrchestratorGetNodeInferenceDevices, usePipelineOrchestratorGetPipelineAssignment, usePipelineOrchestratorGetPipelineAssignments, usePipelineOrchestratorGetPipelineDevicePin, usePipelineOrchestratorListAgentSettings, usePipelineOrchestratorListTemplates, usePipelineOrchestratorRebalance, usePipelineOrchestratorRemoveAgentSettings, usePipelineOrchestratorResetNodePipelineDefaults, usePipelineOrchestratorResolvePipeline, usePipelineOrchestratorSaveTemplate, usePipelineOrchestratorSetAgentCapabilities, usePipelineOrchestratorSetAgentDetectWeight, usePipelineOrchestratorSetAgentInferenceDevices, usePipelineOrchestratorSetAgentMaxCameras, usePipelineOrchestratorSetAgentReachableHost, usePipelineOrchestratorSetCameraPipelineForAgent, usePipelineOrchestratorSetCameraStepOverride, usePipelineOrchestratorSetCameraStepToggle, usePipelineOrchestratorSetCapabilityBinding, usePipelineOrchestratorSetPipelineDevicePin, usePipelineOrchestratorUnassignAudio, usePipelineOrchestratorUnassignPipeline, usePipelineOrchestratorUpdateTemplate, usePipelineRunnerAttachCamera, usePipelineRunnerDetachCamera, usePipelineRunnerGetAllCameraMetrics, usePipelineRunnerGetCameraMetrics, usePipelineRunnerGetLocalCameras, usePipelineRunnerGetLocalLoad, usePipelineRunnerGetLocalMetrics, usePipelineRunnerGetNativeCrop, usePipelineRunnerReportMotion, usePipelineRunnerRunDetailSubtree, 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, usePrivacyMaskSetMask, usePtzAutotrackGetSettings, usePtzAutotrackGetStatus, usePtzAutotrackSetEnabled, usePtzAutotrackSetSettings, usePtzContinuousMove, usePtzDeletePreset, usePtzGetOptions, usePtzGetPosition, usePtzGetPresets, usePtzGetStatus, usePtzGoHome, usePtzGoToPreset, usePtzMove, usePtzSavePreset, usePtzSetAutofocus, usePtzStop, useRebootReboot, useRecordedPlayback, useRecordingApplyDeviceSettingsPatch, useRecordingDeleteFootprint, useRecordingExportCancelExport, useRecordingExportCreateExport, useRecordingExportDeleteExport, useRecordingExportGetDownloadUrl, useRecordingExportGetExport, useRecordingExportListExports, useRecordingGetAvailability, useRecordingGetDaysWithRecordings, useRecordingGetDeviceConfig, useRecordingGetDeviceLiveContribution, useRecordingGetDeviceSettingsContribution, useRecordingGetPlaybackManifest, useRecordingGetStatus, useRecordingGetStorageUsage, useRecordingListOpsLog, useRecordingLocateSegment, useRecordingPruneFootage, useRecordingReadSegmentBytes, useRecordingRescanStorage, useRecordingSetDeviceConfig, useRemoteComponent, useSceneMonitorCaptureReference, useSceneMonitorCreateScene, useSceneMonitorDeleteReference, useSceneMonitorDeleteScene, useSceneMonitorGetStatus, useSceneMonitorListScenes, useSceneMonitorRecheckNow, useSceneMonitorUpdateScene, useScriptRunnerGetStatus, useScriptRunnerRun, useScriptRunnerStop, useScrubController, useServerManagementApplyServerUpdate, useServerManagementCheckServerUpdate, useServerManagementGetServerPackageStatus, useServerManagementRestartServer, useServerManagementRollbackServerUpdate, useSettingsStoreCount, useSettingsStoreDeclareCollection, useSettingsStoreDelete, useSettingsStoreGet, useSettingsStoreHistogram, useSettingsStoreInsert, useSettingsStoreIsEmpty, useSettingsStoreQuery, useSettingsStoreSet, useSettingsStoreUpdate, useSmokeGetStatus, useSnapshotApplyDeviceSettingsPatch, useSnapshotGetDeviceLiveContribution, useSnapshotGetDeviceSettingsContribution, useSnapshotGetSnapshot, useSnapshotGetSnapshotOverview, useSnapshotGetStatus, useSnapshotInvalidateCache, useStorageAbortUpload, useStorageBeginDownload, useStorageBeginUpload, useStorageDelete, useStorageDeleteLocation, useStorageEndDownload, useStorageExists, useStorageFinalizeUpload, useStorageGetAvailableSpace, useStorageGetDefaultLocation, useStorageList, useStorageListLocationDeclarations, useStorageListLocations, useStorageListProviders, useStorageRead, useStorageReadChunk, useStorageResolve, useStorageTestConfig, useStorageTestLocation, useStorageUpsertLocation, useStorageWrite, useStorageWriteChunk, useStreamBrokerApplyDeviceSettingsPatch, useStreamBrokerAssignProfile, useStreamBrokerGetAllRtspEntries, useStreamBrokerGetBrokerStats, useStreamBrokerGetDeviceLiveContribution, useStreamBrokerGetDeviceSettingsContribution, useStreamBrokerGetPreBufferInfo, useStreamBrokerGetRtspEntry, useStreamBrokerGetRtspPort, useStreamBrokerGetStreamUrl, useStreamBrokerGetStreamWithCodec, useStreamBrokerIsRtspEnabled, useStreamBrokerKillClient, useStreamBrokerListAllCameraStreams, useStreamBrokerListAllProfileSlots, useStreamBrokerListClients, useStreamBrokerProbeStream, useStreamBrokerPublishCameraStream, useStreamBrokerPullAudioChunks, useStreamBrokerPullFrameHandles, useStreamBrokerRegenerateRtspToken, useStreamBrokerReleaseStreamWithCodec, useStreamBrokerRestartProfile, useStreamBrokerRetractCameraStream, useStreamBrokerSetPreBufferDuration, useStreamBrokerSetRtspEnabled, useStreamBrokerSubscribeAudioChunks, useStreamBrokerSubscribeFrames, useStreamBrokerUnassignProfile, useStreamBrokerUnsubscribeAudioChunks, useStreamBrokerUnsubscribeFrames, useStreamCatalogGetCatalog, useStreamParamsGetConfigSchema, useStreamParamsGetOptions, useStreamParamsGetStatus, useStreamParamsSetProfile, useSwitchGetStatus, useSwitchSetState, useSystem, useSystemFeatureFlags, useSystemForceRetentionCleanup, useSystemGetRetentionConfig, useSystemHealth, useSystemInfo, useSystemMutation, useSystemNetworkAddresses, useSystemQuery, useSystemSetRetentionConfig, useTamperGetStatus, useTemperatureSensorGetStatus, useTerminalSessionClose, useTerminalSessionListProfiles, useTerminalSessionListSessions, useTerminalSessionOpenSession, useTerminalSessionResize, useThemeMode, useToastOnToast, useTurnProviderGetTurnServers, useUpdateGetStatus, useUpdateInstallUpdate, useUserManagementConfirmTotp, useUserManagementCreateApiKey, useUserManagementCreateScopedToken, useUserManagementCreateUser, useUserManagementDeleteUser, useUserManagementDisableTotp, useUserManagementGetTotpStatus, useUserManagementListApiKeys, useUserManagementListOauthSessions, useUserManagementListScopedTokens, useUserManagementListUsers, useUserManagementOauthExchangeCode, useUserManagementOauthIssueCode, useUserManagementOauthRefresh, useUserManagementOauthVerifyAccessToken, useUserManagementResetPassword, useUserManagementRevokeApiKey, useUserManagementRevokeOauthSession, useUserManagementRevokeScopedToken, useUserManagementSetUserScopes, useUserManagementSetupTotp, useUserManagementUpdateUser, useUserManagementValidateApiKey, useUserManagementValidateCredentials, useUserManagementValidateScopedToken, useUserManagementVerifyTotp, useVacuumControlGetStatus, useVacuumControlLocate, useVacuumControlPause, useVacuumControlReturnToBase, useVacuumControlSetFanSpeed, useVacuumControlStart, useVacuumControlStop, useValveClose, useValveGetStatus, useValveOpen, useValveSetPosition, useValveStop, useVibrationGetStatus, useVideoclipsGetClipPlayback, useVideoclipsListClips, useVodPlayback, useWaterHeaterGetStatus, useWaterHeaterSetAway, useWaterHeaterSetOperationMode, useWaterHeaterSetTargetTemp, useWeatherGetStatus, useWebrtcSessionAddIceCandidate, useWebrtcSessionCloseSession, useWebrtcSessionCreateSession, useWebrtcSessionGetIceCandidates, useWebrtcSessionGetSessionState, useWebrtcSessionHandleAnswer, useWebrtcSessionHandleOffer, useWebrtcSessionHasAdaptiveBitrate, useWebrtcSessionListStreams, useWidget, useWidgetMetadata, useWidgetRegistry, useZoneAnalyticsGetCameraHistory, useZoneAnalyticsGetCurrentSnapshot, useZoneAnalyticsGetUnzonedHistory, useZoneAnalyticsGetZoneHistory, useZoneEditing, useZoneRulesListRules, useZoneRulesSetRules, useZonesAddZone, useZonesListZones, useZonesRemoveZone, useZonesUpdateZone, vacuumStateMeta, validateScopes, valveStateMeta, waterHeaterPhase, waterHeaterTint, weatherConditionMeta, weatherTint };
47201
+ export { AddonGlobalSettingsForm, AgentStepEditor, AlarmHeroCard, AlarmInlineControl as AlarmPanelInlineControl, AppShell, ArcKnob, AudioClassificationList, AudioLevelWaveform, AudioWaveform, AutotrackSection, BTN_COMPACT, BTN_COMPACT_DANGER, BTN_COMPACT_PRIMARY, BTN_COMPACT_WARNING, Badge, BatteryBadge, BottomSheet, Breadcrumb, BrightnessPanel, Button, ButtonControl, ButtonHeroCard, CENTER, CHIP_ACTIVE, CHIP_BASE, CHIP_INACTIVE, CLASS_COLORS, COLUMN_BREAKPOINT_CLASS, COLUMN_PRIORITY, COMMIT_DEDUPE_TOLERANCE_MS, COMMIT_DEDUPE_WINDOW_MS, CONTROL_CAP_NAMES, CONTROL_FILLS, CameraStreamPlayer, Card, Checkbox, ChildSectionAccordion, ClimatePanel, CodeBlock, CollapsibleCard, ConfigFormBuilder, FormField as ConfigFormField, ConfigSchemaField, ConfirmActionButton, ConfirmDialogProvider, ConsumablesPanel, ContainerChildrenProvider, ContainerPrimaryHero, ControlColumn, ControlHeroCard, ControlInlineControl, ControlPanel, CopyButton, CoverHeroCard, CoverInlineControl, CoverPanel, CustomFieldRenderersProvider, DEFAULT_COLOR, DEVICE_COLUMNS, DEVICE_LIST_PAGE_SIZE_KEY, DEVICE_LIST_PAGE_SIZE_OPTIONS, DEVICE_ROLE_META, DEVICE_TYPE_CONTROL, DEVICE_TYPE_META, DISPLAY_ICON_REGISTRY, DataTable, DetectionCanvas, DetectionOverlay, DetectionResultTree, DevShell, DeviceActivityPanel, DeviceBatchToolbar, DeviceCard, DeviceContextProvider, DeviceExportPanel, DeviceGrid, DeviceItem, DeviceList, DeviceMultiSelectField, DeviceSelectField, DeviceStepMatrix, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, DiscoveryPanel, DoorbellRecentPanel, Dropdown, DropdownContent, DropdownItem, DropdownTrigger, DummyHeroCard, DummyInline, EVENT_KIND_ICONS, EmptyState, ErrorBox, EventKindGlyph, EventStream, FILL, FanHeroCard, FanInlineControl, FanPanel, FilterBar, FloatingEventStream, FloatingLogStream, FloatingPanel, FormField$1 as FormField, GRID_GAP, GRID_PAIRED, GRID_QUICK_STATS, GripTrack, GroupedModelSelector, HOST_WIDGETS, HlsVideo, HoverZoomImage, HumidifierHeroCard, HumidifierInlineControl, INPUT_COMPACT, IconAction, IconButton, ImageHeroCard, ImageInlineControl, ImageSelector, InferenceConfigSelector, Input, KebabMenu, KeyValueList, LIST_ROW, Label, LawnMowerHeroCard, LawnMowerInlineControl, LightHeroCard, LightInlineControl, LockHeroCard, LockInlineControl, LockPanel, LogStream, LoginForm, MODE_COLOR, MaskShapeCanvas, MediaPlayerHeroCard, MediaPlayerInlineControl, MediaPlayerPanel, MobileDrawer, ModelPicker, MotionZonesSettings, NodeMultiSelectField, NodePicker, NodeSelectField, OfflineBadge, PHASE_CONFIG, PRIORITY, PTZOverlay, PageHeader, PhaseIcon, PipelineBuilder, PipelineRuntimeSelector, PipelineStep, PipelineTreeMatrix, PlayerOverlaysProvider, Popover, PopoverContent, PopoverRowAction, PopoverTrigger, PrimaryChildPicker, PrivacyMaskSettings, ProviderBadge, PtzPanel, QrCode, RECORDED_PLAYBACK_MODES, RIGHT, ROLE_DESCRIPTOR, RadialGauge, RecordedPlaybackProvider, RecordingPanel, ResponseLog, SECTION_BODY, SECTION_CARD, SECTION_HEADER, SPLIT_PANEL_OUTER, SPLIT_PANEL_SIDE, STACK_GAP, STATE_COLOR, ScopePicker, ScrollArea, Select, SemanticBadge, SensorHeroCard, SensorInlineControl, SensorValueAtom, Separator, Sidebar, SidebarItem, Skeleton, SlideOverPanel, SlideToggle, SnapshotButton, StatCard, StateValuesStream, StatusBadge, StepTimings, StepTreeMaster, Stepper, StreamBrokerSelector, StreamPanel, Switch, SwitchHeroCard, SwitchInlineControl, SwitchPanel, SystemProvider, TEXT_FIELD_LABEL, TEXT_HINT, TEXT_METRIC, TEXT_SECTION_LABEL, TEXT_VALUE, TIMEZONES, Tabs, TabsContent, TabsList, TabsTrigger, TapToggle, ThemeProvider, ThermostatHeroCard, ThermostatInlineControl, TimezoneSelector, Tooltip, TooltipContent, TooltipTrigger, VacuumHeroCard, VacuumInlineControl, ValueReadout, ValveHeroCard, ValveInlineControl, VersionBadge, VodPlaybackProvider, WaterHeaterHeroCard, WaterHeaterInlineControl, WeatherHeroCard, WeatherInlineControl, WidgetMetricCard, WidgetPanel, WidgetRegistryProvider, WidgetSlot, ZoneEditingProvider, agentColumnKey, allDeviceTypeFilterOptions, buildStepTreeFromSchema, childEntityId, childListName, cn, columnsForContext, containerChildToRef, countableDevices, coverHighlight, createSharedContext, createTheme, cursorFractionFor, darkColors, defaultTheme, deriveDeviceKind, deviceMatchesFilter, deviceOptionLabel, deviceRoleMeta, deviceRoleMetaOf, deviceTypeMeta, deviceTypeMetaOf, devicesToOptions, ensureMfHostInit, eventKindLabel, filterDeviceOptions, findTimezone, formatControlDateTime, formatLastSeen, formatNumeric, fuzzyMatch, getClassColor, getPhaseVisual, groupAgentColumns, groupChildrenByLayout, hardwareLabel, humidifierTint, createLucideIcon as i, initialScrubState, isAbsentProvider, isFieldVisible, lawnMowerActivityMeta, lightColors, loadRemoteBundle, makeScrubBridge, metadataEntries, metadataString, mirror, mountAddonPage, Square as n, nextSort, normalizeForSearch, overrideEntityIdFromLink, parseRecordedServerMessage, providerIcons, EyeOff as r, resolveContainerPrimary, resolveControlAlign, resolveDeviceControl, resolveDisplayIcon, resolveEventKindIcon, resolvePrimaryChild, resolveSensorDisplay, resolveStepDefaultModel, scrubReducer, selectedDeviceOptions, serializeRecordedCommand, shouldCommit, shouldEmit, shouldUseSingleNode, sortRows, statusIcons, stripParentNamePrefix, Trash2 as t, tankAlert, themeToCss, trpc, useAccessoriesGetStatus, useAccessoriesSetChildHidden, useAddonPagesListPages, useAddonSettingsGetDeviceSettings, useAddonSettingsGetGlobalSettings, 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, useAlertsDismiss, useAlertsEmit, useAlertsGetUnreadCount, useAlertsList, useAlertsMarkAllRead, useAlertsMarkRead, useAlertsUpdate, useAllWidgets, useAmbientLightSensorGetStatus, useAudioAnalysisApplyDeviceSettingsPatch, useAudioAnalysisGetDeviceLiveContribution, useAudioAnalysisGetDeviceSettingsContribution, useAudioAnalysisResolveDeviceSettings, useAudioAnalyzerAnalyseChunk, useAudioAnalyzerClassify, useAudioAnalyzerDispose, useAudioAnalyzerIsReady, useAudioAnalyzerReprobeAudioEngine, useAudioCodecCanHandle, useAudioCodecCloseSession, useAudioCodecCreateDecodeSession, useAudioCodecCreateEncodeSession, useAudioCodecFlushEncode, useAudioCodecListActiveSessions, useAudioCodecListSupportedCodecs, useAudioCodecPullEncoded, useAudioCodecPullPcm, useAudioCodecPushEncodedFrame, useAudioCodecPushPcm, useAudioMetricsGetCurrentSnapshot, useAudioMetricsGetHistory, useAutomationControlDisable, useAutomationControlEnable, useAutomationControlGetStatus, useAutomationControlTrigger, useBackupDelete, useBackupDeleteSchedule, useBackupGetEntries, useBackupList, useBackupListArchives, useBackupListDestinations, useBackupListLocations, useBackupListSchedules, useBackupPreviewSchedule, useBackupRestore, useBackupTrigger, useBackupUpsertDestinationPolicy, useBackupUpsertSchedule, useBatteryGetStatus, useBatteryWakeForStream, useBinaryGetStatus, useBrightnessGetStatus, useBrightnessSetBrightness, useBrokerAdd, useBrokerGet, useBrokerGetBrokerConfig, useBrokerGetSettings, useBrokerGetSettingsSchema, useBrokerGetState, useBrokerGetStatus, useBrokerList, useBrokerListProviders, useBrokerPublish, useBrokerRemove, useBrokerSetSettings, useBrokerSubscribe, useBrokerTestConnection, useBrokerTestSettings, useBrokerUnsubscribe, useButtonPress, useCameraCredentialsGetCredentials, useCameraCredentialsGetStatus, useCameraPipelineConfigApplyDeviceSettingsPatch, useCameraPipelineConfigGetDeviceLiveContribution, useCameraPipelineConfigGetDeviceSettingsContribution, useCameraStreamsGetBrokerStreams, useCameraStreamsGetCameraStreams, useCameraStreamsGetProfileRtspEntries, useCameraStreamsGetRtspEntries, useCameraStreamsPickStream, useCarbonMonoxideGetStatus, useClimateControlGetStatus, useClimateControlSetFanMode, useClimateControlSetMode, useClimateControlSetPreset, useClimateControlSetSwingHorizontal, useClimateControlSetSwingVertical, useClimateControlSetTarget, useClimateControlSetTargetHumidity, useClimateControlSetTargetRange, useClusterNodes, useColorGetStatus, useColorSetColor, useConfirm, useConnectivityGetStatus, useConsumablesGetStatus, useConsumablesReset, useContactGetStatus, useContainerChildren, useControlGetStatus, useControlSetValue, useCoverClose, useCoverGetStatus, useCoverOpen, useCoverSetPosition, useCoverSetTiltPosition, useCoverStop, useCustomFieldRenderer, useDayNightGetOptions, useDayNightGetStatus, useDayNightSetSettings, useDebouncedString, useDecoderCreateSession, useDecoderDestroySession, useDecoderGetFrame, useDecoderGetInfo, useDecoderGetShmStats, useDecoderGetStats, useDecoderListActiveSessions, useDecoderOpenStream, useDecoderPullFrames, useDecoderPullHandles, useDecoderPushPacket, useDecoderReprobeHwaccel, useDecoderSupportsCodec, useDecoderUpdateConfig, useDetectionPipelineApplyDeviceSettingsPatch, useDetectionPipelineGetDeviceLiveContribution, useDetectionPipelineGetDeviceSettingsContribution, useDevShell, useDevice, useDeviceAdoptionAdopt, useDeviceAdoptionGetCandidate, useDeviceAdoptionGetStatus, useDeviceAdoptionListCandidateFilters, useDeviceAdoptionListCandidates, useDeviceAdoptionRefresh, useDeviceAdoptionRelease, useDeviceAdoptionResync, useDeviceAutotrack, useDeviceBattery, useDeviceCapSlice, useDeviceCapability, useDeviceDetections, useDeviceDiscoveryAdoptDevice, useDeviceDiscoveryGetStatus, useDeviceDiscoveryListDiscovered, useDeviceDiscoveryRefreshDiscovery, useDeviceDiscoveryReleaseDevice, useDeviceExportApplyDeviceSettingsPatch, useDeviceExportExposeDevice, useDeviceExportGetDeviceLiveContribution, useDeviceExportGetDeviceSettingsContribution, useDeviceExportGetStatus, useDeviceExportListExposedDevices, useDeviceExportListSupportedDeviceKinds, useDeviceExportUnexposeDevice, useDeviceId, useDeviceListPageSize, useDeviceManagerAddLocation, useDeviceManagerAdoptDevice, useDeviceManagerAdoptionAdopt, useDeviceManagerAdoptionListCandidateFilters, useDeviceManagerAdoptionListCandidates, useDeviceManagerAdoptionRefresh, useDeviceManagerAdoptionRelease, useDeviceManagerAdoptionResync, useDeviceManagerAllocateDeviceId, useDeviceManagerApplyDeviceSettingsPatch, useDeviceManagerApplyInitialMeta, useDeviceManagerCreateDevice, useDeviceManagerDisable, useDeviceManagerDiscoverAllProviders, useDeviceManagerDiscoverDevices, useDeviceManagerDiscoverProvider, useDeviceManagerDiscoveryProviders, useDeviceManagerEnable, useDeviceManagerGetAllBindings, useDeviceManagerGetBindings, useDeviceManagerGetChildren, useDeviceManagerGetConfigSchema, useDeviceManagerGetCreationSchema, useDeviceManagerGetDevice, useDeviceManagerGetDeviceAggregate, useDeviceManagerGetDeviceLiveContribution, useDeviceManagerGetDeviceLiveInfoAggregate, useDeviceManagerGetDeviceSettingsAggregate, useDeviceManagerGetDeviceSettingsContribution, useDeviceManagerGetDeviceStatusAggregate, useDeviceManagerGetDeviceStatusAggregateBatch, useDeviceManagerGetLinkedDevices, useDeviceManagerGetRoleDisplayDefaults, useDeviceManagerGetSettingsSchema, useDeviceManagerGetStreamProfileMap, useDeviceManagerGetStreamSources, useDeviceManagerGetWireableFields, useDeviceManagerListAll, useDeviceManagerListBindableCapsForDeviceType, useDeviceManagerListLocations, useDeviceManagerListPersistedByAddon, useDeviceManagerListWrappersForCap, useDeviceManagerLoadConfig, useDeviceManagerLoadMeta, useDeviceManagerLoadRuntimeState, useDeviceManagerPersistConfig, useDeviceManagerProbeStreams, useDeviceManagerProviderCreationType, useDeviceManagerProviderDiscoveryParamsSchema, useDeviceManagerRegisterDevice, useDeviceManagerRemove, useDeviceManagerRemoveByIntegration, useDeviceManagerRemoveDevice, useDeviceManagerRemoveLocation, useDeviceManagerRunDeviceAction, useDeviceManagerSetChildLayout, useDeviceManagerSetDeviceLinks, useDeviceManagerSetDisabled, useDeviceManagerSetDisplay, useDeviceManagerSetIntegrationId, useDeviceManagerSetLinkDeviceId, useDeviceManagerSetLocation, useDeviceManagerSetMetadata, useDeviceManagerSetName, useDeviceManagerSetPrimaryChildEntityId, useDeviceManagerSetRole, useDeviceManagerSetRoleDisplayDefaults, useDeviceManagerSetStreamProfileMap, useDeviceManagerSetType, useDeviceManagerSetWrapperActive, useDeviceManagerTestCreationField, useDeviceManagerTestField, useDeviceManagerUpdateConfig, useDeviceManagerUpdateDeviceField, useDeviceManagerUpdateDeviceFieldsBatch, useDeviceOpsGetConfigEntries, useDeviceOpsGetRawState, useDeviceOpsGetSettingsSchema, useDeviceOpsGetStreamSources, useDeviceOpsRemoveDevice, useDeviceOpsRunAction, useDeviceOpsSetConfig, useDeviceProviderAdoptDiscoveredDevice, useDeviceProviderCreateDevice, useDeviceProviderDiscoverDevices, useDeviceProviderGetChildCreationSchema, useDeviceProviderGetDevices, useDeviceProviderGetDiscoveryParamsSchema, useDeviceProviderGetManualCreationType, useDeviceProviderGetStatus, useDeviceProviderStart, useDeviceProviderStop, useDeviceProviderSupportsDiscovery, useDeviceProviderSupportsManualCreation, useDeviceProviderTestCreationField, useDeviceProxy, useDeviceSnapshot, useDeviceSnapshotImage, useDeviceState, useDeviceStateGetAllSnapshots, useDeviceStateGetCapSlice, useDeviceStateGetSnapshot, useDeviceStateSetCapSlice, useDeviceStateSlice, useDeviceStatusGetStatus, useDeviceWebrtc, useDevices, useDoorbellApplyDeviceSettingsPatch, useDoorbellEvents, useDoorbellGetDeviceLiveContribution, useDoorbellGetDeviceSettingsContribution, useDoorbellGetStatus, useEnumSensorGetStatus, useEventEmitterGetStatus, useEventInvalidation, useEventStreamLatest, useEventStreamMap, useEventsGetEventClipUrl, useEventsGetEventThumbnail, useEventsGetEvents, useFaceGalleryAssignFace, useFaceGalleryAssignFaces, 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, useLlmDeleteModel, useLlmDeleteProfile, useLlmGenerate, useLlmGenerateVision, useLlmGetDefaults, useLlmGetRuntimeStatus, useLlmGetUsage, useLlmInstallModel, useLlmListModelCatalog, useLlmListModels, useLlmListNodeModels, useLlmListProfileKinds, useLlmListProfiles, useLlmListRuntimeNodes, useLlmSetDefault, useLlmStartRuntime, useLlmStopRuntime, useLlmTestProfile, useLlmUpsertProfile, useLocalNetworkGetAllowedAddresses, useLocalNetworkGetConnectionEndpoints, useLocalNetworkGetNotificationEndpoint, useLocalNetworkGetPreferred, useLocalNetworkList, useLocalNetworkResetAllowlistToBestMatch, useLocalNetworkSetAllowedAddresses, useLocalNetworkSetNotificationEndpoint, 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, useMetricsProviderDumpHeapSnapshot, useMetricsProviderGetAddonStats, useMetricsProviderGetCached, useMetricsProviderGetCpuTemperature, useMetricsProviderGetCurrent, useMetricsProviderGetDiskSpace, useMetricsProviderGetGpuInfo, useMetricsProviderGetProcessStats, useMetricsProviderKillProcess, useMetricsProviderListAddonInstances, useMetricsProviderListNodeProcesses, useMotionDetectionAnalyze, useMotionDetectionApplyDeviceSettingsPatch, useMotionDetectionGetDeviceLiveContribution, useMotionDetectionGetDeviceSettingsContribution, useMotionDetectionRemoveCamera, useMotionDetectionReset, useMotionGetStatus, useMotionIsDetected, useMotionTriggerGetStatus, useMotionTriggerSetMotionTrigger, useMotionZonesGetOptions, useMotionZonesGetStatus, useMotionZonesSetZone, useMqttBrokerAddBroker, useMqttBrokerGetBrokerConfig, useMqttBrokerGetStatus, useMqttBrokerListBrokers, useMqttBrokerRemoveBroker, useMqttBrokerStartEmbeddedBroker, useMqttBrokerStopEmbeddedBroker, useMqttBrokerTestConnection, useNativeObjectDetectionGetStatus, useNativeObjectDetectionSetEnabled, useNetworkAccessGetEndpoint, useNetworkAccessGetStatus, useNetworkAccessListEndpoints, useNetworkAccessStart, useNetworkAccessStop, useNetworkQualityGetAllStats, useNetworkQualityGetDeviceStats, useNetworkQualityReportClientStats, useNodesClusterAddonStatus, useNodesDeployAddon, useNodesExecuteQuery, useNodesGetCapUsageGraph, useNodesGetNodeAddons, useNodesRenameNode, useNodesRestartAddon, useNodesRestartNode, useNodesRestartProcess, useNodesSetProcessLogLevel, useNodesShutdownNode, useNodesTopology, useNodesUndeployAddon, useNotificationOutputDeleteTarget, useNotificationOutputDiscoverTargets, useNotificationOutputListTargetKinds, useNotificationOutputListTargets, useNotificationOutputSend, useNotificationOutputSetTargetEnabled, useNotificationOutputTestTarget, useNotificationOutputUpsertTarget, useNotificationRulesCreateRule, useNotificationRulesDeleteRule, useNotificationRulesGetConditionCatalog, useNotificationRulesGetHistory, useNotificationRulesGetRule, useNotificationRulesListRules, useNotificationRulesSetRuleEnabled, useNotificationRulesTestRule, useNotificationRulesUpdateRule, useNotifierCancel, useNotifierGetStatus, useNotifierSend, useNumericSensorGetStatus, useOptimisticSlice, useOptionalSystem, useOptionalWidgetRegistry, useOsdGetStatus, useOsdSetOverlay, usePTZ, usePetFeederCallPet, usePetFeederCancelFeed, usePetFeederFeed, usePetFeederGetStatus, usePetFeederMarkFoodReplenished, usePetFeederPlaySound, usePetFeederResetDesiccant, usePetFeederSetChildLock, usePetFeederSetFeedSound, usePetFeederSetIndicatorLight, usePetFeederSetVolume, usePipelineAnalyticsApplyDeviceSettingsPatch, usePipelineAnalyticsCancelMediaRelocate, usePipelineAnalyticsClearTracks, usePipelineAnalyticsDeleteDeviceEvents, usePipelineAnalyticsDeleteTracks, usePipelineAnalyticsGetActiveTracks, usePipelineAnalyticsGetAudioEvents, usePipelineAnalyticsGetDeviceLiveContribution, usePipelineAnalyticsGetDeviceSettingsContribution, usePipelineAnalyticsGetEventDensity, usePipelineAnalyticsGetEventMedia, usePipelineAnalyticsGetEventStoreFootprint, usePipelineAnalyticsGetKeyEvents, usePipelineAnalyticsGetMediaRelocateStatus, usePipelineAnalyticsGetMotionEvents, usePipelineAnalyticsGetObjectEvents, usePipelineAnalyticsGetSensorEvents, usePipelineAnalyticsGetTrack, usePipelineAnalyticsGetTrackMedia, usePipelineAnalyticsListEventKinds, usePipelineAnalyticsListOpsLog, usePipelineAnalyticsListRecentTracks, usePipelineAnalyticsListTracks, usePipelineAnalyticsPruneEvents, usePipelineAnalyticsPruneEventsBefore, usePipelineAnalyticsPruneTracksBefore, usePipelineAnalyticsRelocateMedia, usePipelineAnalyticsSearchObjectEvents, usePipelineAnalyticsWipeAllAnalytics, usePipelineExecutorCacheFrameInPool, usePipelineExecutorClearDeviceOverrides, usePipelineExecutorDeleteModel, usePipelineExecutorDeleteTemplate, usePipelineExecutorDownloadModel, usePipelineExecutorGetAddonModels, usePipelineExecutorGetAudioCapabilities, usePipelineExecutorGetAvailableEngines, usePipelineExecutorGetCapabilities, usePipelineExecutorGetDefaultSteps, usePipelineExecutorGetDetectionConfigSchema, usePipelineExecutorGetEffectiveTuning, usePipelineExecutorGetEngineProvisioning, usePipelineExecutorGetGlobalPipelineConfig, usePipelineExecutorGetGlobalSteps, usePipelineExecutorGetOrchestratorConfigSchema, usePipelineExecutorGetReferenceAudio, usePipelineExecutorGetReferenceAudioFiles, usePipelineExecutorGetReferenceImage, usePipelineExecutorGetSchema, usePipelineExecutorGetSelectedEngine, usePipelineExecutorGetVideoPipelineSteps, usePipelineExecutorInferCached, usePipelineExecutorKillEngine, usePipelineExecutorListLoadedEngines, usePipelineExecutorListReferenceImages, usePipelineExecutorListTemplates, usePipelineExecutorRunAudioTest, usePipelineExecutorRunPipeline, usePipelineExecutorRunPipelineBatch, usePipelineExecutorSaveTemplate, usePipelineExecutorSetVideoPipelineSteps, usePipelineExecutorSpinEngine, usePipelineExecutorUncacheFrame, usePipelineExecutorUpdateTemplate, usePipelineExecutorValidatePipeline, usePipelineOrchestratorApplyDeviceSettingsPatch, usePipelineOrchestratorAssignAudio, usePipelineOrchestratorAssignPipeline, usePipelineOrchestratorDeleteTemplate, usePipelineOrchestratorGetAgentLoad, usePipelineOrchestratorGetAgentSettings, usePipelineOrchestratorGetAudioAssignment, usePipelineOrchestratorGetAudioAssignments, usePipelineOrchestratorGetAudioNodeLoad, usePipelineOrchestratorGetCameraMetrics, usePipelineOrchestratorGetCameraSettings, usePipelineOrchestratorGetCameraStatus, usePipelineOrchestratorGetCameraStatuses, usePipelineOrchestratorGetCameraStepOverrides, usePipelineOrchestratorGetCapabilityBindings, usePipelineOrchestratorGetDeviceLiveContribution, usePipelineOrchestratorGetDeviceSettingsContribution, usePipelineOrchestratorGetGlobalMetrics, usePipelineOrchestratorGetIngestOwner, usePipelineOrchestratorGetNodeInferenceDevices, usePipelineOrchestratorGetPipelineAssignment, usePipelineOrchestratorGetPipelineAssignments, usePipelineOrchestratorGetPipelineDevicePin, usePipelineOrchestratorListAgentSettings, usePipelineOrchestratorListTemplates, usePipelineOrchestratorRebalance, usePipelineOrchestratorRemoveAgentSettings, usePipelineOrchestratorResetNodePipelineDefaults, usePipelineOrchestratorResolvePipeline, usePipelineOrchestratorSaveTemplate, usePipelineOrchestratorSetAgentCapabilities, usePipelineOrchestratorSetAgentDetectWeight, usePipelineOrchestratorSetAgentInferenceDevices, usePipelineOrchestratorSetAgentMaxCameras, usePipelineOrchestratorSetAgentReachableHost, usePipelineOrchestratorSetCameraPipelineForAgent, usePipelineOrchestratorSetCameraStepOverride, usePipelineOrchestratorSetCameraStepToggle, usePipelineOrchestratorSetCapabilityBinding, usePipelineOrchestratorSetPipelineDevicePin, usePipelineOrchestratorUnassignAudio, usePipelineOrchestratorUnassignPipeline, usePipelineOrchestratorUpdateTemplate, usePipelineRunnerAttachCamera, usePipelineRunnerDetachCamera, usePipelineRunnerGetAllCameraMetrics, usePipelineRunnerGetCameraMetrics, usePipelineRunnerGetLocalCameras, usePipelineRunnerGetLocalLoad, usePipelineRunnerGetLocalMetrics, usePipelineRunnerGetNativeCrop, usePipelineRunnerReportMotion, usePipelineRunnerRunDetailSubtree, 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, usePrivacyMaskSetMask, usePtzAutotrackGetSettings, usePtzAutotrackGetStatus, usePtzAutotrackSetEnabled, usePtzAutotrackSetSettings, usePtzContinuousMove, usePtzDeletePreset, usePtzGetOptions, usePtzGetPosition, usePtzGetPresets, usePtzGetStatus, usePtzGoHome, usePtzGoToPreset, usePtzMove, usePtzSavePreset, usePtzSetAutofocus, usePtzStop, useRebootReboot, useRecordedPlayback, useRecordingApplyDeviceSettingsPatch, useRecordingCancelRelocate, useRecordingDeleteFootprint, useRecordingExportCancelExport, useRecordingExportCreateExport, useRecordingExportDeleteExport, useRecordingExportGetDownloadUrl, useRecordingExportGetExport, useRecordingExportListExports, useRecordingGetAvailability, useRecordingGetDaysWithRecordings, useRecordingGetDeviceConfig, useRecordingGetDeviceLiveContribution, useRecordingGetDeviceSettingsContribution, useRecordingGetPlaybackManifest, useRecordingGetRelocateStatus, useRecordingGetStatus, useRecordingGetStorageUsage, useRecordingListOpsLog, useRecordingLocateSegment, useRecordingPruneFootage, useRecordingReadSegmentBytes, useRecordingRelocateFootage, useRecordingRenderClip, useRecordingRenderGif, useRecordingRescanStorage, useRecordingSetDeviceConfig, useRemoteComponent, useSceneMonitorCaptureReference, useSceneMonitorCreateScene, useSceneMonitorDeleteReference, useSceneMonitorDeleteScene, useSceneMonitorGetStatus, useSceneMonitorListScenes, useSceneMonitorRecheckNow, useSceneMonitorUpdateScene, useScriptRunnerGetStatus, useScriptRunnerRun, useScriptRunnerStop, useScrubController, useServerManagementApplyServerUpdate, useServerManagementCheckServerUpdate, useServerManagementGetServerPackageStatus, useServerManagementRestartServer, useServerManagementRollbackServerUpdate, useSettingsStoreCount, useSettingsStoreDeclareCollection, useSettingsStoreDelete, useSettingsStoreGet, useSettingsStoreHistogram, useSettingsStoreInsert, useSettingsStoreIsEmpty, useSettingsStoreQuery, useSettingsStoreSet, useSettingsStoreUpdate, useSmokeGetStatus, useSnapshotApplyDeviceSettingsPatch, useSnapshotGetDeviceLiveContribution, useSnapshotGetDeviceSettingsContribution, useSnapshotGetSnapshot, useSnapshotGetSnapshotOverview, useSnapshotGetStatus, useSnapshotInvalidateCache, useStorageAbortUpload, useStorageBeginDownload, useStorageBeginUpload, useStorageDelete, useStorageDeleteLocation, useStorageEndDownload, useStorageExists, useStorageFinalizeUpload, useStorageGetAvailableSpace, useStorageGetDefaultLocation, useStorageList, useStorageListLocationDeclarations, useStorageListLocations, useStorageListProviders, useStorageRead, useStorageReadChunk, useStorageResolve, useStorageTestConfig, useStorageTestLocation, useStorageUpsertLocation, useStorageWrite, useStorageWriteChunk, useStreamBrokerApplyDeviceSettingsPatch, useStreamBrokerAssignProfile, useStreamBrokerGetAllRtspEntries, useStreamBrokerGetBrokerStats, useStreamBrokerGetDeviceLiveContribution, useStreamBrokerGetDeviceSettingsContribution, useStreamBrokerGetPreBufferInfo, useStreamBrokerGetRtspEntry, useStreamBrokerGetRtspPort, useStreamBrokerGetStreamUrl, useStreamBrokerGetStreamWithCodec, useStreamBrokerIsRtspEnabled, useStreamBrokerKillClient, useStreamBrokerListAllCameraStreams, useStreamBrokerListAllProfileSlots, useStreamBrokerListClients, useStreamBrokerProbeStream, useStreamBrokerPublishCameraStream, useStreamBrokerPullAudioChunks, useStreamBrokerPullFrameHandles, useStreamBrokerRegenerateRtspToken, useStreamBrokerReleaseStreamWithCodec, useStreamBrokerRenderPreBufferClip, useStreamBrokerRestartProfile, useStreamBrokerRetractCameraStream, useStreamBrokerSetPreBufferDuration, useStreamBrokerSetRtspEnabled, useStreamBrokerSubscribeAudioChunks, useStreamBrokerSubscribeFrames, useStreamBrokerUnassignProfile, useStreamBrokerUnsubscribeAudioChunks, useStreamBrokerUnsubscribeFrames, useStreamCatalogGetCatalog, useStreamParamsGetConfigSchema, useStreamParamsGetOptions, useStreamParamsGetStatus, useStreamParamsSetProfile, useSwitchGetStatus, useSwitchSetState, useSystem, useSystemFeatureFlags, useSystemForceRetentionCleanup, useSystemGetRetentionConfig, useSystemHealth, useSystemInfo, useSystemMutation, useSystemNetworkAddresses, useSystemQuery, useSystemSetRetentionConfig, useTamperGetStatus, useTemperatureSensorGetStatus, useTerminalSessionClose, useTerminalSessionListProfiles, useTerminalSessionListSessions, useTerminalSessionOpenSession, useTerminalSessionResize, useThemeMode, useToastOnToast, useTurnProviderGetTurnServers, useUpdateGetStatus, useUpdateInstallUpdate, useUserManagementConfirmTotp, useUserManagementCreateApiKey, useUserManagementCreateScopedToken, useUserManagementCreateUser, useUserManagementDeleteUser, useUserManagementDisableTotp, useUserManagementGetTotpStatus, useUserManagementListApiKeys, useUserManagementListOauthSessions, useUserManagementListScopedTokens, useUserManagementListUsers, useUserManagementOauthExchangeCode, useUserManagementOauthIssueCode, useUserManagementOauthRefresh, useUserManagementOauthVerifyAccessToken, useUserManagementResetPassword, useUserManagementRevokeApiKey, useUserManagementRevokeOauthSession, useUserManagementRevokeScopedToken, useUserManagementSetUserScopes, useUserManagementSetupTotp, useUserManagementUpdateUser, useUserManagementValidateApiKey, useUserManagementValidateCredentials, useUserManagementValidateScopedToken, useUserManagementVerifyTotp, useVacuumControlGetStatus, useVacuumControlLocate, useVacuumControlPause, useVacuumControlReturnToBase, useVacuumControlSetFanSpeed, useVacuumControlStart, useVacuumControlStop, useValveClose, useValveGetStatus, useValveOpen, useValveSetPosition, useValveStop, useVibrationGetStatus, useVideoclipsGetClipPlayback, useVideoclipsListClips, useVodPlayback, useWaterHeaterGetStatus, useWaterHeaterSetAway, useWaterHeaterSetOperationMode, useWaterHeaterSetTargetTemp, useWeatherGetStatus, useWebrtcSessionAddIceCandidate, useWebrtcSessionCloseSession, useWebrtcSessionCreateSession, useWebrtcSessionGetIceCandidates, useWebrtcSessionGetSessionState, useWebrtcSessionHandleAnswer, useWebrtcSessionHandleOffer, useWebrtcSessionHasAdaptiveBitrate, useWebrtcSessionListStreams, useWidget, useWidgetMetadata, useWidgetRegistry, useZoneAnalyticsGetCameraHistory, useZoneAnalyticsGetCurrentSnapshot, useZoneAnalyticsGetUnzonedHistory, useZoneAnalyticsGetZoneHistory, useZoneEditing, useZoneRulesListRules, useZoneRulesSetRules, useZonesAddZone, useZonesListZones, useZonesRemoveZone, useZonesUpdateZone, vacuumStateMeta, validateScopes, valveStateMeta, waterHeaterPhase, waterHeaterTint, weatherConditionMeta, weatherTint };