awal 1.0.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 (81) hide show
  1. package/README.md +84 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +32 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/address.d.ts +3 -0
  7. package/dist/commands/address.d.ts.map +1 -0
  8. package/dist/commands/address.js +33 -0
  9. package/dist/commands/address.js.map +1 -0
  10. package/dist/commands/auth.d.ts +3 -0
  11. package/dist/commands/auth.d.ts.map +1 -0
  12. package/dist/commands/auth.js +76 -0
  13. package/dist/commands/auth.js.map +1 -0
  14. package/dist/commands/balance.d.ts +3 -0
  15. package/dist/commands/balance.d.ts.map +1 -0
  16. package/dist/commands/balance.js +72 -0
  17. package/dist/commands/balance.js.map +1 -0
  18. package/dist/commands/bazaar.d.ts +3 -0
  19. package/dist/commands/bazaar.d.ts.map +1 -0
  20. package/dist/commands/bazaar.js +134 -0
  21. package/dist/commands/bazaar.js.map +1 -0
  22. package/dist/commands/discover.d.ts +3 -0
  23. package/dist/commands/discover.d.ts.map +1 -0
  24. package/dist/commands/discover.js +76 -0
  25. package/dist/commands/discover.js.map +1 -0
  26. package/dist/commands/pay.d.ts +3 -0
  27. package/dist/commands/pay.d.ts.map +1 -0
  28. package/dist/commands/pay.js +78 -0
  29. package/dist/commands/pay.js.map +1 -0
  30. package/dist/commands/send.d.ts +3 -0
  31. package/dist/commands/send.d.ts.map +1 -0
  32. package/dist/commands/send.js +144 -0
  33. package/dist/commands/send.js.map +1 -0
  34. package/dist/commands/show.d.ts +3 -0
  35. package/dist/commands/show.d.ts.map +1 -0
  36. package/dist/commands/show.js +31 -0
  37. package/dist/commands/show.js.map +1 -0
  38. package/dist/commands/status.d.ts +3 -0
  39. package/dist/commands/status.d.ts.map +1 -0
  40. package/dist/commands/status.js +89 -0
  41. package/dist/commands/status.js.map +1 -0
  42. package/dist/commands/trade.d.ts +3 -0
  43. package/dist/commands/trade.d.ts.map +1 -0
  44. package/dist/commands/trade.js +163 -0
  45. package/dist/commands/trade.js.map +1 -0
  46. package/dist/formatters/output.d.ts +38 -0
  47. package/dist/formatters/output.d.ts.map +1 -0
  48. package/dist/formatters/output.js +83 -0
  49. package/dist/formatters/output.js.map +1 -0
  50. package/dist/index.d.ts +3 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +5 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/ipcClient.d.ts +14 -0
  55. package/dist/ipcClient.d.ts.map +1 -0
  56. package/dist/ipcClient.js +127 -0
  57. package/dist/ipcClient.js.map +1 -0
  58. package/dist/utils/authCheck.d.ts +13 -0
  59. package/dist/utils/authCheck.d.ts.map +1 -0
  60. package/dist/utils/authCheck.js +34 -0
  61. package/dist/utils/authCheck.js.map +1 -0
  62. package/dist/utils/errors.d.ts +21 -0
  63. package/dist/utils/errors.d.ts.map +1 -0
  64. package/dist/utils/errors.js +76 -0
  65. package/dist/utils/errors.js.map +1 -0
  66. package/dist/utils/processCheck.d.ts +11 -0
  67. package/dist/utils/processCheck.d.ts.map +1 -0
  68. package/dist/utils/processCheck.js +68 -0
  69. package/dist/utils/processCheck.js.map +1 -0
  70. package/dist/utils/serverManager.d.ts +10 -0
  71. package/dist/utils/serverManager.d.ts.map +1 -0
  72. package/dist/utils/serverManager.js +167 -0
  73. package/dist/utils/serverManager.js.map +1 -0
  74. package/package.json +50 -0
  75. package/server-bundle/assets/fallback.html +112 -0
  76. package/server-bundle/assets/icon.png +0 -0
  77. package/server-bundle/assets/menubar-iconTemplate.png +0 -0
  78. package/server-bundle/assets/menubar-iconTemplate@2x.png +0 -0
  79. package/server-bundle/bundle-electron.js +22 -0
  80. package/server-bundle/package.json +15 -0
  81. package/server-bundle/preload.js +1 -0
