@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,268 +1,268 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WalrusMetadataManager - Walrus Blob Metadata Operations
|
|
3
|
-
*
|
|
4
|
-
* Handles metadata attachment and retrieval for Walrus Blob objects.
|
|
5
|
-
* Extracted from StorageService for better separation of concerns.
|
|
6
|
-
*
|
|
7
|
-
* Features:
|
|
8
|
-
* - Build Walrus-compatible metadata structures
|
|
9
|
-
* - Attach metadata to Blob objects via dynamic fields
|
|
10
|
-
* - Retrieve metadata from Blob objects
|
|
11
|
-
* - Content integrity via blob_id
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import type { SuiClient } from '@mysten/sui/client';
|
|
15
|
-
import { Transaction } from '@mysten/sui/transactions';
|
|
16
|
-
import type { UnifiedSigner } from '../../client/signers/UnifiedSigner';
|
|
17
|
-
|
|
18
|
-
export interface WalrusMemoryMetadata {
|
|
19
|
-
// Content identification
|
|
20
|
-
content_type: string;
|
|
21
|
-
content_size: string;
|
|
22
|
-
|
|
23
|
-
// Memory classification
|
|
24
|
-
category: string;
|
|
25
|
-
topic: string;
|
|
26
|
-
importance: string;
|
|
27
|
-
|
|
28
|
-
// Vector embedding
|
|
29
|
-
embedding_dimensions: string;
|
|
30
|
-
embedding_model: string;
|
|
31
|
-
embedding_blob_id?: string;
|
|
32
|
-
|
|
33
|
-
// Knowledge graph
|
|
34
|
-
graph_entity_count: string;
|
|
35
|
-
graph_relationship_count: string;
|
|
36
|
-
graph_blob_id?: string;
|
|
37
|
-
graph_entity_ids?: string;
|
|
38
|
-
|
|
39
|
-
// Vector index
|
|
40
|
-
vector_id: string;
|
|
41
|
-
vector_status: string;
|
|
42
|
-
|
|
43
|
-
// Lifecycle
|
|
44
|
-
created_at: string;
|
|
45
|
-
updated_at: string;
|
|
46
|
-
deleted_at?: string;
|
|
47
|
-
|
|
48
|
-
// Encryption
|
|
49
|
-
encrypted: string;
|
|
50
|
-
encryption_type?: string;
|
|
51
|
-
seal_identity?: string;
|
|
52
|
-
|
|
53
|
-
// Extensible custom fields
|
|
54
|
-
[key: string]: string | undefined;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export interface MetadataBuildOptions {
|
|
58
|
-
category?: string;
|
|
59
|
-
topic?: string;
|
|
60
|
-
importance?: number;
|
|
61
|
-
embedding?: number[];
|
|
62
|
-
embeddingBlobId?: string;
|
|
63
|
-
graphBlobId?: string;
|
|
64
|
-
graphEntityIds?: string[];
|
|
65
|
-
graphEntityCount?: number;
|
|
66
|
-
graphRelationshipCount?: number;
|
|
67
|
-
vectorId?: number;
|
|
68
|
-
isEncrypted?: boolean;
|
|
69
|
-
encryptionType?: string;
|
|
70
|
-
sealIdentity?: string;
|
|
71
|
-
customFields?: Record<string, string>;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* WalrusMetadataManager - Manages Walrus Blob metadata
|
|
76
|
-
*
|
|
77
|
-
* Handles:
|
|
78
|
-
* - Metadata structure building
|
|
79
|
-
* - Dynamic field attachment to Blob objects
|
|
80
|
-
* - Metadata retrieval and parsing
|
|
81
|
-
*/
|
|
82
|
-
export class WalrusMetadataManager {
|
|
83
|
-
constructor(private suiClient: SuiClient) {}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Build Walrus metadata structure
|
|
87
|
-
*
|
|
88
|
-
* NOTE: No content_hash field needed! Walrus blob_id already serves as content hash.
|
|
89
|
-
* blob_id = blake2b256(bcs(root_hash, encoding_type, size))
|
|
90
|
-
*/
|
|
91
|
-
buildWalrusMetadata(
|
|
92
|
-
contentSize: number,
|
|
93
|
-
options: MetadataBuildOptions
|
|
94
|
-
): WalrusMemoryMetadata {
|
|
95
|
-
// Determine content type
|
|
96
|
-
const contentType = options.isEncrypted
|
|
97
|
-
? 'application/octet-stream'
|
|
98
|
-
: options.customFields?.['content-type'] || 'text/plain';
|
|
99
|
-
|
|
100
|
-
// Build base metadata (all values as strings for VecMap<String, String>)
|
|
101
|
-
const metadata: WalrusMemoryMetadata = {
|
|
102
|
-
// Content identification
|
|
103
|
-
content_type: contentType,
|
|
104
|
-
content_size: contentSize.toString(),
|
|
105
|
-
|
|
106
|
-
// Memory classification
|
|
107
|
-
category: options.category || 'general',
|
|
108
|
-
topic: options.topic || '',
|
|
109
|
-
importance: (options.importance || 5).toString(),
|
|
110
|
-
|
|
111
|
-
// Vector embedding
|
|
112
|
-
embedding_dimensions: (options.embedding?.length || 3072).toString(),
|
|
113
|
-
embedding_model: 'text-embedding-004',
|
|
114
|
-
embedding_blob_id: options.embeddingBlobId || '',
|
|
115
|
-
|
|
116
|
-
// Knowledge graph
|
|
117
|
-
graph_entity_count: (options.graphEntityCount || 0).toString(),
|
|
118
|
-
graph_relationship_count: (options.graphRelationshipCount || 0).toString(),
|
|
119
|
-
graph_blob_id: options.graphBlobId || '',
|
|
120
|
-
graph_entity_ids: options.graphEntityIds ? JSON.stringify(options.graphEntityIds) : '',
|
|
121
|
-
|
|
122
|
-
// Vector index
|
|
123
|
-
vector_id: options.vectorId?.toString() || '',
|
|
124
|
-
vector_status: options.vectorId ? '1' : '2', // 1=active, 2=pending
|
|
125
|
-
|
|
126
|
-
// Lifecycle
|
|
127
|
-
created_at: Date.now().toString(),
|
|
128
|
-
updated_at: Date.now().toString(),
|
|
129
|
-
|
|
130
|
-
// Encryption
|
|
131
|
-
encrypted: (options.isEncrypted || false).toString(),
|
|
132
|
-
encryption_type: options.isEncrypted ? (options.encryptionType || 'seal') : undefined,
|
|
133
|
-
seal_identity: options.sealIdentity || undefined,
|
|
134
|
-
};
|
|
135
|
-
|
|
136
|
-
// Add custom fields
|
|
137
|
-
if (options.customFields) {
|
|
138
|
-
Object.entries(options.customFields).forEach(([key, value]) => {
|
|
139
|
-
if (value !== undefined && !metadata[key]) {
|
|
140
|
-
metadata[key] = value;
|
|
141
|
-
}
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
return metadata;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* Attach metadata to a Walrus Blob object
|
|
150
|
-
*
|
|
151
|
-
* NOTE: Based on research, Walrus metadata requires separate queries to retrieve,
|
|
152
|
-
* making it less efficient than on-chain Memory structs for filtering.
|
|
153
|
-
*/
|
|
154
|
-
async attachMetadataToBlob(
|
|
155
|
-
blobId: string,
|
|
156
|
-
metadata: WalrusMemoryMetadata,
|
|
157
|
-
signer: UnifiedSigner,
|
|
158
|
-
walrusPackageId: string
|
|
159
|
-
): Promise<{ digest: string; effects: any }> {
|
|
160
|
-
try {
|
|
161
|
-
const tx = new Transaction();
|
|
162
|
-
|
|
163
|
-
// Convert WalrusMemoryMetadata to VecMap<String, String> format
|
|
164
|
-
const metadataEntries: Array<[string, string]> = [];
|
|
165
|
-
Object.entries(metadata).forEach(([key, value]) => {
|
|
166
|
-
if (value !== undefined && value !== '') {
|
|
167
|
-
metadataEntries.push([key, value]);
|
|
168
|
-
}
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
console.log(`📋 Attaching ${metadataEntries.length} metadata fields to blob ${blobId}`);
|
|
172
|
-
|
|
173
|
-
// Call Walrus blob::add_or_replace_metadata()
|
|
174
|
-
tx.moveCall({
|
|
175
|
-
target: `${walrusPackageId}::blob::add_or_replace_metadata`,
|
|
176
|
-
arguments: [
|
|
177
|
-
tx.object(blobId),
|
|
178
|
-
// Metadata construction would go here
|
|
179
|
-
],
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
tx.setSender(signer.getAddress());
|
|
183
|
-
|
|
184
|
-
const result = await signer.signAndExecuteTransaction(tx);
|
|
185
|
-
|
|
186
|
-
console.log(`✅ Metadata attached successfully. Digest: ${result.digest}`);
|
|
187
|
-
|
|
188
|
-
return {
|
|
189
|
-
digest: result.digest,
|
|
190
|
-
effects: result.effects,
|
|
191
|
-
};
|
|
192
|
-
|
|
193
|
-
} catch (error) {
|
|
194
|
-
console.error(`❌ Failed to attach metadata to blob ${blobId}:`, error);
|
|
195
|
-
throw new Error(`Metadata attachment failed: ${error}`);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
* Retrieve metadata from a Walrus Blob object
|
|
201
|
-
*
|
|
202
|
-
* NOTE: This queries dynamic fields, which is slower than querying on-chain structs.
|
|
203
|
-
*/
|
|
204
|
-
async retrieveBlobMetadata(blobObjectId: string): Promise<WalrusMemoryMetadata | null> {
|
|
205
|
-
try {
|
|
206
|
-
// Query dynamic fields on the Blob object
|
|
207
|
-
const dynamicFields = await this.suiClient.getDynamicFields({
|
|
208
|
-
parentId: blobObjectId,
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
// Look for the metadata dynamic field
|
|
212
|
-
const metadataField = dynamicFields.data.find(
|
|
213
|
-
(field: any) => field.name.value === 'metadata'
|
|
214
|
-
);
|
|
215
|
-
|
|
216
|
-
if (!metadataField) {
|
|
217
|
-
console.log(`No metadata found for blob object ${blobObjectId}`);
|
|
218
|
-
return null;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
// Retrieve the metadata object
|
|
222
|
-
const metadataObject = await this.suiClient.getObject({
|
|
223
|
-
id: metadataField.objectId,
|
|
224
|
-
options: { showContent: true },
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
if (!metadataObject.data?.content || !('fields' in metadataObject.data.content)) {
|
|
228
|
-
return null;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
const fields = metadataObject.data.content.fields as any;
|
|
232
|
-
|
|
233
|
-
// Parse VecMap<String, String> into WalrusMemoryMetadata
|
|
234
|
-
const metadata: WalrusMemoryMetadata = {
|
|
235
|
-
content_type: '',
|
|
236
|
-
content_size: '',
|
|
237
|
-
category: '',
|
|
238
|
-
topic: '',
|
|
239
|
-
importance: '',
|
|
240
|
-
embedding_dimensions: '',
|
|
241
|
-
embedding_model: '',
|
|
242
|
-
graph_entity_count: '',
|
|
243
|
-
graph_relationship_count: '',
|
|
244
|
-
vector_id: '',
|
|
245
|
-
vector_status: '',
|
|
246
|
-
created_at: '',
|
|
247
|
-
updated_at: '',
|
|
248
|
-
encrypted: '',
|
|
249
|
-
};
|
|
250
|
-
|
|
251
|
-
// Parse the VecMap contents
|
|
252
|
-
if (fields.contents && Array.isArray(fields.contents)) {
|
|
253
|
-
fields.contents.forEach((entry: any) => {
|
|
254
|
-
if (entry.key && entry.value) {
|
|
255
|
-
(metadata as any)[entry.key] = entry.value;
|
|
256
|
-
}
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
console.log(`✅ Retrieved metadata for blob object ${blobObjectId}`);
|
|
261
|
-
return metadata;
|
|
262
|
-
|
|
263
|
-
} catch (error) {
|
|
264
|
-
console.error(`❌ Failed to retrieve metadata for blob ${blobObjectId}:`, error);
|
|
265
|
-
return null;
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* WalrusMetadataManager - Walrus Blob Metadata Operations
|
|
3
|
+
*
|
|
4
|
+
* Handles metadata attachment and retrieval for Walrus Blob objects.
|
|
5
|
+
* Extracted from StorageService for better separation of concerns.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Build Walrus-compatible metadata structures
|
|
9
|
+
* - Attach metadata to Blob objects via dynamic fields
|
|
10
|
+
* - Retrieve metadata from Blob objects
|
|
11
|
+
* - Content integrity via blob_id
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type { SuiClient } from '@mysten/sui/client';
|
|
15
|
+
import { Transaction } from '@mysten/sui/transactions';
|
|
16
|
+
import type { UnifiedSigner } from '../../client/signers/UnifiedSigner';
|
|
17
|
+
|
|
18
|
+
export interface WalrusMemoryMetadata {
|
|
19
|
+
// Content identification
|
|
20
|
+
content_type: string;
|
|
21
|
+
content_size: string;
|
|
22
|
+
|
|
23
|
+
// Memory classification
|
|
24
|
+
category: string;
|
|
25
|
+
topic: string;
|
|
26
|
+
importance: string;
|
|
27
|
+
|
|
28
|
+
// Vector embedding
|
|
29
|
+
embedding_dimensions: string;
|
|
30
|
+
embedding_model: string;
|
|
31
|
+
embedding_blob_id?: string;
|
|
32
|
+
|
|
33
|
+
// Knowledge graph
|
|
34
|
+
graph_entity_count: string;
|
|
35
|
+
graph_relationship_count: string;
|
|
36
|
+
graph_blob_id?: string;
|
|
37
|
+
graph_entity_ids?: string;
|
|
38
|
+
|
|
39
|
+
// Vector index
|
|
40
|
+
vector_id: string;
|
|
41
|
+
vector_status: string;
|
|
42
|
+
|
|
43
|
+
// Lifecycle
|
|
44
|
+
created_at: string;
|
|
45
|
+
updated_at: string;
|
|
46
|
+
deleted_at?: string;
|
|
47
|
+
|
|
48
|
+
// Encryption
|
|
49
|
+
encrypted: string;
|
|
50
|
+
encryption_type?: string;
|
|
51
|
+
seal_identity?: string;
|
|
52
|
+
|
|
53
|
+
// Extensible custom fields
|
|
54
|
+
[key: string]: string | undefined;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface MetadataBuildOptions {
|
|
58
|
+
category?: string;
|
|
59
|
+
topic?: string;
|
|
60
|
+
importance?: number;
|
|
61
|
+
embedding?: number[];
|
|
62
|
+
embeddingBlobId?: string;
|
|
63
|
+
graphBlobId?: string;
|
|
64
|
+
graphEntityIds?: string[];
|
|
65
|
+
graphEntityCount?: number;
|
|
66
|
+
graphRelationshipCount?: number;
|
|
67
|
+
vectorId?: number;
|
|
68
|
+
isEncrypted?: boolean;
|
|
69
|
+
encryptionType?: string;
|
|
70
|
+
sealIdentity?: string;
|
|
71
|
+
customFields?: Record<string, string>;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* WalrusMetadataManager - Manages Walrus Blob metadata
|
|
76
|
+
*
|
|
77
|
+
* Handles:
|
|
78
|
+
* - Metadata structure building
|
|
79
|
+
* - Dynamic field attachment to Blob objects
|
|
80
|
+
* - Metadata retrieval and parsing
|
|
81
|
+
*/
|
|
82
|
+
export class WalrusMetadataManager {
|
|
83
|
+
constructor(private suiClient: SuiClient) {}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Build Walrus metadata structure
|
|
87
|
+
*
|
|
88
|
+
* NOTE: No content_hash field needed! Walrus blob_id already serves as content hash.
|
|
89
|
+
* blob_id = blake2b256(bcs(root_hash, encoding_type, size))
|
|
90
|
+
*/
|
|
91
|
+
buildWalrusMetadata(
|
|
92
|
+
contentSize: number,
|
|
93
|
+
options: MetadataBuildOptions
|
|
94
|
+
): WalrusMemoryMetadata {
|
|
95
|
+
// Determine content type
|
|
96
|
+
const contentType = options.isEncrypted
|
|
97
|
+
? 'application/octet-stream'
|
|
98
|
+
: options.customFields?.['content-type'] || 'text/plain';
|
|
99
|
+
|
|
100
|
+
// Build base metadata (all values as strings for VecMap<String, String>)
|
|
101
|
+
const metadata: WalrusMemoryMetadata = {
|
|
102
|
+
// Content identification
|
|
103
|
+
content_type: contentType,
|
|
104
|
+
content_size: contentSize.toString(),
|
|
105
|
+
|
|
106
|
+
// Memory classification
|
|
107
|
+
category: options.category || 'general',
|
|
108
|
+
topic: options.topic || '',
|
|
109
|
+
importance: (options.importance || 5).toString(),
|
|
110
|
+
|
|
111
|
+
// Vector embedding
|
|
112
|
+
embedding_dimensions: (options.embedding?.length || 3072).toString(),
|
|
113
|
+
embedding_model: 'text-embedding-004',
|
|
114
|
+
embedding_blob_id: options.embeddingBlobId || '',
|
|
115
|
+
|
|
116
|
+
// Knowledge graph
|
|
117
|
+
graph_entity_count: (options.graphEntityCount || 0).toString(),
|
|
118
|
+
graph_relationship_count: (options.graphRelationshipCount || 0).toString(),
|
|
119
|
+
graph_blob_id: options.graphBlobId || '',
|
|
120
|
+
graph_entity_ids: options.graphEntityIds ? JSON.stringify(options.graphEntityIds) : '',
|
|
121
|
+
|
|
122
|
+
// Vector index
|
|
123
|
+
vector_id: options.vectorId?.toString() || '',
|
|
124
|
+
vector_status: options.vectorId ? '1' : '2', // 1=active, 2=pending
|
|
125
|
+
|
|
126
|
+
// Lifecycle
|
|
127
|
+
created_at: Date.now().toString(),
|
|
128
|
+
updated_at: Date.now().toString(),
|
|
129
|
+
|
|
130
|
+
// Encryption
|
|
131
|
+
encrypted: (options.isEncrypted || false).toString(),
|
|
132
|
+
encryption_type: options.isEncrypted ? (options.encryptionType || 'seal') : undefined,
|
|
133
|
+
seal_identity: options.sealIdentity || undefined,
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
// Add custom fields
|
|
137
|
+
if (options.customFields) {
|
|
138
|
+
Object.entries(options.customFields).forEach(([key, value]) => {
|
|
139
|
+
if (value !== undefined && !metadata[key]) {
|
|
140
|
+
metadata[key] = value;
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return metadata;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Attach metadata to a Walrus Blob object
|
|
150
|
+
*
|
|
151
|
+
* NOTE: Based on research, Walrus metadata requires separate queries to retrieve,
|
|
152
|
+
* making it less efficient than on-chain Memory structs for filtering.
|
|
153
|
+
*/
|
|
154
|
+
async attachMetadataToBlob(
|
|
155
|
+
blobId: string,
|
|
156
|
+
metadata: WalrusMemoryMetadata,
|
|
157
|
+
signer: UnifiedSigner,
|
|
158
|
+
walrusPackageId: string
|
|
159
|
+
): Promise<{ digest: string; effects: any }> {
|
|
160
|
+
try {
|
|
161
|
+
const tx = new Transaction();
|
|
162
|
+
|
|
163
|
+
// Convert WalrusMemoryMetadata to VecMap<String, String> format
|
|
164
|
+
const metadataEntries: Array<[string, string]> = [];
|
|
165
|
+
Object.entries(metadata).forEach(([key, value]) => {
|
|
166
|
+
if (value !== undefined && value !== '') {
|
|
167
|
+
metadataEntries.push([key, value]);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
console.log(`📋 Attaching ${metadataEntries.length} metadata fields to blob ${blobId}`);
|
|
172
|
+
|
|
173
|
+
// Call Walrus blob::add_or_replace_metadata()
|
|
174
|
+
tx.moveCall({
|
|
175
|
+
target: `${walrusPackageId}::blob::add_or_replace_metadata`,
|
|
176
|
+
arguments: [
|
|
177
|
+
tx.object(blobId),
|
|
178
|
+
// Metadata construction would go here
|
|
179
|
+
],
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
tx.setSender(signer.getAddress());
|
|
183
|
+
|
|
184
|
+
const result = await signer.signAndExecuteTransaction(tx);
|
|
185
|
+
|
|
186
|
+
console.log(`✅ Metadata attached successfully. Digest: ${result.digest}`);
|
|
187
|
+
|
|
188
|
+
return {
|
|
189
|
+
digest: result.digest,
|
|
190
|
+
effects: result.effects,
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
} catch (error) {
|
|
194
|
+
console.error(`❌ Failed to attach metadata to blob ${blobId}:`, error);
|
|
195
|
+
throw new Error(`Metadata attachment failed: ${error}`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Retrieve metadata from a Walrus Blob object
|
|
201
|
+
*
|
|
202
|
+
* NOTE: This queries dynamic fields, which is slower than querying on-chain structs.
|
|
203
|
+
*/
|
|
204
|
+
async retrieveBlobMetadata(blobObjectId: string): Promise<WalrusMemoryMetadata | null> {
|
|
205
|
+
try {
|
|
206
|
+
// Query dynamic fields on the Blob object
|
|
207
|
+
const dynamicFields = await this.suiClient.getDynamicFields({
|
|
208
|
+
parentId: blobObjectId,
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
// Look for the metadata dynamic field
|
|
212
|
+
const metadataField = dynamicFields.data.find(
|
|
213
|
+
(field: any) => field.name.value === 'metadata'
|
|
214
|
+
);
|
|
215
|
+
|
|
216
|
+
if (!metadataField) {
|
|
217
|
+
console.log(`No metadata found for blob object ${blobObjectId}`);
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Retrieve the metadata object
|
|
222
|
+
const metadataObject = await this.suiClient.getObject({
|
|
223
|
+
id: metadataField.objectId,
|
|
224
|
+
options: { showContent: true },
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
if (!metadataObject.data?.content || !('fields' in metadataObject.data.content)) {
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
const fields = metadataObject.data.content.fields as any;
|
|
232
|
+
|
|
233
|
+
// Parse VecMap<String, String> into WalrusMemoryMetadata
|
|
234
|
+
const metadata: WalrusMemoryMetadata = {
|
|
235
|
+
content_type: '',
|
|
236
|
+
content_size: '',
|
|
237
|
+
category: '',
|
|
238
|
+
topic: '',
|
|
239
|
+
importance: '',
|
|
240
|
+
embedding_dimensions: '',
|
|
241
|
+
embedding_model: '',
|
|
242
|
+
graph_entity_count: '',
|
|
243
|
+
graph_relationship_count: '',
|
|
244
|
+
vector_id: '',
|
|
245
|
+
vector_status: '',
|
|
246
|
+
created_at: '',
|
|
247
|
+
updated_at: '',
|
|
248
|
+
encrypted: '',
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
// Parse the VecMap contents
|
|
252
|
+
if (fields.contents && Array.isArray(fields.contents)) {
|
|
253
|
+
fields.contents.forEach((entry: any) => {
|
|
254
|
+
if (entry.key && entry.value) {
|
|
255
|
+
(metadata as any)[entry.key] = entry.value;
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
console.log(`✅ Retrieved metadata for blob object ${blobObjectId}`);
|
|
261
|
+
return metadata;
|
|
262
|
+
|
|
263
|
+
} catch (error) {
|
|
264
|
+
console.error(`❌ Failed to retrieve metadata for blob ${blobObjectId}:`, error);
|
|
265
|
+
return null;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|