- Add @deprecated JSDoc tags to TypeScript definitions
- Update all documentation examples to use modern add() and relate() API
- Preserve batch operations (addNouns, addVerbs) as they remain current
- Mark deprecated methods in both source and compiled definitions
Migration guide:
- addNoun(data, type, metadata) → add(data, { nounType: type, ...metadata })
- addVerb(source, target, type, metadata) → relate(source, target, type, metadata)
13 KiB
Universal Display Augmentation
The Universal Display Augmentation is a powerful AI-powered system that automatically enhances any data stored in Brainy with intelligent display fields and descriptions. It provides a rich, visual experience while maintaining complete backward compatibility and zero performance impact until accessed.
🎯 Overview
What It Does
- AI-Powered Enhancement: Uses existing IntelligentTypeMatcher for semantic type detection
- Smart Titles: Generates contextual, human-readable titles
- Rich Descriptions: Creates enhanced descriptions with context
- Relationship Formatting: Formats verb relationships in human-readable form
- Zero Conflicts: Uses method-based API to avoid namespace conflicts with user data
Key Benefits
- Zero Configuration: Enabled by default with intelligent fallbacks
- High Performance: Lazy computation with intelligent LRU caching
- Complete Isolation: Can be disabled, replaced, or configured independently
- Developer Friendly: Clean API with TypeScript support and autocomplete
- Backward Compatible: Graceful degradation if unavailable
🚀 Quick Start
Basic Usage
import { BrainyData } from '@soulcraft/brainy'
const brainy = new BrainyData()
await brainy.init()
// Add some data
const personId = await brainy.add('John Doe', {
type: 'Person',
role: 'CEO',
company: 'Acme Corp'
})
// Get enhanced result
const person = await brainy.getNoun(personId)
// Access user data (unchanged)
console.log(person.metadata.role) // "CEO"
// Access display fields (new capability)
const display = await person.getDisplay()
console.log(display.title) // "John Doe"
console.log(display.description) // "CEO at Acme Corp"
console.log(display.type) // "Person"
CLI Usage
# Enhanced search results with AI-powered descriptions
brainy search "CEO"
# Output:
# ✅ Found 2 results:
#
# 1. John Doe (Person)
# 🎯 Relevance: 95.3%
# CEO at Acme Corp
# executive, leadership
# Enhanced item display
brainy get person-123
# Output:
# ID: person-123
# Title: John Doe
# Type: Person
# Description: CEO at Acme Corp
# Debug display augmentation
brainy get person-123 --display-debug
📊 API Reference
Enhanced Result Methods
Every result from getNoun(), search(), find(), etc. gains these methods:
getDisplay(field?: string)
Get computed display fields.
// Get all display fields
const allFields = await result.getDisplay()
// Get specific field
const title = await result.getDisplay('title')
const type = await result.getDisplay('type')
Returns: ComputedDisplayFields or specific field value
getAvailableFields(namespace: string)
List available computed fields for a namespace.
const fields = result.getAvailableFields('display')
// ['title', 'description', 'type', 'tags', 'relationship', 'confidence']
getAvailableAugmentations()
List available augmentation namespaces.
const augmentations = result.getAvailableAugmentations()
// ['display']
explore()
Debug method to explore entity structure.
await result.explore()
// Prints detailed information about the entity and its computed fields
Display Fields
All computed display fields available through getDisplay():
interface ComputedDisplayFields {
title: string // Primary display name (AI-computed)
description: string // Enhanced description with context
type: string // Human-readable type (from AI detection)
tags: string[] // Generated display tags
relationship?: string // Human-readable relationship (verbs only)
confidence: number // AI confidence score (0-1)
// Debug fields (optional)
reasoning?: string // AI reasoning for type detection
alternatives?: Array<{type: string, confidence: number}>
computedAt: number // Timestamp of computation
version: string // Augmentation version
}
🎨 Clean, Minimal Design
The display augmentation focuses on content over visual clutter:
- Smart Titles: AI-generated contextual names
- Enhanced Descriptions: Rich, informative descriptions
- Type Detection: Intelligent classification without visual noise
- Professional Aesthetic: Clean, minimal output that matches modern design standards
⚙️ Configuration
Default Configuration
const DEFAULT_CONFIG: DisplayConfig = {
enabled: true, // Enable display augmentation
cacheSize: 1000, // LRU cache size
lazyComputation: true, // Compute on first access
batchSize: 50, // Batch size for operations
confidenceThreshold: 0.7, // Minimum confidence for AI decisions
// No icon configuration needed - clean, minimal approach
customFieldMappings: {}, // Custom field patterns
priorityFields: {}, // Priority field configurations
debugMode: false // Enable debug logging
}
Runtime Configuration
// Get display augmentation
const displayAug = (brainy as any).augmentations.get('display')
// Update configuration
displayAug.configure({
cacheSize: 2000,
confidenceThreshold: 0.8,
debugMode: true
})
// Clear cache
displayAug.clearCache()
// Get performance stats
const stats = displayAug.getStats()
console.log(`Cache hit ratio: ${stats.cacheHitRatio}%`)
BrainyData Configuration
Configure at initialization:
const brainy = new BrainyData({
augmentations: {
display: {
enabled: true,
cacheSize: 2000,
debugMode: true
}
}
})
🧠 AI Integration
IntelligentTypeMatcher Integration
The display augmentation leverages existing AI infrastructure:
// Uses existing type detection
const typeMatcher = IntelligentTypeMatcher.getInstance()
const detectedType = await typeMatcher.detectType(data)
// Maps to enhanced descriptions and smart titles
const description = await generateEnhancedDescription(data, detectedType)
const title = await generateSmartTitle(data, detectedType)
Neural Import Patterns
Reuses patterns from the import system:
// Leverages existing field detection patterns
const titleFields = ['name', 'title', 'displayName', 'label']
const descriptionFields = ['description', 'summary', 'bio', 'about']
// Smart field mapping based on data analysis
const bestTitle = findBestMatch(data, titleFields)
const bestDescription = findBestMatch(data, descriptionFields)
⚡ Performance
Lazy Computation
Display fields are computed only when accessed:
const result = await brainy.getNoun(id) // No computation yet
// First access triggers computation
const display = await result.getDisplay() // Computes and caches
// Subsequent accesses use cache
const sameDisplay = await result.getDisplay() // Instant from cache
Intelligent Caching
- LRU Cache: Least recently used eviction
- Request Deduplication: Prevents duplicate concurrent computations
- Batch Optimization: Efficient bulk operations
- Statistics Tracking: Performance monitoring
Cache Statistics
const stats = displayAugmentation.getStats()
console.log({
totalComputations: stats.totalComputations,
cacheHitRatio: stats.cacheHitRatio, // 0.85 = 85%
averageComputationTime: stats.averageComputationTime, // in ms
commonTypes: stats.commonTypes // Most frequent types
})
🔌 Augmentation Architecture
BaseAugmentation Integration
export class UniversalDisplayAugmentation extends BaseAugmentation {
readonly name = 'display'
readonly version = '1.0.0'
readonly timing = 'after' as const
readonly priority = 50
readonly metadata: MetadataAccess = {
reads: '*', // Read all user data for analysis
writes: ['_display'] // Cache in isolated namespace
}
operations = ['get', 'search', 'findSimilar', 'getVerb'] as const
}
Registry Integration
// Default augmentations (enabled automatically)
import { createDefaultAugmentations } from './defaultAugmentations.js'
const augmentations = createDefaultAugmentations({
display: {
enabled: true,
cacheSize: 1000
}
})
// Manual registration
brainy.registerAugmentation(new UniversalDisplayAugmentation())
🧪 Testing
Unit Tests
import { describe, it, expect } from 'vitest'
describe('Universal Display Augmentation', () => {
it('should enhance results with display fields', async () => {
const result = await brainy.getNoun(id)
expect(result.getDisplay).toBeDefined()
const display = await result.getDisplay()
expect(display.title).toBeDefined()
expect(display.icon).toBeDefined()
expect(display.confidence).toBeGreaterThan(0)
})
})
Integration Tests
# Run display augmentation tests
npm test tests/display-augmentation.test.ts
# Test CLI integration
npm test tests/cli.test.ts
# Performance tests
npm test tests/performance/display.test.ts
Manual Testing
# Test CLI enhancements
brainy add "John Doe" -m '{"type":"Person","role":"CEO"}'
brainy search "CEO"
brainy get <id> --display-debug
# Test various data types
brainy add "Apple Inc" -m '{"type":"Organization"}'
brainy add "MacBook Pro" -m '{"type":"Product"}'
brainy search "*" --limit 10
🚀 Advanced Usage
Custom Configuration
const displayAug = (brainy as any).augmentations.get('display')
displayAug.configure({
confidenceThreshold: 0.8,
debugMode: true
})
Custom Field Mappings
displayAug.configure({
customFieldMappings: {
title: ['customName', 'displayTitle', 'label'],
description: ['summary', 'details', 'info']
}
})
Batch Precomputation
// Precompute display fields for better performance
const entities = await brainy.search('*', { limit: 100 })
await displayAug.precomputeBatch(
entities.map(e => ({ id: e.id, data: e.metadata }))
)
🔧 Debugging
Debug Mode
displayAug.configure({ debugMode: true })
// Or via CLI
brainy get <id> --display-debug
Explore Entity Structure
const result = await brainy.getNoun(id)
await result.explore()
// Output:
// 📋 Entity Exploration: person-123
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
//
// 👤 User Data:
// • name: "John Doe"
// • role: "CEO"
// • company: "Acme Corp"
//
// 🎨 Display Fields:
// • title: "John Doe"
// • description: "CEO at Acme Corp"
// • type: "Person"
// • icon: "👤"
// • confidence: 0.92
Performance Analysis
const stats = displayAug.getStats()
console.log('Performance Analysis:', {
efficiency: `${(stats.cacheHitRatio * 100).toFixed(1)}% cache hits`,
speed: `${stats.averageComputationTime.toFixed(1)}ms average`,
usage: `${stats.totalComputations} total computations`,
popular: stats.commonTypes.map(t => `${t.type} (${t.percentage}%)`)
})
🎯 Best Practices
When to Use
✅ Use display augmentation for:
- Search result presentation
- User interface display
- Report generation
- Data exploration
- Visual dashboards
❌ Don't use for:
- Data processing logic
- Business rule validation
- Storage or indexing
- Performance-critical operations
Performance Tips
- Leverage Caching: Display fields are cached automatically
- Batch Operations: Use bulk operations when possible
- Selective Access: Only access display fields when needed
- Monitor Performance: Check cache hit ratios regularly
Error Handling
try {
const display = await result.getDisplay()
// Use enhanced display
} catch (error) {
// Fallback to basic display
const basicTitle = result.metadata?.name || result.content || result.id
}
🔮 Future Enhancements
Planned Features
- Custom Augmentations: Plugin system for custom display logic
- Theme Support: Different styling themes and formatting options
- Internationalization: Multi-language display fields
- Rich Media: Support for images and rich content
- Analytics: Usage tracking and optimization suggestions
Extensibility
The display augmentation is designed for extensibility:
// Custom display augmentation
class CustomDisplayAugmentation extends BaseAugmentation {
name = 'custom-display'
async computeFields(result: any, namespace: string) {
return {
customTitle: this.generateCustomTitle(result),
customIcon: this.getCustomIcon(result)
}
}
}
📚 Related Documentation
- Augmentation System Architecture
- IntelligentTypeMatcher Guide
- CLI Reference
- Performance Optimization
- API Reference
🤝 Contributing
Contributions welcome! Areas for improvement:
- Additional Icon Mappings: More comprehensive icon coverage
- AI Model Integration: Enhanced type detection accuracy
- Performance Optimization: Cache optimization and batch processing
- Documentation: More examples and use cases
- Testing: Edge cases and integration scenarios
See CONTRIBUTING.md for development guidelines.