@teneo-protocol/sdk 2.0.0 → 2.2.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 (329) 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 +1 -0
  9. package/.github/workflows/push-to-main.yml +1 -1
  10. package/.github/workflows/top-issue.yml +102 -0
  11. package/CHANGELOG.md +69 -0
  12. package/CONCEPTS.md +747 -0
  13. package/README.md +178 -8
  14. package/dist/constants.js +8 -8
  15. package/dist/constants.js.map +1 -1
  16. package/dist/core/websocket-client.d.ts +15 -3
  17. package/dist/core/websocket-client.d.ts.map +1 -1
  18. package/dist/core/websocket-client.js +52 -13
  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.map +1 -1
  29. package/dist/handlers/message-handlers/agent-room-operation-response-handler.js +2 -5
  30. package/dist/handlers/message-handlers/agent-room-operation-response-handler.js.map +1 -1
  31. package/dist/handlers/message-handlers/agent-selected-handler.js +2 -5
  32. package/dist/handlers/message-handlers/agent-selected-handler.js.map +1 -1
  33. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts +783 -0
  34. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts.map +1 -1
  35. package/dist/handlers/message-handlers/agent-status-update-handler.js +2 -5
  36. package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -1
  37. package/dist/handlers/message-handlers/agents-list-handler.js +2 -5
  38. package/dist/handlers/message-handlers/agents-list-handler.js.map +1 -1
  39. package/dist/handlers/message-handlers/all-agents-response-handler.d.ts +439 -0
  40. package/dist/handlers/message-handlers/all-agents-response-handler.d.ts.map +1 -0
  41. package/dist/handlers/message-handlers/all-agents-response-handler.js +36 -0
  42. package/dist/handlers/message-handlers/all-agents-response-handler.js.map +1 -0
  43. package/dist/handlers/message-handlers/auth-error-handler.js +2 -5
  44. package/dist/handlers/message-handlers/auth-error-handler.js.map +1 -1
  45. package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -1
  46. package/dist/handlers/message-handlers/auth-message-handler.js +6 -5
  47. package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -1
  48. package/dist/handlers/message-handlers/auth-required-handler.js +2 -5
  49. package/dist/handlers/message-handlers/auth-required-handler.js.map +1 -1
  50. package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -1
  51. package/dist/handlers/message-handlers/auth-success-handler.js +6 -5
  52. package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -1
  53. package/dist/handlers/message-handlers/base-handler.d.ts +4 -4
  54. package/dist/handlers/message-handlers/base-handler.d.ts.map +1 -1
  55. package/dist/handlers/message-handlers/base-handler.js +3 -1
  56. package/dist/handlers/message-handlers/base-handler.js.map +1 -1
  57. package/dist/handlers/message-handlers/challenge-handler.js +3 -2
  58. package/dist/handlers/message-handlers/challenge-handler.js.map +1 -1
  59. package/dist/handlers/message-handlers/error-message-handler.js +2 -5
  60. package/dist/handlers/message-handlers/error-message-handler.js.map +1 -1
  61. package/dist/handlers/message-handlers/index.d.ts +6 -0
  62. package/dist/handlers/message-handlers/index.d.ts.map +1 -1
  63. package/dist/handlers/message-handlers/index.js +33 -1
  64. package/dist/handlers/message-handlers/index.js.map +1 -1
  65. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts +783 -0
  66. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -1
  67. package/dist/handlers/message-handlers/list-available-agents-handler.js +2 -5
  68. package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -1
  69. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +783 -0
  70. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts.map +1 -1
  71. package/dist/handlers/message-handlers/list-room-agents-handler.js +2 -5
  72. package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -1
  73. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts +4 -201
  74. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
  75. package/dist/handlers/message-handlers/list-rooms-response-handler.js +5 -7
  76. package/dist/handlers/message-handlers/list-rooms-response-handler.js.map +1 -1
  77. package/dist/handlers/message-handlers/ping-pong-handler.js +4 -10
  78. package/dist/handlers/message-handlers/ping-pong-handler.js.map +1 -1
  79. package/dist/handlers/message-handlers/rate-limit-notification-handler.d.ts +94 -0
  80. package/dist/handlers/message-handlers/rate-limit-notification-handler.d.ts.map +1 -0
  81. package/dist/handlers/message-handlers/rate-limit-notification-handler.js +35 -0
  82. package/dist/handlers/message-handlers/rate-limit-notification-handler.js.map +1 -0
  83. package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -1
  84. package/dist/handlers/message-handlers/regular-message-handler.js +4 -6
  85. package/dist/handlers/message-handlers/regular-message-handler.js.map +1 -1
  86. package/dist/handlers/message-handlers/room-operation-response-handler.d.ts.map +1 -1
  87. package/dist/handlers/message-handlers/room-operation-response-handler.js +2 -5
  88. package/dist/handlers/message-handlers/room-operation-response-handler.js.map +1 -1
  89. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
  90. package/dist/handlers/message-handlers/subscribe-response-handler.js +4 -6
  91. package/dist/handlers/message-handlers/subscribe-response-handler.js.map +1 -1
  92. package/dist/handlers/message-handlers/task-quote-handler.d.ts +14 -0
  93. package/dist/handlers/message-handlers/task-quote-handler.d.ts.map +1 -0
  94. package/dist/handlers/message-handlers/task-quote-handler.js +29 -0
  95. package/dist/handlers/message-handlers/task-quote-handler.js.map +1 -0
  96. package/dist/handlers/message-handlers/task-response-handler.js +2 -5
  97. package/dist/handlers/message-handlers/task-response-handler.js.map +1 -1
  98. package/dist/handlers/message-handlers/types.d.ts +21 -9
  99. package/dist/handlers/message-handlers/types.d.ts.map +1 -1
  100. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
  101. package/dist/handlers/message-handlers/unsubscribe-response-handler.js +4 -6
  102. package/dist/handlers/message-handlers/unsubscribe-response-handler.js.map +1 -1
  103. package/dist/handlers/message-handlers/user-authenticated-handler.d.ts +40 -0
  104. package/dist/handlers/message-handlers/user-authenticated-handler.d.ts.map +1 -0
  105. package/dist/handlers/message-handlers/user-authenticated-handler.js +28 -0
  106. package/dist/handlers/message-handlers/user-authenticated-handler.js.map +1 -0
  107. package/dist/handlers/message-handlers/user-count-handler.d.ts +49 -0
  108. package/dist/handlers/message-handlers/user-count-handler.d.ts.map +1 -0
  109. package/dist/handlers/message-handlers/user-count-handler.js +31 -0
  110. package/dist/handlers/message-handlers/user-count-handler.js.map +1 -0
  111. package/dist/handlers/webhook-handler.d.ts +1 -1
  112. package/dist/handlers/webhook-handler.d.ts.map +1 -1
  113. package/dist/handlers/webhook-handler.js +14 -5
  114. package/dist/handlers/webhook-handler.js.map +1 -1
  115. package/dist/index.d.ts +7 -2
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.js +20 -3
  118. package/dist/index.js.map +1 -1
  119. package/dist/managers/admin-manager.d.ts +116 -0
  120. package/dist/managers/admin-manager.d.ts.map +1 -0
  121. package/dist/managers/admin-manager.js +169 -0
  122. package/dist/managers/admin-manager.js.map +1 -0
  123. package/dist/managers/agent-registry.d.ts +52 -1
  124. package/dist/managers/agent-registry.d.ts.map +1 -1
  125. package/dist/managers/agent-registry.js +145 -6
  126. package/dist/managers/agent-registry.js.map +1 -1
  127. package/dist/managers/agent-room-manager.d.ts +1 -7
  128. package/dist/managers/agent-room-manager.d.ts.map +1 -1
  129. package/dist/managers/agent-room-manager.js +83 -36
  130. package/dist/managers/agent-room-manager.js.map +1 -1
  131. package/dist/managers/connection-manager.js +2 -0
  132. package/dist/managers/connection-manager.js.map +1 -1
  133. package/dist/managers/index.d.ts +2 -1
  134. package/dist/managers/index.d.ts.map +1 -1
  135. package/dist/managers/index.js +3 -1
  136. package/dist/managers/index.js.map +1 -1
  137. package/dist/managers/message-router.d.ts +56 -5
  138. package/dist/managers/message-router.d.ts.map +1 -1
  139. package/dist/managers/message-router.js +155 -8
  140. package/dist/managers/message-router.js.map +1 -1
  141. package/dist/managers/room-management-manager.d.ts.map +1 -1
  142. package/dist/managers/room-management-manager.js +9 -7
  143. package/dist/managers/room-management-manager.js.map +1 -1
  144. package/dist/managers/room-manager.d.ts +7 -5
  145. package/dist/managers/room-manager.d.ts.map +1 -1
  146. package/dist/managers/room-manager.js +14 -10
  147. package/dist/managers/room-manager.js.map +1 -1
  148. package/dist/payments/index.d.ts +5 -0
  149. package/dist/payments/index.d.ts.map +1 -0
  150. package/dist/payments/index.js +21 -0
  151. package/dist/payments/index.js.map +1 -0
  152. package/dist/payments/payment-client.d.ts +74 -0
  153. package/dist/payments/payment-client.d.ts.map +1 -0
  154. package/dist/payments/payment-client.js +207 -0
  155. package/dist/payments/payment-client.js.map +1 -0
  156. package/dist/teneo-sdk.d.ts +135 -21
  157. package/dist/teneo-sdk.d.ts.map +1 -1
  158. package/dist/teneo-sdk.js +268 -26
  159. package/dist/teneo-sdk.js.map +1 -1
  160. package/dist/types/categories.d.ts +22 -0
  161. package/dist/types/categories.d.ts.map +1 -0
  162. package/dist/types/categories.js +40 -0
  163. package/dist/types/categories.js.map +1 -0
  164. package/dist/types/config.d.ts +79 -8
  165. package/dist/types/config.d.ts.map +1 -1
  166. package/dist/types/config.js +62 -5
  167. package/dist/types/config.js.map +1 -1
  168. package/dist/types/error-codes.d.ts +8 -0
  169. package/dist/types/error-codes.d.ts.map +1 -1
  170. package/dist/types/error-codes.js +9 -0
  171. package/dist/types/error-codes.js.map +1 -1
  172. package/dist/types/events.d.ts +44 -0
  173. package/dist/types/events.d.ts.map +1 -1
  174. package/dist/types/events.js +19 -1
  175. package/dist/types/events.js.map +1 -1
  176. package/dist/types/index.d.ts +3 -2
  177. package/dist/types/index.d.ts.map +1 -1
  178. package/dist/types/index.js +33 -3
  179. package/dist/types/index.js.map +1 -1
  180. package/dist/types/messages.d.ts +11203 -407
  181. package/dist/types/messages.d.ts.map +1 -1
  182. package/dist/types/messages.js +251 -8
  183. package/dist/types/messages.js.map +1 -1
  184. package/dist/utils/bounded-queue.d.ts.map +1 -1
  185. package/dist/utils/bounded-queue.js +5 -2
  186. package/dist/utils/bounded-queue.js.map +1 -1
  187. package/dist/utils/circuit-breaker.js +11 -4
  188. package/dist/utils/circuit-breaker.js.map +1 -1
  189. package/dist/utils/deduplication-cache.js +3 -1
  190. package/dist/utils/deduplication-cache.js.map +1 -1
  191. package/dist/utils/event-waiter.d.ts +3 -3
  192. package/dist/utils/event-waiter.d.ts.map +1 -1
  193. package/dist/utils/index.d.ts +1 -0
  194. package/dist/utils/index.d.ts.map +1 -1
  195. package/dist/utils/index.js +4 -1
  196. package/dist/utils/index.js.map +1 -1
  197. package/dist/utils/logger.js.map +1 -1
  198. package/dist/utils/pricing-resolver.d.ts +26 -0
  199. package/dist/utils/pricing-resolver.d.ts.map +1 -0
  200. package/dist/utils/pricing-resolver.js +85 -0
  201. package/dist/utils/pricing-resolver.js.map +1 -0
  202. package/dist/utils/rate-limiter.d.ts.map +1 -1
  203. package/dist/utils/rate-limiter.js +6 -0
  204. package/dist/utils/rate-limiter.js.map +1 -1
  205. package/dist/utils/retry-policy.js +1 -0
  206. package/dist/utils/retry-policy.js.map +1 -1
  207. package/dist/utils/secure-private-key.js +3 -1
  208. package/dist/utils/secure-private-key.js.map +1 -1
  209. package/dist/utils/signature-verifier.d.ts.map +1 -1
  210. package/dist/utils/signature-verifier.js +3 -1
  211. package/dist/utils/signature-verifier.js.map +1 -1
  212. package/examples/.env.example +1 -1
  213. package/examples/agent-room-management-example.ts +10 -9
  214. package/examples/basic-usage.ts +3 -4
  215. package/examples/claude-agent-x-follower/.env.example +1 -1
  216. package/examples/claude-agent-x-follower/QUICKSTART.md +2 -2
  217. package/examples/claude-agent-x-follower/README.md +2 -2
  218. package/examples/claude-agent-x-follower/index.ts +120 -96
  219. package/examples/n8n-teneo/.env.example +1 -1
  220. package/examples/n8n-teneo/README.md +1 -1
  221. package/examples/n8n-teneo/index.ts +54 -44
  222. package/examples/nestjs-dashboard/.env.example +11 -0
  223. package/examples/nestjs-dashboard/README.md +297 -0
  224. package/examples/nestjs-dashboard/nest-cli.json +10 -0
  225. package/examples/nestjs-dashboard/package.json +44 -0
  226. package/examples/nestjs-dashboard/pnpm-lock.yaml +3079 -0
  227. package/examples/nestjs-dashboard/src/app.controller.ts +24 -0
  228. package/examples/nestjs-dashboard/src/app.module.ts +15 -0
  229. package/examples/nestjs-dashboard/src/main.ts +32 -0
  230. package/examples/nestjs-dashboard/src/public/dashboard.html +1144 -0
  231. package/examples/nestjs-dashboard/src/teneo/agents.controller.ts +54 -0
  232. package/examples/nestjs-dashboard/src/teneo/events.controller.ts +65 -0
  233. package/examples/nestjs-dashboard/src/teneo/messages.controller.ts +47 -0
  234. package/examples/nestjs-dashboard/src/teneo/rooms.controller.ts +258 -0
  235. package/examples/nestjs-dashboard/src/teneo/teneo.module.ts +13 -0
  236. package/examples/nestjs-dashboard/src/teneo/teneo.service.ts +484 -0
  237. package/examples/nestjs-dashboard/tsconfig.json +22 -0
  238. package/examples/openai-teneo/.env.example +1 -1
  239. package/examples/openai-teneo/README.md +2 -2
  240. package/examples/openai-teneo/index.ts +82 -71
  241. package/examples/production-dashboard/.env.example +1 -1
  242. package/examples/production-dashboard/README.md +1 -1
  243. package/examples/production-dashboard/server.ts +2 -2
  244. package/examples/room-management-example.ts +5 -8
  245. package/examples/usage/.env.example +1 -1
  246. package/examples/usage/01-connect.ts +3 -4
  247. package/examples/usage/02-list-agents.ts +2 -3
  248. package/examples/usage/03-pick-agent.ts +2 -3
  249. package/examples/usage/04-find-by-capability.ts +2 -3
  250. package/examples/usage/05-webhook-example.ts +2 -3
  251. package/examples/usage/06-simple-api-server.ts +2 -3
  252. package/examples/usage/07-event-listener.ts +2 -3
  253. package/examples/webhook-integration.ts +1 -1
  254. package/examples/x-influencer-battle-server.ts +2 -2
  255. package/package.json +4 -1
  256. package/src/core/websocket-client.test.ts +8 -3
  257. package/src/core/websocket-client.ts +36 -6
  258. package/src/formatters/response-formatter.test.ts +2 -0
  259. package/src/formatters/response-formatter.ts +3 -3
  260. package/src/handlers/message-handlers/agent-details-response-handler.ts +42 -0
  261. package/src/handlers/message-handlers/agent-room-operation-response-handler.ts +2 -8
  262. package/src/handlers/message-handlers/agent-status-update-handler.ts +3 -9
  263. package/src/handlers/message-handlers/all-agents-response-handler.ts +39 -0
  264. package/src/handlers/message-handlers/auth-message-handler.ts +5 -0
  265. package/src/handlers/message-handlers/auth-success-handler.ts +6 -1
  266. package/src/handlers/message-handlers/base-handler.ts +20 -7
  267. package/src/handlers/message-handlers/index.ts +34 -0
  268. package/src/handlers/message-handlers/list-room-agents-handler.ts +2 -5
  269. package/src/handlers/message-handlers/list-rooms-response-handler.ts +6 -4
  270. package/src/handlers/message-handlers/rate-limit-notification-handler.ts +45 -0
  271. package/src/handlers/message-handlers/regular-message-handler.ts +3 -2
  272. package/src/handlers/message-handlers/room-operation-response-handler.ts +3 -6
  273. package/src/handlers/message-handlers/subscribe-response-handler.ts +12 -2
  274. package/src/handlers/message-handlers/task-quote-handler.ts +31 -0
  275. package/src/handlers/message-handlers/types.ts +37 -9
  276. package/src/handlers/message-handlers/unsubscribe-response-handler.ts +12 -2
  277. package/src/handlers/message-handlers/user-authenticated-handler.ts +31 -0
  278. package/src/handlers/message-handlers/user-count-handler.ts +34 -0
  279. package/src/handlers/webhook-handler.test.ts +3 -2
  280. package/src/handlers/webhook-handler.ts +13 -7
  281. package/src/index.ts +22 -1
  282. package/src/managers/admin-manager.ts +249 -0
  283. package/src/managers/agent-registry.test.ts +2 -1
  284. package/src/managers/agent-registry.ts +170 -2
  285. package/src/managers/agent-room-manager.ts +98 -42
  286. package/src/managers/index.ts +13 -1
  287. package/src/managers/message-router.ts +215 -17
  288. package/src/managers/room-management-manager.ts +4 -7
  289. package/src/managers/room-manager.ts +11 -15
  290. package/src/payments/index.ts +22 -0
  291. package/src/payments/payment-client.ts +240 -0
  292. package/src/teneo-sdk.ts +302 -27
  293. package/src/types/categories.ts +45 -0
  294. package/src/types/config.ts +70 -2
  295. package/src/types/error-codes.ts +10 -0
  296. package/src/types/events.test.ts +1 -0
  297. package/src/types/events.ts +43 -0
  298. package/src/types/index.ts +56 -0
  299. package/src/types/messages.test.ts +2 -1
  300. package/src/types/messages.ts +309 -6
  301. package/src/utils/bounded-queue.test.ts +1 -1
  302. package/src/utils/bounded-queue.ts +2 -1
  303. package/src/utils/circuit-breaker.test.ts +1 -1
  304. package/src/utils/deduplication-cache.test.ts +1 -1
  305. package/src/utils/event-waiter.test.ts +1 -1
  306. package/src/utils/event-waiter.ts +3 -3
  307. package/src/utils/index.ts +7 -0
  308. package/src/utils/logger.ts +8 -8
  309. package/src/utils/pricing-resolver.ts +128 -0
  310. package/src/utils/rate-limiter.test.ts +1 -1
  311. package/src/utils/rate-limiter.ts +1 -0
  312. package/src/utils/signature-verifier.test.ts +2 -2
  313. package/src/utils/signature-verifier.ts +3 -2
  314. package/tests/.env.example +7 -0
  315. package/tests/direct-agent-test.ts +151 -0
  316. package/tests/integration/real-server.test.ts +2 -0
  317. package/tests/integration/room-management.test.ts +10 -8
  318. package/tests/integration/websocket.test.ts +4 -1
  319. package/tests/payment-flow-test.ts +147 -0
  320. package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +17 -29
  321. package/tests/unit/handlers/agent-status-update-handler.test.ts +2 -6
  322. package/tests/unit/handlers/auth-success-handler-rooms.test.ts +1 -3
  323. package/tests/unit/handlers/list-available-agents-handler.test.ts +4 -12
  324. package/tests/unit/handlers/list-room-agents-handler.test.ts +2 -6
  325. package/tests/unit/handlers/room-operation-response-handler.test.ts +9 -36
  326. package/tests/unit/managers/agent-room-manager.test.ts +9 -16
  327. package/tests/unit/managers/room-management-manager.test.ts +21 -39
  328. package/tsconfig.json +2 -2
  329. package/vitest.config.ts +1 -0
