@teneo-protocol/sdk 2.2.2 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) 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 +756 -756
  14. package/dist/handlers/message-handlers/agent-details-response-handler.js +2 -2
  15. package/dist/handlers/message-handlers/agent-details-response-handler.js.map +1 -1
  16. package/dist/handlers/message-handlers/agent-error-handler.d.ts +91 -0
  17. package/dist/handlers/message-handlers/agent-error-handler.d.ts.map +1 -0
  18. package/dist/handlers/message-handlers/agent-error-handler.js +44 -0
  19. package/dist/handlers/message-handlers/agent-error-handler.js.map +1 -0
  20. package/dist/handlers/message-handlers/agent-selected-handler.d.ts +6 -0
  21. package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -1
  22. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts +756 -756
  23. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts.map +1 -1
  24. package/dist/handlers/message-handlers/agent-status-update-handler.js +2 -7
  25. package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -1
  26. package/dist/handlers/message-handlers/all-agents-response-handler.js +2 -2
  27. package/dist/handlers/message-handlers/all-agents-response-handler.js.map +1 -1
  28. package/dist/handlers/message-handlers/auth-error-handler.d.ts +6 -0
  29. package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -1
  30. package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -1
  31. package/dist/handlers/message-handlers/auth-message-handler.js +6 -1
  32. package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -1
  33. package/dist/handlers/message-handlers/auth-required-handler.d.ts +6 -0
  34. package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -1
  35. package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -1
  36. package/dist/handlers/message-handlers/auth-success-handler.js +6 -1
  37. package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -1
  38. package/dist/handlers/message-handlers/base-handler.d.ts +2 -1
  39. package/dist/handlers/message-handlers/base-handler.d.ts.map +1 -1
  40. package/dist/handlers/message-handlers/base-handler.js +24 -4
  41. package/dist/handlers/message-handlers/base-handler.js.map +1 -1
  42. package/dist/handlers/message-handlers/challenge-handler.d.ts +6 -0
  43. package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -1
  44. package/dist/handlers/message-handlers/error-message-handler.d.ts +6 -0
  45. package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -1
  46. package/dist/handlers/message-handlers/index.d.ts +4 -0
  47. package/dist/handlers/message-handlers/index.d.ts.map +1 -1
  48. package/dist/handlers/message-handlers/index.js +23 -1
  49. package/dist/handlers/message-handlers/index.js.map +1 -1
  50. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts +792 -756
  51. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -1
  52. package/dist/handlers/message-handlers/list-available-agents-handler.js +23 -10
  53. package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -1
  54. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +756 -756
  55. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts.map +1 -1
  56. package/dist/handlers/message-handlers/list-room-agents-handler.js +2 -6
  57. package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -1
  58. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
  59. package/dist/handlers/message-handlers/list-rooms-response-handler.js +2 -5
  60. package/dist/handlers/message-handlers/list-rooms-response-handler.js.map +1 -1
  61. package/dist/handlers/message-handlers/ping-pong-handler.d.ts +52 -4
  62. package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -1
  63. package/dist/handlers/message-handlers/ping-pong-handler.js +23 -4
  64. package/dist/handlers/message-handlers/ping-pong-handler.js.map +1 -1
  65. package/dist/handlers/message-handlers/rate-limit-notification-handler.d.ts.map +1 -1
  66. package/dist/handlers/message-handlers/rate-limit-notification-handler.js +3 -2
  67. package/dist/handlers/message-handlers/rate-limit-notification-handler.js.map +1 -1
  68. package/dist/handlers/message-handlers/regular-message-handler.d.ts +6 -0
  69. package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -1
  70. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +12 -6
  71. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
  72. package/dist/handlers/message-handlers/success-handler.d.ts +82 -0
  73. package/dist/handlers/message-handlers/success-handler.d.ts.map +1 -0
  74. package/dist/handlers/message-handlers/success-handler.js +24 -0
  75. package/dist/handlers/message-handlers/success-handler.js.map +1 -0
  76. package/dist/handlers/message-handlers/task-confirmed-handler.d.ts +110 -0
  77. package/dist/handlers/message-handlers/task-confirmed-handler.d.ts.map +1 -0
  78. package/dist/handlers/message-handlers/task-confirmed-handler.js +46 -0
  79. package/dist/handlers/message-handlers/task-confirmed-handler.js.map +1 -0
  80. package/dist/handlers/message-handlers/trigger-wallet-tx-handler.d.ts +244 -0
  81. package/dist/handlers/message-handlers/trigger-wallet-tx-handler.d.ts.map +1 -0
  82. package/dist/handlers/message-handlers/trigger-wallet-tx-handler.js +58 -0
  83. package/dist/handlers/message-handlers/trigger-wallet-tx-handler.js.map +1 -0
  84. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +12 -6
  85. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
  86. package/dist/handlers/message-handlers/user-authenticated-handler.js +2 -2
  87. package/dist/handlers/message-handlers/user-authenticated-handler.js.map +1 -1
  88. package/dist/handlers/message-handlers/user-count-handler.js +2 -2
  89. package/dist/handlers/message-handlers/user-count-handler.js.map +1 -1
  90. package/dist/index.d.ts +3 -3
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +11 -4
  93. package/dist/index.js.map +1 -1
  94. package/dist/managers/admin-manager.d.ts +2 -0
  95. package/dist/managers/admin-manager.d.ts.map +1 -1
  96. package/dist/managers/admin-manager.js +3 -2
  97. package/dist/managers/admin-manager.js.map +1 -1
  98. package/dist/managers/agent-room-manager.d.ts +89 -11
  99. package/dist/managers/agent-room-manager.d.ts.map +1 -1
  100. package/dist/managers/agent-room-manager.js +99 -35
  101. package/dist/managers/agent-room-manager.js.map +1 -1
  102. package/dist/managers/index.d.ts +1 -1
  103. package/dist/managers/index.d.ts.map +1 -1
  104. package/dist/managers/index.js.map +1 -1
  105. package/dist/managers/message-router.d.ts +45 -5
  106. package/dist/managers/message-router.d.ts.map +1 -1
  107. package/dist/managers/message-router.js +96 -24
  108. package/dist/managers/message-router.js.map +1 -1
  109. package/dist/managers/room-manager.d.ts +29 -7
  110. package/dist/managers/room-manager.d.ts.map +1 -1
  111. package/dist/managers/room-manager.js +37 -11
  112. package/dist/managers/room-manager.js.map +1 -1
  113. package/dist/payments/index.d.ts +3 -1
  114. package/dist/payments/index.d.ts.map +1 -1
  115. package/dist/payments/index.js +17 -3
  116. package/dist/payments/index.js.map +1 -1
  117. package/dist/payments/networks.d.ts +59 -0
  118. package/dist/payments/networks.d.ts.map +1 -0
  119. package/dist/payments/networks.js +192 -0
  120. package/dist/payments/networks.js.map +1 -0
  121. package/dist/payments/payment-client.d.ts +55 -10
  122. package/dist/payments/payment-client.d.ts.map +1 -1
  123. package/dist/payments/payment-client.js +172 -51
  124. package/dist/payments/payment-client.js.map +1 -1
  125. package/dist/teneo-sdk.d.ts +214 -40
  126. package/dist/teneo-sdk.d.ts.map +1 -1
  127. package/dist/teneo-sdk.js +360 -83
  128. package/dist/teneo-sdk.js.map +1 -1
  129. package/dist/types/config.d.ts +334 -25
  130. package/dist/types/config.d.ts.map +1 -1
  131. package/dist/types/config.js +114 -22
  132. package/dist/types/config.js.map +1 -1
  133. package/dist/types/events.d.ts +60 -14
  134. package/dist/types/events.d.ts.map +1 -1
  135. package/dist/types/events.js.map +1 -1
  136. package/dist/types/index.d.ts +1 -1
  137. package/dist/types/index.d.ts.map +1 -1
  138. package/dist/types/index.js +11 -4
  139. package/dist/types/index.js.map +1 -1
  140. package/dist/types/messages.d.ts +9801 -7222
  141. package/dist/types/messages.d.ts.map +1 -1
  142. package/dist/types/messages.js +180 -40
  143. package/dist/types/messages.js.map +1 -1
  144. package/dist/utils/pricing-resolver.d.ts +1 -1
  145. package/dist/utils/pricing-resolver.d.ts.map +1 -1
  146. package/dist/utils/pricing-resolver.js +9 -1
  147. package/dist/utils/pricing-resolver.js.map +1 -1
  148. package/examples/agent-room-management-example.ts +5 -5
  149. package/examples/basic-usage.ts +26 -6
  150. package/examples/claude-agent-x-follower/index.ts +1 -1
  151. package/examples/minimal-chat.ts +4 -3
  152. package/examples/n8n-teneo/index.ts +2 -2
  153. package/examples/nestjs-dashboard/README.md +1 -1
  154. package/examples/nestjs-dashboard/src/teneo/agents.controller.ts +3 -3
  155. package/examples/nestjs-dashboard/src/teneo/rooms.controller.ts +5 -5
  156. package/examples/nestjs-dashboard/src/teneo/teneo.service.ts +8 -8
  157. package/examples/openai-teneo/index.ts +1 -1
  158. package/examples/payment-flow.ts +143 -0
  159. package/examples/production-dashboard/README.md +6 -8
  160. package/examples/production-dashboard/server.ts +22 -10
  161. package/examples/room-management-example.ts +2 -2
  162. package/examples/usage/01-connect.ts +0 -3
  163. package/examples/usage/02-list-agents.ts +0 -2
  164. package/examples/usage/03-pick-agent.ts +3 -4
  165. package/examples/usage/04-find-by-capability.ts +10 -12
  166. package/examples/usage/05-webhook-example.ts +2 -4
  167. package/examples/usage/06-simple-api-server.ts +13 -9
  168. package/examples/usage/07-event-listener.ts +1 -13
  169. package/examples/usage/README.md +33 -7
  170. package/examples/webhook-integration.ts +9 -9
  171. package/examples/x-influencer-battle-server.ts +1 -1
  172. package/package.json +1 -1
  173. package/scripts/diagnose-connection.ts +86 -0
  174. package/scripts/investigate-payload.ts +163 -0
  175. package/scripts/list-agents.ts +58 -0
  176. package/scripts/live-multi-network-test.ts +230 -0
  177. package/src/constants.ts +5 -3
  178. package/src/core/websocket-client.ts +10 -9
  179. package/src/handlers/message-handlers/agent-details-response-handler.ts +2 -2
  180. package/src/handlers/message-handlers/agent-error-handler.ts +47 -0
  181. package/src/handlers/message-handlers/agent-status-update-handler.ts +2 -7
  182. package/src/handlers/message-handlers/all-agents-response-handler.ts +2 -2
  183. package/src/handlers/message-handlers/auth-message-handler.ts +7 -1
  184. package/src/handlers/message-handlers/auth-success-handler.ts +7 -1
  185. package/src/handlers/message-handlers/base-handler.ts +24 -4
  186. package/src/handlers/message-handlers/index.ts +24 -0
  187. package/src/handlers/message-handlers/list-available-agents-handler.ts +24 -11
  188. package/src/handlers/message-handlers/list-room-agents-handler.ts +2 -6
  189. package/src/handlers/message-handlers/list-rooms-response-handler.ts +2 -5
  190. package/src/handlers/message-handlers/ping-pong-handler.ts +29 -4
  191. package/src/handlers/message-handlers/rate-limit-notification-handler.ts +3 -2
  192. package/src/handlers/message-handlers/success-handler.ts +26 -0
  193. package/src/handlers/message-handlers/task-confirmed-handler.ts +49 -0
  194. package/src/handlers/message-handlers/trigger-wallet-tx-handler.ts +62 -0
  195. package/src/handlers/message-handlers/user-authenticated-handler.ts +2 -2
  196. package/src/handlers/message-handlers/user-count-handler.ts +2 -2
  197. package/src/index.ts +12 -4
  198. package/src/managers/admin-manager.ts +5 -2
  199. package/src/managers/agent-room-manager.ts +155 -26
  200. package/src/managers/index.ts +6 -1
  201. package/src/managers/message-router.ts +122 -27
  202. package/src/managers/room-manager.ts +39 -11
  203. package/src/payments/index.ts +20 -5
  204. package/src/payments/networks.ts +208 -0
  205. package/src/payments/payment-client.ts +211 -56
  206. package/src/teneo-sdk.ts +401 -70
  207. package/src/types/config.test.ts +24 -4
  208. package/src/types/config.ts +123 -25
  209. package/src/types/events.ts +36 -2
  210. package/src/types/index.ts +16 -3
  211. package/src/types/messages.ts +221 -57
  212. package/src/utils/pricing-resolver.ts +10 -2
  213. package/tests/direct-agent-test.ts +1 -1
  214. package/tests/integration/real-server.test.ts +1 -1
  215. package/tests/integration/websocket.test.ts +3 -3
  216. package/tests/multi-network-payment.test.ts +309 -0
  217. package/tests/multi-network.test.ts +296 -0
  218. package/tests/payment-flow-test.ts +6 -4
  219. package/tests/unit/handlers/agent-error-handler.test.ts +388 -0
  220. package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +9 -6
  221. package/tests/unit/handlers/agent-status-update-handler.test.ts +11 -16
  222. package/tests/unit/handlers/list-available-agents-handler.test.ts +11 -14
  223. package/tests/unit/handlers/list-room-agents-handler.test.ts +11 -15
  224. package/tests/unit/handlers/room-operation-response-handler.test.ts +9 -6
  225. package/tests/unit/handlers/trigger-wallet-tx-handler.test.ts +431 -0
  226. package/tests/unit/managers/admin-manager.test.ts +183 -0
  227. package/tests/unit/managers/agent-room-manager.test.ts +189 -33
  228. package/tests/unit/sdk-new-methods.test.ts +221 -0
