Commit graph

32 commits

Author SHA1 Message Date
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
85d9f3d17a
Unified control protocol and deferred screen recording permissions (#239) 2025-07-08 00:42:13 +01:00
Peter Steinberger
7f7b4b682b
Fix terminal flow control to prevent xterm.js buffer overflow (#223) 2025-07-06 12:45:31 +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
2a937eac4a
Make popover window sticky during new session creation (#194) 2025-07-02 16:49:34 +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
b22d8995dd
Add comprehensive server tests and switch to Biome linter (#73) 2025-06-24 18:51:38 +02:00
Mario Zechner
10e4f97924 Fix auth logging, fix PAM native loading outside SEA builds 2025-06-24 02:10:15 +02:00
Mario Zechner
498eb4f3fc Unfuck tsconfigs + VS Code + eslint + tsc, fix type errors 2025-06-24 01:51:46 +02:00
Mario Zechner
73dd60870e Fix SEA build wrt PAM 2025-06-24 01:38:21 +02:00
Peter Steinberger
b363355543 recompile native authenticate_pam for custom node 2025-06-24 01:16:38 +02:00
Helmut Januschka
e9b395b726
Implement comprehensive user authentication with SSH key management (#43)
* Implement comprehensive user authentication system

- Add SSH-first authentication with password fallback
- Implement JWT token-based session management (24h expiry)
- Create browser-based SSH agent with key storage and signing
- Add challenge-response SSH authentication protocol
- Integrate PAM for system password authentication
- Build comprehensive authentication UI components
- Add SSH key manager for key generation and management
- Update middleware to support JWT tokens alongside existing auth
- Maintain backwards compatibility with existing HQ/remote auth
2025-06-24 00:31:13 +02:00
Armin Ronacher
77dc0993c4 Try to detect what triggers the bell 2025-06-23 23:54:48 +02:00
Peter Steinberger
3351cc08c2 fixes linter issues 2025-06-23 16:55:53 +02:00
Peter Steinberger
03cb7b4774 fix remaining ts issues 2025-06-23 15:22:47 +02:00
Armin Ronacher
0ac9f81b90 Added push notifications for bells 2025-06-23 13:51:49 +02:00
Mario Zechner
04cfe992ee refactor: Apply unified logging style guide to all server files
- Remove all colors from error/warn logs per style guide
- Add appropriate colors to logger.log calls (green=success, yellow=warning, blue=info, gray=metadata)
- Remove all prefixes like [STREAM], ERROR:, WARNING:
- Ensure all messages start lowercase (except acronyms) with no periods
- Add missing essential logs for lifecycle events and state changes
- Add debug logs for troubleshooting and performance monitoring
- Ensure all error logs include the error object
- Add proper logging to previously silent catch blocks
- Enhance context in logs with relevant IDs, counts, and durations

The logging now provides comprehensive visibility into:
- Server initialization and shutdown sequences
- Session lifecycle (creation, usage, termination)
- Connection events and client tracking
- Authentication attempts and security events
- File system operations and Git performance
- Remote server health checks and HQ communication
- Process management across platforms
- Resource cleanup and performance metrics

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-22 23:10:51 +02:00
Mario Zechner
f6df526f6b feat: Add structured logging system with unified style
- Implement centralized logger utility with file and console output
- Add debug mode support via --debug flag
- Initialize logger at startup for server, fwd, and cli
- Replace all console.log/error calls with structured logger
- Add logging style guide for consistent messaging
- Include proper shutdown handling with closeLogger()

The logger provides:
- Timestamped color-coded console output
- Module identification in all logs
- File logging to ~/.vibetunnel/log.txt
- Debug logs toggled via --debug flag

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-22 22:40:00 +02:00
Mario Zechner
1bb15097a4 refactor: Remove unused stream-notifier system
The direct notification system wasn't being used since hasListeners()
was checking before any listeners were set up. All sessions were using
file watching anyway. Simplified the code by removing the unused
notification system and keeping only the optimized file watching.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-22 21:09:57 +02:00
Mario Zechner
312786230b refactor: Remove unnecessary header construction in StreamWatcher
AsciinemaWriter always writes a header, so we can trust it exists.
Removed all the default header construction logic and headerSent tracking.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-22 21:00:41 +02:00
Mario Zechner
d7e811412a refactor: Simplify file watching - remove unnecessary OptimizedFileWatcher
- Integrate stat checking directly into StreamWatcher
- Remove platform-specific code paths that all used fs.watch anyway
- Keep the actual optimization: checking file stats to avoid spurious events
- Simpler, cleaner code with the same benefits

The real improvements remain:
1. Direct notifications for in-process sessions
2. Stat checking to verify actual file changes
3. Only processing when file size increases

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-22 20:57:46 +02:00
Mario Zechner
c43a549ed8 fix: Simplify notification logic - use direct or file, never both
- Check upfront if we have listeners for direct notifications
- Use EITHER direct notifications OR file watcher, not both
- This eliminates any possibility of duplicate broadcasts
- Server sessions get instant updates via direct notifications
- Forwarded sessions use optimized file watcher

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-22 20:41:13 +02:00
Mario Zechner
52feefddf2 fix: Prevent duplicate notifications and improve latency
- Only use file watcher if no direct notifications are available
- Remove unnecessary deduplication logic
- Clean up logging for direct notifications
- Wait 100ms to detect if we're getting direct notifications before
  starting file watcher (for cross-process scenarios)

This should eliminate duplicate broadcasts and improve latency for
server-created sessions while maintaining compatibility with fwd.ts

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-22 20:36:30 +02:00
Mario Zechner
a84e43dadc fix: Prevent duplicate broadcasts in StreamWatcher
Add deduplication logic to prevent the same line from being broadcast
twice when both direct notification and file watcher fire. Uses a
simple hash and 50ms time window to detect duplicates.

This fixes the double input issue in server-created sessions.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-22 20:21:03 +02:00
Mario Zechner
fbc8954d39 feat: Optimize file watching for lower latency streaming
- Add platform-specific optimized file watcher
  - Linux: inotify with rapid polling after changes
  - macOS: FSEvents + periodic checks to overcome batching
  - Windows: ReadDirectoryChangesW with debouncing
- Add direct in-process notifications via StreamNotifier
  - Bypasses file watching for same-process sessions
  - Near-instant latency for server-created sessions
- Update StreamWatcher to use both mechanisms
  - Primary: Direct notifications (microsecond latency)
  - Fallback: Optimized file watching (for fwd.ts)
- Add latency and stress test scripts

This should significantly reduce streaming latency, especially
for sessions created by the server process.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-22 20:18:57 +02:00
Mario Zechner
862fc86c72 fix: eliminate lag in forwarded sessions by forcing immediate disk sync
- Add fs.fsyncSync after each asciinema event write to trigger file watchers immediately
- Keep socket connections alive with setKeepAlive for better performance
- Add response flushing in SSE streams to prevent buffering
- Fix the ~100ms input lag that was affecting forwarded sessions vs server-created sessions

The lag was caused by buffered writes not immediately triggering file system watchers.
Forwarded sessions now feel as responsive as server-created sessions.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-22 14:56:40 +02:00
Mario Zechner
e912b65c9e Fix Node.js detection in build-bun-executable.sh for Xcode builds
Add common Node.js installation paths to PATH including Homebrew, NVM, n, and MacPorts locations. This matches the approach used in build-web-frontend.sh and ensures the script can find Node.js when running in Xcode's restricted environment.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-22 04:04:52 +02:00
Mario Zechner
d4b8748b22 Reorganize server structure for clarity
- Rename index.ts to cli.ts as single entry point
- Merge app.ts and shutdown-state.ts into server.ts
- Update all imports and references to use new structure
- Update e2e tests and dev script to spawn via cli.ts
- Remove execution code from server.ts (only cli.ts executes)
- Clean up tsconfig.client.json exclude path

This creates a cleaner separation where cli.ts is the only entry
point that decides whether to run server or forward mode.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-21 16:44:56 +02:00
Peter Steinberger
db8f4ffbeb Add first iteration of file browser 2025-06-21 16:11:35 +02:00
Mario Zechner
b1718c27fa fix: handle HQ mode shutdown gracefully to prevent e2e test errors
- Add global shutdown state tracking via shutdown-state.ts module
- Update refresh-sessions endpoint to return 503 during shutdown
- Skip HQ notifications in control-dir-watcher during shutdown
- Disable remote health checks during server shutdown
- Suppress expected connection errors when servers are shutting down

This prevents the flood of "Failed to refresh sessions" and "Failed to
notify HQ" errors that were appearing in the HQ e2e test logs when
servers were shutting down.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-20 23:56:15 +02:00
Mario Zechner
5593ee39ef refactor: modularize server architecture and consolidate codebase
- Restructure server code into modular architecture under src/server/
  - middleware/: Authentication handling
  - pty/: PTY management consolidation
  - routes/: API endpoint handlers
  - services/: Core services (terminal, HQ, streaming)
- Consolidate 20+ scattered files into organized modules
- Replace unit/integration tests with comprehensive E2E testing
- Add spec.md as codebase navigation guide
- Update build paths for new CSS location (styles.css)
- Add chalk dependency for improved terminal output
- Simplify server entry point to use modular loader
- Update CLAUDE.md with spec.md regeneration instructions

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-20 22:44:40 +02:00