/** * CAPT Memory Palace - Simulation Engine * * Generates realistic cognitive data for demo mode. * Also handles real CAPT API connection when available. */ const CognitiveSimulator = { isRunning: false, intervalId: null, useRealAPI: false, currentInput: null, sweep: 1000, // Module templates with realistic behaviors moduleTemplates: [ { id: 'PULSE', type: 'processing', baseColor: '#8b5cf6', duration: [500, 1500] }, { id: 'NEDA', type: 'processing', baseColor: '#a855f7', duration: [800, 2000] }, { id: 'HMC', type: 'memory', baseColor: '#c084fc', duration: [300, 800] }, { id: 'CIG', type: 'processing', baseColor: '#d946ef', duration: [1000, 2500] }, { id: 'HDR', type: 'processing', baseColor: '#e879f9', duration: [1200, 3000] }, { id: 'QIPC', type: 'quorum', baseColor: '#f472b6', duration: [800, 1500] }, { id: 'ECHO', type: 'memory', baseColor: '#fb7185', duration: [200, 600] }, { id: 'META', type: 'processing', baseColor: '#f43f5e', duration: [400, 1000] }, { id: 'IMMU', type: 'validation', baseColor: '#10b981', duration: [300, 700] }, { id: 'NDS', type: 'output', baseColor: '#06b6d4', duration: [500, 1200] } ], activeModules: [], // Demo query presets with realistic processing sequences demoQueries: [ { query: "What is consciousness?", sequence: [ { module: 'PULSE', duration: 800, status: 'tokenizing' }, { module: 'NEDA', duration: 1200, status: 'semantic_match' }, { module: 'ECHO', duration: 600, status: 'memory_retrieval' }, { module: 'QIPC', duration: 1000, status: 'reasoning' }, { module: 'NDS', duration: 500, status: 'synthesizing' } ] }, { query: "Explain quantum entanglement", sequence: [ { module: 'PULSE', duration: 600, status: 'tokenizing' }, { module: 'NEDA', duration: 1500, status: 'pattern_match' }, { module: 'HMC', duration: 400, status: 'encoding' }, { module: 'QIPC', duration: 1200, status: 'physics_reasoning' }, { module: 'NDS', duration: 700, status: 'generating_explanation' } ] }, { query: "Write a poem about AI", sequence: [ { module: 'PULSE', duration: 500, status: 'tokenizing' }, { module: 'NEDA', duration: 800, status: 'creativity_match' }, { module: 'ECHO', duration: 500, status: 'poetic_patterns' }, { module: 'QIPC', duration: 900, status: 'lyric_building' }, { module: 'NDS', duration: 600, status: 'versification' } ] } ], /** * Start simulation */ start(onUpdate, options = {}) { if (this.isRunning) return; this.isRunning = true; this.onUpdate = onUpdate; this.useRealAPI = options.useRealAPI || false; if (this.useRealAPI) { this.startRealAPIPolling(); } else { this.startSimulation(); } }, /** * Stop simulation */ stop() { this.isRunning = false; if (this.intervalId) { clearInterval(this.intervalId); this.intervalId = null; } Narrative.reset(); }, /** * Start simulated cognitive processing */ startSimulation() { // Process a "query" through cognitive pipeline this.processQuery("What is the meaning of consciousness?"); }, /** * Process a query through the cognitive pipeline */ processQuery(input) { this.currentInput = input; this.sweep++; this.activeModules = []; // Phase 1: Input processing (PULSE) setTimeout(() => this.activateModule('PULSE', 0.9), 100); // Phase 2: Pattern analysis (NEDA) setTimeout(() => this.activateModule('NEDA', 0.85), 800); // Phase 3: Memory retrieval (ECHO, HMC) setTimeout(() => { this.activateModule('ECHO', 0.7); this.activateModule('HMC', 0.6); }, 1500); // Phase 4: Causal reasoning (CIG) setTimeout(() => this.activateModule('CIG', 0.8), 2500); // Phase 5: Concept mapping (HDR) setTimeout(() => this.activateModule('HDR', 0.75), 3500); // Phase 6: Competing interpretations (multiple active) setTimeout(() => { this.activateModule('QIPC', 0.5); this.activateModule('META', 0.65); }, 4500); // Phase 7: Consensus building setTimeout(() => { // Increase QIPC, decrease others this.activeModules.forEach(m => { if (m.id === 'QIPC') m.activation = 0.95; else m.activation *= 0.7; }); this.emitState(); }, 5500); // Phase 8: Validation setTimeout(() => this.activateModule('IMMU', 0.85), 6500); // Phase 9: Output generation setTimeout(() => this.activateModule('NDS', 0.9), 7500); // Complete - restart setTimeout(() => { this.emitState(); // Keep cycling this.processQuery(input); }, 9000); }, /** * Activate a module with realistic activation curve */ activateModule(moduleId, maxActivation) { const template = this.moduleTemplates.find(t => t.id === moduleId); if (!template) return; const existing = this.activeModules.find(m => m.id === moduleId); if (existing) { existing.activation = maxActivation; existing.confidence = 0.7 + Math.random() * 0.3; } else { this.activeModules.push({ id: moduleId, type: template.type, activation: maxActivation, confidence: 0.7 + Math.random() * 0.3, color: template.baseColor, capacity: Math.round(maxActivation * 100) }); } this.emitState(); // Gradual decay const decayTime = template.duration[0] + Math.random() * (template.duration[1] - template.duration[0]); setTimeout(() => { if (this.activeModules.length > 0) { const idx = this.activeModules.findIndex(m => m.id === moduleId); if (idx >= 0) { this.activeModules[idx].activation *= 0.5; if (this.activeModules[idx].activation < 0.1) { this.activeModules.splice(idx, 1); } this.emitState(); } } }, decayTime); }, /** * Emit current state to callback */ emitState() { if (!this.onUpdate) return; const state = { sweep: this.sweep, modules: this.activeModules, input: this.currentInput, timestamp: Date.now() }; this.onUpdate(state); }, /** * Start polling real CAPT API */ startRealAPIColling() { const poll = async () => { try { const state = await CAPT_API.getState(); if (state) { this.onUpdate({ sweep: state.sweep || this.sweep++, modules: parseCAPTState(state)?.rooms || [], input: state.input, timestamp: Date.now() }); } } catch (e) { console.warn('CAPT API polling failed, falling back to simulation'); this.useRealAPI = false; this.startSimulation(); } }; poll(); this.intervalId = setInterval(poll, 2000); }, /** * Submit a new query */ submitQuery(query) { this.currentInput = query; this.processQuery(query); }, /** * Get current state */ getState() { return { sweep: this.sweep, modules: this.activeModules, input: this.currentInput }; } }; // Export window.CognitiveSimulator = CognitiveSimulator;