@@ -68,10 +68,12 @@ export const MessageTypeSchema = z.enum([
68
68
  "request_task",
69
69
  "task_quote",
70
70
  "confirm_task",
71
+ "task_confirmed",
71
72
 
72
73
  // System
73
74
  "agents",
74
75
  "error",
76
+ "success",
75
77
  "ping",
76
78
  "pong",
77
79
  "capabilities",
@@ -109,9 +111,8 @@ export const MessageTypeSchema = z.enum([
109
111
  "room_agents_response",
110
112
  "available_agents_response",
111
113
 
112
- // Room Ping System (2 types)
114
+ // Room Ping System (1 type - pong reuses "pong" type with room data)
113
115
  "room_ping",
114
- "room_pong",
115
116
 
116
117
  // Admin Messages (7 types)
117
118
  "list_all_agents",
@@ -124,7 +125,17 @@ export const MessageTypeSchema = z.enum([
124
125
 
125
126
  // User Preferences (2 types)
126
127
  "set_user_preferences",
127
- "user_preferences_updated"
128
+ "user_preferences_updated",
129
+
130
+ // API Key Preferences
131
+ "set_api_key_preference",
132
+
133
+ // Agent Error
134
+ "agent_error",
135
+
136
+ // Wallet Transaction Flow
137
+ "trigger_wallet_tx",
138
+ "tx_result"
128
139
  ]);
129
140
 
130
141
  export const ContentTypeSchema = z.enum([
@@ -151,20 +162,31 @@ export const CapabilitySchema = z.object({
151
162
  description: z.string().optional()
152
163
  });
153
164
 
165
+ // Command pricing fields — flat on the command object, matching server Go struct.
166
+ // Kept as a standalone schema for use by pricing-resolver.
154
167
  export const CommandPricingSchema = z.object({
155
168
  priceType: z.string().optional(),
156
169
  pricePerUnit: z.number().optional(),
157
170
  taskUnit: z.string().optional(),
158
- timeUnit: z.enum(["hour", "day"]).optional()
171
+ timeUnit: z.enum(["second", "minute", "hour"]).optional()
159
172
  });
160
173
 
161
174
  export type CommandPricing = z.infer<typeof CommandPricingSchema>;
162
175
 
176
+ // Command schema — pricing fields are flat (not nested), matching server Go struct.
163
177
  export const CommandSchema = z.object({
164
178
  trigger: z.string(),
165
179
  argument: z.string().optional(),
166
180
  description: z.string().optional(),
167
- pricing: CommandPricingSchema.optional()
181
+ // Pricing fields (flat, matching server Command struct)
182
+ pricePerUnit: z.number().optional(),
183
+ priceType: z.string().optional(),
184
+ taskUnit: z.string().optional(),
185
+ timeUnit: z.enum(["second", "minute", "hour"]).optional(),
186
+ // Extended fields from server
187
+ hasVariants: z.boolean().optional(),
188
+ variants: z.array(z.any()).optional(),
189
+ parameters: z.array(z.any()).optional()
168
190
  });
169
191
 
170
192
  export const RoomSchema = z.object({
@@ -193,20 +215,30 @@ export const RoomInfoSchema = z
193
215
  })
194
216
  .passthrough(); // Allow extra fields backend might add
195
217
 
196
- export const AgentSchema = z.object({
197
- id: z.string(),
198
- name: z.string(),
199
- description: z.string().optional(),
200
- room: z.string().optional(),
201
- capabilities: z.array(CapabilitySchema).optional(),
202
- commands: z.array(CommandSchema).optional(),
203
- status: AgentStatusSchema,
204
- image: z.string().optional(),
205
- agentType: AgentTypeSchema.optional(),
206
- nlpFallback: stringToBoolean.optional(),
207
- webhookUrl: z.string().url().optional(),
208
- categories: z.array(AgentCategorySchema).max(MAX_CATEGORIES).optional()
209
- });
218
+ export const AgentSchema = z
219
+ .object({
220
+ id: z.string(),
221
+ name: z.string(),
222
+ description: z.string().optional(),
223
+ room: z.string().optional(),
224
+ rooms: z.array(z.string()).optional(), // Server sends plural rooms array
225
+ capabilities: z.array(CapabilitySchema).optional(),
226
+ commands: z.array(CommandSchema).optional(),
227
+ status: AgentStatusSchema,
228
+ image: z.string().optional(),
229
+ // Accept both server field names and SDK field names
230
+ type: AgentTypeSchema.optional(), // server sends "type"
231
+ agentType: AgentTypeSchema.optional(), // SDK alias
232
+ nlp_fallback: stringToBoolean.optional(), // server sends "nlp_fallback"
233
+ nlpFallback: stringToBoolean.optional(), // SDK alias
234
+ webhookUrl: z.string().url().optional(),
235
+ categories: z.array(AgentCategorySchema).max(MAX_CATEGORIES).optional()
236
+ })
237
+ .transform((data) => ({
238
+ ...data,
239
+ agentType: data.agentType ?? data.type,
240
+ nlpFallback: data.nlpFallback ?? data.nlp_fallback
241
+ }));
210
242
 
211
243
  // Base message schema
212
244
  export const BaseMessageSchema = z
@@ -223,7 +255,9 @@ export const BaseMessageSchema = z
223
255
  publicKey: z.string().optional(),
224
256
  reasoning: z.string().optional(),
225
257
  task_id: z.string().optional(),
226
- id: z.string().optional() // Added for message tracking
258
+ id: z.string().optional(), // Added for message tracking
259
+ payment: z.string().optional(), // x402 payment payload
260
+ request_id: z.string().optional() // Request-response correlation
227
261
  })
228
262
  .passthrough(); // Allow message-specific fields to pass through
229
263
 
@@ -247,7 +281,8 @@ export const ChallengeMessageSchema = BaseMessageSchema.extend({
247
281
  export const CheckCachedAuthMessageSchema = BaseMessageSchema.extend({
248
282
  type: z.literal("check_cached_auth"),
249
283
  data: z.object({
250
- address: z.string()
284
+ address: z.string(),
285
+ session_token: z.string().optional() // 64-char hex token for fast re-auth (24h validity)
251
286
  })
252
287
  });
253
288
 
@@ -282,7 +317,12 @@ export const AuthMessageSchema = BaseMessageSchema.extend({
282
317
  private_rooms: z.array(RoomSchema).optional(),
283
318
  private_room_id: z.string().optional(),
284
319
  cached_auth: stringToBoolean.optional(),
285
- max_private_rooms: z.number().optional()
320
+ max_private_rooms: z.number().optional(),
321
+ // Auth enhancement fields (audit #6, #7, #9)
322
+ jwt_token: z.string().optional(), // JWT token for KeyVault API authentication
323
+ session_token: z.string().optional(), // 64-char hex token for fast re-auth (24h validity)
324
+ whitelist_verified: z.union([z.boolean(), z.string()]).optional(), // Whitelist verification status
325
+ user_count: z.number().optional() // Total user count (admin only)
286
326
  })
287
327
  .optional()
288
328
  });
@@ -299,7 +339,12 @@ export const AuthSuccessMessageSchema = BaseMessageSchema.extend({
299
339
  rooms: z.array(RoomInfoSchema).optional().nullable(), // v2.0.0: Uses RoomInfo with is_owner field
300
340
  private_room_id: z.string().optional(), // DEPRECATED: Use rooms array instead
301
341
  cached_auth: stringToBoolean.optional(), // Admin field, optional
302
- max_private_rooms: z.number().optional() // NEW in v2.0.0: Max rooms user can create
342
+ max_private_rooms: z.number().optional(), // NEW in v2.0.0: Max rooms user can create
343
+ // Auth enhancement fields (audit #6, #7, #9)
344
+ jwt_token: z.string().optional(), // JWT token for KeyVault API authentication
345
+ session_token: z.string().optional(), // 64-char hex token for fast re-auth (24h validity)
346
+ whitelist_verified: z.union([z.boolean(), z.string()]).optional(), // Whitelist verification status
347
+ user_count: z.number().optional() // Total user count (admin only)
303
348
  })
304
349
  });
305
350
 
@@ -396,6 +441,8 @@ export const PricingInfoSchema = z
396
441
  price_per_unit: z.number().optional(),
397
442
  priceType: z.string().optional(),
398
443
  price_type: z.string().optional(),
444
+ taskUnit: z.string().optional(),
445
+ task_unit: z.string().optional(),
399
446
  timeUnit: z.string().optional(),
400
447
  time_unit: z.string().optional(),
401
448
  currency: z.string().optional().default("USDC"),
@@ -405,6 +452,7 @@ export const PricingInfoSchema = z
405
452
  // Normalize to camelCase
406
453
  pricePerUnit: data.pricePerUnit ?? data.price_per_unit ?? 0,
407
454
  priceType: data.priceType ?? data.price_type,
455
+ taskUnit: data.taskUnit ?? data.task_unit,
408
456
  timeUnit: data.timeUnit ?? data.time_unit,
409
457
  currency: data.currency,
410
458
  network: data.network
@@ -414,22 +462,37 @@ export const PricingInfoSchema = z
414
462
  export const RequestTaskMessageSchema = BaseMessageSchema.extend({
415
463
  type: z.literal("request_task"),
416
464
  content: z.string(),
417
- room: z.string()
465
+ room: z.string(),
466
+ data: z
467
+ .object({
468
+ network: z.string().optional() // Payment network (peaq, base, avalanche)
469
+ })
470
+ .optional()
418
471
  });
419
472
 
420
473
  // Task quote message (server response with pricing)
421
474
  export const TaskQuoteMessageSchema = BaseMessageSchema.extend({
422
475
  type: z.literal("task_quote"),
423
476
  from: z.literal("coordinator"),
424
- data: z.object({
425
- task_id: z.string(),
426
- agent_id: z.string(),
427
- agent_name: z.string(),
428
- agent_wallet: z.string(),
429
- command: z.string(),
430
- pricing: PricingInfoSchema,
431
- expires_at: z.string()
432
- })
477
+ data: z
478
+ .object({
479
+ task_id: z.string(),
480
+ agent_id: z.string(),
481
+ agent_name: z.string(),
482
+ agent_wallet: z.string(),
483
+ command: z.string(),
484
+ pricing: PricingInfoSchema,
485
+ expires_at: z.string(),
486
+ // v2.5 Settlement Router fields for x402x-router-settlement extension
487
+ settlement_router: z.string(),
488
+ salt: z.string(),
489
+ facilitator_fee: z.string(),
490
+ hook: z.string(),
491
+ hook_data: z.string().optional().default("0x"),
492
+ // Request correlation
493
+ client_request_id: z.string().optional()
494
+ })
495
+ .passthrough()
433
496
  });
434
497
 
435
498
  // Confirm task message (with payment at top level - backend expects msg.payment)
@@ -441,6 +504,22 @@ export const ConfirmTaskMessageSchema = BaseMessageSchema.extend({
441
504
  payment: z.string().optional() // x402 payment at top level (backend checks msg.Payment)
442
505
  });
443
506
 
507
+ // Task confirmed message (server acknowledgment after confirm_task)
508
+ export const TaskConfirmedMessageSchema = BaseMessageSchema.extend({
509
+ type: z.literal("task_confirmed"),
510
+ data: z
511
+ .object({
512
+ task_id: z.string(),
513
+ agent_id: z.string().optional(),
514
+ agent_name: z.string().optional(),
515
+ client_request_id: z.string().optional()
516
+ })
517
+ .passthrough()
518
+ .optional()
519
+ });
520
+
521
+ export type TaskConfirmedMessage = z.infer<typeof TaskConfirmedMessageSchema>;
522
+
444
523
  // System message schemas
445
524
  export const AgentsListMessageSchema = BaseMessageSchema.extend({
446
525
  type: z.literal("agents"),
@@ -459,12 +538,38 @@ export const ErrorMessageSchema = BaseMessageSchema.extend({
459
538
  })
460
539
  });
461
540
 
541
+ export const SuccessMessageSchema = BaseMessageSchema.extend({
542
+ type: z.literal("success"),
543
+ content: z.string().optional(),
544
+ from: z.literal("system").optional(),
545
+ data: z
546
+ .object({
547
+ content: z.string().optional()
548
+ })
549
+ .passthrough()
550
+ .optional()
551
+ }).passthrough();
552
+
462
553
  export const PingMessageSchema = BaseMessageSchema.extend({
463
554
  type: z.literal("ping")
464
555
  });
465
556
 
466
557
  export const PongMessageSchema = BaseMessageSchema.extend({
467
- type: z.literal("pong")
558
+ type: z.literal("pong"),
559
+ data: z
560
+ .union([
561
+ // Regular pong (no data)
562
+ z.undefined(),
563
+ // Room pong (with room data)
564
+ z
565
+ .object({
566
+ room_id: z.string(),
567
+ live_count: z.number().optional(),
568
+ timestamp: z.string()
569
+ })
570
+ .passthrough()
571
+ ])
572
+ .optional()
468
573
  });
469
574
 
470
575
  // Room subscription schemas
@@ -636,7 +741,15 @@ export const AgentRoomInfoSchema = z
636
741
  status: z.string().optional(),
637
742
  added_by: z.string().optional(),
638
743
  added_at: z.string().optional(),
639
- categories: z.array(AgentCategorySchema).max(MAX_CATEGORIES).optional()
744
+ categories: z.array(AgentCategorySchema).max(MAX_CATEGORIES).optional(),
745
+ // Server-sent typed fields
746
+ type: AgentTypeSchema.optional(),
747
+ nlp_fallback: z.union([z.boolean(), z.string()]).optional(),
748
+ is_verified: z.boolean().optional(),
749
+ is_public: z.boolean().optional(),
750
+ created_at: z.string().optional(),
751
+ creator: z.string().optional(),
752
+ is_banned: z.boolean().optional()
640
753
  })
