Apply more modern JS features: AbortController, Error cause, Array.at, toSorted - VideoPlayerNode.ts: create a single AbortController for all video-element event listeners (error, loadstart, loadedmetadata x2, durationchange, ended, timeupdate) plus the document keydown listener; dispose() calls listenerController.abort() instead of 8 individual removeEventListener calls - AutoTrackerNode.ts: same pattern for the timeupdate/seeked pair; dispose() now calls listenerController.abort() instead of two removeEventListener calls - OpenCVTracker.ts: replace Object.assign(err, { cause: e }) with the native Error constructor second-argument form: new Error(msg, { cause: e }) (ES2022) - TrackingModel.ts: replace spread-then-sort with Array.toSorted() (ES2023), and tracks[tracks.length - 1] with tracks.at(-1) (ES2022) https://claude.ai/code/session_014gWKu1ZSG9hxhwpFd776KV - #80
Merged