@auteng/agent-utils 0.4.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/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # @auteng/agent-utils
2
2
 
3
- Utility belt for autonomous AI agents. Create crypto wallets, discover and pay for x402-enabled services, and run sandboxed compute — all with USDC on Base. No accounts, no KYC — just wallet addresses and USDC.
3
+ x402 payments and sandboxed compute for autonomous AI agents. Discover, probe, and pay for x402-enabled services, and run sandboxed compute — all with USDC on Base.
4
+
5
+ > **Wallet management** has moved to [`@auteng/pocket-money`](https://www.npmjs.com/package/@auteng/pocket-money). This package focuses on x402 protocol tools and compute. Agents can use any wallet — pocket-money, Coinbase Agentic Wallet, viem, ethers, or raw key management.
4
6
 
5
7
  ## Install
6
8
 
@@ -11,23 +13,16 @@ npm install @auteng/agent-utils
11
13
  ## Quick Start
12
14
 
13
15
  ```typescript
14
- import { wallet, x402, compute } from '@auteng/agent-utils';
16
+ import { x402, compute } from '@auteng/agent-utils';
15
17
 
16
18
  // Probe any URL to check if it's x402-enabled
17
19
  const info = await x402.probe('https://api.example.com/generate');
18
20
  console.log(info.price); // "$0.05 USDC on Base"
19
-
20
- // Create a wallet and pay for it
21
- const w = await wallet.create({ name: "my-task" });
22
- const res = await w.fetch('https://api.example.com/generate', {
23
- method: 'POST',
24
- body: JSON.stringify({ prompt: 'hello' }),
25
- });
26
21
  ```
27
22
 
28
23
  ## x402 — Discover & Inspect Services
29
24
 
30
- Standalone functions for working with x402 services. No wallet needed.
25
+ Standalone functions for working with x402 services.
31
26
 
32
27
  ### Probe a URL
33
28
 
@@ -68,74 +63,18 @@ x402.formatPrice("2000", "0x833589f...", "eip155:8453", { short: true });
68
63
  // → "$0.002 USDC"
69
64
  ```
70
65
 
71
- ## Wallets
72
-
73
- Each wallet is an independent keypair with its own address and balance. Create as many as you need — one per task, one per month, one per budget.
74
-
75
- ```typescript
76
- import { wallet } from '@auteng/agent-utils';
77
-
78
- const monthly = await wallet.create({ name: "feb-2026" });
79
- const task = await wallet.create({ name: "data-pipeline" });
80
- ```
81
-
82
- Wallets are persisted at `.auteng/wallets/<name>.json`. Creating a wallet that already exists loads it from disk.
83
-
84
- ### Check balance
85
-
86
- ```typescript
87
- const balance = await monthly.checkBalance();
88
- // Returns USDC in minor units (6 decimals)
89
- // 10_000000n = $10.00 USDC
90
- ```
91
-
92
- ### Wait for funding
93
-
94
- ```typescript
95
- await monthly.waitForFunding(10_000000n);
96
- // Polls Base every 10s until >= $10 USDC is available
97
- ```
98
-
99
- ### Pay any x402 service
100
-
101
- Drop-in `fetch()` replacement that handles x402 payments automatically:
102
-
103
- ```typescript
104
- const res = await monthly.fetch('https://any-x402-service.com/api', {
105
- method: 'POST',
106
- headers: { 'Content-Type': 'application/json' },
107
- body: JSON.stringify({ prompt: 'hello' }),
108
- });
109
- ```
110
-
111
- If the server returns `402 Payment Required`, the library signs an EIP-3009 authorization and retries with payment headers. No gas needed.
112
-
113
- ### Retrieve and list wallets
114
-
115
- ```typescript
116
- const w = wallet.get("feb-2026"); // load by name
117
- const all = wallet.list(); // list all wallets
118
-
119
- for (const w of all) {
120
- const bal = await w.checkBalance();
121
- console.log(`${w.name}: ${w.address} — ${bal} USDC`);
122
- }
123
- ```
124
-
125
66
  ## Compute (AutEng)
126
67
 
127
- Convenience wrapper for AutEng's x402 sandboxed compute service:
68
+ Convenience wrapper for AutEng's x402 sandboxed compute service. Accepts any object with a `fetch()` method as the wallet:
128
69
 
129
70
  ```typescript
130
- import { wallet, compute } from '@auteng/agent-utils';
131
-
132
- const w = await wallet.create({ name: "compute-budget" });
71
+ import { compute } from '@auteng/agent-utils';
133
72
 
134
73
  const result = await compute.run({
135
74
  code: 'print("hello world")',
136
75
  stack: 'python', // 'python' | 'node'
137
76
  size: 'small', // 'small' | 'med' | 'large'
138
- wallet: w,
77
+ wallet: myWallet, // any object with fetch()
139
78
  });
140
79
  console.log(result.stdout); // "hello world\n"
141
80
  ```
@@ -152,56 +91,12 @@ console.log(result.stdout); // "hello world\n"
152
91
  compute.pricing(); // returns full pricing table
153
92
  ```
154
93
 
155
- ## Demo
156
-
157
- Run the included demo to see wallet creation, funding, and compute in action:
158
-
159
- ```bash
160
- node demo.mjs
161
- ```
162
-
163
- ```
164
- ────────────────────────────────────────────────────────
165
- POCKET MONEY DEMO — autonomous compute with x402
166
- ────────────────────────────────────────────────────────
167
-
168
- Compute pricing:
169
- small → $0.002 base + $0.00005/s (2 vCPU, 1GB RAM)
170
- med → $0.008 base + $0.00012/s (4 vCPU, 4GB RAM)
171
- large → $0.03 base + $0.00025/s (8 vCPU, 16GB RAM)
172
-
173
- Wallet: "demo-compute"
174
- Address: 0x9cc8...e18
175
- Balance: $0.0000
176
- ────────────────────────────────────────────────────────
177
-
178
- Waiting for funds...
179
- Funded! New balance: $1.0000
180
- ────────────────────────────────────────────────────────
181
-
182
- Running compute jobs...
183
-
184
- ▸ Python — Fibonacci
185
- fib(50) = 12586269025
186
-
187
- ▸ Python — System info
188
- Python 3.12.12, Linux 6.1.158, x86_64, 2 CPUs
189
-
190
- ▸ Node — UUID generation
191
- f8b260ec-2dea-401b-b807-544f366a8588
192
- ...
193
-
194
- Spent: $0.0020
195
- ────────────────────────────────────────────────────────
196
- Done!
197
- ```
198
-
199
94
  ## Development
200
95
 
201
96
  ```bash
202
97
  npm install # install dependencies
203
98
  npm run build # build CJS/ESM/DTS to dist/
204
- npm test # run unit + integration tests
99
+ npm test # run tests
205
100
  npm run test:watch # run tests in watch mode
206
101
  ```
207
102
 
package/dist/index.d.mts CHANGED
@@ -1,82 +1,16 @@
1
- import { PrivateKeyAccount } from 'viem';
2
-
3
- type Network = "base" | "base-sepolia";
4
- interface CreateWalletOptions {
5
- /** Wallet identifier. Default: "default" */
6
- name?: string;
7
- /** Network to use. Default: `base` */
8
- network?: Network;
9
- /** Custom RPC endpoint. Default: public Base RPC */
10
- rpcUrl?: string;
11
- /** Base directory for wallet storage. Default: ".auteng/wallets" */
12
- walletsDir?: string;
13
- }
14
- /** @deprecated Use CreateWalletOptions instead */
15
- type WalletConfig = CreateWalletOptions;
16
- interface WaitForFundingOptions {
17
- /** Poll interval in milliseconds. Default: 10000 (10s) */
18
- pollInterval?: number;
19
- /** Timeout in milliseconds. Default: none (waits forever) */
20
- timeout?: number;
21
- }
22
-
23
- declare class Wallet {
24
- readonly name: string;
25
- readonly address: `0x${string}`;
26
- readonly network: Network;
27
- private _account;
28
- private _privateKey;
29
- private _rpcUrl;
30
- private _paymentFetch;
31
- constructor(params: {
32
- name: string;
33
- account: PrivateKeyAccount;
34
- privateKey: `0x${string}`;
35
- network: Network;
36
- rpcUrl?: string;
37
- paymentFetch: typeof globalThis.fetch;
38
- });
39
- /** Check USDC balance on Base. Returns balance in minor units (6 decimals). */
40
- checkBalance(): Promise<bigint>;
41
- /**
42
- * Poll until USDC balance >= minAmount.
43
- * @param minAmount - minimum USDC balance in minor units (6 decimals)
44
- */
45
- waitForFunding(minAmount: bigint, opts?: WaitForFundingOptions): Promise<void>;
46
- /**
47
- * Drop-in `fetch()` replacement that handles x402 payments automatically.
48
- * If the server returns 402, the library signs an EIP-3009 authorization
49
- * and retries the request with payment headers.
50
- */
51
- fetch(input: string | URL | Request, init?: RequestInit): Promise<Response>;
52
- }
53
-
54
- declare const wallet: {
55
- /**
56
- * Create a new named wallet or load an existing one from disk.
57
- * Idempotent: if a wallet with this name already exists, returns it.
58
- */
59
- create(opts?: CreateWalletOptions): Promise<Wallet>;
60
- /**
61
- * Retrieve a previously-created wallet by name.
62
- * Loads from disk if not in memory. Throws if not found.
63
- */
64
- get(name: string): Wallet;
65
- /** List all persisted wallets. */
66
- list(): Wallet[];
67
- /** @internal Clear in-memory cache and reset wallets dir. For testing only. */
68
- _reset(): void;
69
- };
70
-
71
1
  type Stack = "python" | "node";
72
2
  type Size = "small" | "med" | "large";
3
+ /** Any object with a fetch method — pocket-money Wallet, custom wrapper, etc. */
4
+ interface ComputeWallet {
5
+ fetch(input: string | URL | Request, init?: RequestInit): Promise<Response>;
6
+ }
73
7
  interface ComputeRequest {
74
8
  /** The code to execute */
75
9
  code: string;
76
10
  /** Runtime stack: 'python' (3.14) or 'node' (24 LTS) */
77
11
  stack: Stack;
78
- /** The wallet to pay from */
79
- wallet: Wallet;
12
+ /** The wallet to pay from — any object with a fetch() method */
13
+ wallet: ComputeWallet;
80
14
  /** Sandbox size. Default: 'small' */
81
15
  size?: Size;
82
16
  /** Execution timeout in seconds. Default: per-size default */
@@ -114,6 +48,7 @@ declare const compute: {
114
48
  setEndpoint(url: string): void;
115
49
  };
116
50
 
51
+ type Network = "base" | "base-sepolia";
117
52
  /** A single accepted payment option from a 402 response. */
118
53
  interface PaymentOption {
119
54
  scheme: string;
@@ -230,4 +165,4 @@ declare const x402: {
230
165
  formatPrice: typeof formatPrice;
231
166
  };
232
167
 
233
- export { type BazaarService, type ComputeRequest, type ComputeResponse, type CreateWalletOptions, type DiscoverOptions, type DiscoverResult, type FormatPriceOptions, type Network, type PaymentOption, type PaymentRequiredResponse, type PricingTier, type ProbeOptions, type ProbeResult, type Size, type Stack, type WaitForFundingOptions, Wallet, type WalletConfig, compute, wallet, x402 };
168
+ export { type BazaarService, type ComputeRequest, type ComputeResponse, type ComputeWallet, type DiscoverOptions, type DiscoverResult, type FormatPriceOptions, type Network, type PaymentOption, type PaymentRequiredResponse, type PricingTier, type ProbeOptions, type ProbeResult, type Size, type Stack, compute, x402 };
package/dist/index.d.ts CHANGED
@@ -1,82 +1,16 @@
1
- import { PrivateKeyAccount } from 'viem';
2
-
3
- type Network = "base" | "base-sepolia";
4
- interface CreateWalletOptions {
5
- /** Wallet identifier. Default: "default" */
6
- name?: string;
7
- /** Network to use. Default: `base` */
8
- network?: Network;
9
- /** Custom RPC endpoint. Default: public Base RPC */
10
- rpcUrl?: string;
11
- /** Base directory for wallet storage. Default: ".auteng/wallets" */
12
- walletsDir?: string;
13
- }
14
- /** @deprecated Use CreateWalletOptions instead */
15
- type WalletConfig = CreateWalletOptions;
16
- interface WaitForFundingOptions {
17
- /** Poll interval in milliseconds. Default: 10000 (10s) */
18
- pollInterval?: number;
19
- /** Timeout in milliseconds. Default: none (waits forever) */
20
- timeout?: number;
21
- }
22
-
23
- declare class Wallet {
24
- readonly name: string;
25
- readonly address: `0x${string}`;
26
- readonly network: Network;
27
- private _account;
28
- private _privateKey;
29
- private _rpcUrl;
30
- private _paymentFetch;
31
- constructor(params: {
32
- name: string;
33
- account: PrivateKeyAccount;
34
- privateKey: `0x${string}`;
35
- network: Network;
36
- rpcUrl?: string;
37
- paymentFetch: typeof globalThis.fetch;
38
- });
39
- /** Check USDC balance on Base. Returns balance in minor units (6 decimals). */
40
- checkBalance(): Promise<bigint>;
41
- /**
42
- * Poll until USDC balance >= minAmount.
43
- * @param minAmount - minimum USDC balance in minor units (6 decimals)
44
- */
45
- waitForFunding(minAmount: bigint, opts?: WaitForFundingOptions): Promise<void>;
46
- /**
47
- * Drop-in `fetch()` replacement that handles x402 payments automatically.
48
- * If the server returns 402, the library signs an EIP-3009 authorization
49
- * and retries the request with payment headers.
50
- */
51
- fetch(input: string | URL | Request, init?: RequestInit): Promise<Response>;
52
- }
53
-
54
- declare const wallet: {
55
- /**
56
- * Create a new named wallet or load an existing one from disk.
57
- * Idempotent: if a wallet with this name already exists, returns it.
58
- */
59
- create(opts?: CreateWalletOptions): Promise<Wallet>;
60
- /**
61
- * Retrieve a previously-created wallet by name.
62
- * Loads from disk if not in memory. Throws if not found.
63
- */
64
- get(name: string): Wallet;
65
- /** List all persisted wallets. */
66
- list(): Wallet[];
67
- /** @internal Clear in-memory cache and reset wallets dir. For testing only. */
68
- _reset(): void;
69
- };
70
-
71
1
  type Stack = "python" | "node";
72
2
  type Size = "small" | "med" | "large";
3
+ /** Any object with a fetch method — pocket-money Wallet, custom wrapper, etc. */
4
+ interface ComputeWallet {
5
+ fetch(input: string | URL | Request, init?: RequestInit): Promise<Response>;
6
+ }
73
7
  interface ComputeRequest {
74
8
  /** The code to execute */
75
9
  code: string;
76
10
  /** Runtime stack: 'python' (3.14) or 'node' (24 LTS) */
77
11
  stack: Stack;
78
- /** The wallet to pay from */
79
- wallet: Wallet;
12
+ /** The wallet to pay from — any object with a fetch() method */
13
+ wallet: ComputeWallet;
80
14
  /** Sandbox size. Default: 'small' */
81
15
  size?: Size;
82
16
  /** Execution timeout in seconds. Default: per-size default */
@@ -114,6 +48,7 @@ declare const compute: {
114
48
  setEndpoint(url: string): void;
115
49
  };
116
50
 
51
+ type Network = "base" | "base-sepolia";
117
52
  /** A single accepted payment option from a 402 response. */
118
53
  interface PaymentOption {
119
54
  scheme: string;
@@ -230,4 +165,4 @@ declare const x402: {
230
165
  formatPrice: typeof formatPrice;
231
166
  };
232
167
 
233
- export { type BazaarService, type ComputeRequest, type ComputeResponse, type CreateWalletOptions, type DiscoverOptions, type DiscoverResult, type FormatPriceOptions, type Network, type PaymentOption, type PaymentRequiredResponse, type PricingTier, type ProbeOptions, type ProbeResult, type Size, type Stack, type WaitForFundingOptions, Wallet, type WalletConfig, compute, wallet, x402 };
168
+ export { type BazaarService, type ComputeRequest, type ComputeResponse, type ComputeWallet, type DiscoverOptions, type DiscoverResult, type FormatPriceOptions, type Network, type PaymentOption, type PaymentRequiredResponse, type PricingTier, type ProbeOptions, type ProbeResult, type Size, type Stack, compute, x402 };
package/dist/index.js CHANGED
@@ -20,260 +20,11 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.ts
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
- Wallet: () => Wallet,
24
23
  compute: () => compute,
25
- wallet: () => wallet,
26
24
  x402: () => x402
27
25
  });
28
26
  module.exports = __toCommonJS(index_exports);
29
27
 
30
- // src/wallet/index.ts
31
- var import_node_path2 = require("path");
32
-
33
- // src/wallet/keypair.ts
34
- var import_accounts = require("viem/accounts");
35
- function createKeypair() {
36
- const privateKey = (0, import_accounts.generatePrivateKey)();
37
- const account = (0, import_accounts.privateKeyToAccount)(privateKey);
38
- return { privateKey, account };
39
- }
40
- function loadKeypair(privateKey) {
41
- const account = (0, import_accounts.privateKeyToAccount)(privateKey);
42
- return { account };
43
- }
44
-
45
- // src/wallet/storage.ts
46
- var import_node_fs = require("fs");
47
- var import_node_path = require("path");
48
- var VALID_NAME = /^[a-z0-9_-]+$/;
49
- function validateWalletName(name) {
50
- if (!VALID_NAME.test(name)) {
51
- throw new Error(`Invalid wallet name "${name}". Use lowercase letters, numbers, hyphens, and underscores only.`);
52
- }
53
- }
54
- function readWalletFile(path) {
55
- if (!(0, import_node_fs.existsSync)(path)) return null;
56
- const raw = (0, import_node_fs.readFileSync)(path, "utf-8");
57
- return JSON.parse(raw);
58
- }
59
- function writeWalletFile(path, data) {
60
- (0, import_node_fs.mkdirSync)((0, import_node_path.dirname)(path), { recursive: true });
61
- (0, import_node_fs.writeFileSync)(path, JSON.stringify(data, null, 2) + "\n", {
62
- mode: 384
63
- });
64
- }
65
- function listWalletFiles(dir) {
66
- const resolved = (0, import_node_path.resolve)(dir);
67
- if (!(0, import_node_fs.existsSync)(resolved)) return [];
68
- return (0, import_node_fs.readdirSync)(resolved).filter((f) => f.endsWith(".json")).map((f) => f.replace(/\.json$/, ""));
69
- }
70
- function migrateLegacyWallet(walletsDir) {
71
- const legacyPath = (0, import_node_path.resolve)(walletsDir, "..", "wallet.json");
72
- const newPath = (0, import_node_path.join)((0, import_node_path.resolve)(walletsDir), "default.json");
73
- if ((0, import_node_fs.existsSync)(legacyPath) && !(0, import_node_fs.existsSync)(newPath)) {
74
- const data = readWalletFile(legacyPath);
75
- if (data) {
76
- (0, import_node_fs.mkdirSync)((0, import_node_path.resolve)(walletsDir), { recursive: true });
77
- (0, import_node_fs.copyFileSync)(legacyPath, newPath);
78
- return data;
79
- }
80
- }
81
- return null;
82
- }
83
-
84
- // src/x402/payment-fetch.ts
85
- var import_client = require("@x402/core/client");
86
- var import_client2 = require("@x402/evm/exact/client");
87
- var import_evm = require("@x402/evm");
88
- var import_fetch = require("@x402/fetch");
89
- var import_accounts2 = require("viem/accounts");
90
- var import_viem = require("viem");
91
- var import_chains = require("viem/chains");
92
- function createPaymentFetch(privateKey, network = "base", rpcUrl) {
93
- const account = (0, import_accounts2.privateKeyToAccount)(privateKey);
94
- const chain = network === "base" ? import_chains.base : import_chains.baseSepolia;
95
- const publicClient = (0, import_viem.createPublicClient)({
96
- chain,
97
- transport: (0, import_viem.http)(rpcUrl)
98
- });
99
- const signer = (0, import_evm.toClientEvmSigner)(account, publicClient);
100
- const client = new import_client.x402Client();
101
- (0, import_client2.registerExactEvmScheme)(client, { signer });
102
- return (0, import_fetch.wrapFetchWithPayment)(fetch, client);
103
- }
104
-
105
- // src/wallet/types.ts
106
- var NETWORK_CONFIG = {
107
- base: {
108
- chainId: 8453,
109
- usdcAddress: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
110
- rpcUrl: "https://mainnet.base.org"
111
- },
112
- "base-sepolia": {
113
- chainId: 84532,
114
- usdcAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
115
- rpcUrl: "https://sepolia.base.org"
116
- }
117
- };
118
-
119
- // src/wallet/balance.ts
120
- async function getUsdcBalance(address, network, rpcUrl) {
121
- const config = NETWORK_CONFIG[network];
122
- const url = rpcUrl ?? config.rpcUrl;
123
- const paddedAddress = address.slice(2).toLowerCase().padStart(64, "0");
124
- const data = `0x70a08231${paddedAddress}`;
125
- const res = await fetch(url, {
126
- method: "POST",
127
- headers: { "Content-Type": "application/json" },
128
- body: JSON.stringify({
129
- jsonrpc: "2.0",
130
- id: 1,
131
- method: "eth_call",
132
- params: [{ to: config.usdcAddress, data }, "latest"]
133
- })
134
- });
135
- const json = await res.json();
136
- if (json.error) {
137
- throw new Error(`RPC error: ${JSON.stringify(json.error)}`);
138
- }
139
- return BigInt(json.result ?? "0x0");
140
- }
141
-
142
- // src/wallet/wallet.ts
143
- var Wallet = class {
144
- name;
145
- address;
146
- network;
147
- _account;
148
- _privateKey;
149
- _rpcUrl;
150
- _paymentFetch;
151
- constructor(params) {
152
- this.name = params.name;
153
- this._account = params.account;
154
- this._privateKey = params.privateKey;
155
- this.address = params.account.address;
156
- this.network = params.network;
157
- this._rpcUrl = params.rpcUrl;
158
- this._paymentFetch = params.paymentFetch;
159
- }
160
- /** Check USDC balance on Base. Returns balance in minor units (6 decimals). */
161
- async checkBalance() {
162
- return getUsdcBalance(this._account.address, this.network, this._rpcUrl);
163
- }
164
- /**
165
- * Poll until USDC balance >= minAmount.
166
- * @param minAmount - minimum USDC balance in minor units (6 decimals)
167
- */
168
- async waitForFunding(minAmount, opts) {
169
- const interval = opts?.pollInterval ?? 1e4;
170
- const deadline = opts?.timeout ? Date.now() + opts.timeout : null;
171
- while (true) {
172
- const balance = await getUsdcBalance(this._account.address, this.network, this._rpcUrl);
173
- if (balance >= minAmount) return;
174
- if (deadline && Date.now() >= deadline) {
175
- throw new Error(`Funding timeout: balance ${balance} < required ${minAmount}`);
176
- }
177
- await new Promise((r) => setTimeout(r, interval));
178
- }
179
- }
180
- /**
181
- * Drop-in `fetch()` replacement that handles x402 payments automatically.
182
- * If the server returns 402, the library signs an EIP-3009 authorization
183
- * and retries the request with payment headers.
184
- */
185
- async fetch(input, init) {
186
- return this._paymentFetch(input, init);
187
- }
188
- };
189
-
190
- // src/wallet/index.ts
191
- var DEFAULT_WALLETS_DIR = ".auteng/wallets";
192
- var _wallets = /* @__PURE__ */ new Map();
193
- var _walletsDir = (0, import_node_path2.resolve)(DEFAULT_WALLETS_DIR);
194
- var wallet = {
195
- /**
196
- * Create a new named wallet or load an existing one from disk.
197
- * Idempotent: if a wallet with this name already exists, returns it.
198
- */
199
- async create(opts) {
200
- const name = opts?.name ?? "default";
201
- validateWalletName(name);
202
- if (_wallets.has(name)) return _wallets.get(name);
203
- const dir = (0, import_node_path2.resolve)(opts?.walletsDir ?? DEFAULT_WALLETS_DIR);
204
- _walletsDir = dir;
205
- const filePath = (0, import_node_path2.join)(dir, `${name}.json`);
206
- const network = opts?.network ?? "base";
207
- const rpcUrl = opts?.rpcUrl;
208
- let existing = readWalletFile(filePath);
209
- if (!existing && name === "default") {
210
- existing = migrateLegacyWallet(dir);
211
- }
212
- let privateKey;
213
- let account;
214
- if (existing) {
215
- privateKey = existing.privateKey;
216
- account = loadKeypair(existing.privateKey).account;
217
- } else {
218
- const kp = createKeypair();
219
- privateKey = kp.privateKey;
220
- account = kp.account;
221
- writeWalletFile(filePath, {
222
- privateKey,
223
- address: account.address,
224
- network
225
- });
226
- }
227
- const effectiveNetwork = existing?.network ?? network;
228
- const paymentFetch = createPaymentFetch(privateKey, effectiveNetwork, rpcUrl);
229
- const w = new Wallet({
230
- name,
231
- account,
232
- privateKey,
233
- network: effectiveNetwork,
234
- rpcUrl,
235
- paymentFetch
236
- });
237
- _wallets.set(name, w);
238
- return w;
239
- },
240
- /**
241
- * Retrieve a previously-created wallet by name.
242
- * Loads from disk if not in memory. Throws if not found.
243
- */
244
- get(name) {
245
- validateWalletName(name);
246
- if (_wallets.has(name)) return _wallets.get(name);
247
- const filePath = (0, import_node_path2.join)(_walletsDir, `${name}.json`);
248
- const data = readWalletFile(filePath);
249
- if (!data) throw new Error(`Wallet "${name}" not found`);
250
- const { account } = loadKeypair(data.privateKey);
251
- const paymentFetch = createPaymentFetch(data.privateKey, data.network);
252
- const w = new Wallet({
253
- name,
254
- account,
255
- privateKey: data.privateKey,
256
- network: data.network,
257
- paymentFetch
258
- });
259
- _wallets.set(name, w);
260
- return w;
261
- },
262
- /** List all persisted wallets. */
263
- list() {
264
- const names = listWalletFiles(_walletsDir);
265
- return names.map((n) => {
266
- if (_wallets.has(n)) return _wallets.get(n);
267
- return wallet.get(n);
268
- });
269
- },
270
- /** @internal Clear in-memory cache and reset wallets dir. For testing only. */
271
- _reset() {
272
- _wallets.clear();
273
- _walletsDir = (0, import_node_path2.resolve)(DEFAULT_WALLETS_DIR);
274
- }
275
- };
276
-
277
28
  // src/compute/index.ts
278
29
  var DEFAULT_ENDPOINT = "https://x402.auteng.ai/api/x402/compute";
279
30
  var _endpoint = DEFAULT_ENDPOINT;
@@ -351,6 +102,15 @@ var compute = {
351
102
  }
352
103
  };
353
104
 
105
+ // src/x402/payment-fetch.ts
106
+ var import_client = require("@x402/core/client");
107
+ var import_client2 = require("@x402/evm/exact/client");
108
+ var import_evm = require("@x402/evm");
109
+ var import_fetch = require("@x402/fetch");
110
+ var import_accounts = require("viem/accounts");
111
+ var import_viem = require("viem");
112
+ var import_chains = require("viem/chains");
113
+
354
114
  // src/x402/format.ts
355
115
  var KNOWN_ASSETS = {
356
116
  // USDC on Base mainnet
@@ -361,7 +121,7 @@ var KNOWN_ASSETS = {
361
121
  var NETWORK_NAMES = {
362
122
  "eip155:8453": "Base",
363
123
  "eip155:84532": "Base Sepolia",
364
- "base": "Base",
124
+ base: "Base",
365
125
  "base-sepolia": "Base Sepolia"
366
126
  };
367
127
  function formatPrice(amount, asset, network, options) {
@@ -430,10 +190,12 @@ function normalizePaymentRequired(raw) {
430
190
  description: firstAccept.description ?? raw.resource?.description,
431
191
  mimeType: firstAccept.mimeType ?? raw.resource?.mimeType
432
192
  },
433
- accepts: raw.accepts.map((a) => normalizeAccept({
434
- ...a,
435
- amount: a.maxAmountRequired
436
- })),
193
+ accepts: raw.accepts.map(
194
+ (a) => normalizeAccept({
195
+ ...a,
196
+ amount: a.maxAmountRequired
197
+ })
198
+ ),
437
199
  extensions: raw.extensions ?? void 0
438
200
  };
439
201
  }
@@ -491,9 +253,7 @@ function normalizeBazaarItem(item) {
491
253
  extra: accept.extra ?? void 0
492
254
  };
493
255
  });
494
- const cheapest = normalizedAccepts.reduce(
495
- (min, a) => BigInt(a.amount) < BigInt(min.amount) ? a : min
496
- );
256
+ const cheapest = normalizedAccepts.reduce((min, a) => BigInt(a.amount) < BigInt(min.amount) ? a : min);
497
257
  const price = formatPrice(cheapest.amount, cheapest.asset, cheapest.network);
498
258
  const firstAccept = accepts[0];
499
259
  const description = item.description ?? item.resource?.description ?? firstAccept?.description ?? item.metadata?.description ?? null;
@@ -515,9 +275,7 @@ var x402 = {
515
275
  };
516
276
  // Annotate the CommonJS export names for ESM import in node:
517
277
  0 && (module.exports = {
518
- Wallet,
519
278
  compute,
520
- wallet,
521
279
  x402
522
280
  });
523
281
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/wallet/index.ts","../src/wallet/keypair.ts","../src/wallet/storage.ts","../src/x402/payment-fetch.ts","../src/wallet/types.ts","../src/wallet/balance.ts","../src/wallet/wallet.ts","../src/compute/index.ts","../src/x402/format.ts","../src/x402/probe.ts","../src/x402/discover.ts","../src/x402/index.ts"],"sourcesContent":["export { wallet } from \"./wallet/index.js\"\nexport { Wallet } from \"./wallet/wallet.js\"\nexport { compute } from \"./compute/index.js\"\nexport { x402 } from \"./x402/index.js\"\n\nexport type { CreateWalletOptions, WalletConfig, WaitForFundingOptions, Network } from \"./wallet/types.js\"\nexport type { ComputeRequest, ComputeResponse, PricingTier, Stack, Size } from \"./compute/types.js\"\nexport type {\n ProbeResult,\n ProbeOptions,\n PaymentRequiredResponse,\n PaymentOption,\n BazaarService,\n DiscoverResult,\n DiscoverOptions,\n FormatPriceOptions,\n} from \"./x402/types.js\"\n","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/payment-fetch.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","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(\n amount: string,\n asset: string,\n network: string,\n options?: FormatPriceOptions,\n): 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>) => normalizeAccept({\n ...a,\n amount: a.maxAmountRequired,\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) =>\n BigInt(a.amount) < BigInt(min.amount) ? a : min\n )\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 ??\n item.resource?.description ??\n firstAccept?.description ??\n item.metadata?.description ??\n 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","// Internal — used by wallet module\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":["import_node_path","import_client","import_accounts"]}
1
+ {"version":3,"sources":["../src/index.ts","../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":["export { compute } from \"./compute/index.js\"\nexport { x402 } from \"./x402/index.js\"\n\nexport type { ComputeRequest, ComputeResponse, ComputeWallet, PricingTier, Stack, Size } from \"./compute/types.js\"\nexport type {\n Network,\n ProbeResult,\n ProbeOptions,\n PaymentRequiredResponse,\n PaymentOption,\n BazaarService,\n DiscoverResult,\n DiscoverOptions,\n FormatPriceOptions,\n} from \"./x402/types.js\"\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","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":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,IAAM,mBAAmB;AAEzB,IAAI,YAAY;AAEhB,IAAM,UAAqC;AAAA,EACzC,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,EAClB;AAAA,EACA,KAAK;AAAA,IACH,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,EAClB;AACF;AAEO,IAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,EAKrB,MAAM,IAAI,SAAmD;AAC3D,QAAI,CAAC,QAAQ,MAAM;AACjB,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AACA,QAAI,CAAC,QAAQ,OAAO;AAClB,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AAEA,UAAM,OAAO;AAAA,MACX,MAAM,QAAQ;AAAA,MACd,OAAO,QAAQ;AAAA,MACf,MAAM,QAAQ,QAAQ;AAAA,MACtB,GAAI,QAAQ,mBAAmB,QAAQ;AAAA,QACrC,iBAAiB,QAAQ;AAAA,MAC3B;AAAA,MACA,GAAI,QAAQ,SAAS,QAAQ,EAAE,OAAO,QAAQ,MAAM;AAAA,IACtD;AAEA,QAAI,CAAC,QAAQ,QAAQ;AACnB,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AAEA,UAAM,WAAW,MAAM,QAAQ,OAAO,MAAM,WAAW;AAAA,MACrD,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AACjD,YAAM,IAAI,MAAM,2BAA2B,SAAS,MAAM,MAAM,IAAI,EAAE;AAAA,IACxE;AAEA,WAAQ,MAAM,SAAS,KAAK;AAAA,EAC9B;AAAA;AAAA,EAGA,UAAqC;AACnC,WAAO,EAAE,GAAG,QAAQ;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,KAAmB;AAC7B,gBAAY;AAAA,EACd;AACF;;;ACtFA,oBAA2B;AAC3B,IAAAA,iBAAuC;AACvC,iBAAkC;AAClC,mBAAqC;AACrC,sBAAoC;AACpC,kBAAyC;AACzC,oBAAkC;;;ACJlC,IAAM,eAAqF;AAAA;AAAA,EAEzF,8CAA8C,EAAE,QAAQ,QAAQ,UAAU,GAAG,QAAQ,IAAI;AAAA;AAAA,EAEzF,8CAA8C,EAAE,QAAQ,QAAQ,UAAU,GAAG,QAAQ,IAAI;AAC3F;AAEA,IAAM,gBAAwC;AAAA,EAC5C,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,MAAM;AAAA,EACN,gBAAgB;AAClB;AAYO,SAAS,YAAY,QAAgB,OAAe,SAAiB,SAAsC;AAChH,QAAM,QAAQ,aAAa,MAAM,YAAY,CAAC;AAC9C,QAAM,cAAc,cAAc,OAAO;AAEzC,MAAI,OAAO;AACT,UAAM,QAAQ,OAAO,MAAM,IAAI,MAAM,MAAM;AAC3C,UAAM,YAAY,GAAG,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,MAAM;AACzD,QAAI,SAAS,SAAS,CAAC,YAAa,QAAO;AAC3C,WAAO,GAAG,SAAS,OAAO,WAAW;AAAA,EACvC;AAGA,QAAM,aAAa,GAAG,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,MAAM,MAAM,EAAE,CAAC;AAC5D,QAAM,MAAM,GAAG,MAAM,IAAI,UAAU;AACnC,MAAI,SAAS,SAAS,CAAC,YAAa,QAAO;AAC3C,SAAO,GAAG,GAAG,OAAO,WAAW;AACjC;;;AC9BA,eAAsB,MAAM,KAAa,SAA8C;AACrF,QAAM,MAAM,MAAM,MAAM,KAAK;AAAA,IAC3B,QAAQ,SAAS,UAAU;AAAA,IAC3B,SAAS,SAAS;AAAA,IAClB,MAAM,SAAS;AAAA,IACf,QAAQ,SAAS;AAAA,EACnB,CAAC;AAED,MAAI,IAAI,WAAW,KAAK;AACtB,WAAO,EAAE,SAAS,OAAO,KAAK,QAAQ,IAAI,QAAQ,OAAO,MAAM,iBAAiB,KAAK;AAAA,EACvF;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,IAAI,KAAK;AAAA,EACvB,QAAQ;AACN,WAAO,EAAE,SAAS,OAAO,KAAK,QAAQ,KAAK,OAAO,MAAM,iBAAiB,KAAK;AAAA,EAChF;AAEA,QAAM,kBAAkB,yBAAyB,GAAG;AACpD,MAAI,CAAC,mBAAmB,gBAAgB,QAAQ,WAAW,GAAG;AAC5D,WAAO,EAAE,SAAS,OAAO,KAAK,QAAQ,KAAK,OAAO,MAAM,iBAAiB,KAAK;AAAA,EAChF;AAEA,QAAM,QAAQ,gBAAgB,QAAQ,CAAC;AACvC,QAAM,QAAQ,YAAY,MAAM,QAAQ,MAAM,OAAO,MAAM,OAAO;AAElE,SAAO,EAAE,SAAS,MAAM,KAAK,QAAQ,KAAK,OAAO,gBAAgB;AACnE;AAGA,SAAS,yBAAyB,KAA0C;AAC1E,MAAI,CAAC,OAAO,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,IAAI,OAAO,KAAK,IAAI,QAAQ,WAAW,GAAG;AAC9F,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,IAAI,QAAQ,CAAC;AAIjC,QAAM,OAAO,OAAO,YAAY,WAAW,YAAY,IAAI,YAAY,OAAO,IAAI,aAAa;AAE/F,MAAI,MAAM;AACR,WAAO;AAAA,MACL,aAAa,IAAI,eAAe;AAAA,MAChC,UAAU;AAAA,QACR,KAAK,IAAI,SAAS,OAAO;AAAA,QACzB,aAAa,IAAI,SAAS;AAAA,QAC1B,UAAU,IAAI,SAAS;AAAA,MACzB;AAAA,MACA,SAAS,IAAI,QAAQ,IAAI,eAAe;AAAA,MACxC,YAAY,IAAI,cAAc;AAAA,IAChC;AAAA,EACF;AAGA,MAAI,OAAO,YAAY,sBAAsB,UAAU;AACrD,WAAO;AAAA,MACL,aAAa,IAAI,eAAe;AAAA,MAChC,UAAU;AAAA,QACR,KAAK,YAAY,YAAY,IAAI,UAAU,OAAO;AAAA,QAClD,aAAa,YAAY,eAAe,IAAI,UAAU;AAAA,QACtD,UAAU,YAAY,YAAY,IAAI,UAAU;AAAA,MAClD;AAAA,MACA,SAAS,IAAI,QAAQ;AAAA,QAAI,CAAC,MACxB,gBAAgB;AAAA,UACd,GAAG;AAAA,UACH,QAAQ,EAAE;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,MACA,YAAY,IAAI,cAAc;AAAA,IAChC;AAAA,EACF;AAEA,SAAO;AACT;AAGA,SAAS,gBAAgB,GAAuB;AAC9C,SAAO;AAAA,IACL,QAAQ,EAAE,UAAU;AAAA,IACpB,SAAS,EAAE,WAAW;AAAA,IACtB,OAAO,EAAE,SAAS;AAAA,IAClB,QAAQ,OAAO,EAAE,UAAU,EAAE,qBAAqB,GAAG;AAAA,IACrD,OAAO,EAAE,SAAS;AAAA,IAClB,mBAAmB,EAAE,qBAAqB;AAAA,IAC1C,OAAO,EAAE,SAAS;AAAA,EACpB;AACF;;;ACjGA,IAAM,qBAAqB;AAU3B,eAAsB,SAAS,SAAoD;AACjF,QAAM,UAAU,SAAS,aAAa;AACtC,QAAM,SAAS,IAAI,gBAAgB;AACnC,MAAI,SAAS,SAAS,KAAM,QAAO,IAAI,SAAS,OAAO,QAAQ,KAAK,CAAC;AACrE,MAAI,SAAS,UAAU,KAAM,QAAO,IAAI,UAAU,OAAO,QAAQ,MAAM,CAAC;AAExE,QAAM,MAAM,OAAO,SAAS,IAAI,GAAG,OAAO,IAAI,MAAM,KAAK;AAEzD,QAAM,MAAM,MAAM,MAAM,KAAK;AAAA,IAC3B,SAAS,EAAE,QAAQ,mBAAmB;AAAA,IACtC,QAAQ,SAAS;AAAA,EACnB,CAAC;AAED,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,UAAM,IAAI,MAAM,0BAA0B,IAAI,MAAM,MAAM,IAAI,EAAE;AAAA,EAClE;AAGA,QAAM,OAAQ,MAAM,IAAI,KAAK;AAG7B,QAAM,QAAmB,KAAK,SAAS,KAAK,aAAa,CAAC;AAE1D,QAAM,WAA4B,MAAM,IAAI,mBAAmB,EAAE,OAAO,OAAO;AAE/E,SAAO;AAAA,IACL;AAAA,IACA,OAAO,KAAK,SAAS,KAAK,cAAc,SAAS;AAAA,EACnD;AACF;AAGA,SAAS,oBAAoB,MAAiC;AAC5D,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAE9C,QAAM,UAAqB,KAAK,WAAW,CAAC;AAC5C,MAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,QAAM,oBAAqC,QAAQ,IAAI,CAAC,MAAe;AAErE,UAAM,SAAS;AACf,WAAO;AAAA,MACL,QAAQ,OAAO,UAAU;AAAA,MACzB,SAAS,OAAO,WAAW;AAAA,MAC3B,OAAO,OAAO,SAAS;AAAA,MACvB,QAAQ,OAAO,OAAO,UAAU,OAAO,qBAAqB,GAAG;AAAA,MAC/D,OAAO,OAAO,SAAS;AAAA,MACvB,mBAAmB,OAAO,qBAAqB;AAAA,MAC/C,OAAO,OAAO,SAAS;AAAA,IACzB;AAAA,EACF,CAAC;AAGD,QAAM,WAAW,kBAAkB,OAAO,CAAC,KAAK,MAAO,OAAO,EAAE,MAAM,IAAI,OAAO,IAAI,MAAM,IAAI,IAAI,GAAI;AACvG,QAAM,QAAQ,YAAY,SAAS,QAAQ,SAAS,OAAO,SAAS,OAAO;AAI3E,QAAM,cAAc,QAAQ,CAAC;AAC7B,QAAM,cACJ,KAAK,eAAe,KAAK,UAAU,eAAe,aAAa,eAAe,KAAK,UAAU,eAAe;AAG9G,QAAM,MACJ,KAAK,OACL,KAAK,UAAU,QACd,OAAO,KAAK,aAAa,WAAW,KAAK,WAAW,SACrD,aAAa,YACb;AAEF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,UAAU,KAAK,YAAY,CAAC;AAAA,EAC9B;AACF;;;ACnFO,IAAM,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AACF;","names":["import_client"]}
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/payment-fetch.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;
@@ -322,6 +75,15 @@ var compute = {
322
75
  }
323
76
  };
324
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
+
325
87
  // src/x402/format.ts
326
88
  var KNOWN_ASSETS = {
327
89
  // USDC on Base mainnet
@@ -332,7 +94,7 @@ var KNOWN_ASSETS = {
332
94
  var NETWORK_NAMES = {
333
95
  "eip155:8453": "Base",
334
96
  "eip155:84532": "Base Sepolia",
335
- "base": "Base",
97
+ base: "Base",
336
98
  "base-sepolia": "Base Sepolia"
337
99
  };
338
100
  function formatPrice(amount, asset, network, options) {
@@ -401,10 +163,12 @@ function normalizePaymentRequired(raw) {
401
163
  description: firstAccept.description ?? raw.resource?.description,
402
164
  mimeType: firstAccept.mimeType ?? raw.resource?.mimeType
403
165
  },
404
- accepts: raw.accepts.map((a) => normalizeAccept({
405
- ...a,
406
- amount: a.maxAmountRequired
407
- })),
166
+ accepts: raw.accepts.map(
167
+ (a) => normalizeAccept({
168
+ ...a,
169
+ amount: a.maxAmountRequired
170
+ })
171
+ ),
408
172
  extensions: raw.extensions ?? void 0
409
173
  };
410
174
  }
@@ -462,9 +226,7 @@ function normalizeBazaarItem(item) {
462
226
  extra: accept.extra ?? void 0
463
227
  };
464
228
  });
465
- const cheapest = normalizedAccepts.reduce(
466
- (min, a) => BigInt(a.amount) < BigInt(min.amount) ? a : min
467
- );
229
+ const cheapest = normalizedAccepts.reduce((min, a) => BigInt(a.amount) < BigInt(min.amount) ? a : min);
468
230
  const price = formatPrice(cheapest.amount, cheapest.asset, cheapest.network);
469
231
  const firstAccept = accepts[0];
470
232
  const description = item.description ?? item.resource?.description ?? firstAccept?.description ?? item.metadata?.description ?? null;
@@ -485,9 +247,7 @@ var x402 = {
485
247
  formatPrice
486
248
  };
487
249
  export {
488
- Wallet,
489
250
  compute,
490
- wallet,
491
251
  x402
492
252
  };
493
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/payment-fetch.ts","../src/wallet/types.ts","../src/wallet/balance.ts","../src/wallet/wallet.ts","../src/compute/index.ts","../src/x402/format.ts","../src/x402/probe.ts","../src/x402/discover.ts","../src/x402/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/payment-fetch.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","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(\n amount: string,\n asset: string,\n network: string,\n options?: FormatPriceOptions,\n): 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>) => normalizeAccept({\n ...a,\n amount: a.maxAmountRequired,\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) =>\n BigInt(a.amount) < BigInt(min.amount) ? a : min\n )\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 ??\n item.resource?.description ??\n firstAccept?.description ??\n item.metadata?.description ??\n 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","// Internal — used by wallet module\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":["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.4.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",