feat: update server search augmentations and increment version to 0.7.6
This commit is contained in:
parent
a206b9926d
commit
099b192071
2 changed files with 80 additions and 80 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -3,4 +3,4 @@
|
|||
* Do not modify this file directly.
|
||||
*/
|
||||
|
||||
export const VERSION = '0.7.5';
|
||||
export const VERSION = '0.7.6';
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue