The Consolidated Terminal API unifies four separate terminal implementations into a single, cohesive system providing REST endpoints and WebSocket connections for secure terminal operations.
The new API consolidates features from:
- terminal.py: Main REST API endpoints
- simple_terminal_websocket.py: Simple WebSocket + workflow control
- secure_terminal_websocket.py: Security auditing + command logging
- base_terminal.py: PTY infrastructure and process management
/api/terminal/consolidated
- STANDARD: Default level, allows most commands
- ELEVATED: Blocks dangerous commands, requires confirmation for risky operations
- RESTRICTED: Blocks both dangerous and high-risk commands
Commands are automatically assessed for security risks:
- SAFE: Basic commands like
echo,pwd,ls - MODERATE: Commands requiring elevated privileges like
sudo,chmod - HIGH: Commands with redirection or complex operations
- DANGEROUS: Destructive commands like
rm -rf,dd, system shutdowns
POST /api/terminal/consolidated/sessions
Content-Type: application/json
{
"user_id": "string",
"security_level": "standard|elevated|restricted",
"enable_logging": boolean,
"enable_workflow_control": boolean,
"initial_directory": "string"
}Response:
{
"session_id": "uuid",
"status": "created",
"security_level": "standard",
"websocket_url": "/api/terminal/ws/{session_id}",
"created_at": "2025-08-20T08:45:00Z"
}GET /api/terminal/consolidated/sessionsResponse:
{
"sessions": [
{
"session_id": "uuid",
"user_id": "string",
"security_level": "standard",
"created_at": "timestamp",
"is_active": boolean
}
],
"total": 1,
"active": 1
}GET /api/terminal/consolidated/sessions/{session_id}Response:
{
"session_id": "uuid",
"config": {
"user_id": "string",
"security_level": "standard",
"enable_logging": boolean,
"enable_workflow_control": boolean,
"created_at": "timestamp"
},
"is_active": boolean,
"statistics": {
"connected_at": "timestamp",
"messages_sent": 0,
"messages_received": 0,
"commands_executed": 0
}
}DELETE /api/terminal/consolidated/sessions/{session_id}Response:
{
"session_id": "uuid",
"status": "deleted"
}POST /api/terminal/consolidated/command
Content-Type: application/json
{
"command": "string",
"description": "string",
"require_confirmation": boolean,
"timeout": 30.0,
"working_directory": "string",
"environment": {}
}Response:
{
"command": "echo test",
"risk_level": "safe",
"status": "assessed",
"message": "Command assessed as safe risk",
"requires_confirmation": false
}POST /api/terminal/consolidated/sessions/{session_id}/input
Content-Type: application/json
{
"text": "string",
"is_password": boolean
}POST /api/terminal/consolidated/sessions/{session_id}/signal/{signal_name}Supported signals: SIGINT, SIGTERM, SIGKILL, SIGSTOP, SIGCONT
GET /api/terminal/consolidated/audit/{session_id}Response:
{
"session_id": "uuid",
"audit_available": boolean,
"security_level": "standard",
"message": "Audit log access requires elevated permissions"
}ws://localhost:8443/api/terminal/consolidated/ws/{session_id}
{
"type": "input",
"text": "command to execute"
}{
"type": "ping"
}{
"type": "resize",
"rows": 24,
"cols": 80
}{
"type": "workflow_control",
"action": "pause|resume|approve_step|cancel",
"workflow_id": "string",
"step_id": "string",
"data": {}
}{
"type": "output",
"content": "command output",
"metadata": {
"session_id": "uuid",
"timestamp": 1692518400.0,
"terminal_type": "consolidated",
"security_level": "standard"
}
}{
"type": "security_warning",
"content": "Command blocked due to dangerous risk level: rm -rf /",
"risk_level": "dangerous",
"timestamp": 1692518400.0
}{
"type": "pong",
"timestamp": 1692518400.0
}{
"type": "error",
"content": "Error message",
"timestamp": 1692518400.0
}The consolidated API maintains backward compatibility with existing implementations:
ws://localhost:8443/api/terminal/consolidated/ws/simple/{session_id}
- Maps to STANDARD security level
- Logging disabled
- Workflow control enabled
ws://localhost:8443/api/terminal/consolidated/ws/secure/{session_id}
- Maps to ELEVATED security level
- Logging enabled
- Full audit trail
- File system destruction:
rm -r,rm -rf,sudo rm - Disk operations:
dd if=,mkfs,fdisk - Permission changes:
chmod 777,chown -R - System operations:
shutdown,reboot,halt - Network security:
iptables -F,ufw disable
- Privilege escalation:
sudo,su - - Package management:
apt-get install,pip install - System services:
systemctl,service - Mount operations:
mount,umount
When logging is enabled, the system tracks:
- All commands executed with timestamps
- Risk level assessments
- User roles and security levels
- Message types and workflow actions
- Terminal resize events
- Command output lengths
{
"detail": "Session not found",
"status_code": 404
}{
"detail": "Session not active",
"status_code": 404
}{
"detail": "Invalid signal: INVALID",
"status_code": 400
}import TerminalService from './services/TerminalService.js';
const terminal = new TerminalService();
// Create session
const sessionId = await terminal.createSession();
// Connect WebSocket
await terminal.connect(sessionId, {
onOutput: (data) => {
console.log('Terminal output:', data.content);
},
onStatusChange: (status) => {
console.log('Connection status:', status);
},
onError: (error) => {
console.error('Terminal error:', error);
}
});
// Send command
terminal.sendInput(sessionId, 'ls -la');
// Close session
await terminal.closeSession(sessionId);import asyncio
import aiohttp
import websockets
import json
async def terminal_example():
# Create session
async with aiohttp.ClientSession() as session:
async with session.post(
'https://localhost:8443/api/terminal/consolidated/sessions',
json={'user_id': 'python_user', 'security_level': 'standard'}
) as response:
session_data = await response.json()
session_id = session_data['session_id']
# Connect WebSocket
ws_url = f'ws://localhost:8443/api/terminal/consolidated/ws/{session_id}'
async with websockets.connect(ws_url) as websocket:
# Send command
await websocket.send(json.dumps({
'type': 'input',
'text': 'echo Hello World'
}))
# Receive output
response = await websocket.recv()
data = json.loads(response)
print(f"Output: {data['content']}")
# Run example
asyncio.run(terminal_example())GET /api/terminal/consolidated/Response:
{
"name": "Consolidated Terminal API",
"version": "1.0.0",
"description": "Unified terminal API combining all previous implementations",
"features": [
"REST API for session management",
"WebSocket-based real-time terminal access",
"Security assessment and command auditing",
"Workflow automation control integration",
"Multi-level security controls",
"Backward compatibility with existing endpoints"
],
"endpoints": {
"sessions": "/api/terminal/sessions",
"websocket_primary": "/api/terminal/ws/{session_id}",
"websocket_simple": "/api/terminal/ws/simple/{session_id}",
"websocket_secure": "/api/terminal/ws/secure/{session_id}"
},
"security_levels": ["standard", "elevated", "restricted"],
"consolidated_from": [
"terminal.py",
"simple_terminal_websocket.py",
"secure_terminal_websocket.py",
"base_terminal.py"
]
}Replace WebSocket URL:
// Old
ws://localhost:8443/api/terminal/ws/simple/{session_id}
// New (backward compatible)
ws://localhost:8443/api/terminal/consolidated/ws/simple/{session_id}
// Recommended
ws://localhost:8443/api/terminal/consolidated/ws/{session_id}Update to use elevated security:
// Create session with elevated security
await fetch('/api/terminal/consolidated/sessions', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
security_level: 'elevated',
enable_logging: true
})
});Update base URL:
// Old
/api/terminal/sessions
// New
/api/terminal/consolidated/sessions- All operations are async and non-blocking
- Session creation: < 100ms
- Command execution: < 50ms for simple commands
- WebSocket latency: < 10ms for local connections
- Maximum concurrent sessions: 100 (configurable)
- Command history: Limited to 1000 entries per session
- Audit log: Configurable retention period
- Verify backend is running:
./run_agent.sh --test-mode - Check WebSocket URL format
- Ensure session exists before connecting
- Verify CORS settings for cross-origin requests
- Check command risk level assessment
- Verify security level permissions
- Review audit logs for blocked commands
- Ensure proper message format
- Monitor concurrent session count
- Check command history size
- Review audit log retention settings
- Verify async operation implementation