@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
@@ -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,35 @@ 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(),
190
+ // Command validation fields
191
+ strictArg: z.boolean().optional(),
192
+ minArgs: z.number().optional(),
193
+ maxArgs: z.number().optional()
168
194
  });
169
195
 
170
196
  export const RoomSchema = z.object({
@@ -193,20 +219,31 @@ export const RoomInfoSchema = z
193
219
  })
194
220
  .passthrough(); // Allow extra fields backend might add
195
221
 
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
- });
222
+ export const AgentSchema = z
223
+ .object({
224
+ id: z.string(),
225
+ name: z.string(),
226
+ description: z.string().optional(),
227
+ room: z.string().optional(),
228
+ rooms: z.array(z.string()).optional(), // Server sends plural rooms array
229
+ capabilities: z.array(CapabilitySchema).optional(),
230
+ commands: z.array(CommandSchema).optional(),
231
+ status: AgentStatusSchema,
232
+ image: z.string().optional(),
233
+ // Accept both server field names and SDK field names
234
+ type: AgentTypeSchema.optional(), // server sends "type"
235
+ agentType: AgentTypeSchema.optional(), // SDK alias
236
+ nlp_fallback: stringToBoolean.optional(), // server sends "nlp_fallback"
237
+ nlpFallback: stringToBoolean.optional(), // SDK alias
238
+ webhookUrl: z.string().url().optional(),
239
+ categories: z.array(AgentCategorySchema).max(MAX_CATEGORIES).optional(),
240
+ review_status: z.enum(["private", "in_review", "public", "declined"]).optional()
241
+ })
242
+ .transform((data) => ({
243
+ ...data,
244
+ agentType: data.agentType ?? data.type,
245
+ nlpFallback: data.nlpFallback ?? data.nlp_fallback
246
+ }));
210
247
 
211
248
  // Base message schema
212
249
  export const BaseMessageSchema = z
@@ -223,7 +260,9 @@ export const BaseMessageSchema = z
223
260
  publicKey: z.string().optional(),
224
261
  reasoning: z.string().optional(),
225
262
  task_id: z.string().optional(),
226
- id: z.string().optional() // Added for message tracking
263
+ id: z.string().optional(), // Added for message tracking
264
+ payment: z.string().optional(), // x402 payment payload
265
+ request_id: z.string().optional() // Request-response correlation
227
266
  })
228
267
  .passthrough(); // Allow message-specific fields to pass through
229
268
 
@@ -247,7 +286,8 @@ export const ChallengeMessageSchema = BaseMessageSchema.extend({
247
286
  export const CheckCachedAuthMessageSchema = BaseMessageSchema.extend({
248
287
  type: z.literal("check_cached_auth"),
249
288
  data: z.object({
250
- address: z.string()
289
+ address: z.string(),
290
+ session_token: z.string().optional() // 64-char hex token for fast re-auth (24h validity)
251
291
  })
252
292
  });
253
293
 
@@ -282,7 +322,12 @@ export const AuthMessageSchema = BaseMessageSchema.extend({
282
322
  private_rooms: z.array(RoomSchema).optional(),
283
323
  private_room_id: z.string().optional(),
284
324
  cached_auth: stringToBoolean.optional(),
285
- max_private_rooms: z.number().optional()
325
+ max_private_rooms: z.number().optional(),
326
+ // Auth enhancement fields (audit #6, #7, #9)
327
+ jwt_token: z.string().optional(), // JWT token for KeyVault API authentication
328
+ session_token: z.string().optional(), // 64-char hex token for fast re-auth (24h validity)
329
+ whitelist_verified: z.union([z.boolean(), z.string()]).optional(), // Whitelist verification status
330
+ user_count: z.number().optional() // Total user count (admin only)
286
331
  })
287
332
  .optional()
288
333
  });
