feat: shared PTY terminal (M12 Tier 3) + readable form controls
release / release (push) Successful in 14s
release / release (push) Successful in 14s
- feat(share): host-consented interactive terminal over the relay. The host shares a real PTY shell (core/pty_session.py); the guest renders it with pyte and sends keystrokes (gui/terminal_widget.py) — vim/top/tab-completion/Ctrl-C work. Runs as the host's user (never root). The host reads along live and can type too, e.g. a sudo password, which stays local and is never sent to the guest. Off by default. Guest also pulls inventory on join (req_full). - fix(gui): style all form controls (QLineEdit/QPlainTextEdit/spin boxes/combo/ terminals) dark-on-light-text — Fusion defaulted them to unreadable light-on-light. - replaces the command/response shell with the full PTY; adds pyte to the gui extra. Verified end-to-end against the deployed relay (guest keystroke ran on host PTY). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,27 @@
|
||||
"""Tests for the host PTY session (M12 Tier 3)."""
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
from rigdoctor.core.pty_session import PtySession
|
||||
|
||||
|
||||
class PtySessionTests(unittest.TestCase):
|
||||
def test_runs_command_and_reads_output(self):
|
||||
pty = PtySession(rows=24, cols=80)
|
||||
try:
|
||||
time.sleep(0.4)
|
||||
pty.read() # drain the shell prompt
|
||||
pty.write(b"echo PTY_MARKER_42\n")
|
||||
deadline = time.time() + 3
|
||||
buf = ""
|
||||
while time.time() < deadline and "PTY_MARKER_42" not in buf:
|
||||
time.sleep(0.1)
|
||||
buf += pty.read().decode(errors="replace")
|
||||
self.assertIn("PTY_MARKER_42", buf)
|
||||
finally:
|
||||
pty.close()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user