polymarket-trader-mcp 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/.env.example +20 -0
  2. package/README.md +158 -0
  3. package/dist/db/queries.d.ts +93 -0
  4. package/dist/db/queries.d.ts.map +1 -0
  5. package/dist/db/queries.js +161 -0
  6. package/dist/db/queries.js.map +1 -0
  7. package/dist/db/schema.d.ts +3 -0
  8. package/dist/db/schema.d.ts.map +1 -0
  9. package/dist/db/schema.js +88 -0
  10. package/dist/db/schema.js.map +1 -0
  11. package/dist/index.d.ts +3 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +124 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/services/backtester.d.ts +30 -0
  16. package/dist/services/backtester.d.ts.map +1 -0
  17. package/dist/services/backtester.js +96 -0
  18. package/dist/services/backtester.js.map +1 -0
  19. package/dist/services/budget-manager.d.ts +16 -0
  20. package/dist/services/budget-manager.d.ts.map +1 -0
  21. package/dist/services/budget-manager.js +42 -0
  22. package/dist/services/budget-manager.js.map +1 -0
  23. package/dist/services/conviction-scorer.d.ts +14 -0
  24. package/dist/services/conviction-scorer.d.ts.map +1 -0
  25. package/dist/services/conviction-scorer.js +88 -0
  26. package/dist/services/conviction-scorer.js.map +1 -0
  27. package/dist/services/leaderboard.d.ts +28 -0
  28. package/dist/services/leaderboard.d.ts.map +1 -0
  29. package/dist/services/leaderboard.js +45 -0
  30. package/dist/services/leaderboard.js.map +1 -0
  31. package/dist/services/market-filter.d.ts +19 -0
  32. package/dist/services/market-filter.d.ts.map +1 -0
  33. package/dist/services/market-filter.js +50 -0
  34. package/dist/services/market-filter.js.map +1 -0
  35. package/dist/services/market-resolver.d.ts +10 -0
  36. package/dist/services/market-resolver.d.ts.map +1 -0
  37. package/dist/services/market-resolver.js +28 -0
  38. package/dist/services/market-resolver.js.map +1 -0
  39. package/dist/services/position-tracker.d.ts +13 -0
  40. package/dist/services/position-tracker.d.ts.map +1 -0
  41. package/dist/services/position-tracker.js +152 -0
  42. package/dist/services/position-tracker.js.map +1 -0
  43. package/dist/services/price-history.d.ts +18 -0
  44. package/dist/services/price-history.d.ts.map +1 -0
  45. package/dist/services/price-history.js +46 -0
  46. package/dist/services/price-history.js.map +1 -0
  47. package/dist/services/price-service.d.ts +14 -0
  48. package/dist/services/price-service.d.ts.map +1 -0
  49. package/dist/services/price-service.js +62 -0
  50. package/dist/services/price-service.js.map +1 -0
  51. package/dist/services/smart-flow.d.ts +22 -0
  52. package/dist/services/smart-flow.d.ts.map +1 -0
  53. package/dist/services/smart-flow.js +91 -0
  54. package/dist/services/smart-flow.js.map +1 -0
  55. package/dist/services/trade-executor.d.ts +44 -0
  56. package/dist/services/trade-executor.d.ts.map +1 -0
  57. package/dist/services/trade-executor.js +153 -0
  58. package/dist/services/trade-executor.js.map +1 -0
  59. package/dist/services/trader-analyzer.d.ts +19 -0
  60. package/dist/services/trader-analyzer.d.ts.map +1 -0
  61. package/dist/services/trader-analyzer.js +100 -0
  62. package/dist/services/trader-analyzer.js.map +1 -0
  63. package/dist/services/wallet-monitor.d.ts +51 -0
  64. package/dist/services/wallet-monitor.d.ts.map +1 -0
  65. package/dist/services/wallet-monitor.js +192 -0
  66. package/dist/services/wallet-monitor.js.map +1 -0
  67. package/dist/services/wta-discovery.d.ts +29 -0
  68. package/dist/services/wta-discovery.d.ts.map +1 -0
  69. package/dist/services/wta-discovery.js +155 -0
  70. package/dist/services/wta-discovery.js.map +1 -0
  71. package/dist/tools/analyze-trader.d.ts +6 -0
  72. package/dist/tools/analyze-trader.d.ts.map +1 -0
  73. package/dist/tools/analyze-trader.js +28 -0
  74. package/dist/tools/analyze-trader.js.map +1 -0
  75. package/dist/tools/backtest-trader.d.ts +7 -0
  76. package/dist/tools/backtest-trader.d.ts.map +1 -0
  77. package/dist/tools/backtest-trader.js +39 -0
  78. package/dist/tools/backtest-trader.js.map +1 -0
  79. package/dist/tools/buy.d.ts +14 -0
  80. package/dist/tools/buy.d.ts.map +1 -0
  81. package/dist/tools/buy.js +48 -0
  82. package/dist/tools/buy.js.map +1 -0
  83. package/dist/tools/cancel-orders.d.ts +5 -0
  84. package/dist/tools/cancel-orders.d.ts.map +1 -0
  85. package/dist/tools/cancel-orders.js +26 -0
  86. package/dist/tools/cancel-orders.js.map +1 -0
  87. package/dist/tools/check-exits.d.ts +3 -0
  88. package/dist/tools/check-exits.d.ts.map +1 -0
  89. package/dist/tools/check-exits.js +14 -0
  90. package/dist/tools/check-exits.js.map +1 -0
  91. package/dist/tools/check-market.d.ts +8 -0
  92. package/dist/tools/check-market.d.ts.map +1 -0
  93. package/dist/tools/check-market.js +31 -0
  94. package/dist/tools/check-market.js.map +1 -0
  95. package/dist/tools/close-position.d.ts +8 -0
  96. package/dist/tools/close-position.d.ts.map +1 -0
  97. package/dist/tools/close-position.js +26 -0
  98. package/dist/tools/close-position.js.map +1 -0
  99. package/dist/tools/discover-flow.d.ts +8 -0
  100. package/dist/tools/discover-flow.d.ts.map +1 -0
  101. package/dist/tools/discover-flow.js +36 -0
  102. package/dist/tools/discover-flow.js.map +1 -0
  103. package/dist/tools/discover-markets.d.ts +14 -0
  104. package/dist/tools/discover-markets.d.ts.map +1 -0
  105. package/dist/tools/discover-markets.js +67 -0
  106. package/dist/tools/discover-markets.js.map +1 -0
  107. package/dist/tools/discover-traders.d.ts +15 -0
  108. package/dist/tools/discover-traders.d.ts.map +1 -0
  109. package/dist/tools/discover-traders.js +64 -0
  110. package/dist/tools/discover-traders.js.map +1 -0
  111. package/dist/tools/discover-wta.d.ts +7 -0
  112. package/dist/tools/discover-wta.d.ts.map +1 -0
  113. package/dist/tools/discover-wta.js +26 -0
  114. package/dist/tools/discover-wta.js.map +1 -0
  115. package/dist/tools/get-balance.d.ts +4 -0
  116. package/dist/tools/get-balance.d.ts.map +1 -0
  117. package/dist/tools/get-balance.js +21 -0
  118. package/dist/tools/get-balance.js.map +1 -0
  119. package/dist/tools/get-dashboard.d.ts +5 -0
  120. package/dist/tools/get-dashboard.d.ts.map +1 -0
  121. package/dist/tools/get-dashboard.js +57 -0
  122. package/dist/tools/get-dashboard.js.map +1 -0
  123. package/dist/tools/get-portfolio.d.ts +3 -0
  124. package/dist/tools/get-portfolio.d.ts.map +1 -0
  125. package/dist/tools/get-portfolio.js +45 -0
  126. package/dist/tools/get-portfolio.js.map +1 -0
  127. package/dist/tools/get-positions.d.ts +11 -0
  128. package/dist/tools/get-positions.d.ts.map +1 -0
  129. package/dist/tools/get-positions.js +34 -0
  130. package/dist/tools/get-positions.js.map +1 -0
  131. package/dist/tools/get-price-history.d.ts +13 -0
  132. package/dist/tools/get-price-history.d.ts.map +1 -0
  133. package/dist/tools/get-price-history.js +55 -0
  134. package/dist/tools/get-price-history.js.map +1 -0
  135. package/dist/tools/get-price.d.ts +8 -0
  136. package/dist/tools/get-price.d.ts.map +1 -0
  137. package/dist/tools/get-price.js +37 -0
  138. package/dist/tools/get-price.js.map +1 -0
  139. package/dist/tools/get-trade-history.d.ts +10 -0
  140. package/dist/tools/get-trade-history.d.ts.map +1 -0
  141. package/dist/tools/get-trade-history.js +32 -0
  142. package/dist/tools/get-trade-history.js.map +1 -0
  143. package/dist/tools/get-trader-positions.d.ts +7 -0
  144. package/dist/tools/get-trader-positions.d.ts.map +1 -0
  145. package/dist/tools/get-trader-positions.js +27 -0
  146. package/dist/tools/get-trader-positions.js.map +1 -0
  147. package/dist/tools/go-live.d.ts +8 -0
  148. package/dist/tools/go-live.d.ts.map +1 -0
  149. package/dist/tools/go-live.js +22 -0
  150. package/dist/tools/go-live.js.map +1 -0
  151. package/dist/tools/list-watchlist.d.ts +3 -0
  152. package/dist/tools/list-watchlist.d.ts.map +1 -0
  153. package/dist/tools/list-watchlist.js +16 -0
  154. package/dist/tools/list-watchlist.js.map +1 -0
  155. package/dist/tools/log-cycle.d.ts +24 -0
  156. package/dist/tools/log-cycle.d.ts.map +1 -0
  157. package/dist/tools/log-cycle.js +23 -0
  158. package/dist/tools/log-cycle.js.map +1 -0
  159. package/dist/tools/place-stink-bid.d.ts +10 -0
  160. package/dist/tools/place-stink-bid.d.ts.map +1 -0
  161. package/dist/tools/place-stink-bid.js +53 -0
  162. package/dist/tools/place-stink-bid.js.map +1 -0
  163. package/dist/tools/rebalance.d.ts +9 -0
  164. package/dist/tools/rebalance.d.ts.map +1 -0
  165. package/dist/tools/rebalance.js +79 -0
  166. package/dist/tools/rebalance.js.map +1 -0
  167. package/dist/tools/score-trader.d.ts +6 -0
  168. package/dist/tools/score-trader.d.ts.map +1 -0
  169. package/dist/tools/score-trader.js +28 -0
  170. package/dist/tools/score-trader.js.map +1 -0
  171. package/dist/tools/search-markets.d.ts +8 -0
  172. package/dist/tools/search-markets.d.ts.map +1 -0
  173. package/dist/tools/search-markets.js +44 -0
  174. package/dist/tools/search-markets.js.map +1 -0
  175. package/dist/tools/sell.d.ts +10 -0
  176. package/dist/tools/sell.d.ts.map +1 -0
  177. package/dist/tools/sell.js +46 -0
  178. package/dist/tools/sell.js.map +1 -0
  179. package/dist/tools/set-config.d.ts +13 -0
  180. package/dist/tools/set-config.d.ts.map +1 -0
  181. package/dist/tools/set-config.js +24 -0
  182. package/dist/tools/set-config.js.map +1 -0
  183. package/dist/tools/set-exit-rules.d.ts +9 -0
  184. package/dist/tools/set-exit-rules.d.ts.map +1 -0
  185. package/dist/tools/set-exit-rules.js +39 -0
  186. package/dist/tools/set-exit-rules.js.map +1 -0
  187. package/dist/tools/start-monitor.d.ts +9 -0
  188. package/dist/tools/start-monitor.d.ts.map +1 -0
  189. package/dist/tools/start-monitor.js +24 -0
  190. package/dist/tools/start-monitor.js.map +1 -0
  191. package/dist/tools/stop-monitor.d.ts +3 -0
  192. package/dist/tools/stop-monitor.d.ts.map +1 -0
  193. package/dist/tools/stop-monitor.js +14 -0
  194. package/dist/tools/stop-monitor.js.map +1 -0
  195. package/dist/tools/watch-market.d.ts +15 -0
  196. package/dist/tools/watch-market.d.ts.map +1 -0
  197. package/dist/tools/watch-market.js +68 -0
  198. package/dist/tools/watch-market.js.map +1 -0
  199. package/dist/tools/watch-wallet.d.ts +13 -0
  200. package/dist/tools/watch-wallet.d.ts.map +1 -0
  201. package/dist/tools/watch-wallet.js +30 -0
  202. package/dist/tools/watch-wallet.js.map +1 -0
  203. package/dist/utils/config.d.ts +22 -0
  204. package/dist/utils/config.d.ts.map +1 -0
  205. package/dist/utils/config.js +40 -0
  206. package/dist/utils/config.js.map +1 -0
  207. package/dist/utils/fetch.d.ts +5 -0
  208. package/dist/utils/fetch.d.ts.map +1 -0
  209. package/dist/utils/fetch.js +57 -0
  210. package/dist/utils/fetch.js.map +1 -0
  211. package/dist/utils/license.d.ts +4 -0
  212. package/dist/utils/license.d.ts.map +1 -0
  213. package/dist/utils/license.js +49 -0
  214. package/dist/utils/license.js.map +1 -0
  215. package/dist/utils/logger.d.ts +10 -0
  216. package/dist/utils/logger.d.ts.map +1 -0
  217. package/dist/utils/logger.js +23 -0
  218. package/dist/utils/logger.js.map +1 -0
  219. package/dist/utils/tool-wrapper.d.ts +10 -0
  220. package/dist/utils/tool-wrapper.d.ts.map +1 -0
  221. package/dist/utils/tool-wrapper.js +15 -0
  222. package/dist/utils/tool-wrapper.js.map +1 -0
  223. package/package.json +50 -0
