agentcard 0.0.1 → 0.0.2
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/bin/apk.d.ts +2 -0
- package/dist/bin/apk.js +8 -0
- package/dist/bin/apk.js.map +1 -0
- package/dist/src/commands/balance.d.ts +1 -0
- package/dist/src/commands/balance.js +15 -0
- package/dist/src/commands/balance.js.map +1 -0
- package/dist/src/commands/cards/create.d.ts +1 -0
- package/dist/src/commands/cards/create.js +102 -0
- package/dist/src/commands/cards/create.js.map +1 -0
- package/dist/src/commands/cards/details.d.ts +9 -0
- package/dist/src/commands/cards/details.js +28 -0
- package/dist/src/commands/cards/details.js.map +1 -0
- package/dist/src/commands/cards/list.d.ts +1 -0
- package/dist/src/commands/cards/list.js +27 -0
- package/dist/src/commands/cards/list.js.map +1 -0
- package/dist/src/commands/logout.d.ts +1 -0
- package/dist/src/commands/logout.js +7 -0
- package/dist/src/commands/logout.js.map +1 -0
- package/dist/src/commands/signup.d.ts +3 -0
- package/dist/src/commands/signup.js +56 -0
- package/dist/src/commands/signup.js.map +1 -0
- package/dist/src/commands/whoami.d.ts +1 -0
- package/dist/src/commands/whoami.js +18 -0
- package/dist/src/commands/whoami.js.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.js +75 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lib/api.d.ts +6 -0
- package/dist/src/lib/api.js +46 -0
- package/dist/src/lib/api.js.map +1 -0
- package/dist/src/lib/config.d.ts +8 -0
- package/dist/src/lib/config.js +30 -0
- package/dist/src/lib/config.js.map +1 -0
- package/dist/src/lib/prompt.d.ts +2 -0
- package/dist/src/lib/prompt.js +11 -0
- package/dist/src/lib/prompt.js.map +1 -0
- package/package.json +25 -7
- package/index.js +0 -1
package/dist/bin/apk.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apk.js","sourceRoot":"","sources":["../../bin/apk.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function balance(id: string): Promise<void>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { get } from "../lib/api.js";
|
|
3
|
+
export async function balance(id) {
|
|
4
|
+
let card;
|
|
5
|
+
try {
|
|
6
|
+
card = await get(`/api/cards/${id}/details`);
|
|
7
|
+
}
|
|
8
|
+
catch (err) {
|
|
9
|
+
console.error(chalk.red(`Failed to fetch card: ${err instanceof Error ? err.message : "Unknown error"}`));
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
console.log(`Original amount: ${chalk.green(`$${(card.amountCents / 100).toFixed(2)}`)}`);
|
|
13
|
+
console.log(chalk.dim("Real-time balance checking is not available for prepaid cards."));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=balance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balance.js","sourceRoot":"","sources":["../../../src/commands/balance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAMpC,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAAU;IACtC,IAAI,IAAiB,CAAC;IACtB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,GAAG,CAAc,cAAc,EAAE,UAAU,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,yBAAyB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAChF,CACF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CACT,oBAAoB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAC7E,CAAC;IACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAC5E,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function createCard(amount?: string): Promise<void>;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import open from "open";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import { get, post } from "../../lib/api.js";
|
|
5
|
+
import { prompt } from "../../lib/prompt.js";
|
|
6
|
+
import { printCardDetails } from "./details.js";
|
|
7
|
+
const POLL_INTERVAL = 2000;
|
|
8
|
+
const TIMEOUT = 10 * 60 * 1000;
|
|
9
|
+
function formatDollars(cents) {
|
|
10
|
+
return `$${(cents / 100).toFixed(2)}`;
|
|
11
|
+
}
|
|
12
|
+
async function getAvailableDenominations() {
|
|
13
|
+
const res = await get("/api/cards/denominations");
|
|
14
|
+
return res.denominations;
|
|
15
|
+
}
|
|
16
|
+
function printAvailable(denominations) {
|
|
17
|
+
console.log(chalk.dim("Available denominations:"));
|
|
18
|
+
for (const d of denominations) {
|
|
19
|
+
console.log(chalk.dim(` ${formatDollars(d.amountCents)}`));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export async function createCard(amount) {
|
|
23
|
+
const denominations = await getAvailableDenominations();
|
|
24
|
+
if (denominations.length === 0) {
|
|
25
|
+
console.error(chalk.red("No cards available right now. Check back later."));
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
let dollars;
|
|
29
|
+
if (amount) {
|
|
30
|
+
dollars = parseInt(amount, 10);
|
|
31
|
+
if (isNaN(dollars) || dollars <= 0) {
|
|
32
|
+
console.error(chalk.red("Amount must be a positive integer (in dollars)."));
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
const match = denominations.find((d) => d.amountCents === dollars * 100);
|
|
36
|
+
if (!match) {
|
|
37
|
+
console.error(chalk.red(`No $${dollars} cards available.`));
|
|
38
|
+
printAvailable(denominations);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
const choices = denominations.map((d) => ({
|
|
44
|
+
name: formatDollars(d.amountCents),
|
|
45
|
+
value: d.amountCents / 100,
|
|
46
|
+
}));
|
|
47
|
+
const answers = await prompt([
|
|
48
|
+
{
|
|
49
|
+
type: "list",
|
|
50
|
+
name: "dollars",
|
|
51
|
+
message: "Select card amount:",
|
|
52
|
+
choices,
|
|
53
|
+
},
|
|
54
|
+
]);
|
|
55
|
+
dollars = Number(answers.dollars);
|
|
56
|
+
}
|
|
57
|
+
const spinner = ora("Creating checkout session...").start();
|
|
58
|
+
let purchase;
|
|
59
|
+
try {
|
|
60
|
+
purchase = await post("/api/cards/purchase", {
|
|
61
|
+
amountCents: dollars * 100,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
spinner.fail(`Failed to create card: ${err instanceof Error ? err.message : "Unknown error"}`);
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
spinner.stop();
|
|
69
|
+
console.log(chalk.blue("Opening browser for payment..."));
|
|
70
|
+
await open(purchase.url);
|
|
71
|
+
const paymentSpinner = ora("Waiting for payment...").start();
|
|
72
|
+
const deadline = Date.now() + TIMEOUT;
|
|
73
|
+
while (Date.now() < deadline) {
|
|
74
|
+
await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL));
|
|
75
|
+
try {
|
|
76
|
+
const status = await get(`/api/cards/purchase/status?session_id=${purchase.sessionId}`);
|
|
77
|
+
if (status.status === "complete" && status.card) {
|
|
78
|
+
paymentSpinner.succeed(chalk.green("Card purchased!"));
|
|
79
|
+
try {
|
|
80
|
+
const details = await get(`/api/cards/${status.card.id}/details`);
|
|
81
|
+
printCardDetails(details);
|
|
82
|
+
console.log(chalk.dim(` To view again: agentcard cards details ${status.card.id}`));
|
|
83
|
+
console.log("");
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
console.log(`Run \`agentcard cards details ${status.card.id}\` to view card details.`);
|
|
87
|
+
}
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (status.status === "expired") {
|
|
91
|
+
paymentSpinner.fail("Payment session expired. Please try again.");
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// Not ready yet, keep polling
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
paymentSpinner.fail("Payment timed out. Please try again.");
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../../src/commands/cards/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface CardDetails {
|
|
2
|
+
pan: string;
|
|
3
|
+
cvv: string;
|
|
4
|
+
expiryMonth: number;
|
|
5
|
+
expiryYear: number;
|
|
6
|
+
amountCents: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function printCardDetails(card: CardDetails): void;
|
|
9
|
+
export declare function cardDetails(id: string): Promise<void>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { get } from "../../lib/api.js";
|
|
3
|
+
export function printCardDetails(card) {
|
|
4
|
+
const expiry = `${String(card.expiryMonth).padStart(2, "0")}/${card.expiryYear}`;
|
|
5
|
+
console.log("");
|
|
6
|
+
console.log(chalk.bold(" Card Details"));
|
|
7
|
+
console.log(chalk.dim(" ────────────────────────────"));
|
|
8
|
+
console.log(` Number: ${chalk.white(card.pan)}`);
|
|
9
|
+
console.log(` CVV: ${chalk.white(card.cvv)}`);
|
|
10
|
+
console.log(` Expiry: ${chalk.white(expiry)}`);
|
|
11
|
+
console.log(` Amount: ${chalk.green(`$${(card.amountCents / 100).toFixed(2)}`)}`);
|
|
12
|
+
console.log(chalk.dim(" ────────────────────────────"));
|
|
13
|
+
console.log("");
|
|
14
|
+
console.log(chalk.yellow(" Keep these details secure."));
|
|
15
|
+
console.log("");
|
|
16
|
+
}
|
|
17
|
+
export async function cardDetails(id) {
|
|
18
|
+
let card;
|
|
19
|
+
try {
|
|
20
|
+
card = await get(`/api/cards/${id}/details`);
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
console.error(chalk.red(`Failed to fetch card details: ${err instanceof Error ? err.message : "Unknown error"}`));
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
printCardDetails(card);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=details.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"details.js","sourceRoot":"","sources":["../../../../src/commands/cards/details.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAUvC,MAAM,UAAU,gBAAgB,CAAC,IAAiB;IAChD,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;IAEjF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAAU;IAC1C,IAAI,IAAiB,CAAC;IACtB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,GAAG,CAAc,cAAc,EAAE,UAAU,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,iCAAiC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CACxF,CACF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,gBAAgB,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function listCards(): Promise<void>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { get } from "../../lib/api.js";
|
|
3
|
+
export async function listCards() {
|
|
4
|
+
let cards;
|
|
5
|
+
try {
|
|
6
|
+
const res = await get("/api/cards");
|
|
7
|
+
cards = res.cards;
|
|
8
|
+
}
|
|
9
|
+
catch (err) {
|
|
10
|
+
console.error(chalk.red(`Failed to fetch cards: ${err instanceof Error ? err.message : "Unknown error"}`));
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
if (cards.length === 0) {
|
|
14
|
+
console.log(chalk.yellow('No cards yet. Run `agentcard cards create` to get started.'));
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const idWidth = Math.max(4, ...cards.map((c) => c.id.length)) + 2;
|
|
18
|
+
const header = `${"ID".padEnd(idWidth)} ${"Last 4".padEnd(8)} ${"Amount".padEnd(10)} Purchased`;
|
|
19
|
+
console.log(chalk.bold(header));
|
|
20
|
+
console.log("-".repeat(header.length));
|
|
21
|
+
for (const card of cards) {
|
|
22
|
+
const amount = `$${(card.amountCents / 100).toFixed(2)}`;
|
|
23
|
+
const date = card.purchasedAt ? new Date(card.purchasedAt).toLocaleDateString() : "-";
|
|
24
|
+
console.log(`${card.id.padEnd(idWidth)} ${card.last4.padEnd(8)} ${amount.padEnd(10)} ${date}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/commands/cards/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AASvC,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,IAAI,KAAa,CAAC;IAClB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAoB,YAAY,CAAC,CAAC;QACvD,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IACpB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,0BAA0B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CACjF,CACF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,4DAA4D,CAC7D,CACF,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC;IAChG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QAEtF,OAAO,CAAC,GAAG,CACT,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAClF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function logout(): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,UAAU,MAAM;IACpB,WAAW,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import { get, post } from "../lib/api.js";
|
|
5
|
+
import { prompt } from "../lib/prompt.js";
|
|
6
|
+
import { saveConfig } from "../lib/config.js";
|
|
7
|
+
const API_URL = process.env.AGENTCARD_API_URL || "https://apk.flors.world";
|
|
8
|
+
const POLL_INTERVAL = 2000;
|
|
9
|
+
const TIMEOUT = 5 * 60 * 1000;
|
|
10
|
+
export async function signup(opts) {
|
|
11
|
+
let email = opts.email;
|
|
12
|
+
if (!email) {
|
|
13
|
+
const answers = await prompt([
|
|
14
|
+
{ type: "input", name: "email", message: "Email address:" },
|
|
15
|
+
]);
|
|
16
|
+
email = answers.email;
|
|
17
|
+
}
|
|
18
|
+
if (!email) {
|
|
19
|
+
console.error(chalk.red("Email is required."));
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
const state = crypto.randomUUID();
|
|
23
|
+
// Register the CLI auth state
|
|
24
|
+
await post("/api/auth/cli/start", { state }, { auth: false });
|
|
25
|
+
// Send magic link via better-auth
|
|
26
|
+
console.log(chalk.blue(`Sending magic link to ${email}...`));
|
|
27
|
+
const callbackURL = `${API_URL}/auth/cli/callback?state=${state}`;
|
|
28
|
+
try {
|
|
29
|
+
await post("/api/auth/sign-in/magic-link", { email, callbackURL }, { auth: false });
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
console.error(chalk.red("Failed to send magic link. Please try again."));
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
console.log(chalk.dim("Check your email and click the link."));
|
|
36
|
+
const spinner = ora("Waiting for authentication...").start();
|
|
37
|
+
const deadline = Date.now() + TIMEOUT;
|
|
38
|
+
while (Date.now() < deadline) {
|
|
39
|
+
await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL));
|
|
40
|
+
try {
|
|
41
|
+
const result = await get(`/api/auth/cli/poll?state=${state}`, { auth: false });
|
|
42
|
+
if (result.status === "complete" && result.token && result.email) {
|
|
43
|
+
spinner.stop();
|
|
44
|
+
saveConfig({ token: result.token, email: result.email });
|
|
45
|
+
console.log(chalk.green(`Logged in as ${result.email}`));
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Not ready yet, keep polling
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
spinner.fail("Authentication timed out. Please try again.");
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=signup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signup.js","sourceRoot":"","sources":["../../../src/commands/signup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function whoami(): Promise<void>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { get } from "../lib/api.js";
|
|
3
|
+
import { getConfig } from "../lib/config.js";
|
|
4
|
+
export async function whoami() {
|
|
5
|
+
const config = getConfig();
|
|
6
|
+
if (!config.token) {
|
|
7
|
+
console.log(chalk.yellow("Not logged in. Run `agentcard signup` to get started."));
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
try {
|
|
11
|
+
const result = await get("/api/auth/me");
|
|
12
|
+
console.log(chalk.blue(result.email));
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
console.error(chalk.red("Failed to verify session. Try `agentcard signup` again."));
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAM7C,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,uDAAuD,CAAC,CAAC,CAAC;QACnF,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAa,cAAc,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC,CAAC;IACtF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { signup } from "./commands/signup.js";
|
|
3
|
+
import { logout } from "./commands/logout.js";
|
|
4
|
+
import { whoami } from "./commands/whoami.js";
|
|
5
|
+
import { createCard } from "./commands/cards/create.js";
|
|
6
|
+
import { listCards } from "./commands/cards/list.js";
|
|
7
|
+
import { cardDetails } from "./commands/cards/details.js";
|
|
8
|
+
import { balance } from "./commands/balance.js";
|
|
9
|
+
const program = new Command();
|
|
10
|
+
program
|
|
11
|
+
.name("agentcard")
|
|
12
|
+
.description("Prepaid virtual Visa cards for AI agents")
|
|
13
|
+
.version("0.1.0")
|
|
14
|
+
.addHelpText("after", `
|
|
15
|
+
Examples:
|
|
16
|
+
|
|
17
|
+
$ agentcard signup --email you@example.com Sign up (AI-friendly, no browser)
|
|
18
|
+
$ agentcard signup Sign up (interactive prompt)
|
|
19
|
+
$ agentcard cards create --amount 25 Buy a $25 card (errors with available options if amount is unavailable)
|
|
20
|
+
$ agentcard cards create Browse available denominations and purchase
|
|
21
|
+
$ agentcard cards list List your cards
|
|
22
|
+
$ agentcard cards details <id> Reveal full card number, CVV, expiry
|
|
23
|
+
$ agentcard balance <id> Check card denomination
|
|
24
|
+
|
|
25
|
+
Quickstart:
|
|
26
|
+
|
|
27
|
+
$ agentcard signup --email you@example.com
|
|
28
|
+
$ agentcard cards create --amount 10
|
|
29
|
+
$ agentcard cards details <card-id>
|
|
30
|
+
→ Give the card details to your AI agent
|
|
31
|
+
`);
|
|
32
|
+
// -- Auth -------------------------------------------------------------------
|
|
33
|
+
program
|
|
34
|
+
.command("signup")
|
|
35
|
+
.description("Sign up or log in")
|
|
36
|
+
.option("--email <email>", "Email address (sends magic link directly, no browser needed)")
|
|
37
|
+
.action(signup);
|
|
38
|
+
program
|
|
39
|
+
.command("login")
|
|
40
|
+
.description("Alias for signup")
|
|
41
|
+
.option("--email <email>", "Email address (sends magic link directly, no browser needed)")
|
|
42
|
+
.action(signup);
|
|
43
|
+
program
|
|
44
|
+
.command("logout")
|
|
45
|
+
.description("Log out and clear saved credentials")
|
|
46
|
+
.action(logout);
|
|
47
|
+
program
|
|
48
|
+
.command("whoami")
|
|
49
|
+
.description("Show the currently logged-in user")
|
|
50
|
+
.action(whoami);
|
|
51
|
+
// -- Cards ------------------------------------------------------------------
|
|
52
|
+
const cards = program
|
|
53
|
+
.command("cards")
|
|
54
|
+
.description("Manage prepaid cards");
|
|
55
|
+
cards
|
|
56
|
+
.command("create")
|
|
57
|
+
.description("Purchase a prepaid card. Omit --amount to browse available options")
|
|
58
|
+
.option("--amount <dollars>", "Card amount in dollars (e.g. 10, 25, 50)")
|
|
59
|
+
.action((opts) => createCard(opts.amount));
|
|
60
|
+
cards
|
|
61
|
+
.command("list")
|
|
62
|
+
.description("List all your purchased cards")
|
|
63
|
+
.action(listCards);
|
|
64
|
+
cards
|
|
65
|
+
.command("details")
|
|
66
|
+
.description("Reveal full card details (PAN, CVV, expiry)")
|
|
67
|
+
.argument("<id>", "Card ID")
|
|
68
|
+
.action(cardDetails);
|
|
69
|
+
program
|
|
70
|
+
.command("balance")
|
|
71
|
+
.description("Check card denomination")
|
|
72
|
+
.argument("<id>", "Card ID")
|
|
73
|
+
.action(balance);
|
|
74
|
+
export { program };
|
|
75
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,0CAA0C,CAAC;KACvD,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;;;;;CAiBH,CACE,CAAC;AAEJ,8EAA8E;AAE9E,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,mBAAmB,CAAC;KAChC,MAAM,CAAC,iBAAiB,EAAE,8DAA8D,CAAC;KACzF,MAAM,CAAC,MAAM,CAAC,CAAC;AAElB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,kBAAkB,CAAC;KAC/B,MAAM,CAAC,iBAAiB,EAAE,8DAA8D,CAAC;KACzF,MAAM,CAAC,MAAM,CAAC,CAAC;AAElB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,MAAM,CAAC,CAAC;AAElB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,MAAM,CAAC,CAAC;AAElB,8EAA8E;AAE9E,MAAM,KAAK,GAAG,OAAO;KAClB,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,sBAAsB,CAAC,CAAC;AAEvC,KAAK;KACF,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,oEAAoE,CAAC;KACjF,MAAM,CAAC,oBAAoB,EAAE,0CAA0C,CAAC;KACxE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAE7C,KAAK;KACF,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,SAAS,CAAC,CAAC;AAErB,KAAK;KACF,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,6CAA6C,CAAC;KAC1D,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;KAC3B,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,yBAAyB,CAAC;KACtC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;KAC3B,MAAM,CAAC,OAAO,CAAC,CAAC;AAEnB,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { getConfig } from "./config.js";
|
|
3
|
+
const API_URL = process.env.AGENTCARD_API_URL || "https://apk.flors.world";
|
|
4
|
+
async function request(method, path, body, options = { auth: true }) {
|
|
5
|
+
const headers = {
|
|
6
|
+
"Content-Type": "application/json",
|
|
7
|
+
};
|
|
8
|
+
if (options.auth !== false) {
|
|
9
|
+
const config = getConfig();
|
|
10
|
+
if (!config.token) {
|
|
11
|
+
console.error(chalk.red("Not logged in. Run `agentcard signup` first."));
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
headers["Authorization"] = `Bearer ${config.token}`;
|
|
15
|
+
}
|
|
16
|
+
const url = `${API_URL}${path}`;
|
|
17
|
+
const res = await fetch(url, {
|
|
18
|
+
method,
|
|
19
|
+
headers,
|
|
20
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
21
|
+
});
|
|
22
|
+
if (res.status === 401) {
|
|
23
|
+
console.error(chalk.red("Session expired. Run `agentcard signup` to log in again."));
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
if (!res.ok) {
|
|
27
|
+
const text = await res.text();
|
|
28
|
+
let message;
|
|
29
|
+
try {
|
|
30
|
+
const json = JSON.parse(text);
|
|
31
|
+
message = json.error || json.message || text;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
message = text;
|
|
35
|
+
}
|
|
36
|
+
throw new Error(message);
|
|
37
|
+
}
|
|
38
|
+
return res.json();
|
|
39
|
+
}
|
|
40
|
+
export function get(path, options) {
|
|
41
|
+
return request("GET", path, undefined, options);
|
|
42
|
+
}
|
|
43
|
+
export function post(path, body, options) {
|
|
44
|
+
return request("POST", path, body, options);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/lib/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,yBAAyB,CAAC;AAM3E,KAAK,UAAU,OAAO,CACpB,MAAc,EACd,IAAY,EACZ,IAAc,EACd,UAAsB,EAAE,IAAI,EAAE,IAAI,EAAE;IAEpC,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;KACnC,CAAC;IAEF,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAC;YACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,CAAC,KAAK,EAAE,CAAC;IACtD,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,IAAI,EAAE,CAAC;IAChC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,MAAM;QACN,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KAC9C,CAAC,CAAC;IAEH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,0DAA0D,CAAC,CACtE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9B,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,GAAG,CAAI,IAAY,EAAE,OAAoB;IACvD,OAAO,OAAO,CAAI,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,IAAI,CAClB,IAAY,EACZ,IAAc,EACd,OAAoB;IAEpB,OAAO,OAAO,CAAI,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
const CONFIG_DIR = join(homedir(), ".agentcard");
|
|
5
|
+
const CONFIG_FILE = join(CONFIG_DIR, "config.json");
|
|
6
|
+
export function getConfig() {
|
|
7
|
+
if (!existsSync(CONFIG_FILE)) {
|
|
8
|
+
return {};
|
|
9
|
+
}
|
|
10
|
+
try {
|
|
11
|
+
return JSON.parse(readFileSync(CONFIG_FILE, "utf-8"));
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return {};
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function saveConfig(config) {
|
|
18
|
+
if (!existsSync(CONFIG_DIR)) {
|
|
19
|
+
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
20
|
+
}
|
|
21
|
+
writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), {
|
|
22
|
+
mode: 0o600,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
export function clearConfig() {
|
|
26
|
+
if (existsSync(CONFIG_FILE)) {
|
|
27
|
+
writeFileSync(CONFIG_FILE, "{}", { mode: 0o600 });
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAOjC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AACjD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QAC1D,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,aAAa,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACpD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../src/lib/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,SAAgD;IAEhD,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentcard",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
"version": "0.0.2",
|
|
4
|
+
"description": "CLI for managing prepaid virtual Visa cards for AI agents",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"agentcard": "./dist/bin/apk.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"chalk": "^5.4.1",
|
|
14
|
+
"commander": "^13.1.0",
|
|
15
|
+
"inquirer": "^12.4.2",
|
|
16
|
+
"open": "^10.1.0",
|
|
17
|
+
"ora": "^8.2.0"
|
|
18
|
+
},
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"@types/node": "^22.0.0",
|
|
21
|
+
"typescript": "^5.7.0"
|
|
22
|
+
},
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "tsc",
|
|
25
|
+
"dev": "tsc --watch"
|
|
26
|
+
}
|
|
27
|
+
}
|
package/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
// Coming soon
|