feat: add SSH remote workspace support#206
Merged
bobleer merged 5 commits intoGCWing:mainfrom Mar 20, 2026
Merged
Conversation
- SSH connection management with saved connections, key/agent/password auth - Remote file system access via SFTP (read, write, edit, delete, rename) - Remote terminal sessions over SSH PTY - Multi-workspace registry: path-keyed HashMap replaces single global state, allowing multiple concurrent remote workspaces without path conflicts - Per-workspace connection status indicator (green/yellow/red dot) in sidebar - Auto-reconnect on startup: retries up to 5 times with 10s intervals, keeps workspace in sidebar with error state if reconnection fails - Session list re-initialized after SSH reconnect to fix timing race where sessions loaded before workspace was registered in state manager - Snapshot/rollback skipped for remote workspaces (no local .bitfun dir); rollback commands return empty success instead of "directory not found" error - Agentic tools (file read/write/edit, bash, glob, grep) routed through SSH when workspace path matches a registered remote workspace Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
russh-keys uses the openssl crate which requires a system OpenSSL installation. On Windows runners there is none, so the build fails. Adding openssl with the vendored feature compiles OpenSSL from source (same approach already used by git2 via vendored-openssl). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ows build - Make HandlerError carry actual error message (was unit struct, discarding all info) - Implement disconnected() callback to capture real SSH disconnect reason - Add DH_G14_SHA1/DH_G1_SHA1 KEX and SSH_RSA host key for legacy server compatibility - Improve error message when server closes connection before sending SSH banner - Fix win32job missing from bitfun-core Windows target dependencies - Fix type annotation needed for MutexGuard in process_manager.rs - Fix RemoteFileBrowser cancel button using missing i18n key (common.cancel → actions.cancel) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…howing error Password-auth workspaces cannot auto-reconnect (BitFun does not persist passwords). Any workspace that fails reconnection (password, key, or agent) is now silently removed from the sidebar instead of being shown with a permanent red error state. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…on startup Before initializing FlowChatManager, check that a remote workspace's SSH connection is actually live. If not (e.g. password-auth workspace that cannot auto-reconnect), log a warning and skip initialization instead of showing an error notification to the user. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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
RemoteWorkspaceStatewith a path-keyedHashMap, allowing multiple concurrent remote workspaces without path conflictsflowChatStore.initializeFromDisk()is re-invoked after SSH reconnect completes, fixing a race where the session list loaded before the workspace was registered in the state managerTest plan
🤖 Generated with Claude Code