Web Terminal
xterm.js — PTY WebSocket relay dengan session keepalive.
Arsitektur PTY Relay
Browser (xterm.js)
│ WebSocket /ws/shell/{serverID}
▼
Panel (TerminalHub)
│ WebSocket /ws/agent/terminal
▼
Agent PTY (pty_linux.go)
│ Unix PTY
▼
/bin/bash
Browser ↔ Panel ↔ Agent PTY. Browser tidak connect langsung ke agent. Panel sebagai relay hub — pisahkan network agent (internal/private) dari browser (internet).
Agent side: pty.Start() spawn bash dengan pseudoterminal. Output dibaca via goroutine,
di-encode base64, dikirim ke panel via WebSocket.
Panel side: TerminalHub map sessionID ke browser WS. Relay stdin dari browser ke agent PTY,
relay stdout dari agent PTY ke browser.
PTY Session Keepalive (v4.9.4)
Sebelumnya: browser WS drop (CF Tunnel idle timeout, network blip) →
defer CloseSession() langsung kill PTY → running commands mati.
Sekarang: Saat browser disconnect, sesi masuk state orphaned.
PTY tetap hidup di agent selama 5 menit. Saat browser reconnect,
kirim session_id lama → panel reclaim PTY yang sama.
Bonus: Ring buffer 64KB per session — browser reconnect bisa lihat output yang terjadi selama disconnect.
WebSocket Protocol
| Direction | Type | Fields | Keterangan |
|-----------|------|--------|-----------|
| browser→panel | open | rows, cols, shell, session_id? | Buka / reclaim sesi |
| panel→browser | opened | session_id, reclaimed: bool | Konfirmasi sesi |
| browser→panel→agent | stdin | data (base64) | Input keyboard user |
| agent→panel→browser | stdout | data (base64) | Output terminal PTY |
| browser→panel→agent | resize | rows, cols | Resize terminal window |
| browser/agent→panel | close | — | Tutup sesi eksplisit |
| panel→browser | error | message | Error sesi |
Fitur Terminal UI
- Shell selector: bash / sh / zsh (dropdown di toolbar)
- Auto-reconnect: Backoff 3s → 6s → 12s → ... → 30s (max)
- Clipboard: Seleksi teks → auto copy. Right-click → paste
- Saved Commands: Quick commands global, tombol Paste / Run
- CF Tunnel keepalive: Panel kirim ping WS setiap 60s untuk cegah idle timeout (~5 menit)