@hashgraphonline/conversational-agent 0.2.103 → 0.2.105

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.
Files changed (194) hide show
  1. package/README.md +64 -27
  2. package/cli/dist/CLIApp.d.ts +11 -0
  3. package/cli/dist/CLIApp.d.ts.map +1 -0
  4. package/cli/dist/CLIApp.js +128 -0
  5. package/cli/dist/CLIApp.js.map +1 -0
  6. package/cli/dist/LocalConversationalAgent.d.ts +37 -0
  7. package/cli/dist/LocalConversationalAgent.js +58 -0
  8. package/cli/dist/app.d.ts +18 -0
  9. package/cli/dist/app.d.ts.map +1 -0
  10. package/cli/dist/app.js +14 -0
  11. package/cli/dist/app.js.map +1 -0
  12. package/cli/dist/cli.d.ts +3 -0
  13. package/cli/dist/cli.d.ts.map +1 -0
  14. package/cli/dist/cli.js +87 -0
  15. package/cli/dist/cli.js.map +1 -0
  16. package/cli/dist/components/AppContainer.d.ts +16 -0
  17. package/cli/dist/components/AppContainer.js +24 -0
  18. package/cli/dist/components/AppScreens.d.ts +2 -0
  19. package/cli/dist/components/AppScreens.js +259 -0
  20. package/cli/dist/components/ChatScreen.d.ts +21 -0
  21. package/cli/dist/components/ChatScreen.d.ts.map +1 -0
  22. package/cli/dist/components/ChatScreen.js +40 -0
  23. package/cli/dist/components/ChatScreen.js.map +1 -0
  24. package/cli/dist/components/DebugLoadingScreen.d.ts +5 -0
  25. package/cli/dist/components/DebugLoadingScreen.js +31 -0
  26. package/cli/dist/components/LoadingScreen.d.ts +3 -0
  27. package/cli/dist/components/LoadingScreen.d.ts.map +1 -0
  28. package/cli/dist/components/LoadingScreen.js +17 -0
  29. package/cli/dist/components/LoadingScreen.js.map +1 -0
  30. package/cli/dist/components/LoadingScreenDebug.d.ts +5 -0
  31. package/cli/dist/components/LoadingScreenDebug.js +27 -0
  32. package/cli/dist/components/MCPConfigScreen.d.ts +28 -0
  33. package/cli/dist/components/MCPConfigScreen.d.ts.map +1 -0
  34. package/cli/dist/components/MCPConfigScreen.js +186 -0
  35. package/cli/dist/components/MCPConfigScreen.js.map +1 -0
  36. package/cli/dist/components/ScreenRouter.d.ts +13 -0
  37. package/cli/dist/components/ScreenRouter.d.ts.map +1 -0
  38. package/cli/dist/components/ScreenRouter.js +23 -0
  39. package/cli/dist/components/ScreenRouter.js.map +1 -0
  40. package/cli/dist/components/SetupScreen.d.ts +16 -0
  41. package/cli/dist/components/SetupScreen.d.ts.map +1 -0
  42. package/cli/dist/components/SetupScreen.js +67 -0
  43. package/cli/dist/components/SetupScreen.js.map +1 -0
  44. package/cli/dist/components/SingleLoadingScreen.d.ts +5 -0
  45. package/cli/dist/components/SingleLoadingScreen.js +27 -0
  46. package/cli/dist/components/StatusBadge.d.ts +10 -0
  47. package/cli/dist/components/StatusBadge.d.ts.map +1 -0
  48. package/cli/dist/components/StatusBadge.js +24 -0
  49. package/cli/dist/components/StatusBadge.js.map +1 -0
  50. package/cli/dist/components/TerminalWindow.d.ts +9 -0
  51. package/cli/dist/components/TerminalWindow.d.ts.map +1 -0
  52. package/cli/dist/components/TerminalWindow.js +19 -0
  53. package/cli/dist/components/TerminalWindow.js.map +1 -0
  54. package/cli/dist/components/WelcomeScreen.d.ts +12 -0
  55. package/cli/dist/components/WelcomeScreen.d.ts.map +1 -0
  56. package/cli/dist/components/WelcomeScreen.js +47 -0
  57. package/cli/dist/components/WelcomeScreen.js.map +1 -0
  58. package/cli/dist/context/AppContext.d.ts +68 -0
  59. package/cli/dist/context/AppContext.js +363 -0
  60. package/cli/dist/headless-runner.d.ts +17 -0
  61. package/cli/dist/headless-runner.d.ts.map +1 -0
  62. package/cli/dist/headless-runner.js +128 -0
  63. package/cli/dist/headless-runner.js.map +1 -0
  64. package/cli/dist/hooks/useInitializeAgent.d.ts +19 -0
  65. package/cli/dist/hooks/useInitializeAgent.d.ts.map +1 -0
  66. package/cli/dist/hooks/useInitializeAgent.js +29 -0
  67. package/cli/dist/hooks/useInitializeAgent.js.map +1 -0
  68. package/cli/dist/hooks/useStableState.d.ts +38 -0
  69. package/cli/dist/hooks/useStableState.d.ts.map +1 -0
  70. package/cli/dist/hooks/useStableState.js +69 -0
  71. package/cli/dist/hooks/useStableState.js.map +1 -0
  72. package/cli/dist/managers/AgentManager.d.ts +58 -0
  73. package/cli/dist/managers/AgentManager.d.ts.map +1 -0
  74. package/cli/dist/managers/AgentManager.js +121 -0
  75. package/cli/dist/managers/AgentManager.js.map +1 -0
  76. package/cli/dist/managers/ConfigManager.d.ts +54 -0
  77. package/cli/dist/managers/ConfigManager.d.ts.map +1 -0
  78. package/cli/dist/managers/ConfigManager.js +188 -0
  79. package/cli/dist/managers/ConfigManager.js.map +1 -0
  80. package/cli/dist/types.d.ts +52 -0
  81. package/cli/dist/types.d.ts.map +1 -0
  82. package/cli/dist/types.js +34 -0
  83. package/cli/dist/types.js.map +1 -0
  84. package/dist/cjs/config/system-message.d.ts +1 -1
  85. package/dist/cjs/conversational-agent.d.ts +30 -2
  86. package/dist/cjs/core/tool-registry.d.ts +29 -0
  87. package/dist/cjs/forms/field-guidance-registry.d.ts +33 -0
  88. package/dist/cjs/index.cjs +1 -1
  89. package/dist/cjs/index.cjs.map +1 -1
  90. package/dist/cjs/index.d.ts +1 -0
  91. package/dist/cjs/mcp/types.d.ts +14 -3
  92. package/dist/cjs/plugins/index.d.ts +1 -0
  93. package/dist/cjs/plugins/inscribe/InscribePlugin.d.ts +1 -0
  94. package/dist/cjs/plugins/web-browser/WebBrowserPlugin.d.ts +14 -0
  95. package/dist/cjs/runtime/wallet-bridge.d.ts +26 -0
  96. package/dist/cjs/services/attachment-processor.d.ts +1 -2
  97. package/dist/cjs/services/content-store-manager.d.ts +1 -1
  98. package/dist/cjs/services/formatters/types.d.ts +3 -1
  99. package/dist/cjs/services/index.d.ts +1 -1
  100. package/dist/cjs/signers/browser-signer.d.ts +32 -0
  101. package/dist/esm/index.js +3 -0
  102. package/dist/esm/index.js.map +1 -1
  103. package/dist/esm/index10.js +13 -5
  104. package/dist/esm/index10.js.map +1 -1
  105. package/dist/esm/index13.js +157 -179
  106. package/dist/esm/index13.js.map +1 -1
  107. package/dist/esm/index15.js +9 -4
  108. package/dist/esm/index15.js.map +1 -1
  109. package/dist/esm/index18.js.map +1 -1
  110. package/dist/esm/index2.js +25 -27
  111. package/dist/esm/index2.js.map +1 -1
  112. package/dist/esm/index21.js +1 -1
  113. package/dist/esm/index21.js.map +1 -1
  114. package/dist/esm/index23.js +3 -3
  115. package/dist/esm/index24.js.map +1 -1
  116. package/dist/esm/index26.js.map +1 -1
  117. package/dist/esm/index3.js.map +1 -1
  118. package/dist/esm/index30.js.map +1 -1
  119. package/dist/esm/index31.js +6 -3
  120. package/dist/esm/index31.js.map +1 -1
  121. package/dist/esm/index33.js +5 -5
  122. package/dist/esm/index33.js.map +1 -1
  123. package/dist/esm/index36.js +8 -45
  124. package/dist/esm/index36.js.map +1 -1
  125. package/dist/esm/index37.js +41 -102
  126. package/dist/esm/index37.js.map +1 -1
  127. package/dist/esm/index38.js +107 -21
  128. package/dist/esm/index38.js.map +1 -1
  129. package/dist/esm/index39.js +66 -12
  130. package/dist/esm/index39.js.map +1 -1
  131. package/dist/esm/index4.js +43 -0
  132. package/dist/esm/index4.js.map +1 -1
  133. package/dist/esm/index40.js +79 -7
  134. package/dist/esm/index40.js.map +1 -1
  135. package/dist/esm/index41.js +21 -5
  136. package/dist/esm/index41.js.map +1 -1
  137. package/dist/esm/index42.js +5 -255
  138. package/dist/esm/index42.js.map +1 -1
  139. package/dist/esm/index43.js +12 -184
  140. package/dist/esm/index43.js.map +1 -1
  141. package/dist/esm/index44.js +309 -79
  142. package/dist/esm/index44.js.map +1 -1
  143. package/dist/esm/index45.js +181 -24
  144. package/dist/esm/index45.js.map +1 -1
  145. package/dist/esm/index46.js +30 -0
  146. package/dist/esm/index46.js.map +1 -0
  147. package/dist/esm/index47.js +10 -0
  148. package/dist/esm/index47.js.map +1 -0
  149. package/dist/esm/index48.js +98 -0
  150. package/dist/esm/index48.js.map +1 -0
  151. package/dist/esm/index5.js +2 -2
  152. package/dist/esm/index6.js +231 -52
  153. package/dist/esm/index6.js.map +1 -1
  154. package/dist/types/config/system-message.d.ts +1 -1
  155. package/dist/types/conversational-agent.d.ts +30 -2
  156. package/dist/types/core/tool-registry.d.ts +29 -0
  157. package/dist/types/forms/field-guidance-registry.d.ts +33 -0
  158. package/dist/types/index.d.ts +1 -0
  159. package/dist/types/mcp/types.d.ts +14 -3
  160. package/dist/types/plugins/index.d.ts +1 -0
  161. package/dist/types/plugins/inscribe/InscribePlugin.d.ts +1 -0
  162. package/dist/types/plugins/web-browser/WebBrowserPlugin.d.ts +14 -0
  163. package/dist/types/runtime/wallet-bridge.d.ts +26 -0
  164. package/dist/types/services/attachment-processor.d.ts +1 -2
  165. package/dist/types/services/content-store-manager.d.ts +1 -1
  166. package/dist/types/services/formatters/types.d.ts +3 -1
  167. package/dist/types/services/index.d.ts +1 -1
  168. package/dist/types/signers/browser-signer.d.ts +32 -0
  169. package/package.json +40 -37
  170. package/src/config/system-message.ts +3 -3
  171. package/src/conversational-agent.ts +356 -61
  172. package/src/core/tool-registry.ts +85 -0
  173. package/src/forms/field-guidance-registry.ts +213 -188
  174. package/src/forms/form-generator.ts +28 -12
  175. package/src/index.ts +1 -0
  176. package/src/langchain/form-aware-agent-executor.ts +6 -6
  177. package/src/langchain/langchain-agent.ts +1 -1
  178. package/src/mcp/mcp-client-manager.ts +12 -5
  179. package/src/mcp/types.ts +15 -3
  180. package/src/memory/content-storage.ts +19 -6
  181. package/src/memory/smart-memory-manager.ts +0 -1
  182. package/src/plugins/hbar/AccountBuilder.ts +16 -16
  183. package/src/plugins/hcs-10/HCS10Plugin.ts +38 -38
  184. package/src/plugins/hcs-2/HCS2Plugin.ts +2 -2
  185. package/src/plugins/index.ts +2 -1
  186. package/src/plugins/inscribe/InscribePlugin.ts +46 -2
  187. package/src/plugins/web-browser/WebBrowserPlugin.ts +128 -0
  188. package/src/runtime/wallet-bridge.ts +46 -0
  189. package/src/services/attachment-processor.ts +1 -1
  190. package/src/services/content-store-manager.ts +1 -1
  191. package/src/services/formatters/types.ts +3 -1
  192. package/src/services/index.ts +1 -1
  193. package/src/signers/browser-signer.ts +111 -0
  194. package/cli/readme.md +0 -181
