Skip to main content
Glama

MCP Console Automation Server

by ooples
WORKING_VERSION_ANALYSIS.md6.65 kB
# Working Version Analysis - console_execute_command ## Test Results Summary **Working Commit**: 33eb9e5 - "Fix: Remove 30-second timeout limitation and make it configurable" **Status**: ✅ CONFIRMED WORKING **Test Result**: `SUCCESS! Result: { output: 'Hello World\r\n', exitCode: 0 }` ## Key Architecture Differences ### 1. **Working Version (33eb9e5) - Event-Driven One-Shot Pattern** ```typescript async executeCommand(command: string, args?: string[], options?: Partial<SessionOptions>): Promise<{ output: string; exitCode?: number }> { // Create temporary session const sessionId = await this.createSession(sessionOptions); return new Promise((resolve, reject) => { const outputs: string[] = []; let timeoutHandle: NodeJS.Timeout | null = null; const timeoutMs = options?.timeout || 120000; // Configurable timeout const cleanup = () => { this.removeListener('console-event', handleEvent); if (timeoutHandle) clearTimeout(timeoutHandle); }; const handleEvent = (event: ConsoleEvent) => { if (event.sessionId !== sessionId) return; if (event.type === 'output') { outputs.push(event.data.data); } else if (event.type === 'stopped') { cleanup(); this.cleanupSession(sessionId); // Auto-cleanup resolve({ output: outputs.join(''), exitCode: event.data.exitCode }); } else if (event.type === 'error') { // Only reject on serious errors (connection, auth, network) if (event.data.error && ( event.data.error.includes('connection') || event.data.error.includes('authentication') || event.data.error.includes('timeout') || event.data.error.includes('network') )) { cleanup(); this.cleanupSession(sessionId); reject(new Error(`Session error: ${event.data.error}`)); } // Otherwise, treat errors as part of command output } }; // Set timeout with proper cleanup timeoutHandle = setTimeout(() => { cleanup(); this.stopSession(sessionId).then(() => { this.cleanupSession(sessionId); reject(new Error(`Command execution timeout after ${timeoutMs}ms`)); }); }, timeoutMs); this.on('console-event', handleEvent); }); } ``` ### 2. **Current Broken Version - Incomplete Implementation** The current master branch has a simplified ConsoleManager that: - Uses `node-pty` directly (native dependency issues) - Missing critical methods (`executeCommandInSession`, etc.) - Incomplete event system - Build compilation errors - Missing session lifecycle management ## Critical Success Factors in Working Version ### A. **Robust Session Lifecycle Management** - **One-shot session creation**: `createSession()` → execute → auto-cleanup - **Event-driven completion**: Waits for natural `stopped` event - **Automatic cleanup**: Session resources freed on completion - **Timeout protection**: Configurable timeout with proper cleanup ### B. **Sophisticated Error Handling** - **Error categorization**: Only serious errors (connection, auth) cause rejection - **Command output errors**: Treated as part of output, not execution failure - **Graceful degradation**: System continues functioning even with command failures ### C. **Event System Architecture** ```typescript // Listens for natural process events handleEvent = (event: ConsoleEvent) => { if (event.type === 'output') outputs.push(event.data.data); else if (event.type === 'stopped') resolve(result); } this.on('console-event', handleEvent); ``` ### D. **Configurable Timeout System** - **Default**: 120000ms (2 minutes) - **NOT 30 seconds** - **Configurable**: `options?.timeout || 120000` - **Proper cleanup**: Timeout triggers session stop + cleanup ## Protocol Integration The working version supports multiple protocols through a unified interface: - **Local Protocol**: Direct command execution - **SSH Protocol**: Remote command execution - **Docker Protocol**: Container command execution - **Kubernetes Protocol**: Pod command execution Each protocol emits standardized `console-event` messages that the `executeCommand` method processes uniformly. ## Why This Works ### 1. **Natural Process Lifecycle** Instead of trying to wait for process completion synchronously, it leverages the natural asynchronous event flow of process execution. ### 2. **Resource Management** Automatic session cleanup prevents resource leaks and ensures each command execution is isolated. ### 3. **Flexibility** The event-driven pattern allows handling various execution contexts (local, SSH, Docker, etc.) through the same interface. ### 4. **Robust Error Recovery** By categorizing errors and only failing on serious issues, the system is more resilient to temporary problems. ## Implementation Recommendations ### Immediate Actions: 1. **Revert to working implementation**: Use the session pattern from 33eb9e5 2. **Fix timeout configuration**: Ensure configurable timeouts (not hardcoded 30s) 3. **Restore event system**: Implement full ConsoleEvent system 4. **Session cleanup**: Implement automatic session resource cleanup ### Architecture Principles: 1. **Event-driven execution**: Never wait synchronously for command completion 2. **Session isolation**: Each command gets its own session context 3. **Automatic cleanup**: Resources must be freed automatically 4. **Error resilience**: Only fail on serious system errors, not command errors ## Technical Details ### Working Command Flow: 1. `executeCommand()` called 2. `createSession()` creates temporary session 3. Event listener established for 'console-event' 4. Session naturally executes command 5. Process events flow through protocol layer 6. 'stopped' event triggers resolution 7. Session automatically cleaned up ### Key Files in Working Version: - `src/core/ConsoleManager.ts`: Main implementation (lines 7652-7727) - Event system properly integrated - Protocol layer functioning - Session management working ## Conclusion The working version (33eb9e5) demonstrates a sophisticated, event-driven architecture for command execution that: - ✅ **Works reliably** for command execution - ✅ **Handles errors gracefully** - ✅ **Manages resources properly** - ✅ **Supports multiple protocols** - ✅ **Uses configurable timeouts** The current broken version appears to be an incomplete rewrite that lost these critical architectural patterns. **Recommendation**: Restore the working implementation from commit 33eb9e5 and build improvements on that foundation rather than attempting to rewrite from scratch.

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ooples/mcp-console-automation'

If you have feedback or need assistance with the MCP directory API, please join our Discord server