@teneo-protocol/sdk 2.2.2 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. package/.github/ISSUE_TEMPLATE/config.yml +1 -1
  2. package/CHANGELOG.md +366 -15
  3. package/CONCEPTS.md +182 -44
  4. package/README.md +524 -94
  5. package/dist/constants.d.ts +3 -1
  6. package/dist/constants.d.ts.map +1 -1
  7. package/dist/constants.js +5 -3
  8. package/dist/constants.js.map +1 -1
  9. package/dist/core/websocket-client.d.ts.map +1 -1
  10. package/dist/core/websocket-client.js +9 -5
  11. package/dist/core/websocket-client.js.map +1 -1
  12. package/dist/formatters/response-formatter.d.ts +6 -6
  13. package/dist/handlers/message-handlers/agent-details-response-handler.d.ts +756 -756
  14. package/dist/handlers/message-handlers/agent-details-response-handler.js +2 -2
  15. package/dist/handlers/message-handlers/agent-details-response-handler.js.map +1 -1
  16. package/dist/handlers/message-handlers/agent-error-handler.d.ts +91 -0
  17. package/dist/handlers/message-handlers/agent-error-handler.d.ts.map +1 -0
  18. package/dist/handlers/message-handlers/agent-error-handler.js +44 -0
  19. package/dist/handlers/message-handlers/agent-error-handler.js.map +1 -0
  20. package/dist/handlers/message-handlers/agent-selected-handler.d.ts +6 -0
  21. package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -1
  22. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts +756 -756
  23. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts.map +1 -1
  24. package/dist/handlers/message-handlers/agent-status-update-handler.js +2 -7
  25. package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -1
  26. package/dist/handlers/message-handlers/all-agents-response-handler.js +2 -2
  27. package/dist/handlers/message-handlers/all-agents-response-handler.js.map +1 -1
  28. package/dist/handlers/message-handlers/auth-error-handler.d.ts +6 -0
  29. package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -1
  30. package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -1
  31. package/dist/handlers/message-handlers/auth-message-handler.js +6 -1
  32. package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -1
  33. package/dist/handlers/message-handlers/auth-required-handler.d.ts +6 -0
  34. package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -1
  35. package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -1
  36. package/dist/handlers/message-handlers/auth-success-handler.js +6 -1
  37. package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -1
  38. package/dist/handlers/message-handlers/base-handler.d.ts +2 -1
  39. package/dist/handlers/message-handlers/base-handler.d.ts.map +1 -1
  40. package/dist/handlers/message-handlers/base-handler.js +24 -4
  41. package/dist/handlers/message-handlers/base-handler.js.map +1 -1
  42. package/dist/handlers/message-handlers/challenge-handler.d.ts +6 -0
  43. package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -1
  44. package/dist/handlers/message-handlers/error-message-handler.d.ts +6 -0
  45. package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -1
  46. package/dist/handlers/message-handlers/index.d.ts +4 -0
  47. package/dist/handlers/message-handlers/index.d.ts.map +1 -1
  48. package/dist/handlers/message-handlers/index.js +23 -1
  49. package/dist/handlers/message-handlers/index.js.map +1 -1
  50. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts +792 -756
  51. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -1
  52. package/dist/handlers/message-handlers/list-available-agents-handler.js +23 -10
  53. package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -1
  54. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +756 -756
  55. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts.map +1 -1
  56. package/dist/handlers/message-handlers/list-room-agents-handler.js +2 -6
  57. package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -1
  58. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
  59. package/dist/handlers/message-handlers/list-rooms-response-handler.js +2 -5
  60. package/dist/handlers/message-handlers/list-rooms-response-handler.js.map +1 -1
  61. package/dist/handlers/message-handlers/ping-pong-handler.d.ts +52 -4
  62. package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -1
  63. package/dist/handlers/message-handlers/ping-pong-handler.js +23 -4
  64. package/dist/handlers/message-handlers/ping-pong-handler.js.map +1 -1
  65. package/dist/handlers/message-handlers/rate-limit-notification-handler.d.ts.map +1 -1
  66. package/dist/handlers/message-handlers/rate-limit-notification-handler.js +3 -2
  67. package/dist/handlers/message-handlers/rate-limit-notification-handler.js.map +1 -1
  68. package/dist/handlers/message-handlers/regular-message-handler.d.ts +6 -0
  69. package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -1
  70. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +12 -6
  71. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
  72. package/dist/handlers/message-handlers/success-handler.d.ts +82 -0
  73. package/dist/handlers/message-handlers/success-handler.d.ts.map +1 -0
  74. package/dist/handlers/message-handlers/success-handler.js +24 -0
  75. package/dist/handlers/message-handlers/success-handler.js.map +1 -0
  76. package/dist/handlers/message-handlers/task-confirmed-handler.d.ts +110 -0
  77. package/dist/handlers/message-handlers/task-confirmed-handler.d.ts.map +1 -0
  78. package/dist/handlers/message-handlers/task-confirmed-handler.js +46 -0
  79. package/dist/handlers/message-handlers/task-confirmed-handler.js.map +1 -0
  80. package/dist/handlers/message-handlers/trigger-wallet-tx-handler.d.ts +244 -0
  81. package/dist/handlers/message-handlers/trigger-wallet-tx-handler.d.ts.map +1 -0
  82. package/dist/handlers/message-handlers/trigger-wallet-tx-handler.js +58 -0
  83. package/dist/handlers/message-handlers/trigger-wallet-tx-handler.js.map +1 -0
  84. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +12 -6
  85. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
  86. package/dist/handlers/message-handlers/user-authenticated-handler.js +2 -2
  87. package/dist/handlers/message-handlers/user-authenticated-handler.js.map +1 -1
  88. package/dist/handlers/message-handlers/user-count-handler.js +2 -2
  89. package/dist/handlers/message-handlers/user-count-handler.js.map +1 -1
  90. package/dist/index.d.ts +3 -3
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +11 -4
  93. package/dist/index.js.map +1 -1
  94. package/dist/managers/admin-manager.d.ts +2 -0
  95. package/dist/managers/admin-manager.d.ts.map +1 -1
  96. package/dist/managers/admin-manager.js +3 -2
  97. package/dist/managers/admin-manager.js.map +1 -1
  98. package/dist/managers/agent-room-manager.d.ts +89 -11
  99. package/dist/managers/agent-room-manager.d.ts.map +1 -1
  100. package/dist/managers/agent-room-manager.js +99 -35
  101. package/dist/managers/agent-room-manager.js.map +1 -1
  102. package/dist/managers/index.d.ts +1 -1
  103. package/dist/managers/index.d.ts.map +1 -1
  104. package/dist/managers/index.js.map +1 -1
  105. package/dist/managers/message-router.d.ts +45 -5
  106. package/dist/managers/message-router.d.ts.map +1 -1
  107. package/dist/managers/message-router.js +96 -24
  108. package/dist/managers/message-router.js.map +1 -1
  109. package/dist/managers/room-manager.d.ts +29 -7
  110. package/dist/managers/room-manager.d.ts.map +1 -1
  111. package/dist/managers/room-manager.js +37 -11
  112. package/dist/managers/room-manager.js.map +1 -1
  113. package/dist/payments/index.d.ts +3 -1
  114. package/dist/payments/index.d.ts.map +1 -1
  115. package/dist/payments/index.js +17 -3
  116. package/dist/payments/index.js.map +1 -1
  117. package/dist/payments/networks.d.ts +59 -0
  118. package/dist/payments/networks.d.ts.map +1 -0
  119. package/dist/payments/networks.js +192 -0
  120. package/dist/payments/networks.js.map +1 -0
  121. package/dist/payments/payment-client.d.ts +55 -10
  122. package/dist/payments/payment-client.d.ts.map +1 -1
  123. package/dist/payments/payment-client.js +172 -51
  124. package/dist/payments/payment-client.js.map +1 -1
  125. package/dist/teneo-sdk.d.ts +214 -40
  126. package/dist/teneo-sdk.d.ts.map +1 -1
  127. package/dist/teneo-sdk.js +360 -83
  128. package/dist/teneo-sdk.js.map +1 -1
  129. package/dist/types/config.d.ts +334 -25
  130. package/dist/types/config.d.ts.map +1 -1
  131. package/dist/types/config.js +114 -22
  132. package/dist/types/config.js.map +1 -1
  133. package/dist/types/events.d.ts +60 -14
  134. package/dist/types/events.d.ts.map +1 -1
  135. package/dist/types/events.js.map +1 -1
  136. package/dist/types/index.d.ts +1 -1
  137. package/dist/types/index.d.ts.map +1 -1
  138. package/dist/types/index.js +11 -4
  139. package/dist/types/index.js.map +1 -1
  140. package/dist/types/messages.d.ts +9801 -7222
  141. package/dist/types/messages.d.ts.map +1 -1
  142. package/dist/types/messages.js +180 -40
  143. package/dist/types/messages.js.map +1 -1
  144. package/dist/utils/pricing-resolver.d.ts +1 -1
  145. package/dist/utils/pricing-resolver.d.ts.map +1 -1
  146. package/dist/utils/pricing-resolver.js +9 -1
  147. package/dist/utils/pricing-resolver.js.map +1 -1
  148. package/examples/agent-room-management-example.ts +5 -5
  149. package/examples/basic-usage.ts +26 -6
  150. package/examples/claude-agent-x-follower/index.ts +1 -1
  151. package/examples/minimal-chat.ts +4 -3
  152. package/examples/n8n-teneo/index.ts +2 -2
  153. package/examples/nestjs-dashboard/README.md +1 -1
  154. package/examples/nestjs-dashboard/src/teneo/agents.controller.ts +3 -3
  155. package/examples/nestjs-dashboard/src/teneo/rooms.controller.ts +5 -5
  156. package/examples/nestjs-dashboard/src/teneo/teneo.service.ts +8 -8
  157. package/examples/openai-teneo/index.ts +1 -1
  158. package/examples/payment-flow.ts +143 -0
  159. package/examples/production-dashboard/README.md +6 -8
  160. package/examples/production-dashboard/server.ts +22 -10
  161. package/examples/room-management-example.ts +2 -2
  162. package/examples/usage/01-connect.ts +0 -3
  163. package/examples/usage/02-list-agents.ts +0 -2
  164. package/examples/usage/03-pick-agent.ts +3 -4
  165. package/examples/usage/04-find-by-capability.ts +10 -12
  166. package/examples/usage/05-webhook-example.ts +2 -4
  167. package/examples/usage/06-simple-api-server.ts +13 -9
  168. package/examples/usage/07-event-listener.ts +1 -13
  169. package/examples/usage/README.md +33 -7
  170. package/examples/webhook-integration.ts +9 -9
  171. package/examples/x-influencer-battle-server.ts +1 -1
  172. package/package.json +1 -1
  173. package/scripts/diagnose-connection.ts +86 -0
  174. package/scripts/investigate-payload.ts +163 -0
  175. package/scripts/list-agents.ts +58 -0
  176. package/scripts/live-multi-network-test.ts +230 -0
  177. package/src/constants.ts +5 -3
  178. package/src/core/websocket-client.ts +10 -9
  179. package/src/handlers/message-handlers/agent-details-response-handler.ts +2 -2
  180. package/src/handlers/message-handlers/agent-error-handler.ts +47 -0
  181. package/src/handlers/message-handlers/agent-status-update-handler.ts +2 -7
  182. package/src/handlers/message-handlers/all-agents-response-handler.ts +2 -2
  183. package/src/handlers/message-handlers/auth-message-handler.ts +7 -1
  184. package/src/handlers/message-handlers/auth-success-handler.ts +7 -1
  185. package/src/handlers/message-handlers/base-handler.ts +24 -4
  186. package/src/handlers/message-handlers/index.ts +24 -0
  187. package/src/handlers/message-handlers/list-available-agents-handler.ts +24 -11
  188. package/src/handlers/message-handlers/list-room-agents-handler.ts +2 -6
  189. package/src/handlers/message-handlers/list-rooms-response-handler.ts +2 -5
  190. package/src/handlers/message-handlers/ping-pong-handler.ts +29 -4
  191. package/src/handlers/message-handlers/rate-limit-notification-handler.ts +3 -2
  192. package/src/handlers/message-handlers/success-handler.ts +26 -0
  193. package/src/handlers/message-handlers/task-confirmed-handler.ts +49 -0
  194. package/src/handlers/message-handlers/trigger-wallet-tx-handler.ts +62 -0
  195. package/src/handlers/message-handlers/user-authenticated-handler.ts +2 -2
  196. package/src/handlers/message-handlers/user-count-handler.ts +2 -2
  197. package/src/index.ts +12 -4
  198. package/src/managers/admin-manager.ts +5 -2
  199. package/src/managers/agent-room-manager.ts +155 -26
  200. package/src/managers/index.ts +6 -1
  201. package/src/managers/message-router.ts +122 -27
  202. package/src/managers/room-manager.ts +39 -11
  203. package/src/payments/index.ts +20 -5
  204. package/src/payments/networks.ts +208 -0
  205. package/src/payments/payment-client.ts +211 -56
  206. package/src/teneo-sdk.ts +401 -70
  207. package/src/types/config.test.ts +24 -4
  208. package/src/types/config.ts +123 -25
  209. package/src/types/events.ts +36 -2
  210. package/src/types/index.ts +16 -3
  211. package/src/types/messages.ts +221 -57
  212. package/src/utils/pricing-resolver.ts +10 -2
  213. package/tests/direct-agent-test.ts +1 -1
  214. package/tests/integration/real-server.test.ts +1 -1
  215. package/tests/integration/websocket.test.ts +3 -3
  216. package/tests/multi-network-payment.test.ts +309 -0
  217. package/tests/multi-network.test.ts +296 -0
  218. package/tests/payment-flow-test.ts +6 -4
  219. package/tests/unit/handlers/agent-error-handler.test.ts +388 -0
  220. package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +9 -6
  221. package/tests/unit/handlers/agent-status-update-handler.test.ts +11 -16
  222. package/tests/unit/handlers/list-available-agents-handler.test.ts +11 -14
  223. package/tests/unit/handlers/list-room-agents-handler.test.ts +11 -15
  224. package/tests/unit/handlers/room-operation-response-handler.test.ts +9 -6
  225. package/tests/unit/handlers/trigger-wallet-tx-handler.test.ts +431 -0
  226. package/tests/unit/managers/admin-manager.test.ts +183 -0
  227. package/tests/unit/managers/agent-room-manager.test.ts +189 -33
  228. package/tests/unit/sdk-new-methods.test.ts +221 -0