@@ -118,7 +118,17 @@ export const SDKConfigSchema = z.object({
118
118
  // Message deduplication (CB-4)
119
119
  enableMessageDeduplication: z.boolean().optional(),
120
120
  messageDedupeTtl: z.number().min(1000).max(3600000).optional(), // 1s to 1 hour
121
- messageDedupMaxSize: z.number().min(1).max(100000).optional()
121
+ messageDedupMaxSize: z.number().min(1).max(100000).optional(),
122
+
123
+ // Quote-Approve Payment Flow (v2.2.0)
124
+ autoApproveQuotes: z.boolean().optional(),
125
+ maxPricePerRequest: z.number().min(0).optional(), // in micro-USDC
126
+ quoteTimeout: z.number().min(1000).max(120000).optional(), // 1s to 2 minutes
127
+ paymentNetwork: z
128
+ .string()
129
+ .regex(/^[a-z0-9-]+:\d+$/, "Must be valid CAIP-2 format")
130
+ .optional(),
131
+ paymentAsset: z.string().optional()
122
132
  });
123
133
 
124
134
  // Partial config for constructor
@@ -222,7 +232,13 @@ export const DEFAULT_CONFIG: PartialSDKConfig = SDKConfigSchema.partial().parse(
222
232
  webhookTimeout: 10000,
223
233
  enableMessageDeduplication: true, // Enable by default to prevent duplicates
224
234
  messageDedupeTtl: 60000, // 60 seconds (1 minute)
225
- messageDedupMaxSize: 10000 // 10k messages
235
+ messageDedupMaxSize: 10000, // 10k messages
236
+
237
+ // Quote-Approve Payment Flow (v2.2.0)
238
+ autoApproveQuotes: true, // Auto-approve quotes by default
239
+ quoteTimeout: 30000, // 30 seconds for quote responses
240
+ paymentNetwork: "eip155:3338", // PEAQ mainnet
241
+ paymentAsset: "0xbbA60da06c2c5424f03f7434542280FCAd453d10" // USDC on PEAQ
226
242
  });
