@camstack/ui-library 1.2.11 → 1.2.13

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",
@@ -18138,6 +18138,12 @@ var useBackupListArchives = trpc.backup.listArchives.useQuery;
18138
18138
  var useBackupUpsertDestinationPolicy = trpc.backup.upsertDestinationPolicy.useMutation;
18139
18139
  /** Generated alias around `trpc.backup.previewSchedule.useQuery`. */
18140
18140
  var useBackupPreviewSchedule = trpc.backup.previewSchedule.useQuery;
18141
+ /** Generated alias around `trpc.backup.listSchedules.useQuery`. */
18142
+ var useBackupListSchedules = trpc.backup.listSchedules.useQuery;
18143
+ /** Generated alias around `trpc.backup.upsertSchedule.useMutation`. */
18144
+ var useBackupUpsertSchedule = trpc.backup.upsertSchedule.useMutation;
18145
+ /** Generated alias around `trpc.backup.deleteSchedule.useMutation`. */
18146
+ var useBackupDeleteSchedule = trpc.backup.deleteSchedule.useMutation;
18141
18147
  /** Generated alias around `trpc.battery.wakeForStream.useMutation`. */
18142
18148
  var useBatteryWakeForStream = trpc.battery.wakeForStream.useMutation;
18143
18149
  /** Generated alias around `trpc.battery.getStatus.useQuery`. */
@@ -18698,6 +18704,10 @@ var useLocalNetworkList = trpc.localNetwork.list.useQuery;
18698
18704
  var useLocalNetworkGetPreferred = trpc.localNetwork.getPreferred.useQuery;
18699
18705
  /** Generated alias around `trpc.localNetwork.getConnectionEndpoints.useQuery`. */
18700
18706
  var useLocalNetworkGetConnectionEndpoints = trpc.localNetwork.getConnectionEndpoints.useQuery;
18707
+ /** Generated alias around `trpc.localNetwork.getNotificationEndpoint.useQuery`. */
18708
+ var useLocalNetworkGetNotificationEndpoint = trpc.localNetwork.getNotificationEndpoint.useQuery;
18709
+ /** Generated alias around `trpc.localNetwork.setNotificationEndpoint.useMutation`. */
18710
+ var useLocalNetworkSetNotificationEndpoint = trpc.localNetwork.setNotificationEndpoint.useMutation;
18701
18711
  /** Generated alias around `trpc.localNetwork.getAllowedAddresses.useQuery`. */
18702
18712
  var useLocalNetworkGetAllowedAddresses = trpc.localNetwork.getAllowedAddresses.useQuery;
18703
18713
  /** Generated alias around `trpc.localNetwork.setAllowedAddresses.useMutation`. */
@@ -18970,6 +18980,12 @@ var usePipelineAnalyticsGetEventStoreFootprint = trpc.pipelineAnalytics.getEvent
18970
18980
  var usePipelineAnalyticsPruneEvents = trpc.pipelineAnalytics.pruneEvents.useMutation;
18971
18981
  /** Generated alias around `trpc.pipelineAnalytics.deleteDeviceEvents.useMutation`. */
18972
18982
  var usePipelineAnalyticsDeleteDeviceEvents = trpc.pipelineAnalytics.deleteDeviceEvents.useMutation;
18983
+ /** Generated alias around `trpc.pipelineAnalytics.relocateMedia.useMutation`. */
18984
+ var usePipelineAnalyticsRelocateMedia = trpc.pipelineAnalytics.relocateMedia.useMutation;
18985
+ /** Generated alias around `trpc.pipelineAnalytics.getMediaRelocateStatus.useQuery`. */
18986
+ var usePipelineAnalyticsGetMediaRelocateStatus = trpc.pipelineAnalytics.getMediaRelocateStatus.useQuery;
18987
+ /** Generated alias around `trpc.pipelineAnalytics.cancelMediaRelocate.useMutation`. */
18988
+ var usePipelineAnalyticsCancelMediaRelocate = trpc.pipelineAnalytics.cancelMediaRelocate.useMutation;
18973
18989
  /** Generated alias around `trpc.pipelineAnalytics.listOpsLog.useQuery`. */
18974
18990
  var usePipelineAnalyticsListOpsLog = trpc.pipelineAnalytics.listOpsLog.useQuery;
18975
18991
  /** Generated alias around `trpc.pipelineAnalytics.getEventMedia.useQuery`. */
@@ -19266,6 +19282,16 @@ var useRecordingPruneFootage = trpc.recording.pruneFootage.useMutation;
19266
19282
  var useRecordingDeleteFootprint = trpc.recording.deleteFootprint.useMutation;
19267
19283
  /** Generated alias around `trpc.recording.listOpsLog.useQuery`. */
19268
19284
  var useRecordingListOpsLog = trpc.recording.listOpsLog.useQuery;
19285
+ /** Generated alias around `trpc.recording.renderGif.useMutation`. */
19286
+ var useRecordingRenderGif = trpc.recording.renderGif.useMutation;
19287
+ /** Generated alias around `trpc.recording.renderClip.useMutation`. */
19288
+ var useRecordingRenderClip = trpc.recording.renderClip.useMutation;
19289
+ /** Generated alias around `trpc.recording.relocateFootage.useMutation`. */
19290
+ var useRecordingRelocateFootage = trpc.recording.relocateFootage.useMutation;
19291
+ /** Generated alias around `trpc.recording.getRelocateStatus.useQuery`. */
19292
+ var useRecordingGetRelocateStatus = trpc.recording.getRelocateStatus.useQuery;
19293
+ /** Generated alias around `trpc.recording.cancelRelocate.useMutation`. */
19294
+ var useRecordingCancelRelocate = trpc.recording.cancelRelocate.useMutation;
19269
19295
  /** Generated alias around `trpc.recording.getStatus.useQuery`. */
19270
19296
  var useRecordingGetStatus = trpc.recording.getStatus.useQuery;
19271
19297
  /** Generated alias around `trpc.recording.getDeviceSettingsContribution.useQuery`. */
@@ -19406,6 +19432,8 @@ var useStreamBrokerRetractCameraStream = trpc.streamBroker.retractCameraStream.u
19406
19432
  var useStreamBrokerAssignProfile = trpc.streamBroker.assignProfile.useMutation;
19407
19433
  /** Generated alias around `trpc.streamBroker.unassignProfile.useMutation`. */
19408
19434
  var useStreamBrokerUnassignProfile = trpc.streamBroker.unassignProfile.useMutation;
19435
+ /** Generated alias around `trpc.streamBroker.renderPreBufferClip.useMutation`. */
19436
+ var useStreamBrokerRenderPreBufferClip = trpc.streamBroker.renderPreBufferClip.useMutation;
19409
19437
  /** Generated alias around `trpc.streamBroker.listAllCameraStreams.useQuery`. */
19410
19438
  var useStreamBrokerListAllCameraStreams = trpc.streamBroker.listAllCameraStreams.useQuery;
19411
19439
  /** Generated alias around `trpc.streamBroker.listAllProfileSlots.useQuery`. */
@@ -34705,315 +34733,108 @@ function AutotrackSection({ deviceId }) {
34705
34733
  }
34706
34734
  //#endregion
34707
34735
  //#region src/composites/cap-settings/recording-config-form.ts
