@camstack/ui-library 1.1.45 → 1.1.76

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
@@ -3751,7 +3751,6 @@ function mirror(input) {
3751
3751
  }
3752
3752
  }
3753
3753
  const patch = {
3754
- enabled: srcCfg.enabled,
3755
3754
  ...chosenModelId ? { modelId: chosenModelId } : {},
3756
3755
  settings: dropModelSpecific(srcCfg.settings, targetAddon)
3757
3756
  };
@@ -13850,6 +13849,228 @@ function buildStepTreeFromSchema(schema) {
13850
13849
  return [...roots, ...audioRoots];
13851
13850
  }
13852
13851
  //#endregion
13852
+ //#region src/composites/grouped-model-selector.tsx
13853
+ /**
13854
+ * GroupedModelSelector — the shared Family → Tier → Variant model picker.
13855
+ *
13856
+ * The catalog is a FLAT list of models (ids like `yolo26s`, `yolo26s-int8`);
13857
+ * this folds it into a `family → tier → variant` tree (see
13858
+ * `buildModelVariantGroups` in `@camstack/types`) so the operator picks
13859
+ * "YOLO26 → Small → Int8" instead of scanning a flat dropdown of every
13860
+ * size×quantization. The selected value stays the flat model id.
13861
+ *
13862
+ * Parameterised on the minimal `ModelVariantSource` shape so BOTH the config-UI
13863
+ * catalog (`ModelCatalogEntry`) and the pipeline/device steppers
13864
+ * (`PipelineModelOption`) drive the same component. Legacy / ungrouped models
13865
+ * never appear here (the grouping helpers skip them).
13866
+ */
13867
+ function Chip({ active, onClick, disabled, children, title }) {
13868
+ return /* @__PURE__ */ jsx("button", {
13869
+ type: "button",
13870
+ onClick,
13871
+ disabled,
13872
+ title,
13873
+ className: cn("rounded-full px-3 py-1 text-[11px] font-medium border transition-colors", active ? "border-primary bg-primary/10 text-primary" : "border-border bg-background text-foreground-subtle hover:text-foreground hover:border-foreground-subtle/40", disabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer"),
13874
+ children
13875
+ });
13876
+ }
13877
+ function GroupedModelSelector({ catalog, value, onChange, disabled }) {
13878
+ const families = buildModelVariantGroups(catalog);
13879
+ const current = describeModelVariant(catalog, value);
13880
+ const activeFamily = families.find((f) => f.family === current?.family)?.family ?? families[0]?.family ?? "";
13881
+ const family = families.find((f) => f.family === activeFamily) ?? families[0];
13882
+ if (!family) return null;
13883
+ const activeTier = family.tiers.find((t) => t.tier === current?.tier)?.tier ?? family.tiers[0]?.tier ?? "";
13884
+ const tier = family.tiers.find((t) => t.tier === activeTier) ?? family.tiers[0];
13885
+ if (!tier) return null;
13886
+ const resolutions = [...new Set(tier.options.map((o) => o.resolution))].sort((a, b) => (b ?? Infinity) - (a ?? Infinity));
13887
+ const selectedResolution = resolutions.includes(current?.resolution) ? current?.resolution : resolutions[0];
13888
+ const variantOptions = tier.options.filter((o) => o.resolution === selectedResolution);
13889
+ const resLabel = (r) => r === void 0 ? "640 · native" : `${r}`;
13890
+ const selectTier = (tierId) => {
13891
+ const t = family.tiers.find((x) => x.tier === tierId);
13892
+ if (!t) return;
13893
+ onChange((t.options.find((o) => o.precision === (current?.precision ?? "fp32") && o.optimization === (current?.optimization ?? "standard") && o.resolution === current?.resolution) ?? t.options[0]).modelId);
13894
+ };
13895
+ const selectResolution = (resolution) => {
13896
+ const opts = tier.options.filter((o) => o.resolution === resolution);
13897
+ const pick = opts.find((o) => o.precision === (current?.precision ?? "fp32") && o.optimization === (current?.optimization ?? "standard")) ?? opts[0];
13898
+ if (pick) onChange(pick.modelId);
13899
+ };
13900
+ const selectVariant = (opt) => {
13901
+ const id = resolveVariantModelId(catalog, {
13902
+ family: family.family,
13903
+ tier: tier.tier,
13904
+ precision: opt.precision,
13905
+ optimization: opt.optimization,
13906
+ resolution: opt.resolution
13907
+ });
13908
+ if (id) onChange(id);
13909
+ };
13910
+ const selectedOption = tier.options.find((o) => o.modelId === value) ?? null;
13911
+ return /* @__PURE__ */ jsxs("div", {
13912
+ className: "space-y-3",
13913
+ children: [
13914
+ families.length > 1 && /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
13915
+ className: "text-[10px] uppercase tracking-wide text-foreground-subtle mb-1.5",
13916
+ children: "Family"
13917
+ }), /* @__PURE__ */ jsx("div", {
13918
+ className: "flex flex-wrap gap-1.5",
13919
+ children: families.map((f) => /* @__PURE__ */ jsx(Chip, {
13920
+ active: f.family === family.family,
13921
+ disabled,
13922
+ onClick: () => onChange(f.tiers[0]?.baseModelId ?? ""),
13923
+ children: f.label
13924
+ }, f.family))
13925
+ })] }),
13926
+ /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsxs("p", {
13927
+ className: "text-[10px] uppercase tracking-wide text-foreground-subtle mb-1.5",
13928
+ children: [family.label, " — size"]
13929
+ }), /* @__PURE__ */ jsx("div", {
13930
+ className: "grid grid-cols-2 gap-1.5 sm:grid-cols-4",
13931
+ children: family.tiers.map((t) => {
13932
+ const active = t.tier === tier.tier;
13933
+ const base = t.options.find((o) => o.modelId === t.baseModelId) ?? t.options[0];
13934
+ return /* @__PURE__ */ jsxs("button", {
13935
+ type: "button",
13936
+ disabled,
13937
+ onClick: () => selectTier(t.tier),
13938
+ className: cn("rounded-lg border px-2 py-2 text-left transition-all", active ? "border-primary bg-primary/5 ring-1 ring-primary/30" : "border-border bg-background hover:border-foreground-subtle/40", disabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer"),
13939
+ children: [/* @__PURE__ */ jsxs("div", {
13940
+ className: "flex items-center gap-1",
13941
+ children: [/* @__PURE__ */ jsx("span", {
13942
+ className: "text-xs font-semibold text-foreground",
13943
+ children: t.label
13944
+ }), active && /* @__PURE__ */ jsx(Check, { className: "h-3 w-3 text-primary" })]
13945
+ }), /* @__PURE__ */ jsxs("span", {
13946
+ className: "text-[10px] text-foreground-subtle",
13947
+ children: [
13948
+ "~",
13949
+ base?.sizeMB ?? 0,
13950
+ " MB"
13951
+ ]
13952
+ })]
13953
+ }, t.tier);
13954
+ })
13955
+ })] }),
13956
+ resolutions.length > 1 && /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
13957
+ className: "text-[10px] uppercase tracking-wide text-foreground-subtle mb-1.5",
13958
+ children: "Resolution"
13959
+ }), /* @__PURE__ */ jsx("div", {
13960
+ className: "flex flex-wrap gap-1.5",
13961
+ children: resolutions.map((r) => /* @__PURE__ */ jsx(Chip, {
13962
+ active: r === selectedResolution,
13963
+ disabled,
13964
+ title: r === void 0 ? "native (best accuracy)" : `${r}×${r} (faster)`,
13965
+ onClick: () => selectResolution(r),
13966
+ children: resLabel(r)
13967
+ }, r ?? "native"))
13968
+ })] }),
13969
+ /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
13970
+ className: "text-[10px] uppercase tracking-wide text-foreground-subtle mb-1.5",
13971
+ children: "Variant"
13972
+ }), /* @__PURE__ */ jsx("div", {
13973
+ className: "flex flex-wrap gap-1.5",
13974
+ children: variantOptions.map((opt) => /* @__PURE__ */ jsx(Chip, {
13975
+ active: opt.modelId === value,
13976
+ disabled,
13977
+ title: `${opt.formats.join(", ")} · ~${opt.sizeMB} MB`,
13978
+ onClick: () => selectVariant(opt),
13979
+ children: /* @__PURE__ */ jsxs("span", {
13980
+ className: "inline-flex items-center gap-1",
13981
+ children: [opt.optimization === "fast" && /* @__PURE__ */ jsx(Zap, { className: "h-3 w-3" }), opt.label]
13982
+ })
13983
+ }, opt.modelId))
13984
+ })] }),
13985
+ /* @__PURE__ */ jsxs("div", {
13986
+ className: "flex items-center gap-2 text-[10px] text-foreground-subtle pt-0.5",
13987
+ children: [
13988
+ /* @__PURE__ */ jsx(Cpu, { className: "h-3 w-3" }),
13989
+ /* @__PURE__ */ jsx("span", {
13990
+ className: "font-mono",
13991
+ children: value || "—"
13992
+ }),
13993
+ selectedOption && /* @__PURE__ */ jsxs("span", { children: [
13994
+ "· ",
13995
+ selectedOption.formats.join(", "),
13996
+ " · ~",
13997
+ selectedOption.sizeMB,
13998
+ " MB"
13999
+ ] })
14000
+ ]
14001
+ })
14002
+ ]
14003
+ });
14004
+ }
14005
+ //#endregion
14006
+ //#region src/composites/model-picker.tsx
14007
+ /**
14008
+ * Shared model picker — the ONE model-selection control across the app.
14009
+ *
14010
+ * Renders the grouped Family→Tier→Resolution→Variant selector
14011
+ * ({@link GroupedModelSelector}) when the step's models declare variant groups
14012
+ * (yolo26 / yolov9 …), else a flat `<select>` (face / plate / classifier
14013
+ * catalogs and operator-registered custom models). Custom / ungrouped ids stay
14014
+ * selectable via an "Other models" flat select alongside the grouped picker, and
14015
+ * a legacy/removed pin is surfaced with an explicit banner rather than a
14016
+ * silently mis-highlighted chip.
14017
+ *
14018
+ * Used by the pipeline stepper (`PipelineStep`), the agent/device step editor
14019
+ * (`AgentStepEditor`), and the benchmark — so the picker looks identical
14020
+ * everywhere. `value === ''` renders nothing selected (callers that support an
14021
+ * "Auto / node default" mode own that affordance and hide this picker while it
14022
+ * is active).
14023
+ */
14024
+ function ModelPicker({ models, value, onChange, disabled }) {
14025
+ const hasGroups = useMemo(() => buildModelVariantGroups(models).length > 0, [models]);
14026
+ const ungrouped = useMemo(() => models.filter((m) => m.group === void 0), [models]);
14027
+ const unresolvedBanner = value !== "" && !models.some((m) => m.id === value) && /* @__PURE__ */ jsxs("div", {
14028
+ className: "rounded border border-amber-500/40 bg-amber-500/10 px-2 py-1.5 text-[10px] text-amber-300",
14029
+ children: [
14030
+ "Current pin (",
14031
+ /* @__PURE__ */ jsx("span", {
14032
+ className: "font-mono",
14033
+ children: value
14034
+ }),
14035
+ ") is a legacy/removed model — no longer offered below. Pick a replacement to change it; Save persists whatever is selected here."
14036
+ ]
14037
+ });
14038
+ const flatSelect = (opts, selectPlaceholder) => /* @__PURE__ */ jsxs("select", {
14039
+ disabled,
14040
+ className: "w-full bg-surface border border-border rounded px-2 py-1 text-xs disabled:opacity-50",
14041
+ value: opts.some((m) => m.id === value) ? value : "",
14042
+ onChange: (e) => onChange(e.target.value),
14043
+ children: [selectPlaceholder !== void 0 && /* @__PURE__ */ jsx("option", {
14044
+ value: "",
14045
+ disabled: true,
14046
+ children: selectPlaceholder
14047
+ }), opts.map((m) => /* @__PURE__ */ jsx("option", {
14048
+ value: m.id,
14049
+ children: m.name
14050
+ }, m.id))]
14051
+ });
14052
+ if (!hasGroups) return /* @__PURE__ */ jsxs("div", {
14053
+ className: "space-y-2",
14054
+ children: [unresolvedBanner, flatSelect(models)]
14055
+ });
14056
+ return /* @__PURE__ */ jsxs("div", {
14057
+ className: "space-y-3",
14058
+ children: [
14059
+ unresolvedBanner,
14060
+ /* @__PURE__ */ jsx(GroupedModelSelector, {
14061
+ catalog: models,
14062
+ value,
14063
+ onChange,
14064
+ disabled
14065
+ }),
14066
+ ungrouped.length > 0 && /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
14067
+ className: "text-[10px] uppercase tracking-widest text-foreground-subtle mb-1",
14068
+ children: "Other models"
14069
+ }), flatSelect(ungrouped, "— custom / ungrouped model —")] })
14070
+ ]
14071
+ });
14072
+ }
14073
+ //#endregion
13853
14074
  //#region src/composites/pipeline-step.tsx
13854
14075
  /**
13855
14076
  * PipelineStep — single step card in the pipeline builder.
@@ -13859,11 +14080,7 @@ function buildStepTreeFromSchema(schema) {
13859
14080
  * (Model → Confidence), children recursively.
13860
14081
  */
13861
14082
  function modelsForStep(schema) {
13862
- if (!schema) return [];
13863
- return schema.models.map((m) => ({
13864
- id: m.id,
13865
- name: m.name
13866
- }));
14083
+ return schema?.models ?? [];
13867
14084
  }
