awal 2.8.2 → 2.12.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 (83) hide show
  1. package/README.md +1 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +4 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/__tests__/address.test.d.ts +2 -0
  6. package/dist/commands/__tests__/address.test.d.ts.map +1 -0
  7. package/dist/commands/__tests__/address.test.js +90 -0
  8. package/dist/commands/__tests__/address.test.js.map +1 -0
  9. package/dist/commands/__tests__/balance.test.js +38 -4
  10. package/dist/commands/__tests__/balance.test.js.map +1 -1
  11. package/dist/commands/__tests__/trade.test.js +3 -0
  12. package/dist/commands/__tests__/trade.test.js.map +1 -1
  13. package/dist/commands/address.d.ts.map +1 -1
  14. package/dist/commands/address.js +27 -8
  15. package/dist/commands/address.js.map +1 -1
  16. package/dist/commands/auth.d.ts.map +1 -1
  17. package/dist/commands/auth.js +60 -11
  18. package/dist/commands/auth.js.map +1 -1
  19. package/dist/commands/balance.d.ts.map +1 -1
  20. package/dist/commands/balance.js +35 -5
  21. package/dist/commands/balance.js.map +1 -1
  22. package/dist/commands/bazaar.d.ts.map +1 -1
  23. package/dist/commands/bazaar.js +28 -13
  24. package/dist/commands/bazaar.js.map +1 -1
  25. package/dist/commands/details.d.ts.map +1 -1
  26. package/dist/commands/details.js +14 -6
  27. package/dist/commands/details.js.map +1 -1
  28. package/dist/commands/logout.d.ts +3 -0
  29. package/dist/commands/logout.d.ts.map +1 -0
  30. package/dist/commands/logout.js +52 -0
  31. package/dist/commands/logout.js.map +1 -0
  32. package/dist/commands/pay.d.ts.map +1 -1
  33. package/dist/commands/pay.js +58 -15
  34. package/dist/commands/pay.js.map +1 -1
  35. package/dist/commands/quit.d.ts.map +1 -1
  36. package/dist/commands/quit.js +15 -12
  37. package/dist/commands/quit.js.map +1 -1
  38. package/dist/commands/revoke.d.ts +3 -0
  39. package/dist/commands/revoke.d.ts.map +1 -0
  40. package/dist/commands/revoke.js +78 -0
  41. package/dist/commands/revoke.js.map +1 -0
  42. package/dist/commands/send.d.ts.map +1 -1
  43. package/dist/commands/send.js +65 -24
  44. package/dist/commands/send.js.map +1 -1
  45. package/dist/commands/status.d.ts.map +1 -1
  46. package/dist/commands/status.js +11 -4
  47. package/dist/commands/status.js.map +1 -1
  48. package/dist/commands/trade.d.ts.map +1 -1
  49. package/dist/commands/trade.js +86 -31
  50. package/dist/commands/trade.js.map +1 -1
  51. package/dist/commands/x402.js +1 -1
  52. package/dist/constants.d.ts +4 -0
  53. package/dist/constants.d.ts.map +1 -1
  54. package/dist/constants.js +10 -0
  55. package/dist/constants.js.map +1 -1
  56. package/dist/utils/__tests__/cliError.test.d.ts +2 -0
  57. package/dist/utils/__tests__/cliError.test.d.ts.map +1 -0
  58. package/dist/utils/__tests__/cliError.test.js +192 -0
  59. package/dist/utils/__tests__/cliError.test.js.map +1 -0
  60. package/dist/utils/chainValidation.d.ts +5 -0
  61. package/dist/utils/chainValidation.d.ts.map +1 -1
  62. package/dist/utils/chainValidation.js +12 -1
  63. package/dist/utils/chainValidation.js.map +1 -1
  64. package/dist/utils/cliError.d.ts +41 -0
  65. package/dist/utils/cliError.d.ts.map +1 -0
  66. package/dist/utils/cliError.js +46 -0
  67. package/dist/utils/cliError.js.map +1 -0
  68. package/dist/utils/errorCodes.d.ts +39 -0
  69. package/dist/utils/errorCodes.d.ts.map +1 -0
  70. package/dist/utils/errorCodes.js +42 -0
  71. package/dist/utils/errorCodes.js.map +1 -0
  72. package/dist/utils/logging.d.ts +12 -0
  73. package/dist/utils/logging.d.ts.map +1 -0
  74. package/dist/utils/logging.js +22 -0
  75. package/dist/utils/logging.js.map +1 -0
  76. package/dist/utils/processCheck.js +3 -3
  77. package/dist/utils/processCheck.js.map +1 -1
  78. package/dist/utils/serverManager.js +1 -1
  79. package/package.json +4 -4
  80. package/server-bundle/assets/fallback.html +2 -2
  81. package/server-bundle/bundle-electron.js +45 -45
  82. package/server-bundle/package.json +2 -2
  83. package/server-bundle/preload.js +1 -1
