@camstack/ui-library 1.2.79 → 1.2.81

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.
@@ -1,5 +1,6 @@
1
1
  import { ReactNode } from 'react';
2
2
  import { TableMobileMode } from './data-table-layout';
3
+ import { TableSortState, TableSortValue } from './table-sort';
3
4
  export interface DataColumn<T> {
4
5
  /** Stable key for React reconciliation + tests. */
5
6
  readonly key: string;
@@ -15,6 +16,28 @@ export interface DataColumn<T> {
15
16
  readonly render: (row: T, rowIndex: number) => ReactNode;
16
17
  /** Optional explicit Tailwind width class (e.g. `'w-24'`). */
17
18
  readonly width?: string;
19
+ /**
20
+ * Opt this column into column sorting. Return the row's value for THIS
21
+ * column: a number for numeric columns (never a formatted string — "100"
22
+ * sorts before "9"), a string for text, and `null` when the row has no
23
+ * value, which always sorts last in both directions.
24
+ *
25
+ * Called once per row per comparison, so read a field; do not format.
26
+ *
27
+ * Omitting it is the correct answer for a composite cell (a list, an argv
28
+ * blob, an interactive control): see {@link DataColumn.notSortableReason}.
29
+ */
30
+ readonly sortValue?: (row: T) => TableSortValue;
31
+ /**
32
+ * Why this column has NO sort. Rendered as the header's `title` so the
33
+ * reason reaches the operator who wonders why one header clicks and the
34
+ * next does not.
35
+ *
36
+ * Only meaningful together with an absent `sortValue`. A column that cannot
37
+ * be ordered in a way that MEANS something must say so rather than offer an
38
+ * ordering that looks authoritative and is not.
39
+ */
40
+ readonly notSortableReason?: string;
18
41
  }
19
42
  export interface DataTableProps<T> {
20
43
  readonly columns: readonly DataColumn<T>[];
@@ -49,6 +72,16 @@ export interface DataTableProps<T> {
49
72
  * reason of its own.
50
73
  */
51
74
  readonly maxBodyHeight?: string;
75
+ /**
76
+ * Column sort the table opens with, e.g. `{ columnKey: 'cpu', dir: 'desc' }`.
77
+ * Must name a column that declares `sortValue`; a key that names no sortable
78
+ * column simply leaves the table in its incoming order.
79
+ *
80
+ * The state is owned INSIDE the table from here on — a header click moves it
81
+ * none → asc → desc → none. Pass this only to choose the opening order, not
82
+ * to drive the table from outside.
83
+ */
84
+ readonly defaultSort?: TableSortState;
52
85
  }
53
86
  /**
54
87
  * The default cap for an internally-scrolling table.
@@ -58,4 +91,4 @@ export interface DataTableProps<T> {
58
91
  * does not need a breakpoint of its own.
59
92
  */
60
93
  export declare const TABLE_SCROLL_MAX_H: "max-h-[60vh]";
61
- export declare function DataTable<T>({ columns, rows, rowKey, onRowClick, minWidthPx, emptyMessage, className, bordered, rowClassName, mobileMode, maxBodyHeight, }: DataTableProps<T>): import("react").JSX.Element | null;
94
+ export declare function DataTable<T>({ columns, rows, rowKey, onRowClick, minWidthPx, emptyMessage, className, bordered, rowClassName, mobileMode, maxBodyHeight, defaultSort, }: DataTableProps<T>): import("react").JSX.Element | null;
@@ -9,6 +9,10 @@ export interface DeviceSort {
9
9
  /**
10
10
  * Toggle a column's sort on header click: none → asc → desc → none.
11
11
  * Clicking a DIFFERENT column starts it fresh at `asc`.
12
+ *
13
+ * The rule itself lives in `composites/table-sort.ts` and is shared with
14
+ * `DataTable` — this function only re-labels the result with the device
15
+ * list's own `columnId` vocabulary.
12
16
  */
13
17
  export declare function nextSort(current: DeviceSort | null, columnId: SortableColumnId): DeviceSort | null;
14
18
  /**
@@ -38,6 +38,10 @@ export * from './data-table';
38
38
  export { DataTable } from './data-table';
39
39
  export type { TableLayoutKind, TableMobileMode } from './data-table-layout';
40
40
  export { CARD_MODE_MIN_COLUMNS, resolveTableLayout } from './data-table-layout';
41
+ export type { SortHeaderButtonProps } from './sort-header-button';
42
+ export { SortHeaderButton } from './sort-header-button';
43
+ export type { AriaSortValue, TableSortDirection, TableSortState, TableSortValue, } from './table-sort';
44
+ export { ariaSortForColumn, nextSortDirection, nextTableSort, sortRowsByColumn } from './table-sort';
41
45
  export type { Detection, DetectionCanvasProps } from './detection-canvas';
42
46
  export { DetectionCanvas } from './detection-canvas';
43
47
  export { CLASS_COLORS, DEFAULT_COLOR, getClassColor } from './detection-colors';
@@ -0,0 +1,11 @@
1
+ import { ReactNode } from 'react';
2
+ import { TableSortDirection } from './table-sort';
3
+ export interface SortHeaderButtonProps {
4
+ readonly label: ReactNode;
5
+ /** True when THIS column is the table's single sorted column. */
6
+ readonly active: boolean;
7
+ /** Direction while `active`; ignored otherwise. */
8
+ readonly dir: TableSortDirection;
9
+ readonly onSort: () => void;
10
+ }
11
+ export declare function SortHeaderButton({ label, active, dir, onSort }: SortHeaderButtonProps): ReactNode;
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Column sorting for {@link DataTable} — the ONE sort model in this library.
3
+ *
4
+ * The device list had the only column sort in the app
5
+ * (`composites/device-list/sort.ts`), typed to `DeviceItemDevice` and to three
6
+ * hard-coded column ids. Every other table in the admin UI was unsorted. This
7
+ * module is that same behaviour, generic: `DataTable` owns the state, a column
8
+ * opts in by declaring `sortValue`, and `device-list` keeps its domain
9
+ * comparators while delegating the toggle here. There is no second sort.
10
+ *
11
+ * The three rules are inherited verbatim from the device list, because they
12
+ * were argued there and they are the reason a sorted table stays readable:
13
+ *
14
+ * 1. **`null` sorts LAST in both directions.** A missing value is "unknown",
15
+ * not a value to reverse. Flipping the direction must never promote the
16
+ * rows that have nothing to say to the top.
17
+ * 2. **Stable.** `Array.prototype.toSorted` is stable in every runtime we
18
+ * ship to, so rows with an equal key keep the order they arrived in —
19
+ * which is usually a meaningful order already (topology order, insertion
20
+ * order).
21
+ * 3. **Immutable.** The input array is never touched; a `null` sort returns a
22
+ * fresh copy in the incoming order.
23
+ *
24
+ * A column with no `sortValue` renders a plain static header and can never be
25
+ * clicked. That is deliberate and it is the point of `notSortableReason`: a
26
+ * composite cell (a list of capabilities, an argv blob, an interactive
27
+ * control) has no single value to order by, and inventing one — "by count",
28
+ * "alphabetically by full path" — produces an ordering that looks
29
+ * authoritative and means nothing.
30
+ */
31
+ /** Sort direction. There is no third state on the column; "unsorted" is the
32
+ * absence of a {@link TableSortState}. */
33
+ export type TableSortDirection = 'asc' | 'desc';
34
+ /** The table's single active sort. `null` at the table level = incoming order. */
35
+ export interface TableSortState {
36
+ /** `DataColumn.key` of the sorted column. */
37
+ readonly columnKey: string;
38
+ readonly dir: TableSortDirection;
39
+ }
40
+ /**
41
+ * What a sortable column contributes for one row.
42
+ *
43
+ * `null` means "this row has no value for this column" and always sorts last
44
+ * (rule 1). It is NOT the same as `0` or `''`, which are values and sort
45
+ * normally.
46
+ */
47
+ export type TableSortValue = string | number | null;
48
+ /**
49
+ * The toggle rule, and the only copy of it.
50
+ *
51
+ * none → asc → desc → none, and a click on a DIFFERENT column starts that
52
+ * column fresh at `asc`. `sameColumn` says whether the clicked column is the
53
+ * one currently sorted; `currentDir` is its direction (`null` when nothing is
54
+ * sorted). Returns the next direction, or `null` for "unsorted".
55
+ *
56
+ * Split out from {@link nextTableSort} so the device list — whose sort state
57
+ * keys columns by `columnId`, not `columnKey` — can reuse the rule without a
58
+ * cast and without a second copy of it.
59
+ */
60
+ export declare function nextSortDirection(sameColumn: boolean, currentDir: TableSortDirection | null): TableSortDirection | null;
61
+ /**
62
+ * Toggle a column's sort on header click: none → asc → desc → none.
63
+ * Clicking a DIFFERENT column starts it fresh at `asc`.
64
+ */
65
+ export declare function nextTableSort(current: TableSortState | null, columnKey: string): TableSortState | null;
66
+ /**
67
+ * Return a NEW array of `rows` ordered by `sort`.
68
+ *
69
+ * `valueOf` is the column's `sortValue` — it is called once per row per
70
+ * comparison, so it must be cheap (read a field, do not format a string).
71
+ * `sort === null` ⇒ a fresh shallow copy in the incoming order.
72
+ */
73
+ export declare function sortRowsByColumn<T>(rows: readonly T[], sort: TableSortState | null, valueOf: (row: T) => TableSortValue): readonly T[];
74
+ /** The `aria-sort` value WAI-ARIA scopes to a `<th>` (never to an inner control). */
75
+ export type AriaSortValue = 'ascending' | 'descending' | 'none';
76
+ /** Derive the `<th>` `aria-sort` for `columnKey` from the table's sort state. */
77
+ export declare function ariaSortForColumn(sort: TableSortState | null, columnKey: string): AriaSortValue;
@@ -875,8 +875,8 @@ export declare const useMetricsProviderListAddonInstances: typeof trpc.metricsPr
875
875
  export declare const useMetricsProviderGetAddonStats: typeof trpc.metricsProvider.getAddonStats.useQuery;
876
876
  /** Generated alias around `trpc.metricsProvider.listNodeProcesses.useQuery`. */
877
877
  export declare const useMetricsProviderListNodeProcesses: typeof trpc.metricsProvider.listNodeProcesses.useQuery;
878
- /** Generated alias around `trpc.metricsProvider.killProcess.useMutation`. */
879
- export declare const useMetricsProviderKillProcess: typeof trpc.metricsProvider.killProcess.useMutation;
878
+ /** Generated alias around `trpc.metricsProvider.getLoadSeries.useQuery`. */
879
+ export declare const useMetricsProviderGetLoadSeries: typeof trpc.metricsProvider.getLoadSeries.useQuery;
880
880
  /** Generated alias around `trpc.metricsProvider.dumpHeapSnapshot.useMutation`. */
881
881
  export declare const useMetricsProviderDumpHeapSnapshot: typeof trpc.metricsProvider.dumpHeapSnapshot.useMutation;
882
882
  /** Generated alias around `trpc.motion.isDetected.useQuery`. */
@@ -1579,6 +1579,8 @@ export declare const useSettingsStoreSet: typeof trpc.settingsStore.set.useMutat
1579
1579
  export declare const useSettingsStoreQuery: typeof trpc.settingsStore.query.useQuery;
1580
1580
  /** Generated alias around `trpc.settingsStore.insert.useMutation`. */
1581
1581
  export declare const useSettingsStoreInsert: typeof trpc.settingsStore.insert.useMutation;
1582
+ /** Generated alias around `trpc.settingsStore.insertMany.useMutation`. */
1583
+ export declare const useSettingsStoreInsertMany: typeof trpc.settingsStore.insertMany.useMutation;
1582
1584
  /** Generated alias around `trpc.settingsStore.update.useMutation`. */
1583
1585
  export declare const useSettingsStoreUpdate: typeof trpc.settingsStore.update.useMutation;
1584
1586
  /** Generated alias around `trpc.settingsStore.delete.useMutation`. */
@@ -1781,6 +1783,8 @@ export declare const useSystemSetSiteLocation: typeof trpc.system.setSiteLocatio
1781
1783
  export declare const useSystemDetectSiteLocation: typeof trpc.system.detectSiteLocation.useMutation;
1782
1784
  /** Generated alias around `trpc.system.getRequestCensus.useQuery`. */
1783
1785
  export declare const useSystemGetRequestCensus: typeof trpc.system.getRequestCensus.useQuery;
1786
+ /** Generated alias around `trpc.system.getLoadContributions.useQuery`. */
1787
+ export declare const useSystemGetLoadContributions: typeof trpc.system.getLoadContributions.useQuery;
1784
1788
  /** Generated alias around `trpc.system.getLoggingSettings.useQuery`. */
1785
1789
  export declare const useSystemGetLoggingSettings: typeof trpc.system.getLoggingSettings.useQuery;
1786
1790
  /** Generated alias around `trpc.system.setLoggingSettings.useMutation`. */
package/dist/index.cjs CHANGED
@@ -5789,8 +5789,8 @@ var useMetricsProviderListAddonInstances = trpc.metricsProvider.listAddonInstanc
5789
5789
  var useMetricsProviderGetAddonStats = trpc.metricsProvider.getAddonStats.useQuery;
5790
5790
  /** Generated alias around `trpc.metricsProvider.listNodeProcesses.useQuery`. */
5791
5791
  var useMetricsProviderListNodeProcesses = trpc.metricsProvider.listNodeProcesses.useQuery;
5792
- /** Generated alias around `trpc.metricsProvider.killProcess.useMutation`. */
5793
- var useMetricsProviderKillProcess = trpc.metricsProvider.killProcess.useMutation;
5792
+ /** Generated alias around `trpc.metricsProvider.getLoadSeries.useQuery`. */
5793
+ var useMetricsProviderGetLoadSeries = trpc.metricsProvider.getLoadSeries.useQuery;
5794
5794
  /** Generated alias around `trpc.metricsProvider.dumpHeapSnapshot.useMutation`. */
5795
5795
  var useMetricsProviderDumpHeapSnapshot = trpc.metricsProvider.dumpHeapSnapshot.useMutation;
5796
5796
  /** Generated alias around `trpc.motion.isDetected.useQuery`. */
@@ -6493,6 +6493,8 @@ var useSettingsStoreSet = trpc.settingsStore.set.useMutation;
6493
6493
  var useSettingsStoreQuery = trpc.settingsStore.query.useQuery;
6494
6494
  /** Generated alias around `trpc.settingsStore.insert.useMutation`. */
6495
6495
  var useSettingsStoreInsert = trpc.settingsStore.insert.useMutation;
6496
+ /** Generated alias around `trpc.settingsStore.insertMany.useMutation`. */
6497
+ var useSettingsStoreInsertMany = trpc.settingsStore.insertMany.useMutation;
6496
6498
  /** Generated alias around `trpc.settingsStore.update.useMutation`. */
6497
6499
  var useSettingsStoreUpdate = trpc.settingsStore.update.useMutation;
6498
6500
  /** Generated alias around `trpc.settingsStore.delete.useMutation`. */
@@ -6695,6 +6697,8 @@ var useSystemSetSiteLocation = trpc.system.setSiteLocation.useMutation;
6695
6697
  var useSystemDetectSiteLocation = trpc.system.detectSiteLocation.useMutation;
6696
6698
  /** Generated alias around `trpc.system.getRequestCensus.useQuery`. */
6697
6699
  var useSystemGetRequestCensus = trpc.system.getRequestCensus.useQuery;
6700
+ /** Generated alias around `trpc.system.getLoadContributions.useQuery`. */
6701
+ var useSystemGetLoadContributions = trpc.system.getLoadContributions.useQuery;
6698
6702
  /** Generated alias around `trpc.system.getLoggingSettings.useQuery`. */
6699
6703
  var useSystemGetLoggingSettings = trpc.system.getLoggingSettings.useQuery;
6700
6704
  /** Generated alias around `trpc.system.setLoggingSettings.useMutation`. */
@@ -26158,8 +26162,138 @@ function SettingRow({ label, children, actions, elements = "plain", className, v
26158
26162
  });
26159
26163
  }
26160
26164
  //#endregion
26165
+ //#region src/composites/sort-header-button.tsx
26166
+ function SortHeaderButton({ label, active, dir, onSort }) {
26167
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
26168
+ type: "button",
26169
+ onClick: onSort,
26170
+ className: "group/sort inline-flex items-center gap-0.5 hover:text-foreground transition-colors",
26171
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: label }), active ? dir === "asc" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ChevronUp, { className: "h-3 w-3 flex-shrink-0" }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ChevronDown, { className: "h-3 w-3 flex-shrink-0" }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ChevronUp, { className: cn("h-3 w-3 flex-shrink-0 opacity-0 transition-opacity", "group-hover/sort:opacity-30") })]
26172
+ });
26173
+ }
26174
+ //#endregion
26175
+ //#region src/composites/table-sort.ts
26176
+ /**
26177
+ * The toggle rule, and the only copy of it.
26178
+ *
26179
+ * none → asc → desc → none, and a click on a DIFFERENT column starts that
26180
+ * column fresh at `asc`. `sameColumn` says whether the clicked column is the
26181
+ * one currently sorted; `currentDir` is its direction (`null` when nothing is
26182
+ * sorted). Returns the next direction, or `null` for "unsorted".
26183
+ *
26184
+ * Split out from {@link nextTableSort} so the device list — whose sort state
26185
+ * keys columns by `columnId`, not `columnKey` — can reuse the rule without a
26186
+ * cast and without a second copy of it.
26187
+ */
26188
+ function nextSortDirection(sameColumn, currentDir) {
26189
+ if (!sameColumn || currentDir === null) return "asc";
26190
+ return currentDir === "asc" ? "desc" : null;
26191
+ }
26192
+ /**
26193
+ * Toggle a column's sort on header click: none → asc → desc → none.
26194
+ * Clicking a DIFFERENT column starts it fresh at `asc`.
26195
+ */
26196
+ function nextTableSort(current, columnKey) {
26197
+ const dir = nextSortDirection(current !== null && current.columnKey === columnKey, current === null ? null : current.dir);
26198
+ return dir === null ? null : {
26199
+ columnKey,
26200
+ dir
26201
+ };
26202
+ }
26203
+ /**
26204
+ * Ascending comparison of two cell values.
26205
+ *
26206
+ * Numbers compare numerically and strings compare with `localeCompare` — a
26207
+ * numeric column must never be ordered as text ("100" before "9"), and a text
26208
+ * column must respect the locale's collation. A mixed column (one row a
26209
+ * number, another a string) falls back to string comparison of both, which is
26210
+ * the only total order available; it is not a shape any caller should build on
26211
+ * purpose.
26212
+ *
26213
+ * `null` is NOT handled here — {@link sortRowsByColumn} pulls it out first,
26214
+ * because its placement is direction-independent and a comparator that is
26215
+ * multiplied by the direction factor cannot express that.
26216
+ */
26217
+ function compareValues(a, b) {
26218
+ if (typeof a === "number" && typeof b === "number") return a - b;
26219
+ return String(a).localeCompare(String(b));
26220
+ }
26221
+ /**
26222
+ * Return a NEW array of `rows` ordered by `sort`.
26223
+ *
26224
+ * `valueOf` is the column's `sortValue` — it is called once per row per
26225
+ * comparison, so it must be cheap (read a field, do not format a string).
26226
+ * `sort === null` ⇒ a fresh shallow copy in the incoming order.
26227
+ */
26228
+ function sortRowsByColumn(rows, sort, valueOf) {
26229
+ if (sort === null) return [...rows];
26230
+ const factor = sort.dir === "asc" ? 1 : -1;
26231
+ return rows.toSorted((a, b) => {
26232
+ const av = valueOf(a);
26233
+ const bv = valueOf(b);
26234
+ if (av === null || bv === null) {
26235
+ if (av === bv) return 0;
26236
+ return av === null ? 1 : -1;
26237
+ }
26238
+ return factor * compareValues(av, bv);
26239
+ });
26240
+ }
26241
+ /** Derive the `<th>` `aria-sort` for `columnKey` from the table's sort state. */
26242
+ function ariaSortForColumn(sort, columnKey) {
26243
+ if (sort === null || sort.columnKey !== columnKey) return "none";
26244
+ return sort.dir === "asc" ? "ascending" : "descending";
26245
+ }
26246
+ //#endregion
26161
26247
  //#region src/composites/data-table.tsx
26162
26248
  /**
26249
+ * DataTable — shared responsive table for admin pages.
26250
+ *
26251
+ * Recipes baked in:
26252
+ * - `overflow-x-auto` wrapper so narrow viewports don't clip the
26253
+ * right edge (the rounded border survives the scroll).
26254
+ * - `min-w-[Npx]` on the inner table so columns don't squash below
26255
+ * readable width before the scroll kicks in.
26256
+ * - `whitespace-nowrap` on headers — column titles never wrap to
26257
+ * two lines (`AUTO-KILL` was the regression that triggered this).
26258
+ * - Themed `bg-surface` + `border-border` so contrast works in both
26259
+ * light and dark themes.
26260
+ *
26261
+ * Column model: caller supplies `columns: DataColumn<T>[]` and
26262
+ * `rows: T[]`. Each column declares `header`, optional `align`,
26263
+ * optional `nowrap`, and a `render(row) => ReactNode` that produces
26264
+ * the cell content.
26265
+ *
26266
+ * <DataTable
26267
+ * columns={[
26268
+ * { key: 'username', header: 'Username', render: (u) => u.username },
26269
+ * { key: 'role', header: 'Role', render: (u) => <RoleBadge .../> },
26270
+ * { key: 'actions', header: '', align: 'right', render: (u) => <Actions .../> },
26271
+ * ]}
26272
+ * rows={users}
26273
+ * minWidthPx={560}
26274
+ * />
26275
+ *
26276
+ * If finer header markup is needed, pass `headerRender` instead of
26277
+ * `header` (e.g. for a sortable click affordance).
26278
+ *
26279
+ * ── Narrow viewports ──────────────────────────────────────────────────────
26280
+ * Below the mobile breakpoint a table with `CARD_MODE_MIN_COLUMNS` columns or
26281
+ * more re-renders as one card per row (label above value) instead of a
26282
+ * sideways scroll through a slit. Narrower tables keep their rows — they fit,
26283
+ * and aligned rows compare better than cards. `mobileMode` overrides per
26284
+ * table; see `resolveTableLayout` for the rule and the reasoning.
26285
+ *
26286
+ * ── Scrolling the BODY, not the page ──────────────────────────────────────
26287
+ * `maxBodyHeight` caps the table and scrolls its rows INSIDE the container
26288
+ * with the column header pinned. It is ONE prop, not two, because "this list
26289
+ * scrolls internally" and "its header stays visible" are the same decision: a
26290
+ * capped table whose header scrolls away is a list of unlabelled cells.
26291
+ *
26292
+ * Use it wherever the row count is open-ended (rules, targets, delivery
26293
+ * history) so the page keeps its own header, filters and actions in view while
26294
+ * the operator moves through the rows.
26295
+ */
26296
+ /**
26163
26297
  * The default cap for an internally-scrolling table.
26164
26298
  *
26165
26299
  * `60vh` leaves the page header, its filters and its actions on screen at
@@ -26172,14 +26306,23 @@ var ALIGN_CLASS = {
26172
26306
  right: "text-right",
26173
26307
  center: "text-center"
26174
26308
  };
26175
- function DataTable({ columns, rows, rowKey, onRowClick, minWidthPx = 480, emptyMessage, className, bordered = true, rowClassName, mobileMode = "auto", maxBodyHeight }) {
26309
+ function DataTable({ columns, rows, rowKey, onRowClick, minWidthPx = 480, emptyMessage, className, bordered = true, rowClassName, mobileMode = "auto", maxBodyHeight, defaultSort }) {
26176
26310
  const isNarrow = useIsMobile();
26311
+ const [sort, setSort] = (0, react$1.useState)(defaultSort ?? null);
26177
26312
  const layout = resolveTableLayout({
26178
26313
  mode: mobileMode,
26179
26314
  columnCount: columns.length,
26180
26315
  isNarrow
26181
26316
  });
26182
26317
  const scrolls = maxBodyHeight !== void 0;
26318
+ const sortedColumn = (0, react$1.useMemo)(() => sort === null ? void 0 : columns.find((col) => col.key === sort.columnKey && col.sortValue !== void 0), [columns, sort]);
26319
+ const sortValue = sortedColumn?.sortValue;
26320
+ const displayRows = (0, react$1.useMemo)(() => sortValue === void 0 ? rows : sortRowsByColumn(rows, sort, sortValue), [
26321
+ rows,
26322
+ sort,
26323
+ sortValue
26324
+ ]);
26325
+ const activeSort = sortedColumn === void 0 ? null : sort;
26183
26326
  if (rows.length === 0 && emptyMessage) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
26184
26327
  className: `rounded-lg ${bordered ? "border border-border" : ""} bg-surface px-3 py-4 text-xs text-foreground-subtle text-center ${className ?? ""}`,
26185
26328
  children: emptyMessage
@@ -26187,7 +26330,7 @@ function DataTable({ columns, rows, rowKey, onRowClick, minWidthPx = 480, emptyM
26187
26330
  if (rows.length === 0) return null;
26188
26331
  if (layout === "cards") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
26189
26332
  className: `space-y-2 ${scrolls ? `${maxBodyHeight} overflow-y-auto` : ""} ${className ?? ""}`,
26190
- children: rows.map((row, rowIndex) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DataTableCard, {
26333
+ children: displayRows.map((row, rowIndex) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DataTableCard, {
26191
26334
  row,
26192
26335
  rowIndex,
26193
26336
  columns,
@@ -26212,7 +26355,11 @@ function DataTable({ columns, rows, rowKey, onRowClick, minWidthPx = 480, emptyM
26212
26355
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("tr", { children: columns.map((col) => {
26213
26356
  const align = col.align ?? "left";
26214
26357
  const nowrap = col.nowrap ?? true;
26358
+ const sortable = col.sortValue !== void 0;
26359
+ const isSorted = activeSort !== null && activeSort.columnKey === col.key;
26215
26360
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
26361
+ "aria-sort": sortable ? ariaSortForColumn(activeSort, col.key) : void 0,
26362
+ title: sortable ? void 0 : col.notSortableReason,
26216
26363
  className: [
26217
26364
  "px-3 py-2 text-foreground-subtle font-medium bg-surface border-b border-border",
26218
26365
  scrolls ? "sticky top-0 z-10" : "",
@@ -26220,10 +26367,15 @@ function DataTable({ columns, rows, rowKey, onRowClick, minWidthPx = 480, emptyM
26220
26367
  nowrap ? "whitespace-nowrap" : "",
26221
26368
  col.width ?? ""
26222
26369
  ].filter(Boolean).join(" "),
26223
- children: col.headerRender ? col.headerRender() : col.header
26370
+ children: sortable ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SortHeaderButton, {
26371
+ label: col.headerRender ? col.headerRender() : col.header,
26372
+ active: isSorted,
26373
+ dir: isSorted && activeSort !== null ? activeSort.dir : "asc",
26374
+ onSort: () => setSort((prev) => nextTableSort(prev, col.key))
26375
+ }) : col.headerRender ? col.headerRender() : col.header
26224
26376
  }, col.key);
26225
26377
  }) })
26226
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("tbody", { children: rows.map((row, rowIndex) => {
26378
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("tbody", { children: displayRows.map((row, rowIndex) => {
26227
26379
  const key = rowKey ? rowKey(row, rowIndex) : rowIndex;
26228
26380
  const extra = rowClassName?.(row, rowIndex) ?? "";
26229
26381
  const interactive = onRowClick !== void 0;
@@ -42849,11 +43001,14 @@ function CardsLayout({ rows, accessoriesByParent, trpc, resolveIntegrationIcon,
42849
43001
  //#region src/composites/device-list/sortable-header.tsx
42850
43002
  function SortableHeaderButton({ columnId, label, sort, onSort }) {
42851
43003
  const active = sort !== null && sort.columnId === columnId;
42852
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
42853
- type: "button",
42854
- onClick: () => onSort(columnId),
42855
- className: "group/sort inline-flex items-center gap-0.5 uppercase tracking-wider hover:text-foreground transition-colors",
42856
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: label }), active ? sort.dir === "asc" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ChevronUp, { className: "h-3 w-3 flex-shrink-0" }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ChevronDown, { className: "h-3 w-3 flex-shrink-0" }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ChevronUp, { className: cn("h-3 w-3 flex-shrink-0 opacity-0 transition-opacity", "group-hover/sort:opacity-30") })]
43004
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SortHeaderButton, {
43005
+ label: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
43006
+ className: "uppercase tracking-wider",
43007
+ children: label
43008
+ }),
43009
+ active,
43010
+ dir: active ? sort.dir : "asc",
43011
+ onSort: () => onSort(columnId)
42857
43012
  });
42858
43013
  }
42859
43014
  //#endregion
@@ -43131,17 +43286,17 @@ function ascComparator(columnId) {
43131
43286
  /**
43132
43287
  * Toggle a column's sort on header click: none → asc → desc → none.
43133
43288
  * Clicking a DIFFERENT column starts it fresh at `asc`.
43289
+ *
43290
+ * The rule itself lives in `composites/table-sort.ts` and is shared with
43291
+ * `DataTable` — this function only re-labels the result with the device
43292
+ * list's own `columnId` vocabulary.
43134
43293
  */
