@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,297 +1,297 @@
1
- /**
2
- * Context Namespace - App Context Management & Cross-Context Data Transfer
3
- *
4
- * Higher-level abstraction over MemoryCap capabilities.
5
- * Provides user-friendly API for managing app contexts and
6
- * exporting/importing data between different dApp contexts.
7
- *
8
- * A "context" is simply a MemoryCap for a specific app ID.
9
- * This namespace makes it easier to work with app-scoped data.
10
- *
11
- * Key features:
12
- * - Create/manage app contexts (MemoryCaps)
13
- * - Export private data from one context
14
- * - Import data into another context (re-encrypted)
15
- * - User must sign to authorize decryption
16
- *
17
- * @module client/namespaces
18
- */
19
-
20
- import type { ServiceContainer } from '../SimplePDWClient';
21
- import type { MemoryCap } from '../../core/types/capability';
22
- import { CapabilityService } from '../../services/CapabilityService';
23
-
24
- /**
25
- * Context info with additional metadata
26
- */
27
- export interface ContextInfo extends MemoryCap {
28
- /** Number of memories in this context */
29
- memoryCount?: number;
30
- /** Last activity timestamp */
31
- lastActivity?: number;
32
- }
33
-
34
- /**
35
- * Context Namespace
36
- *
37
- * Higher-level API for managing app contexts
38
- */
39
- export class ContextNamespace {
40
- private capService: CapabilityService | null = null;
41
-
42
- constructor(private services: ServiceContainer) {
43
- // Initialize CapabilityService if SuiClient and packageId available
44
- const suiClient = this.services.config.sui?.client;
45
- const packageId = this.services.config.sui?.packageId;
46
-
47
- if (suiClient && packageId) {
48
- this.capService = new CapabilityService({
49
- suiClient,
50
- packageId,
51
- });
52
- }
53
- }
54
-
55
- /**
56
- * Ensure CapabilityService is initialized
57
- */
58
- private ensureService(): CapabilityService {
59
- if (!this.capService) {
60
- throw new Error('CapabilityService not initialized. Check Sui configuration.');
61
- }
62
- return this.capService;
63
- }
64
-
65
- /**
66
- * Create a new context for an app
67
- *
68
- * @param appId - Application identifier (e.g., "MEMO", "HEALTH", "FINANCE")
69
- * @returns Created context (MemoryCap)
70
- *
71
- * @example
72
- * ```typescript
73
- * const memoContext = await pdw.context.create('MEMO');
74
- * const healthContext = await pdw.context.create('HEALTH');
75
- * ```
76
- */
77
- async create(appId: string): Promise<MemoryCap> {
78
- const service = this.ensureService();
79
- const signer = this.services.config.signer.getSigner();
80
-
81
- return await service.create({ appId }, signer);
82
- }
83
-
84
- /**
85
- * Get context by app ID
86
- *
87
- * @param appId - Application identifier
88
- * @returns Context or null if not found
89
- */
90
- async get(appId: string): Promise<MemoryCap | null> {
91
- const service = this.ensureService();
92
- return await service.get(this.services.config.userAddress, appId);
93
- }
94
-
95
- /**
96
- * Get or create context for an app
97
- *
98
- * Convenience method - returns existing context if found,
99
- * otherwise creates a new one.
100
- *
101
- * @param appId - Application identifier
102
- * @returns Existing or newly created context
103
- *
104
- * @example
105
- * ```typescript
106
- * // Always get a context, create if needed
107
- * const ctx = await pdw.context.getOrCreate('MEMO');
108
- * ```
109
- */
110
- async getOrCreate(appId: string): Promise<MemoryCap> {
111
- const service = this.ensureService();
112
- const signer = this.services.config.signer.getSigner();
113
-
114
- return await service.getOrCreate(
115
- { appId, userAddress: this.services.config.userAddress },
116
- signer
117
- );
118
- }
119
-
120
- /**
121
- * List all contexts owned by the user
122
- *
123
- * @returns Array of contexts (MemoryCaps)
124
- *
125
- * @example
126
- * ```typescript
127
- * const contexts = await pdw.context.list();
128
- * contexts.forEach(ctx => console.log(ctx.appId));
129
- * ```
130
- */
131
- async list(): Promise<MemoryCap[]> {
132
- const service = this.ensureService();
133
-
134
- return await service.list({
135
- userAddress: this.services.config.userAddress,
136
- });
137
- }
138
-
139
- /**
140
- * Delete a context (burns the capability)
141
- *
142
- * Warning: This permanently revokes access to all memories
143
- * encrypted with this context's key.
144
- *
145
- * @param appId - Application identifier
146
- *
147
- * @example
148
- * ```typescript
149
- * await pdw.context.delete('OLD_APP');
150
- * ```
151
- */
152
- async delete(appId: string): Promise<void> {
153
- const service = this.ensureService();
154
- const signer = this.services.config.signer.getSigner();
155
-
156
- // Get the capability first
157
- const cap = await service.get(this.services.config.userAddress, appId);
158
- if (!cap) {
159
- throw new Error(`Context not found for appId: ${appId}`);
160
- }
161
-
162
- // Burn the capability
163
- await service.burn({ capId: cap.id }, signer);
164
- }
165
-
166
- /**
167
- * Transfer context to another user
168
- *
169
- * After transfer:
170
- * - New owner can decrypt memories for this context
171
- * - Original owner loses access
172
- *
173
- * @param appId - Application identifier
174
- * @param recipient - Recipient's Sui address
175
- */
176
- async transfer(appId: string, recipient: string): Promise<void> {
177
- const service = this.ensureService();
178
- const signer = this.services.config.signer.getSigner();
179
-
180
- // Get the capability first
181
- const cap = await service.get(this.services.config.userAddress, appId);
182
- if (!cap) {
183
- throw new Error(`Context not found for appId: ${appId}`);
184
- }
185
-
186
- // Transfer the capability
187
- await service.transfer({ capId: cap.id, recipient }, signer);
188
- }
189
-
190
- /**
191
- * Check if context exists for an app
192
- *
193
- * @param appId - Application identifier
194
- * @returns True if context exists
195
- */
196
- async exists(appId: string): Promise<boolean> {
197
- const service = this.ensureService();
198
- return await service.hasCapability(this.services.config.userAddress, appId);
199
- }
200
-
201
- /**
202
- * Get context with extended info (memory count, last activity)
203
- *
204
- * Queries actual memory count and last activity from:
205
- * 1. ViewService (on-chain query) if available
206
- * 2. MemoryIndexService (local index) as fallback
207
- *
208
- * @param appId - Application identifier
209
- * @returns Context info or null
210
- */
211
- async getInfo(appId: string): Promise<ContextInfo | null> {
212
- const cap = await this.get(appId);
213
- if (!cap) {
214
- return null;
215
- }
216
-
217
- let memoryCount = 0;
218
- let lastActivity = cap.createdAt;
219
-
220
- try {
221
- // Try ViewService first (on-chain query)
222
- if (this.services.viewService) {
223
- const result = await this.services.viewService.getUserMemories(
224
- this.services.config.userAddress,
225
- { category: appId, limit: 1000 }
226
- );
227
- memoryCount = result.data.length;
228
-
229
- // Find most recent activity
230
- if (result.data.length > 0) {
231
- const timestamps = result.data
232
- .map(m => m.updatedAt || m.createdAt || 0)
233
- .filter(t => t > 0);
234
- if (timestamps.length > 0) {
235
- lastActivity = Math.max(...timestamps);
236
- }
237
- }
238
- }
239
- // Fallback to MemoryIndexService (local index)
240
- else if (this.services.memoryIndex) {
241
- const memories = await this.services.memoryIndex.getUserMemories(
242
- this.services.config.userAddress,
243
- { categories: [appId] }
244
- );
245
- memoryCount = memories.length;
246
-
247
- // Find most recent activity
248
- if (memories.length > 0) {
249
- const timestamps = memories
250
- .map(m => m.metadata?.createdTimestamp || m.metadata?.updatedTimestamp || 0)
251
- .filter(t => t > 0);
252
- if (timestamps.length > 0) {
253
- lastActivity = Math.max(...timestamps);
254
- }
255
- }
256
- }
257
- } catch (error) {
258
- // Log but don't fail - return basic info
259
- console.warn(`Failed to query memory stats for context ${appId}:`, error);
260
- }
261
-
262
- return {
263
- ...cap,
264
- memoryCount,
265
- lastActivity,
266
- };
267
- }
268
-
269
- /**
270
- * Get SEAL key ID for a context
271
- *
272
- * Used for encryption/decryption operations.
273
- *
274
- * @param appId - Application identifier
275
- * @returns Key ID as hex string
276
- */
277
- async getKeyId(appId: string): Promise<string | null> {
278
- const service = this.ensureService();
279
- const cap = await service.get(this.services.config.userAddress, appId);
280
-
281
- if (!cap) {
282
- return null;
283
- }
284
-
285
- return service.computeKeyId(cap);
286
- }
287
-
288
- /**
289
- * Get all app IDs for user's contexts
290
- *
291
- * @returns Array of app IDs
292
- */
293
- async getAppIds(): Promise<string[]> {
294
- const contexts = await this.list();
295
- return contexts.map(ctx => ctx.appId);
296
- }
297
- }
1
+ /**
2
+ * Context Namespace - App Context Management & Cross-Context Data Transfer
3
+ *
4
+ * Higher-level abstraction over MemoryCap capabilities.
5
+ * Provides user-friendly API for managing app contexts and
6
+ * exporting/importing data between different dApp contexts.
7
+ *
8
+ * A "context" is simply a MemoryCap for a specific app ID.
9
+ * This namespace makes it easier to work with app-scoped data.
10
+ *
11
+ * Key features:
12
+ * - Create/manage app contexts (MemoryCaps)
13
+ * - Export private data from one context
14
+ * - Import data into another context (re-encrypted)
15
+ * - User must sign to authorize decryption
16
+ *
17
+ * @module client/namespaces
18
+ */
19
+
20
+ import type { ServiceContainer } from '../SimplePDWClient';
21
+ import type { MemoryCap } from '../../core/types/capability';
22
+ import { CapabilityService } from '../../services/CapabilityService';
23
+
24
+ /**
25
+ * Context info with additional metadata
26
+ */
27
+ export interface ContextInfo extends MemoryCap {
28
+ /** Number of memories in this context */
29
+ memoryCount?: number;
30
+ /** Last activity timestamp */
31
+ lastActivity?: number;
32
+ }
33
+
34
+ /**
35
+ * Context Namespace
36
+ *
37
+ * Higher-level API for managing app contexts
38
+ */
39
+ export class ContextNamespace {
40
+ private capService: CapabilityService | null = null;
41
+
42
+ constructor(private services: ServiceContainer) {
43
+ // Initialize CapabilityService if SuiClient and packageId available
44
+ const suiClient = this.services.config.sui?.client;
45
+ const packageId = this.services.config.sui?.packageId;
46
+
47
+ if (suiClient && packageId) {
48
+ this.capService = new CapabilityService({
49
+ suiClient,
50
+ packageId,
51
+ });
52
+ }
53
+ }
54
+
55
+ /**
56
+ * Ensure CapabilityService is initialized
57
+ */
58
+ private ensureService(): CapabilityService {
59
+ if (!this.capService) {
60
+ throw new Error('CapabilityService not initialized. Check Sui configuration.');
61
+ }
62
+ return this.capService;
63
+ }
64
+
65
+ /**
66
+ * Create a new context for an app
67
+ *
68
+ * @param appId - Application identifier (e.g., "MEMO", "HEALTH", "FINANCE")
69
+ * @returns Created context (MemoryCap)
70
+ *
71
+ * @example
72
+ * ```typescript
73
+ * const memoContext = await pdw.context.create('MEMO');
74
+ * const healthContext = await pdw.context.create('HEALTH');
75
+ * ```
76
+ */
77
+ async create(appId: string): Promise<MemoryCap> {
78
+ const service = this.ensureService();
79
+ const signer = this.services.config.signer.getSigner();
80
+
81
+ return await service.create({ appId }, signer);
82
+ }
83
+
84
+ /**
85
+ * Get context by app ID
86
+ *
87
+ * @param appId - Application identifier
88
+ * @returns Context or null if not found
89
+ */
90
+ async get(appId: string): Promise<MemoryCap | null> {
91
+ const service = this.ensureService();
92
+ return await service.get(this.services.config.userAddress, appId);
93
+ }
94
+
95
+ /**
96
+ * Get or create context for an app
97
+ *
98
+ * Convenience method - returns existing context if found,
99
+ * otherwise creates a new one.
100
+ *
101
+ * @param appId - Application identifier
102
+ * @returns Existing or newly created context
103
+ *
104
+ * @example
105
+ * ```typescript
106
+ * // Always get a context, create if needed
107
+ * const ctx = await pdw.context.getOrCreate('MEMO');
108
+ * ```
109
+ */
110
+ async getOrCreate(appId: string): Promise<MemoryCap> {
111
+ const service = this.ensureService();
112
+ const signer = this.services.config.signer.getSigner();
113
+
114
+ return await service.getOrCreate(
115
+ { appId, userAddress: this.services.config.userAddress },
116
+ signer
117
+ );
118
+ }
119
+
120
+ /**
121
+ * List all contexts owned by the user
122
+ *
123
+ * @returns Array of contexts (MemoryCaps)
124
+ *
125
+ * @example
126
+ * ```typescript
127
+ * const contexts = await pdw.context.list();
128
+ * contexts.forEach(ctx => console.log(ctx.appId));
129
+ * ```
130
+ */
131
+ async list(): Promise<MemoryCap[]> {
132
+ const service = this.ensureService();
133
+
134
+ return await service.list({
135
+ userAddress: this.services.config.userAddress,
136
+ });
137
+ }
138
+
139
+ /**
140
+ * Delete a context (burns the capability)
141
+ *
142
+ * Warning: This permanently revokes access to all memories
143
+ * encrypted with this context's key.
144
+ *
145
+ * @param appId - Application identifier
146
+ *
147
+ * @example
148
+ * ```typescript
149
+ * await pdw.context.delete('OLD_APP');
150
+ * ```
151
+ */
152
+ async delete(appId: string): Promise<void> {
153
+ const service = this.ensureService();
154
+ const signer = this.services.config.signer.getSigner();
155
+
156
+ // Get the capability first
157
+ const cap = await service.get(this.services.config.userAddress, appId);
158
+ if (!cap) {
159
+ throw new Error(`Context not found for appId: ${appId}`);
160
+ }
161
+
162
+ // Burn the capability
163
+ await service.burn({ capId: cap.id }, signer);
164
+ }
165
+
166
+ /**
167
+ * Transfer context to another user
168
+ *
169
+ * After transfer:
170
+ * - New owner can decrypt memories for this context
171
+ * - Original owner loses access
172
+ *
173
+ * @param appId - Application identifier
174
+ * @param recipient - Recipient's Sui address
175
+ */
176
+ async transfer(appId: string, recipient: string): Promise<void> {
177
+ const service = this.ensureService();
178
+ const signer = this.services.config.signer.getSigner();
179
+
180
+ // Get the capability first
181
+ const cap = await service.get(this.services.config.userAddress, appId);
182
+ if (!cap) {
183
+ throw new Error(`Context not found for appId: ${appId}`);
184
+ }
185
+
186
+ // Transfer the capability
187
+ await service.transfer({ capId: cap.id, recipient }, signer);
188
+ }
189
+
190
+ /**
191
+ * Check if context exists for an app
192
+ *
193
+ * @param appId - Application identifier
194
+ * @returns True if context exists
195
+ */
196
+ async exists(appId: string): Promise<boolean> {
197
+ const service = this.ensureService();
198
+ return await service.hasCapability(this.services.config.userAddress, appId);
199
+ }
200
+
201
+ /**
202
+ * Get context with extended info (memory count, last activity)
203
+ *
204
+ * Queries actual memory count and last activity from:
205
+ * 1. ViewService (on-chain query) if available
206
+ * 2. MemoryIndexService (local index) as fallback
207
+ *
208
+ * @param appId - Application identifier
209
+ * @returns Context info or null
210
+ */
211
+ async getInfo(appId: string): Promise<ContextInfo | null> {
212
+ const cap = await this.get(appId);
213
+ if (!cap) {
214
+ return null;
215
+ }
216
+
217
+ let memoryCount = 0;
218
+ let lastActivity = cap.createdAt;
219
+
220
+ try {
221
+ // Try ViewService first (on-chain query)
222
+ if (this.services.viewService) {
223
+ const result = await this.services.viewService.getUserMemories(
224
+ this.services.config.userAddress,
225
+ { category: appId, limit: 1000 }
226
+ );
227
+ memoryCount = result.data.length;
228
+
229
+ // Find most recent activity
230
+ if (result.data.length > 0) {
231
+ const timestamps = result.data
232
+ .map(m => m.updatedAt || m.createdAt || 0)
233
+ .filter(t => t > 0);
234
+ if (timestamps.length > 0) {
235
+ lastActivity = Math.max(...timestamps);
236
+ }
237
+ }
238
+ }
239
+ // Fallback to MemoryIndexService (local index)
240
+ else if (this.services.memoryIndex) {
241
+ const memories = await this.services.memoryIndex.getUserMemories(
242
+ this.services.config.userAddress,
243
+ { categories: [appId] }
244
+ );
245
+ memoryCount = memories.length;
246
+
247
+ // Find most recent activity
248
+ if (memories.length > 0) {
249
+ const timestamps = memories
250
+ .map(m => m.metadata?.createdTimestamp || m.metadata?.updatedTimestamp || 0)
251
+ .filter(t => t > 0);
252
+ if (timestamps.length > 0) {
253
+ lastActivity = Math.max(...timestamps);
254
+ }
255
+ }
256
+ }
257
+ } catch (error) {
258
+ // Log but don't fail - return basic info
259
+ console.warn(`Failed to query memory stats for context ${appId}:`, error);
260
+ }
261
+
262
+ return {
263
+ ...cap,
264
+ memoryCount,
265
+ lastActivity,
266
+ };
267
+ }
268
+
269
+ /**
270
+ * Get SEAL key ID for a context
271
+ *
272
+ * Used for encryption/decryption operations.
273
+ *
274
+ * @param appId - Application identifier
275
+ * @returns Key ID as hex string
276
+ */
277
+ async getKeyId(appId: string): Promise<string | null> {
278
+ const service = this.ensureService();
279
+ const cap = await service.get(this.services.config.userAddress, appId);
280
+
281
+ if (!cap) {
282
+ return null;
283
+ }
284
+
285
+ return service.computeKeyId(cap);
286
+ }
287
+
288
+ /**
289
+ * Get all app IDs for user's contexts
290
+ *
291
+ * @returns Array of app IDs
292
+ */
293
+ async getAppIds(): Promise<string[]> {
294
+ const contexts = await this.list();
295
+ return contexts.map(ctx => ctx.appId);
296
+ }
297
+ }