package/CONCEPTS.md CHANGED
@@ -114,7 +114,7 @@ sdk.on("auth:success", (state) => {
114
114
  });
115
115
 
116
116
  sdk.on("auth:error", (error) => {
117
- console.error("Authentication failed:", error.message);
117
+ console.error("Authentication failed:", error);
118
118
  });
119
119
  ```
120
120
 
@@ -129,13 +129,13 @@ Rooms are isolated spaces where you send messages and receive responses from age
129
129
  | Type | Subscription | Ownership | Use Case |
130
130
  |------|-------------|-----------|----------|
131
131
  | **Private** | Automatic | You own it | Personal workspace, private conversations |
132
- | **Public** | Manual (`subscribeToRoom()`) | System/shared | Community channels, announcements |
132
+ | **Public** | Manual (`subscribeToPublicRoom()`) | System/shared | Community channels, announcements |
133
133
  | **Shared** | Automatic | Someone invited you | Collaboration, team rooms |
134
134
 
135
135
  ### Private Rooms
136
136
 
137
137
  - **You create them** with `createRoom()`
138
- - **You're always subscribed** - no need to call `subscribeToRoom()`
138
+ - **You're always subscribed** - no need to call `subscribeToPublicRoom()`
139
139
  - **You control agents** - add/remove agents as needed
140
140
  - **Subject to limits** - typically 1-10 rooms based on your plan
141
141
 
@@ -161,10 +161,10 @@ console.log(`Rooms: ${sdk.getOwnedRoomCount()}/${sdk.getRoomLimit()}`);
161
161
 
162
162
  ```typescript
