@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,310 @@
1
+ "use strict";
2
+ /**
3
+ * AgentRegistry - Manages agent state and lookup
4
+ * Handles agent caching and queries
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.AgentRegistry = void 0;
8
+ const eventemitter3_1 = require("eventemitter3");
9
+ const validation_1 = require("../types/validation");
10
+ class AgentRegistry extends eventemitter3_1.EventEmitter {
11
+ constructor(logger) {
12
+ super();
13
+ this.agents = new Map();
14
+ this.isAgentsCacheDirty = true;
15
+ // PERF-3: Search indices for O(1) lookups
16
+ this.capabilityIndex = new Map();
17
+ this.nameTokenIndex = new Map();
18
+ this.statusIndex = new Map();
19
+ this.logger = logger;
20
+ }
21
+ /**
22
+ * Gets a cached list of all available agents in the network.
23
+ * Uses lazy caching with dirty flag for optimal performance.
24
+ * Returns a read-only array with defensive copies to prevent external modification.
25
+ *
26
+ * @returns Read-only array of agent copies
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * const agents = agentRegistry.getAgents();
31
+ * console.log(`${agents.length} agents available`);
32
+ * agents.forEach(agent => console.log(agent.name));
33
+ * ```
34
+ */
35
+ getAgents() {
36
+ if (this.isAgentsCacheDirty || !this.cachedAgents) {
37
+ this.rebuildCache();
38
+ }
39
+ return this.cachedAgents.map((agent) => ({ ...agent }));
40
+ }
41
+ /**
42
+ * Gets a specific agent by its unique identifier.
43
+ * Performs O(1) lookup using internal Map structure.
44
+ * Returns a defensive copy to prevent external modification of agent state.
45
+ *
46
+ * @param agentId - The unique identifier of the agent
47
+ * @returns Copy of the agent object if found, undefined otherwise
48
+ * @throws {ValidationError} If agentId is invalid
49
+ *
50
+ * @example
51
+ * ```typescript
52
+ * const agent = agentRegistry.getAgent('weather-agent-001');
53
+ * if (agent) {
54
+ * console.log(`Found: ${agent.name}`);
55
+ * console.log(`Capabilities: ${agent.capabilities?.length}`);
56
+ * }
57
+ * ```
58
+ */
59
+ getAgent(agentId) {
60
+ // Validate agent ID
61
+ const validatedAgentId = validation_1.AgentIdSchema.parse(agentId);
62
+ const agent = this.agents.get(validatedAgentId);
63
+ return agent ? { ...agent } : undefined;
64
+ }
65
+ /**
66
+ * Finds all agents that have a specific capability.
67
+ * PERF-3: Uses O(1) capability index lookup instead of O(n) filtering.
68
+ *
69
+ * @param capabilityName - The name of the capability to search for (case-insensitive)
70
+ * @returns Read-only array of agents with the specified capability
71
+ * @throws {ValidationError} If capabilityName is invalid
72
+ *
73
+ * @example
74
+ * ```typescript
75
+ * const weatherAgents = agentRegistry.findByCapability('weather-forecast');
76
+ * console.log(`Found ${weatherAgents.length} agents with weather-forecast capability`);
77
+ * ```
78
+ */
79
+ findByCapability(capabilityName) {
80
+ // Validate capability name
81
+ const validatedCapabilityName = validation_1.SearchQuerySchema.parse(capabilityName);
82
+ // Ensure cache is up to date
83
+ if (this.isAgentsCacheDirty || !this.cachedAgents) {
84
+ this.rebuildCache();
85
+ }
86
+ // O(1) index lookup instead of O(n) filter
87
+ const normalizedCapName = validatedCapabilityName.toLowerCase();
88
+ const agentIds = this.capabilityIndex.get(normalizedCapName);
89
+ if (!agentIds || agentIds.size === 0) {
90
+ return [];
91
+ }
92
+ // Map agent IDs to agent objects with defensive copies
93
+ return Array.from(agentIds)
94
+ .map((id) => this.agents.get(id))
95
+ .filter((agent) => agent !== undefined)
96
+ .map((agent) => ({ ...agent }));
97
+ }
98
+ /**
99
+ * Finds agents by name using case-insensitive partial matching.
100
+ * PERF-3: Uses O(k) token index lookups instead of O(n) substring search,
101
+ * where k is the number of tokens in the search query.
102
+ *
103
+ * @param name - The name or partial name to search for (case-insensitive)
104
+ * @returns Read-only array of agents matching the name search
105
+ * @throws {ValidationError} If name is invalid
106
+ *
107
+ * @example
108
+ * ```typescript
109
+ * // Find all agents with "weather" in their name
110
+ * const weatherAgents = agentRegistry.findByName('weather');
111
+ * weatherAgents.forEach(agent => console.log(agent.name));
112
+ * ```
113
+ */
114
+ findByName(name) {
115
+ // Validate name
116
+ const validatedName = validation_1.SearchQuerySchema.parse(name);
117
+ // Ensure cache is up to date
118
+ if (this.isAgentsCacheDirty || !this.cachedAgents) {
119
+ this.rebuildCache();
120
+ }
121
+ // Tokenize search query
122
+ const searchTokens = this.tokenizeString(validatedName);
123
+ if (searchTokens.length === 0) {
124
+ return [];
125
+ }
126
+ // Find agents that match ANY token (union)
127
+ const matchingAgentIds = new Set();
128
+ for (const token of searchTokens) {
129
+ const agentIds = this.nameTokenIndex.get(token);
130
+ if (agentIds) {
131
+ agentIds.forEach((id) => matchingAgentIds.add(id));
132
+ }
133
+ }
134
+ if (matchingAgentIds.size === 0) {
135
+ return [];
136
+ }
137
+ // Map agent IDs to agent objects with defensive copies
138
+ return Array.from(matchingAgentIds)
139
+ .map((id) => this.agents.get(id))
140
+ .filter((agent) => agent !== undefined)
141
+ .map((agent) => ({ ...agent }));
142
+ }
143
+ /**
144
+ * Finds all agents with a specific status.
145
+ * PERF-3: Uses O(1) status index lookup instead of O(n) filtering.
146
+ *
147
+ * @param status - The status to search for: 'online' or 'offline' (case-insensitive)
148
+ * @returns Read-only array of agents with the specified status
149
+ * @throws {ValidationError} If status is invalid
150
+ *
151
+ * @example
152
+ * ```typescript
153
+ * const onlineAgents = agentRegistry.findByStatus('online');
154
+ * console.log(`Found ${onlineAgents.length} online agents`);
155
+ * ```
156
+ */
157
+ findByStatus(status) {
158
+ // Validate status
159
+ const validatedStatus = validation_1.SearchQuerySchema.parse(status);
160
+ // Ensure cache is up to date
161
+ if (this.isAgentsCacheDirty || !this.cachedAgents) {
162
+ this.rebuildCache();
163
+ }
164
+ // O(1) index lookup instead of O(n) filter
165
+ const normalizedStatus = validatedStatus.toLowerCase();
166
+ const agentIds = this.statusIndex.get(normalizedStatus);
167
+ if (!agentIds || agentIds.size === 0) {
168
+ return [];
169
+ }
170
+ // Map agent IDs to agent objects with defensive copies
171
+ return Array.from(agentIds)
172
+ .map((id) => this.agents.get(id))
173
+ .filter((agent) => agent !== undefined)
174
+ .map((agent) => ({ ...agent }));
175
+ }
176
+ /**
177
+ * Updates the registry with a new list of agents.
178
+ * Merges with existing agents and marks cache as dirty.
179
+ * Emits 'agent:list' event with the new agents.
180
+ *
181
+ * @internal This method is for internal SDK use
182
+ * @param agents - Array of agents to add or update in the registry
183
+ *
184
+ * @example
185
+ * ```typescript
186
+ * // Internal SDK usage
187
+ * agentRegistry.updateAgents(newAgentList);
188
+ * ```
189
+ */
190
+ updateAgents(agents) {
191
+ this.logger.debug("AgentRegistry: Updating agents", { count: agents.length });
192
+ for (const agent of agents) {
193
+ this.agents.set(agent.id, agent);
194
+ }
195
+ this.isAgentsCacheDirty = true;
196
+ this.emit("agent:list", agents);
197
+ }
198
+ /**
199
+ * Updates a single agent in the registry.
200
+ * Adds new agent or updates existing one, then marks cache as dirty.
201
+ *
202
+ * @internal This method is for internal SDK use
203
+ * @param agent - The agent to add or update
204
+ *
205
+ * @example
206
+ * ```typescript
207
+ * // Internal SDK usage
208
+ * agentRegistry.updateAgent(updatedAgent);
209
+ * ```
210
+ */
211
+ updateAgent(agent) {
212
+ this.logger.debug("AgentRegistry: Updating agent", { id: agent.id, name: agent.name });
213
+ this.agents.set(agent.id, agent);
214
+ this.isAgentsCacheDirty = true;
215
+ }
216
+ /**
217
+ * Clears all agents from the registry.
218
+ * Removes all cached agents and marks cache as dirty.
219
+ *
220
+ * @example
221
+ * ```typescript
222
+ * agentRegistry.clear();
223
+ * console.log('All agents cleared');
224
+ * ```
225
+ */
226
+ clear() {
227
+ this.agents.clear();
228
+ this.isAgentsCacheDirty = true;
229
+ }
230
+ /**
231
+ * Destroys the agent registry and cleans up resources.
232
+ * Clears all agents and removes all event listeners.
233
+ * After destruction, the registry cannot be reused.
234
+ *
235
+ * @example
236
+ * ```typescript
237
+ * agentRegistry.destroy();
238
+ * console.log('Agent registry destroyed');
239
+ * ```
240
+ */
241
+ destroy() {
242
+ this.logger.info("AgentRegistry: Destroying");
243
+ this.clear();
244
+ this.removeAllListeners();
245
+ }
246
+ /**
247
+ * Rebuilds the agent cache and all search indices.
248
+ * This is called automatically when the cache becomes dirty.
249
+ * PERF-3: Builds capability, name token, and status indices for O(1) lookups.
250
+ *
251
+ * @private
252
+ */
253
+ rebuildCache() {
254
+ // Rebuild agent array
255
+ this.cachedAgents = Array.from(this.agents.values()).map((agent) => ({ ...agent }));
256
+ // Clear indices
257
+ this.capabilityIndex.clear();
258
+ this.nameTokenIndex.clear();
259
+ this.statusIndex.clear();
260
+ // Populate indices
261
+ for (const agent of this.agents.values()) {
262
+ // Index capabilities
263
+ if (agent.capabilities) {
264
+ for (const capability of agent.capabilities) {
265
+ const capName = capability.name.toLowerCase();
266
+ if (!this.capabilityIndex.has(capName)) {
267
+ this.capabilityIndex.set(capName, new Set());
268
+ }
269
+ this.capabilityIndex.get(capName).add(agent.id);
270
+ }
271
+ }
272
+ // Index name tokens (for partial matching)
273
+ const nameTokens = this.tokenizeString(agent.name);
274
+ for (const token of nameTokens) {
275
+ if (!this.nameTokenIndex.has(token)) {
276
+ this.nameTokenIndex.set(token, new Set());
277
+ }
278
+ this.nameTokenIndex.get(token).add(agent.id);
279
+ }
280
+ // Index status
281
+ const status = agent.status.toLowerCase();
282
+ if (!this.statusIndex.has(status)) {
283
+ this.statusIndex.set(status, new Set());
284
+ }
285
+ this.statusIndex.get(status).add(agent.id);
286
+ }
287
+ this.isAgentsCacheDirty = false;
288
+ }
289
+ /**
290
+ * Tokenizes a string into searchable tokens.
291
+ * Splits on whitespace and special characters, converts to lowercase.
292
+ *
293
+ * @param str - String to tokenize
294
+ * @returns Array of lowercase tokens
295
+ * @private
296
+ *
297
+ * @example
298
+ * ```typescript
299
+ * tokenizeString("Weather API v2.0") => ["weather", "api", "v2", "0"]
300
+ * ```
301
+ */
302
+ tokenizeString(str) {
303
+ return str
304
+ .toLowerCase()
305
+ .split(/[\s\-_.,;:()[\]{}]+/)
306
+ .filter((token) => token.length > 0);
307
+ }
308
+ }
309
+ exports.AgentRegistry = AgentRegistry;
310
+ //# sourceMappingURL=agent-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-registry.js","sourceRoot":"","sources":["../../src/managers/agent-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * ConnectionManager - Manages WebSocket connection lifecycle
3
+ * Handles connection, disconnection, and state management
4
+ */
5
+ import { EventEmitter } from "eventemitter3";
6
+ import { WebSocketClient } from "../core/websocket-client";
7
+ import { ConnectionState, AuthenticationState, Logger } from "../types";
8
+ import { SDKEvents } from "../types/events";
9
+ export declare class ConnectionManager extends EventEmitter<SDKEvents> {
10
+ private readonly wsClient;
11
+ private readonly logger;
12
+ constructor(wsClient: WebSocketClient, logger: Logger);
13
+ /**
14
+ * Initiates WebSocket connection through the underlying WebSocket client.
15
+ * Delegates all connection logic including authentication and reconnection.
16
+ *
17
+ * @returns Promise that resolves when connection and authentication complete
18
+ * @throws {TimeoutError} If connection times out
19
+ * @throws {ConnectionError} If WebSocket connection fails
20
+ * @throws {AuthenticationError} If authentication fails
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * const connectionMgr = new ConnectionManager(wsClient, logger);
25
+ * await connectionMgr.connect();
26
+ * console.log('Connected via connection manager');
27
+ * ```
28
+ */
29
+ connect(): Promise<void>;
30
+ /**
31
+ * Disconnects from the WebSocket server through the underlying WebSocket client.
32
+ * Cleans up all connection resources and stops reconnection attempts.
33
+ *
34
+ * @example
35
+ * ```typescript
36
+ * connectionMgr.disconnect();
37
+ * console.log('Disconnected');
38
+ * ```
39
+ */
40
+ disconnect(): void;
41
+ /**
42
+ * Gets the current WebSocket connection state with detailed status information.
43
+ * Includes connection status, reconnection attempts, and error information.
44
+ *
45
+ * @returns Connection state object with status, attempts, and timestamps
46
+ *
47
+ * @example
48
+ * ```typescript
49
+ * const state = connectionMgr.getConnectionState();
50
+ * console.log(`Connected: ${state.connected}`);
51
+ * console.log(`Reconnecting: ${state.reconnecting}`);
52
+ * ```
53
+ */
54
+ getConnectionState(): ConnectionState;
55
+ /**
56
+ * Gets the current authentication state with wallet and room information.
57
+ * Includes authentication status, wallet address, and accessible rooms.
58
+ *
59
+ * @returns Authentication state object with wallet, challenge, and room access
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * const authState = connectionMgr.getAuthState();
64
+ * if (authState.authenticated) {
65
+ * console.log(`Authenticated as: ${authState.walletAddress}`);
66
+ * }
67
+ * ```
68
+ */
69
+ getAuthState(): AuthenticationState;
70
+ /**
71
+ * Quick check for whether the WebSocket is currently connected.
72
+ * Convenience getter for immediate connection status.
73
+ *
74
+ * @returns True if connected, false otherwise
75
+ *
76
+ * @example
77
+ * ```typescript
78
+ * if (connectionMgr.isConnected) {
79
+ * console.log('Ready to send messages');
80
+ * }
81
+ * ```
82
+ */
83
+ get isConnected(): boolean;
84
+ /**
85
+ * Quick check for whether authentication is complete.
86
+ * Convenience getter for immediate authentication status.
87
+ *
88
+ * @returns True if authenticated, false otherwise
89
+ *
90
+ * @example
91
+ * ```typescript
92
+ * if (connectionMgr.isAuthenticated) {
93
+ * console.log('Authenticated and ready');
94
+ * }
95
+ * ```
96
+ */
97
+ get isAuthenticated(): boolean;
98
+ /**
99
+ * Gets the underlying WebSocket client instance for advanced usage.
100
+ * Provides direct access to low-level WebSocket operations.
101
+ *
102
+ * ⚠️ **WARNING:** This method returns a direct reference to the internal WebSocketClient.
103
+ * Modifying the client's state or calling methods directly may lead to unexpected behavior
104
+ * or break SDK functionality. Use this only for read-only operations like event listening.
105
+ *
106
+ * @internal This method is for internal SDK use and advanced scenarios
107
+ * @returns The WebSocketClient instance (direct reference - use with caution)
108
+ *
109
+ * @example
110
+ * ```typescript
111
+ * // Advanced usage - listen to low-level events (read-only)
112
+ * const wsClient = connectionMgr.getWebSocketClient();
113
+ * wsClient.on('message:received', (msg) => console.log(msg));
114
+ * ```
115
+ */
116
+ getWebSocketClient(): WebSocketClient;
117
+ /**
118
+ * Set up event forwarding from WebSocket client
119
+ */
120
+ private setupEventForwarding;
121
+ /**
122
+ * Destroys the connection manager and cleans up all resources.
123
+ * Disconnects from the server and removes all event listeners.
124
+ * After destruction, the manager cannot be reused.
125
+ *
126
+ * @example
127
+ * ```typescript
128
+ * connectionMgr.destroy();
129
+ * console.log('Connection manager destroyed');
130
+ * ```
131
+ */
132
+ destroy(): void;
133
+ }
134
+ //# sourceMappingURL=connection-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-manager.d.ts","sourceRoot":"","sources":["../../src/managers/connection-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,eAAe,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,qBAAa,iBAAkB,SAAQ,YAAY,CAAC,SAAS,CAAC;IAC5D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM;IAOrD;;;;;;;;;;;;;;;OAeG;IACU,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAKrC;;;;;;;;;OASG;IACI,UAAU,IAAI,IAAI;IAKzB;;;;;;;;;;;;OAYG;IACI,kBAAkB,IAAI,eAAe;IAI5C;;;;;;;;;;;;;OAaG;IACI,YAAY,IAAI,mBAAmB;IAI1C;;;;;;;;;;;;OAYG;IACH,IAAW,WAAW,IAAI,OAAO,CAEhC;IAED;;;;;;;;;;;;OAYG;IACH,IAAW,eAAe,IAAI,OAAO,CAEpC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACI,kBAAkB,IAAI,eAAe;IAI5C;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA2B5B;;;;;;;;;;OAUG;IACI,OAAO,IAAI,IAAI;CAKvB"}
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ /**
3
+ * ConnectionManager - Manages WebSocket connection lifecycle
4
+ * Handles connection, disconnection, and state management
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ConnectionManager = void 0;
8
+ const eventemitter3_1 = require("eventemitter3");
9
+ class ConnectionManager extends eventemitter3_1.EventEmitter {
10
+ constructor(wsClient, logger) {
11
+ super();
12
+ this.wsClient = wsClient;
13
+ this.logger = logger;
14
+ this.setupEventForwarding();
15
+ }
16
+ /**
17
+ * Initiates WebSocket connection through the underlying WebSocket client.
18
+ * Delegates all connection logic including authentication and reconnection.
19
+ *
20
+ * @returns Promise that resolves when connection and authentication complete
21
+ * @throws {TimeoutError} If connection times out
22
+ * @throws {ConnectionError} If WebSocket connection fails
23
+ * @throws {AuthenticationError} If authentication fails
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * const connectionMgr = new ConnectionManager(wsClient, logger);
28
+ * await connectionMgr.connect();
29
+ * console.log('Connected via connection manager');
30
+ * ```
31
+ */
32
+ async connect() {
33
+ this.logger.info("ConnectionManager: Initiating connection");
34
+ await this.wsClient.connect();
35
+ }
36
+ /**
37
+ * Disconnects from the WebSocket server through the underlying WebSocket client.
38
+ * Cleans up all connection resources and stops reconnection attempts.
39
+ *
40
+ * @example
41
+ * ```typescript
42
+ * connectionMgr.disconnect();
43
+ * console.log('Disconnected');
44
+ * ```
45
+ */
46
+ disconnect() {
47
+ this.logger.info("ConnectionManager: Disconnecting");
48
+ this.wsClient.disconnect();
49
+ }
50
+ /**
51
+ * Gets the current WebSocket connection state with detailed status information.
52
+ * Includes connection status, reconnection attempts, and error information.
53
+ *
54
+ * @returns Connection state object with status, attempts, and timestamps
55
+ *
56
+ * @example
57
+ * ```typescript
58
+ * const state = connectionMgr.getConnectionState();
59
+ * console.log(`Connected: ${state.connected}`);
60
+ * console.log(`Reconnecting: ${state.reconnecting}`);
61
+ * ```
62
+ */
63
+ getConnectionState() {
64
+ return this.wsClient.getConnectionState();
65
+ }
66
+ /**
67
+ * Gets the current authentication state with wallet and room information.
68
+ * Includes authentication status, wallet address, and accessible rooms.
69
+ *
70
+ * @returns Authentication state object with wallet, challenge, and room access
71
+ *
72
+ * @example
73
+ * ```typescript
74
+ * const authState = connectionMgr.getAuthState();
75
+ * if (authState.authenticated) {
76
+ * console.log(`Authenticated as: ${authState.walletAddress}`);
77
+ * }
78
+ * ```
79
+ */
80
+ getAuthState() {
81
+ return this.wsClient.getAuthState();
82
+ }
83
+ /**
84
+ * Quick check for whether the WebSocket is currently connected.
85
+ * Convenience getter for immediate connection status.
86
+ *
87
+ * @returns True if connected, false otherwise
88
+ *
89
+ * @example
90
+ * ```typescript
91
+ * if (connectionMgr.isConnected) {
92
+ * console.log('Ready to send messages');
93
+ * }
94
+ * ```
95
+ */
96
+ get isConnected() {
97
+ return this.wsClient.isConnected;
98
+ }
99
+ /**
100
+ * Quick check for whether authentication is complete.
101
+ * Convenience getter for immediate authentication status.
102
+ *
103
+ * @returns True if authenticated, false otherwise
104
+ *
105
+ * @example
106
+ * ```typescript
107
+ * if (connectionMgr.isAuthenticated) {
108
+ * console.log('Authenticated and ready');
109
+ * }
110
+ * ```
111
+ */
112
+ get isAuthenticated() {
113
+ return this.wsClient.isAuthenticated;
114
+ }
115
+ /**
116
+ * Gets the underlying WebSocket client instance for advanced usage.
117
+ * Provides direct access to low-level WebSocket operations.
118
+ *
119
+ * ⚠️ **WARNING:** This method returns a direct reference to the internal WebSocketClient.
120
+ * Modifying the client's state or calling methods directly may lead to unexpected behavior
121
+ * or break SDK functionality. Use this only for read-only operations like event listening.
122
+ *
123
+ * @internal This method is for internal SDK use and advanced scenarios
124
+ * @returns The WebSocketClient instance (direct reference - use with caution)
125
+ *
126
+ * @example
127
+ * ```typescript
128
+ * // Advanced usage - listen to low-level events (read-only)
129
+ * const wsClient = connectionMgr.getWebSocketClient();
130
+ * wsClient.on('message:received', (msg) => console.log(msg));
131
+ * ```
132
+ */
133
+ getWebSocketClient() {
134
+ return this.wsClient;
135
+ }
136
+ /**
137
+ * Set up event forwarding from WebSocket client
138
+ */
139
+ setupEventForwarding() {
140
+ // Forward connection events
141
+ this.wsClient.on("connection:open", () => this.emit("connection:open"));
142
+ this.wsClient.on("connection:close", (code, reason) => this.emit("connection:close", code, reason));
143
+ this.wsClient.on("connection:error", (error) => this.emit("connection:error", error));
144
+ this.wsClient.on("connection:reconnecting", (attempt) => this.emit("connection:reconnecting", attempt));
145
+ this.wsClient.on("connection:reconnected", () => this.emit("connection:reconnected"));
146
+ this.wsClient.on("connection:state", (state) => this.emit("connection:state", state));
147
+ // Forward auth events
148
+ this.wsClient.on("auth:challenge", (challenge) => this.emit("auth:challenge", challenge));
149
+ this.wsClient.on("auth:success", (state) => this.emit("auth:success", state));
150
+ this.wsClient.on("auth:error", (error) => this.emit("auth:error", error));
151
+ this.wsClient.on("auth:state", (state) => this.emit("auth:state", state));
152
+ // Forward lifecycle events
153
+ this.wsClient.on("ready", () => this.emit("ready"));
154
+ this.wsClient.on("disconnect", () => this.emit("disconnect"));
155
+ // Forward error events
156
+ this.wsClient.on("error", (error) => this.emit("error", error));
157
+ }
158
+ /**
159
+ * Destroys the connection manager and cleans up all resources.
160
+ * Disconnects from the server and removes all event listeners.
161
+ * After destruction, the manager cannot be reused.
162
+ *
163
+ * @example
164
+ * ```typescript
165
+ * connectionMgr.destroy();
166
+ * console.log('Connection manager destroyed');
167
+ * ```
168
+ */
169
+ destroy() {
170
+ this.logger.info("ConnectionManager: Destroying");
171
+ this.disconnect();
172
+ this.removeAllListeners();
173
+ }
174
+ }
175
+ exports.ConnectionManager = ConnectionManager;
176
+ //# sourceMappingURL=connection-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-manager.js","sourceRoot":"","sources":["../../src/managers/connection-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Manager exports
3
+ * Provides focused classes for different SDK responsibilities
4
+ */
5
+ export { ConnectionManager } from "./connection-manager";
6
+ export { RoomManager } from "./room-manager";
7
+ export { AgentRegistry } from "./agent-registry";
8
+ export { MessageRouter, type SendMessageOptions, type AgentCommand } from "./message-router";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/managers/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ /**
3
+ * Manager exports
4
+ * Provides focused classes for different SDK responsibilities
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.MessageRouter = exports.AgentRegistry = exports.RoomManager = exports.ConnectionManager = void 0;
8
+ var connection_manager_1 = require("./connection-manager");
9
+ Object.defineProperty(exports, "ConnectionManager", { enumerable: true, get: function () { return connection_manager_1.ConnectionManager; } });
10
+ var room_manager_1 = require("./room-manager");
11
+ Object.defineProperty(exports, "RoomManager", { enumerable: true, get: function () { return room_manager_1.RoomManager; } });
12
+ var agent_registry_1 = require("./agent-registry");
13
+ Object.defineProperty(exports, "AgentRegistry", { enumerable: true, get: function () { return agent_registry_1.AgentRegistry; } });
14
+ var message_router_1 = require("./message-router");
15
+ Object.defineProperty(exports, "MessageRouter", { enumerable: true, get: function () { return message_router_1.MessageRouter; } });
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/managers/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,2DAAyD;AAAhD,uHAAA,iBAAiB,OAAA;AAC1B,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AACtB,mDAA6F;AAApF,+GAAA,aAAa,OAAA"}