@mysten-incubation/memwal 0.0.1-dev.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/README.md +59 -0
- package/dist/account-entry.d.ts +14 -0
- package/dist/account-entry.d.ts.map +1 -0
- package/dist/account-entry.js +14 -0
- package/dist/account-entry.js.map +1 -0
- package/dist/account.d.ts +87 -0
- package/dist/account.d.ts.map +1 -0
- package/dist/account.js +273 -0
- package/dist/account.js.map +1 -0
- package/dist/ai/index.d.ts +3 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +2 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/middleware.d.ts +55 -0
- package/dist/ai/middleware.d.ts.map +1 -0
- package/dist/ai/middleware.js +145 -0
- package/dist/ai/middleware.js.map +1 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/manual-entry.d.ts +12 -0
- package/dist/manual-entry.d.ts.map +1 -0
- package/dist/manual-entry.js +11 -0
- package/dist/manual-entry.js.map +1 -0
- package/dist/manual.d.ts +97 -0
- package/dist/manual.d.ts.map +1 -0
- package/dist/manual.js +498 -0
- package/dist/manual.js.map +1 -0
- package/dist/memwal.d.ts +174 -0
- package/dist/memwal.d.ts.map +1 -0
- package/dist/memwal.js +283 -0
- package/dist/memwal.js.map +1 -0
- package/dist/types.d.ts +237 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +38 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +84 -0
- package/dist/utils.js.map +1 -0
- package/package.json +88 -0
package/dist/manual.js
ADDED
|
@@ -0,0 +1,498 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* memwal — Manual Client (Full Client-Side)
|
|
3
|
+
*
|
|
4
|
+
* User-side flow where the SDK handles everything locally:
|
|
5
|
+
* - SEAL encrypt/decrypt via @mysten/seal (user's own Sui wallet)
|
|
6
|
+
* - Walrus upload/download via @mysten/walrus
|
|
7
|
+
* - Embedding via OpenAI-compatible API (user's own key)
|
|
8
|
+
* - Vector registration via MemWal server (Ed25519 signed)
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import { MemWalManual } from "@mysten-incubation/memwal"
|
|
13
|
+
*
|
|
14
|
+
* const memwal = MemWalManual.create({
|
|
15
|
+
* key: process.env.MEMWAL_DELEGATE_KEY!, // Ed25519 delegate key
|
|
16
|
+
* suiPrivateKey: process.env.SUI_PRIVATE_KEY!, // suiprivkey1... for SEAL + Walrus
|
|
17
|
+
* embeddingApiKey: process.env.OPENAI_API_KEY!,
|
|
18
|
+
* packageId: "0x...",
|
|
19
|
+
* accountId: "0x...",
|
|
20
|
+
* })
|
|
21
|
+
*
|
|
22
|
+
* // Remember — all client-side: embed → SEAL encrypt → Walrus upload → register
|
|
23
|
+
* await memwal.rememberManual("I'm allergic to peanuts")
|
|
24
|
+
*
|
|
25
|
+
* // Recall — all client-side: embed → search → download → SEAL decrypt
|
|
26
|
+
* const result = await memwal.recallManual("food allergies")
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
import { sha256hex, hexToBytes, bytesToHex } from "./utils.js";
|
|
30
|
+
// ============================================================
|
|
31
|
+
// Constants
|
|
32
|
+
// ============================================================
|
|
33
|
+
// Default SEAL key server object IDs per network
|
|
34
|
+
// Users can override via SEAL_KEY_SERVERS in their environment
|
|
35
|
+
const DEFAULT_KEY_SERVERS = {
|
|
36
|
+
mainnet: [
|
|
37
|
+
"0x145540d931f182fef76467dd8074c9839aea126852d90d18e1556fcbbd1208b6", // Overclock (Open)
|
|
38
|
+
],
|
|
39
|
+
testnet: [
|
|
40
|
+
"0x73d05d62c18d9374e3ea529e8e0ed6161da1a141a94d3f76ae3fe4e99356db75",
|
|
41
|
+
"0xf5d14a81a982144ae441cd7d64b09027f116a468bd36e7eca494f750591623c8",
|
|
42
|
+
],
|
|
43
|
+
};
|
|
44
|
+
// ============================================================
|
|
45
|
+
// MemWalManual Client
|
|
46
|
+
// ============================================================
|
|
47
|
+
export class MemWalManual {
|
|
48
|
+
delegatePrivateKey;
|
|
49
|
+
delegatePublicKey = null;
|
|
50
|
+
serverUrl;
|
|
51
|
+
config;
|
|
52
|
+
walletSigner;
|
|
53
|
+
namespace;
|
|
54
|
+
// Lazily initialized heavy clients (typed as any to avoid peer dep compile errors)
|
|
55
|
+
_suiClient = null;
|
|
56
|
+
_sealClient = null;
|
|
57
|
+
_walrusClient = null;
|
|
58
|
+
_keypair = null;
|
|
59
|
+
constructor(config) {
|
|
60
|
+
if (!config.suiPrivateKey && !config.walletSigner) {
|
|
61
|
+
throw new Error("MemWalManual: provide either suiPrivateKey or walletSigner");
|
|
62
|
+
}
|
|
63
|
+
if (config.suiPrivateKey && config.walletSigner) {
|
|
64
|
+
throw new Error("MemWalManual: provide suiPrivateKey OR walletSigner, not both");
|
|
65
|
+
}
|
|
66
|
+
this.delegatePrivateKey = hexToBytes(config.key);
|
|
67
|
+
this.serverUrl = (config.serverUrl ?? "http://localhost:8000").replace(/\/$/, "");
|
|
68
|
+
this.walletSigner = config.walletSigner ?? null;
|
|
69
|
+
this.config = config;
|
|
70
|
+
this.namespace = config.namespace ?? "default";
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Create a new MemWalManual client.
|
|
74
|
+
*
|
|
75
|
+
* Requires peer dependencies: @mysten/sui, @mysten/seal, @mysten/walrus
|
|
76
|
+
*
|
|
77
|
+
* @param config.key - Ed25519 delegate private key (hex) for server auth
|
|
78
|
+
* @param config.suiPrivateKey - Sui private key (bech32) for SEAL + Walrus (OR walletSigner)
|
|
79
|
+
* @param config.walletSigner - Connected wallet signer from dapp-kit (OR suiPrivateKey)
|
|
80
|
+
* @param config.embeddingApiKey - OpenAI/OpenRouter API key for embeddings
|
|
81
|
+
* @param config.packageId - MemWal contract package ID
|
|
82
|
+
* @param config.accountId - MemWalAccount object ID (for SEAL seal_approve)
|
|
83
|
+
*/
|
|
84
|
+
static create(config) {
|
|
85
|
+
return new MemWalManual(config);
|
|
86
|
+
}
|
|
87
|
+
/** Whether this client uses a connected wallet signer (vs raw keypair) */
|
|
88
|
+
get isWalletMode() {
|
|
89
|
+
return this.walletSigner !== null;
|
|
90
|
+
}
|
|
91
|
+
// ============================================================
|
|
92
|
+
// Lazy Client Initialization
|
|
93
|
+
// All @mysten/* imports are dynamic to avoid requiring peer deps at
|
|
94
|
+
// compile time. Users who only use the server-mode MemWal class
|
|
95
|
+
// don't need these packages installed.
|
|
96
|
+
// ============================================================
|
|
97
|
+
async getSuiClient() {
|
|
98
|
+
if (!this._suiClient) {
|
|
99
|
+
// Prefer externally-provided client (e.g. from dapp-kit's useSuiClient())
|
|
100
|
+
if (this.config.suiClient) {
|
|
101
|
+
this._suiClient = this.config.suiClient;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
// Fallback: create client via dynamic import
|
|
105
|
+
// @ts-ignore — optional peer dependency
|
|
106
|
+
const mod = await import("@mysten/sui/client");
|
|
107
|
+
const SuiClient = mod.SuiClient;
|
|
108
|
+
if (typeof SuiClient !== "function") {
|
|
109
|
+
throw new Error("SuiClient not found in @mysten/sui/client. " +
|
|
110
|
+
"For @mysten/sui v2.6.0+, pass suiClient in config " +
|
|
111
|
+
"(e.g. from dapp-kit's useSuiClient())");
|
|
112
|
+
}
|
|
113
|
+
const network = this.config.suiNetwork ?? "mainnet";
|
|
114
|
+
const urls = {
|
|
115
|
+
testnet: "https://fullnode.testnet.sui.io:443",
|
|
116
|
+
mainnet: "https://fullnode.mainnet.sui.io:443",
|
|
117
|
+
};
|
|
118
|
+
this._suiClient = new SuiClient({
|
|
119
|
+
url: urls[network] ?? urls.mainnet,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return this._suiClient;
|
|
124
|
+
}
|
|
125
|
+
async getKeypair() {
|
|
126
|
+
if (this.walletSigner) {
|
|
127
|
+
throw new Error("getKeypair() not available in wallet signer mode");
|
|
128
|
+
}
|
|
129
|
+
if (!this._keypair) {
|
|
130
|
+
const { decodeSuiPrivateKey } = await import("@mysten/sui/cryptography");
|
|
131
|
+
const { Ed25519Keypair } = await import("@mysten/sui/keypairs/ed25519");
|
|
132
|
+
const { secretKey } = decodeSuiPrivateKey(this.config.suiPrivateKey);
|
|
133
|
+
this._keypair = Ed25519Keypair.fromSecretKey(secretKey);
|
|
134
|
+
}
|
|
135
|
+
return this._keypair;
|
|
136
|
+
}
|
|
137
|
+
/** Get the owner address — from wallet signer or derived from keypair */
|
|
138
|
+
async getOwnerAddress() {
|
|
139
|
+
if (this.walletSigner) {
|
|
140
|
+
return this.walletSigner.address;
|
|
141
|
+
}
|
|
142
|
+
const keypair = await this.getKeypair();
|
|
143
|
+
return keypair.getPublicKey().toSuiAddress();
|
|
144
|
+
}
|
|
145
|
+
/** Sign and execute a transaction — via wallet popup or programmatic keypair */
|
|
146
|
+
async signAndExecuteTransaction(transaction) {
|
|
147
|
+
if (this.walletSigner) {
|
|
148
|
+
return this.walletSigner.signAndExecuteTransaction({ transaction });
|
|
149
|
+
}
|
|
150
|
+
const keypair = await this.getKeypair();
|
|
151
|
+
const suiClient = await this.getSuiClient();
|
|
152
|
+
return suiClient.signAndExecuteTransaction({
|
|
153
|
+
signer: keypair,
|
|
154
|
+
transaction,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
async getSealClient() {
|
|
158
|
+
if (!this._sealClient) {
|
|
159
|
+
// @ts-ignore — optional peer dependency
|
|
160
|
+
const { SealClient } = await import("@mysten/seal");
|
|
161
|
+
const suiClient = await this.getSuiClient();
|
|
162
|
+
const network = this.config.suiNetwork ?? "mainnet";
|
|
163
|
+
const keyServers = this.config.sealKeyServers ?? DEFAULT_KEY_SERVERS[network] ?? [];
|
|
164
|
+
if (keyServers.length === 0) {
|
|
165
|
+
throw new Error(`MemWalManual: no SEAL key servers configured for network "${network}". ` +
|
|
166
|
+
"Please provide sealKeyServers in config or set SEAL_KEY_SERVERS env var.");
|
|
167
|
+
}
|
|
168
|
+
this._sealClient = new SealClient({
|
|
169
|
+
suiClient,
|
|
170
|
+
serverConfigs: keyServers.map((id) => ({
|
|
171
|
+
objectId: id,
|
|
172
|
+
weight: 1,
|
|
173
|
+
})),
|
|
174
|
+
verifyKeyServers: false,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
return this._sealClient;
|
|
178
|
+
}
|
|
179
|
+
async getWalrusClient() {
|
|
180
|
+
if (!this._walrusClient) {
|
|
181
|
+
// @ts-ignore — optional peer dependency
|
|
182
|
+
const { WalrusClient } = await import("@mysten/walrus");
|
|
183
|
+
const suiClient = await this.getSuiClient();
|
|
184
|
+
const network = this.config.suiNetwork ?? "mainnet";
|
|
185
|
+
const uploadRelayHost = network === "testnet"
|
|
186
|
+
? "https://upload-relay.testnet.walrus.space"
|
|
187
|
+
: "https://upload-relay.mainnet.walrus.space";
|
|
188
|
+
this._walrusClient = new WalrusClient({
|
|
189
|
+
network: network,
|
|
190
|
+
suiClient,
|
|
191
|
+
uploadRelay: {
|
|
192
|
+
host: uploadRelayHost,
|
|
193
|
+
sendTip: { max: 10_000_000 },
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
return this._walrusClient;
|
|
198
|
+
}
|
|
199
|
+
// ============================================================
|
|
200
|
+
// Core Manual API
|
|
201
|
+
// ============================================================
|
|
202
|
+
/**
|
|
203
|
+
* Remember (hybrid flow):
|
|
204
|
+
* 1. Embed text (OpenAI/OpenRouter)
|
|
205
|
+
* 2. SEAL encrypt locally (no wallet signature needed)
|
|
206
|
+
* 3. Send {encrypted_data, vector} to server — server handles Walrus upload relay
|
|
207
|
+
*/
|
|
208
|
+
async rememberManual(text, namespace) {
|
|
209
|
+
if (!text)
|
|
210
|
+
throw new Error("Text cannot be empty");
|
|
211
|
+
const ns = namespace ?? this.namespace;
|
|
212
|
+
// Step 1 & 2: Embed + SEAL encrypt concurrently
|
|
213
|
+
const [vector, encrypted] = await Promise.all([
|
|
214
|
+
this.embed(text),
|
|
215
|
+
this.sealEncrypt(new TextEncoder().encode(text)),
|
|
216
|
+
]);
|
|
217
|
+
// Step 3: Send encrypted bytes (base64) + vector to server.
|
|
218
|
+
// Server will upload to Walrus via upload-relay and return the blob_id.
|
|
219
|
+
const encryptedBase64 = btoa(String.fromCharCode(...encrypted));
|
|
220
|
+
return this.signedRequest("POST", "/api/remember/manual", {
|
|
221
|
+
encrypted_data: encryptedBase64,
|
|
222
|
+
vector,
|
|
223
|
+
namespace: ns,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Recall (manual/full client-side):
|
|
228
|
+
* 1. Embed query (OpenAI)
|
|
229
|
+
* 2. Search server for matching vectors
|
|
230
|
+
* 3. Download blobs from Walrus
|
|
231
|
+
* 4. SEAL decrypt each blob
|
|
232
|
+
*/
|
|
233
|
+
async recallManual(query, limit = 10, namespace) {
|
|
234
|
+
if (!query)
|
|
235
|
+
throw new Error("Query cannot be empty");
|
|
236
|
+
const ns = namespace ?? this.namespace;
|
|
237
|
+
// Step 1: Embed query
|
|
238
|
+
const vector = await this.embed(query);
|
|
239
|
+
// Step 2: Search server
|
|
240
|
+
const searchResult = await this.signedRequest("POST", "/api/recall/manual", { vector, limit, namespace: ns });
|
|
241
|
+
if (searchResult.results.length === 0) {
|
|
242
|
+
return { results: [], total: 0 };
|
|
243
|
+
}
|
|
244
|
+
// Step 3: Download all encrypted blobs from Walrus concurrently
|
|
245
|
+
const downloadTasks = searchResult.results.map(async (hit) => {
|
|
246
|
+
try {
|
|
247
|
+
const data = await this.walrusDownload(hit.blob_id);
|
|
248
|
+
return { blob_id: hit.blob_id, data, distance: hit.distance };
|
|
249
|
+
}
|
|
250
|
+
catch (err) {
|
|
251
|
+
console.error(`[MemWalManual] Walrus download failed for ${hit.blob_id}:`, err);
|
|
252
|
+
return null;
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
const downloadedBlobs = (await Promise.all(downloadTasks)).filter((d) => d !== null);
|
|
256
|
+
if (downloadedBlobs.length === 0) {
|
|
257
|
+
return { results: [], total: 0 };
|
|
258
|
+
}
|
|
259
|
+
// Step 4: Create ONE SEAL SessionKey (one wallet popup), then decrypt all blobs
|
|
260
|
+
let sealClient;
|
|
261
|
+
let suiClient;
|
|
262
|
+
let SessionKey;
|
|
263
|
+
let EncryptedObject;
|
|
264
|
+
let Transaction;
|
|
265
|
+
let sessionKey;
|
|
266
|
+
try {
|
|
267
|
+
sealClient = await this.getSealClient();
|
|
268
|
+
suiClient = await this.getSuiClient();
|
|
269
|
+
// @ts-ignore — optional peer dependency
|
|
270
|
+
({ SessionKey, EncryptedObject } = await import("@mysten/seal"));
|
|
271
|
+
({ Transaction } = await import("@mysten/sui/transactions"));
|
|
272
|
+
}
|
|
273
|
+
catch (err) {
|
|
274
|
+
console.error('[MemWalManual] Failed to initialize SEAL/SUI clients:', err);
|
|
275
|
+
return { results: [], total: 0 };
|
|
276
|
+
}
|
|
277
|
+
const callerAddress = await this.getOwnerAddress();
|
|
278
|
+
// Create signer (wallet adapter or keypair)
|
|
279
|
+
const signer = await this.createSigner(callerAddress);
|
|
280
|
+
// Create session key ONCE (triggers one wallet popup)
|
|
281
|
+
try {
|
|
282
|
+
sessionKey = await SessionKey.create({
|
|
283
|
+
address: callerAddress,
|
|
284
|
+
packageId: this.config.packageId,
|
|
285
|
+
ttlMin: 30,
|
|
286
|
+
signer,
|
|
287
|
+
suiClient,
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
catch (err) {
|
|
291
|
+
console.error('[MemWalManual] SessionKey.create failed:', err);
|
|
292
|
+
return { results: [], total: 0 };
|
|
293
|
+
}
|
|
294
|
+
// Decrypt each blob sequentially using the shared session key
|
|
295
|
+
const results = [];
|
|
296
|
+
for (const blob of downloadedBlobs) {
|
|
297
|
+
try {
|
|
298
|
+
const parsed = EncryptedObject.parse(blob.data);
|
|
299
|
+
const fullId = parsed.id;
|
|
300
|
+
// Build seal_approve PTB
|
|
301
|
+
const idBytes = Array.from(Uint8Array.from(fullId.match(/.{1,2}/g).map((b) => parseInt(b, 16))));
|
|
302
|
+
const tx = new Transaction();
|
|
303
|
+
tx.moveCall({
|
|
304
|
+
target: `${this.config.packageId}::account::seal_approve`,
|
|
305
|
+
arguments: [
|
|
306
|
+
tx.pure("vector<u8>", idBytes),
|
|
307
|
+
tx.object(this.config.accountId),
|
|
308
|
+
],
|
|
309
|
+
});
|
|
310
|
+
const txBytes = await tx.build({ client: suiClient, onlyTransactionKind: true });
|
|
311
|
+
// Fetch decryption keys using shared session key
|
|
312
|
+
await sealClient.fetchKeys({
|
|
313
|
+
ids: [fullId],
|
|
314
|
+
txBytes,
|
|
315
|
+
sessionKey,
|
|
316
|
+
threshold: 1,
|
|
317
|
+
});
|
|
318
|
+
// Decrypt locally
|
|
319
|
+
const plaintext = await sealClient.decrypt({
|
|
320
|
+
data: blob.data,
|
|
321
|
+
sessionKey,
|
|
322
|
+
txBytes,
|
|
323
|
+
});
|
|
324
|
+
const text = new TextDecoder().decode(plaintext);
|
|
325
|
+
results.push({ blob_id: blob.blob_id, text, distance: blob.distance });
|
|
326
|
+
}
|
|
327
|
+
catch (err) {
|
|
328
|
+
console.error(`[MemWalManual] SEAL decrypt failed for ${blob.blob_id}:`, err);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return { results, total: results.length };
|
|
332
|
+
}
|
|
333
|
+
// ============================================================
|
|
334
|
+
// Internal: Signer Factory
|
|
335
|
+
// ============================================================
|
|
336
|
+
/** Create a signer adapter — either from wallet or keypair */
|
|
337
|
+
async createSigner(callerAddress) {
|
|
338
|
+
if (this.walletSigner) {
|
|
339
|
+
const ws = this.walletSigner;
|
|
340
|
+
return {
|
|
341
|
+
toSuiAddress: () => callerAddress,
|
|
342
|
+
getPublicKey: () => ({ toSuiAddress: () => callerAddress }),
|
|
343
|
+
sign: async (data) => {
|
|
344
|
+
const result = await ws.signPersonalMessage({ message: data });
|
|
345
|
+
return { signature: result.signature };
|
|
346
|
+
},
|
|
347
|
+
signPersonalMessage: async (data) => {
|
|
348
|
+
const result = await ws.signPersonalMessage({ message: data });
|
|
349
|
+
return { signature: result.signature };
|
|
350
|
+
},
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
return this.getKeypair();
|
|
354
|
+
}
|
|
355
|
+
// ============================================================
|
|
356
|
+
// Internal: Embedding
|
|
357
|
+
// ============================================================
|
|
358
|
+
async embed(text) {
|
|
359
|
+
if (!this.config.embeddingApiKey) {
|
|
360
|
+
throw new Error("MemWalManual: embeddingApiKey is required. " +
|
|
361
|
+
"Provide your OpenAI or OpenRouter API key in config.");
|
|
362
|
+
}
|
|
363
|
+
const apiBase = (this.config.embeddingApiBase ?? "https://api.openai.com/v1").replace(/\/$/, "");
|
|
364
|
+
const isOpenRouter = apiBase.includes("openrouter.ai");
|
|
365
|
+
const defaultModel = isOpenRouter ? "openai/text-embedding-3-small" : "text-embedding-3-small";
|
|
366
|
+
const model = this.config.embeddingModel ?? defaultModel;
|
|
367
|
+
const resp = await fetch(`${apiBase}/embeddings`, {
|
|
368
|
+
method: "POST",
|
|
369
|
+
headers: {
|
|
370
|
+
"Content-Type": "application/json",
|
|
371
|
+
"Authorization": `Bearer ${this.config.embeddingApiKey}`,
|
|
372
|
+
},
|
|
373
|
+
body: JSON.stringify({ model, input: text }),
|
|
374
|
+
});
|
|
375
|
+
if (!resp.ok) {
|
|
376
|
+
const errText = await resp.text();
|
|
377
|
+
throw new Error(`Embedding API error (${resp.status}): ${errText}`);
|
|
378
|
+
}
|
|
379
|
+
const data = await resp.json();
|
|
380
|
+
if (!data.data?.[0]?.embedding) {
|
|
381
|
+
throw new Error("Embedding API returned no data");
|
|
382
|
+
}
|
|
383
|
+
return data.data[0].embedding;
|
|
384
|
+
}
|
|
385
|
+
// ============================================================
|
|
386
|
+
// Internal: SEAL Encrypt
|
|
387
|
+
// ============================================================
|
|
388
|
+
async sealEncrypt(plaintext) {
|
|
389
|
+
const sealClient = await this.getSealClient();
|
|
390
|
+
const ownerAddress = await this.getOwnerAddress();
|
|
391
|
+
const result = await sealClient.encrypt({
|
|
392
|
+
threshold: 1,
|
|
393
|
+
packageId: this.config.packageId,
|
|
394
|
+
id: ownerAddress,
|
|
395
|
+
data: plaintext,
|
|
396
|
+
});
|
|
397
|
+
return new Uint8Array(result.encryptedObject);
|
|
398
|
+
}
|
|
399
|
+
// ============================================================
|
|
400
|
+
// Internal: Walrus Upload/Download
|
|
401
|
+
// ============================================================
|
|
402
|
+
async walrusUpload(data) {
|
|
403
|
+
// Direct HTTP PUT to Walrus publisher (works in both browser and Node.js,
|
|
404
|
+
// unlike @mysten/walrus SDK which uses WASM and requires Node.js)
|
|
405
|
+
const network = this.config.suiNetwork ?? "mainnet";
|
|
406
|
+
const defaultPublisher = network === "testnet"
|
|
407
|
+
? "https://publisher.walrus-testnet.walrus.space"
|
|
408
|
+
: "https://publisher.walrus-mainnet.walrus.space";
|
|
409
|
+
const publisherUrl = this.config.walrusPublisherUrl ?? defaultPublisher;
|
|
410
|
+
const epochs = this.config.walrusEpochs ?? 50;
|
|
411
|
+
const resp = await fetch(`${publisherUrl}/v1/blobs?epochs=${epochs}&deletable=true`, {
|
|
412
|
+
method: "PUT",
|
|
413
|
+
headers: { "Content-Type": "application/octet-stream" },
|
|
414
|
+
body: data,
|
|
415
|
+
});
|
|
416
|
+
if (!resp.ok) {
|
|
417
|
+
const errText = await resp.text();
|
|
418
|
+
throw new Error(`Walrus upload failed (${resp.status}): ${errText}`);
|
|
419
|
+
}
|
|
420
|
+
const result = await resp.json();
|
|
421
|
+
// Response can be { newlyCreated: { blobObject: { blobId } } }
|
|
422
|
+
// or { alreadyCertified: { blobId } }
|
|
423
|
+
const blobId = result.newlyCreated?.blobObject?.blobId
|
|
424
|
+
?? result.alreadyCertified?.blobId;
|
|
425
|
+
if (!blobId) {
|
|
426
|
+
throw new Error(`Walrus upload: unexpected response: ${JSON.stringify(result)}`);
|
|
427
|
+
}
|
|
428
|
+
return blobId;
|
|
429
|
+
}
|
|
430
|
+
async walrusDownload(blobId) {
|
|
431
|
+
// Direct HTTP fetch to Walrus aggregator (works in both browser and Node.js,
|
|
432
|
+
// unlike @mysten/walrus SDK which requires Node.js APIs)
|
|
433
|
+
const network = this.config.suiNetwork ?? "mainnet";
|
|
434
|
+
const defaultAggregator = network === "testnet"
|
|
435
|
+
? "https://aggregator.walrus-testnet.walrus.space"
|
|
436
|
+
: "https://aggregator.walrus-mainnet.walrus.space";
|
|
437
|
+
const aggregatorUrl = this.config.walrusAggregatorUrl ?? defaultAggregator;
|
|
438
|
+
const resp = await fetch(`${aggregatorUrl}/v1/blobs/${blobId}`);
|
|
439
|
+
if (!resp.ok) {
|
|
440
|
+
throw new Error(`Walrus download failed (${resp.status}): ${await resp.text()}`);
|
|
441
|
+
}
|
|
442
|
+
const buffer = await resp.arrayBuffer();
|
|
443
|
+
return new Uint8Array(buffer);
|
|
444
|
+
}
|
|
445
|
+
// ============================================================
|
|
446
|
+
// Internal: Signed HTTP Requests (same pattern as MemWal class)
|
|
447
|
+
// ============================================================
|
|
448
|
+
async getDelegatePublicKey() {
|
|
449
|
+
if (!this.delegatePublicKey) {
|
|
450
|
+
const ed = await import("@noble/ed25519");
|
|
451
|
+
this.delegatePublicKey = await ed.getPublicKeyAsync(this.delegatePrivateKey);
|
|
452
|
+
}
|
|
453
|
+
return this.delegatePublicKey;
|
|
454
|
+
}
|
|
455
|
+
async signedRequest(method, path, body) {
|
|
456
|
+
const ed = await import("@noble/ed25519");
|
|
457
|
+
const timestamp = Math.floor(Date.now() / 1000).toString();
|
|
458
|
+
const bodyStr = JSON.stringify(body);
|
|
459
|
+
const bodySha256 = await sha256hex(bodyStr);
|
|
460
|
+
const message = `${timestamp}.${method}.${path}.${bodySha256}`;
|
|
461
|
+
const msgBytes = new TextEncoder().encode(message);
|
|
462
|
+
const signature = await ed.signAsync(msgBytes, this.delegatePrivateKey);
|
|
463
|
+
const publicKey = await this.getDelegatePublicKey();
|
|
464
|
+
const url = `${this.serverUrl}${path}`;
|
|
465
|
+
const res = await fetch(url, {
|
|
466
|
+
method,
|
|
467
|
+
headers: {
|
|
468
|
+
"Content-Type": "application/json",
|
|
469
|
+
"x-public-key": bytesToHex(publicKey),
|
|
470
|
+
"x-signature": bytesToHex(signature),
|
|
471
|
+
"x-timestamp": timestamp,
|
|
472
|
+
},
|
|
473
|
+
body: bodyStr,
|
|
474
|
+
});
|
|
475
|
+
if (!res.ok) {
|
|
476
|
+
const errText = await res.text();
|
|
477
|
+
throw new Error(`MemWal API error (${res.status}): ${errText}`);
|
|
478
|
+
}
|
|
479
|
+
return res.json();
|
|
480
|
+
}
|
|
481
|
+
// ============================================================
|
|
482
|
+
// Restore
|
|
483
|
+
// ============================================================
|
|
484
|
+
/**
|
|
485
|
+
* Restore a namespace — server downloads all blobs from Walrus,
|
|
486
|
+
* decrypts with delegate key, re-embeds, and re-indexes.
|
|
487
|
+
*
|
|
488
|
+
* @param namespace - Namespace to restore
|
|
489
|
+
* @returns RestoreResult with count of restored entries
|
|
490
|
+
*/
|
|
491
|
+
async restore(namespace, limit = 50) {
|
|
492
|
+
return this.signedRequest("POST", "/api/restore", {
|
|
493
|
+
namespace,
|
|
494
|
+
limit,
|
|
495
|
+
});
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
//# sourceMappingURL=manual.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manual.js","sourceRoot":"","sources":["../src/manual.ts"],"names":[],"mappings":"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"}
|