Replace the dwell-ranking-based auto-zoom algorithm with a pure click-cluster
approach:
- Extract explicit click events (click, double-click, right-click, middle-click)
from cursor telemetry via detectInteractionCandidates
- Chain-merge clicks that occur within 2500 ms of each other into one cluster
- Expand each cluster to a zoom window of [firstClick - 500 ms, lastClick + 500 ms]
- Skip clusters that overlap already-placed zoom regions (reservedSpans)
New exported constants: CLICK_CLUSTER_MERGE_GAP_MS (2500) and CLICK_CLUSTER_PAD_MS (500).
Adds zoomSuggestionUtils.test.ts with 7 unit tests covering the new logic.
The repo was moved from github.com/webadderall to github.com/webadderallorg
but several files still reference the old URL. GitHub serves a 301
redirect today, but package.json metadata, the Homebrew cask, and the
in-app issues link should point to the canonical location.
Updated:
- package.json (homepage, repository.url, bugs.url)
- README.md and README.zh-CN.md (releases / clone / issues links)
- CONTRIBUTING.md (issues link)
- recordly.rb (Homebrew cask url + homepage)
- src/components/video-editor/TutorialHelp.tsx (RECORDLY_ISSUES_URL)
- src/components/video-editor/videoPlayback/motionSmoothing.ts (attribution comment)
Exports of recordings whose muxed output exceeds 2 GiB failed with
RangeError [ERR_FS_FILE_TOO_LARGE]: Node's fs.readFile rejects files
larger than kIoMaxLength (2 ** 31 - 1). The legacy export pipeline hit
this in muxExportedVideoAudioBuffer, which called
await fs.readFile(finalized.outputPath)
to ship the muxed bytes back to the renderer.
Mirror the path-based contract that mux-exported-video-audio-from-path
already uses:
- muxExportedVideoAudioBuffer now returns { outputPath, metrics } and
collects byte size via fs.stat instead of fs.readFile. The unmuxed
intermediate is still cleaned up; the muxed output is left for the
IPC handler to register and the renderer to finalize.
- The mux-exported-video-audio IPC handler registers the muxed output
via registerOwnedExportPath and returns { tempPath, metrics }.
- preload.ts and electron-env.d.ts: tempPath replaces data in the
renderer-facing return type.
- videoExporter.ts and modernVideoExporter.ts (the
finalizeExportWithFfmpegAudio fallback paths) now return
{ tempFilePath } so VideoEditor's existing finalize-exported-video
flow handles the move — the same path the modern stream-mode export
already takes.
The renderer already preferred tempFilePath over blob in
VideoEditor.tsx for MP4 saves (with the explicit comment "avoids ever
allocating a multi-GiB ArrayBuffer in the renderer"), so this just
removes the buffer-mode regression for large legacy exports.
Adds electron/ipc/export/native-video.test.ts asserting the new
contract: muxExportedVideoAudioBuffer returns a path, never calls
fs.readFile, and still records muxedVideoBytes via stat.
Closes#380