diff --git a/.agents/skills/multi-agent-mux-ui/packages/mam_core/.dart_tool/test/incremental_kernel.Ly9AZGFydD0zLjA= b/.agents/skills/multi-agent-mux-ui/packages/mam_core/.dart_tool/test/incremental_kernel.Ly9AZGFydD0zLjA= index b60dfb0..971d7b4 100644 Binary files a/.agents/skills/multi-agent-mux-ui/packages/mam_core/.dart_tool/test/incremental_kernel.Ly9AZGFydD0zLjA= and b/.agents/skills/multi-agent-mux-ui/packages/mam_core/.dart_tool/test/incremental_kernel.Ly9AZGFydD0zLjA= differ diff --git a/.agents/skills/multi-agent-mux-ui/packages/mam_pty/.dart_tool/test/incremental_kernel.Ly9AZGFydD0zLjA= b/.agents/skills/multi-agent-mux-ui/packages/mam_pty/.dart_tool/test/incremental_kernel.Ly9AZGFydD0zLjA= index 73440f4..e6f48d0 100644 Binary files a/.agents/skills/multi-agent-mux-ui/packages/mam_pty/.dart_tool/test/incremental_kernel.Ly9AZGFydD0zLjA= and b/.agents/skills/multi-agent-mux-ui/packages/mam_pty/.dart_tool/test/incremental_kernel.Ly9AZGFydD0zLjA= differ diff --git a/.agents/skills/multi-agent-mux-ui/packages/mam_pty/lib/src/pty_session.dart b/.agents/skills/multi-agent-mux-ui/packages/mam_pty/lib/src/pty_session.dart index dbdcd05..a5fbdfc 100644 --- a/.agents/skills/multi-agent-mux-ui/packages/mam_pty/lib/src/pty_session.dart +++ b/.agents/skills/multi-agent-mux-ui/packages/mam_pty/lib/src/pty_session.dart @@ -50,6 +50,9 @@ typedef _waitpid_dart = int Function(int pid, ffi.Pointer status, int typedef _chdir_c = ffi.Int32 Function(ffi.Pointer path); typedef _chdir_dart = int Function(ffi.Pointer path); +typedef _fcntl_c = ffi.Int32 Function(ffi.Int32 fd, ffi.Int32 cmd, ffi.Int32 arg); +typedef _fcntl_dart = int Function(int fd, int cmd, int arg); + base class Winsize extends ffi.Struct { @ffi.Uint16() external int ws_row; @@ -97,6 +100,7 @@ class PtySession { final execvp = libc.lookupFunction<_execvp_c, _execvp_dart>('execvp'); final ioctl = libc.lookupFunction<_ioctl_c, _ioctl_dart>('ioctl'); final chdir = libc.lookupFunction<_chdir_c, _chdir_dart>('chdir'); + final fcntl = libc.lookupFunction<_fcntl_c, _fcntl_dart>('fcntl'); // 1. Prepare master PTY final masterFd = posixOpenpt(2 | 0x00000400); @@ -121,6 +125,13 @@ class PtySession { } final slaveName = slavePtr.cast().toDartString(); + // Set master fd to non-blocking mode to prevent freezing the Dart event loop (§6.7) + // F_GETFL = 3, F_SETFL = 4, O_NONBLOCK = 2048 (0x800) + final flags = fcntl(masterFd, 3, 0); + if (flags >= 0) { + fcntl(masterFd, 4, flags | 2048); + } + // 2. Resolve environment, isolating nested TMUX contexts (§6.7) final env = Map.from(environment ?? Platform.environment); env.remove('TMUX');