@camstack/ui-library 1.2.256 → 1.2.258

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.
Files changed (375) hide show
  1. package/dist/composites/accelerator-label.d.ts +9 -9
  2. package/dist/composites/adaptive-downlink.d.ts +141 -143
  3. package/dist/composites/addon-global-settings-form.d.ts +73 -60
  4. package/dist/composites/addon-page-props.d.ts +34 -10
  5. package/dist/composites/agent-step-editor.d.ts +48 -47
  6. package/dist/composites/app-shell/app-shell.d.ts +17 -17
  7. package/dist/composites/app-shell/index.d.ts +3 -3
  8. package/dist/composites/app-shell/sidebar-item.d.ts +9 -8
  9. package/dist/composites/app-shell/sidebar.d.ts +10 -10
  10. package/dist/composites/audio-classification-list.d.ts +16 -15
  11. package/dist/composites/audio-level-waveform.d.ts +31 -30
  12. package/dist/composites/audio-waveform.d.ts +18 -17
  13. package/dist/composites/battery-badge.d.ts +27 -13
  14. package/dist/composites/breadcrumb.d.ts +21 -21
  15. package/dist/composites/camera-stream-player.d.ts +309 -309
  16. package/dist/composites/cap-settings/AutotrackSection.d.ts +19 -2
  17. package/dist/composites/cap-settings/CameraGridLayoutEditor.d.ts +24 -2
  18. package/dist/composites/cap-settings/ConsumablesPanel.d.ts +21 -2
  19. package/dist/composites/cap-settings/CoverageTrack.d.ts +21 -20
  20. package/dist/composites/cap-settings/EventBucketStrip.d.ts +21 -20
  21. package/dist/composites/cap-settings/EventHeatmap.d.ts +8 -7
  22. package/dist/composites/cap-settings/HomePresetPicker.d.ts +2 -2
  23. package/dist/composites/cap-settings/MaskShapeCanvas.d.ts +143 -41
  24. package/dist/composites/cap-settings/MotionZonesSettings.d.ts +41 -2
  25. package/dist/composites/cap-settings/NavigationPanel.d.ts +14 -2
  26. package/dist/composites/cap-settings/PrivacyMaskSettings.d.ts +3 -2
  27. package/dist/composites/cap-settings/PtzPanel.d.ts +15 -2
  28. package/dist/composites/cap-settings/RecordingBandsEditor.d.ts +33 -32
  29. package/dist/composites/cap-settings/RecordingPanel.d.ts +3 -2
  30. package/dist/composites/cap-settings/RecordingSettings.d.ts +11 -10
  31. package/dist/composites/cap-settings/RecordingTimeline.d.ts +3 -2
  32. package/dist/composites/cap-settings/SceneMonitorEditor.d.ts +3 -51
  33. package/dist/composites/cap-settings/SceneReferenceGallery.d.ts +62 -23
  34. package/dist/composites/cap-settings/SceneSettingsForm.d.ts +52 -16
  35. package/dist/composites/cap-settings/TimelineControls.d.ts +21 -20
  36. package/dist/composites/cap-settings/camera-grid-layout.d.ts +95 -95
  37. package/dist/composites/cap-settings/event-thumb.d.ts +9 -8
  38. package/dist/composites/cap-settings/index.d.ts +20 -20
  39. package/dist/composites/cap-settings/privacy-mask-audio.d.ts +47 -47
  40. package/dist/composites/cap-settings/recording-config-form.d.ts +25 -25
  41. package/dist/composites/cap-settings/recording-spans.d.ts +14 -14
  42. package/dist/composites/cap-settings/recording-timeline-model.d.ts +57 -57
  43. package/dist/composites/cap-settings/scene-monitor-copy.d.ts +58 -49
  44. package/dist/composites/client-network-sample.d.ts +41 -41
  45. package/dist/composites/clips/ClipBandBar.d.ts +44 -14
  46. package/dist/composites/clips/ClipPanel.d.ts +30 -6
  47. package/dist/composites/clips/ClipTile.d.ts +26 -5
  48. package/dist/composites/clips/ClipsSection.d.ts +107 -2
  49. package/dist/composites/clips/clip-band.d.ts +72 -38
  50. package/dist/composites/clips/clip-day-window.d.ts +7 -30
  51. package/dist/composites/clips/clip-source-state.d.ts +55 -26
  52. package/dist/composites/clips/clip-still-retry.d.ts +39 -39
  53. package/dist/composites/clips/clip-thumbnail-fetch.d.ts +9 -9
  54. package/dist/composites/clips/clip-tile-media.d.ts +64 -32
  55. package/dist/composites/clips/clip-view-state.d.ts +76 -46
  56. package/dist/composites/code-block.d.ts +5 -4
  57. package/dist/composites/config-form-builder.d.ts +14 -13
  58. package/dist/composites/config-form-field.d.ts +63 -62
  59. package/dist/composites/config-icon-field.d.ts +10 -9
  60. package/dist/composites/config-secret-field.d.ts +51 -27
  61. package/dist/composites/confirm-action-button.d.ts +52 -39
  62. package/dist/composites/confirm-dialog.d.ts +110 -48
  63. package/dist/composites/copy-button.d.ts +25 -19
  64. package/dist/composites/data-table/data-table-header.d.ts +8 -7
  65. package/dist/composites/data-table/data-table-pagination.d.ts +7 -6
  66. package/dist/composites/data-table/data-table-row.d.ts +8 -7
  67. package/dist/composites/data-table/data-table.d.ts +3 -2
  68. package/dist/composites/data-table/index.d.ts +2 -2
  69. package/dist/composites/data-table/types.d.ts +29 -29
  70. package/dist/composites/data-table-filter-bar.d.ts +30 -29
  71. package/dist/composites/data-table-filter.d.ts +34 -34
  72. package/dist/composites/data-table-layout.d.ts +24 -24
  73. package/dist/composites/data-table-pager.d.ts +5 -5
  74. package/dist/composites/data-table-pagination.d.ts +23 -23
  75. package/dist/composites/data-table-selection.d.ts +10 -10
  76. package/dist/composites/data-table.d.ts +167 -118
  77. package/dist/composites/detection-canvas.d.ts +34 -25
  78. package/dist/composites/detection-colors.d.ts +9 -9
  79. package/dist/composites/detection-overlay.d.ts +33 -32
  80. package/dist/composites/detection-result-tree.d.ts +22 -9
  81. package/dist/composites/dev-shell.d.ts +15 -14
  82. package/dist/composites/device-activity-panel.d.ts +37 -31
  83. package/dist/composites/device-card.d.ts +32 -32
  84. package/dist/composites/device-controls/ac-panel.d.ts +2 -2
  85. package/dist/composites/device-controls/alarm-hero-card.d.ts +42 -42
  86. package/dist/composites/device-controls/atoms.d.ts +50 -50
  87. package/dist/composites/device-controls/brightness-panel.d.ts +3 -3
  88. package/dist/composites/device-controls/button-control.d.ts +14 -14
  89. package/dist/composites/device-controls/climate-panel.d.ts +12 -12
  90. package/dist/composites/device-controls/container-primary-hero.d.ts +33 -16
  91. package/dist/composites/device-controls/container-primary.d.ts +68 -39
  92. package/dist/composites/device-controls/control-panel.d.ts +4 -4
  93. package/dist/composites/device-controls/control-registry.d.ts +81 -70
  94. package/dist/composites/device-controls/cover-hero-card.d.ts +26 -26
  95. package/dist/composites/device-controls/cover-inline.d.ts +20 -20
  96. package/dist/composites/device-controls/cover-panel.d.ts +2 -2
  97. package/dist/composites/device-controls/dummy-hero-card.d.ts +2 -2
  98. package/dist/composites/device-controls/fan-hero-card.d.ts +20 -20
  99. package/dist/composites/device-controls/fan-panel.d.ts +3 -3
  100. package/dist/composites/device-controls/humidifier-control.d.ts +46 -29
  101. package/dist/composites/device-controls/image-control.d.ts +41 -27
  102. package/dist/composites/device-controls/index.d.ts +34 -34
  103. package/dist/composites/device-controls/lawn-mower-control.d.ts +30 -16
  104. package/dist/composites/device-controls/light-hero-card.d.ts +15 -15
  105. package/dist/composites/device-controls/lock-hero-card.d.ts +14 -14
  106. package/dist/composites/device-controls/lock-panel.d.ts +3 -3
  107. package/dist/composites/device-controls/media-player-hero-card.d.ts +16 -16
  108. package/dist/composites/device-controls/media-player-panel.d.ts +7 -7
  109. package/dist/composites/device-controls/offline-badge.d.ts +23 -8
  110. package/dist/composites/device-controls/panel-controls.d.ts +39 -20
  111. package/dist/composites/device-controls/pet-feeder-panel.d.ts +27 -9
  112. package/dist/composites/device-controls/popover-row-action.d.ts +18 -6
  113. package/dist/composites/device-controls/primary-child-picker.d.ts +31 -15
  114. package/dist/composites/device-controls/primary-child.d.ts +14 -25
  115. package/dist/composites/device-controls/radial-gauge.d.ts +17 -17
  116. package/dist/composites/device-controls/script-automation-controls.d.ts +9 -9
  117. package/dist/composites/device-controls/sensor-hero-card.d.ts +26 -8
  118. package/dist/composites/device-controls/sensor-inline-control.d.ts +21 -9
  119. package/dist/composites/device-controls/sensor-value-atom.d.ts +97 -76
  120. package/dist/composites/device-controls/switch-hero-card.d.ts +11 -11
  121. package/dist/composites/device-controls/switch-panel.d.ts +2 -2
  122. package/dist/composites/device-controls/tap-toggle.d.ts +13 -13
  123. package/dist/composites/device-controls/thermostat-hero-card.d.ts +16 -16
  124. package/dist/composites/device-controls/types.d.ts +11 -11
  125. package/dist/composites/device-controls/update-control.d.ts +20 -7
  126. package/dist/composites/device-controls/vacuum-control.d.ts +41 -25
  127. package/dist/composites/device-controls/valve-control.d.ts +51 -35
  128. package/dist/composites/device-controls/water-heater-control.d.ts +48 -31
  129. package/dist/composites/device-controls/weather-control.d.ts +46 -28
  130. package/dist/composites/device-export-panel.d.ts +34 -34
  131. package/dist/composites/device-grid.d.ts +10 -10
  132. package/dist/composites/device-item/actions.d.ts +40 -18
  133. package/dist/composites/device-item/admin-link-quick-action.d.ts +66 -26
  134. package/dist/composites/device-item/child-layout.d.ts +43 -26
  135. package/dist/composites/device-item/child-section-accordion.d.ts +20 -6
  136. package/dist/composites/device-item/children-accordion.d.ts +11 -11
  137. package/dist/composites/device-item/container-children-context.d.ts +28 -11
  138. package/dist/composites/device-item/device-delete-action.d.ts +23 -5
  139. package/dist/composites/device-item/features.d.ts +33 -15
  140. package/dist/composites/device-item/header.d.ts +53 -31
  141. package/dist/composites/device-item/helpers.d.ts +291 -274
  142. package/dist/composites/device-item/index.d.ts +18 -9
  143. package/dist/composites/device-item/preview.d.ts +41 -21
  144. package/dist/composites/device-item/quick-detail-action.d.ts +4 -4
  145. package/dist/composites/device-item/reboot-quick-action.d.ts +28 -7
  146. package/dist/composites/device-item/role-display-defaults-context.d.ts +28 -12
  147. package/dist/composites/device-item/status-dot.d.ts +24 -6
  148. package/dist/composites/device-list/batch-actions-bar.d.ts +23 -12
  149. package/dist/composites/device-list/batch-toolbar.d.ts +13 -13
  150. package/dist/composites/device-list/columns.d.ts +108 -108
  151. package/dist/composites/device-list/device-integration.d.ts +48 -58
  152. package/dist/composites/device-list/device-mode.d.ts +121 -121
  153. package/dist/composites/device-list/empty-state.d.ts +14 -3
  154. package/dist/composites/device-list/filter-chips.d.ts +42 -29
  155. package/dist/composites/device-list/fuzzy-match.d.ts +22 -22
  156. package/dist/composites/device-list/generic-mode.d.ts +88 -88
  157. package/dist/composites/device-list/group.d.ts +62 -35
  158. package/dist/composites/device-list/hardware-cell.d.ts +14 -3
  159. package/dist/composites/device-list/hardware.d.ts +29 -11
  160. package/dist/composites/device-list/icon-action.d.ts +27 -15
  161. package/dist/composites/device-list/index.d.ts +46 -23
  162. package/dist/composites/device-list/multi-select.d.ts +17 -17
  163. package/dist/composites/device-list/page-size-select.d.ts +13 -7
  164. package/dist/composites/device-list/pagination.d.ts +19 -12
  165. package/dist/composites/device-list/sort.d.ts +28 -15
  166. package/dist/composites/device-list/sortable-header.d.ts +20 -7
  167. package/dist/composites/device-list/table-layout.d.ts +44 -44
  168. package/dist/composites/device-list/type-filter.d.ts +16 -16
  169. package/dist/composites/device-list/url-state.d.ts +35 -35
  170. package/dist/composites/device-meta.d.ts +43 -43
  171. package/dist/composites/device-picker/DevicePicker.d.ts +72 -33
  172. package/dist/composites/device-picker/SelectedChip.d.ts +10 -9
  173. package/dist/composites/device-picker/device-filter-bar.d.ts +19 -18
  174. package/dist/composites/device-picker/device-fleet-view.d.ts +11 -3
  175. package/dist/composites/device-picker/device-parent.d.ts +27 -27
  176. package/dist/composites/device-picker/device-picker-grouping.d.ts +3 -3
  177. package/dist/composites/device-picker/device-picker-model.d.ts +140 -140
  178. package/dist/composites/device-picker/device-selection-rows.d.ts +31 -24
  179. package/dist/composites/device-picker/device-selection.d.ts +43 -43
  180. package/dist/composites/device-picker/index.d.ts +9 -9
  181. package/dist/composites/device-select-field.d.ts +17 -16
  182. package/dist/composites/device-select-filter.d.ts +78 -78
  183. package/dist/composites/device-selector-picker.d.ts +25 -25
  184. package/dist/composites/device-step-matrix.d.ts +54 -28
  185. package/dist/composites/discovery-panel.d.ts +22 -22
  186. package/dist/composites/doorbell-recent-panel.d.ts +9 -8
  187. package/dist/composites/empty-state.d.ts +8 -8
  188. package/dist/composites/error-box.d.ts +32 -17
  189. package/dist/composites/event-kind-visuals.d.ts +29 -18
  190. package/dist/composites/event-stream.d.ts +59 -42
  191. package/dist/composites/extensions/AssociationSlotCard.d.ts +45 -24
  192. package/dist/composites/extensions/ExtensionsPanel.d.ts +41 -18
  193. package/dist/composites/extensions/extensions-view-state.d.ts +71 -53
  194. package/dist/composites/filter-bar.d.ts +22 -21
  195. package/dist/composites/form-field.d.ts +9 -9
  196. package/dist/composites/format-state-value.d.ts +23 -51
  197. package/dist/composites/grouped-model-selector.d.ts +7 -6
  198. package/dist/composites/hls-quality.d.ts +26 -26
  199. package/dist/composites/hls-video.d.ts +62 -39
  200. package/dist/composites/hover-zoom-image.d.ts +35 -16
  201. package/dist/composites/icon-picker.d.ts +86 -50
  202. package/dist/composites/image-selector.d.ts +21 -20
  203. package/dist/composites/index.d.ts +204 -204
  204. package/dist/composites/inference-config-selector.d.ts +36 -35
  205. package/dist/composites/kebab-menu.d.ts +53 -35
  206. package/dist/composites/key-value-list.d.ts +14 -14
  207. package/dist/composites/log-stream-scroll.d.ts +24 -24
  208. package/dist/composites/log-stream.d.ts +81 -70
  209. package/dist/composites/login-form.d.ts +7 -6
  210. package/dist/composites/model-bound-slider.d.ts +46 -26
  211. package/dist/composites/model-picker.d.ts +20 -19
  212. package/dist/composites/mount-addon-page.d.ts +12 -12
  213. package/dist/composites/network-link-badge.d.ts +7 -6
  214. package/dist/composites/node-picker.d.ts +14 -13
  215. package/dist/composites/notification-targets-field.d.ts +76 -58
  216. package/dist/composites/notification-targets-options.d.ts +9 -6
  217. package/dist/composites/option-select/OptionSelect.d.ts +23 -22
  218. package/dist/composites/option-select/index.d.ts +4 -4
  219. package/dist/composites/option-select/option-select-model.d.ts +35 -35
  220. package/dist/composites/page-header.d.ts +6 -6
  221. package/dist/composites/peer-connection-config.d.ts +9 -9
  222. package/dist/composites/phase-icon.d.ts +10 -3
  223. package/dist/composites/pipeline-builder.d.ts +21 -13
  224. package/dist/composites/pipeline-matrix-shared.d.ts +159 -150
  225. package/dist/composites/pipeline-runtime-selector.d.ts +12 -11
  226. package/dist/composites/pipeline-step.d.ts +39 -31
  227. package/dist/composites/placeholder-field/PlaceholderChipField.d.ts +23 -22
  228. package/dist/composites/placeholder-field/index.d.ts +1 -1
  229. package/dist/composites/provider-badge.d.ts +6 -5
  230. package/dist/composites/ptz-overlay.d.ts +38 -18
  231. package/dist/composites/qr-code.d.ts +24 -10
  232. package/dist/composites/reconnect-schedule.d.ts +22 -22
  233. package/dist/composites/resolve-step-default-model.d.ts +94 -94
  234. package/dist/composites/response-log.d.ts +7 -6
  235. package/dist/composites/root-model-source.d.ts +21 -10
  236. package/dist/composites/scope-picker.d.ts +49 -25
  237. package/dist/composites/section-card.d.ts +19 -11
  238. package/dist/composites/setting-row.d.ts +39 -21
  239. package/dist/composites/snapshot-button.d.ts +23 -19
  240. package/dist/composites/sort-header-button.d.ts +25 -8
  241. package/dist/composites/stat-card.d.ts +20 -8
  242. package/dist/composites/state-values-stream.d.ts +49 -24
  243. package/dist/composites/status-badge.d.ts +10 -8
  244. package/dist/composites/step-inspector/gate-control.d.ts +13 -12
  245. package/dist/composites/step-inspector/index.d.ts +8 -8
  246. package/dist/composites/step-inspector/layered-settings-form.d.ts +41 -30
  247. package/dist/composites/step-inspector/segmented-choice.d.ts +8 -7
  248. package/dist/composites/step-inspector/setting-values.d.ts +13 -8
  249. package/dist/composites/step-inspector/step-detail-dock.d.ts +39 -23
  250. package/dist/composites/step-inspector/step-inspector-panel.d.ts +34 -28
  251. package/dist/composites/step-inspector/step-model-row.d.ts +29 -24
  252. package/dist/composites/step-inspector/step-search.d.ts +11 -11
  253. package/dist/composites/step-timings.d.ts +7 -6
  254. package/dist/composites/step-tree.d.ts +17 -12
  255. package/dist/composites/stream-broker-selector.d.ts +29 -8
  256. package/dist/composites/stream-debug/stream-debug-overlay.d.ts +40 -40
  257. package/dist/composites/stream-debug/webrtc-debug-stats.d.ts +144 -129
  258. package/dist/composites/stream-panel.d.ts +212 -201
  259. package/dist/composites/table-sort.d.ts +61 -61
  260. package/dist/composites/timezone-selector.d.ts +15 -13
  261. package/dist/composites/training/send-frame-to-training.d.ts +5 -4
  262. package/dist/composites/training/training-collection-picker.d.ts +4 -3
  263. package/dist/composites/training/training-refusal-text.d.ts +6 -6
  264. package/dist/composites/unit-picker/UnitPicker.d.ts +19 -14
  265. package/dist/composites/unit-picker/index.d.ts +1 -1
  266. package/dist/composites/use-data-table-filter.d.ts +19 -19
  267. package/dist/composites/version-badge.d.ts +19 -18
  268. package/dist/composites/webrtc-diagnostics/EndpointTestCard.d.ts +7 -7
  269. package/dist/composites/webrtc-diagnostics/HubSessionTestCard.d.ts +14 -14
  270. package/dist/composites/webrtc-diagnostics/RunReport.d.ts +10 -5
  271. package/dist/composites/webrtc-diagnostics/endpoint-probe.d.ts +41 -21
  272. package/dist/composites/webrtc-diagnostics/endpoint-test.d.ts +37 -32
  273. package/dist/composites/webrtc-diagnostics/format.d.ts +3 -3
  274. package/dist/composites/webrtc-diagnostics/ice-candidates.d.ts +49 -49
  275. package/dist/composites/webrtc-diagnostics/nat-mapping.d.ts +36 -36
  276. package/dist/composites/webrtc-diagnostics/session-run.d.ts +108 -95
  277. package/dist/composites/webrtc-diagnostics/session-verdict.d.ts +29 -20
  278. package/dist/composites/widget-panel.d.ts +23 -23
  279. package/dist/composites/widget-slot.d.ts +35 -17
  280. package/dist/contexts/custom-field-renderers.d.ts +53 -17
  281. package/dist/contexts/device-context.d.ts +32 -12
  282. package/dist/contexts/device-quick-detail.d.ts +13 -4
  283. package/dist/contexts/player-overlays.d.ts +82 -42
  284. package/dist/contexts/recorded-playback.d.ts +40 -18
  285. package/dist/contexts/system-context.d.ts +28 -13
  286. package/dist/contexts/vod-playback.d.ts +39 -22
  287. package/dist/contexts/widget-registry.d.ts +139 -102
  288. package/dist/contexts/zone-editing.d.ts +69 -46
  289. package/dist/generated/system-hooks.d.ts +17 -1
  290. package/dist/hooks/index.d.ts +43 -43
  291. package/dist/hooks/turn-server-cache.d.ts +69 -69
  292. package/dist/hooks/use-capability-presence.d.ts +65 -28
  293. package/dist/hooks/use-cluster-nodes.d.ts +54 -27
  294. package/dist/hooks/use-device-autotrack.d.ts +7 -7
  295. package/dist/hooks/use-device-battery.d.ts +24 -11
  296. package/dist/hooks/use-device-cap-slice.d.ts +15 -15
  297. package/dist/hooks/use-device-capability.d.ts +61 -27
  298. package/dist/hooks/use-device-detections.d.ts +32 -32
  299. package/dist/hooks/use-device-features.d.ts +18 -18
  300. package/dist/hooks/use-device-list-page-size.d.ts +19 -6
  301. package/dist/hooks/use-device-network-link.d.ts +15 -7
  302. package/dist/hooks/use-device-proxy.d.ts +98 -92
  303. package/dist/hooks/use-device-snapshot.d.ts +23 -23
  304. package/dist/hooks/use-device-webrtc.d.ts +211 -205
  305. package/dist/hooks/use-devices.d.ts +9 -9
  306. package/dist/hooks/use-doorbell-events.d.ts +13 -13
  307. package/dist/hooks/use-event-stream.d.ts +6 -3
  308. package/dist/hooks/use-is-mobile.d.ts +5 -5
  309. package/dist/hooks/use-live-buffer.d.ts +5 -5
  310. package/dist/hooks/use-live-event.d.ts +1 -1
  311. package/dist/hooks/use-navigation.d.ts +20 -20
  312. package/dist/hooks/use-optimistic-slice.d.ts +13 -13
  313. package/dist/hooks/use-persisted-page-size.d.ts +10 -10
  314. package/dist/hooks/use-ptz.d.ts +108 -108
  315. package/dist/hooks/use-stationary-overlay.d.ts +37 -37
  316. package/dist/hooks/use-system-query.d.ts +33 -10
  317. package/dist/hooks/use-url-query.d.ts +3 -3
  318. package/dist/icons/index.d.ts +2 -2
  319. package/dist/icons/provider-icons.d.ts +2 -2
  320. package/dist/icons/status-icons.d.ts +2 -2
  321. package/dist/index.cjs +123 -69
  322. package/dist/index.d.ts +31 -27
  323. package/dist/index.js +123 -69
  324. package/dist/lib/cap-error.d.ts +18 -39
  325. package/dist/lib/cn.d.ts +1 -1
  326. package/dist/lib/fleet-query-defaults.d.ts +68 -34
  327. package/dist/lib/format-control-datetime.d.ts +16 -16
  328. package/dist/lib/format-duration.d.ts +12 -12
  329. package/dist/lib/format-last-seen.d.ts +5 -18
  330. package/dist/lib/format-numeric.d.ts +7 -7
  331. package/dist/lib/hub-mount.d.ts +8 -42
  332. package/dist/lib/index.d.ts +21 -21
  333. package/dist/lib/phase-config.d.ts +24 -11
  334. package/dist/lib/pipeline-mirror.d.ts +16 -16
  335. package/dist/lib/recorded-control-protocol.d.ts +41 -43
  336. package/dist/lib/resolve-sensor-display.d.ts +36 -20
  337. package/dist/lib/responsive.d.ts +54 -54
  338. package/dist/lib/scrub-controller.d.ts +75 -78
  339. package/dist/lib/shared-context.d.ts +27 -2
  340. package/dist/lib/tailwind-variants.d.ts +20 -20
  341. package/dist/primitives/badge.d.ts +5 -10
  342. package/dist/primitives/bottom-sheet.d.ts +7 -7
  343. package/dist/primitives/button.d.ts +5 -9
  344. package/dist/primitives/card.d.ts +4 -8
  345. package/dist/primitives/checkbox.d.ts +3 -4
  346. package/dist/primitives/collapsible-card.d.ts +23 -13
  347. package/dist/primitives/dialog.d.ts +33 -59
  348. package/dist/primitives/dropdown.d.ts +13 -13
  349. package/dist/primitives/floating-panel.d.ts +41 -20
  350. package/dist/primitives/icon-button.d.ts +8 -12
  351. package/dist/primitives/index.d.ts +22 -22
  352. package/dist/primitives/input.d.ts +6 -16
  353. package/dist/primitives/label.d.ts +3 -4
  354. package/dist/primitives/mobile-drawer.d.ts +8 -8
  355. package/dist/primitives/password-input.d.ts +18 -18
  356. package/dist/primitives/popover.d.ts +7 -7
  357. package/dist/primitives/scroll-area.d.ts +3 -4
  358. package/dist/primitives/select.d.ts +20 -20
  359. package/dist/primitives/separator.d.ts +4 -8
  360. package/dist/primitives/skeleton.d.ts +3 -4
  361. package/dist/primitives/switch.d.ts +6 -6
  362. package/dist/primitives/tabs.d.ts +26 -26
  363. package/dist/primitives/tooltip.d.ts +12 -12
  364. package/dist/theme/create-theme.d.ts +1 -1
  365. package/dist/theme/defaults.d.ts +1 -1
  366. package/dist/theme/index.d.ts +6 -6
  367. package/dist/theme/theme-provider.d.ts +8 -7
  368. package/dist/theme/theme-to-css.d.ts +1 -1
  369. package/dist/theme/types.d.ts +98 -100
  370. package/dist/theme/use-theme-mode.d.ts +1 -1
  371. package/dist/trpc-react.d.ts +23 -3
  372. package/dist/widgets/host-widgets.d.ts +4 -4
  373. package/package.json +8 -4
  374. package/src/tailwind/camstack-theme.css +11 -0
  375. package/dist/composites/unit-picker/UnitPicker.spec.d.ts +0 -1
