@camstack/ui-library 1.2.33 → 1.2.35

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.
@@ -13,8 +13,8 @@ export { DeviceStepMatrix } from './device-step-matrix';
13
13
  export type { DeviceStepMatrixProps, StepGate } from './device-step-matrix';
14
14
  export { shouldUseSingleNode, agentColumnKey, groupAgentColumns } from './pipeline-matrix-shared';
15
15
  export type { AgentColumnGroup, AgentColumnIdentity, MatrixSelectedCell, } from './pipeline-matrix-shared';
16
- export { resolveStepDefaultModel } from './resolve-step-default-model';
17
- export type { StepModelCatalog } from './resolve-step-default-model';
16
+ export { resolveStepDefaultModel, resolveEffectiveDefaultModel, resolveEffectiveStepModel, stepHasModelForFormat, stepModelOptions, } from './resolve-step-default-model';
17
+ export type { EffectiveStepModelInput, StepModelCatalog, StepModelFormatBuilds, } from './resolve-step-default-model';
18
18
  export { NodePicker } from './node-picker';
19
19
  export type { NodePickerProps } from './node-picker';
20
20
  export * from './status-badge';
@@ -1,5 +1,20 @@
1
1
  /**
2
- * resolve-step-default-model — the pure, UI-side mirror of the runner's
2
+ * resolve-step-default-model — the ONE step-model primitive every admin-ui
3
+ * surface that shows or edits a step's model consumes. Two questions, two
4
+ * exported answers, no local copies:
5
+ *
6
+ * - which models may this step run on this device? → `stepModelOptions`
7
+ * (and its boolean form `stepHasModelForFormat`);
8
+ * - which model does it ACTUALLY run right now? → `resolveEffectiveStepModel`
9
+ * (override → base → `resolveEffectiveDefaultModel`).
10
+ *
11
+ * Consumers: `AgentStepEditor` (the drawer picker), `NodeDeviceStepsMatrix`
12
+ * (per-node base), `DeviceStepOverrideTab` (per-camera override), the Models
13
+ * page and `pipeline-mirror`. They are views of the same decision and drifted
14
+ * apart once already — see `resolveEffectiveDefaultModel` for the bite.
15
+ * `scripts/check-step-model-single-owner.ts` is what stops the next copy.
16
+ *
17
+ * The rest of this file is the pure, UI-side mirror of the runner's
3
18
  * `getDefaultModelForFormat` (`@camstack/addon-pipeline`
4
19
  * `registry/step-definitions.ts`). The steps×device matrices need to show, per
5
20
  * cell, the model a STEP would actually run on a device's engine format — but
@@ -37,3 +52,64 @@ export interface StepModelCatalog {
37
52
  readonly defaultModelIdByFormat?: Readonly<Record<string, string>>;
38
53
  }
39
54
  export declare function resolveStepDefaultModel(catalog: StepModelCatalog, format: string): string;
55
+ /**
56
+ * The model a matrix CELL shows as this step's effective default on `device`.
57
+ *
58
+ * The device's ELECTED model (`device.defaultModelId`, the per-device
59
+ * object-detection election) applies ONLY when this step's catalog actually
60
+ * contains it — `slot === 'detector'` alone is too wide, because
61
+ * package-detection shares the detector slot with the root step. Bit live
62
+ * 2026-08-08: rfdetr-package became the package step's default and every
63
+ * matrix cell still showed the device's yolo as the "selected" model, because
64
+ * the election was applied slot-wide. Membership is the principled gate: an
65
+ * elected model this step cannot run is never displayed for it.
66
+ */
67
+ export declare function resolveEffectiveDefaultModel(catalog: StepModelCatalog & {
68
+ readonly slot?: string;
69
+ }, device: {
70
+ readonly format?: string;
71
+ readonly defaultModelId?: string;
72
+ } | null | undefined): string | undefined;
73
+ /**
74
+ * The minimal model shape option-derivation needs: a per-format build map.
75
+ * `PipelineAddonSchema['models'][number]` is structurally assignable, and the
76
+ * generic below returns the CALLER's element type so a picker still receives
77
+ * `name` / `group` / `sizeMB`.
78
+ */
79
+ export interface StepModelFormatBuilds {
80
+ readonly formats: Readonly<Record<string, unknown>>;
81
+ }
82
+ /**
83
+ * The models a step may run on an engine `format` — the ONE derivation of the
84
+ * option list. An unknown format yields NOTHING rather than everything: a
85
+ * picker that offered a model with no build for the device would write a pin
86
+ * the runner cannot honour.
87
+ */
88
+ export declare function stepModelOptions<M extends StepModelFormatBuilds>(models: readonly M[], format: string | undefined): readonly M[];
89
+ /** Can this step run on `format` at all? (`false` ⇒ the caller renders "⚠ skip"/"—".) */
90
+ export declare function stepHasModelForFormat(models: readonly StepModelFormatBuilds[], format: string | undefined): boolean;
91
+ /** The layers a surface may pin, outermost first. Both are optional per surface. */
92
+ export interface EffectiveStepModelInput {
93
+ readonly catalog: StepModelCatalog & {
94
+ readonly slot?: string;
95
+ };
96
+ readonly device: {
97
+ readonly format?: string;
98
+ readonly defaultModelId?: string;
99
+ } | null | undefined;
100
+ /** Per-camera override (`stepOverridesByDevice[node][deviceKey][step].modelId`). */
101
+ readonly override?: string | undefined;
102
+ /** Per-(node,device) base (`inferenceDevices[node][deviceKey].steps[step].modelId`). */
103
+ readonly base?: string | undefined;
104
+ }
105
+ /**
106
+ * The model a step ACTUALLY runs for a (device, camera) — the whole effective
107
+ * chain in one place: per-camera override → per-(node,device) base → the
108
+ * resolved default (`resolveEffectiveDefaultModel`).
109
+ *
110
+ * Every surface calls this: the matrix cell, and the drawer's picker seed. They
111
+ * are the same number, and the only way to keep them the same number is to have
112
+ * one function produce it. A surface that owns fewer layers omits them (the node
113
+ * matrix passes no `override`) — it does NOT get its own resolver.
114
+ */
115
+ export declare function resolveEffectiveStepModel(input: EffectiveStepModelInput): string | undefined;
@@ -297,6 +297,8 @@ export declare const useCoreBlocksUpdate: typeof trpc.coreBlocks.update.useMutat
297
297
  export declare const useCoreBlocksDelete: typeof trpc.coreBlocks.delete.useMutation;
298
298
  /** Generated alias around `trpc.coreBlocks.setEnabled.useMutation`. */
299
299
  export declare const useCoreBlocksSetEnabled: typeof trpc.coreBlocks.setEnabled.useMutation;
300
+ /** Generated alias around `trpc.coreBlocks.restart.useMutation`. */
301
+ export declare const useCoreBlocksRestart: typeof trpc.coreBlocks.restart.useMutation;
300
302
  /** Generated alias around `trpc.coreBlocks.compile.useMutation`. */
301
303
  export declare const useCoreBlocksCompile: typeof trpc.coreBlocks.compile.useMutation;
302
304
  /** Generated alias around `trpc.coreBlocks.getTypeDefs.useQuery`. */
@@ -423,8 +425,6 @@ export declare const useDeviceManagerSetLinkDeviceId: typeof trpc.deviceManager.
423
425
  export declare const useDeviceManagerSetPrimaryChildEntityId: typeof trpc.deviceManager.setPrimaryChildEntityId.useMutation;
424
426
  /** Generated alias around `trpc.deviceManager.setChildLayout.useMutation`. */
425
427
  export declare const useDeviceManagerSetChildLayout: typeof trpc.deviceManager.setChildLayout.useMutation;
426
- /** Generated alias around `trpc.deviceManager.setDeviceLinks.useMutation`. */
427
- export declare const useDeviceManagerSetDeviceLinks: typeof trpc.deviceManager.setDeviceLinks.useMutation;
428
428
  /** Generated alias around `trpc.deviceManager.setDisplay.useMutation`. */
429
429
  export declare const useDeviceManagerSetDisplay: typeof trpc.deviceManager.setDisplay.useMutation;
430
430
  /** Generated alias around `trpc.deviceManager.getRoleDisplayDefaults.useQuery`. */
@@ -1573,6 +1573,10 @@ export declare const useStreamBrokerAssignProfile: typeof trpc.streamBroker.assi
1573
1573
  export declare const useStreamBrokerUnassignProfile: typeof trpc.streamBroker.unassignProfile.useMutation;
1574
1574
  /** Generated alias around `trpc.streamBroker.renderPreBufferClip.useMutation`. */
1575
1575
  export declare const useStreamBrokerRenderPreBufferClip: typeof trpc.streamBroker.renderPreBufferClip.useMutation;
1576
+ /** Generated alias around `trpc.streamBroker.produceEventMedia.useMutation`. */
1577
+ export declare const useStreamBrokerProduceEventMedia: typeof trpc.streamBroker.produceEventMedia.useMutation;
1578
+ /** Generated alias around `trpc.streamBroker.fetchEventMedia.useMutation`. */
1579
+ export declare const useStreamBrokerFetchEventMedia: typeof trpc.streamBroker.fetchEventMedia.useMutation;
1576
1580
  /** Generated alias around `trpc.streamBroker.listAllCameraStreams.useQuery`. */
1577
1581
  export declare const useStreamBrokerListAllCameraStreams: typeof trpc.streamBroker.listAllCameraStreams.useQuery;
1578
1582
  /** Generated alias around `trpc.streamBroker.listAllProfileSlots.useQuery`. */
@@ -17,7 +17,7 @@ export type { UseDeviceProxyTrpc } from './use-device-proxy';
17
17
  export { useDeviceCapability } from './use-device-capability';
18
18
  export type { UseDeviceCapabilityOptions, UseDeviceCapabilityResult, } from './use-device-capability';
19
19
  export { useDeviceSnapshotImage } from './use-device-snapshot';
20
- export type { DeviceSnapshotImage } from './use-device-snapshot';
20
+ export type { DeviceSnapshotImage, UseDeviceSnapshotOptions } from './use-device-snapshot';
21
21
  export type { ClusterNode } from './use-cluster-nodes';
22
22
  export type { DeviceDetections, MotionState, MotionZone, MotionRawState, MotionRawBox, DetectionState, } from './use-device-detections';
23
23
  export type { DeviceWebrtcResult, UseDeviceWebrtcTrpc, DevicePipelineMetrics, WebrtcTarget, SessionRenegotiationState, } from './use-device-webrtc';
@@ -1,10 +1,28 @@
1
- import { UseDeviceProxyTrpc } from './use-device-proxy';
1
+ /** The hub-proxied path prefix for the snapshot image data plane. */
2
+ export declare const SNAPSHOT_MEDIA_PATH = "/addon/snapshot/media";
2
3
  export interface DeviceSnapshotImage {
3
- /** Data-URL for the most recently fetched snapshot, or `null`. */
4
+ /** Image URL ready for `<img src>`, or `null` when there is no device. */
4
5
  readonly src: string | null;
5
- /** True while a fetch is in flight. */
6
+ /**
7
+ * Always false. Kept so existing callers' spinners compile; a URL needs no
8
+ * fetch state, and the `<img>` element owns its own load lifecycle (an
9
+ * unavailable snapshot surfaces as `onError`, which every consumer already
10
+ * handles because a device can legitimately have no camera).
11
+ */
6
12
  readonly loading: boolean;
7
- /** Force the next fetch to bypass cache (single use). */
13
+ /** Force ONE fresh capture (bypasses the wrapper's freshness gate, and wakes
14
+ * a battery camera — an operator action only). */
8
15
  readonly refresh: () => void;
9
16
  }
10
- export declare function useDeviceSnapshotImage(trpc: UseDeviceProxyTrpc, deviceId: number | null): DeviceSnapshotImage;
17
+ export interface UseDeviceSnapshotOptions {
18
+ /**
19
+ * Target width in px. The server snaps it to a ladder
20
+ * ([160, 240, 320, 480, 640, 960]) and derives the variant once per capture,
21
+ * so nearby sizes share one image. **Omitting it returns the frame as
22
+ * captured** — which is how a 28 px thumbnail came to cost a megabyte.
23
+ */
24
+ readonly width?: number;
25
+ /** Absolute hub base. Omit in the admin UI, which is same-origin with the hub. */
26
+ readonly baseUrl?: string;
27
+ }
28
+ export declare function useDeviceSnapshotImage(deviceId: number | null, options?: UseDeviceSnapshotOptions): DeviceSnapshotImage;
package/dist/index.cjs CHANGED
@@ -3733,6 +3733,62 @@ var CHIP_BASE = "inline-flex items-center gap-1 rounded-full border px-1.5 py-0.
3733
3733
  var CHIP_ACTIVE = "border-primary/50 bg-primary/15 text-primary";
3734
3734
  var CHIP_INACTIVE = "border-border bg-surface text-foreground-subtle hover:bg-surface-hover";
3735
3735
  //#endregion
3736
+ //#region src/composites/resolve-step-default-model.ts
3737
+ function resolveStepDefaultModel(catalog, format) {
3738
+ const hasFormatBuild = (modelId) => catalog.models.find((m) => m.id === modelId)?.formats[format] !== void 0;
3739
+ const declared = catalog.defaultModelIdByFormat?.[format];
3740
+ if (declared !== void 0 && hasFormatBuild(declared)) return declared;
3741
+ if (hasFormatBuild(catalog.defaultModelId)) return catalog.defaultModelId;
3742
+ const available = catalog.models.filter((m) => m.formats[format] !== void 0 && m.legacy !== true);
3743
+ if (available.length === 0) return catalog.defaultModelId;
3744
+ return [...available].toSorted((a, b) => (a.formats[format]?.sizeMB ?? Infinity) - (b.formats[format]?.sizeMB ?? Infinity))[0].id;
3745
+ }
3746
+ /**
3747
+ * The model a matrix CELL shows as this step's effective default on `device`.
3748
+ *
3749
+ * The device's ELECTED model (`device.defaultModelId`, the per-device
3750
+ * object-detection election) applies ONLY when this step's catalog actually
3751
+ * contains it — `slot === 'detector'` alone is too wide, because
3752
+ * package-detection shares the detector slot with the root step. Bit live
3753
+ * 2026-08-08: rfdetr-package became the package step's default and every
3754
+ * matrix cell still showed the device's yolo as the "selected" model, because
3755
+ * the election was applied slot-wide. Membership is the principled gate: an
3756
+ * elected model this step cannot run is never displayed for it.
3757
+ */
3758
+ function resolveEffectiveDefaultModel(catalog, device) {
3759
+ const format = device?.format;
3760
+ if (format === void 0) return void 0;
3761
+ const elected = device?.defaultModelId;
3762
+ return catalog.slot === "detector" && elected !== void 0 && catalog.models.some((m) => m.id === elected) ? elected : resolveStepDefaultModel(catalog, format);
3763
+ }
3764
+ /**
3765
+ * The models a step may run on an engine `format` — the ONE derivation of the
3766
+ * option list. An unknown format yields NOTHING rather than everything: a
3767
+ * picker that offered a model with no build for the device would write a pin
3768
+ * the runner cannot honour.
3769
+ */
3770
+ function stepModelOptions(models, format) {
3771
+ if (format === void 0) return [];
3772
+ return models.filter((m) => m.formats[format] !== void 0);
3773
+ }
3774
+ /** Can this step run on `format` at all? (`false` ⇒ the caller renders "⚠ skip"/"—".) */
3775
+ function stepHasModelForFormat(models, format) {
3776
+ return stepModelOptions(models, format).length > 0;
3777
+ }
3778
+ /**
3779
+ * The model a step ACTUALLY runs for a (device, camera) — the whole effective
3780
+ * chain in one place: per-camera override → per-(node,device) base → the
3781
+ * resolved default (`resolveEffectiveDefaultModel`).
3782
+ *
3783
+ * Every surface calls this: the matrix cell, and the drawer's picker seed. They
3784
+ * are the same number, and the only way to keep them the same number is to have
3785
+ * one function produce it. A surface that owns fewer layers omits them (the node
3786
+ * matrix passes no `override`) — it does NOT get its own resolver.
3787
+ */
3788
+ function resolveEffectiveStepModel(input) {
3789
+ return input.override ?? input.base ?? resolveEffectiveDefaultModel(input.catalog, input.device);
3790
+ }
3791
+ //#endregion
3736
3792
  //#region src/lib/pipeline-mirror.ts