13868
14085
  function PipelineStep({ step, schema, allSchemas: _allSchemas, depth: _depth = 0, onChange, onDelete: _onDelete, readOnly = false, toggleMode = "simple", overrideState = null, onOverrideChange, inheritedEnabled, hideModelAndSettings = false, allowAutoModel = false }) {
13869
14086
  const [expanded, setExpanded] = useState(false);
@@ -13954,21 +14171,35 @@ function PipelineStep({ step, schema, allSchemas: _allSchemas, depth: _depth = 0
13954
14171
  children: "Model and detection settings are managed per agent — open the Pipeline page for this camera's agent to edit them."
13955
14172
  }) : /* @__PURE__ */ jsxs("div", {
13956
14173
  className: "space-y-3",
13957
- children: [/* @__PURE__ */ jsx(ConfigSelect, {
13958
- label: "Model",
13959
- value: step.modelId,
13960
- disabled: readOnly,
13961
- options: [...allowAutoModel ? [{
13962
- value: "",
13963
- label: "Auto (node default)"
13964
- }] : [], ...models.map((m) => ({
13965
- value: m.id,
13966
- label: m.name
13967
- }))],
13968
- onChange: (v) => onChange({
13969
- ...step,
13970
- modelId: v
13971
- })
14174
+ children: [/* @__PURE__ */ jsxs("div", {
14175
+ className: "space-y-2",
14176
+ children: [
14177
+ /* @__PURE__ */ jsx("label", {
14178
+ className: "block text-[10px] font-medium text-foreground-subtle uppercase tracking-wide",
14179
+ children: "Model"
14180
+ }),
14181
+ allowAutoModel && /* @__PURE__ */ jsxs("label", {
14182
+ className: "flex items-center gap-2 text-[11px] text-foreground-subtle",
14183
+ children: [/* @__PURE__ */ jsx("input", {
14184
+ type: "checkbox",
14185
+ checked: isAutoSentinel,
14186
+ disabled: readOnly,
14187
+ onChange: (e) => onChange({
14188
+ ...step,
14189
+ modelId: e.target.checked ? "" : schema?.defaultModelId ?? models[0]?.id ?? ""
14190
+ })
14191
+ }), "Auto (node default)"]
14192
+ }),
14193
+ !isAutoSentinel && /* @__PURE__ */ jsx(ModelPicker, {
14194
+ models,
14195
+ value: step.modelId,
14196
+ disabled: readOnly,
14197
+ onChange: (id) => onChange({
14198
+ ...step,
14199
+ modelId: id
14200
+ })
14201
+ })
14202
+ ]
13972
14203
  }), schema?.configSchema?.map((field) => /* @__PURE__ */ jsx(ConfigSchemaField, {
13973
14204
  field,
13974
14205
  allFields: schema.configSchema ?? [],
@@ -14174,218 +14405,7 @@ function ThreeStateButton({ label, active, variant, subtext, onClick }) {
14174
14405
  });
14175
14406
  }
14176
14407
  //#endregion
14177
- //#region src/composites/grouped-model-selector.tsx
14178
- /**
14179
- * GroupedModelSelector — the shared Family → Tier → Variant model picker.
14180
- *
14181
- * The catalog is a FLAT list of models (ids like `yolo26s`, `yolo26s-int8`);
14182
- * this folds it into a `family → tier → variant` tree (see
14183
- * `buildModelVariantGroups` in `@camstack/types`) so the operator picks
14184
- * "YOLO26 → Small → Int8" instead of scanning a flat dropdown of every
14185
- * size×quantization. The selected value stays the flat model id.
14186
- *
14187
- * Parameterised on the minimal `ModelVariantSource` shape so BOTH the config-UI
14188
- * catalog (`ModelCatalogEntry`) and the pipeline/device steppers
14189
- * (`PipelineModelOption`) drive the same component. Legacy / ungrouped models
14190
- * never appear here (the grouping helpers skip them).
14191
- */
14192
- function Chip({ active, onClick, disabled, children, title }) {
14193
- return /* @__PURE__ */ jsx("button", {
14194
- type: "button",
14195
- onClick,
14196
- disabled,
14197
- title,
14198
- className: cn("rounded-full px-3 py-1 text-[11px] font-medium border transition-colors", active ? "border-primary bg-primary/10 text-primary" : "border-border bg-background text-foreground-subtle hover:text-foreground hover:border-foreground-subtle/40", disabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer"),
14199
- children
14200
- });
14201
- }
14202
- function GroupedModelSelector({ catalog, value, onChange, disabled }) {
14203
- const families = buildModelVariantGroups(catalog);
14204
- const current = describeModelVariant(catalog, value);
14205
- const activeFamily = families.find((f) => f.family === current?.family)?.family ?? families[0]?.family ?? "";
14206
- const family = families.find((f) => f.family === activeFamily) ?? families[0];
14207
- if (!family) return null;
14208
- const activeTier = family.tiers.find((t) => t.tier === current?.tier)?.tier ?? family.tiers[0]?.tier ?? "";
14209
- const tier = family.tiers.find((t) => t.tier === activeTier) ?? family.tiers[0];
14210
- if (!tier) return null;
14211
- const resolutions = [...new Set(tier.options.map((o) => o.resolution))].sort((a, b) => (b ?? Infinity) - (a ?? Infinity));
14212
- const selectedResolution = resolutions.includes(current?.resolution) ? current?.resolution : resolutions[0];
14213
- const variantOptions = tier.options.filter((o) => o.resolution === selectedResolution);
14214
- const resLabel = (r) => r === void 0 ? "640 · native" : `${r}`;
14215
- const selectTier = (tierId) => {
14216
- const t = family.tiers.find((x) => x.tier === tierId);
14217
- if (!t) return;
14218
- onChange((t.options.find((o) => o.precision === (current?.precision ?? "fp32") && o.optimization === (current?.optimization ?? "standard") && o.resolution === current?.resolution) ?? t.options[0]).modelId);
14219
- };
14220
- const selectResolution = (resolution) => {
14221
- const opts = tier.options.filter((o) => o.resolution === resolution);
14222
- const pick = opts.find((o) => o.precision === (current?.precision ?? "fp32") && o.optimization === (current?.optimization ?? "standard")) ?? opts[0];
14223
- if (pick) onChange(pick.modelId);
14224
- };
14225
- const selectVariant = (opt) => {
14226
- const id = resolveVariantModelId(catalog, {
14227
- family: family.family,
14228
- tier: tier.tier,
14229
- precision: opt.precision,
14230
- optimization: opt.optimization,
14231
- resolution: opt.resolution
14232
- });
14233
- if (id) onChange(id);
14234
- };
14235
- const selectedOption = tier.options.find((o) => o.modelId === value) ?? null;
14236
- return /* @__PURE__ */ jsxs("div", {
14237
- className: "space-y-3",
14238
- children: [
14239
- families.length > 1 && /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
14240
- className: "text-[10px] uppercase tracking-wide text-foreground-subtle mb-1.5",
14241
- children: "Family"
14242
- }), /* @__PURE__ */ jsx("div", {
14243
- className: "flex flex-wrap gap-1.5",
14244
- children: families.map((f) => /* @__PURE__ */ jsx(Chip, {
14245
- active: f.family === family.family,
14246
- disabled,
14247
- onClick: () => onChange(f.tiers[0]?.baseModelId ?? ""),
14248
- children: f.label
14249
- }, f.family))
14250
- })] }),
14251
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsxs("p", {
14252
- className: "text-[10px] uppercase tracking-wide text-foreground-subtle mb-1.5",
14253
- children: [family.label, " — size"]
14254
- }), /* @__PURE__ */ jsx("div", {
14255
- className: "grid grid-cols-2 gap-1.5 sm:grid-cols-4",
14256
- children: family.tiers.map((t) => {
14257
- const active = t.tier === tier.tier;
14258
- const base = t.options.find((o) => o.modelId === t.baseModelId) ?? t.options[0];
14259
- return /* @__PURE__ */ jsxs("button", {
14260
- type: "button",
14261
- disabled,
14262
- onClick: () => selectTier(t.tier),
14263
- className: cn("rounded-lg border px-2 py-2 text-left transition-all", active ? "border-primary bg-primary/5 ring-1 ring-primary/30" : "border-border bg-background hover:border-foreground-subtle/40", disabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer"),
14264
- children: [/* @__PURE__ */ jsxs("div", {
14265
- className: "flex items-center gap-1",
14266
- children: [/* @__PURE__ */ jsx("span", {
14267
- className: "text-xs font-semibold text-foreground",
14268
- children: t.label
14269
- }), active && /* @__PURE__ */ jsx(Check, { className: "h-3 w-3 text-primary" })]
14270
- }), /* @__PURE__ */ jsxs("span", {
14271
- className: "text-[10px] text-foreground-subtle",
14272
- children: [
14273
- "~",
14274
- base?.sizeMB ?? 0,
14275
- " MB"
14276
- ]
14277
- })]
14278
- }, t.tier);
14279
- })
14280
- })] }),
14281
- resolutions.length > 1 && /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
14282
- className: "text-[10px] uppercase tracking-wide text-foreground-subtle mb-1.5",
14283
- children: "Resolution"
14284
- }), /* @__PURE__ */ jsx("div", {
14285
- className: "flex flex-wrap gap-1.5",
14286
- children: resolutions.map((r) => /* @__PURE__ */ jsx(Chip, {
14287
- active: r === selectedResolution,
14288
- disabled,
14289
- title: r === void 0 ? "native (best accuracy)" : `${r}×${r} (faster)`,
14290
- onClick: () => selectResolution(r),
14291
- children: resLabel(r)
14292
- }, r ?? "native"))
14293
- })] }),
14294
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
14295
- className: "text-[10px] uppercase tracking-wide text-foreground-subtle mb-1.5",
14296
- children: "Variant"
14297
- }), /* @__PURE__ */ jsx("div", {
14298
- className: "flex flex-wrap gap-1.5",
14299
- children: variantOptions.map((opt) => /* @__PURE__ */ jsx(Chip, {
14300
- active: opt.modelId === value,
14301
- disabled,
14302
- title: `${opt.formats.join(", ")} · ~${opt.sizeMB} MB`,
14303
- onClick: () => selectVariant(opt),
14304
- children: /* @__PURE__ */ jsxs("span", {
14305
- className: "inline-flex items-center gap-1",
14306
- children: [opt.optimization === "fast" && /* @__PURE__ */ jsx(Zap, { className: "h-3 w-3" }), opt.label]
14307
- })
14308
- }, opt.modelId))
14309
- })] }),
14310
- /* @__PURE__ */ jsxs("div", {
14311
- className: "flex items-center gap-2 text-[10px] text-foreground-subtle pt-0.5",
14312
- children: [
14313
- /* @__PURE__ */ jsx(Cpu, { className: "h-3 w-3" }),
14314
- /* @__PURE__ */ jsx("span", {
14315
- className: "font-mono",
14316
- children: value || "—"
14317
- }),
14318
- selectedOption && /* @__PURE__ */ jsxs("span", { children: [
14319
- "· ",
14320
- selectedOption.formats.join(", "),
14321
- " · ~",
14322
- selectedOption.sizeMB,
14323
- " MB"
14324
- ] })
14325
- ]
14326
- })
14327
- ]
14328
- });
14329
- }
14330
- //#endregion
14331
14408
  //#region src/composites/agent-step-editor.tsx
14332
- /**
14333
- * Shared model picker for the step editor — renders the grouped
14334
- * Family→Tier→Variant selector when the step's models declare variant groups
14335
- * (yolo26 …), else a flat `<select>` (face / plate / classifier catalogs and
14336
- * custom models). Same component both the agent-default and per-device-override
14337
- * modes use, so the picker looks identical across the pipeline stepper, the
14338
- * device stepper and the cluster matrix.
14339
- */
14340
- function ModelPicker({ models, value, onChange, disabled }) {
14341
- const hasGroups = useMemo(() => buildModelVariantGroups(models).length > 0, [models]);
14342
- const ungrouped = useMemo(() => models.filter((m) => m.group === void 0), [models]);
14343
- const unresolvedBanner = value !== "" && !models.some((m) => m.id === value) && /* @__PURE__ */ jsxs("div", {
14344
- className: "rounded border border-amber-500/40 bg-amber-500/10 px-2 py-1.5 text-[10px] text-amber-300",
14345
- children: [
14346
- "Current pin (",
14347
- /* @__PURE__ */ jsx("span", {
14348
- className: "font-mono",
14349
- children: value
14350
- }),
14351
- ") is a legacy/removed model — no longer offered below. Pick a replacement to change it; Save persists whatever is selected here."
14352
- ]
14353
- });
14354
- const flatSelect = (opts, selectPlaceholder) => /* @__PURE__ */ jsxs("select", {
14355
- disabled,
14356
- className: "w-full bg-surface border border-border rounded px-2 py-1 text-xs disabled:opacity-50",
14357
- value: opts.some((m) => m.id === value) ? value : "",
14358
- onChange: (e) => onChange(e.target.value),
14359
- children: [selectPlaceholder !== void 0 && /* @__PURE__ */ jsx("option", {
14360
- value: "",
14361
- disabled: true,
14362
- children: selectPlaceholder
14363
- }), opts.map((m) => /* @__PURE__ */ jsx("option", {
14364
- value: m.id,
14365
- children: m.name
14366
- }, m.id))]
14367
- });
14368
- if (!hasGroups) return /* @__PURE__ */ jsxs("div", {
14369
- className: "space-y-2",
14370
- children: [unresolvedBanner, flatSelect(models)]
14371
- });
14372
- return /* @__PURE__ */ jsxs("div", {
14373
- className: "space-y-3",
14374
- children: [
14375
- unresolvedBanner,
14376
- /* @__PURE__ */ jsx(GroupedModelSelector, {
14377
- catalog: models,
14378
- value,
14379
- onChange,
14380
- disabled
14381
- }),
14382
- ungrouped.length > 0 && /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
14383
- className: "text-[10px] uppercase tracking-widest text-foreground-subtle mb-1",
14384
- children: "Other models"
14385
- }), flatSelect(ungrouped, "— custom / ungrouped model —")] })
14386
- ]
14387
- });
14388
- }
14389
14409
  function buildDisplayStep(addon, cfg) {
14390
14410
  return {
14391
14411
  addonId: addon.id,
@@ -14445,14 +14465,14 @@ function DeviceModeEditor({ addon, agentDefault, agentNodeId, currentPatch, mode
14445
14465
  onChangePatch?.(hasAnyField ? next : null);
14446
14466
  };
14447
14467
  const setModel = (modelId) => {
14448
- const { enabled: _enabled, modelId: _prev, ...rest } = currentPatch ?? {};
14468
+ const { modelId: _prev, ...rest } = currentPatch ?? {};
14449
14469
  commitPatch(modelId === void 0 ? rest : {
14450
14470
  ...rest,
14451
14471
  modelId
14452
14472
  });
14453
14473
  };
14454
14474
  const setSettings = (settings) => {
14455
- const { enabled: _enabled, settings: _prev, ...rest } = currentPatch ?? {};
14475
+ const { settings: _prev, ...rest } = currentPatch ?? {};
14456
14476
  commitPatch(settings === void 0 ? rest : {
14457
14477
  ...rest,
14458
14478
  settings
@@ -14573,6 +14593,42 @@ function AgentStepEditor(props) {
14573
14593
  onChangePatch
14574
14594
  });
14575
14595
  }
14596
+ //#endregion
14597
+ //#region src/composites/pipeline-matrix-shared.tsx
14598
+ /**
14599
+ * Stable column identity. Plain per-node columns key by `agentNodeId` (so the
14600
+ * rendered `key` is byte-identical to the pre-C7.4 matrix); device sub-columns
14601
+ * disambiguate with their `deviceKey`. MUST be used everywhere a React `key`,
14602
+ * selection compare, or column identity is derived.
14603
+ */
14604
+ function agentColumnKey(a) {
14605
+ return a.deviceKey !== void 0 ? `${a.agentNodeId}::${a.deviceKey}` : a.agentNodeId;
14606
+ }
14607
+ /**
14608
+ * Coalesce CONSECUTIVE columns that share an `agentNodeId` into node groups.
14609
+ * Order-preserving: the flat column order is untouched, so body cells still map
14610
+ * 1:1 to `agents`. A run of length 1 is a plain (ungrouped) node header.
14611
+ */
14612
+ function groupAgentColumns(agents) {
14613
+ const groups = [];
14614
+ for (const col of agents) {
14615
+ const last = groups[groups.length - 1];
14616
+ if (last && last.agentNodeId === col.agentNodeId) {
14617
+ const columns = [...last.columns, col];
14618
+ groups[groups.length - 1] = {
14619
+ ...last,
14620
+ columns,
14621
+ grouped: columns.length > 1
14622
+ };
14623
+ } else groups.push({
14624
+ agentNodeId: col.agentNodeId,
14625
+ engineLabel: col.engineLabel,
14626
+ columns: [col],
14627
+ grouped: false
14628
+ });
14629
+ }
14630
+ return groups;
14631
+ }
14576
14632
  function flattenTree(nodes) {
14577
14633
  const out = [];
14578
14634
  const walk = (list, depth) => {
@@ -14651,6 +14707,41 @@ function ClassChips({ inputs, outputs }) {
14651
14707
  ]
14652
14708
  });
14653
14709
  }
14710
+ /**
14711
+ * Grouped node header (C7.4): a node super-label spanning its device
14712
+ * sub-columns, with a per-device sub-label row beneath. Rendered ONLY for a
14713
+ * node expanded into 2+ device sub-columns; a single plain column keeps each
14714
+ * matrix's own byte-identical single-header markup. The spanning cell uses
14715
+ * `gridColumn: span N` so it aligns to its N body columns; the inner flex row
14716
+ * gives each device its own equal-width, padded sub-label slot.
14717
+ */
14718
+ function GroupedAgentHeader({ group }) {
14719
+ return /* @__PURE__ */ jsxs("div", {
14720
+ className: "sticky top-0 z-10 min-w-0 border-b border-l border-border bg-muted/60",
14721
+ style: { gridColumn: `span ${group.columns.length}` },
14722
+ children: [
14723
+ /* @__PURE__ */ jsx("div", {
14724
+ className: "truncate px-3 pt-2 text-xs font-semibold text-foreground",
14725
+ children: group.agentNodeId
14726
+ }),
14727
+ /* @__PURE__ */ jsx("div", {
14728
+ className: "truncate px-3 text-[10px] text-foreground-subtle",
14729
+ children: group.engineLabel
14730
+ }),
14731
+ /* @__PURE__ */ jsx("div", {
14732
+ className: "mt-1 flex border-t border-border/50",
14733
+ children: group.columns.map((c, i) => /* @__PURE__ */ jsx("div", {
14734
+ className: cn("min-w-0 flex-1 px-3 py-1", i > 0 && "border-l border-border/50"),
14735
+ title: c.deviceLabel ?? c.deviceKey,
14736
+ children: /* @__PURE__ */ jsx("div", {
14737
+ className: "truncate text-[10px] font-medium text-foreground/90",
14738
+ children: c.deviceLabel ?? c.deviceKey
14739
+ })
14740
+ }, agentColumnKey(c)))
14741
+ })
14742
+ ]
14743
+ });
14744
+ }
14654
14745
  /** Step label (slot heading + addon name + class chips), shared by both views. */
14655
14746
  function StepLabel({ node }) {
14656
14747
  return /* @__PURE__ */ jsxs("div", {
@@ -14753,13 +14844,13 @@ function GridRow({ node, depth, agents, getCellState, onCellClick, selectedCell,
14753
14844
  })
14754
14845
  })]
14755
14846
  }), agents.map((a) => {
14756
- const state = getCellState(node.addonId, a.agentNodeId);
14847
+ const state = getCellState(node.addonId, a);
14757
14848
  return /* @__PURE__ */ jsx("button", {
14758
14849
  type: "button",
14759
- onClick: () => onCellClick(node.addonId, a.agentNodeId),
14760
- className: cellButtonClass(state, selectedCell?.addonId === node.addonId && selectedCell.agentNodeId === a.agentNodeId, "min-w-0 overflow-hidden px-3 py-1.5 border-b border-l border-border"),
14850
+ onClick: () => onCellClick(node.addonId, a),
14851
+ className: cellButtonClass(state, selectedCell !== null && selectedCell.addonId === node.addonId && agentColumnKey(selectedCell) === agentColumnKey(a), "min-w-0 overflow-hidden px-3 py-1.5 border-b border-l border-border"),
14761
14852
  children: renderCellContent(state)
14762
- }, a.agentNodeId);
14853
+ }, agentColumnKey(a));
14763
14854
  })] });
