@camstack/ui-library 1.2.12 → 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",
@@ -18704,6 +18704,10 @@ var useLocalNetworkList = trpc.localNetwork.list.useQuery;
18704
18704
  var useLocalNetworkGetPreferred = trpc.localNetwork.getPreferred.useQuery;
18705
18705
  /** Generated alias around `trpc.localNetwork.getConnectionEndpoints.useQuery`. */
18706
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;
18707
18711
  /** Generated alias around `trpc.localNetwork.getAllowedAddresses.useQuery`. */
18708
18712
  var useLocalNetworkGetAllowedAddresses = trpc.localNetwork.getAllowedAddresses.useQuery;
18709
18713
  /** Generated alias around `trpc.localNetwork.setAllowedAddresses.useMutation`. */
@@ -18976,6 +18980,12 @@ var usePipelineAnalyticsGetEventStoreFootprint = trpc.pipelineAnalytics.getEvent
18976
18980
  var usePipelineAnalyticsPruneEvents = trpc.pipelineAnalytics.pruneEvents.useMutation;
18977
18981
  /** Generated alias around `trpc.pipelineAnalytics.deleteDeviceEvents.useMutation`. */
18978
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;
18979
18989
  /** Generated alias around `trpc.pipelineAnalytics.listOpsLog.useQuery`. */
18980
18990
  var usePipelineAnalyticsListOpsLog = trpc.pipelineAnalytics.listOpsLog.useQuery;
18981
18991
  /** Generated alias around `trpc.pipelineAnalytics.getEventMedia.useQuery`. */
@@ -19272,6 +19282,16 @@ var useRecordingPruneFootage = trpc.recording.pruneFootage.useMutation;
19272
19282
  var useRecordingDeleteFootprint = trpc.recording.deleteFootprint.useMutation;
19273
19283
  /** Generated alias around `trpc.recording.listOpsLog.useQuery`. */
19274
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;
19275
19295
  /** Generated alias around `trpc.recording.getStatus.useQuery`. */
19276
19296
  var useRecordingGetStatus = trpc.recording.getStatus.useQuery;
19277
19297
  /** Generated alias around `trpc.recording.getDeviceSettingsContribution.useQuery`. */
@@ -19412,6 +19432,8 @@ var useStreamBrokerRetractCameraStream = trpc.streamBroker.retractCameraStream.u
19412
19432
  var useStreamBrokerAssignProfile = trpc.streamBroker.assignProfile.useMutation;
19413
19433
  /** Generated alias around `trpc.streamBroker.unassignProfile.useMutation`. */
19414
19434
  var useStreamBrokerUnassignProfile = trpc.streamBroker.unassignProfile.useMutation;
19435
+ /** Generated alias around `trpc.streamBroker.renderPreBufferClip.useMutation`. */
19436
+ var useStreamBrokerRenderPreBufferClip = trpc.streamBroker.renderPreBufferClip.useMutation;
19415
19437
  /** Generated alias around `trpc.streamBroker.listAllCameraStreams.useQuery`. */
19416
19438
  var useStreamBrokerListAllCameraStreams = trpc.streamBroker.listAllCameraStreams.useQuery;
19417
19439
  /** Generated alias around `trpc.streamBroker.listAllProfileSlots.useQuery`. */
@@ -34711,315 +34733,108 @@ function AutotrackSection({ deviceId }) {
34711
34733
  }
34712
34734
  //#endregion
34713
34735
  //#region src/composites/cap-settings/recording-config-form.ts
34714
- 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) {
34715
34751
  return {
34716
- schedule: { kind: "always" },
34717
- mode: "continuous",
34718
- preBufferSec: 0,
34719
- postBufferSec: 0,
34720
- resetTimeoutOnNewEvent: true
34752
+ days: [...ALL_WEEKDAYS],
34753
+ start: ALL_DAY_START,
34754
+ end: ALL_DAY_END,
34755
+ mode,
34756
+ ...rest
34721
34757
  };
34722
34758
  }
34723
- function isTriggerMode(mode) {
34724
- 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
+ };
34725
34767
  }
34726
- function withRuleAt(rules, index, patch) {
34727
- return rules.map((r, i) => i === index ? {
34728
- ...r,
34768
+ function withBandAt(bands, index, patch) {
34769
+ return bands.map((band, i) => i === index ? {
34770
+ ...band,
34729
34771
  ...patch
34730
- } : r);
34772
+ } : band);
34773
+ }
34774
+ function removeBandAt(bands, index) {
34775
+ return bands.filter((_, i) => i !== index);
34731
34776
  }
34732
- function removeRuleAt(rules, index) {
34733
- 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";
34734
34780
  }
34735
- /** Recording bands normalized: explicit `schedules[]` wins, the deprecated
34736
- * singular `schedule` is lifted, absent = empty (= always). */
34737
- function bandsOf(cfg) {
34738
- if (cfg.schedules && cfg.schedules.length > 0) return [...cfg.schedules];
34739
- if (cfg.schedule) return [cfg.schedule];
34740
- return [];
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);
34741
34791
  }
34742
- /** Read a persisted/migrated config into the Basic form state. `mode` is read
34743
- * directly; a legacy mode-less config falls back to continuous/off by `enabled`. */
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
+ */
34744
34798
  function formStateFromConfig(cfg) {
34799
+ const eventsBand = cfg.bands.find((band) => band.mode === "events");
34745
34800
  return {
34746
- mode: cfg.mode ?? (cfg.enabled ? "continuous" : "off"),
34801
+ mode: deriveRecordingMode(cfg),
34747
34802
  profiles: cfg.profiles,
34748
34803
  segmentSeconds: cfg.segmentSeconds,
34749
- schedules: bandsOf(cfg),
34750
- triggers: cfg.triggers ?? {},
34751
- preBufferSec: cfg.preBufferSec,
34752
- postBufferSec: cfg.postBufferSec,
34804
+ triggers: eventsBand?.triggers ?? {},
34805
+ preBufferSec: eventsBand?.preBufferSec,
34806
+ postBufferSec: eventsBand?.postBufferSec,
34753
34807
  retention: cfg.retention,
34754
34808
  scrubThumbnails: cfg.scrubThumbnails
34755
34809
  };
34756
34810
  }
34757
- /** Serialize the Basic form state back to the wire config. `enabled` is derived
34758
- * from `mode`; `rules`/singular `schedule` are never emitted. Schedules,
34759
- * triggers and buffers are preserved even when off so they survive a re-enable. */
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
+ */
34760
34816
  function configFromFormState(state) {
34761
34817
  return {
34762
34818
  enabled: state.mode !== "off",
34763
- mode: state.mode,
34819
+ bands: bandsFromFormState(state),
34764
34820
  profiles: state.profiles ? [...state.profiles] : void 0,
34765
34821
  segmentSeconds: state.segmentSeconds,
34766
- schedules: state.schedules.length > 0 ? [...state.schedules] : void 0,
34767
- triggers: Object.keys(state.triggers).length > 0 ? state.triggers : void 0,
34768
- preBufferSec: state.preBufferSec,
34769
- postBufferSec: state.postBufferSec,
34770
34822
  retention: state.retention,
34771
34823
  scrubThumbnails: state.scrubThumbnails
34772
34824
  };
34773
34825
  }