@@ -0,0 +1,192 @@
1
+ import { CliErrorCode } from '../errorCodes.js';
2
+ import { cliError, cliErrorFromCatch } from '../cliError.js';
3
+ import { WalletError } from '../errors.js';
4
+ describe('cliError', () => {
5
+ let mockExit;
6
+ let mockConsoleLog;
7
+ let mockConsoleError;
8
+ beforeEach(() => {
9
+ mockExit = jest.spyOn(process, 'exit').mockImplementation((() => {
10
+ throw new Error('process.exit called');
11
+ }));
12
+ mockConsoleLog = jest.spyOn(console, 'log').mockImplementation(() => { });
13
+ mockConsoleError = jest.spyOn(console, 'error').mockImplementation(() => { });
14
+ });
15
+ afterEach(() => {
16
+ mockExit.mockRestore();
17
+ mockConsoleLog.mockRestore();
18
+ mockConsoleError.mockRestore();
19
+ });
20
+ describe('JSON mode', () => {
21
+ it('outputs structured JSON to stdout', () => {
22
+ expect(() => cliError({
23
+ code: CliErrorCode.INVALID_AMOUNT,
24
+ message: 'Amount must be positive',
25
+ jsonMode: true,
26
+ })).toThrow('process.exit called');
27
+ expect(mockConsoleLog).toHaveBeenCalledTimes(1);
28
+ const output = JSON.parse(mockConsoleLog.mock.calls[0][0]);
29
+ expect(output).toEqual({
30
+ success: false,
31
+ error: {
32
+ code: 'INVALID_AMOUNT',
33
+ message: 'Amount must be positive',
34
+ },
35
+ });
36
+ });
37
+ it('does not write to stderr', () => {
38
+ expect(() => cliError({
39
+ code: CliErrorCode.AUTH_REQUIRED,
40
+ message: 'Not signed in',
41
+ jsonMode: true,
42
+ })).toThrow();
43
+ expect(mockConsoleError).not.toHaveBeenCalled();
44
+ });
45
+ it('stops spinner silently in JSON mode', () => {
46
+ const spinner = { stop: jest.fn(), fail: jest.fn() };
47
+ expect(() => cliError({
48
+ spinner,
49
+ code: CliErrorCode.BALANCE_FETCH_FAILED,
50
+ message: 'Fetch failed',
51
+ jsonMode: true,
52
+ })).toThrow();
53
+ expect(spinner.stop).toHaveBeenCalled();
54
+ expect(spinner.fail).not.toHaveBeenCalled();
55
+ });
56
+ it('exits with code 1', () => {
57
+ expect(() => cliError({
58
+ code: CliErrorCode.TRANSACTION_FAILED,
59
+ message: 'tx failed',
60
+ jsonMode: true,
61
+ })).toThrow();
62
+ expect(mockExit).toHaveBeenCalledWith(1);
63
+ });
64
+ });
65
+ describe('text mode', () => {
66
+ it('writes error to stderr', () => {
67
+ expect(() => cliError({
68
+ code: CliErrorCode.INVALID_RECIPIENT,
69
+ message: 'Invalid address format',
70
+ jsonMode: false,
71
+ })).toThrow();
72
+ expect(mockConsoleError).toHaveBeenCalledTimes(1);
73
+ // chalk.red wraps the message
74
+ expect(mockConsoleError.mock.calls[0][0]).toContain('Invalid address format');
75
+ });
76
+ it('does not write JSON to stdout', () => {
77
+ expect(() => cliError({
78
+ code: CliErrorCode.INVALID_RECIPIENT,
79
+ message: 'Invalid address format',
80
+ jsonMode: false,
81
+ })).toThrow();
82
+ expect(mockConsoleLog).not.toHaveBeenCalled();
83
+ });
84
+ it('fails spinner with spinnerText if provided', () => {
85
+ const spinner = { stop: jest.fn(), fail: jest.fn() };
86
+ expect(() => cliError({
87
+ spinner,
88
+ code: CliErrorCode.SWAP_FAILED,
89
+ message: 'Detailed error message',
90
+ jsonMode: false,
91
+ spinnerText: 'Swap failed',
92
+ })).toThrow();
93
+ expect(spinner.fail).toHaveBeenCalledWith('Swap failed');
94
+ expect(spinner.stop).not.toHaveBeenCalled();
95
+ });
96
+ it('fails spinner with message when no spinnerText', () => {
97
+ const spinner = { stop: jest.fn(), fail: jest.fn() };
98
+ expect(() => cliError({
99
+ spinner,
100
+ code: CliErrorCode.REVOKE_FAILED,
101
+ message: 'Revoke operation failed',
102
+ jsonMode: false,
103
+ })).toThrow();
104
+ expect(spinner.fail).toHaveBeenCalledWith('Revoke operation failed');
105
+ });
106
+ it('exits with code 1', () => {
107
+ expect(() => cliError({
108
+ code: CliErrorCode.QUIT_TIMEOUT,
109
+ message: 'Process still running',
110
+ })).toThrow();
111
+ expect(mockExit).toHaveBeenCalledWith(1);
112
+ });
113
+ it('works without spinner', () => {
114
+ expect(() => cliError({
115
+ code: CliErrorCode.INVALID_OTP,
116
+ message: 'OTP must be 6 digits',
117
+ jsonMode: false,
118
+ })).toThrow();
119
+ expect(mockConsoleError).toHaveBeenCalledTimes(1);
120
+ expect(mockExit).toHaveBeenCalledWith(1);
121
+ });
122
+ });
123
+ });
124
+ describe('cliErrorFromCatch', () => {
125
+ let mockExit;
126
+ let mockConsoleLog;
127
+ let mockConsoleError;
128
+ beforeEach(() => {
129
+ mockExit = jest.spyOn(process, 'exit').mockImplementation((() => {
130
+ throw new Error('process.exit called');
131
+ }));
132
+ mockConsoleLog = jest.spyOn(console, 'log').mockImplementation(() => { });
133
+ mockConsoleError = jest.spyOn(console, 'error').mockImplementation(() => { });
134
+ });
135
+ afterEach(() => {
136
+ mockExit.mockRestore();
137
+ mockConsoleLog.mockRestore();
138
+ mockConsoleError.mockRestore();
139
+ });
140
+ it('extracts message from Error instances', () => {
141
+ expect(() => cliErrorFromCatch({
142
+ code: CliErrorCode.REQUEST_FAILED,
143
+ error: new Error('Connection refused'),
144
+ jsonMode: true,
145
+ })).toThrow();
146
+ const output = JSON.parse(mockConsoleLog.mock.calls[0][0]);
147
+ expect(output.error.message).toBe('Error: Connection refused');
148
+ expect(output.error.code).toBe('REQUEST_FAILED');
149
+ });
150
+ it('uses getDisplayMessage for custom error classes', () => {
151
+ expect(() => cliErrorFromCatch({
152
+ code: CliErrorCode.SWAP_FAILED,
153
+ error: new WalletError('Insufficient funds'),
154
+ jsonMode: true,
155
+ })).toThrow();
156
+ const output = JSON.parse(mockConsoleLog.mock.calls[0][0]);
157
+ expect(output.error.message).toBe('Insufficient funds');
158
+ });
159
+ it('handles non-Error values', () => {
160
+ expect(() => cliErrorFromCatch({
161
+ code: CliErrorCode.DISCOVERY_FAILED,
162
+ error: 'string error',
163
+ jsonMode: true,
164
+ })).toThrow();
165
+ const output = JSON.parse(mockConsoleLog.mock.calls[0][0]);
166
+ expect(output.error.message).toBe('Unknown error: string error');
167
+ });
168
+ it('passes through spinner and spinnerText to cliError', () => {
169
+ const spinner = { stop: jest.fn(), fail: jest.fn() };
170
+ expect(() => cliErrorFromCatch({
171
+ spinner,
172
+ code: CliErrorCode.BAZAAR_FETCH_FAILED,
173
+ error: new Error('timeout'),
174
+ jsonMode: false,
175
+ spinnerText: 'Fetch failed',
176
+ })).toThrow();
177
+ expect(spinner.fail).toHaveBeenCalledWith('Fetch failed');
178
+ });
179
+ });
180
+ describe('CliErrorCode', () => {
181
+ it('has unique values for each key', () => {
182
+ const values = Object.values(CliErrorCode);
183
+ const unique = new Set(values);
184
+ expect(unique.size).toBe(values.length);
185
+ });
186
+ it('key equals value for all entries', () => {
187
+ for (const [key, value] of Object.entries(CliErrorCode)) {
188
+ expect(key).toBe(value);
189
+ }
190
+ });
191
+ });
192
+ //# sourceMappingURL=cliError.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliError.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/cliError.test.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,11 @@
3
3
  */