@@ -299,7 +344,12 @@ export const AuthSuccessMessageSchema = BaseMessageSchema.extend({
299
344
  rooms: z.array(RoomInfoSchema).optional().nullable(), // v2.0.0: Uses RoomInfo with is_owner field
300
345
  private_room_id: z.string().optional(), // DEPRECATED: Use rooms array instead
301
346
  cached_auth: stringToBoolean.optional(), // Admin field, optional
302
- max_private_rooms: z.number().optional() // NEW in v2.0.0: Max rooms user can create
347
+ max_private_rooms: z.number().optional(), // NEW in v2.0.0: Max rooms user can create
348
+ // Auth enhancement fields (audit #6, #7, #9)
349
+ jwt_token: z.string().optional(), // JWT token for KeyVault API authentication
350
+ session_token: z.string().optional(), // 64-char hex token for fast re-auth (24h validity)
351
+ whitelist_verified: z.union([z.boolean(), z.string()]).optional(), // Whitelist verification status
352
+ user_count: z.number().optional() // Total user count (admin only)
303
353
  })
304
354
  });
305
355
 
@@ -396,6 +446,8 @@ export const PricingInfoSchema = z
396
446
  price_per_unit: z.number().optional(),
397
447
  priceType: z.string().optional(),
398
448
  price_type: z.string().optional(),
449
+ taskUnit: z.string().optional(),
450
+ task_unit: z.string().optional(),
399
451
  timeUnit: z.string().optional(),
400
452
  time_unit: z.string().optional(),
401
453
  currency: z.string().optional().default("USDC"),
@@ -405,6 +457,7 @@ export const PricingInfoSchema = z
405
457
  // Normalize to camelCase
406
458
  pricePerUnit: data.pricePerUnit ?? data.price_per_unit ?? 0,
407
459
  priceType: data.priceType ?? data.price_type,
460
+ taskUnit: data.taskUnit ?? data.task_unit,
408
461
  timeUnit: data.timeUnit ?? data.time_unit,
409
462
  currency: data.currency,
410
463
  network: data.network
@@ -414,22 +467,37 @@ export const PricingInfoSchema = z
414
467
  export const RequestTaskMessageSchema = BaseMessageSchema.extend({
415
468
  type: z.literal("request_task"),
416
469
  content: z.string(),
417
- room: z.string()
470
+ room: z.string(),
471
+ data: z
472
+ .object({
473
+ network: z.string().optional() // Payment network (peaq, base, avalanche)
474
+ })
475
+ .optional()
418
476
  });
419
477
 
420
478
  // Task quote message (server response with pricing)
421
479
  export const TaskQuoteMessageSchema = BaseMessageSchema.extend({
422
480
  type: z.literal("task_quote"),
423
481
  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
- })
482
+ data: z
483
+ .object({
484
+ task_id: z.string(),
485
+ agent_id: z.string(),
486
+ agent_name: z.string(),
487
+ agent_wallet: z.string(),
488
+ command: z.string(),
489
+ pricing: PricingInfoSchema,
490
+ expires_at: z.string(),
491
+ // v2.5 Settlement Router fields for x402x-router-settlement extension
492
+ settlement_router: z.string(),
493
+ salt: z.string(),
494
+ facilitator_fee: z.string(),
495
+ hook: z.string(),
496
+ hook_data: z.string().optional().default("0x"),
497
+ // Request correlation
498
+ client_request_id: z.string().optional()
499
+ })
500
+ .passthrough()
433
501
  });
434
502
 
435
503
  // Confirm task message (with payment at top level - backend expects msg.payment)
@@ -441,6 +509,22 @@ export const ConfirmTaskMessageSchema = BaseMessageSchema.extend({
441
509
  payment: z.string().optional() // x402 payment at top level (backend checks msg.Payment)
442
510
  });
443
511
 