@@ -0,0 +1,155 @@
1
+ import { log } from "../utils/logger.js";
2
+ import { fetchWithRetry } from "../utils/fetch.js";
3
+ const ESPN_WTA_URL = "https://site.api.espn.com/apis/site/v2/sports/tennis/wta/scoreboard";
4
+ const GAMMA_EVENTS_URL = "https://gamma-api.polymarket.com/events";
5
+ const CLOB_MARKETS_URL = "https://clob.polymarket.com/markets";
6
+ /** Fetch today's WTA matches from ESPN */
7
+ export async function getWtaSchedule() {
8
+ try {
9
+ const res = await fetchWithRetry(ESPN_WTA_URL);
10
+ if (!res.ok)
11
+ return [];
12
+ const data = await res.json();
13
+ const matches = [];
14
+ for (const event of data.events ?? []) {
15
+ const competition = event.competitions?.[0];
16
+ if (!competition)
17
+ continue;
18
+ const competitors = competition.competitors ?? [];
19
+ const players = competitors.map((c) => {
20
+ const athlete = c.athlete ?? {};
21
+ return athlete.shortName || athlete.displayName || "";
22
+ }).filter(Boolean);
23
+ if (players.length < 2)
24
+ continue;
25
+ matches.push({
26
+ player1: players[0],
27
+ player2: players[1],
28
+ tournament: event.name ?? "",
29
+ status: event.status?.type?.name ?? "UNKNOWN",
30
+ startTime: event.date ?? "",
31
+ });
32
+ }
33
+ log("info", `ESPN WTA: ${matches.length} matches found`);
34
+ return matches;
35
+ }
36
+ catch (err) {
37
+ log("error", `ESPN WTA API error: ${err}`);
38
+ return [];
39
+ }
40
+ }
41
+ /** Generate Polymarket slug candidates from player names */
42
+ export function generateSlugs(player1, player2, date) {
43
+ const normalize = (name) => {
44
+ // Take last name, lowercase, remove accents, truncate to 6-8 chars
45
+ const parts = name.split(/[\s.]+/);
46
+ const lastName = parts[parts.length - 1]
47
+ .toLowerCase()
48
+ .normalize("NFD")
49
+ .replace(/[\u0300-\u036f]/g, "")
50
+ .replace(/[^a-z]/g, "");
51
+ return lastName.slice(0, 7);
52
+ };
53
+ const p1 = normalize(player1);
54
+ const p2 = normalize(player2);
55
+ // Polymarket uses both orderings
56
+ return [
57
+ `wta-${p1}-${p2}-${date}`,
58
+ `wta-${p2}-${p1}-${date}`,
59
+ ];
60
+ }
61
+ /** Lookup a WTA event on Polymarket by slug */
62
+ async function lookupEvent(slug) {
63
+ try {
64
+ const url = `${GAMMA_EVENTS_URL}?slug=${slug}`;
65
+ const res = await fetchWithRetry(url);
66
+ if (!res.ok)
67
+ return null;
68
+ const data = await res.json();
69
+ if (!Array.isArray(data) || data.length === 0)
70
+ return null;
71
+ return data[0];
72
+ }
73
+ catch {
74
+ return null;
75
+ }
76
+ }
77
+ /** Get detailed market info from CLOB API */
78
+ async function getClobMarket(conditionId) {
79
+ try {
80
+ const url = `${CLOB_MARKETS_URL}/${conditionId}`;
81
+ const res = await fetchWithRetry(url);
82
+ if (!res.ok)
83
+ return null;
84
+ return await res.json();
85
+ }
86
+ catch {
87
+ return null;
88
+ }
89
+ }
90
+ /** Discover WTA markets on Polymarket for today's matches */
91
+ export async function discoverWtaMarkets(discountPct = 30) {
92
+ const schedule = await getWtaSchedule();
93
+ if (schedule.length === 0) {
94
+ log("info", "No WTA matches scheduled today");
95
+ return [];
96
+ }
97
+ const today = new Date().toISOString().split("T")[0];
98
+ const markets = [];
99
+ for (const match of schedule) {
100
+ const slugs = generateSlugs(match.player1, match.player2, today);
101
+ let event = null;
102
+ for (const slug of slugs) {
103
+ event = await lookupEvent(slug);
104
+ if (event)
105
+ break;
106
+ }
107
+ if (!event) {
108
+ log("info", `No Polymarket event found for ${match.player1} vs ${match.player2}`);
109
+ continue;
110
+ }
111
+ // Find the moneyline market (main match winner, not O/U or spreads)
112
+ const eventMarkets = event.markets ?? [];
113
+ const moneyline = eventMarkets.find((m) => {
114
+ const q = (m.question ?? "").toLowerCase();
115
+ // Moneyline is typically just "Player A vs Player B" without O/U or spread
116
+ return !q.includes("o/u") && !q.includes("over") && !q.includes("under") && !q.includes("spread");
117
+ });
118
+ if (!moneyline) {
119
+ log("info", `No moneyline market for ${match.player1} vs ${match.player2}`);
120
+ continue;
121
+ }
122
+ // Get detailed info from CLOB API
123
+ const clobMarket = await getClobMarket(moneyline.conditionId);
124
+ if (!clobMarket || clobMarket.closed)
125
+ continue;
126
+ const tokens = clobMarket.tokens ?? [];
127
+ if (tokens.length < 2)
128
+ continue;
129
+ // Determine favorite (higher price) and underdog
130
+ const sorted = [...tokens].sort((a, b) => (b.price ?? 0) - (a.price ?? 0));
131
+ const favorite = sorted[0];
132
+ const underdog = sorted[1];
133
+ const favPrice = parseFloat(favorite.price ?? "0");
134
+ const stinkPrice = Math.round(favPrice * (1 - discountPct / 100) * 1000) / 1000;
135
+ markets.push({
136
+ conditionId: moneyline.conditionId,
137
+ question: moneyline.question ?? clobMarket.question ?? "",
138
+ slug: event.slug ?? "",
139
+ favoriteOutcome: favorite.outcome ?? "",
140
+ favoritePrice: favPrice,
141
+ favoriteTokenId: favorite.token_id ?? "",
142
+ underdogOutcome: underdog.outcome ?? "",
143
+ underdogPrice: parseFloat(underdog.price ?? "0"),
144
+ underdogTokenId: underdog.token_id ?? "",
145
+ stinkBidPrice: stinkPrice,
146
+ tickSize: clobMarket.minimum_tick_size?.toString() ?? "0.01",
147
+ negRisk: clobMarket.neg_risk ?? false,
148
+ closed: false,
149
+ });
150
+ log("info", `WTA market: ${moneyline.question} | Fav: ${favorite.outcome} @ ${favPrice} | Stink: ${stinkPrice}`);
151
+ }
152
+ log("info", `WTA discovery complete: ${markets.length} markets`);
153
+ return markets;
154
+ }
155
+ //# sourceMappingURL=wta-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wta-discovery.js","sourceRoot":"","sources":["../../src/services/wta-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { z } from "zod";
2
+ export declare const analyzeTraderSchema: z.ZodObject<{
3
+ address: z.ZodString;
4
+ }, z.core.$strip>;
5
+ export declare function handleAnalyzeTrader(input: z.infer<typeof analyzeTraderSchema>): Promise<string>;
6
+ //# sourceMappingURL=analyze-trader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-trader.d.ts","sourceRoot":"","sources":["../../src/tools/analyze-trader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,mBAAmB;;iBAE9B,CAAC;AAEH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBrG"}
@@ -0,0 +1,28 @@
1
+ import { z } from "zod";
2
+ import { analyzeTrader } from "../services/trader-analyzer.js";
3
+ import { checkLicense } from "../utils/license.js";
4
+ export const analyzeTraderSchema = z.object({
5
+ address: z.string(),
6
+ });
7
+ export async function handleAnalyzeTrader(input) {
8
+ const isPro = await checkLicense();
9
+ const profile = await analyzeTrader(input.address, isPro);
10
+ let output = `## Trader Analysis: ${input.address.slice(0, 6)}...${input.address.slice(-4)}\n\n`;
11
+ output += `| Metric | Value |\n|--------|-------|\n`;
12
+ output += `| Active Positions | ${profile.activePositions} |\n`;
13
+ output += `| Win Rate | ${profile.winRate.toFixed(1)}% |\n`;
14
+ output += `| Avg Position Size | $${profile.avgPositionSize.toFixed(2)} |\n`;
15
+ if (isPro && profile.recentTrades.length > 0) {
16
+ output += `\n### Recent Trades\n\n`;
17
+ output += `| Time | Market | Side | Size | Price |\n|------|--------|------|------|-------|\n`;
18
+ for (const t of profile.recentTrades) {
19
+ const time = t.timestamp?.split("T")[1]?.slice(0, 5) ?? "-";
20
+ output += `| ${time} | ${t.title.slice(0, 30)} | ${t.side} | ${t.size.toFixed(2)} | $${t.price.toFixed(2)} |\n`;
21
+ }
22
+ }
23
+ else if (!isPro) {
24
+ output += `\n_Upgrade to Pro for detailed trade history._\n`;
25
+ }
26
+ return output;
27
+ }
28
+ //# sourceMappingURL=analyze-trader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-trader.js","sourceRoot":"","sources":["../../src/tools/analyze-trader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAA0C;IAClF,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAE1D,IAAI,MAAM,GAAG,uBAAuB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACjG,MAAM,IAAI,0CAA0C,CAAC;IACrD,MAAM,IAAI,wBAAwB,OAAO,CAAC,eAAe,MAAM,CAAC;IAChE,MAAM,IAAI,gBAAgB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAC5D,MAAM,IAAI,0BAA0B,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IAE7E,IAAI,KAAK,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,yBAAyB,CAAC;QACpC,MAAM,IAAI,oFAAoF,CAAC;QAC/F,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC;YAC5D,MAAM,IAAI,KAAK,IAAI,MAAM,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAClH,CAAC;IACH,CAAC;SAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,IAAI,kDAAkD,CAAC;IAC/D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { z } from "zod";
2
+ export declare const backtestTraderSchema: z.ZodObject<{
3
+ address: z.ZodString;
4
+ copy_budget: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
5
+ }, z.core.$strip>;
6
+ export declare function handleBacktestTrader(input: z.infer<typeof backtestTraderSchema>): Promise<string>;
7
+ //# sourceMappingURL=backtest-trader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backtest-trader.d.ts","sourceRoot":"","sources":["../../src/tools/backtest-trader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,oBAAoB;;;iBAG/B,CAAC;AAEH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAoCvG"}
@@ -0,0 +1,39 @@
1
+ import { z } from "zod";
2
+ import { backtestTrader } from "../services/backtester.js";
3
+ import { checkLicense, requirePro } from "../utils/license.js";
4
+ export const backtestTraderSchema = z.object({
5
+ address: z.string(),
6
+ copy_budget: z.number().min(1).max(100).optional().default(5).describe("Simulated $ amount per trade (default: $5)"),
7
+ });
8
+ export async function handleBacktestTrader(input) {
9
+ const isPro = await checkLicense();
10
+ if (!isPro)
11
+ return requirePro("backtest_trader");
12
+ const result = await backtestTrader(input.address, input.copy_budget);
13
+ const s = result.summary;
14
+ let output = `## Backtest: ${input.address.slice(0, 8)}..${input.address.slice(-4)}\n\n`;
15
+ output += `**Period:** ${result.period} | **Copy Budget:** $${input.copy_budget}/trade\n\n`;
16
+ output += `| Metric | Value |\n|--------|-------|\n`;
17
+ output += `| Total Trades | ${s.totalTrades} |\n`;
18
+ output += `| Wins / Losses / Open | ${s.wins} / ${s.losses} / ${s.open} |\n`;
19
+ output += `| Win Rate | ${s.winRate.toFixed(1)}% |\n`;
20
+ output += `| Simulated P&L | $${s.simulatedCopyPnl.toFixed(2)} |\n`;
21
+ output += `| Avg P&L/Trade | $${s.avgPnl.toFixed(2)} |\n`;
22
+ output += `| Best Trade | $${s.bestTrade.toFixed(2)} |\n`;
23
+ output += `| Worst Trade | $${s.worstTrade.toFixed(2)} |\n`;
24
+ if (result.trades.length > 0) {
25
+ output += `\n### Trade Details\n\n`;
26
+ output += `| # | Market | Entry | Exit | P&L | Status |\n|---|--------|-------|------|-----|--------|\n`;
27
+ for (let i = 0; i < Math.min(result.trades.length, 15); i++) {
28
+ const t = result.trades[i];
29
+ const exit = t.exitPrice !== null ? `$${t.exitPrice.toFixed(2)}` : "open";
30
+ const pnlStr = t.pnl >= 0 ? `+$${t.pnl.toFixed(2)}` : `-$${Math.abs(t.pnl).toFixed(2)}`;
31
+ output += `| ${i + 1} | ${t.title.slice(0, 30)} | $${t.entryPrice.toFixed(2)} | ${exit} | ${pnlStr} | ${t.status} |\n`;
32
+ }
33
+ if (result.trades.length > 15) {
34
+ output += `\n_...and ${result.trades.length - 15} more trades_\n`;
35
+ }
36
+ }
37
+ return output;
38
+ }
39
+ //# sourceMappingURL=backtest-trader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backtest-trader.js","sourceRoot":"","sources":["../../src/tools/backtest-trader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { z } from "zod";
2
+ import Database from "better-sqlite3";
3
+ import { TradeExecutor } from "../services/trade-executor.js";
4
+ export declare const buySchema: z.ZodObject<{
5
+ condition_id: z.ZodString;
6
+ amount: z.ZodNumber;
7
+ price: z.ZodOptional<z.ZodNumber>;
8
+ outcome: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
9
+ YES: "YES";
10
+ NO: "NO";
11
+ }>>>;
12
+ }, z.core.$strip>;
13
+ export declare function handleBuy(db: Database.Database, executor: TradeExecutor, input: z.infer<typeof buySchema>): Promise<string>;
14
+ //# sourceMappingURL=buy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buy.d.ts","sourceRoot":"","sources":["../../src/tools/buy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,aAAa,EAAmB,MAAM,+BAA+B,CAAC;AAM/E,eAAO,MAAM,SAAS;;;;;;;;iBAKpB,CAAC;AAEH,wBAAsB,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAsCjI"}
@@ -0,0 +1,48 @@
1
+ import { z } from "zod";
2
+ import { resolveMarketByConditionId } from "../services/market-resolver.js";
3
+ import { checkMarketQuality } from "../services/market-filter.js";
4
+ import { checkLicense, requirePro } from "../utils/license.js";
5
+ import { log } from "../utils/logger.js";
6
+ export const buySchema = z.object({
7
+ condition_id: z.string(),
8
+ amount: z.number().min(0.5).describe("Amount in USDC to spend"),
9
+ price: z.number().min(0.01).max(0.99).optional().describe("Limit price (omit for market price from order book)"),
10
+ outcome: z.enum(["YES", "NO"]).optional().default("YES"),
11
+ });
12
+ export async function handleBuy(db, executor, input) {
13
+ // Live mode requires Pro
14
+ if (executor.getMode() === "live") {
15
+ const isPro = await checkLicense();
16
+ if (!isPro)
17
+ return requirePro("buy (live mode)");
18
+ }
19
+ const marketInfo = await resolveMarketByConditionId(input.condition_id);
20
+ if (!marketInfo)
21
+ return "Could not resolve market. Check the condition_id is correct.";
22
+ // Market quality check
23
+ const quality = await checkMarketQuality(marketInfo.tokenId);
24
+ if (!quality.pass) {
25
+ return `Market quality check failed:\n${quality.reasons.map((r) => "- " + r).join("\n")}\n\nUse \`check_market\` for details or proceed with caution.`;
26
+ }
27
+ const price = input.price ?? quality.metrics.midPrice;
28
+ if (price <= 0)
29
+ return "Could not determine market price. Provide a `price` parameter.";
30
+ const order = {
31
+ traderAddress: "direct",
32
+ marketSlug: marketInfo.slug,
33
+ conditionId: input.condition_id,
34
+ tokenId: marketInfo.tokenId,
35
+ price,
36
+ amount: input.amount,
37
+ originalAmount: input.amount,
38
+ tickSize: marketInfo.tickSize ?? "0.01",
39
+ negRisk: marketInfo.negRisk ?? false,
40
+ orderSide: "BUY",
41
+ };
42
+ const result = await executor.execute(order);
43
+ if (result.status === "failed")
44
+ return `Buy failed: ${result.message}`;
45
+ log("trade", `Direct BUY $${input.amount} @ $${price.toFixed(2)} on ${marketInfo.slug}`);
46
+ return `**${result.mode === "preview" ? "Simulated" : "Executed"}** BUY $${input.amount} @ $${price.toFixed(4)} on ${marketInfo.slug}\n\nTrade ID: #${result.tradeId} | Mode: ${result.mode}`;
47
+ }
48
+ //# sourceMappingURL=buy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buy.js","sourceRoot":"","sources":["../../src/tools/buy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { z } from "zod";
2
+ import { TradeExecutor } from "../services/trade-executor.js";
3
+ export declare const cancelOrdersSchema: z.ZodObject<{}, z.core.$strip>;
4
+ export declare function handleCancelOrders(executor: TradeExecutor): Promise<string>;
5
+ //# sourceMappingURL=cancel-orders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancel-orders.d.ts","sourceRoot":"","sources":["../../src/tools/cancel-orders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAI9D,eAAO,MAAM,kBAAkB,gCAAe,CAAC;AAE/C,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBjF"}
@@ -0,0 +1,26 @@
1
+ import { z } from "zod";
2
+ import { checkLicense, requirePro } from "../utils/license.js";
3
+ import { log } from "../utils/logger.js";
4
+ export const cancelOrdersSchema = z.object({});
5
+ export async function handleCancelOrders(executor) {
6
+ const isPro = await checkLicense();
7
+ if (!isPro)
8
+ return requirePro("cancel_orders");
9
+ if (executor.getMode() !== "live") {
10
+ return "Cancel orders only works in live mode. Use `go_live` to switch to live trading first.";
11
+ }
12
+ try {
13
+ const result = await executor.cancelAllOrders();
14
+ if (result.cancelled === 0) {
15
+ return "No open orders to cancel.";
16
+ }
17
+ log("trade", `Cancelled ${result.cancelled} open orders`);
18
+ return `Cancelled ${result.cancelled} open orders.`;
19
+ }
20
+ catch (err) {
21
+ log("error", `Cancel orders failed: ${err}`);
22
+ const hint = err?.message?.includes("credentials") ? " Check your API credentials in .env." : "";
23
+ return `Failed to cancel orders. The Polymarket API returned an error.${hint} Check the event log for details.`;
24
+ }
25
+ }
26
+ //# sourceMappingURL=cancel-orders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancel-orders.js","sourceRoot":"","sources":["../../src/tools/cancel-orders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAEzC,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAuB;IAC9D,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;IACnC,IAAI,CAAC,KAAK;QAAE,OAAO,UAAU,CAAC,eAAe,CAAC,CAAC;IAE/C,IAAI,QAAQ,CAAC,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;QAClC,OAAO,uFAAuF,CAAC;IACjG,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,eAAe,EAAE,CAAC;QAEhD,IAAI,MAAM,CAAC,SAAS,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,2BAA2B,CAAC;QACrC,CAAC;QAED,GAAG,CAAC,OAAO,EAAE,aAAa,MAAM,CAAC,SAAS,cAAc,CAAC,CAAC;QAC1D,OAAO,aAAa,MAAM,CAAC,SAAS,eAAe,CAAC;IACtD,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,GAAG,CAAC,OAAO,EAAE,yBAAyB,GAAG,EAAE,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC,EAAE,CAAC;QACjG,OAAO,iEAAiE,IAAI,mCAAmC,CAAC;IAClH,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import Database from "better-sqlite3";
2
+ export declare function handleCheckExits(db: Database.Database): Promise<string>;
3
+ //# sourceMappingURL=check-exits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-exits.d.ts","sourceRoot":"","sources":["../../src/tools/check-exits.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAItC,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAU7E"}
@@ -0,0 +1,14 @@
1
+ import { PositionTracker } from "../services/position-tracker.js";
2
+ import { checkLicense, requirePro } from "../utils/license.js";
3
+ export async function handleCheckExits(db) {
4
+ const isPro = await checkLicense();
5
+ if (!isPro)
6
+ return requirePro("check_exits");
7
+ const tracker = new PositionTracker(db);
8
+ const closed = await tracker.checkExits();
9
+ if (closed === 0) {
10
+ return "No positions resolved this cycle.";
11
+ }
12
+ return `${closed} position(s) resolved and P&L updated.`;
13
+ }
14
+ //# sourceMappingURL=check-exits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-exits.js","sourceRoot":"","sources":["../../src/tools/check-exits.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EAAqB;IAC1D,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;IAAC,IAAI,CAAC,KAAK;QAAE,OAAO,UAAU,CAAC,aAAa,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,EAAE,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAE1C,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB,OAAO,mCAAmC,CAAC;IAC7C,CAAC;IAED,OAAO,GAAG,MAAM,wCAAwC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { z } from "zod";
2
+ export declare const checkMarketSchema: z.ZodObject<{
3
+ token_id: z.ZodString;
4
+ max_spread: z.ZodOptional<z.ZodNumber>;
5
+ min_depth: z.ZodOptional<z.ZodNumber>;
6
+ }, z.core.$strip>;
7
+ export declare function handleCheckMarket(input: z.infer<typeof checkMarketSchema>): Promise<string>;
8
+ //# sourceMappingURL=check-market.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-market.d.ts","sourceRoot":"","sources":["../../src/tools/check-market.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,iBAAiB;;;;iBAI5B,CAAC;AAEH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBjG"}
@@ -0,0 +1,31 @@
1
+ import { z } from "zod";
2
+ import { checkMarketQuality } from "../services/market-filter.js";
3
+ import { checkLicense, requirePro } from "../utils/license.js";
4
+ export const checkMarketSchema = z.object({
5
+ token_id: z.string(),
6
+ max_spread: z.number().min(0).max(1).optional().describe("Max acceptable spread (default: 0.10)"),
7
+ min_depth: z.number().min(0).optional().describe("Min $ depth per side (default: $50)"),
8
+ });
9
+ export async function handleCheckMarket(input) {
10
+ const isPro = await checkLicense();
11
+ if (!isPro)
12
+ return requirePro("check_market");
13
+ const result = await checkMarketQuality(input.token_id, {
14
+ maxSpread: input.max_spread,
15
+ minDepth: input.min_depth,
16
+ });
17
+ const m = result.metrics;
18
+ const verdict = result.pass ? "PASS" : "FAIL";
19
+ let output = `## Market Quality: ${verdict}\n\n`;
20
+ output += `| Metric | Value |\n|--------|-------|\n`;
21
+ output += `| Spread | ${(m.spread * 100).toFixed(1)}% |\n`;
22
+ output += `| Bid Depth | $${m.bidDepth.toFixed(0)} |\n`;
23
+ output += `| Ask Depth | $${m.askDepth.toFixed(0)} |\n`;
24
+ output += `| Mid Price | $${m.midPrice.toFixed(4)} |\n`;
25
+ if (!result.pass) {
26
+ output += `\n### Issues\n\n`;
27
+ result.reasons.forEach((r) => { output += `- ${r}\n`; });
28
+ }
29
+ return output;
30
+ }
31
+ //# sourceMappingURL=check-market.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-market.js","sourceRoot":"","sources":["../../src/tools/check-market.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE/D,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IACjG,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;CACxF,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAwC;IAC9E,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;IAAC,IAAI,CAAC,KAAK;QAAE,OAAO,UAAU,CAAC,cAAc,CAAC,CAAC;IAClF,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,QAAQ,EAAE;QACtD,SAAS,EAAE,KAAK,CAAC,UAAU;QAC3B,QAAQ,EAAE,KAAK,CAAC,SAAS;KAC1B,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;IACzB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAE9C,IAAI,MAAM,GAAG,sBAAsB,OAAO,MAAM,CAAC;IACjD,MAAM,IAAI,0CAA0C,CAAC;IACrD,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAC3D,MAAM,IAAI,kBAAkB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IACxD,MAAM,IAAI,kBAAkB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IACxD,MAAM,IAAI,kBAAkB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IAExD,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,IAAI,kBAAkB,CAAC;QAC7B,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { z } from "zod";
2
+ import Database from "better-sqlite3";
3
+ export declare const closePositionSchema: z.ZodObject<{
4
+ trade_id: z.ZodNumber;
5
+ reason: z.ZodDefault<z.ZodOptional<z.ZodString>>;
6
+ }, z.core.$strip>;
7
+ export declare function handleClosePosition(db: Database.Database, input: z.infer<typeof closePositionSchema>): Promise<string>;
8
+ //# sourceMappingURL=close-position.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"close-position.d.ts","sourceRoot":"","sources":["../../src/tools/close-position.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAKtC,eAAO,MAAM,mBAAmB;;;iBAG9B,CAAC;AAEH,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAqB5H"}
@@ -0,0 +1,26 @@
1
+ import { z } from "zod";
2
+ import { updateTradeExit } from "../db/queries.js";
3
+ import { checkLicense, requirePro } from "../utils/license.js";
4
+ import { log } from "../utils/logger.js";
5
+ export const closePositionSchema = z.object({
6
+ trade_id: z.number().int(),
7
+ reason: z.string().optional().default("manual"),
8
+ });
9
+ export async function handleClosePosition(db, input) {
10
+ const isPro = await checkLicense();
11
+ if (!isPro)
12
+ return requirePro("close_position");
13
+ const trade = db.prepare("SELECT * FROM trades WHERE id = ? AND status IN ('simulated', 'executed')").get(input.trade_id);
14
+ if (!trade) {
15
+ return `No open position found with ID ${input.trade_id}. Use \`get_positions\` to see your open positions and their IDs.`;
16
+ }
17
+ // Get current market price for P&L calculation
18
+ const { getMarketPriceByCondition } = await import("../services/price-service.js");
19
+ const priceInfo = await getMarketPriceByCondition(trade.condition_id);
20
+ const exitPrice = priceInfo?.price ?? trade.price;
21
+ const pnl = trade.price > 0 ? ((exitPrice - trade.price) * trade.amount) / trade.price : 0;
22
+ updateTradeExit(db, input.trade_id, exitPrice, input.reason, pnl);
23
+ log("trade", `Position #${input.trade_id} closed manually: ${trade.market_slug}`);
24
+ return `Position #${input.trade_id} closed (${trade.market_slug}). Exit reason: ${input.reason}`;
25
+ }
26
+ //# sourceMappingURL=close-position.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"close-position.js","sourceRoot":"","sources":["../../src/tools/close-position.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAEzC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;CAChD,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,EAAqB,EAAE,KAA0C;IACzG,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;IACnC,IAAI,CAAC,KAAK;QAAE,OAAO,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAEhD,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,2EAA2E,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAQ,CAAC;IAEjI,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,kCAAkC,KAAK,CAAC,QAAQ,mEAAmE,CAAC;IAC7H,CAAC;IAED,+CAA+C;IAC/C,MAAM,EAAE,yBAAyB,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;IACnF,MAAM,SAAS,GAAG,MAAM,yBAAyB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,SAAS,EAAE,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC;IAClD,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3F,eAAe,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAElE,GAAG,CAAC,OAAO,EAAE,aAAa,KAAK,CAAC,QAAQ,qBAAqB,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IAElF,OAAO,aAAa,KAAK,CAAC,QAAQ,YAAY,KAAK,CAAC,WAAW,mBAAmB,KAAK,CAAC,MAAM,EAAE,CAAC;AACnG,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { z } from "zod";
2
+ export declare const discoverFlowSchema: z.ZodObject<{
3
+ top_traders: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
4
+ max_age_minutes: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
5
+ min_traders: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
6
+ }, z.core.$strip>;
7
+ export declare function handleDiscoverFlow(input: z.infer<typeof discoverFlowSchema>): Promise<string>;
8
+ //# sourceMappingURL=discover-flow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover-flow.d.ts","sourceRoot":"","sources":["../../src/tools/discover-flow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,kBAAkB;;;;iBAI7B,CAAC;AAEH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CA+BnG"}
@@ -0,0 +1,36 @@
1
+ import { z } from "zod";
2
+ import { discoverSmartFlow } from "../services/smart-flow.js";
3
+ import { checkLicense, requirePro } from "../utils/license.js";
4
+ export const discoverFlowSchema = z.object({
5
+ top_traders: z.number().int().min(5).max(100).optional().default(30).describe("Number of top traders to scan"),
6
+ max_age_minutes: z.number().min(5).max(1440).optional().default(60).describe("Max trade age in minutes"),
7
+ min_traders: z.number().int().min(2).max(20).optional().default(2).describe("Min unique traders for a signal"),
8
+ });
9
+ export async function handleDiscoverFlow(input) {
10
+ const isPro = await checkLicense();
11
+ if (!isPro)
12
+ return requirePro("discover_flow");
13
+ const signals = await discoverSmartFlow({
14
+ topN: input.top_traders,
15
+ maxAgeMinutes: input.max_age_minutes,
16
+ minSignalTraders: input.min_traders,
17
+ });
18
+ if (signals.length === 0) {
19
+ return `No smart money signals found in the last ${input.max_age_minutes} minutes from top ${input.top_traders} traders. Try increasing the time window or reducing min_traders.`;
20
+ }
21
+ let output = `## Smart Money Flow (last ${input.max_age_minutes}min)\n\n`;
22
+ output += `Scanned **${input.top_traders}** top traders. Found **${signals.length}** signals.\n\n`;
23
+ for (let i = 0; i < signals.length; i++) {
24
+ const s = signals[i];
25
+ const icon = s.strength === "strong" ? "***" : s.strength === "moderate" ? "**" : "*";
26
+ output += `### ${i + 1}. ${s.title}\n`;
27
+ output += `${icon}${s.strength.toUpperCase()}${icon} — ${s.traders.length} traders ${s.side} | Total: $${s.totalAmount.toFixed(0)} | Avg: $${s.avgPrice.toFixed(2)}\n\n`;
28
+ output += `| Trader | Rank | Amount | Price |\n|--------|------|--------|-------|\n`;
29
+ for (const t of s.traders) {
30
+ output += `| ${t.name.slice(0, 20)} | #${t.rank} | $${t.amount.toFixed(0)} | $${t.price.toFixed(2)} |\n`;
31
+ }
32
+ output += `\n`;
33
+ }
34
+ return output;
35
+ }
36
+ //# sourceMappingURL=discover-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover-flow.js","sourceRoot":"","sources":["../../src/tools/discover-flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { z } from "zod";
2
+ export declare const discoverMarketsSchema: z.ZodObject<{
3
+ ending: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
4
+ all: "all";
5
+ today: "today";
6
+ this_week: "this_week";
7
+ }>>>;
8
+ category: z.ZodOptional<z.ZodString>;
9
+ min_volume: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
10
+ limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
11
+ }, z.core.$strip>;
12
+ export type DiscoverMarketsInput = z.infer<typeof discoverMarketsSchema>;
13
+ export declare function handleDiscoverMarkets(input: DiscoverMarketsInput): Promise<string>;
14
+ //# sourceMappingURL=discover-markets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover-markets.d.ts","sourceRoot":"","sources":["../../src/tools/discover-markets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,qBAAqB;;;;;;;;;iBAKhC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEzE,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CA0DxF"}