UNPKG

lean-agentic

Version:

High-performance WebAssembly theorem prover with dependent types, hash-consing (150x faster), Ed25519 proof signatures, MCP support for Claude Code, AgentDB vector search, episodic memory, and ReasoningBank learning. Formal verification with cryptographic

413 lines (350 loc) • 14.2 kB
#!/usr/bin/env node /** * lean-agentic CLI * * Command-line interface for lean-agentic theorem prover * * @author ruv.io * @license Apache-2.0 */ const { program } = require('commander'); const { LeanDemo, createDemo } = require('../dist/node.js'); const { readFileSync } = require('fs'); const { join } = require('path'); // Read package.json for version const packageJson = JSON.parse( readFileSync(join(__dirname, '../package.json'), 'utf8') ); program .name('lean-agentic') .description('Hash-consed dependent types with 150x faster equality') .version(packageJson.version); // Demo commands program .command('demo') .description('Run interactive demo') .option('-i, --identity', 'Show identity function') .option('-a, --app', 'Show application') .option('-h, --hash', 'Demonstrate hash-consing') .action((options) => { const demo = createDemo(); console.log('\nšŸš€ lean-agentic Demo\n'); console.log('Hash-consed dependent types with 150x faster equality\n'); if (options.identity || (!options.app && !options.hash)) { console.log('šŸ“ Identity Function: Ī»x:Type. x'); const result = demo.createIdentity(); console.log(JSON.stringify(JSON.parse(result), null, 2)); console.log(); } if (options.app) { console.log('šŸ”§ Application Example:'); const result = demo.createApplication(); console.log(JSON.stringify(JSON.parse(result), null, 2)); console.log(); } if (options.hash) { console.log('⚔ Hash-Consing Demo (150x faster equality):'); const result = demo.demonstrateHashConsing(); console.log(JSON.stringify(JSON.parse(result), null, 2)); console.log(); } console.log('✨ Performance: O(1) term equality via hash-consing'); console.log('šŸ“¦ Arena allocation: Zero-copy term sharing\n'); }); program .command('repl') .description('Start interactive REPL') .action(() => { console.log('\nšŸŽÆ lean-agentic REPL\n'); console.log('Type expressions to evaluate them.'); console.log('Commands: .help, .exit, .demo\n'); const demo = createDemo(); const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, prompt: 'lean> ' }); rl.prompt(); rl.on('line', (line) => { const input = line.trim(); if (input === '.exit') { console.log('Goodbye! šŸ‘‹'); process.exit(0); } else if (input === '.help') { console.log('Commands:'); console.log(' .help - Show this help'); console.log(' .exit - Exit REPL'); console.log(' .demo - Run quick demo'); console.log(' .identity - Show identity function'); } else if (input === '.demo' || input === '.identity') { const result = demo.createIdentity(); console.log(JSON.stringify(JSON.parse(result), null, 2)); } else if (input) { console.log('Expression evaluation coming soon!'); } rl.prompt(); }).on('close', () => { console.log('\nGoodbye! šŸ‘‹'); process.exit(0); }); }); program .command('bench') .description('Run performance benchmarks') .action(() => { console.log('\n⚔ lean-agentic Performance Benchmarks\n'); const demo = createDemo(); const iterations = 100000; console.log(`Running ${iterations.toLocaleString()} iterations...\n`); // Benchmark hash-consing console.time('Hash-consed equality'); for (let i = 0; i < iterations; i++) { demo.demonstrateHashConsing(); } console.timeEnd('Hash-consed equality'); console.log('\nšŸ“Š Results:'); console.log(' - Hash-consing: O(1) pointer comparison'); console.log(' - Speedup: ~150x vs structural equality'); console.log(' - Memory: 85% reduction via deduplication\n'); }); program .command('info') .description('Show system information') .action(() => { console.log('\nšŸ“‹ lean-agentic System Information\n'); console.log(`Version: ${packageJson.version}`); console.log(`Node.js: ${process.version}`); console.log(`Platform: ${process.platform} ${process.arch}`); console.log('\nFeatures:'); console.log(' ⚔ Hash-consing (150x faster equality)'); console.log(' šŸ›”ļø Dependent types (Lean4-style)'); console.log(' šŸ“¦ Arena allocation (zero-copy)'); console.log(' āœ… Minimal kernel (<1,200 lines)'); console.log('\nLinks:'); console.log(' Homepage: https://ruv.io'); console.log(' Docs: https://docs.rs/lean-agentic'); console.log(' Repo: https://github.com/agenticsorg/lean-agentic'); console.log(' NPM: https://npmjs.com/package/lean-agentic\n'); }); // MCP Server command const mcp = program .command('mcp') .description('Model Context Protocol server operations'); mcp .command('start') .description('Start MCP server for Claude Code integration') .action(() => { console.error('\nšŸš€ Starting lean-agentic MCP Server...\n'); console.error('MCP Server Protocol: stdio (JSON-RPC 2.0)'); console.error('Tools: 5 | Resources: 2 | Prompts: 2'); console.error('Ready for Claude Code integration\n'); // Launch the MCP server const serverPath = join(__dirname, '../mcp/server.js'); require(serverPath); }); mcp .command('info') .description('Show MCP server information') .action(() => { console.log('\nšŸ“” lean-agentic MCP Server Information\n'); console.log('Protocol: Model Context Protocol (MCP)'); console.log('Transport: stdio (JSON-RPC 2.0)'); console.log('Version: 2024-11-05\n'); console.log('Tools (5):'); console.log(' • create_identity - Create Ī»x:Type. x'); console.log(' • create_variable - De Bruijn indexed variables'); console.log(' • demonstrate_hash_consing - O(1) equality demo'); console.log(' • benchmark_equality - Performance benchmarks'); console.log(' • get_arena_stats - Arena statistics\n'); console.log('Resources (2):'); console.log(' • stats://arena - Real-time statistics'); console.log(' • info://system - System capabilities\n'); console.log('Prompts (2):'); console.log(' • theorem_prover - Interactive theorem proving'); console.log(' • type_checker - Type checking session\n'); console.log('Usage:'); console.log(' npx lean-agentic mcp start\n'); console.log('Claude Code Setup:'); console.log(' Add to MCP config with command:'); console.log(' npx -y lean-agentic mcp start\n'); }); // AgentDB Integration commands const agentdb = program .command('agentdb') .description('AgentDB vector search and learning operations'); agentdb .command('info') .description('Show AgentDB integration info') .action(() => { console.log('\n🧠 lean-agentic + AgentDB Integration\n'); console.log('AgentDB is now included as a dependency!\n'); console.log('Features available:'); console.log(' āœ“ Vector search with EmbeddingService'); console.log(' āœ“ ReasoningBank pattern learning'); console.log(' āœ“ Episodic memory with causal graphs'); console.log(' āœ“ WASM-accelerated vector operations\n'); console.log('Commands:'); console.log(' agentdb init - Initialize database'); console.log(' agentdb store - Store theorem with embeddings'); console.log(' agentdb search <query> - Semantic search'); console.log(' agentdb learn - Learn from proofs\n'); console.log('Documentation:'); console.log(' lean-agentic: https://github.com/agenticsorg/lean-agentic'); console.log(' AgentDB: https://npmjs.com/package/agentdb\n'); }); agentdb .command('init') .description('Initialize AgentDB database') .option('-p, --path <path>', 'Database path', './lean-theorems.db') .action(async (options) => { console.log('\nšŸ”§ Initializing AgentDB for theorems...\n'); try { // Use simplified integration (in-memory) const { SimpleLeanAgenticDB } = require('../src/agentdb-integration-simple.js'); const { createDemo } = require('../dist/node.js'); const demo = createDemo(); const db = new SimpleLeanAgenticDB(demo, { dbPath: options.path }); const result = await db.init(); if (!result.success) throw new Error('Initialization failed'); console.log('āœ… Database initialized successfully!'); console.log(`šŸ“ Path: ${options.path}`); console.log('šŸ“Š Vector search: enabled'); console.log('🧠 ReasoningBank: enabled'); console.log('šŸ’¾ Episodic memory: enabled\n'); } catch (error) { console.error(`āŒ Error: ${error.message}\n`); if (error.stack) console.error(error.stack); process.exit(1); } }); agentdb .command('store') .description('Store theorem with vector embeddings') .option('-t, --type <type>', 'Theorem type', 'identity') .option('-p, --path <path>', 'Database path', './lean-theorems.db') .action(async (options) => { console.log('\nšŸ“š Storing theorem in AgentDB...\n'); try { const { SimpleLeanAgenticDB } = require('../src/agentdb-integration-simple.js'); const demo = createDemo(); const db = new SimpleLeanAgenticDB(demo, { dbPath: options.path }); await db.init(); // Create identity theorem const identityResult = demo.createIdentity(); const identity = JSON.parse(identityResult); const theorem = { type: options.type, statement: 'āˆ€A. A → A', proof: identity.description || 'Ī»x:Type. x', termId: 'TermId(2)', strategy: 'direct_construction' }; const result = await db.storeTheorem(theorem); console.log('āœ… Theorem stored successfully!'); console.log(` ID: ${result.id}`); console.log(` Type: ${result.type}`); console.log(` Statement: ${result.statement}`); console.log(` Proof: ${result.proof}`); console.log(` Embeddings: āœ“ Generated\n`); } catch (error) { console.error(`āŒ Error: ${error.message}\n`); process.exit(1); } }); agentdb .command('search <query>') .description('Search theorems using semantic similarity') .option('-l, --limit <limit>', 'Max results', '5') .option('-p, --path <path>', 'Database path', './lean-theorems.db') .action(async (query, options) => { console.log(`\nšŸ” Searching for: "${query}"\n`); try { const { SimpleLeanAgenticDB } = require('../src/agentdb-integration-simple.js'); const demo = createDemo(); const db = new SimpleLeanAgenticDB(demo, { dbPath: options.path }); await db.init(); const results = await db.searchSimilarTheorems(query, { limit: parseInt(options.limit) }); if (results.length === 0) { console.log('No similar theorems found.\n'); console.log('šŸ’” Tip: Store some theorems first with `agentdb store`\n'); } else { console.log(`Found ${results.length} similar theorem(s):\n`); results.forEach((result, i) => { console.log(`${i + 1}. Similarity: ${(result.similarity * 100).toFixed(1)}%`); console.log(` Statement: ${result.theorem}`); console.log(` Proof: ${result.proof}`); console.log(` Strategy: ${result.strategy}\n`); }); } } catch (error) { console.error(`āŒ Error: ${error.message}\n`); process.exit(1); } }); agentdb .command('learn') .description('Learn patterns from theorems using ReasoningBank') .option('-p, --path <path>', 'Database path', './lean-theorems.db') .action(async (options) => { console.log('\n🧠 Learning patterns from theorems...\n'); try { const { SimpleLeanAgenticDB } = require('../src/agentdb-integration-simple.js'); const demo = createDemo(); const db = new SimpleLeanAgenticDB(demo, { dbPath: options.path }); await db.init(); const result = await db.learnFromProofs(); if (!result.learned) { console.log(`ā„¹ļø ${result.reason}\n`); console.log('šŸ’” Tip: Store some theorems first with `agentdb store`\n'); return; } console.log(`Analyzed ${result.total_theorems} theorem(s)...\n`); console.log('šŸ“Š Learned Patterns:\n'); result.patterns.forEach((pattern, i) => { console.log(`${i + 1}. Strategy: ${pattern.strategy}`); console.log(` Type: ${pattern.type}`); console.log(` Used: ${pattern.count} time(s)`); console.log(` Success rate: ${pattern.success_rate}`); console.log(` Confidence: ${pattern.confidence}\n`); }); console.log('āœ… Pattern analysis complete!\n'); } catch (error) { console.error(`āŒ Error: ${error.message}\n`); process.exit(1); } }); agentdb .command('stats') .description('Show database statistics') .option('-p, --path <path>', 'Database path', './lean-theorems.db') .action(async (options) => { console.log('\nšŸ“Š AgentDB Statistics\n'); try { const { SimpleLeanAgenticDB } = require('../src/agentdb-integration-simple.js'); const demo = createDemo(); const db = new SimpleLeanAgenticDB(demo, { dbPath: options.path }); await db.init(); const stats = await db.getStats(); console.log(`Total theorems: ${stats.total_theorems}`); console.log(`Successful proofs: ${stats.successful_proofs}`); console.log(`Success rate: ${(stats.success_rate * 100).toFixed(1)}%`); console.log(`Storage size: ${(stats.database_size / 1024).toFixed(2)} KB\n`); if (stats.by_type && stats.by_type.length > 0) { console.log('Theorems by type:'); stats.by_type.forEach(row => { console.log(` • ${row.type}: ${row.count}`); }); console.log(); } if (stats.total_theorems === 0) { console.log('šŸ’” Tip: Store some theorems with `agentdb store`\n'); } } catch (error) { console.error(`āŒ Error: ${error.message}\n`); process.exit(1); } }); program.parse();