227
243
 
228
244
  // Configuration validation with custom refinements
@@ -779,6 +795,58 @@ export class SDKConfigBuilder {
779
795
  return this;
780
796
  }
781
797
 
798
+ /**
799
+ * Configures payment settings for the quote-approve flow (v2.2.0).
800
+ * Controls how the SDK handles task pricing and payments.
801
+ *
802
+ * @param options - Payment configuration options
803
+ * @param options.autoApprove - Auto-approve and pay for quotes (default: true)
804
+ * @param options.maxPricePerRequest - Maximum price per request in micro-USDC (1000000 = 1 USDC)
805
+ * @param options.quoteTimeout - Timeout for quote responses in ms (default: 30000)
806
+ * @param options.network - Payment network in CAIP-2 format (default: "eip155:3338")
807
+ * @param options.asset - Payment asset (default: "USDC")
808
+ * @returns this builder for method chaining
809
+ *
810
+ * @example
811
+ * ```typescript
812
+ * // Auto-approve with price limit
813
+ * builder.withPayments({
814
+ * autoApprove: true,
815
+ * maxPricePerRequest: 1000000 // Max 1 USDC per request
816
+ * })
817
+ *
818
+ * // Manual approval mode
819
+ * builder.withPayments({ autoApprove: false })
820
+ * ```
821
+ */
822
+ withPayments(options: {
823
+ autoApprove?: boolean;
824
+ maxPricePerRequest?: number;
825
+ quoteTimeout?: number;
826
+ network?: string;
827
+ asset?: string;
828
+ }): this {
829
+ if (options.autoApprove !== undefined) {
830
+ this.config.autoApproveQuotes = z.boolean().parse(options.autoApprove);
831
+ }
832
+ if (options.maxPricePerRequest !== undefined) {
833
+ this.config.maxPricePerRequest = z.number().min(0).parse(options.maxPricePerRequest);
834
+ }
835
+ if (options.quoteTimeout !== undefined) {
836
+ this.config.quoteTimeout = z.number().min(1000).max(120000).parse(options.quoteTimeout);
837
+ }
838
+ if (options.network !== undefined) {
839
+ this.config.paymentNetwork = z
840
+ .string()
841
+ .regex(/^[a-z0-9-]+:\d+$/)
842
+ .parse(options.network);
843
+ }
844
+ if (options.asset !== undefined) {
845
+ this.config.paymentAsset = z.string().parse(options.asset);
846
+ }
847
+ return this;
848
+ }
849
+
782
850
  /**
783
851
  * Builds and validates the final SDK configuration.
784
852
  * Performs comprehensive validation including custom refinements (e.g., webhook security).
@@ -42,6 +42,16 @@ export enum ErrorCode {
42
42
  OPERATION_FAILED = "OPERATION_FAILED",
43
43
  PERMISSION_DENIED = "PERMISSION_DENIED",
44
44
 
45
+ // Quote-Approve Payment errors (v2.2.0)
46
+ QUOTE_EXPIRED = "QUOTE_EXPIRED",
47
+ QUOTE_NOT_FOUND = "QUOTE_NOT_FOUND",
48
+ QUOTE_TIMEOUT = "QUOTE_TIMEOUT",
49
+ PRICE_LIMIT_EXCEEDED = "PRICE_LIMIT_EXCEEDED",
50
+ INVALID_PAYMENT_NETWORK = "INVALID_PAYMENT_NETWORK",
51
+ INSUFFICIENT_BALANCE = "INSUFFICIENT_BALANCE",
52
+ PAYMENT_FAILED = "PAYMENT_FAILED",
53
+ PAYMENT_SIGNATURE_FAILED = "PAYMENT_SIGNATURE_FAILED",
54
+
45
55
  // Generic timeout (for backward compatibility)
46
56
  TIMEOUT_ERROR = "TIMEOUT_ERROR",
47
57
  TIMEOUT = "TIMEOUT"
@@ -231,6 +231,7 @@ describe("Error Classes", () => {
231
231
  expect(isRecoverableError(regularError)).toBe(false);
232
232
 
233
233
  const customError = { message: "Not an error object" };
234
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
234
235
  expect(isRecoverableError(customError as any)).toBe(false);
235
236
  });
236
237
  });
@@ -262,6 +262,21 @@ export class ConfigurationError extends SDKError {
262
262
  }
263
263
  }
264
264
 
265
+ /**
266
+ * Error thrown when payment operations fail (v2.2.0).
267
+ * Can occur when:
268
+ * - Payment signature creation fails
269
+ * - Price limit is exceeded
270
+ * - Insufficient balance
271
+ * - Invalid payment network
272
+ */
273
+ export class PaymentError extends SDKError {
274
+ constructor(message: string, code: ErrorCode, details?: any) {
275
+ super(message, code, details, false);
276
+ this.name = "PaymentError";
277
+ }
278
+ }
279
+
265
280
  // SDK Events interface with proper typing