34708
- function emptyRule() {
34736
+ /** Every weekday — the `days` of a band that covers the whole week. */
34737
+ var ALL_WEEKDAYS = [
34738
+ 0,
34739
+ 1,
34740
+ 2,
34741
+ 3,
34742
+ 4,
34743
+ 5,
34744
+ 6
34745
+ ];
34746
+ /** The full-day span of an always-on band (`HH:MM`, 23:59 = end of day). */
34747
+ var ALL_DAY_START = "00:00";
34748
+ var ALL_DAY_END = "23:59";
34749
+ /** A band covering every day, all day, in `mode` — what the Base tab authors. */
34750
+ function alwaysBand(mode, rest) {
34709
34751
  return {
34710
- schedule: { kind: "always" },
34711
- mode: "continuous",
34712
- preBufferSec: 0,
34713
- postBufferSec: 0,
34714
- resetTimeoutOnNewEvent: true
34752
+ days: [...ALL_WEEKDAYS],
34753
+ start: ALL_DAY_START,
34754
+ end: ALL_DAY_END,
34755
+ mode,
34756
+ ...rest
34715
34757
  };
34716
34758
  }
34717
- function isTriggerMode(mode) {
34718
- return mode === "onMotion" || mode === "onAudioThreshold";
34759
+ /** A fresh row for the Advanced band table: every day, office hours, continuous. */
34760
+ function emptyBand() {
34761
+ return {
34762
+ days: [...ALL_WEEKDAYS],
34763
+ start: "09:00",
34764
+ end: "18:00",
34765
+ mode: "continuous"
34766
+ };
34719
34767
  }
34720
- function withRuleAt(rules, index, patch) {
34721
- return rules.map((r, i) => i === index ? {
34722
- ...r,
34768
+ function withBandAt(bands, index, patch) {
34769
+ return bands.map((band, i) => i === index ? {
34770
+ ...band,
34723
34771
  ...patch
34724
- } : r);
34772
+ } : band);
34773
+ }
34774
+ function removeBandAt(bands, index) {
34775
+ return bands.filter((_, i) => i !== index);
34725
34776
  }
34726
- function removeRuleAt(rules, index) {
34727
- return rules.filter((_, i) => i !== index);
34777
+ /** Does this band cover the whole week, all day? (the Base-tab shape) */
34778
+ function isAlwaysBand(band) {
34779
+ return (band.days.length === 0 || ALL_WEEKDAYS.every((d) => band.days.includes(d))) && band.start === "00:00" && band.end === "23:59";
34728
34780
  }
34729
- /** Recording bands normalized: explicit `schedules[]` wins, the deprecated
34730
- * singular `schedule` is lifted, absent = empty (= always). */
34731
- function bandsOf(cfg) {
34732
- if (cfg.schedules && cfg.schedules.length > 0) return [...cfg.schedules];
34733
- if (cfg.schedule) return [cfg.schedule];
34734
- return [];
34781
+ /**
34782
+ * A config is "advanced" when its bands cannot be expressed by the Base tab —
34783
+ * i.e. more than one band, or a single band restricted in time or weekday. Such
34784
+ * a config opens directly in the Advanced band table so nothing is silently
34785
+ * flattened by the simpler form.
34786
+ */
34787
+ function isAdvancedConfig(cfg) {
34788
+ if (cfg.bands.length > 1) return true;
34789
+ const [only] = cfg.bands;
34790
+ return only !== void 0 && !isAlwaysBand(only);
34735
34791
  }
34736
- /** Read a persisted/migrated config into the Basic form state. `mode` is read
34737
- * directly; a legacy mode-less config falls back to continuous/off by `enabled`. */
34792
+ /**
34793
+ * Read a persisted config into the Basic form state. `mode` is DERIVED from the
34794
+ * bands by the same function the recorder stamps `config.mode` with; the
34795
+ * `events` parameters come from the first events band, so re-opening the form
34796
+ * shows what is actually recorded.
34797
+ */
34738
34798
  function formStateFromConfig(cfg) {
34799
+ const eventsBand = cfg.bands.find((band) => band.mode === "events");
34739
34800
  return {
34740
- mode: cfg.mode ?? (cfg.enabled ? "continuous" : "off"),
34801
+ mode: deriveRecordingMode(cfg),
34741
34802
  profiles: cfg.profiles,
34742
34803
  segmentSeconds: cfg.segmentSeconds,
34743
- schedules: bandsOf(cfg),
34744
- triggers: cfg.triggers ?? {},
34745
- preBufferSec: cfg.preBufferSec,
34746
- postBufferSec: cfg.postBufferSec,
34804
+ triggers: eventsBand?.triggers ?? {},
34805
+ preBufferSec: eventsBand?.preBufferSec,
34806
+ postBufferSec: eventsBand?.postBufferSec,
34747
34807
  retention: cfg.retention,
34748
34808
  scrubThumbnails: cfg.scrubThumbnails
34749
34809
  };
34750
34810
  }
34751
- /** Serialize the Basic form state back to the wire config. `enabled` is derived
34752
- * from `mode`; `rules`/singular `schedule` are never emitted. Schedules,
34753
- * triggers and buffers are preserved even when off so they survive a re-enable. */
34811
+ /**
34812
+ * Serialize the Basic form state to the wire config: one always-on band of the
34813
+ * chosen mode, none when `off`. `enabled` follows the mode; `mode` itself is
34814
+ * NOT sent — the recorder stamps it as the derived summary of the bands.
34815
+ */
34754
34816
  function configFromFormState(state) {
34755
34817
  return {
34756
34818
  enabled: state.mode !== "off",
34757
- mode: state.mode,
34819
+ bands: bandsFromFormState(state),
34758
34820
  profiles: state.profiles ? [...state.profiles] : void 0,
34759
34821
  segmentSeconds: state.segmentSeconds,
34760
- schedules: state.schedules.length > 0 ? [...state.schedules] : void 0,
34761
- triggers: Object.keys(state.triggers).length > 0 ? state.triggers : void 0,
34762
- preBufferSec: state.preBufferSec,
34763
- postBufferSec: state.postBufferSec,
34764
34822
  retention: state.retention,
34765
34823
  scrubThumbnails: state.scrubThumbnails
34766
34824
  };
34767
34825
  }
34768
- /**
34769
- * A config is "advanced" when it carries `rules[]` that the backend could NOT
34770
- * cleanly collapse to a `mode` (the non-destructive `migrateRulesToMode` leaves
34771
- * `mode` absent). The settings UI opens such a config in the Advanced rules tab.
34772
- */
34773
- function isAdvancedConfig(cfg) {
34774
- return cfg.mode == null && (cfg.rules?.length ?? 0) > 0;
34775
- }
34776
- //#endregion
34777
- //#region src/composites/cap-settings/RecordingRulesEditor.tsx
34778
- var DAYS = [
34779
- {
34780
- d: 0,
34781
- label: "S"
34782
- },
34783
- {
34784
- d: 1,
34785
- label: "M"
34786
- },
34787
- {
34788
- d: 2,
34789
- label: "T"
34790
- },
34791
- {
34792
- d: 3,
34793
- label: "W"
34794
- },
34795
- {
34796
- d: 4,
34797
- label: "T"
34798
- },
34799
- {
34800
- d: 5,
34801
- label: "F"
34802
- },
34803
- {
34804
- d: 6,
34805
- label: "S"
34806
- }
34807
- ];
34808
- /** Converts a select string value to RecordingMode without a cast. */
34809
- function toMode(v) {
34810
- return v === "onMotion" || v === "onAudioThreshold" ? v : "continuous";
34811
- }
34812
- /**
34813
- * The rule patch to apply when the mode changes, normalising the fields that
34814
- * only apply to certain modes so a saved rule never carries stale values:
34815
- * `continuous` drops the pre/post buffers + threshold; trigger modes drop the
34816
- * threshold unless it's `onAudioThreshold`, which is seeded to -30 dBFS when
34817
- * unset so the displayed default is the value actually persisted.
34818
- */
34819
- function modePatch(rule, mode) {
34820
- if (mode === "onAudioThreshold") return {
34821
- mode,
34822
- thresholdDbfs: rule.thresholdDbfs ?? -30
34823
- };
34824
- if (mode === "onMotion") return {
34825
- mode,
34826
- thresholdDbfs: void 0
34827
- };
34828
- return {
34829
- mode,
34830
- preBufferSec: 0,
34831
- postBufferSec: 0,
34832
- thresholdDbfs: void 0
34833
- };
34834
- }
34835
- function TimeOfDayRow({ schedule, onChange }) {
34836
- const toggleDay = (d) => {
34837
- const cur = schedule.days ?? [
34838
- 0,
34839
- 1,
34840
- 2,
34841
- 3,
34842
- 4,
34843
- 5,
34844
- 6
34845
- ];
34846
- const days = cur.includes(d) ? cur.filter((x) => x !== d) : [...cur, d].toSorted((a, b) => a - b);
34847
- onChange({
34848
- ...schedule,
34849
- days
34850
- });
34851
- };
34852
- return /* @__PURE__ */ jsxs("div", {
34853
- className: "flex flex-wrap items-center gap-2 text-xs",
34854
- children: [
34855
- /* @__PURE__ */ jsx("input", {
34856
- type: "time",
34857
- value: schedule.start,
34858
- onChange: (e) => onChange({
34859
- ...schedule,
34860
- start: e.target.value
34861
- }),
34862
- className: "rounded-md border border-border bg-background px-2 py-1 text-xs"
34863
- }),
34864
- /* @__PURE__ */ jsx("span", { children: "–" }),
34865
- /* @__PURE__ */ jsx("input", {
34866
- type: "time",
34867
- value: schedule.end,
34868
- onChange: (e) => onChange({
34869
- ...schedule,
34870
- end: e.target.value
34871
- }),
34872
- className: "rounded-md border border-border bg-background px-2 py-1 text-xs"
34873
- }),
34874
- /* @__PURE__ */ jsx("div", {
34875
- className: "flex gap-1",
34876
- children: DAYS.map(({ d, label }) => {
34877
- return /* @__PURE__ */ jsx("button", {
34878
- type: "button",
34879
- onClick: () => toggleDay(d),
34880
- 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"}`,
34881
- children: label
34882
- }, d);
34883
- })
34884
- })
34885
- ]
34886
- });
34887
- }
34888
- function RecordingRulesEditor({ rules, onChange }) {
34889
- return /* @__PURE__ */ jsxs("div", {
34890
- className: "space-y-2",
34891
- children: [
34892
- rules.length === 0 ? /* @__PURE__ */ jsx("p", {
34893
- className: "text-xs text-foreground-subtle",
34894
- children: "No rules — recording is continuous (always) when enabled."
34895
- }) : null,
34896
- rules.map((rule, i) => /* @__PURE__ */ jsxs("div", {
34897
- className: "space-y-2 rounded-lg border border-border bg-surface p-3",
34898
- children: [
34899
- /* @__PURE__ */ jsxs("div", {
34900
- className: "flex items-center justify-between gap-2",
34901
- children: [/* @__PURE__ */ jsxs("select", {
34902
- className: "rounded-md border border-border bg-background px-2 py-1 text-xs",
34903
- value: rule.schedule.kind,
34904
- onChange: (e) => {
34905
- onChange(withRuleAt(rules, i, { schedule: e.target.value === "timeOfDay" ? {
34906
- kind: "timeOfDay",
34907
- start: "00:00",
34908
- end: "23:59"
34909
- } : { kind: "always" } }));
34910
- },
34911
- children: [/* @__PURE__ */ jsx("option", {
34912
- value: "always",
34913
- children: "Always"
34914
- }), /* @__PURE__ */ jsx("option", {
34915
- value: "timeOfDay",
34916
- children: "Time of day"
34917
- })]
34918
- }), /* @__PURE__ */ jsx("button", {
34919
- type: "button",
34920
- onClick: () => onChange(removeRuleAt(rules, i)),
34921
- className: "text-foreground-subtle hover:text-red-500",
34922
- children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4" })
34923
- })]
34924
- }),
34925
- rule.schedule.kind === "timeOfDay" ? /* @__PURE__ */ jsx(TimeOfDayRow, {
34926
- schedule: rule.schedule,
34927
- onChange: (schedule) => onChange(withRuleAt(rules, i, { schedule }))
34928
- }) : null,
34929
- /* @__PURE__ */ jsxs("div", {
34930
- className: "flex flex-wrap items-center gap-2 text-xs",
34931
- children: [
34932
- /* @__PURE__ */ jsxs("select", {
34933
- className: "rounded-md border border-border bg-background px-2 py-1 text-xs",
34934
- value: rule.mode,
34935
- onChange: (e) => onChange(withRuleAt(rules, i, modePatch(rule, toMode(e.target.value)))),
34936
- children: [
34937
- /* @__PURE__ */ jsx("option", {
34938
- value: "continuous",
34939
- children: "Continuous"
34940
- }),
34941
- /* @__PURE__ */ jsx("option", {
34942
- value: "onMotion",
34943
- children: "On motion"
34944
- }),
34945
- /* @__PURE__ */ jsx("option", {
34946
- value: "onAudioThreshold",
34947
- children: "On audio"
34948
- })
34949
- ]
34950
- }),
34951
- isTriggerMode(rule.mode) ? /* @__PURE__ */ jsxs(Fragment$1, { children: [
34952
- /* @__PURE__ */ jsxs("label", {
34953
- className: "flex items-center gap-1",
34954
- children: [
34955
- "pre",
34956
- /* @__PURE__ */ jsx("input", {
34957
- type: "number",
34958
- min: 0,
34959
- value: rule.preBufferSec,
34960
- onChange: (e) => onChange(withRuleAt(rules, i, { preBufferSec: Number(e.target.value) })),
34961
- className: "w-14 rounded-md border border-border bg-background px-1 py-1 text-xs"
34962
- }),
34963
- "s"
34964
- ]
34965
- }),
34966
- /* @__PURE__ */ jsxs("label", {
34967
- className: "flex items-center gap-1",
34968
- children: [
34969
- "post",
34970
- /* @__PURE__ */ jsx("input", {
34971
- type: "number",
34972
- min: 0,
34973
- value: rule.postBufferSec,
34974
- onChange: (e) => onChange(withRuleAt(rules, i, { postBufferSec: Number(e.target.value) })),
34975
- className: "w-14 rounded-md border border-border bg-background px-1 py-1 text-xs"
34976
- }),
34977
- "s"
34978
- ]
34979
- }),
34980
- /* @__PURE__ */ jsxs("label", {
34981
- className: "flex items-center gap-1",
34982
- children: [/* @__PURE__ */ jsx("input", {
34983
- type: "checkbox",
34984
- checked: rule.resetTimeoutOnNewEvent,
34985
- onChange: (e) => onChange(withRuleAt(rules, i, { resetTimeoutOnNewEvent: e.target.checked }))
34986
- }), "reset"]
34987
- })
34988
- ] }) : null,
34989
- rule.mode === "onAudioThreshold" ? /* @__PURE__ */ jsxs("label", {
34990
- className: "flex items-center gap-1",
34991
- children: [
34992
- "thr",
34993
- /* @__PURE__ */ jsx("input", {
34994
- type: "number",
34995
- value: rule.thresholdDbfs ?? -30,
34996
- onChange: (e) => onChange(withRuleAt(rules, i, { thresholdDbfs: Number(e.target.value) })),
34997
- className: "w-16 rounded-md border border-border bg-background px-1 py-1 text-xs"
34998
- }),
34999
- "dBFS"
35000
- ]
35001
- }) : null
35002
- ]
35003
- })
35004
- ]
35005
- }, i)),
35006
- /* @__PURE__ */ jsxs("button", {
35007
- type: "button",
35008
- onClick: () => onChange([...rules, emptyRule()]),
35009
- 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",
35010
- children: [/* @__PURE__ */ jsx(Plus, { className: "h-3.5 w-3.5" }), " Add rule"]
35011
- })
35012
- ]
35013
- });
34826
+ /** The Base tab's bands: one always-on band of the chosen mode (none = off). */
34827
+ function bandsFromFormState(state) {
34828
+ if (state.mode === "off") return [];
34829
+ if (state.mode === "continuous") return [alwaysBand("continuous")];
34830
+ return [alwaysBand("events", {
34831
+ ...Object.keys(state.triggers).length > 0 ? { triggers: state.triggers } : {},
34832
+ ...state.preBufferSec !== void 0 ? { preBufferSec: state.preBufferSec } : {},
34833
+ ...state.postBufferSec !== void 0 ? { postBufferSec: state.postBufferSec } : {}
34834
+ })];
35014
34835
  }
35015
34836
  //#endregion
35016
- //#region src/composites/cap-settings/ScheduleBandsEditor.tsx
34837
+ //#region src/composites/cap-settings/RecordingBandsEditor.tsx
35017
34838
  /** Weekday chips in display order (Mon→Sun); value is `Date.getDay()` (0=Sun). */
35018
34839
  var WEEKDAYS = [
35019
34840
  {
@@ -35045,115 +34866,177 @@ var WEEKDAYS = [
35045
34866
  label: "Sun"
35046
34867
  }
35047
34868
  ];
35048
- function newBand() {
35049
- return {
35050
- kind: "timeOfDay",
35051
- start: "09:00",
35052
- end: "18:00"
35053
- };
35054
- }
35055
- function ScheduleBandsEditor({ schedules, onChange }) {
35056
- const replaceAt = (i, band) => onChange(schedules.map((s, idx) => idx === i ? band : s));
35057
- const removeAt = (i) => onChange(schedules.filter((_, idx) => idx !== i));
35058
- const addBand = () => onChange([...schedules, newBand()]);
34869
+ var BAND_MODES = [{
34870
+ value: "continuous",
34871
+ label: "Continuous"
34872
+ }, {
34873
+ value: "events",
34874
+ label: "Events"
34875
+ }];
34876
+ /**
34877
+ * The band table the ONLY authoring surface for recording intent since the
34878
+ * legacy mode/schedules/triggers/rules model was retired (2026-07-30).
34879
+ *
34880
+ * Each row is one `RecordingBand`: when it applies (weekdays + `HH:MM` span,
34881
+ * `end <= start` wraps past midnight) and how it records (continuous, or events
34882
+ * with its own triggers and pre/post buffers). No band covering *now* = nothing
34883
+ * is recorded then; "off" is the absence of a band, never a band value.
34884
+ */
34885
+ function RecordingBandsEditor({ bands, onChange }) {
35059
34886
  return /* @__PURE__ */ jsxs("div", {
35060
34887
  className: "space-y-2",
35061
- children: [schedules.length === 0 ? /* @__PURE__ */ jsx("p", {
34888
+ children: [bands.length === 0 ? /* @__PURE__ */ jsx("p", {
35062
34889
  className: "text-[11px] text-foreground-subtle",
35063
- children: "Always (24/7)add a band to restrict hours."
35064
- }) : schedules.map((band, i) => /* @__PURE__ */ jsx(BandRow, {
34890
+ children: "No bandsnothing is recorded. Add one to start."
34891
+ }) : bands.map((band, i) => /* @__PURE__ */ jsx(BandRow, {
35065
34892
  band,
35066
- onChange: (b) => replaceAt(i, b),
35067
- onRemove: () => removeAt(i)
34893
+ onChange: (patch) => onChange(withBandAt(bands, i, patch)),
34894
+ onRemove: () => onChange(removeBandAt(bands, i))
35068
34895
  }, i)), /* @__PURE__ */ jsxs("button", {
35069
34896
  type: "button",
35070
- onClick: addBand,
34897
+ onClick: () => onChange([...bands, emptyBand()]),
35071
34898
  className: "flex items-center gap-1 rounded-md bg-surface-hover px-2 py-1 text-[11px] text-foreground-subtle hover:text-foreground",
35072
34899
  children: [/* @__PURE__ */ jsx(Plus, { className: "h-3 w-3" }), " Add band"]
35073
34900
  })]
35074
34901
  });
35075
34902
  }
34903
+ function numOrUndef(value) {
34904
+ return value === "" ? void 0 : Number(value);
34905
+ }
35076
34906
  function BandRow({ band, onChange, onRemove }) {
35077
- if (band.kind === "always") return /* @__PURE__ */ jsxs("div", {
35078
- className: "flex items-center gap-2 text-xs",
35079
- children: [
35080
- /* @__PURE__ */ jsx("span", {
35081
- className: "flex-1",
35082
- children: "Always"
35083
- }),
35084
- /* @__PURE__ */ jsx("button", {
35085
- type: "button",
35086
- onClick: () => onChange(newBand()),
35087
- className: "text-foreground-subtle hover:text-foreground underline",
35088
- children: "Set band"
35089
- }),
35090
- /* @__PURE__ */ jsx("button", {
35091
- type: "button",
35092
- onClick: onRemove,
35093
- "aria-label": "Remove band",
35094
- className: "text-foreground-subtle hover:text-red-500",
35095
- children: /* @__PURE__ */ jsx(Trash2, { className: "h-3.5 w-3.5" })
35096
- })
35097
- ]
35098
- });
35099
- const days = band.days ?? [];
35100
34907
  const toggleDay = (value) => {
35101
- const next = days.includes(value) ? days.filter((d) => d !== value) : [...days, value];
35102
- onChange({
35103
- ...band,
35104
- days: next.length > 0 ? next : void 0
35105
- });
34908
+ const current = band.days.length === 0 ? WEEKDAYS.map((d) => d.value) : band.days;
34909
+ onChange({ days: current.includes(value) ? current.filter((d) => d !== value) : [...current, value] });
35106
34910
  };
34911
+ const setTriggers = (patch) => onChange({ triggers: {
34912
+ ...band.triggers,
34913
+ ...patch
34914
+ } });
35107
34915
  return /* @__PURE__ */ jsxs("div", {
35108
34916
  className: "space-y-1.5 rounded-md border border-border p-2",
35109
- children: [/* @__PURE__ */ jsxs("div", {
35110
- className: "flex items-center gap-2 text-xs",
35111
- children: [
35112
- /* @__PURE__ */ jsx("input", {
35113
- type: "time",
35114
- value: band.start,
35115
- onChange: (e) => onChange({
35116
- ...band,
35117
- start: e.target.value
34917
+ children: [
34918
+ /* @__PURE__ */ jsxs("div", {
34919
+ className: "flex flex-wrap items-center gap-2 text-xs",
34920
+ children: [
34921
+ /* @__PURE__ */ jsx("input", {
34922
+ type: "time",
34923
+ "aria-label": "Band start",
34924
+ value: band.start,
34925
+ onChange: (e) => onChange({ start: e.target.value }),
34926
+ className: "rounded-md border border-border bg-background px-1 py-0.5"
35118
34927
  }),
35119
- className: "rounded-md border border-border bg-background px-1 py-0.5"
35120
- }),
35121
- /* @__PURE__ */ jsx("span", {
35122
- className: "text-foreground-subtle",
35123
- children: "→"
35124
- }),
35125
- /* @__PURE__ */ jsx("input", {
35126
- type: "time",
35127
- value: band.end,
35128
- onChange: (e) => onChange({
35129
- ...band,
35130
- end: e.target.value
34928
+ /* @__PURE__ */ jsx("span", {
34929
+ className: "text-foreground-subtle",
34930
+ children: ""
35131
34931
  }),
35132
- className: "rounded-md border border-border bg-background px-1 py-0.5"
35133
- }),
35134
- /* @__PURE__ */ jsx("span", { className: "flex-1" }),
35135
- /* @__PURE__ */ jsx("button", {
35136
- type: "button",
35137
- onClick: onRemove,
35138
- "aria-label": "Remove band",
35139
- className: "text-foreground-subtle hover:text-red-500",
35140
- children: /* @__PURE__ */ jsx(Trash2, { className: "h-3.5 w-3.5" })
35141
- })
35142
- ]
35143
- }), /* @__PURE__ */ jsxs("div", {
35144
- className: "flex flex-wrap gap-1",
35145
- children: [WEEKDAYS.map((d) => {
35146
- return /* @__PURE__ */ jsx("button", {
35147
- type: "button",
35148
- onClick: () => toggleDay(d.value),
35149
- 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"}`,
35150
- children: d.label
35151
- }, d.value);
35152
- }), days.length === 0 ? /* @__PURE__ */ jsx("span", {
35153
- className: "self-center text-[10px] text-foreground-subtle",
35154
- children: "every day"
35155
- }) : null]
35156
- })]
34932
+ /* @__PURE__ */ jsx("input", {
34933
+ type: "time",
34934
+ "aria-label": "Band end",
34935
+ value: band.end,
34936
+ onChange: (e) => onChange({ end: e.target.value }),
34937
+ className: "rounded-md border border-border bg-background px-1 py-0.5"
34938
+ }),
34939
+ /* @__PURE__ */ jsx("span", {
34940
+ className: "flex gap-1",
34941
+ children: BAND_MODES.map((m) => /* @__PURE__ */ jsx("button", {
34942
+ type: "button",
34943
+ onClick: () => onChange({ mode: m.value }),
34944
+ className: `rounded px-2 py-0.5 ${band.mode === m.value ? "bg-primary text-primary-foreground" : "bg-surface-hover text-foreground-subtle"}`,
34945
+ children: m.label
34946
+ }, m.value))
34947
+ }),
34948
+ /* @__PURE__ */ jsx("span", { className: "flex-1" }),
34949
+ /* @__PURE__ */ jsx("button", {
34950
+ type: "button",
34951
+ onClick: onRemove,
34952
+ "aria-label": "Remove band",
34953
+ className: "text-foreground-subtle hover:text-red-500",
34954
+ children: /* @__PURE__ */ jsx(Trash2, { className: "h-3.5 w-3.5" })
34955
+ })
34956
+ ]
34957
+ }),
34958
+ /* @__PURE__ */ jsxs("div", {
34959
+ className: "flex flex-wrap gap-1",
34960
+ children: [WEEKDAYS.map((d) => {
34961
+ return /* @__PURE__ */ jsx("button", {
34962
+ type: "button",
34963
+ onClick: () => toggleDay(d.value),
34964
+ 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"}`,
34965
+ children: d.label
34966
+ }, d.value);
34967
+ }), band.days.length === 0 ? /* @__PURE__ */ jsx("span", {
34968
+ className: "self-center text-[10px] text-foreground-subtle",
34969
+ children: "every day"
34970
+ }) : null]
34971
+ }),
34972
+ band.mode === "events" ? /* @__PURE__ */ jsxs("div", {
34973
+ className: "space-y-1.5 border-t border-border pt-1.5",
34974
+ children: [
34975
+ /* @__PURE__ */ jsxs("label", {
34976
+ className: "flex items-center gap-2 text-xs",
34977
+ children: [/* @__PURE__ */ jsx("input", {
34978
+ type: "checkbox",
34979
+ checked: band.triggers?.motion ?? false,
34980
+ onChange: (e) => setTriggers({ motion: e.target.checked ? true : void 0 })
34981
+ }), "Motion"]
34982
+ }),
34983
+ /* @__PURE__ */ jsxs("label", {
34984
+ className: "flex items-center gap-2 text-xs",
34985
+ children: [
34986
+ /* @__PURE__ */ jsx("input", {
34987
+ type: "checkbox",
34988
+ checked: band.triggers?.audioThresholdDbfs != null,
34989
+ onChange: (e) => setTriggers({ audioThresholdDbfs: e.target.checked ? -30 : void 0 })
34990
+ }),
34991
+ "Audio above threshold",
34992
+ band.triggers?.audioThresholdDbfs != null ? /* @__PURE__ */ jsx("input", {
34993
+ type: "number",
34994
+ "aria-label": "Audio threshold dBFS",
34995
+ value: band.triggers.audioThresholdDbfs,
34996
+ onChange: (e) => setTriggers({ audioThresholdDbfs: numOrUndef(e.target.value) }),
34997
+ className: "w-16 rounded-md border border-border bg-background px-1 py-0.5 text-xs"
34998
+ }) : null,
34999
+ /* @__PURE__ */ jsx("span", {
35000
+ className: "text-foreground-subtle",
35001
+ children: "dBFS"
35002
+ })
35003
+ ]
35004
+ }),
35005
+ /* @__PURE__ */ jsxs("div", {
35006
+ className: "flex flex-wrap items-center gap-3 text-xs",
35007
+ children: [/* @__PURE__ */ jsxs("label", {
35008
+ className: "flex items-center gap-1",
35009
+ children: [
35010
+ "Pre-buffer",
35011
+ /* @__PURE__ */ jsx("input", {
35012
+ type: "number",
35013
+ min: 0,
35014
+ value: band.preBufferSec ?? "",
35015
+ placeholder: "0",
35016
+ onChange: (e) => onChange({ preBufferSec: numOrUndef(e.target.value) }),
35017
+ className: "w-16 rounded-md border border-border bg-background px-1 py-1 text-xs"
35018
+ }),
35019
+ "s"
35020
+ ]
35021
+ }), /* @__PURE__ */ jsxs("label", {
35022
+ className: "flex items-center gap-1",
35023
+ children: [
35024
+ "Post-buffer",
35025
+ /* @__PURE__ */ jsx("input", {
35026
+ type: "number",
35027
+ min: 0,
35028
+ value: band.postBufferSec ?? "",
35029
+ placeholder: "0",
35030
+ onChange: (e) => onChange({ postBufferSec: numOrUndef(e.target.value) }),
35031
+ className: "w-16 rounded-md border border-border bg-background px-1 py-1 text-xs"
35032
+ }),
35033
+ "s"
35034
+ ]
35035
+ })]
35036
+ })
35037
+ ]
35038
+ }) : null
35039
+ ]
35157
35040
  });
35158
35041
  }
35159
35042
  //#endregion
@@ -35177,16 +35060,15 @@ var MODES = [
35177
35060
  label: "Continuous"
35178
35061
  }
35179
35062
  ];
35180
- function RecordingSettings({ initial, saving, onSave }) {
35063
+ function RecordingSettings({ initial, saving, onSave, onRegenerateStrips, regeneratingStrips }) {
35181
35064
  const [tab, setTab] = useState(isAdvancedConfig(initial) ? "advanced" : "base");
35182
35065
  const [base, setBase] = useState(formStateFromConfig(initial));
35183
- const [advEnabled, setAdvEnabled] = useState(initial.enabled);
35184
- const [rules, setRules] = useState(initial.rules ? [...initial.rules] : []);
35066
+ const [bands, setBands] = useState([...initial.bands]);
35185
35067
  const [common, setCommon] = useState({
35186
35068
  profiles: initial.profiles,
35187
35069
  segmentSeconds: initial.segmentSeconds,
35188
35070
  retention: initial.retention,
35189
- scrubThumbnails: initial.scrubThumbnails
35071
+ stripsEnabled: initial.stripsEnabled
35190
35072
  });
35191
35073
  const ret = common.retention ?? {};
35192
35074
  const setRet = (patch) => setCommon({
@@ -35197,10 +35079,6 @@ function RecordingSettings({ initial, saving, onSave }) {
35197
35079
  }
35198
35080
  });
35199
35081
  const numOrUndef = (v) => v === "" ? void 0 : Number(v);
35200
- const parsePreset = (v) => {
35201
- const parsed = ScrubThumbnailPresetSchema.safeParse(v);
35202
- return parsed.success ? parsed.data : DEFAULT_SCRUB_THUMBNAIL_PRESET;
35203
- };
35204
35082
  const toggleProfile = (p) => {
35205
35083
  const cur = common.profiles ?? [...PROFILES];
35206
35084
  const next = cur.includes(p) ? cur.filter((x) => x !== p) : [...cur, p];
@@ -35217,24 +35095,31 @@ function RecordingSettings({ initial, saving, onSave }) {
35217
35095
  }
35218
35096
  });
35219
35097
  const switchTab = (next) => {
35220
- if (next === "advanced" && rules.length === 0) setRules([emptyRule()]);
35098
+ if (next === "advanced") setBands(bandsFromFormState(base));
35099
+ else setBase(formStateFromConfig({
35100
+ enabled: bands.length > 0,
35101
+ bands
35102
+ }));
35221
35103
  setTab(next);
35222
35104
  };
35223
35105
  const handleSave = () => {
35224
- if (tab === "base") onSave(configFromFormState({
35225
- ...base,
35226
- profiles: common.profiles,
35227
- segmentSeconds: common.segmentSeconds,
35228
- retention: common.retention,
35229
- scrubThumbnails: common.scrubThumbnails
35230
- }));
35231
- else onSave({
35232
- enabled: advEnabled,
35233
- rules,
35106
+ const shared = {
35234
35107
  profiles: common.profiles ? [...common.profiles] : void 0,
35235
35108
  segmentSeconds: common.segmentSeconds,
35236
35109
  retention: common.retention,
35237
- scrubThumbnails: common.scrubThumbnails
35110
+ ...common.stripsEnabled === void 0 ? {} : { stripsEnabled: common.stripsEnabled }
35111
+ };
35112
+ if (tab === "base") onSave({
35113
+ ...configFromFormState({
35114
+ ...base,
35115
+ ...shared
35116
+ }),
35117
+ ...shared
35118
+ });
35119
+ else onSave({
35120
+ enabled: bands.length > 0,
35121
+ bands,
35122
+ ...shared
35238
35123
  });
35239
35124
  };
35240
35125
  return /* @__PURE__ */ jsxs("div", {
@@ -35246,7 +35131,7 @@ function RecordingSettings({ initial, saving, onSave }) {
35246
35131
  type: "button",
35247
35132
  onClick: () => switchTab(t),
35248
35133
  className: `rounded px-2.5 py-1 ${tab === t ? "bg-primary text-primary-foreground" : "bg-surface-hover text-foreground-subtle"}`,
35249
- children: t === "base" ? "Base" : "Advanced (rules)"
35134
+ children: t === "base" ? "Base" : "Advanced (bands)"
35250
35135
  }, t))
35251
35136
  }),
35252
35137
  tab === "base" ? /* @__PURE__ */ jsxs("div", {
@@ -35267,16 +35152,17 @@ function RecordingSettings({ initial, saving, onSave }) {
35267
35152
  children: m.label
35268
35153
  }, m.value))]
35269
35154
  }),
35270
- base.mode !== "off" ? /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
35271
- className: "mb-1.5 text-[11px] font-semibold uppercase tracking-wider text-foreground-subtle",
35272
- children: "Time bands"
35273
- }), /* @__PURE__ */ jsx(ScheduleBandsEditor, {
35274
- schedules: base.schedules,
35275
- onChange: (schedules) => setBase({
35276
- ...base,
35277
- schedules
35278
- })
35279
- })] }) : null,
35155
+ base.mode !== "off" ? /* @__PURE__ */ jsxs("p", {
35156
+ className: "text-[11px] text-foreground-subtle",
35157
+ children: [
35158
+ "Records 24/7. Use ",
35159
+ /* @__PURE__ */ jsx("span", {
35160
+ className: "font-medium",
35161
+ children: "Advanced (bands)"
35162
+ }),
35163
+ " to restrict hours or weekdays, or to mix continuous and event windows."
35164
+ ]
35165
+ }) : null,
35280
35166
  base.mode === "events" ? /* @__PURE__ */ jsxs("div", {
35281
35167
  className: "space-y-2",
35282
35168
  children: [
@@ -35354,22 +35240,22 @@ function RecordingSettings({ initial, saving, onSave }) {
35354
35240
  ]
35355
35241
  }) : null
35356
35242
  ]
35357
- }) : /* @__PURE__ */ jsxs("div", {
35243
+ }) : /* @__PURE__ */ jsx("div", {
35358
35244
  className: "space-y-4",
35359
- children: [/* @__PURE__ */ jsxs("label", {
35360
- className: "flex items-center gap-2 text-xs",
35361
- children: [/* @__PURE__ */ jsx("input", {
35362
- type: "checkbox",
35363
- checked: advEnabled,
35364
- onChange: (e) => setAdvEnabled(e.target.checked)
35365
- }), "Record this camera"]
35366
- }), /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
35367
- className: "mb-1.5 text-[11px] font-semibold uppercase tracking-wider text-foreground-subtle",
35368
- children: "Rules"
35369
- }), /* @__PURE__ */ jsx(RecordingRulesEditor, {
35370
- rules,
35371
- onChange: setRules
35372
- })] })]
35245
+ children: /* @__PURE__ */ jsxs("div", { children: [
35246
+ /* @__PURE__ */ jsx("div", {
35247
+ className: "mb-1.5 text-[11px] font-semibold uppercase tracking-wider text-foreground-subtle",
35248
+ children: "Recording bands"
35249
+ }),
35250
+ /* @__PURE__ */ jsx(RecordingBandsEditor, {
35251
+ bands,
35252
+ onChange: setBands
35253
+ }),
35254
+ /* @__PURE__ */ jsx("p", {
35255
+ className: "mt-1.5 text-[11px] text-foreground-subtle",
35256
+ children: "A band says WHEN to record and HOW. Nothing is recorded outside every band — an empty table means this camera is off."
35257
+ })
35258
+ ] })
35373
35259
  }),
35374
35260
  /* @__PURE__ */ jsxs("div", {
35375
35261
  className: "flex flex-wrap items-center gap-4 text-xs",
@@ -35408,27 +35294,30 @@ function RecordingSettings({ initial, saving, onSave }) {
35408
35294
  }),
35409
35295
  /* @__PURE__ */ jsxs("label", {
35410
35296
  className: "flex items-center gap-1",
35411
- children: [/* @__PURE__ */ jsx("span", {
35412
- className: "text-foreground-subtle",
35413
- children: "Scrub preview quality"
35414
- }), /* @__PURE__ */ jsx("select", {
35415
- value: common.scrubThumbnails ?? DEFAULT_SCRUB_THUMBNAIL_PRESET,
35297
+ children: [/* @__PURE__ */ jsx("input", {
35298
+ type: "checkbox",
35299
+ checked: common.stripsEnabled === true,
35416
35300
  onChange: (e) => setCommon({
35417
35301
  ...common,
35418
- scrubThumbnails: parsePreset(e.target.value)
35419
- }),
35420
- className: "rounded-md border border-border bg-background px-1 py-1 text-xs",
35421
- children: SCRUB_THUMBNAIL_PRESET_ORDER.map((p) => /* @__PURE__ */ jsx("option", {
35422
- value: p,
35423
- children: SCRUB_THUMBNAIL_PRESET_LABELS[p]
35424
- }, p))
35302
+ stripsEnabled: e.target.checked
35303
+ })
35304
+ }), /* @__PURE__ */ jsx("span", {
35305
+ className: "text-foreground-subtle",
35306
+ children: "Scrub thumbnail strips"
35425
35307
  })]
35426
- })
35308
+ }),
35309
+ onRegenerateStrips ? /* @__PURE__ */ jsx("button", {
35310
+ type: "button",
35311
+ onClick: onRegenerateStrips,
35312
+ disabled: regeneratingStrips === true,
35313
+ 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",
35314
+ children: regeneratingStrips === true ? "Regenerating…" : "Regenerate strips"
35315
+ }) : null
35427
35316
  ]
