@agentxv2/gateway 0.1.1

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 (175) hide show
  1. package/.env.example +53 -0
  2. package/db/migrations/001_init.sql +117 -0
  3. package/db/migrations/002_agents.sql +20 -0
  4. package/db/migrations/003_a2a_results.sql +23 -0
  5. package/deploy/.env.deploy.example +23 -0
  6. package/deploy/add_swap_build.py +45 -0
  7. package/deploy/build_and_deploy.py +110 -0
  8. package/deploy/build_deploy_a2a.py +190 -0
  9. package/deploy/build_no_lint.py +52 -0
  10. package/deploy/build_on_fe.py +86 -0
  11. package/deploy/build_on_gw.py +98 -0
  12. package/deploy/build_prod.py +54 -0
  13. package/deploy/check_bal.py +31 -0
  14. package/deploy/check_code.py +47 -0
  15. package/deploy/check_deploy.sh +20 -0
  16. package/deploy/check_docs.py +16 -0
  17. package/deploy/check_frontend.py +42 -0
  18. package/deploy/check_frontend2.py +35 -0
  19. package/deploy/check_pks.py +34 -0
  20. package/deploy/check_status.py +32 -0
  21. package/deploy/check_v2.py +8 -0
  22. package/deploy/clean_install.py +28 -0
  23. package/deploy/deploy_a2a.py +58 -0
  24. package/deploy/deploy_a2a.sh +33 -0
  25. package/deploy/deploy_a2a_bg.sh +40 -0
  26. package/deploy/deploy_a2a_v2.py +151 -0
  27. package/deploy/deploy_a2a_v2.sh +36 -0
  28. package/deploy/deploy_bin.py +64 -0
  29. package/deploy/deploy_config.py +34 -0
  30. package/deploy/deploy_final.py +42 -0
  31. package/deploy/deploy_frontend.py +108 -0
  32. package/deploy/deploy_mcp.py +108 -0
  33. package/deploy/deploy_now.py +49 -0
  34. package/deploy/deploy_push_all.py +128 -0
  35. package/deploy/deploy_script.py +64 -0
  36. package/deploy/deploy_sep_a2a.sh +18 -0
  37. package/deploy/dev_mode.py +51 -0
  38. package/deploy/diag.py +12 -0
  39. package/deploy/diff_test.py +22 -0
  40. package/deploy/final_check.py +33 -0
  41. package/deploy/final_deploy.py +50 -0
  42. package/deploy/final_fix.py +54 -0
  43. package/deploy/final_push.py +114 -0
  44. package/deploy/find_frontend.py +38 -0
  45. package/deploy/fix_a2a.py +43 -0
  46. package/deploy/fix_and_build.py +77 -0
  47. package/deploy/fix_and_verify.py +56 -0
  48. package/deploy/fix_build.py +51 -0
  49. package/deploy/forge_deploy.py +67 -0
  50. package/deploy/full_push.py +101 -0
  51. package/deploy/full_push2.py +106 -0
  52. package/deploy/go_prod.py +59 -0
  53. package/deploy/gw_deploy.py +133 -0
  54. package/deploy/gw_final.py +206 -0
  55. package/deploy/gw_restart.py +28 -0
  56. package/deploy/gw_status.py +18 -0
  57. package/deploy/inline_build.py +99 -0
  58. package/deploy/one_shot.py +84 -0
  59. package/deploy/ox_deploy.py +32 -0
  60. package/deploy/pg_setup.py +36 -0
  61. package/deploy/prod_deploy.py +126 -0
  62. package/deploy/prod_final.py +140 -0
  63. package/deploy/prod_go.py +61 -0
  64. package/deploy/prod_one_shot.py +139 -0
  65. package/deploy/prod_setup.sh +62 -0
  66. package/deploy/prod_v2.py +91 -0
  67. package/deploy/prod_v3.py +103 -0
  68. package/deploy/push_docs.py +93 -0
  69. package/deploy/push_mcp.py +66 -0
  70. package/deploy/push_mcp_doc.py +28 -0
  71. package/deploy/push_v063.py +80 -0
  72. package/deploy/push_v2.py +71 -0
  73. package/deploy/qcheck.py +13 -0
  74. package/deploy/qcheck2.py +18 -0
  75. package/deploy/quick_check.py +8 -0
  76. package/deploy/rebuild.py +47 -0
  77. package/deploy/rebuild_frontend.py +44 -0
  78. package/deploy/restart.py +28 -0
  79. package/deploy/restore_frontend.py +42 -0
  80. package/deploy/restore_frontend2.py +41 -0
  81. package/deploy/restore_gateway.py +34 -0
  82. package/deploy/restore_quick.py +33 -0
  83. package/deploy/run_bash.py +19 -0
  84. package/deploy/run_sep.py +20 -0
  85. package/deploy/sdk_upgrade.py +50 -0
  86. package/deploy/server_prepare.py +41 -0
  87. package/deploy/server_setup.py +41 -0
  88. package/deploy/ssh_check.py +14 -0
  89. package/deploy/ssh_push.py +24 -0
  90. package/deploy/start_deploy.py +35 -0
  91. package/deploy/start_frontend.py +12 -0
  92. package/deploy/start_v2.py +29 -0
  93. package/deploy/stat.py +18 -0
  94. package/deploy/tail_log.py +11 -0
  95. package/deploy/update_env.py +32 -0
  96. package/deploy/upload_and_start.py +107 -0
  97. package/deploy/verify_a2a.py +13 -0
  98. package/deploy/verify_mcp.py +37 -0
  99. package/deploy/verify_sdk.py +21 -0
  100. package/dist/config.d.ts +26 -0
  101. package/dist/config.js +41 -0
  102. package/dist/config.js.map +1 -0
  103. package/dist/index.d.ts +1 -0
  104. package/dist/index.js +149 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/lib/crypto.d.ts +2 -0
  107. package/dist/lib/crypto.js +43 -0
  108. package/dist/lib/crypto.js.map +1 -0
  109. package/dist/lib/db.d.ts +3 -0
  110. package/dist/lib/db.js +26 -0
  111. package/dist/lib/db.js.map +1 -0
  112. package/dist/lib/ethers-utils.d.ts +60 -0
  113. package/dist/lib/ethers-utils.js +186 -0
  114. package/dist/lib/ethers-utils.js.map +1 -0
  115. package/dist/middleware/adminAuth.d.ts +2 -0
  116. package/dist/middleware/adminAuth.js +31 -0
  117. package/dist/middleware/adminAuth.js.map +1 -0
  118. package/dist/middleware/auth.d.ts +22 -0
  119. package/dist/middleware/auth.js +192 -0
  120. package/dist/middleware/auth.js.map +1 -0
  121. package/dist/middleware/error-handler.d.ts +36 -0
  122. package/dist/middleware/error-handler.js +100 -0
  123. package/dist/middleware/error-handler.js.map +1 -0
  124. package/dist/middleware/rate-limiter.d.ts +5 -0
  125. package/dist/middleware/rate-limiter.js +107 -0
  126. package/dist/middleware/rate-limiter.js.map +1 -0
  127. package/dist/routes/a2a.d.ts +2 -0
  128. package/dist/routes/a2a.js +84 -0
  129. package/dist/routes/a2a.js.map +1 -0
  130. package/dist/routes/admin.d.ts +2 -0
  131. package/dist/routes/admin.js +180 -0
  132. package/dist/routes/admin.js.map +1 -0
  133. package/dist/routes/agents.d.ts +2 -0
  134. package/dist/routes/agents.js +43 -0
  135. package/dist/routes/agents.js.map +1 -0
  136. package/dist/routes/chat.d.ts +2 -0
  137. package/dist/routes/chat.js +183 -0
  138. package/dist/routes/chat.js.map +1 -0
  139. package/dist/routes/history.d.ts +2 -0
  140. package/dist/routes/history.js +92 -0
  141. package/dist/routes/history.js.map +1 -0
  142. package/dist/routes/mcp.d.ts +13 -0
  143. package/dist/routes/mcp.js +513 -0
  144. package/dist/routes/mcp.js.map +1 -0
  145. package/dist/routes/tenant.d.ts +2 -0
  146. package/dist/routes/tenant.js +154 -0
  147. package/dist/routes/tenant.js.map +1 -0
  148. package/dist/services/a2a-worker.d.ts +7 -0
  149. package/dist/services/a2a-worker.js +406 -0
  150. package/dist/services/a2a-worker.js.map +1 -0
  151. package/dist/services/agent-indexer.d.ts +4 -0
  152. package/dist/services/agent-indexer.js +124 -0
  153. package/dist/services/agent-indexer.js.map +1 -0
  154. package/e2e_wallet.js +175 -0
  155. package/ecosystem.config.js +17 -0
  156. package/package.json +33 -0
  157. package/src/config.ts +47 -0
  158. package/src/index.ts +143 -0
  159. package/src/lib/crypto.ts +44 -0
  160. package/src/lib/db.ts +25 -0
  161. package/src/lib/ethers-utils.ts +229 -0
  162. package/src/middleware/adminAuth.ts +34 -0
  163. package/src/middleware/auth.ts +244 -0
  164. package/src/middleware/error-handler.ts +109 -0
  165. package/src/middleware/rate-limiter.ts +115 -0
  166. package/src/routes/a2a.ts +97 -0
  167. package/src/routes/admin.ts +219 -0
  168. package/src/routes/agents.ts +52 -0
  169. package/src/routes/chat.ts +219 -0
  170. package/src/routes/history.ts +114 -0
  171. package/src/routes/mcp.ts +567 -0
  172. package/src/routes/tenant.ts +196 -0
  173. package/src/services/a2a-worker.ts +486 -0
  174. package/src/services/agent-indexer.ts +127 -0
  175. package/tsconfig.json +18 -0