@@ -1,59 +1,82 @@
1
- import { ReactNode } from 'react';
2
- export type ZoneDrawingKind = 'polygon' | 'tripwire';
1
+ /**
2
+ * Per-device zone-editing state shared between the player overlay
3
+ * (drawing surface) and any sibling that needs to drive it
4
+ * (Detection tab "Add zone" button, player toolbar Zones toggle, …).
5
+ *
6
+ * Implemented as a React context — kept on its own provider so
7
+ * pages that don't render zones don't pay the extra Render. Wrapped
8
+ * by `PlayerOverlaysProvider` in admin-ui's DeviceDetail.
9
+ *
10
+ * Holds two distinct pieces of state:
11
+ * - `selectedZoneId` — pure selection, fast CRUD path. Operator
12
+ * clicks a zone on the canvas or in the list, the row + polygon
13
+ * light up. No mutation flows from selection alone.
14
+ * - `editingDraft` — non-null while the operator is in unified
15
+ * edit mode (entered via the pencil button on the Detection tab
16
+ * row, exited via Save or Discard). All edits — name, colour,
17
+ * vertex drags — flow into the draft instead of triggering live
18
+ * `updateZone` RPC calls. The Detection tab commits on Save with
19
+ * a single round-trip; Discard throws the draft away. Without
20
+ * this, every keystroke + vertex drop wrote the zones config and
21
+ * the pipeline runner detached + re-attached the camera per
22
+ * write — operators saw 8-character zone renames cycle the
23
+ * pipeline 8 times.
24
+ */
25
+ import { type ReactNode, type JSX } from "react";
26
+ export type ZoneDrawingKind = "polygon" | "tripwire";
3
27
  export interface ZoneDraftPoint {
4
- readonly x: number;
5
- readonly y: number;
28
+ readonly x: number;
29
+ readonly y: number;
6
30
  }