34774
- /**
34775
- * A config is "advanced" when it carries `rules[]` that the backend could NOT
34776
- * cleanly collapse to a `mode` (the non-destructive `migrateRulesToMode` leaves
34777
- * `mode` absent). The settings UI opens such a config in the Advanced rules tab.
34778
- */
34779
- function isAdvancedConfig(cfg) {
34780
- return cfg.mode == null && (cfg.rules?.length ?? 0) > 0;
34781
- }
34782
- //#endregion
34783
- //#region src/composites/cap-settings/RecordingRulesEditor.tsx
34784
- var DAYS = [
34785
- {
34786
- d: 0,
34787
- label: "S"
34788
- },
34789
- {
34790
- d: 1,
34791
- label: "M"
34792
- },
34793
- {
34794
- d: 2,
34795
- label: "T"
34796
- },
34797
- {
34798
- d: 3,
34799
- label: "W"
34800
- },
34801
- {
34802
- d: 4,
34803
- label: "T"
34804
- },
34805
- {
34806
- d: 5,
34807
- label: "F"
34808
- },
34809
- {
34810
- d: 6,
34811
- label: "S"
34812
- }
34813
- ];
34814
- /** Converts a select string value to RecordingMode without a cast. */
34815
- function toMode(v) {
34816
- return v === "onMotion" || v === "onAudioThreshold" ? v : "continuous";
34817
- }
34818
- /**
34819
- * The rule patch to apply when the mode changes, normalising the fields that
34820
- * only apply to certain modes so a saved rule never carries stale values:
34821
- * `continuous` drops the pre/post buffers + threshold; trigger modes drop the
34822
- * threshold unless it's `onAudioThreshold`, which is seeded to -30 dBFS when
34823
- * unset so the displayed default is the value actually persisted.
34824
- */
34825
- function modePatch(rule, mode) {
34826
- if (mode === "onAudioThreshold") return {
34827
- mode,
34828
- thresholdDbfs: rule.thresholdDbfs ?? -30
34829
- };
34830
- if (mode === "onMotion") return {
34831
- mode,
34832
- thresholdDbfs: void 0
34833
- };
34834
- return {
34835
- mode,
34836
- preBufferSec: 0,
34837
- postBufferSec: 0,
34838
- thresholdDbfs: void 0
34839
- };
34840
- }
34841
- function TimeOfDayRow({ schedule, onChange }) {
34842
- const toggleDay = (d) => {
34843
- const cur = schedule.days ?? [
34844
- 0,
34845
- 1,
34846
- 2,
34847
- 3,
34848
- 4,
34849
- 5,
34850
- 6
34851
- ];
34852
- const days = cur.includes(d) ? cur.filter((x) => x !== d) : [...cur, d].toSorted((a, b) => a - b);
34853
- onChange({
34854
- ...schedule,
34855
- days
34856
- });
34857
- };
34858
- return /* @__PURE__ */ jsxs("div", {
34859
- className: "flex flex-wrap items-center gap-2 text-xs",
34860
- children: [
34861
- /* @__PURE__ */ jsx("input", {
34862
- type: "time",
34863
- value: schedule.start,
34864
- onChange: (e) => onChange({
34865
- ...schedule,
34866
- start: e.target.value
34867
- }),
34868
- className: "rounded-md border border-border bg-background px-2 py-1 text-xs"
34869
- }),
34870
- /* @__PURE__ */ jsx("span", { children: "–" }),
34871
- /* @__PURE__ */ jsx("input", {
34872
- type: "time",
34873
- value: schedule.end,
34874
- onChange: (e) => onChange({
34875
- ...schedule,
34876
- end: e.target.value
34877
- }),
34878
- className: "rounded-md border border-border bg-background px-2 py-1 text-xs"
34879
- }),
34880
- /* @__PURE__ */ jsx("div", {
34881
- className: "flex gap-1",
34882
- children: DAYS.map(({ d, label }) => {
34883
- return /* @__PURE__ */ jsx("button", {
34884
- type: "button",
34885
- onClick: () => toggleDay(d),
34886
- className: `h-6 w-6 rounded text-[10px] ${!schedule.days || schedule.days.includes(d) ? "bg-primary text-primary-foreground" : "bg-surface-hover text-foreground-subtle"}`,
34887
- children: label
34888
- }, d);
34889
- })
34890
- })
34891
- ]
34892
- });
34893
- }
34894
- function RecordingRulesEditor({ rules, onChange }) {
34895
- return /* @__PURE__ */ jsxs("div", {
34896
- className: "space-y-2",
34897
- children: [
34898
- rules.length === 0 ? /* @__PURE__ */ jsx("p", {
34899
- className: "text-xs text-foreground-subtle",
34900
- children: "No rules — recording is continuous (always) when enabled."
34901
- }) : null,
34902
- rules.map((rule, i) => /* @__PURE__ */ jsxs("div", {
34903
- className: "space-y-2 rounded-lg border border-border bg-surface p-3",
34904
- children: [
34905
- /* @__PURE__ */ jsxs("div", {
34906
- className: "flex items-center justify-between gap-2",
34907
- children: [/* @__PURE__ */ jsxs("select", {
34908
- className: "rounded-md border border-border bg-background px-2 py-1 text-xs",
34909
- value: rule.schedule.kind,
34910
- onChange: (e) => {
34911
- onChange(withRuleAt(rules, i, { schedule: e.target.value === "timeOfDay" ? {
34912
- kind: "timeOfDay",
34913
- start: "00:00",
34914
- end: "23:59"
34915
- } : { kind: "always" } }));
34916
- },
34917
- children: [/* @__PURE__ */ jsx("option", {
34918
- value: "always",
34919
- children: "Always"
34920
- }), /* @__PURE__ */ jsx("option", {
34921
- value: "timeOfDay",
34922
- children: "Time of day"
34923
- })]
34924
- }), /* @__PURE__ */ jsx("button", {
34925
- type: "button",
34926
- onClick: () => onChange(removeRuleAt(rules, i)),
34927
- className: "text-foreground-subtle hover:text-red-500",
34928
- children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4" })
34929
- })]
34930
- }),
34931
- rule.schedule.kind === "timeOfDay" ? /* @__PURE__ */ jsx(TimeOfDayRow, {
34932
- schedule: rule.schedule,
34933
- onChange: (schedule) => onChange(withRuleAt(rules, i, { schedule }))
34934
- }) : null,
34935
- /* @__PURE__ */ jsxs("div", {
34936
- className: "flex flex-wrap items-center gap-2 text-xs",
34937
- children: [
34938
- /* @__PURE__ */ jsxs("select", {
34939
- className: "rounded-md border border-border bg-background px-2 py-1 text-xs",
34940
- value: rule.mode,
34941
- onChange: (e) => onChange(withRuleAt(rules, i, modePatch(rule, toMode(e.target.value)))),
34942
- children: [
34943
- /* @__PURE__ */ jsx("option", {
34944
- value: "continuous",
34945
- children: "Continuous"
34946
- }),
34947
- /* @__PURE__ */ jsx("option", {
34948
- value: "onMotion",
34949
- children: "On motion"
34950
- }),
34951
- /* @__PURE__ */ jsx("option", {
34952
- value: "onAudioThreshold",
34953
- children: "On audio"
34954
- })
34955
- ]
34956
- }),
34957
- isTriggerMode(rule.mode) ? /* @__PURE__ */ jsxs(Fragment$1, { children: [
34958
- /* @__PURE__ */ jsxs("label", {
34959
- className: "flex items-center gap-1",
34960
- children: [
34961
- "pre",
34962
- /* @__PURE__ */ jsx("input", {
34963
- type: "number",
34964
- min: 0,
34965
- value: rule.preBufferSec,
34966
- onChange: (e) => onChange(withRuleAt(rules, i, { preBufferSec: Number(e.target.value) })),
34967
- className: "w-14 rounded-md border border-border bg-background px-1 py-1 text-xs"
34968
- }),
34969
- "s"
34970
- ]
34971
- }),
34972
- /* @__PURE__ */ jsxs("label", {
34973
- className: "flex items-center gap-1",
34974
- children: [
34975
- "post",
34976
- /* @__PURE__ */ jsx("input", {
34977
- type: "number",
34978
- min: 0,
34979
- value: rule.postBufferSec,
34980
- onChange: (e) => onChange(withRuleAt(rules, i, { postBufferSec: Number(e.target.value) })),
34981
- className: "w-14 rounded-md border border-border bg-background px-1 py-1 text-xs"
34982
- }),
34983
- "s"
34984
- ]
34985
- }),
34986
- /* @__PURE__ */ jsxs("label", {
34987
- className: "flex items-center gap-1",
34988
- children: [/* @__PURE__ */ jsx("input", {
34989
- type: "checkbox",
34990
- checked: rule.resetTimeoutOnNewEvent,
34991
- onChange: (e) => onChange(withRuleAt(rules, i, { resetTimeoutOnNewEvent: e.target.checked }))
34992
- }), "reset"]
34993
- })
34994
- ] }) : null,
34995
- rule.mode === "onAudioThreshold" ? /* @__PURE__ */ jsxs("label", {
34996
- className: "flex items-center gap-1",
34997
- children: [
34998
- "thr",
34999
- /* @__PURE__ */ jsx("input", {
35000
- type: "number",
35001
- value: rule.thresholdDbfs ?? -30,
35002
- onChange: (e) => onChange(withRuleAt(rules, i, { thresholdDbfs: Number(e.target.value) })),
35003
- className: "w-16 rounded-md border border-border bg-background px-1 py-1 text-xs"
35004
- }),
35005
- "dBFS"
35006
- ]
35007
- }) : null
35008
- ]
35009
- })
35010
- ]
35011
- }, i)),
35012
- /* @__PURE__ */ jsxs("button", {
35013
- type: "button",
35014
- onClick: () => onChange([...rules, emptyRule()]),
35015
- className: "flex items-center gap-1 rounded-md border border-dashed border-border px-3 py-1.5 text-xs text-foreground-subtle hover:border-primary hover:text-foreground",
35016
- children: [/* @__PURE__ */ jsx(Plus, { className: "h-3.5 w-3.5" }), " Add rule"]
35017
- })
35018
- ]
35019
- });
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
+ })];
35020
34835
  }
35021
34836
  //#endregion
35022
- //#region src/composites/cap-settings/ScheduleBandsEditor.tsx
34837
+ //#region src/composites/cap-settings/RecordingBandsEditor.tsx
35023
34838
  /** Weekday chips in display order (Mon→Sun); value is `Date.getDay()` (0=Sun). */
