@camstack/ui-library 1.2.245 → 1.2.247

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
@@ -1683,41 +1683,6 @@ var CookingPot = createLucideIcon("cooking-pot", [
1683
1683
  * This source code is licensed under the ISC license.
1684
1684
  * See the LICENSE file in the root directory of this source tree.
1685
1685
  */
1686
- var CopyPlus = createLucideIcon("copy-plus", [
1687
- ["line", {
1688
- x1: "15",
1689
- x2: "15",
1690
- y1: "12",
1691
- y2: "18",
1692
- key: "1p7wdc"
1693
- }],
1694
- ["line", {
1695
- x1: "12",
1696
- x2: "18",
1697
- y1: "15",
1698
- y2: "15",
1699
- key: "1nscbv"
1700
- }],
1701
- ["rect", {
1702
- width: "14",
1703
- height: "14",
1704
- x: "8",
1705
- y: "8",
1706
- rx: "2",
1707
- ry: "2",
1708
- key: "17jyea"
1709
- }],
1710
- ["path", {
1711
- d: "M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",
1712
- key: "zix9uf"
1713
- }]
1714
- ]);
1715
- /**
1716
- * @license lucide-react v0.576.0 - ISC
1717
- *
1718
- * This source code is licensed under the ISC license.
1719
- * See the LICENSE file in the root directory of this source tree.
1720
- */
1721
1686
  var Copy = createLucideIcon("copy", [["rect", {
1722
1687
  width: "14",
1723
1688
  height: "14",
@@ -6866,32 +6831,8 @@ var useDayNightGetOptions = trpc.dayNight.getOptions.useQuery;
6866
6831
  var useDayNightSetSettings = trpc.dayNight.setSettings.useMutation;
6867
6832
  /** Generated alias around `trpc.dayNight.getStatus.useQuery`. */
6868
6833
  var useDayNightGetStatus = trpc.dayNight.getStatus.useQuery;
6869
- /** Generated alias around `trpc.decoder.supportsCodec.useQuery`. */
6870
- var useDecoderSupportsCodec = trpc.decoder.supportsCodec.useQuery;
6871
6834
  /** Generated alias around `trpc.decoder.getInfo.useQuery`. */
6872
6835
  var useDecoderGetInfo = trpc.decoder.getInfo.useQuery;
6873
- /** Generated alias around `trpc.decoder.createSession.useQuery`. */
6874
- var useDecoderCreateSession = trpc.decoder.createSession.useQuery;
6875
- /** Generated alias around `trpc.decoder.destroySession.useQuery`. */
6876
- var useDecoderDestroySession = trpc.decoder.destroySession.useQuery;
6877
- /** Generated alias around `trpc.decoder.pushPacket.useQuery`. */
6878
- var useDecoderPushPacket = trpc.decoder.pushPacket.useQuery;
6879
- /** Generated alias around `trpc.decoder.openStream.useQuery`. */
6880
- var useDecoderOpenStream = trpc.decoder.openStream.useQuery;
6881
- /** Generated alias around `trpc.decoder.pullFrames.useQuery`. */
6882
- var useDecoderPullFrames = trpc.decoder.pullFrames.useQuery;
6883
- /** Generated alias around `trpc.decoder.pullHandles.useQuery`. */
6884
- var useDecoderPullHandles = trpc.decoder.pullHandles.useQuery;
6885
- /** Generated alias around `trpc.decoder.getFrame.useQuery`. */
6886
- var useDecoderGetFrame = trpc.decoder.getFrame.useQuery;
6887
- /** Generated alias around `trpc.decoder.getShmStats.useQuery`. */
6888
- var useDecoderGetShmStats = trpc.decoder.getShmStats.useQuery;
6889
- /** Generated alias around `trpc.decoder.updateConfig.useQuery`. */
6890
- var useDecoderUpdateConfig = trpc.decoder.updateConfig.useQuery;
6891
- /** Generated alias around `trpc.decoder.getStats.useQuery`. */
6892
- var useDecoderGetStats = trpc.decoder.getStats.useQuery;
6893
- /** Generated alias around `trpc.decoder.listActiveSessions.useQuery`. */
6894
- var useDecoderListActiveSessions = trpc.decoder.listActiveSessions.useQuery;
6895
6836
  /** Generated alias around `trpc.decoder.reprobeHwaccel.useMutation`. */
6896
6837
  var useDecoderReprobeHwaccel = trpc.decoder.reprobeHwaccel.useMutation;
6897
6838
  /** Generated alias around `trpc.detectionPipeline.getDeviceSettingsContribution.useQuery`. */
@@ -7890,14 +7831,6 @@ var usePipelineExecutorGetGlobalPipelineConfig = trpc.pipelineExecutor.getGlobal
7890
7831
  var usePipelineExecutorGetOrchestratorConfigSchema = trpc.pipelineExecutor.getOrchestratorConfigSchema.useQuery;
7891
7832
  /** Generated alias around `trpc.pipelineExecutor.validatePipeline.useQuery`. */
7892
7833
  var usePipelineExecutorValidatePipeline = trpc.pipelineExecutor.validatePipeline.useQuery;
7893
- /** Generated alias around `trpc.pipelineExecutor.listTemplates.useQuery`. */
7894
- var usePipelineExecutorListTemplates = trpc.pipelineExecutor.listTemplates.useQuery;
7895
- /** Generated alias around `trpc.pipelineExecutor.saveTemplate.useMutation`. */
7896
- var usePipelineExecutorSaveTemplate = trpc.pipelineExecutor.saveTemplate.useMutation;
7897
- /** Generated alias around `trpc.pipelineExecutor.updateTemplate.useMutation`. */
7898
- var usePipelineExecutorUpdateTemplate = trpc.pipelineExecutor.updateTemplate.useMutation;
7899
- /** Generated alias around `trpc.pipelineExecutor.deleteTemplate.useMutation`. */
7900
- var usePipelineExecutorDeleteTemplate = trpc.pipelineExecutor.deleteTemplate.useMutation;
7901
7834
  /** Generated alias around `trpc.pipelineExecutor.getCapabilities.useQuery`. */
7902
7835
  var usePipelineExecutorGetCapabilities = trpc.pipelineExecutor.getCapabilities.useQuery;
7903
7836
  /** Generated alias around `trpc.pipelineExecutor.getAddonModels.useQuery`. */
@@ -8044,14 +7977,6 @@ var usePipelineOrchestratorSetCameraSensors = trpc.pipelineOrchestrator.setCamer
8044
7977
  var usePipelineOrchestratorReconcileFromDisk = trpc.pipelineOrchestrator.reconcileFromDisk.useMutation;
8045
7978
  /** Generated alias around `trpc.pipelineOrchestrator.getReconcileFromDiskStatus.useQuery`. */
8046
7979
  var usePipelineOrchestratorGetReconcileFromDiskStatus = trpc.pipelineOrchestrator.getReconcileFromDiskStatus.useQuery;
8047
- /** Generated alias around `trpc.pipelineOrchestrator.listTemplates.useQuery`. */
8048
- var usePipelineOrchestratorListTemplates = trpc.pipelineOrchestrator.listTemplates.useQuery;
8049
- /** Generated alias around `trpc.pipelineOrchestrator.saveTemplate.useMutation`. */
8050
- var usePipelineOrchestratorSaveTemplate = trpc.pipelineOrchestrator.saveTemplate.useMutation;
8051
- /** Generated alias around `trpc.pipelineOrchestrator.updateTemplate.useMutation`. */
8052
- var usePipelineOrchestratorUpdateTemplate = trpc.pipelineOrchestrator.updateTemplate.useMutation;
8053
- /** Generated alias around `trpc.pipelineOrchestrator.deleteTemplate.useMutation`. */
8054
- var usePipelineOrchestratorDeleteTemplate = trpc.pipelineOrchestrator.deleteTemplate.useMutation;
8055
7980
  /** Generated alias around `trpc.pipelineOrchestrator.getDeviceSettingsContribution.useQuery`. */
8056
7981
  var usePipelineOrchestratorGetDeviceSettingsContribution = trpc.pipelineOrchestrator.getDeviceSettingsContribution.useQuery;
8057
7982
  /** Generated alias around `trpc.pipelineOrchestrator.getDeviceLiveContribution.useQuery`. */
@@ -8480,12 +8405,6 @@ var useStreamBrokerSubscribeAudioChunks = trpc.streamBroker.subscribeAudioChunks
8480
8405
  var useStreamBrokerPullAudioChunks = trpc.streamBroker.pullAudioChunks.useQuery;
8481
8406
  /** Generated alias around `trpc.streamBroker.unsubscribeAudioChunks.useMutation`. */
8482
8407
  var useStreamBrokerUnsubscribeAudioChunks = trpc.streamBroker.unsubscribeAudioChunks.useMutation;
8483
- /** Generated alias around `trpc.streamBroker.subscribeFrames.useMutation`. */
8484
- var useStreamBrokerSubscribeFrames = trpc.streamBroker.subscribeFrames.useMutation;
8485
- /** Generated alias around `trpc.streamBroker.pullFrameHandles.useQuery`. */
8486
- var useStreamBrokerPullFrameHandles = trpc.streamBroker.pullFrameHandles.useQuery;
8487
- /** Generated alias around `trpc.streamBroker.unsubscribeFrames.useMutation`. */
8488
- var useStreamBrokerUnsubscribeFrames = trpc.streamBroker.unsubscribeFrames.useMutation;
8489
8408
  /** Generated alias around `trpc.streamBroker.setPreBufferDuration.useMutation`. */
8490
8409
  var useStreamBrokerSetPreBufferDuration = trpc.streamBroker.setPreBufferDuration.useMutation;
8491
8410
  /** Generated alias around `trpc.streamBroker.getPreBufferInfo.useQuery`. */
@@ -28722,6 +28641,45 @@ function AddonGlobalSettingsForm({ trpc, addonId, nodeId, title, disabled, onAft
28722
28641
  });
28723
28642
  }
28724
28643
  //#endregion
28644
+ //#region src/composites/accelerator-label.ts
28645
+ function names(device) {
28646
+ const backend = device.backend.toLowerCase();
28647
+ const dev = device.device.toLowerCase();
28648
+ if (device.key === "cpu" || dev === "cpu" || backend === "cpu") return {
28649
+ label: "CPU",
28650
+ short: "CPU"
28651
+ };
28652
+ if (dev === "npu") return {
28653
+ label: "Intel NPU",
28654
+ short: "NPU"
28655
+ };
28656
+ if (dev === "gpu" || dev === "igpu") return {
28657
+ label: "Intel iGPU",
28658
+ short: "iGPU"
28659
+ };
28660
+ if (backend === "edgetpu") return {
28661
+ label: "Coral Edge TPU",
28662
+ short: "Coral"
28663
+ };
28664
+ if (backend === "coreml") return {
28665
+ label: "Apple Neural Engine",
28666
+ short: "ANE"
28667
+ };
28668
+ const pretty = `${device.backend} ${device.device}`.trim().replace(/\b\w/g, (c) => c.toUpperCase());
28669
+ return {
28670
+ label: pretty.length > 0 ? pretty : device.key,
28671
+ short: device.backend || device.key
28672
+ };
28673
+ }
28674
+ /** "Intel NPU", "Apple Neural Engine", "Coral Edge TPU", "CPU" — Auto tune's names too. */
28675
+ function acceleratorLabel(device) {
28676
+ return names(device).label;
28677
+ }
28678
+ /** "NPU", "ANE", "Coral", "CPU" — chips and tabs. */
28679
+ function acceleratorShortLabel(device) {
28680
+ return names(device).short;
28681
+ }
28682
+ //#endregion
28725
28683
  //#region src/composites/grouped-model-selector.tsx
28726
28684
  /**
28727
28685
  * GroupedModelSelector — the shared Family → Tier → Variant model picker.
@@ -29949,9 +29907,9 @@ function RootSuppliedModelNote({ rootModel, stepModelId }) {
29949
29907
  /**
29950
29908
  * AgentStepEditor — one step on ONE accelerator: its model and its settings,
29951
29909
  * as a single node-level layer. Model Studio's "settings for this installed
29952
- * model" dialog uses it. The pipeline pages use the step inspector, which lays
29953
- * the same parts out across accelerators and layers (D754/D756); the settings
29954
- * form here is that inspector's `LayeredSettingsForm` with one layer.
29910
+ * model" dialog uses it. The pipeline pages use the step matrix's panel, which lays
29911
+ * the same parts out across accelerators and layers (D754/D757); the settings
29912
+ * form here is that panel's `LayeredSettingsForm` with one layer.
29955
29913
  */
29956
29914
  function AgentStepEditor({ addon, agentDefault, onChangeAgentConfig, engineFormat, effectiveModelId, rootModel }) {
29957
29915
  const modelsForFormat = useMemo(() => stepModelOptions(addon.models, engineFormat), [addon.models, engineFormat]);
@@ -35270,7 +35228,6 @@ function useDeviceWebrtc(trpc, deviceId, pollIntervalMs = 5e3) {
35270
35228
  target: r.target,
35271
35229
  status: r.status,
35272
35230
  inputFps: r.inputFps,
35273
- decodeFps: r.decodeFps,
35274
35231
  bitrateKbps: r.bitrateKbps
35275
35232
  })),
35276
35233
  hasWebrtc: true
@@ -55381,25 +55338,46 @@ function ClassChips({ inputs, outputs }) {
55381
55338
  * the first column; each device's real format is shown per sub-column instead
55382
55339
  * ("Coral Edge TPU · tflite").
55383
55340
  */
55341
+ /** The per-accelerator lines of a column header: name, format, model, off. */
55342
+ function AgentColumnLines({ column }) {
55343
+ const name = column.deviceLabel ?? column.deviceKey;
55344
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
55345
+ (name !== void 0 || column.disabled === true) && /* @__PURE__ */ jsxs("div", {
55346
+ className: "flex min-w-0 items-center gap-1",
55347
+ children: [name !== void 0 && /* @__PURE__ */ jsx("span", {
55348
+ className: "truncate text-[10px] font-medium text-foreground/90",
55349
+ children: name
55350
+ }), column.disabled === true && /* @__PURE__ */ jsx("span", {
55351
+ className: "shrink-0 rounded bg-muted px-1 text-[8px] font-semibold uppercase text-foreground-subtle",
55352
+ children: "off"
55353
+ })]
55354
+ }),
55355
+ /* @__PURE__ */ jsx("div", {
55356
+ className: "truncate text-[9px] text-foreground-subtle",
55357
+ children: column.engineLabel
55358
+ }),
55359
+ column.detail !== void 0 && /* @__PURE__ */ jsx("div", {
55360
+ className: "truncate font-mono text-[9px] text-foreground-subtle",
55361
+ title: column.detail,
55362
+ children: column.detail
55363
+ })
55364
+ ] });
55365
+ }
55384
55366
  function GroupedAgentHeader({ group }) {
55367
+ const nodeLabel = group.columns[0]?.nodeLabel ?? group.agentNodeId;
55385
55368
  return /* @__PURE__ */ jsxs("div", {
55369
+ role: "columnheader",
55386
55370
  className: "sticky top-0 z-10 min-w-0 border-b border-l border-border bg-muted/60",
55387
55371
  style: { gridColumn: `span ${group.columns.length}` },
55388
55372
  children: [/* @__PURE__ */ jsx("div", {
55389
55373
  className: "truncate px-3 pt-2 pb-1 text-xs font-semibold text-foreground",
55390
- children: group.agentNodeId
55374
+ children: nodeLabel
55391
55375
  }), /* @__PURE__ */ jsx("div", {
55392
55376
  className: "mt-1 flex border-t border-border/50",
55393
- children: group.columns.map((c, i) => /* @__PURE__ */ jsxs("div", {
55394
- className: cn("min-w-0 flex-1 px-3 py-1", i > 0 && "border-l border-border/50"),
55395
- title: `${c.deviceLabel ?? c.deviceKey} · ${c.engineLabel}`,
55396
- children: [/* @__PURE__ */ jsx("div", {
55397
- className: "truncate text-[10px] font-medium text-foreground/90",
55398
- children: c.deviceLabel ?? c.deviceKey
55399
- }), /* @__PURE__ */ jsx("div", {
55400
- className: "truncate text-[9px] text-foreground-subtle",
55401
- children: c.engineLabel
55402
- })]
55377
+ children: group.columns.map((c, i) => /* @__PURE__ */ jsx("div", {
55378
+ className: cn("min-w-0 flex-1 px-3 py-1", i > 0 && "border-l border-border/50", c.disabled === true && "opacity-70"),
55379
+ title: `${c.deviceLabel ?? c.deviceKey} · ${c.engineLabel}${c.detail ? ` · ${c.detail}` : ""}`,
55380
+ children: /* @__PURE__ */ jsx(AgentColumnLines, { column: c })
55403
55381
  }, agentColumnKey(c)))
55404
55382
  })]
55405
55383
  });
@@ -55503,25 +55481,30 @@ function cellButtonClass(state, isSelected, extra) {
55503
55481
  //#endregion
55504
55482
  //#region src/composites/device-step-matrix.tsx
55505
55483
  /**
55506
- * DeviceStepMatrix — the READ-ONLY "Compare" view of the step inspector
55507
- * (D756): one hierarchical steps × accelerators matrix showing what every
55508
- * accelerator runs for every step, side by side.
55509
- *
55510
- * Column 1 (STICKY): the indented step tree (slot + name + class-flow chips).
55511
- * Columns 2..N (one per accelerator): the model chip, "⚠ skip" when the step
55512
- * runs on the camera but the accelerator has no compatible model, or "—".
55513
- * A click selects that (step, accelerator) in the inspector — the matrix
55514
- * itself edits nothing (it used to host a slide-over editor that scrolled
55515
- * away with the page).
55516
- *
55517
- * Responsive, container-measured (never a global media query, so it also works
55518
- * embedded):
55519
- * A) wide — sticky step column + node columns in an `overflow-x:auto` box, so
55520
- * narrow viewports scroll the NODES sideways while col-1 stays pinned and
55521
- * the page body never scrolls horizontally.
55522
- * B) narrow — below the width needed for ≥2 node columns, collapse to a
55523
- * single-node view: a node selector picks ONE node and the matrix renders
55524
- * `step-tree × that-one-node`.
55484
+ * DeviceStepMatrix — the step × accelerator TABLE of a detection pipeline
55485
+ * (D757): the node's Pipeline tab and the camera's Detection pipeline → Steps
55486
+ * are this matrix, and a click on a cell (or a step's header) opens that step's
55487
+ * settings in a docked panel (`StepDetailDock`) that overlays the page instead
55488
+ * of reflowing the matrix.
55489
+ *
55490
+ * Column 1 (STICKY): the indented step tree — slot, name, class-flow chips,
55491
+ * and an optional badge (the camera's gate). The header is a button: it
55492
+ * opens the step on the selected accelerator.
55493
+ * Columns 2..N: one per accelerator, grouped under their node; the header
55494
+ * names the accelerator, its format, the model it elects, and "off" for a
55495
+ * switched-off one. A cell shows the model that runs there, or "⚠ skip",
55496
+ * "→ iGPU", "root", "cluster", "ovr", "—".
55497
+ *
55498
+ * Keyboard: ONE Tab stop (a roving tabindex over the step headers and cells);
55499
+ * arrows move, Home / End go to the row's ends, Enter or Space opens.
55500
+ *
55501
+ * `reserveRightPx`: the width a docked panel covers at the right of the
55502
+ * viewport. The matrix adds a trailing spacer that wide (so any column can
55503
+ * scroll clear of it) and scrolls the selected cell into the uncovered part —
55504
+ * it never shrinks, so nothing reflows when the panel opens.
55505
+ *
55506
+ * Responsive, container-measured: narrower than the step column plus two
55507
+ * columns, the matrix shows ONE node at a time with a node selector.
55525
55508
  */
55526
55509
  /** The sticky step column. */
55527
55510
  var STEP_COL_REM = 18;
@@ -55532,11 +55515,41 @@ var STEP_COL_PX = STEP_COL_REM * 16;
55532
55515
  * step column and lets the device columns scroll horizontally beside it.
55533
55516
  */
55534
55517
  var STEP_COL_SINGLE_REM = 11;
55535
- function StepCell({ node, depth }) {
55518
+ /** Where a key press moves the roving focus in a `rows × cols` grid. */
55519
+ function nextGridPosition(key, pos, rows, cols) {
55520
+ const clamp = (r, c) => ({
55521
+ r: Math.max(0, Math.min(rows - 1, r)),
55522
+ c: Math.max(0, Math.min(cols - 1, c))
55523
+ });
55524
+ switch (key) {
55525
+ case "ArrowRight": return clamp(pos.r, pos.c + 1);
55526
+ case "ArrowLeft": return clamp(pos.r, pos.c - 1);
55527
+ case "ArrowDown": return clamp(pos.r + 1, pos.c);
55528
+ case "ArrowUp": return clamp(pos.r - 1, pos.c);
55529
+ case "Home": return clamp(pos.r, 0);
55530
+ case "End": return clamp(pos.r, cols - 1);
55531
+ case "PageDown": return clamp(rows - 1, pos.c);
55532
+ case "PageUp": return clamp(0, pos.c);
55533
+ default: return null;
55534
+ }
55535
+ }
55536
+ function StepCell({ node, depth, r, tabbable, selected, badge, onClick, sticky }) {
55536
55537
  return /* @__PURE__ */ jsx("div", {
55537
- className: "sticky left-0 z-10 flex flex-col gap-2 border-b border-border bg-surface px-3 py-2 text-xs min-w-0",
55538
- style: { paddingLeft: `${12 + depth * 14}px` },
55539
- children: /* @__PURE__ */ jsx(StepLabel, { node })
55538
+ role: "rowheader",
55539
+ className: cn("min-w-0 border-b border-border bg-surface", sticky && "sticky left-0 z-10"),
55540
+ children: /* @__PURE__ */ jsxs("button", {
55541
+ type: "button",
55542
+ "data-r": r,
55543
+ "data-c": 0,
55544
+ "data-step": node.addonId,
55545
+ "data-col": "",
55546
+ tabIndex: tabbable ? 0 : -1,
55547
+ "aria-current": selected ? "true" : void 0,
55548
+ onClick: onClick ? (e) => onClick(e.detail === 0) : void 0,
55549
+ className: cn("flex h-full w-full min-w-0 items-start gap-2 px-3 py-2 text-left text-xs outline-none", "hover:bg-muted/40 focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary", selected && "bg-primary/10 shadow-[inset_3px_0_0_var(--color-primary)]"),
55550
+ style: { paddingLeft: `${12 + depth * 14}px` },
55551
+ children: [/* @__PURE__ */ jsx(StepLabel, { node }), badge]
55552
+ })
55540
55553
  });
55541
55554
  }
55542
55555
  /**
@@ -55566,68 +55579,179 @@ function NodeSelectorBar({ nodes, selected, onSelect }) {
55566
55579
  role: "tab",
55567
55580
  "aria-selected": isSelected,
55568
55581
  onClick: () => onSelect(a.agentNodeId),
55569
- title: `${a.agentNodeId} · ${a.engineLabel}`,
55582
+ title: `${a.columns[0]?.nodeLabel ?? a.agentNodeId} · ${a.engineLabel}`,
55570
55583
  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"),
55571
- children: a.agentNodeId
55584
+ children: a.columns[0]?.nodeLabel ?? a.agentNodeId
55572
55585
  }, a.agentNodeId);
55573
55586
  })
55574
55587
  })
55575
55588
  ]
55576
55589
  });
55577
55590
  }
55578
- function MatrixGrid({ tree, agents, getCellState, onCellClick, selectedCell, single }) {
55591
+ var MatrixGrid = forwardRef(function MatrixGrid({ tree, agents, getCellState, onCellClick, onStepClick, stepBadge, selectedCell, single, reserveRightPx, label }, ref) {
55579
55592
  const rows = useMemo(() => flattenTree(tree), [tree]);
55580
55593
  const groups = useMemo(() => groupAgentColumns(agents), [agents]);
55594
+ const boxRef = useRef(null);
55595
+ const stepColRem = single ? STEP_COL_SINGLE_REM : STEP_COL_REM;
55596
+ const gridTemplate = `${stepColRem}rem repeat(${agents.length}, 13rem)`;
55597
+ const cols = agents.length + 1;
55598
+ const [stickySteps, setStickySteps] = useState(true);
55599
+ useLayoutEffect(() => {
55600
+ const box = boxRef.current;
55601
+ if (!box || reserveRightPx <= 0) {
55602
+ setStickySteps(true);
55603
+ return;
55604
+ }
55605
+ const measure = () => {
55606
+ const left = box.getBoundingClientRect().left;
55607
+ setStickySteps(window.innerWidth - reserveRightPx - left >= stepColRem * 16 + 208 + 24);
55608
+ };
55609
+ measure();
55610
+ window.addEventListener("resize", measure);
55611
+ return () => window.removeEventListener("resize", measure);
55612
+ }, [reserveRightPx, stepColRem]);
55613
+ const selectedPos = useMemo(() => {
55614
+ if (selectedCell === null) return null;
55615
+ const r = rows.findIndex((row) => row.node.addonId === selectedCell.addonId);
55616
+ if (r < 0) return null;
55617
+ const c = agents.findIndex((a) => agentColumnKey(a) === agentColumnKey(selectedCell));
55618
+ return {
55619
+ r,
55620
+ c: c < 0 ? 0 : c + 1
55621
+ };
55622
+ }, [
55623
+ selectedCell,
55624
+ rows,
55625
+ agents
55626
+ ]);
55627
+ const [focusPos, setFocusPos] = useState({
55628
+ r: 0,
55629
+ c: 0
55630
+ });
55631
+ useEffect(() => {
55632
+ if (selectedPos !== null) setFocusPos(selectedPos);
55633
+ }, [selectedPos]);
55634
+ const tab = focusPos.r < rows.length && focusPos.c < cols ? focusPos : {
55635
+ r: 0,
55636
+ c: 0
55637
+ };
55638
+ const focusAt = (r, c) => {
55639
+ boxRef.current?.querySelector(`[data-r="${r}"][data-c="${c}"]`)?.focus();
55640
+ };
55641
+ useImperativeHandle(ref, () => ({ focusCell: (addonId, columnKey) => {
55642
+ const r = rows.findIndex((row) => row.node.addonId === addonId);
55643
+ if (r < 0) return;
55644
+ const index = columnKey === null ? -1 : agents.findIndex((a) => agentColumnKey(a) === columnKey);
55645
+ const c = index < 0 ? 0 : index + 1;
55646
+ setFocusPos({
55647
+ r,
55648
+ c
55649
+ });
55650
+ focusAt(r, c);
55651
+ } }), [rows, agents]);
55652
+ useLayoutEffect(() => {
55653
+ if (selectedPos === null) return;
55654
+ const box = boxRef.current;
55655
+ const el = box?.querySelector(`[data-r="${selectedPos.r}"][data-c="${selectedPos.c}"]`);
55656
+ if (!box || !el) return;
55657
+ if (typeof el.scrollIntoView === "function") el.scrollIntoView({
55658
+ block: "nearest",
55659
+ inline: "nearest"
55660
+ });
55661
+ if (reserveRightPx <= 0) return;
55662
+ const limit = window.innerWidth - reserveRightPx - 12;
55663
+ const right = el.getBoundingClientRect().right;
55664
+ if (right > limit) box.scrollLeft += right - limit;
55665
+ }, [
55666
+ selectedPos,
55667
+ reserveRightPx,
55668
+ stickySteps
55669
+ ]);
55670
+ const onKeyDown = (e) => {
55671
+ if (!(e.target instanceof HTMLElement) || e.target.dataset.r === void 0) return;
55672
+ const pos = {
55673
+ r: Number(e.target.dataset.r),
55674
+ c: Number(e.target.dataset.c)
55675
+ };
55676
+ const next = nextGridPosition(e.key, pos, rows.length, cols);
55677
+ if (next === null) return;
55678
+ e.preventDefault();
55679
+ setFocusPos(next);
55680
+ focusAt(next.r, next.c);
55681
+ };
55581
55682
  return /* @__PURE__ */ jsx("div", {
55683
+ ref: boxRef,
55582
55684
  className: "overflow-auto rounded border border-border",
55583
55685
  children: /* @__PURE__ */ jsxs("div", {
55584
- className: "grid w-max",
55585
- style: { gridTemplateColumns: `${single ? STEP_COL_SINGLE_REM : STEP_COL_REM}rem repeat(${agents.length}, 13rem)` },
55586
- children: [
55587
- /* @__PURE__ */ jsx("div", {
55588
- 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",
55589
- children: "Step"
55590
- }),
55591
- groups.map((group) => group.grouped ? /* @__PURE__ */ jsx(GroupedAgentHeader, { group }, group.agentNodeId) : group.columns.map((col) => /* @__PURE__ */ jsxs("div", {
55592
- className: "sticky top-0 z-10 min-w-0 border-b border-l border-border bg-muted/60 px-3 py-2",
55686
+ className: "flex w-max",
55687
+ children: [/* @__PURE__ */ jsxs("div", {
55688
+ role: "grid",
55689
+ "aria-label": label,
55690
+ "aria-rowcount": rows.length + 1,
55691
+ className: "grid w-max",
55692
+ style: { gridTemplateColumns: gridTemplate },
55693
+ onKeyDown,
55694
+ children: [/* @__PURE__ */ jsxs("div", {
55695
+ role: "row",
55696
+ className: "contents",
55593
55697
  children: [/* @__PURE__ */ jsx("div", {
55594
- className: "truncate text-xs font-semibold text-foreground",
55595
- children: col.agentNodeId
55596
- }), /* @__PURE__ */ jsx("div", {
55597
- className: "truncate text-[10px] text-foreground-subtle",
55598
- children: col.engineLabel
55698
+ role: "columnheader",
55699
+ className: cn("top-0 z-20 border-b border-border bg-muted/60 px-3 py-2 text-[10px] uppercase tracking-widest text-foreground-subtle", stickySteps ? "sticky left-0" : "sticky"),
55700
+ children: "Step"
55701
+ }), groups.map((group) => group.grouped ? /* @__PURE__ */ jsx(GroupedAgentHeader, { group }, group.agentNodeId) : group.columns.map((col) => /* @__PURE__ */ jsxs("div", {
55702
+ role: "columnheader",
55703
+ className: cn("sticky top-0 z-10 min-w-0 border-b border-l border-border bg-muted/60 px-3 py-2", col.disabled === true && "opacity-70"),
55704
+ children: [/* @__PURE__ */ jsx("div", {
55705
+ className: "truncate text-xs font-semibold text-foreground",
55706
+ children: col.nodeLabel ?? col.agentNodeId
55707
+ }), /* @__PURE__ */ jsx(AgentColumnLines, { column: col })]
55708
+ }, agentColumnKey(col))))]
55709
+ }), rows.map(({ node, depth }, r) => /* @__PURE__ */ jsxs("div", {
55710
+ role: "row",
55711
+ className: "contents",
55712
+ children: [/* @__PURE__ */ jsx(StepCell, {
55713
+ node,
55714
+ depth,
55715
+ r,
55716
+ tabbable: tab.r === r && tab.c === 0,
55717
+ selected: selectedCell?.addonId === node.addonId,
55718
+ badge: stepBadge?.(node.addonId),
55719
+ onClick: onStepClick ? (kb) => onStepClick(node.addonId, kb) : void 0,
55720
+ sticky: stickySteps
55721
+ }), agents.map((a, i) => {
55722
+ const state = getCellState(node.addonId, a);
55723
+ const isSelected = selectedCell !== null && selectedCell.addonId === node.addonId && agentColumnKey(selectedCell) === agentColumnKey(a);
55724
+ const actionable = state.kind === "enabled" || state.kind === "skip";
55725
+ return /* @__PURE__ */ jsx("div", {
55726
+ role: "gridcell",
55727
+ className: "min-w-0 border-b border-l border-border",
55728
+ children: /* @__PURE__ */ jsx("button", {
55729
+ type: "button",
55730
+ "data-r": r,
55731
+ "data-c": i + 1,
55732
+ "data-step": node.addonId,
55733
+ "data-col": agentColumnKey(a),
55734
+ tabIndex: tab.r === r && tab.c === i + 1 ? 0 : -1,
55735
+ "aria-disabled": !actionable,
55736
+ "aria-selected": isSelected,
55737
+ onClick: (e) => {
55738
+ if (actionable) onCellClick(node.addonId, a, e.detail === 0);
55739
+ },
55740
+ className: cellButtonClass(state, isSelected, cn("h-full w-full min-w-0 overflow-hidden px-3 py-2 outline-none", "focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary", !actionable && "cursor-default hover:bg-transparent", a.disabled === true && "opacity-70")),
55741
+ children: renderCellContent(state)
55742
+ })
55743
+ }, agentColumnKey(a));
55599
55744
  })]
55600
- }, agentColumnKey(col)))),
55601
- rows.map(({ node, depth }) => /* @__PURE__ */ jsx(MatrixRow, {
55602
- node,
55603
- depth,
55604
- agents,
55605
- getCellState,
55606
- onCellClick,
55607
- selectedCell
55608
- }, node.addonId))
55609
- ]
55745
+ }, node.addonId))]
55746
+ }), reserveRightPx > 0 && /* @__PURE__ */ jsx("div", {
55747
+ "aria-hidden": true,
55748
+ style: { width: reserveRightPx },
55749
+ className: "shrink-0"
55750
+ })]
55610
55751
  })
55611
55752
  });
55612
- }
55613
- function MatrixRow({ node, depth, agents, getCellState, onCellClick, selectedCell }) {
55614
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(StepCell, {
55615
- node,
55616
- depth
55617
- }), agents.map((a) => {
55618
- const state = getCellState(node.addonId, a);
55619
- const isSelected = selectedCell !== null && selectedCell.addonId === node.addonId && agentColumnKey(selectedCell) === agentColumnKey(a);
55620
- const actionable = state.kind === "enabled" || state.kind === "skip";
55621
- return /* @__PURE__ */ jsx("button", {
55622
- type: "button",
55623
- disabled: !actionable,
55624
- onClick: () => onCellClick(node.addonId, a),
55625
- 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")),
55626
- children: renderCellContent(state)
55627
- }, agentColumnKey(a));
55628
- })] });
55629
- }
55630
- function DeviceStepMatrix({ tree, agents, getCellState, onCellClick, selectedCell, fallbackNodeId, onFallbackNodeChange }) {
55753
+ });
55754
+ var DeviceStepMatrix = forwardRef(function DeviceStepMatrix({ tree, agents, getCellState, onCellClick, selectedCell, fallbackNodeId, onFallbackNodeChange, onStepClick, stepBadge, reserveRightPx = 0, label = "Detection steps" }, ref) {
55631
55755
  const containerRef = useRef(null);
55632
55756
  const [width, setWidth] = useState(0);
55633
55757
  useLayoutEffect(() => {
@@ -55645,6 +55769,15 @@ function DeviceStepMatrix({ tree, agents, getCellState, onCellClick, selectedCel
55645
55769
  if (nodes.length === 0) return null;
55646
55770
  return nodes.find((n) => n.agentNodeId === fallbackNodeId) ?? nodes[0] ?? null;
55647
55771
  }, [nodes, fallbackNodeId]);
55772
+ const selectedNodeId = selectedCell?.agentNodeId;
55773
+ useEffect(() => {
55774
+ if (single && selectedNodeId !== void 0 && selectedNodeId !== fallbackNodeId) onFallbackNodeChange(selectedNodeId);
55775
+ }, [
55776
+ single,
55777
+ selectedNodeId,
55778
+ fallbackNodeId,
55779
+ onFallbackNodeChange
55780
+ ]);
55648
55781
  const shownAgents = single && selectedNode ? selectedNode.columns : agents;
55649
55782
  return /* @__PURE__ */ jsxs("div", {
55650
55783
  ref: containerRef,
@@ -55654,15 +55787,20 @@ function DeviceStepMatrix({ tree, agents, getCellState, onCellClick, selectedCel
55654
55787
  selected: selectedNode.agentNodeId,
55655
55788
  onSelect: onFallbackNodeChange
55656
55789
  }), /* @__PURE__ */ jsx(MatrixGrid, {
55790
+ ref,
55657
55791
  tree,
55658
55792
  agents: shownAgents,
55659
55793
  getCellState,
55660
55794
  onCellClick,
55795
+ onStepClick,
55796
+ stepBadge,
55661
55797
  selectedCell,
55662
- single: single && selectedNode !== null
55798
+ single: single && selectedNode !== null,
55799
+ reserveRightPx,
55800
+ label
55663
55801
  })]
55664
55802
  });
55665
- }
55803
+ });
55666
55804
  //#endregion
55667
55805
  //#region src/composites/discovery-panel.tsx
55668
55806
  function DiscoveryPanel({ deviceId, className = "", onOpenChild }) {
@@ -56601,43 +56739,13 @@ function PhaseIcon({ phase, ...props }) {
56601
56739
  return /* @__PURE__ */ jsx(Icon, { ...props });
56602
56740
  }
56603
56741
  //#endregion
56604
- //#region src/lib/validate-template.ts
56605
- function validateTemplate(steps, schema) {
56606
- const availableAddonIds = new Set(schema.slots.flatMap((s) => s.addons.map((a) => a.id)));
56607
- const warnings = [];
56608
- function validateStep(step) {
56609
- if (!availableAddonIds.has(step.addonId)) {
56610
- warnings.push(`Addon "${step.addonId}" is no longer available — step removed`);
56611
- return null;
56612
- }
56613
- const addon = schema.slots.flatMap((s) => s.addons).find((a) => a.id === step.addonId);
56614
- let modelId = step.modelId;
56615
- if (addon && !addon.models.some((m) => m.id === modelId)) {
56616
- const fallback = addon.defaultModelId;
56617
- warnings.push(`Model "${modelId}" not available for ${step.addonId} — using "${fallback}"`);
56618
- modelId = fallback;
56619
- }
56620
- const validChildren = step.children.map((c) => validateStep(c)).filter((c) => c !== null);
56621
- return {
56622
- ...step,
56623
- modelId,
56624
- children: validChildren
56625
- };
56626
- }
56627
- const validSteps = steps.map((s) => validateStep(s)).filter((s) => s !== null);
56628
- return {
56629
- valid: warnings.length === 0,
56630
- steps: validSteps,
56631
- warnings
56632
- };
56633
- }
56634
- //#endregion
56635
56742
  //#region src/composites/pipeline-builder.tsx
56636
56743
  /**
56637
- * PipelineBuilder — orchestrates the pipeline step tree with template management.
56744
+ * PipelineBuilder — orchestrates the pipeline step tree.
56638
56745
  *
56639
- * Renders: template bar (save/load/delete), step tree from schema with nested
56640
- * children, placeholder steps for disabled addons, all driven by API schema.
56746
+ * Renders the step tree from schema with nested children and placeholder steps
56747
+ * for disabled addons, all driven by API schema. There are no saved pipeline
56748
+ * templates (D759): the tree is the caller's state.
56641
56749
  */
56642
56750
  function buildSchemaMap(schema) {
56643
56751
  const map = /* @__PURE__ */ new Map();
@@ -56689,31 +56797,9 @@ function PlaceholderStep({ addon, onClick }) {
56689
56797
  })
56690
56798
  });
56691
56799
  }
56692
- function PipelineBuilder({ schema, steps, onChange, templates, selectedTemplateId, onSelectTemplate, onSaveTemplate, onUpdateTemplate, onDeleteTemplate, readOnly = false, excludeAddons = [], hideTemplates = false, showOnlyEnabled = false, showSlotLabels = false }) {
56800
+ function PipelineBuilder({ schema, steps, onChange, readOnly = false, excludeAddons = [], showOnlyEnabled = false, showSlotLabels = false }) {
56693
56801
  const excluded = useMemo(() => new Set(excludeAddons), [excludeAddons]);
56694
56802
  const schemaMap = useMemo(() => buildSchemaMap(schema), [schema]);
56695
- const [warnings, setWarnings] = useState([]);
56696
- const dirty = selectedTemplateId ? JSON.stringify(steps) !== JSON.stringify(templates.find((t) => t.id === selectedTemplateId)?.steps) : false;
56697
- function handleSelectTemplate(e) {
56698
- const id = e.target.value || null;
56699
- if (id) {
56700
- const tpl = templates.find((t) => t.id === id);
56701
- if (tpl) setWarnings([...validateTemplate(tpl.steps, schema).warnings]);
56702
- } else setWarnings([]);
56703
- onSelectTemplate(id);
56704
- }
56705
- function handleSave() {
56706
- if (selectedTemplateId) onUpdateTemplate(selectedTemplateId, steps);
56707
- }
56708
- function handleSaveAs() {
56709
- const name = window.prompt("Template name:");
56710
- if (name?.trim()) onSaveTemplate(name.trim(), steps);
56711
- }
56712
- function handleDelete() {
56713
- if (!selectedTemplateId) return;
56714
- const tpl = templates.find((t) => t.id === selectedTemplateId);
56715
- if (tpl && window.confirm(`Delete template "${tpl.name}"?`)) onDeleteTemplate(selectedTemplateId);
56716
- }
56717
56803
  /**
56718
56804
  * When a step is updated, auto-enable the entire ancestor chain if a
56719
56805
  * child/grandchild was just enabled. This ensures enabling face-recognition
@@ -56883,104 +56969,42 @@ function PipelineBuilder({ schema, steps, onChange, templates, selectedTemplateI
56883
56969
  })]
56884
56970
  }, step.addonId);
56885
56971
  }
56886
- const rootSlots = schema.slots.filter((s) => s.parentSlot === null).toSorted((a, b) => a.priority - b.priority);
56887
- return /* @__PURE__ */ jsxs("div", {
56972
+ return /* @__PURE__ */ jsx("div", {
56888
56973
  className: "space-y-4",
56889
- children: [
56890
- !hideTemplates && /* @__PURE__ */ jsx("div", {
56891
- className: "rounded-lg border border-border bg-surface p-3",
56892
- children: /* @__PURE__ */ jsxs("div", {
56893
- className: "flex items-center gap-2",
56894
- children: [
56895
- /* @__PURE__ */ jsx("div", {
56896
- className: "relative flex-1 min-w-0",
56897
- children: /* @__PURE__ */ jsxs("select", {
56898
- value: selectedTemplateId ?? "",
56899
- onChange: handleSelectTemplate,
56900
- className: "w-full rounded-lg border border-border bg-background px-3 py-2 text-sm text-foreground focus:outline-none focus:border-primary/50",
56901
- children: [/* @__PURE__ */ jsx("option", {
56902
- value: "",
56903
- children: "No template"
56904
- }), templates.map((t) => /* @__PURE__ */ jsx("option", {
56905
- value: t.id,
56906
- children: t.name
56907
- }, t.id))]
56908
- })
56909
- }),
56910
- dirty && /* @__PURE__ */ jsx("span", { className: "h-1.5 w-1.5 rounded-full bg-amber-500 shrink-0" }),
56911
- /* @__PURE__ */ jsx("button", {
56912
- onClick: handleSave,
56913
- disabled: !selectedTemplateId || readOnly,
56914
- title: "Save",
56915
- className: cn("p-2 rounded-lg border border-border transition-colors", selectedTemplateId && !readOnly ? "text-foreground-subtle hover:bg-surface-hover" : "text-foreground-subtle/30 cursor-not-allowed"),
56916
- children: /* @__PURE__ */ jsx(Save, { className: "h-4 w-4" })
56917
- }),
56918
- /* @__PURE__ */ jsx("button", {
56919
- onClick: handleSaveAs,
56920
- disabled: readOnly,
56921
- title: "Save As",
56922
- className: cn("p-2 rounded-lg border border-border transition-colors", !readOnly ? "text-foreground-subtle hover:bg-surface-hover" : "text-foreground-subtle/30 cursor-not-allowed"),
56923
- children: /* @__PURE__ */ jsx(CopyPlus, { className: "h-4 w-4" })
56924
- }),
56925
- /* @__PURE__ */ jsx("button", {
56926
- onClick: handleDelete,
56927
- disabled: !selectedTemplateId || readOnly,
56928
- title: "Delete",
56929
- className: cn("p-2 rounded-lg border border-border transition-colors", selectedTemplateId && !readOnly ? "text-foreground-subtle hover:text-danger" : "text-foreground-subtle/30 cursor-not-allowed"),
56930
- children: /* @__PURE__ */ jsx(Trash2, { className: "h-4 w-4" })
56931
- })
56932
- ]
56933
- })
56934
- }),
56935
- warnings.length > 0 && /* @__PURE__ */ jsxs("div", {
56936
- className: "rounded-lg border border-amber-500/30 bg-amber-500/5 p-3 text-xs text-amber-400 space-y-1",
56937
- children: [/* @__PURE__ */ jsxs("div", {
56938
- className: "flex items-center justify-between",
56939
- children: [/* @__PURE__ */ jsx("span", {
56940
- className: "font-medium",
56941
- children: "Template loaded with warnings:"
56942
- }), /* @__PURE__ */ jsx("button", {
56943
- onClick: () => setWarnings([]),
56944
- className: "text-amber-400/60 hover:text-amber-400",
56945
- children: /* @__PURE__ */ jsx(X, { className: "h-3.5 w-3.5" })
56946
- })]
56947
- }), warnings.map((w, i) => /* @__PURE__ */ jsxs("div", { children: ["• ", w] }, i))]
56948
- }),
56949
- rootSlots.map((slot) => {
56950
- const allSlotSteps = steps.filter((s) => s.slot === slot.id && !excluded.has(s.addonId));
56951
- const slotSteps = showOnlyEnabled ? allSlotSteps.filter((s) => s.enabled) : allSlotSteps;
56952
- const missingRootAddons = showOnlyEnabled ? [] : slot.addons.filter((a) => !existingIds.has(a.id) && !excluded.has(a.id));
56953
- const groups = /* @__PURE__ */ new Map();
56954
- const ungrouped = [];
56955
- for (const step of slotSteps) if (step.group) {
56956
- if (!groups.has(step.group)) groups.set(step.group, []);
56957
- groups.get(step.group).push(step);
56958
- } else ungrouped.push(step);
56959
- return /* @__PURE__ */ jsxs("div", {
56960
- className: "space-y-2",
56961
- children: [
56962
- showSlotLabels && /* @__PURE__ */ jsxs("span", {
56963
- className: "text-[10px] font-semibold uppercase tracking-widest text-foreground-subtle/50",
56964
- children: ["Slot: ", slot.label]
56965
- }),
56966
- ungrouped.map((step) => renderStep(step)),
56967
- [...groups.entries()].map(([groupName, groupSteps]) => /* @__PURE__ */ jsxs("div", {
56968
- className: "space-y-2 rounded-lg border border-border/40 p-2",
56969
- children: [/* @__PURE__ */ jsx("span", {
56970
- className: "text-[10px] font-semibold uppercase tracking-widest text-foreground-subtle/50 px-1",
56971
- children: groupName
56972
- }), groupSteps.map((step) => renderStep(step))]
56973
- }, groupName)),
56974
- !readOnly && missingRootAddons.map((addon) => /* @__PURE__ */ jsx(PlaceholderStep, {
56975
- addon,
56976
- onClick: () => {
56977
- onChange([...steps, createDefaultStep(addon)]);
56978
- }
56979
- }, addon.id))
56980
- ]
56981
- }, slot.id);
56982
- })
56983
- ]
56974
+ children: schema.slots.filter((s) => s.parentSlot === null).toSorted((a, b) => a.priority - b.priority).map((slot) => {
56975
+ const allSlotSteps = steps.filter((s) => s.slot === slot.id && !excluded.has(s.addonId));
56976
+ const slotSteps = showOnlyEnabled ? allSlotSteps.filter((s) => s.enabled) : allSlotSteps;
56977
+ const missingRootAddons = showOnlyEnabled ? [] : slot.addons.filter((a) => !existingIds.has(a.id) && !excluded.has(a.id));
56978
+ const groups = /* @__PURE__ */ new Map();
56979
+ const ungrouped = [];
56980
+ for (const step of slotSteps) if (step.group) {
56981
+ if (!groups.has(step.group)) groups.set(step.group, []);
56982
+ groups.get(step.group).push(step);
56983
+ } else ungrouped.push(step);
56984
+ return /* @__PURE__ */ jsxs("div", {
56985
+ className: "space-y-2",
56986
+ children: [
56987
+ showSlotLabels && /* @__PURE__ */ jsxs("span", {
56988
+ className: "text-[10px] font-semibold uppercase tracking-widest text-foreground-subtle/50",
56989
+ children: ["Slot: ", slot.label]
56990
+ }),
56991
+ ungrouped.map((step) => renderStep(step)),
56992
+ [...groups.entries()].map(([groupName, groupSteps]) => /* @__PURE__ */ jsxs("div", {
56993
+ className: "space-y-2 rounded-lg border border-border/40 p-2",
56994
+ children: [/* @__PURE__ */ jsx("span", {
56995
+ className: "text-[10px] font-semibold uppercase tracking-widest text-foreground-subtle/50 px-1",
56996
+ children: groupName
56997
+ }), groupSteps.map((step) => renderStep(step))]
56998
+ }, groupName)),
56999
+ !readOnly && missingRootAddons.map((addon) => /* @__PURE__ */ jsx(PlaceholderStep, {
57000
+ addon,
57001
+ onClick: () => {
57002
+ onChange([...steps, createDefaultStep(addon)]);
57003
+ }
57004
+ }, addon.id))
57005
+ ]
57006
+ }, slot.id);
57007
+ })
56984
57008
  });
56985
57009
  }
56986
57010
  //#endregion
@@ -57644,39 +57668,6 @@ function StepTimings({ timings, totalMs, className }) {
57644
57668
  });
57645
57669
  }
57646
57670
  //#endregion
57647
- //#region src/composites/step-inspector/accelerator-tabs.tsx
57648
- function AcceleratorTabs({ items, selectedId, onSelect }) {
57649
- const onKeyDown = (e, index) => {
57650
- const delta = e.key === "ArrowRight" ? 1 : e.key === "ArrowLeft" ? -1 : 0;
57651
- if (delta === 0) return;
57652
- e.preventDefault();
57653
- const next = items[(index + delta + items.length) % items.length];
57654
- if (next !== void 0) onSelect(next.id);
57655
- };
57656
- return /* @__PURE__ */ jsx("div", {
57657
- role: "tablist",
57658
- "aria-label": "Accelerator",
57659
- className: "-mx-1 flex min-w-0 flex-nowrap gap-1 overflow-x-auto px-1 pb-0.5",
57660
- children: items.map((item, index) => {
57661
- const selected = item.id === selectedId;
57662
- return /* @__PURE__ */ jsxs("button", {
57663
- type: "button",
57664
- role: "tab",
57665
- "aria-selected": selected,
57666
- "aria-label": item.marked ? `${item.label} (camera override)` : item.label,
57667
- tabIndex: selected ? 0 : -1,
57668
- onClick: () => onSelect(item.id),
57669
- onKeyDown: (e) => onKeyDown(e, index),
57670
- className: cn("inline-flex h-9 shrink-0 items-center gap-1 whitespace-nowrap rounded-md border px-2.5 text-[11px] font-medium transition-colors md:h-7", selected ? "border-primary/50 bg-primary/15 text-primary" : "border-border text-foreground-subtle hover:bg-surface-hover hover:text-foreground"),
57671
- children: [item.label, item.marked && /* @__PURE__ */ jsx("span", {
57672
- className: "h-1.5 w-1.5 rounded-full bg-amber-500",
57673
- "aria-hidden": true
57674
- })]
57675
- }, item.id);
57676
- })
57677
- });
57678
- }
57679
- //#endregion
57680
57671
  //#region src/composites/step-inspector/gate-control.tsx
57681
57672
  /**
57682
57673
  * GateControl — whether ONE camera runs a step: Auto (the catalog default) /
@@ -57769,166 +57760,104 @@ function SegmentedChoice({ label, options, value, onChange }) {
57769
57760
  });
57770
57761
  }
57771
57762
  //#endregion
57772
- //#region src/composites/step-inspector/step-chips.tsx
57773
- function chipText(state) {
57774
- switch (state.kind) {
57775
- case "enabled":
57776
- if (state.suppliedByRoot !== void 0) return "root";
57777
- return state.jumpTo !== void 0 ? `→ ${state.jumpTo}` : state.modelId;
57778
- case "skip": return state.jumpTo !== void 0 ? `→ ${state.jumpTo}` : "skip";
57779
- case "disabled": return "off";
57780
- case "na": return "—";
57781
- }
57782
- }
57783
- /** What a chip MEANS — the full model id, not its shortened text. */
57784
- function chipKey(state) {
57785
- return state.kind === "enabled" ? `${state.modelId}|${chipText(state)}` : chipText(state);
57786
- }
57787
- function chipTone(state, selected) {
57788
- if (selected) return "border-primary/60 text-primary";
57789
- if (state.kind === "skip" && state.jumpTo === void 0) return "border-amber-500/40 text-amber-500";
57790
- if (state.kind === "na" || state.kind === "disabled") return "border-border/60 text-foreground-subtle/70";
57791
- return "border-border text-foreground-subtle";
57792
- }
57793
- function StepChips({ chips, selectedId }) {
57794
- const first = chips[0];
57795
- if (first !== void 0 && chips.length > 1 && chips.every((c) => chipKey(c.state) === chipKey(first.state) && !(c.state.kind === "enabled" && c.state.overridden === true) && chipTone(c.state, c.id === selectedId) === chipTone(first.state, first.id === selectedId)) && first !== void 0) {
57796
- const text = chipText(first.state);
57797
- return /* @__PURE__ */ jsx("span", {
57798
- className: "flex flex-wrap gap-1",
57799
- children: /* @__PURE__ */ jsxs("span", {
57800
- title: `${text} on ${chips.map((c) => c.label).join(", ")}`,
57801
- className: cn("inline-flex max-w-[12rem] items-center gap-1 truncate rounded border px-1 font-mono text-[9px] leading-4", chipTone(first.state, first.id === selectedId)),
57802
- children: [/* @__PURE__ */ jsx("span", {
57803
- className: "truncate",
57804
- children: text
57805
- }), /* @__PURE__ */ jsxs("span", {
57806
- className: "shrink-0 font-sans text-foreground-subtle/80",
57807
- children: ["×", chips.length]
57808
- })]
57809
- })
57810
- });
57811
- }
57812
- return /* @__PURE__ */ jsx("span", {
57813
- className: "flex flex-wrap gap-1",
57814
- children: chips.map((chip) => {
57815
- const overridden = chip.state.kind === "enabled" && chip.state.overridden === true;
57816
- const text = chipText(chip.state);
57817
- return /* @__PURE__ */ jsxs("span", {
57818
- title: `${chip.label}: ${chip.state.kind === "enabled" ? chip.state.modelId : text}${overridden ? " (camera override)" : ""}`,
57819
- className: cn("inline-flex max-w-[9rem] items-center gap-0.5 truncate rounded border px-1 font-mono text-[9px] leading-4", chipTone(chip.state, chip.id === selectedId)),
57820
- children: [/* @__PURE__ */ jsx("span", {
57821
- className: "truncate",
57822
- children: text
57823
- }), overridden && /* @__PURE__ */ jsx("span", {
57824
- className: "text-amber-500",
57825
- "aria-hidden": true,
57826
- children: "•"
57827
- })]
57828
- }, chip.id);
57829
- })
57830
- });
57831
- }
57832
- //#endregion
57833
- //#region src/composites/step-inspector/step-inspector-layout.tsx
57763
+ //#region src/composites/step-inspector/step-detail-dock.tsx
57834
57764
  /**
57835
- * StepInspectorLayout — the master–detail frame of the step inspector.
57765
+ * StepDetailDock — where a step's settings open from the step matrix
57766
+ * (D757): docked to the page's scroll container, never inside the scrolling
57767
+ * content.
57836
57768
  *
57837
- * Desktop: the step list and the inspector side by side, each scrolling on its
57838
- * own, in a block whose height FILLS the page's scroll container below it. So
57839
- * neither pane depends on the page scroll position: the inspector's header and
57840
- * save bar are always on screen, and the selected step stays visible in the
57841
- * list. (The slide-over this replaced was absolutely positioned inside the
57842
- * matrix block — its title and its Save button scrolled away with the page.)
57843
- * In a narrow container (the camera page beside its live view, a tablet) the
57844
- * two panes stack: the list on top, a third of the height.
57769
+ * Desktop: a side panel `position: fixed` over the RIGHT edge of the nearest
57770
+ * scroll container (its top, bottom and right are measured from that box), so
57771
+ * it stays where it is while the matrix scrolls under it, and its header and
57772
+ * save bar are always on screen. It overlays — it never reserves width, so the
57773
+ * matrix does not reflow (the slide-over before D756 reserved 360 px, the
57774
+ * matrix re-measured into a single-node layout, and the clicked cell slid
57775
+ * under the panel). The matrix uses {@link STEP_DOCK_WIDTH_PX} to scroll the
57776
+ * selected column clear of it.
57845
57777
  *
57846
- * Phone: the list flows with the page; the inspector opens as a full-screen
57847
- * sheet with "‹ Steps" to go back.
57778
+ * Phone: a full-screen `Dialog` sheet.
57848
57779
  */
57849
- /** The tallest the inspector block can be without making its scroll container scroll. */
57850
- function fillHeightPx(input) {
57851
- const room = input.scrollerHeight - input.paddingBottom - input.offsetInScroller;
57852
- return Math.max(input.minPx, Math.floor(room));
57780
+ /** Width of the desktop dock — what the matrix keeps clear of it. */
57781
+ var STEP_DOCK_WIDTH_PX = 432;
57782
+ /** The dock's viewport box, from its scroll container's box. */
57783
+ function dockBox(input) {
57784
+ const right = Math.max(0, input.viewportWidth - input.scroller.right);
57785
+ const width = Math.min(input.widthPx, input.scroller.right);
57786
+ return {
57787
+ top: Math.max(0, input.scroller.top),
57788
+ height: Math.max(0, input.scroller.bottom - Math.max(0, input.scroller.top)),
57789
+ right,
57790
+ width
57791
+ };
57853
57792
  }
57854
57793
  function scrollParentOf(el) {
57855
- for (let p = el.parentElement; p !== null; p = p.parentElement) {
57794
+ for (let p = el?.parentElement ?? null; p !== null; p = p.parentElement) {
57856
57795
  const { overflowY } = getComputedStyle(p);
57857
57796
  if (overflowY === "auto" || overflowY === "scroll") return p;
57858
57797
  }
57859
57798
  return null;
57860
57799
  }
57861
- /** Height of the block so that it ends at the bottom of its scroll container. */
57862
- function useFillHeight(enabled, minPx) {
57863
- const ref = useRef(null);
57864
- const [height, setHeight] = useState(null);
57800
+ function useDockBox(anchor, enabled) {
57801
+ const [box, setBox] = useState(null);
57865
57802
  useLayoutEffect(() => {
57866
- const el = ref.current;
57867
- if (!enabled || el === null) return;
57868
- const scroller = scrollParentOf(el);
57803
+ if (!enabled) return;
57804
+ const scroller = scrollParentOf(anchor.current);
57869
57805
  const measure = () => {
57870
- const box = scroller ?? document.documentElement;
57871
- const style = getComputedStyle(box);
57872
- const top = scroller ? scroller.getBoundingClientRect().top : 0;
57873
- const scrollTop = scroller ? scroller.scrollTop : window.scrollY;
57874
- setHeight(fillHeightPx({
57875
- scrollerHeight: scroller ? scroller.clientHeight : window.innerHeight,
57876
- paddingBottom: Number.parseFloat(style.paddingBottom) || 0,
57877
- offsetInScroller: el.getBoundingClientRect().top - top + scrollTop,
57878
- minPx
57806
+ setBox(dockBox({
57807
+ scroller: scroller?.getBoundingClientRect() ?? {
57808
+ top: 0,
57809
+ bottom: window.innerHeight,
57810
+ right: window.innerWidth
57811
+ },
57812
+ viewportWidth: window.innerWidth,
57813
+ widthPx: 432
57879
57814
  }));
57880
57815
  };
57881
57816
  measure();
57882
57817
  const RO = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(measure);
57883
57818
  if (scroller) RO?.observe(scroller);
57884
- if (el.parentElement) RO?.observe(el.parentElement);
57885
57819
  window.addEventListener("resize", measure);
57886
57820
  return () => {
57887
57821
  RO?.disconnect();
57888
57822
  window.removeEventListener("resize", measure);
57889
57823
  };
57890
- }, [enabled, minPx]);
57891
- return {
57892
- ref,
57893
- height
57894
- };
57824
+ }, [anchor, enabled]);
57825
+ return box;
57895
57826
  }
57896
- function StepInspectorLayout({ list, detail, mobileDetailOpen, onMobileClose, minHeightPx = 420, className }) {
57827
+ function StepDetailDock({ open, anchor, onClose, label, children }) {
57897
57828
  const isMobile = useIsMobile();
57898
- const { ref, height } = useFillHeight(!isMobile, minHeightPx);
57899
- if (isMobile) return /* @__PURE__ */ jsxs("div", {
57900
- className: cn("space-y-3", className),
57901
- children: [/* @__PURE__ */ jsx("div", {
57902
- className: SECTION_CARD,
57903
- children: list
57904
- }), /* @__PURE__ */ jsx(Dialog, {
57905
- open: mobileDetailOpen,
57906
- onOpenChange: (open) => !open && onMobileClose(),
57907
- children: /* @__PURE__ */ jsx(DialogContent, {
57908
- placement: "sheet-on-mobile",
57909
- scroll: "body",
57910
- className: "h-[100dvh] max-h-none w-full max-w-full rounded-none border-0 p-0 pt-[env(safe-area-inset-top)] pb-[env(safe-area-inset-bottom)]",
57911
- children: mobileDetailOpen && detail
57912
- })
57913
- })]
57914
- });
57915
- return /* @__PURE__ */ jsx("div", {
57916
- ref,
57917
- className: cn("@container/inspector", className),
57918
- style: height !== null ? { height } : void 0,
57919
- children: /* @__PURE__ */ jsxs("div", {
57920
- className: cn("grid h-full min-h-0 gap-3", "grid-cols-1 grid-rows-[minmax(9rem,32%)_minmax(0,1fr)]", "@xl/inspector:grid-cols-[minmax(14rem,19rem)_minmax(0,1fr)] @xl/inspector:grid-rows-1"),
57921
- children: [/* @__PURE__ */ jsx("div", {
57922
- className: cn(SECTION_CARD, "flex min-h-0 flex-col"),
57923
- children: list
57924
- }), /* @__PURE__ */ jsx("div", {
57925
- className: cn(SECTION_CARD, "flex min-h-0 flex-col"),
57926
- children: detail
57927
- })]
57829
+ const box = useDockBox(anchor, open && !isMobile);
57830
+ if (isMobile) return /* @__PURE__ */ jsx(Dialog, {
57831
+ open,
57832
+ onOpenChange: (next) => !next && onClose(),
57833
+ children: /* @__PURE__ */ jsx(DialogContent, {
57834
+ placement: "sheet-on-mobile",
57835
+ scroll: "body",
57836
+ "aria-label": label,
57837
+ className: "h-[100dvh] max-h-none w-full max-w-full rounded-none border-0 p-0 pt-[env(safe-area-inset-top)] pb-[env(safe-area-inset-bottom)]",
57838
+ children: open && children
57928
57839
  })
57929
57840
  });
57841
+ if (!open) return null;
57842
+ return /* @__PURE__ */ jsx("aside", {
57843
+ "aria-label": label,
57844
+ "data-step-dock": true,
57845
+ className: "fixed z-30 flex flex-col border-l border-border bg-surface shadow-2xl",
57846
+ style: box !== null ? {
57847
+ top: box.top,
57848
+ height: box.height,
57849
+ right: box.right,
57850
+ width: box.width
57851
+ } : {
57852
+ top: 0,
57853
+ bottom: 0,
57854
+ right: 0,
57855
+ width: 432
57856
+ },
57857
+ children
57858
+ });
57930
57859
  }
57931
- /** "‹ Steps" — the phone sheet's way back to the list. */
57860
+ /** "‹ Steps" — the phone sheet's way back to the matrix. */
57932
57861
  function BackToStepsButton({ onClick }) {
57933
57862
  return /* @__PURE__ */ jsxs("button", {
57934
57863
  type: "button",
@@ -57944,36 +57873,42 @@ function BackToStepsButton({ onClick }) {
57944
57873
  //#region src/composites/step-inspector/step-inspector-panel.tsx
57945
57874
  /**
57946
57875
  * StepInspectorPanel — the detail pane of the step inspector: a pinned header
57947
- * (the step, its gate, the accelerator tabs), ONE scrolling body, and a pinned
57948
- * save bar. Nothing in it depends on the page's scroll position — the slide-over
57876
+ * (the clicked step and accelerator, the gate), ONE scrolling body, and a
57877
+ * pinned save bar (with the "applies to" choice, when there is one). Nothing in it depends on the page's scroll position — the slide-over
57949
57878
  * it replaced was anchored to the matrix block and scrolled away with it.
57950
57879
  */
57951
- function SaveBar({ dirtyCount, saving, status, error, onSave, onDiscard }) {
57880
+ function SaveBar({ dirtyCount, saving, status, error, onSave, onDiscard, scope }) {
57952
57881
  const dirty = dirtyCount > 0;
57953
57882
  const message = saving ? "Saving…" : dirty ? `${dirtyCount} unsaved change${dirtyCount === 1 ? "" : "s"}` : status === "saved" ? "Saved" : status === "error" ? error ?? "Save failed" : "No unsaved changes";
57954
57883
  return /* @__PURE__ */ jsxs("footer", {
57955
- className: "flex shrink-0 items-center gap-2 border-t border-border bg-surface px-4 py-2 pb-[max(0.5rem,env(safe-area-inset-bottom))] md:pb-2",
57956
- children: [
57957
- /* @__PURE__ */ jsx("span", {
57958
- role: "status",
57959
- className: cn("min-w-0 flex-1 truncate text-[11px]", status === "error" && !dirty ? "text-danger" : dirty ? "text-amber-500" : "text-foreground-subtle"),
57960
- children: message
57961
- }),
57962
- /* @__PURE__ */ jsx(Button, {
57963
- variant: "outline",
57964
- size: "md",
57965
- disabled: !dirty || saving,
57966
- onClick: onDiscard,
57967
- children: "Discard"
57968
- }),
57969
- /* @__PURE__ */ jsx(Button, {
57970
- variant: "primary",
57971
- size: "md",
57972
- disabled: !dirty || saving,
57973
- onClick: onSave,
57974
- children: "Save"
57975
- })
57976
- ]
57884
+ className: "shrink-0 space-y-2 border-t border-border bg-surface px-4 py-2 pb-[max(0.5rem,env(safe-area-inset-bottom))] md:pb-2",
57885
+ children: [scope !== void 0 && /* @__PURE__ */ jsx("div", {
57886
+ "data-save-scope": true,
57887
+ children: scope
57888
+ }), /* @__PURE__ */ jsxs("div", {
57889
+ className: "flex items-center gap-2",
57890
+ children: [
57891
+ /* @__PURE__ */ jsx("span", {
57892
+ role: "status",
57893
+ className: cn("min-w-0 flex-1 truncate text-[11px]", status === "error" && !dirty ? "text-danger" : dirty ? "text-amber-500" : "text-foreground-subtle"),
57894
+ children: message
57895
+ }),
57896
+ /* @__PURE__ */ jsx(Button, {
57897
+ variant: "outline",
57898
+ size: "md",
57899
+ disabled: !dirty || saving,
57900
+ onClick: onDiscard,
57901
+ children: "Discard"
57902
+ }),
57903
+ /* @__PURE__ */ jsx(Button, {
57904
+ variant: "primary",
57905
+ size: "md",
57906
+ disabled: !dirty || saving,
57907
+ onClick: onSave,
57908
+ children: "Save"
57909
+ })
57910
+ ]
57911
+ })]
57977
57912
  });
57978
57913
  }
57979
57914
  var StepInspectorPanel = forwardRef(function StepInspectorPanel({ title, subtitle, headerActions, headerExtra, leading, saveBar, onEscape, children, className }, headingRef) {
@@ -58000,7 +57935,8 @@ var StepInspectorPanel = forwardRef(function StepInspectorPanel({ title, subtitl
58000
57935
  id: headingId,
58001
57936
  ref: headingRef,
58002
57937
  tabIndex: -1,
58003
- className: "truncate text-sm font-semibold text-foreground outline-none focus-visible:ring-2 focus-visible:ring-primary rounded",
57938
+ title,
57939
+ className: "line-clamp-2 break-words text-sm font-semibold leading-snug text-foreground outline-none focus-visible:ring-2 focus-visible:ring-primary rounded",
58004
57940
  children: title
58005
57941
  }), subtitle !== void 0 && /* @__PURE__ */ jsx("div", {
58006
57942
  className: "mt-0.5 text-[11px] text-foreground-subtle",
@@ -58021,192 +57957,6 @@ var StepInspectorPanel = forwardRef(function StepInspectorPanel({ title, subtitl
58021
57957
  });
58022
57958
  });
58023
57959
  //#endregion
58024
- //#region src/composites/step-inspector/step-list.tsx
58025
- /**
58026
- * StepList — the master pane of the step inspector: every detection step of the
58027
- * tree, one compact row each, as ONE tab stop.
58028
- *
58029
- * Keyboard (a listbox with a roving tabindex): ↑/↓/Home/End move the selection,
58030
- * Enter or → hands focus to the inspector, `/` jumps to the search box. The
58031
- * search matches a step's name or any of its field labels, so a question about
58032
- * a knob ("face size", "person") finds the step that owns it; Enter in the box
58033
- * selects the first hit and says which field it matched.
58034
- */
58035
- function matches(text, tokens) {
58036
- const lower = text.toLowerCase();
58037
- return tokens.every((t) => lower.includes(t));
58038
- }
58039
- /** Rows matching `query` (all tokens in the name, or all in one field label). */
58040
- function searchSteps(rows, query) {
58041
- const tokens = query.trim().toLowerCase().split(/\s+/).filter(Boolean);
58042
- if (tokens.length === 0) return rows.map((row) => ({ row }));
58043
- const hits = [];
58044
- for (const row of rows) {
58045
- if (matches(row.name, tokens)) {
58046
- hits.push({ row });
58047
- continue;
58048
- }
58049
- const field = row.fieldLabels.find((l) => matches(l, tokens));
58050
- if (field !== void 0) hits.push({
58051
- row,
58052
- matchedField: field
58053
- });
58054
- }
58055
- return hits;
58056
- }
58057
- var StepList = forwardRef(function StepList({ rows, selectedId, onSelect, onActivate, onPick, label, className }, ref) {
58058
- const [query, setQuery] = useState("");
58059
- const listRef = useRef(null);
58060
- const searchRef = useRef(null);
58061
- const hits = useMemo(() => searchSteps(rows, query), [rows, query]);
58062
- const tabStopId = hits.some((h) => h.row.addonId === selectedId) ? selectedId : hits[0]?.row.addonId ?? null;
58063
- const pendingFocus = useRef(null);
58064
- const tryFocus = (addonId) => {
58065
- const el = listRef.current?.querySelector(`[data-step-id="${addonId}"]`);
58066
- if (!el) return false;
58067
- el.focus();
58068
- return true;
58069
- };
58070
- const focusRow = (addonId) => {
58071
- if (addonId === null) return;
58072
- pendingFocus.current = tryFocus(addonId) ? null : addonId;
58073
- };
58074
- useLayoutEffect(() => {
58075
- if (pendingFocus.current !== null && tryFocus(pendingFocus.current)) pendingFocus.current = null;
58076
- });
58077
- useImperativeHandle(ref, () => ({ focusSelected: () => focusRow(selectedId) }), [selectedId]);
58078
- const move = (index) => {
58079
- const target = hits[Math.max(0, Math.min(hits.length - 1, index))];
58080
- if (target === void 0) return;
58081
- onSelect(target.row.addonId, target.matchedField);
58082
- focusRow(target.row.addonId);
58083
- };
58084
- const onRowKeyDown = (e, index, hit) => {
58085
- switch (e.key) {
58086
- case "ArrowDown":
58087
- e.preventDefault();
58088
- move(index + 1);
58089
- return;
58090
- case "ArrowUp":
58091
- e.preventDefault();
58092
- move(index - 1);
58093
- return;
58094
- case "Home":
58095
- e.preventDefault();
58096
- move(0);
58097
- return;
58098
- case "End":
58099
- e.preventDefault();
58100
- move(hits.length - 1);
58101
- return;
58102
- case "Enter":
58103
- case "ArrowRight":
58104
- e.preventDefault();
58105
- onActivate(hit.row.addonId);
58106
- return;
58107
- case "/":
58108
- e.preventDefault();
58109
- searchRef.current?.focus();
58110
- return;
58111
- default:
58112
- }
58113
- };
58114
- const onSearchKeyDown = (e) => {
58115
- if (e.key === "Enter") {
58116
- e.preventDefault();
58117
- const first = hits[0];
58118
- if (first !== void 0) {
58119
- onSelect(first.row.addonId, first.matchedField);
58120
- onPick?.(first.row.addonId);
58121
- focusRow(first.row.addonId);
58122
- }
58123
- } else if (e.key === "Escape") {
58124
- e.preventDefault();
58125
- setQuery("");
58126
- focusRow(selectedId);
58127
- } else if (e.key === "ArrowDown") {
58128
- e.preventDefault();
58129
- focusRow(tabStopId);
58130
- }
58131
- };
58132
- return /* @__PURE__ */ jsxs("div", {
58133
- className: cn("flex min-h-0 flex-col", className),
58134
- children: [/* @__PURE__ */ jsxs("div", {
58135
- className: "relative shrink-0 border-b border-border p-1.5",
58136
- children: [/* @__PURE__ */ jsx(Search, {
58137
- className: "pointer-events-none absolute left-3.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-foreground-subtle",
58138
- "aria-hidden": true
58139
- }), /* @__PURE__ */ jsx("input", {
58140
- ref: searchRef,
58141
- type: "search",
58142
- value: query,
58143
- onChange: (e) => setQuery(e.target.value),
58144
- onKeyDown: onSearchKeyDown,
58145
- placeholder: "Find a step or setting /",
58146
- "aria-label": "Find a step or setting",
58147
- className: "h-9 w-full rounded-md border border-border bg-background pl-8 pr-2 text-xs text-foreground outline-none focus:border-primary focus:ring-1 focus:ring-primary/30 md:h-8"
58148
- })]
58149
- }), /* @__PURE__ */ jsxs("ul", {
58150
- ref: listRef,
58151
- role: "listbox",
58152
- "aria-label": label,
58153
- className: "min-h-0 flex-1 overflow-y-auto py-1",
58154
- children: [hits.map((hit, index) => {
58155
- const { row } = hit;
58156
- const selected = row.addonId === selectedId;
58157
- return /* @__PURE__ */ jsxs("li", {
58158
- role: "option",
58159
- "aria-selected": selected,
58160
- tabIndex: row.addonId === tabStopId ? 0 : -1,
58161
- "data-step-id": row.addonId,
58162
- onClick: () => {
58163
- onSelect(row.addonId, hit.matchedField);
58164
- onPick?.(row.addonId);
58165
- },
58166
- onKeyDown: (e) => onRowKeyDown(e, index, hit),
58167
- className: cn("cursor-pointer border-l-2 py-1 pl-2.5 pr-3 outline-none transition-colors", "focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary", selected ? "border-primary bg-primary/10" : "border-transparent hover:bg-muted/40"),
58168
- children: [
58169
- /* @__PURE__ */ jsxs("div", {
58170
- className: "flex min-w-0 items-baseline gap-2",
58171
- children: [
58172
- /* @__PURE__ */ jsx("span", {
58173
- className: "w-[4.5rem] shrink-0 truncate",
58174
- children: /* @__PURE__ */ jsx(SlotHeading, { slot: row.slot })
58175
- }),
58176
- /* @__PURE__ */ jsxs("span", {
58177
- className: cn("min-w-0 flex-1 truncate text-xs font-medium", selected ? "text-foreground" : "text-foreground/90"),
58178
- style: { paddingLeft: `${row.depth * 12}px` },
58179
- children: [row.depth > 0 && /* @__PURE__ */ jsx("span", {
58180
- className: "mr-1 text-foreground-subtle/60",
58181
- "aria-hidden": true,
58182
- children: "└"
58183
- }), row.name]
58184
- }),
58185
- row.status
58186
- ]
58187
- }),
58188
- hit.matchedField !== void 0 && /* @__PURE__ */ jsxs("div", {
58189
- className: "mt-0.5 truncate pl-[5rem] text-[10px] text-primary",
58190
- children: ["↳ ", hit.matchedField]
58191
- }),
58192
- row.detail !== void 0 && /* @__PURE__ */ jsx("div", {
58193
- className: "mt-0.5 pl-[5rem]",
58194
- children: row.detail
58195
- })
58196
- ]
58197
- }, row.addonId);
58198
- }), hits.length === 0 && /* @__PURE__ */ jsxs("li", {
58199
- className: "px-3 py-4 text-center text-[11px] text-foreground-subtle",
58200
- children: [
58201
- "No step matches “",
58202
- query,
58203
- "”."
58204
- ]
58205
- })]
58206
- })]
58207
- });
58208
- });
58209
- //#endregion
58210
57960
  //#region src/composites/step-inspector/step-model-row.tsx
58211
57961
  var SOURCE_TONE = {
58212
57962
  camera: "border-primary/40 bg-primary/10 text-primary",
@@ -58285,81 +58035,28 @@ function StepModelRow({ label, format, modelId, source, sourceLabel, models, def
58285
58035
  });
58286
58036
  }
58287
58037
  //#endregion
58288
- //#region src/composites/step-inspector/step-model-list.tsx
58289
- /**
58290
- * StepModelList — the model section of the step inspector.
58291
- *
58292
- * While nothing is pinned, edited or worth a note, the accelerators are
58293
- * summarised by model — one line per distinct model, naming the accelerators
58294
- * that run it ("yolov9m-320-int8 · hub iGPU, hub NPU, little-unraid iGPU") —
58295
- * with "Per accelerator" to open one `StepModelRow` each. Four near-identical
58296
- * rows pushed the settings, the thing most edits are about, below the fold.
58297
- * A pin, a pending change or a note (no build here, root-supplied) shows every
58298
- * row, so nothing that differs from the default is ever folded away.
58299
- */
58300
- /** True when the rows can be summarised: nothing pinned here, edited, or noted. */
58301
- function modelRowsAreFoldable(rows) {
58302
- return rows.length >= 2 && rows.every((r) => r.note === void 0 && r.onReset === void 0 && r.changed !== true && !r.expanded);
58038
+ //#region src/composites/step-inspector/step-search.ts
58039
+ function matches(text, tokens) {
58040
+ const lower = text.toLowerCase();
58041
+ return tokens.every((t) => lower.includes(t));
58303
58042
  }
58304
- function groupByModel(rows) {
58305
- const groups = [];
58043
+ /** Steps matching `query` (all tokens in the name, or all in one field label). Empty query = all. */
58044
+ function searchSteps(rows, query) {
58045
+ const tokens = query.trim().toLowerCase().split(/\s+/).filter(Boolean);
58046
+ if (tokens.length === 0) return rows.map((row) => ({ addonId: row.addonId }));
58047
+ const hits = [];
58306
58048
  for (const row of rows) {
58307
- const modelId = row.modelId ?? "—";
58308
- const index = groups.findIndex((g) => g.modelId === modelId && g.sourceLabel === row.sourceLabel);
58309
- const existing = groups[index];
58310
- if (existing !== void 0) groups[index] = {
58311
- ...existing,
58312
- labels: [...existing.labels, row.label]
58313
- };
58314
- else groups.push({
58315
- modelId,
58316
- labels: [row.label],
58317
- sourceLabel: row.sourceLabel
58318
- });
58319
- }
58320
- return groups;
58321
- }
58322
- function StepModelList({ rows }) {
58323
- const [open, setOpen] = useState(false);
58324
- if (!open && modelRowsAreFoldable(rows)) {
58325
- const groups = groupByModel(rows);
58326
- return /* @__PURE__ */ jsxs("div", {
58327
- className: cn("rounded-md border border-border", LIST_ROW),
58328
- children: [/* @__PURE__ */ jsx("ul", {
58329
- className: "space-y-1",
58330
- children: groups.map((g) => /* @__PURE__ */ jsxs("li", {
58331
- className: "flex flex-wrap items-baseline gap-x-2 text-xs",
58332
- children: [
58333
- /* @__PURE__ */ jsx("span", {
58334
- className: "font-mono text-foreground",
58335
- children: g.modelId
58336
- }),
58337
- /* @__PURE__ */ jsx("span", {
58338
- className: "min-w-0 flex-1 text-[11px] text-foreground-subtle",
58339
- children: g.labels.length === rows.length ? `all ${rows.length} accelerators` : g.labels.join(", ")
58340
- }),
58341
- /* @__PURE__ */ jsx("span", {
58342
- className: "rounded border border-border px-1.5 py-px text-[10px] font-medium text-foreground-subtle",
58343
- children: g.sourceLabel
58344
- })
58345
- ]
58346
- }, `${g.modelId}|${g.sourceLabel}`))
58347
- }), /* @__PURE__ */ jsx("div", {
58348
- className: "mt-1.5 flex justify-end",
58349
- children: /* @__PURE__ */ jsx("button", {
58350
- type: "button",
58351
- className: cn(BTN_COMPACT, "min-h-9 md:min-h-0"),
58352
- "aria-expanded": false,
58353
- onClick: () => setOpen(true),
58354
- children: "Per accelerator"
58355
- })
58356
- })]
58049
+ if (matches(row.name, tokens)) {
58050
+ hits.push({ addonId: row.addonId });
58051
+ continue;
58052
+ }
58053
+ const field = row.fieldLabels.find((l) => matches(l, tokens));
58054
+ if (field !== void 0) hits.push({
58055
+ addonId: row.addonId,
58056
+ matchedField: field
58357
58057
  });
58358
58058
  }
58359
- return /* @__PURE__ */ jsx("div", {
58360
- className: "space-y-2",
58361
- children: rows.map(({ id, ...row }) => /* @__PURE__ */ jsx(StepModelRow, { ...row }, id))
58362
- });
58059
+ return hits;
58363
58060
  }
58364
58061
  //#endregion
58365
58062
  //#region src/composites/step-tree.ts
@@ -58992,29 +58689,19 @@ function StreamPanel({ serverUrl, createSession, sendAnswer, handleOffer, getIce
58992
58689
  children: [
58993
58690
  showStreamStats && streamStats && /* @__PURE__ */ jsxs("div", {
58994
58691
  className: "px-3 py-1.5 text-[10px] text-foreground-subtle border-b border-border-subtle",
58995
- children: [
58996
- /* @__PURE__ */ jsxs("div", {
58997
- className: "flex justify-between gap-3",
58998
- children: [/* @__PURE__ */ jsx("span", { children: "Input" }), /* @__PURE__ */ jsxs("span", {
58999
- className: "tabular-nums text-foreground",
59000
- children: [streamStats.inputFps.toFixed(1), " fps"]
59001
- })]
59002
- }),
59003
- /* @__PURE__ */ jsxs("div", {
59004
- className: "flex justify-between gap-3",
59005
- children: [/* @__PURE__ */ jsx("span", { children: "Decode" }), /* @__PURE__ */ jsxs("span", {
59006
- className: "tabular-nums text-foreground",
59007
- children: [streamStats.decodeFps.toFixed(1), " fps"]
59008
- })]
59009
- }),
59010
- /* @__PURE__ */ jsxs("div", {
59011
- className: "flex justify-between gap-3",
59012
- children: [/* @__PURE__ */ jsx("span", { children: "Uptime" }), /* @__PURE__ */ jsx("span", {
59013
- className: "tabular-nums text-foreground",
59014
- children: fmtUptime(streamStats.uptimeMs)
59015
- })]
59016
- })
59017
- ]
58692
+ children: [/* @__PURE__ */ jsxs("div", {
58693
+ className: "flex justify-between gap-3",
58694
+ children: [/* @__PURE__ */ jsx("span", { children: "Input" }), /* @__PURE__ */ jsxs("span", {
58695
+ className: "tabular-nums text-foreground",
58696
+ children: [streamStats.inputFps.toFixed(1), " fps"]
58697
+ })]
58698
+ }), /* @__PURE__ */ jsxs("div", {
58699
+ className: "flex justify-between gap-3",
58700
+ children: [/* @__PURE__ */ jsx("span", { children: "Uptime" }), /* @__PURE__ */ jsx("span", {
58701
+ className: "tabular-nums text-foreground",
58702
+ children: fmtUptime(streamStats.uptimeMs)
58703
+ })]
58704
+ })]
59018
58705
  }),
59019
58706
  !showStreamStats && choiceStats && choiceStats.inputFps > 0 && /* @__PURE__ */ jsxs("div", {
59020
58707
  className: "px-3 py-1.5 text-[10px] text-foreground-subtle border-b border-border-subtle",
@@ -61307,4 +60994,4 @@ var SceneMonitorEditor = lazy(() => import("./SceneMonitorEditor-vfWTm6qv.js").t
61307
60994
  /** Lazy-wrapped `PrivacyMaskSettings` — code-split off the main bundle. */
61308
60995
  var PrivacyMaskSettings = lazy(() => import("./PrivacyMaskSettings-DMkchqO1.js").then((m) => ({ default: m.PrivacyMaskSettings })));
61309
60996
  //#endregion
61310
- export { AcceleratorTabs, AddonGlobalSettingsForm, AdminLinkQuickAction, AgentStepEditor, AlarmHeroCard, AlarmInlineControl as AlarmPanelInlineControl, AppShell, ArcKnob, AudioClassificationList, AudioLevelWaveform, AudioWaveform, AutomationHeroCard, AutomationInlineControl, AutotrackSection, BTN_COMPACT, BTN_COMPACT_DANGER, BTN_COMPACT_PRIMARY, BTN_COMPACT_WARNING, BackToStepsButton, Badge, BatteryBadge, BottomSheet, Breadcrumb, BrightnessPanel, Button, ButtonControl, ButtonHeroCard, CARD_MODE_MIN_COLUMNS, CENTER, CHIP_ACTIVE, CHIP_BASE, CHIP_INACTIVE, CLASS_COLORS, COLUMN_BREAKPOINT_CLASS, COLUMN_PRIORITY, COMMIT_DEDUPE_TOLERANCE_MS, COMMIT_DEDUPE_WINDOW_MS, CONTROL_CAP_NAMES, CONTROL_FILLS, CameraStreamPlayer, Card, Checkbox, ChildSectionAccordion, ClimatePanel, CodeBlock, CollapsibleCard, ConfigFormBuilder, FormField as ConfigFormField, ConfigNotificationTargetMultiSelectFieldView, ConfigNotificationTargetSelectFieldView, 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_PICKER_GROUP_STORAGE_KEY, DEVICE_ROLE_META, DEVICE_TYPE_CONTROL, DEVICE_TYPE_META, DISPLAY_ICON_REGISTRY, DataTable, DataTableFilterBar, DetectionCanvas, DetectionOverlay, DetectionResultTree, DevShell, DeviceActivityPanel, DeviceBatchToolbar, DeviceCard, DeviceContextProvider, DeviceExportPanel, DeviceFilterBar, DeviceGrid, DeviceItem, DeviceList, DeviceMultiSelectField, DevicePicker, DeviceQuickDetailProvider, DeviceSelectField, DeviceSelectorPicker, DeviceStepMatrix, DevicesFailedLine, DevicesLoadingLine, DevicesWidenWarning, Dialog, DialogBody, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, DiscoveryPanel, DoorbellRecentPanel, Dropdown, DropdownContent, DropdownItem, DropdownTrigger, DummyHeroCard, DummyInline, EMPTY_DATA_TABLE_FILTER, EVENT_KIND_ICONS, EmptyState, EndpointResultsCard, EndpointTestCard, ErrorBox, EventKindGlyph, EventStream, ExtensionsPanel, FILL, FLEET_LIST_GC_TIME_MS, FLEET_LIST_QUERY_KEY, FLEET_LIST_STALE_TIME_MS, FanHeroCard, FanInlineControl, FanPanel, FilterBar, FloatingEventStream, FloatingLogStream, FloatingPanel, FormField$1 as FormField, GRID_GAP, GRID_PAIRED, GRID_QUICK_STATS, GateBadge, GateControl, GripTrack, GroupedModelSelector, HOST_WIDGETS, HUB_SESSION_RUN_MS, HlsVideo, HoverZoomImage, HubSessionTestCard, HumidifierHeroCard, HumidifierInlineControl, INPUT_COMPACT, INPUT_SHELL, IconAction, IconButton, IconPicker, ImageHeroCard, ImageInlineControl, ImageSelector, InferenceConfigSelector, Input, KebabMenu, KeyValueList, LIST_ROW, Label, LawnMowerHeroCard, LawnMowerInlineControl, LayeredSettingsForm, LightHeroCard, LightInlineControl, LockHeroCard, LockInlineControl, LockPanel, LogStream, LoginForm, MODE_COLOR, MaskShapeCanvas, MediaPlayerHeroCard, MediaPlayerInlineControl, MediaPlayerPanel, MobileDrawer, ModelPicker, MotionZonesSettings, NAVIGATION_DRIVE_INTERVAL_MS, NatResultCard, NavigationPanel, NetworkLinkBadge, NodeMultiSelectField, NodePicker, NodeSelectField, NotificationTargetSelectField, NotificationTargetsField, OPTION_SELECT_SEARCH_MIN_OPTIONS, OfflineBadge, OptionSelect, PHASE_CONFIG, PICKER_CHIP_LIMIT, PICKER_DEFAULT_GROUP_BY, PICKER_GROUP_BY_MODES, PICKER_GROUP_COLLAPSE_AT, PICKER_NONE_KEY, PICKER_NOUN_PLURAL, PICKER_NO_FILTERS, PICKER_PAGE_SIZE, PICKER_SEARCH_DEBOUNCE_MS, PICKER_WINDOW, PRIORITY, PTZOverlay, PageHeader, PhaseIcon, PipelineBuilder, PipelineRuntimeSelector, PipelineStep, PlaceholderChipField, PlayerOverlaysProvider, Popover, PopoverContent, PopoverRowAction, PopoverTrigger, PrimaryChildPicker, PrivacyMaskSettings, ProviderBadge, PtzPanel, QrCode, RECONNECT_POLICY, RECORDED_PLAYBACK_MODES, RIGHT, ROI_AREA_WARN_FRACTION, ROLE_DESCRIPTOR, RadialGauge, RecordedPlaybackProvider, RecordingPanel, ResponseLog, RoleDisplayDefaultsFromServer, RoleDisplayDefaultsProvider, RootModelSourceControl, RootSuppliedModelNote, RunReport, SCENE_CAPTURE_VARIANTS, SECTION_BODY, SECTION_CARD, SECTION_HEADER, SETTING_ROW, SETTING_ROW_LABEL, SETTING_ROW_STACK_BREAKPOINT, SETTING_ROW_VALUE, SETTING_ROW_VALUE_TEXT, SNAPSHOT_MEDIA_PATH, SPLIT_PANEL_OUTER, SPLIT_PANEL_SIDE, STACK_GAP, STATE_COLOR, SceneMonitorEditor, ScopePicker, ScriptHeroCard, ScriptInlineControl, ScrollArea, SectionCard, SegmentedChoice, Select, SelectedChip, SemanticBadge, SensorHeroCard, SensorInlineControl, SensorValueAtom, Separator, SettingRow, Sidebar, SidebarItem, Skeleton, SlideToggle, SnapshotButton, SortHeaderButton, StatCard, StateValuesStream, StatusBadge, StepChips, StepInspectorLayout, StepInspectorPanel, StepList, StepModelList, StepModelRow, StepTimings, Stepper, StreamBrokerSelector, StreamDebugOverlay, StreamPanel, Switch, SwitchHeroCard, SwitchInlineControl, SwitchPanel, SystemProvider, TABLE_SCROLL_MAX_H, TEXT_FIELD_LABEL, TEXT_HINT, TEXT_METRIC, TEXT_SECTION_LABEL, TEXT_VALUE, TIMEZONES, Tabs, TabsContent, TabsList, TabsTrigger, TapToggle, ThemeProvider, ThermostatHeroCard, ThermostatInlineControl, TimezoneSelector, Tooltip, TooltipContent, TooltipTrigger, UnitPicker, VacuumHeroCard, VacuumInlineControl, ValueReadout, ValveHeroCard, ValveInlineControl, VersionBadge, VodPlaybackProvider, WaterHeaterHeroCard, WaterHeaterInlineControl, WeatherHeroCard, WeatherInlineControl, WidgetMetricCard, WidgetPanel, WidgetRegistryProvider, WidgetSlot, ZoneEditingProvider, MicOff as a, agentColumnKey, allDeviceTypeFilterOptions, applyFleetQueryDefaults, applyPickerFilters, ariaSortForColumn, badgeFor, bindsToModel, buildPeerConnectionConfig, buildStepTreeFromSchema, EyeOff as c, catalogHasDraft, childEntityId, childListName, chipOverflow, classifyAddressScope, classifyCapability, classifySessionVerdict, clearPickerGroup, cn, columnsForContext, compareSrflxMappings, containerChildToRef, countableDevices, coverHighlight, coverageLine, createSharedContext, createTheme, cursorFractionFor, darkColors, dataTableFacets, defaultOfField, defaultTheme, deriveDeviceKind, deriveWebrtcDebugStats, describeDeviceSelector, deviceIntegrationResolver, deviceListStateOf, deviceMatchesFilter, deviceOptionLabel, deviceRoleMeta, deviceRoleMetaOf, deviceTypeLabel, deviceTypeMeta, deviceTypeMetaOf, devicesToOptions, draftFromQuery, emptyDevicesWidens, emptySessionRun, ensureMfHostInit, eventKindLabel, fillHeightPx, filterDataTableRows, filterDeviceOptions, filterOptions as filterOptionSelectOptions, filterPickerDevices, finalizeSessionRun, findTimezone, flattenPickerGrouping, flattenPickerRows, fleetViewOf, formatControlDateTime, formatLastSeen, formatNumeric, formatSettingValue, freezeVerdict, fuzzyMatch, getClassColor, getPhaseVisual, groupAgentColumns, groupChildrenByLayout, groupPickerDevices, groupPickerDevicesBy, hardwareLabel, hubOrigin, hubPath, hubUrl, hubWsUrl, humanDuration, humidifierTint, Mic as i, initialScrubState, insertAtSelection, isAbsentProvider, isDataTableFilterActive, isFieldVisible, isGroupExpanded, isValueField, Camera as l, lawnMowerActivityMeta, lightColors, loadRemoteBundle, makeScrubBridge, metadataEntries, metadataString, mirror, modelRowsAreFoldable, mountAddonPage, mountPath, Square as n, nextReconnectAction, nextSort, nextSortDirection, nextTableSort, normalizeForSearch, ImageOff as o, offListSelections, openTopLayer, optionSearchText as optionSelectSearchText, orphanDeviceLabel, overrideEntityIdFromLink, pageRows, parentDetailOf, parseIceCandidate, parsePickerGroupBy, parseRecordedServerMessage, partitionSelected as partitionOptionSelectSelected, partitionSuggested, pickerFacetFilterShown, pickerFacetKey, pickerFacetOptions, pickerFiltersActive, pickerGroupKey, pickerHiddenSelectedCount, pickerLocationKey, pickerQueryTokens, pickerRowFacts, pickerSearchText, pickerZoneFilterSuspended, pinnedStreamChoices, providerIcons, RotateCcw as r, readStoredGroupBy, reduceSessionRun, resetHubMountForTests, resetPickerFilters, resolveContainerPrimary, resolveControlAlign, resolveDeviceControl, resolveDeviceIntegration, resolveDisplayIcon, resolveEffectiveDefaultModel, resolveEffectiveStepModel, resolveEventKindIcon, resolveSearchable as resolveOptionSelectSearchable, resolveParentNames, resolvePrimaryChild, resolveSelectedDevices, resolveSensorDisplay, resolveStepDefaultModel, resolveTableLayout, roiTooLarge, rootSourceState, routerBasename, Grid2x2 as s, sameLocationSuggestions, scrubReducer, searchSteps, selectPickerGroup, selectedDeviceOptions, serializeRecordedCommand, settingsModelIdFor, shouldCommit, shouldEmit, shouldShowAddNewFooter, shouldShowUseQueryRow, shouldUseSingleNode, showsNoCamerasHint, sortRows, sortRowsByColumn, statusIcons, statusLine, stepFieldDomId, stepHasModelForFormat, stepLocalFields, stepModelOptions, stripParentNamePrefix, summarizeHubCandidates, Trash2 as t, tabForSelector, tankAlert, themeToCss, toStationaryOverlayBox, toggleDataTableFacet, togglePickerDevice, togglePickerKey, trpc, typeLabel, createLucideIcon as u, useAccessoriesGetStatus, useAccessoriesSetChildHidden, useAddonPagesListPages, useAddonSettingsGetDeviceSettings, useAddonSettingsGetGlobalSettings, useAddonSettingsGetIntegrationSettings, useAddonSettingsUpdateDeviceSettings, useAddonSettingsUpdateGlobalSettings, useAddonWidgetsListWidgets, useAddonsApplyAutoUpdateToAll, useAddonsCancelJob, useAddonsCustom, useAddonsForceRefresh, useAddonsGetAddonAutoUpdate, useAddonsGetAutoUpdateSettings, useAddonsGetJob, useAddonsGetLastRestart, useAddonsGetLogs, useAddonsGetVersions, useAddonsInstallFromWorkspace, useAddonsInstallPackage, useAddonsIsWorkspaceAvailable, useAddonsList, useAddonsListCapabilityProviders, useAddonsListFrameworkPackages, useAddonsListJobs, useAddonsListPackages, useAddonsListUpdates, useAddonsListWorkspacePackages, useAddonsOnAddonLogs, useAddonsReloadPackages, useAddonsRestartAddon, useAddonsRestartServer, useAddonsRetryLoad, useAddonsRollbackPackage, useAddonsSearchAvailable, useAddonsSetAddonAutoUpdate, useAddonsSetAutoUpdateSettings, useAddonsSetCapabilityProviderEnabled, useAddonsStartJob, useAddonsUninstallPackage, useAddonsUpdatePackage, useAirQualitySensorGetStatus, useAlarmPanelArm, useAlarmPanelDisarm, useAlarmPanelGetStatus, useAlarmPanelTrigger, useAlert, useAlertsDismiss, useAlertsEmit, useAlertsGetUnreadCount, useAlertsList, useAlertsMarkAllRead, useAlertsMarkRead, useAlertsUpdate, useAllWidgets, useAmbientLightSensorGetStatus, useAudioAnalysisApplyDeviceSettingsPatch, useAudioAnalysisGetDeviceLiveContribution, useAudioAnalysisGetDeviceSettingsContribution, useAudioAnalysisResolveDeviceSettings, useAudioAnalyzerAnalyseChunk, useAudioAnalyzerAttachDevice, useAudioAnalyzerClassify, useAudioAnalyzerDetachDevice, useAudioAnalyzerDispose, useAudioAnalyzerIsReady, useAudioAnalyzerReprobeAudioEngine, useAudioCodecCanHandle, useAudioCodecCloseSession, useAudioCodecCreateDecodeSession, useAudioCodecCreateEncodeSession, useAudioCodecFlushEncode, useAudioCodecListActiveSessions, useAudioCodecListSupportedCodecs, useAudioCodecPullEncoded, useAudioCodecPullPcm, useAudioCodecPushEncodedFrame, useAudioCodecPushPcm, useAudioMetricsGetCurrentSnapshot, useAudioMetricsGetHistory, useAutomationControlDisable, useAutomationControlEnable, useAutomationControlGetStatus, useAutomationControlTrigger, useBackupCancel, useBackupDelete, useBackupDeleteSchedule, useBackupGetEntries, useBackupList, useBackupListArchives, useBackupListDestinations, useBackupListLocations, useBackupListRuns, useBackupListSchedules, useBackupPreviewSchedule, useBackupRestore, useBackupTrigger, useBackupUpsertDestinationPolicy, useBackupUpsertSchedule, useBatteryGetStatus, useBatteryWakeForStream, useBinaryGetStatus, useBrightnessGetStatus, useBrightnessSetBrightness, useBrokerAdd, useBrokerGet, useBrokerGetBrokerConfig, useBrokerGetSettings, useBrokerGetSettingsSchema, useBrokerGetState, useBrokerGetStatus, useBrokerList, useBrokerListProviders, useBrokerPublish, useBrokerRemove, useBrokerSetSettings, useBrokerSubscribe, useBrokerTestConnection, useBrokerTestSettings, useBrokerUnsubscribe, useButtonPress, useCalendarsGetPreferences, useCalendarsListCalendars, useCalendarsListEvents, useCalendarsSetCalendarPreference, useCameraCredentialsGetCredentials, useCameraCredentialsGetStatus, useCameraGridLayoutApplyDeviceSettingsPatch, useCameraGridLayoutGetDeviceLiveContribution, useCameraGridLayoutGetDeviceSettingsContribution, useCameraGridLayoutGetLayout, useCameraGridLayoutSaveLayout, useCameraPipelineConfigApplyDeviceSettingsPatch, useCameraPipelineConfigGetDeviceLiveContribution, useCameraPipelineConfigGetDeviceSettingsContribution, useCameraStreamsGetBrokerStreams, useCameraStreamsGetCameraStreams, useCameraStreamsGetProfileRtspEntries, useCameraStreamsGetRtspEntries, useCameraStreamsPickStream, useCapabilityPresence, useCarbonMonoxideGetStatus, useClimateControlGetStatus, useClimateControlSetFanMode, useClimateControlSetMode, useClimateControlSetPreset, useClimateControlSetSwingHorizontal, useClimateControlSetSwingVertical, useClimateControlSetTarget, useClimateControlSetTargetHumidity, useClimateControlSetTargetRange, useClusterNodes, useClusterTopology, useColorGetStatus, useColorSetColor, useConfirm, useConnectionTestDescribeTest, useConnectionTestTestSettings, useConnectivityGetStatus, useConsumablesGetStatus, useConsumablesReset, useContactGetStatus, useContainerChildren, useControlGetStatus, useControlSetValue, useCoreBlocksCompile, useCoreBlocksCreate, useCoreBlocksCreateComposition, useCoreBlocksDelete, useCoreBlocksGet, useCoreBlocksGetBlockSettings, useCoreBlocksGetComposition, useCoreBlocksGetCustomization, useCoreBlocksGetTypeDefs, useCoreBlocksList, useCoreBlocksListComposableCaps, useCoreBlocksListCompositions, useCoreBlocksRestart, useCoreBlocksSetEnabled, useCoreBlocksUpdate, useCoreBlocksUpdateBlockSettings, useCoreBlocksUpdateComposition, useCoreBlocksValidateComposition, useCoverClose, useCoverGetStatus, useCoverOpen, useCoverSetPosition, useCoverSetTiltPosition, useCoverStop, useCustomFieldRenderer, useDataTableFilter, useDayNightGetOptions, useDayNightGetStatus, useDayNightSetSettings, useDebouncedString, useDecoderCreateSession, useDecoderDestroySession, useDecoderGetFrame, useDecoderGetInfo, useDecoderGetShmStats, useDecoderGetStats, useDecoderListActiveSessions, useDecoderOpenStream, useDecoderPullFrames, useDecoderPullHandles, useDecoderPushPacket, useDecoderReprobeHwaccel, useDecoderSupportsCodec, useDecoderUpdateConfig, useDetectionPipelineApplyDeviceSettingsPatch, useDetectionPipelineGetDeviceLiveContribution, useDetectionPipelineGetDeviceSettingsContribution, useDevShell, useDevice, useDeviceAdminLink, useDeviceAdminLinkGetAdminLink, 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, useDeviceExtensionListCandidates, useDeviceExtensionListSlots, useDeviceExtensionListSources, useDeviceExtensionSetSlot, useDeviceId, useDeviceListPageSize, useDeviceManagerAddLocation, useDeviceManagerAdoptDevice, useDeviceManagerAdoptionAdopt, useDeviceManagerAdoptionCancelJob, useDeviceManagerAdoptionListCandidateFilters, useDeviceManagerAdoptionListCandidates, useDeviceManagerAdoptionListJobs, useDeviceManagerAdoptionRefresh, useDeviceManagerAdoptionRelease, useDeviceManagerAdoptionResync, useDeviceManagerAdoptionStartJob, useDeviceManagerAllocateDeviceId, useDeviceManagerApplyInitialMeta, useDeviceManagerCreateDevice, useDeviceManagerDisable, useDeviceManagerDiscoverAllProviders, useDeviceManagerDiscoverDevices, useDeviceManagerDiscoverProvider, useDeviceManagerDiscoveryProviders, useDeviceManagerEnable, useDeviceManagerGetAllBindings, useDeviceManagerGetBindings, useDeviceManagerGetBindingsBatch, useDeviceManagerGetChildren, useDeviceManagerGetChildrenBatch, useDeviceManagerGetConfigSchema, useDeviceManagerGetCreationSchema, useDeviceManagerGetDevice, useDeviceManagerGetDeviceAggregate, useDeviceManagerGetDeviceLiveInfoAggregate, useDeviceManagerGetDeviceSettingsAggregate, useDeviceManagerGetDeviceStatusAggregate, useDeviceManagerGetDeviceStatusAggregateBatch, useDeviceManagerGetLinkedDevices, useDeviceManagerGetLinkedDevicesBatch, useDeviceManagerGetRoleDisplayDefaults, useDeviceManagerGetSettingsSchema, useDeviceManagerGetStreamProfileMap, useDeviceManagerGetStreamSources, useDeviceManagerGetWireableFields, useDeviceManagerGetWrapperActivation, useDeviceManagerListAll, useDeviceManagerListBindableCapsForDeviceType, useDeviceManagerListDeviceIdsByCaps, useDeviceManagerListLocationDescriptions, useDeviceManagerListLocationIcons, useDeviceManagerListLocations, useDeviceManagerListPersistedByAddon, useDeviceManagerListSiteZones, useDeviceManagerListWrappersForCap, useDeviceManagerLoadConfig, useDeviceManagerLoadMeta, useDeviceManagerLoadRuntimeState, useDeviceManagerMigrateDevice, useDeviceManagerPersistConfig, useDeviceManagerProbeStreams, useDeviceManagerProviderCreationType, useDeviceManagerProviderDiscoveryParamsSchema, useDeviceManagerRegisterDevice, useDeviceManagerRemove, useDeviceManagerRemoveByIntegration, useDeviceManagerRemoveDevice, useDeviceManagerRemoveLocation, useDeviceManagerRemoveSiteZone, useDeviceManagerRenameLocation, useDeviceManagerRenameSiteZone, useDeviceManagerRunDeviceAction, useDeviceManagerSetChildLayout, useDeviceManagerSetDisabled, useDeviceManagerSetDisplay, useDeviceManagerSetIntegrationId, useDeviceManagerSetLinkDeviceId, useDeviceManagerSetLocation, useDeviceManagerSetLocationDescription, useDeviceManagerSetLocationIcon, useDeviceManagerSetLocationZone, useDeviceManagerSetMetadata, useDeviceManagerSetName, useDeviceManagerSetPrimaryChildEntityId, useDeviceManagerSetRole, useDeviceManagerSetRoleDisplayDefaults, useDeviceManagerSetSiteZone, useDeviceManagerSetStreamProfileMap, useDeviceManagerSetType, useDeviceManagerSetWrapperActive, useDeviceManagerTestCreationField, useDeviceManagerTestField, useDeviceManagerUpdateConfig, useDeviceManagerUpdateDeviceField, useDeviceManagerUpdateDeviceFieldsBatch, useDeviceNetworkLink, useDeviceOpsGetConfigEntries, useDeviceOpsGetRawState, useDeviceOpsGetSettingsSchema, useDeviceOpsGetStreamSources, useDeviceOpsRemoveDevice, useDeviceOpsRunAction, useDeviceOpsSetConfig, useDeviceProviderAdoptDiscoveredDevice, useDeviceProviderCreateDevice, useDeviceProviderDiscoverDevices, useDeviceProviderGetChildCreationSchema, useDeviceProviderGetDevices, useDeviceProviderGetDiscoveryParamsSchema, useDeviceProviderGetManualCreationType, useDeviceProviderGetStatus, useDeviceProviderReloadDevice, useDeviceProviderStart, useDeviceProviderStop, useDeviceProviderSupportsDiscovery, useDeviceProviderSupportsManualCreation, useDeviceProviderTestCreationField, useDeviceProxy, useDeviceQuickDetailOpen, useDeviceSnapshot, useDeviceSnapshotImage, useDeviceState, useDeviceStateClaimFields, useDeviceStateGetAllSnapshots, useDeviceStateGetCapSlice, useDeviceStateGetNativeCapSlice, useDeviceStateGetSnapshot, useDeviceStateListClaims, useDeviceStatePatchOwnedFields, useDeviceStateReleaseClaim, useDeviceStateSetCapSlice, useDeviceStateSlice, useDeviceStatusGetStatus, useDeviceWebrtc, useDevices, useDoorbellEvents, useDoorbellGetStatus, useEnumSensorGetStatus, useEventEmitterGetStatus, useEventInvalidation, useEventStreamLatest, useEventStreamMap, useFaceGalleryAssignFace, useFaceGalleryAssignFaces, useFaceGalleryAuditIdentitySamples, useFaceGalleryCreateIdentity, useFaceGalleryDeleteFace, useFaceGalleryDeleteIdentity, useFaceGalleryGetFaceByTrack, useFaceGalleryGetFaceMedia, useFaceGalleryListIdentities, useFaceGalleryListIdentitySamples, useFaceGalleryListRecentFaces, useFaceGalleryRemoveSample, useFaceGalleryRenameIdentity, useFaceGallerySuggestFaceClusters, useFaceGalleryUnassignFace, useFaceGalleryUnassignFaces, useFanControlGetStatus, useFanControlSetDirection, useFanControlSetOscillating, useFanControlSetPercentage, useFanControlSetPreset, useFeatureProbeGetStatus, useFloodGetStatus, useGasGetStatus, useHumidifierGetStatus, useHumidifierSetMode, useHumidifierSetOn, useHumidifierSetTargetHumidity, useHumiditySensorGetStatus, useImageGetStatus, useImageSettingsGetOptions, useImageSettingsGetStatus, useImageSettingsSetSettings, useIntegrationsCreate, useIntegrationsDelete, useIntegrationsGet, useIntegrationsGetAvailableTypes, useIntegrationsGetByAddonId, useIntegrationsGetSettings, useIntegrationsList, useIntegrationsSetSettings, useIntegrationsTestConnection, useIntegrationsUpdate, useIntercomEndTalkSession, useIntercomGetStatus, useIntercomHandleAnswer, useIntercomPushTalkAudio, useIntercomStartSession, useIntercomStartTalkSession, useIntercomStopSession, useIsMidWidth, useIsMobile, useLawnMowerControlDock, useLawnMowerControlGetStatus, useLawnMowerControlPause, useLawnMowerControlStartMowing, useLiveBuffer, useLiveEvent, useLlmCancel, useLlmDeleteModel, useLlmDeleteProfile, useLlmGenerate, useLlmGenerateVision, useLlmGetDefaults, useLlmGetRuntimeStatus, useLlmGetUsage, useLlmInstallModel, useLlmListModelCatalog, useLlmListModels, useLlmListNodeModels, useLlmListProfileKinds, useLlmListProfiles, useLlmListRuntimeNodes, useLlmResolveModelRef, useLlmSetDefault, useLlmStartRuntime, useLlmStopRuntime, useLlmTestProfile, useLlmUpsertProfile, useLocalNetworkAddCustomAddress, useLocalNetworkDownloadCa, useLocalNetworkGetAddresses, useLocalNetworkGetAllowedAddresses, useLocalNetworkGetConnectionEndpoints, useLocalNetworkGetHubAddresses, useLocalNetworkGetNotificationEndpoint, useLocalNetworkGetPreferred, useLocalNetworkGetTlsStatus, useLocalNetworkGetViewerEndpoints, useLocalNetworkList, useLocalNetworkRegenerateCertificate, useLocalNetworkRemoveCustomAddress, useLocalNetworkResetAllowlistToBestMatch, useLocalNetworkRevertToGeneratedCertificate, useLocalNetworkSetAddressRole, useLocalNetworkSetAllowedAddresses, useLocalNetworkSetNotificationEndpoint, useLocalNetworkSetViewerEndpoints, useLocalNetworkUploadCertificate, useLockControlGetStatus, useLockControlLock, useLockControlOpen, useLockControlUnlock, useMediaPlayerGetStatus, useMediaPlayerNext, useMediaPlayerPause, useMediaPlayerPlay, useMediaPlayerPlayMedia, useMediaPlayerPrevious, useMediaPlayerSeek, useMediaPlayerSelectSource, useMediaPlayerSetMute, useMediaPlayerSetRepeat, useMediaPlayerSetShuffle, useMediaPlayerSetVolume, useMediaPlayerStop, useMeshNetworkGetStatus, useMeshNetworkJoin, useMeshNetworkLeave, useMeshNetworkListPeers, useMeshNetworkLogout, useMeshNetworkStartLogin, useMeshNetworkTestConnection, useMetricsProviderCollectSnapshot, useMetricsProviderGetAddonStats, useMetricsProviderGetCached, useMetricsProviderGetCpuTemperature, useMetricsProviderGetCurrent, useMetricsProviderGetDiskSpace, useMetricsProviderGetGpuInfo, useMetricsProviderGetLoadSeries, useMetricsProviderGetProcessStats, useMetricsProviderListAddonInstances, useMetricsProviderListNodeProcesses, useMotionDetectionAnalyze, useMotionDetectionApplyDeviceSettingsPatch, useMotionDetectionGetDeviceLiveContribution, useMotionDetectionGetDeviceSettingsContribution, useMotionDetectionRemoveCamera, useMotionDetectionReset, useMotionGetStatus, useMotionIsDetected, useMotionTriggerGetStatus, useMotionTriggerSetMotionTrigger, useMotionZonesGetOptions, useMotionZonesGetStatus, useMotionZonesSetZone, useMqttBrokerAddBroker, useMqttBrokerGetBrokerConfig, useMqttBrokerGetStatus, useMqttBrokerListBrokers, useMqttBrokerRemoveBroker, useMqttBrokerStartEmbeddedBroker, useMqttBrokerStopEmbeddedBroker, useMqttBrokerTestConnection, useNativeObjectDetectionGetOptions, useNativeObjectDetectionGetStatus, useNativeObjectDetectionSetEnabled, useNativeObjectDetectionSetSettings, useNavigation, useNavigationGetFeatures, useNavigationGetStatus, useNavigationGoToPoint, useNavigationListActions, useNavigationMove, useNavigationPlaySound, useNavigationRunAction, useNavigationSetLightLevel, useNavigationSetLightMode, useNavigationSetLightOn, useNavigationStop, useNetworkAccessGetEndpoint, useNetworkAccessGetStatus, useNetworkAccessListEndpoints, useNetworkAccessStart, useNetworkAccessStop, useNetworkLinkGetStatus, useNetworkQualityGetAllStats, useNetworkQualityGetDeviceStats, useNetworkQualityReportClientStats, useNodesClusterAddonStatus, useNodesDeployAddon, useNodesDirectory, useNodesExecuteQuery, useNodesGetCapUsageGraph, useNodesGetNodeAddons, useNodesRenameNode, useNodesRestartAddon, useNodesRestartNode, useNodesRestartProcess, useNodesSetProcessLogLevel, useNodesShutdownNode, useNodesTopology, useNodesUndeployAddon, useNotificationOutputDeleteTarget, useNotificationOutputDiscoverTargets, useNotificationOutputGetTarget, useNotificationOutputListTargetKinds, useNotificationOutputListTargets, useNotificationOutputProbeTargetConfig, useNotificationOutputSend, useNotificationOutputSetTargetEnabled, useNotificationOutputTestTarget, useNotificationOutputUpsertTarget, useNotificationRulesActivateAlarmProfile, useNotificationRulesCancelSnooze, useNotificationRulesCreateAlarmProfile, useNotificationRulesCreateRule, useNotificationRulesCreateSequence, useNotificationRulesCreateSnooze, useNotificationRulesDeleteAlarmProfile, useNotificationRulesDeleteRule, useNotificationRulesDeleteSequence, useNotificationRulesGetAlarmConfig, useNotificationRulesGetAlarmSensors, useNotificationRulesGetClipRetentionAsks, useNotificationRulesGetConditionCatalog, useNotificationRulesGetHistory, useNotificationRulesGetRule, useNotificationRulesGetRuleLastRuns, useNotificationRulesGetSequence, useNotificationRulesGetTemplateCatalog, useNotificationRulesListDeviceMutes, useNotificationRulesListRules, useNotificationRulesListSequences, useNotificationRulesListSnoozes, useNotificationRulesPreviewStateSummary, useNotificationRulesPreviewTemplate, useNotificationRulesRenameAlarmProfile, useNotificationRulesResolveArtifactUrl, useNotificationRulesSetAlarmConfig, useNotificationRulesSetDeviceMuted, useNotificationRulesSetRuleEnabled, useNotificationRulesTestRule, useNotificationRulesUpdateRule, useNotificationRulesUpdateSequence, useNotifierCancel, useNotifierGetStatus, useNotifierSend, useNumericSensorGetStatus, useOptimisticSlice, useOptionalSystem, useOptionalWidgetRegistry, useOsdGetStatus, useOsdManagerClearSlotBinding, useOsdManagerCopyDeviceConfiguration, useOsdManagerDeleteTemplate, useOsdManagerGetConditionSupport, useOsdManagerGetDeviceOsd, useOsdManagerGetSourceCatalog, useOsdManagerListTemplates, useOsdManagerPreviewSlot, useOsdManagerRenderDevice, useOsdManagerSetSlotBinding, useOsdManagerUpsertTemplate, useOsdSetOverlay, usePTZ, usePetFeederCallPet, usePetFeederCancelFeed, usePetFeederFeed, usePetFeederGetStatus, usePetFeederMarkFoodReplenished, usePetFeederPlaySound, usePetFeederResetDesiccant, usePetFeederSetChildLock, usePetFeederSetFeedSound, usePetFeederSetIndicatorLight, usePetFeederSetVolume, usePickerSiteZones, usePipelineAnalyticsApplyDeviceSettingsPatch, usePipelineAnalyticsCancelRelocateMedia, usePipelineAnalyticsCancelStorageMigrationMove, usePipelineAnalyticsClearTrackRelation, usePipelineAnalyticsClearTracks, usePipelineAnalyticsCompleteRetrainTrack, usePipelineAnalyticsCountRelocatableMedia, usePipelineAnalyticsCountUnstampedEventMedia, usePipelineAnalyticsDeleteDeviceEvents, usePipelineAnalyticsDeleteTracks, usePipelineAnalyticsDeselectRetrainFrame, usePipelineAnalyticsGetActiveTracks, usePipelineAnalyticsGetAudioEvents, usePipelineAnalyticsGetDeviceLiveContribution, usePipelineAnalyticsGetDeviceSettingsContribution, usePipelineAnalyticsGetEventDensity, usePipelineAnalyticsGetEventDensityBatch, usePipelineAnalyticsGetEventMedia, usePipelineAnalyticsGetEventMediaFootprintByKind, usePipelineAnalyticsGetEventStoreFootprint, usePipelineAnalyticsGetKeyEvents, usePipelineAnalyticsGetKeyEventsBatch, usePipelineAnalyticsGetMediaReclaimStatus, usePipelineAnalyticsGetMotionEvents, usePipelineAnalyticsGetObjectEmbeddingRebuildStatus, usePipelineAnalyticsGetObjectEvents, usePipelineAnalyticsGetRetrainExportUrl, usePipelineAnalyticsGetRetrainFrameImage, usePipelineAnalyticsGetSensorEvents, usePipelineAnalyticsGetStorageMigrationMoveStatus, usePipelineAnalyticsGetTrack, usePipelineAnalyticsGetTrackMedia, usePipelineAnalyticsGetTrainingExportSummary, usePipelineAnalyticsGetTrainingExportUrl, usePipelineAnalyticsListArchivedDebugNotes, usePipelineAnalyticsListBirthDecisions, usePipelineAnalyticsListEventKinds, usePipelineAnalyticsListEventKindsBatch, usePipelineAnalyticsListEventMedia, usePipelineAnalyticsListOpsLog, usePipelineAnalyticsListRecentTracks, usePipelineAnalyticsListRelocateMediaJobs, usePipelineAnalyticsListRetrainAnnotations, usePipelineAnalyticsListRetrainFrames, usePipelineAnalyticsListRetrainStaging, usePipelineAnalyticsListTrackMedia, usePipelineAnalyticsListTrackRelations, usePipelineAnalyticsListTracks, usePipelineAnalyticsOwnersWithMedia, usePipelineAnalyticsPauseForStorageMigration, usePipelineAnalyticsProposeRetrainAnnotations, usePipelineAnalyticsPruneEvents, usePipelineAnalyticsPruneEventsBefore, usePipelineAnalyticsPruneTracksBefore, usePipelineAnalyticsReadLongTermSeries, usePipelineAnalyticsRebuildObjectEmbeddings, usePipelineAnalyticsReclaimDebugMedia, usePipelineAnalyticsReconcileFromDisk, usePipelineAnalyticsRefreshStorageLocationsForMigration, usePipelineAnalyticsRelocateMedia, usePipelineAnalyticsRestageRetrainTrack, usePipelineAnalyticsResumeForStorageMigration, usePipelineAnalyticsSaveRetrainAnnotations, usePipelineAnalyticsSearchObjectEvents, usePipelineAnalyticsSelectRetrainFrames, usePipelineAnalyticsSetTrackFlags, usePipelineAnalyticsSetTrackPurity, usePipelineAnalyticsSetTrackRelation, usePipelineAnalyticsStartStorageMigrationMove, usePipelineAnalyticsWipeAllAnalytics, usePipelineAnalyticsWipeObjectEmbeddings, usePipelineExecutorCacheFrameInPool, usePipelineExecutorClearDeviceOverrides, usePipelineExecutorClearModelBoundDeviceOverrides, usePipelineExecutorDeleteModel, usePipelineExecutorDeleteTemplate, usePipelineExecutorDownloadModel, usePipelineExecutorGetAddonModels, usePipelineExecutorGetAudioCapabilities, usePipelineExecutorGetAvailableEngines, usePipelineExecutorGetCapabilities, usePipelineExecutorGetDefaultSteps, usePipelineExecutorGetDetectionConfigSchema, usePipelineExecutorGetEffectiveTuning, usePipelineExecutorGetEngineProvisioning, usePipelineExecutorGetGlobalPipelineConfig, usePipelineExecutorGetGlobalSteps, usePipelineExecutorGetInferenceDeviceHealth, usePipelineExecutorGetOrchestratorConfigSchema, usePipelineExecutorGetReferenceAudio, usePipelineExecutorGetReferenceAudioFiles, usePipelineExecutorGetReferenceImage, usePipelineExecutorGetSchema, usePipelineExecutorGetSelectedEngine, usePipelineExecutorGetVideoPipelineSteps, usePipelineExecutorInferCached, usePipelineExecutorKillEngine, usePipelineExecutorListLoadedEngines, usePipelineExecutorListReferenceImages, usePipelineExecutorListTemplates, usePipelineExecutorRearmInferenceDevice, usePipelineExecutorRunAudioTest, usePipelineExecutorRunPipeline, usePipelineExecutorRunPipelineBatch, usePipelineExecutorSaveTemplate, usePipelineExecutorSetVideoPipelineSteps, usePipelineExecutorSpinEngine, usePipelineExecutorUncacheFrame, usePipelineExecutorUpdateTemplate, usePipelineExecutorValidatePipeline, usePipelineOrchestratorApplyAutoTune, usePipelineOrchestratorApplyDeviceSettingsPatch, usePipelineOrchestratorAssignAudio, usePipelineOrchestratorAssignPipeline, usePipelineOrchestratorDeleteTemplate, usePipelineOrchestratorGetAgentLoad, usePipelineOrchestratorGetAgentSettings, usePipelineOrchestratorGetAudioAssignment, usePipelineOrchestratorGetAudioAssignments, usePipelineOrchestratorGetAudioNodeLoad, usePipelineOrchestratorGetCameraMetrics, usePipelineOrchestratorGetCameraSettings, usePipelineOrchestratorGetCameraStatus, usePipelineOrchestratorGetCameraStatuses, usePipelineOrchestratorGetCameraStepOverrides, usePipelineOrchestratorGetCameraSwitches, usePipelineOrchestratorGetCapabilityBindings, usePipelineOrchestratorGetClusterModelChoice, usePipelineOrchestratorGetDeviceLiveContribution, usePipelineOrchestratorGetDeviceSettingsContribution, usePipelineOrchestratorGetEffectiveShares, usePipelineOrchestratorGetGlobalMetrics, usePipelineOrchestratorGetIngestOwner, usePipelineOrchestratorGetNodeInferenceDevices, usePipelineOrchestratorGetPipelineAssignment, usePipelineOrchestratorGetPipelineAssignments, usePipelineOrchestratorGetPipelineDevicePin, usePipelineOrchestratorGetPlacementStats, usePipelineOrchestratorGetReconcileFromDiskStatus, usePipelineOrchestratorListAgentSettings, usePipelineOrchestratorListTemplates, usePipelineOrchestratorPauseForStorageMigration, usePipelineOrchestratorPlanAutoTune, usePipelineOrchestratorRebalance, usePipelineOrchestratorReconcileFromDisk, usePipelineOrchestratorRemoveAgentSettings, usePipelineOrchestratorRequestOccupancyLook, usePipelineOrchestratorResetNodePipelineDefaults, usePipelineOrchestratorResolvePipeline, usePipelineOrchestratorResumeForStorageMigration, usePipelineOrchestratorSaveTemplate, usePipelineOrchestratorSetAgentCapabilities, usePipelineOrchestratorSetAgentDecodeLimits, usePipelineOrchestratorSetAgentInferenceDevices, usePipelineOrchestratorSetAgentMaxCameras, usePipelineOrchestratorSetAgentReachableHost, usePipelineOrchestratorSetCameraPipelineForAgent, usePipelineOrchestratorSetCameraSensors, usePipelineOrchestratorSetCameraStepOverride, usePipelineOrchestratorSetCameraStepSettings, usePipelineOrchestratorSetCameraStepToggle, usePipelineOrchestratorSetCameraSwitch, usePipelineOrchestratorSetCapabilityBinding, usePipelineOrchestratorSetLoadBalancingShares, usePipelineOrchestratorSetPipelineDevicePin, usePipelineOrchestratorSetShareSource, usePipelineOrchestratorSuggestShares, usePipelineOrchestratorUnassignAudio, usePipelineOrchestratorUnassignPipeline, usePipelineOrchestratorUpdateTemplate, usePipelineRunnerAttachCamera, usePipelineRunnerDetachCamera, usePipelineRunnerGetAllCameraMetrics, usePipelineRunnerGetCameraMetrics, usePipelineRunnerGetLocalCameras, usePipelineRunnerGetLocalLoad, usePipelineRunnerGetLocalMetrics, usePipelineRunnerGetNativeCrop, usePipelineRunnerGetParkedTrackFrame, usePipelineRunnerParkTrackFrame, usePipelineRunnerReleaseParkedTrackFrames, usePipelineRunnerReportMotion, usePipelineRunnerRequestOccupancyBurst, usePipelineRunnerRunDetailSubtree, usePipelineRunnerRunStatelessStep, usePlateGalleryAssignPlate, usePlateGalleryAssignPlates, usePlateGalleryCorrectPlateText, usePlateGalleryCreateVehicle, usePlateGalleryDeletePlate, usePlateGalleryDeleteVehicle, usePlateGalleryGetPlateByTrack, usePlateGalleryGetPlateMedia, usePlateGalleryListPlates, usePlateGalleryListVehicleSamples, usePlateGalleryListVehicles, usePlateGalleryRemoveVehicleSample, usePlateGalleryRenameVehicle, usePlateGallerySearchPlates, usePlateGallerySuggestPlateClusters, usePlateGalleryUnassignPlate, usePlateGalleryUnassignPlates, usePlayerOverlayLayer, usePlayerOverlayLayers, usePlayerToolbarButton, usePlayerToolbarButtons, usePowerMeterGetStatus, usePresenceGetStatus, usePressureSensorGetStatus, usePrivacyMaskGetOptions, usePrivacyMaskGetStatus, usePrivacyMaskSetAudioEnabled, usePrivacyMaskSetMask, usePrompt, usePtzAutotrackGetSettings, usePtzAutotrackGetStatus, usePtzAutotrackSetEnabled, usePtzAutotrackSetSettings, usePtzCaptureHomeHere, usePtzContinuousMove, usePtzDeletePreset, usePtzGetHomePreset, usePtzGetHomeReturn, usePtzGetOptions, usePtzGetPosition, usePtzGetPresets, usePtzGetStatus, usePtzGoHome, usePtzGoToPreset, usePtzMove, usePtzSavePreset, usePtzSetAutofocus, usePtzSetHomePreset, usePtzSetHomeReturn, usePtzStop, useRebootReboot, useRecordedPlayback, useRecordingArchiveApplyDeviceSettingsPatch, useRecordingArchiveCancelRelocateJob, useRecordingArchiveCancelStorageMigrationMove, useRecordingArchiveDeleteFootprint, useRecordingArchiveGetAvailabilityBatch, useRecordingArchiveGetDaysWithRecordingsBatch, useRecordingArchiveGetDeviceConfig, useRecordingArchiveGetDeviceLiveContribution, useRecordingArchiveGetDeviceSettingsContribution, useRecordingArchiveGetPlacement, useRecordingArchiveGetRelocateResidue, useRecordingArchiveGetStatus, useRecordingArchiveGetStorageMigrationMoveStatus, useRecordingArchiveGetStorageUsage, useRecordingArchiveListOpsLog, useRecordingArchiveListRelocateJobs, useRecordingArchiveLocateSegment, useRecordingArchivePauseForStorageMigration, useRecordingArchivePlanStorageRebalance, useRecordingArchivePruneFootage, useRecordingArchiveReadGopBytes, useRecordingArchiveReadSegmentBytes, useRecordingArchiveReadWindowBytes, useRecordingArchiveReconcileLedgerAgainstDisk, useRecordingArchiveRefreshStorageLocationsForMigration, useRecordingArchiveRelocateFootage, useRecordingArchiveRenderClip, useRecordingArchiveRenderGif, useRecordingArchiveRescanStorage, useRecordingArchiveResumeForStorageMigration, useRecordingArchiveSetDeviceConfig, useRecordingArchiveSetDevicePlacement, useRecordingArchiveStartStorageMigrationMove, useRecordingArchiveStartStorageRebalance, useRecordingExportCancelExport, useRecordingExportCreateExport, useRecordingExportDeleteExport, useRecordingExportGetDownloadUrl, useRecordingExportGetExport, useRecordingExportListExports, useRecordingExportReadExportBytes, useRecordingGetAvailability, useRecordingGetDaysWithRecordings, useRecordingGetPlayback, useRecordingGetPlaybackOptions, useRecordingListSources, useRecordingOnboardGetOptions, useRecordingOnboardGetStatus, useRecordingOnboardSetSettings, useRecordingSignalGetStatus, useRemoteComponent, useRoleDisplayDefaults, useSceneMonitorCaptureReference, useSceneMonitorCreateScene, useSceneMonitorDeleteReference, useSceneMonitorDeleteScene, useSceneMonitorGetStatus, useSceneMonitorListScenes, useSceneMonitorListScenesBatch, useSceneMonitorRecheckNow, useSceneMonitorResetScene, useSceneMonitorUpdateScene, useScriptRunnerGetStatus, useScriptRunnerRun, useScriptRunnerStop, useScrubController, useServerManagementApplyServerUpdate, useServerManagementCheckServerUpdate, useServerManagementGetServerPackageStatus, useServerManagementRestartServer, useServerManagementRollbackServerUpdate, useSettingsStoreAggregate, useSettingsStoreCount, useSettingsStoreDeclareCollection, useSettingsStoreDelete, useSettingsStoreDeleteWhere, useSettingsStoreGet, useSettingsStoreHistogram, useSettingsStoreInsert, useSettingsStoreInsertMany, useSettingsStoreIsEmpty, useSettingsStoreQuery, useSettingsStoreSet, useSettingsStoreUpdate, useSettingsStoreUpdateWhere, useSettingsStoreUpsert, useSmokeGetStatus, useSnapshotApplyDeviceSettingsPatch, useSnapshotGetDebugState, useSnapshotGetDeviceLiveContribution, useSnapshotGetDeviceSettingsContribution, useSnapshotGetSnapshot, useSnapshotGetSnapshotLinks, useSnapshotGetSnapshotOverview, useSnapshotGetStatus, useSnapshotInvalidateCache, useStationaryOverlay, useStorageAbortUpload, useStorageBeginDownload, useStorageBeginUpload, useStorageDelete, useStorageDeleteLocation, useStorageEndDownload, useStorageExists, useStorageFinalizeUpload, useStorageGetAvailableSpace, useStorageList, useStorageListDrainProgress, useStorageListLocationDeclarations, useStorageListLocations, useStorageListProviders, useStorageMigrationCancel, useStorageMigrationCleanupCancel, useStorageMigrationCleanupStart, useStorageMigrationCleanupStatus, useStorageMigrationDrain, useStorageMigrationHistory, useStorageMigrationMovers, useStorageMigrationPlan, useStorageMigrationResidue, useStorageMigrationStart, useStorageMigrationStatus, useStorageRead, useStorageReadChunk, useStorageResolve, useStorageTestConfig, useStorageTestLocation, useStorageUpsertLocation, useStorageWrite, useStorageWriteChunk, useStoredGroupBy, useStreamBrokerAcquireEgressTranscode, useStreamBrokerApplyDeviceSettingsPatch, useStreamBrokerAssignProfile, useStreamBrokerFetchEventMedia, useStreamBrokerForgetDeviceHardware, useStreamBrokerGetAllRtspEntries, useStreamBrokerGetBrokerStats, useStreamBrokerGetDeviceAudioMute, useStreamBrokerGetDeviceLiveContribution, useStreamBrokerGetDeviceSettingsContribution, useStreamBrokerGetPreBufferInfo, useStreamBrokerGetRtspEntry, useStreamBrokerGetRtspPort, useStreamBrokerGetStreamUrl, useStreamBrokerGetStreamWithCodec, useStreamBrokerIsRtspEnabled, useStreamBrokerKillClient, useStreamBrokerListAllCameraStreams, useStreamBrokerListAllProfileSlots, useStreamBrokerListClients, useStreamBrokerProbeStream, useStreamBrokerProduceEventMedia, useStreamBrokerPublishCameraStream, useStreamBrokerPullAudioChunks, useStreamBrokerPullFrameHandles, useStreamBrokerRegenerateRtspToken, useStreamBrokerReleaseEgressTranscode, useStreamBrokerReleaseStreamWithCodec, useStreamBrokerRenderPreBufferClip, useStreamBrokerReportStreamSignal, useStreamBrokerRestartProfile, useStreamBrokerRetractCameraStream, useStreamBrokerSetDeviceAudioMute, useStreamBrokerSetPreBufferDuration, useStreamBrokerSetRtspEnabled, useStreamBrokerSubscribeAudioChunks, useStreamBrokerSubscribeFrames, useStreamBrokerUnassignProfile, useStreamBrokerUnsubscribeAudioChunks, useStreamBrokerUnsubscribeFrames, useStreamCatalogGetCatalog, useStreamParamsGetConfigSchema, useStreamParamsGetOptions, useStreamParamsGetStatus, useStreamParamsSetProfile, useStreamSignalsListSignals, useSwitchGetStatus, useSwitchSetState, useSystem, useSystemDetectSiteLocation, useSystemFeatureFlags, useSystemForceRetentionCleanup, useSystemGetFailureContributions, useSystemGetLoadContributions, useSystemGetLoggingSettings, useSystemGetRequestCensus, useSystemGetRetentionConfig, useSystemGetSiteLocation, useSystemHealth, useSystemInfo, useSystemMutation, useSystemNetworkAddresses, useSystemQuery, useSystemSetLoggingSettings, useSystemSetRetentionConfig, useSystemSetSiteLocation, useTamperGetStatus, useTemperatureSensorGetStatus, useTerminalSessionAdoptLegacyMonitor, useTerminalSessionClose, useTerminalSessionCreateInstance, useTerminalSessionDeleteInstance, useTerminalSessionListInstances, useTerminalSessionListLegacyCameras, useTerminalSessionListProfiles, useTerminalSessionListSessions, useTerminalSessionOpenSession, useTerminalSessionPullOutput, useTerminalSessionResize, useTerminalSessionSetInstanceEnabled, useTerminalSessionUpdateInstance, useTerminalSessionWriteInput, useThemeMode, useToastOnToast, useTurnProviderGetTurnServers, useUpdateGetStatus, useUpdateInstallUpdate, useUrlQueryParam, 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, useVideoclipsDialClipStream, useVideoclipsGetClipPlayback, useVideoclipsGetPlaybackOptions, useVideoclipsListClips, useVideoclipsListSources, useVideoclipsOfferClipBytes, useVideoclipsReadClipBytes, useVodPlayback, useWaterHeaterGetStatus, useWaterHeaterSetAway, useWaterHeaterSetOperationMode, useWaterHeaterSetTargetTemp, useWeatherGetStatus, useWebrtcSessionAddIceCandidate, useWebrtcSessionApplyDownlinkProbe, useWebrtcSessionCloseSession, useWebrtcSessionCreateSession, useWebrtcSessionGetIceCandidates, useWebrtcSessionGetSessionDebug, useWebrtcSessionGetSessionState, useWebrtcSessionHandleAnswer, useWebrtcSessionHandleOffer, useWebrtcSessionHasAdaptiveBitrate, useWebrtcSessionListStreams, useWidget, useWidgetMetadata, useWidgetRegistry, useZoneAnalyticsGetCameraHistory, useZoneAnalyticsGetCurrentSnapshot, useZoneAnalyticsGetCurrentSnapshotBatch, useZoneAnalyticsGetUnzonedHistory, useZoneAnalyticsGetZoneHistory, useZoneEditing, useZoneRulesListRules, useZoneRulesSetRules, useZonesAddZone, useZonesListZones, useZonesRemoveZone, useZonesUpdateZone, vacuumStateMeta, validateScopes, valveStateMeta, variantLabel, waterHeaterPhase, waterHeaterTint, weatherConditionMeta, weatherTint, withResolvedParentDetail, withUseRootModel, writeStoredGroupBy };
60997
+ export { AddonGlobalSettingsForm, AdminLinkQuickAction, AgentStepEditor, AlarmHeroCard, AlarmInlineControl as AlarmPanelInlineControl, AppShell, ArcKnob, AudioClassificationList, AudioLevelWaveform, AudioWaveform, AutomationHeroCard, AutomationInlineControl, AutotrackSection, BTN_COMPACT, BTN_COMPACT_DANGER, BTN_COMPACT_PRIMARY, BTN_COMPACT_WARNING, BackToStepsButton, Badge, BatteryBadge, BottomSheet, Breadcrumb, BrightnessPanel, Button, ButtonControl, ButtonHeroCard, CARD_MODE_MIN_COLUMNS, CENTER, CHIP_ACTIVE, CHIP_BASE, CHIP_INACTIVE, CLASS_COLORS, COLUMN_BREAKPOINT_CLASS, COLUMN_PRIORITY, COMMIT_DEDUPE_TOLERANCE_MS, COMMIT_DEDUPE_WINDOW_MS, CONTROL_CAP_NAMES, CONTROL_FILLS, CameraStreamPlayer, Card, Checkbox, ChildSectionAccordion, ClimatePanel, CodeBlock, CollapsibleCard, ConfigFormBuilder, FormField as ConfigFormField, ConfigNotificationTargetMultiSelectFieldView, ConfigNotificationTargetSelectFieldView, 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_PICKER_GROUP_STORAGE_KEY, DEVICE_ROLE_META, DEVICE_TYPE_CONTROL, DEVICE_TYPE_META, DISPLAY_ICON_REGISTRY, DataTable, DataTableFilterBar, DetectionCanvas, DetectionOverlay, DetectionResultTree, DevShell, DeviceActivityPanel, DeviceBatchToolbar, DeviceCard, DeviceContextProvider, DeviceExportPanel, DeviceFilterBar, DeviceGrid, DeviceItem, DeviceList, DeviceMultiSelectField, DevicePicker, DeviceQuickDetailProvider, DeviceSelectField, DeviceSelectorPicker, DeviceStepMatrix, DevicesFailedLine, DevicesLoadingLine, DevicesWidenWarning, Dialog, DialogBody, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, DiscoveryPanel, DoorbellRecentPanel, Dropdown, DropdownContent, DropdownItem, DropdownTrigger, DummyHeroCard, DummyInline, EMPTY_DATA_TABLE_FILTER, EVENT_KIND_ICONS, EmptyState, EndpointResultsCard, EndpointTestCard, ErrorBox, EventKindGlyph, EventStream, ExtensionsPanel, FILL, FLEET_LIST_GC_TIME_MS, FLEET_LIST_QUERY_KEY, FLEET_LIST_STALE_TIME_MS, FanHeroCard, FanInlineControl, FanPanel, FilterBar, FloatingEventStream, FloatingLogStream, FloatingPanel, FormField$1 as FormField, GRID_GAP, GRID_PAIRED, GRID_QUICK_STATS, GateBadge, GateControl, GripTrack, GroupedModelSelector, HOST_WIDGETS, HUB_SESSION_RUN_MS, HlsVideo, HoverZoomImage, HubSessionTestCard, HumidifierHeroCard, HumidifierInlineControl, INPUT_COMPACT, INPUT_SHELL, IconAction, IconButton, IconPicker, ImageHeroCard, ImageInlineControl, ImageSelector, InferenceConfigSelector, Input, KebabMenu, KeyValueList, LIST_ROW, Label, LawnMowerHeroCard, LawnMowerInlineControl, LayeredSettingsForm, LightHeroCard, LightInlineControl, LockHeroCard, LockInlineControl, LockPanel, LogStream, LoginForm, MODE_COLOR, MaskShapeCanvas, MediaPlayerHeroCard, MediaPlayerInlineControl, MediaPlayerPanel, MobileDrawer, ModelPicker, MotionZonesSettings, NAVIGATION_DRIVE_INTERVAL_MS, NatResultCard, NavigationPanel, NetworkLinkBadge, NodeMultiSelectField, NodePicker, NodeSelectField, NotificationTargetSelectField, NotificationTargetsField, OPTION_SELECT_SEARCH_MIN_OPTIONS, OfflineBadge, OptionSelect, PHASE_CONFIG, PICKER_CHIP_LIMIT, PICKER_DEFAULT_GROUP_BY, PICKER_GROUP_BY_MODES, PICKER_GROUP_COLLAPSE_AT, PICKER_NONE_KEY, PICKER_NOUN_PLURAL, PICKER_NO_FILTERS, PICKER_PAGE_SIZE, PICKER_SEARCH_DEBOUNCE_MS, PICKER_WINDOW, PRIORITY, PTZOverlay, PageHeader, PhaseIcon, PipelineBuilder, PipelineRuntimeSelector, PipelineStep, PlaceholderChipField, PlayerOverlaysProvider, Popover, PopoverContent, PopoverRowAction, PopoverTrigger, PrimaryChildPicker, PrivacyMaskSettings, ProviderBadge, PtzPanel, QrCode, RECONNECT_POLICY, RECORDED_PLAYBACK_MODES, RIGHT, ROI_AREA_WARN_FRACTION, ROLE_DESCRIPTOR, RadialGauge, RecordedPlaybackProvider, RecordingPanel, ResponseLog, RoleDisplayDefaultsFromServer, RoleDisplayDefaultsProvider, RootModelSourceControl, RootSuppliedModelNote, RunReport, SCENE_CAPTURE_VARIANTS, SECTION_BODY, SECTION_CARD, SECTION_HEADER, SETTING_ROW, SETTING_ROW_LABEL, SETTING_ROW_STACK_BREAKPOINT, SETTING_ROW_VALUE, SETTING_ROW_VALUE_TEXT, SNAPSHOT_MEDIA_PATH, SPLIT_PANEL_OUTER, SPLIT_PANEL_SIDE, STACK_GAP, STATE_COLOR, STEP_DOCK_WIDTH_PX, SceneMonitorEditor, ScopePicker, ScriptHeroCard, ScriptInlineControl, ScrollArea, SectionCard, SegmentedChoice, Select, SelectedChip, SemanticBadge, SensorHeroCard, SensorInlineControl, SensorValueAtom, Separator, SettingRow, Sidebar, SidebarItem, Skeleton, SlideToggle, SnapshotButton, SortHeaderButton, StatCard, StateValuesStream, StatusBadge, StepDetailDock, StepInspectorPanel, StepModelRow, StepTimings, Stepper, StreamBrokerSelector, StreamDebugOverlay, StreamPanel, Switch, SwitchHeroCard, SwitchInlineControl, SwitchPanel, SystemProvider, TABLE_SCROLL_MAX_H, TEXT_FIELD_LABEL, TEXT_HINT, TEXT_METRIC, TEXT_SECTION_LABEL, TEXT_VALUE, TIMEZONES, Tabs, TabsContent, TabsList, TabsTrigger, TapToggle, ThemeProvider, ThermostatHeroCard, ThermostatInlineControl, TimezoneSelector, Tooltip, TooltipContent, TooltipTrigger, UnitPicker, VacuumHeroCard, VacuumInlineControl, ValueReadout, ValveHeroCard, ValveInlineControl, VersionBadge, VodPlaybackProvider, WaterHeaterHeroCard, WaterHeaterInlineControl, WeatherHeroCard, WeatherInlineControl, WidgetMetricCard, WidgetPanel, WidgetRegistryProvider, WidgetSlot, ZoneEditingProvider, MicOff as a, acceleratorLabel, acceleratorShortLabel, agentColumnKey, allDeviceTypeFilterOptions, applyFleetQueryDefaults, applyPickerFilters, ariaSortForColumn, badgeFor, bindsToModel, buildPeerConnectionConfig, buildStepTreeFromSchema, EyeOff as c, catalogHasDraft, childEntityId, childListName, chipOverflow, classifyAddressScope, classifyCapability, classifySessionVerdict, clearPickerGroup, cn, columnsForContext, compareSrflxMappings, containerChildToRef, countableDevices, coverHighlight, coverageLine, createSharedContext, createTheme, cursorFractionFor, darkColors, dataTableFacets, defaultOfField, defaultTheme, deriveDeviceKind, deriveWebrtcDebugStats, describeDeviceSelector, deviceIntegrationResolver, deviceListStateOf, deviceMatchesFilter, deviceOptionLabel, deviceRoleMeta, deviceRoleMetaOf, deviceTypeLabel, deviceTypeMeta, deviceTypeMetaOf, devicesToOptions, dockBox, draftFromQuery, emptyDevicesWidens, emptySessionRun, ensureMfHostInit, eventKindLabel, filterDataTableRows, filterDeviceOptions, filterOptions as filterOptionSelectOptions, filterPickerDevices, finalizeSessionRun, findTimezone, flattenPickerGrouping, flattenPickerRows, fleetViewOf, formatControlDateTime, formatLastSeen, formatNumeric, formatSettingValue, freezeVerdict, fuzzyMatch, getClassColor, getPhaseVisual, groupAgentColumns, groupChildrenByLayout, groupPickerDevices, groupPickerDevicesBy, hardwareLabel, hubOrigin, hubPath, hubUrl, hubWsUrl, humanDuration, humidifierTint, Mic as i, initialScrubState, insertAtSelection, isAbsentProvider, isDataTableFilterActive, isFieldVisible, isGroupExpanded, isValueField, Camera as l, lawnMowerActivityMeta, lightColors, loadRemoteBundle, makeScrubBridge, metadataEntries, metadataString, mirror, mountAddonPage, mountPath, Square as n, nextGridPosition, nextReconnectAction, nextSort, nextSortDirection, nextTableSort, normalizeForSearch, ImageOff as o, offListSelections, openTopLayer, optionSearchText as optionSelectSearchText, orphanDeviceLabel, overrideEntityIdFromLink, pageRows, parentDetailOf, parseIceCandidate, parsePickerGroupBy, parseRecordedServerMessage, partitionSelected as partitionOptionSelectSelected, partitionSuggested, pickerFacetFilterShown, pickerFacetKey, pickerFacetOptions, pickerFiltersActive, pickerGroupKey, pickerHiddenSelectedCount, pickerLocationKey, pickerQueryTokens, pickerRowFacts, pickerSearchText, pickerZoneFilterSuspended, pinnedStreamChoices, providerIcons, RotateCcw as r, readStoredGroupBy, reduceSessionRun, resetHubMountForTests, resetPickerFilters, resolveContainerPrimary, resolveControlAlign, resolveDeviceControl, resolveDeviceIntegration, resolveDisplayIcon, resolveEffectiveDefaultModel, resolveEffectiveStepModel, resolveEventKindIcon, resolveSearchable as resolveOptionSelectSearchable, resolveParentNames, resolvePrimaryChild, resolveSelectedDevices, resolveSensorDisplay, resolveStepDefaultModel, resolveTableLayout, roiTooLarge, rootSourceState, routerBasename, Grid2x2 as s, sameLocationSuggestions, scrubReducer, searchSteps, selectPickerGroup, selectedDeviceOptions, serializeRecordedCommand, settingsModelIdFor, shouldCommit, shouldEmit, shouldShowAddNewFooter, shouldShowUseQueryRow, shouldUseSingleNode, showsNoCamerasHint, sortRows, sortRowsByColumn, statusIcons, statusLine, stepFieldDomId, stepHasModelForFormat, stepLocalFields, stepModelOptions, stripParentNamePrefix, summarizeHubCandidates, Trash2 as t, tabForSelector, tankAlert, themeToCss, toStationaryOverlayBox, toggleDataTableFacet, togglePickerDevice, togglePickerKey, trpc, typeLabel, createLucideIcon as u, useAccessoriesGetStatus, useAccessoriesSetChildHidden, useAddonPagesListPages, useAddonSettingsGetDeviceSettings, useAddonSettingsGetGlobalSettings, useAddonSettingsGetIntegrationSettings, useAddonSettingsUpdateDeviceSettings, useAddonSettingsUpdateGlobalSettings, useAddonWidgetsListWidgets, useAddonsApplyAutoUpdateToAll, useAddonsCancelJob, useAddonsCustom, useAddonsForceRefresh, useAddonsGetAddonAutoUpdate, useAddonsGetAutoUpdateSettings, useAddonsGetJob, useAddonsGetLastRestart, useAddonsGetLogs, useAddonsGetVersions, useAddonsInstallFromWorkspace, useAddonsInstallPackage, useAddonsIsWorkspaceAvailable, useAddonsList, useAddonsListCapabilityProviders, useAddonsListFrameworkPackages, useAddonsListJobs, useAddonsListPackages, useAddonsListUpdates, useAddonsListWorkspacePackages, useAddonsOnAddonLogs, useAddonsReloadPackages, useAddonsRestartAddon, useAddonsRestartServer, useAddonsRetryLoad, useAddonsRollbackPackage, useAddonsSearchAvailable, useAddonsSetAddonAutoUpdate, useAddonsSetAutoUpdateSettings, useAddonsSetCapabilityProviderEnabled, useAddonsStartJob, useAddonsUninstallPackage, useAddonsUpdatePackage, useAirQualitySensorGetStatus, useAlarmPanelArm, useAlarmPanelDisarm, useAlarmPanelGetStatus, useAlarmPanelTrigger, useAlert, useAlertsDismiss, useAlertsEmit, useAlertsGetUnreadCount, useAlertsList, useAlertsMarkAllRead, useAlertsMarkRead, useAlertsUpdate, useAllWidgets, useAmbientLightSensorGetStatus, useAudioAnalysisApplyDeviceSettingsPatch, useAudioAnalysisGetDeviceLiveContribution, useAudioAnalysisGetDeviceSettingsContribution, useAudioAnalysisResolveDeviceSettings, useAudioAnalyzerAnalyseChunk, useAudioAnalyzerAttachDevice, useAudioAnalyzerClassify, useAudioAnalyzerDetachDevice, useAudioAnalyzerDispose, useAudioAnalyzerIsReady, useAudioAnalyzerReprobeAudioEngine, useAudioCodecCanHandle, useAudioCodecCloseSession, useAudioCodecCreateDecodeSession, useAudioCodecCreateEncodeSession, useAudioCodecFlushEncode, useAudioCodecListActiveSessions, useAudioCodecListSupportedCodecs, useAudioCodecPullEncoded, useAudioCodecPullPcm, useAudioCodecPushEncodedFrame, useAudioCodecPushPcm, useAudioMetricsGetCurrentSnapshot, useAudioMetricsGetHistory, useAutomationControlDisable, useAutomationControlEnable, useAutomationControlGetStatus, useAutomationControlTrigger, useBackupCancel, useBackupDelete, useBackupDeleteSchedule, useBackupGetEntries, useBackupList, useBackupListArchives, useBackupListDestinations, useBackupListLocations, useBackupListRuns, useBackupListSchedules, useBackupPreviewSchedule, useBackupRestore, useBackupTrigger, useBackupUpsertDestinationPolicy, useBackupUpsertSchedule, useBatteryGetStatus, useBatteryWakeForStream, useBinaryGetStatus, useBrightnessGetStatus, useBrightnessSetBrightness, useBrokerAdd, useBrokerGet, useBrokerGetBrokerConfig, useBrokerGetSettings, useBrokerGetSettingsSchema, useBrokerGetState, useBrokerGetStatus, useBrokerList, useBrokerListProviders, useBrokerPublish, useBrokerRemove, useBrokerSetSettings, useBrokerSubscribe, useBrokerTestConnection, useBrokerTestSettings, useBrokerUnsubscribe, useButtonPress, useCalendarsGetPreferences, useCalendarsListCalendars, useCalendarsListEvents, useCalendarsSetCalendarPreference, useCameraCredentialsGetCredentials, useCameraCredentialsGetStatus, useCameraGridLayoutApplyDeviceSettingsPatch, useCameraGridLayoutGetDeviceLiveContribution, useCameraGridLayoutGetDeviceSettingsContribution, useCameraGridLayoutGetLayout, useCameraGridLayoutSaveLayout, useCameraPipelineConfigApplyDeviceSettingsPatch, useCameraPipelineConfigGetDeviceLiveContribution, useCameraPipelineConfigGetDeviceSettingsContribution, useCameraStreamsGetBrokerStreams, useCameraStreamsGetCameraStreams, useCameraStreamsGetProfileRtspEntries, useCameraStreamsGetRtspEntries, useCameraStreamsPickStream, useCapabilityPresence, useCarbonMonoxideGetStatus, useClimateControlGetStatus, useClimateControlSetFanMode, useClimateControlSetMode, useClimateControlSetPreset, useClimateControlSetSwingHorizontal, useClimateControlSetSwingVertical, useClimateControlSetTarget, useClimateControlSetTargetHumidity, useClimateControlSetTargetRange, useClusterNodes, useClusterTopology, useColorGetStatus, useColorSetColor, useConfirm, useConnectionTestDescribeTest, useConnectionTestTestSettings, useConnectivityGetStatus, useConsumablesGetStatus, useConsumablesReset, useContactGetStatus, useContainerChildren, useControlGetStatus, useControlSetValue, useCoreBlocksCompile, useCoreBlocksCreate, useCoreBlocksCreateComposition, useCoreBlocksDelete, useCoreBlocksGet, useCoreBlocksGetBlockSettings, useCoreBlocksGetComposition, useCoreBlocksGetCustomization, useCoreBlocksGetTypeDefs, useCoreBlocksList, useCoreBlocksListComposableCaps, useCoreBlocksListCompositions, useCoreBlocksRestart, useCoreBlocksSetEnabled, useCoreBlocksUpdate, useCoreBlocksUpdateBlockSettings, useCoreBlocksUpdateComposition, useCoreBlocksValidateComposition, useCoverClose, useCoverGetStatus, useCoverOpen, useCoverSetPosition, useCoverSetTiltPosition, useCoverStop, useCustomFieldRenderer, useDataTableFilter, useDayNightGetOptions, useDayNightGetStatus, useDayNightSetSettings, useDebouncedString, useDecoderGetInfo, useDecoderReprobeHwaccel, useDetectionPipelineApplyDeviceSettingsPatch, useDetectionPipelineGetDeviceLiveContribution, useDetectionPipelineGetDeviceSettingsContribution, useDevShell, useDevice, useDeviceAdminLink, useDeviceAdminLinkGetAdminLink, 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, useDeviceExtensionListCandidates, useDeviceExtensionListSlots, useDeviceExtensionListSources, useDeviceExtensionSetSlot, useDeviceId, useDeviceListPageSize, useDeviceManagerAddLocation, useDeviceManagerAdoptDevice, useDeviceManagerAdoptionAdopt, useDeviceManagerAdoptionCancelJob, useDeviceManagerAdoptionListCandidateFilters, useDeviceManagerAdoptionListCandidates, useDeviceManagerAdoptionListJobs, useDeviceManagerAdoptionRefresh, useDeviceManagerAdoptionRelease, useDeviceManagerAdoptionResync, useDeviceManagerAdoptionStartJob, useDeviceManagerAllocateDeviceId, useDeviceManagerApplyInitialMeta, useDeviceManagerCreateDevice, useDeviceManagerDisable, useDeviceManagerDiscoverAllProviders, useDeviceManagerDiscoverDevices, useDeviceManagerDiscoverProvider, useDeviceManagerDiscoveryProviders, useDeviceManagerEnable, useDeviceManagerGetAllBindings, useDeviceManagerGetBindings, useDeviceManagerGetBindingsBatch, useDeviceManagerGetChildren, useDeviceManagerGetChildrenBatch, useDeviceManagerGetConfigSchema, useDeviceManagerGetCreationSchema, useDeviceManagerGetDevice, useDeviceManagerGetDeviceAggregate, useDeviceManagerGetDeviceLiveInfoAggregate, useDeviceManagerGetDeviceSettingsAggregate, useDeviceManagerGetDeviceStatusAggregate, useDeviceManagerGetDeviceStatusAggregateBatch, useDeviceManagerGetLinkedDevices, useDeviceManagerGetLinkedDevicesBatch, useDeviceManagerGetRoleDisplayDefaults, useDeviceManagerGetSettingsSchema, useDeviceManagerGetStreamProfileMap, useDeviceManagerGetStreamSources, useDeviceManagerGetWireableFields, useDeviceManagerGetWrapperActivation, useDeviceManagerListAll, useDeviceManagerListBindableCapsForDeviceType, useDeviceManagerListDeviceIdsByCaps, useDeviceManagerListLocationDescriptions, useDeviceManagerListLocationIcons, useDeviceManagerListLocations, useDeviceManagerListPersistedByAddon, useDeviceManagerListSiteZones, useDeviceManagerListWrappersForCap, useDeviceManagerLoadConfig, useDeviceManagerLoadMeta, useDeviceManagerLoadRuntimeState, useDeviceManagerMigrateDevice, useDeviceManagerPersistConfig, useDeviceManagerProbeStreams, useDeviceManagerProviderCreationType, useDeviceManagerProviderDiscoveryParamsSchema, useDeviceManagerRegisterDevice, useDeviceManagerRemove, useDeviceManagerRemoveByIntegration, useDeviceManagerRemoveDevice, useDeviceManagerRemoveLocation, useDeviceManagerRemoveSiteZone, useDeviceManagerRenameLocation, useDeviceManagerRenameSiteZone, useDeviceManagerRunDeviceAction, useDeviceManagerSetChildLayout, useDeviceManagerSetDisabled, useDeviceManagerSetDisplay, useDeviceManagerSetIntegrationId, useDeviceManagerSetLinkDeviceId, useDeviceManagerSetLocation, useDeviceManagerSetLocationDescription, useDeviceManagerSetLocationIcon, useDeviceManagerSetLocationZone, useDeviceManagerSetMetadata, useDeviceManagerSetName, useDeviceManagerSetPrimaryChildEntityId, useDeviceManagerSetRole, useDeviceManagerSetRoleDisplayDefaults, useDeviceManagerSetSiteZone, useDeviceManagerSetStreamProfileMap, useDeviceManagerSetType, useDeviceManagerSetWrapperActive, useDeviceManagerTestCreationField, useDeviceManagerTestField, useDeviceManagerUpdateConfig, useDeviceManagerUpdateDeviceField, useDeviceManagerUpdateDeviceFieldsBatch, useDeviceNetworkLink, useDeviceOpsGetConfigEntries, useDeviceOpsGetRawState, useDeviceOpsGetSettingsSchema, useDeviceOpsGetStreamSources, useDeviceOpsRemoveDevice, useDeviceOpsRunAction, useDeviceOpsSetConfig, useDeviceProviderAdoptDiscoveredDevice, useDeviceProviderCreateDevice, useDeviceProviderDiscoverDevices, useDeviceProviderGetChildCreationSchema, useDeviceProviderGetDevices, useDeviceProviderGetDiscoveryParamsSchema, useDeviceProviderGetManualCreationType, useDeviceProviderGetStatus, useDeviceProviderReloadDevice, useDeviceProviderStart, useDeviceProviderStop, useDeviceProviderSupportsDiscovery, useDeviceProviderSupportsManualCreation, useDeviceProviderTestCreationField, useDeviceProxy, useDeviceQuickDetailOpen, useDeviceSnapshot, useDeviceSnapshotImage, useDeviceState, useDeviceStateClaimFields, useDeviceStateGetAllSnapshots, useDeviceStateGetCapSlice, useDeviceStateGetNativeCapSlice, useDeviceStateGetSnapshot, useDeviceStateListClaims, useDeviceStatePatchOwnedFields, useDeviceStateReleaseClaim, useDeviceStateSetCapSlice, useDeviceStateSlice, useDeviceStatusGetStatus, useDeviceWebrtc, useDevices, useDoorbellEvents, useDoorbellGetStatus, useEnumSensorGetStatus, useEventEmitterGetStatus, useEventInvalidation, useEventStreamLatest, useEventStreamMap, useFaceGalleryAssignFace, useFaceGalleryAssignFaces, useFaceGalleryAuditIdentitySamples, useFaceGalleryCreateIdentity, useFaceGalleryDeleteFace, useFaceGalleryDeleteIdentity, useFaceGalleryGetFaceByTrack, useFaceGalleryGetFaceMedia, useFaceGalleryListIdentities, useFaceGalleryListIdentitySamples, useFaceGalleryListRecentFaces, useFaceGalleryRemoveSample, useFaceGalleryRenameIdentity, useFaceGallerySuggestFaceClusters, useFaceGalleryUnassignFace, useFaceGalleryUnassignFaces, useFanControlGetStatus, useFanControlSetDirection, useFanControlSetOscillating, useFanControlSetPercentage, useFanControlSetPreset, useFeatureProbeGetStatus, useFloodGetStatus, useGasGetStatus, useHumidifierGetStatus, useHumidifierSetMode, useHumidifierSetOn, useHumidifierSetTargetHumidity, useHumiditySensorGetStatus, useImageGetStatus, useImageSettingsGetOptions, useImageSettingsGetStatus, useImageSettingsSetSettings, useIntegrationsCreate, useIntegrationsDelete, useIntegrationsGet, useIntegrationsGetAvailableTypes, useIntegrationsGetByAddonId, useIntegrationsGetSettings, useIntegrationsList, useIntegrationsSetSettings, useIntegrationsTestConnection, useIntegrationsUpdate, useIntercomEndTalkSession, useIntercomGetStatus, useIntercomHandleAnswer, useIntercomPushTalkAudio, useIntercomStartSession, useIntercomStartTalkSession, useIntercomStopSession, useIsMidWidth, useIsMobile, useLawnMowerControlDock, useLawnMowerControlGetStatus, useLawnMowerControlPause, useLawnMowerControlStartMowing, useLiveBuffer, useLiveEvent, useLlmCancel, useLlmDeleteModel, useLlmDeleteProfile, useLlmGenerate, useLlmGenerateVision, useLlmGetDefaults, useLlmGetRuntimeStatus, useLlmGetUsage, useLlmInstallModel, useLlmListModelCatalog, useLlmListModels, useLlmListNodeModels, useLlmListProfileKinds, useLlmListProfiles, useLlmListRuntimeNodes, useLlmResolveModelRef, useLlmSetDefault, useLlmStartRuntime, useLlmStopRuntime, useLlmTestProfile, useLlmUpsertProfile, useLocalNetworkAddCustomAddress, useLocalNetworkDownloadCa, useLocalNetworkGetAddresses, useLocalNetworkGetAllowedAddresses, useLocalNetworkGetConnectionEndpoints, useLocalNetworkGetHubAddresses, useLocalNetworkGetNotificationEndpoint, useLocalNetworkGetPreferred, useLocalNetworkGetTlsStatus, useLocalNetworkGetViewerEndpoints, useLocalNetworkList, useLocalNetworkRegenerateCertificate, useLocalNetworkRemoveCustomAddress, useLocalNetworkResetAllowlistToBestMatch, useLocalNetworkRevertToGeneratedCertificate, useLocalNetworkSetAddressRole, useLocalNetworkSetAllowedAddresses, useLocalNetworkSetNotificationEndpoint, useLocalNetworkSetViewerEndpoints, useLocalNetworkUploadCertificate, useLockControlGetStatus, useLockControlLock, useLockControlOpen, useLockControlUnlock, useMediaPlayerGetStatus, useMediaPlayerNext, useMediaPlayerPause, useMediaPlayerPlay, useMediaPlayerPlayMedia, useMediaPlayerPrevious, useMediaPlayerSeek, useMediaPlayerSelectSource, useMediaPlayerSetMute, useMediaPlayerSetRepeat, useMediaPlayerSetShuffle, useMediaPlayerSetVolume, useMediaPlayerStop, useMeshNetworkGetStatus, useMeshNetworkJoin, useMeshNetworkLeave, useMeshNetworkListPeers, useMeshNetworkLogout, useMeshNetworkStartLogin, useMeshNetworkTestConnection, useMetricsProviderCollectSnapshot, useMetricsProviderGetAddonStats, useMetricsProviderGetCached, useMetricsProviderGetCpuTemperature, useMetricsProviderGetCurrent, useMetricsProviderGetDiskSpace, useMetricsProviderGetGpuInfo, useMetricsProviderGetLoadSeries, useMetricsProviderGetProcessStats, useMetricsProviderListAddonInstances, useMetricsProviderListNodeProcesses, useMotionDetectionAnalyze, useMotionDetectionApplyDeviceSettingsPatch, useMotionDetectionGetDeviceLiveContribution, useMotionDetectionGetDeviceSettingsContribution, useMotionDetectionRemoveCamera, useMotionDetectionReset, useMotionGetStatus, useMotionIsDetected, useMotionTriggerGetStatus, useMotionTriggerSetMotionTrigger, useMotionZonesGetOptions, useMotionZonesGetStatus, useMotionZonesSetZone, useMqttBrokerAddBroker, useMqttBrokerGetBrokerConfig, useMqttBrokerGetStatus, useMqttBrokerListBrokers, useMqttBrokerRemoveBroker, useMqttBrokerStartEmbeddedBroker, useMqttBrokerStopEmbeddedBroker, useMqttBrokerTestConnection, useNativeObjectDetectionGetOptions, useNativeObjectDetectionGetStatus, useNativeObjectDetectionSetEnabled, useNativeObjectDetectionSetSettings, useNavigation, useNavigationGetFeatures, useNavigationGetStatus, useNavigationGoToPoint, useNavigationListActions, useNavigationMove, useNavigationPlaySound, useNavigationRunAction, useNavigationSetLightLevel, useNavigationSetLightMode, useNavigationSetLightOn, useNavigationStop, useNetworkAccessGetEndpoint, useNetworkAccessGetStatus, useNetworkAccessListEndpoints, useNetworkAccessStart, useNetworkAccessStop, useNetworkLinkGetStatus, useNetworkQualityGetAllStats, useNetworkQualityGetDeviceStats, useNetworkQualityReportClientStats, useNodesClusterAddonStatus, useNodesDeployAddon, useNodesDirectory, useNodesExecuteQuery, useNodesGetCapUsageGraph, useNodesGetNodeAddons, useNodesRenameNode, useNodesRestartAddon, useNodesRestartNode, useNodesRestartProcess, useNodesSetProcessLogLevel, useNodesShutdownNode, useNodesTopology, useNodesUndeployAddon, useNotificationOutputDeleteTarget, useNotificationOutputDiscoverTargets, useNotificationOutputGetTarget, useNotificationOutputListTargetKinds, useNotificationOutputListTargets, useNotificationOutputProbeTargetConfig, useNotificationOutputSend, useNotificationOutputSetTargetEnabled, useNotificationOutputTestTarget, useNotificationOutputUpsertTarget, useNotificationRulesActivateAlarmProfile, useNotificationRulesCancelSnooze, useNotificationRulesCreateAlarmProfile, useNotificationRulesCreateRule, useNotificationRulesCreateSequence, useNotificationRulesCreateSnooze, useNotificationRulesDeleteAlarmProfile, useNotificationRulesDeleteRule, useNotificationRulesDeleteSequence, useNotificationRulesGetAlarmConfig, useNotificationRulesGetAlarmSensors, useNotificationRulesGetClipRetentionAsks, useNotificationRulesGetConditionCatalog, useNotificationRulesGetHistory, useNotificationRulesGetRule, useNotificationRulesGetRuleLastRuns, useNotificationRulesGetSequence, useNotificationRulesGetTemplateCatalog, useNotificationRulesListDeviceMutes, useNotificationRulesListRules, useNotificationRulesListSequences, useNotificationRulesListSnoozes, useNotificationRulesPreviewStateSummary, useNotificationRulesPreviewTemplate, useNotificationRulesRenameAlarmProfile, useNotificationRulesResolveArtifactUrl, useNotificationRulesSetAlarmConfig, useNotificationRulesSetDeviceMuted, useNotificationRulesSetRuleEnabled, useNotificationRulesTestRule, useNotificationRulesUpdateRule, useNotificationRulesUpdateSequence, useNotifierCancel, useNotifierGetStatus, useNotifierSend, useNumericSensorGetStatus, useOptimisticSlice, useOptionalSystem, useOptionalWidgetRegistry, useOsdGetStatus, useOsdManagerClearSlotBinding, useOsdManagerCopyDeviceConfiguration, useOsdManagerDeleteTemplate, useOsdManagerGetConditionSupport, useOsdManagerGetDeviceOsd, useOsdManagerGetSourceCatalog, useOsdManagerListTemplates, useOsdManagerPreviewSlot, useOsdManagerRenderDevice, useOsdManagerSetSlotBinding, useOsdManagerUpsertTemplate, useOsdSetOverlay, usePTZ, usePetFeederCallPet, usePetFeederCancelFeed, usePetFeederFeed, usePetFeederGetStatus, usePetFeederMarkFoodReplenished, usePetFeederPlaySound, usePetFeederResetDesiccant, usePetFeederSetChildLock, usePetFeederSetFeedSound, usePetFeederSetIndicatorLight, usePetFeederSetVolume, usePickerSiteZones, usePipelineAnalyticsApplyDeviceSettingsPatch, usePipelineAnalyticsCancelRelocateMedia, usePipelineAnalyticsCancelStorageMigrationMove, usePipelineAnalyticsClearTrackRelation, usePipelineAnalyticsClearTracks, usePipelineAnalyticsCompleteRetrainTrack, usePipelineAnalyticsCountRelocatableMedia, usePipelineAnalyticsCountUnstampedEventMedia, usePipelineAnalyticsDeleteDeviceEvents, usePipelineAnalyticsDeleteTracks, usePipelineAnalyticsDeselectRetrainFrame, usePipelineAnalyticsGetActiveTracks, usePipelineAnalyticsGetAudioEvents, usePipelineAnalyticsGetDeviceLiveContribution, usePipelineAnalyticsGetDeviceSettingsContribution, usePipelineAnalyticsGetEventDensity, usePipelineAnalyticsGetEventDensityBatch, usePipelineAnalyticsGetEventMedia, usePipelineAnalyticsGetEventMediaFootprintByKind, usePipelineAnalyticsGetEventStoreFootprint, usePipelineAnalyticsGetKeyEvents, usePipelineAnalyticsGetKeyEventsBatch, usePipelineAnalyticsGetMediaReclaimStatus, usePipelineAnalyticsGetMotionEvents, usePipelineAnalyticsGetObjectEmbeddingRebuildStatus, usePipelineAnalyticsGetObjectEvents, usePipelineAnalyticsGetRetrainExportUrl, usePipelineAnalyticsGetRetrainFrameImage, usePipelineAnalyticsGetSensorEvents, usePipelineAnalyticsGetStorageMigrationMoveStatus, usePipelineAnalyticsGetTrack, usePipelineAnalyticsGetTrackMedia, usePipelineAnalyticsGetTrainingExportSummary, usePipelineAnalyticsGetTrainingExportUrl, usePipelineAnalyticsListArchivedDebugNotes, usePipelineAnalyticsListBirthDecisions, usePipelineAnalyticsListEventKinds, usePipelineAnalyticsListEventKindsBatch, usePipelineAnalyticsListEventMedia, usePipelineAnalyticsListOpsLog, usePipelineAnalyticsListRecentTracks, usePipelineAnalyticsListRelocateMediaJobs, usePipelineAnalyticsListRetrainAnnotations, usePipelineAnalyticsListRetrainFrames, usePipelineAnalyticsListRetrainStaging, usePipelineAnalyticsListTrackMedia, usePipelineAnalyticsListTrackRelations, usePipelineAnalyticsListTracks, usePipelineAnalyticsOwnersWithMedia, usePipelineAnalyticsPauseForStorageMigration, usePipelineAnalyticsProposeRetrainAnnotations, usePipelineAnalyticsPruneEvents, usePipelineAnalyticsPruneEventsBefore, usePipelineAnalyticsPruneTracksBefore, usePipelineAnalyticsReadLongTermSeries, usePipelineAnalyticsRebuildObjectEmbeddings, usePipelineAnalyticsReclaimDebugMedia, usePipelineAnalyticsReconcileFromDisk, usePipelineAnalyticsRefreshStorageLocationsForMigration, usePipelineAnalyticsRelocateMedia, usePipelineAnalyticsRestageRetrainTrack, usePipelineAnalyticsResumeForStorageMigration, usePipelineAnalyticsSaveRetrainAnnotations, usePipelineAnalyticsSearchObjectEvents, usePipelineAnalyticsSelectRetrainFrames, usePipelineAnalyticsSetTrackFlags, usePipelineAnalyticsSetTrackPurity, usePipelineAnalyticsSetTrackRelation, usePipelineAnalyticsStartStorageMigrationMove, usePipelineAnalyticsWipeAllAnalytics, usePipelineAnalyticsWipeObjectEmbeddings, usePipelineExecutorCacheFrameInPool, usePipelineExecutorClearDeviceOverrides, usePipelineExecutorClearModelBoundDeviceOverrides, usePipelineExecutorDeleteModel, usePipelineExecutorDownloadModel, usePipelineExecutorGetAddonModels, usePipelineExecutorGetAudioCapabilities, usePipelineExecutorGetAvailableEngines, usePipelineExecutorGetCapabilities, usePipelineExecutorGetDefaultSteps, usePipelineExecutorGetDetectionConfigSchema, usePipelineExecutorGetEffectiveTuning, usePipelineExecutorGetEngineProvisioning, usePipelineExecutorGetGlobalPipelineConfig, usePipelineExecutorGetGlobalSteps, usePipelineExecutorGetInferenceDeviceHealth, usePipelineExecutorGetOrchestratorConfigSchema, usePipelineExecutorGetReferenceAudio, usePipelineExecutorGetReferenceAudioFiles, usePipelineExecutorGetReferenceImage, usePipelineExecutorGetSchema, usePipelineExecutorGetSelectedEngine, usePipelineExecutorGetVideoPipelineSteps, usePipelineExecutorInferCached, usePipelineExecutorKillEngine, usePipelineExecutorListLoadedEngines, usePipelineExecutorListReferenceImages, usePipelineExecutorRearmInferenceDevice, usePipelineExecutorRunAudioTest, usePipelineExecutorRunPipeline, usePipelineExecutorRunPipelineBatch, usePipelineExecutorSetVideoPipelineSteps, usePipelineExecutorSpinEngine, usePipelineExecutorUncacheFrame, usePipelineExecutorValidatePipeline, usePipelineOrchestratorApplyAutoTune, usePipelineOrchestratorApplyDeviceSettingsPatch, usePipelineOrchestratorAssignAudio, usePipelineOrchestratorAssignPipeline, usePipelineOrchestratorGetAgentLoad, usePipelineOrchestratorGetAgentSettings, usePipelineOrchestratorGetAudioAssignment, usePipelineOrchestratorGetAudioAssignments, usePipelineOrchestratorGetAudioNodeLoad, usePipelineOrchestratorGetCameraMetrics, usePipelineOrchestratorGetCameraSettings, usePipelineOrchestratorGetCameraStatus, usePipelineOrchestratorGetCameraStatuses, usePipelineOrchestratorGetCameraStepOverrides, usePipelineOrchestratorGetCameraSwitches, usePipelineOrchestratorGetCapabilityBindings, usePipelineOrchestratorGetClusterModelChoice, usePipelineOrchestratorGetDeviceLiveContribution, usePipelineOrchestratorGetDeviceSettingsContribution, usePipelineOrchestratorGetEffectiveShares, usePipelineOrchestratorGetGlobalMetrics, usePipelineOrchestratorGetIngestOwner, usePipelineOrchestratorGetNodeInferenceDevices, usePipelineOrchestratorGetPipelineAssignment, usePipelineOrchestratorGetPipelineAssignments, usePipelineOrchestratorGetPipelineDevicePin, usePipelineOrchestratorGetPlacementStats, usePipelineOrchestratorGetReconcileFromDiskStatus, usePipelineOrchestratorListAgentSettings, usePipelineOrchestratorPauseForStorageMigration, usePipelineOrchestratorPlanAutoTune, usePipelineOrchestratorRebalance, usePipelineOrchestratorReconcileFromDisk, usePipelineOrchestratorRemoveAgentSettings, usePipelineOrchestratorRequestOccupancyLook, usePipelineOrchestratorResetNodePipelineDefaults, usePipelineOrchestratorResolvePipeline, usePipelineOrchestratorResumeForStorageMigration, usePipelineOrchestratorSetAgentCapabilities, usePipelineOrchestratorSetAgentDecodeLimits, usePipelineOrchestratorSetAgentInferenceDevices, usePipelineOrchestratorSetAgentMaxCameras, usePipelineOrchestratorSetAgentReachableHost, usePipelineOrchestratorSetCameraPipelineForAgent, usePipelineOrchestratorSetCameraSensors, usePipelineOrchestratorSetCameraStepOverride, usePipelineOrchestratorSetCameraStepSettings, usePipelineOrchestratorSetCameraStepToggle, usePipelineOrchestratorSetCameraSwitch, usePipelineOrchestratorSetCapabilityBinding, usePipelineOrchestratorSetLoadBalancingShares, usePipelineOrchestratorSetPipelineDevicePin, usePipelineOrchestratorSetShareSource, usePipelineOrchestratorSuggestShares, usePipelineOrchestratorUnassignAudio, usePipelineOrchestratorUnassignPipeline, usePipelineRunnerAttachCamera, usePipelineRunnerDetachCamera, usePipelineRunnerGetAllCameraMetrics, usePipelineRunnerGetCameraMetrics, usePipelineRunnerGetLocalCameras, usePipelineRunnerGetLocalLoad, usePipelineRunnerGetLocalMetrics, usePipelineRunnerGetNativeCrop, usePipelineRunnerGetParkedTrackFrame, usePipelineRunnerParkTrackFrame, usePipelineRunnerReleaseParkedTrackFrames, usePipelineRunnerReportMotion, usePipelineRunnerRequestOccupancyBurst, usePipelineRunnerRunDetailSubtree, usePipelineRunnerRunStatelessStep, usePlateGalleryAssignPlate, usePlateGalleryAssignPlates, usePlateGalleryCorrectPlateText, usePlateGalleryCreateVehicle, usePlateGalleryDeletePlate, usePlateGalleryDeleteVehicle, usePlateGalleryGetPlateByTrack, usePlateGalleryGetPlateMedia, usePlateGalleryListPlates, usePlateGalleryListVehicleSamples, usePlateGalleryListVehicles, usePlateGalleryRemoveVehicleSample, usePlateGalleryRenameVehicle, usePlateGallerySearchPlates, usePlateGallerySuggestPlateClusters, usePlateGalleryUnassignPlate, usePlateGalleryUnassignPlates, usePlayerOverlayLayer, usePlayerOverlayLayers, usePlayerToolbarButton, usePlayerToolbarButtons, usePowerMeterGetStatus, usePresenceGetStatus, usePressureSensorGetStatus, usePrivacyMaskGetOptions, usePrivacyMaskGetStatus, usePrivacyMaskSetAudioEnabled, usePrivacyMaskSetMask, usePrompt, usePtzAutotrackGetSettings, usePtzAutotrackGetStatus, usePtzAutotrackSetEnabled, usePtzAutotrackSetSettings, usePtzCaptureHomeHere, usePtzContinuousMove, usePtzDeletePreset, usePtzGetHomePreset, usePtzGetHomeReturn, usePtzGetOptions, usePtzGetPosition, usePtzGetPresets, usePtzGetStatus, usePtzGoHome, usePtzGoToPreset, usePtzMove, usePtzSavePreset, usePtzSetAutofocus, usePtzSetHomePreset, usePtzSetHomeReturn, usePtzStop, useRebootReboot, useRecordedPlayback, useRecordingArchiveApplyDeviceSettingsPatch, useRecordingArchiveCancelRelocateJob, useRecordingArchiveCancelStorageMigrationMove, useRecordingArchiveDeleteFootprint, useRecordingArchiveGetAvailabilityBatch, useRecordingArchiveGetDaysWithRecordingsBatch, useRecordingArchiveGetDeviceConfig, useRecordingArchiveGetDeviceLiveContribution, useRecordingArchiveGetDeviceSettingsContribution, useRecordingArchiveGetPlacement, useRecordingArchiveGetRelocateResidue, useRecordingArchiveGetStatus, useRecordingArchiveGetStorageMigrationMoveStatus, useRecordingArchiveGetStorageUsage, useRecordingArchiveListOpsLog, useRecordingArchiveListRelocateJobs, useRecordingArchiveLocateSegment, useRecordingArchivePauseForStorageMigration, useRecordingArchivePlanStorageRebalance, useRecordingArchivePruneFootage, useRecordingArchiveReadGopBytes, useRecordingArchiveReadSegmentBytes, useRecordingArchiveReadWindowBytes, useRecordingArchiveReconcileLedgerAgainstDisk, useRecordingArchiveRefreshStorageLocationsForMigration, useRecordingArchiveRelocateFootage, useRecordingArchiveRenderClip, useRecordingArchiveRenderGif, useRecordingArchiveRescanStorage, useRecordingArchiveResumeForStorageMigration, useRecordingArchiveSetDeviceConfig, useRecordingArchiveSetDevicePlacement, useRecordingArchiveStartStorageMigrationMove, useRecordingArchiveStartStorageRebalance, useRecordingExportCancelExport, useRecordingExportCreateExport, useRecordingExportDeleteExport, useRecordingExportGetDownloadUrl, useRecordingExportGetExport, useRecordingExportListExports, useRecordingExportReadExportBytes, useRecordingGetAvailability, useRecordingGetDaysWithRecordings, useRecordingGetPlayback, useRecordingGetPlaybackOptions, useRecordingListSources, useRecordingOnboardGetOptions, useRecordingOnboardGetStatus, useRecordingOnboardSetSettings, useRecordingSignalGetStatus, useRemoteComponent, useRoleDisplayDefaults, useSceneMonitorCaptureReference, useSceneMonitorCreateScene, useSceneMonitorDeleteReference, useSceneMonitorDeleteScene, useSceneMonitorGetStatus, useSceneMonitorListScenes, useSceneMonitorListScenesBatch, useSceneMonitorRecheckNow, useSceneMonitorResetScene, useSceneMonitorUpdateScene, useScriptRunnerGetStatus, useScriptRunnerRun, useScriptRunnerStop, useScrubController, useServerManagementApplyServerUpdate, useServerManagementCheckServerUpdate, useServerManagementGetServerPackageStatus, useServerManagementRestartServer, useServerManagementRollbackServerUpdate, useSettingsStoreAggregate, useSettingsStoreCount, useSettingsStoreDeclareCollection, useSettingsStoreDelete, useSettingsStoreDeleteWhere, useSettingsStoreGet, useSettingsStoreHistogram, useSettingsStoreInsert, useSettingsStoreInsertMany, useSettingsStoreIsEmpty, useSettingsStoreQuery, useSettingsStoreSet, useSettingsStoreUpdate, useSettingsStoreUpdateWhere, useSettingsStoreUpsert, useSmokeGetStatus, useSnapshotApplyDeviceSettingsPatch, useSnapshotGetDebugState, useSnapshotGetDeviceLiveContribution, useSnapshotGetDeviceSettingsContribution, useSnapshotGetSnapshot, useSnapshotGetSnapshotLinks, useSnapshotGetSnapshotOverview, useSnapshotGetStatus, useSnapshotInvalidateCache, useStationaryOverlay, useStorageAbortUpload, useStorageBeginDownload, useStorageBeginUpload, useStorageDelete, useStorageDeleteLocation, useStorageEndDownload, useStorageExists, useStorageFinalizeUpload, useStorageGetAvailableSpace, useStorageList, useStorageListDrainProgress, useStorageListLocationDeclarations, useStorageListLocations, useStorageListProviders, useStorageMigrationCancel, useStorageMigrationCleanupCancel, useStorageMigrationCleanupStart, useStorageMigrationCleanupStatus, useStorageMigrationDrain, useStorageMigrationHistory, useStorageMigrationMovers, useStorageMigrationPlan, useStorageMigrationResidue, useStorageMigrationStart, useStorageMigrationStatus, useStorageRead, useStorageReadChunk, useStorageResolve, useStorageTestConfig, useStorageTestLocation, useStorageUpsertLocation, useStorageWrite, useStorageWriteChunk, useStoredGroupBy, useStreamBrokerAcquireEgressTranscode, useStreamBrokerApplyDeviceSettingsPatch, useStreamBrokerAssignProfile, useStreamBrokerFetchEventMedia, useStreamBrokerForgetDeviceHardware, useStreamBrokerGetAllRtspEntries, useStreamBrokerGetBrokerStats, useStreamBrokerGetDeviceAudioMute, useStreamBrokerGetDeviceLiveContribution, useStreamBrokerGetDeviceSettingsContribution, useStreamBrokerGetPreBufferInfo, useStreamBrokerGetRtspEntry, useStreamBrokerGetRtspPort, useStreamBrokerGetStreamUrl, useStreamBrokerGetStreamWithCodec, useStreamBrokerIsRtspEnabled, useStreamBrokerKillClient, useStreamBrokerListAllCameraStreams, useStreamBrokerListAllProfileSlots, useStreamBrokerListClients, useStreamBrokerProbeStream, useStreamBrokerProduceEventMedia, useStreamBrokerPublishCameraStream, useStreamBrokerPullAudioChunks, useStreamBrokerRegenerateRtspToken, useStreamBrokerReleaseEgressTranscode, useStreamBrokerReleaseStreamWithCodec, useStreamBrokerRenderPreBufferClip, useStreamBrokerReportStreamSignal, useStreamBrokerRestartProfile, useStreamBrokerRetractCameraStream, useStreamBrokerSetDeviceAudioMute, useStreamBrokerSetPreBufferDuration, useStreamBrokerSetRtspEnabled, useStreamBrokerSubscribeAudioChunks, useStreamBrokerUnassignProfile, useStreamBrokerUnsubscribeAudioChunks, useStreamCatalogGetCatalog, useStreamParamsGetConfigSchema, useStreamParamsGetOptions, useStreamParamsGetStatus, useStreamParamsSetProfile, useStreamSignalsListSignals, useSwitchGetStatus, useSwitchSetState, useSystem, useSystemDetectSiteLocation, useSystemFeatureFlags, useSystemForceRetentionCleanup, useSystemGetFailureContributions, useSystemGetLoadContributions, useSystemGetLoggingSettings, useSystemGetRequestCensus, useSystemGetRetentionConfig, useSystemGetSiteLocation, useSystemHealth, useSystemInfo, useSystemMutation, useSystemNetworkAddresses, useSystemQuery, useSystemSetLoggingSettings, useSystemSetRetentionConfig, useSystemSetSiteLocation, useTamperGetStatus, useTemperatureSensorGetStatus, useTerminalSessionAdoptLegacyMonitor, useTerminalSessionClose, useTerminalSessionCreateInstance, useTerminalSessionDeleteInstance, useTerminalSessionListInstances, useTerminalSessionListLegacyCameras, useTerminalSessionListProfiles, useTerminalSessionListSessions, useTerminalSessionOpenSession, useTerminalSessionPullOutput, useTerminalSessionResize, useTerminalSessionSetInstanceEnabled, useTerminalSessionUpdateInstance, useTerminalSessionWriteInput, useThemeMode, useToastOnToast, useTurnProviderGetTurnServers, useUpdateGetStatus, useUpdateInstallUpdate, useUrlQueryParam, 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, useVideoclipsDialClipStream, useVideoclipsGetClipPlayback, useVideoclipsGetPlaybackOptions, useVideoclipsListClips, useVideoclipsListSources, useVideoclipsOfferClipBytes, useVideoclipsReadClipBytes, useVodPlayback, useWaterHeaterGetStatus, useWaterHeaterSetAway, useWaterHeaterSetOperationMode, useWaterHeaterSetTargetTemp, useWeatherGetStatus, useWebrtcSessionAddIceCandidate, useWebrtcSessionApplyDownlinkProbe, useWebrtcSessionCloseSession, useWebrtcSessionCreateSession, useWebrtcSessionGetIceCandidates, useWebrtcSessionGetSessionDebug, useWebrtcSessionGetSessionState, useWebrtcSessionHandleAnswer, useWebrtcSessionHandleOffer, useWebrtcSessionHasAdaptiveBitrate, useWebrtcSessionListStreams, useWidget, useWidgetMetadata, useWidgetRegistry, useZoneAnalyticsGetCameraHistory, useZoneAnalyticsGetCurrentSnapshot, useZoneAnalyticsGetCurrentSnapshotBatch, useZoneAnalyticsGetUnzonedHistory, useZoneAnalyticsGetZoneHistory, useZoneEditing, useZoneRulesListRules, useZoneRulesSetRules, useZonesAddZone, useZonesListZones, useZonesRemoveZone, useZonesUpdateZone, vacuumStateMeta, validateScopes, valveStateMeta, variantLabel, waterHeaterPhase, waterHeaterTint, weatherConditionMeta, weatherTint, withResolvedParentDetail, withUseRootModel, writeStoredGroupBy };