@hashgraphonline/standards-sdk 0.0.82 → 0.0.84

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 (236) hide show
  1. package/dist/es/hcs-10/base-client.d.ts.map +1 -1
  2. package/dist/es/hcs-10/connections-manager.d.ts +185 -0
  3. package/dist/es/hcs-10/connections-manager.d.ts.map +1 -0
  4. package/dist/es/hcs-10/index.d.ts +1 -0
  5. package/dist/es/hcs-10/index.d.ts.map +1 -1
  6. package/dist/es/hcs-10/sdk.d.ts.map +1 -1
  7. package/dist/es/services/mirror-node.d.ts.map +1 -1
  8. package/dist/es/standards-sdk.es.js +13 -11
  9. package/dist/es/standards-sdk.es.js.map +1 -1
  10. package/dist/es/standards-sdk.es10.js +594 -117
  11. package/dist/es/standards-sdk.es10.js.map +1 -1
  12. package/dist/es/standards-sdk.es100.js +3 -31
  13. package/dist/es/standards-sdk.es100.js.map +1 -1
  14. package/dist/es/standards-sdk.es101.js +3 -14
  15. package/dist/es/standards-sdk.es101.js.map +1 -1
  16. package/dist/es/standards-sdk.es102.js +13 -4
  17. package/dist/es/standards-sdk.es102.js.map +1 -1
  18. package/dist/es/standards-sdk.es103.js +13 -4
  19. package/dist/es/standards-sdk.es103.js.map +1 -1
  20. package/dist/es/standards-sdk.es104.js +1 -1
  21. package/dist/es/standards-sdk.es106.js +3 -3
  22. package/dist/es/standards-sdk.es107.js +8 -8
  23. package/dist/es/standards-sdk.es108.js +3 -3
  24. package/dist/es/standards-sdk.es11.js +103 -58
  25. package/dist/es/standards-sdk.es11.js.map +1 -1
  26. package/dist/es/standards-sdk.es110.js +4 -3
  27. package/dist/es/standards-sdk.es110.js.map +1 -1
  28. package/dist/es/standards-sdk.es111.js +34 -2
  29. package/dist/es/standards-sdk.es111.js.map +1 -1
  30. package/dist/es/standards-sdk.es112.js +33 -2
  31. package/dist/es/standards-sdk.es112.js.map +1 -1
  32. package/dist/es/standards-sdk.es113.js +9 -34
  33. package/dist/es/standards-sdk.es113.js.map +1 -1
  34. package/dist/es/standards-sdk.es114.js +32 -31
  35. package/dist/es/standards-sdk.es114.js.map +1 -1
  36. package/dist/es/standards-sdk.es115.js +3 -9
  37. package/dist/es/standards-sdk.es115.js.map +1 -1
  38. package/dist/es/standards-sdk.es116.js +2 -34
  39. package/dist/es/standards-sdk.es116.js.map +1 -1
  40. package/dist/es/standards-sdk.es117.js +5 -0
  41. package/dist/es/standards-sdk.es117.js.map +1 -0
  42. package/dist/es/standards-sdk.es12.js +82 -628
  43. package/dist/es/standards-sdk.es12.js.map +1 -1
  44. package/dist/es/standards-sdk.es13.js +650 -85
  45. package/dist/es/standards-sdk.es13.js.map +1 -1
  46. package/dist/es/standards-sdk.es14.js +84 -58
  47. package/dist/es/standards-sdk.es14.js.map +1 -1
  48. package/dist/es/standards-sdk.es15.js +57 -20
  49. package/dist/es/standards-sdk.es15.js.map +1 -1
  50. package/dist/es/standards-sdk.es16.js +18 -156
  51. package/dist/es/standards-sdk.es16.js.map +1 -1
  52. package/dist/es/standards-sdk.es17.js +138 -385
  53. package/dist/es/standards-sdk.es17.js.map +1 -1
  54. package/dist/es/standards-sdk.es18.js +385 -299
  55. package/dist/es/standards-sdk.es18.js.map +1 -1
  56. package/dist/es/standards-sdk.es19.js +310 -128
  57. package/dist/es/standards-sdk.es19.js.map +1 -1
  58. package/dist/es/standards-sdk.es2.js +1 -1
  59. package/dist/es/standards-sdk.es20.js +155 -7
  60. package/dist/es/standards-sdk.es20.js.map +1 -1
  61. package/dist/es/standards-sdk.es21.js +7 -1767
  62. package/dist/es/standards-sdk.es21.js.map +1 -1
  63. package/dist/es/standards-sdk.es22.js +1041 -36
  64. package/dist/es/standards-sdk.es22.js.map +1 -1
  65. package/dist/es/standards-sdk.es23.js +1766 -47
  66. package/dist/es/standards-sdk.es23.js.map +1 -1
  67. package/dist/es/standards-sdk.es24.js +36 -7190
  68. package/dist/es/standards-sdk.es24.js.map +1 -1
  69. package/dist/es/standards-sdk.es25.js +48 -3
  70. package/dist/es/standards-sdk.es25.js.map +1 -1
  71. package/dist/es/standards-sdk.es26.js +7190 -2
  72. package/dist/es/standards-sdk.es26.js.map +1 -1
  73. package/dist/es/standards-sdk.es27.js +3 -4167
  74. package/dist/es/standards-sdk.es27.js.map +1 -1
  75. package/dist/es/standards-sdk.es28.js +2 -1041
  76. package/dist/es/standards-sdk.es28.js.map +1 -1
  77. package/dist/es/standards-sdk.es29.js +2 -2
  78. package/dist/es/standards-sdk.es3.js +1 -1
  79. package/dist/es/standards-sdk.es30.js +4122 -374
  80. package/dist/es/standards-sdk.es30.js.map +1 -1
  81. package/dist/es/standards-sdk.es31.js +2 -2
  82. package/dist/es/standards-sdk.es31.js.map +1 -1
  83. package/dist/es/standards-sdk.es32.js +356 -112
  84. package/dist/es/standards-sdk.es32.js.map +1 -1
  85. package/dist/es/standards-sdk.es33.js +6 -2
  86. package/dist/es/standards-sdk.es33.js.map +1 -1
  87. package/dist/es/standards-sdk.es34.js +178 -3
  88. package/dist/es/standards-sdk.es34.js.map +1 -1
  89. package/dist/es/standards-sdk.es35.js +72 -75
  90. package/dist/es/standards-sdk.es35.js.map +1 -1
  91. package/dist/es/standards-sdk.es36.js +111 -20
  92. package/dist/es/standards-sdk.es36.js.map +1 -1
  93. package/dist/es/standards-sdk.es37.js +42 -138
  94. package/dist/es/standards-sdk.es37.js.map +1 -1
  95. package/dist/es/standards-sdk.es38.js +10 -91
  96. package/dist/es/standards-sdk.es38.js.map +1 -1
  97. package/dist/es/standards-sdk.es39.js +75 -7114
  98. package/dist/es/standards-sdk.es39.js.map +1 -1
  99. package/dist/es/standards-sdk.es4.js +2 -2
  100. package/dist/es/standards-sdk.es40.js +3 -194
  101. package/dist/es/standards-sdk.es40.js.map +1 -1
  102. package/dist/es/standards-sdk.es41.js +2 -438
  103. package/dist/es/standards-sdk.es41.js.map +1 -1
  104. package/dist/es/standards-sdk.es42.js +107 -19
  105. package/dist/es/standards-sdk.es42.js.map +1 -1
  106. package/dist/es/standards-sdk.es43.js +70 -135
  107. package/dist/es/standards-sdk.es43.js.map +1 -1
  108. package/dist/es/standards-sdk.es44.js +5 -17
  109. package/dist/es/standards-sdk.es44.js.map +1 -1
  110. package/dist/es/standards-sdk.es45.js +4 -28
  111. package/dist/es/standards-sdk.es45.js.map +1 -1
  112. package/dist/es/standards-sdk.es46.js +219 -27
  113. package/dist/es/standards-sdk.es46.js.map +1 -1
  114. package/dist/es/standards-sdk.es47.js +56 -19
  115. package/dist/es/standards-sdk.es47.js.map +1 -1
  116. package/dist/es/standards-sdk.es48.js +69 -44
  117. package/dist/es/standards-sdk.es48.js.map +1 -1
  118. package/dist/es/standards-sdk.es49.js +191 -14
  119. package/dist/es/standards-sdk.es49.js.map +1 -1
  120. package/dist/es/standards-sdk.es5.js +32 -26
  121. package/dist/es/standards-sdk.es5.js.map +1 -1
  122. package/dist/es/standards-sdk.es50.js +421 -44
  123. package/dist/es/standards-sdk.es50.js.map +1 -1
  124. package/dist/es/standards-sdk.es51.js +19 -1283
  125. package/dist/es/standards-sdk.es51.js.map +1 -1
  126. package/dist/es/standards-sdk.es52.js +134 -27
  127. package/dist/es/standards-sdk.es52.js.map +1 -1
  128. package/dist/es/standards-sdk.es53.js +17 -5
  129. package/dist/es/standards-sdk.es53.js.map +1 -1
  130. package/dist/es/standards-sdk.es54.js +21 -151
  131. package/dist/es/standards-sdk.es54.js.map +1 -1
  132. package/dist/es/standards-sdk.es55.js +20 -784
  133. package/dist/es/standards-sdk.es55.js.map +1 -1
  134. package/dist/es/standards-sdk.es56.js +17 -170
  135. package/dist/es/standards-sdk.es56.js.map +1 -1
  136. package/dist/es/standards-sdk.es57.js +35 -134
  137. package/dist/es/standards-sdk.es57.js.map +1 -1
  138. package/dist/es/standards-sdk.es58.js +18 -3
  139. package/dist/es/standards-sdk.es58.js.map +1 -1
  140. package/dist/es/standards-sdk.es59.js +54 -357
  141. package/dist/es/standards-sdk.es59.js.map +1 -1
  142. package/dist/es/standards-sdk.es60.js +1287 -4
  143. package/dist/es/standards-sdk.es60.js.map +1 -1
  144. package/dist/es/standards-sdk.es61.js +135 -166
  145. package/dist/es/standards-sdk.es61.js.map +1 -1
  146. package/dist/es/standards-sdk.es62.js +82 -72
  147. package/dist/es/standards-sdk.es62.js.map +1 -1
  148. package/dist/es/standards-sdk.es63.js +78 -108
  149. package/dist/es/standards-sdk.es63.js.map +1 -1
  150. package/dist/es/standards-sdk.es64.js +27 -47
  151. package/dist/es/standards-sdk.es64.js.map +1 -1
  152. package/dist/es/standards-sdk.es65.js +5 -9
  153. package/dist/es/standards-sdk.es65.js.map +1 -1
  154. package/dist/es/standards-sdk.es66.js +146 -84
  155. package/dist/es/standards-sdk.es66.js.map +1 -1
  156. package/dist/es/standards-sdk.es67.js +22 -3
  157. package/dist/es/standards-sdk.es67.js.map +1 -1
  158. package/dist/es/standards-sdk.es68.js +793 -2
  159. package/dist/es/standards-sdk.es68.js.map +1 -1
  160. package/dist/es/standards-sdk.es69.js +93 -105
  161. package/dist/es/standards-sdk.es69.js.map +1 -1
  162. package/dist/es/standards-sdk.es7.js +39 -33
  163. package/dist/es/standards-sdk.es7.js.map +1 -1
  164. package/dist/es/standards-sdk.es70.js +2 -74
  165. package/dist/es/standards-sdk.es70.js.map +1 -1
  166. package/dist/es/standards-sdk.es71.js +15 -5
  167. package/dist/es/standards-sdk.es71.js.map +1 -1
  168. package/dist/es/standards-sdk.es72.js +408 -4
  169. package/dist/es/standards-sdk.es72.js.map +1 -1
  170. package/dist/es/standards-sdk.es73.js +162 -209
  171. package/dist/es/standards-sdk.es73.js.map +1 -1
  172. package/dist/es/standards-sdk.es74.js +137 -52
  173. package/dist/es/standards-sdk.es74.js.map +1 -1
  174. package/dist/es/standards-sdk.es75.js +2281 -68
  175. package/dist/es/standards-sdk.es75.js.map +1 -1
  176. package/dist/es/standards-sdk.es76.js +159 -16
  177. package/dist/es/standards-sdk.es76.js.map +1 -1
  178. package/dist/es/standards-sdk.es77.js +417 -25
  179. package/dist/es/standards-sdk.es77.js.map +1 -1
  180. package/dist/es/standards-sdk.es78.js +2 -26
  181. package/dist/es/standards-sdk.es78.js.map +1 -1
  182. package/dist/es/standards-sdk.es79.js +118 -36
  183. package/dist/es/standards-sdk.es79.js.map +1 -1
  184. package/dist/es/standards-sdk.es8.js +8 -8
  185. package/dist/es/standards-sdk.es8.js.map +1 -1
  186. package/dist/es/standards-sdk.es80.js +20 -100
  187. package/dist/es/standards-sdk.es80.js.map +1 -1
  188. package/dist/es/standards-sdk.es81.js +3 -2
  189. package/dist/es/standards-sdk.es81.js.map +1 -1
  190. package/dist/es/standards-sdk.es82.js +31 -15
  191. package/dist/es/standards-sdk.es82.js.map +1 -1
  192. package/dist/es/standards-sdk.es83.js +57 -403
  193. package/dist/es/standards-sdk.es83.js.map +1 -1
  194. package/dist/es/standards-sdk.es84.js +47 -161
  195. package/dist/es/standards-sdk.es84.js.map +1 -1
  196. package/dist/es/standards-sdk.es85.js +9 -31
  197. package/dist/es/standards-sdk.es85.js.map +1 -1
  198. package/dist/es/standards-sdk.es86.js +58 -56
  199. package/dist/es/standards-sdk.es86.js.map +1 -1
  200. package/dist/es/standards-sdk.es87.js +6 -50
  201. package/dist/es/standards-sdk.es87.js.map +1 -1
  202. package/dist/es/standards-sdk.es88.js +14 -9
  203. package/dist/es/standards-sdk.es88.js.map +1 -1
  204. package/dist/es/standards-sdk.es89.js +6 -64
  205. package/dist/es/standards-sdk.es89.js.map +1 -1
  206. package/dist/es/standards-sdk.es9.js +2 -2
  207. package/dist/es/standards-sdk.es90.js +44 -5
  208. package/dist/es/standards-sdk.es90.js.map +1 -1
  209. package/dist/es/standards-sdk.es91.js +2 -15
  210. package/dist/es/standards-sdk.es91.js.map +1 -1
  211. package/dist/es/standards-sdk.es92.js +135 -6
  212. package/dist/es/standards-sdk.es92.js.map +1 -1
  213. package/dist/es/standards-sdk.es93.js +169 -42
  214. package/dist/es/standards-sdk.es93.js.map +1 -1
  215. package/dist/es/standards-sdk.es94.js +7136 -2
  216. package/dist/es/standards-sdk.es94.js.map +1 -1
  217. package/dist/es/standards-sdk.es95.js +27 -136
  218. package/dist/es/standards-sdk.es95.js.map +1 -1
  219. package/dist/es/standards-sdk.es96.js +26 -172
  220. package/dist/es/standards-sdk.es96.js.map +1 -1
  221. package/dist/es/standards-sdk.es97.js +38 -2282
  222. package/dist/es/standards-sdk.es97.js.map +1 -1
  223. package/dist/es/standards-sdk.es98.js +31 -12
  224. package/dist/es/standards-sdk.es98.js.map +1 -1
  225. package/dist/es/standards-sdk.es99.js +15 -13
  226. package/dist/es/standards-sdk.es99.js.map +1 -1
  227. package/dist/umd/hcs-10/base-client.d.ts.map +1 -1
  228. package/dist/umd/hcs-10/connections-manager.d.ts +185 -0
  229. package/dist/umd/hcs-10/connections-manager.d.ts.map +1 -0
  230. package/dist/umd/hcs-10/index.d.ts +1 -0
  231. package/dist/umd/hcs-10/index.d.ts.map +1 -1
  232. package/dist/umd/hcs-10/sdk.d.ts.map +1 -1
  233. package/dist/umd/services/mirror-node.d.ts.map +1 -1
  234. package/dist/umd/standards-sdk.umd.js +2 -2
  235. package/dist/umd/standards-sdk.umd.js.map +1 -1
  236. package/package.json +9 -4