35024
34839
  var WEEKDAYS = [
35025
34840
  {
@@ -35051,115 +34866,177 @@ var WEEKDAYS = [
35051
34866
  label: "Sun"
35052
34867
  }
35053
34868
  ];
35054
- function newBand() {
35055
- return {
35056
- kind: "timeOfDay",
35057
- start: "09:00",
35058
- end: "18:00"
35059
- };
35060
- }
35061
- function ScheduleBandsEditor({ schedules, onChange }) {
35062
- const replaceAt = (i, band) => onChange(schedules.map((s, idx) => idx === i ? band : s));
35063
- const removeAt = (i) => onChange(schedules.filter((_, idx) => idx !== i));
35064
- const addBand = () => onChange([...schedules, newBand()]);
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 }) {
35065
34886
  return /* @__PURE__ */ jsxs("div", {
35066
34887
  className: "space-y-2",
35067
- children: [schedules.length === 0 ? /* @__PURE__ */ jsx("p", {
34888
+ children: [bands.length === 0 ? /* @__PURE__ */ jsx("p", {
35068
34889
  className: "text-[11px] text-foreground-subtle",
35069
- children: "Always (24/7)add a band to restrict hours."
35070
- }) : schedules.map((band, i) => /* @__PURE__ */ jsx(BandRow, {
34890
+ children: "No bandsnothing is recorded. Add one to start."
34891
+ }) : bands.map((band, i) => /* @__PURE__ */ jsx(BandRow, {
35071
34892
  band,
35072
- onChange: (b) => replaceAt(i, b),
35073
- onRemove: () => removeAt(i)
34893
+ onChange: (patch) => onChange(withBandAt(bands, i, patch)),
34894
+ onRemove: () => onChange(removeBandAt(bands, i))
35074
34895
  }, i)), /* @__PURE__ */ jsxs("button", {
35075
34896
  type: "button",
35076
- onClick: addBand,
34897
+ onClick: () => onChange([...bands, emptyBand()]),
35077
34898
  className: "flex items-center gap-1 rounded-md bg-surface-hover px-2 py-1 text-[11px] text-foreground-subtle hover:text-foreground",
35078
34899
  children: [/* @__PURE__ */ jsx(Plus, { className: "h-3 w-3" }), " Add band"]
35079
34900
  })]
35080
34901
  });
35081
34902
  }
34903
+ function numOrUndef(value) {
34904
+ return value === "" ? void 0 : Number(value);
34905
+ }
35082
34906
  function BandRow({ band, onChange, onRemove }) {
35083
- if (band.kind === "always") return /* @__PURE__ */ jsxs("div", {
35084
- className: "flex items-center gap-2 text-xs",
35085
- children: [
35086
- /* @__PURE__ */ jsx("span", {
35087
- className: "flex-1",
35088
- children: "Always"
35089
- }),
35090
- /* @__PURE__ */ jsx("button", {
35091
- type: "button",
35092
- onClick: () => onChange(newBand()),
35093
- className: "text-foreground-subtle hover:text-foreground underline",
35094
- children: "Set band"
35095
- }),
35096
- /* @__PURE__ */ jsx("button", {
35097
- type: "button",
35098
- onClick: onRemove,
35099
- "aria-label": "Remove band",
35100
- className: "text-foreground-subtle hover:text-red-500",
35101
- children: /* @__PURE__ */ jsx(Trash2, { className: "h-3.5 w-3.5" })
35102
- })
35103
- ]
35104
- });
35105
- const days = band.days ?? [];
35106
34907
  const toggleDay = (value) => {
35107
- const next = days.includes(value) ? days.filter((d) => d !== value) : [...days, value];
35108
- onChange({
35109
- ...band,
35110
- days: next.length > 0 ? next : void 0
35111
- });
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] });
35112
34910
  };
34911
+ const setTriggers = (patch) => onChange({ triggers: {
34912
+ ...band.triggers,
34913
+ ...patch
34914
+ } });
35113
34915
  return /* @__PURE__ */ jsxs("div", {
35114
34916
  className: "space-y-1.5 rounded-md border border-border p-2",
35115
- children: [/* @__PURE__ */ jsxs("div", {
35116
- className: "flex items-center gap-2 text-xs",
35117
- children: [
35118
- /* @__PURE__ */ jsx("input", {
35119
- type: "time",
35120
- value: band.start,
35121
- onChange: (e) => onChange({
35122
- ...band,
35123
- start: e.target.value
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"
35124
34927
  }),
35125
- className: "rounded-md border border-border bg-background px-1 py-0.5"
35126
- }),
35127
- /* @__PURE__ */ jsx("span", {
35128
- className: "text-foreground-subtle",
35129
- children: "→"
35130
- }),
35131
- /* @__PURE__ */ jsx("input", {
35132
- type: "time",
35133
- value: band.end,
35134
- onChange: (e) => onChange({
35135
- ...band,
35136
- end: e.target.value
34928
+ /* @__PURE__ */ jsx("span", {
34929
+ className: "text-foreground-subtle",
34930
+ children: ""
35137
34931
  }),
35138
- className: "rounded-md border border-border bg-background px-1 py-0.5"
35139
- }),
35140
- /* @__PURE__ */ jsx("span", { className: "flex-1" }),
35141
- /* @__PURE__ */ jsx("button", {
35142
- type: "button",
35143
- onClick: onRemove,
35144
- "aria-label": "Remove band",
35145
- className: "text-foreground-subtle hover:text-red-500",
35146
- children: /* @__PURE__ */ jsx(Trash2, { className: "h-3.5 w-3.5" })
35147
- })
35148
- ]
35149
- }), /* @__PURE__ */ jsxs("div", {
35150
- className: "flex flex-wrap gap-1",
35151
- children: [WEEKDAYS.map((d) => {
35152
- return /* @__PURE__ */ jsx("button", {
35153
- type: "button",
35154
- onClick: () => toggleDay(d.value),
35155
- className: `rounded px-1.5 py-0.5 text-[10px] ${days.includes(d.value) ? "bg-primary text-primary-foreground" : "bg-surface-hover text-foreground-subtle"}`,
35156
- children: d.label
35157
- }, d.value);
35158
- }), days.length === 0 ? /* @__PURE__ */ jsx("span", {
35159
- className: "self-center text-[10px] text-foreground-subtle",
35160
- children: "every day"
35161
- }) : null]
35162
- })]
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
+ ]
35163
35040
  });
35164
35041
  }
35165
35042
  //#endregion
@@ -35183,16 +35060,15 @@ var MODES = [
35183
35060
  label: "Continuous"
35184
35061
  }
35185
35062
  ];
35186
- function RecordingSettings({ initial, saving, onSave }) {
35063
+ function RecordingSettings({ initial, saving, onSave, onRegenerateStrips, regeneratingStrips }) {
35187
35064
  const [tab, setTab] = useState(isAdvancedConfig(initial) ? "advanced" : "base");
35188
35065
  const [base, setBase] = useState(formStateFromConfig(initial));
35189
- const [advEnabled, setAdvEnabled] = useState(initial.enabled);
35190
- const [rules, setRules] = useState(initial.rules ? [...initial.rules] : []);
35066
+ const [bands, setBands] = useState([...initial.bands]);
35191
35067
  const [common, setCommon] = useState({
35192
35068
  profiles: initial.profiles,
35193
35069
  segmentSeconds: initial.segmentSeconds,
35194
35070
  retention: initial.retention,
35195
- scrubThumbnails: initial.scrubThumbnails
35071
+ stripsEnabled: initial.stripsEnabled
35196
35072
  });
35197
35073
  const ret = common.retention ?? {};
35198
35074
  const setRet = (patch) => setCommon({
@@ -35203,10 +35079,6 @@ function RecordingSettings({ initial, saving, onSave }) {
35203
35079
  }
35204
35080
  });
35205
35081
  const numOrUndef = (v) => v === "" ? void 0 : Number(v);
35206
- const parsePreset = (v) => {
35207
- const parsed = ScrubThumbnailPresetSchema.safeParse(v);
35208
- return parsed.success ? parsed.data : DEFAULT_SCRUB_THUMBNAIL_PRESET;
35209
- };
35210
35082
  const toggleProfile = (p) => {
35211
35083
  const cur = common.profiles ?? [...PROFILES];
35212
35084
  const next = cur.includes(p) ? cur.filter((x) => x !== p) : [...cur, p];
@@ -35223,24 +35095,31 @@ function RecordingSettings({ initial, saving, onSave }) {
35223
35095
  }
35224
35096
  });
35225
35097
  const switchTab = (next) => {
35226
- 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
+ }));
35227
35103
  setTab(next);
35228
35104
  };
35229
35105
  const handleSave = () => {
35230
- if (tab === "base") onSave(configFromFormState({
35231
- ...base,
35232
- profiles: common.profiles,
35233
- segmentSeconds: common.segmentSeconds,
35234
- retention: common.retention,
35235
- scrubThumbnails: common.scrubThumbnails
35236
- }));
35237
- else onSave({
35238
- enabled: advEnabled,
35239
- rules,
35106
+ const shared = {
35240
35107
  profiles: common.profiles ? [...common.profiles] : void 0,
35241
35108
  segmentSeconds: common.segmentSeconds,
35242
35109
  retention: common.retention,
35243
- 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
35244
35123
  });
35245
35124
  };
35246
35125
  return /* @__PURE__ */ jsxs("div", {
@@ -35252,7 +35131,7 @@ function RecordingSettings({ initial, saving, onSave }) {
35252
35131
  type: "button",
35253
35132
  onClick: () => switchTab(t),
35254
35133
  className: `rounded px-2.5 py-1 ${tab === t ? "bg-primary text-primary-foreground" : "bg-surface-hover text-foreground-subtle"}`,
35255
- children: t === "base" ? "Base" : "Advanced (rules)"
35134
+ children: t === "base" ? "Base" : "Advanced (bands)"
35256
35135
  }, t))
35257
35136
  }),
35258
35137
  tab === "base" ? /* @__PURE__ */ jsxs("div", {
@@ -35273,16 +35152,17 @@ function RecordingSettings({ initial, saving, onSave }) {
35273
35152
  children: m.label
35274
35153
  }, m.value))]
35275
35154
  }),
35276
- base.mode !== "off" ? /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
35277
- className: "mb-1.5 text-[11px] font-semibold uppercase tracking-wider text-foreground-subtle",
35278
- children: "Time bands"
35279
- }), /* @__PURE__ */ jsx(ScheduleBandsEditor, {
35280
- schedules: base.schedules,
35281
- onChange: (schedules) => setBase({
35282
- ...base,
35283
- schedules
35284
- })
35285
- })] }) : null,
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,
35286
35166
  base.mode === "events" ? /* @__PURE__ */ jsxs("div", {
35287
35167
  className: "space-y-2",
35288
35168
  children: [
@@ -35360,22 +35240,22 @@ function RecordingSettings({ initial, saving, onSave }) {
35360
35240
  ]
35361
35241
  }) : null
35362
35242
  ]
35363
- }) : /* @__PURE__ */ jsxs("div", {
35243
+ }) : /* @__PURE__ */ jsx("div", {
35364
35244
  className: "space-y-4",
35365
- children: [/* @__PURE__ */ jsxs("label", {
35366
- className: "flex items-center gap-2 text-xs",
35367
- children: [/* @__PURE__ */ jsx("input", {
35368
- type: "checkbox",
35369
- checked: advEnabled,
35370
- onChange: (e) => setAdvEnabled(e.target.checked)
35371
- }), "Record this camera"]
35372
- }), /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
35373
- className: "mb-1.5 text-[11px] font-semibold uppercase tracking-wider text-foreground-subtle",
35374
- children: "Rules"
35375
- }), /* @__PURE__ */ jsx(RecordingRulesEditor, {
35376
- rules,
35377
- onChange: setRules
35378
- })] })]
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
+ ] })
35379
35259
  }),