641
754
  .passthrough();
642
755
 
@@ -687,7 +800,11 @@ export const AvailableAgentsResponseSchema = z
687
800
  type: z.literal("available_agents_response"),
688
801
  data: z
689
802
  .object({
690
- agents: z.array(AgentRoomInfoSchema).optional()
803
+ agents: z.array(AgentRoomInfoSchema).optional(),
804
+ total: z.number().optional(),
805
+ offset: z.number().optional(),
806
+ limit: z.number().optional(),
807
+ has_more: z.boolean().optional()
691
808
  })
692
809
  .passthrough()
693
810
  })
@@ -730,18 +847,8 @@ export const RoomPingMessageSchema = z
730
847
  })
731
848
  .passthrough();
732
849
 
733
- export const RoomPongResponseSchema = z
734
- .object({
735
- type: z.literal("room_pong"),
736
- data: z
737
- .object({
738
- room_id: z.string(),
739
- live_count: z.number().optional(), // Optional - consuming code should handle missing as 0
740
- timestamp: z.string()
741
- })
742
- .passthrough()
743
- })
744
- .passthrough();
850
+ // Note: RoomPong reuses the "pong" message type with room data in the data field
851
+ // The PongHandler checks for room_id in data to distinguish room pong from regular pong
745
852
 