35428
35317
  }),
35429
35318
  /* @__PURE__ */ jsx("p", {
35430
35319
  className: "text-[11px] text-foreground-subtle",
35431
- 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."
35320
+ 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."
35432
35321
  }),
35433
35322
  /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
35434
35323
  className: "mb-1.5 text-[11px] font-semibold uppercase tracking-wider text-foreground-subtle",
@@ -36677,6 +36566,14 @@ function RecordingPanel({ deviceId }) {
36677
36566
  const configQuery = useRecordingGetDeviceConfig({ deviceId });
36678
36567
  const setConfig = useRecordingSetDeviceConfig();
36679
36568
  const rescanStorage = useRecordingRescanStorage();
36569
+ const customAction = useAddonsCustom();
36570
+ const regenerateStrips = useCallback(() => {
36571
+ customAction.mutate({
36572
+ addonId: "recorder",
36573
+ action: "regenerateStrips",
36574
+ input: { deviceId }
36575
+ });
36576
+ }, [customAction, deviceId]);
36680
36577
  const saveConfig = (config) => {
36681
36578
  setConfig.mutate({
36682
36579
  deviceId,
@@ -36718,7 +36615,9 @@ function RecordingPanel({ deviceId }) {
36718
36615
  children: resolvedConfig ? /* @__PURE__ */ jsx(RecordingSettings, {
36719
36616
  initial: resolvedConfig,
36720
36617
  saving: setConfig.isPending,
36721
- onSave: saveConfig
36618
+ onSave: saveConfig,
36619
+ onRegenerateStrips: regenerateStrips,
36620
+ regeneratingStrips: customAction.isPending
36722
36621
  }, JSON.stringify(resolvedConfig)) : /* @__PURE__ */ jsx("div", {
36723
36622
  className: "px-1 py-2 text-xs text-foreground-subtle",
36724
36623
  children: "Loading settings…"
@@ -40284,6 +40183,21 @@ function DetectionBoxes({ detections, frameWidth, frameHeight }) {
40284
40183
  }
40285
40184
  //#endregion
40286
40185
  //#region src/composites/camera-stream-player.tsx
40186
+ /**
40187
+ * Silence (or restore) a live WebRTC stream FOR REAL.
40188
+ *
40189
+ * `video.muted` alone is not enough: iOS WebKit keeps playing a
40190
+ * `MediaStream`'s audio track through a muted element, which is why live audio
40191
+ * kept sounding under recorded playback on the viewer. Gating the audio TRACK
40192
+ * (`track.enabled`) is what actually stops it, so both are set together — and
40193
+ * re-applied at every stream swap, because a freshly-attached stream arrives
40194
+ * with its tracks enabled whatever the element says.
40195
+ */
40196
+ function applyStreamMute(video, muted) {
40197
+ video.muted = muted;
40198
+ const stream = video.srcObject;
40199
+ if (stream instanceof MediaStream) for (const track of stream.getAudioTracks()) track.enabled = !muted;
40200
+ }
40287
40201
  function isTouchDevice() {
40288
40202
  if (typeof window === "undefined") return false;
40289
40203
  return window.matchMedia("(hover: none) and (pointer: coarse)").matches || typeof navigator !== "undefined" && navigator.maxTouchPoints > 0 || "ontouchstart" in window;
@@ -40366,6 +40280,11 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
40366
40280
  const [state, setState] = useState("idle");
40367
40281
  const [errorMessage, setErrorMessage] = useState("");
40368
40282
  const [isMuted, setIsMuted] = useState(initialMuted);
40283
+ /** Read by the async stream-swap closures: a freshly-promoted stream must
40284
+ * arrive already respecting the CURRENT mute, not the one captured at
40285
+ * connect time. */
40286
+ const isMutedRef = useRef(isMuted);
40287
+ isMutedRef.current = isMuted;
40369
40288
  const [isFullscreen, setIsFullscreen] = useState(false);
40370
40289
  const [isPipSupported, setIsPipSupported] = useState(false);
40371
40290
  const isTouch = isTouchDevice();
@@ -40495,6 +40414,7 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
40495
40414
  pcRef.current = pc;
40496
40415
  if (videoRef.current) {
40497
40416
  videoRef.current.srcObject = combinedStream;
40417
+ applyStreamMute(videoRef.current, isMutedRef.current);
40498
40418
  videoRef.current.play().catch(() => {});
40499
40419
  }
40500
40420
  if (oldPc && oldPc !== pc) try {
@@ -40514,6 +40434,7 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
40514
40434
  }
40515
40435
  if (videoRef.current) {
40516
40436
  videoRef.current.srcObject = combinedStream;
40437
+ applyStreamMute(videoRef.current, isMutedRef.current);
40517
40438
  videoRef.current.play().catch(() => {});
40518
40439
  }
40519
40440
  };
@@ -40600,6 +40521,7 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
40600
40521
  whepStream.addTrack(event.track);
40601
40522
  if (videoRef.current) {
40602
40523
  videoRef.current.srcObject = whepStream;
40524
+ applyStreamMute(videoRef.current, isMutedRef.current);
40603
40525
  videoRef.current.play().catch(() => {});
40604
40526
  }
40605
40527
  };
@@ -40672,6 +40594,7 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
40672
40594
  pcRef.current = pc;
40673
40595
  if (videoRef.current) {
40674
40596
  videoRef.current.srcObject = combinedStream;
40597
+ applyStreamMute(videoRef.current, isMutedRef.current);
40675
40598
  videoRef.current.play().catch(() => {});
40676
40599
  }
40677
40600
  if (oldPc && oldPc !== pc) try {
@@ -40692,6 +40615,7 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
40692
40615
  }
40693
40616
  if (videoRef.current) {
40694
40617
  videoRef.current.srcObject = combinedStream;
40618
+ applyStreamMute(videoRef.current, isMutedRef.current);
40695
40619
  videoRef.current.play().catch(() => {});
40696
40620
  }
40697
40621
  };
@@ -41016,7 +40940,7 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
41016
40940
  mountedRef.current = false;
41017
40941
  cleanup();
41018
40942
  };
41019
- }, [serverUrl, streamKey]);
40943
+ }, []);
41020
40944
  const hasSignaledRef = useRef(false);