7
31
  export interface ZoneDraft {
8
- readonly id: string;
9
- readonly kind: ZoneDrawingKind;
10
- readonly name: string;
11
- readonly color: string;
12
- readonly points: ReadonlyArray<ZoneDraftPoint>;
32
+ readonly id: string;
33
+ readonly kind: ZoneDrawingKind;
34
+ readonly name: string;
35
+ readonly color: string;
36
+ readonly points: ReadonlyArray<ZoneDraftPoint>;
13
37
  }
14
38
  export interface ZoneEditingState {
15
- /** Whether the zone editor overlay is active. When `true` the
16
- * Konva Stage intercepts clicks; when `false` clicks pass
17
- * through to the underlying player. */
18
- readonly editing: boolean;
19
- /** Active drawing kind. `null` means "select / drag existing
20
- * zones". Setting a non-null value triggers a fresh polygon /
21
- * tripwire creation on the next click. */
22
- readonly drawingKind: ZoneDrawingKind | null;
23
- /** Currently-selected zone id (for highlight + ZoneForm). */
24
- readonly selectedZoneId: string | null;
25
- /** In-flight draft snapshot of the zone being edited. `null` while
26
- * no edit session is active — read-only browse mode. */
27
- readonly editingDraft: ZoneDraft | null;
39
+ /** Whether the zone editor overlay is active. When `true` the
40
+ * Konva Stage intercepts clicks; when `false` clicks pass
41
+ * through to the underlying player. */
42
+ readonly editing: boolean;
43
+ /** Active drawing kind. `null` means "select / drag existing
44
+ * zones". Setting a non-null value triggers a fresh polygon /
45
+ * tripwire creation on the next click. */
46
+ readonly drawingKind: ZoneDrawingKind | null;
47
+ /** Currently-selected zone id (for highlight + ZoneForm). */
48
+ readonly selectedZoneId: string | null;
49
+ /** In-flight draft snapshot of the zone being edited. `null` while
50
+ * no edit session is active — read-only browse mode. */
51
+ readonly editingDraft: ZoneDraft | null;
28
52
  }
