/** * 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 }