41021
40945
  useEffect(() => {
41022
40946
  if (!autoPlay) return;
@@ -41054,6 +40978,23 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
41054
40978
  }
41055
40979
  connect();
41056
40980
  };
40981
+ const prevServerUrlRef = useRef(serverUrl);
40982
+ const prevStreamKeyRef = useRef(streamKey);
40983
+ useEffect(() => {
40984
+ const serverChanged = prevServerUrlRef.current !== serverUrl;
40985
+ const keyChanged = prevStreamKeyRef.current !== streamKey;
40986
+ prevServerUrlRef.current = serverUrl;
40987
+ prevStreamKeyRef.current = streamKey;
40988
+ if (!serverChanged && !keyChanged) return;
40989
+ if (!mountedRef.current) return;
40990
+ reconnectAttemptsRef.current = 0;
40991
+ if (serverChanged) {
40992
+ cleanup();
40993
+ connect();
40994
+ return;
40995
+ }
40996
+ handleSeamlessReconnect();
40997
+ }, [serverUrl, streamKey]);
41057
40998
  const prevReconnectSignalRef = useRef(reconnectSignal);
41058
40999
  useEffect(() => {
41059
41000
  if (prevReconnectSignalRef.current === reconnectSignal) return;
@@ -41063,8 +41004,9 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
41063
41004
  }, [reconnectSignal]);