43135
43294
  function nextSort(current, columnId) {
43136
- if (current === null || current.columnId !== columnId) return {
43295
+ const dir = nextSortDirection(current !== null && current.columnId === columnId, current === null ? null : current.dir);
43296
+ return dir === null ? null : {
43137
43297
  columnId,
43138
- dir: "asc"
43298
+ dir
43139
43299
  };
43140
- if (current.dir === "asc") return {
43141
- columnId,
43142
- dir: "desc"
43143
- };
43144
- return null;
43145
43300
  }
43146
43301
  /**
43147
43302
  * Return a NEW array of the top-level rows in sorted order. `null` ⇒ a fresh
@@ -49031,6 +49186,7 @@ exports.Skeleton = Skeleton;
49031
49186
  exports.SlideOverPanel = SlideOverPanel;
49032
49187
  exports.SlideToggle = SlideToggle;
49033
49188
  exports.SnapshotButton = SnapshotButton;
49189
+ exports.SortHeaderButton = SortHeaderButton;
49034
49190
  exports.Square = Square;
49035
49191
  exports.StatCard = StatCard;
49036
49192
  exports.StateValuesStream = StateValuesStream;
@@ -49083,6 +49239,7 @@ exports.WidgetSlot = WidgetSlot;
49083
49239
  exports.ZoneEditingProvider = ZoneEditingProvider;
49084
49240
  exports.agentColumnKey = agentColumnKey;
49085
49241
  exports.allDeviceTypeFilterOptions = allDeviceTypeFilterOptions;
49242
+ exports.ariaSortForColumn = ariaSortForColumn;
49086
49243
  exports.badgeFor = badgeFor;
49087
49244
  exports.badgeFor$1 = badgeFor;
49088
49245
  exports.buildStepTreeFromSchema = buildStepTreeFromSchema;
@@ -49140,6 +49297,8 @@ exports.mirror = mirror;
49140
49297
  exports.mountAddonPage = mountAddonPage;
49141
49298
  exports.nextReconnectAction = nextReconnectAction;
49142
49299
  exports.nextSort = nextSort;
49300
+ exports.nextSortDirection = nextSortDirection;
49301
+ exports.nextTableSort = nextTableSort;
49143
49302
  exports.normalizeForSearch = normalizeForSearch;
49144
49303
  exports.overrideEntityIdFromLink = overrideEntityIdFromLink;
49145
49304
  exports.parseRecordedServerMessage = parseRecordedServerMessage;
@@ -49164,6 +49323,7 @@ exports.shouldCommit = shouldCommit;
49164
49323
  exports.shouldEmit = shouldEmit;
49165
49324
  exports.shouldUseSingleNode = shouldUseSingleNode;
49166
49325
  exports.sortRows = sortRows;
49326
+ exports.sortRowsByColumn = sortRowsByColumn;
49167
49327
  exports.statusIcons = statusIcons;
49168
49328
  exports.statusLine = statusLine;
49169
49329
  exports.statusLine$1 = statusLine;
@@ -49643,8 +49803,8 @@ exports.useMetricsProviderGetCpuTemperature = useMetricsProviderGetCpuTemperatur
49643
49803
  exports.useMetricsProviderGetCurrent = useMetricsProviderGetCurrent;
49644
49804
  exports.useMetricsProviderGetDiskSpace = useMetricsProviderGetDiskSpace;
49645
49805
  exports.useMetricsProviderGetGpuInfo = useMetricsProviderGetGpuInfo;
49806
+ exports.useMetricsProviderGetLoadSeries = useMetricsProviderGetLoadSeries;
49646
49807
  exports.useMetricsProviderGetProcessStats = useMetricsProviderGetProcessStats;
49647
- exports.useMetricsProviderKillProcess = useMetricsProviderKillProcess;
49648
49808
  exports.useMetricsProviderListAddonInstances = useMetricsProviderListAddonInstances;
49649
49809
  exports.useMetricsProviderListNodeProcesses = useMetricsProviderListNodeProcesses;
49650
49810
  exports.useMotionDetectionAnalyze = useMotionDetectionAnalyze;
@@ -50012,6 +50172,7 @@ exports.useSettingsStoreDeleteWhere = useSettingsStoreDeleteWhere;
50012
50172
  exports.useSettingsStoreGet = useSettingsStoreGet;
50013
50173
  exports.useSettingsStoreHistogram = useSettingsStoreHistogram;
50014
50174
  exports.useSettingsStoreInsert = useSettingsStoreInsert;
50175
+ exports.useSettingsStoreInsertMany = useSettingsStoreInsertMany;
50015
50176
  exports.useSettingsStoreIsEmpty = useSettingsStoreIsEmpty;
50016
50177
  exports.useSettingsStoreQuery = useSettingsStoreQuery;
50017
50178
  exports.useSettingsStoreSet = useSettingsStoreSet;
@@ -50103,6 +50264,7 @@ exports.useSystem$1 = useSystem;
50103
50264
  exports.useSystemDetectSiteLocation = useSystemDetectSiteLocation;
50104
50265
  exports.useSystemFeatureFlags = useSystemFeatureFlags;
50105
50266
  exports.useSystemForceRetentionCleanup = useSystemForceRetentionCleanup;
50267
+ exports.useSystemGetLoadContributions = useSystemGetLoadContributions;
50106
50268
  exports.useSystemGetLoggingSettings = useSystemGetLoggingSettings;
50107
50269
  exports.useSystemGetRequestCensus = useSystemGetRequestCensus;
50108
50270
  exports.useSystemGetRetentionConfig = useSystemGetRetentionConfig;
package/dist/index.js CHANGED
@@ -5765,8 +5765,8 @@ var useMetricsProviderListAddonInstances = trpc.metricsProvider.listAddonInstanc
5765
5765
  var useMetricsProviderGetAddonStats = trpc.metricsProvider.getAddonStats.useQuery;
5766
5766
  /** Generated alias around `trpc.metricsProvider.listNodeProcesses.useQuery`. */
5767
5767
  var useMetricsProviderListNodeProcesses = trpc.metricsProvider.listNodeProcesses.useQuery;
5768
- /** Generated alias around `trpc.metricsProvider.killProcess.useMutation`. */
5769
- var useMetricsProviderKillProcess = trpc.metricsProvider.killProcess.useMutation;
5768
+ /** Generated alias around `trpc.metricsProvider.getLoadSeries.useQuery`. */
5769
+ var useMetricsProviderGetLoadSeries = trpc.metricsProvider.getLoadSeries.useQuery;
5770
5770
  /** Generated alias around `trpc.metricsProvider.dumpHeapSnapshot.useMutation`. */
5771
5771
  var useMetricsProviderDumpHeapSnapshot = trpc.metricsProvider.dumpHeapSnapshot.useMutation;
5772
5772
  /** Generated alias around `trpc.motion.isDetected.useQuery`. */
@@ -6469,6 +6469,8 @@ var useSettingsStoreSet = trpc.settingsStore.set.useMutation;
6469
6469
  var useSettingsStoreQuery = trpc.settingsStore.query.useQuery;
6470
6470
  /** Generated alias around `trpc.settingsStore.insert.useMutation`. */
6471
6471
  var useSettingsStoreInsert = trpc.settingsStore.insert.useMutation;
6472
+ /** Generated alias around `trpc.settingsStore.insertMany.useMutation`. */
6473
+ var useSettingsStoreInsertMany = trpc.settingsStore.insertMany.useMutation;
6472
6474
  /** Generated alias around `trpc.settingsStore.update.useMutation`. */
6473
6475
  var useSettingsStoreUpdate = trpc.settingsStore.update.useMutation;
6474
6476
  /** Generated alias around `trpc.settingsStore.delete.useMutation`. */
@@ -6671,6 +6673,8 @@ var useSystemSetSiteLocation = trpc.system.setSiteLocation.useMutation;
6671
6673
  var useSystemDetectSiteLocation = trpc.system.detectSiteLocation.useMutation;
6672
6674
  /** Generated alias around `trpc.system.getRequestCensus.useQuery`. */
6673
6675
  var useSystemGetRequestCensus = trpc.system.getRequestCensus.useQuery;
6676
+ /** Generated alias around `trpc.system.getLoadContributions.useQuery`. */
6677
+ var useSystemGetLoadContributions = trpc.system.getLoadContributions.useQuery;
6674
6678
  /** Generated alias around `trpc.system.getLoggingSettings.useQuery`. */
6675
6679
  var useSystemGetLoggingSettings = trpc.system.getLoggingSettings.useQuery;
6676
6680
  /** Generated alias around `trpc.system.setLoggingSettings.useMutation`. */
@@ -26134,8 +26138,138 @@ function SettingRow({ label, children, actions, elements = "plain", className, v
26134
26138
  });
26135
26139
  }
26136
26140
  //#endregion