4
4
  export declare function isSolanaChain(chain?: string): boolean;
5
5
  export declare function isPolygonChain(chain?: string): boolean;
6
+ /**
7
+ * Checks whether a chain name is in the set of supported chains.
8
+ * Returns an error message if invalid, or undefined if valid.
9
+ */
10
+ export declare function validateChain(chain: string): string | undefined;
6
11
  /**
7
12
  * Checks whether an asset is supported on the given chain.
8
13
  * Returns an error message if incompatible, or undefined if valid.
@@ -1 +1 @@
1
- {"version":3,"file":"chainValidation.d.ts","sourceRoot":"","sources":["../../src/utils/chainValidation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAGrD;AAED,wBAAgB,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAGtD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAWnF"}
1
+ {"version":3,"file":"chainValidation.d.ts","sourceRoot":"","sources":["../../src/utils/chainValidation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAGrD;AAED,wBAAgB,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAGtD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAM/D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAWnF"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Chain validation utilities for the AWAL CLI.
3
3
  */
4
- import { SOLANA_CHAINS, POLYGON_CHAINS } from '../constants.js';
4
+ import { SOLANA_CHAINS, POLYGON_CHAINS, SUPPORTED_CHAINS } from '../constants.js';
5
5
  export function isSolanaChain(chain) {
6
6
  if (!chain)
7
7
  return false;
@@ -12,6 +12,17 @@ export function isPolygonChain(chain) {
12
12
  return false;
13
13
  return POLYGON_CHAINS.has(chain);
14
14
  }
15
+ /**
16
+ * Checks whether a chain name is in the set of supported chains.
17
+ * Returns an error message if invalid, or undefined if valid.
18
+ */
19
+ export function validateChain(chain) {
20
+ if (!SUPPORTED_CHAINS.has(chain)) {
21
+ const valid = Array.from(SUPPORTED_CHAINS).join(', ');
22
+ return `Invalid chain "${chain}". Must be one of: ${valid}`;
23
+ }
24
+ return undefined;
25
+ }
15
26
  /**
16
27
  * Checks whether an asset is supported on the given chain.
17
28
  * Returns an error message if incompatible, or undefined if valid.
@@ -1 +1 @@
1
- {"version":3,"file":"chainValidation.js","sourceRoot":"","sources":["../../src/utils/chainValidation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEhE,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,KAAa;IAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAEpC,IAAI,KAAK,KAAK,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;QAC/B,OAAO,wDAAwD,CAAC;IAClE,CAAC;IACD,IAAI,KAAK,KAAK,KAAK,IAAI,MAAM,EAAE,CAAC;QAC9B,OAAO,mDAAmD,CAAC;IAC7D,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"chainValidation.js","sourceRoot":"","sources":["../../src/utils/chainValidation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAElF,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,OAAO,kBAAkB,KAAK,sBAAsB,KAAK,EAAE,CAAC;IAC9D,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,KAAa;IAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAEpC,IAAI,KAAK,KAAK,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;QAC/B,OAAO,wDAAwD,CAAC;IAClE,CAAC;IACD,IAAI,KAAK,KAAK,KAAK,IAAI,MAAM,EAAE,CAAC;QAC9B,OAAO,mDAAmD,CAAC;IAC7D,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { Ora } from 'ora';
2
+ import type { CliErrorCode } from './errorCodes.js';
3
+ interface CliErrorOptions {
4
+ /** Active spinner instance (optional — some exits happen before spinner starts). */
5
+ spinner?: Ora;
6
+ /** Machine-readable error code. */
7
+ code: CliErrorCode;
8
+ /** Human-readable error message. */
9
+ message: string;
10
+ /** Whether --json flag is set. */
11
+ jsonMode?: boolean;
12
+ /** Label for spinner.fail() in text mode (defaults to message). */
13
+ spinnerText?: string;
14
+ }
15
+ interface CliErrorFromCatchOptions {
16
+ /** Active spinner instance (optional). */
17
+ spinner?: Ora;
18
+ /** Machine-readable error code. */
19
+ code: CliErrorCode;
20
+ /** The caught error value. */
21
+ error: unknown;
22
+ /** Whether --json flag is set. */
23
+ jsonMode?: boolean;
24
+ /** Label for spinner.fail() in text mode. */
25
+ spinnerText?: string;
26
+ }
27
+ /**
28
+ * Exits the CLI with a structured error.
29
+ *
30
+ * - JSON mode: stops spinner silently, writes JSON to stdout, exits 1.
31
+ * - Text mode: fails spinner with label, writes chalk-red message to stderr, exits 1.
32
+ */
33
+ export declare function cliError(opts: CliErrorOptions): never;
34
+ /**
35
+ * Convenience wrapper for catch blocks.
36
+ * Extracts the display message from the caught error via formatError(),
37
+ * then delegates to cliError().
38
+ */
39
+ export declare function cliErrorFromCatch(opts: CliErrorFromCatchOptions): never;
40
+ export {};
41
+ //# sourceMappingURL=cliError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliError.d.ts","sourceRoot":"","sources":["../../src/utils/cliError.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAG/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,UAAU,eAAe;IACvB,oFAAoF;IACpF,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,mCAAmC;IACnC,IAAI,EAAE,YAAY,CAAC;IACnB,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,wBAAwB;IAChC,0CAA0C;IAC1C,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,mCAAmC;IACnC,IAAI,EAAE,YAAY,CAAC;IACnB,8BAA8B;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,kCAAkC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,KAAK,CAmBrD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,wBAAwB,GAAG,KAAK,CAIvE"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Central error exit utility for CLI commands.
3
+ *
4
+ * When --json is active, outputs structured JSON to stdout so scripts can
5
+ * parse errors reliably. When --json is not active, outputs chalk-colored
6
+ * text to stderr (preserving the existing human-readable behavior).
7
+ *
8
+ * Return type is `never` so TypeScript flags unreachable code after a call.
9
+ */
10
+ import chalk from 'chalk';
11
+ import { formatJson } from '../formatters/output.js';
12
+ import { formatError } from './errors.js';
13
+ /**
14
+ * Exits the CLI with a structured error.
15
+ *
16
+ * - JSON mode: stops spinner silently, writes JSON to stdout, exits 1.
17
+ * - Text mode: fails spinner with label, writes chalk-red message to stderr, exits 1.
18
+ */
19
+ export function cliError(opts) {
20
+ const { spinner, code, message, jsonMode, spinnerText } = opts;
21
+ if (jsonMode) {
22
+ spinner?.stop();
23
+ console.log(formatJson({
24
+ success: false,
25
+ error: { code, message },
26
+ }));
27
+ }
28
+ else {
29
+ if (spinner) {
30
+ spinner.fail(spinnerText ?? message);
31
+ }
32
+ console.error(chalk.red(message));
33
+ }
34
+ process.exit(1);
35
+ }
36
+ /**
37
+ * Convenience wrapper for catch blocks.
38
+ * Extracts the display message from the caught error via formatError(),
39
+ * then delegates to cliError().
40
+ */
41
+ export function cliErrorFromCatch(opts) {
42
+ const { error, ...rest } = opts;
43
+ const message = formatError(error);
44
+ return cliError({ ...rest, message });
45
+ }
46
+ //# sourceMappingURL=cliError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliError.js","sourceRoot":"","sources":["../../src/utils/cliError.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA6B1C;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAqB;IAC5C,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAE/D,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CACT,UAAU,CAAC;YACT,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;SACzB,CAAC,CACH,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAA8B;IAC9D,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;IAChC,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACnC,OAAO,QAAQ,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Machine-readable error codes for CLI JSON output.
3
+ * Used with --json flag to produce structured error responses.
4
+ */
5
+ export declare const CliErrorCode: {
6
+ readonly INVALID_AMOUNT: "INVALID_AMOUNT";
7
+ readonly INVALID_RECIPIENT: "INVALID_RECIPIENT";
8
+ readonly INVALID_TOKEN: "INVALID_TOKEN";
9
+ readonly INVALID_SWAP: "INVALID_SWAP";
10
+ readonly INVALID_SLIPPAGE: "INVALID_SLIPPAGE";
11
+ readonly INVALID_CHAIN_CONFIG: "INVALID_CHAIN_CONFIG";
12
+ readonly INVALID_JSON_OPTION: "INVALID_JSON_OPTION";
13
+ readonly INVALID_OTP: "INVALID_OTP";
14
+ readonly INVALID_ADDRESS: "INVALID_ADDRESS";
15
+ readonly INVALID_SCHEME: "INVALID_SCHEME";
16
+ readonly INVALID_MAX_PRICE: "INVALID_MAX_PRICE";
17
+ readonly AUTH_LOGIN_FAILED: "AUTH_LOGIN_FAILED";
18
+ readonly AUTH_FLOW_MISSING: "AUTH_FLOW_MISSING";
19
+ readonly AUTH_VERIFY_FAILED: "AUTH_VERIFY_FAILED";
20
+ readonly AUTH_LOGOUT_FAILED: "AUTH_LOGOUT_FAILED";
21
+ readonly AUTH_REQUIRED: "AUTH_REQUIRED";
22
+ readonly TRANSACTION_FAILED: "TRANSACTION_FAILED";
23
+ readonly SWAP_FAILED: "SWAP_FAILED";
24
+ readonly REVOKE_FAILED: "REVOKE_FAILED";
25
+ readonly REQUEST_FAILED: "REQUEST_FAILED";
26
+ readonly DISCOVERY_FAILED: "DISCOVERY_FAILED";
27
+ readonly NO_PAYMENT_REQUIREMENTS: "NO_PAYMENT_REQUIREMENTS";
28
+ readonly ENS_RESOLUTION_FAILED: "ENS_RESOLUTION_FAILED";
29
+ readonly BALANCE_FETCH_FAILED: "BALANCE_FETCH_FAILED";
30
+ readonly ADDRESS_FETCH_FAILED: "ADDRESS_FETCH_FAILED";
31
+ readonly STATUS_CHECK_FAILED: "STATUS_CHECK_FAILED";
32
+ readonly BAZAAR_FETCH_FAILED: "BAZAAR_FETCH_FAILED";
33
+ readonly BAZAAR_SEARCH_FAILED: "BAZAAR_SEARCH_FAILED";
34
+ readonly QUIT_FAILED: "QUIT_FAILED";
35
+ readonly QUIT_TIMEOUT: "QUIT_TIMEOUT";
36
+ readonly WALLET_REFRESHING: "WALLET_REFRESHING";
37
+ };
38
+ export type CliErrorCode = (typeof CliErrorCode)[keyof typeof CliErrorCode];
39
+ //# sourceMappingURL=errorCodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorCodes.d.ts","sourceRoot":"","sources":["../../src/utils/errorCodes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCf,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Machine-readable error codes for CLI JSON output.
3
+ * Used with --json flag to produce structured error responses.
4
+ */
5
+ export const CliErrorCode = {
6
+ // Validation errors
7
+ INVALID_AMOUNT: 'INVALID_AMOUNT',
8
+ INVALID_RECIPIENT: 'INVALID_RECIPIENT',
9
+ INVALID_TOKEN: 'INVALID_TOKEN',
10
+ INVALID_SWAP: 'INVALID_SWAP',
11
+ INVALID_SLIPPAGE: 'INVALID_SLIPPAGE',
12
+ INVALID_CHAIN_CONFIG: 'INVALID_CHAIN_CONFIG',
13
+ INVALID_JSON_OPTION: 'INVALID_JSON_OPTION',
14
+ INVALID_OTP: 'INVALID_OTP',
15
+ INVALID_ADDRESS: 'INVALID_ADDRESS',
16
+ INVALID_SCHEME: 'INVALID_SCHEME',
17
+ INVALID_MAX_PRICE: 'INVALID_MAX_PRICE',
18
+ // Auth errors
19
+ AUTH_LOGIN_FAILED: 'AUTH_LOGIN_FAILED',
20
+ AUTH_FLOW_MISSING: 'AUTH_FLOW_MISSING',
21
+ AUTH_VERIFY_FAILED: 'AUTH_VERIFY_FAILED',
22
+ AUTH_LOGOUT_FAILED: 'AUTH_LOGOUT_FAILED',
23
+ AUTH_REQUIRED: 'AUTH_REQUIRED',
24
+ // Operation errors
25
+ TRANSACTION_FAILED: 'TRANSACTION_FAILED',
26
+ SWAP_FAILED: 'SWAP_FAILED',
27
+ REVOKE_FAILED: 'REVOKE_FAILED',
28
+ REQUEST_FAILED: 'REQUEST_FAILED',
29
+ DISCOVERY_FAILED: 'DISCOVERY_FAILED',
30
+ NO_PAYMENT_REQUIREMENTS: 'NO_PAYMENT_REQUIREMENTS',
31
+ ENS_RESOLUTION_FAILED: 'ENS_RESOLUTION_FAILED',
32
+ // Infrastructure errors
33
+ BALANCE_FETCH_FAILED: 'BALANCE_FETCH_FAILED',
34
+ ADDRESS_FETCH_FAILED: 'ADDRESS_FETCH_FAILED',
35
+ STATUS_CHECK_FAILED: 'STATUS_CHECK_FAILED',
36
+ BAZAAR_FETCH_FAILED: 'BAZAAR_FETCH_FAILED',
37
+ BAZAAR_SEARCH_FAILED: 'BAZAAR_SEARCH_FAILED',
38
+ QUIT_FAILED: 'QUIT_FAILED',
39
+ QUIT_TIMEOUT: 'QUIT_TIMEOUT',
40
+ WALLET_REFRESHING: 'WALLET_REFRESHING',
41
+ };
42
+ //# sourceMappingURL=errorCodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorCodes.js","sourceRoot":"","sources":["../../src/utils/errorCodes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,oBAAoB;IACpB,cAAc,EAAE,gBAAgB;IAChC,iBAAiB,EAAE,mBAAmB;IACtC,aAAa,EAAE,eAAe;IAC9B,YAAY,EAAE,cAAc;IAC5B,gBAAgB,EAAE,kBAAkB;IACpC,oBAAoB,EAAE,sBAAsB;IAC5C,mBAAmB,EAAE,qBAAqB;IAC1C,WAAW,EAAE,aAAa;IAC1B,eAAe,EAAE,iBAAiB;IAClC,cAAc,EAAE,gBAAgB;IAChC,iBAAiB,EAAE,mBAAmB;IAEtC,cAAc;IACd,iBAAiB,EAAE,mBAAmB;IACtC,iBAAiB,EAAE,mBAAmB;IACtC,kBAAkB,EAAE,oBAAoB;IACxC,kBAAkB,EAAE,oBAAoB;IACxC,aAAa,EAAE,eAAe;IAE9B,mBAAmB;IACnB,kBAAkB,EAAE,oBAAoB;IACxC,WAAW,EAAE,aAAa;IAC1B,aAAa,EAAE,eAAe;IAC9B,cAAc,EAAE,gBAAgB;IAChC,gBAAgB,EAAE,kBAAkB;IACpC,uBAAuB,EAAE,yBAAyB;IAClD,qBAAqB,EAAE,uBAAuB;IAE9C,wBAAwB;IACxB,oBAAoB,EAAE,sBAAsB;IAC5C,oBAAoB,EAAE,sBAAsB;IAC5C,mBAAmB,EAAE,qBAAqB;IAC1C,mBAAmB,EAAE,qBAAqB;IAC1C,oBAAoB,EAAE,sBAAsB;IAC5C,WAAW,EAAE,aAAa;IAC1B,YAAY,EAAE,cAAc;IAC5B,iBAAiB,EAAE,mBAAmB;CAC9B,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Fire-and-forget analytics event for CLI commands.
3
+ * Mirrors the safeLog* naming convention from the wallet UI's logging.ts.
4
+ * Events are routed through the track-analytics-event IPC channel to the
5
+ * renderer, where @cbhq/client-analytics processes them.
6
+ *
7
+ * Silently drops events when:
8
+ * - The user has disabled telemetry via `awal telemetry disable`
9
+ * - The wallet server is not already running (never auto-starts for analytics)
10
+ */
11
+ export declare function safeLogEvent(event: string, properties?: Record<string, unknown>): void;
12
+ //# sourceMappingURL=logging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../src/utils/logging.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAKtF"}
@@ -0,0 +1,22 @@
1
+ import { sendIpcRequest } from '../ipcClient.js';
2
+ import { readConfig } from './configManager.js';
3
+ import { getPrimaryProcessPid } from './processCheck.js';
4
+ /**
5
+ * Fire-and-forget analytics event for CLI commands.
6
+ * Mirrors the safeLog* naming convention from the wallet UI's logging.ts.
7
+ * Events are routed through the track-analytics-event IPC channel to the
8
+ * renderer, where @cbhq/client-analytics processes them.
9
+ *
10
+ * Silently drops events when:
11
+ * - The user has disabled telemetry via `awal telemetry disable`
12
+ * - The wallet server is not already running (never auto-starts for analytics)
13
+ */
14
+ export function safeLogEvent(event, properties) {
15
+ const { telemetryDisabled } = readConfig();
16
+ if (telemetryDisabled)
17
+ return;
18
+ if (getPrimaryProcessPid() === null)
19
+ return;
20
+ sendIpcRequest('track-analytics-event', { event, properties }).catch(() => { });
21
+ }
22
+ //# sourceMappingURL=logging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.js","sourceRoot":"","sources":["../../src/utils/logging.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,UAAoC;IAC9E,MAAM,EAAE,iBAAiB,EAAE,GAAG,UAAU,EAAE,CAAC;IAC3C,IAAI,iBAAiB;QAAE,OAAO;IAC9B,IAAI,oBAAoB,EAAE,KAAK,IAAI;QAAE,OAAO;IAC5C,cAAc,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACjF,CAAC"}
@@ -5,7 +5,7 @@ const LOCK_FILE = '/tmp/payments-mcp-ui.lock';
5
5
  /**
6
6
  * Checks if a PID represents a running payments-mcp process
7
7
  */