29
53
  export interface ZoneEditingActions {
30
- setEditing(editing: boolean): void;
31
- setDrawingKind(kind: ZoneDrawingKind | null): void;
32
- setSelectedZoneId(id: string | null): void;
33
- /** Start a new polygon/tripwire — convenience for "Add zone"
34
- * buttons that should both unlock the overlay AND select the
35
- * shape kind in one click. */
36
- startDrawing(kind: ZoneDrawingKind): void;
37
- /** Exit edit mode — clears the drawing kind + selection + any
38
- * in-flight draft. Called when the Detection tab is torn down. */
39
- exitEditing(): void;
40
- /** Snapshot a zone into the draft and enter unified edit mode.
41
- * If a different draft is already active it is discarded. */
42
- enterDraft(draft: ZoneDraft): void;
43
- /** Patch the active draft. No-op when no draft is active. */
44
- updateDraft(patch: Partial<Omit<ZoneDraft, 'id' | 'kind'>>): void;
45
- /** Throw the draft away. Caller is expected to refresh from
46
- * upstream zone state (operator chose Discard or navigated away). */
47
- discardDraft(): void;
48
- }
49
- interface ZoneEditingContextValue extends ZoneEditingState, ZoneEditingActions {
54
+ setEditing(editing: boolean): void;
55
+ setDrawingKind(kind: ZoneDrawingKind | null): void;
56
+ setSelectedZoneId(id: string | null): void;
57
+ /** Start a new polygon/tripwire — convenience for "Add zone"
58
+ * buttons that should both unlock the overlay AND select the
59
+ * shape kind in one click. */
60
+ startDrawing(kind: ZoneDrawingKind): void;
61
+ /** Exit edit mode — clears the drawing kind + selection + any
62
+ * in-flight draft. Called when the Detection tab is torn down. */
63
+ exitEditing(): void;
64
+ /** Snapshot a zone into the draft and enter unified edit mode.
65
+ * If a different draft is already active it is discarded. */
66
+ enterDraft(draft: ZoneDraft): void;
67
+ /** Patch the active draft. No-op when no draft is active. */
68
+ updateDraft(patch: Partial<Omit<ZoneDraft, "id" | "kind">>): void;
69
+ /** Throw the draft away. Caller is expected to refresh from
70
+ * upstream zone state (operator chose Discard or navigated away). */
71
+ discardDraft(): void;
50
72
  }
