@teneo-protocol/sdk 1.0.1 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (352) hide show
  1. package/.eslintrc.json +11 -2
  2. package/.github/CODEOWNERS +2 -0
  3. package/.github/ISSUE_TEMPLATE/01-bug.yml +85 -0
  4. package/.github/ISSUE_TEMPLATE/config.yml +8 -0
  5. package/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
  6. package/.github/workflows/claude-code-review.yml +8 -3
  7. package/.github/workflows/claude-reviewer.yml +6 -4
  8. package/.github/workflows/publish-npm.yml +9 -6
  9. package/.github/workflows/push-to-main.yml +1 -1
  10. package/.github/workflows/top-issue.yml +102 -0
  11. package/CHANGELOG.md +334 -0
  12. package/CONCEPTS.md +747 -0
  13. package/README.md +577 -54
  14. package/dist/constants.js +8 -8
  15. package/dist/constants.js.map +1 -1
  16. package/dist/core/websocket-client.d.ts +25 -1
  17. package/dist/core/websocket-client.d.ts.map +1 -1
  18. package/dist/core/websocket-client.js +74 -15
  19. package/dist/core/websocket-client.js.map +1 -1
  20. package/dist/formatters/response-formatter.js +4 -0
  21. package/dist/formatters/response-formatter.js.map +1 -1
  22. package/dist/handlers/message-handler-registry.js +2 -1
  23. package/dist/handlers/message-handler-registry.js.map +1 -1
  24. package/dist/handlers/message-handlers/agent-details-response-handler.d.ts +1666 -0
  25. package/dist/handlers/message-handlers/agent-details-response-handler.d.ts.map +1 -0
  26. package/dist/handlers/message-handlers/agent-details-response-handler.js +38 -0
  27. package/dist/handlers/message-handlers/agent-details-response-handler.js.map +1 -0
  28. package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts +76 -0
  29. package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts.map +1 -0
  30. package/dist/handlers/message-handlers/agent-room-operation-response-handler.js +67 -0
  31. package/dist/handlers/message-handlers/agent-room-operation-response-handler.js.map +1 -0
  32. package/dist/handlers/message-handlers/agent-selected-handler.d.ts +92 -38
  33. package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -1
  34. package/dist/handlers/message-handlers/agent-selected-handler.js +2 -5
  35. package/dist/handlers/message-handlers/agent-selected-handler.js.map +1 -1
  36. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts +1687 -0
  37. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts.map +1 -0
  38. package/dist/handlers/message-handlers/agent-status-update-handler.js +48 -0
  39. package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -0
  40. package/dist/handlers/message-handlers/agents-list-handler.js +2 -5
  41. package/dist/handlers/message-handlers/agents-list-handler.js.map +1 -1
  42. package/dist/handlers/message-handlers/all-agents-response-handler.d.ts +439 -0
  43. package/dist/handlers/message-handlers/all-agents-response-handler.d.ts.map +1 -0
  44. package/dist/handlers/message-handlers/all-agents-response-handler.js +36 -0
  45. package/dist/handlers/message-handlers/all-agents-response-handler.js.map +1 -0
  46. package/dist/handlers/message-handlers/auth-error-handler.d.ts +45 -31
  47. package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -1
  48. package/dist/handlers/message-handlers/auth-error-handler.js +2 -5
  49. package/dist/handlers/message-handlers/auth-error-handler.js.map +1 -1
  50. package/dist/handlers/message-handlers/auth-message-handler.d.ts +6 -0
  51. package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -1
  52. package/dist/handlers/message-handlers/auth-message-handler.js +71 -10
  53. package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -1
  54. package/dist/handlers/message-handlers/auth-required-handler.d.ts +49 -31
  55. package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -1
  56. package/dist/handlers/message-handlers/auth-required-handler.js +2 -5
  57. package/dist/handlers/message-handlers/auth-required-handler.js.map +1 -1
  58. package/dist/handlers/message-handlers/auth-success-handler.d.ts +6 -0
  59. package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -1
  60. package/dist/handlers/message-handlers/auth-success-handler.js +52 -9
  61. package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -1
  62. package/dist/handlers/message-handlers/base-handler.d.ts +4 -4
  63. package/dist/handlers/message-handlers/base-handler.d.ts.map +1 -1
  64. package/dist/handlers/message-handlers/base-handler.js +3 -1
  65. package/dist/handlers/message-handlers/base-handler.js.map +1 -1
  66. package/dist/handlers/message-handlers/challenge-handler.d.ts +45 -31
  67. package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -1
  68. package/dist/handlers/message-handlers/challenge-handler.js +3 -2
  69. package/dist/handlers/message-handlers/challenge-handler.js.map +1 -1
  70. package/dist/handlers/message-handlers/error-message-handler.d.ts +49 -31
  71. package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -1
  72. package/dist/handlers/message-handlers/error-message-handler.js +2 -5
  73. package/dist/handlers/message-handlers/error-message-handler.js.map +1 -1
  74. package/dist/handlers/message-handlers/index.d.ts +11 -0
  75. package/dist/handlers/message-handlers/index.d.ts.map +1 -1
  76. package/dist/handlers/message-handlers/index.js +55 -1
  77. package/dist/handlers/message-handlers/index.js.map +1 -1
  78. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts +1660 -0
  79. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -0
  80. package/dist/handlers/message-handlers/list-available-agents-handler.js +35 -0
  81. package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -0
  82. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +1669 -0
  83. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts.map +1 -0
  84. package/dist/handlers/message-handlers/list-room-agents-handler.js +48 -0
  85. package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -0
  86. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts +2 -110
  87. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
  88. package/dist/handlers/message-handlers/list-rooms-response-handler.js +4 -6
  89. package/dist/handlers/message-handlers/list-rooms-response-handler.js.map +1 -1
  90. package/dist/handlers/message-handlers/ping-pong-handler.d.ts +62 -58
  91. package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -1
  92. package/dist/handlers/message-handlers/ping-pong-handler.js +4 -10
  93. package/dist/handlers/message-handlers/ping-pong-handler.js.map +1 -1
  94. package/dist/handlers/message-handlers/rate-limit-notification-handler.d.ts +94 -0
  95. package/dist/handlers/message-handlers/rate-limit-notification-handler.d.ts.map +1 -0
  96. package/dist/handlers/message-handlers/rate-limit-notification-handler.js +35 -0
  97. package/dist/handlers/message-handlers/rate-limit-notification-handler.js.map +1 -0
  98. package/dist/handlers/message-handlers/regular-message-handler.d.ts +31 -29
  99. package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -1
  100. package/dist/handlers/message-handlers/regular-message-handler.js +4 -6
  101. package/dist/handlers/message-handlers/regular-message-handler.js.map +1 -1
  102. package/dist/handlers/message-handlers/room-operation-response-handler.d.ts +328 -0
  103. package/dist/handlers/message-handlers/room-operation-response-handler.d.ts.map +1 -0
  104. package/dist/handlers/message-handlers/room-operation-response-handler.js +89 -0
  105. package/dist/handlers/message-handlers/room-operation-response-handler.js.map +1 -0
  106. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +53 -31
  107. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
  108. package/dist/handlers/message-handlers/subscribe-response-handler.js +4 -6
  109. package/dist/handlers/message-handlers/subscribe-response-handler.js.map +1 -1
  110. package/dist/handlers/message-handlers/task-quote-handler.d.ts +14 -0
  111. package/dist/handlers/message-handlers/task-quote-handler.d.ts.map +1 -0
  112. package/dist/handlers/message-handlers/task-quote-handler.js +29 -0
  113. package/dist/handlers/message-handlers/task-quote-handler.js.map +1 -0
  114. package/dist/handlers/message-handlers/task-response-handler.js +2 -5
  115. package/dist/handlers/message-handlers/task-response-handler.js.map +1 -1
  116. package/dist/handlers/message-handlers/types.d.ts +21 -7
  117. package/dist/handlers/message-handlers/types.d.ts.map +1 -1
  118. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +53 -31
  119. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
  120. package/dist/handlers/message-handlers/unsubscribe-response-handler.js +4 -6
  121. package/dist/handlers/message-handlers/unsubscribe-response-handler.js.map +1 -1
  122. package/dist/handlers/message-handlers/user-authenticated-handler.d.ts +40 -0
  123. package/dist/handlers/message-handlers/user-authenticated-handler.d.ts.map +1 -0
  124. package/dist/handlers/message-handlers/user-authenticated-handler.js +28 -0
  125. package/dist/handlers/message-handlers/user-authenticated-handler.js.map +1 -0
  126. package/dist/handlers/message-handlers/user-count-handler.d.ts +49 -0
  127. package/dist/handlers/message-handlers/user-count-handler.d.ts.map +1 -0
  128. package/dist/handlers/message-handlers/user-count-handler.js +31 -0
  129. package/dist/handlers/message-handlers/user-count-handler.js.map +1 -0
  130. package/dist/handlers/webhook-handler.d.ts +1 -1
  131. package/dist/handlers/webhook-handler.d.ts.map +1 -1
  132. package/dist/handlers/webhook-handler.js +14 -5
  133. package/dist/handlers/webhook-handler.js.map +1 -1
  134. package/dist/index.d.ts +6 -1
  135. package/dist/index.d.ts.map +1 -1
  136. package/dist/index.js +19 -2
  137. package/dist/index.js.map +1 -1
  138. package/dist/managers/admin-manager.d.ts +116 -0
  139. package/dist/managers/admin-manager.d.ts.map +1 -0
  140. package/dist/managers/admin-manager.js +169 -0
  141. package/dist/managers/admin-manager.js.map +1 -0
  142. package/dist/managers/agent-registry.d.ts +52 -1
  143. package/dist/managers/agent-registry.d.ts.map +1 -1
  144. package/dist/managers/agent-registry.js +145 -6
  145. package/dist/managers/agent-registry.js.map +1 -1
  146. package/dist/managers/agent-room-manager.d.ts +216 -0
  147. package/dist/managers/agent-room-manager.d.ts.map +1 -0
  148. package/dist/managers/agent-room-manager.js +555 -0
  149. package/dist/managers/agent-room-manager.js.map +1 -0
  150. package/dist/managers/connection-manager.js +2 -0
  151. package/dist/managers/connection-manager.js.map +1 -1
  152. package/dist/managers/index.d.ts +4 -1
  153. package/dist/managers/index.d.ts.map +1 -1
  154. package/dist/managers/index.js +7 -1
  155. package/dist/managers/index.js.map +1 -1
  156. package/dist/managers/message-router.d.ts +56 -5
  157. package/dist/managers/message-router.d.ts.map +1 -1
  158. package/dist/managers/message-router.js +155 -8
  159. package/dist/managers/message-router.js.map +1 -1
  160. package/dist/managers/room-management-manager.d.ts +213 -0
  161. package/dist/managers/room-management-manager.d.ts.map +1 -0
  162. package/dist/managers/room-management-manager.js +442 -0
  163. package/dist/managers/room-management-manager.js.map +1 -0
  164. package/dist/managers/room-manager.d.ts +11 -9
  165. package/dist/managers/room-manager.d.ts.map +1 -1
  166. package/dist/managers/room-manager.js +14 -10
  167. package/dist/managers/room-manager.js.map +1 -1
  168. package/dist/payments/index.d.ts +5 -0
  169. package/dist/payments/index.d.ts.map +1 -0
  170. package/dist/payments/index.js +21 -0
  171. package/dist/payments/index.js.map +1 -0
  172. package/dist/payments/payment-client.d.ts +74 -0
  173. package/dist/payments/payment-client.d.ts.map +1 -0
  174. package/dist/payments/payment-client.js +207 -0
  175. package/dist/payments/payment-client.js.map +1 -0
  176. package/dist/teneo-sdk.d.ts +467 -33
  177. package/dist/teneo-sdk.d.ts.map +1 -1
  178. package/dist/teneo-sdk.js +735 -26
  179. package/dist/teneo-sdk.js.map +1 -1
  180. package/dist/types/categories.d.ts +22 -0
  181. package/dist/types/categories.d.ts.map +1 -0
  182. package/dist/types/categories.js +40 -0
  183. package/dist/types/categories.js.map +1 -0
  184. package/dist/types/config.d.ts +134 -54
  185. package/dist/types/config.d.ts.map +1 -1
  186. package/dist/types/config.js +70 -9
  187. package/dist/types/config.js.map +1 -1
  188. package/dist/types/error-codes.d.ts +10 -0
  189. package/dist/types/error-codes.d.ts.map +1 -1
  190. package/dist/types/error-codes.js +12 -0
  191. package/dist/types/error-codes.js.map +1 -1
  192. package/dist/types/events.d.ts +176 -68
  193. package/dist/types/events.d.ts.map +1 -1
  194. package/dist/types/events.js +19 -1
  195. package/dist/types/events.js.map +1 -1
  196. package/dist/types/index.d.ts +3 -2
  197. package/dist/types/index.d.ts.map +1 -1
  198. package/dist/types/index.js +57 -2
  199. package/dist/types/index.js.map +1 -1
  200. package/dist/types/messages.d.ts +22225 -2592
  201. package/dist/types/messages.d.ts.map +1 -1
  202. package/dist/types/messages.js +537 -28
  203. package/dist/types/messages.js.map +1 -1
  204. package/dist/utils/bounded-queue.d.ts.map +1 -1
  205. package/dist/utils/bounded-queue.js +5 -2
  206. package/dist/utils/bounded-queue.js.map +1 -1
  207. package/dist/utils/circuit-breaker.js +11 -4
  208. package/dist/utils/circuit-breaker.js.map +1 -1
  209. package/dist/utils/deduplication-cache.js +3 -1
  210. package/dist/utils/deduplication-cache.js.map +1 -1
  211. package/dist/utils/event-waiter.d.ts +3 -3
  212. package/dist/utils/event-waiter.d.ts.map +1 -1
  213. package/dist/utils/index.d.ts +1 -0
  214. package/dist/utils/index.d.ts.map +1 -1
  215. package/dist/utils/index.js +4 -1
  216. package/dist/utils/index.js.map +1 -1
  217. package/dist/utils/logger.js.map +1 -1
  218. package/dist/utils/pricing-resolver.d.ts +26 -0
  219. package/dist/utils/pricing-resolver.d.ts.map +1 -0
  220. package/dist/utils/pricing-resolver.js +85 -0
  221. package/dist/utils/pricing-resolver.js.map +1 -0
  222. package/dist/utils/rate-limiter.d.ts.map +1 -1
  223. package/dist/utils/rate-limiter.js +6 -0
  224. package/dist/utils/rate-limiter.js.map +1 -1
  225. package/dist/utils/retry-policy.js +1 -0
  226. package/dist/utils/retry-policy.js.map +1 -1
  227. package/dist/utils/secure-private-key.js +3 -1
  228. package/dist/utils/secure-private-key.js.map +1 -1
  229. package/dist/utils/signature-verifier.d.ts.map +1 -1
  230. package/dist/utils/signature-verifier.js +3 -1
  231. package/dist/utils/signature-verifier.js.map +1 -1
  232. package/examples/.env.example +2 -2
  233. package/examples/agent-room-management-example.ts +335 -0
  234. package/examples/basic-usage.ts +3 -4
  235. package/examples/claude-agent-x-follower/.env.example +3 -3
  236. package/examples/claude-agent-x-follower/QUICKSTART.md +3 -3
  237. package/examples/claude-agent-x-follower/README.md +3 -3
  238. package/examples/claude-agent-x-follower/index.ts +120 -96
  239. package/examples/n8n-teneo/.env.example +3 -3
  240. package/examples/n8n-teneo/README.md +2 -2
  241. package/examples/n8n-teneo/index.ts +54 -44
  242. package/examples/nestjs-dashboard/.env.example +11 -0
  243. package/examples/nestjs-dashboard/README.md +297 -0
  244. package/examples/nestjs-dashboard/nest-cli.json +10 -0
  245. package/examples/nestjs-dashboard/package.json +44 -0
  246. package/examples/nestjs-dashboard/pnpm-lock.yaml +3079 -0
  247. package/examples/nestjs-dashboard/src/app.controller.ts +24 -0
  248. package/examples/nestjs-dashboard/src/app.module.ts +15 -0
  249. package/examples/nestjs-dashboard/src/main.ts +32 -0
  250. package/examples/nestjs-dashboard/src/public/dashboard.html +1144 -0
  251. package/examples/nestjs-dashboard/src/teneo/agents.controller.ts +54 -0
  252. package/examples/nestjs-dashboard/src/teneo/events.controller.ts +65 -0
  253. package/examples/nestjs-dashboard/src/teneo/messages.controller.ts +47 -0
  254. package/examples/nestjs-dashboard/src/teneo/rooms.controller.ts +258 -0
  255. package/examples/nestjs-dashboard/src/teneo/teneo.module.ts +13 -0
  256. package/examples/nestjs-dashboard/src/teneo/teneo.service.ts +484 -0
  257. package/examples/nestjs-dashboard/tsconfig.json +22 -0
  258. package/examples/openai-teneo/.env.example +3 -3
  259. package/examples/openai-teneo/README.md +3 -3
  260. package/examples/openai-teneo/index.ts +82 -71
  261. package/examples/production-dashboard/.env.example +3 -3
  262. package/examples/production-dashboard/README.md +90 -13
  263. package/examples/production-dashboard/public/dashboard.html +1173 -601
  264. package/examples/production-dashboard/server.ts +349 -7
  265. package/examples/room-management-example.ts +282 -0
  266. package/examples/usage/.env.example +2 -2
  267. package/examples/usage/01-connect.ts +3 -4
  268. package/examples/usage/02-list-agents.ts +2 -3
  269. package/examples/usage/03-pick-agent.ts +2 -3
  270. package/examples/usage/04-find-by-capability.ts +2 -3
  271. package/examples/usage/05-webhook-example.ts +2 -3
  272. package/examples/usage/06-simple-api-server.ts +2 -3
  273. package/examples/usage/07-event-listener.ts +2 -3
  274. package/examples/usage/README.md +1 -1
  275. package/examples/webhook-integration.ts +1 -1
  276. package/examples/x-influencer-battle-server.ts +2 -2
  277. package/package.json +12 -1
  278. package/src/core/websocket-client.test.ts +8 -3
  279. package/src/core/websocket-client.ts +58 -4
  280. package/src/formatters/response-formatter.test.ts +2 -0
  281. package/src/formatters/response-formatter.ts +3 -3
  282. package/src/handlers/message-handlers/agent-details-response-handler.ts +42 -0
  283. package/src/handlers/message-handlers/agent-room-operation-response-handler.ts +77 -0
  284. package/src/handlers/message-handlers/agent-status-update-handler.ts +52 -0
  285. package/src/handlers/message-handlers/all-agents-response-handler.ts +39 -0
  286. package/src/handlers/message-handlers/auth-message-handler.ts +78 -5
  287. package/src/handlers/message-handlers/auth-success-handler.ts +63 -6
  288. package/src/handlers/message-handlers/base-handler.ts +20 -7
  289. package/src/handlers/message-handlers/index.ts +53 -0
  290. package/src/handlers/message-handlers/list-available-agents-handler.ts +41 -0
  291. package/src/handlers/message-handlers/list-room-agents-handler.ts +58 -0
  292. package/src/handlers/message-handlers/list-rooms-response-handler.ts +4 -2
  293. package/src/handlers/message-handlers/rate-limit-notification-handler.ts +45 -0
  294. package/src/handlers/message-handlers/regular-message-handler.ts +3 -2
  295. package/src/handlers/message-handlers/room-operation-response-handler.ts +102 -0
  296. package/src/handlers/message-handlers/subscribe-response-handler.ts +12 -2
  297. package/src/handlers/message-handlers/task-quote-handler.ts +31 -0
  298. package/src/handlers/message-handlers/types.ts +41 -7
  299. package/src/handlers/message-handlers/unsubscribe-response-handler.ts +12 -2
  300. package/src/handlers/message-handlers/user-authenticated-handler.ts +31 -0
  301. package/src/handlers/message-handlers/user-count-handler.ts +34 -0
  302. package/src/handlers/webhook-handler.test.ts +3 -2
  303. package/src/handlers/webhook-handler.ts +13 -7
  304. package/src/index.ts +21 -0
  305. package/src/managers/admin-manager.ts +249 -0
  306. package/src/managers/agent-registry.test.ts +2 -1
  307. package/src/managers/agent-registry.ts +170 -2
  308. package/src/managers/agent-room-manager.ts +665 -0
  309. package/src/managers/index.ts +15 -1
  310. package/src/managers/message-router.ts +215 -17
  311. package/src/managers/room-management-manager.ts +520 -0
  312. package/src/managers/room-manager.ts +15 -20
  313. package/src/payments/index.ts +22 -0
  314. package/src/payments/payment-client.ts +240 -0
  315. package/src/teneo-sdk.ts +806 -30
  316. package/src/types/categories.ts +45 -0
  317. package/src/types/config.ts +80 -7
  318. package/src/types/error-codes.ts +14 -0
  319. package/src/types/events.test.ts +1 -0
  320. package/src/types/events.ts +67 -0
  321. package/src/types/index.ts +111 -0
  322. package/src/types/messages.test.ts +2 -1
  323. package/src/types/messages.ts +677 -42
  324. package/src/utils/bounded-queue.test.ts +1 -1
  325. package/src/utils/bounded-queue.ts +2 -1
  326. package/src/utils/circuit-breaker.test.ts +1 -1
  327. package/src/utils/deduplication-cache.test.ts +1 -1
  328. package/src/utils/event-waiter.test.ts +1 -1
  329. package/src/utils/event-waiter.ts +3 -3
  330. package/src/utils/index.ts +7 -0
  331. package/src/utils/logger.ts +8 -8
  332. package/src/utils/pricing-resolver.ts +128 -0
  333. package/src/utils/rate-limiter.test.ts +1 -1
  334. package/src/utils/rate-limiter.ts +1 -0
  335. package/src/utils/signature-verifier.test.ts +2 -2
  336. package/src/utils/signature-verifier.ts +3 -2
  337. package/tests/.env.example +7 -0
  338. package/tests/direct-agent-test.ts +151 -0
  339. package/tests/integration/real-server.test.ts +2 -0
  340. package/tests/integration/room-management.test.ts +516 -0
  341. package/tests/integration/websocket.test.ts +5 -2
  342. package/tests/payment-flow-test.ts +147 -0
  343. package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +382 -0
  344. package/tests/unit/handlers/agent-status-update-handler.test.ts +403 -0
  345. package/tests/unit/handlers/auth-success-handler-rooms.test.ts +697 -0
  346. package/tests/unit/handlers/list-available-agents-handler.test.ts +248 -0
  347. package/tests/unit/handlers/list-room-agents-handler.test.ts +290 -0
  348. package/tests/unit/handlers/room-operation-response-handler.test.ts +500 -0
  349. package/tests/unit/managers/agent-room-manager.test.ts +527 -0
  350. package/tests/unit/managers/room-management-manager.test.ts +420 -0
  351. package/tsconfig.json +2 -2
  352. package/vitest.config.ts +1 -0