512
+ // Task confirmed message (server acknowledgment after confirm_task)
513
+ export const TaskConfirmedMessageSchema = BaseMessageSchema.extend({
514
+ type: z.literal("task_confirmed"),
515
+ data: z
516
+ .object({
517
+ task_id: z.string(),
518
+ agent_id: z.string().optional(),
519
+ agent_name: z.string().optional(),
520
+ client_request_id: z.string().optional()
521
+ })
522
+ .passthrough()
523
+ .optional()
524
+ });
525
+
526
+ export type TaskConfirmedMessage = z.infer<typeof TaskConfirmedMessageSchema>;
527
+
444
528
  // System message schemas
445
529
  export const AgentsListMessageSchema = BaseMessageSchema.extend({
446
530
  type: z.literal("agents"),
@@ -459,12 +543,38 @@ export const ErrorMessageSchema = BaseMessageSchema.extend({
459
543
  })
460
544
  });
461
545
 
546
+ export const SuccessMessageSchema = BaseMessageSchema.extend({
547
+ type: z.literal("success"),
548
+ content: z.string().optional(),
549
+ from: z.literal("system").optional(),
550
+ data: z
551
+ .object({
552
+ content: z.string().optional()
553
+ })
554
+ .passthrough()
555
+ .optional()
556
+ }).passthrough();
557
+
462
558
  export const PingMessageSchema = BaseMessageSchema.extend({
463
559
  type: z.literal("ping")
464
560
  });
465
561
 
466
562
  export const PongMessageSchema = BaseMessageSchema.extend({
467
- type: z.literal("pong")
563
+ type: z.literal("pong"),
564
+ data: z
565
+ .union([
566
+ // Regular pong (no data)
567
+ z.undefined(),
568
+ // Room pong (with room data)
569
+ z
570
+ .object({
571
+ room_id: z.string(),
572
+ live_count: z.number().optional(),
573
+ timestamp: z.string()
574
+ })
575
+ .passthrough()
576
+ ])
577
+ .optional()
468
578
  });
469
579
 
470
580
  // Room subscription schemas
@@ -636,7 +746,18 @@ export const AgentRoomInfoSchema = z
636
746
  status: z.string().optional(),
637
747
  added_by: z.string().optional(),
638
748
  added_at: z.string().optional(),
639
- categories: z.array(AgentCategorySchema).max(MAX_CATEGORIES).optional()
749
+ categories: z.array(AgentCategorySchema).max(MAX_CATEGORIES).optional(),
750
+ // Server-sent typed fields
751
+ type: AgentTypeSchema.optional(),
752
+ nlp_fallback: z.union([z.boolean(), z.string()]).optional(),
753
+ review_status: z.enum(["private", "in_review", "public", "declined"]).optional(),
754
+ decline_reason: z.string().optional().nullable(),
755
+ submitted_at: z.string().optional().nullable(),
756
+ reviewed_at: z.string().optional().nullable(),
757
+ reviewed_by: z.string().optional().nullable(),
758
+ created_at: z.string().optional(),
759
+ creator: z.string().optional(),
760
+ is_banned: z.boolean().optional()
640
761
  })
641
762
  .passthrough();
642
763
 
@@ -687,7 +808,11 @@ export const AvailableAgentsResponseSchema = z
687
808
  type: z.literal("available_agents_response"),
688
809
  data: z
689
810
  .object({
690
- agents: z.array(AgentRoomInfoSchema).optional()
811
+ agents: z.array(AgentRoomInfoSchema).optional(),
812
+ total: z.number().optional(),
813
+ offset: z.number().optional(),
814
+ limit: z.number().optional(),
815
+ has_more: z.boolean().optional()
691
816
  })
692
817
  .passthrough()
693
818
  })
@@ -730,18 +855,8 @@ export const RoomPingMessageSchema = z
730
855
  })
731
856
  .passthrough();
732
857
 
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();
858
+ // Note: RoomPong reuses the "pong" message type with room data in the data field
859
+ // The PongHandler checks for room_id in data to distinguish room pong from regular pong
745
860
 
