agentaos 0.2.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 (183) hide show
  1. package/LICENSE +199 -0
  2. package/README.md +249 -0
  3. package/dist/cli/commands/admin.command.d.ts +3 -0
  4. package/dist/cli/commands/admin.command.d.ts.map +1 -0
  5. package/dist/cli/commands/admin.command.js +415 -0
  6. package/dist/cli/commands/admin.command.js.map +1 -0
  7. package/dist/cli/commands/balance.command.d.ts +3 -0
  8. package/dist/cli/commands/balance.command.d.ts.map +1 -0
  9. package/dist/cli/commands/balance.command.js +65 -0
  10. package/dist/cli/commands/balance.command.js.map +1 -0
  11. package/dist/cli/commands/deploy.command.d.ts +3 -0
  12. package/dist/cli/commands/deploy.command.d.ts.map +1 -0
  13. package/dist/cli/commands/deploy.command.js +101 -0
  14. package/dist/cli/commands/deploy.command.js.map +1 -0
  15. package/dist/cli/commands/info.command.d.ts +3 -0
  16. package/dist/cli/commands/info.command.d.ts.map +1 -0
  17. package/dist/cli/commands/info.command.js +30 -0
  18. package/dist/cli/commands/info.command.js.map +1 -0
  19. package/dist/cli/commands/init.command.d.ts +3 -0
  20. package/dist/cli/commands/init.command.d.ts.map +1 -0
  21. package/dist/cli/commands/init.command.js +364 -0
  22. package/dist/cli/commands/init.command.js.map +1 -0
  23. package/dist/cli/commands/link.command.d.ts +3 -0
  24. package/dist/cli/commands/link.command.d.ts.map +1 -0
  25. package/dist/cli/commands/link.command.js +111 -0
  26. package/dist/cli/commands/link.command.js.map +1 -0
  27. package/dist/cli/commands/login.command.d.ts +4 -0
  28. package/dist/cli/commands/login.command.d.ts.map +1 -0
  29. package/dist/cli/commands/login.command.js +149 -0
  30. package/dist/cli/commands/login.command.js.map +1 -0
  31. package/dist/cli/commands/network.command.d.ts +3 -0
  32. package/dist/cli/commands/network.command.d.ts.map +1 -0
  33. package/dist/cli/commands/network.command.js +206 -0
  34. package/dist/cli/commands/network.command.js.map +1 -0
  35. package/dist/cli/commands/proxy.command.d.ts +3 -0
  36. package/dist/cli/commands/proxy.command.d.ts.map +1 -0
  37. package/dist/cli/commands/proxy.command.js +248 -0
  38. package/dist/cli/commands/proxy.command.js.map +1 -0
  39. package/dist/cli/commands/receive.command.d.ts +3 -0
  40. package/dist/cli/commands/receive.command.d.ts.map +1 -0
  41. package/dist/cli/commands/receive.command.js +360 -0
  42. package/dist/cli/commands/receive.command.js.map +1 -0
  43. package/dist/cli/commands/send.command.d.ts +3 -0
  44. package/dist/cli/commands/send.command.d.ts.map +1 -0
  45. package/dist/cli/commands/send.command.js +83 -0
  46. package/dist/cli/commands/send.command.js.map +1 -0
  47. package/dist/cli/commands/sign.command.d.ts +3 -0
  48. package/dist/cli/commands/sign.command.d.ts.map +1 -0
  49. package/dist/cli/commands/sign.command.js +53 -0
  50. package/dist/cli/commands/sign.command.js.map +1 -0
  51. package/dist/cli/commands/status.command.d.ts +3 -0
  52. package/dist/cli/commands/status.command.d.ts.map +1 -0
  53. package/dist/cli/commands/status.command.js +109 -0
  54. package/dist/cli/commands/status.command.js.map +1 -0
  55. package/dist/cli/index.d.ts +2 -0
  56. package/dist/cli/index.d.ts.map +1 -0
  57. package/dist/cli/index.js +50 -0
  58. package/dist/cli/index.js.map +1 -0
  59. package/dist/cli/theme.d.ts +35 -0
  60. package/dist/cli/theme.d.ts.map +1 -0
  61. package/dist/cli/theme.js +96 -0
  62. package/dist/cli/theme.js.map +1 -0
  63. package/dist/index.d.ts +3 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +20 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/lib/__tests__/transfer-crypto.test.d.ts +2 -0
  68. package/dist/lib/__tests__/transfer-crypto.test.d.ts.map +1 -0
  69. package/dist/lib/__tests__/transfer-crypto.test.js +151 -0
  70. package/dist/lib/__tests__/transfer-crypto.test.js.map +1 -0
  71. package/dist/lib/authenticated-fetch.d.ts +6 -0
  72. package/dist/lib/authenticated-fetch.d.ts.map +1 -0
  73. package/dist/lib/authenticated-fetch.js +74 -0
  74. package/dist/lib/authenticated-fetch.js.map +1 -0
  75. package/dist/lib/config.d.ts +42 -0
  76. package/dist/lib/config.d.ts.map +1 -0
  77. package/dist/lib/config.js +163 -0
  78. package/dist/lib/config.js.map +1 -0
  79. package/dist/lib/erc20-abi.d.ts +43 -0
  80. package/dist/lib/erc20-abi.d.ts.map +1 -0
  81. package/dist/lib/erc20-abi.js +34 -0
  82. package/dist/lib/erc20-abi.js.map +1 -0
  83. package/dist/lib/errors.d.ts +12 -0
  84. package/dist/lib/errors.d.ts.map +1 -0
  85. package/dist/lib/errors.js +23 -0
  86. package/dist/lib/errors.js.map +1 -0
  87. package/dist/lib/keychain.d.ts +11 -0
  88. package/dist/lib/keychain.d.ts.map +1 -0
  89. package/dist/lib/keychain.js +216 -0
  90. package/dist/lib/keychain.js.map +1 -0
  91. package/dist/lib/policy-conversions.d.ts +19 -0
  92. package/dist/lib/policy-conversions.d.ts.map +1 -0
  93. package/dist/lib/policy-conversions.js +62 -0
  94. package/dist/lib/policy-conversions.js.map +1 -0
  95. package/dist/lib/signer-manager.d.ts +17 -0
  96. package/dist/lib/signer-manager.d.ts.map +1 -0
  97. package/dist/lib/signer-manager.js +80 -0
  98. package/dist/lib/signer-manager.js.map +1 -0
  99. package/dist/lib/transfer-crypto.d.ts +36 -0
  100. package/dist/lib/transfer-crypto.d.ts.map +1 -0
  101. package/dist/lib/transfer-crypto.js +109 -0
  102. package/dist/lib/transfer-crypto.js.map +1 -0
  103. package/dist/lib/x402-client.d.ts +63 -0
  104. package/dist/lib/x402-client.d.ts.map +1 -0
  105. package/dist/lib/x402-client.js +236 -0
  106. package/dist/lib/x402-client.js.map +1 -0
  107. package/dist/mcp/index.d.ts +6 -0
  108. package/dist/mcp/index.d.ts.map +1 -0
  109. package/dist/mcp/index.js +73 -0
  110. package/dist/mcp/index.js.map +1 -0
  111. package/dist/mcp/tools/call-contract.d.ts +4 -0
  112. package/dist/mcp/tools/call-contract.d.ts.map +1 -0
  113. package/dist/mcp/tools/call-contract.js +68 -0
  114. package/dist/mcp/tools/call-contract.js.map +1 -0
  115. package/dist/mcp/tools/execute.d.ts +4 -0
  116. package/dist/mcp/tools/execute.d.ts.map +1 -0
  117. package/dist/mcp/tools/execute.js +59 -0
  118. package/dist/mcp/tools/execute.js.map +1 -0
  119. package/dist/mcp/tools/get-audit-log.d.ts +4 -0
  120. package/dist/mcp/tools/get-audit-log.d.ts.map +1 -0
  121. package/dist/mcp/tools/get-audit-log.js +85 -0
  122. package/dist/mcp/tools/get-audit-log.js.map +1 -0
  123. package/dist/mcp/tools/get-balances.d.ts +4 -0
  124. package/dist/mcp/tools/get-balances.d.ts.map +1 -0
  125. package/dist/mcp/tools/get-balances.js +84 -0
  126. package/dist/mcp/tools/get-balances.js.map +1 -0
  127. package/dist/mcp/tools/get-status.d.ts +4 -0
  128. package/dist/mcp/tools/get-status.d.ts.map +1 -0
  129. package/dist/mcp/tools/get-status.js +66 -0
  130. package/dist/mcp/tools/get-status.js.map +1 -0
  131. package/dist/mcp/tools/list-networks.d.ts +4 -0
  132. package/dist/mcp/tools/list-networks.d.ts.map +1 -0
  133. package/dist/mcp/tools/list-networks.js +36 -0
  134. package/dist/mcp/tools/list-networks.js.map +1 -0
  135. package/dist/mcp/tools/list-signers.d.ts +4 -0
  136. package/dist/mcp/tools/list-signers.d.ts.map +1 -0
  137. package/dist/mcp/tools/list-signers.js +36 -0
  138. package/dist/mcp/tools/list-signers.js.map +1 -0
  139. package/dist/mcp/tools/read-contract.d.ts +4 -0
  140. package/dist/mcp/tools/read-contract.d.ts.map +1 -0
  141. package/dist/mcp/tools/read-contract.js +62 -0
  142. package/dist/mcp/tools/read-contract.js.map +1 -0
  143. package/dist/mcp/tools/resolve-address.d.ts +4 -0
  144. package/dist/mcp/tools/resolve-address.d.ts.map +1 -0
  145. package/dist/mcp/tools/resolve-address.js +37 -0
  146. package/dist/mcp/tools/resolve-address.js.map +1 -0
  147. package/dist/mcp/tools/send-eth.d.ts +4 -0
  148. package/dist/mcp/tools/send-eth.d.ts.map +1 -0
  149. package/dist/mcp/tools/send-eth.js +52 -0
  150. package/dist/mcp/tools/send-eth.js.map +1 -0
  151. package/dist/mcp/tools/send-token.d.ts +4 -0
  152. package/dist/mcp/tools/send-token.d.ts.map +1 -0
  153. package/dist/mcp/tools/send-token.js +102 -0
  154. package/dist/mcp/tools/send-token.js.map +1 -0
  155. package/dist/mcp/tools/sign-message.d.ts +4 -0
  156. package/dist/mcp/tools/sign-message.d.ts.map +1 -0
  157. package/dist/mcp/tools/sign-message.js +33 -0
  158. package/dist/mcp/tools/sign-message.js.map +1 -0
  159. package/dist/mcp/tools/sign-typed-data.d.ts +4 -0
  160. package/dist/mcp/tools/sign-typed-data.d.ts.map +1 -0
  161. package/dist/mcp/tools/sign-typed-data.js +48 -0
  162. package/dist/mcp/tools/sign-typed-data.js.map +1 -0
  163. package/dist/mcp/tools/simulate.d.ts +4 -0
  164. package/dist/mcp/tools/simulate.d.ts.map +1 -0
  165. package/dist/mcp/tools/simulate.js +54 -0
  166. package/dist/mcp/tools/simulate.js.map +1 -0
  167. package/dist/mcp/tools/wallet-overview.d.ts +4 -0
  168. package/dist/mcp/tools/wallet-overview.d.ts.map +1 -0
  169. package/dist/mcp/tools/wallet-overview.js +109 -0
  170. package/dist/mcp/tools/wallet-overview.js.map +1 -0
  171. package/dist/mcp/tools/x402-check.d.ts +3 -0
  172. package/dist/mcp/tools/x402-check.d.ts.map +1 -0
  173. package/dist/mcp/tools/x402-check.js +44 -0
  174. package/dist/mcp/tools/x402-check.js.map +1 -0
  175. package/dist/mcp/tools/x402-discover.d.ts +3 -0
  176. package/dist/mcp/tools/x402-discover.d.ts.map +1 -0
  177. package/dist/mcp/tools/x402-discover.js +42 -0
  178. package/dist/mcp/tools/x402-discover.js.map +1 -0
  179. package/dist/mcp/tools/x402-fetch.d.ts +4 -0
  180. package/dist/mcp/tools/x402-fetch.d.ts.map +1 -0
  181. package/dist/mcp/tools/x402-fetch.js +45 -0
  182. package/dist/mcp/tools/x402-fetch.js.map +1 -0
  183. package/package.json +68 -0
