@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.
- package/LICENSE +201 -0
- package/README.md +618 -0
- package/dist/cache/index.d.ts +97 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +106 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/config.d.ts +34 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +40 -0
- package/dist/config.js.map +1 -0
- package/dist/core/cache-adapter.d.ts +73 -0
- package/dist/core/cache-adapter.d.ts.map +1 -0
- package/dist/core/cache-adapter.js +47 -0
- package/dist/core/cache-adapter.js.map +1 -0
- package/dist/core/cache-invalidation.d.ts +72 -0
- package/dist/core/cache-invalidation.d.ts.map +1 -0
- package/dist/core/cache-invalidation.js +114 -0
- package/dist/core/cache-invalidation.js.map +1 -0
- package/dist/core/container.d.ts +34 -0
- package/dist/core/container.d.ts.map +1 -0
- package/dist/core/container.js +75 -0
- package/dist/core/container.js.map +1 -0
- package/dist/graphql/client.d.ts +32 -0
- package/dist/graphql/client.d.ts.map +1 -0
- package/dist/graphql/client.js +49 -0
- package/dist/graphql/client.js.map +1 -0
- package/dist/graphql/fragments/apr-breakdown.fragment.d.ts +64 -0
- package/dist/graphql/fragments/apr-breakdown.fragment.d.ts.map +1 -0
- package/dist/graphql/fragments/apr-breakdown.fragment.js +62 -0
- package/dist/graphql/fragments/apr-breakdown.fragment.js.map +1 -0
- package/dist/graphql/fragments/asset-info.fragment.d.ts +18 -0
- package/dist/graphql/fragments/asset-info.fragment.d.ts.map +1 -0
- package/dist/graphql/fragments/asset-info.fragment.js +36 -0
- package/dist/graphql/fragments/asset-info.fragment.js.map +1 -0
- package/dist/graphql/fragments/chain-info.fragment.d.ts +18 -0
- package/dist/graphql/fragments/chain-info.fragment.d.ts.map +1 -0
- package/dist/graphql/fragments/chain-info.fragment.js +32 -0
- package/dist/graphql/fragments/chain-info.fragment.js.map +1 -0
- package/dist/graphql/fragments/index.d.ts +15 -0
- package/dist/graphql/fragments/index.d.ts.map +1 -0
- package/dist/graphql/fragments/index.js +21 -0
- package/dist/graphql/fragments/index.js.map +1 -0
- package/dist/graphql/fragments/pageinfo.fragment.d.ts +33 -0
- package/dist/graphql/fragments/pageinfo.fragment.d.ts.map +1 -0
- package/dist/graphql/fragments/pageinfo.fragment.js +47 -0
- package/dist/graphql/fragments/pageinfo.fragment.js.map +1 -0
- package/dist/graphql/fragments/transaction-base.fragment.d.ts +19 -0
- package/dist/graphql/fragments/transaction-base.fragment.d.ts.map +1 -0
- package/dist/graphql/fragments/transaction-base.fragment.js +32 -0
- package/dist/graphql/fragments/transaction-base.fragment.js.map +1 -0
- package/dist/graphql/fragments/vault-list.fragment.d.ts +53 -0
- package/dist/graphql/fragments/vault-list.fragment.d.ts.map +1 -0
- package/dist/graphql/fragments/vault-list.fragment.js +51 -0
- package/dist/graphql/fragments/vault-list.fragment.js.map +1 -0
- package/dist/graphql/fragments/vault-summary.fragment.d.ts +68 -0
- package/dist/graphql/fragments/vault-summary.fragment.d.ts.map +1 -0
- package/dist/graphql/fragments/vault-summary.fragment.js +66 -0
- package/dist/graphql/fragments/vault-summary.fragment.js.map +1 -0
- package/dist/graphql/fragments/vault.fragment.d.ts +133 -0
- package/dist/graphql/fragments/vault.fragment.d.ts.map +1 -0
- package/dist/graphql/fragments/vault.fragment.js +119 -0
- package/dist/graphql/fragments/vault.fragment.js.map +1 -0
- package/dist/graphql/fragments.d.ts +183 -0
- package/dist/graphql/fragments.d.ts.map +1 -0
- package/dist/graphql/fragments.js +297 -0
- package/dist/graphql/fragments.js.map +1 -0
- package/dist/graphql/queries/export.queries.d.ts +72 -0
- package/dist/graphql/queries/export.queries.d.ts.map +1 -0
- package/dist/graphql/queries/export.queries.js +202 -0
- package/dist/graphql/queries/export.queries.js.map +1 -0
- package/dist/graphql/queries/index.d.ts +15 -0
- package/dist/graphql/queries/index.d.ts.map +1 -0
- package/dist/graphql/queries/index.js +23 -0
- package/dist/graphql/queries/index.js.map +1 -0
- package/dist/graphql/queries/performance.queries.d.ts +63 -0
- package/dist/graphql/queries/performance.queries.d.ts.map +1 -0
- package/dist/graphql/queries/performance.queries.js +133 -0
- package/dist/graphql/queries/performance.queries.js.map +1 -0
- package/dist/graphql/queries/period-summaries.d.ts +15 -0
- package/dist/graphql/queries/period-summaries.d.ts.map +1 -0
- package/dist/graphql/queries/period-summaries.js +24 -0
- package/dist/graphql/queries/period-summaries.js.map +1 -0
- package/dist/graphql/queries/portfolio.queries.d.ts +78 -0
- package/dist/graphql/queries/portfolio.queries.d.ts.map +1 -0
- package/dist/graphql/queries/portfolio.queries.js +198 -0
- package/dist/graphql/queries/portfolio.queries.js.map +1 -0
- package/dist/graphql/queries/prediction.queries.d.ts +38 -0
- package/dist/graphql/queries/prediction.queries.d.ts.map +1 -0
- package/dist/graphql/queries/prediction.queries.js +100 -0
- package/dist/graphql/queries/prediction.queries.js.map +1 -0
- package/dist/graphql/queries/risk.queries.d.ts +37 -0
- package/dist/graphql/queries/risk.queries.d.ts.map +1 -0
- package/dist/graphql/queries/risk.queries.js +90 -0
- package/dist/graphql/queries/risk.queries.js.map +1 -0
- package/dist/graphql/queries/search.queries.d.ts +61 -0
- package/dist/graphql/queries/search.queries.d.ts.map +1 -0
- package/dist/graphql/queries/search.queries.js +103 -0
- package/dist/graphql/queries/search.queries.js.map +1 -0
- package/dist/graphql/queries/transaction.queries.d.ts +60 -0
- package/dist/graphql/queries/transaction.queries.d.ts.map +1 -0
- package/dist/graphql/queries/transaction.queries.js +252 -0
- package/dist/graphql/queries/transaction.queries.js.map +1 -0
- package/dist/graphql/queries/vault.queries.d.ts +54 -0
- package/dist/graphql/queries/vault.queries.d.ts.map +1 -0
- package/dist/graphql/queries/vault.queries.js +78 -0
- package/dist/graphql/queries/vault.queries.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/competitor-comparison.d.ts +8 -0
- package/dist/prompts/competitor-comparison.d.ts.map +1 -0
- package/dist/prompts/competitor-comparison.js +432 -0
- package/dist/prompts/competitor-comparison.js.map +1 -0
- package/dist/prompts/curator-performance.d.ts +8 -0
- package/dist/prompts/curator-performance.d.ts.map +1 -0
- package/dist/prompts/curator-performance.js +383 -0
- package/dist/prompts/curator-performance.js.map +1 -0
- package/dist/prompts/financial-analysis.d.ts +8 -0
- package/dist/prompts/financial-analysis.d.ts.map +1 -0
- package/dist/prompts/financial-analysis.js +480 -0
- package/dist/prompts/financial-analysis.js.map +1 -0
- package/dist/prompts/index.d.ts +21 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +50 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/onboarding-first-vault.d.ts +8 -0
- package/dist/prompts/onboarding-first-vault.d.ts.map +1 -0
- package/dist/prompts/onboarding-first-vault.js +317 -0
- package/dist/prompts/onboarding-first-vault.js.map +1 -0
- package/dist/prompts/portfolio-optimization.d.ts +8 -0
- package/dist/prompts/portfolio-optimization.d.ts.map +1 -0
- package/dist/prompts/portfolio-optimization.js +412 -0
- package/dist/prompts/portfolio-optimization.js.map +1 -0
- package/dist/prompts/protocol-overview.d.ts +8 -0
- package/dist/prompts/protocol-overview.d.ts.map +1 -0
- package/dist/prompts/protocol-overview.js +398 -0
- package/dist/prompts/protocol-overview.js.map +1 -0
- package/dist/prompts/shared/disclaimers.d.ts +54 -0
- package/dist/prompts/shared/disclaimers.d.ts.map +1 -0
- package/dist/prompts/shared/disclaimers.js +400 -0
- package/dist/prompts/shared/disclaimers.js.map +1 -0
- package/dist/resources/glossary.d.ts +8 -0
- package/dist/resources/glossary.d.ts.map +1 -0
- package/dist/resources/glossary.js +407 -0
- package/dist/resources/glossary.js.map +1 -0
- package/dist/resources/index.d.ts +18 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +29 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/schema.d.ts +22 -0
- package/dist/resources/schema.d.ts.map +1 -0
- package/dist/resources/schema.js +67 -0
- package/dist/resources/schema.js.map +1 -0
- package/dist/schemas/config.schema.d.ts +46 -0
- package/dist/schemas/config.schema.d.ts.map +1 -0
- package/dist/schemas/config.schema.js +48 -0
- package/dist/schemas/config.schema.js.map +1 -0
- package/dist/sdk/__tests__/apr-service.test.d.ts +7 -0
- package/dist/sdk/__tests__/apr-service.test.d.ts.map +1 -0
- package/dist/sdk/__tests__/apr-service.test.js +385 -0
- package/dist/sdk/__tests__/apr-service.test.js.map +1 -0
- package/dist/sdk/__tests__/math-utils.test.d.ts +7 -0
- package/dist/sdk/__tests__/math-utils.test.d.ts.map +1 -0
- package/dist/sdk/__tests__/math-utils.test.js +185 -0
- package/dist/sdk/__tests__/math-utils.test.js.map +1 -0
- package/dist/sdk/__tests__/simulation-service.test.d.ts +5 -0
- package/dist/sdk/__tests__/simulation-service.test.d.ts.map +1 -0
- package/dist/sdk/__tests__/simulation-service.test.js +397 -0
- package/dist/sdk/__tests__/simulation-service.test.js.map +1 -0
- package/dist/sdk/__tests__/vault-utils.test.d.ts +7 -0
- package/dist/sdk/__tests__/vault-utils.test.d.ts.map +1 -0
- package/dist/sdk/__tests__/vault-utils.test.js +189 -0
- package/dist/sdk/__tests__/vault-utils.test.js.map +1 -0
- package/dist/sdk/apr-service.d.ts +101 -0
- package/dist/sdk/apr-service.d.ts.map +1 -0
- package/dist/sdk/apr-service.js +175 -0
- package/dist/sdk/apr-service.js.map +1 -0
- package/dist/sdk/math-utils.d.ts +138 -0
- package/dist/sdk/math-utils.d.ts.map +1 -0
- package/dist/sdk/math-utils.js +218 -0
- package/dist/sdk/math-utils.js.map +1 -0
- package/dist/sdk/simulation-service.d.ts +106 -0
- package/dist/sdk/simulation-service.d.ts.map +1 -0
- package/dist/sdk/simulation-service.js +143 -0
- package/dist/sdk/simulation-service.js.map +1 -0
- package/dist/sdk/vault-utils.d.ts +125 -0
- package/dist/sdk/vault-utils.d.ts.map +1 -0
- package/dist/sdk/vault-utils.js +165 -0
- package/dist/sdk/vault-utils.js.map +1 -0
- package/dist/server.d.ts +21 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +225 -0
- package/dist/server.js.map +1 -0
- package/dist/services/analytics/protocol-overview.service.d.ts +61 -0
- package/dist/services/analytics/protocol-overview.service.d.ts.map +1 -0
- package/dist/services/analytics/protocol-overview.service.js +182 -0
- package/dist/services/analytics/protocol-overview.service.js.map +1 -0
- package/dist/services/analytics/risk.service.d.ts +92 -0
- package/dist/services/analytics/risk.service.d.ts.map +1 -0
- package/dist/services/analytics/risk.service.js +423 -0
- package/dist/services/analytics/risk.service.js.map +1 -0
- package/dist/services/base.service.d.ts +39 -0
- package/dist/services/base.service.d.ts.map +1 -0
- package/dist/services/base.service.js +37 -0
- package/dist/services/base.service.js.map +1 -0
- package/dist/services/index.d.ts +30 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +101 -0
- package/dist/services/index.js.map +1 -0
- package/dist/tools/__tests__/simulate-vault.test.d.ts +5 -0
- package/dist/tools/__tests__/simulate-vault.test.d.ts.map +1 -0
- package/dist/tools/__tests__/simulate-vault.test.js +363 -0
- package/dist/tools/__tests__/simulate-vault.test.js.map +1 -0
- package/dist/tools/analyze-risk.d.ts +34 -0
- package/dist/tools/analyze-risk.d.ts.map +1 -0
- package/dist/tools/analyze-risk.js +100 -0
- package/dist/tools/analyze-risk.js.map +1 -0
- package/dist/tools/compare-vaults.d.ts +29 -0
- package/dist/tools/compare-vaults.d.ts.map +1 -0
- package/dist/tools/compare-vaults.js +285 -0
- package/dist/tools/compare-vaults.js.map +1 -0
- package/dist/tools/export-data.d.ts +34 -0
- package/dist/tools/export-data.d.ts.map +1 -0
- package/dist/tools/export-data.js +309 -0
- package/dist/tools/export-data.js.map +1 -0
- package/dist/tools/get-price-history.d.ts +29 -0
- package/dist/tools/get-price-history.d.ts.map +1 -0
- package/dist/tools/get-price-history.js +236 -0
- package/dist/tools/get-price-history.js.map +1 -0
- package/dist/tools/get-transactions.d.ts +29 -0
- package/dist/tools/get-transactions.d.ts.map +1 -0
- package/dist/tools/get-transactions.js +181 -0
- package/dist/tools/get-transactions.js.map +1 -0
- package/dist/tools/index.d.ts +26 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +32 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/optimize-portfolio.d.ts +37 -0
- package/dist/tools/optimize-portfolio.d.ts.map +1 -0
- package/dist/tools/optimize-portfolio.js +459 -0
- package/dist/tools/optimize-portfolio.js.map +1 -0
- package/dist/tools/predict-yield.d.ts +30 -0
- package/dist/tools/predict-yield.d.ts.map +1 -0
- package/dist/tools/predict-yield.js +248 -0
- package/dist/tools/predict-yield.js.map +1 -0
- package/dist/tools/query-graphql.d.ts +35 -0
- package/dist/tools/query-graphql.d.ts.map +1 -0
- package/dist/tools/query-graphql.js +54 -0
- package/dist/tools/query-graphql.js.map +1 -0
- package/dist/tools/registry.d.ts +42 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +231 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/search-vaults.d.ts +40 -0
- package/dist/tools/search-vaults.d.ts.map +1 -0
- package/dist/tools/search-vaults.js +184 -0
- package/dist/tools/search-vaults.js.map +1 -0
- package/dist/tools/simulate-vault.d.ts +80 -0
- package/dist/tools/simulate-vault.d.ts.map +1 -0
- package/dist/tools/simulate-vault.js +281 -0
- package/dist/tools/simulate-vault.js.map +1 -0
- package/dist/tools/user-portfolio.d.ts +30 -0
- package/dist/tools/user-portfolio.d.ts.map +1 -0
- package/dist/tools/user-portfolio.js +142 -0
- package/dist/tools/user-portfolio.js.map +1 -0
- package/dist/tools/vault-data.d.ts +23 -0
- package/dist/tools/vault-data.d.ts.map +1 -0
- package/dist/tools/vault-data.js +68 -0
- package/dist/tools/vault-data.js.map +1 -0
- package/dist/tools/vault-performance.d.ts +30 -0
- package/dist/tools/vault-performance.d.ts.map +1 -0
- package/dist/tools/vault-performance.js +275 -0
- package/dist/tools/vault-performance.js.map +1 -0
- package/dist/types/generated.d.ts +1109 -0
- package/dist/types/generated.d.ts.map +1 -0
- package/dist/types/generated.js +2 -0
- package/dist/types/generated.js.map +1 -0
- package/dist/types/index.d.ts +46 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/comparison-metrics.d.ts +120 -0
- package/dist/utils/comparison-metrics.d.ts.map +1 -0
- package/dist/utils/comparison-metrics.js +215 -0
- package/dist/utils/comparison-metrics.js.map +1 -0
- package/dist/utils/config-loader.d.ts +17 -0
- package/dist/utils/config-loader.d.ts.map +1 -0
- package/dist/utils/config-loader.js +45 -0
- package/dist/utils/config-loader.js.map +1 -0
- package/dist/utils/csv-generator.d.ts +89 -0
- package/dist/utils/csv-generator.d.ts.map +1 -0
- package/dist/utils/csv-generator.js +97 -0
- package/dist/utils/csv-generator.js.map +1 -0
- package/dist/utils/disclaimers.d.ts +70 -0
- package/dist/utils/disclaimers.d.ts.map +1 -0
- package/dist/utils/disclaimers.js +161 -0
- package/dist/utils/disclaimers.js.map +1 -0
- package/dist/utils/errors.d.ts +66 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +86 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/execute-tool-with-cache.d.ts +97 -0
- package/dist/utils/execute-tool-with-cache.d.ts.map +1 -0
- package/dist/utils/execute-tool-with-cache.js +105 -0
- package/dist/utils/execute-tool-with-cache.js.map +1 -0
- package/dist/utils/portfolio-optimization.d.ts +100 -0
- package/dist/utils/portfolio-optimization.d.ts.map +1 -0
- package/dist/utils/portfolio-optimization.js +283 -0
- package/dist/utils/portfolio-optimization.js.map +1 -0
- package/dist/utils/risk-scoring.d.ts +226 -0
- package/dist/utils/risk-scoring.d.ts.map +1 -0
- package/dist/utils/risk-scoring.js +523 -0
- package/dist/utils/risk-scoring.js.map +1 -0
- package/dist/utils/tool-error-handler.d.ts +16 -0
- package/dist/utils/tool-error-handler.d.ts.map +1 -0
- package/dist/utils/tool-error-handler.js +43 -0
- package/dist/utils/tool-error-handler.js.map +1 -0
- package/dist/utils/tool-handler.d.ts +33 -0
- package/dist/utils/tool-handler.d.ts.map +1 -0
- package/dist/utils/tool-handler.js +59 -0
- package/dist/utils/tool-handler.js.map +1 -0
- package/dist/utils/tool-response.d.ts +16 -0
- package/dist/utils/tool-response.d.ts.map +1 -0
- package/dist/utils/tool-response.js +25 -0
- package/dist/utils/tool-response.js.map +1 -0
- package/dist/utils/validators.d.ts +359 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/utils/validators.js +233 -0
- package/dist/utils/validators.js.map +1 -0
- package/dist/utils/yield-prediction.d.ts +69 -0
- package/dist/utils/yield-prediction.d.ts.map +1 -0
- package/dist/utils/yield-prediction.js +290 -0
- package/dist/utils/yield-prediction.js.map +1 -0
- package/package.json +83 -0
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* optimize_portfolio Tool
|
|
3
|
+
*
|
|
4
|
+
* Portfolio optimization with rebalancing recommendations using parallel vault queries.
|
|
5
|
+
* Analyzes current holdings and provides optimal allocation strategy based on
|
|
6
|
+
* per-vault historical data (price history and performance metrics).
|
|
7
|
+
*
|
|
8
|
+
* Implementation:
|
|
9
|
+
* - Executes N parallel GraphQL queries (one per vault) using Promise.all
|
|
10
|
+
* - Each vault gets up to 1000 transactions of historical data
|
|
11
|
+
* - Processes per-vault price history for accurate volatility calculation
|
|
12
|
+
* - Uses per-vault performance data for expected APR estimation
|
|
13
|
+
*
|
|
14
|
+
* Use cases:
|
|
15
|
+
* - Portfolio rebalancing and optimization
|
|
16
|
+
* - Risk-adjusted allocation strategies (equal_weight, risk_parity, max_sharpe, min_variance)
|
|
17
|
+
* - Diversification improvement
|
|
18
|
+
* - Performance enhancement through optimal weighting
|
|
19
|
+
* - Performance: ~800-1200 tokens per optimization (scales with vault count)
|
|
20
|
+
*
|
|
21
|
+
* Cache strategy:
|
|
22
|
+
* - 30-minute TTL (balances freshness with stability)
|
|
23
|
+
* - Cache key: portfolio_optimization:{chainId}:{vaultAddresses}:{strategy}
|
|
24
|
+
* - Cache hit rate target: 70-80%
|
|
25
|
+
* - Cache tags: [CacheTag.PORTFOLIO, CacheTag.ANALYTICS] for invalidation
|
|
26
|
+
*/
|
|
27
|
+
import { getToolDisclaimer } from '../utils/disclaimers.js';
|
|
28
|
+
import { SINGLE_VAULT_OPTIMIZATION_QUERY } from '../graphql/queries/index.js';
|
|
29
|
+
import { optimizePortfolio, } from '../utils/portfolio-optimization.js';
|
|
30
|
+
import { calculatePricePerShare } from '../sdk/vault-utils.js';
|
|
31
|
+
import { CacheTag } from '../core/cache-invalidation.js';
|
|
32
|
+
import { cacheTTL } from '../cache/index.js';
|
|
33
|
+
import { analyzeRisk } from '../utils/risk-scoring.js';
|
|
34
|
+
/**
|
|
35
|
+
* Calculate volatility from price history
|
|
36
|
+
*/
|
|
37
|
+
function calculateVolatility(prices) {
|
|
38
|
+
if (prices.length < 2) {
|
|
39
|
+
return 0.05; // Default 5% volatility if insufficient data
|
|
40
|
+
}
|
|
41
|
+
// Calculate daily returns
|
|
42
|
+
const returns = [];
|
|
43
|
+
for (let i = 1; i < prices.length; i++) {
|
|
44
|
+
if (prices[i - 1] !== 0) {
|
|
45
|
+
const dailyReturn = (prices[i] - prices[i - 1]) / prices[i - 1];
|
|
46
|
+
returns.push(dailyReturn);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (returns.length === 0) {
|
|
50
|
+
return 0.05;
|
|
51
|
+
}
|
|
52
|
+
// Calculate standard deviation of returns
|
|
53
|
+
const mean = returns.reduce((sum, r) => sum + r, 0) / returns.length;
|
|
54
|
+
const variance = returns.reduce((sum, r) => sum + Math.pow(r - mean, 2), 0) / returns.length;
|
|
55
|
+
const stdDev = Math.sqrt(variance);
|
|
56
|
+
// Annualize volatility (assuming daily data)
|
|
57
|
+
return stdDev * Math.sqrt(365);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Calculate average APR from performance data
|
|
61
|
+
*/
|
|
62
|
+
function calculateAverageAPR(aprValues) {
|
|
63
|
+
if (aprValues.length === 0) {
|
|
64
|
+
return 0;
|
|
65
|
+
}
|
|
66
|
+
return aprValues.reduce((sum, apr) => sum + apr, 0) / aprValues.length;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Format portfolio optimization as markdown
|
|
70
|
+
*/
|
|
71
|
+
function formatPortfolioOptimization(optimization, responseFormat = 'balanced') {
|
|
72
|
+
const strategyNames = {
|
|
73
|
+
equal_weight: 'Equal Weight',
|
|
74
|
+
risk_parity: 'Risk Parity',
|
|
75
|
+
max_sharpe: 'Maximum Sharpe Ratio',
|
|
76
|
+
min_variance: 'Minimum Variance',
|
|
77
|
+
};
|
|
78
|
+
const rebalanceStatus = optimization.rebalanceNeeded
|
|
79
|
+
? '⚠️ Rebalancing Recommended'
|
|
80
|
+
: '✅ Well-Balanced';
|
|
81
|
+
const rebalanceEmoji = optimization.rebalanceNeeded ? '⚠️' : '✅';
|
|
82
|
+
// Quick format: Only show rebalance status and top 3 actions
|
|
83
|
+
if (responseFormat === 'quick') {
|
|
84
|
+
const topActions = optimization.positions
|
|
85
|
+
.sort((a, b) => Math.abs(b.targetAllocation - b.currentAllocation) -
|
|
86
|
+
Math.abs(a.targetAllocation - a.currentAllocation))
|
|
87
|
+
.slice(0, 3);
|
|
88
|
+
return `
|
|
89
|
+
## ${rebalanceEmoji} Portfolio: ${rebalanceStatus}
|
|
90
|
+
|
|
91
|
+
**Total Value**: $${optimization.totalValueUsd.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })} | **Positions**: ${optimization.positions.length} | **Strategy**: ${strategyNames[optimization.strategy]}
|
|
92
|
+
|
|
93
|
+
${optimization.rebalanceNeeded
|
|
94
|
+
? `### Top Rebalancing Actions
|
|
95
|
+
|
|
96
|
+
${topActions
|
|
97
|
+
.map((pos) => {
|
|
98
|
+
const drift = pos.targetAllocation - pos.currentAllocation;
|
|
99
|
+
const action = Math.abs(drift) <= 1 ? 'Hold' : drift > 0 ? 'Buy' : 'Sell';
|
|
100
|
+
const actionEmoji = action === 'Hold' ? '➡️' : action === 'Buy' ? '🟢' : '🔴';
|
|
101
|
+
return `${actionEmoji} **${pos.vaultName}**: ${action} $${Math.abs(pos.rebalanceAmount).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })} (${drift > 0 ? '+' : ''}${drift.toFixed(1)}% drift)`;
|
|
102
|
+
})
|
|
103
|
+
.join('\n')}`
|
|
104
|
+
: '✅ **No action needed** - portfolio is well-balanced'}
|
|
105
|
+
`;
|
|
106
|
+
}
|
|
107
|
+
// Balanced and detailed formats use full output
|
|
108
|
+
return `
|
|
109
|
+
## Portfolio Optimization: ${strategyNames[optimization.strategy]}
|
|
110
|
+
|
|
111
|
+
### Portfolio Summary
|
|
112
|
+
- **Total Value**: $${optimization.totalValueUsd.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
|
|
113
|
+
- **Number of Positions**: ${optimization.positions.length}
|
|
114
|
+
- **Rebalance Status**: ${rebalanceStatus}
|
|
115
|
+
- **Rebalance Threshold**: ${optimization.rebalanceThreshold.toFixed(1)}%
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
### Portfolio Metrics
|
|
120
|
+
|
|
121
|
+
| Metric | Value | Interpretation |
|
|
122
|
+
|--------|-------|----------------|
|
|
123
|
+
| **Expected Return** | ${optimization.metrics.expectedReturn.toFixed(2)}% | Annualized portfolio return |
|
|
124
|
+
| **Portfolio Risk** | ${optimization.metrics.portfolioRisk.toFixed(2)}% | Volatility (std. deviation) |
|
|
125
|
+
| **Sharpe Ratio** | ${optimization.metrics.sharpeRatio.toFixed(2)} | Risk-adjusted return |
|
|
126
|
+
| **Diversification** | ${(optimization.metrics.diversificationScore * 100).toFixed(0)}% | Portfolio concentration |
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
### ${rebalanceEmoji} Position Allocations
|
|
131
|
+
|
|
132
|
+
| Vault | Current | Target | Drift | Action | Amount |
|
|
133
|
+
|-------|---------|--------|-------|--------|--------|
|
|
134
|
+
${optimization.positions
|
|
135
|
+
.sort((a, b) => Math.abs(b.targetAllocation - b.currentAllocation) -
|
|
136
|
+
Math.abs(a.targetAllocation - a.currentAllocation))
|
|
137
|
+
.map((pos) => {
|
|
138
|
+
const drift = pos.targetAllocation - pos.currentAllocation;
|
|
139
|
+
const driftEmoji = Math.abs(drift) > 5 ? (drift > 0 ? '🔼' : '🔽') : '➡️';
|
|
140
|
+
const action = Math.abs(drift) <= 1 ? 'Hold' : drift > 0 ? 'Buy' : 'Sell';
|
|
141
|
+
const actionEmoji = action === 'Hold' ? '➡️' : action === 'Buy' ? '🟢' : '🔴';
|
|
142
|
+
return `| **${pos.vaultName}** | ${pos.currentAllocation.toFixed(1)}% | ${pos.targetAllocation.toFixed(1)}% | ${driftEmoji} ${drift > 0 ? '+' : ''}${drift.toFixed(1)}% | ${actionEmoji} ${action} | $${Math.abs(pos.rebalanceAmount).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })} |`;
|
|
143
|
+
})
|
|
144
|
+
.join('\n')}
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
### Rebalancing Actions
|
|
149
|
+
|
|
150
|
+
${optimization.rebalanceNeeded
|
|
151
|
+
? `
|
|
152
|
+
**Positions to Reduce** 🔴
|
|
153
|
+
${optimization.positions
|
|
154
|
+
.filter((pos) => pos.rebalanceAmount < -100)
|
|
155
|
+
.sort((a, b) => a.rebalanceAmount - b.rebalanceAmount)
|
|
156
|
+
.map((pos) => `- **${pos.vaultName}**: Reduce by $${Math.abs(pos.rebalanceAmount).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })} (${Math.abs(pos.rebalancePercentage).toFixed(1)}%)`)
|
|
157
|
+
.join('\n') || '- No significant reductions needed'}
|
|
158
|
+
|
|
159
|
+
**Positions to Increase** 🟢
|
|
160
|
+
${optimization.positions
|
|
161
|
+
.filter((pos) => pos.rebalanceAmount > 100)
|
|
162
|
+
.sort((a, b) => b.rebalanceAmount - a.rebalanceAmount)
|
|
163
|
+
.map((pos) => `- **${pos.vaultName}**: Increase by $${pos.rebalanceAmount.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })} (${pos.rebalancePercentage.toFixed(1)}%)`)
|
|
164
|
+
.join('\n') || '- No significant increases needed'}
|
|
165
|
+
`
|
|
166
|
+
: '✅ **No rebalancing needed** - all positions are within the drift threshold'}
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
### Yield Sustainability Warnings
|
|
171
|
+
|
|
172
|
+
${(() => {
|
|
173
|
+
const warnings = [];
|
|
174
|
+
optimization.positions.forEach((pos) => {
|
|
175
|
+
if (pos.vault.riskBreakdown) {
|
|
176
|
+
const yieldRisk = pos.vault.riskBreakdown.yieldSustainabilityRisk;
|
|
177
|
+
if (yieldRisk >= 0.7) {
|
|
178
|
+
warnings.push(`🚨 **${pos.vaultName}** (High Risk): Yield heavily dependent on temporary incentives/airdrops (<20% native).`);
|
|
179
|
+
}
|
|
180
|
+
else if (yieldRisk >= 0.4) {
|
|
181
|
+
warnings.push(`⚠️ **${pos.vaultName}** (Medium Risk): Monitor yield composition - significant portion from temporary incentives.`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
return warnings.length > 0
|
|
186
|
+
? warnings.join('\n')
|
|
187
|
+
: '✅ **No sustainability concerns** - all vaults have healthy yield compositions';
|
|
188
|
+
})()}
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
### Key Insights
|
|
193
|
+
|
|
194
|
+
${optimization.recommendations.map((rec) => `- ${rec}`).join('\n')}
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
### Strategy Information
|
|
199
|
+
|
|
200
|
+
**${strategyNames[optimization.strategy]}** optimizes your portfolio by:
|
|
201
|
+
${optimization.strategy === 'equal_weight'
|
|
202
|
+
? '- Allocating equal weights to all vaults for maximum diversification'
|
|
203
|
+
: optimization.strategy === 'risk_parity'
|
|
204
|
+
? '- Balancing risk contribution across vaults (lower risk = higher allocation)'
|
|
205
|
+
: optimization.strategy === 'max_sharpe'
|
|
206
|
+
? '- Maximizing risk-adjusted returns (Sharpe ratio optimization)'
|
|
207
|
+
: '- Minimizing portfolio volatility through low-variance allocations'}
|
|
208
|
+
|
|
209
|
+
**Risk-Free Rate**: 2.0% (used for Sharpe ratio calculation)
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
**Note**: Recommendations are based on historical performance and risk metrics. Consider transaction costs, tax implications, and market conditions before rebalancing.
|
|
214
|
+
`;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Process single vault response and extract historical data
|
|
218
|
+
*/
|
|
219
|
+
function processSingleVaultData(data, timestampThreshold) {
|
|
220
|
+
if (!data.vault) {
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
// Extract price history with timestamp filtering
|
|
224
|
+
// Calculate price per share using Lagoon SDK
|
|
225
|
+
const prices = [];
|
|
226
|
+
if (data.priceHistory && data.priceHistory.items) {
|
|
227
|
+
for (const item of data.priceHistory.items) {
|
|
228
|
+
if (parseInt(item.timestamp) >= timestampThreshold) {
|
|
229
|
+
const vaultDecimals = item.data.vault.decimals;
|
|
230
|
+
const assetDecimals = item.data.vault.asset.decimals;
|
|
231
|
+
const pricePerShareBigInt = calculatePricePerShare(BigInt(item.data.totalAssets), BigInt(item.data.totalSupply), vaultDecimals, assetDecimals);
|
|
232
|
+
// Convert to number for volatility calculations (in asset decimals)
|
|
233
|
+
const pricePerShare = Number(pricePerShareBigInt) / 10 ** assetDecimals;
|
|
234
|
+
prices.push(pricePerShare);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
// Use pre-calculated APR from vault state
|
|
239
|
+
// Prefer monthlyApr, fallback to weeklyApr, then yearlyApr
|
|
240
|
+
const performance = [];
|
|
241
|
+
const apr = data.vault.state?.monthlyApr?.linearNetApr ??
|
|
242
|
+
data.vault.state?.weeklyApr?.linearNetApr ??
|
|
243
|
+
data.vault.state?.yearlyApr?.linearNetApr ??
|
|
244
|
+
0;
|
|
245
|
+
// Convert APR to percentage (API returns decimal, e.g., 0.15 = 15%)
|
|
246
|
+
const aprPercentage = apr * 100;
|
|
247
|
+
// If we have price history, create a matching performance array
|
|
248
|
+
if (prices.length > 0) {
|
|
249
|
+
performance.push(aprPercentage);
|
|
250
|
+
}
|
|
251
|
+
return {
|
|
252
|
+
vault: data.vault,
|
|
253
|
+
prices,
|
|
254
|
+
performance,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Transform combined vault data into portfolio optimization markdown output
|
|
259
|
+
*/
|
|
260
|
+
function transformOptimizationData(input, combinedData) {
|
|
261
|
+
// Build current positions map from input
|
|
262
|
+
const currentPositions = new Map();
|
|
263
|
+
for (const position of input.currentPositions) {
|
|
264
|
+
currentPositions.set(position.vaultAddress.toLowerCase(), position.valueUsd);
|
|
265
|
+
}
|
|
266
|
+
// Prepare vaults for optimization with per-vault historical data
|
|
267
|
+
const vaultsForOptimization = combinedData.vaults.map((vault) => {
|
|
268
|
+
const vaultAddress = vault.address.toLowerCase();
|
|
269
|
+
const currentValueUsd = currentPositions.get(vaultAddress) || 0;
|
|
270
|
+
// Get vault-specific price history and calculate volatility
|
|
271
|
+
const priceHistory = combinedData.priceHistoryByVault.get(vaultAddress) || [];
|
|
272
|
+
const volatility = calculateVolatility(priceHistory);
|
|
273
|
+
// Get vault-specific performance data and calculate expected APR
|
|
274
|
+
const aprHistory = combinedData.performanceByVault.get(vaultAddress) || [];
|
|
275
|
+
const expectedApr = calculateAverageAPR(aprHistory);
|
|
276
|
+
// Calculate comprehensive 12-factor risk score
|
|
277
|
+
let riskScore = Math.min(1, volatility / 0.2); // Fallback to volatility-based
|
|
278
|
+
let riskBreakdown;
|
|
279
|
+
try {
|
|
280
|
+
// Extract data for comprehensive risk calculation
|
|
281
|
+
const vaultTVL = vault.state?.totalAssetsUsd || 0;
|
|
282
|
+
const totalProtocolTVL = combinedData.vaults.reduce((sum, v) => sum + (v.state?.totalAssetsUsd || 0), 0);
|
|
283
|
+
// Age in days - default to 180 days (6 months) as we don't have creation timestamp in optimization
|
|
284
|
+
const ageInDays = 180;
|
|
285
|
+
// Curator professional signals
|
|
286
|
+
const curators = vault.curators || [];
|
|
287
|
+
const professionalSignals = {
|
|
288
|
+
hasWebsite: curators.some((c) => c.url && c.url.trim() !== ''),
|
|
289
|
+
hasDescription: curators.some((c) => c.aboutDescription && c.aboutDescription.trim() !== ''),
|
|
290
|
+
multipleCurators: curators.length > 1,
|
|
291
|
+
curatorCount: curators.length,
|
|
292
|
+
};
|
|
293
|
+
// Fee data
|
|
294
|
+
const managementFee = vault.state?.managementFee || 0;
|
|
295
|
+
const performanceFee = vault.state?.performanceFee || 0;
|
|
296
|
+
const pricePerShare = BigInt(vault.state?.pricePerShare || '0');
|
|
297
|
+
const highWaterMark = BigInt(vault.state?.highWaterMark || '0');
|
|
298
|
+
const performanceFeeActive = pricePerShare > highWaterMark;
|
|
299
|
+
// Liquidity data
|
|
300
|
+
const safeAssets = vault.state?.safeAssetBalanceUsd || 0;
|
|
301
|
+
const pendingRedemptions = vault.state?.pendingSettlement?.assetsUsd || 0;
|
|
302
|
+
// APR consistency data
|
|
303
|
+
const aprData = {
|
|
304
|
+
weeklyApr: vault.state?.weeklyApr?.linearNetApr,
|
|
305
|
+
monthlyApr: vault.state?.monthlyApr?.linearNetApr,
|
|
306
|
+
yearlyApr: vault.state?.yearlyApr?.linearNetApr,
|
|
307
|
+
inceptionApr: vault.state?.inceptionApr?.linearNetApr,
|
|
308
|
+
};
|
|
309
|
+
// Yield composition
|
|
310
|
+
const weeklyAprData = vault.state?.weeklyApr;
|
|
311
|
+
const yieldComposition = weeklyAprData
|
|
312
|
+
? {
|
|
313
|
+
totalApr: weeklyAprData.linearNetApr || 0,
|
|
314
|
+
nativeYieldsApr: weeklyAprData.nativeYields?.reduce((sum, ny) => sum + (ny.apr || 0), 0) || 0,
|
|
315
|
+
airdropsApr: weeklyAprData.airdrops?.reduce((sum, ad) => sum + (ad.apr || 0), 0) || 0,
|
|
316
|
+
incentivesApr: weeklyAprData.incentives?.reduce((sum, inc) => sum + (inc.apr || 0), 0) || 0,
|
|
317
|
+
}
|
|
318
|
+
: undefined;
|
|
319
|
+
// Settlement data
|
|
320
|
+
const averageSettlement = vault.averageSettlement || 0;
|
|
321
|
+
const pendingOperationsRatio = safeAssets > 0 ? pendingRedemptions / safeAssets : 0;
|
|
322
|
+
const settlementData = {
|
|
323
|
+
averageSettlementDays: averageSettlement,
|
|
324
|
+
pendingOperationsRatio,
|
|
325
|
+
};
|
|
326
|
+
// Integration complexity
|
|
327
|
+
const integrationCount = vault.defiIntegrations?.length || 0;
|
|
328
|
+
// Capacity utilization
|
|
329
|
+
const totalAssets = parseFloat(vault.state?.totalAssets || '0');
|
|
330
|
+
const maxCapacity = vault.maxCapacity ? parseFloat(vault.maxCapacity) : null;
|
|
331
|
+
const capacityData = {
|
|
332
|
+
totalAssets,
|
|
333
|
+
maxCapacity,
|
|
334
|
+
};
|
|
335
|
+
// Calculate comprehensive risk using analyzeRisk utility
|
|
336
|
+
riskBreakdown = analyzeRisk({
|
|
337
|
+
tvl: vaultTVL,
|
|
338
|
+
totalProtocolTVL,
|
|
339
|
+
priceHistory,
|
|
340
|
+
ageInDays,
|
|
341
|
+
curatorVaultCount: vault.curators?.length || 1,
|
|
342
|
+
curatorSuccessRate: 0.5, // Default without historical data
|
|
343
|
+
curatorProfessionalSignals: professionalSignals,
|
|
344
|
+
managementFee,
|
|
345
|
+
performanceFee,
|
|
346
|
+
performanceFeeActive,
|
|
347
|
+
safeAssets,
|
|
348
|
+
pendingRedemptions,
|
|
349
|
+
aprData,
|
|
350
|
+
yieldComposition,
|
|
351
|
+
settlementData,
|
|
352
|
+
integrationCount,
|
|
353
|
+
capacityData,
|
|
354
|
+
});
|
|
355
|
+
riskScore = riskBreakdown.overallRisk;
|
|
356
|
+
}
|
|
357
|
+
catch (error) {
|
|
358
|
+
console.error(`Failed to calculate comprehensive risk for vault ${vault.address}:`, error);
|
|
359
|
+
// Fall back to volatility-based risk score
|
|
360
|
+
}
|
|
361
|
+
return {
|
|
362
|
+
address: vault.address,
|
|
363
|
+
name: vault.name || 'Unknown Vault',
|
|
364
|
+
chainId: vault.chain.id,
|
|
365
|
+
currentValueUsd,
|
|
366
|
+
expectedApr,
|
|
367
|
+
volatility,
|
|
368
|
+
riskScore,
|
|
369
|
+
riskBreakdown,
|
|
370
|
+
};
|
|
371
|
+
});
|
|
372
|
+
// Perform portfolio optimization
|
|
373
|
+
const optimization = optimizePortfolio(vaultsForOptimization, input.strategy, input.rebalanceThreshold);
|
|
374
|
+
// Format optimization as markdown
|
|
375
|
+
const responseFormat = (input.responseFormat ?? 'balanced');
|
|
376
|
+
const markdown = formatPortfolioOptimization(optimization, responseFormat);
|
|
377
|
+
return { markdown };
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Create the executeOptimizePortfolio function with DI container
|
|
381
|
+
*
|
|
382
|
+
* @param container - Service container with dependencies
|
|
383
|
+
* @returns Configured tool executor function
|
|
384
|
+
*/
|
|
385
|
+
export function createExecuteOptimizePortfolio(container) {
|
|
386
|
+
return async (input) => {
|
|
387
|
+
try {
|
|
388
|
+
// Calculate timestamp threshold for 90-day lookback
|
|
389
|
+
const nowTimestamp = Math.floor(Date.now() / 1000);
|
|
390
|
+
const lookbackSeconds = 90 * 24 * 60 * 60; // 90 days
|
|
391
|
+
const timestampThreshold = nowTimestamp - lookbackSeconds;
|
|
392
|
+
// Check cache first
|
|
393
|
+
const vaultAddressesKey = input.vaultAddresses.sort().join(',');
|
|
394
|
+
const cacheKey = `portfolio_optimization:${input.chainId}:${vaultAddressesKey}:${input.strategy}:${input.responseFormat || 'balanced'}`;
|
|
395
|
+
const cachedResult = container.cache.get(cacheKey);
|
|
396
|
+
if (cachedResult) {
|
|
397
|
+
return {
|
|
398
|
+
content: [{ type: 'text', text: cachedResult }],
|
|
399
|
+
isError: false,
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
// Execute parallel queries for each vault
|
|
403
|
+
const vaultQueries = input.vaultAddresses.map((vaultAddress) => container.graphqlClient.request(SINGLE_VAULT_OPTIMIZATION_QUERY, {
|
|
404
|
+
vaultAddress,
|
|
405
|
+
chainId: input.chainId,
|
|
406
|
+
}));
|
|
407
|
+
const results = await Promise.all(vaultQueries);
|
|
408
|
+
// Process each vault's data
|
|
409
|
+
const vaults = [];
|
|
410
|
+
const priceHistoryByVault = new Map();
|
|
411
|
+
const performanceByVault = new Map();
|
|
412
|
+
for (const result of results) {
|
|
413
|
+
const processed = processSingleVaultData(result, timestampThreshold);
|
|
414
|
+
if (processed) {
|
|
415
|
+
vaults.push(processed.vault);
|
|
416
|
+
priceHistoryByVault.set(processed.vault.address.toLowerCase(), processed.prices);
|
|
417
|
+
performanceByVault.set(processed.vault.address.toLowerCase(), processed.performance);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
// Validate we got data for all vaults
|
|
421
|
+
if (vaults.length === 0) {
|
|
422
|
+
return {
|
|
423
|
+
content: [
|
|
424
|
+
{
|
|
425
|
+
type: 'text',
|
|
426
|
+
text: `No vaults found for the provided addresses on chain ${input.chainId}`,
|
|
427
|
+
},
|
|
428
|
+
],
|
|
429
|
+
isError: true,
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
// Transform combined data into optimization output
|
|
433
|
+
const combinedData = {
|
|
434
|
+
vaults,
|
|
435
|
+
priceHistoryByVault,
|
|
436
|
+
performanceByVault,
|
|
437
|
+
};
|
|
438
|
+
const output = transformOptimizationData(input, combinedData);
|
|
439
|
+
// Cache the result
|
|
440
|
+
container.cache.set(cacheKey, output.markdown, cacheTTL.portfolioOptimization);
|
|
441
|
+
// Register cache tags for invalidation
|
|
442
|
+
container.cacheInvalidator.register(cacheKey, [CacheTag.PORTFOLIO, CacheTag.ANALYTICS]);
|
|
443
|
+
return {
|
|
444
|
+
content: [
|
|
445
|
+
{ type: 'text', text: output.markdown + getToolDisclaimer('optimize_portfolio') },
|
|
446
|
+
],
|
|
447
|
+
isError: false,
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
catch (error) {
|
|
451
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error during portfolio optimization';
|
|
452
|
+
return {
|
|
453
|
+
content: [{ type: 'text', text: `Error: ${errorMessage}` }],
|
|
454
|
+
isError: true,
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
//# sourceMappingURL=optimize-portfolio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimize-portfolio.js","sourceRoot":"","sources":["../../src/tools/optimize-portfolio.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* predict_yield Tool
|
|
3
|
+
*
|
|
4
|
+
* ML-based yield forecasting for vault APR prediction.
|
|
5
|
+
* Analyzes historical performance to predict future returns.
|
|
6
|
+
*
|
|
7
|
+
* Use cases:
|
|
8
|
+
* - Investment planning and return projections
|
|
9
|
+
* - Yield farming strategy optimization
|
|
10
|
+
* - Risk-adjusted return forecasting
|
|
11
|
+
* - Performance trend analysis
|
|
12
|
+
* - Performance: ~400-600 tokens per prediction
|
|
13
|
+
*
|
|
14
|
+
* Cache strategy:
|
|
15
|
+
* - 60-minute TTL (predictions valid for moderate duration)
|
|
16
|
+
* - Cache key: yield_prediction:{chainId}:{vaultAddress}:{timeRange}
|
|
17
|
+
* - Cache hit rate target: 75-85%
|
|
18
|
+
* - Cache tags: [CacheTag.VAULT, CacheTag.APR, CacheTag.ANALYTICS] for invalidation
|
|
19
|
+
*/
|
|
20
|
+
import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
21
|
+
import { PredictYieldInput } from '../utils/validators.js';
|
|
22
|
+
import { ServiceContainer } from '../core/container.js';
|
|
23
|
+
/**
|
|
24
|
+
* Create the executePredictYield function with DI container
|
|
25
|
+
*
|
|
26
|
+
* @param container - Service container with dependencies
|
|
27
|
+
* @returns Configured tool executor function
|
|
28
|
+
*/
|
|
29
|
+
export declare function createExecutePredictYield(container: ServiceContainer): (input: PredictYieldInput) => Promise<CallToolResult>;
|
|
30
|
+
//# sourceMappingURL=predict-yield.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"predict-yield.d.ts","sourceRoot":"","sources":["../../src/tools/predict-yield.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAO3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAsQxD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,gBAAgB,GAC1B,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,cAAc,CAAC,CA8DvD"}
|