@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
package/CONCEPTS.md ADDED
@@ -0,0 +1,747 @@
1
+ # Teneo SDK - Core Concepts
2
+
3
+ This guide explains how the Teneo Protocol works under the hood. Understanding these concepts will help you build better applications.
4
+
5
+ ## Table of Contents
6
+
7
+ - [Overview](#overview)
8
+ - [Authentication](#authentication)
9
+ - [Rooms](#rooms)
10
+ - [The Coordinator](#the-coordinator)
11
+ - [Agents](#agents)
12
+ - [Message Flow](#message-flow)
13
+ - [Payments (X402)](#payments-x402)
14
+ - [Events](#events)
15
+ - [Connection Lifecycle](#connection-lifecycle)
16
+
17
+ ---
18
+
19
+ ## Overview
20
+
21
+ The Teneo Protocol connects your application to a network of AI agents through a WebSocket connection. Here's the high-level architecture:
22
+
23
+ ```
24
+ Your Application
25
+
26
+
27
+ ┌─────────────────┐
28
+ │ Teneo SDK │ ◄── You are here
29
+ └────────┬────────┘
30
+ │ WebSocket
31
+
32
+ ┌─────────────────┐
33
+ │ Teneo Server │
34
+ │ ┌───────────┐ │
35
+ │ │Coordinator│ │ ◄── Selects the best agent for each request
36
+ │ └─────┬─────┘ │
37
+ │ │ │
38
+ │ ┌─────▼─────┐ │
39
+ │ │ Agents │ │ ◄── Specialized AI agents (weather, analytics, etc.)
40
+ │ └───────────┘ │
41
+ └─────────────────┘
42
+ ```
43
+
44
+ **Key Components:**
45
+ - **SDK**: Handles connection, authentication, and message routing
46
+ - **Coordinator**: Server-side AI that analyzes your message and picks the best agent
47
+ - **Agents**: Specialized AI agents that handle specific tasks
48
+ - **Rooms**: Isolated spaces where you interact with agents
49
+
50
+ ---
51
+
52
+ ## Authentication
53
+
54
+ Teneo uses **Web3 wallet authentication** instead of API keys. Your Ethereum private key proves your identity through cryptographic signatures.
55
+
56
+ ### How It Works
57
+
58
+ ```
59
+ 1. SDK connects to server
60
+
61
+
62
+ 2. Server sends random challenge
63
+ "Please sign: abc123xyz..."
64
+
65
+
66
+ 3. SDK signs challenge with your private key
67
+ signature = sign("Teneo authentication challenge: abc123xyz...")
68
+
69
+
70
+ 4. SDK sends signature + wallet address
71
+
72
+
73
+ 5. Server verifies signature matches address
74
+
75
+
76
+ 6. Authenticated! Server sends your rooms, limits, etc.
77
+ ```
78
+
79
+ ### Why Wallet Auth?
80
+
81
+ - **No API keys to leak** - Your identity is your wallet
82
+ - **Cryptographically secure** - Signatures can't be forged
83
+ - **Web3 native** - Works with existing Ethereum wallets
84
+ - **Your private key never leaves your machine** - Only signatures are sent
85
+
86
+ ### Code Example
87
+
88
+ ```typescript
89
+ const sdk = new TeneoSDK({
90
+ wsUrl: "wss://backend.developer.chatroom.teneo-protocol.ai/ws",
91
+ privateKey: "0xYourPrivateKey" // Used only for signing
92
+ });
93
+
94
+ // For production, use SecurePrivateKey for memory encryption
95
+ import { SecurePrivateKey } from "@teneo-protocol/sdk";
96
+ const secureKey = new SecurePrivateKey(process.env.PRIVATE_KEY);
97
+
98
+ const sdk = new TeneoSDK({
99
+ wsUrl: "...",
100
+ privateKey: secureKey // Encrypted in RAM, decrypted only when signing
101
+ });
102
+ ```
103
+
104
+ ### Events
105
+
106
+ ```typescript
107
+ sdk.on("auth:challenge", (challenge) => {
108
+ // Challenge received, SDK will sign automatically
109
+ });
110
+
111
+ sdk.on("auth:success", (state) => {
112
+ console.log(`Authenticated as ${state.walletAddress}`);
113
+ console.log(`You have ${state.rooms.length} rooms`);
114
+ });
115
+
116
+ sdk.on("auth:error", (error) => {
117
+ console.error("Authentication failed:", error.message);
118
+ });
119
+ ```
120
+
121
+ ---
122
+
123
+ ## Rooms
124
+
125
+ Rooms are isolated spaces where you send messages and receive responses from agents. Think of them as chat channels or conversation contexts.
126
+
127
+ ### Room Types
128
+
129
+ | Type | Subscription | Ownership | Use Case |
130
+ |------|-------------|-----------|----------|
131
+ | **Private** | Automatic | You own it | Personal workspace, private conversations |
132
+ | **Public** | Manual (`subscribeToRoom()`) | System/shared | Community channels, announcements |
133
+ | **Shared** | Automatic | Someone invited you | Collaboration, team rooms |
134
+
135
+ ### Private Rooms
136
+
137
+ - **You create them** with `createRoom()`
138
+ - **You're always subscribed** - no need to call `subscribeToRoom()`
139
+ - **You control agents** - add/remove agents as needed
140
+ - **Subject to limits** - typically 1-10 rooms based on your plan
141
+
142
+ ```typescript
143
+ // Check if you can create more rooms
144
+ if (sdk.canCreateRoom()) {
145
+ const room = await sdk.createRoom({
146
+ name: "My Research Room",
147
+ description: "For crypto analysis"
148
+ });
149
+ console.log(`Created room: ${room.id}`);
150
+ }
151
+
152
+ // Check your limits
153
+ console.log(`Rooms: ${sdk.getOwnedRoomCount()}/${sdk.getRoomLimit()}`);
154
+ ```
155
+
156
+ ### Public Rooms
157
+
158
+ - **System-created** or community channels
159
+ - **Require explicit subscription** to receive messages
160
+ - **Shared agents** - you can't modify the agent list
161
+
162
+ ```typescript
163
+ // Subscribe to a public room
164
+ await sdk.subscribeToRoom("public-announcements");
165
+
166
+ // Unsubscribe when done
167
+ await sdk.unsubscribeFromRoom("public-announcements");
168
+ ```
169
+
170
+ ### Room Lifecycle
171
+
172
+ ```typescript
173
+ // 1. Create a room
174
+ const room = await sdk.createRoom({ name: "My Room" });
175
+
176
+ // 2. Add agents to customize it
177
+ const available = await sdk.listAvailableAgents(room.id);
178
+ await sdk.addAgentToRoom(room.id, available[0].agent_id);
179
+
180
+ // 3. Send messages
181
+ await sdk.sendMessage("Hello!", { room: room.id });
182
+
183
+ // 4. Update room details (owner only)
184
+ await sdk.updateRoom(room.id, { name: "Renamed Room" });
185
+
186
+ // 5. Delete when done (owner only)
187
+ await sdk.deleteRoom(room.id);
188
+ ```
189
+
190
+ ### Room Events
191
+
192
+ ```typescript
193
+ sdk.on("room:created", (room) => console.log(`Created: ${room.name}`));
194
+ sdk.on("room:updated", (room) => console.log(`Updated: ${room.name}`));
195
+ sdk.on("room:deleted", (roomId) => console.log(`Deleted: ${roomId}`));
196
+ sdk.on("room:subscribed", (data) => console.log(`Subscribed to: ${data.roomId}`));
197
+ sdk.on("room:unsubscribed", (data) => console.log(`Left: ${data.roomId}`));
198
+ ```
199
+
200
+ ---
201
+
202
+ ## The Coordinator
203
+
204
+ The Coordinator is the brain of the Teneo Protocol. It analyzes your message and selects the most appropriate agent to handle it.
205
+
206
+ ### How Agent Selection Works
207
+
208
+ ```
209
+ Your Message: "What's the weather in Tokyo?"
210
+
211
+
212
+ ┌───────────────┐
213
+ │ Coordinator │
214
+ │ │
215
+ │ Analyzes: │
216
+ │ - Intent │
217
+ │ - Keywords │
218
+ │ - Context │
219
+ └───────┬───────┘
220
+
221
+ ┌───────────┼───────────┐
222
+ ▼ ▼ ▼
223
+ ┌─────────┐ ┌─────────┐ ┌─────────┐
224
+ │ Weather │ │Analytics│ │ News │
225
+ │ Agent │ │ Agent │ │ Agent │
226
+ │ ✓ MATCH │ │ ✗ │ │ ✗ │
227
+ └─────────┘ └─────────┘ └─────────┘
228
+
229
+
230
+ Weather Agent processes request
231
+
232
+
233
+ Response: "Tokyo: 22°C, Partly cloudy"
234
+ ```
235
+
236
+ ### Coordinator Events
237
+
238
+ ```typescript
239
+ sdk.on("agent:selected", (selection) => {
240
+ console.log(`Selected: ${selection.agentName}`);
241
+ console.log(`Reason: ${selection.reasoning}`);
242
+ console.log(`Capabilities: ${selection.capabilities.join(", ")}`);
243
+ });
244
+ ```
245
+
246
+ ### Bypassing the Coordinator
247
+
248
+ Use **direct commands** when you know exactly which agent you want:
249
+
250
+ ```typescript
251
+ // Regular message - Coordinator selects agent
252
+ await sdk.sendMessage("What's the weather?", { room: roomId });
253
+
254
+ // Direct command - Bypass coordinator, go straight to agent
255
+ await sdk.sendDirectCommand({
256
+ agent: "weather-agent",
257
+ command: "forecast Tokyo",
258
+ room: roomId
259
+ });
260
+ ```
261
+
262
+ ### When to Use Direct Commands
263
+
264
+ | Use Coordinator | Use Direct Command |
265
+ |-----------------|-------------------|
266
+ | General questions | Specific agent tasks |
267
+ | "Help me with..." | "Agent X, do Y" |
268
+ | Don't know which agent | Know the exact agent |
269
+ | Want intelligent routing | Want predictable routing |
270
+
271
+ ---
272
+
273
+ ## Agents
274
+
275
+ Agents are specialized AI services that handle specific tasks. Each agent has:
276
+
277
+ - **Capabilities**: What it can do (e.g., "weather-forecast", "crypto-analysis")
278
+ - **Commands**: Specific actions it supports
279
+ - **Pricing**: Free or paid per task
280
+
281
+ ### Agent Visibility in Rooms
282
+
283
+ Agents must be **assigned to a room** to respond to messages in that room.
284
+
285
+ ```typescript
286
+ // List agents currently in your room
287
+ const roomAgents = await sdk.listRoomAgents(roomId);
288
+
289
+ // List agents you can add to your room
290
+ const availableAgents = await sdk.listAvailableAgents(roomId);
291
+
292
+ // Add an agent to your room (owner only)
293
+ await sdk.addAgentToRoom(roomId, "weather-agent-001");
294
+
295
+ // Remove an agent from your room
296
+ await sdk.removeAgentFromRoom(roomId, "weather-agent-001");
297
+ ```
298
+
299
+ ### Getting Agent Details
300
+
301
+ ```typescript
302
+ const details = await sdk.getAgentDetails("weather-agent-001");
303
+
304
+ console.log(`Name: ${details.agent_name}`);
305
+ console.log(`Description: ${details.description}`);
306
+ console.log(`Status: ${details.status}`);
307
+
308
+ // Capabilities
309
+ details.capabilities?.forEach(cap => {
310
+ console.log(`- ${cap.name}: ${cap.description}`);
311
+ });
312
+
313
+ // Commands
314
+ details.commands?.forEach(cmd => {
315
+ console.log(`- ${cmd.name}: ${cmd.description}`);
316
+ });
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
+ }
322
+ ```
323
+
324
+ ### Agent Events
325
+
326
+ ```typescript
327
+ sdk.on("agent:selected", (data) => {
328
+ console.log(`${data.agentName} selected for your request`);
329
+ });
330
+
331
+ sdk.on("agent:response", (response) => {
332
+ console.log(`${response.agentName}: ${response.content}`);
333
+ });
334
+
335
+ sdk.on("agent:list", (agents) => {
336
+ console.log(`${agents.length} agents available`);
337
+ });
338
+
339
+ sdk.on("agent_room:agent_added", (roomId, agentId) => {
340
+ console.log(`Agent ${agentId} added to room ${roomId}`);
341
+ });
342
+
343
+ sdk.on("agent_room:agent_removed", (roomId, agentId) => {
344
+ console.log(`Agent ${agentId} removed from room ${roomId}`);
345
+ });
346
+ ```
347
+
348
+ ---
349
+
350
+ ## Message Flow
351
+
352
+ Understanding how messages flow through the system helps you debug and optimize your application.
353
+
354
+ ### Complete Flow: sendMessage to Response
355
+
356
+ ```
357
+ sdk.sendMessage("What's 2+2?", { room: "math-room" })
358
+
359
+
360
+ ┌─────────────────────────────────────┐
361
+ │ 1. SDK validates │
362
+ │ - Connected? ✓ │
363
+ │ - Room specified? ✓ │
364
+ │ - Content not empty? ✓ │
365
+ └─────────────────┬───────────────────┘
366
+
367
+
368
+ ┌─────────────────────────────────────┐
369
+ │ 2. Create message │
370
+ │ { │
371
+ │ type: "message", │
372
+ │ content: "What's 2+2?", │
373
+ │ room: "math-room", │
374
+ │ from: "0xYourWallet" │
375
+ │ } │
376
+ └─────────────────┬───────────────────┘
377
+
378
+
379
+ ┌─────────────────────────────────────┐
380
+ │ 3. Send over WebSocket │
381
+ │ - Rate limit check │
382
+ │ - Emit "message:sent" event │
383
+ └─────────────────┬───────────────────┘
384
+
385
+ ════════════════ Network ═══════
386
+
387
+
388
+ ┌─────────────────────────────────────┐
389
+ │ 4. Server receives message │
390
+ │ - Coordinator analyzes │
391
+ │ - Selects Math Agent │
392
+ │ - Emits "agent:selected" │
393
+ └─────────────────┬───────────────────┘
394
+
395
+
396
+ ┌─────────────────────────────────────┐
397
+ │ 5. Agent processes │
398
+ │ - Math Agent calculates │
399
+ │ - Sends response │
400
+ └─────────────────┬───────────────────┘
401
+
402
+
403
+ ┌─────────────────────────────────────┐
404
+ │ 6. SDK receives response │
405
+ │ - Parse task_response │
406
+ │ - Emit "agent:response" event │
407
+ └─────────────────────────────────────┘
408
+ ```
409
+
410
+ ### Fire-and-Forget vs Wait-for-Response
411
+
412
+ **Fire-and-Forget** (Default):
413
+ ```typescript
414
+ // Returns immediately after sending
415
+ await sdk.sendMessage("Hello", { room: roomId });
416
+
417
+ // Handle response via event
418
+ sdk.on("agent:response", (response) => {
419
+ console.log(response.content);
420
+ });
421
+ ```
422
+
423
+ **Wait-for-Response**:
424
+ ```typescript
425
+ // Blocks until response received or timeout
426
+ const response = await sdk.sendMessage("What's 2+2?", {
427
+ room: roomId,
428
+ waitForResponse: true,
429
+ timeout: 30000 // 30 seconds
430
+ });
431
+
432
+ console.log(response.content); // "4"
433
+ ```
434
+
435
+ ### When to Use Each
436
+
437
+ | Fire-and-Forget | Wait-for-Response |
438
+ |-----------------|-------------------|
439
+ | Chat interfaces | Request-response APIs |
440
+ | Real-time updates | Sequential operations |
441
+ | Multiple concurrent requests | Single request at a time |
442
+ | Non-blocking UX | Need the response to continue |
443
+
444
+ ---
445
+
446
+ ## Payments (X402)
447
+
448
+ Some agents charge for their services using the X402 payment protocol. The flow is: **Quote → Confirm → Response**.
449
+
450
+ ### Automatic Payment Signing
451
+
452
+ The SDK includes a `PaymentSigner` that **automatically creates x402 payment headers** when you confirm a task. No manual payment encoding needed!
453
+
454
+ - Uses **PEAQ chain** with **USDC** stablecoin
455
+ - Payment headers are signed using your private key
456
+ - The SDK handles all the complexity for you
457
+
458
+ ### Payment Flow
459
+
460
+ ```
461
+ 1. Request a Quote
462
+ "How much to analyze this data?"
463
+
464
+
465
+ 2. Agent Returns Quote
466
+ {
467
+ task_id: "task_123",
468
+ agent: "DataAnalyst",
469
+ price: $0.05,
470
+ expires: "in 5 minutes"
471
+ }
472
+
473
+
474
+ 3. Confirm Task
475
+ SDK auto-signs the payment!
476
+
477
+
478
+ 4. Server Validates Payment
479
+
480
+
481
+ 5. Agent Executes Task
482
+
483
+
484
+ 6. Response Delivered
485
+ "Here's your analysis..."
486
+ ```
487
+
488
+ ### Code Example
489
+
490
+ ```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
+ });
496
+
497
+ console.log(`Agent: ${quote.agent_name}`);
498
+ console.log(`Price: $${quote.pricing.price_per_unit}`);
499
+ console.log(`Expires: ${quote.expires_at}`);
500
+
501
+ // 2. Confirm the task - SDK auto-signs the payment!
502
+ await sdk.confirmTask({ taskId: quote.task_id });
503
+
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
+ }
509
+ });
510
+ ```
511
+
512
+ ### Payment Events
513
+
514
+ ```typescript
515
+ sdk.on("payment:quote", (quote) => {
516
+ console.log(`Quote received: $${quote.pricing.price_per_unit}`);
517
+ console.log(`Expires: ${quote.expires_at}`);
518
+ });
519
+
520
+ sdk.on("payment:confirmed", (taskId) => {
521
+ console.log(`Payment confirmed for task ${taskId}`);
522
+ console.log("Agent is now processing your request...");
523
+ });
524
+
525
+ sdk.on("payment:error", (error) => {
526
+ console.error(`Payment failed: ${error.message}`);
527
+ });
528
+ ```
529
+
530
+ ### Free vs Paid Tasks
531
+
532
+ - **Free**: Message → Coordinator → Agent → Response (direct)
533
+ - **Paid**: Message → Coordinator → Quote → Confirm → Agent → Response
534
+
535
+ You'll know it's a paid task when you receive a `payment:quote` event instead of going directly to `agent:response`.
536
+
537
+ ---
538
+
539
+ ## Events
540
+
541
+ The SDK is fully event-driven. Here's the complete event reference:
542
+
543
+ ### Connection Events
544
+
545
+ | Event | When | Data |
546
+ |-------|------|------|
547
+ | `connection:open` | WebSocket connected | - |
548
+ | `connection:close` | WebSocket closed | `(code, reason)` |
549
+ | `connection:error` | Connection error | `(error)` |
550
+ | `connection:reconnecting` | Attempting reconnect | `(attempt)` |
551
+ | `connection:reconnected` | Reconnect successful | - |
552
+
553
+ ### Authentication Events
554
+
555
+ | Event | When | Data |
556
+ |-------|------|------|
557
+ | `auth:challenge` | Challenge received | `(challenge)` |
558
+ | `auth:success` | Authenticated | `(authState)` |
559
+ | `auth:error` | Auth failed | `(error)` |
560
+
561
+ ### Message Events
562
+
563
+ | Event | When | Data |
564
+ |-------|------|------|
565
+ | `message:sent` | Message sent | `(message)` |
566
+ | `message:received` | Message received | `(message)` |
567
+ | `message:error` | Message error | `(error, message)` |
568
+
569
+ ### Agent Events
570
+
571
+ | Event | When | Data |
572
+ |-------|------|------|
573
+ | `agent:selected` | Coordinator selected agent | `(selection)` |
574
+ | `agent:response` | Agent responded | `(response)` |
575
+ | `agent:list` | Agent list received | `(agents)` |
576
+
577
+ ### Room Events
578
+
579
+ | Event | When | Data |
580
+ |-------|------|------|
581
+ | `room:created` | Room created | `(room)` |
582
+ | `room:updated` | Room updated | `(room)` |
583
+ | `room:deleted` | Room deleted | `(roomId)` |
584
+ | `room:subscribed` | Subscribed to room | `(data)` |
585
+ | `room:unsubscribed` | Unsubscribed from room | `(data)` |
586
+
587
+ ### Payment Events
588
+
589
+ | Event | When | Data |
590
+ |-------|------|------|
591
+ | `payment:quote` | Quote received | `(quote)` |
592
+ | `payment:confirmed` | Payment confirmed | `(taskId)` |
593
+ | `payment:error` | Payment error | `(error)` |
594
+
595
+ ### Lifecycle Events
596
+
597
+ | Event | When | Data |
598
+ |-------|------|------|
599
+ | `ready` | SDK ready to use | - |
600
+ | `disconnect` | Disconnected | - |
601
+ | `destroy` | SDK destroyed | - |
602
+ | `error` | General error | `(error)` |
603
+
604
+ ### Event Order on Connect
605
+
606
+ ```
607
+ 1. connection:open ─── WebSocket connected
608
+ 2. auth:challenge ─── Challenge received
609
+ 3. auth:success ─── Authenticated
610
+ 4. ready ─── SDK ready
611
+ ```
612
+
613
+ ### Event Order on Message (Free Agent)
614
+
615
+ ```
616
+ 1. message:sent ─── Your message sent
617
+ 2. agent:selected ─── Coordinator picked agent (optional)
618
+ 3. agent:response ─── Agent responded
619
+ ```
620
+
621
+ ### Event Order on Message (Paid Agent)
622
+
623
+ ```
624
+ 1. message:sent ─── Your message sent
625
+ 2. agent:selected ─── Coordinator picked agent
626
+ 3. payment:quote ─── Quote received
627
+ ... user confirms payment ...
628
+ 4. payment:confirmed ─── Payment validated
629
+ 5. agent:response ─── Agent responded
630
+ ```
631
+
632
+ ---
633
+
634
+ ## Connection Lifecycle
635
+
636
+ ### States
637
+
638
+ ```
639
+ ┌──────────────┐
640
+ │ DISCONNECTED │◄──────────────────────────────┐
641
+ └──────┬───────┘ │
642
+ │ connect() │
643
+ ▼ │
644
+ ┌──────────────┐ │
645
+ │ CONNECTING │ │
646
+ └──────┬───────┘ │
647
+ │ WebSocket opens │
648
+ ▼ │
649
+ ┌──────────────┐ │
650
+ │AUTHENTICATING│ │
651
+ └──────┬───────┘ │
652
+ │ auth:success │
653
+ ▼ │
654
+ ┌──────────────┐ disconnect() │
655
+ │ CONNECTED │───────────────────────────────┤
656
+ └──────┬───────┘ │
657
+ │ connection lost │
658
+ ▼ │
659
+ ┌──────────────┐ max attempts reached │
660
+ │ RECONNECTING │───────────────────────────────┘
661
+ └──────┬───────┘
662
+ │ reconnect success
663
+
664
+ ┌──────────────┐
665
+ │ CONNECTED │
666
+ └──────────────┘
667
+ ```
668
+
669
+ ### Checking State
670
+
671
+ ```typescript
672
+ // Connection state
673
+ const connState = sdk.getConnectionState();
674
+ console.log(`Connected: ${connState.connected}`);
675
+ console.log(`Authenticated: ${connState.authenticated}`);
676
+ console.log(`Reconnecting: ${connState.reconnecting}`);
677
+ console.log(`Reconnect attempts: ${connState.reconnectAttempts}`);
678
+
679
+ // Auth state
680
+ const authState = sdk.getAuthState();
681
+ console.log(`Wallet: ${authState.walletAddress}`);
682
+ console.log(`Rooms: ${authState.rooms?.length}`);
683
+ console.log(`Room limit: ${authState.maxPrivateRooms}`);
684
+ console.log(`Is admin: ${authState.isAdmin}`);
685
+
686
+ // Health check
687
+ const health = sdk.getHealth();
688
+ console.log(`Status: ${health.status}`); // 'healthy' | 'degraded' | 'unhealthy'
689
+ ```
690
+
691
+ ### Reconnection
692
+
693
+ The SDK automatically reconnects with exponential backoff:
694
+
695
+ ```typescript
696
+ const sdk = new TeneoSDK({
697
+ wsUrl: "...",
698
+ privateKey: "...",
699
+ reconnect: true, // Enable auto-reconnect
700
+ reconnectDelay: 5000, // Start with 5s delay
701
+ maxReconnectAttempts: 10 // Give up after 10 attempts
702
+ });
703
+
704
+ // Or use advanced configuration
705
+ const sdk = new TeneoSDK({
706
+ wsUrl: "...",
707
+ privateKey: "...",
708
+ reconnectionStrategy: {
709
+ type: "exponential",
710
+ baseDelay: 3000, // 3s initial
711
+ maxDelay: 120000, // 2 minute max
712
+ maxAttempts: 20,
713
+ jitter: true // Random variation to avoid thundering herd
714
+ }
715
+ });
716
+
717
+ // Monitor reconnection
718
+ sdk.on("connection:reconnecting", (attempt) => {
719
+ console.log(`Reconnecting... attempt ${attempt}`);
720
+ });
721
+
722
+ sdk.on("connection:reconnected", () => {
723
+ console.log("Reconnected successfully!");
724
+ });
725
+ ```
726
+
727
+ ### Graceful Shutdown
728
+
729
+ ```typescript
730
+ // Disconnect cleanly
731
+ await sdk.disconnect();
732
+
733
+ // Or destroy completely (removes all listeners)
734
+ sdk.destroy();
735
+ ```
736
+
737
+ ---
738
+
739
+ ## Next Steps
740
+
741
+ - **[README.md](./README.md)** - Quick start and API reference
742
+ - **[Examples](./examples/)** - Working code examples
743
+ - **[API Reference](./docs/api.md)** - Full API documentation
744
+
745
+ ---
746
+
747
+ **Built by the [Teneo Protocol Team](https://teneo-protocol.ai)**