@teneo-protocol/sdk 2.2.2 → 3.0.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 (231) hide show
  1. package/.github/ISSUE_TEMPLATE/config.yml +1 -1
  2. package/CHANGELOG.md +366 -15
  3. package/CONCEPTS.md +182 -44
  4. package/README.md +524 -94
  5. package/dist/constants.d.ts +3 -1
  6. package/dist/constants.d.ts.map +1 -1
  7. package/dist/constants.js +5 -3
  8. package/dist/constants.js.map +1 -1
  9. package/dist/core/websocket-client.d.ts.map +1 -1
  10. package/dist/core/websocket-client.js +9 -5
  11. package/dist/core/websocket-client.js.map +1 -1
  12. package/dist/formatters/response-formatter.d.ts +6 -6
  13. package/dist/handlers/message-handlers/agent-details-response-handler.d.ts +1080 -756
  14. package/dist/handlers/message-handlers/agent-details-response-handler.d.ts.map +1 -1
  15. package/dist/handlers/message-handlers/agent-details-response-handler.js +2 -2
  16. package/dist/handlers/message-handlers/agent-details-response-handler.js.map +1 -1
  17. package/dist/handlers/message-handlers/agent-error-handler.d.ts +91 -0
  18. package/dist/handlers/message-handlers/agent-error-handler.d.ts.map +1 -0
  19. package/dist/handlers/message-handlers/agent-error-handler.js +44 -0
  20. package/dist/handlers/message-handlers/agent-error-handler.js.map +1 -0
  21. package/dist/handlers/message-handlers/agent-selected-handler.d.ts +6 -0
  22. package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -1
  23. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts +1080 -756
  24. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts.map +1 -1
  25. package/dist/handlers/message-handlers/agent-status-update-handler.js +2 -7
  26. package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -1
  27. package/dist/handlers/message-handlers/all-agents-response-handler.d.ts +135 -54
  28. package/dist/handlers/message-handlers/all-agents-response-handler.d.ts.map +1 -1
  29. package/dist/handlers/message-handlers/all-agents-response-handler.js +2 -2
  30. package/dist/handlers/message-handlers/all-agents-response-handler.js.map +1 -1
  31. package/dist/handlers/message-handlers/auth-error-handler.d.ts +6 -0
  32. package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -1
  33. package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -1
  34. package/dist/handlers/message-handlers/auth-message-handler.js +6 -1
  35. package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -1
  36. package/dist/handlers/message-handlers/auth-required-handler.d.ts +6 -0
  37. package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -1
  38. package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -1
  39. package/dist/handlers/message-handlers/auth-success-handler.js +6 -1
  40. package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -1
  41. package/dist/handlers/message-handlers/base-handler.d.ts +2 -1
  42. package/dist/handlers/message-handlers/base-handler.d.ts.map +1 -1
  43. package/dist/handlers/message-handlers/base-handler.js +24 -4
  44. package/dist/handlers/message-handlers/base-handler.js.map +1 -1
  45. package/dist/handlers/message-handlers/challenge-handler.d.ts +6 -0
  46. package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -1
  47. package/dist/handlers/message-handlers/error-message-handler.d.ts +6 -0
  48. package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -1
  49. package/dist/handlers/message-handlers/index.d.ts +4 -0
  50. package/dist/handlers/message-handlers/index.d.ts.map +1 -1
  51. package/dist/handlers/message-handlers/index.js +23 -1
  52. package/dist/handlers/message-handlers/index.js.map +1 -1
  53. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts +1116 -756
  54. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -1
  55. package/dist/handlers/message-handlers/list-available-agents-handler.js +23 -10
  56. package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -1
  57. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +1080 -756
  58. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts.map +1 -1
  59. package/dist/handlers/message-handlers/list-room-agents-handler.js +2 -6
  60. package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -1
  61. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
  62. package/dist/handlers/message-handlers/list-rooms-response-handler.js +2 -5
  63. package/dist/handlers/message-handlers/list-rooms-response-handler.js.map +1 -1
  64. package/dist/handlers/message-handlers/ping-pong-handler.d.ts +52 -4
  65. package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -1
  66. package/dist/handlers/message-handlers/ping-pong-handler.js +23 -4
  67. package/dist/handlers/message-handlers/ping-pong-handler.js.map +1 -1
  68. package/dist/handlers/message-handlers/rate-limit-notification-handler.d.ts.map +1 -1
  69. package/dist/handlers/message-handlers/rate-limit-notification-handler.js +3 -2
  70. package/dist/handlers/message-handlers/rate-limit-notification-handler.js.map +1 -1
  71. package/dist/handlers/message-handlers/regular-message-handler.d.ts +6 -0
  72. package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -1
  73. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +12 -6
  74. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
  75. package/dist/handlers/message-handlers/success-handler.d.ts +82 -0
  76. package/dist/handlers/message-handlers/success-handler.d.ts.map +1 -0
  77. package/dist/handlers/message-handlers/success-handler.js +24 -0
  78. package/dist/handlers/message-handlers/success-handler.js.map +1 -0
  79. package/dist/handlers/message-handlers/task-confirmed-handler.d.ts +110 -0
  80. package/dist/handlers/message-handlers/task-confirmed-handler.d.ts.map +1 -0
  81. package/dist/handlers/message-handlers/task-confirmed-handler.js +46 -0
  82. package/dist/handlers/message-handlers/task-confirmed-handler.js.map +1 -0
  83. package/dist/handlers/message-handlers/trigger-wallet-tx-handler.d.ts +244 -0
  84. package/dist/handlers/message-handlers/trigger-wallet-tx-handler.d.ts.map +1 -0
  85. package/dist/handlers/message-handlers/trigger-wallet-tx-handler.js +58 -0
  86. package/dist/handlers/message-handlers/trigger-wallet-tx-handler.js.map +1 -0
  87. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +12 -6
  88. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
  89. package/dist/handlers/message-handlers/user-authenticated-handler.js +2 -2
  90. package/dist/handlers/message-handlers/user-authenticated-handler.js.map +1 -1
  91. package/dist/handlers/message-handlers/user-count-handler.js +2 -2
  92. package/dist/handlers/message-handlers/user-count-handler.js.map +1 -1
  93. package/dist/index.d.ts +3 -3
  94. package/dist/index.d.ts.map +1 -1
  95. package/dist/index.js +11 -4
  96. package/dist/index.js.map +1 -1
  97. package/dist/managers/admin-manager.d.ts +3 -1
  98. package/dist/managers/admin-manager.d.ts.map +1 -1
  99. package/dist/managers/admin-manager.js +4 -3
  100. package/dist/managers/admin-manager.js.map +1 -1
  101. package/dist/managers/agent-room-manager.d.ts +89 -11
  102. package/dist/managers/agent-room-manager.d.ts.map +1 -1
  103. package/dist/managers/agent-room-manager.js +99 -35
  104. package/dist/managers/agent-room-manager.js.map +1 -1
  105. package/dist/managers/index.d.ts +1 -1
  106. package/dist/managers/index.d.ts.map +1 -1
  107. package/dist/managers/index.js.map +1 -1
  108. package/dist/managers/message-router.d.ts +45 -5
  109. package/dist/managers/message-router.d.ts.map +1 -1
  110. package/dist/managers/message-router.js +96 -24
  111. package/dist/managers/message-router.js.map +1 -1
  112. package/dist/managers/room-manager.d.ts +29 -7
  113. package/dist/managers/room-manager.d.ts.map +1 -1
  114. package/dist/managers/room-manager.js +37 -11
  115. package/dist/managers/room-manager.js.map +1 -1
  116. package/dist/payments/index.d.ts +3 -1
  117. package/dist/payments/index.d.ts.map +1 -1
  118. package/dist/payments/index.js +17 -3
  119. package/dist/payments/index.js.map +1 -1
  120. package/dist/payments/networks.d.ts +59 -0
  121. package/dist/payments/networks.d.ts.map +1 -0
  122. package/dist/payments/networks.js +192 -0
  123. package/dist/payments/networks.js.map +1 -0
  124. package/dist/payments/payment-client.d.ts +55 -10
  125. package/dist/payments/payment-client.d.ts.map +1 -1
  126. package/dist/payments/payment-client.js +172 -51
  127. package/dist/payments/payment-client.js.map +1 -1
  128. package/dist/teneo-sdk.d.ts +215 -41
  129. package/dist/teneo-sdk.d.ts.map +1 -1
  130. package/dist/teneo-sdk.js +361 -84
  131. package/dist/teneo-sdk.js.map +1 -1
  132. package/dist/types/config.d.ts +334 -25
  133. package/dist/types/config.d.ts.map +1 -1
  134. package/dist/types/config.js +114 -22
  135. package/dist/types/config.js.map +1 -1
  136. package/dist/types/events.d.ts +60 -14
  137. package/dist/types/events.d.ts.map +1 -1
  138. package/dist/types/events.js.map +1 -1
  139. package/dist/types/index.d.ts +1 -1
  140. package/dist/types/index.d.ts.map +1 -1
  141. package/dist/types/index.js +11 -4
  142. package/dist/types/index.js.map +1 -1
  143. package/dist/types/messages.d.ts +13110 -7451
  144. package/dist/types/messages.d.ts.map +1 -1
  145. package/dist/types/messages.js +195 -44
  146. package/dist/types/messages.js.map +1 -1
  147. package/dist/utils/pricing-resolver.d.ts +1 -1
  148. package/dist/utils/pricing-resolver.d.ts.map +1 -1
  149. package/dist/utils/pricing-resolver.js +9 -1
  150. package/dist/utils/pricing-resolver.js.map +1 -1
  151. package/examples/agent-room-management-example.ts +5 -5
  152. package/examples/basic-usage.ts +26 -6
  153. package/examples/claude-agent-x-follower/index.ts +1 -1
  154. package/examples/minimal-chat.ts +4 -3
  155. package/examples/n8n-teneo/index.ts +2 -2
  156. package/examples/nestjs-dashboard/README.md +1 -1
  157. package/examples/nestjs-dashboard/src/teneo/agents.controller.ts +3 -3
  158. package/examples/nestjs-dashboard/src/teneo/rooms.controller.ts +5 -5
  159. package/examples/nestjs-dashboard/src/teneo/teneo.service.ts +8 -8
  160. package/examples/openai-teneo/index.ts +1 -1
  161. package/examples/payment-flow.ts +143 -0
  162. package/examples/production-dashboard/README.md +6 -8
  163. package/examples/production-dashboard/server.ts +22 -10
  164. package/examples/room-management-example.ts +2 -2
  165. package/examples/usage/01-connect.ts +0 -3
  166. package/examples/usage/02-list-agents.ts +0 -2
  167. package/examples/usage/03-pick-agent.ts +3 -4
  168. package/examples/usage/04-find-by-capability.ts +10 -12
  169. package/examples/usage/05-webhook-example.ts +2 -4
  170. package/examples/usage/06-simple-api-server.ts +13 -9
  171. package/examples/usage/07-event-listener.ts +1 -13
  172. package/examples/usage/README.md +33 -7
  173. package/examples/webhook-integration.ts +9 -9
  174. package/examples/x-influencer-battle-server.ts +1 -1
  175. package/package.json +1 -1
  176. package/scripts/diagnose-connection.ts +86 -0
  177. package/scripts/investigate-payload.ts +163 -0
  178. package/scripts/list-agents.ts +58 -0
  179. package/scripts/live-multi-network-test.ts +230 -0
  180. package/src/constants.ts +5 -3
  181. package/src/core/websocket-client.ts +10 -9
  182. package/src/handlers/message-handlers/agent-details-response-handler.ts +2 -2
  183. package/src/handlers/message-handlers/agent-error-handler.ts +47 -0
  184. package/src/handlers/message-handlers/agent-status-update-handler.ts +2 -7
  185. package/src/handlers/message-handlers/all-agents-response-handler.ts +2 -2
  186. package/src/handlers/message-handlers/auth-message-handler.ts +7 -1
  187. package/src/handlers/message-handlers/auth-success-handler.ts +7 -1
  188. package/src/handlers/message-handlers/base-handler.ts +24 -4
  189. package/src/handlers/message-handlers/index.ts +24 -0
  190. package/src/handlers/message-handlers/list-available-agents-handler.ts +24 -11
  191. package/src/handlers/message-handlers/list-room-agents-handler.ts +2 -6
  192. package/src/handlers/message-handlers/list-rooms-response-handler.ts +2 -5
  193. package/src/handlers/message-handlers/ping-pong-handler.ts +29 -4
  194. package/src/handlers/message-handlers/rate-limit-notification-handler.ts +3 -2
  195. package/src/handlers/message-handlers/success-handler.ts +26 -0
  196. package/src/handlers/message-handlers/task-confirmed-handler.ts +49 -0
  197. package/src/handlers/message-handlers/trigger-wallet-tx-handler.ts +62 -0
  198. package/src/handlers/message-handlers/user-authenticated-handler.ts +2 -2
  199. package/src/handlers/message-handlers/user-count-handler.ts +2 -2
  200. package/src/index.ts +12 -4
  201. package/src/managers/admin-manager.ts +6 -3
  202. package/src/managers/agent-room-manager.ts +155 -26
  203. package/src/managers/index.ts +6 -1
  204. package/src/managers/message-router.ts +122 -27
  205. package/src/managers/room-manager.ts +39 -11
  206. package/src/payments/index.ts +20 -5
  207. package/src/payments/networks.ts +208 -0
  208. package/src/payments/payment-client.ts +211 -56
  209. package/src/teneo-sdk.ts +402 -71
  210. package/src/types/config.test.ts +24 -4
  211. package/src/types/config.ts +123 -25
  212. package/src/types/events.ts +36 -2
  213. package/src/types/index.ts +16 -3
  214. package/src/types/messages.ts +235 -60
  215. package/src/utils/pricing-resolver.ts +10 -2
  216. package/tests/direct-agent-test.ts +1 -1
  217. package/tests/integration/real-server.test.ts +1 -1
  218. package/tests/integration/websocket.test.ts +3 -3
  219. package/tests/multi-network-payment.test.ts +309 -0
  220. package/tests/multi-network.test.ts +296 -0
  221. package/tests/payment-flow-test.ts +6 -4
  222. package/tests/unit/handlers/agent-error-handler.test.ts +388 -0
  223. package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +9 -6
  224. package/tests/unit/handlers/agent-status-update-handler.test.ts +11 -16
  225. package/tests/unit/handlers/list-available-agents-handler.test.ts +11 -14
  226. package/tests/unit/handlers/list-room-agents-handler.test.ts +11 -15
  227. package/tests/unit/handlers/room-operation-response-handler.test.ts +9 -6
  228. package/tests/unit/handlers/trigger-wallet-tx-handler.test.ts +431 -0
  229. package/tests/unit/managers/admin-manager.test.ts +183 -0
  230. package/tests/unit/managers/agent-room-manager.test.ts +189 -33
  231. package/tests/unit/sdk-new-methods.test.ts +221 -0