3737
3793
  function findAddonInCatalog(catalog, addonId) {
3738
3794
  for (const slot of catalog.slots) for (const addon of slot.addons) if (addon.id === addonId) return addon;
@@ -3741,8 +3797,20 @@ function findAddonInCatalog(catalog, addonId) {
3741
3797
  function findModel(addon, modelId) {
3742
3798
  return addon.models.find((m) => m.id === modelId) ?? null;
3743
3799
  }
3744
- function firstModelFor(addon, format) {
3745
- return addon.models.find((m) => Boolean(m.formats[format])) ?? null;
3800
+ /**
3801
+ * The model to adopt on the target when the source's pin has no build there.
3802
+ *
3803
+ * Options come from the shared step-model primitive, and the CHOICE is the
3804
+ * step's own resolved default for that format — not "the first entry in the
3805
+ * array", which is how a mirror could land on `yolov8n-package` for a step
3806
+ * whose declared default is `rfdetr-package`, disagreeing with the very cell
3807
+ * the steps matrix renders right after the mirror.
3808
+ */
3809
+ function fallbackModelFor(addon, format) {
3810
+ const options = stepModelOptions(addon.models, format);
3811
+ if (options.length === 0) return null;
3812
+ const resolved = resolveStepDefaultModel(addon, format);
3813
+ return options.find((m) => m.id === resolved) ?? options[0] ?? null;
3746
3814
  }
3747
3815
  function dropModelSpecific(settings, targetAddon) {
3748
3816
  const allowedKeys = new Set((targetAddon.configSchema ?? []).map((f) => f.key));
@@ -3783,11 +3851,11 @@ function mirror(input) {
3783
3851
  outcome = "exact";
3784
3852
  } else {
3785
3853
  const srcModel = findModel(targetAddon, srcCfg.modelId);
3786
- if (srcModel !== null && Boolean(srcModel.formats[target.engine.format])) {
3854
+ if (srcModel !== null && stepModelOptions([srcModel], target.engine.format).length > 0) {
3787
3855
  chosenModelId = srcCfg.modelId;
3788
3856
  outcome = "exact";
3789
3857
  } else {
3790
- const fallback = firstModelFor(targetAddon, target.engine.format);
3858
+ const fallback = fallbackModelFor(targetAddon, target.engine.format);
3791
3859
  if (!fallback) {
3792
3860
  out.push({
3793
3861
  addonId,
@@ -14231,7 +14299,7 @@ function ModelPicker({ models, value, onChange, disabled }) {
14231
14299
  });
14232
14300
  if (!hasGroups) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
14233
14301
  className: "space-y-2",
14234
- children: [unresolvedBanner, flatSelect(models)]
14302
+ children: [unresolvedBanner, flatSelect(models, "— select a model —")]
14235
14303
  });
14236
14304
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
14237
14305
  className: "space-y-3",
@@ -14758,7 +14826,7 @@ function DeviceModeEditor({ addon, agentDefault, agentNodeId, currentPatch, mode
14758
14826
  }
14759
14827
  function AgentStepEditor(props) {
14760
14828
  const { mode, addon, agentDefault, agentNodeId, currentPatch, onChangeAgentConfig, onChangePatch, engineFormat, effectiveModelId } = props;
14761
- const modelsForFormat = (0, react$1.useMemo)(() => addon.models.filter((m) => Boolean(m.formats[engineFormat])), [addon.models, engineFormat]);
14829
+ const modelsForFormat = (0, react$1.useMemo)(() => stepModelOptions(addon.models, engineFormat), [addon.models, engineFormat]);
14762
14830
  if (mode === "agent") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AgentModeEditor, {
14763
14831
  addon,
14764
14832
  agentDefault,
@@ -15430,17 +15498,6 @@ function DeviceStepMatrix({ tree, agents, gateFor, getCellState, onCellClick, se
15430
15498
  });
15431
15499
  }
15432
15500
  //#endregion
15433
- //#region src/composites/resolve-step-default-model.ts
15434
- function resolveStepDefaultModel(catalog, format) {
15435
- const hasFormatBuild = (modelId) => catalog.models.find((m) => m.id === modelId)?.formats[format] !== void 0;
15436
- const declared = catalog.defaultModelIdByFormat?.[format];
15437
- if (declared !== void 0 && hasFormatBuild(declared)) return declared;
15438
- if (hasFormatBuild(catalog.defaultModelId)) return catalog.defaultModelId;
15439
- const available = catalog.models.filter((m) => m.formats[format] !== void 0 && m.legacy !== true);
15440
- if (available.length === 0) return catalog.defaultModelId;
15441
- return [...available].toSorted((a, b) => (a.formats[format]?.sizeMB ?? Infinity) - (b.formats[format]?.sizeMB ?? Infinity))[0].id;
15442
- }
15443
- //#endregion
15444
15501
  //#region src/trpc-react.ts
15445
15502
  /**
15446
15503
  * Shared typed React Query proxy for the backend AppRouter.
@@ -18464,6 +18521,8 @@ var useCoreBlocksUpdate = trpc.coreBlocks.update.useMutation;
18464
18521
  var useCoreBlocksDelete = trpc.coreBlocks.delete.useMutation;
18465
18522
  /** Generated alias around `trpc.coreBlocks.setEnabled.useMutation`. */
18466
18523
  var useCoreBlocksSetEnabled = trpc.coreBlocks.setEnabled.useMutation;
18524
+ /** Generated alias around `trpc.coreBlocks.restart.useMutation`. */
18525
+ var useCoreBlocksRestart = trpc.coreBlocks.restart.useMutation;
18467
18526
  /** Generated alias around `trpc.coreBlocks.compile.useMutation`. */
18468
18527
  var useCoreBlocksCompile = trpc.coreBlocks.compile.useMutation;
18469
18528
  /** Generated alias around `trpc.coreBlocks.getTypeDefs.useQuery`. */
@@ -18590,8 +18649,6 @@ var useDeviceManagerSetLinkDeviceId = trpc.deviceManager.setLinkDeviceId.useMuta
18590
18649
  var useDeviceManagerSetPrimaryChildEntityId = trpc.deviceManager.setPrimaryChildEntityId.useMutation;
18591
18650
  /** Generated alias around `trpc.deviceManager.setChildLayout.useMutation`. */
18592
18651
  var useDeviceManagerSetChildLayout = trpc.deviceManager.setChildLayout.useMutation;
18593
- /** Generated alias around `trpc.deviceManager.setDeviceLinks.useMutation`. */
18594
- var useDeviceManagerSetDeviceLinks = trpc.deviceManager.setDeviceLinks.useMutation;
18595
18652
  /** Generated alias around `trpc.deviceManager.setDisplay.useMutation`. */
18596
18653
  var useDeviceManagerSetDisplay = trpc.deviceManager.setDisplay.useMutation;
18597
18654
  /** Generated alias around `trpc.deviceManager.getRoleDisplayDefaults.useQuery`. */
@@ -19740,6 +19797,10 @@ var useStreamBrokerAssignProfile = trpc.streamBroker.assignProfile.useMutation;
19740
19797
  var useStreamBrokerUnassignProfile = trpc.streamBroker.unassignProfile.useMutation;
19741
19798
  /** Generated alias around `trpc.streamBroker.renderPreBufferClip.useMutation`. */
19742
19799
  var useStreamBrokerRenderPreBufferClip = trpc.streamBroker.renderPreBufferClip.useMutation;
19800
+ /** Generated alias around `trpc.streamBroker.produceEventMedia.useMutation`. */
19801
+ var useStreamBrokerProduceEventMedia = trpc.streamBroker.produceEventMedia.useMutation;
19802
+ /** Generated alias around `trpc.streamBroker.fetchEventMedia.useMutation`. */
19803
+ var useStreamBrokerFetchEventMedia = trpc.streamBroker.fetchEventMedia.useMutation;
19743
19804
  /** Generated alias around `trpc.streamBroker.listAllCameraStreams.useQuery`. */
19744
19805
  var useStreamBrokerListAllCameraStreams = trpc.streamBroker.listAllCameraStreams.useQuery;
19745
19806
  /** Generated alias around `trpc.streamBroker.listAllProfileSlots.useQuery`. */
@@ -29408,67 +29469,68 @@ function useDeviceBattery(trpc, deviceId) {
29408
29469
  //#endregion
29409
29470
  //#region src/hooks/use-device-snapshot.ts
29410
29471
  /**
29411
- * useDeviceSnapshotImage — autosufficient snapshot fetcher for a device.
29412
- *
29413
- * Wraps the entire `dev.snapshot.getSnapshot({force?})` boilerplate
29414
- * (proxy lookup + react-query caching + force-refresh ref + data-URL
29415
- * conversion) into a single hook so callers don't drill snapshot
29416
- * state into their stream-player components.
29417
- *
29418
- * Caching: the result lives in react-query's global QueryClient
29419
- * (the singleton at app scope), keyed by `['device', N, 'snapshot']`.
29420
- * That IS the "global context" — every consumer mounting the hook
29421
- * with the same `deviceId` shares the same cache entry, AND when a
29422
- * consumer unmounts and remounts the cached value is served
29423
- * instantly. We pin a long `gcTime` so the entry survives unmount
29424
- * cycles, and a short `staleTime` so a remount after a real gap
29425
- * re-validates against the camera in the background:
29426
- * - `staleTime: 10_000` fresh for 10s, then re-fetches on next mount
29427
- * - `gcTime: 86400_000` kept for 24h after last consumer leaves
29428
- * Window-focus and reconnect refetch are off so the camera isn't
29429
- * pinged on every tab switch. Manual refresh via `refresh()` always
29430
- * bypasses the cache.
29431
- *
29432
- * Returns:
29433
- * - `src`: data-URL ready to drop into `<img>` (or `null` until the
29434
- * first successful fetch).
29435
- * - `loading`: true while a fetch is in flight (initial OR refresh).
29436
- * - `refresh()`: forces exactly ONE bypass-cache fetch.
29437
- *
29438
- * The hook is data-only — render decisions (placeholder, paused
29439
- * preview, …) live in the component that consumes it.
29440
- */
29441
- function useDeviceSnapshotImage(trpc, deviceId) {
29442
- const dev = useDeviceProxy(trpc, deviceId);
29443
- const forceRef = (0, react$1.useRef)(false);
29444
- const { data, isLoading, isFetching, refetch } = (0, _tanstack_react_query.useQuery)({
29445
- queryKey: [
29446
- "device",
29447
- deviceId,
29448
- "snapshot"
29449
- ],
29450
- queryFn: () => {
29451
- if (!dev) throw new Error("useDeviceSnapshotImage: device proxy not ready");
29452
- const force = forceRef.current;
29453
- forceRef.current = false;
29454
- return dev.snapshot?.getSnapshot({ force }) ?? null;
29455
- },
29456
- enabled: dev !== null && deviceId !== null,
29457
- staleTime: 1e4,
29458
- gcTime: 1440 * 60 * 1e3,
29459
- refetchOnWindowFocus: false,
29460
- refetchOnReconnect: false,
29461
- retry: false
29462
- });
29463
- const src = data ? `data:${data.contentType};base64,${data.base64}` : null;
29464
- function refresh() {
29465
- forceRef.current = true;
29466
- refetch();
29467
- }
29472
+ * useDeviceSnapshotImage — a device's snapshot as a plain image URL.
29473
+ *
29474
+ * ## What this used to do, and why it stopped
29475
+ *
29476
+ * It fetched `dev.snapshot.getSnapshot()` over tRPC and returned
29477
+ * `data:image/jpeg;base64,…`. That put a full camera capture — up to 4 K,
29478
+ * measured at 758 KB average per camera on the live hub — through the msgpack
29479
+ * WebSocket plane, base64-inflated by a third, and then held it in the
29480
+ * react-query heap for 24 h per device. The device list rendered it into a
29481
+ * **28 × 28 px `<img>`**.
29482
+ *
29483
+ * It also did not do what it appeared to do. `snapshot.getSnapshot` scoped to a
29484
+ * device routes to the NATIVE provider, not the snapshot wrapper, so it bypassed
29485
+ * the wrapper's cache, coalescing and stale-while-revalidate entirely: probed
29486
+ * live, a `force:true` call returned a fresh 1.05 MB JPEG in 0.55 s while the
29487
+ * wrapper's `lastCapturedAt` for that camera did not move. Two snapshot paths,
29488
+ * different behaviour, and only one of them maintained the cache the other one
29489
+ * reported on.
29490
+ *
29491
+ * ## What it does now
29492
+ *
29493
+ * Returns the same URL the viewer uses: `/addon/snapshot/media/<id>.jpg?w=<n>`,
29494
+ * served by the wrapper over the HTTP data plane. Relative and same-origin, so
29495
+ * the admin UI's `camstack_session` cookie authenticates it — the endpoint is
29496
+ * `access: 'authenticated'`, which accepts either a Bearer header or that
29497
+ * cookie, and a bare `<img>` can only send the cookie. This is the same
29498
+ * mechanism the native `<video>` fallback in `hls-video.tsx` already relies on.
29499
+ *
29500
+ * Caching is now the browser's, which is the point: `ETag` +
29501
+ * `Cache-Control: private, max-age=<device maxAgeS>` means a repeat render is a
29502
+ * cache hit and a revalidation is a 0-byte 304. No JS heap, no msgpack, no
29503
+ * base64. Nothing to configure — unlike `expo-image` on native, browsers
29504
+ * revalidate a stale URL rather than treating it as immutable, so the URL stays
29505
+ * stable and does NOT need a version parameter.
29506
+ */
29507
+ /** The hub-proxied path prefix for the snapshot image data plane. */
29508
+ var SNAPSHOT_MEDIA_PATH = "/addon/snapshot/media";
29509
+ function useDeviceSnapshotImage(deviceId, options = {}) {
29510
+ const { width, baseUrl } = options;
29511
+ const [refreshNonce, setRefreshNonce] = (0, react$1.useState)(0);
29468
29512
  return {
29469
- src,
29470
- loading: isLoading || isFetching,
29471
- refresh
29513
+ src: (0, react$1.useMemo)(() => {
29514
+ if (deviceId === null || deviceId <= 0) return null;
29515
+ const base = baseUrl !== void 0 ? baseUrl.replace(/\/+$/, "") : "";
29516
+ const params = new URLSearchParams();
29517
+ if (width !== void 0 && Number.isInteger(width) && width > 0) params.set("w", String(width));
29518
+ if (refreshNonce > 0) {
29519
+ params.set("force", "1");
29520
+ params.set("r", String(refreshNonce));
29521
+ }
29522
+ const query = params.toString();
29523
+ return `${base}${SNAPSHOT_MEDIA_PATH}/${String(deviceId)}.jpg${query.length > 0 ? `?${query}` : ""}`;
29524
+ }, [
29525
+ deviceId,
29526
+ width,
29527
+ baseUrl,
29528
+ refreshNonce
29529
+ ]),
29530
+ loading: false,
29531
+ refresh: (0, react$1.useCallback)(() => {
29532
+ setRefreshNonce((n) => n + 1);
29533
+ }, [])
29472
29534
  };
29473
29535
  }
29474
29536
  //#endregion
@@ -29630,8 +29692,11 @@ function HoverZoomImage({ src, alt, caption, placeholder = "No image", thumbClas
29630
29692
  }
29631
29693
  //#endregion
29632
29694
  //#region src/composites/device-item/preview.tsx
29695
+ /** Ladder rung for the device-row preview: sharp at 28 px, sharp enough at
29696
+ * the 288 px hover zoom. */
29697
+ var PREVIEW_SNAPSHOT_WIDTH = 480;
29633
29698
  function DeviceItemPreview({ trpc, device, status, enabled, showStatusPills = false }) {
29634
- const snapshot = useDeviceSnapshotImage(trpc, enabled && device.online ? device.id : null);
29699
+ const snapshot = useDeviceSnapshotImage(enabled && device.online ? device.id : null, { width: PREVIEW_SNAPSHOT_WIDTH });
29635
29700
  const isBatteryOperated = (device.features ?? []).includes("battery-operated");
29636
29701
  const wantPills = showStatusPills && isBatteryOperated && !device.disabled;
29637
29702
  const batteryStatus = useDeviceBattery(trpc, wantPills ? device.id : null);
@@ -48261,6 +48326,8 @@ exports.resolveContainerPrimary = resolveContainerPrimary;
48261
48326
  exports.resolveControlAlign = resolveControlAlign;
48262
48327
  exports.resolveDeviceControl = resolveDeviceControl;
48263
48328
  exports.resolveDisplayIcon = resolveDisplayIcon;
48329
+ exports.resolveEffectiveDefaultModel = resolveEffectiveDefaultModel;
48330
+ exports.resolveEffectiveStepModel = resolveEffectiveStepModel;
48264
48331
  exports.resolveEventKindIcon = resolveEventKindIcon;
48265
48332
  exports.resolvePrimaryChild = resolvePrimaryChild;
48266
48333
  exports.resolveSensorDisplay = resolveSensorDisplay;
@@ -48274,6 +48341,8 @@ exports.shouldEmit = shouldEmit;
48274
48341
  exports.shouldUseSingleNode = shouldUseSingleNode;
48275
48342
  exports.sortRows = sortRows;
48276
48343
  exports.statusIcons = statusIcons;
48344
+ exports.stepHasModelForFormat = stepHasModelForFormat;
48345
+ exports.stepModelOptions = stepModelOptions;
48277
48346
  exports.stripParentNamePrefix = stripParentNamePrefix;
48278
48347
  exports.tankAlert = tankAlert;
48279
48348
  exports.themeToCss = require_theme_index.themeToCss$1;
@@ -48431,6 +48500,7 @@ exports.useCoreBlocksDelete = useCoreBlocksDelete;
48431
48500
  exports.useCoreBlocksGet = useCoreBlocksGet;
48432
48501
  exports.useCoreBlocksGetTypeDefs = useCoreBlocksGetTypeDefs;
48433
48502
  exports.useCoreBlocksList = useCoreBlocksList;
48503
+ exports.useCoreBlocksRestart = useCoreBlocksRestart;
48434
48504
  exports.useCoreBlocksSetEnabled = useCoreBlocksSetEnabled;
48435
48505
  exports.useCoreBlocksUpdate = useCoreBlocksUpdate;
48436
48506
  exports.useCoverClose = useCoverClose;
@@ -48547,7 +48617,6 @@ exports.useDeviceManagerRemoveDevice = useDeviceManagerRemoveDevice;
48547
48617
  exports.useDeviceManagerRemoveLocation = useDeviceManagerRemoveLocation;
48548
48618
  exports.useDeviceManagerRunDeviceAction = useDeviceManagerRunDeviceAction;
48549
48619
  exports.useDeviceManagerSetChildLayout = useDeviceManagerSetChildLayout;
48550
- exports.useDeviceManagerSetDeviceLinks = useDeviceManagerSetDeviceLinks;
48551
48620
  exports.useDeviceManagerSetDisabled = useDeviceManagerSetDisabled;
48552
48621
  exports.useDeviceManagerSetDisplay = useDeviceManagerSetDisplay;
48553
48622
  exports.useDeviceManagerSetIntegrationId = useDeviceManagerSetIntegrationId;
@@ -49105,6 +49174,7 @@ exports.useStorageWriteChunk = useStorageWriteChunk;
49105
49174
  exports.useStreamBrokerAcquireEgressTranscode = useStreamBrokerAcquireEgressTranscode;
49106
49175
  exports.useStreamBrokerApplyDeviceSettingsPatch = useStreamBrokerApplyDeviceSettingsPatch;
49107
49176
  exports.useStreamBrokerAssignProfile = useStreamBrokerAssignProfile;
49177
+ exports.useStreamBrokerFetchEventMedia = useStreamBrokerFetchEventMedia;
49108
49178
  exports.useStreamBrokerGetAllRtspEntries = useStreamBrokerGetAllRtspEntries;
49109
49179
  exports.useStreamBrokerGetBrokerStats = useStreamBrokerGetBrokerStats;
49110
49180
  exports.useStreamBrokerGetDeviceAudioMute = useStreamBrokerGetDeviceAudioMute;
@@ -49121,6 +49191,7 @@ exports.useStreamBrokerListAllCameraStreams = useStreamBrokerListAllCameraStream
49121
49191
  exports.useStreamBrokerListAllProfileSlots = useStreamBrokerListAllProfileSlots;
49122
49192
  exports.useStreamBrokerListClients = useStreamBrokerListClients;
49123
49193
  exports.useStreamBrokerProbeStream = useStreamBrokerProbeStream;
49194
+ exports.useStreamBrokerProduceEventMedia = useStreamBrokerProduceEventMedia;
49124
49195
  exports.useStreamBrokerPublishCameraStream = useStreamBrokerPublishCameraStream;
49125
49196
  exports.useStreamBrokerPullAudioChunks = useStreamBrokerPullAudioChunks;
49126
49197
  exports.useStreamBrokerPullFrameHandles = useStreamBrokerPullFrameHandles;
package/dist/index.js CHANGED
@@ -3709,6 +3709,62 @@ var CHIP_BASE = "inline-flex items-center gap-1 rounded-full border px-1.5 py-0.
3709
3709
  var CHIP_ACTIVE = "border-primary/50 bg-primary/15 text-primary";
3710
3710
  var CHIP_INACTIVE = "border-border bg-surface text-foreground-subtle hover:bg-surface-hover";
3711
3711
  //#endregion
3712
+ //#region src/composites/resolve-step-default-model.ts
3713
+ function resolveStepDefaultModel(catalog, format) {
3714
+ const hasFormatBuild = (modelId) => catalog.models.find((m) => m.id === modelId)?.formats[format] !== void 0;
3715
+ const declared = catalog.defaultModelIdByFormat?.[format];
3716
+ if (declared !== void 0 && hasFormatBuild(declared)) return declared;
3717
+ if (hasFormatBuild(catalog.defaultModelId)) return catalog.defaultModelId;
3718
+ const available = catalog.models.filter((m) => m.formats[format] !== void 0 && m.legacy !== true);
3719
+ if (available.length === 0) return catalog.defaultModelId;
3720
+ return [...available].toSorted((a, b) => (a.formats[format]?.sizeMB ?? Infinity) - (b.formats[format]?.sizeMB ?? Infinity))[0].id;
3721
+ }
3722
+ /**
3723
+ * The model a matrix CELL shows as this step's effective default on `device`.
3724
+ *
3725
+ * The device's ELECTED model (`device.defaultModelId`, the per-device
3726
+ * object-detection election) applies ONLY when this step's catalog actually
3727
+ * contains it — `slot === 'detector'` alone is too wide, because
3728
+ * package-detection shares the detector slot with the root step. Bit live
3729
+ * 2026-08-08: rfdetr-package became the package step's default and every
3730
+ * matrix cell still showed the device's yolo as the "selected" model, because
3731
+ * the election was applied slot-wide. Membership is the principled gate: an
3732
+ * elected model this step cannot run is never displayed for it.
3733
+ */
3734
+ function resolveEffectiveDefaultModel(catalog, device) {
3735
+ const format = device?.format;
3736
+ if (format === void 0) return void 0;
3737
+ const elected = device?.defaultModelId;
3738
+ return catalog.slot === "detector" && elected !== void 0 && catalog.models.some((m) => m.id === elected) ? elected : resolveStepDefaultModel(catalog, format);
3739
+ }
3740
+ /**
3741
+ * The models a step may run on an engine `format` — the ONE derivation of the
3742
+ * option list. An unknown format yields NOTHING rather than everything: a
3743
+ * picker that offered a model with no build for the device would write a pin
3744
+ * the runner cannot honour.
3745
+ */
3746
+ function stepModelOptions(models, format) {
3747
+ if (format === void 0) return [];
3748
+ return models.filter((m) => m.formats[format] !== void 0);
3749
+ }
3750
+ /** Can this step run on `format` at all? (`false` ⇒ the caller renders "⚠ skip"/"—".) */
3751
+ function stepHasModelForFormat(models, format) {
3752
+ return stepModelOptions(models, format).length > 0;
3753
+ }
3754
+ /**
3755
+ * The model a step ACTUALLY runs for a (device, camera) — the whole effective
3756
+ * chain in one place: per-camera override → per-(node,device) base → the
3757
+ * resolved default (`resolveEffectiveDefaultModel`).
3758
+ *
3759
+ * Every surface calls this: the matrix cell, and the drawer's picker seed. They
3760
+ * are the same number, and the only way to keep them the same number is to have
3761
+ * one function produce it. A surface that owns fewer layers omits them (the node
3762
+ * matrix passes no `override`) — it does NOT get its own resolver.
3763
+ */
3764
+ function resolveEffectiveStepModel(input) {
3765
+ return input.override ?? input.base ?? resolveEffectiveDefaultModel(input.catalog, input.device);
3766
+ }
3767
+ //#endregion
3712
3768
  //#region src/lib/pipeline-mirror.ts
3713
3769
  function findAddonInCatalog(catalog, addonId) {
3714
3770
  for (const slot of catalog.slots) for (const addon of slot.addons) if (addon.id === addonId) return addon;
@@ -3717,8 +3773,20 @@ function findAddonInCatalog(catalog, addonId) {
3717
3773
  function findModel(addon, modelId) {
3718
3774
  return addon.models.find((m) => m.id === modelId) ?? null;
3719
3775
  }
3720
- function firstModelFor(addon, format) {
3721
- return addon.models.find((m) => Boolean(m.formats[format])) ?? null;
3776
+ /**
3777
+ * The model to adopt on the target when the source's pin has no build there.
3778
+ *
3779
+ * Options come from the shared step-model primitive, and the CHOICE is the
3780
+ * step's own resolved default for that format — not "the first entry in the
3781
+ * array", which is how a mirror could land on `yolov8n-package` for a step
3782
+ * whose declared default is `rfdetr-package`, disagreeing with the very cell
3783
+ * the steps matrix renders right after the mirror.
3784
+ */
3785
+ function fallbackModelFor(addon, format) {
3786
+ const options = stepModelOptions(addon.models, format);
3787
+ if (options.length === 0) return null;
3788
+ const resolved = resolveStepDefaultModel(addon, format);
3789
+ return options.find((m) => m.id === resolved) ?? options[0] ?? null;
3722
3790
  }
3723
3791
  function dropModelSpecific(settings, targetAddon) {
3724
3792
  const allowedKeys = new Set((targetAddon.configSchema ?? []).map((f) => f.key));
@@ -3759,11 +3827,11 @@ function mirror(input) {
3759
3827
  outcome = "exact";
3760
3828
  } else {
3761
3829
  const srcModel = findModel(targetAddon, srcCfg.modelId);
3762
- if (srcModel !== null && Boolean(srcModel.formats[target.engine.format])) {
3830
+ if (srcModel !== null && stepModelOptions([srcModel], target.engine.format).length > 0) {
3763
3831
  chosenModelId = srcCfg.modelId;
3764
3832
  outcome = "exact";
3765
3833
  } else {
3766
- const fallback = firstModelFor(targetAddon, target.engine.format);
3834
+ const fallback = fallbackModelFor(targetAddon, target.engine.format);
3767
3835
  if (!fallback) {
3768
3836
  out.push({
3769
3837
  addonId,
@@ -14207,7 +14275,7 @@ function ModelPicker({ models, value, onChange, disabled }) {
14207
14275
  });
14208
14276
  if (!hasGroups) return /* @__PURE__ */ jsxs("div", {
14209
14277
  className: "space-y-2",
14210
- children: [unresolvedBanner, flatSelect(models)]
14278
+ children: [unresolvedBanner, flatSelect(models, "— select a model —")]
14211
14279
  });
14212
14280
  return /* @__PURE__ */ jsxs("div", {
14213
14281
  className: "space-y-3",
@@ -14734,7 +14802,7 @@ function DeviceModeEditor({ addon, agentDefault, agentNodeId, currentPatch, mode
14734
14802
  }
14735
14803
  function AgentStepEditor(props) {
14736
14804
  const { mode, addon, agentDefault, agentNodeId, currentPatch, onChangeAgentConfig, onChangePatch, engineFormat, effectiveModelId } = props;
14737
- const modelsForFormat = useMemo(() => addon.models.filter((m) => Boolean(m.formats[engineFormat])), [addon.models, engineFormat]);
14805
+ const modelsForFormat = useMemo(() => stepModelOptions(addon.models, engineFormat), [addon.models, engineFormat]);
14738
14806
  if (mode === "agent") return /* @__PURE__ */ jsx(AgentModeEditor, {
14739
14807
  addon,
14740
14808
  agentDefault,
@@ -15406,17 +15474,6 @@ function DeviceStepMatrix({ tree, agents, gateFor, getCellState, onCellClick, se
15406
15474
  });
15407
15475
  }
15408
15476
  //#endregion
15409
- //#region src/composites/resolve-step-default-model.ts
15410
- function resolveStepDefaultModel(catalog, format) {
15411
- const hasFormatBuild = (modelId) => catalog.models.find((m) => m.id === modelId)?.formats[format] !== void 0;
15412
- const declared = catalog.defaultModelIdByFormat?.[format];
15413
- if (declared !== void 0 && hasFormatBuild(declared)) return declared;
15414
- if (hasFormatBuild(catalog.defaultModelId)) return catalog.defaultModelId;
15415
- const available = catalog.models.filter((m) => m.formats[format] !== void 0 && m.legacy !== true);
15416
- if (available.length === 0) return catalog.defaultModelId;
15417
- return [...available].toSorted((a, b) => (a.formats[format]?.sizeMB ?? Infinity) - (b.formats[format]?.sizeMB ?? Infinity))[0].id;
15418
- }
15419
- //#endregion
15420
15477
  //#region src/trpc-react.ts
15421
15478
  /**
15422
15479
  * Shared typed React Query proxy for the backend AppRouter.
@@ -18440,6 +18497,8 @@ var useCoreBlocksUpdate = trpc.coreBlocks.update.useMutation;
18440
18497
  var useCoreBlocksDelete = trpc.coreBlocks.delete.useMutation;
18441
18498
  /** Generated alias around `trpc.coreBlocks.setEnabled.useMutation`. */
18442
18499
  var useCoreBlocksSetEnabled = trpc.coreBlocks.setEnabled.useMutation;
18500
+ /** Generated alias around `trpc.coreBlocks.restart.useMutation`. */
18501
+ var useCoreBlocksRestart = trpc.coreBlocks.restart.useMutation;
18443
18502
  /** Generated alias around `trpc.coreBlocks.compile.useMutation`. */
18444
18503
  var useCoreBlocksCompile = trpc.coreBlocks.compile.useMutation;
18445
18504
  /** Generated alias around `trpc.coreBlocks.getTypeDefs.useQuery`. */
@@ -18566,8 +18625,6 @@ var useDeviceManagerSetLinkDeviceId = trpc.deviceManager.setLinkDeviceId.useMuta
18566
18625
  var useDeviceManagerSetPrimaryChildEntityId = trpc.deviceManager.setPrimaryChildEntityId.useMutation;
18567
18626
  /** Generated alias around `trpc.deviceManager.setChildLayout.useMutation`. */
18568
18627
  var useDeviceManagerSetChildLayout = trpc.deviceManager.setChildLayout.useMutation;
18569
- /** Generated alias around `trpc.deviceManager.setDeviceLinks.useMutation`. */
18570
- var useDeviceManagerSetDeviceLinks = trpc.deviceManager.setDeviceLinks.useMutation;
18571
18628
  /** Generated alias around `trpc.deviceManager.setDisplay.useMutation`. */
18572
18629
  var useDeviceManagerSetDisplay = trpc.deviceManager.setDisplay.useMutation;
18573
18630
  /** Generated alias around `trpc.deviceManager.getRoleDisplayDefaults.useQuery`. */
@@ -19716,6 +19773,10 @@ var useStreamBrokerAssignProfile = trpc.streamBroker.assignProfile.useMutation;
19716
19773
  var useStreamBrokerUnassignProfile = trpc.streamBroker.unassignProfile.useMutation;
19717
19774
  /** Generated alias around `trpc.streamBroker.renderPreBufferClip.useMutation`. */
19718
19775
  var useStreamBrokerRenderPreBufferClip = trpc.streamBroker.renderPreBufferClip.useMutation;
19776
+ /** Generated alias around `trpc.streamBroker.produceEventMedia.useMutation`. */
19777
+ var useStreamBrokerProduceEventMedia = trpc.streamBroker.produceEventMedia.useMutation;
19778
+ /** Generated alias around `trpc.streamBroker.fetchEventMedia.useMutation`. */
19779
+ var useStreamBrokerFetchEventMedia = trpc.streamBroker.fetchEventMedia.useMutation;
19719
19780
  /** Generated alias around `trpc.streamBroker.listAllCameraStreams.useQuery`. */
19720
19781
  var useStreamBrokerListAllCameraStreams = trpc.streamBroker.listAllCameraStreams.useQuery;
19721
19782
  /** Generated alias around `trpc.streamBroker.listAllProfileSlots.useQuery`. */
@@ -29384,67 +29445,68 @@ function useDeviceBattery(trpc, deviceId) {
29384
29445
  //#endregion
29385
29446
  //#region src/hooks/use-device-snapshot.ts
29386
29447
  /**
29387
- * useDeviceSnapshotImage — autosufficient snapshot fetcher for a device.
29388
- *
29389
- * Wraps the entire `dev.snapshot.getSnapshot({force?})` boilerplate
29390
- * (proxy lookup + react-query caching + force-refresh ref + data-URL
29391
- * conversion) into a single hook so callers don't drill snapshot
29392
- * state into their stream-player components.
29393
- *
29394
- * Caching: the result lives in react-query's global QueryClient
29395
- * (the singleton at app scope), keyed by `['device', N, 'snapshot']`.
29396
- * That IS the "global context" — every consumer mounting the hook
29397
- * with the same `deviceId` shares the same cache entry, AND when a
29398
- * consumer unmounts and remounts the cached value is served
29399
- * instantly. We pin a long `gcTime` so the entry survives unmount
29400
- * cycles, and a short `staleTime` so a remount after a real gap
29401
- * re-validates against the camera in the background:
29402
- * - `staleTime: 10_000` fresh for 10s, then re-fetches on next mount
29403
- * - `gcTime: 86400_000` kept for 24h after last consumer leaves
29404
- * Window-focus and reconnect refetch are off so the camera isn't
29405
- * pinged on every tab switch. Manual refresh via `refresh()` always
29406
- * bypasses the cache.
29407
- *
29408
- * Returns:
29409
- * - `src`: data-URL ready to drop into `<img>` (or `null` until the
29410
- * first successful fetch).
29411
- * - `loading`: true while a fetch is in flight (initial OR refresh).
29412
- * - `refresh()`: forces exactly ONE bypass-cache fetch.
29413
- *
29414
- * The hook is data-only — render decisions (placeholder, paused
29415
- * preview, …) live in the component that consumes it.
29416
- */
29417
- function useDeviceSnapshotImage(trpc, deviceId) {
29418
- const dev = useDeviceProxy(trpc, deviceId);
29419
- const forceRef = useRef(false);
29420
- const { data, isLoading, isFetching, refetch } = useQuery({
29421
- queryKey: [
29422
- "device",
29423
- deviceId,
29424
- "snapshot"
29425
- ],
29426
- queryFn: () => {
29427
- if (!dev) throw new Error("useDeviceSnapshotImage: device proxy not ready");
29428
- const force = forceRef.current;
29429
- forceRef.current = false;
29430
- return dev.snapshot?.getSnapshot({ force }) ?? null;
29431
- },
29432
- enabled: dev !== null && deviceId !== null,
29433
- staleTime: 1e4,
29434
- gcTime: 1440 * 60 * 1e3,
29435
- refetchOnWindowFocus: false,
29436
- refetchOnReconnect: false,
29437
- retry: false
29438
- });
29439
- const src = data ? `data:${data.contentType};base64,${data.base64}` : null;
29440
- function refresh() {
29441
- forceRef.current = true;
29442
- refetch();
29443
- }
29448
+ * useDeviceSnapshotImage — a device's snapshot as a plain image URL.
29449
+ *
29450
+ * ## What this used to do, and why it stopped
29451
+ *
29452
+ * It fetched `dev.snapshot.getSnapshot()` over tRPC and returned
29453
+ * `data:image/jpeg;base64,…`. That put a full camera capture — up to 4 K,
29454
+ * measured at 758 KB average per camera on the live hub — through the msgpack
29455
+ * WebSocket plane, base64-inflated by a third, and then held it in the
29456
+ * react-query heap for 24 h per device. The device list rendered it into a
29457
+ * **28 × 28 px `<img>`**.
29458
+ *
29459
+ * It also did not do what it appeared to do. `snapshot.getSnapshot` scoped to a
29460
+ * device routes to the NATIVE provider, not the snapshot wrapper, so it bypassed
29461
+ * the wrapper's cache, coalescing and stale-while-revalidate entirely: probed
29462
+ * live, a `force:true` call returned a fresh 1.05 MB JPEG in 0.55 s while the
29463
+ * wrapper's `lastCapturedAt` for that camera did not move. Two snapshot paths,
29464
+ * different behaviour, and only one of them maintained the cache the other one
29465
+ * reported on.
29466
+ *
29467
+ * ## What it does now
29468
+ *
29469
+ * Returns the same URL the viewer uses: `/addon/snapshot/media/<id>.jpg?w=<n>`,
29470
+ * served by the wrapper over the HTTP data plane. Relative and same-origin, so
29471
+ * the admin UI's `camstack_session` cookie authenticates it — the endpoint is
29472
+ * `access: 'authenticated'`, which accepts either a Bearer header or that
29473
+ * cookie, and a bare `<img>` can only send the cookie. This is the same
29474
+ * mechanism the native `<video>` fallback in `hls-video.tsx` already relies on.
29475
+ *
29476
+ * Caching is now the browser's, which is the point: `ETag` +
29477
+ * `Cache-Control: private, max-age=<device maxAgeS>` means a repeat render is a
29478
+ * cache hit and a revalidation is a 0-byte 304. No JS heap, no msgpack, no
29479
+ * base64. Nothing to configure — unlike `expo-image` on native, browsers
29480
+ * revalidate a stale URL rather than treating it as immutable, so the URL stays
29481
+ * stable and does NOT need a version parameter.
29482
+ */
29483
+ /** The hub-proxied path prefix for the snapshot image data plane. */
29484
+ var SNAPSHOT_MEDIA_PATH = "/addon/snapshot/media";
29485
+ function useDeviceSnapshotImage(deviceId, options = {}) {
29486
+ const { width, baseUrl } = options;
29487
+ const [refreshNonce, setRefreshNonce] = useState(0);
29444
29488
  return {
29445
- src,
29446
- loading: isLoading || isFetching,
29447
- refresh
29489
+ src: useMemo(() => {
29490
+ if (deviceId === null || deviceId <= 0) return null;
29491
+ const base = baseUrl !== void 0 ? baseUrl.replace(/\/+$/, "") : "";
29492
+ const params = new URLSearchParams();
29493
+ if (width !== void 0 && Number.isInteger(width) && width > 0) params.set("w", String(width));
29494
+ if (refreshNonce > 0) {
29495
+ params.set("force", "1");
29496
+ params.set("r", String(refreshNonce));
29497
+ }
29498
+ const query = params.toString();
29499
+ return `${base}${SNAPSHOT_MEDIA_PATH}/${String(deviceId)}.jpg${query.length > 0 ? `?${query}` : ""}`;
29500
+ }, [
29501
+ deviceId,
29502
+ width,
29503
+ baseUrl,
29504
+ refreshNonce
29505
+ ]),
29506
+ loading: false,
29507
+ refresh: useCallback(() => {
29508
+ setRefreshNonce((n) => n + 1);
29509
+ }, [])
29448
29510
  };
29449
29511
  }
29450
29512
  //#endregion
@@ -29606,8 +29668,11 @@ function HoverZoomImage({ src, alt, caption, placeholder = "No image", thumbClas
29606
29668
  }
29607
29669
  //#endregion
29608
29670
  //#region src/composites/device-item/preview.tsx
29671
+ /** Ladder rung for the device-row preview: sharp at 28 px, sharp enough at
29672
+ * the 288 px hover zoom. */
29673
+ var PREVIEW_SNAPSHOT_WIDTH = 480;
29609
29674
  function DeviceItemPreview({ trpc, device, status, enabled, showStatusPills = false }) {
29610
- const snapshot = useDeviceSnapshotImage(trpc, enabled && device.online ? device.id : null);
29675
+ const snapshot = useDeviceSnapshotImage(enabled && device.online ? device.id : null, { width: PREVIEW_SNAPSHOT_WIDTH });
29611
29676
  const isBatteryOperated = (device.features ?? []).includes("battery-operated");
29612
29677
  const wantPills = showStatusPills && isBatteryOperated && !device.disabled;
29613
29678
  const batteryStatus = useDeviceBattery(trpc, wantPills ? device.id : null);
@@ -47915,4 +47980,4 @@ var MotionZonesSettings = lazy(() => import("./MotionZonesSettings-NcxxQN8r.js")
47915
47980
  /** Lazy-wrapped `PrivacyMaskSettings` — code-split off the main bundle. */
47916
47981
  var PrivacyMaskSettings = lazy(() => import("./PrivacyMaskSettings-APgPLF7p.js").then((m) => ({ default: m.PrivacyMaskSettings })));
47917
47982
  //#endregion
47918
- export { AddonGlobalSettingsForm, AgentStepEditor, AlarmHeroCard, AlarmInlineControl as AlarmPanelInlineControl, AppShell, ArcKnob, AudioClassificationList, AudioLevelWaveform, AudioWaveform, AutomationHeroCard, AutomationInlineControl, AutotrackSection, BTN_COMPACT, BTN_COMPACT_DANGER, BTN_COMPACT_PRIMARY, BTN_COMPACT_WARNING, Badge, BatteryBadge, BottomSheet, Breadcrumb, BrightnessPanel, Button, ButtonControl, ButtonHeroCard, CARD_MODE_MIN_COLUMNS, CENTER, CHIP_ACTIVE, CHIP_BASE, CHIP_INACTIVE, CLASS_COLORS, COLUMN_BREAKPOINT_CLASS, COLUMN_PRIORITY, COMMIT_DEDUPE_TOLERANCE_MS, COMMIT_DEDUPE_WINDOW_MS, CONTROL_CAP_NAMES, CONTROL_FILLS, CameraStreamPlayer, Card, Checkbox, ChildSectionAccordion, ClimatePanel, CodeBlock, CollapsibleCard, ConfigFormBuilder, FormField as ConfigFormField, ConfigSchemaField, ConfirmActionButton, ConfirmDialogProvider, ConsumablesPanel, ContainerChildrenProvider, ContainerPrimaryHero, ControlColumn, ControlHeroCard, ControlInlineControl, ControlPanel, CopyButton, CoverHeroCard, CoverInlineControl, CoverPanel, CustomFieldRenderersProvider, DEFAULT_COLOR, DEVICE_COLUMNS, DEVICE_LIST_PAGE_SIZE_KEY, DEVICE_LIST_PAGE_SIZE_OPTIONS, DEVICE_ROLE_META, DEVICE_TYPE_CONTROL, DEVICE_TYPE_META, DISPLAY_ICON_REGISTRY, DataTable, DetectionCanvas, DetectionOverlay, DetectionResultTree, DevShell, DeviceActivityPanel, DeviceBatchToolbar, DeviceCard, DeviceContextProvider, DeviceExportPanel, DeviceGrid, DeviceItem, DeviceList, DeviceMultiSelectField, DeviceSelectField, 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, RECONNECT_POLICY, RECORDED_PLAYBACK_MODES, RIGHT, ROLE_DESCRIPTOR, RadialGauge, RecordedPlaybackProvider, RecordingPanel, ResponseLog, SECTION_BODY, SECTION_CARD, SECTION_HEADER, SETTING_ROW, SETTING_ROW_LABEL, SETTING_ROW_STACK_BREAKPOINT, SETTING_ROW_VALUE, SETTING_ROW_VALUE_TEXT, SPLIT_PANEL_OUTER, SPLIT_PANEL_SIDE, STACK_GAP, STATE_COLOR, ScopePicker, ScriptHeroCard, ScriptInlineControl, ScrollArea, Select, SemanticBadge, SensorHeroCard, SensorInlineControl, SensorValueAtom, Separator, SettingRow, Sidebar, SidebarItem, Skeleton, SlideOverPanel, SlideToggle, SnapshotButton, StatCard, StateValuesStream, StatusBadge, StepTimings, StepTreeMaster, Stepper, StreamBrokerSelector, StreamPanel, Switch, SwitchHeroCard, SwitchInlineControl, SwitchPanel, SystemProvider, 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, nextReconnectAction, nextSort, normalizeForSearch, overrideEntityIdFromLink, parseRecordedServerMessage, providerIcons, EyeOff as r, resolveContainerPrimary, resolveControlAlign, resolveDeviceControl, resolveDisplayIcon, resolveEventKindIcon, resolvePrimaryChild, resolveSensorDisplay, resolveStepDefaultModel, resolveTableLayout, 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, useBackupDeleteSchedule, useBackupGetEntries, useBackupList, useBackupListArchives, useBackupListDestinations, useBackupListLocations, useBackupListSchedules, useBackupPreviewSchedule, useBackupRestore, useBackupTrigger, useBackupUpsertDestinationPolicy, useBackupUpsertSchedule, useBatteryGetStatus, useBatteryWakeForStream, useBinaryGetStatus, useBrightnessGetStatus, useBrightnessSetBrightness, useBrokerAdd, useBrokerGet, useBrokerGetBrokerConfig, useBrokerGetSettings, useBrokerGetSettingsSchema, useBrokerGetState, useBrokerGetStatus, useBrokerList, useBrokerListProviders, useBrokerPublish, useBrokerRemove, useBrokerSetSettings, useBrokerSubscribe, useBrokerTestConnection, useBrokerTestSettings, useBrokerUnsubscribe, useButtonPress, useCameraCredentialsGetCredentials, useCameraCredentialsGetStatus, useCameraPipelineConfigApplyDeviceSettingsPatch, useCameraPipelineConfigGetDeviceLiveContribution, useCameraPipelineConfigGetDeviceSettingsContribution, useCameraStreamsGetBrokerStreams, useCameraStreamsGetCameraStreams, useCameraStreamsGetProfileRtspEntries, useCameraStreamsGetRtspEntries, useCameraStreamsPickStream, useCarbonMonoxideGetStatus, useClimateControlGetStatus, useClimateControlSetFanMode, useClimateControlSetMode, useClimateControlSetPreset, useClimateControlSetSwingHorizontal, useClimateControlSetSwingVertical, useClimateControlSetTarget, useClimateControlSetTargetHumidity, useClimateControlSetTargetRange, useClusterNodes, useColorGetStatus, useColorSetColor, useConfirm, useConnectivityGetStatus, useConsumablesGetStatus, useConsumablesReset, useContactGetStatus, useContainerChildren, useControlGetStatus, useControlSetValue, useCoreBlocksCompile, useCoreBlocksCreate, useCoreBlocksDelete, useCoreBlocksGet, useCoreBlocksGetTypeDefs, useCoreBlocksList, useCoreBlocksSetEnabled, useCoreBlocksUpdate, useCoverClose, useCoverGetStatus, useCoverOpen, useCoverSetPosition, useCoverSetTiltPosition, useCoverStop, useCustomFieldRenderer, useDayNightGetOptions, useDayNightGetStatus, useDayNightSetSettings, useDebouncedString, useDecoderCreateSession, useDecoderDestroySession, useDecoderGetFrame, useDecoderGetInfo, useDecoderGetShmStats, useDecoderGetStats, useDecoderListActiveSessions, useDecoderOpenStream, useDecoderPullFrames, useDecoderPullHandles, useDecoderPushPacket, useDecoderReprobeHwaccel, useDecoderSupportsCodec, useDecoderUpdateConfig, useDetectionPipelineApplyDeviceSettingsPatch, useDetectionPipelineGetDeviceLiveContribution, useDetectionPipelineGetDeviceSettingsContribution, useDevShell, useDevice, useDeviceAdoptionAdopt, useDeviceAdoptionGetCandidate, useDeviceAdoptionGetStatus, useDeviceAdoptionListCandidateFilters, useDeviceAdoptionListCandidates, useDeviceAdoptionRefresh, useDeviceAdoptionRelease, useDeviceAdoptionResync, useDeviceAutotrack, useDeviceBattery, useDeviceCapSlice, useDeviceCapability, useDeviceDetections, useDeviceDiscoveryAdoptDevice, useDeviceDiscoveryGetStatus, useDeviceDiscoveryListDiscovered, useDeviceDiscoveryRefreshDiscovery, useDeviceDiscoveryReleaseDevice, useDeviceExportApplyDeviceSettingsPatch, useDeviceExportExposeDevice, useDeviceExportGetDeviceLiveContribution, useDeviceExportGetDeviceSettingsContribution, useDeviceExportGetStatus, useDeviceExportListExposedDevices, useDeviceExportListSupportedDeviceKinds, useDeviceExportUnexposeDevice, useDeviceId, useDeviceListPageSize, useDeviceManagerAddLocation, useDeviceManagerAdoptDevice, useDeviceManagerAdoptionAdopt, 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, useDeviceManagerGetDeviceStatusAggregateBatch, 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, useLocalNetworkGetNotificationEndpoint, useLocalNetworkGetPreferred, useLocalNetworkList, useLocalNetworkResetAllowlistToBestMatch, useLocalNetworkSetAllowedAddresses, useLocalNetworkSetNotificationEndpoint, useLockControlGetStatus, useLockControlLock, useLockControlOpen, useLockControlUnlock, useMediaPlayerGetStatus, useMediaPlayerNext, useMediaPlayerPause, useMediaPlayerPlay, useMediaPlayerPlayMedia, useMediaPlayerPrevious, useMediaPlayerSeek, useMediaPlayerSelectSource, useMediaPlayerSetMute, useMediaPlayerSetRepeat, useMediaPlayerSetShuffle, useMediaPlayerSetVolume, useMediaPlayerStop, useMeshNetworkGetStatus, useMeshNetworkJoin, useMeshNetworkLeave, useMeshNetworkListPeers, useMeshNetworkLogout, useMeshNetworkStartLogin, useMeshNetworkTestConnection, useMetricsProviderCollectSnapshot, useMetricsProviderDumpHeapSnapshot, useMetricsProviderGetAddonStats, useMetricsProviderGetCached, useMetricsProviderGetCpuTemperature, useMetricsProviderGetCurrent, useMetricsProviderGetDiskSpace, useMetricsProviderGetGpuInfo, useMetricsProviderGetProcessStats, useMetricsProviderKillProcess, useMetricsProviderListAddonInstances, useMetricsProviderListNodeProcesses, useMotionDetectionAnalyze, useMotionDetectionApplyDeviceSettingsPatch, useMotionDetectionGetDeviceLiveContribution, useMotionDetectionGetDeviceSettingsContribution, useMotionDetectionRemoveCamera, useMotionDetectionReset, useMotionGetStatus, useMotionIsDetected, useMotionTriggerGetStatus, useMotionTriggerSetMotionTrigger, useMotionZonesGetOptions, useMotionZonesGetStatus, useMotionZonesSetZone, useMqttBrokerAddBroker, useMqttBrokerGetBrokerConfig, useMqttBrokerGetStatus, useMqttBrokerListBrokers, useMqttBrokerRemoveBroker, useMqttBrokerStartEmbeddedBroker, useMqttBrokerStopEmbeddedBroker, useMqttBrokerTestConnection, useNativeObjectDetectionGetStatus, useNativeObjectDetectionSetEnabled, useNetworkAccessGetEndpoint, useNetworkAccessGetStatus, useNetworkAccessListEndpoints, useNetworkAccessStart, useNetworkAccessStop, useNetworkQualityGetAllStats, useNetworkQualityGetDeviceStats, useNetworkQualityReportClientStats, useNodesClusterAddonStatus, useNodesDeployAddon, useNodesExecuteQuery, useNodesGetCapUsageGraph, useNodesGetNodeAddons, useNodesRenameNode, useNodesRestartAddon, useNodesRestartNode, useNodesRestartProcess, useNodesSetProcessLogLevel, useNodesShutdownNode, useNodesTopology, useNodesUndeployAddon, useNotificationOutputDeleteTarget, useNotificationOutputDiscoverTargets, useNotificationOutputListTargetKinds, useNotificationOutputListTargets, useNotificationOutputSend, useNotificationOutputSetTargetEnabled, useNotificationOutputTestTarget, useNotificationOutputUpsertTarget, useNotificationRulesCancelSnooze, useNotificationRulesCreateRule, useNotificationRulesCreateSnooze, useNotificationRulesDeleteRule, useNotificationRulesGetAlarmConfig, useNotificationRulesGetConditionCatalog, useNotificationRulesGetHistory, useNotificationRulesGetRule, useNotificationRulesListDeviceMutes, useNotificationRulesListRules, useNotificationRulesListSnoozes, useNotificationRulesSetAlarmConfig, useNotificationRulesSetDeviceMuted, useNotificationRulesSetRuleEnabled, useNotificationRulesTestRule, useNotificationRulesUpdateRule, useNotifierCancel, useNotifierGetStatus, useNotifierSend, useNumericSensorGetStatus, useOptimisticSlice, useOptionalSystem, useOptionalWidgetRegistry, useOsdGetStatus, useOsdManagerClearSlotBinding, useOsdManagerGetConditionSupport, useOsdManagerGetDeviceOsd, useOsdManagerGetSourceCatalog, useOsdManagerPreviewSlot, useOsdManagerRenderDevice, useOsdManagerSetSlotBinding, useOsdSetOverlay, usePTZ, usePetFeederCallPet, usePetFeederCancelFeed, usePetFeederFeed, usePetFeederGetStatus, usePetFeederMarkFoodReplenished, usePetFeederPlaySound, usePetFeederResetDesiccant, usePetFeederSetChildLock, usePetFeederSetFeedSound, usePetFeederSetIndicatorLight, usePetFeederSetVolume, usePipelineAnalyticsApplyDeviceSettingsPatch, usePipelineAnalyticsCancelMediaRelocate, usePipelineAnalyticsClearTracks, usePipelineAnalyticsCompleteRetrainTrack, usePipelineAnalyticsDeleteDeviceEvents, usePipelineAnalyticsDeleteTracks, usePipelineAnalyticsDeselectRetrainFrame, usePipelineAnalyticsGetActiveTracks, usePipelineAnalyticsGetAudioEvents, usePipelineAnalyticsGetDeviceLiveContribution, usePipelineAnalyticsGetDeviceSettingsContribution, usePipelineAnalyticsGetEventDensity, usePipelineAnalyticsGetEventMedia, usePipelineAnalyticsGetEventStoreFootprint, usePipelineAnalyticsGetKeyEvents, usePipelineAnalyticsGetMediaRelocateStatus, usePipelineAnalyticsGetMotionEvents, usePipelineAnalyticsGetObjectEmbeddingRebuildStatus, usePipelineAnalyticsGetObjectEvents, usePipelineAnalyticsGetRetrainExportUrl, usePipelineAnalyticsGetRetrainFrameImage, usePipelineAnalyticsGetSensorEvents, usePipelineAnalyticsGetTrack, usePipelineAnalyticsGetTrackMedia, usePipelineAnalyticsGetTrainingExportSummary, usePipelineAnalyticsGetTrainingExportUrl, usePipelineAnalyticsListEventKinds, usePipelineAnalyticsListEventKindsBatch, usePipelineAnalyticsListOpsLog, usePipelineAnalyticsListRecentTracks, usePipelineAnalyticsListRetrainAnnotations, usePipelineAnalyticsListRetrainFrames, usePipelineAnalyticsListRetrainStaging, usePipelineAnalyticsListTrackMedia, usePipelineAnalyticsListTracks, usePipelineAnalyticsProposeRetrainAnnotations, usePipelineAnalyticsPruneEvents, usePipelineAnalyticsPruneEventsBefore, usePipelineAnalyticsPruneTracksBefore, usePipelineAnalyticsRebuildObjectEmbeddings, usePipelineAnalyticsRelocateMedia, usePipelineAnalyticsRestageRetrainTrack, usePipelineAnalyticsSaveRetrainAnnotations, usePipelineAnalyticsSearchObjectEvents, usePipelineAnalyticsSelectRetrainFrames, usePipelineAnalyticsSetTrackFlags, usePipelineAnalyticsWipeAllAnalytics, usePipelineAnalyticsWipeObjectEmbeddings, 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, usePipelineOrchestratorGetCameraSwitches, usePipelineOrchestratorGetCapabilityBindings, usePipelineOrchestratorGetDeviceLiveContribution, usePipelineOrchestratorGetDeviceSettingsContribution, usePipelineOrchestratorGetGlobalMetrics, usePipelineOrchestratorGetIngestOwner, usePipelineOrchestratorGetNodeInferenceDevices, usePipelineOrchestratorGetPipelineAssignment, usePipelineOrchestratorGetPipelineAssignments, usePipelineOrchestratorGetPipelineDevicePin, usePipelineOrchestratorListAgentSettings, usePipelineOrchestratorListTemplates, usePipelineOrchestratorRebalance, usePipelineOrchestratorRemoveAgentSettings, usePipelineOrchestratorResetNodePipelineDefaults, usePipelineOrchestratorResolvePipeline, usePipelineOrchestratorSaveTemplate, usePipelineOrchestratorSetAgentCapabilities, usePipelineOrchestratorSetAgentDetectWeight, usePipelineOrchestratorSetAgentInferenceDevices, usePipelineOrchestratorSetAgentMaxCameras, usePipelineOrchestratorSetAgentReachableHost, usePipelineOrchestratorSetCameraPipelineForAgent, usePipelineOrchestratorSetCameraStepOverride, usePipelineOrchestratorSetCameraStepToggle, usePipelineOrchestratorSetCameraSwitch, usePipelineOrchestratorSetCapabilityBinding, usePipelineOrchestratorSetPipelineDevicePin, usePipelineOrchestratorUnassignAudio, usePipelineOrchestratorUnassignPipeline, usePipelineOrchestratorUpdateTemplate, usePipelineRunnerAttachCamera, usePipelineRunnerDetachCamera, usePipelineRunnerGetAllCameraMetrics, usePipelineRunnerGetCameraMetrics, usePipelineRunnerGetLocalCameras, usePipelineRunnerGetLocalLoad, usePipelineRunnerGetLocalMetrics, usePipelineRunnerGetNativeCrop, usePipelineRunnerReportMotion, usePipelineRunnerRunDetailSubtree, usePipelineRunnerRunStatelessStep, usePlateGalleryAssignPlate, usePlateGalleryAssignPlates, usePlateGalleryCorrectPlateText, usePlateGalleryCreateVehicle, usePlateGalleryDeletePlate, usePlateGalleryDeleteVehicle, usePlateGalleryGetPlateByTrack, usePlateGalleryGetPlateMedia, usePlateGalleryListPlates, usePlateGalleryListVehicleSamples, usePlateGalleryListVehicles, usePlateGalleryRemoveVehicleSample, usePlateGalleryRenameVehicle, usePlateGallerySearchPlates, usePlateGallerySuggestPlateClusters, usePlateGalleryUnassignPlate, usePlateGalleryUnassignPlates, usePlayerOverlayLayer, usePlayerOverlayLayers, usePlayerToolbarButton, usePlayerToolbarButtons, usePowerMeterGetStatus, usePresenceGetStatus, usePressureSensorGetStatus, usePrivacyMaskGetOptions, usePrivacyMaskGetStatus, usePrivacyMaskSetAudioEnabled, usePrivacyMaskSetMask, usePtzAutotrackGetSettings, usePtzAutotrackGetStatus, usePtzAutotrackSetEnabled, usePtzAutotrackSetSettings, usePtzContinuousMove, usePtzDeletePreset, usePtzGetOptions, usePtzGetPosition, usePtzGetPresets, usePtzGetStatus, usePtzGoHome, usePtzGoToPreset, usePtzMove, usePtzSavePreset, usePtzSetAutofocus, usePtzStop, useRebootReboot, useRecordedPlayback, useRecordingApplyDeviceSettingsPatch, useRecordingCancelRelocate, useRecordingDeleteFootprint, useRecordingExportCancelExport, useRecordingExportCreateExport, useRecordingExportDeleteExport, useRecordingExportGetDownloadUrl, useRecordingExportGetExport, useRecordingExportListExports, useRecordingGetAvailability, useRecordingGetDaysWithRecordings, useRecordingGetDeviceConfig, useRecordingGetDeviceLiveContribution, useRecordingGetDeviceSettingsContribution, useRecordingGetPlaybackManifest, useRecordingGetRelocateStatus, useRecordingGetStatus, useRecordingGetStorageUsage, useRecordingListOpsLog, useRecordingLocateSegment, useRecordingPruneFootage, useRecordingReadGopBytes, useRecordingReadSegmentBytes, useRecordingRelocateFootage, useRecordingRenderClip, useRecordingRenderGif, useRecordingRescanStorage, useRecordingSetDeviceConfig, useRemoteComponent, useSceneMonitorCaptureReference, useSceneMonitorCreateScene, useSceneMonitorDeleteReference, useSceneMonitorDeleteScene, useSceneMonitorGetStatus, useSceneMonitorListScenes, useSceneMonitorRecheckNow, useSceneMonitorUpdateScene, useScriptRunnerGetStatus, useScriptRunnerRun, useScriptRunnerStop, useScrubController, useServerManagementApplyServerUpdate, useServerManagementCheckServerUpdate, useServerManagementGetServerPackageStatus, useServerManagementRestartServer, useServerManagementRollbackServerUpdate, useSettingsStoreCount, useSettingsStoreDeclareCollection, useSettingsStoreDelete, useSettingsStoreDeleteWhere, useSettingsStoreGet, useSettingsStoreHistogram, useSettingsStoreInsert, useSettingsStoreIsEmpty, useSettingsStoreQuery, useSettingsStoreSet, useSettingsStoreUpdate, useSettingsStoreUpdateWhere, 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, useStreamBrokerAcquireEgressTranscode, useStreamBrokerApplyDeviceSettingsPatch, useStreamBrokerAssignProfile, useStreamBrokerGetAllRtspEntries, useStreamBrokerGetBrokerStats, useStreamBrokerGetDeviceAudioMute, useStreamBrokerGetDeviceLiveContribution, useStreamBrokerGetDeviceSettingsContribution, useStreamBrokerGetPreBufferInfo, useStreamBrokerGetRtspEntry, useStreamBrokerGetRtspPort, useStreamBrokerGetStreamUrl, useStreamBrokerGetStreamWithCodec, useStreamBrokerIsRtspEnabled, useStreamBrokerKillClient, useStreamBrokerListAllCameraStreams, useStreamBrokerListAllProfileSlots, useStreamBrokerListClients, useStreamBrokerProbeStream, useStreamBrokerPublishCameraStream, useStreamBrokerPullAudioChunks, useStreamBrokerPullFrameHandles, useStreamBrokerRegenerateRtspToken, useStreamBrokerReleaseEgressTranscode, useStreamBrokerReleaseStreamWithCodec, useStreamBrokerRenderPreBufferClip, useStreamBrokerRestartProfile, useStreamBrokerRetractCameraStream, useStreamBrokerSetDeviceAudioMute, useStreamBrokerSetPreBufferDuration, useStreamBrokerSetRtspEnabled, useStreamBrokerSubscribeAudioChunks, useStreamBrokerSubscribeFrames, useStreamBrokerUnassignProfile, useStreamBrokerUnsubscribeAudioChunks, useStreamBrokerUnsubscribeFrames, useStreamCatalogGetCatalog, useStreamParamsGetConfigSchema, useStreamParamsGetOptions, useStreamParamsGetStatus, useStreamParamsSetProfile, useSwitchGetStatus, useSwitchSetState, useSystem, useSystemFeatureFlags, useSystemForceRetentionCleanup, useSystemGetRetentionConfig, useSystemHealth, useSystemInfo, useSystemMutation, useSystemNetworkAddresses, useSystemQuery, useSystemSetRetentionConfig, useTamperGetStatus, useTemperatureSensorGetStatus, useTerminalSessionClose, useTerminalSessionListProfiles, useTerminalSessionListSessions, useTerminalSessionOpenSession, useTerminalSessionResize, 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 };
47983
+ export { AddonGlobalSettingsForm, AgentStepEditor, AlarmHeroCard, AlarmInlineControl as AlarmPanelInlineControl, AppShell, ArcKnob, AudioClassificationList, AudioLevelWaveform, AudioWaveform, AutomationHeroCard, AutomationInlineControl, AutotrackSection, BTN_COMPACT, BTN_COMPACT_DANGER, BTN_COMPACT_PRIMARY, BTN_COMPACT_WARNING, Badge, BatteryBadge, BottomSheet, Breadcrumb, BrightnessPanel, Button, ButtonControl, ButtonHeroCard, CARD_MODE_MIN_COLUMNS, CENTER, CHIP_ACTIVE, CHIP_BASE, CHIP_INACTIVE, CLASS_COLORS, COLUMN_BREAKPOINT_CLASS, COLUMN_PRIORITY, COMMIT_DEDUPE_TOLERANCE_MS, COMMIT_DEDUPE_WINDOW_MS, CONTROL_CAP_NAMES, CONTROL_FILLS, CameraStreamPlayer, Card, Checkbox, ChildSectionAccordion, ClimatePanel, CodeBlock, CollapsibleCard, ConfigFormBuilder, FormField as ConfigFormField, ConfigSchemaField, ConfirmActionButton, ConfirmDialogProvider, ConsumablesPanel, ContainerChildrenProvider, ContainerPrimaryHero, ControlColumn, ControlHeroCard, ControlInlineControl, ControlPanel, CopyButton, CoverHeroCard, CoverInlineControl, CoverPanel, CustomFieldRenderersProvider, DEFAULT_COLOR, DEVICE_COLUMNS, DEVICE_LIST_PAGE_SIZE_KEY, DEVICE_LIST_PAGE_SIZE_OPTIONS, DEVICE_ROLE_META, DEVICE_TYPE_CONTROL, DEVICE_TYPE_META, DISPLAY_ICON_REGISTRY, DataTable, DetectionCanvas, DetectionOverlay, DetectionResultTree, DevShell, DeviceActivityPanel, DeviceBatchToolbar, DeviceCard, DeviceContextProvider, DeviceExportPanel, DeviceGrid, DeviceItem, DeviceList, DeviceMultiSelectField, DeviceSelectField, 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, RECONNECT_POLICY, RECORDED_PLAYBACK_MODES, RIGHT, ROLE_DESCRIPTOR, RadialGauge, RecordedPlaybackProvider, RecordingPanel, ResponseLog, SECTION_BODY, SECTION_CARD, SECTION_HEADER, SETTING_ROW, SETTING_ROW_LABEL, SETTING_ROW_STACK_BREAKPOINT, SETTING_ROW_VALUE, SETTING_ROW_VALUE_TEXT, SPLIT_PANEL_OUTER, SPLIT_PANEL_SIDE, STACK_GAP, STATE_COLOR, ScopePicker, ScriptHeroCard, ScriptInlineControl, ScrollArea, Select, SemanticBadge, SensorHeroCard, SensorInlineControl, SensorValueAtom, Separator, SettingRow, Sidebar, SidebarItem, Skeleton, SlideOverPanel, SlideToggle, SnapshotButton, StatCard, StateValuesStream, StatusBadge, StepTimings, StepTreeMaster, Stepper, StreamBrokerSelector, StreamPanel, Switch, SwitchHeroCard, SwitchInlineControl, SwitchPanel, SystemProvider, 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, nextReconnectAction, nextSort, normalizeForSearch, overrideEntityIdFromLink, parseRecordedServerMessage, providerIcons, EyeOff as r, resolveContainerPrimary, resolveControlAlign, resolveDeviceControl, resolveDisplayIcon, resolveEffectiveDefaultModel, resolveEffectiveStepModel, resolveEventKindIcon, resolvePrimaryChild, resolveSensorDisplay, resolveStepDefaultModel, resolveTableLayout, scrubReducer, selectedDeviceOptions, serializeRecordedCommand, shouldCommit, shouldEmit, shouldUseSingleNode, sortRows, statusIcons, stepHasModelForFormat, stepModelOptions, 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, useBackupDeleteSchedule, useBackupGetEntries, useBackupList, useBackupListArchives, useBackupListDestinations, useBackupListLocations, useBackupListSchedules, useBackupPreviewSchedule, useBackupRestore, useBackupTrigger, useBackupUpsertDestinationPolicy, useBackupUpsertSchedule, useBatteryGetStatus, useBatteryWakeForStream, useBinaryGetStatus, useBrightnessGetStatus, useBrightnessSetBrightness, useBrokerAdd, useBrokerGet, useBrokerGetBrokerConfig, useBrokerGetSettings, useBrokerGetSettingsSchema, useBrokerGetState, useBrokerGetStatus, useBrokerList, useBrokerListProviders, useBrokerPublish, useBrokerRemove, useBrokerSetSettings, useBrokerSubscribe, useBrokerTestConnection, useBrokerTestSettings, useBrokerUnsubscribe, useButtonPress, useCameraCredentialsGetCredentials, useCameraCredentialsGetStatus, useCameraPipelineConfigApplyDeviceSettingsPatch, useCameraPipelineConfigGetDeviceLiveContribution, useCameraPipelineConfigGetDeviceSettingsContribution, useCameraStreamsGetBrokerStreams, useCameraStreamsGetCameraStreams, useCameraStreamsGetProfileRtspEntries, useCameraStreamsGetRtspEntries, useCameraStreamsPickStream, useCarbonMonoxideGetStatus, useClimateControlGetStatus, useClimateControlSetFanMode, useClimateControlSetMode, useClimateControlSetPreset, useClimateControlSetSwingHorizontal, useClimateControlSetSwingVertical, useClimateControlSetTarget, useClimateControlSetTargetHumidity, useClimateControlSetTargetRange, useClusterNodes, useColorGetStatus, useColorSetColor, useConfirm, useConnectivityGetStatus, useConsumablesGetStatus, useConsumablesReset, useContactGetStatus, useContainerChildren, useControlGetStatus, useControlSetValue, useCoreBlocksCompile, useCoreBlocksCreate, useCoreBlocksDelete, useCoreBlocksGet, useCoreBlocksGetTypeDefs, useCoreBlocksList, useCoreBlocksRestart, useCoreBlocksSetEnabled, useCoreBlocksUpdate, useCoverClose, useCoverGetStatus, useCoverOpen, useCoverSetPosition, useCoverSetTiltPosition, useCoverStop, useCustomFieldRenderer, useDayNightGetOptions, useDayNightGetStatus, useDayNightSetSettings, useDebouncedString, useDecoderCreateSession, useDecoderDestroySession, useDecoderGetFrame, useDecoderGetInfo, useDecoderGetShmStats, useDecoderGetStats, useDecoderListActiveSessions, useDecoderOpenStream, useDecoderPullFrames, useDecoderPullHandles, useDecoderPushPacket, useDecoderReprobeHwaccel, useDecoderSupportsCodec, useDecoderUpdateConfig, useDetectionPipelineApplyDeviceSettingsPatch, useDetectionPipelineGetDeviceLiveContribution, useDetectionPipelineGetDeviceSettingsContribution, useDevShell, useDevice, useDeviceAdoptionAdopt, useDeviceAdoptionGetCandidate, useDeviceAdoptionGetStatus, useDeviceAdoptionListCandidateFilters, useDeviceAdoptionListCandidates, useDeviceAdoptionRefresh, useDeviceAdoptionRelease, useDeviceAdoptionResync, useDeviceAutotrack, useDeviceBattery, useDeviceCapSlice, useDeviceCapability, useDeviceDetections, useDeviceDiscoveryAdoptDevice, useDeviceDiscoveryGetStatus, useDeviceDiscoveryListDiscovered, useDeviceDiscoveryRefreshDiscovery, useDeviceDiscoveryReleaseDevice, useDeviceExportApplyDeviceSettingsPatch, useDeviceExportExposeDevice, useDeviceExportGetDeviceLiveContribution, useDeviceExportGetDeviceSettingsContribution, useDeviceExportGetStatus, useDeviceExportListExposedDevices, useDeviceExportListSupportedDeviceKinds, useDeviceExportUnexposeDevice, useDeviceId, useDeviceListPageSize, useDeviceManagerAddLocation, useDeviceManagerAdoptDevice, useDeviceManagerAdoptionAdopt, 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, useDeviceManagerGetDeviceStatusAggregateBatch, 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, 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, useLocalNetworkGetNotificationEndpoint, useLocalNetworkGetPreferred, useLocalNetworkList, useLocalNetworkResetAllowlistToBestMatch, useLocalNetworkSetAllowedAddresses, useLocalNetworkSetNotificationEndpoint, useLockControlGetStatus, useLockControlLock, useLockControlOpen, useLockControlUnlock, useMediaPlayerGetStatus, useMediaPlayerNext, useMediaPlayerPause, useMediaPlayerPlay, useMediaPlayerPlayMedia, useMediaPlayerPrevious, useMediaPlayerSeek, useMediaPlayerSelectSource, useMediaPlayerSetMute, useMediaPlayerSetRepeat, useMediaPlayerSetShuffle, useMediaPlayerSetVolume, useMediaPlayerStop, useMeshNetworkGetStatus, useMeshNetworkJoin, useMeshNetworkLeave, useMeshNetworkListPeers, useMeshNetworkLogout, useMeshNetworkStartLogin, useMeshNetworkTestConnection, useMetricsProviderCollectSnapshot, useMetricsProviderDumpHeapSnapshot, useMetricsProviderGetAddonStats, useMetricsProviderGetCached, useMetricsProviderGetCpuTemperature, useMetricsProviderGetCurrent, useMetricsProviderGetDiskSpace, useMetricsProviderGetGpuInfo, useMetricsProviderGetProcessStats, useMetricsProviderKillProcess, useMetricsProviderListAddonInstances, useMetricsProviderListNodeProcesses, useMotionDetectionAnalyze, useMotionDetectionApplyDeviceSettingsPatch, useMotionDetectionGetDeviceLiveContribution, useMotionDetectionGetDeviceSettingsContribution, useMotionDetectionRemoveCamera, useMotionDetectionReset, useMotionGetStatus, useMotionIsDetected, useMotionTriggerGetStatus, useMotionTriggerSetMotionTrigger, useMotionZonesGetOptions, useMotionZonesGetStatus, useMotionZonesSetZone, useMqttBrokerAddBroker, useMqttBrokerGetBrokerConfig, useMqttBrokerGetStatus, useMqttBrokerListBrokers, useMqttBrokerRemoveBroker, useMqttBrokerStartEmbeddedBroker, useMqttBrokerStopEmbeddedBroker, useMqttBrokerTestConnection, useNativeObjectDetectionGetStatus, useNativeObjectDetectionSetEnabled, useNetworkAccessGetEndpoint, useNetworkAccessGetStatus, useNetworkAccessListEndpoints, useNetworkAccessStart, useNetworkAccessStop, useNetworkQualityGetAllStats, useNetworkQualityGetDeviceStats, useNetworkQualityReportClientStats, useNodesClusterAddonStatus, useNodesDeployAddon, useNodesExecuteQuery, useNodesGetCapUsageGraph, useNodesGetNodeAddons, useNodesRenameNode, useNodesRestartAddon, useNodesRestartNode, useNodesRestartProcess, useNodesSetProcessLogLevel, useNodesShutdownNode, useNodesTopology, useNodesUndeployAddon, useNotificationOutputDeleteTarget, useNotificationOutputDiscoverTargets, useNotificationOutputListTargetKinds, useNotificationOutputListTargets, useNotificationOutputSend, useNotificationOutputSetTargetEnabled, useNotificationOutputTestTarget, useNotificationOutputUpsertTarget, useNotificationRulesCancelSnooze, useNotificationRulesCreateRule, useNotificationRulesCreateSnooze, useNotificationRulesDeleteRule, useNotificationRulesGetAlarmConfig, useNotificationRulesGetConditionCatalog, useNotificationRulesGetHistory, useNotificationRulesGetRule, useNotificationRulesListDeviceMutes, useNotificationRulesListRules, useNotificationRulesListSnoozes, useNotificationRulesSetAlarmConfig, useNotificationRulesSetDeviceMuted, useNotificationRulesSetRuleEnabled, useNotificationRulesTestRule, useNotificationRulesUpdateRule, useNotifierCancel, useNotifierGetStatus, useNotifierSend, useNumericSensorGetStatus, useOptimisticSlice, useOptionalSystem, useOptionalWidgetRegistry, useOsdGetStatus, useOsdManagerClearSlotBinding, useOsdManagerGetConditionSupport, useOsdManagerGetDeviceOsd, useOsdManagerGetSourceCatalog, useOsdManagerPreviewSlot, useOsdManagerRenderDevice, useOsdManagerSetSlotBinding, useOsdSetOverlay, usePTZ, usePetFeederCallPet, usePetFeederCancelFeed, usePetFeederFeed, usePetFeederGetStatus, usePetFeederMarkFoodReplenished, usePetFeederPlaySound, usePetFeederResetDesiccant, usePetFeederSetChildLock, usePetFeederSetFeedSound, usePetFeederSetIndicatorLight, usePetFeederSetVolume, usePipelineAnalyticsApplyDeviceSettingsPatch, usePipelineAnalyticsCancelMediaRelocate, usePipelineAnalyticsClearTracks, usePipelineAnalyticsCompleteRetrainTrack, usePipelineAnalyticsDeleteDeviceEvents, usePipelineAnalyticsDeleteTracks, usePipelineAnalyticsDeselectRetrainFrame, usePipelineAnalyticsGetActiveTracks, usePipelineAnalyticsGetAudioEvents, usePipelineAnalyticsGetDeviceLiveContribution, usePipelineAnalyticsGetDeviceSettingsContribution, usePipelineAnalyticsGetEventDensity, usePipelineAnalyticsGetEventMedia, usePipelineAnalyticsGetEventStoreFootprint, usePipelineAnalyticsGetKeyEvents, usePipelineAnalyticsGetMediaRelocateStatus, usePipelineAnalyticsGetMotionEvents, usePipelineAnalyticsGetObjectEmbeddingRebuildStatus, usePipelineAnalyticsGetObjectEvents, usePipelineAnalyticsGetRetrainExportUrl, usePipelineAnalyticsGetRetrainFrameImage, usePipelineAnalyticsGetSensorEvents, usePipelineAnalyticsGetTrack, usePipelineAnalyticsGetTrackMedia, usePipelineAnalyticsGetTrainingExportSummary, usePipelineAnalyticsGetTrainingExportUrl, usePipelineAnalyticsListEventKinds, usePipelineAnalyticsListEventKindsBatch, usePipelineAnalyticsListOpsLog, usePipelineAnalyticsListRecentTracks, usePipelineAnalyticsListRetrainAnnotations, usePipelineAnalyticsListRetrainFrames, usePipelineAnalyticsListRetrainStaging, usePipelineAnalyticsListTrackMedia, usePipelineAnalyticsListTracks, usePipelineAnalyticsProposeRetrainAnnotations, usePipelineAnalyticsPruneEvents, usePipelineAnalyticsPruneEventsBefore, usePipelineAnalyticsPruneTracksBefore, usePipelineAnalyticsRebuildObjectEmbeddings, usePipelineAnalyticsRelocateMedia, usePipelineAnalyticsRestageRetrainTrack, usePipelineAnalyticsSaveRetrainAnnotations, usePipelineAnalyticsSearchObjectEvents, usePipelineAnalyticsSelectRetrainFrames, usePipelineAnalyticsSetTrackFlags, usePipelineAnalyticsWipeAllAnalytics, usePipelineAnalyticsWipeObjectEmbeddings, 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, usePipelineOrchestratorGetCameraSwitches, usePipelineOrchestratorGetCapabilityBindings, usePipelineOrchestratorGetDeviceLiveContribution, usePipelineOrchestratorGetDeviceSettingsContribution, usePipelineOrchestratorGetGlobalMetrics, usePipelineOrchestratorGetIngestOwner, usePipelineOrchestratorGetNodeInferenceDevices, usePipelineOrchestratorGetPipelineAssignment, usePipelineOrchestratorGetPipelineAssignments, usePipelineOrchestratorGetPipelineDevicePin, usePipelineOrchestratorListAgentSettings, usePipelineOrchestratorListTemplates, usePipelineOrchestratorRebalance, usePipelineOrchestratorRemoveAgentSettings, usePipelineOrchestratorResetNodePipelineDefaults, usePipelineOrchestratorResolvePipeline, usePipelineOrchestratorSaveTemplate, usePipelineOrchestratorSetAgentCapabilities, usePipelineOrchestratorSetAgentDetectWeight, usePipelineOrchestratorSetAgentInferenceDevices, usePipelineOrchestratorSetAgentMaxCameras, usePipelineOrchestratorSetAgentReachableHost, usePipelineOrchestratorSetCameraPipelineForAgent, usePipelineOrchestratorSetCameraStepOverride, usePipelineOrchestratorSetCameraStepToggle, usePipelineOrchestratorSetCameraSwitch, usePipelineOrchestratorSetCapabilityBinding, usePipelineOrchestratorSetPipelineDevicePin, usePipelineOrchestratorUnassignAudio, usePipelineOrchestratorUnassignPipeline, usePipelineOrchestratorUpdateTemplate, usePipelineRunnerAttachCamera, usePipelineRunnerDetachCamera, usePipelineRunnerGetAllCameraMetrics, usePipelineRunnerGetCameraMetrics, usePipelineRunnerGetLocalCameras, usePipelineRunnerGetLocalLoad, usePipelineRunnerGetLocalMetrics, usePipelineRunnerGetNativeCrop, usePipelineRunnerReportMotion, usePipelineRunnerRunDetailSubtree, usePipelineRunnerRunStatelessStep, usePlateGalleryAssignPlate, usePlateGalleryAssignPlates, usePlateGalleryCorrectPlateText, usePlateGalleryCreateVehicle, usePlateGalleryDeletePlate, usePlateGalleryDeleteVehicle, usePlateGalleryGetPlateByTrack, usePlateGalleryGetPlateMedia, usePlateGalleryListPlates, usePlateGalleryListVehicleSamples, usePlateGalleryListVehicles, usePlateGalleryRemoveVehicleSample, usePlateGalleryRenameVehicle, usePlateGallerySearchPlates, usePlateGallerySuggestPlateClusters, usePlateGalleryUnassignPlate, usePlateGalleryUnassignPlates, usePlayerOverlayLayer, usePlayerOverlayLayers, usePlayerToolbarButton, usePlayerToolbarButtons, usePowerMeterGetStatus, usePresenceGetStatus, usePressureSensorGetStatus, usePrivacyMaskGetOptions, usePrivacyMaskGetStatus, usePrivacyMaskSetAudioEnabled, usePrivacyMaskSetMask, usePtzAutotrackGetSettings, usePtzAutotrackGetStatus, usePtzAutotrackSetEnabled, usePtzAutotrackSetSettings, usePtzContinuousMove, usePtzDeletePreset, usePtzGetOptions, usePtzGetPosition, usePtzGetPresets, usePtzGetStatus, usePtzGoHome, usePtzGoToPreset, usePtzMove, usePtzSavePreset, usePtzSetAutofocus, usePtzStop, useRebootReboot, useRecordedPlayback, useRecordingApplyDeviceSettingsPatch, useRecordingCancelRelocate, useRecordingDeleteFootprint, useRecordingExportCancelExport, useRecordingExportCreateExport, useRecordingExportDeleteExport, useRecordingExportGetDownloadUrl, useRecordingExportGetExport, useRecordingExportListExports, useRecordingGetAvailability, useRecordingGetDaysWithRecordings, useRecordingGetDeviceConfig, useRecordingGetDeviceLiveContribution, useRecordingGetDeviceSettingsContribution, useRecordingGetPlaybackManifest, useRecordingGetRelocateStatus, useRecordingGetStatus, useRecordingGetStorageUsage, useRecordingListOpsLog, useRecordingLocateSegment, useRecordingPruneFootage, useRecordingReadGopBytes, useRecordingReadSegmentBytes, useRecordingRelocateFootage, useRecordingRenderClip, useRecordingRenderGif, useRecordingRescanStorage, useRecordingSetDeviceConfig, useRemoteComponent, useSceneMonitorCaptureReference, useSceneMonitorCreateScene, useSceneMonitorDeleteReference, useSceneMonitorDeleteScene, useSceneMonitorGetStatus, useSceneMonitorListScenes, useSceneMonitorRecheckNow, useSceneMonitorUpdateScene, useScriptRunnerGetStatus, useScriptRunnerRun, useScriptRunnerStop, useScrubController, useServerManagementApplyServerUpdate, useServerManagementCheckServerUpdate, useServerManagementGetServerPackageStatus, useServerManagementRestartServer, useServerManagementRollbackServerUpdate, useSettingsStoreCount, useSettingsStoreDeclareCollection, useSettingsStoreDelete, useSettingsStoreDeleteWhere, useSettingsStoreGet, useSettingsStoreHistogram, useSettingsStoreInsert, useSettingsStoreIsEmpty, useSettingsStoreQuery, useSettingsStoreSet, useSettingsStoreUpdate, useSettingsStoreUpdateWhere, 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, useStreamBrokerAcquireEgressTranscode, useStreamBrokerApplyDeviceSettingsPatch, useStreamBrokerAssignProfile, useStreamBrokerFetchEventMedia, useStreamBrokerGetAllRtspEntries, useStreamBrokerGetBrokerStats, useStreamBrokerGetDeviceAudioMute, useStreamBrokerGetDeviceLiveContribution, useStreamBrokerGetDeviceSettingsContribution, useStreamBrokerGetPreBufferInfo, useStreamBrokerGetRtspEntry, useStreamBrokerGetRtspPort, useStreamBrokerGetStreamUrl, useStreamBrokerGetStreamWithCodec, useStreamBrokerIsRtspEnabled, useStreamBrokerKillClient, useStreamBrokerListAllCameraStreams, useStreamBrokerListAllProfileSlots, useStreamBrokerListClients, useStreamBrokerProbeStream, useStreamBrokerProduceEventMedia, useStreamBrokerPublishCameraStream, useStreamBrokerPullAudioChunks, useStreamBrokerPullFrameHandles, useStreamBrokerRegenerateRtspToken, useStreamBrokerReleaseEgressTranscode, useStreamBrokerReleaseStreamWithCodec, useStreamBrokerRenderPreBufferClip, useStreamBrokerRestartProfile, useStreamBrokerRetractCameraStream, useStreamBrokerSetDeviceAudioMute, useStreamBrokerSetPreBufferDuration, useStreamBrokerSetRtspEnabled, useStreamBrokerSubscribeAudioChunks, useStreamBrokerSubscribeFrames, useStreamBrokerUnassignProfile, useStreamBrokerUnsubscribeAudioChunks, useStreamBrokerUnsubscribeFrames, useStreamCatalogGetCatalog, useStreamParamsGetConfigSchema, useStreamParamsGetOptions, useStreamParamsGetStatus, useStreamParamsSetProfile, useSwitchGetStatus, useSwitchSetState, useSystem, useSystemFeatureFlags, useSystemForceRetentionCleanup, useSystemGetRetentionConfig, useSystemHealth, useSystemInfo, useSystemMutation, useSystemNetworkAddresses, useSystemQuery, useSystemSetRetentionConfig, useTamperGetStatus, useTemperatureSensorGetStatus, useTerminalSessionClose, useTerminalSessionListProfiles, useTerminalSessionListSessions, useTerminalSessionOpenSession, useTerminalSessionResize, 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 };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/ui-library",
3
- "version": "1.2.33",
3
+ "version": "1.2.35",
4
4
  "type": "module",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",