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>
- 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>
- Add synchronous wait in applicationWillTerminate to ensure server stops before app exits
- Implement parent process monitoring in server spawn script
- Server now monitors parent PID and self-terminates if parent dies
- Handles both graceful shutdown and force-quit scenarios
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Display version number inline with session started message
- Show build date and git commit in session info
- Import version details from version.ts
🤖 Generated with Claude Code (https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fix iOS CI to use correct workspace and scheme names
- Update iOS test script to use workspace instead of project
- Fix all TypeScript 'any' type warnings by adding proper types
- Update build destination format for Xcode 16 compatibility
- 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>
- Update mac.yml to use global VibeTunnel.xcworkspace instead of mac/VibeTunnel.xcworkspace
- Update ios.yml to use global VibeTunnel.xcworkspace with VibeTunnel-iOS scheme
- Fix Node.js workflow to use standard GitHub Actions runners (ubuntu-latest) and actions/setup-node@v4
- Use xcodebuild test instead of swift test for proper workspace testing support
- Remove unnecessary cd commands since workspace is at root level
This fixes CI failures after the global Apple workspace was introduced.
Remove verbose module loading debug logs that were cluttering the output
when running fwd command.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove global exit handlers from PTY manager, add clean shutdown() method
- Use file watching approach for control pipes on all platforms (no FIFO)
- Simplify fwd.ts - control pipe and stdin forwarding handled by PTY manager
- Add forwardToStdout and onExit options to createSession
- Add proper TypeScript types to PtySession interface (no more "as any")
- Clean up logging throughout, keep only essential messages
- Add colorful output with chalk for session start/end messages
- Fix hanging process issue by properly unreferencing file watchers
- Update spec.md to reflect architectural changes
This makes the shutdown process predictable and fixes the hanging echo command issue.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>