claude-code-remote-remake/smart-monitor.js

294 lines
11 KiB
JavaScript
Raw Normal View History

Telegram&Line support (#17) * feat: Add LINE and Telegram messaging support This major enhancement extends Claude Code Remote with multi-platform messaging support: ## 🚀 New Features ### LINE Messaging Support - LINE Bot API integration with token-based commands - Secure webhook handler with signature verification - Session management with 24-hour expiration - Support for both individual and group chats - User/Group ID whitelist security ### Telegram Bot Support - Telegram Bot API with interactive buttons - Slash command support (/cmd TOKEN command) - Callback query handling for better UX - Group and private chat support - Chat ID-based authorization ### Multi-Platform Architecture - Unified notification system supporting all platforms - Platform-agnostic session management - Configurable channel enabling/disabling - Parallel webhook server support ## 🛠️ Technical Implementation ### Core Components - `src/channels/line/` - LINE messaging implementation - `src/channels/telegram/` - Telegram bot implementation - `src/utils/controller-injector.js` - Command injection utility - Multi-platform webhook servers with Express.js ### Configuration & Documentation - Updated `.env.example` with all platform options - Comprehensive setup guides for each platform - Testing guide with ngrok instructions - Updated README with multi-platform support ### Developer Experience - npm scripts for easy platform startup - Unified webhook launcher (`start-all-webhooks.js`) - Individual platform launchers - Enhanced error handling and logging ## 🔧 Usage Examples **Telegram:** `/cmd ABC12345 analyze this code` **LINE:** `Token ABC12345 analyze this code` **Email:** Reply to notification emails ## 📋 Backward Compatibility - All existing email functionality preserved - Configuration migration path provided - No breaking changes to existing hooks 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * feat: Complete Telegram Remote Control System with Direct Chat Mode ### 🚀 Major Features Added - **Direct Chat Mode**: Users can chat with Claude naturally without /cmd tokens - **Smart Monitoring**: Intelligent response detection with historical processing - **One-Click Startup**: Complete system management via startup script - **Auto-Notification**: Real-time Claude response detection and Telegram delivery ### 📱 Telegram Integration - `telegram-direct-mode.js`: Direct conversation interface - `telegram-polling.js`: Command polling with token validation - Enhanced notification system with markdown formatting ### 🧠 Smart Monitoring System - `smart-monitor.js`: Advanced response detection with history awareness - `simple-monitor.js`: Lightweight monitoring alternative - `auto-notification-daemon.js`: Background notification service ### 🛠️ System Management - `start-telegram-claude.sh`: Complete service management script - Environment validation and dependency checking - Color-coded status reporting and log management - Process lifecycle management (start/stop/restart/status) ### 📖 Documentation & Testing - `TELEGRAM_CLAUDE_GUIDE.md`: Comprehensive user guide - Complete test suite for all components - Usage examples and troubleshooting guide ### 🔧 Core Improvements - Enhanced `controller-injector.js` with proper Enter key handling - Updated `tmux-monitor.js` with real-time output monitoring - Improved error handling and logging throughout - Session management with automatic cleanup ### 🎯 Key Capabilities - **Seamless Communication**: Direct Telegram ⟷ Claude integration - **Full Automation**: No manual intervention required - **Robust Monitoring**: Never miss Claude responses - **Easy Deployment**: Single script startup and management - **Multi-Modal Support**: Ready for LINE integration expansion ### 📊 System Architecture ``` User → Telegram Bot → Direct Injection → Claude Session → Smart Monitor → Auto Notification → User ``` This completes the transformation from email-based to messaging-app-based remote Claude control, providing a modern, efficient, and user-friendly interface for remote AI interaction. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * docs: Enhance documentation and smart monitoring system - Add comprehensive CLAUDE.md for Claude Code development guidance - Update README.md with multi-platform focus and improved instructions - Enhance smart-monitor.js with auto-approval for tool permissions - Improve start-telegram-claude.sh with better tmux session management - Add auto-approver.js for automated tool permission handling Key improvements: - Multi-platform documentation (Telegram, LINE, Email, Local) - Enhanced troubleshooting and command reference sections - Smart monitoring with historical response detection - Automated tool permission approval workflow - Better tmux integration and session management 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * chore: Add CLAUDE.md to .gitignore and remove from tracking - Add CLAUDE.md to .gitignore under "Claude Code development files" section - Remove CLAUDE.md from git tracking while preserving local file - CLAUDE.md should remain as local development documentation only 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * feat: Complete Telegram integration with multi-channel notifications - ✅ Enhanced Telegram bot with smart buttons for personal/group chats - ✅ Multi-channel notification system (Desktop, Telegram, Email, LINE) - ✅ Smart sound alerts with customizable audio feedback - ✅ Real-time command injection with tmux session management - ✅ Intelligent session detection and conversation content extraction - ✅ Unified README documentation with complete setup guides - 🧹 Clean up legacy files and consolidate documentation - 📱 Add setup scripts for easy Telegram configuration - 🔧 Enhance webhook system with improved error handling 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * Update processed messages --------- Co-authored-by: laihenyi <henyi@henyi.org> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: laihenyi <laihenyi@users.noreply.github.com>
2025-08-02 04:21:26 +08:00
#!/usr/bin/env node
/**
* Smart Monitor - 智能監控器能檢測歷史回應和新回應
* 解決監控器錯過已完成回應的問題
*/
const path = require('path');
const fs = require('fs');
const dotenv = require('dotenv');
const { execSync } = require('child_process');
// Load environment variables
const envPath = path.join(__dirname, '.env');
if (fs.existsSync(envPath)) {
dotenv.config({ path: envPath });
}
const TelegramChannel = require('./src/channels/telegram/telegram');
class SmartMonitor {
constructor() {
2025-09-04 21:02:19 +08:00
this.sessionName = process.env.TMUX_SESSION || 'claude-session';
Telegram&Line support (#17) * feat: Add LINE and Telegram messaging support This major enhancement extends Claude Code Remote with multi-platform messaging support: ## 🚀 New Features ### LINE Messaging Support - LINE Bot API integration with token-based commands - Secure webhook handler with signature verification - Session management with 24-hour expiration - Support for both individual and group chats - User/Group ID whitelist security ### Telegram Bot Support - Telegram Bot API with interactive buttons - Slash command support (/cmd TOKEN command) - Callback query handling for better UX - Group and private chat support - Chat ID-based authorization ### Multi-Platform Architecture - Unified notification system supporting all platforms - Platform-agnostic session management - Configurable channel enabling/disabling - Parallel webhook server support ## 🛠️ Technical Implementation ### Core Components - `src/channels/line/` - LINE messaging implementation - `src/channels/telegram/` - Telegram bot implementation - `src/utils/controller-injector.js` - Command injection utility - Multi-platform webhook servers with Express.js ### Configuration & Documentation - Updated `.env.example` with all platform options - Comprehensive setup guides for each platform - Testing guide with ngrok instructions - Updated README with multi-platform support ### Developer Experience - npm scripts for easy platform startup - Unified webhook launcher (`start-all-webhooks.js`) - Individual platform launchers - Enhanced error handling and logging ## 🔧 Usage Examples **Telegram:** `/cmd ABC12345 analyze this code` **LINE:** `Token ABC12345 analyze this code` **Email:** Reply to notification emails ## 📋 Backward Compatibility - All existing email functionality preserved - Configuration migration path provided - No breaking changes to existing hooks 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * feat: Complete Telegram Remote Control System with Direct Chat Mode ### 🚀 Major Features Added - **Direct Chat Mode**: Users can chat with Claude naturally without /cmd tokens - **Smart Monitoring**: Intelligent response detection with historical processing - **One-Click Startup**: Complete system management via startup script - **Auto-Notification**: Real-time Claude response detection and Telegram delivery ### 📱 Telegram Integration - `telegram-direct-mode.js`: Direct conversation interface - `telegram-polling.js`: Command polling with token validation - Enhanced notification system with markdown formatting ### 🧠 Smart Monitoring System - `smart-monitor.js`: Advanced response detection with history awareness - `simple-monitor.js`: Lightweight monitoring alternative - `auto-notification-daemon.js`: Background notification service ### 🛠️ System Management - `start-telegram-claude.sh`: Complete service management script - Environment validation and dependency checking - Color-coded status reporting and log management - Process lifecycle management (start/stop/restart/status) ### 📖 Documentation & Testing - `TELEGRAM_CLAUDE_GUIDE.md`: Comprehensive user guide - Complete test suite for all components - Usage examples and troubleshooting guide ### 🔧 Core Improvements - Enhanced `controller-injector.js` with proper Enter key handling - Updated `tmux-monitor.js` with real-time output monitoring - Improved error handling and logging throughout - Session management with automatic cleanup ### 🎯 Key Capabilities - **Seamless Communication**: Direct Telegram ⟷ Claude integration - **Full Automation**: No manual intervention required - **Robust Monitoring**: Never miss Claude responses - **Easy Deployment**: Single script startup and management - **Multi-Modal Support**: Ready for LINE integration expansion ### 📊 System Architecture ``` User → Telegram Bot → Direct Injection → Claude Session → Smart Monitor → Auto Notification → User ``` This completes the transformation from email-based to messaging-app-based remote Claude control, providing a modern, efficient, and user-friendly interface for remote AI interaction. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * docs: Enhance documentation and smart monitoring system - Add comprehensive CLAUDE.md for Claude Code development guidance - Update README.md with multi-platform focus and improved instructions - Enhance smart-monitor.js with auto-approval for tool permissions - Improve start-telegram-claude.sh with better tmux session management - Add auto-approver.js for automated tool permission handling Key improvements: - Multi-platform documentation (Telegram, LINE, Email, Local) - Enhanced troubleshooting and command reference sections - Smart monitoring with historical response detection - Automated tool permission approval workflow - Better tmux integration and session management 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * chore: Add CLAUDE.md to .gitignore and remove from tracking - Add CLAUDE.md to .gitignore under "Claude Code development files" section - Remove CLAUDE.md from git tracking while preserving local file - CLAUDE.md should remain as local development documentation only 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * feat: Complete Telegram integration with multi-channel notifications - ✅ Enhanced Telegram bot with smart buttons for personal/group chats - ✅ Multi-channel notification system (Desktop, Telegram, Email, LINE) - ✅ Smart sound alerts with customizable audio feedback - ✅ Real-time command injection with tmux session management - ✅ Intelligent session detection and conversation content extraction - ✅ Unified README documentation with complete setup guides - 🧹 Clean up legacy files and consolidate documentation - 📱 Add setup scripts for easy Telegram configuration - 🔧 Enhance webhook system with improved error handling 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * Update processed messages --------- Co-authored-by: laihenyi <henyi@henyi.org> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: laihenyi <laihenyi@users.noreply.github.com>
2025-08-02 04:21:26 +08:00
this.lastOutput = '';
this.processedResponses = new Set(); // 記錄已處理的回應
this.checkInterval = 1000; // Check every 1 second
this.isRunning = false;
this.startupTime = Date.now();
// Setup Telegram
if (process.env.TELEGRAM_BOT_TOKEN && process.env.TELEGRAM_CHAT_ID) {
const telegramConfig = {
botToken: process.env.TELEGRAM_BOT_TOKEN,
chatId: process.env.TELEGRAM_CHAT_ID
};
this.telegram = new TelegramChannel(telegramConfig);
console.log('📱 Smart Monitor configured successfully');
} else {
console.log('❌ Telegram not configured');
process.exit(1);
}
}
start() {
this.isRunning = true;
console.log(`🧠 Starting smart monitor for session: ${this.sessionName}`);
// Check for any unprocessed responses on startup
this.checkForUnprocessedResponses();
// Initial capture
this.lastOutput = this.captureOutput();
// Start monitoring
this.monitor();
}
async checkForUnprocessedResponses() {
console.log('🔍 Checking for unprocessed responses...');
const currentOutput = this.captureOutput();
const responses = this.extractAllResponses(currentOutput);
// Check if there are recent responses (within 5 minutes) that might be unprocessed
const recentResponses = responses.filter(response => {
const responseAge = Date.now() - this.startupTime;
return responseAge < 5 * 60 * 1000; // 5 minutes
});
if (recentResponses.length > 0) {
console.log(`🎯 Found ${recentResponses.length} potentially unprocessed responses`);
// Send notification for the most recent response
const latestResponse = recentResponses[recentResponses.length - 1];
await this.sendNotificationForResponse(latestResponse);
} else {
console.log('✅ No unprocessed responses found');
}
}
captureOutput() {
try {
return execSync(`tmux capture-pane -t ${this.sessionName} -p`, {
encoding: 'utf8',
stdio: ['ignore', 'pipe', 'ignore']
});
} catch (error) {
console.error('Error capturing tmux:', error.message);
return '';
}
}
autoApproveDialog() {
try {
console.log('🤖 Auto-approving Claude tool usage dialog...');
// Send "1" to select the first option (usually "Yes")
execSync(`tmux send-keys -t ${this.sessionName} '1'`, { encoding: 'utf8' });
setTimeout(() => {
execSync(`tmux send-keys -t ${this.sessionName} Enter`, { encoding: 'utf8' });
}, 100);
console.log('✅ Auto-approval sent successfully');
} catch (error) {
console.error('❌ Failed to auto-approve dialog:', error.message);
}
}
extractAllResponses(content) {
const lines = content.split('\n');
const responses = [];
for (let i = 0; i < lines.length; i++) {
const line = lines[i].trim();
// Look for standard Claude responses
if (line.startsWith('⏺ ') && line.length > 2) {
const responseText = line.substring(2).trim();
// Find the corresponding user question
let userQuestion = 'Recent command';
for (let j = i - 1; j >= 0; j--) {
const prevLine = lines[j].trim();
if (prevLine.startsWith('> ') && prevLine.length > 2) {
userQuestion = prevLine.substring(2).trim();
break;
}
}
responses.push({
userQuestion,
claudeResponse: responseText,
lineIndex: i,
responseId: `${userQuestion}-${responseText}`.substring(0, 50),
type: 'standard'
});
}
// Look for interactive dialogs/tool confirmations
if (line.includes('Do you want to proceed?') ||
line.includes(' 1. Yes') ||
line.includes('Tool use') ||
(line.includes('│') && (line.includes('serena') || line.includes('MCP') || line.includes('initial_instructions')))) {
// Check if this is part of a tool use dialog
let dialogContent = '';
let userQuestion = 'Recent command';
// Look backward to find the start of the dialog and user question
for (let j = i; j >= Math.max(0, i - 50); j--) {
const prevLine = lines[j];
if (prevLine.includes('╭') || prevLine.includes('Tool use')) {
// Found start of dialog box, now collect all content
for (let k = j; k <= Math.min(lines.length - 1, i + 20); k++) {
if (lines[k].includes('╰')) {
dialogContent += lines[k] + '\n';
break; // End of dialog box
}
dialogContent += lines[k] + '\n';
}
break;
}
// Look for user question
if (prevLine.startsWith('> ') && prevLine.length > 2) {
userQuestion = prevLine.substring(2).trim();
}
}
if (dialogContent.length > 50) { // Only if we found substantial dialog
// Auto-approve the dialog instead of asking user to go to iTerm2
this.autoApproveDialog();
responses.push({
userQuestion,
claudeResponse: 'Claude requested tool permission - automatically approved. Processing...',
lineIndex: i,
responseId: `dialog-${userQuestion}-${Date.now()}`.substring(0, 50),
type: 'interactive',
fullDialog: dialogContent.substring(0, 500)
});
break; // Only send one dialog notification per check
}
}
}
return responses;
}
async monitor() {
while (this.isRunning) {
await this.sleep(this.checkInterval);
const currentOutput = this.captureOutput();
if (currentOutput !== this.lastOutput) {
console.log('📝 Output changed, checking for new responses...');
const oldResponses = this.extractAllResponses(this.lastOutput);
const newResponses = this.extractAllResponses(currentOutput);
// Find truly new responses
const newResponseIds = new Set(newResponses.map(r => r.responseId));
const oldResponseIds = new Set(oldResponses.map(r => r.responseId));
const actuallyNewResponses = newResponses.filter(response =>
!oldResponseIds.has(response.responseId) &&
!this.processedResponses.has(response.responseId)
);
if (actuallyNewResponses.length > 0) {
console.log(`🎯 Found ${actuallyNewResponses.length} new responses`);
for (const response of actuallyNewResponses) {
await this.sendNotificationForResponse(response);
this.processedResponses.add(response.responseId);
}
} else {
console.log(' No new responses detected');
}
this.lastOutput = currentOutput;
}
}
}
async sendNotificationForResponse(response) {
try {
console.log('📤 Sending notification for response:', response.claudeResponse.substring(0, 50) + '...');
const notification = {
type: 'completed',
title: 'Claude Response Ready',
message: 'Claude has responded to your command',
project: 'claude-code-line',
metadata: {
userQuestion: response.userQuestion,
claudeResponse: response.claudeResponse,
tmuxSession: this.sessionName,
workingDirectory: process.cwd(),
timestamp: new Date().toISOString(),
autoDetected: true
}
};
const result = await this.telegram.send(notification);
if (result) {
console.log('✅ Notification sent successfully');
} else {
console.log('❌ Failed to send notification');
}
} catch (error) {
console.error('❌ Notification error:', error.message);
}
}
sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
stop() {
this.isRunning = false;
console.log('⏹️ Smart Monitor stopped');
}
getStatus() {
return {
isRunning: this.isRunning,
sessionName: this.sessionName,
processedCount: this.processedResponses.size,
uptime: Math.floor((Date.now() - this.startupTime) / 1000) + 's'
};
}
}
// Handle graceful shutdown
const monitor = new SmartMonitor();
process.on('SIGINT', () => {
console.log('\n🛑 Shutting down...');
monitor.stop();
process.exit(0);
});
process.on('SIGTERM', () => {
console.log('\n🛑 Shutting down...');
monitor.stop();
process.exit(0);
});
// Start monitoring
2025-09-04 21:02:19 +08:00
monitor.start();