41064
41005
  const toggleMute = () => {
41065
41006
  if (videoRef.current) {
41066
- videoRef.current.muted = !videoRef.current.muted;
41067
- setIsMuted(videoRef.current.muted);
41007
+ const next = !videoRef.current.muted;
41008
+ applyStreamMute(videoRef.current, next);
41009
+ setIsMuted(next);
41068
41010
  }
41069
41011
  };
41070
41012
  const toggleFullscreen = async () => {
@@ -41292,7 +41234,7 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
41292
41234
  setIsMuted(initialMuted);
41293
41235
  const video = videoRef.current;
41294
41236
  if (!video) return;
41295
- video.muted = initialMuted;
41237
+ applyStreamMute(video, initialMuted);
41296
41238
  if (!initialMuted) video.play().catch(() => {});
41297
41239
  }, [initialMuted]);
41298
41240
  const showToolbarBriefly = () => {
@@ -42404,7 +42346,7 @@ function StreamPanel({ serverUrl, createSession, sendAnswer, handleOffer, getIce
42404
42346
  extraOverlay,
42405
42347
  ptzOverlayVisible && ptzOverlay
42406
42348
  ] }) : void 0
42407
- }, effectiveStreamId)
42349
+ })
42408
42350
  }) : /* @__PURE__ */ jsx(SnapshotPreview, {
42409
42351
  src: snapshotSrc ?? null,
42410
42352
  isLoading: snapshotLoading,
@@ -46785,6 +46727,15 @@ function useDeviceDetections(trpc, deviceId) {
46785
46727
  * @param deviceId - numeric device ID (null = disabled)
46786
46728
  * @param pollIntervalMs - how often to refresh profile slots (default: 5000)
46787
46729
  */
46730
+ /** TTL for the TURN/STUN credential cache. Short enough that rotated creds
46731
+ * are picked up promptly, long enough to cover a connect + several profile
46732
+ * switches without re-paying the fetch. */
46733
+ var TURN_CACHE_TTL_MS = 5 * 6e4;
46734
+ /** Keyed on the caller's trpc client object (stable per connected system —
46735
+ * NOT on `trpc.turnProvider`, which is a proxy minted fresh on every property
46736
+ * access), so two admin tabs pointed at different hubs never cross-serve
46737
+ * credentials. An unstable key degrades to a cache miss, never to wrong creds. */
46738
+ var turnServersCache = /* @__PURE__ */ new WeakMap();
46788
46739
  function useDeviceWebrtc(trpc, deviceId, pollIntervalMs = 5e3) {
46789
46740
  const [remoteStreams, setRemoteStreams] = useState([]);
46790
46741
  useEffect(() => {
@@ -46854,18 +46805,28 @@ function useDeviceWebrtc(trpc, deviceId, pollIntervalMs = 5e3) {
46854
46805
  }, [deviceId, remoteStreams]);
46855
46806
  const getIceServers = useCallback(async () => {
46856
46807
  if (!trpc.turnProvider) return void 0;
46808
+ const cached = turnServersCache.get(trpc);
46809
+ if (cached && Date.now() - cached.fetchedAt < TURN_CACHE_TTL_MS) return cached.servers;
46857
46810
  try {
46858
- return (await trpc.turnProvider.getTurnServers.query()).map((s) => {
46811
+ const mapped = (await trpc.turnProvider.getTurnServers.query()).map((s) => {
46859
46812
  return {
46860
46813
  urls: typeof s.urls === "string" ? s.urls : [...s.urls],
46861
46814
  ...s.username !== void 0 ? { username: s.username } : {},
46862
46815
  ...s.credential !== void 0 ? { credential: s.credential } : {}
46863
46816
  };
46864
46817
  });
46818
+ turnServersCache.set(trpc, {
46819
+ servers: mapped,
46820
+ fetchedAt: Date.now()
46821
+ });
46822
+ return mapped;
46865
46823
  } catch {
46866
- return;
46824
+ return cached?.servers;
46867
46825
  }
46868
46826
  }, [trpc]);
46827
+ useEffect(() => {
46828
+ getIceServers();
46829
+ }, [getIceServers]);
46869
46830
  const createSession = useCallback(async (target, hints) => {
46870
46831
  if (deviceId === null) throw new Error("No device selected");
46871
46832
  const res = await trpc.webrtcSession.createSession.mutate({
@@ -47235,4 +47196,4 @@ var MotionZonesSettings = lazy(() => import("./MotionZonesSettings-NcxxQN8r.js")
47235
47196
  /** Lazy-wrapped `PrivacyMaskSettings` — code-split off the main bundle. */
47236
47197
  var PrivacyMaskSettings = lazy(() => import("./PrivacyMaskSettings-APgPLF7p.js").then((m) => ({ default: m.PrivacyMaskSettings })));
47237
47198
  //#endregion
47238
- 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, useBackupGetEntries, useBackupList, useBackupListArchives, useBackupListDestinations, useBackupListLocations, useBackupPreviewSchedule, useBackupRestore, useBackupTrigger, useBackupUpsertDestinationPolicy, 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 };
47199
+ 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, 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 };