@camstack/ui-library 1.2.193 → 1.2.195

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
@@ -7189,6 +7189,8 @@ var useVideoclipsListClips = trpc.videoclips.listClips.useQuery;
7189
7189
  var useVideoclipsListSources = trpc.videoclips.listSources.useQuery;
7190
7190
  /** Generated alias around `trpc.videoclips.getClipPlayback.useQuery`. */
7191
7191
  var useVideoclipsGetClipPlayback = trpc.videoclips.getClipPlayback.useQuery;
7192
+ /** Generated alias around `trpc.videoclips.readClipBytes.useQuery`. */
7193
+ var useVideoclipsReadClipBytes = trpc.videoclips.readClipBytes.useQuery;
7192
7194
  /** Generated alias around `trpc.waterHeater.setTargetTemp.useMutation`. */
7193
7195
  var useWaterHeaterSetTargetTemp = trpc.waterHeater.setTargetTemp.useMutation;
7194
7196
  /** Generated alias around `trpc.waterHeater.setOperationMode.useMutation`. */
@@ -17660,38 +17662,6 @@ var cva = (base, config) => (props) => {
17660
17662
  }, []), props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);
17661
17663
  };
17662
17664
  //#endregion
17663
- //#region src/primitives/badge.tsx
17664
- var badgeVariants = cva("inline-flex items-center rounded-full text-xs font-medium px-2 py-0.5", {
17665
- variants: {
17666
- variant: {
17667
- default: "bg-surface-hover text-foreground",
17668
- success: "bg-success/15 text-success",
17669
- warning: "bg-warning/15 text-warning",
17670
- danger: "bg-danger/15 text-danger",
17671
- info: "bg-info/15 text-info"
17672
- },
17673
- styleVariant: {
17674
- solid: "",
17675
- outline: "border bg-transparent"
17676
- }
17677
- },
17678
- defaultVariants: {
17679
- variant: "default",
17680
- styleVariant: "solid"
17681
- }
17682
- });
17683
- var Badge = forwardRef(({ className, variant, style, ...props }, ref) => {
17684
- return /* @__PURE__ */ jsx("span", {
17685
- ref,
17686
- className: cn(badgeVariants({
17687
- variant,
17688
- styleVariant: style
17689
- }), className),
17690
- ...props
17691
- });
17692
- });
17693
- Badge.displayName = "Badge";
17694
- //#endregion
17695
17665
  //#region src/primitives/button.tsx
