@lagoon-protocol/lagoon-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +618 -0
  3. package/dist/cache/index.d.ts +97 -0
  4. package/dist/cache/index.d.ts.map +1 -0
  5. package/dist/cache/index.js +106 -0
  6. package/dist/cache/index.js.map +1 -0
  7. package/dist/config.d.ts +34 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +40 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/core/cache-adapter.d.ts +73 -0
  12. package/dist/core/cache-adapter.d.ts.map +1 -0
  13. package/dist/core/cache-adapter.js +47 -0
  14. package/dist/core/cache-adapter.js.map +1 -0
  15. package/dist/core/cache-invalidation.d.ts +72 -0
  16. package/dist/core/cache-invalidation.d.ts.map +1 -0
  17. package/dist/core/cache-invalidation.js +114 -0
  18. package/dist/core/cache-invalidation.js.map +1 -0
  19. package/dist/core/container.d.ts +34 -0
  20. package/dist/core/container.d.ts.map +1 -0
  21. package/dist/core/container.js +75 -0
  22. package/dist/core/container.js.map +1 -0
  23. package/dist/graphql/client.d.ts +32 -0
  24. package/dist/graphql/client.d.ts.map +1 -0
  25. package/dist/graphql/client.js +49 -0
  26. package/dist/graphql/client.js.map +1 -0
  27. package/dist/graphql/fragments/apr-breakdown.fragment.d.ts +64 -0
  28. package/dist/graphql/fragments/apr-breakdown.fragment.d.ts.map +1 -0
  29. package/dist/graphql/fragments/apr-breakdown.fragment.js +62 -0
  30. package/dist/graphql/fragments/apr-breakdown.fragment.js.map +1 -0
  31. package/dist/graphql/fragments/asset-info.fragment.d.ts +18 -0
  32. package/dist/graphql/fragments/asset-info.fragment.d.ts.map +1 -0
  33. package/dist/graphql/fragments/asset-info.fragment.js +36 -0
  34. package/dist/graphql/fragments/asset-info.fragment.js.map +1 -0
  35. package/dist/graphql/fragments/chain-info.fragment.d.ts +18 -0
  36. package/dist/graphql/fragments/chain-info.fragment.d.ts.map +1 -0
  37. package/dist/graphql/fragments/chain-info.fragment.js +32 -0
  38. package/dist/graphql/fragments/chain-info.fragment.js.map +1 -0
  39. package/dist/graphql/fragments/index.d.ts +15 -0
  40. package/dist/graphql/fragments/index.d.ts.map +1 -0
  41. package/dist/graphql/fragments/index.js +21 -0
  42. package/dist/graphql/fragments/index.js.map +1 -0
  43. package/dist/graphql/fragments/pageinfo.fragment.d.ts +33 -0
  44. package/dist/graphql/fragments/pageinfo.fragment.d.ts.map +1 -0
  45. package/dist/graphql/fragments/pageinfo.fragment.js +47 -0
  46. package/dist/graphql/fragments/pageinfo.fragment.js.map +1 -0
  47. package/dist/graphql/fragments/transaction-base.fragment.d.ts +19 -0
  48. package/dist/graphql/fragments/transaction-base.fragment.d.ts.map +1 -0
  49. package/dist/graphql/fragments/transaction-base.fragment.js +32 -0
  50. package/dist/graphql/fragments/transaction-base.fragment.js.map +1 -0
  51. package/dist/graphql/fragments/vault-list.fragment.d.ts +53 -0
  52. package/dist/graphql/fragments/vault-list.fragment.d.ts.map +1 -0
  53. package/dist/graphql/fragments/vault-list.fragment.js +51 -0
  54. package/dist/graphql/fragments/vault-list.fragment.js.map +1 -0
  55. package/dist/graphql/fragments/vault-summary.fragment.d.ts +68 -0
  56. package/dist/graphql/fragments/vault-summary.fragment.d.ts.map +1 -0
  57. package/dist/graphql/fragments/vault-summary.fragment.js +66 -0
  58. package/dist/graphql/fragments/vault-summary.fragment.js.map +1 -0
  59. package/dist/graphql/fragments/vault.fragment.d.ts +133 -0
  60. package/dist/graphql/fragments/vault.fragment.d.ts.map +1 -0
  61. package/dist/graphql/fragments/vault.fragment.js +119 -0
  62. package/dist/graphql/fragments/vault.fragment.js.map +1 -0
  63. package/dist/graphql/fragments.d.ts +183 -0
  64. package/dist/graphql/fragments.d.ts.map +1 -0
  65. package/dist/graphql/fragments.js +297 -0
  66. package/dist/graphql/fragments.js.map +1 -0
  67. package/dist/graphql/queries/export.queries.d.ts +72 -0
  68. package/dist/graphql/queries/export.queries.d.ts.map +1 -0
  69. package/dist/graphql/queries/export.queries.js +202 -0
  70. package/dist/graphql/queries/export.queries.js.map +1 -0
  71. package/dist/graphql/queries/index.d.ts +15 -0
  72. package/dist/graphql/queries/index.d.ts.map +1 -0
  73. package/dist/graphql/queries/index.js +23 -0
  74. package/dist/graphql/queries/index.js.map +1 -0
  75. package/dist/graphql/queries/performance.queries.d.ts +63 -0
  76. package/dist/graphql/queries/performance.queries.d.ts.map +1 -0
  77. package/dist/graphql/queries/performance.queries.js +133 -0
  78. package/dist/graphql/queries/performance.queries.js.map +1 -0
  79. package/dist/graphql/queries/period-summaries.d.ts +15 -0
  80. package/dist/graphql/queries/period-summaries.d.ts.map +1 -0
  81. package/dist/graphql/queries/period-summaries.js +24 -0
  82. package/dist/graphql/queries/period-summaries.js.map +1 -0
  83. package/dist/graphql/queries/portfolio.queries.d.ts +78 -0
  84. package/dist/graphql/queries/portfolio.queries.d.ts.map +1 -0
  85. package/dist/graphql/queries/portfolio.queries.js +198 -0
  86. package/dist/graphql/queries/portfolio.queries.js.map +1 -0
  87. package/dist/graphql/queries/prediction.queries.d.ts +38 -0
  88. package/dist/graphql/queries/prediction.queries.d.ts.map +1 -0
  89. package/dist/graphql/queries/prediction.queries.js +100 -0
  90. package/dist/graphql/queries/prediction.queries.js.map +1 -0
  91. package/dist/graphql/queries/risk.queries.d.ts +37 -0
  92. package/dist/graphql/queries/risk.queries.d.ts.map +1 -0
  93. package/dist/graphql/queries/risk.queries.js +90 -0
  94. package/dist/graphql/queries/risk.queries.js.map +1 -0
  95. package/dist/graphql/queries/search.queries.d.ts +61 -0
  96. package/dist/graphql/queries/search.queries.d.ts.map +1 -0
  97. package/dist/graphql/queries/search.queries.js +103 -0
  98. package/dist/graphql/queries/search.queries.js.map +1 -0
  99. package/dist/graphql/queries/transaction.queries.d.ts +60 -0
  100. package/dist/graphql/queries/transaction.queries.d.ts.map +1 -0
  101. package/dist/graphql/queries/transaction.queries.js +252 -0
  102. package/dist/graphql/queries/transaction.queries.js.map +1 -0
  103. package/dist/graphql/queries/vault.queries.d.ts +54 -0
  104. package/dist/graphql/queries/vault.queries.d.ts.map +1 -0
  105. package/dist/graphql/queries/vault.queries.js +78 -0
  106. package/dist/graphql/queries/vault.queries.js.map +1 -0
  107. package/dist/index.d.ts +12 -0
  108. package/dist/index.d.ts.map +1 -0
  109. package/dist/index.js +32 -0
  110. package/dist/index.js.map +1 -0
  111. package/dist/prompts/competitor-comparison.d.ts +8 -0
  112. package/dist/prompts/competitor-comparison.d.ts.map +1 -0
  113. package/dist/prompts/competitor-comparison.js +432 -0
  114. package/dist/prompts/competitor-comparison.js.map +1 -0
  115. package/dist/prompts/curator-performance.d.ts +8 -0
  116. package/dist/prompts/curator-performance.d.ts.map +1 -0
  117. package/dist/prompts/curator-performance.js +383 -0
  118. package/dist/prompts/curator-performance.js.map +1 -0
  119. package/dist/prompts/financial-analysis.d.ts +8 -0
  120. package/dist/prompts/financial-analysis.d.ts.map +1 -0
  121. package/dist/prompts/financial-analysis.js +480 -0
  122. package/dist/prompts/financial-analysis.js.map +1 -0
  123. package/dist/prompts/index.d.ts +21 -0
  124. package/dist/prompts/index.d.ts.map +1 -0
  125. package/dist/prompts/index.js +50 -0
  126. package/dist/prompts/index.js.map +1 -0
  127. package/dist/prompts/onboarding-first-vault.d.ts +8 -0
  128. package/dist/prompts/onboarding-first-vault.d.ts.map +1 -0
  129. package/dist/prompts/onboarding-first-vault.js +317 -0
  130. package/dist/prompts/onboarding-first-vault.js.map +1 -0
  131. package/dist/prompts/portfolio-optimization.d.ts +8 -0
  132. package/dist/prompts/portfolio-optimization.d.ts.map +1 -0
  133. package/dist/prompts/portfolio-optimization.js +412 -0
  134. package/dist/prompts/portfolio-optimization.js.map +1 -0
  135. package/dist/prompts/protocol-overview.d.ts +8 -0
  136. package/dist/prompts/protocol-overview.d.ts.map +1 -0
  137. package/dist/prompts/protocol-overview.js +398 -0
  138. package/dist/prompts/protocol-overview.js.map +1 -0
  139. package/dist/prompts/shared/disclaimers.d.ts +54 -0
  140. package/dist/prompts/shared/disclaimers.d.ts.map +1 -0
  141. package/dist/prompts/shared/disclaimers.js +400 -0
  142. package/dist/prompts/shared/disclaimers.js.map +1 -0
  143. package/dist/resources/glossary.d.ts +8 -0
  144. package/dist/resources/glossary.d.ts.map +1 -0
  145. package/dist/resources/glossary.js +407 -0
  146. package/dist/resources/glossary.js.map +1 -0
  147. package/dist/resources/index.d.ts +18 -0
  148. package/dist/resources/index.d.ts.map +1 -0
  149. package/dist/resources/index.js +29 -0
  150. package/dist/resources/index.js.map +1 -0
  151. package/dist/resources/schema.d.ts +22 -0
  152. package/dist/resources/schema.d.ts.map +1 -0
  153. package/dist/resources/schema.js +67 -0
  154. package/dist/resources/schema.js.map +1 -0
  155. package/dist/schemas/config.schema.d.ts +46 -0
  156. package/dist/schemas/config.schema.d.ts.map +1 -0
  157. package/dist/schemas/config.schema.js +48 -0
  158. package/dist/schemas/config.schema.js.map +1 -0
  159. package/dist/sdk/__tests__/apr-service.test.d.ts +7 -0
  160. package/dist/sdk/__tests__/apr-service.test.d.ts.map +1 -0
  161. package/dist/sdk/__tests__/apr-service.test.js +385 -0
  162. package/dist/sdk/__tests__/apr-service.test.js.map +1 -0
  163. package/dist/sdk/__tests__/math-utils.test.d.ts +7 -0
  164. package/dist/sdk/__tests__/math-utils.test.d.ts.map +1 -0
  165. package/dist/sdk/__tests__/math-utils.test.js +185 -0
  166. package/dist/sdk/__tests__/math-utils.test.js.map +1 -0
  167. package/dist/sdk/__tests__/simulation-service.test.d.ts +5 -0
  168. package/dist/sdk/__tests__/simulation-service.test.d.ts.map +1 -0
  169. package/dist/sdk/__tests__/simulation-service.test.js +397 -0
  170. package/dist/sdk/__tests__/simulation-service.test.js.map +1 -0
  171. package/dist/sdk/__tests__/vault-utils.test.d.ts +7 -0
  172. package/dist/sdk/__tests__/vault-utils.test.d.ts.map +1 -0
  173. package/dist/sdk/__tests__/vault-utils.test.js +189 -0
  174. package/dist/sdk/__tests__/vault-utils.test.js.map +1 -0
  175. package/dist/sdk/apr-service.d.ts +101 -0
  176. package/dist/sdk/apr-service.d.ts.map +1 -0
  177. package/dist/sdk/apr-service.js +175 -0
  178. package/dist/sdk/apr-service.js.map +1 -0
  179. package/dist/sdk/math-utils.d.ts +138 -0
  180. package/dist/sdk/math-utils.d.ts.map +1 -0
  181. package/dist/sdk/math-utils.js +218 -0
  182. package/dist/sdk/math-utils.js.map +1 -0
  183. package/dist/sdk/simulation-service.d.ts +106 -0
  184. package/dist/sdk/simulation-service.d.ts.map +1 -0
  185. package/dist/sdk/simulation-service.js +143 -0
  186. package/dist/sdk/simulation-service.js.map +1 -0
  187. package/dist/sdk/vault-utils.d.ts +125 -0
  188. package/dist/sdk/vault-utils.d.ts.map +1 -0
  189. package/dist/sdk/vault-utils.js +165 -0
  190. package/dist/sdk/vault-utils.js.map +1 -0
  191. package/dist/server.d.ts +21 -0
  192. package/dist/server.d.ts.map +1 -0
  193. package/dist/server.js +225 -0
  194. package/dist/server.js.map +1 -0
  195. package/dist/services/analytics/protocol-overview.service.d.ts +61 -0
  196. package/dist/services/analytics/protocol-overview.service.d.ts.map +1 -0
  197. package/dist/services/analytics/protocol-overview.service.js +182 -0
  198. package/dist/services/analytics/protocol-overview.service.js.map +1 -0
  199. package/dist/services/analytics/risk.service.d.ts +92 -0
  200. package/dist/services/analytics/risk.service.d.ts.map +1 -0
  201. package/dist/services/analytics/risk.service.js +423 -0
  202. package/dist/services/analytics/risk.service.js.map +1 -0
  203. package/dist/services/base.service.d.ts +39 -0
  204. package/dist/services/base.service.d.ts.map +1 -0
  205. package/dist/services/base.service.js +37 -0
  206. package/dist/services/base.service.js.map +1 -0
  207. package/dist/services/index.d.ts +30 -0
  208. package/dist/services/index.d.ts.map +1 -0
  209. package/dist/services/index.js +101 -0
  210. package/dist/services/index.js.map +1 -0
  211. package/dist/tools/__tests__/simulate-vault.test.d.ts +5 -0
  212. package/dist/tools/__tests__/simulate-vault.test.d.ts.map +1 -0
  213. package/dist/tools/__tests__/simulate-vault.test.js +363 -0
  214. package/dist/tools/__tests__/simulate-vault.test.js.map +1 -0
  215. package/dist/tools/analyze-risk.d.ts +34 -0
  216. package/dist/tools/analyze-risk.d.ts.map +1 -0
  217. package/dist/tools/analyze-risk.js +100 -0
  218. package/dist/tools/analyze-risk.js.map +1 -0
  219. package/dist/tools/compare-vaults.d.ts +29 -0
  220. package/dist/tools/compare-vaults.d.ts.map +1 -0
  221. package/dist/tools/compare-vaults.js +285 -0
  222. package/dist/tools/compare-vaults.js.map +1 -0
  223. package/dist/tools/export-data.d.ts +34 -0
  224. package/dist/tools/export-data.d.ts.map +1 -0
  225. package/dist/tools/export-data.js +309 -0
  226. package/dist/tools/export-data.js.map +1 -0
  227. package/dist/tools/get-price-history.d.ts +29 -0
  228. package/dist/tools/get-price-history.d.ts.map +1 -0
  229. package/dist/tools/get-price-history.js +236 -0
  230. package/dist/tools/get-price-history.js.map +1 -0
  231. package/dist/tools/get-transactions.d.ts +29 -0
  232. package/dist/tools/get-transactions.d.ts.map +1 -0
  233. package/dist/tools/get-transactions.js +181 -0
  234. package/dist/tools/get-transactions.js.map +1 -0
  235. package/dist/tools/index.d.ts +26 -0
  236. package/dist/tools/index.d.ts.map +1 -0
  237. package/dist/tools/index.js +32 -0
  238. package/dist/tools/index.js.map +1 -0
  239. package/dist/tools/optimize-portfolio.d.ts +37 -0
  240. package/dist/tools/optimize-portfolio.d.ts.map +1 -0
  241. package/dist/tools/optimize-portfolio.js +459 -0
  242. package/dist/tools/optimize-portfolio.js.map +1 -0
  243. package/dist/tools/predict-yield.d.ts +30 -0
  244. package/dist/tools/predict-yield.d.ts.map +1 -0
  245. package/dist/tools/predict-yield.js +248 -0
  246. package/dist/tools/predict-yield.js.map +1 -0
  247. package/dist/tools/query-graphql.d.ts +35 -0
  248. package/dist/tools/query-graphql.d.ts.map +1 -0
  249. package/dist/tools/query-graphql.js +54 -0
  250. package/dist/tools/query-graphql.js.map +1 -0
  251. package/dist/tools/registry.d.ts +42 -0
  252. package/dist/tools/registry.d.ts.map +1 -0
  253. package/dist/tools/registry.js +231 -0
  254. package/dist/tools/registry.js.map +1 -0
  255. package/dist/tools/search-vaults.d.ts +40 -0
  256. package/dist/tools/search-vaults.d.ts.map +1 -0
  257. package/dist/tools/search-vaults.js +184 -0
  258. package/dist/tools/search-vaults.js.map +1 -0
  259. package/dist/tools/simulate-vault.d.ts +80 -0
  260. package/dist/tools/simulate-vault.d.ts.map +1 -0
  261. package/dist/tools/simulate-vault.js +281 -0
  262. package/dist/tools/simulate-vault.js.map +1 -0
  263. package/dist/tools/user-portfolio.d.ts +30 -0
  264. package/dist/tools/user-portfolio.d.ts.map +1 -0
  265. package/dist/tools/user-portfolio.js +142 -0
  266. package/dist/tools/user-portfolio.js.map +1 -0
  267. package/dist/tools/vault-data.d.ts +23 -0
  268. package/dist/tools/vault-data.d.ts.map +1 -0
  269. package/dist/tools/vault-data.js +68 -0
  270. package/dist/tools/vault-data.js.map +1 -0
  271. package/dist/tools/vault-performance.d.ts +30 -0
  272. package/dist/tools/vault-performance.d.ts.map +1 -0
  273. package/dist/tools/vault-performance.js +275 -0
  274. package/dist/tools/vault-performance.js.map +1 -0
  275. package/dist/types/generated.d.ts +1109 -0
  276. package/dist/types/generated.d.ts.map +1 -0
  277. package/dist/types/generated.js +2 -0
  278. package/dist/types/generated.js.map +1 -0
  279. package/dist/types/index.d.ts +46 -0
  280. package/dist/types/index.d.ts.map +1 -0
  281. package/dist/types/index.js +8 -0
  282. package/dist/types/index.js.map +1 -0
  283. package/dist/utils/comparison-metrics.d.ts +120 -0
  284. package/dist/utils/comparison-metrics.d.ts.map +1 -0
  285. package/dist/utils/comparison-metrics.js +215 -0
  286. package/dist/utils/comparison-metrics.js.map +1 -0
  287. package/dist/utils/config-loader.d.ts +17 -0
  288. package/dist/utils/config-loader.d.ts.map +1 -0
  289. package/dist/utils/config-loader.js +45 -0
  290. package/dist/utils/config-loader.js.map +1 -0
  291. package/dist/utils/csv-generator.d.ts +89 -0
  292. package/dist/utils/csv-generator.d.ts.map +1 -0
  293. package/dist/utils/csv-generator.js +97 -0
  294. package/dist/utils/csv-generator.js.map +1 -0
  295. package/dist/utils/disclaimers.d.ts +70 -0
  296. package/dist/utils/disclaimers.d.ts.map +1 -0
  297. package/dist/utils/disclaimers.js +161 -0
  298. package/dist/utils/disclaimers.js.map +1 -0
  299. package/dist/utils/errors.d.ts +66 -0
  300. package/dist/utils/errors.d.ts.map +1 -0
  301. package/dist/utils/errors.js +86 -0
  302. package/dist/utils/errors.js.map +1 -0
  303. package/dist/utils/execute-tool-with-cache.d.ts +97 -0
  304. package/dist/utils/execute-tool-with-cache.d.ts.map +1 -0
  305. package/dist/utils/execute-tool-with-cache.js +105 -0
  306. package/dist/utils/execute-tool-with-cache.js.map +1 -0
  307. package/dist/utils/portfolio-optimization.d.ts +100 -0
  308. package/dist/utils/portfolio-optimization.d.ts.map +1 -0
  309. package/dist/utils/portfolio-optimization.js +283 -0
  310. package/dist/utils/portfolio-optimization.js.map +1 -0
  311. package/dist/utils/risk-scoring.d.ts +226 -0
  312. package/dist/utils/risk-scoring.d.ts.map +1 -0
  313. package/dist/utils/risk-scoring.js +523 -0
  314. package/dist/utils/risk-scoring.js.map +1 -0
  315. package/dist/utils/tool-error-handler.d.ts +16 -0
  316. package/dist/utils/tool-error-handler.d.ts.map +1 -0
  317. package/dist/utils/tool-error-handler.js +43 -0
  318. package/dist/utils/tool-error-handler.js.map +1 -0
  319. package/dist/utils/tool-handler.d.ts +33 -0
  320. package/dist/utils/tool-handler.d.ts.map +1 -0
  321. package/dist/utils/tool-handler.js +59 -0
  322. package/dist/utils/tool-handler.js.map +1 -0
  323. package/dist/utils/tool-response.d.ts +16 -0
  324. package/dist/utils/tool-response.d.ts.map +1 -0
  325. package/dist/utils/tool-response.js +25 -0
  326. package/dist/utils/tool-response.js.map +1 -0
  327. package/dist/utils/validators.d.ts +359 -0
  328. package/dist/utils/validators.d.ts.map +1 -0
  329. package/dist/utils/validators.js +233 -0
  330. package/dist/utils/validators.js.map +1 -0
  331. package/dist/utils/yield-prediction.d.ts +69 -0
  332. package/dist/utils/yield-prediction.d.ts.map +1 -0
  333. package/dist/utils/yield-prediction.js +290 -0
  334. package/dist/utils/yield-prediction.js.map +1 -0
  335. package/package.json +83 -0
