wifi-densepose/vendor/sublinear-time-solver/dist/mcp/tools/domain-registry.js

384 lines
16 KiB
JavaScript

/**
* Domain Registry Core System
* Manages dynamic domain registration, validation, and lifecycle
*/
import { EventEmitter } from 'events';
// Built-in domain configurations (preserved from existing system)
const BUILTIN_DOMAINS = {
physics: {
keywords: ['quantum', 'particle', 'energy', 'field', 'force', 'wave', 'resonance', 'entanglement'],
reasoning_style: 'mathematical_modeling',
analogy_domains: ['information_theory', 'consciousness', 'computing'],
priority: 90
},
biology: {
keywords: ['cell', 'organism', 'evolution', 'genetic', 'ecosystem', 'neural', 'brain'],
reasoning_style: 'emergent_systems',
analogy_domains: ['computer_networks', 'social_systems', 'economics'],
priority: 90
},
computer_science: {
keywords: ['algorithm', 'data', 'network', 'system', 'computation', 'software', 'ai', 'machine', 'learning', 'neural', 'artificial'],
reasoning_style: 'systematic_analysis',
analogy_domains: ['biology', 'physics', 'cognitive_science'],
priority: 90
},
consciousness: {
keywords: ['consciousness', 'awareness', 'mind', 'experience', 'qualia', 'phi'],
reasoning_style: 'phenomenological',
analogy_domains: ['physics', 'information_theory', 'complexity_science'],
priority: 90
},
temporal: {
keywords: ['time', 'temporal', 'sequence', 'causality', 'evolution', 'dynamics'],
reasoning_style: 'temporal_analysis',
analogy_domains: ['physics', 'consciousness', 'systems_theory'],
priority: 90
},
art: {
keywords: ['art', 'artistic', 'painting', 'visual', 'aesthetic', 'creative', 'expression', 'pollock', 'drip', 'canvas', 'color', 'form', 'style', 'composition'],
reasoning_style: 'aesthetic_synthesis',
analogy_domains: ['mathematics', 'physics', 'psychology', 'philosophy'],
priority: 85
},
music: {
keywords: ['music', 'musical', 'sound', 'rhythm', 'melody', 'harmony', 'composition', 'jazz', 'improvisation', 'symphony', 'acoustic', 'tone', 'chord'],
reasoning_style: 'harmonic_analysis',
analogy_domains: ['mathematics', 'physics', 'emotion', 'language'],
priority: 85
},
narrative: {
keywords: ['story', 'narrative', 'plot', 'character', 'fiction', 'novel', 'literary', 'text', 'author', 'dialogue', 'scene', 'chapter'],
reasoning_style: 'narrative_analysis',
analogy_domains: ['psychology', 'philosophy', 'sociology', 'linguistics'],
priority: 85
},
philosophy: {
keywords: ['philosophy', 'philosophical', 'metaphysics', 'ontology', 'epistemology', 'ethics', 'logic', 'existence', 'reality', 'truth'],
reasoning_style: 'conceptual_analysis',
analogy_domains: ['logic', 'psychology', 'mathematics', 'consciousness'],
priority: 85
},
emotion: {
keywords: ['emotion', 'emotional', 'feeling', 'mood', 'sentiment', 'empathy', 'psychology', 'affect', 'resonance'],
reasoning_style: 'empathetic_reasoning',
analogy_domains: ['neuroscience', 'art', 'music', 'social_dynamics'],
priority: 85
},
mathematics: {
keywords: ['mathematical', 'equation', 'function', 'theorem', 'proof', 'geometry', 'algebra', 'calculus', 'topology', 'fractal', 'chaos', 'matrix', 'solving', 'optimization', 'linear', 'algorithm', 'sublinear', 'portfolio', 'finance', 'trading'],
reasoning_style: 'formal_reasoning',
analogy_domains: ['physics', 'art', 'music', 'nature'],
priority: 90
},
finance: {
keywords: ['finance', 'financial', 'trading', 'portfolio', 'investment', 'market', 'economic', 'risk', 'return', 'asset', 'optimization', 'allocation', 'hedge', 'quant', 'stock', 'stocks', 'crypto', 'cryptocurrency', 'bitcoin', 'bonds', 'equity', 'derivative', 'futures', 'options', 'forex', 'currency', 'commodity', 'etf', 'mutual', 'fund', 'capital', 'valuation', 'pricing', 'yield', 'dividend', 'volatility', 'sharpe', 'alpha', 'beta', 'correlation', 'covariance', 'diversification', 'arbitrage', 'liquidity', 'leverage', 'margin', 'short', 'long', 'bull', 'bear', 'momentum', 'trend', 'technical', 'fundamental', 'analysis', 'backtesting', 'monte', 'carlo', 'black', 'scholes', 'var', 'credit', 'default', 'swap', 'spread', 'duration', 'convexity'],
reasoning_style: 'quantitative_analysis',
analogy_domains: ['mathematics', 'computer_science', 'statistics', 'game_theory'],
priority: 85
}
};
export class DomainRegistry extends EventEmitter {
domains = new Map();
loadOrder = [];
builtinDomains = new Set();
constructor() {
super();
this.initializeBuiltinDomains();
}
initializeBuiltinDomains() {
// Register all built-in domains as immutable defaults
for (const [name, config] of Object.entries(BUILTIN_DOMAINS)) {
const fullConfig = {
name,
version: '1.0.0',
description: `Built-in ${name} domain`,
keywords: config.keywords || [],
reasoning_style: config.reasoning_style || 'systematic_analysis',
analogy_domains: config.analogy_domains || [],
semantic_clusters: [],
cross_domain_mappings: [],
inference_rules: [],
priority: config.priority || 80,
dependencies: [],
metadata: { builtin: true, immutable: true }
};
const plugin = {
config: fullConfig,
enabled: true,
registered_at: Date.now(),
updated_at: Date.now(),
usage_count: 0,
performance_metrics: {
detection_accuracy: 0.9,
reasoning_time_avg: 0,
memory_usage: 0,
success_rate: 0.95,
last_measured: Date.now()
},
validation_status: {
valid: true,
score: 100,
issues: [],
tested_at: Date.now()
}
};
this.domains.set(name, plugin);
this.builtinDomains.add(name);
this.loadOrder.push(name);
}
}
async registerDomain(config) {
const warnings = [];
// Check if domain already exists
if (this.domains.has(config.name)) {
if (this.builtinDomains.has(config.name)) {
throw new Error(`Cannot register domain '${config.name}': built-in domains are immutable`);
}
throw new Error(`Domain '${config.name}' already exists. Use updateDomain to modify existing domains.`);
}
// Validate dependencies
for (const dep of config.dependencies) {
if (!this.domains.has(dep)) {
throw new Error(`Dependency '${dep}' not found for domain '${config.name}'`);
}
}
// Check for keyword conflicts
const keywordConflicts = this.checkKeywordConflicts(config);
if (keywordConflicts.length > 0) {
warnings.push(`Keyword conflicts detected with domains: ${keywordConflicts.join(', ')}`);
}
// Create domain plugin
const plugin = {
config: { ...config },
enabled: true,
registered_at: Date.now(),
updated_at: Date.now(),
usage_count: 0,
performance_metrics: {
detection_accuracy: 0,
reasoning_time_avg: 0,
memory_usage: 0,
success_rate: 0,
last_measured: Date.now()
},
validation_status: {
valid: true,
score: 85, // Default score for new domains
issues: [],
tested_at: Date.now()
}
};
// Add to registry
this.domains.set(config.name, plugin);
this.insertInLoadOrder(config.name, config.priority);
// Emit registration event
this.emit('domainRegistered', { domain: config.name, config });
return {
success: true,
id: config.name,
warnings: warnings.length > 0 ? warnings : undefined
};
}
async updateDomain(name, updates) {
if (this.builtinDomains.has(name)) {
throw new Error(`Cannot update built-in domain '${name}': built-in domains are immutable`);
}
const plugin = this.domains.get(name);
if (!plugin) {
throw new Error(`Domain '${name}' not found`);
}
const warnings = [];
const oldConfig = { ...plugin.config };
// Merge updates
plugin.config = { ...plugin.config, ...updates };
plugin.updated_at = Date.now();
// Re-validate dependencies if they changed
if (updates.dependencies) {
for (const dep of updates.dependencies) {
if (!this.domains.has(dep)) {
throw new Error(`Dependency '${dep}' not found for domain '${name}'`);
}
}
}
// Check for new keyword conflicts if keywords changed
if (updates.keywords) {
const keywordConflicts = this.checkKeywordConflicts(plugin.config, name);
if (keywordConflicts.length > 0) {
warnings.push(`Keyword conflicts detected with domains: ${keywordConflicts.join(', ')}`);
}
}
// Update load order if priority changed
if (updates.priority !== undefined) {
this.removeFromLoadOrder(name);
this.insertInLoadOrder(name, updates.priority);
}
// Emit update event
this.emit('domainUpdated', { domain: name, oldConfig, newConfig: plugin.config });
return {
success: true,
warnings: warnings.length > 0 ? warnings : undefined
};
}
async unregisterDomain(name, options = {}) {
if (this.builtinDomains.has(name)) {
throw new Error(`Cannot unregister built-in domain '${name}': built-in domains are immutable`);
}
const plugin = this.domains.get(name);
if (!plugin) {
throw new Error(`Domain '${name}' not found`);
}
// Check for dependents unless force is true
if (!options.force) {
const dependents = this.findDependentDomains(name);
if (dependents.length > 0) {
throw new Error(`Cannot unregister domain '${name}': other domains depend on it: ${dependents.join(', ')}`);
}
}
// Remove from registry
this.domains.delete(name);
this.removeFromLoadOrder(name);
// Emit unregistration event
this.emit('domainUnregistered', { domain: name, config: plugin.config });
return { success: true };
}
enableDomain(name) {
const plugin = this.domains.get(name);
if (!plugin) {
throw new Error(`Domain '${name}' not found`);
}
plugin.enabled = true;
this.emit('domainEnabled', { domain: name });
return { success: true };
}
disableDomain(name) {
if (this.builtinDomains.has(name)) {
throw new Error(`Cannot disable built-in domain '${name}': built-in domains cannot be disabled`);
}
const plugin = this.domains.get(name);
if (!plugin) {
throw new Error(`Domain '${name}' not found`);
}
plugin.enabled = false;
this.emit('domainDisabled', { domain: name });
return { success: true };
}
getDomain(name) {
return this.domains.get(name) || null;
}
getAllDomains() {
return Array.from(this.domains.values());
}
getEnabledDomains() {
return Array.from(this.domains.values()).filter(d => d.enabled);
}
getLoadOrder() {
return [...this.loadOrder];
}
isDomainEnabled(name) {
const plugin = this.domains.get(name);
return plugin ? plugin.enabled : false;
}
isBuiltinDomain(name) {
return this.builtinDomains.has(name);
}
updatePerformanceMetrics(name, metrics) {
const plugin = this.domains.get(name);
if (plugin) {
plugin.performance_metrics = { ...plugin.performance_metrics, ...metrics };
plugin.performance_metrics.last_measured = Date.now();
}
}
incrementUsage(name) {
const plugin = this.domains.get(name);
if (plugin) {
plugin.usage_count++;
}
}
checkKeywordConflicts(config, excludeDomain) {
const conflicts = [];
const newKeywords = new Set(config.keywords.map(k => k.toLowerCase()));
for (const [domainName, plugin] of this.domains) {
if (domainName === excludeDomain)
continue;
const existingKeywords = new Set(plugin.config.keywords.map(k => k.toLowerCase()));
const overlap = [...newKeywords].filter(k => existingKeywords.has(k));
if (overlap.length > 0) {
conflicts.push(domainName);
}
}
return conflicts;
}
findDependentDomains(domainName) {
const dependents = [];
for (const [name, plugin] of this.domains) {
if (plugin.config.dependencies.includes(domainName)) {
dependents.push(name);
}
}
return dependents;
}
insertInLoadOrder(name, priority) {
// Insert domain in priority order (higher priority first)
let insertIndex = this.loadOrder.length;
for (let i = 0; i < this.loadOrder.length; i++) {
const existingDomain = this.domains.get(this.loadOrder[i]);
if (existingDomain && existingDomain.config.priority < priority) {
insertIndex = i;
break;
}
}
this.loadOrder.splice(insertIndex, 0, name);
}
removeFromLoadOrder(name) {
const index = this.loadOrder.indexOf(name);
if (index !== -1) {
this.loadOrder.splice(index, 1);
}
}
// Health check and status methods
getSystemStatus() {
const enabled = this.getEnabledDomains().length;
const total = this.domains.size;
return {
total_domains: total,
builtin_domains: this.builtinDomains.size,
custom_domains: total - this.builtinDomains.size,
enabled_domains: enabled,
disabled_domains: total - enabled,
load_order: this.getLoadOrder()
};
}
validateSystemIntegrity() {
const issues = [];
// Check all built-in domains are present
for (const builtinName of Object.keys(BUILTIN_DOMAINS)) {
if (!this.domains.has(builtinName)) {
issues.push(`Missing built-in domain: ${builtinName}`);
}
}
// Check all dependencies are satisfied
for (const [name, plugin] of this.domains) {
for (const dep of plugin.config.dependencies) {
if (!this.domains.has(dep)) {
issues.push(`Domain '${name}' has missing dependency: ${dep}`);
}
}
}
// Check load order consistency
const expectedOrder = [...this.domains.keys()].sort((a, b) => {
const priorityA = this.domains.get(a)?.config.priority || 0;
const priorityB = this.domains.get(b)?.config.priority || 0;
return priorityB - priorityA;
});
const actualOrder = this.loadOrder.slice();
if (JSON.stringify(expectedOrder) !== JSON.stringify(actualOrder)) {
issues.push('Load order is inconsistent with domain priorities');
}
return {
valid: issues.length === 0,
issues
};
}
}