Fix exit node REPL blindness and hostname resolution#37
Merged
Conversation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…nnect Exit node run_exit_loop and run_listen_server_loop never called peers.register(), so PeerConnected notifications never fired and the REPL `peers` command always returned empty. Thread the Registry through the exit mode call stack and bracket connections with register/unregister, matching the entry node pattern. Change NodeApi::connect to accept &str instead of SocketAddr so the IPC dispatcher no longer rejects bare hostnames. Implementations handle address parsing and DNS resolution, reusing the existing resolve_endpoint infrastructure. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ions - Extract ExitContext struct grouping metrics + peers into a single Arc, reducing clone dance in connect-loop closures from 2-3 clones to 1. - Fix peers: None bug in ServerOptions for listener and relay paths — the Handler was getting a fresh empty Registry instead of the shared one, so IPC peers command always returned empty. - Rename internal functions: run_connect_mode → run_exit_connector, run_listen_mode → run_exit_listener, run_listen_server_loop → run_accept_loop. - Fix NodeApi doc comments: remove banned "upstream"/"downstream" terminology, "exit nodes" → "exit mode". Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
release-please changed the tag format from cli-v* to wallhack-cli-v* when the workspace plugin was configured. The startsWith filter in build-release.yml was still checking for the old prefix, silently skipping all builds and leaving releases without attached binaries. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
4 tasks
maxholman
added a commit
that referenced
this pull request
May 6, 2026
Sweep of website/ deps to latest within ranges, plus a vite downgrade from 8 -> 7 to match astro's transitive vite (7.3.2) and avoid a rolldown regression with @tailwindcss/vite 4.2.4. Closes alerts #28 #29 #30 #31 #33 #34 #35 #36 #37 #38 #39 #40 #44 #48 covering vite, picomatch, postcss, yaml, astro, smol-toml. - vite ^8.0.1 -> ^7.3.2 (drops the now-redundant vite 8 lineage; astro pulls 7.3.2 transitively, which is the patched version) - astro 6.0.6 -> 6.2.2 (#44) - @tailwindcss/vite 4.2.2 -> 4.2.4 - smol-toml: lockfile bump to 1.6.1 (#28) - postcss: lockfile bump to 8.5.14 (#48) - picomatch: lockfile bumps to 2.3.2 + 4.0.4 (#29 #30 #39 #40) - yaml is now omitted entirely (it was an optional vite peer) Verified: pnpm build succeeds; no @tailwindcss/vite peer-dep warnings.
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.
Fix exit node REPL blindness and hostname resolution
Scope
Exit node peer lifecycle (registration/deregistration in shared
Registry),IPC address parsing, and the
NodeApitrait boundary between IPC and daemon.Crates:
crates/daemon/src/mode/exit.rs,crates/core/src/ipc.rs,crates/core/src/control/handler.rs, and theNodeApitrait.Out of scope
Why
The REPL is non-functional on exit nodes — three related bugs:
Peers invisible (TODO "Random" bugs 3+4):
run_exit_loopnever callspeers.register(), soPeerConnectednotifications never fire andpeersalways returns empty. The entry node does this correctly — the exit connect
path was never wired up.
Hostname rejected (TODO "Random" bug 5): The IPC
connectcommand doesreq.addr.parse::<SocketAddr>()which rejects bare hostnames. The CLI--connectpath goes throughAddressSpec+ DNS resolution, but the REPLbypasses both. Users cannot
connect attackerfrom the REPL.Notes
Registryneeds to be threaded through torun_exit_loop— currentlyexit::run()takesmetrics: &Arc<Metrics>but nopeers. Follow theentry node pattern in
entry.rswhereconn_peers.register()/conn_peers.unregister()bracket the connection lifecycle.api.connect(). Options: (a) resolve in the dispatcher and keepNodeApi::connect(SocketAddr), (b) change the trait to acceptAddressSpecor
Stringand resolve inside the implementation. Option (a) is lessinvasive. Either way, default port injection via
apply_default_port(orequivalent) is needed so bare hostnames work.
Handlercurrently returnsNotSupportedforconnect()—this also needs to become functional if we want REPL
connectto work onexit nodes.