@elizaos/plugin-social-alpha 2.0.3-beta.5 → 2.0.3-beta.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/dist/clients.d.ts +354 -0
  2. package/dist/clients.d.ts.map +1 -0
  3. package/dist/clients.js +670 -0
  4. package/dist/clients.js.map +1 -0
  5. package/dist/config.d.ts +144 -0
  6. package/dist/config.d.ts.map +1 -0
  7. package/dist/config.js +122 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/events.d.ts +5 -0
  10. package/dist/events.d.ts.map +1 -0
  11. package/dist/events.js +426 -0
  12. package/dist/events.js.map +1 -0
  13. package/dist/frontend/LeaderboardView.helpers.d.ts +6 -0
  14. package/dist/frontend/LeaderboardView.helpers.d.ts.map +1 -0
  15. package/dist/frontend/LeaderboardView.helpers.js +59 -0
  16. package/dist/frontend/LeaderboardView.helpers.js.map +1 -0
  17. package/dist/frontend/SocialAlphaSpatialView.d.ts +52 -0
  18. package/dist/frontend/SocialAlphaSpatialView.d.ts.map +1 -0
  19. package/dist/frontend/SocialAlphaSpatialView.js +72 -0
  20. package/dist/frontend/SocialAlphaSpatialView.js.map +1 -0
  21. package/dist/frontend/SocialAlphaView.d.ts +35 -0
  22. package/dist/frontend/SocialAlphaView.d.ts.map +1 -0
  23. package/dist/frontend/SocialAlphaView.js +125 -0
  24. package/dist/frontend/SocialAlphaView.js.map +1 -0
  25. package/dist/index.d.ts +24 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +73 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/mockPriceService.d.ts +22 -0
  30. package/dist/mockPriceService.d.ts.map +1 -0
  31. package/dist/mockPriceService.js +21 -0
  32. package/dist/mockPriceService.js.map +1 -0
  33. package/dist/providers/socialAlphaProvider.d.ts +15 -0
  34. package/dist/providers/socialAlphaProvider.d.ts.map +1 -0
  35. package/dist/providers/socialAlphaProvider.js +261 -0
  36. package/dist/providers/socialAlphaProvider.js.map +1 -0
  37. package/dist/register-terminal-view.d.ts +15 -0
  38. package/dist/register-terminal-view.d.ts.map +1 -0
  39. package/dist/register-terminal-view.js +21 -0
  40. package/dist/register-terminal-view.js.map +1 -0
  41. package/dist/register.d.ts +10 -0
  42. package/dist/register.d.ts.map +1 -0
  43. package/dist/register.js +5 -0
  44. package/dist/register.js.map +1 -0
  45. package/dist/reports.d.ts +57 -0
  46. package/dist/reports.d.ts.map +1 -0
  47. package/dist/reports.js +455 -0
  48. package/dist/reports.js.map +1 -0
  49. package/dist/routes.d.ts +3 -0
  50. package/dist/routes.d.ts.map +1 -0
  51. package/dist/routes.js +59 -0
  52. package/dist/routes.js.map +1 -0
  53. package/dist/schemas.d.ts +151 -0
  54. package/dist/schemas.d.ts.map +1 -0
  55. package/dist/schemas.js +258 -0
  56. package/dist/schemas.js.map +1 -0
  57. package/dist/service.d.ts +306 -0
  58. package/dist/service.d.ts.map +1 -0
  59. package/dist/service.js +3078 -0
  60. package/dist/service.js.map +1 -0
  61. package/dist/services/balancedTrustScoreCalculator.d.ts +61 -0
  62. package/dist/services/balancedTrustScoreCalculator.d.ts.map +1 -0
  63. package/dist/services/balancedTrustScoreCalculator.js +207 -0
  64. package/dist/services/balancedTrustScoreCalculator.js.map +1 -0
  65. package/dist/services/historicalPriceService.d.ts +59 -0
  66. package/dist/services/historicalPriceService.d.ts.map +1 -0
  67. package/dist/services/historicalPriceService.js +291 -0
  68. package/dist/services/historicalPriceService.js.map +1 -0
  69. package/dist/services/index.d.ts +12 -0
  70. package/dist/services/index.d.ts.map +1 -0
  71. package/dist/services/index.js +17 -0
  72. package/dist/services/index.js.map +1 -0
  73. package/dist/services/priceEnrichmentService.d.ts +109 -0
  74. package/dist/services/priceEnrichmentService.d.ts.map +1 -0
  75. package/dist/services/priceEnrichmentService.js +780 -0
  76. package/dist/services/priceEnrichmentService.js.map +1 -0
  77. package/dist/services/simulationActorsV2.d.ts +54 -0
  78. package/dist/services/simulationActorsV2.d.ts.map +1 -0
  79. package/dist/services/simulationActorsV2.js +362 -0
  80. package/dist/services/simulationActorsV2.js.map +1 -0
  81. package/dist/services/simulationRunner.d.ts +113 -0
  82. package/dist/services/simulationRunner.d.ts.map +1 -0
  83. package/dist/services/simulationRunner.js +771 -0
  84. package/dist/services/simulationRunner.js.map +1 -0
  85. package/dist/services/tokenSimulationService.d.ts +34 -0
  86. package/dist/services/tokenSimulationService.d.ts.map +1 -0
  87. package/dist/services/tokenSimulationService.js +297 -0
  88. package/dist/services/tokenSimulationService.js.map +1 -0
  89. package/dist/services/trustScoreOptimizer.d.ts +110 -0
  90. package/dist/services/trustScoreOptimizer.d.ts.map +1 -0
  91. package/dist/services/trustScoreOptimizer.js +635 -0
  92. package/dist/services/trustScoreOptimizer.js.map +1 -0
  93. package/dist/simulationActors.d.ts +35 -0
  94. package/dist/simulationActors.d.ts.map +1 -0
  95. package/dist/simulationActors.js +160 -0
  96. package/dist/simulationActors.js.map +1 -0
  97. package/dist/social-alpha-view-bundle.d.ts +2 -0
  98. package/dist/social-alpha-view-bundle.d.ts.map +1 -0
  99. package/dist/social-alpha-view-bundle.js +5 -0
  100. package/dist/social-alpha-view-bundle.js.map +1 -0
  101. package/dist/types.d.ts +937 -0
  102. package/dist/types.d.ts.map +1 -0
  103. package/dist/types.js +46 -0
  104. package/dist/types.js.map +1 -0
  105. package/dist/views/brand/background/clouds_background.jpg +0 -0
  106. package/dist/views/brand/banners/eliza_banner.svg +20 -0
  107. package/dist/views/brand/banners/elizacloud_banner.svg +20 -0
  108. package/dist/views/brand/banners/elizaos_banner.svg +20 -0
  109. package/dist/views/brand/concepts/billboard_concept_1200.jpg +0 -0
  110. package/dist/views/brand/concepts/chibi_usb_concept_900.jpg +0 -0
  111. package/dist/views/brand/concepts/concept_minipc_900.jpg +0 -0
  112. package/dist/views/brand/concepts/concept_phone_800.jpg +0 -0
  113. package/dist/views/brand/concepts/concept_usbdrive_900.jpg +0 -0
  114. package/dist/views/brand/favicons/android-chrome-192x192.png +0 -0
  115. package/dist/views/brand/favicons/android-chrome-512x512.png +0 -0
  116. package/dist/views/brand/favicons/apple-touch-icon.png +0 -0
  117. package/dist/views/brand/favicons/favicon-16x16.png +0 -0
  118. package/dist/views/brand/favicons/favicon-32x32.png +0 -0
  119. package/dist/views/brand/favicons/favicon.ico +0 -0
  120. package/dist/views/brand/favicons/favicon.svg +17 -0
  121. package/dist/views/brand/logos/elizaOS_text_black.svg +3 -0
  122. package/dist/views/brand/logos/elizaOS_text_white.svg +3 -0
  123. package/dist/views/brand/logos/eliza_logotext.svg +26 -0
  124. package/dist/views/brand/logos/eliza_logotext_black.svg +26 -0
  125. package/dist/views/brand/logos/eliza_text_black.svg +3 -0
  126. package/dist/views/brand/logos/eliza_text_white.svg +3 -0
  127. package/dist/views/brand/logos/elizacloud_logotext.svg +26 -0
  128. package/dist/views/brand/logos/elizacloud_logotext_black.svg +26 -0
  129. package/dist/views/brand/logos/elizacloud_text_black.svg +3 -0
  130. package/dist/views/brand/logos/elizacloud_text_white.svg +3 -0
  131. package/dist/views/brand/logos/elizaos_logotext.svg +26 -0
  132. package/dist/views/brand/logos/elizaos_logotext_black.svg +26 -0
  133. package/dist/views/brand/logos/logo_blue_blackbg.svg +18 -0
  134. package/dist/views/brand/logos/logo_blue_nobg.svg +17 -0
  135. package/dist/views/brand/logos/logo_orange_blackbg.svg +18 -0
  136. package/dist/views/brand/logos/logo_orange_nobg.svg +17 -0
  137. package/dist/views/brand/logos/logo_white_blackbg.svg +25 -0
  138. package/dist/views/brand/logos/logo_white_bluebg.svg +25 -0
  139. package/dist/views/brand/logos/logo_white_graybg.svg +18 -0
  140. package/dist/views/brand/logos/logo_white_nobg.svg +24 -0
  141. package/dist/views/brand/logos/logo_white_orangebg.svg +25 -0
  142. package/dist/views/brand/ogembeds/eliza_ogembed.png +0 -0
  143. package/dist/views/brand/ogembeds/eliza_ogembed.svg +20 -0
  144. package/dist/views/brand/ogembeds/elizacloud_ogembed.png +0 -0
  145. package/dist/views/brand/ogembeds/elizacloud_ogembed.svg +20 -0
  146. package/dist/views/brand/ogembeds/elizaos_ogembed.png +0 -0
  147. package/dist/views/brand/ogembeds/elizaos_ogembed.svg +20 -0
  148. package/dist/views/bundle.js +268 -0
  149. package/dist/views/bundle.js.map +1 -0
  150. package/dist/views/site.webmanifest +19 -0
  151. package/package.json +5 -5