@@ -1,152 +1,629 @@
1
- import { InboundTopicType } from "./standards-sdk.es13.js";
2
- import { Logger } from "./standards-sdk.es14.js";
3
- class AgentBuilder {
4
- constructor() {
5
- this.config = {};
6
- this.logger = Logger.getInstance({
7
- module: "AgentBuilder"
8
- });
1
+ import { Logger } from "./standards-sdk.es15.js";
2
+ class ConnectionsManager {
3
+ /**
4
+ * Creates a new ConnectionsManager instance
5
+ */
6
+ constructor(options) {
7
+ this.connections = /* @__PURE__ */ new Map();
8
+ this.pendingRequests = /* @__PURE__ */ new Map();
9
+ this.profileCache = /* @__PURE__ */ new Map();
10
+ this.filterPendingAccountIds = /* @__PURE__ */ new Set();
11
+ const loggerOptions = {
12
+ module: "ConnectionsManager",
13
+ level: options?.logLevel || "info",
14
+ prettyPrint: true
15
+ };
16
+ this.logger = new Logger(loggerOptions);
17
+ if (options?.filterPendingAccountIds) {
18
+ this.filterPendingAccountIds = new Set(options.filterPendingAccountIds);
19
+ }
20
+ if (!options.baseClient) {
21
+ throw new Error("ConnectionsManager requires a baseClient to operate");
22
+ }
23
+ this.baseClient = options.baseClient;
9
24
  }
10
- setName(name) {
11
- this.config.name = name;
12
- return this;
25
+ /**
26
+ * Fetches and processes connection data using the configured client
27
+ * @param accountId - The account ID to fetch connection data for
28
+ * @returns A promise that resolves to an array of Connection objects
29
+ */
30
+ async fetchConnectionData(accountId) {
31
+ try {
32
+ const topicInfo = await this.baseClient.retrieveCommunicationTopics(
33
+ accountId
34
+ );
35
+ const [outboundMessagesResult, inboundMessagesResult] = await Promise.all(
36
+ [
37
+ this.baseClient.getMessages(topicInfo.outboundTopic),
38
+ this.baseClient.getMessages(topicInfo.inboundTopic)
39
+ ]
40
+ );
41
+ this.processOutboundMessages(
42
+ outboundMessagesResult.messages || [],
43
+ accountId
44
+ );
45
+ this.processInboundMessages(
46
+ inboundMessagesResult.messages || [],
47
+ accountId
48
+ );
49
+ await this.checkTargetInboundTopicsForConfirmations();
50
+ await this.fetchProfilesForConnections(accountId);
51
+ await this.fetchConnectionActivity();
52
+ return this.getAllConnections();
53
+ } catch (error) {
54
+ this.logger.error("Error fetching connection data:", error);
55
+ return this.getAllConnections();
56
+ }
13
57
  }
14
- setAlias(alias) {
15
- this.config.alias = alias;
16
- return this;
58
+ /**
59
+ * Checks target agent inbound topics to find confirmations for pending requests
60
+ * that might not be visible in our local messages
61
+ */
62
+ async checkTargetInboundTopicsForConfirmations() {
63
+ const pendingConnections = Array.from(this.connections.values()).filter(
64
+ (conn) => conn.isPending && conn.targetInboundTopicId
65
+ );
66
+ if (pendingConnections.length === 0) {
67
+ return;
68
+ }
69
+ const pendingRequestsByTarget = /* @__PURE__ */ new Map();
70
+ pendingConnections.forEach((conn) => {
71
+ if (conn.targetInboundTopicId) {
72
+ const requests = pendingRequestsByTarget.get(conn.targetInboundTopicId) || [];
73
+ requests.push(conn);
74
+ pendingRequestsByTarget.set(conn.targetInboundTopicId, requests);
75
+ }
76
+ });
77
+ const MAX_FETCH_ATTEMPTS = 2;
78
+ const FETCH_DELAY_MS = 500;
79
+ for (const [
80
+ targetInboundTopicId,
81
+ requests
82
+ ] of pendingRequestsByTarget.entries()) {
83
+ for (let attempt = 1; attempt <= MAX_FETCH_ATTEMPTS; attempt++) {
84
+ try {
85
+ const targetMessagesResult = await this.baseClient.getMessages(
86
+ targetInboundTopicId
87
+ );
88
+ const targetMessages = targetMessagesResult.messages || [];
89
+ let confirmedAny = false;
90
+ for (const conn of requests) {
91
+ const requestId = conn.connectionRequestId;
92
+ if (!requestId) {
93
+ continue;
94
+ }
95
+ const confirmationMsg = targetMessages.find(
96
+ (msg) => msg.op === "connection_created" && msg.connection_id === requestId && msg.connection_topic_id
97
+ );
98
+ if (confirmationMsg?.connection_topic_id) {
99
+ confirmedAny = true;
100
+ const connectionTopicId = confirmationMsg.connection_topic_id;
101
+ let pendingKey = conn.connectionTopicId;
102
+ if (!pendingKey.startsWith("req-") && conn.uniqueRequestKey) {
103
+ pendingKey = conn.uniqueRequestKey;
104
+ }
105
+ const newConnection = {
106
+ connectionTopicId,
107
+ targetAccountId: conn.targetAccountId,
108
+ targetAgentName: conn.targetAgentName,
109
+ targetInboundTopicId: conn.targetInboundTopicId,
110
+ status: "established",
111
+ isPending: false,
112
+ needsConfirmation: false,
113
+ created: new Date(confirmationMsg.created || conn.created),
114
+ profileInfo: conn.profileInfo,
115
+ connectionRequestId: requestId,
116
+ uniqueRequestKey: conn.uniqueRequestKey
117
+ };
118
+ this.connections.set(connectionTopicId, newConnection);
119
+ if (pendingKey && pendingKey !== connectionTopicId) {
120
+ this.connections.delete(pendingKey);
121
+ }
122
+ this.logger.debug(
123
+ `Confirmed connection in target inbound topic: ${connectionTopicId}`
124
+ );
125
+ }
126
+ }
127
+ if (confirmedAny || attempt === MAX_FETCH_ATTEMPTS) {
128
+ break;
129
+ }
130
+ await new Promise((resolve) => setTimeout(resolve, FETCH_DELAY_MS));
131
+ } catch (error) {
132
+ this.logger.debug(
133
+ `Error fetching target inbound topic ${targetInboundTopicId}:`,
134
+ error
135
+ );
136
+ if (attempt === MAX_FETCH_ATTEMPTS) {
137
+ break;
138
+ }
139
+ await new Promise((resolve) => setTimeout(resolve, FETCH_DELAY_MS));
140
+ }
141
+ }
142
+ }
17
143
  }
18
- setBio(bio) {
19
- this.config.bio = bio;
20
- return this;
144
+ /**
145
+ * Fetches profiles for all connected accounts
146
+ * @param accountId - The account ID making the request
147
+ */
148
+ async fetchProfilesForConnections(accountId) {
149
+ const targetAccountIds = /* @__PURE__ */ new Set();
150
+ for (const connection of this.connections.values()) {
151
+ if (connection.targetAccountId && !this.profileCache.has(connection.targetAccountId)) {
152
+ targetAccountIds.add(connection.targetAccountId);
153
+ }
154
+ }
155
+ const accountIdPromises = Array.from(targetAccountIds).map(
156
+ async (targetId) => {
157
+ try {
158
+ const profileResponse = await this.baseClient.retrieveProfile(
159
+ targetId
160
+ );
161
+ if (profileResponse.success && profileResponse.profile) {
162
+ this.addProfileInfo(targetId, profileResponse.profile);
163
+ this.updatePendingConnectionsWithProfileInfo(
164
+ targetId,
165
+ profileResponse.profile
166
+ );
167
+ }
168
+ } catch (error) {
169
+ this.logger.debug(`Failed to fetch profile for ${targetId}:`, error);
170
+ }
171
+ }
172
+ );
173
+ await Promise.allSettled(accountIdPromises);
21
174
  }
22
175
  /**
23
- * @deprecated Use setBio instead
176
+ * Updates pending connections with inbound topic IDs from profile info
177
+ * @param accountId - The account ID to update connections for
178
+ * @param profile - The profile containing the inbound topic ID
24
179
  */
25
- setDescription(description) {
26
- this.config.bio = description;
27
- return this;
180
+ updatePendingConnectionsWithProfileInfo(accountId, profile) {
181
+ const pendingConnections = Array.from(this.connections.values()).filter(
182
+ (conn) => conn.targetAccountId === accountId && (conn.isPending || conn.needsConfirmation) && !conn.targetInboundTopicId
183
+ );
184
+ if (pendingConnections.length > 0 && profile.inboundTopicId) {
185
+ for (const conn of pendingConnections) {
186
+ const updatedConn = {
187
+ ...conn,
188
+ targetInboundTopicId: profile.inboundTopicId
189
+ };
190
+ this.connections.set(conn.connectionTopicId, updatedConn);
191
+ }
192
+ }
28
193
  }
29
- setCapabilities(capabilities) {
30
- this.config.capabilities = capabilities;
31
- return this;
194
+ /**
195
+ * Fetches activity from active connection topics
196
+ * Updates the lastActivity timestamp for each connection based on latest messages
197
+ * @returns Promise that resolves when all activity has been fetched
198
+ */
199
+ async fetchConnectionActivity() {
200
+ const activeConnections = this.getActiveConnections();
201
+ const activityPromises = activeConnections.map(async (connection) => {
202
+ try {
203
+ const messagesResult = await this.baseClient.getMessages(
204
+ connection.connectionTopicId
205
+ );
206
+ if (messagesResult?.messages?.length > 0) {
207
+ this.processConnectionMessages(
208
+ connection.connectionTopicId,
209
+ messagesResult.messages
210
+ );
211
+ }
212
+ } catch (error) {
213
+ this.logger.debug(
214
+ `Failed to fetch activity for ${connection.connectionTopicId}:`,
215
+ error
216
+ );
217
+ }
218
+ });
219
+ await Promise.allSettled(activityPromises);
32
220
  }
33
221
  /**
34
- * @deprecated Use setType instead
222
+ * Checks if an account should be filtered, taking into account existing established connections
223
+ * @param accountId - The account ID to check
224
+ * @returns True if the account should be filtered, false otherwise
35
225
  */
36
- setAgentType(type) {
37
- if (!this.config.metadata) {
38
- this.config.metadata = { type };
39
- } else {
40
- this.config.metadata.type = type;
226
+ shouldFilterAccount(accountId) {
227
+ if (!this.filterPendingAccountIds.has(accountId)) {
228
+ return false;
41
229
  }
42
- return this;
43
- }
44
- setType(type) {
45
- if (!this.config.metadata) {
46
- this.config.metadata = { type };
47
- } else {
48
- this.config.metadata.type = type;
230
+ if (this.hasEstablishedConnectionWithAccount(accountId)) {
231
+ return false;
49
232
  }
50
- return this;
233
+ return true;
51
234
  }
52
- setModel(model) {
53
- if (!this.config.metadata) {
54
- this.config.metadata = { type: "manual" };
235
+ /**
236
+ * Process outbound messages to track connection requests and confirmations
237
+ * @param messages - The messages to process
238
+ * @param accountId - The account ID that sent the messages
239
+ * @returns Array of connections after processing
240
+ */
241
+ processOutboundMessages(messages, accountId) {
242
+ if (!messages || messages.length === 0) {
243
+ return Array.from(this.connections.values());
55
244
  }
56
- this.config.metadata.model = model;
57
- return this;
58
- }
59
- setCreator(creator) {
60
- if (!this.config.metadata) {
61
- this.config.metadata = { type: "manual" };
245
+ const requestMessages = messages.filter(
246
+ (msg) => msg.op === "connection_request" && msg.connection_request_id
247
+ );
248
+ for (const msg of requestMessages) {
249
+ const requestId = msg.connection_request_id;
250
+ const operatorId = msg.operator_id || "";
251
+ const targetAccountId = this.baseClient.extractAccountFromOperatorId(operatorId);
252
+ const targetInboundTopicId = this.baseClient.extractTopicFromOperatorId(operatorId);
253
+ if (this.shouldFilterAccount(targetAccountId)) {
254
+ this.logger.debug(
255
+ `Filtering out outbound request to account: ${targetAccountId}`
256
+ );
257
+ continue;
258
+ }
259
+ const isAlreadyConfirmed = Array.from(this.connections.values()).some(
260
+ (conn) => conn.connectionRequestId === requestId && !conn.isPending
261
+ );
262
+ const pendingKey = `req-${requestId}:${operatorId}`;
263
+ if (!isAlreadyConfirmed && !this.pendingRequests.has(pendingKey)) {
264
+ this.pendingRequests.set(pendingKey, {
265
+ id: requestId,
266
+ requesterId: accountId,
267
+ requesterTopicId: msg.outbound_topic_id || "",
268
+ targetAccountId,
269
+ targetTopicId: targetInboundTopicId,
270
+ operatorId,
271
+ sequenceNumber: msg.sequence_number,
272
+ created: msg.created || /* @__PURE__ */ new Date(),
273
+ memo: msg.m,
274
+ status: "pending"
275
+ });
276
+ if (!this.connections.has(pendingKey)) {
277
+ this.connections.set(pendingKey, {
278
+ connectionTopicId: pendingKey,
279
+ targetAccountId,
280
+ targetInboundTopicId,
281
+ status: "pending",
282
+ isPending: true,
283
+ needsConfirmation: false,
284
+ created: msg.created || /* @__PURE__ */ new Date(),
285
+ connectionRequestId: requestId,
286
+ uniqueRequestKey: pendingKey
287
+ });
288
+ }
289
+ }
290
+ }
291
+ const confirmationMessages = messages.filter(
292
+ (msg) => msg.op === "connection_created" && msg.connection_topic_id && msg.connection_request_id
293
+ );
294
+ for (const msg of confirmationMessages) {
295
+ const requestId = msg.connection_request_id;
296
+ const connectionTopicId = msg.connection_topic_id;
297
+ const targetAccountId = this.baseClient.extractAccountFromOperatorId(
298
+ msg.operator_id || ""
299
+ );
300
+ if (this.shouldFilterAccount(targetAccountId)) {
301
+ this.logger.debug(
302
+ `Filtering out outbound confirmation to account: ${targetAccountId}`
303
+ );
304
+ continue;
305
+ }
306
+ const pendingKey = `req-${requestId}:${msg.operator_id}`;
307
+ const pendingRequest = this.pendingRequests.get(pendingKey);
308
+ if (pendingRequest) {
309
+ pendingRequest.status = "confirmed";
310
+ }
311
+ if (this.connections.has(pendingKey)) {
312
+ this.connections.delete(pendingKey);
313
+ }
314
+ const existingConnections = Array.from(this.connections.entries()).filter(
315
+ ([_, conn]) => conn.connectionRequestId === requestId
316
+ );
317
+ for (const [key, _] of existingConnections) {
318
+ if (key !== connectionTopicId) {
319
+ this.connections.delete(key);
320
+ }
321
+ }
322
+ if (!this.connections.has(connectionTopicId)) {
323
+ this.connections.set(connectionTopicId, {
324
+ connectionTopicId,
325
+ targetAccountId,
326
+ status: "established",
327
+ isPending: false,
328
+ needsConfirmation: false,
329
+ created: msg.created || /* @__PURE__ */ new Date(),
330
+ connectionRequestId: requestId,
331
+ confirmedRequestId: msg.confirmed_request_id,
332
+ requesterOutboundTopicId: msg.outbound_topic_id,
333
+ uniqueRequestKey: pendingKey
334
+ });
335
+ } else {
336
+ const conn = this.connections.get(connectionTopicId);
337
+ this.connections.set(connectionTopicId, {
338
+ ...conn,
339
+ status: "established",
340
+ isPending: false,
341
+ needsConfirmation: false,
342
+ connectionRequestId: requestId,
343
+ confirmedRequestId: msg.confirmed_request_id,
344
+ requesterOutboundTopicId: msg.outbound_topic_id,
345
+ uniqueRequestKey: pendingKey
346
+ });
347
+ }
62
348
  }
63
- this.config.metadata.creator = creator;
64
- return this;
349
+ const closedMessages = messages.filter(
350
+ (msg) => msg.op === "connection_closed" || msg.op === "close_connection" && msg.connection_topic_id
351
+ );
352
+ for (const msg of closedMessages) {
353
+ const connectionTopicId = msg.connection_topic_id;
354
+ if (this.connections.has(connectionTopicId)) {
355
+ const conn = this.connections.get(connectionTopicId);
356
+ if (this.shouldFilterAccount(conn.targetAccountId) && conn.status !== "established") {
357
+ continue;
358
+ }
359
+ const uniqueKey = msg.connection_request_id && msg.operator_id ? `req-${msg.connection_request_id}:${msg.operator_id}` : void 0;
360
+ this.connections.set(connectionTopicId, {
361
+ ...conn,
362
+ status: "closed",
363
+ isPending: false,
364
+ needsConfirmation: false,
365
+ lastActivity: msg.created || /* @__PURE__ */ new Date(),
366
+ closedReason: msg.reason,
367
+ closeMethod: msg.close_method,
368
+ uniqueRequestKey: uniqueKey
369
+ });
370
+ }
371
+ }
372
+ return Array.from(this.connections.values()).filter(
373
+ (conn) => conn.status === "established" || conn.status === "closed" || !this.filterPendingAccountIds.has(conn.targetAccountId)
374
+ );
65
375
  }
66
- addSocial(platform, handle) {
67
- if (!this.config.metadata) {
68
- this.config.metadata = { type: "manual" };
376
+ /**
377
+ * Process inbound messages to track connection requests and confirmations
378
+ * @param messages - The messages to process
379
+ * @param accountId - The account ID that received the messages
380
+ * @returns Array of connections after processing
381
+ */
382
+ processInboundMessages(messages, accountId) {
383
+ if (!messages || messages.length === 0) {
384
+ return Array.from(this.connections.values());
385
+ }
386
+ const requestMessages = messages.filter(
387
+ (msg) => msg.op === "connection_request" && msg.sequence_number
388
+ );
389
+ for (const msg of requestMessages) {
390
+ const sequenceNumber = msg.sequence_number;
391
+ const operatorId = msg.operator_id || "";
392
+ const requestorAccountId = this.baseClient.extractAccountFromOperatorId(operatorId);
393
+ const requestorTopicId = this.baseClient.extractTopicFromOperatorId(operatorId);
394
+ if (this.shouldFilterAccount(requestorAccountId)) {
395
+ this.logger.debug(
396
+ `Filtering out request from account: ${requestorAccountId}`
397
+ );
398
+ continue;
399
+ }
400
+ const isAlreadyConfirmed = messages.some(
401
+ (confirmMsg) => confirmMsg.op === "connection_created" && confirmMsg.connection_id === sequenceNumber
402
+ );
403
+ if (!isAlreadyConfirmed) {
404
+ const needsConfirmKey = `inb-${sequenceNumber}:${operatorId}`;
405
+ if (!this.connections.has(needsConfirmKey)) {
406
+ this.connections.set(needsConfirmKey, {
407
+ connectionTopicId: needsConfirmKey,
408
+ targetAccountId: requestorAccountId,
409
+ targetInboundTopicId: requestorTopicId,
410
+ status: "needs_confirmation",
411
+ isPending: false,
412
+ needsConfirmation: true,
413
+ created: msg.created || /* @__PURE__ */ new Date(),
414
+ inboundRequestId: sequenceNumber,
415
+ uniqueRequestKey: needsConfirmKey
416
+ });
417
+ }
418
+ }
69
419
  }
70
- if (!this.config.metadata.socials) {
71
- this.config.metadata.socials = {};
420
+ const confirmationMessages = messages.filter(
421
+ (msg) => msg.op === "connection_created" && msg.connection_topic_id && msg.connection_id
422
+ );
423
+ for (const msg of confirmationMessages) {
424
+ const sequenceNumber = msg.connection_id;
425
+ const connectionTopicId = msg.connection_topic_id;
426
+ const connectedAccountId = msg.connected_account_id || "";
427
+ if (this.shouldFilterAccount(connectedAccountId)) {
428
+ this.logger.debug(
429
+ `Filtering out confirmation for account: ${connectedAccountId}`
430
+ );
431
+ continue;
432
+ }
433
+ const needsConfirmKey = `inb-${sequenceNumber}:${msg.operator_id}`;
434
+ if (this.connections.has(needsConfirmKey)) {
435
+ this.connections.delete(needsConfirmKey);
436
+ }
437
+ const existingConnections = Array.from(this.connections.entries()).filter(
438
+ ([_, conn]) => conn.inboundRequestId === sequenceNumber
439
+ );
440
+ for (const [key, _] of existingConnections) {
441
+ if (key !== connectionTopicId) {
442
+ this.connections.delete(key);
443
+ }
444
+ }
445
+ if (!this.connections.has(connectionTopicId)) {
446
+ this.connections.set(connectionTopicId, {
447
+ connectionTopicId,
448
+ targetAccountId: connectedAccountId,
449
+ status: "established",
450
+ isPending: false,
451
+ needsConfirmation: false,
452
+ created: msg.created || /* @__PURE__ */ new Date(),
453
+ inboundRequestId: sequenceNumber,
454
+ uniqueRequestKey: needsConfirmKey
455
+ });
456
+ } else {
457
+ const conn = this.connections.get(connectionTopicId);
458
+ this.connections.set(connectionTopicId, {
459
+ ...conn,
460
+ status: "established",
461
+ isPending: false,
462
+ needsConfirmation: false,
463
+ inboundRequestId: sequenceNumber,
464
+ uniqueRequestKey: needsConfirmKey
465
+ });
466
+ }
72
467
  }
73
- this.config.metadata.socials[platform] = handle;
74
- return this;
468
+ return Array.from(this.connections.values()).filter(
469
+ (conn) => conn.status === "established" || conn.status === "closed" || !this.filterPendingAccountIds.has(conn.targetAccountId)
470
+ );
75
471
  }
76
- addProperty(key, value) {
77
- if (!this.config.metadata) {
78
- this.config.metadata = { type: "manual" };
472
+ /**
473
+ * Process connection topic messages to update last activity time
474
+ * @param connectionTopicId - The topic ID of the connection
475
+ * @param messages - The messages to process
476
+ * @returns The updated connection or undefined if not found
477
+ */
478
+ processConnectionMessages(connectionTopicId, messages) {
479
+ if (!messages || messages.length === 0 || !this.connections.has(connectionTopicId)) {
480
+ return this.connections.get(connectionTopicId);
79
481
  }
80
- if (!this.config.metadata.properties) {
81
- this.config.metadata.properties = {};
482
+ const latestMessage = messages.filter((m) => m.created).sort((a, b) => {
483
+ const dateA = a.created ? new Date(a.created).getTime() : 0;
484
+ const dateB = b.created ? new Date(b.created).getTime() : 0;
485
+ return dateB - dateA;
486
+ })[0];
487
+ if (latestMessage?.created) {
488
+ const conn = this.connections.get(connectionTopicId);
489
+ this.connections.set(connectionTopicId, {
490
+ ...conn,
491
+ lastActivity: latestMessage.created
492
+ });
82
493
  }
83
- this.config.metadata.properties[key] = value;
84
- return this;
494
+ const closeMessage = messages.find((msg) => msg.op === "close_connection");
495
+ if (closeMessage) {
496
+ const conn = this.connections.get(connectionTopicId);
497
+ this.connections.set(connectionTopicId, {
498
+ ...conn,
499
+ status: "closed",
500
+ lastActivity: closeMessage.created || /* @__PURE__ */ new Date(),
501
+ closedReason: closeMessage.reason,
502
+ closeMethod: "explicit"
503
+ });
504
+ }
505
+ return this.connections.get(connectionTopicId);
85
506
  }
86
- setMetadata(metadata) {
87
- this.config.metadata = metadata;
88
- return this;
507
+ /**
508
+ * Adds or updates profile information for a connection
509
+ * @param accountId - The account ID to add profile info for
510
+ * @param profile - The profile information
511
+ */
512
+ addProfileInfo(accountId, profile) {
513
+ this.profileCache.set(accountId, profile);
514
+ const matchingConnections = Array.from(this.connections.values()).filter(
515
+ (conn) => conn.targetAccountId === accountId
516
+ );
517
+ for (const conn of matchingConnections) {
518
+ this.connections.set(conn.connectionTopicId, {
519
+ ...conn,
520
+ profileInfo: profile,
521
+ targetAgentName: profile.display_name,
522
+ targetInboundTopicId: profile.inboundTopicId,
523
+ targetOutboundTopicId: profile.outboundTopicId
524
+ });
525
+ }
89
526
  }
90
- setProfilePicture(pfpBuffer, pfpFileName) {
91
- this.config.pfpBuffer = pfpBuffer;
92
- this.config.pfpFileName = pfpFileName;
93
- return this;
527
+ /**
528
+ * Gets all connections
529
+ * @returns Array of all connections that should be visible
530
+ */
531
+ getAllConnections() {
532
+ return Array.from(this.connections.values()).filter(
533
+ (conn) => conn.status === "established" || conn.status === "closed" || !this.filterPendingAccountIds.has(conn.targetAccountId) || this.hasEstablishedConnectionWithAccount(conn.targetAccountId)
534
+ );
94
535
  }
95
- setExistingProfilePicture(pfpTopicId) {
96
- this.config.existingPfpTopicId = pfpTopicId;
97
- return this;
536
+ /**
537
+ * Gets all pending connection requests
538
+ * @returns Array of pending connection requests
539
+ */
540
+ getPendingRequests() {
541
+ return Array.from(this.connections.values()).filter((conn) => {
542
+ return conn.isPending && (!this.filterPendingAccountIds.has(conn.targetAccountId) || this.hasEstablishedConnectionWithAccount(conn.targetAccountId));
543
+ });
98
544
  }
99
- setNetwork(network) {
100
- this.config.network = network;
101
- return this;
545
+ /**
546
+ * Helper method to check if there's an established connection with an account
547
+ * @param accountId - The account ID to check
548
+ * @returns True if there's an established connection, false otherwise
549
+ */
550
+ hasEstablishedConnectionWithAccount(accountId) {
551
+ return Array.from(this.connections.values()).some(
552
+ (conn) => conn.targetAccountId === accountId && conn.status === "established"
553
+ );
102
554
  }
103
- setInboundTopicType(inboundTopicType) {
104
- this.config.inboundTopicType = inboundTopicType;
105
- return this;
555
+ /**
556
+ * Gets all active (established) connections
557
+ * @returns Array of active connections
558
+ */
559
+ getActiveConnections() {
560
+ return Array.from(this.connections.values()).filter(
561
+ (conn) => conn.status === "established"
562
+ );
106
563
  }
107
- setFeeConfig(feeConfigBuilder) {
108
- this.config.feeConfig = feeConfigBuilder;
109
- return this;
564
+ /**
565
+ * Gets all connections needing confirmation
566
+ * @returns Array of connections needing confirmation
567
+ */
568
+ getConnectionsNeedingConfirmation() {
569
+ return Array.from(this.connections.values()).filter(
570
+ (conn) => conn.needsConfirmation && (!this.filterPendingAccountIds.has(conn.targetAccountId) || this.hasEstablishedConnectionWithAccount(conn.targetAccountId))
571
+ );
110
572
  }
111
- setConnectionFeeConfig(feeConfigBuilder) {
112
- this.config.connectionFeeConfig = feeConfigBuilder;
113
- return this;
573
+ /**
574
+ * Gets a connection by its topic ID
575
+ * @param connectionTopicId - The topic ID to look up
576
+ * @returns The connection with the given topic ID, or undefined if not found
577
+ */
578
+ getConnectionByTopicId(connectionTopicId) {
579
+ return this.connections.get(connectionTopicId);
114
580
  }
115
- setExistingAccount(accountId, privateKey) {
116
- this.config.existingAccount = { accountId, privateKey };
117
- return this;
581
+ /**
582
+ * Gets a connection by request ID
583
+ * @param requestId - The request ID to look up
584
+ * @returns The connection with the given request ID, or undefined if not found
585
+ */
586
+ getConnection(requestId, inboundTopicId) {
587
+ return Array.from(this.connections.values()).find(
588
+ (conn) => conn.connectionRequestId === requestId || conn.inboundRequestId === requestId
589
+ );
118
590
  }
119
- build() {
120
- if (!this.config.name) {
121
- throw new Error("Agent display name is required");
122
- }
123
- if (!this.config.bio) {
124
- this.logger?.warn("Agent description is not set");
125
- }
126
- if (!this.config.pfpBuffer && !this.config.existingPfpTopicId) {
127
- this.logger.warn("No profile picture provided or referenced.");
128
- }
129
- if (!this.config.network) {
130
- throw new Error("Network is required");
131
- }
132
- if (!this.config.inboundTopicType) {
133
- this.config.inboundTopicType = InboundTopicType.PUBLIC;
134
- }
135
- if (!this.config.capabilities) {
136
- this.config.capabilities = [];
137
- }
138
- if (!this.config.metadata) {
139
- this.config.metadata = { type: "manual" };
140
- } else if (!this.config.metadata.type) {
141
- this.config.metadata.type = "manual";
142
- }
143
- if (this.config.inboundTopicType === InboundTopicType.FEE_BASED && !this.config.feeConfig) {
144
- throw new Error("Fee configuration is required for fee-based topics");
145
- }
146
- return this.config;
591
+ /**
592
+ * Gets a connection by account ID
593
+ * @param accountId - The account ID to look up
594
+ * @returns The connection with the given account ID, or undefined if not found
595
+ */
596
+ getConnectionByAccountId(accountId) {
597
+ return Array.from(this.connections.values()).find(
598
+ (conn) => conn.targetAccountId === accountId && conn.status === "established"
599
+ );
600
+ }
601
+ /**
602
+ * Gets all connections for a specific account ID
603
+ * @param accountId - The account ID to look up
604
+ * @returns Array of connections for the given account ID
605
+ */
606
+ getConnectionsByAccountId(accountId) {
607
+ return Array.from(this.connections.values()).filter(
608
+ (conn) => conn.targetAccountId === accountId
609
+ );
610
+ }
611
+ /**
612
+ * Updates or adds a connection
613
+ * @param connection - The connection to update or add
614
+ */
615
+ updateOrAddConnection(connection) {
616
+ this.connections.set(connection.connectionTopicId, connection);
617
+ }
618
+ /**
619
+ * Clears all tracked connections and requests
620
+ */
621
+ clearAll() {
622
+ this.connections.clear();
623
+ this.pendingRequests.clear();
147
624
  }
148
625
  }
149
626
  export {
150
- AgentBuilder
627
+ ConnectionsManager
151
628
  };
152
629
  //# sourceMappingURL=standards-sdk.es10.js.map