diff --git a/examples/README.md b/examples/README.md deleted file mode 100644 index db3f97af..00000000 --- a/examples/README.md +++ /dev/null @@ -1,67 +0,0 @@ -
-Brainy Logo - -# Brainy Examples -
- -This directory contains examples demonstrating various features and use cases of the Brainy vector graph database. - -## Browser-Server Search Example - -The [browser-server-search](./browser-server-search/) example demonstrates how to use Brainy in a browser, call a server-hosted version for search, store the results locally, and then perform further searches against the local instance. - -This approach allows you to: -- Search a server-hosted Brainy instance from a browser -- Store the search results in a local Brainy instance -- Perform further searches against the local instance without needing to query the server again -- Add data to both local and server instances - -See the [browser-server-search README](./browser-server-search/README.md) for detailed instructions. - -## Other Examples - -### Augmentation Examples - -- [conduitAugmentationExample.js](./conduitAugmentationExample.js) - Demonstrates how to use conduit augmentations for syncing Brainy instances -- [memoryAugmentationExample.js](./memoryAugmentationExample.js) - Shows how to use memory augmentations for custom storage - -### Pipeline Examples - -- [sequentialPipelineExample.js](./sequentialPipelineExample.js) - Demonstrates the sequential pipeline for processing data - -### Demo - -- [demo.html](./demo.html) - A web demo showcasing Brainy's capabilities - -### Configuration Examples - -- [configurationTest.js](./configurationTest.js) - Shows how to configure Brainy with custom options -- [readOnlyTest.js](./readOnlyTest.js) - Demonstrates using Brainy in read-only mode -- [buildTimeRegistration.js](./buildTimeRegistration.js) - Shows how to register augmentations at build time - -### Data Inspection - -- [dataInspectionExample.js](./dataInspectionExample.js) - Demonstrates how to inspect data stored in Brainy - -## Running the Examples - -Most JavaScript examples can be run using Node.js: - -```bash -node examples/sequentialPipelineExample.js -``` - -For HTML examples, you can open them directly in a browser or serve them using a local HTTP server: - -```bash -# Using a simple HTTP server -npx http-server -``` - -Then navigate to the appropriate URL in your browser (e.g., http://localhost:8080/examples/demo.html). - -## Creating Your Own Examples - -Feel free to use these examples as a starting point for your own projects. You can copy and modify them to suit your needs. - -If you create an example that might be useful to others, consider contributing it back to the Brainy project! diff --git a/examples/browser-server-search/README.md b/examples/browser-server-search/README.md deleted file mode 100644 index 6b7521c6..00000000 --- a/examples/browser-server-search/README.md +++ /dev/null @@ -1,191 +0,0 @@ -
-Brainy Logo - -# Brainy Browser-Server Search Example -
- -This example demonstrates how to use Brainy in a browser, call a server-hosted version for search, store the results locally, and then perform further searches against the local instance. - -## Overview - -The solution consists of: - -1. A `BrainyServerSearch` class that handles the connection to the server and local storage -2. An HTML interface for testing the functionality -3. Server-side setup using the Brainy cloud wrapper - -This approach allows you to: -- Search a server-hosted Brainy instance from a browser -- Store the search results in a local Brainy instance -- Perform further searches against the local instance without needing to query the server again -- Add data to both local and server instances - -## How It Works - -1. The browser creates a local Brainy instance -2. It connects to the server-hosted Brainy instance using WebSocket -3. When a search is performed: - - The query is sent to the server - - The server returns the search results - - The results are stored in the local Brainy instance - - The results are displayed to the user -4. Subsequent searches can be performed against the local instance -5. A combined search mode first checks the local instance and then queries the server only if needed - -## Setup Instructions - -### Server Setup - -1. Set up the Brainy cloud wrapper: - -```bash -# Clone the repository if you haven't already -git clone https://github.com/soulcraft/brainy.git -cd brainy/cloud-wrapper - -# Install dependencies -npm install --legacy-peer-deps - -# Configure the server -cp .env.example .env -# Edit .env to configure your environment - -# Build and start the server -npm run build -npm run start -``` - -2. Note the WebSocket URL of your server (e.g., `wss://your-server.com/ws` or `ws://localhost:3000/ws` for local development) - -### Client Setup - -1. Copy the example files to your project: - -```bash -cp -r examples/browser-server-search your-project/ -``` - -2. Include the Brainy library in your project: - -```bash -npm install @soulcraft/brainy --legacy-peer-deps -``` - -3. Open the HTML file in a browser or serve it using a local server: - -```bash -# Using a simple HTTP server -cd your-project -npx http-server -``` - -4. Navigate to http://localhost:8080/browser-server-search/ in your browser - -5. Enter the WebSocket URL of your server and start using the example - -## Usage - -### Using the HTML Interface - -1. Enter the WebSocket URL of your Brainy server -2. Click "Connect" to establish a connection -3. Enter a search query and click one of the search buttons: - - "Search Server" - Search the server and store results locally - - "Search Local" - Search only the local instance - - "Search Combined" - Search local first, then server if needed -4. To add data, enter text in the "Add Data" field and click "Add to Both" - -### Using the BrainyServerSearch Class in Your Code - -```javascript -import { BrainyServerSearch } from './index.js'; - -// Create a new instance -const brainySearch = new BrainyServerSearch('wss://your-brainy-server.com/ws'); - -// Initialize and connect -await brainySearch.init(); - -// Search the server and store results locally -const serverResults = await brainySearch.searchServer('machine learning', 5); - -// Search the local instance -const localResults = await brainySearch.searchLocal('machine learning', 5); - -// Perform a combined search -const combinedResults = await brainySearch.searchCombined('neural networks', 5); - -// Add data to both local and server -const id = await brainySearch.add('Deep learning is a subset of machine learning', { - noun: 'Concept', - category: 'AI', - tags: ['deep learning', 'neural networks'] -}); - -// Close the connection when done -await brainySearch.close(); -``` - -## API Reference - -### BrainyServerSearch Class - -#### Constructor - -```javascript -const brainySearch = new BrainyServerSearch(serverUrl); -``` - -- `serverUrl` (string): WebSocket URL of the Brainy server - -#### Methods - -- `init()`: Initialize the local Brainy instance and connect to the server -- `searchServer(query, limit = 10)`: Search the server-hosted Brainy instance, store results locally, and return them -- `searchLocal(query, limit = 10)`: Search the local Brainy instance -- `searchCombined(query, limit = 10)`: Search both server and local instances, combine results, and store server results locally -- `add(data, metadata = {})`: Add data to both local and server instances -- `close()`: Close the connection to the server - -## Advanced Configuration - -### Custom Embedding Function - -You can customize the embedding function used by the local Brainy instance: - -```javascript -import { createSimpleEmbeddingFunction } from '@soulcraft/brainy'; - -// In your code, before calling init(): -brainySearch.setEmbeddingFunction(createSimpleEmbeddingFunction()); -``` - -### Persistent Storage - -To enable persistent storage for the local Brainy instance: - -```javascript -// In your code, before calling init(): -brainySearch.setStorageOptions({ - requestPersistentStorage: true -}); -``` - -## Troubleshooting - -### Connection Issues - -- Ensure the server is running and accessible -- Check that the WebSocket URL is correct -- Verify that your browser supports WebSockets -- Check for CORS issues if the server is on a different domain - -### Search Issues - -- Ensure the server has data to search -- Check that the query is not empty -- Verify that the server is properly configured for search - -## License - -MIT diff --git a/examples/browser-server-search/index.html b/examples/browser-server-search/index.html deleted file mode 100644 index 7b13a535..00000000 --- a/examples/browser-server-search/index.html +++ /dev/null @@ -1,254 +0,0 @@ - - - - - - Brainy Browser-Server Search Example - - - -
- Brainy Logo -

Brainy Browser-Server Search Example

-
- -

- This example demonstrates how to use Brainy in a browser, call a server-hosted version for search, - store the results locally, and then perform further searches against the local instance. -

- -
-

Server URL

- - -
- -
-

Search

- - - - -
- -
-

Add Data

- - -
- -
-

Results

