@elizaos/plugin-social-alpha 2.0.3-beta.6 → 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,151 @@
1
+ import { z } from "zod";
2
+ import type { Transaction } from "./types";
3
+ /**
4
+ * Core schema definitions for community-trader plugin
5
+ * This approach provides runtime validation and better type safety
6
+ */
7
+ export declare const TransactionType: {
8
+ readonly BUY: "BUY";
9
+ readonly SELL: "SELL";
10
+ readonly TRANSFER_IN: "transfer_in";
11
+ readonly TRANSFER_OUT: "transfer_out";
12
+ };
13
+ export declare const tokenPerformanceSchema: z.ZodObject<{
14
+ chain: z.ZodDefault<z.ZodString>;
15
+ address: z.ZodString;
16
+ name: z.ZodDefault<z.ZodOptional<z.ZodString>>;
17
+ symbol: z.ZodString;
18
+ decimals: z.ZodDefault<z.ZodNumber>;
19
+ metadata: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>>>;
20
+ price: z.ZodDefault<z.ZodNumber>;
21
+ volume: z.ZodDefault<z.ZodNumber>;
22
+ trades: z.ZodDefault<z.ZodNumber>;
23
+ liquidity: z.ZodDefault<z.ZodNumber>;
24
+ holders: z.ZodDefault<z.ZodNumber>;
25
+ price24hChange: z.ZodDefault<z.ZodNumber>;
26
+ volume24hChange: z.ZodDefault<z.ZodNumber>;
27
+ trades24hChange: z.ZodDefault<z.ZodNumber>;
28
+ holders24hChange: z.ZodDefault<z.ZodNumber>;
29
+ initialMarketCap: z.ZodDefault<z.ZodNumber>;
30
+ currentMarketCap: z.ZodDefault<z.ZodNumber>;
31
+ rugPull: z.ZodDefault<z.ZodBoolean>;
32
+ isScam: z.ZodDefault<z.ZodBoolean>;
33
+ sustainedGrowth: z.ZodDefault<z.ZodBoolean>;
34
+ rapidDump: z.ZodDefault<z.ZodBoolean>;
35
+ suspiciousVolume: z.ZodDefault<z.ZodBoolean>;
36
+ validationTrust: z.ZodDefault<z.ZodNumber>;
37
+ createdAt: z.ZodDefault<z.ZodDate>;
38
+ updatedAt: z.ZodDefault<z.ZodDate>;
39
+ }, z.core.$strip>;
40
+ export declare const transactionSchema: z.ZodObject<{
41
+ id: z.ZodString;
42
+ positionId: z.ZodString;
43
+ chain: z.ZodDefault<z.ZodString>;
44
+ tokenAddress: z.ZodString;
45
+ transactionHash: z.ZodString;
46
+ type: z.ZodEnum<{
47
+ BUY: "BUY";
48
+ SELL: "SELL";
49
+ }>;
50
+ amount: z.ZodNumber;
51
+ price: z.ZodOptional<z.ZodNumber>;
52
+ isSimulation: z.ZodDefault<z.ZodBoolean>;
53
+ timestamp: z.ZodString;
54
+ }, z.core.$strip>;
55
+ export declare const recommenderMetricsSchema: z.ZodObject<{
56
+ entityId: z.ZodString;
57
+ trustScore: z.ZodNumber;
58
+ totalRecommendations: z.ZodNumber;
59
+ successfulRecs: z.ZodNumber;
60
+ avgTokenPerformance: z.ZodNumber;
61
+ riskScore: z.ZodNumber;
62
+ consistencyScore: z.ZodNumber;
63
+ virtualConfidence: z.ZodNumber;
64
+ lastActiveDate: z.ZodDate;
65
+ trustDecay: z.ZodNumber;
66
+ updatedAt: z.ZodDefault<z.ZodOptional<z.ZodDate>>;
67
+ }, z.core.$strip>;
68
+ export declare const positionSchema: z.ZodObject<{
69
+ id: z.ZodString;
70
+ chain: z.ZodString;
71
+ tokenAddress: z.ZodString;
72
+ walletAddress: z.ZodString;
73
+ isSimulation: z.ZodBoolean;
74
+ entityId: z.ZodString;
75
+ recommendationId: z.ZodString;
76
+ initialPrice: z.ZodString;
77
+ initialMarketCap: z.ZodString;
78
+ initialLiquidity: z.ZodString;
79
+ performanceScore: z.ZodNumber;
80
+ rapidDump: z.ZodBoolean;
81
+ openedAt: z.ZodDate;
82
+ closedAt: z.ZodOptional<z.ZodDate>;
83
+ updatedAt: z.ZodDate;
84
+ amount: z.ZodString;
85
+ entryPrice: z.ZodString;
86
+ currentPrice: z.ZodString;
87
+ }, z.core.$strip>;
88
+ export declare const tokenRecommendationSchema: z.ZodObject<{
89
+ id: z.ZodString;
90
+ entityId: z.ZodString;
91
+ chain: z.ZodString;
92
+ tokenAddress: z.ZodString;
93
+ type: z.ZodString;
94
+ conviction: z.ZodString;
95
+ initialMarketCap: z.ZodString;
96
+ initialLiquidity: z.ZodString;
97
+ initialPrice: z.ZodString;
98
+ marketCap: z.ZodString;
99
+ liquidity: z.ZodString;
100
+ price: z.ZodString;
101
+ rugPull: z.ZodBoolean;
102
+ isScam: z.ZodBoolean;
103
+ riskScore: z.ZodNumber;
104
+ performanceScore: z.ZodNumber;
105
+ metadata: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>>>;
106
+ status: z.ZodEnum<{
107
+ ACTIVE: "ACTIVE";
108
+ COMPLETED: "COMPLETED";
109
+ EXPIRED: "EXPIRED";
110
+ WITHDRAWN: "WITHDRAWN";
111
+ }>;
112
+ createdAt: z.ZodDate;
113
+ updatedAt: z.ZodDate;
114
+ }, z.core.$strip>;
115
+ export type TokenPerformance = z.infer<typeof tokenPerformanceSchema>;
116
+ export type RecommenderMetrics = z.infer<typeof recommenderMetricsSchema>;
117
+ export type Position = z.infer<typeof positionSchema>;
118
+ export type TokenRecommendation = z.infer<typeof tokenRecommendationSchema>;
119
+ /**
120
+ * Transform functions to convert database objects to schema-validated objects
121
+ */
122
+ export declare function transformTokenPerformance(dbToken: Record<string, unknown>, chain?: string): TokenPerformance;
123
+ export declare function transformTransaction(dbTx: Record<string, unknown>, positionId?: string, chain?: string): Transaction;
124
+ export declare function transformPosition(dbPos: Record<string, unknown>): Position;
125
+ /**
126
+ * Type definition for MessageRecommendation based on the schema recommendationSchema
127
+ */
128
+ export type MessageRecommendation = z.infer<typeof recommendationSchema>;
129
+ /**
130
+ * Schema for extracting trading recommendations from conversational text, capturing the key components of who made the recommendation, what asset was discussed, what action was recommended, and how strongly it was recommended
131
+ */
132
+ export declare const recommendationSchema: z.ZodObject<{
133
+ username: z.ZodString;
134
+ ticker: z.ZodNullable<z.ZodOptional<z.ZodString>>;
135
+ tokenAddress: z.ZodNullable<z.ZodOptional<z.ZodString>>;
136
+ type: z.ZodEnum<{
137
+ BUY: "BUY";
138
+ SELL: "SELL";
139
+ DONT_BUY: "DONT_BUY";
140
+ DONT_SELL: "DONT_SELL";
141
+ NONE: "NONE";
142
+ }>;
143
+ conviction: z.ZodEnum<{
144
+ NONE: "NONE";
145
+ LOW: "LOW";
146
+ MEDIUM: "MEDIUM";
147
+ HIGH: "HIGH";
148
+ }>;
149
+ }, z.core.$strip>;
150
+ export declare function transformTokenRecommendation(dbRec: Record<string, unknown>): TokenRecommendation;
151
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAEX,WAAW,EACX,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AAGH,eAAO,MAAM,eAAe;;;;;CAKlB,CAAC;AAGX,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+BjC,CAAC;AAGH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;iBAc5B,CAAC;AAoBH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;iBAenC,CAAC;AAGH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;iBAoBzB,CAAC;AAGH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;iBA0BpC,CAAC;AAGH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAC1E,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E;;GAEG;AAEH,wBAAgB,yBAAyB,CACxC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,KAAK,SAAY,GACf,gBAAgB,CAqDlB;AAED,wBAAgB,oBAAoB,CACnC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,UAAU,SAAY,EACtB,KAAK,SAAY,GACf,WAAW,CAqCb;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,QAAQ,CAgE1E;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEzE;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;iBAsC/B,CAAC;AAEH,wBAAgB,4BAA4B,CAC3C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,mBAAmB,CAkCrB"}
@@ -0,0 +1,258 @@
1
+ import { z } from "zod";
2
+ const TransactionType = {
3
+ BUY: "BUY",
4
+ SELL: "SELL",
5
+ TRANSFER_IN: "transfer_in",
6
+ TRANSFER_OUT: "transfer_out"
7
+ };
8
+ const tokenPerformanceSchema = z.object({
9
+ chain: z.string().default("unknown"),
10
+ address: z.string(),
11
+ name: z.string().optional().default(""),
12
+ symbol: z.string(),
13
+ decimals: z.number().default(0),
14
+ metadata: z.record(
15
+ z.string(),
16
+ z.union([z.string(), z.number(), z.boolean(), z.null()])
17
+ ).default({}),
18
+ price: z.number().default(0),
19
+ volume: z.number().default(0),
20
+ trades: z.number().default(0),
21
+ liquidity: z.number().default(0),
22
+ holders: z.number().default(0),
23
+ price24hChange: z.number().default(0),
24
+ volume24hChange: z.number().default(0),
25
+ trades24hChange: z.number().default(0),
26
+ holders24hChange: z.number().default(0),
27
+ initialMarketCap: z.number().default(0),
28
+ currentMarketCap: z.number().default(0),
29
+ rugPull: z.boolean().default(false),
30
+ isScam: z.boolean().default(false),
31
+ sustainedGrowth: z.boolean().default(false),
32
+ rapidDump: z.boolean().default(false),
33
+ suspiciousVolume: z.boolean().default(false),
34
+ validationTrust: z.number().default(0),
35
+ createdAt: z.date().default(() => /* @__PURE__ */ new Date()),
36
+ updatedAt: z.date().default(() => /* @__PURE__ */ new Date())
37
+ });
38
+ const transactionSchema = z.object({
39
+ id: z.string(),
40
+ positionId: z.string(),
41
+ chain: z.string().default("unknown"),
42
+ tokenAddress: z.string(),
43
+ transactionHash: z.string(),
44
+ // Use lowercase transaction types consistently
45
+ type: z.enum([TransactionType.BUY, TransactionType.SELL]),
46
+ // Use number for amounts consistently
47
+ amount: z.number(),
48
+ price: z.number().optional(),
49
+ isSimulation: z.boolean().default(false),
50
+ // Store timestamps as ISO strings consistently
51
+ timestamp: z.string()
52
+ });
53
+ function toTransaction(output) {
54
+ return {
55
+ id: output.id,
56
+ positionId: output.positionId,
57
+ chain: output.chain,
58
+ tokenAddress: output.tokenAddress,
59
+ transactionHash: output.transactionHash,
60
+ type: output.type,
61
+ amount: output.amount.toString(),
62
+ price: output.price?.toString() ?? "0",
63
+ isSimulation: output.isSimulation,
64
+ timestamp: new Date(output.timestamp)
65
+ };
66
+ }
67
+ const recommenderMetricsSchema = z.object({
68
+ entityId: z.string(),
69
+ trustScore: z.number(),
70
+ totalRecommendations: z.number(),
71
+ successfulRecs: z.number(),
72
+ avgTokenPerformance: z.number(),
73
+ riskScore: z.number(),
74
+ consistencyScore: z.number(),
75
+ virtualConfidence: z.number(),
76
+ lastActiveDate: z.date(),
77
+ trustDecay: z.number(),
78
+ updatedAt: z.date().optional().default(() => /* @__PURE__ */ new Date())
79
+ });
80
+ const positionSchema = z.object({
81
+ id: z.string().uuid(),
82
+ chain: z.string(),
83
+ tokenAddress: z.string(),
84
+ walletAddress: z.string(),
85
+ isSimulation: z.boolean(),
86
+ entityId: z.string(),
87
+ recommendationId: z.string(),
88
+ initialPrice: z.string(),
89
+ initialMarketCap: z.string(),
90
+ initialLiquidity: z.string(),
91
+ performanceScore: z.number(),
92
+ rapidDump: z.boolean(),
93
+ openedAt: z.date(),
94
+ closedAt: z.date().optional(),
95
+ updatedAt: z.date(),
96
+ // Store numeric amounts as strings to avoid precision issues
97
+ amount: z.string(),
98
+ entryPrice: z.string(),
99
+ currentPrice: z.string()
100
+ });
101
+ const tokenRecommendationSchema = z.object({
102
+ id: z.string().uuid(),
103
+ entityId: z.string().uuid(),
104
+ chain: z.string(),
105
+ tokenAddress: z.string(),
106
+ type: z.string(),
107
+ conviction: z.string(),
108
+ initialMarketCap: z.string(),
109
+ initialLiquidity: z.string(),
110
+ initialPrice: z.string(),
111
+ marketCap: z.string(),
112
+ liquidity: z.string(),
113
+ price: z.string(),
114
+ rugPull: z.boolean(),
115
+ isScam: z.boolean(),
116
+ riskScore: z.number(),
117
+ performanceScore: z.number(),
118
+ metadata: z.record(
119
+ z.string(),
120
+ z.union([z.string(), z.number(), z.boolean(), z.null()])
121
+ ).default({}),
122
+ status: z.enum(["ACTIVE", "COMPLETED", "EXPIRED", "WITHDRAWN"]),
123
+ createdAt: z.date(),
124
+ updatedAt: z.date()
125
+ });
126
+ function transformTokenPerformance(dbToken, chain = "unknown") {
127
+ const input = {
128
+ chain,
129
+ address: dbToken.tokenAddress || dbToken.token_address,
130
+ name: dbToken.name || dbToken.symbol,
131
+ symbol: dbToken.symbol,
132
+ price: typeof dbToken.price === "number" ? dbToken.price : 0,
133
+ volume: typeof dbToken.volume === "number" ? dbToken.volume : 0,
134
+ trades: typeof dbToken.trades === "number" ? dbToken.trades : 0,
135
+ liquidity: typeof dbToken.liquidity === "number" ? dbToken.liquidity : 0,
136
+ holders: typeof dbToken.holders === "number" ? dbToken.holders : 0,
137
+ price24hChange: typeof dbToken.price_change_24h === "number" ? dbToken.price_change_24h : 0,
138
+ volume24hChange: typeof dbToken.volume_change_24h === "number" ? dbToken.volume_change_24h : 0,
139
+ trades24hChange: typeof dbToken.trade_24h_change === "number" ? dbToken.trade_24h_change : 0,
140
+ holders24hChange: typeof dbToken.holder_change_24h === "number" ? dbToken.holder_change_24h : 0,
141
+ initialMarketCap: typeof dbToken.initial_market_cap === "number" ? dbToken.initial_market_cap : 0,
142
+ currentMarketCap: typeof dbToken.current_market_cap === "number" ? dbToken.current_market_cap : 0,
143
+ rugPull: Boolean(dbToken.rug_pull),
144
+ isScam: Boolean(dbToken.is_scam),
145
+ sustainedGrowth: Boolean(dbToken.sustained_growth),
146
+ rapidDump: Boolean(dbToken.rapid_dump),
147
+ suspiciousVolume: Boolean(dbToken.suspicious_volume),
148
+ validationTrust: typeof dbToken.validation_trust === "number" ? dbToken.validation_trust : 0,
149
+ createdAt: dbToken.created_at ? new Date(dbToken.created_at) : /* @__PURE__ */ new Date(),
150
+ updatedAt: dbToken.updated_at ? new Date(dbToken.updated_at) : /* @__PURE__ */ new Date()
151
+ };
152
+ return tokenPerformanceSchema.parse(input);
153
+ }
154
+ function transformTransaction(dbTx, positionId = "unknown", chain = "unknown") {
155
+ const type = typeof dbTx.type === "string" ? dbTx.type.toLowerCase() : TransactionType.BUY;
156
+ const input = {
157
+ id: dbTx.id || dbTx.transaction_hash || "",
158
+ positionId: dbTx.positionId || dbTx.position_id || positionId,
159
+ chain: dbTx.chain || chain,
160
+ tokenAddress: dbTx.tokenAddress || dbTx.token_address,
161
+ transactionHash: dbTx.transactionHash || dbTx.transaction_hash,
162
+ type: type === "BUY" || type === "SELL" ? type : "BUY",
163
+ amount: typeof dbTx.amount === "bigint" ? dbTx.amount : typeof dbTx.amount === "string" ? BigInt(dbTx.amount) : typeof dbTx.amount === "number" ? BigInt(Math.floor(dbTx.amount)) : BigInt(0),
164
+ price: typeof dbTx.price === "string" ? Number(dbTx.price) : typeof dbTx.price === "number" ? dbTx.price : void 0,
165
+ isSimulation: Boolean(dbTx.isSimulation || dbTx.is_simulation),
166
+ timestamp: dbTx.timestamp instanceof Date ? dbTx.timestamp.toISOString() : typeof dbTx.timestamp === "string" ? dbTx.timestamp : (/* @__PURE__ */ new Date()).toISOString()
167
+ };
168
+ return toTransaction(transactionSchema.parse(input));
169
+ }
170
+ function transformPosition(dbPos) {
171
+ const input = {
172
+ id: dbPos.id || "",
173
+ chain: dbPos.chain || "unknown",
174
+ tokenAddress: dbPos.tokenAddress || dbPos.token_address,
175
+ walletAddress: dbPos.walletAddress || dbPos.wallet_address,
176
+ isSimulation: Boolean(dbPos.isSimulation || dbPos.is_simulation),
177
+ entityId: dbPos.entityId || dbPos.recommender_id,
178
+ recommendationId: dbPos.recommendationId || dbPos.recommendation_id,
179
+ initialPrice: dbPos.initialPrice?.toString() || dbPos.initial_price?.toString() || "0",
180
+ initialMarketCap: dbPos.initialMarketCap?.toString() || dbPos.initial_market_cap?.toString() || "0",
181
+ initialLiquidity: dbPos.initialLiquidity?.toString() || dbPos.initial_liquidity?.toString() || "0",
182
+ performanceScore: typeof dbPos.performanceScore === "number" ? dbPos.performanceScore : typeof dbPos.performance_score === "number" ? dbPos.performance_score : 0,
183
+ rapidDump: Boolean(dbPos.rapidDump || dbPos.rapid_dump),
184
+ openedAt: dbPos.openedAt instanceof Date ? dbPos.openedAt : dbPos.opened_at instanceof Date ? dbPos.opened_at : typeof dbPos.openedAt === "string" ? new Date(dbPos.openedAt) : typeof dbPos.opened_at === "string" ? new Date(dbPos.opened_at) : /* @__PURE__ */ new Date(),
185
+ closedAt: dbPos.closedAt instanceof Date ? dbPos.closedAt : dbPos.closed_at instanceof Date ? dbPos.closed_at : typeof dbPos.closedAt === "string" ? new Date(dbPos.closedAt) : typeof dbPos.closed_at === "string" ? new Date(dbPos.closed_at) : void 0,
186
+ updatedAt: dbPos.updatedAt instanceof Date ? dbPos.updatedAt : dbPos.updated_at instanceof Date ? dbPos.updated_at : typeof dbPos.updatedAt === "string" ? new Date(dbPos.updatedAt) : typeof dbPos.updated_at === "string" ? new Date(dbPos.updated_at) : /* @__PURE__ */ new Date(),
187
+ amount: dbPos.amount?.toString() || "0",
188
+ entryPrice: dbPos.entryPrice?.toString() || dbPos.entry_price?.toString() || "0",
189
+ currentPrice: dbPos.currentPrice?.toString() || dbPos.current_price?.toString() || "0"
190
+ };
191
+ return positionSchema.parse(input);
192
+ }
193
+ const recommendationSchema = z.object({
194
+ username: z.string().describe(
195
+ "The username of the person making the recommendation in the conversation"
196
+ ),
197
+ ticker: z.string().optional().nullable().describe(
198
+ "The ticker symbol of the recommended asset (e.g., 'BTC', 'AAPL'). Optional as recommendations may discuss assets without explicit tickers"
199
+ ),
200
+ tokenAddress: z.string().optional().nullable().describe(
201
+ "The blockchain contract address of the token if mentioned. This helps disambiguate tokens that might share similar names or symbols"
202
+ ),
203
+ type: z.enum(["BUY", "SELL", "DONT_BUY", "DONT_SELL", "NONE"]).describe(
204
+ "The type of trading recommendation being made. This captures both positive recommendations (buy/sell) and explicit warnings against actions"
205
+ ),
206
+ conviction: z.enum(["NONE", "LOW", "MEDIUM", "HIGH"]).describe(
207
+ "The level of confidence or urgency expressed in the recommendation, helping prioritize stronger signals"
208
+ )
209
+ }).describe(
210
+ "Schema for extracting trading recommendations from conversational text, capturing the key components of who made the recommendation, what asset was discussed, what action was recommended, and how strongly it was recommended"
211
+ );
212
+ function transformTokenRecommendation(dbRec) {
213
+ try {
214
+ return tokenRecommendationSchema.parse({
215
+ id: dbRec.id || dbRec.recommendation_id,
216
+ entityId: dbRec.entityId || dbRec.recommender_id,
217
+ chain: dbRec.chain || "unknown",
218
+ tokenAddress: dbRec.tokenAddress || dbRec.token_address,
219
+ type: dbRec.type || "BUY",
220
+ conviction: dbRec.conviction || "MEDIUM",
221
+ initialMarketCap: dbRec.initialMarketCap || dbRec.initial_market_cap || "0",
222
+ initialLiquidity: dbRec.initialLiquidity || dbRec.initial_liquidity || "0",
223
+ initialPrice: dbRec.initialPrice || dbRec.initial_price || "0",
224
+ marketCap: dbRec.marketCap || dbRec.market_cap || "0",
225
+ liquidity: dbRec.liquidity || "0",
226
+ price: dbRec.price || "0",
227
+ rugPull: Boolean(dbRec.rugPull || dbRec.rug_pull || false),
228
+ isScam: Boolean(dbRec.isScam || dbRec.is_scam || false),
229
+ riskScore: dbRec.riskScore || dbRec.risk_score || 0,
230
+ performanceScore: dbRec.performanceScore || dbRec.performance_score || 0,
231
+ metadata: dbRec.metadata || {},
232
+ status: dbRec.status || "ACTIVE",
233
+ createdAt: new Date(
234
+ dbRec.createdAt || dbRec.created_at || Date.now()
235
+ ),
236
+ updatedAt: new Date(
237
+ dbRec.updatedAt || dbRec.updated_at || Date.now()
238
+ )
239
+ });
240
+ } catch (error) {
241
+ console.error("Error transforming token recommendation:", error);
242
+ throw error;
243
+ }
244
+ }
245
+ export {
246
+ TransactionType,
247
+ positionSchema,
248
+ recommendationSchema,
249
+ recommenderMetricsSchema,
250
+ tokenPerformanceSchema,
251
+ tokenRecommendationSchema,
252
+ transactionSchema,
253
+ transformPosition,
254
+ transformTokenPerformance,
255
+ transformTokenRecommendation,
256
+ transformTransaction
257
+ };
258
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schemas.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type {\n\tTransactionType as DomainTransactionType,\n\tTransaction,\n} from \"./types.js\";\n\n/**\n * Core schema definitions for community-trader plugin\n * This approach provides runtime validation and better type safety\n */\n\n// Define consistent transaction types\nexport const TransactionType = {\n\tBUY: \"BUY\",\n\tSELL: \"SELL\",\n\tTRANSFER_IN: \"transfer_in\",\n\tTRANSFER_OUT: \"transfer_out\",\n} as const;\n\n// Define TokenPerformance schema\nexport const tokenPerformanceSchema = z.object({\n\tchain: z.string().default(\"unknown\"),\n\taddress: z.string(),\n\tname: z.string().optional().default(\"\"),\n\tsymbol: z.string(),\n\tdecimals: z.number().default(0),\n\tmetadata: z\n\t\t.record(\n\t\t\tz.string(),\n\t\t\tz.union([z.string(), z.number(), z.boolean(), z.null()]),\n\t\t)\n\t\t.default({}),\n\tprice: z.number().default(0),\n\tvolume: z.number().default(0),\n\ttrades: z.number().default(0),\n\tliquidity: z.number().default(0),\n\tholders: z.number().default(0),\n\tprice24hChange: z.number().default(0),\n\tvolume24hChange: z.number().default(0),\n\ttrades24hChange: z.number().default(0),\n\tholders24hChange: z.number().default(0),\n\tinitialMarketCap: z.number().default(0),\n\tcurrentMarketCap: z.number().default(0),\n\trugPull: z.boolean().default(false),\n\tisScam: z.boolean().default(false),\n\tsustainedGrowth: z.boolean().default(false),\n\trapidDump: z.boolean().default(false),\n\tsuspiciousVolume: z.boolean().default(false),\n\tvalidationTrust: z.number().default(0),\n\tcreatedAt: z.date().default(() => new Date()),\n\tupdatedAt: z.date().default(() => new Date()),\n});\n\n// Define Transaction schema - ensure consistency with types.ts\nexport const transactionSchema = z.object({\n\tid: z.string(),\n\tpositionId: z.string(),\n\tchain: z.string().default(\"unknown\"),\n\ttokenAddress: z.string(),\n\ttransactionHash: z.string(),\n\t// Use lowercase transaction types consistently\n\ttype: z.enum([TransactionType.BUY, TransactionType.SELL]),\n\t// Use number for amounts consistently\n\tamount: z.number(),\n\tprice: z.number().optional(),\n\tisSimulation: z.boolean().default(false),\n\t// Store timestamps as ISO strings consistently\n\ttimestamp: z.string(),\n});\n\ntype TransactionSchemaOutput = z.output<typeof transactionSchema>;\n\nfunction toTransaction(output: TransactionSchemaOutput): Transaction {\n\treturn {\n\t\tid: output.id,\n\t\tpositionId: output.positionId,\n\t\tchain: output.chain,\n\t\ttokenAddress: output.tokenAddress,\n\t\ttransactionHash: output.transactionHash,\n\t\ttype: output.type as DomainTransactionType,\n\t\tamount: output.amount.toString(),\n\t\tprice: output.price?.toString() ?? \"0\",\n\t\tisSimulation: output.isSimulation,\n\t\ttimestamp: new Date(output.timestamp),\n\t};\n}\n\n// Define RecommenderMetrics schema\nexport const recommenderMetricsSchema = z.object({\n\tentityId: z.string(),\n\ttrustScore: z.number(),\n\ttotalRecommendations: z.number(),\n\tsuccessfulRecs: z.number(),\n\tavgTokenPerformance: z.number(),\n\triskScore: z.number(),\n\tconsistencyScore: z.number(),\n\tvirtualConfidence: z.number(),\n\tlastActiveDate: z.date(),\n\ttrustDecay: z.number(),\n\tupdatedAt: z\n\t\t.date()\n\t\t.optional()\n\t\t.default(() => new Date()),\n});\n\n// Define Position schema\nexport const positionSchema = z.object({\n\tid: z.string().uuid(),\n\tchain: z.string(),\n\ttokenAddress: z.string(),\n\twalletAddress: z.string(),\n\tisSimulation: z.boolean(),\n\tentityId: z.string(),\n\trecommendationId: z.string(),\n\tinitialPrice: z.string(),\n\tinitialMarketCap: z.string(),\n\tinitialLiquidity: z.string(),\n\tperformanceScore: z.number(),\n\trapidDump: z.boolean(),\n\topenedAt: z.date(),\n\tclosedAt: z.date().optional(),\n\tupdatedAt: z.date(),\n\t// Store numeric amounts as strings to avoid precision issues\n\tamount: z.string(),\n\tentryPrice: z.string(),\n\tcurrentPrice: z.string(),\n});\n\n// Define TokenRecommendation schema\nexport const tokenRecommendationSchema = z.object({\n\tid: z.string().uuid(),\n\tentityId: z.string().uuid(),\n\tchain: z.string(),\n\ttokenAddress: z.string(),\n\ttype: z.string(),\n\tconviction: z.string(),\n\tinitialMarketCap: z.string(),\n\tinitialLiquidity: z.string(),\n\tinitialPrice: z.string(),\n\tmarketCap: z.string(),\n\tliquidity: z.string(),\n\tprice: z.string(),\n\trugPull: z.boolean(),\n\tisScam: z.boolean(),\n\triskScore: z.number(),\n\tperformanceScore: z.number(),\n\tmetadata: z\n\t\t.record(\n\t\t\tz.string(),\n\t\t\tz.union([z.string(), z.number(), z.boolean(), z.null()]),\n\t\t)\n\t\t.default({}),\n\tstatus: z.enum([\"ACTIVE\", \"COMPLETED\", \"EXPIRED\", \"WITHDRAWN\"]),\n\tcreatedAt: z.date(),\n\tupdatedAt: z.date(),\n});\n\n// Types derived from schemas\nexport type TokenPerformance = z.infer<typeof tokenPerformanceSchema>;\nexport type RecommenderMetrics = z.infer<typeof recommenderMetricsSchema>;\nexport type Position = z.infer<typeof positionSchema>;\nexport type TokenRecommendation = z.infer<typeof tokenRecommendationSchema>;\n\n/**\n * Transform functions to convert database objects to schema-validated objects\n */\n\nexport function transformTokenPerformance(\n\tdbToken: Record<string, unknown>,\n\tchain = \"unknown\",\n): TokenPerformance {\n\tconst input = {\n\t\tchain,\n\t\taddress: dbToken.tokenAddress || dbToken.token_address,\n\t\tname: dbToken.name || dbToken.symbol,\n\t\tsymbol: dbToken.symbol,\n\t\tprice: typeof dbToken.price === \"number\" ? dbToken.price : 0,\n\t\tvolume: typeof dbToken.volume === \"number\" ? dbToken.volume : 0,\n\t\ttrades: typeof dbToken.trades === \"number\" ? dbToken.trades : 0,\n\t\tliquidity: typeof dbToken.liquidity === \"number\" ? dbToken.liquidity : 0,\n\t\tholders: typeof dbToken.holders === \"number\" ? dbToken.holders : 0,\n\t\tprice24hChange:\n\t\t\ttypeof dbToken.price_change_24h === \"number\"\n\t\t\t\t? dbToken.price_change_24h\n\t\t\t\t: 0,\n\t\tvolume24hChange:\n\t\t\ttypeof dbToken.volume_change_24h === \"number\"\n\t\t\t\t? dbToken.volume_change_24h\n\t\t\t\t: 0,\n\t\ttrades24hChange:\n\t\t\ttypeof dbToken.trade_24h_change === \"number\"\n\t\t\t\t? dbToken.trade_24h_change\n\t\t\t\t: 0,\n\t\tholders24hChange:\n\t\t\ttypeof dbToken.holder_change_24h === \"number\"\n\t\t\t\t? dbToken.holder_change_24h\n\t\t\t\t: 0,\n\t\tinitialMarketCap:\n\t\t\ttypeof dbToken.initial_market_cap === \"number\"\n\t\t\t\t? dbToken.initial_market_cap\n\t\t\t\t: 0,\n\t\tcurrentMarketCap:\n\t\t\ttypeof dbToken.current_market_cap === \"number\"\n\t\t\t\t? dbToken.current_market_cap\n\t\t\t\t: 0,\n\t\trugPull: Boolean(dbToken.rug_pull),\n\t\tisScam: Boolean(dbToken.is_scam),\n\t\tsustainedGrowth: Boolean(dbToken.sustained_growth),\n\t\trapidDump: Boolean(dbToken.rapid_dump),\n\t\tsuspiciousVolume: Boolean(dbToken.suspicious_volume),\n\t\tvalidationTrust:\n\t\t\ttypeof dbToken.validation_trust === \"number\"\n\t\t\t\t? dbToken.validation_trust\n\t\t\t\t: 0,\n\t\tcreatedAt: dbToken.created_at\n\t\t\t? new Date(dbToken.created_at as string | number)\n\t\t\t: new Date(),\n\t\tupdatedAt: dbToken.updated_at\n\t\t\t? new Date(dbToken.updated_at as string | number)\n\t\t\t: new Date(),\n\t};\n\n\treturn tokenPerformanceSchema.parse(input);\n}\n\nexport function transformTransaction(\n\tdbTx: Record<string, unknown>,\n\tpositionId = \"unknown\",\n\tchain = \"unknown\",\n): Transaction {\n\tconst type =\n\t\ttypeof dbTx.type === \"string\"\n\t\t\t? dbTx.type.toLowerCase()\n\t\t\t: TransactionType.BUY;\n\n\tconst input = {\n\t\tid: dbTx.id || dbTx.transaction_hash || \"\",\n\t\tpositionId: dbTx.positionId || dbTx.position_id || positionId,\n\t\tchain: dbTx.chain || chain,\n\t\ttokenAddress: dbTx.tokenAddress || dbTx.token_address,\n\t\ttransactionHash: dbTx.transactionHash || dbTx.transaction_hash,\n\t\ttype: type === \"BUY\" || type === \"SELL\" ? type : \"BUY\",\n\t\tamount:\n\t\t\ttypeof dbTx.amount === \"bigint\"\n\t\t\t\t? dbTx.amount\n\t\t\t\t: typeof dbTx.amount === \"string\"\n\t\t\t\t\t? BigInt(dbTx.amount)\n\t\t\t\t\t: typeof dbTx.amount === \"number\"\n\t\t\t\t\t\t? BigInt(Math.floor(dbTx.amount))\n\t\t\t\t\t\t: BigInt(0),\n\t\tprice:\n\t\t\ttypeof dbTx.price === \"string\"\n\t\t\t\t? Number(dbTx.price)\n\t\t\t\t: typeof dbTx.price === \"number\"\n\t\t\t\t\t? dbTx.price\n\t\t\t\t\t: undefined,\n\t\tisSimulation: Boolean(dbTx.isSimulation || dbTx.is_simulation),\n\t\ttimestamp:\n\t\t\tdbTx.timestamp instanceof Date\n\t\t\t\t? dbTx.timestamp.toISOString()\n\t\t\t\t: typeof dbTx.timestamp === \"string\"\n\t\t\t\t\t? dbTx.timestamp\n\t\t\t\t\t: new Date().toISOString(),\n\t};\n\n\treturn toTransaction(transactionSchema.parse(input));\n}\n\nexport function transformPosition(dbPos: Record<string, unknown>): Position {\n\tconst input = {\n\t\tid: dbPos.id || \"\",\n\t\tchain: dbPos.chain || \"unknown\",\n\t\ttokenAddress: dbPos.tokenAddress || dbPos.token_address,\n\t\twalletAddress: dbPos.walletAddress || dbPos.wallet_address,\n\t\tisSimulation: Boolean(dbPos.isSimulation || dbPos.is_simulation),\n\t\tentityId: dbPos.entityId || dbPos.recommender_id,\n\t\trecommendationId: dbPos.recommendationId || dbPos.recommendation_id,\n\t\tinitialPrice:\n\t\t\tdbPos.initialPrice?.toString() || dbPos.initial_price?.toString() || \"0\",\n\t\tinitialMarketCap:\n\t\t\tdbPos.initialMarketCap?.toString() ||\n\t\t\tdbPos.initial_market_cap?.toString() ||\n\t\t\t\"0\",\n\t\tinitialLiquidity:\n\t\t\tdbPos.initialLiquidity?.toString() ||\n\t\t\tdbPos.initial_liquidity?.toString() ||\n\t\t\t\"0\",\n\t\tperformanceScore:\n\t\t\ttypeof dbPos.performanceScore === \"number\"\n\t\t\t\t? dbPos.performanceScore\n\t\t\t\t: typeof dbPos.performance_score === \"number\"\n\t\t\t\t\t? dbPos.performance_score\n\t\t\t\t\t: 0,\n\t\trapidDump: Boolean(dbPos.rapidDump || dbPos.rapid_dump),\n\t\topenedAt:\n\t\t\tdbPos.openedAt instanceof Date\n\t\t\t\t? dbPos.openedAt\n\t\t\t\t: dbPos.opened_at instanceof Date\n\t\t\t\t\t? dbPos.opened_at\n\t\t\t\t\t: typeof dbPos.openedAt === \"string\"\n\t\t\t\t\t\t? new Date(dbPos.openedAt)\n\t\t\t\t\t\t: typeof dbPos.opened_at === \"string\"\n\t\t\t\t\t\t\t? new Date(dbPos.opened_at)\n\t\t\t\t\t\t\t: new Date(),\n\t\tclosedAt:\n\t\t\tdbPos.closedAt instanceof Date\n\t\t\t\t? dbPos.closedAt\n\t\t\t\t: dbPos.closed_at instanceof Date\n\t\t\t\t\t? dbPos.closed_at\n\t\t\t\t\t: typeof dbPos.closedAt === \"string\"\n\t\t\t\t\t\t? new Date(dbPos.closedAt)\n\t\t\t\t\t\t: typeof dbPos.closed_at === \"string\"\n\t\t\t\t\t\t\t? new Date(dbPos.closed_at)\n\t\t\t\t\t\t\t: undefined,\n\t\tupdatedAt:\n\t\t\tdbPos.updatedAt instanceof Date\n\t\t\t\t? dbPos.updatedAt\n\t\t\t\t: dbPos.updated_at instanceof Date\n\t\t\t\t\t? dbPos.updated_at\n\t\t\t\t\t: typeof dbPos.updatedAt === \"string\"\n\t\t\t\t\t\t? new Date(dbPos.updatedAt)\n\t\t\t\t\t\t: typeof dbPos.updated_at === \"string\"\n\t\t\t\t\t\t\t? new Date(dbPos.updated_at)\n\t\t\t\t\t\t\t: new Date(),\n\t\tamount: dbPos.amount?.toString() || \"0\",\n\t\tentryPrice:\n\t\t\tdbPos.entryPrice?.toString() || dbPos.entry_price?.toString() || \"0\",\n\t\tcurrentPrice:\n\t\t\tdbPos.currentPrice?.toString() || dbPos.current_price?.toString() || \"0\",\n\t};\n\n\treturn positionSchema.parse(input);\n}\n\n/**\n * Type definition for MessageRecommendation based on the schema recommendationSchema\n */\nexport type MessageRecommendation = z.infer<typeof recommendationSchema>;\n\n/**\n * Schema for extracting trading recommendations from conversational text, capturing the key components of who made the recommendation, what asset was discussed, what action was recommended, and how strongly it was recommended\n */\nexport const recommendationSchema = z\n\t.object({\n\t\tusername: z\n\t\t\t.string()\n\t\t\t.describe(\n\t\t\t\t\"The username of the person making the recommendation in the conversation\",\n\t\t\t),\n\n\t\tticker: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.nullable()\n\t\t\t.describe(\n\t\t\t\t\"The ticker symbol of the recommended asset (e.g., 'BTC', 'AAPL'). Optional as recommendations may discuss assets without explicit tickers\",\n\t\t\t),\n\n\t\ttokenAddress: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.nullable()\n\t\t\t.describe(\n\t\t\t\t\"The blockchain contract address of the token if mentioned. This helps disambiguate tokens that might share similar names or symbols\",\n\t\t\t),\n\n\t\ttype: z\n\t\t\t.enum([\"BUY\", \"SELL\", \"DONT_BUY\", \"DONT_SELL\", \"NONE\"])\n\t\t\t.describe(\n\t\t\t\t\"The type of trading recommendation being made. This captures both positive recommendations (buy/sell) and explicit warnings against actions\",\n\t\t\t),\n\n\t\tconviction: z\n\t\t\t.enum([\"NONE\", \"LOW\", \"MEDIUM\", \"HIGH\"])\n\t\t\t.describe(\n\t\t\t\t\"The level of confidence or urgency expressed in the recommendation, helping prioritize stronger signals\",\n\t\t\t),\n\t})\n\t.describe(\n\t\t\"Schema for extracting trading recommendations from conversational text, capturing the key components of who made the recommendation, what asset was discussed, what action was recommended, and how strongly it was recommended\",\n\t);\n\nexport function transformTokenRecommendation(\n\tdbRec: Record<string, unknown>,\n): TokenRecommendation {\n\ttry {\n\t\treturn tokenRecommendationSchema.parse({\n\t\t\tid: dbRec.id || dbRec.recommendation_id,\n\t\t\tentityId: dbRec.entityId || dbRec.recommender_id,\n\t\t\tchain: dbRec.chain || \"unknown\",\n\t\t\ttokenAddress: dbRec.tokenAddress || dbRec.token_address,\n\t\t\ttype: dbRec.type || \"BUY\",\n\t\t\tconviction: dbRec.conviction || \"MEDIUM\",\n\t\t\tinitialMarketCap:\n\t\t\t\tdbRec.initialMarketCap || dbRec.initial_market_cap || \"0\",\n\t\t\tinitialLiquidity:\n\t\t\t\tdbRec.initialLiquidity || dbRec.initial_liquidity || \"0\",\n\t\t\tinitialPrice: dbRec.initialPrice || dbRec.initial_price || \"0\",\n\t\t\tmarketCap: dbRec.marketCap || dbRec.market_cap || \"0\",\n\t\t\tliquidity: dbRec.liquidity || \"0\",\n\t\t\tprice: dbRec.price || \"0\",\n\t\t\trugPull: Boolean(dbRec.rugPull || dbRec.rug_pull || false),\n\t\t\tisScam: Boolean(dbRec.isScam || dbRec.is_scam || false),\n\t\t\triskScore: dbRec.riskScore || dbRec.risk_score || 0,\n\t\t\tperformanceScore: dbRec.performanceScore || dbRec.performance_score || 0,\n\t\t\tmetadata: dbRec.metadata || {},\n\t\t\tstatus: dbRec.status || \"ACTIVE\",\n\t\t\tcreatedAt: new Date(\n\t\t\t\t(dbRec.createdAt || dbRec.created_at || Date.now()) as string | number,\n\t\t\t),\n\t\t\tupdatedAt: new Date(\n\t\t\t\t(dbRec.updatedAt || dbRec.updated_at || Date.now()) as string | number,\n\t\t\t),\n\t\t});\n\t} catch (error) {\n\t\tconsole.error(\"Error transforming token recommendation:\", error);\n\t\tthrow error; // Re-throw the error instead of returning null\n\t}\n}\n"],"mappings":"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","names":[]}