@hashgraphonline/conversational-agent 0.1.208 → 0.1.210

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 (117) hide show
  1. package/bin/conversational-agent-cli.js +30 -0
  2. package/cli/readme.md +181 -0
  3. package/dist/cjs/base-agent.d.ts +3 -1
  4. package/dist/cjs/conversational-agent.d.ts +64 -13
  5. package/dist/cjs/index.cjs +1 -1
  6. package/dist/cjs/index.cjs.map +1 -1
  7. package/dist/cjs/index.d.ts +6 -3
  8. package/dist/cjs/langchain-agent.d.ts +11 -0
  9. package/dist/cjs/memory/SmartMemoryManager.d.ts +65 -22
  10. package/dist/cjs/memory/TokenCounter.d.ts +1 -1
  11. package/dist/cjs/memory/index.d.ts +1 -1
  12. package/dist/cjs/plugins/hbar/AirdropToolWrapper.d.ts +43 -0
  13. package/dist/{types/plugins/hbar-transfer/HbarTransferPlugin.d.ts → cjs/plugins/hbar/HbarPlugin.d.ts} +2 -1
  14. package/dist/{types/plugins/hbar-transfer → cjs/plugins/hbar}/TransferHbarTool.d.ts +1 -1
  15. package/dist/cjs/plugins/hbar/index.d.ts +3 -0
  16. package/dist/cjs/plugins/index.d.ts +2 -1
  17. package/dist/cjs/services/EntityResolver.d.ts +26 -0
  18. package/dist/cjs/tools/EntityResolverTool.d.ts +104 -0
  19. package/dist/cjs/types/inscription.d.ts +37 -0
  20. package/dist/esm/index.js +16 -2
  21. package/dist/esm/index.js.map +1 -1
  22. package/dist/esm/index12.js +121 -46
  23. package/dist/esm/index12.js.map +1 -1
  24. package/dist/esm/index13.js +177 -13
  25. package/dist/esm/index13.js.map +1 -1
  26. package/dist/esm/index14.js +599 -100
  27. package/dist/esm/index14.js.map +1 -1
  28. package/dist/esm/index15.js +426 -9
  29. package/dist/esm/index15.js.map +1 -1
  30. package/dist/esm/index16.js +119 -160
  31. package/dist/esm/index16.js.map +1 -1
  32. package/dist/esm/index17.js +140 -150
  33. package/dist/esm/index17.js.map +1 -1
  34. package/dist/esm/index18.js +44 -231
  35. package/dist/esm/index18.js.map +1 -1
  36. package/dist/esm/index19.js +86 -643
  37. package/dist/esm/index19.js.map +1 -1
  38. package/dist/esm/index2.js +22 -13
  39. package/dist/esm/index2.js.map +1 -1
  40. package/dist/esm/index20.js +20 -230
  41. package/dist/esm/index20.js.map +1 -1
  42. package/dist/esm/index21.js +9 -179
  43. package/dist/esm/index21.js.map +1 -1
  44. package/dist/esm/index22.js +140 -89
  45. package/dist/esm/index22.js.map +1 -1
  46. package/dist/esm/index23.js +141 -81
  47. package/dist/esm/index23.js.map +1 -1
  48. package/dist/esm/index24.js +4 -4
  49. package/dist/esm/index24.js.map +1 -1
  50. package/dist/esm/index25.js +0 -8
  51. package/dist/esm/index25.js.map +1 -1
  52. package/dist/esm/index26.js +95 -0
  53. package/dist/esm/index26.js.map +1 -0
  54. package/dist/esm/index27.js +242 -0
  55. package/dist/esm/index27.js.map +1 -0
  56. package/dist/esm/index5.js +32 -19
  57. package/dist/esm/index5.js.map +1 -1
  58. package/dist/esm/index6.js +276 -37
  59. package/dist/esm/index6.js.map +1 -1
  60. package/dist/esm/index7.js +2 -2
  61. package/dist/esm/index7.js.map +1 -1
  62. package/dist/esm/index8.js +124 -18
  63. package/dist/esm/index8.js.map +1 -1
  64. package/dist/types/base-agent.d.ts +3 -1
  65. package/dist/types/conversational-agent.d.ts +64 -13
  66. package/dist/types/index.d.ts +6 -3
  67. package/dist/types/langchain-agent.d.ts +11 -0
  68. package/dist/types/memory/SmartMemoryManager.d.ts +65 -22
  69. package/dist/types/memory/TokenCounter.d.ts +1 -1
  70. package/dist/types/memory/index.d.ts +1 -1
  71. package/dist/types/plugins/hbar/AirdropToolWrapper.d.ts +43 -0
  72. package/dist/{cjs/plugins/hbar-transfer/HbarTransferPlugin.d.ts → types/plugins/hbar/HbarPlugin.d.ts} +2 -1
  73. package/dist/{cjs/plugins/hbar-transfer → types/plugins/hbar}/TransferHbarTool.d.ts +1 -1
  74. package/dist/types/plugins/hbar/index.d.ts +3 -0
  75. package/dist/types/plugins/index.d.ts +2 -1
  76. package/dist/types/services/EntityResolver.d.ts +26 -0
  77. package/dist/types/tools/EntityResolverTool.d.ts +104 -0
  78. package/dist/types/types/inscription.d.ts +37 -0
  79. package/package.json +13 -4
  80. package/src/base-agent.ts +14 -9
  81. package/src/config/system-message.ts +11 -2
  82. package/src/context/ReferenceContextManager.ts +10 -5
  83. package/src/context/ReferenceResponseProcessor.ts +3 -4
  84. package/src/conversational-agent.ts +372 -57
  85. package/src/index.ts +19 -3
  86. package/src/langchain/ContentAwareAgentExecutor.ts +0 -1
  87. package/src/langchain-agent.ts +168 -33
  88. package/src/mcp/ContentProcessor.ts +11 -3
  89. package/src/mcp/adapters/langchain.ts +1 -10
  90. package/src/memory/ContentStorage.ts +2 -55
  91. package/src/memory/MemoryWindow.ts +4 -17
  92. package/src/memory/ReferenceIdGenerator.ts +4 -8
  93. package/src/memory/SmartMemoryManager.ts +375 -47
  94. package/src/memory/TokenCounter.ts +15 -22
  95. package/src/memory/index.ts +1 -1
  96. package/src/plugins/hbar/AirdropToolWrapper.ts +157 -0
  97. package/src/plugins/hbar/HbarPlugin.ts +86 -0
  98. package/src/plugins/{hbar-transfer → hbar}/TransferHbarTool.ts +3 -3
  99. package/src/plugins/hbar/index.ts +3 -0
  100. package/src/plugins/hcs-10/HCS10Plugin.ts +44 -14
  101. package/src/plugins/index.ts +2 -1
  102. package/src/services/ContentStoreManager.ts +0 -3
  103. package/src/services/EntityResolver.ts +135 -0
  104. package/src/tools/EntityResolverTool.ts +170 -0
  105. package/src/types/content-reference.ts +8 -8
  106. package/src/types/index.ts +0 -1
  107. package/src/types/inscription.ts +40 -0
  108. package/dist/cjs/plugins/hbar-transfer/index.d.ts +0 -1
  109. package/dist/types/plugins/hbar-transfer/index.d.ts +0 -1
  110. package/src/plugins/hbar-transfer/HbarTransferPlugin.ts +0 -66
  111. package/src/plugins/hbar-transfer/index.ts +0 -1
  112. /package/dist/cjs/plugins/{hbar-transfer → hbar}/AccountBuilder.d.ts +0 -0
  113. /package/dist/cjs/plugins/{hbar-transfer → hbar}/types.d.ts +0 -0
  114. /package/dist/types/plugins/{hbar-transfer → hbar}/AccountBuilder.d.ts +0 -0
  115. /package/dist/types/plugins/{hbar-transfer → hbar}/types.d.ts +0 -0
  116. /package/src/plugins/{hbar-transfer → hbar}/AccountBuilder.ts +0 -0
  117. /package/src/plugins/{hbar-transfer → hbar}/types.ts +0 -0