package/README.md ADDED
@@ -0,0 +1,84 @@
1
+ # awal
2
+
3
+ Coinbase Wallet CLI for payments and crypto.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npx awal status
9
+ ```
10
+
11
+ Or install globally:
12
+
13
+ ```bash
14
+ npm install -g awal
15
+ awal status
16
+ ```
17
+
18
+ ## Quick Start
19
+
20
+ ```bash
21
+ # Check status (will install server on first run)
22
+ awal status
23
+
24
+ # Sign in with email
25
+ awal auth login your@email.com
26
+ awal auth verify <flow-id> <6-digit-code>
27
+
28
+ # Check your balance
29
+ awal balance
30
+
31
+ # Get your wallet address
32
+ awal address
33
+
34
+ # Send USDC
35
+ awal send $1.00 0x...recipient...
36
+
37
+ # Swap tokens
38
+ awal trade $1 usdc eth
39
+ ```
40
+
41
+ ## Commands
42
+
43
+ ### Wallet
44
+
45
+ - `awal status` - Check server and auth status
46
+ - `awal balance` - Get wallet balances (USDC, ETH, WETH)
47
+ - `awal address` - Get wallet address
48
+ - `awal show` - Open wallet UI
49
+
50
+ ### Authentication
51
+
52
+ - `awal auth login <email>` - Start email OTP sign-in
53
+ - `awal auth verify <flowId> <code>` - Complete sign-in with 6-digit code
54
+
55
+ ### Transactions
56
+
57
+ - `awal send <amount> <recipient>` - Send USDC to address or ENS
58
+ - `awal trade <amount> <from> <to>` - Swap tokens
59
+
60
+ ### X402 Payments
61
+
62
+ - `awal bazaar list` - List X402 payment services
63
+ - `awal bazaar details <url>` - Get service details
64
+ - `awal pay <baseURL> <path>` - Make X402 payment request
65
+ - `awal discover <baseURL> <path>` - Discover payment requirements
66
+
67
+ ## Options
68
+
69
+ Most commands support:
70
+ - `--json` - Output as JSON
71
+ - `--chain <chain>` - Specify blockchain (default: base)
72
+
73
+ ## Architecture
74
+
75
+ The CLI communicates with an Electron-based wallet server via file-based IPC. On first run, the server bundle and Electron runtime are installed to `~/.local/share/awal/`.
76
+
77
+ ## Requirements
78
+
79
+ - Node.js 18+
80
+ - macOS, Linux, or Windows
81
+
82
+ ## License
83
+
84
+ Apache-2.0
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createProgram(): Command;
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,wBAAgB,aAAa,IAAI,OAAO,CAqBvC"}
package/dist/cli.js ADDED
@@ -0,0 +1,32 @@
1
+ import { Command } from 'commander';
2
+ import { createStatusCommand } from './commands/status.js';
3
+ import { createBalanceCommand } from './commands/balance.js';
4
+ import { createAddressCommand } from './commands/address.js';
5
+ import { createShowCommand } from './commands/show.js';
6
+ import { createBazaarCommand } from './commands/bazaar.js';
7
+ import { createPayCommand } from './commands/pay.js';
8
+ import { createDiscoverCommand } from './commands/discover.js';
9
+ import { createAuthCommand } from './commands/auth.js';
10
+ import { createSendCommand } from './commands/send.js';
11
+ import { createTradeCommand } from './commands/trade.js';
12
+ const VERSION = '1.0.0';
13
+ export function createProgram() {
14
+ const program = new Command();
15
+ program
16
+ .name('awal')
17
+ .description('Coinbase Wallet CLI for payments and crypto')
18
+ .version(VERSION);
19
+ // Add commands
20
+ program.addCommand(createStatusCommand());
21
+ program.addCommand(createBalanceCommand());
22
+ program.addCommand(createAddressCommand());
23
+ program.addCommand(createShowCommand());
24
+ program.addCommand(createBazaarCommand());
25
+ program.addCommand(createPayCommand());
26
+ program.addCommand(createDiscoverCommand());
27
+ program.addCommand(createAuthCommand());
28
+ program.addCommand(createSendCommand());
29
+ program.addCommand(createTradeCommand());
30
+ return program;
31
+ }
32
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,MAAM,CAAC;SACZ,WAAW,CAAC,6CAA6C,CAAC;SAC1D,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,eAAe;IACf,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAEzC,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createAddressCommand(): Command;
3
+ //# sourceMappingURL=address.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../../src/commands/address.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,oBAAoB,IAAI,OAAO,CA2B9C"}
@@ -0,0 +1,33 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { sendIpcRequest } from '../ipcClient.js';
5
+ import { requireAuth } from '../utils/authCheck.js';
6
+ import { formatError } from '../utils/errors.js';
7
+ import { formatJson } from '../formatters/output.js';
8
+ export function createAddressCommand() {
9
+ return new Command('address')
10
+ .description('Get wallet address')
11
+ .option('--json', 'Output as JSON')
12
+ .action(async (options) => {
13
+ const spinner = ora('Fetching wallet address...').start();
14
+ try {
15
+ // Check authentication first
16
+ await requireAuth();
17
+ const result = (await sendIpcRequest('get-wallet-address', {}));
18
+ spinner.stop();
19
+ if (options.json) {
20
+ console.log(formatJson(result));
21
+ return;
22
+ }
23
+ // Text output - just the address
24
+ console.log(result.address);
25
+ }
26
+ catch (error) {
27
+ spinner.fail('Failed to fetch address');
28
+ console.error(chalk.red(formatError(error)));
29
+ process.exit(1);
30
+ }
31
+ });
32
+ }
33
+ //# sourceMappingURL=address.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"address.js","sourceRoot":"","sources":["../../src/commands/address.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAMrD,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;SAC1B,WAAW,CAAC,oBAAoB,CAAC;SACjC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,OAAO,GAAG,GAAG,CAAC,4BAA4B,CAAC,CAAC,KAAK,EAAE,CAAC;QAE1D,IAAI,CAAC;YACH,6BAA6B;YAC7B,MAAM,WAAW,EAAE,CAAC;YAEpB,MAAM,MAAM,GAAG,CAAC,MAAM,cAAc,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAkB,CAAC;YACjF,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;gBAChC,OAAO;YACT,CAAC;YAED,iCAAiC;YACjC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACxC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createAuthCommand(): Command;
3
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,iBAAiB,IAAI,OAAO,CA4E3C"}
@@ -0,0 +1,76 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { sendIpcRequest } from '../ipcClient.js';
5
+ import { formatError } from '../utils/errors.js';
6
+ import { formatJson, formatSuccess, formatInfo } from '../formatters/output.js';
7
+ export function createAuthCommand() {
8
+ const auth = new Command('auth').description('Authentication commands');
9
+ auth
10
+ .command('login')
11
+ .description('Start email OTP authentication')
12
+ .argument('<email>', 'Email address')
13
+ .option('--json', 'Output as JSON')
14
+ .action(async (email, options) => {
15
+ const spinner = ora('Sending verification code...').start();
16
+ try {
17
+ const result = (await sendIpcRequest('sign-in-with-email', { email }));
18
+ spinner.stop();
19
+ if (options.json) {
20
+ console.log(formatJson(result));
21
+ return;
22
+ }
23
+ console.log(formatSuccess('Verification code sent!'));
24
+ console.log(formatInfo(`Check your email (${email}) for a 6-digit code.`));
25
+ console.log(`\n${chalk.bold('Flow ID:')} ${chalk.yellow(result.flowId)}`);
26
+ console.log(`\nTo complete sign-in, run:`);
27
+ console.log(chalk.cyan(` awal auth verify ${result.flowId} <6-digit-code>`));
28
+ }
29
+ catch (error) {
30
+ spinner.fail('Failed to send verification code');
31
+ console.error(chalk.red(formatError(error)));
32
+ process.exit(1);
33
+ }
34
+ });
35
+ auth
36
+ .command('verify')
37
+ .description('Complete email OTP verification')
38
+ .argument('<flowId>', 'Flow ID from login command')
39
+ .argument('<otp>', '6-digit verification code')
40
+ .option('--json', 'Output as JSON')
41
+ .action(async (flowId, otp, options) => {
42
+ // Validate OTP format
43
+ if (!/^\d{6}$/.test(otp)) {
44
+ console.error(chalk.red('OTP must be exactly 6 digits'));
45
+ process.exit(1);
46
+ }
47
+ const spinner = ora('Verifying code...').start();
48
+ try {
49
+ // The wallet returns a success message string on success, throws on failure
50
+ const result = await sendIpcRequest('verify-email-otp', { flowId, otp });
51
+ spinner.succeed('Authentication successful!');
52
+ if (options.json) {
53
+ // Normalize to object format for JSON output
54
+ const jsonResult = typeof result === 'string'
55
+ ? { success: true, message: result }
56
+ : result;
57
+ console.log(formatJson(jsonResult));
58
+ return;
59
+ }
60
+ // Show the success message from the wallet if available
61
+ if (typeof result === 'string' && result) {
62
+ console.log(chalk.dim(result));
63
+ }
64
+ console.log(`\nYou can now use wallet commands:`);
65
+ console.log(chalk.cyan(' awal balance'));
66
+ console.log(chalk.cyan(' awal address'));
67
+ }
68
+ catch (error) {
69
+ spinner.fail('Verification failed');
70
+ console.error(chalk.red(formatError(error)));
71
+ process.exit(1);
72
+ }
73
+ });
74
+ return auth;
75
+ }
76
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createBalanceCommand(): Command;
3
+ //# sourceMappingURL=balance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balance.d.ts","sourceRoot":"","sources":["../../src/commands/balance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsCpC,wBAAgB,oBAAoB,IAAI,OAAO,CAqD9C"}
@@ -0,0 +1,72 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { sendIpcRequest } from '../ipcClient.js';
5
+ import { requireAuth } from '../utils/authCheck.js';
6
+ import { formatError } from '../utils/errors.js';
7
+ import { formatJson } from '../formatters/output.js';
8
+ const DEFAULT_ASSETS = ['USDC', 'ETH', 'WETH'];
9
+ function formatAssetBalance(asset, raw, decimals) {
10
+ const balance = Number(raw) / Math.pow(10, decimals);
11
+ if (asset === 'USDC') {
12
+ return `$${balance.toFixed(2)}`;
13
+ }
14
+ // For ETH/WETH, show more precision for small amounts
15
+ if (balance === 0) {
16
+ return '0.00';
17
+ }
18
+ if (balance < 0.0001) {
19
+ return balance.toFixed(6);
20
+ }
21
+ return balance.toFixed(4);
22
+ }
23
+ export function createBalanceCommand() {
24
+ return new Command('balance')
25
+ .description('Get wallet balances (USDC, ETH, WETH)')
26
+ .option('--asset <asset>', 'Show specific asset only (usdc, eth, weth)')
27
+ .option('--chain <chain>', 'Blockchain network (e.g., base, base-sepolia)')
28
+ .option('--json', 'Output as JSON')
29
+ .action(async (options) => {
30
+ const spinner = ora('Fetching balances...').start();
31
+ try {
32
+ // Check authentication first
33
+ await requireAuth();
34
+ // Determine which assets to fetch
35
+ let assets;
36
+ if (options.asset) {
37
+ assets = [options.asset.toUpperCase()];
38
+ }
39
+ else {
40
+ assets = DEFAULT_ASSETS;
41
+ }
42
+ const data = { assets };
43
+ if (options.chain) {
44
+ data.chain = options.chain;
45
+ }
46
+ const result = (await sendIpcRequest('get-wallet-balance', data));
47
+ spinner.stop();
48
+ if (options.json) {
49
+ console.log(formatJson(result));
50
+ return;
51
+ }
52
+ // Text output - display balances in a clean format
53
+ const chainDisplay = result.chain ?? options.chain ?? 'base';
54
+ console.log(chalk.bold(`\nWallet Balances (${chainDisplay})`));
55
+ console.log(chalk.dim('─'.repeat(24)));
56
+ for (const asset of assets) {
57
+ const assetData = result.balances?.[asset];
58
+ const raw = assetData?.raw ?? '0';
59
+ const decimals = assetData?.decimals ?? (asset === 'USDC' ? 6 : 18);
60
+ const formatted = formatAssetBalance(asset, raw, decimals);
61
+ console.log(`${chalk.cyan(asset.padEnd(8))}${formatted}`);
62
+ }
63
+ console.log();
64
+ }
65
+ catch (error) {
66
+ spinner.fail('Failed to fetch balances');
67
+ console.error(chalk.red(formatError(error)));
68
+ process.exit(1);
69
+ }
70
+ });
71
+ }
72
+ //# sourceMappingURL=balance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balance.js","sourceRoot":"","sources":["../../src/commands/balance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createBazaarCommand(): Command;
3
+ //# sourceMappingURL=bazaar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bazaar.d.ts","sourceRoot":"","sources":["../../src/commands/bazaar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmDpC,wBAAgB,mBAAmB,IAAI,OAAO,CA0I7C"}
@@ -0,0 +1,134 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { sendIpcRequest } from '../ipcClient.js';
5
+ import { formatError } from '../utils/errors.js';
6
+ import { formatJson, formatTable, formatUsdcAmount } from '../formatters/output.js';
7
+ export function createBazaarCommand() {
8
+ const bazaar = new Command('bazaar').description('Browse X402 payment-enabled services');
9
+ bazaar
10
+ .command('list')
11
+ .description('List available bazaar resources')
12
+ .option('--network <network>', 'Filter by network (base, base-sepolia)')
13
+ .option('--full', 'Return complete details for all resources')
14
+ .option('--json', 'Output as JSON')
15
+ .action(async (options) => {
16
+ const spinner = ora('Fetching bazaar resources...').start();
17
+ try {
18
+ const data = {};
19
+ if (options.network) {
20
+ data.network = options.network;
21
+ }
22
+ if (options.full) {
23
+ data.full = true;
24
+ }
25
+ const result = (await sendIpcRequest('bazaar-list', data));
26
+ spinner.stop();
27
+ if (options.json) {
28
+ console.log(formatJson(result));
29
+ return;
30
+ }
31
+ // Table output
32
+ if (!result.items || result.items.length === 0) {
33
+ console.log('No resources found');
34
+ return;
35
+ }
36
+ if (options.full) {
37
+ // Full details - print each resource (handles nested accepts array)
38
+ for (const item of result.items) {
39
+ const fullItem = item;
40
+ const accept = fullItem.accepts?.[0];
41
+ console.log(chalk.bold(`\n${item.resource}`));
42
+ if (accept?.description) {
43
+ console.log(chalk.dim(accept.description));
44
+ }
45
+ if (accept?.maxAmountRequired) {
46
+ console.log(`Price: ${formatUsdcAmount(parseInt(accept.maxAmountRequired, 10))}`);
47
+ }
48
+ if (accept?.network) {
49
+ console.log(`Network: ${accept.network}`);
50
+ }
51
+ if (accept?.scheme) {
52
+ console.log(`Scheme: ${accept.scheme}`);
53
+ }
54
+ if (fullItem.metadata?.confidence?.overallScore !== undefined) {
55
+ console.log(`Quality Score: ${fullItem.metadata.confidence.overallScore}`);
56
+ }
57
+ if (accept?.outputSchema) {
58
+ console.log(`Schema: ${JSON.stringify(accept.outputSchema, null, 2)}`);
59
+ }
60
+ console.log('---');
61
+ }
62
+ }
63
+ else {
64
+ // Summary table (uses flat structure from summary format)
65
+ const tableData = result.items.map((r) => {
66
+ const summary = r;
67
+ return {
68
+ resource: summary.resource,
69
+ description: summary.description ?? '-',
70
+ price: summary.maxAmountRequired
71
+ ? formatUsdcAmount(parseInt(summary.maxAmountRequired, 10))
72
+ : '-',
73
+ network: summary.network ?? '-',
74
+ };
75
+ });
76
+ console.log(formatTable(tableData, [
77
+ { key: 'resource', header: 'Resource', width: 50 },
78
+ { key: 'description', header: 'Description', width: 40 },
79
+ { key: 'price', header: 'Price', width: 12 },
80
+ { key: 'network', header: 'Network', width: 12 },
81
+ ]));
82
+ }
83
+ }
84
+ catch (error) {
85
+ spinner.fail('Failed to fetch bazaar resources');
86
+ console.error(chalk.red(formatError(error)));
87
+ process.exit(1);
88
+ }
89
+ });
90
+ bazaar
91
+ .command('details')
92
+ .description('Get details for a specific bazaar resource')
93
+ .argument('<url>', 'Resource URL')
94
+ .option('--json', 'Output as JSON')
95
+ .action(async (url, options) => {
96
+ const spinner = ora('Fetching resource details...').start();
97
+ try {
98
+ const result = (await sendIpcRequest('bazaar-get-resource-details', {
99
+ resource: url,
100
+ }));
101
+ spinner.stop();
102
+ if (options.json) {
103
+ console.log(formatJson(result));
104
+ return;
105
+ }
106
+ // Text output
107
+ console.log(chalk.bold(`\n${result.name}`));
108
+ if (result.description) {
109
+ console.log(chalk.dim(result.description));
110
+ }
111
+ console.log(`\nURL: ${result.url}`);
112
+ console.log(`Method: ${result.method}`);
113
+ if (result.price !== undefined) {
114
+ console.log(`Price: ${formatUsdcAmount(result.price)}`);
115
+ }
116
+ if (result.network) {
117
+ console.log(`Network: ${result.network}`);
118
+ }
119
+ if (result.schema) {
120
+ console.log(`\nSchema:\n${JSON.stringify(result.schema, null, 2)}`);
121
+ }
122
+ if (result.paymentRequirements) {
123
+ console.log(`\nPayment Requirements:\n${JSON.stringify(result.paymentRequirements, null, 2)}`);
124
+ }
125
+ }
126
+ catch (error) {
127
+ spinner.fail('Failed to fetch resource details');
128
+ console.error(chalk.red(formatError(error)));
129
+ process.exit(1);
130
+ }
131
+ });
132
+ return bazaar;
133
+ }
134
+ //# sourceMappingURL=bazaar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bazaar.js","sourceRoot":"","sources":["../../src/commands/bazaar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createDiscoverCommand(): Command;
3
+ //# sourceMappingURL=discover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/commands/discover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,qBAAqB,IAAI,OAAO,CAiF/C"}
@@ -0,0 +1,76 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { sendIpcRequest } from '../ipcClient.js';
5
+ import { requireAuth } from '../utils/authCheck.js';
6
+ import { formatError } from '../utils/errors.js';
7
+ import { formatJson, formatUsdcAmount } from '../formatters/output.js';
8
+ export function createDiscoverCommand() {
9
+ return new Command('discover')
10
+ .description('Discover X402 payment requirements for an endpoint')
11
+ .argument('<baseURL>', 'Base URL of the X402-enabled endpoint')
12
+ .argument('<path>', 'Request path')
13
+ .option('-X, --method <method>', 'HTTP method (GET, POST, PUT, DELETE, PATCH)', 'GET')
14
+ .option('-q, --query <params>', 'Query parameters as JSON')
15
+ .option('-d, --data <json>', 'Request body as JSON')
16
+ .option('--json', 'Output as JSON')
17
+ .action(async (baseURL, path, options) => {
18
+ const spinner = ora('Discovering payment requirements...').start();
19
+ try {
20
+ // Check authentication first
21
+ await requireAuth();
22
+ const data = {
23
+ baseURL,
24
+ path,
25
+ method: options.method.toUpperCase(),
26
+ };
27
+ if (options.query) {
28
+ try {
29
+ data.queryParams = JSON.parse(options.query);
30
+ }
31
+ catch {
32
+ spinner.fail('Invalid JSON in --query');
33
+ console.error(chalk.red('The --query option must be valid JSON'));
34
+ process.exit(1);
35
+ }
36
+ }
37
+ if (options.data) {
38
+ try {
39
+ data.body = JSON.parse(options.data);
40
+ }
41
+ catch {
42
+ spinner.fail('Invalid JSON in --data');
43
+ console.error(chalk.red('The --data option must be valid JSON'));
44
+ process.exit(1);
45
+ }
46
+ }
47
+ const result = (await sendIpcRequest('discover-x402-requirements', data));
48
+ spinner.stop();
49
+ if (options.json) {
50
+ console.log(formatJson(result));
51
+ return;
52
+ }
53
+ // Text output
54
+ console.log(chalk.bold('Payment Requirements'));
55
+ console.log('---');
56
+ if (result.maxAmountRequired !== undefined) {
57
+ console.log(`Max Amount: ${formatUsdcAmount(result.maxAmountRequired)}`);
58
+ }
59
+ if (result.network) {
60
+ console.log(`Network: ${result.network}`);
61
+ }
62
+ if (result.accepts && result.accepts.length > 0) {
63
+ console.log(`Accepts: ${result.accepts.join(', ')}`);
64
+ }
65
+ if (result.paymentRequirements) {
66
+ console.log(`\nFull Requirements:\n${JSON.stringify(result.paymentRequirements, null, 2)}`);
67
+ }
68
+ }
69
+ catch (error) {
70
+ spinner.fail('Discovery failed');
71
+ console.error(chalk.red(formatError(error)));
72
+ process.exit(1);
73
+ }
74
+ });
75
+ }
76
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/commands/discover.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createPayCommand(): Command;
3
+ //# sourceMappingURL=pay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pay.d.ts","sourceRoot":"","sources":["../../src/commands/pay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,wBAAgB,gBAAgB,IAAI,OAAO,CAqF1C"}