163
163
  // Subscribe to a public room
164
- await sdk.subscribeToRoom("public-announcements");
164
+ await sdk.subscribeToPublicRoom("public-room-id");
165
165
 
166
166
  // Unsubscribe when done
167
- await sdk.unsubscribeFromRoom("public-announcements");
167
+ await sdk.unsubscribeFromPublicRoom("public-room-id");
168
168
  ```
169
169
 
170
170
  ### Room Lifecycle
@@ -239,7 +239,7 @@ Your Message: "What's the weather in Tokyo?"
239
239
  sdk.on("agent:selected", (selection) => {
240
240
  console.log(`Selected: ${selection.agentName}`);
241
241
  console.log(`Reason: ${selection.reasoning}`);
242
- console.log(`Capabilities: ${selection.capabilities.join(", ")}`);
242
+ console.log(`Capabilities: ${selection.capabilities?.map(c => c.name).join(", ")}`);
243
243
  });
244
244
  ```
245
245
 
@@ -312,13 +312,15 @@ details.capabilities?.forEach(cap => {
312
312
 
313
313
  // Commands
314
314
  details.commands?.forEach(cmd => {
315
- console.log(`- ${cmd.name}: ${cmd.description}`);
315
+ console.log(`- ${cmd.trigger}: ${cmd.description}`);
316
316
  });
317
317
 
318
- // Pricing (if paid agent)
319
- if (details.pricing) {
320
- console.log(`Price: $${details.pricing.price_per_unit} per ${details.pricing.task_unit}`);
321
- }
318
+ // Pricing (per command, if paid agent)
319
+ details.commands?.forEach(cmd => {
320
+ if (cmd.pricePerUnit) {
321
+ console.log(`${cmd.trigger}: ${cmd.pricePerUnit} per ${cmd.taskUnit}`);
322
+ }
323
+ });
322
324
  ```
323
325
 
324
326
  ### Agent Events
@@ -354,7 +356,7 @@ Understanding how messages flow through the system helps you debug and optimize
354
356
  ### Complete Flow: sendMessage to Response
355
357
 
356
358
  ```
357
- sdk.sendMessage("What's 2+2?", { room: "math-room" })
359
+ sdk.sendMessage("What's 2+2?", { room: roomId })
358
360
 
359
361
 
360
362
  ┌─────────────────────────────────────┐
@@ -370,7 +372,7 @@ sdk.sendMessage("What's 2+2?", { room: "math-room" })
370
372
  │ { │
371
373
  │ type: "message", │
372
374
  │ content: "What's 2+2?", │
373
- │ room: "math-room",
375
+ │ room: roomId,
374
376
  │ from: "0xYourWallet" │
375
377
  │ } │
376
378
  └─────────────────┬───────────────────┘
@@ -451,10 +453,22 @@ Some agents charge for their services using the X402 payment protocol. The flow
451
453
 
452
454
  The SDK includes a `PaymentSigner` that **automatically creates x402 payment headers** when you confirm a task. No manual payment encoding needed!
453
455
 
454
- - Uses **PEAQ chain** with **USDC** stablecoin
455
- - Payment headers are signed using your private key
456
+ - Supports **multiple EVM networks** with **USDC** stablecoin (PEAQ, Base, Avalanche, and more)
457
+ - **Dynamic network configuration** fetched from backend automatically
458
+ - Payment headers are signed using your private key with **x402 v2.5 settlement router** integration
456
459
  - The SDK handles all the complexity for you
457
460
 
461
+ ### Multi-Network Support
462
+
463
+ Networks are configured dynamically from the backend, enabling payments across multiple chains:
464
+
465
+ - **PEAQ Mainnet** (chainId: 3338) - Original network
466
+ - **Base Mainnet** (chainId: 8453) - Layer 2 with lower fees
467
+ - **Avalanche Mainnet** (chainId: 43114) - High-throughput chain
468
+ - **Future networks** added server-side without SDK updates
469
+
470
+ The SDK automatically fetches network configurations during `connect()` and selects the appropriate network based on the agent's requirements. See the [Multi-Network Support](#) section in the README for more details.
471
+
458
472
  ### Payment Flow
459
473
 
460
474
  ```
@@ -485,54 +499,177 @@ The SDK includes a `PaymentSigner` that **automatically creates x402 payment hea
485
499
  "Here's your analysis..."
486
500
  ```
487
501
 
488
- ### Code Example
502
+ ### API Reference
503
+
504
+ #### `requestQuote(content, room)` → `Promise<QuoteResult>`
505
+
506
+ Requests a price quote from the coordinator without auto-approval.
489
507
 
490
508
  ```typescript
491
- // 1. Request a quote
492
- const quote = await sdk.requestQuote({
493
- content: "Analyze Bitcoin trends for the past week",
494
- room: roomId
495
- });
509
+ const quote = await sdk.requestQuote(
510
+ "Analyze Bitcoin trends for the past week",
511
+ roomId
512
+ );
513
+ ```
496
514
 
497
- console.log(`Agent: ${quote.agent_name}`);
498
- console.log(`Price: $${quote.pricing.price_per_unit}`);
499
- console.log(`Expires: ${quote.expires_at}`);
515
+ **Returns `QuoteResult`:**
516
+ ```typescript
517
+ {
518
+ taskId: string; // Unique task identifier
519
+ agentId: string; // Selected agent ID
520
+ agentName: string; // Agent display name
521
+ agentWallet: string; // Agent's payment wallet address
522
+ command: string; // The command to be executed
523
+ pricing: {
524
+ pricePerUnit: number; // Price in micro-USDC
525
+ priceType: string; // e.g., "per_request"
526
+ currency: string; // e.g., "USDC"
527
+ timeUnit?: string; // e.g., "hour", "day"
528
+ network?: string; // e.g., "peaq", "base", "avalanche"
529
+ };
530
+ expiresAt: Date; // Quote expiration time
531
+ // x402 v2.5 Settlement Router fields
532
+ settlementRouter: string; // Router contract address
533
+ salt: string; // Unique transaction salt
534
+ facilitatorFee: string; // Facilitator fee amount
535
+ hook: string; // Transfer hook address
536
+ hookData?: string; // Optional hook data (default: "0x")
537
+ }
538
+ ```
500
539
 
501
- // 2. Confirm the task - SDK auto-signs the payment!
502
- await sdk.confirmTask({ taskId: quote.task_id });
540
+ #### `confirmQuote(taskId, options?)` `Promise<FormattedResponse | void>`
503
541
 
504
- // 3. Response comes via event
505
- sdk.on("agent:response", (response) => {
506
- if (response.taskId === quote.task_id) {
507
- console.log("Analysis complete:", response.content);
508
- }
542
+ Confirms a pending quote and executes the task with payment. The SDK auto-signs the x402 payment header.
543
+
544
+ ```typescript
545
+ // Fire and forget
546
+ await sdk.confirmQuote(quote.taskId);
547
+
548
+ // Wait for the agent's response
549
+ const response = await sdk.confirmQuote(quote.taskId, {
550
+ waitForResponse: true, // Block until agent responds
551
+ timeout: 30000 // Timeout in ms (default: 30000)
509
552
  });
553
+
554
+ console.log(response.humanized);
555
+ ```
556
+
557
+ #### `getPendingQuote(taskId)` → `QuoteResult | undefined`
558
+
559
+ Retrieves a pending quote that hasn't been confirmed yet.
560
+
561
+ ```typescript
562
+ const quote = sdk.getPendingQuote("task-123");
563
+ if (quote) {
564
+ console.log(`Pending: ${quote.agentName} at ${quote.pricing.pricePerUnit} USDC`);
565
+ }
566
+ ```
567
+
568
+ ### Complete Payment Example
569
+
570
+ ```typescript
571
+ import { TeneoSDK } from "@teneo-protocol/sdk";
572
+
573
+ const sdk = new TeneoSDK(
574
+ TeneoSDK.builder()
575
+ .withWebSocketUrl("wss://backend.developer.chatroom.teneo-protocol.ai/ws")
576
+ .withAuthentication(process.env.PRIVATE_KEY!)
577
+ .withPayments({
578
+ autoApprove: false, // Manual approval
579
+ maxPricePerRequest: 1000000 // Max 1 USDC (in micro-units)
580
+ })
581
+ .build()
582
+ );
583
+
584
+ await sdk.connect();
585
+
586
+ // Get a room to work with
587
+ const rooms = sdk.getRooms();
588
+ const roomId = rooms[0].id;
589
+
590
+ // 1. Request a quote
591
+ const quote = await sdk.requestQuote(
592
+ "Analyze Bitcoin trends for the past week",
593
+ roomId
594
+ );
595
+
596
+ console.log(`Agent: ${quote.agentName}`);
597
+ console.log(`Price: ${quote.pricing.pricePerUnit} micro-USDC`);
598
+ console.log(`Expires: ${quote.expiresAt}`);
599
+
600
+ // 2. Check price and confirm
601
+ if (quote.pricing.pricePerUnit <= 500000) {
602
+ // Confirm and wait for the response
603
+ const response = await sdk.confirmQuote(quote.taskId, {
604
+ waitForResponse: true,
605
+ timeout: 30000
606
+ });
607
+
608
+ console.log("Result:", response.humanized);
609
+ } else {
610
+ console.log("Too expensive, skipping");
611
+ }
612
+
613
+ sdk.disconnect();
510
614
  ```
511
615
 
512
616
  ### Payment Events
513
617
 
514
618
  ```typescript
515
- sdk.on("payment:quote", (quote) => {
516
- console.log(`Quote received: $${quote.pricing.price_per_unit}`);
517
- console.log(`Expires: ${quote.expires_at}`);
619
+ // Quote received from agent
620
+ sdk.on("quote:received", (quote) => {
621
+ console.log(`Quote: ${quote.data.pricing.pricePerUnit} USDC`);
622
+ console.log(`Expires: ${quote.data.expires_at}`);
518
623
  });
519
624
 
520
- sdk.on("payment:confirmed", (taskId) => {
521
- console.log(`Payment confirmed for task ${taskId}`);
522
- console.log("Agent is now processing your request...");
625
+ // Payment attached to request
626
+ sdk.on("payment:attached", (data) => {
627
+ console.log(`Paid ${data.amount} to agent ${data.agentId}`);
523
628
  });
524
629
 
630
+ // Payment blocked by price limit
631
+ sdk.on("payment:blocked", (data) => {
632
+ console.warn(`Blocked: agent charges ${data.agentPrice}, max is ${data.maxPrice}`);
633
+ });
634
+
635
+ // Payment errors
525
636
  sdk.on("payment:error", (error) => {
526
637
  console.error(`Payment failed: ${error.message}`);
527
638
  });
528
639
  ```
529
640
 
641
+ ### Configuration
642
+
643
+ Payment behavior can be configured two ways:
644
+
645
+ ```typescript
646
+ // Builder pattern
647
+ TeneoSDK.builder()
648
+ .withPayments({
649
+ autoApprove: true, // Auto-confirm quotes
650
+ maxPricePerRequest: 1000000, // Max 1 USDC per request
651
+ quoteTimeout: 30000 // 30s timeout for quotes
652
+ })
653
+ .build();
654
+
655
+ // Plain config object
656
+ new TeneoSDK({
657
+ wsUrl: "wss://...",
658
+ privateKey: "0x...",
659
+ autoApproveQuotes: true, // Same as autoApprove in builder
660
+ maxPricePerRequest: 1000000,
661
+ quoteTimeout: 30000
662
+ });
663
+ ```
664
+
665
+ > **Note:** `autoApprove` (builder) and `autoApproveQuotes` (config object) control the same behavior.
666
+
530
667
  ### Free vs Paid Tasks
531
668
 
532
669
  - **Free**: Message → Coordinator → Agent → Response (direct)
533
670
  - **Paid**: Message → Coordinator → Quote → Confirm → Agent → Response
534
671
 
535
- You'll know it's a paid task when you receive a `payment:quote` event instead of going directly to `agent:response`.
672
+ You'll know it's a paid task when you receive a `quote:received` event instead of going directly to `agent:response`.
536
673
 
537
674
  ---
538
675
 
@@ -588,8 +725,9 @@ The SDK is fully event-driven. Here's the complete event reference:
588
725
 
589
726
  | Event | When | Data |
590
727
  |-------|------|------|
591
- | `payment:quote` | Quote received | `(quote)` |
592
- | `payment:confirmed` | Payment confirmed | `(taskId)` |
728
+ | `quote:received` | Quote received | `(quote)` |
729
+ | `payment:attached` | Payment attached to request | `(data)` |
730
+ | `payment:blocked` | Payment blocked (price too high) | `(data)` |
593
731
  | `payment:error` | Payment error | `(error)` |
594
732
 
595
733
  ### Lifecycle Events
@@ -623,9 +761,9 @@ The SDK is fully event-driven. Here's the complete event reference:
623
761
  ```
624
762
  1. message:sent ─── Your message sent
625
763
  2. agent:selected ─── Coordinator picked agent
626
- 3. payment:quote ─── Quote received
764
+ 3. quote:received ─── Quote received
627
765
  ... user confirms payment ...
628
- 4. payment:confirmed ─── Payment validated
766
+ 4. payment:attached ─── Payment attached and validated
629
767
  5. agent:response ─── Agent responded
630
768
  ```
631
769
 
@@ -705,7 +843,7 @@ const sdk = new TeneoSDK({
705
843
  const sdk = new TeneoSDK({
706
844
  wsUrl: "...",
707
845
  privateKey: "...",
708
- reconnectionStrategy: {
846
+ reconnectStrategy: {
709
847
  type: "exponential",
710
848
  baseDelay: 3000, // 3s initial
711
849
  maxDelay: 120000, // 2 minute max
@@ -728,7 +866,7 @@ sdk.on("connection:reconnected", () => {
728
866
 
729
867
  ```typescript
730
868
  // Disconnect cleanly
731
- await sdk.disconnect();
869
+ sdk.disconnect();
732
870
 
733
871
  // Or destroy completely (removes all listeners)
734
872
  sdk.destroy();