@@ -0,0 +1,142 @@
1
+ /**
2
+ * get_user_portfolio Tool
3
+ *
4
+ * Fetch user's complete portfolio across all chains with 5-minute caching.
5
+ * Optimized for cross-chain portfolio aggregation using single query.
6
+ *
7
+ * Use cases:
8
+ * - Multi-chain portfolio analysis
9
+ * - User position tracking across all supported chains
10
+ * - Portfolio value aggregation
11
+ * - Performance: ~500-1000 tokens per user (depending on position count)
12
+ *
13
+ * Cache strategy:
14
+ * - 5-minute TTL for frequently changing user positions
15
+ * - Cache key: portfolio:{address}
16
+ * - Single query returns all chains at once
17
+ * - Cache hit rate target: 70-80%
18
+ * - Cache tags: [CacheTag.PORTFOLIO] for invalidation
19
+ */
20
+ import { getToolDisclaimer } from '../utils/disclaimers.js';
21
+ import { createGetUserPortfolioQuery } from '../graphql/queries/portfolio.queries.js';
22
+ import { executeToolWithCache } from '../utils/execute-tool-with-cache.js';
23
+ import { CacheTag } from '../core/cache-invalidation.js';
24
+ import { cacheKeys, cacheTTL, generateCacheKey } from '../cache/index.js';
25
+ /**
26
+ * Transform raw GraphQL response into aggregated portfolio
27
+ */
28
+ function createTransformPortfolioData(userAddress) {
29
+ return (data) => {
30
+ const positions = [];
31
+ let totalValueUsd = 0;
32
+ // Process all user items (typically one user)
33
+ for (const user of data.users.items) {
34
+ // Add user's total value
35
+ const userTotalUsd = parseFloat(user.state.totalSharesUsd || '0');
36
+ totalValueUsd += userTotalUsd;
37
+ // Process each vault position
38
+ for (const position of user.vaultPositions) {
39
+ positions.push({
40
+ // Vault identification
41
+ vaultAddress: position.vault.address,
42
+ vaultSymbol: position.vault.symbol,
43
+ vaultName: position.vault.name,
44
+ // Asset information
45
+ assetSymbol: position.vault.asset.symbol,
46
+ assetAddress: position.vault.asset.address,
47
+ // Position state
48
+ shares: position.state.shares,
49
+ assets: position.state.assets,
50
+ sharesUsd: position.state.sharesUsd,
51
+ // Complete vault metadata
52
+ vault: position.vault,
53
+ });
54
+ }
55
+ }
56
+ // Sort positions by USD value (descending)
57
+ positions.sort((a, b) => {
58
+ const aUsd = parseFloat(a.sharesUsd || '0');
59
+ const bUsd = parseFloat(b.sharesUsd || '0');
60
+ return bUsd - aUsd;
61
+ });
62
+ return {
63
+ userAddress,
64
+ positions,
65
+ totalValueUsd: totalValueUsd.toFixed(2),
66
+ positionCount: positions.length,
67
+ };
68
+ };
69
+ }
70
+ /**
71
+ * Create the executeGetUserPortfolio function with DI container
72
+ *
73
+ * @param container - Service container with dependencies
74
+ * @returns Configured tool executor function
75
+ */
76
+ export function createExecuteGetUserPortfolio(container) {
77
+ return async (input) => {
78
+ // Determine response format (default to 'summary' for balanced performance)
79
+ const responseFormat = input.responseFormat === 'list'
80
+ ? 'list'
81
+ : input.responseFormat === 'full'
82
+ ? 'full'
83
+ : 'summary';
84
+ // Generate cache key (responseFormat doesn't affect caching since fragments are structural)
85
+ const cacheKey = cacheKeys.userPortfolio(input.userAddress);
86
+ // Create dynamic query based on responseFormat
87
+ const query = createGetUserPortfolioQuery(responseFormat);
88
+ const executor = executeToolWithCache({
89
+ container,
90
+ cacheKey: () => cacheKey,
91
+ cacheTTL: cacheTTL.userPortfolio,
92
+ query,
93
+ variables: (input) => ({
94
+ where: {
95
+ user_eq: input.userAddress,
96
+ },
97
+ }),
98
+ validateResult: (data) => ({
99
+ valid: !!(data.users.items && data.users.items.length > 0),
100
+ message: data.users.items && data.users.items.length > 0
101
+ ? undefined
102
+ : `No portfolio data found for user: ${String(data)}`,
103
+ }),
104
+ transformResult: createTransformPortfolioData(input.userAddress),
105
+ toolName: 'get_user_portfolio',
106
+ });
107
+ // Register cache tags for invalidation
108
+ container.cacheInvalidator.register(cacheKey, [CacheTag.PORTFOLIO]);
109
+ // Execute query
110
+ const result = await executor(input);
111
+ // NEW: Fragment-level caching - cache each vault from positions for reuse
112
+ // This enables vault_data tool to reuse vaults from portfolio results
113
+ if (!result.isError && result.content[0]?.type === 'text') {
114
+ try {
115
+ const responseData = JSON.parse(result.content[0].text);
116
+ if (responseData.positions && Array.isArray(responseData.positions)) {
117
+ // Cache each vault from positions individually with vault-specific key
118
+ const positions = responseData.positions;
119
+ positions.forEach((position) => {
120
+ if (position.vault && position.vault.address && position.vault.chain?.id) {
121
+ const vaultCacheKey = generateCacheKey(CacheTag.VAULT, {
122
+ address: String(position.vault.address),
123
+ chainId: Number(position.vault.chain.id),
124
+ });
125
+ container.cache.set(vaultCacheKey, position.vault, cacheTTL.vaultData);
126
+ }
127
+ });
128
+ }
129
+ }
130
+ catch (error) {
131
+ // If parsing fails, just return the result without fragment caching
132
+ // This is a non-critical optimization
133
+ }
134
+ }
135
+ // Add legal disclaimer to output
136
+ if (!result.isError && result.content[0]?.type === 'text') {
137
+ result.content[0].text = result.content[0].text + getToolDisclaimer('user_portfolio');
138
+ }
139
+ return result;
140
+ };
141
+ }
142
+ //# sourceMappingURL=user-portfolio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-portfolio.js","sourceRoot":"","sources":["../../src/tools/user-portfolio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * get_vault_data Tool
3
+ *
4
+ * Fetch complete vault information with 15-minute caching.
5
+ * Optimized for detailed analysis of 1-5 vaults.
6
+ *
7
+ * Use cases:
8
+ * - Detailed vault analysis with all fields
9
+ * - Single or small set of vaults (1-5)
10
+ * - Repeated queries for same vault data
11
+ * - Performance: ~500 tokens per vault
12
+ *
13
+ * Cache strategy:
14
+ * - 15-minute TTL for balance between freshness and performance
15
+ * - Cache key: vault:{address}:{chainId}
16
+ * - Cache hit rate target: 80-90%
17
+ * - Cache tags: [CacheTag.VAULT] for invalidation
18
+ */
19
+ import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
20
+ import { GetVaultDataInput } from '../utils/validators.js';
21
+ import { ServiceContainer } from '../core/container.js';
22
+ export declare function createExecuteGetVaultData(container: ServiceContainer): (input: GetVaultDataInput) => Promise<CallToolResult>;
23
+ //# sourceMappingURL=vault-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-data.d.ts","sourceRoot":"","sources":["../../src/tools/vault-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAK3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AA2BxD,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,gBAAgB,GAC1B,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,cAAc,CAAC,CAmDvD"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * get_vault_data Tool
3
+ *
4
+ * Fetch complete vault information with 15-minute caching.
5
+ * Optimized for detailed analysis of 1-5 vaults.
6
+ *
7
+ * Use cases:
8
+ * - Detailed vault analysis with all fields
9
+ * - Single or small set of vaults (1-5)
10
+ * - Repeated queries for same vault data
11
+ * - Performance: ~500 tokens per vault
12
+ *
13
+ * Cache strategy:
14
+ * - 15-minute TTL for balance between freshness and performance
15
+ * - Cache key: vault:{address}:{chainId}
16
+ * - Cache hit rate target: 80-90%
17
+ * - Cache tags: [CacheTag.VAULT] for invalidation
18
+ */
19
+ import { getToolDisclaimer } from '../utils/disclaimers.js';
20
+ import { GET_VAULT_DATA_QUERY } from '../graphql/queries/index.js';
21
+ import { executeToolWithCache } from '../utils/execute-tool-with-cache.js';
22
+ import { CacheTag } from '../core/cache-invalidation.js';
23
+ import { cacheKeys, cacheTTL } from '../cache/index.js';
24
+ import { generateCacheKey } from '../cache/index.js';
25
+ import { createSuccessResponse } from '../utils/tool-response.js';
26
+ export function createExecuteGetVaultData(container) {
27
+ return async (input) => {
28
+ // NEW: Check fragment-level cache first (vaults from search_vaults)
29
+ // This enables data reuse across tools without duplicate GraphQL queries
30
+ const fragmentCacheKey = generateCacheKey(CacheTag.VAULT, {
31
+ address: input.vaultAddress,
32
+ chainId: input.chainId,
33
+ });
34
+ const cachedVault = container.cache.get(fragmentCacheKey);
35
+ if (cachedVault) {
36
+ // Cache hit from search_vaults - return immediately without GraphQL query
37
+ return createSuccessResponse({ vaultByAddress: cachedVault });
38
+ }
39
+ // Cache miss - execute GraphQL query with standard caching
40
+ const executor = executeToolWithCache({
41
+ container,
42
+ cacheKey: (input) => cacheKeys.vaultData(input.vaultAddress, input.chainId),
43
+ cacheTTL: cacheTTL.vaultData,
44
+ query: GET_VAULT_DATA_QUERY,
45
+ variables: (input) => ({
46
+ address: input.vaultAddress,
47
+ chainId: input.chainId,
48
+ }),
49
+ validateResult: (data) => ({
50
+ valid: !!data.vaultByAddress,
51
+ message: data.vaultByAddress
52
+ ? undefined
53
+ : `Vault not found: address ${String(data)} on requested chain`,
54
+ }),
55
+ toolName: 'get_vault_data',
56
+ });
57
+ // Register cache tags for invalidation
58
+ const cacheKey = cacheKeys.vaultData(input.vaultAddress, input.chainId);
59
+ container.cacheInvalidator.register(cacheKey, [CacheTag.VAULT]);
60
+ const result = await executor(input);
61
+ // Add legal disclaimer to output
62
+ if (!result.isError && result.content[0]?.type === 'text') {
63
+ result.content[0].text = result.content[0].text + getToolDisclaimer('vault_data');
64
+ }
65
+ return result;
66
+ };
67
+ }
68
+ //# sourceMappingURL=vault-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-data.js","sourceRoot":"","sources":["../../src/tools/vault-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAuBlE,MAAM,UAAU,yBAAyB,CACvC,SAA2B;IAE3B,OAAO,KAAK,EAAE,KAAwB,EAA2B,EAAE;QACjE,oEAAoE;QACpE,yEAAyE;QACzE,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,QAAQ,CAAC,KAAK,EAAE;YACxD,OAAO,EAAE,KAAK,CAAC,YAAY;YAC3B,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC1D,IAAI,WAAW,EAAE,CAAC;YAChB,0EAA0E;YAC1E,OAAO,qBAAqB,CAAC,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,2DAA2D;QAC3D,MAAM,QAAQ,GAAG,oBAAoB,CAInC;YACA,SAAS;YACT,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC;YAC3E,QAAQ,EAAE,QAAQ,CAAC,SAAS;YAC5B,KAAK,EAAE,oBAAoB;YAC3B,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACrB,OAAO,EAAE,KAAK,CAAC,YAAY;gBAC3B,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC;YACF,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACzB,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc;gBAC5B,OAAO,EAAE,IAAI,CAAC,cAAc;oBAC1B,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,4BAA4B,MAAM,CAAC,IAAI,CAAC,qBAAqB;aAClE,CAAC;YACF,QAAQ,EAAE,gBAAgB;SAC3B,CAAC,CAAC;QAEH,uCAAuC;QACvC,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACxE,SAAS,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAEhE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;QAErC,iCAAiC;QACjC,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1D,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;QACpF,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * get_vault_performance Tool
3
+ *
4
+ * Historical metrics and trend analysis for vaults with 30-minute caching.
5
+ * Aggregates transaction data to provide time-series performance metrics.
6
+ *
7
+ * Use cases:
8
+ * - Performance tracking over time (7d, 30d, 90d, 1y)
9
+ * - TVL trend analysis and inflection point identification
10
+ * - Historical deposit/withdrawal volume analysis
11
+ * - Percent change calculations and performance comparison
12
+ * - Performance: ~400-600 tokens per vault per time range
13
+ *
14
+ * Cache strategy:
15
+ * - 30-minute TTL (historical data changes infrequently)
16
+ * - Cache key: perf:{address}:{chainId}:{timeRange}
17
+ * - Cache hit rate target: 80-90%
18
+ * - Cache tags: [CacheTag.VAULT, CacheTag.APR] for invalidation
19
+ */
20
+ import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
21
+ import { GetVaultPerformanceInput } from '../utils/validators.js';
22
+ import { ServiceContainer } from '../core/container.js';
23
+ /**
24
+ * Create the executeGetVaultPerformance function with DI container
25
+ *
26
+ * @param container - Service container with dependencies
27
+ * @returns Configured tool executor function
28
+ */
29
+ export declare function createExecuteGetVaultPerformance(container: ServiceContainer): (input: GetVaultPerformanceInput) => Promise<CallToolResult>;
30
+ //# sourceMappingURL=vault-performance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-performance.d.ts","sourceRoot":"","sources":["../../src/tools/vault-performance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAGlE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAqWxD;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAC9C,SAAS,EAAE,gBAAgB,GAC1B,CAAC,KAAK,EAAE,wBAAwB,KAAK,OAAO,CAAC,cAAc,CAAC,CAwE9D"}
@@ -0,0 +1,275 @@
1
+ /**
2
+ * get_vault_performance Tool
3
+ *
4
+ * Historical metrics and trend analysis for vaults with 30-minute caching.
5
+ * Aggregates transaction data to provide time-series performance metrics.
6
+ *
7
+ * Use cases:
8
+ * - Performance tracking over time (7d, 30d, 90d, 1y)
9
+ * - TVL trend analysis and inflection point identification
10
+ * - Historical deposit/withdrawal volume analysis
11
+ * - Percent change calculations and performance comparison
12
+ * - Performance: ~400-600 tokens per vault per time range
13
+ *
14
+ * Cache strategy:
15
+ * - 30-minute TTL (historical data changes infrequently)
16
+ * - Cache key: perf:{address}:{chainId}:{timeRange}
17
+ * - Cache hit rate target: 80-90%
18
+ * - Cache tags: [CacheTag.VAULT, CacheTag.APR] for invalidation
19
+ */
20
+ import { getToolDisclaimer } from '../utils/disclaimers.js';
21
+ import { executeToolWithCache } from '../utils/execute-tool-with-cache.js';
22
+ import { CacheTag } from '../core/cache-invalidation.js';
23
+ import { cacheKeys, cacheTTL } from '../cache/index.js';
24
+ import { GET_VAULT_FOR_APR_QUERY, GET_VAULT_PERFORMANCE_QUERY, GET_PERIOD_SUMMARIES_QUERY, } from '../graphql/queries/index.js';
25
+ import { transformPeriodSummariesToAPRData, calculateCurrentAPR, } from '../sdk/apr-service.js';
26
+ /**
27
+ * Time range constants (in seconds)
28
+ */
29
+ const TIME_RANGES = {
30
+ '7d': 7 * 24 * 60 * 60,
31
+ '30d': 30 * 24 * 60 * 60,
32
+ '90d': 90 * 24 * 60 * 60,
33
+ '1y': 365 * 24 * 60 * 60,
34
+ };
35
+ /**
36
+ * Type guard for TotalAssetsUpdatedData
37
+ */
38
+ function isTotalAssetsUpdated(data) {
39
+ return (typeof data === 'object' && data !== null && 'totalAssetsUsd' in data && 'totalAssets' in data);
40
+ }
41
+ /**
42
+ * Type guard for PeriodSummaryData
43
+ */
44
+ function isPeriodSummary(data) {
45
+ return (typeof data === 'object' &&
46
+ data !== null &&
47
+ 'duration' in data &&
48
+ 'totalAssetsAtStart' in data &&
49
+ 'totalSupplyAtStart' in data);
50
+ }
51
+ /**
52
+ * Aggregate transaction data into time-series metrics
53
+ */
54
+ function aggregateMetrics(transactions) {
55
+ const metrics = [];
56
+ for (const tx of transactions) {
57
+ if (tx.type === 'TotalAssetsUpdated' && isTotalAssetsUpdated(tx.data)) {
58
+ metrics.push({
59
+ timestamp: parseInt(tx.timestamp, 10),
60
+ totalAssetsUsd: tx.data.totalAssetsUsd,
61
+ blockNumber: tx.blockNumber,
62
+ });
63
+ }
64
+ else if (tx.type === 'PeriodSummary' && isPeriodSummary(tx.data)) {
65
+ // PeriodSummary contains totalAssetsAtEnd which represents the total assets at period end
66
+ metrics.push({
67
+ timestamp: parseInt(tx.timestamp, 10),
68
+ totalAssetsUsd: parseFloat(tx.data.totalAssetsAtEnd),
69
+ blockNumber: tx.blockNumber,
70
+ });
71
+ }
72
+ }
73
+ return metrics;
74
+ }
75
+ /**
76
+ * Calculate summary statistics from metrics
77
+ */
78
+ function calculateSummary(metrics, transactions) {
79
+ if (metrics.length === 0) {
80
+ return {
81
+ startValue: 0,
82
+ endValue: 0,
83
+ percentChange: 0,
84
+ volumeUsd: 0,
85
+ transactionCount: 0,
86
+ };
87
+ }
88
+ const startValue = metrics[0].totalAssetsUsd;
89
+ const endValue = metrics[metrics.length - 1].totalAssetsUsd;
90
+ const percentChange = startValue > 0 ? ((endValue - startValue) / startValue) * 100 : 0;
91
+ // Volume calculation: deposit/withdrawal fields not available in current schema
92
+ // Frontend confirmed it doesn't use volume metrics, so we set to 0
93
+ // If volume is needed in future, fields must be added to GraphQL schema first
94
+ const volumeUsd = 0;
95
+ return {
96
+ startValue,
97
+ endValue,
98
+ percentChange,
99
+ volumeUsd,
100
+ transactionCount: transactions.length,
101
+ };
102
+ }
103
+ /**
104
+ * Calculate SDK APR data for vault
105
+ *
106
+ * Fetches period summaries and vault data to calculate protocol-accurate APR
107
+ * using Lagoon SDK functions.
108
+ *
109
+ * @param container - Service container with GraphQL client
110
+ * @param vaultAddress - Vault address
111
+ * @param chainId - Chain ID
112
+ * @returns SDK-calculated APR data or undefined if unavailable
113
+ */
114
+ async function calculateSDKAPR(container, vaultAddress, chainId) {
115
+ try {
116
+ // Fetch period summaries for historical APR data
117
+ const periodSummariesData = await container.graphqlClient.request(GET_PERIOD_SUMMARIES_QUERY, {
118
+ where: {
119
+ vault_in: [vaultAddress],
120
+ chainId_eq: chainId,
121
+ type_in: ['PeriodSummary'],
122
+ },
123
+ orderBy: 'timestamp',
124
+ orderDirection: 'asc',
125
+ first: 1000,
126
+ });
127
+ // Fetch vault data for current price per share
128
+ const vaultData = await container.graphqlClient.request(GET_VAULT_FOR_APR_QUERY, {
129
+ address: vaultAddress,
130
+ chainId,
131
+ });
132
+ // Graceful degradation if no data available
133
+ if (!periodSummariesData.transactions?.items?.length || !vaultData.vaultByAddress) {
134
+ return undefined;
135
+ }
136
+ const vault = vaultData.vaultByAddress;
137
+ // Extract PeriodSummary data from transaction items
138
+ const periodSummaries = periodSummariesData.transactions.items.map((tx) => ({
139
+ timestamp: tx.timestamp,
140
+ totalAssetsAtStart: tx.data.totalAssetsAtStart,
141
+ totalSupplyAtStart: tx.data.totalSupplyAtStart,
142
+ }));
143
+ // Transform period summaries to APR historical data
144
+ const aprData = transformPeriodSummariesToAPRData(periodSummaries, vault);
145
+ // Check if we have any APR data
146
+ if (!aprData.thirtyDay && !aprData.inception) {
147
+ return undefined;
148
+ }
149
+ // Get current price per share
150
+ const currentPricePerShare = BigInt(vault.state.pricePerShare);
151
+ // Calculate current APR values
152
+ const aprs = calculateCurrentAPR(aprData, currentPricePerShare);
153
+ // Build SDK APR response
154
+ const result = {
155
+ method: 'Lagoon SDK v0.10.1',
156
+ dataSource: 'Lagoon GraphQL period summaries',
157
+ };
158
+ // Add 30-day APR if available
159
+ if (aprData.thirtyDay && aprs.thirtyDay !== undefined) {
160
+ const assetDecimals = vault.asset.decimals;
161
+ result.thirtyDay = {
162
+ timestamp: aprData.thirtyDay.timestamp,
163
+ pricePerShare: aprData.thirtyDay.pricePerShare.toString(),
164
+ pricePerShareDecimal: (Number(aprData.thirtyDay.pricePerShare) /
165
+ 10 ** assetDecimals).toFixed(assetDecimals),
166
+ apr: aprs.thirtyDay,
167
+ };
168
+ }
169
+ // Add inception APR if available
170
+ if (aprData.inception && aprs.inception !== undefined) {
171
+ const assetDecimals = vault.asset.decimals;
172
+ result.inception = {
173
+ timestamp: aprData.inception.timestamp,
174
+ pricePerShare: aprData.inception.pricePerShare.toString(),
175
+ pricePerShareDecimal: (Number(aprData.inception.pricePerShare) /
176
+ 10 ** assetDecimals).toFixed(assetDecimals),
177
+ apr: aprs.inception,
178
+ };
179
+ }
180
+ return result;
181
+ }
182
+ catch (error) {
183
+ // Log error but don't fail the entire request
184
+ console.error('Failed to calculate SDK APR:', error);
185
+ return undefined;
186
+ }
187
+ }
188
+ /**
189
+ * Transform raw GraphQL response into performance output
190
+ * Uses closure to capture input values and timestamp filter
191
+ */
192
+ function createTransformPerformanceData(input, timestampGte) {
193
+ return (data) => {
194
+ // Filter transactions by timestamp client-side
195
+ const filteredItems = data.transactions.items.filter((item) => parseInt(item.timestamp) >= timestampGte);
196
+ // Aggregate metrics from filtered transactions
197
+ const metrics = aggregateMetrics(filteredItems);
198
+ // Calculate summary statistics
199
+ const summary = calculateSummary(metrics, filteredItems);
200
+ return {
201
+ metrics,
202
+ summary,
203
+ vaultAddress: input.vaultAddress,
204
+ chainId: input.chainId,
205
+ timeRange: input.timeRange,
206
+ hasMoreData: data.transactions.pageInfo.hasNextPage,
207
+ };
208
+ };
209
+ }
210
+ /**
211
+ * Create the executeGetVaultPerformance function with DI container
212
+ *
213
+ * @param container - Service container with dependencies
214
+ * @returns Configured tool executor function
215
+ */
216
+ export function createExecuteGetVaultPerformance(container) {
217
+ return async (input) => {
218
+ // Calculate timestamp threshold for GraphQL query
219
+ const now = Math.floor(Date.now() / 1000);
220
+ const timeRangeSeconds = TIME_RANGES[input.timeRange];
221
+ const timestampGte = now - timeRangeSeconds;
222
+ // Create executor with caching
223
+ const executor = executeToolWithCache({
224
+ container,
225
+ cacheKey: (input) => cacheKeys.vaultPerformance(input.vaultAddress, input.chainId, input.timeRange),
226
+ cacheTTL: cacheTTL.performance,
227
+ query: GET_VAULT_PERFORMANCE_QUERY,
228
+ variables: (input) => ({
229
+ where: {
230
+ vault_in: [input.vaultAddress],
231
+ type_in: ['TotalAssetsUpdated', 'PeriodSummary'],
232
+ },
233
+ orderBy: 'timestamp',
234
+ orderDirection: 'asc',
235
+ first: 1000, // GraphQL API limit: 1-1000
236
+ }),
237
+ validateResult: (data) => ({
238
+ valid: !!(data.transactions && data.transactions.items.length > 0),
239
+ message: data.transactions && data.transactions.items.length > 0
240
+ ? undefined
241
+ : `No transaction data found for vault ${input.vaultAddress} on chain ${input.chainId} in the ${input.timeRange} time range.`,
242
+ }),
243
+ transformResult: createTransformPerformanceData(input, timestampGte),
244
+ toolName: 'get_vault_performance',
245
+ });
246
+ // Register cache tags for invalidation
247
+ const cacheKey = cacheKeys.vaultPerformance(input.vaultAddress, input.chainId, input.timeRange);
248
+ container.cacheInvalidator.register(cacheKey, [CacheTag.VAULT, CacheTag.APR]);
249
+ // Execute main query with caching
250
+ const result = await executor(input);
251
+ // Post-processing: Add SDK APR calculations if requested
252
+ if (input.includeSDKCalculations && !result.isError && result.content[0]?.type === 'text') {
253
+ try {
254
+ const sdkAPR = await calculateSDKAPR(container, input.vaultAddress, input.chainId);
255
+ if (sdkAPR) {
256
+ // Parse existing JSON output
257
+ const output = JSON.parse(result.content[0].text);
258
+ // Add SDK APR data to output
259
+ output.sdkCalculatedAPR = sdkAPR;
260
+ // Update result with modified output
261
+ result.content[0].text = JSON.stringify(output, null, 2);
262
+ }
263
+ }
264
+ catch (error) {
265
+ console.error('Failed to add SDK APR to response:', error);
266
+ }
267
+ }
268
+ // Add legal disclaimer to output
269
+ if (!result.isError && result.content[0]?.type === 'text') {
270
+ result.content[0].text = result.content[0].text + getToolDisclaimer('vault_performance');
271
+ }
272
+ return result;
273
+ };
274
+ }
275
+ //# sourceMappingURL=vault-performance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-performance.js","sourceRoot":"","sources":["../../src/tools/vault-performance.ts"],"names":[],"mappings":"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"}