@teneo-protocol/sdk 1.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 (281) hide show
  1. package/.dockerignore +14 -0
  2. package/.env.test.example +14 -0
  3. package/.eslintrc.json +26 -0
  4. package/.github/workflows/claude-code-review.yml +78 -0
  5. package/.github/workflows/claude-reviewer.yml +64 -0
  6. package/.github/workflows/publish-npm.yml +38 -0
  7. package/.github/workflows/push-to-main.yml +23 -0
  8. package/.node-version +1 -0
  9. package/.prettierrc +11 -0
  10. package/Dockerfile +25 -0
  11. package/LICENCE +661 -0
  12. package/README.md +709 -0
  13. package/dist/constants.d.ts +42 -0
  14. package/dist/constants.d.ts.map +1 -0
  15. package/dist/constants.js +45 -0
  16. package/dist/constants.js.map +1 -0
  17. package/dist/core/websocket-client.d.ts +261 -0
  18. package/dist/core/websocket-client.d.ts.map +1 -0
  19. package/dist/core/websocket-client.js +875 -0
  20. package/dist/core/websocket-client.js.map +1 -0
  21. package/dist/formatters/response-formatter.d.ts +354 -0
  22. package/dist/formatters/response-formatter.d.ts.map +1 -0
  23. package/dist/formatters/response-formatter.js +575 -0
  24. package/dist/formatters/response-formatter.js.map +1 -0
  25. package/dist/handlers/message-handler-registry.d.ts +155 -0
  26. package/dist/handlers/message-handler-registry.d.ts.map +1 -0
  27. package/dist/handlers/message-handler-registry.js +216 -0
  28. package/dist/handlers/message-handler-registry.js.map +1 -0
  29. package/dist/handlers/message-handlers/agent-selected-handler.d.ts +112 -0
  30. package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -0
  31. package/dist/handlers/message-handlers/agent-selected-handler.js +40 -0
  32. package/dist/handlers/message-handlers/agent-selected-handler.js.map +1 -0
  33. package/dist/handlers/message-handlers/agents-list-handler.d.ts +14 -0
  34. package/dist/handlers/message-handlers/agents-list-handler.d.ts.map +1 -0
  35. package/dist/handlers/message-handlers/agents-list-handler.js +25 -0
  36. package/dist/handlers/message-handlers/agents-list-handler.js.map +1 -0
  37. package/dist/handlers/message-handlers/auth-error-handler.d.ts +71 -0
  38. package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -0
  39. package/dist/handlers/message-handlers/auth-error-handler.js +30 -0
  40. package/dist/handlers/message-handlers/auth-error-handler.js.map +1 -0
  41. package/dist/handlers/message-handlers/auth-message-handler.d.ts +18 -0
  42. package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -0
  43. package/dist/handlers/message-handlers/auth-message-handler.js +60 -0
  44. package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -0
  45. package/dist/handlers/message-handlers/auth-required-handler.d.ts +76 -0
  46. package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -0
  47. package/dist/handlers/message-handlers/auth-required-handler.js +23 -0
  48. package/dist/handlers/message-handlers/auth-required-handler.js.map +1 -0
  49. package/dist/handlers/message-handlers/auth-success-handler.d.ts +18 -0
  50. package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -0
  51. package/dist/handlers/message-handlers/auth-success-handler.js +51 -0
  52. package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -0
  53. package/dist/handlers/message-handlers/base-handler.d.ts +55 -0
  54. package/dist/handlers/message-handlers/base-handler.d.ts.map +1 -0
  55. package/dist/handlers/message-handlers/base-handler.js +83 -0
  56. package/dist/handlers/message-handlers/base-handler.js.map +1 -0
  57. package/dist/handlers/message-handlers/challenge-handler.d.ts +73 -0
  58. package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -0
  59. package/dist/handlers/message-handlers/challenge-handler.js +47 -0
  60. package/dist/handlers/message-handlers/challenge-handler.js.map +1 -0
  61. package/dist/handlers/message-handlers/error-message-handler.d.ts +76 -0
  62. package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -0
  63. package/dist/handlers/message-handlers/error-message-handler.js +29 -0
  64. package/dist/handlers/message-handlers/error-message-handler.js.map +1 -0
  65. package/dist/handlers/message-handlers/index.d.ts +28 -0
  66. package/dist/handlers/message-handlers/index.d.ts.map +1 -0
  67. package/dist/handlers/message-handlers/index.js +100 -0
  68. package/dist/handlers/message-handlers/index.js.map +1 -0
  69. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts +122 -0
  70. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -0
  71. package/dist/handlers/message-handlers/list-rooms-response-handler.js +30 -0
  72. package/dist/handlers/message-handlers/list-rooms-response-handler.js.map +1 -0
  73. package/dist/handlers/message-handlers/ping-pong-handler.d.ts +104 -0
  74. package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -0
  75. package/dist/handlers/message-handlers/ping-pong-handler.js +36 -0
  76. package/dist/handlers/message-handlers/ping-pong-handler.js.map +1 -0
  77. package/dist/handlers/message-handlers/regular-message-handler.d.ts +56 -0
  78. package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -0
  79. package/dist/handlers/message-handlers/regular-message-handler.js +59 -0
  80. package/dist/handlers/message-handlers/regular-message-handler.js.map +1 -0
  81. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +81 -0
  82. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -0
  83. package/dist/handlers/message-handlers/subscribe-response-handler.js +48 -0
  84. package/dist/handlers/message-handlers/subscribe-response-handler.js.map +1 -0
  85. package/dist/handlers/message-handlers/task-response-handler.d.ts +14 -0
  86. package/dist/handlers/message-handlers/task-response-handler.d.ts.map +1 -0
  87. package/dist/handlers/message-handlers/task-response-handler.js +44 -0
  88. package/dist/handlers/message-handlers/task-response-handler.js.map +1 -0
  89. package/dist/handlers/message-handlers/types.d.ts +51 -0
  90. package/dist/handlers/message-handlers/types.d.ts.map +1 -0
  91. package/dist/handlers/message-handlers/types.js +7 -0
  92. package/dist/handlers/message-handlers/types.js.map +1 -0
  93. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +81 -0
  94. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -0
  95. package/dist/handlers/message-handlers/unsubscribe-response-handler.js +48 -0
  96. package/dist/handlers/message-handlers/unsubscribe-response-handler.js.map +1 -0
  97. package/dist/handlers/webhook-handler.d.ts +202 -0
  98. package/dist/handlers/webhook-handler.d.ts.map +1 -0
  99. package/dist/handlers/webhook-handler.js +511 -0
  100. package/dist/handlers/webhook-handler.js.map +1 -0
  101. package/dist/index.d.ts +71 -0
  102. package/dist/index.d.ts.map +1 -0
  103. package/dist/index.js +217 -0
  104. package/dist/index.js.map +1 -0
  105. package/dist/managers/agent-registry.d.ts +173 -0
  106. package/dist/managers/agent-registry.d.ts.map +1 -0
  107. package/dist/managers/agent-registry.js +310 -0
  108. package/dist/managers/agent-registry.js.map +1 -0
  109. package/dist/managers/connection-manager.d.ts +134 -0
  110. package/dist/managers/connection-manager.d.ts.map +1 -0
  111. package/dist/managers/connection-manager.js +176 -0
  112. package/dist/managers/connection-manager.js.map +1 -0
  113. package/dist/managers/index.d.ts +9 -0
  114. package/dist/managers/index.d.ts.map +1 -0
  115. package/dist/managers/index.js +16 -0
  116. package/dist/managers/index.js.map +1 -0
  117. package/dist/managers/message-router.d.ts +112 -0
  118. package/dist/managers/message-router.d.ts.map +1 -0
  119. package/dist/managers/message-router.js +260 -0
  120. package/dist/managers/message-router.js.map +1 -0
  121. package/dist/managers/room-manager.d.ts +165 -0
  122. package/dist/managers/room-manager.d.ts.map +1 -0
  123. package/dist/managers/room-manager.js +227 -0
  124. package/dist/managers/room-manager.js.map +1 -0
  125. package/dist/teneo-sdk.d.ts +703 -0
  126. package/dist/teneo-sdk.d.ts.map +1 -0
  127. package/dist/teneo-sdk.js +907 -0
  128. package/dist/teneo-sdk.js.map +1 -0
  129. package/dist/types/config.d.ts +1047 -0
  130. package/dist/types/config.d.ts.map +1 -0
  131. package/dist/types/config.js +720 -0
  132. package/dist/types/config.js.map +1 -0
  133. package/dist/types/error-codes.d.ts +29 -0
  134. package/dist/types/error-codes.d.ts.map +1 -0
  135. package/dist/types/error-codes.js +41 -0
  136. package/dist/types/error-codes.js.map +1 -0
  137. package/dist/types/events.d.ts +616 -0
  138. package/dist/types/events.d.ts.map +1 -0
  139. package/dist/types/events.js +261 -0
  140. package/dist/types/events.js.map +1 -0
  141. package/dist/types/health.d.ts +40 -0
  142. package/dist/types/health.d.ts.map +1 -0
  143. package/dist/types/health.js +6 -0
  144. package/dist/types/health.js.map +1 -0
  145. package/dist/types/index.d.ts +10 -0
  146. package/dist/types/index.d.ts.map +1 -0
  147. package/dist/types/index.js +123 -0
  148. package/dist/types/index.js.map +1 -0
  149. package/dist/types/messages.d.ts +3734 -0
  150. package/dist/types/messages.d.ts.map +1 -0
  151. package/dist/types/messages.js +482 -0
  152. package/dist/types/messages.js.map +1 -0
  153. package/dist/types/validation.d.ts +81 -0
  154. package/dist/types/validation.d.ts.map +1 -0
  155. package/dist/types/validation.js +115 -0
  156. package/dist/types/validation.js.map +1 -0
  157. package/dist/utils/bounded-queue.d.ts +127 -0
  158. package/dist/utils/bounded-queue.d.ts.map +1 -0
  159. package/dist/utils/bounded-queue.js +181 -0
  160. package/dist/utils/bounded-queue.js.map +1 -0
  161. package/dist/utils/circuit-breaker.d.ts +141 -0
  162. package/dist/utils/circuit-breaker.d.ts.map +1 -0
  163. package/dist/utils/circuit-breaker.js +215 -0
  164. package/dist/utils/circuit-breaker.js.map +1 -0
  165. package/dist/utils/deduplication-cache.d.ts +110 -0
  166. package/dist/utils/deduplication-cache.d.ts.map +1 -0
  167. package/dist/utils/deduplication-cache.js +177 -0
  168. package/dist/utils/deduplication-cache.js.map +1 -0
  169. package/dist/utils/event-waiter.d.ts +101 -0
  170. package/dist/utils/event-waiter.d.ts.map +1 -0
  171. package/dist/utils/event-waiter.js +118 -0
  172. package/dist/utils/event-waiter.js.map +1 -0
  173. package/dist/utils/index.d.ts +51 -0
  174. package/dist/utils/index.d.ts.map +1 -0
  175. package/dist/utils/index.js +72 -0
  176. package/dist/utils/index.js.map +1 -0
  177. package/dist/utils/logger.d.ts +22 -0
  178. package/dist/utils/logger.d.ts.map +1 -0
  179. package/dist/utils/logger.js +91 -0
  180. package/dist/utils/logger.js.map +1 -0
  181. package/dist/utils/rate-limiter.d.ts +122 -0
  182. package/dist/utils/rate-limiter.d.ts.map +1 -0
  183. package/dist/utils/rate-limiter.js +190 -0
  184. package/dist/utils/rate-limiter.js.map +1 -0
  185. package/dist/utils/retry-policy.d.ts +191 -0
  186. package/dist/utils/retry-policy.d.ts.map +1 -0
  187. package/dist/utils/retry-policy.js +225 -0
  188. package/dist/utils/retry-policy.js.map +1 -0
  189. package/dist/utils/secure-private-key.d.ts +113 -0
  190. package/dist/utils/secure-private-key.d.ts.map +1 -0
  191. package/dist/utils/secure-private-key.js +188 -0
  192. package/dist/utils/secure-private-key.js.map +1 -0
  193. package/dist/utils/signature-verifier.d.ts +143 -0
  194. package/dist/utils/signature-verifier.d.ts.map +1 -0
  195. package/dist/utils/signature-verifier.js +238 -0
  196. package/dist/utils/signature-verifier.js.map +1 -0
  197. package/dist/utils/ssrf-validator.d.ts +36 -0
  198. package/dist/utils/ssrf-validator.d.ts.map +1 -0
  199. package/dist/utils/ssrf-validator.js +195 -0
  200. package/dist/utils/ssrf-validator.js.map +1 -0
  201. package/examples/.env.example +17 -0
  202. package/examples/basic-usage.ts +211 -0
  203. package/examples/production-dashboard/.env.example +153 -0
  204. package/examples/production-dashboard/package.json +39 -0
  205. package/examples/production-dashboard/public/dashboard.html +642 -0
  206. package/examples/production-dashboard/server.ts +753 -0
  207. package/examples/webhook-integration.ts +239 -0
  208. package/examples/x-influencer-battle-redesign.html +1065 -0
  209. package/examples/x-influencer-battle-server.ts +217 -0
  210. package/examples/x-influencer-battle.html +787 -0
  211. package/package.json +65 -0
  212. package/src/constants.ts +43 -0
  213. package/src/core/websocket-client.test.ts +512 -0
  214. package/src/core/websocket-client.ts +1056 -0
  215. package/src/formatters/response-formatter.test.ts +571 -0
  216. package/src/formatters/response-formatter.ts +677 -0
  217. package/src/handlers/message-handler-registry.ts +239 -0
  218. package/src/handlers/message-handlers/agent-selected-handler.ts +40 -0
  219. package/src/handlers/message-handlers/agents-list-handler.ts +26 -0
  220. package/src/handlers/message-handlers/auth-error-handler.ts +31 -0
  221. package/src/handlers/message-handlers/auth-message-handler.ts +66 -0
  222. package/src/handlers/message-handlers/auth-required-handler.ts +23 -0
  223. package/src/handlers/message-handlers/auth-success-handler.ts +57 -0
  224. package/src/handlers/message-handlers/base-handler.ts +101 -0
  225. package/src/handlers/message-handlers/challenge-handler.ts +57 -0
  226. package/src/handlers/message-handlers/error-message-handler.ts +27 -0
  227. package/src/handlers/message-handlers/index.ts +77 -0
  228. package/src/handlers/message-handlers/list-rooms-response-handler.ts +28 -0
  229. package/src/handlers/message-handlers/ping-pong-handler.ts +30 -0
  230. package/src/handlers/message-handlers/regular-message-handler.ts +65 -0
  231. package/src/handlers/message-handlers/subscribe-response-handler.ts +47 -0
  232. package/src/handlers/message-handlers/task-response-handler.ts +45 -0
  233. package/src/handlers/message-handlers/types.ts +77 -0
  234. package/src/handlers/message-handlers/unsubscribe-response-handler.ts +47 -0
  235. package/src/handlers/webhook-handler.test.ts +789 -0
  236. package/src/handlers/webhook-handler.ts +576 -0
  237. package/src/index.ts +269 -0
  238. package/src/managers/agent-registry.test.ts +466 -0
  239. package/src/managers/agent-registry.ts +347 -0
  240. package/src/managers/connection-manager.ts +195 -0
  241. package/src/managers/index.ts +9 -0
  242. package/src/managers/message-router.ts +349 -0
  243. package/src/managers/room-manager.ts +248 -0
  244. package/src/teneo-sdk.ts +1022 -0
  245. package/src/types/config.test.ts +325 -0
  246. package/src/types/config.ts +799 -0
  247. package/src/types/error-codes.ts +44 -0
  248. package/src/types/events.test.ts +302 -0
  249. package/src/types/events.ts +382 -0
  250. package/src/types/health.ts +46 -0
  251. package/src/types/index.ts +199 -0
  252. package/src/types/messages.test.ts +660 -0
  253. package/src/types/messages.ts +570 -0
  254. package/src/types/validation.ts +123 -0
  255. package/src/utils/bounded-queue.test.ts +356 -0
  256. package/src/utils/bounded-queue.ts +205 -0
  257. package/src/utils/circuit-breaker.test.ts +394 -0
  258. package/src/utils/circuit-breaker.ts +262 -0
  259. package/src/utils/deduplication-cache.test.ts +380 -0
  260. package/src/utils/deduplication-cache.ts +198 -0
  261. package/src/utils/event-waiter.test.ts +381 -0
  262. package/src/utils/event-waiter.ts +172 -0
  263. package/src/utils/index.ts +74 -0
  264. package/src/utils/logger.ts +87 -0
  265. package/src/utils/rate-limiter.test.ts +341 -0
  266. package/src/utils/rate-limiter.ts +211 -0
  267. package/src/utils/retry-policy.test.ts +558 -0
  268. package/src/utils/retry-policy.ts +272 -0
  269. package/src/utils/secure-private-key.test.ts +356 -0
  270. package/src/utils/secure-private-key.ts +205 -0
  271. package/src/utils/signature-verifier.test.ts +464 -0
  272. package/src/utils/signature-verifier.ts +298 -0
  273. package/src/utils/ssrf-validator.test.ts +372 -0
  274. package/src/utils/ssrf-validator.ts +224 -0
  275. package/tests/integration/real-server.test.ts +740 -0
  276. package/tests/integration/websocket.test.ts +381 -0
  277. package/tests/integration-setup.ts +16 -0
  278. package/tests/setup.ts +34 -0
  279. package/tsconfig.json +32 -0
  280. package/vitest.config.ts +42 -0
  281. package/vitest.integration.config.ts +23 -0
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Message handlers index
3
+ * Exports all message handlers and provides convenience functions
4
+ */
5
+
6
+ // Export types
7
+ export * from "./types";
8
+ export * from "./base-handler";
9
+
10
+ // Export all handlers
11
+ export { TaskResponseHandler } from "./task-response-handler";
12
+ export { AgentSelectedHandler } from "./agent-selected-handler";
13
+ export { ChallengeHandler } from "./challenge-handler";
14
+ export { AuthMessageHandler } from "./auth-message-handler";
15
+ export { AuthSuccessHandler } from "./auth-success-handler";
16
+ export { AuthErrorHandler } from "./auth-error-handler";
17
+ export { AuthRequiredHandler } from "./auth-required-handler";
18
+ export { AgentsListHandler } from "./agents-list-handler";
19
+ export { ErrorMessageHandler } from "./error-message-handler";
20
+ export { RegularMessageHandler } from "./regular-message-handler";
21
+ export { PingHandler, PongHandler } from "./ping-pong-handler";
22
+ export { SubscribeResponseHandler } from "./subscribe-response-handler";
23
+ export { UnsubscribeResponseHandler } from "./unsubscribe-response-handler";
24
+ export { ListRoomsResponseHandler } from "./list-rooms-response-handler";
25
+
26
+ // Import for convenience function
27
+ import { TaskResponseHandler } from "./task-response-handler";
28
+ import { AgentSelectedHandler } from "./agent-selected-handler";
29
+ import { ChallengeHandler } from "./challenge-handler";
30
+ import { AuthMessageHandler } from "./auth-message-handler";
31
+ import { AuthSuccessHandler } from "./auth-success-handler";
32
+ import { AuthErrorHandler } from "./auth-error-handler";
33
+ import { AuthRequiredHandler } from "./auth-required-handler";
34
+ import { AgentsListHandler } from "./agents-list-handler";
35
+ import { ErrorMessageHandler } from "./error-message-handler";
36
+ import { RegularMessageHandler } from "./regular-message-handler";
37
+ import { PingHandler, PongHandler } from "./ping-pong-handler";
38
+ import { SubscribeResponseHandler } from "./subscribe-response-handler";
39
+ import { UnsubscribeResponseHandler } from "./unsubscribe-response-handler";
40
+ import { ListRoomsResponseHandler } from "./list-rooms-response-handler";
41
+ import { MessageHandler } from "./types";
42
+
43
+ /**
44
+ * Get all default message handlers
45
+ * @param clientType - The client type for authentication (default: "user")
46
+ * @returns Array of all default handlers
47
+ */
48
+ export function getDefaultHandlers(
49
+ clientType: "user" | "agent" | "coordinator" = "user"
50
+ ): MessageHandler[] {
51
+ return [
52
+ // Authentication handlers
53
+ new ChallengeHandler(clientType),
54
+ new AuthMessageHandler(),
55
+ new AuthSuccessHandler(),
56
+ new AuthErrorHandler(),
57
+ new AuthRequiredHandler(),
58
+
59
+ // Agent/coordinator handlers
60
+ new TaskResponseHandler(),
61
+ new AgentSelectedHandler(),
62
+ new AgentsListHandler(),
63
+
64
+ // Message handlers
65
+ new RegularMessageHandler(),
66
+ new ErrorMessageHandler(),
67
+
68
+ // Room handlers
69
+ new SubscribeResponseHandler(),
70
+ new UnsubscribeResponseHandler(),
71
+ new ListRoomsResponseHandler(),
72
+
73
+ // Keepalive handlers
74
+ new PingHandler(),
75
+ new PongHandler()
76
+ ];
77
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Handler for list_rooms response messages
3
+ * Processes room list from server
4
+ */
5
+
6
+ import { ListRoomsResponse, ListRoomsResponseSchema } from "../../types";
7
+ import { BaseMessageHandler } from "./base-handler";
8
+ import { HandlerContext } from "./types";
9
+
10
+ export class ListRoomsResponseHandler extends BaseMessageHandler<ListRoomsResponse> {
11
+ readonly type = "list_rooms" as const;
12
+ readonly schema = ListRoomsResponseSchema;
13
+
14
+ protected handleValidated(message: ListRoomsResponse, context: HandlerContext): void {
15
+ context.logger.debug("Handling list_rooms response", {
16
+ roomCount: message.data.rooms.length
17
+ });
18
+
19
+ // Emit room:list event with room info array
20
+ this.emit(context, "room:list", message.data.rooms);
21
+
22
+ // Send webhook (fire-and-forget)
23
+ this.sendWebhook(context, "room_list", {
24
+ rooms: message.data.rooms,
25
+ count: message.data.rooms.length
26
+ });
27
+ }
28
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Handler for ping and pong messages
3
+ * These are keepalive messages that don't require special handling
4
+ */
5
+
6
+ import { PingMessage, PongMessage, PingMessageSchema, PongMessageSchema } from "../../types";
7
+ import { BaseMessageHandler } from "./base-handler";
8
+ import { HandlerContext } from "./types";
9
+
10
+ export class PingHandler extends BaseMessageHandler<PingMessage> {
11
+ readonly type = "ping" as const;
12
+ readonly schema = PingMessageSchema;
13
+
14
+ protected async handleValidated(_message: PingMessage, context: HandlerContext): Promise<void> {
15
+ // Ping messages are handled at the WebSocket level (ws library)
16
+ // No special processing needed here
17
+ context.logger.debug("Received ping");
18
+ }
19
+ }
20
+
21
+ export class PongHandler extends BaseMessageHandler<PongMessage> {
22
+ readonly type = "pong" as const;
23
+ readonly schema = PongMessageSchema;
24
+
25
+ protected async handleValidated(_message: PongMessage, context: HandlerContext): Promise<void> {
26
+ // Pong messages are handled at the WebSocket level (ws library)
27
+ // No special processing needed here
28
+ context.logger.debug("Received pong");
29
+ }
30
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Handler for regular 'message' type messages
3
+ * Processes messages from agents (when they send 'message' instead of 'task_response')
4
+ */
5
+
6
+ import { UserMessage, UserMessageSchema } from "../../types";
7
+ import { AgentResponse } from "../../types/events";
8
+ import { BaseMessageHandler } from "./base-handler";
9
+ import { HandlerContext } from "./types";
10
+
11
+ export class RegularMessageHandler extends BaseMessageHandler<UserMessage> {
12
+ readonly type = "message" as const;
13
+ readonly schema = UserMessageSchema;
14
+
15
+ protected async handleValidated(message: UserMessage, context: HandlerContext): Promise<void> {
16
+ // Check if this message has a 'from' field and content
17
+ if (!message.from || !message.content) {
18
+ return;
19
+ }
20
+
21
+ if (!message.room) {
22
+ context.logger.warn("Inbound 'message' lacks room; proceeding without room context", {
23
+ from: message.from
24
+ });
25
+ }
26
+
27
+ const authState = context.getAuthState();
28
+ const fromLower = message.from.toLowerCase();
29
+ const walletLower = authState.walletAddress?.toLowerCase();
30
+
31
+ context.logger.debug('Received message type "message"', {
32
+ from: message.from,
33
+ fromLower,
34
+ walletLower
35
+ });
36
+
37
+ // If message is NOT from the user's wallet, it's likely from an agent
38
+ // Treat it as an agent response
39
+ if (fromLower !== walletLower) {
40
+ context.logger.info("Treating message as agent response", {
41
+ from: message.from,
42
+ contentPreview:
43
+ typeof message.content === "string" ? message.content.substring(0, 100) : "non-string",
44
+ room: message.room
45
+ });
46
+
47
+ // Build agent response
48
+ const response: AgentResponse = {
49
+ taskId: message.data?.task_id || `msg-${Date.now()}`,
50
+ agentId: message.from,
51
+ agentName: message.data?.agent_name || "Agent",
52
+ content:
53
+ typeof message.content === "string" ? message.content : JSON.stringify(message.content),
54
+ contentType: message.content_type || "text/plain",
55
+ success: true,
56
+ timestamp: new Date(),
57
+ humanized:
58
+ typeof message.content === "string" ? message.content : JSON.stringify(message.content)
59
+ };
60
+
61
+ // Emit agent:response event
62
+ this.emit(context, "agent:response", response);
63
+ }
64
+ }
65
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Handler for subscribe response messages
3
+ * Processes room subscription confirmations
4
+ */
5
+
6
+ import { SubscribeResponse, SubscribeResponseSchema } from "../../types";
7
+ import { BaseMessageHandler } from "./base-handler";
8
+ import { HandlerContext } from "./types";
9
+
10
+ export class SubscribeResponseHandler extends BaseMessageHandler<SubscribeResponse> {
11
+ readonly type = "subscribe" as const;
12
+ readonly schema = SubscribeResponseSchema;
13
+
14
+ protected handleValidated(message: SubscribeResponse, context: HandlerContext): void {
15
+ context.logger.debug("Handling subscribe response", {
16
+ roomId: message.data.room_id,
17
+ success: message.data.success
18
+ });
19
+
20
+ if (message.data.success) {
21
+ // Update subscription state from server's authoritative list
22
+ if (context.roomManager && message.data.subscriptions) {
23
+ context.roomManager.updateSubscriptions(message.data.subscriptions);
24
+ }
25
+
26
+ // Emit room:subscribed event
27
+ this.emit(context, "room:subscribed", {
28
+ roomId: message.data.room_id,
29
+ subscriptions: message.data.subscriptions || []
30
+ });
31
+
32
+ // Send webhook (fire-and-forget)
33
+ this.sendWebhook(context, "room_subscribed", {
34
+ roomId: message.data.room_id,
35
+ subscriptions: message.data.subscriptions
36
+ });
37
+ } else {
38
+ context.logger.warn("Room subscription failed", {
39
+ roomId: message.data.room_id,
40
+ message: message.data.message
41
+ });
42
+
43
+ // Emit error event
44
+ this.emit(context, "error", new Error(`Subscription failed: ${message.data.message}`));
45
+ }
46
+ }
47
+ }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Handler for task_response messages
3
+ * Processes agent responses to tasks
4
+ */
5
+
6
+ import { z } from "zod";
7
+ import { TaskResponseMessage, TaskResponseMessageSchema } from "../../types";
8
+ import { AgentResponse } from "../../types/events";
9
+ import { BaseMessageHandler } from "./base-handler";
10
+ import { HandlerContext } from "./types";
11
+
12
+ export class TaskResponseHandler extends BaseMessageHandler<TaskResponseMessage> {
13
+ readonly type = "task_response" as const;
14
+ readonly schema = TaskResponseMessageSchema as z.ZodSchema<TaskResponseMessage>;
15
+
16
+ protected handleValidated(message: TaskResponseMessage, context: HandlerContext): void {
17
+ context.logger.debug("Handling task_response message", {
18
+ taskId: message.data.task_id,
19
+ from: message.from
20
+ });
21
+
22
+ // Build agent response
23
+ const response: AgentResponse = {
24
+ taskId: message.data.task_id,
25
+ agentId: message.from || "",
26
+ agentName: message.data.agent_name,
27
+ content: message.content,
28
+ contentType: message.content_type,
29
+ success: message.data.success !== false,
30
+ error: message.data.error,
31
+ timestamp: new Date(),
32
+ raw: message,
33
+ humanized: message.content
34
+ };
35
+
36
+ // Emit agent:response event
37
+ this.emit(context, "agent:response", response);
38
+
39
+ // Send webhook (fire-and-forget)
40
+ this.sendWebhook(context, "task_response", response, {
41
+ agentId: response.agentId,
42
+ taskId: response.taskId
43
+ });
44
+ }
45
+ }
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Types and interfaces for the Message Handler Registry pattern
3
+ * Defines the contract for message handlers and their context
4
+ */
5
+
6
+ import { z } from "zod";
7
+ import { BaseMessage, MessageType, Logger, WebhookEventType } from "../../types";
8
+ import { FormattedResponse } from "../../formatters/response-formatter";
9
+ import { PrivateKeyAccount } from "viem/accounts";
10
+
11
+ /**
12
+ * Context provided to message handlers
13
+ * Contains all dependencies needed to handle messages
14
+ */
15
+ export interface HandlerContext {
16
+ // Event emission
17
+ emit: (event: string, ...args: any[]) => void;
18
+
19
+ // Webhook delivery
20
+ sendWebhook: (type: WebhookEventType, data: any, metadata?: any) => Promise<void>;
21
+
22
+ // Response formatting (optional)
23
+ formatResponse?: (message: BaseMessage) => FormattedResponse;
24
+
25
+ // Logging
26
+ logger: Logger;
27
+
28
+ // State access
29
+ getConnectionState: () => any;
30
+ getAuthState: () => any;
31
+ updateConnectionState: (update: any) => void;
32
+ updateAuthState: (update: any) => void;
33
+
34
+ // Room manager for subscription updates (optional)
35
+ roomManager?: any;
36
+
37
+ // Account for signing (optional, for auth handlers)
38
+ account?: PrivateKeyAccount;
39
+
40
+ // Send message back to server
41
+ sendMessage: (message: BaseMessage) => Promise<void>;
42
+ }
43
+
44
+ /**
45
+ * Message handler interface
46
+ * Each message type has a handler implementing this interface
47
+ */
48
+ export interface MessageHandler<T extends BaseMessage = BaseMessage> {
49
+ // Message type this handler processes
50
+ readonly type: MessageType;
51
+
52
+ // Zod schema for validation
53
+ readonly schema: z.ZodSchema<T>;
54
+
55
+ // Handle the message
56
+ handle(message: BaseMessage, context: HandlerContext): Promise<void> | void;
57
+
58
+ // Validate if this handler can handle a message
59
+ canHandle(message: BaseMessage): boolean;
60
+ }
61
+
62
+ /**
63
+ * Handler metadata for registration
64
+ */
65
+ export interface HandlerMetadata {
66
+ type: MessageType;
67
+ description?: string;
68
+ priority?: number; // For handler ordering (lower = higher priority)
69
+ }
70
+
71
+ /**
72
+ * Handler registration options
73
+ */
74
+ export interface HandlerRegistrationOptions {
75
+ replace?: boolean; // Replace existing handler for this type
76
+ priority?: number; // Handler priority
77
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Handler for unsubscribe response messages
3
+ * Processes room unsubscription confirmations
4
+ */
5
+
6
+ import { UnsubscribeResponse, UnsubscribeResponseSchema } from "../../types";
7
+ import { BaseMessageHandler } from "./base-handler";
8
+ import { HandlerContext } from "./types";
9
+
10
+ export class UnsubscribeResponseHandler extends BaseMessageHandler<UnsubscribeResponse> {
11
+ readonly type = "unsubscribe" as const;
12
+ readonly schema = UnsubscribeResponseSchema;
13
+
14
+ protected handleValidated(message: UnsubscribeResponse, context: HandlerContext): void {
15
+ context.logger.debug("Handling unsubscribe response", {
16
+ roomId: message.data.room_id,
17
+ success: message.data.success
18
+ });
19
+
20
+ if (message.data.success) {
21
+ // Update subscription state from server's authoritative list
22
+ if (context.roomManager && message.data.subscriptions) {
23
+ context.roomManager.updateSubscriptions(message.data.subscriptions);
24
+ }
25
+
26
+ // Emit room:unsubscribed event
27
+ this.emit(context, "room:unsubscribed", {
28
+ roomId: message.data.room_id,
29
+ subscriptions: message.data.subscriptions || []
30
+ });
31
+
32
+ // Send webhook (fire-and-forget)
33
+ this.sendWebhook(context, "room_unsubscribed", {
34
+ roomId: message.data.room_id,
35
+ subscriptions: message.data.subscriptions
36
+ });
37
+ } else {
38
+ context.logger.warn("Room unsubscription failed", {
39
+ roomId: message.data.room_id,
40
+ message: message.data.message
41
+ });
42
+
43
+ // Emit error event
44
+ this.emit(context, "error", new Error(`Unsubscription failed: ${message.data.message}`));
45
+ }
46
+ }
47
+ }