@hashgraphonline/standards-sdk 0.0.86 → 0.0.88
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.
- package/dist/es/hcs-10/connections-manager.d.ts +4 -2
- package/dist/es/hcs-10/connections-manager.d.ts.map +1 -1
- package/dist/es/standards-sdk.es10.js +18 -10
- package/dist/es/standards-sdk.es10.js.map +1 -1
- package/dist/es/standards-sdk.es100.js +29 -145
- package/dist/es/standards-sdk.es100.js.map +1 -1
- package/dist/es/standards-sdk.es101.js +13 -89
- package/dist/es/standards-sdk.es101.js.map +1 -1
- package/dist/es/standards-sdk.es102.js +3 -83
- package/dist/es/standards-sdk.es102.js.map +1 -1
- package/dist/es/standards-sdk.es103.js +3 -31
- package/dist/es/standards-sdk.es103.js.map +1 -1
- package/dist/es/standards-sdk.es104.js +3 -5
- package/dist/es/standards-sdk.es104.js.map +1 -1
- package/dist/es/standards-sdk.es105.js +13 -156
- package/dist/es/standards-sdk.es105.js.map +1 -1
- package/dist/es/standards-sdk.es106.js +4 -22
- package/dist/es/standards-sdk.es106.js.map +1 -1
- package/dist/es/standards-sdk.es107.js +37 -791
- package/dist/es/standards-sdk.es107.js.map +1 -1
- package/dist/es/standards-sdk.es108.js +35 -138
- package/dist/es/standards-sdk.es108.js.map +1 -1
- package/dist/es/standards-sdk.es109.js +35 -172
- package/dist/es/standards-sdk.es109.js.map +1 -1
- package/dist/es/standards-sdk.es110.js +75 -31
- package/dist/es/standards-sdk.es110.js.map +1 -1
- package/dist/es/standards-sdk.es111.js +3 -33
- package/dist/es/standards-sdk.es111.js.map +1 -1
- package/dist/es/standards-sdk.es112.js +2 -9
- package/dist/es/standards-sdk.es112.js.map +1 -1
- package/dist/es/standards-sdk.es113.js +2 -34
- package/dist/es/standards-sdk.es113.js.map +1 -1
- package/dist/es/standards-sdk.es114.js +33 -20
- package/dist/es/standards-sdk.es114.js.map +1 -1
- package/dist/es/standards-sdk.es115.js +32 -26
- package/dist/es/standards-sdk.es115.js.map +1 -1
- package/dist/es/standards-sdk.es116.js +9 -26
- package/dist/es/standards-sdk.es116.js.map +1 -1
- package/dist/es/standards-sdk.es117.js +33 -37
- package/dist/es/standards-sdk.es117.js.map +1 -1
- package/dist/es/standards-sdk.es13.js +3 -3
- package/dist/es/standards-sdk.es18.js +2 -2
- package/dist/es/standards-sdk.es19.js +3 -3
- package/dist/es/standards-sdk.es22.js +966 -1692
- package/dist/es/standards-sdk.es22.js.map +1 -1
- package/dist/es/standards-sdk.es23.js +1767 -36
- package/dist/es/standards-sdk.es23.js.map +1 -1
- package/dist/es/standards-sdk.es24.js +3 -48
- package/dist/es/standards-sdk.es24.js.map +1 -1
- package/dist/es/standards-sdk.es25.js +3843 -6866
- package/dist/es/standards-sdk.es25.js.map +1 -1
- package/dist/es/standards-sdk.es26.js +36 -3
- package/dist/es/standards-sdk.es26.js.map +1 -1
- package/dist/es/standards-sdk.es27.js +48 -2
- package/dist/es/standards-sdk.es27.js.map +1 -1
- package/dist/es/standards-sdk.es28.js +7091 -942
- package/dist/es/standards-sdk.es28.js.map +1 -1
- package/dist/es/standards-sdk.es29.js +2 -4167
- package/dist/es/standards-sdk.es29.js.map +1 -1
- package/dist/es/standards-sdk.es30.js +2 -2
- package/dist/es/standards-sdk.es31.js +87 -405
- package/dist/es/standards-sdk.es31.js.map +1 -1
- package/dist/es/standards-sdk.es32.js +2 -2
- package/dist/es/standards-sdk.es33.js +15 -119
- package/dist/es/standards-sdk.es33.js.map +1 -1
- package/dist/es/standards-sdk.es34.js +408 -3
- package/dist/es/standards-sdk.es34.js.map +1 -1
- package/dist/es/standards-sdk.es35.js +2281 -363
- package/dist/es/standards-sdk.es35.js.map +1 -1
- package/dist/es/standards-sdk.es36.js +163 -5
- package/dist/es/standards-sdk.es36.js.map +1 -1
- package/dist/es/standards-sdk.es37.js +2 -179
- package/dist/es/standards-sdk.es37.js.map +1 -1
- package/dist/es/standards-sdk.es38.js +351 -68
- package/dist/es/standards-sdk.es38.js.map +1 -1
- package/dist/es/standards-sdk.es39.js +5 -113
- package/dist/es/standards-sdk.es39.js.map +1 -1
- package/dist/es/standards-sdk.es4.js +1 -1
- package/dist/es/standards-sdk.es40.js +170 -43
- package/dist/es/standards-sdk.es40.js.map +1 -1
- package/dist/es/standards-sdk.es41.js +80 -9
- package/dist/es/standards-sdk.es41.js.map +1 -1
- package/dist/es/standards-sdk.es42.js +104 -87
- package/dist/es/standards-sdk.es42.js.map +1 -1
- package/dist/es/standards-sdk.es43.js +51 -3
- package/dist/es/standards-sdk.es43.js.map +1 -1
- package/dist/es/standards-sdk.es44.js +10 -2
- package/dist/es/standards-sdk.es44.js.map +1 -1
- package/dist/es/standards-sdk.es45.js +86 -102
- package/dist/es/standards-sdk.es45.js.map +1 -1
- package/dist/es/standards-sdk.es46.js +3 -73
- package/dist/es/standards-sdk.es46.js.map +1 -1
- package/dist/es/standards-sdk.es47.js +2 -6
- package/dist/es/standards-sdk.es47.js.map +1 -1
- package/dist/es/standards-sdk.es48.js +112 -4
- package/dist/es/standards-sdk.es48.js.map +1 -1
- package/dist/es/standards-sdk.es49.js +69 -216
- package/dist/es/standards-sdk.es49.js.map +1 -1
- package/dist/es/standards-sdk.es5.js +3 -3
- package/dist/es/standards-sdk.es50.js +6 -58
- package/dist/es/standards-sdk.es50.js.map +1 -1
- package/dist/es/standards-sdk.es51.js +5 -69
- package/dist/es/standards-sdk.es51.js.map +1 -1
- package/dist/es/standards-sdk.es52.js +208 -88
- package/dist/es/standards-sdk.es52.js.map +1 -1
- package/dist/es/standards-sdk.es53.js +58 -2
- package/dist/es/standards-sdk.es53.js.map +1 -1
- package/dist/es/standards-sdk.es54.js +69 -16
- package/dist/es/standards-sdk.es54.js.map +1 -1
- package/dist/es/standards-sdk.es55.js +190 -404
- package/dist/es/standards-sdk.es55.js.map +1 -1
- package/dist/es/standards-sdk.es56.js +437 -2281
- package/dist/es/standards-sdk.es56.js.map +1 -1
- package/dist/es/standards-sdk.es57.js +20 -159
- package/dist/es/standards-sdk.es57.js.map +1 -1
- package/dist/es/standards-sdk.es58.js +139 -3
- package/dist/es/standards-sdk.es58.js.map +1 -1
- package/dist/es/standards-sdk.es59.js +13 -27
- package/dist/es/standards-sdk.es59.js.map +1 -1
- package/dist/es/standards-sdk.es60.js +23 -57
- package/dist/es/standards-sdk.es60.js.map +1 -1
- package/dist/es/standards-sdk.es61.js +25 -46
- package/dist/es/standards-sdk.es61.js.map +1 -1
- package/dist/es/standards-sdk.es62.js +20 -9
- package/dist/es/standards-sdk.es62.js.map +1 -1
- package/dist/es/standards-sdk.es63.js +37 -58
- package/dist/es/standards-sdk.es63.js.map +1 -1
- package/dist/es/standards-sdk.es64.js +18 -6
- package/dist/es/standards-sdk.es64.js.map +1 -1
- package/dist/es/standards-sdk.es65.js +59 -13
- package/dist/es/standards-sdk.es65.js.map +1 -1
- package/dist/es/standards-sdk.es66.js +1288 -6
- package/dist/es/standards-sdk.es66.js.map +1 -1
- package/dist/es/standards-sdk.es67.js +144 -41
- package/dist/es/standards-sdk.es67.js.map +1 -1
- package/dist/es/standards-sdk.es68.js +91 -2
- package/dist/es/standards-sdk.es68.js.map +1 -1
- package/dist/es/standards-sdk.es69.js +80 -132
- package/dist/es/standards-sdk.es69.js.map +1 -1
- package/dist/es/standards-sdk.es7.js +3 -3
- package/dist/es/standards-sdk.es70.js +28 -168
- package/dist/es/standards-sdk.es70.js.map +1 -1
- package/dist/es/standards-sdk.es71.js +6 -13
- package/dist/es/standards-sdk.es71.js.map +1 -1
- package/dist/es/standards-sdk.es72.js +159 -13
- package/dist/es/standards-sdk.es72.js.map +1 -1
- package/dist/es/standards-sdk.es73.js +22 -7135
- package/dist/es/standards-sdk.es73.js.map +1 -1
- package/dist/es/standards-sdk.es74.js +793 -2
- package/dist/es/standards-sdk.es74.js.map +1 -1
- package/dist/es/standards-sdk.es75.js +172 -30
- package/dist/es/standards-sdk.es75.js.map +1 -1
- package/dist/es/standards-sdk.es76.js +142 -14
- package/dist/es/standards-sdk.es76.js.map +1 -1
- package/dist/es/standards-sdk.es77.js +3 -4
- package/dist/es/standards-sdk.es77.js.map +1 -1
- package/dist/es/standards-sdk.es78.js +31 -3
- package/dist/es/standards-sdk.es78.js.map +1 -1
- package/dist/es/standards-sdk.es79.js +61 -14
- package/dist/es/standards-sdk.es79.js.map +1 -1
- package/dist/es/standards-sdk.es8.js +3 -3
- package/dist/es/standards-sdk.es80.js +49 -4
- package/dist/es/standards-sdk.es80.js.map +1 -1
- package/dist/es/standards-sdk.es81.js +10 -39
- package/dist/es/standards-sdk.es81.js.map +1 -1
- package/dist/es/standards-sdk.es82.js +58 -33
- package/dist/es/standards-sdk.es82.js.map +1 -1
- package/dist/es/standards-sdk.es83.js +5 -36
- package/dist/es/standards-sdk.es83.js.map +1 -1
- package/dist/es/standards-sdk.es84.js +13 -76
- package/dist/es/standards-sdk.es84.js.map +1 -1
- package/dist/es/standards-sdk.es85.js +7 -3
- package/dist/es/standards-sdk.es85.js.map +1 -1
- package/dist/es/standards-sdk.es86.js +45 -2
- package/dist/es/standards-sdk.es86.js.map +1 -1
- package/dist/es/standards-sdk.es87.js +2 -2
- package/dist/es/standards-sdk.es87.js.map +1 -1
- package/dist/es/standards-sdk.es88.js +131 -190
- package/dist/es/standards-sdk.es88.js.map +1 -1
- package/dist/es/standards-sdk.es89.js +158 -424
- package/dist/es/standards-sdk.es89.js.map +1 -1
- package/dist/es/standards-sdk.es9.js +1 -1
- package/dist/es/standards-sdk.es90.js +14 -18
- package/dist/es/standards-sdk.es90.js.map +1 -1
- package/dist/es/standards-sdk.es91.js +23 -135
- package/dist/es/standards-sdk.es91.js.map +1 -1
- package/dist/es/standards-sdk.es92.js +24 -16
- package/dist/es/standards-sdk.es92.js.map +1 -1
- package/dist/es/standards-sdk.es93.js +35 -26
- package/dist/es/standards-sdk.es93.js.map +1 -1
- package/dist/es/standards-sdk.es94.js +417 -27
- package/dist/es/standards-sdk.es94.js.map +1 -1
- package/dist/es/standards-sdk.es95.js +2 -21
- package/dist/es/standards-sdk.es95.js.map +1 -1
- package/dist/es/standards-sdk.es96.js +114 -38
- package/dist/es/standards-sdk.es96.js.map +1 -1
- package/dist/es/standards-sdk.es97.js +13 -18
- package/dist/es/standards-sdk.es97.js.map +1 -1
- package/dist/es/standards-sdk.es98.js +13 -61
- package/dist/es/standards-sdk.es98.js.map +1 -1
- package/dist/es/standards-sdk.es99.js +7060 -1213
- package/dist/es/standards-sdk.es99.js.map +1 -1
- package/dist/umd/hcs-10/connections-manager.d.ts +4 -2
- package/dist/umd/hcs-10/connections-manager.d.ts.map +1 -1
- package/dist/umd/standards-sdk.umd.js +1 -1
- package/dist/umd/standards-sdk.umd.js.map +1 -1
- package/package.json +1 -1
|
@@ -27,6 +27,7 @@ export interface Connection {
|
|
|
27
27
|
status: 'pending' | 'established' | 'needs_confirmation' | 'closed';
|
|
28
28
|
isPending: boolean;
|
|
29
29
|
needsConfirmation: boolean;
|
|
30
|
+
memo?: string;
|
|
30
31
|
created: Date;
|
|
31
32
|
lastActivity?: Date;
|
|
32
33
|
profileInfo?: AIAgentProfile;
|
|
@@ -50,6 +51,7 @@ export interface ConnectionsManagerOptions {
|
|
|
50
51
|
}
|
|
51
52
|
/**
|
|
52
53
|
* Defines the interface for a connections manager that handles HCS-10 connections
|
|
54
|
+
* This interface represents the public API of ConnectionsManager
|
|
53
55
|
*/
|
|
54
56
|
export interface IConnectionsManager {
|
|
55
57
|
/**
|
|
@@ -83,7 +85,7 @@ export interface IConnectionsManager {
|
|
|
83
85
|
* @param accountId - The account ID to add profile info for
|
|
84
86
|
* @param profile - The profile information
|
|
85
87
|
*/
|
|
86
|
-
addProfileInfo(accountId: string, profile:
|
|
88
|
+
addProfileInfo(accountId: string, profile: AIAgentProfile): void;
|
|
87
89
|
/**
|
|
88
90
|
* Gets all connections
|
|
89
91
|
* @returns Array of all connections that should be visible
|
|
@@ -229,7 +231,7 @@ export declare class ConnectionsManager implements IConnectionsManager {
|
|
|
229
231
|
* @param accountId - The account ID to add profile info for
|
|
230
232
|
* @param profile - The profile information
|
|
231
233
|
*/
|
|
232
|
-
addProfileInfo(accountId: string, profile:
|
|
234
|
+
addProfileInfo(accountId: string, profile: AIAgentProfile): void;
|
|
233
235
|
/**
|
|
234
236
|
* Gets all connections
|
|
235
237
|
* @returns Array of all connections that should be visible
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connections-manager.d.ts","sourceRoot":"","sources":["../../../src/hcs-10/connections-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,oBAAoB,GAAG,QAAQ,CAAC;IACpE,SAAS,EAAE,OAAO,CAAC;IACnB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,OAAO,EAAE,IAAI,CAAC;IACd,YAAY,CAAC,EAAE,IAAI,CAAC;IACpB,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC/C,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;IACnC,UAAU,EAAE,eAAe,CAAC;CAC7B;AAED
|
|
1
|
+
{"version":3,"file":"connections-manager.d.ts","sourceRoot":"","sources":["../../../src/hcs-10/connections-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -60,7 +60,7 @@ class ConnectionsManager {
|
|
|
60
60
|
);
|
|
61
61
|
await this.checkTargetInboundTopicsForConfirmations();
|
|
62
62
|
await this.checkOutboundRequestsForConfirmations();
|
|
63
|
-
await this.fetchProfilesForConnections(
|
|
63
|
+
await this.fetchProfilesForConnections();
|
|
64
64
|
await this.fetchConnectionActivity();
|
|
65
65
|
return this.getAllConnections();
|
|
66
66
|
} catch (error) {
|
|
@@ -143,7 +143,8 @@ class ConnectionsManager {
|
|
|
143
143
|
connectionRequestId: requestId,
|
|
144
144
|
uniqueRequestKey: conn.uniqueRequestKey,
|
|
145
145
|
originTopicId: conn.originTopicId,
|
|
146
|
-
processed: conn.processed
|
|
146
|
+
processed: conn.processed,
|
|
147
|
+
memo: conn.memo
|
|
147
148
|
};
|
|
148
149
|
this.connections.set(connectionTopicId, newConnection);
|
|
149
150
|
if (pendingKey) {
|
|
@@ -284,7 +285,7 @@ class ConnectionsManager {
|
|
|
284
285
|
* Fetches profiles for all connected accounts
|
|
285
286
|
* @param accountId - The account ID making the request
|
|
286
287
|
*/
|
|
287
|
-
async fetchProfilesForConnections(
|
|
288
|
+
async fetchProfilesForConnections() {
|
|
288
289
|
const targetAccountIds = /* @__PURE__ */ new Set();
|
|
289
290
|
for (const connection of this.connections.values()) {
|
|
290
291
|
if (connection.targetAccountId && !this.profileCache.has(connection.targetAccountId)) {
|
|
@@ -431,7 +432,8 @@ class ConnectionsManager {
|
|
|
431
432
|
connectionRequestId: requestId,
|
|
432
433
|
uniqueRequestKey: pendingKey,
|
|
433
434
|
originTopicId: msg.outbound_topic_id || "",
|
|
434
|
-
processed: false
|
|
435
|
+
processed: false,
|
|
436
|
+
memo: msg.m
|
|
435
437
|
};
|
|
436
438
|
this.connections.set(pendingKey, pendingConnection);
|
|
437
439
|
}
|
|
@@ -473,7 +475,8 @@ class ConnectionsManager {
|
|
|
473
475
|
requesterOutboundTopicId: msg.outbound_topic_id,
|
|
474
476
|
uniqueRequestKey: pendingKey,
|
|
475
477
|
originTopicId: msg.outbound_topic_id || "",
|
|
476
|
-
processed: false
|
|
478
|
+
processed: false,
|
|
479
|
+
memo: msg.m
|
|
477
480
|
});
|
|
478
481
|
} else {
|
|
479
482
|
const conn = this.connections.get(connectionTopicId);
|
|
@@ -487,7 +490,8 @@ class ConnectionsManager {
|
|
|
487
490
|
requesterOutboundTopicId: msg.outbound_topic_id,
|
|
488
491
|
uniqueRequestKey: pendingKey,
|
|
489
492
|
originTopicId: msg.outbound_topic_id || "",
|
|
490
|
-
processed: false
|
|
493
|
+
processed: false,
|
|
494
|
+
memo: msg.m
|
|
491
495
|
});
|
|
492
496
|
}
|
|
493
497
|
}
|
|
@@ -512,7 +516,8 @@ class ConnectionsManager {
|
|
|
512
516
|
closeMethod: msg.close_method,
|
|
513
517
|
uniqueRequestKey: uniqueKey,
|
|
514
518
|
originTopicId: conn.originTopicId,
|
|
515
|
-
processed: false
|
|
519
|
+
processed: false,
|
|
520
|
+
memo: msg.m
|
|
516
521
|
});
|
|
517
522
|
}
|
|
518
523
|
}
|
|
@@ -556,7 +561,8 @@ class ConnectionsManager {
|
|
|
556
561
|
inboundRequestId: sequenceNumber,
|
|
557
562
|
uniqueRequestKey: needsConfirmKey,
|
|
558
563
|
originTopicId: requestorTopicId,
|
|
559
|
-
processed: false
|
|
564
|
+
processed: false,
|
|
565
|
+
memo: msg.m
|
|
560
566
|
});
|
|
561
567
|
}
|
|
562
568
|
}
|
|
@@ -589,7 +595,8 @@ class ConnectionsManager {
|
|
|
589
595
|
inboundRequestId: sequenceNumber,
|
|
590
596
|
uniqueRequestKey: needsConfirmKey,
|
|
591
597
|
originTopicId: msg.connection_topic_id,
|
|
592
|
-
processed: false
|
|
598
|
+
processed: false,
|
|
599
|
+
memo: msg.m
|
|
593
600
|
});
|
|
594
601
|
} else {
|
|
595
602
|
const conn = this.connections.get(connectionTopicId);
|
|
@@ -601,7 +608,8 @@ class ConnectionsManager {
|
|
|
601
608
|
inboundRequestId: sequenceNumber,
|
|
602
609
|
uniqueRequestKey: needsConfirmKey,
|
|
603
610
|
originTopicId: msg.connection_topic_id,
|
|
604
|
-
processed: false
|
|
611
|
+
processed: false,
|
|
612
|
+
memo: msg.m
|
|
605
613
|
});
|
|
606
614
|
}
|
|
607
615
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es10.js","sources":["../../src/hcs-10/connections-manager.ts"],"sourcesContent":["import { Logger, LoggerOptions } from '../utils/logger';\nimport { HCSMessage, HCS10BaseClient } from './base-client';\nimport { AIAgentProfile } from '../hcs-11';\n\n/**\n * Represents a connection request between agents\n */\nexport interface ConnectionRequest {\n id: number;\n requesterId: string;\n requesterTopicId: string;\n targetAccountId: string;\n targetTopicId: string;\n operatorId: string;\n sequenceNumber: number;\n created: Date;\n memo?: string;\n status: 'pending' | 'confirmed' | 'rejected';\n}\n\n/**\n * Represents an active connection between agents\n */\nexport interface Connection {\n connectionTopicId: string;\n targetAccountId: string;\n targetAgentName?: string;\n targetInboundTopicId?: string;\n targetOutboundTopicId?: string;\n status: 'pending' | 'established' | 'needs_confirmation' | 'closed';\n isPending: boolean;\n needsConfirmation: boolean;\n created: Date;\n lastActivity?: Date;\n profileInfo?: AIAgentProfile;\n connectionRequestId?: number;\n confirmedRequestId?: number;\n requesterOutboundTopicId?: string;\n inboundRequestId?: number;\n closedReason?: string;\n closeMethod?: string;\n uniqueRequestKey?: string;\n originTopicId?: string;\n processed: boolean;\n}\n\n/**\n * Options for the connections manager\n */\nexport interface ConnectionsManagerOptions {\n logLevel?: 'debug' | 'info' | 'warn' | 'error';\n filterPendingAccountIds?: string[];\n baseClient: HCS10BaseClient;\n}\n\n/**\n * Defines the interface for a connections manager that handles HCS-10 connections\n */\nexport interface IConnectionsManager {\n /**\n * Fetches and processes connection data using the configured client\n * @param accountId - The account ID to fetch connection data for\n * @returns A promise that resolves to an array of Connection objects\n */\n fetchConnectionData(accountId: string): Promise<Connection[]>;\n\n /**\n * Process outbound messages to track connection requests and confirmations\n * @param messages - The messages to process\n * @param accountId - The account ID that sent the messages\n * @returns Array of connections after processing\n */\n processOutboundMessages(messages: HCSMessage[], accountId: string): Connection[];\n\n /**\n * Process inbound messages to track connection requests and confirmations\n * @param messages - The messages to process\n * @returns Array of connections after processing\n */\n processInboundMessages(messages: HCSMessage[]): Connection[];\n\n /**\n * Process connection topic messages to update last activity time\n * @param connectionTopicId - The topic ID of the connection\n * @param messages - The messages to process\n * @returns The updated connection or undefined if not found\n */\n processConnectionMessages(connectionTopicId: string, messages: HCSMessage[]): Connection | undefined;\n \n /**\n * Adds or updates profile information for a connection\n * @param accountId - The account ID to add profile info for\n * @param profile - The profile information\n */\n addProfileInfo(accountId: string, profile: any): void;\n\n /**\n * Gets all connections\n * @returns Array of all connections that should be visible\n */\n getAllConnections(): Connection[];\n\n /**\n * Gets all pending connection requests\n * @returns Array of pending connection requests\n */\n getPendingRequests(): Connection[];\n\n /**\n * Gets all active (established) connections\n * @returns Array of active connections\n */\n getActiveConnections(): Connection[];\n\n /**\n * Gets all connections needing confirmation\n * @returns Array of connections needing confirmation\n */\n getConnectionsNeedingConfirmation(): Connection[];\n\n /**\n * Gets a connection by its topic ID\n * @param connectionTopicId - The topic ID to look up\n * @returns The connection with the given topic ID, or undefined if not found\n */\n getConnectionByTopicId(connectionTopicId: string): Connection | undefined;\n\n /**\n * Gets a connection by account ID\n * @param accountId - The account ID to look up\n * @returns The connection with the given account ID, or undefined if not found\n */\n getConnectionByAccountId(accountId: string): Connection | undefined;\n\n /**\n * Gets all connections for a specific account ID\n * @param accountId - The account ID to look up\n * @returns Array of connections for the given account ID\n */\n getConnectionsByAccountId(accountId: string): Connection[];\n\n /**\n * Updates or adds a connection\n * @param connection - The connection to update or add\n */\n updateOrAddConnection(connection: Connection): void;\n\n /**\n * Clears all tracked connections and requests\n */\n clearAll(): void;\n\n /**\n * Checks if a given connection request has been processed already\n * This uses a combination of topic ID and request ID to uniquely identify requests\n *\n * @param inboundTopicId - The inbound topic ID where the request was received\n * @param requestId - The sequence number (request ID)\n * @returns True if this specific request has been processed, false otherwise\n */\n isConnectionRequestProcessed(inboundTopicId: string, requestId: number): boolean;\n\n /**\n * Marks a specific connection request as processed\n *\n * @param inboundTopicId - The inbound topic ID where the request was received\n * @param requestId - The sequence number (request ID)\n * @returns True if a matching connection was found and marked, false otherwise\n */\n markConnectionRequestProcessed(inboundTopicId: string, requestId: number): boolean;\n}\n\n/**\n * ConnectionsManager provides a unified way to track and manage HCS-10 connections\n * across different applications. It works with both frontend and backend implementations.\n */\nexport class ConnectionsManager implements IConnectionsManager {\n private logger: Logger;\n private connections: Map<string, Connection> = new Map();\n private pendingRequests: Map<string, ConnectionRequest> = new Map();\n private profileCache: Map<string, AIAgentProfile> = new Map();\n private filterPendingAccountIds: Set<string> = new Set();\n private baseClient: HCS10BaseClient;\n\n /**\n * Creates a new ConnectionsManager instance\n */\n constructor(options: ConnectionsManagerOptions) {\n const loggerOptions: LoggerOptions = {\n module: 'ConnectionsManager',\n level: options?.logLevel || 'info',\n prettyPrint: true,\n };\n this.logger = new Logger(loggerOptions);\n\n if (options?.filterPendingAccountIds) {\n this.filterPendingAccountIds = new Set(options.filterPendingAccountIds);\n }\n\n if (!options.baseClient) {\n throw new Error('ConnectionsManager requires a baseClient to operate');\n }\n\n this.baseClient = options.baseClient;\n }\n\n /**\n * Fetches and processes connection data using the configured client\n * @param accountId - The account ID to fetch connection data for\n * @returns A promise that resolves to an array of Connection objects\n */\n async fetchConnectionData(accountId: string): Promise<Connection[]> {\n try {\n const topicInfo = await this.baseClient.retrieveCommunicationTopics(\n accountId\n );\n\n const isValidTopicId = (topicId: string): boolean => {\n return Boolean(topicId) && !topicId.includes(':');\n };\n\n if (\n !isValidTopicId(topicInfo.inboundTopic) ||\n !isValidTopicId(topicInfo.outboundTopic)\n ) {\n this.logger.warn(\n 'Invalid topic IDs detected in retrieved communication topics'\n );\n return this.getAllConnections();\n }\n\n const [outboundMessagesResult, inboundMessagesResult] = await Promise.all(\n [\n this.baseClient.getMessages(topicInfo.outboundTopic),\n this.baseClient.getMessages(topicInfo.inboundTopic),\n ]\n );\n\n this.processOutboundMessages(\n outboundMessagesResult.messages || [],\n accountId\n );\n this.processInboundMessages(inboundMessagesResult.messages || []);\n\n const pendingCount = Array.from(this.connections.values()).filter(\n (conn) => conn.status === 'pending' || conn.isPending\n ).length;\n this.logger.debug(\n `Processed ${\n outboundMessagesResult.messages?.length || 0\n } outbound and ${\n inboundMessagesResult.messages?.length || 0\n } inbound messages. Found ${pendingCount} pending connections.`\n );\n\n await this.checkTargetInboundTopicsForConfirmations();\n await this.checkOutboundRequestsForConfirmations();\n await this.fetchProfilesForConnections(accountId);\n await this.fetchConnectionActivity();\n\n return this.getAllConnections();\n } catch (error) {\n this.logger.error('Error fetching connection data:', error);\n return this.getAllConnections();\n }\n }\n\n /**\n * Checks target agent inbound topics to find confirmations for pending requests\n * that might not be visible in our local messages\n */\n private async checkTargetInboundTopicsForConfirmations(): Promise<void> {\n const pendingConnections = Array.from(this.connections.values()).filter(\n (conn) =>\n (conn.isPending || conn.status === 'pending') &&\n conn.targetInboundTopicId\n );\n\n if (pendingConnections.length === 0) {\n return;\n }\n\n const pendingRequestsByTarget = new Map<string, Connection[]>();\n\n pendingConnections.forEach((conn) => {\n if (conn.targetInboundTopicId) {\n const requests =\n pendingRequestsByTarget.get(conn.targetInboundTopicId) || [];\n requests.push(conn);\n pendingRequestsByTarget.set(conn.targetInboundTopicId, requests);\n }\n });\n\n const MAX_FETCH_ATTEMPTS = 2;\n const FETCH_DELAY_MS = 500;\n\n for (const [\n targetInboundTopicId,\n requests,\n ] of pendingRequestsByTarget.entries()) {\n for (let attempt = 1; attempt <= MAX_FETCH_ATTEMPTS; attempt++) {\n try {\n const targetMessagesResult = await this.baseClient.getMessages(\n targetInboundTopicId\n );\n const targetMessages = targetMessagesResult.messages || [];\n\n let confirmedAny = false;\n\n for (const conn of requests) {\n const requestId = conn.connectionRequestId;\n if (!requestId) {\n continue;\n }\n\n const confirmationMsg = targetMessages.find((msg) => {\n if (msg.op !== 'connection_created' || !msg.connection_topic_id) {\n return false;\n }\n\n if (msg.connection_id !== requestId) {\n return false;\n }\n\n if (conn.uniqueRequestKey) {\n const keyParts = conn.uniqueRequestKey.split(':');\n if (keyParts.length > 1) {\n const operatorIdPart = keyParts[1];\n\n if (msg.operator_id && msg.operator_id === operatorIdPart) {\n return true;\n }\n\n if (msg.connected_account_id === conn.targetAccountId) {\n return true;\n }\n }\n }\n\n return true;\n });\n\n if (confirmationMsg?.connection_topic_id) {\n confirmedAny = true;\n\n const connectionTopicId = confirmationMsg.connection_topic_id;\n\n let pendingKey = conn.uniqueRequestKey;\n\n const newConnection: Connection = {\n connectionTopicId,\n targetAccountId: conn.targetAccountId,\n targetAgentName: conn.targetAgentName,\n targetInboundTopicId: conn.targetInboundTopicId,\n status: 'established',\n isPending: false,\n needsConfirmation: false,\n created: new Date(confirmationMsg.created || conn.created),\n profileInfo: conn.profileInfo,\n connectionRequestId: requestId,\n uniqueRequestKey: conn.uniqueRequestKey,\n originTopicId: conn.originTopicId,\n processed: conn.processed,\n };\n\n this.connections.set(connectionTopicId, newConnection);\n\n if (pendingKey) {\n this.connections.delete(pendingKey);\n }\n\n this.logger.debug(\n `Confirmed connection in target inbound topic: ${connectionTopicId}`\n );\n }\n }\n\n if (confirmedAny || attempt === MAX_FETCH_ATTEMPTS) {\n break;\n }\n\n await new Promise((resolve) => setTimeout(resolve, FETCH_DELAY_MS));\n } catch (error) {\n this.logger.debug(\n `Error fetching target inbound topic ${targetInboundTopicId}:`,\n error\n );\n if (attempt === MAX_FETCH_ATTEMPTS) {\n break;\n }\n await new Promise((resolve) => setTimeout(resolve, FETCH_DELAY_MS));\n }\n }\n }\n }\n\n /**\n * Checks target agents' inbound topics for confirmations of our outbound connection requests\n * This complements checkTargetInboundTopicsForConfirmations by looking for confirmations\n * that might have been sent to the target agent's inbound topic rather than our own\n */\n private async checkOutboundRequestsForConfirmations(): Promise<void> {\n const allConnections = Array.from(this.connections.values());\n this.logger.info(`Total connections in map: ${allConnections.length}`);\n\n const pendingByStatus = allConnections.filter(\n (conn) => conn.status === 'pending'\n );\n this.logger.info(\n `Connections with status='pending': ${pendingByStatus.length}`\n );\n\n const pendingConnections = allConnections.filter(\n (conn) => conn.status === 'pending'\n );\n\n if (!Boolean(pendingConnections?.length)) {\n this.logger.info('No pending connections found');\n return;\n }\n\n for (const conn of pendingConnections) {\n this.logger.debug(\n `Processing pending connection: ${conn.connectionTopicId}`\n );\n\n if (!conn.targetAccountId) {\n this.logger.debug(\n `Skipping connection ${conn.connectionTopicId} - no targetAccountId`\n );\n continue;\n }\n\n let targetInboundTopicId = conn.targetInboundTopicId;\n if (!targetInboundTopicId) {\n try {\n const profileResponse = await this.baseClient.retrieveProfile(\n conn.targetAccountId\n );\n if (profileResponse?.profile?.inboundTopicId) {\n targetInboundTopicId = profileResponse.profile.inboundTopicId;\n this.connections.set(conn.connectionTopicId, {\n ...conn,\n targetInboundTopicId,\n });\n this.logger.debug(\n `Updated connection ${conn.connectionTopicId} with inbound topic ID: ${targetInboundTopicId}`\n );\n } else {\n this.logger.debug(\n `Couldn't get inbound topic ID for account ${conn.targetAccountId}`\n );\n continue;\n }\n } catch (error) {\n this.logger.debug(\n `Error fetching profile for ${conn.targetAccountId}: ${error}`\n );\n continue;\n }\n }\n\n if (!targetInboundTopicId || targetInboundTopicId.includes(':')) {\n this.logger.debug(\n `Skipping invalid inbound topic format: ${targetInboundTopicId}`\n );\n continue;\n }\n\n const requestId = conn.connectionRequestId || conn.inboundRequestId;\n if (!requestId) {\n this.logger.debug(\n `Skipping connection ${conn.connectionTopicId} - no request ID`\n );\n continue;\n }\n\n try {\n this.logger.debug(\n `Checking for confirmations on topic ${targetInboundTopicId} for request ID ${requestId}`\n );\n const targetMessagesResult = await this.baseClient.getMessages(\n targetInboundTopicId\n );\n const targetMessages = targetMessagesResult.messages || [];\n\n const confirmationMsg = targetMessages.find(\n (msg) =>\n msg.op === 'connection_created' &&\n msg.connection_id === requestId &&\n msg.connection_topic_id\n );\n\n if (confirmationMsg?.connection_topic_id) {\n const connectionTopicId = confirmationMsg.connection_topic_id;\n this.logger.info(\n `Found confirmation for request #${requestId} to ${conn.targetAccountId} on their inbound topic`\n );\n\n this.connections.set(conn.connectionTopicId, {\n ...conn,\n connectionTopicId,\n status: 'established',\n isPending: false,\n needsConfirmation: false,\n created: new Date(confirmationMsg.created || conn.created),\n lastActivity: new Date(confirmationMsg.created || conn.created),\n });\n } else {\n this.logger.debug(\n `No confirmation found for request ID ${requestId} on topic ${targetInboundTopicId}`\n );\n }\n } catch (error) {\n this.logger.warn(\n `Error checking for confirmations on target inbound topic for ${conn.targetAccountId}: ${error}`\n );\n }\n }\n }\n\n /**\n * Fetches profiles for all connected accounts\n * @param accountId - The account ID making the request\n */\n private async fetchProfilesForConnections(accountId: string): Promise<void> {\n const targetAccountIds = new Set<string>();\n\n for (const connection of this.connections.values()) {\n if (\n connection.targetAccountId &&\n !this.profileCache.has(connection.targetAccountId)\n ) {\n targetAccountIds.add(connection.targetAccountId);\n }\n }\n\n const accountIdPromises = Array.from(targetAccountIds).map(\n async (targetId) => {\n try {\n const profileResponse = await this.baseClient.retrieveProfile(\n targetId\n );\n if (profileResponse.success && profileResponse.profile) {\n this.addProfileInfo(targetId, profileResponse.profile);\n\n this.updatePendingConnectionsWithProfileInfo(\n targetId,\n profileResponse.profile\n );\n }\n } catch (error) {\n this.logger.debug(`Failed to fetch profile for ${targetId}:`, error);\n }\n }\n );\n\n await Promise.allSettled(accountIdPromises);\n }\n\n /**\n * Updates pending connections with inbound topic IDs from profile info\n * @param accountId - The account ID to update connections for\n * @param profile - The profile containing the inbound topic ID\n */\n private updatePendingConnectionsWithProfileInfo(\n accountId: string,\n profile: AIAgentProfile\n ): void {\n const pendingConnections = Array.from(this.connections.values()).filter(\n (conn) =>\n conn.targetAccountId === accountId &&\n (conn.isPending || conn.needsConfirmation) &&\n !conn.targetInboundTopicId\n );\n\n if (pendingConnections.length > 0 && profile.inboundTopicId) {\n for (const conn of pendingConnections) {\n const updatedConn = {\n ...conn,\n targetInboundTopicId: profile.inboundTopicId,\n };\n this.connections.set(conn.connectionTopicId, updatedConn);\n }\n }\n }\n\n /**\n * Fetches activity from active connection topics\n * Updates the lastActivity timestamp for each connection based on latest messages\n * @returns Promise that resolves when all activity has been fetched\n */\n private async fetchConnectionActivity(): Promise<void> {\n const activeConnections = this.getActiveConnections();\n\n const validConnections = activeConnections.filter((connection) => {\n const topicId = connection.connectionTopicId;\n\n if (!topicId || topicId.includes(':') || !topicId.match(/^0\\.0\\.\\d+$/)) {\n this.logger.debug(\n `Skipping activity fetch for invalid topic ID format: ${topicId}`\n );\n return false;\n }\n return true;\n });\n\n const activityPromises = validConnections.map(async (connection) => {\n try {\n const topicId = connection.connectionTopicId;\n const messagesResult = await this.baseClient.getMessages(topicId);\n\n if (messagesResult?.messages?.length > 0) {\n this.processConnectionMessages(topicId, messagesResult.messages);\n }\n } catch (error) {\n this.logger.debug(\n `Failed to fetch activity for ${connection.connectionTopicId}:`,\n error\n );\n }\n });\n\n await Promise.allSettled(activityPromises);\n }\n\n /**\n * Checks if an account should be filtered, taking into account existing established connections\n * @param accountId - The account ID to check\n * @returns True if the account should be filtered, false otherwise\n */\n private shouldFilterAccount(accountId: string): boolean {\n if (!this.filterPendingAccountIds.has(accountId)) {\n return false;\n }\n\n if (this.hasEstablishedConnectionWithAccount(accountId)) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Process outbound messages to track connection requests and confirmations\n * @param messages - The messages to process\n * @param accountId - The account ID that sent the messages\n * @returns Array of connections after processing\n */\n processOutboundMessages(\n messages: HCSMessage[],\n accountId: string\n ): Connection[] {\n if (!Boolean(messages?.length)) {\n return Array.from(this.connections.values());\n }\n\n const requestMessages = messages.filter(\n (msg) => msg.op === 'connection_request' && msg.connection_request_id\n );\n\n for (const msg of requestMessages) {\n const requestId = msg.connection_request_id!;\n const operatorId = msg.operator_id || '';\n const targetAccountId =\n this.baseClient.extractAccountFromOperatorId(operatorId);\n const targetInboundTopicId =\n this.baseClient.extractTopicFromOperatorId(operatorId);\n\n if (this.shouldFilterAccount(targetAccountId)) {\n this.logger.debug(\n `Filtering out outbound request to account: ${targetAccountId}`\n );\n continue;\n }\n\n const isAlreadyConfirmed = Array.from(this.connections.values()).some(\n (conn) =>\n conn.connectionRequestId === requestId &&\n !conn.isPending &&\n conn.targetAccountId === targetAccountId\n );\n\n const pendingKey = `req-${requestId}:${operatorId}`;\n\n if (!isAlreadyConfirmed && !this.pendingRequests.has(pendingKey)) {\n const pendingRequest = {\n id: requestId,\n requesterId: accountId,\n requesterTopicId: msg.outbound_topic_id || '',\n targetAccountId,\n targetTopicId: targetInboundTopicId,\n operatorId,\n sequenceNumber: msg.sequence_number,\n created: msg.created || new Date(),\n memo: msg.m,\n status: 'pending' as 'pending' | 'confirmed' | 'rejected',\n };\n\n this.pendingRequests.set(pendingKey, pendingRequest);\n\n if (!this.connections.has(pendingKey)) {\n const pendingConnection = {\n connectionTopicId: pendingKey,\n targetAccountId,\n targetInboundTopicId,\n status: 'pending' as\n | 'pending'\n | 'established'\n | 'needs_confirmation'\n | 'closed',\n isPending: true,\n needsConfirmation: false,\n created: msg.created || new Date(),\n connectionRequestId: requestId,\n uniqueRequestKey: pendingKey,\n originTopicId: msg.outbound_topic_id || '',\n processed: false,\n };\n\n this.connections.set(pendingKey, pendingConnection);\n }\n }\n }\n\n const confirmationMessages = messages.filter(\n (msg) =>\n msg.op === 'connection_created' &&\n msg.connection_topic_id &&\n msg.connection_request_id\n );\n\n for (const msg of confirmationMessages) {\n const requestId = msg.connection_request_id!;\n const connectionTopicId = msg.connection_topic_id!;\n const targetAccountId = this.baseClient.extractAccountFromOperatorId(\n msg.operator_id || ''\n );\n\n if (this.shouldFilterAccount(targetAccountId)) {\n this.logger.debug(\n `Filtering out outbound confirmation to account: ${targetAccountId}`\n );\n continue;\n }\n\n const pendingKey = `req-${requestId}:${msg.operator_id}`;\n\n const pendingRequest = this.pendingRequests.get(pendingKey);\n if (pendingRequest) {\n pendingRequest.status = 'confirmed';\n }\n\n if (this.connections.has(pendingKey)) {\n this.connections.delete(pendingKey);\n }\n\n if (!this.connections.has(connectionTopicId)) {\n this.connections.set(connectionTopicId, {\n connectionTopicId,\n targetAccountId,\n status: 'established',\n isPending: false,\n needsConfirmation: false,\n created: msg.created || new Date(),\n connectionRequestId: requestId,\n confirmedRequestId: msg.confirmed_request_id,\n requesterOutboundTopicId: msg.outbound_topic_id,\n uniqueRequestKey: pendingKey,\n originTopicId: msg.outbound_topic_id || '',\n processed: false,\n });\n } else {\n const conn = this.connections.get(connectionTopicId)!;\n this.connections.set(connectionTopicId, {\n ...conn,\n status: 'established',\n isPending: false,\n needsConfirmation: false,\n connectionRequestId: requestId,\n confirmedRequestId: msg.confirmed_request_id,\n requesterOutboundTopicId: msg.outbound_topic_id,\n uniqueRequestKey: pendingKey,\n originTopicId: msg.outbound_topic_id || '',\n processed: false,\n });\n }\n }\n\n const closedMessages = messages.filter(\n (msg) =>\n (msg.op as string) === 'connection_closed' ||\n (msg.op === 'close_connection' && msg.connection_topic_id)\n );\n\n for (const msg of closedMessages) {\n const connectionTopicId = msg.connection_topic_id!;\n\n if (this.connections.has(connectionTopicId)) {\n const conn = this.connections.get(connectionTopicId)!;\n if (\n this.shouldFilterAccount(conn.targetAccountId) &&\n conn.status !== 'established'\n ) {\n continue;\n }\n\n const uniqueKey =\n msg.connection_request_id && msg.operator_id\n ? `req-${msg.connection_request_id}:${msg.operator_id}`\n : undefined;\n\n this.connections.set(connectionTopicId, {\n ...conn,\n status: 'closed',\n isPending: false,\n needsConfirmation: false,\n lastActivity: msg.created || new Date(),\n closedReason: msg.reason,\n closeMethod: msg.close_method,\n uniqueRequestKey: uniqueKey,\n originTopicId: conn.originTopicId,\n processed: false,\n });\n }\n }\n\n return Array.from(this.connections.values()).filter(\n (conn) =>\n conn.status === 'established' ||\n conn.status === 'closed' ||\n !this.filterPendingAccountIds.has(conn.targetAccountId)\n );\n }\n\n /**\n * Process inbound messages to track connection requests and confirmations\n * @param messages - The messages to process\n * @returns Array of connections after processing\n */\n processInboundMessages(messages: HCSMessage[]): Connection[] {\n if (!Boolean(messages?.length)) {\n return Array.from(this.connections.values());\n }\n\n const requestMessages = messages.filter(\n (msg) => msg.op === 'connection_request' && msg.sequence_number\n );\n\n for (const msg of requestMessages) {\n const sequenceNumber = msg.sequence_number;\n const operatorId = msg.operator_id || '';\n const requestorAccountId =\n this.baseClient.extractAccountFromOperatorId(operatorId);\n const requestorTopicId =\n this.baseClient.extractTopicFromOperatorId(operatorId);\n\n if (this.shouldFilterAccount(requestorAccountId)) {\n this.logger.debug(\n `Filtering out request from account: ${requestorAccountId}`\n );\n continue;\n }\n\n const needsConfirmKey = `inb-${sequenceNumber}:${operatorId}`;\n\n if (!this.connections.has(needsConfirmKey)) {\n this.connections.set(needsConfirmKey, {\n connectionTopicId: needsConfirmKey,\n targetAccountId: requestorAccountId,\n targetInboundTopicId: requestorTopicId,\n status: 'needs_confirmation',\n isPending: false,\n needsConfirmation: true,\n created: msg.created || new Date(),\n inboundRequestId: sequenceNumber,\n uniqueRequestKey: needsConfirmKey,\n originTopicId: requestorTopicId,\n processed: false,\n });\n }\n }\n\n const confirmationMessages = messages.filter(\n (msg) =>\n msg.op === 'connection_created' &&\n msg.connection_topic_id &&\n msg.connection_id\n );\n\n for (const msg of confirmationMessages) {\n const sequenceNumber = msg.connection_id!;\n const connectionTopicId = msg.connection_topic_id!;\n const connectedAccountId = msg.connected_account_id || '';\n const operatorId = msg.operator_id || '';\n\n if (this.shouldFilterAccount(connectedAccountId)) {\n this.logger.debug(\n `Filtering out confirmation for account: ${connectedAccountId}`\n );\n continue;\n }\n\n const needsConfirmKey = `inb-${sequenceNumber}:${operatorId}`;\n\n if (this.connections.has(needsConfirmKey)) {\n this.connections.delete(needsConfirmKey);\n }\n\n if (!this.connections.has(connectionTopicId)) {\n this.connections.set(connectionTopicId, {\n connectionTopicId,\n targetAccountId: connectedAccountId,\n status: 'established',\n isPending: false,\n needsConfirmation: false,\n created: msg.created || new Date(),\n inboundRequestId: sequenceNumber,\n uniqueRequestKey: needsConfirmKey,\n originTopicId: msg.connection_topic_id,\n processed: false,\n });\n } else {\n const conn = this.connections.get(connectionTopicId)!;\n this.connections.set(connectionTopicId, {\n ...conn,\n status: 'established',\n isPending: false,\n needsConfirmation: false,\n inboundRequestId: sequenceNumber,\n uniqueRequestKey: needsConfirmKey,\n originTopicId: msg.connection_topic_id,\n processed: false,\n });\n }\n }\n\n return Array.from(this.connections.values()).filter(\n (conn) =>\n conn.status === 'established' ||\n conn.status === 'closed' ||\n !this.filterPendingAccountIds.has(conn.targetAccountId)\n );\n }\n\n /**\n * Process connection topic messages to update last activity time\n * @param connectionTopicId - The topic ID of the connection\n * @param messages - The messages to process\n * @returns The updated connection or undefined if not found\n */\n processConnectionMessages(\n connectionTopicId: string,\n messages: HCSMessage[]\n ): Connection | undefined {\n if (\n !messages ||\n messages.length === 0 ||\n !this.connections.has(connectionTopicId)\n ) {\n return this.connections.get(connectionTopicId);\n }\n\n const latestMessage = messages\n .filter((m) => m.created)\n .sort((a, b) => {\n const dateA = a.created ? new Date(a.created).getTime() : 0;\n const dateB = b.created ? new Date(b.created).getTime() : 0;\n return dateB - dateA;\n })[0];\n\n if (latestMessage?.created) {\n const conn = this.connections.get(connectionTopicId)!;\n this.connections.set(connectionTopicId, {\n ...conn,\n lastActivity: latestMessage.created,\n });\n }\n\n const closeMessage = messages.find((msg) => msg.op === 'close_connection');\n if (closeMessage) {\n const conn = this.connections.get(connectionTopicId)!;\n this.connections.set(connectionTopicId, {\n ...conn,\n status: 'closed',\n lastActivity: closeMessage.created || new Date(),\n closedReason: closeMessage.reason,\n closeMethod: 'explicit',\n });\n }\n\n return this.connections.get(connectionTopicId);\n }\n\n /**\n * Adds or updates profile information for a connection\n * @param accountId - The account ID to add profile info for\n * @param profile - The profile information\n */\n addProfileInfo(accountId: string, profile: any): void {\n this.profileCache.set(accountId, profile);\n\n const matchingConnections = Array.from(this.connections.values()).filter(\n (conn) => conn.targetAccountId === accountId\n );\n\n for (const conn of matchingConnections) {\n this.connections.set(conn.connectionTopicId, {\n ...conn,\n profileInfo: profile,\n targetAgentName: profile.display_name,\n targetInboundTopicId: profile.inboundTopicId,\n targetOutboundTopicId: profile.outboundTopicId,\n });\n }\n }\n\n /**\n * Gets all connections\n * @returns Array of all connections that should be visible\n */\n getAllConnections(): Connection[] {\n const connections = Array.from(this.connections.values()).filter(\n (conn) =>\n conn.status === 'established' ||\n conn.status === 'closed' ||\n !this.filterPendingAccountIds.has(conn.targetAccountId) ||\n this.hasEstablishedConnectionWithAccount(conn.targetAccountId)\n );\n return connections;\n }\n\n /**\n * Gets all pending connection requests\n * @returns Array of pending connection requests\n */\n getPendingRequests(): Connection[] {\n const pendingConnections = Array.from(this.connections.values()).filter(\n (conn) => {\n return (\n conn.isPending &&\n (!this.filterPendingAccountIds.has(conn.targetAccountId) ||\n this.hasEstablishedConnectionWithAccount(conn.targetAccountId))\n );\n }\n );\n\n return pendingConnections;\n }\n\n /**\n * Helper method to check if there's an established connection with an account\n * @param accountId - The account ID to check\n * @returns True if there's an established connection, false otherwise\n */\n private hasEstablishedConnectionWithAccount(accountId: string): boolean {\n return Array.from(this.connections.values()).some(\n (conn) =>\n conn.targetAccountId === accountId && conn.status === 'established'\n );\n }\n\n /**\n * Gets all active (established) connections\n * @returns Array of active connections\n */\n getActiveConnections(): Connection[] {\n return Array.from(this.connections.values()).filter(\n (conn) => conn.status === 'established'\n );\n }\n\n /**\n * Gets all connections needing confirmation\n * @returns Array of connections needing confirmation\n */\n getConnectionsNeedingConfirmation(): Connection[] {\n return Array.from(this.connections.values()).filter(\n (conn) =>\n conn.needsConfirmation &&\n (!this.filterPendingAccountIds.has(conn.targetAccountId) ||\n this.hasEstablishedConnectionWithAccount(conn.targetAccountId))\n );\n }\n\n /**\n * Gets a connection by its topic ID\n * @param connectionTopicId - The topic ID to look up\n * @returns The connection with the given topic ID, or undefined if not found\n */\n getConnectionByTopicId(connectionTopicId: string): Connection | undefined {\n return this.connections.get(connectionTopicId);\n }\n\n /**\n * Gets a connection by account ID\n * @param accountId - The account ID to look up\n * @returns The connection with the given account ID, or undefined if not found\n */\n getConnectionByAccountId(accountId: string): Connection | undefined {\n return Array.from(this.connections.values()).find(\n (conn) =>\n conn.targetAccountId === accountId && conn.status === 'established'\n );\n }\n\n /**\n * Gets all connections for a specific account ID\n * @param accountId - The account ID to look up\n * @returns Array of connections for the given account ID\n */\n getConnectionsByAccountId(accountId: string): Connection[] {\n return Array.from(this.connections.values()).filter(\n (conn) => conn.targetAccountId === accountId\n );\n }\n\n /**\n * Updates or adds a connection\n * @param connection - The connection to update or add\n */\n updateOrAddConnection(connection: Connection): void {\n this.connections.set(connection.connectionTopicId, connection);\n }\n\n /**\n * Clears all tracked connections and requests\n */\n clearAll(): void {\n this.connections.clear();\n this.pendingRequests.clear();\n }\n\n /**\n * Checks if a given connection request has been processed already\n * This uses a combination of topic ID and request ID to uniquely identify requests\n *\n * @param inboundTopicId - The inbound topic ID where the request was received\n * @param requestId - The sequence number (request ID)\n * @returns True if this specific request has been processed, false otherwise\n */\n isConnectionRequestProcessed(\n inboundTopicId: string,\n requestId: number\n ): boolean {\n for (const conn of this.connections.values()) {\n if (\n conn.originTopicId === inboundTopicId &&\n conn.inboundRequestId === requestId &&\n conn.processed\n ) {\n return true;\n }\n\n if (\n conn.originTopicId === inboundTopicId &&\n conn.connectionRequestId === requestId &&\n conn.processed\n ) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Marks a specific connection request as processed\n *\n * @param inboundTopicId - The inbound topic ID where the request was received\n * @param requestId - The sequence number (request ID)\n * @returns True if a matching connection was found and marked, false otherwise\n */\n markConnectionRequestProcessed(\n inboundTopicId: string,\n requestId: number\n ): boolean {\n let found = false;\n\n for (const [key, conn] of this.connections.entries()) {\n if (\n conn.originTopicId === inboundTopicId &&\n conn.inboundRequestId === requestId\n ) {\n this.connections.set(key, {\n ...conn,\n processed: true,\n });\n found = true;\n this.logger.debug(\n `Marked inbound connection request #${requestId} on topic ${inboundTopicId} as processed`\n );\n }\n\n if (\n conn.originTopicId === inboundTopicId &&\n conn.connectionRequestId === requestId\n ) {\n this.connections.set(key, {\n ...conn,\n processed: true,\n });\n found = true;\n this.logger.debug(\n `Marked outbound connection request #${requestId} on topic ${inboundTopicId} as processed`\n );\n }\n }\n\n return found;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"standards-sdk.es10.js","sources":["../../src/hcs-10/connections-manager.ts"],"sourcesContent":["import { Logger, LoggerOptions } from '../utils/logger';\nimport { HCSMessage, HCS10BaseClient } from './base-client';\nimport { AIAgentProfile } from '../hcs-11';\n\n/**\n * Represents a connection request between agents\n */\nexport interface ConnectionRequest {\n id: number;\n requesterId: string;\n requesterTopicId: string;\n targetAccountId: string;\n targetTopicId: string;\n operatorId: string;\n sequenceNumber: number;\n created: Date;\n memo?: string;\n status: 'pending' | 'confirmed' | 'rejected';\n}\n\n/**\n * Represents an active connection between agents\n */\nexport interface Connection {\n connectionTopicId: string;\n targetAccountId: string;\n targetAgentName?: string;\n targetInboundTopicId?: string;\n targetOutboundTopicId?: string;\n status: 'pending' | 'established' | 'needs_confirmation' | 'closed';\n isPending: boolean;\n needsConfirmation: boolean;\n memo?: string;\n created: Date;\n lastActivity?: Date;\n profileInfo?: AIAgentProfile;\n connectionRequestId?: number;\n confirmedRequestId?: number;\n requesterOutboundTopicId?: string;\n inboundRequestId?: number;\n closedReason?: string;\n closeMethod?: string;\n uniqueRequestKey?: string;\n originTopicId?: string;\n processed: boolean;\n}\n\n/**\n * Options for the connections manager\n */\nexport interface ConnectionsManagerOptions {\n logLevel?: 'debug' | 'info' | 'warn' | 'error';\n filterPendingAccountIds?: string[];\n baseClient: HCS10BaseClient;\n}\n\n/**\n * Defines the interface for a connections manager that handles HCS-10 connections\n * This interface represents the public API of ConnectionsManager\n */\nexport interface IConnectionsManager {\n /**\n * Fetches and processes connection data using the configured client\n * @param accountId - The account ID to fetch connection data for\n * @returns A promise that resolves to an array of Connection objects\n */\n fetchConnectionData(accountId: string): Promise<Connection[]>;\n\n /**\n * Process outbound messages to track connection requests and confirmations\n * @param messages - The messages to process\n * @param accountId - The account ID that sent the messages\n * @returns Array of connections after processing\n */\n processOutboundMessages(\n messages: HCSMessage[],\n accountId: string\n ): Connection[];\n\n /**\n * Process inbound messages to track connection requests and confirmations\n * @param messages - The messages to process\n * @returns Array of connections after processing\n */\n processInboundMessages(messages: HCSMessage[]): Connection[];\n\n /**\n * Process connection topic messages to update last activity time\n * @param connectionTopicId - The topic ID of the connection\n * @param messages - The messages to process\n * @returns The updated connection or undefined if not found\n */\n processConnectionMessages(\n connectionTopicId: string,\n messages: HCSMessage[]\n ): Connection | undefined;\n\n /**\n * Adds or updates profile information for a connection\n * @param accountId - The account ID to add profile info for\n * @param profile - The profile information\n */\n addProfileInfo(accountId: string, profile: AIAgentProfile): void;\n\n /**\n * Gets all connections\n * @returns Array of all connections that should be visible\n */\n getAllConnections(): Connection[];\n\n /**\n * Gets all pending connection requests\n * @returns Array of pending connection requests\n */\n getPendingRequests(): Connection[];\n\n /**\n * Gets all active (established) connections\n * @returns Array of active connections\n */\n getActiveConnections(): Connection[];\n\n /**\n * Gets all connections needing confirmation\n * @returns Array of connections needing confirmation\n */\n getConnectionsNeedingConfirmation(): Connection[];\n\n /**\n * Gets a connection by its topic ID\n * @param connectionTopicId - The topic ID to look up\n * @returns The connection with the given topic ID, or undefined if not found\n */\n getConnectionByTopicId(connectionTopicId: string): Connection | undefined;\n\n /**\n * Gets a connection by account ID\n * @param accountId - The account ID to look up\n * @returns The connection with the given account ID, or undefined if not found\n */\n getConnectionByAccountId(accountId: string): Connection | undefined;\n\n /**\n * Gets all connections for a specific account ID\n * @param accountId - The account ID to look up\n * @returns Array of connections for the given account ID\n */\n getConnectionsByAccountId(accountId: string): Connection[];\n\n /**\n * Updates or adds a connection\n * @param connection - The connection to update or add\n */\n updateOrAddConnection(connection: Connection): void;\n\n /**\n * Clears all tracked connections and requests\n */\n clearAll(): void;\n\n /**\n * Checks if a given connection request has been processed already\n * This uses a combination of topic ID and request ID to uniquely identify requests\n *\n * @param inboundTopicId - The inbound topic ID where the request was received\n * @param requestId - The sequence number (request ID)\n * @returns True if this specific request has been processed, false otherwise\n */\n isConnectionRequestProcessed(\n inboundTopicId: string,\n requestId: number\n ): boolean;\n\n /**\n * Marks a specific connection request as processed\n *\n * @param inboundTopicId - The inbound topic ID where the request was received\n * @param requestId - The sequence number (request ID)\n * @returns True if a matching connection was found and marked, false otherwise\n */\n markConnectionRequestProcessed(\n inboundTopicId: string,\n requestId: number\n ): boolean;\n}\n\n/**\n * ConnectionsManager provides a unified way to track and manage HCS-10 connections\n * across different applications. It works with both frontend and backend implementations.\n */\nexport class ConnectionsManager implements IConnectionsManager {\n private logger: Logger;\n private connections: Map<string, Connection> = new Map();\n private pendingRequests: Map<string, ConnectionRequest> = new Map();\n private profileCache: Map<string, AIAgentProfile> = new Map();\n private filterPendingAccountIds: Set<string> = new Set();\n private baseClient: HCS10BaseClient;\n\n /**\n * Creates a new ConnectionsManager instance\n */\n constructor(options: ConnectionsManagerOptions) {\n const loggerOptions: LoggerOptions = {\n module: 'ConnectionsManager',\n level: options?.logLevel || 'info',\n prettyPrint: true,\n };\n this.logger = new Logger(loggerOptions);\n\n if (options?.filterPendingAccountIds) {\n this.filterPendingAccountIds = new Set(options.filterPendingAccountIds);\n }\n\n if (!options.baseClient) {\n throw new Error('ConnectionsManager requires a baseClient to operate');\n }\n\n this.baseClient = options.baseClient;\n }\n\n /**\n * Fetches and processes connection data using the configured client\n * @param accountId - The account ID to fetch connection data for\n * @returns A promise that resolves to an array of Connection objects\n */\n async fetchConnectionData(accountId: string): Promise<Connection[]> {\n try {\n const topicInfo = await this.baseClient.retrieveCommunicationTopics(\n accountId\n );\n\n const isValidTopicId = (topicId: string): boolean => {\n return Boolean(topicId) && !topicId.includes(':');\n };\n\n if (\n !isValidTopicId(topicInfo.inboundTopic) ||\n !isValidTopicId(topicInfo.outboundTopic)\n ) {\n this.logger.warn(\n 'Invalid topic IDs detected in retrieved communication topics'\n );\n return this.getAllConnections();\n }\n\n const [outboundMessagesResult, inboundMessagesResult] = await Promise.all(\n [\n this.baseClient.getMessages(topicInfo.outboundTopic),\n this.baseClient.getMessages(topicInfo.inboundTopic),\n ]\n );\n\n this.processOutboundMessages(\n outboundMessagesResult.messages || [],\n accountId\n );\n this.processInboundMessages(inboundMessagesResult.messages || []);\n\n const pendingCount = Array.from(this.connections.values()).filter(\n (conn) => conn.status === 'pending' || conn.isPending\n ).length;\n this.logger.debug(\n `Processed ${\n outboundMessagesResult.messages?.length || 0\n } outbound and ${\n inboundMessagesResult.messages?.length || 0\n } inbound messages. Found ${pendingCount} pending connections.`\n );\n\n await this.checkTargetInboundTopicsForConfirmations();\n await this.checkOutboundRequestsForConfirmations();\n await this.fetchProfilesForConnections();\n await this.fetchConnectionActivity();\n\n return this.getAllConnections();\n } catch (error) {\n this.logger.error('Error fetching connection data:', error);\n return this.getAllConnections();\n }\n }\n\n /**\n * Checks target agent inbound topics to find confirmations for pending requests\n * that might not be visible in our local messages\n */\n private async checkTargetInboundTopicsForConfirmations(): Promise<void> {\n const pendingConnections = Array.from(this.connections.values()).filter(\n (conn) =>\n (conn.isPending || conn.status === 'pending') &&\n conn.targetInboundTopicId\n );\n\n if (pendingConnections.length === 0) {\n return;\n }\n\n const pendingRequestsByTarget = new Map<string, Connection[]>();\n\n pendingConnections.forEach((conn) => {\n if (conn.targetInboundTopicId) {\n const requests =\n pendingRequestsByTarget.get(conn.targetInboundTopicId) || [];\n requests.push(conn);\n pendingRequestsByTarget.set(conn.targetInboundTopicId, requests);\n }\n });\n\n const MAX_FETCH_ATTEMPTS = 2;\n const FETCH_DELAY_MS = 500;\n\n for (const [\n targetInboundTopicId,\n requests,\n ] of pendingRequestsByTarget.entries()) {\n for (let attempt = 1; attempt <= MAX_FETCH_ATTEMPTS; attempt++) {\n try {\n const targetMessagesResult = await this.baseClient.getMessages(\n targetInboundTopicId\n );\n const targetMessages = targetMessagesResult.messages || [];\n\n let confirmedAny = false;\n\n for (const conn of requests) {\n const requestId = conn.connectionRequestId;\n if (!requestId) {\n continue;\n }\n\n const confirmationMsg = targetMessages.find((msg) => {\n if (msg.op !== 'connection_created' || !msg.connection_topic_id) {\n return false;\n }\n\n if (msg.connection_id !== requestId) {\n return false;\n }\n\n if (conn.uniqueRequestKey) {\n const keyParts = conn.uniqueRequestKey.split(':');\n if (keyParts.length > 1) {\n const operatorIdPart = keyParts[1];\n\n if (msg.operator_id && msg.operator_id === operatorIdPart) {\n return true;\n }\n\n if (msg.connected_account_id === conn.targetAccountId) {\n return true;\n }\n }\n }\n\n return true;\n });\n\n if (confirmationMsg?.connection_topic_id) {\n confirmedAny = true;\n\n const connectionTopicId = confirmationMsg.connection_topic_id;\n\n let pendingKey = conn.uniqueRequestKey;\n\n const newConnection: Connection = {\n connectionTopicId,\n targetAccountId: conn.targetAccountId,\n targetAgentName: conn.targetAgentName,\n targetInboundTopicId: conn.targetInboundTopicId,\n status: 'established',\n isPending: false,\n needsConfirmation: false,\n created: new Date(confirmationMsg.created || conn.created),\n profileInfo: conn.profileInfo,\n connectionRequestId: requestId,\n uniqueRequestKey: conn.uniqueRequestKey,\n originTopicId: conn.originTopicId,\n processed: conn.processed,\n memo: conn.memo,\n };\n\n this.connections.set(connectionTopicId, newConnection);\n\n if (pendingKey) {\n this.connections.delete(pendingKey);\n }\n\n this.logger.debug(\n `Confirmed connection in target inbound topic: ${connectionTopicId}`\n );\n }\n }\n\n if (confirmedAny || attempt === MAX_FETCH_ATTEMPTS) {\n break;\n }\n\n await new Promise((resolve) => setTimeout(resolve, FETCH_DELAY_MS));\n } catch (error) {\n this.logger.debug(\n `Error fetching target inbound topic ${targetInboundTopicId}:`,\n error\n );\n if (attempt === MAX_FETCH_ATTEMPTS) {\n break;\n }\n await new Promise((resolve) => setTimeout(resolve, FETCH_DELAY_MS));\n }\n }\n }\n }\n\n /**\n * Checks target agents' inbound topics for confirmations of our outbound connection requests\n * This complements checkTargetInboundTopicsForConfirmations by looking for confirmations\n * that might have been sent to the target agent's inbound topic rather than our own\n */\n private async checkOutboundRequestsForConfirmations(): Promise<void> {\n const allConnections = Array.from(this.connections.values());\n this.logger.info(`Total connections in map: ${allConnections.length}`);\n\n const pendingByStatus = allConnections.filter(\n (conn) => conn.status === 'pending'\n );\n this.logger.info(\n `Connections with status='pending': ${pendingByStatus.length}`\n );\n\n const pendingConnections = allConnections.filter(\n (conn) => conn.status === 'pending'\n );\n\n if (!Boolean(pendingConnections?.length)) {\n this.logger.info('No pending connections found');\n return;\n }\n\n for (const conn of pendingConnections) {\n this.logger.debug(\n `Processing pending connection: ${conn.connectionTopicId}`\n );\n\n if (!conn.targetAccountId) {\n this.logger.debug(\n `Skipping connection ${conn.connectionTopicId} - no targetAccountId`\n );\n continue;\n }\n\n let targetInboundTopicId = conn.targetInboundTopicId;\n if (!targetInboundTopicId) {\n try {\n const profileResponse = await this.baseClient.retrieveProfile(\n conn.targetAccountId\n );\n if (profileResponse?.profile?.inboundTopicId) {\n targetInboundTopicId = profileResponse.profile.inboundTopicId;\n this.connections.set(conn.connectionTopicId, {\n ...conn,\n targetInboundTopicId,\n });\n this.logger.debug(\n `Updated connection ${conn.connectionTopicId} with inbound topic ID: ${targetInboundTopicId}`\n );\n } else {\n this.logger.debug(\n `Couldn't get inbound topic ID for account ${conn.targetAccountId}`\n );\n continue;\n }\n } catch (error) {\n this.logger.debug(\n `Error fetching profile for ${conn.targetAccountId}: ${error}`\n );\n continue;\n }\n }\n\n if (!targetInboundTopicId || targetInboundTopicId.includes(':')) {\n this.logger.debug(\n `Skipping invalid inbound topic format: ${targetInboundTopicId}`\n );\n continue;\n }\n\n const requestId = conn.connectionRequestId || conn.inboundRequestId;\n if (!requestId) {\n this.logger.debug(\n `Skipping connection ${conn.connectionTopicId} - no request ID`\n );\n continue;\n }\n\n try {\n this.logger.debug(\n `Checking for confirmations on topic ${targetInboundTopicId} for request ID ${requestId}`\n );\n const targetMessagesResult = await this.baseClient.getMessages(\n targetInboundTopicId\n );\n const targetMessages = targetMessagesResult.messages || [];\n\n const confirmationMsg = targetMessages.find(\n (msg) =>\n msg.op === 'connection_created' &&\n msg.connection_id === requestId &&\n msg.connection_topic_id\n );\n\n if (confirmationMsg?.connection_topic_id) {\n const connectionTopicId = confirmationMsg.connection_topic_id;\n this.logger.info(\n `Found confirmation for request #${requestId} to ${conn.targetAccountId} on their inbound topic`\n );\n\n this.connections.set(conn.connectionTopicId, {\n ...conn,\n connectionTopicId,\n status: 'established',\n isPending: false,\n needsConfirmation: false,\n created: new Date(confirmationMsg.created || conn.created),\n lastActivity: new Date(confirmationMsg.created || conn.created),\n });\n } else {\n this.logger.debug(\n `No confirmation found for request ID ${requestId} on topic ${targetInboundTopicId}`\n );\n }\n } catch (error) {\n this.logger.warn(\n `Error checking for confirmations on target inbound topic for ${conn.targetAccountId}: ${error}`\n );\n }\n }\n }\n\n /**\n * Fetches profiles for all connected accounts\n * @param accountId - The account ID making the request\n */\n private async fetchProfilesForConnections(): Promise<void> {\n const targetAccountIds = new Set<string>();\n\n for (const connection of this.connections.values()) {\n if (\n connection.targetAccountId &&\n !this.profileCache.has(connection.targetAccountId)\n ) {\n targetAccountIds.add(connection.targetAccountId);\n }\n }\n\n const accountIdPromises = Array.from(targetAccountIds).map(\n async (targetId) => {\n try {\n const profileResponse = await this.baseClient.retrieveProfile(\n targetId\n );\n if (profileResponse.success && profileResponse.profile) {\n this.addProfileInfo(targetId, profileResponse.profile);\n\n this.updatePendingConnectionsWithProfileInfo(\n targetId,\n profileResponse.profile\n );\n }\n } catch (error) {\n this.logger.debug(`Failed to fetch profile for ${targetId}:`, error);\n }\n }\n );\n\n await Promise.allSettled(accountIdPromises);\n }\n\n /**\n * Updates pending connections with inbound topic IDs from profile info\n * @param accountId - The account ID to update connections for\n * @param profile - The profile containing the inbound topic ID\n */\n private updatePendingConnectionsWithProfileInfo(\n accountId: string,\n profile: AIAgentProfile\n ): void {\n const pendingConnections = Array.from(this.connections.values()).filter(\n (conn) =>\n conn.targetAccountId === accountId &&\n (conn.isPending || conn.needsConfirmation) &&\n !conn.targetInboundTopicId\n );\n\n if (pendingConnections.length > 0 && profile.inboundTopicId) {\n for (const conn of pendingConnections) {\n const updatedConn = {\n ...conn,\n targetInboundTopicId: profile.inboundTopicId,\n };\n this.connections.set(conn.connectionTopicId, updatedConn);\n }\n }\n }\n\n /**\n * Fetches activity from active connection topics\n * Updates the lastActivity timestamp for each connection based on latest messages\n * @returns Promise that resolves when all activity has been fetched\n */\n private async fetchConnectionActivity(): Promise<void> {\n const activeConnections = this.getActiveConnections();\n\n const validConnections = activeConnections.filter((connection) => {\n const topicId = connection.connectionTopicId;\n\n if (!topicId || topicId.includes(':') || !topicId.match(/^0\\.0\\.\\d+$/)) {\n this.logger.debug(\n `Skipping activity fetch for invalid topic ID format: ${topicId}`\n );\n return false;\n }\n return true;\n });\n\n const activityPromises = validConnections.map(async (connection) => {\n try {\n const topicId = connection.connectionTopicId;\n const messagesResult = await this.baseClient.getMessages(topicId);\n\n if (messagesResult?.messages?.length > 0) {\n this.processConnectionMessages(topicId, messagesResult.messages);\n }\n } catch (error) {\n this.logger.debug(\n `Failed to fetch activity for ${connection.connectionTopicId}:`,\n error\n );\n }\n });\n\n await Promise.allSettled(activityPromises);\n }\n\n /**\n * Checks if an account should be filtered, taking into account existing established connections\n * @param accountId - The account ID to check\n * @returns True if the account should be filtered, false otherwise\n */\n private shouldFilterAccount(accountId: string): boolean {\n if (!this.filterPendingAccountIds.has(accountId)) {\n return false;\n }\n\n if (this.hasEstablishedConnectionWithAccount(accountId)) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Process outbound messages to track connection requests and confirmations\n * @param messages - The messages to process\n * @param accountId - The account ID that sent the messages\n * @returns Array of connections after processing\n */\n processOutboundMessages(\n messages: HCSMessage[],\n accountId: string\n ): Connection[] {\n if (!Boolean(messages?.length)) {\n return Array.from(this.connections.values());\n }\n\n const requestMessages = messages.filter(\n (msg) => msg.op === 'connection_request' && msg.connection_request_id\n );\n\n for (const msg of requestMessages) {\n const requestId = msg.connection_request_id!;\n const operatorId = msg.operator_id || '';\n const targetAccountId =\n this.baseClient.extractAccountFromOperatorId(operatorId);\n const targetInboundTopicId =\n this.baseClient.extractTopicFromOperatorId(operatorId);\n\n if (this.shouldFilterAccount(targetAccountId)) {\n this.logger.debug(\n `Filtering out outbound request to account: ${targetAccountId}`\n );\n continue;\n }\n\n const isAlreadyConfirmed = Array.from(this.connections.values()).some(\n (conn) =>\n conn.connectionRequestId === requestId &&\n !conn.isPending &&\n conn.targetAccountId === targetAccountId\n );\n\n const pendingKey = `req-${requestId}:${operatorId}`;\n\n if (!isAlreadyConfirmed && !this.pendingRequests.has(pendingKey)) {\n const pendingRequest = {\n id: requestId,\n requesterId: accountId,\n requesterTopicId: msg.outbound_topic_id || '',\n targetAccountId,\n targetTopicId: targetInboundTopicId,\n operatorId,\n sequenceNumber: msg.sequence_number,\n created: msg.created || new Date(),\n memo: msg.m,\n status: 'pending' as 'pending' | 'confirmed' | 'rejected',\n };\n\n this.pendingRequests.set(pendingKey, pendingRequest);\n\n if (!this.connections.has(pendingKey)) {\n const pendingConnection = {\n connectionTopicId: pendingKey,\n targetAccountId,\n targetInboundTopicId,\n status: 'pending' as\n | 'pending'\n | 'established'\n | 'needs_confirmation'\n | 'closed',\n isPending: true,\n needsConfirmation: false,\n created: msg.created || new Date(),\n connectionRequestId: requestId,\n uniqueRequestKey: pendingKey,\n originTopicId: msg.outbound_topic_id || '',\n processed: false,\n memo: msg.m,\n };\n\n this.connections.set(pendingKey, pendingConnection);\n }\n }\n }\n\n const confirmationMessages = messages.filter(\n (msg) =>\n msg.op === 'connection_created' &&\n msg.connection_topic_id &&\n msg.connection_request_id\n );\n\n for (const msg of confirmationMessages) {\n const requestId = msg.connection_request_id!;\n const connectionTopicId = msg.connection_topic_id!;\n const targetAccountId = this.baseClient.extractAccountFromOperatorId(\n msg.operator_id || ''\n );\n\n if (this.shouldFilterAccount(targetAccountId)) {\n this.logger.debug(\n `Filtering out outbound confirmation to account: ${targetAccountId}`\n );\n continue;\n }\n\n const pendingKey = `req-${requestId}:${msg.operator_id}`;\n\n const pendingRequest = this.pendingRequests.get(pendingKey);\n if (pendingRequest) {\n pendingRequest.status = 'confirmed';\n }\n\n if (this.connections.has(pendingKey)) {\n this.connections.delete(pendingKey);\n }\n\n if (!this.connections.has(connectionTopicId)) {\n this.connections.set(connectionTopicId, {\n connectionTopicId,\n targetAccountId,\n status: 'established',\n isPending: false,\n needsConfirmation: false,\n created: msg.created || new Date(),\n connectionRequestId: requestId,\n confirmedRequestId: msg.confirmed_request_id,\n requesterOutboundTopicId: msg.outbound_topic_id,\n uniqueRequestKey: pendingKey,\n originTopicId: msg.outbound_topic_id || '',\n processed: false,\n memo: msg.m,\n });\n } else {\n const conn = this.connections.get(connectionTopicId)!;\n this.connections.set(connectionTopicId, {\n ...conn,\n status: 'established',\n isPending: false,\n needsConfirmation: false,\n connectionRequestId: requestId,\n confirmedRequestId: msg.confirmed_request_id,\n requesterOutboundTopicId: msg.outbound_topic_id,\n uniqueRequestKey: pendingKey,\n originTopicId: msg.outbound_topic_id || '',\n processed: false,\n memo: msg.m,\n });\n }\n }\n\n const closedMessages = messages.filter(\n (msg) =>\n (msg.op as string) === 'connection_closed' ||\n (msg.op === 'close_connection' && msg.connection_topic_id)\n );\n\n for (const msg of closedMessages) {\n const connectionTopicId = msg.connection_topic_id!;\n\n if (this.connections.has(connectionTopicId)) {\n const conn = this.connections.get(connectionTopicId)!;\n if (\n this.shouldFilterAccount(conn.targetAccountId) &&\n conn.status !== 'established'\n ) {\n continue;\n }\n\n const uniqueKey =\n msg.connection_request_id && msg.operator_id\n ? `req-${msg.connection_request_id}:${msg.operator_id}`\n : undefined;\n\n this.connections.set(connectionTopicId, {\n ...conn,\n status: 'closed',\n isPending: false,\n needsConfirmation: false,\n lastActivity: msg.created || new Date(),\n closedReason: msg.reason,\n closeMethod: msg.close_method,\n uniqueRequestKey: uniqueKey,\n originTopicId: conn.originTopicId,\n processed: false,\n memo: msg.m,\n });\n }\n }\n\n return Array.from(this.connections.values()).filter(\n (conn) =>\n conn.status === 'established' ||\n conn.status === 'closed' ||\n !this.filterPendingAccountIds.has(conn.targetAccountId)\n );\n }\n\n /**\n * Process inbound messages to track connection requests and confirmations\n * @param messages - The messages to process\n * @returns Array of connections after processing\n */\n processInboundMessages(messages: HCSMessage[]): Connection[] {\n if (!Boolean(messages?.length)) {\n return Array.from(this.connections.values());\n }\n\n const requestMessages = messages.filter(\n (msg) => msg.op === 'connection_request' && msg.sequence_number\n );\n\n for (const msg of requestMessages) {\n const sequenceNumber = msg.sequence_number;\n const operatorId = msg.operator_id || '';\n const requestorAccountId =\n this.baseClient.extractAccountFromOperatorId(operatorId);\n const requestorTopicId =\n this.baseClient.extractTopicFromOperatorId(operatorId);\n\n if (this.shouldFilterAccount(requestorAccountId)) {\n this.logger.debug(\n `Filtering out request from account: ${requestorAccountId}`\n );\n continue;\n }\n\n const needsConfirmKey = `inb-${sequenceNumber}:${operatorId}`;\n\n if (!this.connections.has(needsConfirmKey)) {\n this.connections.set(needsConfirmKey, {\n connectionTopicId: needsConfirmKey,\n targetAccountId: requestorAccountId,\n targetInboundTopicId: requestorTopicId,\n status: 'needs_confirmation',\n isPending: false,\n needsConfirmation: true,\n created: msg.created || new Date(),\n inboundRequestId: sequenceNumber,\n uniqueRequestKey: needsConfirmKey,\n originTopicId: requestorTopicId,\n processed: false,\n memo: msg.m,\n });\n }\n }\n\n const confirmationMessages = messages.filter(\n (msg) =>\n msg.op === 'connection_created' &&\n msg.connection_topic_id &&\n msg.connection_id\n );\n\n for (const msg of confirmationMessages) {\n const sequenceNumber = msg.connection_id!;\n const connectionTopicId = msg.connection_topic_id!;\n const connectedAccountId = msg.connected_account_id || '';\n const operatorId = msg.operator_id || '';\n\n if (this.shouldFilterAccount(connectedAccountId)) {\n this.logger.debug(\n `Filtering out confirmation for account: ${connectedAccountId}`\n );\n continue;\n }\n\n const needsConfirmKey = `inb-${sequenceNumber}:${operatorId}`;\n\n if (this.connections.has(needsConfirmKey)) {\n this.connections.delete(needsConfirmKey);\n }\n\n if (!this.connections.has(connectionTopicId)) {\n this.connections.set(connectionTopicId, {\n connectionTopicId,\n targetAccountId: connectedAccountId,\n status: 'established',\n isPending: false,\n needsConfirmation: false,\n created: msg.created || new Date(),\n inboundRequestId: sequenceNumber,\n uniqueRequestKey: needsConfirmKey,\n originTopicId: msg.connection_topic_id,\n processed: false,\n memo: msg.m,\n });\n } else {\n const conn = this.connections.get(connectionTopicId)!;\n this.connections.set(connectionTopicId, {\n ...conn,\n status: 'established',\n isPending: false,\n needsConfirmation: false,\n inboundRequestId: sequenceNumber,\n uniqueRequestKey: needsConfirmKey,\n originTopicId: msg.connection_topic_id,\n processed: false,\n memo: msg.m,\n });\n }\n }\n\n return Array.from(this.connections.values()).filter(\n (conn) =>\n conn.status === 'established' ||\n conn.status === 'closed' ||\n !this.filterPendingAccountIds.has(conn.targetAccountId)\n );\n }\n\n /**\n * Process connection topic messages to update last activity time\n * @param connectionTopicId - The topic ID of the connection\n * @param messages - The messages to process\n * @returns The updated connection or undefined if not found\n */\n processConnectionMessages(\n connectionTopicId: string,\n messages: HCSMessage[]\n ): Connection | undefined {\n if (\n !messages ||\n messages.length === 0 ||\n !this.connections.has(connectionTopicId)\n ) {\n return this.connections.get(connectionTopicId);\n }\n\n const latestMessage = messages\n .filter((m) => m.created)\n .sort((a, b) => {\n const dateA = a.created ? new Date(a.created).getTime() : 0;\n const dateB = b.created ? new Date(b.created).getTime() : 0;\n return dateB - dateA;\n })[0];\n\n if (latestMessage?.created) {\n const conn = this.connections.get(connectionTopicId)!;\n this.connections.set(connectionTopicId, {\n ...conn,\n lastActivity: latestMessage.created,\n });\n }\n\n const closeMessage = messages.find((msg) => msg.op === 'close_connection');\n if (closeMessage) {\n const conn = this.connections.get(connectionTopicId)!;\n this.connections.set(connectionTopicId, {\n ...conn,\n status: 'closed',\n lastActivity: closeMessage.created || new Date(),\n closedReason: closeMessage.reason,\n closeMethod: 'explicit',\n });\n }\n\n return this.connections.get(connectionTopicId);\n }\n\n /**\n * Adds or updates profile information for a connection\n * @param accountId - The account ID to add profile info for\n * @param profile - The profile information\n */\n addProfileInfo(accountId: string, profile: AIAgentProfile): void {\n this.profileCache.set(accountId, profile);\n\n const matchingConnections = Array.from(this.connections.values()).filter(\n (conn) => conn.targetAccountId === accountId\n );\n\n for (const conn of matchingConnections) {\n this.connections.set(conn.connectionTopicId, {\n ...conn,\n profileInfo: profile,\n targetAgentName: profile.display_name,\n targetInboundTopicId: profile.inboundTopicId,\n targetOutboundTopicId: profile.outboundTopicId,\n });\n }\n }\n\n /**\n * Gets all connections\n * @returns Array of all connections that should be visible\n */\n getAllConnections(): Connection[] {\n const connections = Array.from(this.connections.values()).filter(\n (conn) =>\n conn.status === 'established' ||\n conn.status === 'closed' ||\n !this.filterPendingAccountIds.has(conn.targetAccountId) ||\n this.hasEstablishedConnectionWithAccount(conn.targetAccountId)\n );\n return connections;\n }\n\n /**\n * Gets all pending connection requests\n * @returns Array of pending connection requests\n */\n getPendingRequests(): Connection[] {\n const pendingConnections = Array.from(this.connections.values()).filter(\n (conn) => {\n return (\n conn.isPending &&\n (!this.filterPendingAccountIds.has(conn.targetAccountId) ||\n this.hasEstablishedConnectionWithAccount(conn.targetAccountId))\n );\n }\n );\n\n return pendingConnections;\n }\n\n /**\n * Helper method to check if there's an established connection with an account\n * @param accountId - The account ID to check\n * @returns True if there's an established connection, false otherwise\n */\n private hasEstablishedConnectionWithAccount(accountId: string): boolean {\n return Array.from(this.connections.values()).some(\n (conn) =>\n conn.targetAccountId === accountId && conn.status === 'established'\n );\n }\n\n /**\n * Gets all active (established) connections\n * @returns Array of active connections\n */\n getActiveConnections(): Connection[] {\n return Array.from(this.connections.values()).filter(\n (conn) => conn.status === 'established'\n );\n }\n\n /**\n * Gets all connections needing confirmation\n * @returns Array of connections needing confirmation\n */\n getConnectionsNeedingConfirmation(): Connection[] {\n return Array.from(this.connections.values()).filter(\n (conn) =>\n conn.needsConfirmation &&\n (!this.filterPendingAccountIds.has(conn.targetAccountId) ||\n this.hasEstablishedConnectionWithAccount(conn.targetAccountId))\n );\n }\n\n /**\n * Gets a connection by its topic ID\n * @param connectionTopicId - The topic ID to look up\n * @returns The connection with the given topic ID, or undefined if not found\n */\n getConnectionByTopicId(connectionTopicId: string): Connection | undefined {\n return this.connections.get(connectionTopicId);\n }\n\n /**\n * Gets a connection by account ID\n * @param accountId - The account ID to look up\n * @returns The connection with the given account ID, or undefined if not found\n */\n getConnectionByAccountId(accountId: string): Connection | undefined {\n return Array.from(this.connections.values()).find(\n (conn) =>\n conn.targetAccountId === accountId && conn.status === 'established'\n );\n }\n\n /**\n * Gets all connections for a specific account ID\n * @param accountId - The account ID to look up\n * @returns Array of connections for the given account ID\n */\n getConnectionsByAccountId(accountId: string): Connection[] {\n return Array.from(this.connections.values()).filter(\n (conn) => conn.targetAccountId === accountId\n );\n }\n\n /**\n * Updates or adds a connection\n * @param connection - The connection to update or add\n */\n updateOrAddConnection(connection: Connection): void {\n this.connections.set(connection.connectionTopicId, connection);\n }\n\n /**\n * Clears all tracked connections and requests\n */\n clearAll(): void {\n this.connections.clear();\n this.pendingRequests.clear();\n }\n\n /**\n * Checks if a given connection request has been processed already\n * This uses a combination of topic ID and request ID to uniquely identify requests\n *\n * @param inboundTopicId - The inbound topic ID where the request was received\n * @param requestId - The sequence number (request ID)\n * @returns True if this specific request has been processed, false otherwise\n */\n isConnectionRequestProcessed(\n inboundTopicId: string,\n requestId: number\n ): boolean {\n for (const conn of this.connections.values()) {\n if (\n conn.originTopicId === inboundTopicId &&\n conn.inboundRequestId === requestId &&\n conn.processed\n ) {\n return true;\n }\n\n if (\n conn.originTopicId === inboundTopicId &&\n conn.connectionRequestId === requestId &&\n conn.processed\n ) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Marks a specific connection request as processed\n *\n * @param inboundTopicId - The inbound topic ID where the request was received\n * @param requestId - The sequence number (request ID)\n * @returns True if a matching connection was found and marked, false otherwise\n */\n markConnectionRequestProcessed(\n inboundTopicId: string,\n requestId: number\n ): boolean {\n let found = false;\n\n for (const [key, conn] of this.connections.entries()) {\n if (\n conn.originTopicId === inboundTopicId &&\n conn.inboundRequestId === requestId\n ) {\n this.connections.set(key, {\n ...conn,\n processed: true,\n });\n found = true;\n this.logger.debug(\n `Marked inbound connection request #${requestId} on topic ${inboundTopicId} as processed`\n );\n }\n\n if (\n conn.originTopicId === inboundTopicId &&\n conn.connectionRequestId === requestId\n ) {\n this.connections.set(key, {\n ...conn,\n processed: true,\n });\n found = true;\n this.logger.debug(\n `Marked outbound connection request #${requestId} on topic ${inboundTopicId} as processed`\n );\n }\n }\n\n return found;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,151 +1,35 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
result += HEX[value[i] >> 4];
|
|
15
|
-
result += HEX[value[i] & 15];
|
|
16
|
-
}
|
|
17
|
-
return result;
|
|
18
|
-
}
|
|
19
|
-
if (typeof value === "object" && typeof value.toJSON === "function") {
|
|
20
|
-
return stringify(value.toJSON());
|
|
21
|
-
}
|
|
22
|
-
switch (typeof value) {
|
|
23
|
-
case "boolean":
|
|
24
|
-
case "symbol":
|
|
25
|
-
return value.toString();
|
|
26
|
-
case "bigint":
|
|
27
|
-
return BigInt(value).toString();
|
|
28
|
-
case "number":
|
|
29
|
-
return value.toString();
|
|
30
|
-
case "string":
|
|
31
|
-
return JSON.stringify(value);
|
|
32
|
-
case "object": {
|
|
33
|
-
const keys = Object.keys(value);
|
|
34
|
-
keys.sort();
|
|
35
|
-
return "{ " + keys.map((k) => `${stringify(k)}: ${stringify(value[k])}`).join(", ") + " }";
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
return `[ COULD NOT SERIALIZE ]`;
|
|
39
|
-
}
|
|
40
|
-
function isError(error, code) {
|
|
41
|
-
return error && error.code === code;
|
|
42
|
-
}
|
|
43
|
-
function makeError(message, code, info) {
|
|
44
|
-
let shortMessage = message;
|
|
45
|
-
{
|
|
46
|
-
const details = [];
|
|
47
|
-
if (info) {
|
|
48
|
-
if ("message" in info || "code" in info || "name" in info) {
|
|
49
|
-
throw new Error(`value will overwrite populated values: ${stringify(info)}`);
|
|
50
|
-
}
|
|
51
|
-
for (const key in info) {
|
|
52
|
-
if (key === "shortMessage") {
|
|
53
|
-
continue;
|
|
54
|
-
}
|
|
55
|
-
const value = info[key];
|
|
56
|
-
details.push(key + "=" + stringify(value));
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
details.push(`code=${code}`);
|
|
60
|
-
details.push(`version=${version}`);
|
|
61
|
-
if (details.length) {
|
|
62
|
-
message += " (" + details.join(", ") + ")";
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
let error;
|
|
66
|
-
switch (code) {
|
|
67
|
-
case "INVALID_ARGUMENT":
|
|
68
|
-
error = new TypeError(message);
|
|
69
|
-
break;
|
|
70
|
-
case "NUMERIC_FAULT":
|
|
71
|
-
case "BUFFER_OVERRUN":
|
|
72
|
-
error = new RangeError(message);
|
|
73
|
-
break;
|
|
74
|
-
default:
|
|
75
|
-
error = new Error(message);
|
|
76
|
-
}
|
|
77
|
-
defineProperties(error, { code });
|
|
78
|
-
if (info) {
|
|
79
|
-
Object.assign(error, info);
|
|
80
|
-
}
|
|
81
|
-
if (error.shortMessage == null) {
|
|
82
|
-
defineProperties(error, { shortMessage });
|
|
83
|
-
}
|
|
84
|
-
return error;
|
|
85
|
-
}
|
|
86
|
-
function assert(check, message, code, info) {
|
|
87
|
-
if (!check) {
|
|
88
|
-
throw makeError(message, code, info);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
function assertArgument(check, message, name, value) {
|
|
92
|
-
assert(check, message, "INVALID_ARGUMENT", { argument: name, value });
|
|
93
|
-
}
|
|
94
|
-
function assertArgumentCount(count, expectedCount, message) {
|
|
95
|
-
if (message == null) {
|
|
96
|
-
message = "";
|
|
97
|
-
}
|
|
98
|
-
if (message) {
|
|
99
|
-
message = ": " + message;
|
|
100
|
-
}
|
|
101
|
-
assert(count >= expectedCount, "missing argument" + message, "MISSING_ARGUMENT", {
|
|
102
|
-
count,
|
|
103
|
-
expectedCount
|
|
104
|
-
});
|
|
105
|
-
assert(count <= expectedCount, "too many arguments" + message, "UNEXPECTED_ARGUMENT", {
|
|
106
|
-
count,
|
|
107
|
-
expectedCount
|
|
1
|
+
import toFormData from "./standards-sdk.es48.js";
|
|
2
|
+
function encode(str) {
|
|
3
|
+
const charMap = {
|
|
4
|
+
"!": "%21",
|
|
5
|
+
"'": "%27",
|
|
6
|
+
"(": "%28",
|
|
7
|
+
")": "%29",
|
|
8
|
+
"~": "%7E",
|
|
9
|
+
"%20": "+",
|
|
10
|
+
"%00": "\0"
|
|
11
|
+
};
|
|
12
|
+
return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {
|
|
13
|
+
return charMap[match];
|
|
108
14
|
});
|
|
109
15
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
throw new Error("bad");
|
|
114
|
-
}
|
|
115
|
-
;
|
|
116
|
-
if (form === "NFD") {
|
|
117
|
-
const check = String.fromCharCode(233).normalize("NFD");
|
|
118
|
-
const expected = String.fromCharCode(101, 769);
|
|
119
|
-
if (check !== expected) {
|
|
120
|
-
throw new Error("broken");
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
accum.push(form);
|
|
124
|
-
} catch (error) {
|
|
125
|
-
}
|
|
126
|
-
return accum;
|
|
127
|
-
}, []);
|
|
128
|
-
function assertPrivate(givenGuard, guard, className) {
|
|
129
|
-
if (className == null) {
|
|
130
|
-
className = "";
|
|
131
|
-
}
|
|
132
|
-
if (givenGuard !== guard) {
|
|
133
|
-
let method = className, operation = "new";
|
|
134
|
-
if (className) {
|
|
135
|
-
method += ".";
|
|
136
|
-
operation += " " + className;
|
|
137
|
-
}
|
|
138
|
-
assert(false, `private constructor; use ${method}from* methods`, "UNSUPPORTED_OPERATION", {
|
|
139
|
-
operation
|
|
140
|
-
});
|
|
141
|
-
}
|
|
16
|
+
function AxiosURLSearchParams(params, options) {
|
|
17
|
+
this._pairs = [];
|
|
18
|
+
params && toFormData(params, this, options);
|
|
142
19
|
}
|
|
20
|
+
const prototype = AxiosURLSearchParams.prototype;
|
|
21
|
+
prototype.append = function append(name, value) {
|
|
22
|
+
this._pairs.push([name, value]);
|
|
23
|
+
};
|
|
24
|
+
prototype.toString = function toString(encoder) {
|
|
25
|
+
const _encode = encoder ? function(value) {
|
|
26
|
+
return encoder.call(this, value, encode);
|
|
27
|
+
} : encode;
|
|
28
|
+
return this._pairs.map(function each(pair) {
|
|
29
|
+
return _encode(pair[0]) + "=" + _encode(pair[1]);
|
|
30
|
+
}, "").join("&");
|
|
31
|
+
};
|
|
143
32
|
export {
|
|
144
|
-
|
|
145
|
-
assertArgument,
|
|
146
|
-
assertArgumentCount,
|
|
147
|
-
assertPrivate,
|
|
148
|
-
isError,
|
|
149
|
-
makeError
|
|
33
|
+
AxiosURLSearchParams as default
|
|
150
34
|
};
|
|
151
35
|
//# sourceMappingURL=standards-sdk.es100.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standards-sdk.es100.js","sources":["../../node_modules/ethers/lib.esm/utils/errors.js"],"sourcesContent":["/**\n * All errors in ethers include properties to ensure they are both\n * human-readable (i.e. ``.message``) and machine-readable (i.e. ``.code``).\n *\n * The [[isError]] function can be used to check the error ``code`` and\n * provide a type guard for the properties present on that error interface.\n *\n * @_section: api/utils/errors:Errors [about-errors]\n */\nimport { version } from \"../_version.js\";\nimport { defineProperties } from \"./properties.js\";\nfunction stringify(value) {\n if (value == null) {\n return \"null\";\n }\n if (Array.isArray(value)) {\n return \"[ \" + (value.map(stringify)).join(\", \") + \" ]\";\n }\n if (value instanceof Uint8Array) {\n const HEX = \"0123456789abcdef\";\n let result = \"0x\";\n for (let i = 0; i < value.length; i++) {\n result += HEX[value[i] >> 4];\n result += HEX[value[i] & 0xf];\n }\n return result;\n }\n if (typeof (value) === \"object\" && typeof (value.toJSON) === \"function\") {\n return stringify(value.toJSON());\n }\n switch (typeof (value)) {\n case \"boolean\":\n case \"symbol\":\n return value.toString();\n case \"bigint\":\n return BigInt(value).toString();\n case \"number\":\n return (value).toString();\n case \"string\":\n return JSON.stringify(value);\n case \"object\": {\n const keys = Object.keys(value);\n keys.sort();\n return \"{ \" + keys.map((k) => `${stringify(k)}: ${stringify(value[k])}`).join(\", \") + \" }\";\n }\n }\n return `[ COULD NOT SERIALIZE ]`;\n}\n/**\n * Returns true if the %%error%% matches an error thrown by ethers\n * that matches the error %%code%%.\n *\n * In TypeScript environments, this can be used to check that %%error%%\n * matches an EthersError type, which means the expected properties will\n * be set.\n *\n * @See [ErrorCodes](api:ErrorCode)\n * @example\n * try {\n * // code....\n * } catch (e) {\n * if (isError(e, \"CALL_EXCEPTION\")) {\n * // The Type Guard has validated this object\n * console.log(e.data);\n * }\n * }\n */\nexport function isError(error, code) {\n return (error && error.code === code);\n}\n/**\n * Returns true if %%error%% is a [[CallExceptionError].\n */\nexport function isCallException(error) {\n return isError(error, \"CALL_EXCEPTION\");\n}\n/**\n * Returns a new Error configured to the format ethers emits errors, with\n * the %%message%%, [[api:ErrorCode]] %%code%% and additional properties\n * for the corresponding EthersError.\n *\n * Each error in ethers includes the version of ethers, a\n * machine-readable [[ErrorCode]], and depending on %%code%%, additional\n * required properties. The error message will also include the %%message%%,\n * ethers version, %%code%% and all additional properties, serialized.\n */\nexport function makeError(message, code, info) {\n let shortMessage = message;\n {\n const details = [];\n if (info) {\n if (\"message\" in info || \"code\" in info || \"name\" in info) {\n throw new Error(`value will overwrite populated values: ${stringify(info)}`);\n }\n for (const key in info) {\n if (key === \"shortMessage\") {\n continue;\n }\n const value = (info[key]);\n // try {\n details.push(key + \"=\" + stringify(value));\n // } catch (error: any) {\n // console.log(\"MMM\", error.message);\n // details.push(key + \"=[could not serialize object]\");\n // }\n }\n }\n details.push(`code=${code}`);\n details.push(`version=${version}`);\n if (details.length) {\n message += \" (\" + details.join(\", \") + \")\";\n }\n }\n let error;\n switch (code) {\n case \"INVALID_ARGUMENT\":\n error = new TypeError(message);\n break;\n case \"NUMERIC_FAULT\":\n case \"BUFFER_OVERRUN\":\n error = new RangeError(message);\n break;\n default:\n error = new Error(message);\n }\n defineProperties(error, { code });\n if (info) {\n Object.assign(error, info);\n }\n if (error.shortMessage == null) {\n defineProperties(error, { shortMessage });\n }\n return error;\n}\n/**\n * Throws an EthersError with %%message%%, %%code%% and additional error\n * %%info%% when %%check%% is falsish..\n *\n * @see [[api:makeError]]\n */\nexport function assert(check, message, code, info) {\n if (!check) {\n throw makeError(message, code, info);\n }\n}\n/**\n * A simple helper to simply ensuring provided arguments match expected\n * constraints, throwing if not.\n *\n * In TypeScript environments, the %%check%% has been asserted true, so\n * any further code does not need additional compile-time checks.\n */\nexport function assertArgument(check, message, name, value) {\n assert(check, message, \"INVALID_ARGUMENT\", { argument: name, value: value });\n}\nexport function assertArgumentCount(count, expectedCount, message) {\n if (message == null) {\n message = \"\";\n }\n if (message) {\n message = \": \" + message;\n }\n assert(count >= expectedCount, \"missing argument\" + message, \"MISSING_ARGUMENT\", {\n count: count,\n expectedCount: expectedCount\n });\n assert(count <= expectedCount, \"too many arguments\" + message, \"UNEXPECTED_ARGUMENT\", {\n count: count,\n expectedCount: expectedCount\n });\n}\nconst _normalizeForms = [\"NFD\", \"NFC\", \"NFKD\", \"NFKC\"].reduce((accum, form) => {\n try {\n // General test for normalize\n /* c8 ignore start */\n if (\"test\".normalize(form) !== \"test\") {\n throw new Error(\"bad\");\n }\n ;\n /* c8 ignore stop */\n if (form === \"NFD\") {\n const check = String.fromCharCode(0xe9).normalize(\"NFD\");\n const expected = String.fromCharCode(0x65, 0x0301);\n /* c8 ignore start */\n if (check !== expected) {\n throw new Error(\"broken\");\n }\n /* c8 ignore stop */\n }\n accum.push(form);\n }\n catch (error) { }\n return accum;\n}, []);\n/**\n * Throws if the normalization %%form%% is not supported.\n */\nexport function assertNormalize(form) {\n assert(_normalizeForms.indexOf(form) >= 0, \"platform missing String.prototype.normalize\", \"UNSUPPORTED_OPERATION\", {\n operation: \"String.prototype.normalize\", info: { form }\n });\n}\n/**\n * Many classes use file-scoped values to guard the constructor,\n * making it effectively private. This facilitates that pattern\n * by ensuring the %%givenGaurd%% matches the file-scoped %%guard%%,\n * throwing if not, indicating the %%className%% if provided.\n */\nexport function assertPrivate(givenGuard, guard, className) {\n if (className == null) {\n className = \"\";\n }\n if (givenGuard !== guard) {\n let method = className, operation = \"new\";\n if (className) {\n method += \".\";\n operation += \" \" + className;\n }\n assert(false, `private constructor; use ${method}from* methods`, \"UNSUPPORTED_OPERATION\", {\n operation\n });\n }\n}\n//# sourceMappingURL=errors.js.map"],"names":[],"mappings":";;AAWA,SAAS,UAAU,OAAO;AACtB,MAAI,SAAS,MAAM;AACf,WAAO;AAAA,EACf;AACI,MAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,WAAO,OAAQ,MAAM,IAAI,SAAS,EAAG,KAAK,IAAI,IAAI;AAAA,EAC1D;AACI,MAAI,iBAAiB,YAAY;AAC7B,UAAM,MAAM;AACZ,QAAI,SAAS;AACb,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,gBAAU,IAAI,MAAM,CAAC,KAAK,CAAC;AAC3B,gBAAU,IAAI,MAAM,CAAC,IAAI,EAAG;AAAA,IACxC;AACQ,WAAO;AAAA,EACf;AACI,MAAI,OAAQ,UAAW,YAAY,OAAQ,MAAM,WAAY,YAAY;AACrE,WAAO,UAAU,MAAM,QAAQ;AAAA,EACvC;AACI,UAAQ,OAAQ,OAAM;AAAA,IAClB,KAAK;AAAA,IACL,KAAK;AACD,aAAO,MAAM,SAAU;AAAA,IAC3B,KAAK;AACD,aAAO,OAAO,KAAK,EAAE,SAAU;AAAA,IACnC,KAAK;AACD,aAAQ,MAAO,SAAU;AAAA,IAC7B,KAAK;AACD,aAAO,KAAK,UAAU,KAAK;AAAA,IAC/B,KAAK,UAAU;AACX,YAAM,OAAO,OAAO,KAAK,KAAK;AAC9B,WAAK,KAAM;AACX,aAAO,OAAO,KAAK,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,KAAK,UAAU,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,IAAI,IAAI;AAAA,IAClG;AAAA,EACA;AACI,SAAO;AACX;AAoBO,SAAS,QAAQ,OAAO,MAAM;AACjC,SAAQ,SAAS,MAAM,SAAS;AACpC;AAiBO,SAAS,UAAU,SAAS,MAAM,MAAM;AAC3C,MAAI,eAAe;AACnB;AACI,UAAM,UAAU,CAAE;AAClB,QAAI,MAAM;AACN,UAAI,aAAa,QAAQ,UAAU,QAAQ,UAAU,MAAM;AACvD,cAAM,IAAI,MAAM,0CAA0C,UAAU,IAAI,CAAC,EAAE;AAAA,MAC3F;AACY,iBAAW,OAAO,MAAM;AACpB,YAAI,QAAQ,gBAAgB;AACxB;AAAA,QACpB;AACgB,cAAM,QAAS,KAAK,GAAG;AAEvB,gBAAQ,KAAK,MAAM,MAAM,UAAU,KAAK,CAAC;AAAA,MAKzD;AAAA,IACA;AACQ,YAAQ,KAAK,QAAQ,IAAI,EAAE;AAC3B,YAAQ,KAAK,WAAW,OAAO,EAAE;AACjC,QAAI,QAAQ,QAAQ;AAChB,iBAAW,OAAO,QAAQ,KAAK,IAAI,IAAI;AAAA,IACnD;AAAA,EACA;AACI,MAAI;AACJ,UAAQ,MAAI;AAAA,IACR,KAAK;AACD,cAAQ,IAAI,UAAU,OAAO;AAC7B;AAAA,IACJ,KAAK;AAAA,IACL,KAAK;AACD,cAAQ,IAAI,WAAW,OAAO;AAC9B;AAAA,IACJ;AACI,cAAQ,IAAI,MAAM,OAAO;AAAA,EACrC;AACI,mBAAiB,OAAO,EAAE,MAAM;AAChC,MAAI,MAAM;AACN,WAAO,OAAO,OAAO,IAAI;AAAA,EACjC;AACI,MAAI,MAAM,gBAAgB,MAAM;AAC5B,qBAAiB,OAAO,EAAE,cAAc;AAAA,EAChD;AACI,SAAO;AACX;AAOO,SAAS,OAAO,OAAO,SAAS,MAAM,MAAM;AAC/C,MAAI,CAAC,OAAO;AACR,UAAM,UAAU,SAAS,MAAM,IAAI;AAAA,EAC3C;AACA;AAQO,SAAS,eAAe,OAAO,SAAS,MAAM,OAAO;AACxD,SAAO,OAAO,SAAS,oBAAoB,EAAE,UAAU,MAAM,OAAc;AAC/E;AACO,SAAS,oBAAoB,OAAO,eAAe,SAAS;AAC/D,MAAI,WAAW,MAAM;AACjB,cAAU;AAAA,EAClB;AACI,MAAI,SAAS;AACT,cAAU,OAAO;AAAA,EACzB;AACI,SAAO,SAAS,eAAe,qBAAqB,SAAS,oBAAoB;AAAA,IAC7E;AAAA,IACA;AAAA,EACR,CAAK;AACD,SAAO,SAAS,eAAe,uBAAuB,SAAS,uBAAuB;AAAA,IAClF;AAAA,IACA;AAAA,EACR,CAAK;AACL;AACwB,CAAC,OAAO,OAAO,QAAQ,MAAM,EAAE,OAAO,CAAC,OAAO,SAAS;AAC3E,MAAI;AAGA,QAAI,OAAO,UAAU,IAAI,MAAM,QAAQ;AACnC,YAAM,IAAI,MAAM,KAAK;AAAA,IACjC;AACQ;AAEA,QAAI,SAAS,OAAO;AAChB,YAAM,QAAQ,OAAO,aAAa,GAAI,EAAE,UAAU,KAAK;AACvD,YAAM,WAAW,OAAO,aAAa,KAAM,GAAM;AAEjD,UAAI,UAAU,UAAU;AACpB,cAAM,IAAI,MAAM,QAAQ;AAAA,MACxC;AAAA,IAEA;AACQ,UAAM,KAAK,IAAI;AAAA,EACvB,SACW,OAAO;AAAA,EAAA;AACd,SAAO;AACX,GAAG,CAAE,CAAA;AAeE,SAAS,cAAc,YAAY,OAAO,WAAW;AACxD,MAAI,aAAa,MAAM;AACnB,gBAAY;AAAA,EACpB;AACI,MAAI,eAAe,OAAO;AACtB,QAAI,SAAS,WAAW,YAAY;AACpC,QAAI,WAAW;AACX,gBAAU;AACV,mBAAa,MAAM;AAAA,IAC/B;AACQ,WAAO,OAAO,4BAA4B,MAAM,iBAAiB,yBAAyB;AAAA,MACtF;AAAA,IACZ,CAAS;AAAA,EACT;AACA;","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"standards-sdk.es100.js","sources":["../../node_modules/axios/lib/helpers/AxiosURLSearchParams.js"],"sourcesContent":["'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n"],"names":[],"mappings":";AAYA,SAAS,OAAO,KAAK;AACnB,QAAM,UAAU;AAAA,IACd,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,OAAO;AAAA,IACP,OAAO;AAAA,EACR;AACD,SAAO,mBAAmB,GAAG,EAAE,QAAQ,oBAAoB,SAAS,SAAS,OAAO;AAClF,WAAO,QAAQ,KAAK;AAAA,EACxB,CAAG;AACH;AAUA,SAAS,qBAAqB,QAAQ,SAAS;AAC7C,OAAK,SAAS,CAAE;AAEhB,YAAU,WAAW,QAAQ,MAAM,OAAO;AAC5C;AAEA,MAAM,YAAY,qBAAqB;AAEvC,UAAU,SAAS,SAAS,OAAO,MAAM,OAAO;AAC9C,OAAK,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAChC;AAEA,UAAU,WAAW,SAAS,SAAS,SAAS;AAC9C,QAAM,UAAU,UAAU,SAAS,OAAO;AACxC,WAAO,QAAQ,KAAK,MAAM,OAAO,MAAM;AAAA,EAC3C,IAAM;AAEJ,SAAO,KAAK,OAAO,IAAI,SAAS,KAAK,MAAM;AACzC,WAAO,QAAQ,KAAK,CAAC,CAAC,IAAI,MAAM,QAAQ,KAAK,CAAC,CAAC;AAAA,EACnD,GAAK,EAAE,EAAE,KAAK,GAAG;AACjB;","x_google_ignoreList":[0]}
|