415 lines
16 KiB
Markdown
415 lines
16 KiB
Markdown
# Changelog
|
|
|
|
All notable changes to this project will be documented in this file.
|
|
|
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
|
## [Unreleased]
|
|
|
|
## [19.1.0](https://github.com/michel/soulseek-rs/compare/v19.0.0...v19.1.0) - 2026-09-21
|
|
|
|
### Added
|
|
|
|
- *(cli)* print completion scripts and the man page to stdout
|
|
- *(cli)* let a build name its own version
|
|
- *(tui)* say so in the status bar when the listener took another port
|
|
- *(lib)* let another thread cancel a client's connect and login
|
|
- *(lib)* cap the combined download speed
|
|
|
|
### Fixed
|
|
|
|
- *(tui)* cancel a replaced login attempt and wait for it to let go
|
|
- *(tui)* keep the login screen responsive while connecting
|
|
- *(rooms)* start a room's roster from the member list, not the join echo
|
|
- *(lib)* give the listener port back before a dropped client returns
|
|
- *(client)* record a watch before the server can answer it
|
|
|
|
### Other
|
|
|
|
- declare Rust 1.91 as the minimum version
|
|
- Merge pull request #97 from michel/test/event-synced-e2e
|
|
- *(e2e)* give a soulfind that dies on startup a fresh port
|
|
- *(portmap)* find the unmap among resent maps
|
|
- *(cli)* wait for the listener to be in the room, and keep an early PM
|
|
- *(cli)* hand a config command's session flags to the daemon
|
|
- *(e2e)* fence on the server where a test slept for another client
|
|
- *(e2e)* start a mock uploader once the client has registered it
|
|
- *(e2e)* wait for the join and the password change, not a sleep
|
|
- *(resume)* bound what a paused transfer may still take, not when
|
|
|
|
## [19.0.0](https://github.com/michel/soulseek-rs/compare/v18.0.0...v19.0.0) - 2026-09-10
|
|
|
|
### Added
|
|
|
|
- browse your own shares as a peer receives them
|
|
- *(tui)* account settings — stats, password change, and logout
|
|
- *(tui)* clear the whole queue from the transfers pane
|
|
- folders in the browse tree carry their download's mark too
|
|
- mark browsed files with their download status
|
|
- browse the highlighted transfer's user with b
|
|
- *(distributed)* serve children in the search tree
|
|
- *(rooms)* private room membership, operators and refusals
|
|
- *(tui)* resize panes by dragging pane borders
|
|
- *(tui)* run the highlighted search again with S
|
|
- *(tui)* search a room's log and members, and a conversation
|
|
- *(tui)* folder jumps, open-all and a path filter in the browse popup
|
|
- *(tui)* W puts the pane layout back
|
|
- *(tui)* show the clear-all key in the searches pane's shortcuts
|
|
- *(tui)* show a result's file name and folder in columns of their own
|
|
- *(peer)* ask a peer what it says about itself
|
|
- *(distributed)* learn our own upload speed by watching ourselves
|
|
- *(interests)* keep our own list and send it again each login
|
|
- *(protocol)* folder requests, and heuristics matched to other clients
|
|
- *(protocol)* away status, excluded phrases, queue-place requests
|
|
- *(protocol)* interests, tickers, global room and cant-connect
|
|
- *(download)* resume interrupted transfers
|
|
|
|
### Fixed
|
|
|
|
- *(uploads)* finish a transfer when the file lands, not when the peer closes
|
|
- review findings on the protocol work
|
|
- *(distributed)* a server with no parent figures leaves our cap alone
|
|
- *(messages)* acknowledge stored private messages, and disconnect cleanly
|
|
|
|
### Other
|
|
|
|
- back-merge master to pick up the v14.2.0-v18.0.0 releases
|
|
- split the files that had grown past reading size
|
|
- trim the folder mark's allocations and indirection
|
|
- drop the per-row String behind the browse marker's gap
|
|
- *(tests)* share one soulfind fixture across the e2e suites
|
|
- *(tui)* one page window and one filter editor for every list
|
|
- *(tui)* wrap a chat log as it arrives instead of on every frame
|
|
- *(tui)* flatten a browsed share once and draw one page of it
|
|
- *(tui)* build only the visible page of result rows
|
|
- *(tui)* trim the folder column change to what it needs
|
|
- stop pinning a library version the instructions cannot keep current
|
|
- give the hung-up child's reap a wall-clock budget
|
|
- spell two Durations in their optimal units
|
|
- lead with the protocol coverage, and drop a stale upload assertion
|
|
- *(e2e)* the operator roster of a private room
|
|
- *(e2e)* resigning a private room, disbanding it, gifting privileges
|
|
- *(e2e)* a room announces members arriving and leaving
|
|
- *(e2e)* drive the new protocol messages against soulfind
|
|
|
|
## [18.0.0](https://github.com/michel/soulseek-rs/compare/v17.0.0...v18.0.0) - 2026-09-08
|
|
|
|
### Added
|
|
|
|
- *(lib)* carry audio attributes in browse and folder listings
|
|
- *(lib)* read audio attributes from shared files at scan time
|
|
- *(lib)* join the distributed search network as a leaf
|
|
- *(lib)* decode distributed frames and announce a parentless stance
|
|
|
|
### Fixed
|
|
|
|
- *(lib)* free a silent parent's slot and pace the moves we report
|
|
- *(lib)* harden the distributed leaf against hostile and slow parents
|
|
- *(lib)* count the ID3 tag once and honour CRC frames when probing an MP3
|
|
- *(lib)* parse what a peer sent before acting on its close
|
|
- *(lib)* retire a dialling actor at once and drain the socket while retired
|
|
- *(stress)* serve a browse that lands while an offer awaits its answer
|
|
- *(lib)* keep a replaced peer connection open for the reply in flight
|
|
- *(lib)* let an unanswered upload offer expire
|
|
|
|
### Other
|
|
|
|
- Merge branch 'develop'
|
|
- *(lib)* keep the actors inside the crate and mark the growing enums
|
|
- *(lib)* export the ConnectionType parse error and document what hosts can still match
|
|
- *(lib)* move the peer actor's tests to their own file
|
|
- gate pull requests on the stress benchmark losing no work
|
|
|
|
## [17.0.0](https://github.com/michel/soulseek-rs/compare/v16.0.0...v17.0.0) - 2026-09-07
|
|
|
|
### Added
|
|
|
|
- *(lib)* report each finished upload's rate to the server
|
|
- *(lib)* surface server announcements as messages from "server"
|
|
- *(lib)* answer UserInfoRequest with our slots and queue
|
|
- *(lib)* answer FolderContentsRequest with the folder's listing
|
|
|
|
### Fixed
|
|
|
|
- *(lib)* keep the log level in an atomic and let hosts change it
|
|
- *(lib)* compress peer listings and reject a bad zlib checksum
|
|
- *(lib)* report a download's rate from the bytes actually read
|
|
- *(lib)* keep the server connection alive with TCP keepalive
|
|
- *(lib)* advertise real slot, speed and queue figures in search replies
|
|
- *(lib)* route on the full four-byte message code
|
|
- *(lib)* give each search its own token
|
|
- *(lib)* cap a search reply at 150 files
|
|
|
|
### Other
|
|
|
|
- *(lib)* split the server actor's value types and tests out
|
|
- *(lib)* lowercase each shared path once at scan time
|
|
- *(lib)* read downloads in 64 KiB slices
|
|
- Merge pull request #69 from michel/lib/user-info
|
|
|
|
## [16.0.0](https://github.com/michel/soulseek-rs/compare/v15.0.0...v16.0.0) - 2026-09-07
|
|
|
|
### Added
|
|
|
|
- *(tui)* scroll long names in every list and page through popups and chat
|
|
- *(tui)* results across the top, with panes you can hide, zoom and Tab through
|
|
|
|
### Other
|
|
|
|
- Merge remote-tracking branch 'origin/develop'
|
|
- *(tui)* fold the keys overlay onto LogView and dedupe the pane lookups
|
|
|
|
## [15.0.0](https://github.com/michel/soulseek-rs/compare/v14.2.1...v15.0.0) - 2026-09-06
|
|
|
|
### Added
|
|
|
|
- *(tui)* scroll long result names and page through results
|
|
- cancel a download from the TUI, the CLI, and the daemon
|
|
|
|
### Other
|
|
|
|
- Merge branch 'develop'
|
|
- Merge branch 'develop' into feat/tui-results-navigation
|
|
- *(tui)* bound the name scroll walk by the column width
|
|
|
|
## [14.2.1](https://github.com/michel/soulseek-rs/compare/v14.2.0...v14.2.1) - 2026-09-03
|
|
|
|
### Fixed
|
|
|
|
- *(daemon)* reconnect after the server session drops
|
|
|
|
### Other
|
|
|
|
- Merge branch 'develop'
|
|
|
|
## [14.2.0](https://github.com/michel/soulseek-rs/compare/v14.1.2...v14.2.0) - 2026-09-01
|
|
|
|
### Added
|
|
|
|
- *(daemon)* publish room member statistics over RPC and the CLI
|
|
- *(tui)* dismiss a finished download with d
|
|
- *(lib)* watch and unwatch users (WatchUser 5 / UnwatchUser 6)
|
|
|
|
### Fixed
|
|
|
|
- *(cli)* keep `room users` text output a bare roster
|
|
- slotsfull is occupancy, not free slots, and cover it end to end
|
|
|
|
### Other
|
|
|
|
- release v14.1.2
|
|
- Merge remote-tracking branch 'origin/develop' into feat/room-member-stats
|
|
- *(e2e)* cover watching against soulfind, and read the reply as written
|
|
|
|
## [14.1.2](https://github.com/michel/soulseek-rs/compare/v14.1.1...v14.1.2) - 2026-08-18
|
|
|
|
### Other
|
|
|
|
- drop bot wording in favor of client
|
|
|
|
## [14.1.1](https://github.com/michel/soulseek-rs/compare/v14.1.0...v14.1.1) - 2026-08-17
|
|
|
|
### Fixed
|
|
|
|
- *(peer)* survive download token races on the listener path
|
|
- *(peer)* wait for the transfer token before the download lookup
|
|
|
|
### Other
|
|
|
|
- Merge pull request #44 from michel/issue-42-download-token-races
|
|
|
|
## [14.1.0](https://github.com/michel/soulseek-rs/compare/v14.0.1...v14.1.0) - 2026-08-14
|
|
|
|
### Added
|
|
|
|
- *(tui)* wrap long chat messages instead of clipping them
|
|
- *(tui)* navigate and confirm while filtering search results
|
|
|
|
### Other
|
|
|
|
- rustfmt in chat wrap test
|
|
- *(client)* dedupe peer registration and order eviction by id
|
|
|
|
## [14.0.1](https://github.com/michel/soulseek-rs/compare/v14.0.0...v14.0.1) - 2026-08-13
|
|
|
|
### Fixed
|
|
|
|
- *(client)* survive the review findings on the thread-flood fix
|
|
- *(client)* bound the threads a peer flood can create
|
|
- *(peer)* handle UploadDenied so refused downloads fail fast
|
|
- *(peer)* forward UploadFailed to the download store
|
|
- *(actor)* leave Disconnected state behind after every disconnect
|
|
|
|
### Other
|
|
|
|
- Merge branch 'develop': peer failure forwarding and thread-flood fixes
|
|
|
|
## [14.0.0](https://github.com/michel/soulseek-rs/compare/v13.0.0...v14.0.0) - 2026-08-10
|
|
|
|
### Fixed
|
|
|
|
- survive busy sessions without exhausting file descriptors
|
|
- *(lib)* cap what a search collects
|
|
|
|
### Other
|
|
|
|
- Merge branch 'develop': fd-exhaustion fixes
|
|
- *(daemon)* answer search polls with counts instead of copies
|
|
|
|
## [13.0.0](https://github.com/michel/soulseek-rs/compare/v12.0.0...v13.0.0) - 2026-07-29
|
|
|
|
### Added
|
|
|
|
- *(daemon)* make the download folder a live setting in both modes
|
|
- *(daemon)* make every window a view of one shared session
|
|
- *(daemon)* say what to do next on startup, and prove multiple clients agree
|
|
- *(config)* remember which daemon to use, and document the download box
|
|
- *(daemon)* route commands and the TUI through a running daemon
|
|
- *(daemon)* resident session, auth-gated control socket, and event fan-out
|
|
- *(daemon)* wire protocol with a type-safe method vocabulary and a generated OpenRPC contract
|
|
|
|
### Fixed
|
|
|
|
- *(daemon)* version the contract by its protocol, not by the crate
|
|
- *(daemon)* ask the OS for enough open files, and stop spinning when it says no
|
|
- *(daemon)* a thread the OS refuses must not take the listener with it
|
|
- *(shares)* let add and remove reach a running daemon
|
|
- *(daemon)* correct the published contract and harden the control socket
|
|
|
|
### Other
|
|
|
|
- *(daemon)* match a reply by its id instead of taking the next line
|
|
- cut what a whole-repo audit proved dead, padded, or hand-rolled
|
|
- *(skill)* choose the track yourself; narrow the results instead of skipping them
|
|
- *(skill)* make the cheap path the default and stop moving paths by hand
|
|
- *(skill)* stream picks into transfers instead of batching them
|
|
- *(skill)* raise the batch limits to what the client is actually built for
|
|
- *(skill)* add the search ladder, and one budget both batch routes obey
|
|
- *(skill)* teach the agent to fetch a list without getting the user banned
|
|
- *(skill)* make the daemon the default way an agent works
|
|
- *(daemon)* route the suite at its chokepoint and cover the protocol directly
|
|
- *(daemon)* drive the whole CLI suite against a daemon, and fix what it caught
|
|
- publish the daemon protocol and describe daemon mode in the README
|
|
- *(api)* put a SessionApi seam between the commands, the TUI, and the client
|
|
|
|
## [12.0.0](https://github.com/michel/soulseek-rs/compare/v11.0.0...v12.0.0) - 2026-07-26
|
|
|
|
### Added
|
|
|
|
- lift the client's concurrency ceiling from ~15 peers to 1024
|
|
|
|
### Fixed
|
|
|
|
- *(serve)* report a queued upload even when it is served between two polls
|
|
|
|
### Other
|
|
|
|
- raise transfer defaults and stop uploads sleeping on their slot
|
|
- add a code quality baseline
|
|
- *(lib)* move the client tests into their own file
|
|
|
|
## [11.0.0](https://github.com/michel/soulseek-rs/compare/v10.0.0...v11.0.0) - 2026-07-26
|
|
|
|
### Fixed
|
|
|
|
- [**breaking**] make concurrent invocations work instead of silently seeing nothing ([#22](https://github.com/michel/soulseek-rs/pull/22))
|
|
|
|
## [10.0.0](https://github.com/michel/soulseek-rs/compare/v9.1.0...v10.0.0) - 2026-07-26
|
|
|
|
### Added
|
|
|
|
- [**breaking**] wishlist, upload-queue privilege recognition, and search filters ([#20](https://github.com/michel/soulseek-rs/pull/20))
|
|
|
|
## [9.1.0](https://github.com/michel/soulseek-rs/compare/v9.0.0...v9.1.0) - 2026-07-26
|
|
|
|
### Added
|
|
|
|
- resume an interrupted download instead of refetching it ([#18](https://github.com/michel/soulseek-rs/pull/18))
|
|
|
|
## [9.0.0](https://github.com/michel/soulseek-rs/compare/v8.0.0...v9.0.0) - 2026-07-26
|
|
|
|
### Added
|
|
|
|
- install tab completion for bash, zsh, and fish ([#16](https://github.com/michel/soulseek-rs/pull/16))
|
|
|
|
## [8.0.0](https://github.com/michel/soulseek-rs/compare/v7.1.0...v8.0.0) - 2026-07-26
|
|
|
|
### Added
|
|
|
|
- log in with soulseek-rs's own client major version (176) ([#13](https://github.com/michel/soulseek-rs/pull/13))
|
|
|
|
## [7.1.0](https://github.com/michel/soulseek-rs/compare/v7.0.0...v7.1.0) - 2026-07-25
|
|
|
|
### Added
|
|
|
|
- *(tui)* give the panes the colour the demo promised
|
|
|
|
### Fixed
|
|
|
|
- *(lib)* give the login verdict the wait the caller already allows
|
|
|
|
## [7.0.0](https://github.com/michel/soulseek-rs/compare/v6.0.0...v7.0.0) - 2026-07-25
|
|
|
|
### Added
|
|
|
|
- *(cli)* ship the agent skill inside the binary
|
|
- *(cli)* expose sharing, peer lookup and settings as one-shot commands
|
|
- *(cli)* [**breaking**] replace the one-shot commands with a scriptable surface
|
|
- *(ui)* theme the TUI with the soulseek-rs design system
|
|
|
|
### Fixed
|
|
|
|
- *(peer)* serve full browse listings + harden the listener; TUI transfer/UX work
|
|
- *(persist)* use XDG paths on macOS
|
|
- *(peer)* log disconnect cause; bind e2e browse listener on all interfaces
|
|
|
|
### Other
|
|
|
|
- link the website from the crates and the READMEs
|
|
- clear the quality-scan findings
|
|
- document the skills command and the scriptable surface
|
|
- pin soulseek-rs-lib install snippets to 6
|
|
|
|
## [6.0.0](https://github.com/michel/soulseek-rs/compare/v5.0.0...v6.0.0) - 2026-07-24
|
|
|
|
### Breaking changes
|
|
|
|
Library only. If you install the `soulseek-rs` binary there is nothing to do —
|
|
these affect crates depending on `soulseek-rs-lib` 5.x. Sharing moved from a
|
|
single optional directory to a list, which changed three public items.
|
|
|
|
- `ClientSettings::shared_directory: Option<String>` is now
|
|
`shared_directories: Vec<String>`. `None` becomes `vec![]`, `Some(dir)`
|
|
becomes `vec![dir]`.
|
|
- `Client::shared_directory() -> Option<&str>` is replaced by
|
|
`Client::shared_directories() -> Vec<String>`. The new
|
|
`Client::set_shared_directories(Vec<String>)` updates the set at runtime.
|
|
- `peer::upload_peer::serve_file` takes two more parameters,
|
|
`bytes_sent: &AtomicU64` and `cancel: &AtomicBool`, which drive upload
|
|
progress and cancellation. Pass freshly constructed values to keep the old
|
|
behaviour.
|
|
|
|
### Added
|
|
|
|
- settings popup and uploads in the transfers pane
|
|
- update shared directories at runtime
|
|
- multiple shared directories
|
|
- conventional default download and share folders
|
|
- set aside unusable state files as .bak instead of overwriting
|
|
- persist and restore TUI state across restarts
|
|
- versioned JSON state stores for downloads, searches, rooms
|
|
- in-TUI login/registration screen
|
|
- password resolution via OS keychain and password_cmd
|
|
- config.toml settings layer (CLI > env > file > defaults)
|
|
- track uploads with progress and cancellation
|
|
|
|
### Fixed
|
|
|
|
- drop libdbus dependency from keyring Linux backend
|
|
- clippy cleanups in upload tracking and share plumbing
|
|
|
|
### Other
|
|
|
|
- persistence e2e and registration-relogin e2e; lint clean
|