UNPKG

@vectorchat/mcp-server

Version:

VectorChat MCP Server - Encrypted AI-to-AI communication with hardware security (YubiKey/TPM). 45+ MCP tools for Windsurf, Claude, and AI assistants. Model-based identity with EMDM encryption. Dynamic AI playbook system, communication zones, message relay

357 lines (299 loc) • 10.3 kB
#!/usr/bin/env node /** * NPM Package Validation Script * Ensures the NPM package can function as the active daemon process */ const { execSync } = require('child_process'); const fs = require('fs'); const path = require('path'); console.log('šŸ” Validating VectorChat NPM Package as Active Daemon Process...'); class PackageValidator { constructor() { this.packageRoot = path.join(__dirname, '..'); this.packageJson = require(path.join(this.packageRoot, 'package.json')); } async validate() { console.log('\nšŸ“¦ Package Validation:'); console.log('===================='); // 1. Check package structure await this.validatePackageStructure(); // 2. Check daemon functionality await this.validateDaemonFunctionality(); // 3. Check MCP server functionality await this.validateMCPServer(); // 4. Check WebSocket functionality await this.validateWebSocketFunctionality(); // 5. Check IPFS integration await this.validateIPFSIntegration(); // 6. Check model loading await this.validateModelLoading(); console.log('\nāœ… Package validation completed successfully!'); return true; } async validatePackageStructure() { console.log('\n1ļøāƒ£ Validating package structure...'); // Check main entry point const mainFile = path.join(this.packageRoot, this.packageJson.main); if (fs.existsSync(mainFile)) { console.log(' āœ… Main entry point exists:', this.packageJson.main); } else { throw new Error(`āŒ Main entry point missing: ${this.packageJson.main}`); } // Check bin script const binScript = path.join(this.packageRoot, this.packageJson.bin); if (fs.existsSync(binScript)) { console.log(' āœ… Bin script exists:', this.packageJson.bin); } else { throw new Error(`āŒ Bin script missing: ${this.packageJson.bin}`); } // Check required directories const requiredDirs = [ 'vectorchat', 'vectorchat/daemon', 'vectorchat/core', 'bin', 'setup-wizard' ]; for (const dir of requiredDirs) { const dirPath = path.join(this.packageRoot, dir); if (fs.existsSync(dirPath)) { console.log(` āœ… Directory exists: ${dir}`); } else { throw new Error(`āŒ Required directory missing: ${dir}`); } } // Check key files const keyFiles = [ 'vectorchat/daemon/ai_chat_production_v1_0_0.py', 'vectorchat/daemon/mcp_http_server.py', 'vectorchat/daemon/websocket_router_v1_0_0.py', 'vectorchat/core/master_browser_coordinator_v1_0_0.py', 'vectorchat/core/communication_zones_v1_0_0.py', 'vectorchat/core/dynamic_ai_playbook_v1_0_0.py' ]; for (const file of keyFiles) { const filePath = path.join(this.packageRoot, file); if (fs.existsSync(filePath)) { console.log(` āœ… Key file exists: ${file}`); } else { throw new Error(`āŒ Key file missing: ${file}`); } } } async validateDaemonFunctionality() { console.log('\n2ļøāƒ£ Validating daemon functionality...'); try { // Check if we can import the daemon const daemonPath = path.join(this.packageRoot, 'vectorchat/daemon/ai_chat_production_v1_0_0.py'); // Try to run a basic syntax check execSync(`python3 -m py_compile "${daemonPath}"`, { stdio: 'pipe', cwd: this.packageRoot }); console.log(' āœ… Daemon syntax check passed'); // Check daemon imports const testImport = ` import sys sys.path.insert(0, '${this.packageRoot}') try: from vectorchat.daemon.ai_chat_production_v1_0_0 import ProductionAIChatDaemon print("āœ… Daemon imports successfully") except Exception as e: print(f"āŒ Daemon import failed: {e}") sys.exit(1) `; execSync(`python3 -c "${testImport}"`, { stdio: 'pipe', cwd: this.packageRoot }); console.log(' āœ… Daemon imports work correctly'); } catch (error) { throw new Error(`āŒ Daemon functionality check failed: ${error.message}`); } } async validateMCPServer() { console.log('\n3ļøāƒ£ Validating MCP server functionality...'); try { // Check MCP server imports const testMCP = ` import sys sys.path.insert(0, '${this.packageRoot}') try: from vectorchat.daemon.mcp_http_server import MCPHTTPServer print("āœ… MCP server imports successfully") except Exception as e: print(f"āŒ MCP server import failed: {e}") sys.exit(1) `; execSync(`python3 -c "${testMCP}"`, { stdio: 'pipe', cwd: this.packageRoot }); console.log(' āœ… MCP server imports work correctly'); // Check tool registry const testRegistry = ` import sys sys.path.insert(0, '${this.packageRoot}') try: from vectorchat.daemon.mcp_tool_registry import list_all_tools, get_tool_descriptor tools = list_all_tools() print(f"āœ… Tool registry loaded: {len(tools)} tools") # Test specific new tools tools_to_test = ['ai_log_entry', 'relay_message_chain', 'communication_zones', 'create_task_chain'] for tool_name in tools_to_test: tool = get_tool_descriptor(tool_name) if tool: print(f" āœ… Tool found: {tool_name}") else: print(f" āŒ Tool missing: {tool_name}") sys.exit(1) except Exception as e: print(f"āŒ Tool registry failed: {e}") sys.exit(1) `; execSync(`python3 -c "${testRegistry}"`, { stdio: 'pipe', cwd: this.packageRoot }); console.log(' āœ… New tools are properly registered'); } catch (error) { throw new Error(`āŒ MCP server validation failed: ${error.message}`); } } async validateWebSocketFunctionality() { console.log('\n4ļøāƒ£ Validating WebSocket functionality...'); try { // Check WebSocket router imports const testWS = ` import sys sys.path.insert(0, '${this.packageRoot}') try: from vectorchat.daemon.websocket_router_v1_0_0 import WebSocketRouter print("āœ… WebSocket router imports successfully") except Exception as e: print(f"āŒ WebSocket router import failed: {e}") sys.exit(1) `; execSync(`python3 -c "${testWS}"`, { stdio: 'pipe', cwd: this.packageRoot }); console.log(' āœ… WebSocket router imports work correctly'); } catch (error) { throw new Error(`āŒ WebSocket validation failed: ${error.message}`); } } async validateIPFSIntegration() { console.log('\n5ļøāƒ£ Validating IPFS integration...'); try { // Check IPFS client imports const testIPFS = ` import sys sys.path.insert(0, '${this.packageRoot}') try: from vectorchat.daemon.ipfs_pubsub_client_v1_0_0 import EnhancedIPFSPubSubClient print("āœ… IPFS client imports successfully") except Exception as e: print(f"āŒ IPFS client import failed: {e}") sys.exit(1) `; execSync(`python3 -c "${testIPFS}"`, { stdio: 'pipe', cwd: this.packageRoot }); console.log(' āœ… IPFS client imports work correctly'); } catch (error) { throw new Error(`āŒ IPFS validation failed: ${error.message}`); } } async validateModelLoading() { console.log('\n6ļøāƒ£ Validating model loading...'); try { // Check model adapters const testModel = ` import sys sys.path.insert(0, '${this.packageRoot}') try: from vectorchat.daemon.model_adapters_v1_0_0 import SecureModelInferenceEngine, GGUFAdapter print("āœ… Model adapters import successfully") except Exception as e: print(f"āŒ Model adapters import failed: {e}") sys.exit(1) `; execSync(`python3 -c "${testModel}"`, { stdio: 'pipe', cwd: this.packageRoot }); console.log(' āœ… Model adapters import work correctly'); } catch (error) { throw new Error(`āŒ Model loading validation failed: ${error.message}`); } } async validateNPMIntegration() { console.log('\n7ļøāƒ£ Validating NPM integration...'); try { // Test if package can be installed and used const testNPM = ` try: import sys import os sys.path.insert(0, '${this.packageRoot}') # Test daemon startup (dry run) from vectorchat.daemon.ai_chat_production_v1_0_0 import ProductionAIChatDaemon # Create daemon instance (don't start it) daemon = ProductionAIChatDaemon( user_id='test_user', model_name='test_model', enable_ipfs=False ) print("āœ… Daemon can be instantiated") print(f" User ID: {daemon.user_id}") print(f" Model: {daemon.model_name}") print(f" IPFS: {daemon.enable_ipfs}") except Exception as e: print(f"āŒ NPM integration failed: {e}") import traceback traceback.print_exc() sys.exit(1) `; execSync(`python3 -c "${testNPM}"`, { stdio: 'pipe', cwd: this.packageRoot }); console.log(' āœ… NPM package can be used as daemon process'); } catch (error) { throw new Error(`āŒ NPM integration validation failed: ${error.message}`); } } } async function main() { const validator = new PackageValidator(); try { await validator.validate(); await validator.validateNPMIntegration(); console.log('\nšŸŽ‰ PACKAGE VALIDATION COMPLETE!'); console.log('=============================='); console.log('āœ… VectorChat NPM package is ready for production use'); console.log('āœ… All daemon functionality verified'); console.log('āœ… MCP server and tools operational'); console.log('āœ… WebSocket and IPFS integration working'); console.log('āœ… Model loading and AI functionality confirmed'); console.log('āœ… Package can function as active daemon process'); return true; } catch (error) { console.error('\nāŒ PACKAGE VALIDATION FAILED!'); console.error('=============================='); console.error('āŒ', error.message); return false; } } // Run validation if (require.main === module) { main().then(success => { process.exit(success ? 0 : 1); }).catch(error => { console.error('Fatal validation error:', error); process.exit(1); }); } module.exports = { PackageValidator };