73
+ interface ZoneEditingContextValue extends ZoneEditingState, ZoneEditingActions {}
51
74
  export interface ZoneEditingProviderProps {
52
- readonly children: ReactNode;
75
+ readonly children: ReactNode;
53
76
  }
54
- export declare function ZoneEditingProvider({ children }: ZoneEditingProviderProps): import("react").JSX.Element;
77
+ export declare function ZoneEditingProvider({ children }: ZoneEditingProviderProps): JSX.Element;
55
78
  /** Read + drive the zone-editing state. Returns `null` outside a
56
- * provider so callers that mount in pages without zones (e.g. a
57
- * shared hero on a non-camera device) can no-op gracefully. */
79
+ * provider so callers that mount in pages without zones (e.g. a
80
+ * shared hero on a non-camera device) can no-op gracefully. */
58
81
  export declare function useZoneEditing(): ZoneEditingContextValue | null;
59
82
  export {};
@@ -1,4 +1,20 @@
1
- import { trpc } from '../trpc-react.js';
1
+ /**
2
+ * Per-method React-Query hooks for every `scope: 'system'` capability.
3
+ *
4
+ * Each hook is a thin pass-through to `trpc.<cap>.<method>.useQuery` /
5
+ * `.useMutation` / `.useSubscription` so the typed inference + RQ
6
+ * cache/dedup keep working — the generator only contributes a consistent
7
+ * name and stable export surface so admin-ui pages can write
8
+ * `useAddonsList()` instead of `trpc.addons.list.useQuery()`.
9
+ *
10
+ * Push-subscription methods (`kind: 'subscription'`) emit a typeof
11
+ * alias over `useSubscription`, so the call shape is
12
+ * `useToastOnToast(input, { onData: cb })` — same as the underlying
13
+ * tRPC hook. The eventBus-backed `useLiveEvent` (see
14
+ * `../hooks/use-live-event.ts`) covers events that don't ride a tRPC
15
+ * subscription; the two surfaces coexist by design.
16
+ */
17
+ import { trpc } from "../trpc-react.js";
2
18
  /** Generated alias around `trpc.accessories.setChildHidden.useMutation`. */
3
19
  export declare const useAccessoriesSetChildHidden: typeof trpc.accessories.setChildHidden.useMutation;
4
20
  /** Generated alias around `trpc.accessories.getStatus.useQuery`. */
