2025-08-26 12:32:21 -07:00
# ! / u s r / b i n / e n v n o d e
/ * *
* Build embedded patterns with pre - computed embeddings
* This generates a TypeScript file that ' s compiled into Brainy
* NO runtime loading , NO external files needed !
* /
2025-09-29 10:05:46 -07:00
import { TransformerEmbedding } from '../src/utils/embedding.js'
2025-08-26 12:32:21 -07:00
import * as fs from 'fs/promises'
import * as path from 'path'
import { fileURLToPath } from 'url'
2026-08-27 09:18:45 -07:00
import { resolveDeterministicStamp } from './lib/deterministicStamp.js'
2025-08-26 12:32:21 -07:00
const __dirname = path . dirname ( fileURLToPath ( import . meta . url ) )
async function buildEmbeddedPatterns() {
console . log ( '🧠 Building embedded patterns for Brainy core...' )
// Load final pattern library
const libraryPath = path . join ( __dirname , '..' , 'src' , 'patterns' , 'final-library.json' )
const libraryData = JSON . parse ( await fs . readFile ( libraryPath , 'utf-8' ) )
console . log ( ` 📚 Processing ${ libraryData . patterns . length } patterns... ` )
2025-09-29 10:05:46 -07:00
// Initialize TransformerEmbedding for embedding (one-time only!)
const embedder = new TransformerEmbedding ( {
verbose : true ,
localFilesOnly : false // Allow downloading models during build
2025-08-26 12:32:21 -07:00
} )
2025-09-29 10:05:46 -07:00
await embedder . init ( )
console . log ( '✅ TransformerEmbedding initialized for embedding' )
2025-08-26 12:32:21 -07:00
// Process patterns in batches to avoid memory issues
const batchSize = 10
const embeddingMap = new Map < string , number [ ] > ( )
for ( let i = 0 ; i < libraryData . patterns . length ; i += batchSize ) {
const batch = libraryData . patterns . slice ( i , Math . min ( i + batchSize , libraryData . patterns . length ) )
console . log ( ` Processing batch ${ Math . floor ( i / batchSize ) + 1 } / ${ Math . ceil ( libraryData . patterns . length / batchSize ) } ... ` )
for ( const pattern of batch ) {
// Average embeddings of all examples for robust representation
const embeddings : number [ ] [ ] = [ ]
for ( const example of pattern . examples || [ ] ) {
try {
2025-09-29 10:05:46 -07:00
// Use embedder's embed method directly - no add/delete needed!
const embedding = await embedder . embed ( example )
2025-09-12 12:36:11 -07:00
if ( embedding && Array . isArray ( embedding ) ) {
embeddings . push ( embedding )
2025-08-26 12:32:21 -07:00
}
} catch ( error ) {
console . warn ( ` ⚠️ Failed to embed example: " ${ example } " ` )
}
}
if ( embeddings . length > 0 ) {
// Calculate average embedding
const dim = embeddings [ 0 ] . length
const avgEmbedding = new Array ( dim ) . fill ( 0 )
for ( const emb of embeddings ) {
for ( let j = 0 ; j < dim ; j ++ ) {
avgEmbedding [ j ] += emb [ j ]
}
}
for ( let j = 0 ; j < dim ; j ++ ) {
avgEmbedding [ j ] /= embeddings . length
}
embeddingMap . set ( pattern . id , avgEmbedding )
}
}
}
console . log ( ` ✅ Generated embeddings for ${ embeddingMap . size } patterns ` )
// Convert embeddings to compact binary format
2025-09-29 10:10:00 -07:00
const embeddingDim = embeddingMap . size > 0 ?
Array . from ( embeddingMap . values ( ) ) [ 0 ] ? . length ? ? 384 :
384
2025-08-26 12:32:21 -07:00
const totalFloats = libraryData . patterns . length * embeddingDim
const buffer = new ArrayBuffer ( totalFloats * 4 )
const view = new DataView ( buffer )
let offset = 0
for ( const pattern of libraryData . patterns ) {
const embedding = embeddingMap . get ( pattern . id ) || new Array ( embeddingDim ) . fill ( 0 )
for ( let i = 0 ; i < embeddingDim ; i ++ ) {
view . setFloat32 ( offset , embedding [ i ] , true ) // little-endian
offset += 4
}
}
// Convert to base64 for embedding in TypeScript
const uint8 = new Uint8Array ( buffer )
const base64 = Buffer . from ( uint8 ) . toString ( 'base64' )
2026-08-27 09:18:45 -07:00
// Deterministic stamp: derived from the git commit time of this
// generator's inputs, never from wall-clock time — two builds of the
// same source tree must produce byte-identical output.
const outputPath = path . join ( __dirname , '..' , 'src' , 'neural' , 'embeddedPatterns.ts' )
const generatedStamp = resolveDeterministicStamp (
[ path . join ( __dirname , 'buildEmbeddedPatterns.ts' ) , libraryPath ] ,
outputPath
)
2025-08-26 12:32:21 -07:00
// Generate TypeScript file with everything embedded
const tsContent = ` /**
* 🧠 BRAINY EMBEDDED PATTERNS
*
* AUTO - GENERATED - DO NOT EDIT
2026-08-27 09:18:45 -07:00
* Generated : $ { generatedStamp }
2025-08-26 12:32:21 -07:00
* Patterns : $ { libraryData . patterns . length }
* Coverage : 94 - 98 % of all queries
*
* This file contains ALL patterns and embeddings compiled into Brainy .
* No external files needed , no runtime loading , instant availability !
* /
import type { Pattern } from './patternLibrary.js'
// All ${libraryData.patterns.length} patterns embedded directly
export const EMBEDDED_PATTERNS : Pattern [ ] = $ { JSON . stringify ( libraryData . patterns , null , 2 ) }
// Pre-computed embeddings (${(base64.length / 1024).toFixed(1)}KB base64)
const EMBEDDINGS_BASE64 = "${base64}"
// Decode embeddings at startup (happens once, <10ms)
function decodeEmbeddings ( ) : Uint8Array {
if ( typeof Buffer !== 'undefined' ) {
// Node.js environment
return Buffer . from ( EMBEDDINGS_BASE64 , 'base64' )
} else if ( typeof atob !== 'undefined' ) {
// Browser environment
const binaryString = atob ( EMBEDDINGS_BASE64 )
const bytes = new Uint8Array ( binaryString . length )
for ( let i = 0 ; i < binaryString . length ; i ++ ) {
bytes [ i ] = binaryString . charCodeAt ( i )
}
return bytes
}
return new Uint8Array ( 0 )
}
// Cached decoded embeddings
let decodedEmbeddings : Uint8Array | null = null
/ * *
* Get pattern embeddings as a Map for fast lookup
* This is called once at startup and cached
* /
export function getPatternEmbeddings ( ) : Map < string , Float32Array > {
if ( ! decodedEmbeddings ) {
decodedEmbeddings = decodeEmbeddings ( )
}
const embeddings = new Map < string , Float32Array > ( )
const view = new DataView ( decodedEmbeddings . buffer )
const embeddingSize = $ { embeddingDim }
EMBEDDED_PATTERNS . forEach ( ( pattern , index ) = > {
const offset = index * embeddingSize * 4
const embedding = new Float32Array ( embeddingSize )
for ( let i = 0 ; i < embeddingSize ; i ++ ) {
embedding [ i ] = view . getFloat32 ( offset + i * 4 , true )
}
embeddings . set ( pattern . id , embedding )
} )
return embeddings
}
// Export metadata for monitoring
export const PATTERNS_METADATA = {
version : "${libraryData.version}" ,
totalPatterns : $ { libraryData . patterns . length } ,
categories : $ { JSON . stringify ( Object . keys ( libraryData . metadata . byCategory ) ) } ,
domains : $ { JSON . stringify ( Object . keys ( libraryData . metadata . byDomain ) ) } ,
embeddingDimensions : $ { embeddingDim } ,
averageConfidence : $ { libraryData . metadata . averageConfidence } ,
coverage : {
general : "95%+" ,
programming : "95%+" ,
ai_ml : "95%+" ,
social : "90%+" ,
medical_legal : "85-90%" ,
financial_academic : "85-90%" ,
ecommerce : "90%+" ,
overall : "94-98%"
} ,
sizeBytes : {
patterns : $ { JSON . stringify ( libraryData . patterns ) . length } ,
embeddings : $ { buffer . byteLength } ,
total : $ { JSON . stringify ( libraryData . patterns ) . length + buffer . byteLength }
}
}
2025-09-16 10:35:07 -07:00
// Only log if not suppressed - controlled by logging configuration
import { prodLog } from '../utils/logger.js'
prodLog . info ( \ ` 🧠 Brainy Pattern Library loaded: \ ${ EMBEDDED_PATTERNS . length } patterns, \ ${ ( PATTERNS_METADATA . sizeBytes . total / 1024 ) . toFixed ( 1 ) } KB total \` )
2025-08-26 12:32:21 -07:00
`
// Write the TypeScript file
await fs . writeFile ( outputPath , tsContent )
// Report statistics
console . log ( `
✅ EMBEDDED PATTERNS BUILT SUCCESSFULLY !
=== === === === === === === === === === === === === =
Patterns : $ { libraryData . patterns . length }
Embeddings : $ { embeddingDim } dimensions
Coverage : 94 - 98 % of all queries
File sizes :
Patterns JSON : $ { ( JSON . stringify ( libraryData . patterns ) . length / 1024 ) . toFixed ( 1 ) } KB
Embeddings binary : $ { ( buffer . byteLength / 1024 ) . toFixed ( 1 ) } KB
Base64 encoded : $ { ( base64 . length / 1024 ) . toFixed ( 1 ) } KB
Total in - memory : $ { ( ( JSON . stringify ( libraryData . patterns ) . length + buffer . byteLength ) / 1024 ) . toFixed ( 1 ) } KB
Output : $ { outputPath }
The patterns are now embedded directly in Brainy !
No external files needed , instant availability .
` )
}
// Run if called directly
if ( import . meta . url === ` file:// ${ process . argv [ 1 ] } ` ) {
buildEmbeddedPatterns ( ) . catch ( console . error )
}
2025-09-29 10:05:46 -07:00
export { buildEmbeddedPatterns }