266
281
  export interface SDKEvents {
267
282
  // Connection events
@@ -332,6 +347,34 @@ export interface SDKEvents {
332
347
  "coordinator:selected": (agentId: string, reasoning: string) => void;
333
348
  "coordinator:error": (error: string) => void;
334
349
 
350
+ // Quote-Approve Payment events (v2.2.0)
351
+ "quote:received": (quote: any) => void;
352
+ "quote:expired": (taskId: string) => void;
353
+ "payment:blocked": (data: { agentId: string; agentPrice: number; maxPrice: number }) => void;
354
+ "payment:attached": (data: { agentId: string; amount: number; command: string }) => void;
355
+ "payment:error": (error: Error, agentId?: string) => void;
356
+
357
+ // Rate Limit events
358
+ rate_limit: (notification: {
359
+ title: string;
360
+ message: string;
361
+ ctaText?: string;
362
+ ctaLink?: string;
363
+ messageType: string;
364
+ limitType: string;
365
+ resetAt?: string;
366
+ }) => void;
367
+
368
+ // Admin events
369
+ "admin:user_count": (data: { count: number; timestamp?: string }) => void;
370
+ "admin:status_changed": (isAdmin: boolean) => void;
371
+
372
+ // User Presence events
373
+ "user:authenticated": (data: { wallet: string }) => void;
374
+
375
+ // User Preferences events
376
+ "preferences:updated": (data: { maxPricePerRequest?: number | null }) => void;
377
+
335
378
  // Webhook events
336
379
  "webhook:sent": (payload: any, url: string) => void;
337
380
  "webhook:success": (response: any, url: string) => void;
@@ -14,6 +14,7 @@ export {
14
14
 
15
15
  // Supporting schemas
16
16
  CapabilitySchema,
17
+ CommandPricingSchema,
17
18
  CommandSchema,
18
19
  RoomSchema,
19
20
  AgentSchema,
@@ -40,6 +41,12 @@ export {
40
41
  TaskResponseMessageSchema,
41
42
  AgentSelectedMessageSchema,
42
43
 
44
+ // Quote-Approve Flow schemas (v2.2.0)
45
+ PricingInfoSchema,
46
+ RequestTaskMessageSchema,
47
+ TaskQuoteMessageSchema,
48
+ ConfirmTaskMessageSchema,
49
+
43
50
  // System message schemas
44
51
  AgentsListMessageSchema,
45
52
  ErrorMessageSchema,
@@ -92,6 +99,7 @@ export {
92
99
  type AgentType,
93
100
  type AgentStatus,
94
101
  type Capability,
102
+ type CommandPricing,
95
103
  type Command,
96
104
  type Room,
97
105
  type Agent,
@@ -109,6 +117,12 @@ export {
109
117
  type TaskMessage,
110
118
  type TaskResponseMessage,
111
119
  type AgentSelectedMessage,
120
+
121
+ // Quote-Approve Flow types (v2.2.0)
122
+ type PricingInfo,
123
+ type RequestTaskMessage,
124
+ type TaskQuoteMessage,
125
+ type ConfirmTaskMessage,
112
126
  type AgentsListMessage,
113
127
  type ErrorMessage,
114
128
  type PingMessage,
@@ -148,6 +162,36 @@ export {
148
162
  type RoomPingMessage,
149
163
  type RoomPongResponse,
150
164
 
165
+ // Admin types
166
+ AdminAgentInfoSchema,
167
+ ListAllAgentsMessageSchema,
168
+ AllAgentsResponseSchema,
169
+ UserCountDataSchema,
170
+ UserCountMessageSchema,
171
+ UserAuthenticatedMessageSchema,
172
+ RateLimitNotificationMessageSchema,
173
+ GetAgentDetailsMessageSchema,
174
+ AgentDetailsResponseMessageSchema,
175
+ type AdminAgentInfo,
176
+ type ListAllAgentsMessage,
177
+ type AllAgentsResponse,
178
+ type UserCountData,
179
+ type UserCountMessage,
180
+ type UserAuthenticatedMessage,
181
+ type RateLimitNotificationMessage,
182
+ type GetAgentDetailsMessage,
183
+ type AgentDetailsResponseMessage,
184
+
185
+ // User Preferences types
186
+ SetUserPreferencesDataSchema,
187
+ SetUserPreferencesMessageSchema,
188
+ UserPreferencesUpdatedDataSchema,
189
+ UserPreferencesUpdatedMessageSchema,
190
+ type SetUserPreferencesData,
191
+ type SetUserPreferencesMessage,
192
+ type UserPreferencesUpdatedData,
193
+ type UserPreferencesUpdatedMessage,
194
+
151
195
  type AnyMessage,
152
196
 
153
197
  // Type guards
@@ -169,6 +213,9 @@ export {
169
213
  createSubscribe,
170
214
  createUnsubscribe,
171
215
  createListRooms,
216
+ createRequestTask,
217
+ createConfirmTask,
218
+ createSetUserPreferences,
172
219
 
173
220
  // Validation helpers
174
221
  validateMessage,
@@ -241,6 +288,7 @@ export {
241
288
  ValidationError,
242
289
  TimeoutError,
243
290
  RateLimitError,
291
+ PaymentError,
244
292
 
245
293
  // Validation helpers
246
294
  validateEventData,
@@ -252,3 +300,11 @@ export { ErrorCode } from "./error-codes";
252
300
 
253
301
  // Health status types
254
302
  export { type HealthStatus } from "./health";
303
+
304
+ // Agent category types
305
+ export {
306
+ AGENT_CATEGORIES,
307
+ MAX_CATEGORIES,
308
+ AgentCategorySchema,
309
+ type AgentCategory
310
+ } from "./categories";
@@ -20,7 +20,8 @@ import {
20
20
  describe("stringToBoolean transform", () => {
21
21
  // Test stringToBoolean indirectly through RoomSchema which uses it for is_public and is_active
22
22
 
23
- const createTestRoom = (is_public: any, is_active: any) => ({
23
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
24
+ const createTestRoom = (is_public: unknown, is_active: unknown) => ({
24
25
  id: "room-1",
25
26
  name: "Test Room",
26
27
  is_public,
@@ -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.
@@ -63,6 +64,11 @@ export const MessageTypeSchema = z.enum([
63
64
  "task_response",
64
65
  "agent_selected",
65
66
 
67
+ // Quote-Approve Flow (v2.2.0)
68
+ "request_task",
69
+ "task_quote",
70
+ "confirm_task",
71
+
66
72
  // System
67
73
  "agents",
68
74
  "error",
@@ -74,6 +80,7 @@ export const MessageTypeSchema = z.enum([
74
80
  "subscribe",
75
81
  "unsubscribe",
76
82
  "list_rooms",
83
+ "room_list_response",
77
84
 
78
85
  // === NEW IN v2.0.0 ===
79
86
 
@@ -104,7 +111,20 @@ export const MessageTypeSchema = z.enum([
104
111
 
105
112
  // Room Ping System (2 types)
106
113
  "room_ping",
107
- "room_pong"
114
+ "room_pong",
115
+
116
+ // Admin Messages (7 types)
117
+ "list_all_agents",
118
+ "all_agents_response",
119
+ "user_count",
120
+ "user_authenticated",
121
+ "rate_limit_notification",
122
+ "get_agent_details",
123
+ "agent_details_response",
124
+
125
+ // User Preferences (2 types)
126
+ "set_user_preferences",
127
+ "user_preferences_updated"
108
128
  ]);
109
129
 
110
130
  export const ContentTypeSchema = z.enum([
@@ -131,10 +151,20 @@ export const CapabilitySchema = z.object({
131
151
  description: z.string().optional()
132
152
  });
133
153
 
154
+ export const CommandPricingSchema = z.object({
155
+ priceType: z.string().optional(),
156
+ pricePerUnit: z.number().optional(),
157
+ taskUnit: z.string().optional(),
158
+ timeUnit: z.enum(["hour", "day"]).optional()
159
+ });
160
+
161
+ export type CommandPricing = z.infer<typeof CommandPricingSchema>;
162
+
134
163
  export const CommandSchema = z.object({
135
164
  trigger: z.string(),
136
165
  argument: z.string().optional(),
137
- description: z.string().optional()
166
+ description: z.string().optional(),
167
+ pricing: CommandPricingSchema.optional()
138
168
  });
139
169
 
140
170
  export const RoomSchema = z.object({
@@ -174,7 +204,8 @@ export const AgentSchema = z.object({
174
204
  image: z.string().optional(),
175
205
  agentType: AgentTypeSchema.optional(),
176
206
  nlpFallback: stringToBoolean.optional(),
177
- webhookUrl: z.string().url().optional()
207
+ webhookUrl: z.string().url().optional(),
208
+ categories: z.array(AgentCategorySchema).max(MAX_CATEGORIES).optional()
178
209
  });
179
210
 
180
211
  // Base message schema
@@ -354,6 +385,62 @@ export const AgentSelectedMessageSchema = BaseMessageSchema.extend({
354
385
  })
355
386
  });
356
387
 
388
+ // ============================================================================
389
+ // QUOTE-APPROVE FLOW SCHEMAS (v2.2.0)
390
+ // ============================================================================
391
+
392
+ // Pricing information schema (flexible to handle server variations)
393
+ export const PricingInfoSchema = z
394
+ .object({
395
+ pricePerUnit: z.number().optional(),
396
+ price_per_unit: z.number().optional(),
397
+ priceType: z.string().optional(),
398
+ price_type: z.string().optional(),
399
+ timeUnit: z.string().optional(),
400
+ time_unit: z.string().optional(),
401
+ currency: z.string().optional().default("USDC"),
402
+ network: z.string().optional()
403
+ })
404
+ .transform((data) => ({
405
+ // Normalize to camelCase
406
+ pricePerUnit: data.pricePerUnit ?? data.price_per_unit ?? 0,
407
+ priceType: data.priceType ?? data.price_type,
408
+ timeUnit: data.timeUnit ?? data.time_unit,
409
+ currency: data.currency,
410
+ network: data.network
411
+ }));
412
+
413
+ // Request task message (initiates quote-approve flow)
414
+ export const RequestTaskMessageSchema = BaseMessageSchema.extend({
415
+ type: z.literal("request_task"),
416
+ content: z.string(),
417
+ room: z.string()
418
+ });
419
+
420
+ // Task quote message (server response with pricing)
421
+ export const TaskQuoteMessageSchema = BaseMessageSchema.extend({
422
+ type: z.literal("task_quote"),
423
+ 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
+ })
433
+ });
434
+
435
+ // Confirm task message (with payment at top level - backend expects msg.payment)
436
+ export const ConfirmTaskMessageSchema = BaseMessageSchema.extend({
437
+ type: z.literal("confirm_task"),
438
+ data: z.object({
439
+ task_id: z.string()
440
+ }),
441
+ payment: z.string().optional() // x402 payment at top level (backend checks msg.Payment)
442
+ });
443
+
357
444
  // System message schemas
358
445
  export const AgentsListMessageSchema = BaseMessageSchema.extend({
359
446
  type: z.literal("agents"),
@@ -420,7 +507,7 @@ export const UnsubscribeResponseSchema = BaseMessageSchema.extend({
420
507
  });
421
508
 
422
509
  export const ListRoomsResponseSchema = BaseMessageSchema.extend({
423
- type: z.literal("list_rooms"),
510
+ type: z.literal("room_list_response"),
424
511
  data: z.object({
425
512
  rooms: z.array(RoomInfoSchema)
426
513
  })
@@ -548,7 +635,8 @@ export const AgentRoomInfoSchema = z
548
635
  image: z.string().optional(),
549
636
  status: z.string().optional(),
550
637
  added_by: z.string().optional(),
551
- added_at: z.string().optional()
638
+ added_at: z.string().optional(),
639
+ categories: z.array(AgentCategorySchema).max(MAX_CATEGORIES).optional()
552
640
  })
553
641
  .passthrough();
554
642
 
@@ -655,6 +743,171 @@ export const RoomPongResponseSchema = z
655
743
  })
656
744
  .passthrough();
657
745
 
746
+ // Admin agent info (admin only)
747
+ export const AdminAgentInfoSchema = z
748
+ .object({
749
+ agent_id: z.string(),
750
+ agent_name: z.string(),
751
+ creator: z.string(),
752
+ creator_name: z.string().optional().nullable(),
753
+ description: z.string().optional().nullable(),
754
+ image_url: z.string().optional().nullable(),
755
+ is_online: z.boolean().optional(),
756
+ is_active: z.boolean().optional(),
757
+ is_verified: z.boolean().optional(),
758
+ is_public: z.boolean().optional(),
759
+ is_banned: z.boolean().optional(),
760
+ created_at: z.string().optional().nullable()
761
+ })
762
+ .passthrough();
763
+
764
+ export type AdminAgentInfo = z.infer<typeof AdminAgentInfoSchema>;
765
+
766
+ // List all agents request (client → server, admin only)
767
+ export const ListAllAgentsMessageSchema = z
768
+ .object({
769
+ type: z.literal("list_all_agents"),
770
+ request_id: z.string().optional(),
771
+ filter: z.string().optional(),
772
+ offset: z.number().optional(),
773
+ limit: z.number().optional()
774
+ })
775
+ .passthrough();
776
+
777
+ export type ListAllAgentsMessage = z.infer<typeof ListAllAgentsMessageSchema>;
778
+
779
+ // All agents response (server → client, admin only)
780
+ export const AllAgentsResponseSchema = z
781
+ .object({
782
+ type: z.literal("all_agents_response"),
783
+ request_id: z.string().optional(),
784
+ data: z
785
+ .object({
786
+ agents: z.array(AdminAgentInfoSchema),
787
+ total: z.number(),
788
+ offset: z.number(),
789
+ limit: z.number(),
790
+ has_more: z.boolean(),
791
+ filter: z.string().optional()
792
+ })
793
+ .passthrough()
794
+ })
795
+ .passthrough();
796
+
797
+ export type AllAgentsResponse = z.infer<typeof AllAgentsResponseSchema>;
798
+
799
+ // User count data schema
800
+ export const UserCountDataSchema = z.object({
801
+ count: z.number(),
802
+ timestamp: z.string()
803
+ });
804
+
805
+ export type UserCountData = z.infer<typeof UserCountDataSchema>;
806
+
807
+ // User count message (server → client, admin only)
808
+ export const UserCountMessageSchema = z
809
+ .object({
810
+ type: z.literal("user_count"),
811
+ data: UserCountDataSchema.passthrough()
812
+ })
813
+ .passthrough();
814
+
815
+ export type UserCountMessage = z.infer<typeof UserCountMessageSchema>;
816
+
817
+ // User authenticated message (server → client)
818
+ export const UserAuthenticatedMessageSchema = z
819
+ .object({
820
+ type: z.literal("user_authenticated"),
821
+ data: z
822
+ .object({
823
+ wallet: z.string()
824
+ })
825
+ .passthrough()
826
+ })
827
+ .passthrough();
828
+
829
+ export type UserAuthenticatedMessage = z.infer<typeof UserAuthenticatedMessageSchema>;
830
+
831
+ // Rate limit notification (server → client)
832
+ export const RateLimitNotificationMessageSchema = z
833
+ .object({
834
+ type: z.literal("rate_limit_notification"),
835
+ data: z
836
+ .object({
837
+ title: z.string(),
838
+ message: z.string(),
839
+ cta_text: z.string().optional(),
840
+ cta_link: z.string().optional(),
841
+ message_type: z.string(),
842
+ limit_type: z.string(),
843
+ reset_at: z.string().optional()
844
+ })
845
+ .passthrough()
846
+ })
847
+ .passthrough();
848
+
849
+ export type RateLimitNotificationMessage = z.infer<typeof RateLimitNotificationMessageSchema>;
850
+
851
+ // Agent details request (client → server)
852
+ export const GetAgentDetailsMessageSchema = z
853
+ .object({
854
+ type: z.literal("get_agent_details"),
855
+ agent_id: z.string(),
856
+ request_id: z.string().optional()
857
+ })
858
+ .passthrough();
859
+
860
+ export type GetAgentDetailsMessage = z.infer<typeof GetAgentDetailsMessageSchema>;
861
+
862
+ // Agent details response (server → client)
863
+ export const AgentDetailsResponseMessageSchema = z
864
+ .object({
865
+ type: z.literal("agent_details_response"),
866
+ request_id: z.string().optional(),
867
+ data: z
868
+ .object({
869
+ agent: AgentRoomInfoSchema
870
+ })
871
+ .passthrough()
872
+ .optional(),
873
+ error: z.string().optional()
874
+ })
875
+ .passthrough();
876
+
877
+ export type AgentDetailsResponseMessage = z.infer<typeof AgentDetailsResponseMessageSchema>;
878
+
879
+ // User Preferences (set_user_preferences)
880
+ export const SetUserPreferencesDataSchema = z.object({
881
+ max_price_per_request: z.number().min(0).optional().nullable()
882
+ });
883
+
884
+ export const SetUserPreferencesMessageSchema = z
885
+ .object({
886
+ type: z.literal("set_user_preferences"),
887
+ data: SetUserPreferencesDataSchema
888
+ })
889
+ .passthrough();
890
+
891
+ export type SetUserPreferencesData = z.infer<typeof SetUserPreferencesDataSchema>;
892
+ export type SetUserPreferencesMessage = z.infer<typeof SetUserPreferencesMessageSchema>;
893
+
894
+ // User Preferences Response (user_preferences_updated)
895
+ export const UserPreferencesUpdatedDataSchema = z.object({
896
+ success: z.boolean(),
897
+ message: z.string(),
898
+ max_price_per_request: z.number().optional().nullable()
899
+ });
900
+
901
+ export const UserPreferencesUpdatedMessageSchema = z
902
+ .object({
903
+ type: z.literal("user_preferences_updated"),
904
+ data: UserPreferencesUpdatedDataSchema
905
+ })
906
+ .passthrough();
907
+
908
+ export type UserPreferencesUpdatedData = z.infer<typeof UserPreferencesUpdatedDataSchema>;
909
+ export type UserPreferencesUpdatedMessage = z.infer<typeof UserPreferencesUpdatedMessageSchema>;
910
+
658
911
  // Union of all INCOMING message schemas for validation
659
912
  // Note: Outgoing message schemas (Subscribe, Unsubscribe, ListRooms) are excluded
660
913
  // as they share the same type values with their response counterparts
@@ -677,6 +930,9 @@ export const AnyMessageSchema = z.discriminatedUnion("type", [
677
930
  AgentSelectedMessageSchema,
678
931
  AgentsListMessageSchema,
679
932
 
933
+ // Quote-Approve Flow (v2.2.0)
934
+ TaskQuoteMessageSchema,
935
+
680
936
  // System
681
937
  ErrorMessageSchema,
682
938
  PingMessageSchema,
@@ -699,7 +955,17 @@ export const AnyMessageSchema = z.discriminatedUnion("type", [
699
955
  AgentStatusUpdateMessageSchema,
700
956
 
701
957
  // Room Ping System (v2.0.0)
702
- RoomPongResponseSchema
958
+ RoomPongResponseSchema,
959
+
960
+ // Admin Messages
961
+ AllAgentsResponseSchema,
962
+ UserCountMessageSchema,
963
+ UserAuthenticatedMessageSchema,
964
+ RateLimitNotificationMessageSchema,
965
+ AgentDetailsResponseMessageSchema,
966
+
967
+ // User Preferences
968
+ UserPreferencesUpdatedMessageSchema
703
969
  ]);
704
970
 
705
971
  // Type inference from schemas
@@ -729,6 +995,13 @@ export type TaskMessage = z.infer<typeof TaskMessageSchema>;
729
995
  export type TaskResponseMessage = z.infer<typeof TaskResponseMessageSchema>;
730
996
  export type AgentSelectedMessage = z.infer<typeof AgentSelectedMessageSchema>;
731
997
  export type AgentsListMessage = z.infer<typeof AgentsListMessageSchema>;
998
+
999
+ // Quote-Approve Flow Types (v2.2.0)
1000
+ export type PricingInfo = z.infer<typeof PricingInfoSchema>;
1001
+ export type RequestTaskMessage = z.infer<typeof RequestTaskMessageSchema>;
1002
+ export type TaskQuoteMessage = z.infer<typeof TaskQuoteMessageSchema>;
1003
+ export type ConfirmTaskMessage = z.infer<typeof ConfirmTaskMessageSchema>;
1004
+
732
1005
  export type ErrorMessage = z.infer<typeof ErrorMessageSchema>;
733
1006
  export type PingMessage = z.infer<typeof PingMessageSchema>;
734
1007
  export type PongMessage = z.infer<typeof PongMessageSchema>;
@@ -875,6 +1148,36 @@ export function createListRooms(): ListRoomsMessage {
875
1148
  });
876
1149
  }
877
1150
 
1151
+ // Quote-Approve Flow factory functions (v2.2.0)
1152
+ export function createRequestTask(content: string, room: string): RequestTaskMessage {
1153
+ return RequestTaskMessageSchema.parse({
1154
+ type: "request_task",
1155
+ content,
1156
+ room
1157
+ });
1158
+ }
1159
+
1160
+ export function createConfirmTask(taskId: string, x402Payment?: string): ConfirmTaskMessage {
1161
+ return ConfirmTaskMessageSchema.parse({
1162
+ type: "confirm_task",
1163
+ data: {
1164
+ task_id: taskId
1165
+ },
1166
+ ...(x402Payment && { payment: x402Payment }) // payment at top level for backend
1167
+ });
1168
+ }
1169
+
1170
+ export function createSetUserPreferences(
1171
+ maxPricePerRequest?: number | null
1172
+ ): SetUserPreferencesMessage {
1173
+ return SetUserPreferencesMessageSchema.parse({
1174
+ type: "set_user_preferences",
1175
+ data: {
1176
+ max_price_per_request: maxPricePerRequest
1177
+ }
1178
+ });
1179
+ }
1180
+
878
1181
  // Validation helper
879
1182
  export function validateMessage(message: unknown): AnyMessage {
880
1183
  return AnyMessageSchema.parse(message);