fix: enable multiline paste in web terminal
Multiline pastes into the web terminal (especially into pi) were split into one prompt per line because bracketed-paste markers were not reaching the foreground app intact. - Put the host PTY into raw mode (tty.setraw) after openpty() so it acts as a pass-through pipe. The default canonical line discipline was line-buffering input, splitting multiline pastes at newlines, and mangling bracketed-paste markers before docker exec / pi could see them. The in-container PTY (docker exec -t) provides real discipline. - Route the mobile Paste button through xterm.js (term.paste) instead of sending raw clipboard text to the WebSocket, so content is wrapped in bracketed-paste markers when the app has enabled BPM. - Treat a text frame as a control message only when it is a JSON object with a known type (resize/ack/reset); otherwise forward as raw input so JSON-shaped pastes are no longer silently dropped. Quality gates: ruff, mypy (changed files), pytest unit (227 passed), tsc, eslint
This commit is contained in:
@@ -12,6 +12,7 @@ import signal
|
||||
import struct
|
||||
import fcntl
|
||||
import time
|
||||
import tty
|
||||
import uuid
|
||||
from collections import deque
|
||||
from typing import Any
|
||||
@@ -123,6 +124,15 @@ class TerminalSession:
|
||||
# Create a pseudo-terminal on the host
|
||||
self._master_fd, slave_fd = pty.openpty()
|
||||
|
||||
# Put the host PTY into raw mode so it behaves as a pass-through
|
||||
# pipe. openpty() leaves the slave in canonical mode by default,
|
||||
# which line-buffers input, splits multiline pastes at newlines,
|
||||
# and mangles bracketed-paste markers before docker exec / the
|
||||
# foreground app (e.g. pi) ever see them. Real terminal discipline
|
||||
# (echo, canonical editing for readline) is provided by the
|
||||
# in-container PTY that `docker exec -t` allocates.
|
||||
tty.setraw(slave_fd)
|
||||
|
||||
# Set the terminal size initially
|
||||
self._set_terminal_size(self._cols, self._rows)
|
||||
logger.debug(
|
||||
|
||||
Reference in New Issue
Block a user