26141
+ //#region src/composites/sort-header-button.tsx
26142
+ function SortHeaderButton({ label, active, dir, onSort }) {
26143
+ return /* @__PURE__ */ jsxs("button", {
26144
+ type: "button",
26145
+ onClick: onSort,
26146
+ className: "group/sort inline-flex items-center gap-0.5 hover:text-foreground transition-colors",
26147
+ 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") })]
26148
+ });
26149
+ }
26150
+ //#endregion
26151
+ //#region src/composites/table-sort.ts
26152
+ /**
26153
+ * The toggle rule, and the only copy of it.
26154
+ *
26155
+ * none → asc → desc → none, and a click on a DIFFERENT column starts that
26156
+ * column fresh at `asc`. `sameColumn` says whether the clicked column is the
26157
+ * one currently sorted; `currentDir` is its direction (`null` when nothing is
26158
+ * sorted). Returns the next direction, or `null` for "unsorted".
26159
+ *
26160
+ * Split out from {@link nextTableSort} so the device list — whose sort state
26161
+ * keys columns by `columnId`, not `columnKey` — can reuse the rule without a
26162
+ * cast and without a second copy of it.
26163
+ */
26164
+ function nextSortDirection(sameColumn, currentDir) {
26165
+ if (!sameColumn || currentDir === null) return "asc";
26166
+ return currentDir === "asc" ? "desc" : null;
26167
+ }
26168
+ /**
26169
+ * Toggle a column's sort on header click: none → asc → desc → none.
26170
+ * Clicking a DIFFERENT column starts it fresh at `asc`.
26171
+ */
26172
+ function nextTableSort(current, columnKey) {
26173
+ const dir = nextSortDirection(current !== null && current.columnKey === columnKey, current === null ? null : current.dir);
26174
+ return dir === null ? null : {
26175
+ columnKey,
26176
+ dir
26177
+ };
26178
+ }
26179
+ /**
26180
+ * Ascending comparison of two cell values.
26181
+ *
26182
+ * Numbers compare numerically and strings compare with `localeCompare` — a
26183
+ * numeric column must never be ordered as text ("100" before "9"), and a text
26184
+ * column must respect the locale's collation. A mixed column (one row a
26185
+ * number, another a string) falls back to string comparison of both, which is
26186
+ * the only total order available; it is not a shape any caller should build on
26187
+ * purpose.
26188
+ *
26189
+ * `null` is NOT handled here — {@link sortRowsByColumn} pulls it out first,
26190
+ * because its placement is direction-independent and a comparator that is
26191
+ * multiplied by the direction factor cannot express that.
26192
+ */
26193
+ function compareValues(a, b) {
26194
+ if (typeof a === "number" && typeof b === "number") return a - b;
26195
+ return String(a).localeCompare(String(b));
26196
+ }
26197
+ /**
26198
+ * Return a NEW array of `rows` ordered by `sort`.
26199
+ *
26200
+ * `valueOf` is the column's `sortValue` — it is called once per row per
26201
+ * comparison, so it must be cheap (read a field, do not format a string).
26202
+ * `sort === null` ⇒ a fresh shallow copy in the incoming order.
26203
+ */
26204
+ function sortRowsByColumn(rows, sort, valueOf) {
26205
+ if (sort === null) return [...rows];
26206
+ const factor = sort.dir === "asc" ? 1 : -1;
26207
+ return rows.toSorted((a, b) => {
26208
+ const av = valueOf(a);
26209
+ const bv = valueOf(b);
26210
+ if (av === null || bv === null) {
26211
+ if (av === bv) return 0;
26212
+ return av === null ? 1 : -1;
26213
+ }
26214
+ return factor * compareValues(av, bv);
26215
+ });
26216
+ }
26217
+ /** Derive the `<th>` `aria-sort` for `columnKey` from the table's sort state. */
26218
+ function ariaSortForColumn(sort, columnKey) {
26219
+ if (sort === null || sort.columnKey !== columnKey) return "none";
26220
+ return sort.dir === "asc" ? "ascending" : "descending";
26221
+ }
26222
+ //#endregion
26137
26223
  //#region src/composites/data-table.tsx