8
- function isPaymentsMcpProcessRunning(pid) {
8
+ function isAgenticWalletMcpProcessRunning(pid) {
9
9
  try {
10
10
  // Check if process exists
11
11
  process.kill(pid, 0);
@@ -34,7 +34,7 @@ export function verifyPrimaryProcessRunning() {
34
34
  }
35
35
  try {
36
36
  const lockPid = parseInt(fs.readFileSync(LOCK_FILE, 'utf8').trim(), 10);
37
- if (!isPaymentsMcpProcessRunning(lockPid)) {
37
+ if (!isAgenticWalletMcpProcessRunning(lockPid)) {
38
38
  throw new WalletNotRunningError();
39
39
  }
40
40
  }
@@ -56,7 +56,7 @@ export function getPrimaryProcessPid() {
56
56
  }
57
57
  try {
58
58
  const lockPid = parseInt(fs.readFileSync(LOCK_FILE, 'utf8').trim(), 10);
59
- if (isPaymentsMcpProcessRunning(lockPid)) {
59
+ if (isAgenticWalletMcpProcessRunning(lockPid)) {
60
60
  return lockPid;
61
61
  }
62
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"processCheck.js","sourceRoot":"","sources":["../../src/utils/processCheck.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,SAAS,GAAG,2BAA2B,CAAC;AAE9C;;GAEG;AACH,SAAS,2BAA2B,CAAC,GAAW;IAC9C,IAAI,CAAC;QACH,0BAA0B;QAC1B,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAErB,iEAAiE;QACjE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,GAAG,cAAc,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACzF,OAAO,CACL,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC;gBACtC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC;gBACnC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAC3B,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC;gBACpC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CACnC,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B;IACzC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,qBAAqB,EAAE,CAAC;IACpC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,qBAAqB,EAAE,CAAC;QACpC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,qBAAqB,EAAE,CAAC;YAC3C,MAAM,KAAK,CAAC;QACd,CAAC;QACD,0CAA0C;QAC1C,MAAM,IAAI,qBAAqB,EAAE,CAAC;IACpC,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACxE,IAAI,2BAA2B,CAAC,OAAO,CAAC,EAAE,CAAC;YACzC,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB;IAClB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"processCheck.js","sourceRoot":"","sources":["../../src/utils/processCheck.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,SAAS,GAAG,2BAA2B,CAAC;AAE9C;;GAEG;AACH,SAAS,gCAAgC,CAAC,GAAW;IACnD,IAAI,CAAC;QACH,0BAA0B;QAC1B,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAErB,iEAAiE;QACjE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,GAAG,cAAc,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACzF,OAAO,CACL,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC;gBACtC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC;gBACnC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAC3B,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC;gBACpC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CACnC,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B;IACzC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,qBAAqB,EAAE,CAAC;IACpC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,gCAAgC,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,qBAAqB,EAAE,CAAC;QACpC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,qBAAqB,EAAE,CAAC;YAC3C,MAAM,KAAK,CAAC;QACd,CAAC;QACD,0CAA0C;QAC1C,MAAM,IAAI,qBAAqB,EAAE,CAAC;IACpC,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACxE,IAAI,gCAAgC,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9C,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB;IAClB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -6,7 +6,7 @@ import { fileURLToPath } from 'url';
6
6
  import { getPrimaryProcessPid } from './processCheck.js';
7
7
  const paths = envPaths('awal');
8
8
  // This will be updated by the build script
9
- const BUNDLE_VERSION = '2.8.2';
9
+ const BUNDLE_VERSION = '2.12.0';
10
10
  function getServerPaths() {
11
11
  const dataDir = paths.data;
12
12
  const bundleDir = path.join(dataDir, 'server');
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "awal",
3
- "version": "2.8.2",
3
+ "version": "2.12.0",
4
4
  "type": "module",
5
- "description": "Coinbase Wallet CLI for payments and crypto",
5
+ "description": "Coinbase Agentic Wallet CLI for payments and crypto",
6
6
  "bin": "dist/index.js",
7
7
  "files": [
8
8
  "dist/",
@@ -18,8 +18,8 @@
18
18
  "test": "jest --config jest.config.cjs"
19
19
  },
20
20
  "dependencies": {
21
- "@x402/core": "^2.4.0",
22
- "@x402/extensions": "^2.4.0",
21
+ "@x402/core": "^2.11.0",
22
+ "@x402/extensions": "^2.11.0",
23
23
  "chalk": "^5.3.0",
24
24
  "commander": "^12.0.0",
25
25
  "env-paths": "^3.0.0",
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <title>Payments MCP - Connection Error</title>
6
+ <title>Agentic Wallet - Connection Error</title>
7
7
  <style>
8
8
  * {
9
9
  margin: 0;
@@ -78,7 +78,7 @@
78
78
  <div class="icon">⚠️</div>
79
79
  <h1>Connection Error</h1>
80
80
  <p>
81
- Unable to connect to the Payments MCP service.
81
+ Unable to connect to the Agentic Wallet service.
82
82
  <br />
83
83
  Please check your connection and try again.
84
84
  </p>