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