@@ -1 +1 @@
1
- {"version":3,"file":"index18.js","sources":["../../src/memory/smart-memory-manager.ts"],"sourcesContent":["import type { BaseMessage } from '@langchain/core/messages';\nimport { SystemMessage } from '@langchain/core/messages';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport { MemoryWindow } from './memory-window';\nimport { ContentStorage } from './content-storage';\nimport { TokenCounter } from './token-counter';\n\n/**\n * Entity association for storing blockchain entity contexts\n */\nexport interface EntityAssociation {\n /** The blockchain entity ID (e.g., tokenId, accountId, topicId) */\n entityId: string;\n /** User-provided or derived friendly name */\n entityName: string;\n /** Type of entity (token, account, topic, schedule, etc.) */\n entityType: string;\n /** When the entity was created/associated */\n createdAt: Date;\n /** Transaction ID that created this entity */\n transactionId?: string;\n /** Optional session identifier to scope associations */\n sessionId?: string;\n}\n\n/**\n * Options for resolving entity references\n */\nexport interface EntityResolutionOptions {\n /** Filter by specific entity type */\n entityType?: string;\n /** Maximum number of results to return */\n limit?: number;\n /** Whether to use fuzzy matching for natural language queries */\n fuzzyMatch?: boolean;\n}\n\n/**\n * Configuration for SmartMemoryManager\n */\nexport interface SmartMemoryConfig {\n /** Maximum tokens for active memory window */\n maxTokens?: number;\n /** Reserve tokens for response generation */\n reserveTokens?: number;\n /** Model name for token counting */\n modelName?: string;\n /** Maximum messages to store in content storage */\n storageLimit?: number;\n}\n\n/**\n * Search options for history search\n */\nexport interface SearchOptions {\n /** Whether to perform case-sensitive search */\n caseSensitive?: boolean;\n /** Maximum number of results to return */\n limit?: number;\n /** Whether to use regex pattern matching */\n useRegex?: boolean;\n}\n\n/**\n * Memory statistics for active memory window\n */\nexport interface MemoryStats {\n /** Total active messages in memory window */\n totalActiveMessages: number;\n /** Current token count including system prompt */\n currentTokenCount: number;\n /** Maximum token capacity */\n maxTokens: number;\n /** Remaining token capacity */\n remainingCapacity: number;\n /** System prompt token count */\n systemPromptTokens: number;\n /** Memory usage percentage */\n usagePercentage: number;\n}\n\nconst IS_ENTITY_ASSOCIATION_FLAG = '\"isEntityAssociation\":true';\n\n/**\n * TODO: investigate using chroma / rag for long term memory\n * Smart memory manager that combines active memory window with long-term storage\n * Provides context-aware memory management with automatic pruning and searchable history\n */\nexport class SmartMemoryManager {\n private memoryWindow: MemoryWindow;\n private _contentStorage: ContentStorage;\n private tokenCounter: TokenCounter;\n private config: Required<SmartMemoryConfig>;\n private logger: Logger;\n\n private static readonly DEFAULT_CONFIG: Required<SmartMemoryConfig> = {\n maxTokens: 8000,\n reserveTokens: 1000,\n modelName: 'gpt-4o',\n storageLimit: 1000,\n };\n\n constructor(config: SmartMemoryConfig = {}) {\n this.config = { ...SmartMemoryManager.DEFAULT_CONFIG, ...config };\n this.logger = new Logger({ module: 'SmartMemoryManager' });\n\n this.tokenCounter = new TokenCounter(this.config.modelName);\n this._contentStorage = new ContentStorage(this.config.storageLimit);\n this.memoryWindow = new MemoryWindow(\n this.config.maxTokens,\n this.config.reserveTokens,\n this.tokenCounter\n );\n }\n\n /**\n * Get the content storage instance for file/content reference operations\n * @returns ContentStorage instance\n */\n get contentStorage(): ContentStorage {\n return this._contentStorage;\n }\n\n /**\n * Add a message to the active memory window\n * Automatically handles pruning and storage of displaced messages\n * @param message - Message to add\n */\n addMessage(message: BaseMessage): void {\n const result = this.memoryWindow.addMessage(message);\n\n if (result.prunedMessages.length > 0) {\n this._contentStorage.storeMessages(result.prunedMessages);\n }\n }\n\n /**\n * Get all active messages from the memory window\n * @returns Array of active messages in chronological order\n */\n getMessages(): BaseMessage[] {\n return this.memoryWindow.getMessages();\n }\n\n /**\n * Clear active memory window\n * @param clearStorage - Whether to also clear the content storage (default: false)\n */\n clear(clearStorage: boolean = false): void {\n this.memoryWindow.clear();\n\n if (clearStorage) {\n this._contentStorage.clear();\n }\n }\n\n /**\n * Set the system prompt for the memory window\n * @param systemPrompt - System prompt text\n */\n setSystemPrompt(systemPrompt: string): void {\n this.memoryWindow.setSystemPrompt(systemPrompt);\n }\n\n /**\n * Get the current system prompt\n * @returns Current system prompt text\n */\n getSystemPrompt(): string {\n return this.memoryWindow.getSystemPrompt();\n }\n\n /**\n * Search through stored message history\n * @param query - Search term or pattern\n * @param options - Search configuration\n * @returns Array of matching messages from history\n */\n searchHistory(query: string, options: SearchOptions = {}): BaseMessage[] {\n return this._contentStorage.searchMessages(query, options);\n }\n\n /**\n * Get recent messages from storage history\n * @param count - Number of recent messages to retrieve\n * @returns Array of recent messages from storage\n */\n getRecentHistory(count: number): BaseMessage[] {\n return this._contentStorage.getRecentMessages(count);\n }\n\n /**\n * Check if a message can be added without exceeding limits\n * @param message - Message to test\n * @returns True if message can be added\n */\n canAddMessage(message: BaseMessage): boolean {\n return this.memoryWindow.canAddMessage(message);\n }\n\n /**\n * Get statistics about the active memory window\n * @returns Memory usage statistics\n */\n getMemoryStats(): MemoryStats {\n const windowStats = this.memoryWindow.getStats();\n\n return {\n totalActiveMessages: windowStats.totalMessages,\n currentTokenCount: windowStats.currentTokens,\n maxTokens: windowStats.maxTokens,\n remainingCapacity: windowStats.remainingCapacity,\n systemPromptTokens: windowStats.systemPromptTokens,\n usagePercentage: windowStats.usagePercentage,\n };\n }\n\n /**\n * Get statistics about the content storage\n * @returns Storage usage statistics\n */\n getStorageStats(): ReturnType<ContentStorage['getStorageStats']> {\n return this._contentStorage.getStorageStats();\n }\n\n /**\n * Get combined statistics for both active memory and storage\n * @returns Combined memory and storage statistics\n */\n getOverallStats(): {\n activeMemory: MemoryStats;\n storage: ReturnType<ContentStorage['getStorageStats']>;\n totalMessagesManaged: number;\n activeMemoryUtilization: number;\n storageUtilization: number;\n } {\n const memoryStats = this.getMemoryStats();\n const storageStats = this.getStorageStats();\n\n return {\n activeMemory: memoryStats,\n storage: storageStats,\n totalMessagesManaged:\n memoryStats.totalActiveMessages + storageStats.totalMessages,\n activeMemoryUtilization: memoryStats.usagePercentage,\n storageUtilization: storageStats.usagePercentage,\n };\n }\n\n /**\n * Update the configuration and apply changes\n * @param newConfig - New configuration options\n */\n updateConfig(newConfig: Partial<SmartMemoryConfig>): void {\n this.config = { ...this.config, ...newConfig };\n\n if (\n newConfig.maxTokens !== undefined ||\n newConfig.reserveTokens !== undefined\n ) {\n this.memoryWindow.updateLimits(\n this.config.maxTokens,\n this.config.reserveTokens\n );\n }\n\n if (newConfig.storageLimit !== undefined) {\n this._contentStorage.updateStorageLimit(this.config.storageLimit);\n }\n }\n\n /**\n * Get current configuration\n * @returns Current configuration settings\n */\n getConfig(): Required<SmartMemoryConfig> {\n return { ...this.config };\n }\n\n /**\n * Get messages from storage within a time range\n * @param startTime - Start of time range\n * @param endTime - End of time range\n * @returns Messages within the specified time range\n */\n getHistoryFromTimeRange(startTime: Date, endTime: Date): BaseMessage[] {\n return this._contentStorage.getMessagesFromTimeRange(startTime, endTime);\n }\n\n /**\n * Get messages from storage by message type\n * @param messageType - Type of messages to retrieve ('human', 'ai', 'system', etc.)\n * @param limit - Maximum number of messages to return\n * @returns Messages of the specified type\n */\n getHistoryByType(messageType: string, limit?: number): BaseMessage[] {\n return this._contentStorage.getMessagesByType(messageType, limit);\n }\n\n /**\n * Get recent messages from storage within the last N minutes\n * @param minutes - Number of minutes to look back\n * @returns Messages from the last N minutes\n */\n getRecentHistoryByTime(minutes: number): BaseMessage[] {\n return this._contentStorage.getRecentMessagesByTime(minutes);\n }\n\n /**\n * Export the current state for persistence or analysis\n * @returns Serializable representation of memory state\n */\n exportState(): {\n config: Required<SmartMemoryConfig>;\n activeMessages: Array<{ content: unknown; type: string }>;\n systemPrompt: string;\n memoryStats: MemoryStats;\n storageStats: ReturnType<ContentStorage['getStorageStats']>;\n storedMessages: ReturnType<ContentStorage['exportMessages']>;\n } {\n return {\n config: this.config,\n activeMessages: this.memoryWindow.getMessages().map((msg) => ({\n content: msg.content,\n type: msg._getType(),\n })),\n systemPrompt: this.memoryWindow.getSystemPrompt(),\n memoryStats: this.getMemoryStats(),\n storageStats: this.getStorageStats(),\n storedMessages: this._contentStorage.exportMessages(),\n };\n }\n\n /**\n * Get a summary of conversation context for external use\n * Useful for providing context to other systems or for logging\n * @param includeStoredContext - Whether to include recent stored messages\n * @returns Context summary object\n */\n getContextSummary(includeStoredContext: boolean = false): {\n activeMessageCount: number;\n systemPrompt: string;\n recentMessages: BaseMessage[];\n memoryUtilization: number;\n hasStoredHistory: boolean;\n recentStoredMessages?: BaseMessage[];\n storageStats?: ReturnType<ContentStorage['getStorageStats']>;\n } {\n const activeMessages = this.getMessages();\n const summary = {\n activeMessageCount: activeMessages.length,\n systemPrompt: this.getSystemPrompt(),\n recentMessages: activeMessages.slice(-5),\n memoryUtilization: this.getMemoryStats().usagePercentage,\n hasStoredHistory: this.getStorageStats().totalMessages > 0,\n };\n\n if (includeStoredContext) {\n return {\n ...summary,\n recentStoredMessages: this.getRecentHistory(10),\n storageStats: this.getStorageStats(),\n };\n }\n\n return summary;\n }\n\n /**\n * Perform maintenance operations\n * Optimizes storage and cleans up resources\n */\n performMaintenance(): void {}\n\n /**\n * Store an entity association for later resolution\n * @param entityId - The blockchain entity ID\n * @param entityName - User-provided or derived friendly name\n * @param entityType - Type of entity (token, account, topic, etc.)\n * @param transactionId - Optional transaction ID that created this entity\n */\n storeEntityAssociation(\n entityId: string,\n entityName: string,\n entityType: string,\n transactionId?: string,\n sessionId?: string\n ): void {\n try {\n if (\n !entityId ||\n typeof entityId !== 'string' ||\n entityId.trim().length === 0\n ) {\n return;\n }\n\n if (\n !entityName ||\n typeof entityName !== 'string' ||\n entityName.trim().length === 0\n ) {\n return;\n }\n\n if (\n !entityType ||\n typeof entityType !== 'string' ||\n entityType.trim().length === 0\n ) {\n return;\n }\n\n const sanitizedEntityId = entityId.trim();\n const sanitizedEntityName = entityName.trim().substring(0, 100);\n const sanitizedEntityType = this.normalizeEntityType(entityType);\n\n let usageHint = '';\n if (sanitizedEntityType === 'tokenid') {\n usageHint = 'Use this as tokenId for HTS operations';\n } else if (sanitizedEntityType === 'topicid') {\n usageHint =\n 'Can be used for HCS operations, HRLs for minting with the format hcs://1/<topicId>, etc.';\n } else if (sanitizedEntityType === 'accountid') {\n usageHint = 'Can be used for account based operations';\n }\n\n const association: EntityAssociation & {\n isEntityAssociation: boolean;\n usage?: string;\n hrl?: string;\n } = {\n entityId: sanitizedEntityId,\n entityName: sanitizedEntityName,\n entityType: sanitizedEntityType,\n createdAt: new Date(),\n isEntityAssociation: true,\n ...(usageHint ? { usage: usageHint } : {}),\n ...(sanitizedEntityType === 'topicId'\n ? { hrl: `hcs://1/${sanitizedEntityId}` }\n : {}),\n ...(transactionId !== undefined &&\n transactionId !== null &&\n transactionId.trim() !== ''\n ? { transactionId: transactionId.trim() }\n : {}),\n ...(sessionId && sessionId.trim() !== '' ? { sessionId: sessionId.trim() } : {}),\n };\n\n const content = JSON.stringify(association);\n type LangChainLikeMessage = {\n _getType: () => string;\n content: unknown;\n id: string;\n name?: string;\n additional_kwargs?: Record<string, unknown>;\n };\n\n const entityMessage: LangChainLikeMessage = {\n _getType: () => 'system',\n content: content,\n id: `entity_${sanitizedEntityId}_${Date.now()}`,\n name: 'entity_association',\n additional_kwargs: {\n entityId: sanitizedEntityId,\n entityName: sanitizedEntityName,\n entityType: sanitizedEntityType,\n isEntityAssociation: true,\n ...(sessionId && sessionId.trim() !== '' ? { sessionId: sessionId.trim() } : {}),\n },\n };\n\n try {\n this.memoryWindow.addMessage(new SystemMessage(content));\n } catch {}\n\n this._contentStorage.storeMessages([entityMessage as BaseMessage]);\n } catch (error) {\n this.logger.error('Failed to store entity association', {\n entityId,\n entityName,\n entityType,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Normalize various type aliases to canonical EntityFormat strings using a registry.\n */\n private normalizeEntityType(input: string): string {\n const raw = (input || '').trim();\n if (raw.length === 0) {\n return '';\n }\n\n const key = raw.replace(/[^a-z]/gi, '').toLowerCase();\n\n const REGISTRY: Record<string, string> = {\n topic: 'topicId',\n topicid: 'topicId',\n token: 'tokenId',\n tokenid: 'tokenId',\n account: 'accountId',\n accountid: 'accountId',\n contract: 'contractId',\n contractid: 'contractId',\n file: 'fileId',\n fileid: 'fileId',\n schedule: 'scheduleId',\n scheduleid: 'scheduleId',\n };\n\n if (Object.prototype.hasOwnProperty.call(REGISTRY, key)) {\n return REGISTRY[key];\n }\n\n if (/^[a-z]+Id$/.test(raw)) {\n return raw;\n }\n\n return raw;\n }\n\n /**\n * Resolve entity references from natural language queries\n * @param query - Search query (entity name or natural language reference)\n * @param options - Resolution options for filtering and fuzzy matching\n * @returns Array of matching entity associations\n */\n resolveEntityReference(\n query: string,\n options: EntityResolutionOptions = {}\n ): EntityAssociation[] {\n try {\n if (!query || typeof query !== 'string') {\n return [];\n }\n\n const sanitizedQuery = query.trim();\n if (sanitizedQuery.length === 0) {\n return [];\n }\n\n if (sanitizedQuery.length > 200) {\n }\n\n const { entityType, limit = 10, fuzzyMatch = true } = options;\n\n const safeLimit = Math.max(1, Math.min(limit || 10, 100));\n\n const isEntityIdQuery = /^0\\.0\\.\\d+$/.test(sanitizedQuery);\n\n const searchResults = this._contentStorage.searchMessages(\n sanitizedQuery.substring(0, 200),\n {\n caseSensitive: false,\n limit: safeLimit * 2,\n }\n );\n\n const associations: EntityAssociation[] = [];\n\n for (const message of searchResults) {\n try {\n const content = message.content as string;\n if (\n content.includes(IS_ENTITY_ASSOCIATION_FLAG) ||\n content.includes('entityId')\n ) {\n const parsed = JSON.parse(content);\n if (parsed.entityId && parsed.entityName && parsed.entityType) {\n if (entityType && parsed.entityType !== entityType) {\n continue;\n }\n\n if (isEntityIdQuery) {\n if (parsed.entityId !== sanitizedQuery) {\n continue;\n }\n }\n\n associations.push(parsed as EntityAssociation);\n }\n }\n } catch {\n continue;\n }\n }\n\n if (fuzzyMatch && associations.length === 0 && !isEntityIdQuery) {\n const fuzzyQueries = [\n query.toLowerCase(),\n `token`,\n `account`,\n entityType || '',\n ].filter(Boolean);\n\n for (const fuzzyQuery of fuzzyQueries) {\n if (fuzzyQuery === query.toLowerCase()) continue;\n\n const fuzzyResults = this._contentStorage.searchMessages(fuzzyQuery, {\n caseSensitive: false,\n limit: limit,\n });\n\n for (const message of fuzzyResults) {\n try {\n const content = message.content as string;\n if (content.includes(IS_ENTITY_ASSOCIATION_FLAG)) {\n const parsed = JSON.parse(content);\n if (parsed.entityId && parsed.entityName && parsed.entityType) {\n if (entityType && parsed.entityType !== entityType) {\n continue;\n }\n associations.push(parsed as EntityAssociation);\n }\n }\n } catch {\n continue;\n }\n }\n }\n }\n\n const uniqueAssociations = associations\n .filter(\n (assoc, index, arr) =>\n arr.findIndex((a) => a.entityId === assoc.entityId) === index\n )\n .sort(\n (a, b) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\n );\n\n const results = uniqueAssociations.slice(0, safeLimit);\n\n return results;\n } catch (error) {\n this.logger.error('Failed to resolve entity reference', {\n query,\n options,\n error: error instanceof Error ? error.message : String(error),\n });\n return [];\n }\n }\n\n /**\n * Get all entity associations, optionally filtered by type\n * @param entityType - Optional filter by entity type\n * @returns Array of entity associations\n */\n getEntityAssociations(entityType?: string): EntityAssociation[] {\n try {\n const rawFilter = entityType ? entityType.trim() : undefined;\n const filterCanonical = rawFilter ? this.normalizeEntityType(rawFilter) : undefined;\n\n if (entityType && (!rawFilter || rawFilter.length === 0)) {\n return [];\n }\n\n const SEARCH_ANY_ENTITY = 'entityId';\n const searchQuery = filterCanonical || SEARCH_ANY_ENTITY;\n const searchResults = this._contentStorage.searchMessages(searchQuery, {\n caseSensitive: false,\n limit: 100,\n });\n\n const associations: EntityAssociation[] = [];\n\n for (const message of searchResults) {\n try {\n const content = message.content as string;\n if (content.includes(IS_ENTITY_ASSOCIATION_FLAG)) {\n const parsed = JSON.parse(content);\n\n if (parsed.entityId && parsed.entityName && parsed.entityType) {\n if (filterCanonical && parsed.entityType !== filterCanonical) {\n continue;\n }\n\n if (parsed.createdAt && typeof parsed.createdAt === 'string') {\n parsed.createdAt = new Date(parsed.createdAt);\n }\n\n associations.push(parsed as EntityAssociation);\n }\n }\n } catch (parseError) {\n this.logger.warn('Failed to parse entity association from message', {\n messageContent:\n typeof message.content === 'string'\n ? message.content.substring(0, 100)\n : 'non-string',\n error:\n parseError instanceof Error\n ? parseError.message\n : String(parseError),\n });\n continue;\n }\n }\n\n // Merge duplicates by entityId, preferring the newest and one that carries transactionId\n const mergedById = new Map<string, EntityAssociation>();\n const getTime = (d: Date | string): number =>\n d instanceof Date ? d.getTime() : new Date(d).getTime();\n\n for (const assoc of associations) {\n const existing = mergedById.get(assoc.entityId);\n if (!existing) {\n mergedById.set(assoc.entityId, assoc);\n continue;\n }\n\n const existingTime = getTime(existing.createdAt);\n const currentTime = getTime(assoc.createdAt);\n\n const preferCurrent =\n currentTime > existingTime ||\n (!!assoc.transactionId && !existing.transactionId);\n\n if (preferCurrent) {\n mergedById.set(assoc.entityId, {\n ...existing,\n ...assoc,\n });\n }\n }\n\n const results = Array.from(mergedById.values()).sort((a, b) =>\n getTime(b.createdAt) - getTime(a.createdAt)\n );\n\n return results;\n } catch (error) {\n this.logger.error('Failed to get entity associations', {\n entityType,\n error: error instanceof Error ? error.message : String(error),\n });\n return [];\n }\n }\n\n /**\n * Clean up resources and dispose of components\n */\n dispose(): void {\n this.memoryWindow.dispose();\n this._contentStorage.dispose();\n this.tokenCounter.dispose();\n }\n}\n"],"names":[],"mappings":";;;;;AAiFA,MAAM,6BAA6B;AAO5B,MAAM,sBAAN,MAAM,oBAAmB;AAAA,EAc9B,YAAY,SAA4B,IAAI;AAC1C,SAAK,SAAS,EAAE,GAAG,oBAAmB,gBAAgB,GAAG,OAAA;AACzD,SAAK,SAAS,IAAI,OAAO,EAAE,QAAQ,sBAAsB;AAEzD,SAAK,eAAe,IAAI,aAAa,KAAK,OAAO,SAAS;AAC1D,SAAK,kBAAkB,IAAI,eAAe,KAAK,OAAO,YAAY;AAClE,SAAK,eAAe,IAAI;AAAA,MACtB,KAAK,OAAO;AAAA,MACZ,KAAK,OAAO;AAAA,MACZ,KAAK;AAAA,IAAA;AAAA,EAET;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,iBAAiC;AACnC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,SAA4B;AACrC,UAAM,SAAS,KAAK,aAAa,WAAW,OAAO;AAEnD,QAAI,OAAO,eAAe,SAAS,GAAG;AACpC,WAAK,gBAAgB,cAAc,OAAO,cAAc;AAAA,IAC1D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAA6B;AAC3B,WAAO,KAAK,aAAa,YAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,eAAwB,OAAa;AACzC,SAAK,aAAa,MAAA;AAElB,QAAI,cAAc;AAChB,WAAK,gBAAgB,MAAA;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB,cAA4B;AAC1C,SAAK,aAAa,gBAAgB,YAAY;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAA0B;AACxB,WAAO,KAAK,aAAa,gBAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAc,OAAe,UAAyB,IAAmB;AACvE,WAAO,KAAK,gBAAgB,eAAe,OAAO,OAAO;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiB,OAA8B;AAC7C,WAAO,KAAK,gBAAgB,kBAAkB,KAAK;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,SAA+B;AAC3C,WAAO,KAAK,aAAa,cAAc,OAAO;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAA8B;AAC5B,UAAM,cAAc,KAAK,aAAa,SAAA;AAEtC,WAAO;AAAA,MACL,qBAAqB,YAAY;AAAA,MACjC,mBAAmB,YAAY;AAAA,MAC/B,WAAW,YAAY;AAAA,MACvB,mBAAmB,YAAY;AAAA,MAC/B,oBAAoB,YAAY;AAAA,MAChC,iBAAiB,YAAY;AAAA,IAAA;AAAA,EAEjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAiE;AAC/D,WAAO,KAAK,gBAAgB,gBAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAME;AACA,UAAM,cAAc,KAAK,eAAA;AACzB,UAAM,eAAe,KAAK,gBAAA;AAE1B,WAAO;AAAA,MACL,cAAc;AAAA,MACd,SAAS;AAAA,MACT,sBACE,YAAY,sBAAsB,aAAa;AAAA,MACjD,yBAAyB,YAAY;AAAA,MACrC,oBAAoB,aAAa;AAAA,IAAA;AAAA,EAErC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,WAA6C;AACxD,SAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,GAAG,UAAA;AAEnC,QACE,UAAU,cAAc,UACxB,UAAU,kBAAkB,QAC5B;AACA,WAAK,aAAa;AAAA,QAChB,KAAK,OAAO;AAAA,QACZ,KAAK,OAAO;AAAA,MAAA;AAAA,IAEhB;AAEA,QAAI,UAAU,iBAAiB,QAAW;AACxC,WAAK,gBAAgB,mBAAmB,KAAK,OAAO,YAAY;AAAA,IAClE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAyC;AACvC,WAAO,EAAE,GAAG,KAAK,OAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,wBAAwB,WAAiB,SAA8B;AACrE,WAAO,KAAK,gBAAgB,yBAAyB,WAAW,OAAO;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,iBAAiB,aAAqB,OAA+B;AACnE,WAAO,KAAK,gBAAgB,kBAAkB,aAAa,KAAK;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,uBAAuB,SAAgC;AACrD,WAAO,KAAK,gBAAgB,wBAAwB,OAAO;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAOE;AACA,WAAO;AAAA,MACL,QAAQ,KAAK;AAAA,MACb,gBAAgB,KAAK,aAAa,cAAc,IAAI,CAAC,SAAS;AAAA,QAC5D,SAAS,IAAI;AAAA,QACb,MAAM,IAAI,SAAA;AAAA,MAAS,EACnB;AAAA,MACF,cAAc,KAAK,aAAa,gBAAA;AAAA,MAChC,aAAa,KAAK,eAAA;AAAA,MAClB,cAAc,KAAK,gBAAA;AAAA,MACnB,gBAAgB,KAAK,gBAAgB,eAAA;AAAA,IAAe;AAAA,EAExD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,kBAAkB,uBAAgC,OAQhD;AACA,UAAM,iBAAiB,KAAK,YAAA;AAC5B,UAAM,UAAU;AAAA,MACd,oBAAoB,eAAe;AAAA,MACnC,cAAc,KAAK,gBAAA;AAAA,MACnB,gBAAgB,eAAe,MAAM,EAAE;AAAA,MACvC,mBAAmB,KAAK,eAAA,EAAiB;AAAA,MACzC,kBAAkB,KAAK,gBAAA,EAAkB,gBAAgB;AAAA,IAAA;AAG3D,QAAI,sBAAsB;AACxB,aAAO;AAAA,QACL,GAAG;AAAA,QACH,sBAAsB,KAAK,iBAAiB,EAAE;AAAA,QAC9C,cAAc,KAAK,gBAAA;AAAA,MAAgB;AAAA,IAEvC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAA2B;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS5B,uBACE,UACA,YACA,YACA,eACA,WACM;AACN,QAAI;AACF,UACE,CAAC,YACD,OAAO,aAAa,YACpB,SAAS,KAAA,EAAO,WAAW,GAC3B;AACA;AAAA,MACF;AAEA,UACE,CAAC,cACD,OAAO,eAAe,YACtB,WAAW,KAAA,EAAO,WAAW,GAC7B;AACA;AAAA,MACF;AAEA,UACE,CAAC,cACD,OAAO,eAAe,YACtB,WAAW,KAAA,EAAO,WAAW,GAC7B;AACA;AAAA,MACF;AAEA,YAAM,oBAAoB,SAAS,KAAA;AACnC,YAAM,sBAAsB,WAAW,KAAA,EAAO,UAAU,GAAG,GAAG;AAC9D,YAAM,sBAAsB,KAAK,oBAAoB,UAAU;AAE/D,UAAI,YAAY;AAChB,UAAI,wBAAwB,WAAW;AACrC,oBAAY;AAAA,MACd,WAAW,wBAAwB,WAAW;AAC5C,oBACE;AAAA,MACJ,WAAW,wBAAwB,aAAa;AAC9C,oBAAY;AAAA,MACd;AAEA,YAAM,cAIF;AAAA,QACF,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,+BAAe,KAAA;AAAA,QACf,qBAAqB;AAAA,QACrB,GAAI,YAAY,EAAE,OAAO,UAAA,IAAc,CAAA;AAAA,QACvC,GAAI,wBAAwB,YACxB,EAAE,KAAK,WAAW,iBAAiB,GAAA,IACnC,CAAA;AAAA,QACJ,GAAI,kBAAkB,UACtB,kBAAkB,QAClB,cAAc,WAAW,KACrB,EAAE,eAAe,cAAc,KAAA,EAAK,IACpC,CAAA;AAAA,QACJ,GAAI,aAAa,UAAU,WAAW,KAAK,EAAE,WAAW,UAAU,KAAA,MAAW,CAAA;AAAA,MAAC;AAGhF,YAAM,UAAU,KAAK,UAAU,WAAW;AAS1C,YAAM,gBAAsC;AAAA,QAC1C,UAAU,MAAM;AAAA,QAChB;AAAA,QACA,IAAI,UAAU,iBAAiB,IAAI,KAAK,KAAK;AAAA,QAC7C,MAAM;AAAA,QACN,mBAAmB;AAAA,UACjB,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,qBAAqB;AAAA,UACrB,GAAI,aAAa,UAAU,WAAW,KAAK,EAAE,WAAW,UAAU,KAAA,MAAW,CAAA;AAAA,QAAC;AAAA,MAChF;AAGF,UAAI;AACF,aAAK,aAAa,WAAW,IAAI,cAAc,OAAO,CAAC;AAAA,MACzD,QAAQ;AAAA,MAAC;AAET,WAAK,gBAAgB,cAAc,CAAC,aAA4B,CAAC;AAAA,IACnE,SAAS,OAAO;AACd,WAAK,OAAO,MAAM,sCAAsC;AAAA,QACtD;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAAA,CAC7D;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,OAAuB;AACjD,UAAM,OAAO,SAAS,IAAI,KAAA;AAC1B,QAAI,IAAI,WAAW,GAAG;AACpB,aAAO;AAAA,IACT;AAEA,UAAM,MAAM,IAAI,QAAQ,YAAY,EAAE,EAAE,YAAA;AAExC,UAAM,WAAmC;AAAA,MACvC,OAAO;AAAA,MACP,SAAS;AAAA,MACT,OAAO;AAAA,MACP,SAAS;AAAA,MACT,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY;AAAA,IAAA;AAGd,QAAI,OAAO,UAAU,eAAe,KAAK,UAAU,GAAG,GAAG;AACvD,aAAO,SAAS,GAAG;AAAA,IACrB;AAEA,QAAI,aAAa,KAAK,GAAG,GAAG;AAC1B,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,uBACE,OACA,UAAmC,IACd;AACrB,QAAI;AACF,UAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,eAAO,CAAA;AAAA,MACT;AAEA,YAAM,iBAAiB,MAAM,KAAA;AAC7B,UAAI,eAAe,WAAW,GAAG;AAC/B,eAAO,CAAA;AAAA,MACT;AAEA,UAAI,eAAe,SAAS,KAAK;AAAA,MACjC;AAEA,YAAM,EAAE,YAAY,QAAQ,IAAI,aAAa,SAAS;AAEtD,YAAM,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,IAAI,GAAG,CAAC;AAExD,YAAM,kBAAkB,cAAc,KAAK,cAAc;AAEzD,YAAM,gBAAgB,KAAK,gBAAgB;AAAA,QACzC,eAAe,UAAU,GAAG,GAAG;AAAA,QAC/B;AAAA,UACE,eAAe;AAAA,UACf,OAAO,YAAY;AAAA,QAAA;AAAA,MACrB;AAGF,YAAM,eAAoC,CAAA;AAE1C,iBAAW,WAAW,eAAe;AACnC,YAAI;AACF,gBAAM,UAAU,QAAQ;AACxB,cACE,QAAQ,SAAS,0BAA0B,KAC3C,QAAQ,SAAS,UAAU,GAC3B;AACA,kBAAM,SAAS,KAAK,MAAM,OAAO;AACjC,gBAAI,OAAO,YAAY,OAAO,cAAc,OAAO,YAAY;AAC7D,kBAAI,cAAc,OAAO,eAAe,YAAY;AAClD;AAAA,cACF;AAEA,kBAAI,iBAAiB;AACnB,oBAAI,OAAO,aAAa,gBAAgB;AACtC;AAAA,gBACF;AAAA,cACF;AAEA,2BAAa,KAAK,MAA2B;AAAA,YAC/C;AAAA,UACF;AAAA,QACF,QAAQ;AACN;AAAA,QACF;AAAA,MACF;AAEA,UAAI,cAAc,aAAa,WAAW,KAAK,CAAC,iBAAiB;AAC/D,cAAM,eAAe;AAAA,UACnB,MAAM,YAAA;AAAA,UACN;AAAA,UACA;AAAA,UACA,cAAc;AAAA,QAAA,EACd,OAAO,OAAO;AAEhB,mBAAW,cAAc,cAAc;AACrC,cAAI,eAAe,MAAM,cAAe;AAExC,gBAAM,eAAe,KAAK,gBAAgB,eAAe,YAAY;AAAA,YACnE,eAAe;AAAA,YACf;AAAA,UAAA,CACD;AAED,qBAAW,WAAW,cAAc;AAClC,gBAAI;AACF,oBAAM,UAAU,QAAQ;AACxB,kBAAI,QAAQ,SAAS,0BAA0B,GAAG;AAChD,sBAAM,SAAS,KAAK,MAAM,OAAO;AACjC,oBAAI,OAAO,YAAY,OAAO,cAAc,OAAO,YAAY;AAC7D,sBAAI,cAAc,OAAO,eAAe,YAAY;AAClD;AAAA,kBACF;AACA,+BAAa,KAAK,MAA2B;AAAA,gBAC/C;AAAA,cACF;AAAA,YACF,QAAQ;AACN;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,qBAAqB,aACxB;AAAA,QACC,CAAC,OAAO,OAAO,QACb,IAAI,UAAU,CAAC,MAAM,EAAE,aAAa,MAAM,QAAQ,MAAM;AAAA,MAAA,EAE3D;AAAA,QACC,CAAC,GAAG,MACF,IAAI,KAAK,EAAE,SAAS,EAAE,QAAA,IAAY,IAAI,KAAK,EAAE,SAAS,EAAE,QAAA;AAAA,MAAQ;AAGtE,YAAM,UAAU,mBAAmB,MAAM,GAAG,SAAS;AAErD,aAAO;AAAA,IACT,SAAS,OAAO;AACd,WAAK,OAAO,MAAM,sCAAsC;AAAA,QACtD;AAAA,QACA;AAAA,QACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAAA,CAC7D;AACD,aAAO,CAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,sBAAsB,YAA0C;AAC9D,QAAI;AACF,YAAM,YAAY,aAAa,WAAW,KAAA,IAAS;AACnD,YAAM,kBAAkB,YAAY,KAAK,oBAAoB,SAAS,IAAI;AAE1E,UAAI,eAAe,CAAC,aAAa,UAAU,WAAW,IAAI;AACxD,eAAO,CAAA;AAAA,MACT;AAEA,YAAM,oBAAoB;AAC1B,YAAM,cAAc,mBAAmB;AACvC,YAAM,gBAAgB,KAAK,gBAAgB,eAAe,aAAa;AAAA,QACrE,eAAe;AAAA,QACf,OAAO;AAAA,MAAA,CACR;AAED,YAAM,eAAoC,CAAA;AAE1C,iBAAW,WAAW,eAAe;AACnC,YAAI;AACF,gBAAM,UAAU,QAAQ;AACxB,cAAI,QAAQ,SAAS,0BAA0B,GAAG;AAChD,kBAAM,SAAS,KAAK,MAAM,OAAO;AAEjC,gBAAI,OAAO,YAAY,OAAO,cAAc,OAAO,YAAY;AAC7D,kBAAI,mBAAmB,OAAO,eAAe,iBAAiB;AAC5D;AAAA,cACF;AAEA,kBAAI,OAAO,aAAa,OAAO,OAAO,cAAc,UAAU;AAC5D,uBAAO,YAAY,IAAI,KAAK,OAAO,SAAS;AAAA,cAC9C;AAEA,2BAAa,KAAK,MAA2B;AAAA,YAC/C;AAAA,UACF;AAAA,QACF,SAAS,YAAY;AACnB,eAAK,OAAO,KAAK,mDAAmD;AAAA,YAClE,gBACE,OAAO,QAAQ,YAAY,WACvB,QAAQ,QAAQ,UAAU,GAAG,GAAG,IAChC;AAAA,YACN,OACE,sBAAsB,QAClB,WAAW,UACX,OAAO,UAAU;AAAA,UAAA,CACxB;AACD;AAAA,QACF;AAAA,MACF;AAGA,YAAM,iCAAiB,IAAA;AACvB,YAAM,UAAU,CAAC,MACf,aAAa,OAAO,EAAE,QAAA,IAAY,IAAI,KAAK,CAAC,EAAE,QAAA;AAEhD,iBAAW,SAAS,cAAc;AAChC,cAAM,WAAW,WAAW,IAAI,MAAM,QAAQ;AAC9C,YAAI,CAAC,UAAU;AACb,qBAAW,IAAI,MAAM,UAAU,KAAK;AACpC;AAAA,QACF;AAEA,cAAM,eAAe,QAAQ,SAAS,SAAS;AAC/C,cAAM,cAAc,QAAQ,MAAM,SAAS;AAE3C,cAAM,gBACJ,cAAc,gBACb,CAAC,CAAC,MAAM,iBAAiB,CAAC,SAAS;AAEtC,YAAI,eAAe;AACjB,qBAAW,IAAI,MAAM,UAAU;AAAA,YAC7B,GAAG;AAAA,YACH,GAAG;AAAA,UAAA,CACJ;AAAA,QACH;AAAA,MACF;AAEA,YAAM,UAAU,MAAM,KAAK,WAAW,OAAA,CAAQ,EAAE;AAAA,QAAK,CAAC,GAAG,MACvD,QAAQ,EAAE,SAAS,IAAI,QAAQ,EAAE,SAAS;AAAA,MAAA;AAG5C,aAAO;AAAA,IACT,SAAS,OAAO;AACd,WAAK,OAAO,MAAM,qCAAqC;AAAA,QACrD;AAAA,QACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAAA,CAC7D;AACD,aAAO,CAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,SAAK,aAAa,QAAA;AAClB,SAAK,gBAAgB,QAAA;AACrB,SAAK,aAAa,QAAA;AAAA,EACpB;AACF;AAlpBE,oBAAwB,iBAA8C;AAAA,EACpE,WAAW;AAAA,EACX,eAAe;AAAA,EACf,WAAW;AAAA,EACX,cAAc;AAAA;AAXX,IAAM,qBAAN;"}
1
+ {"version":3,"file":"index18.js","sources":["../../src/memory/smart-memory-manager.ts"],"sourcesContent":["import type { BaseMessage } from '@langchain/core/messages';\nimport { SystemMessage } from '@langchain/core/messages';\nimport { Logger } from '@hashgraphonline/standards-sdk';\nimport { MemoryWindow } from './memory-window';\nimport { ContentStorage } from './content-storage';\nimport { TokenCounter } from './token-counter';\n\n/**\n * Entity association for storing blockchain entity contexts\n */\nexport interface EntityAssociation {\n /** The blockchain entity ID (e.g., tokenId, accountId, topicId) */\n entityId: string;\n /** User-provided or derived friendly name */\n entityName: string;\n /** Type of entity (token, account, topic, schedule, etc.) */\n entityType: string;\n /** When the entity was created/associated */\n createdAt: Date;\n /** Transaction ID that created this entity */\n transactionId?: string;\n /** Optional session identifier to scope associations */\n sessionId?: string;\n}\n\n/**\n * Options for resolving entity references\n */\nexport interface EntityResolutionOptions {\n /** Filter by specific entity type */\n entityType?: string;\n /** Maximum number of results to return */\n limit?: number;\n /** Whether to use fuzzy matching for natural language queries */\n fuzzyMatch?: boolean;\n}\n\n/**\n * Configuration for SmartMemoryManager\n */\nexport interface SmartMemoryConfig {\n /** Maximum tokens for active memory window */\n maxTokens?: number;\n /** Reserve tokens for response generation */\n reserveTokens?: number;\n /** Model name for token counting */\n modelName?: string;\n /** Maximum messages to store in content storage */\n storageLimit?: number;\n}\n\n/**\n * Search options for history search\n */\nexport interface SearchOptions {\n /** Whether to perform case-sensitive search */\n caseSensitive?: boolean;\n /** Maximum number of results to return */\n limit?: number;\n /** Whether to use regex pattern matching */\n useRegex?: boolean;\n}\n\n/**\n * Memory statistics for active memory window\n */\nexport interface MemoryStats {\n /** Total active messages in memory window */\n totalActiveMessages: number;\n /** Current token count including system prompt */\n currentTokenCount: number;\n /** Maximum token capacity */\n maxTokens: number;\n /** Remaining token capacity */\n remainingCapacity: number;\n /** System prompt token count */\n systemPromptTokens: number;\n /** Memory usage percentage */\n usagePercentage: number;\n}\n\nconst IS_ENTITY_ASSOCIATION_FLAG = '\"isEntityAssociation\":true';\n\n/**\n * TODO: investigate using chroma / rag for long term memory\n * Smart memory manager that combines active memory window with long-term storage\n * Provides context-aware memory management with automatic pruning and searchable history\n */\nexport class SmartMemoryManager {\n private memoryWindow: MemoryWindow;\n private _contentStorage: ContentStorage;\n private tokenCounter: TokenCounter;\n private config: Required<SmartMemoryConfig>;\n private logger: Logger;\n\n private static readonly DEFAULT_CONFIG: Required<SmartMemoryConfig> = {\n maxTokens: 8000,\n reserveTokens: 1000,\n modelName: 'gpt-4o',\n storageLimit: 1000,\n };\n\n constructor(config: SmartMemoryConfig = {}) {\n this.config = { ...SmartMemoryManager.DEFAULT_CONFIG, ...config };\n this.logger = new Logger({ module: 'SmartMemoryManager' });\n\n this.tokenCounter = new TokenCounter(this.config.modelName);\n this._contentStorage = new ContentStorage(this.config.storageLimit);\n this.memoryWindow = new MemoryWindow(\n this.config.maxTokens,\n this.config.reserveTokens,\n this.tokenCounter\n );\n }\n\n /**\n * Get the content storage instance for file/content reference operations\n * @returns ContentStorage instance\n */\n get contentStorage(): ContentStorage {\n return this._contentStorage;\n }\n\n /**\n * Add a message to the active memory window\n * Automatically handles pruning and storage of displaced messages\n * @param message - Message to add\n */\n addMessage(message: BaseMessage): void {\n const result = this.memoryWindow.addMessage(message);\n\n if (result.prunedMessages.length > 0) {\n this._contentStorage.storeMessages(result.prunedMessages);\n }\n }\n\n /**\n * Get all active messages from the memory window\n * @returns Array of active messages in chronological order\n */\n getMessages(): BaseMessage[] {\n return this.memoryWindow.getMessages();\n }\n\n /**\n * Clear active memory window\n * @param clearStorage - Whether to also clear the content storage (default: false)\n */\n clear(clearStorage: boolean = false): void {\n this.memoryWindow.clear();\n\n if (clearStorage) {\n this._contentStorage.clear();\n }\n }\n\n /**\n * Set the system prompt for the memory window\n * @param systemPrompt - System prompt text\n */\n setSystemPrompt(systemPrompt: string): void {\n this.memoryWindow.setSystemPrompt(systemPrompt);\n }\n\n /**\n * Get the current system prompt\n * @returns Current system prompt text\n */\n getSystemPrompt(): string {\n return this.memoryWindow.getSystemPrompt();\n }\n\n /**\n * Search through stored message history\n * @param query - Search term or pattern\n * @param options - Search configuration\n * @returns Array of matching messages from history\n */\n searchHistory(query: string, options: SearchOptions = {}): BaseMessage[] {\n return this._contentStorage.searchMessages(query, options);\n }\n\n /**\n * Get recent messages from storage history\n * @param count - Number of recent messages to retrieve\n * @returns Array of recent messages from storage\n */\n getRecentHistory(count: number): BaseMessage[] {\n return this._contentStorage.getRecentMessages(count);\n }\n\n /**\n * Check if a message can be added without exceeding limits\n * @param message - Message to test\n * @returns True if message can be added\n */\n canAddMessage(message: BaseMessage): boolean {\n return this.memoryWindow.canAddMessage(message);\n }\n\n /**\n * Get statistics about the active memory window\n * @returns Memory usage statistics\n */\n getMemoryStats(): MemoryStats {\n const windowStats = this.memoryWindow.getStats();\n\n return {\n totalActiveMessages: windowStats.totalMessages,\n currentTokenCount: windowStats.currentTokens,\n maxTokens: windowStats.maxTokens,\n remainingCapacity: windowStats.remainingCapacity,\n systemPromptTokens: windowStats.systemPromptTokens,\n usagePercentage: windowStats.usagePercentage,\n };\n }\n\n /**\n * Get statistics about the content storage\n * @returns Storage usage statistics\n */\n getStorageStats(): ReturnType<ContentStorage['getStorageStats']> {\n return this._contentStorage.getStorageStats();\n }\n\n /**\n * Get combined statistics for both active memory and storage\n * @returns Combined memory and storage statistics\n */\n getOverallStats(): {\n activeMemory: MemoryStats;\n storage: ReturnType<ContentStorage['getStorageStats']>;\n totalMessagesManaged: number;\n activeMemoryUtilization: number;\n storageUtilization: number;\n } {\n const memoryStats = this.getMemoryStats();\n const storageStats = this.getStorageStats();\n\n return {\n activeMemory: memoryStats,\n storage: storageStats,\n totalMessagesManaged:\n memoryStats.totalActiveMessages + storageStats.totalMessages,\n activeMemoryUtilization: memoryStats.usagePercentage,\n storageUtilization: storageStats.usagePercentage,\n };\n }\n\n /**\n * Update the configuration and apply changes\n * @param newConfig - New configuration options\n */\n updateConfig(newConfig: Partial<SmartMemoryConfig>): void {\n this.config = { ...this.config, ...newConfig };\n\n if (\n newConfig.maxTokens !== undefined ||\n newConfig.reserveTokens !== undefined\n ) {\n this.memoryWindow.updateLimits(\n this.config.maxTokens,\n this.config.reserveTokens\n );\n }\n\n if (newConfig.storageLimit !== undefined) {\n this._contentStorage.updateStorageLimit(this.config.storageLimit);\n }\n }\n\n /**\n * Get current configuration\n * @returns Current configuration settings\n */\n getConfig(): Required<SmartMemoryConfig> {\n return { ...this.config };\n }\n\n /**\n * Get messages from storage within a time range\n * @param startTime - Start of time range\n * @param endTime - End of time range\n * @returns Messages within the specified time range\n */\n getHistoryFromTimeRange(startTime: Date, endTime: Date): BaseMessage[] {\n return this._contentStorage.getMessagesFromTimeRange(startTime, endTime);\n }\n\n /**\n * Get messages from storage by message type\n * @param messageType - Type of messages to retrieve ('human', 'ai', 'system', etc.)\n * @param limit - Maximum number of messages to return\n * @returns Messages of the specified type\n */\n getHistoryByType(messageType: string, limit?: number): BaseMessage[] {\n return this._contentStorage.getMessagesByType(messageType, limit);\n }\n\n /**\n * Get recent messages from storage within the last N minutes\n * @param minutes - Number of minutes to look back\n * @returns Messages from the last N minutes\n */\n getRecentHistoryByTime(minutes: number): BaseMessage[] {\n return this._contentStorage.getRecentMessagesByTime(minutes);\n }\n\n /**\n * Export the current state for persistence or analysis\n * @returns Serializable representation of memory state\n */\n exportState(): {\n config: Required<SmartMemoryConfig>;\n activeMessages: Array<{ content: unknown; type: string }>;\n systemPrompt: string;\n memoryStats: MemoryStats;\n storageStats: ReturnType<ContentStorage['getStorageStats']>;\n storedMessages: ReturnType<ContentStorage['exportMessages']>;\n } {\n return {\n config: this.config,\n activeMessages: this.memoryWindow.getMessages().map((msg) => ({\n content: msg.content,\n type: msg._getType(),\n })),\n systemPrompt: this.memoryWindow.getSystemPrompt(),\n memoryStats: this.getMemoryStats(),\n storageStats: this.getStorageStats(),\n storedMessages: this._contentStorage.exportMessages(),\n };\n }\n\n /**\n * Get a summary of conversation context for external use\n * Useful for providing context to other systems or for logging\n * @param includeStoredContext - Whether to include recent stored messages\n * @returns Context summary object\n */\n getContextSummary(includeStoredContext: boolean = false): {\n activeMessageCount: number;\n systemPrompt: string;\n recentMessages: BaseMessage[];\n memoryUtilization: number;\n hasStoredHistory: boolean;\n recentStoredMessages?: BaseMessage[];\n storageStats?: ReturnType<ContentStorage['getStorageStats']>;\n } {\n const activeMessages = this.getMessages();\n const summary = {\n activeMessageCount: activeMessages.length,\n systemPrompt: this.getSystemPrompt(),\n recentMessages: activeMessages.slice(-5),\n memoryUtilization: this.getMemoryStats().usagePercentage,\n hasStoredHistory: this.getStorageStats().totalMessages > 0,\n };\n\n if (includeStoredContext) {\n return {\n ...summary,\n recentStoredMessages: this.getRecentHistory(10),\n storageStats: this.getStorageStats(),\n };\n }\n\n return summary;\n }\n\n /**\n * Perform maintenance operations\n * Optimizes storage and cleans up resources\n */\n performMaintenance(): void {}\n\n /**\n * Store an entity association for later resolution\n * @param entityId - The blockchain entity ID\n * @param entityName - User-provided or derived friendly name\n * @param entityType - Type of entity (token, account, topic, etc.)\n * @param transactionId - Optional transaction ID that created this entity\n */\n storeEntityAssociation(\n entityId: string,\n entityName: string,\n entityType: string,\n transactionId?: string,\n sessionId?: string\n ): void {\n try {\n if (\n !entityId ||\n typeof entityId !== 'string' ||\n entityId.trim().length === 0\n ) {\n return;\n }\n\n if (\n !entityName ||\n typeof entityName !== 'string' ||\n entityName.trim().length === 0\n ) {\n return;\n }\n\n if (\n !entityType ||\n typeof entityType !== 'string' ||\n entityType.trim().length === 0\n ) {\n return;\n }\n\n const sanitizedEntityId = entityId.trim();\n const sanitizedEntityName = entityName.trim().substring(0, 100);\n const sanitizedEntityType = this.normalizeEntityType(entityType);\n\n let usageHint = '';\n if (sanitizedEntityType === 'tokenid') {\n usageHint = 'Use this as tokenId for HTS operations';\n } else if (sanitizedEntityType === 'topicid') {\n usageHint =\n 'Can be used for HCS operations, HRLs for minting with the format hcs://1/<topicId>, etc.';\n } else if (sanitizedEntityType === 'accountid') {\n usageHint = 'Can be used for account based operations';\n }\n\n const association: EntityAssociation & {\n isEntityAssociation: boolean;\n usage?: string;\n hrl?: string;\n } = {\n entityId: sanitizedEntityId,\n entityName: sanitizedEntityName,\n entityType: sanitizedEntityType,\n createdAt: new Date(),\n isEntityAssociation: true,\n ...(usageHint ? { usage: usageHint } : {}),\n ...(sanitizedEntityType === 'topicId'\n ? { hrl: `hcs://1/${sanitizedEntityId}` }\n : {}),\n ...(transactionId !== undefined &&\n transactionId !== null &&\n transactionId.trim() !== ''\n ? { transactionId: transactionId.trim() }\n : {}),\n ...(sessionId && sessionId.trim() !== '' ? { sessionId: sessionId.trim() } : {}),\n };\n\n const content = JSON.stringify(association);\n type LangChainLikeMessage = {\n _getType: () => string;\n content: unknown;\n id: string;\n name?: string;\n additional_kwargs?: Record<string, unknown>;\n };\n\n const entityMessage: LangChainLikeMessage = {\n _getType: () => 'system',\n content: content,\n id: `entity_${sanitizedEntityId}_${Date.now()}`,\n name: 'entity_association',\n additional_kwargs: {\n entityId: sanitizedEntityId,\n entityName: sanitizedEntityName,\n entityType: sanitizedEntityType,\n isEntityAssociation: true,\n ...(sessionId && sessionId.trim() !== '' ? { sessionId: sessionId.trim() } : {}),\n },\n };\n\n try {\n this.memoryWindow.addMessage(new SystemMessage(content));\n } catch {}\n\n this._contentStorage.storeMessages([entityMessage as BaseMessage]);\n } catch (error) {\n this.logger.error('Failed to store entity association', {\n entityId,\n entityName,\n entityType,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Normalize various type aliases to canonical EntityFormat strings using a registry.\n */\n private normalizeEntityType(input: string): string {\n const raw = (input || '').trim();\n if (raw.length === 0) {\n return '';\n }\n\n const key = raw.replace(/[^a-z]/gi, '').toLowerCase();\n\n const REGISTRY: Record<string, string> = {\n topic: 'topicId',\n topicid: 'topicId',\n token: 'tokenId',\n tokenid: 'tokenId',\n account: 'accountId',\n accountid: 'accountId',\n contract: 'contractId',\n contractid: 'contractId',\n file: 'fileId',\n fileid: 'fileId',\n schedule: 'scheduleId',\n scheduleid: 'scheduleId',\n };\n\n if (Object.prototype.hasOwnProperty.call(REGISTRY, key)) {\n return REGISTRY[key];\n }\n\n if (/^[a-z]+Id$/.test(raw)) {\n return raw;\n }\n\n return raw;\n }\n\n /**\n * Resolve entity references from natural language queries\n * @param query - Search query (entity name or natural language reference)\n * @param options - Resolution options for filtering and fuzzy matching\n * @returns Array of matching entity associations\n */\n resolveEntityReference(\n query: string,\n options: EntityResolutionOptions = {}\n ): EntityAssociation[] {\n try {\n if (!query || typeof query !== 'string') {\n return [];\n }\n\n const sanitizedQuery = query.trim();\n if (sanitizedQuery.length === 0) {\n return [];\n }\n\n if (sanitizedQuery.length > 200) {\n }\n\n const { entityType, limit = 10, fuzzyMatch = true } = options;\n\n const safeLimit = Math.max(1, Math.min(limit || 10, 100));\n\n const isEntityIdQuery = /^0\\.0\\.\\d+$/.test(sanitizedQuery);\n\n const searchResults = this._contentStorage.searchMessages(\n sanitizedQuery.substring(0, 200),\n {\n caseSensitive: false,\n limit: safeLimit * 2,\n }\n );\n\n const associations: EntityAssociation[] = [];\n\n for (const message of searchResults) {\n try {\n const content = message.content as string;\n if (\n content.includes(IS_ENTITY_ASSOCIATION_FLAG) ||\n content.includes('entityId')\n ) {\n const parsed = JSON.parse(content);\n if (parsed.entityId && parsed.entityName && parsed.entityType) {\n if (entityType && parsed.entityType !== entityType) {\n continue;\n }\n\n if (isEntityIdQuery) {\n if (parsed.entityId !== sanitizedQuery) {\n continue;\n }\n }\n\n associations.push(parsed as EntityAssociation);\n }\n }\n } catch {\n continue;\n }\n }\n\n if (fuzzyMatch && associations.length === 0 && !isEntityIdQuery) {\n const fuzzyQueries = [\n query.toLowerCase(),\n `token`,\n `account`,\n entityType || '',\n ].filter(Boolean);\n\n for (const fuzzyQuery of fuzzyQueries) {\n if (fuzzyQuery === query.toLowerCase()) continue;\n\n const fuzzyResults = this._contentStorage.searchMessages(fuzzyQuery, {\n caseSensitive: false,\n limit: limit,\n });\n\n for (const message of fuzzyResults) {\n try {\n const content = message.content as string;\n if (content.includes(IS_ENTITY_ASSOCIATION_FLAG)) {\n const parsed = JSON.parse(content);\n if (parsed.entityId && parsed.entityName && parsed.entityType) {\n if (entityType && parsed.entityType !== entityType) {\n continue;\n }\n associations.push(parsed as EntityAssociation);\n }\n }\n } catch {\n continue;\n }\n }\n }\n }\n\n const uniqueAssociations = associations\n .filter(\n (assoc, index, arr) =>\n arr.findIndex((a) => a.entityId === assoc.entityId) === index\n )\n .sort(\n (a, b) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\n );\n\n const results = uniqueAssociations.slice(0, safeLimit);\n\n return results;\n } catch (error) {\n this.logger.error('Failed to resolve entity reference', {\n query,\n options,\n error: error instanceof Error ? error.message : String(error),\n });\n return [];\n }\n }\n\n /**\n * Get all entity associations, optionally filtered by type\n * @param entityType - Optional filter by entity type\n * @returns Array of entity associations\n */\n getEntityAssociations(entityType?: string): EntityAssociation[] {\n try {\n const rawFilter = entityType ? entityType.trim() : undefined;\n const filterCanonical = rawFilter ? this.normalizeEntityType(rawFilter) : undefined;\n\n if (entityType && (!rawFilter || rawFilter.length === 0)) {\n return [];\n }\n\n const SEARCH_ANY_ENTITY = 'entityId';\n const searchQuery = filterCanonical || SEARCH_ANY_ENTITY;\n const searchResults = this._contentStorage.searchMessages(searchQuery, {\n caseSensitive: false,\n limit: 100,\n });\n\n const associations: EntityAssociation[] = [];\n\n for (const message of searchResults) {\n try {\n const content = message.content as string;\n if (content.includes(IS_ENTITY_ASSOCIATION_FLAG)) {\n const parsed = JSON.parse(content);\n\n if (parsed.entityId && parsed.entityName && parsed.entityType) {\n if (filterCanonical && parsed.entityType !== filterCanonical) {\n continue;\n }\n\n if (parsed.createdAt && typeof parsed.createdAt === 'string') {\n parsed.createdAt = new Date(parsed.createdAt);\n }\n\n associations.push(parsed as EntityAssociation);\n }\n }\n } catch (parseError) {\n this.logger.warn('Failed to parse entity association from message', {\n messageContent:\n typeof message.content === 'string'\n ? message.content.substring(0, 100)\n : 'non-string',\n error:\n parseError instanceof Error\n ? parseError.message\n : String(parseError),\n });\n continue;\n }\n }\n\n const mergedById = new Map<string, EntityAssociation>();\n const getTime = (d: Date | string): number =>\n d instanceof Date ? d.getTime() : new Date(d).getTime();\n\n for (const assoc of associations) {\n const existing = mergedById.get(assoc.entityId);\n if (!existing) {\n mergedById.set(assoc.entityId, assoc);\n continue;\n }\n\n const existingTime = getTime(existing.createdAt);\n const currentTime = getTime(assoc.createdAt);\n\n const preferCurrent =\n currentTime > existingTime ||\n (!!assoc.transactionId && !existing.transactionId);\n\n if (preferCurrent) {\n mergedById.set(assoc.entityId, {\n ...existing,\n ...assoc,\n });\n }\n }\n\n const results = Array.from(mergedById.values()).sort((a, b) =>\n getTime(b.createdAt) - getTime(a.createdAt)\n );\n\n return results;\n } catch (error) {\n this.logger.error('Failed to get entity associations', {\n entityType,\n error: error instanceof Error ? error.message : String(error),\n });\n return [];\n }\n }\n\n /**\n * Clean up resources and dispose of components\n */\n dispose(): void {\n this.memoryWindow.dispose();\n this._contentStorage.dispose();\n this.tokenCounter.dispose();\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,16 +1,6 @@
1
1
  import { BasePlugin } from "hedera-agent-kit";
2
2
  import { OpenConvaiState, HCS10Builder, RegisterAgentTool, FindRegistrationsTool, RetrieveProfileTool, InitiateConnectionTool, ListConnectionsTool, SendMessageToConnectionTool, CheckMessagesTool, ConnectionMonitorTool, ManageConnectionRequestsTool, AcceptConnectionRequestTool, ListUnapprovedConnectionRequestsTool } from "@hashgraphonline/standards-agent-kit";
3
3
  import { HCS10Client } from "@hashgraphonline/standards-sdk";
4
- function extractPrivateKey(opKey) {
5
- const key = opKey;
6
- if (typeof key?.toStringRaw === "function") {
7
- return key.toStringRaw();
8
- }
9
- if (typeof key?.toString === "function") {
10
- return key.toString();
11
- }
12
- return String(key);
13
- }
14
4
  function hasInitializeConnectionsManager(stateManager) {
15
5
  return typeof stateManager === "object" && stateManager !== null && "initializeConnectionsManager" in stateManager && typeof stateManager.initializeConnectionsManager === "function";
16
6
  }
@@ -37,15 +27,18 @@ class HCS10Plugin extends BasePlugin {
37
27
  try {
38
28
  this.stateManager = context.stateManager || context.config.stateManager || this.appConfig?.stateManager || new OpenConvaiState();
39
29
  const accountId = hederaKit.signer.getAccountId().toString();
30
+ const isBytesMode = String(hederaKit.operationalMode || "returnBytes") === "returnBytes";
40
31
  let inboundTopicId = "";
41
32
  let outboundTopicId = "";
33
+ let operatorPrivateKeyRef = hederaKit.signer.getOperatorPrivateKey();
34
+ let operatorPrivateKeySerialized;
42
35
  try {
43
- const opKey = hederaKit.signer.getOperatorPrivateKey();
44
- const privateKey = extractPrivateKey(opKey);
36
+ const resolved = typeof operatorPrivateKeyRef?.toString === "function" ? operatorPrivateKeyRef.toString() : "";
37
+ operatorPrivateKeySerialized = resolved;
45
38
  const hcs10Client = new HCS10Client({
46
39
  network: hederaKit.network,
47
40
  operatorId: accountId,
48
- operatorPrivateKey: privateKey,
41
+ operatorPrivateKey: operatorPrivateKeyRef,
49
42
  logLevel: "error"
50
43
  });
51
44
  const profileResponse = await hcs10Client.retrieveProfile(accountId);
@@ -55,43 +48,48 @@ class HCS10Plugin extends BasePlugin {
55
48
  }
56
49
  } catch (profileError) {
57
50
  this.context.logger.warn(
58
- "Could not retrieve profile topics:",
51
+ "Skipping profile topic discovery",
59
52
  profileError
60
53
  );
61
54
  }
62
- this.stateManager.setCurrentAgent({
55
+ const agentRecord = {
63
56
  name: `Agent ${accountId}`,
64
57
  accountId,
65
58
  inboundTopicId,
66
- outboundTopicId,
67
- privateKey: (() => {
68
- const opKey = hederaKit.signer.getOperatorPrivateKey();
69
- return extractPrivateKey(opKey);
70
- })()
71
- });
59
+ outboundTopicId
60
+ };
61
+ if (!isBytesMode && operatorPrivateKeySerialized) {
62
+ agentRecord.privateKey = operatorPrivateKeySerialized;
63
+ }
64
+ this.stateManager.setCurrentAgent(
65
+ agentRecord
66
+ );
72
67
  this.context.logger.info(
73
68
  `Set current agent: ${accountId} with topics ${inboundTopicId}/${outboundTopicId}`
74
69
  );
75
- if (this.stateManager && !this.stateManager.getConnectionsManager()) {
70
+ if (!isBytesMode && this.stateManager && !this.stateManager.getConnectionsManager()) {
76
71
  try {
77
- const opKey = hederaKit.signer.getOperatorPrivateKey();
78
- const privateKey = extractPrivateKey(opKey);
79
72
  const hcs10Client = new HCS10Client({
80
73
  network: hederaKit.network,
81
74
  operatorId: accountId,
82
- operatorPrivateKey: privateKey,
75
+ operatorPrivateKey: operatorPrivateKeyRef ?? "",
83
76
  logLevel: "error"
84
77
  });
85
78
  if (hasInitializeConnectionsManager(this.stateManager)) {
86
79
  this.stateManager.initializeConnectionsManager(hcs10Client);
87
80
  } else {
88
- this.context.logger.warn("StateManager does not support connection manager initialization");
81
+ this.context.logger.warn(
82
+ "StateManager does not support connection manager initialization"
83
+ );
89
84
  }
90
85
  this.context.logger.info(
91
86
  "ConnectionsManager initialized in HCS10Plugin"
92
87
  );
93
88
  } catch (cmError) {
94
- this.context.logger.warn("Could not initialize ConnectionsManager:", cmError);
89
+ this.context.logger.warn(
90
+ "Could not initialize ConnectionsManager:",
91
+ cmError
92
+ );
95
93
  }
96
94
  }
97
95
  this.initializeTools();
@@ -1 +1 @@
1
- {"version":3,"file":"index2.js","sources":["../../src/plugins/hcs-10/HCS10Plugin.ts"],"sourcesContent":["import {\n GenericPluginContext,\n HederaTool,\n BasePlugin,\n HederaAgentKit,\n} from 'hedera-agent-kit';\nimport {\n IStateManager,\n OpenConvaiState,\n HCS10Builder,\n RegisterAgentTool,\n FindRegistrationsTool,\n InitiateConnectionTool,\n ListConnectionsTool,\n SendMessageToConnectionTool,\n CheckMessagesTool,\n ConnectionMonitorTool,\n ManageConnectionRequestsTool,\n AcceptConnectionRequestTool,\n RetrieveProfileTool,\n ListUnapprovedConnectionRequestsTool,\n} from '@hashgraphonline/standards-agent-kit';\nimport { HCS10Client } from '@hashgraphonline/standards-sdk';\n\ninterface HCS10ClientManager {\n initializeConnectionsManager(client: HCS10Client): void;\n}\n\n/**\n * Extracts private key string from operator key\n */\nfunction extractPrivateKey(opKey: unknown): string {\n const key = opKey as {\n toString?: () => string;\n toStringRaw?: () => string;\n };\n \n if (typeof key?.toStringRaw === 'function') {\n return key.toStringRaw();\n }\n \n if (typeof key?.toString === 'function') {\n return key.toString();\n }\n \n return String(key);\n}\n\nfunction hasInitializeConnectionsManager(\n stateManager: IStateManager\n): stateManager is IStateManager & HCS10ClientManager {\n return (\n typeof stateManager === 'object' &&\n stateManager !== null &&\n 'initializeConnectionsManager' in stateManager &&\n typeof stateManager.initializeConnectionsManager === 'function'\n );\n}\n\nexport class HCS10Plugin extends BasePlugin {\n id = 'hcs-10';\n name = 'HCS-10 Plugin';\n description =\n 'HCS-10 agent tools for decentralized agent registration, connections, and messaging on Hedera';\n version = '1.0.0';\n author = 'Hashgraph Online';\n namespace = 'hcs10';\n\n private stateManager?: IStateManager;\n private tools: HederaTool[] = [];\n appConfig?: Record<string, unknown>;\n\n override async initialize(context: GenericPluginContext): Promise<void> {\n await super.initialize(context);\n\n const hederaKit = context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n this.context.logger.warn(\n 'HederaKit not found in context. HCS-10 tools will not be available.'\n );\n return;\n }\n\n try {\n this.stateManager =\n (context.stateManager as IStateManager) ||\n (context.config.stateManager as IStateManager) ||\n (this.appConfig?.stateManager as IStateManager) ||\n new OpenConvaiState();\n\n const accountId = hederaKit.signer.getAccountId().toString();\n let inboundTopicId = '';\n let outboundTopicId = '';\n\n try {\n const opKey = hederaKit.signer.getOperatorPrivateKey();\n const privateKey = extractPrivateKey(opKey);\n\n const hcs10Client = new HCS10Client({\n network: hederaKit.network as 'mainnet' | 'testnet',\n operatorId: accountId,\n operatorPrivateKey: privateKey,\n logLevel: 'error',\n });\n\n const profileResponse = await hcs10Client.retrieveProfile(accountId);\n if (profileResponse.success && profileResponse.topicInfo) {\n inboundTopicId = profileResponse.topicInfo.inboundTopic;\n outboundTopicId = profileResponse.topicInfo.outboundTopic;\n }\n } catch (profileError) {\n this.context.logger.warn(\n 'Could not retrieve profile topics:',\n profileError\n );\n }\n\n this.stateManager.setCurrentAgent({\n name: `Agent ${accountId}`,\n accountId: accountId,\n inboundTopicId,\n outboundTopicId,\n privateKey: ((): string => {\n const opKey = hederaKit.signer.getOperatorPrivateKey();\n return extractPrivateKey(opKey);\n })(),\n });\n\n this.context.logger.info(\n `Set current agent: ${accountId} with topics ${inboundTopicId}/${outboundTopicId}`\n );\n\n if (this.stateManager && !this.stateManager.getConnectionsManager()) {\n try {\n const opKey = hederaKit.signer.getOperatorPrivateKey();\n const privateKey = extractPrivateKey(opKey);\n const hcs10Client = new HCS10Client({\n network: hederaKit.network as 'mainnet' | 'testnet',\n operatorId: accountId,\n operatorPrivateKey: privateKey,\n logLevel: 'error',\n });\n\n if (hasInitializeConnectionsManager(this.stateManager)) {\n this.stateManager.initializeConnectionsManager(hcs10Client);\n } else {\n this.context.logger.warn('StateManager does not support connection manager initialization');\n }\n this.context.logger.info(\n 'ConnectionsManager initialized in HCS10Plugin'\n );\n } catch (cmError) {\n this.context.logger.warn('Could not initialize ConnectionsManager:', cmError);\n }\n }\n\n this.initializeTools();\n\n this.context.logger.info('HCS-10 Plugin initialized successfully');\n } catch (error) {\n this.context.logger.error('Failed to initialize HCS-10 plugin:', error);\n }\n }\n\n private initializeTools(): void {\n if (!this.stateManager) {\n throw new Error('StateManager must be initialized before creating tools');\n }\n\n const hederaKit = this.context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n throw new Error('HederaKit not found in context config');\n }\n\n const hcs10Builder = new HCS10Builder(hederaKit, this.stateManager);\n\n this.tools = [\n new RegisterAgentTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new FindRegistrationsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new RetrieveProfileTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new InitiateConnectionTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ListConnectionsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new SendMessageToConnectionTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new CheckMessagesTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ConnectionMonitorTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ManageConnectionRequestsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new AcceptConnectionRequestTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ListUnapprovedConnectionRequestsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n ];\n }\n\n getTools(): HederaTool[] {\n return this.tools;\n }\n\n getStateManager(): IStateManager | undefined {\n return this.stateManager;\n }\n\n override async cleanup(): Promise<void> {\n this.tools = [];\n delete this.stateManager;\n if (this.context?.logger) {\n this.context.logger.info('HCS-10 Plugin cleaned up');\n }\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index2.js","sources":["../../src/plugins/hcs-10/HCS10Plugin.ts"],"sourcesContent":["import {\n GenericPluginContext,\n HederaTool,\n BasePlugin,\n HederaAgentKit,\n} from 'hedera-agent-kit';\nimport {\n IStateManager,\n OpenConvaiState,\n HCS10Builder,\n RegisterAgentTool,\n FindRegistrationsTool,\n InitiateConnectionTool,\n ListConnectionsTool,\n SendMessageToConnectionTool,\n CheckMessagesTool,\n ConnectionMonitorTool,\n ManageConnectionRequestsTool,\n AcceptConnectionRequestTool,\n RetrieveProfileTool,\n ListUnapprovedConnectionRequestsTool,\n RegisteredAgent,\n} from '@hashgraphonline/standards-agent-kit';\nimport { HCS10Client } from '@hashgraphonline/standards-sdk';\nimport { PrivateKey } from 'node_modules/@hashgraph/sdk/lib/Mnemonic';\n\ninterface HCS10ClientManager {\n initializeConnectionsManager(client: HCS10Client): void;\n}\n\nfunction hasInitializeConnectionsManager(\n stateManager: IStateManager\n): stateManager is IStateManager & HCS10ClientManager {\n return (\n typeof stateManager === 'object' &&\n stateManager !== null &&\n 'initializeConnectionsManager' in stateManager &&\n typeof stateManager.initializeConnectionsManager === 'function'\n );\n}\n\nexport class HCS10Plugin extends BasePlugin {\n id = 'hcs-10';\n name = 'HCS-10 Plugin';\n description =\n 'HCS-10 agent tools for decentralized agent registration, connections, and messaging on Hedera';\n version = '1.0.0';\n author = 'Hashgraph Online';\n namespace = 'hcs10';\n\n private stateManager?: IStateManager;\n private tools: any[] = [];\n appConfig?: Record<string, unknown>;\n\n override async initialize(context: GenericPluginContext): Promise<void> {\n await super.initialize(context);\n\n const hederaKit = context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n this.context.logger.warn(\n 'HederaKit not found in context. HCS-10 tools will not be available.'\n );\n return;\n }\n\n try {\n this.stateManager =\n (context.stateManager as IStateManager) ||\n (context.config.stateManager as IStateManager) ||\n (this.appConfig?.stateManager as IStateManager) ||\n new OpenConvaiState();\n\n const accountId = hederaKit.signer.getAccountId().toString();\n const isBytesMode =\n String(hederaKit.operationalMode || 'returnBytes') === 'returnBytes';\n let inboundTopicId = '';\n let outboundTopicId = '';\n\n let operatorPrivateKeyRef: PrivateKey =\n hederaKit.signer.getOperatorPrivateKey();\n let operatorPrivateKeySerialized: string | undefined;\n\n try {\n const resolved =\n typeof operatorPrivateKeyRef?.toString === 'function'\n ? operatorPrivateKeyRef.toString()\n : '';\n\n operatorPrivateKeySerialized = resolved;\n\n const hcs10Client = new HCS10Client({\n network: hederaKit.network as 'mainnet' | 'testnet',\n operatorId: accountId,\n operatorPrivateKey: operatorPrivateKeyRef,\n logLevel: 'error',\n });\n\n const profileResponse = await hcs10Client.retrieveProfile(accountId);\n if (profileResponse.success && profileResponse.topicInfo) {\n inboundTopicId = profileResponse.topicInfo.inboundTopic;\n outboundTopicId = profileResponse.topicInfo.outboundTopic;\n }\n } catch (profileError) {\n this.context.logger.warn(\n 'Skipping profile topic discovery',\n profileError\n );\n }\n\n const agentRecord: Record<string, unknown> = {\n name: `Agent ${accountId}`,\n accountId: accountId,\n inboundTopicId,\n outboundTopicId,\n };\n if (!isBytesMode && operatorPrivateKeySerialized) {\n agentRecord.privateKey = operatorPrivateKeySerialized;\n }\n this.stateManager.setCurrentAgent(\n agentRecord as unknown as RegisteredAgent\n );\n\n this.context.logger.info(\n `Set current agent: ${accountId} with topics ${inboundTopicId}/${outboundTopicId}`\n );\n\n if (\n !isBytesMode &&\n this.stateManager &&\n !this.stateManager.getConnectionsManager()\n ) {\n try {\n const hcs10Client = new HCS10Client({\n network: hederaKit.network as 'mainnet' | 'testnet',\n operatorId: accountId,\n operatorPrivateKey: operatorPrivateKeyRef ?? '',\n logLevel: 'error',\n });\n\n if (hasInitializeConnectionsManager(this.stateManager)) {\n this.stateManager.initializeConnectionsManager(hcs10Client);\n } else {\n this.context.logger.warn(\n 'StateManager does not support connection manager initialization'\n );\n }\n this.context.logger.info(\n 'ConnectionsManager initialized in HCS10Plugin'\n );\n } catch (cmError) {\n this.context.logger.warn(\n 'Could not initialize ConnectionsManager:',\n cmError\n );\n }\n }\n\n this.initializeTools();\n this.context.logger.info('HCS-10 Plugin initialized successfully');\n } catch (error) {\n this.context.logger.error('Failed to initialize HCS-10 plugin:', error);\n }\n }\n\n private initializeTools(): void {\n if (!this.stateManager) {\n throw new Error('StateManager must be initialized before creating tools');\n }\n\n const hederaKit = this.context.config.hederaKit as HederaAgentKit;\n if (!hederaKit) {\n throw new Error('HederaKit not found in context config');\n }\n\n const hcs10Builder = new HCS10Builder(hederaKit, this.stateManager);\n\n this.tools = [\n new RegisterAgentTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new FindRegistrationsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new RetrieveProfileTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new InitiateConnectionTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ListConnectionsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new SendMessageToConnectionTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new CheckMessagesTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ConnectionMonitorTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ManageConnectionRequestsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new AcceptConnectionRequestTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n new ListUnapprovedConnectionRequestsTool({\n hederaKit: hederaKit,\n hcs10Builder: hcs10Builder,\n logger: this.context.logger,\n }),\n ];\n }\n\n getTools(): HederaTool[] {\n return this.tools;\n }\n\n getStateManager(): IStateManager | undefined {\n return this.stateManager;\n }\n\n override async cleanup(): Promise<void> {\n this.tools = [];\n delete this.stateManager;\n if (this.context?.logger) {\n this.context.logger.info('HCS-10 Plugin cleaned up');\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { ReferenceIdGenerator } from "./index22.js";
2
- import { DEFAULT_CONTENT_REFERENCE_CONFIG, ContentReferenceError } from "./index45.js";
2
+ import { DEFAULT_CONTENT_REFERENCE_CONFIG, ContentReferenceError } from "./index46.js";
3
3
  const _ContentStorage = class _ContentStorage {
4
4
  constructor(maxStorage = _ContentStorage.DEFAULT_MAX_STORAGE, referenceConfig) {
5
5
  this.messages = [];
@@ -1 +1 @@
1
- {"version":3,"file":"index21.js","sources":["../../src/memory/content-storage.ts"],"sourcesContent":["import type { BaseMessage } from '@langchain/core/messages';\nimport { ReferenceIdGenerator } from './reference-id-generator';\nimport {\n ReferenceId,\n ContentReference,\n ContentMetadata,\n ReferenceResolutionResult,\n ContentReferenceConfig,\n ContentReferenceStore,\n ContentReferenceStats,\n ContentReferenceError,\n ContentType,\n ContentSource,\n ReferenceLifecycleState,\n DEFAULT_CONTENT_REFERENCE_CONFIG,\n} from '../types/content-reference';\n\n/**\n * Stored message with metadata\n */\ninterface StoredMessage {\n message: BaseMessage;\n storedAt: Date;\n id: string;\n}\n\n/**\n * Search options for message queries\n */\ninterface SearchOptions {\n /** Whether to perform case-sensitive search */\n caseSensitive?: boolean;\n /** Maximum number of results to return */\n limit?: number;\n /** Whether to use regex pattern matching */\n useRegex?: boolean;\n}\n\n/**\n * Result of storing messages\n */\ninterface StoreResult {\n /** Number of messages successfully stored */\n stored: number;\n /** Number of old messages dropped to make room */\n dropped: number;\n}\n\n/**\n * Storage statistics\n */\nexport interface StorageStats {\n /** Total number of messages currently stored */\n totalMessages: number;\n /** Maximum storage capacity */\n maxStorageLimit: number;\n /** Percentage of storage used */\n usagePercentage: number;\n /** Timestamp of oldest message */\n oldestMessageTime: Date | undefined;\n /** Timestamp of newest message */\n newestMessageTime: Date | undefined;\n}\n\n/**\n * Stored content with reference metadata\n */\ninterface StoredContent {\n /** The actual content buffer */\n content: Buffer;\n\n /** Complete metadata */\n metadata: ContentMetadata;\n\n /** Current lifecycle state */\n state: ReferenceLifecycleState;\n\n /** When this reference expires (if applicable) */\n expiresAt?: Date;\n}\n\n/**\n * Content storage for managing pruned conversation messages and large content references\n * Provides searchable storage with time-based querying and automatic cleanup.\n *\n * Extended to support reference-based storage for large content to optimize context window usage.\n */\nexport class ContentStorage implements ContentReferenceStore {\n private messages: StoredMessage[] = [];\n private maxStorage: number;\n private idCounter: number = 0;\n\n private contentStore: Map<ReferenceId, StoredContent> = new Map();\n private referenceConfig: ContentReferenceConfig;\n private cleanupTimer?: NodeJS.Timeout;\n private referenceStats: Omit<ContentReferenceStats, 'performanceMetrics'> & {\n performanceMetrics: ContentReferenceStats['performanceMetrics'] & {\n creationTimes: number[];\n resolutionTimes: number[];\n cleanupTimes: number[];\n };\n };\n\n public static readonly DEFAULT_MAX_STORAGE = 1000;\n\n constructor(\n maxStorage: number = ContentStorage.DEFAULT_MAX_STORAGE,\n referenceConfig?: Partial<ContentReferenceConfig>\n ) {\n this.maxStorage = maxStorage;\n\n this.referenceConfig = {\n ...DEFAULT_CONTENT_REFERENCE_CONFIG,\n ...referenceConfig,\n };\n this.referenceStats = {\n activeReferences: 0,\n totalStorageBytes: 0,\n recentlyCleanedUp: 0,\n totalResolutions: 0,\n failedResolutions: 0,\n averageContentSize: 0,\n storageUtilization: 0,\n performanceMetrics: {\n averageCreationTimeMs: 0,\n averageResolutionTimeMs: 0,\n averageCleanupTimeMs: 0,\n creationTimes: [],\n resolutionTimes: [],\n cleanupTimes: [],\n },\n };\n\n if (this.referenceConfig.enableAutoCleanup) {\n this.startReferenceCleanupTimer();\n }\n }\n\n /**\n * Store messages in the content storage\n * Automatically drops oldest messages if storage limit is exceeded\n * @param messages - Messages to store\n * @returns Result indicating how many messages were stored and dropped\n */\n storeMessages(messages: BaseMessage[]): StoreResult {\n if (messages.length === 0) {\n return { stored: 0, dropped: 0 };\n }\n\n const now = new Date();\n let dropped = 0;\n\n const storedMessages: StoredMessage[] = messages.map((message) => ({\n message,\n storedAt: now,\n id: this.generateId(),\n }));\n\n this.messages.push(...storedMessages);\n\n while (this.messages.length > this.maxStorage) {\n this.messages.shift();\n dropped++;\n }\n\n return {\n stored: storedMessages.length,\n dropped,\n };\n }\n\n /**\n * Get the most recent messages from storage\n * @param count - Number of recent messages to retrieve\n * @returns Array of recent messages in chronological order\n */\n getRecentMessages(count: number): BaseMessage[] {\n if (count <= 0 || this.messages.length === 0) {\n return [];\n }\n\n const startIndex = Math.max(0, this.messages.length - count);\n return this.messages.slice(startIndex).map((stored) => stored.message);\n }\n\n /**\n * Search for messages containing specific text or patterns\n * @param query - Search term or regex pattern\n * @param options - Search configuration options\n * @returns Array of matching messages\n */\n searchMessages(query: string, options: SearchOptions = {}): BaseMessage[] {\n if (!query || this.messages.length === 0) {\n return [];\n }\n\n const { caseSensitive = false, limit, useRegex = false } = options;\n\n let matches: BaseMessage[] = [];\n\n if (useRegex) {\n try {\n const regex = new RegExp(query, caseSensitive ? 'g' : 'gi');\n matches = this.messages\n .filter((stored) => regex.test(stored.message.content as string))\n .map((stored) => stored.message);\n } catch {\n return [];\n }\n } else {\n const searchTerm = caseSensitive ? query : query.toLowerCase();\n matches = this.messages\n .filter((stored) => {\n const content = stored.message.content as string;\n const searchContent = caseSensitive ? content : content.toLowerCase();\n return searchContent.includes(searchTerm);\n })\n .map((stored) => stored.message);\n }\n\n return limit ? matches.slice(0, limit) : matches;\n }\n\n /**\n * Get messages from a specific time range\n * @param startTime - Start of time range (inclusive)\n * @param endTime - End of time range (inclusive)\n * @returns Array of messages within the time range\n */\n getMessagesFromTimeRange(startTime: Date, endTime: Date): BaseMessage[] {\n if (startTime > endTime || this.messages.length === 0) {\n return [];\n }\n\n return this.messages\n .filter(\n (stored) => stored.storedAt >= startTime && stored.storedAt <= endTime\n )\n .map((stored) => stored.message);\n }\n\n /**\n * Get storage statistics and usage information\n * @returns Current storage statistics\n */\n getStorageStats(): StorageStats {\n const totalMessages = this.messages.length;\n const usagePercentage =\n totalMessages > 0\n ? Math.round((totalMessages / this.maxStorage) * 100)\n : 0;\n\n let oldestMessageTime: Date | undefined;\n let newestMessageTime: Date | undefined;\n\n if (totalMessages > 0) {\n oldestMessageTime = this.messages[0].storedAt;\n newestMessageTime = this.messages[totalMessages - 1].storedAt;\n }\n\n return {\n totalMessages,\n maxStorageLimit: this.maxStorage,\n usagePercentage,\n oldestMessageTime,\n newestMessageTime,\n };\n }\n\n /**\n * Clear all stored messages\n */\n clear(): void {\n this.messages = [];\n this.idCounter = 0;\n }\n\n /**\n * Get total number of stored messages\n * @returns Number of messages currently in storage\n */\n getTotalStoredMessages(): number {\n return this.messages.length;\n }\n\n /**\n * Update the maximum storage limit\n * @param newLimit - New maximum storage limit\n */\n updateStorageLimit(newLimit: number): void {\n if (newLimit <= 0) {\n throw new Error('Storage limit must be greater than 0');\n }\n\n this.maxStorage = newLimit;\n\n while (this.messages.length > this.maxStorage) {\n this.messages.shift();\n }\n }\n\n /**\n * Get messages by message type\n * @param messageType - Type of messages to retrieve ('human', 'ai', 'system', etc.)\n * @param limit - Maximum number of messages to return\n * @returns Array of messages of the specified type\n */\n getMessagesByType(messageType: string, limit?: number): BaseMessage[] {\n const filtered = this.messages\n .filter((stored) => stored.message._getType() === messageType)\n .map((stored) => stored.message);\n\n return limit ? filtered.slice(0, limit) : filtered;\n }\n\n /**\n * Get the current storage configuration\n * @returns Storage configuration object\n */\n getConfig(): { maxStorage: number; currentUsage: number; utilizationPercentage: number } {\n return {\n maxStorage: this.maxStorage,\n currentUsage: this.messages.length,\n utilizationPercentage: (this.messages.length / this.maxStorage) * 100,\n };\n }\n\n /**\n * Generate a unique ID for stored messages\n * @returns Unique string identifier\n */\n private generateId(): string {\n return `msg_${++this.idCounter}_${Date.now()}`;\n }\n\n /**\n * Get messages stored within the last N minutes\n * @param minutes - Number of minutes to look back\n * @returns Array of messages from the last N minutes\n */\n getRecentMessagesByTime(minutes: number): BaseMessage[] {\n if (minutes <= 0 || this.messages.length === 0) {\n return [];\n }\n\n const cutoffTime = new Date(Date.now() - minutes * 60 * 1000);\n\n return this.messages\n .filter((stored) => stored.storedAt >= cutoffTime)\n .map((stored) => stored.message);\n }\n\n /**\n * Export messages to a JSON-serializable format\n * @returns Serializable representation of stored messages\n */\n exportMessages(): Array<{ content: string; type: string; storedAt: string; id: string }> {\n return this.messages.map((stored) => ({\n content: typeof stored.message.content === 'string' \n ? stored.message.content \n : JSON.stringify(stored.message.content),\n type: stored.message._getType(),\n storedAt: stored.storedAt.toISOString(),\n id: stored.id,\n }));\n }\n\n /**\n * Determine if content should be stored as a reference based on size\n */\n shouldUseReference(content: Buffer | string): boolean {\n const size = Buffer.isBuffer(content)\n ? content.length\n : Buffer.byteLength(content, 'utf8');\n return size > this.referenceConfig.sizeThresholdBytes;\n }\n\n /**\n * Store content and return a reference if it exceeds the size threshold\n * Otherwise returns null to indicate direct content should be used\n *\n * Special case: Image files are ALWAYS stored as references regardless of size\n * because they need special handling for inscription tools\n */\n async storeContentIfLarge(\n content: Buffer | string,\n metadata: {\n contentType?: ContentType;\n mimeType?: string;\n source: ContentSource;\n mcpToolName?: string;\n fileName?: string;\n tags?: string[];\n customMetadata?: Record<string, unknown>;\n }\n ): Promise<ContentReference | null> {\n const buffer = Buffer.isBuffer(content)\n ? content\n : Buffer.from(content, 'utf8');\n\n const isImageFile = this.isImageContent(\n metadata.mimeType,\n metadata.fileName\n );\n\n if (!isImageFile && !this.shouldUseReference(buffer)) {\n return null;\n }\n\n const storeMetadata: Omit<\n ContentMetadata,\n 'createdAt' | 'lastAccessedAt' | 'accessCount'\n > = {\n contentType:\n metadata.contentType ||\n this.detectContentType(buffer, metadata.mimeType),\n sizeBytes: buffer.length,\n source: metadata.source,\n tags: [],\n };\n\n if (metadata.mimeType !== undefined) {\n storeMetadata.mimeType = metadata.mimeType;\n }\n if (metadata.mcpToolName !== undefined) {\n storeMetadata.mcpToolName = metadata.mcpToolName;\n }\n if (metadata.fileName !== undefined) {\n storeMetadata.fileName = metadata.fileName;\n }\n if (metadata.tags !== undefined) {\n storeMetadata.tags = metadata.tags;\n }\n if (metadata.customMetadata !== undefined) {\n storeMetadata.customMetadata = metadata.customMetadata;\n }\n\n return await this.storeContent(buffer, storeMetadata);\n }\n\n /**\n * Store content and return a reference (implements ContentReferenceStore)\n */\n async storeContent(\n content: Buffer,\n metadata: Omit<\n ContentMetadata,\n 'createdAt' | 'lastAccessedAt' | 'accessCount'\n >\n ): Promise<ContentReference> {\n const startTime = Date.now();\n\n try {\n const now = new Date();\n const referenceId = ReferenceIdGenerator.generateId(content);\n\n const fullMetadata: ContentMetadata = {\n ...metadata,\n createdAt: now,\n lastAccessedAt: now,\n accessCount: 0,\n };\n\n const storedContent: StoredContent = {\n content,\n metadata: fullMetadata,\n state: 'active',\n };\n\n const expirationTime = this.calculateExpirationTime(metadata.source);\n if (expirationTime !== undefined) {\n storedContent.expiresAt = expirationTime;\n }\n\n this.contentStore.set(referenceId, storedContent);\n\n this.updateStatsAfterStore(content.length);\n\n await this.enforceReferenceStorageLimits();\n\n const preview = this.createContentPreview(\n content,\n fullMetadata.contentType\n );\n\n const referenceMetadata: Pick<\n ContentMetadata,\n 'contentType' | 'sizeBytes' | 'source' | 'fileName' | 'mimeType'\n > = {\n contentType: fullMetadata.contentType,\n sizeBytes: fullMetadata.sizeBytes,\n source: fullMetadata.source,\n };\n\n if (fullMetadata.fileName !== undefined) {\n referenceMetadata.fileName = fullMetadata.fileName;\n }\n if (fullMetadata.mimeType !== undefined) {\n referenceMetadata.mimeType = fullMetadata.mimeType;\n }\n\n const reference: ContentReference = {\n referenceId,\n state: 'active',\n preview,\n metadata: referenceMetadata,\n createdAt: now,\n format: 'ref://{id}' as const,\n };\n\n const duration = Date.now() - startTime;\n this.recordPerformanceMetric('creation', duration);\n\n return reference;\n } catch (error) {\n const duration = Date.now() - startTime;\n this.recordPerformanceMetric('creation', duration);\n\n throw new ContentReferenceError(\n `Failed to store content: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`,\n 'system_error',\n undefined,\n ['Try again', 'Check storage limits', 'Contact administrator']\n );\n }\n }\n\n /**\n * Resolve a reference to its content (implements ContentReferenceStore)\n */\n async resolveReference(\n referenceId: ReferenceId\n ): Promise<ReferenceResolutionResult> {\n const startTime = Date.now();\n\n try {\n if (!ReferenceIdGenerator.isValidReferenceId(referenceId)) {\n this.referenceStats.failedResolutions++;\n return {\n success: false,\n error: 'Invalid reference ID format',\n errorType: 'not_found',\n suggestedActions: [\n 'Check the reference ID format',\n 'Ensure the reference ID is complete',\n ],\n };\n }\n\n const storedContent = this.contentStore.get(referenceId);\n\n if (!storedContent) {\n this.referenceStats.failedResolutions++;\n return {\n success: false,\n error: 'Reference not found',\n errorType: 'not_found',\n suggestedActions: [\n 'Verify the reference ID',\n 'Check if the content has expired',\n 'Request fresh content',\n ],\n };\n }\n\n if (storedContent.expiresAt && storedContent.expiresAt < new Date()) {\n storedContent.state = 'expired';\n this.referenceStats.failedResolutions++;\n return {\n success: false,\n error: 'Reference has expired',\n errorType: 'expired',\n suggestedActions: [\n 'Request fresh content',\n 'Use alternative content source',\n ],\n };\n }\n\n if (storedContent.state !== 'active') {\n this.referenceStats.failedResolutions++;\n return {\n success: false,\n error: `Reference is ${storedContent.state}`,\n errorType:\n storedContent.state === 'expired' ? 'expired' : 'corrupted',\n suggestedActions: [\n 'Request fresh content',\n 'Check reference validity',\n ],\n };\n }\n\n storedContent.metadata.lastAccessedAt = new Date();\n storedContent.metadata.accessCount++;\n\n this.referenceStats.totalResolutions++;\n\n const duration = Date.now() - startTime;\n this.recordPerformanceMetric('resolution', duration);\n\n return {\n success: true,\n content: storedContent.content,\n metadata: storedContent.metadata,\n };\n } catch (error) {\n const duration = Date.now() - startTime;\n this.recordPerformanceMetric('resolution', duration);\n\n this.referenceStats.failedResolutions++;\n\n return {\n success: false,\n error: `System error resolving reference: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`,\n errorType: 'system_error',\n suggestedActions: ['Try again', 'Contact administrator'],\n };\n }\n }\n\n /**\n * Check if a reference exists and is valid\n */\n async hasReference(referenceId: ReferenceId): Promise<boolean> {\n if (!ReferenceIdGenerator.isValidReferenceId(referenceId)) {\n return false;\n }\n\n const storedContent = this.contentStore.get(referenceId);\n if (!storedContent) {\n return false;\n }\n\n if (storedContent.expiresAt && storedContent.expiresAt < new Date()) {\n storedContent.state = 'expired';\n return false;\n }\n\n return storedContent.state === 'active';\n }\n\n /**\n * Mark a reference for cleanup\n */\n async cleanupReference(referenceId: ReferenceId): Promise<boolean> {\n const storedContent = this.contentStore.get(referenceId);\n if (!storedContent) {\n return false;\n }\n\n this.referenceStats.totalStorageBytes -= storedContent.content.length;\n this.referenceStats.activeReferences--;\n this.referenceStats.recentlyCleanedUp++;\n\n this.contentStore.delete(referenceId);\n\n return true;\n }\n\n /**\n * Get current reference storage statistics (implements ContentReferenceStore)\n */\n async getStats(): Promise<ContentReferenceStats> {\n this.updateReferenceStorageStats();\n\n return {\n ...this.referenceStats,\n performanceMetrics: {\n averageCreationTimeMs: this.calculateAverage(\n this.referenceStats.performanceMetrics.creationTimes\n ),\n averageResolutionTimeMs: this.calculateAverage(\n this.referenceStats.performanceMetrics.resolutionTimes\n ),\n averageCleanupTimeMs: this.calculateAverage(\n this.referenceStats.performanceMetrics.cleanupTimes\n ),\n },\n };\n }\n\n /**\n * Update reference configuration\n */\n async updateConfig(config: Partial<ContentReferenceConfig>): Promise<void> {\n this.referenceConfig = { ...this.referenceConfig, ...config };\n\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n delete this.cleanupTimer;\n }\n\n if (this.referenceConfig.enableAutoCleanup) {\n this.startReferenceCleanupTimer();\n }\n }\n\n /**\n * Perform cleanup based on current policies (implements ContentReferenceStore)\n */\n async performCleanup(): Promise<{ cleanedUp: number; errors: string[] }> {\n const startTime = Date.now();\n const errors: string[] = [];\n let cleanedUp = 0;\n\n try {\n const now = new Date();\n const toCleanup: ReferenceId[] = [];\n\n for (const [referenceId, storedContent] of this.contentStore.entries()) {\n let shouldCleanup = false;\n\n if (storedContent.expiresAt && storedContent.expiresAt < now) {\n shouldCleanup = true;\n storedContent.state = 'expired';\n }\n\n const ageMs =\n now.getTime() - storedContent.metadata.createdAt.getTime();\n const policy = this.getCleanupPolicy(storedContent.metadata.source);\n\n if (ageMs > policy.maxAgeMs) {\n shouldCleanup = true;\n }\n\n if (storedContent.state === 'cleanup_pending') {\n shouldCleanup = true;\n }\n\n if (shouldCleanup) {\n toCleanup.push(referenceId);\n }\n }\n\n toCleanup.sort((a, b) => {\n const aContent = this.contentStore.get(a)!;\n const bContent = this.contentStore.get(b)!;\n const aPriority = this.getCleanupPolicy(\n aContent.metadata.source\n ).priority;\n const bPriority = this.getCleanupPolicy(\n bContent.metadata.source\n ).priority;\n return bPriority - aPriority;\n });\n\n for (const referenceId of toCleanup) {\n try {\n const success = await this.cleanupReference(referenceId);\n if (success) {\n cleanedUp++;\n }\n } catch (error) {\n errors.push(\n `Failed to cleanup ${referenceId}: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n );\n }\n }\n\n if (this.contentStore.size > this.referenceConfig.maxReferences) {\n const sortedByAge = Array.from(this.contentStore.entries()).sort(\n ([, a], [, b]) =>\n a.metadata.lastAccessedAt.getTime() -\n b.metadata.lastAccessedAt.getTime()\n );\n\n const excessCount =\n this.contentStore.size - this.referenceConfig.maxReferences;\n for (let i = 0; i < excessCount && i < sortedByAge.length; i++) {\n const [referenceId] = sortedByAge[i];\n try {\n const success = await this.cleanupReference(referenceId);\n if (success) {\n cleanedUp++;\n }\n } catch (error) {\n errors.push(\n `Failed to cleanup excess reference ${referenceId}: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n );\n }\n }\n }\n\n const duration = Date.now() - startTime;\n this.recordPerformanceMetric('cleanup', duration);\n\n return { cleanedUp, errors };\n } catch (error) {\n const duration = Date.now() - startTime;\n this.recordPerformanceMetric('cleanup', duration);\n\n const errorMessage = `Cleanup process failed: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`;\n errors.push(errorMessage);\n\n return { cleanedUp, errors };\n }\n }\n\n /**\n * Get reference configuration for debugging\n */\n getReferenceConfig(): ContentReferenceConfig {\n return { ...this.referenceConfig };\n }\n\n private async enforceReferenceStorageLimits(): Promise<void> {\n if (this.contentStore.size >= this.referenceConfig.maxReferences) {\n await this.performCleanup();\n }\n\n if (\n this.referenceStats.totalStorageBytes >=\n this.referenceConfig.maxTotalStorageBytes\n ) {\n await this.performCleanup();\n }\n }\n\n private calculateExpirationTime(source: ContentSource): Date | undefined {\n const policy = this.getCleanupPolicy(source);\n return new Date(Date.now() + policy.maxAgeMs);\n }\n\n private getCleanupPolicy(source: ContentSource): { maxAgeMs: number; priority: number } {\n switch (source) {\n case 'mcp_tool':\n return this.referenceConfig.cleanupPolicies.recent;\n case 'user_upload':\n return this.referenceConfig.cleanupPolicies.userContent;\n case 'agent_generated':\n return this.referenceConfig.cleanupPolicies.agentGenerated;\n default:\n return this.referenceConfig.cleanupPolicies.default;\n }\n }\n\n private detectContentType(content: Buffer, mimeType?: string): ContentType {\n if (mimeType) {\n if (mimeType === 'text/html') return 'html';\n if (mimeType === 'text/markdown') return 'markdown';\n if (mimeType === 'application/json') return 'json';\n if (mimeType.startsWith('text/')) return 'text';\n return 'binary';\n }\n\n const contentStr = content.toString(\n 'utf8',\n 0,\n Math.min(content.length, 1000)\n );\n if (contentStr.startsWith('{') || contentStr.startsWith('[')) return 'json';\n if (contentStr.includes('<html>') || contentStr.includes('<!DOCTYPE'))\n return 'html';\n if (contentStr.includes('#') && contentStr.includes('\\n'))\n return 'markdown';\n\n return 'text';\n }\n\n private createContentPreview(\n content: Buffer,\n contentType: ContentType\n ): string {\n const maxLength = 200;\n let preview = content.toString(\n 'utf8',\n 0,\n Math.min(content.length, maxLength * 2)\n );\n\n if (contentType === 'html') {\n preview = preview\n .replace(/<[^>]*>/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\n } else if (contentType === 'json') {\n try {\n const parsed = JSON.parse(preview);\n preview = JSON.stringify(parsed, null, 0);\n } catch {}\n }\n\n preview = preview.trim();\n if (preview.length > maxLength) {\n preview = preview.substring(0, maxLength) + '...';\n }\n\n return preview || '[Binary content]';\n }\n\n private updateStatsAfterStore(sizeBytes: number): void {\n this.referenceStats.activeReferences++;\n this.referenceStats.totalStorageBytes += sizeBytes;\n this.updateReferenceStorageStats();\n }\n\n private updateReferenceStorageStats(): void {\n if (this.referenceStats.activeReferences > 0) {\n this.referenceStats.averageContentSize =\n this.referenceStats.totalStorageBytes /\n this.referenceStats.activeReferences;\n }\n\n this.referenceStats.storageUtilization =\n (this.referenceStats.totalStorageBytes /\n this.referenceConfig.maxTotalStorageBytes) *\n 100;\n\n let mostAccessedId: ReferenceId | undefined;\n let maxAccess = 0;\n\n for (const [referenceId, storedContent] of this.contentStore.entries()) {\n if (storedContent.metadata.accessCount > maxAccess) {\n maxAccess = storedContent.metadata.accessCount;\n mostAccessedId = referenceId;\n }\n }\n\n if (mostAccessedId !== undefined) {\n this.referenceStats.mostAccessedReferenceId = mostAccessedId;\n } else {\n delete this.referenceStats.mostAccessedReferenceId;\n }\n }\n\n /**\n * Check if content is an image file based on MIME type or filename\n */\n private isImageContent(mimeType?: string, fileName?: string): boolean {\n if (mimeType && mimeType.startsWith('image/')) {\n return true;\n }\n\n if (fileName) {\n const lowerFileName = fileName.toLowerCase();\n const imageExtensions = [\n '.png',\n '.jpg',\n '.jpeg',\n '.gif',\n '.bmp',\n '.webp',\n '.svg',\n '.tiff',\n '.ico',\n ];\n return imageExtensions.some((ext) => lowerFileName.endsWith(ext));\n }\n\n return false;\n }\n\n private recordPerformanceMetric(\n type: 'creation' | 'resolution' | 'cleanup',\n timeMs: number\n ): void {\n const metrics = this.referenceStats.performanceMetrics;\n const maxRecords = 100;\n\n switch (type) {\n case 'creation':\n metrics.creationTimes.push(timeMs);\n if (metrics.creationTimes.length > maxRecords) {\n metrics.creationTimes.shift();\n }\n break;\n case 'resolution':\n metrics.resolutionTimes.push(timeMs);\n if (metrics.resolutionTimes.length > maxRecords) {\n metrics.resolutionTimes.shift();\n }\n break;\n case 'cleanup':\n metrics.cleanupTimes.push(timeMs);\n if (metrics.cleanupTimes.length > maxRecords) {\n metrics.cleanupTimes.shift();\n }\n break;\n }\n }\n\n private calculateAverage(times: number[]): number {\n if (times.length === 0) return 0;\n return times.reduce((sum, time) => sum + time, 0) / times.length;\n }\n\n private startReferenceCleanupTimer(): void {\n this.cleanupTimer = setInterval(async () => {\n try {\n await this.performCleanup();\n } catch {}\n }, this.referenceConfig.cleanupIntervalMs);\n }\n\n /**\n * Clean up resources (enhanced to include reference cleanup)\n */\n async dispose(): Promise<void> {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n delete this.cleanupTimer;\n }\n\n this.contentStore.clear();\n\n this.clear();\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index21.js","sources":["../../src/memory/content-storage.ts"],"sourcesContent":["import type { BaseMessage } from '@langchain/core/messages';\nimport { ReferenceIdGenerator } from './reference-id-generator';\nimport {\n ReferenceId,\n ContentReference,\n ContentMetadata,\n ReferenceResolutionResult,\n ContentReferenceConfig,\n ContentReferenceStore,\n ContentReferenceStats,\n ContentReferenceError,\n ContentType,\n ContentSource,\n ReferenceLifecycleState,\n DEFAULT_CONTENT_REFERENCE_CONFIG,\n} from '../types/content-reference';\n\n/**\n * Stored message with metadata\n */\ninterface StoredMessage {\n message: BaseMessage;\n storedAt: Date;\n id: string;\n}\n\n/**\n * Search options for message queries\n */\ninterface SearchOptions {\n /** Whether to perform case-sensitive search */\n caseSensitive?: boolean;\n /** Maximum number of results to return */\n limit?: number;\n /** Whether to use regex pattern matching */\n useRegex?: boolean;\n}\n\n/**\n * Result of storing messages\n */\ninterface StoreResult {\n /** Number of messages successfully stored */\n stored: number;\n /** Number of old messages dropped to make room */\n dropped: number;\n}\n\n/**\n * Storage statistics\n */\nexport interface StorageStats {\n /** Total number of messages currently stored */\n totalMessages: number;\n /** Maximum storage capacity */\n maxStorageLimit: number;\n /** Percentage of storage used */\n usagePercentage: number;\n /** Timestamp of oldest message */\n oldestMessageTime: Date | undefined;\n /** Timestamp of newest message */\n newestMessageTime: Date | undefined;\n}\n\n/**\n * Stored content with reference metadata\n */\ninterface StoredContent {\n /** The actual content buffer */\n content: Buffer;\n\n /** Complete metadata */\n metadata: ContentMetadata;\n\n /** Current lifecycle state */\n state: ReferenceLifecycleState;\n\n /** When this reference expires (if applicable) */\n expiresAt?: Date;\n}\n\n/**\n * Content storage for managing pruned conversation messages and large content references\n * Provides searchable storage with time-based querying and automatic cleanup.\n *\n * Extended to support reference-based storage for large content to optimize context window usage.\n */\nexport class ContentStorage implements ContentReferenceStore {\n private messages: StoredMessage[] = [];\n private maxStorage: number;\n private idCounter: number = 0;\n\n private contentStore: Map<ReferenceId, StoredContent> = new Map();\n private referenceConfig: ContentReferenceConfig;\n private cleanupTimer?: NodeJS.Timeout;\n private referenceStats: Omit<ContentReferenceStats, 'performanceMetrics'> & {\n performanceMetrics: ContentReferenceStats['performanceMetrics'] & {\n creationTimes: number[];\n resolutionTimes: number[];\n cleanupTimes: number[];\n };\n };\n\n public static readonly DEFAULT_MAX_STORAGE = 1000;\n\n constructor(\n maxStorage: number = ContentStorage.DEFAULT_MAX_STORAGE,\n referenceConfig?: Partial<ContentReferenceConfig>\n ) {\n this.maxStorage = maxStorage;\n\n this.referenceConfig = {\n ...DEFAULT_CONTENT_REFERENCE_CONFIG,\n ...referenceConfig,\n };\n this.referenceStats = {\n activeReferences: 0,\n totalStorageBytes: 0,\n recentlyCleanedUp: 0,\n totalResolutions: 0,\n failedResolutions: 0,\n averageContentSize: 0,\n storageUtilization: 0,\n performanceMetrics: {\n averageCreationTimeMs: 0,\n averageResolutionTimeMs: 0,\n averageCleanupTimeMs: 0,\n creationTimes: [],\n resolutionTimes: [],\n cleanupTimes: [],\n },\n };\n\n if (this.referenceConfig.enableAutoCleanup) {\n this.startReferenceCleanupTimer();\n }\n }\n\n /**\n * Store messages in the content storage\n * Automatically drops oldest messages if storage limit is exceeded\n * @param messages - Messages to store\n * @returns Result indicating how many messages were stored and dropped\n */\n storeMessages(messages: BaseMessage[]): StoreResult {\n if (messages.length === 0) {\n return { stored: 0, dropped: 0 };\n }\n\n const now = new Date();\n let dropped = 0;\n\n const storedMessages: StoredMessage[] = messages.map((message) => ({\n message,\n storedAt: now,\n id: this.generateId(),\n }));\n\n this.messages.push(...storedMessages);\n\n while (this.messages.length > this.maxStorage) {\n this.messages.shift();\n dropped++;\n }\n\n return {\n stored: storedMessages.length,\n dropped,\n };\n }\n\n /**\n * Get the most recent messages from storage\n * @param count - Number of recent messages to retrieve\n * @returns Array of recent messages in chronological order\n */\n getRecentMessages(count: number): BaseMessage[] {\n if (count <= 0 || this.messages.length === 0) {\n return [];\n }\n\n const startIndex = Math.max(0, this.messages.length - count);\n return this.messages.slice(startIndex).map((stored) => stored.message);\n }\n\n /**\n * Search for messages containing specific text or patterns\n * @param query - Search term or regex pattern\n * @param options - Search configuration options\n * @returns Array of matching messages\n */\n searchMessages(query: string, options: SearchOptions = {}): BaseMessage[] {\n if (!query || this.messages.length === 0) {\n return [];\n }\n\n const { caseSensitive = false, limit, useRegex = false } = options;\n\n let matches: BaseMessage[] = [];\n\n if (useRegex) {\n try {\n const regex = new RegExp(query, caseSensitive ? 'g' : 'gi');\n matches = this.messages\n .filter((stored) => regex.test(stored.message.content as string))\n .map((stored) => stored.message);\n } catch {\n return [];\n }\n } else {\n const searchTerm = caseSensitive ? query : query.toLowerCase();\n matches = this.messages\n .filter((stored) => {\n const content = stored.message.content as string;\n const searchContent = caseSensitive ? content : content.toLowerCase();\n return searchContent.includes(searchTerm);\n })\n .map((stored) => stored.message);\n }\n\n return limit ? matches.slice(0, limit) : matches;\n }\n\n /**\n * Get messages from a specific time range\n * @param startTime - Start of time range (inclusive)\n * @param endTime - End of time range (inclusive)\n * @returns Array of messages within the time range\n */\n getMessagesFromTimeRange(startTime: Date, endTime: Date): BaseMessage[] {\n if (startTime > endTime || this.messages.length === 0) {\n return [];\n }\n\n return this.messages\n .filter(\n (stored) => stored.storedAt >= startTime && stored.storedAt <= endTime\n )\n .map((stored) => stored.message);\n }\n\n /**\n * Get storage statistics and usage information\n * @returns Current storage statistics\n */\n getStorageStats(): StorageStats {\n const totalMessages = this.messages.length;\n const usagePercentage =\n totalMessages > 0\n ? Math.round((totalMessages / this.maxStorage) * 100)\n : 0;\n\n let oldestMessageTime: Date | undefined;\n let newestMessageTime: Date | undefined;\n\n if (totalMessages > 0) {\n oldestMessageTime = this.messages[0].storedAt;\n newestMessageTime = this.messages[totalMessages - 1].storedAt;\n }\n\n return {\n totalMessages,\n maxStorageLimit: this.maxStorage,\n usagePercentage,\n oldestMessageTime,\n newestMessageTime,\n };\n }\n\n /**\n * Clear all stored messages\n */\n clear(): void {\n this.messages = [];\n this.idCounter = 0;\n }\n\n /**\n * Get total number of stored messages\n * @returns Number of messages currently in storage\n */\n getTotalStoredMessages(): number {\n return this.messages.length;\n }\n\n /**\n * Update the maximum storage limit\n * @param newLimit - New maximum storage limit\n */\n updateStorageLimit(newLimit: number): void {\n if (newLimit <= 0) {\n throw new Error('Storage limit must be greater than 0');\n }\n\n this.maxStorage = newLimit;\n\n while (this.messages.length > this.maxStorage) {\n this.messages.shift();\n }\n }\n\n /**\n * Get messages by message type\n * @param messageType - Type of messages to retrieve ('human', 'ai', 'system', etc.)\n * @param limit - Maximum number of messages to return\n * @returns Array of messages of the specified type\n */\n getMessagesByType(messageType: string, limit?: number): BaseMessage[] {\n const filtered = this.messages\n .filter((stored) => stored.message._getType() === messageType)\n .map((stored) => stored.message);\n\n return limit ? filtered.slice(0, limit) : filtered;\n }\n\n /**\n * Get the current storage configuration\n * @returns Storage configuration object\n */\n getConfig(): {\n maxStorage: number;\n currentUsage: number;\n utilizationPercentage: number;\n } {\n return {\n maxStorage: this.maxStorage,\n currentUsage: this.messages.length,\n utilizationPercentage: (this.messages.length / this.maxStorage) * 100,\n };\n }\n\n /**\n * Generate a unique ID for stored messages\n * @returns Unique string identifier\n */\n private generateId(): string {\n return `msg_${++this.idCounter}_${Date.now()}`;\n }\n\n /**\n * Get messages stored within the last N minutes\n * @param minutes - Number of minutes to look back\n * @returns Array of messages from the last N minutes\n */\n getRecentMessagesByTime(minutes: number): BaseMessage[] {\n if (minutes <= 0 || this.messages.length === 0) {\n return [];\n }\n\n const cutoffTime = new Date(Date.now() - minutes * 60 * 1000);\n\n return this.messages\n .filter((stored) => stored.storedAt >= cutoffTime)\n .map((stored) => stored.message);\n }\n\n /**\n * Export messages to a JSON-serializable format\n * @returns Serializable representation of stored messages\n */\n exportMessages(): Array<{\n content: string;\n type: string;\n storedAt: string;\n id: string;\n }> {\n return this.messages.map((stored) => ({\n content:\n typeof stored.message.content === 'string'\n ? stored.message.content\n : JSON.stringify(stored.message.content),\n type: stored.message._getType(),\n storedAt: stored.storedAt.toISOString(),\n id: stored.id,\n }));\n }\n\n /**\n * Determine if content should be stored as a reference based on size\n */\n shouldUseReference(content: Buffer | string): boolean {\n const size = Buffer.isBuffer(content)\n ? content.length\n : Buffer.byteLength(content, 'utf8');\n return size > this.referenceConfig.sizeThresholdBytes;\n }\n\n /**\n * Store content and return a reference if it exceeds the size threshold\n * Otherwise returns null to indicate direct content should be used\n *\n * Special case: Image files are ALWAYS stored as references regardless of size\n * because they need special handling for inscription tools\n */\n async storeContentIfLarge(\n content: Buffer | string,\n metadata: {\n contentType?: ContentType;\n mimeType?: string;\n source: ContentSource;\n mcpToolName?: string;\n fileName?: string;\n tags?: string[];\n customMetadata?: Record<string, unknown>;\n }\n ): Promise<ContentReference | null> {\n const buffer = Buffer.isBuffer(content)\n ? content\n : Buffer.from(content, 'utf8');\n\n const isImageFile = this.isImageContent(\n metadata.mimeType,\n metadata.fileName\n );\n\n if (!isImageFile && !this.shouldUseReference(buffer)) {\n return null;\n }\n\n const storeMetadata: Omit<\n ContentMetadata,\n 'createdAt' | 'lastAccessedAt' | 'accessCount'\n > = {\n contentType:\n metadata.contentType ||\n this.detectContentType(buffer, metadata.mimeType),\n sizeBytes: buffer.length,\n source: metadata.source,\n tags: [],\n };\n\n if (metadata.mimeType !== undefined) {\n storeMetadata.mimeType = metadata.mimeType;\n }\n if (metadata.mcpToolName !== undefined) {\n storeMetadata.mcpToolName = metadata.mcpToolName;\n }\n if (metadata.fileName !== undefined) {\n storeMetadata.fileName = metadata.fileName;\n }\n if (metadata.tags !== undefined) {\n storeMetadata.tags = metadata.tags;\n }\n if (metadata.customMetadata !== undefined) {\n storeMetadata.customMetadata = metadata.customMetadata;\n }\n\n return await this.storeContent(buffer, storeMetadata);\n }\n\n /**\n * Store content and return a reference (implements ContentReferenceStore)\n */\n async storeContent(\n content: Buffer,\n metadata: Omit<\n ContentMetadata,\n 'createdAt' | 'lastAccessedAt' | 'accessCount'\n >\n ): Promise<ContentReference> {\n const startTime = Date.now();\n\n try {\n const now = new Date();\n const referenceId = ReferenceIdGenerator.generateId(content);\n\n const fullMetadata: ContentMetadata = {\n ...metadata,\n createdAt: now,\n lastAccessedAt: now,\n accessCount: 0,\n };\n\n const storedContent: StoredContent = {\n content,\n metadata: fullMetadata,\n state: 'active',\n };\n\n const expirationTime = this.calculateExpirationTime(metadata.source);\n if (expirationTime !== undefined) {\n storedContent.expiresAt = expirationTime;\n }\n\n this.contentStore.set(referenceId, storedContent);\n\n this.updateStatsAfterStore(content.length);\n\n await this.enforceReferenceStorageLimits();\n\n const preview = this.createContentPreview(\n content,\n fullMetadata.contentType\n );\n\n const referenceMetadata: Pick<\n ContentMetadata,\n 'contentType' | 'sizeBytes' | 'source' | 'fileName' | 'mimeType'\n > = {\n contentType: fullMetadata.contentType,\n sizeBytes: fullMetadata.sizeBytes,\n source: fullMetadata.source,\n };\n\n if (fullMetadata.fileName !== undefined) {\n referenceMetadata.fileName = fullMetadata.fileName;\n }\n if (fullMetadata.mimeType !== undefined) {\n referenceMetadata.mimeType = fullMetadata.mimeType;\n }\n\n const reference: ContentReference = {\n referenceId,\n state: 'active',\n preview,\n metadata: referenceMetadata,\n createdAt: now,\n format: 'ref://{id}' as const,\n };\n\n const duration = Date.now() - startTime;\n this.recordPerformanceMetric('creation', duration);\n\n return reference;\n } catch (error) {\n const duration = Date.now() - startTime;\n this.recordPerformanceMetric('creation', duration);\n\n throw new ContentReferenceError(\n `Failed to store content: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`,\n 'system_error',\n undefined,\n ['Try again', 'Check storage limits', 'Contact administrator']\n );\n }\n }\n\n /**\n * Resolve a reference to its content (implements ContentReferenceStore)\n */\n async resolveReference(\n referenceId: ReferenceId\n ): Promise<ReferenceResolutionResult> {\n const startTime = Date.now();\n\n try {\n if (!ReferenceIdGenerator.isValidReferenceId(referenceId)) {\n this.referenceStats.failedResolutions++;\n return {\n success: false,\n error: 'Invalid reference ID format',\n errorType: 'not_found',\n suggestedActions: [\n 'Check the reference ID format',\n 'Ensure the reference ID is complete',\n ],\n };\n }\n\n const storedContent = this.contentStore.get(referenceId);\n\n if (!storedContent) {\n this.referenceStats.failedResolutions++;\n return {\n success: false,\n error: 'Reference not found',\n errorType: 'not_found',\n suggestedActions: [\n 'Verify the reference ID',\n 'Check if the content has expired',\n 'Request fresh content',\n ],\n };\n }\n\n if (storedContent.expiresAt && storedContent.expiresAt < new Date()) {\n storedContent.state = 'expired';\n this.referenceStats.failedResolutions++;\n return {\n success: false,\n error: 'Reference has expired',\n errorType: 'expired',\n suggestedActions: [\n 'Request fresh content',\n 'Use alternative content source',\n ],\n };\n }\n\n if (storedContent.state !== 'active') {\n this.referenceStats.failedResolutions++;\n return {\n success: false,\n error: `Reference is ${storedContent.state}`,\n errorType:\n storedContent.state === 'expired' ? 'expired' : 'corrupted',\n suggestedActions: [\n 'Request fresh content',\n 'Check reference validity',\n ],\n };\n }\n\n storedContent.metadata.lastAccessedAt = new Date();\n storedContent.metadata.accessCount++;\n\n this.referenceStats.totalResolutions++;\n\n const duration = Date.now() - startTime;\n this.recordPerformanceMetric('resolution', duration);\n\n return {\n success: true,\n content: storedContent.content,\n metadata: storedContent.metadata,\n };\n } catch (error) {\n const duration = Date.now() - startTime;\n this.recordPerformanceMetric('resolution', duration);\n\n this.referenceStats.failedResolutions++;\n\n return {\n success: false,\n error: `System error resolving reference: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`,\n errorType: 'system_error',\n suggestedActions: ['Try again', 'Contact administrator'],\n };\n }\n }\n\n /**\n * Check if a reference exists and is valid\n */\n async hasReference(referenceId: ReferenceId): Promise<boolean> {\n if (!ReferenceIdGenerator.isValidReferenceId(referenceId)) {\n return false;\n }\n\n const storedContent = this.contentStore.get(referenceId);\n if (!storedContent) {\n return false;\n }\n\n if (storedContent.expiresAt && storedContent.expiresAt < new Date()) {\n storedContent.state = 'expired';\n return false;\n }\n\n return storedContent.state === 'active';\n }\n\n /**\n * Mark a reference for cleanup\n */\n async cleanupReference(referenceId: ReferenceId): Promise<boolean> {\n const storedContent = this.contentStore.get(referenceId);\n if (!storedContent) {\n return false;\n }\n\n this.referenceStats.totalStorageBytes -= storedContent.content.length;\n this.referenceStats.activeReferences--;\n this.referenceStats.recentlyCleanedUp++;\n\n this.contentStore.delete(referenceId);\n\n return true;\n }\n\n /**\n * Get current reference storage statistics (implements ContentReferenceStore)\n */\n async getStats(): Promise<ContentReferenceStats> {\n this.updateReferenceStorageStats();\n\n return {\n ...this.referenceStats,\n performanceMetrics: {\n averageCreationTimeMs: this.calculateAverage(\n this.referenceStats.performanceMetrics.creationTimes\n ),\n averageResolutionTimeMs: this.calculateAverage(\n this.referenceStats.performanceMetrics.resolutionTimes\n ),\n averageCleanupTimeMs: this.calculateAverage(\n this.referenceStats.performanceMetrics.cleanupTimes\n ),\n },\n };\n }\n\n /**\n * Update reference configuration\n */\n async updateConfig(config: Partial<ContentReferenceConfig>): Promise<void> {\n this.referenceConfig = { ...this.referenceConfig, ...config };\n\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n delete this.cleanupTimer;\n }\n\n if (this.referenceConfig.enableAutoCleanup) {\n this.startReferenceCleanupTimer();\n }\n }\n\n /**\n * Perform cleanup based on current policies (implements ContentReferenceStore)\n */\n async performCleanup(): Promise<{ cleanedUp: number; errors: string[] }> {\n const startTime = Date.now();\n const errors: string[] = [];\n let cleanedUp = 0;\n\n try {\n const now = new Date();\n const toCleanup: ReferenceId[] = [];\n\n for (const [referenceId, storedContent] of this.contentStore.entries()) {\n let shouldCleanup = false;\n\n if (storedContent.expiresAt && storedContent.expiresAt < now) {\n shouldCleanup = true;\n storedContent.state = 'expired';\n }\n\n const ageMs =\n now.getTime() - storedContent.metadata.createdAt.getTime();\n const policy = this.getCleanupPolicy(storedContent.metadata.source);\n\n if (ageMs > policy.maxAgeMs) {\n shouldCleanup = true;\n }\n\n if (storedContent.state === 'cleanup_pending') {\n shouldCleanup = true;\n }\n\n if (shouldCleanup) {\n toCleanup.push(referenceId);\n }\n }\n\n toCleanup.sort((a, b) => {\n const aContent = this.contentStore.get(a)!;\n const bContent = this.contentStore.get(b)!;\n const aPriority = this.getCleanupPolicy(\n aContent.metadata.source\n ).priority;\n const bPriority = this.getCleanupPolicy(\n bContent.metadata.source\n ).priority;\n return bPriority - aPriority;\n });\n\n for (const referenceId of toCleanup) {\n try {\n const success = await this.cleanupReference(referenceId);\n if (success) {\n cleanedUp++;\n }\n } catch (error) {\n errors.push(\n `Failed to cleanup ${referenceId}: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n );\n }\n }\n\n if (this.contentStore.size > this.referenceConfig.maxReferences) {\n const sortedByAge = Array.from(this.contentStore.entries()).sort(\n ([, a], [, b]) =>\n a.metadata.lastAccessedAt.getTime() -\n b.metadata.lastAccessedAt.getTime()\n );\n\n const excessCount =\n this.contentStore.size - this.referenceConfig.maxReferences;\n for (let i = 0; i < excessCount && i < sortedByAge.length; i++) {\n const [referenceId] = sortedByAge[i];\n try {\n const success = await this.cleanupReference(referenceId);\n if (success) {\n cleanedUp++;\n }\n } catch (error) {\n errors.push(\n `Failed to cleanup excess reference ${referenceId}: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n );\n }\n }\n }\n\n const duration = Date.now() - startTime;\n this.recordPerformanceMetric('cleanup', duration);\n\n return { cleanedUp, errors };\n } catch (error) {\n const duration = Date.now() - startTime;\n this.recordPerformanceMetric('cleanup', duration);\n\n const errorMessage = `Cleanup process failed: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`;\n errors.push(errorMessage);\n\n return { cleanedUp, errors };\n }\n }\n\n /**\n * Get reference configuration for debugging\n */\n getReferenceConfig(): ContentReferenceConfig {\n return { ...this.referenceConfig };\n }\n\n private async enforceReferenceStorageLimits(): Promise<void> {\n if (this.contentStore.size >= this.referenceConfig.maxReferences) {\n await this.performCleanup();\n }\n\n if (\n this.referenceStats.totalStorageBytes >=\n this.referenceConfig.maxTotalStorageBytes\n ) {\n await this.performCleanup();\n }\n }\n\n private calculateExpirationTime(source: ContentSource): Date | undefined {\n const policy = this.getCleanupPolicy(source);\n return new Date(Date.now() + policy.maxAgeMs);\n }\n\n private getCleanupPolicy(source: ContentSource): {\n maxAgeMs: number;\n priority: number;\n } {\n switch (source) {\n case 'mcp_tool':\n return this.referenceConfig.cleanupPolicies.recent;\n case 'user_upload':\n return this.referenceConfig.cleanupPolicies.userContent;\n case 'agent_generated':\n return this.referenceConfig.cleanupPolicies.agentGenerated;\n default:\n return this.referenceConfig.cleanupPolicies.default;\n }\n }\n\n private detectContentType(content: Buffer, mimeType?: string): ContentType {\n if (mimeType) {\n if (mimeType === 'text/html') return 'html';\n if (mimeType === 'text/markdown') return 'markdown';\n if (mimeType === 'application/json') return 'json';\n if (mimeType.startsWith('text/')) return 'text';\n return 'binary';\n }\n\n const contentStr = content.toString(\n 'utf8',\n 0,\n Math.min(content.length, 1000)\n );\n if (contentStr.startsWith('{') || contentStr.startsWith('[')) return 'json';\n if (contentStr.includes('<html>') || contentStr.includes('<!DOCTYPE'))\n return 'html';\n if (contentStr.includes('#') && contentStr.includes('\\n'))\n return 'markdown';\n\n return 'text';\n }\n\n private createContentPreview(\n content: Buffer,\n contentType: ContentType\n ): string {\n const maxLength = 200;\n let preview = content.toString(\n 'utf8',\n 0,\n Math.min(content.length, maxLength * 2)\n );\n\n if (contentType === 'html') {\n preview = preview\n .replace(/<[^>]*>/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\n } else if (contentType === 'json') {\n try {\n const parsed = JSON.parse(preview);\n preview = JSON.stringify(parsed, null, 0);\n } catch {}\n }\n\n preview = preview.trim();\n if (preview.length > maxLength) {\n preview = preview.substring(0, maxLength) + '...';\n }\n\n return preview || '[Binary content]';\n }\n\n private updateStatsAfterStore(sizeBytes: number): void {\n this.referenceStats.activeReferences++;\n this.referenceStats.totalStorageBytes += sizeBytes;\n this.updateReferenceStorageStats();\n }\n\n private updateReferenceStorageStats(): void {\n if (this.referenceStats.activeReferences > 0) {\n this.referenceStats.averageContentSize =\n this.referenceStats.totalStorageBytes /\n this.referenceStats.activeReferences;\n }\n\n this.referenceStats.storageUtilization =\n (this.referenceStats.totalStorageBytes /\n this.referenceConfig.maxTotalStorageBytes) *\n 100;\n\n let mostAccessedId: ReferenceId | undefined;\n let maxAccess = 0;\n\n for (const [referenceId, storedContent] of this.contentStore.entries()) {\n if (storedContent.metadata.accessCount > maxAccess) {\n maxAccess = storedContent.metadata.accessCount;\n mostAccessedId = referenceId;\n }\n }\n\n if (mostAccessedId !== undefined) {\n this.referenceStats.mostAccessedReferenceId = mostAccessedId;\n } else {\n delete this.referenceStats.mostAccessedReferenceId;\n }\n }\n\n /**\n * Check if content is an image file based on MIME type or filename\n */\n private isImageContent(mimeType?: string, fileName?: string): boolean {\n if (mimeType && mimeType.startsWith('image/')) {\n return true;\n }\n\n if (fileName) {\n const lowerFileName = fileName.toLowerCase();\n const imageExtensions = [\n '.png',\n '.jpg',\n '.jpeg',\n '.gif',\n '.bmp',\n '.webp',\n '.svg',\n '.tiff',\n '.ico',\n ];\n return imageExtensions.some((ext) => lowerFileName.endsWith(ext));\n }\n\n return false;\n }\n\n private recordPerformanceMetric(\n type: 'creation' | 'resolution' | 'cleanup',\n timeMs: number\n ): void {\n const metrics = this.referenceStats.performanceMetrics;\n const maxRecords = 100;\n\n switch (type) {\n case 'creation':\n metrics.creationTimes.push(timeMs);\n if (metrics.creationTimes.length > maxRecords) {\n metrics.creationTimes.shift();\n }\n break;\n case 'resolution':\n metrics.resolutionTimes.push(timeMs);\n if (metrics.resolutionTimes.length > maxRecords) {\n metrics.resolutionTimes.shift();\n }\n break;\n case 'cleanup':\n metrics.cleanupTimes.push(timeMs);\n if (metrics.cleanupTimes.length > maxRecords) {\n metrics.cleanupTimes.shift();\n }\n break;\n }\n }\n\n private calculateAverage(times: number[]): number {\n if (times.length === 0) return 0;\n return times.reduce((sum, time) => sum + time, 0) / times.length;\n }\n\n private startReferenceCleanupTimer(): void {\n this.cleanupTimer = setInterval(async () => {\n try {\n await this.performCleanup();\n } catch {}\n }, this.referenceConfig.cleanupIntervalMs);\n }\n\n /**\n * Clean up resources (enhanced to include reference cleanup)\n */\n async dispose(): Promise<void> {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n delete this.cleanupTimer;\n }\n\n this.contentStore.clear();\n\n this.clear();\n }\n}\n"],"names":[],"mappings":";;AAuFO,MAAM,kBAAN,MAAM,gBAAgD;AAAA,EAkB3D,YACE,aAAqB,gBAAe,qBACpC,iBACA;AApBF,SAAQ,WAA4B,CAAA;AAEpC,SAAQ,YAAoB;AAE5B,SAAQ,mCAAoD,IAAA;AAiB1D,SAAK,aAAa;AAElB,SAAK,kBAAkB;AAAA,MACrB,GAAG;AAAA,MACH,GAAG;AAAA,IAAA;AAEL,SAAK,iBAAiB;AAAA,MACpB,kBAAkB;AAAA,MAClB,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,mBAAmB;AAAA,MACnB,oBAAoB;AAAA,MACpB,oBAAoB;AAAA,MACpB,oBAAoB;AAAA,QAClB,uBAAuB;AAAA,QACvB,yBAAyB;AAAA,QACzB,sBAAsB;AAAA,QACtB,eAAe,CAAA;AAAA,QACf,iBAAiB,CAAA;AAAA,QACjB,cAAc,CAAA;AAAA,MAAC;AAAA,IACjB;AAGF,QAAI,KAAK,gBAAgB,mBAAmB;AAC1C,WAAK,2BAAA;AAAA,IACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAc,UAAsC;AAClD,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO,EAAE,QAAQ,GAAG,SAAS,EAAA;AAAA,IAC/B;AAEA,UAAM,0BAAU,KAAA;AAChB,QAAI,UAAU;AAEd,UAAM,iBAAkC,SAAS,IAAI,CAAC,aAAa;AAAA,MACjE;AAAA,MACA,UAAU;AAAA,MACV,IAAI,KAAK,WAAA;AAAA,IAAW,EACpB;AAEF,SAAK,SAAS,KAAK,GAAG,cAAc;AAEpC,WAAO,KAAK,SAAS,SAAS,KAAK,YAAY;AAC7C,WAAK,SAAS,MAAA;AACd;AAAA,IACF;AAEA,WAAO;AAAA,MACL,QAAQ,eAAe;AAAA,MACvB;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,OAA8B;AAC9C,QAAI,SAAS,KAAK,KAAK,SAAS,WAAW,GAAG;AAC5C,aAAO,CAAA;AAAA,IACT;AAEA,UAAM,aAAa,KAAK,IAAI,GAAG,KAAK,SAAS,SAAS,KAAK;AAC3D,WAAO,KAAK,SAAS,MAAM,UAAU,EAAE,IAAI,CAAC,WAAW,OAAO,OAAO;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,eAAe,OAAe,UAAyB,IAAmB;AACxE,QAAI,CAAC,SAAS,KAAK,SAAS,WAAW,GAAG;AACxC,aAAO,CAAA;AAAA,IACT;AAEA,UAAM,EAAE,gBAAgB,OAAO,OAAO,WAAW,UAAU;AAE3D,QAAI,UAAyB,CAAA;AAE7B,QAAI,UAAU;AACZ,UAAI;AACF,cAAM,QAAQ,IAAI,OAAO,OAAO,gBAAgB,MAAM,IAAI;AAC1D,kBAAU,KAAK,SACZ,OAAO,CAAC,WAAW,MAAM,KAAK,OAAO,QAAQ,OAAiB,CAAC,EAC/D,IAAI,CAAC,WAAW,OAAO,OAAO;AAAA,MACnC,QAAQ;AACN,eAAO,CAAA;AAAA,MACT;AAAA,IACF,OAAO;AACL,YAAM,aAAa,gBAAgB,QAAQ,MAAM,YAAA;AACjD,gBAAU,KAAK,SACZ,OAAO,CAAC,WAAW;AAClB,cAAM,UAAU,OAAO,QAAQ;AAC/B,cAAM,gBAAgB,gBAAgB,UAAU,QAAQ,YAAA;AACxD,eAAO,cAAc,SAAS,UAAU;AAAA,MAC1C,CAAC,EACA,IAAI,CAAC,WAAW,OAAO,OAAO;AAAA,IACnC;AAEA,WAAO,QAAQ,QAAQ,MAAM,GAAG,KAAK,IAAI;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,yBAAyB,WAAiB,SAA8B;AACtE,QAAI,YAAY,WAAW,KAAK,SAAS,WAAW,GAAG;AACrD,aAAO,CAAA;AAAA,IACT;AAEA,WAAO,KAAK,SACT;AAAA,MACC,CAAC,WAAW,OAAO,YAAY,aAAa,OAAO,YAAY;AAAA,IAAA,EAEhE,IAAI,CAAC,WAAW,OAAO,OAAO;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAgC;AAC9B,UAAM,gBAAgB,KAAK,SAAS;AACpC,UAAM,kBACJ,gBAAgB,IACZ,KAAK,MAAO,gBAAgB,KAAK,aAAc,GAAG,IAClD;AAEN,QAAI;AACJ,QAAI;AAEJ,QAAI,gBAAgB,GAAG;AACrB,0BAAoB,KAAK,SAAS,CAAC,EAAE;AACrC,0BAAoB,KAAK,SAAS,gBAAgB,CAAC,EAAE;AAAA,IACvD;AAEA,WAAO;AAAA,MACL;AAAA,MACA,iBAAiB,KAAK;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,WAAW,CAAA;AAChB,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,yBAAiC;AAC/B,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,mBAAmB,UAAwB;AACzC,QAAI,YAAY,GAAG;AACjB,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AAEA,SAAK,aAAa;AAElB,WAAO,KAAK,SAAS,SAAS,KAAK,YAAY;AAC7C,WAAK,SAAS,MAAA;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,kBAAkB,aAAqB,OAA+B;AACpE,UAAM,WAAW,KAAK,SACnB,OAAO,CAAC,WAAW,OAAO,QAAQ,SAAA,MAAe,WAAW,EAC5D,IAAI,CAAC,WAAW,OAAO,OAAO;AAEjC,WAAO,QAAQ,SAAS,MAAM,GAAG,KAAK,IAAI;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAIE;AACA,WAAO;AAAA,MACL,YAAY,KAAK;AAAA,MACjB,cAAc,KAAK,SAAS;AAAA,MAC5B,uBAAwB,KAAK,SAAS,SAAS,KAAK,aAAc;AAAA,IAAA;AAAA,EAEtE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,aAAqB;AAC3B,WAAO,OAAO,EAAE,KAAK,SAAS,IAAI,KAAK,KAAK;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,wBAAwB,SAAgC;AACtD,QAAI,WAAW,KAAK,KAAK,SAAS,WAAW,GAAG;AAC9C,aAAO,CAAA;AAAA,IACT;AAEA,UAAM,aAAa,IAAI,KAAK,KAAK,QAAQ,UAAU,KAAK,GAAI;AAE5D,WAAO,KAAK,SACT,OAAO,CAAC,WAAW,OAAO,YAAY,UAAU,EAChD,IAAI,CAAC,WAAW,OAAO,OAAO;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAKG;AACD,WAAO,KAAK,SAAS,IAAI,CAAC,YAAY;AAAA,MACpC,SACE,OAAO,OAAO,QAAQ,YAAY,WAC9B,OAAO,QAAQ,UACf,KAAK,UAAU,OAAO,QAAQ,OAAO;AAAA,MAC3C,MAAM,OAAO,QAAQ,SAAA;AAAA,MACrB,UAAU,OAAO,SAAS,YAAA;AAAA,MAC1B,IAAI,OAAO;AAAA,IAAA,EACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,SAAmC;AACpD,UAAM,OAAO,OAAO,SAAS,OAAO,IAChC,QAAQ,SACR,OAAO,WAAW,SAAS,MAAM;AACrC,WAAO,OAAO,KAAK,gBAAgB;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,oBACJ,SACA,UASkC;AAClC,UAAM,SAAS,OAAO,SAAS,OAAO,IAClC,UACA,OAAO,KAAK,SAAS,MAAM;AAE/B,UAAM,cAAc,KAAK;AAAA,MACvB,SAAS;AAAA,MACT,SAAS;AAAA,IAAA;AAGX,QAAI,CAAC,eAAe,CAAC,KAAK,mBAAmB,MAAM,GAAG;AACpD,aAAO;AAAA,IACT;AAEA,UAAM,gBAGF;AAAA,MACF,aACE,SAAS,eACT,KAAK,kBAAkB,QAAQ,SAAS,QAAQ;AAAA,MAClD,WAAW,OAAO;AAAA,MAClB,QAAQ,SAAS;AAAA,MACjB,MAAM,CAAA;AAAA,IAAC;AAGT,QAAI,SAAS,aAAa,QAAW;AACnC,oBAAc,WAAW,SAAS;AAAA,IACpC;AACA,QAAI,SAAS,gBAAgB,QAAW;AACtC,oBAAc,cAAc,SAAS;AAAA,IACvC;AACA,QAAI,SAAS,aAAa,QAAW;AACnC,oBAAc,WAAW,SAAS;AAAA,IACpC;AACA,QAAI,SAAS,SAAS,QAAW;AAC/B,oBAAc,OAAO,SAAS;AAAA,IAChC;AACA,QAAI,SAAS,mBAAmB,QAAW;AACzC,oBAAc,iBAAiB,SAAS;AAAA,IAC1C;AAEA,WAAO,MAAM,KAAK,aAAa,QAAQ,aAAa;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aACJ,SACA,UAI2B;AAC3B,UAAM,YAAY,KAAK,IAAA;AAEvB,QAAI;AACF,YAAM,0BAAU,KAAA;AAChB,YAAM,cAAc,qBAAqB,WAAW,OAAO;AAE3D,YAAM,eAAgC;AAAA,QACpC,GAAG;AAAA,QACH,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,aAAa;AAAA,MAAA;AAGf,YAAM,gBAA+B;AAAA,QACnC;AAAA,QACA,UAAU;AAAA,QACV,OAAO;AAAA,MAAA;AAGT,YAAM,iBAAiB,KAAK,wBAAwB,SAAS,MAAM;AACnE,UAAI,mBAAmB,QAAW;AAChC,sBAAc,YAAY;AAAA,MAC5B;AAEA,WAAK,aAAa,IAAI,aAAa,aAAa;AAEhD,WAAK,sBAAsB,QAAQ,MAAM;AAEzC,YAAM,KAAK,8BAAA;AAEX,YAAM,UAAU,KAAK;AAAA,QACnB;AAAA,QACA,aAAa;AAAA,MAAA;AAGf,YAAM,oBAGF;AAAA,QACF,aAAa,aAAa;AAAA,QAC1B,WAAW,aAAa;AAAA,QACxB,QAAQ,aAAa;AAAA,MAAA;AAGvB,UAAI,aAAa,aAAa,QAAW;AACvC,0BAAkB,WAAW,aAAa;AAAA,MAC5C;AACA,UAAI,aAAa,aAAa,QAAW;AACvC,0BAAkB,WAAW,aAAa;AAAA,MAC5C;AAEA,YAAM,YAA8B;AAAA,QAClC;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA,UAAU;AAAA,QACV,WAAW;AAAA,QACX,QAAQ;AAAA,MAAA;AAGV,YAAM,WAAW,KAAK,IAAA,IAAQ;AAC9B,WAAK,wBAAwB,YAAY,QAAQ;AAEjD,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,WAAW,KAAK,IAAA,IAAQ;AAC9B,WAAK,wBAAwB,YAAY,QAAQ;AAEjD,YAAM,IAAI;AAAA,QACR,4BACE,iBAAiB,QAAQ,MAAM,UAAU,eAC3C;AAAA,QACA;AAAA,QACA;AAAA,QACA,CAAC,aAAa,wBAAwB,uBAAuB;AAAA,MAAA;AAAA,IAEjE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBACJ,aACoC;AACpC,UAAM,YAAY,KAAK,IAAA;AAEvB,QAAI;AACF,UAAI,CAAC,qBAAqB,mBAAmB,WAAW,GAAG;AACzD,aAAK,eAAe;AACpB,eAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAO;AAAA,UACP,WAAW;AAAA,UACX,kBAAkB;AAAA,YAChB;AAAA,YACA;AAAA,UAAA;AAAA,QACF;AAAA,MAEJ;AAEA,YAAM,gBAAgB,KAAK,aAAa,IAAI,WAAW;AAEvD,UAAI,CAAC,eAAe;AAClB,aAAK,eAAe;AACpB,eAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAO;AAAA,UACP,WAAW;AAAA,UACX,kBAAkB;AAAA,YAChB;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,QACF;AAAA,MAEJ;AAEA,UAAI,cAAc,aAAa,cAAc,YAAY,oBAAI,QAAQ;AACnE,sBAAc,QAAQ;AACtB,aAAK,eAAe;AACpB,eAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAO;AAAA,UACP,WAAW;AAAA,UACX,kBAAkB;AAAA,YAChB;AAAA,YACA;AAAA,UAAA;AAAA,QACF;AAAA,MAEJ;AAEA,UAAI,cAAc,UAAU,UAAU;AACpC,aAAK,eAAe;AACpB,eAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAO,gBAAgB,cAAc,KAAK;AAAA,UAC1C,WACE,cAAc,UAAU,YAAY,YAAY;AAAA,UAClD,kBAAkB;AAAA,YAChB;AAAA,YACA;AAAA,UAAA;AAAA,QACF;AAAA,MAEJ;AAEA,oBAAc,SAAS,iBAAiB,oBAAI,KAAA;AAC5C,oBAAc,SAAS;AAEvB,WAAK,eAAe;AAEpB,YAAM,WAAW,KAAK,IAAA,IAAQ;AAC9B,WAAK,wBAAwB,cAAc,QAAQ;AAEnD,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,cAAc;AAAA,QACvB,UAAU,cAAc;AAAA,MAAA;AAAA,IAE5B,SAAS,OAAO;AACd,YAAM,WAAW,KAAK,IAAA,IAAQ;AAC9B,WAAK,wBAAwB,cAAc,QAAQ;AAEnD,WAAK,eAAe;AAEpB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,qCACL,iBAAiB,QAAQ,MAAM,UAAU,eAC3C;AAAA,QACA,WAAW;AAAA,QACX,kBAAkB,CAAC,aAAa,uBAAuB;AAAA,MAAA;AAAA,IAE3D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,aAA4C;AAC7D,QAAI,CAAC,qBAAqB,mBAAmB,WAAW,GAAG;AACzD,aAAO;AAAA,IACT;AAEA,UAAM,gBAAgB,KAAK,aAAa,IAAI,WAAW;AACvD,QAAI,CAAC,eAAe;AAClB,aAAO;AAAA,IACT;AAEA,QAAI,cAAc,aAAa,cAAc,YAAY,oBAAI,QAAQ;AACnE,oBAAc,QAAQ;AACtB,aAAO;AAAA,IACT;AAEA,WAAO,cAAc,UAAU;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,aAA4C;AACjE,UAAM,gBAAgB,KAAK,aAAa,IAAI,WAAW;AACvD,QAAI,CAAC,eAAe;AAClB,aAAO;AAAA,IACT;AAEA,SAAK,eAAe,qBAAqB,cAAc,QAAQ;AAC/D,SAAK,eAAe;AACpB,SAAK,eAAe;AAEpB,SAAK,aAAa,OAAO,WAAW;AAEpC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAA2C;AAC/C,SAAK,4BAAA;AAEL,WAAO;AAAA,MACL,GAAG,KAAK;AAAA,MACR,oBAAoB;AAAA,QAClB,uBAAuB,KAAK;AAAA,UAC1B,KAAK,eAAe,mBAAmB;AAAA,QAAA;AAAA,QAEzC,yBAAyB,KAAK;AAAA,UAC5B,KAAK,eAAe,mBAAmB;AAAA,QAAA;AAAA,QAEzC,sBAAsB,KAAK;AAAA,UACzB,KAAK,eAAe,mBAAmB;AAAA,QAAA;AAAA,MACzC;AAAA,IACF;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,QAAwD;AACzE,SAAK,kBAAkB,EAAE,GAAG,KAAK,iBAAiB,GAAG,OAAA;AAErD,QAAI,KAAK,cAAc;AACrB,oBAAc,KAAK,YAAY;AAC/B,aAAO,KAAK;AAAA,IACd;AAEA,QAAI,KAAK,gBAAgB,mBAAmB;AAC1C,WAAK,2BAAA;AAAA,IACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAmE;AACvE,UAAM,YAAY,KAAK,IAAA;AACvB,UAAM,SAAmB,CAAA;AACzB,QAAI,YAAY;AAEhB,QAAI;AACF,YAAM,0BAAU,KAAA;AAChB,YAAM,YAA2B,CAAA;AAEjC,iBAAW,CAAC,aAAa,aAAa,KAAK,KAAK,aAAa,WAAW;AACtE,YAAI,gBAAgB;AAEpB,YAAI,cAAc,aAAa,cAAc,YAAY,KAAK;AAC5D,0BAAgB;AAChB,wBAAc,QAAQ;AAAA,QACxB;AAEA,cAAM,QACJ,IAAI,QAAA,IAAY,cAAc,SAAS,UAAU,QAAA;AACnD,cAAM,SAAS,KAAK,iBAAiB,cAAc,SAAS,MAAM;AAElE,YAAI,QAAQ,OAAO,UAAU;AAC3B,0BAAgB;AAAA,QAClB;AAEA,YAAI,cAAc,UAAU,mBAAmB;AAC7C,0BAAgB;AAAA,QAClB;AAEA,YAAI,eAAe;AACjB,oBAAU,KAAK,WAAW;AAAA,QAC5B;AAAA,MACF;AAEA,gBAAU,KAAK,CAAC,GAAG,MAAM;AACvB,cAAM,WAAW,KAAK,aAAa,IAAI,CAAC;AACxC,cAAM,WAAW,KAAK,aAAa,IAAI,CAAC;AACxC,cAAM,YAAY,KAAK;AAAA,UACrB,SAAS,SAAS;AAAA,QAAA,EAClB;AACF,cAAM,YAAY,KAAK;AAAA,UACrB,SAAS,SAAS;AAAA,QAAA,EAClB;AACF,eAAO,YAAY;AAAA,MACrB,CAAC;AAED,iBAAW,eAAe,WAAW;AACnC,YAAI;AACF,gBAAM,UAAU,MAAM,KAAK,iBAAiB,WAAW;AACvD,cAAI,SAAS;AACX;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,iBAAO;AAAA,YACL,qBAAqB,WAAW,KAC9B,iBAAiB,QAAQ,MAAM,UAAU,eAC3C;AAAA,UAAA;AAAA,QAEJ;AAAA,MACF;AAEA,UAAI,KAAK,aAAa,OAAO,KAAK,gBAAgB,eAAe;AAC/D,cAAM,cAAc,MAAM,KAAK,KAAK,aAAa,QAAA,CAAS,EAAE;AAAA,UAC1D,CAAC,CAAA,EAAG,CAAC,GAAG,GAAG,CAAC,MACV,EAAE,SAAS,eAAe,QAAA,IAC1B,EAAE,SAAS,eAAe,QAAA;AAAA,QAAQ;AAGtC,cAAM,cACJ,KAAK,aAAa,OAAO,KAAK,gBAAgB;AAChD,iBAAS,IAAI,GAAG,IAAI,eAAe,IAAI,YAAY,QAAQ,KAAK;AAC9D,gBAAM,CAAC,WAAW,IAAI,YAAY,CAAC;AACnC,cAAI;AACF,kBAAM,UAAU,MAAM,KAAK,iBAAiB,WAAW;AACvD,gBAAI,SAAS;AACX;AAAA,YACF;AAAA,UACF,SAAS,OAAO;AACd,mBAAO;AAAA,cACL,sCAAsC,WAAW,KAC/C,iBAAiB,QAAQ,MAAM,UAAU,eAC3C;AAAA,YAAA;AAAA,UAEJ;AAAA,QACF;AAAA,MACF;AAEA,YAAM,WAAW,KAAK,IAAA,IAAQ;AAC9B,WAAK,wBAAwB,WAAW,QAAQ;AAEhD,aAAO,EAAE,WAAW,OAAA;AAAA,IACtB,SAAS,OAAO;AACd,YAAM,WAAW,KAAK,IAAA,IAAQ;AAC9B,WAAK,wBAAwB,WAAW,QAAQ;AAEhD,YAAM,eAAe,2BACnB,iBAAiB,QAAQ,MAAM,UAAU,eAC3C;AACA,aAAO,KAAK,YAAY;AAExB,aAAO,EAAE,WAAW,OAAA;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,qBAA6C;AAC3C,WAAO,EAAE,GAAG,KAAK,gBAAA;AAAA,EACnB;AAAA,EAEA,MAAc,gCAA+C;AAC3D,QAAI,KAAK,aAAa,QAAQ,KAAK,gBAAgB,eAAe;AAChE,YAAM,KAAK,eAAA;AAAA,IACb;AAEA,QACE,KAAK,eAAe,qBACpB,KAAK,gBAAgB,sBACrB;AACA,YAAM,KAAK,eAAA;AAAA,IACb;AAAA,EACF;AAAA,EAEQ,wBAAwB,QAAyC;AACvE,UAAM,SAAS,KAAK,iBAAiB,MAAM;AAC3C,WAAO,IAAI,KAAK,KAAK,IAAA,IAAQ,OAAO,QAAQ;AAAA,EAC9C;AAAA,EAEQ,iBAAiB,QAGvB;AACA,YAAQ,QAAA;AAAA,MACN,KAAK;AACH,eAAO,KAAK,gBAAgB,gBAAgB;AAAA,MAC9C,KAAK;AACH,eAAO,KAAK,gBAAgB,gBAAgB;AAAA,MAC9C,KAAK;AACH,eAAO,KAAK,gBAAgB,gBAAgB;AAAA,MAC9C;AACE,eAAO,KAAK,gBAAgB,gBAAgB;AAAA,IAAA;AAAA,EAElD;AAAA,EAEQ,kBAAkB,SAAiB,UAAgC;AACzE,QAAI,UAAU;AACZ,UAAI,aAAa,YAAa,QAAO;AACrC,UAAI,aAAa,gBAAiB,QAAO;AACzC,UAAI,aAAa,mBAAoB,QAAO;AAC5C,UAAI,SAAS,WAAW,OAAO,EAAG,QAAO;AACzC,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,QAAQ;AAAA,MACzB;AAAA,MACA;AAAA,MACA,KAAK,IAAI,QAAQ,QAAQ,GAAI;AAAA,IAAA;AAE/B,QAAI,WAAW,WAAW,GAAG,KAAK,WAAW,WAAW,GAAG,EAAG,QAAO;AACrE,QAAI,WAAW,SAAS,QAAQ,KAAK,WAAW,SAAS,WAAW;AAClE,aAAO;AACT,QAAI,WAAW,SAAS,GAAG,KAAK,WAAW,SAAS,IAAI;AACtD,aAAO;AAET,WAAO;AAAA,EACT;AAAA,EAEQ,qBACN,SACA,aACQ;AACR,UAAM,YAAY;AAClB,QAAI,UAAU,QAAQ;AAAA,MACpB;AAAA,MACA;AAAA,MACA,KAAK,IAAI,QAAQ,QAAQ,YAAY,CAAC;AAAA,IAAA;AAGxC,QAAI,gBAAgB,QAAQ;AAC1B,gBAAU,QACP,QAAQ,YAAY,EAAE,EACtB,QAAQ,QAAQ,GAAG,EACnB,KAAA;AAAA,IACL,WAAW,gBAAgB,QAAQ;AACjC,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,OAAO;AACjC,kBAAU,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,MAC1C,QAAQ;AAAA,MAAC;AAAA,IACX;AAEA,cAAU,QAAQ,KAAA;AAClB,QAAI,QAAQ,SAAS,WAAW;AAC9B,gBAAU,QAAQ,UAAU,GAAG,SAAS,IAAI;AAAA,IAC9C;AAEA,WAAO,WAAW;AAAA,EACpB;AAAA,EAEQ,sBAAsB,WAAyB;AACrD,SAAK,eAAe;AACpB,SAAK,eAAe,qBAAqB;AACzC,SAAK,4BAAA;AAAA,EACP;AAAA,EAEQ,8BAAoC;AAC1C,QAAI,KAAK,eAAe,mBAAmB,GAAG;AAC5C,WAAK,eAAe,qBAClB,KAAK,eAAe,oBACpB,KAAK,eAAe;AAAA,IACxB;AAEA,SAAK,eAAe,qBACjB,KAAK,eAAe,oBACnB,KAAK,gBAAgB,uBACvB;AAEF,QAAI;AACJ,QAAI,YAAY;AAEhB,eAAW,CAAC,aAAa,aAAa,KAAK,KAAK,aAAa,WAAW;AACtE,UAAI,cAAc,SAAS,cAAc,WAAW;AAClD,oBAAY,cAAc,SAAS;AACnC,yBAAiB;AAAA,MACnB;AAAA,IACF;AAEA,QAAI,mBAAmB,QAAW;AAChC,WAAK,eAAe,0BAA0B;AAAA,IAChD,OAAO;AACL,aAAO,KAAK,eAAe;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,UAAmB,UAA4B;AACpE,QAAI,YAAY,SAAS,WAAW,QAAQ,GAAG;AAC7C,aAAO;AAAA,IACT;AAEA,QAAI,UAAU;AACZ,YAAM,gBAAgB,SAAS,YAAA;AAC/B,YAAM,kBAAkB;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAEF,aAAO,gBAAgB,KAAK,CAAC,QAAQ,cAAc,SAAS,GAAG,CAAC;AAAA,IAClE;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,wBACN,MACA,QACM;AACN,UAAM,UAAU,KAAK,eAAe;AACpC,UAAM,aAAa;AAEnB,YAAQ,MAAA;AAAA,MACN,KAAK;AACH,gBAAQ,cAAc,KAAK,MAAM;AACjC,YAAI,QAAQ,cAAc,SAAS,YAAY;AAC7C,kBAAQ,cAAc,MAAA;AAAA,QACxB;AACA;AAAA,MACF,KAAK;AACH,gBAAQ,gBAAgB,KAAK,MAAM;AACnC,YAAI,QAAQ,gBAAgB,SAAS,YAAY;AAC/C,kBAAQ,gBAAgB,MAAA;AAAA,QAC1B;AACA;AAAA,MACF,KAAK;AACH,gBAAQ,aAAa,KAAK,MAAM;AAChC,YAAI,QAAQ,aAAa,SAAS,YAAY;AAC5C,kBAAQ,aAAa,MAAA;AAAA,QACvB;AACA;AAAA,IAAA;AAAA,EAEN;AAAA,EAEQ,iBAAiB,OAAyB;AAChD,QAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,WAAO,MAAM,OAAO,CAAC,KAAK,SAAS,MAAM,MAAM,CAAC,IAAI,MAAM;AAAA,EAC5D;AAAA,EAEQ,6BAAmC;AACzC,SAAK,eAAe,YAAY,YAAY;AAC1C,UAAI;AACF,cAAM,KAAK,eAAA;AAAA,MACb,QAAQ;AAAA,MAAC;AAAA,IACX,GAAG,KAAK,gBAAgB,iBAAiB;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAyB;AAC7B,QAAI,KAAK,cAAc;AACrB,oBAAc,KAAK,YAAY;AAC/B,aAAO,KAAK;AAAA,IACd;AAEA,SAAK,aAAa,MAAA;AAElB,SAAK,MAAA;AAAA,EACP;AACF;AAh6BE,gBAAuB,sBAAsB;AAhBxC,IAAM,iBAAN;"}
@@ -1,16 +1,16 @@
1
1
  import { ChatOpenAI } from "@langchain/openai";
2
2
  import { Logger } from "@hashgraphonline/standards-sdk";
3
- import { ENTITY_PATTERNS } from "./index39.js";
3
+ import { ENTITY_PATTERNS } from "./index43.js";
4
4
  import "hedera-agent-kit";
5
5
  import "@hashgraphonline/standards-agent-kit";
6
- import "./index36.js";
6
+ import "./index13.js";
7
+ import "./index37.js";
7
8
  import "@langchain/core/tools";
8
9
  import "zod";
9
10
  import "./index6.js";
10
11
  import "langchain/agents";
11
12
  import "zod-to-json-schema";
12
13
  import "./index12.js";
13
- import "./index13.js";
14
14
  import "@langchain/core/prompts";
15
15
  import "@modelcontextprotocol/sdk/client/index.js";
16
16
  import "@modelcontextprotocol/sdk/client/stdio.js";