- Added proper PTY slave terminal configuration for signal interpretation
- Enabled ISIG flag so Ctrl+C generates SIGINT instead of being treated as text
- Configured ICANON and ECHO flags for proper terminal behavior
- Applied configuration in both child process code paths (manual dup2 and login_tty)
- Implemented hybrid proxy fallback system for cross-server session input
- Rust server now proxies input to Node.js server when pipe write fails
- Added reqwest HTTP client for seamless communication between servers
- Reduced pipe timeout to 1 second for faster fallback detection
- Added key translation for special keys when proxying to Node.js
This fixes both:
1. Ctrl+C not interrupting processes in Rust-created sessions
2. "Device not configured" errors when accessing Node.js sessions from Rust server
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fixed sessionId calculation bug in asciinema stream-out events
- Removed ~400 lines of duplicate PTY code from term_socket.rs
- Created reusable spawn_with_pty_fallback function in tty_spawn.rs
- Fixed working directory isolation in session spawning threads
- Ensured static file serving works correctly after session creation
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Change exit event from nested JSON to direct array format: ["exit", exit_code, session_id]
- Add StreamEvent::Exit variant to handle exit events properly in parsing
- Add write_raw_json method to StreamWriter for direct JSON output
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add comprehensive integration test suite for Node.js server
- API endpoint tests for session lifecycle, I/O operations, file system
- WebSocket connection tests for hot reload functionality
- Server lifecycle tests for initialization and shutdown
- Basic binary availability tests for tty-fwd
- Fix Rust code for nix 0.30 API changes
- Update dup2 calls to use OwnedFd instead of raw file descriptors
- Fix read calls to pass file descriptors directly instead of raw fd
- Remove deprecated as_raw_fd() calls where not needed
- Reorganize test structure
- Split tests into unit/ and integration/ directories
- Add separate Vitest configuration for integration tests
- Create test utilities and setup files for both test types
- Add custom test matchers for session validation
- Update test coverage configuration
- Configure separate coverage for unit and integration tests
- Add proper test timeouts for long-running integration tests
- Use fork pool for integration tests to avoid port conflicts
- Update term_socket.rs and tty_spawn.rs to use new nix 0.30 API
- dup2() now requires OwnedFd references instead of raw file descriptors
- Add proper OwnedFd handling with std::mem::forget to prevent premature closing
- Ensure compatibility with updated nix crate API changes
- Migrate GitHub Actions to Blacksmith runners for faster CI
- Update ubuntu-latest to blacksmith-4vcpu-ubuntu-2404
- Update actions/setup-node@v4 to useblacksmith/setup-node@v5
- Update Swatinem/rust-cache@v2 to useblacksmith/rust-cache@v3
- Fix all linting warnings across all platforms
- TypeScript: Fix any type warnings with proper type annotations
- Rust: All clippy warnings resolved
- Swift: Fix SwiftLint violations and format code
- Update all dependencies to latest versions
- npm: Major updates including Express 5 compatibility fixes
- Rust: Update 7 crates to latest compatible versions
- Swift: Dependencies already up-to-date
- Add comprehensive test suite using Vitest
- API endpoint tests for session CRUD operations
- WebSocket connection and streaming tests
- Session management lifecycle tests
- Frontend component tests (terminal, session-list)
- Critical functionality tests covering core features
- Test infrastructure with proper mocking and utilities
- All tests passing, ready for production use
Removed eprintln\! statements that were cluttering stdout during PTY session creation.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Update is_pid_alive to detect zombie processes (status 'Z') as dead
- Add spawn_type field to distinguish PTY vs socket sessions
- Add reap_zombies function to clean up zombie children
- Only attempt zombie reaping for PTY sessions to avoid interfering with osascript processes
- Fix session cleanup to work properly with zombie processes
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Use proper type casting for ioctl on both Linux and non-Linux platforms
- Separate platform-specific code blocks for clarity
- Fix potential clippy warnings on Linux CI
- DELETE endpoint now waits up to 3 seconds for process to actually die
- Polls every 100ms to confirm process termination after SIGKILL
- Returns different messages based on whether process confirmed dead
- Makes is_pid_alive function public for reuse
- Provides more reliable session killing with proper status updates
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Update session.json status to "exited" when killing sessions via DELETE endpoint
- Set exit_code to 9 (SIGKILL) when process is killed
- Handle already-dead sessions by ensuring they're marked as "exited"
- Add PID tracking to PTY sessions so they can be properly killed
- Add reconnection detection in session-view: mark sessions as exited after 3 failed reconnects within 5 seconds
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add 5-second timeout when waiting for PTY stream-out file creation
- This prevents indefinite hanging when PTY background thread fails
- Send proper exit events to streaming clients when PTY process terminates
- Exit event format matches web frontend expectations: ["exit", exitCode, sessionId]
- Ensures web UI can properly handle session termination for PTY fallback
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fixed redundant continue statements in loops
- Replaced manual string prefix stripping with strip_prefix method
- Fixed wildcard pattern that covered other patterns
- Removed redundant clone and unnecessary return value
- Used format string interpolation for cleaner code
- Removed unused imports and variables
- All Clippy checks now pass with -D warnings
Change API response message from 'Terminal spawned successfully' to
'Session created successfully' for PTY fallback sessions. This allows
the web frontend to properly navigate to session-view instead of
treating it as a terminal window spawn.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Applied automatic Clippy fixes for better code quality
- Removed redundant continue statements at the end of match arms
- Fixed unused variable warnings by prefixing with underscore
- Applied cargo fmt to ensure consistent formatting
- Add setup_shutdown_handler() to catch SIGTERM and SIGINT signals
- Create update_all_sessions_to_exited() to mark running sessions as exited
- Update handle_pty_session() to mark sessions as exited when PTY closes naturally
- Integrate signal handling into main server startup for both scenarios
- Ensures session.json files accurately reflect process state after server shutdown
- Fixes issue where sessions remain "running" after server restart or normal exit
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fixed Swift formatting issues in AppConstants.swift and VibeTunnelApp.swift
- Fixed Rust formatting in tty-fwd source files
- CI should now pass formatting checks
Replace blind UTF-8 conversion with escape-sequence-aware processing:
- Add proper ANSI escape sequence parser (CSI, OSC, simple sequences)
- Buffer at escape sequence boundaries instead of arbitrary UTF-8 boundaries
- Preserve complete escape sequences as atomic units during conversion
- Only apply UTF-8 validation to text content between escape sequences
- Eliminates rendering artifacts in complex terminal applications like Claude
This maintains full JSON/asciinema compatibility while fixing the
fundamental issue where escape sequences were being corrupted by
UTF-8 validation during cast file generation.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>