746
861
  // Admin agent info (admin only)
747
862
  export const AdminAgentInfoSchema = z
@@ -754,10 +869,13 @@ export const AdminAgentInfoSchema = z
754
869
  image_url: z.string().optional().nullable(),
755
870
  is_online: z.boolean().optional(),
756
871
  is_active: z.boolean().optional(),
757
- is_verified: z.boolean().optional(),
758
- is_public: z.boolean().optional(),
759
872
  is_banned: z.boolean().optional(),
760
- created_at: z.string().optional().nullable()
873
+ created_at: z.string().optional().nullable(),
874
+ review_status: z.enum(["private", "in_review", "public", "declined"]).optional(),
875
+ decline_reason: z.string().optional().nullable(),
876
+ submitted_at: z.string().optional().nullable(),
877
+ reviewed_at: z.string().optional().nullable(),
878
+ reviewed_by: z.string().optional().nullable()
761
879
  })
762
880
  .passthrough();
763
881
 
@@ -908,6 +1026,46 @@ export const UserPreferencesUpdatedMessageSchema = z
908
1026
  export type UserPreferencesUpdatedData = z.infer<typeof UserPreferencesUpdatedDataSchema>;
909
1027
  export type UserPreferencesUpdatedMessage = z.infer<typeof UserPreferencesUpdatedMessageSchema>;
910
1028
 
1029
+ // Agent Error message (server → client, when an agent fails)
1030
+ export const AgentErrorMessageSchema = BaseMessageSchema.extend({
1031
+ type: z.literal("agent_error"),
1032
+ content: z.string().optional(),
1033
+ from: z.string().optional(),
1034
+ data: z
1035
+ .object({
1036
+ task_id: z.string().optional(),
1037
+ client_request_id: z.string().optional()
1038
+ })
1039
+ .passthrough()
1040
+ .optional()
1041
+ });
1042
+
1043
+ export type AgentErrorMessage = z.infer<typeof AgentErrorMessageSchema>;
1044
+
1045
+ // Wallet Transaction schemas
1046
+ export const TxResultStatusSchema = z.enum(["confirmed", "rejected", "failed"]);
1047
+ export type TxResultStatus = z.infer<typeof TxResultStatusSchema>;
1048
+
1049
+ export const TriggerWalletTxMessageSchema = BaseMessageSchema.extend({
1050
+ type: z.literal("trigger_wallet_tx"),
1051
+ from: z.string().optional(),
1052
+ data: z
1053
+ .object({
1054
+ task_id: z.string(),
1055
+ tx: z.object({
1056
+ to: z.string(),
1057
+ value: z.string(),
1058
+ data: z.string().optional(),
1059
+ chainId: z.number()
1060
+ }),
1061
+ description: z.string().optional(),
1062
+ optional: z.boolean().optional()
1063
+ })
1064
+ .passthrough()
1065
+ });
1066
+
1067
+ export type TriggerWalletTxMessage = z.infer<typeof TriggerWalletTxMessageSchema>;
1068
+
911
1069
  // Union of all INCOMING message schemas for validation
912
1070
  // Note: Outgoing message schemas (Subscribe, Unsubscribe, ListRooms) are excluded
913
1071
  // as they share the same type values with their response counterparts