26138
26224
  /**
26225
+ * DataTable — shared responsive table for admin pages.
26226
+ *
26227
+ * Recipes baked in:
26228
+ * - `overflow-x-auto` wrapper so narrow viewports don't clip the
26229
+ * right edge (the rounded border survives the scroll).
26230
+ * - `min-w-[Npx]` on the inner table so columns don't squash below
26231
+ * readable width before the scroll kicks in.
26232
+ * - `whitespace-nowrap` on headers — column titles never wrap to
26233
+ * two lines (`AUTO-KILL` was the regression that triggered this).
26234
+ * - Themed `bg-surface` + `border-border` so contrast works in both
26235
+ * light and dark themes.
26236
+ *
26237
+ * Column model: caller supplies `columns: DataColumn<T>[]` and
26238
+ * `rows: T[]`. Each column declares `header`, optional `align`,
26239
+ * optional `nowrap`, and a `render(row) => ReactNode` that produces
26240
+ * the cell content.
26241
+ *
26242
+ * <DataTable
26243
+ * columns={[
26244
+ * { key: 'username', header: 'Username', render: (u) => u.username },
26245
+ * { key: 'role', header: 'Role', render: (u) => <RoleBadge .../> },
26246
+ * { key: 'actions', header: '', align: 'right', render: (u) => <Actions .../> },
26247
+ * ]}
26248
+ * rows={users}
26249
+ * minWidthPx={560}
26250
+ * />
26251
+ *
26252
+ * If finer header markup is needed, pass `headerRender` instead of
26253
+ * `header` (e.g. for a sortable click affordance).
26254
+ *
26255
+ * ── Narrow viewports ──────────────────────────────────────────────────────
26256
+ * Below the mobile breakpoint a table with `CARD_MODE_MIN_COLUMNS` columns or
26257
+ * more re-renders as one card per row (label above value) instead of a
26258
+ * sideways scroll through a slit. Narrower tables keep their rows — they fit,
26259
+ * and aligned rows compare better than cards. `mobileMode` overrides per
26260
+ * table; see `resolveTableLayout` for the rule and the reasoning.
26261
+ *
26262
+ * ── Scrolling the BODY, not the page ──────────────────────────────────────
26263
+ * `maxBodyHeight` caps the table and scrolls its rows INSIDE the container
26264
+ * with the column header pinned. It is ONE prop, not two, because "this list
26265
+ * scrolls internally" and "its header stays visible" are the same decision: a
26266
+ * capped table whose header scrolls away is a list of unlabelled cells.
26267
+ *
26268
+ * Use it wherever the row count is open-ended (rules, targets, delivery
26269
+ * history) so the page keeps its own header, filters and actions in view while
26270
+ * the operator moves through the rows.
26271
+ */
26272
+ /**
26139
26273
  * The default cap for an internally-scrolling table.
26140
26274
  *
26141
26275
  * `60vh` leaves the page header, its filters and its actions on screen at
@@ -26148,14 +26282,23 @@ var ALIGN_CLASS = {
26148
26282
  right: "text-right",
26149
26283
  center: "text-center"
26150
26284
  };
26151
- function DataTable({ columns, rows, rowKey, onRowClick, minWidthPx = 480, emptyMessage, className, bordered = true, rowClassName, mobileMode = "auto", maxBodyHeight }) {
26285
+ function DataTable({ columns, rows, rowKey, onRowClick, minWidthPx = 480, emptyMessage, className, bordered = true, rowClassName, mobileMode = "auto", maxBodyHeight, defaultSort }) {
26152
26286
  const isNarrow = useIsMobile();
26287
+ const [sort, setSort] = useState(defaultSort ?? null);
26153
26288
  const layout = resolveTableLayout({
26154
26289
  mode: mobileMode,
26155
26290
  columnCount: columns.length,
26156
26291
  isNarrow
26157
26292
  });
26158
26293
  const scrolls = maxBodyHeight !== void 0;
26294
+ const sortedColumn = useMemo(() => sort === null ? void 0 : columns.find((col) => col.key === sort.columnKey && col.sortValue !== void 0), [columns, sort]);
26295
+ const sortValue = sortedColumn?.sortValue;
26296
+ const displayRows = useMemo(() => sortValue === void 0 ? rows : sortRowsByColumn(rows, sort, sortValue), [
26297
+ rows,
26298
+ sort,
26299
+ sortValue
26300
+ ]);
26301
+ const activeSort = sortedColumn === void 0 ? null : sort;
26159
26302
  if (rows.length === 0 && emptyMessage) return /* @__PURE__ */ jsx("div", {
26160
26303
  className: `rounded-lg ${bordered ? "border border-border" : ""} bg-surface px-3 py-4 text-xs text-foreground-subtle text-center ${className ?? ""}`,
26161
26304
  children: emptyMessage
@@ -26163,7 +26306,7 @@ function DataTable({ columns, rows, rowKey, onRowClick, minWidthPx = 480, emptyM
26163
26306
  if (rows.length === 0) return null;
26164
26307
  if (layout === "cards") return /* @__PURE__ */ jsx("div", {
26165
26308
  className: `space-y-2 ${scrolls ? `${maxBodyHeight} overflow-y-auto` : ""} ${className ?? ""}`,
26166
- children: rows.map((row, rowIndex) => /* @__PURE__ */ jsx(DataTableCard, {
26309
+ children: displayRows.map((row, rowIndex) => /* @__PURE__ */ jsx(DataTableCard, {
26167
26310
  row,
26168
26311
  rowIndex,
26169
26312
  columns,
@@ -26188,7 +26331,11 @@ function DataTable({ columns, rows, rowKey, onRowClick, minWidthPx = 480, emptyM
26188
26331
  children: /* @__PURE__ */ jsx("tr", { children: columns.map((col) => {
26189
26332
  const align = col.align ?? "left";
26190
26333
  const nowrap = col.nowrap ?? true;
26334
+ const sortable = col.sortValue !== void 0;
26335
+ const isSorted = activeSort !== null && activeSort.columnKey === col.key;
26191
26336
  return /* @__PURE__ */ jsx("th", {
26337
+ "aria-sort": sortable ? ariaSortForColumn(activeSort, col.key) : void 0,
26338
+ title: sortable ? void 0 : col.notSortableReason,
26192
26339
  className: [
26193
26340
  "px-3 py-2 text-foreground-subtle font-medium bg-surface border-b border-border",
26194
26341
  scrolls ? "sticky top-0 z-10" : "",
@@ -26196,10 +26343,15 @@ function DataTable({ columns, rows, rowKey, onRowClick, minWidthPx = 480, emptyM
26196
26343
  nowrap ? "whitespace-nowrap" : "",
26197
26344
  col.width ?? ""
26198
26345
  ].filter(Boolean).join(" "),
26199
- children: col.headerRender ? col.headerRender() : col.header
26346
+ children: sortable ? /* @__PURE__ */ jsx(SortHeaderButton, {
26347
+ label: col.headerRender ? col.headerRender() : col.header,
26348
+ active: isSorted,
26349
+ dir: isSorted && activeSort !== null ? activeSort.dir : "asc",
26350
+ onSort: () => setSort((prev) => nextTableSort(prev, col.key))
26351
+ }) : col.headerRender ? col.headerRender() : col.header
26200
26352
  }, col.key);
26201
26353
  }) })
26202
- }), /* @__PURE__ */ jsx("tbody", { children: rows.map((row, rowIndex) => {
26354
+ }), /* @__PURE__ */ jsx("tbody", { children: displayRows.map((row, rowIndex) => {
26203
26355
  const key = rowKey ? rowKey(row, rowIndex) : rowIndex;
26204
26356
  const extra = rowClassName?.(row, rowIndex) ?? "";
26205
26357
  const interactive = onRowClick !== void 0;
@@ -42825,11 +42977,14 @@ function CardsLayout({ rows, accessoriesByParent, trpc, resolveIntegrationIcon,
42825
42977
  //#region src/composites/device-list/sortable-header.tsx
42826
42978
  function SortableHeaderButton({ columnId, label, sort, onSort }) {
42827
42979
  const active = sort !== null && sort.columnId === columnId;
42828
- return /* @__PURE__ */ jsxs("button", {
42829
- type: "button",
42830
- onClick: () => onSort(columnId),
42831
- className: "group/sort inline-flex items-center gap-0.5 uppercase tracking-wider hover:text-foreground transition-colors",
42832
- children: [/* @__PURE__ */ jsx("span", { children: label }), active ? sort.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") })]
42980
+ return /* @__PURE__ */ jsx(SortHeaderButton, {
42981
+ label: /* @__PURE__ */ jsx("span", {
42982
+ className: "uppercase tracking-wider",
42983
+ children: label
42984
+ }),
42985
+ active,
42986
+ dir: active ? sort.dir : "asc",
42987
+ onSort: () => onSort(columnId)
42833
42988
  });
42834
42989
  }
42835
42990
  //#endregion
@@ -43107,17 +43262,17 @@ function ascComparator(columnId) {
43107
43262
  /**
43108
43263
  * Toggle a column's sort on header click: none → asc → desc → none.
43109
43264
  * Clicking a DIFFERENT column starts it fresh at `asc`.
43265
+ *
43266
+ * The rule itself lives in `composites/table-sort.ts` and is shared with
43267
+ * `DataTable` — this function only re-labels the result with the device
43268
+ * list's own `columnId` vocabulary.
43110
43269
  */
43111
43270
  function nextSort(current, columnId) {
43112
- if (current === null || current.columnId !== columnId) return {
43271
+ const dir = nextSortDirection(current !== null && current.columnId === columnId, current === null ? null : current.dir);
43272
+ return dir === null ? null : {
43113
43273
  columnId,
43114
- dir: "asc"
43274
+ dir
43115
43275
  };
43116
- if (current.dir === "asc") return {
43117
- columnId,
43118
- dir: "desc"
43119
- };
43120
- return null;
43121
43276
  }
43122
43277
  /**
43123
43278
  * Return a NEW array of the top-level rows in sorted order. `null` ⇒ a fresh
@@ -48784,4 +48939,4 @@ var SceneMonitorEditor = lazy(() => import("./SceneMonitorEditor-d_A4kO-M.js").t
48784
48939
  /** Lazy-wrapped `PrivacyMaskSettings` — code-split off the main bundle. */
48785
48940
  var PrivacyMaskSettings = lazy(() => import("./PrivacyMaskSettings-DNSLc6ww.js").then((m) => ({ default: m.PrivacyMaskSettings })));
48786
48941
  //#endregion
48787
- 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, FanHeroCard, FanInlineControl, FanPanel, FilterBar, FloatingEventStream, FloatingLogStream, FloatingPanel, FormField$1 as FormField, GRID_GAP, GRID_PAIRED, GRID_QUICK_STATS, GripTrack, GroupedModelSelector, HOST_WIDGETS, HlsVideo, HoverZoomImage, HumidifierHeroCard, HumidifierInlineControl, INPUT_COMPACT, IconAction, IconButton, ImageHeroCard, ImageInlineControl, ImageSelector, InferenceConfigSelector, Input, KebabMenu, KeyValueList, LIST_ROW, Label, LawnMowerHeroCard, LawnMowerInlineControl, LightHeroCard, LightInlineControl, LockHeroCard, LockInlineControl, LockPanel, LogStream, LoginForm, MODE_COLOR, MaskShapeCanvas, MediaPlayerHeroCard, MediaPlayerInlineControl, MediaPlayerPanel, MobileDrawer, ModelPicker, MotionZonesSettings, NodeMultiSelectField, NodePicker, NodeSelectField, OfflineBadge, PHASE_CONFIG, PRIORITY, PTZOverlay, PageHeader, PhaseIcon, PipelineBuilder, PipelineRuntimeSelector, PipelineStep, PipelineTreeMatrix, PlayerOverlaysProvider, Popover, PopoverContent, PopoverRowAction, PopoverTrigger, PrimaryChildPicker, PrivacyMaskSettings, ProviderBadge, PtzPanel, QrCode, 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, 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, StatCard, StateValuesStream, StatusBadge, StepTimings, StepTreeMaster, Stepper, StreamBrokerSelector, 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, badgeFor, buildStepTreeFromSchema, createLucideIcon as c, childEntityId, childListName, cn, columnsForContext, containerChildToRef, countableDevices, coverHighlight, coverageLine, createSharedContext, createTheme, cursorFractionFor, darkColors, defaultTheme, deriveDeviceKind, describeDeviceSelector, deviceMatchesFilter, deviceOptionLabel, deviceRoleMeta, deviceRoleMetaOf, deviceTypeLabel, deviceTypeMeta, deviceTypeMetaOf, devicesToOptions, ensureMfHostInit, eventKindLabel, filterDeviceOptions, findTimezone, formatControlDateTime, formatLastSeen, formatNumeric, fuzzyMatch, getClassColor, getPhaseVisual, groupAgentColumns, groupChildrenByLayout, hardwareLabel, humanDuration, humidifierTint, Mic as i, initialScrubState, isAbsentProvider, isFieldVisible, lawnMowerActivityMeta, lightColors, loadRemoteBundle, makeScrubBridge, metadataEntries, metadataString, mirror, mountAddonPage, Square as n, nextReconnectAction, nextSort, normalizeForSearch, EyeOff as o, overrideEntityIdFromLink, parseRecordedServerMessage, providerIcons, RotateCcw as r, resolveContainerPrimary, resolveControlAlign, resolveDeviceControl, resolveDisplayIcon, resolveEffectiveDefaultModel, resolveEffectiveStepModel, resolveEventKindIcon, resolvePrimaryChild, resolveSensorDisplay, resolveStepDefaultModel, resolveTableLayout, roiTooLarge, Camera as s, scrubReducer, selectedDeviceOptions, serializeRecordedCommand, shouldCommit, shouldEmit, shouldUseSingleNode, sortRows, statusIcons, statusLine, stepHasModelForFormat, stepModelOptions, stripParentNamePrefix, Trash2 as t, tabForSelector, tankAlert, themeToCss, trpc, useAccessoriesGetStatus, useAccessoriesSetChildHidden, useAddonPagesListPages, useAddonSettingsGetDeviceSettings, useAddonSettingsGetGlobalSettings, useAddonSettingsUpdateDeviceSettings, useAddonSettingsUpdateGlobalSettings, useAddonWidgetsListWidgets, useAddonsApplyAutoUpdateToAll, useAddonsCancelJob, useAddonsCustom, useAddonsForceRefresh, useAddonsGetAddonAutoUpdate, useAddonsGetAutoUpdateSettings, useAddonsGetJob, useAddonsGetLastRestart, useAddonsGetLogs, useAddonsGetVersions, useAddonsInstallFromWorkspace, useAddonsInstallPackage, useAddonsIsWorkspaceAvailable, useAddonsList, useAddonsListCapabilityProviders, useAddonsListFrameworkPackages, useAddonsListJobs, useAddonsListPackages, useAddonsListUpdates, useAddonsListWorkspacePackages, useAddonsOnAddonLogs, useAddonsReloadPackages, useAddonsRestartAddon, useAddonsRestartServer, useAddonsRetryLoad, useAddonsRollbackPackage, useAddonsSearchAvailable, useAddonsSetAddonAutoUpdate, useAddonsSetAutoUpdateSettings, useAddonsSetCapabilityProviderEnabled, useAddonsStartJob, useAddonsUninstallPackage, useAddonsUpdatePackage, useAirQualitySensorGetStatus, useAlarmPanelArm, useAlarmPanelDisarm, useAlarmPanelGetStatus, useAlarmPanelTrigger, useAlertsDismiss, useAlertsEmit, useAlertsGetUnreadCount, useAlertsList, useAlertsMarkAllRead, useAlertsMarkRead, useAlertsUpdate, useAllWidgets, useAmbientLightSensorGetStatus, useAudioAnalysisApplyDeviceSettingsPatch, useAudioAnalysisGetDeviceLiveContribution, useAudioAnalysisGetDeviceSettingsContribution, useAudioAnalysisResolveDeviceSettings, useAudioAnalyzerAnalyseChunk, useAudioAnalyzerClassify, useAudioAnalyzerDispose, useAudioAnalyzerIsReady, useAudioAnalyzerReprobeAudioEngine, useAudioCodecCanHandle, useAudioCodecCloseSession, useAudioCodecCreateDecodeSession, useAudioCodecCreateEncodeSession, useAudioCodecFlushEncode, useAudioCodecListActiveSessions, useAudioCodecListSupportedCodecs, useAudioCodecPullEncoded, useAudioCodecPullPcm, useAudioCodecPushEncodedFrame, useAudioCodecPushPcm, useAudioMetricsGetCurrentSnapshot, useAudioMetricsGetHistory, useAutomationControlDisable, useAutomationControlEnable, useAutomationControlGetStatus, useAutomationControlTrigger, useBackupDelete, useBackupDeleteSchedule, useBackupGetEntries, useBackupList, useBackupListArchives, useBackupListDestinations, useBackupListLocations, useBackupListSchedules, useBackupPreviewSchedule, useBackupRestore, useBackupTrigger, useBackupUpsertDestinationPolicy, useBackupUpsertSchedule, useBatteryGetStatus, useBatteryWakeForStream, useBinaryGetStatus, useBrightnessGetStatus, useBrightnessSetBrightness, useBrokerAdd, useBrokerGet, useBrokerGetBrokerConfig, useBrokerGetSettings, useBrokerGetSettingsSchema, useBrokerGetState, useBrokerGetStatus, useBrokerList, useBrokerListProviders, useBrokerPublish, useBrokerRemove, useBrokerSetSettings, useBrokerSubscribe, useBrokerTestConnection, useBrokerTestSettings, useBrokerUnsubscribe, useButtonPress, useCameraCredentialsGetCredentials, useCameraCredentialsGetStatus, useCameraPipelineConfigApplyDeviceSettingsPatch, useCameraPipelineConfigGetDeviceLiveContribution, useCameraPipelineConfigGetDeviceSettingsContribution, useCameraStreamsGetBrokerStreams, useCameraStreamsGetCameraStreams, useCameraStreamsGetProfileRtspEntries, useCameraStreamsGetRtspEntries, useCameraStreamsPickStream, useCarbonMonoxideGetStatus, useClimateControlGetStatus, useClimateControlSetFanMode, useClimateControlSetMode, useClimateControlSetPreset, useClimateControlSetSwingHorizontal, useClimateControlSetSwingVertical, useClimateControlSetTarget, useClimateControlSetTargetHumidity, useClimateControlSetTargetRange, useClusterNodes, useColorGetStatus, useColorSetColor, useConfirm, 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, useDeviceManagerListLocations, useDeviceManagerListPersistedByAddon, useDeviceManagerListWrappersForCap, useDeviceManagerLoadConfig, useDeviceManagerLoadMeta, useDeviceManagerLoadRuntimeState, useDeviceManagerPersistConfig, useDeviceManagerProbeStreams, useDeviceManagerProviderCreationType, useDeviceManagerProviderDiscoveryParamsSchema, useDeviceManagerRegisterDevice, useDeviceManagerRemove, useDeviceManagerRemoveByIntegration, useDeviceManagerRemoveDevice, useDeviceManagerRemoveLocation, useDeviceManagerRunDeviceAction, useDeviceManagerSetChildLayout, useDeviceManagerSetDisabled, useDeviceManagerSetDisplay, useDeviceManagerSetIntegrationId, useDeviceManagerSetLinkDeviceId, useDeviceManagerSetLocation, useDeviceManagerSetMetadata, useDeviceManagerSetName, useDeviceManagerSetPrimaryChildEntityId, useDeviceManagerSetRole, useDeviceManagerSetRoleDisplayDefaults, useDeviceManagerSetStreamProfileMap, useDeviceManagerSetType, useDeviceManagerSetWrapperActive, useDeviceManagerTestCreationField, useDeviceManagerTestField, useDeviceManagerUpdateConfig, useDeviceManagerUpdateDeviceField, useDeviceManagerUpdateDeviceFieldsBatch, useDeviceOpsGetConfigEntries, useDeviceOpsGetRawState, useDeviceOpsGetSettingsSchema, useDeviceOpsGetStreamSources, useDeviceOpsRemoveDevice, useDeviceOpsRunAction, useDeviceOpsSetConfig, useDeviceProviderAdoptDiscoveredDevice, useDeviceProviderCreateDevice, useDeviceProviderDiscoverDevices, useDeviceProviderGetChildCreationSchema, useDeviceProviderGetDevices, useDeviceProviderGetDiscoveryParamsSchema, useDeviceProviderGetManualCreationType, useDeviceProviderGetStatus, useDeviceProviderStart, useDeviceProviderStop, useDeviceProviderSupportsDiscovery, useDeviceProviderSupportsManualCreation, useDeviceProviderTestCreationField, useDeviceProxy, useDeviceSnapshot, useDeviceSnapshotImage, useDeviceState, useDeviceStateGetAllSnapshots, useDeviceStateGetCapSlice, useDeviceStateGetSnapshot, useDeviceStateSetCapSlice, useDeviceStateSlice, useDeviceStatusGetStatus, useDeviceWebrtc, useDevices, useDoorbellApplyDeviceSettingsPatch, useDoorbellEvents, useDoorbellGetDeviceLiveContribution, useDoorbellGetDeviceSettingsContribution, useDoorbellGetStatus, useEnumSensorGetStatus, useEventEmitterGetStatus, useEventInvalidation, useEventStreamLatest, useEventStreamMap, useEventsGetEventClipUrl, useEventsGetEventThumbnail, useEventsGetEvents, useFaceGalleryAssignFace, useFaceGalleryAssignFaces, useFaceGalleryCreateIdentity, useFaceGalleryDeleteFace, useFaceGalleryDeleteIdentity, useFaceGalleryGetFaceByTrack, useFaceGalleryGetFaceMedia, useFaceGalleryListIdentities, useFaceGalleryListIdentitySamples, useFaceGalleryListRecentFaces, useFaceGalleryRemoveSample, useFaceGalleryRenameIdentity, useFaceGallerySuggestFaceClusters, useFaceGalleryUnassignFace, useFaceGalleryUnassignFaces, useFanControlGetStatus, useFanControlSetDirection, useFanControlSetOscillating, useFanControlSetPercentage, useFanControlSetPreset, useFeatureProbeGetStatus, useFloodGetStatus, useGasGetStatus, useHumidifierGetStatus, useHumidifierSetMode, useHumidifierSetOn, useHumidifierSetTargetHumidity, useHumiditySensorGetStatus, useImageGetStatus, useImageSettingsGetOptions, useImageSettingsGetStatus, useImageSettingsSetSettings, useIntegrationsCreate, useIntegrationsDelete, useIntegrationsGet, useIntegrationsGetAvailableTypes, useIntegrationsGetByAddonId, useIntegrationsGetSettings, useIntegrationsList, useIntegrationsSetSettings, useIntegrationsTestConnection, useIntegrationsUpdate, useIntercomEndTalkSession, useIntercomGetStatus, useIntercomHandleAnswer, useIntercomPushTalkAudio, useIntercomStartSession, useIntercomStartTalkSession, useIntercomStopSession, useIsMidWidth, useIsMobile, useLawnMowerControlDock, useLawnMowerControlGetStatus, useLawnMowerControlPause, useLawnMowerControlStartMowing, useLiveBuffer, useLiveEvent, 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, useMetricsProviderDumpHeapSnapshot, useMetricsProviderGetAddonStats, useMetricsProviderGetCached, useMetricsProviderGetCpuTemperature, useMetricsProviderGetCurrent, useMetricsProviderGetDiskSpace, useMetricsProviderGetGpuInfo, useMetricsProviderGetProcessStats, useMetricsProviderKillProcess, useMetricsProviderListAddonInstances, useMetricsProviderListNodeProcesses, useMotionDetectionAnalyze, useMotionDetectionApplyDeviceSettingsPatch, useMotionDetectionGetDeviceLiveContribution, useMotionDetectionGetDeviceSettingsContribution, useMotionDetectionRemoveCamera, useMotionDetectionReset, useMotionGetStatus, useMotionIsDetected, useMotionTriggerGetStatus, useMotionTriggerSetMotionTrigger, useMotionZonesGetOptions, useMotionZonesGetStatus, useMotionZonesSetZone, useMqttBrokerAddBroker, useMqttBrokerGetBrokerConfig, useMqttBrokerGetStatus, useMqttBrokerListBrokers, useMqttBrokerRemoveBroker, useMqttBrokerStartEmbeddedBroker, useMqttBrokerStopEmbeddedBroker, useMqttBrokerTestConnection, useNativeObjectDetectionGetStatus, useNativeObjectDetectionSetEnabled, useNetworkAccessGetEndpoint, useNetworkAccessGetStatus, useNetworkAccessListEndpoints, useNetworkAccessStart, useNetworkAccessStop, useNetworkQualityGetAllStats, useNetworkQualityGetDeviceStats, useNetworkQualityReportClientStats, useNodesClusterAddonStatus, useNodesDeployAddon, useNodesExecuteQuery, useNodesGetCapUsageGraph, useNodesGetNodeAddons, useNodesRenameNode, useNodesRestartAddon, useNodesRestartNode, useNodesRestartProcess, useNodesSetProcessLogLevel, useNodesShutdownNode, useNodesTopology, useNodesUndeployAddon, useNotificationOutputDeleteTarget, useNotificationOutputDiscoverTargets, useNotificationOutputListTargetKinds, useNotificationOutputListTargets, useNotificationOutputSend, useNotificationOutputSetTargetEnabled, useNotificationOutputTestTarget, useNotificationOutputUpsertTarget, useNotificationRulesCancelSnooze, useNotificationRulesCreateRule, useNotificationRulesCreateSnooze, useNotificationRulesDeleteRule, useNotificationRulesGetAlarmConfig, 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, usePipelineAnalyticsDeleteDeviceEvents, usePipelineAnalyticsDeleteTracks, usePipelineAnalyticsDeselectRetrainFrame, usePipelineAnalyticsGetActiveTracks, usePipelineAnalyticsGetAudioEvents, usePipelineAnalyticsGetDeviceLiveContribution, usePipelineAnalyticsGetDeviceSettingsContribution, usePipelineAnalyticsGetEventDensity, usePipelineAnalyticsGetEventMedia, usePipelineAnalyticsGetEventStoreFootprint, usePipelineAnalyticsGetGroup, usePipelineAnalyticsGetKeyEvents, usePipelineAnalyticsGetMotionEvents, usePipelineAnalyticsGetObjectEmbeddingRebuildStatus, usePipelineAnalyticsGetObjectEvents, usePipelineAnalyticsGetRetrainExportUrl, usePipelineAnalyticsGetRetrainFrameImage, usePipelineAnalyticsGetSensorEvents, usePipelineAnalyticsGetStorageMigrationMoveStatus, usePipelineAnalyticsGetTrack, usePipelineAnalyticsGetTrackMedia, usePipelineAnalyticsGetTrainingExportSummary, usePipelineAnalyticsGetTrainingExportUrl, usePipelineAnalyticsListEventKinds, usePipelineAnalyticsListEventKindsBatch, usePipelineAnalyticsListGroups, usePipelineAnalyticsListOpsLog, usePipelineAnalyticsListRecentTracks, usePipelineAnalyticsListRelocateMediaJobs, usePipelineAnalyticsListRetrainAnnotations, usePipelineAnalyticsListRetrainFrames, usePipelineAnalyticsListRetrainStaging, usePipelineAnalyticsListTrackMedia, usePipelineAnalyticsListTracks, usePipelineAnalyticsPauseForStorageMigration, usePipelineAnalyticsProposeRetrainAnnotations, usePipelineAnalyticsPruneEvents, usePipelineAnalyticsPruneEventsBefore, usePipelineAnalyticsPruneTracksBefore, usePipelineAnalyticsRebuildObjectEmbeddings, 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, usePipelineOrchestratorSetAgentDetectWeight, usePipelineOrchestratorSetAgentInferenceDevices, usePipelineOrchestratorSetAgentMaxCameras, usePipelineOrchestratorSetAgentReachableHost, usePipelineOrchestratorSetCameraPipelineForAgent, usePipelineOrchestratorSetCameraStepOverride, usePipelineOrchestratorSetCameraStepToggle, usePipelineOrchestratorSetCameraSwitch, usePipelineOrchestratorSetCapabilityBinding, usePipelineOrchestratorSetPipelineDevicePin, usePipelineOrchestratorUnassignAudio, usePipelineOrchestratorUnassignPipeline, usePipelineOrchestratorUpdateTemplate, usePipelineRunnerAttachCamera, usePipelineRunnerDetachCamera, usePipelineRunnerGetAllCameraMetrics, usePipelineRunnerGetCameraMetrics, usePipelineRunnerGetLocalCameras, usePipelineRunnerGetLocalLoad, usePipelineRunnerGetLocalMetrics, usePipelineRunnerGetNativeCrop, usePipelineRunnerReportMotion, 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, usePtzAutotrackGetSettings, usePtzAutotrackGetStatus, usePtzAutotrackSetEnabled, usePtzAutotrackSetSettings, usePtzContinuousMove, usePtzDeletePreset, usePtzGetOptions, usePtzGetPosition, usePtzGetPresets, usePtzGetStatus, usePtzGoHome, usePtzGoToPreset, usePtzMove, usePtzSavePreset, usePtzSetAutofocus, usePtzStop, useRebootReboot, useRecordedPlayback, useRecordingApplyDeviceSettingsPatch, useRecordingCancelRelocateJob, useRecordingCancelStorageMigrationMove, useRecordingDeleteFootprint, useRecordingExportCancelExport, useRecordingExportCreateExport, useRecordingExportDeleteExport, useRecordingExportGetDownloadUrl, useRecordingExportGetExport, useRecordingExportListExports, useRecordingExportReadExportBytes, useRecordingGetAvailability, useRecordingGetDaysWithRecordings, useRecordingGetDeviceConfig, useRecordingGetDeviceLiveContribution, useRecordingGetDeviceSettingsContribution, useRecordingGetPlaybackManifest, useRecordingGetStatus, useRecordingGetStorageMigrationMoveStatus, useRecordingGetStorageUsage, useRecordingListOpsLog, useRecordingListRelocateJobs, useRecordingLocateSegment, useRecordingPauseForStorageMigration, useRecordingPlanStorageRebalance, useRecordingPruneFootage, useRecordingReadGopBytes, useRecordingReadSegmentBytes, useRecordingReadWindowBytes, useRecordingRefreshStorageLocationsForMigration, useRecordingRelocateFootage, useRecordingRenderClip, useRecordingRenderGif, useRecordingRescanStorage, useRecordingResumeForStorageMigration, useRecordingSetDeviceConfig, useRecordingStartStorageMigrationMove, useRecordingStartStorageRebalance, useRemoteComponent, useSceneMonitorCaptureReference, useSceneMonitorCreateScene, useSceneMonitorDeleteReference, useSceneMonitorDeleteScene, useSceneMonitorGetStatus, useSceneMonitorListScenes, useSceneMonitorRecheckNow, useSceneMonitorResetScene, useSceneMonitorUpdateScene, useScriptRunnerGetStatus, useScriptRunnerRun, useScriptRunnerStop, useScrubController, useServerManagementApplyServerUpdate, useServerManagementCheckServerUpdate, useServerManagementGetServerPackageStatus, useServerManagementRestartServer, useServerManagementRollbackServerUpdate, useSettingsStoreAggregate, useSettingsStoreCount, useSettingsStoreDeclareCollection, useSettingsStoreDelete, useSettingsStoreDeleteWhere, useSettingsStoreGet, useSettingsStoreHistogram, useSettingsStoreInsert, useSettingsStoreIsEmpty, useSettingsStoreQuery, useSettingsStoreSet, useSettingsStoreUpdate, useSettingsStoreUpdateWhere, useSmokeGetStatus, useSnapshotApplyDeviceSettingsPatch, useSnapshotGetDebugState, useSnapshotGetDeviceLiveContribution, useSnapshotGetDeviceSettingsContribution, useSnapshotGetSnapshot, useSnapshotGetSnapshotLinks, useSnapshotGetSnapshotOverview, useSnapshotGetStatus, useSnapshotInvalidateCache, useStorageAbortUpload, useStorageBeginDownload, useStorageBeginUpload, useStorageDelete, useStorageDeleteLocation, useStorageEndDownload, useStorageExists, useStorageFinalizeUpload, useStorageGetAvailableSpace, useStorageGetDefaultLocation, useStorageList, useStorageListLocationDeclarations, useStorageListLocations, useStorageListProviders, useStorageMigrationCancel, useStorageMigrationPlan, useStorageMigrationStart, useStorageMigrationStatus, useStorageRead, useStorageReadChunk, useStorageResolve, useStorageTestConfig, useStorageTestLocation, useStorageUpsertLocation, useStorageWrite, useStorageWriteChunk, useStreamBrokerAcquireEgressTranscode, useStreamBrokerApplyDeviceSettingsPatch, useStreamBrokerAssignProfile, useStreamBrokerFetchEventMedia, useStreamBrokerGetAllRtspEntries, useStreamBrokerGetBrokerStats, useStreamBrokerGetDeviceAudioMute, useStreamBrokerGetDeviceLiveContribution, useStreamBrokerGetDeviceSettingsContribution, useStreamBrokerGetPreBufferInfo, useStreamBrokerGetRtspEntry, useStreamBrokerGetRtspPort, useStreamBrokerGetStreamUrl, useStreamBrokerGetStreamWithCodec, useStreamBrokerIsRtspEnabled, useStreamBrokerKillClient, useStreamBrokerListAllCameraStreams, useStreamBrokerListAllProfileSlots, useStreamBrokerListClients, useStreamBrokerProbeStream, useStreamBrokerProduceEventMedia, useStreamBrokerPublishCameraStream, useStreamBrokerPullAudioChunks, useStreamBrokerPullFrameHandles, useStreamBrokerRegenerateRtspToken, useStreamBrokerReleaseEgressTranscode, useStreamBrokerReleaseStreamWithCodec, useStreamBrokerRenderPreBufferClip, useStreamBrokerRestartProfile, useStreamBrokerRetractCameraStream, useStreamBrokerSetDeviceAudioMute, useStreamBrokerSetPreBufferDuration, useStreamBrokerSetRtspEnabled, useStreamBrokerSubscribeAudioChunks, useStreamBrokerSubscribeFrames, useStreamBrokerUnassignProfile, useStreamBrokerUnsubscribeAudioChunks, useStreamBrokerUnsubscribeFrames, useStreamCatalogGetCatalog, useStreamParamsGetConfigSchema, useStreamParamsGetOptions, useStreamParamsGetStatus, useStreamParamsSetProfile, useSwitchGetStatus, useSwitchSetState, useSystem, useSystemDetectSiteLocation, useSystemFeatureFlags, useSystemForceRetentionCleanup, 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, useVodPlayback, useWaterHeaterGetStatus, useWaterHeaterSetAway, useWaterHeaterSetOperationMode, useWaterHeaterSetTargetTemp, useWeatherGetStatus, useWebrtcSessionAddIceCandidate, useWebrtcSessionCloseSession, useWebrtcSessionCreateSession, useWebrtcSessionGetIceCandidates, useWebrtcSessionGetSessionState, useWebrtcSessionHandleAnswer, useWebrtcSessionHandleOffer, useWebrtcSessionHasAdaptiveBitrate, useWebrtcSessionListStreams, useWidget, useWidgetMetadata, useWidgetRegistry, useZoneAnalyticsGetCameraHistory, useZoneAnalyticsGetCurrentSnapshot, useZoneAnalyticsGetUnzonedHistory, useZoneAnalyticsGetZoneHistory, useZoneEditing, useZoneRulesListRules, useZoneRulesSetRules, useZonesAddZone, useZonesListZones, useZonesRemoveZone, useZonesUpdateZone, vacuumStateMeta, validateScopes, valveStateMeta, variantLabel, waterHeaterPhase, waterHeaterTint, weatherConditionMeta, weatherTint };
48942
+ 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, FanHeroCard, FanInlineControl, FanPanel, FilterBar, FloatingEventStream, FloatingLogStream, FloatingPanel, FormField$1 as FormField, GRID_GAP, GRID_PAIRED, GRID_QUICK_STATS, GripTrack, GroupedModelSelector, HOST_WIDGETS, HlsVideo, HoverZoomImage, HumidifierHeroCard, HumidifierInlineControl, INPUT_COMPACT, IconAction, IconButton, ImageHeroCard, ImageInlineControl, ImageSelector, InferenceConfigSelector, Input, KebabMenu, KeyValueList, LIST_ROW, Label, LawnMowerHeroCard, LawnMowerInlineControl, LightHeroCard, LightInlineControl, LockHeroCard, LockInlineControl, LockPanel, LogStream, LoginForm, MODE_COLOR, MaskShapeCanvas, MediaPlayerHeroCard, MediaPlayerInlineControl, MediaPlayerPanel, MobileDrawer, ModelPicker, MotionZonesSettings, NodeMultiSelectField, NodePicker, NodeSelectField, OfflineBadge, PHASE_CONFIG, PRIORITY, PTZOverlay, PageHeader, PhaseIcon, PipelineBuilder, PipelineRuntimeSelector, PipelineStep, PipelineTreeMatrix, PlayerOverlaysProvider, Popover, PopoverContent, PopoverRowAction, PopoverTrigger, PrimaryChildPicker, PrivacyMaskSettings, ProviderBadge, PtzPanel, QrCode, 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, 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, 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, ariaSortForColumn, badgeFor, buildStepTreeFromSchema, createLucideIcon as c, childEntityId, childListName, cn, columnsForContext, containerChildToRef, countableDevices, coverHighlight, coverageLine, createSharedContext, createTheme, cursorFractionFor, darkColors, defaultTheme, deriveDeviceKind, describeDeviceSelector, deviceMatchesFilter, deviceOptionLabel, deviceRoleMeta, deviceRoleMetaOf, deviceTypeLabel, deviceTypeMeta, deviceTypeMetaOf, devicesToOptions, ensureMfHostInit, eventKindLabel, filterDeviceOptions, findTimezone, formatControlDateTime, formatLastSeen, formatNumeric, fuzzyMatch, getClassColor, getPhaseVisual, groupAgentColumns, groupChildrenByLayout, hardwareLabel, humanDuration, humidifierTint, Mic as i, initialScrubState, isAbsentProvider, isFieldVisible, lawnMowerActivityMeta, lightColors, loadRemoteBundle, makeScrubBridge, metadataEntries, metadataString, mirror, mountAddonPage, Square as n, nextReconnectAction, nextSort, nextSortDirection, nextTableSort, normalizeForSearch, EyeOff as o, overrideEntityIdFromLink, parseRecordedServerMessage, providerIcons, RotateCcw as r, resolveContainerPrimary, resolveControlAlign, resolveDeviceControl, resolveDisplayIcon, resolveEffectiveDefaultModel, resolveEffectiveStepModel, resolveEventKindIcon, resolvePrimaryChild, resolveSensorDisplay, resolveStepDefaultModel, resolveTableLayout, roiTooLarge, Camera as s, scrubReducer, selectedDeviceOptions, serializeRecordedCommand, shouldCommit, shouldEmit, shouldUseSingleNode, sortRows, sortRowsByColumn, statusIcons, statusLine, stepHasModelForFormat, stepModelOptions, stripParentNamePrefix, Trash2 as t, tabForSelector, tankAlert, themeToCss, trpc, useAccessoriesGetStatus, useAccessoriesSetChildHidden, useAddonPagesListPages, useAddonSettingsGetDeviceSettings, useAddonSettingsGetGlobalSettings, useAddonSettingsUpdateDeviceSettings, useAddonSettingsUpdateGlobalSettings, useAddonWidgetsListWidgets, useAddonsApplyAutoUpdateToAll, useAddonsCancelJob, useAddonsCustom, useAddonsForceRefresh, useAddonsGetAddonAutoUpdate, useAddonsGetAutoUpdateSettings, useAddonsGetJob, useAddonsGetLastRestart, useAddonsGetLogs, useAddonsGetVersions, useAddonsInstallFromWorkspace, useAddonsInstallPackage, useAddonsIsWorkspaceAvailable, useAddonsList, useAddonsListCapabilityProviders, useAddonsListFrameworkPackages, useAddonsListJobs, useAddonsListPackages, useAddonsListUpdates, useAddonsListWorkspacePackages, useAddonsOnAddonLogs, useAddonsReloadPackages, useAddonsRestartAddon, useAddonsRestartServer, useAddonsRetryLoad, useAddonsRollbackPackage, useAddonsSearchAvailable, useAddonsSetAddonAutoUpdate, useAddonsSetAutoUpdateSettings, useAddonsSetCapabilityProviderEnabled, useAddonsStartJob, useAddonsUninstallPackage, useAddonsUpdatePackage, useAirQualitySensorGetStatus, useAlarmPanelArm, useAlarmPanelDisarm, useAlarmPanelGetStatus, useAlarmPanelTrigger, useAlertsDismiss, useAlertsEmit, useAlertsGetUnreadCount, useAlertsList, useAlertsMarkAllRead, useAlertsMarkRead, useAlertsUpdate, useAllWidgets, useAmbientLightSensorGetStatus, useAudioAnalysisApplyDeviceSettingsPatch, useAudioAnalysisGetDeviceLiveContribution, useAudioAnalysisGetDeviceSettingsContribution, useAudioAnalysisResolveDeviceSettings, useAudioAnalyzerAnalyseChunk, useAudioAnalyzerClassify, useAudioAnalyzerDispose, useAudioAnalyzerIsReady, useAudioAnalyzerReprobeAudioEngine, useAudioCodecCanHandle, useAudioCodecCloseSession, useAudioCodecCreateDecodeSession, useAudioCodecCreateEncodeSession, useAudioCodecFlushEncode, useAudioCodecListActiveSessions, useAudioCodecListSupportedCodecs, useAudioCodecPullEncoded, useAudioCodecPullPcm, useAudioCodecPushEncodedFrame, useAudioCodecPushPcm, useAudioMetricsGetCurrentSnapshot, useAudioMetricsGetHistory, useAutomationControlDisable, useAutomationControlEnable, useAutomationControlGetStatus, useAutomationControlTrigger, useBackupDelete, useBackupDeleteSchedule, useBackupGetEntries, useBackupList, useBackupListArchives, useBackupListDestinations, useBackupListLocations, useBackupListSchedules, useBackupPreviewSchedule, useBackupRestore, useBackupTrigger, useBackupUpsertDestinationPolicy, useBackupUpsertSchedule, useBatteryGetStatus, useBatteryWakeForStream, useBinaryGetStatus, useBrightnessGetStatus, useBrightnessSetBrightness, useBrokerAdd, useBrokerGet, useBrokerGetBrokerConfig, useBrokerGetSettings, useBrokerGetSettingsSchema, useBrokerGetState, useBrokerGetStatus, useBrokerList, useBrokerListProviders, useBrokerPublish, useBrokerRemove, useBrokerSetSettings, useBrokerSubscribe, useBrokerTestConnection, useBrokerTestSettings, useBrokerUnsubscribe, useButtonPress, useCameraCredentialsGetCredentials, useCameraCredentialsGetStatus, useCameraPipelineConfigApplyDeviceSettingsPatch, useCameraPipelineConfigGetDeviceLiveContribution, useCameraPipelineConfigGetDeviceSettingsContribution, useCameraStreamsGetBrokerStreams, useCameraStreamsGetCameraStreams, useCameraStreamsGetProfileRtspEntries, useCameraStreamsGetRtspEntries, useCameraStreamsPickStream, useCarbonMonoxideGetStatus, useClimateControlGetStatus, useClimateControlSetFanMode, useClimateControlSetMode, useClimateControlSetPreset, useClimateControlSetSwingHorizontal, useClimateControlSetSwingVertical, useClimateControlSetTarget, useClimateControlSetTargetHumidity, useClimateControlSetTargetRange, useClusterNodes, useColorGetStatus, useColorSetColor, useConfirm, 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, useDeviceManagerListLocations, useDeviceManagerListPersistedByAddon, useDeviceManagerListWrappersForCap, useDeviceManagerLoadConfig, useDeviceManagerLoadMeta, useDeviceManagerLoadRuntimeState, useDeviceManagerPersistConfig, useDeviceManagerProbeStreams, useDeviceManagerProviderCreationType, useDeviceManagerProviderDiscoveryParamsSchema, useDeviceManagerRegisterDevice, useDeviceManagerRemove, useDeviceManagerRemoveByIntegration, useDeviceManagerRemoveDevice, useDeviceManagerRemoveLocation, useDeviceManagerRunDeviceAction, useDeviceManagerSetChildLayout, useDeviceManagerSetDisabled, useDeviceManagerSetDisplay, useDeviceManagerSetIntegrationId, useDeviceManagerSetLinkDeviceId, useDeviceManagerSetLocation, useDeviceManagerSetMetadata, useDeviceManagerSetName, useDeviceManagerSetPrimaryChildEntityId, useDeviceManagerSetRole, useDeviceManagerSetRoleDisplayDefaults, useDeviceManagerSetStreamProfileMap, useDeviceManagerSetType, useDeviceManagerSetWrapperActive, useDeviceManagerTestCreationField, useDeviceManagerTestField, useDeviceManagerUpdateConfig, useDeviceManagerUpdateDeviceField, useDeviceManagerUpdateDeviceFieldsBatch, useDeviceOpsGetConfigEntries, useDeviceOpsGetRawState, useDeviceOpsGetSettingsSchema, useDeviceOpsGetStreamSources, useDeviceOpsRemoveDevice, useDeviceOpsRunAction, useDeviceOpsSetConfig, useDeviceProviderAdoptDiscoveredDevice, useDeviceProviderCreateDevice, useDeviceProviderDiscoverDevices, useDeviceProviderGetChildCreationSchema, useDeviceProviderGetDevices, useDeviceProviderGetDiscoveryParamsSchema, useDeviceProviderGetManualCreationType, useDeviceProviderGetStatus, useDeviceProviderStart, useDeviceProviderStop, useDeviceProviderSupportsDiscovery, useDeviceProviderSupportsManualCreation, useDeviceProviderTestCreationField, useDeviceProxy, useDeviceSnapshot, useDeviceSnapshotImage, useDeviceState, useDeviceStateGetAllSnapshots, useDeviceStateGetCapSlice, useDeviceStateGetSnapshot, useDeviceStateSetCapSlice, useDeviceStateSlice, useDeviceStatusGetStatus, useDeviceWebrtc, useDevices, useDoorbellApplyDeviceSettingsPatch, useDoorbellEvents, useDoorbellGetDeviceLiveContribution, useDoorbellGetDeviceSettingsContribution, useDoorbellGetStatus, useEnumSensorGetStatus, useEventEmitterGetStatus, useEventInvalidation, useEventStreamLatest, useEventStreamMap, useEventsGetEventClipUrl, useEventsGetEventThumbnail, useEventsGetEvents, useFaceGalleryAssignFace, useFaceGalleryAssignFaces, useFaceGalleryCreateIdentity, useFaceGalleryDeleteFace, useFaceGalleryDeleteIdentity, useFaceGalleryGetFaceByTrack, useFaceGalleryGetFaceMedia, useFaceGalleryListIdentities, useFaceGalleryListIdentitySamples, useFaceGalleryListRecentFaces, useFaceGalleryRemoveSample, useFaceGalleryRenameIdentity, useFaceGallerySuggestFaceClusters, useFaceGalleryUnassignFace, useFaceGalleryUnassignFaces, useFanControlGetStatus, useFanControlSetDirection, useFanControlSetOscillating, useFanControlSetPercentage, useFanControlSetPreset, useFeatureProbeGetStatus, useFloodGetStatus, useGasGetStatus, useHumidifierGetStatus, useHumidifierSetMode, useHumidifierSetOn, useHumidifierSetTargetHumidity, useHumiditySensorGetStatus, useImageGetStatus, useImageSettingsGetOptions, useImageSettingsGetStatus, useImageSettingsSetSettings, useIntegrationsCreate, useIntegrationsDelete, useIntegrationsGet, useIntegrationsGetAvailableTypes, useIntegrationsGetByAddonId, useIntegrationsGetSettings, useIntegrationsList, useIntegrationsSetSettings, useIntegrationsTestConnection, useIntegrationsUpdate, useIntercomEndTalkSession, useIntercomGetStatus, useIntercomHandleAnswer, useIntercomPushTalkAudio, useIntercomStartSession, useIntercomStartTalkSession, useIntercomStopSession, useIsMidWidth, useIsMobile, useLawnMowerControlDock, useLawnMowerControlGetStatus, useLawnMowerControlPause, useLawnMowerControlStartMowing, useLiveBuffer, useLiveEvent, 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, useMetricsProviderDumpHeapSnapshot, 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, useNativeObjectDetectionGetStatus, useNativeObjectDetectionSetEnabled, useNetworkAccessGetEndpoint, useNetworkAccessGetStatus, useNetworkAccessListEndpoints, useNetworkAccessStart, useNetworkAccessStop, useNetworkQualityGetAllStats, useNetworkQualityGetDeviceStats, useNetworkQualityReportClientStats, useNodesClusterAddonStatus, useNodesDeployAddon, useNodesExecuteQuery, useNodesGetCapUsageGraph, useNodesGetNodeAddons, useNodesRenameNode, useNodesRestartAddon, useNodesRestartNode, useNodesRestartProcess, useNodesSetProcessLogLevel, useNodesShutdownNode, useNodesTopology, useNodesUndeployAddon, useNotificationOutputDeleteTarget, useNotificationOutputDiscoverTargets, useNotificationOutputListTargetKinds, useNotificationOutputListTargets, useNotificationOutputSend, useNotificationOutputSetTargetEnabled, useNotificationOutputTestTarget, useNotificationOutputUpsertTarget, useNotificationRulesCancelSnooze, useNotificationRulesCreateRule, useNotificationRulesCreateSnooze, useNotificationRulesDeleteRule, useNotificationRulesGetAlarmConfig, 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, usePipelineAnalyticsDeleteDeviceEvents, usePipelineAnalyticsDeleteTracks, usePipelineAnalyticsDeselectRetrainFrame, usePipelineAnalyticsGetActiveTracks, usePipelineAnalyticsGetAudioEvents, usePipelineAnalyticsGetDeviceLiveContribution, usePipelineAnalyticsGetDeviceSettingsContribution, usePipelineAnalyticsGetEventDensity, usePipelineAnalyticsGetEventMedia, usePipelineAnalyticsGetEventStoreFootprint, usePipelineAnalyticsGetGroup, usePipelineAnalyticsGetKeyEvents, usePipelineAnalyticsGetMotionEvents, usePipelineAnalyticsGetObjectEmbeddingRebuildStatus, usePipelineAnalyticsGetObjectEvents, usePipelineAnalyticsGetRetrainExportUrl, usePipelineAnalyticsGetRetrainFrameImage, usePipelineAnalyticsGetSensorEvents, usePipelineAnalyticsGetStorageMigrationMoveStatus, usePipelineAnalyticsGetTrack, usePipelineAnalyticsGetTrackMedia, usePipelineAnalyticsGetTrainingExportSummary, usePipelineAnalyticsGetTrainingExportUrl, usePipelineAnalyticsListEventKinds, usePipelineAnalyticsListEventKindsBatch, usePipelineAnalyticsListGroups, usePipelineAnalyticsListOpsLog, usePipelineAnalyticsListRecentTracks, usePipelineAnalyticsListRelocateMediaJobs, usePipelineAnalyticsListRetrainAnnotations, usePipelineAnalyticsListRetrainFrames, usePipelineAnalyticsListRetrainStaging, usePipelineAnalyticsListTrackMedia, usePipelineAnalyticsListTracks, usePipelineAnalyticsPauseForStorageMigration, usePipelineAnalyticsProposeRetrainAnnotations, usePipelineAnalyticsPruneEvents, usePipelineAnalyticsPruneEventsBefore, usePipelineAnalyticsPruneTracksBefore, usePipelineAnalyticsRebuildObjectEmbeddings, 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, usePipelineOrchestratorSetAgentDetectWeight, usePipelineOrchestratorSetAgentInferenceDevices, usePipelineOrchestratorSetAgentMaxCameras, usePipelineOrchestratorSetAgentReachableHost, usePipelineOrchestratorSetCameraPipelineForAgent, usePipelineOrchestratorSetCameraStepOverride, usePipelineOrchestratorSetCameraStepToggle, usePipelineOrchestratorSetCameraSwitch, usePipelineOrchestratorSetCapabilityBinding, usePipelineOrchestratorSetPipelineDevicePin, usePipelineOrchestratorUnassignAudio, usePipelineOrchestratorUnassignPipeline, usePipelineOrchestratorUpdateTemplate, usePipelineRunnerAttachCamera, usePipelineRunnerDetachCamera, usePipelineRunnerGetAllCameraMetrics, usePipelineRunnerGetCameraMetrics, usePipelineRunnerGetLocalCameras, usePipelineRunnerGetLocalLoad, usePipelineRunnerGetLocalMetrics, usePipelineRunnerGetNativeCrop, usePipelineRunnerReportMotion, 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, usePtzAutotrackGetSettings, usePtzAutotrackGetStatus, usePtzAutotrackSetEnabled, usePtzAutotrackSetSettings, usePtzContinuousMove, usePtzDeletePreset, usePtzGetOptions, usePtzGetPosition, usePtzGetPresets, usePtzGetStatus, usePtzGoHome, usePtzGoToPreset, usePtzMove, usePtzSavePreset, usePtzSetAutofocus, usePtzStop, useRebootReboot, useRecordedPlayback, useRecordingApplyDeviceSettingsPatch, useRecordingCancelRelocateJob, useRecordingCancelStorageMigrationMove, useRecordingDeleteFootprint, useRecordingExportCancelExport, useRecordingExportCreateExport, useRecordingExportDeleteExport, useRecordingExportGetDownloadUrl, useRecordingExportGetExport, useRecordingExportListExports, useRecordingExportReadExportBytes, useRecordingGetAvailability, useRecordingGetDaysWithRecordings, useRecordingGetDeviceConfig, useRecordingGetDeviceLiveContribution, useRecordingGetDeviceSettingsContribution, useRecordingGetPlaybackManifest, useRecordingGetStatus, useRecordingGetStorageMigrationMoveStatus, useRecordingGetStorageUsage, useRecordingListOpsLog, useRecordingListRelocateJobs, useRecordingLocateSegment, useRecordingPauseForStorageMigration, useRecordingPlanStorageRebalance, useRecordingPruneFootage, useRecordingReadGopBytes, useRecordingReadSegmentBytes, useRecordingReadWindowBytes, useRecordingRefreshStorageLocationsForMigration, useRecordingRelocateFootage, useRecordingRenderClip, useRecordingRenderGif, useRecordingRescanStorage, useRecordingResumeForStorageMigration, useRecordingSetDeviceConfig, useRecordingStartStorageMigrationMove, useRecordingStartStorageRebalance, useRemoteComponent, useSceneMonitorCaptureReference, useSceneMonitorCreateScene, useSceneMonitorDeleteReference, useSceneMonitorDeleteScene, useSceneMonitorGetStatus, useSceneMonitorListScenes, 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, useSmokeGetStatus, useSnapshotApplyDeviceSettingsPatch, useSnapshotGetDebugState, useSnapshotGetDeviceLiveContribution, useSnapshotGetDeviceSettingsContribution, useSnapshotGetSnapshot, useSnapshotGetSnapshotLinks, useSnapshotGetSnapshotOverview, useSnapshotGetStatus, useSnapshotInvalidateCache, useStorageAbortUpload, useStorageBeginDownload, useStorageBeginUpload, useStorageDelete, useStorageDeleteLocation, useStorageEndDownload, useStorageExists, useStorageFinalizeUpload, useStorageGetAvailableSpace, useStorageGetDefaultLocation, useStorageList, useStorageListLocationDeclarations, useStorageListLocations, useStorageListProviders, useStorageMigrationCancel, useStorageMigrationPlan, useStorageMigrationStart, useStorageMigrationStatus, useStorageRead, useStorageReadChunk, useStorageResolve, useStorageTestConfig, useStorageTestLocation, useStorageUpsertLocation, useStorageWrite, useStorageWriteChunk, useStreamBrokerAcquireEgressTranscode, useStreamBrokerApplyDeviceSettingsPatch, useStreamBrokerAssignProfile, useStreamBrokerFetchEventMedia, useStreamBrokerGetAllRtspEntries, useStreamBrokerGetBrokerStats, useStreamBrokerGetDeviceAudioMute, useStreamBrokerGetDeviceLiveContribution, useStreamBrokerGetDeviceSettingsContribution, useStreamBrokerGetPreBufferInfo, useStreamBrokerGetRtspEntry, useStreamBrokerGetRtspPort, useStreamBrokerGetStreamUrl, useStreamBrokerGetStreamWithCodec, useStreamBrokerIsRtspEnabled, useStreamBrokerKillClient, useStreamBrokerListAllCameraStreams, useStreamBrokerListAllProfileSlots, useStreamBrokerListClients, useStreamBrokerProbeStream, useStreamBrokerProduceEventMedia, useStreamBrokerPublishCameraStream, useStreamBrokerPullAudioChunks, useStreamBrokerPullFrameHandles, useStreamBrokerRegenerateRtspToken, useStreamBrokerReleaseEgressTranscode, useStreamBrokerReleaseStreamWithCodec, useStreamBrokerRenderPreBufferClip, useStreamBrokerRestartProfile, useStreamBrokerRetractCameraStream, useStreamBrokerSetDeviceAudioMute, useStreamBrokerSetPreBufferDuration, useStreamBrokerSetRtspEnabled, useStreamBrokerSubscribeAudioChunks, useStreamBrokerSubscribeFrames, useStreamBrokerUnassignProfile, useStreamBrokerUnsubscribeAudioChunks, useStreamBrokerUnsubscribeFrames, useStreamCatalogGetCatalog, useStreamParamsGetConfigSchema, useStreamParamsGetOptions, useStreamParamsGetStatus, useStreamParamsSetProfile, useSwitchGetStatus, useSwitchSetState, useSystem, useSystemDetectSiteLocation, useSystemFeatureFlags, useSystemForceRetentionCleanup, 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, useVodPlayback, useWaterHeaterGetStatus, useWaterHeaterSetAway, useWaterHeaterSetOperationMode, useWaterHeaterSetTargetTemp, useWeatherGetStatus, useWebrtcSessionAddIceCandidate, useWebrtcSessionCloseSession, useWebrtcSessionCreateSession, useWebrtcSessionGetIceCandidates, useWebrtcSessionGetSessionState, useWebrtcSessionHandleAnswer, useWebrtcSessionHandleOffer, useWebrtcSessionHasAdaptiveBitrate, useWebrtcSessionListStreams, useWidget, useWidgetMetadata, useWidgetRegistry, useZoneAnalyticsGetCameraHistory, useZoneAnalyticsGetCurrentSnapshot, useZoneAnalyticsGetUnzonedHistory, useZoneAnalyticsGetZoneHistory, useZoneEditing, useZoneRulesListRules, useZoneRulesSetRules, useZonesAddZone, useZonesListZones, useZonesRemoveZone, useZonesUpdateZone, vacuumStateMeta, validateScopes, valveStateMeta, variantLabel, waterHeaterPhase, waterHeaterTint, weatherConditionMeta, weatherTint };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/ui-library",
3
- "version": "1.2.79",
3
+ "version": "1.2.81",
4
4
  "type": "module",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",