feat: native SSH delegation via tea.ExecProcess + Gruvbox palette

Phase A — Tamagosh-inspired redesign:
- Replace goroutine-based SSH (crypto/ssh) with tea.ExecProcess + native ssh binary
- Zero-lag SSH: native binary pegang TTY langsung, ga ada Go buffering
- Password auth via sshpass -e (SSHPASS env)
- Key auth via ssh -i <tmpfile> + SSH_ASKPASS for passphrase
- ControlMaster sockets for fast reconnect
- Add askpass subcommand for SSH_ASKPASS support
- Gruvbox Material Dark Hard palette for comfortable viewing
- Clean up old session messages (openSessionMsg, sessionOutputMsg, sessionDoneMsg)
- Remove 354-line session.go, replace with 150-line ssh.go
This commit is contained in:
swanadiva
2026-06-23 15:36:40 +07:00
parent b319f44c3e
commit 7b06793002
8 changed files with 177 additions and 397 deletions
+5 -9
View File
@@ -61,10 +61,11 @@ func (m *Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
m.Quit = true
return m, tea.Quit
case openSessionMsg:
tab := NewSessionTab(msg.host, m.dataDir)
cmd := m.tabs.Add(tab)
return m, cmd
case sshConnectToMsg:
return m, sshConnectCmd(msg.host, m.dataDir)
case sshExitMsg:
return m, nil
case openHostFormMsg:
var tab Tab
@@ -175,11 +176,6 @@ func (m *Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
}
return m, nil
case sessionDoneMsg:
if msg.err != nil {
m.Error = msg.err
}
return m, nil
}
cmd, err := m.tabs.Update(msg)