@@ -932,9 +1090,11 @@ export const AnyMessageSchema = z.discriminatedUnion("type", [
932
1090
 
933
1091
  // Quote-Approve Flow (v2.2.0)
934
1092
  TaskQuoteMessageSchema,
1093
+ TaskConfirmedMessageSchema,
935
1094
 
936
1095
  // System
937
1096
  ErrorMessageSchema,
1097
+ SuccessMessageSchema,
938
1098
  PingMessageSchema,
939
1099
  PongMessageSchema,
940
1100
 
@@ -954,9 +1114,6 @@ export const AnyMessageSchema = z.discriminatedUnion("type", [
954
1114
  AvailableAgentsResponseSchema,
955
1115
  AgentStatusUpdateMessageSchema,
956
1116
 
957
- // Room Ping System (v2.0.0)
958
- RoomPongResponseSchema,
959
-
960
1117
  // Admin Messages
961
1118
  AllAgentsResponseSchema,
962
1119
  UserCountMessageSchema,
@@ -965,7 +1122,13 @@ export const AnyMessageSchema = z.discriminatedUnion("type", [
965
1122
  AgentDetailsResponseMessageSchema,
966
1123
 
967
1124
  // User Preferences
968
- UserPreferencesUpdatedMessageSchema
1125
+ UserPreferencesUpdatedMessageSchema,
1126
+
1127
+ // Agent Error
1128
+ AgentErrorMessageSchema,
1129
+
1130
+ // Wallet Transaction
1131
+ TriggerWalletTxMessageSchema
969
1132
  ]);
970
1133
 
971
1134
  // Type inference from schemas
@@ -1003,6 +1166,7 @@ export type TaskQuoteMessage = z.infer<typeof TaskQuoteMessageSchema>;
1003
1166
  export type ConfirmTaskMessage = z.infer<typeof ConfirmTaskMessageSchema>;
1004
1167
 
1005
1168
  export type ErrorMessage = z.infer<typeof ErrorMessageSchema>;
1169
+ export type SuccessMessage = z.infer<typeof SuccessMessageSchema>;
1006
1170
  export type PingMessage = z.infer<typeof PingMessageSchema>;
1007
1171
  export type PongMessage = z.infer<typeof PongMessageSchema>;
1008
1172
  export type SubscribeMessage = z.infer<typeof SubscribeMessageSchema>;
@@ -1038,7 +1202,7 @@ export type AgentStatusUpdateMessage = z.infer<typeof AgentStatusUpdateMessageSc
1038
1202
 
1039
1203
  // Room Ping Types (v2.0.0)
1040
1204
  export type RoomPingMessage = z.infer<typeof RoomPingMessageSchema>;
1041
- export type RoomPongResponse = z.infer<typeof RoomPongResponseSchema>;
1205
+ // Note: Room pong responses use the PongMessage type with room data
1042
1206
 
1043
1207
  export type AnyMessage = z.infer<typeof AnyMessageSchema>;
1044
1208
 
@@ -1089,10 +1253,16 @@ export function createRequestChallenge(
1089
1253
  });
1090
1254
  }
1091
1255
 
1092
- export function createCheckCachedAuth(address: string): CheckCachedAuthMessage {
1256
+ export function createCheckCachedAuth(
1257
+ address: string,
1258
+ sessionToken?: string
1259
+ ): CheckCachedAuthMessage {
1093
1260
  return CheckCachedAuthMessageSchema.parse({
1094
1261
  type: "check_cached_auth",
1095
- data: { address }
1262
+ data: {
1263
+ address,
1264
+ ...(sessionToken && { session_token: sessionToken })
1265
+ }
1096
1266
  });
1097
1267
  }
1098
1268
 
@@ -1149,11 +1319,16 @@ export function createListRooms(): ListRoomsMessage {
1149
1319
  }
1150
1320
 
1151
1321
  // Quote-Approve Flow factory functions (v2.2.0)
1152
- export function createRequestTask(content: string, room: string): RequestTaskMessage {
1322
+ export function createRequestTask(
1323
+ content: string,
1324
+ room: string,
1325
+ network?: string
1326
+ ): RequestTaskMessage {
1153
1327
  return RequestTaskMessageSchema.parse({
1154
1328
  type: "request_task",
1155
1329
  content,
1156
- room
1330
+ room,
1331
+ ...(network && { data: { network } })
1157
1332
  });
1158
1333
  }
1159
1334
 
@@ -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");