Commit graph

463 commits

Author SHA1 Message Date
Peter Steinberger
b650ff4de5 design 2025-06-18 19:29:03 +02:00
Peter Steinberger
6a8f472832 feat: adopt Blacksmith CI runners and comprehensive updates
- 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
2025-06-18 19:10:03 +02:00
Peter Steinberger
ea517dbf49 ci: update Swift workflow to use Xcode 16.4
- Update DEVELOPER_DIR environment variable to Xcode 16.4
- Update xcode-select commands to use Xcode 16.4
- Keep using macos-15 runner which should have Xcode 16.4 available
2025-06-18 19:02:12 +02:00
Peter Steinberger
fbfc4c57dd Remove periodic permission status logging
- Removed info logs for Accessibility permission status checks
- Removed info logs for AppleScript permission status checks
- These were being logged repeatedly and cluttering the console
2025-06-18 16:56:01 +02:00
Peter Steinberger
b7db081148 Add NSImage resize extension for terminal icons in pickers
- Created NSImage+Resize extension with high-quality resizing
- Fixed terminal icon display in picker menus
- Updated SelectTerminalPageView and AdvancedSettingsView to use resized icons
- Icons now properly display at 16x16 in menu pickers
2025-06-18 16:54:07 +02:00
Peter Steinberger
5804790ae1 recover lost commits 2025-06-18 16:49:39 +02:00
Peter Steinberger
915d3e3eb1 Fix remaining formatting issue in term_socket.rs 2025-06-18 15:26:10 +02:00
Peter Steinberger
4a0121eabe Fix Rust formatting and clippy warnings
- Fix cargo fmt formatting issues
- Fix unused variable warnings by prefixing with underscore
- Fix if_not_else clippy warning
- Fix uninlined_format_args warnings
- Fix redundant closure warning
2025-06-18 15:24:17 +02:00
Mario Zechner
e3e92c646d Remove debug logging from PTY child process
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>
2025-06-18 14:43:38 +02:00
Mario Zechner
3fdad988ff Fix zombie process detection and add PTY-specific cleanup
- 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>
2025-06-18 14:29:48 +02:00
Peter Steinberger
ef19211451 Fix clippy uninlined_format_args warnings
- Update format strings to use inline variable syntax
- Fix Linux CI clippy warnings for newer clippy version
2025-06-18 14:27:24 +02:00
Peter Steinberger
4cbbdf29fc Fix TIOCSCTTY usage for cross-platform compatibility
- 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
2025-06-18 14:25:18 +02:00
Peter Steinberger
5f067c7a80 Fix clippy warnings and format code
- Fix redundant closure warning in api_server.rs
- Add backticks to login_tty in documentation comments
- All clippy warnings resolved
2025-06-18 14:16:43 +02:00
Peter Steinberger
f0658bccd0 improve bits for linux 2025-06-18 14:14:57 +02:00
Peter Steinberger
b90986c354 remove macos stuff 2025-06-18 14:14:03 +02:00
Mario Zechner
8b3c913e17 Add client-side session death detection via reconnection tracking
- Track SSE reconnection attempts in session-view
- Mark sessions as exited after 3 failed reconnects within 5 seconds
- Disconnect stream and load final snapshot when giving up
- Provides fallback when server exit events aren't reliably sent
- Improves UX by stopping endless reconnection attempts

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-18 14:03:11 +02:00
Mario Zechner
2ceff6955c Make session kill endpoint wait for process death
- 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>
2025-06-18 14:01:43 +02:00
Peter Steinberger
db4b60e5f7 Fix CI: Apply cargo fmt to latest changes 2025-06-18 13:54:22 +02:00
Mario Zechner
779f8f3360 Fix session kill and add PTY PID tracking
- 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>
2025-06-18 13:52:40 +02:00
Mario Zechner
71a5937ea1 Fix session card kill button animation cleanup
- Move stopKillingAnimation() to finally block to ensure it always runs
- Prevents animation from getting stuck when kill operation fails
- Ensures proper cleanup regardless of success or error conditions

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-18 13:32:16 +02:00
Mario Zechner
c8931d1e40 Fix PTY streaming race condition and add exit events
- 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>
2025-06-18 13:31:09 +02:00
Peter Steinberger
ec0bbcfdf4 Fix CI: Resolve all Clippy warnings and improve code quality
- 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
2025-06-18 13:13:12 +02:00
Mario Zechner
68dd22e183 Fix session-view navigation for PTY fallback sessions
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>
2025-06-18 13:08:37 +02:00
Peter Steinberger
9b3839e361 Fix CI: Apply final Rust formatting 2025-06-18 13:07:37 +02:00
Peter Steinberger
6f20d395f5 Fix CI: Apply Clippy fixes and remove redundant continue statements
- 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
2025-06-18 13:06:06 +02:00
Mario Zechner
dd31dfb9f4 Fix compiler warnings in term_socket.rs
- Remove unused FromRawFd import
- Prefix unused parameters with underscore

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-18 13:05:46 +02:00
Mario Zechner
45f627fddf Add signal handling to update session statuses on server shutdown
- 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>
2025-06-18 13:04:52 +02:00
Peter Steinberger
2f4ca27b03 Fix CI: Format Swift and Rust code
- Fixed Swift formatting issues in AppConstants.swift and VibeTunnelApp.swift
- Fixed Rust formatting in tty-fwd source files
- CI should now pass formatting checks
2025-06-18 13:02:31 +02:00
Peter Steinberger
25d5bc5232 Fix CI: Convert reusable workflows to use workflow_call trigger
- Changed swift.yml, rust.yml, and node.yml from direct triggers to workflow_call
- This fixes the workflow configuration error causing immediate CI failures
- Reusable workflows must use workflow_call when invoked by other workflows
2025-06-18 13:00:17 +02:00
Peter Steinberger
7947278fb2 Fix CI: Correct spawn_terminal to spawnTerminal for Swift naming conventions
- Fixed SwiftLint error by changing snake_case variable name to camelCase
- Added small corner radius to Create New Session modal
- Increased padding between KILL and CREATE buttons in header
2025-06-18 12:57:53 +02:00
Peter Steinberger
daf455ec9a show welcome dialog on update + lint 2025-06-18 12:57:53 +02:00
Mario Zechner
d9d134ff2b Replace XTerm.js with headless terminal implementation
- Remove XTerm.js dependencies (@xterm/xterm, @xterm/addon-fit, @xterm/addon-web-links, asciinema-player)
- Switch terminal component to use @xterm/headless for better performance and compatibility
- Simplify build process by removing unused renderer and mobile-terminal components
- Update package.json scripts to use asset bundling approach
- Fix TypeScript imports and remove deprecated addons
- Streamline terminal implementation for improved reliability

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-18 12:48:24 +02:00
Mario Zechner
1cef390ed6 Add PTY fallback to term_socket.rs with race condition fix
- Implements spawn_via_pty() function with complete bidirectional I/O
- Creates PTY master/slave, forks child process, handles stdin/stdout
- Fixes race condition by creating session.json synchronously before returning
- Background thread handles I/O operations while session metadata is immediate
- Enables cross-platform terminal functionality without requiring VibeTunnel.app

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-18 12:46:25 +02:00
Mario Zechner
1e24c19335 Add PTY fallback to tty-fwd with race condition fix
Adds complete PTY fallback functionality when VibeTunnel.app socket is unavailable:
- Implements spawn_via_pty() with full bidirectional I/O
- Creates PTY master/slave, forks child process, and handles stdin/stdout
- Fixes race condition by creating session.json synchronously before API response
- Maintains compatibility with existing session format and API structure
- Enables cross-platform terminal functionality without requiring macOS app

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-18 12:46:25 +02:00
Peter Steinberger
218249e594 delete garbage 2025-06-18 10:52:32 +02:00
Peter Steinberger
6df38dc171 use new appcast stats store 2025-06-18 10:52:18 +02:00
Peter Steinberger
9155f46206 fix button alignment 2025-06-18 10:45:04 +02:00
Mario Zechner
a2d15471d8 Reorder mobile terminal buttons and add symbols
- Change button order to: ESC, ⇥, ABC123, CTRL, ⏎
- Use larger tab symbol (⇥) and enter symbol (⏎)
- Keep CTRL as text, ABC123 in middle position
- Improve visual consistency with symbol sizing

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-18 10:44:13 +02:00
Peter Steinberger
c16ccacf30 Shuffle settings around 2025-06-18 10:40:42 +02:00
Mario Zechner
31f1d625b1 Reorganize header button layout for mobile with left and right alignment
- Group related buttons on left: SHOW/HIDE EXITED, CLEAN EXITED, KILL
- Position CREATE button on right side for mobile layout
- Add exited session count to button text for better UX
- Conditionally show SHOW/HIDE EXITED only when exited sessions exist
- Wire up clean exited functionality from header to session list
- Maintain consistent button styling with black backgrounds and colored borders

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-18 10:37:33 +02:00
Mario Zechner
76ea65839a Replace hide exited checkbox with button and standardize button sizes
- Convert hide exited checkbox to button toggle matching theme style
- Use "SHOW ALL" / "HIDE EXITED" text based on state
- Blue border when active, gray when inactive
- Standardize all header buttons to small size (px-2 py-1 text-xs)
- Consistent button styling across mobile and desktop layouts

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-18 10:23:55 +02:00
Mario Zechner
7c92eb5bdb Implement black theme, mobile improvements, and fit-to-width toggle
- Apply consistent black theme across all components with colored borders
- Add animated VibeTunnel logo with rainbow scrolling gradient
- Implement comprehensive mobile input controls with Ctrl+Alpha overlay
- Add fit-to-width toggle button in session view header with scroll preservation
- Enhance mobile experience with proper viewport handling and keyboard positioning
- Update button styling to use black backgrounds with colored borders throughout
- Resize scroll-to-bottom button for better mobile accessibility

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-18 10:16:04 +02:00
Peter Steinberger
75203f79ab Change AppleScript strategy to use clipboard copy/paste
Instead of typing commands character by character, which can be slow
and error-prone with special characters, we now:
1. Copy the command to clipboard using NSPasteboard
2. Use Cmd+V to paste it in the terminal
3. Press Enter to execute

