@xona-labs/xpay 0.1.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/LICENSE +21 -0
- package/README.md +226 -0
- package/dist/cli/accounts.d.ts +13 -0
- package/dist/cli/accounts.d.ts.map +1 -0
- package/dist/cli/accounts.js +66 -0
- package/dist/cli/accounts.js.map +1 -0
- package/dist/cli/balance.d.ts +14 -0
- package/dist/cli/balance.d.ts.map +1 -0
- package/dist/cli/balance.js +60 -0
- package/dist/cli/balance.js.map +1 -0
- package/dist/cli/common.d.ts +20 -0
- package/dist/cli/common.d.ts.map +1 -0
- package/dist/cli/common.js +58 -0
- package/dist/cli/common.js.map +1 -0
- package/dist/cli/discover.d.ts +12 -0
- package/dist/cli/discover.d.ts.map +1 -0
- package/dist/cli/discover.js +69 -0
- package/dist/cli/discover.js.map +1 -0
- package/dist/cli/guardrail.d.ts +16 -0
- package/dist/cli/guardrail.d.ts.map +1 -0
- package/dist/cli/guardrail.js +71 -0
- package/dist/cli/guardrail.js.map +1 -0
- package/dist/cli/history.d.ts +16 -0
- package/dist/cli/history.d.ts.map +1 -0
- package/dist/cli/history.js +59 -0
- package/dist/cli/history.js.map +1 -0
- package/dist/cli/index.d.ts +17 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +165 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +23 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +114 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/mcp-server.d.ts +26 -0
- package/dist/cli/mcp-server.d.ts.map +1 -0
- package/dist/cli/mcp-server.js +112 -0
- package/dist/cli/mcp-server.js.map +1 -0
- package/dist/cli/pay.d.ts +15 -0
- package/dist/cli/pay.d.ts.map +1 -0
- package/dist/cli/pay.js +76 -0
- package/dist/cli/pay.js.map +1 -0
- package/dist/cli/transfer.d.ts +19 -0
- package/dist/cli/transfer.d.ts.map +1 -0
- package/dist/cli/transfer.js +66 -0
- package/dist/cli/transfer.js.map +1 -0
- package/dist/discover/cache.d.ts +24 -0
- package/dist/discover/cache.d.ts.map +1 -0
- package/dist/discover/cache.js +94 -0
- package/dist/discover/cache.js.map +1 -0
- package/dist/discover/index.d.ts +21 -0
- package/dist/discover/index.d.ts.map +1 -0
- package/dist/discover/index.js +88 -0
- package/dist/discover/index.js.map +1 -0
- package/dist/discover/payai.d.ts +18 -0
- package/dist/discover/payai.d.ts.map +1 -0
- package/dist/discover/payai.js +56 -0
- package/dist/discover/payai.js.map +1 -0
- package/dist/do/index.d.ts +17 -0
- package/dist/do/index.d.ts.map +1 -0
- package/dist/do/index.js +32 -0
- package/dist/do/index.js.map +1 -0
- package/dist/guardrail/index.d.ts +47 -0
- package/dist/guardrail/index.d.ts.map +1 -0
- package/dist/guardrail/index.js +99 -0
- package/dist/guardrail/index.js.map +1 -0
- package/dist/history/evm.d.ts +21 -0
- package/dist/history/evm.d.ts.map +1 -0
- package/dist/history/evm.js +118 -0
- package/dist/history/evm.js.map +1 -0
- package/dist/history/index.d.ts +19 -0
- package/dist/history/index.d.ts.map +1 -0
- package/dist/history/index.js +45 -0
- package/dist/history/index.js.map +1 -0
- package/dist/history/solana.d.ts +20 -0
- package/dist/history/solana.d.ts.map +1 -0
- package/dist/history/solana.js +97 -0
- package/dist/history/solana.js.map +1 -0
- package/dist/history/types.d.ts +26 -0
- package/dist/history/types.d.ts.map +1 -0
- package/dist/history/types.js +10 -0
- package/dist/history/types.js.map +1 -0
- package/dist/index.d.ts +94 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +74 -0
- package/dist/index.js.map +1 -0
- package/dist/profile/derive.d.ts +28 -0
- package/dist/profile/derive.d.ts.map +1 -0
- package/dist/profile/derive.js +75 -0
- package/dist/profile/derive.js.map +1 -0
- package/dist/profile/index.d.ts +74 -0
- package/dist/profile/index.d.ts.map +1 -0
- package/dist/profile/index.js +115 -0
- package/dist/profile/index.js.map +1 -0
- package/dist/profile/storage.d.ts +35 -0
- package/dist/profile/storage.d.ts.map +1 -0
- package/dist/profile/storage.js +162 -0
- package/dist/profile/storage.js.map +1 -0
- package/dist/profile/types.d.ts +69 -0
- package/dist/profile/types.d.ts.map +1 -0
- package/dist/profile/types.js +9 -0
- package/dist/profile/types.js.map +1 -0
- package/dist/signers/index.d.ts +5 -0
- package/dist/signers/index.d.ts.map +1 -0
- package/dist/signers/index.js +5 -0
- package/dist/signers/index.js.map +1 -0
- package/dist/signers/phantom.d.ts +14 -0
- package/dist/signers/phantom.d.ts.map +1 -0
- package/dist/signers/phantom.js +12 -0
- package/dist/signers/phantom.js.map +1 -0
- package/dist/signers/privy.d.ts +20 -0
- package/dist/signers/privy.d.ts.map +1 -0
- package/dist/signers/privy.js +15 -0
- package/dist/signers/privy.js.map +1 -0
- package/dist/signers/raw-evm.d.ts +15 -0
- package/dist/signers/raw-evm.d.ts.map +1 -0
- package/dist/signers/raw-evm.js +70 -0
- package/dist/signers/raw-evm.js.map +1 -0
- package/dist/signers/raw-solana.d.ts +15 -0
- package/dist/signers/raw-solana.d.ts.map +1 -0
- package/dist/signers/raw-solana.js +88 -0
- package/dist/signers/raw-solana.js.map +1 -0
- package/dist/tools/index.d.ts +48 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +164 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/transfer/index.d.ts +30 -0
- package/dist/transfer/index.d.ts.map +1 -0
- package/dist/transfer/index.js +86 -0
- package/dist/transfer/index.js.map +1 -0
- package/dist/types.d.ts +203 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +56 -0
- package/dist/types.js.map +1 -0
- package/dist/use/index.d.ts +38 -0
- package/dist/use/index.d.ts.map +1 -0
- package/dist/use/index.js +173 -0
- package/dist/use/index.js.map +1 -0
- package/dist/wallet/index.d.ts +31 -0
- package/dist/wallet/index.d.ts.map +1 -0
- package/dist/wallet/index.js +56 -0
- package/dist/wallet/index.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Profile storage — read/write `wallet.json` + `config.json` under
|
|
3
|
+
* `~/.xpay/<name>/` (or a workspace path) with passphrase-based encryption.
|
|
4
|
+
*
|
|
5
|
+
* Encryption uses Node's built-in crypto (no new deps): scrypt → AES-256-GCM
|
|
6
|
+
* over the mnemonic. AES-GCM gives us authenticated encryption so we detect
|
|
7
|
+
* wrong passphrases / tampering instead of returning garbage.
|
|
8
|
+
*/
|
|
9
|
+
import { homedir } from "node:os";
|
|
10
|
+
import { join, resolve } from "node:path";
|
|
11
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, chmodSync, statSync } from "node:fs";
|
|
12
|
+
import { randomBytes, scryptSync, createCipheriv, createDecipheriv } from "node:crypto";
|
|
13
|
+
const SCRYPT_N = 1 << 15; // 32768 — sane default, tunable.
|
|
14
|
+
const SCRYPT_R = 8;
|
|
15
|
+
const SCRYPT_P = 1;
|
|
16
|
+
const KEY_LEN = 32;
|
|
17
|
+
/** Root directory holding all profiles. Honors $XPAY_HOME. */
|
|
18
|
+
export function xpayHome() {
|
|
19
|
+
return process.env.XPAY_HOME ?? join(homedir(), ".xpay");
|
|
20
|
+
}
|
|
21
|
+
/** Workspace-local profile dir (when `--workspace` is passed). */
|
|
22
|
+
export function workspaceXpayDir(cwd = process.cwd()) {
|
|
23
|
+
return join(resolve(cwd), ".xpay");
|
|
24
|
+
}
|
|
25
|
+
export function profilePath(name, opts = {}) {
|
|
26
|
+
const root = opts.workspace
|
|
27
|
+
? typeof opts.workspace === "string"
|
|
28
|
+
? workspaceXpayDir(opts.workspace)
|
|
29
|
+
: workspaceXpayDir()
|
|
30
|
+
: xpayHome();
|
|
31
|
+
return join(root, name);
|
|
32
|
+
}
|
|
33
|
+
export function profileExists(name, opts = {}) {
|
|
34
|
+
return existsSync(join(profilePath(name, opts), "wallet.json"));
|
|
35
|
+
}
|
|
36
|
+
export function listProfiles(opts = {}) {
|
|
37
|
+
const root = opts.workspace
|
|
38
|
+
? typeof opts.workspace === "string"
|
|
39
|
+
? workspaceXpayDir(opts.workspace)
|
|
40
|
+
: workspaceXpayDir()
|
|
41
|
+
: xpayHome();
|
|
42
|
+
if (!existsSync(root))
|
|
43
|
+
return [];
|
|
44
|
+
return readdirSync(root).filter((name) => {
|
|
45
|
+
try {
|
|
46
|
+
return statSync(join(root, name)).isDirectory() && existsSync(join(root, name, "wallet.json"));
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
// -----------------------------------------------------------------------------
|
|
54
|
+
// Encryption
|
|
55
|
+
// -----------------------------------------------------------------------------
|
|
56
|
+
function encryptMnemonic(mnemonic, passphrase) {
|
|
57
|
+
const salt = randomBytes(16);
|
|
58
|
+
const key = scryptSync(passphrase, salt, KEY_LEN, {
|
|
59
|
+
N: SCRYPT_N,
|
|
60
|
+
r: SCRYPT_R,
|
|
61
|
+
p: SCRYPT_P,
|
|
62
|
+
maxmem: 64 * 1024 * 1024,
|
|
63
|
+
});
|
|
64
|
+
const iv = randomBytes(12);
|
|
65
|
+
const cipher = createCipheriv("aes-256-gcm", key, iv);
|
|
66
|
+
const ciphertext = Buffer.concat([cipher.update(mnemonic, "utf8"), cipher.final()]);
|
|
67
|
+
const authTag = cipher.getAuthTag();
|
|
68
|
+
return {
|
|
69
|
+
cipher: "aes-256-gcm",
|
|
70
|
+
kdf: { name: "scrypt", salt: salt.toString("hex"), N: SCRYPT_N, r: SCRYPT_R, p: SCRYPT_P },
|
|
71
|
+
iv: iv.toString("hex"),
|
|
72
|
+
ciphertext: ciphertext.toString("hex"),
|
|
73
|
+
authTag: authTag.toString("hex"),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function decryptMnemonic(payload, passphrase) {
|
|
77
|
+
const salt = Buffer.from(payload.kdf.salt, "hex");
|
|
78
|
+
const key = scryptSync(passphrase, salt, KEY_LEN, {
|
|
79
|
+
N: payload.kdf.N,
|
|
80
|
+
r: payload.kdf.r,
|
|
81
|
+
p: payload.kdf.p,
|
|
82
|
+
maxmem: 64 * 1024 * 1024,
|
|
83
|
+
});
|
|
84
|
+
const iv = Buffer.from(payload.iv, "hex");
|
|
85
|
+
const decipher = createDecipheriv("aes-256-gcm", key, iv);
|
|
86
|
+
decipher.setAuthTag(Buffer.from(payload.authTag, "hex"));
|
|
87
|
+
try {
|
|
88
|
+
const plain = Buffer.concat([
|
|
89
|
+
decipher.update(Buffer.from(payload.ciphertext, "hex")),
|
|
90
|
+
decipher.final(),
|
|
91
|
+
]);
|
|
92
|
+
return plain.toString("utf8");
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
throw new Error("Wrong passphrase, or wallet file is corrupted/tampered");
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// -----------------------------------------------------------------------------
|
|
99
|
+
// Read / write
|
|
100
|
+
// -----------------------------------------------------------------------------
|
|
101
|
+
export function writeWalletFile(dir, wallet) {
|
|
102
|
+
ensureDir(dir);
|
|
103
|
+
const file = join(dir, "wallet.json");
|
|
104
|
+
writeFileSync(file, JSON.stringify(wallet, null, 2));
|
|
105
|
+
// 0600 — readable only by the owner.
|
|
106
|
+
try {
|
|
107
|
+
chmodSync(file, 0o600);
|
|
108
|
+
}
|
|
109
|
+
catch { /* not POSIX */ }
|
|
110
|
+
}
|
|
111
|
+
export function readWalletFile(dir) {
|
|
112
|
+
const file = join(dir, "wallet.json");
|
|
113
|
+
if (!existsSync(file)) {
|
|
114
|
+
throw new Error(`No wallet at ${file}. Run \`xpay init\` first.`);
|
|
115
|
+
}
|
|
116
|
+
return JSON.parse(readFileSync(file, "utf8"));
|
|
117
|
+
}
|
|
118
|
+
export function writeConfigFile(dir, config) {
|
|
119
|
+
ensureDir(dir);
|
|
120
|
+
writeFileSync(join(dir, "config.json"), JSON.stringify(config, null, 2));
|
|
121
|
+
}
|
|
122
|
+
export function readConfigFile(dir) {
|
|
123
|
+
const file = join(dir, "config.json");
|
|
124
|
+
if (!existsSync(file))
|
|
125
|
+
return defaultConfig();
|
|
126
|
+
return JSON.parse(readFileSync(file, "utf8"));
|
|
127
|
+
}
|
|
128
|
+
export function defaultConfig() {
|
|
129
|
+
return {
|
|
130
|
+
version: 1,
|
|
131
|
+
networks: ["solana", "base"],
|
|
132
|
+
defaultNetwork: "solana",
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
function ensureDir(dir) {
|
|
136
|
+
if (!existsSync(dir))
|
|
137
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
138
|
+
}
|
|
139
|
+
export function buildWalletFile(input) {
|
|
140
|
+
const base = {
|
|
141
|
+
version: 1,
|
|
142
|
+
createdAt: new Date().toISOString(),
|
|
143
|
+
addresses: input.addresses,
|
|
144
|
+
};
|
|
145
|
+
if (input.passphrase && input.passphrase.length > 0) {
|
|
146
|
+
base.encrypted = encryptMnemonic(input.mnemonic, input.passphrase);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
base.mnemonic = input.mnemonic;
|
|
150
|
+
}
|
|
151
|
+
return base;
|
|
152
|
+
}
|
|
153
|
+
export function unlockWalletFile(wallet, passphrase) {
|
|
154
|
+
if (wallet.mnemonic)
|
|
155
|
+
return wallet.mnemonic; // unencrypted
|
|
156
|
+
if (!wallet.encrypted)
|
|
157
|
+
throw new Error("Wallet file has neither mnemonic nor encrypted payload");
|
|
158
|
+
if (!passphrase)
|
|
159
|
+
throw new Error("Wallet is encrypted — passphrase required");
|
|
160
|
+
return decryptMnemonic(wallet.encrypted, passphrase);
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/profile/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Profile types. A profile is a named set of keys + config persisted under
|
|
3
|
+
* `~/.xpay/<name>/` (or `<workspace>/.xpay/<name>/` when workspace-local).
|
|
4
|
+
*
|
|
5
|
+
* One mnemonic derives both Solana and EVM keys — standard BIP-39 + BIP-44
|
|
6
|
+
* paths so the keys are recoverable in Phantom, MetaMask, Solflare, etc.
|
|
7
|
+
*/
|
|
8
|
+
export interface ProfileAddresses {
|
|
9
|
+
/** Base58 Solana public key. */
|
|
10
|
+
solana: string;
|
|
11
|
+
/** 0x-prefixed EVM address (same address on every EVM chain). */
|
|
12
|
+
evm: string;
|
|
13
|
+
}
|
|
14
|
+
/** Shape persisted on disk (`wallet.json`). */
|
|
15
|
+
export interface WalletFile {
|
|
16
|
+
version: 1;
|
|
17
|
+
createdAt: string;
|
|
18
|
+
addresses: ProfileAddresses;
|
|
19
|
+
/** When unencrypted (dev only), the mnemonic lives here in plaintext. */
|
|
20
|
+
mnemonic?: string;
|
|
21
|
+
/** When encrypted: scrypt-derived AES-256-GCM blob containing the mnemonic. */
|
|
22
|
+
encrypted?: {
|
|
23
|
+
cipher: "aes-256-gcm";
|
|
24
|
+
kdf: {
|
|
25
|
+
name: "scrypt";
|
|
26
|
+
salt: string;
|
|
27
|
+
N: number;
|
|
28
|
+
r: number;
|
|
29
|
+
p: number;
|
|
30
|
+
};
|
|
31
|
+
iv: string;
|
|
32
|
+
ciphertext: string;
|
|
33
|
+
authTag: string;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/** Shape persisted on disk (`config.json`). Hand-edited by users sometimes. */
|
|
37
|
+
export interface ProfileConfig {
|
|
38
|
+
version: 1;
|
|
39
|
+
/** Networks the profile is active on. */
|
|
40
|
+
networks: string[];
|
|
41
|
+
/** Default network for transfers / pay when not specified. */
|
|
42
|
+
defaultNetwork: string;
|
|
43
|
+
/** Per-network RPC overrides. Falls back to SDK defaults. */
|
|
44
|
+
rpcs?: Partial<Record<string, string>>;
|
|
45
|
+
/** Guardrail policy (mirrors GuardrailConfig but JSON-serializable). */
|
|
46
|
+
guardrail?: {
|
|
47
|
+
maxPerTx?: number;
|
|
48
|
+
maxPerDay?: number;
|
|
49
|
+
allowedHosts?: string[];
|
|
50
|
+
requireApprovalAbove?: number;
|
|
51
|
+
};
|
|
52
|
+
/** Linked API key for opt-in dashboard sync. */
|
|
53
|
+
link?: {
|
|
54
|
+
apiKey: string;
|
|
55
|
+
endpoint: string;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** Runtime handle returned by {@link initProfile}/{@link loadProfile}. */
|
|
59
|
+
export interface LoadedProfile {
|
|
60
|
+
/** Profile name (directory name under `~/.xpay/`). */
|
|
61
|
+
name: string;
|
|
62
|
+
/** Absolute path to the profile directory. */
|
|
63
|
+
path: string;
|
|
64
|
+
addresses: ProfileAddresses;
|
|
65
|
+
config: ProfileConfig;
|
|
66
|
+
/** Decoded mnemonic — only present while the process holds the unlocked profile. */
|
|
67
|
+
mnemonic: string;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/profile/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;CACb;AAED,+CAA+C;AAC/C,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,SAAS,CAAC,EAAE;QACV,MAAM,EAAE,aAAa,CAAC;QACtB,GAAG,EAAE;YAAE,IAAI,EAAE,QAAQ,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACvE,EAAE,EAAE,MAAM,CAAC;QACX,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,+EAA+E;AAC/E,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,yCAAyC;IACzC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,8DAA8D;IAC9D,cAAc,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACvC,wEAAwE;IACxE,SAAS,CAAC,EAAE;QACV,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;KAC/B,CAAC;IACF,gDAAgD;IAChD,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,0EAA0E;AAC1E,MAAM,WAAW,aAAa;IAC5B,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,gBAAgB,CAAC;IAC5B,MAAM,EAAE,aAAa,CAAC;IACtB,oFAAoF;IACpF,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Profile types. A profile is a named set of keys + config persisted under
|
|
3
|
+
* `~/.xpay/<name>/` (or `<workspace>/.xpay/<name>/` when workspace-local).
|
|
4
|
+
*
|
|
5
|
+
* One mnemonic derives both Solana and EVM keys — standard BIP-39 + BIP-44
|
|
6
|
+
* paths so the keys are recoverable in Phantom, MetaMask, Solflare, etc.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/profile/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/signers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/signers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phantom browser-wallet signer (stub).
|
|
3
|
+
*
|
|
4
|
+
* Real implementation requires the browser `window.solana` provider. This
|
|
5
|
+
* stub keeps the import surface stable and documents the contract; the
|
|
6
|
+
* implementation lands when xpay-react is added.
|
|
7
|
+
*/
|
|
8
|
+
import type { Signer } from "../types.js";
|
|
9
|
+
export interface PhantomSignerOptions {
|
|
10
|
+
/** Override the provider for tests. Defaults to `window.solana`. */
|
|
11
|
+
provider?: unknown;
|
|
12
|
+
}
|
|
13
|
+
export declare function phantomSigner(_opts?: PhantomSignerOptions): Signer;
|
|
14
|
+
//# sourceMappingURL=phantom.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phantom.d.ts","sourceRoot":"","sources":["../../src/signers/phantom.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,oBAAoB;IACnC,oEAAoE;IACpE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,aAAa,CAAC,KAAK,GAAE,oBAAyB,GAAG,MAAM,CAKtE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phantom browser-wallet signer (stub).
|
|
3
|
+
*
|
|
4
|
+
* Real implementation requires the browser `window.solana` provider. This
|
|
5
|
+
* stub keeps the import surface stable and documents the contract; the
|
|
6
|
+
* implementation lands when xpay-react is added.
|
|
7
|
+
*/
|
|
8
|
+
export function phantomSigner(_opts = {}) {
|
|
9
|
+
throw new Error("phantomSigner is not implemented yet. Use rawSolanaSigner for server-side use, " +
|
|
10
|
+
"or wait for @xona-labs/xpay-react which will ship a browser-ready Phantom adapter.");
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=phantom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phantom.js","sourceRoot":"","sources":["../../src/signers/phantom.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,MAAM,UAAU,aAAa,CAAC,QAA8B,EAAE;IAC5D,MAAM,IAAI,KAAK,CACb,iFAAiF;QAC/E,oFAAoF,CACvF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Privy signer adapter (stub).
|
|
3
|
+
*
|
|
4
|
+
* Privy is `@xona-labs/xpay`'s recommended production custody. The adapter
|
|
5
|
+
* accepts a Privy wallet client and exposes our {@link Signer} interface.
|
|
6
|
+
*
|
|
7
|
+
* Stubbed in v0 because the implementation depends on whether the consumer
|
|
8
|
+
* uses the React SDK (`@privy-io/react-auth`) or the Node SDK
|
|
9
|
+
* (`@privy-io/server-sdk`). The full implementation lands when we publish
|
|
10
|
+
* `@xona-labs/xpay-react` and a dedicated server adapter.
|
|
11
|
+
*/
|
|
12
|
+
import type { Signer } from "../types.js";
|
|
13
|
+
export interface PrivySignerOptions {
|
|
14
|
+
/** Privy wallet client (shape varies by SDK). */
|
|
15
|
+
wallet: unknown;
|
|
16
|
+
/** Network this signer is bound to. */
|
|
17
|
+
network: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function privySigner(_opts: PrivySignerOptions): Signer;
|
|
20
|
+
//# sourceMappingURL=privy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"privy.d.ts","sourceRoot":"","sources":["../../src/signers/privy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,kBAAkB;IACjC,iDAAiD;IACjD,MAAM,EAAE,OAAO,CAAC;IAChB,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAI7D"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Privy signer adapter (stub).
|
|
3
|
+
*
|
|
4
|
+
* Privy is `@xona-labs/xpay`'s recommended production custody. The adapter
|
|
5
|
+
* accepts a Privy wallet client and exposes our {@link Signer} interface.
|
|
6
|
+
*
|
|
7
|
+
* Stubbed in v0 because the implementation depends on whether the consumer
|
|
8
|
+
* uses the React SDK (`@privy-io/react-auth`) or the Node SDK
|
|
9
|
+
* (`@privy-io/server-sdk`). The full implementation lands when we publish
|
|
10
|
+
* `@xona-labs/xpay-react` and a dedicated server adapter.
|
|
11
|
+
*/
|
|
12
|
+
export function privySigner(_opts) {
|
|
13
|
+
throw new Error("privySigner is not implemented yet. Track progress in @xona-labs/xpay-react.");
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=privy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"privy.js","sourceRoot":"","sources":["../../src/signers/privy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAWH,MAAM,UAAU,WAAW,CAAC,KAAyB;IACnD,MAAM,IAAI,KAAK,CACb,8EAA8E,CAC/E,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Raw EVM signer — works for Base, Ethereum, Arbitrum, Optimism, and other
|
|
3
|
+
* EIP-155 chains. Holds a hex private key via `ethers.Wallet`.
|
|
4
|
+
*/
|
|
5
|
+
import type { Network, Signer } from "../types.js";
|
|
6
|
+
export interface RawEvmSignerOptions {
|
|
7
|
+
/** 0x-prefixed hex private key. */
|
|
8
|
+
privateKey: string;
|
|
9
|
+
/** Target network. Required so we know which RPC + chainId to use. */
|
|
10
|
+
network: Network;
|
|
11
|
+
/** Override the default RPC URL. */
|
|
12
|
+
rpcUrl?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function rawEvmSigner(opts: RawEvmSignerOptions): Signer;
|
|
15
|
+
//# sourceMappingURL=raw-evm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raw-evm.d.ts","sourceRoot":"","sources":["../../src/signers/raw-evm.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAsB,MAAM,EAAE,MAAM,aAAa,CAAC;AAuBvE,MAAM,WAAW,mBAAmB;IAClC,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,OAAO,EAAE,OAAO,CAAC;IACjB,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAgD9D"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Raw EVM signer — works for Base, Ethereum, Arbitrum, Optimism, and other
|
|
3
|
+
* EIP-155 chains. Holds a hex private key via `ethers.Wallet`.
|
|
4
|
+
*/
|
|
5
|
+
import { Contract, JsonRpcProvider, Wallet, getBytes, hashMessage } from "ethers";
|
|
6
|
+
/** Per-network USDC contract addresses. */
|
|
7
|
+
const USDC_CONTRACTS = {
|
|
8
|
+
base: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
|
|
9
|
+
ethereum: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
|
|
10
|
+
arbitrum: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
|
|
11
|
+
optimism: "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
|
|
12
|
+
};
|
|
13
|
+
const DEFAULT_RPCS = {
|
|
14
|
+
base: "https://mainnet.base.org",
|
|
15
|
+
ethereum: "https://eth.llamarpc.com",
|
|
16
|
+
arbitrum: "https://arb1.arbitrum.io/rpc",
|
|
17
|
+
optimism: "https://mainnet.optimism.io",
|
|
18
|
+
};
|
|
19
|
+
const ERC20_ABI = [
|
|
20
|
+
"function transfer(address to, uint256 amount) returns (bool)",
|
|
21
|
+
"function decimals() view returns (uint8)",
|
|
22
|
+
"function balanceOf(address owner) view returns (uint256)",
|
|
23
|
+
];
|
|
24
|
+
export function rawEvmSigner(opts) {
|
|
25
|
+
const rpc = opts.rpcUrl ?? DEFAULT_RPCS[opts.network];
|
|
26
|
+
if (!rpc) {
|
|
27
|
+
throw new Error(`rawEvmSigner: no default RPC for network "${opts.network}". Pass rpcUrl.`);
|
|
28
|
+
}
|
|
29
|
+
const provider = new JsonRpcProvider(rpc);
|
|
30
|
+
const wallet = new Wallet(opts.privateKey, provider);
|
|
31
|
+
return {
|
|
32
|
+
network: opts.network,
|
|
33
|
+
address: wallet.address,
|
|
34
|
+
async signMessage(message) {
|
|
35
|
+
const sig = await wallet.signMessage(getBytes(hashMessage(message)));
|
|
36
|
+
return getBytes(sig);
|
|
37
|
+
},
|
|
38
|
+
async balance() {
|
|
39
|
+
const usdc = USDC_CONTRACTS[opts.network];
|
|
40
|
+
if (!usdc)
|
|
41
|
+
return 0;
|
|
42
|
+
try {
|
|
43
|
+
const erc20 = new Contract(usdc, ERC20_ABI, provider);
|
|
44
|
+
const raw = (await erc20.balanceOf(wallet.address));
|
|
45
|
+
// USDC has 6 decimals on every supported chain.
|
|
46
|
+
return Number(raw) / 1_000_000;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return 0;
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
async pay(req) {
|
|
53
|
+
// Native ETH transfer (asset is the zero address).
|
|
54
|
+
if (req.asset === "0x0000000000000000000000000000000000000000") {
|
|
55
|
+
const tx = await wallet.sendTransaction({
|
|
56
|
+
to: req.payTo,
|
|
57
|
+
value: BigInt(req.amount ?? "0"),
|
|
58
|
+
});
|
|
59
|
+
const receipt = await tx.wait();
|
|
60
|
+
return receipt?.hash ?? tx.hash;
|
|
61
|
+
}
|
|
62
|
+
// ERC-20 transfer.
|
|
63
|
+
const erc20 = new Contract(req.asset, ERC20_ABI, wallet);
|
|
64
|
+
const tx = await erc20.transfer(req.payTo, BigInt(req.amount ?? "0"));
|
|
65
|
+
const receipt = await tx.wait();
|
|
66
|
+
return receipt?.hash ?? tx.hash;
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=raw-evm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raw-evm.js","sourceRoot":"","sources":["../../src/signers/raw-evm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Raw Solana signer — for tests, server-side agents, and other scenarios where
|
|
3
|
+
* you hold a Solana keypair directly.
|
|
4
|
+
*
|
|
5
|
+
* Production wallets should prefer Privy or Phantom signers.
|
|
6
|
+
*/
|
|
7
|
+
import type { Signer } from "../types.js";
|
|
8
|
+
export interface RawSolanaSignerOptions {
|
|
9
|
+
/** Base58 secret key (64 bytes) or a 64-byte Uint8Array. */
|
|
10
|
+
secretKey: string | Uint8Array;
|
|
11
|
+
/** Solana RPC. Defaults to public mainnet (rate-limited, swap for prod). */
|
|
12
|
+
rpcUrl?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function rawSolanaSigner(opts: RawSolanaSignerOptions): Signer;
|
|
15
|
+
//# sourceMappingURL=raw-solana.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raw-solana.d.ts","sourceRoot":"","sources":["../../src/signers/raw-solana.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH,OAAO,KAAK,EAAsB,MAAM,EAAE,MAAM,aAAa,CAAC;AAO9D,MAAM,WAAW,sBAAsB;IACrC,4DAA4D;IAC5D,SAAS,EAAE,MAAM,GAAG,UAAU,CAAC;IAC/B,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,sBAAsB,GAAG,MAAM,CA6DpE"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Raw Solana signer — for tests, server-side agents, and other scenarios where
|
|
3
|
+
* you hold a Solana keypair directly.
|
|
4
|
+
*
|
|
5
|
+
* Production wallets should prefer Privy or Phantom signers.
|
|
6
|
+
*/
|
|
7
|
+
import { Connection, Keypair, PublicKey, Transaction, sendAndConfirmTransaction, } from "@solana/web3.js";
|
|
8
|
+
import { createTransferInstruction, getAssociatedTokenAddress, getAccount, getOrCreateAssociatedTokenAccount, } from "@solana/spl-token";
|
|
9
|
+
import nacl from "tweetnacl";
|
|
10
|
+
/** Mainnet USDC mint. Used for the default balance lookup. */
|
|
11
|
+
const USDC_MINT_MAINNET = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v";
|
|
12
|
+
const DEFAULT_RPC = "https://api.mainnet-beta.solana.com";
|
|
13
|
+
export function rawSolanaSigner(opts) {
|
|
14
|
+
const secret = typeof opts.secretKey === "string"
|
|
15
|
+
? decodeBase58(opts.secretKey)
|
|
16
|
+
: opts.secretKey;
|
|
17
|
+
const keypair = Keypair.fromSecretKey(secret);
|
|
18
|
+
const connection = new Connection(opts.rpcUrl ?? DEFAULT_RPC, "confirmed");
|
|
19
|
+
return {
|
|
20
|
+
network: "solana",
|
|
21
|
+
address: keypair.publicKey.toBase58(),
|
|
22
|
+
async signMessage(message) {
|
|
23
|
+
const sig = nacl.sign.detached(message, keypair.secretKey);
|
|
24
|
+
return sig;
|
|
25
|
+
},
|
|
26
|
+
async balance() {
|
|
27
|
+
try {
|
|
28
|
+
const mint = new PublicKey(USDC_MINT_MAINNET);
|
|
29
|
+
const ata = await getAssociatedTokenAddress(mint, keypair.publicKey);
|
|
30
|
+
const acc = await getAccount(connection, ata);
|
|
31
|
+
// USDC has 6 decimals.
|
|
32
|
+
return Number(acc.amount) / 1_000_000;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Account doesn't exist yet → 0 balance.
|
|
36
|
+
return 0;
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
/**
|
|
40
|
+
* Pay an SPL token (typically USDC) per the requirement.
|
|
41
|
+
*
|
|
42
|
+
* v0 builds the transfer naively. A production version should batch with
|
|
43
|
+
* the resource request (e.g. via x402 facilitator) and use versioned
|
|
44
|
+
* transactions + priority fees.
|
|
45
|
+
*/
|
|
46
|
+
async pay(req) {
|
|
47
|
+
const mint = new PublicKey(req.asset);
|
|
48
|
+
const recipient = new PublicKey(req.payTo);
|
|
49
|
+
const amount = BigInt(req.amount ?? "0");
|
|
50
|
+
const fromAta = await getOrCreateAssociatedTokenAccount(connection, keypair, mint, keypair.publicKey);
|
|
51
|
+
const toAta = await getOrCreateAssociatedTokenAccount(connection, keypair, mint, recipient);
|
|
52
|
+
const tx = new Transaction().add(createTransferInstruction(fromAta.address, toAta.address, keypair.publicKey, amount));
|
|
53
|
+
const sig = await sendAndConfirmTransaction(connection, tx, [keypair]);
|
|
54
|
+
return sig;
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** Minimal Base58 decode — avoids pulling in bs58 just for this. */
|
|
59
|
+
function decodeBase58(s) {
|
|
60
|
+
const ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
61
|
+
const map = new Map();
|
|
62
|
+
for (let i = 0; i < ALPHABET.length; i++)
|
|
63
|
+
map.set(ALPHABET[i], i);
|
|
64
|
+
let bytes = [0];
|
|
65
|
+
for (const c of s) {
|
|
66
|
+
const v = map.get(c);
|
|
67
|
+
if (v === undefined)
|
|
68
|
+
throw new Error(`Invalid base58 char: ${c}`);
|
|
69
|
+
let carry = v;
|
|
70
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
71
|
+
carry += bytes[i] * 58;
|
|
72
|
+
bytes[i] = carry & 0xff;
|
|
73
|
+
carry >>= 8;
|
|
74
|
+
}
|
|
75
|
+
while (carry) {
|
|
76
|
+
bytes.push(carry & 0xff);
|
|
77
|
+
carry >>= 8;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
for (const c of s) {
|
|
81
|
+
if (c === "1")
|
|
82
|
+
bytes.push(0);
|
|
83
|
+
else
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
return new Uint8Array(bytes.reverse());
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=raw-solana.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raw-solana.js","sourceRoot":"","sources":["../../src/signers/raw-solana.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM tool-definition exporters.
|
|
3
|
+
*
|
|
4
|
+
* Each helper returns the tool/function-calling schema in the vendor's
|
|
5
|
+
* preferred shape plus a `handlers` map. Wire them into your agent loop:
|
|
6
|
+
*
|
|
7
|
+
* const { tools, handlers } = forClaude(xpay);
|
|
8
|
+
* // pass `tools` to Anthropic, look up `handlers[name]` on tool_use blocks.
|
|
9
|
+
*
|
|
10
|
+
* The tool surface mirrors the CLI commands so an agent's mental model is
|
|
11
|
+
* the same whether it's calling the SDK, the CLI, or MCP.
|
|
12
|
+
*/
|
|
13
|
+
import type { XPay } from "../index.js";
|
|
14
|
+
export interface ToolBundle<TDef> {
|
|
15
|
+
tools: TDef[];
|
|
16
|
+
handlers: Record<string, (input: Record<string, unknown>) => Promise<unknown>>;
|
|
17
|
+
}
|
|
18
|
+
export interface ClaudeToolDef {
|
|
19
|
+
name: string;
|
|
20
|
+
description: string;
|
|
21
|
+
input_schema: Record<string, unknown>;
|
|
22
|
+
}
|
|
23
|
+
/** Anthropic Claude tool definitions. */
|
|
24
|
+
export declare function forClaude(xpay: XPay): ToolBundle<ClaudeToolDef>;
|
|
25
|
+
/** OpenAI function-calling tool definitions (derived from the Claude shape). */
|
|
26
|
+
export declare function forOpenAI(xpay: XPay): {
|
|
27
|
+
tools: {
|
|
28
|
+
type: "function";
|
|
29
|
+
function: {
|
|
30
|
+
name: string;
|
|
31
|
+
description: string;
|
|
32
|
+
parameters: Record<string, unknown>;
|
|
33
|
+
};
|
|
34
|
+
}[];
|
|
35
|
+
handlers: Record<string, (input: Record<string, unknown>) => Promise<unknown>>;
|
|
36
|
+
};
|
|
37
|
+
/** Google Gemini function-declaration definitions. */
|
|
38
|
+
export declare function forGemini(xpay: XPay): {
|
|
39
|
+
tools: {
|
|
40
|
+
functionDeclarations: {
|
|
41
|
+
name: string;
|
|
42
|
+
description: string;
|
|
43
|
+
parameters: Record<string, unknown>;
|
|
44
|
+
}[];
|
|
45
|
+
}[];
|
|
46
|
+
handlers: Record<string, (input: Record<string, unknown>) => Promise<unknown>>;
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,WAAW,UAAU,CAAC,IAAI;IAC9B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;CAChF;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,yCAAyC;AACzC,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU,CAAC,aAAa,CAAC,CAuI/D;AAED,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI;;;;;;;;;qCApJD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC;EAiK9E;AAED,sDAAsD;AACtD,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI;;;;;;;;qCApKD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC;EAkL9E"}
|