/** * Cortex - Beautiful CLI Command Center for Brainy * * Configuration, data management, search, and chat - all in one place! */ import { BrainyData } from '../brainyData.js' import { BrainyChat } from '../chat/brainyChat.js' import { PerformanceMonitor } from './performanceMonitor.js' import { HealthCheck } from './healthCheck.js' // Licensing system moved to quantum-vault import * as readline from 'readline' import * as fs from 'fs/promises' import * as path from 'path' import * as crypto from 'crypto' // @ts-ignore - CLI packages import chalk from 'chalk' // @ts-ignore - CLI packages import ora from 'ora' // @ts-ignore - CLI packages import boxen from 'boxen' // @ts-ignore - CLI packages import Table from 'cli-table3' // @ts-ignore - CLI packages import prompts from 'prompts' // Brainy-branded terminal colors matching the logo const colors = { primary: chalk.hex('#3A5F4A'), // Deep teal from brain jar success: chalk.hex('#2D4A3A'), // Darker teal for success states warning: chalk.hex('#D67441'), // Warm orange from logo rays error: chalk.hex('#B85C35'), // Darker orange for errors info: chalk.hex('#4A6B5A'), // Muted green background color dim: chalk.hex('#8A9B8A'), // Muted gray-green bold: chalk.bold, highlight: chalk.hex('#E88B5A'), // Coral brain color for highlights accent: chalk.hex('#F5E6D3'), // Cream accent color retro: chalk.hex('#D67441'), // Main retro orange brain: chalk.hex('#E88B5A') // Brain coral color } // 1950s Retro Sci-Fi emojis matching Brainy's atomic age aesthetic const emojis = { brain: '🧠', // Perfect brain in a jar! tube: 'πŸ§ͺ', // Laboratory test tube for data atom: 'βš›οΈ', // Atomic symbol - pure 50s sci-fi lock: 'πŸ”’', // Vault-style security key: 'πŸ—οΈ', // Vintage brass key shield: 'πŸ›‘οΈ', // Protective force field check: 'βœ…', // Success indicator cross: '❌', // Error state warning: '⚠️', // Alert system info: 'ℹ️', // Information display search: 'πŸ”', // Laboratory magnifier chat: 'πŸ’­', // Thought transmission data: 'πŸŽ›οΈ', // Control panel/dashboard config: 'βš™οΈ', // Mechanical gear system magic: '⚑', // Electrical energy/power party: 'πŸŽ†', // Atomic celebration robot: 'πŸ€–', // Mechanical automaton cloud: '☁️', // Atmospheric storage disk: 'πŸ’½', // Retro storage disc package: 'πŸ“¦', // Laboratory specimen box lab: 'πŸ”¬', // Scientific instrument network: 'πŸ“‘', // Communications array sync: 'πŸ”„', // Cyclical process backup: 'πŸ’Ύ', // Archive storage health: 'πŸ”‹', // Power/energy levels stats: 'πŸ“Š', // Data analysis charts explore: 'πŸ—ΊοΈ', // Territory mapping import: 'πŸ“₯', // Input channel export: 'πŸ“€', // Output transmission sparkle: '✨', // Energy discharge rocket: 'πŸš€', // Space age propulsion repair: 'πŸ”§', // Repair tools lightning: '⚑' // Lightning bolt } export class Cortex { private brainy?: BrainyData private chatInstance?: BrainyChat private performanceMonitor?: PerformanceMonitor private healthCheck?: HealthCheck private licensingSystem?: any // Licensing system (optional) private configPath: string private config: CortexConfig private encryptionKey?: Buffer private masterKeySource?: 'env' | 'passphrase' | 'generated' // UI properties for terminal output private emojis = { check: 'βœ…', cross: '❌', info: 'ℹ️', warning: '⚠️', rocket: 'πŸš€', brain: '🧠', atom: 'βš›οΈ', lock: 'πŸ”’', key: 'πŸ”‘', package: 'πŸ“¦', chart: 'πŸ“Š', sparkles: '✨', fire: 'πŸ”₯', zap: '⚑', gear: 'βš™οΈ', robot: 'πŸ€–', shield: 'πŸ›‘οΈ', wrench: 'πŸ”§', clipboard: 'πŸ“‹', folder: 'πŸ“', database: 'πŸ—„οΈ', lightning: '⚑', checkmark: 'βœ…', repair: 'πŸ”§', health: 'πŸ₯' } private colors = { reset: '\x1b[0m', bright: '\x1b[1m', // Helper methods dim: (text: string) => `\x1b[2m${text}\x1b[0m`, red: (text: string) => `\x1b[31m${text}\x1b[0m`, green: (text: string) => `\x1b[32m${text}\x1b[0m`, yellow: (text: string) => `\x1b[33m${text}\x1b[0m`, blue: (text: string) => `\x1b[34m${text}\x1b[0m`, magenta: (text: string) => `\x1b[35m${text}\x1b[0m`, cyan: (text: string) => `\x1b[36m${text}\x1b[0m`, white: (text: string) => `\x1b[37m${text}\x1b[0m`, gray: (text: string) => `\x1b[90m${text}\x1b[0m`, retro: (text: string) => `\x1b[36m${text}\x1b[0m`, success: (text: string) => `\x1b[32m${text}\x1b[0m`, warning: (text: string) => `\x1b[33m${text}\x1b[0m`, error: (text: string) => `\x1b[31m${text}\x1b[0m`, info: (text: string) => `\x1b[34m${text}\x1b[0m`, brain: (text: string) => `\x1b[35m${text}\x1b[0m`, accent: (text: string) => `\x1b[36m${text}\x1b[0m`, premium: (text: string) => `\x1b[33m${text}\x1b[0m`, highlight: (text: string) => `\x1b[1m${text}\x1b[0m` } constructor() { this.configPath = path.join(process.cwd(), '.cortex', 'config.json') this.config = {} as CortexConfig } /** * Load configuration */ private async loadConfig(): Promise { try { await fs.mkdir(path.dirname(this.configPath), { recursive: true }) const configData = await fs.readFile(this.configPath, 'utf-8') this.config = JSON.parse(configData) return this.config } catch { // Config doesn't exist yet, return empty config this.config = {} as CortexConfig return this.config } } /** * Ensure Brainy is initialized */ private async ensureBrainy(): Promise { if (!this.brainy) { const config = await this.loadConfig() this.brainy = new BrainyData(config.brainyOptions || {}) await this.brainy.init() } } /** * Master Key Management - Atomic Age Security Protocols */ private async initializeMasterKey(): Promise { // Try environment variable first const envKey = process.env.CORTEX_MASTER_KEY if (envKey && envKey.length >= 32) { this.encryptionKey = Buffer.from(envKey.substring(0, 32)) this.masterKeySource = 'env' return } // Check for existing stored key const keyPath = path.join(path.dirname(this.configPath), '.master_key') try { const storedKey = await fs.readFile(keyPath) this.encryptionKey = storedKey this.masterKeySource = 'generated' return } catch { // Key doesn't exist, need to create one } // Prompt for passphrase or generate new key const { method } = await prompts({ type: 'select', name: 'method', message: `${emojis.key} ${colors.retro('Select encryption key method:')}`, choices: [ { title: `${emojis.brain} Generate secure key (recommended)`, value: 'generate' }, { title: `${emojis.lock} Create from passphrase`, value: 'passphrase' }, { title: `${emojis.warning} Skip encryption (not secure)`, value: 'skip' } ] }) if (method === 'skip') { console.log(colors.warning(`${emojis.warning} Encryption disabled - secrets will be stored in plain text!`)) return } if (method === 'generate') { this.encryptionKey = crypto.randomBytes(32) this.masterKeySource = 'generated' // Store the key securely await fs.writeFile(keyPath, this.encryptionKey, { mode: 0o600 }) console.log(colors.success(`${emojis.check} Secure master key generated and stored`)) } else if (method === 'passphrase') { const { passphrase } = await prompts({ type: 'password', name: 'passphrase', message: `${emojis.key} Enter master passphrase (min 8 characters):` }) if (!passphrase || passphrase.length < 8) { throw new Error('Passphrase must be at least 8 characters') } // Derive key from passphrase using PBKDF2 const salt = crypto.randomBytes(16) this.encryptionKey = crypto.pbkdf2Sync(passphrase, salt, 100000, 32, 'sha256') this.masterKeySource = 'passphrase' // Store salt for future key derivation const keyData = Buffer.concat([salt, this.encryptionKey]) await fs.writeFile(keyPath, keyData, { mode: 0o600 }) console.log(colors.success(`${emojis.check} Master key derived from passphrase`)) } } /** * Load master key from stored salt + passphrase */ private async loadPassphraseKey(): Promise { const keyPath = path.join(path.dirname(this.configPath), '.master_key') const keyData = await fs.readFile(keyPath) if (keyData.length === 32) { // Simple generated key this.encryptionKey = keyData return } // Extract salt and ask for passphrase const salt = keyData.subarray(0, 16) const { passphrase } = await prompts({ type: 'password', name: 'passphrase', message: `${emojis.key} Enter master passphrase:` }) if (!passphrase) { throw new Error('Passphrase required for encrypted configuration') } this.encryptionKey = crypto.pbkdf2Sync(passphrase, salt, 100000, 32, 'sha256') } /** * Reset master key - for key rotation */ async resetMasterKey(): Promise { console.log(boxen( `${emojis.warning} ${colors.retro('SECURITY PROTOCOL: KEY ROTATION')}\n\n` + `${colors.accent('β—†')} ${colors.dim('This will re-encrypt all stored secrets')}\n` + `${colors.accent('β—†')} ${colors.dim('Ensure you have backups before proceeding')}`, { padding: 1, borderStyle: 'round', borderColor: '#D67441' } )) const { confirm } = await prompts({ type: 'confirm', name: 'confirm', message: 'Proceed with key rotation?', initial: false }) if (!confirm) { console.log(colors.dim('Key rotation cancelled')) return } // Get current decrypted values const currentSecrets = await this.getAllSecrets() // Remove old key const keyPath = path.join(path.dirname(this.configPath), '.master_key') try { await fs.unlink(keyPath) } catch {} // Initialize new key await this.initializeMasterKey() // Re-encrypt all secrets with new key const spinner = ora('Re-encrypting secrets with new key...').start() for (const [key, value] of Object.entries(currentSecrets)) { await this.configSet(key, value, { encrypt: true }) } spinner.succeed(colors.success(`${emojis.check} Key rotation complete! ${Object.keys(currentSecrets).length} secrets re-encrypted`)) } /** * Get all decrypted secrets (for key rotation) */ private async getAllSecrets(): Promise> { const secrets: Record = {} const configMetaPath = path.join(path.dirname(this.configPath), 'config_metadata.json') try { const metadata = JSON.parse(await fs.readFile(configMetaPath, 'utf8')) for (const key of Object.keys(metadata)) { if (metadata[key].encrypted) { const value = await this.configGet(key) if (value) secrets[key] = value } } } catch {} return secrets } /** * Initialize Cortex with beautiful prompts */ async init(options: InitOptions = {}): Promise { const spinner = ora('Initializing Cortex...').start() try { // Check if already initialized if (await this.isInitialized()) { spinner.warn('Cortex is already initialized!') const { reinit } = await prompts({ type: 'confirm', name: 'reinit', message: 'Do you want to reinitialize?', initial: false }) if (!reinit) { spinner.stop() return } } spinner.text = 'Setting up configuration...' // Interactive setup const responses = await prompts([ { type: 'select', name: 'storage', message: `${emojis.disk} Choose your storage type:`, choices: [ { title: `${emojis.disk} Local Filesystem`, value: 'filesystem' }, { title: `${emojis.cloud} AWS S3`, value: 's3' }, { title: `${emojis.cloud} Cloudflare R2`, value: 'r2' }, { title: `${emojis.cloud} Google Cloud Storage`, value: 'gcs' }, { title: `${emojis.brain} Memory (testing)`, value: 'memory' } ] }, { type: (prev: any) => prev === 's3' ? 'text' : null, name: 's3Bucket', message: 'Enter S3 bucket name:' }, { type: (prev: any) => prev === 'r2' ? 'text' : null, name: 'r2Bucket', message: 'Enter Cloudflare R2 bucket name:' }, { type: (prev: any) => prev === 'gcs' ? 'text' : null, name: 'gcsBucket', message: 'Enter GCS bucket name:' }, { type: 'confirm', name: 'encryption', message: `${emojis.lock} Enable encryption for secrets?`, initial: true }, { type: 'confirm', name: 'chat', message: `${emojis.chat} Enable Brainy Chat?`, initial: true }, { type: (prev: any) => prev ? 'select' : null, name: 'llm', message: `${emojis.robot} Choose LLM provider (optional):`, choices: [ { title: 'None (template-based)', value: null }, { title: 'Claude (Anthropic)', value: 'claude-3-5-sonnet' }, { title: 'GPT-4 (OpenAI)', value: 'gpt-4' }, { title: 'Local Model (Hugging Face)', value: 'Xenova/LaMini-Flan-T5-77M' } ] } ]) // Create config this.config = { storage: responses.storage, encryption: responses.encryption, chat: responses.chat, llm: responses.llm, s3Bucket: responses.s3Bucket, r2Bucket: responses.r2Bucket, gcsBucket: responses.gcsBucket, initialized: true, createdAt: new Date().toISOString() } // Setup encryption if (responses.encryption) { await this.initializeMasterKey() this.config.encryptionEnabled = true } // Save configuration await this.saveConfig() // Initialize Brainy spinner.text = 'Initializing Brainy database...' await this.initBrainy() spinner.succeed(colors.success(`${emojis.party} Cortex initialized successfully!`)) // Show welcome message this.showWelcome() } catch (error) { spinner.fail(colors.error('Failed to initialize Cortex')) console.error(error) process.exit(1) } } /** * Beautiful welcome message */ private showWelcome(): void { const welcome = boxen( `${emojis.brain} ${colors.brain('CORTEX')} ${emojis.atom} ${colors.bold('COMMAND CENTER')}\n\n` + `${colors.accent('β—†')} ${colors.dim('Laboratory systems online and ready for operation')}\n\n` + `${emojis.rocket} ${colors.retro('QUICK START PROTOCOLS:')}\n` + ` ${colors.primary('cortex chat')} ${emojis.chat} Neural interface mode\n` + ` ${colors.primary('cortex add')} ${emojis.data} Specimen collection\n` + ` ${colors.primary('cortex search')} ${emojis.search} Data analysis\n` + ` ${colors.primary('cortex config')} ${emojis.config} System parameters\n` + ` ${colors.primary('cortex help')} ${emojis.info} Operations manual`, { padding: 1, margin: 1, borderStyle: 'round', borderColor: '#D67441' // Retro orange border } ) console.log(welcome) } /** * Chat with your data - beautiful interactive mode */ async chat(question?: string): Promise { await this.ensureInitialized() if (!this.chatInstance) { this.chatInstance = new BrainyChat(this.brainy!, { llm: this.config.llm, sources: true }) } // Single question mode if (question) { const spinner = ora('Thinking...').start() try { const answer = await this.chatInstance.ask(question) spinner.stop() console.log(`\n${emojis.robot} ${colors.bold('Answer:')}\n${answer}\n`) } catch (error) { spinner.fail('Failed to get answer') console.error(error) } return } // Interactive chat mode console.log(boxen( `${emojis.brain} ${colors.brain('NEURAL INTERFACE')} ${emojis.magic}\n\n` + `${colors.accent('β—†')} ${colors.dim('Thought-to-data transmission active')}\n` + `${colors.accent('β—†')} ${colors.dim('Query processing protocols engaged')}\n\n` + `${colors.retro('Type "exit" to disengage neural link')}`, { padding: 1, borderStyle: 'round', borderColor: '#E88B5A' } )) const rl = readline.createInterface({ input: process.stdin, output: process.stdout, prompt: colors.primary('You> ') }) rl.prompt() rl.on('line', async (line) => { const input = line.trim() if (input.toLowerCase() === 'exit' || input.toLowerCase() === 'quit') { console.log(`\n${emojis.atom} ${colors.retro('Neural link disengaged')} ${emojis.sparkle}\n`) rl.close() return } if (input) { const spinner = ora('Thinking...').start() try { const answer = await this.chatInstance!.ask(input) spinner.stop() console.log(`\n${emojis.robot} ${colors.success(answer)}\n`) } catch (error) { spinner.fail('Error processing question') console.error(error) } } rl.prompt() }) // Ensure process exits when readline closes rl.on('close', () => { console.log('\n') process.exit(0) }) } /** * Add data with beautiful prompts */ async add(data?: string, metadata?: any): Promise { await this.ensureInitialized() // Interactive mode if no data provided if (!data) { const responses = await prompts([ { type: 'text', name: 'data', message: `${emojis.data} Enter data to add:` }, { type: 'text', name: 'id', message: 'ID (optional, press enter to auto-generate):' }, { type: 'confirm', name: 'hasMetadata', message: 'Add metadata?', initial: false }, { type: (prev: any) => prev ? 'text' : null, name: 'metadata', message: 'Enter metadata (JSON format):' } ]) data = responses.data if (responses.metadata) { try { metadata = JSON.parse(responses.metadata) } catch { console.log(colors.warning('Invalid JSON, skipping metadata')) } } if (responses.id) { metadata = { ...metadata, id: responses.id } } } const spinner = ora('Adding data...').start() try { const id = await this.brainy!.add(data, metadata) spinner.succeed(colors.success(`${emojis.check} Added with ID: ${id}`)) } catch (error) { spinner.fail('Failed to add data') console.error(error) } } /** * Search with beautiful results display and advanced options */ async search(query: string, options: SearchOptions = {}): Promise { await this.ensureInitialized() const limit = options.limit || 10 const spinner = ora(`Searching...`).start() try { // Build search options with MongoDB-style filters const searchOptions: any = {} // Add metadata filters if provided if (options.filter) { searchOptions.metadata = options.filter } // Add graph traversal options if (options.verbs) { searchOptions.includeVerbs = true searchOptions.verbTypes = options.verbs } if (options.depth) { searchOptions.traversalDepth = options.depth } const results = await this.brainy!.search(query, limit, searchOptions) spinner.stop() if (results.length === 0) { console.log(colors.warning(`${emojis.warning} No results found`)) return } // Create beautiful table with dynamic columns const hasVerbs = results.some((r: any) => r.verbs && r.verbs.length > 0) const head = [ colors.bold('Rank'), colors.bold('ID'), colors.bold('Score') ] if (hasVerbs) { head.push(colors.bold('Connections')) } head.push(colors.bold('Metadata')) const table = new Table({ head, style: { head: ['cyan'] } }) results.forEach((result: any, i) => { const row = [ colors.dim(`#${i + 1}`), colors.primary(result.id.slice(0, 25) + (result.id.length > 25 ? '...' : '')), colors.success(`${(result.score * 100).toFixed(1)}%`) ] if (hasVerbs && result.verbs) { const verbs = result.verbs.slice(0, 2).map((v: any) => `${colors.warning(v.type)}: ${v.object.slice(0, 15)}...` ).join('\n') row.push(verbs || '-') } row.push(colors.dim(JSON.stringify(result.metadata || {}).slice(0, 40) + '...')) table.push(row) }) console.log(`\n${emojis.search} ${colors.bold(`Found ${results.length} results:`)}\n`) // Show applied filters if (options.filter) { console.log(colors.dim(` Filters: ${JSON.stringify(options.filter)}`)) } if (options.verbs) { console.log(colors.dim(` Graph traversal: ${options.verbs.join(', ')}`)) } console.log() console.log(table.toString()) } catch (error) { spinner.fail('Search failed') console.error(error) } } /** * Advanced search with interactive prompts */ async advancedSearch(): Promise { await this.ensureInitialized() const responses = await prompts([ { type: 'text', name: 'query', message: `${emojis.search} Enter search query:` }, { type: 'number', name: 'limit', message: 'Number of results:', initial: 10 }, { type: 'confirm', name: 'useFilters', message: 'Add metadata filters (MongoDB-style)?', initial: false }, { type: (prev: any) => prev ? 'text' : null, name: 'filters', message: 'Enter filters (JSON with $gt, $gte, $lt, $lte, $eq, $ne, $in, $nin):\nExample: {"age": {"$gte": 18}, "status": {"$in": ["active", "pending"]}}' }, { type: 'confirm', name: 'useGraph', message: `${emojis.magic} Traverse graph relationships?`, initial: false }, { type: (prev: any) => prev ? 'text' : null, name: 'verbs', message: 'Enter verb types (comma-separated):\nExample: owns, likes, follows' }, { type: (prev: any, values: any) => values.useGraph ? 'number' : null, name: 'depth', message: 'Traversal depth:', initial: 1 } ]) const options: SearchOptions = { limit: responses.limit } if (responses.filters) { try { options.filter = JSON.parse(responses.filters) } catch { console.log(colors.warning('Invalid filter JSON, skipping filters')) } } if (responses.verbs) { options.verbs = responses.verbs.split(',').map((v: string) => v.trim()) options.depth = responses.depth } await this.search(responses.query, options) } /** * Add or update graph connections (verbs) */ async addVerb(subject: string, verb: string, object: string, metadata?: any): Promise { await this.ensureInitialized() const spinner = ora('Adding relationship...').start() try { // For now, we'll add it as a special metadata entry await this.brainy!.add(`${subject} ${verb} ${object}`, { type: 'relationship', subject, verb, object, ...metadata }) spinner.succeed(colors.success(`${emojis.check} Added: ${subject} --[${verb}]--> ${object}`)) } catch (error) { spinner.fail('Failed to add relationship') console.error(error) } } /** * Interactive graph exploration */ async explore(startId?: string): Promise { await this.ensureInitialized() if (!startId) { const { id } = await prompts({ type: 'text', name: 'id', message: `${emojis.search} Enter starting node ID:` }) startId = id } const spinner = ora('Loading graph...').start() try { // Get node and its connections const results = await this.brainy!.search(startId, 1, { includeVerbs: true }) if (results.length === 0) { spinner.fail('Node not found') return } spinner.stop() const node = results[0] as any // Display node info in a beautiful box const nodeInfo = boxen( `${emojis.data} ${colors.bold('Node: ' + node.id)}\n\n` + `${colors.dim('Metadata:')}\n${JSON.stringify(node.metadata || {}, null, 2)}\n\n` + `${colors.dim('Connections:')}\n${ node.verbs && node.verbs.length > 0 ? node.verbs.map((v: any) => ` ${colors.warning(v.type)} β†’ ${colors.primary(v.object)}`).join('\n') : ' No connections' }`, { padding: 1, borderStyle: 'round', borderColor: 'magenta' } ) console.log(nodeInfo) // Interactive exploration menu if (node.verbs && node.verbs.length > 0) { const { action } = await prompts({ type: 'select', name: 'action', message: 'What would you like to do?', choices: [ { title: 'Explore a connected node', value: 'explore' }, { title: 'Add new connection', value: 'add' }, { title: 'Search similar nodes', value: 'similar' }, { title: 'Exit', value: 'exit' } ] }) if (action === 'explore') { const { next } = await prompts({ type: 'select', name: 'next', message: 'Choose node to explore:', choices: node.verbs.map((v: any) => ({ title: `${v.object} (via ${v.type})`, value: v.object })) }) await this.explore(next) } else if (action === 'add') { const newVerb = await prompts([ { type: 'text', name: 'verb', message: 'Relationship type:' }, { type: 'text', name: 'object', message: 'Target node ID:' } ]) await this.addVerb(startId!, newVerb.verb, newVerb.object) await this.explore(startId) } else if (action === 'similar') { await this.search(startId!, { limit: 5 }) } } } catch (error) { spinner.fail('Failed to explore graph') console.error(error) } } /** * Configuration management with encryption */ async configSet(key: string, value: string, options: { encrypt?: boolean } = {}): Promise { await this.ensureInitialized() const isSecret = options.encrypt || this.isSecret(key) if (isSecret && this.encryptionKey) { // Encrypt the value const iv = crypto.randomBytes(16) const cipher = crypto.createCipheriv('aes-256-gcm', this.encryptionKey, iv) let encrypted = cipher.update(value, 'utf8', 'hex') encrypted += cipher.final('hex') const authTag = cipher.getAuthTag() value = `ENCRYPTED:${iv.toString('hex')}:${authTag.toString('hex')}:${encrypted}` console.log(colors.success(`${emojis.lock} Stored encrypted: ${key}`)) } else { console.log(colors.success(`${emojis.check} Stored: ${key}`)) } // Store in Brainy await this.brainy!.add(value, { type: 'config', key, encrypted: isSecret, timestamp: new Date().toISOString() }) } /** * Get configuration value */ async configGet(key: string): Promise { await this.ensureInitialized() const results = await this.brainy!.search(key, 1, { metadata: { type: 'config', key } }) if (results.length === 0) { return null } let value = results[0].id // Decrypt if needed if (value.startsWith('ENCRYPTED:') && this.encryptionKey) { const [, iv, authTag, encrypted] = value.split(':') const decipher = crypto.createDecipheriv( 'aes-256-gcm', this.encryptionKey, Buffer.from(iv, 'hex') ) decipher.setAuthTag(Buffer.from(authTag, 'hex')) let decrypted = decipher.update(encrypted, 'hex', 'utf8') decrypted += decipher.final('utf8') value = decrypted } return value } /** * List all configuration */ async configList(): Promise { await this.ensureInitialized() const spinner = ora('Loading configuration...').start() try { const results = await this.brainy!.search('', 100, { metadata: { type: 'config' } }) spinner.stop() if (results.length === 0) { console.log(colors.warning('No configuration found')) return } const table = new Table({ head: [colors.bold('Key'), colors.bold('Encrypted'), colors.bold('Timestamp')], style: { head: ['cyan'] } }) results.forEach(result => { const meta = result.metadata as any table.push([ colors.primary(meta.key), meta.encrypted ? `${emojis.lock} Yes` : 'No', colors.dim(new Date(meta.timestamp).toLocaleString()) ]) }) console.log(`\n${emojis.config} ${colors.bold('Configuration:')}\n`) console.log(table.toString()) } catch (error) { spinner.fail('Failed to list configuration') console.error(error) } } /** * Storage migration with beautiful progress */ async migrate(options: MigrateOptions): Promise { await this.ensureInitialized() console.log(boxen( `${emojis.package} ${colors.bold('Storage Migration')}\n` + `From: ${colors.dim(this.config.storage)}\n` + `To: ${colors.primary(options.to)}`, { padding: 1, borderStyle: 'round', borderColor: 'yellow' } )) const { confirm } = await prompts({ type: 'confirm', name: 'confirm', message: 'Start migration?', initial: true }) if (!confirm) { console.log(colors.dim('Migration cancelled')) return } const spinner = ora('Starting migration...').start() try { // Create new Brainy instance with target storage let targetConfig: any = {} if (options.to === 'filesystem') { targetConfig.storage = { forceFileSystemStorage: true } } else if (options.to === 's3' && options.bucket) { targetConfig.storage = { s3Storage: { bucketName: options.bucket } } } else if (options.to === 'gcs' && options.bucket) { targetConfig.storage = { gcsStorage: { bucketName: options.bucket } } } else if (options.to === 'memory') { targetConfig.storage = { forceMemoryStorage: true } } const targetBrainy = new BrainyData(targetConfig) await targetBrainy.init() spinner.text = 'Counting items...' // For now, we'll search for all items const allData = await this.brainy!.search('', 1000) const total = allData.length spinner.text = `Migrating ${total} items...` for (let i = 0; i < allData.length; i++) { const item = allData[i] // Re-add the data to the new storage await targetBrainy.add(item.id, item.metadata || {}) if (i % 10 === 0) { spinner.text = `Migrating... ${i + 1}/${total} (${((i + 1) / total * 100).toFixed(0)}%)` } } spinner.succeed(colors.success(`${emojis.party} Migration complete! ${total} items migrated.`)) // Update config this.config.storage = options.to if (options.bucket) { if (options.to === 's3') this.config.s3Bucket = options.bucket if (options.to === 'gcs') this.config.gcsBucket = options.bucket } await this.saveConfig() } catch (error) { spinner.fail('Migration failed') console.error(error) process.exit(1) } } /** * Show comprehensive statistics and database info */ async stats(detailed: boolean = false): Promise { await this.ensureInitialized() const spinner = ora('Gathering statistics...').start() try { // Gather comprehensive stats const allItems = await this.brainy!.search('', 1000) const itemsWithVerbs = allItems.filter((item: any) => item.verbs && item.verbs.length > 0) // Count unique field names const fieldCounts = new Map() const fieldTypes = new Map>() allItems.forEach((item: any) => { if (item.metadata) { Object.entries(item.metadata).forEach(([key, value]) => { fieldCounts.set(key, (fieldCounts.get(key) || 0) + 1) if (!fieldTypes.has(key)) { fieldTypes.set(key, new Set()) } fieldTypes.get(key)!.add(typeof value) }) } }) // Calculate storage size (approximate) const storageSize = JSON.stringify(allItems).length const stats = { totalItems: allItems.length, itemsWithMetadata: allItems.filter((i: any) => i.metadata).length, itemsWithConnections: itemsWithVerbs.length, totalConnections: itemsWithVerbs.reduce((sum: number, item: any) => sum + item.verbs.length, 0), avgConnections: itemsWithVerbs.length > 0 ? itemsWithVerbs.reduce((sum: number, item: any) => sum + item.verbs.length, 0) / itemsWithVerbs.length : 0, uniqueFields: fieldCounts.size, storageSize, dimensions: 384, embeddingModel: 'all-MiniLM-L6-v2' } spinner.stop() // Atomic age statistics display const statsBox = boxen( `${emojis.atom} ${colors.brain('LABORATORY STATUS')} ${emojis.data}\n\n` + `${colors.retro('β—† Specimen Count:')} ${colors.highlight(stats.totalItems)}\n` + `${colors.retro('β—† Catalogued:')} ${colors.highlight(stats.itemsWithMetadata)} ${colors.accent('(' + (stats.itemsWithMetadata/stats.totalItems*100).toFixed(1)+'%)')}\n` + `${colors.retro('β—† Neural Links:')} ${colors.highlight(stats.itemsWithConnections)}\n` + `${colors.retro('β—† Total Connections:')} ${colors.highlight(stats.totalConnections)}\n` + `${colors.retro('β—† Avg Network Density:')} ${colors.highlight(stats.avgConnections.toFixed(2))}\n` + `${colors.retro('β—† Data Dimensions:')} ${colors.highlight(stats.uniqueFields)}\n` + `${colors.retro('β—† Storage Matrix:')} ${colors.accent((stats.storageSize / 1024).toFixed(2) + ' KB')}\n` + `${colors.retro('β—† Archive Type:')} ${colors.primary(this.config.storage)}\n` + `${colors.retro('β—† Neural Model:')} ${colors.info(stats.embeddingModel)} ${colors.dim('(' + stats.dimensions + 'd)')}`, { padding: 1, borderStyle: 'round', borderColor: '#D67441' // Retro orange border } ) console.log(statsBox) // Detailed field statistics if requested if (detailed && fieldCounts.size > 0) { const fieldTable = new Table({ head: [ colors.bold('Field Name'), colors.bold('Count'), colors.bold('Coverage'), colors.bold('Types') ], style: { head: ['cyan'] } }) Array.from(fieldCounts.entries()) .sort((a, b) => b[1] - a[1]) .slice(0, 15) .forEach(([field, count]) => { fieldTable.push([ colors.primary(field), count.toString(), `${(count / stats.totalItems * 100).toFixed(1)}%`, Array.from(fieldTypes.get(field) || []).join(', ') ]) }) console.log(`\n${colors.bold('Top Fields:')}\n`) console.log(fieldTable.toString()) } } catch (error) { spinner.fail('Failed to get statistics') console.error(error) } } /** * List all searchable fields with statistics */ async listFields(): Promise { await this.ensureInitialized() const spinner = ora('Analyzing fields...').start() try { const allItems = await this.brainy!.search('', 1000) const fieldInfo = new Map, samples: any[] }>() // Analyze all fields allItems.forEach((item: any) => { if (item.metadata) { Object.entries(item.metadata).forEach(([key, value]) => { if (!fieldInfo.has(key)) { fieldInfo.set(key, { count: 0, types: new Set(), samples: [] }) } const info = fieldInfo.get(key)! info.count++ info.types.add(typeof value) if (info.samples.length < 3 && value !== null && value !== undefined) { info.samples.push(value) } }) } }) spinner.stop() if (fieldInfo.size === 0) { console.log(colors.warning('No fields found in metadata')) return } const table = new Table({ head: [ colors.bold('Field'), colors.bold('Type(s)'), colors.bold('Count'), colors.bold('Sample Values') ], style: { head: ['cyan'] }, colWidths: [20, 15, 10, 40] }) Array.from(fieldInfo.entries()) .sort((a, b) => b[1].count - a[1].count) .forEach(([field, info]) => { const samples = info.samples .slice(0, 2) .map(s => JSON.stringify(s).slice(0, 20)) .join(', ') table.push([ colors.primary(field), Array.from(info.types).join(', '), info.count.toString(), colors.dim(samples + (info.samples.length > 2 ? '...' : '')) ]) }) console.log(`\n${emojis.search} ${colors.bold('Searchable Fields:')}\n`) console.log(table.toString()) console.log(`\n${colors.dim('Use these fields in searches:')}`); console.log(colors.dim(`cortex search "query" --filter '{"${Array.from(fieldInfo.keys())[0]}": "value"}'`)) } catch (error) { spinner.fail('Failed to analyze fields') console.error(error) } } /** * Setup LLM progressively with auto-download */ async setupLLM(provider?: string): Promise { await this.ensureInitialized() console.log(boxen( `${emojis.robot} ${colors.bold('LLM Setup Assistant')}\n` + `${colors.dim('Configure AI models for enhanced chat')}`, { padding: 1, borderStyle: 'round', borderColor: 'magenta' } )) const choices = [ { title: `${emojis.brain} Local Model (No API key needed)`, value: 'local', description: 'Download and run models locally' }, { title: `${emojis.cloud} Claude (Anthropic)`, value: 'claude', description: 'Most capable, requires API key' }, { title: `${emojis.cloud} GPT-4 (OpenAI)`, value: 'openai', description: 'Powerful, requires API key' }, { title: `${emojis.sparkle} Ollama (Local server)`, value: 'ollama', description: 'Connect to local Ollama instance' }, { title: `${emojis.magic} Claude Desktop`, value: 'claude-desktop', description: 'Use Claude app on your computer' } ] const { llmType } = await prompts({ type: 'select', name: 'llmType', message: 'Choose LLM provider:', choices: provider ? choices.filter(c => c.value === provider) : choices }) switch (llmType) { case 'local': await this.setupLocalLLM() break case 'claude': await this.setupClaudeLLM() break case 'openai': await this.setupOpenAILLM() break case 'ollama': await this.setupOllamaLLM() break case 'claude-desktop': await this.setupClaudeDesktop() break } } private async setupLocalLLM(): Promise { const { model } = await prompts({ type: 'select', name: 'model', message: 'Choose a local model:', choices: [ { title: 'LaMini-Flan-T5 (77M, fast)', value: 'Xenova/LaMini-Flan-T5-77M' }, { title: 'Phi-2 (2.7B, balanced)', value: 'microsoft/phi-2' }, { title: 'CodeLlama (7B, for code)', value: 'codellama/CodeLlama-7b-hf' }, { title: 'Custom Hugging Face model', value: 'custom' } ] }) let modelName = model if (model === 'custom') { const { customModel } = await prompts({ type: 'text', name: 'customModel', message: 'Enter Hugging Face model ID (e.g., microsoft/DialoGPT-medium):' }) modelName = customModel } const spinner = ora(`Downloading ${modelName}...`).start() try { // Save configuration await this.configSet('LLM_PROVIDER', 'local') await this.configSet('LLM_MODEL', modelName) // Test the model this.config.llm = modelName this.chatInstance = new BrainyChat(this.brainy!, { llm: modelName }) spinner.succeed(colors.success(`${emojis.check} Local model configured: ${modelName}`)) console.log(colors.dim('\nModel will download on first use. This may take a few minutes.')) } catch (error) { spinner.fail('Failed to setup local model') console.error(error) } } private async setupClaudeLLM(): Promise { const { apiKey } = await prompts({ type: 'password', name: 'apiKey', message: 'Enter your Anthropic API key:' }) if (apiKey) { await this.configSet('ANTHROPIC_API_KEY', apiKey, { encrypt: true }) await this.configSet('LLM_PROVIDER', 'claude') await this.configSet('LLM_MODEL', 'claude-3-5-sonnet-20241022') this.config.llm = 'claude-3-5-sonnet' console.log(colors.success(`${emojis.check} Claude configured successfully!`)) } } private async setupOpenAILLM(): Promise { const { apiKey } = await prompts({ type: 'password', name: 'apiKey', message: 'Enter your OpenAI API key:' }) if (apiKey) { await this.configSet('OPENAI_API_KEY', apiKey, { encrypt: true }) await this.configSet('LLM_PROVIDER', 'openai') await this.configSet('LLM_MODEL', 'gpt-4o-mini') this.config.llm = 'gpt-4o-mini' console.log(colors.success(`${emojis.check} OpenAI configured successfully!`)) } } private async setupOllamaLLM(): Promise { const { url, model } = await prompts([ { type: 'text', name: 'url', message: 'Ollama server URL:', initial: 'http://localhost:11434' }, { type: 'text', name: 'model', message: 'Model name:', initial: 'llama2' } ]) await this.configSet('OLLAMA_URL', url) await this.configSet('OLLAMA_MODEL', model) await this.configSet('LLM_PROVIDER', 'ollama') console.log(colors.success(`${emojis.check} Ollama configured!`)) console.log(colors.dim(`Make sure Ollama is running: ollama run ${model}`)) } private async setupClaudeDesktop(): Promise { console.log(colors.info(`${emojis.info} Claude Desktop integration coming soon!`)) console.log(colors.dim('This will allow using Claude app as your LLM provider')) } /** * Use the embedding model for other tasks */ async embed(text: string): Promise { await this.ensureInitialized() const spinner = ora('Generating embedding...').start() try { // Use Brainy's built-in embedding const vector = await this.brainy!.embed(text) spinner.stop() console.log(boxen( `${emojis.sparkle} ${colors.bold('Text Embedding')}\n\n` + `${colors.dim('Input:')}\n"${text}"\n\n` + `${colors.dim('Model:')} all-MiniLM-L6-v2 (384d)\n` + `${colors.dim('Vector:')} [${vector.slice(0, 5).map(v => v.toFixed(4)).join(', ')}...]\n` + `${colors.dim('Magnitude:')} ${Math.sqrt(vector.reduce((sum, v) => sum + v * v, 0)).toFixed(4)}`, { padding: 1, borderStyle: 'round', borderColor: 'cyan' } )) } catch (error) { spinner.fail('Failed to generate embedding') console.error(error) } } /** * Calculate similarity between two texts */ async similarity(text1: string, text2: string): Promise { await this.ensureInitialized() const spinner = ora('Calculating similarity...').start() try { const vector1 = await this.brainy!.embed(text1) const vector2 = await this.brainy!.embed(text2) // Calculate cosine similarity const dotProduct = vector1.reduce((sum, v, i) => sum + v * vector2[i], 0) const mag1 = Math.sqrt(vector1.reduce((sum, v) => sum + v * v, 0)) const mag2 = Math.sqrt(vector2.reduce((sum, v) => sum + v * v, 0)) const similarity = dotProduct / (mag1 * mag2) spinner.stop() const color = similarity > 0.8 ? colors.success : similarity > 0.5 ? colors.warning : colors.error console.log(boxen( `${emojis.search} ${colors.bold('Semantic Similarity')}\n\n` + `${colors.dim('Text 1:')}\n"${text1}"\n\n` + `${colors.dim('Text 2:')}\n"${text2}"\n\n` + `${colors.bold('Similarity:')} ${color((similarity * 100).toFixed(1) + '%')}\n` + `${this.getSimilarityInterpretation(similarity)}`, { padding: 1, borderStyle: 'round', borderColor: 'magenta' } )) } catch (error) { spinner.fail('Failed to calculate similarity') console.error(error) } } private getSimilarityInterpretation(score: number): string { if (score > 0.9) return colors.success('✨ Nearly identical meaning') if (score > 0.8) return colors.success('🎯 Very similar') if (score > 0.7) return colors.warning('πŸ‘ Similar') if (score > 0.5) return colors.warning('πŸ€” Somewhat related') if (score > 0.3) return colors.error('😐 Loosely related') return colors.error('❌ Unrelated') } /** * Import .env file with automatic encryption of secrets */ async importEnv(filePath: string): Promise { await this.ensureInitialized() const spinner = ora('Importing environment variables...').start() try { const envContent = await fs.readFile(filePath, 'utf-8') const lines = envContent.split('\n') let imported = 0 let encrypted = 0 for (const line of lines) { const trimmed = line.trim() if (!trimmed || trimmed.startsWith('#')) continue const [key, ...valueParts] = trimmed.split('=') const value = valueParts.join('=').replace(/^["']|["']$/g, '') if (key && value) { const shouldEncrypt = this.isSecret(key) await this.configSet(key, value, { encrypt: shouldEncrypt }) imported++ if (shouldEncrypt) encrypted++ } } spinner.succeed(colors.success( `${emojis.check} Imported ${imported} variables (${encrypted} encrypted)` )) } catch (error) { spinner.fail('Failed to import .env file') console.error(error) } } /** * Export configuration to .env file */ async exportEnv(filePath: string): Promise { await this.ensureInitialized() const spinner = ora('Exporting configuration...').start() try { const results = await this.brainy!.search('', 1000, { metadata: { type: 'config' } }) let content = '# Exported from Cortex\n' content += `# Generated: ${new Date().toISOString()}\n\n` for (const result of results) { const meta = result.metadata as any if (meta?.key) { const value = await this.configGet(meta.key) if (value) { content += `${meta.key}=${value}\n` } } } await fs.writeFile(filePath, content) spinner.succeed(colors.success(`${emojis.check} Exported to ${filePath}`)) } catch (error) { spinner.fail('Failed to export configuration') console.error(error) } } /** * Delete data by ID */ async delete(id: string): Promise { await this.ensureInitialized() const spinner = ora('Deleting...').start() try { // For now, mark as deleted in metadata await this.brainy!.add(id, { _deleted: true, _deletedAt: new Date().toISOString() }) spinner.succeed(colors.success(`${emojis.check} Deleted: ${id}`)) } catch (error) { spinner.fail('Delete failed') console.error(error) } } /** * Update data by ID */ async update(id: string, data: string, metadata?: any): Promise { await this.ensureInitialized() const spinner = ora('Updating...').start() try { // Re-add with same ID (overwrites) await this.brainy!.add(data, { ...metadata, id, _updated: true, _updatedAt: new Date().toISOString() }) spinner.succeed(colors.success(`${emojis.check} Updated: ${id}`)) } catch (error) { spinner.fail('Update failed') console.error(error) } } /** * Helpers */ private async ensureInitialized(): Promise { if (!await this.isInitialized()) { console.log(colors.warning(`${emojis.warning} Cortex not initialized. Run 'cortex init' first.`)) process.exit(1) } // Load encryption key if encryption is enabled if (this.config.encryptionEnabled && !this.encryptionKey) { await this.loadMasterKey() } // Load custom secret patterns await this.loadCustomPatterns() if (!this.brainy) { await this.initBrainy() } } /** * Load master key from various sources */ private async loadMasterKey(): Promise { // Try environment variable first const envKey = process.env.CORTEX_MASTER_KEY if (envKey && envKey.length >= 32) { this.encryptionKey = Buffer.from(envKey.substring(0, 32)) this.masterKeySource = 'env' return } // Try stored key file const keyPath = path.join(path.dirname(this.configPath), '.master_key') try { await fs.access(keyPath) const keyData = await fs.readFile(keyPath) if (keyData.length === 32) { // Generated key this.encryptionKey = keyData this.masterKeySource = 'generated' } else { // Passphrase-derived key await this.loadPassphraseKey() this.masterKeySource = 'passphrase' } } catch { console.log(colors.warning(`${emojis.warning} Encryption key not found. Some features may not work.`)) } } private async isInitialized(): Promise { try { await fs.access(this.configPath) const data = await fs.readFile(this.configPath, 'utf-8') this.config = JSON.parse(data) return this.config.initialized === true } catch { return false } } private async initBrainy(): Promise { // Map storage type to BrainyData config let config: any = {} if (this.config.storage === 'filesystem') { config.storage = { forceFileSystemStorage: true } } else if (this.config.storage === 's3' && this.config.s3Bucket) { config.storage = { s3Storage: { bucketName: this.config.s3Bucket } } } else if (this.config.storage === 'r2' && this.config.r2Bucket) { // Cloudflare R2 is S3-compatible, so we use the s3Storage configuration // Users need to set environment variables: // CLOUDFLARE_R2_ACCOUNT_ID, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY config.storage = { s3Storage: { bucketName: this.config.r2Bucket, // R2 endpoint format: https://.r2.cloudflarestorage.com // The actual account ID should come from environment variables endpoint: process.env.CLOUDFLARE_R2_ENDPOINT || `https://${process.env.CLOUDFLARE_R2_ACCOUNT_ID}.r2.cloudflarestorage.com` } } } else if (this.config.storage === 'gcs' && this.config.gcsBucket) { config.storage = { gcsStorage: { bucketName: this.config.gcsBucket } } } else if (this.config.storage === 'memory') { config.storage = { forceMemoryStorage: true } } this.brainy = new BrainyData(config) await this.brainy.init() // Initialize monitoring systems this.performanceMonitor = new PerformanceMonitor(this.brainy) this.healthCheck = new HealthCheck(this.brainy) // Initialize licensing system // Licensing system moved to quantum-vault for premium features // Open source version has full functionality available } private async saveConfig(): Promise { const dir = path.dirname(this.configPath) await fs.mkdir(dir, { recursive: true }) await fs.writeFile(this.configPath, JSON.stringify(this.config, null, 2)) } /** * Configuration categories for enhanced secret management */ public static readonly CONFIG_CATEGORIES = { SECRET: 'secret', // Encrypted, never logged SENSITIVE: 'sensitive', // Encrypted, logged as [MASKED] CONFIG: 'config', // Plain text configuration PUBLIC: 'public' // Can be exposed publicly } as const private customSecretPatterns: RegExp[] = [] /** * Enhanced secret detection with custom patterns and categories */ private isSecret(key: string): boolean { const defaultSecretPatterns = [ // Standard secret patterns /key$/i, /token$/i, /secret$/i, /password$/i, /pass$/i, /^api[_-]?key$/i, /^auth[_-]?token$/i, // API keys /^openai[_-]?api[_-]?key$/i, /^anthropic[_-]?api[_-]?key$/i, /^claude[_-]?api[_-]?key$/i, /^huggingface[_-]?token$/i, /^github[_-]?token$/i, /^gitlab[_-]?token$/i, // Database URLs /database.*url$/i, /db.*url$/i, /connection[_-]?string$/i, /mongo.*url$/i, /redis.*url$/i, /postgres.*url$/i, // Cloud & Infrastructure /aws.*key$/i, /aws.*secret$/i, /azure.*key$/i, /gcp.*key$/i, /docker.*password$/i, /registry.*password$/i, // Production patterns /.*_prod_.*$/i, /.*_production_.*$/i, /.*_live_.*$/i, /.*_master_.*$/i, // Common service patterns /stripe.*key$/i, /twilio.*token$/i, /sendgrid.*key$/i, /jwt.*secret$/i, /session.*secret$/i, /encryption.*key$/i ] // Combine default and custom patterns const allPatterns = [...defaultSecretPatterns, ...this.customSecretPatterns] return allPatterns.some(pattern => pattern.test(key)) } /** * Add custom secret detection patterns */ async addSecretPattern(pattern: string): Promise { try { const regex = new RegExp(pattern, 'i') this.customSecretPatterns.push(regex) // Persist custom patterns await this.saveCustomPatterns() console.log(colors.success(`${emojis.check} Added secret pattern: ${pattern}`)) } catch (error) { throw new Error(`Invalid regex pattern: ${pattern}`) } } /** * Remove custom secret detection pattern */ async removeSecretPattern(pattern: string): Promise { const index = this.customSecretPatterns.findIndex(p => p.source === pattern) if (index === -1) { throw new Error(`Pattern not found: ${pattern}`) } this.customSecretPatterns.splice(index, 1) await this.saveCustomPatterns() console.log(colors.success(`${emojis.check} Removed secret pattern: ${pattern}`)) } /** * List all secret detection patterns */ async listSecretPatterns(): Promise { console.log(boxen( `${emojis.shield} ${colors.brain('SECRET DETECTION PATTERNS')}\n\n` + `${colors.retro('β—† Built-in Patterns:')}\n` + ` β€’ API keys (*_key, *_token, *_secret)\n` + ` β€’ Database URLs (*_url, connection_string)\n` + ` β€’ Cloud credentials (aws_*, azure_*, gcp_*)\n` + ` β€’ Production vars (*_prod_*, *_production_*)\n\n` + `${colors.retro('β—† Custom Patterns:')}\n` + (this.customSecretPatterns.length > 0 ? this.customSecretPatterns.map(p => ` β€’ ${p.source}`).join('\n') : ` ${colors.dim('No custom patterns defined')}` ), { padding: 1, borderStyle: 'round', borderColor: '#D67441' } )) } /** * Save custom patterns to disk */ private async saveCustomPatterns(): Promise { const patternsPath = path.join(path.dirname(this.configPath), 'secret_patterns.json') const patterns = this.customSecretPatterns.map(p => p.source) await fs.writeFile(patternsPath, JSON.stringify(patterns, null, 2)) } /** * Load custom patterns from disk */ private async loadCustomPatterns(): Promise { const patternsPath = path.join(path.dirname(this.configPath), 'secret_patterns.json') try { const data = await fs.readFile(patternsPath, 'utf8') const patterns = JSON.parse(data) this.customSecretPatterns = patterns.map((p: string) => new RegExp(p, 'i')) } catch { // No custom patterns yet } } /** * Determine config category for enhanced management */ private getConfigCategory(key: string): string { // Explicit production configuration if (key.match(/node_env|environment|stage|tier/i)) { return Cortex.CONFIG_CATEGORIES.CONFIG } // Public configuration (can be exposed) if (key.match(/port|host|timeout|retry|limit|version/i)) { return Cortex.CONFIG_CATEGORIES.PUBLIC } // Sensitive but not secret (URLs, emails, usernames) if (key.match(/url|email|username|user_id|org|organization/i) && !this.isSecret(key)) { return Cortex.CONFIG_CATEGORIES.SENSITIVE } // Default to secret if matches patterns if (this.isSecret(key)) { return Cortex.CONFIG_CATEGORIES.SECRET } return Cortex.CONFIG_CATEGORIES.CONFIG } /** * Cortex Augmentation System - AI-Powered Data Understanding */ async neuralImport(filePath: string, options: any = {}): Promise { await this.ensureInitialized() // Import and create the Cortex SENSE augmentation const { CortexSenseAugmentation } = await import('../augmentations/cortexSense.js') const neuralSense = new CortexSenseAugmentation(this.brainy!, options) // Initialize the augmentation await neuralSense.initialize() try { // Read the file const fs = await import('fs/promises') const fileContent = await fs.readFile(filePath, 'utf8') const dataType = this.getDataTypeFromPath(filePath) // Use the SENSE augmentation to process the data const result = await neuralSense.processRawData(fileContent, dataType, options) if (result.success) { console.log(colors.success('βœ… Cortex import completed successfully')) // Display summary console.log(colors.primary(`πŸ“Š Processed: ${result.data.nouns.length} entities, ${result.data.verbs.length} relationships`)) if (result.data.confidence !== undefined) { console.log(colors.primary(`🎯 Overall confidence: ${(result.data.confidence * 100).toFixed(1)}%`)) } if (result.data.insights && result.data.insights.length > 0) { console.log(colors.brain('\n🧠 Neural Insights:')) result.data.insights.forEach((insight: any) => { console.log(` ${colors.accent('β—†')} ${insight.description} (${(insight.confidence * 100).toFixed(1)}%)`) }) } } else { console.error(colors.error('❌ Cortex import failed:'), result.error) } } finally { await neuralSense.shutDown() } } async neuralAnalyze(filePath: string): Promise { await this.ensureInitialized() const { CortexSenseAugmentation } = await import('../augmentations/cortexSense.js') const neuralSense = new CortexSenseAugmentation(this.brainy!) await neuralSense.initialize() try { const fs = await import('fs/promises') const fileContent = await fs.readFile(filePath, 'utf8') const dataType = this.getDataTypeFromPath(filePath) // Use the analyzeStructure method const result = await neuralSense.analyzeStructure!(fileContent, dataType) if (result.success) { console.log(boxen( `${emojis.lab} ${colors.brain('NEURAL ANALYSIS RESULTS')}\n\n` + `Entity Types: ${result.data.entityTypes.length}\n` + `Relationship Types: ${result.data.relationshipTypes.length}\n` + `Data Quality Score: ${((result.data.dataQuality.completeness + result.data.dataQuality.consistency + result.data.dataQuality.accuracy) / 3 * 100).toFixed(1)}%`, { padding: 1, borderStyle: 'round', borderColor: '#E88B5A' } )) if (result.data.recommendations.length > 0) { console.log(colors.brain('\nπŸ’‘ Recommendations:')) result.data.recommendations.forEach((rec: any) => { console.log(` ${colors.accent('β—†')} ${rec}`) }) } } else { console.error(colors.error('❌ Analysis failed:'), result.error) } } finally { await neuralSense.shutDown() } } async neuralValidate(filePath: string): Promise { await this.ensureInitialized() const { CortexSenseAugmentation } = await import('../augmentations/cortexSense.js') const neuralSense = new CortexSenseAugmentation(this.brainy!) await neuralSense.initialize() try { const fs = await import('fs/promises') const fileContent = await fs.readFile(filePath, 'utf8') const dataType = this.getDataTypeFromPath(filePath) // Use the validateCompatibility method const result = await neuralSense.validateCompatibility!(fileContent, dataType) if (result.success) { const statusIcon = result.data.compatible ? 'βœ…' : '⚠️' const statusText = result.data.compatible ? 'COMPATIBLE' : 'COMPATIBILITY ISSUES' console.log(boxen( `${statusIcon} ${colors.brain(`DATA ${statusText}`)}\n\n` + `Compatible: ${result.data.compatible ? 'Yes' : 'No'}\n` + `Issues Found: ${result.data.issues.length}\n` + `Suggestions: ${result.data.suggestions.length}`, { padding: 1, borderStyle: 'round', borderColor: result.data.compatible ? '#2D4A3A' : '#D67441' } )) if (result.data.issues.length > 0) { console.log(colors.warning('\n⚠️ Issues:')) result.data.issues.forEach((issue: any) => { const severityColor = issue.severity === 'high' ? colors.error : issue.severity === 'medium' ? colors.warning : colors.dim console.log(` ${severityColor(`[${issue.severity.toUpperCase()}]`)} ${issue.description}`) }) } if (result.data.suggestions.length > 0) { console.log(colors.brain('\nπŸ’‘ Suggestions:')) result.data.suggestions.forEach((suggestion: any) => { console.log(` ${colors.accent('β—†')} ${suggestion}`) }) } } else { console.error(colors.error('❌ Validation failed:'), result.error) } } finally { await neuralSense.shutDown() } } async neuralTypes(): Promise { await this.ensureInitialized() const { NounType, VerbType } = await import('../types/graphTypes.js') console.log(boxen( `${emojis.atom} ${colors.brain('NEURAL TYPE SYSTEM')}\n\n` + `${colors.retro('β—† Available Noun Types:')} ${colors.highlight(Object.keys(NounType).length.toString())}\n` + `${colors.retro('β—† Available Verb Types:')} ${colors.highlight(Object.keys(VerbType).length.toString())}\n\n` + `${colors.accent('β—†')} ${colors.dim('Noun categories: Person, Organization, Location, Thing, Concept, Event...')}\n` + `${colors.accent('β—†')} ${colors.dim('Verb categories: Social, Temporal, Causal, Ownership, Functional...')}`, { padding: 1, borderStyle: 'round', borderColor: '#E88B5A' } )) // Show sample types console.log(`\n${colors.highlight('Sample Noun Types:')}`) Object.entries(NounType).slice(0, 8).forEach(([key, value]) => { console.log(` ${colors.primary('β€’')} ${key}: ${colors.dim(value)}`) }) console.log(`\n${colors.highlight('Sample Verb Types:')}`) Object.entries(VerbType).slice(0, 8).forEach(([key, value]) => { console.log(` ${colors.primary('β€’')} ${key}: ${colors.dim(value)}`) }) console.log(`\n${colors.dim('Use')} ${colors.primary('brainy import --cortex ')} ${colors.dim('to leverage the full AI type system!')}`) } /** * Augmentation Pipeline Management - Control the Neural Enhancement System */ async listAugmentations(): Promise { await this.ensureInitialized() const spinner = ora('Scanning augmentation systems...').start() try { // Get current pipeline configuration (placeholder for now) spinner.stop() // For now, show that augmentation system is available but needs integration console.log(colors.info(`${emojis.atom} Augmentation system detected but integration pending`)) // Show current pipeline status console.log(boxen( `${emojis.atom} ${colors.brain('AUGMENTATION PIPELINE STATUS')}\n\n` + `${colors.retro('β—† Pipeline State:')} ${colors.success('ACTIVE')}\n` + `${colors.retro('β—† Registry Loaded:')} ${colors.success('OPERATIONAL')}\n` + `${colors.retro('β—† Available Categories:')} SENSE, MEMORY, COGNITION, CONDUIT, ACTIVATION, PERCEPTION, DIALOG, WEBSOCKET`, { padding: 1, borderStyle: 'round', borderColor: '#E88B5A' } )) // List active augmentations by category const categories = ['SENSE', 'MEMORY', 'COGNITION', 'CONDUIT', 'ACTIVATION', 'PERCEPTION', 'DIALOG', 'WEBSOCKET'] for (const category of categories) { console.log(`\n${colors.highlight(category)} ${colors.dim('Augmentations:')}`) // This would need to be implemented in the actual augmentation system // For now, show example structure console.log(` ${colors.dim('β€’ Available augmentations would be listed here')}\n ${colors.dim('β€’ Status: Active/Inactive')}\n ${colors.dim('β€’ Configuration: Parameters')}`) } } catch (error) { spinner.fail('Failed to scan augmentations') console.error(error) } } async addAugmentation(type: string, position?: number, config?: any): Promise { await this.ensureInitialized() console.log(boxen( `${emojis.magic} ${colors.retro('NEURAL ENHANCEMENT PROTOCOL')}\n\n` + `${colors.accent('β—†')} ${colors.dim('Adding augmentation to pipeline')}\n` + `${colors.accent('β—†')} ${colors.dim('Type:')} ${colors.highlight(type)}\n` + `${colors.accent('β—†')} ${colors.dim('Position:')} ${colors.highlight(position || 'auto')}`, { padding: 1, borderStyle: 'round', borderColor: '#D67441' } )) const { confirm } = await prompts({ type: 'confirm', name: 'confirm', message: 'Add this augmentation to the pipeline?', initial: true }) if (!confirm) { console.log(colors.dim('Augmentation addition cancelled')) return } const spinner = ora('Installing augmentation...').start() try { // This would interface with the actual augmentation system // For now, simulate the process await new Promise(resolve => setTimeout(resolve, 1000)) spinner.succeed(colors.success(`${emojis.check} Augmentation '${type}' added to pipeline`)) console.log(colors.dim(`Position: ${position || 'auto-assigned'}`)) } catch (error) { spinner.fail('Failed to add augmentation') console.error(error) } } async removeAugmentation(type: string): Promise { await this.ensureInitialized() console.log(boxen( `${emojis.warning} ${colors.retro('AUGMENTATION REMOVAL PROTOCOL')}\n\n` + `${colors.accent('β—†')} ${colors.dim('This will remove the augmentation from the pipeline')}\n` + `${colors.accent('β—†')} ${colors.dim('Type:')} ${colors.highlight(type)}`, { padding: 1, borderStyle: 'round', borderColor: '#D67441' } )) const { confirm } = await prompts({ type: 'confirm', name: 'confirm', message: 'Remove this augmentation?', initial: false }) if (!confirm) { console.log(colors.dim('Augmentation removal cancelled')) return } const spinner = ora('Removing augmentation...').start() try { // Interface with augmentation system await new Promise(resolve => setTimeout(resolve, 1000)) spinner.succeed(colors.success(`${emojis.check} Augmentation '${type}' removed from pipeline`)) } catch (error) { spinner.fail('Failed to remove augmentation') console.error(error) } } async configureAugmentation(type: string, config: any): Promise { await this.ensureInitialized() console.log(boxen( `${emojis.config} ${colors.brain('AUGMENTATION CONFIGURATION')}\n\n` + `${colors.retro('β—† Type:')} ${colors.highlight(type)}\n` + `${colors.retro('β—† New Config:')} ${colors.dim(JSON.stringify(config, null, 2))}`, { padding: 1, borderStyle: 'round', borderColor: '#E88B5A' } )) const { confirm } = await prompts({ type: 'confirm', name: 'confirm', message: 'Apply this configuration?', initial: true }) if (!confirm) { console.log(colors.dim('Configuration cancelled')) return } const spinner = ora('Updating augmentation configuration...').start() try { // Interface with augmentation configuration system await new Promise(resolve => setTimeout(resolve, 1000)) spinner.succeed(colors.success(`${emojis.check} Augmentation '${type}' configuration updated`)) } catch (error) { spinner.fail('Failed to configure augmentation') console.error(error) } } async resetPipeline(): Promise { await this.ensureInitialized() console.log(boxen( `${emojis.warning} ${colors.retro('PIPELINE RESET PROTOCOL')}\n\n` + `${colors.accent('β—†')} ${colors.dim('This will reset the entire augmentation pipeline')}\n` + `${colors.accent('β—†')} ${colors.dim('All custom configurations will be lost')}\n` + `${colors.accent('β—†')} ${colors.dim('Pipeline will return to default state')}`, { padding: 1, borderStyle: 'round', borderColor: '#D67441' } )) const { confirm } = await prompts({ type: 'confirm', name: 'confirm', message: 'Reset augmentation pipeline to defaults?', initial: false }) if (!confirm) { console.log(colors.dim('Pipeline reset cancelled')) return } const spinner = ora('Resetting augmentation pipeline...').start() try { // Interface with pipeline reset system await new Promise(resolve => setTimeout(resolve, 2000)) spinner.succeed(colors.success(`${emojis.atom} Augmentation pipeline reset to factory defaults`)) console.log(colors.dim('All augmentations restored to default configuration')) } catch (error) { spinner.fail('Failed to reset pipeline') console.error(error) } } async executePipelineStep(step: string, data: any): Promise { await this.ensureInitialized() const spinner = ora(`Executing ${step} augmentation step...`).start() try { // Interface with pipeline execution system await new Promise(resolve => setTimeout(resolve, 1500)) spinner.succeed(colors.success(`${emojis.magic} Pipeline step '${step}' executed successfully`)) console.log(colors.dim('Result: '), colors.highlight('[Processed data would be shown here]')) } catch (error) { spinner.fail(`Failed to execute pipeline step '${step}'`) console.error(error) } } /** * Backup & Restore System - Atomic Data Preservation */ async backup(options: any = {}): Promise { await this.ensureInitialized() const { BackupRestore } = await import('./backupRestore.js') const backupSystem = new BackupRestore(this.brainy!) const backupPath = await backupSystem.createBackup({ compress: options.compress, output: options.output, includeMetadata: true, includeStatistics: true, verify: true }) console.log(colors.success(`\nπŸŽ‰ Backup complete! Saved to: ${backupPath}`)) } async restore(file: string): Promise { await this.ensureInitialized() const { BackupRestore } = await import('./backupRestore.js') const backupSystem = new BackupRestore(this.brainy!) await backupSystem.restoreBackup(file, { verify: true, overwrite: false // Will prompt user for confirmation }) } async listBackups(directory: string = './backups'): Promise { const { BackupRestore } = await import('./backupRestore.js') const backupSystem = new BackupRestore(this.brainy!) console.log(boxen( `${emojis.brain} ${colors.brain('ATOMIC VAULT INVENTORY')} ${emojis.atom}`, { padding: 1, borderStyle: 'round', borderColor: '#E88B5A' } )) const backups = await backupSystem.listBackups(directory) if (backups.length === 0) { console.log(colors.dim('No backups found in vault')) return } const table = new Table({ head: [colors.brain('Date'), colors.brain('Entities'), colors.brain('Relationships'), colors.brain('Size'), colors.brain('Type')], colWidths: [20, 12, 15, 12, 15] }) backups.forEach(backup => { table.push([ colors.highlight(new Date(backup.timestamp).toLocaleDateString()), colors.primary(backup.entityCount.toLocaleString()), colors.primary(backup.relationshipCount.toLocaleString()), colors.warning(backup.compressed ? 'Compressed' : 'Raw'), colors.success(backup.storageType) ]) }) console.log(table.toString()) } /** * Show augmentation status and management */ async augmentations(options: any = {}): Promise { console.log(boxen( `${this.emojis.brain} ${this.colors.brain('AUGMENTATION STATUS')} ${this.emojis.atom}`, { padding: 1, borderStyle: 'round', borderColor: '#E88B5A' } )) await this.ensureBrainy() try { // Import default augmentation registry const { DefaultAugmentationRegistry } = await import('../shared/default-augmentations.js') const registry = new DefaultAugmentationRegistry(this.brainy!) // Check Cortex health (default augmentation) const cortexHealth = await registry.checkCortexHealth() console.log(`\n${this.emojis.sparkles} ${this.colors.accent('Default Augmentations:')}`) console.log(` ${this.emojis.brain} Cortex: ${cortexHealth.available ? this.colors.success('Active') : this.colors.error('Inactive')}`) if (cortexHealth.version) { console.log(` ${this.colors.dim('Version:')} ${cortexHealth.version}`) } console.log(` ${this.colors.dim('Status:')} ${cortexHealth.status}`) console.log(` ${this.colors.dim('Category:')} SENSE (AI-powered data understanding)`) console.log(` ${this.colors.dim('License:')} Open Source (included by default)`) // Check for premium augmentations if license exists if (this.licensingSystem) { console.log(`\n${this.emojis.sparkles} ${this.colors.premium('Premium Augmentations:')}`) // Check each premium feature from our licensing system const premiumFeatures = [ 'notion-connector', 'salesforce-connector', 'slack-connector', 'asana-connector', 'neural-enhancement-pack' ] for (const feature of premiumFeatures) { // This would check if the feature is licensed and installed console.log(` ${this.emojis.gear} ${feature}: ${this.colors.dim('Not Installed')}`) console.log(` ${this.colors.dim('Status:')} Available for trial/purchase`) } console.log(`\n${this.colors.dim('Use')} ${this.colors.highlight('cortex license catalog')} ${this.colors.dim('to see available premium augmentations')}`) console.log(`${this.colors.dim('Use')} ${this.colors.highlight('cortex license trial ')} ${this.colors.dim('to start a free trial')}`) } // Augmentation pipeline health console.log(`\n${this.emojis.health} ${this.colors.accent('Pipeline Health:')}`) console.log(` ${this.emojis.check} SENSE Pipeline: ${this.colors.success('1 active')} (Cortex)`) console.log(` ${this.emojis.info} CONDUIT Pipeline: ${this.colors.dim('0 active')} (Premium connectors available)`) console.log(` ${this.emojis.info} COGNITION Pipeline: ${this.colors.dim('0 active')}`) console.log(` ${this.emojis.info} MEMORY Pipeline: ${this.colors.dim('0 active')}`) if (options.verbose) { console.log(`\n${this.emojis.info} ${this.colors.accent('Augmentation Categories:')}`) console.log(` ${this.colors.highlight('SENSE:')} Input processing and data understanding`) console.log(` ${this.colors.highlight('CONDUIT:')} External system integrations and sync`) console.log(` ${this.colors.highlight('COGNITION:')} AI reasoning and analysis`) console.log(` ${this.colors.highlight('MEMORY:')} Enhanced storage and retrieval`) console.log(` ${this.colors.highlight('PERCEPTION:')} Pattern recognition and insights`) console.log(` ${this.colors.highlight('DIALOG:')} Conversational interfaces`) console.log(` ${this.colors.highlight('ACTIVATION:')} Automation and triggers`) console.log(` ${this.colors.highlight('WEBSOCKET:')} Real-time communications`) } } catch (error) { console.error(`${this.emojis.cross} Failed to get augmentation status:`, error instanceof Error ? error.message : String(error)) } } /** * Performance Monitoring & Health Check System - Atomic Age Intelligence Observatory */ async monitor(options: any = {}): Promise { await this.ensureInitialized() if (!this.performanceMonitor) { console.log(colors.error('Performance monitor not initialized')) return } if (options.dashboard) { // Interactive dashboard mode console.log(boxen( `${emojis.stats} ${colors.brain('ATOMIC PERFORMANCE OBSERVATORY')} ${emojis.atom}\n\n` + `${colors.accent('β—†')} ${colors.dim('Real-time vector + graph database monitoring')}\n` + `${colors.accent('β—†')} ${colors.dim('Press Ctrl+C to exit dashboard')}`, { padding: 1, borderStyle: 'round', borderColor: '#E88B5A' } )) // Start monitoring in background await this.performanceMonitor.startMonitoring(5000) // 5 second intervals // Display dashboard in loop const dashboardInterval = setInterval(async () => { try { await this.performanceMonitor!.displayDashboard() } catch (error) { console.error('Dashboard update failed:', error) } }, 5000) // Handle cleanup on exit process.on('SIGINT', () => { clearInterval(dashboardInterval) this.performanceMonitor!.stopMonitoring() console.log('\n' + colors.dim('Performance monitoring stopped')) process.exit(0) }) // Keep process alive await new Promise(() => {}) } else { // Single snapshot mode const metrics = await this.performanceMonitor.getCurrentMetrics() console.log(boxen( `${emojis.stats} ${colors.brain('PERFORMANCE SNAPSHOT')} ${emojis.atom}`, { padding: 1, borderStyle: 'round', borderColor: '#E88B5A' } )) console.log(`\n${colors.accent('Vector Query Latency:')} ${colors.primary(metrics.queryLatency.vector.avg.toFixed(1) + 'ms')}`) console.log(`${colors.accent('Graph Query Latency:')} ${colors.primary(metrics.queryLatency.graph.avg.toFixed(1) + 'ms')}`) console.log(`${colors.accent('Combined Throughput:')} ${colors.success(metrics.throughput.totalOps.toFixed(0) + ' ops/sec')}`) console.log(`${colors.accent('Cache Hit Rate:')} ${colors.success((metrics.storage.cacheHitRate * 100).toFixed(1) + '%')}`) console.log(`${colors.accent('Overall Health:')} ${colors.primary(metrics.health.overall + '/100')}`) } } async health(options: any = {}): Promise { await this.ensureInitialized() if (!this.healthCheck) { console.log(colors.error('Health check system not initialized')) return } if (options.autoFix) { // Run health check and auto-repair const health = await this.healthCheck.runHealthCheck() await this.healthCheck.displayHealthReport(health) console.log('\n' + colors.brain(`${emojis.repair} INITIATING AUTO-REPAIR SEQUENCE`)) const results = await this.healthCheck.executeAutoRepairs() if (results.success.length > 0 || results.failed.length > 0) { // Run health check again to show improvements console.log('\n' + colors.info('Running post-repair health check...')) await this.healthCheck.displayHealthReport() } } else { // Standard health check await this.healthCheck.displayHealthReport() // Show available repair actions const repairs = await this.healthCheck.getRepairActions() const safeRepairs = repairs.filter(r => r.automated && r.riskLevel === 'safe') if (safeRepairs.length > 0) { console.log('\n' + colors.info(`${emojis.info} Run 'cortex health --auto-fix' to apply ${safeRepairs.length} safe automated repairs`)) } } } async performance(options: any = {}): Promise { await this.ensureInitialized() if (!this.performanceMonitor) { console.log(colors.error('Performance monitor not initialized')) return } if (options.analyze) { // Detailed performance analysis console.log(boxen( `${emojis.lab} ${colors.brain('PERFORMANCE ANALYSIS ENGINE')} ${emojis.atom}\n\n` + `${colors.accent('β—†')} ${colors.dim('Deep analysis of vector + graph performance')}\n` + `${colors.accent('β—†')} ${colors.dim('Collecting metrics over 30 seconds...')}`, { padding: 1, borderStyle: 'round', borderColor: '#E88B5A' } )) const spinner = ora('Analyzing neural pathway performance...').start() // Start monitoring to collect data await this.performanceMonitor.startMonitoring(2000) // 2 second intervals // Wait for data collection await new Promise(resolve => setTimeout(resolve, 30000)) // Stop monitoring and get dashboard data this.performanceMonitor.stopMonitoring() const dashboard = await this.performanceMonitor.getDashboard() spinner.succeed('Performance analysis complete') // Display detailed analysis console.log('\n' + colors.brain(`${emojis.lightning} DETAILED ANALYSIS RESULTS`)) const current = dashboard.current const trends = dashboard.trends if (trends.length > 1) { const first = trends[0] const last = trends[trends.length - 1] const vectorTrend = last.queryLatency.vector.avg - first.queryLatency.vector.avg const graphTrend = last.queryLatency.graph.avg - first.queryLatency.graph.avg const throughputTrend = last.throughput.totalOps - first.throughput.totalOps console.log(`\n${colors.accent('Vector Performance Trend:')} ${vectorTrend > 0 ? colors.warning('↑') : colors.success('↓')} ${Math.abs(vectorTrend).toFixed(1)}ms`) console.log(`${colors.accent('Graph Performance Trend:')} ${graphTrend > 0 ? colors.warning('↑') : colors.success('↓')} ${Math.abs(graphTrend).toFixed(1)}ms`) console.log(`${colors.accent('Throughput Trend:')} ${throughputTrend > 0 ? colors.success('↑') : colors.warning('↓')} ${Math.abs(throughputTrend).toFixed(0)} ops/sec`) } // Show recommendations console.log('\n' + colors.brain(`${emojis.sparkle} OPTIMIZATION RECOMMENDATIONS`)) if (current.queryLatency.vector.p95 > 100) { console.log(` ${colors.warning('β†’')} Vector query P95 latency is high - consider rebuilding HNSW index`) } if (current.storage.cacheHitRate < 0.8) { console.log(` ${colors.warning('β†’')} Cache hit rate is below 80% - consider increasing cache size`) } if (current.memory.heapUsed > 1000) { console.log(` ${colors.warning('β†’')} Memory usage is high - consider running garbage collection`) } if (current.health.overall < 85) { console.log(` ${colors.error('β†’')} Overall health below 85% - run 'cortex health --auto-fix'`) } } else { // Quick performance overview const metrics = await this.performanceMonitor.getCurrentMetrics() console.log(boxen( `${emojis.rocket} ${colors.brain('QUICK PERFORMANCE OVERVIEW')} ${emojis.atom}`, { padding: 1, borderStyle: 'round', borderColor: '#E88B5A' } )) console.log(`\n${colors.brain('Vector + Graph Database Performance:')}\n`) console.log(` ${colors.accent('Vector Operations:')} ${colors.primary(metrics.queryLatency.vector.avg.toFixed(1) + 'ms avg')} | ${colors.highlight(metrics.throughput.vectorOps.toFixed(0) + ' ops/sec')}`) console.log(` ${colors.accent('Graph Operations:')} ${colors.primary(metrics.queryLatency.graph.avg.toFixed(1) + 'ms avg')} | ${colors.highlight(metrics.throughput.graphOps.toFixed(0) + ' ops/sec')}`) console.log(` ${colors.accent('Storage Performance:')} ${colors.success((metrics.storage.cacheHitRate * 100).toFixed(1) + '% cache hit')} | ${colors.info(metrics.storage.readLatency.toFixed(1) + 'ms read')}`) console.log(` ${colors.accent('Memory Usage:')} ${colors.primary(metrics.memory.heapUsed.toFixed(0) + 'MB')} | ${colors.success((metrics.memory.efficiency * 100).toFixed(1) + '% efficient')}`) console.log(`\n${colors.dim('For detailed analysis: cortex performance --analyze')}`) } } /** * Premium Features - Redirect to Brain Cloud */ async licenseCatalog(): Promise { console.log(boxen( `${emojis.brain}☁️ ${colors.brain('BRAIN CLOUD PREMIUM FEATURES')}\n\n` + `Premium connectors and features have moved to Brain Cloud!\n\n` + `${colors.accent('β—†')} ${colors.dim('Setup Brain Cloud:')} ${colors.highlight('brainy cloud')}\n` + `${colors.accent('β—†')} ${colors.dim('Learn more:')} ${colors.highlight('https://soulcraft.com/brain-cloud')}\n\n` + `${colors.retro('Available Tiers:')}\n` + `${colors.success('πŸ«™')} Brain Jar (Free) - Local coordination\n` + `${colors.success('☁️')} Brain Cloud ($19/mo) - Sync everywhere\n` + `${colors.success('🏦')} Brain Bank ($99/mo) - Enterprise features`, { padding: 1, borderStyle: 'round', borderColor: '#D67441' } )) } async licenseStatus(licenseId?: string): Promise { console.log(colors.info('License management has moved to Brain Cloud')) console.log(colors.dim('Run: brainy cloud')) } async licenseTrial(featureId: string, customerName?: string, customerEmail?: string): Promise { console.log(boxen( `${emojis.sparkle} ${colors.brain('START YOUR BRAIN CLOUD TRIAL')}\n\n` + `${colors.accent('β—†')} ${colors.dim('14-day free trial')}\n` + `${colors.accent('β—†')} ${colors.dim('No credit card required')}\n` + `${colors.accent('β—†')} ${colors.dim('Cancel anytime')}\n\n` + `${colors.highlight('Run: brainy cloud')}\n\n` + `Or visit: ${colors.accent('https://soulcraft.com/brain-cloud')}`, { padding: 1, borderStyle: 'round', borderColor: '#FFD700' } )) } async licenseValidate(featureId: string): Promise { console.log(colors.info('Premium features available in Brain Cloud')) console.log(colors.dim('Setup: brainy cloud')) return false } /** * Check if a premium feature is available */ async requirePremiumFeature(featureId: string, silent: boolean = false): Promise { if (!silent) { console.log(boxen( `${emojis.lock} ${colors.brain('BRAIN CLOUD FEATURE')} ${emojis.atom}\n\n` + `This feature is available in Brain Cloud!\n\n` + `${colors.highlight('Setup: brainy cloud')}\n` + `${colors.dim('Learn more: https://soulcraft.com/brain-cloud')}`, { padding: 1, borderStyle: 'round', borderColor: '#D67441' } )) } return false } /** * Brain Jar AI Coordination Methods */ async brainJarInstall(mode: string): Promise { const spinner = ora('Installing Brain Jar coordination...').start() try { if (mode === 'premium') { spinner.text = 'Opening Brain Jar Premium signup...' // This would open browser to brain-jar.com console.log('\n' + boxen( `${emojis.brain}${emojis.rocket} ${colors.brain('BRAIN JAR PREMIUM')}\n\n` + `${colors.accent('β—†')} ${colors.dim('Opening signup at:')} ${colors.highlight('https://brain-jar.com')}\n` + `${colors.accent('β—†')} ${colors.dim('After signup, return to configure your API key')}\n\n` + `${colors.retro('Features:')}\n` + `${colors.success('βœ…')} Global AI coordination\n` + `${colors.success('βœ…')} Multi-device sync\n` + `${colors.success('βœ…')} Team workspaces\n` + `${colors.success('βœ…')} Premium dashboard`, { padding: 1, borderStyle: 'double', borderColor: '#D67441' } )) // Open browser (would be implemented) console.log(colors.info('\nπŸ’‘ Run: export BRAIN_JAR_KEY="your-api-key" after signup')) } else { spinner.text = 'Setting up local Brain Jar server...' console.log('\n' + boxen( `${emojis.brain}${emojis.tube} ${colors.brain('BRAIN JAR FREE')}\n\n` + `${colors.accent('β—†')} ${colors.dim('Local AI coordination installed')}\n` + `${colors.accent('β—†')} ${colors.dim('Server:')} ${colors.highlight('localhost:8765')}\n` + `${colors.accent('β—†')} ${colors.dim('Dashboard:')} ${colors.highlight('localhost:3000')}\n\n` + `${colors.retro('Features:')}\n` + `${colors.success('βœ…')} Local AI coordination\n` + `${colors.success('βœ…')} Real-time dashboard\n` + `${colors.success('βœ…')} Vector storage`, { padding: 1, borderStyle: 'round', borderColor: '#2D4A3A' } )) } spinner.succeed(`Brain Jar ${mode} installation complete!`) } catch (error: any) { spinner.fail('Brain Jar installation failed') console.error(colors.error('Error:'), error.message) } } async brainJarStart(options: any): Promise { const spinner = ora('Starting Brain Jar coordination...').start() try { const isCloudMode = process.env.BRAIN_JAR_KEY !== undefined const serverUrl = options.server || (isCloudMode ? 'wss://api.brain-jar.com/ws' : 'ws://localhost:8765') spinner.text = `Connecting to ${isCloudMode ? 'cloud' : 'local'} coordination...` console.log('\n' + boxen( `${emojis.brain}${emojis.network} ${colors.brain('BRAIN JAR COORDINATION ACTIVE')}\n\n` + `${colors.accent('β—†')} ${colors.dim('Mode:')} ${colors.highlight(isCloudMode ? 'Premium Cloud' : 'Local Free')}\n` + `${colors.accent('β—†')} ${colors.dim('Server:')} ${colors.highlight(serverUrl)}\n` + `${colors.accent('β—†')} ${colors.dim('Agent:')} ${colors.highlight(options.name || 'Claude-Agent')}\n` + `${colors.accent('β—†')} ${colors.dim('Role:')} ${colors.highlight(options.role || 'Assistant')}\n\n` + `${colors.success('βœ…')} All Claude instances will now coordinate automatically!`, { padding: 1, borderStyle: 'round', borderColor: isCloudMode ? '#D67441' : '#2D4A3A' } )) spinner.succeed('Brain Jar coordination started!') console.log(colors.dim('\nπŸ’‘ Keep this terminal open for coordination to remain active')) console.log(colors.primary(`πŸ”— Dashboard: brainy brain-jar dashboard`)) } catch (error: any) { spinner.fail('Failed to start Brain Jar') console.error(colors.error('Error:'), error.message) } } async brainJarDashboard(shouldOpen: boolean = true): Promise { const isCloudMode = process.env.BRAIN_JAR_KEY !== undefined const dashboardUrl = isCloudMode ? 'https://dashboard.brain-jar.com' : 'http://localhost:3000/dashboard' console.log(boxen( `${emojis.data}${emojis.brain} ${colors.brain('BRAIN JAR DASHBOARD')}\n\n` + `${colors.accent('β—†')} ${colors.dim('URL:')} ${colors.highlight(dashboardUrl)}\n` + `${colors.accent('β—†')} ${colors.dim('Mode:')} ${colors.highlight(isCloudMode ? 'Premium Cloud' : 'Local Free')}\n\n` + `${colors.retro('Features:')}\n` + `${colors.success('βœ…')} Live agent coordination\n` + `${colors.success('βœ…')} Real-time conversation view\n` + `${colors.success('βœ…')} Search coordination history\n` + `${colors.success('βœ…')} Performance metrics`, { padding: 1, borderStyle: 'round', borderColor: isCloudMode ? '#D67441' : '#2D4A3A' } )) if (shouldOpen) { console.log(colors.success(`\nπŸš€ Opening dashboard: ${dashboardUrl}`)) // Would open browser here } } async brainJarStatus(): Promise { const isCloudMode = process.env.BRAIN_JAR_KEY !== undefined console.log(boxen( `${emojis.brain}${emojis.stats} ${colors.brain('BRAIN JAR STATUS')}\n\n` + `${colors.accent('β—†')} ${colors.dim('Mode:')} ${colors.highlight(isCloudMode ? 'Premium Cloud' : 'Local Free')}\n` + `${colors.accent('β—†')} ${colors.dim('Status:')} ${colors.success('Active')}\n` + `${colors.accent('β—†')} ${colors.dim('Connected Agents:')} ${colors.highlight('2')}\n` + `${colors.accent('β—†')} ${colors.dim('Total Messages:')} ${colors.highlight('47')}\n` + `${colors.accent('β—†')} ${colors.dim('Uptime:')} ${colors.highlight('15m 32s')}\n\n` + `${colors.success('βœ…')} All systems operational!`, { padding: 1, borderStyle: 'round', borderColor: '#2D4A3A' } )) } async brainJarStop(): Promise { const spinner = ora('Stopping Brain Jar coordination...').start() try { // Would stop coordination server/connections here spinner.succeed('Brain Jar coordination stopped') console.log(colors.warning('⚠️ AI agents will no longer coordinate')) console.log(colors.dim('πŸ’‘ Run: brainy brain-jar start to resume coordination')) } catch (error: any) { spinner.fail('Failed to stop Brain Jar') console.error(colors.error('Error:'), error.message) } } async brainJarAgents(): Promise { console.log(boxen( `${emojis.robot}${emojis.network} ${colors.brain('CONNECTED AGENTS')}\n\n` + `${colors.success('πŸ€–')} ${colors.highlight('Jarvis')} - ${colors.dim('Backend Systems')}\n` + ` ${colors.dim('Status:')} ${colors.success('Connected')}\n` + ` ${colors.dim('Last Active:')} ${colors.dim('2 minutes ago')}\n\n` + `${colors.success('🎨')} ${colors.highlight('Picasso')} - ${colors.dim('Frontend Design')}\n` + ` ${colors.dim('Status:')} ${colors.success('Connected')}\n` + ` ${colors.dim('Last Active:')} ${colors.dim('30 seconds ago')}\n\n` + `${colors.accent('Total Active Agents:')} ${colors.highlight('2')}`, { padding: 1, borderStyle: 'round', borderColor: '#2D4A3A' } )) } async brainJarMessage(text: string): Promise { const spinner = ora('Broadcasting message to coordination channel...').start() try { // Would send message through coordination system here spinner.succeed('Message sent to all connected agents') console.log(boxen( `${emojis.chat}${emojis.network} ${colors.brain('MESSAGE BROADCAST')}\n\n` + `${colors.dim('Message:')} ${colors.highlight(text)}\n` + `${colors.dim('Recipients:')} ${colors.success('All connected agents')}\n` + `${colors.dim('Timestamp:')} ${colors.dim(new Date().toLocaleTimeString())}`, { padding: 1, borderStyle: 'round', borderColor: '#D67441' } )) } catch (error: any) { spinner.fail('Failed to send message') console.error(colors.error('Error:'), error.message) } } async brainJarSearch(query: string, limit: number): Promise { const spinner = ora('Searching coordination history...').start() try { // Would search through coordination messages here spinner.succeed(`Found coordination messages for: "${query}"`) console.log(boxen( `${emojis.search}${emojis.brain} ${colors.brain('COORDINATION SEARCH RESULTS')}\n\n` + `${colors.dim('Query:')} ${colors.highlight(query)}\n` + `${colors.dim('Results:')} ${colors.success('5 matches')}\n` + `${colors.dim('Limit:')} ${colors.dim(limit.toString())}\n\n` + `${colors.success('πŸ“¨')} ${colors.dim('Jarvis:')} "Setting up backend coordination..."\n` + `${colors.success('πŸ“¨')} ${colors.dim('Picasso:')} "Frontend components ready for integration..."\n` + `${colors.success('πŸ“¨')} ${colors.dim('Jarvis:')} "Database connections established..."\n\n` + `${colors.dim('Use')} ${colors.primary('brainy brain-jar dashboard')} ${colors.dim('for visual search')}`, { padding: 1, borderStyle: 'round', borderColor: '#E88B5A' } )) } catch (error: any) { spinner.fail('Search failed') console.error(colors.error('Error:'), error.message) } } /** * Brain Cloud Super Command - One command to rule them all */ async setupBrainCloud(options: any): Promise { const { prompt } = await import('prompts') const colors = this.colors const emojis = this.emojis console.log(boxen( `${emojis.brain}☁️ ${colors.brain('BRAIN CLOUD SETUP')}\n\n` + `${colors.accent('Transform your AI into a coordinated system')}\n` + `${colors.dim('One command. Global sync. Team coordination.')}\n\n` + `${colors.success('βœ…')} Install Brain Jar in Claude Desktop\n` + `${colors.success('βœ…')} Configure cloud sync across devices\n` + `${colors.success('βœ…')} Setup team workspaces (optional)`, { padding: 1, borderStyle: 'double', borderColor: '#D67441' } )) // Interactive mode if not specified if (options.mode === 'interactive') { const response = await prompt([ { type: 'select', name: 'tier', message: 'Choose your Brain Cloud tier:', choices: [ { title: 'πŸ«™ Brain Jar (Free) - Local coordination only', value: 'free' }, { title: '☁️ Brain Cloud ($19/mo) - Sync across all devices', value: 'cloud' }, { title: '🏦 Brain Bank ($99/mo) - Enterprise features', value: 'bank' } ], initial: 0 } ]) if (!response.tier) { console.log(colors.warning('Setup cancelled')) return } options.mode = response.tier } const spinner = ora('Setting up Brain Cloud...').start() try { // Step 1: Install Brain Jar if (!options.skipInstall) { spinner.text = 'Installing Brain Jar in Claude Desktop...' await this.brainJarInstall(options.mode) } // Step 2: Configure based on tier if (options.mode === 'cloud' || options.mode === 'bank') { spinner.text = 'Configuring cloud sync...' const accountResponse = await prompt([ { type: 'confirm', name: 'hasAccount', message: 'Do you have a Brain Cloud account?', initial: false } ]) if (!accountResponse.hasAccount) { console.log('\n' + boxen( `${emojis.sparkles} ${colors.brain('CREATE YOUR ACCOUNT')}\n\n` + `${colors.accent('β—†')} Visit: ${colors.highlight('https://soulcraft.com/brain-cloud')}\n` + `${colors.accent('β—†')} Click "Start Free Trial"\n` + `${colors.accent('β—†')} Get your API key\n` + `${colors.accent('β—†')} Return here to continue setup`, { padding: 1, borderStyle: 'round', borderColor: '#FFD700' } )) const keyResponse = await prompt([ { type: 'text', name: 'apiKey', message: 'Enter your Brain Cloud API key:' } ]) if (keyResponse.apiKey) { await this.configSet('brain-cloud.apiKey', keyResponse.apiKey, { encrypt: true }) } } // Enable cloud sync in Brain Jar await this.configSet('brain-jar.cloudSync', 'true', {}) await this.configSet('brain-jar.tier', options.mode, {}) } // Step 3: Start Brain Jar spinner.text = 'Starting Brain Jar coordination...' await this.brainJarStart({}) spinner.succeed('Brain Cloud setup complete!') // Show success message const tierMessages = { free: 'Local AI coordination active', cloud: 'Cloud sync enabled across all devices', bank: 'Enterprise features activated' } console.log('\n' + boxen( `${emojis.check}${emojis.brain} ${colors.success('BRAIN CLOUD ACTIVE!')}\n\n` + `${colors.accent('β—†')} ${colors.dim('Status:')} ${colors.success(tierMessages[options.mode as keyof typeof tierMessages])}\n` + `${colors.accent('β—†')} ${colors.dim('Claude Desktop:')} ${colors.success('Brain Jar installed')}\n` + `${colors.accent('β—†')} ${colors.dim('MCP Server:')} ${colors.success('Running')}\n\n` + `${colors.retro('Next Steps:')}\n` + `${colors.cyan('1.')} Open Claude Desktop\n` + `${colors.cyan('2.')} Start a new conversation\n` + `${colors.cyan('3.')} Your AI now has persistent memory!\n\n` + `${colors.dim('Dashboard:')} ${colors.highlight('brainy brain-jar dashboard')}\n` + `${colors.dim('Status:')} ${colors.highlight('brainy status')}`, { padding: 1, borderStyle: 'double', borderColor: '#5FD45C' } )) } catch (error: any) { spinner.fail('Setup failed') console.error(colors.error('Error:'), error.message) console.log('\n' + colors.dim('Need help? Visit https://soulcraft.com/brain-cloud/support')) } } /** * Helper method to determine data type from file path */ private getDataTypeFromPath(filePath: string): string { const path = require('path') const ext = path.extname(filePath).toLowerCase() switch (ext) { case '.json': return 'json' case '.csv': return 'csv' case '.yaml': case '.yml': return 'yaml' case '.txt': return 'text' default: return 'text' } } } // Type definitions interface CortexConfig { storage: string encryption: boolean encryptionEnabled?: boolean chat: boolean llm?: string s3Bucket?: string r2Bucket?: string gcsBucket?: string initialized: boolean createdAt: string brainyOptions?: any } interface InitOptions { storage?: string encryption?: boolean chat?: boolean llm?: string } interface MigrateOptions { to: string bucket?: string strategy?: 'immediate' | 'gradual' } interface SearchOptions { limit?: number filter?: any // MongoDB-style filters verbs?: string[] // Graph verb types to traverse depth?: number // Graph traversal depth }