@auteng/agent-utils 0.3.0 → 1.0.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/dist/index.mjs CHANGED
@@ -1,250 +1,3 @@
1
- // src/wallet/index.ts
2
- import { join as join2, resolve as resolve2 } from "path";
3
-
4
- // src/wallet/keypair.ts
5
- import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
6
- function createKeypair() {
7
- const privateKey = generatePrivateKey();
8
- const account = privateKeyToAccount(privateKey);
9
- return { privateKey, account };
10
- }
11
- function loadKeypair(privateKey) {
12
- const account = privateKeyToAccount(privateKey);
13
- return { account };
14
- }
15
-
16
- // src/wallet/storage.ts
17
- import { mkdirSync, readFileSync, writeFileSync, existsSync, readdirSync, copyFileSync } from "fs";
18
- import { dirname, join, resolve } from "path";
19
- var VALID_NAME = /^[a-z0-9_-]+$/;
20
- function validateWalletName(name) {
21
- if (!VALID_NAME.test(name)) {
22
- throw new Error(`Invalid wallet name "${name}". Use lowercase letters, numbers, hyphens, and underscores only.`);
23
- }
24
- }
25
- function readWalletFile(path) {
26
- if (!existsSync(path)) return null;
27
- const raw = readFileSync(path, "utf-8");
28
- return JSON.parse(raw);
29
- }
30
- function writeWalletFile(path, data) {
31
- mkdirSync(dirname(path), { recursive: true });
32
- writeFileSync(path, JSON.stringify(data, null, 2) + "\n", {
33
- mode: 384
34
- });
35
- }
36
- function listWalletFiles(dir) {
37
- const resolved = resolve(dir);
38
- if (!existsSync(resolved)) return [];
39
- return readdirSync(resolved).filter((f) => f.endsWith(".json")).map((f) => f.replace(/\.json$/, ""));
40
- }
41
- function migrateLegacyWallet(walletsDir) {
42
- const legacyPath = resolve(walletsDir, "..", "wallet.json");
43
- const newPath = join(resolve(walletsDir), "default.json");
44
- if (existsSync(legacyPath) && !existsSync(newPath)) {
45
- const data = readWalletFile(legacyPath);
46
- if (data) {
47
- mkdirSync(resolve(walletsDir), { recursive: true });
48
- copyFileSync(legacyPath, newPath);
49
- return data;
50
- }
51
- }
52
- return null;
53
- }
54
-
55
- // src/x402/index.ts
56
- import { x402Client } from "@x402/core/client";
57
- import { registerExactEvmScheme } from "@x402/evm/exact/client";
58
- import { toClientEvmSigner } from "@x402/evm";
59
- import { wrapFetchWithPayment } from "@x402/fetch";
60
- import { privateKeyToAccount as privateKeyToAccount2 } from "viem/accounts";
61
- import { createPublicClient, http } from "viem";
62
- import { base, baseSepolia } from "viem/chains";
63
- function createPaymentFetch(privateKey, network = "base", rpcUrl) {
64
- const account = privateKeyToAccount2(privateKey);
65
- const chain = network === "base" ? base : baseSepolia;
66
- const publicClient = createPublicClient({
67
- chain,
68
- transport: http(rpcUrl)
69
- });
70
- const signer = toClientEvmSigner(account, publicClient);
71
- const client = new x402Client();
72
- registerExactEvmScheme(client, { signer });
73
- return wrapFetchWithPayment(fetch, client);
74
- }
75
-
76
- // src/wallet/types.ts
77
- var NETWORK_CONFIG = {
78
- base: {
79
- chainId: 8453,
80
- usdcAddress: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
81
- rpcUrl: "https://mainnet.base.org"
82
- },
83
- "base-sepolia": {
84
- chainId: 84532,
85
- usdcAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
86
- rpcUrl: "https://sepolia.base.org"
87
- }
88
- };
89
-
90
- // src/wallet/balance.ts
91
- async function getUsdcBalance(address, network, rpcUrl) {
92
- const config = NETWORK_CONFIG[network];
93
- const url = rpcUrl ?? config.rpcUrl;
94
- const paddedAddress = address.slice(2).toLowerCase().padStart(64, "0");
95
- const data = `0x70a08231${paddedAddress}`;
96
- const res = await fetch(url, {
97
- method: "POST",
98
- headers: { "Content-Type": "application/json" },
99
- body: JSON.stringify({
100
- jsonrpc: "2.0",
101
- id: 1,
102
- method: "eth_call",
103
- params: [{ to: config.usdcAddress, data }, "latest"]
104
- })
105
- });
106
- const json = await res.json();
107
- if (json.error) {
108
- throw new Error(`RPC error: ${JSON.stringify(json.error)}`);
109
- }
110
- return BigInt(json.result ?? "0x0");
111
- }
112
-
113
- // src/wallet/wallet.ts
114
- var Wallet = class {
115
- name;
116
- address;
117
- network;
118
- _account;
119
- _privateKey;
120
- _rpcUrl;
121
- _paymentFetch;
122
- constructor(params) {
123
- this.name = params.name;
124
- this._account = params.account;
125
- this._privateKey = params.privateKey;
126
- this.address = params.account.address;
127
- this.network = params.network;
128
- this._rpcUrl = params.rpcUrl;
129
- this._paymentFetch = params.paymentFetch;
130
- }
131
- /** Check USDC balance on Base. Returns balance in minor units (6 decimals). */
132
- async checkBalance() {
133
- return getUsdcBalance(this._account.address, this.network, this._rpcUrl);
134
- }
135
- /**
136
- * Poll until USDC balance >= minAmount.
137
- * @param minAmount - minimum USDC balance in minor units (6 decimals)
138
- */
139
- async waitForFunding(minAmount, opts) {
140
- const interval = opts?.pollInterval ?? 1e4;
141
- const deadline = opts?.timeout ? Date.now() + opts.timeout : null;
142
- while (true) {
143
- const balance = await getUsdcBalance(this._account.address, this.network, this._rpcUrl);
144
- if (balance >= minAmount) return;
145
- if (deadline && Date.now() >= deadline) {
146
- throw new Error(`Funding timeout: balance ${balance} < required ${minAmount}`);
147
- }
148
- await new Promise((r) => setTimeout(r, interval));
149
- }
150
- }
151
- /**
152
- * Drop-in `fetch()` replacement that handles x402 payments automatically.
153
- * If the server returns 402, the library signs an EIP-3009 authorization
154
- * and retries the request with payment headers.
155
- */
156
- async fetch(input, init) {
157
- return this._paymentFetch(input, init);
158
- }
159
- };
160
-
161
- // src/wallet/index.ts
162
- var DEFAULT_WALLETS_DIR = ".auteng/wallets";
163
- var _wallets = /* @__PURE__ */ new Map();
164
- var _walletsDir = resolve2(DEFAULT_WALLETS_DIR);
165
- var wallet = {
166
- /**
167
- * Create a new named wallet or load an existing one from disk.
168
- * Idempotent: if a wallet with this name already exists, returns it.
169
- */
170
- async create(opts) {
171
- const name = opts?.name ?? "default";
172
- validateWalletName(name);
173
- if (_wallets.has(name)) return _wallets.get(name);
174
- const dir = resolve2(opts?.walletsDir ?? DEFAULT_WALLETS_DIR);
175
- _walletsDir = dir;
176
- const filePath = join2(dir, `${name}.json`);
177
- const network = opts?.network ?? "base";
178
- const rpcUrl = opts?.rpcUrl;
179
- let existing = readWalletFile(filePath);
180
- if (!existing && name === "default") {
181
- existing = migrateLegacyWallet(dir);
182
- }
183
- let privateKey;
184
- let account;
185
- if (existing) {
186
- privateKey = existing.privateKey;
187
- account = loadKeypair(existing.privateKey).account;
188
- } else {
189
- const kp = createKeypair();
190
- privateKey = kp.privateKey;
191
- account = kp.account;
192
- writeWalletFile(filePath, {
193
- privateKey,
194
- address: account.address,
195
- network
196
- });
197
- }
198
- const effectiveNetwork = existing?.network ?? network;
199
- const paymentFetch = createPaymentFetch(privateKey, effectiveNetwork, rpcUrl);
200
- const w = new Wallet({
201
- name,
202
- account,
203
- privateKey,
204
- network: effectiveNetwork,
205
- rpcUrl,
206
- paymentFetch
207
- });
208
- _wallets.set(name, w);
209
- return w;
210
- },
211
- /**
212
- * Retrieve a previously-created wallet by name.
213
- * Loads from disk if not in memory. Throws if not found.
214
- */
215
- get(name) {
216
- validateWalletName(name);
217
- if (_wallets.has(name)) return _wallets.get(name);
218
- const filePath = join2(_walletsDir, `${name}.json`);
219
- const data = readWalletFile(filePath);
220
- if (!data) throw new Error(`Wallet "${name}" not found`);
221
- const { account } = loadKeypair(data.privateKey);
222
- const paymentFetch = createPaymentFetch(data.privateKey, data.network);
223
- const w = new Wallet({
224
- name,
225
- account,
226
- privateKey: data.privateKey,
227
- network: data.network,
228
- paymentFetch
229
- });
230
- _wallets.set(name, w);
231
- return w;
232
- },
233
- /** List all persisted wallets. */
234
- list() {
235
- const names = listWalletFiles(_walletsDir);
236
- return names.map((n) => {
237
- if (_wallets.has(n)) return _wallets.get(n);
238
- return wallet.get(n);
239
- });
240
- },
241
- /** @internal Clear in-memory cache and reset wallets dir. For testing only. */
242
- _reset() {
243
- _wallets.clear();
244
- _walletsDir = resolve2(DEFAULT_WALLETS_DIR);
245
- }
246
- };
247
-
248
1
  // src/compute/index.ts
