@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.
- package/bin/conversational-agent-cli.js +30 -0
- package/cli/readme.md +181 -0
- package/dist/cjs/base-agent.d.ts +3 -1
- package/dist/cjs/conversational-agent.d.ts +64 -13
- package/dist/cjs/index.cjs +1 -1
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.ts +6 -3
- package/dist/cjs/langchain-agent.d.ts +11 -0
- package/dist/cjs/memory/SmartMemoryManager.d.ts +65 -22
- package/dist/cjs/memory/TokenCounter.d.ts +1 -1
- package/dist/cjs/memory/index.d.ts +1 -1
- package/dist/cjs/plugins/hbar/AirdropToolWrapper.d.ts +43 -0
- package/dist/{types/plugins/hbar-transfer/HbarTransferPlugin.d.ts → cjs/plugins/hbar/HbarPlugin.d.ts} +2 -1
- package/dist/{types/plugins/hbar-transfer → cjs/plugins/hbar}/TransferHbarTool.d.ts +1 -1
- package/dist/cjs/plugins/hbar/index.d.ts +3 -0
- package/dist/cjs/plugins/index.d.ts +2 -1
- package/dist/cjs/services/EntityResolver.d.ts +26 -0
- package/dist/cjs/tools/EntityResolverTool.d.ts +104 -0
- package/dist/cjs/types/inscription.d.ts +37 -0
- package/dist/esm/index.js +16 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index12.js +121 -46
- package/dist/esm/index12.js.map +1 -1
- package/dist/esm/index13.js +177 -13
- package/dist/esm/index13.js.map +1 -1
- package/dist/esm/index14.js +599 -100
- package/dist/esm/index14.js.map +1 -1
- package/dist/esm/index15.js +426 -9
- package/dist/esm/index15.js.map +1 -1
- package/dist/esm/index16.js +119 -160
- package/dist/esm/index16.js.map +1 -1
- package/dist/esm/index17.js +140 -150
- package/dist/esm/index17.js.map +1 -1
- package/dist/esm/index18.js +44 -231
- package/dist/esm/index18.js.map +1 -1
- package/dist/esm/index19.js +86 -643
- package/dist/esm/index19.js.map +1 -1
- package/dist/esm/index2.js +22 -13
- package/dist/esm/index2.js.map +1 -1
- package/dist/esm/index20.js +20 -230
- package/dist/esm/index20.js.map +1 -1
- package/dist/esm/index21.js +9 -179
- package/dist/esm/index21.js.map +1 -1
- package/dist/esm/index22.js +140 -89
- package/dist/esm/index22.js.map +1 -1
- package/dist/esm/index23.js +141 -81
- package/dist/esm/index23.js.map +1 -1
- package/dist/esm/index24.js +4 -4
- package/dist/esm/index24.js.map +1 -1
- package/dist/esm/index25.js +0 -8
- package/dist/esm/index25.js.map +1 -1
- package/dist/esm/index26.js +95 -0
- package/dist/esm/index26.js.map +1 -0
- package/dist/esm/index27.js +242 -0
- package/dist/esm/index27.js.map +1 -0
- package/dist/esm/index5.js +32 -19
- package/dist/esm/index5.js.map +1 -1
- package/dist/esm/index6.js +276 -37
- package/dist/esm/index6.js.map +1 -1
- package/dist/esm/index7.js +2 -2
- package/dist/esm/index7.js.map +1 -1
- package/dist/esm/index8.js +124 -18
- package/dist/esm/index8.js.map +1 -1
- package/dist/types/base-agent.d.ts +3 -1
- package/dist/types/conversational-agent.d.ts +64 -13
- package/dist/types/index.d.ts +6 -3
- package/dist/types/langchain-agent.d.ts +11 -0
- package/dist/types/memory/SmartMemoryManager.d.ts +65 -22
- package/dist/types/memory/TokenCounter.d.ts +1 -1
- package/dist/types/memory/index.d.ts +1 -1
- package/dist/types/plugins/hbar/AirdropToolWrapper.d.ts +43 -0
- package/dist/{cjs/plugins/hbar-transfer/HbarTransferPlugin.d.ts → types/plugins/hbar/HbarPlugin.d.ts} +2 -1
- package/dist/{cjs/plugins/hbar-transfer → types/plugins/hbar}/TransferHbarTool.d.ts +1 -1
- package/dist/types/plugins/hbar/index.d.ts +3 -0
- package/dist/types/plugins/index.d.ts +2 -1
- package/dist/types/services/EntityResolver.d.ts +26 -0
- package/dist/types/tools/EntityResolverTool.d.ts +104 -0
- package/dist/types/types/inscription.d.ts +37 -0
- package/package.json +13 -4
- package/src/base-agent.ts +14 -9
- package/src/config/system-message.ts +11 -2
- package/src/context/ReferenceContextManager.ts +10 -5
- package/src/context/ReferenceResponseProcessor.ts +3 -4
- package/src/conversational-agent.ts +372 -57
- package/src/index.ts +19 -3
- package/src/langchain/ContentAwareAgentExecutor.ts +0 -1
- package/src/langchain-agent.ts +168 -33
- package/src/mcp/ContentProcessor.ts +11 -3
- package/src/mcp/adapters/langchain.ts +1 -10
- package/src/memory/ContentStorage.ts +2 -55
- package/src/memory/MemoryWindow.ts +4 -17
- package/src/memory/ReferenceIdGenerator.ts +4 -8
- package/src/memory/SmartMemoryManager.ts +375 -47
- package/src/memory/TokenCounter.ts +15 -22
- package/src/memory/index.ts +1 -1
- package/src/plugins/hbar/AirdropToolWrapper.ts +157 -0
- package/src/plugins/hbar/HbarPlugin.ts +86 -0
- package/src/plugins/{hbar-transfer → hbar}/TransferHbarTool.ts +3 -3
- package/src/plugins/hbar/index.ts +3 -0
- package/src/plugins/hcs-10/HCS10Plugin.ts +44 -14
- package/src/plugins/index.ts +2 -1
- package/src/services/ContentStoreManager.ts +0 -3
- package/src/services/EntityResolver.ts +135 -0
- package/src/tools/EntityResolverTool.ts +170 -0
- package/src/types/content-reference.ts +8 -8
- package/src/types/index.ts +0 -1
- package/src/types/inscription.ts +40 -0
- package/dist/cjs/plugins/hbar-transfer/index.d.ts +0 -1
- package/dist/types/plugins/hbar-transfer/index.d.ts +0 -1
- package/src/plugins/hbar-transfer/HbarTransferPlugin.ts +0 -66
- package/src/plugins/hbar-transfer/index.ts +0 -1
- /package/dist/cjs/plugins/{hbar-transfer → hbar}/AccountBuilder.d.ts +0 -0
- /package/dist/cjs/plugins/{hbar-transfer → hbar}/types.d.ts +0 -0
- /package/dist/types/plugins/{hbar-transfer → hbar}/AccountBuilder.d.ts +0 -0
- /package/dist/types/plugins/{hbar-transfer → hbar}/types.d.ts +0 -0
- /package/src/plugins/{hbar-transfer → hbar}/AccountBuilder.ts +0 -0
- /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;
|
|
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;
|
|
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
|
-
|
|
31
|
-
public static readonly
|
|
32
|
-
public static readonly
|
|
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
|
-
|
|
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('
|
|
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
|
-
|
|
35
|
-
if (id.length !== 43) {
|
|
34
|
+
if (id.length !== 64) {
|
|
36
35
|
return false;
|
|
37
36
|
}
|
|
38
37
|
|
|
39
|
-
|
|
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
|
-
|
|
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
|
|