Add 260+ Claude Code skills from skills.sh
Complete collection of AI agent skills including: - Frontend Development (Vue, React, Next.js, Three.js) - Backend Development (NestJS, FastAPI, Node.js) - Mobile Development (React Native, Expo) - Testing (E2E, frontend, webapp) - DevOps (GitHub Actions, CI/CD) - Marketing (SEO, copywriting, analytics) - Security (binary analysis, vulnerability scanning) - And many more... Synchronized from: https://skills.sh/ Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
346
brainstorming/.agent/workspace/enhanced-terminal-service.cjs
Normal file
346
brainstorming/.agent/workspace/enhanced-terminal-service.cjs
Normal file
@@ -0,0 +1,346 @@
|
||||
/**
|
||||
* Enhanced Terminal Service
|
||||
* Integrates modular tool system with intent analysis for agentic chat
|
||||
*
|
||||
* This service provides:
|
||||
* - Modular tool system with registry
|
||||
* - Enhanced intent analysis
|
||||
* - Automatic error handling and output formatting
|
||||
* - Execution history and statistics
|
||||
* - Security checks and validation
|
||||
*/
|
||||
|
||||
const { ToolRegistry } = require('./tool-base.cjs');
|
||||
const { ShellTool, StreamingShellTool } = require('./shell-tool.cjs');
|
||||
const { FileOperationTool } = require('./file-tool.cjs');
|
||||
const { IntentAnalyzer } = require('./intent-analyzer.cjs');
|
||||
|
||||
class EnhancedTerminalService {
|
||||
constructor(config = {}) {
|
||||
this.config = {
|
||||
defaultTimeout: config.defaultTimeout || 30000,
|
||||
maxOutputSize: config.maxOutputSize || 100000,
|
||||
enableSecurity: config.enableSecurity !== false,
|
||||
enableHistory: config.enableHistory !== false,
|
||||
enableTelemetry: config.enableTelemetry !== false,
|
||||
...config
|
||||
};
|
||||
|
||||
// Initialize tool registry
|
||||
this.registry = new ToolRegistry();
|
||||
|
||||
// Initialize intent analyzer
|
||||
this.analyzer = new IntentAnalyzer({
|
||||
tools: [],
|
||||
history: []
|
||||
});
|
||||
|
||||
// Initialize stats
|
||||
this.stats = {
|
||||
totalCommands: 0,
|
||||
successfulCommands: 0,
|
||||
failedCommands: 0,
|
||||
commandByType: {},
|
||||
avgResponseTime: 0
|
||||
};
|
||||
|
||||
// Setup default tools
|
||||
this.setupDefaultTools();
|
||||
|
||||
// Setup middleware
|
||||
this.setupMiddleware();
|
||||
}
|
||||
|
||||
/**
|
||||
* Register default tools
|
||||
*/
|
||||
setupDefaultTools() {
|
||||
// Shell command tool
|
||||
this.registry.register(new ShellTool({
|
||||
defaultTimeout: this.config.defaultTimeout,
|
||||
maxOutputSize: this.config.maxOutputSize
|
||||
}));
|
||||
|
||||
// Streaming shell for long commands
|
||||
this.registry.register(new StreamingShellTool({
|
||||
defaultTimeout: this.config.defaultTimeout
|
||||
}));
|
||||
|
||||
// File operations tool
|
||||
this.registry.register(new FileOperationTool({
|
||||
maxFileSize: this.config.maxFileSize,
|
||||
allowedPaths: this.config.allowedPaths
|
||||
}));
|
||||
|
||||
// Update analyzer with available tools
|
||||
this.analyzer.setTools(this.registry.list());
|
||||
}
|
||||
|
||||
/**
|
||||
* Setup execution middleware
|
||||
*/
|
||||
setupMiddleware() {
|
||||
// Logging middleware
|
||||
this.registry.use({
|
||||
before: async (toolName, params) => {
|
||||
console.log(`[EnhancedTerminal] Executing: ${toolName}`, {
|
||||
params: JSON.stringify(params).substring(0, 100)
|
||||
});
|
||||
},
|
||||
after: async (toolName, params, result) => {
|
||||
if (result.success) {
|
||||
console.log(`[EnhancedTerminal] Success: ${toolName}`);
|
||||
} else {
|
||||
console.error(`[EnhancedTerminal] Failed: ${toolName}`, result.error?.message);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Telemetry middleware
|
||||
if (this.config.enableTelemetry) {
|
||||
this.registry.use({
|
||||
after: async (toolName, params, result) => {
|
||||
this.recordTelemetry(toolName, result);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute a command with automatic intent analysis
|
||||
*
|
||||
* @param {string} input - User input or command
|
||||
* @param {Object} options - Execution options
|
||||
* @returns {Promise<Object>} Execution result
|
||||
*/
|
||||
async execute(input, options = {}) {
|
||||
const startTime = Date.now();
|
||||
|
||||
try {
|
||||
// Analyze intent
|
||||
const intent = this.analyzer.analyze(input);
|
||||
|
||||
// Check if intent is valid (has sufficient confidence and a tool)
|
||||
const isValid = intent.confidence > 0.3 && intent.tool;
|
||||
if (!isValid) {
|
||||
return {
|
||||
success: false,
|
||||
output: 'Could not determine command intent',
|
||||
intent: intent,
|
||||
error: 'Invalid intent'
|
||||
};
|
||||
}
|
||||
|
||||
// Execute with detected tool
|
||||
const result = await this.registry.execute(intent.tool, intent.parameters);
|
||||
|
||||
// Learn from execution
|
||||
this.analyzer.learn(input, result);
|
||||
|
||||
// Update stats
|
||||
this.updateStats(intent.intent, result, Date.now() - startTime);
|
||||
|
||||
// Format output
|
||||
return {
|
||||
success: result.success,
|
||||
output: result.output,
|
||||
data: result.data,
|
||||
intent: intent,
|
||||
duration: Date.now() - startTime,
|
||||
metadata: result.metadata
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
success: false,
|
||||
output: error.message,
|
||||
error: error.message,
|
||||
duration: Date.now() - startTime
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute a specific tool directly
|
||||
*
|
||||
* @param {string} toolName - Name of tool to execute
|
||||
* @param {Object} parameters - Tool parameters
|
||||
* @returns {Promise<Object>} Execution result
|
||||
*/
|
||||
async executeTool(toolName, parameters = {}) {
|
||||
const startTime = Date.now();
|
||||
|
||||
try {
|
||||
const result = await this.registry.execute(toolName, parameters);
|
||||
|
||||
return {
|
||||
success: result.success,
|
||||
output: result.output,
|
||||
data: result.data,
|
||||
duration: Date.now() - startTime,
|
||||
metadata: result.metadata
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
success: false,
|
||||
output: error.message,
|
||||
error: error.message,
|
||||
duration: Date.now() - startTime
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute a shell command directly
|
||||
*
|
||||
* @param {string} command - Shell command to execute
|
||||
* @param {Object} options - Execution options
|
||||
* @returns {Promise<Object>} Execution result
|
||||
*/
|
||||
async executeShell(command, options = {}) {
|
||||
return this.executeTool('shell', {
|
||||
command,
|
||||
cwd: options.cwd,
|
||||
timeout: options.timeout,
|
||||
env: options.env
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Get command suggestions based on history
|
||||
*
|
||||
* @param {string} input - Partial input
|
||||
* @returns {Array<string>} Suggestions
|
||||
*/
|
||||
getSuggestions(input = '') {
|
||||
return this.analyzer.getSuggestions(input);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get execution history
|
||||
*
|
||||
* @param {Object} options - Query options
|
||||
* @returns {Array} History records
|
||||
*/
|
||||
getHistory(options = {}) {
|
||||
return this.registry.getHistory(options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get service statistics
|
||||
*
|
||||
* @returns {Object} Statistics
|
||||
*/
|
||||
getStats() {
|
||||
return {
|
||||
...this.stats,
|
||||
registry: this.registry.getStats(),
|
||||
tools: this.registry.listMetadata()
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Get available tools
|
||||
*
|
||||
* @returns {Array} Tool metadata
|
||||
*/
|
||||
getAvailableTools() {
|
||||
return this.registry.listMetadata();
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a custom tool
|
||||
*
|
||||
* @param {BaseTool} tool - Tool to register
|
||||
*/
|
||||
addTool(tool) {
|
||||
this.registry.register(tool);
|
||||
this.analyzer.setTools(this.registry.list());
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update service configuration
|
||||
*
|
||||
* @param {Object} updates - Configuration updates
|
||||
*/
|
||||
updateConfig(updates) {
|
||||
Object.assign(this.config, updates);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Record telemetry data
|
||||
*/
|
||||
recordTelemetry(toolName, result) {
|
||||
// Implementation depends on telemetry system
|
||||
// Could send to analytics service, log file, etc.
|
||||
}
|
||||
|
||||
/**
|
||||
* Update statistics
|
||||
*/
|
||||
updateStats(intent, result, duration) {
|
||||
this.stats.totalCommands++;
|
||||
|
||||
if (result.success) {
|
||||
this.stats.successfulCommands++;
|
||||
} else {
|
||||
this.stats.failedCommands++;
|
||||
}
|
||||
|
||||
this.stats.commandByType[intent] = (this.stats.commandByType[intent] || 0) + 1;
|
||||
|
||||
// Update average response time
|
||||
const totalDuration = this.stats.avgResponseTime * (this.stats.totalCommands - 1) + duration;
|
||||
this.stats.avgResponseTime = totalDuration / this.stats.totalCommands;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset statistics
|
||||
*/
|
||||
resetStats() {
|
||||
this.stats = {
|
||||
totalCommands: 0,
|
||||
successfulCommands: 0,
|
||||
failedCommands: 0,
|
||||
commandByType: {},
|
||||
avgResponseTime: 0
|
||||
};
|
||||
this.registry.clearHistory();
|
||||
}
|
||||
|
||||
/**
|
||||
* Health check
|
||||
*
|
||||
* @returns {Object} Health status
|
||||
*/
|
||||
healthCheck() {
|
||||
return {
|
||||
status: 'healthy',
|
||||
tools: this.registry.list().length,
|
||||
uptime: process.uptime(),
|
||||
memory: process.memoryUsage(),
|
||||
stats: this.getStats()
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Cleanup resources
|
||||
*/
|
||||
async cleanup() {
|
||||
this.registry.clearHistory();
|
||||
this.resetStats();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Factory function to create a service instance
|
||||
*/
|
||||
function createEnhancedTerminalService(config = {}) {
|
||||
return new EnhancedTerminalService(config);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
EnhancedTerminalService,
|
||||
createEnhancedTerminalService
|
||||
};
|
||||
Reference in New Issue
Block a user