14764
14855
  }
14765
14856
  /**
@@ -14771,7 +14862,8 @@ function GridRow({ node, depth, agents, getCellState, onCellClick, selectedCell,
14771
14862
  function MatrixGrid$1({ rows, agents, getCellState, onCellClick, selectedCell, onToggleEnabled }) {
14772
14863
  const gridTemplate = `${STEP_COL_REM$1}rem repeat(${agents.length}, 13rem)`;
14773
14864
  const showToggle = onToggleEnabled !== void 0 && agents.length === 1;
14774
- const onlyAgent = agents[0]?.agentNodeId;
14865
+ const onlyAgent = agents[0];
14866
+ const groups = groupAgentColumns(agents);
14775
14867
  return /* @__PURE__ */ jsx("div", {
14776
14868
  className: "overflow-auto border border-border rounded",
14777
14869
  children: /* @__PURE__ */ jsxs("div", {
@@ -14782,16 +14874,16 @@ function MatrixGrid$1({ rows, agents, getCellState, onCellClick, selectedCell, o
14782
14874
  className: "sticky top-0 left-0 z-20 bg-muted/60 px-3 py-2 text-[10px] uppercase tracking-widest text-foreground-subtle border-b border-border",
14783
14875
  children: "Step"
14784
14876
  }),
14785
- agents.map((a) => /* @__PURE__ */ jsxs("div", {
14877
+ groups.map((group) => group.grouped ? /* @__PURE__ */ jsx(GroupedAgentHeader, { group }, group.agentNodeId) : group.columns.map((col) => /* @__PURE__ */ jsxs("div", {
14786
14878
  className: "sticky top-0 z-10 min-w-0 bg-muted/60 px-3 py-2 border-b border-l border-border",
14787
14879
  children: [/* @__PURE__ */ jsx("div", {
14788
14880
  className: "text-xs font-semibold text-foreground truncate",
14789
- children: a.agentNodeId
14881
+ children: col.agentNodeId
14790
14882
  }), /* @__PURE__ */ jsx("div", {
14791
14883
  className: "text-[10px] text-foreground-subtle truncate",
14792
- children: a.engineLabel
14884
+ children: col.engineLabel
14793
14885
  })]
14794
- }, a.agentNodeId)),
14886
+ }, agentColumnKey(col)))),
14795
14887
  rows.map(({ node, depth }) => {
14796
14888
  const cellState = showToggle && onlyAgent !== void 0 ? getCellState(node.addonId, onlyAgent) : null;
14797
14889
  return /* @__PURE__ */ jsx(GridRow, {
@@ -14827,14 +14919,14 @@ function StackedCards({ rows, agents, getCellState, onCellClick, selectedCell, o
14827
14919
  className: "bg-muted/60 px-3 py-2 border-b border-border",
14828
14920
  children: [/* @__PURE__ */ jsx("div", {
14829
14921
  className: "text-xs font-semibold text-foreground truncate",
14830
- children: a.agentNodeId
14922
+ children: a.deviceLabel ? `${a.agentNodeId} · ${a.deviceLabel}` : a.agentNodeId
14831
14923
  }), /* @__PURE__ */ jsx("div", {
14832
14924
  className: "text-[10px] text-foreground-subtle truncate",
14833
14925
  children: a.engineLabel
14834
14926
  })]
14835
14927
  }), /* @__PURE__ */ jsx("ul", { children: rows.map(({ node, depth }) => {
14836
- const state = getCellState(node.addonId, a.agentNodeId);
14837
- const isSelected = selectedCell?.addonId === node.addonId && selectedCell.agentNodeId === a.agentNodeId;
14928
+ const state = getCellState(node.addonId, a);
14929
+ const isSelected = selectedCell !== null && selectedCell.addonId === node.addonId && agentColumnKey(selectedCell) === agentColumnKey(a);
14838
14930
  const toggleProps = showToggle && state !== null ? {
14839
14931
  enabled: state.kind === "enabled",
14840
14932
  onChange: (next) => onToggleEnabled?.(node.addonId, next),
@@ -14846,7 +14938,7 @@ function StackedCards({ rows, agents, getCellState, onCellClick, selectedCell, o
14846
14938
  className: "flex items-center gap-2",
14847
14939
  children: [/* @__PURE__ */ jsxs("button", {
14848
14940
  type: "button",
14849
- onClick: () => onCellClick(node.addonId, a.agentNodeId),
14941
+ onClick: () => onCellClick(node.addonId, a),
14850
14942
  className: cellButtonClass(state, isSelected, "flex flex-1 min-w-0 items-start justify-between gap-3 px-3 py-2"),
14851
14943
  style: { paddingLeft: `${12 + depth * 14}px` },
14852
14944
  children: [/* @__PURE__ */ jsx(StepLabel, { node }), /* @__PURE__ */ jsx("span", {
@@ -14864,7 +14956,7 @@ function StackedCards({ rows, agents, getCellState, onCellClick, selectedCell, o
14864
14956
  })
14865
14957
  }, node.addonId);
14866
14958
  }) })]
14867
- }, a.agentNodeId))
14959
+ }, agentColumnKey(a)))
14868
14960
  });
14869
14961
  }
14870
14962
  function PipelineTreeMatrix({ tree, agents, getCellState, onCellClick, selectedCell, onToggleEnabled }) {
@@ -14972,11 +15064,11 @@ function ZoneBadge() {
14972
15064
  })]
14973
15065
  });
14974
15066
  }
14975
- function StepGateCell({ node, depth, gate, busy, onSet }) {
15067
+ function StepGateCell({ node, depth, gate, busy, onSet, hideGate }) {
14976
15068
  return /* @__PURE__ */ jsxs("div", {
14977
15069
  className: "sticky left-0 z-10 flex flex-col gap-2 border-b border-border bg-surface px-3 py-2.5 text-xs min-w-0",
14978
15070
  style: { paddingLeft: `${12 + depth * 14}px` },
14979
- children: [/* @__PURE__ */ jsx(StepLabel, { node }), gate.kind === "zone-driven" ? /* @__PURE__ */ jsx(ZoneBadge, {}) : /* @__PURE__ */ jsx(GateControl, {
15071
+ children: [/* @__PURE__ */ jsx(StepLabel, { node }), hideGate ? null : gate.kind === "zone-driven" ? /* @__PURE__ */ jsx(ZoneBadge, {}) : /* @__PURE__ */ jsx(GateControl, {
14980
15072
  gate,
14981
15073
  busy,
14982
15074
  onSet
@@ -14985,11 +15077,12 @@ function StepGateCell({ node, depth, gate, busy, onSet }) {
14985
15077
  }
14986
15078
  /**
14987
15079
  * Agents-scoped node selector for the B fallback. Styled like the shared
14988
- * `NodePicker` but driven by THIS matrix's `agents` set — the cluster-wide
15080
+ * `NodePicker` but driven by THIS matrix's NODE set — the cluster-wide
14989
15081
  * NodePicker can list nodes (e.g. the hub) that own no pipeline column here,
14990
- * which would let the operator select a node the matrix can't show.
15082
+ * which would let the operator select a node the matrix can't show. Selects a
15083
+ * NODE (grouping its device sub-columns), never a raw device column.
14991
15084
  */
14992
- function NodeSelectorBar({ agents, selected, onSelect }) {
15085
+ function NodeSelectorBar({ nodes, selected, onSelect }) {
14993
15086
  return /* @__PURE__ */ jsxs("div", {
14994
15087
  className: "flex flex-wrap items-center gap-1.5",
14995
15088
  role: "tablist",
@@ -15002,7 +15095,7 @@ function NodeSelectorBar({ agents, selected, onSelect }) {
15002
15095
  }),
15003
15096
  /* @__PURE__ */ jsx("div", {
15004
15097
  className: "flex overflow-hidden rounded-md border border-border text-[11px] font-medium",
15005
- children: agents.map((a, idx) => {
15098
+ children: nodes.map((a, idx) => {
15006
15099
  const isSelected = a.agentNodeId === selected;
15007
15100
  return /* @__PURE__ */ jsx("button", {
15008
15101
  type: "button",
@@ -15018,8 +15111,9 @@ function NodeSelectorBar({ agents, selected, onSelect }) {
15018
15111
  ]
15019
15112
  });
15020
15113
  }
15021
- function MatrixGrid({ tree, agents, gateFor, getCellState, onCellClick, selectedCell, onSetGate, gateBusy, single }) {
15114
+ function MatrixGrid({ tree, agents, gateFor, getCellState, onCellClick, selectedCell, onSetGate, gateBusy, single, hideGate }) {
15022
15115
  const rows = useMemo(() => flattenTree(tree), [tree]);
15116
+ const groups = useMemo(() => groupAgentColumns(agents), [agents]);
15023
15117
  const gridTemplate = single ? `minmax(0, 1.35fr) repeat(${agents.length}, minmax(0, 1fr))` : `${STEP_COL_REM}rem repeat(${agents.length}, 13rem)`;
15024
15118
  return /* @__PURE__ */ jsx("div", {
15025
15119
  className: cn("rounded border border-border", single ? "overflow-hidden" : "overflow-auto"),
@@ -15029,18 +15123,18 @@ function MatrixGrid({ tree, agents, gateFor, getCellState, onCellClick, selected
15029
15123
  children: [
15030
15124
  /* @__PURE__ */ jsx("div", {
15031
15125
  className: "sticky left-0 top-0 z-20 border-b border-border bg-muted/60 px-3 py-2 text-[10px] uppercase tracking-widest text-foreground-subtle",
15032
- children: "Step · gate"
15126
+ children: hideGate ? "Step" : "Step · gate"
15033
15127
  }),
15034
- agents.map((a) => /* @__PURE__ */ jsxs("div", {
15128
+ groups.map((group) => group.grouped ? /* @__PURE__ */ jsx(GroupedAgentHeader, { group }, group.agentNodeId) : group.columns.map((col) => /* @__PURE__ */ jsxs("div", {
15035
15129
  className: "sticky top-0 z-10 min-w-0 border-b border-l border-border bg-muted/60 px-3 py-2",
15036
15130
  children: [/* @__PURE__ */ jsx("div", {
15037
15131
  className: "truncate text-xs font-semibold text-foreground",
15038
- children: a.agentNodeId
15132
+ children: col.agentNodeId
15039
15133
  }), /* @__PURE__ */ jsx("div", {
15040
15134
  className: "truncate text-[10px] text-foreground-subtle",
15041
- children: a.engineLabel
15135
+ children: col.engineLabel
15042
15136
  })]
15043
- }, a.agentNodeId)),
15137
+ }, agentColumnKey(col)))),
15044
15138
  rows.map(({ node, depth }) => /* @__PURE__ */ jsx(MatrixRow, {
15045
15139
  node,
15046
15140
  depth,
@@ -15050,33 +15144,35 @@ function MatrixGrid({ tree, agents, gateFor, getCellState, onCellClick, selected
15050
15144
  onCellClick,
15051
15145
  selectedCell,
15052
15146
  onSetGate,
15053
- gateBusy
15147
+ gateBusy,
15148
+ hideGate
15054
15149
  }, node.addonId))
15055
15150
  ]
15056
15151
  })
15057
15152
  });
15058
15153
  }
15059
- function MatrixRow({ node, depth, agents, gate, getCellState, onCellClick, selectedCell, onSetGate, gateBusy }) {
15154
+ function MatrixRow({ node, depth, agents, gate, getCellState, onCellClick, selectedCell, onSetGate, gateBusy, hideGate }) {
15060
15155
  return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(StepGateCell, {
15061
15156
  node,
15062
15157
  depth,
15063
15158
  gate,
15064
15159
  busy: gateBusy,
15065
- onSet: (next) => onSetGate(node.addonId, next)
15160
+ onSet: (next) => onSetGate(node.addonId, next),
15161
+ hideGate
15066
15162
  }), agents.map((a) => {
15067
- const state = getCellState(node.addonId, a.agentNodeId);
15068
- const isSelected = selectedCell?.addonId === node.addonId && selectedCell.agentNodeId === a.agentNodeId;
15163
+ const state = getCellState(node.addonId, a);
15164
+ const isSelected = selectedCell !== null && selectedCell.addonId === node.addonId && agentColumnKey(selectedCell) === agentColumnKey(a);
15069
15165
  const actionable = state.kind === "enabled" || state.kind === "skip";
15070
15166
  return /* @__PURE__ */ jsx("button", {
15071
15167
  type: "button",
15072
15168
  disabled: !actionable,
15073
- onClick: () => onCellClick(node.addonId, a.agentNodeId),
15169
+ onClick: () => onCellClick(node.addonId, a),
15074
15170
  className: cellButtonClass(state, isSelected, cn("min-w-0 overflow-hidden border-b border-l border-border px-3 py-2", !actionable && "cursor-default hover:bg-transparent")),
15075
15171
  children: renderCellContent(state)
15076
- }, a.agentNodeId);
15172
+ }, agentColumnKey(a));
15077
15173
  })] });
15078
15174
  }
15079
- function DeviceStepMatrix({ tree, agents, gateFor, getCellState, onCellClick, selectedCell, onSetGate, gateBusy, fallbackNodeId, onFallbackNodeChange }) {
15175
+ function DeviceStepMatrix({ tree, agents, gateFor, getCellState, onCellClick, selectedCell, onSetGate, gateBusy, fallbackNodeId, onFallbackNodeChange, hideGate }) {
15080
15176
  const containerRef = useRef(null);
15081
15177
  const [width, setWidth] = useState(0);
15082
15178
  useLayoutEffect(() => {
@@ -15088,17 +15184,18 @@ function DeviceStepMatrix({ tree, agents, gateFor, getCellState, onCellClick, se
15088
15184
  RO?.observe(el);
15089
15185
  return () => RO?.disconnect();
15090
15186
  }, []);
15091
- const single = shouldUseSingleNode(width, agents.length, STEP_COL_PX);
15187
+ const nodes = useMemo(() => groupAgentColumns(agents), [agents]);
15188
+ const single = shouldUseSingleNode(width, nodes.length, STEP_COL_PX);
15092
15189
  const selectedNode = useMemo(() => {
15093
- if (agents.length === 0) return null;
15094
- return agents.find((a) => a.agentNodeId === fallbackNodeId) ?? agents[0];
15095
- }, [agents, fallbackNodeId]);
15096
- const shownAgents = single && selectedNode ? [selectedNode] : agents;
15190
+ if (nodes.length === 0) return null;
15191
+ return nodes.find((n) => n.agentNodeId === fallbackNodeId) ?? nodes[0] ?? null;
15192
+ }, [nodes, fallbackNodeId]);
15193
+ const shownAgents = single && selectedNode ? selectedNode.columns : agents;
15097
15194
  return /* @__PURE__ */ jsxs("div", {
15098
15195
  ref: containerRef,
15099
15196
  className: "w-full space-y-2",
15100
15197
  children: [single && selectedNode && /* @__PURE__ */ jsx(NodeSelectorBar, {
15101
- agents,
15198
+ nodes,
15102
15199
  selected: selectedNode.agentNodeId,
15103
15200
  onSelect: onFallbackNodeChange
15104
15201
  }), /* @__PURE__ */ jsx(MatrixGrid, {
@@ -15110,7 +15207,8 @@ function DeviceStepMatrix({ tree, agents, gateFor, getCellState, onCellClick, se
15110
15207
  selectedCell,
15111
15208
  onSetGate,
15112
15209
  gateBusy,
15113
- single: single && selectedNode !== null
15210
+ single: single && selectedNode !== null,
15211
+ hideGate
15114
15212
  })]
15115
15213
  });
15116
15214
  }
@@ -18826,8 +18924,6 @@ var usePipelineExecutorGetAvailableEngines = trpc.pipelineExecutor.getAvailableE
18826
18924
  var usePipelineExecutorGetSelectedEngine = trpc.pipelineExecutor.getSelectedEngine.useQuery;
18827
18925
  /** Generated alias around `trpc.pipelineExecutor.getDefaultSteps.useQuery`. */
18828
18926
  var usePipelineExecutorGetDefaultSteps = trpc.pipelineExecutor.getDefaultSteps.useQuery;
18829
- /** Generated alias around `trpc.pipelineExecutor.reprobeEngine.useMutation`. */
18830
- var usePipelineExecutorReprobeEngine = trpc.pipelineExecutor.reprobeEngine.useMutation;
18831
18927
  /** Generated alias around `trpc.pipelineExecutor.getEngineProvisioning.useQuery`. */
18832
18928
  var usePipelineExecutorGetEngineProvisioning = trpc.pipelineExecutor.getEngineProvisioning.useQuery;
18833
18929
  /** Generated alias around `trpc.pipelineExecutor.getVideoPipelineSteps.useQuery`. */
@@ -18898,6 +18994,10 @@ var usePipelineExecutorGetDetectionConfigSchema = trpc.pipelineExecutor.getDetec
18898
18994
  var usePipelineOrchestratorAssignPipeline = trpc.pipelineOrchestrator.assignPipeline.useMutation;
18899
18995
  /** Generated alias around `trpc.pipelineOrchestrator.unassignPipeline.useMutation`. */
18900
18996
  var usePipelineOrchestratorUnassignPipeline = trpc.pipelineOrchestrator.unassignPipeline.useMutation;
18997
+ /** Generated alias around `trpc.pipelineOrchestrator.setPipelineDevicePin.useMutation`. */
18998
+ var usePipelineOrchestratorSetPipelineDevicePin = trpc.pipelineOrchestrator.setPipelineDevicePin.useMutation;
18999
+ /** Generated alias around `trpc.pipelineOrchestrator.getPipelineDevicePin.useQuery`. */
19000
+ var usePipelineOrchestratorGetPipelineDevicePin = trpc.pipelineOrchestrator.getPipelineDevicePin.useQuery;
18901
19001
  /** Generated alias around `trpc.pipelineOrchestrator.rebalance.useMutation`. */
18902
19002
  var usePipelineOrchestratorRebalance = trpc.pipelineOrchestrator.rebalance.useMutation;
18903
19003
  /** Generated alias around `trpc.pipelineOrchestrator.getPipelineAssignments.useQuery`. */
@@ -18930,8 +19030,6 @@ var usePipelineOrchestratorGetAudioAssignments = trpc.pipelineOrchestrator.getAu
18930
19030
  var usePipelineOrchestratorGetAgentSettings = trpc.pipelineOrchestrator.getAgentSettings.useQuery;
18931
19031
  /** Generated alias around `trpc.pipelineOrchestrator.listAgentSettings.useQuery`. */
18932
19032
  var usePipelineOrchestratorListAgentSettings = trpc.pipelineOrchestrator.listAgentSettings.useQuery;
18933
- /** Generated alias around `trpc.pipelineOrchestrator.setAgentAddonDefaults.useMutation`. */
18934
- var usePipelineOrchestratorSetAgentAddonDefaults = trpc.pipelineOrchestrator.setAgentAddonDefaults.useMutation;
18935
19033
  /** Generated alias around `trpc.pipelineOrchestrator.removeAgentSettings.useMutation`. */
18936
19034
  var usePipelineOrchestratorRemoveAgentSettings = trpc.pipelineOrchestrator.removeAgentSettings.useMutation;
18937
19035
  /** Generated alias around `trpc.pipelineOrchestrator.setAgentMaxCameras.useMutation`. */
@@ -18944,6 +19042,8 @@ var usePipelineOrchestratorSetAgentCapabilities = trpc.pipelineOrchestrator.setA
18944
19042
  var usePipelineOrchestratorSetAgentReachableHost = trpc.pipelineOrchestrator.setAgentReachableHost.useMutation;
18945
19043
  /** Generated alias around `trpc.pipelineOrchestrator.setAgentInferenceDevices.useMutation`. */
18946
19044
  var usePipelineOrchestratorSetAgentInferenceDevices = trpc.pipelineOrchestrator.setAgentInferenceDevices.useMutation;
19045
+ /** Generated alias around `trpc.pipelineOrchestrator.getNodeInferenceDevices.useQuery`. */
19046
+ var usePipelineOrchestratorGetNodeInferenceDevices = trpc.pipelineOrchestrator.getNodeInferenceDevices.useQuery;
18947
19047
  /** Generated alias around `trpc.pipelineOrchestrator.resetNodePipelineDefaults.useMutation`. */
18948
19048
  var usePipelineOrchestratorResetNodePipelineDefaults = trpc.pipelineOrchestrator.resetNodePipelineDefaults.useMutation;
18949
19049
  /** Generated alias around `trpc.pipelineOrchestrator.getCameraSettings.useQuery`. */
@@ -28805,15 +28905,34 @@ function DeviceItemPreview({ trpc, device, status, enabled, showStatusPills = fa
28805
28905
  }
28806
28906
  //#endregion
28807
28907
  //#region src/composites/device-item/status-dot.tsx
28908
+ /** The states that breathe (are "alive"). Offline + disabled are static. */
28909
+ function isAlive(status) {
28910
+ return status === "online" || status === "recording-continuous" || status === "recording-events";
28911
+ }
28808
28912
  function resolveTitle(status, lastChangedAt) {
28809
- if (status === "disabled") return "Disabled";
28810
- if (status === "online") return "Online";
28811
- const lastSeen = formatLastSeen(lastChangedAt);
28812
- return lastSeen === null ? "Offline" : `Offline · last seen ${lastSeen}`;
28913
+ switch (status) {
28914
+ case "disabled": return "Disabled";
28915
+ case "online": return "Online";
28916
+ case "recording-continuous": return "Recording · always";
28917
+ case "recording-events": return "Recording · on motion";
28918
+ case "offline": {
28919
+ const lastSeen = formatLastSeen(lastChangedAt);
28920
+ return lastSeen === null ? "Offline" : `Offline · last seen ${lastSeen}`;
28921
+ }
28922
+ }
28923
+ }
28924
+ function colorClass(status) {
28925
+ switch (status) {
28926
+ case "disabled": return "bg-black ring-1 ring-foreground-subtle/60";
28927
+ case "offline": return "bg-foreground-subtle";
28928
+ case "recording-continuous": return "bg-danger";
28929
+ case "recording-events": return "bg-info";
28930
+ case "online": return "bg-success";
28931
+ }
28813
28932
  }
28814
28933
  function StatusDot({ status, lastChangedAt }) {
28815
28934
  return /* @__PURE__ */ jsx("span", {
28816
- className: cn("h-1.5 w-1.5 rounded-full flex-shrink-0", status === "disabled" ? "bg-warning" : status === "online" ? "bg-success" : "bg-danger"),
28935
+ className: cn("h-1.5 w-1.5 rounded-full flex-shrink-0", colorClass(status), isAlive(status) && "animate-pulse"),
28817
28936
  title: resolveTitle(status, lastChangedAt)
28818
28937
  });
28819
28938
  }
@@ -46909,4 +47028,4 @@ var MotionZonesSettings = lazy(() => import("./MotionZonesSettings-NcxxQN8r.js")
46909
47028
  /** Lazy-wrapped `PrivacyMaskSettings` — code-split off the main bundle. */
46910
47029
  var PrivacyMaskSettings = lazy(() => import("./PrivacyMaskSettings-APgPLF7p.js").then((m) => ({ default: m.PrivacyMaskSettings })));
46911
47030
  //#endregion
46912
- export { AddonGlobalSettingsForm, AgentStepEditor, AlarmHeroCard, AlarmInlineControl as AlarmPanelInlineControl, AppShell, ArcKnob, AudioClassificationList, AudioLevelWaveform, AudioWaveform, AutotrackSection, BTN_COMPACT, BTN_COMPACT_DANGER, BTN_COMPACT_PRIMARY, BTN_COMPACT_WARNING, Badge, BatteryBadge, BottomSheet, Breadcrumb, BrightnessPanel, Button, ButtonControl, ButtonHeroCard, CENTER, CHIP_ACTIVE, CHIP_BASE, CHIP_INACTIVE, CLASS_COLORS, COLUMN_BREAKPOINT_CLASS, COLUMN_PRIORITY, COMMIT_DEDUPE_TOLERANCE_MS, COMMIT_DEDUPE_WINDOW_MS, CONTROL_CAP_NAMES, CONTROL_FILLS, CameraStreamPlayer, Card, Checkbox, ChildSectionAccordion, ClimatePanel, CodeBlock, CollapsibleCard, ConfigFormBuilder, FormField as ConfigFormField, ConfigSchemaField, ConfirmActionButton, ConfirmDialogProvider, ConsumablesPanel, ContainerChildrenProvider, ContainerPrimaryHero, ControlColumn, ControlHeroCard, ControlInlineControl, ControlPanel, CopyButton, CoverHeroCard, CoverInlineControl, CoverPanel, CustomFieldRenderersProvider, DEFAULT_COLOR, DEVICE_COLUMNS, DEVICE_LIST_PAGE_SIZE_KEY, DEVICE_LIST_PAGE_SIZE_OPTIONS, DEVICE_ROLE_META, DEVICE_TYPE_CONTROL, DEVICE_TYPE_META, DISPLAY_ICON_REGISTRY, DataTable, DetectionCanvas, DetectionOverlay, DetectionResultTree, DevShell, DeviceActivityPanel, DeviceBatchToolbar, DeviceCard, DeviceContextProvider, DeviceExportPanel, DeviceGrid, DeviceItem, DeviceList, DeviceMultiSelectField, DeviceSelectField, DeviceStepMatrix, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, DiscoveryPanel, DoorbellRecentPanel, Dropdown, DropdownContent, DropdownItem, DropdownTrigger, DummyHeroCard, DummyInline, EVENT_KIND_ICONS, EmptyState, ErrorBox, EventKindGlyph, EventStream, FILL, FanHeroCard, FanInlineControl, FanPanel, FilterBar, FloatingEventStream, FloatingLogStream, FloatingPanel, FormField$1 as FormField, GRID_GAP, GRID_PAIRED, GRID_QUICK_STATS, GripTrack, GroupedModelSelector, HOST_WIDGETS, HlsVideo, HoverZoomImage, HumidifierHeroCard, HumidifierInlineControl, INPUT_COMPACT, IconAction, IconButton, ImageHeroCard, ImageInlineControl, ImageSelector, InferenceConfigSelector, Input, KebabMenu, KeyValueList, LIST_ROW, Label, LawnMowerHeroCard, LawnMowerInlineControl, LightHeroCard, LightInlineControl, LockHeroCard, LockInlineControl, LockPanel, LogStream, LoginForm, MODE_COLOR, MaskShapeCanvas, MediaPlayerHeroCard, MediaPlayerInlineControl, MediaPlayerPanel, MobileDrawer, MotionZonesSettings, NodeMultiSelectField, NodePicker, NodeSelectField, OfflineBadge, PHASE_CONFIG, PRIORITY, PTZOverlay, PageHeader, PhaseIcon, PipelineBuilder, PipelineRuntimeSelector, PipelineStep, PipelineTreeMatrix, PlayerOverlaysProvider, Popover, PopoverContent, PopoverRowAction, PopoverTrigger, PrimaryChildPicker, PrivacyMaskSettings, ProviderBadge, PtzPanel, QrCode, RECORDED_PLAYBACK_MODES, RIGHT, ROLE_DESCRIPTOR, RadialGauge, RecordedPlaybackProvider, RecordingPanel, ResponseLog, SECTION_BODY, SECTION_CARD, SECTION_HEADER, SPLIT_PANEL_OUTER, SPLIT_PANEL_SIDE, STACK_GAP, STATE_COLOR, ScopePicker, ScrollArea, Select, SemanticBadge, SensorHeroCard, SensorInlineControl, SensorValueAtom, Separator, Sidebar, SidebarItem, Skeleton, SlideOverPanel, SlideToggle, SnapshotButton, StatCard, StateValuesStream, StatusBadge, StepTimings, StepTreeMaster, Stepper, StreamBrokerSelector, StreamPanel, Switch, SwitchHeroCard, SwitchInlineControl, SwitchPanel, SystemProvider, TEXT_FIELD_LABEL, TEXT_HINT, TEXT_METRIC, TEXT_SECTION_LABEL, TEXT_VALUE, TIMEZONES, Tabs, TabsContent, TabsList, TabsTrigger, TapToggle, ThemeProvider, ThermostatHeroCard, ThermostatInlineControl, TimezoneSelector, Tooltip, TooltipContent, TooltipTrigger, VacuumHeroCard, VacuumInlineControl, ValueReadout, ValveHeroCard, ValveInlineControl, VersionBadge, VodPlaybackProvider, WaterHeaterHeroCard, WaterHeaterInlineControl, WeatherHeroCard, WeatherInlineControl, WidgetMetricCard, WidgetPanel, WidgetRegistryProvider, WidgetSlot, ZoneEditingProvider, allDeviceTypeFilterOptions, buildStepTreeFromSchema, childEntityId, childListName, cn, columnsForContext, containerChildToRef, countableDevices, coverHighlight, createSharedContext, createTheme, cursorFractionFor, darkColors, defaultTheme, deriveDeviceKind, deviceMatchesFilter, deviceOptionLabel, deviceRoleMeta, deviceRoleMetaOf, deviceTypeMeta, deviceTypeMetaOf, devicesToOptions, ensureMfHostInit, eventKindLabel, filterDeviceOptions, findTimezone, formatControlDateTime, formatLastSeen, formatNumeric, fuzzyMatch, getClassColor, getPhaseVisual, groupChildrenByLayout, hardwareLabel, humidifierTint, createLucideIcon as i, initialScrubState, isAbsentProvider, isFieldVisible, lawnMowerActivityMeta, lightColors, loadRemoteBundle, makeScrubBridge, metadataEntries, metadataString, mirror, mountAddonPage, Square as n, nextSort, normalizeForSearch, overrideEntityIdFromLink, parseRecordedServerMessage, providerIcons, EyeOff as r, resolveContainerPrimary, resolveControlAlign, resolveDeviceControl, resolveDisplayIcon, resolveEventKindIcon, resolvePrimaryChild, resolveSensorDisplay, scrubReducer, selectedDeviceOptions, serializeRecordedCommand, shouldCommit, shouldEmit, shouldUseSingleNode, sortRows, statusIcons, stripParentNamePrefix, Trash2 as t, tankAlert, themeToCss, trpc, useAccessoriesGetStatus, useAccessoriesSetChildHidden, useAddonPagesListPages, useAddonSettingsGetDeviceSettings, useAddonSettingsGetGlobalSettings, useAddonSettingsUpdateDeviceSettings, useAddonSettingsUpdateGlobalSettings, useAddonWidgetsListWidgets, useAddonsApplyAutoUpdateToAll, useAddonsCancelJob, useAddonsCustom, useAddonsForceRefresh, useAddonsGetAddonAutoUpdate, useAddonsGetAutoUpdateSettings, useAddonsGetJob, useAddonsGetLastRestart, useAddonsGetLogs, useAddonsGetVersions, useAddonsInstallFromWorkspace, useAddonsInstallPackage, useAddonsIsWorkspaceAvailable, useAddonsList, useAddonsListCapabilityProviders, useAddonsListFrameworkPackages, useAddonsListJobs, useAddonsListPackages, useAddonsListUpdates, useAddonsListWorkspacePackages, useAddonsOnAddonLogs, useAddonsReloadPackages, useAddonsRestartAddon, useAddonsRestartServer, useAddonsRetryLoad, useAddonsRollbackPackage, useAddonsSearchAvailable, useAddonsSetAddonAutoUpdate, useAddonsSetAutoUpdateSettings, useAddonsSetCapabilityProviderEnabled, useAddonsStartJob, useAddonsUninstallPackage, useAddonsUpdatePackage, useAirQualitySensorGetStatus, useAlarmPanelArm, useAlarmPanelDisarm, useAlarmPanelGetStatus, useAlarmPanelTrigger, useAlertsDismiss, useAlertsEmit, useAlertsGetUnreadCount, useAlertsList, useAlertsMarkAllRead, useAlertsMarkRead, useAlertsUpdate, useAllWidgets, useAmbientLightSensorGetStatus, useAudioAnalysisApplyDeviceSettingsPatch, useAudioAnalysisGetDeviceLiveContribution, useAudioAnalysisGetDeviceSettingsContribution, useAudioAnalysisResolveDeviceSettings, useAudioAnalyzerAnalyseChunk, useAudioAnalyzerClassify, useAudioAnalyzerDispose, useAudioAnalyzerIsReady, useAudioAnalyzerReprobeAudioEngine, useAudioCodecCanHandle, useAudioCodecCloseSession, useAudioCodecCreateDecodeSession, useAudioCodecCreateEncodeSession, useAudioCodecFlushEncode, useAudioCodecListActiveSessions, useAudioCodecListSupportedCodecs, useAudioCodecPullEncoded, useAudioCodecPullPcm, useAudioCodecPushEncodedFrame, useAudioCodecPushPcm, useAudioMetricsGetCurrentSnapshot, useAudioMetricsGetHistory, useAutomationControlDisable, useAutomationControlEnable, useAutomationControlGetStatus, useAutomationControlTrigger, useBackupDelete, useBackupGetEntries, useBackupList, useBackupListArchives, useBackupListDestinations, useBackupListLocations, useBackupPreviewSchedule, useBackupRestore, useBackupTrigger, useBackupUpsertDestinationPolicy, useBatteryGetStatus, useBatteryWakeForStream, useBinaryGetStatus, useBrightnessGetStatus, useBrightnessSetBrightness, useBrokerAdd, useBrokerGet, useBrokerGetBrokerConfig, useBrokerGetSettings, useBrokerGetSettingsSchema, useBrokerGetState, useBrokerGetStatus, useBrokerList, useBrokerListProviders, useBrokerPublish, useBrokerRemove, useBrokerSetSettings, useBrokerSubscribe, useBrokerTestConnection, useBrokerTestSettings, useBrokerUnsubscribe, useButtonPress, useCameraCredentialsGetCredentials, useCameraCredentialsGetStatus, useCameraPipelineConfigApplyDeviceSettingsPatch, useCameraPipelineConfigGetDeviceLiveContribution, useCameraPipelineConfigGetDeviceSettingsContribution, useCameraStreamsGetBrokerStreams, useCameraStreamsGetCameraStreams, useCameraStreamsGetProfileRtspEntries, useCameraStreamsGetRtspEntries, useCameraStreamsPickStream, useCarbonMonoxideGetStatus, useClimateControlGetStatus, useClimateControlSetFanMode, useClimateControlSetMode, useClimateControlSetPreset, useClimateControlSetSwingHorizontal, useClimateControlSetSwingVertical, useClimateControlSetTarget, useClimateControlSetTargetHumidity, useClimateControlSetTargetRange, useClusterNodes, useColorGetStatus, useColorSetColor, useConfirm, useConnectivityGetStatus, useConsumablesGetStatus, useConsumablesReset, useContactGetStatus, useContainerChildren, useControlGetStatus, useControlSetValue, useCoverClose, useCoverGetStatus, useCoverOpen, useCoverSetPosition, useCoverSetTiltPosition, useCoverStop, useCustomFieldRenderer, useDayNightGetOptions, useDayNightGetStatus, useDayNightSetSettings, useDebouncedString, useDecoderCreateSession, useDecoderDestroySession, useDecoderGetFrame, useDecoderGetInfo, useDecoderGetShmStats, useDecoderGetStats, useDecoderListActiveSessions, useDecoderOpenStream, useDecoderPullFrames, useDecoderPullHandles, useDecoderPushPacket, useDecoderReprobeHwaccel, useDecoderSupportsCodec, useDecoderUpdateConfig, useDetectionPipelineApplyDeviceSettingsPatch, useDetectionPipelineGetDeviceLiveContribution, useDetectionPipelineGetDeviceSettingsContribution, useDevShell, useDevice, useDeviceAdoptionAdopt, useDeviceAdoptionGetCandidate, useDeviceAdoptionGetStatus, useDeviceAdoptionListCandidateFilters, useDeviceAdoptionListCandidates, useDeviceAdoptionRefresh, useDeviceAdoptionRelease, useDeviceAdoptionResync, useDeviceAutotrack, useDeviceBattery, useDeviceCapSlice, useDeviceCapability, useDeviceDetections, useDeviceDiscoveryAdoptDevice, useDeviceDiscoveryGetStatus, useDeviceDiscoveryListDiscovered, useDeviceDiscoveryRefreshDiscovery, useDeviceDiscoveryReleaseDevice, useDeviceExportApplyDeviceSettingsPatch, useDeviceExportExposeDevice, useDeviceExportGetDeviceLiveContribution, useDeviceExportGetDeviceSettingsContribution, useDeviceExportGetStatus, useDeviceExportListExposedDevices, useDeviceExportListSupportedDeviceKinds, useDeviceExportUnexposeDevice, useDeviceId, useDeviceListPageSize, useDeviceManagerAddLocation, useDeviceManagerAdoptDevice, useDeviceManagerAdoptionAdopt, useDeviceManagerAdoptionListCandidateFilters, useDeviceManagerAdoptionListCandidates, useDeviceManagerAdoptionRefresh, useDeviceManagerAdoptionRelease, useDeviceManagerAdoptionResync, useDeviceManagerAllocateDeviceId, useDeviceManagerApplyDeviceSettingsPatch, useDeviceManagerApplyInitialMeta, useDeviceManagerCreateDevice, useDeviceManagerDisable, useDeviceManagerDiscoverAllProviders, useDeviceManagerDiscoverDevices, useDeviceManagerDiscoverProvider, useDeviceManagerDiscoveryProviders, useDeviceManagerEnable, useDeviceManagerGetAllBindings, useDeviceManagerGetBindings, useDeviceManagerGetChildren, useDeviceManagerGetConfigSchema, useDeviceManagerGetCreationSchema, useDeviceManagerGetDevice, useDeviceManagerGetDeviceAggregate, useDeviceManagerGetDeviceLiveContribution, useDeviceManagerGetDeviceLiveInfoAggregate, useDeviceManagerGetDeviceSettingsAggregate, useDeviceManagerGetDeviceSettingsContribution, useDeviceManagerGetDeviceStatusAggregate, useDeviceManagerGetLinkedDevices, useDeviceManagerGetRoleDisplayDefaults, useDeviceManagerGetSettingsSchema, useDeviceManagerGetStreamProfileMap, useDeviceManagerGetStreamSources, useDeviceManagerGetWireableFields, useDeviceManagerListAll, useDeviceManagerListBindableCapsForDeviceType, useDeviceManagerListLocations, useDeviceManagerListPersistedByAddon, useDeviceManagerListWrappersForCap, useDeviceManagerLoadConfig, useDeviceManagerLoadMeta, useDeviceManagerLoadRuntimeState, useDeviceManagerPersistConfig, useDeviceManagerProbeStreams, useDeviceManagerProviderCreationType, useDeviceManagerProviderDiscoveryParamsSchema, useDeviceManagerRegisterDevice, useDeviceManagerRemove, useDeviceManagerRemoveByIntegration, useDeviceManagerRemoveDevice, useDeviceManagerRemoveLocation, useDeviceManagerRunDeviceAction, useDeviceManagerSetChildLayout, useDeviceManagerSetDeviceLinks, useDeviceManagerSetDisabled, useDeviceManagerSetDisplay, useDeviceManagerSetIntegrationId, useDeviceManagerSetLinkDeviceId, useDeviceManagerSetLocation, useDeviceManagerSetMetadata, useDeviceManagerSetName, useDeviceManagerSetPrimaryChildEntityId, useDeviceManagerSetRole, useDeviceManagerSetRoleDisplayDefaults, useDeviceManagerSetStreamProfileMap, useDeviceManagerSetType, useDeviceManagerSetWrapperActive, useDeviceManagerTestCreationField, useDeviceManagerTestField, useDeviceManagerUpdateConfig, useDeviceManagerUpdateDeviceField, useDeviceManagerUpdateDeviceFieldsBatch, useDeviceOpsGetConfigEntries, useDeviceOpsGetRawState, useDeviceOpsGetSettingsSchema, useDeviceOpsGetStreamSources, useDeviceOpsRemoveDevice, useDeviceOpsRunAction, useDeviceOpsSetConfig, useDeviceProviderAdoptDiscoveredDevice, useDeviceProviderCreateDevice, useDeviceProviderDiscoverDevices, useDeviceProviderGetChildCreationSchema, useDeviceProviderGetDevices, useDeviceProviderGetDiscoveryParamsSchema, useDeviceProviderGetManualCreationType, useDeviceProviderGetStatus, useDeviceProviderStart, useDeviceProviderStop, useDeviceProviderSupportsDiscovery, useDeviceProviderSupportsManualCreation, useDeviceProviderTestCreationField, useDeviceProxy, useDeviceSnapshot, useDeviceSnapshotImage, useDeviceState, useDeviceStateGetAllSnapshots, useDeviceStateGetCapSlice, useDeviceStateGetSnapshot, useDeviceStateSetCapSlice, useDeviceStateSlice, useDeviceStatusGetStatus, useDeviceWebrtc, useDevices, useDoorbellApplyDeviceSettingsPatch, useDoorbellEvents, useDoorbellGetDeviceLiveContribution, useDoorbellGetDeviceSettingsContribution, useDoorbellGetStatus, useEnumSensorGetStatus, useEventEmitterGetStatus, useEventInvalidation, useEventStreamLatest, useEventStreamMap, useEventsGetEventClipUrl, useEventsGetEventThumbnail, useEventsGetEvents, useFaceGalleryAssignFace, useFaceGalleryAssignFaces, useFaceGalleryCreateIdentity, useFaceGalleryDeleteFace, useFaceGalleryDeleteIdentity, useFaceGalleryGetFaceByTrack, useFaceGalleryGetFaceMedia, useFaceGalleryListIdentities, useFaceGalleryListIdentitySamples, useFaceGalleryListRecentFaces, useFaceGalleryRemoveSample, useFaceGalleryRenameIdentity, useFaceGallerySuggestFaceClusters, useFaceGalleryUnassignFace, useFaceGalleryUnassignFaces, useFanControlGetStatus, useFanControlSetDirection, useFanControlSetOscillating, useFanControlSetPercentage, useFanControlSetPreset, useFeatureProbeGetStatus, useFloodGetStatus, useGasGetStatus, useHumidifierGetStatus, useHumidifierSetMode, useHumidifierSetOn, useHumidifierSetTargetHumidity, useHumiditySensorGetStatus, useImageGetStatus, useImageSettingsGetOptions, useImageSettingsGetStatus, useImageSettingsSetSettings, useIntegrationsCreate, useIntegrationsDelete, useIntegrationsGet, useIntegrationsGetAvailableTypes, useIntegrationsGetByAddonId, useIntegrationsGetSettings, useIntegrationsList, useIntegrationsSetSettings, useIntegrationsTestConnection, useIntegrationsUpdate, useIntercomEndTalkSession, useIntercomGetStatus, useIntercomHandleAnswer, useIntercomPushTalkAudio, useIntercomStartSession, useIntercomStartTalkSession, useIntercomStopSession, useIsMidWidth, useIsMobile, useLawnMowerControlDock, useLawnMowerControlGetStatus, useLawnMowerControlPause, useLawnMowerControlStartMowing, useLiveBuffer, useLiveEvent, useLlmDeleteModel, useLlmDeleteProfile, useLlmGenerate, useLlmGenerateVision, useLlmGetDefaults, useLlmGetRuntimeStatus, useLlmGetUsage, useLlmInstallModel, useLlmListModelCatalog, useLlmListModels, useLlmListNodeModels, useLlmListProfileKinds, useLlmListProfiles, useLlmListRuntimeNodes, useLlmSetDefault, useLlmStartRuntime, useLlmStopRuntime, useLlmTestProfile, useLlmUpsertProfile, useLocalNetworkGetAllowedAddresses, useLocalNetworkGetConnectionEndpoints, useLocalNetworkGetPreferred, useLocalNetworkList, useLocalNetworkResetAllowlistToBestMatch, useLocalNetworkSetAllowedAddresses, useLockControlGetStatus, useLockControlLock, useLockControlOpen, useLockControlUnlock, useMediaPlayerGetStatus, useMediaPlayerNext, useMediaPlayerPause, useMediaPlayerPlay, useMediaPlayerPlayMedia, useMediaPlayerPrevious, useMediaPlayerSeek, useMediaPlayerSelectSource, useMediaPlayerSetMute, useMediaPlayerSetRepeat, useMediaPlayerSetShuffle, useMediaPlayerSetVolume, useMediaPlayerStop, useMeshNetworkGetStatus, useMeshNetworkJoin, useMeshNetworkLeave, useMeshNetworkListPeers, useMeshNetworkLogout, useMeshNetworkStartLogin, useMeshNetworkTestConnection, useMetricsProviderCollectSnapshot, useMetricsProviderDumpHeapSnapshot, useMetricsProviderGetAddonStats, useMetricsProviderGetCached, useMetricsProviderGetCpuTemperature, useMetricsProviderGetCurrent, useMetricsProviderGetDiskSpace, useMetricsProviderGetGpuInfo, useMetricsProviderGetProcessStats, useMetricsProviderKillProcess, useMetricsProviderListAddonInstances, useMetricsProviderListNodeProcesses, useMotionDetectionAnalyze, useMotionDetectionApplyDeviceSettingsPatch, useMotionDetectionGetDeviceLiveContribution, useMotionDetectionGetDeviceSettingsContribution, useMotionDetectionRemoveCamera, useMotionDetectionReset, useMotionGetStatus, useMotionIsDetected, useMotionTriggerGetStatus, useMotionTriggerSetMotionTrigger, useMotionZonesGetOptions, useMotionZonesGetStatus, useMotionZonesSetZone, useMqttBrokerAddBroker, useMqttBrokerGetBrokerConfig, useMqttBrokerGetStatus, useMqttBrokerListBrokers, useMqttBrokerRemoveBroker, useMqttBrokerStartEmbeddedBroker, useMqttBrokerStopEmbeddedBroker, useMqttBrokerTestConnection, useNativeObjectDetectionGetStatus, useNativeObjectDetectionSetEnabled, useNetworkAccessGetEndpoint, useNetworkAccessGetStatus, useNetworkAccessListEndpoints, useNetworkAccessStart, useNetworkAccessStop, useNetworkQualityGetAllStats, useNetworkQualityGetDeviceStats, useNetworkQualityReportClientStats, useNodesClusterAddonStatus, useNodesDeployAddon, useNodesExecuteQuery, useNodesGetCapUsageGraph, useNodesGetNodeAddons, useNodesRenameNode, useNodesRestartAddon, useNodesRestartNode, useNodesRestartProcess, useNodesSetProcessLogLevel, useNodesShutdownNode, useNodesTopology, useNodesUndeployAddon, useNotificationOutputDeleteTarget, useNotificationOutputDiscoverTargets, useNotificationOutputListTargetKinds, useNotificationOutputListTargets, useNotificationOutputSend, useNotificationOutputSetTargetEnabled, useNotificationOutputTestTarget, useNotificationOutputUpsertTarget, useNotifierCancel, useNotifierGetStatus, useNotifierSend, useNumericSensorGetStatus, useOptimisticSlice, useOptionalSystem, useOptionalWidgetRegistry, useOsdGetStatus, useOsdSetOverlay, usePTZ, usePetFeederCallPet, usePetFeederCancelFeed, usePetFeederFeed, usePetFeederGetStatus, usePetFeederMarkFoodReplenished, usePetFeederPlaySound, usePetFeederResetDesiccant, usePetFeederSetChildLock, usePetFeederSetFeedSound, usePetFeederSetIndicatorLight, usePetFeederSetVolume, usePipelineAnalyticsApplyDeviceSettingsPatch, usePipelineAnalyticsClearTracks, usePipelineAnalyticsDeleteDeviceEvents, usePipelineAnalyticsDeleteTracks, usePipelineAnalyticsGetActiveTracks, usePipelineAnalyticsGetAudioEvents, usePipelineAnalyticsGetDeviceLiveContribution, usePipelineAnalyticsGetDeviceSettingsContribution, usePipelineAnalyticsGetEventDensity, usePipelineAnalyticsGetEventMedia, usePipelineAnalyticsGetEventStoreFootprint, usePipelineAnalyticsGetKeyEvents, usePipelineAnalyticsGetMotionEvents, usePipelineAnalyticsGetObjectEvents, usePipelineAnalyticsGetSensorEvents, usePipelineAnalyticsGetTrack, usePipelineAnalyticsGetTrackMedia, usePipelineAnalyticsListEventKinds, usePipelineAnalyticsListOpsLog, usePipelineAnalyticsListRecentTracks, usePipelineAnalyticsListTracks, usePipelineAnalyticsPruneEvents, usePipelineAnalyticsPruneEventsBefore, usePipelineAnalyticsPruneTracksBefore, usePipelineAnalyticsSearchObjectEvents, usePipelineAnalyticsWipeAllAnalytics, usePipelineExecutorCacheFrameInPool, usePipelineExecutorClearDeviceOverrides, usePipelineExecutorDeleteModel, usePipelineExecutorDeleteTemplate, usePipelineExecutorDownloadModel, usePipelineExecutorGetAddonModels, usePipelineExecutorGetAudioCapabilities, usePipelineExecutorGetAvailableEngines, usePipelineExecutorGetCapabilities, usePipelineExecutorGetDefaultSteps, usePipelineExecutorGetDetectionConfigSchema, usePipelineExecutorGetEffectiveTuning, usePipelineExecutorGetEngineProvisioning, usePipelineExecutorGetGlobalPipelineConfig, usePipelineExecutorGetGlobalSteps, usePipelineExecutorGetOrchestratorConfigSchema, usePipelineExecutorGetReferenceAudio, usePipelineExecutorGetReferenceAudioFiles, usePipelineExecutorGetReferenceImage, usePipelineExecutorGetSchema, usePipelineExecutorGetSelectedEngine, usePipelineExecutorGetVideoPipelineSteps, usePipelineExecutorInferCached, usePipelineExecutorKillEngine, usePipelineExecutorListLoadedEngines, usePipelineExecutorListReferenceImages, usePipelineExecutorListTemplates, usePipelineExecutorReprobeEngine, usePipelineExecutorRunAudioTest, usePipelineExecutorRunPipeline, usePipelineExecutorRunPipelineBatch, usePipelineExecutorSaveTemplate, usePipelineExecutorSetVideoPipelineSteps, usePipelineExecutorSpinEngine, usePipelineExecutorUncacheFrame, usePipelineExecutorUpdateTemplate, usePipelineExecutorValidatePipeline, usePipelineOrchestratorApplyDeviceSettingsPatch, usePipelineOrchestratorAssignAudio, usePipelineOrchestratorAssignPipeline, usePipelineOrchestratorDeleteTemplate, usePipelineOrchestratorGetAgentLoad, usePipelineOrchestratorGetAgentSettings, usePipelineOrchestratorGetAudioAssignment, usePipelineOrchestratorGetAudioAssignments, usePipelineOrchestratorGetAudioNodeLoad, usePipelineOrchestratorGetCameraMetrics, usePipelineOrchestratorGetCameraSettings, usePipelineOrchestratorGetCameraStatus, usePipelineOrchestratorGetCameraStatuses, usePipelineOrchestratorGetCameraStepOverrides, usePipelineOrchestratorGetCapabilityBindings, usePipelineOrchestratorGetDeviceLiveContribution, usePipelineOrchestratorGetDeviceSettingsContribution, usePipelineOrchestratorGetGlobalMetrics, usePipelineOrchestratorGetIngestOwner, usePipelineOrchestratorGetPipelineAssignment, usePipelineOrchestratorGetPipelineAssignments, usePipelineOrchestratorListAgentSettings, usePipelineOrchestratorListTemplates, usePipelineOrchestratorRebalance, usePipelineOrchestratorRemoveAgentSettings, usePipelineOrchestratorResetNodePipelineDefaults, usePipelineOrchestratorResolvePipeline, usePipelineOrchestratorSaveTemplate, usePipelineOrchestratorSetAgentAddonDefaults, usePipelineOrchestratorSetAgentCapabilities, usePipelineOrchestratorSetAgentDetectWeight, usePipelineOrchestratorSetAgentInferenceDevices, usePipelineOrchestratorSetAgentMaxCameras, usePipelineOrchestratorSetAgentReachableHost, usePipelineOrchestratorSetCameraPipelineForAgent, usePipelineOrchestratorSetCameraStepOverride, usePipelineOrchestratorSetCameraStepToggle, usePipelineOrchestratorSetCapabilityBinding, usePipelineOrchestratorUnassignAudio, usePipelineOrchestratorUnassignPipeline, usePipelineOrchestratorUpdateTemplate, usePipelineRunnerAttachCamera, usePipelineRunnerDetachCamera, usePipelineRunnerGetAllCameraMetrics, usePipelineRunnerGetCameraMetrics, usePipelineRunnerGetLocalCameras, usePipelineRunnerGetLocalLoad, usePipelineRunnerGetLocalMetrics, usePipelineRunnerGetNativeCrop, usePipelineRunnerReportMotion, usePipelineRunnerRunDetailSubtree, usePlateGalleryAssignPlate, usePlateGalleryAssignPlates, usePlateGalleryCorrectPlateText, usePlateGalleryCreateVehicle, usePlateGalleryDeletePlate, usePlateGalleryDeleteVehicle, usePlateGalleryGetPlateByTrack, usePlateGalleryGetPlateMedia, usePlateGalleryListPlates, usePlateGalleryListVehicleSamples, usePlateGalleryListVehicles, usePlateGalleryRemoveVehicleSample, usePlateGalleryRenameVehicle, usePlateGallerySearchPlates, usePlateGallerySuggestPlateClusters, usePlateGalleryUnassignPlate, usePlateGalleryUnassignPlates, usePlayerOverlayLayer, usePlayerOverlayLayers, usePlayerToolbarButton, usePlayerToolbarButtons, usePowerMeterGetStatus, usePresenceGetStatus, usePressureSensorGetStatus, usePrivacyMaskGetOptions, usePrivacyMaskGetStatus, usePrivacyMaskSetMask, usePtzAutotrackGetSettings, usePtzAutotrackGetStatus, usePtzAutotrackSetEnabled, usePtzAutotrackSetSettings, usePtzContinuousMove, usePtzDeletePreset, usePtzGetOptions, usePtzGetPosition, usePtzGetPresets, usePtzGetStatus, usePtzGoHome, usePtzGoToPreset, usePtzMove, usePtzSavePreset, usePtzSetAutofocus, usePtzStop, useRebootReboot, useRecordedPlayback, useRecordingApplyDeviceSettingsPatch, useRecordingDeleteFootprint, useRecordingExportCancelExport, useRecordingExportCreateExport, useRecordingExportDeleteExport, useRecordingExportGetDownloadUrl, useRecordingExportGetExport, useRecordingExportListExports, useRecordingGetAvailability, useRecordingGetDaysWithRecordings, useRecordingGetDeviceConfig, useRecordingGetDeviceLiveContribution, useRecordingGetDeviceSettingsContribution, useRecordingGetPlaybackManifest, useRecordingGetStatus, useRecordingGetStorageUsage, useRecordingListOpsLog, useRecordingLocateSegment, useRecordingPruneFootage, useRecordingReadSegmentBytes, useRecordingRescanStorage, useRecordingSetDeviceConfig, useRemoteComponent, useSceneMonitorCaptureReference, useSceneMonitorCreateScene, useSceneMonitorDeleteReference, useSceneMonitorDeleteScene, useSceneMonitorGetStatus, useSceneMonitorListScenes, useSceneMonitorRecheckNow, useSceneMonitorUpdateScene, useScriptRunnerGetStatus, useScriptRunnerRun, useScriptRunnerStop, useScrubController, useServerManagementApplyServerUpdate, useServerManagementCheckServerUpdate, useServerManagementGetServerPackageStatus, useServerManagementRestartServer, useServerManagementRollbackServerUpdate, useSettingsStoreCount, useSettingsStoreDeclareCollection, useSettingsStoreDelete, useSettingsStoreGet, useSettingsStoreHistogram, useSettingsStoreInsert, useSettingsStoreIsEmpty, useSettingsStoreQuery, useSettingsStoreSet, useSettingsStoreUpdate, useSmokeGetStatus, useSnapshotApplyDeviceSettingsPatch, useSnapshotGetDeviceLiveContribution, useSnapshotGetDeviceSettingsContribution, useSnapshotGetSnapshot, useSnapshotGetSnapshotOverview, useSnapshotGetStatus, useSnapshotInvalidateCache, useStorageAbortUpload, useStorageBeginDownload, useStorageBeginUpload, useStorageDelete, useStorageDeleteLocation, useStorageEndDownload, useStorageExists, useStorageFinalizeUpload, useStorageGetAvailableSpace, useStorageGetDefaultLocation, useStorageList, useStorageListLocationDeclarations, useStorageListLocations, useStorageListProviders, useStorageRead, useStorageReadChunk, useStorageResolve, useStorageTestConfig, useStorageTestLocation, useStorageUpsertLocation, useStorageWrite, useStorageWriteChunk, useStreamBrokerApplyDeviceSettingsPatch, useStreamBrokerAssignProfile, useStreamBrokerGetAllRtspEntries, useStreamBrokerGetBrokerStats, useStreamBrokerGetDeviceLiveContribution, useStreamBrokerGetDeviceSettingsContribution, useStreamBrokerGetPreBufferInfo, useStreamBrokerGetRtspEntry, useStreamBrokerGetRtspPort, useStreamBrokerGetStreamUrl, useStreamBrokerGetStreamWithCodec, useStreamBrokerIsRtspEnabled, useStreamBrokerKillClient, useStreamBrokerListAllCameraStreams, useStreamBrokerListAllProfileSlots, useStreamBrokerListClients, useStreamBrokerProbeStream, useStreamBrokerPublishCameraStream, useStreamBrokerPullAudioChunks, useStreamBrokerPullFrameHandles, useStreamBrokerRegenerateRtspToken, useStreamBrokerReleaseStreamWithCodec, useStreamBrokerRestartProfile, useStreamBrokerRetractCameraStream, useStreamBrokerSetPreBufferDuration, useStreamBrokerSetRtspEnabled, useStreamBrokerSubscribeAudioChunks, useStreamBrokerSubscribeFrames, useStreamBrokerUnassignProfile, useStreamBrokerUnsubscribeAudioChunks, useStreamBrokerUnsubscribeFrames, useStreamCatalogGetCatalog, useStreamParamsGetConfigSchema, useStreamParamsGetOptions, useStreamParamsGetStatus, useStreamParamsSetProfile, useSwitchGetStatus, useSwitchSetState, useSystem, useSystemFeatureFlags, useSystemForceRetentionCleanup, useSystemGetRetentionConfig, useSystemHealth, useSystemInfo, useSystemMutation, useSystemNetworkAddresses, useSystemQuery, useSystemSetRetentionConfig, useTamperGetStatus, useTemperatureSensorGetStatus, useThemeMode, useToastOnToast, useTurnProviderGetTurnServers, useUpdateGetStatus, useUpdateInstallUpdate, useUserManagementConfirmTotp, useUserManagementCreateApiKey, useUserManagementCreateScopedToken, useUserManagementCreateUser, useUserManagementDeleteUser, useUserManagementDisableTotp, useUserManagementGetTotpStatus, useUserManagementListApiKeys, useUserManagementListOauthSessions, useUserManagementListScopedTokens, useUserManagementListUsers, useUserManagementOauthExchangeCode, useUserManagementOauthIssueCode, useUserManagementOauthRefresh, useUserManagementOauthVerifyAccessToken, useUserManagementResetPassword, useUserManagementRevokeApiKey, useUserManagementRevokeOauthSession, useUserManagementRevokeScopedToken, useUserManagementSetUserScopes, useUserManagementSetupTotp, useUserManagementUpdateUser, useUserManagementValidateApiKey, useUserManagementValidateCredentials, useUserManagementValidateScopedToken, useUserManagementVerifyTotp, useVacuumControlGetStatus, useVacuumControlLocate, useVacuumControlPause, useVacuumControlReturnToBase, useVacuumControlSetFanSpeed, useVacuumControlStart, useVacuumControlStop, useValveClose, useValveGetStatus, useValveOpen, useValveSetPosition, useValveStop, useVibrationGetStatus, useVideoclipsGetClipPlayback, useVideoclipsListClips, useVodPlayback, useWaterHeaterGetStatus, useWaterHeaterSetAway, useWaterHeaterSetOperationMode, useWaterHeaterSetTargetTemp, useWeatherGetStatus, useWebrtcSessionAddIceCandidate, useWebrtcSessionCloseSession, useWebrtcSessionCreateSession, useWebrtcSessionGetIceCandidates, useWebrtcSessionGetSessionState, useWebrtcSessionHandleAnswer, useWebrtcSessionHandleOffer, useWebrtcSessionHasAdaptiveBitrate, useWebrtcSessionListStreams, useWidget, useWidgetMetadata, useWidgetRegistry, useZoneAnalyticsGetCameraHistory, useZoneAnalyticsGetCurrentSnapshot, useZoneAnalyticsGetUnzonedHistory, useZoneAnalyticsGetZoneHistory, useZoneEditing, useZoneRulesListRules, useZoneRulesSetRules, useZonesAddZone, useZonesListZones, useZonesRemoveZone, useZonesUpdateZone, vacuumStateMeta, validateScopes, valveStateMeta, waterHeaterPhase, waterHeaterTint, weatherConditionMeta, weatherTint };
47031
+ export { AddonGlobalSettingsForm, AgentStepEditor, AlarmHeroCard, AlarmInlineControl as AlarmPanelInlineControl, AppShell, ArcKnob, AudioClassificationList, AudioLevelWaveform, AudioWaveform, AutotrackSection, BTN_COMPACT, BTN_COMPACT_DANGER, BTN_COMPACT_PRIMARY, BTN_COMPACT_WARNING, Badge, BatteryBadge, BottomSheet, Breadcrumb, BrightnessPanel, Button, ButtonControl, ButtonHeroCard, CENTER, CHIP_ACTIVE, CHIP_BASE, CHIP_INACTIVE, CLASS_COLORS, COLUMN_BREAKPOINT_CLASS, COLUMN_PRIORITY, COMMIT_DEDUPE_TOLERANCE_MS, COMMIT_DEDUPE_WINDOW_MS, CONTROL_CAP_NAMES, CONTROL_FILLS, CameraStreamPlayer, Card, Checkbox, ChildSectionAccordion, ClimatePanel, CodeBlock, CollapsibleCard, ConfigFormBuilder, FormField as ConfigFormField, ConfigSchemaField, ConfirmActionButton, ConfirmDialogProvider, ConsumablesPanel, ContainerChildrenProvider, ContainerPrimaryHero, ControlColumn, ControlHeroCard, ControlInlineControl, ControlPanel, CopyButton, CoverHeroCard, CoverInlineControl, CoverPanel, CustomFieldRenderersProvider, DEFAULT_COLOR, DEVICE_COLUMNS, DEVICE_LIST_PAGE_SIZE_KEY, DEVICE_LIST_PAGE_SIZE_OPTIONS, DEVICE_ROLE_META, DEVICE_TYPE_CONTROL, DEVICE_TYPE_META, DISPLAY_ICON_REGISTRY, DataTable, DetectionCanvas, DetectionOverlay, DetectionResultTree, DevShell, DeviceActivityPanel, DeviceBatchToolbar, DeviceCard, DeviceContextProvider, DeviceExportPanel, DeviceGrid, DeviceItem, DeviceList, DeviceMultiSelectField, DeviceSelectField, DeviceStepMatrix, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, DiscoveryPanel, DoorbellRecentPanel, Dropdown, DropdownContent, DropdownItem, DropdownTrigger, DummyHeroCard, DummyInline, EVENT_KIND_ICONS, EmptyState, ErrorBox, EventKindGlyph, EventStream, FILL, FanHeroCard, FanInlineControl, FanPanel, FilterBar, FloatingEventStream, FloatingLogStream, FloatingPanel, FormField$1 as FormField, GRID_GAP, GRID_PAIRED, GRID_QUICK_STATS, GripTrack, GroupedModelSelector, HOST_WIDGETS, HlsVideo, HoverZoomImage, HumidifierHeroCard, HumidifierInlineControl, INPUT_COMPACT, IconAction, IconButton, ImageHeroCard, ImageInlineControl, ImageSelector, InferenceConfigSelector, Input, KebabMenu, KeyValueList, LIST_ROW, Label, LawnMowerHeroCard, LawnMowerInlineControl, LightHeroCard, LightInlineControl, LockHeroCard, LockInlineControl, LockPanel, LogStream, LoginForm, MODE_COLOR, MaskShapeCanvas, MediaPlayerHeroCard, MediaPlayerInlineControl, MediaPlayerPanel, MobileDrawer, ModelPicker, MotionZonesSettings, NodeMultiSelectField, NodePicker, NodeSelectField, OfflineBadge, PHASE_CONFIG, PRIORITY, PTZOverlay, PageHeader, PhaseIcon, PipelineBuilder, PipelineRuntimeSelector, PipelineStep, PipelineTreeMatrix, PlayerOverlaysProvider, Popover, PopoverContent, PopoverRowAction, PopoverTrigger, PrimaryChildPicker, PrivacyMaskSettings, ProviderBadge, PtzPanel, QrCode, RECORDED_PLAYBACK_MODES, RIGHT, ROLE_DESCRIPTOR, RadialGauge, RecordedPlaybackProvider, RecordingPanel, ResponseLog, SECTION_BODY, SECTION_CARD, SECTION_HEADER, SPLIT_PANEL_OUTER, SPLIT_PANEL_SIDE, STACK_GAP, STATE_COLOR, ScopePicker, ScrollArea, Select, SemanticBadge, SensorHeroCard, SensorInlineControl, SensorValueAtom, Separator, Sidebar, SidebarItem, Skeleton, SlideOverPanel, SlideToggle, SnapshotButton, StatCard, StateValuesStream, StatusBadge, StepTimings, StepTreeMaster, Stepper, StreamBrokerSelector, StreamPanel, Switch, SwitchHeroCard, SwitchInlineControl, SwitchPanel, SystemProvider, TEXT_FIELD_LABEL, TEXT_HINT, TEXT_METRIC, TEXT_SECTION_LABEL, TEXT_VALUE, TIMEZONES, Tabs, TabsContent, TabsList, TabsTrigger, TapToggle, ThemeProvider, ThermostatHeroCard, ThermostatInlineControl, TimezoneSelector, Tooltip, TooltipContent, TooltipTrigger, VacuumHeroCard, VacuumInlineControl, ValueReadout, ValveHeroCard, ValveInlineControl, VersionBadge, VodPlaybackProvider, WaterHeaterHeroCard, WaterHeaterInlineControl, WeatherHeroCard, WeatherInlineControl, WidgetMetricCard, WidgetPanel, WidgetRegistryProvider, WidgetSlot, ZoneEditingProvider, agentColumnKey, allDeviceTypeFilterOptions, buildStepTreeFromSchema, childEntityId, childListName, cn, columnsForContext, containerChildToRef, countableDevices, coverHighlight, createSharedContext, createTheme, cursorFractionFor, darkColors, defaultTheme, deriveDeviceKind, deviceMatchesFilter, deviceOptionLabel, deviceRoleMeta, deviceRoleMetaOf, deviceTypeMeta, deviceTypeMetaOf, devicesToOptions, ensureMfHostInit, eventKindLabel, filterDeviceOptions, findTimezone, formatControlDateTime, formatLastSeen, formatNumeric, fuzzyMatch, getClassColor, getPhaseVisual, groupAgentColumns, groupChildrenByLayout, hardwareLabel, humidifierTint, createLucideIcon as i, initialScrubState, isAbsentProvider, isFieldVisible, lawnMowerActivityMeta, lightColors, loadRemoteBundle, makeScrubBridge, metadataEntries, metadataString, mirror, mountAddonPage, Square as n, nextSort, normalizeForSearch, overrideEntityIdFromLink, parseRecordedServerMessage, providerIcons, EyeOff as r, resolveContainerPrimary, resolveControlAlign, resolveDeviceControl, resolveDisplayIcon, resolveEventKindIcon, resolvePrimaryChild, resolveSensorDisplay, scrubReducer, selectedDeviceOptions, serializeRecordedCommand, shouldCommit, shouldEmit, shouldUseSingleNode, sortRows, statusIcons, stripParentNamePrefix, Trash2 as t, tankAlert, themeToCss, trpc, useAccessoriesGetStatus, useAccessoriesSetChildHidden, useAddonPagesListPages, useAddonSettingsGetDeviceSettings, useAddonSettingsGetGlobalSettings, useAddonSettingsUpdateDeviceSettings, useAddonSettingsUpdateGlobalSettings, useAddonWidgetsListWidgets, useAddonsApplyAutoUpdateToAll, useAddonsCancelJob, useAddonsCustom, useAddonsForceRefresh, useAddonsGetAddonAutoUpdate, useAddonsGetAutoUpdateSettings, useAddonsGetJob, useAddonsGetLastRestart, useAddonsGetLogs, useAddonsGetVersions, useAddonsInstallFromWorkspace, useAddonsInstallPackage, useAddonsIsWorkspaceAvailable, useAddonsList, useAddonsListCapabilityProviders, useAddonsListFrameworkPackages, useAddonsListJobs, useAddonsListPackages, useAddonsListUpdates, useAddonsListWorkspacePackages, useAddonsOnAddonLogs, useAddonsReloadPackages, useAddonsRestartAddon, useAddonsRestartServer, useAddonsRetryLoad, useAddonsRollbackPackage, useAddonsSearchAvailable, useAddonsSetAddonAutoUpdate, useAddonsSetAutoUpdateSettings, useAddonsSetCapabilityProviderEnabled, useAddonsStartJob, useAddonsUninstallPackage, useAddonsUpdatePackage, useAirQualitySensorGetStatus, useAlarmPanelArm, useAlarmPanelDisarm, useAlarmPanelGetStatus, useAlarmPanelTrigger, useAlertsDismiss, useAlertsEmit, useAlertsGetUnreadCount, useAlertsList, useAlertsMarkAllRead, useAlertsMarkRead, useAlertsUpdate, useAllWidgets, useAmbientLightSensorGetStatus, useAudioAnalysisApplyDeviceSettingsPatch, useAudioAnalysisGetDeviceLiveContribution, useAudioAnalysisGetDeviceSettingsContribution, useAudioAnalysisResolveDeviceSettings, useAudioAnalyzerAnalyseChunk, useAudioAnalyzerClassify, useAudioAnalyzerDispose, useAudioAnalyzerIsReady, useAudioAnalyzerReprobeAudioEngine, useAudioCodecCanHandle, useAudioCodecCloseSession, useAudioCodecCreateDecodeSession, useAudioCodecCreateEncodeSession, useAudioCodecFlushEncode, useAudioCodecListActiveSessions, useAudioCodecListSupportedCodecs, useAudioCodecPullEncoded, useAudioCodecPullPcm, useAudioCodecPushEncodedFrame, useAudioCodecPushPcm, useAudioMetricsGetCurrentSnapshot, useAudioMetricsGetHistory, useAutomationControlDisable, useAutomationControlEnable, useAutomationControlGetStatus, useAutomationControlTrigger, useBackupDelete, useBackupGetEntries, useBackupList, useBackupListArchives, useBackupListDestinations, useBackupListLocations, useBackupPreviewSchedule, useBackupRestore, useBackupTrigger, useBackupUpsertDestinationPolicy, useBatteryGetStatus, useBatteryWakeForStream, useBinaryGetStatus, useBrightnessGetStatus, useBrightnessSetBrightness, useBrokerAdd, useBrokerGet, useBrokerGetBrokerConfig, useBrokerGetSettings, useBrokerGetSettingsSchema, useBrokerGetState, useBrokerGetStatus, useBrokerList, useBrokerListProviders, useBrokerPublish, useBrokerRemove, useBrokerSetSettings, useBrokerSubscribe, useBrokerTestConnection, useBrokerTestSettings, useBrokerUnsubscribe, useButtonPress, useCameraCredentialsGetCredentials, useCameraCredentialsGetStatus, useCameraPipelineConfigApplyDeviceSettingsPatch, useCameraPipelineConfigGetDeviceLiveContribution, useCameraPipelineConfigGetDeviceSettingsContribution, useCameraStreamsGetBrokerStreams, useCameraStreamsGetCameraStreams, useCameraStreamsGetProfileRtspEntries, useCameraStreamsGetRtspEntries, useCameraStreamsPickStream, useCarbonMonoxideGetStatus, useClimateControlGetStatus, useClimateControlSetFanMode, useClimateControlSetMode, useClimateControlSetPreset, useClimateControlSetSwingHorizontal, useClimateControlSetSwingVertical, useClimateControlSetTarget, useClimateControlSetTargetHumidity, useClimateControlSetTargetRange, useClusterNodes, useColorGetStatus, useColorSetColor, useConfirm, useConnectivityGetStatus, useConsumablesGetStatus, useConsumablesReset, useContactGetStatus, useContainerChildren, useControlGetStatus, useControlSetValue, useCoverClose, useCoverGetStatus, useCoverOpen, useCoverSetPosition, useCoverSetTiltPosition, useCoverStop, useCustomFieldRenderer, useDayNightGetOptions, useDayNightGetStatus, useDayNightSetSettings, useDebouncedString, useDecoderCreateSession, useDecoderDestroySession, useDecoderGetFrame, useDecoderGetInfo, useDecoderGetShmStats, useDecoderGetStats, useDecoderListActiveSessions, useDecoderOpenStream, useDecoderPullFrames, useDecoderPullHandles, useDecoderPushPacket, useDecoderReprobeHwaccel, useDecoderSupportsCodec, useDecoderUpdateConfig, useDetectionPipelineApplyDeviceSettingsPatch, useDetectionPipelineGetDeviceLiveContribution, useDetectionPipelineGetDeviceSettingsContribution, useDevShell, useDevice, useDeviceAdoptionAdopt, useDeviceAdoptionGetCandidate, useDeviceAdoptionGetStatus, useDeviceAdoptionListCandidateFilters, useDeviceAdoptionListCandidates, useDeviceAdoptionRefresh, useDeviceAdoptionRelease, useDeviceAdoptionResync, useDeviceAutotrack, useDeviceBattery, useDeviceCapSlice, useDeviceCapability, useDeviceDetections, useDeviceDiscoveryAdoptDevice, useDeviceDiscoveryGetStatus, useDeviceDiscoveryListDiscovered, useDeviceDiscoveryRefreshDiscovery, useDeviceDiscoveryReleaseDevice, useDeviceExportApplyDeviceSettingsPatch, useDeviceExportExposeDevice, useDeviceExportGetDeviceLiveContribution, useDeviceExportGetDeviceSettingsContribution, useDeviceExportGetStatus, useDeviceExportListExposedDevices, useDeviceExportListSupportedDeviceKinds, useDeviceExportUnexposeDevice, useDeviceId, useDeviceListPageSize, useDeviceManagerAddLocation, useDeviceManagerAdoptDevice, useDeviceManagerAdoptionAdopt, useDeviceManagerAdoptionListCandidateFilters, useDeviceManagerAdoptionListCandidates, useDeviceManagerAdoptionRefresh, useDeviceManagerAdoptionRelease, useDeviceManagerAdoptionResync, useDeviceManagerAllocateDeviceId, useDeviceManagerApplyDeviceSettingsPatch, useDeviceManagerApplyInitialMeta, useDeviceManagerCreateDevice, useDeviceManagerDisable, useDeviceManagerDiscoverAllProviders, useDeviceManagerDiscoverDevices, useDeviceManagerDiscoverProvider, useDeviceManagerDiscoveryProviders, useDeviceManagerEnable, useDeviceManagerGetAllBindings, useDeviceManagerGetBindings, useDeviceManagerGetChildren, useDeviceManagerGetConfigSchema, useDeviceManagerGetCreationSchema, useDeviceManagerGetDevice, useDeviceManagerGetDeviceAggregate, useDeviceManagerGetDeviceLiveContribution, useDeviceManagerGetDeviceLiveInfoAggregate, useDeviceManagerGetDeviceSettingsAggregate, useDeviceManagerGetDeviceSettingsContribution, useDeviceManagerGetDeviceStatusAggregate, useDeviceManagerGetLinkedDevices, useDeviceManagerGetRoleDisplayDefaults, useDeviceManagerGetSettingsSchema, useDeviceManagerGetStreamProfileMap, useDeviceManagerGetStreamSources, useDeviceManagerGetWireableFields, useDeviceManagerListAll, useDeviceManagerListBindableCapsForDeviceType, useDeviceManagerListLocations, useDeviceManagerListPersistedByAddon, useDeviceManagerListWrappersForCap, useDeviceManagerLoadConfig, useDeviceManagerLoadMeta, useDeviceManagerLoadRuntimeState, useDeviceManagerPersistConfig, useDeviceManagerProbeStreams, useDeviceManagerProviderCreationType, useDeviceManagerProviderDiscoveryParamsSchema, useDeviceManagerRegisterDevice, useDeviceManagerRemove, useDeviceManagerRemoveByIntegration, useDeviceManagerRemoveDevice, useDeviceManagerRemoveLocation, useDeviceManagerRunDeviceAction, useDeviceManagerSetChildLayout, useDeviceManagerSetDeviceLinks, useDeviceManagerSetDisabled, useDeviceManagerSetDisplay, useDeviceManagerSetIntegrationId, useDeviceManagerSetLinkDeviceId, useDeviceManagerSetLocation, useDeviceManagerSetMetadata, useDeviceManagerSetName, useDeviceManagerSetPrimaryChildEntityId, useDeviceManagerSetRole, useDeviceManagerSetRoleDisplayDefaults, useDeviceManagerSetStreamProfileMap, useDeviceManagerSetType, useDeviceManagerSetWrapperActive, useDeviceManagerTestCreationField, useDeviceManagerTestField, useDeviceManagerUpdateConfig, useDeviceManagerUpdateDeviceField, useDeviceManagerUpdateDeviceFieldsBatch, useDeviceOpsGetConfigEntries, useDeviceOpsGetRawState, useDeviceOpsGetSettingsSchema, useDeviceOpsGetStreamSources, useDeviceOpsRemoveDevice, useDeviceOpsRunAction, useDeviceOpsSetConfig, useDeviceProviderAdoptDiscoveredDevice, useDeviceProviderCreateDevice, useDeviceProviderDiscoverDevices, useDeviceProviderGetChildCreationSchema, useDeviceProviderGetDevices, useDeviceProviderGetDiscoveryParamsSchema, useDeviceProviderGetManualCreationType, useDeviceProviderGetStatus, useDeviceProviderStart, useDeviceProviderStop, useDeviceProviderSupportsDiscovery, useDeviceProviderSupportsManualCreation, useDeviceProviderTestCreationField, useDeviceProxy, useDeviceSnapshot, useDeviceSnapshotImage, useDeviceState, useDeviceStateGetAllSnapshots, useDeviceStateGetCapSlice, useDeviceStateGetSnapshot, useDeviceStateSetCapSlice, useDeviceStateSlice, useDeviceStatusGetStatus, useDeviceWebrtc, useDevices, useDoorbellApplyDeviceSettingsPatch, useDoorbellEvents, useDoorbellGetDeviceLiveContribution, useDoorbellGetDeviceSettingsContribution, useDoorbellGetStatus, useEnumSensorGetStatus, useEventEmitterGetStatus, useEventInvalidation, useEventStreamLatest, useEventStreamMap, useEventsGetEventClipUrl, useEventsGetEventThumbnail, useEventsGetEvents, useFaceGalleryAssignFace, useFaceGalleryAssignFaces, useFaceGalleryCreateIdentity, useFaceGalleryDeleteFace, useFaceGalleryDeleteIdentity, useFaceGalleryGetFaceByTrack, useFaceGalleryGetFaceMedia, useFaceGalleryListIdentities, useFaceGalleryListIdentitySamples, useFaceGalleryListRecentFaces, useFaceGalleryRemoveSample, useFaceGalleryRenameIdentity, useFaceGallerySuggestFaceClusters, useFaceGalleryUnassignFace, useFaceGalleryUnassignFaces, useFanControlGetStatus, useFanControlSetDirection, useFanControlSetOscillating, useFanControlSetPercentage, useFanControlSetPreset, useFeatureProbeGetStatus, useFloodGetStatus, useGasGetStatus, useHumidifierGetStatus, useHumidifierSetMode, useHumidifierSetOn, useHumidifierSetTargetHumidity, useHumiditySensorGetStatus, useImageGetStatus, useImageSettingsGetOptions, useImageSettingsGetStatus, useImageSettingsSetSettings, useIntegrationsCreate, useIntegrationsDelete, useIntegrationsGet, useIntegrationsGetAvailableTypes, useIntegrationsGetByAddonId, useIntegrationsGetSettings, useIntegrationsList, useIntegrationsSetSettings, useIntegrationsTestConnection, useIntegrationsUpdate, useIntercomEndTalkSession, useIntercomGetStatus, useIntercomHandleAnswer, useIntercomPushTalkAudio, useIntercomStartSession, useIntercomStartTalkSession, useIntercomStopSession, useIsMidWidth, useIsMobile, useLawnMowerControlDock, useLawnMowerControlGetStatus, useLawnMowerControlPause, useLawnMowerControlStartMowing, useLiveBuffer, useLiveEvent, useLlmDeleteModel, useLlmDeleteProfile, useLlmGenerate, useLlmGenerateVision, useLlmGetDefaults, useLlmGetRuntimeStatus, useLlmGetUsage, useLlmInstallModel, useLlmListModelCatalog, useLlmListModels, useLlmListNodeModels, useLlmListProfileKinds, useLlmListProfiles, useLlmListRuntimeNodes, useLlmSetDefault, useLlmStartRuntime, useLlmStopRuntime, useLlmTestProfile, useLlmUpsertProfile, useLocalNetworkGetAllowedAddresses, useLocalNetworkGetConnectionEndpoints, useLocalNetworkGetPreferred, useLocalNetworkList, useLocalNetworkResetAllowlistToBestMatch, useLocalNetworkSetAllowedAddresses, useLockControlGetStatus, useLockControlLock, useLockControlOpen, useLockControlUnlock, useMediaPlayerGetStatus, useMediaPlayerNext, useMediaPlayerPause, useMediaPlayerPlay, useMediaPlayerPlayMedia, useMediaPlayerPrevious, useMediaPlayerSeek, useMediaPlayerSelectSource, useMediaPlayerSetMute, useMediaPlayerSetRepeat, useMediaPlayerSetShuffle, useMediaPlayerSetVolume, useMediaPlayerStop, useMeshNetworkGetStatus, useMeshNetworkJoin, useMeshNetworkLeave, useMeshNetworkListPeers, useMeshNetworkLogout, useMeshNetworkStartLogin, useMeshNetworkTestConnection, useMetricsProviderCollectSnapshot, useMetricsProviderDumpHeapSnapshot, useMetricsProviderGetAddonStats, useMetricsProviderGetCached, useMetricsProviderGetCpuTemperature, useMetricsProviderGetCurrent, useMetricsProviderGetDiskSpace, useMetricsProviderGetGpuInfo, useMetricsProviderGetProcessStats, useMetricsProviderKillProcess, useMetricsProviderListAddonInstances, useMetricsProviderListNodeProcesses, useMotionDetectionAnalyze, useMotionDetectionApplyDeviceSettingsPatch, useMotionDetectionGetDeviceLiveContribution, useMotionDetectionGetDeviceSettingsContribution, useMotionDetectionRemoveCamera, useMotionDetectionReset, useMotionGetStatus, useMotionIsDetected, useMotionTriggerGetStatus, useMotionTriggerSetMotionTrigger, useMotionZonesGetOptions, useMotionZonesGetStatus, useMotionZonesSetZone, useMqttBrokerAddBroker, useMqttBrokerGetBrokerConfig, useMqttBrokerGetStatus, useMqttBrokerListBrokers, useMqttBrokerRemoveBroker, useMqttBrokerStartEmbeddedBroker, useMqttBrokerStopEmbeddedBroker, useMqttBrokerTestConnection, useNativeObjectDetectionGetStatus, useNativeObjectDetectionSetEnabled, useNetworkAccessGetEndpoint, useNetworkAccessGetStatus, useNetworkAccessListEndpoints, useNetworkAccessStart, useNetworkAccessStop, useNetworkQualityGetAllStats, useNetworkQualityGetDeviceStats, useNetworkQualityReportClientStats, useNodesClusterAddonStatus, useNodesDeployAddon, useNodesExecuteQuery, useNodesGetCapUsageGraph, useNodesGetNodeAddons, useNodesRenameNode, useNodesRestartAddon, useNodesRestartNode, useNodesRestartProcess, useNodesSetProcessLogLevel, useNodesShutdownNode, useNodesTopology, useNodesUndeployAddon, useNotificationOutputDeleteTarget, useNotificationOutputDiscoverTargets, useNotificationOutputListTargetKinds, useNotificationOutputListTargets, useNotificationOutputSend, useNotificationOutputSetTargetEnabled, useNotificationOutputTestTarget, useNotificationOutputUpsertTarget, useNotifierCancel, useNotifierGetStatus, useNotifierSend, useNumericSensorGetStatus, useOptimisticSlice, useOptionalSystem, useOptionalWidgetRegistry, useOsdGetStatus, useOsdSetOverlay, usePTZ, usePetFeederCallPet, usePetFeederCancelFeed, usePetFeederFeed, usePetFeederGetStatus, usePetFeederMarkFoodReplenished, usePetFeederPlaySound, usePetFeederResetDesiccant, usePetFeederSetChildLock, usePetFeederSetFeedSound, usePetFeederSetIndicatorLight, usePetFeederSetVolume, usePipelineAnalyticsApplyDeviceSettingsPatch, usePipelineAnalyticsClearTracks, usePipelineAnalyticsDeleteDeviceEvents, usePipelineAnalyticsDeleteTracks, usePipelineAnalyticsGetActiveTracks, usePipelineAnalyticsGetAudioEvents, usePipelineAnalyticsGetDeviceLiveContribution, usePipelineAnalyticsGetDeviceSettingsContribution, usePipelineAnalyticsGetEventDensity, usePipelineAnalyticsGetEventMedia, usePipelineAnalyticsGetEventStoreFootprint, usePipelineAnalyticsGetKeyEvents, usePipelineAnalyticsGetMotionEvents, usePipelineAnalyticsGetObjectEvents, usePipelineAnalyticsGetSensorEvents, usePipelineAnalyticsGetTrack, usePipelineAnalyticsGetTrackMedia, usePipelineAnalyticsListEventKinds, usePipelineAnalyticsListOpsLog, usePipelineAnalyticsListRecentTracks, usePipelineAnalyticsListTracks, usePipelineAnalyticsPruneEvents, usePipelineAnalyticsPruneEventsBefore, usePipelineAnalyticsPruneTracksBefore, usePipelineAnalyticsSearchObjectEvents, usePipelineAnalyticsWipeAllAnalytics, usePipelineExecutorCacheFrameInPool, usePipelineExecutorClearDeviceOverrides, usePipelineExecutorDeleteModel, usePipelineExecutorDeleteTemplate, usePipelineExecutorDownloadModel, usePipelineExecutorGetAddonModels, usePipelineExecutorGetAudioCapabilities, usePipelineExecutorGetAvailableEngines, usePipelineExecutorGetCapabilities, usePipelineExecutorGetDefaultSteps, usePipelineExecutorGetDetectionConfigSchema, usePipelineExecutorGetEffectiveTuning, usePipelineExecutorGetEngineProvisioning, usePipelineExecutorGetGlobalPipelineConfig, usePipelineExecutorGetGlobalSteps, usePipelineExecutorGetOrchestratorConfigSchema, usePipelineExecutorGetReferenceAudio, usePipelineExecutorGetReferenceAudioFiles, usePipelineExecutorGetReferenceImage, usePipelineExecutorGetSchema, usePipelineExecutorGetSelectedEngine, usePipelineExecutorGetVideoPipelineSteps, usePipelineExecutorInferCached, usePipelineExecutorKillEngine, usePipelineExecutorListLoadedEngines, usePipelineExecutorListReferenceImages, usePipelineExecutorListTemplates, usePipelineExecutorRunAudioTest, usePipelineExecutorRunPipeline, usePipelineExecutorRunPipelineBatch, usePipelineExecutorSaveTemplate, usePipelineExecutorSetVideoPipelineSteps, usePipelineExecutorSpinEngine, usePipelineExecutorUncacheFrame, usePipelineExecutorUpdateTemplate, usePipelineExecutorValidatePipeline, usePipelineOrchestratorApplyDeviceSettingsPatch, usePipelineOrchestratorAssignAudio, usePipelineOrchestratorAssignPipeline, usePipelineOrchestratorDeleteTemplate, usePipelineOrchestratorGetAgentLoad, usePipelineOrchestratorGetAgentSettings, usePipelineOrchestratorGetAudioAssignment, usePipelineOrchestratorGetAudioAssignments, usePipelineOrchestratorGetAudioNodeLoad, usePipelineOrchestratorGetCameraMetrics, usePipelineOrchestratorGetCameraSettings, usePipelineOrchestratorGetCameraStatus, usePipelineOrchestratorGetCameraStatuses, usePipelineOrchestratorGetCameraStepOverrides, usePipelineOrchestratorGetCapabilityBindings, usePipelineOrchestratorGetDeviceLiveContribution, usePipelineOrchestratorGetDeviceSettingsContribution, usePipelineOrchestratorGetGlobalMetrics, usePipelineOrchestratorGetIngestOwner, usePipelineOrchestratorGetNodeInferenceDevices, usePipelineOrchestratorGetPipelineAssignment, usePipelineOrchestratorGetPipelineAssignments, usePipelineOrchestratorGetPipelineDevicePin, usePipelineOrchestratorListAgentSettings, usePipelineOrchestratorListTemplates, usePipelineOrchestratorRebalance, usePipelineOrchestratorRemoveAgentSettings, usePipelineOrchestratorResetNodePipelineDefaults, usePipelineOrchestratorResolvePipeline, usePipelineOrchestratorSaveTemplate, usePipelineOrchestratorSetAgentCapabilities, usePipelineOrchestratorSetAgentDetectWeight, usePipelineOrchestratorSetAgentInferenceDevices, usePipelineOrchestratorSetAgentMaxCameras, usePipelineOrchestratorSetAgentReachableHost, usePipelineOrchestratorSetCameraPipelineForAgent, usePipelineOrchestratorSetCameraStepOverride, usePipelineOrchestratorSetCameraStepToggle, usePipelineOrchestratorSetCapabilityBinding, usePipelineOrchestratorSetPipelineDevicePin, usePipelineOrchestratorUnassignAudio, usePipelineOrchestratorUnassignPipeline, usePipelineOrchestratorUpdateTemplate, usePipelineRunnerAttachCamera, usePipelineRunnerDetachCamera, usePipelineRunnerGetAllCameraMetrics, usePipelineRunnerGetCameraMetrics, usePipelineRunnerGetLocalCameras, usePipelineRunnerGetLocalLoad, usePipelineRunnerGetLocalMetrics, usePipelineRunnerGetNativeCrop, usePipelineRunnerReportMotion, usePipelineRunnerRunDetailSubtree, usePlateGalleryAssignPlate, usePlateGalleryAssignPlates, usePlateGalleryCorrectPlateText, usePlateGalleryCreateVehicle, usePlateGalleryDeletePlate, usePlateGalleryDeleteVehicle, usePlateGalleryGetPlateByTrack, usePlateGalleryGetPlateMedia, usePlateGalleryListPlates, usePlateGalleryListVehicleSamples, usePlateGalleryListVehicles, usePlateGalleryRemoveVehicleSample, usePlateGalleryRenameVehicle, usePlateGallerySearchPlates, usePlateGallerySuggestPlateClusters, usePlateGalleryUnassignPlate, usePlateGalleryUnassignPlates, usePlayerOverlayLayer, usePlayerOverlayLayers, usePlayerToolbarButton, usePlayerToolbarButtons, usePowerMeterGetStatus, usePresenceGetStatus, usePressureSensorGetStatus, usePrivacyMaskGetOptions, usePrivacyMaskGetStatus, usePrivacyMaskSetMask, usePtzAutotrackGetSettings, usePtzAutotrackGetStatus, usePtzAutotrackSetEnabled, usePtzAutotrackSetSettings, usePtzContinuousMove, usePtzDeletePreset, usePtzGetOptions, usePtzGetPosition, usePtzGetPresets, usePtzGetStatus, usePtzGoHome, usePtzGoToPreset, usePtzMove, usePtzSavePreset, usePtzSetAutofocus, usePtzStop, useRebootReboot, useRecordedPlayback, useRecordingApplyDeviceSettingsPatch, useRecordingDeleteFootprint, useRecordingExportCancelExport, useRecordingExportCreateExport, useRecordingExportDeleteExport, useRecordingExportGetDownloadUrl, useRecordingExportGetExport, useRecordingExportListExports, useRecordingGetAvailability, useRecordingGetDaysWithRecordings, useRecordingGetDeviceConfig, useRecordingGetDeviceLiveContribution, useRecordingGetDeviceSettingsContribution, useRecordingGetPlaybackManifest, useRecordingGetStatus, useRecordingGetStorageUsage, useRecordingListOpsLog, useRecordingLocateSegment, useRecordingPruneFootage, useRecordingReadSegmentBytes, useRecordingRescanStorage, useRecordingSetDeviceConfig, useRemoteComponent, useSceneMonitorCaptureReference, useSceneMonitorCreateScene, useSceneMonitorDeleteReference, useSceneMonitorDeleteScene, useSceneMonitorGetStatus, useSceneMonitorListScenes, useSceneMonitorRecheckNow, useSceneMonitorUpdateScene, useScriptRunnerGetStatus, useScriptRunnerRun, useScriptRunnerStop, useScrubController, useServerManagementApplyServerUpdate, useServerManagementCheckServerUpdate, useServerManagementGetServerPackageStatus, useServerManagementRestartServer, useServerManagementRollbackServerUpdate, useSettingsStoreCount, useSettingsStoreDeclareCollection, useSettingsStoreDelete, useSettingsStoreGet, useSettingsStoreHistogram, useSettingsStoreInsert, useSettingsStoreIsEmpty, useSettingsStoreQuery, useSettingsStoreSet, useSettingsStoreUpdate, useSmokeGetStatus, useSnapshotApplyDeviceSettingsPatch, useSnapshotGetDeviceLiveContribution, useSnapshotGetDeviceSettingsContribution, useSnapshotGetSnapshot, useSnapshotGetSnapshotOverview, useSnapshotGetStatus, useSnapshotInvalidateCache, useStorageAbortUpload, useStorageBeginDownload, useStorageBeginUpload, useStorageDelete, useStorageDeleteLocation, useStorageEndDownload, useStorageExists, useStorageFinalizeUpload, useStorageGetAvailableSpace, useStorageGetDefaultLocation, useStorageList, useStorageListLocationDeclarations, useStorageListLocations, useStorageListProviders, useStorageRead, useStorageReadChunk, useStorageResolve, useStorageTestConfig, useStorageTestLocation, useStorageUpsertLocation, useStorageWrite, useStorageWriteChunk, useStreamBrokerApplyDeviceSettingsPatch, useStreamBrokerAssignProfile, useStreamBrokerGetAllRtspEntries, useStreamBrokerGetBrokerStats, useStreamBrokerGetDeviceLiveContribution, useStreamBrokerGetDeviceSettingsContribution, useStreamBrokerGetPreBufferInfo, useStreamBrokerGetRtspEntry, useStreamBrokerGetRtspPort, useStreamBrokerGetStreamUrl, useStreamBrokerGetStreamWithCodec, useStreamBrokerIsRtspEnabled, useStreamBrokerKillClient, useStreamBrokerListAllCameraStreams, useStreamBrokerListAllProfileSlots, useStreamBrokerListClients, useStreamBrokerProbeStream, useStreamBrokerPublishCameraStream, useStreamBrokerPullAudioChunks, useStreamBrokerPullFrameHandles, useStreamBrokerRegenerateRtspToken, useStreamBrokerReleaseStreamWithCodec, useStreamBrokerRestartProfile, useStreamBrokerRetractCameraStream, useStreamBrokerSetPreBufferDuration, useStreamBrokerSetRtspEnabled, useStreamBrokerSubscribeAudioChunks, useStreamBrokerSubscribeFrames, useStreamBrokerUnassignProfile, useStreamBrokerUnsubscribeAudioChunks, useStreamBrokerUnsubscribeFrames, useStreamCatalogGetCatalog, useStreamParamsGetConfigSchema, useStreamParamsGetOptions, useStreamParamsGetStatus, useStreamParamsSetProfile, useSwitchGetStatus, useSwitchSetState, useSystem, useSystemFeatureFlags, useSystemForceRetentionCleanup, useSystemGetRetentionConfig, useSystemHealth, useSystemInfo, useSystemMutation, useSystemNetworkAddresses, useSystemQuery, useSystemSetRetentionConfig, useTamperGetStatus, useTemperatureSensorGetStatus, useThemeMode, useToastOnToast, useTurnProviderGetTurnServers, useUpdateGetStatus, useUpdateInstallUpdate, useUserManagementConfirmTotp, useUserManagementCreateApiKey, useUserManagementCreateScopedToken, useUserManagementCreateUser, useUserManagementDeleteUser, useUserManagementDisableTotp, useUserManagementGetTotpStatus, useUserManagementListApiKeys, useUserManagementListOauthSessions, useUserManagementListScopedTokens, useUserManagementListUsers, useUserManagementOauthExchangeCode, useUserManagementOauthIssueCode, useUserManagementOauthRefresh, useUserManagementOauthVerifyAccessToken, useUserManagementResetPassword, useUserManagementRevokeApiKey, useUserManagementRevokeOauthSession, useUserManagementRevokeScopedToken, useUserManagementSetUserScopes, useUserManagementSetupTotp, useUserManagementUpdateUser, useUserManagementValidateApiKey, useUserManagementValidateCredentials, useUserManagementValidateScopedToken, useUserManagementVerifyTotp, useVacuumControlGetStatus, useVacuumControlLocate, useVacuumControlPause, useVacuumControlReturnToBase, useVacuumControlSetFanSpeed, useVacuumControlStart, useVacuumControlStop, useValveClose, useValveGetStatus, useValveOpen, useValveSetPosition, useValveStop, useVibrationGetStatus, useVideoclipsGetClipPlayback, useVideoclipsListClips, useVodPlayback, useWaterHeaterGetStatus, useWaterHeaterSetAway, useWaterHeaterSetOperationMode, useWaterHeaterSetTargetTemp, useWeatherGetStatus, useWebrtcSessionAddIceCandidate, useWebrtcSessionCloseSession, useWebrtcSessionCreateSession, useWebrtcSessionGetIceCandidates, useWebrtcSessionGetSessionState, useWebrtcSessionHandleAnswer, useWebrtcSessionHandleOffer, useWebrtcSessionHasAdaptiveBitrate, useWebrtcSessionListStreams, useWidget, useWidgetMetadata, useWidgetRegistry, useZoneAnalyticsGetCameraHistory, useZoneAnalyticsGetCurrentSnapshot, useZoneAnalyticsGetUnzonedHistory, useZoneAnalyticsGetZoneHistory, useZoneEditing, useZoneRulesListRules, useZoneRulesSetRules, useZonesAddZone, useZonesListZones, useZonesRemoveZone, useZonesUpdateZone, vacuumStateMeta, validateScopes, valveStateMeta, waterHeaterPhase, waterHeaterTint, weatherConditionMeta, weatherTint };