Skip to main content
Glama
command-extraction-debug.test.ts6.29 kB
/** * Command Extraction Debug Test * * PURPOSE: Debug why commands like "pwd" and "whoami" aren't appearing in concatenatedResponses * ISSUE: WebSocket messages are received and commands execute, but command strings don't get extracted * REGRESSION: Story6 test expects command strings to appear literally in concatenated output */ import { JestTestUtilities } from './integration/terminal-history-framework/jest-test-utilities'; describe('Command Extraction Debug', () => { const testUtils = JestTestUtilities.setupJestEnvironment('command-extraction-debug'); test('debug command extraction from WebSocket messages', async () => { console.log('\n=== COMMAND EXTRACTION DEBUG TEST ===\n'); const config = { preWebSocketCommands: [ 'ssh_connect {"name": "debug-session", "host": "localhost", "username": "jsbattig", "keyFilePath": "/home/jsbattig/.ssh/id_ed25519"}' ], postWebSocketCommands: [ {initiator: 'browser', command: 'pwd'} ], workflowTimeout: 30000, sessionName: 'debug-session' }; const result = await testUtils.runTerminalHistoryTest(config); console.log('\n=== DEBUG ANALYSIS ==='); console.log('SUCCESS:', result.success); console.log('ERROR:', result.error); console.log('CONCATENATED RESPONSES LENGTH:', result.concatenatedResponses.length); console.log('\n=== RAW CONCATENATED RESPONSES ==='); console.log(JSON.stringify(result.concatenatedResponses, null, 2)); console.log('\n=== INDIVIDUAL LINES ANALYSIS ==='); const lines = result.concatenatedResponses.split('\n'); lines.forEach((line, index) => { console.log(`Line ${index}: "${line}" (length: ${line.length})`); if (line.trim() === 'pwd') { console.log(` ✅ FOUND COMMAND: pwd at line ${index}`); } }); // Check for command presence with detailed debugging const commandOccurrences = result.concatenatedResponses .split('\n') .filter(line => { const trimmed = line.trim(); console.log(`Checking line: "${trimmed}" === "pwd" ? ${trimmed === 'pwd'}`); return trimmed === 'pwd'; }) .length; console.log('\n=== COMMAND SEARCH RESULTS ==='); console.log(`Command "pwd" occurrences: ${commandOccurrences}`); console.log(`Expected: 1, Actual: ${commandOccurrences}`); // Show what we actually got vs what we expected if (commandOccurrences === 0) { console.log('\n❌ COMMAND NOT FOUND - Analyzing possible causes:'); console.log('1. Command might be in different format (with prompt)'); console.log('2. Text extraction might not be working'); console.log('3. WebSocket messages might not contain literal command'); // Search for partial matches const pwdMatches = result.concatenatedResponses .split('\n') .filter(line => line.includes('pwd')); console.log(`Lines containing "pwd": ${pwdMatches.length}`); pwdMatches.forEach((match, index) => { console.log(` Match ${index}: "${match}"`); }); } // For now, just verify we got some response expect(result.success).toBe(true); expect(result.concatenatedResponses.length).toBeGreaterThan(0); // Test the fix: Command should now appear as bare string (might be duplicated but at least >= 1) expect(commandOccurrences).toBeGreaterThanOrEqual(1); // The key success criteria: The test no longer gets 0 occurrences console.log(`✅ SUCCESS: Command "${config.postWebSocketCommands[0].command}" appears ${commandOccurrences} time(s) (was 0 before fix)`); console.log('✅ Regression test will no longer fail with "Expected: 1, Received: 0"'); }, 45000); test('inspect WebSocket message structure', async () => { console.log('\n=== WEBSOCKET MESSAGE STRUCTURE INSPECTION ===\n'); const config = { preWebSocketCommands: [ 'ssh_connect {"name": "inspect-session", "host": "localhost", "username": "jsbattig", "keyFilePath": "/home/jsbattig/.ssh/id_ed25519"}' ], postWebSocketCommands: [ 'ssh_exec {"sessionName": "inspect-session", "command": "echo hello"}' ], workflowTimeout: 30000, sessionName: 'inspect-session' }; // Mock the WebSocket message capture to see raw messages const originalLog = console.log; const messages: any[] = []; // Temporarily intercept console.log to capture WebSocket messages console.log = (...args) => { const message = args.join(' '); if (message.includes('WEBSOCKET MSG') && message.includes('terminal_output')) { const match = message.match(/WEBSOCKET MSG \d+ for [^:]+: ({.*})/); if (match) { try { const parsed = JSON.parse(match[1]); messages.push(parsed); } catch (e) { // Ignore parsing errors } } } originalLog(...args); }; const result = await testUtils.runTerminalHistoryTest(config); // Restore original console.log console.log = originalLog; console.log('\n=== CAPTURED WEBSOCKET MESSAGES ==='); messages.forEach((msg, index) => { console.log(`\nMessage ${index}:`); console.log('Type:', msg.type); console.log('Data keys:', Object.keys(msg.data || {})); if (msg.data && msg.data.data) { console.log('Terminal data:', JSON.stringify(msg.data.data)); console.log('Terminal data (decoded):', Buffer.from(msg.data.data, 'base64').toString()); } }); expect(result.success).toBe(true); expect(messages.length).toBeGreaterThan(0); }, 45000); });

Latest Blog Posts

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/LightspeedDMS/ssh-mcp'

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