@hashgraphonline/conversational-agent 0.2.101 → 0.2.103

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.
@@ -15,6 +15,8 @@ export interface EntityAssociation {
15
15
  createdAt: Date;
16
16
  /** Transaction ID that created this entity */
17
17
  transactionId?: string;
18
+ /** Optional session identifier to scope associations */
19
+ sessionId?: string;
18
20
  }
19
21
  /**
20
22
  * Options for resolving entity references
@@ -224,7 +226,11 @@ export declare class SmartMemoryManager {
224
226
  * @param entityType - Type of entity (token, account, topic, etc.)
225
227
  * @param transactionId - Optional transaction ID that created this entity
226
228
  */
227
- storeEntityAssociation(entityId: string, entityName: string, entityType: string, transactionId?: string): void;
229
+ storeEntityAssociation(entityId: string, entityName: string, entityType: string, transactionId?: string, sessionId?: string): void;
230
+ /**
231
+ * Normalize various type aliases to canonical EntityFormat strings using a registry.
232
+ */
233
+ private normalizeEntityType;
228
234
  /**
229
235
  * Resolve entity references from natural language queries
230
236
  * @param query - Search query (entity name or natural language reference)
@@ -3,8 +3,8 @@ import { extractRenderConfigs, generateFieldOrdering } from "@hashgraphonline/st
3
3
  import { Logger } from "@hashgraphonline/standards-sdk";
4
4
  import { fieldTypeRegistry } from "./index12.js";
5
5
  import { fieldGuidanceRegistry } from "./index13.js";
6
- import "./index40.js";
7
- import { FIELD_PRIORITIES } from "./index44.js";
6
+ import "./index39.js";
7
+ import { FIELD_PRIORITIES } from "./index40.js";
8
8
  function isZodObjectSchema(schema) {
9
9
  return typeof schema === "object" && schema !== null && "shape" in schema;
10
10
  }
@@ -230,7 +230,7 @@ const _SmartMemoryManager = class _SmartMemoryManager {
230
230
  * @param entityType - Type of entity (token, account, topic, etc.)
231
231
  * @param transactionId - Optional transaction ID that created this entity
232
232
  */