-
Connect to a server to begin...
-
- -
- - - - - diff --git a/examples/browser-server-search/index.js b/examples/browser-server-search/index.js deleted file mode 100644 index 05ba979a..00000000 --- a/examples/browser-server-search/index.js +++ /dev/null @@ -1,278 +0,0 @@ -// Browser-Server Search Example -// This example demonstrates how to use Brainy in a browser, call a server-hosted version for search, -// store the results locally, and then perform further searches against the local instance. - -import { - BrainyData, - augmentationPipeline, - createConduitAugmentation, - NounType -} from '@soulcraft/brainy'; - -/** - * BrainyServerSearch class - * Provides functionality to search a server-hosted Brainy instance and store results locally - */ -class BrainyServerSearch { - constructor(serverUrl) { - this.serverUrl = serverUrl; - this.localDb = null; - this.wsConduit = null; - this.connection = null; - this.isInitialized = false; - } - - /** - * Initialize the local Brainy instance and connect to the server - */ - async init() { - if (this.isInitialized) { - return; - } - - try { - // Initialize local Brainy instance - this.localDb = new BrainyData(); - await this.localDb.init(); - - // Create a WebSocket conduit augmentation - this.wsConduit = await createConduitAugmentation('websocket', 'server-search-conduit'); - - // Register the augmentation with the pipeline - augmentationPipeline.register(this.wsConduit); - - // Connect to the server - const connectionResult = await augmentationPipeline.executeConduitPipeline( - 'establishConnection', - [this.serverUrl, { protocols: 'brainy-sync' }] - ); - - if (connectionResult[0] && (await connectionResult[0]).success) { - this.connection = (await connectionResult[0]).data; - console.log('Connected to server:', this.serverUrl); - this.isInitialized = true; - } else { - throw new Error('Failed to connect to server'); - } - } catch (error) { - console.error('Failed to initialize BrainyServerSearch:', error); - throw error; - } - } - - /** - * Search the server-hosted Brainy instance, store results locally, and return them - * @param {string} query - The search query - * @param {number} limit - Maximum number of results to return - * @returns {Promise} - Search results - */ - async searchServer(query, limit = 10) { - await this.ensureInitialized(); - - try { - // Create a search request - const readResult = await augmentationPipeline.executeConduitPipeline( - 'readData', - [{ - connectionId: this.connection.connectionId, - query: { - type: 'search', - query: query, - limit: limit - } - }] - ); - - if (readResult[0] && (await readResult[0]).success) { - const searchResults = (await readResult[0]).data; - - // Store the results in the local Brainy instance - for (const result of searchResults) { - // Check if the noun already exists in the local database - const existingNoun = await this.localDb.get(result.id); - - if (!existingNoun) { - // Add the noun to the local database - await this.localDb.add(result.vector, result.metadata); - } - } - - return searchResults; - } else { - const error = readResult[0] ? (await readResult[0]).error : 'Unknown error'; - throw new Error(`Failed to search server: ${error}`); - } - } catch (error) { - console.error('Error searching server:', error); - throw error; - } - } - - /** - * Search the local Brainy instance - * @param {string} query - The search query - * @param {number} limit - Maximum number of results to return - * @returns {Promise} - Search results - */ - async searchLocal(query, limit = 10) { - await this.ensureInitialized(); - - try { - return await this.localDb.searchText(query, limit); - } catch (error) { - console.error('Error searching local database:', error); - throw error; - } - } - - /** - * Search both server and local instances, combine results, and store server results locally - * @param {string} query - The search query - * @param {number} limit - Maximum number of results to return - * @returns {Promise} - Combined search results - */ - async searchCombined(query, limit = 10) { - await this.ensureInitialized(); - - try { - // Search local first - const localResults = await this.searchLocal(query, limit); - - // If we have enough local results, return them - if (localResults.length >= limit) { - return localResults; - } - - // Otherwise, search server for additional results - const serverResults = await this.searchServer(query, limit - localResults.length); - - // Combine results, removing duplicates - const combinedResults = [...localResults]; - const localIds = new Set(localResults.map(r => r.id)); - - for (const result of serverResults) { - if (!localIds.has(result.id)) { - combinedResults.push(result); - } - } - - return combinedResults; - } catch (error) { - console.error('Error performing combined search:', error); - throw error; - } - } - - /** - * Add data to both local and server instances - * @param {string|Array} data - Text or vector to add - * @param {Object} metadata - Metadata for the data - * @returns {Promise} - ID of the added data - */ - async add(data, metadata = {}) { - await this.ensureInitialized(); - - try { - // Add to local first - const id = await this.localDb.add(data, metadata); - - // Get the vector and metadata - const noun = await this.localDb.get(id); - - // Add to server - await augmentationPipeline.executeConduitPipeline( - 'writeData', - [{ - connectionId: this.connection.connectionId, - data: { - type: 'addNoun', - vector: noun.vector, - metadata: noun.metadata - } - }] - ); - - return id; - } catch (error) { - console.error('Error adding data:', error); - throw error; - } - } - - /** - * Ensure the instance is initialized - */ - async ensureInitialized() { - if (!this.isInitialized) { - await this.init(); - } - } - - /** - * Close the connection to the server - */ - async close() { - if (this.connection) { - try { - await this.wsConduit.closeWebSocket(this.connection.connectionId); - this.connection = null; - } catch (error) { - console.error('Error closing connection:', error); - } - } - - this.isInitialized = false; - } -} - -// Example usage -async function runExample() { - // Create a BrainyServerSearch instance - const brainySearch = new BrainyServerSearch('wss://your-brainy-server.com/ws'); - - try { - // Initialize - await brainySearch.init(); - - // Search the server and store results locally - console.log('Searching server for "machine learning"...'); - const serverResults = await brainySearch.searchServer('machine learning', 5); - console.log('Server results:', serverResults); - - // Now search locally - this should return the results we just stored - console.log('Searching local database for "machine learning"...'); - const localResults = await brainySearch.searchLocal('machine learning', 5); - console.log('Local results:', localResults); - - // Search for something related but different - console.log('Searching local database for "artificial intelligence"...'); - const aiResults = await brainySearch.searchLocal('artificial intelligence', 5); - console.log('AI results:', aiResults); - - // Perform a combined search - console.log('Performing combined search for "neural networks"...'); - const combinedResults = await brainySearch.searchCombined('neural networks', 5); - console.log('Combined results:', combinedResults); - - // Add new data to both local and server - console.log('Adding new data...'); - const id = await brainySearch.add('Deep learning is a subset of machine learning', { - noun: NounType.Concept, - category: 'AI', - tags: ['deep learning', 'neural networks'] - }); - console.log('Added data with ID:', id); - - // Close the connection - await brainySearch.close(); - - } catch (error) { - console.error('Example failed:', error); - } -} - -// In a browser environment, you would call this when the page loads -// runExample(); - -// Export for use in other modules -export { BrainyServerSearch }; diff --git a/examples/buildTimeRegistration.js b/examples/buildTimeRegistration.js deleted file mode 100644 index 8891f0f8..00000000 --- a/examples/buildTimeRegistration.js +++ /dev/null @@ -1,184 +0,0 @@ -/** - * Example: Registering Augmentations at Build Time - * - * This example demonstrates how to register custom augmentations at build time - * using the Brainy library's augmentation registry system. - */ - -// Import the augmentation registry and types from Brainy -import { - registerAugmentation, - AugmentationType, - BrainyAugmentations -} from '../dist/index.js'; - -// Define a custom sense augmentation -class CustomTextSenseAugmentation { - constructor() { - this.name = 'CustomTextSenseAugmentation'; - this.enabled = true; - this.type = AugmentationType.SENSE; - } - - // Required IAugmentation methods - async initialize() { - console.log('Initializing CustomTextSenseAugmentation'); - return true; - } - - async shutDown() { - console.log('Shutting down CustomTextSenseAugmentation'); - return true; - } - - getStatus() { - return { - name: this.name, - enabled: this.enabled, - type: this.type, - status: 'ready' - }; - } - - // ISenseAugmentation methods - async processRawData(rawData, dataType) { - console.log(`Processing ${dataType} data: ${rawData.substring(0, 50)}...`); - - // Simple implementation to extract nouns and verbs - const words = rawData.split(' '); - const nouns = words.filter(word => word.length > 4); - const verbs = words.filter(word => word.endsWith('ing')); - - return { - success: true, - data: { nouns, verbs } - }; - } - - async listenToFeed(feedUrl, callback) { - console.log(`Listening to feed at ${feedUrl}`); - - // In a real implementation, this would set up a listener - // For this example, we'll just call the callback once - setTimeout(() => { - callback({ - success: true, - data: { message: 'Feed update received' } - }); - }, 1000); - - return { - success: true, - data: { feedId: 'example-feed-1' } - }; - } -} - -// Define a custom memory augmentation -class CustomMemoryAugmentation { - constructor() { - this.name = 'CustomMemoryAugmentation'; - this.enabled = true; - this.type = AugmentationType.MEMORY; - this.storage = new Map(); - } - - // Required IAugmentation methods - async initialize() { - console.log('Initializing CustomMemoryAugmentation'); - return true; - } - - async shutDown() { - console.log('Shutting down CustomMemoryAugmentation'); - this.storage.clear(); - return true; - } - - getStatus() { - return { - name: this.name, - enabled: this.enabled, - type: this.type, - status: 'ready', - itemCount: this.storage.size - }; - } - - // IMemoryAugmentation methods - async storeData(key, data, options = {}) { - console.log(`Storing data with key: ${key}`); - this.storage.set(key, data); - - return { - success: true, - data: { key } - }; - } - - async retrieveData(key, options = {}) { - console.log(`Retrieving data with key: ${key}`); - const data = this.storage.get(key); - - return { - success: !!data, - data: data || null, - error: !data ? 'Key not found' : undefined - }; - } - - async updateData(key, data, options = {}) { - console.log(`Updating data with key: ${key}`); - - if (!this.storage.has(key)) { - return { - success: false, - data: null, - error: 'Key not found' - }; - } - - this.storage.set(key, data); - - return { - success: true, - data: { key } - }; - } - - async deleteData(key, options = {}) { - console.log(`Deleting data with key: ${key}`); - - const existed = this.storage.has(key); - this.storage.delete(key); - - return { - success: existed, - data: { deleted: existed }, - error: !existed ? 'Key not found' : undefined - }; - } - - async listDataKeys(pattern = '*', options = {}) { - console.log(`Listing data keys with pattern: ${pattern}`); - - // Simple implementation that returns all keys - // A real implementation would filter by pattern - const keys = Array.from(this.storage.keys()); - - return { - success: true, - data: { keys } - }; - } -} - -// Register the augmentations with the registry -// This will make them available to the Brainy library at runtime -const textSenseAugmentation = registerAugmentation(new CustomTextSenseAugmentation()); -const memoryAugmentation = registerAugmentation(new CustomMemoryAugmentation()); - -console.log('Custom augmentations registered successfully'); - -// Export the registered augmentations for use in the application -export { textSenseAugmentation, memoryAugmentation }; diff --git a/examples/conduitAugmentationExample.js b/examples/conduitAugmentationExample.js deleted file mode 100644 index b0c8e739..00000000 --- a/examples/conduitAugmentationExample.js +++ /dev/null @@ -1,236 +0,0 @@ -/** - * Conduit Augmentation Example - * - * This example demonstrates how to use the conduit augmentations to sync Brainy instances: - * - * - WebSocket Conduit: For syncing between browsers and servers, or between servers. - * WebSockets cannot be used for direct browser-to-browser communication without a server in the middle. - * - * - WebRTC Conduit: For direct peer-to-peer syncing between browsers. - * This is the recommended approach for browser-to-browser communication. - */ - -import { - BrainyData, - augmentationPipeline, - createConduitAugmentation, - NounType, - VerbType -} from '@soulcraft/brainy'; - -/** - * Example of using WebSocket conduit augmentation to sync Brainy instances - */ -async function webSocketSyncExample() { - console.log('Starting WebSocket sync example...'); - - // Create and initialize the database - const db = new BrainyData(); - await db.init(); - - // Create a WebSocket conduit augmentation - const wsConduit = await createConduitAugmentation('websocket', 'websocket-sync-example'); - - // Register the augmentation with the pipeline - augmentationPipeline.register(wsConduit); - - // Add some data to the local database - const catId = await db.add("Cats are independent pets", { - noun: NounType.Thing, - category: 'animal' - }); - - const dogId = await db.add("Dogs are loyal companions", { - noun: NounType.Thing, - category: 'animal' - }); - - // Add a relationship between items - await db.addVerb(catId, dogId, undefined, { - type: VerbType.RelatedTo, - metadata: { - description: 'Both are common household pets' - } - }); - - console.log('Added sample data to local database'); - - try { - // Connect to another Brainy instance (server or browser) - // Note: You need to have a WebSocket server running at this URL - const connectionResult = await augmentationPipeline.executeConduitPipeline( - 'establishConnection', - ['wss://your-websocket-server.com/brainy-sync', { protocols: 'brainy-sync' }] - ); - - if (connectionResult[0] && (await connectionResult[0]).success) { - const connection = (await connectionResult[0]).data; - console.log('Connected to remote Brainy instance:', connection.url); - - // Read data from the remote instance - const readResult = await augmentationPipeline.executeConduitPipeline( - 'readData', - [{ connectionId: connection.connectionId, query: { type: 'getAllNouns' } }] - ); - - // Process and add the received data to the local instance - if (readResult[0] && (await readResult[0]).success) { - const remoteNouns = (await readResult[0]).data; - console.log(`Received ${remoteNouns.length} nouns from remote instance`); - - for (const noun of remoteNouns) { - await db.add(noun.vector, noun.metadata); - } - - console.log('Added remote nouns to local database'); - } - - // Set up real-time sync by monitoring the stream - await wsConduit.monitorStream(connection.connectionId, async (data) => { - console.log('Received data from stream:', data.type); - - // Handle incoming data (e.g., new nouns, verbs, updates) - if (data.type === 'newNoun') { - await db.add(data.vector, data.metadata); - console.log('Added new noun from remote instance:', data.id); - } else if (data.type === 'newVerb') { - await db.addVerb(data.sourceId, data.targetId, data.vector, data.options); - console.log('Added new verb from remote instance:', data.id); - } - }); - - // Add a new noun and send it to the remote instance - const birdId = await db.add("Birds are fascinating creatures", { - noun: NounType.Thing, - category: 'animal' - }); - - const birdData = await db.get(birdId); - - // Send the new noun to the remote instance - await augmentationPipeline.executeConduitPipeline( - 'writeData', - [ - { - connectionId: connection.connectionId, - data: { - type: 'newNoun', - id: birdId, - vector: birdData.vector, - metadata: birdData.metadata - } - } - ] - ); - - console.log('Sent new noun to remote instance:', birdId); - - // Close the connection when done - await wsConduit.closeWebSocket(connection.connectionId); - console.log('Closed connection to remote instance'); - } else { - console.error('Failed to connect to remote instance'); - } - } catch (error) { - console.error('Error in WebSocket sync example:', error); - } -} - -/** - * Example of using WebRTC conduit augmentation for peer-to-peer sync - */ -async function webRTCSyncExample() { - console.log('Starting WebRTC sync example...'); - - // Create and initialize the database - const db = new BrainyData(); - await db.init(); - - // Create a WebRTC conduit augmentation - const webrtcConduit = await createConduitAugmentation('webrtc', 'webrtc-sync-example'); - - // Register the augmentation with the pipeline - augmentationPipeline.register(webrtcConduit); - - try { - // Connect to a peer using a signaling server - // Note: You need to have a signaling server running and another peer to connect to - const connectionResult = await augmentationPipeline.executeConduitPipeline( - 'establishConnection', - [ - 'peer-id-to-connect-to', - { - signalServerUrl: 'wss://your-signal-server.com', - localPeerId: 'my-peer-id', - iceServers: [{ urls: 'stun:stun.l.google.com:19302' }] - } - ] - ); - - if (connectionResult[0] && (await connectionResult[0]).success) { - const connection = (await connectionResult[0]).data; - console.log('Connected to peer:', connection.url); - - // Set up real-time sync by monitoring the stream - await webrtcConduit.monitorStream(connection.connectionId, async (data) => { - console.log('Received data from peer:', data.type); - - // Handle incoming data (e.g., new nouns, verbs, updates) - if (data.type === 'newNoun') { - await db.add(data.vector, data.metadata); - console.log('Added new noun from peer:', data.id); - } else if (data.type === 'newVerb') { - await db.addVerb(data.sourceId, data.targetId, data.vector, data.options); - console.log('Added new verb from peer:', data.id); - } - }); - - // Add a new noun and send it to the peer - const fishId = await db.add("Fish are aquatic animals", { - noun: NounType.Thing, - category: 'animal' - }); - - const fishData = await db.get(fishId); - - // Send the new noun to the peer - await augmentationPipeline.executeConduitPipeline( - 'writeData', - [ - { - connectionId: connection.connectionId, - data: { - type: 'newNoun', - id: fishId, - vector: fishData.vector, - metadata: fishData.metadata - } - } - ] - ); - - console.log('Sent new noun to peer:', fishId); - - // Close the connection when done - await webrtcConduit.closeWebSocket(connection.connectionId); - console.log('Closed connection to peer'); - } else { - console.error('Failed to connect to peer'); - } - } catch (error) { - console.error('Error in WebRTC sync example:', error); - } -} - -// Run the examples -async function runExamples() { - try { - await webSocketSyncExample(); - console.log('\n-----------------------------------\n'); - await webRTCSyncExample(); - } catch (error) { - console.error('Error running examples:', error); - } -} - -runExamples(); diff --git a/examples/configurationTest.js b/examples/configurationTest.js deleted file mode 100644 index c998e74f..00000000 --- a/examples/configurationTest.js +++ /dev/null @@ -1,74 +0,0 @@ -// Configuration Test Script -// This script tests the automatic configuration detection features of the library - -const { BrainyData } = require('../dist/index.js'); - -async function testDefaultConfiguration() { - console.log('Testing default configuration...'); - - // Create a database with no configuration - const db = new BrainyData(); - await db.init(); - - // Add a test vector - const id = await db.add('This is a test vector', { test: true }); - console.log(`Added test vector with ID: ${id}`); - - // Get the vector back - const vector = await db.get(id); - console.log('Retrieved vector:', vector.metadata); - - // Get storage status - const status = await db.status(); - console.log('Storage status:', status); - - // Clean up - await db.clear(); - console.log('Database cleared'); - - console.log('Default configuration test completed successfully!'); -} - -async function testStorageConfiguration() { - console.log('\nTesting storage configuration...'); - - // Create a database with storage configuration - const db = new BrainyData({ - storage: { - // Force in-memory storage for testing - forceMemoryStorage: true - } - }); - await db.init(); - - // Add a test vector - const id = await db.add('This is a test vector with storage config', { test: true }); - console.log(`Added test vector with ID: ${id}`); - - // Get the vector back - const vector = await db.get(id); - console.log('Retrieved vector:', vector.metadata); - - // Get storage status - const status = await db.status(); - console.log('Storage status:', status); - - // Clean up - await db.clear(); - console.log('Database cleared'); - - console.log('Storage configuration test completed successfully!'); -} - -async function runTests() { - try { - await testDefaultConfiguration(); - await testStorageConfiguration(); - console.log('\nAll tests completed successfully!'); - } catch (error) { - console.error('Error running tests:', error); - } -} - -// Run the tests -runTests(); diff --git a/examples/dataInspectionExample.js b/examples/dataInspectionExample.js deleted file mode 100644 index d328c54b..00000000 --- a/examples/dataInspectionExample.js +++ /dev/null @@ -1,145 +0,0 @@ -/** - * Data Inspection Example - * - * This example demonstrates how to view and inspect the data stored in Brainy - * to verify it's working correctly. - */ - -import { BrainyData, createSimpleEmbeddingFunction } from '../dist/index.js'; - -async function runExample() { - try { - console.log('Brainy Data Inspection Example'); - console.log('==============================\n'); - - // Create a new Brainy database with a simple embedding function - console.log('Creating and initializing Brainy database...'); - const simpleEmbedding = createSimpleEmbeddingFunction(); - const db = new BrainyData({ - embeddingFunction: simpleEmbedding - }); - await db.init(); - console.log('Database initialized successfully!\n'); - - // Add sample data - using text that will be automatically embedded to vectors - console.log('Adding sample data to the database...'); - const catId = await db.add("Cat is a small domesticated carnivorous mammal", { type: 'mammal', name: 'cat' }); - const dogId = await db.add("Dog is a domesticated carnivore of the family Canidae", { type: 'mammal', name: 'dog' }); - const fishId = await db.add("Fish are aquatic animals that live in water", { type: 'fish', name: 'fish' }); - - // Add more text data - const lionDescId = await db.add("Lions are large cats with a golden mane", { type: 'mammal', name: 'lion' }); - const tigerDescId = await db.add("Tigers are large cats with striped fur", { type: 'mammal', name: 'tiger' }); - - // Add an edge between cat and lion (they're related) - const edgeId = await db.addEdge(catId, lionDescId, undefined, { - type: 'related', - weight: 0.8, - metadata: { relationship: 'same family' } - }); - - console.log('Sample data added successfully!\n'); - - // Method 1: Check database status - console.log('Method 1: Check Database Status'); - console.log('-------------------------------'); - const status = await db.status(); - console.log('Storage Type:', status.type); - console.log('Used Space:', status.used, 'bytes'); - console.log('Storage Quota:', status.quota, 'bytes'); - console.log('Number of Items:', db.size()); - console.log('Additional Details:', JSON.stringify(status.details, null, 2)); - console.log(); - - // Method 2: Retrieve specific items by ID - console.log('Method 2: Retrieve Specific Items by ID'); - console.log('--------------------------------------'); - const cat = await db.get(catId); - console.log('Cat Item:'); - console.log('- ID:', cat.id); - console.log('- Vector:', cat.vector); - console.log('- Metadata:', JSON.stringify(cat.metadata, null, 2)); - console.log(); - - // Method 3: Search for similar items - console.log('Method 3: Search for Similar Items'); - console.log('----------------------------------'); - const searchResults = await db.search("cat", 3); - console.log('Search Results:'); - searchResults.forEach((result, index) => { - console.log(`Result ${index + 1}:`); - console.log('- ID:', result.id); - console.log('- Score:', result.score); - console.log('- Metadata:', JSON.stringify(result.metadata, null, 2)); - }); - console.log(); - - // Method 4: Text search - console.log('Method 4: Text Search'); - console.log('--------------------'); - const textResults = await db.searchText('cat', 2); - console.log('Text Search Results:'); - textResults.forEach((result, index) => { - console.log(`Result ${index + 1}:`); - console.log('- ID:', result.id); - console.log('- Score:', result.score); - console.log('- Metadata:', JSON.stringify(result.metadata, null, 2)); - }); - console.log(); - - // Method 5: Get all edges - console.log('Method 5: Get All Edges'); - console.log('----------------------'); - const allEdges = await db.getAllEdges(); - console.log('All Edges:'); - allEdges.forEach((edge, index) => { - console.log(`Edge ${index + 1}:`); - console.log('- ID:', edge.id); - console.log('- Source ID:', edge.sourceId); - console.log('- Target ID:', edge.targetId); - console.log('- Type:', edge.type); - console.log('- Weight:', edge.weight); - console.log('- Metadata:', JSON.stringify(edge.metadata, null, 2)); - }); - console.log(); - - // Method 6: Get edges by source - console.log('Method 6: Get Edges by Source'); - console.log('----------------------------'); - const catEdges = await db.getEdgesBySource(catId); - console.log(`Edges from Cat (${catId}):`); - catEdges.forEach((edge, index) => { - console.log(`Edge ${index + 1}:`); - console.log('- ID:', edge.id); - console.log('- Target ID:', edge.targetId); - console.log('- Type:', edge.type); - }); - console.log(); - - // Method 7: Advanced search with noun types and verbs - console.log('Method 7: Advanced Search with Noun Types and Verbs'); - console.log('--------------------------------------------------'); - const advancedResults = await db.search("cat", 3, { - nounTypes: ['mammal'], - includeVerbs: true - }); - console.log('Advanced Search Results:'); - advancedResults.forEach((result, index) => { - console.log(`Result ${index + 1}:`); - console.log('- ID:', result.id); - console.log('- Score:', result.score); - console.log('- Metadata:', JSON.stringify(result.metadata, null, 2)); - if (result.metadata && result.metadata.associatedVerbs) { - console.log('- Associated Verbs:', result.metadata.associatedVerbs.length); - } - }); - console.log(); - - console.log('Example completed successfully!'); - } catch (error) { - console.error('Error running example:', error); - } -} - -// Run the example -runExample(); diff --git a/examples/import-graphTypes.js b/examples/import-graphTypes.js deleted file mode 100644 index beebac0f..00000000 --- a/examples/import-graphTypes.js +++ /dev/null @@ -1,24 +0,0 @@ -// Example of importing only the graphTypes module -import { GraphNoun, GraphVerb, NounType, VerbType } from '@soulcraft/brainy/types/graphTypes'; - -// This demonstrates that we can import just the graphTypes -// without importing the rest of the library -console.log('Successfully imported graphTypes'); - -// Example usage of the imported types -const exampleNoun = { - id: '123', - createdBy: { - augmentation: 'test', - version: '1.0', - model: 'test-model', - modelVersion: '1.0' - }, - noun: NounType.Person, - createdAt: { seconds: Date.now() / 1000, nanoseconds: 0 }, - updatedAt: { seconds: Date.now() / 1000, nanoseconds: 0 } -}; - -console.log('Example noun type:', exampleNoun.noun); -console.log('Available noun types:', Object.values(NounType)); -console.log('Available verb types:', Object.values(VerbType)); diff --git a/examples/llmAugmentationExample.js b/examples/llmAugmentationExample.js deleted file mode 100644 index 0848a235..00000000 --- a/examples/llmAugmentationExample.js +++ /dev/null @@ -1,205 +0,0 @@ -/** - * LLM Augmentation Example - * - * This example demonstrates how to use the LLM augmentation to create, train, test, - * export, and deploy an LLM model from the data in Brainy (nouns and verbs). - */ - -import { BrainyData, augmentationPipeline } from '@soulcraft/brainy' -import { createLLMAugmentations } from '@soulcraft/brainy/src/augmentations/llmAugmentations.js' - -// Main function to run the example -async function runLLMExample() { - console.log('Starting LLM Augmentation Example') - - try { - // Initialize Brainy - const db = new BrainyData() - await db.init() - - // Add some sample data if the database is empty - await populateSampleData(db) - - // Create LLM augmentations - const { cognition, activation } = await createLLMAugmentations({ - cognitionName: 'my-llm-cognition', - activationName: 'my-llm-activation', - brainyDb: db - }) - - // Register augmentations with the pipeline - augmentationPipeline.register(cognition) - augmentationPipeline.register(activation) - - console.log('LLM augmentations registered successfully') - - // Create a simple LLM model - const createModelResult = await cognition.createModel({ - name: 'my-first-llm', - description: 'A simple LLM model trained on Brainy data', - modelType: 'simple', - vocabSize: 5000, - embeddingDim: 64, - hiddenDim: 128, - numLayers: 1, - maxSequenceLength: 50, - epochs: 5 - }) - - if (!createModelResult.success) { - throw new Error(`Failed to create model: ${createModelResult.error}`) - } - - const { modelId } = createModelResult.data - console.log(`Created model with ID: ${modelId}`) - - // Train the model - console.log('Training model...') - const trainResult = await cognition.trainModel(modelId, { - maxSamples: 100, - validationSplit: 0.2, - earlyStoppingPatience: 2 - }) - - if (!trainResult.success) { - throw new Error(`Failed to train model: ${trainResult.error}`) - } - - console.log('Model trained successfully') - console.log('Training metrics:', trainResult.data.metadata.performance) - - // Test the model - console.log('Testing model...') - const testResult = await cognition.testModel(modelId, { - testSize: 20, - generateSamples: true, - sampleCount: 3 - }) - - if (!testResult.success) { - throw new Error(`Failed to test model: ${testResult.error}`) - } - - console.log('Model tested successfully') - console.log('Test metrics:', testResult.data.metrics) - - if (testResult.data.samples) { - console.log('Sample predictions:') - for (const sample of testResult.data.samples) { - console.log(`Input: "${sample.input}"`) - console.log(`Expected: "${sample.expected}"`) - console.log(`Generated: "${sample.generated}"`) - console.log('---') - } - } - - // Generate text with the model - console.log('Generating text...') - const generateResult = await cognition.generateText(modelId, 'What is a', { - temperature: 0.7, - topK: 5 - }) - - if (generateResult.success) { - console.log(`Generated text: "${generateResult.data}"`) - } else { - console.error(`Failed to generate text: ${generateResult.error}`) - } - - // Export the model - console.log('Exporting model...') - const exportResult = await cognition.exportModel(modelId, { - format: 'json', - includeMetadata: true, - includeVocab: true - }) - - if (!exportResult.success) { - throw new Error(`Failed to export model: ${exportResult.error}`) - } - - console.log(`Model exported in ${exportResult.data.format} format`) - - // Deploy the model (browser example) - console.log('Deploying model to browser...') - const deployResult = await cognition.deployModel(modelId, { - target: 'browser' - }) - - if (!deployResult.success) { - throw new Error(`Failed to deploy model: ${deployResult.error}`) - } - - console.log(`Model deployed to ${deployResult.data.deploymentTarget}`) - console.log(`Deployment status: ${deployResult.data.status}`) - - // Using the activation augmentation through the pipeline - console.log('Using activation augmentation through pipeline...') - - // Create a new model through the pipeline - const pipelineCreateResult = await augmentationPipeline.executeCognitionPipeline( - 'createModel', - [{ - name: 'pipeline-llm', - modelType: 'transformer', - numHeads: 2, - numLayers: 1 - }] - ) - - if (pipelineCreateResult[0] && (await pipelineCreateResult[0]).success) { - const pipelineModelId = (await pipelineCreateResult[0]).data.modelId - console.log(`Created model through pipeline with ID: ${pipelineModelId}`) - - // Train the model through the pipeline - const pipelineTrainResult = await augmentationPipeline.executeCognitionPipeline( - 'trainModel', - [pipelineModelId, { maxSamples: 50 }] - ) - - if (pipelineTrainResult[0] && (await pipelineTrainResult[0]).success) { - console.log('Model trained through pipeline successfully') - } - } - - console.log('LLM Augmentation Example completed successfully') - } catch (error) { - console.error('Error in LLM Augmentation Example:', error) - } -} - -// Helper function to populate sample data -async function populateSampleData(db) { - const status = await db.status() - - // Only add sample data if the database is empty - if (status.nounCount === 0) { - console.log('Adding sample data to Brainy...') - - // Add some nouns (entities) - const cat = await db.add('Cats are independent pets', { noun: 'thing', category: 'animal' }) - const dog = await db.add('Dogs are loyal companions', { noun: 'thing', category: 'animal' }) - const house = await db.add('Houses provide shelter for people', { noun: 'place', category: 'building' }) - const john = await db.add('John is a software developer', { noun: 'person', category: 'professional' }) - const mary = await db.add('Mary is a data scientist', { noun: 'person', category: 'professional' }) - const coding = await db.add('Coding is the process of creating software', { noun: 'concept', category: 'technology' }) - const meeting = await db.add('Team meetings are held every Monday', { noun: 'event', category: 'work' }) - - // Add some verbs (relationships) - await db.addVerb(john, house, { verb: 'owns', description: 'John owns the house' }) - await db.addVerb(john, dog, { verb: 'owns', description: 'John owns a dog' }) - await db.addVerb(mary, cat, { verb: 'owns', description: 'Mary owns a cat' }) - await db.addVerb(john, coding, { verb: 'created', description: 'John created code' }) - await db.addVerb(mary, coding, { verb: 'created', description: 'Mary created code' }) - await db.addVerb(john, meeting, { verb: 'created', description: 'John organized the meeting' }) - await db.addVerb(mary, meeting, { verb: 'memberOf', description: 'Mary is part of the meeting' }) - await db.addVerb(john, mary, { verb: 'worksWith', description: 'John works with Mary' }) - - console.log('Sample data added successfully') - } else { - console.log('Database already contains data, skipping sample data creation') - } -} - -// Run the example -runLLMExample().catch(console.error) diff --git a/examples/memoryAugmentationExample.js b/examples/memoryAugmentationExample.js deleted file mode 100644 index ae36e447..00000000 --- a/examples/memoryAugmentationExample.js +++ /dev/null @@ -1,268 +0,0 @@ -/** - * Example: Using Memory Augmentations for Data Storage - * - * This example demonstrates how to use the different memory augmentation implementations - * for storing and retrieving data in Brainy. - * - * The example shows: - * 1. Using the default memory augmentation (auto-selected based on environment) - * 2. Using specific storage types (Memory, FileSystem, OPFS) - */ - -import { - registerAugmentation, - initializeAugmentationPipeline, - createMemoryAugmentation -} from '../dist/index.js' - -// Example 1: Using the default memory augmentation -async function useDefaultMemoryAugmentation() { - console.log('Setting up default memory augmentation...') - - // Create the memory augmentation with automatic storage selection - const memoryAug = await createMemoryAugmentation('brainy-default-memory') - - // Register the augmentation - registerAugmentation(memoryAug) - - // Initialize the augmentation pipeline - initializeAugmentationPipeline() - - // Initialize the augmentation - await memoryAug.initialize() - - console.log('Default memory augmentation initialized successfully') - console.log('Storage type:', await getStorageType(memoryAug)) - - // Store some data - await storeAndRetrieveData(memoryAug) - - return memoryAug -} - -// Example 2: Using in-memory storage explicitly -async function useInMemoryStorage() { - console.log('Setting up in-memory storage...') - - // Create the memory augmentation with in-memory storage - const memoryAug = await createMemoryAugmentation('brainy-memory-storage', { - storageType: 'memory' - }) - - // Register the augmentation - registerAugmentation(memoryAug) - - // Initialize the augmentation - await memoryAug.initialize() - - console.log('In-memory storage initialized successfully') - - // Store some data - await storeAndRetrieveData(memoryAug) - - return memoryAug -} - -// Example 3: Using file system storage (Node.js environments) -async function useFileSystemStorage() { - console.log('Setting up file system storage...') - - try { - // Create the memory augmentation with file system storage - const memoryAug = await createMemoryAugmentation('brainy-filesystem-storage', { - storageType: 'filesystem', - rootDirectory: './data' // Store data in a 'data' directory - }) - - // Register the augmentation - registerAugmentation(memoryAug) - - // Initialize the augmentation - await memoryAug.initialize() - - console.log('File system storage initialized successfully') - - // Store some data - await storeAndRetrieveData(memoryAug) - - return memoryAug - } catch (error) { - console.error('Failed to initialize file system storage:', error) - console.log('This might be because you are not in a Node.js environment') - return null - } -} - -// Example 4: Using OPFS storage (browser environments) -async function useOPFSStorage() { - console.log('Setting up OPFS storage...') - - try { - // Create the memory augmentation with OPFS storage - const memoryAug = await createMemoryAugmentation('brainy-opfs-storage', { - storageType: 'opfs', - requestPersistentStorage: true - }) - - // Register the augmentation - registerAugmentation(memoryAug) - - // Initialize the augmentation - await memoryAug.initialize() - - console.log('OPFS storage initialized successfully') - - // Store some data - await storeAndRetrieveData(memoryAug) - - return memoryAug - } catch (error) { - console.error('Failed to initialize OPFS storage:', error) - console.log('This might be because you are not in a browser environment or OPFS is not supported') - return null - } -} - -// Helper function to store and retrieve data -async function storeAndRetrieveData(memoryAug) { - console.log('Storing and retrieving data...') - - // Store data - const userData = { - name: 'John Doe', - email: 'john@example.com', - preferences: { - theme: 'dark', - fontSize: 14, - notifications: true - }, - // Add a vector for search testing - vector: [0.1, 0.2, 0.3, 0.4, 0.5] - } - - const storeResponse = await memoryAug.storeData('user-1', userData) - console.log('Store response:', storeResponse) - - // Store more data with vectors for search testing - await memoryAug.storeData('user-2', { - name: 'Jane Smith', - email: 'jane@example.com', - preferences: { - theme: 'light', - fontSize: 16, - notifications: false - }, - vector: [0.2, 0.3, 0.4, 0.5, 0.6] - }) - - await memoryAug.storeData('user-3', { - name: 'Bob Johnson', - email: 'bob@example.com', - preferences: { - theme: 'dark', - fontSize: 12, - notifications: true - }, - vector: [0.3, 0.4, 0.5, 0.6, 0.7] - }) - - // Retrieve data - const retrieveResponse = await memoryAug.retrieveData('user-1') - console.log('Retrieve response:', retrieveResponse) - - // Update data - const updateResponse = await memoryAug.updateData('user-1', { - ...userData, - preferences: { - ...userData.preferences, - theme: 'light' - } - }) - console.log('Update response:', updateResponse) - - // Retrieve updated data - const retrieveUpdatedResponse = await memoryAug.retrieveData('user-1') - console.log('Retrieved updated data:', retrieveUpdatedResponse) - - // Test search functionality - await searchData(memoryAug) - - // Delete data - const deleteResponse = await memoryAug.deleteData('user-1') - console.log('Delete response:', deleteResponse) - await memoryAug.deleteData('user-2') - await memoryAug.deleteData('user-3') - - // Verify deletion - const retrieveAfterDeleteResponse = await memoryAug.retrieveData('user-1') - console.log('Retrieve after delete response:', retrieveAfterDeleteResponse) -} - -// Helper function to test search functionality -async function searchData(memoryAug) { - console.log('\nTesting search functionality...') - - // Create a query vector - const queryVector = [0.2, 0.3, 0.4, 0.5, 0.6] - - try { - // Search for similar vectors - console.log('Searching for similar vectors...') - const searchResponse = await memoryAug.search(queryVector, 2) - - if (searchResponse.success) { - console.log('Search results:') - for (const result of searchResponse.data) { - console.log(`- ID: ${result.id}, Score: ${result.score.toFixed(4)}`) - if (result.data) { - console.log(` Name: ${result.data.name}, Email: ${result.data.email}`) - } - } - } else { - console.error('Search failed:', searchResponse.error) - } - } catch (error) { - console.error('Error during search:', error) - } -} - -// Helper function to get storage type -async function getStorageType(memoryAug) { - // This is a bit of a hack to determine the storage type - // In a real application, you might want to add a method to the augmentation - // to return the storage type directly - const constructorName = memoryAug.constructor.name - return constructorName -} - -// Run the examples -async function runExamples() { - console.log('Running memory augmentation examples...') - - // Example 1: Default memory augmentation - const defaultMemory = await useDefaultMemoryAugmentation() - await defaultMemory.shutDown() - - // Example 2: In-memory storage - const inMemoryStorage = await useInMemoryStorage() - await inMemoryStorage.shutDown() - - // Example 3: File system storage - const fileSystemStorage = await useFileSystemStorage() - if (fileSystemStorage) { - await fileSystemStorage.shutDown() - } - - // Example 4: OPFS storage - const opfsStorage = await useOPFSStorage() - if (opfsStorage) { - await opfsStorage.shutDown() - } - - console.log('All examples completed') -} - -// Run the examples -runExamples().catch(error => { - console.error('Error running examples:', error) -}) diff --git a/examples/readOnlyTest.js b/examples/readOnlyTest.js deleted file mode 100644 index d5541bbd..00000000 --- a/examples/readOnlyTest.js +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Read-Only Mode Test - * - * This example demonstrates how to use the read-only mode feature of BrainyData. - */ - -import { BrainyData } from '../dist/index.js'; - -async function testReadOnlyMode() { - console.log('Testing read-only mode...'); - - // Test 1: Create a database in read-only mode - console.log('\nTest 1: Create a database in read-only mode'); - const readOnlyDb = new BrainyData({ readOnly: true }); - await readOnlyDb.init(); - - console.log('Database initialized in read-only mode'); - console.log('Is read-only:', readOnlyDb.isReadOnly()); - - // Try to add data (should throw an error) - try { - console.log('Attempting to add data to read-only database...'); - await readOnlyDb.add([0.1, 0.2, 0.3], { name: 'test' }); - console.log('ERROR: Add operation succeeded but should have failed!'); - } catch (error) { - console.log('Expected error caught:', error.message); - } - - // Test 2: Toggle read-only mode at runtime - console.log('\nTest 2: Toggle read-only mode at runtime'); - const db = new BrainyData(); - await db.init(); - - console.log('Database initialized in writable mode'); - console.log('Is read-only:', db.isReadOnly()); - - // Add data while writable - console.log('Adding data while writable...'); - const itemId = await db.add([0.1, 0.2, 0.3], { name: 'test' }); - console.log('Added item with ID:', itemId); - - // Set to read-only mode - console.log('Setting database to read-only mode'); - db.setReadOnly(true); - console.log('Is read-only:', db.isReadOnly()); - - // Try to delete data (should throw an error) - try { - console.log('Attempting to delete data from read-only database...'); - await db.delete(itemId); - console.log('ERROR: Delete operation succeeded but should have failed!'); - } catch (error) { - console.log('Expected error caught:', error.message); - } - - // Set back to writable mode - console.log('Setting database back to writable mode'); - db.setReadOnly(false); - console.log('Is read-only:', db.isReadOnly()); - - // Delete data (should succeed) - console.log('Deleting data while writable...'); - const deleteResult = await db.delete(itemId); - console.log('Delete result:', deleteResult); - - console.log('\nAll tests completed successfully!'); -} - -// Run the tests -testReadOnlyMode().catch(error => { - console.error('Test failed:', error); -}); diff --git a/examples/rollup.config.js b/examples/rollup.config.js deleted file mode 100644 index 0dbc972e..00000000 --- a/examples/rollup.config.js +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Example rollup configuration for using the Brainy augmentation registry - * - * This example shows how to configure rollup to automatically discover and register - * augmentations at build time. - */ - -import resolve from '@rollup/plugin-node-resolve'; -import commonjs from '@rollup/plugin-commonjs'; -import typescript from '@rollup/plugin-typescript'; -import { createAugmentationRegistryRollupPlugin } from '../dist/index.js'; - -export default { - // Entry point for the application - input: 'src/index.js', - - // Output configuration - output: { - file: 'dist/bundle.js', - format: 'esm', - sourcemap: true - }, - - // Plugins - plugins: [ - // Resolve node modules - resolve(), - - // Convert CommonJS modules to ES6 - commonjs(), - - // Process TypeScript files - typescript(), - - // Augmentation Registry Plugin - // This plugin will automatically discover and register augmentations - // from files that match the specified pattern - createAugmentationRegistryRollupPlugin({ - // Pattern to match files containing augmentations - // This will match any file ending with 'augmentation.js' or 'augmentation.ts' - pattern: /augmentation\.(js|ts)$/, - - // Options for the loader - options: { - // Automatically initialize augmentations after loading - autoInitialize: true, - - // Log debug information during loading - debug: true - } - }) - ], - - // External dependencies that should not be bundled - external: [ - 'brainy' - ] -}; diff --git a/examples/sequentialPipelineExample.js b/examples/sequentialPipelineExample.js deleted file mode 100644 index a08d2e80..00000000 --- a/examples/sequentialPipelineExample.js +++ /dev/null @@ -1,235 +0,0 @@ -/** - * Sequential Pipeline Example - * - * This example demonstrates how to use the sequential pipeline to process data - * through a sequence of augmentations: ISense -> IMemory -> ICognition -> IConduit -> IActivation -> IPerception - */ - -import { - sequentialPipeline, - registerAugmentation, - initializeAugmentationPipeline, - createMemoryAugmentation -} from '../dist/index.js'; - -// Create a simple ISense augmentation -const senseAugmentation = { - name: 'SimpleSense', - description: 'A simple sense augmentation for testing', - enabled: true, - - async initialize() {}, - async shutDown() {}, - async getStatus() { return 'active'; }, - - processRawData(rawData, dataType) { - console.log(`[SimpleSense] Processing ${dataType} data: ${rawData}`); - return { - success: true, - data: { - nouns: ['example', 'test', 'data'], - verbs: ['process', 'analyze', 'test'] - } - }; - }, - - async listenToFeed(feedUrl, callback) { - console.log(`[SimpleSense] Listening to feed: ${feedUrl}`); - } -}; - -// Create a simple ICognition augmentation -const cognitionAugmentation = { - name: 'SimpleCognition', - description: 'A simple cognition augmentation for testing', - enabled: true, - - async initialize() {}, - async shutDown() {}, - async getStatus() { return 'active'; }, - - reason(query, context) { - console.log(`[SimpleCognition] Reasoning about: ${query}`); - console.log(`[SimpleCognition] Context:`, context); - return { - success: true, - data: { - inference: 'This is test data that needs to be processed', - confidence: 0.85 - } - }; - }, - - infer(dataSubset) { - return { - success: true, - data: { result: 'inferred data' } - }; - }, - - executeLogic(ruleId, input) { - return { - success: true, - data: true - }; - } -}; - -// Create a simple IConduit augmentation -const conduitAugmentation = { - name: 'SimpleConduit', - description: 'A simple conduit augmentation for testing', - enabled: true, - - async initialize() {}, - async shutDown() {}, - async getStatus() { return 'active'; }, - - establishConnection(targetSystemId, config) { - console.log(`[SimpleConduit] Establishing connection to: ${targetSystemId}`); - return { - success: true, - data: { connectionId: 'test-connection' } - }; - }, - - readData(query, options) { - return { - success: true, - data: { result: 'read data' } - }; - }, - - writeData(data, options) { - console.log(`[SimpleConduit] Writing data:`, data); - return { - success: true, - data: { written: true } - }; - }, - - async monitorStream(streamId, callback) { - console.log(`[SimpleConduit] Monitoring stream: ${streamId}`); - } -}; - -// Create a simple IActivation augmentation -const activationAugmentation = { - name: 'SimpleActivation', - description: 'A simple activation augmentation for testing', - enabled: true, - - async initialize() {}, - async shutDown() {}, - async getStatus() { return 'active'; }, - - triggerAction(actionName, parameters) { - console.log(`[SimpleActivation] Triggering action: ${actionName}`); - console.log(`[SimpleActivation] Parameters:`, parameters); - return { - success: true, - data: { triggered: true } - }; - }, - - generateOutput(knowledgeId, format) { - return { - success: true, - data: 'Generated output' - }; - }, - - interactExternal(systemId, payload) { - return { - success: true, - data: { result: 'external interaction' } - }; - } -}; - -// Create a simple IPerception augmentation -const perceptionAugmentation = { - name: 'SimplePerception', - description: 'A simple perception augmentation for testing', - enabled: true, - - async initialize() {}, - async shutDown() {}, - async getStatus() { return 'active'; }, - - interpret(nouns, verbs, context) { - console.log(`[SimplePerception] Interpreting nouns:`, nouns); - console.log(`[SimplePerception] Interpreting verbs:`, verbs); - console.log(`[SimplePerception] Context:`, context); - return { - success: true, - data: { - interpretation: 'This is a test data sample that needs processing and analysis', - confidence: 0.9 - } - }; - }, - - organize(data, criteria) { - return { - success: true, - data: { organized: true } - }; - }, - - generateVisualization(data, visualizationType) { - return { - success: true, - data: 'Visualization data' - }; - } -}; - -async function runExample() { - try { - // Register augmentations - registerAugmentation(senseAugmentation); - registerAugmentation(cognitionAugmentation); - registerAugmentation(conduitAugmentation); - registerAugmentation(activationAugmentation); - registerAugmentation(perceptionAugmentation); - - // Create and register a memory augmentation - const memoryAugmentation = await createMemoryAugmentation('SimpleMemory', { storageType: 'memory' }); - registerAugmentation(memoryAugmentation); - - // Initialize the augmentation pipeline - initializeAugmentationPipeline(); - - // Initialize the sequential pipeline - await sequentialPipeline.initialize(); - - console.log('Processing data through the sequential pipeline...'); - - // Process data through the sequential pipeline - const result = await sequentialPipeline.processData( - 'This is a test message', - 'text' - ); - - console.log('\nPipeline execution result:'); - console.log('Success:', result.success); - console.log('Data:', result.data); - - if (result.error) { - console.log('Error:', result.error); - } - - console.log('\nStage results:'); - for (const stage in result.stageResults) { - console.log(`${stage}:`, result.stageResults[stage].success); - } - - console.log('\nExample completed successfully!'); - } catch (error) { - console.error('Error running example:', error); - } -} - -// Run the example -runExample(); diff --git a/examples/serverSearchAugmentationExample.js b/examples/serverSearchAugmentationExample.js deleted file mode 100644 index b24d5a02..00000000 --- a/examples/serverSearchAugmentationExample.js +++ /dev/null @@ -1,346 +0,0 @@ -/** - * Server Search Augmentation Example - * - * This example demonstrates how to use the ServerSearchConduitAugmentation and - * ServerSearchActivationAugmentation to search a server-hosted Brainy instance, - * store results locally, and perform further searches against the local instance. - */ - -import { - BrainyData, - augmentationPipeline, - AugmentationType, - NounType -} from '@soulcraft/brainy' - -// Import the server search augmentations -import { - ServerSearchConduitAugmentation, - ServerSearchActivationAugmentation, - createServerSearchAugmentations -} from '../src/augmentations/serverSearchAugmentations.js' - -/** - * Example 1: Using the factory function - * - * This is the simplest way to use the server search augmentations. - * The factory function creates both augmentations, links them together, - * and connects to the server. - */ -async function example1() { - console.log('Example 1: Using the factory function') - - try { - // Create the augmentations and connect to the server - const { conduit, activation, connection } = await createServerSearchAugmentations( - 'wss://your-brainy-server.com/ws', - { protocols: 'brainy-sync' } - ) - - // Register the augmentations with the pipeline - augmentationPipeline.register(conduit) - augmentationPipeline.register(activation) - - console.log('Connected to server with connection ID:', connection.connectionId) - - // Search the server and store results locally - console.log('Searching server for "machine learning"...') - const serverSearchResult = await conduit.searchServer( - connection.connectionId, - 'machine learning', - 5 - ) - - if (serverSearchResult.success) { - console.log('Server search results:', serverSearchResult.data) - } else { - console.error('Server search failed:', serverSearchResult.error) - } - - // Now search locally - this should return the results we just stored - console.log('Searching local database for "machine learning"...') - const localSearchResult = await conduit.searchLocal('machine learning', 5) - - if (localSearchResult.success) { - console.log('Local search results:', localSearchResult.data) - } else { - console.error('Local search failed:', localSearchResult.error) - } - - // Perform a combined search - console.log('Performing combined search for "neural networks"...') - const combinedSearchResult = await conduit.searchCombined( - connection.connectionId, - 'neural networks', - 5 - ) - - if (combinedSearchResult.success) { - console.log('Combined search results:', combinedSearchResult.data) - } else { - console.error('Combined search failed:', combinedSearchResult.error) - } - - // Add data to both local and server - console.log('Adding data to both local and server...') - const addResult = await conduit.addToBoth( - connection.connectionId, - 'Deep learning is a subset of machine learning', - { - noun: NounType.Concept, - category: 'AI', - tags: ['deep learning', 'neural networks'] - } - ) - - if (addResult.success) { - console.log('Added data with ID:', addResult.data) - } else { - console.error('Failed to add data:', addResult.error) - } - - } catch (error) { - console.error('Example 1 failed:', error) - } -} - -/** - * Example 2: Using the activation augmentation - * - * This example demonstrates how to use the activation augmentation - * to trigger actions related to server search. - */ -async function example2() { - console.log('\nExample 2: Using the activation augmentation') - - try { - // Create the augmentations and connect to the server - const { conduit, activation, connection } = await createServerSearchAugmentations( - 'wss://your-brainy-server.com/ws', - { protocols: 'brainy-sync' } - ) - - // Register the augmentations with the pipeline - augmentationPipeline.register(conduit) - augmentationPipeline.register(activation) - - console.log('Connected to server with connection ID:', connection.connectionId) - - // Use the activation augmentation to search the server - console.log('Using activation to search server for "machine learning"...') - const serverSearchAction = activation.triggerAction('searchServer', { - connectionId: connection.connectionId, - query: 'machine learning', - limit: 5 - }) - - if (serverSearchAction.success) { - // The data property contains a promise that will resolve to the search results - const serverSearchResult = await serverSearchAction.data - console.log('Server search results:', serverSearchResult) - } else { - console.error('Server search action failed:', serverSearchAction.error) - } - - // Use the activation augmentation to search locally - console.log('Using activation to search local database for "machine learning"...') - const localSearchAction = activation.triggerAction('searchLocal', { - query: 'machine learning', - limit: 5 - }) - - if (localSearchAction.success) { - const localSearchResult = await localSearchAction.data - console.log('Local search results:', localSearchResult) - } else { - console.error('Local search action failed:', localSearchAction.error) - } - - // Use the activation augmentation to perform a combined search - console.log('Using activation to perform combined search for "neural networks"...') - const combinedSearchAction = activation.triggerAction('searchCombined', { - connectionId: connection.connectionId, - query: 'neural networks', - limit: 5 - }) - - if (combinedSearchAction.success) { - const combinedSearchResult = await combinedSearchAction.data - console.log('Combined search results:', combinedSearchResult) - } else { - console.error('Combined search action failed:', combinedSearchAction.error) - } - - // Use the activation augmentation to add data to both local and server - console.log('Using activation to add data to both local and server...') - const addAction = activation.triggerAction('addToBoth', { - connectionId: connection.connectionId, - data: 'Deep learning is a subset of machine learning', - metadata: { - noun: NounType.Concept, - category: 'AI', - tags: ['deep learning', 'neural networks'] - } - }) - - if (addAction.success) { - const addResult = await addAction.data - console.log('Added data with ID:', addResult) - } else { - console.error('Add action failed:', addAction.error) - } - - } catch (error) { - console.error('Example 2 failed:', error) - } -} - -/** - * Example 3: Using the augmentation pipeline - * - * This example demonstrates how to use the augmentation pipeline - * to execute the conduit and activation augmentations. - */ -async function example3() { - console.log('\nExample 3: Using the augmentation pipeline') - - try { - // Create the augmentations and connect to the server - const { conduit, activation, connection } = await createServerSearchAugmentations( - 'wss://your-brainy-server.com/ws', - { protocols: 'brainy-sync' } - ) - - // Register the augmentations with the pipeline - augmentationPipeline.register(conduit) - augmentationPipeline.register(activation) - - console.log('Connected to server with connection ID:', connection.connectionId) - - // Use the augmentation pipeline to search the server - console.log('Using pipeline to search server...') - const conduitResults = await augmentationPipeline.executeConduitPipeline( - 'searchServer', - [connection.connectionId, 'machine learning', 5] - ) - - if (conduitResults.length > 0 && (await conduitResults[0]).success) { - console.log('Server search results:', (await conduitResults[0]).data) - } else { - console.error('Server search failed') - } - - // Use the augmentation pipeline to trigger the search action - console.log('Using pipeline to trigger search action...') - const activationResults = await augmentationPipeline.executeActivationPipeline( - 'triggerAction', - ['searchLocal', { query: 'machine learning', limit: 5 }] - ) - - if (activationResults.length > 0 && (await activationResults[0]).success) { - const actionResult = (await activationResults[0]).data - if (actionResult.success) { - const searchResult = await actionResult.data - console.log('Local search results:', searchResult) - } - } else { - console.error('Search action failed') - } - - } catch (error) { - console.error('Example 3 failed:', error) - } -} - -/** - * Example 4: Creating and using the augmentations manually - * - * This example demonstrates how to create and use the augmentations - * without using the factory function. - */ -async function example4() { - console.log('\nExample 4: Creating and using the augmentations manually') - - try { - // Create a local Brainy instance - const localDb = new BrainyData() - await localDb.init() - - // Create the conduit augmentation - const conduit = new ServerSearchConduitAugmentation('manual-server-search-conduit') - conduit.setLocalDb(localDb) - await conduit.initialize() - - // Create the activation augmentation - const activation = new ServerSearchActivationAugmentation('manual-server-search-activation') - activation.setConduitAugmentation(conduit) - await activation.initialize() - - // Register the augmentations with the pipeline - augmentationPipeline.register(conduit) - augmentationPipeline.register(activation) - - // Connect to the server - console.log('Connecting to server...') - const connectionResult = await conduit.establishConnection( - 'wss://your-brainy-server.com/ws', - { protocols: 'brainy-sync' } - ) - - if (!connectionResult.success || !connectionResult.data) { - throw new Error(`Failed to connect to server: ${connectionResult.error}`) - } - - const connection = connectionResult.data - console.log('Connected to server with connection ID:', connection.connectionId) - - // Store the connection in the activation augmentation - activation.storeConnection(connection.connectionId, connection) - - // Search the server - console.log('Searching server for "machine learning"...') - const serverSearchResult = await conduit.searchServer( - connection.connectionId, - 'machine learning', - 5 - ) - - if (serverSearchResult.success) { - console.log('Server search results:', serverSearchResult.data) - } else { - console.error('Server search failed:', serverSearchResult.error) - } - - } catch (error) { - console.error('Example 4 failed:', error) - } -} - -/** - * Run all examples - */ -async function runExamples() { - // Initialize the augmentation pipeline - await augmentationPipeline.initialize() - - // Run the examples - await example1() - await example2() - await example3() - await example4() - - // Shut down the augmentation pipeline - await augmentationPipeline.shutDown() -} - -// Run the examples -// runExamples().catch(console.error) - -// Export for use in other modules -export { - example1, - example2, - example3, - example4, - runExamples -} diff --git a/examples/webpack.config.js b/examples/webpack.config.js deleted file mode 100644 index 549238f1..00000000 --- a/examples/webpack.config.js +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Example webpack configuration for using the Brainy augmentation registry - * - * This example shows how to configure webpack to automatically discover and register - * augmentations at build time. - */ - -const path = require('path'); -const { createAugmentationRegistryPlugin } = require('../dist/index.js'); - -module.exports = { - // Entry point for the application - entry: './src/index.js', - - // Output configuration - output: { - path: path.resolve(__dirname, 'dist'), - filename: 'bundle.js', - }, - - // Module rules for processing different file types - module: { - rules: [ - // Process JavaScript files with babel - { - test: /\.js$/, - exclude: /node_modules/, - use: { - loader: 'babel-loader', - options: { - presets: ['@babel/preset-env'] - } - } - }, - - // Process TypeScript files - { - test: /\.ts$/, - exclude: /node_modules/, - use: { - loader: 'ts-loader' - } - } - ] - }, - - // Resolve file extensions - resolve: { - extensions: ['.js', '.ts'] - }, - - // Plugins - plugins: [ - // Augmentation Registry Plugin - // This plugin will automatically discover and register augmentations - // from files that match the specified pattern - createAugmentationRegistryPlugin({ - // Pattern to match files containing augmentations - // This will match any file ending with 'augmentation.js' or 'augmentation.ts' - pattern: /augmentation\.(js|ts)$/, - - // Options for the loader - options: { - // Automatically initialize augmentations after loading - autoInitialize: true, - - // Log debug information during loading - debug: true - } - }) - ], - - // Development server configuration - devServer: { - static: { - directory: path.join(__dirname, 'public'), - }, - compress: true, - port: 9000, - } -};