@asgcard/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +101 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.js +365 -0
- package/dist/index.js.map +1 -0
- package/dist/wallet-client.d.ts +67 -0
- package/dist/wallet-client.js +97 -0
- package/dist/wallet-client.js.map +1 -0
- package/package.json +52 -0
package/README.md
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# @asgcard/cli
|
|
2
|
+
|
|
3
|
+
Command-line interface for [ASG Card](https://asgcard.dev) — manage virtual MasterCard cards for AI agents from your terminal.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @asgcard/cli
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# 1. Configure your Stellar wallet
|
|
15
|
+
asgcard login
|
|
16
|
+
|
|
17
|
+
# 2. View pricing
|
|
18
|
+
asgcard pricing
|
|
19
|
+
|
|
20
|
+
# 3. Create a $10 card
|
|
21
|
+
asgcard card:create -a 10 -n "AI Agent" -e agent@example.com
|
|
22
|
+
|
|
23
|
+
# 4. List your cards
|
|
24
|
+
asgcard cards
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Commands
|
|
28
|
+
|
|
29
|
+
| Command | Description |
|
|
30
|
+
|---------|-------------|
|
|
31
|
+
| `asgcard login [key]` | Save your Stellar secret key |
|
|
32
|
+
| `asgcard whoami` | Show your wallet address |
|
|
33
|
+
| `asgcard cards` | List all your cards |
|
|
34
|
+
| `asgcard card <id>` | Get card summary |
|
|
35
|
+
| `asgcard card:details <id>` | Get PAN, CVV, expiry |
|
|
36
|
+
| `asgcard card:create` | Create a card (x402 payment) |
|
|
37
|
+
| `asgcard card:fund <id>` | Fund a card (x402 payment) |
|
|
38
|
+
| `asgcard card:freeze <id>` | Freeze a card |
|
|
39
|
+
| `asgcard card:unfreeze <id>` | Unfreeze a card |
|
|
40
|
+
| `asgcard pricing` | View pricing tiers |
|
|
41
|
+
| `asgcard health` | Check API status |
|
|
42
|
+
|
|
43
|
+
## Authentication
|
|
44
|
+
|
|
45
|
+
The CLI authenticates using your Stellar private key. Two options:
|
|
46
|
+
|
|
47
|
+
1. **Interactive login** (recommended):
|
|
48
|
+
```bash
|
|
49
|
+
asgcard login
|
|
50
|
+
# Enter key when prompted → saved to ~/.asgcard/config.json (0600)
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
2. **Environment variable**:
|
|
54
|
+
```bash
|
|
55
|
+
export STELLAR_PRIVATE_KEY=S...
|
|
56
|
+
asgcard cards
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Card Creation
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# Available amounts: 10, 25, 50, 100, 200, 500
|
|
63
|
+
asgcard card:create --amount 50 --name "Shopping Agent" --email agent@co.com
|
|
64
|
+
|
|
65
|
+
# ✅ Card created!
|
|
66
|
+
# card_abc123
|
|
67
|
+
# Name: Shopping Agent
|
|
68
|
+
# Balance: $50
|
|
69
|
+
# Status: ● active
|
|
70
|
+
#
|
|
71
|
+
# 🔒 Card Details (one-time):
|
|
72
|
+
# Number: 5395 78** **** 1234
|
|
73
|
+
# CVV: 123
|
|
74
|
+
# Expiry: 12/2027
|
|
75
|
+
#
|
|
76
|
+
# TX: abc123...def456
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Configuration
|
|
80
|
+
|
|
81
|
+
Config is stored in `~/.asgcard/config.json` with `0600` permissions.
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
# Custom API URL
|
|
85
|
+
asgcard login --api-url https://custom-api.example.com
|
|
86
|
+
|
|
87
|
+
# Custom Stellar RPC
|
|
88
|
+
asgcard login --rpc-url https://custom-rpc.example.com
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Environment Variables
|
|
92
|
+
|
|
93
|
+
| Variable | Description |
|
|
94
|
+
|----------|-------------|
|
|
95
|
+
| `STELLAR_PRIVATE_KEY` | Stellar secret key (overrides config) |
|
|
96
|
+
| `ASGCARD_API_URL` | Custom API URL |
|
|
97
|
+
| `STELLAR_RPC_URL` | Custom Stellar RPC URL |
|
|
98
|
+
|
|
99
|
+
## License
|
|
100
|
+
|
|
101
|
+
MIT
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @asgcard/cli — ASG Card command line interface
|
|
4
|
+
*
|
|
5
|
+
* Manage virtual cards for AI agents from your terminal.
|
|
6
|
+
* Authenticates via Stellar wallet signature (no API keys needed).
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* asgcard login — Set your Stellar private key
|
|
10
|
+
* asgcard cards — List your cards
|
|
11
|
+
* asgcard card <id> — Get card details
|
|
12
|
+
* asgcard card:details <id> — Get sensitive card info (PAN, CVV)
|
|
13
|
+
* asgcard card:create — Create a new card (x402 payment)
|
|
14
|
+
* asgcard card:fund <id> — Fund a card (x402 payment)
|
|
15
|
+
* asgcard card:freeze <id> — Freeze a card
|
|
16
|
+
* asgcard card:unfreeze <id> — Unfreeze a card
|
|
17
|
+
* asgcard pricing — View pricing tiers
|
|
18
|
+
* asgcard health — API health check
|
|
19
|
+
*/
|
|
20
|
+
export {};
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @asgcard/cli — ASG Card command line interface
|
|
4
|
+
*
|
|
5
|
+
* Manage virtual cards for AI agents from your terminal.
|
|
6
|
+
* Authenticates via Stellar wallet signature (no API keys needed).
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* asgcard login — Set your Stellar private key
|
|
10
|
+
* asgcard cards — List your cards
|
|
11
|
+
* asgcard card <id> — Get card details
|
|
12
|
+
* asgcard card:details <id> — Get sensitive card info (PAN, CVV)
|
|
13
|
+
* asgcard card:create — Create a new card (x402 payment)
|
|
14
|
+
* asgcard card:fund <id> — Fund a card (x402 payment)
|
|
15
|
+
* asgcard card:freeze <id> — Freeze a card
|
|
16
|
+
* asgcard card:unfreeze <id> — Unfreeze a card
|
|
17
|
+
* asgcard pricing — View pricing tiers
|
|
18
|
+
* asgcard health — API health check
|
|
19
|
+
*/
|
|
20
|
+
import { Command } from "commander";
|
|
21
|
+
import chalk from "chalk";
|
|
22
|
+
import ora from "ora";
|
|
23
|
+
import { ASGCardClient } from "@asgcard/sdk";
|
|
24
|
+
import { WalletClient } from "./wallet-client.js";
|
|
25
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
|
|
26
|
+
import { join } from "node:path";
|
|
27
|
+
import { homedir } from "node:os";
|
|
28
|
+
// ── Config persistence ──────────────────────────────────────
|
|
29
|
+
const CONFIG_DIR = join(homedir(), ".asgcard");
|
|
30
|
+
const CONFIG_FILE = join(CONFIG_DIR, "config.json");
|
|
31
|
+
function loadConfig() {
|
|
32
|
+
try {
|
|
33
|
+
if (existsSync(CONFIG_FILE)) {
|
|
34
|
+
return JSON.parse(readFileSync(CONFIG_FILE, "utf-8"));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// ignore
|
|
39
|
+
}
|
|
40
|
+
return {};
|
|
41
|
+
}
|
|
42
|
+
function saveConfig(config) {
|
|
43
|
+
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
44
|
+
writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), { mode: 0o600 });
|
|
45
|
+
}
|
|
46
|
+
function requireKey() {
|
|
47
|
+
const config = loadConfig();
|
|
48
|
+
const key = process.env.STELLAR_PRIVATE_KEY || config.privateKey;
|
|
49
|
+
if (!key) {
|
|
50
|
+
console.error(chalk.red("❌ No Stellar private key configured.\n") +
|
|
51
|
+
chalk.dim("Run: ") +
|
|
52
|
+
chalk.cyan("asgcard login") +
|
|
53
|
+
chalk.dim(" or set ") +
|
|
54
|
+
chalk.cyan("STELLAR_PRIVATE_KEY") +
|
|
55
|
+
chalk.dim(" env var."));
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
return key;
|
|
59
|
+
}
|
|
60
|
+
function getApiUrl() {
|
|
61
|
+
return process.env.ASGCARD_API_URL || loadConfig().apiUrl || "https://api.asgcard.dev";
|
|
62
|
+
}
|
|
63
|
+
function getRpcUrl() {
|
|
64
|
+
return process.env.STELLAR_RPC_URL || loadConfig().rpcUrl;
|
|
65
|
+
}
|
|
66
|
+
// ── Formatters ──────────────────────────────────────────────
|
|
67
|
+
function formatCard(card) {
|
|
68
|
+
const status = card.status === "active"
|
|
69
|
+
? chalk.green("● active")
|
|
70
|
+
: card.status === "frozen"
|
|
71
|
+
? chalk.blue("❄ frozen")
|
|
72
|
+
: chalk.dim(String(card.status));
|
|
73
|
+
return [
|
|
74
|
+
` ${chalk.bold(String(card.cardId || card.id || ""))}`,
|
|
75
|
+
` Name: ${card.nameOnCard || card.name || "—"}`,
|
|
76
|
+
` Balance: ${chalk.green("$" + (card.balance ?? "?"))}`,
|
|
77
|
+
` Status: ${status}`,
|
|
78
|
+
` Created: ${card.createdAt || "—"}`,
|
|
79
|
+
].join("\n");
|
|
80
|
+
}
|
|
81
|
+
// ── CLI ─────────────────────────────────────────────────────
|
|
82
|
+
const program = new Command();
|
|
83
|
+
program
|
|
84
|
+
.name("asgcard")
|
|
85
|
+
.description("ASG Card CLI — virtual cards for AI agents, powered by x402")
|
|
86
|
+
.version("0.1.0");
|
|
87
|
+
// ── login ───────────────────────────────────────────────────
|
|
88
|
+
program
|
|
89
|
+
.command("login")
|
|
90
|
+
.description("Configure your Stellar private key for wallet authentication")
|
|
91
|
+
.argument("[key]", "Stellar secret key (S...). Omit to enter interactively")
|
|
92
|
+
.option("--api-url <url>", "Custom API URL")
|
|
93
|
+
.option("--rpc-url <url>", "Custom Stellar RPC URL")
|
|
94
|
+
.action(async (key, options) => {
|
|
95
|
+
let privateKey = key;
|
|
96
|
+
if (!privateKey) {
|
|
97
|
+
// Read from stdin
|
|
98
|
+
const readline = await import("node:readline");
|
|
99
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
100
|
+
privateKey = await new Promise((resolve) => {
|
|
101
|
+
rl.question(chalk.cyan("Enter Stellar secret key (S...): "), (answer) => {
|
|
102
|
+
rl.close();
|
|
103
|
+
resolve(answer.trim());
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
if (!privateKey?.startsWith("S")) {
|
|
108
|
+
console.error(chalk.red("❌ Invalid key. Must start with S (Stellar secret key)."));
|
|
109
|
+
process.exit(1);
|
|
110
|
+
}
|
|
111
|
+
const config = {
|
|
112
|
+
...loadConfig(),
|
|
113
|
+
privateKey,
|
|
114
|
+
...(options?.apiUrl && { apiUrl: options.apiUrl }),
|
|
115
|
+
...(options?.rpcUrl && { rpcUrl: options.rpcUrl }),
|
|
116
|
+
};
|
|
117
|
+
saveConfig(config);
|
|
118
|
+
// Derive and display the public key
|
|
119
|
+
const { Keypair } = await import("@stellar/stellar-sdk");
|
|
120
|
+
const kp = Keypair.fromSecret(privateKey);
|
|
121
|
+
console.log(chalk.green("✅ Key saved to ~/.asgcard/config.json"));
|
|
122
|
+
console.log(chalk.dim(" Wallet: ") + chalk.cyan(kp.publicKey()));
|
|
123
|
+
console.log(chalk.dim(" API: ") + chalk.cyan(config.apiUrl || "https://api.asgcard.dev"));
|
|
124
|
+
});
|
|
125
|
+
// ── cards (list) ────────────────────────────────────────────
|
|
126
|
+
program
|
|
127
|
+
.command("cards")
|
|
128
|
+
.description("List all your virtual cards")
|
|
129
|
+
.action(async () => {
|
|
130
|
+
const key = requireKey();
|
|
131
|
+
const spinner = ora("Fetching cards...").start();
|
|
132
|
+
try {
|
|
133
|
+
const client = new WalletClient({ privateKey: key, baseUrl: getApiUrl() });
|
|
134
|
+
const result = await client.listCards();
|
|
135
|
+
spinner.stop();
|
|
136
|
+
if (!result.cards || result.cards.length === 0) {
|
|
137
|
+
console.log(chalk.dim("No cards found. Create one with: asgcard card:create"));
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
console.log(chalk.bold(`\n📇 ${result.cards.length} card(s):\n`));
|
|
141
|
+
for (const card of result.cards) {
|
|
142
|
+
console.log(formatCard(card));
|
|
143
|
+
console.log();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
spinner.fail(chalk.red(`Error: ${error instanceof Error ? error.message : error}`));
|
|
148
|
+
process.exit(1);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
// ── card (get) ──────────────────────────────────────────────
|
|
152
|
+
program
|
|
153
|
+
.command("card")
|
|
154
|
+
.description("Get summary for a specific card")
|
|
155
|
+
.argument("<id>", "Card ID")
|
|
156
|
+
.action(async (id) => {
|
|
157
|
+
const key = requireKey();
|
|
158
|
+
const spinner = ora("Fetching card...").start();
|
|
159
|
+
try {
|
|
160
|
+
const client = new WalletClient({ privateKey: key, baseUrl: getApiUrl() });
|
|
161
|
+
const result = await client.getCard(id);
|
|
162
|
+
spinner.stop();
|
|
163
|
+
console.log(formatCard(result));
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
spinner.fail(chalk.red(`Error: ${error instanceof Error ? error.message : error}`));
|
|
167
|
+
process.exit(1);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
// ── card:details ────────────────────────────────────────────
|
|
171
|
+
program
|
|
172
|
+
.command("card:details")
|
|
173
|
+
.description("Get sensitive card details (PAN, CVV, expiry)")
|
|
174
|
+
.argument("<id>", "Card ID")
|
|
175
|
+
.action(async (id) => {
|
|
176
|
+
const key = requireKey();
|
|
177
|
+
const spinner = ora("Fetching card details...").start();
|
|
178
|
+
try {
|
|
179
|
+
const client = new WalletClient({ privateKey: key, baseUrl: getApiUrl() });
|
|
180
|
+
const result = await client.getCardDetails(id);
|
|
181
|
+
spinner.stop();
|
|
182
|
+
console.log(chalk.bold("\n🔒 Sensitive Card Details:\n"));
|
|
183
|
+
const details = result;
|
|
184
|
+
console.log(` Card Number: ${chalk.cyan(String(details.cardNumber || ""))}`);
|
|
185
|
+
console.log(` CVV: ${chalk.cyan(String(details.cvv || ""))}`);
|
|
186
|
+
console.log(` Expiry: ${chalk.cyan(`${details.expiryMonth}/${details.expiryYear}`)}`);
|
|
187
|
+
const addr = details.billingAddress;
|
|
188
|
+
if (addr) {
|
|
189
|
+
console.log(` Address: ${addr.street}, ${addr.city}, ${addr.state} ${addr.zip}, ${addr.country}`);
|
|
190
|
+
}
|
|
191
|
+
console.log(chalk.dim("\n ⚠ Store securely. Rate-limited to 5/hour."));
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
spinner.fail(chalk.red(`Error: ${error instanceof Error ? error.message : error}`));
|
|
195
|
+
process.exit(1);
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
// ── card:create ─────────────────────────────────────────────
|
|
199
|
+
const VALID_AMOUNTS = ["10", "25", "50", "100", "200", "500"];
|
|
200
|
+
program
|
|
201
|
+
.command("card:create")
|
|
202
|
+
.description("Create a new virtual card (pays on-chain via x402)")
|
|
203
|
+
.requiredOption("-a, --amount <amount>", `Card load amount (${VALID_AMOUNTS.join(", ")})`)
|
|
204
|
+
.requiredOption("-n, --name <name>", "Name on card")
|
|
205
|
+
.requiredOption("-e, --email <email>", "Email for notifications")
|
|
206
|
+
.action(async (options) => {
|
|
207
|
+
if (!VALID_AMOUNTS.includes(options.amount)) {
|
|
208
|
+
console.error(chalk.red(`❌ Invalid amount. Choose from: ${VALID_AMOUNTS.join(", ")}`));
|
|
209
|
+
process.exit(1);
|
|
210
|
+
}
|
|
211
|
+
const key = requireKey();
|
|
212
|
+
const spinner = ora(`Creating $${options.amount} card...`).start();
|
|
213
|
+
try {
|
|
214
|
+
const client = new ASGCardClient({
|
|
215
|
+
privateKey: key,
|
|
216
|
+
baseUrl: getApiUrl(),
|
|
217
|
+
rpcUrl: getRpcUrl(),
|
|
218
|
+
});
|
|
219
|
+
const result = await client.createCard({
|
|
220
|
+
amount: Number(options.amount),
|
|
221
|
+
nameOnCard: options.name,
|
|
222
|
+
email: options.email,
|
|
223
|
+
});
|
|
224
|
+
spinner.succeed(chalk.green("Card created!"));
|
|
225
|
+
console.log(formatCard(result.card));
|
|
226
|
+
if (result.detailsEnvelope) {
|
|
227
|
+
console.log(chalk.bold("\n🔒 Card Details (one-time):"));
|
|
228
|
+
console.log(` Number: ${chalk.cyan(result.detailsEnvelope.cardNumber)}`);
|
|
229
|
+
console.log(` CVV: ${chalk.cyan(result.detailsEnvelope.cvv)}`);
|
|
230
|
+
console.log(` Expiry: ${chalk.cyan(`${result.detailsEnvelope.expiryMonth}/${result.detailsEnvelope.expiryYear}`)}`);
|
|
231
|
+
}
|
|
232
|
+
console.log(chalk.dim(`\n TX: ${result.payment.txHash}`));
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
spinner.fail(chalk.red(`Error: ${error instanceof Error ? error.message : error}`));
|
|
236
|
+
process.exit(1);
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
// ── card:fund ───────────────────────────────────────────────
|
|
240
|
+
program
|
|
241
|
+
.command("card:fund")
|
|
242
|
+
.description("Fund an existing card (pays on-chain via x402)")
|
|
243
|
+
.argument("<id>", "Card ID to fund")
|
|
244
|
+
.requiredOption("-a, --amount <amount>", `Fund amount (${VALID_AMOUNTS.join(", ")})`)
|
|
245
|
+
.action(async (id, options) => {
|
|
246
|
+
if (!VALID_AMOUNTS.includes(options.amount)) {
|
|
247
|
+
console.error(chalk.red(`❌ Invalid amount. Choose from: ${VALID_AMOUNTS.join(", ")}`));
|
|
248
|
+
process.exit(1);
|
|
249
|
+
}
|
|
250
|
+
const key = requireKey();
|
|
251
|
+
const spinner = ora(`Funding $${options.amount}...`).start();
|
|
252
|
+
try {
|
|
253
|
+
const client = new ASGCardClient({
|
|
254
|
+
privateKey: key,
|
|
255
|
+
baseUrl: getApiUrl(),
|
|
256
|
+
rpcUrl: getRpcUrl(),
|
|
257
|
+
});
|
|
258
|
+
const result = await client.fundCard({
|
|
259
|
+
amount: Number(options.amount),
|
|
260
|
+
cardId: id,
|
|
261
|
+
});
|
|
262
|
+
spinner.succeed(chalk.green(`Funded $${result.fundedAmount}!`));
|
|
263
|
+
console.log(` Card: ${result.cardId}`);
|
|
264
|
+
console.log(` New balance: ${chalk.green("$" + result.newBalance)}`);
|
|
265
|
+
console.log(chalk.dim(` TX: ${result.payment.txHash}`));
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
spinner.fail(chalk.red(`Error: ${error instanceof Error ? error.message : error}`));
|
|
269
|
+
process.exit(1);
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
// ── card:freeze / card:unfreeze ─────────────────────────────
|
|
273
|
+
program
|
|
274
|
+
.command("card:freeze")
|
|
275
|
+
.description("Temporarily freeze a card")
|
|
276
|
+
.argument("<id>", "Card ID")
|
|
277
|
+
.action(async (id) => {
|
|
278
|
+
const key = requireKey();
|
|
279
|
+
const spinner = ora("Freezing card...").start();
|
|
280
|
+
try {
|
|
281
|
+
const client = new WalletClient({ privateKey: key, baseUrl: getApiUrl() });
|
|
282
|
+
await client.freezeCard(id);
|
|
283
|
+
spinner.succeed(chalk.blue(`❄ Card ${id} frozen`));
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
spinner.fail(chalk.red(`Error: ${error instanceof Error ? error.message : error}`));
|
|
287
|
+
process.exit(1);
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
program
|
|
291
|
+
.command("card:unfreeze")
|
|
292
|
+
.description("Unfreeze a frozen card")
|
|
293
|
+
.argument("<id>", "Card ID")
|
|
294
|
+
.action(async (id) => {
|
|
295
|
+
const key = requireKey();
|
|
296
|
+
const spinner = ora("Unfreezing card...").start();
|
|
297
|
+
try {
|
|
298
|
+
const client = new WalletClient({ privateKey: key, baseUrl: getApiUrl() });
|
|
299
|
+
await client.unfreezeCard(id);
|
|
300
|
+
spinner.succeed(chalk.green(`🔓 Card ${id} unfrozen`));
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
spinner.fail(chalk.red(`Error: ${error instanceof Error ? error.message : error}`));
|
|
304
|
+
process.exit(1);
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
// ── pricing ─────────────────────────────────────────────────
|
|
308
|
+
program
|
|
309
|
+
.command("pricing")
|
|
310
|
+
.description("View current pricing tiers")
|
|
311
|
+
.action(async () => {
|
|
312
|
+
const spinner = ora("Fetching pricing...").start();
|
|
313
|
+
try {
|
|
314
|
+
const client = new ASGCardClient({
|
|
315
|
+
privateKey: "SAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVID", // dummy for public endpoint
|
|
316
|
+
baseUrl: getApiUrl(),
|
|
317
|
+
});
|
|
318
|
+
const tiers = await client.getTiers();
|
|
319
|
+
spinner.stop();
|
|
320
|
+
console.log(chalk.bold("\n💰 Card Creation Tiers:\n"));
|
|
321
|
+
console.log(chalk.dim(" Load Amount Total Cost Endpoint"));
|
|
322
|
+
for (const t of tiers.creation) {
|
|
323
|
+
console.log(` ${chalk.green("$" + String(t.loadAmount || "?").padEnd(11))} ${chalk.cyan("$" + String(t.totalCost).padEnd(11))} ${chalk.dim(t.endpoint)}`);
|
|
324
|
+
}
|
|
325
|
+
console.log(chalk.bold("\n💰 Card Funding Tiers:\n"));
|
|
326
|
+
console.log(chalk.dim(" Fund Amount Total Cost Endpoint"));
|
|
327
|
+
for (const t of tiers.funding) {
|
|
328
|
+
console.log(` ${chalk.green("$" + String(t.fundAmount || "?").padEnd(11))} ${chalk.cyan("$" + String(t.totalCost).padEnd(11))} ${chalk.dim(t.endpoint)}`);
|
|
329
|
+
}
|
|
330
|
+
console.log();
|
|
331
|
+
}
|
|
332
|
+
catch (error) {
|
|
333
|
+
spinner.fail(chalk.red(`Error: ${error instanceof Error ? error.message : error}`));
|
|
334
|
+
process.exit(1);
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
// ── health ──────────────────────────────────────────────────
|
|
338
|
+
program
|
|
339
|
+
.command("health")
|
|
340
|
+
.description("Check API health")
|
|
341
|
+
.action(async () => {
|
|
342
|
+
const spinner = ora("Checking API...").start();
|
|
343
|
+
try {
|
|
344
|
+
const res = await fetch(`${getApiUrl()}/health`);
|
|
345
|
+
const data = await res.json();
|
|
346
|
+
spinner.succeed(chalk.green("API is healthy ") +
|
|
347
|
+
chalk.dim(`v${data.version} — ${data.timestamp}`));
|
|
348
|
+
}
|
|
349
|
+
catch (error) {
|
|
350
|
+
spinner.fail(chalk.red(`API unreachable: ${error instanceof Error ? error.message : error}`));
|
|
351
|
+
process.exit(1);
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
// ── whoami ──────────────────────────────────────────────────
|
|
355
|
+
program
|
|
356
|
+
.command("whoami")
|
|
357
|
+
.description("Show your configured wallet address")
|
|
358
|
+
.action(async () => {
|
|
359
|
+
const key = requireKey();
|
|
360
|
+
const { Keypair } = await import("@stellar/stellar-sdk");
|
|
361
|
+
const kp = Keypair.fromSecret(key);
|
|
362
|
+
console.log(chalk.cyan(kp.publicKey()));
|
|
363
|
+
});
|
|
364
|
+
program.parse();
|
|
365
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @asgcard/mcp-server — Wallet-authenticated HTTP client
|
|
3
|
+
*
|
|
4
|
+
* Makes signed requests to the ASGCard API for management operations
|
|
5
|
+
* (list, get, details, freeze, unfreeze) that require wallet authentication.
|
|
6
|
+
*
|
|
7
|
+
* Signing format:
|
|
8
|
+
* Message: "asgcard-auth:{timestamp}" (UTF-8)
|
|
9
|
+
* Signature: ed25519 detached, base64-encoded
|
|
10
|
+
* Headers: X-WALLET-ADDRESS, X-WALLET-SIGNATURE, X-WALLET-TIMESTAMP
|
|
11
|
+
*/
|
|
12
|
+
export interface WalletClientConfig {
|
|
13
|
+
/** ASGCard API base URL */
|
|
14
|
+
baseUrl: string;
|
|
15
|
+
/** Stellar secret key (S...) for signing */
|
|
16
|
+
privateKey: string;
|
|
17
|
+
/** Request timeout in ms */
|
|
18
|
+
timeout?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface CardSummary {
|
|
21
|
+
cardId: string;
|
|
22
|
+
nameOnCard: string;
|
|
23
|
+
balance: number;
|
|
24
|
+
status: string;
|
|
25
|
+
createdAt: string;
|
|
26
|
+
}
|
|
27
|
+
export interface CardDetails {
|
|
28
|
+
cardNumber: string;
|
|
29
|
+
expiryMonth: number;
|
|
30
|
+
expiryYear: number;
|
|
31
|
+
cvv: string;
|
|
32
|
+
billingAddress: {
|
|
33
|
+
street: string;
|
|
34
|
+
city: string;
|
|
35
|
+
state: string;
|
|
36
|
+
zip: string;
|
|
37
|
+
country: string;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export declare class WalletClient {
|
|
41
|
+
private readonly baseUrl;
|
|
42
|
+
private readonly keypair;
|
|
43
|
+
private readonly timeout;
|
|
44
|
+
constructor(config: WalletClientConfig);
|
|
45
|
+
/** Stellar public key (G...) */
|
|
46
|
+
get address(): string;
|
|
47
|
+
/** List all cards for the authenticated wallet */
|
|
48
|
+
listCards(): Promise<{
|
|
49
|
+
cards: CardSummary[];
|
|
50
|
+
}>;
|
|
51
|
+
/** Get a specific card's summary */
|
|
52
|
+
getCard(cardId: string): Promise<CardSummary>;
|
|
53
|
+
/** Get sensitive card details (PAN, CVV, expiry) */
|
|
54
|
+
getCardDetails(cardId: string): Promise<CardDetails>;
|
|
55
|
+
/** Freeze a card */
|
|
56
|
+
freezeCard(cardId: string): Promise<{
|
|
57
|
+
success: boolean;
|
|
58
|
+
status: string;
|
|
59
|
+
}>;
|
|
60
|
+
/** Unfreeze a card */
|
|
61
|
+
unfreezeCard(cardId: string): Promise<{
|
|
62
|
+
success: boolean;
|
|
63
|
+
status: string;
|
|
64
|
+
}>;
|
|
65
|
+
private signAuth;
|
|
66
|
+
private authenticatedRequest;
|
|
67
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @asgcard/mcp-server — Wallet-authenticated HTTP client
|
|
3
|
+
*
|
|
4
|
+
* Makes signed requests to the ASGCard API for management operations
|
|
5
|
+
* (list, get, details, freeze, unfreeze) that require wallet authentication.
|
|
6
|
+
*
|
|
7
|
+
* Signing format:
|
|
8
|
+
* Message: "asgcard-auth:{timestamp}" (UTF-8)
|
|
9
|
+
* Signature: ed25519 detached, base64-encoded
|
|
10
|
+
* Headers: X-WALLET-ADDRESS, X-WALLET-SIGNATURE, X-WALLET-TIMESTAMP
|
|
11
|
+
*/
|
|
12
|
+
import { Keypair, StrKey } from "@stellar/stellar-sdk";
|
|
13
|
+
import nacl from "tweetnacl";
|
|
14
|
+
export class WalletClient {
|
|
15
|
+
baseUrl;
|
|
16
|
+
keypair;
|
|
17
|
+
timeout;
|
|
18
|
+
constructor(config) {
|
|
19
|
+
this.baseUrl = config.baseUrl;
|
|
20
|
+
this.keypair = Keypair.fromSecret(config.privateKey);
|
|
21
|
+
this.timeout = config.timeout ?? 30_000;
|
|
22
|
+
}
|
|
23
|
+
/** Stellar public key (G...) */
|
|
24
|
+
get address() {
|
|
25
|
+
return this.keypair.publicKey();
|
|
26
|
+
}
|
|
27
|
+
/** List all cards for the authenticated wallet */
|
|
28
|
+
async listCards() {
|
|
29
|
+
return this.authenticatedRequest("GET", "/cards/");
|
|
30
|
+
}
|
|
31
|
+
/** Get a specific card's summary */
|
|
32
|
+
async getCard(cardId) {
|
|
33
|
+
return this.authenticatedRequest("GET", `/cards/${cardId}`);
|
|
34
|
+
}
|
|
35
|
+
/** Get sensitive card details (PAN, CVV, expiry) */
|
|
36
|
+
async getCardDetails(cardId) {
|
|
37
|
+
return this.authenticatedRequest("GET", `/cards/${cardId}/details`);
|
|
38
|
+
}
|
|
39
|
+
/** Freeze a card */
|
|
40
|
+
async freezeCard(cardId) {
|
|
41
|
+
return this.authenticatedRequest("POST", `/cards/${cardId}/freeze`);
|
|
42
|
+
}
|
|
43
|
+
/** Unfreeze a card */
|
|
44
|
+
async unfreezeCard(cardId) {
|
|
45
|
+
return this.authenticatedRequest("POST", `/cards/${cardId}/unfreeze`);
|
|
46
|
+
}
|
|
47
|
+
// ── Auth signing ────────────────────────────────────────
|
|
48
|
+
signAuth() {
|
|
49
|
+
const timestamp = Math.floor(Date.now() / 1000);
|
|
50
|
+
const message = new TextEncoder().encode(`asgcard-auth:${timestamp}`);
|
|
51
|
+
// Get raw ed25519 private key bytes from Stellar keypair
|
|
52
|
+
const rawSecret = this.keypair.rawSecretKey();
|
|
53
|
+
const rawPublic = StrKey.decodeEd25519PublicKey(this.keypair.publicKey());
|
|
54
|
+
// tweetnacl expects 64-byte secret (32-byte private + 32-byte public)
|
|
55
|
+
const fullSecret = new Uint8Array(64);
|
|
56
|
+
fullSecret.set(rawSecret, 0);
|
|
57
|
+
fullSecret.set(rawPublic, 32);
|
|
58
|
+
const signature = nacl.sign.detached(message, fullSecret);
|
|
59
|
+
return {
|
|
60
|
+
address: this.keypair.publicKey(),
|
|
61
|
+
signature: Buffer.from(signature).toString("base64"),
|
|
62
|
+
timestamp: String(timestamp),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
async authenticatedRequest(method, path) {
|
|
66
|
+
const auth = this.signAuth();
|
|
67
|
+
const controller = new AbortController();
|
|
68
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
69
|
+
try {
|
|
70
|
+
const response = await fetch(`${this.baseUrl}${path}`, {
|
|
71
|
+
method,
|
|
72
|
+
headers: {
|
|
73
|
+
"Content-Type": "application/json",
|
|
74
|
+
"X-WALLET-ADDRESS": auth.address,
|
|
75
|
+
"X-WALLET-SIGNATURE": auth.signature,
|
|
76
|
+
"X-WALLET-TIMESTAMP": auth.timestamp,
|
|
77
|
+
},
|
|
78
|
+
signal: controller.signal,
|
|
79
|
+
});
|
|
80
|
+
const payload = await response.json().catch(() => ({}));
|
|
81
|
+
if (!response.ok) {
|
|
82
|
+
throw new Error(`API error ${response.status}: ${JSON.stringify(payload)}`);
|
|
83
|
+
}
|
|
84
|
+
return payload;
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
88
|
+
throw new Error(`Request timed out after ${this.timeout}ms`);
|
|
89
|
+
}
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
finally {
|
|
93
|
+
clearTimeout(timeoutId);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=wallet-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-client.js","sourceRoot":"","sources":["../src/wallet-client.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@asgcard/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI for ASG Card — manage virtual Visa cards for AI agents from the terminal",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"asgcard": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc -p tsconfig.json",
|
|
17
|
+
"dev": "tsx src/index.ts",
|
|
18
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
19
|
+
"prepublishOnly": "npm run build"
|
|
20
|
+
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"asgcard",
|
|
23
|
+
"cli",
|
|
24
|
+
"virtual-card",
|
|
25
|
+
"ai-agent",
|
|
26
|
+
"x402",
|
|
27
|
+
"stellar",
|
|
28
|
+
"usdc"
|
|
29
|
+
],
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "https://github.com/asgcard/cli"
|
|
34
|
+
},
|
|
35
|
+
"homepage": "https://asgcard.dev",
|
|
36
|
+
"publishConfig": {
|
|
37
|
+
"access": "public"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@asgcard/sdk": "^1.0.6",
|
|
41
|
+
"@stellar/stellar-sdk": "^13.1.0",
|
|
42
|
+
"commander": "^13.1.0",
|
|
43
|
+
"chalk": "^5.4.1",
|
|
44
|
+
"ora": "^8.2.0",
|
|
45
|
+
"tweetnacl": "^1.0.3"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@types/node": "^22.15.30",
|
|
49
|
+
"tsx": "^4.19.4",
|
|
50
|
+
"typescript": "^5.8.3"
|
|
51
|
+
}
|
|
52
|
+
}
|