brainy/examples/instant-fork-usage.ts

275 lines
7.3 KiB
TypeScript
Raw Normal View History

/**
* Instant Fork Usage Examples (v5.0.0)
*
* COW is ZERO-CONFIG in v5.0.0:
* - No setup needed
* - No configuration
* - Just works automatically
*
* This example shows how EASY and ELEGANT fork() is for developers.
*/
import { Brainy } from '@soulcraft/brainy'
// ========== Example 1: Basic Fork (Zero Config) ==========
async function basicFork() {
// Create Brainy (COW automatic!)
const brain = new Brainy({
storage: { adapter: 'memory' }
})
await brain.init()
// Add some data
await brain.add({ noun: 'user', data: { name: 'Alice' } })
await brain.add({ noun: 'user', data: { name: 'Bob' } })
// Fork instantly (1-2 seconds, even with millions of entities!)
const experiment = await brain.fork('experiment')
// Make changes in fork (doesn't affect main)
await experiment.add({ noun: 'user', data: { name: 'Charlie' } })
// Main brain unchanged
console.log(await brain.find({ noun: 'user' })) // Alice, Bob
console.log(await experiment.find({ noun: 'user' })) // Alice, Bob, Charlie
// That's it! Zero config, pure elegance.
}
// ========== Example 2: Safe Experimentation ==========
async function safeExperimentation() {
const brain = new Brainy({
storage: { adapter: 'filesystem', path: './data' }
})
await brain.init()
// Production data
const users = await brain.find({ noun: 'user' })
console.log(`Production: ${users.length} users`)
// Test a risky operation in fork
const test = await brain.fork('test-migration')
// Run migration on fork (safe!)
for (const user of await test.find({ noun: 'user' })) {
await test.update(user.id, {
email: user.data.email.toLowerCase() // Risky transformation
})
}
// Test it
const results = await test.find({ noun: 'user' })
if (results.every(r => r.data.email === r.data.email.toLowerCase())) {
console.log('✅ Migration safe, apply to production')
// Apply to production...
} else {
console.log('❌ Migration failed, discard fork')
await test.destroy() // Discard failed experiment
}
}
// ========== Example 3: A/B Testing ==========
async function abTesting() {
const brain = new Brainy({
storage: { adapter: 's3', bucket: 'my-data' }
})
await brain.init()
// Create variant A (control)
const variantA = await brain.fork('variant-a')
// Create variant B (test)
const variantB = await brain.fork('variant-b')
// Run different algorithms
await variantA.processWithAlgorithm('current')
await variantB.processWithAlgorithm('improved')
// Compare results
const metricsA = await variantA.getMetrics()
const metricsB = await variantB.getMetrics()
console.log('A:', metricsA.accuracy)
console.log('B:', metricsB.accuracy)
// Choose winner, apply to main
if (metricsB.accuracy > metricsA.accuracy) {
console.log('B wins! Deploying...')
// Merge B to main
}
}
// ========== Example 4: Time Travel (Enterprise) ==========
async function timeTravel() {
const brain = new Brainy({
storage: { adapter: 'memory' }
})
await brain.init()
// Add data over time
await brain.add({ noun: 'doc', data: { version: 1 } })
await brain.commit({ message: 'Version 1' })
const yesterday = Date.now() - 86400000 // 24 hours ago
await brain.add({ noun: 'doc', data: { version: 2 } })
await brain.commit({ message: 'Version 2' })
// Query as of yesterday (time travel!)
const snapshot = await brain.asOf(yesterday)
const docs = await snapshot.find({ noun: 'doc' })
console.log(docs[0].data.version) // 1 (from yesterday!)
// Zero config, pure magic ✨
}
// ========== Example 5: Backup & Restore (Instant) ==========
async function instantBackup() {
const brain = new Brainy({
storage: { adapter: 'memory' }
})
await brain.init()
// Work with production data
await brain.add({ noun: 'important', data: { value: 'critical' } })
// Instant backup (1-2 seconds!)
const backup = await brain.fork('backup-2024-01-01')
// Continue working
await brain.delete((await brain.find({ noun: 'important' }))[0].id)
// Oops! Need to restore
const restored = await brain.rollback(backup.getCurrentCommit())
// Data restored instantly!
console.log(await brain.find({ noun: 'important' })) // Back!
}
// ========== Example 6: Distributed Teams (Fork per Developer) ==========
async function distributedDevelopment() {
// Main production brain
const production = new Brainy({
storage: { adapter: 's3', bucket: 'production-data' }
})
await production.init()
// Alice's fork
const alice = await production.fork('alice-feature-x')
// Bob's fork
const bob = await production.fork('bob-feature-y')
// Both work independently (zero conflicts!)
await alice.add({ noun: 'feature', data: { name: 'X' } })
await bob.add({ noun: 'feature', data: { name: 'Y' } })
// Merge when ready
await production.merge(alice, { author: 'Alice' })
await production.merge(bob, { author: 'Bob' })
// Production has both features!
}
// ========== Example 7: VFS Snapshots ==========
async function vfsSnapshots() {
const brain = new Brainy({
storage: { adapter: 'memory' },
vfs: { enabled: true }
})
await brain.init()
// Create file structure
await brain.vfs.writeFile('/project/README.md', '# My Project')
await brain.vfs.writeFile('/project/src/index.ts', 'console.log("v1")')
await brain.commit({ message: 'Initial project' })
// Fork for refactoring
const refactor = await brain.fork('refactor')
// Refactor code in fork
await refactor.vfs.writeFile('/project/src/index.ts', 'console.log("v2")')
await refactor.vfs.mkdir('/project/src/utils')
// Test refactor
// ...
feat: ID-first storage architecture + remove memory-unsafe APIs (v6.0.0) BREAKING CHANGES: **ID-First Storage Paths** - Direct O(1) entity access without type lookups - Before: entities/nouns/{TYPE}/metadata/{SHARD}/{ID}.json - After: entities/nouns/{SHARD}/{ID}/metadata.json - Migration handled automatically on first init() **Removed Memory-Unsafe APIs** - Removed brain.merge() - loaded all entities into memory - Removed brain.diff() - loaded all entities into memory - Removed brain.data().backup() - loaded all entities into memory - Removed brain.data().restore() - depended on backup() - Removed CLI commands: backup, restore, cow merge **Migration Paths** - merge() → Use checkout() or manually copy entities with pagination - diff() → Use asOf() with manual paginated comparison - backup() → Use fork() for instant COW snapshots - restore() → Use checkout() to switch to snapshot branch Core Improvements: - ✅ All 8 storage adapters properly call super.init() - ✅ GraphAdjacencyIndex integration in BaseStorage.init() - ✅ Fixed ID-first path bugs (vector.json → vectors.json) - ✅ Fixed MemoryStorage.initializeCounts() for ID-first paths - ✅ New VFS APIs: du(), access(), find() - ✅ Comprehensive documentation with migration guides Storage Adapters Fixed: - MemoryStorage, FileSystemStorage, AzureBlobStorage - GCSStorage, R2Storage, S3CompatibleStorage - OPFSStorage, HistoricalStorageAdapter Files Changed: 28 files, +1,075/-1,933 lines (net -858) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-19 16:46:11 -08:00
// Switch to refactor branch if successful
// await brain.checkout('refactor')
}
// ========== The Key: It's All Zero Config! ==========
async function zeroConfigDemo() {
// This is ALL you need:
const brain = new Brainy({ storage: { adapter: 'memory' } })
await brain.init()
// COW is automatic:
// ✅ Compression: automatic (based on data type)
// ✅ Deduplication: automatic (content-addressable)
// ✅ Caching: automatic (LRU with memory limits)
// ✅ Reference counting: automatic (safe deletion)
// ✅ Garbage collection: automatic (optional manual trigger)
// Fork is instant:
const fork = await brain.fork() // < 2 seconds even at 1M entities
// That's it! No configuration, no complexity, pure elegance.
}
// ========== API Summary ==========
/*
DEVELOPER API (v5.0.0):
// Fork operations
brain.fork(branch?) Create instant clone
brain.asOf(timestamp) Time-travel query (Enterprise)
brain.rollback(commitHash) Restore to commit (Enterprise)
brain.commit(options?) Create commit (automatic)
// Branch operations
brain.listBranches() List all branches
brain.checkout(branch) Switch to branch
feat: ID-first storage architecture + remove memory-unsafe APIs (v6.0.0) BREAKING CHANGES: **ID-First Storage Paths** - Direct O(1) entity access without type lookups - Before: entities/nouns/{TYPE}/metadata/{SHARD}/{ID}.json - After: entities/nouns/{SHARD}/{ID}/metadata.json - Migration handled automatically on first init() **Removed Memory-Unsafe APIs** - Removed brain.merge() - loaded all entities into memory - Removed brain.diff() - loaded all entities into memory - Removed brain.data().backup() - loaded all entities into memory - Removed brain.data().restore() - depended on backup() - Removed CLI commands: backup, restore, cow merge **Migration Paths** - merge() → Use checkout() or manually copy entities with pagination - diff() → Use asOf() with manual paginated comparison - backup() → Use fork() for instant COW snapshots - restore() → Use checkout() to switch to snapshot branch Core Improvements: - ✅ All 8 storage adapters properly call super.init() - ✅ GraphAdjacencyIndex integration in BaseStorage.init() - ✅ Fixed ID-first path bugs (vector.json → vectors.json) - ✅ Fixed MemoryStorage.initializeCounts() for ID-first paths - ✅ New VFS APIs: du(), access(), find() - ✅ Comprehensive documentation with migration guides Storage Adapters Fixed: - MemoryStorage, FileSystemStorage, AzureBlobStorage - GCSStorage, R2Storage, S3CompatibleStorage - OPFSStorage, HistoricalStorageAdapter Files Changed: 28 files, +1,075/-1,933 lines (net -858) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-19 16:46:11 -08:00
brain.deleteBranch(branch) Delete a branch
// Time queries
brain.getHistory(limit?) Get commit history
brain.findAtTime(timestamp) Find commit at time
brain.getStats() Get storage stats
// All existing Brainy APIs work the same:
brain.add()
brain.find()
brain.search()
brain.vfs.*
brain.query() // Triple Intelligence
ZERO CONFIG REQUIRED!
*/
// Run examples
if (require.main === module) {
basicFork()
.then(() => console.log('✅ All examples complete'))
.catch(console.error)
}