@@ -90,7 +90,6 @@ export class ContentStorage implements ContentReferenceStore {
90
90
  private maxStorage: number;
91
91
  private idCounter: number = 0;
92
92
 
93
- // Reference-based content storage
94
93
  private contentStore: Map<ReferenceId, StoredContent> = new Map();
95
94
  private referenceConfig: ContentReferenceConfig;
96
95
  private cleanupTimer?: NodeJS.Timeout;
@@ -102,7 +101,6 @@ export class ContentStorage implements ContentReferenceStore {
102
101
  };
103
102
  };
104
103
 
105
- // Default storage limit for messages
106
104
  public static readonly DEFAULT_MAX_STORAGE = 1000;
107
105
 
108
106
  constructor(
@@ -111,7 +109,6 @@ export class ContentStorage implements ContentReferenceStore {
111
109
  ) {
112
110
  this.maxStorage = maxStorage;
113
111
 
114
- // Initialize reference-based storage
115
112
  this.referenceConfig = { ...DEFAULT_CONTENT_REFERENCE_CONFIG, ...referenceConfig };
116
113
  this.referenceStats = {
117
114
  activeReferences: 0,
@@ -131,7 +128,6 @@ export class ContentStorage implements ContentReferenceStore {
131
128
  }
132
129
  };
133
130
 
134
- // Start cleanup timer if enabled
135
131
  if (this.referenceConfig.enableAutoCleanup) {
136
132
  this.startReferenceCleanupTimer();
137
133
  }
@@ -151,17 +147,14 @@ export class ContentStorage implements ContentReferenceStore {
151
147
  const now = new Date();
152
148
  let dropped = 0;
153
149
 
154
- // Convert messages to stored format
155
150
  const storedMessages: StoredMessage[] = messages.map(message => ({
156
151
  message,
157
152
  storedAt: now,
158
153
  id: this.generateId()
159
154
  }));
160
155
 
161
- // Add new messages
162
156
  this.messages.push(...storedMessages);
163
157
 
164
- // Remove oldest messages if we exceed the limit
165
158
  while (this.messages.length > this.maxStorage) {
166
159
  this.messages.shift();
167
160
  dropped++;
@@ -215,7 +208,6 @@ export class ContentStorage implements ContentReferenceStore {
215
208
  .filter(stored => regex.test(stored.message.content as string))
216
209
  .map(stored => stored.message);
217
210
  } catch (error) {
218
- console.warn('Invalid regex pattern:', query, error);
219
211
  return [];
220
212
  }
221
213
  } else {
@@ -304,7 +296,6 @@ export class ContentStorage implements ContentReferenceStore {
304
296
 
305
297
  this.maxStorage = newLimit;
306
298
 
307
- // Prune messages if the new limit is smaller
308
299
  while (this.messages.length > this.maxStorage) {
309
300
  this.messages.shift();
310
301
  }
@@ -374,7 +365,6 @@ export class ContentStorage implements ContentReferenceStore {
374
365
  }));
375
366
  }
376
367
 
377
- // ========== Reference-Based Content Storage Methods ==========
378
368
 
379
369
  /**
380
370
  * Determine if content should be stored as a reference based on size
@@ -465,13 +455,10 @@ export class ContentStorage implements ContentReferenceStore {
465
455
 
466
456
  this.contentStore.set(referenceId, storedContent);
467
457
 
468
- // Update statistics
469
458
  this.updateStatsAfterStore(content.length);
470
459
 
471
- // Enforce storage limits after storing
472
460
  await this.enforceReferenceStorageLimits();
473
461
 
474
- // Create preview
475
462
  const preview = this.createContentPreview(content, fullMetadata.contentType);
476
463
 
477
464
  const referenceMetadata: Pick<ContentMetadata, 'contentType' | 'sizeBytes' | 'source' | 'fileName' | 'mimeType'> = {
@@ -496,18 +483,14 @@ export class ContentStorage implements ContentReferenceStore {
496
483
  format: 'ref://{id}' as const
497
484
  };
498
485
 
499
- // Record performance
500
486
  const duration = Date.now() - startTime;
501
487
  this.recordPerformanceMetric('creation', duration);
502
488
 
503
- console.log(`[ContentStorage] Stored content with reference ID: ${referenceId} (${content.length} bytes)`);
504
-
505
489
  return reference;
506
490
  } catch (error) {
507
491
  const duration = Date.now() - startTime;
508
492
  this.recordPerformanceMetric('creation', duration);
509
493
 
510
- console.error('[ContentStorage] Failed to store content:', error);
511
494
  throw new ContentReferenceError(
512
495
  `Failed to store content: ${error instanceof Error ? error.message : 'Unknown error'}`,
513
496
  'system_error',
@@ -524,7 +507,6 @@ export class ContentStorage implements ContentReferenceStore {
524
507
  const startTime = Date.now();
525
508
 
526
509
  try {
527
- // Validate reference ID format
528
510
  if (!ReferenceIdGenerator.isValidReferenceId(referenceId)) {
529
511
  this.referenceStats.failedResolutions++;
530
512
  return {
@@ -547,7 +529,6 @@ export class ContentStorage implements ContentReferenceStore {
547
529
  };
548
530
  }
549
531
 
550
- // Check if expired
551
532
  if (storedContent.expiresAt && storedContent.expiresAt < new Date()) {
552
533
  storedContent.state = 'expired';
553
534
  this.referenceStats.failedResolutions++;
@@ -559,7 +540,6 @@ export class ContentStorage implements ContentReferenceStore {
559
540
  };
560
541
  }
561
542
 
562
- // Check state
563
543
  if (storedContent.state !== 'active') {
564
544
  this.referenceStats.failedResolutions++;
565
545
  return {
@@ -570,19 +550,14 @@ export class ContentStorage implements ContentReferenceStore {
570
550
  };
571
551
  }
572
552
 
573
- // Update access tracking
574
553
  storedContent.metadata.lastAccessedAt = new Date();
575
554
  storedContent.metadata.accessCount++;
576
555
 
577
- // Update statistics
578
556
  this.referenceStats.totalResolutions++;
579
557
 
580
- // Record performance
581
558
  const duration = Date.now() - startTime;
582
559
  this.recordPerformanceMetric('resolution', duration);
583
560
 
584
- console.log(`[ContentStorage] Resolved reference ${referenceId} (${storedContent.content.length} bytes, access count: ${storedContent.metadata.accessCount})`);
585
-
586
561
  return {
587
562
  success: true,
588
563
  content: storedContent.content,
@@ -593,7 +568,6 @@ export class ContentStorage implements ContentReferenceStore {
593
568
  this.recordPerformanceMetric('resolution', duration);
594
569
 
595
570
  this.referenceStats.failedResolutions++;
596
- console.error(`[ContentStorage] Error resolving reference ${referenceId}:`, error);
597
571
 
598
572
  return {
599
573
  success: false,
@@ -617,7 +591,6 @@ export class ContentStorage implements ContentReferenceStore {
617
591
  return false;
618
592
  }
619
593
 
620
- // Check if expired
621
594
  if (storedContent.expiresAt && storedContent.expiresAt < new Date()) {
622
595
  storedContent.state = 'expired';
623
596
  return false;
@@ -635,14 +608,12 @@ export class ContentStorage implements ContentReferenceStore {
635
608
  return false;
636
609
  }
637
610
 
638
- // Update statistics
639
611
  this.referenceStats.totalStorageBytes -= storedContent.content.length;
640
612
  this.referenceStats.activeReferences--;
641
613
  this.referenceStats.recentlyCleanedUp++;
642
614
 
643
615
  this.contentStore.delete(referenceId);
644
616
 
645
- console.log(`[ContentStorage] Cleaned up reference ${referenceId} (${storedContent.content.length} bytes)`);
646
617
  return true;
647
618
  }
648
619
 
@@ -668,7 +639,6 @@ export class ContentStorage implements ContentReferenceStore {
668
639
  async updateConfig(config: Partial<ContentReferenceConfig>): Promise<void> {
669
640
  this.referenceConfig = { ...this.referenceConfig, ...config };
670
641
 
671
- // Restart cleanup timer if needed
672
642
  if (this.cleanupTimer) {
673
643
  clearInterval(this.cleanupTimer);
674
644
  delete this.cleanupTimer;
@@ -677,8 +647,6 @@ export class ContentStorage implements ContentReferenceStore {
677
647
  if (this.referenceConfig.enableAutoCleanup) {
678
648
  this.startReferenceCleanupTimer();
679
649
  }
680
-
681
- console.log('[ContentStorage] Reference configuration updated');
682
650
  }
683
651
 
684
652
  /**
@@ -690,22 +658,17 @@ export class ContentStorage implements ContentReferenceStore {
690
658
  let cleanedUp = 0;
691
659
 
692
660
  try {
693
- console.log('[ContentStorage] Starting reference cleanup process...');
694
-
695
661
  const now = new Date();
696
662
  const toCleanup: ReferenceId[] = [];
697
663
 
698
- // Identify references for cleanup
699
664
  for (const [referenceId, storedContent] of this.contentStore.entries()) {
700
665
  let shouldCleanup = false;
701
666
 
702
- // Check expiration
703
667
  if (storedContent.expiresAt && storedContent.expiresAt < now) {
704
668
  shouldCleanup = true;
705
669
  storedContent.state = 'expired';
706
670
  }
707
671
 
708
- // Check age-based policies
709
672
  const ageMs = now.getTime() - storedContent.metadata.createdAt.getTime();
710
673
  const policy = this.getCleanupPolicy(storedContent.metadata.source);
711
674
 
@@ -713,7 +676,6 @@ export class ContentStorage implements ContentReferenceStore {
713
676
  shouldCleanup = true;
714
677
  }
715
678
 
716
- // Check if marked for cleanup
717
679
  if (storedContent.state === 'cleanup_pending') {
718
680
  shouldCleanup = true;
719
681
  }
@@ -723,16 +685,14 @@ export class ContentStorage implements ContentReferenceStore {
723
685
  }
724
686
  }
725
687
 
726
- // Sort by priority (higher priority = cleanup first)
727
688
  toCleanup.sort((a, b) => {
728
689
  const aContent = this.contentStore.get(a)!;
729
690
  const bContent = this.contentStore.get(b)!;
730
691
  const aPriority = this.getCleanupPolicy(aContent.metadata.source).priority;
731
692
  const bPriority = this.getCleanupPolicy(bContent.metadata.source).priority;
732
- return bPriority - aPriority; // Higher priority first
693
+ return bPriority - aPriority;
733
694
  });
734
695
 
735
- // Perform cleanup
736
696
  for (const referenceId of toCleanup) {
737
697
  try {
738
698
  const success = await this.cleanupReference(referenceId);
@@ -744,7 +704,6 @@ export class ContentStorage implements ContentReferenceStore {
744
704
  }
745
705
  }
746
706
 
747
- // Check storage limits and cleanup oldest if needed
748
707
  if (this.contentStore.size > this.referenceConfig.maxReferences) {
749
708
  const sortedByAge = Array.from(this.contentStore.entries())
750
709
  .sort(([, a], [, b]) => a.metadata.lastAccessedAt.getTime() - b.metadata.lastAccessedAt.getTime());
@@ -766,15 +725,12 @@ export class ContentStorage implements ContentReferenceStore {
766
725
  const duration = Date.now() - startTime;
767
726
  this.recordPerformanceMetric('cleanup', duration);
768
727
 
769
- console.log(`[ContentStorage] Reference cleanup completed: ${cleanedUp} references cleaned up, ${errors.length} errors`);
770
-
771
728
  return { cleanedUp, errors };
772
729
  } catch (error) {
773
730
  const duration = Date.now() - startTime;
774
731
  this.recordPerformanceMetric('cleanup', duration);
775
732
 
776
733
  const errorMessage = `Cleanup process failed: ${error instanceof Error ? error.message : 'Unknown error'}`;
777
- console.error('[ContentStorage]', errorMessage);
778
734
  errors.push(errorMessage);
779
735
 
780
736
  return { cleanedUp, errors };
@@ -788,15 +744,12 @@ export class ContentStorage implements ContentReferenceStore {
788
744
  return { ...this.referenceConfig };
789
745
  }
790
746
 
791
- // ========== Private Reference Storage Helper Methods ==========
792
747
 
793
748
  private async enforceReferenceStorageLimits(): Promise<void> {
794
- // Check reference count limit
795
749
  if (this.contentStore.size >= this.referenceConfig.maxReferences) {
796
750
  await this.performCleanup();
797
751
  }
798
752
 
799
- // Check total storage size limit
800
753
  if (this.referenceStats.totalStorageBytes >= this.referenceConfig.maxTotalStorageBytes) {
801
754
  await this.performCleanup();
802
755
  }
@@ -829,7 +782,6 @@ export class ContentStorage implements ContentReferenceStore {
829
782
  return 'binary';
830
783
  }
831
784
 
832
- // Simple content detection
833
785
  const contentStr = content.toString('utf8', 0, Math.min(content.length, 1000));
834
786
  if (contentStr.startsWith('{') || contentStr.startsWith('[')) return 'json';
835
787
  if (contentStr.includes('<html>') || contentStr.includes('<!DOCTYPE')) return 'html';
@@ -842,9 +794,7 @@ export class ContentStorage implements ContentReferenceStore {
842
794
  const maxLength = 200;
843
795
  let preview = content.toString('utf8', 0, Math.min(content.length, maxLength * 2));
844
796
 
845
- // Clean up based on content type
846
797
  if (contentType === 'html') {
847
- // Remove all HTML tags and normalize whitespace
848
798
  preview = preview
849
799
  .replace(/<[^>]*>/g, '')
850
800
  .replace(/\s+/g, ' ')
@@ -854,7 +804,6 @@ export class ContentStorage implements ContentReferenceStore {
854
804
  const parsed = JSON.parse(preview);
855
805
  preview = JSON.stringify(parsed, null, 0);
856
806
  } catch {
857
- // Keep original if not valid JSON
858
807
  }
859
808
  }
860
809
 
@@ -879,7 +828,6 @@ export class ContentStorage implements ContentReferenceStore {
879
828
 
880
829
  this.referenceStats.storageUtilization = (this.referenceStats.totalStorageBytes / this.referenceConfig.maxTotalStorageBytes) * 100;
881
830
 
882
- // Find most accessed reference
883
831
  let mostAccessedId: ReferenceId | undefined;
884
832
  let maxAccess = 0;
885
833
 
@@ -899,7 +847,7 @@ export class ContentStorage implements ContentReferenceStore {
899
847
 
900
848
  private recordPerformanceMetric(type: 'creation' | 'resolution' | 'cleanup', timeMs: number): void {
901
849
  const metrics = this.referenceStats.performanceMetrics;
902
- const maxRecords = 100; // Keep last 100 measurements
850
+ const maxRecords = 100;
903
851
 
904
852
  switch (type) {
905
853
  case 'creation':
@@ -933,7 +881,6 @@ export class ContentStorage implements ContentReferenceStore {
933
881
  try {
934
882
  await this.performCleanup();
935
883
  } catch (error) {
936
- console.error('[ContentStorage] Error in scheduled reference cleanup:', error);
937
884
  }
938
885
  }, this.referenceConfig.cleanupIntervalMs);
939
886
  }
@@ -27,10 +27,9 @@ export class MemoryWindow {
27
27
  private systemPrompt: string = '';
28
28
  private systemPromptTokens: number = 0;
29
29
 
30
- // Default token limits for different model contexts
31
- public static readonly DEFAULT_MAX_TOKENS = 8000; // Conservative limit for most models
32
- public static readonly DEFAULT_RESERVE_TOKENS = 1000; // Reserve for response generation
33
- public static readonly PRUNING_BATCH_SIZE = 2; // Remove messages in pairs to maintain conversation flow
30
+ public static readonly DEFAULT_MAX_TOKENS = 8000;
31
+ public static readonly DEFAULT_RESERVE_TOKENS = 1000;
32
+ public static readonly PRUNING_BATCH_SIZE = 2;
34
33
 
35
34
  constructor(
36
35
  maxTokens: number = MemoryWindow.DEFAULT_MAX_TOKENS,
@@ -52,26 +51,20 @@ export class MemoryWindow {
52
51
  * @returns Result of the add operation including any pruned messages
53
52
  */
54
53
  addMessage(message: BaseMessage): AddMessageResult {
55
- // Calculate tokens for the new message
56
- const messageTokens = this.tokenCounter.countMessageTokens(message);
54
+ this.tokenCounter.countMessageTokens(message);
57
55
 
58
- // Add the message first
59
56
  this.messages.push(message);
60
57
 
61
- // Check if we need to prune
62
58
  const currentTokens = this.getCurrentTokenCount();
63
59
  const availableTokens = this.maxTokens - this.reserveTokens;
64
60
 
65
61
  let prunedMessages: BaseMessage[] = [];
66
62
 
67
63
  if (currentTokens > availableTokens) {
68
- // Need to prune - remove the new message temporarily
69
64
  this.messages.pop();
70
65
 
71
- // Prune old messages to make room
72
66
  prunedMessages = this.pruneToFit();
73
67
 
74
- // Add the new message back
75
68
  this.messages.push(message);
76
69
  }
77
70
 
@@ -93,7 +86,6 @@ export class MemoryWindow {
93
86
  const targetTokens = this.maxTokens - this.reserveTokens;
94
87
 
95
88
  while (this.getCurrentTokenCount() > targetTokens && this.messages.length > 0) {
96
- // Remove messages in batches to maintain conversation flow
97
89
  const batchSize = Math.min(MemoryWindow.PRUNING_BATCH_SIZE, this.messages.length);
98
90
 
99
91
  for (let i = 0; i < batchSize; i++) {
@@ -103,9 +95,7 @@ export class MemoryWindow {
103
95
  }
104
96
  }
105
97
 
106
- // Safety check to prevent infinite loop
107
98
  if (prunedMessages.length > 1000) {
108
- console.warn('MemoryWindow: Excessive pruning detected, stopping to prevent infinite loop');
109
99
  break;
110
100
  }
111
101
  }
@@ -140,8 +130,6 @@ export class MemoryWindow {
140
130
  const currentTokens = this.getCurrentTokenCount();
141
131
  const wouldExceedReserve = (currentTokens + messageTokens) > (this.maxTokens - this.reserveTokens);
142
132
 
143
- // Always allow adding if we can prune to make room
144
- // Only return false if the message itself is larger than our total capacity
145
133
  if (messageTokens > this.maxTokens) {
146
134
  return false;
147
135
  }
@@ -210,7 +198,6 @@ export class MemoryWindow {
210
198
  this.reserveTokens = reserveTokens;
211
199
  }
212
200
 
213
- // Prune if necessary after updating limits
214
201
  if (this.getCurrentTokenCount() > (this.maxTokens - this.reserveTokens)) {
215
202
  this.pruneToFit();
216
203
  }
@@ -17,7 +17,7 @@ export class ReferenceIdGenerator {
17
17
  static generateId(content: Buffer): ReferenceId {
18
18
  const hash = createHash('sha256');
19
19
  hash.update(content);
20
- return hash.digest('base64url');
20
+ return hash.digest('hex');
21
21
  }
22
22
 
23
23
  /**
@@ -31,13 +31,11 @@ export class ReferenceIdGenerator {
31
31
  return false;
32
32
  }
33
33
 
34
- // Check length (base64url encoding of SHA-256 hash = 43 chars)
35
- if (id.length !== 43) {
34
+ if (id.length !== 64) {
36
35
  return false;
37
36
  }
38
37
 
39
- // Check character set (base64url: A-Z, a-z, 0-9, -, _)
40
- return /^[A-Za-z0-9_-]+$/.test(id);
38
+ return /^[a-f0-9]+$/.test(id);
41
39
  }
42
40
 
43
41
  /**
@@ -51,13 +49,11 @@ export class ReferenceIdGenerator {
51
49
  return null;
52
50
  }
53
51
 
54
- // Check for ref:// format
55
- const refFormatMatch = input.match(/^ref:\/\/([A-Za-z0-9_-]{43})$/);
52
+ const refFormatMatch = input.match(/^ref:\/\/([a-f0-9]{64})$/);
56
53
  if (refFormatMatch) {
57
54
  return refFormatMatch[1] as ReferenceId;
58
55
  }
59
56
 
60
- // Check if input is directly a valid reference ID
61
57
  return this.isValidReferenceId(input) ? input : null;
62
58
  }
63
59