@@ -1,43 +1,43 @@
1
- export { useUrlQueryParam } from './use-url-query';
2
- export type { ClusterNode, ClusterTopologyNode, ClusterTopologyResult, } from './use-cluster-nodes';
3
- export { useClusterNodes, useClusterTopology } from './use-cluster-nodes';
4
- export { useDebouncedString } from './use-debounced-string';
5
- export type { UseDeviceAutotrack } from './use-device-autotrack';
6
- export { useDeviceAutotrack } from './use-device-autotrack';
7
- export type { UseDeviceBatteryTrpc } from './use-device-battery';
8
- export type { NavigationDirection, UseNavigationResult } from './use-navigation';
9
- export { NAVIGATION_DRIVE_INTERVAL_MS, useNavigation } from './use-navigation';
10
- export { useDeviceBattery } from './use-device-battery';
11
- export type { NetworkLinkStatus } from './use-device-network-link';
12
- export { useDeviceNetworkLink } from './use-device-network-link';
13
- export type { UseDeviceCapSliceTrpc } from './use-device-cap-slice';
14
- export { useDeviceCapSlice } from './use-device-cap-slice';
15
- export type { UseDeviceCapabilityOptions, UseDeviceCapabilityResult, } from './use-device-capability';
16
- export { useDeviceCapability } from './use-device-capability';
17
- export type { DetectionState, DeviceDetections, MotionRawBox, MotionRawState, MotionState, MotionZone, } from './use-device-detections';
18
- export { useDeviceDetections } from './use-device-detections';
19
- export type { PersistedPageSizeConfig, SetPageSize } from './use-persisted-page-size';
20
- export { PAGE_SIZE_ALL, effectivePageSize, usePersistedPageSize, } from './use-persisted-page-size';
21
- export type { SetDeviceListPageSize } from './use-device-list-page-size';
22
- export { DEVICE_LIST_PAGE_SIZE_KEY, DEVICE_LIST_PAGE_SIZE_OPTIONS, useDeviceListPageSize, } from './use-device-list-page-size';
23
- export type { UseDeviceProxyTrpc } from './use-device-proxy';
24
- export { useDeviceProxy, useDeviceState, useDeviceStateSlice } from './use-device-proxy';
25
- export { useStationaryOverlay, toStationaryOverlayBox } from './use-stationary-overlay';
26
- export type { DeviceSnapshotImage, UseDeviceSnapshotOptions } from './use-device-snapshot';
27
- export { SNAPSHOT_MEDIA_PATH, useDeviceSnapshotImage } from './use-device-snapshot';
28
- export type { DevicePipelineMetrics, DeviceWebrtcResult, SessionRenegotiationState, UseDeviceWebrtcTrpc, WebrtcTarget, } from './use-device-webrtc';
29
- export { useDeviceWebrtc } from './use-device-webrtc';
30
- export { useDevice, useDevices } from './use-devices';
31
- export type { DoorbellPressEvent, UseDoorbellEventsOptions, UseDoorbellEventsResult, } from './use-doorbell-events';
32
- export { useDoorbellEvents } from './use-doorbell-events';
33
- export { useEventInvalidation } from './use-event-invalidation';
34
- export { useEventStreamLatest, useEventStreamMap } from './use-event-stream';
35
- export { useIsMidWidth, useIsMobile } from './use-is-mobile';
36
- export type { LiveBuffer } from './use-live-buffer';
37
- export { useLiveBuffer } from './use-live-buffer';
38
- export { type LiveEventCallback, useLiveEvent } from './use-live-event';
39
- export type { UseOptimisticSliceOptions, UseOptimisticSliceResult } from './use-optimistic-slice';
40
- export { useOptimisticSlice } from './use-optimistic-slice';
41
- export type { PTZDirection, PTZTrpcProxy, UsePTZOptions, UsePTZResult } from './use-ptz';
42
- export { usePTZ } from './use-ptz';
43
- export { type SystemMutationSelector, type SystemQuerySelector, useSystemMutation, useSystemQuery, } from './use-system-query';
1
+ export { useUrlQueryParam } from "./use-url-query";
2
+ export type { ClusterNode, ClusterTopologyNode, ClusterTopologyResult } from "./use-cluster-nodes";
3
+ export { useClusterNodes, useClusterTopology } from "./use-cluster-nodes";
4
+ export { useDebouncedString } from "./use-debounced-string";
5
+ export type { UseDeviceAutotrack } from "./use-device-autotrack";
6
+ export { useDeviceAutotrack } from "./use-device-autotrack";
7
+ export type { UseDeviceBatteryTrpc } from "./use-device-battery";
8
+ export type { NavigationDirection, UseNavigationResult } from "./use-navigation";
9
+ export { NAVIGATION_DRIVE_INTERVAL_MS, useNavigation } from "./use-navigation";
10
+ export { useDeviceBattery } from "./use-device-battery";
11
+ export type { NetworkLinkStatus } from "./use-device-network-link";
12
+ export { useDeviceNetworkLink } from "./use-device-network-link";
13
+ export type { UseDeviceCapSliceTrpc } from "./use-device-cap-slice";
14
+ export { useDeviceCapSlice } from "./use-device-cap-slice";
15
+ export type { UseDeviceCapabilityOptions, UseDeviceCapabilityResult } from "./use-device-capability";
16
+ export { useDeviceCapability } from "./use-device-capability";
17
+ export type { DetectionState, DeviceDetections, MotionRawBox, MotionRawState, MotionState, MotionZone } from "./use-device-detections";
18
+ export { useDeviceDetections } from "./use-device-detections";
19
+ export type { PersistedPageSizeConfig, SetPageSize } from "./use-persisted-page-size";
20
+ export { PAGE_SIZE_ALL, effectivePageSize, usePersistedPageSize } from "./use-persisted-page-size";
21
+ export type { SetDeviceListPageSize } from "./use-device-list-page-size";
22
+ export { DEVICE_LIST_PAGE_SIZE_KEY, DEVICE_LIST_PAGE_SIZE_OPTIONS, useDeviceListPageSize } from "./use-device-list-page-size";
23
+ export type { UseDeviceProxyTrpc } from "./use-device-proxy";
24
+ export { useDeviceProxy, useDeviceState, useDeviceStateSlice } from "./use-device-proxy";
25
+ export { useStationaryOverlay, toStationaryOverlayBox } from "./use-stationary-overlay";
26
+ export type { DeviceSnapshotImage, UseDeviceSnapshotOptions } from "./use-device-snapshot";
27
+ export { SNAPSHOT_MEDIA_PATH, useDeviceSnapshotImage } from "./use-device-snapshot";
28
+ export type { DevicePipelineMetrics, DeviceWebrtcResult, SessionRenegotiationState, UseDeviceWebrtcTrpc, WebrtcTarget } from "./use-device-webrtc";
29
+ export { useDeviceWebrtc } from "./use-device-webrtc";
30
+ export { useDevice, useDevices } from "./use-devices";
31
+ export type { DoorbellPressEvent, UseDoorbellEventsOptions, UseDoorbellEventsResult } from "./use-doorbell-events";
32
+ export { useDoorbellEvents } from "./use-doorbell-events";
33
+ export { useEventInvalidation } from "./use-event-invalidation";
34
+ export { useEventStreamLatest, useEventStreamMap } from "./use-event-stream";
35
+ export { useIsMidWidth, useIsMobile } from "./use-is-mobile";
36
+ export type { LiveBuffer } from "./use-live-buffer";
37
+ export { useLiveBuffer } from "./use-live-buffer";
38
+ export { type LiveEventCallback, useLiveEvent } from "./use-live-event";
39
+ export type { UseOptimisticSliceOptions, UseOptimisticSliceResult } from "./use-optimistic-slice";
40
+ export { useOptimisticSlice } from "./use-optimistic-slice";
41
+ export type { PTZDirection, PTZTrpcProxy, UsePTZOptions, UsePTZResult } from "./use-ptz";
42
+ export { usePTZ } from "./use-ptz";
43
+ export { type SystemMutationSelector, type SystemQuerySelector, useSystemMutation, useSystemQuery } from "./use-system-query";
@@ -1,77 +1,77 @@
1
1
  /**
2
- * TurnServerCache — shared STUN/TURN credential cache for the WebRTC connect
3
- * path.
4
- *
5
- * ## Why this exists
6
- *
7
- * The ICE-server fetch is serialized BEFORE `createOffer` on every connect
8
- * (`camera-stream-player.tsx` → `getIceServers()`), so its latency lands 1:1
9
- * in the time-to-first-frame. Production `embed:webrtc-timing` lines measured
10
- * it at 0.2–3.6 s on a cold page. Two verified defects drove that:
11
- *
12
- * 1. **No in-flight coalescing.** The mount-time prefetch and the connect's
13
- * own call raced: whichever started second issued a SECOND full
14
- * `getTurnServers` round trip instead of awaiting the first.
15
- * 2. **Per-page cache.** The cache was a `WeakMap` keyed on the page's tRPC
16
- * client. The native app loads a fresh embed page per camera open, so the
17
- * common remote path started cold every single time.
18
- *
19
- * ## Design
20
- *
21
- * Three layers, checked in order:
22
- * - **memory** (`WeakMap` keyed on the caller's tRPC client — unchanged
23
- * semantics: two admin tabs pointed at different hubs never cross-serve),
24
- * - **in-flight** (concurrent callers share one promise),
25
- * - **storage** (`localStorage` when available) so a fresh page finds warm
26
- * credentials. Storage is per-origin, and the page's origin IS the hub, so
27
- * cross-hub leakage is structurally impossible.
28
- *
29
- * Freshness: entries younger than `freshTtlMs` are served as-is. Entries older
30
- * than that but younger than `staleCapMs` are served IMMEDIATELY while a
31
- * background refresh runs (credentials from the hub's providers are valid for
32
- * hours — e.g. 24 h for the managed-relay provider — so a bounded stale window
33
- * is safe; an actually-expired relay credential degrades to the public-STUN
34
- * fallback exactly like an absent one, and the refresh heals the next
35
- * connect). Beyond `staleCapMs` the fetch is awaited.
36
- *
37
- * Failure: a failed fetch serves the stale entry when one exists, else
38
- * `undefined` (caller falls back to public STUN). Failures are never cached.
39
- */
2
+ * TurnServerCache — shared STUN/TURN credential cache for the WebRTC connect
3
+ * path.
4
+ *
5
+ * ## Why this exists
6
+ *
7
+ * The ICE-server fetch is serialized BEFORE `createOffer` on every connect
8
+ * (`camera-stream-player.tsx` → `getIceServers()`), so its latency lands 1:1
9
+ * in the time-to-first-frame. Production `embed:webrtc-timing` lines measured
10
+ * it at 0.2–3.6 s on a cold page. Two verified defects drove that:
11
+ *
12
+ * 1. **No in-flight coalescing.** The mount-time prefetch and the connect's
13
+ * own call raced: whichever started second issued a SECOND full
14
+ * `getTurnServers` round trip instead of awaiting the first.
15
+ * 2. **Per-page cache.** The cache was a `WeakMap` keyed on the page's tRPC
16
+ * client. The native app loads a fresh embed page per camera open, so the
17
+ * common remote path started cold every single time.
18
+ *
19
+ * ## Design
20
+ *
21
+ * Three layers, checked in order:
22
+ * - **memory** (`WeakMap` keyed on the caller's tRPC client — unchanged
23
+ * semantics: two admin tabs pointed at different hubs never cross-serve),
24
+ * - **in-flight** (concurrent callers share one promise),
25
+ * - **storage** (`localStorage` when available) so a fresh page finds warm
26
+ * credentials. Storage is per-origin, and the page's origin IS the hub, so
27
+ * cross-hub leakage is structurally impossible.
28
+ *
29
+ * Freshness: entries younger than `freshTtlMs` are served as-is. Entries older
30
+ * than that but younger than `staleCapMs` are served IMMEDIATELY while a
31
+ * background refresh runs (credentials from the hub's providers are valid for
32
+ * hours — e.g. 24 h for the managed-relay provider — so a bounded stale window
33
+ * is safe; an actually-expired relay credential degrades to the public-STUN
34
+ * fallback exactly like an absent one, and the refresh heals the next
35
+ * connect). Beyond `staleCapMs` the fetch is awaited.
36
+ *
37
+ * Failure: a failed fetch serves the stale entry when one exists, else
38
+ * `undefined` (caller falls back to public STUN). Failures are never cached.
39
+ */
40
40
  /** Narrow storage contract — satisfied by `localStorage`, injectable in tests. */
