🤖 AI-Generated Changelog
Added
- Object observation evidence pipeline: Full end-to-end support for capturing, storing, and reviewing evidence clips tied to detection events, including per-camera opt-in and configurable storage budgets
- Observation classifications: New database layer and API for annotating and classifying detected objects, with a PUT endpoint for updating classifications from the web UI
- Observation pipeline metrics: System diagnostics view now includes observation pipeline statistics for monitoring throughput and health
- WebRTC multi-address External IP support: Accept a comma-separated list of External IPs as WebRTC STUN candidates to improve connectivity in multi-homed deployments
- Linked observation classifications in the UI: Detection results in the web interface now display associated observation classifications alongside detections
- ONVIF and HTTP API observation evidence endpoints: New API routes for retrieving observation evidence captured from local detectors and ONVIF sources
Changed
- Frontend toolchain upgrade: Web build now uses Node 26 LTS and TypeScript 7
- Build verification: SQLite and libuv source archives are now verified with scoped checksums during build
Fixed
- Observation retention cleanup: Corrected cleanup semantics to avoid unsafe deletion and ensure evidence files are retried after expiry
- ONVIF retry behavior: Retry logic now sends the rebuilt SOAP envelope rather than freed memory; connection test failures now report a reason; refused RTSPS connections are retried as plain RTSP
- WebRTC candidate parsing: IPv6 addresses are now validated correctly and usable STUN candidates are emitted; candidate output is guarded in the parser loop
- Evidence frame lifecycle: Rejected evidence frames are now released on the worker thread; submit-latency gate enforced
- Evidence file sweeping: Evidence files are now swept relative to directory file descriptors to eliminate a TOCTOU race (CodeQL)
- Atomic flags in evidence and retention: Converted to
atomic_intfor correctness in the C-to-Rust FFI boundary - go2rtc External IP parser: Parser now builds correctly when go2rtc integration is disabled
- Contract code generation: Eliminated redundant validator generation; preserved validated schema export names; retained temporary file imports for native generation
- Null dereference: Removed redundant null check following a prior dereference in observation retention
- CI timeline auto-advance: Playwright tests now wait for real playback before seeking near a segment boundary; invalid detection timestamps are each covered independently
🔗 Full Changelog: v0.47.3...v0.48.0