@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.
- package/dist/composites/accelerator-label.d.ts +9 -9
- package/dist/composites/adaptive-downlink.d.ts +141 -143
- package/dist/composites/addon-global-settings-form.d.ts +73 -60
- package/dist/composites/addon-page-props.d.ts +34 -10
- package/dist/composites/agent-step-editor.d.ts +48 -47
- package/dist/composites/app-shell/app-shell.d.ts +17 -17
- package/dist/composites/app-shell/index.d.ts +3 -3
- package/dist/composites/app-shell/sidebar-item.d.ts +9 -8
- package/dist/composites/app-shell/sidebar.d.ts +10 -10
- package/dist/composites/audio-classification-list.d.ts +16 -15
- package/dist/composites/audio-level-waveform.d.ts +31 -30
- package/dist/composites/audio-waveform.d.ts +18 -17
- package/dist/composites/battery-badge.d.ts +27 -13
- package/dist/composites/breadcrumb.d.ts +21 -21
- package/dist/composites/camera-stream-player.d.ts +309 -309
- package/dist/composites/cap-settings/AutotrackSection.d.ts +19 -2
- package/dist/composites/cap-settings/CameraGridLayoutEditor.d.ts +24 -2
- package/dist/composites/cap-settings/ConsumablesPanel.d.ts +21 -2
- package/dist/composites/cap-settings/CoverageTrack.d.ts +21 -20
- package/dist/composites/cap-settings/EventBucketStrip.d.ts +21 -20
- package/dist/composites/cap-settings/EventHeatmap.d.ts +8 -7
- package/dist/composites/cap-settings/HomePresetPicker.d.ts +2 -2
- package/dist/composites/cap-settings/MaskShapeCanvas.d.ts +143 -41
- package/dist/composites/cap-settings/MotionZonesSettings.d.ts +41 -2
- package/dist/composites/cap-settings/NavigationPanel.d.ts +14 -2
- package/dist/composites/cap-settings/PrivacyMaskSettings.d.ts +3 -2
- package/dist/composites/cap-settings/PtzPanel.d.ts +15 -2
- package/dist/composites/cap-settings/RecordingBandsEditor.d.ts +33 -32
- package/dist/composites/cap-settings/RecordingPanel.d.ts +3 -2
- package/dist/composites/cap-settings/RecordingSettings.d.ts +11 -10
- package/dist/composites/cap-settings/RecordingTimeline.d.ts +3 -2
- package/dist/composites/cap-settings/SceneMonitorEditor.d.ts +3 -51
- package/dist/composites/cap-settings/SceneReferenceGallery.d.ts +62 -23
- package/dist/composites/cap-settings/SceneSettingsForm.d.ts +52 -16
- package/dist/composites/cap-settings/TimelineControls.d.ts +21 -20
- package/dist/composites/cap-settings/camera-grid-layout.d.ts +95 -95
- package/dist/composites/cap-settings/event-thumb.d.ts +9 -8
- package/dist/composites/cap-settings/index.d.ts +20 -20
- package/dist/composites/cap-settings/privacy-mask-audio.d.ts +47 -47
- package/dist/composites/cap-settings/recording-config-form.d.ts +25 -25
- package/dist/composites/cap-settings/recording-spans.d.ts +14 -14
- package/dist/composites/cap-settings/recording-timeline-model.d.ts +57 -57
- package/dist/composites/cap-settings/scene-monitor-copy.d.ts +58 -49
- package/dist/composites/client-network-sample.d.ts +41 -41
- package/dist/composites/clips/ClipBandBar.d.ts +44 -14
- package/dist/composites/clips/ClipPanel.d.ts +30 -6
- package/dist/composites/clips/ClipTile.d.ts +26 -5
- package/dist/composites/clips/ClipsSection.d.ts +107 -2
- package/dist/composites/clips/clip-band.d.ts +72 -38
- package/dist/composites/clips/clip-day-window.d.ts +7 -30
- package/dist/composites/clips/clip-source-state.d.ts +55 -26
- package/dist/composites/clips/clip-still-retry.d.ts +39 -39
- package/dist/composites/clips/clip-thumbnail-fetch.d.ts +9 -9
- package/dist/composites/clips/clip-tile-media.d.ts +64 -32
- package/dist/composites/clips/clip-view-state.d.ts +76 -46
- package/dist/composites/code-block.d.ts +5 -4
- package/dist/composites/config-form-builder.d.ts +14 -13
- package/dist/composites/config-form-field.d.ts +63 -62
- package/dist/composites/config-icon-field.d.ts +10 -9
- package/dist/composites/config-secret-field.d.ts +51 -27
- package/dist/composites/confirm-action-button.d.ts +52 -39
- package/dist/composites/confirm-dialog.d.ts +110 -48
- package/dist/composites/copy-button.d.ts +25 -19
- package/dist/composites/data-table/data-table-header.d.ts +8 -7
- package/dist/composites/data-table/data-table-pagination.d.ts +7 -6
- package/dist/composites/data-table/data-table-row.d.ts +8 -7
- package/dist/composites/data-table/data-table.d.ts +3 -2
- package/dist/composites/data-table/index.d.ts +2 -2
- package/dist/composites/data-table/types.d.ts +29 -29
- package/dist/composites/data-table-filter-bar.d.ts +30 -29
- package/dist/composites/data-table-filter.d.ts +34 -34
- package/dist/composites/data-table-layout.d.ts +24 -24
- package/dist/composites/data-table-pager.d.ts +5 -5
- package/dist/composites/data-table-pagination.d.ts +23 -23
- package/dist/composites/data-table-selection.d.ts +10 -10
- package/dist/composites/data-table.d.ts +167 -118
- package/dist/composites/detection-canvas.d.ts +34 -25
- package/dist/composites/detection-colors.d.ts +9 -9
- package/dist/composites/detection-overlay.d.ts +33 -32
- package/dist/composites/detection-result-tree.d.ts +22 -9
- package/dist/composites/dev-shell.d.ts +15 -14
- package/dist/composites/device-activity-panel.d.ts +37 -31
- package/dist/composites/device-card.d.ts +32 -32
- package/dist/composites/device-controls/ac-panel.d.ts +2 -2
- package/dist/composites/device-controls/alarm-hero-card.d.ts +42 -42
- package/dist/composites/device-controls/atoms.d.ts +50 -50
- package/dist/composites/device-controls/brightness-panel.d.ts +3 -3
- package/dist/composites/device-controls/button-control.d.ts +14 -14
- package/dist/composites/device-controls/climate-panel.d.ts +12 -12
- package/dist/composites/device-controls/container-primary-hero.d.ts +33 -16
- package/dist/composites/device-controls/container-primary.d.ts +68 -39
- package/dist/composites/device-controls/control-panel.d.ts +4 -4
- package/dist/composites/device-controls/control-registry.d.ts +81 -70
- package/dist/composites/device-controls/cover-hero-card.d.ts +26 -26
- package/dist/composites/device-controls/cover-inline.d.ts +20 -20
- package/dist/composites/device-controls/cover-panel.d.ts +2 -2
- package/dist/composites/device-controls/dummy-hero-card.d.ts +2 -2
- package/dist/composites/device-controls/fan-hero-card.d.ts +20 -20
- package/dist/composites/device-controls/fan-panel.d.ts +3 -3
- package/dist/composites/device-controls/humidifier-control.d.ts +46 -29
- package/dist/composites/device-controls/image-control.d.ts +41 -27
- package/dist/composites/device-controls/index.d.ts +34 -34
- package/dist/composites/device-controls/lawn-mower-control.d.ts +30 -16
- package/dist/composites/device-controls/light-hero-card.d.ts +15 -15
- package/dist/composites/device-controls/lock-hero-card.d.ts +14 -14
- package/dist/composites/device-controls/lock-panel.d.ts +3 -3
- package/dist/composites/device-controls/media-player-hero-card.d.ts +16 -16
- package/dist/composites/device-controls/media-player-panel.d.ts +7 -7
- package/dist/composites/device-controls/offline-badge.d.ts +23 -8
- package/dist/composites/device-controls/panel-controls.d.ts +39 -20
- package/dist/composites/device-controls/pet-feeder-panel.d.ts +27 -9
- package/dist/composites/device-controls/popover-row-action.d.ts +18 -6
- package/dist/composites/device-controls/primary-child-picker.d.ts +31 -15
- package/dist/composites/device-controls/primary-child.d.ts +14 -25
- package/dist/composites/device-controls/radial-gauge.d.ts +17 -17
- package/dist/composites/device-controls/script-automation-controls.d.ts +9 -9
- package/dist/composites/device-controls/sensor-hero-card.d.ts +26 -8
- package/dist/composites/device-controls/sensor-inline-control.d.ts +21 -9
- package/dist/composites/device-controls/sensor-value-atom.d.ts +97 -76
- package/dist/composites/device-controls/switch-hero-card.d.ts +11 -11
- package/dist/composites/device-controls/switch-panel.d.ts +2 -2
- package/dist/composites/device-controls/tap-toggle.d.ts +13 -13
- package/dist/composites/device-controls/thermostat-hero-card.d.ts +16 -16
- package/dist/composites/device-controls/types.d.ts +11 -11
- package/dist/composites/device-controls/update-control.d.ts +20 -7
- package/dist/composites/device-controls/vacuum-control.d.ts +41 -25
- package/dist/composites/device-controls/valve-control.d.ts +51 -35
- package/dist/composites/device-controls/water-heater-control.d.ts +48 -31
- package/dist/composites/device-controls/weather-control.d.ts +46 -28
- package/dist/composites/device-export-panel.d.ts +34 -34
- package/dist/composites/device-grid.d.ts +10 -10
- package/dist/composites/device-item/actions.d.ts +40 -18
- package/dist/composites/device-item/admin-link-quick-action.d.ts +66 -26
- package/dist/composites/device-item/child-layout.d.ts +43 -26
- package/dist/composites/device-item/child-section-accordion.d.ts +20 -6
- package/dist/composites/device-item/children-accordion.d.ts +11 -11
- package/dist/composites/device-item/container-children-context.d.ts +28 -11
- package/dist/composites/device-item/device-delete-action.d.ts +23 -5
- package/dist/composites/device-item/features.d.ts +33 -15
- package/dist/composites/device-item/header.d.ts +53 -31
- package/dist/composites/device-item/helpers.d.ts +291 -274
- package/dist/composites/device-item/index.d.ts +18 -9
- package/dist/composites/device-item/preview.d.ts +41 -21
- package/dist/composites/device-item/quick-detail-action.d.ts +4 -4
- package/dist/composites/device-item/reboot-quick-action.d.ts +28 -7
- package/dist/composites/device-item/role-display-defaults-context.d.ts +28 -12
- package/dist/composites/device-item/status-dot.d.ts +24 -6
- package/dist/composites/device-list/batch-actions-bar.d.ts +23 -12
- package/dist/composites/device-list/batch-toolbar.d.ts +13 -13
- package/dist/composites/device-list/columns.d.ts +108 -108
- package/dist/composites/device-list/device-integration.d.ts +48 -58
- package/dist/composites/device-list/device-mode.d.ts +121 -121
- package/dist/composites/device-list/empty-state.d.ts +14 -3
- package/dist/composites/device-list/filter-chips.d.ts +42 -29
- package/dist/composites/device-list/fuzzy-match.d.ts +22 -22
- package/dist/composites/device-list/generic-mode.d.ts +88 -88
- package/dist/composites/device-list/group.d.ts +62 -35
- package/dist/composites/device-list/hardware-cell.d.ts +14 -3
- package/dist/composites/device-list/hardware.d.ts +29 -11
- package/dist/composites/device-list/icon-action.d.ts +27 -15
- package/dist/composites/device-list/index.d.ts +46 -23
- package/dist/composites/device-list/multi-select.d.ts +17 -17
- package/dist/composites/device-list/page-size-select.d.ts +13 -7
- package/dist/composites/device-list/pagination.d.ts +19 -12
- package/dist/composites/device-list/sort.d.ts +28 -15
- package/dist/composites/device-list/sortable-header.d.ts +20 -7
- package/dist/composites/device-list/table-layout.d.ts +44 -44
- package/dist/composites/device-list/type-filter.d.ts +16 -16
- package/dist/composites/device-list/url-state.d.ts +35 -35
- package/dist/composites/device-meta.d.ts +43 -43
- package/dist/composites/device-picker/DevicePicker.d.ts +72 -33
- package/dist/composites/device-picker/SelectedChip.d.ts +10 -9
- package/dist/composites/device-picker/device-filter-bar.d.ts +19 -18
- package/dist/composites/device-picker/device-fleet-view.d.ts +11 -3
- package/dist/composites/device-picker/device-parent.d.ts +27 -27
- package/dist/composites/device-picker/device-picker-grouping.d.ts +3 -3
- package/dist/composites/device-picker/device-picker-model.d.ts +140 -140
- package/dist/composites/device-picker/device-selection-rows.d.ts +31 -24
- package/dist/composites/device-picker/device-selection.d.ts +43 -43
- package/dist/composites/device-picker/index.d.ts +9 -9
- package/dist/composites/device-select-field.d.ts +17 -16
- package/dist/composites/device-select-filter.d.ts +78 -78
- package/dist/composites/device-selector-picker.d.ts +25 -25
- package/dist/composites/device-step-matrix.d.ts +54 -28
- package/dist/composites/discovery-panel.d.ts +22 -22
- package/dist/composites/doorbell-recent-panel.d.ts +9 -8
- package/dist/composites/empty-state.d.ts +8 -8
- package/dist/composites/error-box.d.ts +32 -17
- package/dist/composites/event-kind-visuals.d.ts +29 -18
- package/dist/composites/event-stream.d.ts +59 -42
- package/dist/composites/extensions/AssociationSlotCard.d.ts +45 -24
- package/dist/composites/extensions/ExtensionsPanel.d.ts +41 -18
- package/dist/composites/extensions/extensions-view-state.d.ts +71 -53
- package/dist/composites/filter-bar.d.ts +22 -21
- package/dist/composites/form-field.d.ts +9 -9
- package/dist/composites/format-state-value.d.ts +23 -51
- package/dist/composites/grouped-model-selector.d.ts +7 -6
- package/dist/composites/hls-quality.d.ts +26 -26
- package/dist/composites/hls-video.d.ts +62 -39
- package/dist/composites/hover-zoom-image.d.ts +35 -16
- package/dist/composites/icon-picker.d.ts +86 -50
- package/dist/composites/image-selector.d.ts +21 -20
- package/dist/composites/index.d.ts +204 -204
- package/dist/composites/inference-config-selector.d.ts +36 -35
- package/dist/composites/kebab-menu.d.ts +53 -35
- package/dist/composites/key-value-list.d.ts +14 -14
- package/dist/composites/log-stream-scroll.d.ts +24 -24
- package/dist/composites/log-stream.d.ts +81 -70
- package/dist/composites/login-form.d.ts +7 -6
- package/dist/composites/model-bound-slider.d.ts +46 -26
- package/dist/composites/model-picker.d.ts +20 -19
- package/dist/composites/mount-addon-page.d.ts +12 -12
- package/dist/composites/network-link-badge.d.ts +7 -6
- package/dist/composites/node-picker.d.ts +14 -13
- package/dist/composites/notification-targets-field.d.ts +76 -58
- package/dist/composites/notification-targets-options.d.ts +9 -6
- package/dist/composites/option-select/OptionSelect.d.ts +23 -22
- package/dist/composites/option-select/index.d.ts +4 -4
- package/dist/composites/option-select/option-select-model.d.ts +35 -35
- package/dist/composites/page-header.d.ts +6 -6
- package/dist/composites/peer-connection-config.d.ts +9 -9
- package/dist/composites/phase-icon.d.ts +10 -3
- package/dist/composites/pipeline-builder.d.ts +21 -13
- package/dist/composites/pipeline-matrix-shared.d.ts +159 -150
- package/dist/composites/pipeline-runtime-selector.d.ts +12 -11
- package/dist/composites/pipeline-step.d.ts +39 -31
- package/dist/composites/placeholder-field/PlaceholderChipField.d.ts +23 -22
- package/dist/composites/placeholder-field/index.d.ts +1 -1
- package/dist/composites/provider-badge.d.ts +6 -5
- package/dist/composites/ptz-overlay.d.ts +38 -18
- package/dist/composites/qr-code.d.ts +24 -10
- package/dist/composites/reconnect-schedule.d.ts +22 -22
- package/dist/composites/resolve-step-default-model.d.ts +94 -94
- package/dist/composites/response-log.d.ts +7 -6
- package/dist/composites/root-model-source.d.ts +21 -10
- package/dist/composites/scope-picker.d.ts +49 -25
- package/dist/composites/section-card.d.ts +19 -11
- package/dist/composites/setting-row.d.ts +39 -21
- package/dist/composites/snapshot-button.d.ts +23 -19
- package/dist/composites/sort-header-button.d.ts +25 -8
- package/dist/composites/stat-card.d.ts +20 -8
- package/dist/composites/state-values-stream.d.ts +49 -24
- package/dist/composites/status-badge.d.ts +10 -8
- package/dist/composites/step-inspector/gate-control.d.ts +13 -12
- package/dist/composites/step-inspector/index.d.ts +8 -8
- package/dist/composites/step-inspector/layered-settings-form.d.ts +41 -30
- package/dist/composites/step-inspector/segmented-choice.d.ts +8 -7
- package/dist/composites/step-inspector/setting-values.d.ts +13 -8
- package/dist/composites/step-inspector/step-detail-dock.d.ts +39 -23
- package/dist/composites/step-inspector/step-inspector-panel.d.ts +34 -28
- package/dist/composites/step-inspector/step-model-row.d.ts +29 -24
- package/dist/composites/step-inspector/step-search.d.ts +11 -11
- package/dist/composites/step-timings.d.ts +7 -6
- package/dist/composites/step-tree.d.ts +17 -12
- package/dist/composites/stream-broker-selector.d.ts +29 -8
- package/dist/composites/stream-debug/stream-debug-overlay.d.ts +40 -40
- package/dist/composites/stream-debug/webrtc-debug-stats.d.ts +144 -129
- package/dist/composites/stream-panel.d.ts +212 -201
- package/dist/composites/table-sort.d.ts +61 -61
- package/dist/composites/timezone-selector.d.ts +15 -13
- package/dist/composites/training/send-frame-to-training.d.ts +5 -4
- package/dist/composites/training/training-collection-picker.d.ts +4 -3
- package/dist/composites/training/training-refusal-text.d.ts +6 -6
- package/dist/composites/unit-picker/UnitPicker.d.ts +19 -14
- package/dist/composites/unit-picker/index.d.ts +1 -1
- package/dist/composites/use-data-table-filter.d.ts +19 -19
- package/dist/composites/version-badge.d.ts +19 -18
- package/dist/composites/webrtc-diagnostics/EndpointTestCard.d.ts +7 -7
- package/dist/composites/webrtc-diagnostics/HubSessionTestCard.d.ts +14 -14
- package/dist/composites/webrtc-diagnostics/RunReport.d.ts +10 -5
- package/dist/composites/webrtc-diagnostics/endpoint-probe.d.ts +41 -21
- package/dist/composites/webrtc-diagnostics/endpoint-test.d.ts +37 -32
- package/dist/composites/webrtc-diagnostics/format.d.ts +3 -3
- package/dist/composites/webrtc-diagnostics/ice-candidates.d.ts +49 -49
- package/dist/composites/webrtc-diagnostics/nat-mapping.d.ts +36 -36
- package/dist/composites/webrtc-diagnostics/session-run.d.ts +108 -95
- package/dist/composites/webrtc-diagnostics/session-verdict.d.ts +29 -20
- package/dist/composites/widget-panel.d.ts +23 -23
- package/dist/composites/widget-slot.d.ts +35 -17
- package/dist/contexts/custom-field-renderers.d.ts +53 -17
- package/dist/contexts/device-context.d.ts +32 -12
- package/dist/contexts/device-quick-detail.d.ts +13 -4
- package/dist/contexts/player-overlays.d.ts +82 -42
- package/dist/contexts/recorded-playback.d.ts +40 -18
- package/dist/contexts/system-context.d.ts +28 -13
- package/dist/contexts/vod-playback.d.ts +39 -22
- package/dist/contexts/widget-registry.d.ts +139 -102
- package/dist/contexts/zone-editing.d.ts +69 -46
- package/dist/generated/system-hooks.d.ts +17 -1
- package/dist/hooks/index.d.ts +43 -43
- package/dist/hooks/turn-server-cache.d.ts +69 -69
- package/dist/hooks/use-capability-presence.d.ts +65 -28
- package/dist/hooks/use-cluster-nodes.d.ts +54 -27
- package/dist/hooks/use-device-autotrack.d.ts +7 -7
- package/dist/hooks/use-device-battery.d.ts +24 -11
- package/dist/hooks/use-device-cap-slice.d.ts +15 -15
- package/dist/hooks/use-device-capability.d.ts +61 -27
- package/dist/hooks/use-device-detections.d.ts +32 -32
- package/dist/hooks/use-device-features.d.ts +18 -18
- package/dist/hooks/use-device-list-page-size.d.ts +19 -6
- package/dist/hooks/use-device-network-link.d.ts +15 -7
- package/dist/hooks/use-device-proxy.d.ts +98 -92
- package/dist/hooks/use-device-snapshot.d.ts +23 -23
- package/dist/hooks/use-device-webrtc.d.ts +211 -205
- package/dist/hooks/use-devices.d.ts +9 -9
- package/dist/hooks/use-doorbell-events.d.ts +13 -13
- package/dist/hooks/use-event-stream.d.ts +6 -3
- package/dist/hooks/use-is-mobile.d.ts +5 -5
- package/dist/hooks/use-live-buffer.d.ts +5 -5
- package/dist/hooks/use-live-event.d.ts +1 -1
- package/dist/hooks/use-navigation.d.ts +20 -20
- package/dist/hooks/use-optimistic-slice.d.ts +13 -13
- package/dist/hooks/use-persisted-page-size.d.ts +10 -10
- package/dist/hooks/use-ptz.d.ts +108 -108
- package/dist/hooks/use-stationary-overlay.d.ts +37 -37
- package/dist/hooks/use-system-query.d.ts +33 -10
- package/dist/hooks/use-url-query.d.ts +3 -3
- package/dist/icons/index.d.ts +2 -2
- package/dist/icons/provider-icons.d.ts +2 -2
- package/dist/icons/status-icons.d.ts +2 -2
- package/dist/index.cjs +123 -69
- package/dist/index.d.ts +31 -27
- package/dist/index.js +123 -69
- package/dist/lib/cap-error.d.ts +18 -39
- package/dist/lib/cn.d.ts +1 -1
- package/dist/lib/fleet-query-defaults.d.ts +68 -34
- package/dist/lib/format-control-datetime.d.ts +16 -16
- package/dist/lib/format-duration.d.ts +12 -12
- package/dist/lib/format-last-seen.d.ts +5 -18
- package/dist/lib/format-numeric.d.ts +7 -7
- package/dist/lib/hub-mount.d.ts +8 -42
- package/dist/lib/index.d.ts +21 -21
- package/dist/lib/phase-config.d.ts +24 -11
- package/dist/lib/pipeline-mirror.d.ts +16 -16
- package/dist/lib/recorded-control-protocol.d.ts +41 -43
- package/dist/lib/resolve-sensor-display.d.ts +36 -20
- package/dist/lib/responsive.d.ts +54 -54
- package/dist/lib/scrub-controller.d.ts +75 -78
- package/dist/lib/shared-context.d.ts +27 -2
- package/dist/lib/tailwind-variants.d.ts +20 -20
- package/dist/primitives/badge.d.ts +5 -10
- package/dist/primitives/bottom-sheet.d.ts +7 -7
- package/dist/primitives/button.d.ts +5 -9
- package/dist/primitives/card.d.ts +4 -8
- package/dist/primitives/checkbox.d.ts +3 -4
- package/dist/primitives/collapsible-card.d.ts +23 -13
- package/dist/primitives/dialog.d.ts +33 -59
- package/dist/primitives/dropdown.d.ts +13 -13
- package/dist/primitives/floating-panel.d.ts +41 -20
- package/dist/primitives/icon-button.d.ts +8 -12
- package/dist/primitives/index.d.ts +22 -22
- package/dist/primitives/input.d.ts +6 -16
- package/dist/primitives/label.d.ts +3 -4
- package/dist/primitives/mobile-drawer.d.ts +8 -8
- package/dist/primitives/password-input.d.ts +18 -18
- package/dist/primitives/popover.d.ts +7 -7
- package/dist/primitives/scroll-area.d.ts +3 -4
- package/dist/primitives/select.d.ts +20 -20
- package/dist/primitives/separator.d.ts +4 -8
- package/dist/primitives/skeleton.d.ts +3 -4
- package/dist/primitives/switch.d.ts +6 -6
- package/dist/primitives/tabs.d.ts +26 -26
- package/dist/primitives/tooltip.d.ts +12 -12
- package/dist/theme/create-theme.d.ts +1 -1
- package/dist/theme/defaults.d.ts +1 -1
- package/dist/theme/index.d.ts +6 -6
- package/dist/theme/theme-provider.d.ts +8 -7
- package/dist/theme/theme-to-css.d.ts +1 -1
- package/dist/theme/types.d.ts +98 -100
- package/dist/theme/use-theme-mode.d.ts +1 -1
- package/dist/trpc-react.d.ts +23 -3
- package/dist/widgets/host-widgets.d.ts +4 -4
- package/package.json +8 -4
- package/src/tailwind/camstack-theme.css +11 -0
- package/dist/composites/unit-picker/UnitPicker.spec.d.ts +0 -1
|
@@ -1,59 +1,82 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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
|
-
|
|
5
|
-
|
|
28
|
+
readonly x: number;
|
|
29
|
+
readonly y: number;
|
|
6
30
|
}
|
|
7
31
|
export interface ZoneDraft {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
|
|
75
|
+
readonly children: ReactNode;
|
|
53
76
|
}
|
|
54
|
-
export declare function ZoneEditingProvider({ children }: ZoneEditingProviderProps):
|
|
77
|
+
export declare function ZoneEditingProvider({ children }: ZoneEditingProviderProps): JSX.Element;
|
|
55
78
|
/** Read + drive the zone-editing state. Returns `null` outside a
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
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`. */
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
export { useUrlQueryParam } from
|
|
2
|
-
export type { ClusterNode, ClusterTopologyNode, ClusterTopologyResult
|
|
3
|
-
export { useClusterNodes, useClusterTopology } from
|
|
4
|
-
export { useDebouncedString } from
|
|
5
|
-
export type { UseDeviceAutotrack } from
|
|
6
|
-
export { useDeviceAutotrack } from
|
|
7
|
-
export type { UseDeviceBatteryTrpc } from
|
|
8
|
-
export type { NavigationDirection, UseNavigationResult } from
|
|
9
|
-
export { NAVIGATION_DRIVE_INTERVAL_MS, useNavigation } from
|
|
10
|
-
export { useDeviceBattery } from
|
|
11
|
-
export type { NetworkLinkStatus } from
|
|
12
|
-
export { useDeviceNetworkLink } from
|
|
13
|
-
export type { UseDeviceCapSliceTrpc } from
|
|
14
|
-
export { useDeviceCapSlice } from
|
|
15
|
-
export type { UseDeviceCapabilityOptions, UseDeviceCapabilityResult
|
|
16
|
-
export { useDeviceCapability } from
|
|
17
|
-
export type { DetectionState, DeviceDetections, MotionRawBox, MotionRawState, MotionState, MotionZone
|
|
18
|
-
export { useDeviceDetections } from
|
|
19
|
-
export type { PersistedPageSizeConfig, SetPageSize } from
|
|
20
|
-
export { PAGE_SIZE_ALL, effectivePageSize, usePersistedPageSize
|
|
21
|
-
export type { SetDeviceListPageSize } from
|
|
22
|
-
export { DEVICE_LIST_PAGE_SIZE_KEY, DEVICE_LIST_PAGE_SIZE_OPTIONS, useDeviceListPageSize
|
|
23
|
-
export type { UseDeviceProxyTrpc } from
|
|
24
|
-
export { useDeviceProxy, useDeviceState, useDeviceStateSlice } from
|
|
25
|
-
export { useStationaryOverlay, toStationaryOverlayBox } from
|
|
26
|
-
export type { DeviceSnapshotImage, UseDeviceSnapshotOptions } from
|
|
27
|
-
export { SNAPSHOT_MEDIA_PATH, useDeviceSnapshotImage } from
|
|
28
|
-
export type { DevicePipelineMetrics, DeviceWebrtcResult, SessionRenegotiationState, UseDeviceWebrtcTrpc, WebrtcTarget
|
|
29
|
-
export { useDeviceWebrtc } from
|
|
30
|
-
export { useDevice, useDevices } from
|
|
31
|
-
export type { DoorbellPressEvent, UseDoorbellEventsOptions, UseDoorbellEventsResult
|
|
32
|
-
export { useDoorbellEvents } from
|
|
33
|
-
export { useEventInvalidation } from
|
|
34
|
-
export { useEventStreamLatest, useEventStreamMap } from
|
|
35
|
-
export { useIsMidWidth, useIsMobile } from
|
|
36
|
-
export type { LiveBuffer } from
|
|
37
|
-
export { useLiveBuffer } from
|
|
38
|
-
export { type LiveEventCallback, useLiveEvent } from
|
|
39
|
-
export type { UseOptimisticSliceOptions, UseOptimisticSliceResult } from
|
|
40
|
-
export { useOptimisticSlice } from
|
|
41
|
-
export type { PTZDirection, PTZTrpcProxy, UsePTZOptions, UsePTZResult } from
|
|
42
|
-
export { usePTZ } from
|
|
43
|
-
export { type SystemMutationSelector, type SystemQuerySelector, useSystemMutation, useSystemQuery
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
43
|
-
|
|
42
|
+
getItem(key: string): string | null;
|
|
43
|
+
setItem(key: string, value: string): void;
|
|
44
44
|
}
|
|
45
45
|
export interface TurnServerCacheOptions {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
|
|
4
|
-
*
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
61
|
+
readonly nodes: readonly ClusterNode[];
|
|
62
|
+
readonly isLoading: boolean;
|
|
63
|
+
readonly isError: boolean;
|
|
37
64
|
};
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { PtzAutotrackSettings, PtzAutotrackStatus } from
|
|
1
|
+
import type { PtzAutotrackSettings, PtzAutotrackStatus } from "@camstack/types";
|
|
2
2
|
export interface UseDeviceAutotrack {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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;
|