@@ -0,0 +1,149 @@
1
+ import { input, password } from '@inquirer/prompts';
2
+ import chalk from 'chalk';
3
+ import { Command } from 'commander';
4
+ import ora from 'ora';
5
+ import { getConfigDir } from '../../lib/config.js';
6
+ import { deleteSession, getRefreshToken, getSession, getSessionServerUrl, storeSession, } from '../../lib/keychain.js';
7
+ import { dim, failMark, promptTheme, section, success, successMark } from '../theme.js';
8
+ // ---------------------------------------------------------------------------
9
+ // Helpers
10
+ // ---------------------------------------------------------------------------
11
+ async function fetchJson(url, body) {
12
+ const response = await fetch(url, {
13
+ method: 'POST',
14
+ headers: { 'content-type': 'application/json' },
15
+ body: JSON.stringify(body),
16
+ signal: AbortSignal.timeout(15_000),
17
+ });
18
+ if (!response.ok) {
19
+ const text = await response.text();
20
+ // Extract human-readable message from JSON error responses
21
+ try {
22
+ const json = JSON.parse(text);
23
+ if (json.message)
24
+ throw new Error(json.message);
25
+ }
26
+ catch (e) {
27
+ if (e instanceof Error && e.message !== text)
28
+ throw e;
29
+ }
30
+ throw new Error(`Server error (${response.status})`);
31
+ }
32
+ return response.json();
33
+ }
34
+ // ---------------------------------------------------------------------------
35
+ // agenta login
36
+ // ---------------------------------------------------------------------------
37
+ export const loginCommand = new Command('login')
38
+ .description('Log in with email + OTP')
39
+ .option('--server <url>', 'Server URL', process.env.AGENTA_SERVER ?? 'https://api.agentaos.ai')
40
+ .action(async (opts) => {
41
+ try {
42
+ // Check if already logged in
43
+ const existing = await getSession();
44
+ if (existing) {
45
+ console.log(`\n ${dim('Already logged in. Run')} ${chalk.bold('agenta logout')} ${dim('to switch accounts.')}\n`);
46
+ return;
47
+ }
48
+ section('Login');
49
+ const email = await input({
50
+ message: 'Email',
51
+ theme: promptTheme,
52
+ validate: (v) => {
53
+ if (!v.includes('@'))
54
+ return 'Enter a valid email address';
55
+ return true;
56
+ },
57
+ });
58
+ const baseUrl = opts.server.replace(/\/+$/, '');
59
+ // Send OTP
60
+ const spinner = ora({ text: 'Sending verification code…', indent: 2 }).start();
61
+ try {
62
+ await fetchJson(`${baseUrl}/api/v1/auth/login`, { email, sendOtp: true });
63
+ spinner.succeed('Verification code sent');
64
+ }
65
+ catch (err) {
66
+ spinner.fail('Failed to send verification code');
67
+ throw err;
68
+ }
69
+ console.log('');
70
+ const code = await password({
71
+ message: 'Enter the 6-digit code from your email',
72
+ mask: '*',
73
+ theme: promptTheme,
74
+ });
75
+ if (!code)
76
+ throw new Error('Code is required');
77
+ // Verify OTP
78
+ const verifySpinner = ora({ text: 'Verifying…', indent: 2 }).start();
79
+ let result;
80
+ try {
81
+ result = await fetchJson(`${baseUrl}/api/v1/auth/verify-otp`, { email, code });
82
+ }
83
+ catch (err) {
84
+ verifySpinner.fail('Verification failed');
85
+ throw err;
86
+ }
87
+ // Store JWT + refresh token + server URL (so `agenta receive` works without `agenta init`)
88
+ await storeSession(result.token, baseUrl, result.refreshToken);
89
+ verifySpinner.succeed('Logged in');
90
+ console.log('');
91
+ console.log(` ${successMark(`Authenticated as ${chalk.bold(result.email)}`)}`);
92
+ console.log(` ${dim(`Session stored in ${getConfigDir()}`)}`);
93
+ console.log('');
94
+ console.log(` ${success('Done!')} Run ${chalk.bold('agenta init')} to create a wallet,`);
95
+ console.log(` or ${chalk.bold('agenta receive')} to import a share from another device.`);
96
+ console.log('');
97
+ }
98
+ catch (error) {
99
+ if (error instanceof Error && error.name === 'ExitPromptError') {
100
+ console.log(dim('\n Cancelled.\n'));
101
+ return;
102
+ }
103
+ const message = error instanceof Error ? error.message : 'Unknown error';
104
+ console.error(`\n ${failMark(message)}\n`);
105
+ process.exitCode = 1;
106
+ }
107
+ });
108
+ // ---------------------------------------------------------------------------
109
+ // agenta logout
110
+ // ---------------------------------------------------------------------------
111
+ export const logoutCommand = new Command('logout')
112
+ .description('Log out (clear session)')
113
+ .action(async () => {
114
+ try {
115
+ // Revoke refresh tokens server-side before clearing local session
116
+ const token = await getSession();
117
+ const refreshToken = await getRefreshToken();
118
+ const serverUrl = await getSessionServerUrl();
119
+ if (serverUrl && (token || refreshToken)) {
120
+ try {
121
+ await fetch(`${serverUrl}/api/v1/auth/logout`, {
122
+ method: 'POST',
123
+ headers: {
124
+ 'Content-Type': 'application/json',
125
+ ...(token ? { authorization: `Bearer ${token}` } : {}),
126
+ },
127
+ body: JSON.stringify({ refreshToken: refreshToken ?? undefined }),
128
+ signal: AbortSignal.timeout(5_000),
129
+ });
130
+ }
131
+ catch {
132
+ // Best-effort — still clear local session even if server unreachable
133
+ }
134
+ }
135
+ const deleted = await deleteSession();
136
+ if (deleted) {
137
+ console.log(`\n ${successMark('Logged out')}\n`);
138
+ }
139
+ else {
140
+ console.log(`\n ${dim('No active session found.')}\n`);
141
+ }
142
+ }
143
+ catch (error) {
144
+ const message = error instanceof Error ? error.message : 'Unknown error';
145
+ console.error(`\n ${failMark(message)}\n`);
146
+ process.exitCode = 1;
147
+ }
148
+ });
149
+ //# sourceMappingURL=login.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.command.js","sourceRoot":"","sources":["../../../src/cli/commands/login.command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const networkCommand: Command;
3
+ //# sourceMappingURL=network.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.command.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/network.command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAA+B,MAAM,WAAW,CAAC;AAwPjE,eAAO,MAAM,cAAc,SASxB,CAAC"}
@@ -0,0 +1,206 @@
1
+ import chalk from 'chalk';
2
+ import { Command } from 'commander';
3
+ import ora from 'ora';
4
+ import { loadSignerConfig, saveSignerConfig } from '../../lib/config.js';
5
+ import { brand, dim, success, warn } from '../theme.js';
6
+ // ---------------------------------------------------------------------------
7
+ // agenta network list — show available networks from server
8
+ // ---------------------------------------------------------------------------
9
+ const listCommand = new Command('list')
10
+ .description('Show available networks')
11
+ .action(async (_opts, command) => {
12
+ const spinner = ora({ text: 'Loading configuration…', indent: 2 }).start();
13
+ let config;
14
+ try {
15
+ config = loadSignerConfig(command.optsWithGlobals().signer);
16
+ }
17
+ catch (error) {
18
+ const message = error instanceof Error ? error.message : 'Unknown error';
19
+ spinner.fail(message);
20
+ process.exitCode = 1;
21
+ return;
22
+ }
23
+ spinner.text = 'Fetching networks…';
24
+ try {
25
+ const url = `${config.serverUrl.replace(/\/+$/, '')}/api/v1/networks`;
26
+ const response = await fetch(url, {
27
+ headers: { 'x-api-key': config.apiKey },
28
+ signal: AbortSignal.timeout(10_000),
29
+ });
30
+ if (!response.ok) {
31
+ throw new Error(`Server returned ${response.status}`);
32
+ }
33
+ const networks = (await response.json());
34
+ spinner.stop();
35
+ console.log('');
36
+ console.log(` ${chalk.bold('Available Networks')}`);
37
+ console.log(` ${dim('Networks supported by your AgentaOS server.')}`);
38
+ console.log('');
39
+ const current = config.network;
40
+ for (const net of networks) {
41
+ const isCurrent = net.name === current;
42
+ const marker = isCurrent ? success(' ●') : ' ';
43
+ const tag = net.isTestnet ? dim(' (testnet)') : '';
44
+ const currentLabel = isCurrent ? success(' ← default') : '';
45
+ console.log(`${marker} ${chalk.bold(net.name.padEnd(20))} ${dim(`chain ${net.chainId}`).padEnd(24)} ${net.nativeCurrency}${tag}${currentLabel}`);
46
+ }
47
+ console.log('');
48
+ if (!current) {
49
+ console.log(` ${warn('No default network set.')} Run ${chalk.bold('agenta network set <name>')} to pick one.`);
50
+ console.log('');
51
+ }
52
+ }
53
+ catch (error) {
54
+ const message = error instanceof Error ? error.message : 'Unknown error';
55
+ spinner.fail(`Failed to fetch networks: ${message}`);
56
+ process.exitCode = 1;
57
+ }
58
+ });
59
+ // ---------------------------------------------------------------------------
60
+ // agenta network set <name> — save default network to signer config
61
+ // ---------------------------------------------------------------------------
62
+ const setCommand = new Command('set')
63
+ .description('Set the default network for an account')
64
+ .argument('<network>', 'Network name (e.g. base-sepolia, ethereum)')
65
+ .action(async (networkName, _opts, command) => {
66
+ const spinner = ora({ text: 'Loading configuration…', indent: 2 }).start();
67
+ let config;
68
+ let signerName;
69
+ try {
70
+ signerName = command.optsWithGlobals().signer;
71
+ config = loadSignerConfig(signerName);
72
+ signerName = config.signerName;
73
+ }
74
+ catch (error) {
75
+ const message = error instanceof Error ? error.message : 'Unknown error';
76
+ spinner.fail(message);
77
+ process.exitCode = 1;
78
+ return;
79
+ }
80
+ // Validate against server
81
+ spinner.text = 'Validating network…';
82
+ try {
83
+ const url = `${config.serverUrl.replace(/\/+$/, '')}/api/v1/networks`;
84
+ const response = await fetch(url, {
85
+ headers: { 'x-api-key': config.apiKey },
86
+ signal: AbortSignal.timeout(10_000),
87
+ });
88
+ if (response.ok) {
89
+ const networks = (await response.json());
90
+ const valid = networks.some((n) => n.name === networkName);
91
+ if (!valid) {
92
+ spinner.fail(`Unknown network "${networkName}". Run ${chalk.bold('agenta network list')} to see available networks.`);
93
+ process.exitCode = 1;
94
+ return;
95
+ }
96
+ }
97
+ // If server unreachable, save anyway — user knows what they're doing
98
+ }
99
+ catch {
100
+ // Server validation is best-effort
101
+ }
102
+ const previous = config.network;
103
+ config.network = networkName;
104
+ saveSignerConfig(signerName, config);
105
+ if (previous) {
106
+ spinner.succeed(`Default network changed: ${dim(previous)} → ${brand(networkName)}`);
107
+ }
108
+ else {
109
+ spinner.succeed(`Default network set to ${brand(networkName)}`);
110
+ }
111
+ });
112
+ // ---------------------------------------------------------------------------
113
+ // agenta network get — show current default network
114
+ // ---------------------------------------------------------------------------
115
+ const getCommand = new Command('get')
116
+ .description('Show the current default network for an account')
117
+ .action(async (_opts, command) => {
118
+ let config;
119
+ try {
120
+ config = loadSignerConfig(command.optsWithGlobals().signer);
121
+ }
122
+ catch (error) {
123
+ const message = error instanceof Error ? error.message : 'Unknown error';
124
+ console.error(` ${message}`);
125
+ process.exitCode = 1;
126
+ return;
127
+ }
128
+ console.log('');
129
+ if (config.network) {
130
+ console.log(` Default network: ${brand(config.network)}`);
131
+ console.log(` ${dim('Used by agenta balance, agenta send, and other commands when --network is omitted.')}`);
132
+ }
133
+ else {
134
+ console.log(` ${warn('No default network set.')}`);
135
+ console.log(` ${dim('Commands will require --network <name> until you set one.')}`);
136
+ console.log(` ${dim(`Run ${chalk.bold('agenta network set <name>')} to pick a default.`)}`);
137
+ }
138
+ console.log('');
139
+ });
140
+ // ---------------------------------------------------------------------------
141
+ // agenta network info <name> — show details for a specific network
142
+ // ---------------------------------------------------------------------------
143
+ const infoCommand = new Command('info')
144
+ .description('Show details for a specific network')
145
+ .argument('<network>', 'Network name (e.g. base-sepolia)')
146
+ .action(async (networkName, _opts, command) => {
147
+ const spinner = ora({ text: 'Loading configuration…', indent: 2 }).start();
148
+ let config;
149
+ try {
150
+ config = loadSignerConfig(command.optsWithGlobals().signer);
151
+ }
152
+ catch (error) {
153
+ const message = error instanceof Error ? error.message : 'Unknown error';
154
+ spinner.fail(message);
155
+ process.exitCode = 1;
156
+ return;
157
+ }
158
+ spinner.text = 'Fetching network info…';
159
+ try {
160
+ const url = `${config.serverUrl.replace(/\/+$/, '')}/api/v1/networks`;
161
+ const response = await fetch(url, {
162
+ headers: { 'x-api-key': config.apiKey },
163
+ signal: AbortSignal.timeout(10_000),
164
+ });
165
+ if (!response.ok) {
166
+ throw new Error(`Server returned ${response.status}`);
167
+ }
168
+ const networks = (await response.json());
169
+ const net = networks.find((n) => n.name === networkName);
170
+ if (!net) {
171
+ spinner.fail(`Unknown network "${networkName}". Run ${chalk.bold('agenta network list')} to see available networks.`);
172
+ process.exitCode = 1;
173
+ return;
174
+ }
175
+ spinner.stop();
176
+ const isCurrent = config.network === net.name;
177
+ console.log('');
178
+ console.log(` ${chalk.bold(net.displayName)}`);
179
+ console.log('');
180
+ console.log(` Name: ${brand(net.name)}${isCurrent ? success(' ← default') : ''}`);
181
+ console.log(` Chain ID: ${net.chainId}`);
182
+ console.log(` Currency: ${net.nativeCurrency}`);
183
+ console.log(` Type: ${net.isTestnet ? warn('testnet') : success('mainnet')}`);
184
+ console.log(` Explorer: ${dim(net.explorerUrl || 'none')}`);
185
+ console.log('');
186
+ }
187
+ catch (error) {
188
+ const message = error instanceof Error ? error.message : 'Unknown error';
189
+ spinner.fail(`Failed to fetch network info: ${message}`);
190
+ process.exitCode = 1;
191
+ }
192
+ });
193
+ // ---------------------------------------------------------------------------
194
+ // Main command group
195
+ // ---------------------------------------------------------------------------
196
+ export const networkCommand = new Command('network')
197
+ .description('Manage networks — list available chains, set your default')
198
+ .addCommand(listCommand)
199
+ .addCommand(setCommand)
200
+ .addCommand(getCommand)
201
+ .addCommand(infoCommand)
202
+ .action(() => {
203
+ // Default action: show list
204
+ listCommand.parse(process.argv);
205
+ });
206
+ //# sourceMappingURL=network.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.command.js","sourceRoot":"","sources":["../../../src/cli/commands/network.command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const proxyCommand: Command;
3
+ //# sourceMappingURL=proxy.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.command.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/proxy.command.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAA+B,MAAM,WAAW,CAAC;AAuHjE,eAAO,MAAM,YAAY,SAqKtB,CAAC"}
@@ -0,0 +1,248 @@
1
+ import { createServer } from 'node:http';
2
+ import chalk from 'chalk';
3
+ import { Command } from 'commander';
4
+ import ora from 'ora';
5
+ import { createClientFromConfig, createSignerFromConfig, loadSignerConfig, } from '../../lib/config.js';
6
+ import { brand, danger, dim, success, warn } from '../theme.js';
7
+ const SIGNING_METHODS = new Set([
8
+ 'eth_sendTransaction',
9
+ 'eth_signTransaction',
10
+ 'eth_sign',
11
+ 'personal_sign',
12
+ ]);
13
+ const ACCOUNT_METHODS = new Set(['eth_accounts', 'eth_requestAccounts']);
14
+ function readRequestBody(req) {
15
+ return new Promise((resolve, reject) => {
16
+ const chunks = [];
17
+ req.on('data', (chunk) => chunks.push(chunk));
18
+ req.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));
19
+ req.on('error', reject);
20
+ });
21
+ }
22
+ function sendJsonResponse(res, body) {
23
+ const json = JSON.stringify(body);
24
+ res.writeHead(200, {
25
+ 'Content-Type': 'application/json',
26
+ 'Content-Length': Buffer.byteLength(json),
27
+ });
28
+ res.end(json);
29
+ }
30
+ function makeErrorResponse(id, code, message) {
31
+ return { jsonrpc: '2.0', id, error: { code, message } };
32
+ }
33
+ async function forwardToRpc(rpcUrl, request) {
34
+ const response = await fetch(rpcUrl, {
35
+ method: 'POST',
36
+ headers: { 'Content-Type': 'application/json' },
37
+ body: JSON.stringify(request),
38
+ signal: AbortSignal.timeout(30_000),
39
+ });
40
+ if (!response.ok) {
41
+ const text = await response.text();
42
+ return makeErrorResponse(request.id, -32603, `RPC error: HTTP ${response.status} -- ${text}`);
43
+ }
44
+ return response.json();
45
+ }
46
+ async function handleSigningRequest(request, signer) {
47
+ const params = request.params;
48
+ if (!params || !Array.isArray(params) || params.length === 0) {
49
+ return makeErrorResponse(request.id, -32602, 'Missing transaction parameters');
50
+ }
51
+ try {
52
+ if (request.method === 'eth_sendTransaction' || request.method === 'eth_signTransaction') {
53
+ const txParams = params[0];
54
+ if (!txParams || typeof txParams !== 'object') {
55
+ return makeErrorResponse(request.id, -32602, 'Invalid transaction parameters');
56
+ }
57
+ const transaction = {};
58
+ if (txParams.to !== undefined)
59
+ transaction.to = txParams.to;
60
+ if (txParams.value !== undefined)
61
+ transaction.value = txParams.value;
62
+ if (txParams.data !== undefined)
63
+ transaction.data = txParams.data;
64
+ if (txParams.input !== undefined)
65
+ transaction.data = txParams.input;
66
+ if (txParams.gas !== undefined)
67
+ transaction.gasLimit = txParams.gas;
68
+ if (txParams.gasLimit !== undefined)
69
+ transaction.gasLimit = txParams.gasLimit;
70
+ if (txParams.nonce !== undefined) {
71
+ const raw = txParams.nonce;
72
+ transaction.nonce = typeof raw === 'string' ? Number.parseInt(raw, 16) : raw;
73
+ }
74
+ if (txParams.chainId !== undefined) {
75
+ const raw = txParams.chainId;
76
+ transaction.chainId = typeof raw === 'string' ? Number.parseInt(raw, 16) : raw;
77
+ }
78
+ const result = await signer.signTransaction(transaction);
79
+ return { jsonrpc: '2.0', id: request.id, result: result.txHash };
80
+ }
81
+ // eth_sign and personal_sign
82
+ const message = typeof params[0] === 'string' ? params[0] : String(params[0]);
83
+ const signResult = await signer.signMessage(message);
84
+ return { jsonrpc: '2.0', id: request.id, result: signResult.signature };
85
+ }
86
+ catch (error) {
87
+ const msg = error instanceof Error ? error.message : 'Unknown error';
88
+ return makeErrorResponse(request.id, -32603, `Signing failed: ${msg}`);
89
+ }
90
+ }
91
+ export const proxyCommand = new Command('proxy')
92
+ .description('Start a network-agnostic JSON-RPC signing proxy for Foundry/Hardhat')
93
+ .option('-p, --port <port>', 'Port to listen on', '8545')
94
+ .option('-r, --rpc-url <url>', 'Override upstream RPC URL (default: auto-detected from server)')
95
+ .action(async (options, command) => {
96
+ let config;
97
+ try {
98
+ config = loadSignerConfig(command.optsWithGlobals().signer);
99
+ }
100
+ catch (error) {
101
+ const message = error instanceof Error ? error.message : 'Unknown error';
102
+ console.error(danger(`\n Error: ${message}\n`));
103
+ process.exitCode = 1;
104
+ return;
105
+ }
106
+ const port = Number.parseInt(options.port, 10);
107
+ if (Number.isNaN(port) || port < 1 || port > 65535) {
108
+ console.error(danger('\n Error: Port must be a number between 1 and 65535.\n'));
109
+ process.exitCode = 1;
110
+ return;
111
+ }
112
+ console.log(chalk.bold('\n AgentaOS RPC Proxy'));
113
+ console.log(dim(` ${'-'.repeat(40)}`));
114
+ const { api } = createClientFromConfig(config);
115
+ // Fetch network config from the server
116
+ const networkSpinner = ora({ text: 'Fetching networks from server...', indent: 2 }).start();
117
+ let rpcUrl;
118
+ let networkName;
119
+ try {
120
+ if (options.rpcUrl) {
121
+ rpcUrl = options.rpcUrl;
122
+ networkName = config.network ?? '';
123
+ networkSpinner.succeed('Using custom RPC URL');
124
+ console.log(dim(` Network: ${networkName} (RPC override)`));
125
+ }
126
+ else {
127
+ const networks = await api.listNetworks();
128
+ networkSpinner.succeed(`Loaded ${networks.length} networks from server`);
129
+ if (!config.network) {
130
+ networkSpinner.fail('No network specified. Use --rpc-url or set network in config.');
131
+ process.exitCode = 1;
132
+ return;
133
+ }
134
+ const matched = networks.find((n) => n.name === config.network);
135
+ if (!matched) {
136
+ console.error(danger(`\n Error: Network "${config.network}" not found on server.`));
137
+ console.error(dim(` Available: ${networks.map((n) => n.name).join(', ')}\n`));
138
+ process.exitCode = 1;
139
+ return;
140
+ }
141
+ rpcUrl = matched.rpcUrl;
142
+ networkName = matched.displayName;
143
+ console.log(` Network: ${networkName} (chainId: ${matched.chainId})`);
144
+ }
145
+ }
146
+ catch (error) {
147
+ const message = error instanceof Error ? error.message : 'Unknown error';
148
+ networkSpinner.fail(`Failed to fetch networks: ${message}`);
149
+ process.exitCode = 1;
150
+ return;
151
+ }
152
+ console.log(` RPC: ${rpcUrl}`);
153
+ console.log('');
154
+ const signerSpinner = ora({ text: 'Loading keyshare...', indent: 2 }).start();
155
+ let signer;
156
+ try {
157
+ signer = await createSignerFromConfig(config);
158
+ signerSpinner.succeed(`Keyshare loaded (address: ${signer.address})`);
159
+ }
160
+ catch (error) {
161
+ const message = error instanceof Error ? error.message : 'Unknown error';
162
+ signerSpinner.fail(`Failed to load keyshare: ${message}`);
163
+ process.exitCode = 1;
164
+ return;
165
+ }
166
+ let requestCount = 0;
167
+ const server = createServer(async (req, res) => {
168
+ res.setHeader('Access-Control-Allow-Origin', '*');
169
+ res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS');
170
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
171
+ if (req.method === 'OPTIONS') {
172
+ res.writeHead(204);
173
+ res.end();
174
+ return;
175
+ }
176
+ if (req.method !== 'POST') {
177
+ res.writeHead(405, { 'Content-Type': 'application/json' });
178
+ res.end(JSON.stringify({ error: 'Method not allowed' }));
179
+ return;
180
+ }
181
+ try {
182
+ const body = await readRequestBody(req);
183
+ let rpcRequest;
184
+ try {
185
+ rpcRequest = JSON.parse(body);
186
+ }
187
+ catch {
188
+ sendJsonResponse(res, makeErrorResponse(null, -32700, 'Parse error'));
189
+ return;
190
+ }
191
+ requestCount++;
192
+ const reqNum = requestCount;
193
+ const method = rpcRequest.method;
194
+ if (ACCOUNT_METHODS.has(method)) {
195
+ console.log(dim(` #${reqNum} ${method} -> [${signer.address}]`));
196
+ sendJsonResponse(res, { jsonrpc: '2.0', id: rpcRequest.id, result: [signer.address] });
197
+ }
198
+ else if (SIGNING_METHODS.has(method)) {
199
+ console.log(`${warn(` #${reqNum}`)}${dim(` ${method} `)}${warn('(signing)')}`);
200
+ const response = await handleSigningRequest(rpcRequest, signer);
201
+ sendJsonResponse(res, response);
202
+ if (response.error) {
203
+ console.log(danger(` #${reqNum} error: ${response.error.message}`));
204
+ }
205
+ else {
206
+ console.log(success(` #${reqNum} done`));
207
+ }
208
+ }
209
+ else {
210
+ console.log(dim(` #${reqNum} ${method} -> RPC`));
211
+ const response = await forwardToRpc(rpcUrl, rpcRequest);
212
+ sendJsonResponse(res, response);
213
+ }
214
+ }
215
+ catch (error) {
216
+ const msg = error instanceof Error ? error.message : 'Unknown error';
217
+ sendJsonResponse(res, makeErrorResponse(null, -32603, msg));
218
+ }
219
+ });
220
+ const shutdown = () => {
221
+ console.log(dim('\n Shutting down proxy...'));
222
+ try {
223
+ signer.destroy();
224
+ console.log(dim(' Share wiped from memory.'));
225
+ }
226
+ catch {
227
+ // ignore destroy errors
228
+ }
229
+ server.close(() => {
230
+ console.log(dim(' Proxy stopped.\n'));
231
+ process.exit(0);
232
+ });
233
+ };
234
+ process.on('SIGINT', shutdown);
235
+ process.on('SIGTERM', shutdown);
236
+ server.listen(port, () => {
237
+ console.log('');
238
+ console.log(`${success(' Proxy running on ')}${chalk.bold(`http://localhost:${port}`)}`);
239
+ console.log('');
240
+ console.log(dim(' Usage with Foundry:'));
241
+ console.log(dim(` forge script Script.s.sol --rpc-url http://localhost:${port}`));
242
+ console.log(dim(' Usage with cast:'));
243
+ console.log(dim(` cast send <to> --rpc-url http://localhost:${port}`));
244
+ console.log('');
245
+ console.log(dim(' Press Ctrl+C to stop.\n'));
246
+ });
247
+ });
248
+ //# sourceMappingURL=proxy.command.js.map