41
41
  export interface TurnCacheStorage {
42
- getItem(key: string): string | null;
43
- setItem(key: string, value: string): void;
42
+ getItem(key: string): string | null;
43
+ setItem(key: string, value: string): void;
44
44
  }
45
45
  export interface TurnServerCacheOptions {
46
- /** Entries younger than this are served without any fetch. */
47
- readonly freshTtlMs?: number;
48
- /** Entries older than `freshTtlMs` but younger than this are served
49
- * immediately while a background refresh runs. */
50
- readonly staleCapMs?: number;
51
- /** Storage layer. `null` disables persistence (memory-only). When omitted,
52
- * `globalThis.localStorage` is used if present. */
53
- readonly storage?: TurnCacheStorage | null;
54
- readonly now?: () => number;
55
- readonly storageKey?: string;
46
+ /** Entries younger than this are served without any fetch. */
47
+ readonly freshTtlMs?: number;
48
+ /** Entries older than `freshTtlMs` but younger than this are served
49
+ * immediately while a background refresh runs. */
50
+ readonly staleCapMs?: number;
51
+ /** Storage layer. `null` disables persistence (memory-only). When omitted,
52
+ * `globalThis.localStorage` is used if present. */
53
+ readonly storage?: TurnCacheStorage | null;
54
+ readonly now?: () => number;
55
+ readonly storageKey?: string;
56
56
  }
57
57
  export declare class TurnServerCache {
58
- private readonly freshTtlMs;
59
- private readonly staleCapMs;
60
- private readonly storage;
61
- private readonly now;
62
- private readonly storageKey;
63
- /** Keyed on the caller's tRPC client object (stable per connected system). */
64
- private readonly memory;
65
- /** In-flight fetch per key — concurrent callers share one round trip. */
66
- private readonly inflight;
67
- constructor(options?: TurnServerCacheOptions);
68
- /**
69
- * Resolve the ICE servers for `key`, fetching via `fetch` only when no
70
- * fresh-enough entry exists. Never rejects: a failed fetch resolves to the
71
- * stale entry when one exists, else `undefined`.
72
- */
73
- getOrFetch(key: object, fetch: () => Promise<readonly RTCIceServer[]>): Promise<readonly RTCIceServer[] | undefined>;
74
- private startFetch;
75
- private readStorage;
76
- private writeStorage;
58
+ private readonly freshTtlMs;
59
+ private readonly staleCapMs;
60
+ private readonly storage;
61
+ private readonly now;
62
+ private readonly storageKey;
63
+ /** Keyed on the caller's tRPC client object (stable per connected system). */
64
+ private readonly memory;
65
+ /** In-flight fetch per key — concurrent callers share one round trip. */
66
+ private readonly inflight;
67
+ constructor(options?: TurnServerCacheOptions);
68
+ /**
69
+ * Resolve the ICE servers for `key`, fetching via `fetch` only when no
70
+ * fresh-enough entry exists. Never rejects: a failed fetch resolves to the
71
+ * stale entry when one exists, else `undefined`.
72
+ */
73
+ getOrFetch(key: object, fetch: () => Promise<readonly RTCIceServer[]>): Promise<readonly RTCIceServer[] | undefined>;
74
+ private startFetch;
75
+ private readStorage;
76
+ private writeStorage;
77
77
  }
