From 099b1920716f03c1fd20608a646459802dff47c6 Mon Sep 17 00:00:00 2001 From: David Snelling Date: Fri, 6 Jun 2025 10:49:29 -0700 Subject: [PATCH] feat: update server search augmentations and increment version to 0.7.6 --- .../serverSearchAugmentations.ts | 158 +++++++++--------- src/utils/version.ts | 2 +- 2 files changed, 80 insertions(+), 80 deletions(-) diff --git a/src/augmentations/serverSearchAugmentations.ts b/src/augmentations/serverSearchAugmentations.ts index 53537e22..84ef93fa 100644 --- a/src/augmentations/serverSearchAugmentations.ts +++ b/src/augmentations/serverSearchAugmentations.ts @@ -1,6 +1,6 @@ /** * Server Search Augmentations - * + * * This file implements conduit and activation augmentations for browser-server search functionality. * It allows Brainy to search a server-hosted instance and store results locally. */ @@ -19,18 +19,18 @@ import { BrainyData } from '../brainyData.js' /** * ServerSearchConduitAugmentation - * + * * A specialized conduit augmentation that provides functionality for searching * a server-hosted Brainy instance and storing results locally. */ export class ServerSearchConduitAugmentation extends WebSocketConduitAugmentation { private localDb: BrainyData | null = null - + constructor(name: string = 'server-search-conduit') { super(name) - this.description = 'Conduit augmentation for server-hosted Brainy search' + // this.description = 'Conduit augmentation for server-hosted Brainy search' } - + /** * Initialize the augmentation */ @@ -38,24 +38,24 @@ export class ServerSearchConduitAugmentation extends WebSocketConduitAugmentatio if (this.isInitialized) { return } - + try { // Initialize the base conduit await super.initialize() - + // Initialize local Brainy instance if not provided if (!this.localDb) { this.localDb = new BrainyData() await this.localDb.init() } - + this.isInitialized = true } catch (error) { console.error(`Failed to initialize ${this.name}:`, error) throw new Error(`Failed to initialize ${this.name}: ${error}`) } } - + /** * Set the local Brainy instance * @param db The Brainy instance to use for local storage @@ -63,7 +63,7 @@ export class ServerSearchConduitAugmentation extends WebSocketConduitAugmentatio setLocalDb(db: BrainyData): void { this.localDb = db } - + /** * Get the local Brainy instance * @returns The local Brainy instance @@ -71,7 +71,7 @@ export class ServerSearchConduitAugmentation extends WebSocketConduitAugmentatio getLocalDb(): BrainyData | null { return this.localDb } - + /** * Search the server-hosted Brainy instance and store results locally * @param connectionId The ID of the established connection @@ -85,7 +85,7 @@ export class ServerSearchConduitAugmentation extends WebSocketConduitAugmentatio limit: number = 10 ): Promise> { await this.ensureInitialized() - + try { // Create a search request const readResult = await this.readData({ @@ -96,23 +96,23 @@ export class ServerSearchConduitAugmentation extends WebSocketConduitAugmentatio limit } }) - + if (readResult.success && readResult.data) { const searchResults = readResult.data as any[] - + // Store the results in the local Brainy instance if (this.localDb) { 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 { success: true, data: searchResults @@ -133,7 +133,7 @@ export class ServerSearchConduitAugmentation extends WebSocketConduitAugmentatio } } } - + /** * Search the local Brainy instance * @param query The search query @@ -145,7 +145,7 @@ export class ServerSearchConduitAugmentation extends WebSocketConduitAugmentatio limit: number = 10 ): Promise> { await this.ensureInitialized() - + try { if (!this.localDb) { return { @@ -154,9 +154,9 @@ export class ServerSearchConduitAugmentation extends WebSocketConduitAugmentatio error: 'Local database not initialized' } } - + const results = await this.localDb.searchText(query, limit) - + return { success: true, data: results @@ -170,7 +170,7 @@ export class ServerSearchConduitAugmentation extends WebSocketConduitAugmentatio } } } - + /** * Search both server and local instances, combine results, and store server results locally * @param connectionId The ID of the established connection @@ -184,46 +184,46 @@ export class ServerSearchConduitAugmentation extends WebSocketConduitAugmentatio limit: number = 10 ): Promise> { await this.ensureInitialized() - + try { // Search local first const localSearchResult = await this.searchLocal(query, limit) - + if (!localSearchResult.success) { return localSearchResult } - + const localResults = localSearchResult.data as any[] - + // If we have enough local results, return them if (localResults.length >= limit) { return localSearchResult } - + // Otherwise, search server for additional results const serverSearchResult = await this.searchServer( connectionId, query, limit - localResults.length ) - + if (!serverSearchResult.success) { // If server search fails, return local results return localSearchResult } - + const serverResults = serverSearchResult.data as any[] - + // 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 { success: true, data: combinedResults @@ -237,7 +237,7 @@ export class ServerSearchConduitAugmentation extends WebSocketConduitAugmentatio } } } - + /** * Add data to both local and server instances * @param connectionId The ID of the established connection @@ -251,7 +251,7 @@ export class ServerSearchConduitAugmentation extends WebSocketConduitAugmentatio metadata: any = {} ): Promise> { await this.ensureInitialized() - + try { if (!this.localDb) { return { @@ -260,13 +260,13 @@ export class ServerSearchConduitAugmentation extends WebSocketConduitAugmentatio error: 'Local database not initialized' } } - + // Add to local first const id = await this.localDb.add(data, metadata) - + // Get the vector and metadata const noun = await this.localDb.get(id) - + if (!noun) { return { success: false, @@ -274,7 +274,7 @@ export class ServerSearchConduitAugmentation extends WebSocketConduitAugmentatio error: 'Failed to retrieve newly created noun' } } - + // Add to server const writeResult = await this.writeData({ connectionId, @@ -284,7 +284,7 @@ export class ServerSearchConduitAugmentation extends WebSocketConduitAugmentatio metadata: noun.metadata } }) - + if (!writeResult.success) { return { success: true, @@ -292,7 +292,7 @@ export class ServerSearchConduitAugmentation extends WebSocketConduitAugmentatio error: `Added locally but failed to add to server: ${writeResult.error}` } } - + return { success: true, data: id @@ -310,7 +310,7 @@ export class ServerSearchConduitAugmentation extends WebSocketConduitAugmentatio /** * ServerSearchActivationAugmentation - * + * * An activation augmentation that provides actions for server search functionality. */ export class ServerSearchActivationAugmentation implements IActivationAugmentation { @@ -320,16 +320,16 @@ export class ServerSearchActivationAugmentation implements IActivationAugmentati private isInitialized = false private conduitAugmentation: ServerSearchConduitAugmentation | null = null private connections: Map = new Map() - + constructor(name: string = 'server-search-activation') { this.name = name this.description = 'Activation augmentation for server-hosted Brainy search' } - + getType(): AugmentationType { return AugmentationType.ACTIVATION } - + /** * Initialize the augmentation */ @@ -337,24 +337,24 @@ export class ServerSearchActivationAugmentation implements IActivationAugmentati if (this.isInitialized) { return } - + this.isInitialized = true } - + /** * Shut down the augmentation */ async shutDown(): Promise { this.isInitialized = false } - + /** * Get the status of the augmentation */ async getStatus(): Promise<'active' | 'inactive' | 'error'> { return this.isInitialized ? 'active' : 'inactive' } - + /** * Set the conduit augmentation to use for server search * @param conduit The ServerSearchConduitAugmentation to use @@ -362,7 +362,7 @@ export class ServerSearchActivationAugmentation implements IActivationAugmentati setConduitAugmentation(conduit: ServerSearchConduitAugmentation): void { this.conduitAugmentation = conduit } - + /** * Store a connection for later use * @param connectionId The ID to use for the connection @@ -371,7 +371,7 @@ export class ServerSearchActivationAugmentation implements IActivationAugmentati storeConnection(connectionId: string, connection: WebSocketConnection): void { this.connections.set(connectionId, connection) } - + /** * Get a stored connection * @param connectionId The ID of the connection to retrieve @@ -380,7 +380,7 @@ export class ServerSearchActivationAugmentation implements IActivationAugmentati getConnection(connectionId: string): WebSocketConnection | undefined { return this.connections.get(connectionId) } - + /** * Trigger an action based on a processed command or internal state * @param actionName The name of the action to trigger @@ -397,7 +397,7 @@ export class ServerSearchActivationAugmentation implements IActivationAugmentati error: 'Conduit augmentation not set' } } - + // Handle different actions switch (actionName) { case 'connectToServer': @@ -418,7 +418,7 @@ export class ServerSearchActivationAugmentation implements IActivationAugmentati } } } - + /** * Handle the connectToServer action * @param parameters Action parameters @@ -428,7 +428,7 @@ export class ServerSearchActivationAugmentation implements IActivationAugmentati ): AugmentationResponse { const serverUrl = parameters.serverUrl as string const protocols = parameters.protocols as string | string[] | undefined - + if (!serverUrl) { return { success: false, @@ -436,7 +436,7 @@ export class ServerSearchActivationAugmentation implements IActivationAugmentati error: 'serverUrl parameter is required' } } - + // Return a promise that will be resolved when the connection is established return { success: true, @@ -445,7 +445,7 @@ export class ServerSearchActivationAugmentation implements IActivationAugmentati }) } } - + /** * Handle the searchServer action * @param parameters Action parameters @@ -456,7 +456,7 @@ export class ServerSearchActivationAugmentation implements IActivationAugmentati const connectionId = parameters.connectionId as string const query = parameters.query as string const limit = parameters.limit as number || 10 - + if (!connectionId) { return { success: false, @@ -464,7 +464,7 @@ export class ServerSearchActivationAugmentation implements IActivationAugmentati error: 'connectionId parameter is required' } } - + if (!query) { return { success: false, @@ -472,14 +472,14 @@ export class ServerSearchActivationAugmentation implements IActivationAugmentati error: 'query parameter is required' } } - + // Return a promise that will be resolved when the search is complete return { success: true, data: this.conduitAugmentation!.searchServer(connectionId, query, limit) } } - + /** * Handle the searchLocal action * @param parameters Action parameters @@ -489,7 +489,7 @@ export class ServerSearchActivationAugmentation implements IActivationAugmentati ): AugmentationResponse { const query = parameters.query as string const limit = parameters.limit as number || 10 - + if (!query) { return { success: false, @@ -497,14 +497,14 @@ export class ServerSearchActivationAugmentation implements IActivationAugmentati error: 'query parameter is required' } } - + // Return a promise that will be resolved when the search is complete return { success: true, data: this.conduitAugmentation!.searchLocal(query, limit) } } - + /** * Handle the searchCombined action * @param parameters Action parameters @@ -515,7 +515,7 @@ export class ServerSearchActivationAugmentation implements IActivationAugmentati const connectionId = parameters.connectionId as string const query = parameters.query as string const limit = parameters.limit as number || 10 - + if (!connectionId) { return { success: false, @@ -523,7 +523,7 @@ export class ServerSearchActivationAugmentation implements IActivationAugmentati error: 'connectionId parameter is required' } } - + if (!query) { return { success: false, @@ -531,14 +531,14 @@ export class ServerSearchActivationAugmentation implements IActivationAugmentati error: 'query parameter is required' } } - + // Return a promise that will be resolved when the search is complete return { success: true, data: this.conduitAugmentation!.searchCombined(connectionId, query, limit) } } - + /** * Handle the addToBoth action * @param parameters Action parameters @@ -549,7 +549,7 @@ export class ServerSearchActivationAugmentation implements IActivationAugmentati const connectionId = parameters.connectionId as string const data = parameters.data const metadata = parameters.metadata || {} - + if (!connectionId) { return { success: false, @@ -557,7 +557,7 @@ export class ServerSearchActivationAugmentation implements IActivationAugmentati error: 'connectionId parameter is required' } } - + if (!data) { return { success: false, @@ -565,14 +565,14 @@ export class ServerSearchActivationAugmentation implements IActivationAugmentati error: 'data parameter is required' } } - + // Return a promise that will be resolved when the add is complete return { success: true, data: this.conduitAugmentation!.addToBoth(connectionId, data as any, metadata as any) } } - + /** * Generates an expressive output or response from Brainy * @param knowledgeId The identifier of the knowledge to express @@ -589,7 +589,7 @@ export class ServerSearchActivationAugmentation implements IActivationAugmentati error: 'generateOutput is not implemented for ServerSearchActivationAugmentation' } } - + /** * Interacts with an external system or API * @param systemId The identifier of the external system @@ -630,34 +630,34 @@ export async function createServerSearchAugmentations( // Create the conduit augmentation const conduit = new ServerSearchConduitAugmentation(options.conduitName) await conduit.initialize() - + // Set the local database if provided if (options.localDb) { conduit.setLocalDb(options.localDb) } - + // Create the activation augmentation const activation = new ServerSearchActivationAugmentation(options.activationName) await activation.initialize() - + // Link the augmentations activation.setConduitAugmentation(conduit) - + // Connect to the server const connectionResult = await conduit.establishConnection( serverUrl, { protocols: options.protocols } ) - + if (!connectionResult.success || !connectionResult.data) { throw new Error(`Failed to connect to server: ${connectionResult.error}`) } - + const connection = connectionResult.data - + // Store the connection in the activation augmentation activation.storeConnection(connection.connectionId, connection) - + return { conduit, activation, diff --git a/src/utils/version.ts b/src/utils/version.ts index eedc033e..f94f7c44 100644 --- a/src/utils/version.ts +++ b/src/utils/version.ts @@ -3,4 +3,4 @@ * Do not modify this file directly. */ -export const VERSION = '0.7.5'; +export const VERSION = '0.7.6';