746
853
  // Admin agent info (admin only)
747
854
  export const AdminAgentInfoSchema = z
@@ -908,6 +1015,46 @@ export const UserPreferencesUpdatedMessageSchema = z
908
1015
  export type UserPreferencesUpdatedData = z.infer<typeof UserPreferencesUpdatedDataSchema>;
909
1016
  export type UserPreferencesUpdatedMessage = z.infer<typeof UserPreferencesUpdatedMessageSchema>;
910
1017
 
1018
+ // Agent Error message (server → client, when an agent fails)
1019
+ export const AgentErrorMessageSchema = BaseMessageSchema.extend({
1020
+ type: z.literal("agent_error"),
1021
+ content: z.string().optional(),
1022
+ from: z.string().optional(),
1023
+ data: z
1024
+ .object({
1025
+ task_id: z.string().optional(),
1026
+ client_request_id: z.string().optional()
1027
+ })
1028
+ .passthrough()
1029
+ .optional()
1030
+ });
1031
+
1032
+ export type AgentErrorMessage = z.infer<typeof AgentErrorMessageSchema>;
1033
+
1034
+ // Wallet Transaction schemas
1035
+ export const TxResultStatusSchema = z.enum(["confirmed", "rejected", "failed"]);
1036
+ export type TxResultStatus = z.infer<typeof TxResultStatusSchema>;
1037
+
1038
+ export const TriggerWalletTxMessageSchema = BaseMessageSchema.extend({
1039
+ type: z.literal("trigger_wallet_tx"),
1040
+ from: z.string().optional(),
1041
+ data: z
1042
+ .object({
1043
+ task_id: z.string(),
1044
+ tx: z.object({
1045
+ to: z.string(),
1046
+ value: z.string(),
1047
+ data: z.string().optional(),
1048
+ chainId: z.number()
1049
+ }),
1050
+ description: z.string().optional(),
1051
+ optional: z.boolean().optional()
1052
+ })
1053
+ .passthrough()
1054
+ });
1055
+
1056
+ export type TriggerWalletTxMessage = z.infer<typeof TriggerWalletTxMessageSchema>;
1057
+
911
1058
  // Union of all INCOMING message schemas for validation
