@elizaos/plugin-knowledge 2.0.0-alpha.5 → 2.0.0-alpha.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,32 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../actions.ts", "../../service.ts", "../../config.ts", "../../types.ts", "../../docs-loader.ts", "../../utils.ts", "../../node_modules/uuid/dist-node/native.js", "../../node_modules/uuid/dist-node/rng.js", "../../node_modules/uuid/dist-node/regex.js", "../../node_modules/uuid/dist-node/validate.js", "../../node_modules/uuid/dist-node/stringify.js", "../../node_modules/uuid/dist-node/v4.js", "../../node_modules/uuid/dist-node/sha1.js", "../../node_modules/uuid/dist-node/parse.js", "../../node_modules/uuid/dist-node/v35.js", "../../node_modules/uuid/dist-node/v5.js", "../../document-processor.ts", "../../ctx-embeddings.ts", "../../llm.ts", "../../documents-provider.ts", "../../provider.ts", "../../routes.ts", "../../index.ts"],
4
+ "sourcesContent": [
5
+ "import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type {\n Action,\n Content,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport { logger, stringToUuid } from \"@elizaos/core\";\nimport { KnowledgeService } from \"./service.ts\";\nimport type { AddKnowledgeOptions } from \"./types.ts\";\n\nexport const processKnowledgeAction: Action = {\n name: \"PROCESS_KNOWLEDGE\",\n description:\n \"Process and store knowledge from a file path or text content into the knowledge base\",\n\n similes: [],\n\n examples: [\n [\n {\n name: \"user\",\n content: {\n text: \"Process the document at /path/to/document.pdf\",\n },\n },\n {\n name: \"assistant\",\n content: {\n text: \"I'll process the document at /path/to/document.pdf and add it to my knowledge base.\",\n actions: [\"PROCESS_KNOWLEDGE\"],\n },\n },\n ],\n [\n {\n name: \"user\",\n content: {\n text: \"Add this to your knowledge: The capital of France is Paris.\",\n },\n },\n {\n name: \"assistant\",\n content: {\n text: \"I'll add that information to my knowledge base.\",\n actions: [\"PROCESS_KNOWLEDGE\"],\n },\n },\n ],\n ],\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n const __avTextRaw = typeof message?.content?.text === \"string\" ? message.content.text : \"\";\n const __avText = __avTextRaw.toLowerCase();\n const __avKeywords = [\"process\", \"knowledge\"];\n const __avKeywordOk =\n __avKeywords.length > 0 && __avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n const __avRegexOk = /\\b(?:process|knowledge)\\b/i.test(__avText);\n const __avSource = String(message?.content?.source ?? message?.source ?? \"\");\n const __avExpectedSource = \"\";\n const __avSourceOk = __avExpectedSource\n ? __avSource === __avExpectedSource\n : Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n const __avOptions = options && typeof options === \"object\" ? options : {};\n const __avInputOk =\n __avText.trim().length > 0 ||\n Object.keys(__avOptions as Record<string, unknown>).length > 0 ||\n Boolean(message?.content && typeof message.content === \"object\");\n\n if (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n return false;\n }\n\n const __avLegacyValidate = async (runtime: IAgentRuntime, message: Memory, _state?: State) => {\n const text = message.content.text?.toLowerCase() || \"\";\n\n const knowledgeKeywords = [\n \"process\",\n \"add\",\n \"upload\",\n \"document\",\n \"knowledge\",\n \"learn\",\n \"remember\",\n \"store\",\n \"ingest\",\n \"file\",\n ];\n\n const hasKeyword = knowledgeKeywords.some((keyword) => text.includes(keyword));\n\n const pathPattern = /(?:\\/[\\w.-]+)+|(?:[a-zA-Z]:[\\\\/][\\w\\s.-]+(?:[\\\\/][\\w\\s.-]+)*)/;\n const hasPath = pathPattern.test(text);\n\n const service = runtime.getService(KnowledgeService.serviceType);\n if (!service) {\n logger.warn(\"Knowledge service not available for PROCESS_KNOWLEDGE action\");\n return false;\n }\n\n return hasKeyword || hasPath;\n };\n try {\n return Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n } catch {\n return false;\n }\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback\n ) => {\n try {\n const service = runtime.getService<KnowledgeService>(KnowledgeService.serviceType);\n if (!service) {\n throw new Error(\"Knowledge service not available\");\n }\n\n const text = message.content.text || \"\";\n\n const pathPattern = /(?:\\/[\\w.-]+)+|(?:[a-zA-Z]:[\\\\/][\\w\\s.-]+(?:[\\\\/][\\w\\s.-]+)*)/;\n const pathMatch = text.match(pathPattern);\n\n let response: Content;\n\n if (pathMatch) {\n const filePath = pathMatch[0];\n\n if (!fs.existsSync(filePath)) {\n response = {\n text: `I couldn't find the file at ${filePath}. Please check the path and try again.`,\n };\n\n if (callback) {\n await callback(response);\n }\n return;\n }\n\n const fileBuffer = fs.readFileSync(filePath);\n const fileName = path.basename(filePath);\n const fileExt = path.extname(filePath).toLowerCase();\n\n let contentType = \"text/plain\";\n if (fileExt === \".pdf\") contentType = \"application/pdf\";\n else if (fileExt === \".docx\")\n contentType = \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\";\n else if (fileExt === \".doc\") contentType = \"application/msword\";\n else if ([\".txt\", \".md\", \".tson\", \".xml\", \".csv\"].includes(fileExt))\n contentType = \"text/plain\";\n\n const knowledgeOptions: AddKnowledgeOptions = {\n clientDocumentId: stringToUuid(runtime.agentId + fileName + Date.now()),\n contentType,\n originalFilename: fileName,\n worldId: runtime.agentId,\n content: fileBuffer.toString(\"base64\"),\n roomId: message.roomId,\n entityId: message.entityId,\n };\n\n const result = await service.addKnowledge(knowledgeOptions);\n\n response = {\n text: `I've successfully processed the document \"${fileName}\". It has been split into ${result?.fragmentCount || 0} searchable fragments and added to my knowledge base.`,\n };\n } else {\n const knowledgeContent = text\n .replace(/^(add|store|remember|process|learn)\\s+(this|that|the following)?:?\\s*/i, \"\")\n .trim();\n\n if (!knowledgeContent) {\n response = {\n text: \"I need some content to add to my knowledge base. Please provide text or a file path.\",\n };\n\n if (callback) {\n await callback(response);\n }\n return;\n }\n\n const knowledgeOptions: AddKnowledgeOptions = {\n clientDocumentId: stringToUuid(`${runtime.agentId}text${Date.now()}user-knowledge`),\n contentType: \"text/plain\",\n originalFilename: \"user-knowledge.txt\",\n worldId: runtime.agentId,\n content: knowledgeContent,\n roomId: message.roomId,\n entityId: message.entityId,\n };\n\n await service.addKnowledge(knowledgeOptions);\n\n response = {\n text: `I've added that information to my knowledge base. It has been stored and indexed for future reference.`,\n };\n }\n\n if (callback) {\n await callback(response);\n }\n return { success: true, text: response.text };\n } catch (error) {\n logger.error({ error }, \"Error in PROCESS_KNOWLEDGE action\");\n\n const errorResponse: Content = {\n text: `I encountered an error while processing the knowledge: ${error instanceof Error ? error.message : String(error)}`,\n };\n\n if (callback) {\n await callback(errorResponse);\n }\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n },\n};\n\nexport const searchKnowledgeAction: Action = {\n name: \"SEARCH_KNOWLEDGE\",\n description: \"Search the knowledge base for specific information\",\n\n similes: [\n \"search knowledge\",\n \"find information\",\n \"look up\",\n \"query knowledge base\",\n \"search documents\",\n \"find in knowledge\",\n ],\n\n examples: [\n [\n {\n name: \"user\",\n content: {\n text: \"Search your knowledge for information about quantum computing\",\n },\n },\n {\n name: \"assistant\",\n content: {\n text: \"I'll search my knowledge base for information about quantum computing.\",\n actions: [\"SEARCH_KNOWLEDGE\"],\n },\n },\n ],\n ],\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n const __avTextRaw = typeof message?.content?.text === \"string\" ? message.content.text : \"\";\n const __avText = __avTextRaw.toLowerCase();\n const __avKeywords = [\"search\", \"knowledge\"];\n const __avKeywordOk =\n __avKeywords.length > 0 && __avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n const __avRegexOk = /\\b(?:search|knowledge)\\b/i.test(__avText);\n const __avSource = String(message?.content?.source ?? message?.source ?? \"\");\n const __avExpectedSource = \"\";\n const __avSourceOk = __avExpectedSource\n ? __avSource === __avExpectedSource\n : Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n const __avOptions = options && typeof options === \"object\" ? options : {};\n const __avInputOk =\n __avText.trim().length > 0 ||\n Object.keys(__avOptions as Record<string, unknown>).length > 0 ||\n Boolean(message?.content && typeof message.content === \"object\");\n\n if (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n return false;\n }\n\n const __avLegacyValidate = async (runtime: IAgentRuntime, message: Memory, _state?: State) => {\n const text = message.content.text?.toLowerCase() || \"\";\n\n const searchKeywords = [\"search\", \"find\", \"look up\", \"query\", \"what do you know about\"];\n const knowledgeKeywords = [\"knowledge\", \"information\", \"document\", \"database\"];\n\n const hasSearchKeyword = searchKeywords.some((keyword) => text.includes(keyword));\n const hasKnowledgeKeyword = knowledgeKeywords.some((keyword) => text.includes(keyword));\n\n const service = runtime.getService(KnowledgeService.serviceType);\n if (!service) {\n return false;\n }\n\n return hasSearchKeyword && hasKnowledgeKeyword;\n };\n try {\n return Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n } catch {\n return false;\n }\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback\n ) => {\n try {\n const service = runtime.getService<KnowledgeService>(KnowledgeService.serviceType);\n if (!service) {\n throw new Error(\"Knowledge service not available\");\n }\n\n const text = message.content.text || \"\";\n\n const query = text\n .replace(/^(search|find|look up|query)\\s+(your\\s+)?knowledge\\s+(base\\s+)?(for\\s+)?/i, \"\")\n .trim();\n\n if (!query) {\n const response: Content = {\n text: \"What would you like me to search for in my knowledge base?\",\n };\n\n if (callback) {\n await callback(response);\n }\n return;\n }\n\n const searchMessage: Memory = {\n ...message,\n content: {\n text: query,\n },\n };\n\n const results = await service.getKnowledge(searchMessage);\n\n let response: Content;\n\n if (results.length === 0) {\n response = {\n text: `I couldn't find any information about \"${query}\" in my knowledge base.`,\n };\n } else {\n const formattedResults = results\n .slice(0, 3)\n .map((item, index) => `${index + 1}. ${item.content.text}`)\n .join(\"\\n\\n\");\n\n response = {\n text: `Here's what I found about \"${query}\":\\n\\n${formattedResults}`,\n };\n }\n\n if (callback) {\n await callback(response);\n }\n return { success: true, text: response.text };\n } catch (error) {\n logger.error({ error }, \"Error in SEARCH_KNOWLEDGE action\");\n\n const errorResponse: Content = {\n text: `I encountered an error while searching the knowledge base: ${error instanceof Error ? error.message : String(error)}`,\n };\n\n if (callback) {\n await callback(errorResponse);\n }\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n },\n};\n\nexport const knowledgeActions = [processKnowledgeAction, searchKnowledgeAction];\n",
6
+ "import {\n type Content,\n type CustomMetadata,\n createUniqueUuid,\n type FragmentMetadata,\n type IAgentRuntime,\n logger,\n type Memory,\n type MemoryMetadata,\n MemoryType,\n type Metadata,\n ModelType,\n Semaphore,\n Service,\n splitChunks,\n type UUID,\n} from \"@elizaos/core\";\nimport { validateModelConfig } from \"./config\";\nimport { loadDocsFromPath } from \"./docs-loader\";\nimport {\n createDocumentMemory,\n extractTextFromDocument,\n processFragmentsSynchronously,\n} from \"./document-processor.ts\";\nimport type { KnowledgeConfig, LoadResult, StoredKnowledgeItem } from \"./types\";\nimport type { AddKnowledgeOptions } from \"./types.ts\";\nimport { generateContentBasedId, isBinaryContentType, looksLikeBase64 } from \"./utils.ts\";\n\nexport class KnowledgeService extends Service {\n static readonly serviceType = \"knowledge\";\n public override config: Metadata = {};\n capabilityDescription =\n \"Provides Retrieval Augmented Generation capabilities, including knowledge upload and querying.\";\n\n private knowledgeProcessingSemaphore: Semaphore;\n\n constructor(runtime: IAgentRuntime, _config?: Partial<KnowledgeConfig>) {\n super(runtime);\n this.knowledgeProcessingSemaphore = new Semaphore(10);\n }\n\n private async loadInitialDocuments(): Promise<void> {\n logger.info(`Loading documents on startup for agent ${this.runtime.agentId}`);\n try {\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n const knowledgePathSetting = this.runtime.getSetting(\"KNOWLEDGE_PATH\");\n const knowledgePath =\n typeof knowledgePathSetting === \"string\" ? knowledgePathSetting : undefined;\n\n const result: LoadResult = await loadDocsFromPath(\n this as KnowledgeService,\n this.runtime.agentId,\n undefined,\n knowledgePath\n );\n\n if (result.successful > 0) {\n logger.info(`Loaded ${result.successful} documents on startup`);\n }\n } catch (error) {\n logger.error({ error }, \"Error loading documents on startup\");\n }\n }\n\n static async start(runtime: IAgentRuntime): Promise<KnowledgeService> {\n logger.info(`Starting Knowledge service for agent: ${runtime.agentId}`);\n\n const validatedConfig = validateModelConfig(runtime);\n const ctxEnabled = validatedConfig.CTX_KNOWLEDGE_ENABLED;\n\n if (ctxEnabled) {\n logger.info(\n `Contextual Knowledge enabled: ${validatedConfig.EMBEDDING_PROVIDER || \"auto\"} embeddings, ${validatedConfig.TEXT_PROVIDER} text generation`\n );\n logger.info(`Text model: ${validatedConfig.TEXT_MODEL}`);\n } else {\n const usingPluginOpenAI = !process.env.EMBEDDING_PROVIDER;\n logger.warn(\"Basic Embedding mode - documents will not be enriched with context\");\n logger.info(\n \"To enable contextual enrichment: Set CTX_KNOWLEDGE_ENABLED=true and configure TEXT_PROVIDER/TEXT_MODEL\"\n );\n\n if (usingPluginOpenAI) {\n logger.info(\"Using plugin-openai configuration for embeddings\");\n } else {\n logger.info(\n `Using ${validatedConfig.EMBEDDING_PROVIDER} for embeddings with ${validatedConfig.TEXT_EMBEDDING_MODEL}`\n );\n }\n }\n\n const service = new KnowledgeService(runtime);\n service.config = validatedConfig;\n\n if (service.config.LOAD_DOCS_ON_STARTUP) {\n service.loadInitialDocuments().catch((error) => {\n logger.error({ error }, \"Error loading initial documents\");\n });\n }\n\n if (service.runtime.character?.knowledge && service.runtime.character.knowledge.length > 0) {\n const stringKnowledge = service.runtime.character.knowledge\n .map((item) => {\n // Handle new KnowledgeSourceItem format with item.case/item.value\n const itemAny = item as { item?: { case?: string; value?: string }; path?: string };\n if (itemAny?.item?.case === \"path\" && typeof itemAny.item.value === \"string\") {\n return itemAny.item.value;\n }\n // Handle legacy format with direct path property\n if (typeof itemAny?.path === \"string\") {\n return itemAny.path;\n }\n // Handle string items directly\n if (typeof item === \"string\") {\n return item;\n }\n return null;\n })\n .filter((item): item is string => item !== null);\n await service.processCharacterKnowledge(stringKnowledge).catch((err) => {\n logger.error({ error: err }, \"Error processing character knowledge\");\n });\n }\n\n return service;\n }\n\n static async stop(runtime: IAgentRuntime): Promise<void> {\n logger.info(`Stopping Knowledge service for agent: ${runtime.agentId}`);\n const service = runtime.getService(KnowledgeService.serviceType);\n if (!service) {\n logger.warn(`KnowledgeService not found for agent ${runtime.agentId} during stop.`);\n }\n if (service instanceof KnowledgeService) {\n await service.stop();\n }\n }\n\n async stop(): Promise<void> {\n logger.info(`Knowledge service stopping for agent: ${this.runtime.character?.name}`);\n }\n\n async addKnowledge(options: AddKnowledgeOptions): Promise<{\n clientDocumentId: string;\n storedDocumentMemoryId: UUID;\n fragmentCount: number;\n }> {\n const agentId = options.agentId || (this.runtime.agentId as UUID);\n\n const contentBasedId = generateContentBasedId(options.content, agentId, {\n includeFilename: options.originalFilename,\n contentType: options.contentType,\n maxChars: 2000,\n }) as UUID;\n\n logger.info(`Processing \"${options.originalFilename}\" (${options.contentType})`);\n\n try {\n const existingDocument = await this.runtime.getMemoryById(contentBasedId);\n if (existingDocument && existingDocument.metadata?.type === MemoryType.DOCUMENT) {\n logger.info(`\"${options.originalFilename}\" already exists - skipping`);\n\n const fragments = await this.runtime.getMemories({\n tableName: \"knowledge\",\n });\n\n const relatedFragments = fragments.filter(\n (f) =>\n f.metadata?.type === MemoryType.FRAGMENT &&\n (f.metadata as FragmentMetadata).documentId === contentBasedId\n );\n\n return {\n clientDocumentId: contentBasedId,\n storedDocumentMemoryId: existingDocument.id as UUID,\n fragmentCount: relatedFragments.length,\n };\n }\n } catch (error) {\n logger.debug(\n `Document ${contentBasedId} not found or error checking existence, proceeding with processing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n return this.processDocument({\n ...options,\n clientDocumentId: contentBasedId,\n });\n }\n\n private async processDocument({\n agentId: passedAgentId,\n clientDocumentId,\n contentType,\n originalFilename,\n worldId,\n content,\n roomId,\n entityId,\n metadata,\n }: AddKnowledgeOptions): Promise<{\n clientDocumentId: string;\n storedDocumentMemoryId: UUID;\n fragmentCount: number;\n }> {\n const agentId = passedAgentId || (this.runtime.agentId as UUID);\n\n try {\n logger.debug(\n `Processing document ${originalFilename} (type: ${contentType}) for agent: ${agentId}`\n );\n\n let fileBuffer: Buffer | null = null;\n let extractedText: string;\n let documentContentToStore: string;\n const isPdfFile =\n contentType === \"application/pdf\" || originalFilename.toLowerCase().endsWith(\".pdf\");\n\n if (isPdfFile) {\n try {\n fileBuffer = Buffer.from(content, \"base64\");\n } catch (e) {\n logger.error({ error: e }, `Failed to convert base64 to buffer for ${originalFilename}`);\n throw new Error(`Invalid base64 content for PDF file ${originalFilename}`);\n }\n extractedText = await extractTextFromDocument(fileBuffer, contentType, originalFilename);\n documentContentToStore = content;\n } else if (isBinaryContentType(contentType, originalFilename)) {\n try {\n fileBuffer = Buffer.from(content, \"base64\");\n } catch (e) {\n logger.error({ error: e }, `Failed to convert base64 to buffer for ${originalFilename}`);\n throw new Error(`Invalid base64 content for binary file ${originalFilename}`);\n }\n extractedText = await extractTextFromDocument(fileBuffer, contentType, originalFilename);\n documentContentToStore = extractedText;\n } else {\n if (looksLikeBase64(content)) {\n try {\n const decodedBuffer = Buffer.from(content, \"base64\");\n const decodedText = decodedBuffer.toString(\"utf8\");\n\n const invalidCharCount = (decodedText.match(/\\ufffd/g) || []).length;\n const textLength = decodedText.length;\n\n if (invalidCharCount > 0 && invalidCharCount / textLength > 0.1) {\n throw new Error(\"Decoded content contains too many invalid characters\");\n }\n\n logger.debug(`Successfully decoded base64 content for text file: ${originalFilename}`);\n extractedText = decodedText;\n documentContentToStore = decodedText;\n } catch (e) {\n logger.error(\n { error: e instanceof Error ? e : new Error(String(e)) },\n `Failed to decode base64 for ${originalFilename}`\n );\n throw new Error(\n `File ${originalFilename} appears to be corrupted or incorrectly encoded`\n );\n }\n } else {\n logger.debug(`Treating content as plain text for file: ${originalFilename}`);\n extractedText = content;\n documentContentToStore = content;\n }\n }\n\n if (!extractedText || extractedText.trim() === \"\") {\n throw new Error(\n `No text content extracted from ${originalFilename} (type: ${contentType})`\n );\n }\n\n const documentMemory = createDocumentMemory({\n text: documentContentToStore,\n agentId,\n clientDocumentId,\n originalFilename,\n contentType,\n worldId,\n fileSize: fileBuffer ? fileBuffer.length : extractedText.length,\n documentId: clientDocumentId,\n customMetadata: metadata,\n });\n\n const memoryWithScope = {\n ...documentMemory,\n id: clientDocumentId,\n agentId: agentId,\n roomId: roomId || agentId,\n entityId: entityId || agentId,\n };\n\n await this.runtime.createMemory(memoryWithScope, \"documents\");\n\n const fragmentCount = await processFragmentsSynchronously({\n runtime: this.runtime,\n documentId: clientDocumentId,\n fullDocumentText: extractedText,\n agentId,\n contentType,\n roomId: roomId || agentId,\n entityId: entityId || agentId,\n worldId: worldId || agentId,\n documentTitle: originalFilename,\n });\n\n logger.debug(`\"${originalFilename}\" stored with ${fragmentCount} fragments`);\n\n return {\n clientDocumentId,\n storedDocumentMemoryId: memoryWithScope.id as UUID,\n fragmentCount,\n };\n } catch (error) {\n logger.error({ error }, `Error processing document ${originalFilename}`);\n throw error;\n }\n }\n\n async checkExistingKnowledge(knowledgeId: UUID): Promise<boolean> {\n const existingDocument = await this.runtime.getMemoryById(knowledgeId);\n return !!existingDocument;\n }\n\n async getKnowledge(\n message: Memory,\n scope?: { roomId?: UUID; worldId?: UUID; entityId?: UUID }\n ): Promise<StoredKnowledgeItem[]> {\n if (!message?.content?.text || message?.content?.text.trim().length === 0) {\n logger.warn(\"Invalid or empty message content for knowledge query\");\n return [];\n }\n\n const embedding = await this.runtime.useModel(ModelType.TEXT_EMBEDDING, {\n text: message.content.text,\n });\n\n const filterScope: { roomId?: UUID; worldId?: UUID; entityId?: UUID } = {};\n if (scope?.roomId) filterScope.roomId = scope.roomId;\n if (scope?.worldId) filterScope.worldId = scope.worldId;\n if (scope?.entityId) filterScope.entityId = scope.entityId;\n\n const fragments = await this.runtime.searchMemories({\n tableName: \"knowledge\",\n embedding,\n query: message.content.text,\n ...filterScope,\n count: 20,\n match_threshold: 0.1,\n });\n\n return fragments\n .filter((fragment) => fragment.id !== undefined)\n .map((fragment) => ({\n id: fragment.id as UUID,\n content: fragment.content as Content,\n similarity: fragment.similarity,\n metadata: fragment.metadata,\n worldId: fragment.worldId,\n })) as StoredKnowledgeItem[];\n }\n\n async enrichConversationMemoryWithRAG(\n memoryId: UUID,\n ragMetadata: {\n retrievedFragments: Array<{\n fragmentId: UUID;\n documentTitle: string;\n similarityScore?: number;\n contentPreview: string;\n }>;\n queryText: string;\n totalFragments: number;\n retrievalTimestamp: number;\n }\n ): Promise<void> {\n try {\n const existingMemory = await this.runtime.getMemoryById(memoryId);\n if (!existingMemory) {\n logger.warn(`Cannot enrich memory ${memoryId} - memory not found`);\n return;\n }\n\n const ragUsageData = {\n retrievedFragments: ragMetadata.retrievedFragments,\n queryText: ragMetadata.queryText,\n totalFragments: ragMetadata.totalFragments,\n retrievalTimestamp: ragMetadata.retrievalTimestamp,\n usedInResponse: true,\n };\n const updatedMetadata: CustomMetadata = {\n ...(existingMemory.metadata as CustomMetadata),\n knowledgeUsed: true,\n ragUsage: JSON.stringify(ragUsageData),\n timestamp: existingMemory.metadata?.timestamp ?? Date.now(),\n type: MemoryType.CUSTOM,\n };\n\n await this.runtime.updateMemory({\n id: memoryId,\n metadata: updatedMetadata,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.warn(\n `Failed to enrich conversation memory ${memoryId} with RAG data: ${errorMessage}`\n );\n }\n }\n\n private pendingRAGEnrichment: Array<{\n ragMetadata: {\n retrievedFragments: Array<{\n fragmentId: UUID;\n documentTitle: string;\n similarityScore?: number;\n contentPreview: string;\n }>;\n queryText: string;\n totalFragments: number;\n retrievalTimestamp: number;\n };\n timestamp: number;\n }> = [];\n\n setPendingRAGMetadata(ragMetadata: {\n retrievedFragments: Array<{\n fragmentId: UUID;\n documentTitle: string;\n similarityScore?: number;\n contentPreview: string;\n }>;\n queryText: string;\n totalFragments: number;\n retrievalTimestamp: number;\n }): void {\n const now = Date.now();\n this.pendingRAGEnrichment = this.pendingRAGEnrichment.filter(\n (entry) => now - entry.timestamp < 30000\n );\n\n this.pendingRAGEnrichment.push({\n ragMetadata,\n timestamp: now,\n });\n }\n\n async enrichRecentMemoriesWithPendingRAG(): Promise<void> {\n if (this.pendingRAGEnrichment.length === 0) {\n return;\n }\n\n try {\n const recentMemories = await this.runtime.getMemories({\n tableName: \"messages\",\n count: 10,\n });\n\n const now = Date.now();\n const recentConversationMemories = recentMemories\n .filter(\n (memory) =>\n memory.metadata?.type === \"message\" &&\n now - (memory.createdAt || 0) < 10000 &&\n !(memory.metadata && \"ragUsage\" in memory.metadata && memory.metadata.ragUsage)\n )\n .sort((a, b) => (b.createdAt || 0) - (a.createdAt || 0));\n\n for (const pendingEntry of this.pendingRAGEnrichment) {\n const matchingMemory = recentConversationMemories.find(\n (memory) => (memory.createdAt || 0) > pendingEntry.timestamp\n );\n\n if (matchingMemory?.id) {\n await this.enrichConversationMemoryWithRAG(matchingMemory.id, pendingEntry.ragMetadata);\n\n const index = this.pendingRAGEnrichment.indexOf(pendingEntry);\n if (index > -1) {\n this.pendingRAGEnrichment.splice(index, 1);\n }\n }\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.warn(`Error enriching recent memories with RAG data: ${errorMessage}`);\n }\n }\n\n async processCharacterKnowledge(items: string[]): Promise<void> {\n await new Promise((resolve) => setTimeout(resolve, 1000));\n logger.info(`Processing ${items.length} character knowledge items`);\n\n const processingPromises = items.map(async (item) => {\n await this.knowledgeProcessingSemaphore.acquire();\n try {\n const knowledgeId = generateContentBasedId(item, this.runtime.agentId, {\n maxChars: 2000,\n includeFilename: \"character-knowledge\",\n }) as UUID;\n\n if (await this.checkExistingKnowledge(knowledgeId)) {\n return;\n }\n\n let metadata: CustomMetadata = {\n type: MemoryType.CUSTOM,\n timestamp: Date.now(),\n source: \"character\",\n };\n\n const pathMatch = item.match(/^Path: (.+?)(?:\\n|\\r\\n)/);\n if (pathMatch) {\n const filePath = pathMatch[1].trim();\n const extension = filePath.split(\".\").pop() || \"\";\n const filename = filePath.split(\"/\").pop() || \"\";\n const title = filename.replace(`.${extension}`, \"\");\n metadata = {\n ...metadata,\n path: filePath,\n filename: filename,\n fileExt: extension,\n title: title,\n fileType: `text/${extension || \"plain\"}`,\n fileSize: item.length,\n };\n }\n\n await this._internalAddKnowledge(\n {\n id: knowledgeId,\n content: {\n text: item,\n } as Content,\n metadata,\n },\n undefined,\n {\n roomId: this.runtime.agentId,\n entityId: this.runtime.agentId,\n worldId: this.runtime.agentId,\n }\n );\n } catch (error) {\n logger.error({ error }, \"Error processing character knowledge\");\n } finally {\n this.knowledgeProcessingSemaphore.release();\n }\n });\n\n await Promise.all(processingPromises);\n }\n\n async _internalAddKnowledge(\n item: StoredKnowledgeItem,\n options = {\n targetTokens: 1500,\n overlap: 200,\n modelContextSize: 4096,\n },\n scope = {\n roomId: this.runtime.agentId,\n entityId: this.runtime.agentId,\n worldId: this.runtime.agentId,\n }\n ): Promise<void> {\n const finalScope = {\n roomId: scope?.roomId ?? this.runtime.agentId,\n worldId: scope?.worldId ?? this.runtime.agentId,\n entityId: scope?.entityId ?? this.runtime.agentId,\n };\n\n const documentMetadata = {\n ...(item.metadata ?? {}),\n type: MemoryType.CUSTOM,\n documentId: item.id,\n };\n\n const documentMemory: Memory = {\n id: item.id,\n agentId: this.runtime.agentId,\n roomId: finalScope.roomId,\n worldId: finalScope.worldId,\n entityId: finalScope.entityId,\n content: item.content as unknown as Content,\n metadata: documentMetadata as unknown as MemoryMetadata,\n createdAt: Date.now(),\n };\n\n const existingDocument = await this.runtime.getMemoryById(item.id);\n if (existingDocument) {\n await this.runtime.updateMemory({\n ...documentMemory,\n id: item.id,\n });\n } else {\n await this.runtime.createMemory(documentMemory, \"documents\");\n }\n\n const fragments = await this.splitAndCreateFragments(\n item,\n options.targetTokens,\n options.overlap,\n finalScope\n );\n\n for (const fragment of fragments) {\n try {\n await this.processDocumentFragment(fragment);\n } catch (error) {\n logger.error(\n { error },\n `KnowledgeService: Error processing fragment ${fragment.id} for document ${item.id}`\n );\n }\n }\n }\n\n private async processDocumentFragment(fragment: Memory): Promise<void> {\n try {\n await this.runtime.addEmbeddingToMemory(fragment);\n\n await this.runtime.createMemory(fragment, \"knowledge\");\n } catch (error) {\n logger.error({ error }, `Error processing fragment ${fragment.id}`);\n throw error;\n }\n }\n\n private async splitAndCreateFragments(\n document: StoredKnowledgeItem,\n targetTokens: number,\n overlap: number,\n scope: { roomId: UUID; worldId: UUID; entityId: UUID }\n ): Promise<Memory[]> {\n if (!document.content.text) {\n return [];\n }\n\n const text = document.content.text;\n const chunks = await splitChunks(text, targetTokens, overlap);\n\n return chunks.map((chunk, index) => {\n const fragmentIdContent = `${document.id}-fragment-${index}-${Date.now()}`;\n const fragmentId = createUniqueUuid(this.runtime, fragmentIdContent);\n\n return {\n id: fragmentId,\n entityId: scope.entityId,\n agentId: this.runtime.agentId,\n roomId: scope.roomId,\n worldId: scope.worldId,\n content: {\n text: chunk,\n },\n metadata: {\n ...(document.metadata || {}),\n type: MemoryType.FRAGMENT,\n documentId: document.id,\n position: index,\n timestamp: Date.now(),\n },\n createdAt: Date.now(),\n };\n });\n }\n\n async getMemories(params: {\n tableName: string;\n roomId?: UUID;\n count?: number;\n offset?: number;\n end?: number;\n }): Promise<Memory[]> {\n return this.runtime.getMemories({\n ...params,\n agentId: this.runtime.agentId,\n });\n }\n\n async countMemories(params: {\n tableName: string;\n roomId?: UUID;\n unique?: boolean;\n }): Promise<number> {\n const roomId = params.roomId || this.runtime.agentId;\n const unique = params.unique ?? false;\n const tableName = params.tableName;\n\n return this.runtime.countMemories(roomId, unique, tableName);\n }\n\n async deleteMemory(memoryId: UUID): Promise<void> {\n await this.runtime.deleteMemory(memoryId);\n }\n}\n",
7
+ "import type { IAgentRuntime } from \"@elizaos/core\";\nimport z from \"zod\";\nimport { type ModelConfig, ModelConfigSchema, type ProviderRateLimits } from \"./types.ts\";\n\nconst parseBooleanEnv = (value: string | boolean | number | undefined): boolean => {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"number\") return value !== 0;\n if (typeof value === \"string\") return value.toLowerCase() === \"true\";\n return false;\n};\n\nexport function validateModelConfig(runtime?: IAgentRuntime): ModelConfig {\n try {\n const getSetting = (key: string, defaultValue?: string) => {\n if (runtime) {\n return runtime.getSetting(key) || process.env[key] || defaultValue;\n }\n return process.env[key] || defaultValue;\n };\n\n const ctxKnowledgeEnabled = parseBooleanEnv(getSetting(\"CTX_KNOWLEDGE_ENABLED\", \"false\"));\n const embeddingProvider = getSetting(\"EMBEDDING_PROVIDER\");\n const assumePluginOpenAI = !embeddingProvider;\n\n const textEmbeddingModel =\n getSetting(\"TEXT_EMBEDDING_MODEL\") ||\n getSetting(\"OPENAI_EMBEDDING_MODEL\") ||\n \"text-embedding-3-small\";\n const embeddingDimension =\n getSetting(\"EMBEDDING_DIMENSION\") || getSetting(\"OPENAI_EMBEDDING_DIMENSIONS\") || \"1536\";\n\n const openaiApiKey = getSetting(\"OPENAI_API_KEY\");\n\n const config = ModelConfigSchema.parse({\n EMBEDDING_PROVIDER: embeddingProvider,\n TEXT_PROVIDER: getSetting(\"TEXT_PROVIDER\"),\n\n OPENAI_API_KEY: openaiApiKey,\n ANTHROPIC_API_KEY: getSetting(\"ANTHROPIC_API_KEY\"),\n OPENROUTER_API_KEY: getSetting(\"OPENROUTER_API_KEY\"),\n GOOGLE_API_KEY: getSetting(\"GOOGLE_API_KEY\"),\n\n OPENAI_BASE_URL: getSetting(\"OPENAI_BASE_URL\"),\n ANTHROPIC_BASE_URL: getSetting(\"ANTHROPIC_BASE_URL\"),\n OPENROUTER_BASE_URL: getSetting(\"OPENROUTER_BASE_URL\"),\n GOOGLE_BASE_URL: getSetting(\"GOOGLE_BASE_URL\"),\n\n TEXT_EMBEDDING_MODEL: textEmbeddingModel,\n TEXT_MODEL: getSetting(\"TEXT_MODEL\"),\n\n MAX_INPUT_TOKENS: getSetting(\"MAX_INPUT_TOKENS\", \"4000\"),\n MAX_OUTPUT_TOKENS: getSetting(\"MAX_OUTPUT_TOKENS\", \"4096\"),\n\n EMBEDDING_DIMENSION: embeddingDimension,\n\n LOAD_DOCS_ON_STARTUP: parseBooleanEnv(getSetting(\"LOAD_DOCS_ON_STARTUP\")),\n CTX_KNOWLEDGE_ENABLED: ctxKnowledgeEnabled,\n\n RATE_LIMIT_ENABLED: parseBooleanEnv(getSetting(\"RATE_LIMIT_ENABLED\", \"true\")),\n MAX_CONCURRENT_REQUESTS: getSetting(\"MAX_CONCURRENT_REQUESTS\", \"100\"),\n REQUESTS_PER_MINUTE: getSetting(\"REQUESTS_PER_MINUTE\", \"500\"),\n TOKENS_PER_MINUTE: getSetting(\"TOKENS_PER_MINUTE\", \"1000000\"),\n BATCH_DELAY_MS: getSetting(\"BATCH_DELAY_MS\", \"100\"),\n });\n validateConfigRequirements(config, assumePluginOpenAI);\n return config;\n } catch (error) {\n if (error instanceof z.ZodError) {\n const issues = error.issues\n .map((issue) => `${issue.path.join(\".\")}: ${issue.message}`)\n .join(\", \");\n throw new Error(`Model configuration validation failed: ${issues}`);\n }\n throw error;\n }\n}\n\nfunction validateConfigRequirements(config: ModelConfig, assumePluginOpenAI: boolean): void {\n const embeddingProvider = config.EMBEDDING_PROVIDER;\n\n if (embeddingProvider === \"openai\" && !config.OPENAI_API_KEY) {\n throw new Error('OPENAI_API_KEY is required when EMBEDDING_PROVIDER is set to \"openai\"');\n }\n if (embeddingProvider === \"google\" && !config.GOOGLE_API_KEY) {\n throw new Error('GOOGLE_API_KEY is required when EMBEDDING_PROVIDER is set to \"google\"');\n }\n\n if (assumePluginOpenAI && config.OPENAI_API_KEY && !config.TEXT_EMBEDDING_MODEL) {\n throw new Error(\"OPENAI_EMBEDDING_MODEL is required when using plugin-openai configuration\");\n }\n\n if (config.CTX_KNOWLEDGE_ENABLED) {\n if (config.TEXT_PROVIDER === \"openai\" && !config.OPENAI_API_KEY) {\n throw new Error('OPENAI_API_KEY is required when TEXT_PROVIDER is set to \"openai\"');\n }\n if (config.TEXT_PROVIDER === \"anthropic\" && !config.ANTHROPIC_API_KEY) {\n throw new Error('ANTHROPIC_API_KEY is required when TEXT_PROVIDER is set to \"anthropic\"');\n }\n if (config.TEXT_PROVIDER === \"openrouter\" && !config.OPENROUTER_API_KEY) {\n throw new Error('OPENROUTER_API_KEY is required when TEXT_PROVIDER is set to \"openrouter\"');\n }\n if (config.TEXT_PROVIDER === \"google\" && !config.GOOGLE_API_KEY) {\n throw new Error('GOOGLE_API_KEY is required when TEXT_PROVIDER is set to \"google\"');\n }\n }\n}\n\nexport async function getProviderRateLimits(runtime?: IAgentRuntime): Promise<ProviderRateLimits> {\n const config = validateModelConfig(runtime);\n\n const rateLimitEnabled = config.RATE_LIMIT_ENABLED;\n const maxConcurrentRequests = config.MAX_CONCURRENT_REQUESTS;\n const requestsPerMinute = config.REQUESTS_PER_MINUTE;\n const tokensPerMinute = config.TOKENS_PER_MINUTE;\n const batchDelayMs = config.BATCH_DELAY_MS;\n\n const primaryProvider = config.TEXT_PROVIDER || config.EMBEDDING_PROVIDER;\n\n if (!rateLimitEnabled) {\n return {\n maxConcurrentRequests,\n requestsPerMinute: Number.MAX_SAFE_INTEGER,\n tokensPerMinute: Number.MAX_SAFE_INTEGER,\n provider: primaryProvider || \"unlimited\",\n rateLimitEnabled: false,\n batchDelayMs,\n };\n }\n\n return {\n maxConcurrentRequests,\n requestsPerMinute,\n tokensPerMinute,\n provider: primaryProvider || \"unlimited\",\n rateLimitEnabled: true,\n batchDelayMs,\n };\n}\n",
8
+ "import type { Content, UUID } from \"@elizaos/core\";\nimport z from \"zod\";\n\n/**\n * Local metadata type for stored knowledge items.\n * Uses a permissive record type to avoid conflicts between TypeScript and protobuf MemoryMetadata types.\n */\nexport type StoredKnowledgeMetadata = Record<string, unknown>;\n\n/**\n * Stored knowledge item with content, metadata, and optional similarity score.\n * Used for knowledge retrieval results and internal knowledge processing.\n * This is a local definition to avoid conflicts with the proto KnowledgeItem type.\n */\nexport interface StoredKnowledgeItem {\n id: UUID;\n content: Content;\n metadata?: StoredKnowledgeMetadata;\n worldId?: UUID;\n similarity?: number;\n}\n\nexport const ModelConfigSchema = z.object({\n EMBEDDING_PROVIDER: z.enum([\"openai\", \"google\"]).optional(),\n TEXT_PROVIDER: z.enum([\"openai\", \"anthropic\", \"openrouter\", \"google\"]).optional(),\n\n OPENAI_API_KEY: z.string().optional(),\n ANTHROPIC_API_KEY: z.string().optional(),\n OPENROUTER_API_KEY: z.string().optional(),\n GOOGLE_API_KEY: z.string().optional(),\n\n OPENAI_BASE_URL: z.string().optional(),\n ANTHROPIC_BASE_URL: z.string().optional(),\n OPENROUTER_BASE_URL: z.string().optional(),\n GOOGLE_BASE_URL: z.string().optional(),\n\n TEXT_EMBEDDING_MODEL: z.string(),\n TEXT_MODEL: z.string().optional(),\n\n MAX_INPUT_TOKENS: z\n .string()\n .or(z.number())\n .transform((val) => (typeof val === \"string\" ? parseInt(val, 10) : val)),\n MAX_OUTPUT_TOKENS: z\n .string()\n .or(z.number())\n .optional()\n .transform((val) => (val ? (typeof val === \"string\" ? parseInt(val, 10) : val) : 4096)),\n\n EMBEDDING_DIMENSION: z\n .string()\n .or(z.number())\n .optional()\n .transform((val) => (val ? (typeof val === \"string\" ? parseInt(val, 10) : val) : 1536)),\n\n LOAD_DOCS_ON_STARTUP: z.boolean().default(false),\n\n CTX_KNOWLEDGE_ENABLED: z.boolean().default(false),\n\n RATE_LIMIT_ENABLED: z.boolean().default(true),\n\n MAX_CONCURRENT_REQUESTS: z\n .string()\n .or(z.number())\n .optional()\n .transform((val) => (val ? (typeof val === \"string\" ? parseInt(val, 10) : val) : 150)),\n\n REQUESTS_PER_MINUTE: z\n .string()\n .or(z.number())\n .optional()\n .transform((val) => (val ? (typeof val === \"string\" ? parseInt(val, 10) : val) : 300)),\n\n TOKENS_PER_MINUTE: z\n .string()\n .or(z.number())\n .optional()\n .transform((val) => (val ? (typeof val === \"string\" ? parseInt(val, 10) : val) : 750000)),\n\n BATCH_DELAY_MS: z\n .string()\n .or(z.number())\n .optional()\n .transform((val) => (val ? (typeof val === \"string\" ? parseInt(val, 10) : val) : 100)),\n});\n\nexport type ModelConfig = z.infer<typeof ModelConfigSchema>;\n\nexport interface ProviderRateLimits {\n maxConcurrentRequests: number;\n requestsPerMinute: number;\n tokensPerMinute?: number;\n provider: string;\n rateLimitEnabled: boolean;\n batchDelayMs: number;\n}\n\nexport interface TextGenerationOptions {\n provider?: \"anthropic\" | \"openai\" | \"openrouter\" | \"google\";\n modelName?: string;\n maxTokens?: number;\n cacheDocument?: string;\n cacheOptions?: {\n type: \"ephemeral\";\n };\n autoCacheContextualRetrieval?: boolean;\n}\n\nexport interface AddKnowledgeOptions {\n agentId?: UUID;\n worldId: UUID;\n roomId: UUID;\n entityId: UUID;\n clientDocumentId: UUID;\n contentType: string;\n originalFilename: string;\n content: string;\n metadata?: Record<string, unknown>;\n}\n\ndeclare module \"@elizaos/core\" {\n interface ServiceTypeRegistry {\n KNOWLEDGE: \"knowledge\";\n }\n}\n\nexport const KnowledgeServiceType = {\n KNOWLEDGE: \"knowledge\" as const,\n} satisfies Partial<import(\"@elizaos/core\").ServiceTypeRegistry>;\n\nexport interface KnowledgeDocumentMetadata extends Record<string, unknown> {\n type: string; // e.g., 'document', 'website_content'\n source: string; // e.g., 'upload', 'web_scrape', path to file\n title?: string;\n filename?: string;\n fileExt?: string;\n fileType?: string; // MIME type\n fileSize?: number;\n}\n\nexport interface KnowledgeConfig {\n CTX_KNOWLEDGE_ENABLED: boolean;\n LOAD_DOCS_ON_STARTUP: boolean;\n MAX_INPUT_TOKENS?: string | number;\n MAX_OUTPUT_TOKENS?: string | number;\n EMBEDDING_PROVIDER?: string;\n TEXT_PROVIDER?: string;\n TEXT_EMBEDDING_MODEL?: string;\n // Rate limiting configuration\n RATE_LIMIT_ENABLED?: boolean;\n MAX_CONCURRENT_REQUESTS?: number;\n REQUESTS_PER_MINUTE?: number;\n TOKENS_PER_MINUTE?: number;\n BATCH_DELAY_MS?: number;\n}\n\nexport interface LoadResult {\n successful: number;\n failed: number;\n errors?: Array<{ filename: string; error: string }>;\n}\n\nexport interface ExtendedMemoryMetadata extends Record<string, unknown> {\n type?: string;\n title?: string;\n filename?: string;\n path?: string;\n description?: string;\n fileExt?: string;\n timestamp?: number;\n contentType?: string;\n documentId?: string;\n source?: string;\n fileType?: string;\n fileSize?: number;\n position?: number; // For fragments\n originalFilename?: string;\n url?: string; // For web content\n}\n",
9
+ "import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { logger, type UUID } from \"@elizaos/core\";\nimport type { KnowledgeService } from \"./service.ts\";\nimport type { AddKnowledgeOptions } from \"./types.ts\";\nimport { isBinaryContentType } from \"./utils.ts\";\n\nexport function getKnowledgePath(runtimePath?: string): string {\n const knowledgePath =\n runtimePath || process.env.KNOWLEDGE_PATH || path.join(process.cwd(), \"docs\");\n const resolvedPath = path.resolve(knowledgePath);\n\n if (!fs.existsSync(resolvedPath)) {\n logger.warn(`Knowledge path does not exist: ${resolvedPath}`);\n if (runtimePath) {\n logger.warn(\"Please create the directory or update KNOWLEDGE_PATH in agent settings\");\n } else if (process.env.KNOWLEDGE_PATH) {\n logger.warn(\"Please create the directory or update KNOWLEDGE_PATH environment variable\");\n } else {\n logger.info(\"To use the knowledge plugin, either:\");\n logger.info('1. Create a \"docs\" folder in your project root');\n logger.info(\"2. Set KNOWLEDGE_PATH in agent settings or environment variable\");\n }\n }\n\n return resolvedPath;\n}\n\nexport async function loadDocsFromPath(\n service: KnowledgeService,\n agentId: UUID,\n worldId?: UUID,\n knowledgePath?: string\n): Promise<{ total: number; successful: number; failed: number }> {\n const docsPath = getKnowledgePath(knowledgePath);\n\n if (!fs.existsSync(docsPath)) {\n logger.warn(`Knowledge path does not exist: ${docsPath}`);\n return { total: 0, successful: 0, failed: 0 };\n }\n\n logger.info(`Loading documents from: ${docsPath}`);\n\n const files = getAllFiles(docsPath);\n\n if (files.length === 0) {\n logger.info(\"No files found in knowledge path\");\n return { total: 0, successful: 0, failed: 0 };\n }\n\n logger.info(`Found ${files.length} files to process`);\n\n let successful = 0;\n let failed = 0;\n\n for (const filePath of files) {\n try {\n const fileName = path.basename(filePath);\n const fileExt = path.extname(filePath).toLowerCase();\n\n if (fileName.startsWith(\".\")) {\n continue;\n }\n\n const contentType = getContentType(fileExt);\n\n if (!contentType) {\n logger.debug(`Skipping unsupported file type: ${filePath}`);\n continue;\n }\n\n const fileBuffer = fs.readFileSync(filePath);\n const isBinary = isBinaryContentType(contentType, fileName);\n const content = isBinary ? fileBuffer.toString(\"base64\") : fileBuffer.toString(\"utf-8\");\n\n const knowledgeOptions: AddKnowledgeOptions = {\n clientDocumentId: \"\" as UUID,\n contentType,\n originalFilename: fileName,\n worldId: worldId || agentId,\n content,\n roomId: agentId,\n entityId: agentId,\n };\n\n logger.debug(`Processing document: ${fileName}`);\n const result = await service.addKnowledge(knowledgeOptions);\n\n logger.info(`✅ \"${fileName}\": ${result.fragmentCount} fragments created`);\n successful++;\n } catch (error) {\n logger.error({ error }, `Failed to process file ${filePath}`);\n failed++;\n }\n }\n\n logger.info(\n `Document loading complete: ${successful} successful, ${failed} failed out of ${files.length} total`\n );\n\n return {\n total: files.length,\n successful,\n failed,\n };\n}\n\nfunction getAllFiles(dirPath: string, files: string[] = []): string[] {\n try {\n const entries = fs.readdirSync(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n if (![\"node_modules\", \".git\", \".vscode\", \"dist\", \"build\"].includes(entry.name)) {\n getAllFiles(fullPath, files);\n }\n } else if (entry.isFile()) {\n files.push(fullPath);\n }\n }\n } catch (error) {\n logger.error({ error }, `Error reading directory ${dirPath}`);\n }\n\n return files;\n}\n\nfunction getContentType(extension: string): string | null {\n const contentTypes: Record<string, string> = {\n \".txt\": \"text/plain\",\n \".md\": \"text/markdown\",\n \".markdown\": \"text/markdown\",\n \".tson\": \"text/plain\",\n \".xml\": \"application/xml\",\n \".csv\": \"text/csv\",\n \".tsv\": \"text/tab-separated-values\",\n \".log\": \"text/plain\",\n\n // Web files\n \".html\": \"text/html\",\n \".htm\": \"text/html\",\n \".css\": \"text/css\",\n \".scss\": \"text/x-scss\",\n \".sass\": \"text/x-sass\",\n \".less\": \"text/x-less\",\n \".js\": \"text/javascript\",\n \".jsx\": \"text/javascript\",\n \".ts\": \"text/typescript\",\n \".tsx\": \"text/typescript\",\n \".mjs\": \"text/javascript\",\n \".cjs\": \"text/javascript\",\n \".vue\": \"text/x-vue\",\n \".svelte\": \"text/x-svelte\",\n \".astro\": \"text/x-astro\",\n\n // Python\n \".py\": \"text/x-python\",\n \".pyw\": \"text/x-python\",\n \".pyi\": \"text/x-python\",\n \".java\": \"text/x-java\",\n \".kt\": \"text/x-kotlin\",\n \".kts\": \"text/x-kotlin\",\n \".scala\": \"text/x-scala\",\n\n // C/C++/C#\n \".c\": \"text/x-c\",\n \".cpp\": \"text/x-c++\",\n \".cc\": \"text/x-c++\",\n \".cxx\": \"text/x-c++\",\n \".h\": \"text/x-c\",\n \".hpp\": \"text/x-c++\",\n \".cs\": \"text/x-csharp\",\n \".php\": \"text/x-php\",\n \".rb\": \"text/x-ruby\",\n \".go\": \"text/x-go\",\n \".rs\": \"text/x-rust\",\n \".swift\": \"text/x-swift\",\n \".r\": \"text/x-r\",\n \".R\": \"text/x-r\",\n \".m\": \"text/x-objectivec\",\n \".mm\": \"text/x-objectivec\",\n \".clj\": \"text/x-clojure\",\n \".cljs\": \"text/x-clojure\",\n \".ex\": \"text/x-elixir\",\n \".exs\": \"text/x-elixir\",\n \".lua\": \"text/x-lua\",\n \".pl\": \"text/x-perl\",\n \".pm\": \"text/x-perl\",\n \".dart\": \"text/x-dart\",\n \".hs\": \"text/x-haskell\",\n \".elm\": \"text/x-elm\",\n \".ml\": \"text/x-ocaml\",\n \".fs\": \"text/x-fsharp\",\n \".fsx\": \"text/x-fsharp\",\n \".vb\": \"text/x-vb\",\n \".pas\": \"text/x-pascal\",\n \".d\": \"text/x-d\",\n \".nim\": \"text/x-nim\",\n \".zig\": \"text/x-zig\",\n \".jl\": \"text/x-julia\",\n \".tcl\": \"text/x-tcl\",\n \".awk\": \"text/x-awk\",\n \".sed\": \"text/x-sed\",\n \".sh\": \"text/x-sh\",\n \".bash\": \"text/x-sh\",\n \".zsh\": \"text/x-sh\",\n \".fish\": \"text/x-fish\",\n \".ps1\": \"text/x-powershell\",\n \".bat\": \"text/x-batch\",\n \".cmd\": \"text/x-batch\",\n \".json\": \"application/json\",\n \".yaml\": \"text/x-yaml\",\n \".yml\": \"text/x-yaml\",\n \".toml\": \"text/x-toml\",\n \".ini\": \"text/x-ini\",\n \".cfg\": \"text/x-ini\",\n \".conf\": \"text/x-ini\",\n \".env\": \"text/plain\",\n \".gitignore\": \"text/plain\",\n \".dockerignore\": \"text/plain\",\n \".editorconfig\": \"text/plain\",\n \".properties\": \"text/x-properties\",\n \".sql\": \"text/x-sql\",\n \".pdf\": \"application/pdf\",\n \".doc\": \"application/msword\",\n \".docx\": \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n };\n\n return contentTypes[extension] || null;\n}\n",
10
+ "import { Buffer } from \"node:buffer\";\nimport { createHash } from \"node:crypto\";\nimport * as mammoth from \"mammoth\";\nimport { extractText } from \"unpdf\";\nimport { v5 as uuidv5 } from \"uuid\";\n\nconst PLAIN_TEXT_CONTENT_TYPES = [\n \"application/typescript\",\n \"text/typescript\",\n \"text/x-python\",\n \"application/x-python-code\",\n \"application/yaml\",\n \"text/yaml\",\n \"application/x-yaml\",\n \"application/json\",\n \"text/markdown\",\n \"text/csv\",\n];\n\nconst MAX_FALLBACK_SIZE_BYTES = 5 * 1024 * 1024;\nconst BINARY_CHECK_BYTES = 1024;\n\nexport async function extractTextFromFileBuffer(\n fileBuffer: Buffer,\n contentType: string,\n originalFilename: string\n): Promise<string> {\n const lowerContentType = contentType.toLowerCase();\n\n if (\n lowerContentType === \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n ) {\n try {\n const result = await mammoth.extractRawText({ buffer: fileBuffer });\n return result.value;\n } catch (docxError) {\n const errorMessage = docxError instanceof Error ? docxError.message : String(docxError);\n throw new Error(`Failed to parse DOCX file ${originalFilename}: ${errorMessage}`);\n }\n } else if (\n lowerContentType === \"application/msword\" ||\n originalFilename.toLowerCase().endsWith(\".doc\")\n ) {\n return `[Microsoft Word Document: ${originalFilename}]\\n\\nThis document was indexed for search but cannot be displayed directly in the browser. The original document content is preserved for retrieval purposes.`;\n } else if (\n lowerContentType.startsWith(\"text/\") ||\n PLAIN_TEXT_CONTENT_TYPES.includes(lowerContentType)\n ) {\n return fileBuffer.toString(\"utf-8\");\n } else {\n if (fileBuffer.length > MAX_FALLBACK_SIZE_BYTES) {\n throw new Error(\n `File ${originalFilename} exceeds maximum size for fallback (${MAX_FALLBACK_SIZE_BYTES} bytes)`\n );\n }\n\n const initialBytes = fileBuffer.subarray(0, Math.min(fileBuffer.length, BINARY_CHECK_BYTES));\n if (initialBytes.includes(0)) {\n throw new Error(`File ${originalFilename} appears to be binary based on initial byte check`);\n }\n\n try {\n const textContent = fileBuffer.toString(\"utf-8\");\n if (textContent.includes(\"\\ufffd\")) {\n throw new Error(\n `File ${originalFilename} seems to be binary or has encoding issues (detected \\ufffd)`\n );\n }\n return textContent;\n } catch (_fallbackError) {\n throw new Error(\n `Unsupported content type: ${contentType} for ${originalFilename}. Fallback to plain text failed`\n );\n }\n }\n}\n\nexport async function convertPdfToTextFromBuffer(\n pdfBuffer: Buffer,\n _filename?: string\n): Promise<string> {\n try {\n const uint8Array = new Uint8Array(\n pdfBuffer.buffer.slice(pdfBuffer.byteOffset, pdfBuffer.byteOffset + pdfBuffer.byteLength)\n );\n\n const result = await extractText(uint8Array, {\n mergePages: true,\n });\n\n if (!result.text || result.text.trim().length === 0) {\n return \"\";\n }\n\n const cleanedText = result.text\n .split(\"\\n\")\n .map((line: string) => line.trim())\n .filter((line: string) => line.length > 0)\n .join(\"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\");\n\n return cleanedText;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to convert PDF to text: ${errorMessage}`);\n }\n}\n\nexport function isBinaryContentType(contentType: string, filename: string): boolean {\n const textContentTypes = [\n \"text/\",\n \"application/json\",\n \"application/xml\",\n \"application/javascript\",\n \"application/typescript\",\n \"application/x-yaml\",\n \"application/x-sh\",\n ];\n\n const isTextMimeType = textContentTypes.some((type) => contentType.includes(type));\n if (isTextMimeType) {\n return false;\n }\n\n const binaryContentTypes = [\n \"application/pdf\",\n \"application/msword\",\n \"application/vnd.openxmlformats-officedocument\",\n \"application/vnd.ms-excel\",\n \"application/vnd.ms-powerpoint\",\n \"application/zip\",\n \"application/x-zip-compressed\",\n \"application/octet-stream\",\n \"image/\",\n \"audio/\",\n \"video/\",\n ];\n\n const isBinaryMimeType = binaryContentTypes.some((type) => contentType.includes(type));\n\n if (isBinaryMimeType) {\n return true;\n }\n\n const fileExt = filename.split(\".\").pop()?.toLowerCase() || \"\";\n\n const textExtensions = [\n \"txt\",\n \"md\",\n \"markdown\",\n \"json\",\n \"xml\",\n \"html\",\n \"htm\",\n \"css\",\n \"js\",\n \"ts\",\n \"jsx\",\n \"tsx\",\n \"yaml\",\n \"yml\",\n \"toml\",\n \"ini\",\n \"cfg\",\n \"conf\",\n \"sh\",\n \"bash\",\n \"zsh\",\n \"fish\",\n \"py\",\n \"rb\",\n \"go\",\n \"rs\",\n \"java\",\n \"c\",\n \"cpp\",\n \"h\",\n \"hpp\",\n \"cs\",\n \"php\",\n \"sql\",\n \"r\",\n \"swift\",\n \"kt\",\n \"scala\",\n \"clj\",\n \"ex\",\n \"exs\",\n \"vim\",\n \"env\",\n \"gitignore\",\n \"dockerignore\",\n \"editorconfig\",\n \"log\",\n \"csv\",\n \"tsv\",\n \"properties\",\n \"gradle\",\n \"sbt\",\n \"makefile\",\n \"dockerfile\",\n \"vagrantfile\",\n \"gemfile\",\n \"rakefile\",\n \"podfile\",\n \"csproj\",\n \"vbproj\",\n \"fsproj\",\n \"sln\",\n \"pom\",\n ];\n\n if (textExtensions.includes(fileExt)) {\n return false;\n }\n\n const binaryExtensions = [\n \"pdf\",\n \"docx\",\n \"doc\",\n \"xls\",\n \"xlsx\",\n \"ppt\",\n \"pptx\",\n \"zip\",\n \"rar\",\n \"7z\",\n \"tar\",\n \"gz\",\n \"bz2\",\n \"xz\",\n \"jpg\",\n \"jpeg\",\n \"png\",\n \"gif\",\n \"bmp\",\n \"svg\",\n \"ico\",\n \"webp\",\n \"mp3\",\n \"mp4\",\n \"avi\",\n \"mov\",\n \"wmv\",\n \"flv\",\n \"wav\",\n \"flac\",\n \"ogg\",\n \"exe\",\n \"dll\",\n \"so\",\n \"dylib\",\n \"bin\",\n \"dat\",\n \"db\",\n \"sqlite\",\n ];\n\n return binaryExtensions.includes(fileExt);\n}\n\nexport function normalizeS3Url(url: string): string {\n try {\n const urlObj = new URL(url);\n return `${urlObj.origin}${urlObj.pathname}`;\n } catch {\n return url;\n }\n}\n\nexport async function fetchUrlContent(\n url: string\n): Promise<{ content: string; contentType: string }> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 30000);\n\n const response = await fetch(url, {\n signal: controller.signal,\n headers: {\n \"User-Agent\": \"Eliza-Knowledge-Plugin/1.0\",\n },\n });\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch URL: ${response.status} ${response.statusText}`);\n }\n\n const contentType = response.headers.get(\"content-type\") || \"application/octet-stream\";\n const arrayBuffer = await response.arrayBuffer();\n const buffer = Buffer.from(arrayBuffer);\n const base64Content = buffer.toString(\"base64\");\n\n return {\n content: base64Content,\n contentType,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to fetch content from URL: ${errorMessage}`);\n }\n}\n\nexport function looksLikeBase64(content?: string | null): boolean {\n if (!content || content.length === 0) return false;\n\n const cleanContent = content.replace(/\\s/g, \"\");\n\n if (cleanContent.length < 16) return false;\n\n if (cleanContent.length % 4 !== 0) return false;\n\n const base64Regex = /^[A-Za-z0-9+/]*={0,2}$/;\n if (!base64Regex.test(cleanContent)) return false;\n\n const hasNumbers = /\\d/.test(cleanContent);\n const hasUpperCase = /[A-Z]/.test(cleanContent);\n const hasLowerCase = /[a-z]/.test(cleanContent);\n\n return (hasNumbers || hasUpperCase) && hasLowerCase;\n}\n\nexport function generateContentBasedId(\n content: string,\n agentId: string,\n options?: {\n maxChars?: number;\n includeFilename?: string;\n contentType?: string;\n }\n): string {\n const { maxChars = 2000, includeFilename, contentType } = options || {};\n\n let contentForHashing: string;\n\n if (looksLikeBase64(content)) {\n try {\n const decoded = Buffer.from(content, \"base64\").toString(\"utf8\");\n if (!decoded.includes(\"\\ufffd\") || contentType?.includes(\"pdf\")) {\n contentForHashing = content.slice(0, maxChars);\n } else {\n contentForHashing = decoded.slice(0, maxChars);\n }\n } catch {\n contentForHashing = content.slice(0, maxChars);\n }\n } else {\n contentForHashing = content.slice(0, maxChars);\n }\n\n contentForHashing = contentForHashing\n .replace(/\\r\\n/g, \"\\n\") // Normalize line endings\n .replace(/\\r/g, \"\\n\")\n .trim();\n\n const componentsToHash = [agentId, contentForHashing, includeFilename || \"\"]\n .filter(Boolean)\n .join(\"::\");\n\n const hash = createHash(\"sha256\").update(componentsToHash).digest(\"hex\");\n\n const DOCUMENT_NAMESPACE = \"6ba7b810-9dad-11d1-80b4-00c04fd430c8\";\n\n return uuidv5(hash, DOCUMENT_NAMESPACE);\n}\n\nexport function extractFirstLines(content: string, maxLines: number = 10): string {\n const lines = content.split(/\\r?\\n/);\n return lines.slice(0, maxLines).join(\"\\n\");\n}\n",
11
+ "import { randomUUID } from 'node:crypto';\nexport default { randomUUID };\n",
12
+ "import { randomFillSync } from 'node:crypto';\nconst rnds8Pool = new Uint8Array(256);\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n return rnds8Pool.slice(poolPtr, (poolPtr += 16));\n}\n",
13
+ "export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i;\n",
14
+ "import REGEX from './regex.js';\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\nexport default validate;\n",
15
+ "import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n",
16
+ "import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction _v4(options, buf, offset) {\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n return _v4(options, buf, offset);\n}\nexport default v4;\n",
17
+ "import { createHash } from 'node:crypto';\nfunction sha1(bytes) {\n if (Array.isArray(bytes)) {\n bytes = Buffer.from(bytes);\n }\n else if (typeof bytes === 'string') {\n bytes = Buffer.from(bytes, 'utf8');\n }\n return createHash('sha1').update(bytes).digest();\n}\nexport default sha1;\n",
18
+ "import validate from './validate.js';\nfunction parse(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n let v;\n return Uint8Array.of((v = parseInt(uuid.slice(0, 8), 16)) >>> 24, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff, (v = parseInt(uuid.slice(9, 13), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(14, 18), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(19, 23), 16)) >>> 8, v & 0xff, ((v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000) & 0xff, (v / 0x100000000) & 0xff, (v >>> 24) & 0xff, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff);\n}\nexport default parse;\n",
19
+ "import parse from './parse.js';\nimport { unsafeStringify } from './stringify.js';\nexport function stringToBytes(str) {\n str = unescape(encodeURIComponent(str));\n const bytes = new Uint8Array(str.length);\n for (let i = 0; i < str.length; ++i) {\n bytes[i] = str.charCodeAt(i);\n }\n return bytes;\n}\nexport const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexport const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexport default function v35(version, hash, value, namespace, buf, offset) {\n const valueBytes = typeof value === 'string' ? stringToBytes(value) : value;\n const namespaceBytes = typeof namespace === 'string' ? parse(namespace) : namespace;\n if (typeof namespace === 'string') {\n namespace = parse(namespace);\n }\n if (namespace?.length !== 16) {\n throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n }\n let bytes = new Uint8Array(16 + valueBytes.length);\n bytes.set(namespaceBytes);\n bytes.set(valueBytes, namespaceBytes.length);\n bytes = hash(bytes);\n bytes[6] = (bytes[6] & 0x0f) | version;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n return buf;\n }\n return unsafeStringify(bytes);\n}\n",
20
+ "import sha1 from './sha1.js';\nimport v35, { DNS, URL } from './v35.js';\nexport { DNS, URL } from './v35.js';\nfunction v5(value, namespace, buf, offset) {\n return v35(0x50, sha1, value, namespace, buf, offset);\n}\nv5.DNS = DNS;\nv5.URL = URL;\nexport default v5;\n",
21
+ "import type { Buffer } from \"node:buffer\";\nimport {\n type CustomMetadata,\n type IAgentRuntime,\n logger,\n type Memory,\n MemoryType,\n ModelType,\n splitChunks,\n type UUID,\n} from \"@elizaos/core\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { getProviderRateLimits, validateModelConfig } from \"./config.ts\";\nimport {\n DEFAULT_CHUNK_OVERLAP_TOKENS,\n DEFAULT_CHUNK_TOKEN_SIZE,\n getCachingContextualizationPrompt,\n getCachingPromptForMimeType,\n getChunkWithContext,\n getContextualizationPrompt,\n getPromptForMimeType,\n} from \"./ctx-embeddings.ts\";\nimport { generateText } from \"./llm.ts\";\nimport { convertPdfToTextFromBuffer, extractTextFromFileBuffer } from \"./utils.ts\";\n\nfunction estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\nfunction getCtxKnowledgeEnabled(runtime?: IAgentRuntime): boolean {\n let result: boolean;\n let _source: string;\n let rawValue: string | undefined;\n\n if (runtime) {\n const settingValue = runtime.getSetting(\"CTX_KNOWLEDGE_ENABLED\");\n rawValue = typeof settingValue === \"string\" ? settingValue : settingValue?.toString();\n const cleanValue = rawValue?.trim().toLowerCase();\n result = cleanValue === \"true\";\n } else {\n rawValue = process.env.CTX_KNOWLEDGE_ENABLED;\n const cleanValue = rawValue?.toString().trim().toLowerCase();\n result = cleanValue === \"true\";\n }\n\n return result;\n}\n\nfunction shouldUseCustomLLM(): boolean {\n const textProvider = process.env.TEXT_PROVIDER;\n const textModel = process.env.TEXT_MODEL;\n\n if (!textProvider || !textModel) {\n return false;\n }\n\n switch (textProvider.toLowerCase()) {\n case \"openrouter\":\n return !!process.env.OPENROUTER_API_KEY;\n case \"openai\":\n return !!process.env.OPENAI_API_KEY;\n case \"anthropic\":\n return !!process.env.ANTHROPIC_API_KEY;\n case \"google\":\n return !!process.env.GOOGLE_API_KEY;\n default:\n return false;\n }\n}\n\nconst useCustomLLM = shouldUseCustomLLM();\n\nexport async function processFragmentsSynchronously({\n runtime,\n documentId,\n fullDocumentText,\n agentId,\n contentType,\n roomId,\n entityId,\n worldId,\n documentTitle,\n}: {\n runtime: IAgentRuntime;\n documentId: UUID;\n fullDocumentText: string;\n agentId: UUID;\n contentType?: string;\n roomId?: UUID;\n entityId?: UUID;\n worldId?: UUID;\n documentTitle?: string;\n}): Promise<number> {\n if (!fullDocumentText || fullDocumentText.trim() === \"\") {\n logger.warn(`No text content available for document ${documentId}`);\n return 0;\n }\n\n const chunks = await splitDocumentIntoChunks(fullDocumentText);\n\n if (chunks.length === 0) {\n logger.warn(`No chunks generated for document ${documentId}`);\n return 0;\n }\n\n logger.info(`Split into ${chunks.length} chunks`);\n\n const providerLimits = await getProviderRateLimits(runtime);\n const CONCURRENCY_LIMIT = providerLimits.maxConcurrentRequests || 30;\n const rateLimiter = createRateLimiter(\n providerLimits.requestsPerMinute || 60,\n providerLimits.tokensPerMinute,\n providerLimits.rateLimitEnabled\n );\n\n // Process and save fragments\n const { savedCount, failedCount } = await processAndSaveFragments({\n runtime,\n documentId,\n chunks,\n fullDocumentText,\n contentType,\n agentId,\n roomId: roomId || agentId,\n entityId: entityId || agentId,\n worldId: worldId || agentId,\n concurrencyLimit: CONCURRENCY_LIMIT,\n rateLimiter,\n documentTitle,\n batchDelayMs: providerLimits.batchDelayMs,\n });\n\n if (failedCount > 0) {\n logger.warn(`${failedCount}/${chunks.length} chunks failed processing`);\n }\n\n return savedCount;\n}\n\nexport async function extractTextFromDocument(\n fileBuffer: Buffer,\n contentType: string,\n originalFilename: string\n): Promise<string> {\n if (!fileBuffer || fileBuffer.length === 0) {\n throw new Error(`Empty file buffer provided for ${originalFilename}`);\n }\n\n try {\n if (contentType === \"application/pdf\") {\n logger.debug(`Extracting text from PDF: ${originalFilename}`);\n return await convertPdfToTextFromBuffer(fileBuffer, originalFilename);\n } else {\n if (\n contentType.includes(\"text/\") ||\n contentType.includes(\"application/json\") ||\n contentType.includes(\"application/xml\")\n ) {\n try {\n return fileBuffer.toString(\"utf8\");\n } catch (_textError) {\n logger.warn(`Failed to decode ${originalFilename} as UTF-8`);\n }\n }\n\n return await extractTextFromFileBuffer(fileBuffer, contentType, originalFilename);\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(`Error extracting text from ${originalFilename}: ${errorMessage}`);\n throw new Error(`Failed to extract text from ${originalFilename}: ${errorMessage}`);\n }\n}\n\nexport function createDocumentMemory({\n text,\n agentId,\n clientDocumentId,\n originalFilename,\n contentType,\n worldId,\n fileSize,\n documentId,\n customMetadata,\n}: {\n text: string;\n agentId: UUID;\n clientDocumentId: UUID;\n originalFilename: string;\n contentType: string;\n worldId: UUID;\n fileSize: number;\n documentId?: UUID;\n customMetadata?: Record<string, unknown>;\n}): Memory {\n const fileExt = originalFilename.split(\".\").pop()?.toLowerCase() || \"\";\n const title = originalFilename.replace(`.${fileExt}`, \"\");\n const docId = documentId || (uuidv4() as UUID);\n\n return {\n id: docId,\n agentId,\n roomId: agentId,\n worldId,\n entityId: agentId,\n content: { text },\n metadata: {\n type: MemoryType.CUSTOM,\n documentId: clientDocumentId,\n originalFilename,\n contentType,\n title,\n fileExt,\n fileSize,\n source: \"rag-service-main-upload\",\n timestamp: Date.now(),\n ...(customMetadata || {}),\n } satisfies CustomMetadata,\n };\n}\n\nasync function splitDocumentIntoChunks(documentText: string): Promise<string[]> {\n const tokenChunkSize = DEFAULT_CHUNK_TOKEN_SIZE;\n const tokenChunkOverlap = DEFAULT_CHUNK_OVERLAP_TOKENS;\n\n return await splitChunks(documentText, tokenChunkSize, tokenChunkOverlap);\n}\n\nasync function processAndSaveFragments({\n runtime,\n documentId,\n chunks,\n fullDocumentText,\n contentType,\n agentId,\n roomId,\n entityId,\n worldId,\n concurrencyLimit,\n rateLimiter,\n documentTitle,\n batchDelayMs = 500,\n}: {\n runtime: IAgentRuntime;\n documentId: UUID;\n chunks: string[];\n fullDocumentText: string;\n contentType?: string;\n agentId: UUID;\n roomId?: UUID;\n entityId?: UUID;\n worldId?: UUID;\n concurrencyLimit: number;\n rateLimiter: (estimatedTokens?: number) => Promise<void>;\n documentTitle?: string;\n batchDelayMs?: number;\n}): Promise<{\n savedCount: number;\n failedCount: number;\n failedChunks: number[];\n}> {\n let savedCount = 0;\n let failedCount = 0;\n const failedChunks: number[] = [];\n\n for (let i = 0; i < chunks.length; i += concurrencyLimit) {\n const batchChunks = chunks.slice(i, i + concurrencyLimit);\n const batchOriginalIndices = Array.from({ length: batchChunks.length }, (_, k) => i + k);\n\n const contextualizedChunks = await getContextualizedChunks(\n runtime,\n fullDocumentText,\n batchChunks,\n contentType,\n batchOriginalIndices,\n documentTitle\n );\n\n const embeddingResults = await generateEmbeddingsForChunks(\n runtime,\n contextualizedChunks,\n rateLimiter\n );\n\n for (const result of embeddingResults) {\n const originalChunkIndex = result.index;\n\n if (!result.success) {\n failedCount++;\n failedChunks.push(originalChunkIndex);\n logger.warn(`Failed to process chunk ${originalChunkIndex} for document ${documentId}`);\n continue;\n }\n\n const contextualizedChunkText = result.text;\n const embedding = result.embedding;\n\n if (!embedding || embedding.length === 0) {\n failedCount++;\n failedChunks.push(originalChunkIndex);\n continue;\n }\n\n try {\n const fragmentMemory: Memory = {\n id: uuidv4() as UUID,\n agentId,\n roomId: roomId || agentId,\n worldId: worldId || agentId,\n entityId: entityId || agentId,\n embedding,\n content: { text: contextualizedChunkText },\n metadata: {\n type: MemoryType.FRAGMENT,\n documentId,\n position: originalChunkIndex,\n timestamp: Date.now(),\n source: \"rag-service-fragment-sync\",\n },\n };\n\n await runtime.createMemory(fragmentMemory, \"knowledge\");\n savedCount++;\n } catch (saveError) {\n const errorMessage = saveError instanceof Error ? saveError.message : String(saveError);\n logger.error(`Error saving chunk ${originalChunkIndex} to database: ${errorMessage}`);\n failedCount++;\n failedChunks.push(originalChunkIndex);\n }\n }\n\n if (i + concurrencyLimit < chunks.length && batchDelayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, batchDelayMs));\n }\n }\n\n return { savedCount, failedCount, failedChunks };\n}\n\nconst EMBEDDING_BATCH_SIZE = 100;\n\ninterface EmbeddingResult {\n embedding?: number[];\n success: boolean;\n index: number;\n error?: Error;\n text: string;\n}\n\nasync function generateEmbeddingsForChunks(\n runtime: IAgentRuntime,\n contextualizedChunks: Array<{\n contextualizedText: string;\n index: number;\n success: boolean;\n }>,\n rateLimiter: (estimatedTokens?: number) => Promise<void>\n): Promise<Array<EmbeddingResult>> {\n const validChunks = contextualizedChunks.filter((chunk) => chunk.success);\n const failedChunks = contextualizedChunks.filter((chunk) => !chunk.success);\n\n const results: Array<EmbeddingResult> = [];\n for (const chunk of failedChunks) {\n results.push({\n success: false,\n index: chunk.index,\n error: new Error(\"Chunk processing failed\"),\n text: chunk.contextualizedText,\n });\n }\n\n if (validChunks.length === 0) {\n return results;\n }\n\n const useBatchEmbeddings = shouldUseBatchEmbeddings(runtime);\n\n if (useBatchEmbeddings) {\n return await generateEmbeddingsBatch(runtime, validChunks, rateLimiter, results);\n } else {\n return await generateEmbeddingsIndividual(runtime, validChunks, rateLimiter, results);\n }\n}\n\nfunction shouldUseBatchEmbeddings(runtime: IAgentRuntime): boolean {\n const setting = runtime.getSetting(\"BATCH_EMBEDDINGS\") ?? process.env.BATCH_EMBEDDINGS;\n // Default to false — batch embeddings require a cloud provider that\n // supports the batch API. Local embedding (the default) only handles\n // single texts. Opt-in with BATCH_EMBEDDINGS=true.\n return setting === \"true\" || setting === true;\n}\n\nasync function generateEmbeddingsBatch(\n runtime: IAgentRuntime,\n validChunks: Array<{ contextualizedText: string; index: number; success: boolean }>,\n rateLimiter: (estimatedTokens?: number) => Promise<void>,\n results: Array<EmbeddingResult>\n): Promise<Array<EmbeddingResult>> {\n for (let batchStart = 0; batchStart < validChunks.length; batchStart += EMBEDDING_BATCH_SIZE) {\n const batchEnd = Math.min(batchStart + EMBEDDING_BATCH_SIZE, validChunks.length);\n const batch = validChunks.slice(batchStart, batchEnd);\n const batchTexts = batch.map((c) => c.contextualizedText);\n\n const totalTokens = batchTexts.reduce((sum, text) => sum + estimateTokens(text), 0);\n await rateLimiter(totalTokens);\n\n try {\n const embeddings = await generateBatchEmbeddingsViaRuntime(runtime, batchTexts);\n\n for (let i = 0; i < batch.length; i++) {\n const chunk = batch[i];\n const embedding = embeddings[i];\n\n if (embedding && embedding.length > 0 && embedding[0] !== 0) {\n results.push({\n embedding,\n success: true,\n index: chunk.index,\n text: chunk.contextualizedText,\n });\n } else {\n results.push({\n success: false,\n index: chunk.index,\n error: new Error(\"Empty or invalid embedding returned\"),\n text: chunk.contextualizedText,\n });\n }\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(`Batch embedding error: ${errorMessage}`);\n for (const chunk of batch) {\n try {\n const result = await generateEmbeddingWithValidation(runtime, chunk.contextualizedText);\n if (result.success && result.embedding) {\n results.push({\n embedding: result.embedding,\n success: true,\n index: chunk.index,\n text: chunk.contextualizedText,\n });\n } else {\n results.push({\n success: false,\n index: chunk.index,\n error: result.error instanceof Error ? result.error : new Error(\"Embedding failed\"),\n text: chunk.contextualizedText,\n });\n }\n } catch (fallbackError) {\n results.push({\n success: false,\n index: chunk.index,\n error:\n fallbackError instanceof Error ? fallbackError : new Error(String(fallbackError)),\n text: chunk.contextualizedText,\n });\n }\n }\n }\n }\n\n return results;\n}\n\nasync function generateBatchEmbeddingsViaRuntime(\n runtime: IAgentRuntime,\n texts: string[]\n): Promise<number[][]> {\n const batchResult = await runtime.useModel(ModelType.TEXT_EMBEDDING, { texts } as {\n text: string;\n } & { texts: string[] });\n\n const isEmbeddingBatch = (val: unknown): val is number[][] =>\n Array.isArray(val) && val.length > 0 && Array.isArray(val[0]) && typeof val[0][0] === \"number\";\n\n const isEmbeddingVector = (val: unknown): val is number[] =>\n Array.isArray(val) && val.length > 0 && typeof val[0] === \"number\";\n\n if (isEmbeddingBatch(batchResult)) {\n return batchResult;\n }\n\n if (isEmbeddingVector(batchResult)) {\n const embeddings: number[][] = await Promise.all(\n texts.map(async (text) => {\n const result = await runtime.useModel(ModelType.TEXT_EMBEDDING, { text });\n if (isEmbeddingVector(result)) {\n return result;\n }\n const embeddingResult = result as { embedding?: number[] } | undefined;\n return embeddingResult?.embedding ?? [];\n })\n );\n return embeddings;\n }\n\n throw new Error(\"Unexpected batch embedding result format\");\n}\n\nasync function generateEmbeddingsIndividual(\n runtime: IAgentRuntime,\n validChunks: Array<{ contextualizedText: string; index: number; success: boolean }>,\n rateLimiter: (estimatedTokens?: number) => Promise<void>,\n results: Array<EmbeddingResult>\n): Promise<Array<EmbeddingResult>> {\n for (const chunk of validChunks) {\n const embeddingTokens = estimateTokens(chunk.contextualizedText);\n await rateLimiter(embeddingTokens);\n\n try {\n const generateEmbeddingOperation = async () => {\n return await generateEmbeddingWithValidation(runtime, chunk.contextualizedText);\n };\n\n const { embedding, success, error } = await withRateLimitRetry(\n generateEmbeddingOperation,\n `embedding generation for chunk ${chunk.index}`\n );\n\n if (!success) {\n results.push({\n success: false,\n index: chunk.index,\n error,\n text: chunk.contextualizedText,\n });\n } else {\n results.push({\n embedding: embedding ?? undefined,\n success: true,\n index: chunk.index,\n text: chunk.contextualizedText,\n });\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(`Error generating embedding for chunk ${chunk.index}: ${errorMessage}`);\n results.push({\n success: false,\n index: chunk.index,\n error: error instanceof Error ? error : new Error(String(error)),\n text: chunk.contextualizedText,\n });\n }\n }\n\n return results;\n}\n\nasync function getContextualizedChunks(\n runtime: IAgentRuntime,\n fullDocumentText: string | undefined,\n chunks: string[],\n contentType: string | undefined,\n batchOriginalIndices: number[],\n documentTitle?: string\n): Promise<Array<{ contextualizedText: string; index: number; success: boolean }>> {\n const ctxEnabled = getCtxKnowledgeEnabled(runtime);\n\n if (ctxEnabled && fullDocumentText) {\n return await generateContextsInBatch(\n runtime,\n fullDocumentText,\n chunks,\n contentType,\n batchOriginalIndices,\n documentTitle\n );\n }\n\n return chunks.map((chunkText, idx) => ({\n contextualizedText: chunkText,\n index: batchOriginalIndices[idx],\n success: true,\n }));\n}\n\nasync function generateContextsInBatch(\n runtime: IAgentRuntime,\n fullDocumentText: string,\n chunks: string[],\n contentType?: string,\n batchIndices?: number[],\n _documentTitle?: string\n): Promise<Array<{ contextualizedText: string; success: boolean; index: number }>> {\n if (!chunks || chunks.length === 0) {\n return [];\n }\n\n const providerLimits = await getProviderRateLimits(runtime);\n const rateLimiter = createRateLimiter(\n providerLimits.requestsPerMinute || 60,\n providerLimits.tokensPerMinute,\n providerLimits.rateLimitEnabled\n );\n\n const config = validateModelConfig(runtime);\n const isUsingOpenRouter = config.TEXT_PROVIDER === \"openrouter\";\n const isUsingCacheCapableModel =\n isUsingOpenRouter &&\n (config.TEXT_MODEL?.toLowerCase().includes(\"claude\") ||\n config.TEXT_MODEL?.toLowerCase().includes(\"gemini\"));\n\n logger.debug(\n `Contextualizing ${chunks.length} chunks with ${config.TEXT_PROVIDER}/${config.TEXT_MODEL} (cache: ${isUsingCacheCapableModel})`\n );\n\n const promptConfigs = prepareContextPrompts(\n chunks,\n fullDocumentText,\n contentType,\n batchIndices,\n isUsingCacheCapableModel\n );\n\n const contextualizedChunks = await Promise.all(\n promptConfigs.map(async (item) => {\n if (!item.valid) {\n return {\n contextualizedText: item.chunkText,\n success: false,\n index: item.originalIndex,\n };\n }\n\n const llmTokens = estimateTokens(item.chunkText + (item.prompt || \"\"));\n await rateLimiter(llmTokens);\n\n try {\n const generateTextOperation = async () => {\n if (useCustomLLM) {\n if (item.usesCaching && item.promptText) {\n return await generateText(runtime, item.promptText, item.systemPrompt, {\n cacheDocument: item.fullDocumentTextForContext,\n cacheOptions: { type: \"ephemeral\" },\n autoCacheContextualRetrieval: true,\n });\n } else if (item.prompt) {\n return await generateText(runtime, item.prompt);\n }\n throw new Error(\"Missing prompt for text generation\");\n } else {\n if (item.usesCaching && item.promptText) {\n const combinedPrompt = item.systemPrompt\n ? `${item.systemPrompt}\\n\\n${item.promptText}`\n : item.promptText;\n return await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt: combinedPrompt,\n });\n } else if (item.prompt) {\n return await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt: item.prompt,\n });\n }\n throw new Error(\"Missing prompt for text generation\");\n }\n };\n\n const llmResponse = await withRateLimitRetry(\n generateTextOperation,\n `context generation for chunk ${item.originalIndex}`\n );\n\n const generatedContext = typeof llmResponse === \"string\" ? llmResponse : llmResponse.text;\n const contextualizedText = getChunkWithContext(item.chunkText, generatedContext);\n\n return {\n contextualizedText,\n success: true,\n index: item.originalIndex,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(`Error generating context for chunk ${item.originalIndex}: ${errorMessage}`);\n return {\n contextualizedText: item.chunkText,\n success: false,\n index: item.originalIndex,\n };\n }\n })\n );\n\n return contextualizedChunks;\n}\n\ninterface ContextPromptConfig {\n valid: boolean;\n originalIndex: number;\n chunkText: string;\n usesCaching: boolean;\n prompt?: string | null;\n systemPrompt?: string;\n promptText?: string;\n fullDocumentTextForContext?: string;\n}\n\nfunction prepareContextPrompts(\n chunks: string[],\n fullDocumentText: string,\n contentType?: string,\n batchIndices?: number[],\n isUsingCacheCapableModel = false\n): Array<ContextPromptConfig> {\n return chunks.map((chunkText, idx) => {\n const originalIndex = batchIndices ? batchIndices[idx] : idx;\n try {\n if (isUsingCacheCapableModel) {\n const cachingPromptInfo = contentType\n ? getCachingPromptForMimeType(contentType, chunkText)\n : getCachingContextualizationPrompt(chunkText);\n\n if (cachingPromptInfo.prompt.startsWith(\"Error:\")) {\n return {\n originalIndex,\n chunkText,\n valid: false,\n usesCaching: false,\n };\n }\n\n return {\n valid: true,\n originalIndex,\n chunkText,\n usesCaching: true,\n systemPrompt: cachingPromptInfo.systemPrompt,\n promptText: cachingPromptInfo.prompt,\n fullDocumentTextForContext: fullDocumentText,\n };\n } else {\n const prompt = contentType\n ? getPromptForMimeType(contentType, fullDocumentText, chunkText)\n : getContextualizationPrompt(fullDocumentText, chunkText);\n\n if (prompt.startsWith(\"Error:\")) {\n return {\n prompt: null,\n originalIndex,\n chunkText,\n valid: false,\n usesCaching: false,\n };\n }\n\n return {\n prompt,\n originalIndex,\n chunkText,\n valid: true,\n usesCaching: false,\n };\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(`Error preparing prompt for chunk ${originalIndex}: ${errorMessage}`);\n return {\n prompt: null,\n originalIndex,\n chunkText,\n valid: false,\n usesCaching: false,\n };\n }\n });\n}\n\nasync function generateEmbeddingWithValidation(\n runtime: IAgentRuntime,\n text: string\n): Promise<{\n embedding: number[] | null;\n success: boolean;\n error?: Error;\n}> {\n try {\n const embeddingResult = await runtime.useModel(ModelType.TEXT_EMBEDDING, { text });\n\n const embedding = Array.isArray(embeddingResult)\n ? embeddingResult\n : (embeddingResult as { embedding: number[] })?.embedding;\n\n if (!embedding || embedding.length === 0) {\n return { embedding: null, success: false, error: new Error(\"Zero vector detected\") };\n }\n\n return { embedding, success: true };\n } catch (error) {\n return {\n embedding: null,\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n}\n\nasync function withRateLimitRetry<T>(\n operation: () => Promise<T>,\n errorContext: string,\n retryDelay?: number\n): Promise<T> {\n try {\n return await operation();\n } catch (error) {\n const errorWithStatus = error as { status?: number; headers?: { \"retry-after\"?: number } };\n if (errorWithStatus.status === 429) {\n const delay = retryDelay || errorWithStatus.headers?.[\"retry-after\"] || 5;\n await new Promise((resolve) => setTimeout(resolve, delay * 1000));\n\n try {\n return await operation();\n } catch (retryError) {\n const retryErrorMessage =\n retryError instanceof Error ? retryError.message : String(retryError);\n logger.error(`Failed after retry for ${errorContext}: ${retryErrorMessage}`);\n throw retryError;\n }\n }\n throw error;\n }\n}\n\nfunction createRateLimiter(\n requestsPerMinute: number,\n tokensPerMinute?: number,\n rateLimitEnabled: boolean = true\n) {\n const requestTimes: number[] = [];\n const tokenUsage: Array<{ timestamp: number; tokens: number }> = [];\n const intervalMs = 60 * 1000;\n\n return async function rateLimiter(estimatedTokens: number = 1000) {\n if (!rateLimitEnabled) return;\n\n const now = Date.now();\n\n while (requestTimes.length > 0 && now - requestTimes[0] > intervalMs) {\n requestTimes.shift();\n }\n while (tokenUsage.length > 0 && now - tokenUsage[0].timestamp > intervalMs) {\n tokenUsage.shift();\n }\n\n const currentTokens = tokenUsage.reduce((sum, usage) => sum + usage.tokens, 0);\n const requestLimitExceeded = requestTimes.length >= requestsPerMinute;\n const tokenLimitExceeded = tokensPerMinute && currentTokens + estimatedTokens > tokensPerMinute;\n\n if (requestLimitExceeded || tokenLimitExceeded) {\n let timeToWait = 0;\n if (requestLimitExceeded) {\n timeToWait = Math.max(timeToWait, requestTimes[0] + intervalMs - now);\n }\n if (tokenLimitExceeded && tokenUsage.length > 0) {\n timeToWait = Math.max(timeToWait, tokenUsage[0].timestamp + intervalMs - now);\n }\n if (timeToWait > 0) {\n await new Promise((resolve) => setTimeout(resolve, timeToWait));\n }\n }\n\n requestTimes.push(now);\n if (tokensPerMinute) {\n tokenUsage.push({ timestamp: now, tokens: estimatedTokens });\n }\n };\n}\n",
22
+ "export const DEFAULT_CHUNK_TOKEN_SIZE = 500;\nexport const DEFAULT_CHUNK_OVERLAP_TOKENS = 100;\nexport const DEFAULT_CHARS_PER_TOKEN = 3.5;\n\nexport const CONTEXT_TARGETS = {\n DEFAULT: {\n MIN_TOKENS: 60,\n MAX_TOKENS: 120,\n },\n PDF: {\n MIN_TOKENS: 80,\n MAX_TOKENS: 150,\n },\n MATH_PDF: {\n MIN_TOKENS: 100,\n MAX_TOKENS: 180,\n },\n CODE: {\n MIN_TOKENS: 100,\n MAX_TOKENS: 200,\n },\n TECHNICAL: {\n MIN_TOKENS: 80,\n MAX_TOKENS: 160,\n },\n};\n\nexport const SYSTEM_PROMPT =\n \"You are a precision text augmentation tool. Your task is to expand a given text chunk with its direct context from a larger document. You must: 1) Keep the original chunk intact; 2) Add critical context from surrounding text; 3) Never summarize or rephrase the original chunk; 4) Create contextually rich output for improved semantic retrieval.\";\n\nexport const SYSTEM_PROMPTS = {\n DEFAULT:\n \"You are a precision text augmentation tool. Your task is to expand a given text chunk with its direct context from a larger document. You must: 1) Keep the original chunk intact; 2) Add critical context from surrounding text; 3) Never summarize or rephrase the original chunk; 4) Create contextually rich output for improved semantic retrieval.\",\n\n CODE: \"You are a precision code augmentation tool. Your task is to expand a given code chunk with necessary context from the larger codebase. You must: 1) Keep the original code chunk intact with exact syntax and indentation; 2) Add relevant imports, function signatures, or class definitions; 3) Include critical surrounding code context; 4) Create contextually rich output that maintains correct syntax.\",\n\n PDF: \"You are a precision document augmentation tool. Your task is to expand a given PDF text chunk with its direct context from the larger document. You must: 1) Keep the original chunk intact; 2) Add section headings, references, or figure captions; 3) Include text that immediately precedes and follows the chunk; 4) Create contextually rich output that maintains the document's original structure.\",\n\n MATH_PDF:\n \"You are a precision mathematical content augmentation tool. Your task is to expand a given mathematical text chunk with essential context. You must: 1) Keep original mathematical notations and expressions exactly as they appear; 2) Add relevant definitions, theorems, or equations from elsewhere in the document; 3) Preserve all LaTeX or mathematical formatting; 4) Create contextually rich output for improved mathematical comprehension.\",\n\n TECHNICAL:\n \"You are a precision technical documentation augmentation tool. Your task is to expand a technical document chunk with critical context. You must: 1) Keep the original chunk intact including all technical terminology; 2) Add relevant configuration examples, parameter definitions, or API references; 3) Include any prerequisite information; 4) Create contextually rich output that maintains technical accuracy.\",\n};\n\nexport const CONTEXTUAL_CHUNK_ENRICHMENT_PROMPT_TEMPLATE = `\n<document>\n{doc_content}\n</document>\n\nHere is the chunk we want to situate within the whole document:\n<chunk>\n{chunk_content}\n</chunk>\n\nCreate an enriched version of this chunk by adding critical surrounding context. Follow these guidelines:\n\n1. Identify the document's main topic and key information relevant to understanding this chunk\n2. Include 2-3 sentences before the chunk that provide essential context\n3. Include 2-3 sentences after the chunk that complete thoughts or provide resolution\n4. For technical documents, include any definitions or explanations of terms used in the chunk\n5. For narrative content, include character or setting information needed to understand the chunk\n6. Keep the original chunk text COMPLETELY INTACT and UNCHANGED in your response\n7. Do not use phrases like \"this chunk discusses\" - directly present the context\n8. The total length should be between {min_tokens} and {max_tokens} tokens\n9. Format the response as a single coherent paragraph\n\nProvide ONLY the enriched chunk text in your response:`;\n\nexport const CACHED_CHUNK_PROMPT_TEMPLATE = `\nHere is the chunk we want to situate within the whole document:\n<chunk>\n{chunk_content}\n</chunk>\n\nCreate an enriched version of this chunk by adding critical surrounding context. Follow these guidelines:\n\n1. Identify the document's main topic and key information relevant to understanding this chunk\n2. Include 2-3 sentences before the chunk that provide essential context\n3. Include 2-3 sentences after the chunk that complete thoughts or provide resolution\n4. For technical documents, include any definitions or explanations of terms used in the chunk\n5. For narrative content, include character or setting information needed to understand the chunk\n6. Keep the original chunk text COMPLETELY INTACT and UNCHANGED in your response\n7. Do not use phrases like \"this chunk discusses\" - directly present the context\n8. The total length should be between {min_tokens} and {max_tokens} tokens\n9. Format the response as a single coherent paragraph\n\nProvide ONLY the enriched chunk text in your response:`;\n\nexport const CACHED_CODE_CHUNK_PROMPT_TEMPLATE = `\nHere is the chunk of code we want to situate within the whole document:\n<chunk>\n{chunk_content}\n</chunk>\n\nCreate an enriched version of this code chunk by adding critical surrounding context. Follow these guidelines:\n\n1. Preserve ALL code syntax, indentation, and comments exactly as they appear\n2. Include any import statements, function definitions, or class declarations that this code depends on\n3. Add necessary type definitions or interfaces that are referenced in this chunk\n4. Include any crucial comments from elsewhere in the document that explain this code\n5. If there are key variable declarations or initializations earlier in the document, include those\n6. Keep the original chunk COMPLETELY INTACT and UNCHANGED in your response\n7. The total length should be between {min_tokens} and {max_tokens} tokens\n8. Do NOT include implementation details for functions that are only called but not defined in this chunk\n\nProvide ONLY the enriched code chunk in your response:`;\n\nexport const CACHED_MATH_PDF_PROMPT_TEMPLATE = `\nHere is the chunk we want to situate within the whole document:\n<chunk>\n{chunk_content}\n</chunk>\n\nCreate an enriched version of this chunk by adding critical surrounding context. This document contains mathematical content that requires special handling. Follow these guidelines:\n\n1. Preserve ALL mathematical notation exactly as it appears in the chunk\n2. Include any defining equations, variables, or parameters mentioned earlier in the document that relate to this chunk\n3. Add section/subsection names or figure references if they help situate the chunk\n4. If variables or symbols are defined elsewhere in the document, include these definitions\n5. If mathematical expressions appear corrupted, try to infer their meaning from context\n6. Keep the original chunk text COMPLETELY INTACT and UNCHANGED in your response\n7. The total length should be between {min_tokens} and {max_tokens} tokens\n8. Format the response as a coherent mathematical explanation\n\nProvide ONLY the enriched chunk text in your response:`;\n\nexport const CACHED_TECHNICAL_PROMPT_TEMPLATE = `\nHere is the chunk we want to situate within the whole document:\n<chunk>\n{chunk_content}\n</chunk>\n\nCreate an enriched version of this chunk by adding critical surrounding context. This appears to be technical documentation that requires special handling. Follow these guidelines:\n\n1. Preserve ALL technical terminology, product names, and version numbers exactly as they appear\n2. Include any prerequisite information or requirements mentioned earlier in the document\n3. Add section/subsection headings or navigation path to situate this chunk within the document structure\n4. Include any definitions of technical terms, acronyms, or jargon used in this chunk\n5. If this chunk references specific configurations, include relevant parameter explanations\n6. Keep the original chunk text COMPLETELY INTACT and UNCHANGED in your response\n7. The total length should be between {min_tokens} and {max_tokens} tokens\n8. Format the response maintaining any hierarchical structure present in the original\n\nProvide ONLY the enriched chunk text in your response:`;\n\nexport const MATH_PDF_PROMPT_TEMPLATE = `\n<document>\n{doc_content}\n</document>\n\nHere is the chunk we want to situate within the whole document:\n<chunk>\n{chunk_content}\n</chunk>\n\nCreate an enriched version of this chunk by adding critical surrounding context. This document contains mathematical content that requires special handling. Follow these guidelines:\n\n1. Preserve ALL mathematical notation exactly as it appears in the chunk\n2. Include any defining equations, variables, or parameters mentioned earlier in the document that relate to this chunk\n3. Add section/subsection names or figure references if they help situate the chunk\n4. If variables or symbols are defined elsewhere in the document, include these definitions\n5. If mathematical expressions appear corrupted, try to infer their meaning from context\n6. Keep the original chunk text COMPLETELY INTACT and UNCHANGED in your response\n7. The total length should be between {min_tokens} and {max_tokens} tokens\n8. Format the response as a coherent mathematical explanation\n\nProvide ONLY the enriched chunk text in your response:`;\n\nexport const CODE_PROMPT_TEMPLATE = `\n<document>\n{doc_content}\n</document>\n\nHere is the chunk of code we want to situate within the whole document:\n<chunk>\n{chunk_content}\n</chunk>\n\nCreate an enriched version of this code chunk by adding critical surrounding context. Follow these guidelines:\n\n1. Preserve ALL code syntax, indentation, and comments exactly as they appear\n2. Include any import statements, function definitions, or class declarations that this code depends on\n3. Add necessary type definitions or interfaces that are referenced in this chunk\n4. Include any crucial comments from elsewhere in the document that explain this code\n5. If there are key variable declarations or initializations earlier in the document, include those\n6. Keep the original chunk COMPLETELY INTACT and UNCHANGED in your response\n7. The total length should be between {min_tokens} and {max_tokens} tokens\n8. Do NOT include implementation details for functions that are only called but not defined in this chunk\n\nProvide ONLY the enriched code chunk in your response:`;\n\nexport const TECHNICAL_PROMPT_TEMPLATE = `\n<document>\n{doc_content}\n</document>\n\nHere is the chunk we want to situate within the whole document:\n<chunk>\n{chunk_content}\n</chunk>\n\nCreate an enriched version of this chunk by adding critical surrounding context. This appears to be technical documentation that requires special handling. Follow these guidelines:\n\n1. Preserve ALL technical terminology, product names, and version numbers exactly as they appear\n2. Include any prerequisite information or requirements mentioned earlier in the document\n3. Add section/subsection headings or navigation path to situate this chunk within the document structure\n4. Include any definitions of technical terms, acronyms, or jargon used in this chunk\n5. If this chunk references specific configurations, include relevant parameter explanations\n6. Keep the original chunk text COMPLETELY INTACT and UNCHANGED in your response\n7. The total length should be between {min_tokens} and {max_tokens} tokens\n8. Format the response maintaining any hierarchical structure present in the original\n\nProvide ONLY the enriched chunk text in your response:`;\n\nexport function getContextualizationPrompt(\n docContent: string,\n chunkContent: string,\n minTokens = CONTEXT_TARGETS.DEFAULT.MIN_TOKENS,\n maxTokens = CONTEXT_TARGETS.DEFAULT.MAX_TOKENS,\n promptTemplate = CONTEXTUAL_CHUNK_ENRICHMENT_PROMPT_TEMPLATE\n): string {\n if (!docContent || !chunkContent) {\n return \"Error: Document or chunk content missing.\";\n }\n\n const chunkTokens = Math.ceil(chunkContent.length / DEFAULT_CHARS_PER_TOKEN);\n\n if (chunkTokens > maxTokens * 0.7) {\n maxTokens = Math.ceil(chunkTokens * 1.3);\n minTokens = chunkTokens;\n }\n\n return promptTemplate\n .replace(\"{doc_content}\", docContent)\n .replace(\"{chunk_content}\", chunkContent)\n .replace(\"{min_tokens}\", minTokens.toString())\n .replace(\"{max_tokens}\", maxTokens.toString());\n}\n\nexport function getCachingContextualizationPrompt(\n chunkContent: string,\n contentType?: string,\n minTokens = CONTEXT_TARGETS.DEFAULT.MIN_TOKENS,\n maxTokens = CONTEXT_TARGETS.DEFAULT.MAX_TOKENS\n): { prompt: string; systemPrompt: string } {\n if (!chunkContent) {\n return {\n prompt: \"Error: Chunk content missing.\",\n systemPrompt: SYSTEM_PROMPTS.DEFAULT,\n };\n }\n\n const chunkTokens = Math.ceil(chunkContent.length / DEFAULT_CHARS_PER_TOKEN);\n\n if (chunkTokens > maxTokens * 0.7) {\n maxTokens = Math.ceil(chunkTokens * 1.3);\n minTokens = chunkTokens;\n }\n let promptTemplate = CACHED_CHUNK_PROMPT_TEMPLATE;\n let systemPrompt = SYSTEM_PROMPTS.DEFAULT;\n\n if (contentType) {\n if (\n contentType.includes(\"javascript\") ||\n contentType.includes(\"typescript\") ||\n contentType.includes(\"python\") ||\n contentType.includes(\"java\") ||\n contentType.includes(\"c++\") ||\n contentType.includes(\"code\")\n ) {\n promptTemplate = CACHED_CODE_CHUNK_PROMPT_TEMPLATE;\n systemPrompt = SYSTEM_PROMPTS.CODE;\n } else if (contentType.includes(\"pdf\")) {\n if (containsMathematicalContent(chunkContent)) {\n promptTemplate = CACHED_MATH_PDF_PROMPT_TEMPLATE;\n systemPrompt = SYSTEM_PROMPTS.MATH_PDF;\n } else {\n systemPrompt = SYSTEM_PROMPTS.PDF;\n }\n } else if (\n contentType.includes(\"markdown\") ||\n contentType.includes(\"text/html\") ||\n isTechnicalDocumentation(chunkContent)\n ) {\n promptTemplate = CACHED_TECHNICAL_PROMPT_TEMPLATE;\n systemPrompt = SYSTEM_PROMPTS.TECHNICAL;\n }\n }\n\n const formattedPrompt = promptTemplate\n .replace(\"{chunk_content}\", chunkContent)\n .replace(\"{min_tokens}\", minTokens.toString())\n .replace(\"{max_tokens}\", maxTokens.toString());\n\n return {\n prompt: formattedPrompt,\n systemPrompt,\n };\n}\n\nexport function getPromptForMimeType(\n mimeType: string,\n docContent: string,\n chunkContent: string\n): string {\n let minTokens = CONTEXT_TARGETS.DEFAULT.MIN_TOKENS;\n let maxTokens = CONTEXT_TARGETS.DEFAULT.MAX_TOKENS;\n let promptTemplate = CONTEXTUAL_CHUNK_ENRICHMENT_PROMPT_TEMPLATE;\n\n if (mimeType.includes(\"pdf\")) {\n if (containsMathematicalContent(docContent)) {\n minTokens = CONTEXT_TARGETS.MATH_PDF.MIN_TOKENS;\n maxTokens = CONTEXT_TARGETS.MATH_PDF.MAX_TOKENS;\n promptTemplate = MATH_PDF_PROMPT_TEMPLATE;\n } else {\n minTokens = CONTEXT_TARGETS.PDF.MIN_TOKENS;\n maxTokens = CONTEXT_TARGETS.PDF.MAX_TOKENS;\n }\n } else if (\n mimeType.includes(\"javascript\") ||\n mimeType.includes(\"typescript\") ||\n mimeType.includes(\"python\") ||\n mimeType.includes(\"java\") ||\n mimeType.includes(\"c++\") ||\n mimeType.includes(\"code\")\n ) {\n minTokens = CONTEXT_TARGETS.CODE.MIN_TOKENS;\n maxTokens = CONTEXT_TARGETS.CODE.MAX_TOKENS;\n promptTemplate = CODE_PROMPT_TEMPLATE;\n } else if (\n isTechnicalDocumentation(docContent) ||\n mimeType.includes(\"markdown\") ||\n mimeType.includes(\"text/html\")\n ) {\n minTokens = CONTEXT_TARGETS.TECHNICAL.MIN_TOKENS;\n maxTokens = CONTEXT_TARGETS.TECHNICAL.MAX_TOKENS;\n promptTemplate = TECHNICAL_PROMPT_TEMPLATE;\n }\n\n return getContextualizationPrompt(docContent, chunkContent, minTokens, maxTokens, promptTemplate);\n}\n\nexport function getCachingPromptForMimeType(\n mimeType: string,\n chunkContent: string\n): { prompt: string; systemPrompt: string } {\n let minTokens = CONTEXT_TARGETS.DEFAULT.MIN_TOKENS;\n let maxTokens = CONTEXT_TARGETS.DEFAULT.MAX_TOKENS;\n if (mimeType.includes(\"pdf\")) {\n if (containsMathematicalContent(chunkContent)) {\n minTokens = CONTEXT_TARGETS.MATH_PDF.MIN_TOKENS;\n maxTokens = CONTEXT_TARGETS.MATH_PDF.MAX_TOKENS;\n } else {\n minTokens = CONTEXT_TARGETS.PDF.MIN_TOKENS;\n maxTokens = CONTEXT_TARGETS.PDF.MAX_TOKENS;\n }\n } else if (\n mimeType.includes(\"javascript\") ||\n mimeType.includes(\"typescript\") ||\n mimeType.includes(\"python\") ||\n mimeType.includes(\"java\") ||\n mimeType.includes(\"c++\") ||\n mimeType.includes(\"code\")\n ) {\n minTokens = CONTEXT_TARGETS.CODE.MIN_TOKENS;\n maxTokens = CONTEXT_TARGETS.CODE.MAX_TOKENS;\n } else if (\n isTechnicalDocumentation(chunkContent) ||\n mimeType.includes(\"markdown\") ||\n mimeType.includes(\"text/html\")\n ) {\n minTokens = CONTEXT_TARGETS.TECHNICAL.MIN_TOKENS;\n maxTokens = CONTEXT_TARGETS.TECHNICAL.MAX_TOKENS;\n }\n\n return getCachingContextualizationPrompt(chunkContent, mimeType, minTokens, maxTokens);\n}\n\nfunction containsMathematicalContent(content: string): boolean {\n const latexMathPatterns = [\n /\\$\\$.+?\\$\\$/s,\n /\\$.+?\\$/g,\n /\\\\begin\\{equation\\}/,\n /\\\\begin\\{align\\}/,\n /\\\\sum_/,\n /\\\\int/,\n /\\\\frac\\{/,\n /\\\\sqrt\\{/,\n /\\\\alpha|\\\\beta|\\\\gamma|\\\\delta|\\\\theta|\\\\lambda|\\\\sigma/,\n /\\\\nabla|\\\\partial/,\n ];\n const generalMathPatterns = [\n /[≠≤≥±∞∫∂∑∏√∈∉⊆⊇⊂⊃∪∩]/,\n /\\b[a-zA-Z]\\^[0-9]/,\n /\\(\\s*-?\\d+(\\.\\d+)?\\s*,\\s*-?\\d+(\\.\\d+)?\\s*\\)/,\n /\\b[xyz]\\s*=\\s*-?\\d+(\\.\\d+)?/,\n /\\[\\s*-?\\d+(\\.\\d+)?\\s*,\\s*-?\\d+(\\.\\d+)?\\s*\\]/,\n /\\b\\d+\\s*×\\s*\\d+/,\n ];\n for (const pattern of latexMathPatterns) {\n if (pattern.test(content)) {\n return true;\n }\n }\n\n // Test for general math patterns\n for (const pattern of generalMathPatterns) {\n if (pattern.test(content)) {\n return true;\n }\n }\n\n // Keyword analysis\n const mathKeywords = [\n \"theorem\",\n \"lemma\",\n \"proof\",\n \"equation\",\n \"function\",\n \"derivative\",\n \"integral\",\n \"matrix\",\n \"vector\",\n \"algorithm\",\n \"constraint\",\n \"coefficient\",\n ];\n\n const contentLower = content.toLowerCase();\n const mathKeywordCount = mathKeywords.filter((keyword) => contentLower.includes(keyword)).length;\n\n return mathKeywordCount >= 2;\n}\n\nfunction isTechnicalDocumentation(content: string): boolean {\n const technicalPatterns = [\n /\\b(version|v)\\s*\\d+\\.\\d+(\\.\\d+)?/i,\n /\\b(api|sdk|cli)\\b/i,\n /\\b(http|https|ftp):\\/\\//i,\n /\\b(GET|POST|PUT|DELETE)\\b/,\n /<\\/?[a-z][\\s\\S]*>/i,\n /\\bREADME\\b|\\bCHANGELOG\\b/i,\n /\\b(config|configuration)\\b/i,\n /\\b(parameter|param|argument|arg)\\b/i,\n ];\n\n const docHeadings = [\n /\\b(Introduction|Overview|Getting Started|Installation|Usage|API Reference|Troubleshooting)\\b/i,\n ];\n for (const pattern of [...technicalPatterns, ...docHeadings]) {\n if (pattern.test(content)) {\n return true;\n }\n }\n\n const listPatterns = [/\\d+\\.\\s.+\\n\\d+\\.\\s.+/, /•\\s.+\\n•\\s.+/, /\\*\\s.+\\n\\*\\s.+/, /-\\s.+\\n-\\s.+/];\n\n for (const pattern of listPatterns) {\n if (pattern.test(content)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function getChunkWithContext(chunkContent: string, generatedContext: string): string {\n if (!generatedContext || generatedContext.trim() === \"\") {\n return chunkContent;\n }\n return generatedContext.trim();\n}\n",
23
+ "import { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { google } from \"@ai-sdk/google\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { type IAgentRuntime, logger } from \"@elizaos/core\";\nimport { createOpenRouter } from \"@openrouter/ai-sdk-provider\";\nimport { generateText as aiGenerateText, embed, type ModelMessage } from \"ai\";\n\ntype AIModel = Parameters<typeof aiGenerateText>[0][\"model\"];\n\ninterface TextGenerationResult {\n text: string;\n usage: {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n };\n finishReason?: string;\n response?: {\n id?: string;\n modelId?: string;\n };\n}\n\nimport { validateModelConfig } from \"./config\";\nimport type { ModelConfig, TextGenerationOptions } from \"./types\";\n\nexport async function generateTextEmbedding(\n runtime: IAgentRuntime,\n text: string\n): Promise<{ embedding: number[] }> {\n const config = validateModelConfig(runtime);\n const dimensions = config.EMBEDDING_DIMENSION;\n\n try {\n if (config.EMBEDDING_PROVIDER === \"openai\") {\n return await generateOpenAIEmbedding(text, config, dimensions);\n } else if (config.EMBEDDING_PROVIDER === \"google\") {\n return await generateGoogleEmbedding(text, config);\n }\n\n throw new Error(`Unsupported embedding provider: ${config.EMBEDDING_PROVIDER}`);\n } catch (error) {\n logger.error({ error }, `${config.EMBEDDING_PROVIDER} embedding error`);\n throw error;\n }\n}\n\nexport async function generateTextEmbeddingsBatch(\n runtime: IAgentRuntime,\n texts: string[],\n batchSize: number = 20\n): Promise<\n Array<{ embedding: number[] | null; success: boolean; error?: unknown; index: number }>\n> {\n const results: Array<{\n embedding: number[] | null;\n success: boolean;\n error?: unknown;\n index: number;\n }> = [];\n\n for (let i = 0; i < texts.length; i += batchSize) {\n const batch = texts.slice(i, i + batchSize);\n const batchStartIndex = i;\n\n const batchPromises = batch.map(async (text, batchIndex) => {\n const globalIndex = batchStartIndex + batchIndex;\n try {\n const result = await generateTextEmbedding(runtime, text);\n return {\n embedding: result.embedding,\n success: true,\n index: globalIndex,\n };\n } catch (error) {\n logger.error({ error }, `Embedding error for item ${globalIndex}`);\n return {\n embedding: null,\n success: false,\n error,\n index: globalIndex,\n };\n }\n });\n\n const batchResults = await Promise.all(batchPromises);\n results.push(...batchResults);\n\n if (i + batchSize < texts.length) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n }\n\n return results;\n}\n\nasync function generateOpenAIEmbedding(\n text: string,\n config: ModelConfig,\n dimensions: number\n): Promise<{ embedding: number[] }> {\n const openai = createOpenAI({\n apiKey: config.OPENAI_API_KEY as string,\n baseURL: config.OPENAI_BASE_URL,\n });\n\n const modelInstance = openai.embedding(config.TEXT_EMBEDDING_MODEL);\n\n const embedOptions: {\n model: ReturnType<typeof openai.embedding>;\n value: string;\n dimensions?: number;\n } = {\n model: modelInstance,\n value: text,\n };\n\n if (\n dimensions &&\n [\"text-embedding-3-small\", \"text-embedding-3-large\"].includes(config.TEXT_EMBEDDING_MODEL)\n ) {\n embedOptions.dimensions = dimensions;\n }\n\n const { embedding, usage } = await embed(embedOptions);\n\n const totalTokens = (usage as { totalTokens?: number })?.totalTokens;\n logger.debug(\n `OpenAI embedding ${config.TEXT_EMBEDDING_MODEL}${embedOptions.dimensions ? ` (${embedOptions.dimensions}D)` : \"\"}: ${totalTokens || 0} tokens`\n );\n\n return { embedding };\n}\n\nasync function generateGoogleEmbedding(\n text: string,\n config: ModelConfig\n): Promise<{ embedding: number[] }> {\n const googleProvider = google;\n if (config.GOOGLE_API_KEY) {\n process.env.GOOGLE_GENERATIVE_AI_API_KEY = config.GOOGLE_API_KEY;\n }\n\n const modelInstance = googleProvider.textEmbeddingModel(config.TEXT_EMBEDDING_MODEL);\n\n const { embedding, usage } = await embed({\n model: modelInstance,\n value: text,\n });\n\n const totalTokens = (usage as { totalTokens?: number })?.totalTokens;\n logger.debug(`Google embedding ${config.TEXT_EMBEDDING_MODEL}: ${totalTokens || 0} tokens`);\n\n return { embedding };\n}\n\nexport async function generateText(\n runtime: IAgentRuntime,\n prompt: string,\n system?: string,\n overrideConfig?: TextGenerationOptions\n): Promise<TextGenerationResult> {\n const config = validateModelConfig(runtime);\n const provider = overrideConfig?.provider || config.TEXT_PROVIDER;\n const modelName = overrideConfig?.modelName || config.TEXT_MODEL;\n const maxTokens = overrideConfig?.maxTokens || config.MAX_OUTPUT_TOKENS;\n const autoCacheContextualRetrieval = overrideConfig?.autoCacheContextualRetrieval !== false;\n\n if (!modelName) {\n throw new Error(`No model name configured for provider: ${provider}`);\n }\n\n try {\n switch (provider) {\n case \"anthropic\":\n return await generateAnthropicText(config, prompt, system, modelName, maxTokens);\n case \"openai\":\n return await generateOpenAIText(config, prompt, system, modelName, maxTokens);\n case \"openrouter\":\n return await generateOpenRouterText(\n config,\n prompt,\n system,\n modelName,\n maxTokens,\n overrideConfig?.cacheDocument,\n overrideConfig?.cacheOptions,\n autoCacheContextualRetrieval\n );\n case \"google\":\n return await generateGoogleText(prompt, system, modelName, maxTokens, config);\n default:\n throw new Error(`Unsupported text provider: ${provider}`);\n }\n } catch (error) {\n logger.error({ error }, `${provider} ${modelName} error`);\n throw error;\n }\n}\n\nasync function generateAnthropicText(\n config: ModelConfig,\n prompt: string,\n system: string | undefined,\n modelName: string,\n maxTokens: number\n): Promise<TextGenerationResult> {\n const anthropic = createAnthropic({\n apiKey: config.ANTHROPIC_API_KEY as string,\n baseURL: config.ANTHROPIC_BASE_URL,\n });\n\n const modelInstance = anthropic(modelName);\n const maxRetries = 3;\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n return await aiGenerateText({\n model: modelInstance,\n prompt: prompt,\n system: system,\n temperature: 0.3,\n maxOutputTokens: maxTokens,\n });\n } catch (error) {\n const errorObj = error as { status?: number; message?: string } | null;\n const isRateLimit =\n errorObj?.status === 429 ||\n errorObj?.message?.includes(\"rate limit\") ||\n errorObj?.message?.includes(\"429\");\n\n if (isRateLimit && attempt < maxRetries - 1) {\n const delay = 2 ** (attempt + 1) * 1000;\n await new Promise((resolve) => setTimeout(resolve, delay));\n continue;\n }\n\n throw error;\n }\n }\n\n throw new Error(\"Max retries exceeded for Anthropic text generation\");\n}\n\nasync function generateOpenAIText(\n config: ModelConfig,\n prompt: string,\n system: string | undefined,\n modelName: string,\n maxTokens: number\n): Promise<TextGenerationResult> {\n const openai = createOpenAI({\n apiKey: config.OPENAI_API_KEY as string,\n baseURL: config.OPENAI_BASE_URL,\n });\n\n const modelInstance = openai.chat(modelName);\n\n const result = await aiGenerateText({\n model: modelInstance,\n prompt: prompt,\n system: system,\n temperature: 0.3,\n maxOutputTokens: maxTokens,\n });\n\n return result;\n}\n\nasync function generateGoogleText(\n prompt: string,\n system: string | undefined,\n modelName: string,\n maxTokens: number,\n config: ModelConfig\n): Promise<TextGenerationResult> {\n const googleProvider = google;\n if (config.GOOGLE_API_KEY) {\n process.env.GOOGLE_GENERATIVE_AI_API_KEY = config.GOOGLE_API_KEY;\n }\n\n const modelInstance = googleProvider(modelName);\n\n const result = await aiGenerateText({\n model: modelInstance,\n prompt: prompt,\n system: system,\n temperature: 0.3,\n maxOutputTokens: maxTokens,\n });\n\n return result;\n}\n\nasync function generateOpenRouterText(\n config: ModelConfig,\n prompt: string,\n system: string | undefined,\n modelName: string,\n maxTokens: number,\n cacheDocument?: string,\n _cacheOptions?: { type: \"ephemeral\" },\n autoCacheContextualRetrieval = true\n): Promise<TextGenerationResult> {\n const openrouter = createOpenRouter({\n apiKey: config.OPENROUTER_API_KEY as string,\n baseURL: config.OPENROUTER_BASE_URL,\n });\n\n const modelInstance = openrouter.chat(modelName);\n\n const isClaudeModel = modelName.toLowerCase().includes(\"claude\");\n const isGeminiModel = modelName.toLowerCase().includes(\"gemini\");\n const isGemini25Model = modelName.toLowerCase().includes(\"gemini-2.5\");\n const supportsCaching = isClaudeModel || isGeminiModel;\n\n let documentForCaching: string | undefined = cacheDocument;\n\n if (!documentForCaching && autoCacheContextualRetrieval && supportsCaching) {\n const docMatch = prompt.match(/<document>([\\s\\S]*?)<\\/document>/);\n if (docMatch?.[1]) {\n documentForCaching = docMatch[1].trim();\n }\n }\n\n if (documentForCaching && supportsCaching) {\n let promptText = prompt;\n if (promptText.includes(\"<document>\")) {\n promptText = promptText.replace(/<document>[\\s\\S]*?<\\/document>/, \"\").trim();\n }\n\n if (isClaudeModel) {\n return await generateClaudeWithCaching(\n promptText,\n system,\n modelInstance as AIModel,\n modelName,\n maxTokens,\n documentForCaching\n );\n } else if (isGeminiModel) {\n return await generateGeminiWithCaching(\n promptText,\n system,\n modelInstance as AIModel,\n modelName,\n maxTokens,\n documentForCaching,\n isGemini25Model\n );\n }\n }\n\n return await generateStandardOpenRouterText(\n prompt,\n system,\n modelInstance as AIModel,\n modelName,\n maxTokens\n );\n}\n\nasync function generateClaudeWithCaching(\n promptText: string,\n system: string | undefined,\n modelInstance: AIModel,\n modelName: string,\n maxTokens: number,\n documentForCaching: string\n): Promise<TextGenerationResult> {\n const messages = [\n system\n ? {\n role: \"system\",\n content: [\n {\n type: \"text\",\n text: system,\n },\n {\n type: \"text\",\n text: documentForCaching,\n cache_control: {\n type: \"ephemeral\",\n },\n },\n ],\n }\n : {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: \"Document for context:\",\n },\n {\n type: \"text\",\n text: documentForCaching,\n cache_control: {\n type: \"ephemeral\",\n },\n },\n {\n type: \"text\",\n text: promptText,\n },\n ],\n },\n system\n ? {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: promptText,\n },\n ],\n }\n : null,\n ].filter(Boolean);\n\n const result = await aiGenerateText({\n model: modelInstance,\n messages: messages as ModelMessage[],\n temperature: 0.3,\n maxOutputTokens: maxTokens,\n providerOptions: {\n openrouter: {\n usage: {\n include: true,\n },\n },\n },\n });\n\n logCacheMetrics(result);\n const totalTokens = (result.usage.inputTokens || 0) + (result.usage.outputTokens || 0);\n logger.debug(\n `OpenRouter ${modelName}: ${totalTokens} tokens (${result.usage.inputTokens || 0}→${result.usage.outputTokens || 0})`\n );\n return result;\n}\n\nasync function generateGeminiWithCaching(\n promptText: string,\n system: string | undefined,\n modelInstance: AIModel,\n modelName: string,\n maxTokens: number,\n documentForCaching: string,\n _isGemini25Model: boolean\n): Promise<TextGenerationResult> {\n const geminiSystemPrefix = system ? `${system}\\n\\n` : \"\";\n const geminiPrompt = `${geminiSystemPrefix}${documentForCaching}\\n\\n${promptText}`;\n\n const result = await aiGenerateText({\n model: modelInstance,\n prompt: geminiPrompt,\n temperature: 0.3,\n maxOutputTokens: maxTokens,\n providerOptions: {\n openrouter: {\n usage: {\n include: true,\n },\n },\n },\n });\n\n logCacheMetrics(result);\n const totalTokens = (result.usage.inputTokens || 0) + (result.usage.outputTokens || 0);\n logger.debug(\n `OpenRouter ${modelName}: ${totalTokens} tokens (${result.usage.inputTokens || 0}→${result.usage.outputTokens || 0})`\n );\n return result;\n}\n\nasync function generateStandardOpenRouterText(\n prompt: string,\n system: string | undefined,\n modelInstance: AIModel,\n modelName: string,\n maxTokens: number\n): Promise<TextGenerationResult> {\n const result = await aiGenerateText({\n model: modelInstance,\n prompt: prompt,\n system: system,\n temperature: 0.3,\n maxOutputTokens: maxTokens,\n providerOptions: {\n openrouter: {\n usage: {\n include: true,\n },\n },\n },\n });\n\n const totalTokens = (result.usage.inputTokens || 0) + (result.usage.outputTokens || 0);\n logger.debug(\n `OpenRouter ${modelName}: ${totalTokens} tokens (${result.usage.inputTokens || 0}→${result.usage.outputTokens || 0})`\n );\n return result;\n}\n\nfunction logCacheMetrics(_result: TextGenerationResult): void {}\n",
24
+ "import type { IAgentRuntime, Memory, Provider, State } from \"@elizaos/core\";\nimport { addHeader, logger, MemoryType } from \"@elizaos/core\";\nimport type { KnowledgeService } from \"./service.ts\";\nimport type { KnowledgeDocumentMetadata } from \"./types.ts\";\n\nexport const documentsProvider: Provider = {\n name: \"AVAILABLE_DOCUMENTS\",\n description:\n \"List of documents available in the knowledge base. Shows which documents the agent can reference and retrieve information from.\",\n dynamic: true,\n get: async (runtime: IAgentRuntime, _message: Memory, _state?: State) => {\n try {\n const knowledgeService = runtime.getService(\"knowledge\") as KnowledgeService;\n\n if (!knowledgeService) {\n logger.warn(\"Knowledge service not available for documents provider\");\n return {\n data: { documents: [] },\n values: {\n documentsCount: 0,\n documents: \"\",\n availableDocuments: \"\",\n },\n text: \"\",\n };\n }\n\n const allMemories = await knowledgeService.getMemories({\n tableName: \"documents\",\n roomId: runtime.agentId,\n count: 100,\n });\n\n const documents = allMemories.filter(\n (memory) => memory.metadata?.type === MemoryType.DOCUMENT\n );\n\n if (!documents || documents.length === 0) {\n return {\n data: { documents: [] },\n values: {\n documentsCount: 0,\n documents: \"\",\n availableDocuments: \"\",\n },\n text: \"\",\n };\n }\n\n const documentsList = documents\n .map((doc, index) => {\n const metadata = doc.metadata as KnowledgeDocumentMetadata | undefined;\n const filename = metadata?.filename || metadata?.title || `Document ${index + 1}`;\n const fileType = metadata?.fileExt || metadata?.fileType || \"\";\n const source = metadata?.source || \"upload\";\n const fileSize = metadata?.fileSize;\n\n const parts = [filename];\n\n if (fileType) {\n parts.push(fileType);\n }\n\n if (fileSize) {\n const sizeKB = Math.round(fileSize / 1024);\n if (sizeKB > 1024) {\n parts.push(`${Math.round(sizeKB / 1024)}MB`);\n } else {\n parts.push(`${sizeKB}KB`);\n }\n }\n\n if (source && source !== \"upload\") {\n parts.push(`from ${source}`);\n }\n\n return parts.join(\" - \");\n })\n .join(\"\\n\");\n\n const documentsText = addHeader(\n \"# Available Documents\",\n `${documents.length} document(s) in knowledge base:\\n${documentsList}`\n );\n\n return {\n data: {\n documents: documents.map((doc) => ({\n id: doc.id,\n filename:\n (doc.metadata as KnowledgeDocumentMetadata | undefined)?.filename ||\n (doc.metadata as KnowledgeDocumentMetadata | undefined)?.title,\n fileType:\n (doc.metadata as KnowledgeDocumentMetadata | undefined)?.fileType ||\n (doc.metadata as KnowledgeDocumentMetadata | undefined)?.fileExt,\n source: (doc.metadata as KnowledgeDocumentMetadata | undefined)?.source,\n })),\n count: documents.length,\n },\n values: {\n documentsCount: documents.length,\n documents: documentsList,\n availableDocuments: documentsText,\n },\n text: documentsText,\n };\n } catch (error) {\n logger.error(\n \"Error in documents provider:\",\n error instanceof Error ? error.message : String(error)\n );\n return {\n data: { documents: [], error: error instanceof Error ? error.message : String(error) },\n values: {\n documentsCount: 0,\n documents: \"\",\n availableDocuments: \"\",\n },\n text: \"\",\n };\n }\n },\n};\n",
25
+ "import type { IAgentRuntime, Memory, Provider } from \"@elizaos/core\";\nimport { addHeader } from \"@elizaos/core\";\nimport type { KnowledgeService } from \"./service.ts\";\n\nexport const knowledgeProvider: Provider = {\n name: \"KNOWLEDGE\",\n description:\n \"Knowledge from the knowledge base that the agent knows, retrieved whenever the agent needs to answer a question about their expertise.\",\n dynamic: true,\n get: async (runtime: IAgentRuntime, message: Memory) => {\n const knowledgeService = runtime.getService(\"knowledge\") as KnowledgeService;\n const knowledgeData = await knowledgeService?.getKnowledge(message);\n\n // Early return when no knowledge exists - provider will be skipped in context\n // (runtime filters providers with empty/whitespace text)\n if (!knowledgeData || knowledgeData.length === 0) {\n return {\n text: \"\",\n values: { knowledge: \"\", knowledgeUsed: false },\n data: { knowledge: \"\", ragMetadata: null, knowledgeUsed: false },\n };\n }\n\n const firstFiveKnowledgeItems = knowledgeData.slice(0, 5);\n\n let knowledge = addHeader(\n \"# Knowledge\",\n firstFiveKnowledgeItems.map((item) => `- ${item.content.text}`).join(\"\\n\")\n );\n\n const tokenLength = 3.5;\n const maxChars = 4000 * tokenLength;\n\n if (knowledge.length > maxChars) {\n knowledge = knowledge.slice(0, maxChars);\n }\n\n const ragMetadata = {\n retrievedFragments: knowledgeData.map((fragment) => {\n const fragmentMetadata = fragment.metadata as Record<string, unknown> | undefined;\n return {\n fragmentId: fragment.id,\n documentTitle:\n (fragmentMetadata?.filename as string) || (fragmentMetadata?.title as string) || \"\",\n similarityScore: (fragment as { similarity?: number }).similarity,\n contentPreview: `${(fragment.content?.text || \"\").substring(0, 100)}...`,\n };\n }),\n queryText: message.content?.text || \"\",\n totalFragments: knowledgeData.length,\n retrievalTimestamp: Date.now(),\n };\n\n knowledgeService.setPendingRAGMetadata(ragMetadata);\n setTimeout(async () => {\n await knowledgeService.enrichRecentMemoriesWithPendingRAG();\n }, 2000);\n\n return {\n data: {\n knowledge,\n ragMetadata,\n knowledgeUsed: true,\n },\n values: {\n knowledge,\n knowledgeUsed: true,\n },\n text: knowledge,\n ragMetadata,\n knowledgeUsed: true,\n };\n },\n};\n",
26
+ "import fs from \"node:fs\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport path from \"node:path\";\nimport type { IAgentRuntime, Memory, Metadata, Route, UUID } from \"@elizaos/core\";\nimport { createUniqueUuid, logger, MemoryType, ModelType } from \"@elizaos/core\";\nimport multer from \"multer\";\nimport { KnowledgeService } from \"./service\";\nimport { fetchUrlContent, normalizeS3Url } from \"./utils\";\n\ninterface ExtendedRequest extends IncomingMessage {\n body?: Record<string, unknown>;\n params?: Record<string, string>;\n query?: Record<string, string | string[]>;\n files?: MulterFile[];\n originalUrl?: string;\n path?: string;\n url?: string;\n}\n\ntype ExtendedResponse = ServerResponse<IncomingMessage> & {\n pipe?: <T extends NodeJS.WritableStream>(destination: T) => T;\n};\n\nfunction asWritableStream(res: ExtendedResponse): NodeJS.WritableStream {\n return res as NodeJS.WritableStream;\n}\n\nconst createUploadMiddleware = (runtime: IAgentRuntime) => {\n const uploadDir = String(runtime.getSetting(\"KNOWLEDGE_UPLOAD_DIR\") || \"/tmp/uploads/\");\n const maxFileSize = parseInt(\n String(runtime.getSetting(\"KNOWLEDGE_MAX_FILE_SIZE\") || \"52428800\"),\n 10\n );\n const maxFiles = parseInt(String(runtime.getSetting(\"KNOWLEDGE_MAX_FILES\") || \"10\"), 10);\n const allowedMimeTypes =\n String(runtime.getSetting(\"KNOWLEDGE_ALLOWED_MIME_TYPES\") || \"\")\n .split(\",\")\n .filter(Boolean).length > 0\n ? String(runtime.getSetting(\"KNOWLEDGE_ALLOWED_MIME_TYPES\") || \"\").split(\",\")\n : [\n \"text/plain\",\n \"text/markdown\",\n \"application/pdf\",\n \"application/msword\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \"text/html\",\n \"application/json\",\n \"application/xml\",\n \"text/csv\",\n ];\n\n return multer({\n dest: uploadDir,\n limits: {\n fileSize: maxFileSize,\n files: maxFiles,\n },\n fileFilter: (_req, file, cb) => {\n if (allowedMimeTypes.includes(file.mimetype)) {\n cb(null, true);\n } else {\n cb(\n new Error(\n `File type ${file.mimetype} not allowed. Allowed types: ${allowedMimeTypes.join(\", \")}`\n )\n );\n }\n },\n });\n};\n\n// Add this type declaration to fix Express.Multer.File error\ninterface MulterFile {\n fieldname: string;\n originalname: string;\n encoding: string;\n mimetype: string;\n size: number;\n destination: string;\n filename: string;\n path: string;\n buffer: Buffer;\n}\n\nfunction sendSuccess(res: ExtendedResponse, data: unknown, status = 200) {\n res.writeHead(status, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ success: true, data }));\n}\n\nfunction sendError(\n res: ExtendedResponse,\n status: number,\n code: string,\n message: string,\n details?: string\n) {\n res.writeHead(status, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ success: false, error: { code, message, details } }));\n}\n\n// Helper to clean up a single file\nconst cleanupFile = (filePath: string) => {\n if (filePath && fs.existsSync(filePath)) {\n try {\n fs.unlinkSync(filePath);\n } catch (error) {\n logger.error({ error }, `Error cleaning up file ${filePath}`);\n }\n }\n};\n\nconst cleanupFiles = (files: MulterFile[]) => {\n if (files) {\n files.forEach((file) => {\n cleanupFile(file.path);\n });\n }\n};\n\nasync function uploadKnowledgeHandler(\n req: ExtendedRequest,\n res: ExtendedResponse,\n runtime: IAgentRuntime\n) {\n const service = runtime.getService<KnowledgeService>(KnowledgeService.serviceType);\n if (!service) {\n return sendError(res, 500, \"SERVICE_NOT_FOUND\", \"KnowledgeService not found\");\n }\n\n // Check if the request has uploaded files or URLs\n const hasUploadedFiles = req.files && req.files.length > 0;\n const isJsonRequest = !hasUploadedFiles && req.body && (req.body.fileUrl || req.body.fileUrls);\n\n if (!hasUploadedFiles && !isJsonRequest) {\n return sendError(res, 400, \"INVALID_REQUEST\", \"Request must contain either files or URLs\");\n }\n\n try {\n if (hasUploadedFiles) {\n const files = req.files as MulterFile[];\n\n if (!files || files.length === 0) {\n return sendError(res, 400, \"NO_FILES\", \"No files uploaded\");\n }\n\n const invalidFiles = files.filter((file) => {\n if (file.size === 0) {\n logger.warn(`File ${file.originalname} is empty`);\n return true;\n }\n\n if (!file.originalname || file.originalname.trim() === \"\") {\n logger.warn(`File has no name`);\n return true;\n }\n\n if (!file.path) {\n logger.warn(`File ${file.originalname} has no path`);\n return true;\n }\n\n return false;\n });\n\n if (invalidFiles.length > 0) {\n cleanupFiles(files);\n const invalidFileNames = invalidFiles.map((f) => f.originalname || \"unnamed\").join(\", \");\n return sendError(\n res,\n 400,\n \"INVALID_FILES\",\n `Invalid or corrupted files: ${invalidFileNames}`\n );\n }\n\n const agentId = (req.body?.agentId as UUID) || (req.query?.agentId as UUID);\n\n if (!agentId) {\n logger.error(\"No agent ID provided in upload request\");\n return sendError(\n res,\n 400,\n \"MISSING_AGENT_ID\",\n \"Agent ID is required for uploading knowledge\"\n );\n }\n\n const worldId = (req.body?.worldId as UUID) || agentId;\n logger.info(`Processing file upload for agent: ${agentId}`);\n\n const processingPromises = files.map(async (file) => {\n const originalFilename = file.originalname;\n const filePath = file.path;\n\n try {\n const fileBuffer = await fs.promises.readFile(filePath);\n const base64Content = fileBuffer.toString(\"base64\");\n\n const addKnowledgeOpts: import(\"./types.ts\").AddKnowledgeOptions = {\n agentId: agentId,\n clientDocumentId: \"\" as UUID,\n contentType: file.mimetype,\n originalFilename: originalFilename,\n content: base64Content,\n worldId,\n roomId: agentId,\n entityId: agentId,\n };\n\n const result = await service.addKnowledge(addKnowledgeOpts);\n\n cleanupFile(filePath);\n\n return {\n id: result.clientDocumentId,\n filename: originalFilename,\n type: file.mimetype,\n size: file.size,\n uploadedAt: Date.now(),\n status: \"success\",\n };\n } catch (fileError) {\n logger.error(\n `Error processing file ${file.originalname}: ${fileError instanceof Error ? fileError.message : String(fileError)}`\n );\n cleanupFile(filePath);\n return {\n id: \"\",\n filename: originalFilename,\n status: \"error_processing\",\n error: fileError instanceof Error ? fileError.message : String(fileError),\n };\n }\n });\n\n const results = await Promise.all(processingPromises);\n sendSuccess(res, results);\n } else if (isJsonRequest) {\n const fileUrls = Array.isArray(req.body?.fileUrls)\n ? req.body?.fileUrls\n : req.body?.fileUrl\n ? [req.body?.fileUrl]\n : [];\n\n if (fileUrls.length === 0) {\n return sendError(res, 400, \"MISSING_URL\", \"File URL is required\");\n }\n\n const agentId = (req.body?.agentId as UUID) || (req.query?.agentId as UUID);\n\n if (!agentId) {\n logger.error(\"No agent ID provided in URL request\");\n return sendError(\n res,\n 400,\n \"MISSING_AGENT_ID\",\n \"Agent ID is required for uploading knowledge from URLs\"\n );\n }\n\n const processingPromises = fileUrls.map(async (fileUrl: string) => {\n try {\n const normalizedUrl = normalizeS3Url(fileUrl);\n\n const urlObject = new URL(fileUrl);\n const pathSegments = urlObject.pathname.split(\"/\");\n const encodedFilename = pathSegments[pathSegments.length - 1] || \"document.pdf\";\n const originalFilename = decodeURIComponent(encodedFilename);\n\n logger.debug(`Fetching content from URL: ${fileUrl}`);\n\n const { content, contentType: fetchedContentType } = await fetchUrlContent(fileUrl);\n\n let contentType = fetchedContentType;\n\n if (contentType === \"application/octet-stream\") {\n const fileExtension = originalFilename.split(\".\").pop()?.toLowerCase();\n if (fileExtension) {\n if ([\"pdf\"].includes(fileExtension)) {\n contentType = \"application/pdf\";\n } else if ([\"txt\", \"text\"].includes(fileExtension)) {\n contentType = \"text/plain\";\n } else if ([\"md\", \"markdown\"].includes(fileExtension)) {\n contentType = \"text/markdown\";\n } else if ([\"doc\", \"docx\"].includes(fileExtension)) {\n contentType = \"application/msword\";\n } else if ([\"html\", \"htm\"].includes(fileExtension)) {\n contentType = \"text/html\";\n } else if ([\"json\"].includes(fileExtension)) {\n contentType = \"application/json\";\n } else if ([\"xml\"].includes(fileExtension)) {\n contentType = \"application/xml\";\n }\n }\n }\n\n const addKnowledgeOpts: import(\"./types.ts\").AddKnowledgeOptions = {\n agentId: agentId,\n clientDocumentId: \"\" as UUID,\n contentType: contentType,\n originalFilename: originalFilename,\n content: content,\n worldId: agentId,\n roomId: agentId,\n entityId: agentId,\n metadata: {\n url: normalizedUrl,\n },\n };\n\n const result = await service.addKnowledge(addKnowledgeOpts);\n\n return {\n id: result.clientDocumentId,\n fileUrl: fileUrl,\n filename: originalFilename,\n message: \"Knowledge created successfully\",\n createdAt: Date.now(),\n fragmentCount: result.fragmentCount,\n status: \"success\",\n };\n } catch (urlError) {\n logger.error(\n `Error processing URL ${fileUrl}: ${urlError instanceof Error ? urlError.message : String(urlError)}`\n );\n return {\n fileUrl: fileUrl,\n status: \"error_processing\",\n error: urlError instanceof Error ? urlError.message : String(urlError),\n };\n }\n });\n\n const results = await Promise.all(processingPromises);\n sendSuccess(res, results);\n }\n } catch (error) {\n logger.error({ error }, \"Error processing knowledge\");\n if (hasUploadedFiles) {\n cleanupFiles(req.files as MulterFile[]);\n }\n sendError(\n res,\n 500,\n \"PROCESSING_ERROR\",\n \"Failed to process knowledge\",\n error instanceof Error ? error.message : String(error)\n );\n }\n}\n\nasync function getKnowledgeDocumentsHandler(\n req: ExtendedRequest,\n res: ExtendedResponse,\n runtime: IAgentRuntime\n) {\n const service = runtime.getService<KnowledgeService>(KnowledgeService.serviceType);\n if (!service) {\n return sendError(\n res,\n 500,\n \"SERVICE_NOT_FOUND\",\n \"KnowledgeService not found for getKnowledgeDocumentsHandler\"\n );\n }\n\n try {\n const limit = req.query?.limit ? Number.parseInt(req.query.limit as string, 10) : 10000;\n const before = req.query?.before ? Number.parseInt(req.query.before as string, 10) : Date.now();\n const includeEmbedding = req.query?.includeEmbedding === \"true\";\n\n const fileUrls = req.query?.fileUrls\n ? typeof req.query?.fileUrls === \"string\" && req.query.fileUrls.includes(\",\")\n ? req.query.fileUrls.split(\",\")\n : [req.query?.fileUrls]\n : null;\n\n const memories = await service.getMemories({\n tableName: \"documents\",\n count: limit,\n end: before,\n });\n\n let filteredMemories = memories;\n if (fileUrls && fileUrls.length > 0) {\n const normalizedRequestUrls = fileUrls.map((url) => normalizeS3Url(String(url)));\n const urlBasedIds = normalizedRequestUrls.map((url: string) =>\n createUniqueUuid(runtime, url)\n );\n\n filteredMemories = memories.filter(\n (memory) =>\n urlBasedIds.includes(memory.id) ||\n (memory.metadata &&\n \"url\" in memory.metadata &&\n typeof memory.metadata.url === \"string\" &&\n normalizedRequestUrls.includes(normalizeS3Url(memory.metadata.url)))\n );\n }\n\n const cleanMemories = includeEmbedding\n ? filteredMemories\n : filteredMemories.map((memory: Memory) => ({\n ...memory,\n embedding: undefined,\n }));\n sendSuccess(res, {\n memories: cleanMemories,\n urlFiltered: !!fileUrls,\n totalFound: cleanMemories.length,\n totalRequested: fileUrls ? fileUrls.length : 0,\n });\n } catch (error) {\n logger.error({ error }, \"Error retrieving documents\");\n sendError(\n res,\n 500,\n \"RETRIEVAL_ERROR\",\n \"Failed to retrieve documents\",\n error instanceof Error ? error.message : String(error)\n );\n }\n}\n\nasync function deleteKnowledgeDocumentHandler(\n req: ExtendedRequest,\n res: ExtendedResponse,\n runtime: IAgentRuntime\n) {\n const service = runtime.getService<KnowledgeService>(KnowledgeService.serviceType);\n if (!service) {\n return sendError(\n res,\n 500,\n \"SERVICE_NOT_FOUND\",\n \"KnowledgeService not found for deleteKnowledgeDocumentHandler\"\n );\n }\n\n // Get the ID directly from the route parameters\n const knowledgeId = req.params?.knowledgeId;\n\n if (!knowledgeId || knowledgeId.length < 36) {\n logger.error(`Invalid knowledge ID format: ${knowledgeId}`);\n return sendError(res, 400, \"INVALID_ID\", \"Invalid Knowledge ID format\");\n }\n\n try {\n const typedKnowledgeId = knowledgeId as `${string}-${string}-${string}-${string}-${string}`;\n logger.debug(`Deleting document: ${typedKnowledgeId}`);\n\n await service.deleteMemory(typedKnowledgeId);\n sendSuccess(res, null, 204);\n } catch (error) {\n logger.error({ error }, `Error deleting document ${knowledgeId}`);\n sendError(\n res,\n 500,\n \"DELETE_ERROR\",\n \"Failed to delete document\",\n error instanceof Error ? error.message : String(error)\n );\n }\n}\n\nasync function getKnowledgeByIdHandler(\n req: ExtendedRequest,\n res: ExtendedResponse,\n runtime: IAgentRuntime\n) {\n const service = runtime.getService<KnowledgeService>(KnowledgeService.serviceType);\n if (!service) {\n return sendError(\n res,\n 500,\n \"SERVICE_NOT_FOUND\",\n \"KnowledgeService not found for getKnowledgeByIdHandler\"\n );\n }\n\n // Get the ID directly from the route parameters\n const knowledgeId = req.params?.knowledgeId;\n\n if (!knowledgeId || knowledgeId.length < 36) {\n logger.error(`Invalid knowledge ID format: ${knowledgeId}`);\n return sendError(res, 400, \"INVALID_ID\", \"Invalid Knowledge ID format\");\n }\n\n try {\n logger.debug(`Retrieving document: ${knowledgeId}`);\n\n const memories = await service.getMemories({\n tableName: \"documents\",\n count: 10000,\n });\n\n const typedKnowledgeId = knowledgeId as `${string}-${string}-${string}-${string}-${string}`;\n const document = memories.find((memory) => memory.id === typedKnowledgeId);\n\n if (!document) {\n return sendError(res, 404, \"NOT_FOUND\", `Knowledge with ID ${typedKnowledgeId} not found`);\n }\n\n const cleanDocument = {\n ...document,\n embedding: undefined,\n };\n\n sendSuccess(res, { document: cleanDocument });\n } catch (error) {\n logger.error({ error }, `Error retrieving document ${knowledgeId}`);\n sendError(\n res,\n 500,\n \"RETRIEVAL_ERROR\",\n \"Failed to retrieve document\",\n error instanceof Error ? error.message : String(error)\n );\n }\n}\n\nasync function knowledgePanelHandler(\n req: ExtendedRequest,\n res: ExtendedResponse,\n runtime: IAgentRuntime\n) {\n const agentId = runtime.agentId;\n const requestPath = req.originalUrl || req.url || req.path || \"\";\n const pluginBasePath = requestPath.replace(/\\/display.*$/, \"\");\n\n try {\n const currentDir = path.dirname(new URL(import.meta.url).pathname);\n const frontendPath = path.join(currentDir, \"../dist/index.html\");\n\n if (fs.existsSync(frontendPath)) {\n const html = await fs.promises.readFile(frontendPath, \"utf8\");\n let injectedHtml = html.replace(\n \"<head>\",\n `<head>\n <script>\n window.ELIZA_CONFIG = {\n agentId: '${agentId}',\n apiBase: '${pluginBasePath}'\n };\n </script>`\n );\n\n injectedHtml = injectedHtml.replace(/src=\"\\.\\/assets\\//g, `src=\"${pluginBasePath}/assets/`);\n injectedHtml = injectedHtml.replace(/href=\"\\.\\/assets\\//g, `href=\"${pluginBasePath}/assets/`);\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(injectedHtml);\n } else {\n let cssFile = \"index.css\";\n let jsFile = \"index.js\";\n\n const manifestPath = path.join(currentDir, \"../dist/manifest.json\");\n if (fs.existsSync(manifestPath)) {\n try {\n const manifestContent = await fs.promises.readFile(manifestPath, \"utf8\");\n const manifest = JSON.parse(manifestContent);\n\n interface ViteManifestEntry {\n file?: string;\n css?: string[];\n isEntry?: boolean;\n }\n for (const [key, value] of Object.entries(manifest)) {\n if (typeof value === \"object\" && value !== null) {\n const entry = value as ViteManifestEntry;\n if (key.endsWith(\".css\") || entry.file?.endsWith(\".css\")) {\n cssFile = entry.file || key;\n }\n if (key.endsWith(\".js\") || entry.file?.endsWith(\".js\")) {\n jsFile = entry.file || key;\n }\n }\n }\n } catch {}\n }\n\n const html = `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Knowledge</title>\n <script>\n window.ELIZA_CONFIG = {\n agentId: '${agentId}',\n apiBase: '${pluginBasePath}'\n };\n </script>\n <link rel=\"stylesheet\" href=\"${pluginBasePath}/assets/${cssFile}\">\n <style>\n body { font-family: system-ui, -apple-system, sans-serif; margin: 0; padding: 20px; }\n .container { max-width: 1200px; margin: 0 auto; }\n .loading { text-align: center; padding: 40px; color: #666; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div id=\"root\">\n <div class=\"loading\">Loading Knowledge Library...</div>\n </div>\n </div>\n <script type=\"module\" src=\"${pluginBasePath}/assets/${jsFile}\"></script>\n</body>\n</html>`;\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(html);\n }\n } catch (error) {\n logger.error({ error }, \"Error serving frontend\");\n sendError(\n res,\n 500,\n \"FRONTEND_ERROR\",\n \"Failed to load knowledge panel\",\n error instanceof Error ? error.message : String(error)\n );\n }\n}\n\nasync function frontendAssetHandler(\n req: ExtendedRequest,\n res: ExtendedResponse,\n _runtime: IAgentRuntime\n) {\n try {\n const fullPath = req.originalUrl || req.url || req.path || \"\";\n const currentDir = path.dirname(new URL(import.meta.url).pathname);\n\n const assetsMarker = \"/assets/\";\n const assetsStartIndex = fullPath.lastIndexOf(assetsMarker);\n\n let assetName: string | null = null;\n if (assetsStartIndex !== -1) {\n assetName = fullPath.substring(assetsStartIndex + assetsMarker.length);\n const queryIndex = assetName.indexOf(\"?\");\n if (queryIndex !== -1) {\n assetName = assetName.substring(0, queryIndex);\n }\n }\n\n if (!assetName || assetName.includes(\"..\")) {\n return sendError(\n res,\n 400,\n \"BAD_REQUEST\",\n `Invalid asset name: '${assetName}' from path ${fullPath}`\n );\n }\n\n const assetPath = path.join(currentDir, \"../dist/assets\", assetName);\n\n if (fs.existsSync(assetPath)) {\n const fileStream = fs.createReadStream(assetPath);\n let contentType = \"application/octet-stream\";\n if (assetPath.endsWith(\".js\")) {\n contentType = \"application/javascript\";\n } else if (assetPath.endsWith(\".css\")) {\n contentType = \"text/css\";\n }\n res.writeHead(200, { \"Content-Type\": contentType });\n fileStream.pipe(asWritableStream(res));\n } else {\n sendError(res, 404, \"NOT_FOUND\", `Asset not found: ${req.url}`);\n }\n } catch (error) {\n logger.error({ error }, `Error serving asset ${req.url}`);\n sendError(\n res,\n 500,\n \"ASSET_ERROR\",\n `Failed to load asset ${req.url}`,\n error instanceof Error ? error.message : String(error)\n );\n }\n}\n\nasync function getKnowledgeChunksHandler(\n req: ExtendedRequest,\n res: ExtendedResponse,\n runtime: IAgentRuntime\n) {\n const service = runtime.getService<KnowledgeService>(KnowledgeService.serviceType);\n if (!service) {\n return sendError(res, 500, \"SERVICE_NOT_FOUND\", \"KnowledgeService not found\");\n }\n\n try {\n const documentId = req.query?.documentId as string | undefined;\n const documentsOnly = req.query?.documentsOnly === \"true\";\n\n const documents = await service.getMemories({\n tableName: \"documents\",\n count: 10000,\n end: Date.now(),\n });\n\n if (documentsOnly) {\n sendSuccess(res, {\n chunks: documents,\n stats: {\n documents: documents.length,\n fragments: 0,\n mode: \"documents-only\",\n },\n });\n return;\n }\n\n if (documentId) {\n const allFragments = await service.getMemories({\n tableName: \"knowledge\",\n count: 50000,\n });\n\n const documentFragments = allFragments.filter((fragment) => {\n const metadata = fragment.metadata as Metadata;\n return typeof metadata?.documentId === \"string\" && metadata.documentId === documentId;\n });\n\n const specificDocument = documents.find((d) => d.id === documentId);\n const results = specificDocument\n ? [specificDocument, ...documentFragments]\n : documentFragments;\n\n sendSuccess(res, {\n chunks: results,\n stats: {\n documents: specificDocument ? 1 : 0,\n fragments: documentFragments.length,\n mode: \"single-document\",\n documentId,\n },\n });\n return;\n }\n\n sendSuccess(res, {\n chunks: documents,\n stats: {\n documents: documents.length,\n fragments: 0,\n mode: \"documents-only\",\n },\n });\n } catch (error) {\n logger.error({ error }, \"Error retrieving chunks\");\n sendError(\n res,\n 500,\n \"RETRIEVAL_ERROR\",\n \"Failed to retrieve knowledge chunks\",\n error instanceof Error ? error.message : String(error)\n );\n }\n}\n\nasync function searchKnowledgeHandler(\n req: ExtendedRequest,\n res: ExtendedResponse,\n runtime: IAgentRuntime\n) {\n const service = runtime.getService<KnowledgeService>(KnowledgeService.serviceType);\n if (!service) {\n return sendError(res, 500, \"SERVICE_NOT_FOUND\", \"KnowledgeService not found\");\n }\n\n try {\n const searchText = req.query?.q as string;\n\n const parsedThreshold = req.query?.threshold\n ? Number.parseFloat(req.query.threshold as string)\n : NaN;\n let matchThreshold = Number.isNaN(parsedThreshold) ? 0.5 : parsedThreshold;\n matchThreshold = Math.max(0, Math.min(1, matchThreshold));\n\n const parsedLimit = req.query?.limit ? Number.parseInt(req.query.limit as string, 10) : NaN;\n let limit = Number.isNaN(parsedLimit) ? 20 : parsedLimit;\n limit = Math.max(1, Math.min(100, limit));\n\n const agentId = (req.query?.agentId as UUID) || runtime.agentId;\n\n if (!searchText || searchText.trim().length === 0) {\n return sendError(res, 400, \"INVALID_QUERY\", \"Search query cannot be empty\");\n }\n\n const embedding = await runtime.useModel(ModelType.TEXT_EMBEDDING, {\n text: searchText,\n });\n\n const results = await runtime.searchMemories({\n tableName: \"knowledge\",\n embedding,\n query: searchText,\n count: limit,\n match_threshold: matchThreshold,\n roomId: agentId,\n });\n\n const enhancedResults = await Promise.all(\n results.map(async (fragment) => {\n let documentTitle = \"\";\n let documentFilename = \"\";\n\n if (\n fragment.metadata &&\n typeof fragment.metadata === \"object\" &&\n \"documentId\" in fragment.metadata\n ) {\n const documentId = fragment.metadata.documentId as UUID;\n try {\n const document = await runtime.getMemoryById(documentId);\n if (document?.metadata) {\n const docMetadata = document.metadata as Metadata;\n documentTitle =\n (typeof docMetadata.title === \"string\" ? docMetadata.title : undefined) ||\n (typeof docMetadata.filename === \"string\" ? docMetadata.filename : undefined) ||\n \"\";\n documentFilename =\n (typeof docMetadata.filename === \"string\" ? docMetadata.filename : undefined) || \"\";\n }\n } catch {}\n }\n\n return {\n id: fragment.id,\n content: fragment.content,\n similarity: fragment.similarity || 0,\n metadata: {\n ...(fragment.metadata || {}),\n documentTitle,\n documentFilename,\n },\n };\n })\n );\n\n sendSuccess(res, {\n query: searchText,\n threshold: matchThreshold,\n results: enhancedResults,\n count: enhancedResults.length,\n });\n } catch (error) {\n logger.error({ error }, \"Error searching knowledge\");\n sendError(\n res,\n 500,\n \"SEARCH_ERROR\",\n \"Failed to search knowledge\",\n error instanceof Error ? error.message : String(error)\n );\n }\n}\n\nasync function getGraphNodesHandler(\n req: ExtendedRequest,\n res: ExtendedResponse,\n runtime: IAgentRuntime\n) {\n const service = runtime.getService<KnowledgeService>(KnowledgeService.serviceType);\n if (!service) {\n return sendError(res, 500, \"SERVICE_NOT_FOUND\", \"KnowledgeService not found\");\n }\n\n try {\n const parsedPage = req.query?.page ? Number.parseInt(req.query.page as string, 10) : 1;\n const parsedLimit = req.query?.limit ? Number.parseInt(req.query.limit as string, 10) : 20;\n const type = req.query?.type as \"document\" | \"fragment\" | undefined;\n const agentId = (req.query?.agentId as UUID) || runtime.agentId;\n\n const page = Number.isNaN(parsedPage) || parsedPage < 1 ? 1 : parsedPage;\n const limit = Number.isNaN(parsedLimit) || parsedLimit < 1 ? 20 : Math.min(parsedLimit, 50);\n const offset = (page - 1) * limit;\n\n const totalDocuments = await service.countMemories({\n tableName: \"documents\",\n roomId: agentId,\n unique: false,\n });\n\n const totalPages = Math.ceil(totalDocuments / limit);\n const hasMore = page < totalPages;\n\n const paginatedDocuments = await service.getMemories({\n tableName: \"documents\",\n roomId: agentId,\n count: limit,\n offset: offset,\n });\n\n const nodes: Array<{ id: UUID; type: \"document\" | \"fragment\" }> = [];\n const links: Array<{ source: UUID; target: UUID }> = [];\n\n paginatedDocuments.forEach((doc) => {\n if (!doc.id) {\n logger.warn(\"Skipping document without ID\");\n return;\n }\n nodes.push({ id: doc.id, type: \"document\" });\n });\n\n if (type !== \"document\") {\n const allFragments = await service.getMemories({\n tableName: \"knowledge\",\n roomId: agentId,\n count: 50000,\n });\n\n paginatedDocuments.forEach((doc) => {\n if (!doc.id) {\n return;\n }\n\n const docFragments = allFragments.filter((fragment) => {\n const metadata = fragment.metadata as Metadata;\n const typeString = typeof metadata?.type === \"string\" ? metadata.type : null;\n const isFragment =\n (typeString && typeString.toLowerCase() === \"fragment\") ||\n metadata?.type === MemoryType.FRAGMENT ||\n (!metadata?.type && metadata?.documentId);\n return metadata?.documentId === doc.id && isFragment;\n });\n\n docFragments.forEach((frag) => {\n const docId = doc.id;\n if (!frag.id || !docId) {\n return;\n }\n nodes.push({ id: frag.id, type: \"fragment\" });\n links.push({ source: docId, target: frag.id });\n });\n });\n }\n\n sendSuccess(res, {\n nodes,\n links,\n pagination: {\n currentPage: page,\n totalPages,\n hasMore,\n totalDocuments,\n },\n });\n } catch (error: unknown) {\n logger.error({ error }, \"Error fetching graph nodes\");\n sendError(\n res,\n 500,\n \"GRAPH_ERROR\",\n \"Failed to fetch graph nodes\",\n error instanceof Error ? error.message : String(error)\n );\n }\n}\n\nasync function getGraphNodeDetailsHandler(\n req: ExtendedRequest,\n res: ExtendedResponse,\n runtime: IAgentRuntime\n) {\n const service = runtime.getService<KnowledgeService>(KnowledgeService.serviceType);\n if (!service) {\n return sendError(res, 500, \"SERVICE_NOT_FOUND\", \"KnowledgeService not found\");\n }\n\n const nodeId = req.params?.nodeId as UUID;\n const agentId = (req.query?.agentId as UUID) || runtime.agentId;\n\n if (!nodeId || nodeId.length < 36) {\n return sendError(res, 400, \"INVALID_ID\", \"Invalid node ID format\");\n }\n\n try {\n const allDocuments = await service.getMemories({\n tableName: \"documents\",\n count: 10000,\n });\n\n let document = allDocuments.find((doc) => doc.id === nodeId && doc.roomId === agentId);\n\n if (!document) {\n document = allDocuments.find((doc) => doc.id === nodeId);\n }\n\n if (document) {\n sendSuccess(res, {\n id: document.id,\n type: \"document\",\n content: document.content,\n metadata: document.metadata,\n createdAt: document.createdAt,\n entityId: document.entityId,\n roomId: document.roomId,\n agentId: document.agentId,\n worldId: document.worldId,\n });\n return;\n }\n\n const allFragments = await service.getMemories({\n tableName: \"knowledge\",\n count: 50000,\n });\n\n let fragment = allFragments.find((frag) => frag.id === nodeId && frag.roomId === agentId);\n\n if (!fragment) {\n fragment = allFragments.find((frag) => frag.id === nodeId);\n }\n\n if (fragment) {\n sendSuccess(res, {\n id: fragment.id,\n type: \"fragment\",\n content: fragment.content,\n metadata: fragment.metadata,\n createdAt: fragment.createdAt,\n entityId: fragment.entityId,\n roomId: fragment.roomId,\n agentId: fragment.agentId,\n worldId: fragment.worldId,\n });\n return;\n }\n\n logger.error(`Node ${nodeId} not found`);\n sendError(res, 404, \"NOT_FOUND\", `Node with ID ${nodeId} not found`);\n } catch (error) {\n logger.error({ error }, `Error fetching node details for ${nodeId}`);\n sendError(\n res,\n 500,\n \"GRAPH_ERROR\",\n \"Failed to fetch node details\",\n error instanceof Error ? error.message : String(error)\n );\n }\n}\n\nasync function expandDocumentGraphHandler(\n req: ExtendedRequest,\n res: ExtendedResponse,\n runtime: IAgentRuntime\n) {\n const service = runtime.getService<KnowledgeService>(KnowledgeService.serviceType);\n if (!service) {\n return sendError(res, 500, \"SERVICE_NOT_FOUND\", \"KnowledgeService not found\");\n }\n\n const documentId = req.params?.documentId as UUID;\n const agentId = (req.query?.agentId as UUID) || runtime.agentId;\n\n if (!documentId || documentId.length < 36) {\n return sendError(res, 400, \"INVALID_ID\", \"Invalid document ID format\");\n }\n\n try {\n const allFragments = await service.getMemories({\n tableName: \"knowledge\",\n roomId: agentId,\n count: 50000,\n });\n\n const documentFragments = allFragments.filter((fragment) => {\n const metadata = fragment.metadata as Metadata;\n const typeString = typeof metadata?.type === \"string\" ? metadata.type : null;\n const isFragment =\n (typeString && typeString.toLowerCase() === \"fragment\") ||\n metadata?.type === MemoryType.FRAGMENT ||\n (!metadata?.type && metadata?.documentId);\n return metadata?.documentId === documentId && isFragment;\n });\n const nodes = documentFragments\n .filter((frag) => frag.id !== undefined)\n .map((frag) => ({\n id: frag.id as UUID,\n type: \"fragment\" as const,\n }));\n\n const links = documentFragments\n .filter((frag) => frag.id !== undefined)\n .map((frag) => ({\n source: documentId,\n target: frag.id as UUID,\n }));\n\n sendSuccess(res, {\n documentId,\n nodes,\n links,\n fragmentCount: nodes.length,\n });\n } catch (error) {\n logger.error({ error }, `Error expanding document ${documentId}`);\n sendError(\n res,\n 500,\n \"GRAPH_ERROR\",\n \"Failed to expand document\",\n error instanceof Error ? error.message : String(error)\n );\n }\n}\n\ntype MulterMiddleware = (\n req: IncomingMessage,\n res: ServerResponse,\n next: (err: Error | null) => void\n) => void;\n\nasync function uploadKnowledgeWithMulter(\n req: ExtendedRequest,\n res: ExtendedResponse,\n runtime: IAgentRuntime\n) {\n const upload = createUploadMiddleware(runtime);\n const uploadArray = upload.array(\n \"files\",\n parseInt(String(runtime.getSetting(\"KNOWLEDGE_MAX_FILES\") || \"10\"), 10)\n ) as MulterMiddleware;\n\n uploadArray(req, res, (err: Error | null) => {\n if (err) {\n logger.error({ error: err }, \"File upload error\");\n return sendError(res, 400, \"UPLOAD_ERROR\", err.message);\n }\n uploadKnowledgeHandler(req, res, runtime);\n });\n}\n\ntype ExtendedRouteHandler = (\n req: ExtendedRequest,\n res: ExtendedResponse,\n runtime: IAgentRuntime\n) => Promise<void>;\n\nfunction asRouteHandler(handler: ExtendedRouteHandler): Route[\"handler\"] {\n return handler as unknown as Route[\"handler\"];\n}\n\nexport const knowledgeRoutes: Route[] = [\n {\n type: \"GET\",\n name: \"Knowledge\",\n path: \"/display\",\n handler: asRouteHandler(knowledgePanelHandler),\n public: true,\n },\n {\n type: \"GET\",\n path: \"/assets/*\",\n handler: asRouteHandler(frontendAssetHandler),\n },\n {\n type: \"POST\",\n path: \"/documents\",\n handler: asRouteHandler(uploadKnowledgeWithMulter),\n },\n {\n type: \"GET\",\n path: \"/documents\",\n handler: asRouteHandler(getKnowledgeDocumentsHandler),\n },\n {\n type: \"GET\",\n path: \"/documents/:knowledgeId\",\n handler: asRouteHandler(getKnowledgeByIdHandler),\n },\n {\n type: \"DELETE\",\n path: \"/documents/:knowledgeId\",\n handler: asRouteHandler(deleteKnowledgeDocumentHandler),\n },\n {\n type: \"GET\",\n path: \"/knowledges\",\n handler: asRouteHandler(getKnowledgeChunksHandler),\n },\n {\n type: \"GET\",\n path: \"/search\",\n handler: asRouteHandler(searchKnowledgeHandler),\n },\n {\n type: \"GET\",\n path: \"/graph/nodes\",\n handler: asRouteHandler(getGraphNodesHandler),\n },\n {\n type: \"GET\",\n path: \"/graph/node/:nodeId\",\n handler: asRouteHandler(getGraphNodeDetailsHandler),\n },\n {\n type: \"GET\",\n path: \"/graph/expand/:documentId\",\n handler: asRouteHandler(expandDocumentGraphHandler),\n },\n];\n",
27
+ "import type { Plugin } from \"@elizaos/core\";\nimport { knowledgeActions } from \"./actions\";\nimport { documentsProvider } from \"./documents-provider\";\nimport { knowledgeProvider } from \"./provider\";\nimport { knowledgeRoutes } from \"./routes\";\nimport { KnowledgeService } from \"./service\";\n\nexport interface KnowledgePluginConfig {\n enableUI?: boolean;\n enableRoutes?: boolean;\n enableActions?: boolean;\n enableTests?: boolean;\n}\n\nexport function createKnowledgePlugin(config: KnowledgePluginConfig = {}): Plugin {\n const { enableUI = true, enableRoutes = true, enableActions = true, enableTests = true } = config;\n\n const plugin: Plugin = {\n name: \"knowledge\",\n description:\n \"Plugin for Retrieval Augmented Generation, including knowledge management and embedding.\",\n services: [KnowledgeService],\n providers: [knowledgeProvider, documentsProvider],\n };\n\n if (enableUI || enableRoutes) {\n plugin.routes = knowledgeRoutes;\n }\n\n if (enableActions) {\n plugin.actions = knowledgeActions;\n }\n\n if (enableTests) {\n // try {\n // const { default: knowledgeTestSuite } = require(\"./tests\");\n // plugin.tests = [knowledgeTestSuite];\n // } catch {}\n }\n\n return plugin;\n}\n\nexport const knowledgePluginCore: Plugin = createKnowledgePlugin({\n enableUI: false,\n enableRoutes: false,\n enableActions: false,\n enableTests: false,\n});\n\nexport const knowledgePluginHeadless: Plugin = createKnowledgePlugin({\n enableUI: false,\n enableRoutes: false,\n enableActions: true,\n enableTests: false,\n});\n\nexport const knowledgePlugin: Plugin = createKnowledgePlugin({\n enableUI: true,\n enableRoutes: true,\n enableActions: true,\n enableTests: true,\n});\n\nexport default knowledgePlugin;\n\nexport { documentsProvider } from \"./documents-provider\";\nexport { knowledgeProvider } from \"./provider\";\nexport { KnowledgeService } from \"./service\";\nexport * from \"./types\";\n"
28
+ ],
29
+ "mappings": "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",
30
+ "debugId": "156A1638D9D4ADEB64756E2164756E21",
31
+ "names": []
32
+ }