35380
35260
  /* @__PURE__ */ jsxs("div", {
35381
35261
  className: "flex flex-wrap items-center gap-4 text-xs",
@@ -35414,27 +35294,30 @@ function RecordingSettings({ initial, saving, onSave }) {
35414
35294
  }),
35415
35295
  /* @__PURE__ */ jsxs("label", {
35416
35296
  className: "flex items-center gap-1",
35417
- children: [/* @__PURE__ */ jsx("span", {
35418
- className: "text-foreground-subtle",
35419
- children: "Scrub preview quality"
35420
- }), /* @__PURE__ */ jsx("select", {
35421
- value: common.scrubThumbnails ?? DEFAULT_SCRUB_THUMBNAIL_PRESET,
35297
+ children: [/* @__PURE__ */ jsx("input", {
35298
+ type: "checkbox",
35299
+ checked: common.stripsEnabled === true,
35422
35300
  onChange: (e) => setCommon({
35423
35301
  ...common,
35424
- scrubThumbnails: parsePreset(e.target.value)
35425
- }),
35426
- className: "rounded-md border border-border bg-background px-1 py-1 text-xs",
35427
- children: SCRUB_THUMBNAIL_PRESET_ORDER.map((p) => /* @__PURE__ */ jsx("option", {
35428
- value: p,
35429
- children: SCRUB_THUMBNAIL_PRESET_LABELS[p]
35430
- }, p))
35302
+ stripsEnabled: e.target.checked
35303
+ })
35304
+ }), /* @__PURE__ */ jsx("span", {
35305
+ className: "text-foreground-subtle",
35306
+ children: "Scrub thumbnail strips"
35431
35307
  })]
35432
- })
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
35433
35316
  ]
35434
35317
  }),
35435
35318
  /* @__PURE__ */ jsx("p", {
35436
35319
  className: "text-[11px] text-foreground-subtle",
35437
- children: "Timeline scrub-preview resolution + quality. Higher = crisper previews but larger sprite sheets. Applies to NEW recordings only existing preview sheets keep their original resolution."
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."
35438
35321
  }),
35439
35322
  /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
35440
35323
  className: "mb-1.5 text-[11px] font-semibold uppercase tracking-wider text-foreground-subtle",
@@ -36683,6 +36566,14 @@ function RecordingPanel({ deviceId }) {
36683
36566
  const configQuery = useRecordingGetDeviceConfig({ deviceId });
36684
36567
  const setConfig = useRecordingSetDeviceConfig();
36685
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]);
36686
36577
  const saveConfig = (config) => {
36687
36578
  setConfig.mutate({
36688
36579
  deviceId,
@@ -36724,7 +36615,9 @@ function RecordingPanel({ deviceId }) {
36724
36615
  children: resolvedConfig ? /* @__PURE__ */ jsx(RecordingSettings, {
36725
36616
  initial: resolvedConfig,
36726
36617
  saving: setConfig.isPending,
36727
- onSave: saveConfig
36618
+ onSave: saveConfig,
36619
+ onRegenerateStrips: regenerateStrips,
36620
+ regeneratingStrips: customAction.isPending
36728
36621
  }, JSON.stringify(resolvedConfig)) : /* @__PURE__ */ jsx("div", {
36729
36622
  className: "px-1 py-2 text-xs text-foreground-subtle",
36730
36623
  children: "Loading settings…"
@@ -40290,6 +40183,21 @@ function DetectionBoxes({ detections, frameWidth, frameHeight }) {
40290
40183
  }
40291
40184
  //#endregion
40292
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
+ }
40293
40201
  function isTouchDevice() {
40294
40202
  if (typeof window === "undefined") return false;
40295
40203
  return window.matchMedia("(hover: none) and (pointer: coarse)").matches || typeof navigator !== "undefined" && navigator.maxTouchPoints > 0 || "ontouchstart" in window;
@@ -40372,6 +40280,11 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
40372
40280
  const [state, setState] = useState("idle");
40373
40281
  const [errorMessage, setErrorMessage] = useState("");
40374
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;
40375
40288
  const [isFullscreen, setIsFullscreen] = useState(false);
40376
40289
  const [isPipSupported, setIsPipSupported] = useState(false);
40377
40290
  const isTouch = isTouchDevice();
@@ -40501,6 +40414,7 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
40501
40414
  pcRef.current = pc;
40502
40415
  if (videoRef.current) {
40503
40416
  videoRef.current.srcObject = combinedStream;
40417
+ applyStreamMute(videoRef.current, isMutedRef.current);
40504
40418
  videoRef.current.play().catch(() => {});
40505
40419
  }
40506
40420
  if (oldPc && oldPc !== pc) try {
@@ -40520,6 +40434,7 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
40520
40434
  }
40521
40435
  if (videoRef.current) {
40522
40436
  videoRef.current.srcObject = combinedStream;
40437
+ applyStreamMute(videoRef.current, isMutedRef.current);
40523
40438
  videoRef.current.play().catch(() => {});
40524
40439
  }
40525
40440
  };
@@ -40606,6 +40521,7 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
40606
40521
  whepStream.addTrack(event.track);
40607
40522
  if (videoRef.current) {
40608
40523
  videoRef.current.srcObject = whepStream;
40524
+ applyStreamMute(videoRef.current, isMutedRef.current);
40609
40525
  videoRef.current.play().catch(() => {});
40610
40526
  }
40611
40527
  };
@@ -40678,6 +40594,7 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
40678
40594
  pcRef.current = pc;
40679
40595
  if (videoRef.current) {
40680
40596
  videoRef.current.srcObject = combinedStream;
40597
+ applyStreamMute(videoRef.current, isMutedRef.current);
40681
40598
  videoRef.current.play().catch(() => {});
40682
40599
  }
40683
40600
  if (oldPc && oldPc !== pc) try {
@@ -40698,6 +40615,7 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
40698
40615
  }
40699
40616
  if (videoRef.current) {
40700
40617
  videoRef.current.srcObject = combinedStream;
40618
+ applyStreamMute(videoRef.current, isMutedRef.current);
40701
40619
  videoRef.current.play().catch(() => {});
40702
40620
  }
40703
40621
  };
@@ -41022,7 +40940,7 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
41022
40940
  mountedRef.current = false;
41023
40941
  cleanup();
41024
40942
  };
41025
- }, [serverUrl, streamKey]);
40943
+ }, []);
41026
40944
  const hasSignaledRef = useRef(false);
41027
40945
  useEffect(() => {
41028
40946
  if (!autoPlay) return;
@@ -41060,6 +40978,23 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
41060
40978
  }
41061
40979
  connect();
41062
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]);
41063
40998
  const prevReconnectSignalRef = useRef(reconnectSignal);
41064
40999
  useEffect(() => {
41065
41000
  if (prevReconnectSignalRef.current === reconnectSignal) return;
@@ -41069,8 +41004,9 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
41069
41004
  }, [reconnectSignal]);
41070
41005
  const toggleMute = () => {
41071
41006
  if (videoRef.current) {
41072
- videoRef.current.muted = !videoRef.current.muted;
41073
- setIsMuted(videoRef.current.muted);
41007
+ const next = !videoRef.current.muted;
41008
+ applyStreamMute(videoRef.current, next);
41009
+ setIsMuted(next);
41074
41010
  }
41075
41011
  };
41076
41012
  const toggleFullscreen = async () => {
@@ -41298,7 +41234,7 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
41298
41234
  setIsMuted(initialMuted);
41299
41235
  const video = videoRef.current;
41300
41236
  if (!video) return;
41301
- video.muted = initialMuted;
41237
+ applyStreamMute(video, initialMuted);
41302
41238
  if (!initialMuted) video.play().catch(() => {});
41303
41239
  }, [initialMuted]);
41304
41240
  const showToolbarBriefly = () => {
@@ -42410,7 +42346,7 @@ function StreamPanel({ serverUrl, createSession, sendAnswer, handleOffer, getIce
42410
42346
  extraOverlay,
42411
42347
  ptzOverlayVisible && ptzOverlay
42412
42348
  ] }) : void 0
