@camstack/ui-library 1.1.43 → 1.1.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ import * as __mfHostReact from "react";
3
3
  import React, { Fragment, Suspense, createContext, createElement, forwardRef, lazy, useCallback, useContext, useEffect, useId, useLayoutEffect, useMemo, useReducer, useRef, useState, useSyncExternalStore } from "react";
4
4
  import * as __mfHostReactJsxRuntime from "react/jsx-runtime";
5
5
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
6
- import { ALL_CAPABILITY_DEFINITIONS, DEFAULT_EVENT_COLOR, DEFAULT_SCRUB_THUMBNAIL_PRESET, DeviceExportStatusSchema, DeviceFeature, DeviceRole, DeviceType, EVENT_TAXONOMY, EventCategory, ExposedDeviceSchema, KNOWN_CAP_NAMES, PET_FEEDER_MANUAL_FEED_MAX, PET_FEEDER_MANUAL_FEED_MIN, RecordingConfigSchema, RecordingStatusSchema, SCRUB_THUMBNAIL_PRESET_LABELS, SCRUB_THUMBNAIL_PRESET_ORDER, ScrubThumbnailPresetSchema, SourceInfoSchema, TIMEZONES, buildModelVariantGroups, canConvertUnit, createDeviceProxy, createLazyTrpcSource, createSliceHandle, describeModelVariant, findTimezone, resolveVariantModelId, tryConvertUnit } from "@camstack/types";
6
+ import { ALL_CAPABILITY_DEFINITIONS, DEFAULT_EVENT_COLOR, DEFAULT_SCRUB_THUMBNAIL_PRESET, DEVICE_TYPE_CONTROL_KIND, DeviceExportStatusSchema, DeviceFeature, DeviceRole, DeviceType, EVENT_TAXONOMY, EventCategory, ExposedDeviceSchema, KNOWN_CAP_NAMES, PET_FEEDER_MANUAL_FEED_MAX, PET_FEEDER_MANUAL_FEED_MIN, RecordingConfigSchema, RecordingStatusSchema, SCRUB_THUMBNAIL_PRESET_LABELS, SCRUB_THUMBNAIL_PRESET_ORDER, ScrubThumbnailPresetSchema, SourceInfoSchema, TIMEZONES, buildModelVariantGroups, canConvertUnit, createDeviceProxy, createLazyTrpcSource, createSliceHandle, describeModelVariant, findTimezone, resolveDeviceControlKind, resolveVariantModelId, tryConvertUnit } from "@camstack/types";
7
7
  import * as __mfHostReactDOM from "react-dom";
8
8
  import { createPortal } from "react-dom";
9
9
  import * as __mfHostReactDOMClient from "react-dom/client";
@@ -14402,7 +14402,7 @@ function buildDisplayStep(addon, cfg) {
14402
14402
  function computeEffective(mode, agentDefault, patch) {
14403
14403
  if (mode !== "device" || !patch) return agentDefault;
14404
14404
  return {
14405
- enabled: patch.enabled ?? agentDefault.enabled,
14405
+ enabled: agentDefault.enabled,
14406
14406
  modelId: patch.modelId ?? agentDefault.modelId,
14407
14407
  settings: patch.settings ?? agentDefault.settings
14408
14408
  };
@@ -14416,97 +14416,62 @@ function AgentModeEditor({ addon, agentDefault, modelsForFormat, onChangeAgentCo
14416
14416
  };
14417
14417
  return /* @__PURE__ */ jsxs("div", {
14418
14418
  className: "space-y-4 text-xs",
14419
- children: [
14420
- /* @__PURE__ */ jsxs("label", {
14421
- className: "flex items-center gap-2",
14422
- children: [/* @__PURE__ */ jsx("input", {
14423
- type: "checkbox",
14424
- checked: agentDefault.enabled,
14425
- onChange: (e) => update({ enabled: e.target.checked })
14426
- }), /* @__PURE__ */ jsxs("span", { children: [
14427
- "Enabled on this agent (",
14428
- addon.name,
14429
- ")"
14430
- ] })]
14431
- }),
14432
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
14433
- className: "text-[10px] uppercase tracking-widest text-foreground-subtle mb-1",
14434
- children: "Model"
14435
- }), /* @__PURE__ */ jsx(ModelPicker, {
14436
- models: modelsForFormat,
14437
- value: agentDefault.modelId ?? "",
14438
- onChange: (modelId) => update({ modelId })
14439
- })] }),
14440
- (addon.configSchema?.length ?? 0) > 0 && /* @__PURE__ */ jsxs("div", {
14441
- className: "pt-2 border-t border-border/50 space-y-3",
14442
- children: [/* @__PURE__ */ jsx("div", {
14443
- className: "text-[10px] uppercase tracking-widest text-foreground-subtle",
14444
- children: "Settings"
14445
- }), addon.configSchema?.map((field) => /* @__PURE__ */ jsx(ConfigSchemaField, {
14446
- field,
14447
- allFields: addon.configSchema ?? [],
14448
- step: buildDisplayStep(addon, agentDefault),
14449
- disabled: false,
14450
- onChange: (next) => update({ settings: { ...next.settings } })
14451
- }, field.key))]
14452
- })
14453
- ]
14419
+ children: [/* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
14420
+ className: "text-[10px] uppercase tracking-widest text-foreground-subtle mb-1",
14421
+ children: "Model"
14422
+ }), /* @__PURE__ */ jsx(ModelPicker, {
14423
+ models: modelsForFormat,
14424
+ value: agentDefault.modelId ?? "",
14425
+ onChange: (modelId) => update({ modelId })
14426
+ })] }), (addon.configSchema?.length ?? 0) > 0 && /* @__PURE__ */ jsxs("div", {
14427
+ className: "pt-2 border-t border-border/50 space-y-3",
14428
+ children: [/* @__PURE__ */ jsx("div", {
14429
+ className: "text-[10px] uppercase tracking-widest text-foreground-subtle",
14430
+ children: "Settings"
14431
+ }), addon.configSchema?.map((field) => /* @__PURE__ */ jsx(ConfigSchemaField, {
14432
+ field,
14433
+ allFields: addon.configSchema ?? [],
14434
+ step: buildDisplayStep(addon, agentDefault),
14435
+ disabled: false,
14436
+ onChange: (next) => update({ settings: { ...next.settings } })
14437
+ }, field.key))]
14438
+ })]
14454
14439
  });
14455
14440
  }
14456
14441
  function DeviceModeEditor({ addon, agentDefault, agentNodeId, currentPatch, modelsForFormat, onChangePatch }) {
14457
14442
  const effective = computeEffective("device", agentDefault, currentPatch);
14458
14443
  const commitPatch = (next) => {
14459
- const hasAnyField = next.enabled !== void 0 || next.modelId !== void 0 || next.settings !== void 0;
14444
+ const hasAnyField = next.modelId !== void 0 || next.settings !== void 0;
14460
14445
  onChangePatch?.(hasAnyField ? next : null);
14461
14446
  };
14462
- const setEnabled = (state) => {
14463
- const { enabled: _prev, ...rest } = currentPatch ?? {};
14464
- commitPatch(state === "inherit" ? rest : {
14465
- ...rest,
14466
- enabled: state === "on"
14467
- });
14468
- };
14469
14447
  const setModel = (modelId) => {
14470
- const { modelId: _prev, ...rest } = currentPatch ?? {};
14448
+ const { enabled: _enabled, modelId: _prev, ...rest } = currentPatch ?? {};
14471
14449
  commitPatch(modelId === void 0 ? rest : {
14472
14450
  ...rest,
14473
14451
  modelId
14474
14452
  });
14475
14453
  };
14476
14454
  const setSettings = (settings) => {
14477
- const { settings: _prev, ...rest } = currentPatch ?? {};
14455
+ const { enabled: _enabled, settings: _prev, ...rest } = currentPatch ?? {};
14478
14456
  commitPatch(settings === void 0 ? rest : {
14479
14457
  ...rest,
14480
14458
  settings
14481
14459
  });
14482
14460
  };
14483
- const enabledTri = currentPatch?.enabled === void 0 ? "inherit" : currentPatch.enabled ? "on" : "off";
14484
14461
  const modelOverridden = currentPatch?.modelId !== void 0;
14485
14462
  return /* @__PURE__ */ jsxs("div", {
14486
14463
  className: "space-y-4 text-xs",
14487
14464
  children: [
14488
14465
  /* @__PURE__ */ jsxs("div", {
14489
- className: "flex items-center gap-1",
14490
- children: [[
14491
- "inherit",
14492
- "on",
14493
- "off"
14494
- ].map((s) => /* @__PURE__ */ jsx("button", {
14495
- type: "button",
14496
- onClick: () => setEnabled(s),
14497
- className: cn("px-3 py-1 border border-border rounded text-xs capitalize", enabledTri === s ? "bg-primary text-primary-foreground border-primary" : "bg-surface text-foreground hover:bg-muted"),
14498
- children: s
14499
- }, s)), /* @__PURE__ */ jsxs("span", {
14500
- className: "ml-2 text-[10px] text-foreground-subtle",
14501
- children: [
14502
- "agent default:",
14503
- " ",
14504
- /* @__PURE__ */ jsx("span", {
14505
- className: "font-semibold",
14506
- children: agentDefault.enabled ? "on" : "off"
14507
- })
14508
- ]
14509
- })]
14466
+ className: "rounded bg-muted/40 px-3 py-2 text-[11px] text-foreground-subtle",
14467
+ children: [
14468
+ "Provisioning for ",
14469
+ /* @__PURE__ */ jsx("span", {
14470
+ className: "font-semibold text-foreground",
14471
+ children: agentNodeId
14472
+ }),
14473
+ " model + settings only. Whether this camera runs the step is set by its per-camera gate above."
14474
+ ]
14510
14475
  }),
14511
14476
  /* @__PURE__ */ jsxs("div", { children: [
14512
14477
  /* @__PURE__ */ jsxs("div", {
@@ -14577,15 +14542,13 @@ function DeviceModeEditor({ addon, agentDefault, agentNodeId, currentPatch, mode
14577
14542
  className: "rounded bg-muted/40 px-3 py-2 text-[11px] text-foreground-subtle",
14578
14543
  children: [/* @__PURE__ */ jsx("div", {
14579
14544
  className: "font-semibold text-foreground mb-0.5",
14580
- children: "Effective config preview"
14545
+ children: "Effective provisioning preview"
14581
14546
  }), /* @__PURE__ */ jsxs("div", {
14582
14547
  className: "font-mono truncate",
14583
14548
  children: [
14584
14549
  addon.id,
14585
14550
  " · model: ",
14586
- effective.modelId,
14587
- " · ",
14588
- effective.enabled ? "on" : "off"
14551
+ effective.modelId ?? "Auto"
14589
14552
  ]
14590
14553
  })]
14591
14554
  })
@@ -14610,19 +14573,6 @@ function AgentStepEditor(props) {
14610
14573
  onChangePatch
14611
14574
  });
14612
14575
  }
14613
- //#endregion
14614
- //#region src/composites/pipeline-tree-matrix.tsx
14615
- /**
14616
- * Fixed column geometry (rem). The matrix uses a CSS grid with STATIC track
14617
- * widths so a cell's content (a status chip, a long model id) can never resize
14618
- * a column or shift its neighbours — cell content is truncated WITHIN the fixed
14619
- * track instead. This kills the "table dances when the last column's status
14620
- * changes" jitter. See `min-w-0` on every grid child, which lets the child
14621
- * shrink to the track (a grid item's automatic minimum is its content size, so
14622
- * without this a non-wrapping model id would blow the track wider than its max).
14623
- */
14624
- var STEP_COL_REM = 18;
14625
- var AGENT_COL_REM = 13;
14626
14576
  function flattenTree(nodes) {
14627
14577
  const out = [];
14628
14578
  const walk = (list, depth) => {
@@ -14637,6 +14587,20 @@ function flattenTree(nodes) {
14637
14587
  walk(nodes, 0);
14638
14588
  return out;
14639
14589
  }
14590
+ /**
14591
+ * Layout decision for the responsive A↔B switch. Pure so it can be unit-tested
14592
+ * in isolation from the DOM.
14593
+ *
14594
+ * Returns `true` (single-node fallback) when there is MORE than one node but
14595
+ * the container is too narrow to show the step column plus at least TWO node
14596
+ * columns side by side. An unmeasured container (`width <= 0`) defaults to the
14597
+ * wide matrix so there is no first-paint flash into the fallback.
14598
+ */
14599
+ function shouldUseSingleNode(width, nodeCount, stepColPx, agentColPx = 208) {
14600
+ if (nodeCount <= 1) return false;
14601
+ if (width <= 0) return false;
14602
+ return width < stepColPx + agentColPx * 2;
14603
+ }
14640
14604
  var SLOT_LABEL = {
14641
14605
  detector: {
14642
14606
  label: "detector",
@@ -14687,25 +14651,26 @@ function ClassChips({ inputs, outputs }) {
14687
14651
  ]
14688
14652
  });
14689
14653
  }
14690
- function QuickToggle({ enabled, onChange, disabled }) {
14691
- return /* @__PURE__ */ jsx("button", {
14692
- type: "button",
14693
- role: "switch",
14694
- "aria-checked": enabled,
14695
- disabled,
14696
- onClick: (e) => {
14697
- e.stopPropagation();
14698
- onChange(!enabled);
14699
- },
14700
- className: cn("relative inline-flex h-3.5 w-7 shrink-0 items-center rounded-full transition-colors", enabled ? "bg-emerald-500" : "bg-foreground-subtle/30", disabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer"),
14701
- title: enabled ? "Click to disable" : "Click to enable",
14702
- children: /* @__PURE__ */ jsx("span", { className: cn("inline-block h-3 w-3 rounded-full bg-white shadow transition-transform", enabled ? "translate-x-3.5" : "translate-x-0.5") })
14654
+ /** Step label (slot heading + addon name + class chips), shared by both views. */
14655
+ function StepLabel({ node }) {
14656
+ return /* @__PURE__ */ jsxs("div", {
14657
+ className: "flex flex-col gap-1 min-w-0 flex-1",
14658
+ children: [/* @__PURE__ */ jsx(SlotHeading, { slot: node.slot }), /* @__PURE__ */ jsxs("div", {
14659
+ className: "flex items-center gap-2 flex-wrap",
14660
+ children: [/* @__PURE__ */ jsx("span", {
14661
+ className: "font-semibold truncate",
14662
+ children: node.addonName
14663
+ }), /* @__PURE__ */ jsx(ClassChips, {
14664
+ inputs: node.inputClasses,
14665
+ outputs: node.outputClasses
14666
+ })]
14667
+ })]
14703
14668
  });
14704
14669
  }
14705
14670
  /**
14706
- * Cell content. Kept width-stable: the status dot is `shrink-0` (reserved
14707
- * space) and the model id truncates inside a `min-w-0` flex row, so a longer
14708
- * model id never widens the cell — it ellipsises instead.
14671
+ * Cell content. Width-stable: the status dot is `shrink-0` (reserved space) and
14672
+ * the model id truncates inside a `min-w-0` flex row, so a longer model id never
14673
+ * widens the cell — it ellipsises instead.
14709
14674
  */
14710
14675
  function renderCellContent(state) {
14711
14676
  if (state.kind === "enabled") return /* @__PURE__ */ jsxs("span", {
@@ -14738,31 +14703,41 @@ function renderCellContent(state) {
14738
14703
  })
14739
14704
  ]
14740
14705
  });
14706
+ if (state.kind === "skip") return /* @__PURE__ */ jsxs("span", {
14707
+ className: "flex min-w-0 items-center gap-1 text-amber-500",
14708
+ title: "Gated on for this camera, but no compatible model on this node — click to provision",
14709
+ children: [/* @__PURE__ */ jsx("span", { className: "h-1.5 w-1.5 rounded-full bg-amber-500 shrink-0" }), /* @__PURE__ */ jsx("span", {
14710
+ className: "truncate font-medium",
14711
+ children: "⚠ skip"
14712
+ })]
14713
+ });
14741
14714
  return /* @__PURE__ */ jsxs("span", {
14742
14715
  className: "flex min-w-0 items-center gap-1 text-foreground-subtle/70",
14743
14716
  children: [/* @__PURE__ */ jsx("span", { className: "h-1.5 w-1.5 rounded-full bg-muted shrink-0" }), /* @__PURE__ */ jsx("span", {
14744
14717
  className: "truncate",
14745
- children: "n/a"
14718
+ children: ""
14746
14719
  })]
14747
14720
  });
14748
14721
  }
14749
14722
  function cellButtonClass(state, isSelected, extra) {
14750
- return cn("text-left text-xs hover:bg-muted/40", state.kind === "enabled" && "bg-emerald-500/5", state.kind === "na" && "bg-muted/30", isSelected && "ring-2 ring-primary ring-inset", extra);
14723
+ return cn("text-left text-xs hover:bg-muted/40", state.kind === "enabled" && "bg-emerald-500/5", state.kind === "skip" && "bg-amber-500/5", state.kind === "na" && "bg-muted/30", isSelected && "ring-2 ring-primary ring-inset", extra);
14751
14724
  }
14752
- /** Step label (slot heading + addon name + class chips), shared by both views. */
14753
- function StepLabel({ node }) {
14754
- return /* @__PURE__ */ jsxs("div", {
14755
- className: "flex flex-col gap-1 min-w-0 flex-1",
14756
- children: [/* @__PURE__ */ jsx(SlotHeading, { slot: node.slot }), /* @__PURE__ */ jsxs("div", {
14757
- className: "flex items-center gap-2 flex-wrap",
14758
- children: [/* @__PURE__ */ jsx("span", {
14759
- className: "font-semibold truncate",
14760
- children: node.addonName
14761
- }), /* @__PURE__ */ jsx(ClassChips, {
14762
- inputs: node.inputClasses,
14763
- outputs: node.outputClasses
14764
- })]
14765
- })]
14725
+ //#endregion
14726
+ //#region src/composites/pipeline-tree-matrix.tsx
14727
+ var STEP_COL_REM$1 = 18;
14728
+ function QuickToggle({ enabled, onChange, disabled }) {
14729
+ return /* @__PURE__ */ jsx("button", {
14730
+ type: "button",
14731
+ role: "switch",
14732
+ "aria-checked": enabled,
14733
+ disabled,
14734
+ onClick: (e) => {
14735
+ e.stopPropagation();
14736
+ onChange(!enabled);
14737
+ },
14738
+ className: cn("relative inline-flex h-3.5 w-7 shrink-0 items-center rounded-full transition-colors", enabled ? "bg-emerald-500" : "bg-foreground-subtle/30", disabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer"),
14739
+ title: enabled ? "Click to disable" : "Click to enable",
14740
+ children: /* @__PURE__ */ jsx("span", { className: cn("inline-block h-3 w-3 rounded-full bg-white shadow transition-transform", enabled ? "translate-x-3.5" : "translate-x-0.5") })
14766
14741
  });
14767
14742
  }
14768
14743
  function GridRow({ node, depth, agents, getCellState, onCellClick, selectedCell, toggleProps }) {
@@ -14790,11 +14765,11 @@ function GridRow({ node, depth, agents, getCellState, onCellClick, selectedCell,
14790
14765
  /**
14791
14766
  * Wide layout: horizontally self-scrolling matrix. The scroll lives INSIDE
14792
14767
  * this `overflow-auto` box (sticky first column + sticky header row) so the
14793
- * page body never scrolls sideways. Column tracks are fixed px widths see
14794
- * STEP_COL_REM / AGENT_COL_REM — so the grid is static regardless of content.
14768
+ * page body never scrolls sideways. Column tracks are fixed px widths so the
14769
+ * grid is static regardless of content.
14795
14770
  */
14796
- function MatrixGrid({ rows, agents, getCellState, onCellClick, selectedCell, onToggleEnabled }) {
14797
- const gridTemplate = `${STEP_COL_REM}rem repeat(${agents.length}, ${AGENT_COL_REM}rem)`;
14771
+ function MatrixGrid$1({ rows, agents, getCellState, onCellClick, selectedCell, onToggleEnabled }) {
14772
+ const gridTemplate = `${STEP_COL_REM$1}rem repeat(${agents.length}, 13rem)`;
14798
14773
  const showToggle = onToggleEnabled !== void 0 && agents.length === 1;
14799
14774
  const onlyAgent = agents[0]?.agentNodeId;
14800
14775
  return /* @__PURE__ */ jsx("div", {
@@ -14839,9 +14814,7 @@ function MatrixGrid({ rows, agents, getCellState, onCellClick, selectedCell, onT
14839
14814
  }
14840
14815
  /**
14841
14816
  * Narrow layout: one card per agent column, each listing every step stacked
14842
- * vertically. A wide fixed matrix is unusable on a phone; here the same cells
14843
- * (click-to-edit, status, toggle) reflow into full-width rows so nothing scrolls
14844
- * horizontally. Feature-parity with the matrix — same `onCellClick`, same
14817
+ * vertically. Feature-parity with the matrix same `onCellClick`, same
14845
14818
  * `renderCellContent`, same single-agent `onToggleEnabled`.
14846
14819
  */
14847
14820
  function StackedCards({ rows, agents, getCellState, onCellClick, selectedCell, onToggleEnabled }) {
@@ -14910,7 +14883,7 @@ function PipelineTreeMatrix({ tree, agents, getCellState, onCellClick, selectedC
14910
14883
  })
14911
14884
  }), /* @__PURE__ */ jsx("div", {
14912
14885
  className: "hidden @2xl/matrix:block",
14913
- children: /* @__PURE__ */ jsx(MatrixGrid, {
14886
+ children: /* @__PURE__ */ jsx(MatrixGrid$1, {
14914
14887
  rows,
14915
14888
  agents,
14916
14889
  getCellState,
@@ -14922,6 +14895,226 @@ function PipelineTreeMatrix({ tree, agents, getCellState, onCellClick, selectedC
14922
14895
  });
14923
14896
  }
14924
14897
  //#endregion
14898
+ //#region src/composites/device-step-matrix.tsx
14899
+ /**
14900
+ * DeviceStepMatrix — the per-camera "Detection pipeline → Steps" surface (#33)
14901
+ * rendered as ONE hierarchical steps×nodes matrix.
14902
+ *
14903
+ * Column 1 (STICKY): the indented step tree. Each step carries its slot +
14904
+ * name + class-flow chips PLUS a per-camera, node-independent GATE control
14905
+ * with THREE states — On / Off / Default (inherit). `package-detection` is
14906
+ * zone-driven, so it shows a "Zones" badge instead of a gate.
14907
+ * Columns 2..N (one per online node): the provisioned model chip (click →
14908
+ * the model/config picker), a clickable "⚠ skip" when the step is gated ON
14909
+ * but the node has no compatible model, or "—" when N/A.
14910
+ *
14911
+ * Responsive, container-measured (never a global media query, so it also works
14912
+ * embedded):
14913
+ * A) wide — sticky step column + node columns in an `overflow-x:auto` box, so
14914
+ * narrow viewports scroll the NODES sideways while col-1 stays pinned and
14915
+ * the page body never scrolls horizontally.
14916
+ * B) narrow — below the width needed for ≥2 node columns, collapse to a
14917
+ * single-node view: a node selector picks ONE node and the matrix renders
14918
+ * `step-tree × that-one-node`.
14919
+ */
14920
+ /** Wider than the cluster matrix's 18rem: col-1 also hosts the gate control. */
14921
+ var STEP_COL_REM = 21;
14922
+ var STEP_COL_PX = STEP_COL_REM * 16;
14923
+ function activeChoice(gate) {
14924
+ if (!gate.explicit) return "default";
14925
+ return gate.effectiveOn ? "on" : "off";
14926
+ }
14927
+ /**
14928
+ * Tri-state segmented control. `Default` inherits the catalog value (shown in
14929
+ * the caption); `On`/`Off` pin an explicit per-camera override. Touch-friendly
14930
+ * 28px segments.
14931
+ */
14932
+ function GateControl({ gate, busy, onSet }) {
14933
+ const active = activeChoice(gate);
14934
+ const seg = (choice, label, value, activeClass) => /* @__PURE__ */ jsx("button", {
14935
+ type: "button",
14936
+ "aria-pressed": active === choice,
14937
+ disabled: busy,
14938
+ onClick: () => onSet(value),
14939
+ className: cn("flex-1 px-2 py-1 text-[11px] font-medium leading-none transition-colors", "min-h-[26px]", active === choice ? activeClass : "text-foreground-subtle hover:bg-muted/60", busy && "opacity-50 cursor-not-allowed"),
14940
+ children: label
14941
+ });
14942
+ return /* @__PURE__ */ jsxs("div", {
14943
+ className: "flex flex-col gap-1",
14944
+ children: [/* @__PURE__ */ jsxs("div", {
14945
+ className: "inline-flex w-fit max-w-full self-start overflow-hidden rounded-md border border-border",
14946
+ children: [
14947
+ seg("default", "Auto", null, "bg-primary/15 text-primary"),
14948
+ /* @__PURE__ */ jsx("span", { className: "w-px self-stretch bg-border" }),
14949
+ seg("on", "On", true, "bg-emerald-500 text-white"),
14950
+ /* @__PURE__ */ jsx("span", { className: "w-px self-stretch bg-border" }),
14951
+ seg("off", "Off", false, "bg-foreground-subtle/70 text-white")
14952
+ ]
14953
+ }), /* @__PURE__ */ jsx("span", {
14954
+ className: "text-[10px] leading-none text-foreground-subtle",
14955
+ children: active === "default" ? /* @__PURE__ */ jsxs(Fragment$1, { children: [
14956
+ "= default (",
14957
+ gate.defaultOn ? "on" : "off",
14958
+ ")"
14959
+ ] }) : /* @__PURE__ */ jsxs(Fragment$1, { children: ["overridden · default ", gate.defaultOn ? "on" : "off"] })
14960
+ })]
14961
+ });
14962
+ }
14963
+ function ZoneBadge() {
14964
+ return /* @__PURE__ */ jsxs("div", {
14965
+ className: "flex flex-col gap-1",
14966
+ children: [/* @__PURE__ */ jsx("span", {
14967
+ className: "inline-flex w-fit items-center gap-1 rounded-md border border-violet-500/40 bg-violet-500/10 px-2 py-1 text-[11px] font-medium text-violet-400",
14968
+ children: "Zones"
14969
+ }), /* @__PURE__ */ jsx("span", {
14970
+ className: "text-[10px] leading-none text-foreground-subtle",
14971
+ children: "driven by package zones"
14972
+ })]
14973
+ });
14974
+ }
14975
+ function StepGateCell({ node, depth, gate, busy, onSet }) {
14976
+ return /* @__PURE__ */ jsxs("div", {
14977
+ className: "sticky left-0 z-10 flex flex-col gap-2 border-b border-border bg-surface px-3 py-2.5 text-xs min-w-0",
14978
+ style: { paddingLeft: `${12 + depth * 14}px` },
14979
+ children: [/* @__PURE__ */ jsx(StepLabel, { node }), gate.kind === "zone-driven" ? /* @__PURE__ */ jsx(ZoneBadge, {}) : /* @__PURE__ */ jsx(GateControl, {
14980
+ gate,
14981
+ busy,
14982
+ onSet
14983
+ })]
14984
+ });
14985
+ }
14986
+ /**
14987
+ * Agents-scoped node selector for the B fallback. Styled like the shared
14988
+ * `NodePicker` but driven by THIS matrix's `agents` set — the cluster-wide
14989
+ * NodePicker can list nodes (e.g. the hub) that own no pipeline column here,
14990
+ * which would let the operator select a node the matrix can't show.
14991
+ */
14992
+ function NodeSelectorBar({ agents, selected, onSelect }) {
14993
+ return /* @__PURE__ */ jsxs("div", {
14994
+ className: "flex flex-wrap items-center gap-1.5",
14995
+ role: "tablist",
14996
+ "aria-label": "Node",
14997
+ children: [
14998
+ /* @__PURE__ */ jsx(Server, { className: "h-3.5 w-3.5 text-foreground-subtle" }),
14999
+ /* @__PURE__ */ jsx("span", {
15000
+ className: "text-[10px] uppercase tracking-wider text-foreground-subtle",
15001
+ children: "Node"
15002
+ }),
15003
+ /* @__PURE__ */ jsx("div", {
15004
+ className: "flex overflow-hidden rounded-md border border-border text-[11px] font-medium",
15005
+ children: agents.map((a, idx) => {
15006
+ const isSelected = a.agentNodeId === selected;
15007
+ return /* @__PURE__ */ jsx("button", {
15008
+ type: "button",
15009
+ role: "tab",
15010
+ "aria-selected": isSelected,
15011
+ onClick: () => onSelect(a.agentNodeId),
15012
+ title: `${a.agentNodeId} · ${a.engineLabel}`,
15013
+ className: cn("px-2.5 py-1 transition-colors", isSelected ? "bg-primary/15 text-primary" : "bg-transparent text-foreground-subtle hover:bg-surface-hover hover:text-foreground", idx > 0 && "border-l border-border"),
15014
+ children: a.agentNodeId
15015
+ }, a.agentNodeId);
15016
+ })
15017
+ })
15018
+ ]
15019
+ });
15020
+ }
15021
+ function MatrixGrid({ tree, agents, gateFor, getCellState, onCellClick, selectedCell, onSetGate, gateBusy, single }) {
15022
+ const rows = useMemo(() => flattenTree(tree), [tree]);
15023
+ const gridTemplate = single ? `minmax(0, 1.35fr) repeat(${agents.length}, minmax(0, 1fr))` : `${STEP_COL_REM}rem repeat(${agents.length}, 13rem)`;
15024
+ return /* @__PURE__ */ jsx("div", {
15025
+ className: cn("rounded border border-border", single ? "overflow-hidden" : "overflow-auto"),
15026
+ children: /* @__PURE__ */ jsxs("div", {
15027
+ className: cn("grid", single ? "w-full" : "w-max"),
15028
+ style: { gridTemplateColumns: gridTemplate },
15029
+ children: [
15030
+ /* @__PURE__ */ jsx("div", {
15031
+ className: "sticky left-0 top-0 z-20 border-b border-border bg-muted/60 px-3 py-2 text-[10px] uppercase tracking-widest text-foreground-subtle",
15032
+ children: "Step · gate"
15033
+ }),
15034
+ agents.map((a) => /* @__PURE__ */ jsxs("div", {
15035
+ className: "sticky top-0 z-10 min-w-0 border-b border-l border-border bg-muted/60 px-3 py-2",
15036
+ children: [/* @__PURE__ */ jsx("div", {
15037
+ className: "truncate text-xs font-semibold text-foreground",
15038
+ children: a.agentNodeId
15039
+ }), /* @__PURE__ */ jsx("div", {
15040
+ className: "truncate text-[10px] text-foreground-subtle",
15041
+ children: a.engineLabel
15042
+ })]
15043
+ }, a.agentNodeId)),
15044
+ rows.map(({ node, depth }) => /* @__PURE__ */ jsx(MatrixRow, {
15045
+ node,
15046
+ depth,
15047
+ agents,
15048
+ gate: gateFor(node.addonId),
15049
+ getCellState,
15050
+ onCellClick,
15051
+ selectedCell,
15052
+ onSetGate,
15053
+ gateBusy
15054
+ }, node.addonId))
15055
+ ]
15056
+ })
15057
+ });
15058
+ }
15059
+ function MatrixRow({ node, depth, agents, gate, getCellState, onCellClick, selectedCell, onSetGate, gateBusy }) {
15060
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(StepGateCell, {
15061
+ node,
15062
+ depth,
15063
+ gate,
15064
+ busy: gateBusy,
15065
+ onSet: (next) => onSetGate(node.addonId, next)
15066
+ }), agents.map((a) => {
15067
+ const state = getCellState(node.addonId, a.agentNodeId);
15068
+ const isSelected = selectedCell?.addonId === node.addonId && selectedCell.agentNodeId === a.agentNodeId;
15069
+ const actionable = state.kind === "enabled" || state.kind === "skip";
15070
+ return /* @__PURE__ */ jsx("button", {
15071
+ type: "button",
15072
+ disabled: !actionable,
15073
+ onClick: () => onCellClick(node.addonId, a.agentNodeId),
15074
+ className: cellButtonClass(state, isSelected, cn("min-w-0 overflow-hidden border-b border-l border-border px-3 py-2", !actionable && "cursor-default hover:bg-transparent")),
15075
+ children: renderCellContent(state)
15076
+ }, a.agentNodeId);
15077
+ })] });
15078
+ }
15079
+ function DeviceStepMatrix({ tree, agents, gateFor, getCellState, onCellClick, selectedCell, onSetGate, gateBusy, fallbackNodeId, onFallbackNodeChange }) {
15080
+ const containerRef = useRef(null);
15081
+ const [width, setWidth] = useState(0);
15082
+ useLayoutEffect(() => {
15083
+ const el = containerRef.current;
15084
+ if (!el) return;
15085
+ const measure = () => setWidth(el.getBoundingClientRect().width);
15086
+ measure();
15087
+ const RO = typeof ResizeObserver !== "undefined" ? new ResizeObserver(measure) : null;
15088
+ RO?.observe(el);
15089
+ return () => RO?.disconnect();
15090
+ }, []);
15091
+ const single = shouldUseSingleNode(width, agents.length, STEP_COL_PX);
15092
+ const selectedNode = useMemo(() => {
15093
+ if (agents.length === 0) return null;
15094
+ return agents.find((a) => a.agentNodeId === fallbackNodeId) ?? agents[0];
15095
+ }, [agents, fallbackNodeId]);
15096
+ const shownAgents = single && selectedNode ? [selectedNode] : agents;
15097
+ return /* @__PURE__ */ jsxs("div", {
15098
+ ref: containerRef,
15099
+ className: "w-full space-y-2",
15100
+ children: [single && selectedNode && /* @__PURE__ */ jsx(NodeSelectorBar, {
15101
+ agents,
15102
+ selected: selectedNode.agentNodeId,
15103
+ onSelect: onFallbackNodeChange
15104
+ }), /* @__PURE__ */ jsx(MatrixGrid, {
15105
+ tree,
15106
+ agents: shownAgents,
15107
+ gateFor,
15108
+ getCellState,
15109
+ onCellClick,
15110
+ selectedCell,
15111
+ onSetGate,
15112
+ gateBusy,
15113
+ single: single && selectedNode !== null
15114
+ })]
15115
+ });
15116
+ }
15117
+ //#endregion
14925
15118
  //#region src/trpc-react.ts
14926
15119
  /**
14927
15120
  * Shared typed React Query proxy for the backend AppRouter.
@@ -26509,131 +26702,117 @@ function ControlHeroCard({ trpc, deviceId, features, optimistic }) {
26509
26702
  }
26510
26703
  //#endregion
26511
26704
  //#region src/composites/device-controls/control-registry.tsx
26512
- var COVER_CONTROL = {
26513
- InlineControl: CoverInlineControl,
26514
- HeroCard: CoverHeroCard
26515
- };
26516
- var DUMMY_CONTROL = {
26517
- InlineControl: DummyInline,
26518
- HeroCard: DummyHeroCard
26519
- };
26520
- var SENSOR_CONTROL = {
26521
- InlineControl: SensorInlineControl,
26522
- HeroCard: SensorHeroCard
26523
- };
26524
- var UPDATE_CONTROL = {
26525
- InlineControl: UpdateInlineControl,
26526
- HeroCard: UpdateHeroCard
26527
- };
26528
- var SWITCH_CONTROL = {
26529
- InlineControl: SwitchInlineControl,
26530
- HeroCard: SwitchHeroCard
26531
- };
26532
- var LOCK_CONTROL = {
26533
- InlineControl: LockInlineControl,
26534
- HeroCard: LockHeroCard
26535
- };
26536
- var LIGHT_CONTROL = {
26537
- InlineControl: LightInlineControl,
26538
- HeroCard: LightHeroCard
26539
- };
26540
- var FAN_CONTROL = {
26541
- InlineControl: FanInlineControl,
26542
- HeroCard: FanHeroCard
26543
- };
26544
- var THERMOSTAT_CONTROL = {
26545
- InlineControl: ThermostatInlineControl,
26546
- HeroCard: ThermostatHeroCard
26547
- };
26548
- var CLIMATE_CONTROL = {
26549
- InlineControl: AcInlineControl,
26550
- HeroCard: AcHeroCard
26551
- };
26552
- var MEDIA_PLAYER_CONTROL = {
26553
- InlineControl: MediaPlayerInlineControl,
26554
- HeroCard: MediaPlayerHeroCard
26555
- };
26556
- var ALARM_PANEL_CONTROL = {
26557
- InlineControl: AlarmInlineControl,
26558
- HeroCard: AlarmHeroCard
26559
- };
26560
- var CONTROL_CONTROL = {
26561
- InlineControl: ControlInlineControl,
26562
- HeroCard: ControlHeroCard
26563
- };
26564
- var VACUUM_CONTROL = {
26565
- InlineControl: VacuumInlineControl,
26566
- HeroCard: VacuumHeroCard
26567
- };
26568
- var LAWN_MOWER_CONTROL = {
26569
- InlineControl: LawnMowerInlineControl,
26570
- HeroCard: LawnMowerHeroCard
26571
- };
26572
- var VALVE_CONTROL = {
26573
- InlineControl: ValveInlineControl,
26574
- HeroCard: ValveHeroCard
26575
- };
26576
- var HUMIDIFIER_CONTROL = {
26577
- InlineControl: HumidifierInlineControl,
26578
- HeroCard: HumidifierHeroCard
26579
- };
26580
- var WATER_HEATER_CONTROL = {
26581
- InlineControl: WaterHeaterInlineControl,
26582
- HeroCard: WaterHeaterHeroCard
26583
- };
26584
- var WEATHER_CONTROL = {
26585
- InlineControl: WeatherInlineControl,
26586
- HeroCard: WeatherHeroCard
26587
- };
26588
- var IMAGE_CONTROL = {
26589
- InlineControl: ImageInlineControl,
26590
- HeroCard: ImageHeroCard
26591
- };
26592
- var PET_FEEDER_CONTROL = {
26593
- InlineControl: PetFeederInlineControl,
26594
- HeroCard: PetFeederHeroCard
26595
- };
26596
26705
  /**
26597
- * Exhaustive record over DeviceType. Omitting a member causes a
26598
- * TypeScript build error (same pattern as DEVICE_TYPE_ACTIONS).
26599
- */
26600
- var DEVICE_TYPE_CONTROL = {
26601
- [DeviceType.Cover]: COVER_CONTROL,
26602
- [DeviceType.Valve]: VALVE_CONTROL,
26603
- [DeviceType.Humidifier]: HUMIDIFIER_CONTROL,
26604
- [DeviceType.WaterHeater]: WATER_HEATER_CONTROL,
26605
- [DeviceType.Camera]: DUMMY_CONTROL,
26606
- [DeviceType.Hub]: DUMMY_CONTROL,
26607
- [DeviceType.Switch]: SWITCH_CONTROL,
26608
- [DeviceType.Siren]: SWITCH_CONTROL,
26609
- [DeviceType.Light]: LIGHT_CONTROL,
26610
- [DeviceType.Fan]: FAN_CONTROL,
26611
- [DeviceType.Sensor]: SENSOR_CONTROL,
26612
- [DeviceType.Thermostat]: THERMOSTAT_CONTROL,
26613
- [DeviceType.Climate]: CLIMATE_CONTROL,
26614
- [DeviceType.Button]: {
26706
+ * Presentation binding: the shared `DeviceControlKind` (decided in
26707
+ * `@camstack/types` `resolveDeviceControlKind`) this platform's web
26708
+ * components. Exhaustive over `DeviceControlKind` — omitting a kind fails the
26709
+ * build here. The type→kind DECISION is single-sourced in `@camstack/types`;
26710
+ * this map only binds a kind to its web widgets.
26711
+ */
26712
+ var CONTROL_KIND_COMPONENTS = {
26713
+ cover: {
26714
+ InlineControl: CoverInlineControl,
26715
+ HeroCard: CoverHeroCard
26716
+ },
26717
+ valve: {
26718
+ InlineControl: ValveInlineControl,
26719
+ HeroCard: ValveHeroCard
26720
+ },
26721
+ humidifier: {
26722
+ InlineControl: HumidifierInlineControl,
26723
+ HeroCard: HumidifierHeroCard
26724
+ },
26725
+ "water-heater": {
26726
+ InlineControl: WaterHeaterInlineControl,
26727
+ HeroCard: WaterHeaterHeroCard
26728
+ },
26729
+ switch: {
26730
+ InlineControl: SwitchInlineControl,
26731
+ HeroCard: SwitchHeroCard
26732
+ },
26733
+ light: {
26734
+ InlineControl: LightInlineControl,
26735
+ HeroCard: LightHeroCard
26736
+ },
26737
+ fan: {
26738
+ InlineControl: FanInlineControl,
26739
+ HeroCard: FanHeroCard
26740
+ },
26741
+ sensor: {
26742
+ InlineControl: SensorInlineControl,
26743
+ HeroCard: SensorHeroCard
26744
+ },
26745
+ thermostat: {
26746
+ InlineControl: ThermostatInlineControl,
26747
+ HeroCard: ThermostatHeroCard
26748
+ },
26749
+ climate: {
26750
+ InlineControl: AcInlineControl,
26751
+ HeroCard: AcHeroCard
26752
+ },
26753
+ button: {
26615
26754
  InlineControl: ButtonControl,
26616
26755
  HeroCard: ButtonHeroCard
26617
26756
  },
26618
- [DeviceType.EventEmitter]: DUMMY_CONTROL,
26619
- [DeviceType.Update]: UPDATE_CONTROL,
26620
- [DeviceType.Generic]: DUMMY_CONTROL,
26621
- [DeviceType.Notifier]: DUMMY_CONTROL,
26622
- [DeviceType.Script]: DUMMY_CONTROL,
26623
- [DeviceType.Automation]: DUMMY_CONTROL,
26624
- [DeviceType.Lock]: LOCK_CONTROL,
26625
- [DeviceType.MediaPlayer]: MEDIA_PLAYER_CONTROL,
26626
- [DeviceType.AlarmPanel]: ALARM_PANEL_CONTROL,
26627
- [DeviceType.Control]: CONTROL_CONTROL,
26628
- [DeviceType.Presence]: SENSOR_CONTROL,
26629
- [DeviceType.Weather]: WEATHER_CONTROL,
26630
- [DeviceType.Vacuum]: VACUUM_CONTROL,
26631
- [DeviceType.LawnMower]: LAWN_MOWER_CONTROL,
26632
- [DeviceType.Container]: DUMMY_CONTROL,
26633
- [DeviceType.Image]: IMAGE_CONTROL,
26634
- [DeviceType.PetFeeder]: PET_FEEDER_CONTROL
26757
+ update: {
26758
+ InlineControl: UpdateInlineControl,
26759
+ HeroCard: UpdateHeroCard
26760
+ },
26761
+ lock: {
26762
+ InlineControl: LockInlineControl,
26763
+ HeroCard: LockHeroCard
26764
+ },
26765
+ "media-player": {
26766
+ InlineControl: MediaPlayerInlineControl,
26767
+ HeroCard: MediaPlayerHeroCard
26768
+ },
26769
+ alarm: {
26770
+ InlineControl: AlarmInlineControl,
26771
+ HeroCard: AlarmHeroCard
26772
+ },
26773
+ control: {
26774
+ InlineControl: ControlInlineControl,
26775
+ HeroCard: ControlHeroCard
26776
+ },
26777
+ weather: {
26778
+ InlineControl: WeatherInlineControl,
26779
+ HeroCard: WeatherHeroCard
26780
+ },
26781
+ vacuum: {
26782
+ InlineControl: VacuumInlineControl,
26783
+ HeroCard: VacuumHeroCard
26784
+ },
26785
+ "lawn-mower": {
26786
+ InlineControl: LawnMowerInlineControl,
26787
+ HeroCard: LawnMowerHeroCard
26788
+ },
26789
+ image: {
26790
+ InlineControl: ImageInlineControl,
26791
+ HeroCard: ImageHeroCard
26792
+ },
26793
+ "pet-feeder": {
26794
+ InlineControl: PetFeederInlineControl,
26795
+ HeroCard: PetFeederHeroCard
26796
+ },
26797
+ dummy: {
26798
+ InlineControl: DummyInline,
26799
+ HeroCard: DummyHeroCard
26800
+ }
26635
26801
  };
26636
26802
  /**
26803
+ * Exhaustive record over DeviceType, DERIVED from the shared decision
26804
+ * (`DEVICE_TYPE_CONTROL_KIND`) composed with the web `CONTROL_KIND_COMPONENTS`
26805
+ * binding — so the type→control mapping can never diverge from the single
26806
+ * source in `@camstack/types`. Preserved as a public export for consumers/tests
26807
+ * that index it by `DeviceType`.
26808
+ *
26809
+ * The `Object.fromEntries` result is a `{ [k: string]: DeviceTypeControl }`;
26810
+ * `Object.values(DeviceType)` (a string enum) yields exactly the enum's members,
26811
+ * so the record is fully populated — the assertion narrows that documented
26812
+ * enum-record projection boundary.
26813
+ */
26814
+ var DEVICE_TYPE_CONTROL = Object.fromEntries(Object.values(DeviceType).map((type) => [type, CONTROL_KIND_COMPONENTS[DEVICE_TYPE_CONTROL_KIND[type]]]));
26815
+ /**
26637
26816
  * Per-type FILL flag.
26638
26817
  *
26639
26818
  * true — range / choice / button controls (cover ▲■▼ triad, thermostat
@@ -26687,12 +26866,14 @@ var CONTROL_FILLS = {
26687
26866
  };
26688
26867
  var DEVICE_TYPE_VALUES$1 = new Set(Object.values(DeviceType));
26689
26868
  /**
26690
- * Runtime-string-safe lookup: a device row's `type` crosses the wire
26691
- * as a plain string, so an unrecognised value resolves to null instead
26692
- * of indexing the registry with an unverified key.
26869
+ * Runtime-string-safe lookup: a device row's `type` crosses the wire as a plain
26870
+ * string. The type→control-kind DECISION is single-sourced in `@camstack/types`
26871
+ * (`resolveDeviceControlKind`, null for an unrecognised type); this maps the
26872
+ * resolved kind onto the web components.
26693
26873
  */
26694
26874
  function resolveDeviceControl(type) {
26695
- return DEVICE_TYPE_VALUES$1.has(type) ? DEVICE_TYPE_CONTROL[type] : null;
26875
+ const kind = resolveDeviceControlKind(type);
26876
+ return kind ? CONTROL_KIND_COMPONENTS[kind] : null;
26696
26877
  }
26697
26878
  /**
26698
26879
  * Runtime-string-safe alignment lookup for the fixed-width control column.
@@ -40464,8 +40645,30 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
40464
40645
  const pc = new RTCPeerConnection({ iceServers: [...iceServers ?? [], { urls: "stun:stun.l.google.com:19302" }] });
40465
40646
  const newStream = new MediaStream();
40466
40647
  let swappedIn = false;
40467
- const swapInOnce = () => {
40468
- if (swappedIn || !mountedRef.current) return;
40648
+ let warmupStarted = false;
40649
+ let warmupVideo = null;
40650
+ let warmupRvfc;
40651
+ let warmupSafety;
40652
+ const teardownWarmup = () => {
40653
+ if (warmupSafety !== void 0) {
40654
+ clearTimeout(warmupSafety);
40655
+ warmupSafety = void 0;
40656
+ }
40657
+ const v = warmupVideo;
40658
+ warmupVideo = null;
40659
+ if (!v) return;
40660
+ if (warmupRvfc !== void 0 && typeof v.cancelVideoFrameCallback === "function") v.cancelVideoFrameCallback(warmupRvfc);
40661
+ v.removeEventListener("loadeddata", commitSwap);
40662
+ try {
40663
+ v.srcObject = null;
40664
+ } catch {}
40665
+ v.remove();
40666
+ };
40667
+ function commitSwap() {
40668
+ if (swappedIn || !mountedRef.current) {
40669
+ teardownWarmup();
40670
+ return;
40671
+ }
40469
40672
  swappedIn = true;
40470
40673
  pcRef.current = pc;
40471
40674
  if (videoRef.current) {
@@ -40473,11 +40676,32 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
40473
40676
  videoRef.current.play().catch(() => {});
40474
40677
  }
40475
40678
  if (oldPc && oldPc !== pc) oldPc.close();
40679
+ teardownWarmup();
40680
+ }
40681
+ const armSwap = () => {
40682
+ if (warmupStarted || swappedIn || !mountedRef.current) return;
40683
+ warmupStarted = true;
40684
+ if (typeof document === "undefined") {
40685
+ commitSwap();
40686
+ return;
40687
+ }
40688
+ const v = document.createElement("video");
40689
+ v.muted = true;
40690
+ v.playsInline = true;
40691
+ v.autoplay = true;
40692
+ v.style.cssText = "position:absolute;left:-9999px;top:0;width:1px;height:1px;opacity:0;pointer-events:none;";
40693
+ v.srcObject = newStream;
40694
+ warmupVideo = v;
40695
+ (containerRef.current ?? document.body).appendChild(v);
40696
+ v.play().catch(() => {});
40697
+ if (typeof v.requestVideoFrameCallback === "function") warmupRvfc = v.requestVideoFrameCallback(() => commitSwap());
40698
+ v.addEventListener("loadeddata", commitSwap, { once: true });
40699
+ warmupSafety = setTimeout(() => commitSwap(), 1800);
40476
40700
  };
40477
40701
  pc.ontrack = (event) => {
40478
40702
  console.debug("[WebRTC] ontrack (reoffer)", event.track.kind, event.track.readyState);
40479
40703
  newStream.addTrack(event.track);
40480
- swapInOnce();
40704
+ armSwap();
40481
40705
  };
40482
40706
  pc.oniceconnectionstatechange = () => {
40483
40707
  if (!mountedRef.current) return;
@@ -40485,10 +40709,11 @@ function CameraStreamPlayer({ serverUrl, streamKey, label, autoPlay = true, mute
40485
40709
  console.debug("[WebRTC] ICE state (reoffer):", iceState);
40486
40710
  if (iceState === "connected" || iceState === "completed") {
40487
40711
  reconnectAttemptsRef.current = 0;
40488
- swapInOnce();
40712
+ armSwap();
40489
40713
  updateState("playing");
40490
40714
  if (videoRef.current?.paused) videoRef.current.play().catch(() => {});
40491
40715
  } else if (iceState === "failed" || iceState === "closed") {
40716
+ teardownWarmup();
40492
40717
  if (!swappedIn && iceState === "failed") pc.close();
40493
40718
  updateState("disconnected");
40494
40719
  scheduleReconnect();
@@ -44566,6 +44791,33 @@ function buildRawTree(data, fetchedAt) {
44566
44791
  * State). Computed once at module load.
44567
44792
  */
44568
44793
  var ALL_DEVICE_CAP_NAMES = Object.freeze([...new Set(ALL_CAPABILITY_DEFINITIONS.filter((c) => c.scope === "device").map((c) => c.name))].toSorted());
44794
+ /**
44795
+ * The keys of a cap's `runtimeState` object schema, or `[]` when the cap
44796
+ * declares none / it is not an object schema. Read structurally (no Zod
44797
+ * import, no cast) so a self-contained addon's schema instance still works
44798
+ * across the bundle boundary — `ZodObject.shape` is a public getter.
44799
+ */
44800
+ function runtimeStateKeys(capName) {
44801
+ const rs = ALL_CAPABILITY_DEFINITIONS.find((c) => c.name === capName)?.runtimeState;
44802
+ if (!rs || typeof rs !== "object") return [];
44803
+ const shape = Reflect.get(rs, "shape");
44804
+ if (!shape || typeof shape !== "object") return [];
44805
+ return Object.keys(shape);
44806
+ }
44807
+ /**
44808
+ * Cold placeholder slice for a bound cap that declares `runtimeState` but
44809
+ * has never written it (e.g. a virtual-doorbell camera that has never rung).
44810
+ * Every declared field is seeded `null` so the tree surfaces the cap's
44811
+ * presence and reads as "never" instead of the cap being OMITTED entirely.
44812
+ * Returns `null` when the cap has no runtime-state schema (nothing to seed).
44813
+ */
44814
+ function coldRuntimeStateSlice(capName) {
44815
+ const keys = runtimeStateKeys(capName);
44816
+ if (keys.length === 0) return null;
44817
+ const slice = {};
44818
+ for (const key of keys) slice[key] = null;
44819
+ return slice;
44820
+ }
44569
44821
  /** Depth at which tree nodes start collapsed. Cap nodes (depth 0) and
44570
44822
  * their direct slice keys (depth 1) render expanded; anything nested
44571
44823
  * deeper opens on demand. */
@@ -44612,6 +44864,27 @@ function StateValuesStream({ deviceId, defaultCaps, maxHeight = "max-h-96", onCl
44612
44864
  useEffect(() => {
44613
44865
  seededRef.current = false;
44614
44866
  }, [deviceId]);
44867
+ const { data: bindings } = trpc.deviceManager.getBindings.useQuery({ deviceId }, { staleTime: 3e4 });
44868
+ useEffect(() => {
44869
+ const entries = bindings?.entries;
44870
+ if (!entries || entries.length === 0) return;
44871
+ const now = Date.now();
44872
+ setCapStates((prev) => {
44873
+ let mutated = false;
44874
+ const next = new Map(prev);
44875
+ for (const entry of entries) {
44876
+ if (next.has(entry.capName)) continue;
44877
+ const slice = coldRuntimeStateSlice(entry.capName);
44878
+ if (!slice) continue;
44879
+ next.set(entry.capName, {
44880
+ slice,
44881
+ updatedAt: now
44882
+ });
44883
+ mutated = true;
44884
+ }
44885
+ return mutated ? next : prev;
44886
+ });
44887
+ }, [bindings, deviceId]);
44615
44888
  const patchCapState = useCallback((capName, slice) => {
44616
44889
  setCapStates((prev) => {
44617
44890
  const next = new Map(prev);
@@ -46634,4 +46907,4 @@ var MotionZonesSettings = lazy(() => import("./MotionZonesSettings-NcxxQN8r.js")
46634
46907
  /** Lazy-wrapped `PrivacyMaskSettings` — code-split off the main bundle. */
46635
46908
  var PrivacyMaskSettings = lazy(() => import("./PrivacyMaskSettings-APgPLF7p.js").then((m) => ({ default: m.PrivacyMaskSettings })));
46636
46909
  //#endregion
46637
- export { AddonGlobalSettingsForm, AgentStepEditor, AlarmHeroCard, AlarmInlineControl as AlarmPanelInlineControl, AppShell, ArcKnob, AudioClassificationList, AudioLevelWaveform, AudioWaveform, AutotrackSection, BTN_COMPACT, BTN_COMPACT_DANGER, BTN_COMPACT_PRIMARY, BTN_COMPACT_WARNING, Badge, BatteryBadge, BottomSheet, Breadcrumb, BrightnessPanel, Button, ButtonControl, ButtonHeroCard, CENTER, CHIP_ACTIVE, CHIP_BASE, CHIP_INACTIVE, CLASS_COLORS, COLUMN_BREAKPOINT_CLASS, COLUMN_PRIORITY, COMMIT_DEDUPE_TOLERANCE_MS, COMMIT_DEDUPE_WINDOW_MS, CONTROL_CAP_NAMES, CONTROL_FILLS, CameraStreamPlayer, Card, Checkbox, ChildSectionAccordion, ClimatePanel, CodeBlock, CollapsibleCard, ConfigFormBuilder, FormField as ConfigFormField, ConfigSchemaField, ConfirmActionButton, ConfirmDialogProvider, ConsumablesPanel, ContainerChildrenProvider, ContainerPrimaryHero, ControlColumn, ControlHeroCard, ControlInlineControl, ControlPanel, CopyButton, CoverHeroCard, CoverInlineControl, CoverPanel, CustomFieldRenderersProvider, DEFAULT_COLOR, DEVICE_COLUMNS, DEVICE_LIST_PAGE_SIZE_KEY, DEVICE_LIST_PAGE_SIZE_OPTIONS, DEVICE_ROLE_META, DEVICE_TYPE_CONTROL, DEVICE_TYPE_META, DISPLAY_ICON_REGISTRY, DataTable, DetectionCanvas, DetectionOverlay, DetectionResultTree, DevShell, DeviceActivityPanel, DeviceBatchToolbar, DeviceCard, DeviceContextProvider, DeviceExportPanel, DeviceGrid, DeviceItem, DeviceList, DeviceMultiSelectField, DeviceSelectField, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, DiscoveryPanel, DoorbellRecentPanel, Dropdown, DropdownContent, DropdownItem, DropdownTrigger, DummyHeroCard, DummyInline, EVENT_KIND_ICONS, EmptyState, ErrorBox, EventKindGlyph, EventStream, FILL, FanHeroCard, FanInlineControl, FanPanel, FilterBar, FloatingEventStream, FloatingLogStream, FloatingPanel, FormField$1 as FormField, GRID_GAP, GRID_PAIRED, GRID_QUICK_STATS, GripTrack, GroupedModelSelector, HOST_WIDGETS, HlsVideo, HoverZoomImage, HumidifierHeroCard, HumidifierInlineControl, INPUT_COMPACT, IconAction, IconButton, ImageHeroCard, ImageInlineControl, ImageSelector, InferenceConfigSelector, Input, KebabMenu, KeyValueList, LIST_ROW, Label, LawnMowerHeroCard, LawnMowerInlineControl, LightHeroCard, LightInlineControl, LockHeroCard, LockInlineControl, LockPanel, LogStream, LoginForm, MODE_COLOR, MaskShapeCanvas, MediaPlayerHeroCard, MediaPlayerInlineControl, MediaPlayerPanel, MobileDrawer, MotionZonesSettings, NodeMultiSelectField, NodePicker, NodeSelectField, OfflineBadge, PHASE_CONFIG, PRIORITY, PTZOverlay, PageHeader, PhaseIcon, PipelineBuilder, PipelineRuntimeSelector, PipelineStep, PipelineTreeMatrix, PlayerOverlaysProvider, Popover, PopoverContent, PopoverRowAction, PopoverTrigger, PrimaryChildPicker, PrivacyMaskSettings, ProviderBadge, PtzPanel, QrCode, RECORDED_PLAYBACK_MODES, RIGHT, ROLE_DESCRIPTOR, RadialGauge, RecordedPlaybackProvider, RecordingPanel, ResponseLog, SECTION_BODY, SECTION_CARD, SECTION_HEADER, SPLIT_PANEL_OUTER, SPLIT_PANEL_SIDE, STACK_GAP, STATE_COLOR, ScopePicker, ScrollArea, Select, SemanticBadge, SensorHeroCard, SensorInlineControl, SensorValueAtom, Separator, Sidebar, SidebarItem, Skeleton, SlideOverPanel, SlideToggle, SnapshotButton, StatCard, StateValuesStream, StatusBadge, StepTimings, StepTreeMaster, Stepper, StreamBrokerSelector, StreamPanel, Switch, SwitchHeroCard, SwitchInlineControl, SwitchPanel, SystemProvider, TEXT_FIELD_LABEL, TEXT_HINT, TEXT_METRIC, TEXT_SECTION_LABEL, TEXT_VALUE, TIMEZONES, Tabs, TabsContent, TabsList, TabsTrigger, TapToggle, ThemeProvider, ThermostatHeroCard, ThermostatInlineControl, TimezoneSelector, Tooltip, TooltipContent, TooltipTrigger, VacuumHeroCard, VacuumInlineControl, ValueReadout, ValveHeroCard, ValveInlineControl, VersionBadge, VodPlaybackProvider, WaterHeaterHeroCard, WaterHeaterInlineControl, WeatherHeroCard, WeatherInlineControl, WidgetMetricCard, WidgetPanel, WidgetRegistryProvider, WidgetSlot, ZoneEditingProvider, allDeviceTypeFilterOptions, buildStepTreeFromSchema, childEntityId, childListName, cn, columnsForContext, containerChildToRef, countableDevices, coverHighlight, createSharedContext, createTheme, cursorFractionFor, darkColors, defaultTheme, deriveDeviceKind, deviceMatchesFilter, deviceOptionLabel, deviceRoleMeta, deviceRoleMetaOf, deviceTypeMeta, deviceTypeMetaOf, devicesToOptions, ensureMfHostInit, eventKindLabel, filterDeviceOptions, findTimezone, formatControlDateTime, formatLastSeen, formatNumeric, fuzzyMatch, getClassColor, getPhaseVisual, groupChildrenByLayout, hardwareLabel, humidifierTint, createLucideIcon as i, initialScrubState, isAbsentProvider, isFieldVisible, lawnMowerActivityMeta, lightColors, loadRemoteBundle, makeScrubBridge, metadataEntries, metadataString, mirror, mountAddonPage, Square as n, nextSort, normalizeForSearch, overrideEntityIdFromLink, parseRecordedServerMessage, providerIcons, EyeOff as r, resolveContainerPrimary, resolveControlAlign, resolveDeviceControl, resolveDisplayIcon, resolveEventKindIcon, resolvePrimaryChild, resolveSensorDisplay, scrubReducer, selectedDeviceOptions, serializeRecordedCommand, shouldCommit, shouldEmit, sortRows, statusIcons, stripParentNamePrefix, Trash2 as t, tankAlert, themeToCss, trpc, useAccessoriesGetStatus, useAccessoriesSetChildHidden, useAddonPagesListPages, useAddonSettingsGetDeviceSettings, useAddonSettingsGetGlobalSettings, useAddonSettingsUpdateDeviceSettings, useAddonSettingsUpdateGlobalSettings, useAddonWidgetsListWidgets, useAddonsApplyAutoUpdateToAll, useAddonsCancelJob, useAddonsCustom, useAddonsForceRefresh, useAddonsGetAddonAutoUpdate, useAddonsGetAutoUpdateSettings, useAddonsGetJob, useAddonsGetLastRestart, useAddonsGetLogs, useAddonsGetVersions, useAddonsInstallFromWorkspace, useAddonsInstallPackage, useAddonsIsWorkspaceAvailable, useAddonsList, useAddonsListCapabilityProviders, useAddonsListFrameworkPackages, useAddonsListJobs, useAddonsListPackages, useAddonsListUpdates, useAddonsListWorkspacePackages, useAddonsOnAddonLogs, useAddonsReloadPackages, useAddonsRestartAddon, useAddonsRestartServer, useAddonsRetryLoad, useAddonsRollbackPackage, useAddonsSearchAvailable, useAddonsSetAddonAutoUpdate, useAddonsSetAutoUpdateSettings, useAddonsSetCapabilityProviderEnabled, useAddonsStartJob, useAddonsUninstallPackage, useAddonsUpdatePackage, useAirQualitySensorGetStatus, useAlarmPanelArm, useAlarmPanelDisarm, useAlarmPanelGetStatus, useAlarmPanelTrigger, useAlertsDismiss, useAlertsEmit, useAlertsGetUnreadCount, useAlertsList, useAlertsMarkAllRead, useAlertsMarkRead, useAlertsUpdate, useAllWidgets, useAmbientLightSensorGetStatus, useAudioAnalysisApplyDeviceSettingsPatch, useAudioAnalysisGetDeviceLiveContribution, useAudioAnalysisGetDeviceSettingsContribution, useAudioAnalysisResolveDeviceSettings, useAudioAnalyzerAnalyseChunk, useAudioAnalyzerClassify, useAudioAnalyzerDispose, useAudioAnalyzerIsReady, useAudioAnalyzerReprobeAudioEngine, useAudioCodecCanHandle, useAudioCodecCloseSession, useAudioCodecCreateDecodeSession, useAudioCodecCreateEncodeSession, useAudioCodecFlushEncode, useAudioCodecListActiveSessions, useAudioCodecListSupportedCodecs, useAudioCodecPullEncoded, useAudioCodecPullPcm, useAudioCodecPushEncodedFrame, useAudioCodecPushPcm, useAudioMetricsGetCurrentSnapshot, useAudioMetricsGetHistory, useAutomationControlDisable, useAutomationControlEnable, useAutomationControlGetStatus, useAutomationControlTrigger, useBackupDelete, useBackupGetEntries, useBackupList, useBackupListArchives, useBackupListDestinations, useBackupListLocations, useBackupPreviewSchedule, useBackupRestore, useBackupTrigger, useBackupUpsertDestinationPolicy, useBatteryGetStatus, useBatteryWakeForStream, useBinaryGetStatus, useBrightnessGetStatus, useBrightnessSetBrightness, useBrokerAdd, useBrokerGet, useBrokerGetBrokerConfig, useBrokerGetSettings, useBrokerGetSettingsSchema, useBrokerGetState, useBrokerGetStatus, useBrokerList, useBrokerListProviders, useBrokerPublish, useBrokerRemove, useBrokerSetSettings, useBrokerSubscribe, useBrokerTestConnection, useBrokerTestSettings, useBrokerUnsubscribe, useButtonPress, useCameraCredentialsGetCredentials, useCameraCredentialsGetStatus, useCameraPipelineConfigApplyDeviceSettingsPatch, useCameraPipelineConfigGetDeviceLiveContribution, useCameraPipelineConfigGetDeviceSettingsContribution, useCameraStreamsGetBrokerStreams, useCameraStreamsGetCameraStreams, useCameraStreamsGetProfileRtspEntries, useCameraStreamsGetRtspEntries, useCameraStreamsPickStream, useCarbonMonoxideGetStatus, useClimateControlGetStatus, useClimateControlSetFanMode, useClimateControlSetMode, useClimateControlSetPreset, useClimateControlSetSwingHorizontal, useClimateControlSetSwingVertical, useClimateControlSetTarget, useClimateControlSetTargetHumidity, useClimateControlSetTargetRange, useClusterNodes, useColorGetStatus, useColorSetColor, useConfirm, useConnectivityGetStatus, useConsumablesGetStatus, useConsumablesReset, useContactGetStatus, useContainerChildren, useControlGetStatus, useControlSetValue, useCoverClose, useCoverGetStatus, useCoverOpen, useCoverSetPosition, useCoverSetTiltPosition, useCoverStop, useCustomFieldRenderer, useDayNightGetOptions, useDayNightGetStatus, useDayNightSetSettings, useDebouncedString, useDecoderCreateSession, useDecoderDestroySession, useDecoderGetFrame, useDecoderGetInfo, useDecoderGetShmStats, useDecoderGetStats, useDecoderListActiveSessions, useDecoderOpenStream, useDecoderPullFrames, useDecoderPullHandles, useDecoderPushPacket, useDecoderReprobeHwaccel, useDecoderSupportsCodec, useDecoderUpdateConfig, useDetectionPipelineApplyDeviceSettingsPatch, useDetectionPipelineGetDeviceLiveContribution, useDetectionPipelineGetDeviceSettingsContribution, useDevShell, useDevice, useDeviceAdoptionAdopt, useDeviceAdoptionGetCandidate, useDeviceAdoptionGetStatus, useDeviceAdoptionListCandidateFilters, useDeviceAdoptionListCandidates, useDeviceAdoptionRefresh, useDeviceAdoptionRelease, useDeviceAdoptionResync, useDeviceAutotrack, useDeviceBattery, useDeviceCapSlice, useDeviceCapability, useDeviceDetections, useDeviceDiscoveryAdoptDevice, useDeviceDiscoveryGetStatus, useDeviceDiscoveryListDiscovered, useDeviceDiscoveryRefreshDiscovery, useDeviceDiscoveryReleaseDevice, useDeviceExportApplyDeviceSettingsPatch, useDeviceExportExposeDevice, useDeviceExportGetDeviceLiveContribution, useDeviceExportGetDeviceSettingsContribution, useDeviceExportGetStatus, useDeviceExportListExposedDevices, useDeviceExportListSupportedDeviceKinds, useDeviceExportUnexposeDevice, useDeviceId, useDeviceListPageSize, useDeviceManagerAddLocation, useDeviceManagerAdoptDevice, useDeviceManagerAdoptionAdopt, useDeviceManagerAdoptionListCandidateFilters, useDeviceManagerAdoptionListCandidates, useDeviceManagerAdoptionRefresh, useDeviceManagerAdoptionRelease, useDeviceManagerAdoptionResync, useDeviceManagerAllocateDeviceId, useDeviceManagerApplyDeviceSettingsPatch, useDeviceManagerApplyInitialMeta, useDeviceManagerCreateDevice, useDeviceManagerDisable, useDeviceManagerDiscoverAllProviders, useDeviceManagerDiscoverDevices, useDeviceManagerDiscoverProvider, useDeviceManagerDiscoveryProviders, useDeviceManagerEnable, useDeviceManagerGetAllBindings, useDeviceManagerGetBindings, useDeviceManagerGetChildren, useDeviceManagerGetConfigSchema, useDeviceManagerGetCreationSchema, useDeviceManagerGetDevice, useDeviceManagerGetDeviceAggregate, useDeviceManagerGetDeviceLiveContribution, useDeviceManagerGetDeviceLiveInfoAggregate, useDeviceManagerGetDeviceSettingsAggregate, useDeviceManagerGetDeviceSettingsContribution, useDeviceManagerGetDeviceStatusAggregate, useDeviceManagerGetLinkedDevices, useDeviceManagerGetRoleDisplayDefaults, useDeviceManagerGetSettingsSchema, useDeviceManagerGetStreamProfileMap, useDeviceManagerGetStreamSources, useDeviceManagerGetWireableFields, useDeviceManagerListAll, useDeviceManagerListBindableCapsForDeviceType, useDeviceManagerListLocations, useDeviceManagerListPersistedByAddon, useDeviceManagerListWrappersForCap, useDeviceManagerLoadConfig, useDeviceManagerLoadMeta, useDeviceManagerLoadRuntimeState, useDeviceManagerPersistConfig, useDeviceManagerProbeStreams, useDeviceManagerProviderCreationType, useDeviceManagerProviderDiscoveryParamsSchema, useDeviceManagerRegisterDevice, useDeviceManagerRemove, useDeviceManagerRemoveByIntegration, useDeviceManagerRemoveDevice, useDeviceManagerRemoveLocation, useDeviceManagerRunDeviceAction, useDeviceManagerSetChildLayout, useDeviceManagerSetDeviceLinks, useDeviceManagerSetDisabled, useDeviceManagerSetDisplay, useDeviceManagerSetIntegrationId, useDeviceManagerSetLinkDeviceId, useDeviceManagerSetLocation, useDeviceManagerSetMetadata, useDeviceManagerSetName, useDeviceManagerSetPrimaryChildEntityId, useDeviceManagerSetRole, useDeviceManagerSetRoleDisplayDefaults, useDeviceManagerSetStreamProfileMap, useDeviceManagerSetType, useDeviceManagerSetWrapperActive, useDeviceManagerTestCreationField, useDeviceManagerTestField, useDeviceManagerUpdateConfig, useDeviceManagerUpdateDeviceField, useDeviceManagerUpdateDeviceFieldsBatch, useDeviceOpsGetConfigEntries, useDeviceOpsGetRawState, useDeviceOpsGetSettingsSchema, useDeviceOpsGetStreamSources, useDeviceOpsRemoveDevice, useDeviceOpsRunAction, useDeviceOpsSetConfig, useDeviceProviderAdoptDiscoveredDevice, useDeviceProviderCreateDevice, useDeviceProviderDiscoverDevices, useDeviceProviderGetChildCreationSchema, useDeviceProviderGetDevices, useDeviceProviderGetDiscoveryParamsSchema, useDeviceProviderGetManualCreationType, useDeviceProviderGetStatus, useDeviceProviderStart, useDeviceProviderStop, useDeviceProviderSupportsDiscovery, useDeviceProviderSupportsManualCreation, useDeviceProviderTestCreationField, useDeviceProxy, useDeviceSnapshot, useDeviceSnapshotImage, useDeviceState, useDeviceStateGetAllSnapshots, useDeviceStateGetCapSlice, useDeviceStateGetSnapshot, useDeviceStateSetCapSlice, useDeviceStateSlice, useDeviceStatusGetStatus, useDeviceWebrtc, useDevices, useDoorbellApplyDeviceSettingsPatch, useDoorbellEvents, useDoorbellGetDeviceLiveContribution, useDoorbellGetDeviceSettingsContribution, useDoorbellGetStatus, useEnumSensorGetStatus, useEventEmitterGetStatus, useEventInvalidation, useEventStreamLatest, useEventStreamMap, useEventsGetEventClipUrl, useEventsGetEventThumbnail, useEventsGetEvents, useFaceGalleryAssignFace, useFaceGalleryAssignFaces, useFaceGalleryCreateIdentity, useFaceGalleryDeleteFace, useFaceGalleryDeleteIdentity, useFaceGalleryGetFaceByTrack, useFaceGalleryGetFaceMedia, useFaceGalleryListIdentities, useFaceGalleryListIdentitySamples, useFaceGalleryListRecentFaces, useFaceGalleryRemoveSample, useFaceGalleryRenameIdentity, useFaceGallerySuggestFaceClusters, useFaceGalleryUnassignFace, useFaceGalleryUnassignFaces, useFanControlGetStatus, useFanControlSetDirection, useFanControlSetOscillating, useFanControlSetPercentage, useFanControlSetPreset, useFeatureProbeGetStatus, useFloodGetStatus, useGasGetStatus, useHumidifierGetStatus, useHumidifierSetMode, useHumidifierSetOn, useHumidifierSetTargetHumidity, useHumiditySensorGetStatus, useImageGetStatus, useImageSettingsGetOptions, useImageSettingsGetStatus, useImageSettingsSetSettings, useIntegrationsCreate, useIntegrationsDelete, useIntegrationsGet, useIntegrationsGetAvailableTypes, useIntegrationsGetByAddonId, useIntegrationsGetSettings, useIntegrationsList, useIntegrationsSetSettings, useIntegrationsTestConnection, useIntegrationsUpdate, useIntercomEndTalkSession, useIntercomGetStatus, useIntercomHandleAnswer, useIntercomPushTalkAudio, useIntercomStartSession, useIntercomStartTalkSession, useIntercomStopSession, useIsMidWidth, useIsMobile, useLawnMowerControlDock, useLawnMowerControlGetStatus, useLawnMowerControlPause, useLawnMowerControlStartMowing, useLiveBuffer, useLiveEvent, useLlmDeleteModel, useLlmDeleteProfile, useLlmGenerate, useLlmGenerateVision, useLlmGetDefaults, useLlmGetRuntimeStatus, useLlmGetUsage, useLlmInstallModel, useLlmListModelCatalog, useLlmListModels, useLlmListNodeModels, useLlmListProfileKinds, useLlmListProfiles, useLlmListRuntimeNodes, useLlmSetDefault, useLlmStartRuntime, useLlmStopRuntime, useLlmTestProfile, useLlmUpsertProfile, useLocalNetworkGetAllowedAddresses, useLocalNetworkGetConnectionEndpoints, useLocalNetworkGetPreferred, useLocalNetworkList, useLocalNetworkResetAllowlistToBestMatch, useLocalNetworkSetAllowedAddresses, useLockControlGetStatus, useLockControlLock, useLockControlOpen, useLockControlUnlock, useMediaPlayerGetStatus, useMediaPlayerNext, useMediaPlayerPause, useMediaPlayerPlay, useMediaPlayerPlayMedia, useMediaPlayerPrevious, useMediaPlayerSeek, useMediaPlayerSelectSource, useMediaPlayerSetMute, useMediaPlayerSetRepeat, useMediaPlayerSetShuffle, useMediaPlayerSetVolume, useMediaPlayerStop, useMeshNetworkGetStatus, useMeshNetworkJoin, useMeshNetworkLeave, useMeshNetworkListPeers, useMeshNetworkLogout, useMeshNetworkStartLogin, useMeshNetworkTestConnection, useMetricsProviderCollectSnapshot, useMetricsProviderDumpHeapSnapshot, useMetricsProviderGetAddonStats, useMetricsProviderGetCached, useMetricsProviderGetCpuTemperature, useMetricsProviderGetCurrent, useMetricsProviderGetDiskSpace, useMetricsProviderGetGpuInfo, useMetricsProviderGetProcessStats, useMetricsProviderKillProcess, useMetricsProviderListAddonInstances, useMetricsProviderListNodeProcesses, useMotionDetectionAnalyze, useMotionDetectionApplyDeviceSettingsPatch, useMotionDetectionGetDeviceLiveContribution, useMotionDetectionGetDeviceSettingsContribution, useMotionDetectionRemoveCamera, useMotionDetectionReset, useMotionGetStatus, useMotionIsDetected, useMotionTriggerGetStatus, useMotionTriggerSetMotionTrigger, useMotionZonesGetOptions, useMotionZonesGetStatus, useMotionZonesSetZone, useMqttBrokerAddBroker, useMqttBrokerGetBrokerConfig, useMqttBrokerGetStatus, useMqttBrokerListBrokers, useMqttBrokerRemoveBroker, useMqttBrokerStartEmbeddedBroker, useMqttBrokerStopEmbeddedBroker, useMqttBrokerTestConnection, useNativeObjectDetectionGetStatus, useNativeObjectDetectionSetEnabled, useNetworkAccessGetEndpoint, useNetworkAccessGetStatus, useNetworkAccessListEndpoints, useNetworkAccessStart, useNetworkAccessStop, useNetworkQualityGetAllStats, useNetworkQualityGetDeviceStats, useNetworkQualityReportClientStats, useNodesClusterAddonStatus, useNodesDeployAddon, useNodesExecuteQuery, useNodesGetCapUsageGraph, useNodesGetNodeAddons, useNodesRenameNode, useNodesRestartAddon, useNodesRestartNode, useNodesRestartProcess, useNodesSetProcessLogLevel, useNodesShutdownNode, useNodesTopology, useNodesUndeployAddon, useNotificationOutputDeleteTarget, useNotificationOutputDiscoverTargets, useNotificationOutputListTargetKinds, useNotificationOutputListTargets, useNotificationOutputSend, useNotificationOutputSetTargetEnabled, useNotificationOutputTestTarget, useNotificationOutputUpsertTarget, useNotifierCancel, useNotifierGetStatus, useNotifierSend, useNumericSensorGetStatus, useOptimisticSlice, useOptionalSystem, useOptionalWidgetRegistry, useOsdGetStatus, useOsdSetOverlay, usePTZ, usePetFeederCallPet, usePetFeederCancelFeed, usePetFeederFeed, usePetFeederGetStatus, usePetFeederMarkFoodReplenished, usePetFeederPlaySound, usePetFeederResetDesiccant, usePetFeederSetChildLock, usePetFeederSetFeedSound, usePetFeederSetIndicatorLight, usePetFeederSetVolume, usePipelineAnalyticsApplyDeviceSettingsPatch, usePipelineAnalyticsClearTracks, usePipelineAnalyticsDeleteDeviceEvents, usePipelineAnalyticsDeleteTracks, usePipelineAnalyticsGetActiveTracks, usePipelineAnalyticsGetAudioEvents, usePipelineAnalyticsGetDeviceLiveContribution, usePipelineAnalyticsGetDeviceSettingsContribution, usePipelineAnalyticsGetEventDensity, usePipelineAnalyticsGetEventMedia, usePipelineAnalyticsGetEventStoreFootprint, usePipelineAnalyticsGetKeyEvents, usePipelineAnalyticsGetMotionEvents, usePipelineAnalyticsGetObjectEvents, usePipelineAnalyticsGetSensorEvents, usePipelineAnalyticsGetTrack, usePipelineAnalyticsGetTrackMedia, usePipelineAnalyticsListEventKinds, usePipelineAnalyticsListOpsLog, usePipelineAnalyticsListRecentTracks, usePipelineAnalyticsListTracks, usePipelineAnalyticsPruneEvents, usePipelineAnalyticsPruneEventsBefore, usePipelineAnalyticsPruneTracksBefore, usePipelineAnalyticsSearchObjectEvents, usePipelineAnalyticsWipeAllAnalytics, usePipelineExecutorCacheFrameInPool, usePipelineExecutorClearDeviceOverrides, usePipelineExecutorDeleteModel, usePipelineExecutorDeleteTemplate, usePipelineExecutorDownloadModel, usePipelineExecutorGetAddonModels, usePipelineExecutorGetAudioCapabilities, usePipelineExecutorGetAvailableEngines, usePipelineExecutorGetCapabilities, usePipelineExecutorGetDefaultSteps, usePipelineExecutorGetDetectionConfigSchema, usePipelineExecutorGetEffectiveTuning, usePipelineExecutorGetEngineProvisioning, usePipelineExecutorGetGlobalPipelineConfig, usePipelineExecutorGetGlobalSteps, usePipelineExecutorGetOrchestratorConfigSchema, usePipelineExecutorGetReferenceAudio, usePipelineExecutorGetReferenceAudioFiles, usePipelineExecutorGetReferenceImage, usePipelineExecutorGetSchema, usePipelineExecutorGetSelectedEngine, usePipelineExecutorGetVideoPipelineSteps, usePipelineExecutorInferCached, usePipelineExecutorKillEngine, usePipelineExecutorListLoadedEngines, usePipelineExecutorListReferenceImages, usePipelineExecutorListTemplates, usePipelineExecutorReprobeEngine, usePipelineExecutorRunAudioTest, usePipelineExecutorRunPipeline, usePipelineExecutorRunPipelineBatch, usePipelineExecutorSaveTemplate, usePipelineExecutorSetVideoPipelineSteps, usePipelineExecutorSpinEngine, usePipelineExecutorUncacheFrame, usePipelineExecutorUpdateTemplate, usePipelineExecutorValidatePipeline, usePipelineOrchestratorApplyDeviceSettingsPatch, usePipelineOrchestratorAssignAudio, usePipelineOrchestratorAssignPipeline, usePipelineOrchestratorDeleteTemplate, usePipelineOrchestratorGetAgentLoad, usePipelineOrchestratorGetAgentSettings, usePipelineOrchestratorGetAudioAssignment, usePipelineOrchestratorGetAudioAssignments, usePipelineOrchestratorGetAudioNodeLoad, usePipelineOrchestratorGetCameraMetrics, usePipelineOrchestratorGetCameraSettings, usePipelineOrchestratorGetCameraStatus, usePipelineOrchestratorGetCameraStatuses, usePipelineOrchestratorGetCameraStepOverrides, usePipelineOrchestratorGetCapabilityBindings, usePipelineOrchestratorGetDeviceLiveContribution, usePipelineOrchestratorGetDeviceSettingsContribution, usePipelineOrchestratorGetGlobalMetrics, usePipelineOrchestratorGetIngestOwner, usePipelineOrchestratorGetPipelineAssignment, usePipelineOrchestratorGetPipelineAssignments, usePipelineOrchestratorListAgentSettings, usePipelineOrchestratorListTemplates, usePipelineOrchestratorRebalance, usePipelineOrchestratorRemoveAgentSettings, usePipelineOrchestratorResetNodePipelineDefaults, usePipelineOrchestratorResolvePipeline, usePipelineOrchestratorSaveTemplate, usePipelineOrchestratorSetAgentAddonDefaults, usePipelineOrchestratorSetAgentCapabilities, usePipelineOrchestratorSetAgentDetectWeight, usePipelineOrchestratorSetAgentMaxCameras, usePipelineOrchestratorSetAgentReachableHost, usePipelineOrchestratorSetCameraPipelineForAgent, usePipelineOrchestratorSetCameraStepOverride, usePipelineOrchestratorSetCameraStepToggle, usePipelineOrchestratorSetCapabilityBinding, usePipelineOrchestratorUnassignAudio, usePipelineOrchestratorUnassignPipeline, usePipelineOrchestratorUpdateTemplate, usePipelineRunnerAttachCamera, usePipelineRunnerDetachCamera, usePipelineRunnerGetAllCameraMetrics, usePipelineRunnerGetCameraMetrics, usePipelineRunnerGetLocalCameras, usePipelineRunnerGetLocalLoad, usePipelineRunnerGetLocalMetrics, usePipelineRunnerGetNativeCrop, usePipelineRunnerReportMotion, usePipelineRunnerRunDetailSubtree, usePlateGalleryAssignPlate, usePlateGalleryAssignPlates, usePlateGalleryCorrectPlateText, usePlateGalleryCreateVehicle, usePlateGalleryDeletePlate, usePlateGalleryDeleteVehicle, usePlateGalleryGetPlateByTrack, usePlateGalleryGetPlateMedia, usePlateGalleryListPlates, usePlateGalleryListVehicleSamples, usePlateGalleryListVehicles, usePlateGalleryRemoveVehicleSample, usePlateGalleryRenameVehicle, usePlateGallerySearchPlates, usePlateGallerySuggestPlateClusters, usePlateGalleryUnassignPlate, usePlateGalleryUnassignPlates, usePlayerOverlayLayer, usePlayerOverlayLayers, usePlayerToolbarButton, usePlayerToolbarButtons, usePowerMeterGetStatus, usePresenceGetStatus, usePressureSensorGetStatus, usePrivacyMaskGetOptions, usePrivacyMaskGetStatus, usePrivacyMaskSetMask, usePtzAutotrackGetSettings, usePtzAutotrackGetStatus, usePtzAutotrackSetEnabled, usePtzAutotrackSetSettings, usePtzContinuousMove, usePtzDeletePreset, usePtzGetOptions, usePtzGetPosition, usePtzGetPresets, usePtzGetStatus, usePtzGoHome, usePtzGoToPreset, usePtzMove, usePtzSavePreset, usePtzSetAutofocus, usePtzStop, useRebootReboot, useRecordedPlayback, useRecordingApplyDeviceSettingsPatch, useRecordingDeleteFootprint, useRecordingExportCancelExport, useRecordingExportCreateExport, useRecordingExportDeleteExport, useRecordingExportGetDownloadUrl, useRecordingExportGetExport, useRecordingExportListExports, useRecordingGetAvailability, useRecordingGetDaysWithRecordings, useRecordingGetDeviceConfig, useRecordingGetDeviceLiveContribution, useRecordingGetDeviceSettingsContribution, useRecordingGetPlaybackManifest, useRecordingGetStatus, useRecordingGetStorageUsage, useRecordingListOpsLog, useRecordingLocateSegment, useRecordingPruneFootage, useRecordingReadSegmentBytes, useRecordingRescanStorage, useRecordingSetDeviceConfig, useRemoteComponent, useSceneMonitorCaptureReference, useSceneMonitorCreateScene, useSceneMonitorDeleteReference, useSceneMonitorDeleteScene, useSceneMonitorGetStatus, useSceneMonitorListScenes, useSceneMonitorRecheckNow, useSceneMonitorUpdateScene, useScriptRunnerGetStatus, useScriptRunnerRun, useScriptRunnerStop, useScrubController, useServerManagementApplyServerUpdate, useServerManagementCheckServerUpdate, useServerManagementGetServerPackageStatus, useServerManagementRestartServer, useServerManagementRollbackServerUpdate, useSettingsStoreCount, useSettingsStoreDeclareCollection, useSettingsStoreDelete, useSettingsStoreGet, useSettingsStoreHistogram, useSettingsStoreInsert, useSettingsStoreIsEmpty, useSettingsStoreQuery, useSettingsStoreSet, useSettingsStoreUpdate, useSmokeGetStatus, useSnapshotApplyDeviceSettingsPatch, useSnapshotGetDeviceLiveContribution, useSnapshotGetDeviceSettingsContribution, useSnapshotGetSnapshot, useSnapshotGetSnapshotOverview, useSnapshotGetStatus, useSnapshotInvalidateCache, useStorageAbortUpload, useStorageBeginDownload, useStorageBeginUpload, useStorageDelete, useStorageDeleteLocation, useStorageEndDownload, useStorageExists, useStorageFinalizeUpload, useStorageGetAvailableSpace, useStorageGetDefaultLocation, useStorageList, useStorageListLocationDeclarations, useStorageListLocations, useStorageListProviders, useStorageRead, useStorageReadChunk, useStorageResolve, useStorageTestConfig, useStorageTestLocation, useStorageUpsertLocation, useStorageWrite, useStorageWriteChunk, useStreamBrokerApplyDeviceSettingsPatch, useStreamBrokerAssignProfile, useStreamBrokerGetAllRtspEntries, useStreamBrokerGetBrokerStats, useStreamBrokerGetDeviceLiveContribution, useStreamBrokerGetDeviceSettingsContribution, useStreamBrokerGetPreBufferInfo, useStreamBrokerGetRtspEntry, useStreamBrokerGetRtspPort, useStreamBrokerGetStreamUrl, useStreamBrokerGetStreamWithCodec, useStreamBrokerIsRtspEnabled, useStreamBrokerKillClient, useStreamBrokerListAllCameraStreams, useStreamBrokerListAllProfileSlots, useStreamBrokerListClients, useStreamBrokerProbeStream, useStreamBrokerPublishCameraStream, useStreamBrokerPullAudioChunks, useStreamBrokerPullFrameHandles, useStreamBrokerRegenerateRtspToken, useStreamBrokerReleaseStreamWithCodec, useStreamBrokerRestartProfile, useStreamBrokerRetractCameraStream, useStreamBrokerSetPreBufferDuration, useStreamBrokerSetRtspEnabled, useStreamBrokerSubscribeAudioChunks, useStreamBrokerSubscribeFrames, useStreamBrokerUnassignProfile, useStreamBrokerUnsubscribeAudioChunks, useStreamBrokerUnsubscribeFrames, useStreamCatalogGetCatalog, useStreamParamsGetConfigSchema, useStreamParamsGetOptions, useStreamParamsGetStatus, useStreamParamsSetProfile, useSwitchGetStatus, useSwitchSetState, useSystem, useSystemFeatureFlags, useSystemForceRetentionCleanup, useSystemGetRetentionConfig, useSystemHealth, useSystemInfo, useSystemMutation, useSystemNetworkAddresses, useSystemQuery, useSystemSetRetentionConfig, useTamperGetStatus, useTemperatureSensorGetStatus, useThemeMode, useToastOnToast, useTurnProviderGetTurnServers, useUpdateGetStatus, useUpdateInstallUpdate, useUserManagementConfirmTotp, useUserManagementCreateApiKey, useUserManagementCreateScopedToken, useUserManagementCreateUser, useUserManagementDeleteUser, useUserManagementDisableTotp, useUserManagementGetTotpStatus, useUserManagementListApiKeys, useUserManagementListOauthSessions, useUserManagementListScopedTokens, useUserManagementListUsers, useUserManagementOauthExchangeCode, useUserManagementOauthIssueCode, useUserManagementOauthRefresh, useUserManagementOauthVerifyAccessToken, useUserManagementResetPassword, useUserManagementRevokeApiKey, useUserManagementRevokeOauthSession, useUserManagementRevokeScopedToken, useUserManagementSetUserScopes, useUserManagementSetupTotp, useUserManagementUpdateUser, useUserManagementValidateApiKey, useUserManagementValidateCredentials, useUserManagementValidateScopedToken, useUserManagementVerifyTotp, useVacuumControlGetStatus, useVacuumControlLocate, useVacuumControlPause, useVacuumControlReturnToBase, useVacuumControlSetFanSpeed, useVacuumControlStart, useVacuumControlStop, useValveClose, useValveGetStatus, useValveOpen, useValveSetPosition, useValveStop, useVibrationGetStatus, useVideoclipsGetClipPlayback, useVideoclipsListClips, useVodPlayback, useWaterHeaterGetStatus, useWaterHeaterSetAway, useWaterHeaterSetOperationMode, useWaterHeaterSetTargetTemp, useWeatherGetStatus, useWebrtcSessionAddIceCandidate, useWebrtcSessionCloseSession, useWebrtcSessionCreateSession, useWebrtcSessionGetIceCandidates, useWebrtcSessionGetSessionState, useWebrtcSessionHandleAnswer, useWebrtcSessionHandleOffer, useWebrtcSessionHasAdaptiveBitrate, useWebrtcSessionListStreams, useWidget, useWidgetMetadata, useWidgetRegistry, useZoneAnalyticsGetCameraHistory, useZoneAnalyticsGetCurrentSnapshot, useZoneAnalyticsGetUnzonedHistory, useZoneAnalyticsGetZoneHistory, useZoneEditing, useZoneRulesListRules, useZoneRulesSetRules, useZonesAddZone, useZonesListZones, useZonesRemoveZone, useZonesUpdateZone, vacuumStateMeta, validateScopes, valveStateMeta, waterHeaterPhase, waterHeaterTint, weatherConditionMeta, weatherTint };
46910
+ export { AddonGlobalSettingsForm, AgentStepEditor, AlarmHeroCard, AlarmInlineControl as AlarmPanelInlineControl, AppShell, ArcKnob, AudioClassificationList, AudioLevelWaveform, AudioWaveform, AutotrackSection, BTN_COMPACT, BTN_COMPACT_DANGER, BTN_COMPACT_PRIMARY, BTN_COMPACT_WARNING, Badge, BatteryBadge, BottomSheet, Breadcrumb, BrightnessPanel, Button, ButtonControl, ButtonHeroCard, CENTER, CHIP_ACTIVE, CHIP_BASE, CHIP_INACTIVE, CLASS_COLORS, COLUMN_BREAKPOINT_CLASS, COLUMN_PRIORITY, COMMIT_DEDUPE_TOLERANCE_MS, COMMIT_DEDUPE_WINDOW_MS, CONTROL_CAP_NAMES, CONTROL_FILLS, CameraStreamPlayer, Card, Checkbox, ChildSectionAccordion, ClimatePanel, CodeBlock, CollapsibleCard, ConfigFormBuilder, FormField as ConfigFormField, ConfigSchemaField, ConfirmActionButton, ConfirmDialogProvider, ConsumablesPanel, ContainerChildrenProvider, ContainerPrimaryHero, ControlColumn, ControlHeroCard, ControlInlineControl, ControlPanel, CopyButton, CoverHeroCard, CoverInlineControl, CoverPanel, CustomFieldRenderersProvider, DEFAULT_COLOR, DEVICE_COLUMNS, DEVICE_LIST_PAGE_SIZE_KEY, DEVICE_LIST_PAGE_SIZE_OPTIONS, DEVICE_ROLE_META, DEVICE_TYPE_CONTROL, DEVICE_TYPE_META, DISPLAY_ICON_REGISTRY, DataTable, DetectionCanvas, DetectionOverlay, DetectionResultTree, DevShell, DeviceActivityPanel, DeviceBatchToolbar, DeviceCard, DeviceContextProvider, DeviceExportPanel, DeviceGrid, DeviceItem, DeviceList, DeviceMultiSelectField, DeviceSelectField, DeviceStepMatrix, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, DiscoveryPanel, DoorbellRecentPanel, Dropdown, DropdownContent, DropdownItem, DropdownTrigger, DummyHeroCard, DummyInline, EVENT_KIND_ICONS, EmptyState, ErrorBox, EventKindGlyph, EventStream, FILL, FanHeroCard, FanInlineControl, FanPanel, FilterBar, FloatingEventStream, FloatingLogStream, FloatingPanel, FormField$1 as FormField, GRID_GAP, GRID_PAIRED, GRID_QUICK_STATS, GripTrack, GroupedModelSelector, HOST_WIDGETS, HlsVideo, HoverZoomImage, HumidifierHeroCard, HumidifierInlineControl, INPUT_COMPACT, IconAction, IconButton, ImageHeroCard, ImageInlineControl, ImageSelector, InferenceConfigSelector, Input, KebabMenu, KeyValueList, LIST_ROW, Label, LawnMowerHeroCard, LawnMowerInlineControl, LightHeroCard, LightInlineControl, LockHeroCard, LockInlineControl, LockPanel, LogStream, LoginForm, MODE_COLOR, MaskShapeCanvas, MediaPlayerHeroCard, MediaPlayerInlineControl, MediaPlayerPanel, MobileDrawer, MotionZonesSettings, NodeMultiSelectField, NodePicker, NodeSelectField, OfflineBadge, PHASE_CONFIG, PRIORITY, PTZOverlay, PageHeader, PhaseIcon, PipelineBuilder, PipelineRuntimeSelector, PipelineStep, PipelineTreeMatrix, PlayerOverlaysProvider, Popover, PopoverContent, PopoverRowAction, PopoverTrigger, PrimaryChildPicker, PrivacyMaskSettings, ProviderBadge, PtzPanel, QrCode, RECORDED_PLAYBACK_MODES, RIGHT, ROLE_DESCRIPTOR, RadialGauge, RecordedPlaybackProvider, RecordingPanel, ResponseLog, SECTION_BODY, SECTION_CARD, SECTION_HEADER, SPLIT_PANEL_OUTER, SPLIT_PANEL_SIDE, STACK_GAP, STATE_COLOR, ScopePicker, ScrollArea, Select, SemanticBadge, SensorHeroCard, SensorInlineControl, SensorValueAtom, Separator, Sidebar, SidebarItem, Skeleton, SlideOverPanel, SlideToggle, SnapshotButton, StatCard, StateValuesStream, StatusBadge, StepTimings, StepTreeMaster, Stepper, StreamBrokerSelector, StreamPanel, Switch, SwitchHeroCard, SwitchInlineControl, SwitchPanel, SystemProvider, TEXT_FIELD_LABEL, TEXT_HINT, TEXT_METRIC, TEXT_SECTION_LABEL, TEXT_VALUE, TIMEZONES, Tabs, TabsContent, TabsList, TabsTrigger, TapToggle, ThemeProvider, ThermostatHeroCard, ThermostatInlineControl, TimezoneSelector, Tooltip, TooltipContent, TooltipTrigger, VacuumHeroCard, VacuumInlineControl, ValueReadout, ValveHeroCard, ValveInlineControl, VersionBadge, VodPlaybackProvider, WaterHeaterHeroCard, WaterHeaterInlineControl, WeatherHeroCard, WeatherInlineControl, WidgetMetricCard, WidgetPanel, WidgetRegistryProvider, WidgetSlot, ZoneEditingProvider, allDeviceTypeFilterOptions, buildStepTreeFromSchema, childEntityId, childListName, cn, columnsForContext, containerChildToRef, countableDevices, coverHighlight, createSharedContext, createTheme, cursorFractionFor, darkColors, defaultTheme, deriveDeviceKind, deviceMatchesFilter, deviceOptionLabel, deviceRoleMeta, deviceRoleMetaOf, deviceTypeMeta, deviceTypeMetaOf, devicesToOptions, ensureMfHostInit, eventKindLabel, filterDeviceOptions, findTimezone, formatControlDateTime, formatLastSeen, formatNumeric, fuzzyMatch, getClassColor, getPhaseVisual, groupChildrenByLayout, hardwareLabel, humidifierTint, createLucideIcon as i, initialScrubState, isAbsentProvider, isFieldVisible, lawnMowerActivityMeta, lightColors, loadRemoteBundle, makeScrubBridge, metadataEntries, metadataString, mirror, mountAddonPage, Square as n, nextSort, normalizeForSearch, overrideEntityIdFromLink, parseRecordedServerMessage, providerIcons, EyeOff as r, resolveContainerPrimary, resolveControlAlign, resolveDeviceControl, resolveDisplayIcon, resolveEventKindIcon, resolvePrimaryChild, resolveSensorDisplay, scrubReducer, selectedDeviceOptions, serializeRecordedCommand, shouldCommit, shouldEmit, shouldUseSingleNode, sortRows, statusIcons, stripParentNamePrefix, Trash2 as t, tankAlert, themeToCss, trpc, useAccessoriesGetStatus, useAccessoriesSetChildHidden, useAddonPagesListPages, useAddonSettingsGetDeviceSettings, useAddonSettingsGetGlobalSettings, useAddonSettingsUpdateDeviceSettings, useAddonSettingsUpdateGlobalSettings, useAddonWidgetsListWidgets, useAddonsApplyAutoUpdateToAll, useAddonsCancelJob, useAddonsCustom, useAddonsForceRefresh, useAddonsGetAddonAutoUpdate, useAddonsGetAutoUpdateSettings, useAddonsGetJob, useAddonsGetLastRestart, useAddonsGetLogs, useAddonsGetVersions, useAddonsInstallFromWorkspace, useAddonsInstallPackage, useAddonsIsWorkspaceAvailable, useAddonsList, useAddonsListCapabilityProviders, useAddonsListFrameworkPackages, useAddonsListJobs, useAddonsListPackages, useAddonsListUpdates, useAddonsListWorkspacePackages, useAddonsOnAddonLogs, useAddonsReloadPackages, useAddonsRestartAddon, useAddonsRestartServer, useAddonsRetryLoad, useAddonsRollbackPackage, useAddonsSearchAvailable, useAddonsSetAddonAutoUpdate, useAddonsSetAutoUpdateSettings, useAddonsSetCapabilityProviderEnabled, useAddonsStartJob, useAddonsUninstallPackage, useAddonsUpdatePackage, useAirQualitySensorGetStatus, useAlarmPanelArm, useAlarmPanelDisarm, useAlarmPanelGetStatus, useAlarmPanelTrigger, useAlertsDismiss, useAlertsEmit, useAlertsGetUnreadCount, useAlertsList, useAlertsMarkAllRead, useAlertsMarkRead, useAlertsUpdate, useAllWidgets, useAmbientLightSensorGetStatus, useAudioAnalysisApplyDeviceSettingsPatch, useAudioAnalysisGetDeviceLiveContribution, useAudioAnalysisGetDeviceSettingsContribution, useAudioAnalysisResolveDeviceSettings, useAudioAnalyzerAnalyseChunk, useAudioAnalyzerClassify, useAudioAnalyzerDispose, useAudioAnalyzerIsReady, useAudioAnalyzerReprobeAudioEngine, useAudioCodecCanHandle, useAudioCodecCloseSession, useAudioCodecCreateDecodeSession, useAudioCodecCreateEncodeSession, useAudioCodecFlushEncode, useAudioCodecListActiveSessions, useAudioCodecListSupportedCodecs, useAudioCodecPullEncoded, useAudioCodecPullPcm, useAudioCodecPushEncodedFrame, useAudioCodecPushPcm, useAudioMetricsGetCurrentSnapshot, useAudioMetricsGetHistory, useAutomationControlDisable, useAutomationControlEnable, useAutomationControlGetStatus, useAutomationControlTrigger, useBackupDelete, useBackupGetEntries, useBackupList, useBackupListArchives, useBackupListDestinations, useBackupListLocations, useBackupPreviewSchedule, useBackupRestore, useBackupTrigger, useBackupUpsertDestinationPolicy, useBatteryGetStatus, useBatteryWakeForStream, useBinaryGetStatus, useBrightnessGetStatus, useBrightnessSetBrightness, useBrokerAdd, useBrokerGet, useBrokerGetBrokerConfig, useBrokerGetSettings, useBrokerGetSettingsSchema, useBrokerGetState, useBrokerGetStatus, useBrokerList, useBrokerListProviders, useBrokerPublish, useBrokerRemove, useBrokerSetSettings, useBrokerSubscribe, useBrokerTestConnection, useBrokerTestSettings, useBrokerUnsubscribe, useButtonPress, useCameraCredentialsGetCredentials, useCameraCredentialsGetStatus, useCameraPipelineConfigApplyDeviceSettingsPatch, useCameraPipelineConfigGetDeviceLiveContribution, useCameraPipelineConfigGetDeviceSettingsContribution, useCameraStreamsGetBrokerStreams, useCameraStreamsGetCameraStreams, useCameraStreamsGetProfileRtspEntries, useCameraStreamsGetRtspEntries, useCameraStreamsPickStream, useCarbonMonoxideGetStatus, useClimateControlGetStatus, useClimateControlSetFanMode, useClimateControlSetMode, useClimateControlSetPreset, useClimateControlSetSwingHorizontal, useClimateControlSetSwingVertical, useClimateControlSetTarget, useClimateControlSetTargetHumidity, useClimateControlSetTargetRange, useClusterNodes, useColorGetStatus, useColorSetColor, useConfirm, useConnectivityGetStatus, useConsumablesGetStatus, useConsumablesReset, useContactGetStatus, useContainerChildren, useControlGetStatus, useControlSetValue, useCoverClose, useCoverGetStatus, useCoverOpen, useCoverSetPosition, useCoverSetTiltPosition, useCoverStop, useCustomFieldRenderer, useDayNightGetOptions, useDayNightGetStatus, useDayNightSetSettings, useDebouncedString, useDecoderCreateSession, useDecoderDestroySession, useDecoderGetFrame, useDecoderGetInfo, useDecoderGetShmStats, useDecoderGetStats, useDecoderListActiveSessions, useDecoderOpenStream, useDecoderPullFrames, useDecoderPullHandles, useDecoderPushPacket, useDecoderReprobeHwaccel, useDecoderSupportsCodec, useDecoderUpdateConfig, useDetectionPipelineApplyDeviceSettingsPatch, useDetectionPipelineGetDeviceLiveContribution, useDetectionPipelineGetDeviceSettingsContribution, useDevShell, useDevice, useDeviceAdoptionAdopt, useDeviceAdoptionGetCandidate, useDeviceAdoptionGetStatus, useDeviceAdoptionListCandidateFilters, useDeviceAdoptionListCandidates, useDeviceAdoptionRefresh, useDeviceAdoptionRelease, useDeviceAdoptionResync, useDeviceAutotrack, useDeviceBattery, useDeviceCapSlice, useDeviceCapability, useDeviceDetections, useDeviceDiscoveryAdoptDevice, useDeviceDiscoveryGetStatus, useDeviceDiscoveryListDiscovered, useDeviceDiscoveryRefreshDiscovery, useDeviceDiscoveryReleaseDevice, useDeviceExportApplyDeviceSettingsPatch, useDeviceExportExposeDevice, useDeviceExportGetDeviceLiveContribution, useDeviceExportGetDeviceSettingsContribution, useDeviceExportGetStatus, useDeviceExportListExposedDevices, useDeviceExportListSupportedDeviceKinds, useDeviceExportUnexposeDevice, useDeviceId, useDeviceListPageSize, useDeviceManagerAddLocation, useDeviceManagerAdoptDevice, useDeviceManagerAdoptionAdopt, useDeviceManagerAdoptionListCandidateFilters, useDeviceManagerAdoptionListCandidates, useDeviceManagerAdoptionRefresh, useDeviceManagerAdoptionRelease, useDeviceManagerAdoptionResync, useDeviceManagerAllocateDeviceId, useDeviceManagerApplyDeviceSettingsPatch, useDeviceManagerApplyInitialMeta, useDeviceManagerCreateDevice, useDeviceManagerDisable, useDeviceManagerDiscoverAllProviders, useDeviceManagerDiscoverDevices, useDeviceManagerDiscoverProvider, useDeviceManagerDiscoveryProviders, useDeviceManagerEnable, useDeviceManagerGetAllBindings, useDeviceManagerGetBindings, useDeviceManagerGetChildren, useDeviceManagerGetConfigSchema, useDeviceManagerGetCreationSchema, useDeviceManagerGetDevice, useDeviceManagerGetDeviceAggregate, useDeviceManagerGetDeviceLiveContribution, useDeviceManagerGetDeviceLiveInfoAggregate, useDeviceManagerGetDeviceSettingsAggregate, useDeviceManagerGetDeviceSettingsContribution, useDeviceManagerGetDeviceStatusAggregate, useDeviceManagerGetLinkedDevices, useDeviceManagerGetRoleDisplayDefaults, useDeviceManagerGetSettingsSchema, useDeviceManagerGetStreamProfileMap, useDeviceManagerGetStreamSources, useDeviceManagerGetWireableFields, useDeviceManagerListAll, useDeviceManagerListBindableCapsForDeviceType, useDeviceManagerListLocations, useDeviceManagerListPersistedByAddon, useDeviceManagerListWrappersForCap, useDeviceManagerLoadConfig, useDeviceManagerLoadMeta, useDeviceManagerLoadRuntimeState, useDeviceManagerPersistConfig, useDeviceManagerProbeStreams, useDeviceManagerProviderCreationType, useDeviceManagerProviderDiscoveryParamsSchema, useDeviceManagerRegisterDevice, useDeviceManagerRemove, useDeviceManagerRemoveByIntegration, useDeviceManagerRemoveDevice, useDeviceManagerRemoveLocation, useDeviceManagerRunDeviceAction, useDeviceManagerSetChildLayout, useDeviceManagerSetDeviceLinks, useDeviceManagerSetDisabled, useDeviceManagerSetDisplay, useDeviceManagerSetIntegrationId, useDeviceManagerSetLinkDeviceId, useDeviceManagerSetLocation, useDeviceManagerSetMetadata, useDeviceManagerSetName, useDeviceManagerSetPrimaryChildEntityId, useDeviceManagerSetRole, useDeviceManagerSetRoleDisplayDefaults, useDeviceManagerSetStreamProfileMap, useDeviceManagerSetType, useDeviceManagerSetWrapperActive, useDeviceManagerTestCreationField, useDeviceManagerTestField, useDeviceManagerUpdateConfig, useDeviceManagerUpdateDeviceField, useDeviceManagerUpdateDeviceFieldsBatch, useDeviceOpsGetConfigEntries, useDeviceOpsGetRawState, useDeviceOpsGetSettingsSchema, useDeviceOpsGetStreamSources, useDeviceOpsRemoveDevice, useDeviceOpsRunAction, useDeviceOpsSetConfig, useDeviceProviderAdoptDiscoveredDevice, useDeviceProviderCreateDevice, useDeviceProviderDiscoverDevices, useDeviceProviderGetChildCreationSchema, useDeviceProviderGetDevices, useDeviceProviderGetDiscoveryParamsSchema, useDeviceProviderGetManualCreationType, useDeviceProviderGetStatus, useDeviceProviderStart, useDeviceProviderStop, useDeviceProviderSupportsDiscovery, useDeviceProviderSupportsManualCreation, useDeviceProviderTestCreationField, useDeviceProxy, useDeviceSnapshot, useDeviceSnapshotImage, useDeviceState, useDeviceStateGetAllSnapshots, useDeviceStateGetCapSlice, useDeviceStateGetSnapshot, useDeviceStateSetCapSlice, useDeviceStateSlice, useDeviceStatusGetStatus, useDeviceWebrtc, useDevices, useDoorbellApplyDeviceSettingsPatch, useDoorbellEvents, useDoorbellGetDeviceLiveContribution, useDoorbellGetDeviceSettingsContribution, useDoorbellGetStatus, useEnumSensorGetStatus, useEventEmitterGetStatus, useEventInvalidation, useEventStreamLatest, useEventStreamMap, useEventsGetEventClipUrl, useEventsGetEventThumbnail, useEventsGetEvents, useFaceGalleryAssignFace, useFaceGalleryAssignFaces, useFaceGalleryCreateIdentity, useFaceGalleryDeleteFace, useFaceGalleryDeleteIdentity, useFaceGalleryGetFaceByTrack, useFaceGalleryGetFaceMedia, useFaceGalleryListIdentities, useFaceGalleryListIdentitySamples, useFaceGalleryListRecentFaces, useFaceGalleryRemoveSample, useFaceGalleryRenameIdentity, useFaceGallerySuggestFaceClusters, useFaceGalleryUnassignFace, useFaceGalleryUnassignFaces, useFanControlGetStatus, useFanControlSetDirection, useFanControlSetOscillating, useFanControlSetPercentage, useFanControlSetPreset, useFeatureProbeGetStatus, useFloodGetStatus, useGasGetStatus, useHumidifierGetStatus, useHumidifierSetMode, useHumidifierSetOn, useHumidifierSetTargetHumidity, useHumiditySensorGetStatus, useImageGetStatus, useImageSettingsGetOptions, useImageSettingsGetStatus, useImageSettingsSetSettings, useIntegrationsCreate, useIntegrationsDelete, useIntegrationsGet, useIntegrationsGetAvailableTypes, useIntegrationsGetByAddonId, useIntegrationsGetSettings, useIntegrationsList, useIntegrationsSetSettings, useIntegrationsTestConnection, useIntegrationsUpdate, useIntercomEndTalkSession, useIntercomGetStatus, useIntercomHandleAnswer, useIntercomPushTalkAudio, useIntercomStartSession, useIntercomStartTalkSession, useIntercomStopSession, useIsMidWidth, useIsMobile, useLawnMowerControlDock, useLawnMowerControlGetStatus, useLawnMowerControlPause, useLawnMowerControlStartMowing, useLiveBuffer, useLiveEvent, useLlmDeleteModel, useLlmDeleteProfile, useLlmGenerate, useLlmGenerateVision, useLlmGetDefaults, useLlmGetRuntimeStatus, useLlmGetUsage, useLlmInstallModel, useLlmListModelCatalog, useLlmListModels, useLlmListNodeModels, useLlmListProfileKinds, useLlmListProfiles, useLlmListRuntimeNodes, useLlmSetDefault, useLlmStartRuntime, useLlmStopRuntime, useLlmTestProfile, useLlmUpsertProfile, useLocalNetworkGetAllowedAddresses, useLocalNetworkGetConnectionEndpoints, useLocalNetworkGetPreferred, useLocalNetworkList, useLocalNetworkResetAllowlistToBestMatch, useLocalNetworkSetAllowedAddresses, useLockControlGetStatus, useLockControlLock, useLockControlOpen, useLockControlUnlock, useMediaPlayerGetStatus, useMediaPlayerNext, useMediaPlayerPause, useMediaPlayerPlay, useMediaPlayerPlayMedia, useMediaPlayerPrevious, useMediaPlayerSeek, useMediaPlayerSelectSource, useMediaPlayerSetMute, useMediaPlayerSetRepeat, useMediaPlayerSetShuffle, useMediaPlayerSetVolume, useMediaPlayerStop, useMeshNetworkGetStatus, useMeshNetworkJoin, useMeshNetworkLeave, useMeshNetworkListPeers, useMeshNetworkLogout, useMeshNetworkStartLogin, useMeshNetworkTestConnection, useMetricsProviderCollectSnapshot, useMetricsProviderDumpHeapSnapshot, useMetricsProviderGetAddonStats, useMetricsProviderGetCached, useMetricsProviderGetCpuTemperature, useMetricsProviderGetCurrent, useMetricsProviderGetDiskSpace, useMetricsProviderGetGpuInfo, useMetricsProviderGetProcessStats, useMetricsProviderKillProcess, useMetricsProviderListAddonInstances, useMetricsProviderListNodeProcesses, useMotionDetectionAnalyze, useMotionDetectionApplyDeviceSettingsPatch, useMotionDetectionGetDeviceLiveContribution, useMotionDetectionGetDeviceSettingsContribution, useMotionDetectionRemoveCamera, useMotionDetectionReset, useMotionGetStatus, useMotionIsDetected, useMotionTriggerGetStatus, useMotionTriggerSetMotionTrigger, useMotionZonesGetOptions, useMotionZonesGetStatus, useMotionZonesSetZone, useMqttBrokerAddBroker, useMqttBrokerGetBrokerConfig, useMqttBrokerGetStatus, useMqttBrokerListBrokers, useMqttBrokerRemoveBroker, useMqttBrokerStartEmbeddedBroker, useMqttBrokerStopEmbeddedBroker, useMqttBrokerTestConnection, useNativeObjectDetectionGetStatus, useNativeObjectDetectionSetEnabled, useNetworkAccessGetEndpoint, useNetworkAccessGetStatus, useNetworkAccessListEndpoints, useNetworkAccessStart, useNetworkAccessStop, useNetworkQualityGetAllStats, useNetworkQualityGetDeviceStats, useNetworkQualityReportClientStats, useNodesClusterAddonStatus, useNodesDeployAddon, useNodesExecuteQuery, useNodesGetCapUsageGraph, useNodesGetNodeAddons, useNodesRenameNode, useNodesRestartAddon, useNodesRestartNode, useNodesRestartProcess, useNodesSetProcessLogLevel, useNodesShutdownNode, useNodesTopology, useNodesUndeployAddon, useNotificationOutputDeleteTarget, useNotificationOutputDiscoverTargets, useNotificationOutputListTargetKinds, useNotificationOutputListTargets, useNotificationOutputSend, useNotificationOutputSetTargetEnabled, useNotificationOutputTestTarget, useNotificationOutputUpsertTarget, useNotifierCancel, useNotifierGetStatus, useNotifierSend, useNumericSensorGetStatus, useOptimisticSlice, useOptionalSystem, useOptionalWidgetRegistry, useOsdGetStatus, useOsdSetOverlay, usePTZ, usePetFeederCallPet, usePetFeederCancelFeed, usePetFeederFeed, usePetFeederGetStatus, usePetFeederMarkFoodReplenished, usePetFeederPlaySound, usePetFeederResetDesiccant, usePetFeederSetChildLock, usePetFeederSetFeedSound, usePetFeederSetIndicatorLight, usePetFeederSetVolume, usePipelineAnalyticsApplyDeviceSettingsPatch, usePipelineAnalyticsClearTracks, usePipelineAnalyticsDeleteDeviceEvents, usePipelineAnalyticsDeleteTracks, usePipelineAnalyticsGetActiveTracks, usePipelineAnalyticsGetAudioEvents, usePipelineAnalyticsGetDeviceLiveContribution, usePipelineAnalyticsGetDeviceSettingsContribution, usePipelineAnalyticsGetEventDensity, usePipelineAnalyticsGetEventMedia, usePipelineAnalyticsGetEventStoreFootprint, usePipelineAnalyticsGetKeyEvents, usePipelineAnalyticsGetMotionEvents, usePipelineAnalyticsGetObjectEvents, usePipelineAnalyticsGetSensorEvents, usePipelineAnalyticsGetTrack, usePipelineAnalyticsGetTrackMedia, usePipelineAnalyticsListEventKinds, usePipelineAnalyticsListOpsLog, usePipelineAnalyticsListRecentTracks, usePipelineAnalyticsListTracks, usePipelineAnalyticsPruneEvents, usePipelineAnalyticsPruneEventsBefore, usePipelineAnalyticsPruneTracksBefore, usePipelineAnalyticsSearchObjectEvents, usePipelineAnalyticsWipeAllAnalytics, usePipelineExecutorCacheFrameInPool, usePipelineExecutorClearDeviceOverrides, usePipelineExecutorDeleteModel, usePipelineExecutorDeleteTemplate, usePipelineExecutorDownloadModel, usePipelineExecutorGetAddonModels, usePipelineExecutorGetAudioCapabilities, usePipelineExecutorGetAvailableEngines, usePipelineExecutorGetCapabilities, usePipelineExecutorGetDefaultSteps, usePipelineExecutorGetDetectionConfigSchema, usePipelineExecutorGetEffectiveTuning, usePipelineExecutorGetEngineProvisioning, usePipelineExecutorGetGlobalPipelineConfig, usePipelineExecutorGetGlobalSteps, usePipelineExecutorGetOrchestratorConfigSchema, usePipelineExecutorGetReferenceAudio, usePipelineExecutorGetReferenceAudioFiles, usePipelineExecutorGetReferenceImage, usePipelineExecutorGetSchema, usePipelineExecutorGetSelectedEngine, usePipelineExecutorGetVideoPipelineSteps, usePipelineExecutorInferCached, usePipelineExecutorKillEngine, usePipelineExecutorListLoadedEngines, usePipelineExecutorListReferenceImages, usePipelineExecutorListTemplates, usePipelineExecutorReprobeEngine, usePipelineExecutorRunAudioTest, usePipelineExecutorRunPipeline, usePipelineExecutorRunPipelineBatch, usePipelineExecutorSaveTemplate, usePipelineExecutorSetVideoPipelineSteps, usePipelineExecutorSpinEngine, usePipelineExecutorUncacheFrame, usePipelineExecutorUpdateTemplate, usePipelineExecutorValidatePipeline, usePipelineOrchestratorApplyDeviceSettingsPatch, usePipelineOrchestratorAssignAudio, usePipelineOrchestratorAssignPipeline, usePipelineOrchestratorDeleteTemplate, usePipelineOrchestratorGetAgentLoad, usePipelineOrchestratorGetAgentSettings, usePipelineOrchestratorGetAudioAssignment, usePipelineOrchestratorGetAudioAssignments, usePipelineOrchestratorGetAudioNodeLoad, usePipelineOrchestratorGetCameraMetrics, usePipelineOrchestratorGetCameraSettings, usePipelineOrchestratorGetCameraStatus, usePipelineOrchestratorGetCameraStatuses, usePipelineOrchestratorGetCameraStepOverrides, usePipelineOrchestratorGetCapabilityBindings, usePipelineOrchestratorGetDeviceLiveContribution, usePipelineOrchestratorGetDeviceSettingsContribution, usePipelineOrchestratorGetGlobalMetrics, usePipelineOrchestratorGetIngestOwner, usePipelineOrchestratorGetPipelineAssignment, usePipelineOrchestratorGetPipelineAssignments, usePipelineOrchestratorListAgentSettings, usePipelineOrchestratorListTemplates, usePipelineOrchestratorRebalance, usePipelineOrchestratorRemoveAgentSettings, usePipelineOrchestratorResetNodePipelineDefaults, usePipelineOrchestratorResolvePipeline, usePipelineOrchestratorSaveTemplate, usePipelineOrchestratorSetAgentAddonDefaults, usePipelineOrchestratorSetAgentCapabilities, usePipelineOrchestratorSetAgentDetectWeight, usePipelineOrchestratorSetAgentMaxCameras, usePipelineOrchestratorSetAgentReachableHost, usePipelineOrchestratorSetCameraPipelineForAgent, usePipelineOrchestratorSetCameraStepOverride, usePipelineOrchestratorSetCameraStepToggle, usePipelineOrchestratorSetCapabilityBinding, usePipelineOrchestratorUnassignAudio, usePipelineOrchestratorUnassignPipeline, usePipelineOrchestratorUpdateTemplate, usePipelineRunnerAttachCamera, usePipelineRunnerDetachCamera, usePipelineRunnerGetAllCameraMetrics, usePipelineRunnerGetCameraMetrics, usePipelineRunnerGetLocalCameras, usePipelineRunnerGetLocalLoad, usePipelineRunnerGetLocalMetrics, usePipelineRunnerGetNativeCrop, usePipelineRunnerReportMotion, usePipelineRunnerRunDetailSubtree, usePlateGalleryAssignPlate, usePlateGalleryAssignPlates, usePlateGalleryCorrectPlateText, usePlateGalleryCreateVehicle, usePlateGalleryDeletePlate, usePlateGalleryDeleteVehicle, usePlateGalleryGetPlateByTrack, usePlateGalleryGetPlateMedia, usePlateGalleryListPlates, usePlateGalleryListVehicleSamples, usePlateGalleryListVehicles, usePlateGalleryRemoveVehicleSample, usePlateGalleryRenameVehicle, usePlateGallerySearchPlates, usePlateGallerySuggestPlateClusters, usePlateGalleryUnassignPlate, usePlateGalleryUnassignPlates, usePlayerOverlayLayer, usePlayerOverlayLayers, usePlayerToolbarButton, usePlayerToolbarButtons, usePowerMeterGetStatus, usePresenceGetStatus, usePressureSensorGetStatus, usePrivacyMaskGetOptions, usePrivacyMaskGetStatus, usePrivacyMaskSetMask, usePtzAutotrackGetSettings, usePtzAutotrackGetStatus, usePtzAutotrackSetEnabled, usePtzAutotrackSetSettings, usePtzContinuousMove, usePtzDeletePreset, usePtzGetOptions, usePtzGetPosition, usePtzGetPresets, usePtzGetStatus, usePtzGoHome, usePtzGoToPreset, usePtzMove, usePtzSavePreset, usePtzSetAutofocus, usePtzStop, useRebootReboot, useRecordedPlayback, useRecordingApplyDeviceSettingsPatch, useRecordingDeleteFootprint, useRecordingExportCancelExport, useRecordingExportCreateExport, useRecordingExportDeleteExport, useRecordingExportGetDownloadUrl, useRecordingExportGetExport, useRecordingExportListExports, useRecordingGetAvailability, useRecordingGetDaysWithRecordings, useRecordingGetDeviceConfig, useRecordingGetDeviceLiveContribution, useRecordingGetDeviceSettingsContribution, useRecordingGetPlaybackManifest, useRecordingGetStatus, useRecordingGetStorageUsage, useRecordingListOpsLog, useRecordingLocateSegment, useRecordingPruneFootage, useRecordingReadSegmentBytes, useRecordingRescanStorage, useRecordingSetDeviceConfig, useRemoteComponent, useSceneMonitorCaptureReference, useSceneMonitorCreateScene, useSceneMonitorDeleteReference, useSceneMonitorDeleteScene, useSceneMonitorGetStatus, useSceneMonitorListScenes, useSceneMonitorRecheckNow, useSceneMonitorUpdateScene, useScriptRunnerGetStatus, useScriptRunnerRun, useScriptRunnerStop, useScrubController, useServerManagementApplyServerUpdate, useServerManagementCheckServerUpdate, useServerManagementGetServerPackageStatus, useServerManagementRestartServer, useServerManagementRollbackServerUpdate, useSettingsStoreCount, useSettingsStoreDeclareCollection, useSettingsStoreDelete, useSettingsStoreGet, useSettingsStoreHistogram, useSettingsStoreInsert, useSettingsStoreIsEmpty, useSettingsStoreQuery, useSettingsStoreSet, useSettingsStoreUpdate, useSmokeGetStatus, useSnapshotApplyDeviceSettingsPatch, useSnapshotGetDeviceLiveContribution, useSnapshotGetDeviceSettingsContribution, useSnapshotGetSnapshot, useSnapshotGetSnapshotOverview, useSnapshotGetStatus, useSnapshotInvalidateCache, useStorageAbortUpload, useStorageBeginDownload, useStorageBeginUpload, useStorageDelete, useStorageDeleteLocation, useStorageEndDownload, useStorageExists, useStorageFinalizeUpload, useStorageGetAvailableSpace, useStorageGetDefaultLocation, useStorageList, useStorageListLocationDeclarations, useStorageListLocations, useStorageListProviders, useStorageRead, useStorageReadChunk, useStorageResolve, useStorageTestConfig, useStorageTestLocation, useStorageUpsertLocation, useStorageWrite, useStorageWriteChunk, useStreamBrokerApplyDeviceSettingsPatch, useStreamBrokerAssignProfile, useStreamBrokerGetAllRtspEntries, useStreamBrokerGetBrokerStats, useStreamBrokerGetDeviceLiveContribution, useStreamBrokerGetDeviceSettingsContribution, useStreamBrokerGetPreBufferInfo, useStreamBrokerGetRtspEntry, useStreamBrokerGetRtspPort, useStreamBrokerGetStreamUrl, useStreamBrokerGetStreamWithCodec, useStreamBrokerIsRtspEnabled, useStreamBrokerKillClient, useStreamBrokerListAllCameraStreams, useStreamBrokerListAllProfileSlots, useStreamBrokerListClients, useStreamBrokerProbeStream, useStreamBrokerPublishCameraStream, useStreamBrokerPullAudioChunks, useStreamBrokerPullFrameHandles, useStreamBrokerRegenerateRtspToken, useStreamBrokerReleaseStreamWithCodec, useStreamBrokerRestartProfile, useStreamBrokerRetractCameraStream, useStreamBrokerSetPreBufferDuration, useStreamBrokerSetRtspEnabled, useStreamBrokerSubscribeAudioChunks, useStreamBrokerSubscribeFrames, useStreamBrokerUnassignProfile, useStreamBrokerUnsubscribeAudioChunks, useStreamBrokerUnsubscribeFrames, useStreamCatalogGetCatalog, useStreamParamsGetConfigSchema, useStreamParamsGetOptions, useStreamParamsGetStatus, useStreamParamsSetProfile, useSwitchGetStatus, useSwitchSetState, useSystem, useSystemFeatureFlags, useSystemForceRetentionCleanup, useSystemGetRetentionConfig, useSystemHealth, useSystemInfo, useSystemMutation, useSystemNetworkAddresses, useSystemQuery, useSystemSetRetentionConfig, useTamperGetStatus, useTemperatureSensorGetStatus, useThemeMode, useToastOnToast, useTurnProviderGetTurnServers, useUpdateGetStatus, useUpdateInstallUpdate, useUserManagementConfirmTotp, useUserManagementCreateApiKey, useUserManagementCreateScopedToken, useUserManagementCreateUser, useUserManagementDeleteUser, useUserManagementDisableTotp, useUserManagementGetTotpStatus, useUserManagementListApiKeys, useUserManagementListOauthSessions, useUserManagementListScopedTokens, useUserManagementListUsers, useUserManagementOauthExchangeCode, useUserManagementOauthIssueCode, useUserManagementOauthRefresh, useUserManagementOauthVerifyAccessToken, useUserManagementResetPassword, useUserManagementRevokeApiKey, useUserManagementRevokeOauthSession, useUserManagementRevokeScopedToken, useUserManagementSetUserScopes, useUserManagementSetupTotp, useUserManagementUpdateUser, useUserManagementValidateApiKey, useUserManagementValidateCredentials, useUserManagementValidateScopedToken, useUserManagementVerifyTotp, useVacuumControlGetStatus, useVacuumControlLocate, useVacuumControlPause, useVacuumControlReturnToBase, useVacuumControlSetFanSpeed, useVacuumControlStart, useVacuumControlStop, useValveClose, useValveGetStatus, useValveOpen, useValveSetPosition, useValveStop, useVibrationGetStatus, useVideoclipsGetClipPlayback, useVideoclipsListClips, useVodPlayback, useWaterHeaterGetStatus, useWaterHeaterSetAway, useWaterHeaterSetOperationMode, useWaterHeaterSetTargetTemp, useWeatherGetStatus, useWebrtcSessionAddIceCandidate, useWebrtcSessionCloseSession, useWebrtcSessionCreateSession, useWebrtcSessionGetIceCandidates, useWebrtcSessionGetSessionState, useWebrtcSessionHandleAnswer, useWebrtcSessionHandleOffer, useWebrtcSessionHasAdaptiveBitrate, useWebrtcSessionListStreams, useWidget, useWidgetMetadata, useWidgetRegistry, useZoneAnalyticsGetCameraHistory, useZoneAnalyticsGetCurrentSnapshot, useZoneAnalyticsGetUnzonedHistory, useZoneAnalyticsGetZoneHistory, useZoneEditing, useZoneRulesListRules, useZoneRulesSetRules, useZonesAddZone, useZonesListZones, useZonesRemoveZone, useZonesUpdateZone, vacuumStateMeta, validateScopes, valveStateMeta, waterHeaterPhase, waterHeaterTint, weatherConditionMeta, weatherTint };