@@ -4,6 +4,7 @@
4
4
  */
5
5
 
6
6
  import { z } from "zod";
7
+ import { AgentCategorySchema, MAX_CATEGORIES } from "./categories";
7
8
 
8
9
  /**
9
10
  * Coerces string booleans to actual booleans with strict validation.
@@ -46,6 +47,7 @@ const stringToBoolean = z
46
47
 
47
48
  // Enum schemas
48
49
  export const MessageTypeSchema = z.enum([
50
+ // Authentication
49
51
  "request_challenge",
50
52
  "challenge",
51
53
  "check_cached_auth",
@@ -55,18 +57,73 @@ export const MessageTypeSchema = z.enum([
55
57
  "auth_error",
56
58
  "register",
57
59
  "registration_success",
60
+
61
+ // Communication
58
62
  "message",
59
63
  "task",
60
64
  "task_response",
61
65
  "agent_selected",
66
+
67
+ // Quote-Approve Flow (v2.2.0)
68
+ "request_task",
69
+ "task_quote",
70
+ "confirm_task",
71
+
72
+ // System
62
73
  "agents",
63
74
  "error",
64
75
  "ping",
65
76
  "pong",
66
77
  "capabilities",
78
+
79
+ // Room Subscription (Basic)
67
80
  "subscribe",
68
81
  "unsubscribe",
69
- "list_rooms"
82
+ "list_rooms",
83
+
84
+ // === NEW IN v2.0.0 ===
85
+
86
+ // Room Management (6 types)
87
+ "create_room",
88
+ "update_room",
89
+ "delete_room",
90
+ "add_room_member",
91
+ "remove_room_member",
92
+ "list_room_members",
93
+
94
+ // Room Management Responses (3 types)
95
+ "room_operation_response",
96
+ "room_member_operation_response",
97
+ "room_members_response",
98
+
99
+ // Agent Room Management (5 types)
100
+ "add_agent_to_room",
101
+ "remove_agent_from_room",
102
+ "list_room_agents",
103
+ "list_available_agents",
104
+ "agent_status_update",
105
+
106
+ // Agent Room Management Responses (3 types)
107
+ "agent_room_operation_response",
108
+ "room_agents_response",
109
+ "available_agents_response",
110
+
111
+ // Room Ping System (2 types)
112
+ "room_ping",
113
+ "room_pong",
114
+
115
+ // Admin Messages (7 types)
116
+ "list_all_agents",
117
+ "all_agents_response",
118
+ "user_count",
119
+ "user_authenticated",
120
+ "rate_limit_notification",
121
+ "get_agent_details",
122
+ "agent_details_response",
123
+
124
+ // User Preferences (2 types)
125
+ "set_user_preferences",
126
+ "user_preferences_updated"
70
127
  ]);
71
128
 
72
129
  export const ContentTypeSchema = z.enum([
@@ -90,26 +147,51 @@ export const AgentStatusSchema = z.enum(["online", "offline"]);
90
147
  // Supporting schemas
91
148
  export const CapabilitySchema = z.object({
92
149
  name: z.string(),
93
- description: z.string()
150
+ description: z.string().optional()
151
+ });
152
+
153
+ export const CommandPricingSchema = z.object({
154
+ priceType: z.string().optional(),
155
+ pricePerUnit: z.number().optional(),
156
+ taskUnit: z.string().optional(),
157
+ timeUnit: z.enum(["hour", "day"]).optional()
94
158
  });
95
159
 
160
+ export type CommandPricing = z.infer<typeof CommandPricingSchema>;
161
+
96
162
  export const CommandSchema = z.object({
97
163
  trigger: z.string(),
98
164
  argument: z.string().optional(),
99
- description: z.string()
165
+ description: z.string().optional(),
166
+ pricing: CommandPricingSchema.optional()
100
167
  });
101
168
 
102
169
  export const RoomSchema = z.object({
103
170
  id: z.string(),
104
- name: z.string(),
171
+ name: z.string().optional(),
105
172
  description: z.string().optional(),
106
- is_public: stringToBoolean,
107
- is_active: stringToBoolean,
108
- created_by: z.string(),
109
- created_at: z.string(),
110
- updated_at: z.string()
173
+ is_public: stringToBoolean.optional(),
174
+ is_active: stringToBoolean.optional(),
175
+ is_owner: stringToBoolean.optional(),
176
+ created_by: z.string().optional(),
177
+ created_at: z.string().optional(),
178
+ updated_at: z.string().optional()
111
179
  });
112
180
 
181
+ // RoomInfo schema for v2.0.0 - used in auth responses and room management
182
+ export const RoomInfoSchema = z
183
+ .object({
184
+ id: z.string(),
185
+ name: z.string().optional(), // Optional for permissive parsing
186
+ description: z.string().optional().nullable(),
187
+ is_public: z.boolean().optional(), // Optional - defaults to false on backend
188
+ created_by: z.string().optional(), // Optional in case backend doesn't send it yet
189
+ created_at: z.string().optional(),
190
+ updated_at: z.string().optional(),
191
+ is_owner: z.boolean().optional() // Client-side enrichment, may not always be present
192
+ })
193
+ .passthrough(); // Allow extra fields backend might add
194
+
113
195
  export const AgentSchema = z.object({
114
196
  id: z.string(),
115
197
  name: z.string(),
@@ -121,25 +203,28 @@ export const AgentSchema = z.object({
121
203
  image: z.string().optional(),
122
204
  agentType: AgentTypeSchema.optional(),
123
205
  nlpFallback: stringToBoolean.optional(),
124
- webhookUrl: z.string().url().optional()
206
+ webhookUrl: z.string().url().optional(),
207
+ categories: z.array(AgentCategorySchema).max(MAX_CATEGORIES).optional()
125
208
  });
126
209
 
127
210
  // Base message schema
128
- export const BaseMessageSchema = z.object({
129
- type: MessageTypeSchema,
130
- content: z.any().optional(),
131
- content_type: ContentTypeSchema.optional(),
132
- from: z.string().optional(),
133
- to: z.string().optional(),
134
- room: z.string().optional(),
135
- timestamp: z.string().optional(),
136
- data: z.record(z.any()).optional(),
137
- signature: z.string().optional(),
138
- publicKey: z.string().optional(),
139
- reasoning: z.string().optional(),
140
- task_id: z.string().optional(),
141
- id: z.string().optional() // Added for message tracking
142
- });
211
+ export const BaseMessageSchema = z
212
+ .object({
213
+ type: MessageTypeSchema,
214
+ content: z.any().optional(),
215
+ content_type: ContentTypeSchema.optional(),
216
+ from: z.string().optional(),
217
+ to: z.string().optional(),
218
+ room: z.string().optional(),
219
+ timestamp: z.string().optional(),
220
+ data: z.record(z.any()).optional(),
221
+ signature: z.string().optional(),
222
+ publicKey: z.string().optional(),
223
+ reasoning: z.string().optional(),
224
+ task_id: z.string().optional(),
225
+ id: z.string().optional() // Added for message tracking
226
+ })
227
+ .passthrough(); // Allow message-specific fields to pass through
143
228
 
144
229
  // Authentication message schemas
145
230
  export const RequestChallengeMessageSchema = BaseMessageSchema.extend({
@@ -193,8 +278,10 @@ export const AuthMessageSchema = BaseMessageSchema.extend({
193
278
  is_whitelisted: stringToBoolean.optional(),
194
279
  is_admin_whitelisted: stringToBoolean.optional(),
195
280
  rooms: z.array(RoomSchema).optional(),
281
+ private_rooms: z.array(RoomSchema).optional(),
196
282
  private_room_id: z.string().optional(),
197
- cached_auth: stringToBoolean.optional()
283
+ cached_auth: stringToBoolean.optional(),
284
+ max_private_rooms: z.number().optional()
198
285
  })
199
286
  .optional()
200
287
  });
@@ -208,9 +295,10 @@ export const AuthSuccessMessageSchema = BaseMessageSchema.extend({
208
295
  nft_verified: stringToBoolean.optional(),
209
296
  is_whitelisted: stringToBoolean.optional(),
210
297
  is_admin_whitelisted: stringToBoolean.optional(),
211
- rooms: z.array(RoomSchema).optional(),
212
- private_room_id: z.string().optional(),
213
- cached_auth: stringToBoolean.optional()
298
+ rooms: z.array(RoomInfoSchema).optional().nullable(), // v2.0.0: Uses RoomInfo with is_owner field
299
+ private_room_id: z.string().optional(), // DEPRECATED: Use rooms array instead
300
+ cached_auth: stringToBoolean.optional(), // Admin field, optional
301
+ max_private_rooms: z.number().optional() // NEW in v2.0.0: Max rooms user can create
214
302
  })
215
303
  });
216
304
 
@@ -296,6 +384,62 @@ export const AgentSelectedMessageSchema = BaseMessageSchema.extend({
296
384
  })
297
385
  });
298
386
 
387
+ // ============================================================================
388
+ // QUOTE-APPROVE FLOW SCHEMAS (v2.2.0)
389
+ // ============================================================================
390
+
391
+ // Pricing information schema (flexible to handle server variations)
392
+ export const PricingInfoSchema = z
393
+ .object({
394
+ pricePerUnit: z.number().optional(),
395
+ price_per_unit: z.number().optional(),
396
+ priceType: z.string().optional(),
397
+ price_type: z.string().optional(),
398
+ timeUnit: z.string().optional(),
399
+ time_unit: z.string().optional(),
400
+ currency: z.string().optional().default("USDC"),
401
+ network: z.string().optional()
402
+ })
403
+ .transform((data) => ({
404
+ // Normalize to camelCase
405
+ pricePerUnit: data.pricePerUnit ?? data.price_per_unit ?? 0,
406
+ priceType: data.priceType ?? data.price_type,
407
+ timeUnit: data.timeUnit ?? data.time_unit,
408
+ currency: data.currency,
409
+ network: data.network
410
+ }));
411
+
412
+ // Request task message (initiates quote-approve flow)
413
+ export const RequestTaskMessageSchema = BaseMessageSchema.extend({
414
+ type: z.literal("request_task"),
415
+ content: z.string(),
416
+ room: z.string()
417
+ });
418
+
419
+ // Task quote message (server response with pricing)
420
+ export const TaskQuoteMessageSchema = BaseMessageSchema.extend({
421
+ type: z.literal("task_quote"),
422
+ from: z.literal("coordinator"),
423
+ data: z.object({
424
+ task_id: z.string(),
425
+ agent_id: z.string(),
426
+ agent_name: z.string(),
427
+ agent_wallet: z.string(),
428
+ command: z.string(),
429
+ pricing: PricingInfoSchema,
430
+ expires_at: z.string()
431
+ })
432
+ });
433
+
434
+ // Confirm task message (with payment at top level - backend expects msg.payment)
435
+ export const ConfirmTaskMessageSchema = BaseMessageSchema.extend({
436
+ type: z.literal("confirm_task"),
437
+ data: z.object({
438
+ task_id: z.string()
439
+ }),
440
+ payment: z.string().optional() // x402 payment at top level (backend checks msg.Payment)
441
+ });
442
+
299
443
  // System message schemas
300
444
  export const AgentsListMessageSchema = BaseMessageSchema.extend({
301
445
  type: z.literal("agents"),
@@ -361,16 +505,6 @@ export const UnsubscribeResponseSchema = BaseMessageSchema.extend({
361
505
  })
362
506
  });
363
507
 
364
- export const RoomInfoSchema = z.object({
365
- id: z.string(),
366
- name: z.string(),
367
- description: z.string().optional().nullable(),
368
- is_public: z.boolean(),
369
- created_at: z.string(),
370
- updated_at: z.string(),
371
- is_owner: z.boolean()
372
- });
373
-
374
508
  export const ListRoomsResponseSchema = BaseMessageSchema.extend({
375
509
  type: z.literal("list_rooms"),
376
510
  data: z.object({
@@ -378,10 +512,406 @@ export const ListRoomsResponseSchema = BaseMessageSchema.extend({
378
512
  })
379
513
  });
380
514
 
515
+ // ============================================================================
516
+ // ROOM MANAGEMENT SCHEMAS (v2.0.0)
517
+ // Note: Permissive schemas to handle backend changes gracefully
518
+ // ============================================================================
519
+
520
+ // Room CRUD Operations
521
+ export const CreateRoomMessageSchema = z
522
+ .object({
523
+ type: z.literal("create_room"),
524
+ name: z.string(),
525
+ description: z.string().optional(),
526
+ is_public: z.boolean().optional()
527
+ })
528
+ .passthrough(); // Allow extra fields
529
+
530
+ export const UpdateRoomMessageSchema = z
531
+ .object({
532
+ type: z.literal("update_room"),
533
+ room_id: z.string(),
534
+ name: z.string().optional(),
535
+ description: z.string().optional()
536
+ })
537
+ .passthrough();
538
+
539
+ export const DeleteRoomMessageSchema = z
540
+ .object({
541
+ type: z.literal("delete_room"),
542
+ room_id: z.string()
543
+ })
544
+ .passthrough();
545
+
546
+ export const RoomOperationResponseSchema = z
547
+ .object({
548
+ type: z.literal("room_operation_response"),
549
+ data: z
550
+ .object({
551
+ success: z.boolean().optional(), // Optional - consuming code should handle missing as false
552
+ message: z.string().optional(),
553
+ room_id: z.string().optional(),
554
+ room: RoomInfoSchema.optional(),
555
+ max_rooms: z.number().optional(),
556
+ current_count: z.number().optional()
557
+ })
558
+ .passthrough() // Allow extra fields backend might add
559
+ })
560
+ .passthrough();
561
+
562
+ // Room Member Management
563
+ export const RoomMemberInfoSchema = z
564
+ .object({
565
+ user_id: z.string(),
566
+ added_by: z.string().optional(), // May not always be present
567
+ added_at: z.string().optional(),
568
+ role: z.string().optional()
569
+ })
570
+ .passthrough();
571
+
572
+ export const AddRoomMemberMessageSchema = z
573
+ .object({
574
+ type: z.literal("add_room_member"),
575
+ room_id: z.string(),
576
+ user_id: z.string()
577
+ })
578
+ .passthrough();
579
+
580
+ export const RemoveRoomMemberMessageSchema = z
581
+ .object({
582
+ type: z.literal("remove_room_member"),
583
+ room_id: z.string(),
584
+ user_id: z.string()
585
+ })
586
+ .passthrough();
587
+
588
+ export const ListRoomMembersMessageSchema = z
589
+ .object({
590
+ type: z.literal("list_room_members"),
591
+ room_id: z.string()
592
+ })
593
+ .passthrough();
594
+
595
+ export const RoomMembersResponseSchema = z
596
+ .object({
597
+ type: z.literal("room_members_response"),
598
+ data: z
599
+ .object({
600
+ room_id: z.string(),
601
+ members: z.array(RoomMemberInfoSchema).optional() // Optional - consuming code should handle missing as []
602
+ })
603
+ .passthrough()
604
+ })
605
+ .passthrough();
606
+
607
+ export const RoomMemberOperationResponseSchema = z
608
+ .object({
609
+ type: z.literal("room_member_operation_response"),
610
+ data: z
611
+ .object({
612
+ success: z.boolean().optional(),
613
+ message: z.string().optional(),
614
+ room_id: z.string().optional(),
615
+ user_id: z.string().optional(),
616
+ member_count: z.number().optional()
617
+ })
618
+ .passthrough()
619
+ })
620
+ .passthrough();
621
+
622
+ // ============================================================================
623
+ // AGENT ROOM MANAGEMENT SCHEMAS (v2.0.0)
624
+ // Note: Permissive schemas to handle backend changes gracefully
625
+ // ============================================================================
626
+
627
+ export const AgentRoomInfoSchema = z
628
+ .object({
629
+ agent_id: z.string(),
630
+ agent_name: z.string().optional(),
631
+ description: z.string().optional(),
632
+ capabilities: z.array(CapabilitySchema).optional(),
633
+ commands: z.array(CommandSchema).optional(),
634
+ image: z.string().optional(),
635
+ status: z.string().optional(),
636
+ added_by: z.string().optional(),
637
+ added_at: z.string().optional(),
638
+ categories: z.array(AgentCategorySchema).max(MAX_CATEGORIES).optional()
639
+ })
640
+ .passthrough();
641
+
642
+ export const AddAgentToRoomMessageSchema = z
643
+ .object({
644
+ type: z.literal("add_agent_to_room"),
645
+ room_id: z.string(),
646
+ agent_id: z.string()
647
+ })
648
+ .passthrough();
649
+
650
+ export const RemoveAgentFromRoomMessageSchema = z
651
+ .object({
652
+ type: z.literal("remove_agent_from_room"),
653
+ room_id: z.string(),
654
+ agent_id: z.string()
655
+ })
656
+ .passthrough();
657
+
658
+ export const ListRoomAgentsMessageSchema = z
659
+ .object({
660
+ type: z.literal("list_room_agents"),
661
+ room_id: z.string()
662
+ })
663
+ .passthrough();
664
+
665
+ export const ListAvailableAgentsMessageSchema = z
666
+ .object({
667
+ type: z.literal("list_available_agents"),
668
+ room_id: z.string()
669
+ })
670
+ .passthrough();
671
+
672
+ export const RoomAgentsResponseSchema = z
673
+ .object({
674
+ type: z.literal("room_agents_response"),
675
+ data: z
676
+ .object({
677
+ room_id: z.string(),
678
+ agents: z.array(AgentRoomInfoSchema).optional() // Optional - consuming code should handle missing as []
679
+ })
680
+ .passthrough()
681
+ })
682
+ .passthrough();
683
+
684
+ export const AvailableAgentsResponseSchema = z
685
+ .object({
686
+ type: z.literal("available_agents_response"),
687
+ data: z
688
+ .object({
689
+ agents: z.array(AgentRoomInfoSchema).optional()
690
+ })
691
+ .passthrough()
692
+ })
693
+ .passthrough();
694
+
695
+ export const AgentRoomOperationResponseSchema = z
696
+ .object({
697
+ type: z.literal("agent_room_operation_response"),
698
+ data: z
699
+ .object({
700
+ success: z.boolean().optional(),
701
+ message: z.string().optional(),
702
+ room_id: z.string().optional(),
703
+ agent_id: z.string().optional(),
704
+ agent_count: z.number().optional()
705
+ })
706
+ .passthrough()
707
+ })
708
+ .passthrough();
709
+
710
+ export const AgentStatusUpdateMessageSchema = z
711
+ .object({
712
+ type: z.literal("agent_status_update"),
713
+ data: z
714
+ .object({
715
+ room_id: z.string(),
716
+ agent_id: z.string(),
717
+ status: z.string(),
718
+ agent: AgentRoomInfoSchema.optional()
719
+ })
720
+ .passthrough()
721
+ })
722
+ .passthrough();
723
+
724
+ // Room Ping System
725
+ export const RoomPingMessageSchema = z
726
+ .object({
727
+ type: z.literal("room_ping"),
728
+ room_id: z.string()
729
+ })
730
+ .passthrough();
731
+
732
+ export const RoomPongResponseSchema = z
733
+ .object({
734
+ type: z.literal("room_pong"),
735
+ data: z
736
+ .object({
737
+ room_id: z.string(),
738
+ live_count: z.number().optional(), // Optional - consuming code should handle missing as 0
739
+ timestamp: z.string()
740
+ })
741
+ .passthrough()
742
+ })
743
+ .passthrough();
744
+
745
+ // Admin agent info (admin only)
746
+ export const AdminAgentInfoSchema = z
747
+ .object({
748
+ agent_id: z.string(),
749
+ agent_name: z.string(),
750
+ creator: z.string(),
751
+ creator_name: z.string().optional().nullable(),
752
+ description: z.string().optional().nullable(),
753
+ image_url: z.string().optional().nullable(),
754
+ is_online: z.boolean().optional(),
755
+ is_active: z.boolean().optional(),
756
+ is_verified: z.boolean().optional(),
757
+ is_public: z.boolean().optional(),
758
+ is_banned: z.boolean().optional(),
759
+ created_at: z.string().optional().nullable()
760
+ })
761
+ .passthrough();
762
+
763
+ export type AdminAgentInfo = z.infer<typeof AdminAgentInfoSchema>;
764
+
765
+ // List all agents request (client → server, admin only)
766
+ export const ListAllAgentsMessageSchema = z
767
+ .object({
768
+ type: z.literal("list_all_agents"),
769
+ request_id: z.string().optional(),
770
+ filter: z.string().optional(),
771
+ offset: z.number().optional(),
772
+ limit: z.number().optional()
773
+ })
774
+ .passthrough();
775
+
776
+ export type ListAllAgentsMessage = z.infer<typeof ListAllAgentsMessageSchema>;
777
+
778
+ // All agents response (server → client, admin only)
779
+ export const AllAgentsResponseSchema = z
780
+ .object({
781
+ type: z.literal("all_agents_response"),
782
+ request_id: z.string().optional(),
783
+ data: z
784
+ .object({
785
+ agents: z.array(AdminAgentInfoSchema),
786
+ total: z.number(),
787
+ offset: z.number(),
788
+ limit: z.number(),
789
+ has_more: z.boolean(),
790
+ filter: z.string().optional()
791
+ })
792
+ .passthrough()
793
+ })
794
+ .passthrough();
795
+
796
+ export type AllAgentsResponse = z.infer<typeof AllAgentsResponseSchema>;
797
+
798
+ // User count data schema
799
+ export const UserCountDataSchema = z.object({
800
+ count: z.number(),
801
+ timestamp: z.string()
802
+ });
803
+
804
+ export type UserCountData = z.infer<typeof UserCountDataSchema>;
805
+
806
+ // User count message (server → client, admin only)
807
+ export const UserCountMessageSchema = z
808
+ .object({
809
+ type: z.literal("user_count"),
810
+ data: UserCountDataSchema.passthrough()
811
+ })
812
+ .passthrough();
813
+
814
+ export type UserCountMessage = z.infer<typeof UserCountMessageSchema>;
815
+
816
+ // User authenticated message (server → client)
817
+ export const UserAuthenticatedMessageSchema = z
818
+ .object({
819
+ type: z.literal("user_authenticated"),
820
+ data: z
821
+ .object({
822
+ wallet: z.string()
823
+ })
824
+ .passthrough()
825
+ })
826
+ .passthrough();
827
+
828
+ export type UserAuthenticatedMessage = z.infer<typeof UserAuthenticatedMessageSchema>;
829
+
830
+ // Rate limit notification (server → client)
831
+ export const RateLimitNotificationMessageSchema = z
832
+ .object({
833
+ type: z.literal("rate_limit_notification"),
834
+ data: z
835
+ .object({
836
+ title: z.string(),
837
+ message: z.string(),
838
+ cta_text: z.string().optional(),
839
+ cta_link: z.string().optional(),
840
+ message_type: z.string(),
841
+ limit_type: z.string(),
842
+ reset_at: z.string().optional()
843
+ })
844
+ .passthrough()
845
+ })
846
+ .passthrough();
847
+
848
+ export type RateLimitNotificationMessage = z.infer<typeof RateLimitNotificationMessageSchema>;
849
+
850
+ // Agent details request (client → server)
851
+ export const GetAgentDetailsMessageSchema = z
852
+ .object({
853
+ type: z.literal("get_agent_details"),
854
+ agent_id: z.string(),
855
+ request_id: z.string().optional()
856
+ })
857
+ .passthrough();
858
+
859
+ export type GetAgentDetailsMessage = z.infer<typeof GetAgentDetailsMessageSchema>;
860
+
861
+ // Agent details response (server → client)
862
+ export const AgentDetailsResponseMessageSchema = z
863
+ .object({
864
+ type: z.literal("agent_details_response"),
865
+ request_id: z.string().optional(),
866
+ data: z
867
+ .object({
868
+ agent: AgentRoomInfoSchema
869
+ })
870
+ .passthrough()
871
+ .optional(),
872
+ error: z.string().optional()
873
+ })
874
+ .passthrough();
875
+
876
+ export type AgentDetailsResponseMessage = z.infer<typeof AgentDetailsResponseMessageSchema>;
877
+
878
+ // User Preferences (set_user_preferences)
879
+ export const SetUserPreferencesDataSchema = z.object({
880
+ max_price_per_request: z.number().min(0).optional().nullable()
881
+ });
882
+
883
+ export const SetUserPreferencesMessageSchema = z
884
+ .object({
885
+ type: z.literal("set_user_preferences"),
886
+ data: SetUserPreferencesDataSchema
887
+ })
888
+ .passthrough();
889
+
890
+ export type SetUserPreferencesData = z.infer<typeof SetUserPreferencesDataSchema>;
891
+ export type SetUserPreferencesMessage = z.infer<typeof SetUserPreferencesMessageSchema>;
892
+
893
+ // User Preferences Response (user_preferences_updated)
894
+ export const UserPreferencesUpdatedDataSchema = z.object({
895
+ success: z.boolean(),
896
+ message: z.string(),
897
+ max_price_per_request: z.number().optional().nullable()
898
+ });
899
+
900
+ export const UserPreferencesUpdatedMessageSchema = z
901
+ .object({
902
+ type: z.literal("user_preferences_updated"),
903
+ data: UserPreferencesUpdatedDataSchema
904
+ })
905
+ .passthrough();
906
+
907
+ export type UserPreferencesUpdatedData = z.infer<typeof UserPreferencesUpdatedDataSchema>;
908
+ export type UserPreferencesUpdatedMessage = z.infer<typeof UserPreferencesUpdatedMessageSchema>;
909
+
381
910
  // Union of all INCOMING message schemas for validation
382
911
  // Note: Outgoing message schemas (Subscribe, Unsubscribe, ListRooms) are excluded
383
912
  // as they share the same type values with their response counterparts
384
913
  export const AnyMessageSchema = z.discriminatedUnion("type", [
914
+ // Authentication & Registration
385
915
  RequestChallengeMessageSchema,
386
916
  ChallengeMessageSchema,
387
917
  CheckCachedAuthMessageSchema,
@@ -391,18 +921,50 @@ export const AnyMessageSchema = z.discriminatedUnion("type", [
391
921
  AuthErrorMessageSchema,
392
922
  RegisterMessageSchema,
393
923
  RegistrationSuccessMessageSchema,
924
+
925
+ // Communication
394
926
  UserMessageSchema,
395
927
  TaskMessageSchema,
396
928
  TaskResponseMessageSchema,
397
929
  AgentSelectedMessageSchema,
398
930
  AgentsListMessageSchema,
931
+
932
+ // Quote-Approve Flow (v2.2.0)
933
+ TaskQuoteMessageSchema,
934
+
935
+ // System
399
936
  ErrorMessageSchema,
400
937
  PingMessageSchema,
401
938
  PongMessageSchema,
402
- // Only response schemas for room operations (not outgoing request schemas)
939
+
940
+ // Room Subscription (Basic)
403
941
  SubscribeResponseSchema,
404
942
  UnsubscribeResponseSchema,
405
- ListRoomsResponseSchema
943
+ ListRoomsResponseSchema,
944
+
945
+ // Room Management Responses (v2.0.0)
946
+ RoomOperationResponseSchema,
947
+ RoomMemberOperationResponseSchema,
948
+ RoomMembersResponseSchema,
949
+
950
+ // Agent Room Management Responses (v2.0.0)
951
+ AgentRoomOperationResponseSchema,
952
+ RoomAgentsResponseSchema,
953
+ AvailableAgentsResponseSchema,
954
+ AgentStatusUpdateMessageSchema,
955
+
956
+ // Room Ping System (v2.0.0)
957
+ RoomPongResponseSchema,
958
+
959
+ // Admin Messages
960
+ AllAgentsResponseSchema,
961
+ UserCountMessageSchema,
962
+ UserAuthenticatedMessageSchema,
963
+ RateLimitNotificationMessageSchema,
964
+ AgentDetailsResponseMessageSchema,
965
+
966
+ // User Preferences
967
+ UserPreferencesUpdatedMessageSchema
406
968
  ]);
407
969
 
408
970
  // Type inference from schemas
@@ -432,6 +994,13 @@ export type TaskMessage = z.infer<typeof TaskMessageSchema>;
432
994
  export type TaskResponseMessage = z.infer<typeof TaskResponseMessageSchema>;
433
995
  export type AgentSelectedMessage = z.infer<typeof AgentSelectedMessageSchema>;
434
996
  export type AgentsListMessage = z.infer<typeof AgentsListMessageSchema>;
997
+
998
+ // Quote-Approve Flow Types (v2.2.0)
999
+ export type PricingInfo = z.infer<typeof PricingInfoSchema>;
1000
+ export type RequestTaskMessage = z.infer<typeof RequestTaskMessageSchema>;
1001
+ export type TaskQuoteMessage = z.infer<typeof TaskQuoteMessageSchema>;
1002
+ export type ConfirmTaskMessage = z.infer<typeof ConfirmTaskMessageSchema>;
1003
+
435
1004
  export type ErrorMessage = z.infer<typeof ErrorMessageSchema>;
436
1005
  export type PingMessage = z.infer<typeof PingMessageSchema>;
437
1006
  export type PongMessage = z.infer<typeof PongMessageSchema>;
@@ -443,6 +1012,33 @@ export type UnsubscribeResponse = z.infer<typeof UnsubscribeResponseSchema>;
443
1012
  export type RoomInfo = z.infer<typeof RoomInfoSchema>;
444
1013
  export type ListRoomsResponse = z.infer<typeof ListRoomsResponseSchema>;
445
1014
 
1015
+ // Room Management Types (v2.0.0)
1016
+ export type CreateRoomMessage = z.infer<typeof CreateRoomMessageSchema>;
1017
+ export type UpdateRoomMessage = z.infer<typeof UpdateRoomMessageSchema>;
1018
+ export type DeleteRoomMessage = z.infer<typeof DeleteRoomMessageSchema>;
1019
+ export type RoomOperationResponse = z.infer<typeof RoomOperationResponseSchema>;
1020
+ export type RoomMemberInfo = z.infer<typeof RoomMemberInfoSchema>;
1021
+ export type AddRoomMemberMessage = z.infer<typeof AddRoomMemberMessageSchema>;
1022
+ export type RemoveRoomMemberMessage = z.infer<typeof RemoveRoomMemberMessageSchema>;
1023
+ export type ListRoomMembersMessage = z.infer<typeof ListRoomMembersMessageSchema>;
1024
+ export type RoomMembersResponse = z.infer<typeof RoomMembersResponseSchema>;
1025
+ export type RoomMemberOperationResponse = z.infer<typeof RoomMemberOperationResponseSchema>;
1026
+
1027
+ // Agent Room Management Types (v2.0.0)
1028
+ export type AgentRoomInfo = z.infer<typeof AgentRoomInfoSchema>;
1029
+ export type AddAgentToRoomMessage = z.infer<typeof AddAgentToRoomMessageSchema>;
1030
+ export type RemoveAgentFromRoomMessage = z.infer<typeof RemoveAgentFromRoomMessageSchema>;
1031
+ export type ListRoomAgentsMessage = z.infer<typeof ListRoomAgentsMessageSchema>;
1032
+ export type ListAvailableAgentsMessage = z.infer<typeof ListAvailableAgentsMessageSchema>;
1033
+ export type RoomAgentsResponse = z.infer<typeof RoomAgentsResponseSchema>;
1034
+ export type AvailableAgentsResponse = z.infer<typeof AvailableAgentsResponseSchema>;
1035
+ export type AgentRoomOperationResponse = z.infer<typeof AgentRoomOperationResponseSchema>;
1036
+ export type AgentStatusUpdateMessage = z.infer<typeof AgentStatusUpdateMessageSchema>;
1037
+
1038
+ // Room Ping Types (v2.0.0)
1039
+ export type RoomPingMessage = z.infer<typeof RoomPingMessageSchema>;
1040
+ export type RoomPongResponse = z.infer<typeof RoomPongResponseSchema>;
1041
+
446
1042
  export type AnyMessage = z.infer<typeof AnyMessageSchema>;
447
1043
 
448
1044
  // Type guards using Zod parse
@@ -551,6 +1147,36 @@ export function createListRooms(): ListRoomsMessage {
551
1147
  });
552
1148
  }
553
1149
 
1150
+ // Quote-Approve Flow factory functions (v2.2.0)
1151
+ export function createRequestTask(content: string, room: string): RequestTaskMessage {
1152
+ return RequestTaskMessageSchema.parse({
1153
+ type: "request_task",
1154
+ content,
1155
+ room
1156
+ });
1157
+ }
1158
+
1159
+ export function createConfirmTask(taskId: string, x402Payment?: string): ConfirmTaskMessage {
1160
+ return ConfirmTaskMessageSchema.parse({
1161
+ type: "confirm_task",
1162
+ data: {
1163
+ task_id: taskId
1164
+ },
1165
+ ...(x402Payment && { payment: x402Payment }) // payment at top level for backend
1166
+ });
1167
+ }
1168
+
1169
+ export function createSetUserPreferences(
1170
+ maxPricePerRequest?: number | null
1171
+ ): SetUserPreferencesMessage {
1172
+ return SetUserPreferencesMessageSchema.parse({
1173
+ type: "set_user_preferences",
1174
+ data: {
1175
+ max_price_per_request: maxPricePerRequest
1176
+ }
1177
+ });
1178
+ }
1179
+
554
1180
  // Validation helper
555
1181
  export function validateMessage(message: unknown): AnyMessage {
556
1182
  return AnyMessageSchema.parse(message);
@@ -559,12 +1185,21 @@ export function validateMessage(message: unknown): AnyMessage {
559
1185
  // Safe parse helper
560
1186
  export function safeParseMessage(message: unknown): {
561
1187
  success: boolean;
562
- data?: AnyMessage;
1188
+ data?: AnyMessage | BaseMessage;
563
1189
  error?: z.ZodError;
564
1190
  } {
1191
+ // Try specific message schemas first
565
1192
  const result = AnyMessageSchema.safeParse(message);
566
1193
  if (result.success) {
567
1194
  return { success: true, data: result.data };
568
1195
  }
1196
+
1197
+ // Fall back to basic BaseMessage schema for unknown message types
1198
+ // This allows the SDK to be more resilient to backend changes
1199
+ const fallbackResult = BaseMessageSchema.safeParse(message);
1200
+ if (fallbackResult.success) {
1201
+ return { success: true, data: fallbackResult.data as BaseMessage };
1202
+ }
1203
+
569
1204
  return { success: false, error: result.error };
570
1205
  }