Home/Docs/Web Terminal

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)