Repository navigation
feat(filebrowser): multi-select and Download as Zip - #23
Merged
Merged
Conversation
- File browser rows support multi-selection: Ctrl/Cmd-click toggles, Shift-click selects a range, Ctrl/Cmd+A selects all, Esc / arrow keys / changing folder clear it. Selected rows are highlighted. - Right-click inside a multi-selection: "Download N Items as Zip", plus copy file names / full paths / shell-quoted names. Single rows (files or folders) get "Download as Zip". - New /wave/stream-zip endpoint builds the zip on the fly and streams it: folders recursively, each file streamed like /wave/stream-file (SFTP for no-wsh hosts, wsh streams for wsh hosts, local files too), so there's no 32 MB transfer limit and nothing is staged on disk. Duplicate top-level names get " (2)"; unreadable files are listed in _download-errors.txt in the zip instead of failing the download; symlinked folders aren't followed. Electron downloads it through the normal download flow. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JhvhnSTH8EXbTG9wmtY7dd
…pace) - Shift+Up/Down/PageUp/PageDown extend the selection from the anchor (the focused row if nothing was selected), and can shrink it back - Ctrl+Up/Down/PageUp/PageDown move the focus without changing the selection (a lone focused row becomes explicitly selected first) - Ctrl+Space adds or removes the focused row - fix: select-all was bound to Wave's "Cmd", which is Alt on Windows and Linux; it's now Ctrl+A there (Cmd+A on macOS), same for the keys above The table publishes its row order (dirDisplayPaths) so keyboard ranges follow the sorted display, like Shift-click. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JhvhnSTH8EXbTG9wmtY7dd
Right-click a multi-selection -> "Delete N Items…", or press Delete with several rows selected. Always asks first, listing the names (up to 8 + "and N more"); folders in the selection are deleted with their contents. Items that fail are listed afterwards; the selection clears and the folder refreshes. Uses FileDeleteCommand, so no-wsh (SFTP), wsh and local folders all work. Single-row delete is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JhvhnSTH8EXbTG9wmtY7dd
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
/wave/stream-zip(new,pkg/web/streamzip.go): builds the zip on the fly and streams it to Electron's normal download flow (same as "Download File"). Folders are walked recursively; each file is streamed exactly like/wave/stream-file.Both connection paths
wshfs.OpenAltStream, folders list via the SFTP AltFs.wshfs.FileStream+ the RPC stream broker, folders viaRemoteListEntries.wsh://local/…path.No 32 MB transfer limit anywhere (no single-message reads), nothing staged on disk.
Details: duplicate top-level names become
name (2).ext; files that can't be read are listed in_download-errors.txtinside the zip (the response has already started, so the download still completes); symlinked folders aren't followed; limits 64 levels deep / 200k entries.Testing
streamzip_test.go): the handler against a real temp directory served through the file hooks — nested folders, a 40 MB file (byte-identical after unzip), duplicate names, an unreadable file reported in the errors file; bad requests (no/invalid/empty paths, missing file) return errors..., right-click targets, zip naming.tsc,go vet, prettier, gofmt.🤖 Generated with Claude Code
https://claude.ai/code/session_01JhvhnSTH8EXbTG9wmtY7dd