@cmdoss/memwal-sdk 0.6.2 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +547 -547
- package/BENCHMARKS.md +238 -238
- package/README.md +310 -181
- package/dist/ai-sdk/tools.d.ts +2 -2
- package/dist/ai-sdk/tools.js +2 -2
- package/dist/client/ClientMemoryManager.js +2 -2
- package/dist/client/ClientMemoryManager.js.map +1 -1
- package/dist/client/PersonalDataWallet.d.ts.map +1 -1
- package/dist/client/SimplePDWClient.d.ts +29 -1
- package/dist/client/SimplePDWClient.d.ts.map +1 -1
- package/dist/client/SimplePDWClient.js +45 -13
- package/dist/client/SimplePDWClient.js.map +1 -1
- package/dist/client/namespaces/EmbeddingsNamespace.d.ts +1 -1
- package/dist/client/namespaces/EmbeddingsNamespace.js +1 -1
- package/dist/client/namespaces/MemoryNamespace.d.ts +31 -0
- package/dist/client/namespaces/MemoryNamespace.d.ts.map +1 -1
- package/dist/client/namespaces/MemoryNamespace.js +272 -39
- package/dist/client/namespaces/MemoryNamespace.js.map +1 -1
- package/dist/client/namespaces/consolidated/AINamespace.d.ts +2 -2
- package/dist/client/namespaces/consolidated/AINamespace.js +2 -2
- package/dist/client/namespaces/consolidated/BlockchainNamespace.d.ts +12 -2
- package/dist/client/namespaces/consolidated/BlockchainNamespace.d.ts.map +1 -1
- package/dist/client/namespaces/consolidated/BlockchainNamespace.js +62 -4
- package/dist/client/namespaces/consolidated/BlockchainNamespace.js.map +1 -1
- package/dist/client/namespaces/consolidated/StorageNamespace.d.ts +67 -2
- package/dist/client/namespaces/consolidated/StorageNamespace.d.ts.map +1 -1
- package/dist/client/namespaces/consolidated/StorageNamespace.js +549 -16
- package/dist/client/namespaces/consolidated/StorageNamespace.js.map +1 -1
- package/dist/config/ConfigurationHelper.js +61 -61
- package/dist/config/defaults.js +2 -2
- package/dist/config/defaults.js.map +1 -1
- package/dist/graph/GraphService.js +21 -21
- package/dist/graph/GraphService.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/seal/EncryptionService.d.ts +9 -5
- package/dist/infrastructure/seal/EncryptionService.d.ts.map +1 -1
- package/dist/infrastructure/seal/EncryptionService.js +37 -15
- package/dist/infrastructure/seal/EncryptionService.js.map +1 -1
- package/dist/infrastructure/seal/SealService.d.ts +13 -5
- package/dist/infrastructure/seal/SealService.d.ts.map +1 -1
- package/dist/infrastructure/seal/SealService.js +36 -34
- package/dist/infrastructure/seal/SealService.js.map +1 -1
- package/dist/langchain/createPDWRAG.js +30 -30
- package/dist/retrieval/MemoryDecryptionPipeline.d.ts.map +1 -1
- package/dist/retrieval/MemoryDecryptionPipeline.js +2 -1
- package/dist/retrieval/MemoryDecryptionPipeline.js.map +1 -1
- package/dist/retrieval/MemoryRetrievalService.d.ts +31 -0
- package/dist/retrieval/MemoryRetrievalService.d.ts.map +1 -1
- package/dist/retrieval/MemoryRetrievalService.js +44 -4
- package/dist/retrieval/MemoryRetrievalService.js.map +1 -1
- package/dist/services/CapabilityService.d.ts.map +1 -1
- package/dist/services/CapabilityService.js +30 -14
- package/dist/services/CapabilityService.js.map +1 -1
- package/dist/services/CrossContextPermissionService.d.ts.map +1 -1
- package/dist/services/CrossContextPermissionService.js +9 -7
- package/dist/services/CrossContextPermissionService.js.map +1 -1
- package/dist/services/EmbeddingService.d.ts +28 -1
- package/dist/services/EmbeddingService.d.ts.map +1 -1
- package/dist/services/EmbeddingService.js +54 -0
- package/dist/services/EmbeddingService.js.map +1 -1
- package/dist/services/EncryptionService.d.ts.map +1 -1
- package/dist/services/EncryptionService.js +6 -5
- package/dist/services/EncryptionService.js.map +1 -1
- package/dist/services/GeminiAIService.js +309 -309
- package/dist/services/IndexManager.d.ts +5 -1
- package/dist/services/IndexManager.d.ts.map +1 -1
- package/dist/services/IndexManager.js +17 -40
- package/dist/services/IndexManager.js.map +1 -1
- package/dist/services/QueryService.js +1 -1
- package/dist/services/QueryService.js.map +1 -1
- package/dist/services/StorageService.d.ts +11 -0
- package/dist/services/StorageService.d.ts.map +1 -1
- package/dist/services/StorageService.js +73 -10
- package/dist/services/StorageService.js.map +1 -1
- package/dist/services/TransactionService.d.ts +20 -0
- package/dist/services/TransactionService.d.ts.map +1 -1
- package/dist/services/TransactionService.js +43 -0
- package/dist/services/TransactionService.js.map +1 -1
- package/dist/services/ViewService.js +2 -2
- package/dist/services/ViewService.js.map +1 -1
- package/dist/services/storage/QuiltBatchManager.d.ts +101 -1
- package/dist/services/storage/QuiltBatchManager.d.ts.map +1 -1
- package/dist/services/storage/QuiltBatchManager.js +410 -20
- package/dist/services/storage/QuiltBatchManager.js.map +1 -1
- package/dist/services/storage/index.d.ts +1 -1
- package/dist/services/storage/index.d.ts.map +1 -1
- package/dist/services/storage/index.js.map +1 -1
- package/dist/utils/LRUCache.d.ts +106 -0
- package/dist/utils/LRUCache.d.ts.map +1 -0
- package/dist/utils/LRUCache.js +281 -0
- package/dist/utils/LRUCache.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/memoryIndexOnChain.d.ts +212 -0
- package/dist/utils/memoryIndexOnChain.d.ts.map +1 -0
- package/dist/utils/memoryIndexOnChain.js +312 -0
- package/dist/utils/memoryIndexOnChain.js.map +1 -0
- package/dist/utils/rebuildIndexNode.d.ts +29 -0
- package/dist/utils/rebuildIndexNode.d.ts.map +1 -1
- package/dist/utils/rebuildIndexNode.js +366 -98
- package/dist/utils/rebuildIndexNode.js.map +1 -1
- package/dist/vector/HnswWasmService.d.ts +20 -5
- package/dist/vector/HnswWasmService.d.ts.map +1 -1
- package/dist/vector/HnswWasmService.js +73 -40
- package/dist/vector/HnswWasmService.js.map +1 -1
- package/dist/vector/IHnswService.d.ts +10 -1
- package/dist/vector/IHnswService.d.ts.map +1 -1
- package/dist/vector/IHnswService.js.map +1 -1
- package/dist/vector/NodeHnswService.d.ts +16 -0
- package/dist/vector/NodeHnswService.d.ts.map +1 -1
- package/dist/vector/NodeHnswService.js +84 -5
- package/dist/vector/NodeHnswService.js.map +1 -1
- package/dist/vector/createHnswService.d.ts +1 -1
- package/dist/vector/createHnswService.js +1 -1
- package/dist/vector/index.d.ts +1 -1
- package/dist/vector/index.js +1 -1
- package/package.json +157 -157
- package/src/access/PermissionService.ts +635 -635
- package/src/aggregation/AggregationService.ts +389 -389
- package/src/ai-sdk/PDWVectorStore.ts +715 -715
- package/src/ai-sdk/index.ts +65 -65
- package/src/ai-sdk/tools.ts +460 -460
- package/src/ai-sdk/types.ts +404 -404
- package/src/batch/BatchManager.ts +597 -597
- package/src/batch/BatchingService.ts +429 -429
- package/src/batch/MemoryProcessingCache.ts +492 -492
- package/src/batch/index.ts +30 -30
- package/src/browser.ts +200 -200
- package/src/client/ClientMemoryManager.ts +987 -987
- package/src/client/PersonalDataWallet.ts +345 -345
- package/src/client/SimplePDWClient.ts +1289 -1222
- package/src/client/factory.ts +154 -154
- package/src/client/namespaces/AnalyticsNamespace.ts +377 -377
- package/src/client/namespaces/BatchNamespace.ts +356 -356
- package/src/client/namespaces/CacheNamespace.ts +123 -123
- package/src/client/namespaces/CapabilityNamespace.ts +217 -217
- package/src/client/namespaces/ClassifyNamespace.ts +169 -169
- package/src/client/namespaces/ContextNamespace.ts +297 -297
- package/src/client/namespaces/EmbeddingsNamespace.ts +99 -99
- package/src/client/namespaces/EncryptionNamespace.ts +221 -221
- package/src/client/namespaces/GraphNamespace.ts +468 -468
- package/src/client/namespaces/IndexNamespace.ts +361 -361
- package/src/client/namespaces/MemoryNamespace.ts +1422 -1135
- package/src/client/namespaces/PermissionsNamespace.ts +254 -254
- package/src/client/namespaces/PipelineNamespace.ts +220 -220
- package/src/client/namespaces/SearchNamespace.ts +1049 -1049
- package/src/client/namespaces/StorageNamespace.ts +458 -458
- package/src/client/namespaces/TxNamespace.ts +260 -260
- package/src/client/namespaces/WalletNamespace.ts +243 -243
- package/src/client/namespaces/consolidated/AINamespace.ts +449 -449
- package/src/client/namespaces/consolidated/BlockchainNamespace.ts +607 -546
- package/src/client/namespaces/consolidated/SecurityNamespace.ts +648 -648
- package/src/client/namespaces/consolidated/StorageNamespace.ts +1141 -497
- package/src/client/namespaces/consolidated/index.ts +39 -39
- package/src/client/signers/KeypairSigner.ts +108 -108
- package/src/client/signers/UnifiedSigner.ts +110 -110
- package/src/client/signers/WalletAdapterSigner.ts +159 -159
- package/src/client/signers/index.ts +26 -26
- package/src/config/ConfigurationHelper.ts +412 -412
- package/src/config/defaults.ts +51 -51
- package/src/config/index.ts +8 -8
- package/src/config/validation.ts +70 -70
- package/src/core/index.ts +14 -14
- package/src/core/interfaces/IService.ts +307 -307
- package/src/core/interfaces/index.ts +8 -8
- package/src/core/types/capability.ts +297 -297
- package/src/core/types/index.ts +870 -870
- package/src/core/types/wallet.ts +270 -270
- package/src/core/types.ts +9 -9
- package/src/core/wallet.ts +222 -222
- package/src/embedding/index.ts +19 -19
- package/src/embedding/types.ts +357 -357
- package/src/errors/index.ts +602 -602
- package/src/errors/recovery.ts +461 -461
- package/src/errors/validation.ts +567 -567
- package/src/generated/pdw/capability.ts +319 -319
- package/src/graph/GraphService.ts +887 -887
- package/src/graph/KnowledgeGraphManager.ts +728 -728
- package/src/graph/index.ts +25 -25
- package/src/index.ts +498 -474
- package/src/infrastructure/index.ts +22 -22
- package/src/infrastructure/seal/EncryptionService.ts +628 -603
- package/src/infrastructure/seal/SealService.ts +613 -615
- package/src/infrastructure/seal/index.ts +9 -9
- package/src/infrastructure/sui/BlockchainManager.ts +627 -627
- package/src/infrastructure/sui/SuiService.ts +888 -888
- package/src/infrastructure/sui/index.ts +9 -9
- package/src/infrastructure/walrus/StorageManager.ts +604 -604
- package/src/infrastructure/walrus/WalrusStorageService.ts +612 -612
- package/src/infrastructure/walrus/index.ts +9 -9
- package/src/langchain/PDWEmbeddings.ts +145 -145
- package/src/langchain/PDWVectorStore.ts +456 -456
- package/src/langchain/createPDWRAG.ts +303 -303
- package/src/langchain/index.ts +47 -47
- package/src/permissions/ConsentRepository.browser.ts +249 -249
- package/src/permissions/ConsentRepository.ts +364 -364
- package/src/pipeline/MemoryPipeline.ts +862 -862
- package/src/pipeline/PipelineManager.ts +683 -683
- package/src/pipeline/index.ts +26 -26
- package/src/retrieval/AdvancedSearchService.ts +629 -629
- package/src/retrieval/MemoryAnalyticsService.ts +711 -711
- package/src/retrieval/MemoryDecryptionPipeline.ts +825 -824
- package/src/retrieval/MemoryRetrievalService.ts +904 -830
- package/src/retrieval/index.ts +42 -42
- package/src/services/BatchService.ts +352 -352
- package/src/services/CapabilityService.ts +464 -448
- package/src/services/ClassifierService.ts +465 -465
- package/src/services/CrossContextPermissionService.ts +486 -484
- package/src/services/EmbeddingService.ts +771 -706
- package/src/services/EncryptionService.ts +712 -711
- package/src/services/GeminiAIService.ts +753 -753
- package/src/services/IndexManager.ts +977 -1004
- package/src/services/MemoryIndexService.ts +1003 -1003
- package/src/services/MemoryService.ts +369 -369
- package/src/services/QueryService.ts +890 -890
- package/src/services/StorageService.ts +1182 -1111
- package/src/services/TransactionService.ts +838 -790
- package/src/services/VectorService.ts +462 -462
- package/src/services/ViewService.ts +484 -484
- package/src/services/index.ts +25 -25
- package/src/services/storage/BlobAttributesManager.ts +333 -333
- package/src/services/storage/KnowledgeGraphManager.ts +425 -425
- package/src/services/storage/MemorySearchManager.ts +387 -387
- package/src/services/storage/QuiltBatchManager.ts +1130 -660
- package/src/services/storage/WalrusMetadataManager.ts +268 -268
- package/src/services/storage/WalrusStorageManager.ts +287 -287
- package/src/services/storage/index.ts +57 -52
- package/src/types/index.ts +13 -13
- package/src/utils/LRUCache.ts +378 -0
- package/src/utils/index.ts +76 -68
- package/src/utils/memoryIndexOnChain.ts +507 -0
- package/src/utils/rebuildIndex.ts +290 -290
- package/src/utils/rebuildIndexNode.ts +771 -424
- package/src/vector/BrowserHnswIndexService.ts +758 -758
- package/src/vector/HnswWasmService.ts +731 -679
- package/src/vector/IHnswService.ts +233 -224
- package/src/vector/NodeHnswService.ts +833 -735
- package/src/vector/VectorManager.ts +478 -478
- package/src/vector/createHnswService.ts +135 -135
- package/src/vector/index.ts +56 -56
- package/src/wallet/ContextWalletService.ts +656 -656
- package/src/wallet/MainWalletService.ts +317 -317
|
@@ -1,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
|
+
}
|