Commit graph

752 commits

Author SHA1 Message Date
Tao Xu
e89abc9dc6
Fix SSH key manager modal layout and test compatibility (#325)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-15 02:52:49 +02:00
Peter Steinberger
68e6456aef
docs: Add Linux setup instructions and authentication documentation (#344)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-15 02:47:25 +02:00
Peter Steinberger
34b596a010
Enable keyboard navigation on session grid (#322) 2025-07-12 23:23:28 +02:00
Peter Steinberger
00933690a8
Fix Safari clipboard paste (#336)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-12 23:13:35 +02:00
Peter Steinberger
29f938dcc1
Terminal theme improvements (#332)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-12 22:11:30 +02:00
Peter Steinberger
d019559f2b feat(web): add terminal theme preference 2025-07-12 19:45:27 +02:00
Peter Steinberger
93ba0064bd feat: add compression, security headers, and caching optimizations
Implement several performance and security improvements for Express 5:

Performance:
- Add compression middleware with Brotli support for all responses
- Enable WebSocket compression (perMessageDeflate) for terminal data
- Exclude compression for SSE streams (/api/sessions/:id/stream) to prevent asciicast issues
- Add intelligent caching headers for static assets:
  - Immutable assets (JS, CSS, fonts, images): 1 year cache
  - HTML files: 1 hour cache
  - Enable ETags and Last-Modified headers

Security:
- Add Helmet middleware for security headers
- Disable CSP and COEP to maintain compatibility with terminal features

Additional improvements:
- Remove obsolete @ts-expect-error directives (Express 5 properly types res.flush)
- Balanced compression level (6) for optimal performance

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-12 19:42:54 +02:00
Peter Steinberger
c2d9039e45 chore: update all dependencies to latest versions (except Tailwind)
Update all project dependencies to their latest versions while keeping
Tailwind CSS at v3.4.17 to avoid breaking changes.

Notable updates:
- Express: 4.19.2 → 5.1.0 (major version upgrade)
- Chalk: 4.1.2 → 5.4.1 (major version upgrade to ESM)
- CodeMirror packages: Updated to latest v6 versions
- TypeScript types: Updated to latest versions
- Development tools: Biome, Playwright, Puppeteer, etc.

All code quality checks pass successfully after the updates.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-12 19:30:47 +02:00
Peter Steinberger
cd2378c665 fix: add user ID for no-auth mode and improve TypeScript imports
Extract improvements from PR #318:

1. Set default user ID in no-auth mode for auth middleware
   - Ensures consistent behavior when authentication is disabled
   - Prevents potential issues with undefined user IDs

2. Convert to type-only imports in push notification service
   - Use TypeScript type imports for better tree shaking
   - Remove .js extensions from imports for consistency
   - Minor logging improvement for service worker registration

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-12 19:21:29 +02:00
Peter Steinberger
1052354394 feat: add keyboard navigation to session grid
- Enable arrow key navigation (up/down/left/right) through sessions
- Press Enter to open selected session
- Add visual feedback for keyboard-selected sessions
- Fix global event listener conflict by scoping to component
- Make session-list focusable with proper focus indicators
- Pass selected state to session-card for visual highlighting

Adopts PR #322 with improvements based on review feedback
2025-07-12 12:48:22 +02:00
Peter Steinberger
e3d0d9655b
Add professional light mode with theme toggle (#314) 2025-07-12 01:42:42 +02:00
Peter Steinberger
2dc37db0bb
Extract mobile detection to shared utility and reduce mobile font size (#310) 2025-07-11 10:24:06 +02:00
Peter Steinberger
0c617aed8d
Fix mobile terminal resize loop (#305) 2025-07-11 08:23:47 +02:00
Peter Steinberger
b16035b9f8
Remove activity indicator to prevent title jumping (#309) 2025-07-11 08:22:54 +02:00
Peter Steinberger
83fa3a22b8
Replace Microsoft node-pty with vendored fork to fix crashes (#304) 2025-07-11 07:19:32 +02:00
Peter Steinberger
25c8322b04
Fix mobile header overflow with dropdown menu (#295) 2025-07-10 07:50:34 +02:00
Jeff Hurray
d0e5bdacf2
Consolidate Z Index Logic (#291)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-10 06:34:50 +02:00
Peter Steinberger
76e16e94c6
refactor: extract preventAndStopEvent helper + support alt+nav on mobile (#290) 2025-07-09 21:07:20 +02:00
Jeff Hurray
ca3b1519d5 Revert "fix playwright tests"
This reverts commit d02b410c14678fe7d556ea0e70f21f85ba65f2be.
2025-07-09 16:38:49 +02:00
Jeff Hurray
8cab4e6caa fix playwright tests
This was an unrelated issue on main

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-09 16:38:49 +02:00
Jeff Hurray
14f5315ab0 Fix lint errors in file browser test
- Remove non-null assertion in favor of proper null check
- Add z-index comments for clarity in modal overlays
- Remove unused Z_INDEX imports after switching to comments

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-09 16:38:49 +02:00
Jeff Hurray
913cce61d2 lint fix 2025-07-09 16:38:49 +02:00
Jeff Hurray
274d9aeceb Add debugging and stopPropagation to file browser button
- Add stopPropagation to Browse button click handler in session-create-form
- Add debug logging to track state changes
- Match the pattern used in session-header for consistency
2025-07-09 16:38:49 +02:00
hewigovens
bf32367fee add alt+delete/left/right support 2025-07-09 16:33:04 +02:00
Peter Steinberger
43c98cac4b bump to b9 2025-07-09 09:18:08 +02:00
Peter Steinberger
dc0676b0a0 change server cleanup logic to only kill zombies 2025-07-08 22:05:01 +02:00
Peter Steinberger
6b93fdbf41
Fix Homebrew library dependencies in release builds (#269) 2025-07-08 09:55:52 +01:00
Jeff Hurray
32caa7ac4f Make file picker a distinct route 2025-07-08 08:15:20 +01:00
Jeff Hurray
10987e6290 Remove modal wrapper bc it breaks things 2025-07-08 08:09:12 +01:00
Peter Steinberger
b7b5aa2004
feat: add magic wand button to web frontend for AI sessions (#262)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-08 02:13:34 +01:00
Peter Steinberger
e65843064c Remove unnecessary Fish shell expansion comment 2025-07-08 00:47:11 +01:00
Raghav Sethi
966c671755
feat: add fish shell expansion support (#228) (#242)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: raghav-latte <131696988+raghav-latte@users.noreply.github.com>
2025-07-08 00:44:31 +01:00
Peter Steinberger
ea3c22fba1 Remove remaining animations and fix file browser issues
- Swap file picker and settings buttons in session header (settings now at the end)
- Disable all button transitions in session view with body.in-session-view
- Disable modal backdrop fade-in animation (0.3s) in session view
- Fix file browser briefly showing then going dark by preventing event bubbling
- Add stopPropagation to file browser button click to prevent duplicate modals

The session detail page should now have zero animations when toggling sidebar
or opening modals.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-08 00:43:51 +01:00
Peter Steinberger
d7a8b565d2 Fix 1-2 second animation delay when reopening session sidebar
- Remove animate-fade-in class from compact mode session list items
- Prevent sessions-showing/hiding animation classes when in session detail view
- Disable View Transitions API for navigating back from session detail view
- Add body.in-session-view class to disable all animations in session view
- Remove transition-all duration-200 from compact session list items
- Disable grid transitions when in session view

This eliminates all staggered animations and transitions that were causing
the perceived 1-2 second delay when toggling the sidebar in session detail view.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-08 00:43:51 +01:00
Peter Steinberger
35e523f051 Fix touch device UI issues and remove session view animations
- Make inline-edit pencil always visible on touch devices with CSS media query
- Remove terminal resize animation (transition: all 0.3s ease-out)
- Remove magic wand AI button that was confusing users
- Reorganize touch device layout: close button left of time
- Disable View Transitions API for session navigation
- Add CSS overrides to disable all button transitions in session view
- Fix TypeScript errors by adding missing handleDeleteSession method

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-08 00:43:51 +01:00
Peter Steinberger
24b0e9b2be Disable create session modal animation in session detail view
- Add check for session detail view in handleCreateSession()
- Add check for session detail view in handleCreateModalClose()
- Modal now appears/disappears instantly in session detail view
- Animation preserved in grid view where it works properly

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-08 00:43:51 +01:00
Peter Steinberger
5f408753b3 Reorganize UI buttons and move settings to session detail view
- Remove duplicate screen share button from sidebar
- Remove file browser button from sidebar
- Remove file picker/upload button from session header
- Move settings/notification icon from sidebar to session header (next to file browser)
- Disable sidebar slide animations to prevent terminal resize issues
- Simplify sidebar to only show Create Session button and User menu
- Settings button is now in session detail view for better context

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-08 00:43:51 +01:00
Peter Steinberger
f39e8dedd5 Remove iPad-specific keyboard layout, use same layout for all mobile devices
- Remove tablet-specific renderTabletLayout() method
- Remove deviceType property from terminal-quick-keys component
- Remove tablet-specific CSS classes (.tablet-layout, .compact)
- Simplify code to use the same 3-row keyboard for all mobile devices
- Provides consistent experience across iPhone and iPad

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-08 00:43:51 +01:00
Peter Steinberger
e31554981a Add universal touch device detection for keyboard mode
- Replace user agent detection with capability-based detection
- Support any touch device (iPad, Android, Surface, etc.)
- Add smart detection for hybrid devices (touch + trackpad)
- Add user preference support (auto/always/never)
- Add keyboard mode toggle button in mobile controls
- Fix landscape mode detection on all touch devices
- Use hardware capabilities instead of brittle UA strings

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-08 00:43:51 +01:00
Peter Steinberger
2815f77b0a fix: Ensure tablets receive all mobile features
- Pass isMobile instead of isPhone to setupMobileFeatures and setupEventListeners
- Tablets need VirtualKeyboard API, Visual Viewport API, and touch event listeners
- Only the keyboard layout should differ between phones and tablets, not core mobile features
2025-07-08 00:43:51 +01:00
Peter Steinberger
ef0f928a89 feat: Add compact keyboard layout for iPads
- Detect device type (phone vs tablet) based on screen size
- Show custom keyboard on iPads with optimized compact layout
- Portrait mode: 2 rows with essential terminal keys
- Landscape mode: Single row with most important keys
- Properly handle device rotation and window resizing
- Add TypeScript declarations for window.__deviceType

Fixes #223
2025-07-08 00:43:51 +01:00
Peter Steinberger
56db25efe2 Fix: Make magic wand prompt more forceful to prevent direct title injection
The magic wand feature now uses emphatic language to ensure AI assistants
use the 'vt title' command instead of injecting terminal escape sequences.
This prevents Claude from being "too smart" and bypassing our title filtering.

Fixes #248
2025-07-08 00:43:33 +01:00
Peter Steinberger
85d9f3d17a
Unified control protocol and deferred screen recording permissions (#239) 2025-07-08 00:42:13 +01:00
Peter Steinberger
7e697d6774
Delete old sessions when VibeTunnel version changes (#254) 2025-07-07 00:05:26 +01:00
Peter Steinberger
9db8fd284b Fix shell configuration files not being loaded
- Ensure bash, zsh, and fish spawn as login shells to read config files
- Add -i and -l flags for bash/zsh, --interactive and --login for fish
- Avoid duplicate flags if already present
- Add user feedback when starting shells in login mode

Fixes #251
2025-07-06 23:30:41 +01:00
Peter Steinberger
7f7b4b682b
Fix terminal flow control to prevent xterm.js buffer overflow (#223) 2025-07-06 12:45:31 +01:00
Armin Ronacher
36337cfd7a Fix linter 2025-07-06 11:25:27 +01:00
Armin Ronacher
6fd74b6282 Move screencap out of /api to fix auth issues 2025-07-06 11:25:27 +01:00
Sandeep Aggarwal
0a61369673
feat: Added Paste button on the quick keyboard for iOS (#225) (#227)
Co-authored-by: Sandeep Aggarwal <aggarwal.sandeep77@gmail.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2025-07-06 03:39:52 +01:00
Helmut Januschka
f3b2022d48
Integrate screencap functionality for remote screen sharing (#209)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2025-07-06 03:31:34 +01:00
Igor Tarasenko
9fad6301a0
feat: Add Bonjour/mDNS service discovery for iOS app (#226)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2025-07-05 11:34:36 +01:00
Peter Steinberger
0c67a89622 feat: expand Playwright test coverage with comprehensive test suite
- Add 50+ new Playwright tests covering key features
- Implement test helpers for session management and data cleanup
- Add page objects for better test maintainability
- Improve test stability with better selectors and wait strategies
- Fix flaky tests with proper timing and synchronization
- Add comprehensive coverage for:
  - Session creation and management
  - Terminal interactions
  - File browser operations
  - Keyboard shortcuts
  - Authentication flows
  - Activity monitoring
  - Search functionality
  - UI responsiveness
- Update test infrastructure for better CI/CD integration
- Fix linting issues and improve code quality

Co-authored-by: Claude <noreply@anthropic.com>
2025-07-04 05:08:34 +01:00
Peter Steinberger
ba372b09de
feat(tauri): Implement full feature parity with Mac app (#213) 2025-07-04 04:52:00 +01:00
Peter Steinberger
22e8a5fe75
Add magic wand button to JavaScript frontend (#218) 2025-07-04 04:35:33 +01:00
Peter Steinberger
d3d0ce9dde
Add magic wand button to inject prompts into Claude sessions (#210) 2025-07-03 23:57:30 +01:00
Peter Steinberger
14b7dc1992
feat: implement parallel test execution with improved stability (#205)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-03 16:40:03 +01:00
Clay Warren
29183c153c
Fix/infinite scroll loop #199 (#206)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2025-07-03 15:40:33 +01:00
Peter Steinberger
45d8f97a30
Improve release scripts and add git app integration (#208) 2025-07-03 12:40:09 +01:00
Peter Steinberger
74a364d1ba
Fix modal backdrop pointer-events issues (#195)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-03 01:03:15 +01:00
Billy Irwin
b74de48ddd ```
fix: prevent file browser flashing and reduce log verbosity

- Split visibility and session change handling to avoid redundant directory loads
- Only reload directory when component becomes visible or session changes while visible
- Change directory browse success log from info to debug level to reduce noise
- Fixes issue where file browser would flash/reload unnecessarily on prop changes
```
2025-07-03 00:32:01 +01:00
Billy Irwin
770951c63a fix: prevent keyboard capture when overlays are active
- Add focus management check in lifecycle keyboard handler
- Skip keyboard capture when overlays/modals are displayed
- Add debug logging for session name change events
- Prevents keyboard conflicts with form inputs in overlays
2025-07-03 00:31:10 +01:00
Devesh Shetty
ea9cafaee1
Fix responsive layout not returning to desktop mode (#201) 2025-07-02 15:15:16 -07:00
Peter Steinberger
2a937eac4a
Make popover window sticky during new session creation (#194) 2025-07-02 16:49:34 +01:00
Peter Steinberger
ad05e0267d Fix title injection race conditions
- Add titleInjectionInProgress flag to prevent concurrent injections
- Update lastWriteTimestamp immediately before enqueueing to prevent quiet period violations
- Clear pendingTitleToInject only after successful write completion
- Compare titles before clearing to avoid losing newer updates
- Stop injection timer only when no pending titles remain
- Use try-finally to ensure in-progress flag is always cleared

This prevents both lost title updates and quiet period violations that could
occur when titles were cleared prematurely or timestamps updated too late.
2025-07-02 07:28:48 +01:00
Peter Steinberger
d112c5300f
Remove titleDebouncer and fix stdout write ordering issues (#190) 2025-07-02 07:06:55 +01:00
Armin Ronacher
8f00054f3d
Fix an issue that caused missing sessions to not load (#187) 2025-07-02 06:51:59 +01:00
Mario Zechner
43ef2d962d Optimize TitleSequenceFilter by compiling regexes once as static properties 2025-07-02 05:12:43 +01:00
Mario Zechner
f322d746af Updated spec.md 2025-07-02 05:12:43 +01:00
Peter Steinberger
920d96207b Fix logger double initialization causing log file deletion
- Modified initLogger() to return early if already initialized
- Removed explicit false parameter in server.ts to preserve debug mode from CLI
- Fixes test failure where log file was being deleted after first write
2025-07-02 00:00:53 +01:00
Peter Steinberger
b5cf38f7e7 Fix flaky logs API test in CI
The test was checking for log file existence before any logs were written.
Added a log write before checking file info to ensure the file exists.
2025-07-02 00:00:53 +01:00
Peter Steinberger
a8dd9af10a Reduce terminal title update frequency to once per second
- Change periodic activity update interval from 500ms to 1000ms
- Ensure all title updates go through debouncer (including session name changes)
- Prevents excessive terminal updates while maintaining responsiveness
2025-07-02 00:00:53 +01:00
Peter Steinberger
c2f0b79cec Fix logs API test by including lastModified in all responses
- Add lastModified: null when log file doesn't exist
- Ensures consistent API response structure
2025-07-02 00:00:53 +01:00
Peter Steinberger
a6488b5ad9 Improve session display and button state management
- Fix menu bar button highlighting using state instead of highlight()
- Extract process name from command path for cleaner display
- Show session name next to command with dash separator
- Fix corner radius on new session dialog
- Make Create button darker green for better visibility
- Update editing to properly handle session names
2025-07-02 00:00:53 +01:00
Armin Ronacher
cf51218d7e
Fix alignment of kill all button (#181) 2025-07-01 21:51:18 +02:00
Peter Steinberger
fcda54a5f9
Enhance VibeTunnel web interface with modern visual design (#177) 2025-07-01 17:57:57 +01:00
Peter Steinberger
b452251a47
Improve Mac menu bar UI with better form styling and animations (#179) 2025-07-01 17:46:46 +01:00
Peter Steinberger
a09563ec62 Enhance VibeTunnel web interface with modern visual design
- Implement modern color scheme with cyan/teal primary colors
- Redesign sidebar with card-based sessions and enhanced status indicators
- Create unified header design with gradient backgrounds
- Add JetBrains Mono font and improve typography throughout
- Implement smooth micro-interactions and animations
- Enhance terminal area with better focus states and loading overlays
- Update all buttons and inputs with consistent hover/focus effects
2025-07-01 15:17:50 +01:00
Peter Steinberger
acf91e228d
Add sidebar toggle button with collapse/expand functionality (#175) 2025-07-01 14:52:56 +01:00
Peter Steinberger
cf7ada95e3 fix: Remove incorrect stdin cleanup code
- Remove stdin handler cleanup that was contradicting the comment
- Remove unused stdinHandler and stdinDataListener from PtySession interface
- Stdin is handled via IPC socket, not process.stdin listeners
2025-07-01 13:41:09 +01:00
Peter Steinberger
31d7faec7f refactor: Improve PTY manager resource cleanup and performance
- Add stdin cleanup handlers for process.stdin listeners
- Implement event listener tracking to prevent memory leaks
- Add lazy watcher initialization for session.json monitoring
- Add explicit isExternalTerminal flag for better terminal detection
- Optimize activity file writing to only write on state changes
- Track last written activity state to avoid unnecessary disk I/O
2025-07-01 13:41:09 +01:00
Peter Steinberger
dd4e06f249 fix: Improve timer management and error handling in PTY manager
- Fix timer management in setupSessionJsonWatcher to properly assign timer before setTimeout
- Improve IPC socket error handling to throw error instead of silently returning
- Socket path length validation now fails fast with clear error message
2025-07-01 13:41:09 +01:00
Peter Steinberger
6c33e16565 feat: Add activity status display to menu bar session entries
- Display activity status (e.g., 'Browsing', 'Considering') below each session
- Show status inline with working directory path, separated by dot
- Match visual style from web frontend with orange status text
- Add compact path display with ~ for home directory
2025-07-01 13:41:09 +01:00
Peter Steinberger
4e5f100074 fix: Remove orphaned test files for non-existent modules
- Delete safe-pty-writer.test.ts and stream-analyzer.test.ts
- These tests were importing modules that no longer exist
- Fixes CI test failures
2025-07-01 13:41:09 +01:00
Peter Steinberger
005a65c399 test: Improve test stability and reduce flakiness
- Remove unused imports to clean up test files
- Use shorter session IDs to avoid path length issues
- Adjust timing in tests for better reliability
- Improve test descriptions and assertions
2025-07-01 13:41:09 +01:00
Peter Steinberger
3b99312fdb fix: Improve heartbeat handling and session.json debounce cleanup
- Echo heartbeat messages back to clients for better connection monitoring
- Properly clear debounce timer references to prevent memory leaks
- Pass client socket to message handler for proper heartbeat responses
2025-07-01 13:41:09 +01:00
Peter Steinberger
646b478075 fix: Add security validation and sanitization for session titles
- Validate session ID format to prevent injection attacks
- Sanitize title input: limit to 256 chars, filter control characters
- Prevent potential security issues with malformed session titles
2025-07-01 13:41:09 +01:00
Peter Steinberger
98795cbb71 feat: Add file browser button to sidebar for UI consistency
- Placed file browser button between notification and create session buttons
- Matches the layout of the full header for better consistency
- Maintains same styling and functionality as main page
2025-07-01 13:41:09 +01:00
Peter Steinberger
92aac0ccfc fix: Integrate SafePTYWriter and fix stdin/IPC socket bugs
- Integrated SafePTYWriter and PTYStreamAnalyzer from PR #171 to prevent terminal corruption
- Fixed stdin listener duplication bug - stdin is now handled via IPC socket only
- Fixed IPC socket handler to properly handle both stdin data and control commands using framed message protocol
- Updated socket paths from 'i.sock' to unified 'ipc.sock'
- Added comprehensive tests for SafePTYWriter and PTYStreamAnalyzer
- Removed global process.stdin listeners to prevent duplication across sessions
2025-07-01 13:41:09 +01:00
Peter Steinberger
740aec5ae6 fix: Stabilize flaky e2e tests with sequential execution and health checks 2025-07-01 13:41:09 +01:00
Peter Steinberger
4699764db4 fix: Remove control pipe code and align with socket-based IPC from main
- Remove controlPipePath and controlWatcher from types
- Remove setupControlPipe method entirely
- Update sendControlMessage to use socket-based IPC
- Remove control pipe cleanup code
- Keep stdin forwarding memory leak fix

The control pipe system was replaced by socket-based IPC in main.
This commit removes the old control pipe code that was accidentally
reintroduced during the rebase.
2025-07-01 13:41:09 +01:00
Peter Steinberger
c5c89fc60f fix: Resolve memory leak in stdin forwarding and TypeScript errors
- Fix memory leak where stdin listeners were never removed
- Store stdin listener reference for proper cleanup
- Add missing controlPipePath property to session types
- Update session manager to include controlPipePath in paths
- Each session now properly tracks and cleans up its stdin listener

This fixes both the CI failures and the reported bug where input
was duplicated across all forwardToStdout sessions.
2025-07-01 13:41:09 +01:00
Peter Steinberger
b515d70de7 fix: Properly track session.json debounce timer for cleanup
- Update session.sessionJsonDebounceTimer when creating new timers
- Clear timer reference after callback execution
- Remove incorrect initial null assignment
- Fixes memory leak where timers continued after session cleanup

The bug occurred because the timer ID was only stored in a local variable,
preventing proper cleanup during session termination.
2025-07-01 13:41:09 +01:00
Peter Steinberger
bb272ce821 refactor: Simplify vt title implementation using fwd --update-title
- Add --update-title flag to fwd.ts for cleaner session title updates
- Replace complex bash/jq/python/sed logic with single fwd.ts call
- Leverage existing SessionManager for type-safe JSON handling
- Improve error handling and messaging
- Reorganize vt script to locate app path before processing commands

This eliminates the fragile bash JSON manipulation in favor of a
robust TypeScript implementation that reuses existing infrastructure.
2025-07-01 13:41:09 +01:00
Peter Steinberger
3fb5b463e8 fix: Security and reliability improvements for vt title
- Fix command injection vulnerability by using jq --arg for safe parameter passing
- Add Python fallback for systems without jq for safe JSON manipulation
- Improve sed fallback with proper escaping (last resort)
- Add debouncing (100ms) to file watcher to prevent rapid updates
- Add error handling for file watcher failures
- Clean up debounce timer on session cleanup
- Fix issue where lastSessionName wasn't properly tracked

Security fix prevents arbitrary command execution through malicious title strings.
Debouncing prevents performance issues from rapid file changes.
2025-07-01 13:41:09 +01:00
Peter Steinberger
a2d80f1fa3 test: Add comprehensive tests for vt title functionality
- Add error handling for 'vt title' when used outside a session
- Create unit tests for session.json watcher in PtyManager
- Add integration tests for vt title command with edge cases
- Test all 4 title modes (none, filter, static, dynamic)
- Test special characters, concurrent updates, and error scenarios
- Ensure proper cleanup of file watchers on session exit
2025-07-01 13:41:09 +01:00
Peter Steinberger
122253f947 feat: Add vt title command for dynamic session naming
- Add 'vt title' command that updates session names from within terminal sessions
- Implement file watcher in PtyManager to detect session.json changes
- Integrate title updates with all 4 title modes (none, filter, static, dynamic)
- Updates terminal titles in real-time when session name changes
- Works by directly editing session.json using the VIBETUNNEL_SESSION_ID env var

This allows users to easily set descriptive names for their terminal sessions,
making it easier to manage multiple VibeTunnel windows.
2025-07-01 13:41:09 +01:00
Jeff Hurray
66998b0672 use pnpm in chained commands 2025-07-01 12:19:13 +01:00
Jeff Hurray
f16536a823 Add precommit command for web app 2025-07-01 12:19:13 +01:00
Peter Steinberger
6196c55ded
Display Claude status in Mac menubar (#160) 2025-07-01 11:21:28 +01:00
Peter Steinberger
6c73decf84
feat: support multiple file uploads via drag & drop and paste (#166) 2025-07-01 07:07:33 +01:00
Jeff Hurray
28913cd490
Fix port argument passthrough for web dev (#163) 2025-07-01 06:50:20 +01:00
Helmut Januschka
8d85c26a84
feat: Add image upload functionality with camera/gallery picker (#140)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2025-07-01 06:47:08 +01:00
devin-ai-integration[bot]
1d9112b9d3
Add SwiftLint and SwiftFormat Husky pre-commit hooks for iOS and mac (#165)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2025-07-01 06:24:59 +01:00
Peter Steinberger
4bdb21da41
chore: bump version to 1.0.0-beta.6 build 152 (#161)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2025-07-01 05:54:43 +01:00
Mario Zechner
40d2cd1998
feat: add asciinema stream pruning for clear sequences (#155)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2025-07-01 05:01:59 +01:00
Peter Steinberger
ba8d7be280
feat: optimize Playwright tests for sequential execution (#149) 2025-07-01 04:42:38 +01:00
Peter Steinberger
cd4e783f32
Add husky pre-commit hooks for code quality enforcement (#157) 2025-07-01 03:49:00 +01:00
Helmut Januschka
f2f5f5f67d
feat: add sleep prevention option to keep Mac awake during sessions (#146)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2025-06-30 11:13:21 +01:00
Peter Steinberger
86492c4cea
feat: optimize prompt pattern detection with unified regexes (#147) 2025-06-30 09:47:15 +01:00
Peter Steinberger
8bc6e81549
feat: add comprehensive terminal title management (#124) 2025-06-30 04:15:09 +01:00
Peter Steinberger
f1c0554644
Add Playwright E2E test framework (#120) 2025-06-30 02:51:21 +01:00
Helmut Januschka
824c9134d5
Implement ultra-low-latency WebSocket input system (#115)
* Implement ultra-low-latency WebSocket input system

This change eliminates input lag on slow networks by replacing HTTP requests
with a fire-and-forget WebSocket system for terminal input transmission.

Key optimizations:
- Raw text transmission (no JSON overhead): 1 byte vs 87+ bytes per keystroke
- Fire-and-forget input (no ACK blocking): eliminates 20-50ms roundtrip latency
- Single persistent connection per session: zero connection overhead
- Direct PTY write path: fastest possible server processing
- Graceful HTTP fallback: maintains full backward compatibility

Performance improvements:
- 99% bandwidth reduction per keystroke
- 90% latency reduction on slow networks
- Zero blocking waits for rapid typing
- Eliminates HTTP/1.1 connection overhead

Files changed:
- Add: src/client/services/websocket-input-client.ts (WebSocket client)
- Add: src/server/routes/websocket-input.ts (WebSocket input handler)
- Modify: src/client/components/session-view/input-manager.ts (WebSocket integration)
- Modify: src/server/server.ts (WebSocket routing for /ws/input endpoint)

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Add socket_input URL parameter feature flag

Adds ?socket_input=true/false URL parameter to control WebSocket input behavior:
- socket_input=true (default): Enable WebSocket input with HTTP fallback
- socket_input=false: Force HTTP-only input mode (disable WebSocket)

This feature flag enables:
- A/B testing between WebSocket and HTTP input performance
- Debugging WebSocket connection issues
- Gradual rollout control
- Easy fallback mechanism for production issues

Examples:
- http://localhost:4020/?socket_input=true&session=abc123 (WebSocket enabled)
- http://localhost:4020/?socket_input=false&session=abc123 (HTTP only)

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix WebSocket input key mapping for special keys

The server was receiving key names like "enter" and writing them literally
as text instead of interpreting them as actual key presses.

Added proper key mapping:
- "enter" → '\r' (carriage return)
- "escape" → '\x1b' (ESC key)
- "backspace" → '\x7f' (DEL)
- "tab" → '\t' (TAB)
- "arrow_up" → '\x1b[A' (VT100 up arrow)
- "arrow_down" → '\x1b[B' (VT100 down arrow)
- "arrow_left"/"arrow_right" → '\x1b[D'/'\x1b[C' (VT100 arrows)
- Function keys F1-F12 → proper VT100 sequences
- Regular text → sent as-is

Now "enter" actually triggers ENTER key instead of typing "enter" text.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Reuse existing key mapping logic instead of duplicating

Instead of duplicating the key mapping logic (enter → \r, etc.), now properly
reuse the existing PtyManager.sendInput() method which already handles:

- Key mapping via convertSpecialKey() method
- SessionInput type validation
- Special key vs regular text determination
- Error handling and session management

This ensures consistency between HTTP /input and WebSocket /ws/input endpoints
and avoids maintaining duplicate key mapping tables.

Benefits:
- Single source of truth for key mappings
- Consistent behavior across input methods
- Proper type safety with SessionInput/SpecialKey types
- Reuses existing error handling and validation

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix special key detection in pasted text using null-byte markers

Problem: Pasting text like "i am entering the world" would incorrectly
interpret "enter" as the ENTER key instead of literal text.

Solution: Use null-byte markers to distinguish special keys from literal text:
- Special keys: "\x00enter\x00" → ENTER key press
- Regular text: "enter" → literal text "enter"
- Pasted text: "i am entering the world" → literal text

This maintains the raw text protocol while solving the ambiguity:
- Single keystroke "enter" → "\x00enter\x00" → ENTER key
- Pasted word "enter" → "enter" → literal text "enter"
- Multi-word paste → always literal text

Benefits:
- Preserves ultra-minimal bandwidth (just 2 null bytes overhead)
- Maintains raw text protocol (no JSON)
- Solves paste ambiguity correctly
- Null bytes rarely appear in normal text input

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix paste text ambiguity and control sequence handling

- Modified sendInputText to always treat pasted content as literal text
- Added sendControlSequence method for control characters like Ctrl+R
- Updated direct keyboard manager to use sendControlSequence for control chars
- This ensures pasted text containing words like "enter", "backspace" is sent as literal text
- Control sequences like Ctrl+R (\x12) are properly transmitted via WebSocket with null-byte escaping

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Add debug logging for WebSocket input transmission

- Added detailed logging on client side to show what's being sent
- Added server side logging to show what's being received
- This will help debug the enter key transmission issue

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Add comprehensive input logging to track key processing

- Added logging in WebSocket handler to show parsed input
- Added logging in PtyManager to show key conversion and output
- This will show the complete flow: received key -> parsed input -> converted output

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Add DEBUG environment variable for enabling debug logging

- Added DEBUG=true environment variable option alongside --debug flag
- Makes it easier to enable debug logging during development

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix WebSocket input handling for HQ mode and mobile keyboards

- Add WebSocket proxy support for remote sessions in HQ mode
- Fix mobile keyboard special key handling to use sendInput() instead of sendInputText()
- Make InputManager.sendInput() public for use by mobile components
- Update DirectKeyboardManager to correctly send special keys from custom keyboard
- Handle WebSocket data type conversion for native WebSocket API compatibility

This ensures special keys are properly wrapped with null bytes (\x00) when sent
via WebSocket, and enables low-latency input for remote sessions in HQ mode.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor: eliminate code duplication in input-manager and fix TypeScript typing

- Extract common WebSocket/HTTP fallback logic into sendInputInternal()
- Reduce ~155 lines of duplicate code across sendInput, sendInputText, and sendControlSequence methods
- Add proper WebSocketRequest interface to replace any type usage
- Fix linting issues in server.ts WebSocket handling

* up

* Add comprehensive tests for WebSocket input handler

- Test special key handling with null-byte wrapped keys (\x00enter\x00)
- Test text containing key names ('i enter the world') treated as literal text
- Test HQ mode remote session proxying vs local PTY handling
- Test edge cases: empty messages, malformed keys, binary data, Unicode
- Test error handling and connection lifecycle
- Remove duplicate special key validation logic
- Delegate key conversion to ptyManager for consistency

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix TypeScript linting issues in WebSocket input handler tests

- Replace all 'any' types with proper type definitions
- Add MockEventListener type for test event handlers
- Use 'unknown' instead of 'any' for type assertions
- Remove unused SessionInput import
- Fix formatting issues per Biome requirements

All 20 WebSocket input handler tests now pass with proper TypeScript types.

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

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Mario Zechner <badlogicgames@gmail.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2025-06-29 22:55:13 +02:00
Clay Warren
aabbd57aa2
feat: add gemini quick start button (#128) 2025-06-29 21:54:14 +01:00
Chris Reynolds
13b98308c9
fix: remove double shell-wrapping for aliases in vt script (#132) 2025-06-29 21:52:52 +01:00
Peter Steinberger
39a5933f9f
Fix frontend log streaming in no-auth mode (#130) 2025-06-29 18:41:40 +01:00
Manuel Maly
099a5fb427
fix: scrolling on web mobile (#129) 2025-06-29 17:39:16 +02:00
Peter Steinberger
38b7846605
Fix terminal width overflow causing flickering in native terminals (#123) 2025-06-29 11:43:29 +01:00
Peter Steinberger
4b74fdf89c
Fix URL detection to exclude numbered lists (#122) 2025-06-28 20:20:34 +02:00
Peter Steinberger
7f1c4ec9bb Update tests to match new behavior for Windows drive letter support
- Tests now expect all Windows drive letters (A-Z) to be replaced with ~
- This matches the updated regex pattern that supports any drive letter
- Tests verify D:, E:, Z:, and lowercase drive letters work correctly
2025-06-28 15:22:05 +02:00
Peter Steinberger
816247d8ad Fix Windows drive letter support in path formatting regex
- Update regex pattern to support all drive letters A-Z (not just C:)
- Fix linting warning about unnecessary escape in character class
- Now properly handles paths like D:\Users\, E:\Users\, etc.
2025-06-28 15:22:05 +02:00
Peter Steinberger
dfb36f7cf8 Fix critical bug: revert path formatting in session-create-form input
The working directory input was displaying formatted paths (~/Documents) but
storing them as-is when edited, causing backend errors since it expects
absolute paths.

Reverted to showing raw paths in the input field. The file browser component
is unaffected as it correctly only formats for display, not for input.

This ensures workingDir always contains absolute paths as expected by the API.
2025-06-28 15:22:05 +02:00
Peter Steinberger
836db22a5e Apply path formatting to remaining frontend components
- Add formatPathForDisplay to session-create-form working directory input
- Add formatPathForDisplay to file-browser path display
- Users now see ~/Documents instead of /Users/username/Documents everywhere
- Maintains raw paths for editing and API calls, only formats for display
2025-06-28 15:22:05 +02:00
Peter Steinberger
039f27112e Remove unnecessary memoization from clickable-path component
- The formatPathForDisplay function is extremely cheap (single regex replace)
- LitElement already optimizes renders efficiently
- Removing memoization reduces code complexity and memory overhead
- The performance difference is negligible for such a simple operation
2025-06-28 15:22:05 +02:00
Peter Steinberger
dc646ae76e Address additional Claude review feedback
- Optimize path formatting with pre-compiled regex for better performance
- Add memoization to clickable-path component to avoid re-computations
- Add comprehensive tests for usernames with regex special characters
- Simplify clipboard tests for more reliable test execution
- Fix potential issues with special characters in usernames breaking regex patterns
2025-06-28 15:22:05 +02:00
Peter Steinberger
f7b725ff17 Fix path formatting issues identified by Claude review
- Handle Windows paths with forward slashes (C:/Users/username)
- Support case-insensitive Windows drive letters (c:\ vs C:\)
- Fix multiple home directory pattern replacement using single regex
- Add comprehensive tests for all edge cases
- Update JSDoc comments with proper formatting
2025-06-28 15:22:05 +02:00
Peter Steinberger
cb093ffd12 Add /cp and c+p as shorthands for commit and push 2025-06-28 15:22:05 +02:00
Peter Steinberger
7d7200f9a8 Update CLAUDE.md to use single command for commit and push 2025-06-28 15:22:05 +02:00
Peter Steinberger
8e94b644e7 Clarify that pnpm run check is the primary command for concurrent checking 2025-06-28 15:22:05 +02:00
Peter Steinberger
627599fb02 Fix race condition risks in code quality tools
- Keep parallel execution for read-only checks (format:check, lint, typecheck)
- Make check:fix run sequentially to prevent file write conflicts
- Add documentation explaining why sequential execution is needed
- Based on best practices: lint-staged and JavaScript community recommendations
2025-06-28 15:22:05 +02:00
Peter Steinberger
18e4648904 Add comprehensive tests and improve code quality workflow
- Add tests for formatPathForDisplay covering all platforms
- Create parallel code quality check script (pnpm run check)
- Add auto-fix command for format and lint issues (pnpm run check:fix)
- Document the improved workflow in DEVELOPMENT.md
- Update CLAUDE.md with the new commands
2025-06-28 15:22:05 +02:00
Peter Steinberger
d0c42107f3 Switch to client-side path formatting with regex
- Remove all server-side path formatting logic
- Implement simple regex-based client-side formatting
- Support macOS, Linux, Windows, and root user paths
- Simpler implementation with no API changes needed
- Better separation of concerns (UI formatting in UI layer)
2025-06-28 15:22:05 +02:00
Peter Steinberger
f2eb262384 Remove formatPathForDisplay function completely
- Delete formatPathForDisplay function from path-utils.ts
- Update all components to use displayWorkingDir from server
- Clean up imports in affected components
- Add refactoring philosophy note to CLAUDE.md
2025-06-28 15:22:05 +02:00
Peter Steinberger
856dc3ce91 Remove hardcoded home directory from client-side path formatting
- Deprecate client-side formatPathForDisplay function
- Remove hardcoded /Users/steipete path
- Add JSDoc comments explaining server-side formatting is preferred
- Add documentation to displayWorkingDir property in Session interface
2025-06-28 15:22:05 +02:00
Peter Steinberger
c05d91e1b2 Fix mobile header truncation and dynamic home directory display
- Replace hardcoded home directory with dynamic detection using os.homedir()
- Add server-side path formatting using existing abbreviatePath utility
- Add displayWorkingDir field to Session interface
- Fix mobile header overflow with proper width constraints
- Update clickable-path component to accept pre-formatted display paths

This fixes both the regression where ~ substitution was broken and the
mobile header pushing content off-screen when session paths are long.

Fixes #96
2025-06-28 15:22:05 +02:00
Helmut Januschka
bdfd46a915
Add keyboard shortcut highlighter to terminal (#114)
* Add keyboard shortcut highlighter to terminal

- Create keyboard-shortcut-highlighter.ts with comprehensive pattern matching
- Integrate highlighter into terminal component alongside URL highlighting
- Support clickable shortcuts like "Ctrl+R", "Ctrl+A", "esc to interrupt"
- Style shortcuts with greyish color and dotted underlines (not blue links)
- Send actual key sequences when shortcuts are clicked
- Handle overlapping matches and avoid double-processing

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix keyboard shortcut input handling - add missing event listener

The keyboard shortcut highlighter was dispatching 'terminal-input' events
but the session-view component wasn't listening for them. Added:

- @terminal-input event listener on vibe-terminal component
- handleTerminalInput method that forwards to inputManager.sendInputText()

Now clicked shortcuts like 'Ctrl+R' properly send input to the terminal.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Add Claude Code interactive prompt support to keyboard shortcut highlighter

Make numbered options in Claude Code prompts clickable:
- Pattern: '❯ 1. Yes' or '  2. Yes, and don't ask again'
- Clicking sends the number (1, 2, 3, etc.) to terminal
- Handles both selected (❯) and unselected options
- Uses multiline regex matching for line-start patterns

Now users can click numbered options instead of typing numbers.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix Claude Code prompt patterns to handle indented options

Previous patterns required line-start anchors which failed for indented
options within bordered terminal output. Updated patterns:

- Remove restrictive line-start anchors (^)
- Add whitespace-flexible patterns for indented options
- Support both cursor-selected (❯) and plain numbered options
- Handle 'Yes, proceed' and 'No, exit' style options

Now correctly matches:
'❯ 1. Yes, proceed' and '  2. No, exit' patterns.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Simplify Claude Code prompt patterns to be fully generic

Replace keyword-specific patterns with generic numbered option matching:

- ❯ 1. (cursor-selected options)
- 1. xxxxx (any numbered option with text)

Now matches any numbered list item regardless of content:
'1. Yes, proceed', '2. No, exit', '3. Maybe later', etc.

Much cleaner and more flexible than keyword-based matching.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix Claude Code prompt patterns to highlight full option lines

Changed from matching only first word to matching entire lines:
- /❯\s*(\d+)\.\s+.*/ - highlights complete cursor-selected option
- /(\d+)\.\s+.*/ - highlights complete numbered option

Now '1. Yes, proceed' and '2. No, exit' are fully underlined
instead of just '1. Yes' and '2. No'.

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

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-06-28 02:15:50 +02:00
Mario Zechner
2ffb0a3a62 Fix race conditions in PTY output handling with WriteQueue
Implement WriteQueue to serialize all async write operations and handle backpressure:
- Add shared WriteQueue utility class for serializing async operations
- Move write queue inside AsciinemaWriter to handle all write methods
- Add backpressure handling using stream 'drain' events
- Ensure all AsciinemaWriter methods (writeHeader, writeRawJson) use queue
- Add drain() method to wait for pending writes on close
- Store stdout queue reference in PtySession for cleanup on process exit

This prevents race conditions where concurrent fs.fsync calls could interleave,
causing out-of-order disk flushes and potential data corruption.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-27 22:21:05 +02:00
Helmut Januschka
6e98fa9ce6
Fix Japanese input duplication on iOS web (GitHub #99) (#102)
Added comprehensive IME composition support to prevent duplication of Japanese, Chinese, and Korean text input on mobile devices.

Changes:
- DirectKeyboardManager: Added composition event handlers to wait for final text
- MobileInputOverlay: Added composition state tracking to prevent intermediate updates
- Fixed null safety issues and unused parameter warnings
- Comprehensive documentation explaining IME implementation

Bug Fixed:
Previously, intermediate composition characters were sent to terminal during Japanese typing, causing duplicated text. Now properly waits for composition completion before sending final text to terminal.

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

Co-authored-by: Claude <noreply@anthropic.com>
2025-06-27 21:37:43 +02:00
Helmut Januschka
b98a8d190e
Add Shift+Tab key to mobile QuickKeyboard (#111)
* Add Shift+Tab key to mobile QuickKeyboard per PR #105 feedback

Implements Peter's suggestion to add Shift+Tab key to mobile quick keyboard
for enhanced Claude Code planning mode support on mobile devices.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix Monaco Editor keyboard input cancellation

Enhanced isKeyboardShortcut detection to properly handle Monaco Editor
elements, preventing keyboard event interference while maintaining
terminal functionality.

- Added contentEditable detection
- Added .monaco-editor container detection
- Added data-keybinding-context detection
- Added .editor-container detection

This resolves the 'Canceled: Canceled' errors when typing in Monaco Editor
while preserving Shift+Tab functionality for Claude Code planning mode.

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

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-06-27 21:32:06 +02:00
Mario Zechner
4788afb7ed Clean-up of web/, updated spec.md 2025-06-27 21:13:55 +02:00
Helmut Januschka
98e922fd44
Fix shell alias expansion timing issue (GitHub #101) (#103)
Fixed the 'command not found' error for shell aliases like claude command.

Root Cause:
Previously, commands were executed as:
  /bin/zsh -c 'source ~/.zshrc 2>/dev/null || true; claude'

Shell alias expansion happens at parse time, before the source command runs,
so aliases defined in .zshrc were not available during command parsing.

Solution:
Use interactive mode with login shell flags:
  /bin/zsh -i -l -c 'claude'

The -i flag enables interactive mode (loads aliases)
The -l flag makes it a login shell (sources RC files)
This ensures aliases are properly loaded and expanded before command execution.

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

Co-authored-by: Claude <noreply@anthropic.com>
2025-06-27 21:05:58 +02:00
Helmut Januschka
fc162ad55c
Prevent recursive VibeTunnel sessions (GitHub #95) (#104)
* Prevent recursive VibeTunnel sessions (GitHub #95)

Added detection and prevention of nested VibeTunnel sessions to avoid
recursive 'vt' command execution.

Changes:
- Set INSIDE_VIBETUNNEL and VIBETUNNEL_SESSION environment variables when creating PTY sessions
- Added check in vt script to detect if already inside a VibeTunnel session
- Shows helpful error message when recursive session is attempted

This prevents the confusing behavior where users could run 'vt' inside a
VibeTunnel session, creating nested terminal instances. Now users get a
clear error message explaining they're already in a VibeTunnel session.

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Improve recursive session prevention based on PR feedback

- Consolidate to single environment variable VIBETUNNEL_SESSION_ID
- Add session ID for debugging purposes as requested
- Show session ID in error message for better user feedback
- Remove redundant environment variables (INSIDE_VIBETUNNEL, VIBETUNNEL_SESSION)

This addresses feedback from PR #104 to use a single, more informative
environment variable that serves both purposes: preventing recursion
and providing debugging information.

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-06-27 21:05:36 +02:00
Helmut Januschka
9aaac17150
Add Shift+Tab support for Claude Code planning mode (GitHub #100) (#105)
* Add Shift+Tab support for Claude Code planning mode (GitHub #100)

Added proper Shift+Tab key sequence handling to enable Claude Code mode switching.

Changes:
- Added 'shift_tab' to SpecialKey type definition
- Updated input-manager.ts to detect Shift+Tab combination (e.shiftKey)
- Updated direct-keyboard-manager.ts for mobile Shift+Tab support
- Added shift_tab mapping to PTY manager (sends \x1b[Z escape sequence)

This allows users to press Shift+Tab in VibeTunnel to switch between Claude Code
modes (autoaccept, planning, regular) as expected.

Technical Details:
- Shift+Tab sends the standard terminal escape sequence \x1b[Z (CSI Z)
- Both desktop and mobile input handlers now support the key combination
- Maintains backward compatibility with regular Tab functionality

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

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix Shift+Tab not being sent as special key

Added 'shift_tab' to the special keys list in input-manager.ts so it gets
sent as {"key": "shift_tab"} instead of {"text": "shift_tab"}.

This was the missing piece - the frontend was correctly detecting Shift+Tab
but then sending it as text instead of a special key, so the server couldn't
map it to the \x1b[Z escape sequence.

Now Shift+Tab will properly send {"key": "shift_tab"} in the API request.

* Fix failing CI test in session-list.test.ts

Updated test expectation to check for 'compactMode' instead of
non-existent 'showCreateModal' property. This was a stale test
that was unrelated to the Shift+Tab changes but was blocking CI.

All tests now pass.

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-06-27 21:00:09 +02:00
Armin Ronacher
47ee08c652 Fix out of order writes 2025-06-27 14:59:35 +02:00
Armin Ronacher
47e475b967 Claude knows how to flexbox 2025-06-27 12:26:42 +02:00
Armin Ronacher
ae2b8a2298 Fixed session status detection 2025-06-27 11:50:38 +02:00
Peter Steinberger
553dcff448 hide scoll down button when quick keyboard is active 2025-06-27 02:02:22 +02:00
Peter Steinberger
b84e6faea2 keyboard tweaks 2025-06-27 02:02:19 +02:00
Peter Steinberger
27416a7ce3 instead of transform, reduce terminal size with keyboard 2025-06-27 01:54:56 +02:00
Peter Steinberger
af44f2e7bb flip buttons 2025-06-27 01:54:40 +02:00
Peter Steinberger
664bdb75d4 reorganize header 2025-06-27 01:50:22 +02:00