@cmdoss/memwal-sdk 0.6.2 → 0.8.0
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/ARCHITECTURE.md +547 -547
- package/BENCHMARKS.md +238 -238
- package/README.md +310 -181
- package/dist/ai-sdk/tools.d.ts +2 -2
- package/dist/ai-sdk/tools.js +2 -2
- package/dist/client/ClientMemoryManager.js +2 -2
- package/dist/client/ClientMemoryManager.js.map +1 -1
- package/dist/client/PersonalDataWallet.d.ts.map +1 -1
- package/dist/client/SimplePDWClient.d.ts +29 -1
- package/dist/client/SimplePDWClient.d.ts.map +1 -1
- package/dist/client/SimplePDWClient.js +45 -13
- package/dist/client/SimplePDWClient.js.map +1 -1
- package/dist/client/namespaces/EmbeddingsNamespace.d.ts +1 -1
- package/dist/client/namespaces/EmbeddingsNamespace.js +1 -1
- package/dist/client/namespaces/MemoryNamespace.d.ts +31 -0
- package/dist/client/namespaces/MemoryNamespace.d.ts.map +1 -1
- package/dist/client/namespaces/MemoryNamespace.js +272 -39
- package/dist/client/namespaces/MemoryNamespace.js.map +1 -1
- package/dist/client/namespaces/consolidated/AINamespace.d.ts +2 -2
- package/dist/client/namespaces/consolidated/AINamespace.js +2 -2
- package/dist/client/namespaces/consolidated/BlockchainNamespace.d.ts +12 -2
- package/dist/client/namespaces/consolidated/BlockchainNamespace.d.ts.map +1 -1
- package/dist/client/namespaces/consolidated/BlockchainNamespace.js +62 -4
- package/dist/client/namespaces/consolidated/BlockchainNamespace.js.map +1 -1
- package/dist/client/namespaces/consolidated/StorageNamespace.d.ts +67 -2
- package/dist/client/namespaces/consolidated/StorageNamespace.d.ts.map +1 -1
- package/dist/client/namespaces/consolidated/StorageNamespace.js +549 -16
- package/dist/client/namespaces/consolidated/StorageNamespace.js.map +1 -1
- package/dist/config/ConfigurationHelper.js +61 -61
- package/dist/config/defaults.js +2 -2
- package/dist/config/defaults.js.map +1 -1
- package/dist/graph/GraphService.js +21 -21
- package/dist/graph/GraphService.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/seal/EncryptionService.d.ts +9 -5
- package/dist/infrastructure/seal/EncryptionService.d.ts.map +1 -1
- package/dist/infrastructure/seal/EncryptionService.js +37 -15
- package/dist/infrastructure/seal/EncryptionService.js.map +1 -1
- package/dist/infrastructure/seal/SealService.d.ts +13 -5
- package/dist/infrastructure/seal/SealService.d.ts.map +1 -1
- package/dist/infrastructure/seal/SealService.js +36 -34
- package/dist/infrastructure/seal/SealService.js.map +1 -1
- package/dist/langchain/createPDWRAG.js +30 -30
- package/dist/retrieval/MemoryDecryptionPipeline.d.ts.map +1 -1
- package/dist/retrieval/MemoryDecryptionPipeline.js +2 -1
- package/dist/retrieval/MemoryDecryptionPipeline.js.map +1 -1
- package/dist/retrieval/MemoryRetrievalService.d.ts +31 -0
- package/dist/retrieval/MemoryRetrievalService.d.ts.map +1 -1
- package/dist/retrieval/MemoryRetrievalService.js +44 -4
- package/dist/retrieval/MemoryRetrievalService.js.map +1 -1
- package/dist/services/CapabilityService.d.ts.map +1 -1
- package/dist/services/CapabilityService.js +30 -14
- package/dist/services/CapabilityService.js.map +1 -1
- package/dist/services/CrossContextPermissionService.d.ts.map +1 -1
- package/dist/services/CrossContextPermissionService.js +9 -7
- package/dist/services/CrossContextPermissionService.js.map +1 -1
- package/dist/services/EmbeddingService.d.ts +28 -1
- package/dist/services/EmbeddingService.d.ts.map +1 -1
- package/dist/services/EmbeddingService.js +54 -0
- package/dist/services/EmbeddingService.js.map +1 -1
- package/dist/services/EncryptionService.d.ts.map +1 -1
- package/dist/services/EncryptionService.js +6 -5
- package/dist/services/EncryptionService.js.map +1 -1
- package/dist/services/GeminiAIService.js +309 -309
- package/dist/services/IndexManager.d.ts +5 -1
- package/dist/services/IndexManager.d.ts.map +1 -1
- package/dist/services/IndexManager.js +17 -40
- package/dist/services/IndexManager.js.map +1 -1
- package/dist/services/QueryService.js +1 -1
- package/dist/services/QueryService.js.map +1 -1
- package/dist/services/StorageService.d.ts +11 -0
- package/dist/services/StorageService.d.ts.map +1 -1
- package/dist/services/StorageService.js +73 -10
- package/dist/services/StorageService.js.map +1 -1
- package/dist/services/TransactionService.d.ts +20 -0
- package/dist/services/TransactionService.d.ts.map +1 -1
- package/dist/services/TransactionService.js +43 -0
- package/dist/services/TransactionService.js.map +1 -1
- package/dist/services/ViewService.js +2 -2
- package/dist/services/ViewService.js.map +1 -1
- package/dist/services/storage/QuiltBatchManager.d.ts +101 -1
- package/dist/services/storage/QuiltBatchManager.d.ts.map +1 -1
- package/dist/services/storage/QuiltBatchManager.js +410 -20
- package/dist/services/storage/QuiltBatchManager.js.map +1 -1
- package/dist/services/storage/index.d.ts +1 -1
- package/dist/services/storage/index.d.ts.map +1 -1
- package/dist/services/storage/index.js.map +1 -1
- package/dist/utils/LRUCache.d.ts +106 -0
- package/dist/utils/LRUCache.d.ts.map +1 -0
- package/dist/utils/LRUCache.js +281 -0
- package/dist/utils/LRUCache.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/memoryIndexOnChain.d.ts +212 -0
- package/dist/utils/memoryIndexOnChain.d.ts.map +1 -0
- package/dist/utils/memoryIndexOnChain.js +312 -0
- package/dist/utils/memoryIndexOnChain.js.map +1 -0
- package/dist/utils/rebuildIndexNode.d.ts +29 -0
- package/dist/utils/rebuildIndexNode.d.ts.map +1 -1
- package/dist/utils/rebuildIndexNode.js +366 -98
- package/dist/utils/rebuildIndexNode.js.map +1 -1
- package/dist/vector/HnswWasmService.d.ts +20 -5
- package/dist/vector/HnswWasmService.d.ts.map +1 -1
- package/dist/vector/HnswWasmService.js +73 -40
- package/dist/vector/HnswWasmService.js.map +1 -1
- package/dist/vector/IHnswService.d.ts +10 -1
- package/dist/vector/IHnswService.d.ts.map +1 -1
- package/dist/vector/IHnswService.js.map +1 -1
- package/dist/vector/NodeHnswService.d.ts +16 -0
- package/dist/vector/NodeHnswService.d.ts.map +1 -1
- package/dist/vector/NodeHnswService.js +84 -5
- package/dist/vector/NodeHnswService.js.map +1 -1
- package/dist/vector/createHnswService.d.ts +1 -1
- package/dist/vector/createHnswService.js +1 -1
- package/dist/vector/index.d.ts +1 -1
- package/dist/vector/index.js +1 -1
- package/package.json +157 -157
- package/src/access/PermissionService.ts +635 -635
- package/src/aggregation/AggregationService.ts +389 -389
- package/src/ai-sdk/PDWVectorStore.ts +715 -715
- package/src/ai-sdk/index.ts +65 -65
- package/src/ai-sdk/tools.ts +460 -460
- package/src/ai-sdk/types.ts +404 -404
- package/src/batch/BatchManager.ts +597 -597
- package/src/batch/BatchingService.ts +429 -429
- package/src/batch/MemoryProcessingCache.ts +492 -492
- package/src/batch/index.ts +30 -30
- package/src/browser.ts +200 -200
- package/src/client/ClientMemoryManager.ts +987 -987
- package/src/client/PersonalDataWallet.ts +345 -345
- package/src/client/SimplePDWClient.ts +1289 -1222
- package/src/client/factory.ts +154 -154
- package/src/client/namespaces/AnalyticsNamespace.ts +377 -377
- package/src/client/namespaces/BatchNamespace.ts +356 -356
- package/src/client/namespaces/CacheNamespace.ts +123 -123
- package/src/client/namespaces/CapabilityNamespace.ts +217 -217
- package/src/client/namespaces/ClassifyNamespace.ts +169 -169
- package/src/client/namespaces/ContextNamespace.ts +297 -297
- package/src/client/namespaces/EmbeddingsNamespace.ts +99 -99
- package/src/client/namespaces/EncryptionNamespace.ts +221 -221
- package/src/client/namespaces/GraphNamespace.ts +468 -468
- package/src/client/namespaces/IndexNamespace.ts +361 -361
- package/src/client/namespaces/MemoryNamespace.ts +1422 -1135
- package/src/client/namespaces/PermissionsNamespace.ts +254 -254
- package/src/client/namespaces/PipelineNamespace.ts +220 -220
- package/src/client/namespaces/SearchNamespace.ts +1049 -1049
- package/src/client/namespaces/StorageNamespace.ts +458 -458
- package/src/client/namespaces/TxNamespace.ts +260 -260
- package/src/client/namespaces/WalletNamespace.ts +243 -243
- package/src/client/namespaces/consolidated/AINamespace.ts +449 -449
- package/src/client/namespaces/consolidated/BlockchainNamespace.ts +607 -546
- package/src/client/namespaces/consolidated/SecurityNamespace.ts +648 -648
- package/src/client/namespaces/consolidated/StorageNamespace.ts +1141 -497
- package/src/client/namespaces/consolidated/index.ts +39 -39
- package/src/client/signers/KeypairSigner.ts +108 -108
- package/src/client/signers/UnifiedSigner.ts +110 -110
- package/src/client/signers/WalletAdapterSigner.ts +159 -159
- package/src/client/signers/index.ts +26 -26
- package/src/config/ConfigurationHelper.ts +412 -412
- package/src/config/defaults.ts +51 -51
- package/src/config/index.ts +8 -8
- package/src/config/validation.ts +70 -70
- package/src/core/index.ts +14 -14
- package/src/core/interfaces/IService.ts +307 -307
- package/src/core/interfaces/index.ts +8 -8
- package/src/core/types/capability.ts +297 -297
- package/src/core/types/index.ts +870 -870
- package/src/core/types/wallet.ts +270 -270
- package/src/core/types.ts +9 -9
- package/src/core/wallet.ts +222 -222
- package/src/embedding/index.ts +19 -19
- package/src/embedding/types.ts +357 -357
- package/src/errors/index.ts +602 -602
- package/src/errors/recovery.ts +461 -461
- package/src/errors/validation.ts +567 -567
- package/src/generated/pdw/capability.ts +319 -319
- package/src/graph/GraphService.ts +887 -887
- package/src/graph/KnowledgeGraphManager.ts +728 -728
- package/src/graph/index.ts +25 -25
- package/src/index.ts +498 -474
- package/src/infrastructure/index.ts +22 -22
- package/src/infrastructure/seal/EncryptionService.ts +628 -603
- package/src/infrastructure/seal/SealService.ts +613 -615
- package/src/infrastructure/seal/index.ts +9 -9
- package/src/infrastructure/sui/BlockchainManager.ts +627 -627
- package/src/infrastructure/sui/SuiService.ts +888 -888
- package/src/infrastructure/sui/index.ts +9 -9
- package/src/infrastructure/walrus/StorageManager.ts +604 -604
- package/src/infrastructure/walrus/WalrusStorageService.ts +612 -612
- package/src/infrastructure/walrus/index.ts +9 -9
- package/src/langchain/PDWEmbeddings.ts +145 -145
- package/src/langchain/PDWVectorStore.ts +456 -456
- package/src/langchain/createPDWRAG.ts +303 -303
- package/src/langchain/index.ts +47 -47
- package/src/permissions/ConsentRepository.browser.ts +249 -249
- package/src/permissions/ConsentRepository.ts +364 -364
- package/src/pipeline/MemoryPipeline.ts +862 -862
- package/src/pipeline/PipelineManager.ts +683 -683
- package/src/pipeline/index.ts +26 -26
- package/src/retrieval/AdvancedSearchService.ts +629 -629
- package/src/retrieval/MemoryAnalyticsService.ts +711 -711
- package/src/retrieval/MemoryDecryptionPipeline.ts +825 -824
- package/src/retrieval/MemoryRetrievalService.ts +904 -830
- package/src/retrieval/index.ts +42 -42
- package/src/services/BatchService.ts +352 -352
- package/src/services/CapabilityService.ts +464 -448
- package/src/services/ClassifierService.ts +465 -465
- package/src/services/CrossContextPermissionService.ts +486 -484
- package/src/services/EmbeddingService.ts +771 -706
- package/src/services/EncryptionService.ts +712 -711
- package/src/services/GeminiAIService.ts +753 -753
- package/src/services/IndexManager.ts +977 -1004
- package/src/services/MemoryIndexService.ts +1003 -1003
- package/src/services/MemoryService.ts +369 -369
- package/src/services/QueryService.ts +890 -890
- package/src/services/StorageService.ts +1182 -1111
- package/src/services/TransactionService.ts +838 -790
- package/src/services/VectorService.ts +462 -462
- package/src/services/ViewService.ts +484 -484
- package/src/services/index.ts +25 -25
- package/src/services/storage/BlobAttributesManager.ts +333 -333
- package/src/services/storage/KnowledgeGraphManager.ts +425 -425
- package/src/services/storage/MemorySearchManager.ts +387 -387
- package/src/services/storage/QuiltBatchManager.ts +1130 -660
- package/src/services/storage/WalrusMetadataManager.ts +268 -268
- package/src/services/storage/WalrusStorageManager.ts +287 -287
- package/src/services/storage/index.ts +57 -52
- package/src/types/index.ts +13 -13
- package/src/utils/LRUCache.ts +378 -0
- package/src/utils/index.ts +76 -68
- package/src/utils/memoryIndexOnChain.ts +507 -0
- package/src/utils/rebuildIndex.ts +290 -290
- package/src/utils/rebuildIndexNode.ts +771 -424
- package/src/vector/BrowserHnswIndexService.ts +758 -758
- package/src/vector/HnswWasmService.ts +731 -679
- package/src/vector/IHnswService.ts +233 -224
- package/src/vector/NodeHnswService.ts +833 -735
- package/src/vector/VectorManager.ts +478 -478
- package/src/vector/createHnswService.ts +135 -135
- package/src/vector/index.ts +56 -56
- package/src/wallet/ContextWalletService.ts +656 -656
- package/src/wallet/MainWalletService.ts +317 -317
|
@@ -1,356 +1,356 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Batch Namespace - Batch Processing Operations
|
|
3
|
-
*
|
|
4
|
-
* Pure delegation to BatchService for coordinated batch operations.
|
|
5
|
-
* Handles intelligent batching with configurable delays and sizes.
|
|
6
|
-
*
|
|
7
|
-
* @module client/namespaces
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import type { ServiceContainer } from '../SimplePDWClient';
|
|
11
|
-
import type { BatchItem, BatchProcessor } from '../../services/BatchService';
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Batch progress info
|
|
15
|
-
*/
|
|
16
|
-
export interface BatchProgress {
|
|
17
|
-
total: number;
|
|
18
|
-
completed: number;
|
|
19
|
-
failed: number;
|
|
20
|
-
inProgress: number;
|
|
21
|
-
percentage: number;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Batch statistics
|
|
26
|
-
*/
|
|
27
|
-
export interface BatchStatistics {
|
|
28
|
-
totalBatches: number;
|
|
29
|
-
totalItems: number;
|
|
30
|
-
averageBatchSize: number;
|
|
31
|
-
totalProcessingTime: number;
|
|
32
|
-
averageProcessingTime: number;
|
|
33
|
-
successCount: number;
|
|
34
|
-
errorCount: number;
|
|
35
|
-
lastProcessed: Date;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Batch Namespace
|
|
40
|
-
*
|
|
41
|
-
* Handles batch processing operations with intelligent queuing
|
|
42
|
-
*/
|
|
43
|
-
export class BatchNamespace {
|
|
44
|
-
constructor(private services: ServiceContainer) {}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Create many memories in batch
|
|
48
|
-
*
|
|
49
|
-
* Delegates to: MemoryNamespace.createBatch()
|
|
50
|
-
*
|
|
51
|
-
* @param contents - Array of content strings
|
|
52
|
-
* @param options - Optional creation options
|
|
53
|
-
* @returns Array of created memory objects
|
|
54
|
-
*/
|
|
55
|
-
async createMany(
|
|
56
|
-
contents: string[],
|
|
57
|
-
options?: {
|
|
58
|
-
category?: 'general' | 'preference' | 'fact' | 'todo' | 'note';
|
|
59
|
-
importance?: number;
|
|
60
|
-
}
|
|
61
|
-
): Promise<Array<{ id: string; blobId: string }>> {
|
|
62
|
-
if (!this.services.batchService) {
|
|
63
|
-
throw new Error('Batch service not configured.');
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// Import MemoryNamespace to reuse existing batch create logic
|
|
67
|
-
const { MemoryNamespace } = await import('./MemoryNamespace');
|
|
68
|
-
const memoryNamespace = new MemoryNamespace(this.services);
|
|
69
|
-
|
|
70
|
-
// Delegate to existing createBatch method which handles everything
|
|
71
|
-
const memories = await memoryNamespace.createBatch(
|
|
72
|
-
contents,
|
|
73
|
-
{
|
|
74
|
-
category: options?.category,
|
|
75
|
-
importance: options?.importance
|
|
76
|
-
}
|
|
77
|
-
);
|
|
78
|
-
|
|
79
|
-
return memories.map(m => ({
|
|
80
|
-
id: m.id,
|
|
81
|
-
blobId: m.blobId
|
|
82
|
-
}));
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Update many memories in batch
|
|
87
|
-
*
|
|
88
|
-
* Updates memories in parallel:
|
|
89
|
-
* 1. For updates with new content: uploads new blobs to Walrus
|
|
90
|
-
* 2. Executes on-chain update transactions
|
|
91
|
-
* 3. Updates local vector index if enabled
|
|
92
|
-
*
|
|
93
|
-
* @param updates - Array of {id, content, category, importance, topic}
|
|
94
|
-
* @returns Array of successfully updated memory IDs
|
|
95
|
-
*/
|
|
96
|
-
async updateMany(
|
|
97
|
-
updates: Array<{
|
|
98
|
-
id: string;
|
|
99
|
-
content?: string;
|
|
100
|
-
category?: string;
|
|
101
|
-
importance?: number;
|
|
102
|
-
topic?: string;
|
|
103
|
-
}>
|
|
104
|
-
): Promise<string[]> {
|
|
105
|
-
if (!this.services.batchService) {
|
|
106
|
-
throw new Error('Batch service not configured.');
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
if (!this.services.tx) {
|
|
110
|
-
throw new Error('Transaction service not configured.');
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
const successfulIds: string[] = [];
|
|
114
|
-
const errors: Array<{ id: string; error: string }> = [];
|
|
115
|
-
|
|
116
|
-
// Process updates in parallel batches
|
|
117
|
-
const BATCH_SIZE = 5; // Process 5 at a time to avoid overwhelming network
|
|
118
|
-
|
|
119
|
-
for (let i = 0; i < updates.length; i += BATCH_SIZE) {
|
|
120
|
-
const batch = updates.slice(i, i + BATCH_SIZE);
|
|
121
|
-
|
|
122
|
-
const batchPromises = batch.map(async (update) => {
|
|
123
|
-
try {
|
|
124
|
-
let newBlobId = '';
|
|
125
|
-
let newContentHash = '';
|
|
126
|
-
let newContentSize = 0;
|
|
127
|
-
|
|
128
|
-
// Step 1: If content changed, upload new blob to Walrus
|
|
129
|
-
if (update.content) {
|
|
130
|
-
// Generate embedding if service available
|
|
131
|
-
let embedding: number[] = [];
|
|
132
|
-
if (this.services.embedding) {
|
|
133
|
-
const embResult = await this.services.embedding.embedText({
|
|
134
|
-
text: update.content
|
|
135
|
-
});
|
|
136
|
-
embedding = embResult.vector;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// Upload new content
|
|
140
|
-
const uploadResult = await this.services.storage.uploadMemoryPackage(
|
|
141
|
-
{
|
|
142
|
-
content: update.content,
|
|
143
|
-
embedding,
|
|
144
|
-
metadata: {
|
|
145
|
-
category: update.category || 'general',
|
|
146
|
-
importance: update.importance || 5,
|
|
147
|
-
topic: update.topic || ''
|
|
148
|
-
},
|
|
149
|
-
identity: this.services.config.userAddress
|
|
150
|
-
},
|
|
151
|
-
{
|
|
152
|
-
signer: this.services.config.signer,
|
|
153
|
-
epochs: 3,
|
|
154
|
-
deletable: true
|
|
155
|
-
}
|
|
156
|
-
);
|
|
157
|
-
|
|
158
|
-
newBlobId = uploadResult.blobId;
|
|
159
|
-
newContentHash = uploadResult.blobId; // blob_id is content-addressed
|
|
160
|
-
newContentSize = update.content.length;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// Step 2: Build and execute update transaction
|
|
164
|
-
const tx = this.services.tx!.buildUpdateMemoryRecord({
|
|
165
|
-
memoryId: update.id,
|
|
166
|
-
newBlobId,
|
|
167
|
-
newCategory: update.category || '',
|
|
168
|
-
newTopic: update.topic || '',
|
|
169
|
-
newImportance: update.importance || 0,
|
|
170
|
-
newEmbeddingBlobId: '',
|
|
171
|
-
newContentHash,
|
|
172
|
-
newContentSize
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
const result = await this.services.tx!.executeTransaction(
|
|
176
|
-
tx,
|
|
177
|
-
this.services.config.signer.getSigner()
|
|
178
|
-
);
|
|
179
|
-
|
|
180
|
-
if (result.status !== 'success') {
|
|
181
|
-
throw new Error(result.error || 'Transaction failed');
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
// Step 3: Update local vector index if content changed
|
|
185
|
-
if (update.content && this.services.vector && this.services.embedding) {
|
|
186
|
-
const embResult = await this.services.embedding.embedText({
|
|
187
|
-
text: update.content
|
|
188
|
-
});
|
|
189
|
-
await this.services.vector.addVector(
|
|
190
|
-
this.services.config.userAddress,
|
|
191
|
-
Date.now(), // vectorId
|
|
192
|
-
embResult.vector,
|
|
193
|
-
{
|
|
194
|
-
category: update.category,
|
|
195
|
-
importance: update.importance,
|
|
196
|
-
topic: update.topic
|
|
197
|
-
}
|
|
198
|
-
);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
return { success: true, id: update.id };
|
|
202
|
-
} catch (error) {
|
|
203
|
-
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
204
|
-
console.warn(`Failed to update memory ${update.id}:`, errorMsg);
|
|
205
|
-
return { success: false, id: update.id, error: errorMsg };
|
|
206
|
-
}
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
const batchResults = await Promise.all(batchPromises);
|
|
210
|
-
|
|
211
|
-
for (const result of batchResults) {
|
|
212
|
-
if (result.success) {
|
|
213
|
-
successfulIds.push(result.id);
|
|
214
|
-
} else {
|
|
215
|
-
errors.push({ id: result.id, error: result.error || 'Unknown error' });
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
if (errors.length > 0) {
|
|
221
|
-
console.warn(`Batch update completed with ${errors.length} errors:`, errors);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
return successfulIds;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* Delete many memories in batch
|
|
229
|
-
*
|
|
230
|
-
* Delegates to: MemoryService.deleteMemoryRecord() for each
|
|
231
|
-
*
|
|
232
|
-
* @param ids - Array of memory IDs
|
|
233
|
-
* @returns Number of successfully deleted
|
|
234
|
-
*/
|
|
235
|
-
async deleteMany(ids: string[]): Promise<number> {
|
|
236
|
-
if (!this.services.batchService) {
|
|
237
|
-
throw new Error('Batch service not configured.');
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
let successCount = 0;
|
|
241
|
-
|
|
242
|
-
for (const id of ids) {
|
|
243
|
-
try {
|
|
244
|
-
// Build and execute delete transaction
|
|
245
|
-
const tx = await this.services.memory.tx.deleteMemory(id);
|
|
246
|
-
await this.services.config.signer.signAndExecuteTransaction(tx);
|
|
247
|
-
successCount++;
|
|
248
|
-
} catch (error) {
|
|
249
|
-
console.warn(`Failed to delete memory ${id}:`, error);
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
return successCount;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* Upload many files in batch
|
|
258
|
-
*
|
|
259
|
-
* Delegates to: StorageService.uploadMemoryBatch()
|
|
260
|
-
*
|
|
261
|
-
* @param files - Array of {name, data}
|
|
262
|
-
* @returns Quilt result with blob IDs
|
|
263
|
-
*/
|
|
264
|
-
async uploadMany(
|
|
265
|
-
files: Array<{ name: string; data: Uint8Array }>
|
|
266
|
-
): Promise<{ quiltId: string; files: Array<{ name: string; blobId: string }> }> {
|
|
267
|
-
if (!this.services.batchService) {
|
|
268
|
-
throw new Error('Batch service not configured.');
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
// Convert to memory format for batch upload
|
|
272
|
-
const memories = files.map(f => ({
|
|
273
|
-
content: new TextDecoder().decode(f.data),
|
|
274
|
-
category: 'file' as const,
|
|
275
|
-
importance: 5,
|
|
276
|
-
topic: f.name,
|
|
277
|
-
embedding: [] as number[],
|
|
278
|
-
encryptedContent: f.data,
|
|
279
|
-
summary: ''
|
|
280
|
-
}));
|
|
281
|
-
|
|
282
|
-
const result = await this.services.storage.uploadMemoryBatch(
|
|
283
|
-
memories,
|
|
284
|
-
{
|
|
285
|
-
signer: this.services.config.signer,
|
|
286
|
-
epochs: 3,
|
|
287
|
-
userAddress: this.services.config.userAddress
|
|
288
|
-
}
|
|
289
|
-
);
|
|
290
|
-
|
|
291
|
-
return {
|
|
292
|
-
quiltId: result.quiltId,
|
|
293
|
-
files: result.files.map((f: any) => ({
|
|
294
|
-
name: f.identifier,
|
|
295
|
-
blobId: f.blobId
|
|
296
|
-
}))
|
|
297
|
-
};
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
/**
|
|
301
|
-
* Get batch processing progress
|
|
302
|
-
*
|
|
303
|
-
* Delegates to: BatchService.getStats()
|
|
304
|
-
*
|
|
305
|
-
* @returns Current batch progress
|
|
306
|
-
*/
|
|
307
|
-
getProgress(): BatchProgress {
|
|
308
|
-
if (!this.services.batchService) {
|
|
309
|
-
throw new Error('Batch service not configured.');
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
const stats = this.services.batchService.getStats() as Map<string, any>;
|
|
313
|
-
|
|
314
|
-
let total = 0;
|
|
315
|
-
let completed = 0;
|
|
316
|
-
let failed = 0;
|
|
317
|
-
|
|
318
|
-
for (const [, stat] of stats) {
|
|
319
|
-
total += stat.totalItems;
|
|
320
|
-
completed += stat.successCount;
|
|
321
|
-
failed += stat.errorCount;
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
const percentage = total > 0 ? (completed / total) * 100 : 0;
|
|
325
|
-
|
|
326
|
-
return {
|
|
327
|
-
total,
|
|
328
|
-
completed,
|
|
329
|
-
failed,
|
|
330
|
-
inProgress: total - completed - failed,
|
|
331
|
-
percentage
|
|
332
|
-
};
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
/**
|
|
336
|
-
* Get batch statistics
|
|
337
|
-
*
|
|
338
|
-
* Delegates to: BatchService.getStats()
|
|
339
|
-
*
|
|
340
|
-
* @param type - Optional batch type ('memory-create', 'storage', etc.)
|
|
341
|
-
* @returns Batch statistics
|
|
342
|
-
*/
|
|
343
|
-
getStats(type?: string): BatchStatistics | Map<string, BatchStatistics> {
|
|
344
|
-
if (!this.services.batchService) {
|
|
345
|
-
throw new Error('Batch service not configured.');
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
const stats = this.services.batchService.getStats(type);
|
|
349
|
-
|
|
350
|
-
if (stats instanceof Map) {
|
|
351
|
-
return stats as Map<string, BatchStatistics>;
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
return stats as BatchStatistics;
|
|
355
|
-
}
|
|
356
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Batch Namespace - Batch Processing Operations
|
|
3
|
+
*
|
|
4
|
+
* Pure delegation to BatchService for coordinated batch operations.
|
|
5
|
+
* Handles intelligent batching with configurable delays and sizes.
|
|
6
|
+
*
|
|
7
|
+
* @module client/namespaces
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { ServiceContainer } from '../SimplePDWClient';
|
|
11
|
+
import type { BatchItem, BatchProcessor } from '../../services/BatchService';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Batch progress info
|
|
15
|
+
*/
|
|
16
|
+
export interface BatchProgress {
|
|
17
|
+
total: number;
|
|
18
|
+
completed: number;
|
|
19
|
+
failed: number;
|
|
20
|
+
inProgress: number;
|
|
21
|
+
percentage: number;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Batch statistics
|
|
26
|
+
*/
|
|
27
|
+
export interface BatchStatistics {
|
|
28
|
+
totalBatches: number;
|
|
29
|
+
totalItems: number;
|
|
30
|
+
averageBatchSize: number;
|
|
31
|
+
totalProcessingTime: number;
|
|
32
|
+
averageProcessingTime: number;
|
|
33
|
+
successCount: number;
|
|
34
|
+
errorCount: number;
|
|
35
|
+
lastProcessed: Date;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Batch Namespace
|
|
40
|
+
*
|
|
41
|
+
* Handles batch processing operations with intelligent queuing
|
|
42
|
+
*/
|
|
43
|
+
export class BatchNamespace {
|
|
44
|
+
constructor(private services: ServiceContainer) {}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Create many memories in batch
|
|
48
|
+
*
|
|
49
|
+
* Delegates to: MemoryNamespace.createBatch()
|
|
50
|
+
*
|
|
51
|
+
* @param contents - Array of content strings
|
|
52
|
+
* @param options - Optional creation options
|
|
53
|
+
* @returns Array of created memory objects
|
|
54
|
+
*/
|
|
55
|
+
async createMany(
|
|
56
|
+
contents: string[],
|
|
57
|
+
options?: {
|
|
58
|
+
category?: 'general' | 'preference' | 'fact' | 'todo' | 'note';
|
|
59
|
+
importance?: number;
|
|
60
|
+
}
|
|
61
|
+
): Promise<Array<{ id: string; blobId: string }>> {
|
|
62
|
+
if (!this.services.batchService) {
|
|
63
|
+
throw new Error('Batch service not configured.');
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Import MemoryNamespace to reuse existing batch create logic
|
|
67
|
+
const { MemoryNamespace } = await import('./MemoryNamespace');
|
|
68
|
+
const memoryNamespace = new MemoryNamespace(this.services);
|
|
69
|
+
|
|
70
|
+
// Delegate to existing createBatch method which handles everything
|
|
71
|
+
const memories = await memoryNamespace.createBatch(
|
|
72
|
+
contents,
|
|
73
|
+
{
|
|
74
|
+
category: options?.category,
|
|
75
|
+
importance: options?.importance
|
|
76
|
+
}
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
return memories.map(m => ({
|
|
80
|
+
id: m.id,
|
|
81
|
+
blobId: m.blobId
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Update many memories in batch
|
|
87
|
+
*
|
|
88
|
+
* Updates memories in parallel:
|
|
89
|
+
* 1. For updates with new content: uploads new blobs to Walrus
|
|
90
|
+
* 2. Executes on-chain update transactions
|
|
91
|
+
* 3. Updates local vector index if enabled
|
|
92
|
+
*
|
|
93
|
+
* @param updates - Array of {id, content, category, importance, topic}
|
|
94
|
+
* @returns Array of successfully updated memory IDs
|
|
95
|
+
*/
|
|
96
|
+
async updateMany(
|
|
97
|
+
updates: Array<{
|
|
98
|
+
id: string;
|
|
99
|
+
content?: string;
|
|
100
|
+
category?: string;
|
|
101
|
+
importance?: number;
|
|
102
|
+
topic?: string;
|
|
103
|
+
}>
|
|
104
|
+
): Promise<string[]> {
|
|
105
|
+
if (!this.services.batchService) {
|
|
106
|
+
throw new Error('Batch service not configured.');
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (!this.services.tx) {
|
|
110
|
+
throw new Error('Transaction service not configured.');
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const successfulIds: string[] = [];
|
|
114
|
+
const errors: Array<{ id: string; error: string }> = [];
|
|
115
|
+
|
|
116
|
+
// Process updates in parallel batches
|
|
117
|
+
const BATCH_SIZE = 5; // Process 5 at a time to avoid overwhelming network
|
|
118
|
+
|
|
119
|
+
for (let i = 0; i < updates.length; i += BATCH_SIZE) {
|
|
120
|
+
const batch = updates.slice(i, i + BATCH_SIZE);
|
|
121
|
+
|
|
122
|
+
const batchPromises = batch.map(async (update) => {
|
|
123
|
+
try {
|
|
124
|
+
let newBlobId = '';
|
|
125
|
+
let newContentHash = '';
|
|
126
|
+
let newContentSize = 0;
|
|
127
|
+
|
|
128
|
+
// Step 1: If content changed, upload new blob to Walrus
|
|
129
|
+
if (update.content) {
|
|
130
|
+
// Generate embedding if service available
|
|
131
|
+
let embedding: number[] = [];
|
|
132
|
+
if (this.services.embedding) {
|
|
133
|
+
const embResult = await this.services.embedding.embedText({
|
|
134
|
+
text: update.content
|
|
135
|
+
});
|
|
136
|
+
embedding = embResult.vector;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Upload new content
|
|
140
|
+
const uploadResult = await this.services.storage.uploadMemoryPackage(
|
|
141
|
+
{
|
|
142
|
+
content: update.content,
|
|
143
|
+
embedding,
|
|
144
|
+
metadata: {
|
|
145
|
+
category: update.category || 'general',
|
|
146
|
+
importance: update.importance || 5,
|
|
147
|
+
topic: update.topic || ''
|
|
148
|
+
},
|
|
149
|
+
identity: this.services.config.userAddress
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
signer: this.services.config.signer,
|
|
153
|
+
epochs: 3,
|
|
154
|
+
deletable: true
|
|
155
|
+
}
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
newBlobId = uploadResult.blobId;
|
|
159
|
+
newContentHash = uploadResult.blobId; // blob_id is content-addressed
|
|
160
|
+
newContentSize = update.content.length;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Step 2: Build and execute update transaction
|
|
164
|
+
const tx = this.services.tx!.buildUpdateMemoryRecord({
|
|
165
|
+
memoryId: update.id,
|
|
166
|
+
newBlobId,
|
|
167
|
+
newCategory: update.category || '',
|
|
168
|
+
newTopic: update.topic || '',
|
|
169
|
+
newImportance: update.importance || 0,
|
|
170
|
+
newEmbeddingBlobId: '',
|
|
171
|
+
newContentHash,
|
|
172
|
+
newContentSize
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
const result = await this.services.tx!.executeTransaction(
|
|
176
|
+
tx,
|
|
177
|
+
this.services.config.signer.getSigner()
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
if (result.status !== 'success') {
|
|
181
|
+
throw new Error(result.error || 'Transaction failed');
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Step 3: Update local vector index if content changed
|
|
185
|
+
if (update.content && this.services.vector && this.services.embedding) {
|
|
186
|
+
const embResult = await this.services.embedding.embedText({
|
|
187
|
+
text: update.content
|
|
188
|
+
});
|
|
189
|
+
await this.services.vector.addVector(
|
|
190
|
+
this.services.config.userAddress,
|
|
191
|
+
Date.now(), // vectorId
|
|
192
|
+
embResult.vector,
|
|
193
|
+
{
|
|
194
|
+
category: update.category,
|
|
195
|
+
importance: update.importance,
|
|
196
|
+
topic: update.topic
|
|
197
|
+
}
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return { success: true, id: update.id };
|
|
202
|
+
} catch (error) {
|
|
203
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
204
|
+
console.warn(`Failed to update memory ${update.id}:`, errorMsg);
|
|
205
|
+
return { success: false, id: update.id, error: errorMsg };
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
const batchResults = await Promise.all(batchPromises);
|
|
210
|
+
|
|
211
|
+
for (const result of batchResults) {
|
|
212
|
+
if (result.success) {
|
|
213
|
+
successfulIds.push(result.id);
|
|
214
|
+
} else {
|
|
215
|
+
errors.push({ id: result.id, error: result.error || 'Unknown error' });
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
if (errors.length > 0) {
|
|
221
|
+
console.warn(`Batch update completed with ${errors.length} errors:`, errors);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return successfulIds;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Delete many memories in batch
|
|
229
|
+
*
|
|
230
|
+
* Delegates to: MemoryService.deleteMemoryRecord() for each
|
|
231
|
+
*
|
|
232
|
+
* @param ids - Array of memory IDs
|
|
233
|
+
* @returns Number of successfully deleted
|
|
234
|
+
*/
|
|
235
|
+
async deleteMany(ids: string[]): Promise<number> {
|
|
236
|
+
if (!this.services.batchService) {
|
|
237
|
+
throw new Error('Batch service not configured.');
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
let successCount = 0;
|
|
241
|
+
|
|
242
|
+
for (const id of ids) {
|
|
243
|
+
try {
|
|
244
|
+
// Build and execute delete transaction
|
|
245
|
+
const tx = await this.services.memory.tx.deleteMemory(id);
|
|
246
|
+
await this.services.config.signer.signAndExecuteTransaction(tx);
|
|
247
|
+
successCount++;
|
|
248
|
+
} catch (error) {
|
|
249
|
+
console.warn(`Failed to delete memory ${id}:`, error);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
return successCount;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Upload many files in batch
|
|
258
|
+
*
|
|
259
|
+
* Delegates to: StorageService.uploadMemoryBatch()
|
|
260
|
+
*
|
|
261
|
+
* @param files - Array of {name, data}
|
|
262
|
+
* @returns Quilt result with blob IDs
|
|
263
|
+
*/
|
|
264
|
+
async uploadMany(
|
|
265
|
+
files: Array<{ name: string; data: Uint8Array }>
|
|
266
|
+
): Promise<{ quiltId: string; files: Array<{ name: string; blobId: string }> }> {
|
|
267
|
+
if (!this.services.batchService) {
|
|
268
|
+
throw new Error('Batch service not configured.');
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// Convert to memory format for batch upload
|
|
272
|
+
const memories = files.map(f => ({
|
|
273
|
+
content: new TextDecoder().decode(f.data),
|
|
274
|
+
category: 'file' as const,
|
|
275
|
+
importance: 5,
|
|
276
|
+
topic: f.name,
|
|
277
|
+
embedding: [] as number[],
|
|
278
|
+
encryptedContent: f.data,
|
|
279
|
+
summary: ''
|
|
280
|
+
}));
|
|
281
|
+
|
|
282
|
+
const result = await this.services.storage.uploadMemoryBatch(
|
|
283
|
+
memories,
|
|
284
|
+
{
|
|
285
|
+
signer: this.services.config.signer,
|
|
286
|
+
epochs: 3,
|
|
287
|
+
userAddress: this.services.config.userAddress
|
|
288
|
+
}
|
|
289
|
+
);
|
|
290
|
+
|
|
291
|
+
return {
|
|
292
|
+
quiltId: result.quiltId,
|
|
293
|
+
files: result.files.map((f: any) => ({
|
|
294
|
+
name: f.identifier,
|
|
295
|
+
blobId: f.blobId
|
|
296
|
+
}))
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Get batch processing progress
|
|
302
|
+
*
|
|
303
|
+
* Delegates to: BatchService.getStats()
|
|
304
|
+
*
|
|
305
|
+
* @returns Current batch progress
|
|
306
|
+
*/
|
|
307
|
+
getProgress(): BatchProgress {
|
|
308
|
+
if (!this.services.batchService) {
|
|
309
|
+
throw new Error('Batch service not configured.');
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
const stats = this.services.batchService.getStats() as Map<string, any>;
|
|
313
|
+
|
|
314
|
+
let total = 0;
|
|
315
|
+
let completed = 0;
|
|
316
|
+
let failed = 0;
|
|
317
|
+
|
|
318
|
+
for (const [, stat] of stats) {
|
|
319
|
+
total += stat.totalItems;
|
|
320
|
+
completed += stat.successCount;
|
|
321
|
+
failed += stat.errorCount;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
const percentage = total > 0 ? (completed / total) * 100 : 0;
|
|
325
|
+
|
|
326
|
+
return {
|
|
327
|
+
total,
|
|
328
|
+
completed,
|
|
329
|
+
failed,
|
|
330
|
+
inProgress: total - completed - failed,
|
|
331
|
+
percentage
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Get batch statistics
|
|
337
|
+
*
|
|
338
|
+
* Delegates to: BatchService.getStats()
|
|
339
|
+
*
|
|
340
|
+
* @param type - Optional batch type ('memory-create', 'storage', etc.)
|
|
341
|
+
* @returns Batch statistics
|
|
342
|
+
*/
|
|
343
|
+
getStats(type?: string): BatchStatistics | Map<string, BatchStatistics> {
|
|
344
|
+
if (!this.services.batchService) {
|
|
345
|
+
throw new Error('Batch service not configured.');
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
const stats = this.services.batchService.getStats(type);
|
|
349
|
+
|
|
350
|
+
if (stats instanceof Map) {
|
|
351
|
+
return stats as Map<string, BatchStatistics>;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
return stats as BatchStatistics;
|
|
355
|
+
}
|
|
356
|
+
}
|