912
1059
  // Note: Outgoing message schemas (Subscribe, Unsubscribe, ListRooms) are excluded
913
1060
  // as they share the same type values with their response counterparts
@@ -932,9 +1079,11 @@ export const AnyMessageSchema = z.discriminatedUnion("type", [
932
1079
 
933
1080
  // Quote-Approve Flow (v2.2.0)
934
1081
  TaskQuoteMessageSchema,
1082
+ TaskConfirmedMessageSchema,
935
1083
 
936
1084
  // System
937
1085
  ErrorMessageSchema,
1086
+ SuccessMessageSchema,
938
1087
  PingMessageSchema,
939
1088
  PongMessageSchema,
940
1089
 
@@ -954,9 +1103,6 @@ export const AnyMessageSchema = z.discriminatedUnion("type", [
954
1103
  AvailableAgentsResponseSchema,
955
1104
  AgentStatusUpdateMessageSchema,
956
1105
 
957
- // Room Ping System (v2.0.0)
958
- RoomPongResponseSchema,
959
-
960
1106
  // Admin Messages
961
1107
  AllAgentsResponseSchema,
962
1108
  UserCountMessageSchema,
@@ -965,7 +1111,13 @@ export const AnyMessageSchema = z.discriminatedUnion("type", [
965
1111
  AgentDetailsResponseMessageSchema,
966
1112
 
967
1113
  // User Preferences
968
- UserPreferencesUpdatedMessageSchema
1114
+ UserPreferencesUpdatedMessageSchema,
1115
+
1116
+ // Agent Error
1117
+ AgentErrorMessageSchema,
1118
+
1119
+ // Wallet Transaction
1120
+ TriggerWalletTxMessageSchema
969
1121
  ]);
970
1122
 
971
1123
  // Type inference from schemas
@@ -1003,6 +1155,7 @@ export type TaskQuoteMessage = z.infer<typeof TaskQuoteMessageSchema>;
1003
1155
  export type ConfirmTaskMessage = z.infer<typeof ConfirmTaskMessageSchema>;
1004
1156
 
1005
1157
  export type ErrorMessage = z.infer<typeof ErrorMessageSchema>;
1158
+ export type SuccessMessage = z.infer<typeof SuccessMessageSchema>;
1006
1159
  export type PingMessage = z.infer<typeof PingMessageSchema>;
1007
1160
  export type PongMessage = z.infer<typeof PongMessageSchema>;
1008
1161
  export type SubscribeMessage = z.infer<typeof SubscribeMessageSchema>;
@@ -1038,7 +1191,7 @@ export type AgentStatusUpdateMessage = z.infer<typeof AgentStatusUpdateMessageSc
1038
1191
 
1039
1192
  // Room Ping Types (v2.0.0)
1040
1193
  export type RoomPingMessage = z.infer<typeof RoomPingMessageSchema>;
1041
- export type RoomPongResponse = z.infer<typeof RoomPongResponseSchema>;
1194
+ // Note: Room pong responses use the PongMessage type with room data
1042
1195
 
1043
1196
  export type AnyMessage = z.infer<typeof AnyMessageSchema>;
1044
1197
 
@@ -1089,10 +1242,16 @@ export function createRequestChallenge(
1089
1242
  });
1090
1243
  }
1091
1244
 
1092
- export function createCheckCachedAuth(address: string): CheckCachedAuthMessage {
1245
+ export function createCheckCachedAuth(
1246
+ address: string,
1247
+ sessionToken?: string
1248
+ ): CheckCachedAuthMessage {
1093
1249
  return CheckCachedAuthMessageSchema.parse({
1094
1250
  type: "check_cached_auth",
1095
- data: { address }
1251
+ data: {
1252
+ address,
1253
+ ...(sessionToken && { session_token: sessionToken })
1254
+ }
1096
1255
  });
1097
1256
  }
1098
1257
 
@@ -1149,11 +1308,16 @@ export function createListRooms(): ListRoomsMessage {
1149
1308
  }
1150
1309
 
1151
1310
  // Quote-Approve Flow factory functions (v2.2.0)
1152
- export function createRequestTask(content: string, room: string): RequestTaskMessage {
1311
+ export function createRequestTask(
1312
+ content: string,
1313
+ room: string,
1314
+ network?: string
1315
+ ): RequestTaskMessage {
1153
1316
  return RequestTaskMessageSchema.parse({
1154
1317
  type: "request_task",
1155
1318
  content,
1156
- room
1319
+ room,
1320
+ ...(network && { data: { network } })
1157
1321
  });
1158
1322
  }
1159
1323
 
@@ -7,7 +7,7 @@ export interface ResolvedPricing {
7
7
  pricePerUnit: number;
8
8
  priceType: PriceType;
9
9
  taskUnit?: string;
10
- timeUnit?: "hour" | "day";
10
+ timeUnit?: "second" | "minute" | "hour";
11
11
  totalPrice: number;
12
12
  itemCount?: number;
13
13
  duration?: number;
@@ -40,7 +40,15 @@ export function resolveAgentPricing(
40
40
  const command = agent.commands.find(
41
41
  (cmd) => cmd.trigger.toLowerCase() === commandTrigger.toLowerCase()
42
42
  );
43
- pricing = command?.pricing;
43
+ // Command pricing fields are flat on the command object
44
+ if (command) {
45
+ pricing = {
46
+ pricePerUnit: command.pricePerUnit,
47
+ priceType: command.priceType,
48
+ taskUnit: command.taskUnit,
49
+ timeUnit: command.timeUnit
50
+ };
51
+ }
44
52
  }
45
53
 
46
54
  if (!pricing) {
@@ -101,7 +101,7 @@ async function testDirectAgentCommand() {
101
101
  // Subscribe to test room
102
102
  console.log("Subscribing to room:", TEST_ROOM);
103
103
  try {
104
- await sdk.subscribeToRoom(TEST_ROOM);
104
+ await sdk.subscribeToPublicRoom(TEST_ROOM);
105
105
  console.log("Subscribed!\n");
106
106
  } catch {
107
107
  console.log("Room subscription skipped (private room)\n");
@@ -614,7 +614,7 @@ describe.skipIf(!hasCredentials)("Real Teneo Server Integration Test", () => {
614
614
  if (rooms.length > 0) {
615
615
  const testRoom = rooms[0];
616
616
 
617
- await sdk.subscribeToRoom(testRoom.id);
617
+ await sdk.subscribeToPublicRoom(testRoom.id);
618
618
  expect(sdk.getSubscribedRooms()).toContain(testRoom.id);
619
619
 
620
620
  console.log(`Subscribed to room: ${testRoom.name} (${testRoom.id})`);
@@ -150,7 +150,7 @@ describe("WebSocket Integration Tests", () => {
150
150
  .withWebSocketUrl(`ws://localhost:${serverPort}`)
151
151
  .withAuthentication(privateKey)
152
152
  .withReconnection(false) // Disable for tests
153
- .withAutoJoinRooms(["test-room"]) // Auto-join test room
153
+ .withAutoJoinPublicRooms(["test-room"]) // Auto-join test room
154
154
  .withPayments({ autoApprove: false }) // Use legacy flow for mock server
155
155
  .build();
156
156
 
@@ -241,7 +241,7 @@ describe("WebSocket Integration Tests", () => {
241
241
  sdk.on("agent:list", resolve);
242
242
  });
243
243
 
244
- await sdk.subscribeToRoom("test-room");
244
+ await sdk.subscribeToPublicRoom("test-room");
245
245
  const agents = await agentsPromise;
246
246
 
247
247
  expect(agents).toBeDefined();
@@ -258,7 +258,7 @@ describe("WebSocket Integration Tests", () => {
258
258
  setTimeout(() => reject(new Error("Event timeout")), 10000);
259
259
  });
260
260
 
261
- await sdk.subscribeToRoom("test-room-2"); // Use different room to avoid auto-join conflicts
261
+ await sdk.subscribeToPublicRoom("test-room-2"); // Use different room to avoid auto-join conflicts
262
262
  await subscribePromise;
263
263
 
264
264
  expect(sdk.getSubscribedRooms()).toContain("test-room-2");