This approach is more reliable, faster, and handles special characters
better. Terminal.app continues to use 'do script' since it supports
it natively.
2025-06-18 09:58:34 +02:00
Peter Steinberger
db1583b88b fix escaping 2025-06-18 09:58:34 +02:00
Mario Zechner
95cec4c801 Fix touch momentum scrolling jank by eliminating RAF conflicts
Replace requestRenderBuffer() with direct renderBuffer() call during
momentum scrolling to avoid competing requestAnimationFrame systems.

Before: Momentum RAF + render queue RAF = scheduling conflicts & jank
After: Single momentum RAF with synchronous rendering = smooth scrolling

This provides buttery smooth momentum scrolling on mobile while
maintaining < 2ms render times and proper RAF batching for other operations.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-18 08:53:01 +02:00
Mario Zechner
8089612142 Add terminal debug overlay and scroll-to-bottom indicator
Features added:
- Debug overlay showing render performance metrics (renders, avg time, last time)
- Activates only when ?debug or &debug is in URL query parameters
- Real-time updates during scrolling and terminal operations
- Scroll-to-bottom indicator appears when user scrolls up from bottom
- Instantly scrolls to bottom and re-enables follow cursor when clicked
- Restore smooth fractional pixel scrolling for better UX

Performance improvements:
- Proper render count tracking at start of renderBuffer()
- High-precision timing using performance.now()
- Force component re-render in debug mode for live metrics

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-18 08:48:50 +02:00
Mario Zechner
18bb33c2ce Fix escape sequence corruption in asciinema cast output
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>
2025-06-18 08:23:09 +02:00
Mario Zechner
e47adc9808 Fix terminal rendering and performance issues
- Add HTML escaping to prevent HTML injection in terminal output
- Implement smart follow cursor with programmatic scroll protection
- Add output batching for SSE streams (~60fps) to improve performance
- Use integer pixel positions for crisp text rendering
- Preserve .vibetunnel folder contents on server restart
- Restrict mobile keyboard to actual mobile devices only

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-18 08:06:41 +02:00
Mario Zechner
e606f68f45 Optimize session snapshots by scanning for last clear command
- Modified snapshot endpoint to find the last screen clear command
- Only includes content after the last clear for much smaller snapshots
- Preserves the last resize event before clear to maintain terminal dimensions
- Detects common clear sequences: \x1b[2J, \x1b[3J, \x1b[H\x1b[2J, \x1bc
- Logs reduction percentage showing data savings
- Falls back to full content if no clear command found
- Dramatically reduces snapshot size for long-running sessions

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-18 06:29:50 +02:00
Mario Zechner
b6d45e6c75 Remove unnecessary snapshot refresh from session cards
- Removed 10-second refresh interval that was fetching new snapshots continuously
- Initial snapshot load is sufficient for session card preview
- Reduces server load and unnecessary network requests
- Session cards now load once and display static snapshot content
- Interactive session view still provides real-time updates via streaming

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-18 06:26:59 +02:00