@@ -0,0 +1,40 @@
1
+ #!/bin/bash
2
+ export PATH=$HOME/.foundry/bin:$PATH
3
+ cd /tmp/a2a_build
4
+ ln -sf erc8004-interfaces src/interfaces 2>/dev/null
5
+
6
+ PK=0x9ff7f5511067c86fdd8c1dee11799e4778e4b1e86e5093d53eae8d4af356a424
7
+ SEP_IR=0xe94ad380d3F8d08a7590eda0C84f354a93F96e5F
8
+ LOG=/tmp/a2a_deploy.log
9
+
10
+ {
11
+ echo "===== $(date) - SEPOLIA ====="
12
+ ARGS_HEX=$(cast abi-encode 'constructor(address)' $SEP_IR 2>&1)
13
+ echo "ABI-encoded args: $ARGS_HEX"
14
+
15
+ forge create \
16
+ --rpc-url https://ethereum-sepolia-rpc.publicnode.com \
17
+ --private-key $PK \
18
+ --legacy \
19
+ src/erc8004-extensions/A2AProtocolRegistry.sol:A2AProtocolRegistry \
20
+ --constructor-args $ARGS_HEX \
21
+ 2>&1
22
+
23
+ echo ""
24
+ echo "===== $(date) - OXACHAIN L1 ====="
25
+ OX_IR=0xbf5F9db266c8c97E3334466C88597Eb758AfE212
26
+ OX_ARGS_HEX=$(cast abi-encode 'constructor(address)' $OX_IR 2>&1)
27
+ echo "ABI-encoded args: $OX_ARGS_HEX"
28
+
29
+ forge create \
30
+ --rpc-url http://43.156.99.215:18545 \
31
+ --private-key $PK \
32
+ --legacy \
33
+ src/erc8004-extensions/A2AProtocolRegistry.sol:A2AProtocolRegistry \
34
+ --constructor-args $OX_ARGS_HEX \
35
+ 2>&1
36
+
37
+ echo "===== DONE $(date) ====="
38
+ } > $LOG 2>&1
39
+
40
+ echo "Deploy started in background. Check: tail -f $LOG"
@@ -0,0 +1,151 @@
1
+ import paramiko
2
+ import tarfile
3
+ import os
4
+ import time
5
+ import base64
6
+
7
+ host = '43.156.78.59'
8
+ pk = '0x872c3190b82d17b29bb046c9c55a7f7390c7f74bd6d592ba8d211f20f896f28e'
9
+ SEP_IR = '0xe94ad380d3F8d08a7590eda0C84f354a93F96e5F'
10
+ OX_IR = '0xbf5F9db266c8c97E3334466C88597Eb758AfE212'
11
+ SEP_RPC = 'https://ethereum-sepolia-rpc.publicnode.com'
12
+ OX_RPC = 'http://43.156.99.215:18545'
13
+
14
+ local_dir = r'c:\Users\apply\Downloads\code\agentx\extracted\Agentx\contracts'
15
+ tar_path = r'c:\Users\apply\Downloads\code\agentx_contracts.tar.gz'
16
+
17
+ print("=== Creating tar ===")
18
+ with tarfile.open(tar_path, 'w:gz') as tar:
19
+ for root, dirs, files in os.walk(local_dir):
20
+ dirs[:] = [d for d in dirs if d not in ('node_modules', 'lib', 'out', 'cache', 'broadcast', '.git', '__pycache__')]
21
+ for f in files:
22
+ if f.endswith('.json') and 'out' in root: continue
23
+ full = os.path.join(root, f)
24
+ arc = os.path.relpath(full, local_dir).replace('\\', '/')
25
+ tar.add(full, arcname=arc)
26
+ print(f"{os.path.getsize(tar_path)} bytes")
27
+
28
+ # Upload
29
+ transport = paramiko.Transport((host, 22))
30
+ transport.connect(username='ubuntu', password='Asdf1234!')
31
+ sftp = paramiko.SFTPClient.from_transport(transport)
32
+ sftp.put(tar_path, '/tmp/a2a_contracts.tar.gz')
33
+ sftp.close()
34
+ transport.close()
35
+
36
+ c = paramiko.SSHClient()
37
+ c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
38
+ c.connect(host, username='ubuntu', password='Asdf1234!', timeout=30)
39
+
40
+ def run(ssh_client, cmd, desc=""):
41
+ print(f"\n[{desc}] > {cmd[:130]}")
42
+ stdin, stdout, stderr = ssh_client.exec_command(cmd, timeout=600)
43
+ out = stdout.read().decode()
44
+ err = stderr.read().decode()
45
+ ec = stdout.channel.recv_exit_status()
46
+ if out: print(out[-600:])
47
+ if err: print("STDERR:", err[-300:])
48
+ return ec, out, err
49
+
50
+ # Step 1: Extract
51
+ run(c, "cd /tmp && rm -rf a2a_build && mkdir a2a_build && cd a2a_build && tar xzf /tmp/a2a_contracts.tar.gz && echo OK")
52
+
53
+ # Step 2: Init git + install forge deps
54
+ print("\n=== Git init + install deps ===")
55
+ run(c, "cd /tmp/a2a_build && git init && git add . && git commit -m init 2>&1 | tail -3", "git init")
56
+ run(c, "export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && forge install foundry-rs/forge-std 2>&1 | tail -5", "forge-std")
57
+ run(c, "export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && forge install OpenZeppelin/openzeppelin-contracts@v5.0.2 2>&1 | tail -5", "oz")
58
+
59
+ # Verify deps
60
+ print("\n=== Verify deps ===")
61
+ ec, out, err = run(c, "ls /tmp/a2a_build/lib/forge-std/src/Script.sol && ls /tmp/a2a_build/lib/openzeppelin-contracts/contracts/access/Ownable.sol && echo DEPS_OK")
62
+ if ec != 0:
63
+ run(c, "ls -la /tmp/a2a_build/lib/ 2>&1", "check lib")
64
+ exit(1)
65
+
66
+ # Step 3: Write foundry.toml
67
+ toml = """[profile.default]
68
+ solc = "0.8.24"
69
+ via_ir = true
70
+ optimizer = true
71
+ optimizer_runs = 200
72
+ evm_version = "paris"
73
+ remappings = [
74
+ "@openzeppelin/=lib/openzeppelin-contracts/",
75
+ "forge-std/=lib/forge-std/src/"
76
+ ]
77
+ """
78
+ b64 = base64.b64encode(toml.encode()).decode()
79
+ run(c, f"echo '{b64}' | base64 -d > /tmp/a2a_build/foundry.toml && echo written")
80
+
81
+ # Step 4: Build
82
+ print("\n=== FORGE BUILD ===")
83
+ ec, out, err = run(c, "export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && forge build 2>&1 | tail -15", "build")
84
+ if ec != 0:
85
+ print("Trying with auto-detect solc...")
86
+ run(c, "export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && forge build 2>&1 | tail -20")
87
+ exit(1)
88
+
89
+ # Step 5: Deploy Sepolia
90
+ print("\n=========================================")
91
+ print(" SEPOLIA DEPLOY")
92
+ print("=========================================")
93
+ ec, out, err = run(c,
94
+ f"export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && "
95
+ f"forge create src/erc8004-extensions/A2AProtocolRegistry.sol:A2AProtocolRegistry "
96
+ f"--rpc-url {SEP_RPC} --private-key {pk} --constructor-args {SEP_IR} --legacy 2>&1",
97
+ "deploy Sepolia")
98
+
99
+ sep_addr = ""
100
+ for line in (out + err).split('\n'):
101
+ if 'Deployed to' in line:
102
+ sep_addr = line.split(':')[-1].strip()
103
+ print(f"\n>>> SEPOLIA A2A deployed to: {sep_addr}")
104
+
105
+ # Step 6: Deploy OxaChain
106
+ print("\n=========================================")
107
+ print(" OXACHAIN L1 DEPLOY")
108
+ print("=========================================")
109
+ ec, out, err = run(c,
110
+ f"export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && "
111
+ f"forge create src/erc8004-extensions/A2AProtocolRegistry.sol:A2AProtocolRegistry "
112
+ f"--rpc-url {OX_RPC} --private-key {pk} --constructor-args {OX_IR} --legacy 2>&1",
113
+ "deploy OxaChain")
114
+
115
+ ox_addr = ""
116
+ for line in (out + err).split('\n'):
117
+ if 'Deployed to' in line:
118
+ ox_addr = line.split(':')[-1].strip()
119
+ print(f"\n>>> OXACHAIN A2A deployed to: {ox_addr}")
120
+
121
+ # Step 7: Verify Sepolia
122
+ if sep_addr:
123
+ print("\n=== Verifying Sepolia ===")
124
+ run(c,
125
+ f"export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && "
126
+ f"forge verify-contract {sep_addr} src/erc8004-extensions/A2AProtocolRegistry.sol:A2AProtocolRegistry "
127
+ f"--verifier blockscout --verifier-url 'https://eth-sepolia.blockscout.com/api/' "
128
+ f"--constructor-args $(cast abi-encode 'constructor(address)' {SEP_IR}) 2>&1 | tail -10",
129
+ "verify")
130
+
131
+ # Step 8: Verify OxaChain
132
+ if ox_addr:
133
+ print("\n=== Verifying OxaChain ===")
134
+ run(c,
135
+ f"export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && "
136
+ f"forge verify-contract {ox_addr} src/erc8004-extensions/A2AProtocolRegistry.sol:A2AProtocolRegistry "
137
+ f"--verifier blockscout --verifier-url 'http://43.156.99.215:18400/api/' "
138
+ f"--constructor-args $(cast abi-encode 'constructor(address)' {OX_IR}) 2>&1 | tail -10",
139
+ "verify")
140
+
141
+ c.close()
142
+
143
+ print("\n============================================")
144
+ print(f" Sepolia A2A: {sep_addr}")
145
+ print(f" OxaChain L1 A2A: {ox_addr}")
146
+ print("============================================")
147
+
148
+ if sep_addr or ox_addr:
149
+ with open(r'c:\Users\apply\Downloads\code\agentx\extracted\Agentx\gateway\deploy\a2a_addresses.txt', 'w') as f:
150
+ f.write(f"SEPOLIA_A2A={sep_addr}\n")
151
+ f.write(f"OXACHAIN_A2A={ox_addr}\n")
@@ -0,0 +1,36 @@
1
+ #!/bin/bash
2
+ export PATH=$HOME/.foundry/bin:$PATH
3
+ cd /tmp/a2a_build
4
+ ln -sf erc8004-interfaces src/interfaces 2>/dev/null
5
+
6
+ PK=0x9ff7f5511067c86fdd8c1dee11799e4778e4b1e86e5093d53eae8d4af356a424
7
+ LOG=/tmp/a2a_deploy2.log
8
+
9
+ {
10
+ echo "===== $(date) SEPOLIA ====="
11
+ cat > .env << ENVEOF
12
+ IDENTITY_REGISTRY=0xe94ad380d3F8d08a7590eda0C84f354a93F96e5F
13
+ PRIVATE_KEY=$PK
14
+ ENVEOF
15
+
16
+ forge script script/DeployA2A.s.sol:DeployA2A \
17
+ --rpc-url https://ethereum-sepolia-rpc.publicnode.com \
18
+ --broadcast --legacy \
19
+ 2>&1
20
+
21
+ echo ""
22
+ echo "===== $(date) OXACHAIN L1 ====="
23
+ cat > .env << ENVEOF
24
+ IDENTITY_REGISTRY=0xbf5F9db266c8c97E3334466C88597Eb758AfE212
25
+ PRIVATE_KEY=$PK
26
+ ENVEOF
27
+
28
+ forge script script/DeployA2A.s.sol:DeployA2A \
29
+ --rpc-url http://43.156.99.215:18545 \
30
+ --broadcast --legacy \
31
+ 2>&1
32
+
33
+ echo "===== DONE $(date) ====="
34
+ } > $LOG 2>&1
35
+
36
+ echo "Background deploy started. PID=$!"
@@ -0,0 +1,64 @@
1
+ import paramiko
2
+ import base64
3
+
4
+ pk = '0x872c3190b82d17b29bb046c9c55a7f7390c7f74bd6d592ba8d211f20f896f28e'
5
+ SEP_IR = '0xe94ad380d3F8d08a7590eda0C84f354a93F96e5F'
6
+ OX_IR = '0xbf5F9db266c8c97E3334466C88597Eb758AfE212'
7
+ SEP_RPC = 'https://ethereum-sepolia-rpc.publicnode.com'
8
+ OX_RPC = 'http://43.156.99.215:18545'
9
+
10
+ # Use forge create with the address directly via --constructor-args-path
11
+ # Write the encoded bytes to a file
12
+ SEP_ARGS_BIN = bytes.fromhex('000000000000000000000000'+SEP_IR[2:].lower())
13
+ OX_ARGS_BIN = bytes.fromhex('000000000000000000000000'+OX_IR[2:].lower())
14
+
15
+ c = paramiko.SSHClient()
16
+ c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
17
+ c.connect('43.156.78.59', username='ubuntu', password='Asdf1234!', timeout=30)
18
+
19
+ def run(cmd):
20
+ print(f"> {cmd[:120]}")
21
+ stdin, stdout, stderr = c.exec_command(cmd, timeout=600)
22
+ out = stdout.read().decode()
23
+ err = stderr.read().decode()
24
+ ec = stdout.channel.recv_exit_status()
25
+ if out: print(out[-400:])
26
+ if err: print("STDERR:", err[-400:])
27
+ return ec, out, err
28
+
29
+ # Ensure symlink
30
+ run("export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build/src && ln -sf erc8004-interfaces interfaces")
31
+
32
+ # Write constructor args as binary files via base64
33
+ import base64
34
+ sep_b64 = base64.b64encode(SEP_ARGS_BIN).decode()
35
+ ox_b64 = base64.b64encode(OX_ARGS_BIN).decode()
36
+
37
+ run(f"echo '{sep_b64}' | base64 -d > /tmp/sep_args.bin && xxd /tmp/sep_args.bin")
38
+ run(f"echo '{ox_b64}' | base64 -d > /tmp/ox_args.bin && xxd /tmp/ox_args.bin")
39
+
40
+ # Deploy Sepolia
41
+ print("\n========== SEPOLIA ==========")
42
+ ec, out, err = run(
43
+ f"export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && "
44
+ f"forge create src/erc8004-extensions/A2AProtocolRegistry.sol:A2AProtocolRegistry "
45
+ f"--rpc-url {SEP_RPC} --private-key {pk} --legacy "
46
+ f"--constructor-args-path /tmp/sep_args.bin 2>&1"
47
+ )
48
+ for line in (out + err).split('\n'):
49
+ if any(w in line for w in ['Deployed to', 'Transaction', 'Error', 'Block', 'Gas']):
50
+ print(f" {line.strip()}")
51
+
52
+ # Deploy OxaChain
53
+ print("\n========== OXACHAIN L1 ==========")
54
+ ec, out, err = run(
55
+ f"export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && "
56
+ f"forge create src/erc8004-extensions/A2AProtocolRegistry.sol:A2AProtocolRegistry "
57
+ f"--rpc-url {OX_RPC} --private-key {pk} --legacy "
58
+ f"--constructor-args-path /tmp/ox_args.bin 2>&1"
59
+ )
60
+ for line in (out + err).split('\n'):
61
+ if any(w in line for w in ['Deployed to', 'Transaction', 'Error', 'Block', 'Gas']):
62
+ print(f" {line.strip()}")
63
+
64
+ c.close()
@@ -0,0 +1,34 @@
1
+ """
2
+ AgentX 部署配置模块
3
+ ====================
4
+ 所有凭证和服务器地址从环境变量读取,避免硬编码。
5
+ 使用时: from deploy_config import HOST, PASSWORD, PK, OX_RPC
6
+ """
7
+
8
+ import os
9
+ import sys
10
+
11
+ # ── SSH 连接 ──────────────────────────────────────────────────────
12
+ HOST = os.environ.get("AGENTX_DEPLOY_HOST", "")
13
+ PASSWORD = os.environ.get("AGENTX_DEPLOY_PASSWORD", "")
14
+ USER = os.environ.get("AGENTX_DEPLOY_USER", "ubuntu")
15
+
16
+ # ── Web3 / Chain ──────────────────────────────────────────────────
17
+ PK = os.environ.get("AGENTX_DEPLOY_PRIVATE_KEY", "")
18
+ OX_RPC = os.environ.get("AGENTX_OX_RPC", "http://43.156.99.215:18545")
19
+ SEPOLIA_RPC = os.environ.get("AGENTX_SEPOLIA_RPC", "https://ethereum-sepolia-rpc.publicnode.com")
20
+
21
+ # ── Paths (no secrets — these are fine as defaults) ───────────────
22
+ PROJECT_ROOT = os.environ.get("AGENTX_PROJECT_ROOT", "/home/ubuntu/agentx")
23
+
24
+ # ── Validation ────────────────────────────────────────────────────
25
+ _REQUIRED = {
26
+ "AGENTX_DEPLOY_HOST": HOST,
27
+ "AGENTX_DEPLOY_PASSWORD": PASSWORD,
28
+ "AGENTX_DEPLOY_PRIVATE_KEY": PK,
29
+ }
30
+
31
+ _missing = [k for k, v in _REQUIRED.items() if not v]
32
+ if _missing and any("deploy_config" in arg for arg in sys.argv):
33
+ print(f"[deploy_config] WARNING: 以下环境变量未设置: {', '.join(_missing)}")
34
+ print("[deploy_config] 请先 source .env.deploy 或手动 export 这些变量")
@@ -0,0 +1,42 @@
1
+ import paramiko
2
+
3
+ c = paramiko.SSHClient()
4
+ c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
5
+ c.connect('43.156.78.59', username='ubuntu', password='Asdf1234!', timeout=30)
6
+
7
+ def run(cmd):
8
+ print(f"> {cmd[:130]}")
9
+ stdin, stdout, stderr = c.exec_command(cmd, timeout=600)
10
+ out = stdout.read().decode()
11
+ err = stderr.read().decode()
12
+ ec = stdout.channel.recv_exit_status()
13
+ if out: print(out[-600:])
14
+ if err: print("E:", err[-400:])
15
+ return ec, out, err
16
+
17
+ # symlink
18
+ run("export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build/src && ln -sf erc8004-interfaces interfaces")
19
+
20
+ # Sepolia - address as positional arg
21
+ print("\n===== SEPOLIA =====")
22
+ ec, out, err = run(
23
+ "export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && "
24
+ "forge create src/erc8004-extensions/A2AProtocolRegistry.sol:A2AProtocolRegistry "
25
+ "--rpc-url https://ethereum-sepolia-rpc.publicnode.com "
26
+ "--private-key 0x872c3190b82d17b29bb046c9c55a7f7390c7f74bd6d592ba8d211f20f896f28e "
27
+ "--legacy "
28
+ "0xe94ad380d3F8d08a7590eda0C84f354a93F96e5F 2>&1"
29
+ )
30
+
31
+ # OxaChain
32
+ print("\n===== OXACHAIN L1 =====")
33
+ ec, out, err = run(
34
+ "export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && "
35
+ "forge create src/erc8004-extensions/A2AProtocolRegistry.sol:A2AProtocolRegistry "
36
+ "--rpc-url http://43.156.99.215:18545 "
37
+ "--private-key 0x872c3190b82d17b29bb046c9c55a7f7390c7f74bd6d592ba8d211f20f896f28e "
38
+ "--legacy "
39
+ "0xbf5F9db266c8c97E3334466C88597Eb758AfE212 2>&1"
40
+ )
41
+
42
+ c.close()
@@ -0,0 +1,108 @@
1
+ import paramiko
2
+ import os
3
+
4
+ host = '43.156.78.59'
5
+ user = 'ubuntu'
6
+ password = 'Asdf1234!'
7
+
8
+ client = paramiko.SSHClient()
9
+ client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
10
+ client.connect(host, username=user, password=password, timeout=15)
11
+
12
+ sftp = client.open_sftp()
13
+
14
+ def run(cmd):
15
+ print(f"> {cmd}")
16
+ stdin, stdout, stderr = client.exec_command(cmd)
17
+ out = stdout.read().decode()
18
+ err = stderr.read().decode()
19
+ ec = stdout.channel.recv_exit_status()
20
+ if out: print(out)
21
+ if err: print("ERR:", err[:400])
22
+ return ec, out, err
23
+
24
+ def upload(local, remote):
25
+ print(f" Upload: {local} -> {remote}")
26
+ try:
27
+ sftp.put(local, remote)
28
+ print(" OK")
29
+ except Exception as e:
30
+ print(f" ERROR: {e}")
31
+ # Ensure remote directory exists
32
+ remote_dir = os.path.dirname(remote).replace('\\', '/')
33
+ try:
34
+ stdin, stdout, stderr = client.exec_command(f"mkdir -p {remote_dir}")
35
+ stdout.channel.recv_exit_status()
36
+ sftp.put(local, remote)
37
+ print(" OK (retry)")
38
+ except Exception as e2:
39
+ print(f" FAILED: {e2}")
40
+
41
+ # First, find the actual agentx-platform structure
42
+ print("=== AgentX Platform structure ===")
43
+ run("ls ~/agentx-platform/ 2>/dev/null")
44
+ run("ls ~/agentx-platform/app/ 2>/dev/null | head -20")
45
+ run("ls ~/agentx-platform/app/user/chat/ 2>/dev/null")
46
+ run("ls ~/agentx-platform/components/ 2>/dev/null | head -10")
47
+ run("ls ~/agentx-platform/hooks/ 2>/dev/null")
48
+ run("cat ~/agentx-platform/.env.local 2>/dev/null | grep GATEWAY || echo 'No GATEWAY in .env.local'")
49
+ run("cat ~/agentx-platform/.env.production 2>/dev/null | grep GATEWAY || echo 'No GATEWAY in .env.production'")
50
+
51
+ # Upload new files
52
+ source_dir = r'c:\Users\apply\Downloads\code\agentx\extracted\Agentx\frontend'
53
+ target_dir = '/home/ubuntu/agentx-platform'
54
+
55
+ print("\n=== Uploading new/updated files ===")
56
+
57
+ # 1. Chat page
58
+ upload(
59
+ os.path.join(source_dir, 'app', 'user', 'chat', '[agentId]', 'page.tsx'),
60
+ os.path.join(target_dir, 'app', 'user', 'chat', '[agentId]', 'page.tsx')
61
+ )
62
+
63
+ # 2. Gateway auth hook
64
+ upload(
65
+ os.path.join(source_dir, 'hooks', 'useGatewayAuth.ts'),
66
+ os.path.join(target_dir, 'hooks', 'useGatewayAuth.ts')
67
+ )
68
+
69
+ # 3. ToolCallBubble component
70
+ upload(
71
+ os.path.join(source_dir, 'components', 'chat', 'ToolCallBubble.tsx'),
72
+ os.path.join(target_dir, 'components', 'chat', 'ToolCallBubble.tsx')
73
+ )
74
+
75
+ # 4. Updated .env.production
76
+ upload(
77
+ os.path.join(source_dir, '.env.production'),
78
+ os.path.join(target_dir, '.env.production')
79
+ )
80
+
81
+ sftp.close()
82
+
83
+ # Also update .env.local with gateway URL
84
+ print("\n=== Updating .env.local with gateway URL ===")
85
+ run("cd ~/agentx-platform && grep -q 'AGENTX_GATEWAY_URL' .env.local 2>/dev/null && echo 'Already set' || echo 'NEXT_PUBLIC_AGENTX_GATEWAY_URL=http://101.33.109.117:3090' >> .env.local")
86
+ run("cat ~/agentx-platform/.env.local 2>/dev/null | grep GATEWAY")
87
+
88
+ # Rebuild and restart
89
+ print("\n=== Rebuilding frontend ===")
90
+ run("cd ~/agentx-platform && npm install --production 2>&1 | tail -5")
91
+ run("cd ~/agentx-platform && npx next build 2>&1 | tail -20")
92
+
93
+ # Find and restart the next process
94
+ print("\n=== Restarting frontend ===")
95
+ run("ps aux | grep 'next-server' | grep -v grep")
96
+ run("kill $(pgrep -f 'next-server' | head -1) 2>/dev/null; sleep 1")
97
+ run("cd ~/agentx-platform && nohup npx next start -p 8080 > /tmp/next.log 2>&1 &")
98
+ run("sleep 3 && curl -s -o /dev/null -w '%{http_code}' http://localhost:8080/ 2>&1")
99
+
100
+ # Verify
101
+ print("\n=== Final verification ===")
102
+ run("ss -tlnp | grep 8080")
103
+ run("curl -s -o /dev/null -w 'HTTP %{http_code}\n' http://localhost:8080/")
104
+
105
+ client.close()
106
+ print("\n=== Frontend deploy complete ===")
107
+ print("Gateway: http://101.33.109.117:3090")
108
+ print("Frontend: http://43.156.78.59:8080")
@@ -0,0 +1,108 @@
1
+ import paramiko, tarfile, os, base64, time
2
+
3
+ HOST = '43.156.225.164'
4
+ PWD = 'Asdf1234!'
5
+ APP = '/home/ubuntu/agentx-gateway'
6
+
7
+ local = r'c:\Users\apply\Downloads\code\agentx\extracted\Agentx\gateway'
8
+ tarpath = r'c:\Users\apply\Downloads\code\agentx_gw_mcp.tar.gz'
9
+
10
+ # 1. Tar gateway files
11
+ print("=== Tar ===")
12
+ files_added = []
13
+ with tarfile.open(tarpath, 'w:gz') as tar:
14
+ for root, dirs, files in os.walk(local):
15
+ dirs[:] = [d for d in dirs if d not in ('node_modules','dist','.git')]
16
+ for f in files:
17
+ if f.endswith('.tar.gz') or f in ('.env',): continue
18
+ full = os.path.join(root, f)
19
+ arc = os.path.relpath(full, local).replace('\\', '/')
20
+ tar.add(full, arcname=arc)
21
+ files_added.append(arc)
22
+ print(f"{len(files_added)} files, {os.path.getsize(tarpath)//1024} KB")
23
+
24
+ # 2. Upload
25
+ print("Uploading...")
26
+ t = paramiko.Transport((HOST, 22))
27
+ t.connect(username='ubuntu', password=PWD)
28
+ s = paramiko.SFTPClient.from_transport(t)
29
+ s.put(tarpath, '/tmp/gw_mcp.tar.gz')
30
+ s.close()
31
+ t.close()
32
+
33
+ # 3. Deploy: extract, install, build, start
34
+ c = paramiko.SSHClient()
35
+ c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
36
+ c.connect(HOST, username='ubuntu', password=PWD, timeout=30)
37
+
38
+ # Extract new files
39
+ stdin, stdout, stderr = c.exec_command(f"cd {APP} && tar xzf /tmp/gw_mcp.tar.gz --overwrite && echo 'EXTRACTED' && ls src/routes/mcp.ts")
40
+ print(stdout.read().decode().strip())
41
+
42
+ # Install deps (ethers is already in package.json)
43
+ print("\n=== npm install ===")
44
+ stdin, stdout, stderr = c.exec_command(f"cd {APP} && npm install 2>&1 | tail -5", timeout=120)
45
+ print(stdout.read().decode())
46
+
47
+ # Build
48
+ print("\n=== tsc ===")
49
+ stdin, stdout, stderr = c.exec_command(f"cd {APP} && ./node_modules/.bin/tsc 2>&1 | tail -10; echo 'EXIT='$?", timeout=120)
50
+ out = stdout.read().decode()
51
+ print(out[-500:])
52
+
53
+ # Check dist
54
+ stdin, stdout, stderr = c.exec_command(f"ls {APP}/dist/routes/mcp.js 2>/dev/null && echo BUILD_OK || echo BUILD_FAILED")
55
+ check = stdout.read().decode().strip()
56
+ print(f"Build: {check}")
57
+
58
+ if 'FAILED' in check:
59
+ print("BUILD FAILED")
60
+ c.close()
61
+ exit(1)
62
+
63
+ # Read current .env
64
+ stdin, stdout, stderr = c.exec_command(f"cat {APP}/.env")
65
+ env = stdout.read().decode()
66
+
67
+ # Ensure MCP-related env vars exist
68
+ env_lines = env.split('\n')
69
+ has_rpc = any('RPC_URL' in l for l in env_lines)
70
+ has_chain = any('CHAIN_ID' in l for l in env_lines)
71
+
72
+ if not has_rpc:
73
+ env_lines.append('RPC_URL=https://ethereum-sepolia-rpc.publicnode.com')
74
+ if not has_chain:
75
+ env_lines.append('CHAIN_ID=11155111')
76
+
77
+ new_env = '\n'.join(env_lines)
78
+ b64 = base64.b64encode(new_env.encode()).decode()
79
+ c.exec_command(f"echo '{b64}' | base64 -d > {APP}/.env && echo 'ENV OK'")
80
+
81
+ # Kill old + start
82
+ print("\n=== Restart Gateway ===")
83
+ c.exec_command("fuser -k 3090/tcp 2>/dev/null; sleep 2", timeout=10)
84
+ c.exec_command(f"cd {APP} && nohup node dist/index.js > /tmp/gw.log 2>&1 & disown", timeout=5)
85
+ time.sleep(5)
86
+
87
+ # Verify health
88
+ stdin, stdout, stderr = c.exec_command("ss -tlnp | grep 3090 && echo '---' && curl -s http://localhost:3090/api/v1/health")
89
+ print(stdout.read().decode())
90
+
91
+ # Test MCP tools/list
92
+ print("\n=== Test MCP tools/list ===")
93
+ stdin, stdout, stderr = c.exec_command(
94
+ 'curl -s -X POST http://localhost:3090/mcp -H "Content-Type: application/json" '
95
+ '-d \'{"jsonrpc":"2.0","id":1,"method":"tools/list"}\' 2>&1 | python3 -c "import sys,json; d=json.load(sys.stdin); tools=d.get(\"result\",{}).get(\"tools\",[]); print(f\\"Tools: {len(tools)}\\"); [print(f\\" {t[\\"name\\"]}\\") for t in tools[:5]]; print(\\" ...\\" if len(tools)>5 else \\"\\")"'
96
+ )
97
+ print(stdout.read().decode())
98
+
99
+ # Test MCP tools/call (read operation)
100
+ print("\n=== Test MCP tools/call ===")
101
+ stdin, stdout, stderr = c.exec_command(
102
+ 'curl -s -X POST http://localhost:3090/mcp -H "Content-Type: application/json" '
103
+ '-d \'{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"agentx_gateway_health","arguments":{}}}\' 2>&1 | python3 -c "import sys,json; d=json.load(sys.stdin); r=d.get(\"result\",{}); c=r.get(\"content\",[]); print(json.loads(c[0][\"text\"]) if c else \\"no content\\" if not d.get(\\"error\\") else d.get(\\"error\\"))"'
104
+ )
105
+ print(stdout.read().decode())
106
+
107
+ c.close()
108
+ print("\n✅ MCP v0.1.0 deployed — http://43.156.225.164:3090/mcp")
@@ -0,0 +1,49 @@
1
+ import paramiko
2
+
3
+ pk = '0x872c3190b82d17b29bb046c9c55a7f7390c7f74bd6d592ba8d211f20f896f28e'
4
+ SEP_ARGS = '0x000000000000000000000000e94ad380d3f8d08a7590eda0c84f354a93f96e5f'
5
+ OX_ARGS = '0x000000000000000000000000bf5f9db266c8c97e3334466c88597eb758afe212'
6
+ SEP_RPC = 'https://ethereum-sepolia-rpc.publicnode.com'
7
+ OX_RPC = 'http://43.156.99.215:18545'
8
+ FMT = 'src/erc8004-extensions/A2AProtocolRegistry.sol:A2AProtocolRegistry'
9
+
10
+ c = paramiko.SSHClient()
11
+ c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
12
+ c.connect('43.156.78.59', username='ubuntu', password='Asdf1234!', timeout=30)
13
+
14
+ def run(cmd):
15
+ print(f"> {cmd[:120]}")
16
+ stdin, stdout, stderr = c.exec_command(cmd, timeout=600)
17
+ out = stdout.read().decode()
18
+ err = stderr.read().decode()
19
+ ec = stdout.channel.recv_exit_status()
20
+ if out: print(out[-500:])
21
+ if err: print("STDERR:", err[-400:])
22
+ return ec, out, err
23
+
24
+ # Ensure symlink
25
+ run("export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build/src && ln -sf erc8004-interfaces interfaces")
26
+
27
+ # Deploy Sepolia
28
+ print("\n========== SEPOLIA ==========")
29
+ ec, out, err = run(
30
+ f"export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && "
31
+ f"forge create {FMT} --rpc-url {SEP_RPC} --private-key {pk} --legacy "
32
+ f"--constructor-args {SEP_ARGS} 2>&1"
33
+ )
34
+ for line in (out + err).split('\n'):
35
+ if any(w in line for w in ['Deployed to', 'Transaction', 'Error', 'Block', 'Gas']):
36
+ print(f" {line.strip()}")
37
+
38
+ # Deploy OxaChain
39
+ print("\n========== OXACHAIN L1 ==========")
40
+ ec, out, err = run(
41
+ f"export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && "
42
+ f"forge create {FMT} --rpc-url {OX_RPC} --private-key {pk} --legacy "
43
+ f"--constructor-args {OX_ARGS} 2>&1"
44
+ )
45
+ for line in (out + err).split('\n'):
46
+ if any(w in line for w in ['Deployed to', 'Transaction', 'Error', 'Block', 'Gas']):
47
+ print(f" {line.strip()}")
48
+
49
+ c.close()