feat: update server search augmentations and increment version to 0.7.6

This commit is contained in:
David Snelling 2025-06-06 10:49:29 -07:00
parent a206b9926d
commit 099b192071
2 changed files with 80 additions and 80 deletions

View file

@ -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<AugmentationResponse<unknown>> {
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<AugmentationResponse<unknown>> {
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<AugmentationResponse<unknown>> {
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<AugmentationResponse<string>> {
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<string, WebSocketConnection> = 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<void> {
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<unknown> {
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<unknown> {
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,

View file

@ -3,4 +3,4 @@
* Do not modify this file directly.
*/
export const VERSION = '0.7.5';
export const VERSION = '0.7.6';