This commit implements isolated tmux sessions for each conversation and refines the terminal MCP tools to use consistent command terminology. **Per-Conversation Tmux Sessions:** - Each Session now creates its own Terminal MCP client with conversation ID as tmux session name - Complete isolation: commands from different conversations don't interfere - Automatic cleanup: tmux session killed when conversation ends - Updated getAllTools() to accept custom terminal tools per session - Session.cleanup() now async to properly await tmux session termination **Command-Based MCP Tools:** - Removed old terminal-based tools (list_terminals, create_terminal, etc.) - Kept only command-based tools (execute_command, list_commands, etc.) - Updated kill_command to accept multiple command IDs for batch cleanup - Fixed bug where all commands showed same metadata (working directory, command) - Added window-specific option storage using set-window-option/show-window-options **Bug Fixes:** - Fixed listCommands() showing wrong working directory and command for dead commands - Stored command metadata as tmux window options for proper retrieval - Enhanced test to verify multiple commands retain unique metadata **Testing:** - Added comprehensive test suite with 26 passing tests - All tests verify command execution, capture, interaction, and cleanup - TypeScript: no errors - Backward compatibility maintained with global singleton fallback Generated with [Claude Code](https://claude.com/claude-code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
Voice Assistant
A voice-controlled terminal assistant that runs as a single local service.
Quick Start
# Install dependencies
npm install
# Copy environment variables
cp .env.example .env
# Edit .env and add your API keys (OpenAI, Deepgram)
# Run development servers
npm run dev
# Open browser to http://localhost:5173
Architecture
- Express Server (port 3000) - Serves API and built UI in production
- Vite Dev Server (port 5173) - Hot-reload React UI in development
- WebSocket (
/ws) - Real-time bidirectional communication - Agent - STT → LLM → TTS pipeline with terminal control
- Daemon - tmux-based terminal management (in-process)
Development
# Run both servers (recommended)
npm run dev
# Or run separately:
npm run dev:server # Express on port 3000
npm run dev:ui # Vite on port 5173
# Type checking
npm run typecheck
# Build for production
npm run build
# Start production server
npm start
Project Status
✅ Completed (Phases 1-2):
- Package setup and configuration
- Express server with WebSocket
- React UI with Vite
- WebSocket client with ping/pong testing
⏳ In Progress (Phase 3):
- Terminal control (tmux integration)
📋 Planned (Phases 4-9):
- LLM integration (OpenAI GPT-4)
- Agent orchestrator
- Speech-to-Text (Deepgram)
- Text-to-Speech (OpenAI)
- Audio streaming
- UI polish
See IMPLEMENTATION_PLAN.md for complete details.
Environment Variables
OPENAI_API_KEY=sk-... # GPT-4 and TTS
DEEPGRAM_API_KEY=... # Streaming STT
PORT=3000 # Server port
NODE_ENV=development # Environment
Tech Stack
- Server: Express, TypeScript, ws (WebSocket)
- Client: React 18, Vite, TypeScript
- Terminal: tmux (via child_process)
- AI: OpenAI (LLM + TTS), Deepgram (STT)
Testing
Currently manual testing via:
- Start servers:
npm run dev - Open http://localhost:5173
- Test WebSocket connection (green status indicator)
- Click "Send Ping" button to test communication
More testing guidance as features are implemented.
License
MIT