cards402 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -54,10 +54,16 @@ async function main() {
54
54
 
55
55
  Usage:
56
56
  cards402 onboard --claim <code> Set up an agent from a dashboard claim code
57
+ cards402 purchase --amount <USDC> Buy a card using the wallet from onboard
58
+ cards402 wallet address Print this agent's Stellar address
59
+ cards402 wallet balance Print XLM + USDC balances from Horizon
57
60
  cards402 mcp Start the MCP server over stdio (default)
58
61
  cards402 version Print the SDK version
59
62
  cards402 --help Show this message
60
63
 
64
+ All the 'purchase' and 'wallet' subcommands read ~/.cards402/config.json
65
+ (written by 'cards402 onboard') so you don't need to pass an api key.
66
+
61
67
  Docs: https://cards402.com/docs
62
68
  Onboarding guide for agents: https://cards402.com/skill.md
63
69
  `);
@@ -73,6 +79,14 @@ Onboarding guide for agents: https://cards402.com/skill.md
73
79
  const { onboardCommand } = await Promise.resolve().then(() => __importStar(require('./commands/onboard')));
74
80
  return onboardCommand(rest);
75
81
  }
82
+ if (cmd === 'purchase' || cmd === 'buy') {
83
+ const { purchaseCommand } = await Promise.resolve().then(() => __importStar(require('./commands/purchase')));
84
+ return purchaseCommand(rest);
85
+ }
86
+ if (cmd === 'wallet') {
87
+ const { walletCommand } = await Promise.resolve().then(() => __importStar(require('./commands/wallet')));
88
+ return walletCommand(rest);
89
+ }
76
90
  if (cmd === 'mcp') {
77
91
  const { startMcpServer } = await Promise.resolve().then(() => __importStar(require('./mcp')));
78
92
  await startMcpServer();
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AACA,2BAA2B;AAC3B,EAAE;AACF,eAAe;AACf,sEAAsE;AACtE,uEAAuE;AACvE,gEAAgE;AAChE,gEAAgE;AAChE,8CAA8C;AAC9C,yDAAyD;AACzD,EAAE;AACF,sEAAsE;AACtE,uEAAuE;AACvE,6DAA6D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE7D,KAAK,UAAU,IAAI;IACjB,MAAM,CAAC,EAAE,AAAD,EAAG,GAAG,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAEhD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACvD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;;;;;;;;;;CAUxB,CAAC,CAAC;QACC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC7D,iEAAiE;QACjE,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;QAC9D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;QACzC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,EAAE,cAAc,EAAE,GAAG,wDAAa,oBAAoB,GAAC,CAAC;QAC9D,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,MAAM,EAAE,cAAc,EAAE,GAAG,wDAAa,OAAO,GAAC,CAAC;QACjD,MAAM,cAAc,EAAE,CAAC;QACvB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,GAAG,KAAK,CAAC,CAAC;IAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;IAC3E,OAAO,CAAC,CAAC;AACX,CAAC;AAED,IAAI,EAAE,CAAC,IAAI,CACT,CAAC,IAAI,EAAE,EAAE;IACP,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC,EACD,CAAC,GAAG,EAAE,EAAE;IACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAC5E,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CACF,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AACA,2BAA2B;AAC3B,EAAE;AACF,eAAe;AACf,sEAAsE;AACtE,uEAAuE;AACvE,gEAAgE;AAChE,gEAAgE;AAChE,8CAA8C;AAC9C,yDAAyD;AACzD,EAAE;AACF,sEAAsE;AACtE,uEAAuE;AACvE,6DAA6D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE7D,KAAK,UAAU,IAAI;IACjB,MAAM,CAAC,EAAE,AAAD,EAAG,GAAG,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAEhD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACvD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;CAgBxB,CAAC,CAAC;QACC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC7D,iEAAiE;QACjE,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;QAC9D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;QACzC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,EAAE,cAAc,EAAE,GAAG,wDAAa,oBAAoB,GAAC,CAAC;QAC9D,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QACxC,MAAM,EAAE,eAAe,EAAE,GAAG,wDAAa,qBAAqB,GAAC,CAAC;QAChE,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,MAAM,EAAE,aAAa,EAAE,GAAG,wDAAa,mBAAmB,GAAC,CAAC;QAC5D,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,MAAM,EAAE,cAAc,EAAE,GAAG,wDAAa,OAAO,GAAC,CAAC;QACjD,MAAM,cAAc,EAAE,CAAC;QACvB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,GAAG,KAAK,CAAC,CAAC;IAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;IAC3E,OAAO,CAAC,CAAC;AACX,CAAC;AAED,IAAI,EAAE,CAAC,IAAI,CACT,CAAC,IAAI,EAAE,EAAE;IACP,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC,EACD,CAAC,GAAG,EAAE,EAAE;IACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAC5E,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function purchaseCommand(argv: string[]): Promise<number>;
2
+ //# sourceMappingURL=purchase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"purchase.d.ts","sourceRoot":"","sources":["../../src/commands/purchase.ts"],"names":[],"mappings":"AA2DA,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA4DrE"}
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ // `cards402 purchase --amount 10 [--asset xlm|usdc]` — one-command
3
+ // card purchase. Loads creds from the on-disk config written by
4
+ // `cards402 onboard`, opens the order, pays the Soroban contract
5
+ // from the local OWS wallet, waits for the SSE stream to report
6
+ // the card ready, and prints the card details.
7
+ //
8
+ // Designed so the cautious-agent flow is a single shell invocation:
9
+ // the agent doesn't have to write any JavaScript or guess at the
10
+ // SDK surface area.
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.purchaseCommand = purchaseCommand;
13
+ const config_1 = require("../config");
14
+ const ows_1 = require("../ows");
15
+ function parseArgs(argv) {
16
+ const out = {};
17
+ for (let i = 0; i < argv.length; i++) {
18
+ const arg = argv[i];
19
+ if (arg === undefined)
20
+ continue;
21
+ if (arg === '-h' || arg === '--help')
22
+ out.help = true;
23
+ else if (arg === '-a' || arg === '--amount')
24
+ out.amount = argv[++i];
25
+ else if (arg.startsWith('--amount='))
26
+ out.amount = arg.slice('--amount='.length);
27
+ else if (arg === '--asset') {
28
+ const v = argv[++i];
29
+ if (v === 'xlm' || v === 'usdc')
30
+ out.asset = v;
31
+ }
32
+ else if (arg.startsWith('--asset=')) {
33
+ const v = arg.slice('--asset='.length);
34
+ if (v === 'xlm' || v === 'usdc')
35
+ out.asset = v;
36
+ }
37
+ else if (arg === '--wallet-name')
38
+ out.walletName = argv[++i];
39
+ else if (arg.startsWith('--wallet-name='))
40
+ out.walletName = arg.slice('--wallet-name='.length);
41
+ }
42
+ return out;
43
+ }
44
+ function usage() {
45
+ process.stderr.write(`Usage: cards402 purchase --amount <USDC> [--asset xlm|usdc]
46
+
47
+ Buys a virtual Visa card for the given USD value using the credentials
48
+ and wallet set up by 'cards402 onboard'. Reads ~/.cards402/config.json
49
+ for the api key and wallet name, so you don't need to pass either.
50
+
51
+ Options:
52
+ -a, --amount <USDC> Card value in USD (decimal string). Required.
53
+ --asset xlm|usdc Which asset to pay with. Default: xlm
54
+ --wallet-name <name> Override the wallet name from config.json
55
+ -h, --help Show this message
56
+
57
+ Example:
58
+ cards402 purchase --amount 10 # $10 card paid in XLM
59
+ cards402 purchase --amount 5 --asset usdc
60
+ `);
61
+ }
62
+ async function purchaseCommand(argv) {
63
+ const args = parseArgs(argv);
64
+ if (args.help) {
65
+ usage();
66
+ return 0;
67
+ }
68
+ if (!args.amount) {
69
+ process.stderr.write('error: --amount <USDC> is required\n\n');
70
+ usage();
71
+ return 2;
72
+ }
73
+ if (!/^\d+(\.\d+)?$/.test(args.amount) || parseFloat(args.amount) <= 0) {
74
+ process.stderr.write(`error: --amount must be a positive decimal (got: ${args.amount})\n`);
75
+ return 2;
76
+ }
77
+ const config = (0, config_1.loadCards402Config)();
78
+ if (!config) {
79
+ process.stderr.write(`error: no cards402 config found at ~/.cards402/config.json
80
+
81
+ Run 'cards402 onboard --claim <code>' first to set up credentials.
82
+ Your operator can mint a claim code from https://cards402.com/dashboard.
83
+ `);
84
+ return 1;
85
+ }
86
+ const walletName = args.walletName || config.wallet_name || 'cards402-agent';
87
+ const paymentAsset = args.asset ?? 'xlm';
88
+ process.stdout.write(`→ Purchasing $${args.amount} card via ${paymentAsset.toUpperCase()}…\n`);
89
+ try {
90
+ const card = await (0, ows_1.purchaseCardOWS)({
91
+ apiKey: config.api_key,
92
+ baseUrl: config.api_url,
93
+ walletName,
94
+ amountUsdc: args.amount,
95
+ paymentAsset,
96
+ });
97
+ process.stdout.write('\n');
98
+ process.stdout.write('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
99
+ process.stdout.write(' Card delivered\n');
100
+ process.stdout.write('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
101
+ process.stdout.write(` Number: ${card.number}\n`);
102
+ process.stdout.write(` CVV: ${card.cvv}\n`);
103
+ process.stdout.write(` Expiry: ${card.expiry}\n`);
104
+ if (card.brand)
105
+ process.stdout.write(` Brand: ${card.brand}\n`);
106
+ process.stdout.write(` Order: ${card.order_id}\n`);
107
+ process.stdout.write('\n');
108
+ process.stdout.write('The card details above are sensitive — save them to a secrets store immediately and do not log them.\n');
109
+ return 0;
110
+ }
111
+ catch (err) {
112
+ const msg = err instanceof Error ? err.message : String(err);
113
+ process.stderr.write(`error: purchase failed: ${msg}\n`);
114
+ return 1;
115
+ }
116
+ }
117
+ //# sourceMappingURL=purchase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"purchase.js","sourceRoot":"","sources":["../../src/commands/purchase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function walletCommand(argv: string[]): Promise<number>;
2
+ //# sourceMappingURL=wallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/commands/wallet.ts"],"names":[],"mappings":"AAqBA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA8DnE"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ // `cards402 wallet address` / `cards402 wallet balance` — read-only
3
+ // helpers that wrap the OWS SDK so agents don't have to spawn Node
4
+ // one-liners to find out their own Stellar address or check whether
5
+ // funding has landed.
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.walletCommand = walletCommand;
8
+ const config_1 = require("../config");
9
+ const ows_1 = require("../ows");
10
+ function usage() {
11
+ process.stderr.write(`Usage: cards402 wallet <subcommand>
12
+
13
+ Subcommands:
14
+ address Print the Stellar address for this agent's wallet
15
+ balance Print the wallet's XLM and USDC balances from Horizon
16
+ -h, --help Show this message
17
+
18
+ Both subcommands read ~/.cards402/config.json for the wallet name, so
19
+ you don't need to pass anything after 'cards402 onboard'.
20
+ `);
21
+ }
22
+ async function walletCommand(argv) {
23
+ const [sub, ...rest] = argv;
24
+ if (!sub || sub === '-h' || sub === '--help' || sub === 'help') {
25
+ usage();
26
+ return sub ? 0 : 2;
27
+ }
28
+ const config = (0, config_1.loadCards402Config)();
29
+ if (!config) {
30
+ process.stderr.write("error: no cards402 config found. Run 'cards402 onboard --claim <code>' first.\n");
31
+ return 1;
32
+ }
33
+ const walletName = rest.find((a) => a.startsWith('--name='))?.slice(7) || config.wallet_name || 'cards402-agent';
34
+ if (sub === 'address') {
35
+ try {
36
+ const publicKey = (0, ows_1.getOWSPublicKey)(walletName);
37
+ process.stdout.write(`${publicKey}\n`);
38
+ return 0;
39
+ }
40
+ catch (err) {
41
+ process.stderr.write(`error: wallet "${walletName}" not found: ${err instanceof Error ? err.message : String(err)}\n`);
42
+ return 1;
43
+ }
44
+ }
45
+ if (sub === 'balance') {
46
+ try {
47
+ const publicKey = (0, ows_1.getOWSPublicKey)(walletName);
48
+ const bal = await (0, ows_1.getOWSBalance)(walletName);
49
+ process.stdout.write(`address: ${publicKey}\n`);
50
+ process.stdout.write(`xlm: ${bal.xlm}\n`);
51
+ process.stdout.write(`usdc: ${bal.usdc}\n`);
52
+ return 0;
53
+ }
54
+ catch (err) {
55
+ const msg = err instanceof Error ? err.message : String(err);
56
+ // Horizon 404 on a brand-new unactivated wallet — show zeros.
57
+ if (msg.includes('Not Found') || msg.includes('404')) {
58
+ try {
59
+ const publicKey = (0, ows_1.getOWSPublicKey)(walletName);
60
+ process.stdout.write(`address: ${publicKey}\n`);
61
+ process.stdout.write(`xlm: 0 (unactivated — send >= 1 XLM)\n`);
62
+ process.stdout.write(`usdc: 0\n`);
63
+ return 0;
64
+ }
65
+ catch {
66
+ /* fall through to error */
67
+ }
68
+ }
69
+ process.stderr.write(`error: ${msg}\n`);
70
+ return 1;
71
+ }
72
+ }
73
+ process.stderr.write(`error: unknown wallet subcommand '${sub}'\n`);
74
+ usage();
75
+ return 2;
76
+ }
77
+ //# sourceMappingURL=wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/commands/wallet.ts"],"names":[],"mappings":";AAAA,oEAAoE;AACpE,mEAAmE;AACnE,oEAAoE;AACpE,sBAAsB;;AAkBtB,sCA8DC;AA9ED,sCAA+C;AAC/C,gCAAwD;AAExD,SAAS,KAAK;IACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;;;;;;;;;CAStB,CAAC,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,IAAc;IAChD,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QAC/D,KAAK,EAAE,CAAC;QACR,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,2BAAkB,GAAE,CAAC;IACpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,iFAAiF,CAClF,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,UAAU,GACd,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,WAAW,IAAI,gBAAgB,CAAC;IAEhG,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAA,qBAAe,EAAC,UAAU,CAAC,CAAC;YAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,IAAI,CAAC,CAAC;YACvC,OAAO,CAAC,CAAC;QACX,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,kBAAkB,UAAU,gBAC1B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,IAAI,CACL,CAAC;YACF,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAA,qBAAe,EAAC,UAAU,CAAC,CAAC;YAC9C,MAAM,GAAG,GAAG,MAAM,IAAA,mBAAa,EAAC,UAAU,CAAC,CAAC;YAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,SAAS,IAAI,CAAC,CAAC;YAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;YAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;YAC/C,OAAO,CAAC,CAAC;QACX,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,8DAA8D;YAC9D,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrD,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,IAAA,qBAAe,EAAC,UAAU,CAAC,CAAC;oBAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,SAAS,IAAI,CAAC,CAAC;oBAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;oBACnE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;oBACrC,OAAO,CAAC,CAAC;gBACX,CAAC;gBAAC,MAAM,CAAC;oBACP,2BAA2B;gBAC7B,CAAC;YACH,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;YACxC,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,GAAG,KAAK,CAAC,CAAC;IACpE,KAAK,EAAE,CAAC;IACR,OAAO,CAAC,CAAC;AACX,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cards402",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Virtual Visa cards for AI agents — pay USDC or XLM on Stellar, get a card in ~60s",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",