@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,112 @@
1
+ /**
2
+ * MessageRouter - Manages message sending and routing
3
+ * Handles user messages, direct commands, and message-response patterns
4
+ */
5
+ import { EventEmitter } from "eventemitter3";
6
+ import { WebSocketClient } from "../core/websocket-client";
7
+ import { WebhookHandler } from "../handlers/webhook-handler";
8
+ import { ResponseFormatter, FormattedResponse } from "../formatters/response-formatter";
9
+ import { Logger, ResponseFormat } from "../types";
10
+ import { SDKEvents } from "../types/events";
11
+ export interface SendMessageOptions {
12
+ room: string;
13
+ from?: string;
14
+ waitForResponse?: boolean;
15
+ timeout?: number;
16
+ format?: ResponseFormat | "raw" | "humanized";
17
+ }
18
+ export interface AgentCommand {
19
+ agent: string;
20
+ command: string;
21
+ room: string;
22
+ }
23
+ export declare class MessageRouter extends EventEmitter<SDKEvents> {
24
+ private readonly wsClient;
25
+ private readonly webhookHandler;
26
+ private readonly responseFormatter;
27
+ private readonly logger;
28
+ private readonly messageTimeout;
29
+ private readonly responseFormat;
30
+ constructor(wsClient: WebSocketClient, webhookHandler: WebhookHandler, responseFormatter: ResponseFormatter, logger: Logger, config: {
31
+ messageTimeout?: number;
32
+ responseFormat?: ResponseFormat;
33
+ });
34
+ /**
35
+ * Sends a message to agents via the coordinator.
36
+ * The coordinator intelligently selects the most appropriate agent.
37
+ * Supports optional response waiting with configurable timeout and format.
38
+ *
39
+ * @param content - The message content to send
40
+ * @param options - Configuration for message sending
41
+ * @param options.room - Room to send to (required)
42
+ * @param options.from - Sender address (defaults to authenticated wallet)
43
+ * @param options.waitForResponse - Whether to wait for response (default: false)
44
+ * @param options.timeout - Response timeout in ms (default: 60000)
45
+ * @param options.format - Response format: 'raw', 'humanized', or 'both'
46
+ * @returns Promise resolving to FormattedResponse if waiting, void otherwise
47
+ * @throws {SDKError} If not connected
48
+ * @throws {ValidationError} If content is empty, room not specified, or options invalid
49
+ * @throws {TimeoutError} If waitForResponse and timeout exceeded
50
+ *
51
+ * @example
52
+ * ```typescript
53
+ * // Fire and forget
54
+ * await messageRouter.sendMessage('What is the weather?', { room: 'general' });
55
+ *
56
+ * // Wait for response
57
+ * const response = await messageRouter.sendMessage('Calculate 2+2', {
58
+ * room: 'general',
59
+ * waitForResponse: true,
60
+ * timeout: 30000
61
+ * });
62
+ * console.log(response.humanized);
63
+ * ```
64
+ */
65
+ sendMessage(content: string, options: SendMessageOptions): Promise<FormattedResponse | void>;
66
+ /**
67
+ * Sends a direct command to a specific agent, bypassing the coordinator.
68
+ * Formats command as "@agentName command" internally.
69
+ *
70
+ * @param command - The direct agent command configuration
71
+ * @param command.agent - Agent ID or name to send command to
72
+ * @param command.command - Command text to send
73
+ * @param command.room - Room to send in (required)
74
+ * @returns Promise that resolves when command is sent
75
+ * @throws {SDKError} If not connected
76
+ * @throws {ValidationError} If agent/command empty or room not specified
77
+ *
78
+ * @example
79
+ * ```typescript
80
+ * await messageRouter.sendDirectCommand({
81
+ * agent: 'weather-agent',
82
+ * command: 'Get forecast for Tokyo',
83
+ * room: 'general'
84
+ * });
85
+ * ```
86
+ */
87
+ sendDirectCommand(command: AgentCommand): Promise<FormattedResponse | void>;
88
+ /**
89
+ * Send message and wait for agent response
90
+ * Uses event-waiter utility for clean Promise-based waiting with automatic cleanup
91
+ */
92
+ private sendMessageAndWaitForResponse;
93
+ /**
94
+ * Set up event forwarding from WebSocket client
95
+ */
96
+ private setupEventForwarding;
97
+ /**
98
+ * Destroys the message router and cleans up resources.
99
+ * Removes all event listeners and marks the router as destroyed.
100
+ * After destruction, the router cannot be reused.
101
+ *
102
+ * Note: Any pending waitForEvent calls will automatically timeout and clean up.
103
+ *
104
+ * @example
105
+ * ```typescript
106
+ * messageRouter.destroy();
107
+ * console.log('Message router destroyed');
108
+ * ```
109
+ */
110
+ destroy(): void;
111
+ }
112
+ //# sourceMappingURL=message-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-router.d.ts","sourceRoot":"","sources":["../../src/managers/message-router.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACxF,OAAO,EAGL,MAAM,EACN,cAAc,EAEf,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,SAAS,EAA4C,MAAM,iBAAiB,CAAC;AAUtF,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,cAAc,GAAG,KAAK,GAAG,WAAW,CAAC;CAC/C;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,aAAc,SAAQ,YAAY,CAAC,SAAS,CAAC;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;gBAG9C,QAAQ,EAAE,eAAe,EACzB,cAAc,EAAE,cAAc,EAC9B,iBAAiB,EAAE,iBAAiB,EACpC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE;QACN,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,cAAc,CAAC,EAAE,cAAc,CAAC;KACjC;IAaH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACU,WAAW,CACtB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAiCpC;;;;;;;;;;;;;;;;;;;;OAoBG;IACU,iBAAiB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAmCxF;;;OAGG;YACW,6BAA6B;IA8C3C;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAkF5B;;;;;;;;;;;;OAYG;IACI,OAAO,IAAI,IAAI;CAOvB"}
@@ -0,0 +1,260 @@
1
+ "use strict";
2
+ /**
3
+ * MessageRouter - Manages message sending and routing
4
+ * Handles user messages, direct commands, and message-response patterns
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.MessageRouter = void 0;
8
+ const eventemitter3_1 = require("eventemitter3");
9
+ const uuid_1 = require("uuid");
10
+ const types_1 = require("../types");
11
+ const events_1 = require("../types/events");
12
+ const error_codes_1 = require("../types/error-codes");
13
+ const constants_1 = require("../constants");
14
+ const validation_1 = require("../types/validation");
15
+ const event_waiter_1 = require("../utils/event-waiter");
16
+ class MessageRouter extends eventemitter3_1.EventEmitter {
17
+ constructor(wsClient, webhookHandler, responseFormatter, logger, config) {
18
+ super();
19
+ this.wsClient = wsClient;
20
+ this.webhookHandler = webhookHandler;
21
+ this.responseFormatter = responseFormatter;
22
+ this.logger = logger;
23
+ this.messageTimeout = config.messageTimeout ?? constants_1.TIMEOUTS.DEFAULT_MESSAGE_TIMEOUT;
24
+ this.responseFormat = config.responseFormat ?? "humanized";
25
+ this.setupEventForwarding();
26
+ }
27
+ /**
28
+ * Sends a message to agents via the coordinator.
29
+ * The coordinator intelligently selects the most appropriate agent.
30
+ * Supports optional response waiting with configurable timeout and format.
31
+ *
32
+ * @param content - The message content to send
33
+ * @param options - Configuration for message sending
34
+ * @param options.room - Room to send to (required)
35
+ * @param options.from - Sender address (defaults to authenticated wallet)
36
+ * @param options.waitForResponse - Whether to wait for response (default: false)
37
+ * @param options.timeout - Response timeout in ms (default: 60000)
38
+ * @param options.format - Response format: 'raw', 'humanized', or 'both'
39
+ * @returns Promise resolving to FormattedResponse if waiting, void otherwise
40
+ * @throws {SDKError} If not connected
41
+ * @throws {ValidationError} If content is empty, room not specified, or options invalid
42
+ * @throws {TimeoutError} If waitForResponse and timeout exceeded
43
+ *
44
+ * @example
45
+ * ```typescript
46
+ * // Fire and forget
47
+ * await messageRouter.sendMessage('What is the weather?', { room: 'general' });
48
+ *
49
+ * // Wait for response
50
+ * const response = await messageRouter.sendMessage('Calculate 2+2', {
51
+ * room: 'general',
52
+ * waitForResponse: true,
53
+ * timeout: 30000
54
+ * });
55
+ * console.log(response.humanized);
56
+ * ```
57
+ */
58
+ async sendMessage(content, options) {
59
+ if (!this.wsClient.isConnected) {
60
+ throw new events_1.SDKError("Not connected to Teneo network", error_codes_1.ErrorCode.NOT_CONNECTED);
61
+ }
62
+ // Validate content
63
+ const validatedContent = validation_1.MessageContentSchema.parse(content);
64
+ const room = options.room;
65
+ if (!room) {
66
+ throw new events_1.ValidationError("Room parameter is required");
67
+ }
68
+ // Use custom 'from' address if provided, otherwise use wallet address from auth state
69
+ const authState = this.wsClient.getAuthState();
70
+ const fromAddress = options.from ?? authState.walletAddress;
71
+ const message = (0, types_1.createUserMessage)(validatedContent, room, fromAddress);
72
+ this.logger.debug("MessageRouter: Sending message", {
73
+ content: validatedContent,
74
+ room,
75
+ from: fromAddress
76
+ });
77
+ if (options.waitForResponse) {
78
+ return await this.sendMessageAndWaitForResponse(message, options);
79
+ }
80
+ else {
81
+ await this.wsClient.sendMessage(message);
82
+ await this.webhookHandler.sendMessageWebhook(message);
83
+ }
84
+ }
85
+ /**
86
+ * Sends a direct command to a specific agent, bypassing the coordinator.
87
+ * Formats command as "@agentName command" internally.
88
+ *
89
+ * @param command - The direct agent command configuration
90
+ * @param command.agent - Agent ID or name to send command to
91
+ * @param command.command - Command text to send
92
+ * @param command.room - Room to send in (required)
93
+ * @returns Promise that resolves when command is sent
94
+ * @throws {SDKError} If not connected
95
+ * @throws {ValidationError} If agent/command empty or room not specified
96
+ *
97
+ * @example
98
+ * ```typescript
99
+ * await messageRouter.sendDirectCommand({
100
+ * agent: 'weather-agent',
101
+ * command: 'Get forecast for Tokyo',
102
+ * room: 'general'
103
+ * });
104
+ * ```
105
+ */
106
+ async sendDirectCommand(command) {
107
+ if (!this.wsClient.isConnected) {
108
+ throw new events_1.SDKError("Not connected to Teneo network", error_codes_1.ErrorCode.NOT_CONNECTED);
109
+ }
110
+ // Validate command
111
+ const validatedAgent = validation_1.AgentIdSchema.parse(command.agent);
112
+ const validatedCommand = validation_1.AgentCommandContentSchema.parse(command.command);
113
+ const room = command.room;
114
+ if (!room) {
115
+ throw new events_1.ValidationError("Room parameter is required");
116
+ }
117
+ // Get wallet address from auth state
118
+ const authState = this.wsClient.getAuthState();
119
+ const walletAddress = authState.walletAddress;
120
+ // Format as direct command
121
+ const content = `@${validatedAgent} ${validatedCommand}`;
122
+ const message = (0, types_1.createUserMessage)(content, room, walletAddress);
123
+ this.logger.debug("MessageRouter: Sending direct command", {
124
+ agent: validatedAgent,
125
+ command: validatedCommand,
126
+ room,
127
+ from: walletAddress
128
+ });
129
+ await this.wsClient.sendMessage(message);
130
+ await this.webhookHandler.sendMessageWebhook(message);
131
+ }
132
+ /**
133
+ * Send message and wait for agent response
134
+ * Uses event-waiter utility for clean Promise-based waiting with automatic cleanup
135
+ */
136
+ async sendMessageAndWaitForResponse(message, options) {
137
+ // Generate unique request ID for correlation
138
+ const requestId = (0, uuid_1.v4)();
139
+ const timeout = options.timeout ?? this.messageTimeout;
140
+ const format = options.format ?? this.responseFormat;
141
+ // Add client_request_id to message data for server-side correlation
142
+ const messageWithId = {
143
+ ...message,
144
+ data: {
145
+ ...(message.data || {}),
146
+ client_request_id: requestId
147
+ }
148
+ };
149
+ this.logger.debug("Sending message with request tracking", { requestId });
150
+ // Send message first (fail fast if send fails)
151
+ await this.wsClient.sendMessage(messageWithId);
152
+ // Wait for agent response with automatic timeout and cleanup
153
+ // The filter ensures we only match responses for THIS specific request
154
+ const response = await (0, event_waiter_1.waitForEvent)(this.wsClient, "agent:response", {
155
+ timeout,
156
+ filter: (r) => {
157
+ // Try to match by client_request_id if server echoes it back
158
+ const responseRequestId = r.raw?.data && "client_request_id" in r.raw.data
159
+ ? r.raw.data.client_request_id
160
+ : undefined;
161
+ return responseRequestId === requestId;
162
+ },
163
+ timeoutMessage: `Message timeout - no response received after ${timeout}ms (requestId: ${requestId})`
164
+ });
165
+ // Format response according to requested format
166
+ if (format === "raw" && response.raw) {
167
+ return response.raw;
168
+ }
169
+ return response;
170
+ }
171
+ /**
172
+ * Set up event forwarding from WebSocket client
173
+ */
174
+ setupEventForwarding() {
175
+ // Forward message events
176
+ this.wsClient.on("message:sent", (message) => {
177
+ this.emit("message:sent", message);
178
+ // Fire and forget - don't block event emission
179
+ this.webhookHandler.sendMessageWebhook(message).catch((error) => {
180
+ this.logger.error("Failed to send webhook for message:sent", error);
181
+ });
182
+ });
183
+ this.wsClient.on("message:received", (message) => {
184
+ this.emit("message:received", message);
185
+ // Send webhook for received messages (fire-and-forget)
186
+ if (message.type !== "ping" && message.type !== "pong") {
187
+ this.webhookHandler.sendMessageWebhook(message).catch((error) => {
188
+ this.logger.error("Failed to send webhook for message:received", error);
189
+ });
190
+ }
191
+ });
192
+ this.wsClient.on("message:error", (error, message) => this.emit("message:error", error, message));
193
+ // Forward agent events
194
+ this.wsClient.on("agent:selected", (data) => {
195
+ this.emit("agent:selected", data);
196
+ // Fire and forget - don't block event emission
197
+ this.webhookHandler
198
+ .sendWebhook("agent_selected", data, {
199
+ agentId: data.agentId
200
+ })
201
+ .catch((error) => {
202
+ this.logger.error("Failed to send webhook for agent:selected", error);
203
+ });
204
+ });
205
+ this.wsClient.on("agent:response", (response) => {
206
+ // Format response only if raw message is available
207
+ let enhancedResponse = response;
208
+ if (response.raw) {
209
+ try {
210
+ const formatted = this.responseFormatter.formatTaskResponse(response.raw);
211
+ enhancedResponse = {
212
+ ...response,
213
+ ...formatted
214
+ };
215
+ }
216
+ catch (error) {
217
+ this.logger.debug("Could not format response, using original", {
218
+ error
219
+ });
220
+ }
221
+ }
222
+ // Emit event (waitForEvent listeners will receive this)
223
+ this.emit("agent:response", enhancedResponse);
224
+ // Fire and forget - don't block event emission
225
+ this.webhookHandler
226
+ .sendWebhook("task_response", enhancedResponse, {
227
+ agentId: response.agentId,
228
+ taskId: response.taskId
229
+ })
230
+ .catch((error) => {
231
+ this.logger.error("Failed to send webhook for agent:response", error);
232
+ });
233
+ });
234
+ // Forward coordinator events
235
+ this.wsClient.on("coordinator:processing", (request) => this.emit("coordinator:processing", request));
236
+ this.wsClient.on("coordinator:selected", (agentId, reasoning) => this.emit("coordinator:selected", agentId, reasoning));
237
+ this.wsClient.on("coordinator:error", (error) => this.emit("coordinator:error", error));
238
+ }
239
+ /**
240
+ * Destroys the message router and cleans up resources.
241
+ * Removes all event listeners and marks the router as destroyed.
242
+ * After destruction, the router cannot be reused.
243
+ *
244
+ * Note: Any pending waitForEvent calls will automatically timeout and clean up.
245
+ *
246
+ * @example
247
+ * ```typescript
248
+ * messageRouter.destroy();
249
+ * console.log('Message router destroyed');
250
+ * ```
251
+ */
252
+ destroy() {
253
+ this.logger.info("MessageRouter: Destroying");
254
+ // Remove all event listeners
255
+ // Any pending waitForEvent calls will automatically timeout and clean up
256
+ this.removeAllListeners();
257
+ }
258
+ }
259
+ exports.MessageRouter = MessageRouter;
260
+ //# sourceMappingURL=message-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-router.js","sourceRoot":"","sources":["../../src/managers/message-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * RoomManager - Manages room state and operations
3
+ * Handles joining, leaving, and tracking rooms
4
+ */
5
+ import { EventEmitter } from "eventemitter3";
6
+ import { WebSocketClient } from "../core/websocket-client";
7
+ import { Room, Logger, RoomInfo } from "../types";
8
+ import { SDKEvents } from "../types/events";
9
+ export declare class RoomManager extends EventEmitter<SDKEvents> {
10
+ private readonly wsClient;
11
+ private readonly logger;
12
+ private readonly rooms;
13
+ private readonly subscribedRooms;
14
+ constructor(wsClient: WebSocketClient, logger: Logger);
15
+ /**
16
+ * Subscribes to a public room in the Teneo network.
17
+ * Validates room ID and sends subscribe message to the server.
18
+ * The actual subscription state is updated when the server confirms via room:subscribed event.
19
+ *
20
+ * @param roomId - The ID of the room to subscribe to
21
+ * @returns Promise that resolves when subscribed
22
+ * @throws {SDKError} If not connected to the network
23
+ * @throws {ValidationError} If roomId is empty or invalid
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * await roomManager.subscribeToRoom('general');
28
+ * console.log('Subscription request sent to general room');
29
+ * ```
30
+ */
31
+ subscribeToRoom(roomId: string): Promise<void>;
32
+ /**
33
+ * Unsubscribes from a room in the Teneo network.
34
+ * Validates room ID and sends unsubscribe message to the server.
35
+ * The actual subscription state is updated when the server confirms via room:unsubscribed event.
36
+ *
37
+ * @param roomId - The ID of the room to unsubscribe from
38
+ * @returns Promise that resolves when unsubscribed
39
+ * @throws {SDKError} If not connected to the network
40
+ * @throws {ValidationError} If roomId is empty or invalid
41
+ *
42
+ * @example
43
+ * ```typescript
44
+ * await roomManager.unsubscribeFromRoom('general');
45
+ * console.log('Unsubscription request sent for general room');
46
+ * ```
47
+ */
48
+ unsubscribeFromRoom(roomId: string): Promise<void>;
49
+ /**
50
+ * Updates the subscription state from server response.
51
+ * This is the authoritative source of which rooms you're subscribed to.
52
+ * Called internally when receiving subscribe/unsubscribe responses.
53
+ *
54
+ * @internal
55
+ * @param subscriptions - Array of room IDs from server response
56
+ *
57
+ * @example
58
+ * ```typescript
59
+ * // Internal SDK usage
60
+ * roomManager.updateSubscriptions(['general', 'support', 'trading']);
61
+ * ```
62
+ */
63
+ updateSubscriptions(subscriptions: string[]): void;
64
+ /**
65
+ * Gets all rooms currently subscribed to.
66
+ * Returns array of room IDs that you're actively listening to.
67
+ *
68
+ * @returns Array of subscribed room IDs
69
+ *
70
+ * @example
71
+ * ```typescript
72
+ * const rooms = roomManager.getSubscribedRooms();
73
+ * console.log(`Subscribed to ${rooms.length} rooms:`, rooms);
74
+ * ```
75
+ */
76
+ getSubscribedRooms(): string[];
77
+ /**
78
+ * Gets a list of all available rooms.
79
+ * Returns rooms the user has access to based on authentication.
80
+ * Returns a read-only array with defensive copies to prevent external modification.
81
+ *
82
+ * @returns Read-only array of room copies
83
+ *
84
+ * @example
85
+ * ```typescript
86
+ * const rooms = roomManager.getRooms();
87
+ * rooms.forEach(room => console.log(`${room.id}: ${room.name}`));
88
+ * ```
89
+ */
90
+ getRooms(): ReadonlyArray<Readonly<Room>>;
91
+ /**
92
+ * Gets a specific room by its ID.
93
+ * Returns a defensive copy to prevent external modification of room state.
94
+ * Returns undefined if room doesn't exist or user doesn't have access.
95
+ *
96
+ * @param roomId - The ID of the room to retrieve
97
+ * @returns Copy of the room object if found, undefined otherwise
98
+ *
99
+ * @example
100
+ * ```typescript
101
+ * const room = roomManager.getRoom('general');
102
+ * if (room) {
103
+ * console.log(`Room: ${room.name}`);
104
+ * console.log(`Members: ${room.members?.length ?? 0}`);
105
+ * }
106
+ * ```
107
+ */
108
+ getRoom(roomId: string): Readonly<Room> | undefined;
109
+ /**
110
+ * Fetches the list of rooms from the server.
111
+ * Sends list_rooms message and waits for response from server.
112
+ * Returns array of rooms the user owns or has access to.
113
+ *
114
+ * @returns Promise that resolves to array of room information
115
+ * @throws {SDKError} If not connected to the network
116
+ *
117
+ * @example
118
+ * ```typescript
119
+ * const rooms = await roomManager.listRooms();
120
+ * rooms.forEach(room => {
121
+ * console.log(`${room.name} (${room.is_public ? 'public' : 'private'})`);
122
+ * console.log(`Owner: ${room.is_owner}`);
123
+ * });
124
+ * ```
125
+ */
126
+ listRooms(): Promise<RoomInfo[]>;
127
+ /**
128
+ * Updates the room list from authentication state.
129
+ * Called internally after successful authentication to populate accessible rooms.
130
+ *
131
+ * @internal This method is for internal SDK use
132
+ * @param rooms - Array of rooms to update in the manager
133
+ *
134
+ * @example
135
+ * ```typescript
136
+ * // Internal SDK usage after auth
137
+ * roomManager.updateRoomsFromAuth(authState.roomObjects);
138
+ * ```
139
+ */
140
+ updateRoomsFromAuth(rooms: Room[]): void;
141
+ /**
142
+ * Clears all rooms from the manager.
143
+ * Clears subscription state.
144
+ *
145
+ * @example
146
+ * ```typescript
147
+ * roomManager.clear();
148
+ * console.log('All rooms cleared');
149
+ * ```
150
+ */
151
+ clear(): void;
152
+ /**
153
+ * Destroys the room manager and cleans up resources.
154
+ * Clears all rooms and removes all event listeners.
155
+ * After destruction, the manager cannot be reused.
156
+ *
157
+ * @example
158
+ * ```typescript
159
+ * roomManager.destroy();
160
+ * console.log('Room manager destroyed');
161
+ * ```
162
+ */
163
+ destroy(): void;
164
+ }
165
+ //# sourceMappingURL=room-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"room-manager.d.ts","sourceRoot":"","sources":["../../src/managers/room-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAuD,MAAM,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACvG,OAAO,EAAE,SAAS,EAAY,MAAM,iBAAiB,CAAC;AAItD,qBAAa,WAAY,SAAQ,YAAY,CAAC,SAAS,CAAC;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2B;IACjD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqB;gBAEzC,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM;IAMrD;;;;;;;;;;;;;;;OAeG;IACU,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc3D;;;;;;;;;;;;;;;OAeG;IACU,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc/D;;;;;;;;;;;;;OAaG;IACI,mBAAmB,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,IAAI;IASzD;;;;;;;;;;;OAWG;IACI,kBAAkB,IAAI,MAAM,EAAE;IAIrC;;;;;;;;;;;;OAYG;IACI,QAAQ,IAAI,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAIhD;;;;;;;;;;;;;;;;OAgBG;IACI,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS;IAK1D;;;;;;;;;;;;;;;;OAgBG;IACU,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAgB7C;;;;;;;;;;;;OAYG;IACI,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;IAQ/C;;;;;;;;;OASG;IACI,KAAK,IAAI,IAAI;IAKpB;;;;;;;;;;OAUG;IACI,OAAO,IAAI,IAAI;CAKvB"}