@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 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
@@ -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
+ }