233
- storeEntityAssociation(entityId, entityName, entityType, transactionId) {
233
+ storeEntityAssociation(entityId, entityName, entityType, transactionId, sessionId) {
234
234
  try {
235
235
  if (!entityId || typeof entityId !== "string" || entityId.trim().length === 0) {
236
236
  return;
@@ -243,7 +243,7 @@ const _SmartMemoryManager = class _SmartMemoryManager {
243
243
  }
244
244
  const sanitizedEntityId = entityId.trim();
245
245
  const sanitizedEntityName = entityName.trim().substring(0, 100);
246
- const sanitizedEntityType = entityType.trim().toLowerCase();
246
+ const sanitizedEntityType = this.normalizeEntityType(entityType);
247
247
  let usageHint = "";
248
248
  if (sanitizedEntityType === "tokenid") {
249
249
  usageHint = "Use this as tokenId for HTS operations";
@@ -259,8 +259,9 @@ const _SmartMemoryManager = class _SmartMemoryManager {
259
259
  createdAt: /* @__PURE__ */ new Date(),
260
260
  isEntityAssociation: true,
261
261
  ...usageHint ? { usage: usageHint } : {},
262
- ...sanitizedEntityType === "topicid" ? { hrl: `hcs://1/${sanitizedEntityId}` } : {},
263
- ...transactionId !== void 0 && transactionId !== null && transactionId.trim() !== "" ? { transactionId: transactionId.trim() } : {}
262
+ ...sanitizedEntityType === "topicId" ? { hrl: `hcs://1/${sanitizedEntityId}` } : {},
263
+ ...transactionId !== void 0 && transactionId !== null && transactionId.trim() !== "" ? { transactionId: transactionId.trim() } : {},
264
+ ...sessionId && sessionId.trim() !== "" ? { sessionId: sessionId.trim() } : {}
264
265
  };
265
266
  const content = JSON.stringify(association);
266
267
  const entityMessage = {
@@ -272,7 +273,8 @@ const _SmartMemoryManager = class _SmartMemoryManager {
272
273
  entityId: sanitizedEntityId,
273
274
  entityName: sanitizedEntityName,
274
275
  entityType: sanitizedEntityType,
275
- isEntityAssociation: true
276
+ isEntityAssociation: true,
277
+ ...sessionId && sessionId.trim() !== "" ? { sessionId: sessionId.trim() } : {}
276
278
  }
277
279
  };
278
280
  try {
@@ -289,6 +291,37 @@ const _SmartMemoryManager = class _SmartMemoryManager {
289
291
  });
290
292
  }
291
293
  }
294
+ /**
295
+ * Normalize various type aliases to canonical EntityFormat strings using a registry.
296
+ */
297
+ normalizeEntityType(input) {
298
+ const raw = (input || "").trim();
299
+ if (raw.length === 0) {
300
+ return "";
301
+ }
302
+ const key = raw.replace(/[^a-z]/gi, "").toLowerCase();
303
+ const REGISTRY = {
304
+ topic: "topicId",
305
+ topicid: "topicId",
306
+ token: "tokenId",
307
+ tokenid: "tokenId",
308
+ account: "accountId",
309
+ accountid: "accountId",
310
+ contract: "contractId",
311
+ contractid: "contractId",
312
+ file: "fileId",
313
+ fileid: "fileId",
314
+ schedule: "scheduleId",
315
+ scheduleid: "scheduleId"
316
+ };
317
+ if (Object.prototype.hasOwnProperty.call(REGISTRY, key)) {
318
+ return REGISTRY[key];
319
+ }
320
+ if (/^[a-z]+Id$/.test(raw)) {
321
+ return raw;
322
+ }
323
+ return raw;
324
+ }
292
325
  /**
293
326
  * Resolve entity references from natural language queries
294
327
  * @param query - Search query (entity name or natural language reference)
@@ -392,12 +425,13 @@ const _SmartMemoryManager = class _SmartMemoryManager {
392
425
  */
393
426
  getEntityAssociations(entityType) {
394
427
  try {
395
- const sanitizedEntityType = entityType ? entityType.trim().toLowerCase() : void 0;
396
- if (entityType && (!sanitizedEntityType || sanitizedEntityType.length === 0)) {
428
+ const rawFilter = entityType ? entityType.trim() : void 0;
429
+ const filterCanonical = rawFilter ? this.normalizeEntityType(rawFilter) : void 0;
430
+ if (entityType && (!rawFilter || rawFilter.length === 0)) {
397
431
  return [];
398
432
  }
399
433
  const SEARCH_ANY_ENTITY = "entityId";
400
- const searchQuery = sanitizedEntityType || SEARCH_ANY_ENTITY;
434
+ const searchQuery = filterCanonical || SEARCH_ANY_ENTITY;
401
435
  const searchResults = this._contentStorage.searchMessages(searchQuery, {
402
436
  caseSensitive: false,
403
437
  limit: 100
@@ -409,7 +443,7 @@ const _SmartMemoryManager = class _SmartMemoryManager {
409
443
  if (content.includes(IS_ENTITY_ASSOCIATION_FLAG)) {
410
444
  const parsed = JSON.parse(content);
411
445
  if (parsed.entityId && parsed.entityName && parsed.entityType) {
412
- if (sanitizedEntityType && parsed.entityType !== sanitizedEntityType) {
446
+ if (filterCanonical && parsed.entityType !== filterCanonical) {
413
447
  continue;
414
448
  }
415
449
  if (parsed.createdAt && typeof parsed.createdAt === "string") {
@@ -426,14 +460,27 @@ const _SmartMemoryManager = class _SmartMemoryManager {
426
460
  continue;
427
461
  }
428
462
  }
429
- const results = associations.filter(
430
- (assoc, index, arr) => arr.findIndex((a) => a.entityId === assoc.entityId) === index
431
- ).sort((a, b) => {
432
- const getTime = (d) => d instanceof Date ? d.getTime() : new Date(d).getTime();
433
- const aTime = getTime(a.createdAt);
434
- const bTime = getTime(b.createdAt);
435
- return bTime - aTime;
436
- });
463
+ const mergedById = /* @__PURE__ */ new Map();
464
+ const getTime = (d) => d instanceof Date ? d.getTime() : new Date(d).getTime();
465
+ for (const assoc of associations) {
466
+ const existing = mergedById.get(assoc.entityId);
467
+ if (!existing) {
468
+ mergedById.set(assoc.entityId, assoc);
469
+ continue;
470
+ }
471
+ const existingTime = getTime(existing.createdAt);
472
+ const currentTime = getTime(assoc.createdAt);
473
+ const preferCurrent = currentTime > existingTime || !!assoc.transactionId && !existing.transactionId;
474
+ if (preferCurrent) {
475
+ mergedById.set(assoc.entityId, {
476
+ ...existing,
477
+ ...assoc
478
+ });
479
+ }
480
+ }
481
+ const results = Array.from(mergedById.values()).sort(
482
+ (a, b) => getTime(b.createdAt) - getTime(a.createdAt)
483
+ );
437
484
  return results;
438
485
  } catch (error) {
439
486
  this.logger.error("Failed to get entity associations", {
@@ -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}\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 ): 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 = entityType.trim().toLowerCase();\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 };\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 },\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 * 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 sanitizedEntityType = entityType\n ? entityType.trim().toLowerCase()\n : undefined;\n\n if (\n entityType &&\n (!sanitizedEntityType || sanitizedEntityType.length === 0)\n ) {\n return [];\n }\n\n const SEARCH_ANY_ENTITY = 'entityId';\n const searchQuery = sanitizedEntityType || 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 (\n sanitizedEntityType &&\n parsed.entityType !== sanitizedEntityType\n ) {\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 results = associations\n .filter(\n (assoc, index, arr) =>\n arr.findIndex((a) => a.entityId === assoc.entityId) === index\n )\n .sort((a, b): number => {\n const getTime = (d: Date | string): number =>\n d instanceof Date ? d.getTime() : new Date(d).getTime();\n const aTime = getTime(a.createdAt);\n const bTime = getTime(b.createdAt);\n return bTime - aTime;\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
+ {"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":"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"}
@@ -1,5 +1,5 @@
1
1
  import { ReferenceIdGenerator } from "./index22.js";
2
- import { DEFAULT_CONTENT_REFERENCE_CONFIG, ContentReferenceError } from "./index43.js";
2
+ import { DEFAULT_CONTENT_REFERENCE_CONFIG, ContentReferenceError } from "./index45.js";
3
3
  const _ContentStorage = class _ContentStorage {
4
4
  constructor(maxStorage = _ContentStorage.DEFAULT_MAX_STORAGE, referenceConfig) {
5
5
  this.messages = [];
@@ -1,6 +1,6 @@
1
1
  import { ChatOpenAI } from "@langchain/openai";
2
2
  import { Logger } from "@hashgraphonline/standards-sdk";
3
- import { ENTITY_PATTERNS } from "./index40.js";
3
+ import { ENTITY_PATTERNS } from "./index39.js";
4
4
  import "hedera-agent-kit";
5
5
  import "@hashgraphonline/standards-agent-kit";
6
6
  import "./index36.js";
@@ -195,7 +195,6 @@ class FormAwareAgentExecutor extends AgentExecutor {
195
195
  toolDescription: tool.description
196
196
  },
197
197
  missingFields
198
- // Pass undefined for focused schemas, Set<string> for others
199
198
  );
200
199
  if (this.isZodObject(schemaToUse)) {
201
200
  try {