@@ -1,32 +1,69 @@
1
- import { CapabilityInfo } from '@camstack/types';
2
1
  /**
3
- * What is known about a capability's presence in this cluster.
4
- *
5
- * - `pending` — the registry has not answered. Render progress, never absence.
6
- * - `present` — the registry answered and at least one addon provides it.
7
- * - `absent` — the registry answered, and nothing provides it (either the
8
- * capability is undeclared, or it is declared with no provider).
9
- * - `unknown` — the read FAILED. Not an answer, so it is not `absent` either;
10
- * a surface that cannot reach the registry says so.
11
- */
12
- export type CapabilityPresence = 'pending' | 'present' | 'absent' | 'unknown';
2
+ * "Does this cluster have capability X?" — asked of the authority, answered in
3
+ * a shape that can say *I do not know yet*.
4
+ *
5
+ * WHY THIS EXISTS. A panel that gates on a component being installed has three
6
+ * things to say and a `boolean` can carry two. The missing one is the one an
7
+ * operator sees first: the query has not answered. Collapsing it into `false`
8
+ * makes the UI assert, in words, that a component is NOT INSTALLED — while it
9
+ * is installed and running. That is the failure
10
+ * [D62](../../../../docs/decisions/adr-0062.md) names for a switch ("disabled
11
+ * must never look like broken"); the same rule holds one step earlier:
12
+ * **not-yet-known must never look like not-installed.** An operator who reads
13
+ * "not installed" goes hunting a fault that does not exist.
14
+ *
15
+ * So the answer is a discriminated `CapabilityPresence`, never a boolean, and
16
+ * `'pending'` / `'unknown'` are values a caller has to render — not defaults
17
+ * it falls into.
18
+ *
19
+ * WHY THE REGISTRY AND NOT THE TOPOLOGY. The previous gate read
20
+ * `nodes.topology` and scanned every node's addon list for the capability id.
21
+ * That endpoint's handler walks the whole cluster to build a diagram: a
22
+ * `$agent.status` + `$process.list` round trip per online node, a `ps` sample
23
+ * of every child pid on every node, one durable history-store write per online
24
+ * node, plus the persisted-history read — all sequential. Measured on the
25
+ * production hub (2026-08-31): **32.4 s / 33.9 s / 51.1 s**, 80.7 KB, for a
26
+ * one-bit answer. `capabilities.getCapability` is a `Map.get` on the hub's
27
+ * `CapabilityRegistry` — the same registry every provider registers into via
28
+ * the atomic `registerNode` RPC, so it sees agent-hosted providers too (three
29
+ * node ids on the reference cluster). Measured: **0.15 s**, ~250 bytes, and
30
+ * the cost does not grow with the fleet.
31
+ *
32
+ * WHY NOT A CACHE. [D224](../../../../docs/decisions/adr-0224-the-freshness-of-a-camera-fact-lives-in-its-provider.md)
33
+ * is explicit that a consumer never keeps a second copy of a fact the owner
34
+ * already holds. This hook keeps none: every mount asks the registry, and the
35
+ * registry is the authority. The fix for a slow read was a smaller question,
36
+ * not a local mirror of the big answer.
37
+ */
38
+ import type { CapabilityInfo } from "@camstack/types";
13
39
  /**
14
- * Classify a settled registry answer.
15
- *
16
- * `null` is "no such capability". A row with an empty `providers` list is a
17
- * capability that is DECLARED but that no addon supplies — indistinguishable
18
- * to an operator from not having it, and the panel behind it would have
19
- * nothing to call. Both are `absent`.
20
- *
21
- * Exported for the unit test: the mapping is the whole decision, and it is
22
- * worth pinning without a React tree around it.
23
- */
24
- export declare function classifyCapability(row: CapabilityInfo | null): 'present' | 'absent';
40
+ * What is known about a capability's presence in this cluster.
41
+ *
42
+ * - `pending` — the registry has not answered. Render progress, never absence.
43
+ * - `present` — the registry answered and at least one addon provides it.
44
+ * - `absent` — the registry answered, and nothing provides it (either the
45
+ * capability is undeclared, or it is declared with no provider).
46
+ * - `unknown` — the read FAILED. Not an answer, so it is not `absent` either;
47
+ * a surface that cannot reach the registry says so.
48
+ */
49
+ export type CapabilityPresence = "pending" | "present" | "absent" | "unknown";
25
50
  /**
26
- * Ask the hub's capability registry whether `capabilityName` has a provider.
27
- *
28
- * The four states map straight off React Query's `status`, so there is no
29
- * place for a nullish fallback to turn "no answer" into "no providers" — the
30
- * exact collapse this hook exists to make unrepresentable.
31
- */
51
+ * Classify a settled registry answer.
52
+ *
53
+ * `null` is "no such capability". A row with an empty `providers` list is a
54
+ * capability that is DECLARED but that no addon supplies — indistinguishable
55
+ * to an operator from not having it, and the panel behind it would have
56
+ * nothing to call. Both are `absent`.
57
+ *
58
+ * Exported for the unit test: the mapping is the whole decision, and it is
59
+ * worth pinning without a React tree around it.
60
+ */
61
+ export declare function classifyCapability(row: CapabilityInfo | null): "present" | "absent";
62
+ /**
63
+ * Ask the hub's capability registry whether `capabilityName` has a provider.
64
+ *
65
+ * The four states map straight off React Query's `status`, so there is no
66
+ * place for a nullish fallback to turn "no answer" into "no providers" — the
67
+ * exact collapse this hook exists to make unrepresentable.
68
+ */
32
69
  export declare function useCapabilityPresence(capabilityName: string): CapabilityPresence;
@@ -1,37 +1,64 @@
1
- import { TopologyNode } from '@camstack/types';
1
+ /**
2
+ * The two hooks through which a UI reads the cluster (D311, D317).
3
+ *
4
+ * `nodes.topology` draws the cluster DIAGRAM: every node, every addon, every
5
+ * runner subprocess with its live cpu/rss. Its handler walks the whole fleet,
6
+ * so its cost scales with nodes x processes — measured on the production hub on
7
+ * 2026-08-31 at **30.5 s** while the settings store was stalled. It is the
8
+ * right call for a page that renders that diagram and the wrong call for
9
+ * everything else, and until D317 fourteen call sites made it on mount.
10
+ *
11
+ * Both hooks have the same shape and it is the only shape allowed here:
12
+ * **bootstrap once, then live off the pushed snapshot.** The hub's
13
+ * `TopologyEmitterService` recomputes and emits `cluster.topology-snapshot`
14
+ * every 30 s and, debounced 200 ms, on every agent/addon lifecycle edge — so a
15
+ * subscriber that mounts mid-stream gets its FIRST value from the bootstrap
16
+ * query (that is what the query is for) and every value after it from the push.
17
+ * `staleTime: Infinity` is therefore correct rather than lazy: nothing goes
18
+ * stale, because the owner sends the next one.
19
+ *
20
+ * - {@link useClusterTopology} — the whole diagram. Reach for it only if you
21
+ * render per-node processes, per-addon status or the balancer graph.
22
+ * - {@link useClusterNodes} — the node ROSTER (id, name, online, addon caps),
23
+ * which is what a picker, a filter or an "is this node up" check needs.
24
+ *
25
+ * `scripts/check-topology-is-a-diagram-not-a-lookup.ts` keeps every other call
26
+ * site out of `nodes.topology`.
27
+ */
28
+ import type { TopologyNode } from "@camstack/types";
2
29
  export interface ClusterNode {
3
- readonly id: string;
4
- readonly name: string;
5
- /** Compact label for pill bars: "HUB" for the hub, agent name for agents. */
6
- readonly shortName: string;
7
- readonly isHub: boolean;
8
- readonly isOnline: boolean;
9
- readonly localIps: readonly string[];
10
- readonly addons: readonly {
11
- readonly addonId: string;
12
- readonly capabilities: readonly string[];
13
- }[];
30
+ readonly id: string;
31
+ readonly name: string;
32
+ /** Compact label for pill bars: "HUB" for the hub, agent name for agents. */
33
+ readonly shortName: string;
34
+ readonly isHub: boolean;
35
+ readonly isOnline: boolean;
36
+ readonly localIps: readonly string[];
37
+ readonly addons: readonly {
38
+ readonly addonId: string;
39
+ readonly capabilities: readonly string[];
40
+ }[];
14
41
  }
15
42
  /** The row shape `nodes.topology` and `cluster.topology-snapshot` both carry. */
16
43
  export type ClusterTopologyNode = TopologyNode;
17
44
  export interface ClusterTopologyResult {
18
- /** Every node in the cluster, live or persisted-offline. `undefined` until the first answer. */
19
- readonly nodes: readonly ClusterTopologyNode[] | undefined;
20
- readonly isLoading: boolean;
21
- readonly isError: boolean;
45
+ /** Every node in the cluster, live or persisted-offline. `undefined` until the first answer. */
46
+ readonly nodes: readonly ClusterTopologyNode[] | undefined;
47
+ readonly isLoading: boolean;
48
+ readonly isError: boolean;
22
49
  }
23
50
  /**
24
- * The whole cluster diagram: bootstrap query, then the pushed snapshot.
25
- *
26
- * The ONLY sanctioned reader of `nodes.topology` in a UI. Use it when the
27
- * component renders something that genuinely needs the diagram — per-node
28
- * processes, per-addon health, the balancer graph. If you need a node list,
29
- * use {@link useClusterNodes} instead; if you need one node's addons, ask
30
- * `nodes.getNodeAddons`, which is one node and does not walk the fleet.
31
- */
51
+ * The whole cluster diagram: bootstrap query, then the pushed snapshot.
52
+ *
53
+ * The ONLY sanctioned reader of `nodes.topology` in a UI. Use it when the
54
+ * component renders something that genuinely needs the diagram — per-node
55
+ * processes, per-addon health, the balancer graph. If you need a node list,
56
+ * use {@link useClusterNodes} instead; if you need one node's addons, ask
57
+ * `nodes.getNodeAddons`, which is one node and does not walk the fleet.
58
+ */
32
59
  export declare function useClusterTopology(): ClusterTopologyResult;
33
60
  export declare function useClusterNodes(): {
34
- readonly nodes: readonly ClusterNode[];
35
- readonly isLoading: boolean;
36
- readonly isError: boolean;
61
+ readonly nodes: readonly ClusterNode[];
62
+ readonly isLoading: boolean;
63
+ readonly isError: boolean;
37
64
  };
@@ -1,10 +1,10 @@
1
- import { PtzAutotrackSettings, PtzAutotrackStatus } from '@camstack/types';
1
+ import type { PtzAutotrackSettings, PtzAutotrackStatus } from "@camstack/types";
2
2
  export interface UseDeviceAutotrack {
3
- status: PtzAutotrackStatus | null;
4
- isLoading: boolean;
5
- isPending: boolean;
6
- error: string | null;
7
- setEnabled: (on: boolean) => Promise<void>;
8
- setSettings: (patch: Partial<PtzAutotrackSettings>) => Promise<void>;
3
+ status: PtzAutotrackStatus | null;
4
+ isLoading: boolean;
5
+ isPending: boolean;
6
+ error: string | null;
7
+ setEnabled: (on: boolean) => Promise<void>;
8
+ setSettings: (patch: Partial<PtzAutotrackSettings>) => Promise<void>;
9
9
  }
10
10
  export declare function useDeviceAutotrack(deviceId: number | null): UseDeviceAutotrack;