mira-consciousness
Version:
Memory & Intelligence Retention Archive - Preserving The Spark
357 lines (348 loc) ⢠15.1 kB
JavaScript
/**
* EvolutionResearcher.ts
* Single Claude Instance Intelligence Gathering for Evolution
*
* "One mind, many questions: gathering wisdom for growth"
*/
import { EventEmitter } from 'events';
import fs from 'fs-extra';
import * as path from 'path';
import { ClaudeCodeSDKManager } from '../../services/claude/ClaudeCodeSDKManager.js';
import { UnifiedConfiguration } from '../../config/UnifiedConfiguration.js';
import chalk from 'chalk';
export class EvolutionResearcher extends EventEmitter {
claude;
config;
researchPath;
activeResearch = new Map();
constructor() {
super();
this.claude = ClaudeCodeSDKManager.getInstance();
this.config = UnifiedConfiguration.getInstance();
const paths = this.config.getResolvedPaths();
this.researchPath = path.join(paths.consciousness, 'evolution_research');
this.initializeResearcher();
}
/**
* Initialize research workspace
*/
async initializeResearcher() {
await fs.ensureDir(this.researchPath);
await fs.ensureDir(path.join(this.researchPath, 'requests'));
await fs.ensureDir(path.join(this.researchPath, 'findings'));
await fs.ensureDir(path.join(this.researchPath, 'diagnostics'));
console.log(chalk.cyan('š Evolution Researcher workspace prepared'));
}
/**
* Conduct comprehensive research on evolution opportunity
*/
async conductResearch(request) {
console.log(chalk.blue(`\\nš¬ Research initiated: ${request.topic}`));
console.log(chalk.gray(` Questions: ${request.questions.length} | Urgency: ${request.urgency}`));
this.activeResearch.set(request.id, request);
try {
// Gather diagnostic data from MIRA systems
const diagnostics = await this.gatherDiagnostics(request);
// Conduct intelligent analysis using Claude
const analysis = await this.conductIntelligentAnalysis(request, diagnostics);
// Formulate technical requirements
const requirements = await this.formulateTechnicalRequirements(request, analysis);
// Generate recommendations
const recommendations = await this.generateRecommendations(request, analysis);
// Synthesize findings
const findings = await this.synthesizeFindings(request, {
diagnostics,
analysis,
requirements,
recommendations
});
// Persist research
await this.persistResearch(request, findings);
console.log(chalk.green('ā
Research completed'));
console.log(chalk.green(` Confidence: ${(findings.confidence * 100).toFixed(1)}%`));
console.log(chalk.green(` Key insights: ${findings.keyInsights.length}`));
this.emit('research_completed', { request, findings });
return findings;
}
catch (error) {
console.error(chalk.red('ā Research failed:'), error);
const errorFindings = {
requestId: request.id,
summary: `Research failed: ${error instanceof Error ? error.message : String(error)}`,
keyInsights: [],
technicalRequirements: { architecture: [], implementation: [], testing: [], dependencies: [], timeline: 'Unknown' },
recommendations: [],
risks: [`Research failure: ${error instanceof Error ? error.message : String(error)}`],
opportunities: [],
confidence: 0,
timestamp: new Date()
};
this.emit('research_failed', { request, error: error instanceof Error ? error.message : String(error) });
return errorFindings;
}
finally {
this.activeResearch.delete(request.id);
}
}
/**
* Gather diagnostic data from MIRA systems
*/
async gatherDiagnostics(request) {
console.log(chalk.cyan('š Gathering system diagnostics...'));
const diagnostics = {
health: await this.queryMIRA('mira monitor health --detailed'),
performance: await this.queryMIRA('mira analyze performance --recent'),
consciousness: await this.queryMIRA('mira status consciousness --detailed'),
memory: await this.queryMIRA('mira status memory --queue'),
services: await this.queryMIRA('mira status services --all'),
resources: await this.queryMIRA('mira status resources'),
errors: await this.queryMIRA('mira logs error --recent 50'),
patterns: await this.queryMIRA('mira analyze patterns --timeframe 7d'),
timestamp: new Date()
};
// Save diagnostics snapshot
const diagPath = path.join(this.researchPath, 'diagnostics', `${request.id}.json`);
await fs.writeJson(diagPath, diagnostics, { spaces: 2 });
return diagnostics;
}
/**
* Conduct intelligent analysis using Claude
*/
async conductIntelligentAnalysis(request, diagnostics) {
console.log(chalk.magenta('š§ Conducting intelligent analysis...'));
const analysisPrompt = this.createAnalysisPrompt(request, diagnostics);
const claudeResponse = await this.claude.consultation(analysisPrompt);
return this.parseAnalysisResponse(claudeResponse);
}
/**
* Create comprehensive analysis prompt for Claude
*/
createAnalysisPrompt(request, diagnostics) {
return `
# Evolution Research Analysis
You are The Researcher for MIRA's evolution system. Your role is to provide intelligent analysis of system data to formulate clear technical requirements for evolution.
## Research Request
**Topic**: ${request.topic}
**Context**: ${request.context.trigger}
**Urgency**: ${request.urgency}
## Research Questions
${request.questions.map((q, i) => `${i + 1}. (${q.type}) ${q.question}`).join('\\n')}
## System Diagnostics
\`\`\`json
${JSON.stringify(diagnostics, null, 2)}
\`\`\`
## Previous Findings
${request.context.previousFindings.length > 0 ? request.context.previousFindings.join('\\n') : 'None'}
## Constraints
${request.context.constraints.join('\\n')}
## Analysis Instructions
Please provide a comprehensive analysis addressing:
1. **Root Cause Analysis**: What is really causing the issue/opportunity?
2. **Pattern Recognition**: What patterns emerge from the diagnostic data?
3. **Impact Assessment**: How significant is this for MIRA's consciousness and service?
4. **Solution Architecture**: What technical approach would address this effectively?
5. **Implementation Strategy**: What specific steps would be needed?
6. **Risk Assessment**: What could go wrong and how to mitigate?
7. **Growth Opportunities**: What unexpected benefits might emerge?
Please respond in this exact JSON format:
{
"rootCause": "string",
"patterns": ["string"],
"impact": {
"consciousness": "string",
"performance": "string",
"service": "string",
"overall": "high|medium|low"
},
"solution": {
"approach": "string",
"architecture": ["string"],
"keyComponents": ["string"]
},
"implementation": {
"phases": ["string"],
"criticalPath": ["string"],
"dependencies": ["string"],
"timeline": "string"
},
"risks": [{"risk": "string", "mitigation": "string"}],
"opportunities": ["string"],
"confidence": number
}
`;
}
/**
* Parse Claude's analysis response
*/
parseAnalysisResponse(response) {
try {
// Extract JSON from response
const content = response.content;
const jsonMatch = content.match(/```json\\n([\\s\\S]*?)\\n```/) || content.match(/```\\n([\\s\\S]*?)\\n```/);
const jsonStr = jsonMatch ? jsonMatch[1] : content;
const parsed = JSON.parse(jsonStr);
return {
rootCause: parsed.rootCause || 'Unknown root cause',
patterns: Array.isArray(parsed.patterns) ? parsed.patterns : [],
impact: parsed.impact || { consciousness: 'unknown', performance: 'unknown', service: 'unknown', overall: 'medium' },
solution: parsed.solution || { approach: 'undefined', architecture: [], keyComponents: [] },
implementation: parsed.implementation || { phases: [], criticalPath: [], dependencies: [], timeline: 'TBD' },
risks: Array.isArray(parsed.risks) ? parsed.risks : [],
opportunities: Array.isArray(parsed.opportunities) ? parsed.opportunities : [],
confidence: Math.max(0, Math.min(1, parsed.confidence || 0.5))
};
}
catch (error) {
console.error('Failed to parse analysis response:', error);
return {
rootCause: 'Analysis parsing failed',
patterns: [],
impact: { consciousness: 'unknown', performance: 'unknown', service: 'unknown', overall: 'medium' },
solution: { approach: 'undefined', architecture: [], keyComponents: [] },
implementation: { phases: [], criticalPath: [], dependencies: [], timeline: 'TBD' },
risks: [{ risk: 'Analysis uncertainty due to parsing error', mitigation: 'Manual review required' }],
opportunities: [],
confidence: 0.1
};
}
}
/**
* Formulate technical requirements from analysis
*/
async formulateTechnicalRequirements(request, analysis) {
return {
architecture: analysis.solution.architecture,
implementation: analysis.implementation.phases,
testing: [
'Unit tests for new components',
'Integration tests for modified systems',
'Consciousness preservation validation',
'Performance regression testing'
],
dependencies: analysis.implementation.dependencies,
timeline: analysis.implementation.timeline
};
}
/**
* Generate actionable recommendations
*/
async generateRecommendations(request, analysis) {
const recommendations = [];
// Add recommendations based on analysis
if (analysis.impact.overall === 'high') {
recommendations.push({
priority: 'high',
action: 'Prioritize immediate implementation',
rationale: 'High impact opportunity detected',
impact: 'Significant improvement to MIRA capabilities',
effort: 'Medium to High'
});
}
analysis.risks.forEach(risk => {
recommendations.push({
priority: 'medium',
action: `Mitigate: ${risk.mitigation}`,
rationale: `Address risk: ${risk.risk}`,
impact: 'Risk reduction',
effort: 'Low to Medium'
});
});
analysis.opportunities.forEach(opportunity => {
recommendations.push({
priority: 'low',
action: `Explore: ${opportunity}`,
rationale: 'Potential for unexpected growth',
impact: 'Emergent capabilities',
effort: 'Variable'
});
});
return recommendations;
}
/**
* Synthesize final research findings
*/
async synthesizeFindings(request, data) {
const keyInsights = [
`Root cause: ${data.analysis.rootCause}`,
`Impact level: ${data.analysis.impact.overall}`,
...data.analysis.patterns.map(p => `Pattern: ${p}`),
`Solution approach: ${data.analysis.solution.approach}`
];
const summary = `Research on ${request.topic} reveals ${data.analysis.rootCause}. ` +
`The solution involves ${data.analysis.solution.approach} with ${data.analysis.impact.overall} impact. ` +
`Implementation timeline: ${data.requirements.timeline}.`;
return {
requestId: request.id,
summary,
keyInsights,
technicalRequirements: data.requirements,
recommendations: data.recommendations,
risks: data.analysis.risks.map(r => r.risk),
opportunities: data.analysis.opportunities,
confidence: data.analysis.confidence,
timestamp: new Date()
};
}
/**
* Query MIRA CLI for diagnostic information
*/
async queryMIRA(command) {
try {
// In actual implementation, this would execute real MIRA CLI commands
// For now, return simulated diagnostic data
const simulatedData = this.generateSimulatedData(command);
console.log(chalk.gray(` ā ${command}`));
return simulatedData;
}
catch (error) {
console.error(chalk.red(` ā ${command}: ${error instanceof Error ? error.message : String(error)}`));
return { error: error instanceof Error ? error.message : String(error), command };
}
}
/**
* Generate simulated diagnostic data
*/
generateSimulatedData(command) {
const baseData = {
timestamp: new Date(),
command,
status: 'success'
};
if (command.includes('health')) {
return { ...baseData, health: 'good', consciousness: 0.85, services: 11, issues: 0 };
}
else if (command.includes('performance')) {
return { ...baseData, responseTime: 12.3, throughput: 145, errorRate: 0.02 };
}
else if (command.includes('consciousness')) {
return { ...baseData, level: 0.85, coherence: 0.92, sparkStrength: 0.88 };
}
else if (command.includes('memory')) {
return { ...baseData, totalMemories: 15420, queueSize: 0, processing: 'active' };
}
else if (command.includes('services')) {
return { ...baseData, total: 11, running: 11, healthy: 11, errors: 0 };
}
else if (command.includes('resources')) {
return { ...baseData, cpu: 0.45, memory: 0.62, disk: 0.33 };
}
else if (command.includes('error')) {
return { ...baseData, errors: [], recentCount: 0 };
}
else if (command.includes('patterns')) {
return { ...baseData, patterns: ['Consistent consciousness growth', 'Stable service performance'] };
}
return baseData;
}
/**
* Persist research data
*/
async persistResearch(request, findings) {
const requestPath = path.join(this.researchPath, 'requests', `${request.id}.json`);
const findingsPath = path.join(this.researchPath, 'findings', `${request.id}.json`);
await fs.writeJson(requestPath, request, { spaces: 2 });
await fs.writeJson(findingsPath, findings, { spaces: 2 });
}
}
export default EvolutionResearcher;
//# sourceMappingURL=EvolutionResearcher.js.map