Expose Tailcat node identity and harden Android channel buffering - #44
Merged
Sniperlyf3 merged 1 commit intoSep 16, 2026
Merged
Conversation
Sniperlyf3
force-pushed
the
feature/tailcat-node-key-and-android-backpressure
branch
from
September 16, 2026 07:18
da4b750 to
c86f7e0
Compare
Sniperlyf3
deleted the
feature/tailcat-node-key-and-android-backpressure
branch
September 16, 2026 07:32
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.
Summary
Expose the Tailcat connection's public node identity through the agent protocol and fix a false-positive channel backpressure failure observed in the packaged Android E2E probe.
Closes #43.
Tailcat public node identity
connectedcontrol frames now include optionalnode_key: "nodekey:<hex>"session.tcKey.Public().String()only; private node-key material is never serializedMeowshellAgentConnection.TailcatNodeKeyTailcatSshSession.TailcatNodeKeyforwards the same public identityconnectedframes without itnodekey:value after a real Tailcat connection, exercising Go agent -> wire protocol -> .NET API on-deviceThis unlocks the first identity prerequisite for MeowSSH's future node-bound, self-hosted DERP admission flow. It deliberately does not make client telemetry authoritative for relay metering.
Android channel backpressure fix
Run
34995781341, job104474119042reached a real Tailcat SSH session but failed while actively reading output with:channel data is not being consumed fast enoughThe per-channel
AgentChannelDataPumpis correctly bounded to 32 queued frames so one abandoned channel cannot block the shared multiplexed connection. The downstream shell/downloadPipes, however, used System.IO.Pipelines' much smaller default pause threshold. A legitimate burst of many small SSH frames could therefore block the pump around the default pipe threshold, fill the remaining 32 frame slots, and falsely classify an active consumer as stalled.This PR keeps the 32-frame isolation queue unchanged and gives shell/download output pipes byte-oriented bounded burst headroom:
A focused regression sends a 128 KiB tiny-frame burst (above the old default pipe pause threshold) and proves it drains without triggering the backpressure callback. Existing tests for a genuinely blocked channel remain in place, so the cleanup/memory-safety behavior is preserved.
Validation
gofmtapplied to touched Go filesgo test ./cmd/meowshell: greendotnet-android-e2e, which reproduces the originally failing packaged Android pathSecurity boundaries