@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,40 @@
1
+ /**
2
+ * search_vaults Tool
3
+ *
4
+ * Vault discovery and filtering with advanced search capabilities.
5
+ * Supports 20+ filter options with pagination and 10-minute caching.
6
+ *
7
+ * Use cases:
8
+ * - Discover vaults by asset, chain, TVL, curator
9
+ * - Filter vaults with complex criteria combinations
10
+ * - Paginate through large result sets
11
+ * - Sort by TVL, address, chainId, or id
12
+ * - Performance: ~300-500 tokens per page of results
13
+ *
14
+ * Cache strategy:
15
+ * - 10-minute TTL for balance between freshness and performance
16
+ * - Cache key: search:{MD5 hash of filters}:{pagination}:{sort}
17
+ * - Repeated searches with same filters hit cache
18
+ * - Cache hit rate target: 70-80%
19
+ * - Cache tags: [CacheTag.VAULT] for invalidation
20
+ */
21
+ import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
22
+ import { SearchVaultsInput } from '../utils/validators.js';
23
+ import { ServiceContainer } from '../core/container.js';
24
+ /**
25
+ * Create the executeSearchVaults function with DI container
26
+ *
27
+ * This factory function demonstrates the moderate complexity pattern with optimizations:
28
+ * 1. Custom cache key generation with MD5 hashing
29
+ * 2. Complex variable mapping with filter transformation
30
+ * 3. Custom validation for empty results
31
+ * 4. Cache tag registration for invalidation
32
+ * 5. NEW: Dynamic fragment selection based on responseFormat
33
+ * 6. NEW: Fragment-level caching for individual vaults (enables data reuse)
34
+ * 7. NEW: maxResults override for pagination.first
35
+ *
36
+ * @param container - Service container with dependencies
37
+ * @returns Configured tool executor function
38
+ */
39
+ export declare function createExecuteSearchVaults(container: ServiceContainer): (input: SearchVaultsInput) => Promise<CallToolResult>;
40
+ //# sourceMappingURL=search-vaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-vaults.d.ts","sourceRoot":"","sources":["../../src/tools/search-vaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAGpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAK3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAiHxD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,gBAAgB,GAC1B,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,cAAc,CAAC,CA4FvD"}
@@ -0,0 +1,184 @@
1
+ /**
2
+ * search_vaults Tool
3
+ *
4
+ * Vault discovery and filtering with advanced search capabilities.
5
+ * Supports 20+ filter options with pagination and 10-minute caching.
6
+ *
7
+ * Use cases:
8
+ * - Discover vaults by asset, chain, TVL, curator
9
+ * - Filter vaults with complex criteria combinations
10
+ * - Paginate through large result sets
11
+ * - Sort by TVL, address, chainId, or id
12
+ * - Performance: ~300-500 tokens per page of results
13
+ *
14
+ * Cache strategy:
15
+ * - 10-minute TTL for balance between freshness and performance
16
+ * - Cache key: search:{MD5 hash of filters}:{pagination}:{sort}
17
+ * - Repeated searches with same filters hit cache
18
+ * - Cache hit rate target: 70-80%
19
+ * - Cache tags: [CacheTag.VAULT] for invalidation
20
+ */
21
+ import { createHash } from 'crypto';
22
+ import { getToolDisclaimer } from '../utils/disclaimers.js';
23
+ import { createSearchVaultsQuery } from '../graphql/queries/search.queries.js';
24
+ import { executeToolWithCache } from '../utils/execute-tool-with-cache.js';
25
+ import { CacheTag } from '../core/cache-invalidation.js';
26
+ import { cacheKeys, cacheTTL } from '../cache/index.js';
27
+ import { generateCacheKey } from '../cache/index.js';
28
+ /**
29
+ * Convert snake_case filters to GraphQL VaultFilterInput format
30
+ * Handles nested state filters by flattening them
31
+ */
32
+ function buildGraphQLFilters(filters) {
33
+ if (!filters) {
34
+ return {};
35
+ }
36
+ const graphqlFilters = {};
37
+ // Direct pass-through filters (no transformation needed)
38
+ const directFilters = [
39
+ 'assetSymbol_eq',
40
+ 'assetSymbol_in',
41
+ 'assetId_eq',
42
+ 'assetId_in',
43
+ 'chainId_eq',
44
+ 'chainId_in',
45
+ 'curatorIds_contains',
46
+ 'curatorIds_contains_any',
47
+ 'isVisible_eq',
48
+ 'address_eq',
49
+ 'address_in',
50
+ 'symbol_eq',
51
+ 'symbol_in',
52
+ 'integratorId_eq',
53
+ 'integratorId_in',
54
+ ];
55
+ for (const key of directFilters) {
56
+ if (key in filters && filters[key] !== undefined) {
57
+ graphqlFilters[key] = filters[key];
58
+ }
59
+ }
60
+ // Handle nested state filters
61
+ // Note: Backend may not support these - will be tested in Phase 2.5
62
+ if (filters.state_totalAssetsUsd_gte !== undefined) {
63
+ graphqlFilters.state_totalAssetsUsd_gte = filters.state_totalAssetsUsd_gte;
64
+ }
65
+ if (filters.state_totalAssetsUsd_lte !== undefined) {
66
+ graphqlFilters.state_totalAssetsUsd_lte = filters.state_totalAssetsUsd_lte;
67
+ }
68
+ return graphqlFilters;
69
+ }
70
+ /**
71
+ * Generate MD5 hash of filter object for cache key
72
+ * Ensures consistent cache keys for identical filter combinations
73
+ */
74
+ function hashFilters(filters) {
75
+ if (!filters || Object.keys(filters).length === 0) {
76
+ return 'empty';
77
+ }
78
+ const sortedFilters = Object.keys(filters)
79
+ .sort()
80
+ .reduce((acc, key) => {
81
+ const typedKey = key;
82
+ const value = filters[typedKey];
83
+ if (value !== undefined) {
84
+ // Safe assignment: we know the key exists in filters and we're assigning its value
85
+ acc[typedKey] = value;
86
+ }
87
+ return acc;
88
+ }, {});
89
+ const filterString = JSON.stringify(sortedFilters);
90
+ return createHash('md5').update(filterString).digest('hex');
91
+ }
92
+ /**
93
+ * Create the executeSearchVaults function with DI container
94
+ *
95
+ * This factory function demonstrates the moderate complexity pattern with optimizations:
96
+ * 1. Custom cache key generation with MD5 hashing
97
+ * 2. Complex variable mapping with filter transformation
98
+ * 3. Custom validation for empty results
99
+ * 4. Cache tag registration for invalidation
100
+ * 5. NEW: Dynamic fragment selection based on responseFormat
101
+ * 6. NEW: Fragment-level caching for individual vaults (enables data reuse)
102
+ * 7. NEW: maxResults override for pagination.first
103
+ *
104
+ * @param container - Service container with dependencies
105
+ * @returns Configured tool executor function
106
+ */
107
+ export function createExecuteSearchVaults(container) {
108
+ return async (input) => {
109
+ // Apply maxResults to pagination.first (overrides user-provided pagination.first)
110
+ const effectiveFirst = Number(input.maxResults) || Number(input.pagination?.first) || 100;
111
+ const pagination = {
112
+ first: Math.min(effectiveFirst, 100), // Enforce max 100
113
+ skip: Number(input.pagination?.skip) || 0,
114
+ };
115
+ // Determine response format
116
+ const responseFormat = input.responseFormat === 'summary'
117
+ ? 'summary'
118
+ : input.responseFormat === 'full'
119
+ ? 'full'
120
+ : 'list';
121
+ // Generate cache key including responseFormat
122
+ const filterHash = hashFilters(input.filters);
123
+ const cacheKey = `${cacheKeys.searchVaults({ filterHash })}:${pagination.first}:${pagination.skip}:${input.orderBy}:${input.orderDirection}:${responseFormat}`;
124
+ // Register cache tags for invalidation
125
+ container.cacheInvalidator.register(cacheKey, [CacheTag.VAULT]);
126
+ // Create executor with dynamic query based on responseFormat
127
+ const query = createSearchVaultsQuery(responseFormat);
128
+ const executor = executeToolWithCache({
129
+ container,
130
+ cacheKey: () => cacheKey,
131
+ cacheTTL: cacheTTL.searchResults,
132
+ query,
133
+ variables: () => {
134
+ const whereClause = buildGraphQLFilters(input.filters);
135
+ return {
136
+ first: pagination.first,
137
+ skip: pagination.skip,
138
+ orderBy: input.orderBy,
139
+ orderDirection: input.orderDirection,
140
+ where: Object.keys(whereClause).length > 0 ? whereClause : undefined,
141
+ };
142
+ },
143
+ validateResult: (data) => ({
144
+ valid: !!(data.vaults && data.vaults.items.length > 0),
145
+ message: data.vaults && data.vaults.items.length > 0
146
+ ? undefined
147
+ : 'No vaults found matching the specified criteria.',
148
+ }),
149
+ toolName: 'search_vaults',
150
+ });
151
+ // Execute query
152
+ const result = await executor(input);
153
+ // NEW: Fragment-level caching - cache each vault individually for reuse
154
+ // This enables vault_data tool to reuse vaults from search results
155
+ if (!result.isError && result.content[0]?.type === 'text') {
156
+ try {
157
+ const responseData = JSON.parse(result.content[0].text);
158
+ if (responseData.vaults?.items && Array.isArray(responseData.vaults.items)) {
159
+ // Cache each vault individually with vault-specific key
160
+ const vaults = responseData.vaults.items;
161
+ vaults.forEach((vault) => {
162
+ if (vault.address && vault.chain?.id) {
163
+ const vaultCacheKey = generateCacheKey(CacheTag.VAULT, {
164
+ address: String(vault.address),
165
+ chainId: Number(vault.chain.id),
166
+ });
167
+ container.cache.set(vaultCacheKey, vault, cacheTTL.vaultData);
168
+ }
169
+ });
170
+ }
171
+ }
172
+ catch (error) {
173
+ // If parsing fails, just return the result without fragment caching
174
+ // This is a non-critical optimization
175
+ }
176
+ }
177
+ // Add legal disclaimer to output
178
+ if (!result.isError && result.content[0]?.type === 'text') {
179
+ result.content[0].text = result.content[0].text + getToolDisclaimer('search_vaults');
180
+ }
181
+ return result;
182
+ };
183
+ }
184
+ //# sourceMappingURL=search-vaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-vaults.js","sourceRoot":"","sources":["../../src/tools/search-vaults.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * simulate_vault Tool
3
+ *
4
+ * Simulates vault operations with new total assets to model deposit/withdrawal scenarios.
5
+ * Provides protocol-accurate fee calculations, APR impact analysis, and settlement requirements.
6
+ *
7
+ * Use cases:
8
+ * - Simulate deposit/withdrawal impact on share price
9
+ * - Model fee accrual scenarios
10
+ * - Analyze settlement requirements
11
+ * - Validate protocol calculations
12
+ * - Performance: ~400-600 tokens per simulation
13
+ *
14
+ * Cache strategy:
15
+ * - No caching (simulations are specific to input parameters and require fresh vault state)
16
+ *
17
+ * WHY NO CACHING?
18
+ * This tool is intentionally non-cached because:
19
+ * 1. Simulations are parameter-specific (newTotalAssets varies widely)
20
+ * 2. Vault state changes frequently (stale simulations are misleading)
21
+ * 3. One-time use simulations (rarely re-requested with same parameters)
22
+ * 4. SDK-based calculations (fast execution, no benefit from caching)
23
+ *
24
+ * @module tools/simulate-vault
25
+ */
26
+ import { z } from 'zod';
27
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
28
+ import { ServiceContainer } from '../core/container.js';
29
+ /**
30
+ * Input schema for simulate_vault tool
31
+ */
32
+ export declare const simulateVaultInputSchema: z.ZodObject<{
33
+ vaultAddress: z.ZodString;
34
+ chainId: z.ZodNumber;
35
+ newTotalAssets: z.ZodString;
36
+ settleDeposit: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
37
+ includeAPRCalculations: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
38
+ }, "strip", z.ZodTypeAny, {
39
+ vaultAddress: string;
40
+ chainId: number;
41
+ settleDeposit: boolean;
42
+ newTotalAssets: string;
43
+ includeAPRCalculations: boolean;
44
+ }, {
45
+ vaultAddress: string;
46
+ chainId: number;
47
+ newTotalAssets: string;
48
+ settleDeposit?: boolean | undefined;
49
+ includeAPRCalculations?: boolean | undefined;
50
+ }>;
51
+ export type SimulateVaultInput = z.infer<typeof simulateVaultInputSchema>;
52
+ /**
53
+ * JSON schema for tool registration
54
+ */
55
+ export declare const simulateVaultJsonSchema: import("zod-to-json-schema").JsonSchema7Type & {
56
+ $schema?: string | undefined;
57
+ definitions?: {
58
+ [key: string]: import("zod-to-json-schema").JsonSchema7Type;
59
+ } | undefined;
60
+ };
61
+ /**
62
+ * Create the executeSimulateVault function with DI container
63
+ *
64
+ * @param container - Service container with dependencies
65
+ * @returns Configured tool executor function
66
+ *
67
+ * @example
68
+ * ```typescript
69
+ * const executor = createExecuteSimulateVault(container);
70
+ * const result = await executor({
71
+ * vaultAddress: '0x1234...',
72
+ * chainId: 42161,
73
+ * newTotalAssets: '2000000000',
74
+ * settleDeposit: true,
75
+ * includeAPRCalculations: true
76
+ * });
77
+ * ```
78
+ */
79
+ export declare function createExecuteSimulateVault(container: ServiceContainer): (input: SimulateVaultInput) => Promise<CallToolResult>;
80
+ //# sourceMappingURL=simulate-vault.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulate-vault.d.ts","sourceRoot":"","sources":["../../src/tools/simulate-vault.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AASzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;EAgBnC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E;;GAEG;AACH,eAAO,MAAM,uBAAuB;;;;;CAGnC,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,gBAAgB,GAC1B,CAAC,KAAK,EAAE,kBAAkB,KAAK,OAAO,CAAC,cAAc,CAAC,CA+QxD"}
@@ -0,0 +1,281 @@
1
+ /**
2
+ * simulate_vault Tool
3
+ *
4
+ * Simulates vault operations with new total assets to model deposit/withdrawal scenarios.
5
+ * Provides protocol-accurate fee calculations, APR impact analysis, and settlement requirements.
6
+ *
7
+ * Use cases:
8
+ * - Simulate deposit/withdrawal impact on share price
9
+ * - Model fee accrual scenarios
10
+ * - Analyze settlement requirements
11
+ * - Validate protocol calculations
12
+ * - Performance: ~400-600 tokens per simulation
13
+ *
14
+ * Cache strategy:
15
+ * - No caching (simulations are specific to input parameters and require fresh vault state)
16
+ *
17
+ * WHY NO CACHING?
18
+ * This tool is intentionally non-cached because:
19
+ * 1. Simulations are parameter-specific (newTotalAssets varies widely)
20
+ * 2. Vault state changes frequently (stale simulations are misleading)
21
+ * 3. One-time use simulations (rarely re-requested with same parameters)
22
+ * 4. SDK-based calculations (fast execution, no benefit from caching)
23
+ *
24
+ * @module tools/simulate-vault
25
+ */
26
+ import { z } from 'zod';
27
+ import { zodToJsonSchema } from 'zod-to-json-schema';
28
+ import { getToolDisclaimer } from '../utils/disclaimers.js';
29
+ import { simulateVaultManagement } from '../sdk/simulation-service.js';
30
+ import { transformPeriodSummariesToAPRData } from '../sdk/apr-service.js';
31
+ import { formatBigInt, safeBigIntStringify } from '../sdk/math-utils.js';
32
+ import { calculatePricePerShare } from '../sdk/vault-utils.js';
33
+ import { handleToolError } from '../utils/tool-error-handler.js';
34
+ import { GET_PERIOD_SUMMARIES_QUERY } from '../graphql/queries/index.js';
35
+ /**
36
+ * Input schema for simulate_vault tool
37
+ */
38
+ export const simulateVaultInputSchema = z.object({
39
+ vaultAddress: z.string().regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid Ethereum address format'),
40
+ chainId: z.number().int().positive('Chain ID must be a positive integer'),
41
+ newTotalAssets: z
42
+ .string()
43
+ .regex(/^\d+$/, 'New total assets must be a positive integer string (wei)'),
44
+ settleDeposit: z
45
+ .boolean()
46
+ .optional()
47
+ .default(true)
48
+ .describe('Whether to settle pending deposits'),
49
+ includeAPRCalculations: z
50
+ .boolean()
51
+ .optional()
52
+ .default(true)
53
+ .describe('Include APR analysis in results'),
54
+ });
55
+ /**
56
+ * JSON schema for tool registration
57
+ */
58
+ export const simulateVaultJsonSchema = zodToJsonSchema(simulateVaultInputSchema, 'simulateVaultInput');
59
+ /**
60
+ * Create the executeSimulateVault function with DI container
61
+ *
62
+ * @param container - Service container with dependencies
63
+ * @returns Configured tool executor function
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * const executor = createExecuteSimulateVault(container);
68
+ * const result = await executor({
69
+ * vaultAddress: '0x1234...',
70
+ * chainId: 42161,
71
+ * newTotalAssets: '2000000000',
72
+ * settleDeposit: true,
73
+ * includeAPRCalculations: true
74
+ * });
75
+ * ```
76
+ */
77
+ export function createExecuteSimulateVault(container) {
78
+ return async (input) => {
79
+ try {
80
+ const { vaultAddress, chainId, newTotalAssets, settleDeposit, includeAPRCalculations } = input;
81
+ // 1. Fetch vault data
82
+ const vaultQuery = `
83
+ query GetVault($vaultAddress: Address!, $chainId: Int!) {
84
+ vault: vaultByAddress(address: $vaultAddress, chainId: $chainId) {
85
+ address
86
+ name
87
+ symbol
88
+ decimals
89
+ asset {
90
+ address
91
+ symbol
92
+ name
93
+ decimals
94
+ }
95
+ state {
96
+ totalSupply
97
+ totalAssets
98
+ highWaterMark
99
+ lastFeeTime
100
+ managementFee
101
+ performanceFee
102
+ version
103
+ safeAssetBalance
104
+ pendingSiloBalances {
105
+ assets
106
+ shares
107
+ }
108
+ pendingSettlement {
109
+ assets
110
+ shares
111
+ }
112
+ }
113
+ chain {
114
+ id
115
+ }
116
+ }
117
+ }
118
+ `;
119
+ const vaultData = await container.graphqlClient.request(vaultQuery, {
120
+ vaultAddress,
121
+ chainId,
122
+ });
123
+ if (!vaultData?.vault) {
124
+ throw new Error(`Vault not found: ${vaultAddress} on chain ${chainId}`);
125
+ }
126
+ const vault = vaultData.vault;
127
+ // 2. Optionally fetch APR data
128
+ let aprData;
129
+ if (includeAPRCalculations) {
130
+ try {
131
+ const periodSummariesData = await container.graphqlClient.request(GET_PERIOD_SUMMARIES_QUERY, {
132
+ where: {
133
+ vault_in: [vaultAddress],
134
+ chainId_eq: chainId,
135
+ type_in: ['PeriodSummary'],
136
+ },
137
+ orderBy: 'timestamp',
138
+ orderDirection: 'asc',
139
+ first: 1000,
140
+ });
141
+ if (periodSummariesData?.transactions?.items?.length > 0) {
142
+ // Extract PeriodSummary data from transaction items
143
+ const periodSummaries = periodSummariesData.transactions.items.map((tx) => ({
144
+ timestamp: tx.timestamp,
145
+ totalAssetsAtStart: tx.data.totalAssetsAtStart,
146
+ totalSupplyAtStart: tx.data.totalSupplyAtStart,
147
+ }));
148
+ aprData = transformPeriodSummariesToAPRData(periodSummaries, vault);
149
+ }
150
+ }
151
+ catch (error) {
152
+ // Non-fatal: proceed without APR data
153
+ console.warn('Failed to fetch APR data:', error);
154
+ }
155
+ }
156
+ // 3. Execute simulation
157
+ const newTotalAssetsBigInt = BigInt(newTotalAssets);
158
+ const simulationResult = simulateVaultManagement(vault, newTotalAssetsBigInt, aprData, settleDeposit);
159
+ // 4. Format response
160
+ const vaultDecimals = vault.decimals ?? 18;
161
+ const assetDecimals = vault.asset.decimals;
162
+ const currentTotalAssets = BigInt(vault.state.totalAssets);
163
+ const currentTotalSupply = BigInt(vault.state.totalSupply);
164
+ // Calculate price per share impact using Lagoon SDK
165
+ let priceImpactPercentage = 0;
166
+ let priceImpactAbsolute = BigInt(0);
167
+ let currentPricePerShare = BigInt(0);
168
+ let newPricePerShare = BigInt(0);
169
+ if (currentTotalSupply > 0n && simulationResult.totalSupply > 0n) {
170
+ // Calculate prices using SDK (returns price in asset decimals)
171
+ currentPricePerShare = calculatePricePerShare(currentTotalAssets, currentTotalSupply, vaultDecimals, assetDecimals);
172
+ newPricePerShare = calculatePricePerShare(simulationResult.totalAssets, simulationResult.totalSupply, vaultDecimals, assetDecimals);
173
+ priceImpactAbsolute = newPricePerShare - currentPricePerShare;
174
+ priceImpactPercentage =
175
+ currentPricePerShare > 0n
176
+ ? Number((priceImpactAbsolute * 10000n) / currentPricePerShare) / 100
177
+ : 0;
178
+ }
179
+ else if (simulationResult.totalSupply > 0n) {
180
+ // New vault case - no current price to compare
181
+ newPricePerShare = calculatePricePerShare(simulationResult.totalAssets, simulationResult.totalSupply, vaultDecimals, assetDecimals);
182
+ currentPricePerShare = BigInt(10 ** assetDecimals); // 1.0 in asset decimals
183
+ priceImpactAbsolute = BigInt(0);
184
+ priceImpactPercentage = 0;
185
+ }
186
+ // Build response
187
+ const response = {
188
+ simulation: {
189
+ vaultAddress,
190
+ chainId,
191
+ timestamp: Date.now(),
192
+ sdkVersion: '@lagoon-protocol/v0-computation@0.12.0',
193
+ },
194
+ currentState: {
195
+ totalAssets: vault.state.totalAssets,
196
+ totalAssetsFormatted: formatBigInt(currentTotalAssets, assetDecimals),
197
+ totalSupply: vault.state.totalSupply,
198
+ totalSupplyFormatted: formatBigInt(currentTotalSupply, vaultDecimals),
199
+ pricePerShare: (currentPricePerShare ?? BigInt(0)).toString(),
200
+ pricePerShareFormatted: formatBigInt(currentPricePerShare ?? BigInt(0), assetDecimals),
201
+ managementFee: vault.state.managementFee,
202
+ performanceFee: vault.state.performanceFee,
203
+ highWaterMark: vault.state.highWaterMark,
204
+ },
205
+ simulatedState: {
206
+ totalAssets: simulationResult.totalAssets?.toString() ?? vault.state.totalAssets,
207
+ totalAssetsFormatted: formatBigInt(simulationResult.totalAssets ?? BigInt(vault.state.totalAssets), assetDecimals),
208
+ totalSupply: simulationResult.totalSupply?.toString() ?? vault.state.totalSupply,
209
+ totalSupplyFormatted: formatBigInt(simulationResult.totalSupply ?? BigInt(vault.state.totalSupply), vaultDecimals),
210
+ pricePerShare: (newPricePerShare ?? BigInt(0)).toString(),
211
+ pricePerShareFormatted: formatBigInt(newPricePerShare ?? BigInt(0), assetDecimals),
212
+ feesAccrued: {
213
+ management: simulationResult.managementFees?.inAssets?.toString() ?? '0',
214
+ managementFormatted: formatBigInt(simulationResult.managementFees?.inAssets ?? 0n, assetDecimals),
215
+ performance: simulationResult.performanceFees?.inAssets?.toString() ?? '0',
216
+ performanceFormatted: formatBigInt(simulationResult.performanceFees?.inAssets ?? 0n, assetDecimals),
217
+ total: ((simulationResult.managementFees?.inAssets ?? 0n) +
218
+ (simulationResult.performanceFees?.inAssets ?? 0n)).toString(),
219
+ totalFormatted: formatBigInt((simulationResult.managementFees?.inAssets ?? 0n) +
220
+ (simulationResult.performanceFees?.inAssets ?? 0n), assetDecimals),
221
+ },
222
+ sharePriceImpact: {
223
+ absolute: (priceImpactAbsolute ?? BigInt(0)).toString(),
224
+ absoluteFormatted: formatBigInt(priceImpactAbsolute ?? BigInt(0), assetDecimals),
225
+ percentage: priceImpactPercentage,
226
+ direction: priceImpactAbsolute > 0n
227
+ ? 'increase'
228
+ : priceImpactAbsolute < 0n
229
+ ? 'decrease'
230
+ : 'unchanged',
231
+ },
232
+ },
233
+ settlementAnalysis: {
234
+ settleDeposit,
235
+ assetsInSafe: vault.state.safeAssetBalance || '0',
236
+ pendingSiloBalances: {
237
+ assets: vault.state.pendingSiloBalances?.assets || '0',
238
+ shares: vault.state.pendingSiloBalances?.shares || '0',
239
+ },
240
+ pendingSettlement: {
241
+ assets: vault.state.pendingSettlement?.assets || '0',
242
+ shares: vault.state.pendingSettlement?.shares || '0',
243
+ },
244
+ },
245
+ ...(includeAPRCalculations &&
246
+ aprData && {
247
+ aprAnalysis: {
248
+ method: 'Lagoon SDK v0.10.1 (protocol-accurate)',
249
+ dataSource: 'Lagoon GraphQL period summaries',
250
+ ...(aprData.thirtyDay && {
251
+ thirtyDay: {
252
+ timestamp: aprData.thirtyDay.timestamp,
253
+ pricePerShare: aprData.thirtyDay.pricePerShare?.toString() ?? '0',
254
+ pricePerShareFormatted: formatBigInt(aprData.thirtyDay.pricePerShare ?? 0n, assetDecimals),
255
+ },
256
+ }),
257
+ ...(aprData.inception && {
258
+ inception: {
259
+ timestamp: aprData.inception.timestamp,
260
+ pricePerShare: aprData.inception.pricePerShare?.toString() ?? '0',
261
+ pricePerShareFormatted: formatBigInt(aprData.inception.pricePerShare ?? 0n, assetDecimals),
262
+ },
263
+ }),
264
+ },
265
+ }),
266
+ };
267
+ return {
268
+ content: [
269
+ {
270
+ type: 'text',
271
+ text: safeBigIntStringify(response) + getToolDisclaimer('simulate_vault'),
272
+ },
273
+ ],
274
+ };
275
+ }
276
+ catch (error) {
277
+ return handleToolError(error, 'simulate_vault');
278
+ }
279
+ };
280
+ }
281
+ //# sourceMappingURL=simulate-vault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulate-vault.js","sourceRoot":"","sources":["../../src/tools/simulate-vault.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
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 { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
21
+ import { GetUserPortfolioInput } from '../utils/validators.js';
22
+ import { ServiceContainer } from '../core/container.js';
23
+ /**
24
+ * Create the executeGetUserPortfolio function with DI container
25
+ *
26
+ * @param container - Service container with dependencies
27
+ * @returns Configured tool executor function
28
+ */
29
+ export declare function createExecuteGetUserPortfolio(container: ServiceContainer): (input: GetUserPortfolioInput) => Promise<CallToolResult>;
30
+ //# sourceMappingURL=user-portfolio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-portfolio.d.ts","sourceRoot":"","sources":["../../src/tools/user-portfolio.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAM/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAuHxD;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,gBAAgB,GAC1B,CAAC,KAAK,EAAE,qBAAqB,KAAK,OAAO,CAAC,cAAc,CAAC,CAiF3D"}