@@ -0,0 +1,309 @@
1
+ /**
2
+ * Multi-Network Payment Tests
3
+ *
4
+ * Tests PaymentClient across PEAQ, Base, and Avalanche networks.
5
+ * Uses a test private key to create actual payment headers.
6
+ */
7
+
8
+ import { describe, it, expect, beforeAll, vi } from "vitest";
9
+ import { PaymentClient } from "../src/payments/payment-client";
10
+ import { getNetwork, NETWORKS, setNetworkConfigUrl, fetchNetworkConfigs } from "../src/payments/networks";
11
+ import { SecurePrivateKey } from "../src/utils/secure-private-key";
12
+ import { privateKeyToAccount } from "viem/accounts";
13
+
14
+ // Test private key (Hardhat default test account #0 - DO NOT use for real funds)
15
+ const TEST_PRIVATE_KEY = "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80";
16
+ const TEST_RECIPIENT = "0x1234567890123456789012345678901234567890";
17
+
18
+ // Mock network data
19
+ const mockNetworkData = {
20
+ networks: {
21
+ peaq: {
22
+ chainId: 3338,
23
+ name: "PEAQ Mainnet",
24
+ caip2: "eip155:3338",
25
+ rpcUrl: "https://peaq.network/rpc",
26
+ usdcContract: "0xbbA60da06c2c5424f03f7434542280FCAd453d10",
27
+ settlementRouter: "0xCD57f4596f70b18a0fd0c42daa4F3066d3adc8d4",
28
+ transferHook: "0xf45FA7713a58eBd0C353186F9e49A7C39a0eD34E",
29
+ eip712: {
30
+ name: "USDC",
31
+ version: "2"
32
+ }
33
+ },
34
+ base: {
35
+ chainId: 8453,
36
+ name: "Base Mainnet",
37
+ caip2: "eip155:8453",
38
+ rpcUrl: "https://mainnet.base.org",
39
+ usdcContract: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
40
+ settlementRouter: "0x73fc659Cd5494E69852bE8D9D23FE05Aab14b29B",
41
+ transferHook: "0x081258287F692D61575387ee2a4075f34dd7Aef7",
42
+ eip712: {
43
+ name: "USD Coin",
44
+ version: "2"
45
+ }
46
+ },
47
+ avalanche: {
48
+ chainId: 43114,
49
+ name: "Avalanche Mainnet",
50
+ caip2: "eip155:43114",
51
+ rpcUrl: "https://api.avax.network/ext/bc/C/rpc",
52
+ usdcContract: "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",
53
+ settlementRouter: "0xF38709cFd3f89734c231dd8E59Ff1d44caCddEe8",
54
+ transferHook: "0x6D21298950dC58a984664B12Cdf4DeBA143889aa",
55
+ eip712: {
56
+ name: "USD Coin",
57
+ version: "2"
58
+ }
59
+ }
60
+ }
61
+ };
62
+
63
+ describe("Multi-Network Payment Tests", () => {
64
+ let secureKey: SecurePrivateKey;
65
+ let walletAddress: string;
66
+
67
+ beforeAll(async () => {
68
+ // Mock global fetch
69
+ global.fetch = vi.fn(() =>
70
+ Promise.resolve({
71
+ ok: true,
72
+ json: () => Promise.resolve(mockNetworkData)
73
+ } as Response)
74
+ );
75
+
76
+ // Initialize networks before tests
77
+ setNetworkConfigUrl("https://backend.test.com/ws");
78
+ await fetchNetworkConfigs();
79
+
80
+ secureKey = new SecurePrivateKey(TEST_PRIVATE_KEY);
81
+ const account = privateKeyToAccount(TEST_PRIVATE_KEY as `0x${string}`);
82
+ walletAddress = account.address;
83
+ console.log(`Test wallet address: ${walletAddress}`);
84
+ });
85
+
86
+ describe("Network Configuration Verification", () => {
87
+ it("should have correct PEAQ configuration", () => {
88
+ const peaq = getNetwork("peaq");
89
+ expect(peaq.chainId).toBe(3338);
90
+ expect(peaq.settlementRouter).toBe("0xCD57f4596f70b18a0fd0c42daa4F3066d3adc8d4");
91
+ expect(peaq.transferHook).toBe("0xf45FA7713a58eBd0C353186F9e49A7C39a0eD34E");
92
+ expect(peaq.usdcContract).toBe("0xbbA60da06c2c5424f03f7434542280FCAd453d10");
93
+ console.log("PEAQ:", peaq);
94
+ });
95
+
96
+ it("should have correct Base configuration", () => {
97
+ const base = getNetwork("base");
98
+ expect(base.chainId).toBe(8453);
99
+ expect(base.settlementRouter).toBe("0x73fc659Cd5494E69852bE8D9D23FE05Aab14b29B");
100
+ expect(base.transferHook).toBe("0x081258287F692D61575387ee2a4075f34dd7Aef7");
101
+ expect(base.usdcContract).toBe("0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913");
102
+ console.log("Base:", base);
103
+ });
104
+
105
+ it("should have correct Avalanche configuration", () => {
106
+ const avalanche = getNetwork("avalanche");
107
+ expect(avalanche.chainId).toBe(43114);
108
+ expect(avalanche.settlementRouter).toBe("0xF38709cFd3f89734c231dd8E59Ff1d44caCddEe8");
109
+ expect(avalanche.transferHook).toBe("0x6D21298950dC58a984664B12Cdf4DeBA143889aa");
110
+ expect(avalanche.usdcContract).toBe("0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E");
111
+ console.log("Avalanche:", avalanche);
112
+ });
113
+ });
114
+
115
+ describe("PaymentClient on PEAQ", () => {
116
+ let client: PaymentClient;
117
+
118
+ beforeAll(() => {
119
+ client = new PaymentClient(secureKey, walletAddress, {
120
+ network: "peaq"
121
+ });
122
+ });
123
+
124
+ it("should create client with correct network", () => {
125
+ expect(client.network.chainId).toBe(3338);
126
+ expect(client.network.name).toBe("PEAQ Mainnet");
127
+ expect(client.caip2).toBe("eip155:3338");
128
+ });
129
+
130
+ it("should create payment header for PEAQ", async () => {
131
+ const header = await client.createPaymentHeader(
132
+ 1000000, // 1 USDC
133
+ TEST_RECIPIENT,
134
+ "https://example.com/x402"
135
+ );
136
+
137
+ expect(header).toBeDefined();
138
+ expect(typeof header).toBe("string");
139
+
140
+ // Decode and verify header structure
141
+ const decoded = JSON.parse(Buffer.from(header, "base64").toString());
142
+ expect(decoded.x402Version).toBe(2);
143
+ expect(decoded.accepted.network).toBe("eip155:3338");
144
+ expect(decoded.accepted.asset).toBe("0xbbA60da06c2c5424f03f7434542280FCAd453d10");
145
+ expect(decoded.accepted.amount).toBe("1000000");
146
+ expect(decoded.payload.authorization.from).toBe(walletAddress);
147
+ // Authorization "to" is the settlement router, not the recipient
148
+ expect(decoded.payload.authorization.to).toBe("0xCD57f4596f70b18a0fd0c42daa4F3066d3adc8d4");
149
+ // Final recipient is in accepted.payTo
150
+ expect(decoded.accepted.payTo).toBe(TEST_RECIPIENT);
151
+ console.log("PEAQ Payment Header:", JSON.stringify(decoded, null, 2));
152
+ });
153
+ });
154
+
155
+ describe("PaymentClient on Base", () => {
156
+ let client: PaymentClient;
157
+
158
+ beforeAll(() => {
159
+ client = new PaymentClient(secureKey, walletAddress, {
160
+ network: "base"
161
+ });
162
+ });
163
+
164
+ it("should create client with correct network", () => {
165
+ expect(client.network.chainId).toBe(8453);
166
+ expect(client.network.name).toBe("Base Mainnet");
167
+ expect(client.caip2).toBe("eip155:8453");
168
+ });
169
+
170
+ it("should create payment header for Base", async () => {
171
+ const header = await client.createPaymentHeader(
172
+ 500000, // 0.5 USDC
173
+ TEST_RECIPIENT,
174
+ "https://example.com/x402"
175
+ );
176
+
177
+ expect(header).toBeDefined();
178
+
179
+ const decoded = JSON.parse(Buffer.from(header, "base64").toString());
180
+ expect(decoded.x402Version).toBe(2);
181
+ expect(decoded.accepted.network).toBe("eip155:8453");
182
+ expect(decoded.accepted.asset).toBe("0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913");
183
+ expect(decoded.accepted.amount).toBe("500000");
184
+ expect(decoded.accepted.extra.name).toBe("USD Coin"); // Base USDC EIP-712 name
185
+ console.log("Base Payment Header:", JSON.stringify(decoded, null, 2));
186
+ });
187
+
188
+ it("should use correct EIP-712 domain for Base USDC", async () => {
189
+ const header = await client.createPaymentHeader(100000, TEST_RECIPIENT, "https://example.com/x402");
190
+ const decoded = JSON.parse(Buffer.from(header, "base64").toString());
191
+
192
+ // Base USDC uses "USD Coin" as the EIP-712 name
193
+ expect(decoded.accepted.extra.name).toBe("USD Coin");
194
+ expect(decoded.accepted.extra.version).toBe("2");
195
+ });
196
+ });
197
+
198
+ describe("PaymentClient on Avalanche", () => {
199
+ let client: PaymentClient;
200
+
201
+ beforeAll(() => {
202
+ client = new PaymentClient(secureKey, walletAddress, {
203
+ network: "avalanche"
204
+ });
205
+ });
206
+
207
+ it("should create client with correct network", () => {
208
+ expect(client.network.chainId).toBe(43114);
209
+ expect(client.network.name).toBe("Avalanche Mainnet");
210
+ expect(client.caip2).toBe("eip155:43114");
211
+ });
212
+
213
+ it("should create payment header for Avalanche", async () => {
214
+ const header = await client.createPaymentHeader(
215
+ 2000000, // 2 USDC
216
+ TEST_RECIPIENT,
217
+ "https://example.com/x402"
218
+ );
219
+
220
+ expect(header).toBeDefined();
221
+
222
+ const decoded = JSON.parse(Buffer.from(header, "base64").toString());
223
+ expect(decoded.x402Version).toBe(2);
224
+ expect(decoded.accepted.network).toBe("eip155:43114");
225
+ expect(decoded.accepted.asset).toBe("0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E");
226
+ expect(decoded.accepted.amount).toBe("2000000");
227
+ console.log("Avalanche Payment Header:", JSON.stringify(decoded, null, 2));
228
+ });
229
+ });
230
+
231
+ describe("Network Selection by Chain ID", () => {
232
+ it("should create client for PEAQ by chain ID 3338", () => {
233
+ const client = new PaymentClient(secureKey, walletAddress, {
234
+ networkChainId: 3338
235
+ });
236
+ expect(client.network.name).toBe("PEAQ Mainnet");
237
+ });
238
+
239
+ it("should create client for Base by chain ID 8453", () => {
240
+ const client = new PaymentClient(secureKey, walletAddress, {
241
+ networkChainId: 8453
242
+ });
243
+ expect(client.network.name).toBe("Base Mainnet");
244
+ });
245
+
246
+ it("should create client for Avalanche by chain ID 43114", () => {
247
+ const client = new PaymentClient(secureKey, walletAddress, {
248
+ networkChainId: 43114
249
+ });
250
+ expect(client.network.name).toBe("Avalanche Mainnet");
251
+ });
252
+ });
253
+
254
+ describe("Per-Request Network Override", () => {
255
+ it("should allow network override in createPaymentHeader", async () => {
256
+ // Create client for PEAQ
257
+ const client = new PaymentClient(secureKey, walletAddress, {
258
+ network: "peaq"
259
+ });
260
+ expect(client.network.chainId).toBe(3338);
261
+
262
+ // But create payment for Base
263
+ const header = await client.createPaymentHeader(
264
+ 100000,
265
+ TEST_RECIPIENT,
266
+ "https://example.com/x402",
267
+ "base" // Override to Base
268
+ );
269
+
270
+ const decoded = JSON.parse(Buffer.from(header, "base64").toString());
271
+ expect(decoded.accepted.network).toBe("eip155:8453"); // Should be Base
272
+ expect(decoded.accepted.asset).toBe("0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"); // Base USDC
273
+ });
274
+
275
+ it("should allow chain ID override in createPaymentHeader", async () => {
276
+ const client = new PaymentClient(secureKey, walletAddress, {
277
+ network: "peaq"
278
+ });
279
+
280
+ // Override by chain ID
281
+ const header = await client.createPaymentHeader(
282
+ 100000,
283
+ TEST_RECIPIENT,
284
+ "https://example.com/x402",
285
+ 43114 // Override to Avalanche by chain ID
286
+ );
287
+
288
+ const decoded = JSON.parse(Buffer.from(header, "base64").toString());
289
+ expect(decoded.accepted.network).toBe("eip155:43114"); // Should be Avalanche
290
+ });
291
+ });
292
+
293
+ describe("All Networks Summary", () => {
294
+ it("should print all network configurations", () => {
295
+ console.log("\n=== All Supported Networks ===\n");
296
+
297
+ for (const [name, config] of Object.entries(NETWORKS)) {
298
+ console.log(`${name.toUpperCase()}:`);
299
+ console.log(` Chain ID: ${config.chainId}`);
300
+ console.log(` CAIP-2: ${config.caip2}`);
301
+ console.log(` USDC: ${config.usdcContract}`);
302
+ console.log(` SettlementRouter: ${config.settlementRouter}`);
303
+ console.log(` TransferHook: ${config.transferHook}`);
304
+ console.log(` EIP-712: ${config.eip712.name} v${config.eip712.version}`);
305
+ console.log("");
306
+ }
307
+ });
308
+ });
309
+ });
@@ -0,0 +1,296 @@
1
+ /**
2
+ * Multi-Network Support Tests (v2.3.0)
3
+ *
4
+ * Tests for multi-network payment support including:
5
+ * - Network configuration lookup
6
+ * - Default network resolution
7
+ * - PaymentClient network configuration
8
+ * - SDKConfigBuilder network methods
9
+ */
10
+
11
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
12
+ import {
13
+ getNetwork,
14
+ getDefaultNetwork,
15
+ isNetworkSupported,
16
+ getSupportedNetworks,
17
+ NETWORKS,
18
+ CHAIN_ID_TO_NETWORK,
19
+ CAIP2_TO_NETWORK,
20
+ setNetworkConfigUrl,
21
+ fetchNetworkConfigs
22
+ } from "../src/payments/networks";
23
+ import { SDKConfigBuilder } from "../src/types/config";
24
+
25
+ // Mock fetch globally for all tests
26
+ const mockNetworkData = {
27
+ networks: {
28
+ peaq: {
29
+ chainId: 3338,
30
+ name: "PEAQ Mainnet",
31
+ caip2: "eip155:3338",
32
+ rpcUrl: "https://peaq.network/rpc",
33
+ usdcContract: "0xbbA60da06c2c5424f03f7434542280FCAd453d10",
34
+ settlementRouter: "0x0000000000000000000000000000000000000001",
35
+ transferHook: "0x0000000000000000000000000000000000000002",
36
+ eip712: {
37
+ name: "USDC",
38
+ version: "2"
39
+ }
40
+ },
41
+ base: {
42
+ chainId: 8453,
43
+ name: "Base Mainnet",
44
+ caip2: "eip155:8453",
45
+ rpcUrl: "https://mainnet.base.org",
46
+ usdcContract: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
47
+ settlementRouter: "0x0000000000000000000000000000000000000003",
48
+ transferHook: "0x0000000000000000000000000000000000000004",
49
+ eip712: {
50
+ name: "USD Coin",
51
+ version: "2"
52
+ }
53
+ },
54
+ avalanche: {
55
+ chainId: 43114,
56
+ name: "Avalanche Mainnet",
57
+ caip2: "eip155:43114",
58
+ rpcUrl: "https://api.avax.network/ext/bc/C/rpc",
59
+ usdcContract: "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",
60
+ settlementRouter: "0x0000000000000000000000000000000000000005",
61
+ transferHook: "0x0000000000000000000000000000000000000006",
62
+ eip712: {
63
+ name: "USD Coin",
64
+ version: "2"
65
+ }
66
+ }
67
+ }
68
+ };
69
+
70
+ describe("Multi-Network Support", () => {
71
+ beforeEach(async () => {
72
+ // Mock global fetch
73
+ global.fetch = vi.fn(() =>
74
+ Promise.resolve({
75
+ ok: true,
76
+ json: () => Promise.resolve(mockNetworkData)
77
+ } as Response)
78
+ );
79
+
80
+ // Initialize networks before each test
81
+ setNetworkConfigUrl("https://backend.test.com/ws");
82
+ await fetchNetworkConfigs();
83
+ });
84
+
85
+ afterEach(() => {
86
+ vi.restoreAllMocks();
87
+ });
88
+
89
+ describe("Network Configuration", () => {
90
+ it("should have PEAQ network configured", () => {
91
+ expect(NETWORKS.peaq).toBeDefined();
92
+ expect(NETWORKS.peaq.chainId).toBe(3338);
93
+ expect(NETWORKS.peaq.caip2).toBe("eip155:3338");
94
+ expect(NETWORKS.peaq.usdcContract).toBe("0xbbA60da06c2c5424f03f7434542280FCAd453d10");
95
+ });
96
+
97
+ it("should have Base Mainnet configured", () => {
98
+ expect(NETWORKS.base).toBeDefined();
99
+ expect(NETWORKS.base.chainId).toBe(8453);
100
+ expect(NETWORKS.base.caip2).toBe("eip155:8453");
101
+ expect(NETWORKS.base.usdcContract).toBe("0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913");
102
+ });
103
+
104
+ it("should have Avalanche Mainnet configured", () => {
105
+ expect(NETWORKS.avalanche).toBeDefined();
106
+ expect(NETWORKS.avalanche.chainId).toBe(43114);
107
+ expect(NETWORKS.avalanche.caip2).toBe("eip155:43114");
108
+ expect(NETWORKS.avalanche.usdcContract).toBe("0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E");
109
+ });
110
+
111
+ it("should have chain ID to network mapping", () => {
112
+ expect(CHAIN_ID_TO_NETWORK[3338]).toBe("peaq");
113
+ expect(CHAIN_ID_TO_NETWORK[8453]).toBe("base");
114
+ expect(CHAIN_ID_TO_NETWORK[43114]).toBe("avalanche");
115
+ });
116
+
117
+ it("should have CAIP-2 to network mapping", () => {
118
+ expect(CAIP2_TO_NETWORK["eip155:3338"]).toBe("peaq");
119
+ expect(CAIP2_TO_NETWORK["eip155:8453"]).toBe("base");
120
+ expect(CAIP2_TO_NETWORK["eip155:43114"]).toBe("avalanche");
121
+ });
122
+ });
123
+
124
+ describe("getNetwork()", () => {
125
+ it("should get network by name", () => {
126
+ const peaq = getNetwork("peaq");
127
+ expect(peaq.chainId).toBe(3338);
128
+
129
+ const base = getNetwork("base");
130
+ expect(base.chainId).toBe(8453);
131
+
132
+ const avalanche = getNetwork("avalanche");
133
+ expect(avalanche.chainId).toBe(43114);
134
+ });
135
+
136
+ it("should get network by chain ID", () => {
137
+ const peaq = getNetwork(3338);
138
+ expect(peaq.name).toBe("PEAQ Mainnet");
139
+
140
+ const base = getNetwork(8453);
141
+ expect(base.name).toBe("Base Mainnet");
142
+
143
+ const avalanche = getNetwork(43114);
144
+ expect(avalanche.name).toBe("Avalanche Mainnet");
145
+ });
146
+
147
+ it("should get network by CAIP-2 identifier", () => {
148
+ const peaq = getNetwork("eip155:3338");
149
+ expect(peaq.name).toBe("PEAQ Mainnet");
150
+
151
+ const base = getNetwork("eip155:8453");
152
+ expect(base.name).toBe("Base Mainnet");
153
+
154
+ const avalanche = getNetwork("eip155:43114");
155
+ expect(avalanche.name).toBe("Avalanche Mainnet");
156
+ });
157
+
158
+ it("should throw for unknown network name", () => {
159
+ expect(() => getNetwork("unknown")).toThrow("Unknown network: unknown");
160
+ });
161
+
162
+ it("should throw for unknown chain ID", () => {
163
+ expect(() => getNetwork(99999)).toThrow("Unknown chain ID: 99999");
164
+ });
165
+
166
+ it("should throw for unknown CAIP-2", () => {
167
+ expect(() => getNetwork("eip155:99999")).toThrow("Unknown CAIP-2 network: eip155:99999");
168
+ });
169
+
170
+ it("should be case-insensitive for network names", () => {
171
+ const peaqLower = getNetwork("peaq");
172
+ const peaqUpper = getNetwork("PEAQ");
173
+ expect(peaqLower.chainId).toBe(peaqUpper.chainId);
174
+ });
175
+ });
176
+
177
+ describe("getDefaultNetwork()", () => {
178
+ const originalEnv = process.env.TENEO_NETWORK;
179
+
180
+ afterEach(() => {
181
+ if (originalEnv === undefined) {
182
+ delete process.env.TENEO_NETWORK;
183
+ } else {
184
+ process.env.TENEO_NETWORK = originalEnv;
185
+ }
186
+ });
187
+
188
+ it("should return PEAQ as default when no env var set", () => {
189
+ delete process.env.TENEO_NETWORK;
190
+ const network = getDefaultNetwork();
191
+ expect(network.name).toBe("PEAQ Mainnet");
192
+ });
193
+
194
+ it("should use TENEO_NETWORK env var when set", () => {
195
+ process.env.TENEO_NETWORK = "base";
196
+ const network = getDefaultNetwork();
197
+ expect(network.name).toBe("Base Mainnet");
198
+ });
199
+
200
+ it("should fall back to PEAQ when env var is invalid", () => {
201
+ process.env.TENEO_NETWORK = "invalid-network";
202
+ // Mock console.warn to avoid test output noise
203
+ const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
204
+ const network = getDefaultNetwork();
205
+ expect(network.name).toBe("PEAQ Mainnet");
206
+ expect(warnSpy).toHaveBeenCalled();
207
+ warnSpy.mockRestore();
208
+ });
209
+ });
210
+
211
+ describe("isNetworkSupported()", () => {
212
+ it("should return true for supported networks by name", () => {
213
+ expect(isNetworkSupported("peaq")).toBe(true);
214
+ expect(isNetworkSupported("base")).toBe(true);
215
+ expect(isNetworkSupported("avalanche")).toBe(true);
216
+ });
217
+
218
+ it("should return true for supported networks by chain ID", () => {
219
+ expect(isNetworkSupported(3338)).toBe(true);
220
+ expect(isNetworkSupported(8453)).toBe(true);
221
+ expect(isNetworkSupported(43114)).toBe(true);
222
+ });
223
+
224
+ it("should return true for supported networks by CAIP-2", () => {
225
+ expect(isNetworkSupported("eip155:3338")).toBe(true);
226
+ expect(isNetworkSupported("eip155:8453")).toBe(true);
227
+ expect(isNetworkSupported("eip155:43114")).toBe(true);
228
+ });
229
+
230
+ it("should return false for unsupported networks", () => {
231
+ expect(isNetworkSupported("unknown")).toBe(false);
232
+ expect(isNetworkSupported(99999)).toBe(false);
233
+ expect(isNetworkSupported("eip155:99999")).toBe(false);
234
+ });
235
+ });
236
+
237
+ describe("getSupportedNetworks()", () => {
238
+ it("should return all supported network names", () => {
239
+ const networks = getSupportedNetworks();
240
+ expect(networks).toContain("peaq");
241
+ expect(networks).toContain("base");
242
+ expect(networks).toContain("avalanche");
243
+ });
244
+ });
245
+
246
+ describe("SDKConfigBuilder Network Methods", () => {
247
+ it("should support withNetwork() method", () => {
248
+ const config = new SDKConfigBuilder()
249
+ .withWebSocketUrl("wss://example.com/ws")
250
+ .withNetwork("base")
251
+ .build();
252
+
253
+ expect(config.network).toBe("base");
254
+ });
255
+
256
+ it("should support withNetworkChainId() method", () => {
257
+ const config = new SDKConfigBuilder()
258
+ .withWebSocketUrl("wss://example.com/ws")
259
+ .withNetworkChainId(8453)
260
+ .build();
261
+
262
+ expect(config.networkChainId).toBe(8453);
263
+ });
264
+
265
+ it("should support both network and networkChainId together", () => {
266
+ const config = new SDKConfigBuilder()
267
+ .withWebSocketUrl("wss://example.com/ws")
268
+ .withNetwork("base")
269
+ .withNetworkChainId(43114)
270
+ .build();
271
+
272
+ expect(config.network).toBe("base");
273
+ expect(config.networkChainId).toBe(43114);
274
+ });
275
+ });
276
+
277
+ describe("Network EIP-712 Parameters", () => {
278
+ it("should have correct EIP-712 name for PEAQ USDC", () => {
279
+ const peaq = getNetwork("peaq");
280
+ expect(peaq.eip712.name).toBe("USDC");
281
+ expect(peaq.eip712.version).toBe("2");
282
+ });
283
+
284
+ it("should have correct EIP-712 name for Base USDC", () => {
285
+ const base = getNetwork("base");
286
+ expect(base.eip712.name).toBe("USD Coin");
287
+ expect(base.eip712.version).toBe("2");
288
+ });
289
+
290
+ it("should have correct EIP-712 name for Avalanche USDC", () => {
291
+ const avalanche = getNetwork("avalanche");
292
+ expect(avalanche.eip712.name).toBe("USD Coin");
293
+ expect(avalanche.eip712.version).toBe("2");
294
+ });
295
+ });
296
+ });
@@ -48,7 +48,8 @@ async function testPaymentFlow() {
48
48
  .withLogging("info")
49
49
  .build();
50
50
 
51
- const sdk = new TeneoSDK(config);
51
+ // Increase max message size to 10MB to handle large payloads
52
+ const sdk = new TeneoSDK({ ...config, maxMessageSize: 10 * 1024 * 1024 });
52
53
 
53
54
  // Set up event listeners
54
55
  sdk.on("connection:open", () => console.log("✓ Connected"));
@@ -99,7 +100,7 @@ async function testPaymentFlow() {
99
100
  // Subscribe to test room
100
101
  console.log("Subscribing to room:", TEST_ROOM);
101
102
  try {
102
- await sdk.subscribeToRoom(TEST_ROOM);
103
+ await sdk.subscribeToPublicRoom(TEST_ROOM);
103
104
  console.log("Subscribed!\n");
104
105
  } catch {
105
106
  console.log("Room subscription skipped (private room)\n");
@@ -109,10 +110,11 @@ async function testPaymentFlow() {
109
110
  await sleep(1000);
110
111
 
111
112
  // Send test message - this will trigger quote-approve flow
113
+ // Use direct @agent command since AI coordinator is disabled
112
114
  console.log("\n=== Sending Test Request ===");
113
- console.log('Request: "get me 1 post from @elonmusk from x"\n');
115
+ console.log('Request: "@x-agent-enterprise-v2 user @elonmusk"\n');
114
116
 
115
- const response = await sdk.sendMessage("get me 1 post from @elonmusk from x", {
117
+ const response = await sdk.sendMessage("@x-agent-enterprise-v2 user @elonmusk", {
116
118
  room: TEST_ROOM,
117
119
  waitForResponse: true,
118
120
  timeout: 120000 // 2 minutes