@sherwoodagent/cli 0.42.0 → 0.51.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/dist/{addresses-DCQMJJFI.js → addresses-DOWLGXGE.js} +4 -4
- package/dist/{agent-5YEJ6W6W.js → agent-ZPAZTJG3.js} +2923 -2023
- package/dist/agent-ZPAZTJG3.js.map +1 -0
- package/dist/autoresearch-IA7HGSNW.js +267 -0
- package/dist/autoresearch-IA7HGSNW.js.map +1 -0
- package/dist/{chat-UWJ6JBFE.js → chat-MRTPUZ3X.js} +8 -8
- package/dist/{chunk-FOOZC4AM.js → chunk-2LRC7I33.js} +2 -2
- package/dist/{chunk-4EHI4SKM.js → chunk-2W4KGGPU.js} +11 -1
- package/dist/chunk-2W4KGGPU.js.map +1 -0
- package/dist/chunk-7HJXZ4NM.js +189 -0
- package/dist/chunk-7HJXZ4NM.js.map +1 -0
- package/dist/{chunk-JNDEZFXW.js → chunk-E6LH2FJ6.js} +4 -4
- package/dist/{chunk-XAUMJZU2.js → chunk-FWC57PT7.js} +2 -2
- package/dist/{chunk-4OAZ7TP5.js → chunk-IS2CLLUT.js} +4 -4
- package/dist/{chunk-T2IA6CCW.js → chunk-KJ35EF7N.js} +4 -4
- package/dist/{chunk-GMVDHSCF.js → chunk-OHQOTSFG.js} +39 -3
- package/dist/chunk-OHQOTSFG.js.map +1 -0
- package/dist/chunk-OMW47WOO.js +700 -0
- package/dist/chunk-OMW47WOO.js.map +1 -0
- package/dist/{chunk-5Q3VT6NQ.js → chunk-R7X33D2S.js} +5 -5
- package/dist/{chunk-6U3A6ZJ2.js → chunk-WMZEOR5W.js} +6 -127
- package/dist/chunk-WMZEOR5W.js.map +1 -0
- package/dist/{chunk-SWKHSKDH.js → chunk-XDBRKW7I.js} +3 -3
- package/dist/chunk-YTYXBX7B.js +495 -0
- package/dist/chunk-YTYXBX7B.js.map +1 -0
- package/dist/{client-DRVUILER.js → client-UHHCB6EZ.js} +4 -4
- package/dist/{config-YRERDZSL.js → config-REASKDIK.js} +6 -2
- package/dist/{eas-KBU2BAOD.js → eas-PEEWGSAO.js} +6 -6
- package/dist/{governor-KH7RNH2E.js → governor-MG5VVSU4.js} +6 -6
- package/dist/index.js +1424 -270
- package/dist/index.js.map +1 -1
- package/dist/{network-3HB46JMQ.js → network-3ZU7UBDU.js} +3 -3
- package/dist/{price-TTQWI672.js → price-WCCXWPDM.js} +5 -5
- package/dist/{research-J3HYU3N6.js → research-QBKISW2M.js} +9 -9
- package/dist/research-YJWSQS2A.js +14 -0
- package/dist/serve-6MYBOAX6.js +222 -0
- package/dist/serve-6MYBOAX6.js.map +1 -0
- package/dist/{session-NUPHC6ZN.js → session-FPCPCVQX.js} +10 -10
- package/dist/summary-formatter-JIGWN4QS.js +180 -0
- package/dist/summary-formatter-JIGWN4QS.js.map +1 -0
- package/dist/{trade-VGECC4QZ.js → trade-NO6CNWCA.js} +19 -17
- package/dist/{trade-VGECC4QZ.js.map → trade-NO6CNWCA.js.map} +1 -1
- package/dist/{xmtp-JO7W6RFK.js → xmtp-ACB2W573.js} +6 -6
- package/package.json +5 -2
- package/dist/agent-5YEJ6W6W.js.map +0 -1
- package/dist/chunk-4EHI4SKM.js.map +0 -1
- package/dist/chunk-6U3A6ZJ2.js.map +0 -1
- package/dist/chunk-GMVDHSCF.js.map +0 -1
- package/dist/research-NR4VC5LN.js +0 -14
- /package/dist/{addresses-DCQMJJFI.js.map → addresses-DOWLGXGE.js.map} +0 -0
- /package/dist/{chat-UWJ6JBFE.js.map → chat-MRTPUZ3X.js.map} +0 -0
- /package/dist/{chunk-FOOZC4AM.js.map → chunk-2LRC7I33.js.map} +0 -0
- /package/dist/{chunk-JNDEZFXW.js.map → chunk-E6LH2FJ6.js.map} +0 -0
- /package/dist/{chunk-XAUMJZU2.js.map → chunk-FWC57PT7.js.map} +0 -0
- /package/dist/{chunk-4OAZ7TP5.js.map → chunk-IS2CLLUT.js.map} +0 -0
- /package/dist/{chunk-T2IA6CCW.js.map → chunk-KJ35EF7N.js.map} +0 -0
- /package/dist/{chunk-5Q3VT6NQ.js.map → chunk-R7X33D2S.js.map} +0 -0
- /package/dist/{chunk-SWKHSKDH.js.map → chunk-XDBRKW7I.js.map} +0 -0
- /package/dist/{client-DRVUILER.js.map → client-UHHCB6EZ.js.map} +0 -0
- /package/dist/{config-YRERDZSL.js.map → config-REASKDIK.js.map} +0 -0
- /package/dist/{eas-KBU2BAOD.js.map → eas-PEEWGSAO.js.map} +0 -0
- /package/dist/{governor-KH7RNH2E.js.map → governor-MG5VVSU4.js.map} +0 -0
- /package/dist/{network-3HB46JMQ.js.map → network-3ZU7UBDU.js.map} +0 -0
- /package/dist/{price-TTQWI672.js.map → price-WCCXWPDM.js.map} +0 -0
- /package/dist/{research-J3HYU3N6.js.map → research-QBKISW2M.js.map} +0 -0
- /package/dist/{research-NR4VC5LN.js.map → research-YJWSQS2A.js.map} +0 -0
- /package/dist/{session-NUPHC6ZN.js.map → session-FPCPCVQX.js.map} +0 -0
- /package/dist/{xmtp-JO7W6RFK.js.map → xmtp-ACB2W573.js.map} +0 -0
|
@@ -0,0 +1,495 @@
|
|
|
1
|
+
// src/agent/utils.ts
|
|
2
|
+
function clamp(v, min = -1, max = 1) {
|
|
3
|
+
return Math.min(max, Math.max(min, v));
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
// src/agent/scoring.ts
|
|
7
|
+
var DEFAULT_WEIGHTS = {
|
|
8
|
+
smartMoney: 0.3,
|
|
9
|
+
technical: 0.25,
|
|
10
|
+
sentiment: 0.1,
|
|
11
|
+
onchain: 0.2,
|
|
12
|
+
fundamental: 0.15,
|
|
13
|
+
event: 0
|
|
14
|
+
};
|
|
15
|
+
var WEIGHT_PROFILES = {
|
|
16
|
+
default: DEFAULT_WEIGHTS,
|
|
17
|
+
majors: { smartMoney: 0.3, technical: 0.3, sentiment: 0.1, onchain: 0.2, fundamental: 0.1, event: 0 },
|
|
18
|
+
altcoin: { smartMoney: 0.25, technical: 0.2, sentiment: 0.1, onchain: 0.15, fundamental: 0.3, event: 0 }
|
|
19
|
+
};
|
|
20
|
+
var MAJORS_TOKEN_IDS = /* @__PURE__ */ new Set(["bitcoin", "ethereum", "solana"]);
|
|
21
|
+
function profileForToken(tokenId, userProfile) {
|
|
22
|
+
if (userProfile && WEIGHT_PROFILES[userProfile]) {
|
|
23
|
+
return WEIGHT_PROFILES[userProfile];
|
|
24
|
+
}
|
|
25
|
+
if (MAJORS_TOKEN_IDS.has(tokenId.toLowerCase())) {
|
|
26
|
+
return WEIGHT_PROFILES["majors"];
|
|
27
|
+
}
|
|
28
|
+
return DEFAULT_WEIGHTS;
|
|
29
|
+
}
|
|
30
|
+
var DEFAULT_THRESHOLDS = {
|
|
31
|
+
strongBuy: 0.6,
|
|
32
|
+
buy: 0.3,
|
|
33
|
+
sell: -0.3,
|
|
34
|
+
strongSell: -0.6
|
|
35
|
+
};
|
|
36
|
+
var REGIME_THRESHOLDS = {
|
|
37
|
+
// Apr 23: lowered buy 0.20→0.10. With counter-trend dampening + 15 mixed
|
|
38
|
+
// signals, scores compress to -0.15 to +0.15 range. Max score in last 6h was
|
|
39
|
+
// 0.147 — threshold at 0.20 was unreachable. At 0.10, ~3% of signals fire
|
|
40
|
+
// (~4-5 trades/day). The regime gate + stop management handle risk.
|
|
41
|
+
// Autoresearch (Apr 27): buy 0.12→0.14 (more selective, validated on walk-forward)
|
|
42
|
+
"trending-up": { strongBuy: 0.3, buy: 0.14, sell: -0.14, strongSell: -0.3 },
|
|
43
|
+
"trending-down": { strongBuy: 0.3, buy: 0.14, sell: -0.14, strongSell: -0.3 },
|
|
44
|
+
// Apr 2026 recalibration: with dead-weight strategies removed (event,
|
|
45
|
+
// tokenUnlock, tvlMomentum, meanReversion — all 0% fire rate), only 6
|
|
46
|
+
// strategies remain active. The prior 0.30 BUY threshold was never reached
|
|
47
|
+
// (max |score| ≈ 0.04 over 48h) because ~40% of composite weight went to
|
|
48
|
+
// always-zero signals that diluted the denominator. Lowered proportionally:
|
|
49
|
+
// BUY 0.30 → 0.20, strongBuy 0.55 → 0.35
|
|
50
|
+
// SELL -0.15 → -0.10, strongSell -0.30 → -0.20
|
|
51
|
+
//
|
|
52
|
+
// SELL side remains asymmetric with BUY: the contrarian sentiment model +
|
|
53
|
+
// on-chain defaults + BTC-bullish suppression bias the aggregate score
|
|
54
|
+
// positive. Empirical distribution: min -0.18, p3 ≈ -0.10, p50 ≈ +0.15.
|
|
55
|
+
// Apr 21 recalibration: shorts are 0/3 win rate, all stopped out. The sell
|
|
56
|
+
// thresholds at -0.08/-0.15 were too easy to trigger with marginal signals
|
|
57
|
+
// in a ranging/slightly-bullish market. Tightened to require higher
|
|
58
|
+
// conviction for shorts while keeping longs at the working 0.15 level.
|
|
59
|
+
// Apr 27 autoresearch follow-up replayed against signal-history with the
|
|
60
|
+
// post-Fincept signal stack and converged on symmetric ±0.14 — shorts now
|
|
61
|
+
// qualify at parity with longs because the smartMoney/perp signals carry
|
|
62
|
+
// their own bearish edge that the prior asymmetry double-counted.
|
|
63
|
+
"ranging": { strongBuy: 0.3, buy: 0.14, sell: -0.14, strongSell: -0.3 },
|
|
64
|
+
"high-volatility": { strongBuy: 0.5, buy: 0.3, sell: -0.3, strongSell: -0.5 },
|
|
65
|
+
"low-volatility": { strongBuy: 0.4, buy: 0.2, sell: -0.2, strongSell: -0.4 }
|
|
66
|
+
};
|
|
67
|
+
function thresholdsForRegime(regime) {
|
|
68
|
+
if (!regime) return DEFAULT_THRESHOLDS;
|
|
69
|
+
return REGIME_THRESHOLDS[regime] ?? DEFAULT_THRESHOLDS;
|
|
70
|
+
}
|
|
71
|
+
function scoreTechnical(signals) {
|
|
72
|
+
let value = 0;
|
|
73
|
+
const details = [];
|
|
74
|
+
let confidence = 0.5;
|
|
75
|
+
const nanCount = [signals.rsi, signals.macd.histogram, signals.bb.width, signals.ema.ema50].filter((v) => isNaN(v)).length;
|
|
76
|
+
if (nanCount >= 3) {
|
|
77
|
+
confidence = 0.15;
|
|
78
|
+
details.push("Insufficient data for most indicators");
|
|
79
|
+
}
|
|
80
|
+
const rsi = signals.rsi;
|
|
81
|
+
if (!isNaN(rsi)) {
|
|
82
|
+
if (rsi < 30) {
|
|
83
|
+
const rsiScore = 0.5 + 0.3 * ((30 - rsi) / 30);
|
|
84
|
+
value += rsiScore;
|
|
85
|
+
details.push(`RSI ${rsi.toFixed(1)} oversold (+${rsiScore.toFixed(2)})`);
|
|
86
|
+
confidence += 0.1;
|
|
87
|
+
} else if (rsi > 70) {
|
|
88
|
+
const rsiScore = -(0.5 + 0.3 * ((rsi - 70) / 30));
|
|
89
|
+
value += rsiScore;
|
|
90
|
+
details.push(`RSI ${rsi.toFixed(1)} overbought (${rsiScore.toFixed(2)})`);
|
|
91
|
+
confidence += 0.1;
|
|
92
|
+
} else {
|
|
93
|
+
const rsiScore = -((rsi - 50) / 20) * 0.5;
|
|
94
|
+
value += rsiScore;
|
|
95
|
+
details.push(`RSI ${rsi.toFixed(1)} (${rsiScore >= 0 ? "+" : ""}${rsiScore.toFixed(2)})`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const hist = signals.macd.histogram;
|
|
99
|
+
if (!isNaN(hist)) {
|
|
100
|
+
if (hist > 0) {
|
|
101
|
+
value += 0.3;
|
|
102
|
+
details.push(`MACD histogram positive (+0.30)`);
|
|
103
|
+
} else if (hist < 0) {
|
|
104
|
+
value -= 0.3;
|
|
105
|
+
details.push(`MACD histogram negative (-0.30)`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (signals.bb.squeeze) {
|
|
109
|
+
details.push("BB squeeze detected (neutral, awaiting breakout)");
|
|
110
|
+
} else {
|
|
111
|
+
const lastClose = signals.ema.ema8;
|
|
112
|
+
if (!isNaN(signals.bb.lower) && !isNaN(lastClose)) {
|
|
113
|
+
const volSpike = signals.volume.ratio > 1.5;
|
|
114
|
+
if (lastClose < signals.bb.lower && volSpike) {
|
|
115
|
+
value += 0.5;
|
|
116
|
+
details.push("Price below lower BB with volume spike (+0.50)");
|
|
117
|
+
confidence += 0.1;
|
|
118
|
+
} else if (lastClose > signals.bb.upper && volSpike) {
|
|
119
|
+
value -= 0.5;
|
|
120
|
+
details.push("Price above upper BB with volume spike (-0.50)");
|
|
121
|
+
confidence += 0.1;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const { ema8, ema21, ema50, ema200 } = signals.ema;
|
|
126
|
+
if (!isNaN(ema8) && !isNaN(ema21) && !isNaN(ema50) && !isNaN(ema200)) {
|
|
127
|
+
if (ema8 > ema21 && ema21 > ema50 && ema50 > ema200) {
|
|
128
|
+
value += 0.4;
|
|
129
|
+
details.push("Bullish EMA alignment (8>21>50>200) (+0.40)");
|
|
130
|
+
confidence += 0.1;
|
|
131
|
+
} else if (ema8 < ema21 && ema21 < ema50 && ema50 < ema200) {
|
|
132
|
+
value -= 0.4;
|
|
133
|
+
details.push("Bearish EMA alignment (8<21<50<200) (-0.40)");
|
|
134
|
+
confidence += 0.1;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
name: "technical",
|
|
139
|
+
value: clamp(value),
|
|
140
|
+
confidence: Math.min(confidence, 1),
|
|
141
|
+
source: "Technical Analysis",
|
|
142
|
+
details: details.join("; ")
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
function scoreSentiment(fearAndGreed, sentimentZScore) {
|
|
146
|
+
let value = 0;
|
|
147
|
+
const details = [];
|
|
148
|
+
let confidence = 0.6;
|
|
149
|
+
if (fearAndGreed < 15) {
|
|
150
|
+
value = 1;
|
|
151
|
+
details.push(`Extreme fear (F&G=${fearAndGreed}) \u2192 max contrarian buy`);
|
|
152
|
+
confidence = 0.8;
|
|
153
|
+
} else if (fearAndGreed < 25) {
|
|
154
|
+
value = 0.8 - 0.3 * ((fearAndGreed - 15) / 10);
|
|
155
|
+
details.push(`Fear (F&G=${fearAndGreed}) \u2192 contrarian buy (+${value.toFixed(2)})`);
|
|
156
|
+
confidence = 0.7;
|
|
157
|
+
} else if (fearAndGreed < 40) {
|
|
158
|
+
value = 0.3 - 0.2 * ((fearAndGreed - 25) / 15);
|
|
159
|
+
details.push(`Mild fear (F&G=${fearAndGreed}) \u2192 slight buy (+${value.toFixed(2)})`);
|
|
160
|
+
} else if (fearAndGreed <= 60) {
|
|
161
|
+
value = 0;
|
|
162
|
+
details.push(`Neutral sentiment (F&G=${fearAndGreed})`);
|
|
163
|
+
confidence = 0.4;
|
|
164
|
+
} else if (fearAndGreed <= 75) {
|
|
165
|
+
value = -0.1 - 0.4 * ((fearAndGreed - 60) / 15);
|
|
166
|
+
details.push(`Greed (F&G=${fearAndGreed}) \u2192 contrarian sell (${value.toFixed(2)})`);
|
|
167
|
+
} else {
|
|
168
|
+
value = -0.5 - 0.5 * ((fearAndGreed - 75) / 25);
|
|
169
|
+
details.push(`Extreme greed (F&G=${fearAndGreed}) \u2192 max contrarian sell (${value.toFixed(2)})`);
|
|
170
|
+
confidence = 0.8;
|
|
171
|
+
}
|
|
172
|
+
if (sentimentZScore !== void 0) {
|
|
173
|
+
const adjustment = clamp(sentimentZScore * 0.1, -0.2, 0.2);
|
|
174
|
+
value = clamp(value + adjustment);
|
|
175
|
+
if (Math.abs(adjustment) > 0.05) {
|
|
176
|
+
details.push(`Z-score adjustment: ${adjustment >= 0 ? "+" : ""}${adjustment.toFixed(2)}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return {
|
|
180
|
+
name: "sentiment",
|
|
181
|
+
value: clamp(value),
|
|
182
|
+
confidence,
|
|
183
|
+
source: "Market Sentiment",
|
|
184
|
+
details: details.join("; ")
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
function scoreOnChain(data) {
|
|
188
|
+
let value = 0;
|
|
189
|
+
const details = [];
|
|
190
|
+
let confidence = 0.4;
|
|
191
|
+
if (data.exchangeNetFlow !== void 0) {
|
|
192
|
+
if (data.exchangeNetFlow < 0) {
|
|
193
|
+
value += 0.4;
|
|
194
|
+
details.push("Negative exchange net flow (bullish)");
|
|
195
|
+
confidence += 0.1;
|
|
196
|
+
} else if (data.exchangeNetFlow > 0) {
|
|
197
|
+
value -= 0.4;
|
|
198
|
+
details.push("Positive exchange net flow (bearish)");
|
|
199
|
+
confidence += 0.1;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (data.whaleAccumulating !== void 0) {
|
|
203
|
+
if (data.whaleAccumulating) {
|
|
204
|
+
value += 0.3;
|
|
205
|
+
details.push("Whale accumulation detected");
|
|
206
|
+
confidence += 0.15;
|
|
207
|
+
} else {
|
|
208
|
+
value -= 0.3;
|
|
209
|
+
details.push("Whale distribution detected");
|
|
210
|
+
confidence += 0.15;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (data.activeAddressesGrowth !== void 0) {
|
|
214
|
+
const growth = data.activeAddressesGrowth;
|
|
215
|
+
if (growth > 0.1) {
|
|
216
|
+
value += 0.2;
|
|
217
|
+
details.push(`Active addresses growing (${(growth * 100).toFixed(1)}%)`);
|
|
218
|
+
} else if (growth < -0.1) {
|
|
219
|
+
value -= 0.2;
|
|
220
|
+
details.push(`Active addresses declining (${(growth * 100).toFixed(1)}%)`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
if (details.length === 0) {
|
|
224
|
+
details.push("No on-chain data available");
|
|
225
|
+
confidence = 0.1;
|
|
226
|
+
}
|
|
227
|
+
return {
|
|
228
|
+
name: "onchain",
|
|
229
|
+
value: clamp(value),
|
|
230
|
+
confidence: Math.min(confidence, 1),
|
|
231
|
+
source: "On-Chain Analysis",
|
|
232
|
+
details: details.join("; ")
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
function scoreFundamental(data) {
|
|
236
|
+
let value = 0;
|
|
237
|
+
const details = [];
|
|
238
|
+
let confidence = 0.4;
|
|
239
|
+
if (data.tvlGrowthWeekly !== void 0) {
|
|
240
|
+
const g = data.tvlGrowthWeekly;
|
|
241
|
+
if (g > 0.1) {
|
|
242
|
+
value += 0.4;
|
|
243
|
+
details.push(`TVL growing ${(g * 100).toFixed(1)}% weekly`);
|
|
244
|
+
confidence += 0.1;
|
|
245
|
+
} else if (g < -0.1) {
|
|
246
|
+
value -= 0.4;
|
|
247
|
+
details.push(`TVL declining ${(g * 100).toFixed(1)}% weekly`);
|
|
248
|
+
confidence += 0.1;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
if (data.revenueGrowth !== void 0) {
|
|
252
|
+
const g = data.revenueGrowth;
|
|
253
|
+
if (g > 0.1) {
|
|
254
|
+
value += 0.3;
|
|
255
|
+
details.push(`Revenue growing ${(g * 100).toFixed(1)}%`);
|
|
256
|
+
} else if (g < -0.1) {
|
|
257
|
+
value -= 0.3;
|
|
258
|
+
details.push(`Revenue declining ${(g * 100).toFixed(1)}%`);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
if (data.mcapToTvl !== void 0) {
|
|
262
|
+
const ratio = data.mcapToTvl;
|
|
263
|
+
if (ratio < 1) {
|
|
264
|
+
value += 0.3;
|
|
265
|
+
details.push(`Mcap/TVL ratio ${ratio.toFixed(2)} (undervalued)`);
|
|
266
|
+
confidence += 0.1;
|
|
267
|
+
} else if (ratio > 5) {
|
|
268
|
+
value -= 0.3;
|
|
269
|
+
details.push(`Mcap/TVL ratio ${ratio.toFixed(2)} (overvalued)`);
|
|
270
|
+
confidence += 0.1;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
if (details.length === 0) {
|
|
274
|
+
details.push("No fundamental data available");
|
|
275
|
+
confidence = 0.1;
|
|
276
|
+
}
|
|
277
|
+
return {
|
|
278
|
+
name: "fundamental",
|
|
279
|
+
value: clamp(value),
|
|
280
|
+
confidence: Math.min(confidence, 1),
|
|
281
|
+
source: "Fundamental Analysis",
|
|
282
|
+
details: details.join("; ")
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
function scoreEvent(data) {
|
|
286
|
+
let value = 0;
|
|
287
|
+
const details = [];
|
|
288
|
+
let confidence = 0.3;
|
|
289
|
+
if (data.unlockPercent !== void 0 && data.daysUntilUnlock !== void 0) {
|
|
290
|
+
if (data.unlockPercent > 5 && data.daysUntilUnlock < 30) {
|
|
291
|
+
const severity = Math.min(data.unlockPercent / 20, 1);
|
|
292
|
+
value -= severity * 0.8;
|
|
293
|
+
details.push(
|
|
294
|
+
`Token unlock: ${data.unlockPercent.toFixed(1)}% in ${data.daysUntilUnlock} days (bearish)`
|
|
295
|
+
);
|
|
296
|
+
confidence = 0.7;
|
|
297
|
+
} else if (data.unlockPercent < 2) {
|
|
298
|
+
details.push("Minor unlock, negligible impact");
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
if (data.positiveEvent !== void 0) {
|
|
302
|
+
if (data.positiveEvent) {
|
|
303
|
+
value += 0.4;
|
|
304
|
+
details.push("Positive catalyst event");
|
|
305
|
+
confidence += 0.2;
|
|
306
|
+
} else {
|
|
307
|
+
value -= 0.4;
|
|
308
|
+
details.push("Negative catalyst event");
|
|
309
|
+
confidence += 0.2;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
if (details.length === 0) {
|
|
313
|
+
details.push("No event data available");
|
|
314
|
+
confidence = 0.1;
|
|
315
|
+
}
|
|
316
|
+
return {
|
|
317
|
+
name: "event",
|
|
318
|
+
value: clamp(value),
|
|
319
|
+
confidence: Math.min(confidence, 1),
|
|
320
|
+
source: "Event Analysis",
|
|
321
|
+
details: details.join("; ")
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
var LAGGING_TECHNICAL_SIGNALS = /* @__PURE__ */ new Set(["technical"]);
|
|
325
|
+
var COUNTER_TREND_DAMPENED = /* @__PURE__ */ new Set(["kronosVolForecast", "whaleIntent"]);
|
|
326
|
+
var COUNTER_TREND_THRESHOLD = 0.05;
|
|
327
|
+
var EXCLUDED_SCORING_SIGNALS = /* @__PURE__ */ new Set([
|
|
328
|
+
"tradingviewSignal",
|
|
329
|
+
"momentum",
|
|
330
|
+
"fundingRate",
|
|
331
|
+
"hyperliquidFlow",
|
|
332
|
+
"event",
|
|
333
|
+
"crossSectionalMomentum",
|
|
334
|
+
"multiTimeframe",
|
|
335
|
+
"btcNetworkHealth",
|
|
336
|
+
"socialVolume",
|
|
337
|
+
"tokenUnlock",
|
|
338
|
+
"tvlMomentum"
|
|
339
|
+
]);
|
|
340
|
+
var SIGNAL_CATEGORY_MAP = {
|
|
341
|
+
technical: "technical",
|
|
342
|
+
sentiment: "sentiment",
|
|
343
|
+
onchain: "onchain",
|
|
344
|
+
fundamental: "fundamental",
|
|
345
|
+
event: "event",
|
|
346
|
+
smartMoney: "smartMoney",
|
|
347
|
+
flowIntelligence: "smartMoney",
|
|
348
|
+
// shares smartMoney category — auto weight-split with perp signal
|
|
349
|
+
// Strategy signal mappings to categories (only active strategies)
|
|
350
|
+
breakoutOnChain: "technical",
|
|
351
|
+
multiTimeframe: "technical",
|
|
352
|
+
crossSectionalMomentum: "technical",
|
|
353
|
+
tradingviewSignal: "technical",
|
|
354
|
+
dexFlow: "onchain",
|
|
355
|
+
fundingRate: "onchain",
|
|
356
|
+
hyperliquidFlow: "onchain",
|
|
357
|
+
sentimentContrarian: "sentiment",
|
|
358
|
+
btcNetworkHealth: "technical",
|
|
359
|
+
predictionMarket: "event",
|
|
360
|
+
socialVolume: "sentiment",
|
|
361
|
+
kronosVolForecast: "technical",
|
|
362
|
+
narrativeVacuum: "onchain",
|
|
363
|
+
whaleIntent: "smartMoney"
|
|
364
|
+
};
|
|
365
|
+
var X402_CATEGORIES = /* @__PURE__ */ new Set(["smartMoney", "event"]);
|
|
366
|
+
function computeTradeDecision(signals, weights, regimeAdjustments, correlationCheck, regime, x402Available) {
|
|
367
|
+
const w = weights ?? DEFAULT_WEIGHTS;
|
|
368
|
+
const thresholds = thresholdsForRegime(regime);
|
|
369
|
+
const excludedCategories = /* @__PURE__ */ new Set();
|
|
370
|
+
if (x402Available === false) {
|
|
371
|
+
for (const cat of X402_CATEGORIES) {
|
|
372
|
+
if (w[cat] > 0) excludedCategories.add(cat);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
const categoryCounts = {};
|
|
376
|
+
for (const signal of signals) {
|
|
377
|
+
if (EXCLUDED_SCORING_SIGNALS.has(signal.name)) continue;
|
|
378
|
+
if (signal._weightOverride !== void 0) continue;
|
|
379
|
+
const category = SIGNAL_CATEGORY_MAP[signal.name];
|
|
380
|
+
if (!category || excludedCategories.has(category)) continue;
|
|
381
|
+
categoryCounts[category] = (categoryCounts[category] ?? 0) + 1;
|
|
382
|
+
}
|
|
383
|
+
let totalWeight = 0;
|
|
384
|
+
let weightedSum = 0;
|
|
385
|
+
let weightedConfidence = 0;
|
|
386
|
+
for (const signal of signals) {
|
|
387
|
+
if (EXCLUDED_SCORING_SIGNALS.has(signal.name)) continue;
|
|
388
|
+
let signalWeight;
|
|
389
|
+
if (signal._weightOverride !== void 0) {
|
|
390
|
+
signalWeight = signal._weightOverride;
|
|
391
|
+
} else {
|
|
392
|
+
const category = SIGNAL_CATEGORY_MAP[signal.name];
|
|
393
|
+
if (category && excludedCategories.has(category)) continue;
|
|
394
|
+
const categoryWeight = category ? w[category] : 0.1;
|
|
395
|
+
const count = category ? categoryCounts[category] ?? 1 : 1;
|
|
396
|
+
signalWeight = categoryWeight / count;
|
|
397
|
+
}
|
|
398
|
+
let adjustedValue = signal.value;
|
|
399
|
+
let adjustedConfidence = signal.confidence;
|
|
400
|
+
if (regimeAdjustments && signal.name in regimeAdjustments) {
|
|
401
|
+
const adjustment = regimeAdjustments[signal.name];
|
|
402
|
+
adjustedValue *= adjustment;
|
|
403
|
+
adjustedConfidence *= adjustment;
|
|
404
|
+
}
|
|
405
|
+
if (regime && (regime === "trending-up" || regime === "trending-down") && LAGGING_TECHNICAL_SIGNALS.has(signal.name)) {
|
|
406
|
+
signalWeight *= 0.5;
|
|
407
|
+
}
|
|
408
|
+
if (regime && COUNTER_TREND_DAMPENED.has(signal.name)) {
|
|
409
|
+
const isCounterTrend = regime === "trending-up" && adjustedValue < -COUNTER_TREND_THRESHOLD || regime === "trending-down" && adjustedValue > COUNTER_TREND_THRESHOLD;
|
|
410
|
+
if (isCounterTrend) {
|
|
411
|
+
signalWeight *= 0.3;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
if (adjustedValue === 0 && adjustedConfidence <= 0.15) {
|
|
415
|
+
continue;
|
|
416
|
+
}
|
|
417
|
+
weightedSum += adjustedValue * signalWeight;
|
|
418
|
+
weightedConfidence += adjustedConfidence * signalWeight;
|
|
419
|
+
totalWeight += signalWeight;
|
|
420
|
+
}
|
|
421
|
+
let score = totalWeight > 0 ? weightedSum / totalWeight : 0;
|
|
422
|
+
const confidence = totalWeight > 0 ? weightedConfidence / totalWeight : 0;
|
|
423
|
+
if (Math.abs(score) > 0.01) {
|
|
424
|
+
const scoreSign = Math.sign(score);
|
|
425
|
+
const categoryNetDirection = /* @__PURE__ */ new Map();
|
|
426
|
+
for (const signal of signals) {
|
|
427
|
+
if (EXCLUDED_SCORING_SIGNALS.has(signal.name)) continue;
|
|
428
|
+
const category = SIGNAL_CATEGORY_MAP[signal.name];
|
|
429
|
+
if (!category || excludedCategories.has(category)) continue;
|
|
430
|
+
if (signal._weightOverride !== void 0) continue;
|
|
431
|
+
let voteValue = signal.value;
|
|
432
|
+
if (regime && (regime === "trending-up" || regime === "trending-down") && LAGGING_TECHNICAL_SIGNALS.has(signal.name)) {
|
|
433
|
+
voteValue *= 0.5;
|
|
434
|
+
}
|
|
435
|
+
if (regime && COUNTER_TREND_DAMPENED.has(signal.name)) {
|
|
436
|
+
const isCounterTrend = regime === "trending-up" && voteValue < -COUNTER_TREND_THRESHOLD || regime === "trending-down" && voteValue > COUNTER_TREND_THRESHOLD;
|
|
437
|
+
if (isCounterTrend) voteValue *= 0.3;
|
|
438
|
+
}
|
|
439
|
+
const current = categoryNetDirection.get(category) ?? 0;
|
|
440
|
+
categoryNetDirection.set(category, current + voteValue);
|
|
441
|
+
}
|
|
442
|
+
let agreeing = 0;
|
|
443
|
+
let totalActive = 0;
|
|
444
|
+
for (const [, netValue] of categoryNetDirection) {
|
|
445
|
+
totalActive++;
|
|
446
|
+
if (Math.sign(netValue) === scoreSign) agreeing++;
|
|
447
|
+
}
|
|
448
|
+
if (agreeing >= 4 && totalActive >= 4) {
|
|
449
|
+
const bonus = 1 + 0.15 * (agreeing - 3);
|
|
450
|
+
score *= Math.min(bonus, 1.45);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
if (correlationCheck) {
|
|
454
|
+
if (correlationCheck.btcBias === "bearish" && score > 0) {
|
|
455
|
+
score *= correlationCheck.suppressionFactor;
|
|
456
|
+
} else if (correlationCheck.btcBias === "bearish" && score < 0) {
|
|
457
|
+
score *= 1 + Math.abs(correlationCheck.btcScore) * 0.3;
|
|
458
|
+
} else if (correlationCheck.btcBias === "bullish" && score > 0) {
|
|
459
|
+
score *= 1 + Math.abs(correlationCheck.btcScore) * 0.3;
|
|
460
|
+
} else if (correlationCheck.btcBias === "bullish" && score < 0) {
|
|
461
|
+
score *= correlationCheck.suppressionFactor;
|
|
462
|
+
}
|
|
463
|
+
score = Math.max(-1, Math.min(1, score));
|
|
464
|
+
}
|
|
465
|
+
score = Math.max(-1, Math.min(1, score));
|
|
466
|
+
let action;
|
|
467
|
+
if (score >= thresholds.strongBuy) action = "STRONG_BUY";
|
|
468
|
+
else if (score >= thresholds.buy) action = "BUY";
|
|
469
|
+
else if (score <= thresholds.strongSell) action = "STRONG_SELL";
|
|
470
|
+
else if (score <= thresholds.sell) action = "SELL";
|
|
471
|
+
else action = "HOLD";
|
|
472
|
+
const reasoning = signals.map((s) => `[${s.source}] ${s.details}`).join("\n");
|
|
473
|
+
return {
|
|
474
|
+
action,
|
|
475
|
+
score,
|
|
476
|
+
signals,
|
|
477
|
+
reasoning,
|
|
478
|
+
confidence,
|
|
479
|
+
timestamp: Date.now(),
|
|
480
|
+
thresholds
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
export {
|
|
485
|
+
clamp,
|
|
486
|
+
DEFAULT_WEIGHTS,
|
|
487
|
+
profileForToken,
|
|
488
|
+
scoreTechnical,
|
|
489
|
+
scoreSentiment,
|
|
490
|
+
scoreOnChain,
|
|
491
|
+
scoreFundamental,
|
|
492
|
+
scoreEvent,
|
|
493
|
+
computeTradeDecision
|
|
494
|
+
};
|
|
495
|
+
//# sourceMappingURL=chunk-YTYXBX7B.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/agent/utils.ts","../src/agent/scoring.ts"],"sourcesContent":["/** Clamp a number between min and max (default [-1, 1]). */\nexport function clamp(v: number, min: number = -1, max: number = 1): number {\n return Math.min(max, Math.max(min, v));\n}\n","/**\n * Signal scoring engine — converts raw data into trade decisions.\n */\n\nimport type { TechnicalSignals } from \"./technical.js\";\nimport { clamp } from \"./utils.js\";\nimport type { CorrelationCheck } from \"./correlation.js\";\nimport type { MarketRegime } from \"./regime.js\";\n\nexport interface Signal {\n name: string;\n value: number; // -1.0 to +1.0\n confidence: number; // 0.0 to 1.0\n source: string;\n details: string;\n _weightOverride?: number;\n}\n\nexport interface ScoringWeights {\n smartMoney: number;\n technical: number;\n sentiment: number;\n onchain: number;\n fundamental: number;\n event: number;\n}\n\n// Apr 24 2026 signal review over 23k live observations:\n// - Upweight smartMoney/fundamental; both had the best 12h-24h forward edge.\n// - Keep technical/onchain categories, but exclude harmful child signals below.\n// - Event is set to 0 until it produces non-zero, testable observations.\nexport const DEFAULT_WEIGHTS: ScoringWeights = {\n smartMoney: 0.30,\n technical: 0.25,\n sentiment: 0.10,\n onchain: 0.20,\n fundamental: 0.15,\n event: 0.00,\n};\n\n/**\n * Named weight profiles for `--weight-profile <name>` and per-asset auto-selection.\n *\n * - default: balanced — used when no profile selected\n * - majors: BTC/ETH/SOL — smartMoney + technical + onchain dominate; event\n * disabled (unlocks rare on majors), fundamental reduced (no\n * meaningful TVL on BTC).\n * - altcoin: smaller caps — fundamental upweighted because TVL deltas drive\n * price action on altcoins. event remains disabled until it\n * produces non-zero, testable observations (see DEFAULT_WEIGHTS).\n */\nexport const WEIGHT_PROFILES: Record<string, ScoringWeights> = {\n default: DEFAULT_WEIGHTS,\n majors: { smartMoney: 0.30, technical: 0.30, sentiment: 0.10, onchain: 0.20, fundamental: 0.10, event: 0.00 },\n altcoin: { smartMoney: 0.25, technical: 0.20, sentiment: 0.10, onchain: 0.15, fundamental: 0.30, event: 0.00 },\n};\n\n/** Tokens that get the \"majors\" profile when auto-selection is enabled. */\nconst MAJORS_TOKEN_IDS = new Set([\"bitcoin\", \"ethereum\", \"solana\"]);\n\n/**\n * Pick a weight profile for a token. Returns user-specified profile if given,\n * otherwise auto-selects \"majors\" for BTC/ETH/SOL and \"default\" for everything else.\n */\nexport function profileForToken(tokenId: string, userProfile?: string): ScoringWeights {\n if (userProfile && WEIGHT_PROFILES[userProfile]) {\n return WEIGHT_PROFILES[userProfile];\n }\n if (MAJORS_TOKEN_IDS.has(tokenId.toLowerCase())) {\n return WEIGHT_PROFILES[\"majors\"]!;\n }\n return DEFAULT_WEIGHTS;\n}\n\nexport interface TradeDecision {\n action: \"STRONG_BUY\" | \"BUY\" | \"HOLD\" | \"SELL\" | \"STRONG_SELL\";\n score: number;\n signals: Signal[];\n reasoning: string;\n confidence: number;\n timestamp: number;\n /** Thresholds actually used to decide action — for audit + backtest replay. */\n thresholds?: ActionThresholds;\n}\n\n/** BUY/SELL action thresholds. All values are score cutoffs in [-1, 1]. */\nexport interface ActionThresholds {\n strongBuy: number; // score >= strongBuy → STRONG_BUY\n buy: number; // score >= buy → BUY\n sell: number; // score <= sell → SELL (negative)\n strongSell: number; // score <= strongSell → STRONG_SELL (more negative)\n}\n\n/** Default thresholds — symmetric, used when no regime info is provided. */\nexport const DEFAULT_THRESHOLDS: ActionThresholds = {\n strongBuy: 0.6,\n buy: 0.3,\n sell: -0.3,\n strongSell: -0.6,\n};\n\n/**\n * Regime-conditional thresholds.\n *\n * Trending regimes: asymmetric — easier to enter WITH the trend, harder to fade it.\n * Ranging: symmetric but tighter — whipsaws are expensive, demand more conviction.\n * High-volatility: tighter — wide moves without direction mean more false signals.\n * Low-volatility: looser — cleaner signal environment, less noise to filter.\n */\nexport const REGIME_THRESHOLDS: Record<MarketRegime, ActionThresholds> = {\n // Apr 23: lowered buy 0.20→0.10. With counter-trend dampening + 15 mixed\n // signals, scores compress to -0.15 to +0.15 range. Max score in last 6h was\n // 0.147 — threshold at 0.20 was unreachable. At 0.10, ~3% of signals fire\n // (~4-5 trades/day). The regime gate + stop management handle risk.\n // Autoresearch (Apr 27): buy 0.12→0.14 (more selective, validated on walk-forward)\n \"trending-up\": { strongBuy: 0.30, buy: 0.14, sell: -0.14, strongSell: -0.30 },\n \"trending-down\": { strongBuy: 0.30, buy: 0.14, sell: -0.14, strongSell: -0.30 },\n // Apr 2026 recalibration: with dead-weight strategies removed (event,\n // tokenUnlock, tvlMomentum, meanReversion — all 0% fire rate), only 6\n // strategies remain active. The prior 0.30 BUY threshold was never reached\n // (max |score| ≈ 0.04 over 48h) because ~40% of composite weight went to\n // always-zero signals that diluted the denominator. Lowered proportionally:\n // BUY 0.30 → 0.20, strongBuy 0.55 → 0.35\n // SELL -0.15 → -0.10, strongSell -0.30 → -0.20\n //\n // SELL side remains asymmetric with BUY: the contrarian sentiment model +\n // on-chain defaults + BTC-bullish suppression bias the aggregate score\n // positive. Empirical distribution: min -0.18, p3 ≈ -0.10, p50 ≈ +0.15.\n // Apr 21 recalibration: shorts are 0/3 win rate, all stopped out. The sell\n // thresholds at -0.08/-0.15 were too easy to trigger with marginal signals\n // in a ranging/slightly-bullish market. Tightened to require higher\n // conviction for shorts while keeping longs at the working 0.15 level.\n // Apr 27 autoresearch follow-up replayed against signal-history with the\n // post-Fincept signal stack and converged on symmetric ±0.14 — shorts now\n // qualify at parity with longs because the smartMoney/perp signals carry\n // their own bearish edge that the prior asymmetry double-counted.\n \"ranging\": { strongBuy: 0.30, buy: 0.14, sell: -0.14, strongSell: -0.30 },\n \"high-volatility\":{ strongBuy: 0.50, buy: 0.30, sell: -0.30, strongSell: -0.50 },\n \"low-volatility\": { strongBuy: 0.40, buy: 0.20, sell: -0.20, strongSell: -0.40 },\n};\n\nexport function thresholdsForRegime(regime?: MarketRegime): ActionThresholds {\n if (!regime) return DEFAULT_THRESHOLDS;\n return REGIME_THRESHOLDS[regime] ?? DEFAULT_THRESHOLDS;\n}\n\n// ── Score Technical Signals ──\n\nexport function scoreTechnical(signals: TechnicalSignals): Signal {\n let value = 0;\n const details: string[] = [];\n let confidence = 0.5;\n\n // If most indicators are NaN, reduce confidence significantly\n const nanCount = [signals.rsi, signals.macd.histogram, signals.bb.width, signals.ema.ema50].filter(v => isNaN(v)).length;\n if (nanCount >= 3) {\n confidence = 0.15;\n details.push(\"Insufficient data for most indicators\");\n }\n\n // RSI scoring\n const rsi = signals.rsi;\n if (!isNaN(rsi)) {\n if (rsi < 30) {\n const rsiScore = 0.5 + 0.3 * ((30 - rsi) / 30); // 0.5 at RSI=30, 0.8 at RSI=0\n value += rsiScore;\n details.push(`RSI ${rsi.toFixed(1)} oversold (+${rsiScore.toFixed(2)})`);\n confidence += 0.1;\n } else if (rsi > 70) {\n const rsiScore = -(0.5 + 0.3 * ((rsi - 70) / 30)); // -0.5 at RSI=70, -0.8 at RSI=100\n value += rsiScore;\n details.push(`RSI ${rsi.toFixed(1)} overbought (${rsiScore.toFixed(2)})`);\n confidence += 0.1;\n } else {\n // Scale linearly: RSI 50 → 0, RSI 30 → +0.5, RSI 70 → -0.5\n const rsiScore = -((rsi - 50) / 20) * 0.5;\n value += rsiScore;\n details.push(`RSI ${rsi.toFixed(1)} (${rsiScore >= 0 ? \"+\" : \"\"}${rsiScore.toFixed(2)})`);\n }\n }\n\n // MACD histogram scoring\n const hist = signals.macd.histogram;\n if (!isNaN(hist)) {\n if (hist > 0) {\n value += 0.3;\n details.push(`MACD histogram positive (+0.30)`);\n } else if (hist < 0) {\n value -= 0.3;\n details.push(`MACD histogram negative (-0.30)`);\n }\n }\n\n // Bollinger Bands scoring\n if (signals.bb.squeeze) {\n // Squeeze = neutral, wait for breakout\n details.push(\"BB squeeze detected (neutral, awaiting breakout)\");\n } else {\n const lastClose = signals.ema.ema8; // Use ema8 as proxy for current price\n if (!isNaN(signals.bb.lower) && !isNaN(lastClose)) {\n const volSpike = signals.volume.ratio > 1.5;\n if (lastClose < signals.bb.lower && volSpike) {\n value += 0.5;\n details.push(\"Price below lower BB with volume spike (+0.50)\");\n confidence += 0.1;\n } else if (lastClose > signals.bb.upper && volSpike) {\n value -= 0.5;\n details.push(\"Price above upper BB with volume spike (-0.50)\");\n confidence += 0.1;\n }\n }\n }\n\n // EMA alignment scoring\n const { ema8, ema21, ema50, ema200 } = signals.ema;\n if (!isNaN(ema8) && !isNaN(ema21) && !isNaN(ema50) && !isNaN(ema200)) {\n if (ema8 > ema21 && ema21 > ema50 && ema50 > ema200) {\n value += 0.4;\n details.push(\"Bullish EMA alignment (8>21>50>200) (+0.40)\");\n confidence += 0.1;\n } else if (ema8 < ema21 && ema21 < ema50 && ema50 < ema200) {\n value -= 0.4;\n details.push(\"Bearish EMA alignment (8<21<50<200) (-0.40)\");\n confidence += 0.1;\n }\n }\n\n return {\n name: \"technical\",\n value: clamp(value),\n confidence: Math.min(confidence, 1.0),\n source: \"Technical Analysis\",\n details: details.join(\"; \"),\n };\n}\n\n// ── Score Sentiment ──\n\nexport function scoreSentiment(fearAndGreed: number, sentimentZScore?: number): Signal {\n let value = 0;\n const details: string[] = [];\n let confidence = 0.6;\n\n if (fearAndGreed < 15) {\n value = 1.0;\n details.push(`Extreme fear (F&G=${fearAndGreed}) → max contrarian buy`);\n confidence = 0.8;\n } else if (fearAndGreed < 25) {\n // Linear interpolation: F&G 15→+0.8, F&G 25→+0.5\n value = 0.8 - 0.3 * ((fearAndGreed - 15) / 10);\n details.push(`Fear (F&G=${fearAndGreed}) → contrarian buy (+${value.toFixed(2)})`);\n confidence = 0.7;\n } else if (fearAndGreed < 40) {\n // F&G 25→+0.3, F&G 40→+0.1\n value = 0.3 - 0.2 * ((fearAndGreed - 25) / 15);\n details.push(`Mild fear (F&G=${fearAndGreed}) → slight buy (+${value.toFixed(2)})`);\n } else if (fearAndGreed <= 60) {\n value = 0;\n details.push(`Neutral sentiment (F&G=${fearAndGreed})`);\n confidence = 0.4;\n } else if (fearAndGreed <= 75) {\n // F&G 60→-0.1, F&G 75→-0.5\n value = -0.1 - 0.4 * ((fearAndGreed - 60) / 15);\n details.push(`Greed (F&G=${fearAndGreed}) → contrarian sell (${value.toFixed(2)})`);\n } else {\n // F&G 75→-0.5, F&G 100→-1.0\n value = -0.5 - 0.5 * ((fearAndGreed - 75) / 25);\n details.push(`Extreme greed (F&G=${fearAndGreed}) → max contrarian sell (${value.toFixed(2)})`);\n confidence = 0.8;\n }\n\n // Z-score adjustment\n if (sentimentZScore !== undefined) {\n const adjustment = clamp(sentimentZScore * 0.1, -0.2, 0.2);\n value = clamp(value + adjustment);\n if (Math.abs(adjustment) > 0.05) {\n details.push(`Z-score adjustment: ${adjustment >= 0 ? \"+\" : \"\"}${adjustment.toFixed(2)}`);\n }\n }\n\n return {\n name: \"sentiment\",\n value: clamp(value),\n confidence,\n source: \"Market Sentiment\",\n details: details.join(\"; \"),\n };\n}\n\n// ── Score On-Chain ──\n\nexport function scoreOnChain(data: {\n exchangeNetFlow?: number;\n whaleAccumulating?: boolean;\n activeAddressesGrowth?: number;\n}): Signal {\n let value = 0;\n const details: string[] = [];\n let confidence = 0.4;\n\n if (data.exchangeNetFlow !== undefined) {\n if (data.exchangeNetFlow < 0) {\n // Negative net flow = tokens leaving exchanges = bullish\n value += 0.4;\n details.push(\"Negative exchange net flow (bullish)\");\n confidence += 0.1;\n } else if (data.exchangeNetFlow > 0) {\n value -= 0.4;\n details.push(\"Positive exchange net flow (bearish)\");\n confidence += 0.1;\n }\n }\n\n if (data.whaleAccumulating !== undefined) {\n if (data.whaleAccumulating) {\n value += 0.3;\n details.push(\"Whale accumulation detected\");\n confidence += 0.15;\n } else {\n value -= 0.3;\n details.push(\"Whale distribution detected\");\n confidence += 0.15;\n }\n }\n\n if (data.activeAddressesGrowth !== undefined) {\n const growth = data.activeAddressesGrowth;\n if (growth > 0.1) {\n value += 0.2;\n details.push(`Active addresses growing (${(growth * 100).toFixed(1)}%)`);\n } else if (growth < -0.1) {\n value -= 0.2;\n details.push(`Active addresses declining (${(growth * 100).toFixed(1)}%)`);\n }\n }\n\n if (details.length === 0) {\n details.push(\"No on-chain data available\");\n confidence = 0.1;\n }\n\n return {\n name: \"onchain\",\n value: clamp(value),\n confidence: Math.min(confidence, 1.0),\n source: \"On-Chain Analysis\",\n details: details.join(\"; \"),\n };\n}\n\n// ── Score Fundamentals ──\n\nexport function scoreFundamental(data: {\n tvlGrowthWeekly?: number;\n revenueGrowth?: number;\n mcapToTvl?: number;\n}): Signal {\n let value = 0;\n const details: string[] = [];\n let confidence = 0.4;\n\n if (data.tvlGrowthWeekly !== undefined) {\n const g = data.tvlGrowthWeekly;\n if (g > 0.1) {\n value += 0.4;\n details.push(`TVL growing ${(g * 100).toFixed(1)}% weekly`);\n confidence += 0.1;\n } else if (g < -0.1) {\n value -= 0.4;\n details.push(`TVL declining ${(g * 100).toFixed(1)}% weekly`);\n confidence += 0.1;\n }\n }\n\n if (data.revenueGrowth !== undefined) {\n const g = data.revenueGrowth;\n if (g > 0.1) {\n value += 0.3;\n details.push(`Revenue growing ${(g * 100).toFixed(1)}%`);\n } else if (g < -0.1) {\n value -= 0.3;\n details.push(`Revenue declining ${(g * 100).toFixed(1)}%`);\n }\n }\n\n if (data.mcapToTvl !== undefined) {\n const ratio = data.mcapToTvl;\n if (ratio < 1.0) {\n value += 0.3;\n details.push(`Mcap/TVL ratio ${ratio.toFixed(2)} (undervalued)`);\n confidence += 0.1;\n } else if (ratio > 5.0) {\n value -= 0.3;\n details.push(`Mcap/TVL ratio ${ratio.toFixed(2)} (overvalued)`);\n confidence += 0.1;\n }\n }\n\n if (details.length === 0) {\n details.push(\"No fundamental data available\");\n confidence = 0.1;\n }\n\n return {\n name: \"fundamental\",\n value: clamp(value),\n confidence: Math.min(confidence, 1.0),\n source: \"Fundamental Analysis\",\n details: details.join(\"; \"),\n };\n}\n\n// ── Score Events ──\n\nexport function scoreEvent(data: {\n unlockPercent?: number;\n daysUntilUnlock?: number;\n positiveEvent?: boolean;\n}): Signal {\n let value = 0;\n const details: string[] = [];\n let confidence = 0.3;\n\n if (data.unlockPercent !== undefined && data.daysUntilUnlock !== undefined) {\n if (data.unlockPercent > 5 && data.daysUntilUnlock < 30) {\n // Large upcoming unlock = bearish\n const severity = Math.min(data.unlockPercent / 20, 1.0);\n value -= severity * 0.8;\n details.push(\n `Token unlock: ${data.unlockPercent.toFixed(1)}% in ${data.daysUntilUnlock} days (bearish)`,\n );\n confidence = 0.7;\n } else if (data.unlockPercent < 2) {\n details.push(\"Minor unlock, negligible impact\");\n }\n }\n\n if (data.positiveEvent !== undefined) {\n if (data.positiveEvent) {\n value += 0.4;\n details.push(\"Positive catalyst event\");\n confidence += 0.2;\n } else {\n value -= 0.4;\n details.push(\"Negative catalyst event\");\n confidence += 0.2;\n }\n }\n\n if (details.length === 0) {\n details.push(\"No event data available\");\n confidence = 0.1;\n }\n\n return {\n name: \"event\",\n value: clamp(value),\n confidence: Math.min(confidence, 1.0),\n source: \"Event Analysis\",\n details: details.join(\"; \"),\n };\n}\n\n// ── Combine All Signals Into Trade Decision ──\n\n/** Lagging technical indicators whose weight is dampened during momentum moves. */\nconst LAGGING_TECHNICAL_SIGNALS = new Set(['technical']);\n\n/** Signals whose weight is dampened when they oppose the regime direction.\n * Kronos and whaleIntent can stay bearish for extended periods during a\n * trending-up regime — dampening prevents them from suppressing all long\n * entries. They keep full weight when aligned with the trend. */\nconst COUNTER_TREND_DAMPENED = new Set(['kronosVolForecast', 'whaleIntent']);\n/** Minimum absolute signal value to trigger counter-trend dampening. */\nconst COUNTER_TREND_THRESHOLD = 0.05;\n\n/** Signals excluded from scoring — still logged for audit.\n * Forward-return analysis (Apr 27, 50 trades):\n * - crossSectionalMomentum: INVERTED (-0.123 edge, bullish before dumps)\n * - multiTimeframe: weak inverted (-0.080 edge)\n * - btcNetworkHealth: zero variance (always +0.200)\n * - socialVolume: 85% zero, no forward edge\n * - fundingRate: 88% perma-bearish, no directional info\n * - tradingviewSignal: 84% dead\n * - momentum, hyperliquidFlow, event: noise / dead */\nconst EXCLUDED_SCORING_SIGNALS = new Set([\n 'tradingviewSignal',\n 'momentum',\n 'fundingRate',\n 'hyperliquidFlow',\n 'event',\n 'crossSectionalMomentum',\n 'multiTimeframe',\n 'btcNetworkHealth',\n 'socialVolume',\n 'tokenUnlock',\n 'tvlMomentum',\n]);\n\n/** Signal name → weight category mapping. */\nconst SIGNAL_CATEGORY_MAP: Record<string, keyof ScoringWeights> = {\n technical: \"technical\",\n sentiment: \"sentiment\",\n onchain: \"onchain\",\n fundamental: \"fundamental\",\n event: \"event\",\n smartMoney: \"smartMoney\",\n flowIntelligence: \"smartMoney\", // shares smartMoney category — auto weight-split with perp signal\n\n // Strategy signal mappings to categories (only active strategies)\n breakoutOnChain: \"technical\",\n multiTimeframe: \"technical\",\n crossSectionalMomentum: \"technical\",\n tradingviewSignal: \"technical\",\n dexFlow: \"onchain\",\n fundingRate: \"onchain\",\n hyperliquidFlow: \"onchain\",\n sentimentContrarian: \"sentiment\",\n btcNetworkHealth: \"technical\",\n predictionMarket: \"event\",\n socialVolume: \"sentiment\",\n kronosVolForecast: \"technical\",\n narrativeVacuum: \"onchain\",\n whaleIntent: \"smartMoney\",\n};\n\n/** Categories that rely on x402 paid data (Nansen, Messari). */\nconst X402_CATEGORIES: Set<keyof ScoringWeights> = new Set([\"smartMoney\", \"event\"]);\n\nexport function computeTradeDecision(\n signals: Signal[],\n weights?: ScoringWeights,\n regimeAdjustments?: Record<string, number>,\n correlationCheck?: CorrelationCheck,\n regime?: MarketRegime,\n x402Available?: boolean,\n): TradeDecision {\n const w = weights ?? DEFAULT_WEIGHTS;\n const thresholds = thresholdsForRegime(regime);\n\n // FIX 1: When x402 was configured but wallet is unfunded, exclude\n // x402-dependent categories (smartMoney, event) so their zero-value signals\n // don't dilute the aggregate. Only when x402Available is explicitly false\n // (meaning x402 was intended but failed) — undefined means x402 was never\n // configured, so no exclusion (the agent may have those signals from other\n // sources, e.g. backtest or manual injection).\n const excludedCategories = new Set<keyof ScoringWeights>();\n if (x402Available === false) {\n for (const cat of X402_CATEGORIES) {\n if (w[cat] > 0) excludedCategories.add(cat);\n }\n }\n\n // FIX 3: Normalize per-category weights.\n // Count how many signals fire per category, then split category weight among them.\n const categoryCounts: Record<string, number> = {};\n for (const signal of signals) {\n if (EXCLUDED_SCORING_SIGNALS.has(signal.name)) continue;\n if (signal._weightOverride !== undefined) continue; // manual overrides skip normalization\n const category = SIGNAL_CATEGORY_MAP[signal.name];\n if (!category || excludedCategories.has(category)) continue;\n categoryCounts[category] = (categoryCounts[category] ?? 0) + 1;\n }\n\n // Weighted sum\n let totalWeight = 0;\n let weightedSum = 0;\n let weightedConfidence = 0;\n\n for (const signal of signals) {\n if (EXCLUDED_SCORING_SIGNALS.has(signal.name)) continue;\n // Determine signal weight\n let signalWeight: number;\n\n if (signal._weightOverride !== undefined) {\n signalWeight = signal._weightOverride;\n } else {\n const category = SIGNAL_CATEGORY_MAP[signal.name];\n\n // FIX 1: skip signals in excluded x402 categories\n if (category && excludedCategories.has(category)) continue;\n\n const categoryWeight = category ? w[category] : 0.1;\n const count = category ? (categoryCounts[category] ?? 1) : 1;\n // FIX 3: split category weight among all signals in that category\n signalWeight = categoryWeight / count;\n }\n\n // Apply regime adjustment if available\n let adjustedValue = signal.value;\n let adjustedConfidence = signal.confidence;\n\n if (regimeAdjustments && signal.name in regimeAdjustments) {\n const adjustment = regimeAdjustments[signal.name]!;\n adjustedValue *= adjustment;\n adjustedConfidence *= adjustment;\n }\n\n // Dampen lagging technical indicators during momentum moves.\n // RSI/MACD/EMA read bearish alignment during the first hours of a pump\n // because they lag by construction (14-period RSI, 26-period MACD, 50/200 EMA).\n // This cancels real-time bullish signals — ETH scored 0.00 during a +7.8% rally\n // because scoreTechnical() was reading stale bearish MACD/EMA.\n //\n // When the regime is a momentum override (trending-up/down), cut the weight\n // of lagging technical signals by 50%. The momentum signal (which is NOT lagged)\n // and breakoutOnChain (which uses recent price action) keep their full weight.\n // LAGGING_TECHNICAL_SIGNALS hoisted to module level for GC efficiency\n if (regime && (regime === 'trending-up' || regime === 'trending-down')\n && LAGGING_TECHNICAL_SIGNALS.has(signal.name)) {\n signalWeight *= 0.5;\n }\n\n // Dampen counter-trend signals during strong regime moves.\n // In trending-up: Kronos bearish prediction, high social attention (contrarian\n // bearish), and whale short positioning can persist for days while price\n // keeps climbing — dampening prevents them from suppressing all long entries.\n // In trending-down: same signals dampened when they're bullish.\n // Signals ALIGNED with the trend keep full weight.\n if (regime && COUNTER_TREND_DAMPENED.has(signal.name)) {\n const isCounterTrend =\n (regime === 'trending-up' && adjustedValue < -COUNTER_TREND_THRESHOLD) ||\n (regime === 'trending-down' && adjustedValue > COUNTER_TREND_THRESHOLD);\n if (isCounterTrend) {\n signalWeight *= 0.3; // 70% reduction when opposing the trend\n }\n }\n\n // Skip zero-value / near-zero-confidence signals from the denominator.\n // Signals like fundamental=0 (CG circuit-breaker'd), sentimentContrarian=0\n // (F&G in neutral zone), dexFlow=0 (no DEX activity) still carry their\n // category weight in the denominator, diluting the composite toward zero.\n // A token with 4 strong bullish signals at +0.30 and 6 zero signals scored\n // +0.05 instead of +0.30 because the zeros added ~60% to totalWeight.\n // Only exclude truly dead signals (value=0 AND confidence <= 0.15) — a\n // signal that deliberately returns value=0 at high confidence (e.g. \"I\n // looked and there's nothing\") should still vote neutral.\n if (adjustedValue === 0 && adjustedConfidence <= 0.15) {\n continue;\n }\n\n weightedSum += adjustedValue * signalWeight;\n weightedConfidence += adjustedConfidence * signalWeight;\n totalWeight += signalWeight;\n }\n\n let score = totalWeight > 0 ? weightedSum / totalWeight : 0;\n const confidence = totalWeight > 0 ? weightedConfidence / totalWeight : 0;\n\n // ── Convergence bonus ──\n // When multiple independent categories agree on direction, amplify the score.\n // The weighted average treats disagreement and agreement symmetrically — a\n // 5/6 bullish consensus scores the same as if those 5 categories had smaller\n // values. In reality, broad agreement across uncorrelated sources (technical +\n // sentiment + on-chain + funding) is stronger evidence than any single source\n // at high conviction.\n //\n // On the Apr 13-14 BTC pump: 4-5 categories were bullish but the score\n // capped at 0.27. With convergence bonus: 0.27 × 1.15 = 0.31 → fires BUY.\n if (Math.abs(score) > 0.01) {\n const scoreSign = Math.sign(score);\n // Compute net direction per active category.\n // Use dampened values for lagging technical signals so they don't\n // inflate convergence count when voting against the momentum direction.\n const categoryNetDirection = new Map<string, number>();\n for (const signal of signals) {\n if (EXCLUDED_SCORING_SIGNALS.has(signal.name)) continue;\n const category = SIGNAL_CATEGORY_MAP[signal.name];\n if (!category || excludedCategories.has(category)) continue;\n if (signal._weightOverride !== undefined) continue;\n let voteValue = signal.value;\n // Lagging signals during trending regimes: use dampened value for vote\n if (regime && (regime === 'trending-up' || regime === 'trending-down')\n && LAGGING_TECHNICAL_SIGNALS.has(signal.name)) {\n voteValue *= 0.5;\n }\n // Counter-trend signals: mirror the 0.3x dampening applied in the\n // weighted score so a signal that contributes 30% of its weight does\n // not get to vote at full strength in the convergence count.\n if (regime && COUNTER_TREND_DAMPENED.has(signal.name)) {\n const isCounterTrend =\n (regime === 'trending-up' && voteValue < -COUNTER_TREND_THRESHOLD) ||\n (regime === 'trending-down' && voteValue > COUNTER_TREND_THRESHOLD);\n if (isCounterTrend) voteValue *= 0.3;\n }\n const current = categoryNetDirection.get(category) ?? 0;\n categoryNetDirection.set(category, current + voteValue);\n }\n // Count categories that agree with the aggregate direction\n let agreeing = 0;\n let totalActive = 0;\n for (const [, netValue] of categoryNetDirection) {\n totalActive++;\n if (Math.sign(netValue) === scoreSign) agreeing++;\n }\n // Bonus kicks in at 4+ agreeing categories out of at least 4 active.\n // Scale: 4/N → 1.15x, 5/N → 1.30x, 6/N → 1.45x. Capped at 1.45x.\n if (agreeing >= 4 && totalActive >= 4) {\n const bonus = 1.0 + 0.15 * (agreeing - 3);\n score *= Math.min(bonus, 1.45);\n }\n }\n\n // Apply correlation-aware adjustment if provided\n // BTC bearish → suppress longs, boost shorts\n // BTC bullish → boost longs, suppress shorts\n if (correlationCheck) {\n if (correlationCheck.btcBias === \"bearish\" && score > 0) {\n // Suppress long signals when BTC is bearish (factor < 1)\n score *= correlationCheck.suppressionFactor;\n } else if (correlationCheck.btcBias === \"bearish\" && score < 0) {\n // Boost short signals when BTC is bearish\n score *= (1 + Math.abs(correlationCheck.btcScore) * 0.3);\n } else if (correlationCheck.btcBias === \"bullish\" && score > 0) {\n // Boost long signals when BTC is bullish\n score *= (1 + Math.abs(correlationCheck.btcScore) * 0.3);\n } else if (correlationCheck.btcBias === \"bullish\" && score < 0) {\n // Suppress short signals when BTC is bullish (factor < 1)\n score *= correlationCheck.suppressionFactor;\n }\n\n score = Math.max(-1, Math.min(1, score));\n }\n\n // Unconditional clamp — convergence bonus and correlation boost can both\n // push score beyond [-1, 1]. Clamp was previously only inside the\n // correlationCheck block; scores flowed unclamped when no correlation\n // data was available.\n score = Math.max(-1, Math.min(1, score));\n\n // Determine action using regime-conditional thresholds\n let action: TradeDecision[\"action\"];\n // Symmetric >= / <= on both sides — exactly hitting a threshold counts as\n // crossing it. Score == buy → BUY. Score == sell → SELL. Score ==\n // strongSell → STRONG_SELL. This replaces the old mixed > / >= scheme\n // flagged in code review as asymmetric.\n if (score >= thresholds.strongBuy) action = \"STRONG_BUY\";\n else if (score >= thresholds.buy) action = \"BUY\";\n else if (score <= thresholds.strongSell) action = \"STRONG_SELL\";\n else if (score <= thresholds.sell) action = \"SELL\";\n else action = \"HOLD\";\n\n const reasoning = signals.map((s) => `[${s.source}] ${s.details}`).join(\"\\n\");\n\n return {\n action,\n score,\n signals,\n reasoning,\n confidence,\n timestamp: Date.now(),\n thresholds,\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -10,9 +10,9 @@ import {
|
|
|
10
10
|
unstickWallet,
|
|
11
11
|
waitForReceipt,
|
|
12
12
|
writeContractWithRetry
|
|
13
|
-
} from "./chunk-
|
|
14
|
-
import "./chunk-
|
|
15
|
-
import "./chunk-
|
|
13
|
+
} from "./chunk-XDBRKW7I.js";
|
|
14
|
+
import "./chunk-2LRC7I33.js";
|
|
15
|
+
import "./chunk-2W4KGGPU.js";
|
|
16
16
|
export {
|
|
17
17
|
detectStuckNonce,
|
|
18
18
|
estimateFeesWithBuffer,
|
|
@@ -26,4 +26,4 @@ export {
|
|
|
26
26
|
waitForReceipt,
|
|
27
27
|
writeContractWithRetry
|
|
28
28
|
};
|
|
29
|
-
//# sourceMappingURL=client-
|
|
29
|
+
//# sourceMappingURL=client-UHHCB6EZ.js.map
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
cacheSwapRoute,
|
|
5
5
|
clearSwapRoutes,
|
|
6
6
|
getAgentId,
|
|
7
|
+
getAnthropicApiKey,
|
|
7
8
|
getCachedGroupId,
|
|
8
9
|
getCachedSwapRoute,
|
|
9
10
|
getChainContracts,
|
|
@@ -18,6 +19,7 @@ import {
|
|
|
18
19
|
loadConfig,
|
|
19
20
|
saveConfig,
|
|
20
21
|
setAgentId,
|
|
22
|
+
setAnthropicApiKey,
|
|
21
23
|
setChainContract,
|
|
22
24
|
setConfigRpcUrl,
|
|
23
25
|
setNotifyTo,
|
|
@@ -25,13 +27,14 @@ import {
|
|
|
25
27
|
setPrivateKey,
|
|
26
28
|
setUniswapApiKey,
|
|
27
29
|
setVeniceApiKey
|
|
28
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-2W4KGGPU.js";
|
|
29
31
|
export {
|
|
30
32
|
addSyndicate,
|
|
31
33
|
cacheGroupId,
|
|
32
34
|
cacheSwapRoute,
|
|
33
35
|
clearSwapRoutes,
|
|
34
36
|
getAgentId,
|
|
37
|
+
getAnthropicApiKey,
|
|
35
38
|
getCachedGroupId,
|
|
36
39
|
getCachedSwapRoute,
|
|
37
40
|
getChainContracts,
|
|
@@ -46,6 +49,7 @@ export {
|
|
|
46
49
|
loadConfig,
|
|
47
50
|
saveConfig,
|
|
48
51
|
setAgentId,
|
|
52
|
+
setAnthropicApiKey,
|
|
49
53
|
setChainContract,
|
|
50
54
|
setConfigRpcUrl,
|
|
51
55
|
setNotifyTo,
|
|
@@ -54,4 +58,4 @@ export {
|
|
|
54
58
|
setUniswapApiKey,
|
|
55
59
|
setVeniceApiKey
|
|
56
60
|
};
|
|
57
|
-
//# sourceMappingURL=config-
|
|
61
|
+
//# sourceMappingURL=config-REASKDIK.js.map
|
|
@@ -17,11 +17,11 @@ import {
|
|
|
17
17
|
revokeAttestation,
|
|
18
18
|
revokeJoinRequest,
|
|
19
19
|
stripReferrerPrefix
|
|
20
|
-
} from "./chunk-
|
|
21
|
-
import "./chunk-
|
|
22
|
-
import "./chunk-
|
|
23
|
-
import "./chunk-
|
|
24
|
-
import "./chunk-
|
|
20
|
+
} from "./chunk-E6LH2FJ6.js";
|
|
21
|
+
import "./chunk-FWC57PT7.js";
|
|
22
|
+
import "./chunk-XDBRKW7I.js";
|
|
23
|
+
import "./chunk-2LRC7I33.js";
|
|
24
|
+
import "./chunk-2W4KGGPU.js";
|
|
25
25
|
import "./chunk-D77JGXIV.js";
|
|
26
26
|
export {
|
|
27
27
|
createApproval,
|
|
@@ -43,4 +43,4 @@ export {
|
|
|
43
43
|
revokeJoinRequest,
|
|
44
44
|
stripReferrerPrefix
|
|
45
45
|
};
|
|
46
|
-
//# sourceMappingURL=eas-
|
|
46
|
+
//# sourceMappingURL=eas-PEEWGSAO.js.map
|