249
2
  var DEFAULT_ENDPOINT = "https://x402.auteng.ai/api/x402/compute";
250
3
  var _endpoint = DEFAULT_ENDPOINT;
@@ -321,9 +74,180 @@ var compute = {
321
74
  _endpoint = url;
322
75
  }
323
76
  };
77
+
78
+ // src/x402/payment-fetch.ts
79
+ import { x402Client } from "@x402/core/client";
80
+ import { registerExactEvmScheme } from "@x402/evm/exact/client";
81
+ import { toClientEvmSigner } from "@x402/evm";
82
+ import { wrapFetchWithPayment } from "@x402/fetch";
83
+ import { privateKeyToAccount } from "viem/accounts";
84
+ import { createPublicClient, http } from "viem";
85
+ import { base, baseSepolia } from "viem/chains";
86
+
87
+ // src/x402/format.ts
88
+ var KNOWN_ASSETS = {
89
+ // USDC on Base mainnet
90
+ "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913": { symbol: "USDC", decimals: 6, prefix: "$" },
91
+ // USDC on Base Sepolia
92
+ "0x036cbd53842c5426634e7929541ec2318f3dcf7e": { symbol: "USDC", decimals: 6, prefix: "$" }
93
+ };
94
+ var NETWORK_NAMES = {
95
+ "eip155:8453": "Base",
96
+ "eip155:84532": "Base Sepolia",
97
+ base: "Base",
98
+ "base-sepolia": "Base Sepolia"
99
+ };
100
+ function formatPrice(amount, asset, network, options) {
101
+ const known = KNOWN_ASSETS[asset.toLowerCase()];
102
+ const networkName = NETWORK_NAMES[network];
103
+ if (known) {
104
+ const value = Number(amount) / 10 ** known.decimals;
105
+ const formatted = `${known.prefix}${value} ${known.symbol}`;
106
+ if (options?.short || !networkName) return formatted;
107
+ return `${formatted} on ${networkName}`;
108
+ }
109
+ const shortAsset = `${asset.slice(0, 6)}...${asset.slice(-4)}`;
110
+ const raw = `${amount} ${shortAsset}`;
111
+ if (options?.short || !networkName) return raw;
112
+ return `${raw} on ${networkName}`;
113
+ }
114
+
115
+ // src/x402/probe.ts
116
+ async function probe(url, options) {
117
+ const res = await fetch(url, {
118
+ method: options?.method ?? "GET",
119
+ headers: options?.headers,
120
+ body: options?.body,
121
+ signal: options?.signal
122
+ });
123
+ if (res.status !== 402) {
124
+ return { enabled: false, url, status: res.status, price: null, paymentRequired: null };
125
+ }
126
+ let raw;
127
+ try {
128
+ raw = await res.json();
129
+ } catch {
130
+ return { enabled: false, url, status: 402, price: null, paymentRequired: null };
131
+ }
132
+ const paymentRequired = normalizePaymentRequired(raw);
133
+ if (!paymentRequired || paymentRequired.accepts.length === 0) {
134
+ return { enabled: false, url, status: 402, price: null, paymentRequired: null };
135
+ }
136
+ const first = paymentRequired.accepts[0];
137
+ const price = formatPrice(first.amount, first.asset, first.network);
138
+ return { enabled: true, url, status: 402, price, paymentRequired };
139
+ }
140
+ function normalizePaymentRequired(raw) {
141
+ if (!raw || typeof raw !== "object" || !Array.isArray(raw.accepts) || raw.accepts.length === 0) {
142
+ return null;
143
+ }
144
+ const firstAccept = raw.accepts[0];
145
+ const isV2 = typeof firstAccept.amount === "string" && raw.resource && typeof raw.resource === "object";
146
+ if (isV2) {
147
+ return {
148
+ x402Version: raw.x402Version ?? 2,
149
+ resource: {
150
+ url: raw.resource.url ?? "",
151
+ description: raw.resource.description,
152
+ mimeType: raw.resource.mimeType
153
+ },
154
+ accepts: raw.accepts.map(normalizeAccept),
155
+ extensions: raw.extensions ?? void 0
156
+ };
157
+ }
158
+ if (typeof firstAccept.maxAmountRequired === "string") {
159
+ return {
160
+ x402Version: raw.x402Version ?? 1,
161
+ resource: {
162
+ url: firstAccept.resource ?? raw.resource?.url ?? "",
163
+ description: firstAccept.description ?? raw.resource?.description,
164
+ mimeType: firstAccept.mimeType ?? raw.resource?.mimeType
165
+ },
166
+ accepts: raw.accepts.map(
167
+ (a) => normalizeAccept({
168
+ ...a,
169
+ amount: a.maxAmountRequired
170
+ })
171
+ ),
172
+ extensions: raw.extensions ?? void 0
173
+ };
174
+ }
175
+ return null;
176
+ }
177
+ function normalizeAccept(a) {
178
+ return {
179
+ scheme: a.scheme ?? "exact",
180
+ network: a.network ?? "",
181
+ asset: a.asset ?? "",
182
+ amount: String(a.amount ?? a.maxAmountRequired ?? "0"),
183
+ payTo: a.payTo ?? "",
184
+ maxTimeoutSeconds: a.maxTimeoutSeconds ?? 0,
185
+ extra: a.extra ?? void 0
186
+ };
187
+ }
188
+
189
+ // src/x402/discover.ts
190
+ var DEFAULT_BAZAAR_URL = "https://api.cdp.coinbase.com/platform/v2/x402/discovery/resources";
191
+ async function discover(options) {
192
+ const baseUrl = options?.bazaarUrl ?? DEFAULT_BAZAAR_URL;
193
+ const params = new URLSearchParams();
194
+ if (options?.limit != null) params.set("limit", String(options.limit));
195
+ if (options?.offset != null) params.set("offset", String(options.offset));
196
+ const url = params.toString() ? `${baseUrl}?${params}` : baseUrl;
197
+ const res = await fetch(url, {
198
+ headers: { Accept: "application/json" },
199
+ signal: options?.signal
200
+ });
201
+ if (!res.ok) {
202
+ const text = await res.text().catch(() => "");
203
+ throw new Error(`Bazaar request failed (${res.status}): ${text}`);
204
+ }
205
+ const json = await res.json();
206
+ const items = json.items ?? json.resources ?? [];
207
+ const services = items.map(normalizeBazaarItem).filter(Boolean);
208
+ return {
209
+ services,
210
+ total: json.total ?? json.totalCount ?? services.length
211
+ };
212
+ }
213
+ function normalizeBazaarItem(item) {
214
+ if (!item || typeof item !== "object") return null;
215
+ const accepts = item.accepts ?? [];
216
+ if (accepts.length === 0) return null;
217
+ const normalizedAccepts = accepts.map((a) => {
218
+ const accept = a;
219
+ return {
220
+ scheme: accept.scheme ?? "exact",
221
+ network: accept.network ?? "",
222
+ asset: accept.asset ?? "",
223
+ amount: String(accept.amount ?? accept.maxAmountRequired ?? "0"),
224
+ payTo: accept.payTo ?? "",
225
+ maxTimeoutSeconds: accept.maxTimeoutSeconds ?? 0,
226
+ extra: accept.extra ?? void 0
227
+ };
228
+ });
229
+ const cheapest = normalizedAccepts.reduce((min, a) => BigInt(a.amount) < BigInt(min.amount) ? a : min);
230
+ const price = formatPrice(cheapest.amount, cheapest.asset, cheapest.network);
231
+ const firstAccept = accepts[0];
232
+ const description = item.description ?? item.resource?.description ?? firstAccept?.description ?? item.metadata?.description ?? null;
233
+ const url = item.url ?? item.resource?.url ?? (typeof item.resource === "string" ? item.resource : null) ?? firstAccept?.resource ?? "";
234
+ return {
235
+ url,
236
+ description,
237
+ price,
238
+ accepts: normalizedAccepts,
239
+ metadata: item.metadata ?? {}
240
+ };
241
+ }
242
+
243
+ // src/x402/index.ts
244
+ var x402 = {
245
+ probe,
246
+ discover,
247
+ formatPrice
248
+ };
324
249
  export {
325
- Wallet,
326
250
  compute,
327
- wallet
251
+ x402
328
252
  };