42413
- }, effectiveStreamId)
42349
+ })
42414
42350
  }) : /* @__PURE__ */ jsx(SnapshotPreview, {
42415
42351
  src: snapshotSrc ?? null,
42416
42352
  isLoading: snapshotLoading,
@@ -46791,6 +46727,15 @@ function useDeviceDetections(trpc, deviceId) {
46791
46727
  * @param deviceId - numeric device ID (null = disabled)
46792
46728
  * @param pollIntervalMs - how often to refresh profile slots (default: 5000)
46793
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();
46794
46739
  function useDeviceWebrtc(trpc, deviceId, pollIntervalMs = 5e3) {
46795
46740
  const [remoteStreams, setRemoteStreams] = useState([]);
46796
46741
  useEffect(() => {
@@ -46860,18 +46805,28 @@ function useDeviceWebrtc(trpc, deviceId, pollIntervalMs = 5e3) {
46860
46805
  }, [deviceId, remoteStreams]);
46861
46806
  const getIceServers = useCallback(async () => {
46862
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;
46863
46810
  try {
46864
- return (await trpc.turnProvider.getTurnServers.query()).map((s) => {
46811
+ const mapped = (await trpc.turnProvider.getTurnServers.query()).map((s) => {
46865
46812
  return {
46866
46813
  urls: typeof s.urls === "string" ? s.urls : [...s.urls],
46867
46814
  ...s.username !== void 0 ? { username: s.username } : {},
46868
46815
  ...s.credential !== void 0 ? { credential: s.credential } : {}
46869
46816
  };
46870
46817
  });
46818
+ turnServersCache.set(trpc, {
46819
+ servers: mapped,
46820
+ fetchedAt: Date.now()
46821
+ });
46822
+ return mapped;
46871
46823
  } catch {
46872
- return;
46824
+ return cached?.servers;
46873
46825
  }
46874
46826
  }, [trpc]);
46827
+ useEffect(() => {
46828
+ getIceServers();
46829
+ }, [getIceServers]);
46875
46830
  const createSession = useCallback(async (target, hints) => {
46876
46831
  if (deviceId === null) throw new Error("No device selected");
46877
46832
  const res = await trpc.webrtcSession.createSession.mutate({
@@ -47241,4 +47196,4 @@ var MotionZonesSettings = lazy(() => import("./MotionZonesSettings-NcxxQN8r.js")
47241
47196
  /** Lazy-wrapped `PrivacyMaskSettings` — code-split off the main bundle. */
47242
47197
  var PrivacyMaskSettings = lazy(() => import("./PrivacyMaskSettings-APgPLF7p.js").then((m) => ({ default: m.PrivacyMaskSettings })));
47243
47198
  //#endregion
47244
- export { AddonGlobalSettingsForm, AgentStepEditor, AlarmHeroCard, AlarmInlineControl as AlarmPanelInlineControl, AppShell, ArcKnob, AudioClassificationList, AudioLevelWaveform, AudioWaveform, AutotrackSection, BTN_COMPACT, BTN_COMPACT_DANGER, BTN_COMPACT_PRIMARY, BTN_COMPACT_WARNING, Badge, BatteryBadge, BottomSheet, Breadcrumb, BrightnessPanel, Button, ButtonControl, ButtonHeroCard, CENTER, CHIP_ACTIVE, CHIP_BASE, CHIP_INACTIVE, CLASS_COLORS, COLUMN_BREAKPOINT_CLASS, COLUMN_PRIORITY, COMMIT_DEDUPE_TOLERANCE_MS, COMMIT_DEDUPE_WINDOW_MS, CONTROL_CAP_NAMES, CONTROL_FILLS, CameraStreamPlayer, Card, Checkbox, ChildSectionAccordion, ClimatePanel, CodeBlock, CollapsibleCard, ConfigFormBuilder, FormField as ConfigFormField, ConfigSchemaField, ConfirmActionButton, ConfirmDialogProvider, ConsumablesPanel, ContainerChildrenProvider, ContainerPrimaryHero, ControlColumn, ControlHeroCard, ControlInlineControl, ControlPanel, CopyButton, CoverHeroCard, CoverInlineControl, CoverPanel, CustomFieldRenderersProvider, DEFAULT_COLOR, DEVICE_COLUMNS, DEVICE_LIST_PAGE_SIZE_KEY, DEVICE_LIST_PAGE_SIZE_OPTIONS, DEVICE_ROLE_META, DEVICE_TYPE_CONTROL, DEVICE_TYPE_META, DISPLAY_ICON_REGISTRY, DataTable, DetectionCanvas, DetectionOverlay, DetectionResultTree, DevShell, DeviceActivityPanel, DeviceBatchToolbar, DeviceCard, DeviceContextProvider, DeviceExportPanel, DeviceGrid, DeviceItem, DeviceList, DeviceMultiSelectField, DeviceSelectField, DeviceStepMatrix, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, DiscoveryPanel, DoorbellRecentPanel, Dropdown, DropdownContent, DropdownItem, DropdownTrigger, DummyHeroCard, DummyInline, EVENT_KIND_ICONS, EmptyState, ErrorBox, EventKindGlyph, EventStream, FILL, FanHeroCard, FanInlineControl, FanPanel, FilterBar, FloatingEventStream, FloatingLogStream, FloatingPanel, FormField$1 as FormField, GRID_GAP, GRID_PAIRED, GRID_QUICK_STATS, GripTrack, GroupedModelSelector, HOST_WIDGETS, HlsVideo, HoverZoomImage, HumidifierHeroCard, HumidifierInlineControl, INPUT_COMPACT, IconAction, IconButton, ImageHeroCard, ImageInlineControl, ImageSelector, InferenceConfigSelector, Input, KebabMenu, KeyValueList, LIST_ROW, Label, LawnMowerHeroCard, LawnMowerInlineControl, LightHeroCard, LightInlineControl, LockHeroCard, LockInlineControl, LockPanel, LogStream, LoginForm, MODE_COLOR, MaskShapeCanvas, MediaPlayerHeroCard, MediaPlayerInlineControl, MediaPlayerPanel, MobileDrawer, ModelPicker, MotionZonesSettings, NodeMultiSelectField, NodePicker, NodeSelectField, OfflineBadge, PHASE_CONFIG, PRIORITY, PTZOverlay, PageHeader, PhaseIcon, PipelineBuilder, PipelineRuntimeSelector, PipelineStep, PipelineTreeMatrix, PlayerOverlaysProvider, Popover, PopoverContent, PopoverRowAction, PopoverTrigger, PrimaryChildPicker, PrivacyMaskSettings, ProviderBadge, PtzPanel, QrCode, RECORDED_PLAYBACK_MODES, RIGHT, ROLE_DESCRIPTOR, RadialGauge, RecordedPlaybackProvider, RecordingPanel, ResponseLog, SECTION_BODY, SECTION_CARD, SECTION_HEADER, SPLIT_PANEL_OUTER, SPLIT_PANEL_SIDE, STACK_GAP, STATE_COLOR, ScopePicker, ScrollArea, Select, SemanticBadge, SensorHeroCard, SensorInlineControl, SensorValueAtom, Separator, Sidebar, SidebarItem, Skeleton, SlideOverPanel, SlideToggle, SnapshotButton, StatCard, StateValuesStream, StatusBadge, StepTimings, StepTreeMaster, Stepper, StreamBrokerSelector, StreamPanel, Switch, SwitchHeroCard, SwitchInlineControl, SwitchPanel, SystemProvider, TEXT_FIELD_LABEL, TEXT_HINT, TEXT_METRIC, TEXT_SECTION_LABEL, TEXT_VALUE, TIMEZONES, Tabs, TabsContent, TabsList, TabsTrigger, TapToggle, ThemeProvider, ThermostatHeroCard, ThermostatInlineControl, TimezoneSelector, Tooltip, TooltipContent, TooltipTrigger, VacuumHeroCard, VacuumInlineControl, ValueReadout, ValveHeroCard, ValveInlineControl, VersionBadge, VodPlaybackProvider, WaterHeaterHeroCard, WaterHeaterInlineControl, WeatherHeroCard, WeatherInlineControl, WidgetMetricCard, WidgetPanel, WidgetRegistryProvider, WidgetSlot, ZoneEditingProvider, agentColumnKey, allDeviceTypeFilterOptions, buildStepTreeFromSchema, childEntityId, childListName, cn, columnsForContext, containerChildToRef, countableDevices, coverHighlight, createSharedContext, createTheme, cursorFractionFor, darkColors, defaultTheme, deriveDeviceKind, deviceMatchesFilter, deviceOptionLabel, deviceRoleMeta, deviceRoleMetaOf, deviceTypeMeta, deviceTypeMetaOf, devicesToOptions, ensureMfHostInit, eventKindLabel, filterDeviceOptions, findTimezone, formatControlDateTime, formatLastSeen, formatNumeric, fuzzyMatch, getClassColor, getPhaseVisual, groupAgentColumns, groupChildrenByLayout, hardwareLabel, humidifierTint, createLucideIcon as i, initialScrubState, isAbsentProvider, isFieldVisible, lawnMowerActivityMeta, lightColors, loadRemoteBundle, makeScrubBridge, metadataEntries, metadataString, mirror, mountAddonPage, Square as n, nextSort, normalizeForSearch, overrideEntityIdFromLink, parseRecordedServerMessage, providerIcons, EyeOff as r, resolveContainerPrimary, resolveControlAlign, resolveDeviceControl, resolveDisplayIcon, resolveEventKindIcon, resolvePrimaryChild, resolveSensorDisplay, resolveStepDefaultModel, scrubReducer, selectedDeviceOptions, serializeRecordedCommand, shouldCommit, shouldEmit, shouldUseSingleNode, sortRows, statusIcons, stripParentNamePrefix, Trash2 as t, tankAlert, themeToCss, trpc, useAccessoriesGetStatus, useAccessoriesSetChildHidden, useAddonPagesListPages, useAddonSettingsGetDeviceSettings, useAddonSettingsGetGlobalSettings, useAddonSettingsUpdateDeviceSettings, useAddonSettingsUpdateGlobalSettings, useAddonWidgetsListWidgets, useAddonsApplyAutoUpdateToAll, useAddonsCancelJob, useAddonsCustom, useAddonsForceRefresh, useAddonsGetAddonAutoUpdate, useAddonsGetAutoUpdateSettings, useAddonsGetJob, useAddonsGetLastRestart, useAddonsGetLogs, useAddonsGetVersions, useAddonsInstallFromWorkspace, useAddonsInstallPackage, useAddonsIsWorkspaceAvailable, useAddonsList, useAddonsListCapabilityProviders, useAddonsListFrameworkPackages, useAddonsListJobs, useAddonsListPackages, useAddonsListUpdates, useAddonsListWorkspacePackages, useAddonsOnAddonLogs, useAddonsReloadPackages, useAddonsRestartAddon, useAddonsRestartServer, useAddonsRetryLoad, useAddonsRollbackPackage, useAddonsSearchAvailable, useAddonsSetAddonAutoUpdate, useAddonsSetAutoUpdateSettings, useAddonsSetCapabilityProviderEnabled, useAddonsStartJob, useAddonsUninstallPackage, useAddonsUpdatePackage, useAirQualitySensorGetStatus, useAlarmPanelArm, useAlarmPanelDisarm, useAlarmPanelGetStatus, useAlarmPanelTrigger, useAlertsDismiss, useAlertsEmit, useAlertsGetUnreadCount, useAlertsList, useAlertsMarkAllRead, useAlertsMarkRead, useAlertsUpdate, useAllWidgets, useAmbientLightSensorGetStatus, useAudioAnalysisApplyDeviceSettingsPatch, useAudioAnalysisGetDeviceLiveContribution, useAudioAnalysisGetDeviceSettingsContribution, useAudioAnalysisResolveDeviceSettings, useAudioAnalyzerAnalyseChunk, useAudioAnalyzerClassify, useAudioAnalyzerDispose, useAudioAnalyzerIsReady, useAudioAnalyzerReprobeAudioEngine, useAudioCodecCanHandle, useAudioCodecCloseSession, useAudioCodecCreateDecodeSession, useAudioCodecCreateEncodeSession, useAudioCodecFlushEncode, useAudioCodecListActiveSessions, useAudioCodecListSupportedCodecs, useAudioCodecPullEncoded, useAudioCodecPullPcm, useAudioCodecPushEncodedFrame, useAudioCodecPushPcm, useAudioMetricsGetCurrentSnapshot, useAudioMetricsGetHistory, useAutomationControlDisable, useAutomationControlEnable, useAutomationControlGetStatus, useAutomationControlTrigger, useBackupDelete, useBackupDeleteSchedule, useBackupGetEntries, useBackupList, useBackupListArchives, useBackupListDestinations, useBackupListLocations, useBackupListSchedules, useBackupPreviewSchedule, useBackupRestore, useBackupTrigger, useBackupUpsertDestinationPolicy, useBackupUpsertSchedule, useBatteryGetStatus, useBatteryWakeForStream, useBinaryGetStatus, useBrightnessGetStatus, useBrightnessSetBrightness, useBrokerAdd, useBrokerGet, useBrokerGetBrokerConfig, useBrokerGetSettings, useBrokerGetSettingsSchema, useBrokerGetState, useBrokerGetStatus, useBrokerList, useBrokerListProviders, useBrokerPublish, useBrokerRemove, useBrokerSetSettings, useBrokerSubscribe, useBrokerTestConnection, useBrokerTestSettings, useBrokerUnsubscribe, useButtonPress, useCameraCredentialsGetCredentials, useCameraCredentialsGetStatus, useCameraPipelineConfigApplyDeviceSettingsPatch, useCameraPipelineConfigGetDeviceLiveContribution, useCameraPipelineConfigGetDeviceSettingsContribution, useCameraStreamsGetBrokerStreams, useCameraStreamsGetCameraStreams, useCameraStreamsGetProfileRtspEntries, useCameraStreamsGetRtspEntries, useCameraStreamsPickStream, useCarbonMonoxideGetStatus, useClimateControlGetStatus, useClimateControlSetFanMode, useClimateControlSetMode, useClimateControlSetPreset, useClimateControlSetSwingHorizontal, useClimateControlSetSwingVertical, useClimateControlSetTarget, useClimateControlSetTargetHumidity, useClimateControlSetTargetRange, useClusterNodes, useColorGetStatus, useColorSetColor, useConfirm, useConnectivityGetStatus, useConsumablesGetStatus, useConsumablesReset, useContactGetStatus, useContainerChildren, useControlGetStatus, useControlSetValue, useCoverClose, useCoverGetStatus, useCoverOpen, useCoverSetPosition, useCoverSetTiltPosition, useCoverStop, useCustomFieldRenderer, useDayNightGetOptions, useDayNightGetStatus, useDayNightSetSettings, useDebouncedString, useDecoderCreateSession, useDecoderDestroySession, useDecoderGetFrame, useDecoderGetInfo, useDecoderGetShmStats, useDecoderGetStats, useDecoderListActiveSessions, useDecoderOpenStream, useDecoderPullFrames, useDecoderPullHandles, useDecoderPushPacket, useDecoderReprobeHwaccel, useDecoderSupportsCodec, useDecoderUpdateConfig, useDetectionPipelineApplyDeviceSettingsPatch, useDetectionPipelineGetDeviceLiveContribution, useDetectionPipelineGetDeviceSettingsContribution, useDevShell, useDevice, useDeviceAdoptionAdopt, useDeviceAdoptionGetCandidate, useDeviceAdoptionGetStatus, useDeviceAdoptionListCandidateFilters, useDeviceAdoptionListCandidates, useDeviceAdoptionRefresh, useDeviceAdoptionRelease, useDeviceAdoptionResync, useDeviceAutotrack, useDeviceBattery, useDeviceCapSlice, useDeviceCapability, useDeviceDetections, useDeviceDiscoveryAdoptDevice, useDeviceDiscoveryGetStatus, useDeviceDiscoveryListDiscovered, useDeviceDiscoveryRefreshDiscovery, useDeviceDiscoveryReleaseDevice, useDeviceExportApplyDeviceSettingsPatch, useDeviceExportExposeDevice, useDeviceExportGetDeviceLiveContribution, useDeviceExportGetDeviceSettingsContribution, useDeviceExportGetStatus, useDeviceExportListExposedDevices, useDeviceExportListSupportedDeviceKinds, useDeviceExportUnexposeDevice, useDeviceId, useDeviceListPageSize, useDeviceManagerAddLocation, useDeviceManagerAdoptDevice, useDeviceManagerAdoptionAdopt, useDeviceManagerAdoptionListCandidateFilters, useDeviceManagerAdoptionListCandidates, useDeviceManagerAdoptionRefresh, useDeviceManagerAdoptionRelease, useDeviceManagerAdoptionResync, useDeviceManagerAllocateDeviceId, useDeviceManagerApplyDeviceSettingsPatch, useDeviceManagerApplyInitialMeta, useDeviceManagerCreateDevice, useDeviceManagerDisable, useDeviceManagerDiscoverAllProviders, useDeviceManagerDiscoverDevices, useDeviceManagerDiscoverProvider, useDeviceManagerDiscoveryProviders, useDeviceManagerEnable, useDeviceManagerGetAllBindings, useDeviceManagerGetBindings, useDeviceManagerGetChildren, useDeviceManagerGetConfigSchema, useDeviceManagerGetCreationSchema, useDeviceManagerGetDevice, useDeviceManagerGetDeviceAggregate, useDeviceManagerGetDeviceLiveContribution, useDeviceManagerGetDeviceLiveInfoAggregate, useDeviceManagerGetDeviceSettingsAggregate, useDeviceManagerGetDeviceSettingsContribution, useDeviceManagerGetDeviceStatusAggregate, useDeviceManagerGetLinkedDevices, useDeviceManagerGetRoleDisplayDefaults, useDeviceManagerGetSettingsSchema, useDeviceManagerGetStreamProfileMap, useDeviceManagerGetStreamSources, useDeviceManagerGetWireableFields, useDeviceManagerListAll, useDeviceManagerListBindableCapsForDeviceType, useDeviceManagerListLocations, useDeviceManagerListPersistedByAddon, useDeviceManagerListWrappersForCap, useDeviceManagerLoadConfig, useDeviceManagerLoadMeta, useDeviceManagerLoadRuntimeState, useDeviceManagerPersistConfig, useDeviceManagerProbeStreams, useDeviceManagerProviderCreationType, useDeviceManagerProviderDiscoveryParamsSchema, useDeviceManagerRegisterDevice, useDeviceManagerRemove, useDeviceManagerRemoveByIntegration, useDeviceManagerRemoveDevice, useDeviceManagerRemoveLocation, useDeviceManagerRunDeviceAction, useDeviceManagerSetChildLayout, useDeviceManagerSetDeviceLinks, useDeviceManagerSetDisabled, useDeviceManagerSetDisplay, useDeviceManagerSetIntegrationId, useDeviceManagerSetLinkDeviceId, useDeviceManagerSetLocation, useDeviceManagerSetMetadata, useDeviceManagerSetName, useDeviceManagerSetPrimaryChildEntityId, useDeviceManagerSetRole, useDeviceManagerSetRoleDisplayDefaults, useDeviceManagerSetStreamProfileMap, useDeviceManagerSetType, useDeviceManagerSetWrapperActive, useDeviceManagerTestCreationField, useDeviceManagerTestField, useDeviceManagerUpdateConfig, useDeviceManagerUpdateDeviceField, useDeviceManagerUpdateDeviceFieldsBatch, useDeviceOpsGetConfigEntries, useDeviceOpsGetRawState, useDeviceOpsGetSettingsSchema, useDeviceOpsGetStreamSources, useDeviceOpsRemoveDevice, useDeviceOpsRunAction, useDeviceOpsSetConfig, useDeviceProviderAdoptDiscoveredDevice, useDeviceProviderCreateDevice, useDeviceProviderDiscoverDevices, useDeviceProviderGetChildCreationSchema, useDeviceProviderGetDevices, useDeviceProviderGetDiscoveryParamsSchema, useDeviceProviderGetManualCreationType, useDeviceProviderGetStatus, useDeviceProviderStart, useDeviceProviderStop, useDeviceProviderSupportsDiscovery, useDeviceProviderSupportsManualCreation, useDeviceProviderTestCreationField, useDeviceProxy, useDeviceSnapshot, useDeviceSnapshotImage, useDeviceState, useDeviceStateGetAllSnapshots, useDeviceStateGetCapSlice, useDeviceStateGetSnapshot, useDeviceStateSetCapSlice, useDeviceStateSlice, useDeviceStatusGetStatus, useDeviceWebrtc, useDevices, useDoorbellApplyDeviceSettingsPatch, useDoorbellEvents, useDoorbellGetDeviceLiveContribution, useDoorbellGetDeviceSettingsContribution, useDoorbellGetStatus, useEnumSensorGetStatus, useEventEmitterGetStatus, useEventInvalidation, useEventStreamLatest, useEventStreamMap, useEventsGetEventClipUrl, useEventsGetEventThumbnail, useEventsGetEvents, useFaceGalleryAssignFace, useFaceGalleryAssignFaces, useFaceGalleryCreateIdentity, useFaceGalleryDeleteFace, useFaceGalleryDeleteIdentity, useFaceGalleryGetFaceByTrack, useFaceGalleryGetFaceMedia, useFaceGalleryListIdentities, useFaceGalleryListIdentitySamples, useFaceGalleryListRecentFaces, useFaceGalleryRemoveSample, useFaceGalleryRenameIdentity, useFaceGallerySuggestFaceClusters, useFaceGalleryUnassignFace, useFaceGalleryUnassignFaces, useFanControlGetStatus, useFanControlSetDirection, useFanControlSetOscillating, useFanControlSetPercentage, useFanControlSetPreset, useFeatureProbeGetStatus, useFloodGetStatus, useGasGetStatus, useHumidifierGetStatus, useHumidifierSetMode, useHumidifierSetOn, useHumidifierSetTargetHumidity, useHumiditySensorGetStatus, useImageGetStatus, useImageSettingsGetOptions, useImageSettingsGetStatus, useImageSettingsSetSettings, useIntegrationsCreate, useIntegrationsDelete, useIntegrationsGet, useIntegrationsGetAvailableTypes, useIntegrationsGetByAddonId, useIntegrationsGetSettings, useIntegrationsList, useIntegrationsSetSettings, useIntegrationsTestConnection, useIntegrationsUpdate, useIntercomEndTalkSession, useIntercomGetStatus, useIntercomHandleAnswer, useIntercomPushTalkAudio, useIntercomStartSession, useIntercomStartTalkSession, useIntercomStopSession, useIsMidWidth, useIsMobile, useLawnMowerControlDock, useLawnMowerControlGetStatus, useLawnMowerControlPause, useLawnMowerControlStartMowing, useLiveBuffer, useLiveEvent, useLlmDeleteModel, useLlmDeleteProfile, useLlmGenerate, useLlmGenerateVision, useLlmGetDefaults, useLlmGetRuntimeStatus, useLlmGetUsage, useLlmInstallModel, useLlmListModelCatalog, useLlmListModels, useLlmListNodeModels, useLlmListProfileKinds, useLlmListProfiles, useLlmListRuntimeNodes, useLlmSetDefault, useLlmStartRuntime, useLlmStopRuntime, useLlmTestProfile, useLlmUpsertProfile, useLocalNetworkGetAllowedAddresses, useLocalNetworkGetConnectionEndpoints, useLocalNetworkGetPreferred, useLocalNetworkList, useLocalNetworkResetAllowlistToBestMatch, useLocalNetworkSetAllowedAddresses, useLockControlGetStatus, useLockControlLock, useLockControlOpen, useLockControlUnlock, useMediaPlayerGetStatus, useMediaPlayerNext, useMediaPlayerPause, useMediaPlayerPlay, useMediaPlayerPlayMedia, useMediaPlayerPrevious, useMediaPlayerSeek, useMediaPlayerSelectSource, useMediaPlayerSetMute, useMediaPlayerSetRepeat, useMediaPlayerSetShuffle, useMediaPlayerSetVolume, useMediaPlayerStop, useMeshNetworkGetStatus, useMeshNetworkJoin, useMeshNetworkLeave, useMeshNetworkListPeers, useMeshNetworkLogout, useMeshNetworkStartLogin, useMeshNetworkTestConnection, useMetricsProviderCollectSnapshot, useMetricsProviderDumpHeapSnapshot, useMetricsProviderGetAddonStats, useMetricsProviderGetCached, useMetricsProviderGetCpuTemperature, useMetricsProviderGetCurrent, useMetricsProviderGetDiskSpace, useMetricsProviderGetGpuInfo, useMetricsProviderGetProcessStats, useMetricsProviderKillProcess, useMetricsProviderListAddonInstances, useMetricsProviderListNodeProcesses, useMotionDetectionAnalyze, useMotionDetectionApplyDeviceSettingsPatch, useMotionDetectionGetDeviceLiveContribution, useMotionDetectionGetDeviceSettingsContribution, useMotionDetectionRemoveCamera, useMotionDetectionReset, useMotionGetStatus, useMotionIsDetected, useMotionTriggerGetStatus, useMotionTriggerSetMotionTrigger, useMotionZonesGetOptions, useMotionZonesGetStatus, useMotionZonesSetZone, useMqttBrokerAddBroker, useMqttBrokerGetBrokerConfig, useMqttBrokerGetStatus, useMqttBrokerListBrokers, useMqttBrokerRemoveBroker, useMqttBrokerStartEmbeddedBroker, useMqttBrokerStopEmbeddedBroker, useMqttBrokerTestConnection, useNativeObjectDetectionGetStatus, useNativeObjectDetectionSetEnabled, useNetworkAccessGetEndpoint, useNetworkAccessGetStatus, useNetworkAccessListEndpoints, useNetworkAccessStart, useNetworkAccessStop, useNetworkQualityGetAllStats, useNetworkQualityGetDeviceStats, useNetworkQualityReportClientStats, useNodesClusterAddonStatus, useNodesDeployAddon, useNodesExecuteQuery, useNodesGetCapUsageGraph, useNodesGetNodeAddons, useNodesRenameNode, useNodesRestartAddon, useNodesRestartNode, useNodesRestartProcess, useNodesSetProcessLogLevel, useNodesShutdownNode, useNodesTopology, useNodesUndeployAddon, useNotificationOutputDeleteTarget, useNotificationOutputDiscoverTargets, useNotificationOutputListTargetKinds, useNotificationOutputListTargets, useNotificationOutputSend, useNotificationOutputSetTargetEnabled, useNotificationOutputTestTarget, useNotificationOutputUpsertTarget, useNotificationRulesCreateRule, useNotificationRulesDeleteRule, useNotificationRulesGetConditionCatalog, useNotificationRulesGetHistory, useNotificationRulesGetRule, useNotificationRulesListRules, useNotificationRulesSetRuleEnabled, useNotificationRulesTestRule, useNotificationRulesUpdateRule, useNotifierCancel, useNotifierGetStatus, useNotifierSend, useNumericSensorGetStatus, useOptimisticSlice, useOptionalSystem, useOptionalWidgetRegistry, useOsdGetStatus, useOsdSetOverlay, usePTZ, usePetFeederCallPet, usePetFeederCancelFeed, usePetFeederFeed, usePetFeederGetStatus, usePetFeederMarkFoodReplenished, usePetFeederPlaySound, usePetFeederResetDesiccant, usePetFeederSetChildLock, usePetFeederSetFeedSound, usePetFeederSetIndicatorLight, usePetFeederSetVolume, usePipelineAnalyticsApplyDeviceSettingsPatch, usePipelineAnalyticsClearTracks, usePipelineAnalyticsDeleteDeviceEvents, usePipelineAnalyticsDeleteTracks, usePipelineAnalyticsGetActiveTracks, usePipelineAnalyticsGetAudioEvents, usePipelineAnalyticsGetDeviceLiveContribution, usePipelineAnalyticsGetDeviceSettingsContribution, usePipelineAnalyticsGetEventDensity, usePipelineAnalyticsGetEventMedia, usePipelineAnalyticsGetEventStoreFootprint, usePipelineAnalyticsGetKeyEvents, usePipelineAnalyticsGetMotionEvents, usePipelineAnalyticsGetObjectEvents, usePipelineAnalyticsGetSensorEvents, usePipelineAnalyticsGetTrack, usePipelineAnalyticsGetTrackMedia, usePipelineAnalyticsListEventKinds, usePipelineAnalyticsListOpsLog, usePipelineAnalyticsListRecentTracks, usePipelineAnalyticsListTracks, usePipelineAnalyticsPruneEvents, usePipelineAnalyticsPruneEventsBefore, usePipelineAnalyticsPruneTracksBefore, usePipelineAnalyticsSearchObjectEvents, usePipelineAnalyticsWipeAllAnalytics, usePipelineExecutorCacheFrameInPool, usePipelineExecutorClearDeviceOverrides, usePipelineExecutorDeleteModel, usePipelineExecutorDeleteTemplate, usePipelineExecutorDownloadModel, usePipelineExecutorGetAddonModels, usePipelineExecutorGetAudioCapabilities, usePipelineExecutorGetAvailableEngines, usePipelineExecutorGetCapabilities, usePipelineExecutorGetDefaultSteps, usePipelineExecutorGetDetectionConfigSchema, usePipelineExecutorGetEffectiveTuning, usePipelineExecutorGetEngineProvisioning, usePipelineExecutorGetGlobalPipelineConfig, usePipelineExecutorGetGlobalSteps, usePipelineExecutorGetOrchestratorConfigSchema, usePipelineExecutorGetReferenceAudio, usePipelineExecutorGetReferenceAudioFiles, usePipelineExecutorGetReferenceImage, usePipelineExecutorGetSchema, usePipelineExecutorGetSelectedEngine, usePipelineExecutorGetVideoPipelineSteps, usePipelineExecutorInferCached, usePipelineExecutorKillEngine, usePipelineExecutorListLoadedEngines, usePipelineExecutorListReferenceImages, usePipelineExecutorListTemplates, usePipelineExecutorRunAudioTest, usePipelineExecutorRunPipeline, usePipelineExecutorRunPipelineBatch, usePipelineExecutorSaveTemplate, usePipelineExecutorSetVideoPipelineSteps, usePipelineExecutorSpinEngine, usePipelineExecutorUncacheFrame, usePipelineExecutorUpdateTemplate, usePipelineExecutorValidatePipeline, usePipelineOrchestratorApplyDeviceSettingsPatch, usePipelineOrchestratorAssignAudio, usePipelineOrchestratorAssignPipeline, usePipelineOrchestratorDeleteTemplate, usePipelineOrchestratorGetAgentLoad, usePipelineOrchestratorGetAgentSettings, usePipelineOrchestratorGetAudioAssignment, usePipelineOrchestratorGetAudioAssignments, usePipelineOrchestratorGetAudioNodeLoad, usePipelineOrchestratorGetCameraMetrics, usePipelineOrchestratorGetCameraSettings, usePipelineOrchestratorGetCameraStatus, usePipelineOrchestratorGetCameraStatuses, usePipelineOrchestratorGetCameraStepOverrides, usePipelineOrchestratorGetCapabilityBindings, usePipelineOrchestratorGetDeviceLiveContribution, usePipelineOrchestratorGetDeviceSettingsContribution, usePipelineOrchestratorGetGlobalMetrics, usePipelineOrchestratorGetIngestOwner, usePipelineOrchestratorGetNodeInferenceDevices, usePipelineOrchestratorGetPipelineAssignment, usePipelineOrchestratorGetPipelineAssignments, usePipelineOrchestratorGetPipelineDevicePin, usePipelineOrchestratorListAgentSettings, usePipelineOrchestratorListTemplates, usePipelineOrchestratorRebalance, usePipelineOrchestratorRemoveAgentSettings, usePipelineOrchestratorResetNodePipelineDefaults, usePipelineOrchestratorResolvePipeline, usePipelineOrchestratorSaveTemplate, usePipelineOrchestratorSetAgentCapabilities, usePipelineOrchestratorSetAgentDetectWeight, usePipelineOrchestratorSetAgentInferenceDevices, usePipelineOrchestratorSetAgentMaxCameras, usePipelineOrchestratorSetAgentReachableHost, usePipelineOrchestratorSetCameraPipelineForAgent, usePipelineOrchestratorSetCameraStepOverride, usePipelineOrchestratorSetCameraStepToggle, usePipelineOrchestratorSetCapabilityBinding, usePipelineOrchestratorSetPipelineDevicePin, usePipelineOrchestratorUnassignAudio, usePipelineOrchestratorUnassignPipeline, usePipelineOrchestratorUpdateTemplate, usePipelineRunnerAttachCamera, usePipelineRunnerDetachCamera, usePipelineRunnerGetAllCameraMetrics, usePipelineRunnerGetCameraMetrics, usePipelineRunnerGetLocalCameras, usePipelineRunnerGetLocalLoad, usePipelineRunnerGetLocalMetrics, usePipelineRunnerGetNativeCrop, usePipelineRunnerReportMotion, usePipelineRunnerRunDetailSubtree, usePlateGalleryAssignPlate, usePlateGalleryAssignPlates, usePlateGalleryCorrectPlateText, usePlateGalleryCreateVehicle, usePlateGalleryDeletePlate, usePlateGalleryDeleteVehicle, usePlateGalleryGetPlateByTrack, usePlateGalleryGetPlateMedia, usePlateGalleryListPlates, usePlateGalleryListVehicleSamples, usePlateGalleryListVehicles, usePlateGalleryRemoveVehicleSample, usePlateGalleryRenameVehicle, usePlateGallerySearchPlates, usePlateGallerySuggestPlateClusters, usePlateGalleryUnassignPlate, usePlateGalleryUnassignPlates, usePlayerOverlayLayer, usePlayerOverlayLayers, usePlayerToolbarButton, usePlayerToolbarButtons, usePowerMeterGetStatus, usePresenceGetStatus, usePressureSensorGetStatus, usePrivacyMaskGetOptions, usePrivacyMaskGetStatus, usePrivacyMaskSetMask, usePtzAutotrackGetSettings, usePtzAutotrackGetStatus, usePtzAutotrackSetEnabled, usePtzAutotrackSetSettings, usePtzContinuousMove, usePtzDeletePreset, usePtzGetOptions, usePtzGetPosition, usePtzGetPresets, usePtzGetStatus, usePtzGoHome, usePtzGoToPreset, usePtzMove, usePtzSavePreset, usePtzSetAutofocus, usePtzStop, useRebootReboot, useRecordedPlayback, useRecordingApplyDeviceSettingsPatch, useRecordingDeleteFootprint, useRecordingExportCancelExport, useRecordingExportCreateExport, useRecordingExportDeleteExport, useRecordingExportGetDownloadUrl, useRecordingExportGetExport, useRecordingExportListExports, useRecordingGetAvailability, useRecordingGetDaysWithRecordings, useRecordingGetDeviceConfig, useRecordingGetDeviceLiveContribution, useRecordingGetDeviceSettingsContribution, useRecordingGetPlaybackManifest, useRecordingGetStatus, useRecordingGetStorageUsage, useRecordingListOpsLog, useRecordingLocateSegment, useRecordingPruneFootage, useRecordingReadSegmentBytes, useRecordingRescanStorage, useRecordingSetDeviceConfig, useRemoteComponent, useSceneMonitorCaptureReference, useSceneMonitorCreateScene, useSceneMonitorDeleteReference, useSceneMonitorDeleteScene, useSceneMonitorGetStatus, useSceneMonitorListScenes, useSceneMonitorRecheckNow, useSceneMonitorUpdateScene, useScriptRunnerGetStatus, useScriptRunnerRun, useScriptRunnerStop, useScrubController, useServerManagementApplyServerUpdate, useServerManagementCheckServerUpdate, useServerManagementGetServerPackageStatus, useServerManagementRestartServer, useServerManagementRollbackServerUpdate, useSettingsStoreCount, useSettingsStoreDeclareCollection, useSettingsStoreDelete, useSettingsStoreGet, useSettingsStoreHistogram, useSettingsStoreInsert, useSettingsStoreIsEmpty, useSettingsStoreQuery, useSettingsStoreSet, useSettingsStoreUpdate, useSmokeGetStatus, useSnapshotApplyDeviceSettingsPatch, useSnapshotGetDeviceLiveContribution, useSnapshotGetDeviceSettingsContribution, useSnapshotGetSnapshot, useSnapshotGetSnapshotOverview, useSnapshotGetStatus, useSnapshotInvalidateCache, useStorageAbortUpload, useStorageBeginDownload, useStorageBeginUpload, useStorageDelete, useStorageDeleteLocation, useStorageEndDownload, useStorageExists, useStorageFinalizeUpload, useStorageGetAvailableSpace, useStorageGetDefaultLocation, useStorageList, useStorageListLocationDeclarations, useStorageListLocations, useStorageListProviders, useStorageRead, useStorageReadChunk, useStorageResolve, useStorageTestConfig, useStorageTestLocation, useStorageUpsertLocation, useStorageWrite, useStorageWriteChunk, useStreamBrokerApplyDeviceSettingsPatch, useStreamBrokerAssignProfile, useStreamBrokerGetAllRtspEntries, useStreamBrokerGetBrokerStats, useStreamBrokerGetDeviceLiveContribution, useStreamBrokerGetDeviceSettingsContribution, useStreamBrokerGetPreBufferInfo, useStreamBrokerGetRtspEntry, useStreamBrokerGetRtspPort, useStreamBrokerGetStreamUrl, useStreamBrokerGetStreamWithCodec, useStreamBrokerIsRtspEnabled, useStreamBrokerKillClient, useStreamBrokerListAllCameraStreams, useStreamBrokerListAllProfileSlots, useStreamBrokerListClients, useStreamBrokerProbeStream, useStreamBrokerPublishCameraStream, useStreamBrokerPullAudioChunks, useStreamBrokerPullFrameHandles, useStreamBrokerRegenerateRtspToken, useStreamBrokerReleaseStreamWithCodec, useStreamBrokerRestartProfile, useStreamBrokerRetractCameraStream, useStreamBrokerSetPreBufferDuration, useStreamBrokerSetRtspEnabled, useStreamBrokerSubscribeAudioChunks, useStreamBrokerSubscribeFrames, useStreamBrokerUnassignProfile, useStreamBrokerUnsubscribeAudioChunks, useStreamBrokerUnsubscribeFrames, useStreamCatalogGetCatalog, useStreamParamsGetConfigSchema, useStreamParamsGetOptions, useStreamParamsGetStatus, useStreamParamsSetProfile, useSwitchGetStatus, useSwitchSetState, useSystem, useSystemFeatureFlags, useSystemForceRetentionCleanup, useSystemGetRetentionConfig, useSystemHealth, useSystemInfo, useSystemMutation, useSystemNetworkAddresses, useSystemQuery, useSystemSetRetentionConfig, useTamperGetStatus, useTemperatureSensorGetStatus, useTerminalSessionClose, useTerminalSessionListProfiles, useTerminalSessionListSessions, useTerminalSessionOpenSession, useTerminalSessionResize, useThemeMode, useToastOnToast, useTurnProviderGetTurnServers, useUpdateGetStatus, useUpdateInstallUpdate, useUserManagementConfirmTotp, useUserManagementCreateApiKey, useUserManagementCreateScopedToken, useUserManagementCreateUser, useUserManagementDeleteUser, useUserManagementDisableTotp, useUserManagementGetTotpStatus, useUserManagementListApiKeys, useUserManagementListOauthSessions, useUserManagementListScopedTokens, useUserManagementListUsers, useUserManagementOauthExchangeCode, useUserManagementOauthIssueCode, useUserManagementOauthRefresh, useUserManagementOauthVerifyAccessToken, useUserManagementResetPassword, useUserManagementRevokeApiKey, useUserManagementRevokeOauthSession, useUserManagementRevokeScopedToken, useUserManagementSetUserScopes, useUserManagementSetupTotp, useUserManagementUpdateUser, useUserManagementValidateApiKey, useUserManagementValidateCredentials, useUserManagementValidateScopedToken, useUserManagementVerifyTotp, useVacuumControlGetStatus, useVacuumControlLocate, useVacuumControlPause, useVacuumControlReturnToBase, useVacuumControlSetFanSpeed, useVacuumControlStart, useVacuumControlStop, useValveClose, useValveGetStatus, useValveOpen, useValveSetPosition, useValveStop, useVibrationGetStatus, useVideoclipsGetClipPlayback, useVideoclipsListClips, useVodPlayback, useWaterHeaterGetStatus, useWaterHeaterSetAway, useWaterHeaterSetOperationMode, useWaterHeaterSetTargetTemp, useWeatherGetStatus, useWebrtcSessionAddIceCandidate, useWebrtcSessionCloseSession, useWebrtcSessionCreateSession, useWebrtcSessionGetIceCandidates, useWebrtcSessionGetSessionState, useWebrtcSessionHandleAnswer, useWebrtcSessionHandleOffer, useWebrtcSessionHasAdaptiveBitrate, useWebrtcSessionListStreams, useWidget, useWidgetMetadata, useWidgetRegistry, useZoneAnalyticsGetCameraHistory, useZoneAnalyticsGetCurrentSnapshot, useZoneAnalyticsGetUnzonedHistory, useZoneAnalyticsGetZoneHistory, useZoneEditing, useZoneRulesListRules, useZoneRulesSetRules, useZonesAddZone, useZonesListZones, useZonesRemoveZone, useZonesUpdateZone, vacuumStateMeta, validateScopes, valveStateMeta, waterHeaterPhase, waterHeaterTint, weatherConditionMeta, weatherTint };
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 };