17696
17666
  var buttonVariants = cva("inline-flex items-center justify-center rounded-md font-medium transition-colors cursor-pointer disabled:opacity-50 disabled:pointer-events-none", {
17697
17667
  variants: {
@@ -17967,473 +17937,6 @@ function axisTicks(fromMs, toMs, count) {
17967
17937
  return ticks;
17968
17938
  }
17969
17939
  //#endregion
17970
- //#region src/hooks/use-is-mobile.ts
17971
- var MOBILE_QUERY = "(max-width: 767px)";
17972
- /**
17973
- * Mid breakpoint — below this width the sidebar collapses to an
17974
- * icons-only rail to reclaim canvas space. Above it (and outside
17975
- * mobile) the full sidebar renders. Threshold matches Tailwind `lg`
17976
- * so sidebar fans out at the same point grids switch to multi-column.
17977
- */
17978
- var MID_QUERY = "(min-width: 768px) and (max-width: 1023px)";
17979
- /**
17980
- * `matchMedia` is universal in browsers but absent in bare DOM environments.
17981
- * These hooks are called from shared primitives (`DataTable` picks its narrow
17982
- * layout with one), so throwing here takes down the whole page that merely
17983
- * rendered a table. Where the capability is missing, report the desktop
17984
- * layout — a widescreen rendering is wrong-looking; a crashed page is gone.
17985
- */
17986
- function matchQuery(query) {
17987
- if (typeof window.matchMedia !== "function") return null;
17988
- return window.matchMedia(query);
17989
- }
17990
- function subscribeQuery(query) {
17991
- return (callback) => {
17992
- const mql = matchQuery(query);
17993
- if (mql === null) return () => {};
17994
- mql.addEventListener("change", callback);
17995
- return () => mql.removeEventListener("change", callback);
17996
- };
17997
- }
17998
- function getSnapshot(query) {
17999
- return () => matchQuery(query)?.matches ?? false;
18000
- }
18001
- function getServerSnapshot() {
18002
- return false;
18003
- }
18004
- function useIsMobile() {
18005
- return useSyncExternalStore(subscribeQuery(MOBILE_QUERY), getSnapshot(MOBILE_QUERY), getServerSnapshot);
18006
- }
18007
- /**
18008
- * True when the viewport is in the medium (`md`) Tailwind range —
18009
- * 768px ≤ width < 1024px. Use to drive layouts that should pack denser
18010
- * than full-desktop but more legibly than mobile (e.g. icons-only
18011
- * sidebar rail, narrower stat tiles).
18012
- */
18013
- function useIsMidWidth() {
18014
- return useSyncExternalStore(subscribeQuery(MID_QUERY), getSnapshot(MID_QUERY), getServerSnapshot);
18015
- }
18016
- //#endregion
18017
- //#region src/composites/data-table-layout.ts
18018
- /**
18019
- * At this many columns and above, `auto` switches a narrow viewport to cards.
18020
- * Three columns still fit a phone at a readable size; four do not.
18021
- */
18022
- var CARD_MODE_MIN_COLUMNS = 4;
18023
- function resolveTableLayout({ mode, columnCount, isNarrow }) {
18024
- if (!isNarrow) return "table";
18025
- if (mode === "scroll") return "table";
18026
- if (mode === "cards") return "cards";
18027
- if (columnCount === 0) return "table";
18028
- return columnCount >= 4 ? "cards" : "table";
18029
- }
18030
- //#endregion
18031
- //#region src/lib/responsive.ts
18032
- /**
18033
- * Responsive design tokens — three-tier system.
18034
- *
18035
- * The admin-ui targets three width tiers; every component should pick
18036
- * the right token from this file instead of hand-coding breakpoints.
18037
- * Adopting the tokens uniformly is what makes the app feel consistent
18038
- * across operator devices (mobile / tablet / desktop) and what unlocks
18039
- * targeted tuning (e.g. shrink every label by 1px in one place).
18040
- *
18041
- * Tier definitions (Tailwind breakpoints):
18042
- *
18043
- * • **L1 — Compact** (`< 640px`, default = mobile portrait)
18044
- * Single column, tight padding, smallest text, icon-only buttons
18045
- * where labels can be inferred. The operator can still see every
18046
- * stat / action — no horizontal scroll, no clipped text. The user
18047
- * directive: "molta informazione in poco spazio quando la width è
18048
- * bassa."
18049
- *
18050
- * • **L2 — Standard** (`sm` — `640–1023px`, tablet + small laptop)
18051
- * 2-column grids, side panels become visible, button labels return.
18052
- * Targets ~768px–1024px viewports — the most common operator sizes.
18053
- *
18054
- * • **L3 — Spacious** (`lg+` — `≥ 1024px`, desktop)
18055
- * 4-column grids, generous padding, full-width header text,
18056
- * side-by-side composite layouts. The operator has elbow room.
18057
- *
18058
- * Conventions:
18059
- * - **Always start from L1** — the bare class is always the compact
18060
- * variant, then `sm:` adds room at 640px, `lg:` at 1024px. No
18061
- * desktop-first breakpoints; no max-width queries.
18062
- * - **Token strings are static** — kept as `as const` so callers can
18063
- * compose them via `cn()` / template literals without running a
18064
- * class generator at runtime.
18065
- * - **Pair the token with a comment** — the comment in the file
18066
- * names every breakpoint it crosses, so a reader can predict the
18067
- * layout without going to Tailwind docs.
18068
- */
18069
- /** Container padding for a card-style section (header + body). */
18070
- var SECTION_CARD = "rounded-lg border border-border bg-surface overflow-hidden";
18071
- /** Header strip inside a card (between border-b lines). */
18072
- var SECTION_HEADER = "border-b border-border px-3 sm:px-4 py-1.5 sm:py-2";
18073
- /** Body padding for a card-style section. */
18074
- var SECTION_BODY = "p-2 sm:p-3 lg:p-4";
18075
- /** Gap between cards in a vertical stack. */
18076
- var STACK_GAP = "space-y-3 sm:space-y-4";
18077
- /** Gap between cards in a grid (4 cells / row at lg). */
18078
- var GRID_GAP = "gap-2 sm:gap-3";
18079
- /** Row padding inside a divided list (e.g. InfoRow). */
18080
- var LIST_ROW = "px-3 sm:px-4 py-1.5 sm:py-2";
18081
- /** 1-up at L1, 2-up at L2, 4-up at L3 — quick-stat row. */
18082
- var GRID_QUICK_STATS = "grid grid-cols-2 sm:grid-cols-2 lg:grid-cols-4";
18083
- /** 1-up at L1, 2-up at L2+ — paired panels (motion + detection rules). */
18084
- var GRID_PAIRED = "grid grid-cols-1 lg:grid-cols-2";
18085
- /** Side-by-side layout that stacks below md (canvas + side panel). */
18086
- var SPLIT_PANEL_OUTER = "flex flex-col-reverse md:flex-row";
18087
- /** Sidebar narrow lane in a SPLIT_PANEL_OUTER layout. */
18088
- var SPLIT_PANEL_SIDE = "w-full md:w-44 lg:w-52 md:flex-shrink-0 border-b md:border-b-0 md:border-l border-border";
18089
- /**
18090
- * The tier boundary at which a settings label/value row stops stacking.
18091
- *
18092
- * Below it (L1 — compact) the row is ONE column: label on its own line, value
18093
- * on the next at full width. Above it the row is label-left / value-right as
18094
- * before. The two-column form needs `SETTING_ROW_LABEL`'s lane plus a readable
18095
- * value beside it; a phone has neither, and the failure mode is not "cramped"
18096
- * but "the value is the part that gets cut" — the one thing the operator
18097
- * opened the page to read.
18098
- */
18099
- var SETTING_ROW_STACK_BREAKPOINT = "sm";
18100
- /** Outer row: single column at L1, label/value columns from `sm` up. */
18101
- var SETTING_ROW = "flex min-w-0 flex-col gap-0.5 py-1.5 sm:flex-row sm:items-center";
18102
- /** Label lane. Full width (and free to wrap) at L1; a fixed lane from `sm` up. */
18103
- var SETTING_ROW_LABEL = "min-w-0 text-[11px] leading-tight text-foreground-subtle sm:w-32 sm:shrink-0 sm:pr-2";
18104
- /**
18105
- * Value lane — the value text plus its trailing affordances (copy / reveal).
18106
- * `w-full` at L1 so the value owns the whole row once the label is above it;
18107
- * `sm:flex-1` makes it share the row again from `sm` up.
18108
- */
18109
- var SETTING_ROW_VALUE = "flex w-full min-w-0 items-center gap-1 sm:flex-1";
18110
- /**
18111
- * The value text itself. `break-all` lets an opaque token (a key, a URL) wrap
18112
- * at L1 instead of being cut mid-word; `sm:truncate` restores the single-line
18113
- * desktop form, where the row is wide enough for truncation to be a choice
18114
- * rather than data loss.
18115
- */
18116
- var SETTING_ROW_VALUE_TEXT = "min-w-0 break-all text-xs text-foreground sm:truncate";
18117
- /** Section header label (uppercase tracking-wider). */
18118
- var TEXT_SECTION_LABEL = "text-[10px] sm:text-[11px] font-semibold text-foreground uppercase tracking-wider";
18119
- /** Field label inside a row. */
18120
- var TEXT_FIELD_LABEL = "text-[11px] sm:text-xs text-foreground";
18121
- /** Sub-label / hint text. */
18122
- var TEXT_HINT = "text-[10px] text-foreground-subtle";
18123
- /** Primary value (a metric, badge, …). */
18124
- var TEXT_VALUE = "text-[11px] sm:text-xs font-medium text-foreground";
18125
- /** Big metric value (StatCard). */
18126
- var TEXT_METRIC = "text-base sm:text-lg font-semibold leading-tight text-foreground";
18127
- /** Default compact button. */
18128
- var BTN_COMPACT = "inline-flex items-center justify-center gap-1 rounded border border-border bg-surface px-1.5 py-0.5 sm:px-2 sm:py-1 text-[10px] sm:text-[11px] font-medium text-foreground hover:bg-surface-hover transition-colors disabled:opacity-40";
18129
- /** Primary compact button. */
18130
- var BTN_COMPACT_PRIMARY = "inline-flex items-center justify-center gap-1 rounded border border-primary/40 bg-primary/15 px-1.5 py-0.5 sm:px-2 sm:py-1 text-[10px] sm:text-[11px] font-medium text-primary hover:bg-primary/25 transition-colors disabled:opacity-40";
18131
- /** Danger compact button. */
18132
- var BTN_COMPACT_DANGER = "inline-flex items-center justify-center gap-1 rounded border border-danger/40 bg-danger/10 px-1.5 py-0.5 sm:px-2 sm:py-1 text-[10px] sm:text-[11px] font-medium text-danger hover:bg-danger/20 transition-colors disabled:opacity-40";
18133
- /** Warning compact button (e.g. cancel-drawing). */
18134
- var BTN_COMPACT_WARNING = "inline-flex items-center justify-center gap-1 rounded border border-warning/40 bg-warning/10 px-1.5 py-0.5 sm:px-2 sm:py-1 text-[10px] sm:text-[11px] font-medium text-warning hover:bg-warning/20 transition-colors disabled:opacity-40";
18135
- /** Compact text/select/number input. */
18136
- var INPUT_COMPACT = "w-full rounded border border-border bg-background px-1.5 py-0.5 sm:px-2 sm:py-1 text-[11px] sm:text-xs text-foreground focus:border-primary focus:ring-1 focus:ring-primary/30 outline-none";
18137
- /** Chip-style toggle (zone / class selectors in ZoneRulesEditor). */
18138
- var CHIP_BASE = "inline-flex items-center gap-1 rounded-full border px-1.5 py-0.5 text-[10px] font-medium transition-colors";
18139
- var CHIP_ACTIVE = "border-primary/50 bg-primary/15 text-primary";
18140
- var CHIP_INACTIVE = "border-border bg-surface text-foreground-subtle hover:bg-surface-hover";
18141
- //#endregion
18142
- //#region src/composites/setting-row.tsx
18143
- function SettingRow({ label, children, actions, elements = "plain", className, valueClassName }) {
18144
- const LabelTag = elements === "description" ? "dt" : "span";
18145
- const ValueTag = elements === "description" ? "dd" : "div";
18146
- return /* @__PURE__ */ jsxs("div", {
18147
- "data-setting-row": "",
18148
- className: cn(SETTING_ROW, className),
18149
- children: [/* @__PURE__ */ jsx(LabelTag, {
18150
- "data-setting-row-label": "",
18151
- className: SETTING_ROW_LABEL,
18152
- children: label
18153
- }), /* @__PURE__ */ jsxs(ValueTag, {
18154
- "data-setting-row-value": "",
18155
- className: SETTING_ROW_VALUE,
18156
- children: [/* @__PURE__ */ jsx("span", {
18157
- "data-setting-row-value-text": "",
18158
- className: cn(SETTING_ROW_VALUE_TEXT, valueClassName),
18159
- children
18160
- }), actions !== void 0 && /* @__PURE__ */ jsx("span", {
18161
- className: "flex shrink-0 items-center gap-0.5",
18162
- children: actions
18163
- })]
18164
- })]
18165
- });
18166
- }
18167
- //#endregion
18168
- //#region src/composites/sort-header-button.tsx
18169
- function SortHeaderButton({ label, active, dir, onSort }) {
18170
- return /* @__PURE__ */ jsxs("button", {
18171
- type: "button",
18172
- onClick: onSort,
18173
- className: "group/sort inline-flex items-center gap-0.5 hover:text-foreground transition-colors",
18174
- children: [/* @__PURE__ */ jsx("span", { children: label }), active ? dir === "asc" ? /* @__PURE__ */ jsx(ChevronUp, { className: "h-3 w-3 flex-shrink-0" }) : /* @__PURE__ */ jsx(ChevronDown, { className: "h-3 w-3 flex-shrink-0" }) : /* @__PURE__ */ jsx(ChevronUp, { className: cn("h-3 w-3 flex-shrink-0 opacity-0 transition-opacity", "group-hover/sort:opacity-30") })]
18175
- });
18176
- }
18177
- //#endregion
18178
- //#region src/composites/table-sort.ts
18179
- /**
18180
- * The toggle rule, and the only copy of it.
18181
- *
18182
- * none → asc → desc → none, and a click on a DIFFERENT column starts that
18183
- * column fresh at `asc`. `sameColumn` says whether the clicked column is the
18184
- * one currently sorted; `currentDir` is its direction (`null` when nothing is
18185
- * sorted). Returns the next direction, or `null` for "unsorted".
18186
- *
18187
- * Split out from {@link nextTableSort} so the device list — whose sort state
18188
- * keys columns by `columnId`, not `columnKey` — can reuse the rule without a
18189
- * cast and without a second copy of it.
18190
- */
18191
- function nextSortDirection(sameColumn, currentDir) {
18192
- if (!sameColumn || currentDir === null) return "asc";
18193
- return currentDir === "asc" ? "desc" : null;
18194
- }
18195
- /**
18196
- * Toggle a column's sort on header click: none → asc → desc → none.
18197
- * Clicking a DIFFERENT column starts it fresh at `asc`.
18198
- */
18199
- function nextTableSort(current, columnKey) {
18200
- const dir = nextSortDirection(current !== null && current.columnKey === columnKey, current === null ? null : current.dir);
18201
- return dir === null ? null : {
18202
- columnKey,
18203
- dir
18204
- };
18205
- }
18206
- /**
18207
- * Ascending comparison of two cell values.
18208
- *
18209
- * Numbers compare numerically and strings compare with `localeCompare` — a
18210
- * numeric column must never be ordered as text ("100" before "9"), and a text
18211
- * column must respect the locale's collation. A mixed column (one row a
18212
- * number, another a string) falls back to string comparison of both, which is
18213
- * the only total order available; it is not a shape any caller should build on
18214
- * purpose.
18215
- *
18216
- * `null` is NOT handled here — {@link sortRowsByColumn} pulls it out first,
18217
- * because its placement is direction-independent and a comparator that is
18218
- * multiplied by the direction factor cannot express that.
18219
- */
18220
- function compareValues(a, b) {
18221
- if (typeof a === "number" && typeof b === "number") return a - b;
18222
- return String(a).localeCompare(String(b));
18223
- }
18224
- /**
18225
- * Return a NEW array of `rows` ordered by `sort`.
18226
- *
18227
- * `valueOf` is the column's `sortValue` — it is called once per row per
18228
- * comparison, so it must be cheap (read a field, do not format a string).
18229
- * `sort === null` ⇒ a fresh shallow copy in the incoming order.
18230
- */
18231
- function sortRowsByColumn(rows, sort, valueOf) {
18232
- if (sort === null) return [...rows];
18233
- const factor = sort.dir === "asc" ? 1 : -1;
18234
- return rows.toSorted((a, b) => {
18235
- const av = valueOf(a);
18236
- const bv = valueOf(b);
18237
- if (av === null || bv === null) {
18238
- if (av === bv) return 0;
18239
- return av === null ? 1 : -1;
18240
- }
18241
- return factor * compareValues(av, bv);
18242
- });
18243
- }
18244
- /** Derive the `<th>` `aria-sort` for `columnKey` from the table's sort state. */
18245
- function ariaSortForColumn(sort, columnKey) {
18246
- if (sort === null || sort.columnKey !== columnKey) return "none";
18247
- return sort.dir === "asc" ? "ascending" : "descending";
18248
- }
18249
- //#endregion
18250
- //#region src/composites/data-table.tsx
18251
- /**
18252
- * DataTable — shared responsive table for admin pages.
18253
- *
18254
- * Recipes baked in:
18255
- * - `overflow-x-auto` wrapper so narrow viewports don't clip the
18256
- * right edge (the rounded border survives the scroll).
18257
- * - `min-w-[Npx]` on the inner table so columns don't squash below
18258
- * readable width before the scroll kicks in.
18259
- * - `whitespace-nowrap` on headers — column titles never wrap to
18260
- * two lines (`AUTO-KILL` was the regression that triggered this).
18261
- * - Themed `bg-surface` + `border-border` so contrast works in both
18262
- * light and dark themes.
18263
- *
18264
- * Column model: caller supplies `columns: DataColumn<T>[]` and
18265
- * `rows: T[]`. Each column declares `header`, optional `align`,
18266
- * optional `nowrap`, and a `render(row) => ReactNode` that produces
18267
- * the cell content.
18268
- *
18269
- * <DataTable
18270
- * columns={[
18271
- * { key: 'username', header: 'Username', render: (u) => u.username },
18272
- * { key: 'role', header: 'Role', render: (u) => <RoleBadge .../> },
18273
- * { key: 'actions', header: '', align: 'right', render: (u) => <Actions .../> },
18274
- * ]}
18275
- * rows={users}
18276
- * minWidthPx={560}
18277
- * />
18278
- *
18279
- * If finer header markup is needed, pass `headerRender` instead of
18280
- * `header` (e.g. for a sortable click affordance).
18281
- *
18282
- * ── Narrow viewports ──────────────────────────────────────────────────────
18283
- * The table stays a table. The wrapper is `overflow-x-auto`, so a phone
18284
- * scrolls the columns sideways INSIDE the table — the page body never moves
18285
- * sideways, and the cells stay one line (`whitespace-nowrap`). That is the
18286
- * default (`mobileMode="scroll"`). Cards are opt-in via `mobileMode="cards"`;
18287
- * `auto` still applies the old column-count rule for a surface that wants it.
18288
- * See `resolveTableLayout`.
18289
- *
18290
- * ── Scrolling the BODY, not the page ──────────────────────────────────────
18291
- * `maxBodyHeight` caps the table and scrolls its rows INSIDE the container
18292
- * with the column header pinned. It is ONE prop, not two, because "this list
18293
- * scrolls internally" and "its header stays visible" are the same decision: a
18294
- * capped table whose header scrolls away is a list of unlabelled cells.
18295
- *
18296
- * Use it wherever the row count is open-ended (rules, targets, delivery
18297
- * history) so the page keeps its own header, filters and actions in view while
18298
- * the operator moves through the rows.
18299
- */
18300
- /**
18301
- * The default cap for an internally-scrolling table.
18302
- *
18303
- * `60vh` leaves the page header, its filters and its actions on screen at
18304
- * every viewport while still showing ~10 rows — and it is a fraction, so it
18305
- * does not need a breakpoint of its own.
18306
- */
18307
- var TABLE_SCROLL_MAX_H = "max-h-[60vh]";
18308
- var ALIGN_CLASS = {
18309
- left: "text-left",
18310
- right: "text-right",
18311
- center: "text-center"
18312
- };
18313
- function DataTable({ columns, rows, rowKey, onRowClick, minWidthPx = 480, emptyMessage, className, bordered = true, rowClassName, mobileMode = "scroll", maxBodyHeight, defaultSort }) {
18314
- const isNarrow = useIsMobile();
18315
- const [sort, setSort] = useState(defaultSort ?? null);
18316
- const layout = resolveTableLayout({
18317
- mode: mobileMode,
18318
- columnCount: columns.length,
18319
- isNarrow
18320
- });
18321
- const scrolls = maxBodyHeight !== void 0;
18322
- const sortedColumn = useMemo(() => sort === null ? void 0 : columns.find((col) => col.key === sort.columnKey && col.sortValue !== void 0), [columns, sort]);
18323
- const sortValue = sortedColumn?.sortValue;
18324
- const displayRows = useMemo(() => sortValue === void 0 ? rows : sortRowsByColumn(rows, sort, sortValue), [
18325
- rows,
18326
- sort,
18327
- sortValue
18328
- ]);
18329
- const activeSort = sortedColumn === void 0 ? null : sort;
18330
- if (rows.length === 0 && emptyMessage) return /* @__PURE__ */ jsx("div", {
18331
- className: `rounded-lg ${bordered ? "border border-border" : ""} bg-surface px-3 py-4 text-xs text-foreground-subtle text-center ${className ?? ""}`,
18332
- children: emptyMessage
18333
- });
18334
- if (rows.length === 0) return null;
18335
- if (layout === "cards") return /* @__PURE__ */ jsx("div", {
18336
- className: `space-y-2 ${scrolls ? `${maxBodyHeight} overflow-y-auto` : ""} ${className ?? ""}`,
18337
- children: displayRows.map((row, rowIndex) => /* @__PURE__ */ jsx(DataTableCard, {
18338
- row,
18339
- rowIndex,
18340
- columns,
18341
- bordered,
18342
- onRowClick,
18343
- rowClassName
18344
- }, rowKey ? rowKey(row, rowIndex) : rowIndex))
18345
- });
18346
- return /* @__PURE__ */ jsx("div", {
18347
- className: [
18348
- "rounded-lg",
18349
- bordered ? "border border-border" : "",
18350
- "bg-surface overflow-x-auto",
18351
- scrolls ? `${maxBodyHeight} overflow-y-auto` : "",
18352
- className ?? ""
18353
- ].filter(Boolean).join(" "),
18354
- children: /* @__PURE__ */ jsxs("table", {
18355
- className: `w-full text-xs ${scrolls ? "border-separate border-spacing-0" : ""}`,
18356
- style: { minWidth: `${minWidthPx}px` },
18357
- children: [/* @__PURE__ */ jsx("thead", {
18358
- className: "bg-surface",
18359
- children: /* @__PURE__ */ jsx("tr", { children: columns.map((col) => {
18360
- const align = col.align ?? "left";
18361
- const nowrap = col.nowrap ?? true;
18362
- const sortable = col.sortValue !== void 0;
18363
- const isSorted = activeSort !== null && activeSort.columnKey === col.key;
18364
- return /* @__PURE__ */ jsx("th", {
18365
- "aria-sort": sortable ? ariaSortForColumn(activeSort, col.key) : void 0,
18366
- title: sortable ? void 0 : col.notSortableReason,
18367
- className: [
18368
- "px-3 py-2 text-foreground-subtle font-medium bg-surface border-b border-border",
18369
- scrolls ? "sticky top-0 z-10" : "",
18370
- ALIGN_CLASS[align],
18371
- nowrap ? "whitespace-nowrap" : "",
18372
- col.width ?? ""
18373
- ].filter(Boolean).join(" "),
18374
- children: sortable ? /* @__PURE__ */ jsx(SortHeaderButton, {
18375
- label: col.headerRender ? col.headerRender() : col.header,
18376
- active: isSorted,
18377
- dir: isSorted && activeSort !== null ? activeSort.dir : "asc",
18378
- onSort: () => setSort((prev) => nextTableSort(prev, col.key))
18379
- }) : col.headerRender ? col.headerRender() : col.header
18380
- }, col.key);
18381
- }) })
18382
- }), /* @__PURE__ */ jsx("tbody", { children: displayRows.map((row, rowIndex) => {
18383
- const key = rowKey ? rowKey(row, rowIndex) : rowIndex;
18384
- const extra = rowClassName?.(row, rowIndex) ?? "";
18385
- const interactive = onRowClick !== void 0;
18386
- return /* @__PURE__ */ jsx("tr", {
18387
- onClick: interactive ? () => onRowClick(row, rowIndex) : void 0,
18388
- className: [interactive ? "cursor-pointer hover:bg-primary/5" : "hover:bg-primary/5", extra].filter(Boolean).join(" "),
18389
- children: columns.map((col) => {
18390
- const align = col.align ?? "left";
18391
- const nowrap = col.nowrap ?? true;
18392
- return /* @__PURE__ */ jsx("td", {
18393
- className: [
18394
- "px-3 py-2 text-foreground border-b border-border",
18395
- ALIGN_CLASS[align],
18396
- nowrap ? "whitespace-nowrap" : ""
18397
- ].filter(Boolean).join(" "),
18398
- children: col.render(row, rowIndex)
18399
- }, col.key);
18400
- })
18401
- }, key);
18402
- }) })]
18403
- })
18404
- });
18405
- }
18406
- /**
18407
- * One row as a card. Columns that carry a plain-text `header` become labelled
18408
- * `SettingRow`s — the label is the column title and the value gets the full
18409
- * card width. Columns with no text header (an actions column, a
18410
- * `headerRender`-only column) have no label to show, so they render as a
18411
- * full-width strip at the foot of the card.
18412
- */
18413
- function DataTableCard({ row, rowIndex, columns, bordered, onRowClick, rowClassName }) {
18414
- const labelled = columns.filter((col) => col.header !== void 0 && col.header !== "");
18415
- const unlabelled = columns.filter((col) => col.header === void 0 || col.header === "");
18416
- const interactive = onRowClick !== void 0;
18417
- const extra = rowClassName?.(row, rowIndex) ?? "";
18418
- return /* @__PURE__ */ jsxs("div", {
18419
- "data-data-table-card": "",
18420
- onClick: interactive ? () => onRowClick(row, rowIndex) : void 0,
18421
- className: [
18422
- "rounded-lg bg-surface px-3 py-1.5 divide-y divide-border-subtle",
18423
- bordered ? "border border-border" : "",
18424
- interactive ? "cursor-pointer hover:bg-primary/5" : "",
18425
- extra
18426
- ].filter(Boolean).join(" "),
18427
- children: [labelled.map((col) => /* @__PURE__ */ jsx(SettingRow, {
18428
- label: col.header,
18429
- children: col.render(row, rowIndex)
18430
- }, col.key)), unlabelled.length > 0 && /* @__PURE__ */ jsx("div", {
18431
- className: "flex flex-wrap items-center justify-end gap-2 py-1.5",
18432
- children: unlabelled.map((col) => /* @__PURE__ */ jsx("div", { children: col.render(row, rowIndex) }, col.key))
18433
- })]
18434
- });
18435
- }
18436
- //#endregion
18437
17940
  //#region src/composites/device-list/pagination.tsx
18438
17941
  var NEIGHBORS = 2;
18439
17942
  function computePageButtons(currentPage, totalPages) {
@@ -19021,6 +18524,38 @@ function ClipPanel({ deviceId, clip, profile, onProfileChange }) {
19021
18524
  });
19022
18525
  }
19023
18526
  //#endregion
18527
+ //#region src/primitives/badge.tsx
18528
+ var badgeVariants = cva("inline-flex items-center rounded-full text-xs font-medium px-2 py-0.5", {
18529
+ variants: {
18530
+ variant: {
18531
+ default: "bg-surface-hover text-foreground",
18532
+ success: "bg-success/15 text-success",
18533
+ warning: "bg-warning/15 text-warning",
18534
+ danger: "bg-danger/15 text-danger",
18535
+ info: "bg-info/15 text-info"
18536
+ },
18537
+ styleVariant: {
18538
+ solid: "",
18539
+ outline: "border bg-transparent"
18540
+ }
18541
+ },
18542
+ defaultVariants: {
18543
+ variant: "default",
18544
+ styleVariant: "solid"
18545
+ }
18546
+ });
18547
+ var Badge = forwardRef(({ className, variant, style, ...props }, ref) => {
18548
+ return /* @__PURE__ */ jsx("span", {
18549
+ ref,
18550
+ className: cn(badgeVariants({
18551
+ variant,
18552
+ styleVariant: style
18553
+ }), className),
18554
+ ...props
18555
+ });
18556
+ });
18557
+ Badge.displayName = "Badge";
18558
+ //#endregion
19024
18559
  //#region src/lib/format-duration.ts
19025
18560
  /**
19026
18561
  * How long something lasted, the way this product says it.
@@ -19534,24 +19069,6 @@ function describeSource(source) {
19534
19069
  answered: copy.answered
19535
19070
  };
19536
19071
  }
19537
- var MINUTE_MS$1 = 6e4;
19538
- var HOUR_MS$1 = 36e5;
19539
- var DAY_MS$2 = 864e5;
19540
- /**
19541
- * How old a source's catalog is, or null when it did not say.
19542
- *
19543
- * Null is NOT "now". A source that omits `catalogAsOf` was read live and has
19544
- * no age to show; inventing "just now" for a source that never told us would
19545
- * be the same lie as drawing a cached list as current (D549 decision 13).
19546
- */
19547
- function formatCatalogAge(catalogAsOf, now) {
19548
- if (catalogAsOf === void 0) return null;
19549
- const age = Math.max(0, now - catalogAsOf);
19550
- if (age < MINUTE_MS$1) return "under a minute ago";
19551
- if (age < HOUR_MS$1) return `${String(Math.floor(age / MINUTE_MS$1))} min ago`;
19552
- if (age < DAY_MS$2) return `${String(Math.floor(age / HOUR_MS$1))} h ago`;
19553
- return `${String(Math.floor(age / DAY_MS$2))} d ago`;
19554
- }
19555
19072
  //#endregion
19556
19073
  //#region src/composites/clips/clip-view-state.ts
19557
19074
  function resolveClipsView(input) {
@@ -19705,56 +19222,6 @@ function resolveClipsView(input) {
19705
19222
  var CLIP_PAGE_LIMIT = 500;
19706
19223
  /** Tiles per page. The rest are a `Pagination` click away, never dropped. */
19707
19224
  var TILES_PER_PAGE = 60;
19708
- var TONE_BADGE = {
19709
- ok: "success",
19710
- warn: "warning",
19711
- error: "danger"
19712
- };
19713
- var SOURCE_COLUMNS = [
19714
- {
19715
- key: "source",
19716
- header: "Source",
19717
- render: (row) => /* @__PURE__ */ jsxs("div", {
19718
- className: "min-w-0",
19719
- children: [/* @__PURE__ */ jsx("div", {
19720
- className: "font-medium text-foreground",
19721
- children: row.notice.label
19722
- }), /* @__PURE__ */ jsx("div", {
19723
- className: "text-[10px] text-foreground-subtle",
19724
- children: row.notice.source
19725
- })]
19726
- })
19727
- },
19728
- {
19729
- key: "state",
19730
- header: "State",
19731
- nowrap: false,
19732
- render: (row) => /* @__PURE__ */ jsx(Badge, {
19733
- variant: TONE_BADGE[row.notice.tone],
19734
- children: row.notice.headline
19735
- })
19736
- },
19737
- {
19738
- key: "reason",
19739
- header: "Reason",
19740
- nowrap: false,
19741
- render: (row) => row.notice.detail === null ? /* @__PURE__ */ jsx("span", {
19742
- className: "text-foreground-subtle",
19743
- children: "—"
19744
- }) : /* @__PURE__ */ jsx("span", {
19745
- className: "break-words",
19746
- children: row.notice.detail
19747
- })
19748
- },
19749
- {
19750
- key: "read",
19751
- header: "Catalog read",
19752
- render: (row) => /* @__PURE__ */ jsx("span", {
19753
- className: "text-foreground-subtle",
19754
- children: row.catalogAge ?? "live"
19755
- })
19756
- }
19757
- ];
19758
19225
  /** The sources that contributed NOTHING to what is on screen, and why. */
19759
19226
  function SilentSources({ silent }) {
19760
19227
  if (silent.length === 0) return null;
@@ -19841,7 +19308,6 @@ function ClipsSection({ deviceId }) {
19841
19308
  ...clips.error ? { clipsError: clips.error.message } : {},
19842
19309
  ...sources.error ? { sourcesError: sources.error.message } : {}
19843
19310
  });
19844
- const now = Date.now();
19845
19311
  const options = useMemo(() => {
19846
19312
  const byAddon = /* @__PURE__ */ new Map();
19847
19313
  for (const row of sourceRows) {
@@ -19856,10 +19322,6 @@ function ClipsSection({ deviceId }) {
19856
19322
  label: labels.join(" · ")
19857
19323
  }));
19858
19324
  }, [sourceRows]);
19859
- const tableRows = useMemo(() => sourceRows.map((row) => ({
19860
- notice: describeSource(row),
19861
- catalogAge: formatCatalogAge(row.availability.catalogAsOf, now)
19862
- })), [sourceRows]);
19863
19325
  useEffect(() => {
19864
19326
  setPage(1);
19865
19327
  }, [band.fromMs, band.toMs]);
@@ -19965,19 +19427,6 @@ function ClipsSection({ deviceId }) {
19965
19427
  onSelectBucket: handleSelectBucket,
19966
19428
  densityLoading: density.status === "pending"
19967
19429
  }),
19968
- /* @__PURE__ */ jsx("section", {
19969
- "aria-label": "Clip sources",
19970
- className: "space-y-1",
19971
- children: sources.status === "pending" ? /* @__PURE__ */ jsx(Skeleton, { className: "h-16 w-full" }) : tableRows.length === 0 ? /* @__PURE__ */ jsx(EmptyState, {
19972
- icon: Film,
19973
- title: "No provider answered for this camera",
19974
- description: "Nothing claims to hold clips for it."
19975
- }) : /* @__PURE__ */ jsx(DataTable, {
19976
- columns: SOURCE_COLUMNS,
19977
- rows: [...tableRows],
19978
- minWidthPx: 520
19979
- })
19980
- }),
19981
19430
  /* @__PURE__ */ jsx("section", {
19982
19431
  "aria-label": "Clips",
19983
19432
  className: "space-y-2",
@@ -27656,6 +27105,53 @@ function TooltipContent({ className, children, ...props }) {
27656
27105
  });
27657
27106
  }
27658
27107
  //#endregion
27108
+ //#region src/hooks/use-is-mobile.ts
27109
+ var MOBILE_QUERY = "(max-width: 767px)";
27110
+ /**
27111
+ * Mid breakpoint — below this width the sidebar collapses to an
27112
+ * icons-only rail to reclaim canvas space. Above it (and outside
27113
+ * mobile) the full sidebar renders. Threshold matches Tailwind `lg`
27114
+ * so sidebar fans out at the same point grids switch to multi-column.
27115
+ */
27116
+ var MID_QUERY = "(min-width: 768px) and (max-width: 1023px)";
27117
+ /**
27118
+ * `matchMedia` is universal in browsers but absent in bare DOM environments.
27119
+ * These hooks are called from shared primitives (`DataTable` picks its narrow
27120
+ * layout with one), so throwing here takes down the whole page that merely
27121
+ * rendered a table. Where the capability is missing, report the desktop
27122
+ * layout — a widescreen rendering is wrong-looking; a crashed page is gone.
27123
+ */
27124
+ function matchQuery(query) {
27125
+ if (typeof window.matchMedia !== "function") return null;
27126
+ return window.matchMedia(query);
27127
+ }
27128
+ function subscribeQuery(query) {
27129
+ return (callback) => {
27130
+ const mql = matchQuery(query);
27131
+ if (mql === null) return () => {};
27132
+ mql.addEventListener("change", callback);
27133
+ return () => mql.removeEventListener("change", callback);
27134
+ };
27135
+ }
27136
+ function getSnapshot(query) {
27137
+ return () => matchQuery(query)?.matches ?? false;
27138
+ }
27139
+ function getServerSnapshot() {
27140
+ return false;
27141
+ }
27142
+ function useIsMobile() {
27143
+ return useSyncExternalStore(subscribeQuery(MOBILE_QUERY), getSnapshot(MOBILE_QUERY), getServerSnapshot);
27144
+ }
27145
+ /**
27146
+ * True when the viewport is in the medium (`md`) Tailwind range —
27147
+ * 768px ≤ width < 1024px. Use to drive layouts that should pack denser
27148
+ * than full-desktop but more legibly than mobile (e.g. icons-only
27149
+ * sidebar rail, narrower stat tiles).
27150
+ */
27151
+ function useIsMidWidth() {
27152
+ return useSyncExternalStore(subscribeQuery(MID_QUERY), getSnapshot(MID_QUERY), getServerSnapshot);
27153
+ }
27154
+ //#endregion
27659
27155
  //#region src/primitives/bottom-sheet.tsx
27660
27156
  function BottomSheet({ open, onClose, title, children, className }) {
27661
27157
  useEffect(() => {
@@ -31090,6 +30586,426 @@ function CopyButton({ value, label, srLabel, className, disabled }) {
31090
30586
  });
31091
30587
  }
31092
30588
  //#endregion
30589
+ //#region src/composites/data-table-layout.ts
30590
+ /**
30591
+ * At this many columns and above, `auto` switches a narrow viewport to cards.
30592
+ * Three columns still fit a phone at a readable size; four do not.
30593
+ */
30594
+ var CARD_MODE_MIN_COLUMNS = 4;
30595
+ function resolveTableLayout({ mode, columnCount, isNarrow }) {
30596
+ if (!isNarrow) return "table";
30597
+ if (mode === "scroll") return "table";
30598
+ if (mode === "cards") return "cards";
30599
+ if (columnCount === 0) return "table";
30600
+ return columnCount >= 4 ? "cards" : "table";
30601
+ }
30602
+ //#endregion
30603
+ //#region src/lib/responsive.ts
30604
+ /**
30605
+ * Responsive design tokens — three-tier system.
30606
+ *
30607
+ * The admin-ui targets three width tiers; every component should pick
30608
+ * the right token from this file instead of hand-coding breakpoints.
30609
+ * Adopting the tokens uniformly is what makes the app feel consistent
30610
+ * across operator devices (mobile / tablet / desktop) and what unlocks
30611
+ * targeted tuning (e.g. shrink every label by 1px in one place).
30612
+ *
30613
+ * Tier definitions (Tailwind breakpoints):
30614
+ *
30615
+ * • **L1 — Compact** (`< 640px`, default = mobile portrait)
30616
+ * Single column, tight padding, smallest text, icon-only buttons
30617
+ * where labels can be inferred. The operator can still see every
30618
+ * stat / action — no horizontal scroll, no clipped text. The user
30619
+ * directive: "molta informazione in poco spazio quando la width è
30620
+ * bassa."
30621
+ *
30622
+ * • **L2 — Standard** (`sm` — `640–1023px`, tablet + small laptop)
30623
+ * 2-column grids, side panels become visible, button labels return.
30624
+ * Targets ~768px–1024px viewports — the most common operator sizes.
30625
+ *
30626
+ * • **L3 — Spacious** (`lg+` — `≥ 1024px`, desktop)
30627
+ * 4-column grids, generous padding, full-width header text,
30628
+ * side-by-side composite layouts. The operator has elbow room.
30629
+ *
30630
+ * Conventions:
30631
+ * - **Always start from L1** — the bare class is always the compact
30632
+ * variant, then `sm:` adds room at 640px, `lg:` at 1024px. No
30633
+ * desktop-first breakpoints; no max-width queries.
30634
+ * - **Token strings are static** — kept as `as const` so callers can
30635
+ * compose them via `cn()` / template literals without running a
30636
+ * class generator at runtime.
30637
+ * - **Pair the token with a comment** — the comment in the file
30638
+ * names every breakpoint it crosses, so a reader can predict the
30639
+ * layout without going to Tailwind docs.
30640
+ */
30641
+ /** Container padding for a card-style section (header + body). */
30642
+ var SECTION_CARD = "rounded-lg border border-border bg-surface overflow-hidden";
30643
+ /** Header strip inside a card (between border-b lines). */
30644
+ var SECTION_HEADER = "border-b border-border px-3 sm:px-4 py-1.5 sm:py-2";
30645
+ /** Body padding for a card-style section. */
30646
+ var SECTION_BODY = "p-2 sm:p-3 lg:p-4";
30647
+ /** Gap between cards in a vertical stack. */
30648
+ var STACK_GAP = "space-y-3 sm:space-y-4";
30649
+ /** Gap between cards in a grid (4 cells / row at lg). */
30650
+ var GRID_GAP = "gap-2 sm:gap-3";
30651
+ /** Row padding inside a divided list (e.g. InfoRow). */
30652
+ var LIST_ROW = "px-3 sm:px-4 py-1.5 sm:py-2";
30653
+ /** 1-up at L1, 2-up at L2, 4-up at L3 — quick-stat row. */
30654
+ var GRID_QUICK_STATS = "grid grid-cols-2 sm:grid-cols-2 lg:grid-cols-4";
30655
+ /** 1-up at L1, 2-up at L2+ — paired panels (motion + detection rules). */
30656
+ var GRID_PAIRED = "grid grid-cols-1 lg:grid-cols-2";
30657
+ /** Side-by-side layout that stacks below md (canvas + side panel). */
30658
+ var SPLIT_PANEL_OUTER = "flex flex-col-reverse md:flex-row";
30659
+ /** Sidebar narrow lane in a SPLIT_PANEL_OUTER layout. */
30660
+ var SPLIT_PANEL_SIDE = "w-full md:w-44 lg:w-52 md:flex-shrink-0 border-b md:border-b-0 md:border-l border-border";
30661
+ /**
30662
+ * The tier boundary at which a settings label/value row stops stacking.
30663
+ *
30664
+ * Below it (L1 — compact) the row is ONE column: label on its own line, value
30665
+ * on the next at full width. Above it the row is label-left / value-right as
30666
+ * before. The two-column form needs `SETTING_ROW_LABEL`'s lane plus a readable
30667
+ * value beside it; a phone has neither, and the failure mode is not "cramped"
30668
+ * but "the value is the part that gets cut" — the one thing the operator
30669
+ * opened the page to read.
30670
+ */
30671
+ var SETTING_ROW_STACK_BREAKPOINT = "sm";
30672
+ /** Outer row: single column at L1, label/value columns from `sm` up. */
30673
+ var SETTING_ROW = "flex min-w-0 flex-col gap-0.5 py-1.5 sm:flex-row sm:items-center";
30674
+ /** Label lane. Full width (and free to wrap) at L1; a fixed lane from `sm` up. */
30675
+ var SETTING_ROW_LABEL = "min-w-0 text-[11px] leading-tight text-foreground-subtle sm:w-32 sm:shrink-0 sm:pr-2";
30676
+ /**
30677
+ * Value lane — the value text plus its trailing affordances (copy / reveal).
30678
+ * `w-full` at L1 so the value owns the whole row once the label is above it;
30679
+ * `sm:flex-1` makes it share the row again from `sm` up.
30680
+ */
30681
+ var SETTING_ROW_VALUE = "flex w-full min-w-0 items-center gap-1 sm:flex-1";
30682
+ /**
30683
+ * The value text itself. `break-all` lets an opaque token (a key, a URL) wrap
30684
+ * at L1 instead of being cut mid-word; `sm:truncate` restores the single-line
30685
+ * desktop form, where the row is wide enough for truncation to be a choice
30686
+ * rather than data loss.
30687
+ */
30688
+ var SETTING_ROW_VALUE_TEXT = "min-w-0 break-all text-xs text-foreground sm:truncate";
30689
+ /** Section header label (uppercase tracking-wider). */
30690
+ var TEXT_SECTION_LABEL = "text-[10px] sm:text-[11px] font-semibold text-foreground uppercase tracking-wider";
30691
+ /** Field label inside a row. */
30692
+ var TEXT_FIELD_LABEL = "text-[11px] sm:text-xs text-foreground";
30693
+ /** Sub-label / hint text. */
30694
+ var TEXT_HINT = "text-[10px] text-foreground-subtle";
30695
+ /** Primary value (a metric, badge, …). */
30696
+ var TEXT_VALUE = "text-[11px] sm:text-xs font-medium text-foreground";
30697
+ /** Big metric value (StatCard). */
30698
+ var TEXT_METRIC = "text-base sm:text-lg font-semibold leading-tight text-foreground";
30699
+ /** Default compact button. */
30700
+ var BTN_COMPACT = "inline-flex items-center justify-center gap-1 rounded border border-border bg-surface px-1.5 py-0.5 sm:px-2 sm:py-1 text-[10px] sm:text-[11px] font-medium text-foreground hover:bg-surface-hover transition-colors disabled:opacity-40";
30701
+ /** Primary compact button. */
30702
+ var BTN_COMPACT_PRIMARY = "inline-flex items-center justify-center gap-1 rounded border border-primary/40 bg-primary/15 px-1.5 py-0.5 sm:px-2 sm:py-1 text-[10px] sm:text-[11px] font-medium text-primary hover:bg-primary/25 transition-colors disabled:opacity-40";
30703
+ /** Danger compact button. */
30704
+ var BTN_COMPACT_DANGER = "inline-flex items-center justify-center gap-1 rounded border border-danger/40 bg-danger/10 px-1.5 py-0.5 sm:px-2 sm:py-1 text-[10px] sm:text-[11px] font-medium text-danger hover:bg-danger/20 transition-colors disabled:opacity-40";
30705
+ /** Warning compact button (e.g. cancel-drawing). */
30706
+ var BTN_COMPACT_WARNING = "inline-flex items-center justify-center gap-1 rounded border border-warning/40 bg-warning/10 px-1.5 py-0.5 sm:px-2 sm:py-1 text-[10px] sm:text-[11px] font-medium text-warning hover:bg-warning/20 transition-colors disabled:opacity-40";
30707
+ /** Compact text/select/number input. */
30708
+ var INPUT_COMPACT = "w-full rounded border border-border bg-background px-1.5 py-0.5 sm:px-2 sm:py-1 text-[11px] sm:text-xs text-foreground focus:border-primary focus:ring-1 focus:ring-primary/30 outline-none";
30709
+ /** Chip-style toggle (zone / class selectors in ZoneRulesEditor). */
30710
+ var CHIP_BASE = "inline-flex items-center gap-1 rounded-full border px-1.5 py-0.5 text-[10px] font-medium transition-colors";
30711
+ var CHIP_ACTIVE = "border-primary/50 bg-primary/15 text-primary";
30712
+ var CHIP_INACTIVE = "border-border bg-surface text-foreground-subtle hover:bg-surface-hover";
30713
+ //#endregion
30714
+ //#region src/composites/setting-row.tsx
30715
+ function SettingRow({ label, children, actions, elements = "plain", className, valueClassName }) {
30716
+ const LabelTag = elements === "description" ? "dt" : "span";
30717
+ const ValueTag = elements === "description" ? "dd" : "div";
30718
+ return /* @__PURE__ */ jsxs("div", {
30719
+ "data-setting-row": "",
30720
+ className: cn(SETTING_ROW, className),
30721
+ children: [/* @__PURE__ */ jsx(LabelTag, {
30722
+ "data-setting-row-label": "",
30723
+ className: SETTING_ROW_LABEL,
30724
+ children: label
30725
+ }), /* @__PURE__ */ jsxs(ValueTag, {
30726
+ "data-setting-row-value": "",
30727
+ className: SETTING_ROW_VALUE,
30728
+ children: [/* @__PURE__ */ jsx("span", {
30729
+ "data-setting-row-value-text": "",
30730
+ className: cn(SETTING_ROW_VALUE_TEXT, valueClassName),
30731
+ children
30732
+ }), actions !== void 0 && /* @__PURE__ */ jsx("span", {
30733
+ className: "flex shrink-0 items-center gap-0.5",
30734
+ children: actions
30735
+ })]
30736
+ })]
30737
+ });
30738
+ }
30739
+ //#endregion
30740
+ //#region src/composites/sort-header-button.tsx
30741
+ function SortHeaderButton({ label, active, dir, onSort }) {
30742
+ return /* @__PURE__ */ jsxs("button", {
30743
+ type: "button",
30744
+ onClick: onSort,
30745
+ className: "group/sort inline-flex items-center gap-0.5 hover:text-foreground transition-colors",
30746
+ children: [/* @__PURE__ */ jsx("span", { children: label }), active ? dir === "asc" ? /* @__PURE__ */ jsx(ChevronUp, { className: "h-3 w-3 flex-shrink-0" }) : /* @__PURE__ */ jsx(ChevronDown, { className: "h-3 w-3 flex-shrink-0" }) : /* @__PURE__ */ jsx(ChevronUp, { className: cn("h-3 w-3 flex-shrink-0 opacity-0 transition-opacity", "group-hover/sort:opacity-30") })]
30747
+ });
30748
+ }
30749
+ //#endregion
30750
+ //#region src/composites/table-sort.ts
30751
+ /**
30752
+ * The toggle rule, and the only copy of it.
30753
+ *
30754
+ * none → asc → desc → none, and a click on a DIFFERENT column starts that
30755
+ * column fresh at `asc`. `sameColumn` says whether the clicked column is the
30756
+ * one currently sorted; `currentDir` is its direction (`null` when nothing is
30757
+ * sorted). Returns the next direction, or `null` for "unsorted".
30758
+ *
30759
+ * Split out from {@link nextTableSort} so the device list — whose sort state
30760
+ * keys columns by `columnId`, not `columnKey` — can reuse the rule without a
30761
+ * cast and without a second copy of it.
30762
+ */
30763
+ function nextSortDirection(sameColumn, currentDir) {
30764
+ if (!sameColumn || currentDir === null) return "asc";
30765
+ return currentDir === "asc" ? "desc" : null;
30766
+ }
30767
+ /**
30768
+ * Toggle a column's sort on header click: none → asc → desc → none.
30769
+ * Clicking a DIFFERENT column starts it fresh at `asc`.
30770
+ */
30771
+ function nextTableSort(current, columnKey) {
30772
+ const dir = nextSortDirection(current !== null && current.columnKey === columnKey, current === null ? null : current.dir);
30773
+ return dir === null ? null : {
30774
+ columnKey,
30775
+ dir
30776
+ };
30777
+ }
30778
+ /**
30779
+ * Ascending comparison of two cell values.
30780
+ *
30781
+ * Numbers compare numerically and strings compare with `localeCompare` — a
30782
+ * numeric column must never be ordered as text ("100" before "9"), and a text
30783
+ * column must respect the locale's collation. A mixed column (one row a
30784
+ * number, another a string) falls back to string comparison of both, which is
30785
+ * the only total order available; it is not a shape any caller should build on
30786
+ * purpose.
30787
+ *
30788
+ * `null` is NOT handled here — {@link sortRowsByColumn} pulls it out first,
30789
+ * because its placement is direction-independent and a comparator that is
30790
+ * multiplied by the direction factor cannot express that.
30791
+ */
30792
+ function compareValues(a, b) {
30793
+ if (typeof a === "number" && typeof b === "number") return a - b;
30794
+ return String(a).localeCompare(String(b));
30795
+ }
30796
+ /**
30797
+ * Return a NEW array of `rows` ordered by `sort`.
30798
+ *
30799
+ * `valueOf` is the column's `sortValue` — it is called once per row per
30800
+ * comparison, so it must be cheap (read a field, do not format a string).
30801
+ * `sort === null` ⇒ a fresh shallow copy in the incoming order.
30802
+ */
30803
+ function sortRowsByColumn(rows, sort, valueOf) {
30804
+ if (sort === null) return [...rows];
30805
+ const factor = sort.dir === "asc" ? 1 : -1;
30806
+ return rows.toSorted((a, b) => {
30807
+ const av = valueOf(a);
30808
+ const bv = valueOf(b);
30809
+ if (av === null || bv === null) {
30810
+ if (av === bv) return 0;
30811
+ return av === null ? 1 : -1;
30812
+ }
30813
+ return factor * compareValues(av, bv);
30814
+ });
30815
+ }
30816
+ /** Derive the `<th>` `aria-sort` for `columnKey` from the table's sort state. */
30817
+ function ariaSortForColumn(sort, columnKey) {
30818
+ if (sort === null || sort.columnKey !== columnKey) return "none";
30819
+ return sort.dir === "asc" ? "ascending" : "descending";
30820
+ }
30821
+ //#endregion
30822
+ //#region src/composites/data-table.tsx
30823
+ /**
30824
+ * DataTable — shared responsive table for admin pages.
30825
+ *
30826
+ * Recipes baked in:
30827
+ * - `overflow-x-auto` wrapper so narrow viewports don't clip the
30828
+ * right edge (the rounded border survives the scroll).
30829
+ * - `min-w-[Npx]` on the inner table so columns don't squash below
30830
+ * readable width before the scroll kicks in.
30831
+ * - `whitespace-nowrap` on headers — column titles never wrap to
30832
+ * two lines (`AUTO-KILL` was the regression that triggered this).
30833
+ * - Themed `bg-surface` + `border-border` so contrast works in both
30834
+ * light and dark themes.
30835
+ *
30836
+ * Column model: caller supplies `columns: DataColumn<T>[]` and
30837
+ * `rows: T[]`. Each column declares `header`, optional `align`,
30838
+ * optional `nowrap`, and a `render(row) => ReactNode` that produces
30839
+ * the cell content.
30840
+ *
30841
+ * <DataTable
30842
+ * columns={[
30843
+ * { key: 'username', header: 'Username', render: (u) => u.username },
30844
+ * { key: 'role', header: 'Role', render: (u) => <RoleBadge .../> },
30845
+ * { key: 'actions', header: '', align: 'right', render: (u) => <Actions .../> },
30846
+ * ]}
30847
+ * rows={users}
30848
+ * minWidthPx={560}
30849
+ * />
30850
+ *
30851
+ * If finer header markup is needed, pass `headerRender` instead of
30852
+ * `header` (e.g. for a sortable click affordance).
30853
+ *
30854
+ * ── Narrow viewports ──────────────────────────────────────────────────────
30855
+ * The table stays a table. The wrapper is `overflow-x-auto`, so a phone
30856
+ * scrolls the columns sideways INSIDE the table — the page body never moves
30857
+ * sideways, and the cells stay one line (`whitespace-nowrap`). That is the
30858
+ * default (`mobileMode="scroll"`). Cards are opt-in via `mobileMode="cards"`;
30859
+ * `auto` still applies the old column-count rule for a surface that wants it.
30860
+ * See `resolveTableLayout`.
30861
+ *
30862
+ * ── Scrolling the BODY, not the page ──────────────────────────────────────
30863
+ * `maxBodyHeight` caps the table and scrolls its rows INSIDE the container
30864
+ * with the column header pinned. It is ONE prop, not two, because "this list
30865
+ * scrolls internally" and "its header stays visible" are the same decision: a
30866
+ * capped table whose header scrolls away is a list of unlabelled cells.
30867
+ *
30868
+ * Use it wherever the row count is open-ended (rules, targets, delivery
30869
+ * history) so the page keeps its own header, filters and actions in view while
30870
+ * the operator moves through the rows.
30871
+ */
30872
+ /**
30873
+ * The default cap for an internally-scrolling table.
30874
+ *
30875
+ * `60vh` leaves the page header, its filters and its actions on screen at
30876
+ * every viewport while still showing ~10 rows — and it is a fraction, so it
30877
+ * does not need a breakpoint of its own.
30878
+ */
30879
+ var TABLE_SCROLL_MAX_H = "max-h-[60vh]";
30880
+ var ALIGN_CLASS = {
30881
+ left: "text-left",
30882
+ right: "text-right",
30883
+ center: "text-center"
30884
+ };
30885
+ function DataTable({ columns, rows, rowKey, onRowClick, minWidthPx = 480, emptyMessage, className, bordered = true, rowClassName, mobileMode = "scroll", maxBodyHeight, defaultSort }) {
30886
+ const isNarrow = useIsMobile();
30887
+ const [sort, setSort] = useState(defaultSort ?? null);
30888
+ const layout = resolveTableLayout({
30889
+ mode: mobileMode,
30890
+ columnCount: columns.length,
30891
+ isNarrow
30892
+ });
30893
+ const scrolls = maxBodyHeight !== void 0;
30894
+ const sortedColumn = useMemo(() => sort === null ? void 0 : columns.find((col) => col.key === sort.columnKey && col.sortValue !== void 0), [columns, sort]);
30895
+ const sortValue = sortedColumn?.sortValue;
30896
+ const displayRows = useMemo(() => sortValue === void 0 ? rows : sortRowsByColumn(rows, sort, sortValue), [
30897
+ rows,
30898
+ sort,
30899
+ sortValue
30900
+ ]);
30901
+ const activeSort = sortedColumn === void 0 ? null : sort;
30902
+ if (rows.length === 0 && emptyMessage) return /* @__PURE__ */ jsx("div", {
30903
+ className: `rounded-lg ${bordered ? "border border-border" : ""} bg-surface px-3 py-4 text-xs text-foreground-subtle text-center ${className ?? ""}`,
30904
+ children: emptyMessage
30905
+ });
30906
+ if (rows.length === 0) return null;
30907
+ if (layout === "cards") return /* @__PURE__ */ jsx("div", {
30908
+ className: `space-y-2 ${scrolls ? `${maxBodyHeight} overflow-y-auto` : ""} ${className ?? ""}`,
30909
+ children: displayRows.map((row, rowIndex) => /* @__PURE__ */ jsx(DataTableCard, {
30910
+ row,
30911
+ rowIndex,
30912
+ columns,
30913
+ bordered,
30914
+ onRowClick,
30915
+ rowClassName
30916
+ }, rowKey ? rowKey(row, rowIndex) : rowIndex))
30917
+ });
30918
+ return /* @__PURE__ */ jsx("div", {
30919
+ className: [
30920
+ "rounded-lg",
30921
+ bordered ? "border border-border" : "",
30922
+ "bg-surface overflow-x-auto",
30923
+ scrolls ? `${maxBodyHeight} overflow-y-auto` : "",
30924
+ className ?? ""
30925
+ ].filter(Boolean).join(" "),
30926
+ children: /* @__PURE__ */ jsxs("table", {
30927
+ className: `w-full text-xs ${scrolls ? "border-separate border-spacing-0" : ""}`,
30928
+ style: { minWidth: `${minWidthPx}px` },
30929
+ children: [/* @__PURE__ */ jsx("thead", {
30930
+ className: "bg-surface",
30931
+ children: /* @__PURE__ */ jsx("tr", { children: columns.map((col) => {
30932
+ const align = col.align ?? "left";
30933
+ const nowrap = col.nowrap ?? true;
30934
+ const sortable = col.sortValue !== void 0;
30935
+ const isSorted = activeSort !== null && activeSort.columnKey === col.key;
30936
+ return /* @__PURE__ */ jsx("th", {
30937
+ "aria-sort": sortable ? ariaSortForColumn(activeSort, col.key) : void 0,
30938
+ title: sortable ? void 0 : col.notSortableReason,
30939
+ className: [
30940
+ "px-3 py-2 text-foreground-subtle font-medium bg-surface border-b border-border",
30941
+ scrolls ? "sticky top-0 z-10" : "",
30942
+ ALIGN_CLASS[align],
30943
+ nowrap ? "whitespace-nowrap" : "",
30944
+ col.width ?? ""
30945
+ ].filter(Boolean).join(" "),
30946
+ children: sortable ? /* @__PURE__ */ jsx(SortHeaderButton, {
30947
+ label: col.headerRender ? col.headerRender() : col.header,
30948
+ active: isSorted,
30949
+ dir: isSorted && activeSort !== null ? activeSort.dir : "asc",
30950
+ onSort: () => setSort((prev) => nextTableSort(prev, col.key))
30951
+ }) : col.headerRender ? col.headerRender() : col.header
30952
+ }, col.key);
30953
+ }) })
30954
+ }), /* @__PURE__ */ jsx("tbody", { children: displayRows.map((row, rowIndex) => {
30955
+ const key = rowKey ? rowKey(row, rowIndex) : rowIndex;
30956
+ const extra = rowClassName?.(row, rowIndex) ?? "";
30957
+ const interactive = onRowClick !== void 0;
30958
+ return /* @__PURE__ */ jsx("tr", {
30959
+ onClick: interactive ? () => onRowClick(row, rowIndex) : void 0,
30960
+ className: [interactive ? "cursor-pointer hover:bg-primary/5" : "hover:bg-primary/5", extra].filter(Boolean).join(" "),
30961
+ children: columns.map((col) => {
30962
+ const align = col.align ?? "left";
30963
+ const nowrap = col.nowrap ?? true;
30964
+ return /* @__PURE__ */ jsx("td", {
30965
+ className: [
30966
+ "px-3 py-2 text-foreground border-b border-border",
30967
+ ALIGN_CLASS[align],
30968
+ nowrap ? "whitespace-nowrap" : ""
30969
+ ].filter(Boolean).join(" "),
30970
+ children: col.render(row, rowIndex)
30971
+ }, col.key);
30972
+ })
30973
+ }, key);
30974
+ }) })]
30975
+ })
30976
+ });
30977
+ }
30978
+ /**
30979
+ * One row as a card. Columns that carry a plain-text `header` become labelled
30980
+ * `SettingRow`s — the label is the column title and the value gets the full
30981
+ * card width. Columns with no text header (an actions column, a
30982
+ * `headerRender`-only column) have no label to show, so they render as a
30983
+ * full-width strip at the foot of the card.
30984
+ */
30985
+ function DataTableCard({ row, rowIndex, columns, bordered, onRowClick, rowClassName }) {
30986
+ const labelled = columns.filter((col) => col.header !== void 0 && col.header !== "");
30987
+ const unlabelled = columns.filter((col) => col.header === void 0 || col.header === "");
30988
+ const interactive = onRowClick !== void 0;
30989
+ const extra = rowClassName?.(row, rowIndex) ?? "";
30990
+ return /* @__PURE__ */ jsxs("div", {
30991
+ "data-data-table-card": "",
30992
+ onClick: interactive ? () => onRowClick(row, rowIndex) : void 0,
30993
+ className: [
30994
+ "rounded-lg bg-surface px-3 py-1.5 divide-y divide-border-subtle",
30995
+ bordered ? "border border-border" : "",
30996
+ interactive ? "cursor-pointer hover:bg-primary/5" : "",
30997
+ extra
30998
+ ].filter(Boolean).join(" "),
30999
+ children: [labelled.map((col) => /* @__PURE__ */ jsx(SettingRow, {
31000
+ label: col.header,
31001
+ children: col.render(row, rowIndex)
31002
+ }, col.key)), unlabelled.length > 0 && /* @__PURE__ */ jsx("div", {
31003
+ className: "flex flex-wrap items-center justify-end gap-2 py-1.5",
31004
+ children: unlabelled.map((col) => /* @__PURE__ */ jsx("div", { children: col.render(row, rowIndex) }, col.key))
31005
+ })]
31006
+ });
31007
+ }
31008
+ //#endregion
31093
31009
  //#region src/composites/detection-colors.ts
31094
31010
  /**
31095
31011
  * Detection class colors — a thin adapter over the SINGLE event-kind
@@ -53749,4 +53665,4 @@ var SceneMonitorEditor = lazy(() => import("./SceneMonitorEditor-BvDy3x3k.js").t
53749
53665
  /** Lazy-wrapped `PrivacyMaskSettings` — code-split off the main bundle. */
53750
53666
  var PrivacyMaskSettings = lazy(() => import("./PrivacyMaskSettings-PkYs077O.js").then((m) => ({ default: m.PrivacyMaskSettings })));
53751
53667
  //#endregion
53752
- export { AddonGlobalSettingsForm, AgentStepEditor, AlarmHeroCard, AlarmInlineControl as AlarmPanelInlineControl, AppShell, ArcKnob, AudioClassificationList, AudioLevelWaveform, AudioWaveform, AutomationHeroCard, AutomationInlineControl, AutotrackSection, BTN_COMPACT, BTN_COMPACT_DANGER, BTN_COMPACT_PRIMARY, BTN_COMPACT_WARNING, Badge, BatteryBadge, BottomSheet, Breadcrumb, BrightnessPanel, Button, ButtonControl, ButtonHeroCard, CARD_MODE_MIN_COLUMNS, CENTER, CHIP_ACTIVE, CHIP_BASE, CHIP_INACTIVE, CLASS_COLORS, COLUMN_BREAKPOINT_CLASS, COLUMN_PRIORITY, COMMIT_DEDUPE_TOLERANCE_MS, COMMIT_DEDUPE_WINDOW_MS, CONTROL_CAP_NAMES, CONTROL_FILLS, CameraStreamPlayer, Card, Checkbox, ChildSectionAccordion, ClimatePanel, CodeBlock, CollapsibleCard, ConfigFormBuilder, FormField as ConfigFormField, ConfigSchemaField, ConfirmActionButton, ConfirmDialogProvider, ConsumablesPanel, ContainerChildrenProvider, ContainerPrimaryHero, ControlColumn, ControlHeroCard, ControlInlineControl, ControlPanel, CopyButton, CoverHeroCard, CoverInlineControl, CoverPanel, CustomFieldRenderersProvider, DEFAULT_COLOR, DEVICE_COLUMNS, DEVICE_LIST_PAGE_SIZE_KEY, DEVICE_LIST_PAGE_SIZE_OPTIONS, DEVICE_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, DeviceSelectorPicker, DeviceStepMatrix, Dialog, DialogBody, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, DiscoveryPanel, DoorbellRecentPanel, Dropdown, DropdownContent, DropdownItem, DropdownTrigger, DummyHeroCard, DummyInline, EVENT_KIND_ICONS, EmptyState, ErrorBox, EventKindGlyph, EventStream, FILL, FLEET_LIST_GC_TIME_MS, FLEET_LIST_QUERY_KEY, FLEET_LIST_STALE_TIME_MS, FanHeroCard, FanInlineControl, FanPanel, FilterBar, FloatingEventStream, FloatingLogStream, FloatingPanel, FormField$1 as FormField, GRID_GAP, GRID_PAIRED, GRID_QUICK_STATS, GripTrack, GroupedModelSelector, HOST_WIDGETS, HlsVideo, HoverZoomImage, HumidifierHeroCard, HumidifierInlineControl, INPUT_COMPACT, 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, NAVIGATION_DRIVE_INTERVAL_MS, NavigationPanel, NetworkLinkBadge, NodeMultiSelectField, NodePicker, NodeSelectField, OfflineBadge, PHASE_CONFIG, PRIORITY, PTZOverlay, PageHeader, PhaseIcon, PipelineBuilder, PipelineRuntimeSelector, PipelineStep, PipelineTreeMatrix, PlayerOverlaysProvider, Popover, PopoverContent, PopoverRowAction, PopoverTrigger, PrimaryChildPicker, PrivacyMaskSettings, ProviderBadge, PtzPanel, QrCode, RECONNECT_POLICY, RECORDED_PLAYBACK_MODES, RIGHT, ROI_AREA_WARN_FRACTION, ROLE_DESCRIPTOR, RadialGauge, RecordedPlaybackProvider, RecordingPanel, ResponseLog, SCENE_CAPTURE_VARIANTS, SECTION_BODY, SECTION_CARD, SECTION_HEADER, SETTING_ROW, SETTING_ROW_LABEL, SETTING_ROW_STACK_BREAKPOINT, SETTING_ROW_VALUE, SETTING_ROW_VALUE_TEXT, SNAPSHOT_MEDIA_PATH, SPLIT_PANEL_OUTER, SPLIT_PANEL_SIDE, STACK_GAP, STATE_COLOR, SceneMonitorEditor, ScopePicker, ScriptHeroCard, ScriptInlineControl, ScrollArea, Select, SemanticBadge, SensorHeroCard, SensorInlineControl, SensorValueAtom, Separator, SettingRow, Sidebar, SidebarItem, Skeleton, SlideOverPanel, SlideToggle, SnapshotButton, SortHeaderButton, StatCard, StateValuesStream, StatusBadge, StepTimings, StepTreeMaster, Stepper, StreamBrokerSelector, StreamDebugOverlay, StreamPanel, Switch, SwitchHeroCard, SwitchInlineControl, SwitchPanel, SystemProvider, TABLE_SCROLL_MAX_H, TEXT_FIELD_LABEL, TEXT_HINT, TEXT_METRIC, TEXT_SECTION_LABEL, TEXT_VALUE, TIMEZONES, Tabs, TabsContent, TabsList, TabsTrigger, TapToggle, ThemeProvider, ThermostatHeroCard, ThermostatInlineControl, TimezoneSelector, Tooltip, TooltipContent, TooltipTrigger, VacuumHeroCard, VacuumInlineControl, ValueReadout, ValveHeroCard, ValveInlineControl, VersionBadge, VodPlaybackProvider, WaterHeaterHeroCard, WaterHeaterInlineControl, WeatherHeroCard, WeatherInlineControl, WidgetMetricCard, WidgetPanel, WidgetRegistryProvider, WidgetSlot, ZoneEditingProvider, ImageOff as a, agentColumnKey, allDeviceTypeFilterOptions, applyFleetQueryDefaults, ariaSortForColumn, badgeFor, buildStepTreeFromSchema, Camera as c, childEntityId, childListName, classifyCapability, cn, columnsForContext, containerChildToRef, countableDevices, coverHighlight, coverageLine, createSharedContext, createTheme, cursorFractionFor, darkColors, defaultTheme, deriveDeviceKind, deriveWebrtcDebugStats, describeDeviceSelector, deviceMatchesFilter, deviceOptionLabel, deviceRoleMeta, deviceRoleMetaOf, deviceTypeLabel, deviceTypeMeta, deviceTypeMetaOf, devicesToOptions, ensureMfHostInit, eventKindLabel, filterDeviceOptions, findTimezone, formatControlDateTime, formatLastSeen, formatNumeric, freezeVerdict, fuzzyMatch, getClassColor, getPhaseVisual, groupAgentColumns, groupChildrenByLayout, hardwareLabel, hubOrigin, hubPath, hubUrl, hubWsUrl, humanDuration, humidifierTint, Mic as i, initialScrubState, isAbsentProvider, isFieldVisible, createLucideIcon as l, lawnMowerActivityMeta, lightColors, loadRemoteBundle, makeScrubBridge, metadataEntries, metadataString, mirror, mountAddonPage, mountPath, Square as n, nextReconnectAction, nextSort, nextSortDirection, nextTableSort, normalizeForSearch, Grid2x2 as o, openTopLayer, overrideEntityIdFromLink, parseRecordedServerMessage, providerIcons, RotateCcw as r, resetHubMountForTests, resolveContainerPrimary, resolveControlAlign, resolveDeviceControl, resolveDisplayIcon, resolveEffectiveDefaultModel, resolveEffectiveStepModel, resolveEventKindIcon, resolvePrimaryChild, resolveSensorDisplay, resolveStepDefaultModel, resolveTableLayout, roiTooLarge, routerBasename, EyeOff as s, scrubReducer, selectedDeviceOptions, serializeRecordedCommand, shouldCommit, shouldEmit, shouldUseSingleNode, sortRows, sortRowsByColumn, statusIcons, statusLine, stepHasModelForFormat, stepModelOptions, stripParentNamePrefix, Trash2 as t, tabForSelector, tankAlert, themeToCss, toStationaryOverlayBox, trpc, useAccessoriesGetStatus, useAccessoriesSetChildHidden, useAddonPagesListPages, useAddonSettingsGetDeviceSettings, useAddonSettingsGetGlobalSettings, useAddonSettingsGetIntegrationSettings, useAddonSettingsUpdateDeviceSettings, useAddonSettingsUpdateGlobalSettings, useAddonWidgetsListWidgets, useAddonsApplyAutoUpdateToAll, useAddonsCancelJob, useAddonsCustom, useAddonsForceRefresh, useAddonsGetAddonAutoUpdate, useAddonsGetAutoUpdateSettings, useAddonsGetJob, useAddonsGetLastRestart, useAddonsGetLogs, useAddonsGetVersions, useAddonsInstallFromWorkspace, useAddonsInstallPackage, useAddonsIsWorkspaceAvailable, useAddonsList, useAddonsListCapabilityProviders, useAddonsListFrameworkPackages, useAddonsListJobs, useAddonsListPackages, useAddonsListUpdates, useAddonsListWorkspacePackages, useAddonsOnAddonLogs, useAddonsReloadPackages, useAddonsRestartAddon, useAddonsRestartServer, useAddonsRetryLoad, useAddonsRollbackPackage, useAddonsSearchAvailable, useAddonsSetAddonAutoUpdate, useAddonsSetAutoUpdateSettings, useAddonsSetCapabilityProviderEnabled, useAddonsStartJob, useAddonsUninstallPackage, useAddonsUpdatePackage, useAirQualitySensorGetStatus, useAlarmPanelArm, useAlarmPanelDisarm, useAlarmPanelGetStatus, useAlarmPanelTrigger, useAlert, useAlertsDismiss, useAlertsEmit, useAlertsGetUnreadCount, useAlertsList, useAlertsMarkAllRead, useAlertsMarkRead, useAlertsUpdate, useAllWidgets, useAmbientLightSensorGetStatus, useAudioAnalysisApplyDeviceSettingsPatch, useAudioAnalysisGetDeviceLiveContribution, useAudioAnalysisGetDeviceSettingsContribution, useAudioAnalysisResolveDeviceSettings, useAudioAnalyzerAnalyseChunk, useAudioAnalyzerAttachDevice, useAudioAnalyzerClassify, useAudioAnalyzerDetachDevice, useAudioAnalyzerDispose, useAudioAnalyzerIsReady, useAudioAnalyzerReprobeAudioEngine, useAudioCodecCanHandle, useAudioCodecCloseSession, useAudioCodecCreateDecodeSession, useAudioCodecCreateEncodeSession, useAudioCodecFlushEncode, useAudioCodecListActiveSessions, useAudioCodecListSupportedCodecs, useAudioCodecPullEncoded, useAudioCodecPullPcm, useAudioCodecPushEncodedFrame, useAudioCodecPushPcm, useAudioMetricsGetCurrentSnapshot, useAudioMetricsGetHistory, useAutomationControlDisable, useAutomationControlEnable, useAutomationControlGetStatus, useAutomationControlTrigger, useBackupCancel, useBackupDelete, useBackupDeleteSchedule, useBackupGetEntries, useBackupList, useBackupListArchives, useBackupListDestinations, useBackupListLocations, useBackupListRuns, useBackupListSchedules, useBackupPreviewSchedule, useBackupRestore, useBackupTrigger, useBackupUpsertDestinationPolicy, useBackupUpsertSchedule, useBatteryGetStatus, useBatteryWakeForStream, useBinaryGetStatus, useBrightnessGetStatus, useBrightnessSetBrightness, useBrokerAdd, useBrokerGet, useBrokerGetBrokerConfig, useBrokerGetSettings, useBrokerGetSettingsSchema, useBrokerGetState, useBrokerGetStatus, useBrokerList, useBrokerListProviders, useBrokerPublish, useBrokerRemove, useBrokerSetSettings, useBrokerSubscribe, useBrokerTestConnection, useBrokerTestSettings, useBrokerUnsubscribe, useButtonPress, useCameraCredentialsGetCredentials, useCameraCredentialsGetStatus, useCameraGridLayoutApplyDeviceSettingsPatch, useCameraGridLayoutGetDeviceLiveContribution, useCameraGridLayoutGetDeviceSettingsContribution, useCameraGridLayoutGetLayout, useCameraGridLayoutSaveLayout, useCameraPipelineConfigApplyDeviceSettingsPatch, useCameraPipelineConfigGetDeviceLiveContribution, useCameraPipelineConfigGetDeviceSettingsContribution, useCameraStreamsGetBrokerStreams, useCameraStreamsGetCameraStreams, useCameraStreamsGetProfileRtspEntries, useCameraStreamsGetRtspEntries, useCameraStreamsPickStream, useCapabilityPresence, useCarbonMonoxideGetStatus, useClimateControlGetStatus, useClimateControlSetFanMode, useClimateControlSetMode, useClimateControlSetPreset, useClimateControlSetSwingHorizontal, useClimateControlSetSwingVertical, useClimateControlSetTarget, useClimateControlSetTargetHumidity, useClimateControlSetTargetRange, useClusterNodes, useClusterTopology, useColorGetStatus, useColorSetColor, useConfirm, useConnectionTestDescribeTest, useConnectionTestTestSettings, useConnectivityGetStatus, useConsumablesGetStatus, useConsumablesReset, useContactGetStatus, useContainerChildren, useControlGetStatus, useControlSetValue, useCoreBlocksCompile, useCoreBlocksCreate, useCoreBlocksDelete, useCoreBlocksGet, useCoreBlocksGetTypeDefs, useCoreBlocksList, useCoreBlocksRestart, useCoreBlocksSetEnabled, useCoreBlocksUpdate, 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, useDeviceManagerAdoptionCancelJob, useDeviceManagerAdoptionListCandidateFilters, useDeviceManagerAdoptionListCandidates, useDeviceManagerAdoptionListJobs, useDeviceManagerAdoptionRefresh, useDeviceManagerAdoptionRelease, useDeviceManagerAdoptionResync, useDeviceManagerAdoptionStartJob, useDeviceManagerAllocateDeviceId, useDeviceManagerApplyDeviceSettingsPatch, useDeviceManagerApplyInitialMeta, useDeviceManagerCreateDevice, useDeviceManagerDisable, useDeviceManagerDiscoverAllProviders, useDeviceManagerDiscoverDevices, useDeviceManagerDiscoverProvider, useDeviceManagerDiscoveryProviders, useDeviceManagerEnable, useDeviceManagerGetAllBindings, useDeviceManagerGetBindings, useDeviceManagerGetBindingsBatch, useDeviceManagerGetChildren, useDeviceManagerGetChildrenBatch, useDeviceManagerGetConfigSchema, useDeviceManagerGetCreationSchema, useDeviceManagerGetDevice, useDeviceManagerGetDeviceAggregate, useDeviceManagerGetDeviceLiveContribution, useDeviceManagerGetDeviceLiveInfoAggregate, useDeviceManagerGetDeviceSettingsAggregate, useDeviceManagerGetDeviceSettingsContribution, useDeviceManagerGetDeviceStatusAggregate, useDeviceManagerGetDeviceStatusAggregateBatch, useDeviceManagerGetLinkedDevices, useDeviceManagerGetLinkedDevicesBatch, useDeviceManagerGetRoleDisplayDefaults, useDeviceManagerGetSettingsSchema, useDeviceManagerGetStreamProfileMap, useDeviceManagerGetStreamSources, useDeviceManagerGetWireableFields, useDeviceManagerListAll, useDeviceManagerListBindableCapsForDeviceType, useDeviceManagerListLocationDescriptions, useDeviceManagerListLocationIcons, useDeviceManagerListLocations, useDeviceManagerListPersistedByAddon, useDeviceManagerListSiteZones, useDeviceManagerListWrappersForCap, useDeviceManagerLoadConfig, useDeviceManagerLoadMeta, useDeviceManagerLoadRuntimeState, useDeviceManagerMigrateDevice, useDeviceManagerPersistConfig, useDeviceManagerProbeStreams, useDeviceManagerProviderCreationType, useDeviceManagerProviderDiscoveryParamsSchema, useDeviceManagerRegisterDevice, useDeviceManagerRemove, useDeviceManagerRemoveByIntegration, useDeviceManagerRemoveDevice, useDeviceManagerRemoveLocation, useDeviceManagerRemoveSiteZone, useDeviceManagerRenameLocation, useDeviceManagerRenameSiteZone, useDeviceManagerRunDeviceAction, useDeviceManagerSetChildLayout, useDeviceManagerSetDisabled, useDeviceManagerSetDisplay, useDeviceManagerSetIntegrationId, useDeviceManagerSetLinkDeviceId, useDeviceManagerSetLocation, useDeviceManagerSetLocationDescription, useDeviceManagerSetLocationIcon, useDeviceManagerSetLocationZone, useDeviceManagerSetMetadata, useDeviceManagerSetName, useDeviceManagerSetPrimaryChildEntityId, useDeviceManagerSetRole, useDeviceManagerSetRoleDisplayDefaults, useDeviceManagerSetSiteZone, useDeviceManagerSetStreamProfileMap, useDeviceManagerSetType, useDeviceManagerSetWrapperActive, useDeviceManagerTestCreationField, useDeviceManagerTestField, useDeviceManagerUpdateConfig, useDeviceManagerUpdateDeviceField, useDeviceManagerUpdateDeviceFieldsBatch, useDeviceNetworkLink, useDeviceOpsGetConfigEntries, useDeviceOpsGetRawState, useDeviceOpsGetSettingsSchema, useDeviceOpsGetStreamSources, useDeviceOpsRemoveDevice, useDeviceOpsRunAction, useDeviceOpsSetConfig, useDeviceProviderAdoptDiscoveredDevice, useDeviceProviderCreateDevice, useDeviceProviderDiscoverDevices, useDeviceProviderGetChildCreationSchema, useDeviceProviderGetDevices, useDeviceProviderGetDiscoveryParamsSchema, useDeviceProviderGetManualCreationType, useDeviceProviderGetStatus, useDeviceProviderReloadDevice, useDeviceProviderStart, useDeviceProviderStop, useDeviceProviderSupportsDiscovery, useDeviceProviderSupportsManualCreation, useDeviceProviderTestCreationField, useDeviceProxy, useDeviceSnapshot, useDeviceSnapshotImage, useDeviceState, useDeviceStateGetAllSnapshots, useDeviceStateGetCapSlice, useDeviceStateGetSnapshot, useDeviceStateSetCapSlice, useDeviceStateSlice, useDeviceStatusGetStatus, useDeviceWebrtc, useDevices, useDoorbellApplyDeviceSettingsPatch, useDoorbellEvents, useDoorbellGetDeviceLiveContribution, useDoorbellGetDeviceSettingsContribution, useDoorbellGetStatus, useEnumSensorGetStatus, useEventEmitterGetStatus, useEventInvalidation, useEventStreamLatest, useEventStreamMap, useEventsGetEventClipUrl, useEventsGetEventThumbnail, useEventsGetEvents, useFaceGalleryAssignFace, useFaceGalleryAssignFaces, useFaceGalleryAuditIdentitySamples, useFaceGalleryCreateIdentity, useFaceGalleryDeleteFace, useFaceGalleryDeleteIdentity, useFaceGalleryGetFaceByTrack, useFaceGalleryGetFaceMedia, useFaceGalleryListIdentities, useFaceGalleryListIdentitySamples, useFaceGalleryListRecentFaces, useFaceGalleryRemoveSample, useFaceGalleryRenameIdentity, useFaceGallerySuggestFaceClusters, useFaceGalleryUnassignFace, useFaceGalleryUnassignFaces, useFanControlGetStatus, useFanControlSetDirection, useFanControlSetOscillating, useFanControlSetPercentage, useFanControlSetPreset, useFeatureProbeGetStatus, useFloodGetStatus, useGasGetStatus, useHumidifierGetStatus, useHumidifierSetMode, useHumidifierSetOn, useHumidifierSetTargetHumidity, useHumiditySensorGetStatus, useImageGetStatus, useImageSettingsGetOptions, useImageSettingsGetStatus, useImageSettingsSetSettings, useIntegrationsCreate, useIntegrationsDelete, useIntegrationsGet, useIntegrationsGetAvailableTypes, useIntegrationsGetByAddonId, useIntegrationsGetSettings, useIntegrationsList, useIntegrationsSetSettings, useIntegrationsTestConnection, useIntegrationsUpdate, useIntercomEndTalkSession, useIntercomGetStatus, useIntercomHandleAnswer, useIntercomPushTalkAudio, useIntercomStartSession, useIntercomStartTalkSession, useIntercomStopSession, useIsMidWidth, useIsMobile, useLawnMowerControlDock, useLawnMowerControlGetStatus, useLawnMowerControlPause, useLawnMowerControlStartMowing, useLiveBuffer, useLiveEvent, useLlmCancel, useLlmDeleteModel, useLlmDeleteProfile, useLlmGenerate, useLlmGenerateVision, useLlmGetDefaults, useLlmGetRuntimeStatus, useLlmGetUsage, useLlmInstallModel, useLlmListModelCatalog, useLlmListModels, useLlmListNodeModels, useLlmListProfileKinds, useLlmListProfiles, useLlmListRuntimeNodes, useLlmResolveModelRef, useLlmSetDefault, useLlmStartRuntime, useLlmStopRuntime, useLlmTestProfile, useLlmUpsertProfile, useLocalNetworkDownloadCa, useLocalNetworkGetAllowedAddresses, useLocalNetworkGetConnectionEndpoints, useLocalNetworkGetNotificationEndpoint, useLocalNetworkGetPreferred, useLocalNetworkGetTlsStatus, useLocalNetworkGetViewerEndpoints, useLocalNetworkList, useLocalNetworkRegenerateCertificate, useLocalNetworkResetAllowlistToBestMatch, useLocalNetworkRevertToGeneratedCertificate, useLocalNetworkSetAllowedAddresses, useLocalNetworkSetNotificationEndpoint, useLocalNetworkSetViewerEndpoints, useLocalNetworkUploadCertificate, useLockControlGetStatus, useLockControlLock, useLockControlOpen, useLockControlUnlock, useMediaPlayerGetStatus, useMediaPlayerNext, useMediaPlayerPause, useMediaPlayerPlay, useMediaPlayerPlayMedia, useMediaPlayerPrevious, useMediaPlayerSeek, useMediaPlayerSelectSource, useMediaPlayerSetMute, useMediaPlayerSetRepeat, useMediaPlayerSetShuffle, useMediaPlayerSetVolume, useMediaPlayerStop, useMeshNetworkGetStatus, useMeshNetworkJoin, useMeshNetworkLeave, useMeshNetworkListPeers, useMeshNetworkLogout, useMeshNetworkStartLogin, useMeshNetworkTestConnection, useMetricsProviderCollectSnapshot, useMetricsProviderGetAddonStats, useMetricsProviderGetCached, useMetricsProviderGetCpuTemperature, useMetricsProviderGetCurrent, useMetricsProviderGetDiskSpace, useMetricsProviderGetGpuInfo, useMetricsProviderGetLoadSeries, useMetricsProviderGetProcessStats, useMetricsProviderListAddonInstances, useMetricsProviderListNodeProcesses, useMotionDetectionAnalyze, useMotionDetectionApplyDeviceSettingsPatch, useMotionDetectionGetDeviceLiveContribution, useMotionDetectionGetDeviceSettingsContribution, useMotionDetectionRemoveCamera, useMotionDetectionReset, useMotionGetStatus, useMotionIsDetected, useMotionTriggerGetStatus, useMotionTriggerSetMotionTrigger, useMotionZonesGetOptions, useMotionZonesGetStatus, useMotionZonesSetZone, useMqttBrokerAddBroker, useMqttBrokerGetBrokerConfig, useMqttBrokerGetStatus, useMqttBrokerListBrokers, useMqttBrokerRemoveBroker, useMqttBrokerStartEmbeddedBroker, useMqttBrokerStopEmbeddedBroker, useMqttBrokerTestConnection, useNativeObjectDetectionGetOptions, useNativeObjectDetectionGetStatus, useNativeObjectDetectionSetEnabled, useNativeObjectDetectionSetSettings, useNavigation, useNavigationGetFeatures, useNavigationGetStatus, useNavigationGoToPoint, useNavigationListActions, useNavigationMove, useNavigationPlaySound, useNavigationRunAction, useNavigationSetLightLevel, useNavigationSetLightMode, useNavigationSetLightOn, useNavigationStop, useNetworkAccessGetEndpoint, useNetworkAccessGetStatus, useNetworkAccessListEndpoints, useNetworkAccessStart, useNetworkAccessStop, useNetworkLinkGetStatus, useNetworkQualityGetAllStats, useNetworkQualityGetDeviceStats, useNetworkQualityReportClientStats, useNodesClusterAddonStatus, useNodesDeployAddon, useNodesExecuteQuery, useNodesGetCapUsageGraph, useNodesGetNodeAddons, useNodesRenameNode, useNodesRestartAddon, useNodesRestartNode, useNodesRestartProcess, useNodesSetProcessLogLevel, useNodesShutdownNode, useNodesTopology, useNodesUndeployAddon, useNotificationOutputDeleteTarget, useNotificationOutputDiscoverTargets, useNotificationOutputListTargetKinds, useNotificationOutputListTargets, useNotificationOutputSend, useNotificationOutputSetTargetEnabled, useNotificationOutputTestTarget, useNotificationOutputUpsertTarget, useNotificationRulesCancelSnooze, useNotificationRulesCreateRule, useNotificationRulesCreateSnooze, useNotificationRulesDeleteRule, useNotificationRulesGetAlarmConfig, useNotificationRulesGetClipRetentionAsks, useNotificationRulesGetConditionCatalog, useNotificationRulesGetHistory, useNotificationRulesGetRule, useNotificationRulesListDeviceMutes, useNotificationRulesListRules, useNotificationRulesListSnoozes, useNotificationRulesResolveArtifactUrl, useNotificationRulesSetAlarmConfig, useNotificationRulesSetDeviceMuted, useNotificationRulesSetRuleEnabled, useNotificationRulesTestRule, useNotificationRulesUpdateRule, useNotifierCancel, useNotifierGetStatus, useNotifierSend, useNumericSensorGetStatus, useOptimisticSlice, useOptionalSystem, useOptionalWidgetRegistry, useOsdGetStatus, useOsdManagerClearSlotBinding, useOsdManagerCopyDeviceConfiguration, useOsdManagerGetConditionSupport, useOsdManagerGetDeviceOsd, useOsdManagerGetSourceCatalog, useOsdManagerPreviewSlot, useOsdManagerRenderDevice, useOsdManagerSetSlotBinding, useOsdSetOverlay, usePTZ, usePetFeederCallPet, usePetFeederCancelFeed, usePetFeederFeed, usePetFeederGetStatus, usePetFeederMarkFoodReplenished, usePetFeederPlaySound, usePetFeederResetDesiccant, usePetFeederSetChildLock, usePetFeederSetFeedSound, usePetFeederSetIndicatorLight, usePetFeederSetVolume, usePipelineAnalyticsApplyDeviceSettingsPatch, usePipelineAnalyticsCancelRelocateMedia, usePipelineAnalyticsCancelStorageMigrationMove, usePipelineAnalyticsClearTracks, usePipelineAnalyticsCompleteRetrainTrack, usePipelineAnalyticsCountRelocatableMedia, usePipelineAnalyticsCountUnstampedEventMedia, usePipelineAnalyticsDeleteDeviceEvents, usePipelineAnalyticsDeleteTracks, usePipelineAnalyticsDeselectRetrainFrame, usePipelineAnalyticsGetActiveTracks, usePipelineAnalyticsGetAudioEvents, usePipelineAnalyticsGetDeviceLiveContribution, usePipelineAnalyticsGetDeviceSettingsContribution, usePipelineAnalyticsGetEventDensity, usePipelineAnalyticsGetEventDensityBatch, usePipelineAnalyticsGetEventMedia, usePipelineAnalyticsGetEventMediaFootprintByKind, usePipelineAnalyticsGetEventStoreFootprint, usePipelineAnalyticsGetKeyEvents, usePipelineAnalyticsGetKeyEventsBatch, usePipelineAnalyticsGetMediaReclaimStatus, usePipelineAnalyticsGetMotionEvents, usePipelineAnalyticsGetObjectEmbeddingRebuildStatus, usePipelineAnalyticsGetObjectEvents, usePipelineAnalyticsGetRetrainExportUrl, usePipelineAnalyticsGetRetrainFrameImage, usePipelineAnalyticsGetSensorEvents, usePipelineAnalyticsGetStorageMigrationMoveStatus, usePipelineAnalyticsGetSummary, usePipelineAnalyticsGetTrack, usePipelineAnalyticsGetTrackMedia, usePipelineAnalyticsGetTrainingExportSummary, usePipelineAnalyticsGetTrainingExportUrl, usePipelineAnalyticsListArchivedDebugNotes, usePipelineAnalyticsListBirthDecisions, usePipelineAnalyticsListEventKinds, usePipelineAnalyticsListEventKindsBatch, usePipelineAnalyticsListEventMedia, usePipelineAnalyticsListOpsLog, usePipelineAnalyticsListRecentSummaries, usePipelineAnalyticsListRecentTracks, usePipelineAnalyticsListRelocateMediaJobs, usePipelineAnalyticsListRetrainAnnotations, usePipelineAnalyticsListRetrainFrames, usePipelineAnalyticsListRetrainStaging, usePipelineAnalyticsListSummaries, usePipelineAnalyticsListTrackMedia, usePipelineAnalyticsListTracks, usePipelineAnalyticsOwnersWithMedia, usePipelineAnalyticsPauseForStorageMigration, usePipelineAnalyticsProposeRetrainAnnotations, usePipelineAnalyticsPruneEvents, usePipelineAnalyticsPruneEventsBefore, usePipelineAnalyticsPruneTracksBefore, usePipelineAnalyticsReadLongTermSeries, usePipelineAnalyticsRebuildObjectEmbeddings, usePipelineAnalyticsReclaimDebugMedia, usePipelineAnalyticsReconcileFromDisk, usePipelineAnalyticsRefreshStorageLocationsForMigration, usePipelineAnalyticsRelocateMedia, usePipelineAnalyticsRestageRetrainTrack, usePipelineAnalyticsResumeForStorageMigration, usePipelineAnalyticsRunReplayFrameProcessor, usePipelineAnalyticsSaveRetrainAnnotations, usePipelineAnalyticsSearchObjectEvents, usePipelineAnalyticsSelectRetrainFrames, usePipelineAnalyticsSetTrackFlags, usePipelineAnalyticsStartStorageMigrationMove, usePipelineAnalyticsWipeAllAnalytics, usePipelineAnalyticsWipeObjectEmbeddings, usePipelineExecutorCacheFrameInPool, usePipelineExecutorClearDeviceOverrides, usePipelineExecutorDeleteModel, usePipelineExecutorDeleteTemplate, usePipelineExecutorDownloadModel, usePipelineExecutorGetAddonModels, usePipelineExecutorGetAudioCapabilities, usePipelineExecutorGetAvailableEngines, usePipelineExecutorGetCapabilities, usePipelineExecutorGetDefaultSteps, usePipelineExecutorGetDetectionConfigSchema, usePipelineExecutorGetEffectiveTuning, usePipelineExecutorGetEngineProvisioning, usePipelineExecutorGetGlobalPipelineConfig, usePipelineExecutorGetGlobalSteps, usePipelineExecutorGetInferenceDeviceHealth, usePipelineExecutorGetOrchestratorConfigSchema, usePipelineExecutorGetReferenceAudio, usePipelineExecutorGetReferenceAudioFiles, usePipelineExecutorGetReferenceImage, usePipelineExecutorGetSchema, usePipelineExecutorGetSelectedEngine, usePipelineExecutorGetVideoPipelineSteps, usePipelineExecutorInferCached, usePipelineExecutorKillEngine, usePipelineExecutorListLoadedEngines, usePipelineExecutorListReferenceImages, usePipelineExecutorListTemplates, usePipelineExecutorRearmInferenceDevice, usePipelineExecutorRunAudioTest, usePipelineExecutorRunPipeline, usePipelineExecutorRunPipelineBatch, usePipelineExecutorSaveTemplate, usePipelineExecutorSetVideoPipelineSteps, usePipelineExecutorSpinEngine, usePipelineExecutorUncacheFrame, usePipelineExecutorUpdateTemplate, usePipelineExecutorValidatePipeline, usePipelineOrchestratorApplyDeviceSettingsPatch, usePipelineOrchestratorAssignAudio, usePipelineOrchestratorAssignPipeline, usePipelineOrchestratorDeleteTemplate, usePipelineOrchestratorGetAgentLoad, usePipelineOrchestratorGetAgentSettings, usePipelineOrchestratorGetAudioAssignment, usePipelineOrchestratorGetAudioAssignments, usePipelineOrchestratorGetAudioNodeLoad, usePipelineOrchestratorGetCameraMetrics, usePipelineOrchestratorGetCameraSettings, usePipelineOrchestratorGetCameraStatus, usePipelineOrchestratorGetCameraStatuses, usePipelineOrchestratorGetCameraStepOverrides, usePipelineOrchestratorGetCameraSwitches, usePipelineOrchestratorGetCapabilityBindings, usePipelineOrchestratorGetDeviceLiveContribution, usePipelineOrchestratorGetDeviceSettingsContribution, usePipelineOrchestratorGetGlobalMetrics, usePipelineOrchestratorGetIngestOwner, usePipelineOrchestratorGetNodeInferenceDevices, usePipelineOrchestratorGetPipelineAssignment, usePipelineOrchestratorGetPipelineAssignments, usePipelineOrchestratorGetPipelineDevicePin, usePipelineOrchestratorGetReconcileFromDiskStatus, usePipelineOrchestratorListAgentSettings, usePipelineOrchestratorListTemplates, usePipelineOrchestratorPauseForStorageMigration, usePipelineOrchestratorRebalance, usePipelineOrchestratorReconcileFromDisk, usePipelineOrchestratorRemoveAgentSettings, usePipelineOrchestratorResetNodePipelineDefaults, usePipelineOrchestratorResolvePipeline, usePipelineOrchestratorResumeForStorageMigration, usePipelineOrchestratorSaveTemplate, usePipelineOrchestratorSetAgentCapabilities, usePipelineOrchestratorSetAgentDecodeLimits, usePipelineOrchestratorSetAgentDetectWeight, usePipelineOrchestratorSetAgentInferenceDevices, usePipelineOrchestratorSetAgentMaxCameras, usePipelineOrchestratorSetAgentReachableHost, usePipelineOrchestratorSetCameraPipelineForAgent, usePipelineOrchestratorSetCameraStepOverride, usePipelineOrchestratorSetCameraStepToggle, usePipelineOrchestratorSetCameraSwitch, usePipelineOrchestratorSetCapabilityBinding, usePipelineOrchestratorSetPipelineDevicePin, usePipelineOrchestratorUnassignAudio, usePipelineOrchestratorUnassignPipeline, usePipelineOrchestratorUpdateTemplate, usePipelineRunnerAttachCamera, usePipelineRunnerDetachCamera, usePipelineRunnerGetAllCameraMetrics, usePipelineRunnerGetCameraMetrics, usePipelineRunnerGetLocalCameras, usePipelineRunnerGetLocalLoad, usePipelineRunnerGetLocalMetrics, usePipelineRunnerGetNativeCrop, usePipelineRunnerGetParkedTrackFrame, usePipelineRunnerParkTrackFrame, usePipelineRunnerReleaseParkedTrackFrames, usePipelineRunnerReportMotion, usePipelineRunnerRequestOccupancyBurst, usePipelineRunnerRunDetailSubtree, usePipelineRunnerRunStatelessStep, usePlateGalleryAssignPlate, usePlateGalleryAssignPlates, usePlateGalleryCorrectPlateText, usePlateGalleryCreateVehicle, usePlateGalleryDeletePlate, usePlateGalleryDeleteVehicle, usePlateGalleryGetPlateByTrack, usePlateGalleryGetPlateMedia, usePlateGalleryListPlates, usePlateGalleryListVehicleSamples, usePlateGalleryListVehicles, usePlateGalleryRemoveVehicleSample, usePlateGalleryRenameVehicle, usePlateGallerySearchPlates, usePlateGallerySuggestPlateClusters, usePlateGalleryUnassignPlate, usePlateGalleryUnassignPlates, usePlayerOverlayLayer, usePlayerOverlayLayers, usePlayerToolbarButton, usePlayerToolbarButtons, usePowerMeterGetStatus, usePresenceGetStatus, usePressureSensorGetStatus, usePrivacyMaskGetOptions, usePrivacyMaskGetStatus, usePrivacyMaskSetAudioEnabled, usePrivacyMaskSetMask, usePrompt, usePtzAutotrackGetSettings, usePtzAutotrackGetStatus, usePtzAutotrackSetEnabled, usePtzAutotrackSetSettings, usePtzCaptureHomeHere, usePtzContinuousMove, usePtzDeletePreset, usePtzGetHomePreset, usePtzGetHomeReturn, usePtzGetOptions, usePtzGetPosition, usePtzGetPresets, usePtzGetStatus, usePtzGoHome, usePtzGoToPreset, usePtzMove, usePtzSavePreset, usePtzSetAutofocus, usePtzSetHomePreset, usePtzSetHomeReturn, usePtzStop, useRebootReboot, useRecordedPlayback, useRecordingApplyDeviceSettingsPatch, useRecordingCancelRelocateJob, useRecordingCancelStorageMigrationMove, useRecordingDeleteFootprint, useRecordingExportCancelExport, useRecordingExportCreateExport, useRecordingExportDeleteExport, useRecordingExportGetDownloadUrl, useRecordingExportGetExport, useRecordingExportListExports, useRecordingExportReadExportBytes, useRecordingGetAvailability, useRecordingGetAvailabilityBatch, useRecordingGetDaysWithRecordings, useRecordingGetDaysWithRecordingsBatch, useRecordingGetDeviceConfig, useRecordingGetDeviceLiveContribution, useRecordingGetDeviceSettingsContribution, useRecordingGetPlacement, useRecordingGetPlaybackManifest, useRecordingGetRelocateResidue, useRecordingGetStatus, useRecordingGetStorageMigrationMoveStatus, useRecordingGetStorageUsage, useRecordingListOpsLog, useRecordingListRelocateJobs, useRecordingLocateSegment, useRecordingPauseForStorageMigration, useRecordingPlanStorageRebalance, useRecordingPruneFootage, useRecordingReadGopBytes, useRecordingReadSegmentBytes, useRecordingReadWindowBytes, useRecordingReconcileLedgerAgainstDisk, useRecordingRefreshStorageLocationsForMigration, useRecordingRelocateFootage, useRecordingRenderClip, useRecordingRenderGif, useRecordingRescanStorage, useRecordingResumeForStorageMigration, useRecordingSetDeviceConfig, useRecordingSetDevicePlacement, useRecordingSignalGetStatus, useRecordingStartStorageMigrationMove, useRecordingStartStorageRebalance, useRemoteComponent, useSceneMonitorCaptureReference, useSceneMonitorCreateScene, useSceneMonitorDeleteReference, useSceneMonitorDeleteScene, useSceneMonitorGetStatus, useSceneMonitorListScenes, useSceneMonitorListScenesBatch, useSceneMonitorRecheckNow, useSceneMonitorResetScene, useSceneMonitorUpdateScene, useScriptRunnerGetStatus, useScriptRunnerRun, useScriptRunnerStop, useScrubController, useServerManagementApplyServerUpdate, useServerManagementCheckServerUpdate, useServerManagementGetServerPackageStatus, useServerManagementRestartServer, useServerManagementRollbackServerUpdate, useSettingsStoreAggregate, useSettingsStoreCount, useSettingsStoreDeclareCollection, useSettingsStoreDelete, useSettingsStoreDeleteWhere, useSettingsStoreGet, useSettingsStoreHistogram, useSettingsStoreInsert, useSettingsStoreInsertMany, useSettingsStoreIsEmpty, useSettingsStoreQuery, useSettingsStoreSet, useSettingsStoreUpdate, useSettingsStoreUpdateWhere, useSettingsStoreUpsert, useSmokeGetStatus, useSnapshotApplyDeviceSettingsPatch, useSnapshotGetDebugState, useSnapshotGetDeviceLiveContribution, useSnapshotGetDeviceSettingsContribution, useSnapshotGetSnapshot, useSnapshotGetSnapshotLinks, useSnapshotGetSnapshotOverview, useSnapshotGetStatus, useSnapshotInvalidateCache, useStationaryOverlay, useStorageAbortUpload, useStorageBeginDownload, useStorageBeginUpload, useStorageDelete, useStorageDeleteLocation, useStorageEndDownload, useStorageExists, useStorageFinalizeUpload, useStorageGetAvailableSpace, useStorageList, useStorageListDrainProgress, useStorageListLocationDeclarations, useStorageListLocations, useStorageListProviders, useStorageMigrationCancel, useStorageMigrationCleanupCancel, useStorageMigrationCleanupStart, useStorageMigrationCleanupStatus, useStorageMigrationDrain, useStorageMigrationHistory, useStorageMigrationMovers, useStorageMigrationPlan, useStorageMigrationResidue, useStorageMigrationStart, useStorageMigrationStatus, useStorageRead, useStorageReadChunk, useStorageResolve, useStorageTestConfig, useStorageTestLocation, useStorageUpsertLocation, useStorageWrite, useStorageWriteChunk, useStreamBrokerAcquireEgressTranscode, useStreamBrokerApplyDeviceSettingsPatch, useStreamBrokerAssignProfile, useStreamBrokerFetchEventMedia, useStreamBrokerForgetDeviceHardware, useStreamBrokerGetAllRtspEntries, useStreamBrokerGetBrokerStats, useStreamBrokerGetDeviceAudioMute, useStreamBrokerGetDeviceLiveContribution, useStreamBrokerGetDeviceSettingsContribution, useStreamBrokerGetPreBufferInfo, useStreamBrokerGetRtspEntry, useStreamBrokerGetRtspPort, useStreamBrokerGetStreamUrl, useStreamBrokerGetStreamWithCodec, useStreamBrokerIsRtspEnabled, useStreamBrokerKillClient, useStreamBrokerListAllCameraStreams, useStreamBrokerListAllProfileSlots, useStreamBrokerListClients, useStreamBrokerProbeStream, useStreamBrokerProduceEventMedia, useStreamBrokerPublishCameraStream, useStreamBrokerPullAudioChunks, useStreamBrokerPullFrameHandles, useStreamBrokerRegenerateRtspToken, useStreamBrokerReleaseEgressTranscode, useStreamBrokerReleaseStreamWithCodec, useStreamBrokerRenderPreBufferClip, useStreamBrokerReportStreamSignal, useStreamBrokerRestartProfile, useStreamBrokerRetractCameraStream, useStreamBrokerSetDeviceAudioMute, useStreamBrokerSetPreBufferDuration, useStreamBrokerSetRtspEnabled, useStreamBrokerSubscribeAudioChunks, useStreamBrokerSubscribeFrames, useStreamBrokerUnassignProfile, useStreamBrokerUnsubscribeAudioChunks, useStreamBrokerUnsubscribeFrames, useStreamCatalogGetCatalog, useStreamParamsGetConfigSchema, useStreamParamsGetOptions, useStreamParamsGetStatus, useStreamParamsSetProfile, useStreamSignalsListSignals, useSwitchGetStatus, useSwitchSetState, useSystem, useSystemDetectSiteLocation, useSystemFeatureFlags, useSystemForceRetentionCleanup, useSystemGetFailureContributions, useSystemGetLoadContributions, useSystemGetLoggingSettings, useSystemGetRequestCensus, useSystemGetRetentionConfig, useSystemGetSiteLocation, useSystemHealth, useSystemInfo, useSystemMutation, useSystemNetworkAddresses, useSystemQuery, useSystemSetLoggingSettings, useSystemSetRetentionConfig, useSystemSetSiteLocation, useTamperGetStatus, useTemperatureSensorGetStatus, useTerminalSessionAdoptLegacyMonitor, useTerminalSessionClose, useTerminalSessionCreateInstance, useTerminalSessionDeleteInstance, useTerminalSessionListInstances, useTerminalSessionListLegacyCameras, useTerminalSessionListProfiles, useTerminalSessionListSessions, useTerminalSessionOpenSession, useTerminalSessionPullOutput, useTerminalSessionResize, useTerminalSessionSetInstanceEnabled, useTerminalSessionUpdateInstance, useTerminalSessionWriteInput, useThemeMode, useToastOnToast, useTurnProviderGetTurnServers, useUpdateGetStatus, useUpdateInstallUpdate, useUserManagementConfirmTotp, useUserManagementCreateApiKey, useUserManagementCreateScopedToken, useUserManagementCreateUser, useUserManagementDeleteUser, useUserManagementDisableTotp, useUserManagementGetTotpStatus, useUserManagementListApiKeys, useUserManagementListOauthSessions, useUserManagementListScopedTokens, useUserManagementListUsers, useUserManagementOauthExchangeCode, useUserManagementOauthIssueCode, useUserManagementOauthRefresh, useUserManagementOauthVerifyAccessToken, useUserManagementResetPassword, useUserManagementRevokeApiKey, useUserManagementRevokeOauthSession, useUserManagementRevokeScopedToken, useUserManagementSetUserScopes, useUserManagementSetupTotp, useUserManagementUpdateUser, useUserManagementValidateApiKey, useUserManagementValidateCredentials, useUserManagementValidateScopedToken, useUserManagementVerifyTotp, useVacuumControlGetStatus, useVacuumControlLocate, useVacuumControlPause, useVacuumControlReturnToBase, useVacuumControlSetFanSpeed, useVacuumControlStart, useVacuumControlStop, useValveClose, useValveGetStatus, useValveOpen, useValveSetPosition, useValveStop, useVibrationGetStatus, useVideoclipsGetClipPlayback, useVideoclipsListClips, useVideoclipsListSources, useVodPlayback, useWaterHeaterGetStatus, useWaterHeaterSetAway, useWaterHeaterSetOperationMode, useWaterHeaterSetTargetTemp, useWeatherGetStatus, useWebrtcSessionAddIceCandidate, useWebrtcSessionCloseSession, useWebrtcSessionCreateSession, useWebrtcSessionGetIceCandidates, useWebrtcSessionGetSessionDebug, useWebrtcSessionGetSessionState, useWebrtcSessionHandleAnswer, useWebrtcSessionHandleOffer, useWebrtcSessionHasAdaptiveBitrate, useWebrtcSessionListStreams, useWidget, useWidgetMetadata, useWidgetRegistry, useZoneAnalyticsGetCameraHistory, useZoneAnalyticsGetCurrentSnapshot, useZoneAnalyticsGetCurrentSnapshotBatch, useZoneAnalyticsGetUnzonedHistory, useZoneAnalyticsGetZoneHistory, useZoneEditing, useZoneRulesListRules, useZoneRulesSetRules, useZonesAddZone, useZonesListZones, useZonesRemoveZone, useZonesUpdateZone, vacuumStateMeta, validateScopes, valveStateMeta, variantLabel, waterHeaterPhase, waterHeaterTint, weatherConditionMeta, weatherTint };
53668
+ export { AddonGlobalSettingsForm, AgentStepEditor, AlarmHeroCard, AlarmInlineControl as AlarmPanelInlineControl, AppShell, ArcKnob, AudioClassificationList, AudioLevelWaveform, AudioWaveform, AutomationHeroCard, AutomationInlineControl, AutotrackSection, BTN_COMPACT, BTN_COMPACT_DANGER, BTN_COMPACT_PRIMARY, BTN_COMPACT_WARNING, Badge, BatteryBadge, BottomSheet, Breadcrumb, BrightnessPanel, Button, ButtonControl, ButtonHeroCard, CARD_MODE_MIN_COLUMNS, CENTER, CHIP_ACTIVE, CHIP_BASE, CHIP_INACTIVE, CLASS_COLORS, COLUMN_BREAKPOINT_CLASS, COLUMN_PRIORITY, COMMIT_DEDUPE_TOLERANCE_MS, COMMIT_DEDUPE_WINDOW_MS, CONTROL_CAP_NAMES, CONTROL_FILLS, CameraStreamPlayer, Card, Checkbox, ChildSectionAccordion, ClimatePanel, CodeBlock, CollapsibleCard, ConfigFormBuilder, FormField as ConfigFormField, ConfigSchemaField, ConfirmActionButton, ConfirmDialogProvider, ConsumablesPanel, ContainerChildrenProvider, ContainerPrimaryHero, ControlColumn, ControlHeroCard, ControlInlineControl, ControlPanel, CopyButton, CoverHeroCard, CoverInlineControl, CoverPanel, CustomFieldRenderersProvider, DEFAULT_COLOR, DEVICE_COLUMNS, DEVICE_LIST_PAGE_SIZE_KEY, DEVICE_LIST_PAGE_SIZE_OPTIONS, DEVICE_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, DeviceSelectorPicker, DeviceStepMatrix, Dialog, DialogBody, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, DiscoveryPanel, DoorbellRecentPanel, Dropdown, DropdownContent, DropdownItem, DropdownTrigger, DummyHeroCard, DummyInline, EVENT_KIND_ICONS, EmptyState, ErrorBox, EventKindGlyph, EventStream, FILL, FLEET_LIST_GC_TIME_MS, FLEET_LIST_QUERY_KEY, FLEET_LIST_STALE_TIME_MS, FanHeroCard, FanInlineControl, FanPanel, FilterBar, FloatingEventStream, FloatingLogStream, FloatingPanel, FormField$1 as FormField, GRID_GAP, GRID_PAIRED, GRID_QUICK_STATS, GripTrack, GroupedModelSelector, HOST_WIDGETS, HlsVideo, HoverZoomImage, HumidifierHeroCard, HumidifierInlineControl, INPUT_COMPACT, 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, NAVIGATION_DRIVE_INTERVAL_MS, NavigationPanel, NetworkLinkBadge, NodeMultiSelectField, NodePicker, NodeSelectField, OfflineBadge, PHASE_CONFIG, PRIORITY, PTZOverlay, PageHeader, PhaseIcon, PipelineBuilder, PipelineRuntimeSelector, PipelineStep, PipelineTreeMatrix, PlayerOverlaysProvider, Popover, PopoverContent, PopoverRowAction, PopoverTrigger, PrimaryChildPicker, PrivacyMaskSettings, ProviderBadge, PtzPanel, QrCode, RECONNECT_POLICY, RECORDED_PLAYBACK_MODES, RIGHT, ROI_AREA_WARN_FRACTION, ROLE_DESCRIPTOR, RadialGauge, RecordedPlaybackProvider, RecordingPanel, ResponseLog, SCENE_CAPTURE_VARIANTS, SECTION_BODY, SECTION_CARD, SECTION_HEADER, SETTING_ROW, SETTING_ROW_LABEL, SETTING_ROW_STACK_BREAKPOINT, SETTING_ROW_VALUE, SETTING_ROW_VALUE_TEXT, SNAPSHOT_MEDIA_PATH, SPLIT_PANEL_OUTER, SPLIT_PANEL_SIDE, STACK_GAP, STATE_COLOR, SceneMonitorEditor, ScopePicker, ScriptHeroCard, ScriptInlineControl, ScrollArea, Select, SemanticBadge, SensorHeroCard, SensorInlineControl, SensorValueAtom, Separator, SettingRow, Sidebar, SidebarItem, Skeleton, SlideOverPanel, SlideToggle, SnapshotButton, SortHeaderButton, StatCard, StateValuesStream, StatusBadge, StepTimings, StepTreeMaster, Stepper, StreamBrokerSelector, StreamDebugOverlay, StreamPanel, Switch, SwitchHeroCard, SwitchInlineControl, SwitchPanel, SystemProvider, TABLE_SCROLL_MAX_H, TEXT_FIELD_LABEL, TEXT_HINT, TEXT_METRIC, TEXT_SECTION_LABEL, TEXT_VALUE, TIMEZONES, Tabs, TabsContent, TabsList, TabsTrigger, TapToggle, ThemeProvider, ThermostatHeroCard, ThermostatInlineControl, TimezoneSelector, Tooltip, TooltipContent, TooltipTrigger, VacuumHeroCard, VacuumInlineControl, ValueReadout, ValveHeroCard, ValveInlineControl, VersionBadge, VodPlaybackProvider, WaterHeaterHeroCard, WaterHeaterInlineControl, WeatherHeroCard, WeatherInlineControl, WidgetMetricCard, WidgetPanel, WidgetRegistryProvider, WidgetSlot, ZoneEditingProvider, ImageOff as a, agentColumnKey, allDeviceTypeFilterOptions, applyFleetQueryDefaults, ariaSortForColumn, badgeFor, buildStepTreeFromSchema, Camera as c, childEntityId, childListName, classifyCapability, cn, columnsForContext, containerChildToRef, countableDevices, coverHighlight, coverageLine, createSharedContext, createTheme, cursorFractionFor, darkColors, defaultTheme, deriveDeviceKind, deriveWebrtcDebugStats, describeDeviceSelector, deviceMatchesFilter, deviceOptionLabel, deviceRoleMeta, deviceRoleMetaOf, deviceTypeLabel, deviceTypeMeta, deviceTypeMetaOf, devicesToOptions, ensureMfHostInit, eventKindLabel, filterDeviceOptions, findTimezone, formatControlDateTime, formatLastSeen, formatNumeric, freezeVerdict, fuzzyMatch, getClassColor, getPhaseVisual, groupAgentColumns, groupChildrenByLayout, hardwareLabel, hubOrigin, hubPath, hubUrl, hubWsUrl, humanDuration, humidifierTint, Mic as i, initialScrubState, isAbsentProvider, isFieldVisible, createLucideIcon as l, lawnMowerActivityMeta, lightColors, loadRemoteBundle, makeScrubBridge, metadataEntries, metadataString, mirror, mountAddonPage, mountPath, Square as n, nextReconnectAction, nextSort, nextSortDirection, nextTableSort, normalizeForSearch, Grid2x2 as o, openTopLayer, overrideEntityIdFromLink, parseRecordedServerMessage, providerIcons, RotateCcw as r, resetHubMountForTests, resolveContainerPrimary, resolveControlAlign, resolveDeviceControl, resolveDisplayIcon, resolveEffectiveDefaultModel, resolveEffectiveStepModel, resolveEventKindIcon, resolvePrimaryChild, resolveSensorDisplay, resolveStepDefaultModel, resolveTableLayout, roiTooLarge, routerBasename, EyeOff as s, scrubReducer, selectedDeviceOptions, serializeRecordedCommand, shouldCommit, shouldEmit, shouldUseSingleNode, sortRows, sortRowsByColumn, statusIcons, statusLine, stepHasModelForFormat, stepModelOptions, stripParentNamePrefix, Trash2 as t, tabForSelector, tankAlert, themeToCss, toStationaryOverlayBox, trpc, useAccessoriesGetStatus, useAccessoriesSetChildHidden, useAddonPagesListPages, useAddonSettingsGetDeviceSettings, useAddonSettingsGetGlobalSettings, useAddonSettingsGetIntegrationSettings, useAddonSettingsUpdateDeviceSettings, useAddonSettingsUpdateGlobalSettings, useAddonWidgetsListWidgets, useAddonsApplyAutoUpdateToAll, useAddonsCancelJob, useAddonsCustom, useAddonsForceRefresh, useAddonsGetAddonAutoUpdate, useAddonsGetAutoUpdateSettings, useAddonsGetJob, useAddonsGetLastRestart, useAddonsGetLogs, useAddonsGetVersions, useAddonsInstallFromWorkspace, useAddonsInstallPackage, useAddonsIsWorkspaceAvailable, useAddonsList, useAddonsListCapabilityProviders, useAddonsListFrameworkPackages, useAddonsListJobs, useAddonsListPackages, useAddonsListUpdates, useAddonsListWorkspacePackages, useAddonsOnAddonLogs, useAddonsReloadPackages, useAddonsRestartAddon, useAddonsRestartServer, useAddonsRetryLoad, useAddonsRollbackPackage, useAddonsSearchAvailable, useAddonsSetAddonAutoUpdate, useAddonsSetAutoUpdateSettings, useAddonsSetCapabilityProviderEnabled, useAddonsStartJob, useAddonsUninstallPackage, useAddonsUpdatePackage, useAirQualitySensorGetStatus, useAlarmPanelArm, useAlarmPanelDisarm, useAlarmPanelGetStatus, useAlarmPanelTrigger, useAlert, useAlertsDismiss, useAlertsEmit, useAlertsGetUnreadCount, useAlertsList, useAlertsMarkAllRead, useAlertsMarkRead, useAlertsUpdate, useAllWidgets, useAmbientLightSensorGetStatus, useAudioAnalysisApplyDeviceSettingsPatch, useAudioAnalysisGetDeviceLiveContribution, useAudioAnalysisGetDeviceSettingsContribution, useAudioAnalysisResolveDeviceSettings, useAudioAnalyzerAnalyseChunk, useAudioAnalyzerAttachDevice, useAudioAnalyzerClassify, useAudioAnalyzerDetachDevice, useAudioAnalyzerDispose, useAudioAnalyzerIsReady, useAudioAnalyzerReprobeAudioEngine, useAudioCodecCanHandle, useAudioCodecCloseSession, useAudioCodecCreateDecodeSession, useAudioCodecCreateEncodeSession, useAudioCodecFlushEncode, useAudioCodecListActiveSessions, useAudioCodecListSupportedCodecs, useAudioCodecPullEncoded, useAudioCodecPullPcm, useAudioCodecPushEncodedFrame, useAudioCodecPushPcm, useAudioMetricsGetCurrentSnapshot, useAudioMetricsGetHistory, useAutomationControlDisable, useAutomationControlEnable, useAutomationControlGetStatus, useAutomationControlTrigger, useBackupCancel, useBackupDelete, useBackupDeleteSchedule, useBackupGetEntries, useBackupList, useBackupListArchives, useBackupListDestinations, useBackupListLocations, useBackupListRuns, useBackupListSchedules, useBackupPreviewSchedule, useBackupRestore, useBackupTrigger, useBackupUpsertDestinationPolicy, useBackupUpsertSchedule, useBatteryGetStatus, useBatteryWakeForStream, useBinaryGetStatus, useBrightnessGetStatus, useBrightnessSetBrightness, useBrokerAdd, useBrokerGet, useBrokerGetBrokerConfig, useBrokerGetSettings, useBrokerGetSettingsSchema, useBrokerGetState, useBrokerGetStatus, useBrokerList, useBrokerListProviders, useBrokerPublish, useBrokerRemove, useBrokerSetSettings, useBrokerSubscribe, useBrokerTestConnection, useBrokerTestSettings, useBrokerUnsubscribe, useButtonPress, useCameraCredentialsGetCredentials, useCameraCredentialsGetStatus, useCameraGridLayoutApplyDeviceSettingsPatch, useCameraGridLayoutGetDeviceLiveContribution, useCameraGridLayoutGetDeviceSettingsContribution, useCameraGridLayoutGetLayout, useCameraGridLayoutSaveLayout, useCameraPipelineConfigApplyDeviceSettingsPatch, useCameraPipelineConfigGetDeviceLiveContribution, useCameraPipelineConfigGetDeviceSettingsContribution, useCameraStreamsGetBrokerStreams, useCameraStreamsGetCameraStreams, useCameraStreamsGetProfileRtspEntries, useCameraStreamsGetRtspEntries, useCameraStreamsPickStream, useCapabilityPresence, useCarbonMonoxideGetStatus, useClimateControlGetStatus, useClimateControlSetFanMode, useClimateControlSetMode, useClimateControlSetPreset, useClimateControlSetSwingHorizontal, useClimateControlSetSwingVertical, useClimateControlSetTarget, useClimateControlSetTargetHumidity, useClimateControlSetTargetRange, useClusterNodes, useClusterTopology, useColorGetStatus, useColorSetColor, useConfirm, useConnectionTestDescribeTest, useConnectionTestTestSettings, useConnectivityGetStatus, useConsumablesGetStatus, useConsumablesReset, useContactGetStatus, useContainerChildren, useControlGetStatus, useControlSetValue, useCoreBlocksCompile, useCoreBlocksCreate, useCoreBlocksDelete, useCoreBlocksGet, useCoreBlocksGetTypeDefs, useCoreBlocksList, useCoreBlocksRestart, useCoreBlocksSetEnabled, useCoreBlocksUpdate, 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, useDeviceManagerAdoptionCancelJob, useDeviceManagerAdoptionListCandidateFilters, useDeviceManagerAdoptionListCandidates, useDeviceManagerAdoptionListJobs, useDeviceManagerAdoptionRefresh, useDeviceManagerAdoptionRelease, useDeviceManagerAdoptionResync, useDeviceManagerAdoptionStartJob, useDeviceManagerAllocateDeviceId, useDeviceManagerApplyDeviceSettingsPatch, useDeviceManagerApplyInitialMeta, useDeviceManagerCreateDevice, useDeviceManagerDisable, useDeviceManagerDiscoverAllProviders, useDeviceManagerDiscoverDevices, useDeviceManagerDiscoverProvider, useDeviceManagerDiscoveryProviders, useDeviceManagerEnable, useDeviceManagerGetAllBindings, useDeviceManagerGetBindings, useDeviceManagerGetBindingsBatch, useDeviceManagerGetChildren, useDeviceManagerGetChildrenBatch, useDeviceManagerGetConfigSchema, useDeviceManagerGetCreationSchema, useDeviceManagerGetDevice, useDeviceManagerGetDeviceAggregate, useDeviceManagerGetDeviceLiveContribution, useDeviceManagerGetDeviceLiveInfoAggregate, useDeviceManagerGetDeviceSettingsAggregate, useDeviceManagerGetDeviceSettingsContribution, useDeviceManagerGetDeviceStatusAggregate, useDeviceManagerGetDeviceStatusAggregateBatch, useDeviceManagerGetLinkedDevices, useDeviceManagerGetLinkedDevicesBatch, useDeviceManagerGetRoleDisplayDefaults, useDeviceManagerGetSettingsSchema, useDeviceManagerGetStreamProfileMap, useDeviceManagerGetStreamSources, useDeviceManagerGetWireableFields, useDeviceManagerListAll, useDeviceManagerListBindableCapsForDeviceType, useDeviceManagerListLocationDescriptions, useDeviceManagerListLocationIcons, useDeviceManagerListLocations, useDeviceManagerListPersistedByAddon, useDeviceManagerListSiteZones, useDeviceManagerListWrappersForCap, useDeviceManagerLoadConfig, useDeviceManagerLoadMeta, useDeviceManagerLoadRuntimeState, useDeviceManagerMigrateDevice, useDeviceManagerPersistConfig, useDeviceManagerProbeStreams, useDeviceManagerProviderCreationType, useDeviceManagerProviderDiscoveryParamsSchema, useDeviceManagerRegisterDevice, useDeviceManagerRemove, useDeviceManagerRemoveByIntegration, useDeviceManagerRemoveDevice, useDeviceManagerRemoveLocation, useDeviceManagerRemoveSiteZone, useDeviceManagerRenameLocation, useDeviceManagerRenameSiteZone, useDeviceManagerRunDeviceAction, useDeviceManagerSetChildLayout, useDeviceManagerSetDisabled, useDeviceManagerSetDisplay, useDeviceManagerSetIntegrationId, useDeviceManagerSetLinkDeviceId, useDeviceManagerSetLocation, useDeviceManagerSetLocationDescription, useDeviceManagerSetLocationIcon, useDeviceManagerSetLocationZone, useDeviceManagerSetMetadata, useDeviceManagerSetName, useDeviceManagerSetPrimaryChildEntityId, useDeviceManagerSetRole, useDeviceManagerSetRoleDisplayDefaults, useDeviceManagerSetSiteZone, useDeviceManagerSetStreamProfileMap, useDeviceManagerSetType, useDeviceManagerSetWrapperActive, useDeviceManagerTestCreationField, useDeviceManagerTestField, useDeviceManagerUpdateConfig, useDeviceManagerUpdateDeviceField, useDeviceManagerUpdateDeviceFieldsBatch, useDeviceNetworkLink, useDeviceOpsGetConfigEntries, useDeviceOpsGetRawState, useDeviceOpsGetSettingsSchema, useDeviceOpsGetStreamSources, useDeviceOpsRemoveDevice, useDeviceOpsRunAction, useDeviceOpsSetConfig, useDeviceProviderAdoptDiscoveredDevice, useDeviceProviderCreateDevice, useDeviceProviderDiscoverDevices, useDeviceProviderGetChildCreationSchema, useDeviceProviderGetDevices, useDeviceProviderGetDiscoveryParamsSchema, useDeviceProviderGetManualCreationType, useDeviceProviderGetStatus, useDeviceProviderReloadDevice, useDeviceProviderStart, useDeviceProviderStop, useDeviceProviderSupportsDiscovery, useDeviceProviderSupportsManualCreation, useDeviceProviderTestCreationField, useDeviceProxy, useDeviceSnapshot, useDeviceSnapshotImage, useDeviceState, useDeviceStateGetAllSnapshots, useDeviceStateGetCapSlice, useDeviceStateGetSnapshot, useDeviceStateSetCapSlice, useDeviceStateSlice, useDeviceStatusGetStatus, useDeviceWebrtc, useDevices, useDoorbellApplyDeviceSettingsPatch, useDoorbellEvents, useDoorbellGetDeviceLiveContribution, useDoorbellGetDeviceSettingsContribution, useDoorbellGetStatus, useEnumSensorGetStatus, useEventEmitterGetStatus, useEventInvalidation, useEventStreamLatest, useEventStreamMap, useEventsGetEventClipUrl, useEventsGetEventThumbnail, useEventsGetEvents, useFaceGalleryAssignFace, useFaceGalleryAssignFaces, useFaceGalleryAuditIdentitySamples, useFaceGalleryCreateIdentity, useFaceGalleryDeleteFace, useFaceGalleryDeleteIdentity, useFaceGalleryGetFaceByTrack, useFaceGalleryGetFaceMedia, useFaceGalleryListIdentities, useFaceGalleryListIdentitySamples, useFaceGalleryListRecentFaces, useFaceGalleryRemoveSample, useFaceGalleryRenameIdentity, useFaceGallerySuggestFaceClusters, useFaceGalleryUnassignFace, useFaceGalleryUnassignFaces, useFanControlGetStatus, useFanControlSetDirection, useFanControlSetOscillating, useFanControlSetPercentage, useFanControlSetPreset, useFeatureProbeGetStatus, useFloodGetStatus, useGasGetStatus, useHumidifierGetStatus, useHumidifierSetMode, useHumidifierSetOn, useHumidifierSetTargetHumidity, useHumiditySensorGetStatus, useImageGetStatus, useImageSettingsGetOptions, useImageSettingsGetStatus, useImageSettingsSetSettings, useIntegrationsCreate, useIntegrationsDelete, useIntegrationsGet, useIntegrationsGetAvailableTypes, useIntegrationsGetByAddonId, useIntegrationsGetSettings, useIntegrationsList, useIntegrationsSetSettings, useIntegrationsTestConnection, useIntegrationsUpdate, useIntercomEndTalkSession, useIntercomGetStatus, useIntercomHandleAnswer, useIntercomPushTalkAudio, useIntercomStartSession, useIntercomStartTalkSession, useIntercomStopSession, useIsMidWidth, useIsMobile, useLawnMowerControlDock, useLawnMowerControlGetStatus, useLawnMowerControlPause, useLawnMowerControlStartMowing, useLiveBuffer, useLiveEvent, useLlmCancel, useLlmDeleteModel, useLlmDeleteProfile, useLlmGenerate, useLlmGenerateVision, useLlmGetDefaults, useLlmGetRuntimeStatus, useLlmGetUsage, useLlmInstallModel, useLlmListModelCatalog, useLlmListModels, useLlmListNodeModels, useLlmListProfileKinds, useLlmListProfiles, useLlmListRuntimeNodes, useLlmResolveModelRef, useLlmSetDefault, useLlmStartRuntime, useLlmStopRuntime, useLlmTestProfile, useLlmUpsertProfile, useLocalNetworkDownloadCa, useLocalNetworkGetAllowedAddresses, useLocalNetworkGetConnectionEndpoints, useLocalNetworkGetNotificationEndpoint, useLocalNetworkGetPreferred, useLocalNetworkGetTlsStatus, useLocalNetworkGetViewerEndpoints, useLocalNetworkList, useLocalNetworkRegenerateCertificate, useLocalNetworkResetAllowlistToBestMatch, useLocalNetworkRevertToGeneratedCertificate, useLocalNetworkSetAllowedAddresses, useLocalNetworkSetNotificationEndpoint, useLocalNetworkSetViewerEndpoints, useLocalNetworkUploadCertificate, useLockControlGetStatus, useLockControlLock, useLockControlOpen, useLockControlUnlock, useMediaPlayerGetStatus, useMediaPlayerNext, useMediaPlayerPause, useMediaPlayerPlay, useMediaPlayerPlayMedia, useMediaPlayerPrevious, useMediaPlayerSeek, useMediaPlayerSelectSource, useMediaPlayerSetMute, useMediaPlayerSetRepeat, useMediaPlayerSetShuffle, useMediaPlayerSetVolume, useMediaPlayerStop, useMeshNetworkGetStatus, useMeshNetworkJoin, useMeshNetworkLeave, useMeshNetworkListPeers, useMeshNetworkLogout, useMeshNetworkStartLogin, useMeshNetworkTestConnection, useMetricsProviderCollectSnapshot, useMetricsProviderGetAddonStats, useMetricsProviderGetCached, useMetricsProviderGetCpuTemperature, useMetricsProviderGetCurrent, useMetricsProviderGetDiskSpace, useMetricsProviderGetGpuInfo, useMetricsProviderGetLoadSeries, useMetricsProviderGetProcessStats, useMetricsProviderListAddonInstances, useMetricsProviderListNodeProcesses, useMotionDetectionAnalyze, useMotionDetectionApplyDeviceSettingsPatch, useMotionDetectionGetDeviceLiveContribution, useMotionDetectionGetDeviceSettingsContribution, useMotionDetectionRemoveCamera, useMotionDetectionReset, useMotionGetStatus, useMotionIsDetected, useMotionTriggerGetStatus, useMotionTriggerSetMotionTrigger, useMotionZonesGetOptions, useMotionZonesGetStatus, useMotionZonesSetZone, useMqttBrokerAddBroker, useMqttBrokerGetBrokerConfig, useMqttBrokerGetStatus, useMqttBrokerListBrokers, useMqttBrokerRemoveBroker, useMqttBrokerStartEmbeddedBroker, useMqttBrokerStopEmbeddedBroker, useMqttBrokerTestConnection, useNativeObjectDetectionGetOptions, useNativeObjectDetectionGetStatus, useNativeObjectDetectionSetEnabled, useNativeObjectDetectionSetSettings, useNavigation, useNavigationGetFeatures, useNavigationGetStatus, useNavigationGoToPoint, useNavigationListActions, useNavigationMove, useNavigationPlaySound, useNavigationRunAction, useNavigationSetLightLevel, useNavigationSetLightMode, useNavigationSetLightOn, useNavigationStop, useNetworkAccessGetEndpoint, useNetworkAccessGetStatus, useNetworkAccessListEndpoints, useNetworkAccessStart, useNetworkAccessStop, useNetworkLinkGetStatus, useNetworkQualityGetAllStats, useNetworkQualityGetDeviceStats, useNetworkQualityReportClientStats, useNodesClusterAddonStatus, useNodesDeployAddon, useNodesExecuteQuery, useNodesGetCapUsageGraph, useNodesGetNodeAddons, useNodesRenameNode, useNodesRestartAddon, useNodesRestartNode, useNodesRestartProcess, useNodesSetProcessLogLevel, useNodesShutdownNode, useNodesTopology, useNodesUndeployAddon, useNotificationOutputDeleteTarget, useNotificationOutputDiscoverTargets, useNotificationOutputListTargetKinds, useNotificationOutputListTargets, useNotificationOutputSend, useNotificationOutputSetTargetEnabled, useNotificationOutputTestTarget, useNotificationOutputUpsertTarget, useNotificationRulesCancelSnooze, useNotificationRulesCreateRule, useNotificationRulesCreateSnooze, useNotificationRulesDeleteRule, useNotificationRulesGetAlarmConfig, useNotificationRulesGetClipRetentionAsks, useNotificationRulesGetConditionCatalog, useNotificationRulesGetHistory, useNotificationRulesGetRule, useNotificationRulesListDeviceMutes, useNotificationRulesListRules, useNotificationRulesListSnoozes, useNotificationRulesResolveArtifactUrl, useNotificationRulesSetAlarmConfig, useNotificationRulesSetDeviceMuted, useNotificationRulesSetRuleEnabled, useNotificationRulesTestRule, useNotificationRulesUpdateRule, useNotifierCancel, useNotifierGetStatus, useNotifierSend, useNumericSensorGetStatus, useOptimisticSlice, useOptionalSystem, useOptionalWidgetRegistry, useOsdGetStatus, useOsdManagerClearSlotBinding, useOsdManagerCopyDeviceConfiguration, useOsdManagerGetConditionSupport, useOsdManagerGetDeviceOsd, useOsdManagerGetSourceCatalog, useOsdManagerPreviewSlot, useOsdManagerRenderDevice, useOsdManagerSetSlotBinding, useOsdSetOverlay, usePTZ, usePetFeederCallPet, usePetFeederCancelFeed, usePetFeederFeed, usePetFeederGetStatus, usePetFeederMarkFoodReplenished, usePetFeederPlaySound, usePetFeederResetDesiccant, usePetFeederSetChildLock, usePetFeederSetFeedSound, usePetFeederSetIndicatorLight, usePetFeederSetVolume, usePipelineAnalyticsApplyDeviceSettingsPatch, usePipelineAnalyticsCancelRelocateMedia, usePipelineAnalyticsCancelStorageMigrationMove, usePipelineAnalyticsClearTracks, usePipelineAnalyticsCompleteRetrainTrack, usePipelineAnalyticsCountRelocatableMedia, usePipelineAnalyticsCountUnstampedEventMedia, usePipelineAnalyticsDeleteDeviceEvents, usePipelineAnalyticsDeleteTracks, usePipelineAnalyticsDeselectRetrainFrame, usePipelineAnalyticsGetActiveTracks, usePipelineAnalyticsGetAudioEvents, usePipelineAnalyticsGetDeviceLiveContribution, usePipelineAnalyticsGetDeviceSettingsContribution, usePipelineAnalyticsGetEventDensity, usePipelineAnalyticsGetEventDensityBatch, usePipelineAnalyticsGetEventMedia, usePipelineAnalyticsGetEventMediaFootprintByKind, usePipelineAnalyticsGetEventStoreFootprint, usePipelineAnalyticsGetKeyEvents, usePipelineAnalyticsGetKeyEventsBatch, usePipelineAnalyticsGetMediaReclaimStatus, usePipelineAnalyticsGetMotionEvents, usePipelineAnalyticsGetObjectEmbeddingRebuildStatus, usePipelineAnalyticsGetObjectEvents, usePipelineAnalyticsGetRetrainExportUrl, usePipelineAnalyticsGetRetrainFrameImage, usePipelineAnalyticsGetSensorEvents, usePipelineAnalyticsGetStorageMigrationMoveStatus, usePipelineAnalyticsGetSummary, usePipelineAnalyticsGetTrack, usePipelineAnalyticsGetTrackMedia, usePipelineAnalyticsGetTrainingExportSummary, usePipelineAnalyticsGetTrainingExportUrl, usePipelineAnalyticsListArchivedDebugNotes, usePipelineAnalyticsListBirthDecisions, usePipelineAnalyticsListEventKinds, usePipelineAnalyticsListEventKindsBatch, usePipelineAnalyticsListEventMedia, usePipelineAnalyticsListOpsLog, usePipelineAnalyticsListRecentSummaries, usePipelineAnalyticsListRecentTracks, usePipelineAnalyticsListRelocateMediaJobs, usePipelineAnalyticsListRetrainAnnotations, usePipelineAnalyticsListRetrainFrames, usePipelineAnalyticsListRetrainStaging, usePipelineAnalyticsListSummaries, usePipelineAnalyticsListTrackMedia, usePipelineAnalyticsListTracks, usePipelineAnalyticsOwnersWithMedia, usePipelineAnalyticsPauseForStorageMigration, usePipelineAnalyticsProposeRetrainAnnotations, usePipelineAnalyticsPruneEvents, usePipelineAnalyticsPruneEventsBefore, usePipelineAnalyticsPruneTracksBefore, usePipelineAnalyticsReadLongTermSeries, usePipelineAnalyticsRebuildObjectEmbeddings, usePipelineAnalyticsReclaimDebugMedia, usePipelineAnalyticsReconcileFromDisk, usePipelineAnalyticsRefreshStorageLocationsForMigration, usePipelineAnalyticsRelocateMedia, usePipelineAnalyticsRestageRetrainTrack, usePipelineAnalyticsResumeForStorageMigration, usePipelineAnalyticsRunReplayFrameProcessor, usePipelineAnalyticsSaveRetrainAnnotations, usePipelineAnalyticsSearchObjectEvents, usePipelineAnalyticsSelectRetrainFrames, usePipelineAnalyticsSetTrackFlags, usePipelineAnalyticsStartStorageMigrationMove, usePipelineAnalyticsWipeAllAnalytics, usePipelineAnalyticsWipeObjectEmbeddings, usePipelineExecutorCacheFrameInPool, usePipelineExecutorClearDeviceOverrides, usePipelineExecutorDeleteModel, usePipelineExecutorDeleteTemplate, usePipelineExecutorDownloadModel, usePipelineExecutorGetAddonModels, usePipelineExecutorGetAudioCapabilities, usePipelineExecutorGetAvailableEngines, usePipelineExecutorGetCapabilities, usePipelineExecutorGetDefaultSteps, usePipelineExecutorGetDetectionConfigSchema, usePipelineExecutorGetEffectiveTuning, usePipelineExecutorGetEngineProvisioning, usePipelineExecutorGetGlobalPipelineConfig, usePipelineExecutorGetGlobalSteps, usePipelineExecutorGetInferenceDeviceHealth, usePipelineExecutorGetOrchestratorConfigSchema, usePipelineExecutorGetReferenceAudio, usePipelineExecutorGetReferenceAudioFiles, usePipelineExecutorGetReferenceImage, usePipelineExecutorGetSchema, usePipelineExecutorGetSelectedEngine, usePipelineExecutorGetVideoPipelineSteps, usePipelineExecutorInferCached, usePipelineExecutorKillEngine, usePipelineExecutorListLoadedEngines, usePipelineExecutorListReferenceImages, usePipelineExecutorListTemplates, usePipelineExecutorRearmInferenceDevice, usePipelineExecutorRunAudioTest, usePipelineExecutorRunPipeline, usePipelineExecutorRunPipelineBatch, usePipelineExecutorSaveTemplate, usePipelineExecutorSetVideoPipelineSteps, usePipelineExecutorSpinEngine, usePipelineExecutorUncacheFrame, usePipelineExecutorUpdateTemplate, usePipelineExecutorValidatePipeline, usePipelineOrchestratorApplyDeviceSettingsPatch, usePipelineOrchestratorAssignAudio, usePipelineOrchestratorAssignPipeline, usePipelineOrchestratorDeleteTemplate, usePipelineOrchestratorGetAgentLoad, usePipelineOrchestratorGetAgentSettings, usePipelineOrchestratorGetAudioAssignment, usePipelineOrchestratorGetAudioAssignments, usePipelineOrchestratorGetAudioNodeLoad, usePipelineOrchestratorGetCameraMetrics, usePipelineOrchestratorGetCameraSettings, usePipelineOrchestratorGetCameraStatus, usePipelineOrchestratorGetCameraStatuses, usePipelineOrchestratorGetCameraStepOverrides, usePipelineOrchestratorGetCameraSwitches, usePipelineOrchestratorGetCapabilityBindings, usePipelineOrchestratorGetDeviceLiveContribution, usePipelineOrchestratorGetDeviceSettingsContribution, usePipelineOrchestratorGetGlobalMetrics, usePipelineOrchestratorGetIngestOwner, usePipelineOrchestratorGetNodeInferenceDevices, usePipelineOrchestratorGetPipelineAssignment, usePipelineOrchestratorGetPipelineAssignments, usePipelineOrchestratorGetPipelineDevicePin, usePipelineOrchestratorGetReconcileFromDiskStatus, usePipelineOrchestratorListAgentSettings, usePipelineOrchestratorListTemplates, usePipelineOrchestratorPauseForStorageMigration, usePipelineOrchestratorRebalance, usePipelineOrchestratorReconcileFromDisk, usePipelineOrchestratorRemoveAgentSettings, usePipelineOrchestratorResetNodePipelineDefaults, usePipelineOrchestratorResolvePipeline, usePipelineOrchestratorResumeForStorageMigration, usePipelineOrchestratorSaveTemplate, usePipelineOrchestratorSetAgentCapabilities, usePipelineOrchestratorSetAgentDecodeLimits, usePipelineOrchestratorSetAgentDetectWeight, usePipelineOrchestratorSetAgentInferenceDevices, usePipelineOrchestratorSetAgentMaxCameras, usePipelineOrchestratorSetAgentReachableHost, usePipelineOrchestratorSetCameraPipelineForAgent, usePipelineOrchestratorSetCameraStepOverride, usePipelineOrchestratorSetCameraStepToggle, usePipelineOrchestratorSetCameraSwitch, usePipelineOrchestratorSetCapabilityBinding, usePipelineOrchestratorSetPipelineDevicePin, usePipelineOrchestratorUnassignAudio, usePipelineOrchestratorUnassignPipeline, usePipelineOrchestratorUpdateTemplate, usePipelineRunnerAttachCamera, usePipelineRunnerDetachCamera, usePipelineRunnerGetAllCameraMetrics, usePipelineRunnerGetCameraMetrics, usePipelineRunnerGetLocalCameras, usePipelineRunnerGetLocalLoad, usePipelineRunnerGetLocalMetrics, usePipelineRunnerGetNativeCrop, usePipelineRunnerGetParkedTrackFrame, usePipelineRunnerParkTrackFrame, usePipelineRunnerReleaseParkedTrackFrames, usePipelineRunnerReportMotion, usePipelineRunnerRequestOccupancyBurst, usePipelineRunnerRunDetailSubtree, usePipelineRunnerRunStatelessStep, usePlateGalleryAssignPlate, usePlateGalleryAssignPlates, usePlateGalleryCorrectPlateText, usePlateGalleryCreateVehicle, usePlateGalleryDeletePlate, usePlateGalleryDeleteVehicle, usePlateGalleryGetPlateByTrack, usePlateGalleryGetPlateMedia, usePlateGalleryListPlates, usePlateGalleryListVehicleSamples, usePlateGalleryListVehicles, usePlateGalleryRemoveVehicleSample, usePlateGalleryRenameVehicle, usePlateGallerySearchPlates, usePlateGallerySuggestPlateClusters, usePlateGalleryUnassignPlate, usePlateGalleryUnassignPlates, usePlayerOverlayLayer, usePlayerOverlayLayers, usePlayerToolbarButton, usePlayerToolbarButtons, usePowerMeterGetStatus, usePresenceGetStatus, usePressureSensorGetStatus, usePrivacyMaskGetOptions, usePrivacyMaskGetStatus, usePrivacyMaskSetAudioEnabled, usePrivacyMaskSetMask, usePrompt, usePtzAutotrackGetSettings, usePtzAutotrackGetStatus, usePtzAutotrackSetEnabled, usePtzAutotrackSetSettings, usePtzCaptureHomeHere, usePtzContinuousMove, usePtzDeletePreset, usePtzGetHomePreset, usePtzGetHomeReturn, usePtzGetOptions, usePtzGetPosition, usePtzGetPresets, usePtzGetStatus, usePtzGoHome, usePtzGoToPreset, usePtzMove, usePtzSavePreset, usePtzSetAutofocus, usePtzSetHomePreset, usePtzSetHomeReturn, usePtzStop, useRebootReboot, useRecordedPlayback, useRecordingApplyDeviceSettingsPatch, useRecordingCancelRelocateJob, useRecordingCancelStorageMigrationMove, useRecordingDeleteFootprint, useRecordingExportCancelExport, useRecordingExportCreateExport, useRecordingExportDeleteExport, useRecordingExportGetDownloadUrl, useRecordingExportGetExport, useRecordingExportListExports, useRecordingExportReadExportBytes, useRecordingGetAvailability, useRecordingGetAvailabilityBatch, useRecordingGetDaysWithRecordings, useRecordingGetDaysWithRecordingsBatch, useRecordingGetDeviceConfig, useRecordingGetDeviceLiveContribution, useRecordingGetDeviceSettingsContribution, useRecordingGetPlacement, useRecordingGetPlaybackManifest, useRecordingGetRelocateResidue, useRecordingGetStatus, useRecordingGetStorageMigrationMoveStatus, useRecordingGetStorageUsage, useRecordingListOpsLog, useRecordingListRelocateJobs, useRecordingLocateSegment, useRecordingPauseForStorageMigration, useRecordingPlanStorageRebalance, useRecordingPruneFootage, useRecordingReadGopBytes, useRecordingReadSegmentBytes, useRecordingReadWindowBytes, useRecordingReconcileLedgerAgainstDisk, useRecordingRefreshStorageLocationsForMigration, useRecordingRelocateFootage, useRecordingRenderClip, useRecordingRenderGif, useRecordingRescanStorage, useRecordingResumeForStorageMigration, useRecordingSetDeviceConfig, useRecordingSetDevicePlacement, useRecordingSignalGetStatus, useRecordingStartStorageMigrationMove, useRecordingStartStorageRebalance, useRemoteComponent, useSceneMonitorCaptureReference, useSceneMonitorCreateScene, useSceneMonitorDeleteReference, useSceneMonitorDeleteScene, useSceneMonitorGetStatus, useSceneMonitorListScenes, useSceneMonitorListScenesBatch, useSceneMonitorRecheckNow, useSceneMonitorResetScene, useSceneMonitorUpdateScene, useScriptRunnerGetStatus, useScriptRunnerRun, useScriptRunnerStop, useScrubController, useServerManagementApplyServerUpdate, useServerManagementCheckServerUpdate, useServerManagementGetServerPackageStatus, useServerManagementRestartServer, useServerManagementRollbackServerUpdate, useSettingsStoreAggregate, useSettingsStoreCount, useSettingsStoreDeclareCollection, useSettingsStoreDelete, useSettingsStoreDeleteWhere, useSettingsStoreGet, useSettingsStoreHistogram, useSettingsStoreInsert, useSettingsStoreInsertMany, useSettingsStoreIsEmpty, useSettingsStoreQuery, useSettingsStoreSet, useSettingsStoreUpdate, useSettingsStoreUpdateWhere, useSettingsStoreUpsert, useSmokeGetStatus, useSnapshotApplyDeviceSettingsPatch, useSnapshotGetDebugState, useSnapshotGetDeviceLiveContribution, useSnapshotGetDeviceSettingsContribution, useSnapshotGetSnapshot, useSnapshotGetSnapshotLinks, useSnapshotGetSnapshotOverview, useSnapshotGetStatus, useSnapshotInvalidateCache, useStationaryOverlay, useStorageAbortUpload, useStorageBeginDownload, useStorageBeginUpload, useStorageDelete, useStorageDeleteLocation, useStorageEndDownload, useStorageExists, useStorageFinalizeUpload, useStorageGetAvailableSpace, useStorageList, useStorageListDrainProgress, useStorageListLocationDeclarations, useStorageListLocations, useStorageListProviders, useStorageMigrationCancel, useStorageMigrationCleanupCancel, useStorageMigrationCleanupStart, useStorageMigrationCleanupStatus, useStorageMigrationDrain, useStorageMigrationHistory, useStorageMigrationMovers, useStorageMigrationPlan, useStorageMigrationResidue, useStorageMigrationStart, useStorageMigrationStatus, useStorageRead, useStorageReadChunk, useStorageResolve, useStorageTestConfig, useStorageTestLocation, useStorageUpsertLocation, useStorageWrite, useStorageWriteChunk, useStreamBrokerAcquireEgressTranscode, useStreamBrokerApplyDeviceSettingsPatch, useStreamBrokerAssignProfile, useStreamBrokerFetchEventMedia, useStreamBrokerForgetDeviceHardware, useStreamBrokerGetAllRtspEntries, useStreamBrokerGetBrokerStats, useStreamBrokerGetDeviceAudioMute, useStreamBrokerGetDeviceLiveContribution, useStreamBrokerGetDeviceSettingsContribution, useStreamBrokerGetPreBufferInfo, useStreamBrokerGetRtspEntry, useStreamBrokerGetRtspPort, useStreamBrokerGetStreamUrl, useStreamBrokerGetStreamWithCodec, useStreamBrokerIsRtspEnabled, useStreamBrokerKillClient, useStreamBrokerListAllCameraStreams, useStreamBrokerListAllProfileSlots, useStreamBrokerListClients, useStreamBrokerProbeStream, useStreamBrokerProduceEventMedia, useStreamBrokerPublishCameraStream, useStreamBrokerPullAudioChunks, useStreamBrokerPullFrameHandles, useStreamBrokerRegenerateRtspToken, useStreamBrokerReleaseEgressTranscode, useStreamBrokerReleaseStreamWithCodec, useStreamBrokerRenderPreBufferClip, useStreamBrokerReportStreamSignal, useStreamBrokerRestartProfile, useStreamBrokerRetractCameraStream, useStreamBrokerSetDeviceAudioMute, useStreamBrokerSetPreBufferDuration, useStreamBrokerSetRtspEnabled, useStreamBrokerSubscribeAudioChunks, useStreamBrokerSubscribeFrames, useStreamBrokerUnassignProfile, useStreamBrokerUnsubscribeAudioChunks, useStreamBrokerUnsubscribeFrames, useStreamCatalogGetCatalog, useStreamParamsGetConfigSchema, useStreamParamsGetOptions, useStreamParamsGetStatus, useStreamParamsSetProfile, useStreamSignalsListSignals, useSwitchGetStatus, useSwitchSetState, useSystem, useSystemDetectSiteLocation, useSystemFeatureFlags, useSystemForceRetentionCleanup, useSystemGetFailureContributions, useSystemGetLoadContributions, useSystemGetLoggingSettings, useSystemGetRequestCensus, useSystemGetRetentionConfig, useSystemGetSiteLocation, useSystemHealth, useSystemInfo, useSystemMutation, useSystemNetworkAddresses, useSystemQuery, useSystemSetLoggingSettings, useSystemSetRetentionConfig, useSystemSetSiteLocation, useTamperGetStatus, useTemperatureSensorGetStatus, useTerminalSessionAdoptLegacyMonitor, useTerminalSessionClose, useTerminalSessionCreateInstance, useTerminalSessionDeleteInstance, useTerminalSessionListInstances, useTerminalSessionListLegacyCameras, useTerminalSessionListProfiles, useTerminalSessionListSessions, useTerminalSessionOpenSession, useTerminalSessionPullOutput, useTerminalSessionResize, useTerminalSessionSetInstanceEnabled, useTerminalSessionUpdateInstance, useTerminalSessionWriteInput, useThemeMode, useToastOnToast, useTurnProviderGetTurnServers, useUpdateGetStatus, useUpdateInstallUpdate, useUserManagementConfirmTotp, useUserManagementCreateApiKey, useUserManagementCreateScopedToken, useUserManagementCreateUser, useUserManagementDeleteUser, useUserManagementDisableTotp, useUserManagementGetTotpStatus, useUserManagementListApiKeys, useUserManagementListOauthSessions, useUserManagementListScopedTokens, useUserManagementListUsers, useUserManagementOauthExchangeCode, useUserManagementOauthIssueCode, useUserManagementOauthRefresh, useUserManagementOauthVerifyAccessToken, useUserManagementResetPassword, useUserManagementRevokeApiKey, useUserManagementRevokeOauthSession, useUserManagementRevokeScopedToken, useUserManagementSetUserScopes, useUserManagementSetupTotp, useUserManagementUpdateUser, useUserManagementValidateApiKey, useUserManagementValidateCredentials, useUserManagementValidateScopedToken, useUserManagementVerifyTotp, useVacuumControlGetStatus, useVacuumControlLocate, useVacuumControlPause, useVacuumControlReturnToBase, useVacuumControlSetFanSpeed, useVacuumControlStart, useVacuumControlStop, useValveClose, useValveGetStatus, useValveOpen, useValveSetPosition, useValveStop, useVibrationGetStatus, useVideoclipsGetClipPlayback, useVideoclipsListClips, useVideoclipsListSources, useVideoclipsReadClipBytes, useVodPlayback, useWaterHeaterGetStatus, useWaterHeaterSetAway, useWaterHeaterSetOperationMode, useWaterHeaterSetTargetTemp, useWeatherGetStatus, useWebrtcSessionAddIceCandidate, useWebrtcSessionCloseSession, useWebrtcSessionCreateSession, useWebrtcSessionGetIceCandidates, useWebrtcSessionGetSessionDebug, useWebrtcSessionGetSessionState, useWebrtcSessionHandleAnswer, useWebrtcSessionHandleOffer, useWebrtcSessionHasAdaptiveBitrate, useWebrtcSessionListStreams, useWidget, useWidgetMetadata, useWidgetRegistry, useZoneAnalyticsGetCameraHistory, useZoneAnalyticsGetCurrentSnapshot, useZoneAnalyticsGetCurrentSnapshotBatch, useZoneAnalyticsGetUnzonedHistory, useZoneAnalyticsGetZoneHistory, useZoneEditing, useZoneRulesListRules, useZoneRulesSetRules, useZonesAddZone, useZonesListZones, useZonesRemoveZone, useZonesUpdateZone, vacuumStateMeta, validateScopes, valveStateMeta, variantLabel, waterHeaterPhase, waterHeaterTint, weatherConditionMeta, weatherTint };