@xona-labs/xpay 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.
Files changed (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +226 -0
  3. package/dist/cli/accounts.d.ts +13 -0
  4. package/dist/cli/accounts.d.ts.map +1 -0
  5. package/dist/cli/accounts.js +66 -0
  6. package/dist/cli/accounts.js.map +1 -0
  7. package/dist/cli/balance.d.ts +14 -0
  8. package/dist/cli/balance.d.ts.map +1 -0
  9. package/dist/cli/balance.js +60 -0
  10. package/dist/cli/balance.js.map +1 -0
  11. package/dist/cli/common.d.ts +20 -0
  12. package/dist/cli/common.d.ts.map +1 -0
  13. package/dist/cli/common.js +58 -0
  14. package/dist/cli/common.js.map +1 -0
  15. package/dist/cli/discover.d.ts +12 -0
  16. package/dist/cli/discover.d.ts.map +1 -0
  17. package/dist/cli/discover.js +69 -0
  18. package/dist/cli/discover.js.map +1 -0
  19. package/dist/cli/guardrail.d.ts +16 -0
  20. package/dist/cli/guardrail.d.ts.map +1 -0
  21. package/dist/cli/guardrail.js +71 -0
  22. package/dist/cli/guardrail.js.map +1 -0
  23. package/dist/cli/history.d.ts +16 -0
  24. package/dist/cli/history.d.ts.map +1 -0
  25. package/dist/cli/history.js +59 -0
  26. package/dist/cli/history.js.map +1 -0
  27. package/dist/cli/index.d.ts +17 -0
  28. package/dist/cli/index.d.ts.map +1 -0
  29. package/dist/cli/index.js +165 -0
  30. package/dist/cli/index.js.map +1 -0
  31. package/dist/cli/init.d.ts +23 -0
  32. package/dist/cli/init.d.ts.map +1 -0
  33. package/dist/cli/init.js +114 -0
  34. package/dist/cli/init.js.map +1 -0
  35. package/dist/cli/mcp-server.d.ts +26 -0
  36. package/dist/cli/mcp-server.d.ts.map +1 -0
  37. package/dist/cli/mcp-server.js +112 -0
  38. package/dist/cli/mcp-server.js.map +1 -0
  39. package/dist/cli/pay.d.ts +15 -0
  40. package/dist/cli/pay.d.ts.map +1 -0
  41. package/dist/cli/pay.js +76 -0
  42. package/dist/cli/pay.js.map +1 -0
  43. package/dist/cli/transfer.d.ts +19 -0
  44. package/dist/cli/transfer.d.ts.map +1 -0
  45. package/dist/cli/transfer.js +66 -0
  46. package/dist/cli/transfer.js.map +1 -0
  47. package/dist/discover/cache.d.ts +24 -0
  48. package/dist/discover/cache.d.ts.map +1 -0
  49. package/dist/discover/cache.js +94 -0
  50. package/dist/discover/cache.js.map +1 -0
  51. package/dist/discover/index.d.ts +21 -0
  52. package/dist/discover/index.d.ts.map +1 -0
  53. package/dist/discover/index.js +88 -0
  54. package/dist/discover/index.js.map +1 -0
  55. package/dist/discover/payai.d.ts +18 -0
  56. package/dist/discover/payai.d.ts.map +1 -0
  57. package/dist/discover/payai.js +56 -0
  58. package/dist/discover/payai.js.map +1 -0
  59. package/dist/do/index.d.ts +17 -0
  60. package/dist/do/index.d.ts.map +1 -0
  61. package/dist/do/index.js +32 -0
  62. package/dist/do/index.js.map +1 -0
  63. package/dist/guardrail/index.d.ts +47 -0
  64. package/dist/guardrail/index.d.ts.map +1 -0
  65. package/dist/guardrail/index.js +99 -0
  66. package/dist/guardrail/index.js.map +1 -0
  67. package/dist/history/evm.d.ts +21 -0
  68. package/dist/history/evm.d.ts.map +1 -0
  69. package/dist/history/evm.js +118 -0
  70. package/dist/history/evm.js.map +1 -0
  71. package/dist/history/index.d.ts +19 -0
  72. package/dist/history/index.d.ts.map +1 -0
  73. package/dist/history/index.js +45 -0
  74. package/dist/history/index.js.map +1 -0
  75. package/dist/history/solana.d.ts +20 -0
  76. package/dist/history/solana.d.ts.map +1 -0
  77. package/dist/history/solana.js +97 -0
  78. package/dist/history/solana.js.map +1 -0
  79. package/dist/history/types.d.ts +26 -0
  80. package/dist/history/types.d.ts.map +1 -0
  81. package/dist/history/types.js +10 -0
  82. package/dist/history/types.js.map +1 -0
  83. package/dist/index.d.ts +94 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +74 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/profile/derive.d.ts +28 -0
  88. package/dist/profile/derive.d.ts.map +1 -0
  89. package/dist/profile/derive.js +75 -0
  90. package/dist/profile/derive.js.map +1 -0
  91. package/dist/profile/index.d.ts +74 -0
  92. package/dist/profile/index.d.ts.map +1 -0
  93. package/dist/profile/index.js +115 -0
  94. package/dist/profile/index.js.map +1 -0
  95. package/dist/profile/storage.d.ts +35 -0
  96. package/dist/profile/storage.d.ts.map +1 -0
  97. package/dist/profile/storage.js +162 -0
  98. package/dist/profile/storage.js.map +1 -0
  99. package/dist/profile/types.d.ts +69 -0
  100. package/dist/profile/types.d.ts.map +1 -0
  101. package/dist/profile/types.js +9 -0
  102. package/dist/profile/types.js.map +1 -0
  103. package/dist/signers/index.d.ts +5 -0
  104. package/dist/signers/index.d.ts.map +1 -0
  105. package/dist/signers/index.js +5 -0
  106. package/dist/signers/index.js.map +1 -0
  107. package/dist/signers/phantom.d.ts +14 -0
  108. package/dist/signers/phantom.d.ts.map +1 -0
  109. package/dist/signers/phantom.js +12 -0
  110. package/dist/signers/phantom.js.map +1 -0
  111. package/dist/signers/privy.d.ts +20 -0
  112. package/dist/signers/privy.d.ts.map +1 -0
  113. package/dist/signers/privy.js +15 -0
  114. package/dist/signers/privy.js.map +1 -0
  115. package/dist/signers/raw-evm.d.ts +15 -0
  116. package/dist/signers/raw-evm.d.ts.map +1 -0
  117. package/dist/signers/raw-evm.js +70 -0
  118. package/dist/signers/raw-evm.js.map +1 -0
  119. package/dist/signers/raw-solana.d.ts +15 -0
  120. package/dist/signers/raw-solana.d.ts.map +1 -0
  121. package/dist/signers/raw-solana.js +88 -0
  122. package/dist/signers/raw-solana.js.map +1 -0
  123. package/dist/tools/index.d.ts +48 -0
  124. package/dist/tools/index.d.ts.map +1 -0
  125. package/dist/tools/index.js +164 -0
  126. package/dist/tools/index.js.map +1 -0
  127. package/dist/transfer/index.d.ts +30 -0
  128. package/dist/transfer/index.d.ts.map +1 -0
  129. package/dist/transfer/index.js +86 -0
  130. package/dist/transfer/index.js.map +1 -0
  131. package/dist/types.d.ts +203 -0
  132. package/dist/types.d.ts.map +1 -0
  133. package/dist/types.js +56 -0
  134. package/dist/types.js.map +1 -0
  135. package/dist/use/index.d.ts +38 -0
  136. package/dist/use/index.d.ts.map +1 -0
  137. package/dist/use/index.js +173 -0
  138. package/dist/use/index.js.map +1 -0
  139. package/dist/wallet/index.d.ts +31 -0
  140. package/dist/wallet/index.d.ts.map +1 -0
  141. package/dist/wallet/index.js +56 -0
  142. package/dist/wallet/index.js.map +1 -0
  143. package/package.json +70 -0
@@ -0,0 +1,71 @@
1
+ /**
2
+ * `xpay guardrail show|set|clear` — view and edit the active profile's
3
+ * spending guardrail. Persisted to config.json; loaded by every command that
4
+ * builds a runtime client.
5
+ */
6
+ import chalk from "chalk";
7
+ import { clearProfileGuardrail, readProfileConfig, setProfileGuardrail, } from "../profile/index.js";
8
+ import { getActiveProfile } from "./accounts.js";
9
+ export function runGuardrailShow(profileName) {
10
+ const name = profileName ?? getActiveProfile();
11
+ const config = readProfileConfig(name);
12
+ const g = config.guardrail;
13
+ console.log("");
14
+ console.log(chalk.bold(`Guardrail for "${name}"`));
15
+ if (!g || Object.keys(g).length === 0) {
16
+ console.log(chalk.yellow(" (no guardrail configured — calls are uncapped)"));
17
+ console.log(chalk.dim(" Set one with: xpay guardrail set --max-per-tx 1 --max-per-day 10"));
18
+ return;
19
+ }
20
+ console.log("");
21
+ if (g.maxPerTx !== undefined)
22
+ console.log(` max per tx $${g.maxPerTx.toFixed(4)}`);
23
+ if (g.maxPerDay !== undefined)
24
+ console.log(` max per 24h $${g.maxPerDay.toFixed(4)}`);
25
+ if (g.requireApprovalAbove !== undefined)
26
+ console.log(` approval above $${g.requireApprovalAbove.toFixed(4)}`);
27
+ if (g.allowedHosts?.length) {
28
+ console.log(` allowed hosts ${g.allowedHosts.join(", ")}`);
29
+ }
30
+ else {
31
+ console.log(` allowed hosts ${chalk.dim("(any)")}`);
32
+ }
33
+ console.log("");
34
+ }
35
+ export function runGuardrailSet(opts) {
36
+ const name = opts.profile ?? getActiveProfile();
37
+ const patch = {};
38
+ if (opts.maxPerTx !== undefined)
39
+ patch.maxPerTx = parseDollarsOrExit(opts.maxPerTx, "--max-per-tx");
40
+ if (opts.maxPerDay !== undefined)
41
+ patch.maxPerDay = parseDollarsOrExit(opts.maxPerDay, "--max-per-day");
42
+ if (opts.requireApprovalAbove !== undefined)
43
+ patch.requireApprovalAbove = parseDollarsOrExit(opts.requireApprovalAbove, "--require-approval-above");
44
+ if (opts.allowedHosts !== undefined) {
45
+ patch.allowedHosts = opts.allowedHosts
46
+ .split(",")
47
+ .map((s) => s.trim())
48
+ .filter(Boolean);
49
+ }
50
+ if (Object.keys(patch).length === 0) {
51
+ console.error(chalk.red("✗ no fields provided. See `xpay guardrail set --help`."));
52
+ process.exit(1);
53
+ }
54
+ setProfileGuardrail(name, patch);
55
+ console.log(chalk.green(`✔ Guardrail updated for "${name}"`));
56
+ runGuardrailShow(name);
57
+ }
58
+ export function runGuardrailClear(profileName) {
59
+ const name = profileName ?? getActiveProfile();
60
+ clearProfileGuardrail(name);
61
+ console.log(chalk.yellow(`⚠ Guardrail cleared for "${name}" — calls are now uncapped.`));
62
+ }
63
+ function parseDollarsOrExit(raw, flag) {
64
+ const n = Number(raw);
65
+ if (!Number.isFinite(n) || n < 0) {
66
+ console.error(chalk.red(`✗ ${flag} must be a non-negative number (got "${raw}")`));
67
+ process.exit(1);
68
+ }
69
+ return n;
70
+ }
71
+ //# sourceMappingURL=guardrail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guardrail.js","sourceRoot":"","sources":["../../src/cli/guardrail.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAUjD,MAAM,UAAU,gBAAgB,CAAC,WAAoB;IACnD,MAAM,IAAI,GAAG,WAAW,IAAI,gBAAgB,EAAE,CAAC;IAC/C,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;IAE3B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,IAAI,GAAG,CAAC,CAAC,CAAC;IACnD,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kDAAkD,CAAC,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC,CAAC;QAC7F,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7F,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/F,IAAI,CAAC,CAAC,oBAAoB,KAAK,SAAS;QACtC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7E,IAAI,CAAC,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAyB;IACvD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,IAAI,gBAAgB,EAAE,CAAC;IAChD,MAAM,KAAK,GAAmE,EAAE,CAAC;IAEjF,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;QAAE,KAAK,CAAC,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IACpG,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;QAAE,KAAK,CAAC,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IACxG,IAAI,IAAI,CAAC,oBAAoB,KAAK,SAAS;QACzC,KAAK,CAAC,oBAAoB,GAAG,kBAAkB,CAAC,IAAI,CAAC,oBAAoB,EAAE,0BAA0B,CAAC,CAAC;IACzG,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACpC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY;aACnC,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC,CAAC;QACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,4BAA4B,IAAI,GAAG,CAAC,CAAC,CAAC;IAC9D,gBAAgB,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,WAAoB;IACpD,MAAM,IAAI,GAAG,WAAW,IAAI,gBAAgB,EAAE,CAAC;IAC/C,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,4BAA4B,IAAI,6BAA6B,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW,EAAE,IAAY;IACnD,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,wCAAwC,GAAG,IAAI,CAAC,CAAC,CAAC;QACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * `xpay history` — recent USDC activity across all configured networks.
3
+ *
4
+ * Public-RPC powered by default. EVM scans a recent block window
5
+ * (~100k blocks ≈ 2 days on Base); pass --evm-window to widen.
6
+ */
7
+ export interface HistoryCmdOptions {
8
+ profile?: string;
9
+ passphrase?: string;
10
+ network?: string;
11
+ limit?: string;
12
+ evmWindow?: string;
13
+ json?: boolean;
14
+ }
15
+ export declare function runHistory(opts: HistoryCmdOptions): Promise<void>;
16
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/cli/history.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DvE"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * `xpay history` — recent USDC activity across all configured networks.
3
+ *
4
+ * Public-RPC powered by default. EVM scans a recent block window
5
+ * (~100k blocks ≈ 2 days on Base); pass --evm-window to widen.
6
+ */
7
+ import chalk from "chalk";
8
+ import { createXPay } from "../index.js";
9
+ import { unlockActive, shortAddress, timeAgo, formatUsd } from "./common.js";
10
+ export async function runHistory(opts) {
11
+ const profile = await unlockActive(opts);
12
+ const xpay = createXPay({ profile });
13
+ const limit = opts.limit ? Number(opts.limit) : 25;
14
+ const networks = opts.network ? [opts.network] : undefined;
15
+ const evmBlockWindow = opts.evmWindow ? Number(opts.evmWindow) : undefined;
16
+ const t0 = Date.now();
17
+ let entries;
18
+ try {
19
+ entries = await xpay.history({ limit, networks, evmBlockWindow });
20
+ }
21
+ catch (err) {
22
+ console.error(chalk.red(`✗ ${err.message}`));
23
+ process.exit(1);
24
+ }
25
+ const elapsed = Date.now() - t0;
26
+ if (opts.json) {
27
+ process.stdout.write(JSON.stringify(entries, null, 2) + "\n");
28
+ return;
29
+ }
30
+ if (entries.length === 0) {
31
+ console.log(chalk.yellow("No USDC activity in the scanned window."));
32
+ console.log(chalk.dim("Tip: widen the EVM window with --evm-window 500000, or run `xpay balance`."));
33
+ return;
34
+ }
35
+ console.log("");
36
+ console.log(chalk.dim(`${entries.length} entr${entries.length === 1 ? "y" : "ies"} (${elapsed}ms)`));
37
+ console.log("");
38
+ // Header
39
+ console.log(chalk.dim(" TIME".padEnd(12) +
40
+ "NETWORK".padEnd(10) +
41
+ "DIR".padEnd(10) +
42
+ "AMOUNT".padEnd(14) +
43
+ "COUNTERPARTY".padEnd(18) +
44
+ "TX"));
45
+ for (const e of entries) {
46
+ const dir = e.direction === "send" ? chalk.red("→ send") : chalk.green("← recv");
47
+ const amount = formatUsd(e.amountUsdc).padEnd(20); // padEnd ignores ANSI codes
48
+ console.log(" " +
49
+ timeAgo(e.timestamp).padEnd(12) +
50
+ chalk.cyan(e.network.padEnd(10)) +
51
+ dir.padEnd(18) + // padEnd ignores ANSI
52
+ formatUsd(e.amountUsdc).padEnd(20) +
53
+ chalk.white(shortAddress(e.counterparty, 6, 6).padEnd(18)) +
54
+ chalk.dim(shortAddress(e.signature, 6, 6)));
55
+ void amount;
56
+ }
57
+ console.log("");
58
+ }
59
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/cli/history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * xpay CLI — agentic-commerce wallet.
4
+ *
5
+ * Top-level commands:
6
+ * xpay init [--import] [--no-encrypt] [--workspace]
7
+ * xpay accounts list|show|use
8
+ * xpay balance [--network solana|base|...]
9
+ * xpay mcp (default: start MCP server on stdio)
10
+ *
11
+ * More to come: discover, pay, transfer, history, bridge, guardrail, link.
12
+ *
13
+ * Designed to also run as the MCP server entry point (the `bin` field points
14
+ * here) — invoking `xpay-mcp` directly defaults to the `mcp` subcommand.
15
+ */
16
+ import "dotenv/config";
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;GAaG;AAEH,OAAO,eAAe,CAAC"}
@@ -0,0 +1,165 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * xpay CLI — agentic-commerce wallet.
4
+ *
5
+ * Top-level commands:
6
+ * xpay init [--import] [--no-encrypt] [--workspace]
7
+ * xpay accounts list|show|use
8
+ * xpay balance [--network solana|base|...]
9
+ * xpay mcp (default: start MCP server on stdio)
10
+ *
11
+ * More to come: discover, pay, transfer, history, bridge, guardrail, link.
12
+ *
13
+ * Designed to also run as the MCP server entry point (the `bin` field points
14
+ * here) — invoking `xpay-mcp` directly defaults to the `mcp` subcommand.
15
+ */
16
+ import "dotenv/config";
17
+ import { basename } from "node:path";
18
+ import { Command } from "commander";
19
+ import chalk from "chalk";
20
+ import { runInit } from "./init.js";
21
+ import { runAccountsList, runAccountsShow, runAccountsUse } from "./accounts.js";
22
+ import { runBalance } from "./balance.js";
23
+ import { runDiscover } from "./discover.js";
24
+ import { runPay } from "./pay.js";
25
+ import { runHistory } from "./history.js";
26
+ import { runTransfer } from "./transfer.js";
27
+ import { runGuardrailShow, runGuardrailSet, runGuardrailClear } from "./guardrail.js";
28
+ import { startMcpServer } from "./mcp-server.js";
29
+ const program = new Command();
30
+ program
31
+ .name("xpay")
32
+ .description("xPay — discovery, payments, and wallet for agentic commerce.")
33
+ .version("0.1.0");
34
+ // ---------------------------------------------------------------- init
35
+ program
36
+ .command("init [name]")
37
+ .description("Create a new profile (Solana + EVM keys).")
38
+ .option("--import", "Import an existing recovery phrase instead of generating one")
39
+ .option("--no-encrypt", "Skip passphrase encryption (dev wallets only)")
40
+ .option("--workspace", "Store under <cwd>/.xpay/ instead of ~/.xpay/")
41
+ .option("--overwrite", "Replace an existing profile with the same name")
42
+ .option("--passphrase <value>", "Non-interactive passphrase (scripts/tests)")
43
+ .option("--mnemonic <phrase>", "Non-interactive mnemonic (scripts/tests)")
44
+ .action(async (name, opts) => {
45
+ await runInit({ name, ...opts });
46
+ });
47
+ // ---------------------------------------------------------------- accounts
48
+ const accounts = program
49
+ .command("accounts")
50
+ .description("Manage local profiles.");
51
+ accounts
52
+ .command("list", { isDefault: true })
53
+ .description("List all profiles in ~/.xpay/.")
54
+ .action(() => runAccountsList());
55
+ accounts
56
+ .command("show [name]")
57
+ .description("Show addresses + metadata for a profile.")
58
+ .action((name) => runAccountsShow(name));
59
+ accounts
60
+ .command("use <name>")
61
+ .description("Set the active profile.")
62
+ .action((name) => runAccountsUse(name));
63
+ // ---------------------------------------------------------------- discover
64
+ program
65
+ .command("discover [query]")
66
+ .description("Search the agentic-commerce catalog (PayAI + sources).")
67
+ .option("--limit <n>", "Max results (default 10)")
68
+ .option("--network <net>", "Filter by network (solana, base, ...)")
69
+ .option("--json", "Emit raw JSON instead of the table view")
70
+ .action(async (query, opts) => {
71
+ await runDiscover(query, opts);
72
+ });
73
+ // ---------------------------------------------------------------- pay
74
+ program
75
+ .command("pay <url>")
76
+ .description("Pay an x402 endpoint (catalog URL or any URL that returns 402).")
77
+ .option("--profile <name>", "Profile to pay from (defaults to active)")
78
+ .option("--passphrase <value>", "Non-interactive passphrase")
79
+ .option("--max-usd <n>", "Override per-tx guardrail cap for this call")
80
+ .option("--body <json>", "Request body for POST endpoints (JSON)")
81
+ .option("-y, --yes", "Skip the confirmation prompt")
82
+ .action(async (url, opts) => {
83
+ await runPay(url, opts);
84
+ });
85
+ // ---------------------------------------------------------------- history
86
+ program
87
+ .command("history")
88
+ .description("Recent USDC activity across all configured networks.")
89
+ .option("--profile <name>", "Profile to query (defaults to active)")
90
+ .option("--passphrase <value>", "Non-interactive passphrase")
91
+ .option("--network <net>", "Restrict to one network")
92
+ .option("--limit <n>", "Max entries (default 25)")
93
+ .option("--evm-window <blocks>", "Block window for EVM scans (default 100000)")
94
+ .option("--json", "Emit raw JSON")
95
+ .action(async (opts) => {
96
+ await runHistory(opts);
97
+ });
98
+ // ---------------------------------------------------------------- transfer
99
+ program
100
+ .command("transfer <amount> <token> <to>")
101
+ .description("Send USDC to an address (no x402). Subject to the active guardrail.")
102
+ .option("--profile <name>", "Profile to send from (defaults to active)")
103
+ .option("--passphrase <value>", "Non-interactive passphrase")
104
+ .option("--network <net>", "Force network (solana, base, ethereum, ...)")
105
+ .option("-y, --yes", "Skip the confirmation prompt")
106
+ .action(async (amount, token, to, opts) => {
107
+ await runTransfer(amount, token, to, opts);
108
+ });
109
+ // ---------------------------------------------------------------- guardrail
110
+ const guardrail = program
111
+ .command("guardrail")
112
+ .description("Inspect or edit spending caps for the active profile.");
113
+ guardrail
114
+ .command("show [profile]", { isDefault: true })
115
+ .description("Print the current guardrail config.")
116
+ .action((profile) => runGuardrailShow(profile));
117
+ guardrail
118
+ .command("set")
119
+ .description("Update guardrail fields. Unspecified fields are left alone.")
120
+ .option("--profile <name>", "Profile to edit (defaults to active)")
121
+ .option("--max-per-tx <usd>", "Hard cap per single call (USD)")
122
+ .option("--max-per-day <usd>", "Hard cap per rolling 24h (USD)")
123
+ .option("--require-approval-above <usd>", "Calls ≥ USD require an approval hook (set in SDK)")
124
+ .option("--allowed-hosts <list>", "Comma-separated host globs (use '*' to allow any)")
125
+ .action((opts) => runGuardrailSet(opts));
126
+ guardrail
127
+ .command("clear [profile]")
128
+ .description("Remove the guardrail entirely.")
129
+ .action((profile) => runGuardrailClear(profile));
130
+ // ---------------------------------------------------------------- balance
131
+ program
132
+ .command("balance")
133
+ .description("Show USDC balance per network for the active profile.")
134
+ .option("--profile <name>", "Profile to query (defaults to active)")
135
+ .option("--network <net>", "Restrict to one network (solana, base, ...)")
136
+ .option("--passphrase <value>", "Non-interactive passphrase")
137
+ .action(async (opts) => {
138
+ await runBalance(opts);
139
+ });
140
+ // ---------------------------------------------------------------- mcp
141
+ program
142
+ .command("mcp")
143
+ .description("Start the MCP server on stdio (for Claude Desktop / Cursor / Codex).")
144
+ .action(async () => {
145
+ process.stderr.write(chalk.cyan("[xpay-mcp] starting...\n"));
146
+ try {
147
+ await startMcpServer();
148
+ }
149
+ catch (err) {
150
+ process.stderr.write(chalk.red(`[xpay-mcp] fatal: ${err.message}\n`));
151
+ process.exit(1);
152
+ }
153
+ });
154
+ // ---------------------------------------------------------------- run
155
+ // When invoked as `xpay-mcp` (or any binary name containing "mcp"), default to
156
+ // the MCP server so MCP hosts don't need a subcommand in their config.
157
+ const invokedAs = basename(process.argv[1] ?? "");
158
+ if (invokedAs.includes("mcp") && process.argv.length <= 2) {
159
+ process.argv.push("mcp");
160
+ }
161
+ program.parseAsync(process.argv).catch((err) => {
162
+ process.stderr.write(chalk.red(`xpay: ${err}\n`));
163
+ process.exit(1);
164
+ });
165
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * `xpay init` — create a new profile (or import one).
3
+ *
4
+ * Flow:
5
+ * 1. Confirm profile name (default: "default") + workspace flag.
6
+ * 2. Either generate a fresh 24-word mnemonic or accept --import.
7
+ * 3. Prompt for passphrase (twice, with confirmation) unless --no-encrypt.
8
+ * 4. Write wallet.json + config.json under ~/.xpay/<name>/ (mode 0700).
9
+ * 5. Print addresses + force user to acknowledge the seed phrase.
10
+ */
11
+ export interface InitCmdOptions {
12
+ name?: string;
13
+ import?: boolean;
14
+ noEncrypt?: boolean;
15
+ workspace?: boolean;
16
+ overwrite?: boolean;
17
+ /** Non-interactive passphrase (for scripts/tests). */
18
+ passphrase?: string;
19
+ /** Non-interactive mnemonic (for scripts/tests). */
20
+ mnemonic?: string;
21
+ }
22
+ export declare function runInit(opts: InitCmdOptions): Promise<void>;
23
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAiGjE"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * `xpay init` — create a new profile (or import one).
3
+ *
4
+ * Flow:
5
+ * 1. Confirm profile name (default: "default") + workspace flag.
6
+ * 2. Either generate a fresh 24-word mnemonic or accept --import.
7
+ * 3. Prompt for passphrase (twice, with confirmation) unless --no-encrypt.
8
+ * 4. Write wallet.json + config.json under ~/.xpay/<name>/ (mode 0700).
9
+ * 5. Print addresses + force user to acknowledge the seed phrase.
10
+ */
11
+ import chalk from "chalk";
12
+ import inquirer from "inquirer";
13
+ import { initProfile, profileExists } from "../profile/index.js";
14
+ import { assertValidMnemonic } from "../profile/derive.js";
15
+ export async function runInit(opts) {
16
+ const name = opts.name ?? "default";
17
+ if (profileExists(name, { workspace: opts.workspace }) && !opts.overwrite) {
18
+ console.error(chalk.red(`✗ Profile "${name}" already exists.`) +
19
+ ` Pass --overwrite to replace it (you will lose access to the old wallet).`);
20
+ process.exit(1);
21
+ }
22
+ // --- Mnemonic ---
23
+ let mnemonic = opts.mnemonic;
24
+ if (opts.import && !mnemonic) {
25
+ const answer = await inquirer.prompt([
26
+ {
27
+ type: "input",
28
+ name: "mnemonic",
29
+ message: "Paste your 12- or 24-word recovery phrase:",
30
+ filter: (v) => v.trim().toLowerCase().replace(/\s+/g, " "),
31
+ },
32
+ ]);
33
+ mnemonic = answer.mnemonic;
34
+ }
35
+ if (mnemonic) {
36
+ try {
37
+ assertValidMnemonic(mnemonic);
38
+ }
39
+ catch (err) {
40
+ console.error(chalk.red(`✗ ${err.message}`));
41
+ process.exit(1);
42
+ }
43
+ }
44
+ // --- Passphrase ---
45
+ let passphrase = opts.passphrase;
46
+ if (!opts.noEncrypt && passphrase === undefined) {
47
+ const { p1, p2 } = await inquirer.prompt([
48
+ {
49
+ type: "password",
50
+ name: "p1",
51
+ message: "Encryption passphrase (used to unlock this wallet):",
52
+ mask: "*",
53
+ validate: (v) => v.length >= 8 || "Use at least 8 characters (or pass --no-encrypt for dev wallets)",
54
+ },
55
+ { type: "password", name: "p2", message: "Confirm passphrase:", mask: "*" },
56
+ ]);
57
+ if (p1 !== p2) {
58
+ console.error(chalk.red("✗ Passphrases do not match."));
59
+ process.exit(1);
60
+ }
61
+ passphrase = p1;
62
+ }
63
+ // --- Create ---
64
+ const result = await initProfile({
65
+ name,
66
+ mnemonic,
67
+ passphrase,
68
+ workspace: opts.workspace,
69
+ overwrite: opts.overwrite,
70
+ });
71
+ // --- Output ---
72
+ console.log("");
73
+ console.log(chalk.green(`✔ Profile "${result.name}" created at ${result.path}`));
74
+ console.log("");
75
+ console.log(chalk.bold("Addresses:"));
76
+ console.log(` Solana ${chalk.cyan(result.addresses.solana)}`);
77
+ console.log(` EVM ${chalk.cyan(result.addresses.evm)}`);
78
+ console.log("");
79
+ if (!opts.import) {
80
+ console.log(chalk.yellow.bold("⚠ RECOVERY PHRASE — write this down NOW. We cannot recover it for you."));
81
+ console.log("");
82
+ printMnemonicGrid(result.mnemonic);
83
+ console.log("");
84
+ if (process.stdin.isTTY && !opts.passphrase) {
85
+ const { ack } = await inquirer.prompt([
86
+ {
87
+ type: "confirm",
88
+ name: "ack",
89
+ message: "I have written down the recovery phrase in a safe place.",
90
+ default: false,
91
+ },
92
+ ]);
93
+ if (!ack) {
94
+ console.log(chalk.yellow("Take your time. The phrase is also visible above."));
95
+ }
96
+ }
97
+ }
98
+ console.log(chalk.dim("Next steps:"));
99
+ console.log(chalk.dim(" xpay balance # check funded balance"));
100
+ console.log(chalk.dim(" xpay discover foo # search the catalog"));
101
+ console.log(chalk.dim(" xpay pay <url> # pay an x402 endpoint"));
102
+ }
103
+ function printMnemonicGrid(mnemonic) {
104
+ const words = mnemonic.split(" ");
105
+ const cols = 4;
106
+ for (let i = 0; i < words.length; i += cols) {
107
+ const row = words
108
+ .slice(i, i + cols)
109
+ .map((w, j) => chalk.dim(`${String(i + j + 1).padStart(2)}.`) + ` ${chalk.bold(w.padEnd(12))}`)
110
+ .join(" ");
111
+ console.log(" " + row);
112
+ }
113
+ }
114
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * xPay MCP server.
3
+ *
4
+ * Exposes every CLI capability as an MCP tool over stdio. Designed to be
5
+ * dropped into Claude Desktop / Cursor / Codex configs verbatim:
6
+ *
7
+ * {
8
+ * "mcpServers": {
9
+ * "xpay": {
10
+ * "command": "npx",
11
+ * "args": ["-y", "@xona-labs/xpay"],
12
+ * "env": { "XPAY_PASSPHRASE": "<your-passphrase>" }
13
+ * }
14
+ * }
15
+ * }
16
+ *
17
+ * Configuration via env:
18
+ * XPAY_PROFILE profile to load (default: active profile, else "default")
19
+ * XPAY_PASSPHRASE passphrase for encrypted wallets
20
+ * XPAY_HOME override ~/.xpay/ root (mirrors the CLI)
21
+ *
22
+ * For ephemeral / test setups you can still bypass profiles with:
23
+ * XPAY_SOLANA_SECRET, XPAY_EVM_KEY, XPAY_EVM_NETWORK
24
+ */
25
+ export declare function startMcpServer(): Promise<void>;
26
+ //# sourceMappingURL=mcp-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/cli/mcp-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAiBH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAsCpD"}