329
253
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/wallet/index.ts","../src/wallet/keypair.ts","../src/wallet/storage.ts","../src/x402/index.ts","../src/wallet/types.ts","../src/wallet/balance.ts","../src/wallet/wallet.ts","../src/compute/index.ts"],"sourcesContent":["import { join, resolve } from \"node:path\"\nimport { createKeypair, loadKeypair } from \"./keypair.js\"\nimport { readWalletFile, writeWalletFile, listWalletFiles, migrateLegacyWallet, validateWalletName } from \"./storage.js\"\nimport { createPaymentFetch } from \"../x402/index.js\"\nimport { Wallet } from \"./wallet.js\"\nimport type { CreateWalletOptions } from \"./types.js\"\n\nconst DEFAULT_WALLETS_DIR = \".auteng/wallets\"\n\nconst _wallets = new Map<string, Wallet>()\nlet _walletsDir = resolve(DEFAULT_WALLETS_DIR)\n\nexport const wallet = {\n /**\n * Create a new named wallet or load an existing one from disk.\n * Idempotent: if a wallet with this name already exists, returns it.\n */\n async create(opts?: CreateWalletOptions): Promise<Wallet> {\n const name = opts?.name ?? \"default\"\n validateWalletName(name)\n\n if (_wallets.has(name)) return _wallets.get(name)!\n\n const dir = resolve(opts?.walletsDir ?? DEFAULT_WALLETS_DIR)\n _walletsDir = dir\n const filePath = join(dir, `${name}.json`)\n const network = opts?.network ?? \"base\"\n const rpcUrl = opts?.rpcUrl\n\n let existing = readWalletFile(filePath)\n\n if (!existing && name === \"default\") {\n existing = migrateLegacyWallet(dir)\n }\n\n let privateKey: `0x${string}`\n let account: ReturnType<typeof loadKeypair>[\"account\"]\n\n if (existing) {\n privateKey = existing.privateKey\n account = loadKeypair(existing.privateKey).account\n } else {\n const kp = createKeypair()\n privateKey = kp.privateKey\n account = kp.account\n writeWalletFile(filePath, {\n privateKey,\n address: account.address,\n network,\n })\n }\n\n const effectiveNetwork = existing?.network ?? network\n const paymentFetch = createPaymentFetch(privateKey, effectiveNetwork, rpcUrl)\n const w = new Wallet({\n name,\n account,\n privateKey,\n network: effectiveNetwork,\n rpcUrl,\n paymentFetch,\n })\n _wallets.set(name, w)\n return w\n },\n\n /**\n * Retrieve a previously-created wallet by name.\n * Loads from disk if not in memory. Throws if not found.\n */\n get(name: string): Wallet {\n validateWalletName(name)\n\n if (_wallets.has(name)) return _wallets.get(name)!\n\n const filePath = join(_walletsDir, `${name}.json`)\n const data = readWalletFile(filePath)\n if (!data) throw new Error(`Wallet \"${name}\" not found`)\n\n const { account } = loadKeypair(data.privateKey)\n const paymentFetch = createPaymentFetch(data.privateKey, data.network)\n const w = new Wallet({\n name,\n account,\n privateKey: data.privateKey,\n network: data.network,\n paymentFetch,\n })\n _wallets.set(name, w)\n return w\n },\n\n /** List all persisted wallets. */\n list(): Wallet[] {\n const names = listWalletFiles(_walletsDir)\n return names.map((n) => {\n if (_wallets.has(n)) return _wallets.get(n)!\n return wallet.get(n)\n })\n },\n\n /** @internal Clear in-memory cache and reset wallets dir. For testing only. */\n _reset(): void {\n _wallets.clear()\n _walletsDir = resolve(DEFAULT_WALLETS_DIR)\n },\n}\n","import { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\"\nimport type { PrivateKeyAccount } from \"viem\"\n\nexport function createKeypair(): {\n privateKey: `0x${string}`\n account: PrivateKeyAccount\n} {\n const privateKey = generatePrivateKey()\n const account = privateKeyToAccount(privateKey)\n return { privateKey, account }\n}\n\nexport function loadKeypair(privateKey: `0x${string}`): {\n account: PrivateKeyAccount\n} {\n const account = privateKeyToAccount(privateKey)\n return { account }\n}\n","import { mkdirSync, readFileSync, writeFileSync, existsSync, readdirSync, copyFileSync } from \"node:fs\"\nimport { dirname, join, resolve } from \"node:path\"\nimport type { WalletFile } from \"./types.js\"\n\nconst VALID_NAME = /^[a-z0-9_-]+$/\n\nexport function validateWalletName(name: string): void {\n if (!VALID_NAME.test(name)) {\n throw new Error(`Invalid wallet name \"${name}\". Use lowercase letters, numbers, hyphens, and underscores only.`)\n }\n}\n\nexport function readWalletFile(path: string): WalletFile | null {\n if (!existsSync(path)) return null\n const raw = readFileSync(path, \"utf-8\")\n return JSON.parse(raw) as WalletFile\n}\n\nexport function writeWalletFile(path: string, data: WalletFile): void {\n mkdirSync(dirname(path), { recursive: true })\n writeFileSync(path, JSON.stringify(data, null, 2) + \"\\n\", {\n mode: 0o600,\n })\n}\n\nexport function listWalletFiles(dir: string): string[] {\n const resolved = resolve(dir)\n if (!existsSync(resolved)) return []\n return readdirSync(resolved)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => f.replace(/\\.json$/, \"\"))\n}\n\nexport function migrateLegacyWallet(walletsDir: string): WalletFile | null {\n const legacyPath = resolve(walletsDir, \"..\", \"wallet.json\")\n const newPath = join(resolve(walletsDir), \"default.json\")\n if (existsSync(legacyPath) && !existsSync(newPath)) {\n const data = readWalletFile(legacyPath)\n if (data) {\n mkdirSync(resolve(walletsDir), { recursive: true })\n copyFileSync(legacyPath, newPath)\n return data\n }\n }\n return null\n}\n","import { x402Client } from \"@x402/core/client\"\nimport { registerExactEvmScheme } from \"@x402/evm/exact/client\"\nimport { toClientEvmSigner } from \"@x402/evm\"\nimport { wrapFetchWithPayment } from \"@x402/fetch\"\nimport { privateKeyToAccount } from \"viem/accounts\"\nimport { createPublicClient, http } from \"viem\"\nimport { base, baseSepolia } from \"viem/chains\"\nimport type { Network } from \"../wallet/types.js\"\n\n/**\n * Create a fetch function that automatically handles x402 payments.\n * When the server returns 402, the SDK signs an EIP-3009 authorization\n * using the provided private key and retries with payment headers.\n */\nexport function createPaymentFetch(\n privateKey: `0x${string}`,\n network: Network = \"base\",\n rpcUrl?: string\n): typeof globalThis.fetch {\n const account = privateKeyToAccount(privateKey)\n const chain = network === \"base\" ? base : baseSepolia\n const publicClient = createPublicClient({\n chain,\n transport: http(rpcUrl),\n })\n const signer = toClientEvmSigner(account, publicClient)\n\n const client = new x402Client()\n registerExactEvmScheme(client, { signer })\n return wrapFetchWithPayment(fetch, client)\n}\n","export type Network = \"base\" | \"base-sepolia\"\n\nexport interface CreateWalletOptions {\n /** Wallet identifier. Default: \"default\" */\n name?: string\n /** Network to use. Default: `base` */\n network?: Network\n /** Custom RPC endpoint. Default: public Base RPC */\n rpcUrl?: string\n /** Base directory for wallet storage. Default: \".auteng/wallets\" */\n walletsDir?: string\n}\n\n/** @deprecated Use CreateWalletOptions instead */\nexport type WalletConfig = CreateWalletOptions\n\nexport interface WalletFile {\n privateKey: `0x${string}`\n address: `0x${string}`\n network: Network\n}\n\nexport interface WaitForFundingOptions {\n /** Poll interval in milliseconds. Default: 10000 (10s) */\n pollInterval?: number\n /** Timeout in milliseconds. Default: none (waits forever) */\n timeout?: number\n}\n\nexport const NETWORK_CONFIG: Record<Network, { chainId: number; usdcAddress: `0x${string}`; rpcUrl: string }> = {\n base: {\n chainId: 8453,\n usdcAddress: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n rpcUrl: \"https://mainnet.base.org\",\n },\n \"base-sepolia\": {\n chainId: 84532,\n usdcAddress: \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\",\n rpcUrl: \"https://sepolia.base.org\",\n },\n}\n","import type { Network } from \"./types.js\"\nimport { NETWORK_CONFIG } from \"./types.js\"\n\n/**\n * Read USDC balance for `address` via a direct `eth_call` to the USDC\n * contract's `balanceOf(address)` function. No viem client needed — just\n * a plain JSON-RPC POST.\n */\nexport async function getUsdcBalance(address: `0x${string}`, network: Network, rpcUrl?: string): Promise<bigint> {\n const config = NETWORK_CONFIG[network]\n const url = rpcUrl ?? config.rpcUrl\n\n // balanceOf(address) selector = 0x70a08231\n const paddedAddress = address.slice(2).toLowerCase().padStart(64, \"0\")\n const data = `0x70a08231${paddedAddress}`\n\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"eth_call\",\n params: [{ to: config.usdcAddress, data }, \"latest\"],\n }),\n })\n\n const json = (await res.json()) as { result?: string; error?: unknown }\n if (json.error) {\n throw new Error(`RPC error: ${JSON.stringify(json.error)}`)\n }\n return BigInt(json.result ?? \"0x0\")\n}\n","import type { PrivateKeyAccount } from \"viem\"\nimport { getUsdcBalance } from \"./balance.js\"\nimport type { Network, WaitForFundingOptions } from \"./types.js\"\n\nexport class Wallet {\n readonly name: string\n readonly address: `0x${string}`\n readonly network: Network\n\n private _account: PrivateKeyAccount\n private _privateKey: `0x${string}`\n private _rpcUrl: string | undefined\n private _paymentFetch: typeof globalThis.fetch\n\n constructor(params: {\n name: string\n account: PrivateKeyAccount\n privateKey: `0x${string}`\n network: Network\n rpcUrl?: string\n paymentFetch: typeof globalThis.fetch\n }) {\n this.name = params.name\n this._account = params.account\n this._privateKey = params.privateKey\n this.address = params.account.address\n this.network = params.network\n this._rpcUrl = params.rpcUrl\n this._paymentFetch = params.paymentFetch\n }\n\n /** Check USDC balance on Base. Returns balance in minor units (6 decimals). */\n async checkBalance(): Promise<bigint> {\n return getUsdcBalance(this._account.address, this.network, this._rpcUrl)\n }\n\n /**\n * Poll until USDC balance >= minAmount.\n * @param minAmount - minimum USDC balance in minor units (6 decimals)\n */\n async waitForFunding(minAmount: bigint, opts?: WaitForFundingOptions): Promise<void> {\n const interval = opts?.pollInterval ?? 10_000\n const deadline = opts?.timeout ? Date.now() + opts.timeout : null\n\n while (true) {\n const balance = await getUsdcBalance(this._account.address, this.network, this._rpcUrl)\n if (balance >= minAmount) return\n\n if (deadline && Date.now() >= deadline) {\n throw new Error(`Funding timeout: balance ${balance} < required ${minAmount}`)\n }\n\n await new Promise((r) => setTimeout(r, interval))\n }\n }\n\n /**\n * Drop-in `fetch()` replacement that handles x402 payments automatically.\n * If the server returns 402, the library signs an EIP-3009 authorization\n * and retries the request with payment headers.\n */\n async fetch(input: string | URL | Request, init?: RequestInit): Promise<Response> {\n return this._paymentFetch(input, init)\n }\n}\n","import type { ComputeRequest, ComputeResponse, PricingTier, Size } from \"./types.js\"\n\nconst DEFAULT_ENDPOINT = \"https://x402.auteng.ai/api/x402/compute\"\n\nlet _endpoint = DEFAULT_ENDPOINT\n\nconst PRICING: Record<Size, PricingTier> = {\n small: {\n vcpu: 2,\n ram_gb: 1,\n default_timeout_s: 30,\n max_timeout_s: 300,\n base_price_usd: 0.002,\n per_second_usd: 0.00005,\n },\n med: {\n vcpu: 4,\n ram_gb: 4,\n default_timeout_s: 60,\n max_timeout_s: 600,\n base_price_usd: 0.008,\n per_second_usd: 0.00012,\n },\n large: {\n vcpu: 8,\n ram_gb: 16,\n default_timeout_s: 120,\n max_timeout_s: 3600,\n base_price_usd: 0.03,\n per_second_usd: 0.00025,\n },\n}\n\nexport const compute = {\n /**\n * Execute sandboxed code via AutEng's x402 compute endpoint.\n * Payment is handled automatically via the wallet's x402 layer.\n */\n async run(request: ComputeRequest): Promise<ComputeResponse> {\n if (!request.code) {\n throw new Error(\"compute.run: 'code' is required\")\n }\n if (!request.stack) {\n throw new Error(\"compute.run: 'stack' is required\")\n }\n\n const body = {\n code: request.code,\n stack: request.stack,\n size: request.size ?? \"small\",\n ...(request.timeout_seconds != null && {\n timeout_seconds: request.timeout_seconds,\n }),\n ...(request.files != null && { files: request.files }),\n }\n\n if (!request.wallet) {\n throw new Error(\"compute.run: 'wallet' is required\")\n }\n\n const response = await request.wallet.fetch(_endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n })\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\")\n throw new Error(`Compute request failed (${response.status}): ${text}`)\n }\n\n return (await response.json()) as ComputeResponse\n },\n\n /** Returns the pricing table for all compute sizes. */\n pricing(): Record<Size, PricingTier> {\n return { ...PRICING }\n },\n\n /**\n * Override the compute endpoint URL.\n * Default: https://x402.auteng.ai/api/x402/compute\n */\n setEndpoint(url: string): void {\n _endpoint = url\n },\n}\n"],"mappings":"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","names":["join","resolve","privateKeyToAccount","resolve","join"]}
1
+ {"version":3,"sources":["../src/compute/index.ts","../src/x402/payment-fetch.ts","../src/x402/format.ts","../src/x402/probe.ts","../src/x402/discover.ts","../src/x402/index.ts"],"sourcesContent":["import type { ComputeRequest, ComputeResponse, PricingTier, Size } from \"./types.js\"\n\nconst DEFAULT_ENDPOINT = \"https://x402.auteng.ai/api/x402/compute\"\n\nlet _endpoint = DEFAULT_ENDPOINT\n\nconst PRICING: Record<Size, PricingTier> = {\n small: {\n vcpu: 2,\n ram_gb: 1,\n default_timeout_s: 30,\n max_timeout_s: 300,\n base_price_usd: 0.002,\n per_second_usd: 0.00005,\n },\n med: {\n vcpu: 4,\n ram_gb: 4,\n default_timeout_s: 60,\n max_timeout_s: 600,\n base_price_usd: 0.008,\n per_second_usd: 0.00012,\n },\n large: {\n vcpu: 8,\n ram_gb: 16,\n default_timeout_s: 120,\n max_timeout_s: 3600,\n base_price_usd: 0.03,\n per_second_usd: 0.00025,\n },\n}\n\nexport const compute = {\n /**\n * Execute sandboxed code via AutEng's x402 compute endpoint.\n * Payment is handled automatically via the wallet's x402 layer.\n */\n async run(request: ComputeRequest): Promise<ComputeResponse> {\n if (!request.code) {\n throw new Error(\"compute.run: 'code' is required\")\n }\n if (!request.stack) {\n throw new Error(\"compute.run: 'stack' is required\")\n }\n\n const body = {\n code: request.code,\n stack: request.stack,\n size: request.size ?? \"small\",\n ...(request.timeout_seconds != null && {\n timeout_seconds: request.timeout_seconds,\n }),\n ...(request.files != null && { files: request.files }),\n }\n\n if (!request.wallet) {\n throw new Error(\"compute.run: 'wallet' is required\")\n }\n\n const response = await request.wallet.fetch(_endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n })\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\")\n throw new Error(`Compute request failed (${response.status}): ${text}`)\n }\n\n return (await response.json()) as ComputeResponse\n },\n\n /** Returns the pricing table for all compute sizes. */\n pricing(): Record<Size, PricingTier> {\n return { ...PRICING }\n },\n\n /**\n * Override the compute endpoint URL.\n * Default: https://x402.auteng.ai/api/x402/compute\n */\n setEndpoint(url: string): void {\n _endpoint = url\n },\n}\n","import { x402Client } from \"@x402/core/client\"\nimport { registerExactEvmScheme } from \"@x402/evm/exact/client\"\nimport { toClientEvmSigner } from \"@x402/evm\"\nimport { wrapFetchWithPayment } from \"@x402/fetch\"\nimport { privateKeyToAccount } from \"viem/accounts\"\nimport { createPublicClient, http } from \"viem\"\nimport { base, baseSepolia } from \"viem/chains\"\nimport type { Network } from \"./types.js\"\n\n/**\n * Create a fetch function that automatically handles x402 payments.\n * When the server returns 402, the SDK signs an EIP-3009 authorization\n * using the provided private key and retries with payment headers.\n */\nexport function createPaymentFetch(\n privateKey: `0x${string}`,\n network: Network = \"base\",\n rpcUrl?: string\n): typeof globalThis.fetch {\n const account = privateKeyToAccount(privateKey)\n const chain = network === \"base\" ? base : baseSepolia\n const publicClient = createPublicClient({\n chain,\n transport: http(rpcUrl),\n })\n const signer = toClientEvmSigner(account, publicClient)\n\n const client = new x402Client()\n registerExactEvmScheme(client, { signer })\n return wrapFetchWithPayment(fetch, client)\n}\n","import type { FormatPriceOptions } from \"./types.js\"\n\nconst KNOWN_ASSETS: Record<string, { symbol: string; decimals: number; prefix: string }> = {\n // USDC on Base mainnet\n \"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913\": { symbol: \"USDC\", decimals: 6, prefix: \"$\" },\n // USDC on Base Sepolia\n \"0x036cbd53842c5426634e7929541ec2318f3dcf7e\": { symbol: \"USDC\", decimals: 6, prefix: \"$\" },\n}\n\nconst NETWORK_NAMES: Record<string, string> = {\n \"eip155:8453\": \"Base\",\n \"eip155:84532\": \"Base Sepolia\",\n base: \"Base\",\n \"base-sepolia\": \"Base Sepolia\",\n}\n\n/**\n * Format a raw x402 price into a human-readable string.\n *\n * Knows about common assets (USDC on Base = 6 decimals, $-prefixed)\n * and falls back to raw display for unknown assets.\n *\n * @example\n * formatPrice(\"2000\", \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\", \"eip155:8453\")\n * // → \"$0.002 USDC on Base\"\n */\nexport function formatPrice(amount: string, asset: string, network: string, options?: FormatPriceOptions): string {\n const known = KNOWN_ASSETS[asset.toLowerCase()]\n const networkName = NETWORK_NAMES[network]\n\n if (known) {\n const value = Number(amount) / 10 ** known.decimals\n const formatted = `${known.prefix}${value} ${known.symbol}`\n if (options?.short || !networkName) return formatted\n return `${formatted} on ${networkName}`\n }\n\n // Unknown asset — show raw\n const shortAsset = `${asset.slice(0, 6)}...${asset.slice(-4)}`\n const raw = `${amount} ${shortAsset}`\n if (options?.short || !networkName) return raw\n return `${raw} on ${networkName}`\n}\n","import type { ProbeResult, ProbeOptions, PaymentRequiredResponse, PaymentOption } from \"./types.js\"\nimport { formatPrice } from \"./format.js\"\n\n/**\n * Check if a URL is x402-enabled and see what it costs, without paying.\n *\n * Sends a request to the URL. If the server returns 402 Payment Required,\n * parses the payment requirements and returns a structured result with\n * human-readable pricing. Non-402 responses return `{ enabled: false }`.\n *\n * No wallet needed — this is a read-only inspection.\n */\nexport async function probe(url: string, options?: ProbeOptions): Promise<ProbeResult> {\n const res = await fetch(url, {\n method: options?.method ?? \"GET\",\n headers: options?.headers,\n body: options?.body,\n signal: options?.signal,\n })\n\n if (res.status !== 402) {\n return { enabled: false, url, status: res.status, price: null, paymentRequired: null }\n }\n\n let raw: unknown\n try {\n raw = await res.json()\n } catch {\n return { enabled: false, url, status: 402, price: null, paymentRequired: null }\n }\n\n const paymentRequired = normalizePaymentRequired(raw)\n if (!paymentRequired || paymentRequired.accepts.length === 0) {\n return { enabled: false, url, status: 402, price: null, paymentRequired: null }\n }\n\n const first = paymentRequired.accepts[0]\n const price = formatPrice(first.amount, first.asset, first.network)\n\n return { enabled: true, url, status: 402, price, paymentRequired }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction normalizePaymentRequired(raw: any): PaymentRequiredResponse | null {\n if (!raw || typeof raw !== \"object\" || !Array.isArray(raw.accepts) || raw.accepts.length === 0) {\n return null\n }\n\n const firstAccept = raw.accepts[0]\n\n // Determine if v2 (has top-level resource object and accepts[].amount)\n // or v1 (has accepts[].maxAmountRequired and inline resource/description)\n const isV2 = typeof firstAccept.amount === \"string\" && raw.resource && typeof raw.resource === \"object\"\n\n if (isV2) {\n return {\n x402Version: raw.x402Version ?? 2,\n resource: {\n url: raw.resource.url ?? \"\",\n description: raw.resource.description,\n mimeType: raw.resource.mimeType,\n },\n accepts: raw.accepts.map(normalizeAccept),\n extensions: raw.extensions ?? undefined,\n }\n }\n\n // v1 shape: maxAmountRequired, inline resource/description on each accept\n if (typeof firstAccept.maxAmountRequired === \"string\") {\n return {\n x402Version: raw.x402Version ?? 1,\n resource: {\n url: firstAccept.resource ?? raw.resource?.url ?? \"\",\n description: firstAccept.description ?? raw.resource?.description,\n mimeType: firstAccept.mimeType ?? raw.resource?.mimeType,\n },\n accepts: raw.accepts.map((a: Record<string, unknown>) =>\n normalizeAccept({\n ...a,\n amount: a.maxAmountRequired,\n })\n ),\n extensions: raw.extensions ?? undefined,\n }\n }\n\n return null\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction normalizeAccept(a: any): PaymentOption {\n return {\n scheme: a.scheme ?? \"exact\",\n network: a.network ?? \"\",\n asset: a.asset ?? \"\",\n amount: String(a.amount ?? a.maxAmountRequired ?? \"0\"),\n payTo: a.payTo ?? \"\",\n maxTimeoutSeconds: a.maxTimeoutSeconds ?? 0,\n extra: a.extra ?? undefined,\n }\n}\n","import type { DiscoverResult, DiscoverOptions, BazaarService, PaymentOption } from \"./types.js\"\nimport { formatPrice } from \"./format.js\"\n\nconst DEFAULT_BAZAAR_URL = \"https://api.cdp.coinbase.com/platform/v2/x402/discovery/resources\"\n\n/**\n * Query the Bazaar registry to find available x402 services.\n *\n * Fetches from the Coinbase CDP Bazaar discovery endpoint and returns\n * a normalized list of services with human-readable pricing.\n *\n * No wallet or authentication needed.\n */\nexport async function discover(options?: DiscoverOptions): Promise<DiscoverResult> {\n const baseUrl = options?.bazaarUrl ?? DEFAULT_BAZAAR_URL\n const params = new URLSearchParams()\n if (options?.limit != null) params.set(\"limit\", String(options.limit))\n if (options?.offset != null) params.set(\"offset\", String(options.offset))\n\n const url = params.toString() ? `${baseUrl}?${params}` : baseUrl\n\n const res = await fetch(url, {\n headers: { Accept: \"application/json\" },\n signal: options?.signal,\n })\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\")\n throw new Error(`Bazaar request failed (${res.status}): ${text}`)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const json = (await res.json()) as any\n\n // The Bazaar response has an `items` array (or `resources`)\n const items: unknown[] = json.items ?? json.resources ?? []\n\n const services: BazaarService[] = items.map(normalizeBazaarItem).filter(Boolean) as BazaarService[]\n\n return {\n services,\n total: json.total ?? json.totalCount ?? services.length,\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction normalizeBazaarItem(item: any): BazaarService | null {\n if (!item || typeof item !== \"object\") return null\n\n const accepts: unknown[] = item.accepts ?? []\n if (accepts.length === 0) return null\n\n const normalizedAccepts: PaymentOption[] = accepts.map((a: unknown) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const accept = a as any\n return {\n scheme: accept.scheme ?? \"exact\",\n network: accept.network ?? \"\",\n asset: accept.asset ?? \"\",\n amount: String(accept.amount ?? accept.maxAmountRequired ?? \"0\"),\n payTo: accept.payTo ?? \"\",\n maxTimeoutSeconds: accept.maxTimeoutSeconds ?? 0,\n extra: accept.extra ?? undefined,\n }\n })\n\n // Find cheapest option for display price\n const cheapest = normalizedAccepts.reduce((min, a) => (BigInt(a.amount) < BigInt(min.amount) ? a : min))\n const price = formatPrice(cheapest.amount, cheapest.asset, cheapest.network)\n\n // Extract description from various possible locations\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const firstAccept = accepts[0] as any\n const description: string | null =\n item.description ?? item.resource?.description ?? firstAccept?.description ?? item.metadata?.description ?? null\n\n // Extract URL\n const url: string =\n item.url ??\n item.resource?.url ??\n (typeof item.resource === \"string\" ? item.resource : null) ??\n firstAccept?.resource ??\n \"\"\n\n return {\n url,\n description,\n price,\n accepts: normalizedAccepts,\n metadata: item.metadata ?? {},\n }\n}\n","// Create a payment-wrapped fetch from a private key + network\nexport { createPaymentFetch } from \"./payment-fetch.js\"\n\n// Public x402 convenience functions\nimport { probe } from \"./probe.js\"\nimport { discover } from \"./discover.js\"\nimport { formatPrice } from \"./format.js\"\n\nexport const x402 = {\n probe,\n discover,\n formatPrice,\n}\n\nexport type {\n ProbeResult,\n ProbeOptions,\n PaymentRequiredResponse,\n PaymentOption,\n BazaarService,\n DiscoverResult,\n DiscoverOptions,\n FormatPriceOptions,\n} from \"./types.js\"\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@auteng/agent-utils",
3
- "version": "0.3.0",
4
- "description": "Utility belt for autonomous AI agents — wallet, compute, and more",
3
+ "version": "1.0.0",
4
+ "description": "x402 payments and sandboxed compute for autonomous AI agents",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
7
7
  "types": "dist/index.d.ts",