@@ -0,0 +1,261 @@
1
+ import {
2
+ logger as coreLogger,
3
+ validateActionKeywords,
4
+ validateActionRegex
5
+ } from "@elizaos/core";
6
+ import {
7
+ ServiceType,
8
+ TRUST_MARKETPLACE_COMPONENT_TYPE
9
+ } from "../types.js";
10
+ function logValue(value) {
11
+ if (typeof value === "string") return value;
12
+ if (value instanceof Error) return value.stack ?? value.message;
13
+ try {
14
+ return JSON.stringify(value);
15
+ } catch {
16
+ return String(value);
17
+ }
18
+ }
19
+ const logger = {
20
+ debug: (...args) => coreLogger.debug(args.map(logValue).join(" ")),
21
+ error: (...args) => coreLogger.error(args.map(logValue).join(" "))
22
+ };
23
+ function computeRecommenderStats(recommendations) {
24
+ const totalCalls = recommendations.length;
25
+ let buyCalls = 0;
26
+ let sellCalls = 0;
27
+ let profitableCalls = 0;
28
+ let totalProfit = 0;
29
+ let scamsCaught = 0;
30
+ let rugsPromoted = 0;
31
+ let bestCall = null;
32
+ let worstCall = null;
33
+ for (const rec of recommendations) {
34
+ if (rec.recommendationType === "BUY") buyCalls++;
35
+ else sellCalls++;
36
+ if (!rec.metrics) continue;
37
+ const profit = rec.metrics.potentialProfitPercent ?? rec.metrics.avoidedLossPercent ?? 0;
38
+ totalProfit += profit;
39
+ if (profit > 0) profitableCalls++;
40
+ if (rec.metrics.isScamOrRug) {
41
+ if (rec.recommendationType === "SELL") {
42
+ scamsCaught++;
43
+ } else {
44
+ rugsPromoted++;
45
+ }
46
+ }
47
+ const tokenLabel = rec.tokenTicker ?? rec.tokenAddress.slice(0, 8);
48
+ if (!bestCall || profit > bestCall.profit) {
49
+ bestCall = { token: tokenLabel, profit };
50
+ }
51
+ if (!worstCall || profit < worstCall.profit) {
52
+ worstCall = { token: tokenLabel, profit };
53
+ }
54
+ }
55
+ const evaluatedCalls = recommendations.filter((r) => r.metrics).length;
56
+ const winRate = evaluatedCalls > 0 ? profitableCalls / evaluatedCalls : 0;
57
+ const averageProfit = evaluatedCalls > 0 ? totalProfit / evaluatedCalls : 0;
58
+ return {
59
+ totalCalls,
60
+ buyCalls,
61
+ sellCalls,
62
+ profitableCalls,
63
+ winRate,
64
+ averageProfit,
65
+ bestCall,
66
+ worstCall,
67
+ scamsCaught,
68
+ rugsPromoted
69
+ };
70
+ }
71
+ function formatLeaderboardEntry(entry, detailed) {
72
+ const stats = computeRecommenderStats(entry.recommendations);
73
+ const winPct = (stats.winRate * 100).toFixed(1);
74
+ const avgProfitStr = stats.averageProfit >= 0 ? `+${stats.averageProfit.toFixed(1)}%` : `${stats.averageProfit.toFixed(1)}%`;
75
+ let line = `#${entry.rank ?? "?"} ${entry.username ?? entry.userId.slice(0, 8)} \u2014 Trust: ${entry.trustScore.toFixed(1)} | Win Rate: ${winPct}% | Avg P&L: ${avgProfitStr} | Calls: ${stats.totalCalls}`;
76
+ if (detailed) {
77
+ const parts = [];
78
+ parts.push(` Buys: ${stats.buyCalls}, Sells/FUD: ${stats.sellCalls}`);
79
+ parts.push(` Profitable: ${stats.profitableCalls}/${stats.totalCalls}`);
80
+ if (stats.scamsCaught > 0)
81
+ parts.push(` Scams correctly called out: ${stats.scamsCaught}`);
82
+ if (stats.rugsPromoted > 0)
83
+ parts.push(` Rugs promoted (penalty): ${stats.rugsPromoted}`);
84
+ if (stats.bestCall)
85
+ parts.push(
86
+ ` Best call: ${stats.bestCall.token} (${stats.bestCall.profit >= 0 ? "+" : ""}${stats.bestCall.profit.toFixed(1)}%)`
87
+ );
88
+ if (stats.worstCall)
89
+ parts.push(
90
+ ` Worst call: ${stats.worstCall.token} (${stats.worstCall.profit >= 0 ? "+" : ""}${stats.worstCall.profit.toFixed(1)}%)`
91
+ );
92
+ line += `
93
+ ${parts.join("\n")}`;
94
+ }
95
+ return line;
96
+ }
97
+ const socialAlphaProvider = {
98
+ name: "socialAlpha",
99
+ description: "Provides trust scores, win rates, and performance rankings for token recommenders (shill/FUD trackers). Shows whether a person's past calls would have made or lost money.",
100
+ descriptionCompressed: "trust score/win rate/rank for token callers; shill/fud tracker PnL",
101
+ dynamic: true,
102
+ contexts: ["finance", "crypto", "social_posting"],
103
+ contextGate: { anyOf: ["finance", "crypto", "social_posting"] },
104
+ cacheStable: false,
105
+ cacheScope: "turn",
106
+ relevanceKeywords: [
107
+ "socialalpha",
108
+ "socialalphaprovider",
109
+ "plugin",
110
+ "social",
111
+ "alpha",
112
+ "status",
113
+ "state",
114
+ "context",
115
+ "info",
116
+ "details",
117
+ "chat",
118
+ "conversation",
119
+ "agent",
120
+ "room"
121
+ ],
122
+ get: async (runtime, message, _state) => {
123
+ const __providerKeywords = [
124
+ "socialalpha",
125
+ "socialalphaprovider",
126
+ "plugin",
127
+ "social",
128
+ "alpha",
129
+ "status",
130
+ "state",
131
+ "context",
132
+ "info",
133
+ "details",
134
+ "chat",
135
+ "conversation",
136
+ "agent",
137
+ "room"
138
+ ];
139
+ const __providerRegex = new RegExp(
140
+ `\\b(${__providerKeywords.join("|")})\\b`,
141
+ "i"
142
+ );
143
+ const __recentMessages = Array.isArray(_state?.recentMessagesData) ? _state.recentMessagesData : [];
144
+ const __isRelevant = validateActionKeywords(message, __recentMessages, __providerKeywords) || validateActionRegex(message, __recentMessages, __providerRegex);
145
+ if (!__isRelevant) {
146
+ return { text: "" };
147
+ }
148
+ try {
149
+ const service = runtime.getService(
150
+ ServiceType.COMMUNITY_INVESTOR
151
+ );
152
+ if (!service) {
153
+ return {
154
+ text: "",
155
+ values: {}
156
+ };
157
+ }
158
+ const senderId = message.entityId;
159
+ const sections = [];
160
+ let senderProfile = null;
161
+ try {
162
+ const component = await runtime.getComponent(
163
+ senderId,
164
+ TRUST_MARKETPLACE_COMPONENT_TYPE,
165
+ service.componentWorldId,
166
+ runtime.agentId
167
+ );
168
+ if (component?.data) {
169
+ senderProfile = component.data;
170
+ }
171
+ } catch (err) {
172
+ logger.debug(
173
+ `[socialAlphaProvider] No profile for sender ${senderId}: ${err}`
174
+ );
175
+ }
176
+ if (senderProfile && senderProfile.recommendations.length > 0) {
177
+ const stats = computeRecommenderStats(senderProfile.recommendations);
178
+ const winPct = (stats.winRate * 100).toFixed(1);
179
+ const avgProfitStr = stats.averageProfit >= 0 ? `+${stats.averageProfit.toFixed(1)}%` : `${stats.averageProfit.toFixed(1)}%`;
180
+ sections.push(
181
+ `[Current Speaker's Trust Profile]
182
+ Trust Score: ${senderProfile.trustScore.toFixed(1)}/100
183
+ Win Rate: ${winPct}% (${stats.profitableCalls}/${stats.totalCalls} calls)
184
+ Avg P&L: ${avgProfitStr}
185
+ Buy calls: ${stats.buyCalls} | Sell/FUD calls: ${stats.sellCalls}
186
+ ` + (stats.scamsCaught > 0 ? `Scams correctly identified: ${stats.scamsCaught}
187
+ ` : "") + (stats.rugsPromoted > 0 ? `Rugs promoted (trust penalty): ${stats.rugsPromoted}
188
+ ` : "") + (stats.bestCall ? `Best call: ${stats.bestCall.token} (${stats.bestCall.profit >= 0 ? "+" : ""}${stats.bestCall.profit.toFixed(1)}%)` : "")
189
+ );
190
+ }
191
+ let leaderboard = [];
192
+ try {
193
+ leaderboard = await service.getLeaderboardData(runtime);
194
+ } catch (err) {
195
+ logger.debug(
196
+ `[socialAlphaProvider] Error fetching leaderboard: ${err}`
197
+ );
198
+ }
199
+ if (leaderboard.length > 0) {
200
+ const TOP_N = 5;
201
+ const BOTTOM_N = 3;
202
+ const top = leaderboard.slice(0, TOP_N);
203
+ const bottom = leaderboard.length > TOP_N ? leaderboard.slice(-BOTTOM_N) : [];
204
+ const topLines = top.map((e) => formatLeaderboardEntry(e, false));
205
+ let leaderboardText = `[Social Alpha Leaderboard \u2014 ${leaderboard.length} tracked recommenders]
206
+ `;
207
+ leaderboardText += `Top Callers:
208
+ ${topLines.join("\n")}`;
209
+ if (bottom.length > 0) {
210
+ const bottomLines = bottom.map(
211
+ (e) => formatLeaderboardEntry(e, false)
212
+ );
213
+ leaderboardText += `
214
+
215
+ Lowest Trust:
216
+ ${bottomLines.join("\n")}`;
217
+ }
218
+ if (senderProfile) {
219
+ const senderEntry = leaderboard.find((e) => e.userId === senderId);
220
+ if (senderEntry?.rank) {
221
+ leaderboardText += `
222
+
223
+ Current speaker's rank: #${senderEntry.rank} of ${leaderboard.length}`;
224
+ }
225
+ }
226
+ sections.push(leaderboardText);
227
+ }
228
+ if (sections.length === 0) {
229
+ return { text: "", values: {} };
230
+ }
231
+ const fullText = sections.join("\n\n");
232
+ const values = {};
233
+ if (senderProfile) {
234
+ values.senderTrustScore = senderProfile.trustScore.toFixed(1);
235
+ values.senderTotalCalls = String(senderProfile.recommendations.length);
236
+ const senderStats = computeRecommenderStats(
237
+ senderProfile.recommendations
238
+ );
239
+ values.senderWinRate = (senderStats.winRate * 100).toFixed(1);
240
+ values.senderAvgProfit = senderStats.averageProfit.toFixed(1);
241
+ }
242
+ values.trackedRecommenders = String(leaderboard.length);
243
+ return {
244
+ text: fullText,
245
+ values
246
+ };
247
+ } catch (error) {
248
+ logger.error(
249
+ "[socialAlphaProvider] Error generating provider data:",
250
+ error
251
+ );
252
+ return { text: "", values: {} };
253
+ }
254
+ }
255
+ };
256
+ var socialAlphaProvider_default = socialAlphaProvider;
257
+ export {
258
+ socialAlphaProvider_default as default,
259
+ socialAlphaProvider
260
+ };
261
+ //# sourceMappingURL=socialAlphaProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/providers/socialAlphaProvider.ts"],"sourcesContent":["import type {\n\tIAgentRuntime,\n\tMemory,\n\tProvider,\n\tProviderResult,\n\tState,\n} from \"@elizaos/core\";\nimport {\n\tlogger as coreLogger,\n\tvalidateActionKeywords,\n\tvalidateActionRegex,\n} from \"@elizaos/core\";\nimport type { CommunityInvestorService } from \"../service.js\";\nimport {\n\ttype LeaderboardEntry,\n\ttype Recommendation,\n\tServiceType,\n\tTRUST_MARKETPLACE_COMPONENT_TYPE,\n\ttype UserTrustProfile,\n} from \"../types.js\";\n\nfunction logValue(value: unknown): string {\n\tif (typeof value === \"string\") return value;\n\tif (value instanceof Error) return value.stack ?? value.message;\n\ttry {\n\t\treturn JSON.stringify(value);\n\t} catch {\n\t\treturn String(value);\n\t}\n}\n\nconst logger = {\n\tdebug: (...args: unknown[]) => coreLogger.debug(args.map(logValue).join(\" \")),\n\terror: (...args: unknown[]) => coreLogger.error(args.map(logValue).join(\" \")),\n};\n\n/**\n * Compute summary stats for a set of recommendations.\n */\nfunction computeRecommenderStats(recommendations: Recommendation[]): {\n\ttotalCalls: number;\n\tbuyCalls: number;\n\tsellCalls: number;\n\tprofitableCalls: number;\n\twinRate: number;\n\taverageProfit: number;\n\tbestCall: { token: string; profit: number } | null;\n\tworstCall: { token: string; profit: number } | null;\n\tscamsCaught: number;\n\trugsPromoted: number;\n} {\n\tconst totalCalls = recommendations.length;\n\tlet buyCalls = 0;\n\tlet sellCalls = 0;\n\tlet profitableCalls = 0;\n\tlet totalProfit = 0;\n\tlet scamsCaught = 0;\n\tlet rugsPromoted = 0;\n\tlet bestCall: { token: string; profit: number } | null = null;\n\tlet worstCall: { token: string; profit: number } | null = null;\n\n\tfor (const rec of recommendations) {\n\t\tif (rec.recommendationType === \"BUY\") buyCalls++;\n\t\telse sellCalls++;\n\n\t\tif (!rec.metrics) continue;\n\n\t\tconst profit =\n\t\t\trec.metrics.potentialProfitPercent ?? rec.metrics.avoidedLossPercent ?? 0;\n\t\ttotalProfit += profit;\n\n\t\tif (profit > 0) profitableCalls++;\n\n\t\tif (rec.metrics.isScamOrRug) {\n\t\t\tif (rec.recommendationType === \"SELL\") {\n\t\t\t\tscamsCaught++;\n\t\t\t} else {\n\t\t\t\trugsPromoted++;\n\t\t\t}\n\t\t}\n\n\t\tconst tokenLabel = rec.tokenTicker ?? rec.tokenAddress.slice(0, 8);\n\t\tif (!bestCall || profit > bestCall.profit) {\n\t\t\tbestCall = { token: tokenLabel, profit };\n\t\t}\n\t\tif (!worstCall || profit < worstCall.profit) {\n\t\t\tworstCall = { token: tokenLabel, profit };\n\t\t}\n\t}\n\n\tconst evaluatedCalls = recommendations.filter((r) => r.metrics).length;\n\tconst winRate = evaluatedCalls > 0 ? profitableCalls / evaluatedCalls : 0;\n\tconst averageProfit = evaluatedCalls > 0 ? totalProfit / evaluatedCalls : 0;\n\n\treturn {\n\t\ttotalCalls,\n\t\tbuyCalls,\n\t\tsellCalls,\n\t\tprofitableCalls,\n\t\twinRate,\n\t\taverageProfit,\n\t\tbestCall,\n\t\tworstCall,\n\t\tscamsCaught,\n\t\trugsPromoted,\n\t};\n}\n\n/**\n * Format a single leaderboard entry into readable text.\n */\nfunction formatLeaderboardEntry(\n\tentry: LeaderboardEntry,\n\tdetailed: boolean,\n): string {\n\tconst stats = computeRecommenderStats(entry.recommendations);\n\tconst winPct = (stats.winRate * 100).toFixed(1);\n\tconst avgProfitStr =\n\t\tstats.averageProfit >= 0\n\t\t\t? `+${stats.averageProfit.toFixed(1)}%`\n\t\t\t: `${stats.averageProfit.toFixed(1)}%`;\n\n\tlet line = `#${entry.rank ?? \"?\"} ${entry.username ?? entry.userId.slice(0, 8)} — Trust: ${entry.trustScore.toFixed(1)} | Win Rate: ${winPct}% | Avg P&L: ${avgProfitStr} | Calls: ${stats.totalCalls}`;\n\n\tif (detailed) {\n\t\tconst parts: string[] = [];\n\t\tparts.push(` Buys: ${stats.buyCalls}, Sells/FUD: ${stats.sellCalls}`);\n\t\tparts.push(` Profitable: ${stats.profitableCalls}/${stats.totalCalls}`);\n\t\tif (stats.scamsCaught > 0)\n\t\t\tparts.push(` Scams correctly called out: ${stats.scamsCaught}`);\n\t\tif (stats.rugsPromoted > 0)\n\t\t\tparts.push(` Rugs promoted (penalty): ${stats.rugsPromoted}`);\n\t\tif (stats.bestCall)\n\t\t\tparts.push(\n\t\t\t\t` Best call: ${stats.bestCall.token} (${stats.bestCall.profit >= 0 ? \"+\" : \"\"}${stats.bestCall.profit.toFixed(1)}%)`,\n\t\t\t);\n\t\tif (stats.worstCall)\n\t\t\tparts.push(\n\t\t\t\t` Worst call: ${stats.worstCall.token} (${stats.worstCall.profit >= 0 ? \"+\" : \"\"}${stats.worstCall.profit.toFixed(1)}%)`,\n\t\t\t);\n\t\tline += `\\n${parts.join(\"\\n\")}`;\n\t}\n\n\treturn line;\n}\n\n/**\n * socialAlphaProvider — Injects trust-score intelligence into agent context.\n *\n * When the agent processes a message, this provider:\n * 1. Looks up the sender's trust profile (if they have one).\n * 2. Provides a compact leaderboard summary (top callers + bottom callers).\n * 3. Surfaces win rate, rank, avg P&L, scam detection stats.\n *\n * The agent can use this data to weigh recommendations, respond with trust\n * context, or decline to act on low-trust callers.\n */\nexport const socialAlphaProvider: Provider = {\n\tname: \"socialAlpha\",\n\tdescription:\n\t\t\"Provides trust scores, win rates, and performance rankings for token recommenders (shill/FUD trackers). \" +\n\t\t\"Shows whether a person's past calls would have made or lost money.\",\n\tdescriptionCompressed:\n\t\t\"trust score/win rate/rank for token callers; shill/fud tracker PnL\",\n\n\tdynamic: true,\n\tcontexts: [\"finance\", \"crypto\", \"social_posting\"],\n\tcontextGate: { anyOf: [\"finance\", \"crypto\", \"social_posting\"] },\n\tcacheStable: false,\n\tcacheScope: \"turn\",\n\trelevanceKeywords: [\n\t\t\"socialalpha\",\n\t\t\"socialalphaprovider\",\n\t\t\"plugin\",\n\t\t\"social\",\n\t\t\"alpha\",\n\t\t\"status\",\n\t\t\"state\",\n\t\t\"context\",\n\t\t\"info\",\n\t\t\"details\",\n\t\t\"chat\",\n\t\t\"conversation\",\n\t\t\"agent\",\n\t\t\"room\",\n\t],\n\tget: async (\n\t\truntime: IAgentRuntime,\n\t\tmessage: Memory,\n\t\t_state: State,\n\t): Promise<ProviderResult> => {\n\t\tconst __providerKeywords = [\n\t\t\t\"socialalpha\",\n\t\t\t\"socialalphaprovider\",\n\t\t\t\"plugin\",\n\t\t\t\"social\",\n\t\t\t\"alpha\",\n\t\t\t\"status\",\n\t\t\t\"state\",\n\t\t\t\"context\",\n\t\t\t\"info\",\n\t\t\t\"details\",\n\t\t\t\"chat\",\n\t\t\t\"conversation\",\n\t\t\t\"agent\",\n\t\t\t\"room\",\n\t\t];\n\t\tconst __providerRegex = new RegExp(\n\t\t\t`\\\\b(${__providerKeywords.join(\"|\")})\\\\b`,\n\t\t\t\"i\",\n\t\t);\n\t\tconst __recentMessages = Array.isArray(_state?.recentMessagesData)\n\t\t\t? (_state.recentMessagesData as Memory[])\n\t\t\t: [];\n\t\tconst __isRelevant =\n\t\t\tvalidateActionKeywords(message, __recentMessages, __providerKeywords) ||\n\t\t\tvalidateActionRegex(message, __recentMessages, __providerRegex);\n\t\tif (!__isRelevant) {\n\t\t\treturn { text: \"\" };\n\t\t}\n\n\t\ttry {\n\t\t\tconst service = runtime.getService<CommunityInvestorService>(\n\t\t\t\tServiceType.COMMUNITY_INVESTOR,\n\t\t\t);\n\n\t\t\tif (!service) {\n\t\t\t\treturn {\n\t\t\t\t\ttext: \"\",\n\t\t\t\t\tvalues: {},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst senderId = message.entityId;\n\t\t\tconst sections: string[] = [];\n\n\t\t\t// --- Sender's Trust Profile ---\n\t\t\tlet senderProfile: UserTrustProfile | null = null;\n\t\t\ttry {\n\t\t\t\tconst component = await runtime.getComponent(\n\t\t\t\t\tsenderId,\n\t\t\t\t\tTRUST_MARKETPLACE_COMPONENT_TYPE,\n\t\t\t\t\tservice.componentWorldId,\n\t\t\t\t\truntime.agentId,\n\t\t\t\t);\n\t\t\t\tif (component?.data) {\n\t\t\t\t\tsenderProfile = component.data as UserTrustProfile;\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tlogger.debug(\n\t\t\t\t\t`[socialAlphaProvider] No profile for sender ${senderId}: ${err}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (senderProfile && senderProfile.recommendations.length > 0) {\n\t\t\t\tconst stats = computeRecommenderStats(senderProfile.recommendations);\n\t\t\t\tconst winPct = (stats.winRate * 100).toFixed(1);\n\t\t\t\tconst avgProfitStr =\n\t\t\t\t\tstats.averageProfit >= 0\n\t\t\t\t\t\t? `+${stats.averageProfit.toFixed(1)}%`\n\t\t\t\t\t\t: `${stats.averageProfit.toFixed(1)}%`;\n\n\t\t\t\tsections.push(\n\t\t\t\t\t`[Current Speaker's Trust Profile]\\n` +\n\t\t\t\t\t\t`Trust Score: ${senderProfile.trustScore.toFixed(1)}/100\\n` +\n\t\t\t\t\t\t`Win Rate: ${winPct}% (${stats.profitableCalls}/${stats.totalCalls} calls)\\n` +\n\t\t\t\t\t\t`Avg P&L: ${avgProfitStr}\\n` +\n\t\t\t\t\t\t`Buy calls: ${stats.buyCalls} | Sell/FUD calls: ${stats.sellCalls}\\n` +\n\t\t\t\t\t\t(stats.scamsCaught > 0\n\t\t\t\t\t\t\t? `Scams correctly identified: ${stats.scamsCaught}\\n`\n\t\t\t\t\t\t\t: \"\") +\n\t\t\t\t\t\t(stats.rugsPromoted > 0\n\t\t\t\t\t\t\t? `Rugs promoted (trust penalty): ${stats.rugsPromoted}\\n`\n\t\t\t\t\t\t\t: \"\") +\n\t\t\t\t\t\t(stats.bestCall\n\t\t\t\t\t\t\t? `Best call: ${stats.bestCall.token} (${stats.bestCall.profit >= 0 ? \"+\" : \"\"}${stats.bestCall.profit.toFixed(1)}%)`\n\t\t\t\t\t\t\t: \"\"),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// --- Leaderboard Summary ---\n\t\t\tlet leaderboard: LeaderboardEntry[] = [];\n\t\t\ttry {\n\t\t\t\tleaderboard = await service.getLeaderboardData(runtime);\n\t\t\t} catch (err) {\n\t\t\t\tlogger.debug(\n\t\t\t\t\t`[socialAlphaProvider] Error fetching leaderboard: ${err}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (leaderboard.length > 0) {\n\t\t\t\tconst TOP_N = 5;\n\t\t\t\tconst BOTTOM_N = 3;\n\n\t\t\t\tconst top = leaderboard.slice(0, TOP_N);\n\t\t\t\tconst bottom =\n\t\t\t\t\tleaderboard.length > TOP_N ? leaderboard.slice(-BOTTOM_N) : [];\n\n\t\t\t\tconst topLines = top.map((e) => formatLeaderboardEntry(e, false));\n\n\t\t\t\tlet leaderboardText = `[Social Alpha Leaderboard — ${leaderboard.length} tracked recommenders]\\n`;\n\t\t\t\tleaderboardText += `Top Callers:\\n${topLines.join(\"\\n\")}`;\n\n\t\t\t\tif (bottom.length > 0) {\n\t\t\t\t\tconst bottomLines = bottom.map((e) =>\n\t\t\t\t\t\tformatLeaderboardEntry(e, false),\n\t\t\t\t\t);\n\t\t\t\t\tleaderboardText += `\\n\\nLowest Trust:\\n${bottomLines.join(\"\\n\")}`;\n\t\t\t\t}\n\n\t\t\t\t// Find sender's rank\n\t\t\t\tif (senderProfile) {\n\t\t\t\t\tconst senderEntry = leaderboard.find((e) => e.userId === senderId);\n\t\t\t\t\tif (senderEntry?.rank) {\n\t\t\t\t\t\tleaderboardText += `\\n\\nCurrent speaker's rank: #${senderEntry.rank} of ${leaderboard.length}`;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsections.push(leaderboardText);\n\t\t\t}\n\n\t\t\tif (sections.length === 0) {\n\t\t\t\treturn { text: \"\", values: {} };\n\t\t\t}\n\n\t\t\tconst fullText = sections.join(\"\\n\\n\");\n\n\t\t\t// Build structured values for programmatic access\n\t\t\tconst values: Record<string, string> = {};\n\t\t\tif (senderProfile) {\n\t\t\t\tvalues.senderTrustScore = senderProfile.trustScore.toFixed(1);\n\t\t\t\tvalues.senderTotalCalls = String(senderProfile.recommendations.length);\n\t\t\t\tconst senderStats = computeRecommenderStats(\n\t\t\t\t\tsenderProfile.recommendations,\n\t\t\t\t);\n\t\t\t\tvalues.senderWinRate = (senderStats.winRate * 100).toFixed(1);\n\t\t\t\tvalues.senderAvgProfit = senderStats.averageProfit.toFixed(1);\n\t\t\t}\n\t\t\tvalues.trackedRecommenders = String(leaderboard.length);\n\n\t\t\treturn {\n\t\t\t\ttext: fullText,\n\t\t\t\tvalues,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tlogger.error(\n\t\t\t\t\"[socialAlphaProvider] Error generating provider data:\",\n\t\t\t\terror,\n\t\t\t);\n\t\t\treturn { text: \"\", values: {} };\n\t\t}\n\t},\n};\n\nexport default socialAlphaProvider;\n"],"mappings":"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","names":[]}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Register the Social Alpha leaderboard view for terminal rendering.
3
+ *
4
+ * The agent terminal mounts plugin views by id from the `@elizaos/ui/spatial/tui`
5
+ * terminal registry. This makes the leaderboard's `tui` modality render for real
6
+ * in the terminal (the unified {@link SocialAlphaSpatialView}) rather than only
7
+ * navigating a GUI shell. A module-level snapshot lets a host push live data;
8
+ * absent a push it defaults to the loading state.
9
+ */
10
+ import { type SocialAlphaSnapshot } from "./frontend/SocialAlphaSpatialView.tsx";
11
+ /** Update the snapshot the registered terminal view renders from. */
12
+ export declare function setSocialAlphaTerminalSnapshot(next: SocialAlphaSnapshot): void;
13
+ /** Register the Social Alpha terminal view; returns an unregister function. */
14
+ export declare function registerSocialAlphaTerminalView(): () => void;
15
+ //# sourceMappingURL=register-terminal-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-terminal-view.d.ts","sourceRoot":"","sources":["../src/register-terminal-view.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAEN,KAAK,mBAAmB,EAExB,MAAM,uCAAuC,CAAC;AAI/C,qEAAqE;AACrE,wBAAgB,8BAA8B,CAC7C,IAAI,EAAE,mBAAmB,GACvB,IAAI,CAEN;AAED,+EAA+E;AAC/E,wBAAgB,+BAA+B,IAAI,MAAM,IAAI,CAI5D"}
@@ -0,0 +1,21 @@
1
+ import { registerSpatialTerminalView } from "@elizaos/ui/spatial/tui";
2
+ import { createElement } from "react";
3
+ import {
4
+ EMPTY_SOCIAL_ALPHA_SNAPSHOT,
5
+ SocialAlphaSpatialView
6
+ } from "./frontend/SocialAlphaSpatialView.js";
7
+ let current = EMPTY_SOCIAL_ALPHA_SNAPSHOT;
8
+ function setSocialAlphaTerminalSnapshot(next) {
9
+ current = next;
10
+ }
11
+ function registerSocialAlphaTerminalView() {
12
+ return registerSpatialTerminalView(
13
+ "social-alpha",
14
+ () => createElement(SocialAlphaSpatialView, { snapshot: current })
15
+ );
16
+ }
17
+ export {
18
+ registerSocialAlphaTerminalView,
19
+ setSocialAlphaTerminalSnapshot
20
+ };
21
+ //# sourceMappingURL=register-terminal-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/register-terminal-view.tsx"],"sourcesContent":["/**\n * Register the Social Alpha leaderboard view for terminal rendering.\n *\n * The agent terminal mounts plugin views by id from the `@elizaos/ui/spatial/tui`\n * terminal registry. This makes the leaderboard's `tui` modality render for real\n * in the terminal (the unified {@link SocialAlphaSpatialView}) rather than only\n * navigating a GUI shell. A module-level snapshot lets a host push live data;\n * absent a push it defaults to the loading state.\n */\n\nimport { registerSpatialTerminalView } from \"@elizaos/ui/spatial/tui\";\nimport { createElement } from \"react\";\nimport {\n\tEMPTY_SOCIAL_ALPHA_SNAPSHOT,\n\ttype SocialAlphaSnapshot,\n\tSocialAlphaSpatialView,\n} from \"./frontend/SocialAlphaSpatialView.js\";\n\nlet current: SocialAlphaSnapshot = EMPTY_SOCIAL_ALPHA_SNAPSHOT;\n\n/** Update the snapshot the registered terminal view renders from. */\nexport function setSocialAlphaTerminalSnapshot(\n\tnext: SocialAlphaSnapshot,\n): void {\n\tcurrent = next;\n}\n\n/** Register the Social Alpha terminal view; returns an unregister function. */\nexport function registerSocialAlphaTerminalView(): () => void {\n\treturn registerSpatialTerminalView(\"social-alpha\", () =>\n\t\tcreateElement(SocialAlphaSpatialView, { snapshot: current }),\n\t);\n}\n"],"mappings":"AAUA,SAAS,mCAAmC;AAC5C,SAAS,qBAAqB;AAC9B;AAAA,EACC;AAAA,EAEA;AAAA,OACM;AAEP,IAAI,UAA+B;AAG5B,SAAS,+BACf,MACO;AACP,YAAU;AACX;AAGO,SAAS,kCAA8C;AAC7D,SAAO;AAAA,IAA4B;AAAA,IAAgB,MAClD,cAAc,wBAAwB,EAAE,UAAU,QAAQ,CAAC;AAAA,EAC5D;AACD;","names":[]}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Side-effect entry point — registers the Social Alpha view for terminal
3
+ * rendering.
4
+ *
5
+ * In a terminal host (the Node agent, no DOM), register the leaderboard view so
6
+ * it renders inline in the terminal. Lazy + DOM-guarded so the terminal engine
7
+ * stays out of browser/mobile bundles. Web, iOS, desktop, and Android leave this
8
+ * a no-op (a DOM is present), so the same import is safe everywhere.
9
+ */
10
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,5 @@
1
+ if (typeof window === "undefined") {
2
+ void import("./register-terminal-view.js").then((m) => m.registerSocialAlphaTerminalView()).catch(() => {
3
+ });
4
+ }
5
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/register.ts"],"sourcesContent":["/**\n * Side-effect entry point — registers the Social Alpha view for terminal\n * rendering.\n *\n * In a terminal host (the Node agent, no DOM), register the leaderboard view so\n * it renders inline in the terminal. Lazy + DOM-guarded so the terminal engine\n * stays out of browser/mobile bundles. Web, iOS, desktop, and Android leave this\n * a no-op (a DOM is present), so the same import is safe everywhere.\n */\n\nif (typeof window === \"undefined\") {\n\tvoid import(\"./register-terminal-view.js\")\n\t\t.then((m) => m.registerSocialAlphaTerminalView())\n\t\t.catch(() => {\n\t\t\t// Terminal rendering is best-effort; never block plugin load.\n\t\t});\n}\n"],"mappings":"AAUA,IAAI,OAAO,WAAW,aAAa;AAClC,OAAK,OAAO,6BAA6B,EACvC,KAAK,CAAC,MAAM,EAAE,gCAAgC,CAAC,EAC/C,MAAM,MAAM;AAAA,EAEb,CAAC;AACH;","names":[]}
@@ -0,0 +1,57 @@
1
+ import type { Entity } from "@elizaos/core";
2
+ import type { PositionWithBalance, RecommenderMetrics, RecommenderMetricsHistory, TokenPerformance, Transaction } from "./types";
3
+ /**
4
+ * Formats a full report based on the provided data.
5
+ *
6
+ * @param {TokenPerformance[]} tokens - Array of token performance data.
7
+ * @param {PositionWithBalance[]} positions - Array of positions with balance data.
8
+ * @param {Transaction[]} transactions - Array of transactions data.
9
+ * @returns {{
10
+ * tokenReports: Object[],
11
+ * positionReports: Object[],
12
+ * totalCurrentValue: string,
13
+ * totalRealizedPnL: string,
14
+ * totalUnrealizedPnL: string,
15
+ * totalPnL: string,
16
+ * positionsWithBalance: Object[],
17
+ * }} Formatted full report containing token reports, position reports, total values, and positions with balance.
18
+ */
19
+ export declare function formatFullReport(tokens: TokenPerformance[], positions: PositionWithBalance[], transactions: Transaction[]): {
20
+ tokenReports: string[];
21
+ positionReports: string[];
22
+ totalCurrentValue: string;
23
+ totalRealizedPnL: string;
24
+ totalUnrealizedPnL: string;
25
+ totalPnL: string;
26
+ positionsWithBalance: {
27
+ position: PositionWithBalance;
28
+ token: TokenPerformance;
29
+ transactions: Transaction[];
30
+ }[];
31
+ };
32
+ /**
33
+ * Formats the recommender profile for a given entity based on the provided metrics and history.
34
+ * @param {Entity} entity - The entity for which the profile is being formatted.
35
+ * @param {RecommenderMetrics} metrics - The metrics related to the recommendations for the entity.
36
+ * @param {RecommenderMetricsHistory[]} history - The history of metrics for the entity.
37
+ * @returns {string} The formatted recommender profile string.
38
+ */
39
+ export declare function formatRecommenderProfile(entity: Entity, metrics: RecommenderMetrics, history: RecommenderMetricsHistory[]): string;
40
+ /**
41
+ * Formats a recommender report for an entity with provided metrics and history.
42
+ * @param {Entity} entity - The entity for which the report is being generated.
43
+ * @param {RecommenderMetrics} metrics - The metrics for the entity's recommendations.
44
+ * @param {RecommenderMetricsHistory[]} history - The historical metrics for the entity's recommendations.
45
+ * @returns {string} The formatted recommender report.
46
+ */
47
+ export declare function formatRecommenderReport(entity: Entity, metrics: RecommenderMetrics, history: RecommenderMetricsHistory[]): string;
48
+ /**
49
+ * Formats the top recommenders overview based on the provided data.
50
+ *
51
+ * @param {Entity[]} recommenders - The list of recommenders to be formatted
52
+ * @param {Map<string, RecommenderMetrics>} metrics - The map of recommender metrics
53
+ * @param {Map<string, RecommenderMetricsHistory[]>} history - The map of historical metrics data
54
+ * @returns {string} The formatted top recommenders overview
55
+ */
56
+ export declare function formatTopRecommendersOverview(recommenders: Entity[], metrics: Map<string, RecommenderMetrics>, history: Map<string, RecommenderMetricsHistory[]>): string;
57
+ //# sourceMappingURL=reports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reports.d.ts","sourceRoot":"","sources":["../src/reports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAGX,mBAAmB,EACnB,kBAAkB,EAClB,yBAAyB,EACzB,gBAAgB,EAEhB,WAAW,EACX,MAAM,SAAS,CAAC;AAoTjB;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAC/B,MAAM,EAAE,gBAAgB,EAAE,EAC1B,SAAS,EAAE,mBAAmB,EAAE,EAChC,YAAY,EAAE,WAAW,EAAE;;;;;;;;;;;;EAmE3B;AAmPD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACvC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,yBAAyB,EAAE,GAClC,MAAM,CA0BR;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACtC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,yBAAyB,EAAE,GAClC,MAAM,CAsDR;AAED;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAC5C,YAAY,EAAE,MAAM,EAAE,EACtB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,EACxC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,yBAAyB,EAAE,CAAC,GAC/C,MAAM,CAwCR"}