@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.
Files changed (247) hide show
  1. package/ARCHITECTURE.md +547 -547
  2. package/BENCHMARKS.md +238 -238
  3. package/README.md +310 -181
  4. package/dist/ai-sdk/tools.d.ts +2 -2
  5. package/dist/ai-sdk/tools.js +2 -2
  6. package/dist/client/ClientMemoryManager.js +2 -2
  7. package/dist/client/ClientMemoryManager.js.map +1 -1
  8. package/dist/client/PersonalDataWallet.d.ts.map +1 -1
  9. package/dist/client/SimplePDWClient.d.ts +29 -1
  10. package/dist/client/SimplePDWClient.d.ts.map +1 -1
  11. package/dist/client/SimplePDWClient.js +45 -13
  12. package/dist/client/SimplePDWClient.js.map +1 -1
  13. package/dist/client/namespaces/EmbeddingsNamespace.d.ts +1 -1
  14. package/dist/client/namespaces/EmbeddingsNamespace.js +1 -1
  15. package/dist/client/namespaces/MemoryNamespace.d.ts +31 -0
  16. package/dist/client/namespaces/MemoryNamespace.d.ts.map +1 -1
  17. package/dist/client/namespaces/MemoryNamespace.js +272 -39
  18. package/dist/client/namespaces/MemoryNamespace.js.map +1 -1
  19. package/dist/client/namespaces/consolidated/AINamespace.d.ts +2 -2
  20. package/dist/client/namespaces/consolidated/AINamespace.js +2 -2
  21. package/dist/client/namespaces/consolidated/BlockchainNamespace.d.ts +12 -2
  22. package/dist/client/namespaces/consolidated/BlockchainNamespace.d.ts.map +1 -1
  23. package/dist/client/namespaces/consolidated/BlockchainNamespace.js +62 -4
  24. package/dist/client/namespaces/consolidated/BlockchainNamespace.js.map +1 -1
  25. package/dist/client/namespaces/consolidated/StorageNamespace.d.ts +67 -2
  26. package/dist/client/namespaces/consolidated/StorageNamespace.d.ts.map +1 -1
  27. package/dist/client/namespaces/consolidated/StorageNamespace.js +549 -16
  28. package/dist/client/namespaces/consolidated/StorageNamespace.js.map +1 -1
  29. package/dist/config/ConfigurationHelper.js +61 -61
  30. package/dist/config/defaults.js +2 -2
  31. package/dist/config/defaults.js.map +1 -1
  32. package/dist/graph/GraphService.js +21 -21
  33. package/dist/graph/GraphService.js.map +1 -1
  34. package/dist/index.d.ts +3 -1
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +3 -1
  37. package/dist/index.js.map +1 -1
  38. package/dist/infrastructure/seal/EncryptionService.d.ts +9 -5
  39. package/dist/infrastructure/seal/EncryptionService.d.ts.map +1 -1
  40. package/dist/infrastructure/seal/EncryptionService.js +37 -15
  41. package/dist/infrastructure/seal/EncryptionService.js.map +1 -1
  42. package/dist/infrastructure/seal/SealService.d.ts +13 -5
  43. package/dist/infrastructure/seal/SealService.d.ts.map +1 -1
  44. package/dist/infrastructure/seal/SealService.js +36 -34
  45. package/dist/infrastructure/seal/SealService.js.map +1 -1
  46. package/dist/langchain/createPDWRAG.js +30 -30
  47. package/dist/retrieval/MemoryDecryptionPipeline.d.ts.map +1 -1
  48. package/dist/retrieval/MemoryDecryptionPipeline.js +2 -1
  49. package/dist/retrieval/MemoryDecryptionPipeline.js.map +1 -1
  50. package/dist/retrieval/MemoryRetrievalService.d.ts +31 -0
  51. package/dist/retrieval/MemoryRetrievalService.d.ts.map +1 -1
  52. package/dist/retrieval/MemoryRetrievalService.js +44 -4
  53. package/dist/retrieval/MemoryRetrievalService.js.map +1 -1
  54. package/dist/services/CapabilityService.d.ts.map +1 -1
  55. package/dist/services/CapabilityService.js +30 -14
  56. package/dist/services/CapabilityService.js.map +1 -1
  57. package/dist/services/CrossContextPermissionService.d.ts.map +1 -1
  58. package/dist/services/CrossContextPermissionService.js +9 -7
  59. package/dist/services/CrossContextPermissionService.js.map +1 -1
  60. package/dist/services/EmbeddingService.d.ts +28 -1
  61. package/dist/services/EmbeddingService.d.ts.map +1 -1
  62. package/dist/services/EmbeddingService.js +54 -0
  63. package/dist/services/EmbeddingService.js.map +1 -1
  64. package/dist/services/EncryptionService.d.ts.map +1 -1
  65. package/dist/services/EncryptionService.js +6 -5
  66. package/dist/services/EncryptionService.js.map +1 -1
  67. package/dist/services/GeminiAIService.js +309 -309
  68. package/dist/services/IndexManager.d.ts +5 -1
  69. package/dist/services/IndexManager.d.ts.map +1 -1
  70. package/dist/services/IndexManager.js +17 -40
  71. package/dist/services/IndexManager.js.map +1 -1
  72. package/dist/services/QueryService.js +1 -1
  73. package/dist/services/QueryService.js.map +1 -1
  74. package/dist/services/StorageService.d.ts +11 -0
  75. package/dist/services/StorageService.d.ts.map +1 -1
  76. package/dist/services/StorageService.js +73 -10
  77. package/dist/services/StorageService.js.map +1 -1
  78. package/dist/services/TransactionService.d.ts +20 -0
  79. package/dist/services/TransactionService.d.ts.map +1 -1
  80. package/dist/services/TransactionService.js +43 -0
  81. package/dist/services/TransactionService.js.map +1 -1
  82. package/dist/services/ViewService.js +2 -2
  83. package/dist/services/ViewService.js.map +1 -1
  84. package/dist/services/storage/QuiltBatchManager.d.ts +101 -1
  85. package/dist/services/storage/QuiltBatchManager.d.ts.map +1 -1
  86. package/dist/services/storage/QuiltBatchManager.js +410 -20
  87. package/dist/services/storage/QuiltBatchManager.js.map +1 -1
  88. package/dist/services/storage/index.d.ts +1 -1
  89. package/dist/services/storage/index.d.ts.map +1 -1
  90. package/dist/services/storage/index.js.map +1 -1
  91. package/dist/utils/LRUCache.d.ts +106 -0
  92. package/dist/utils/LRUCache.d.ts.map +1 -0
  93. package/dist/utils/LRUCache.js +281 -0
  94. package/dist/utils/LRUCache.js.map +1 -0
  95. package/dist/utils/index.d.ts +1 -0
  96. package/dist/utils/index.d.ts.map +1 -1
  97. package/dist/utils/index.js +2 -0
  98. package/dist/utils/index.js.map +1 -1
  99. package/dist/utils/memoryIndexOnChain.d.ts +212 -0
  100. package/dist/utils/memoryIndexOnChain.d.ts.map +1 -0
  101. package/dist/utils/memoryIndexOnChain.js +312 -0
  102. package/dist/utils/memoryIndexOnChain.js.map +1 -0
  103. package/dist/utils/rebuildIndexNode.d.ts +29 -0
  104. package/dist/utils/rebuildIndexNode.d.ts.map +1 -1
  105. package/dist/utils/rebuildIndexNode.js +366 -98
  106. package/dist/utils/rebuildIndexNode.js.map +1 -1
  107. package/dist/vector/HnswWasmService.d.ts +20 -5
  108. package/dist/vector/HnswWasmService.d.ts.map +1 -1
  109. package/dist/vector/HnswWasmService.js +73 -40
  110. package/dist/vector/HnswWasmService.js.map +1 -1
  111. package/dist/vector/IHnswService.d.ts +10 -1
  112. package/dist/vector/IHnswService.d.ts.map +1 -1
  113. package/dist/vector/IHnswService.js.map +1 -1
  114. package/dist/vector/NodeHnswService.d.ts +16 -0
  115. package/dist/vector/NodeHnswService.d.ts.map +1 -1
  116. package/dist/vector/NodeHnswService.js +84 -5
  117. package/dist/vector/NodeHnswService.js.map +1 -1
  118. package/dist/vector/createHnswService.d.ts +1 -1
  119. package/dist/vector/createHnswService.js +1 -1
  120. package/dist/vector/index.d.ts +1 -1
  121. package/dist/vector/index.js +1 -1
  122. package/package.json +157 -157
  123. package/src/access/PermissionService.ts +635 -635
  124. package/src/aggregation/AggregationService.ts +389 -389
  125. package/src/ai-sdk/PDWVectorStore.ts +715 -715
  126. package/src/ai-sdk/index.ts +65 -65
  127. package/src/ai-sdk/tools.ts +460 -460
  128. package/src/ai-sdk/types.ts +404 -404
  129. package/src/batch/BatchManager.ts +597 -597
  130. package/src/batch/BatchingService.ts +429 -429
  131. package/src/batch/MemoryProcessingCache.ts +492 -492
  132. package/src/batch/index.ts +30 -30
  133. package/src/browser.ts +200 -200
  134. package/src/client/ClientMemoryManager.ts +987 -987
  135. package/src/client/PersonalDataWallet.ts +345 -345
  136. package/src/client/SimplePDWClient.ts +1289 -1222
  137. package/src/client/factory.ts +154 -154
  138. package/src/client/namespaces/AnalyticsNamespace.ts +377 -377
  139. package/src/client/namespaces/BatchNamespace.ts +356 -356
  140. package/src/client/namespaces/CacheNamespace.ts +123 -123
  141. package/src/client/namespaces/CapabilityNamespace.ts +217 -217
  142. package/src/client/namespaces/ClassifyNamespace.ts +169 -169
  143. package/src/client/namespaces/ContextNamespace.ts +297 -297
  144. package/src/client/namespaces/EmbeddingsNamespace.ts +99 -99
  145. package/src/client/namespaces/EncryptionNamespace.ts +221 -221
  146. package/src/client/namespaces/GraphNamespace.ts +468 -468
  147. package/src/client/namespaces/IndexNamespace.ts +361 -361
  148. package/src/client/namespaces/MemoryNamespace.ts +1422 -1135
  149. package/src/client/namespaces/PermissionsNamespace.ts +254 -254
  150. package/src/client/namespaces/PipelineNamespace.ts +220 -220
  151. package/src/client/namespaces/SearchNamespace.ts +1049 -1049
  152. package/src/client/namespaces/StorageNamespace.ts +458 -458
  153. package/src/client/namespaces/TxNamespace.ts +260 -260
  154. package/src/client/namespaces/WalletNamespace.ts +243 -243
  155. package/src/client/namespaces/consolidated/AINamespace.ts +449 -449
  156. package/src/client/namespaces/consolidated/BlockchainNamespace.ts +607 -546
  157. package/src/client/namespaces/consolidated/SecurityNamespace.ts +648 -648
  158. package/src/client/namespaces/consolidated/StorageNamespace.ts +1141 -497
  159. package/src/client/namespaces/consolidated/index.ts +39 -39
  160. package/src/client/signers/KeypairSigner.ts +108 -108
  161. package/src/client/signers/UnifiedSigner.ts +110 -110
  162. package/src/client/signers/WalletAdapterSigner.ts +159 -159
  163. package/src/client/signers/index.ts +26 -26
  164. package/src/config/ConfigurationHelper.ts +412 -412
  165. package/src/config/defaults.ts +51 -51
  166. package/src/config/index.ts +8 -8
  167. package/src/config/validation.ts +70 -70
  168. package/src/core/index.ts +14 -14
  169. package/src/core/interfaces/IService.ts +307 -307
  170. package/src/core/interfaces/index.ts +8 -8
  171. package/src/core/types/capability.ts +297 -297
  172. package/src/core/types/index.ts +870 -870
  173. package/src/core/types/wallet.ts +270 -270
  174. package/src/core/types.ts +9 -9
  175. package/src/core/wallet.ts +222 -222
  176. package/src/embedding/index.ts +19 -19
  177. package/src/embedding/types.ts +357 -357
  178. package/src/errors/index.ts +602 -602
  179. package/src/errors/recovery.ts +461 -461
  180. package/src/errors/validation.ts +567 -567
  181. package/src/generated/pdw/capability.ts +319 -319
  182. package/src/graph/GraphService.ts +887 -887
  183. package/src/graph/KnowledgeGraphManager.ts +728 -728
  184. package/src/graph/index.ts +25 -25
  185. package/src/index.ts +498 -474
  186. package/src/infrastructure/index.ts +22 -22
  187. package/src/infrastructure/seal/EncryptionService.ts +628 -603
  188. package/src/infrastructure/seal/SealService.ts +613 -615
  189. package/src/infrastructure/seal/index.ts +9 -9
  190. package/src/infrastructure/sui/BlockchainManager.ts +627 -627
  191. package/src/infrastructure/sui/SuiService.ts +888 -888
  192. package/src/infrastructure/sui/index.ts +9 -9
  193. package/src/infrastructure/walrus/StorageManager.ts +604 -604
  194. package/src/infrastructure/walrus/WalrusStorageService.ts +612 -612
  195. package/src/infrastructure/walrus/index.ts +9 -9
  196. package/src/langchain/PDWEmbeddings.ts +145 -145
  197. package/src/langchain/PDWVectorStore.ts +456 -456
  198. package/src/langchain/createPDWRAG.ts +303 -303
  199. package/src/langchain/index.ts +47 -47
  200. package/src/permissions/ConsentRepository.browser.ts +249 -249
  201. package/src/permissions/ConsentRepository.ts +364 -364
  202. package/src/pipeline/MemoryPipeline.ts +862 -862
  203. package/src/pipeline/PipelineManager.ts +683 -683
  204. package/src/pipeline/index.ts +26 -26
  205. package/src/retrieval/AdvancedSearchService.ts +629 -629
  206. package/src/retrieval/MemoryAnalyticsService.ts +711 -711
  207. package/src/retrieval/MemoryDecryptionPipeline.ts +825 -824
  208. package/src/retrieval/MemoryRetrievalService.ts +904 -830
  209. package/src/retrieval/index.ts +42 -42
  210. package/src/services/BatchService.ts +352 -352
  211. package/src/services/CapabilityService.ts +464 -448
  212. package/src/services/ClassifierService.ts +465 -465
  213. package/src/services/CrossContextPermissionService.ts +486 -484
  214. package/src/services/EmbeddingService.ts +771 -706
  215. package/src/services/EncryptionService.ts +712 -711
  216. package/src/services/GeminiAIService.ts +753 -753
  217. package/src/services/IndexManager.ts +977 -1004
  218. package/src/services/MemoryIndexService.ts +1003 -1003
  219. package/src/services/MemoryService.ts +369 -369
  220. package/src/services/QueryService.ts +890 -890
  221. package/src/services/StorageService.ts +1182 -1111
  222. package/src/services/TransactionService.ts +838 -790
  223. package/src/services/VectorService.ts +462 -462
  224. package/src/services/ViewService.ts +484 -484
  225. package/src/services/index.ts +25 -25
  226. package/src/services/storage/BlobAttributesManager.ts +333 -333
  227. package/src/services/storage/KnowledgeGraphManager.ts +425 -425
  228. package/src/services/storage/MemorySearchManager.ts +387 -387
  229. package/src/services/storage/QuiltBatchManager.ts +1130 -660
  230. package/src/services/storage/WalrusMetadataManager.ts +268 -268
  231. package/src/services/storage/WalrusStorageManager.ts +287 -287
  232. package/src/services/storage/index.ts +57 -52
  233. package/src/types/index.ts +13 -13
  234. package/src/utils/LRUCache.ts +378 -0
  235. package/src/utils/index.ts +76 -68
  236. package/src/utils/memoryIndexOnChain.ts +507 -0
  237. package/src/utils/rebuildIndex.ts +290 -290
  238. package/src/utils/rebuildIndexNode.ts +771 -424
  239. package/src/vector/BrowserHnswIndexService.ts +758 -758
  240. package/src/vector/HnswWasmService.ts +731 -679
  241. package/src/vector/IHnswService.ts +233 -224
  242. package/src/vector/NodeHnswService.ts +833 -735
  243. package/src/vector/VectorManager.ts +478 -478
  244. package/src/vector/createHnswService.ts +135 -135
  245. package/src/vector/index.ts +56 -56
  246. package/src/wallet/ContextWalletService.ts +656 -656
  247. 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
+ }