How the Process Detection Utility Works in DesktopCommanderMCP: Analyzing listProcesses and REPL State
The DesktopCommanderMCP process detection utility interprets raw console output to determine if a process is running, waiting for input, or finished, while listProcesses queries the operating system using platform-specific commands like ps aux or tasklist to identify running applications.
The DesktopCommanderMCP repository provides a TypeScript-based process management system that combines real-time REPL session monitoring with system process enumeration. This toolset allows the MCP server to distinguish between interactive processes awaiting input and terminated sessions, while the listProcesses function exposes running applications across Windows and Unix-like platforms.
Core Process Detection Architecture
The process detection utility resides in src/utils/process-detection.ts and implements heuristic analysis to classify process states without requiring deep OS integration.
REPL Prompts and Pattern Matching
The utility defines three critical data structures to recognize process behavior:
- REPL_PROMPTS: A collection of common interactive prompts (Python
>>>, Node>, R>, etc.) defined at lines 15-24 that signal a process waiting for user input - ERROR_COMPLETION_PATTERNS: Regular expressions matching typical error messages (lines 27-40) that indicate process termination with failure
- COMPLETION_INDICATORS: Explicit termination strings like "Process finished" or "Exit code" (lines 42-49) that confirm successful completion
These constants enable the utility to parse raw stdout content and categorize process states accurately.
State Analysis Logic
The exported analyzeProcessState(output, pid?) function implements a five-step decision tree to determine process status:
- Empty check: Returns "running" if no output exists
- Prompt detection: Scans the final line for REPL prompts; if found, returns
isWaitingForInput: true - Completion detection: Validates against
COMPLETION_INDICATORSto setisFinished: true - Error analysis: Applies
ERROR_COMPLETION_PATTERNSto recent lines, marking finished unless a prompt suggests the process remains interactive - Default state: Assumes still running if no patterns match
The function returns a ProcessState object consumed by downstream components to render human-readable status messages.
Output Cleaning and Formatting
Two additional exports support clean output presentation:
cleanProcessOutput: Strips echoed input lines and prompt symbols from raw terminal outputformatProcessStateMessage: ConvertsProcessStateobjects into concise strings (e.g., "Process 1234 is waiting for input (detected: '> ')")
These utilities are imported by src/tools/improved-process-tools.ts and src/terminal-manager.ts to handle REPL-style interactions.
Enumerating System Processes with listProcesses
While the detection utility monitors individual process output, the listProcesses function in src/tools/process.ts enumerates all system applications.
Platform-Specific Command Execution
The function uses Node's os.platform() to select the appropriate system command:
- Windows: Executes
tasklist - Unix/Linux/macOS: Executes
ps aux
The selected command runs asynchronously via child_process.exec wrapped with util.promisify (line 10), ensuring non-blocking operation within the MCP server.
Data Extraction and Formatting
After executing the platform command, listProcesses processes the stdout through several transformation steps:
- Splits output into lines and removes the header row using
.slice(1) - Parses each line with a whitespace regex (
line.split(/\s+/)) - Constructs
ProcessInfoobjects containing:- PID: Extracted from
parts[1] - Command: Taken from
parts[parts.length-1] - CPU: Parsed from
parts[2] - Memory: Parsed from
parts[3]
- PID: Extracted from
The function returns a ServerResult object (lines 28-32) containing formatted text with entries like "PID: 342, Command: node, CPU: 0.2, Memory: 1.3". If execution fails, it returns an error result with isError: true (lines 34-38).
Practical Implementation Examples
The following examples demonstrate usage of both utilities:
Detecting REPL State
import { analyzeProcessState } from './src/utils/process-detection.js';
const output = `>>> print("hello")\nhello\n>>> `;
const state = analyzeProcessState(output, 1234);
console.log(state);
// => { isWaitingForInput: true, isFinished: false, isRunning: true, detectedPrompt: '>>> ' }
Listing Running Processes
import { listProcesses } from './src/tools/process.js';
async function showProcesses() {
const result = await listProcesses();
console.log(result.content[0].text);
}
// Output:
// PID: 1, Command: init, CPU: 0.0, Memory: 0.1
// PID: 342, Command: node, CPU: 0.2, Memory: 1.3
Summary
- The process detection utility in
src/utils/process-detection.tsanalyzes console output usingREPL_PROMPTS,ERROR_COMPLETION_PATTERNS, andCOMPLETION_INDICATORSto classify process states analyzeProcessStateimplements a five-step heuristic to determine if a process is running, waiting for input, or finishedlistProcessesinsrc/tools/process.tsexecutestasklistorps auxbased on platform to enumerate system applications- Both utilities return structured data objects that integrate with the MCP server API for process monitoring and management
Frequently Asked Questions
How does the process detection utility determine if a REPL is waiting for input?
The utility scans the final line of output against known prompt strings defined in REPL_PROMPTS (such as Python's >>> or Node's >). When a match is detected in analyzeProcessState, the function returns a state object with isWaitingForInput: true, indicating the process requires user interaction before continuing execution.
What platform-specific commands does listProcesses use to identify running applications?
The function checks os.platform() to select between Windows tasklist and Unix-style ps aux commands. These system utilities provide comprehensive process listings that the function parses to extract PID, command name, CPU usage, and memory consumption for each running application.
Can the process detection utility identify when a process has crashed rather than completed normally?
Yes, the ERROR_COMPLETION_PATTERNS regular expressions match typical error message formats in the output tail. When detected without a corresponding REPL prompt, analyzeProcessState marks the process as finished with an error state, distinguishing between graceful termination and crash conditions.
Where are the helper functions for cleaning process output located?
The cleanProcessOutput and formatProcessStateMessage utilities are exported from src/utils/process-detection.ts alongside analyzeProcessState. These functions strip echoed input lines from raw terminal output and convert ProcessState objects into human-readable status messages for MCP server responses.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →