@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.
Files changed (44) hide show
  1. package/README.md +59 -0
  2. package/dist/account-entry.d.ts +14 -0
  3. package/dist/account-entry.d.ts.map +1 -0
  4. package/dist/account-entry.js +14 -0
  5. package/dist/account-entry.js.map +1 -0
  6. package/dist/account.d.ts +87 -0
  7. package/dist/account.d.ts.map +1 -0
  8. package/dist/account.js +273 -0
  9. package/dist/account.js.map +1 -0
  10. package/dist/ai/index.d.ts +3 -0
  11. package/dist/ai/index.d.ts.map +1 -0
  12. package/dist/ai/index.js +2 -0
  13. package/dist/ai/index.js.map +1 -0
  14. package/dist/ai/middleware.d.ts +55 -0
  15. package/dist/ai/middleware.d.ts.map +1 -0
  16. package/dist/ai/middleware.js +145 -0
  17. package/dist/ai/middleware.js.map +1 -0
  18. package/dist/core.d.ts.map +1 -0
  19. package/dist/core.js.map +1 -0
  20. package/dist/index.d.ts +16 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +17 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/manual-entry.d.ts +12 -0
  25. package/dist/manual-entry.d.ts.map +1 -0
  26. package/dist/manual-entry.js +11 -0
  27. package/dist/manual-entry.js.map +1 -0
  28. package/dist/manual.d.ts +97 -0
  29. package/dist/manual.d.ts.map +1 -0
  30. package/dist/manual.js +498 -0
  31. package/dist/manual.js.map +1 -0
  32. package/dist/memwal.d.ts +174 -0
  33. package/dist/memwal.d.ts.map +1 -0
  34. package/dist/memwal.js +283 -0
  35. package/dist/memwal.js.map +1 -0
  36. package/dist/types.d.ts +237 -0
  37. package/dist/types.d.ts.map +1 -0
  38. package/dist/types.js +8 -0
  39. package/dist/types.js.map +1 -0
  40. package/dist/utils.d.ts +38 -0
  41. package/dist/utils.d.ts.map +1 -0
  42. package/dist/utils.js +84 -0
  43. package/dist/utils.js.map +1 -0
  44. 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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"}