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
@@ -0,0 +1,167 @@
1
+ import envPaths from 'env-paths';
2
+ import { spawn, execSync } from 'child_process';
3
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, cpSync } from 'fs';
4
+ import * as path from 'path';
5
+ import { fileURLToPath } from 'url';
6
+ import { getPrimaryProcessPid } from './processCheck.js';
7
+ const paths = envPaths('awal');
8
+ // This will be updated by the build script
9
+ const BUNDLE_VERSION = '1.0.0';
10
+ function getServerPaths() {
11
+ const dataDir = paths.data;
12
+ const bundleDir = path.join(dataDir, 'server');
13
+ // Electron binary location depends on platform
14
+ const electronBinName = process.platform === 'win32' ? 'electron.cmd' : 'electron';
15
+ return {
16
+ dataDir,
17
+ bundleDir,
18
+ versionFile: path.join(bundleDir, '.version'),
19
+ electronBin: path.join(bundleDir, 'node_modules', '.bin', electronBinName),
20
+ bundleElectron: path.join(bundleDir, 'bundle-electron.js'),
21
+ };
22
+ }
23
+ /**
24
+ * Checks if the server bundle is installed and up to date
25
+ */
26
+ async function isServerInstalled() {
27
+ const { versionFile, electronBin, bundleElectron } = getServerPaths();
28
+ // Check all required files exist
29
+ if (!existsSync(versionFile) || !existsSync(electronBin) || !existsSync(bundleElectron)) {
30
+ return false;
31
+ }
32
+ // Check version matches
33
+ try {
34
+ const installedVersion = readFileSync(versionFile, 'utf-8').trim();
35
+ return installedVersion === BUNDLE_VERSION;
36
+ }
37
+ catch {
38
+ return false;
39
+ }
40
+ }
41
+ /**
42
+ * Gets the path to the bundled server files within the npm package
43
+ */
44
+ function getPackageBundleDir() {
45
+ // This file is at dist/utils/serverManager.js
46
+ // Server bundle is at server-bundle/
47
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
48
+ return path.join(__dirname, '..', '..', 'server-bundle');
49
+ }
50
+ /**
51
+ * Installs the server bundle to the user's data directory
52
+ */
53
+ async function installServer(onProgress) {
54
+ const { bundleDir, versionFile, dataDir } = getServerPaths();
55
+ const packageBundleDir = getPackageBundleDir();
56
+ // Verify package bundle exists
57
+ if (!existsSync(packageBundleDir)) {
58
+ throw new Error(`Server bundle not found at ${packageBundleDir}. Package may be corrupted.`);
59
+ }
60
+ // Create data directory if needed
61
+ if (!existsSync(dataDir)) {
62
+ mkdirSync(dataDir, { recursive: true, mode: 0o700 });
63
+ }
64
+ // Copy bundled server files from package
65
+ onProgress?.('Copying server bundle...');
66
+ // Remove existing bundle if present
67
+ if (existsSync(bundleDir)) {
68
+ // Use rm -rf for cross-platform removal
69
+ try {
70
+ execSync(`rm -rf "${bundleDir}"`, { stdio: 'pipe' });
71
+ }
72
+ catch {
73
+ // Fallback: try to overwrite
74
+ }
75
+ }
76
+ cpSync(packageBundleDir, bundleDir, { recursive: true });
77
+ // Install Electron (the heavy dependency)
78
+ onProgress?.('Installing Electron runtime (one-time setup, may take a minute)...');
79
+ await new Promise((resolve, reject) => {
80
+ const npmCmd = process.platform === 'win32' ? 'npm.cmd' : 'npm';
81
+ const child = spawn(npmCmd, ['install', '--omit=dev'], {
82
+ cwd: bundleDir,
83
+ stdio: 'inherit',
84
+ shell: process.platform === 'win32',
85
+ });
86
+ child.on('error', (err) => reject(new Error(`npm install failed: ${err.message}`)));
87
+ child.on('exit', (code) => {
88
+ if (code === 0) {
89
+ resolve();
90
+ }
91
+ else {
92
+ reject(new Error(`npm install failed with exit code ${code}`));
93
+ }
94
+ });
95
+ });
96
+ // Write version marker
97
+ writeFileSync(versionFile, BUNDLE_VERSION, { mode: 0o600 });
98
+ }
99
+ /**
100
+ * Spawns the Electron server process in the background
101
+ */
102
+ async function spawnServer() {
103
+ const { electronBin, bundleElectron } = getServerPaths();
104
+ // Verify electron exists
105
+ if (!existsSync(electronBin)) {
106
+ throw new Error(`Electron not found at ${electronBin}. Try reinstalling with: rm -rf ~/.local/share/awal && awal status`);
107
+ }
108
+ const child = spawn(electronBin, [bundleElectron], {
109
+ detached: true,
110
+ stdio: 'ignore',
111
+ env: {
112
+ ...process.env,
113
+ STARTED_BY_CLI: 'true',
114
+ WALLET_STANDALONE: 'true',
115
+ },
116
+ });
117
+ // Don't wait for child, detach it
118
+ child.unref();
119
+ // Wait for server to initialize (poll for lock file)
120
+ const maxWaitMs = 30000;
121
+ const pollIntervalMs = 500;
122
+ const startTime = Date.now();
123
+ while (Date.now() - startTime < maxWaitMs) {
124
+ await new Promise(r => setTimeout(r, pollIntervalMs));
125
+ if (getPrimaryProcessPid() !== null) {
126
+ // Server is running, give it time to fully initialize
127
+ // (Electron + React app + IPC handlers)
128
+ await new Promise(r => setTimeout(r, 8000));
129
+ return;
130
+ }
131
+ }
132
+ throw new Error('Server failed to start within timeout');
133
+ }
134
+ /**
135
+ * Ensures the server is running, installing if needed
136
+ * @returns true if server is running, false on failure
137
+ */
138
+ export async function ensureServerRunning(onInstalling, onStarting) {
139
+ // Check if already running
140
+ if (getPrimaryProcessPid() !== null) {
141
+ return true;
142
+ }
143
+ try {
144
+ // Install if needed
145
+ if (!(await isServerInstalled())) {
146
+ onInstalling?.();
147
+ await installServer((msg) => {
148
+ // Progress messages are logged by the install process via stdio: 'inherit'
149
+ });
150
+ }
151
+ // Start server
152
+ onStarting?.();
153
+ await spawnServer();
154
+ return getPrimaryProcessPid() !== null;
155
+ }
156
+ catch (error) {
157
+ console.error('Failed to start server:', error instanceof Error ? error.message : error);
158
+ return false;
159
+ }
160
+ }
161
+ /**
162
+ * Checks if the wallet is running
163
+ */
164
+ export function isWalletRunning() {
165
+ return getPrimaryProcessPid() !== null;
166
+ }
167
+ //# sourceMappingURL=serverManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serverManager.js","sourceRoot":"","sources":["../../src/utils/serverManager.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "awal",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "description": "Coinbase Wallet CLI for payments and crypto",
6
+ "bin": "./dist/index.js",
7
+ "files": [
8
+ "dist/",
9
+ "server-bundle/"
10
+ ],
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "dev": "tsx src/index.ts",
14
+ "start": "node dist/index.js",
15
+ "typecheck": "tsc --noEmit",
16
+ "lint": "eslint src --ext .ts",
17
+ "format": "prettier --write src/**/*.ts"
18
+ },
19
+ "dependencies": {
20
+ "chalk": "^5.3.0",
21
+ "commander": "^12.0.0",
22
+ "env-paths": "^3.0.0",
23
+ "ora": "^8.0.0",
24
+ "viem": "^2.37.3",
25
+ "zod": "^3.23.8"
26
+ },
27
+ "devDependencies": {
28
+ "@types/node": "^20.17.57",
29
+ "tsx": "^4.20.3",
30
+ "typescript": "5.8.3"
31
+ },
32
+ "engines": {
33
+ "node": ">=18"
34
+ },
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "https://github.com/coinbase/awal"
38
+ },
39
+ "keywords": [
40
+ "wallet",
41
+ "coinbase",
42
+ "crypto",
43
+ "payments",
44
+ "x402",
45
+ "usdc",
46
+ "cli"
47
+ ],
48
+ "author": "Coinbase",
49
+ "license": "Apache-2.0"
50
+ }
@@ -0,0 +1,112 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Payments MCP - Connection Error</title>
7
+ <style>
8
+ * {
9
+ margin: 0;
10
+ padding: 0;
11
+ box-sizing: border-box;
12
+ }
13
+
14
+ body {
15
+ font-family: -apple-system, Inter, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
16
+ background: rgb(255, 255, 255);
17
+ display: flex;
18
+ align-items: center;
19
+ justify-content: center;
20
+ min-height: 100vh;
21
+ padding: 32px;
22
+ text-align: center;
23
+ }
24
+
25
+ .icon {
26
+ width: 60px;
27
+ height: 60px;
28
+ margin: 0 auto 24px;
29
+ border-radius: 50%;
30
+ display: flex;
31
+ align-items: center;
32
+ justify-content: center;
33
+ font-size: 40px;
34
+ }
35
+
36
+ h1 {
37
+ color: #1f2937;
38
+ font-size: 24px;
39
+ margin-bottom: 12px;
40
+ font-weight: 600;
41
+ }
42
+
43
+ p {
44
+ color: rgb(91, 97, 110);
45
+ font-size: 16px;
46
+ font-weight: 400;
47
+ line-height: 24px;
48
+ margin-bottom: 24px;
49
+ }
50
+
51
+ .button {
52
+ background: rgb(0, 82, 255);
53
+ border-radius: 56px;
54
+ border: none;
55
+ color: white;
56
+ cursor: pointer;
57
+ font-size: 16px;
58
+ font-weight: 600;
59
+ height: 56px;
60
+ line-height: 24px;
61
+ padding: 0 32px;
62
+ transition: all 0.2s;
63
+ width: 100%;
64
+ }
65
+
66
+ .button:hover {
67
+ background: rgb(0, 72, 224);
68
+ }
69
+
70
+ .button:active {
71
+ background: rgb(0, 67, 209);
72
+ transform: scale(0.98);
73
+ }
74
+ </style>
75
+ </head>
76
+ <body>
77
+ <div>
78
+ <div class="icon">⚠️</div>
79
+ <h1>Connection Error</h1>
80
+ <p>
81
+ Unable to connect to the Payments MCP service.
82
+ <br />
83
+ Please check your connection and try again.
84
+ </p>
85
+
86
+ <button class="button" onclick="retryConnection()">Retry connection</button>
87
+ </div>
88
+
89
+ <script>
90
+ function retryConnection() {
91
+ const button = document.querySelector('.button');
92
+
93
+ button.disabled = true;
94
+ button.textContent = 'Retrying...';
95
+
96
+ // Add a minimum delay so the "Retrying..." state is visible and doesn't feel buggy
97
+ setTimeout(() => {
98
+ // Tell Electron to reload the wallet URL
99
+ if (window.electron && window.electron.sendIPC) {
100
+ // Send IPC message to reload the wallet URL
101
+ // If successful, Electron will navigate to the wallet
102
+ // If it fails, the did-fail-load handler will show this fallback page again
103
+ window.electron.sendIPC('reload-wallet-url');
104
+ } else {
105
+ // If not in Electron, just reload the page to retry connection
106
+ window.location.reload();
107
+ }
108
+ }, 1000);
109
+ }
110
+ </script>
111
+ </body>
112
+ </html>
Binary file