@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/README.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# @mysten-incubation/memwal
|
|
2
|
+
|
|
3
|
+
Privacy-first AI memory SDK for storing encrypted memories on Walrus and retrieving them with semantic search.
|
|
4
|
+
|
|
5
|
+
> MemWal is currently in beta and actively evolving. While fully usable today, we continue to refine the developer experience and operational guidance. We welcome feedback from early builders as we continue to improve the product.
|
|
6
|
+
|
|
7
|
+
## Documentation
|
|
8
|
+
|
|
9
|
+
For full documentation, visit [docs.memwal.ai](https://docs.memwal.ai).
|
|
10
|
+
|
|
11
|
+
## Install
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
pnpm add @mysten-incubation/memwal
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Peer dependencies (install as needed):
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
pnpm add @mysten/sui @mysten/seal @mysten/walrus ai zod
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Quick Start
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
import { MemWal } from "@mysten-incubation/memwal";
|
|
27
|
+
|
|
28
|
+
const memwal = MemWal.create({
|
|
29
|
+
key: "your-delegate-key-hex",
|
|
30
|
+
accountId: "your-memwal-account-id",
|
|
31
|
+
serverUrl: "https://your-relayer-url.com",
|
|
32
|
+
namespace: "demo",
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
await memwal.remember("User prefers dark mode and uses TypeScript.");
|
|
36
|
+
const memories = await memwal.recall("What are the user's preferences?");
|
|
37
|
+
await memwal.restore("demo");
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
If you are self-hosting the relayer and do not have an account ID yet, see [Self-Hosting](../../docs/relayer/self-hosting.md) for the account creation and delegate key setup flow.
|
|
41
|
+
|
|
42
|
+
## Exports
|
|
43
|
+
|
|
44
|
+
| Entry | Description |
|
|
45
|
+
|---|---|
|
|
46
|
+
| `@mysten-incubation/memwal` | Default client (`MemWal`). The relayer handles embedding, encryption, Walrus upload/download, retrieval, and restore. |
|
|
47
|
+
| `@mysten-incubation/memwal/manual` | Manual client flow (`MemWalManual`). You handle embedding calls and local SEAL operations. The relayer still handles upload relay, registration, search, and restore. |
|
|
48
|
+
| `@mysten-incubation/memwal/ai` | Vercel AI SDK integration - wraps `MemWal` as middleware for use with `streamText`, `generateText`, etc. |
|
|
49
|
+
|
|
50
|
+
## How It Works
|
|
51
|
+
|
|
52
|
+
1. **Scope** - Each memory operation runs inside an `owner + namespace` boundary
|
|
53
|
+
2. **Store** - The relayer embeds, encrypts, uploads to Walrus, and stores vector metadata in PostgreSQL
|
|
54
|
+
3. **Recall** - The relayer searches by owner plus namespace, resolves matching blobs, and returns plaintext results
|
|
55
|
+
4. **Restore** - The relayer can incrementally rebuild missing indexed entries for one namespace
|
|
56
|
+
|
|
57
|
+
## License
|
|
58
|
+
|
|
59
|
+
Apache 2.0 — see [LICENSE](../../LICENSE)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mysten-incubation/memwal/account
|
|
3
|
+
*
|
|
4
|
+
* Account management entry point — on-chain operations.
|
|
5
|
+
* Requires @mysten/sui as a peer dependency.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { createAccount, addDelegateKey, generateDelegateKey } from "@mysten-incubation/memwal/account"
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
export { createAccount, addDelegateKey, removeDelegateKey, generateDelegateKey } from "./account.js";
|
|
13
|
+
export type { CreateAccountOpts, CreateAccountResult, AddDelegateKeyOpts, AddDelegateKeyResult, RemoveDelegateKeyOpts, } from "./types.js";
|
|
14
|
+
//# sourceMappingURL=account-entry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-entry.d.ts","sourceRoot":"","sources":["../src/account-entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGrG,YAAY,EACR,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,GACxB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mysten-incubation/memwal/account
|
|
3
|
+
*
|
|
4
|
+
* Account management entry point — on-chain operations.
|
|
5
|
+
* Requires @mysten/sui as a peer dependency.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { createAccount, addDelegateKey, generateDelegateKey } from "@mysten-incubation/memwal/account"
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
// Account management (on-chain: create account, add/remove delegate keys)
|
|
13
|
+
export { createAccount, addDelegateKey, removeDelegateKey, generateDelegateKey } from "./account.js";
|
|
14
|
+
//# sourceMappingURL=account-entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-entry.js","sourceRoot":"","sources":["../src/account-entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,0EAA0E;AAC1E,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* memwal — Account Management
|
|
3
|
+
*
|
|
4
|
+
* On-chain account operations: create account, add/remove delegate keys.
|
|
5
|
+
* Supports both wallet signing (browser) and private key signing (server-side).
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { createAccount, addDelegateKey, generateDelegateKey } from "@mysten-incubation/memwal/account"
|
|
10
|
+
*
|
|
11
|
+
* // Generate a delegate keypair
|
|
12
|
+
* const delegate = await generateDelegateKey()
|
|
13
|
+
*
|
|
14
|
+
* // Create account (wallet mode — browser)
|
|
15
|
+
* const account = await createAccount({
|
|
16
|
+
* packageId: "0x...",
|
|
17
|
+
* registryId: "0x...",
|
|
18
|
+
* walletSigner,
|
|
19
|
+
* })
|
|
20
|
+
*
|
|
21
|
+
* // Add the delegate key
|
|
22
|
+
* await addDelegateKey({
|
|
23
|
+
* packageId: "0x...",
|
|
24
|
+
* accountId: account.accountId,
|
|
25
|
+
* publicKey: delegate.publicKey,
|
|
26
|
+
* label: "My Laptop",
|
|
27
|
+
* walletSigner,
|
|
28
|
+
* })
|
|
29
|
+
*
|
|
30
|
+
* // Now use the delegate key with the SDK
|
|
31
|
+
* const memwal = MemWal.create({ key: delegate.privateKey, accountId: account.accountId })
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
import type { CreateAccountOpts, CreateAccountResult, AddDelegateKeyOpts, AddDelegateKeyResult, RemoveDelegateKeyOpts } from "./types.js";
|
|
35
|
+
/**
|
|
36
|
+
* Create a new MemWalAccount on-chain.
|
|
37
|
+
*
|
|
38
|
+
* Calls `{packageId}::account::create_account(registry, clock)`.
|
|
39
|
+
* Each address can only create ONE account (enforced by the contract).
|
|
40
|
+
*
|
|
41
|
+
* @returns CreateAccountResult with accountId, owner, and tx digest
|
|
42
|
+
*/
|
|
43
|
+
export declare function createAccount(opts: CreateAccountOpts): Promise<CreateAccountResult>;
|
|
44
|
+
/**
|
|
45
|
+
* Add a delegate key to a MemWalAccount.
|
|
46
|
+
*
|
|
47
|
+
* Calls `{packageId}::account::add_delegate_key(account, public_key, sui_address, label, clock)`.
|
|
48
|
+
* Only the account owner can add delegate keys.
|
|
49
|
+
*
|
|
50
|
+
* @param opts.publicKey - Ed25519 public key (32 bytes Uint8Array or hex string)
|
|
51
|
+
* @param opts.label - Human-readable label (e.g. "MacBook Pro", "Production Server")
|
|
52
|
+
* @returns AddDelegateKeyResult with digest, publicKey hex, and derived suiAddress
|
|
53
|
+
*/
|
|
54
|
+
export declare function addDelegateKey(opts: AddDelegateKeyOpts): Promise<AddDelegateKeyResult>;
|
|
55
|
+
/**
|
|
56
|
+
* Remove a delegate key from a MemWalAccount.
|
|
57
|
+
*
|
|
58
|
+
* Calls `{packageId}::account::remove_delegate_key(account, public_key)`.
|
|
59
|
+
* Only the account owner can remove delegate keys.
|
|
60
|
+
*
|
|
61
|
+
* @param opts.publicKey - Ed25519 public key to remove (32 bytes Uint8Array or hex string)
|
|
62
|
+
*/
|
|
63
|
+
export declare function removeDelegateKey(opts: RemoveDelegateKeyOpts): Promise<{
|
|
64
|
+
digest: string;
|
|
65
|
+
}>;
|
|
66
|
+
/**
|
|
67
|
+
* Generate a new Ed25519 delegate keypair.
|
|
68
|
+
*
|
|
69
|
+
* Returns the private key (hex), public key (bytes), and derived Sui address.
|
|
70
|
+
* The private key can be used with `MemWal.create({ key })`.
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```typescript
|
|
74
|
+
* const delegate = await generateDelegateKey()
|
|
75
|
+
* console.log(delegate.privateKey) // hex string — store securely!
|
|
76
|
+
* console.log(delegate.suiAddress) // 0x... — use in addDelegateKey
|
|
77
|
+
*
|
|
78
|
+
* // Use with SDK
|
|
79
|
+
* const memwal = MemWal.create({ key: delegate.privateKey, accountId: "0x..." })
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
export declare function generateDelegateKey(): Promise<{
|
|
83
|
+
privateKey: string;
|
|
84
|
+
publicKey: Uint8Array;
|
|
85
|
+
suiAddress: string;
|
|
86
|
+
}>;
|
|
87
|
+
//# sourceMappingURL=account.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../src/account.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAER,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACxB,MAAM,YAAY,CAAC;AA4GpB;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAC/B,IAAI,EAAE,iBAAiB,GACxB,OAAO,CAAC,mBAAmB,CAAC,CA4C9B;AAMD;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAChC,IAAI,EAAE,kBAAkB,GACzB,OAAO,CAAC,oBAAoB,CAAC,CAyC/B;AAMD;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACnC,IAAI,EAAE,qBAAqB,GAC5B,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAwB7B;AAMD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,UAAU,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACtB,CAAC,CAqBD"}
|
package/dist/account.js
ADDED
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* memwal — Account Management
|
|
3
|
+
*
|
|
4
|
+
* On-chain account operations: create account, add/remove delegate keys.
|
|
5
|
+
* Supports both wallet signing (browser) and private key signing (server-side).
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { createAccount, addDelegateKey, generateDelegateKey } from "@mysten-incubation/memwal/account"
|
|
10
|
+
*
|
|
11
|
+
* // Generate a delegate keypair
|
|
12
|
+
* const delegate = await generateDelegateKey()
|
|
13
|
+
*
|
|
14
|
+
* // Create account (wallet mode — browser)
|
|
15
|
+
* const account = await createAccount({
|
|
16
|
+
* packageId: "0x...",
|
|
17
|
+
* registryId: "0x...",
|
|
18
|
+
* walletSigner,
|
|
19
|
+
* })
|
|
20
|
+
*
|
|
21
|
+
* // Add the delegate key
|
|
22
|
+
* await addDelegateKey({
|
|
23
|
+
* packageId: "0x...",
|
|
24
|
+
* accountId: account.accountId,
|
|
25
|
+
* publicKey: delegate.publicKey,
|
|
26
|
+
* label: "My Laptop",
|
|
27
|
+
* walletSigner,
|
|
28
|
+
* })
|
|
29
|
+
*
|
|
30
|
+
* // Now use the delegate key with the SDK
|
|
31
|
+
* const memwal = MemWal.create({ key: delegate.privateKey, accountId: account.accountId })
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
import { bytesToHex, hexToBytes } from "./utils.js";
|
|
35
|
+
// ============================================================
|
|
36
|
+
// SUI Clock object (shared, always 0x6)
|
|
37
|
+
// ============================================================
|
|
38
|
+
const SUI_CLOCK = "0x0000000000000000000000000000000000000000000000000000000000000006";
|
|
39
|
+
async function buildTxContext(opts) {
|
|
40
|
+
if (!opts.suiPrivateKey && !opts.walletSigner) {
|
|
41
|
+
throw new Error("Provide either suiPrivateKey or walletSigner");
|
|
42
|
+
}
|
|
43
|
+
if (opts.suiPrivateKey && opts.walletSigner) {
|
|
44
|
+
throw new Error("Provide suiPrivateKey OR walletSigner, not both");
|
|
45
|
+
}
|
|
46
|
+
const { Transaction } = await import("@mysten/sui/transactions");
|
|
47
|
+
// Build Sui client
|
|
48
|
+
let suiClient;
|
|
49
|
+
if (opts.suiClient) {
|
|
50
|
+
suiClient = opts.suiClient;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
const mod = await import("@mysten/sui/client");
|
|
54
|
+
const SuiClient = mod.SuiClient;
|
|
55
|
+
if (typeof SuiClient !== "function") {
|
|
56
|
+
throw new Error("SuiClient not found. For @mysten/sui v2.6.0+, pass suiClient in opts.");
|
|
57
|
+
}
|
|
58
|
+
const network = opts.suiNetwork ?? "mainnet";
|
|
59
|
+
const urls = {
|
|
60
|
+
testnet: "https://fullnode.testnet.sui.io:443",
|
|
61
|
+
mainnet: "https://fullnode.mainnet.sui.io:443",
|
|
62
|
+
};
|
|
63
|
+
suiClient = new SuiClient({ url: urls[network] ?? urls.mainnet });
|
|
64
|
+
}
|
|
65
|
+
// Build signer
|
|
66
|
+
if (opts.walletSigner) {
|
|
67
|
+
return {
|
|
68
|
+
suiClient,
|
|
69
|
+
signer: opts.walletSigner,
|
|
70
|
+
address: opts.walletSigner.address,
|
|
71
|
+
Transaction,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const { decodeSuiPrivateKey } = await import("@mysten/sui/cryptography");
|
|
75
|
+
const { Ed25519Keypair } = await import("@mysten/sui/keypairs/ed25519");
|
|
76
|
+
const { secretKey } = decodeSuiPrivateKey(opts.suiPrivateKey);
|
|
77
|
+
const keypair = Ed25519Keypair.fromSecretKey(secretKey);
|
|
78
|
+
return {
|
|
79
|
+
suiClient,
|
|
80
|
+
signer: keypair,
|
|
81
|
+
address: keypair.getPublicKey().toSuiAddress(),
|
|
82
|
+
Transaction,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
async function signAndExecute(ctx, tx) {
|
|
86
|
+
if ("signAndExecuteTransaction" in ctx.signer && typeof ctx.signer.signAndExecuteTransaction === "function" && "address" in ctx.signer) {
|
|
87
|
+
// WalletSigner mode
|
|
88
|
+
const result = await ctx.signer.signAndExecuteTransaction({ transaction: tx });
|
|
89
|
+
// Wait for transaction to be confirmed
|
|
90
|
+
const txResult = await ctx.suiClient.waitForTransaction({
|
|
91
|
+
digest: result.digest,
|
|
92
|
+
options: { showEffects: true, showObjectChanges: true },
|
|
93
|
+
});
|
|
94
|
+
return { digest: result.digest, effects: txResult };
|
|
95
|
+
}
|
|
96
|
+
// Keypair mode
|
|
97
|
+
const result = await ctx.suiClient.signAndExecuteTransaction({
|
|
98
|
+
signer: ctx.signer,
|
|
99
|
+
transaction: tx,
|
|
100
|
+
});
|
|
101
|
+
const txResult = await ctx.suiClient.waitForTransaction({
|
|
102
|
+
digest: result.digest,
|
|
103
|
+
options: { showEffects: true, showObjectChanges: true },
|
|
104
|
+
});
|
|
105
|
+
return { digest: result.digest, effects: txResult };
|
|
106
|
+
}
|
|
107
|
+
// ============================================================
|
|
108
|
+
// createAccount
|
|
109
|
+
// ============================================================
|
|
110
|
+
/**
|
|
111
|
+
* Create a new MemWalAccount on-chain.
|
|
112
|
+
*
|
|
113
|
+
* Calls `{packageId}::account::create_account(registry, clock)`.
|
|
114
|
+
* Each address can only create ONE account (enforced by the contract).
|
|
115
|
+
*
|
|
116
|
+
* @returns CreateAccountResult with accountId, owner, and tx digest
|
|
117
|
+
*/
|
|
118
|
+
export async function createAccount(opts) {
|
|
119
|
+
const ctx = await buildTxContext(opts);
|
|
120
|
+
const { Transaction } = ctx;
|
|
121
|
+
const tx = new Transaction();
|
|
122
|
+
tx.moveCall({
|
|
123
|
+
target: `${opts.packageId}::account::create_account`,
|
|
124
|
+
arguments: [
|
|
125
|
+
tx.object(opts.registryId),
|
|
126
|
+
tx.object(SUI_CLOCK),
|
|
127
|
+
],
|
|
128
|
+
});
|
|
129
|
+
const { digest, effects } = await signAndExecute(ctx, tx);
|
|
130
|
+
// Extract the created MemWalAccount object ID from object changes
|
|
131
|
+
let accountId = "";
|
|
132
|
+
const objectChanges = effects?.objectChanges ?? [];
|
|
133
|
+
for (const change of objectChanges) {
|
|
134
|
+
if (change.type === "created" &&
|
|
135
|
+
change.objectType?.includes("::account::MemWalAccount")) {
|
|
136
|
+
accountId = change.objectId;
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (!accountId) {
|
|
141
|
+
// Fallback: try to find from effects
|
|
142
|
+
const created = effects?.effects?.created ?? [];
|
|
143
|
+
for (const obj of created) {
|
|
144
|
+
if (obj.owner?.Shared !== undefined) {
|
|
145
|
+
accountId = obj.reference?.objectId ?? "";
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
accountId,
|
|
152
|
+
owner: ctx.address,
|
|
153
|
+
digest,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
// ============================================================
|
|
157
|
+
// addDelegateKey
|
|
158
|
+
// ============================================================
|
|
159
|
+
/**
|
|
160
|
+
* Add a delegate key to a MemWalAccount.
|
|
161
|
+
*
|
|
162
|
+
* Calls `{packageId}::account::add_delegate_key(account, public_key, sui_address, label, clock)`.
|
|
163
|
+
* Only the account owner can add delegate keys.
|
|
164
|
+
*
|
|
165
|
+
* @param opts.publicKey - Ed25519 public key (32 bytes Uint8Array or hex string)
|
|
166
|
+
* @param opts.label - Human-readable label (e.g. "MacBook Pro", "Production Server")
|
|
167
|
+
* @returns AddDelegateKeyResult with digest, publicKey hex, and derived suiAddress
|
|
168
|
+
*/
|
|
169
|
+
export async function addDelegateKey(opts) {
|
|
170
|
+
const ctx = await buildTxContext(opts);
|
|
171
|
+
const { Transaction } = ctx;
|
|
172
|
+
// Normalize public key to Uint8Array
|
|
173
|
+
const pkBytes = typeof opts.publicKey === "string"
|
|
174
|
+
? hexToBytes(opts.publicKey)
|
|
175
|
+
: opts.publicKey;
|
|
176
|
+
if (pkBytes.length !== 32) {
|
|
177
|
+
throw new Error(`Invalid Ed25519 public key length: ${pkBytes.length} (expected 32)`);
|
|
178
|
+
}
|
|
179
|
+
// Derive Sui address from the public key
|
|
180
|
+
const { blake2b } = await import("@noble/hashes/blake2.js");
|
|
181
|
+
const input = new Uint8Array(33);
|
|
182
|
+
input[0] = 0x00; // Ed25519 scheme flag
|
|
183
|
+
input.set(pkBytes, 1);
|
|
184
|
+
const addressBytes = blake2b(input, { dkLen: 32 });
|
|
185
|
+
const suiAddress = "0x" + bytesToHex(addressBytes);
|
|
186
|
+
const tx = new Transaction();
|
|
187
|
+
tx.moveCall({
|
|
188
|
+
target: `${opts.packageId}::account::add_delegate_key`,
|
|
189
|
+
arguments: [
|
|
190
|
+
tx.object(opts.accountId),
|
|
191
|
+
tx.pure("vector<u8>", Array.from(pkBytes)),
|
|
192
|
+
tx.pure("address", suiAddress),
|
|
193
|
+
tx.pure("string", opts.label),
|
|
194
|
+
tx.object(SUI_CLOCK),
|
|
195
|
+
],
|
|
196
|
+
});
|
|
197
|
+
const { digest } = await signAndExecute(ctx, tx);
|
|
198
|
+
return {
|
|
199
|
+
digest,
|
|
200
|
+
publicKey: bytesToHex(pkBytes),
|
|
201
|
+
suiAddress,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
// ============================================================
|
|
205
|
+
// removeDelegateKey
|
|
206
|
+
// ============================================================
|
|
207
|
+
/**
|
|
208
|
+
* Remove a delegate key from a MemWalAccount.
|
|
209
|
+
*
|
|
210
|
+
* Calls `{packageId}::account::remove_delegate_key(account, public_key)`.
|
|
211
|
+
* Only the account owner can remove delegate keys.
|
|
212
|
+
*
|
|
213
|
+
* @param opts.publicKey - Ed25519 public key to remove (32 bytes Uint8Array or hex string)
|
|
214
|
+
*/
|
|
215
|
+
export async function removeDelegateKey(opts) {
|
|
216
|
+
const ctx = await buildTxContext(opts);
|
|
217
|
+
const { Transaction } = ctx;
|
|
218
|
+
const pkBytes = typeof opts.publicKey === "string"
|
|
219
|
+
? hexToBytes(opts.publicKey)
|
|
220
|
+
: opts.publicKey;
|
|
221
|
+
if (pkBytes.length !== 32) {
|
|
222
|
+
throw new Error(`Invalid Ed25519 public key length: ${pkBytes.length} (expected 32)`);
|
|
223
|
+
}
|
|
224
|
+
const tx = new Transaction();
|
|
225
|
+
tx.moveCall({
|
|
226
|
+
target: `${opts.packageId}::account::remove_delegate_key`,
|
|
227
|
+
arguments: [
|
|
228
|
+
tx.object(opts.accountId),
|
|
229
|
+
tx.pure("vector<u8>", Array.from(pkBytes)),
|
|
230
|
+
],
|
|
231
|
+
});
|
|
232
|
+
const { digest } = await signAndExecute(ctx, tx);
|
|
233
|
+
return { digest };
|
|
234
|
+
}
|
|
235
|
+
// ============================================================
|
|
236
|
+
// generateDelegateKey
|
|
237
|
+
// ============================================================
|
|
238
|
+
/**
|
|
239
|
+
* Generate a new Ed25519 delegate keypair.
|
|
240
|
+
*
|
|
241
|
+
* Returns the private key (hex), public key (bytes), and derived Sui address.
|
|
242
|
+
* The private key can be used with `MemWal.create({ key })`.
|
|
243
|
+
*
|
|
244
|
+
* @example
|
|
245
|
+
* ```typescript
|
|
246
|
+
* const delegate = await generateDelegateKey()
|
|
247
|
+
* console.log(delegate.privateKey) // hex string — store securely!
|
|
248
|
+
* console.log(delegate.suiAddress) // 0x... — use in addDelegateKey
|
|
249
|
+
*
|
|
250
|
+
* // Use with SDK
|
|
251
|
+
* const memwal = MemWal.create({ key: delegate.privateKey, accountId: "0x..." })
|
|
252
|
+
* ```
|
|
253
|
+
*/
|
|
254
|
+
export async function generateDelegateKey() {
|
|
255
|
+
const ed = await import("@noble/ed25519");
|
|
256
|
+
const { blake2b } = await import("@noble/hashes/blake2.js");
|
|
257
|
+
// Generate random 32-byte private key
|
|
258
|
+
const privateKeyBytes = new Uint8Array(32);
|
|
259
|
+
globalThis.crypto.getRandomValues(privateKeyBytes);
|
|
260
|
+
const publicKey = await ed.getPublicKeyAsync(privateKeyBytes);
|
|
261
|
+
// Derive Sui address
|
|
262
|
+
const input = new Uint8Array(33);
|
|
263
|
+
input[0] = 0x00; // Ed25519 scheme flag
|
|
264
|
+
input.set(publicKey, 1);
|
|
265
|
+
const addressBytes = blake2b(input, { dkLen: 32 });
|
|
266
|
+
const suiAddress = "0x" + bytesToHex(addressBytes);
|
|
267
|
+
return {
|
|
268
|
+
privateKey: bytesToHex(privateKeyBytes),
|
|
269
|
+
publicKey,
|
|
270
|
+
suiAddress,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=account.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account.js","sourceRoot":"","sources":["../src/account.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/ai/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MemWal AI SDK Integration — withMemWal Middleware
|
|
3
|
+
*
|
|
4
|
+
* Wraps any AI SDK model with automatic memory management.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import { generateText } from "ai"
|
|
9
|
+
* import { withMemWal } from "@mysten-incubation/memwal/ai"
|
|
10
|
+
* import { openai } from "@ai-sdk/openai"
|
|
11
|
+
*
|
|
12
|
+
* const model = withMemWal(openai("gpt-4o"), {
|
|
13
|
+
* key: process.env.MEMWAL_KEY, // Ed25519 delegate key (hex)
|
|
14
|
+
* })
|
|
15
|
+
*
|
|
16
|
+
* const result = await generateText({
|
|
17
|
+
* model,
|
|
18
|
+
* messages: [{ role: "user", content: "What do you know about me?" }]
|
|
19
|
+
* })
|
|
20
|
+
* // → Automatically searches memories, injects context, saves new facts
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
import type { MemWalConfig } from "../types.js";
|
|
24
|
+
/**
|
|
25
|
+
* Accept both LanguageModelV2 (ai SDK v4/v5) and LanguageModelV3 (ai SDK v6+).
|
|
26
|
+
* We use `any` because LanguageModelV3 may not exist in older @ai-sdk/provider,
|
|
27
|
+
* and the two interfaces are structurally incompatible at the type level.
|
|
28
|
+
* `wrapLanguageModel` from `ai` handles version detection internally.
|
|
29
|
+
*/
|
|
30
|
+
type AnyLanguageModel = any;
|
|
31
|
+
export interface WithMemWalOptions extends MemWalConfig {
|
|
32
|
+
/** Max memories to inject per request (default: 5) */
|
|
33
|
+
maxMemories?: number;
|
|
34
|
+
/** Auto-save new facts from conversation (default: true) */
|
|
35
|
+
autoSave?: boolean;
|
|
36
|
+
/** Minimum similarity score to include a memory (0-1, default: 0.3) */
|
|
37
|
+
minRelevance?: number;
|
|
38
|
+
/** Enable debug logging (default: false) */
|
|
39
|
+
debug?: boolean;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Wrap an AI SDK model with MemWal memory management
|
|
43
|
+
*
|
|
44
|
+
* BEFORE each LLM call:
|
|
45
|
+
* - Uses the last user message as a search query
|
|
46
|
+
* - Recalls relevant memories (server: search → download → decrypt)
|
|
47
|
+
* - Injects relevant memories into the system prompt
|
|
48
|
+
*
|
|
49
|
+
* AFTER each LLM call:
|
|
50
|
+
* - Analyzes and saves important facts (server: LLM extract → embed → encrypt → Walrus → store)
|
|
51
|
+
* - Fire-and-forget — does not block the response
|
|
52
|
+
*/
|
|
53
|
+
export declare function withMemWal(model: AnyLanguageModel, options: WithMemWalOptions): any;
|
|
54
|
+
export {};
|
|
55
|
+
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/ai/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,aAAa,CAAC;AAM9D;;;;;GAKG;AAEH,KAAK,gBAAgB,GAAG,GAAG,CAAC;AAE5B,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACnD,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CACtB,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,iBAAiB,OAmF7B"}
|