feat: Brainy 3.0 - Triple Intelligence Release
BREAKING CHANGE: New unified API for vector, graph, and document search
Major Changes:
- NEW: brain.add() replaces brain.addNoun()
- NEW: brain.find() replaces brain.search()
- NEW: brain.relate() replaces brain.addVerb()
- NEW: brain.update() replaces brain.updateNoun()
- NEW: brain.delete() replaces brain.deleteNoun()
Features:
- Triple Intelligence™ engine (vector + graph + document)
- 31 NounTypes × 40 VerbTypes for universal knowledge modeling
- Zero-config parameter validation
- Enhanced augmentation system (cache, display, metrics)
- <10ms search performance with HNSW indexing
- Full TypeScript type safety
Infrastructure:
- Comprehensive test suites for find() and neural APIs
- Fixed neural API internal calls (getNoun → get)
- Updated README with accurate 3.0 examples
- ESLint v9 configuration
- Structured logging framework
🧠 Generated with Brainy 3.0
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
7eaf5a9252
commit
ce2bc76648
19 changed files with 4927 additions and 163 deletions
296
src/utils/enhancedLogger.ts
Normal file
296
src/utils/enhancedLogger.ts
Normal file
|
|
@ -0,0 +1,296 @@
|
|||
/**
|
||||
* Enhanced logging system that bridges old logger with new structured logger
|
||||
* Provides backward compatibility while enabling gradual migration
|
||||
*/
|
||||
|
||||
import {
|
||||
structuredLogger,
|
||||
createModuleLogger as createStructuredModuleLogger,
|
||||
LogLevel as StructuredLogLevel,
|
||||
type LogContext,
|
||||
type ModuleLogger
|
||||
} from './structuredLogger.js'
|
||||
import { isProductionEnvironment, getLogLevel } from './environment.js'
|
||||
|
||||
// Re-export LogLevel for compatibility
|
||||
export enum LogLevel {
|
||||
ERROR = 0,
|
||||
WARN = 1,
|
||||
INFO = 2,
|
||||
DEBUG = 3,
|
||||
TRACE = 4
|
||||
}
|
||||
|
||||
// Map old LogLevel to new StructuredLogLevel
|
||||
function mapLogLevel(level: LogLevel): StructuredLogLevel {
|
||||
switch (level) {
|
||||
case LogLevel.ERROR: return StructuredLogLevel.ERROR
|
||||
case LogLevel.WARN: return StructuredLogLevel.WARN
|
||||
case LogLevel.INFO: return StructuredLogLevel.INFO
|
||||
case LogLevel.DEBUG: return StructuredLogLevel.DEBUG
|
||||
case LogLevel.TRACE: return StructuredLogLevel.TRACE
|
||||
default: return StructuredLogLevel.INFO
|
||||
}
|
||||
}
|
||||
|
||||
export interface LoggerConfig {
|
||||
level: LogLevel
|
||||
modules?: {
|
||||
[moduleName: string]: LogLevel
|
||||
}
|
||||
timestamps?: boolean
|
||||
includeModule?: boolean
|
||||
handler?: (level: LogLevel, module: string, message: string, ...args: any[]) => void
|
||||
}
|
||||
|
||||
/**
|
||||
* Enhanced Logger that uses structured logger internally
|
||||
* Maintains backward compatibility with existing code
|
||||
*/
|
||||
class EnhancedLogger {
|
||||
private static instance: EnhancedLogger
|
||||
private config: LoggerConfig = {
|
||||
level: LogLevel.ERROR,
|
||||
timestamps: false,
|
||||
includeModule: true
|
||||
}
|
||||
|
||||
private constructor() {
|
||||
this.applyEnvironmentDefaults()
|
||||
|
||||
// Sync with structured logger
|
||||
this.syncWithStructuredLogger()
|
||||
|
||||
// Set log level from environment variable if available
|
||||
const envLogLevel = process.env.BRAINY_LOG_LEVEL
|
||||
if (envLogLevel) {
|
||||
const level = LogLevel[envLogLevel.toUpperCase() as keyof typeof LogLevel]
|
||||
if (level !== undefined) {
|
||||
this.config.level = level
|
||||
this.syncWithStructuredLogger()
|
||||
}
|
||||
}
|
||||
|
||||
// Parse module-specific log levels
|
||||
const moduleLogLevels = process.env.BRAINY_MODULE_LOG_LEVELS
|
||||
if (moduleLogLevels) {
|
||||
try {
|
||||
this.config.modules = JSON.parse(moduleLogLevels)
|
||||
this.syncWithStructuredLogger()
|
||||
} catch (e) {
|
||||
// Ignore parsing errors
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private applyEnvironmentDefaults(): void {
|
||||
const envLogLevel = getLogLevel()
|
||||
|
||||
switch (envLogLevel) {
|
||||
case 'silent':
|
||||
this.config.level = -1 as LogLevel
|
||||
break
|
||||
case 'error':
|
||||
this.config.level = LogLevel.ERROR
|
||||
this.config.timestamps = false
|
||||
break
|
||||
case 'warn':
|
||||
this.config.level = LogLevel.WARN
|
||||
this.config.timestamps = false
|
||||
break
|
||||
case 'info':
|
||||
this.config.level = LogLevel.INFO
|
||||
this.config.timestamps = true
|
||||
break
|
||||
case 'verbose':
|
||||
this.config.level = LogLevel.DEBUG
|
||||
this.config.timestamps = true
|
||||
break
|
||||
}
|
||||
|
||||
if (isProductionEnvironment()) {
|
||||
this.config.level = Math.min(this.config.level, LogLevel.ERROR)
|
||||
this.config.timestamps = false
|
||||
this.config.includeModule = false
|
||||
}
|
||||
}
|
||||
|
||||
private syncWithStructuredLogger(): void {
|
||||
// Convert modules config
|
||||
const modules: Record<string, StructuredLogLevel> = {}
|
||||
if (this.config.modules) {
|
||||
for (const [module, level] of Object.entries(this.config.modules)) {
|
||||
modules[module] = mapLogLevel(level)
|
||||
}
|
||||
}
|
||||
|
||||
// Configure structured logger
|
||||
structuredLogger.configure({
|
||||
level: mapLogLevel(this.config.level),
|
||||
modules,
|
||||
format: this.config.timestamps ? 'pretty' : 'simple'
|
||||
})
|
||||
}
|
||||
|
||||
static getInstance(): EnhancedLogger {
|
||||
if (!EnhancedLogger.instance) {
|
||||
EnhancedLogger.instance = new EnhancedLogger()
|
||||
}
|
||||
return EnhancedLogger.instance
|
||||
}
|
||||
|
||||
configure(config: Partial<LoggerConfig>): void {
|
||||
this.config = { ...this.config, ...config }
|
||||
this.syncWithStructuredLogger()
|
||||
}
|
||||
|
||||
private shouldLog(level: LogLevel, module: string): boolean {
|
||||
if (this.config.modules && this.config.modules[module] !== undefined) {
|
||||
return level <= this.config.modules[module]
|
||||
}
|
||||
return level <= this.config.level
|
||||
}
|
||||
|
||||
error(module: string, message: string, ...args: any[]): void {
|
||||
const logger = createStructuredModuleLogger(module)
|
||||
logger.error(message, { data: args })
|
||||
}
|
||||
|
||||
warn(module: string, message: string, ...args: any[]): void {
|
||||
const logger = createStructuredModuleLogger(module)
|
||||
logger.warn(message, { data: args })
|
||||
}
|
||||
|
||||
info(module: string, message: string, ...args: any[]): void {
|
||||
const logger = createStructuredModuleLogger(module)
|
||||
logger.info(message, { data: args })
|
||||
}
|
||||
|
||||
debug(module: string, message: string, ...args: any[]): void {
|
||||
const logger = createStructuredModuleLogger(module)
|
||||
logger.debug(message, { data: args })
|
||||
}
|
||||
|
||||
trace(module: string, message: string, ...args: any[]): void {
|
||||
const logger = createStructuredModuleLogger(module)
|
||||
logger.trace(message, { data: args })
|
||||
}
|
||||
|
||||
createModuleLogger(module: string) {
|
||||
const structuredLogger = createStructuredModuleLogger(module)
|
||||
|
||||
// Return a backward-compatible interface
|
||||
return {
|
||||
error: (message: string, ...args: any[]) =>
|
||||
structuredLogger.error(message, { data: args }),
|
||||
warn: (message: string, ...args: any[]) =>
|
||||
structuredLogger.warn(message, { data: args }),
|
||||
info: (message: string, ...args: any[]) =>
|
||||
structuredLogger.info(message, { data: args }),
|
||||
debug: (message: string, ...args: any[]) =>
|
||||
structuredLogger.debug(message, { data: args }),
|
||||
trace: (message: string, ...args: any[]) =>
|
||||
structuredLogger.trace(message, { data: args }),
|
||||
// New structured logging methods
|
||||
withContext: (context: LogContext) =>
|
||||
structuredLogger.withContext(context),
|
||||
startTimer: (label: string) =>
|
||||
structuredLogger.startTimer(label),
|
||||
endTimer: (label: string) =>
|
||||
structuredLogger.endTimer(label)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Export singleton instance
|
||||
export const logger = EnhancedLogger.getInstance()
|
||||
|
||||
// Export convenience function for creating module loggers
|
||||
export function createModuleLogger(module: string) {
|
||||
return logger.createModuleLogger(module)
|
||||
}
|
||||
|
||||
// Export function to configure logger
|
||||
export function configureLogger(config: Partial<LoggerConfig>) {
|
||||
logger.configure(config)
|
||||
}
|
||||
|
||||
/**
|
||||
* Smart console replacement that uses structured logger
|
||||
*/
|
||||
export const smartConsole = {
|
||||
log: (message?: any, ...args: any[]) => {
|
||||
const logger = createStructuredModuleLogger('console')
|
||||
logger.info(typeof message === 'string' ? message : JSON.stringify(message), { data: args })
|
||||
},
|
||||
|
||||
info: (message?: any, ...args: any[]) => {
|
||||
const logger = createStructuredModuleLogger('console')
|
||||
logger.info(typeof message === 'string' ? message : JSON.stringify(message), { data: args })
|
||||
},
|
||||
|
||||
warn: (message?: any, ...args: any[]) => {
|
||||
const logger = createStructuredModuleLogger('console')
|
||||
logger.warn(typeof message === 'string' ? message : JSON.stringify(message), { data: args })
|
||||
},
|
||||
|
||||
error: (message?: any, ...args: any[]) => {
|
||||
const logger = createStructuredModuleLogger('console')
|
||||
logger.error(typeof message === 'string' ? message : JSON.stringify(message), { data: args })
|
||||
},
|
||||
|
||||
debug: (message?: any, ...args: any[]) => {
|
||||
const logger = createStructuredModuleLogger('console')
|
||||
logger.debug(typeof message === 'string' ? message : JSON.stringify(message), { data: args })
|
||||
},
|
||||
|
||||
trace: (message?: any, ...args: any[]) => {
|
||||
const logger = createStructuredModuleLogger('console')
|
||||
logger.trace(typeof message === 'string' ? message : JSON.stringify(message), { data: args })
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Production-optimized logging functions
|
||||
*/
|
||||
export const prodLog = {
|
||||
error: (message?: any, ...args: any[]) => {
|
||||
const logger = createStructuredModuleLogger('prod')
|
||||
logger.error(typeof message === 'string' ? message : JSON.stringify(message), { data: args })
|
||||
},
|
||||
|
||||
warn: (message?: any, ...args: any[]) => {
|
||||
if (!isProductionEnvironment() || process.env.BRAINY_LOG_LEVEL) {
|
||||
const logger = createStructuredModuleLogger('prod')
|
||||
logger.warn(typeof message === 'string' ? message : JSON.stringify(message), { data: args })
|
||||
}
|
||||
},
|
||||
|
||||
info: (message?: any, ...args: any[]) => {
|
||||
if (!isProductionEnvironment() || process.env.BRAINY_LOG_LEVEL) {
|
||||
const logger = createStructuredModuleLogger('prod')
|
||||
logger.info(typeof message === 'string' ? message : JSON.stringify(message), { data: args })
|
||||
}
|
||||
},
|
||||
|
||||
debug: (message?: any, ...args: any[]) => {
|
||||
if (!isProductionEnvironment() || process.env.BRAINY_LOG_LEVEL) {
|
||||
const logger = createStructuredModuleLogger('prod')
|
||||
logger.debug(typeof message === 'string' ? message : JSON.stringify(message), { data: args })
|
||||
}
|
||||
},
|
||||
|
||||
log: (message?: any, ...args: any[]) => {
|
||||
if (!isProductionEnvironment() || process.env.BRAINY_LOG_LEVEL) {
|
||||
const logger = createStructuredModuleLogger('prod')
|
||||
logger.info(typeof message === 'string' ? message : JSON.stringify(message), { data: args })
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Re-export structured logger utilities for new code
|
||||
export {
|
||||
createModuleLogger as createStructuredModuleLogger,
|
||||
type LogContext,
|
||||
type ModuleLogger
|
||||
} from './structuredLogger.js'
|
||||
Loading…
Add table
Add a link
Reference in a new issue