@teneo-protocol/sdk 2.0.0 → 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 (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 +2 -199
  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 +4 -6
  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 +6 -1
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.js +19 -2
  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 +11219 -423
  181. package/dist/types/messages.d.ts.map +1 -1
  182. package/dist/types/messages.js +249 -7
  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 +4 -2
  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 +21 -0
  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 +307 -5
  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",
@@ -104,7 +110,20 @@ export const MessageTypeSchema = z.enum([
104
110
 
105
111
  // Room Ping System (2 types)
106
112
  "room_ping",
107
- "room_pong"
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"
108
127
  ]);
109
128
 
110
129
  export const ContentTypeSchema = z.enum([
@@ -131,10 +150,20 @@ export const CapabilitySchema = z.object({
131
150
  description: z.string().optional()
132
151
  });
133
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()
158
+ });
159
+
160
+ export type CommandPricing = z.infer<typeof CommandPricingSchema>;
161
+
134
162
  export const CommandSchema = z.object({
135
163
  trigger: z.string(),
136
164
  argument: z.string().optional(),
137
- description: z.string().optional()
165
+ description: z.string().optional(),
166
+ pricing: CommandPricingSchema.optional()
138
167
  });
139
168
 
140
169
  export const RoomSchema = z.object({
@@ -174,7 +203,8 @@ export const AgentSchema = z.object({
174
203
  image: z.string().optional(),
175
204
  agentType: AgentTypeSchema.optional(),
176
205
  nlpFallback: stringToBoolean.optional(),
177
- webhookUrl: z.string().url().optional()
206
+ webhookUrl: z.string().url().optional(),
207
+ categories: z.array(AgentCategorySchema).max(MAX_CATEGORIES).optional()
178
208
  });
179
209
 
180
210
  // Base message schema
@@ -354,6 +384,62 @@ export const AgentSelectedMessageSchema = BaseMessageSchema.extend({
354
384
  })
355
385
  });
356
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
+
357
443
  // System message schemas
358
444
  export const AgentsListMessageSchema = BaseMessageSchema.extend({
359
445
  type: z.literal("agents"),
@@ -548,7 +634,8 @@ export const AgentRoomInfoSchema = z
548
634
  image: z.string().optional(),
549
635
  status: z.string().optional(),
550
636
  added_by: z.string().optional(),
551
- added_at: z.string().optional()
637
+ added_at: z.string().optional(),
638
+ categories: z.array(AgentCategorySchema).max(MAX_CATEGORIES).optional()
552
639
  })
553
640
  .passthrough();
554
641
 
@@ -655,6 +742,171 @@ export const RoomPongResponseSchema = z
655
742
  })
656
743
  .passthrough();
657
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
+
658
910
  // Union of all INCOMING message schemas for validation
659
911
  // Note: Outgoing message schemas (Subscribe, Unsubscribe, ListRooms) are excluded
660
912
  // as they share the same type values with their response counterparts
@@ -677,6 +929,9 @@ export const AnyMessageSchema = z.discriminatedUnion("type", [
677
929
  AgentSelectedMessageSchema,
678
930
  AgentsListMessageSchema,
679
931
 
932
+ // Quote-Approve Flow (v2.2.0)
933
+ TaskQuoteMessageSchema,
934
+
680
935
  // System
681
936
  ErrorMessageSchema,
682
937
  PingMessageSchema,
@@ -699,7 +954,17 @@ export const AnyMessageSchema = z.discriminatedUnion("type", [
699
954
  AgentStatusUpdateMessageSchema,
700
955
 
701
956
  // Room Ping System (v2.0.0)
702
- RoomPongResponseSchema
957
+ RoomPongResponseSchema,
958
+
959
+ // Admin Messages
960
+ AllAgentsResponseSchema,
961
+ UserCountMessageSchema,
962
+ UserAuthenticatedMessageSchema,
963
+ RateLimitNotificationMessageSchema,
964
+ AgentDetailsResponseMessageSchema,
965
+
966
+ // User Preferences
967
+ UserPreferencesUpdatedMessageSchema
703
968
  ]);
704
969
 
705
970
  // Type inference from schemas
@@ -729,6 +994,13 @@ export type TaskMessage = z.infer<typeof TaskMessageSchema>;
729
994
  export type TaskResponseMessage = z.infer<typeof TaskResponseMessageSchema>;
730
995
  export type AgentSelectedMessage = z.infer<typeof AgentSelectedMessageSchema>;
731
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
+
732
1004
  export type ErrorMessage = z.infer<typeof ErrorMessageSchema>;
733
1005
  export type PingMessage = z.infer<typeof PingMessageSchema>;
734
1006
  export type PongMessage = z.infer<typeof PongMessageSchema>;
@@ -875,6 +1147,36 @@ export function createListRooms(): ListRoomsMessage {
875
1147
  });
876
1148
  }
877
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
+
878
1180
  // Validation helper
879
1181
  export function validateMessage(message: unknown): AnyMessage {
880
1182
  return AnyMessageSchema.parse(message);
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  import { describe, it, expect, beforeEach } from "vitest";
6
- import { BoundedQueue, QueueOverflowError, type OverflowStrategy } from "./bounded-queue";
6
+ import { BoundedQueue, QueueOverflowError } from "./bounded-queue";
7
7
 
8
8
  describe("BoundedQueue", () => {
9
9
  describe("constructor", () => {